Prompt 接纳、队列与终态
用 promptId 区分已接纳、取消请求、执行结束和恢复出的历史结果。
当前非阻塞 prompt 协议将接纳与执行分开。POST /session/:id/prompt 返回 202 和 promptId、lastEventId,表示已进入 daemon 管理,不表示 agent 已完成。
关联结果
订阅该 session SSE,并按 promptId 匹配 turn_complete 或 turn_error。DaemonSessionClient 在有活动事件订阅时可自动使用非阻塞路径并等待对应终态;直接 REST 客户端需要自己完成关联。
turn_complete 的 stopReason 是开放字符串。当前可见 end_turn、max_tokens、max_turn_requests、refusal、cancelled,但客户端不应只允许固定枚举。
cancelled 也可能来自尚未运行的 queued prompt 被移除、调用方断开或 teardown,不能证明 agent 实际执行过。daemon 内部期限或关闭失败通过 turn_error 表示,code 是可选字段;child 崩溃场景可能只有 message。
Queue 事件不是 turn terminal
| 事件 | 表示什么 |
|---|---|
| pending_prompt_added | prompt 真正排在 active turn 后面等待;idle session 的第一条不发此事件 |
| pending_prompt_started | 该项被提升开始运行;开始前移除则可能没有此事件 |
| pending_prompt_completed | queue view 的记录结算,state 为 completed 或 removed |
| prompt_cancelled | 已请求取消,尚不等于取消正式完成 |
pending_prompt_completed 的 completed 包含运行后失败的情形,具体错误仍由 turn_error 给出。它不能用来显示“任务成功”。
重启后的终态证据
重启恢复的旧 turn 不重新广播 SSE。load 响应可在 promptTerminals[] 给出 completed/reconstructed_from_transcript 或 interrupted/daemon_lost;后者没有 stopReason,应按 terminal 分类。
没有 ledger 证据时,整个 promptTerminals 字段可缺失。缺失不是成功,也不证明可安全重新执行同一 prompt。
期限与之后的查询
prompt_absolute_deadline 支持时,deadlineMs 可以缩短服务端期限。到期通过关联 turn_error 的 prompt_deadline_exceeded 释放调用方,但不强杀 agent。
agent 之后若真正结束,turn-status 查询可能反映已结算的 transcript 结果。不要把最早收到的 deadline 当作永远不可更新的执行结局,也不要因此无条件重试会产生副作用的工作。
独立辅助接口
recap 返回尽力生成的一行摘要,null 可表示历史不足或临时模型失败。btw 是单轮、无工具的上下文旁问;generate 则不读取对话历史、不记录 turn、不暴露工具,以请求独立 SSE 返回 started/thinking/delta/done/error。
shell 直接在 daemon 主机执行并把命令结果加入历史,不经过模型生成命令;它没有路径 sandbox。rewind 只回退对话与可跟踪文件,不能撤销 Shell、Git、脚本或人工操作,且文件恢复失败时对话可能已经回退。
这些端点各有 capability 和权限要求,不能仅因 session live 就假定全部开放。基础会话 API 见会话生命周期。