部署范围与原生审批顺序见 执行时序,设备内部各层见 Codex 与 ACP 分层。
runId 与会话#
每轮执行使用独立 runId,派发前保存其输入。相同 runId 与相同输入用于查回原结果,输入冲突会拒绝。sessionKey 用于托管会话分组,原生会话身份另行保存;续接需要显式指定。
同一会话的执行保持互斥。设备默认最多并发 2 轮,可按资源配置为 1–8。
观察与取消#
getExecution 返回当前快照,events 返回有序事件。应用可保存事件游标,连接恢复后继续读取。cancel 与 steer 返回请求回执;需要继续观察原执行确认终态。
连接中断#
执行进程、待批请求与执行记录仍归 Daemon 管理,连接中断不转移执行所有权。原生进程可以继续运行,但等待应用响应的原生审批或工具请求可能失败或被拒绝,迟到决定失效。SDK 重连只恢复连接与观察,不重发 prompt、工具调用或审批决策。
- 使用原 runId 调用 getExecution。
- 读取 events,补齐已持久化的执行事件。
- 后端声明 resultQuery 时,可显式 reconcile 原 runId。
- 仍无完成证据时保留 unknown,交由应用展示并人工判断。
输入文件与产物#
执行工作目录由设备本地配置决定;prepare 为本轮准备附加 skills 与托管输出目录,远端不能通过该接口任意指定宿主路径。collect 返回托管输出文件及 SHA256,调用方应验证并收存需要保留的内容。
确认执行结束后再 release 本轮托管输出;unknown 不可释放。forgetSession 只在安全释放后删除托管会话,不删除用户工作目录或原生账户数据。
资源保留#
当前默认策略包括:原生后端空闲 10 分钟后回收;已结束且已释放执行的详细数据保留 7 天;去重身份与 unknown 记录继续保留。需要更长期的审计或结果存档时,由调用方在清理前收存。
资源回收不等于撤销任务的文件变更或外部操作。应用在展示成功前仍需验收业务结果。
默认资源限制#
Daemon 持有 Provider 进程、待批请求和执行状态;连接关闭不改变执行所有权。原生 home、用户配置、认证、插件、memory 和工作目录不属于 dock 的清理范围。
| 资源 | 限制与行为 |
|---|---|
| 每连接待响应请求 / 并行入站处理 | 32 / 16;超额拒绝或关闭连接 |
| 单条消息、累计入站或发送占用 | 各 64 MiB;包含尚未结束的处理 |
| 本地发送 deadline | 60 秒;写回调不等于对端或原生 ACK |
| 设备并行执行 | 默认 2,可配置 1..8;相同原生会话互斥 |
| Provider 空闲回收 | 默认 10 分钟;活动执行和审批等待不回收 |
| 单轮文本 | 8 MiB UTF-8 |
| 单条展示观察 | 256 KiB;超限显式报告 |
| 单轮持久化过程 | 32 MiB / 10,000 条;截断单独标记 |
| 输入文件 | 每文件 8 MiB、合计 16 MiB、最多 64 个 |
| 已结束且已 release 的详细记录 | 保留 7 天;去重身份继续保留 |
| SQLite 与托管状态目录 | 软预算 512 MiB;回收后仍超限则停止新准入 |
| 执行身份数量 | 100,000;达到上限停止新身份准入 |
| Daemon 日志 | 3 个 10 MiB 文件,滚动保留 |
这些是 dock 管理资源的预算,不是 Provider 进程内存、用户工作目录或 OS 磁盘硬配额。JSON/Base64 等编码还会产生额外占用。
生命周期#
prepare/execute 检查托管状态和容量,不跨阶段复用过期统计。执行、探测、关闭和维护使用各自的准入与互斥边界;等待审批仍为活动执行。
连接换代不会重置尚未结束的入站处理预算。过载断开后只恢复连接与观察,不重派执行、工具或审批。调用方 callback 必须响应 AbortSignal,迟到决定不进入下一轮。
release 仅删除已确认结束的本轮托管输出,unknown 拒绝释放。forgetSession 只在相关执行安全释放后删除托管会话,保留执行去重身份和用户文件。
程序升级、回滚、server 撤销配对都不删除原生 home 或用户数据,也不把 unknown 自动改成成功或取消。磁盘或存储故障时保留已落盘执行身份,重启后按 unknown 查询,不能靠清库恢复新准入。
托管文件#
Dock 的附加文件准备与产物收集 API 限制在各自的托管目录内,拒绝越界和不受信任的符号链接。原生 Harness 的执行不因此进入 Dock 文件系统沙箱;原生工具对设备配置工作目录及其他路径的访问仍由 Harness 与系统权限约束。输出 collect 返回内容、文件名和 SHA256。调用方应先验收并收存输出,再 release。
状态读取可能返回 detailsExpired 或 historyTruncated,表示详情过期或观察截断;这些字段不改变技术终态。安装和恢复要求见 设备维护 与 SDK。
未发布源码:原结果未知时恢复新任务准入#
先在原应用按 runId 查询快照和事件;后端支持时显式 reconcile。仍无完成证据的旧任务继续保持 unknown。当前源码提供本地拥有者恢复流程,将“保留旧结果未知”与“允许今后新任务”分开;不在固定 App/SDK 发行中,也不代表业务验收或原生取消。
先确认实际运行的是已支持恢复的新候选 Daemon,再创建恢复检查点,查看 admissionRecovery 的 requiresRestart 与 canResume。旧后台不支持此方法时,先按管理员候选迁移路径正常停止旧拥有者、前台 run 候选并沿用原配置;不能假定旧入口或新 GUI 已经提供恢复能力。后台必须通过系统启动身份确认旧执行之后电脑已经重启,才允许显式恢复新准入;需要重启时由设备主人正常重启电脑,程序不会代为执行。旧记录缺少原启动身份时,必须先创建检查点再重启,不能猜测原进程已经结束。
# 在执行设备,用原安装入口和原配置;以下为独立运行目录示例。
node daemon/dist/cli.js prepare-admission-recovery /private/device/config.json
# 保留 admissionRecovery.checkpointId;requiresRestart=true 时正常重启电脑。
# 重新启动原后台,确认 canResume 后显式恢复:
node daemon/dist/cli.js resume-admission /private/device/config.json --recovery-id <检查点UUID>
node daemon/dist/cli.js status /private/device/config.jsonstatus.admissionRecovery 报告 unresolvedCount、supported、checkpointId、requiresRestart 和 canResume。不支持可靠启动身份的平台不能推定安全。恢复仅解除已核验旧执行对新准入的封锁,旧 runId、unknown、事件和输出保留,不重派、不释放、不报告成功或已取消。原快照可额外标记 admissionRecovered,技术终态仍是 unknown;旧任务继续由原应用或人工核对。