Skip to content

Continue work in Goal Chat

Select an existing Codex provider for ordinary Chat

An operator can set LOOPX_CHAT_CODEX_MODEL_PROVIDER to a provider ID already defined in the managed CODEX_HOME/config.toml. Ordinary project and steward conversations pass this selection to Codex's native thread/start or thread/resume and verify the returned provider before starting a Turn. A missing or different readback fails; it never creates a replacement thread. Without the override, provider selection remains unchanged. Managed Goal execution keeps its own host binding and ignores this ordinary-Chat setting.

For example, where upstream WebSocket connections repeatedly fail, a native Responses provider with requires_openai_auth = true and supports_websockets = false can retain the existing Codex authentication while using HTTP streaming. Define a separate provider ID: current Codex versions reject overrides of the reserved openai ID. Use name = "OpenAI" for the same Codex backend, leave base_url unset, and verify actual native capabilities and live reply timing before adopting it. This is an optional transport mitigation, not a claim that every disconnect has this cause. No retry or timeout budget changes, credentials, policy grants or alternative model runner are added by LoopX.

The existing macOS LaunchAgent installer preserves the selection across upgrades. Set an explicit empty value to clear it when regenerating the service. At an idle service boundary, restore the previous provider and restart the existing owner; retain the original Session/history and read back its provider. Changing only an environment variable does not reconfigure an already running app-server. HTTP streaming remains streaming; the stdio connection between LoopX and Codex is unaffected.

The existing Goal → Chat can be the project coordinator. The local steward handles cross-Goal intake and owner attention; a project conversation or a registered peer can coordinate work within one Goal. Both reuse the existing delegation service, independently governed member Turns and TS task acceptance. A coordinator role alone grants no execution authority.

Source references in conversation answers

Project, steward and collaboration answers share source-reference guidance. Repository-relative Markdown destinations do not identify an openable source in chat. For verified public repository content, the Agent should establish the canonical repository and revision it actually read, then cite an absolute permalink. A project name, an old link or the current remote branch is not enough to identify that revision. Private, ignored, unpublished or locally modified content must not be presented as that public version.

Local artifact links are appropriate only where the receiving channel can resolve the authorized artifact. Otherwise the answer retains a plain file or section reference and names a material access/version gap. Making a citation clickable does not authorize publication or upload. This is authoring guidance, not a URL verifier: the channel renderer preserves authored destinations and delivery readback verifies what was sent, not source truth or recipient access.

项目、管家和协作回复共用来源引用指导。聊天中的仓库相对路径不能作为可打开的 来源网址;已核验的公开仓库内容应引用实际读取版本及正确仓库的绝对永久链接。 私有、忽略、未发布或本地修改的内容不能冒充公开版本。只有接收渠道能解析已授权 产物时才使用本地文件链接,否则保留文件/章节说明,并指出重要的访问或版本缺口。 引用需要可用,不构成上传或发布授权;此指导不替代来源核验或渠道实际验收。

Enable LoopX mode

On a local managed Codex Goal conversation, choose Enable LoopX in the compact bar below the channel header. First use opens Settings in a bounded dialog. Select the registered sender, its existing delegation configuration under the project's .loopx/config/, and a positive total coordinator token allowance. Save, then enable. Subsequent activations reuse these settings. The member roster comes from the authorized bindings; selecting a registered Agent alone cannot launch members.

The coordinator chooses whom to ask, the order of work and how to respond to rejection. Its host-bound loopx_collaboration tool exposes bindings, start, read, wait, resume and inbox messages. Models cannot select a different sender, executable, workspace or acceptance rule. The same delegation service supports an authorized member coordinating further members. Results returned as accepted require current canonical task completion and unchanged artifacts.

In newly tool-equipped conversations, action=operations recovers the configured sender's durable work with the same paged inventory as CLI/MCP. It includes work started outside this conversation. Follow next_cursor, read the original operations and reconcile unavailable entries before starting replacements. The recent member chips remain conversation observations, not the complete inventory. Pausing still fences this tool. Existing native threads retain their original tool schema when resumed; this change does not replace an unfinished Goal to add a tool operation. Such a thread keeps its original read/wait operations; a shell-capable caller can use the CLI recovery entrypoint independently. Tool-schema upgrade remains a separate session capability.

After configuring bindings, Team execution opens the same durable inventory for the owner, independently of the native thread's installed tools. Its on-demand refresh rechecks accepted artifacts, preserves unavailable items and offers pagination. Check prerequisites reads the selected member's actual Turn/profile and pinned acceptance binding without launching work. An unknown runtime stays unknown. The panel works while paused and before enabling mode; it does not add validation to regular snapshot polling. Existing native threads remain intact. This is local operator readback, not a new dispatch surface. Close the dialog or press Escape to return focus to its trigger and keep the conversation's reading position. Team details do not occupy the initial chat.

