@dsh-enhanced/assistant-delivery 0.1.61 → 0.1.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +29 -10
  2. package/bin/dsh-restart-supervisor.js +76 -0
  3. package/lib/agent-runtime.d.ts +21 -1
  4. package/lib/agent-runtime.d.ts.map +1 -1
  5. package/lib/agent-runtime.js +159 -15
  6. package/lib/agent-runtime.js.map +1 -1
  7. package/lib/approval-status-context.d.ts +8 -0
  8. package/lib/approval-status-context.d.ts.map +1 -0
  9. package/lib/approval-status-context.js +55 -0
  10. package/lib/approval-status-context.js.map +1 -0
  11. package/lib/operator-snapshot.d.ts +1 -1
  12. package/lib/operator-snapshot.d.ts.map +1 -1
  13. package/lib/operator-snapshot.js +4 -4
  14. package/lib/operator-snapshot.js.map +1 -1
  15. package/lib/restart-native.d.ts +47 -0
  16. package/lib/restart-native.d.ts.map +1 -0
  17. package/lib/restart-native.js +170 -0
  18. package/lib/restart-native.js.map +1 -0
  19. package/lib/restart-runtime.d.ts +38 -0
  20. package/lib/restart-runtime.d.ts.map +1 -0
  21. package/lib/restart-runtime.js +335 -0
  22. package/lib/restart-runtime.js.map +1 -0
  23. package/lib/restart-store.d.ts +132 -0
  24. package/lib/restart-store.d.ts.map +1 -0
  25. package/lib/restart-store.js +757 -0
  26. package/lib/restart-store.js.map +1 -0
  27. package/lib/restart-supervisor.d.ts +129 -0
  28. package/lib/restart-supervisor.d.ts.map +1 -0
  29. package/lib/restart-supervisor.js +615 -0
  30. package/lib/restart-supervisor.js.map +1 -0
  31. package/lib/service.d.ts +45 -1
  32. package/lib/service.d.ts.map +1 -1
  33. package/lib/service.js +476 -6
  34. package/lib/service.js.map +1 -1
  35. package/lib/sqlite.d.ts +1 -1
  36. package/lib/sqlite.d.ts.map +1 -1
  37. package/lib/sqlite.js +44 -2
  38. package/lib/sqlite.js.map +1 -1
  39. package/lib/store.d.ts +23 -0
  40. package/lib/store.d.ts.map +1 -1
  41. package/lib/store.js +222 -85
  42. package/lib/store.js.map +1 -1
  43. package/lib/tools.d.ts.map +1 -1
  44. package/lib/tools.js +21 -2
  45. package/lib/tools.js.map +1 -1
  46. package/lib/types.d.ts +2 -0
  47. package/lib/types.d.ts.map +1 -1
  48. package/lib/version.d.ts +1 -1
  49. package/lib/version.js +1 -1
  50. package/package.json +11 -10
package/README.md CHANGED
@@ -8,12 +8,12 @@
8
8
 
9
9
  ## 兼容性与安装顺序
10
10
 
11
- - DSH / Agent / Agent Presets / LLM / Session:`0.2.0-rc.2`
12
- - `@deepseek-ai/dsh-attachment`:`0.2.0-rc.2`,仅图片入站路径需要的可选 Host service
13
- - `@deepseek-ai/dsh-user-questions`:`0.2.0-rc.2`。它定义 `ctx.userQuestions.ask()` 和 Agent-scoped `user-questions/request` answerer waterfall;Web Host 通过 Remote Events 在 live root Agent scope 提供 answerer。该 seam 没有可供 Delivery 消费的独立 question request/answer 事件流。
14
- - `@deepseek-ai/dsh-commands`:`0.2.0-rc.2`,可选 Host command service;按当前命令语法/执行契约只委托安全的原生 `/compact`。`/help`、`/status`、`/session`、`/new`、`/clear`、`/stop`、`/feedback`、`/learning` 及模型/权限控制命令都由 Delivery 自有;其他原生命令即使被宿主发布也不委托、不进入 LLM
15
- - `@deepseek-ai/dsh-goal`:`0.2.0-rc.2`,可选原生目标服务;启用 `agentGoalContinuationTimeoutMs` 时还须由 Host 挂载同版本 `dsh-goal-round-driver`,仅安装服务不产生自动续跑
16
- - `@deepseek-ai/dsh-permission-presets` / `@deepseek-ai/dsh-sandbox-policy` / `@deepseek-ai/dsh-user-approval`:`0.2.0-rc.2`,权限档位命令使用 preset service,并通过 sandbox/approval 包的 canonical setter 固化执行事实;所需 Host service 缺失时命令 fail closed
11
+ - DSH / Agent / Agent Presets / LLM / Session:`0.2.1-rc.2`
12
+ - `@deepseek-ai/dsh-attachment`:`0.2.1-rc.2`,仅图片入站路径需要的可选 Host service
13
+ - `@deepseek-ai/dsh-user-questions`:`0.2.1-rc.2`。它定义 `ctx.userQuestions.ask()` 和 Agent-scoped `user-questions/request` answerer waterfall;Web Host 通过 Remote Events 在 live root Agent scope 提供 answerer。该 seam 没有可供 Delivery 消费的独立 question request/answer 事件流。
14
+ - `@deepseek-ai/dsh-commands`:`0.2.1-rc.2`,可选 Host command service;按当前命令语法/执行契约只委托安全的原生 `/compact`。`/help`、`/status`、`/session`、`/new`、`/clear`、`/stop`、`/feedback`、`/learning` 及模型/权限控制命令都由 Delivery 自有;其他原生命令即使被宿主发布也不委托、不进入 LLM
15
+ - `@deepseek-ai/dsh-goal`:`0.2.1-rc.2`,可选原生目标服务;启用 `agentGoalContinuationTimeoutMs` 时还须由 Host 挂载同版本 `dsh-goal-round-driver`,仅安装服务不产生自动续跑
16
+ - `@deepseek-ai/dsh-permission-presets` / `@deepseek-ai/dsh-sandbox-policy` / `@deepseek-ai/dsh-user-approval`:`0.2.1-rc.2`,权限档位命令使用 preset service,并通过 sandbox/approval 包的 canonical setter 固化执行事实;所需 Host service 缺失时命令 fail closed
17
17
  - Cordis:`^4.0.1`
18
18
  - `@dsh-enhanced/assistant-policy`:`>=0.1.43 <0.2.0`,硬依赖
