跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

共享会话、SSE 与审批

订阅事件封套、处理先到审批与慢客户端,并配置有限的 Todo 延续。

默认同一工作区共享一个 agent 会话,不同注册工作区各有运行时。同一工作区中的多个并行会话仍共享一个 ACP 子进程;一个子进程崩溃可能影响其全部会话。

事件封套

SSE 的 data 行包含完整 JSON 封套,而不是直接放 ACP payload:

{
  "id": 1,
  "v": 1,
  "type": "session_update",
  "data": {
    "sessionUpdate": "agent_message_chunk",
    "content": { "type": "text", "text": "Hello" }
  }
}

封套还可能带 originatorClientId。SSE 的 id/event 行只是同一信息的便捷表示。订阅应先于 prompt;常见事件包括 session_update、permission_request、permission_resolved、model_switched、model_switch_failed,以及关闭流的 session_died 和 client_evicted。

同一 session 重新附着时若指定 modelServiceId,切换模型失败不一定让 POST /session 返回 HTTP 错误;会话继续使用原模型,失败通过 SSE 的 model_switch_failed 表达。应先订阅已知会话,或订阅时用 Last-Event-ID: 0 回放可用窗口。

共享审批

工具权限请求发给所有附着客户端,默认第一个答复生效。新集成使用 POST /session/:id/permission/:requestId,并检查 session_permission_vote capability。

旧 POST /permission/:requestId 只路由 primary,其他工作区的请求会返回 404;这个 404 不证明有人抢先答复。所有 bearer 持有者属于同一安全主体,不能把不同 client ID 当互相保密的权限域。

排队与重连

每会话默认最多 5 个已接纳但未完成的 prompt,包含运行中的一条。超限同步返回 503 prompt_queue_full 与 Retry-After: 5,不会先给出 promptId。branchSession 使用同一 FIFO,但不计入此 prompt 上限。

SSE 默认保存最近 8000 个事件。Last-Event-ID 在窗口内可继续,过旧会触发 state_resync_required。订阅者队列默认 256 帧,可用 maxQueued 查询参数在 16–2048 间指定;支持 slow_client_warning 时,75% 队列占用会先告警,超限发送 client_evicted 并关闭。

每会话默认最多 64 个 SSE 订阅者,第 65 个收到终止 stream_error。完整历史不能依靠无限扩大 SSE,应该使用持久 transcript。

Todo Stop Guard

需要尚未完成的顶层 Todo 驱动有限延续时,启用以下设置并重启:

{
  "experimental": { "todoStopGuard": true },
  "tools": { "todoWrite": { "enabled": true } }
}

默认关闭,safe mode、bare mode 和 plan 审批模式强制关闭。只有新普通 prompt 成功执行自己的顶层 todo_write 才会启用这条内存工作链;从磁盘读到 Todo 或 daemon 重启不会自动启用。

没有新用户输入时,最多连续增加两次主模型调用。中途用户消息先执行并开始新的两次额度;retry/continue 和相关后台结果继续使用当前额度。排队完整 prompt 也优先,等待关联后台工作时,无关 cron/loop 和旧任务通知延后,并按任务合并。

延续和最终耗尽状态以可回放 session_update 记录,_meta.source 为 todo_stop_guard,含次数与未完成数量,不含 Todo 文本。原有审批和取消规则不变。成功改变会话目录会清除此状态,避免旧 Todo 在新工作区继续运行。

完整的Prompt 终态、SSE 重同步和字节背压见运行时专题。