Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
- Supersedes / closes: none
- Proposed by: LoopX maintainers
- Date: 2026-08-15
- Last revised: 2026-10-16
- Last revised: 2026-10-19
- Scope: an incremental, replacement-first migration of the LoopX control-plane
core from Python to TypeScript without maintaining two semantic
implementations
Expand All @@ -17,6 +17,25 @@

### Product conversations and asynchronous inbox

**Receiver Inbox read transaction (2026-10-19).**
`loopx/control_plane/collaboration/inbox_read.ts` now composes local source scans, pagination,
Goal-instance admission, receiver and peer-return read receipts, and unfinished
delegation context through the existing typed owners. Turn-start observation
uses a read-only request. Receiver reads without a pending Host provider commit
their local read receipts in that request. Actual Core Todo, workspace-input and
operation-ticket providers remain explicit Python IO; finalization reacquires
the Goal lifetime guard and rereads entries under the shared request fence.
Reading still grants neither adoption, consumption nor execution authority.
The old Python scan/composition loops and five fine-grained RPC registrations
are removed. The legacy Inbox read imports and tracking/presentation receipt
views retain thin native facades; their exit is migration of those remaining
Python consumers. Existing return-display file IO retains its Python adapter
and the shared persisted delivery vocabulary. Large pages reuse the shared
private snapshot transport. Normal runtime IPC, installed
HTTP caller parity and complete default-SQLite CLI performance remain separate
qualification gates. This source cutover does not certify R1–R3 or the complete
asynchronous collaboration lifecycle.

R1–R3 also consume the typed kernel through the App, not only CLI settlement.
The [App/inbox integration plan](app-conversation-and-async-inbox-v0.md#ts-and-generic-async-inbox-migrate-with-the-user-path)
orders caller fixes, characterization, one complete async lifecycle cutover,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
- 替代 / 关闭:无
- Proposed by:LoopX maintainers
- Date:2026-08-15
- Last revised:2026-10-16
- Last revised:2026-10-19
- Scope:LoopX 控制面核心从 Python 到 TypeScript 的增量、replacement-first
迁移;不长期维护两份语义实现
- Tracking issue:[#3225](https://github.com/loopx-project/loopx/issues/3225)
Expand All @@ -17,6 +17,21 @@

### 产品对话与通用异步 inbox

**接收方 Inbox 读取事务(2026-10-19)。**
`loopx/control_plane/collaboration/inbox_read.ts` 现在通过既有 typed owner 组合本地源扫描、分页、
Goal-instance 准入、接收方及 peer-return 读取回执和未完成委派上下文。
Turn-start 观察使用只读请求。没有待处理 Host provider 的接收读取,在同一个请求中
提交本地读取回执。实际 Core Todo、工作区输入和操作票据 provider 仍是显式 Python IO;
finalize 重新取得 Goal lifetime guard,并在共享 request fence 内重读 entry。
读取仍不授予 adoption、consumption 或执行权限。
旧 Python 扫描与组合循环及五个细粒度 RPC 注册已删除。
旧 Inbox 读取 import 和 tracking/presentation 回执视图保留薄 native facade;
这些层在剩余 Python 消费者迁移后退出。既有 return 展示文件 IO 保留 Python adapter,
复用同一份持久化 delivery 词汇。大页面复用共享私有 snapshot 传输。
正常 runtime IPC、已安装 HTTP 调用者一致性、
完整默认 SQLite CLI 性能仍是独立资格门。本次源码切换不证明 R1–R3 或完整异步协作
生命周期已通过验收。

R1–R3 的 TS 消费者包括 App 产品路径,不只 CLI 结算。
[App/inbox 融合设计](app-conversation-and-async-inbox-v0.md#ts-and-generic-async-inbox-migrate-with-the-user-path)
按调用者修复、行为刻画、完整异步生命周期切换、真实 adapter 恢复与旧代码删除推进。
Expand Down
14 changes: 14 additions & 0 deletions loopx/capabilities/manager_context/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,20 @@ LoopX quota/heartbeat Turn-start path; arbitrary host Turns that do not invoke
that path are outside this integration. Frontend/Lark conversations retain their
existing request and return views; no new screen or setting is introduced.

The local Inbox read transaction now lives in
`loopx/control_plane/collaboration/inbox_read.ts`. It reuses the typed receipt,
Goal-instance, request-revision and agenda owners inside one runtime request.
The Turn hook remains read-only. CLI/MCP reads record the supplied requests and
peer-return read receipts; they do not adopt requests or consume peer results.
Python releases the initial Goal lifetime guard for provider enrichment.
Core Todo and workspace inputs retain their actual IO adapters and provider
fences. The Host reacquires the Goal guard before native finalization.
Operation-ticket observations retain their existing provider. Complete large
pages use the shared private snapshot transport. Existing return-display file
IO remains in its Python adapter. Existing storage addresses, source records and public
response shapes remain compatible. Normal runtime IPC, installed HTTP journeys
and complete CLI performance require separate qualification.

Read and record a decision through the installed CLI:

```sh
Expand Down
24 changes: 11 additions & 13 deletions loopx/capabilities/manager_context/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,22 +238,20 @@ def turn_start_hook(
def produce():
nonlocal snapshot
try:
from ...control_plane.collaboration.turn_context_observation import read_delegation_turn_context
from ...control_plane.collaboration.inbox_read import read_inbox_transaction
from ...control_plane.collaboration.inbox import _pending_result

snapshot = read_delegation_turn_context(runtime_root, registry_path, goal_id, agent_id,
read_command=command)
agenda = snapshot["unfinished_delegations"]
with collaboration_goal_scope(
registry_path,
goal_id=goal_id,
agents=(agent_id,),
registry_path, goal_id=goal_id, agents=(agent_id,),
) as goal_scope:
inbox = pending(
runtime_root,
goal_id,
agent_id,
scope=goal_scope,
)
observed = read_inbox_transaction(runtime_root, {
"operation": "turn_start", "goal_id": goal_id, "agent_id": agent_id,
"read_command": command,
}, scope=goal_scope)
observed.update(goal_id=goal_id, agent_id=agent_id)
inbox = _pending_result(runtime_root, observed, goal_scope, None)
snapshot = observed["context"]
agenda = snapshot["unfinished_delegations"]
count = (
max(len(inbox["items"]), agenda["incoming_count"])
+ max(len(inbox.get("peer_returns", {}).get("items", [])), agenda["outgoing_count"])
Expand Down
Loading
Loading