19
19
  - Preference Learning 是反向订阅 `subscribePreferenceFeedback()` 的可选下游;Delivery 不声明对它的 peer/runtime 依赖,避免消息核心与学习插件形成双向包依赖
@@ -180,7 +180,7 @@ cursor 的 protocol、数据库 epoch、稳定 owner scopeKey 和 sequence 必
180
180
 
181
181
  ### 跨渠道 `ask_user_question`
182
182
 
183
- DSH `0.2.0-rc.2` 的 `ctx.userQuestions.ask()` 会把带 `agent` 的请求派发到该 exact live runtime root 的 Agent-scoped `user-questions/request` waterfall;随产品交付的 Web Host 通过 Remote Events 在同一 scope 注册 answerer。`dsh-user-questions` 不发布独立 request/answer 审计流,因此渠道集成必须直接注册 scoped answerer,并在其中完成 owner binding、adapter 能力、取消和回答校验。Delivery answerer 以前置顺序尝试有能力的渠道,避免先注册的远端 answerer 长时间等待而阻塞渠道;无 Delivery 路由、渠道不可用或回答畸形时继续 waterfall,已存在但失效的 owner binding 则以 `ASK_ABORTED` 失败关闭。没有 answerer 接受请求时 Host 以 `NO_PROVIDER` 失败,不会无限等待;多个 answerer 按 waterfall 组合顺序串联,当前 API 不承诺跨 UI 的竞速认领语义。
183
+ DSH `0.2.1-rc.2` 的 `ctx.userQuestions.ask()` 会把带 `agent` 的请求派发到该 exact live runtime root 的 Agent-scoped `user-questions/request` waterfall;随产品交付的 Web Host 通过 Remote Events 在同一 scope 注册 answerer。`dsh-user-questions` 不发布独立 request/answer 审计流,因此渠道集成必须直接注册 scoped answerer,并在其中完成 owner binding、adapter 能力、取消和回答校验。Delivery answerer 以前置顺序尝试有能力的渠道,避免先注册的远端 answerer 长时间等待而阻塞渠道;无 Delivery 路由、渠道不可用或回答畸形时继续 waterfall,已存在但失效的 owner binding 则以 `ASK_ABORTED` 失败关闭。没有 answerer 接受请求时 Host 以 `NO_PROVIDER` 失败,不会无限等待;多个 answerer 按 waterfall 组合顺序串联,当前 API 不承诺跨 UI 的竞速认领语义。
184
184
 
185
185
  渠道自由文本只有在明确回复对应问题消息时才会结算,并要求 account、tenant、conversation、principal、binding version/generation 与当前 owner fence 全部匹配;同一路由恰好只有一个 pending question 也不会吞掉未引用的新消息。匹配回答直接恢复原来的工具调用,不写 Inbox、不作为普通新消息排队;`/stop`、`/new`、`/clear` 仍按渠道正常命令接入规则取消旧 wait(例如群聊可能仍要求 @ 机器人),问题卡的取消按钮则不依赖文字命令。问题发往原 binding 会话,不保证是私聊:若原会话是群聊,问题正文和选项对该群可见,敏感问题应在私聊中发起或改用其他交互方式。
186
186
 
@@ -228,7 +228,7 @@ Session 续约间隔取有效 lease 的约三分之一,有效期限使用 `min
228
228
 
229
229
  渠道 command envelope 只接受从正文第一字节开始的小写 ASCII slash 语法。未知命令、当前 preset 未发布的命令,以及大写、空命令等非法 slash 形态都只返回确定性帮助/错误,绝不作为自然语言进入 LLM。普通 Agent turn 只有在 session persistence `flush()` 明确返回 `true` 后才入队最终回复;返回 `false` 或抛错时不宣称任务成功。
230
230
 
231
- Agent Loop 以 `max-tokens` 结束、正常结束却没有正文,或完整正文超过 `maxTextBytes` 时,Delivery 默认在同一 session 中发起最多两轮后台恢复:先续写缺失部分;若仍未结束,最后一次机会优先根据当前请求和其后全部已有回答片段压缩为预算内的完整答案,不会把同一长会话中更早已完成的任务混入结论。空回答会重新生成,首轮即超长的回答会直接压缩。每个片段先持久化,再开始下一轮;恢复轮沿用已经选定的 provider、model 和 effort,但 source 明确标记为 Delivery 的内部 notice。恢复轮禁止工具执行:DSH `0.2.0-rc.2` 仍可能把 scoped tool schema 序列化给 provider,但任何调用都会在审批和执行前被拒绝,并立即结束该恢复轮;工具状态也不会展示给用户,后续恢复仍受同一总轮数限制。最终只投递一次合并后的完整回复并标记完成,不需要用户发送”继续”。
231
+ Agent Loop 以 `max-tokens` 结束、正常结束却没有正文,或完整正文超过 `maxTextBytes` 时,Delivery 默认在同一 session 中发起最多两轮后台恢复:先续写缺失部分;若仍未结束,最后一次机会优先根据当前请求和其后全部已有回答片段压缩为预算内的完整答案,不会把同一长会话中更早已完成的任务混入结论。空回答会重新生成,首轮即超长的回答会直接压缩。每个片段先持久化,再开始下一轮;恢复轮沿用已经选定的 provider、model 和 effort,但 source 明确标记为 Delivery 的内部 notice。恢复轮禁止工具执行:DSH `0.2.1-rc.2` 仍可能把 scoped tool schema 序列化给 provider,但任何调用都会在审批和执行前被拒绝,并立即结束该恢复轮;工具状态也不会展示给用户,后续恢复仍受同一总轮数限制。最终只投递一次合并后的完整回复并标记完成,不需要用户发送”继续”。
232
232
  后台恢复是新的、有界模型 turn,可能产生额外模型用量,不是对同一个已提交请求的透明重试。若恢复轮失败或次数耗尽、没有新增正文,或已经持久化但无法建立安全调度边界,Delivery 才保留当前最佳正文、附加明确的未完成提示并标记失败;完全没有可用正文时发送重试提示。失败提示不再要求用户发送“继续”这类协议词。若任何片段无法确认持久化,则不投递该结果,也不宣称完成。这些失败回复不会进入 completed-turn preference projection。`agentMaxAutoContinuationTurns` 设为 `0` 时保留直接失败提示行为。
233
233
 
234
234
  `agentGoalContinuationTimeoutMs` 默认是 `0`,保持既有的前台回复后立即释放 Agent 行为。设为正值时,Delivery 先完成并入队原始前台回复,再保留同一 Session、Agent 与已固定的 GoalId,让 Host 的原生 `goal-round-driver` 在其自己的调度边界续跑;Delivery 不创建目标轮、不接管轮次,累计上限仍由 DSH 的 `maxGoalRounds` 限制。原回复只是该入站任务的结果,绝不表示业务目标已经达成。
@@ -334,6 +334,8 @@ Profile 还必须为当前 owner principal 添加精确授权,例如:`subjec
334
334
 