Synthetic desktop and narrow-screen examples show unverified runtime, unavailable output and an original execution needing recovery:

Team execution on desktop Team execution on a narrow screen

The compact bar shows native state and the coordinator controls. Settings and team inspection disclose accumulated usage and member observations on demand. Pause coordinator stops the coordinator, while already delegated members continue under their independent deadlines and acceptance rules. Continue resumes the same native Goal and its accumulated usage. Exit mode returns to ordinary conversation; it does not cancel children or settle the canonical Goal. Ordinary messages after pausing remain ordinary messages.

During execution the message selector offers:

Mode Delivery contract
Next turn (queue, default) Persist now; inject at a subsequent native turn start. It does not interrupt the current turn or promise another turn will occur.
Inbox Persist for the coordinator to read explicitly with messages; delivery is not semantic adoption.
Steer now Ask the provider to steer the exact current turn. Rejection remains a failure; it is never downgraded to queue.

Pending input remains visible after pause or native completion. A lost queue acknowledgement is uncertain, is not automatically replayed, and needs explicit owner reconciliation. Input is bounded to 12,000 characters and 20 pending messages; images use the ordinary conversation after pausing.

Execution and recovery boundaries

  • This lead driver requires Codex's experimental app-server thread/goal/* APIs. It retains the Goal Chat's read-only sandbox and model configuration; member execution uses only the configured host bindings. It does not inherit the steward's trusted-owner permissions or confer arbitrary shell writes.
  • Codex cannot add dynamic tools to a resumed thread. On first explicit enable, an idle executor is replaced with a tool-equipped thread, retaining the local conversation identity/history and resolved model/effort. An unfinished native Goal is never replaced; finish it or explicitly start another conversation. Subsequent pauses/recovery retain the exact upgraded upstream thread.
  • Duplicate activation ids return the original run; changed requests using the same id fail. A second active conversation cannot use the same configured sender concurrently. This fence does not acquire or transfer a peer's Todo lease.
  • An unfinished native Goal pins its sender and execution file digest. A changed or revoked binding fails closed and must be reconciled; increasing the total token allowance does not change member authority.
  • Native complete, blocked, paused, budgetLimited and usageLimited describe the coordinator host. They do not complete a canonical Goal or the coordinator's report Todo. The returned conversation report and accepted member tasks remain distinguishable. Token allowance includes prior usage; in-flight requests can overshoot it and member usage is accounted separately.
  • Browser refresh reconnects to the existing local run. After service loss, reconnect restores and pauses the original native thread before resuming. Stop and recovery verify non-active Goal state with a fresh host read after requesting pause. If readback fails, disappears or remains active, the owned transport is closed and the operation fails; an ACK is not a pause receipt. Late native turn-start events are used only to interrupt that turn, never to inject queued messages or resume context after Stop. Already-submitted effects retain their original reconciliation and settlement obligations. The Chat hard timeout remains in force; this is not an unattended daemon.
  • When a delegated result is first accepted, the Chat service continues the lead once through the same admission as resume. The wake belongs to the conversation whose Turn started the operation: another conversation of the same Goal and coordinator is never selected instead, so exiting, closing or reconfiguring that conversation refuses the wake rather than moving it. The operation record keeps a separate wake receipt: woken with the Turn id, pending with lead_turn_active, lead_paused, allowance_exhausted or wake_dispatch_pending, or refused with goal_stopped, lead_unbound, binding_revoked, native_goal_complete, native_goal_absent, wake_identity_conflict, wake_turn_ended_unstarted or no_wake_owner. Its Turn is accepted once under a client id derived from the intent, and only a Turn the provider actually started — recorded as upstream_turn_id — is recorded as dispatched: a Turn accepted but not yet dispatched stays wake_dispatch_pending, and a still-queued Turn from an interrupted dispatch is handed back to the same native acceptance and dispatch owner, so the lead is continued once without creating a second Turn. A wake never unpauses the lead, never starts a native Goal and never raises the allowance. A lead that already read the result in its own Turn is marked observed_in_turn and is not woken again. It requires the Chat service to be running; stopping it leaves intents pending.
  • To roll back, pause/close the Chat service before installing an older build. Disabling mode or deleting a binding does not cancel already admitted children; stop one with loopx delegation stop --execute (or stop_delegation), read its receipt, and retain its evidence. Only settled proves the worker acknowledged and released its locks, its native host exited and its hard lease was released or proven not owed; stopped work needs a new operation id.

