用途:本技能负责观察、等待或恢复 Dreamina Canvas 中处于进行中或卡住状态的 submitId,绝不授权新的提交;当无法恢复时上报用户。参考细节见 references/recovery-state-machine.md。
适用场景:节点运行(或任何付费命令)返回退出码 20 且 requiredAction 为 resume;先前进程超时、崩溃或丢失内存状态但已持久化 projectId 与 submitId;用户想确认先前启动的运行是否仍在进行、已完成或已失败。不适用于启动新运行(属于 dreamina-canvas-quote-and-run),也不适用于对尚未批准的草稿重新报价。
两个观察命令:
纯读取,绝不推进服务端状态
dreamina-canvas --format json operation status <submitId> --project-id <projectId>
轮询至终态,带本地超时
dreamina-canvas --format json operation wait <submitId> --project-id <projectId> --timeout 10m --interval 5s operation status 始终可安全调用。operation wait 仅在操作到达终态时返回退出码 0;本地超时返回退出码 20,服务端仍在运行。
提交状态机:operation status 返回 submission 块。state 为 absent 表示服务端当前无该提交记录,不证明原请求未到达,也可能是保留期过期,仅此状态 resubmittable 可能为 true,应视为模糊并上报;in_progress 表示已接受但无终态资源,永不 resubmittable;completed 表示终态资源可用,通过 dreamina-canvas-download-assets 下载,永不 resubmittable。缺失 submission 字段应视为“服务端已接受”,绝不可当作 absent,否则会导致重复计费。
重新提交不变量:submission.resubmittable == true 仅在 state == "absent" 时出现,这是唯一允许重新提交的时刻;其他状态必须使用 operation status / operation wait,绝不可用新 submitId 发起新的节点运行。批量操作按项适用相同规则,某项缺失 state 字段不代表失败,用 operation status <submitId> 逐项检查。
失败与恢复:operation status 返回退出码 11 时重新认证后再查询;operation wait 本地超时(resume)时增大 --timeout 或稍后再来,操作仍在服务端运行;state 为 absent 且 resubmittable 为 true(human_intervention)时上报用户,不自动重新提交;state 为 absent 且 resubmittable 为 false 或缺失(resume)时视为已接受,继续等待;服务端返回退出码 21(retry)时有界退避重试。
本技能不会:生成新 submitId;在 resubmittable 未明确为 true 时重新提交;将缺失 submission 字段当作 absent;持久化令牌、签名 URL、Cookie 或会话材料。
策略:调用需已确认安装 dreamina-canvas,并持久化小写 projectId 与 submitId。禁止在重试时生成新 submitId、将缺失 submission.state 当作 absent、在 resubmittable 未明确为 true 时自动重新提交、持久化令牌/签名 URL/Cookie/会话材料。默认提示:按 ID 恢复,绝不生成新 submitId;缺失 submission 字段视为“服务端已接受”而非 absent;仅 absent + resubmittable=true 组合允许新的节点运行。