335
335
  延迟审批由 domain 先通过 `prepareAgentApproval()` 从当前 Agent 的 active owner binding 派生不可伪造的 source/binding/workspace/principal route,再把该 route 随 Policy proposal 持久化;background Agent 可由可信 runner 使用 `bindAgentApprovalRoute()` 临时绑定 automation definition 中的 immutable `deliveryBindingId`,该绑定不会注册为模型工具。Delivery 在同一 owner 事务内从 active binding 派生 canonical external `principalId`,并把它固定到私有 workflow template content/digest;Host resolver 在返回 prompt 前会再次核对 exact binding version/generation 与 principal。该 principal 不进入 Growth trace 或 Growth 数据库。Delivery tick 会在发送前领取 Policy dispatch,以 `approval-card:<proposalId>` / `approval:<proposalId>` 写入同一 Outbox,再用 CAS 标记已入队;若进程在两步之间退出,重放仍命中同一 intent。schema v6 另以带版本 fence 的持久 `(createdAt, proposalId)` 高水位分页扫描 pending dispatch:无效 route 不会被伪标为已入队,但也不能用一个 poison page 永久饿死后续审批;扫描到尾后回绕重试这些条目,Host 重启与并发 scanner 都不会倒退覆盖新游标。
336
336
 
337
+ 原生 owner Agent 每步 prompt 的只读审批状态由 Delivery 按当前直连 active owner binding、workspace、preset 和 Policy `history` 权限重新读取;只查询 personal-memory 与 personal-wiki 两个精确 v2 route,每源最多五条。首次发现真实提案后才挂载 Agent-scoped context,普通无提案会话保持原有 prompt 装配。context 只含经过领域资源格式筛选的提案 ID、资源 ID、动作、状态、版本、时间与截断标志;不包含审批正文、摘要或 diff。owner、binding 或服务权限失效时旧状态不再输出,读取失败显示不可用。状态不是操作授权:拒绝或过期的旧卡不能继续索批;新 owner 消息再次明确请求时才可通过正常工具发起新请求。Policy 批准也不证明领域写入完成,需核实工具的 record/page 结果或当前读取;此状态不会自动重放、发送或写 Memory/Wiki。
338
+
337
339
  Policy 的 `approved` 只表示 owner 决定,不表示领域变更已经应用。schema v10 的 Host-only
338
340
  presentation publisher 由 Delivery 只向当前 Evolution 或 Automations 实例签发、可撤销的进程内 capability;它不是
339
341
  公开 service API,也不能由普通调用方伪造。该 capability 接收领域结算或 Automation incident 生成的单调版本 typed
@@ -375,10 +377,27 @@ Automation incident 使用 `automation-incident:<incidentId>:g<generation>` 同
375
377
  - `health().deadLetterInbox/deadLetterOutbox/unknownOutbox` 保留为历史 terminal 行总数以兼容旧消费者;告警与健康聚合应使用 `actionableDeadLetterInbox/actionableDeadLetterOutbox/actionableUnknownOutbox`。对应 `resolved*` 字段统计当前 exact attempt 已有 cancel tombstone 的行,因此 operator 已处理的历史不会让系统永久 degraded。
376
378
  - `unknown_after_send` cancel 后仍保留为独立的 ambiguous 状态和原始 resolution receipt,不伪装成确定未发送;该 exact attempt 不会再被自动 reconcile/send,并视为 lane terminal,cancel receipt 也不能改写成 retry。若平台随后给出匹配 provider message id 的 delivered/read receipt,外部事实可单调提升当前状态并清除当前失败标记,原 cancel/attempt ledger 仍保留。普通尚未结算的 unknown 只能由显式、Policy-gated operator `retry` 重新入队;稳定 owner route 禁止 retry,只能原 lineage reconcile/cancel/park。系统从不自动重发 unknown send。
377
379
  - Agent dispatch 前写 `dispatch-started` marker。此后进程崩溃会进入 `dispatch-ambiguous` dead letter,避免自动产生第二个 turn;这会牺牲一次自动重放,需要 owner 审阅后显式 retry。
380
+ - 对仍绑定当前 owner 的外部普通请求,恢复扫描会在没有最终回复时持久排入一次中断说明,沿用当前入站、回复和发送前授权;历史已中断记录也会扫描。已有最终回复(包括发送结果未知)或 operator 已结算的记录不另发通知。通知不重跑 Agent、不把原执行改成成功,也不确认之前写入是否完成。
378
381
  - `/permission` 是受限例外:它使用专用 commit/cancel/failure recovery marker,并以精确 Inbox id(兼容旧 event id)与 `replyToEventId` 共同证明终态 Outbox;崩溃恢复不会把普通 background Outbox 或同名伪造 key 当成完成见证。
379
- - 当前 DSH `0.2.0-rc.2` 的 `followup()` 没有跨进程 `sourceEventId` 唯一接纳/完成 handle,因此本包诚实承诺“持久 event 去重 + at-most-once 自动 Agent dispatch”,不声称端到端 exactly-once。若宿主未来提供该 seam,可升级为安全的 at-least-once wake。
382
+ - 当前 DSH `0.2.1-rc.2` 的 `followup()` 没有跨进程 `sourceEventId` 唯一接纳/完成 handle,因此本包诚实承诺“持久 event 去重 + at-most-once 自动 Agent dispatch”,不声称端到端 exactly-once。若宿主未来提供该 seam,可升级为安全的 at-least-once wake。
380
383
  - Outbox adapter 抛异常一律视为可能已发送;不会按照普通 5xx 重试。
381
384
 