The ordinary native command path also remains available without delegation:

/goal start --tokens 100000 Inspect this project's evidence and report verified conclusions here.
/goal status
/goal resume --tokens 200000

start takes at most 3000 objective characters; status does not run the model. These commands alone do not enable the collaboration tool. Lark, attached sessions, and other lead drivers do not expose this button or gain equivalent behavior. Their qualification remains with the session RFC. For a disposable mixed-team setup, use the synthetic research example.

中文使用说明

入口仍是 Goal → 对话,在输入框旁点 开启 LoopX 模式。首次原地填写 已注册的协调身份、项目 .loopx/config/ 下的现有成员执行配置、协调员总 token 额度,保存后开启;之后复用设置。注册身份本身不授予启动成员的权限。

模型自主决定分工、先后顺序和拒绝后的处理;宿主固定身份与执行范围,成员 沿用原有 Turn、TS 验收和 canonical Todo 完成链路。有授权的成员也可继续委派。 工具 ACK、模型口头完成、原生 Goal 完成都不能替代成员独立验收。

暂停只停协调员,已派发成员继续执行;恢复推进沿用原生 Goal 和累计 用量;退出模式恢复普通对话。暂停后发普通问题不会再次启用持续推进。 运行中默认消息进入 下一轮处理;放入收件箱等待模型主动读取; 立即纠偏交给当前原生回合,失败不会偷偷变成排队。队列不会强制开启下一轮; 暂停或完成后仍会显示待处理消息。不确定是否已送达的消息不自动重放,需所有者 核对;每条最多 12,000 字符,最多 20 条待处理消息。图片在暂停后用普通对话发送。

首次开启需要为闲置执行器增加工具,因此保留前端会话和历史、模型及推理配置, 升级底层线程;已有未结束的原生 Goal 时拒绝替换。以后恢复都沿用该线程。 服务重启先恢复并暂停原线程;浏览器刷新不会另起运行。运行仍有硬超时,尚非 无人值守 daemon。配置文件在未结束的 Goal 中保持摘要绑定,改变后需先协调处理。 请求暂停后会重新读取宿主 Goal,确认已非 active;读回失败、目标消失或仍 active 时 关闭自有连接并返回失败,ACK 不算暂停回执。Stop 后迟到的 start 事件仅用于中断对应 回合,不再注入排队消息或恢复上下文;已提交效果仍保留原操作的对账和结算义务。

成员结果首次被接受时,Chat 服务按与 resume 相同的准入规则继续协调员一次。 唤醒绑定在「启动该操作的回合所属会话」上:同一 Goal 与身份下的其他会话不会被选为 替代,所以该会话退出、关闭或改配置时只做拒绝,而不是把唤醒移交给别的会话。操作记录 里另存唤醒回执:woken 附 Turn id;pending 附 lead_turn_active、lead_paused、 allowance_exhausted 或 wake_dispatch_pending;refused 附 goal_stopped、lead_unbound、 binding_revoked、native_goal_complete、native_goal_absent、wake_identity_conflict、 wake_turn_ended_unstarted 或 no_wake_owner。其 Turn 由意图派生的 client id 只接受一次, 且只有 provider 真正开始过的 Turn(记为 upstream_turn_id)才算已派发:已接受但尚未派发的 Turn 保持 wake_dispatch_pending;中断派发后仍处于 queued 的 Turn 会交回同一套原生接受与 派发 owner 继续,因此协调员只被续跑一次,也不会新建第二个 Turn。唤醒不会解除暂停、不会新开原生 Goal、 也不会提高额度。协调员已在自己回合内读到结果时记为 observed_in_turn,不再唤醒。 它依赖 Chat 服务在运行;停掉服务时意图保持待处理。

协调员保留只读沙箱,成员权限来自各自执行绑定,不继承管家的扩大权限。 成员通过验收与协调员报告、整个 Goal 验收分别显示;本模式不直接完成报告 Todo 或整个 Goal。额度是含历史用量的总量,正在执行的请求可能超额,成员另行计量。 回滚旧版本前先暂停或关闭 Chat 服务;退出或撤销绑定不自动取消已启动的成员, 用 loopx delegation stop --execute(或 stop_delegation)停止单个成员并阅读回执: 只有 settled 证明 worker 已确认并释放锁、原生 host 已退出,且硬租约已释放或被证明无需释放;已停止的工作需要新的 operation id。 此按钮目前限本机 managed Codex Goal 对话,不宣称 Lark、挂接会话或其他主力 驱动等价。可用下方示例准备一次隔离的本地 DSH+云端 Ark 协作。