385
+ ## 受控维护重启
386
+
387
+ 显式配置 `restart` 后,当前 owner route 的前台任务在首次派发前冻结 owner/binding/Session、实际模型与 reasoning effort、单次输出上限、模型/工具调用次数和绝对截止时间。`allowedTools` 只选取已由可信服务登记实际定义对象的只读工具作为恢复能力:`delivery_status`、`wiki_search`、`wiki_read`、`memory_search`。同名 scope 覆盖、提供者卸载或未登记定义不会继承资格。普通任务仅记录模型、调用量与恢复资格,原有工具、时限和模型选择不受恢复配置限制;执行写工具、委派、超额、模型变化或不明结果只会失去自动续办资格。申请恢复后才强制冻结的剩余额度、截止时间和只读工具清单。它不增加原 Policy 权限。旧任务不会被追补为可恢复任务。
388
+
389
+ `delivery_request_restart(reason)` 只接受原因,不接受 unit、路径或命令。调用须通过当前 owner 的精确 `maintenance.restart` 许可,且是该模型响应唯一的工具调用;活动 acceptance/native goal 或其他未静止的 Agent/Automations 会拒绝。原生 `concludeTurn()` 结束当前轮,工具结果和完整 Session 经过 persistence flush;实际 Agent teardown 与租约释放后才写 `ready`。schema 26 的全局维护栅栏与 Inbox claim 共享 SQLite 写事务,后台 Automations 同步暂停新领取,Outbox 仅发送本次维护通知并等待已有发送结算,已接收的控制命令仍可撤销恢复。恢复过程中原任务不被标为成功。
390
+
391
+ 私有 sidecar 账本采用 WAL/FULL、CAS 和不可变预算预留。外部 `bin/dsh-restart-supervisor.js` 在安装器同名生命周期锁内检查原任务、维护通知 accepted、全部 Session lease/Automations 静止、当前 Policy 紧急停止和维护许可,以及 unit、profile、cohort receipt 和已安装代码摘要。它持久领取后至多执行一次固定的 `systemctl --user restart`;命令结果不明时只观察,不重发。新 InvocationID、Host ready、飞书连接及稳定窗口全部满足才允许续办。
392
+
393
+ 新 Host 在同一 Session 和原 Inbox/foreground execution 下追加固定、稳定 ID 的 Host notice,复用原生 AgentLoop。原生 API 以 `role:user` 承载 notice,`source` 明确为 Host;它不创建新的认证入站消息或 owner 授权。Session 的 inbox-splice 和领取记录必须在模型调用前落盘;恢复不重置模型、预算和截止时间。新 Host 稳定、原 Session 已独占且续办 notice 已落盘并重验授权后,即解除全局维护暂停;其它会话和后台任务恢复正常收发,原会话仍按 Session lease 串行执行,不必等待续办任务完成。`/stop`、`/new`、撤权、模型/代码漂移及未知外部结果阻止自动重放。维护失败写幂等说明,不添加 DONE;原进度可用时追加“任务已保存”并关闭这一次 COT run;平台 `RUN_FINISHED.status=done` 只结束该进度流,原任务回执仍 pending,消息不添加 DONE reaction。历史遗失的进度句柄无法原位关闭。
394
+
395
+ 冻结 owner 安装通过 `scripts/install/upgrade-program.mjs --restart-config /absolute/private.json` 增加能力:该文件须 owner-private,包含 `databasePath`(固定 Home 下 `assistant-delivery/restart.sqlite`)、`ownerRouteId`、`maxModelRequests`、`maxToolCalls`、`taskTimeoutMs`、`allowedTools`。安装事务冻结内容和摘要,精确新增稳定 owner route 的许可(每次执行仍复核当前 binding)并更新签名 overlay;恢复不重读配置输入。升级后用 `scripts/install/restart-supervisor.mjs --dry-run` 验证并以 `--install` 安装 Home 外的私有配置和 user timer/oneshot;参数见该脚本,helper 随本包发布。
396
+
397
+ 监督器的 Node 入口与主 Host 一样过滤 `ExperimentalWarning`,避免每轮轮询重复打印 SQLite 实验特性提示;普通警告、错误和非零退出状态仍然保留。正常的 `idle` 表示本轮没有待处理重启请求,oneshot 成功后显示 `inactive/dead` 是预期状态,应结合 timer 和服务的 `Result`、退出码判断健康。
398
+
399
+ 这是同码、事先保存的维护恢复;不提供代码升级,不恢复未知派发,不保证硬崩溃后任意指令继续,也不保证目标离线期间飞书消息不丢。独立接入进程仍是后续交付。外部 helper 与目标同 UID,不构成恶意代码的 OS 隔离;有宿主 shell 权限的模型仍须遵守既有 sandbox/Policy。每个任务最多申请一次,执行器还有时间窗重启次数上限;新建或经受管程序升级的 unit 同时限制 600 秒内最多 3 次启动,重复启动失败会停止并保留诊断,不无限抖动。同 Host 版本升级也会事务式迁移旧 unit 的启动限制,保留原启动命令和环境变量,失败回滚恢复原 unit 字节。通知或监督器在 120 秒内未接管则解除维护栅栏并报告失败;监督器重开不会重置已派发重启的观察期限。维护期间普通 `/status` 会随其它消息排队,`/stop`、`/new` 可直接撤销。额度是调用次数、单次输出和时间上限,不是精确总费用上限。
400
+
382
401
  ## Goals 单次唤醒边界
383
402
 
384
403
  Delivery 只向 Goals 的已注册 Host capability 提供一次受限恢复:它重读当前 owner route、binding、原 Session、GoalId、revision 和 deadline,在重新加载原 Session 后重查状态,仅在 Goals 的 dispatch CAS 成功后恢复原生目标。它不把历史 Session snapshot、runtime context 或任意 `user/message` 当作新的 owner 输入;DSH 会把 runtime context snapshot 持久化为 user-role message,它不能替代人类回合证明。
@@ -391,7 +410,7 @@ Cordis 按上下文读取 service 时可能产生不同 proxy 对象,Host 不
391
410
 
392
411
  - **文件系统:**读写配置的 SQLite 与私有 spool 目录,并在 fresh Agent create 前创建缺失的 workspace;cold resume 只验证原目录仍存在。图片字节通过宿主 AttachmentStore 持久化;标准 `attachment-local` 将其写入 `$DSH_HOME/attachments/v1`,Delivery 自己不把字节写进 SQLite、spool 或 session 日志。Delivery 本身不读取任意 workspace 文件。挂载 preset 后,获 Policy 允许的文件工具可在 DSH 文件权限边界内读取 workspace。
393
412
  - **网络:**本包自身无网络访问;网络权限属于注册的渠道 adapter。
394
- - **进程/浏览器:**Delivery 本身不启动 subprocess、shell 或 browser;它挂载的 preset 可以暴露 Bash/Pwsh,真正执行由宿主 sandbox、approval 与 Policy 三层共同约束。
413
+ - **进程/浏览器:**常驻 Delivery 服务不启动 subprocess、shell 或 browser;可选外部维护 helper 仅执行安装器固定的 systemd/journal/flock 命令并读取受保护的状态与代码;它挂载的 preset 可以暴露 Bash/Pwsh,真正执行由宿主 sandbox、approval 与 Policy 三层共同约束。
395
414
  - **凭据:**不接收、存储或输出 provider token;adapter 必须通过 SecretRef/后续 credentials service 获取。
396
415
  - **数据:**Inbox/Outbox 会保存消息正文、外部 identity 和 route,属于 PII。入站只登记最多 10 个受限 provider descriptor;授权图片会额外保存经过校验的 AttachmentStore 引用和内容摘要,provider reference 始终留在隔离账本而不进入 prompt、模型请求或工具输出。图片二进制遵循所选 AttachmentStore 的保留策略;标准 `attachment-local` 当前没有引用垃圾回收。文件、音频、视频和 sticker 仍保持 metadata quarantine。当前版本也不自动清理 Delivery 历史,请依部署的数据保留策略备份/轮换私有数据库和附件对象。
397
416
 
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ /** Fixed-scope, model-free maintenance worker. The installed config pins its sole unit. */
3
+ import { constants } from 'node:fs'
4
+ import { open, lstat } from 'node:fs/promises'
5
+ import { isAbsolute, resolve } from 'node:path'
6
+ import { RestartStore } from '../lib/restart-store.js'
7
+ import { runLockedRestartSupervisorTick, validateRestartSupervisorConfig } from '../lib/restart-supervisor.js'
8
+
9
+ function options(argv) {
10
+ let configPath
11
+ let once = false
12
+ for (let index = 0; index < argv.length; index++) {
13
+ const item = argv[index]
14
+ if (item === '--once' && !once) once = true
15
+ else if (item === '--config' && configPath === undefined) configPath = argv[++index]
16
+ else throw new Error('restart-supervisor: expected --config <absolute-path> [--once]')
17
+ }
18
+ if (!configPath || !isAbsolute(configPath) || resolve(configPath) !== configPath) {
19
+ throw new Error('restart-supervisor: config must be an absolute normalized path')
20
+ }
21
+ return { configPath, once }
22
+ }
23
+
24
+ async function privateConfig(path) {
25
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW)
26
+ try {
27
+ const before = await file.stat()
28
+ const named = await lstat(path)
29
+ if (!before.isFile() || !named.isFile() || named.isSymbolicLink()
30
+ || before.nlink !== 1 || before.uid !== process.getuid()
31
+ || before.mode & 0o077 || before.dev !== named.dev || before.ino !== named.ino
32
+ || before.size < 1 || before.size > 1_048_576) throw new Error('restart-supervisor: unsafe config file')
33
+ const contents = await file.readFile()
34
+ const after = await file.stat()
35
+ if (after.size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs) {
36
+ throw new Error('restart-supervisor: config changed while reading')
37
+ }
38
+ return validateRestartSupervisorConfig(JSON.parse(contents.toString('utf8')))
39
+ } finally { await file.close() }
40
+ }
41
+
42
+ async function main() {
43
+ const args = options(process.argv.slice(2))
44
+ const config = await privateConfig(args.configPath)
45
+ const controller = new AbortController()
46
+ const stop = () => controller.abort(new Error('restart-supervisor: stopping'))
47
+ process.on('SIGINT', stop)
48
+ process.on('SIGTERM', stop)
49
+ try {
50
+ while (!controller.signal.aborted) {
51
+ try {
52
+ const result = await runLockedRestartSupervisorTick(config,
53
+ () => new RestartStore({ path: config.databasePath }), { signal: controller.signal })
54
+ if (args.once) { process.stdout.write(`${result}\n`); return }
55
+ } catch (error) {
56
+ if (controller.signal.aborted) break
57
+ process.stderr.write(`restart-supervisor: tick failed: ${error instanceof Error ? error.message : String(error)}\n`)
58
+ if (args.once) throw error
59
+ }
60
+ await new Promise(resolve => {
61
+ const abort = () => { clearTimeout(timer); resolve() }
62
+ const timer = setTimeout(() => { controller.signal.removeEventListener('abort', abort); resolve() }, 2_000)
63
+ controller.signal.addEventListener('abort', abort, { once: true })
64
+ if (controller.signal.aborted) abort()
65
+ })
66
+ }
67
+ } finally {
68
+ process.off('SIGINT', stop)
69
+ process.off('SIGTERM', stop)
70
+ }
71
+ }
72
+
73
+ main().catch(error => {
74
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`)
75
+ process.exitCode = 1
76
+ })
@@ -17,6 +17,9 @@ import type { AcceptanceHandle } from './acceptance.js';
17
17
  import type { FeedbackSignalSelection, ObjectiveCommand, ObjectiveCommandResult } from './feedback-command.js';
18
18
  import type { InboundImageMaterializer } from './inbound-images.js';
19
19
  import type { DeliveryInboundRuntime } from './service.js';
20
+ import { type RestartConfig } from './restart-runtime.js';
21
+ import type { RestartRecord, RestartStore } from './restart-store.js';
22
+ import { type OwnerApprovalStatusRead } from './approval-status-context.js';
20
23
  import type { DeliverySessionLeases } from './session-lease-runtime.js';
21
24
  import { type DeliveryGoalWakeInput, type DeliveryGoalWakeResult } from './goal-wake-types.js';
22
25
  import { type WorkflowCommand } from './workflow-command.js';
@@ -33,11 +36,21 @@ declare module '@deepseek-ai/dsh-llm' {
33
36
  }
34
37
  }
35
38
  interface DshDeliveryRuntimeOptions {
39
+ restart?: {
40
+ store: RestartStore;
41
+ config: RestartConfig;
42
+ invocationId: string;
43
+ authorize(record: RestartRecord): boolean;
44
+ authorizeTask(inboxId: string): boolean;
45
+ onContinuationAdmitted(record: RestartRecord, sessionId: string): void;
46
+ isRestartSafeTool(agent: Agent, name: string): boolean;
47
+ };
36
48
  sessionLeases: DeliverySessionLeases;
37
49
  sessionNamespace: string;
38
50
  workspace: string;
39
51
  agentPreset: string;
40
52
  getAgentPresets(): Pick<AgentPresets, 'mount' | 'resolve'> | undefined;
53
+ readOwnerApprovalStatus(agent: Agent): OwnerApprovalStatusRead | undefined;
41
54
  policyRef: string;
42
55
  provider: string;
43
56
  model: string;
@@ -144,6 +157,13 @@ export declare class DshDeliveryRuntime implements DeliveryInboundRuntime {
144
157
  private readonly ctx;
145
158
  private readonly policy;
146
159
  private readonly options;
160
+ private readonly restartRuns;
161
+ canRequestRestart(agent: Agent): boolean;
162
+ requestRestart(agent: Agent, reason: string): {
163
+ id: string;
164
+ status: string;
165
+ };
166
+ resumeRestart(record: RestartRecord, binding: Readonly<ConversationBinding>, envelope: Readonly<InboundEnvelope>, signal: AbortSignal): Promise<unknown>;
147
167
  readonly dispatchControl: "explicit";
148
168
  private readonly activeSessionControls;
149
169
  private readonly sessionLeases;
@@ -208,7 +228,7 @@ export declare class DshDeliveryRuntime implements DeliveryInboundRuntime {
208
228
  private runLearningCommand;
209
229
  private sessionHelp;
210
230
  private runSessionCommand;
211
- process(binding: Readonly<ConversationBinding>, envelope: Readonly<InboundEnvelope>, outerSignal: AbortSignal, prepared?: Readonly<PreparedInboundMessage>, markDispatching?: MarkInboundDispatching): Promise<InboundProcessResult>;
231
+ process(binding: Readonly<ConversationBinding>, envelope: Readonly<InboundEnvelope>, outerSignal: AbortSignal, prepared?: Readonly<PreparedInboundMessage>, markDispatching?: MarkInboundDispatching, restartContinuation?: RestartRecord): Promise<InboundProcessResult>;
212
232
  private processControlled;
213
233
  }
214
234
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,9 @@ import { externalPrincipalId } from './canonical.js';
13
13
  import { feedbackSignalInput, feedbackUsage, parseFeedbackCommand, } from './feedback-command.js';
14
14
  import { objectiveStateMessage } from './feedback-command.js';
15
15
  import { learningCommandUsage, parseLearningCommand, serializeLearningExport, } from './learning-command.js';
16
+ import { attachRestartRun, restartDigest, restartContinuationText } from './restart-runtime.js';
17
+ import { admitRestartContinuation, createRestartContinuation } from './restart-native.js';
18
+ import { renderOwnerApprovalStatus } from './approval-status-context.js';
16
19
  import { isExactDeliveryCommand, learningDispatchRecoveryCode, parseDeliveryCommand, permissionDispatchRecoveryCode, } from './session-commands.js';
17
20
  import { DeliveryStoreError } from './store.js';
18
21
  import { SessionLeaseUnavailable } from './session-lease-runtime.js';
@@ -1115,6 +1118,24 @@ export class DshDeliveryRuntime {
1115
1118
  ctx;
1116
1119
  policy;
1117
1120
  options;
1121
+ restartRuns = new WeakMap();
1122
+ canRequestRestart(agent) { return this.restartRuns.get(agent)?.canRequest() === true; }
1123
+ requestRestart(agent, reason) {
1124
+ const run = this.restartRuns.get(agent);
1125
+ if (run === undefined)
1126
+ throw new Error('assistant-delivery: this foreground task has no restart authority');
1127
+ const record = run.request(reason);
1128
+ return { id: record.id, status: record.status };
1129
+ }
1130
+ async resumeRestart(record, binding, envelope, signal) {
1131
+ const restart = this.options.restart;
1132
+ if (restart === undefined || !restart.authorize(record))
1133
+ throw new Error('assistant-delivery: restart continuation is not authorized');
1134
+ return await this.process(binding, envelope, signal, undefined, () => {
1135
+ if (!restart.authorize(record))
1136
+ throw new Error('assistant-delivery: restart continuation authority changed');
1137
+ }, record);
1138
+ }
1118
1139
  dispatchControl = 'explicit';
1119
1140
  activeSessionControls = new Map();
1120
1141
  sessionLeases;
@@ -1560,7 +1581,7 @@ export class DshDeliveryRuntime {
1560
1581
  return true;
1561
1582
  }
1562
1583
  /** Wait for only the turn that claims Delivery's exact message identity. */
1563
- followupTurn(agent, message, onClaimed, onSettled) {
1584
+ followupTurn(agent, message, onClaimed, onSettled, admit) {
1564
1585
  return new Promise((resolve, reject) => {
1565
1586
  let claimedTurn;
1566
1587
  let settled = false;
@@ -1614,7 +1635,15 @@ export class DshDeliveryRuntime {
1614
1635
  }
1615
1636
  });
1616
1637
  try {
1617
- agent.followup(message);
1638
+ if (admit === undefined)
1639
+ agent.followup(message);
1640
+ else
1641
+ void admit().then(state => {
1642
+ if (state.kind === 'settled')
1643
+ settle(state.turn);
1644
+ else if (state.kind !== 'pending')
1645
+ fail(new Error('assistant-delivery: continuation was already dispatched without a settled result'));
1646
+ }, fail);
1618
1647
  }
1619
1648
  catch (error) {
1620
1649
  fail(error);
@@ -1784,6 +1813,42 @@ export class DshDeliveryRuntime {
1784
1813
  if (event.type === 'turn/end' || event.type === 'tool/result')
1785
1814
  installUserCancelledToolNotice();
1786
1815
  });
1816
+ // A context registration changes native cold-resume accounting even if its
1817
+ // text is empty. Install only after a real proposal is visible (or a read
1818
+ // failed), then re-read on every prompt assembly. Live proposal creation
1819
+ // becomes visible after the tool result/turn settles.
1820
+ let approvalStatusInstalled = false;
1821
+ const currentApprovalStatus = () => {
1822
+ try {
1823
+ return this.options.readOwnerApprovalStatus(agent);
1824
+ }
1825
+ catch {
1826
+ return 'unavailable';
1827
+ }
1828
+ };
1829
+ const installApprovalStatus = () => {
1830
+ if (approvalStatusInstalled)
1831
+ return;
1832
+ const status = currentApprovalStatus();
1833
+ if (status === undefined || (status !== 'unavailable'
1834
+ && status.memory.proposals.length === 0 && status.wiki.proposals.length === 0))
1835
+ return;
1836
+ approvalStatusInstalled = true;
1837
+ agentCtx.inject(['systemPrompt'], promptCtx => promptCtx.systemPrompt.context({
1838
+ name: 'assistant-delivery:owner-approval-status',
1839
+ order: 261,
1840
+ text: () => {
1841
+ const current = currentApprovalStatus();
1842
+ return current === undefined ? '' : renderOwnerApprovalStatus(current);
1843
+ },
1844
+ }));
1845
+ };
1846
+ installApprovalStatus();
1847
+ agentCtx.on('session/event', (eventSession, event) => {
1848
+ if (eventSession === agent.session && (event.type === 'tool/result' || event.type === 'turn/end'
1849
+ || event.type === 'user/message'))
1850
+ installApprovalStatus();
1851
+ });
1787
1852
  await agentPresets?.mount(agentCtx, presetId);
1788
1853
  }
1789
1854
  /**
@@ -3304,7 +3369,7 @@ export class DshDeliveryRuntime {
3304
3369
  await this.disposeAfterReplyBoundary(binding.sessionId, handle);
3305
3370
  }
3306
3371
  }
3307
- async process(binding, envelope, outerSignal, prepared, markDispatching) {
3372
+ async process(binding, envelope, outerSignal, prepared, markDispatching, restartContinuation) {
3308
3373
  const sessionCommand = parseDeliveryCommand(envelope);
3309
3374
  if (envelope.kind === 'command' && sessionCommand === undefined) {
3310
3375
  return this.replySessionCommand(binding, envelope, {
@@ -3356,7 +3421,7 @@ export class DshDeliveryRuntime {
3356
3421
  lease.assert();
3357
3422
  markDispatching();
3358
3423
  lease.assert();
3359
- });
3424
+ }, restartContinuation);
3360
3425
  }
3361
3426
  catch (error) {
3362
3427
  if (control?.command !== undefined && causedByUserCancellation(error)) {
@@ -3376,7 +3441,7 @@ export class DshDeliveryRuntime {
3376
3441
  lease.close();
3377
3442
  }
3378
3443
  }
3379
- async processControlled(binding, envelope, signal, sessionCommand, prepared, markDispatching) {
3444
+ async processControlled(binding, envelope, signal, sessionCommand, prepared, markDispatching, restartContinuation) {
3380
3445
  if (sessionCommand?.name === 'feedback') {
3381
3446
  return await this.runFeedbackCommand(sessionCommand, binding, envelope, signal, markDispatching);
3382
3447
  }
@@ -3479,9 +3544,13 @@ export class DshDeliveryRuntime {
3479
3544
  if (agents === undefined || sessions === undefined) {
3480
3545
  return { outcome: 'not-processed', failureCode: 'agent-runtime-unavailable', retryable: true };
3481
3546
  }
3482
- const persistedSelection = this.options.getModelSelection(envelope.conversation);
3547
+ const restart = this.options.restart;
3548
+ const continuationTask = restartContinuation === undefined ? undefined : restart?.store.getTask(restartContinuation.inboxId);
3549
+ if (restartContinuation !== undefined && continuationTask?.model === undefined)
3550
+ throw new Error('assistant-delivery: restart model is not frozen');
3551
+ const persistedSelection = restartContinuation === undefined ? this.options.getModelSelection(envelope.conversation) : undefined;
3483
3552
  const requestedRoute = toModelRoute(persistedSelection
3484
- ?? prepared?.modelRoute
3553
+ ?? continuationTask?.model ?? prepared?.modelRoute
3485
3554
  ?? { provider: this.options.provider, model: this.options.model });
3486
3555
  const resolvedRoute = await this.resolveExecutionRoute(envelope.conversation, persistedSelection, requestedRoute, signal);
3487
3556
  if ('retry' in resolvedRoute) {
@@ -3500,6 +3569,8 @@ export class DshDeliveryRuntime {
3500
3569
  let removeAbort;
3501
3570
  let removeProgress;
3502
3571
  let progressOpen = true;
3572
+ let restartRun;
3573
+ let restartCheckpoint;
3503
3574
  let progressQueue = Promise.resolve();
3504
3575
  const publishProgress = (update) => {
3505
3576
  if (!progressOpen)
@@ -3590,8 +3661,27 @@ export class DshDeliveryRuntime {
3590
3661
  // an owner tool can create/resume a goal in that very first turn and the
3591
3662
  // host driver is otherwise free to claim its first round at idle.
3592
3663
  goalContinuation = this.waitForNativeGoalContinuation(binding, envelope, agent, signal);
3593
- acceptance = this.options.prepareForegroundTaskAcceptance(binding, envelope);
3594
- foregroundExecution = this.options.beginForegroundTaskExecution(binding, envelope);
3664
+ acceptance = restartContinuation === undefined ? this.options.prepareForegroundTaskAcceptance(binding, envelope) : undefined;
3665
+ foregroundExecution = restartContinuation?.inboxId ?? this.options.beginForegroundTaskExecution(binding, envelope);
3666
+ if (restart !== undefined && foregroundExecution !== undefined && restart.store.getTask(foregroundExecution) !== undefined) {
3667
+ if (restartContinuation !== undefined) {
3668
+ const checkpoint = restartContinuation.checkpoint;
3669
+ if (checkpoint === undefined || restartDigest(agent.session.snapshotEvents().slice(0, checkpoint.sessionEventCount)) !== checkpoint.sessionDigest
3670
+ || checkpoint.continuationTextDigest !== restartDigest(restartContinuationText)
3671
+ || createRestartContinuation({ continuationId: restartContinuation.id, text: restartContinuationText }).id !== checkpoint.continuationMessageId) {
3672
+ throw new Error('assistant-delivery: restart checkpoint does not match the persisted Session');
3673
+ }
3674
+ }
3675
+ restartRun = attachRestartRun({ agent, inboxId: foregroundExecution, binding, envelope,
3676
+ store: restart.store, config: restart.config,
3677
+ isRestartSafeTool: restart.isRestartSafeTool,
3678
+ ...(restartContinuation === undefined ? {} : { continuation: restartContinuation }),
3679
+ authorize: () => checkAuthorization() === 'authorized' && restart.authorizeTask(foregroundExecution),
3680
+ authorizeRestart: () => acceptance === undefined && !goalContinuation?.pinActiveArmedGoal()
3681
+ && restart.authorizeTask(foregroundExecution),
3682
+ });
3683
+ this.restartRuns.set(agent, restartRun);
3684
+ }
3595
3685
  if (acceptance !== undefined || foregroundExecution !== undefined)
3596
3686
  removeAcceptanceRequest = this.ctx.on('session/event', (session, event) => {
3597
3687
  if (session !== agent.session || event.type !== 'request/header')
@@ -3609,11 +3699,44 @@ export class DshDeliveryRuntime {
3609
3699
  // Once the durable marker exists, even a synchronous followup failure is ambiguous:
3610
3700
  // implementations may enqueue before throwing, so no retry is safe.
3611
3701
  dispatched = true;
3612
- const message = createUserMessage({ content, source: {
3702
+ const message = restartContinuation === undefined ? createUserMessage({ content, source: {
3613
3703
  kind: 'delivery', channel: envelope.channel, account: envelope.account, eventId: envelope.eventId,
3614
3704
  trust: 'untrusted',
3615
- } });
3616
- let deliveryTurn = await this.followupTurn(agent, message);
3705
+ } }) : createRestartContinuation({ continuationId: restartContinuation.id, text: restartContinuationText });
3706
+ let deliveryTurn = await this.followupTurn(agent, message, undefined, undefined, restartContinuation === undefined ? undefined
3707
+ : () => admitRestartContinuation(agent, message, { signal,
3708
+ authorize: () => {
3709
+ this.sessionLeases.assert(String(agent.session.id));
3710
+ if (!restart.authorize(restartContinuation))
3711
+ throw new Error('restart authority changed');
3712
+ },
3713
+ flush: () => sessions.flush(agent.session),
3714
+ onAdmitted: () => {
3715
+ this.sessionLeases.assert(String(agent.session.id));
3716
+ restart.onContinuationAdmitted(restartContinuation, String(agent.session.id));
3717
+ },
3718
+ }));
3719
+ if (restartRun?.requested() !== undefined) {
3720
+ await this.waitForAgentIdle(agent, signal);
3721
+ restartCheckpoint = await restartRun.checkpoint();
3722
+ this.options.replyCommand(binding, envelope.eventId, {
3723
+ text: '已保存当前任务,准备进行维护重启;服务就绪后会自动继续,无需重新发送请求。', format: 'plain',
3724
+ }, `inbound:${foregroundExecution}:maintenance`);
3725
+ publishProgress({ kind: 'paused' });
3726
+ // Presentation failure cannot leave the task stuck before the durable handoff.
3727
+ let progressTimeout;
3728
+ try {
3729
+ await Promise.race([progressQueue, new Promise(resolve => {
3730
+ progressTimeout = setTimeout(resolve, 5_000);
3731
+ progressTimeout.unref?.();
3732
+ })]);
3733
+ }
3734
+ finally {
3735
+ if (progressTimeout !== undefined)
3736
+ clearTimeout(progressTimeout);
3737
+ }
3738
+ return { outcome: 'processed' };
3739
+ }
3617
3740
  let completionKind;
3618
3741
  let automaticTurns = 0;
3619
3742
  let assembledText = '';
@@ -3870,12 +3993,12 @@ export class DshDeliveryRuntime {
3870
3993
  progressOpen = false;
3871
3994
  let disposed = false;
3872
3995
  try {
3873
- disposed = await this.disposeAfterReplyBoundary(binding.sessionId, handle, () => goalContinuation?.dispose(), !goalContinuationQuiescent, goalContinuation?.teardownTimeoutMs());
3996
+ disposed = await this.disposeAfterReplyBoundary(binding.sessionId, handle, () => goalContinuation?.dispose(), !goalContinuationQuiescent, restartCheckpoint === undefined && restartContinuation === undefined ? goalContinuation?.teardownTimeoutMs() : 10_000);
3874
3997
  }
3875
3998
  finally {
3876
3999
  acceptanceSucceeded = acceptanceSucceeded && disposed && !signal.aborted
3877
4000
  && (goalContinuation?.isQuiescent() ?? true);
3878
- if (foregroundExecution !== undefined) {
4001
+ if (foregroundExecution !== undefined && restartCheckpoint === undefined) {
3879
4002
  try {
3880
4003
  this.options.completeForegroundTaskExecution(foregroundExecution, {
3881
4004
  status: acceptanceSucceeded ? 'succeeded' : 'unknown', quiescent: acceptanceSucceeded,
@@ -3885,7 +4008,28 @@ export class DshDeliveryRuntime {
3885
4008
  this.ctx.logger.warn(`assistant-delivery: foreground execution completion failed: ${String(error)}`);
3886
4009
  }
3887
4010
  }
3888
- if (acceptance !== undefined) {
4011
+ if (restart !== undefined && restartContinuation === undefined && restartCheckpoint === undefined) {
4012
+ const unfinished = restartRun?.requested();
4013
+ if (unfinished !== undefined)
4014
+ restart.store.fail(unfinished.id, 'restart-checkpoint-failed');
4015
+ }
4016
+ if (restart !== undefined && restartCheckpoint !== undefined) {
4017
+ if (disposed && !signal.aborted && restart.authorize(restartCheckpoint))
4018
+ restart.store.ready(restartCheckpoint.id);
4019
+ else
4020
+ restart.store.fail(restartCheckpoint.id, 'restart-teardown-not-quiescent');
4021
+ }
4022
+ if (restart !== undefined && restartContinuation !== undefined) {
4023
+ const current = restart.store.getRequest(restartContinuation.id);
4024
+ if (current?.status === 'resuming') {
4025
+ if (acceptanceSucceeded)
4026
+ restart.store.complete(restartContinuation.id);
4027
+ else
4028
+ restart.store.fail(restartContinuation.id, 'restart-continuation-outcome-unknown');
4029
+ }
4030
+ }
4031
+ restartRun?.dispose();
4032
+ if (acceptance !== undefined && restartCheckpoint === undefined) {
3889
4033
  try {
3890
4034
  await this.options.completeForegroundTaskAcceptance(acceptance, {
3891
4035
  status: acceptanceSucceeded ? 'succeeded' : 'unknown', quiescent: acceptanceSucceeded,