@dsh-enhanced/assistant-delivery 0.1.48 → 0.1.49

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.
package/README.md CHANGED
@@ -8,14 +8,14 @@
8
8
 
9
9
  ## 兼容性与安装顺序
10
10
 
11
- - DSH / Agent / Agent Presets / LLM / Session:`>=0.1.2-rc.1 <0.2.0`
12
- - `@deepseek-ai/dsh-attachment`:`>=0.1.2-rc.1 <0.2.0`,仅图片入站路径需要的可选 Host service
13
- - `@deepseek-ai/dsh-user-questions`:`>=0.1.2-rc.1 <0.2.0`。它定义 `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.1.2-rc.1 <0.2.0`,可选 Host command service;按 `0.1.2-rc.1` 命令语法/执行契约只委托安全的原生 `/compact`。`/help`、`/status`、`/session`、`/new`、`/clear`、`/stop`、`/feedback`、`/learning` 及模型/权限控制命令都由 Delivery 自有;其他原生命令即使被宿主发布也不委托、不进入 LLM
15
- - `@deepseek-ai/dsh-goal`:`>=0.1.2-rc.1 <0.2.0`,可选原生目标服务;启用 `agentGoalContinuationTimeoutMs` 时还须由 Host 挂载同版本 `dsh-goal-round-driver`,仅安装服务不产生自动续跑
16
- - `@deepseek-ai/dsh-permission-presets` / `@deepseek-ai/dsh-sandbox-policy` / `@deepseek-ai/dsh-user-approval`:`>=0.1.2-rc.1 <0.2.0`,权限档位命令使用 preset service,并通过 sandbox/approval 包的 canonical setter 固化执行事实;所需 Host service 缺失时命令 fail closed
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
17
17
  - Cordis:`^4.0.1`
18
- - `@dsh-enhanced/assistant-policy`:`>=0.1.0 <0.2.0`,硬依赖
18
+ - `@dsh-enhanced/assistant-policy`:`>=0.1.43 <0.2.0`,硬依赖
19
19
  - Preference Learning 是反向订阅 `subscribePreferenceFeedback()` 的可选下游;Delivery 不声明对它的 peer/runtime 依赖,避免消息核心与学习插件形成双向包依赖
20
20
  - 真实多轮恢复还要求 profile 已配置官方 `ctx.sessionPersistence` provider;缺失时新建空 session 可以成功,但冷 resume 会进入有界失败/死信路径。
21
21
 
@@ -31,6 +31,10 @@ dsh --profile headless --dump-config
31
31
 
32
32
  Patch 通过 `inject: [assistantPolicy]` 固定加载策略依赖;入站 Agent runtime 另外等待 `agents`、`sessions` 与 `llm` 就绪。Web profile 提供 `agentPresets` 时会解析并挂载 session preset;不带 roster 的 headless profile 保留宿主全局工具组合。`schedulerEnabled` 默认开启,因此生产环境必须由 launchd、systemd 或 Docker restart policy 监管 DSH 进程。
33
33
 
34
+ Host-only `validateOwnerAgentForRoute(agent, authorityId)` 为有限动态工具提供当前调用者证明:核对原生 Agent/Session 注册对象、当前 owner route、principal record/version、workspace 和 preset;伪造对象、旧 Session 或撤权身份拒绝。它只证明当前调用身份,不授予动作权限,也不替代最终提交时的来源与 canonical writer fence。此 API 无数据库迁移,消费者须检测同批实现。
35
+
36
+ Host-only `inspectOwnerForegroundToolCall({ agent, authorityId, callId, toolName, argumentsJson })` 另核对当前认领的具体 Inbox、尚未结束的原生 turn、pending 前台执行记录及唯一未结算的 `tool/call` 事件。工具名和实际参数须与事件一致;返回内容无关的 task/owner/binding、turn、调用事件与参数摘要,不返回任务正文或参数。同 Session、开放 turn 或 owner 身份本身不足以产生证明;Host 直接调用、PTC 子调用、旧或重复事件保持未归因。此只读接口不迁移数据库,不授予执行权限,也不证明任务成功;消费者须保留后续 canonical 反馈与独立验收边界。
37
+
34
38
  ## 配置
35
39
 
36
40
  | 字段 | 默认值 | 含义 |
@@ -134,6 +138,16 @@ ownerRoutes:
134
138
 
135
139
  `inspectOwnerModelSelection()` 在同一 owner route 校验后提供模型快照,供修复与成长继承。传入 `sourceAgent` 时读取匹配 binding 的 Session 最新原生 `request/header`,避免初始 Agent options 已过期;未传入时读取外部会话的持久模型选择或其 Delivery 默认配置。原生 Web 的模型由 DSH 管理,必须提供来源 Agent;该接口不替它猜测模型。返回值仅含 provider/model/可选 reasoning effort,不含会话内容或凭据。
136
140
 
141
+ Host-only `listOwnerForegroundTaskSources({ authorityId, principalId, workspace, agentPreset, expectedOwner, after?, limit? })` 提供普通 owner 前台任务的持久完成来源。`inspectOwnerForegroundTaskSource({ ...scope, inboxId })` 在同一 owner writer 事务中精确读取该 Inbox 的 terminal 元数据,不扫描完成 feed;pending 或不合格来源返回 `undefined`,即使普通回复 Outbox 尚未入库也可返回元数据,但不提供原文或推断业务结果。`expectedOwner` 必须包含当前 `authorityHash`、`principalRecordId`、`principalVersion`;接口逐次重验 active owner、精确 route 和最低 generation。schema v25 在原 execution 行保存 `completion_sequence`,由同一 SQLite 事务的 trigger 推进 singleton clock,兼容迁移前已打开的 writer;迁移只对已有 terminal 行确定性编号,不从旧 acceptance 推断普通任务,也不制造 quiescent。完成顺序与 Inbox admission、毫秒时间及当前投递状态无关,因此晚完成的旧任务、重启和双连接不会因输入顺序漏项。页含内容空的 `unknown` 元数据;默认 50 行,最多 100 行,按 `hasMore`/`nextCursor` 继续扫描,不合格来源也会推进扫描边界。
142
+
143
+ cursor 的 protocol、数据库 epoch、稳定 owner scopeKey 和 sequence 必须匹配,越过当前 watermark 会拒绝。`/new` 沿用历史 binding 的 revoke + 1 规则,保留原 Session/source digest 和 owner cursor;owner 撤销、ABA、authority 或 generation floor 改变会拒绝旧凭据。source digest 绑定原 execution、owner、binding、Session、admission 和 envelope hash,不绑定当前 Inbox/Outbox 状态。合法 terminal execution 与 model 不可改写;直接 SQL 修改原 identity、完成结果或序号也会拒绝。
144
+
145
+ `readOwnerForegroundTaskSource({ ...scope, inboxId, expectedSourceDigest, maxInputBytes?, maxReplyBytes? })` 从同一事务快照返回 `source`、source/content digests,以及原 Inbox 输入与 exact `inbound:<inboxId>:reply` Outbox 的文本。只接受 succeeded、quiescent、frozen-model、精确 binding/reply target 的普通回复;审批、模型/权限 picker、带内部 metadata 的回复均不可读。完成可能早于 Inbox processed、Outbox accepted,甚至早于 reply 入库;内容暂不可读时返回 `undefined`,消费者需保留自己的重试。每段默认最多 16 KiB UTF-8 字节,调用方只能收窄;前缀不切断字符,并返回 `fullTextDigest`、`returnedBytes`、`fullBytes`、`truncated`,reply 另带 `outboxId`/`intentDigest`。不返回完整 envelope、内部 metadata 或附件内容。
146
+
147
+ `withOwnerForegroundTaskSourceFence(scopeAndReadInput, callback)` 在 Delivery `BEGIN IMMEDIATE` 中重验相同来源,并保持 writer fence 到同步 callback 返回;来源缺失或改变会抛错,callback 异常、Promise 或 thenable 会拒绝并回滚 Delivery 事务。消费者可在 callback 内按 Delivery → Evaluation → Memory 的锁序获取下游 writer fence,不能跨 `await`。这些接口不注册为模型工具、不新增正文或投影账本;原文本、执行成功与投递成功都不是业务目标达成或记忆真实性的证明。
148
+
149
+ `withOwnerForegroundTaskSourcesFence({ ...scope, sources }, callback)` 对最多 1000 个不重复 `inboxId` 按输入顺序,在同一个 Delivery `BEGIN IMMEDIATE` 与当前 owner 校验下读取原 Inbox/Outbox;每项提供 `inboxId` 与 `expectedSourceDigest`。空数组仍校验 owner。来源缺失、变化或内容暂不可读时对应位置为 `undefined`,不取消其他项;输入错误和 owner/authority 变化则拒绝整批。callback 收到冻结数组,必须同步结束,异常、Promise 或 thenable 会回滚;每段正文固定最多 16 KiB,调用方不能扩限。它用于在检索/快照前同时核对多个自动学习来源,并保持 Delivery → Evaluation → Memory 锁序,避免逐条 fence 的嵌套事务。
150
+
137
151
  `enqueueBackgroundRoute()` 的 Policy resource 固定为精确的 `message/route:<authorityId>`,subject 同时带配置中的 workspace 与 canonical owner principal;部署规则不需要、也不应为这条控制路径授予 message 通配符。Policy 通过后,Delivery 会在同一个 `BEGIN IMMEDIATE` 事务内重新解析 active binding 并写 Outbox,封住授权期间 `/new` 的竞态。claim 时还会在同一写事务内重新验证 authority、source hash、完整 owner scope、generation floor 与当前 exact Policy;route 被删除、修改或撤权时不会调用 adapter,而是写入带 `owner-route-*` failure code 的 terminal Outbox 和 `outbox_attempts` 审计 receipt。
138
152
 
139
153
  显式 Policy deny 表示 T3 撤权并永久 dead;Policy 检查本身抛错(例如 SQLite busy、滚动部署中的短暂不可用)不等同撤权。claim 前发生时,消息保持 `retry_wait`、`attemptCount` 不增加并暴露 `owner-route-policy-check-failed`;claim 后、adapter I/O 前发生时,当前 not-sent attempt 进入带退避的 `retry_wait`。两者都不会调用 provider,Policy 恢复后可自动继续。锁顺序也保持单向:enqueue 的 Policy 写在进入 Delivery 事务前已经完成;claim 只有 Delivery→Policy 的同步检查,没有持有 Policy 写事务再进入 Delivery 的反向路径。运维可用 `pendingOutbox` 加该 failure code 定位持续锁冲突,而不丢失唯一告警。
@@ -164,7 +178,7 @@ ownerRoutes:
164
178
 
165
179
  ### 跨渠道 `ask_user_question`
166
180
 
167
- DSH `0.1.2-rc.1` 的 `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 的竞速认领语义。
181
+ 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 的竞速认领语义。
168
182
 
169
183
  渠道自由文本只有在明确回复对应问题消息时才会结算,并要求 account、tenant、conversation、principal、binding version/generation 与当前 owner fence 全部匹配;同一路由恰好只有一个 pending question 也不会吞掉未引用的新消息。匹配回答直接恢复原来的工具调用,不写 Inbox、不作为普通新消息排队;`/stop`、`/new`、`/clear` 仍按渠道正常命令接入规则取消旧 wait(例如群聊可能仍要求 @ 机器人),问题卡的取消按钮则不依赖文字命令。问题发往原 binding 会话,不保证是私聊:若原会话是群聊,问题正文和选项对该群可见,敏感问题应在私聊中发起或改用其他交互方式。
170
184
 
@@ -212,7 +226,7 @@ Session 续约间隔取有效 lease 的约三分之一,有效期限使用 `min
212
226
 
213
227
  渠道 command envelope 只接受从正文第一字节开始的小写 ASCII slash 语法。未知命令、当前 preset 未发布的命令,以及大写、空命令等非法 slash 形态都只返回确定性帮助/错误,绝不作为自然语言进入 LLM。普通 Agent turn 只有在 session persistence `flush()` 明确返回 `true` 后才入队最终回复;返回 `false` 或抛错时不宣称任务成功。
214
228
 
215
- Agent Loop 以 `max-tokens` 结束、正常结束却没有正文,或完整正文超过 `maxTextBytes` 时,Delivery 默认在同一 session 中发起最多两轮后台恢复:先续写缺失部分;若仍未结束,最后一次机会优先根据当前请求和其后全部已有回答片段压缩为预算内的完整答案,不会把同一长会话中更早已完成的任务混入结论。空回答会重新生成,首轮即超长的回答会直接压缩。每个片段先持久化,再开始下一轮;恢复轮沿用已经选定的 provider、model 和 effort,但 source 明确标记为 Delivery 的内部 notice。恢复轮禁止工具执行:DSH `0.1.2-rc.1` 仍可能把 scoped tool schema 序列化给 provider,但任何调用都会在审批和执行前被拒绝,并立即结束该恢复轮;工具状态也不会展示给用户,后续恢复仍受同一总轮数限制。最终只投递一次合并后的完整回复并标记完成,不需要用户发送”继续”。
229
+ Agent Loop 以 `max-tokens` 结束、正常结束却没有正文,或完整正文超过 `maxTextBytes` 时,Delivery 默认在同一 session 中发起最多两轮后台恢复:先续写缺失部分;若仍未结束,最后一次机会优先根据当前请求和其后全部已有回答片段压缩为预算内的完整答案,不会把同一长会话中更早已完成的任务混入结论。空回答会重新生成,首轮即超长的回答会直接压缩。每个片段先持久化,再开始下一轮;恢复轮沿用已经选定的 provider、model 和 effort,但 source 明确标记为 Delivery 的内部 notice。恢复轮禁止工具执行:DSH `0.2.0-rc.2` 仍可能把 scoped tool schema 序列化给 provider,但任何调用都会在审批和执行前被拒绝,并立即结束该恢复轮;工具状态也不会展示给用户,后续恢复仍受同一总轮数限制。最终只投递一次合并后的完整回复并标记完成,不需要用户发送”继续”。
216
230
  后台恢复是新的、有界模型 turn,可能产生额外模型用量,不是对同一个已提交请求的透明重试。若恢复轮失败或次数耗尽、没有新增正文,或已经持久化但无法建立安全调度边界,Delivery 才保留当前最佳正文、附加明确的未完成提示并标记失败;完全没有可用正文时发送重试提示。失败提示不再要求用户发送“继续”这类协议词。若任何片段无法确认持久化,则不投递该结果,也不宣称完成。这些失败回复不会进入 completed-turn preference projection。`agentMaxAutoContinuationTurns` 设为 `0` 时保留直接失败提示行为。
217
231
 
218
232
  `agentGoalContinuationTimeoutMs` 默认是 `0`,保持既有的前台回复后立即释放 Agent 行为。设为正值时,Delivery 先完成并入队原始前台回复,再保留同一 Session、Agent 与已固定的 GoalId,让 Host 的原生 `goal-round-driver` 在其自己的调度边界续跑;Delivery 不创建目标轮、不接管轮次,累计上限仍由 DSH 的 `maxGoalRounds` 限制。原回复只是该入站任务的结果,绝不表示业务目标已经达成。
@@ -227,7 +241,11 @@ Goals 的单次计划恢复使用单独的 Host capability。`goalWakeSettlement
227
241
 
228
242
  结果已经取得 provider message id 后,exact owner 可以直接回复该消息,沿用 `/feedback status`、`/feedback correct <version> <previous-status> <new-status>` 与 `/feedback withdraw <version> <previous-status>`。首次 `status` 已显示从 Verifier baseline 采纳的 revision 1;单词形式的初始判断只有与该 baseline 状态相同才幂等成功,任何不同判断都必须使用 `status` 返回的 version/status 做显式 `correct`,不能用裸命令覆盖。历史 Verifier receipt 此时允许超过原 freshness window,因为 owner 正在标注一份不可变的历史结果;但 Delivery、Goals 和 Evaluation 仍会重验同一个 sidecar、owner lineage、route/binding、Goal definition、assessment、run、profile、contract 与 receipt identity。原消息、当前 Goals provider 或任一身份不匹配时拒绝,不会仅凭过期 metadata 产生修订。Web `native-session` 返回值没有外部 Outbox/provider reply identity,因此当前不支持这条 whole-goal reply-feedback 路径。
229
243
 
230
- `/feedback` 的完整固定语法如下;不接受附件或额外自由文本:
244
+ 普通前台任务也支持自然反馈:同一 owner 直接回复原任务结果,说“问题解决了”“还是不行,保存报错”或“撤回刚才的任务反馈”,Host 会记录明确判断,原文仍交给 Agent 正常续答。已有判断会自动按当前版本更正,无需先查询版本。只有明确、可确定解析的表述才记录;感谢、疑问、假设、引用、附件和没有精确回复目标的文字仍按普通聊天处理。该入口不覆盖 Automation、whole-goal 或原生 Web 结果;这些结果继续使用原有入口。
245
+
246
+ 自然反馈使用 Delivery schema 24 的持久日志,绑定原始 Inbox、目标 Outbox、owner、入站顺序和一次冻结的修订参数。Evaluation 暂不可用时,普通聊天继续,日志等待后续补记;恢复只重试反馈记录,不重新运行用户的 Agent 请求。若旁路反馈日志本身未能持久化,Host 记诊断并继续普通聊天,不声称该条反馈已保存;普通派发仍须通过自身授权与持久化检查。版本冲突不自动改用新版本重试;明显早于当前反馈或无法确定顺序的相反判断不会覆盖当前结果。自然纠正原因可随精确 canonical 修订交给 Growth,最多 4096 字,作为不可信任务材料,不授予任何新权限。
247
+
248
+ `/feedback` 的完整固定语法如下;不接受附件或额外自由文本,命令本身不进入模型:
231
249
 
232
250
  ```text
233
251
  /feedback helpful|not-helpful|too-long|too-short|wrong-format|wrong-action|unwanted-reminder
@@ -291,15 +309,15 @@ Profile 还必须为当前 owner principal 添加精确授权,例如:`subjec
291
309
 
292
310
  卡片提交后,Delivery 会再次核对 active binding、精确 principal/chat、原始 provider message id 和 Policy,并用实时 `resolveModelInfo()` 验证 provider/model 及该模型支持的 effort;通过后把三项选择按 canonical conversation 持久化到 Delivery SQLite。渠道可以等待该 durable settlement:同实例由完成通知即时唤醒,共享数据库的另一实例完成时由有界轮询感知,从而把原卡更新成不可交互的最终结果。选择从下一条普通消息生效,保留当前 session 上下文,跨 `/new` 和 Host 重启仍有效。卡片可选择“默认(由模型决定)”;`/model use` 保留为无卡片渠道和排错时的文字后备,`/model reset` 删除会话覆盖并恢复 `agentProvider` / `agentModel`。模型目录按宿主约定是建议性的,最终调用是否成功仍由对应 adapter 和账号认证决定。若某个已持久化的显式 effort 在下一条普通消息前被 DSH 核心判为不支持,Delivery 会在任何 prompt 或 durable dispatch 标记之前,以 version CAS 仅清除该 effort、重新预检同一 provider/model 的默认档位;CAS 冲突会重试而不会覆盖更晚的 `/model` 选择。模型不会被静默替换,也不会重放或重复计费。
293
311
 
294
- `/permissions`(别名 `/permission`)只允许当前 active binding 的精确 owner 使用,命令本身不会进入 Agent 或触发 LLM。支持 typed `permission-picker` 的私聊渠道会显示“请求批准(ask)/帮我批准(auto)/完全访问权限(full)”三档卡片并标出当前档位;不支持卡片或渲染失败时自动退回含同等信息的文字命令。前两档都使用 `workspace-write + ask`,区别是持久 reviewer 为 `user` 或 `auto-review`。`full` 使用 `danger-full-access + never + none`,可访问网络及任意文件;卡片按钮带原生风险确认,文字入口则由 `/permission full` 显示橙色警告,必须再次发送 `/permission full confirm` 才切换。
312
+ `/permissions`(别名 `/permission`)只允许当前 active binding 的精确 owner 使用,命令本身不会进入 Agent 或触发 LLM。支持 typed `permission-picker` 的私聊渠道会显示“请求批准(ask)/帮我批准(auto)/完全访问权限(full)”三档卡片并标出当前档位;不支持卡片或渲染失败时自动退回含同等信息的文字命令。`ask` 使用 `workspace-write + ask + user`;当前 Host 的固定 `auto` 使用 `danger-full-access + ask + auto-review`,不会被强制折叠为 `workspace-write`。Session 格式 4 的旧动态 `workspace-write + ask` Auto 组合不满足 Policy 的 Auto 一致性检查,切换失败时持久回退 ask。`full` 使用 `danger-full-access + never + none`,可访问网络及任意文件;卡片按钮带原生风险确认,文字入口则由 `/permission full` 显示橙色警告,必须再次发送 `/permission full confirm` 才切换。
295
313
 
296
314
  权限卡片作为受限 Outbox intent 持久化,并用独立 HMAC 域绑定原始 route、精确 owner、binding version、session、权限状态指纹、Policy 紧急停止版本、目标档位和有效期。点击时还必须匹配原卡的 provider message id,并重新核对 active owner/binding、DM、Policy 与 session;转发、错人、跨 chat、篡改、过期、`/new` 后的旧卡,以及权限状态或紧急停止版本变化后的旧卡都会明确提示失效。最终提交在权限 mutation 前、reviewer 等待后和 session flush 后重复核对紧急停止版本,因此紧急停止开→关的 ABA 也只会触发 ask 补偿,不会完成旧卡提权。同一张卡的第一次选择进入原 binding 的 durable Inbox 串行队列;点击 Toast 只表示“已受理”,真正切换成功会另发持久回复。平台重投同一选择幂等,相反选择冲突而不会晚到覆盖;需要再次切档时应重新发送 `/permissions`。
297
315
 
298
- 原生 DSH 设置与 Web 权限面板会写 preset、sandbox 和 approval。生产表的 `workspace-write` / `auto` / `danger-full-access` 已由 AssistantPolicy 直接解释为 `user` / `auto-review` / `none`,所以 Web 与 Delivery 可互相切档且后写者获胜,不再为 canonical 三档补 custom reviewer。只有单 workspace preset、动态 id 和旧 session 继续使用兼容 reviewer event;非 canonical legacy full 仍经过严格迁移与 flush barrier。
316
+ 原生 DSH 设置与 Web 权限面板会写 preset、sandbox 和 approval。生产表的 `workspace-write` / `auto` / `danger-full-access` 已由 AssistantPolicy 直接解释为 `user` / `auto-review` / `none`,所以 Web 与 Delivery 可互相切档且后写者获胜,不再为 canonical 三档补 custom reviewer。旧 session 的兼容 reviewer event 仍可读,但不会把 Session 格式 4 的动态 workspace Auto 当作有效授权;非 canonical legacy full 仍经过严格迁移与 flush barrier。
299
317
 
300
318
  旧版本中,这个缺口会产生一个很迷惑的症状:session 看似已经是 native full,但 reviewer 缺失会保守折叠成 `user`,AssistantPolicy 因而把未知/敏感工具送去 `ask-review`;同一 session 的 `approval=never` 又会在渠道审批展示前直接拒绝,上游最终误写成 `"the user rejected tool"`,所以用户既没看到弹窗也没有机会批准。迁移后精确 full 会持久补齐 `reviewer=none`;同时进度适配器会把嵌套 `tool-result.isError=true` 显示为工具失败,而不是继续显示“已完成”。
301
319
 
302
- 档位从 `ctx.permissionPresets.resolve()` 动态匹配:一个 `workspace-write + ask` 候选兼容旧版共享 ask/auto,两个候选按声明顺序映射 ask/auto,更多候选或多个 full 候选会失败关闭;full 候选必须唯一。目标表指纹也进入权限卡状态哈希,防止卡片发出后配置漂移。命令会显式固化 sandbox/approval;canonical 三档写官方 preset,动态/共享目标只在必要时写兼容 reviewer。mutation、flush、controller 或回复失败后会收敛并持久化到 ask;只有确认 ask 已 durable 且终态回复已经进入同一 Outbox,Inbox 才能结束,不会用“持久化结果不确定”冒充终态。
320
+ 档位从 `ctx.permissionPresets.resolve()` 动态匹配:一个或两个 `workspace-write + ask` 候选仍可识别旧版共享或分离的目标,但在 Session 格式 4 上,旧动态 Auto 不会通过 Policy 一致性检查;当前 Host 的固定 `auto` 则以 `danger-full-access + ask` 独立识别。更多同类候选或多个 full 候选会失败关闭;full 候选必须唯一。目标表指纹也进入权限卡状态哈希,防止卡片发出后配置漂移。命令会显式固化 sandbox/approval;canonical 三档写官方 preset,动态/共享目标只在必要时写兼容 reviewer。mutation、flush、controller 或回复失败后会收敛并持久化到 ask;只有确认 ask 已 durable 且终态回复已经进入同一 Outbox,Inbox 才能结束,不会用“持久化结果不确定”冒充终态。
303
321
 
304
322
  权限命令在第一次 reviewer/policy/sandbox mutation 前还必须先取得 Inbox 的 durable dispatch/recovery marker;每个异步边界后都复核 abort 与租约。若进程退出、续租失败、flush 未确认、依赖尚未就绪或回复入队失败,该 marker 会绕过普通 `maxAttempts`,在原 binding 串行 lane 中继续恢复,直到确认已持久化目标并补发成功终态,或安全收敛到 ask 后补发失败/取消终态。`/stop` 和 `/new` 会在 abort 前把正在执行的权限命令原子改标为 cancelled recovery;旧命令不会以 `processor-ambiguous` 终止,也不会从原始文本重新制造一次可能已取消的 full 提权。
305
323
 
@@ -328,9 +346,9 @@ Automation incident 使用 `automation-incident:<incidentId>:g<generation>` 同
328
346
 
329
347
  `enqueueApproval()` 只接受固定的 operation/proposal/version/expiry/title/diffHash 字段,并重新核对 active owner、精确 workspace/principal、Policy pending snapshot、展示标题和正文 SHA-256,调用方不能替换审批卡片展示内容。渠道签名后的点击仍必须回到 `settleApproval()`;它从 Outbox 取回持久 operation tuple,并再次核对 active owner binding、principal/chat、proposal version/expiry/diffHash 与 Policy pending snapshot,重复点击只会得到同一持久化结果。若 Policy 已提交而 Delivery 在写回结果前退出,只有此前已经落盘的同一 settlement 且当前 Policy 为精确同一终态时才能通过 `recoverApprovalSettlement()` 补全;该恢复路径不会新建 settlement,也不会决定 pending/expired proposal。
330
348
 
331
- 即时工具审批通过 Policy 的 Host-only 人工渠道注册口接入原生 Approval,先完成自动审核,再认领当前渠道,最后才委派原生 Web Remote;不再使用会被更早的 Web listener 饿死的平级监听器。Delivery 与 Policy 须成套升级,旧 Policy 缺少 `registerHumanApprovalAnswerer` 时明确报升级错误,不能把用户会话切成 full 来规避。
349
+ 即时工具审批通过 Policy 的 Host-only 人工渠道注册口接入原生 Approval,先完成自动审核,再认领当前渠道,最后才委派原生 Web Remote;不再使用会被更早的 Web listener 饿死的平级监听器。Delivery 与 Policy 须成套升级,人工升级状态通过当前注入的 Policy 服务查询,不依赖另一份包导入的模块私有状态;同版本包被不同路径加载时也不能误走 Web。旧 Policy 缺少 `registerHumanApprovalAnswerer` 或 `isAutoReviewEscalation` 时明确报升级错误,不能把用户会话切成 full 来规避。
332
350
 
333
- 即时工具审批是另一条刻意不持久化的 open-turn 路径:effective reviewer 为 `user` 时由 Delivery 交给 owner;默认 `auto-review` 下,Policy 已判定为普通的前台 Bash 与只读网络不出卡,只有本地明确敏感、原生 sandbox escalation,或未知插件工具经 reviewer 升级的 exact request 才进入人工。`never`/`none` 不创建渠道提示。只有已绑定的 Web owner 才能使用 notice-only adapter 委派原生审批;Delivery 继续 approval waterfall,由 DSH 原生 Web 控件展示批准/拒绝并恢复当前调用;不会以 `unavailable` 吞掉交互。Lark 私聊直接发送签名 CardKit 2.0 审批卡,只有 provider 接受后的交互面才算成功;Delivery 不再提前发送“请查看卡片”的误导文字。卡片 `format_error` 可由 Lark adapter 降级为同一私聊的明确文字审批,并且只在恰好一个匹配 pending request 时接受 owner 的精确“允许/允许一次/拒绝”回复;其他发送失败保持 `unavailable`。Lark 群聊/话题触发的高影响调用不会在群内暴露 raw arguments:Delivery 仅在同一 channel/account/tenant、同一 owner principal、workspace/preset/policyRef 下恰好存在一个 active DM binding 时,把审批卡转投该私聊;执行仍绑定原群 session,批准回传后同时复核来源与展示 binding。DM 缺失或不唯一时失败关闭,不猜收件人。Delivery 同时识别当前未结束 turn 内唯一且未结算的顶层 `tool/call`,以及带 exact root/parent/sub-call identity 的 Code Mode `tool/code-dispatch-start`;已经出现 `tool/result` 或 `tool/code-dispatch` 的调用一律拒绝。raw arguments 必须完整且不超过 16 KiB,reason 必须完整且不超过 2 KiB,均不截断。reason 只是未经信任的展示说明、绝不是可执行指令,但仍作为用户看到的 exact 内容纳入授权 hash。
351
+ 即时工具审批是另一条刻意不持久化的 open-turn 路径:effective reviewer 为 `user` 时由 Delivery 交给 owner;默认 `auto-review` 下,Policy 已判定为普通的前台 Bash 与只读网络不出卡,只有本地明确敏感、原生 sandbox escalation,或未知插件工具经 reviewer 升级的 exact request 才进入人工。`never`/`none` 不创建渠道提示。只有已绑定的 Web owner 才能使用 notice-only adapter 委派原生审批;Delivery 继续 approval waterfall,由 DSH 原生 Web 控件展示批准/拒绝并恢复当前调用;不会以 `unavailable` 吞掉交互。Lark 私聊直接发送签名 CardKit 2.0 审批卡,卡片明确显示任务暂停;当前调用等待 owner 点击“允许一次”或“拒绝”,等待期间不执行工具,只有 provider 接受后的交互面才算成功;Delivery 不再提前发送“请查看卡片”的误导文字。卡片 `format_error` 可由 Lark adapter 降级为同一私聊的明确文字审批,并且只在恰好一个匹配 pending request 时接受 owner 的精确“允许/允许一次/拒绝”回复;其他发送失败保持 `unavailable`。Lark 群聊/话题触发的高影响调用不会在群内暴露 raw arguments:Delivery 仅在同一 channel/account/tenant、同一 owner principal、workspace/preset/policyRef 下恰好存在一个 active DM binding 时,把审批卡转投该私聊;执行仍绑定原群 session,批准回传后同时复核来源与展示 binding。DM 缺失或不唯一时失败关闭,不猜收件人。Delivery 同时识别当前未结束 turn 内唯一且未结算的顶层 `tool/call`,以及带 exact root/parent/sub-call identity 的 Code Mode `tool/ptc-dispatch-start`;已经出现 `tool/result` 或 `tool/ptc-dispatch` 的调用一律拒绝。raw arguments 必须完整且不超过 16 KiB,reason 必须完整且不超过 2 KiB,均不截断。reason 只是未经信任的展示说明、绝不是可执行指令,但仍作为用户看到的 exact 内容纳入授权 hash。
334
352
 
335
353
  展示前持久化准备受 `toolApprovalPreparationTimeoutMs` 的独立短期限约束(默认 10 秒),不会耗完用户点击卡片的整个等待窗口。超时后即使旧 flush 晚到也不能派发卡片。`ctx.sessions.flush(session)` 必须返回 `true`,即至少一个持久化 listener 已成功把包含 `approval/asked` 与 exact tool/call 的事实落盘;返回 `false` 或抛错都会 `unavailable`。每次请求使用不可猜的随机 operation nonce,并以 SHA-256 `actionHash` 绑定 exact binding revision/route、owner、session incarnation、当前 turn、顶层或 Code Mode 调用身份与 raw arguments、exact reason、当前 provider/model/effort、人工 review route/escalation 与 permission/reviewer/policy 事件。flush 后、adapter 返回后都会重新核对 binding/principal/agent/delegated token/adapter 与 actionHash;撤权、解绑、route、escalation 或权限漂移都不能返回 grant。owner 返回允许后还会以不重复消耗预算的只读方式复核 Policy emergency stop;卡片等待期间打开紧急停止会把 grant 收紧为拒绝。
336
354
 
@@ -356,7 +374,7 @@ Automation incident 使用 `automation-incident:<incidentId>:g<generation>` 同
356
374
  - `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。
357
375
  - Agent dispatch 前写 `dispatch-started` marker。此后进程崩溃会进入 `dispatch-ambiguous` dead letter,避免自动产生第二个 turn;这会牺牲一次自动重放,需要 owner 审阅后显式 retry。
358
376
  - `/permission` 是受限例外:它使用专用 commit/cancel/failure recovery marker,并以精确 Inbox id(兼容旧 event id)与 `replyToEventId` 共同证明终态 Outbox;崩溃恢复不会把普通 background Outbox 或同名伪造 key 当成完成见证。
359
- - 当前 DSH `0.1.2-rc.1` 的 `followup()` 没有跨进程 `sourceEventId` 唯一接纳/完成 handle,因此本包诚实承诺“持久 event 去重 + at-most-once 自动 Agent dispatch”,不声称端到端 exactly-once。若宿主未来提供该 seam,可升级为安全的 at-least-once wake。
377
+ - 当前 DSH `0.2.0-rc.2` 的 `followup()` 没有跨进程 `sourceEventId` 唯一接纳/完成 handle,因此本包诚实承诺“持久 event 去重 + at-most-once 自动 Agent dispatch”,不声称端到端 exactly-once。若宿主未来提供该 seam,可升级为安全的 at-least-once wake。
360
378
  - Outbox adapter 抛异常一律视为可能已发送;不会按照普通 5xx 重试。
361
379
 
362
380
  ## Goals 单次唤醒边界
@@ -397,7 +415,7 @@ pnpm --dir plugins/assistant-delivery pack --dry-run
397
415
 
398
416
  旧 foreground receipt 未保存 principal version:仅当前仍为同一 record 的初始 v1 身份可修订;身份已更新时保守拒绝继承旧判断修订权。新记录完整保存 record+version。
399
417
 
400
- Host 可用 `inspectOwnerForegroundLearningTask()` 将 Evaluation 增量结果绑定到精确 owner。它核对当前 route、原始 Inbox/binding、Host 执行回执和 principal record/version,再区分独立 Verifier 与 owner 的纠正/撤回;只有核对成功才返回来源 Session、最多 4096 字符的原任务正文及 canonical receipt。来源带 `modelSelectionState`:`frozen` 才返回实际原生 `request/header` 已物化的 provider/model/可选 reasoning effort;`missing` 表示历史执行未采到调用快照,`inconsistent` 表示同一前台执行出现不同实际路由。后两者不猜测当前会话或部署默认模型。schema v23 为内置 Delivery 运行时的普通 owner 对话增加独立执行回执:无需预设验收 profile,回复具体消息的 `/feedback not-achieved`、更正或撤回也能进入 canonical 前台结果。记录只证明任务归属、实际模型和执行已停止,不能证明目标达成;没有验收契约时只接受已认证的 typed owner 反馈。这类新任务的目标结果反馈要求 Evaluation 可用,先提交 canonical 修订再更新本地 workflow;服务缺失时明确返回不可用,不确认仅有本地记录的成功。偏好反馈和没有执行回执的历史 workflow 路径保持原行为。旧 acceptance 回执继续兼容,旧普通任务不回填,终态执行不能事后补写路由。此入口覆盖内置外部渠道运行时;原生 Web 和自定义运行时不能据此推断已接通。`/new` 前的同 owner 任务可被识别,主体身份变更不能继承旧任务权限。该接口仅供发现前台学习来源,尚不自动调度修复,也不授予执行或采用权限;消费者写入前仍须使用 Evaluation 的 canonical writer fence。
418
+ Host 可用 `inspectOwnerForegroundLearningTask()` 将 Evaluation 增量结果绑定到精确 owner。它核对当前 route、原始 Inbox/binding、Host 执行回执和 principal record/version,再区分独立 Verifier 与 owner 的纠正/撤回;只有核对成功才返回来源 Session、最多 4096 字符的原任务正文及 canonical receipt;当前 owner revision 的操作身份能与自然反馈日志核对时,另返回最多 4096 字符的 `feedback.text`、来源 Inbox 与截断标志。普通 owner 反馈对应的原 Outbox 内容可读且与 canonical 引用一致时,`source.reply` 还返回最多 4096 UTF-8 字节的原答复可见文本、截断/过滤标志、完整原文摘要及 Outbox/intent 绑定。它先在现有 reader 的 16 KiB 硬上限内读取完整原答复,再用进度展示的常见凭据形态过滤;超过 16 KiB 时仅返回固定占位文本,不暴露部分前缀。`redacted` 表示文本经过滤发生变化或被占位替换,不能保证识别任意秘密;历史内容不可读时省略该字段。这里的答复是原 Agent 回复,不是 tool stdout,也不是事实 oracle 或授权。来源带 `modelSelectionState`:`frozen` 才返回实际原生 `request/header` 已物化的 provider/model/可选 reasoning effort;`missing` 表示历史执行未采到调用快照,`inconsistent` 表示同一前台执行出现不同实际路由。后两者不猜测当前会话或部署默认模型。schema v23 为内置 Delivery 运行时的普通 owner 对话增加独立执行回执:无需预设验收 profile,回复具体消息的 `/feedback not-achieved`、更正或撤回也能进入 canonical 前台结果;schema v24 另支持上述明确自然回复。记录只证明任务归属、实际模型和执行已停止,不能证明目标达成;没有验收契约时只接受已认证 owner 的明确反馈,不能取模型自评。这类新任务的目标结果反馈要求 Evaluation 可用,先提交 canonical 修订再更新本地 workflow;服务缺失时明确返回不可用,不确认仅有本地记录的成功。偏好反馈和没有执行回执的历史 workflow 路径保持原行为。旧 acceptance 回执继续兼容,旧普通任务不回填,终态执行不能事后补写路由。此入口覆盖内置外部渠道运行时;原生 Web 和自定义运行时不能据此推断已接通。`/new` 前的同 owner 任务可被识别,主体身份变更不能继承旧任务权限。该接口仅供发现前台学习来源,尚不自动调度修复,也不授予执行或采用权限;消费者写入前仍须使用 Evaluation 的 canonical writer fence。
401
419
 
402
420
 
403
421
  ## 原生 Web owner 接入
@@ -408,7 +426,7 @@ Host 可用 `inspectOwnerForegroundLearningTask()` 将 Evaluation 增量结果
408
426
 
409
427
  原生 Goal 仍为 `active` 且 `armed` 时,空闲回收保留同一个 Agent 和 Session lease,允许宿主唯一 GoalRoundDriver 在会话保存完成后调度下一轮。目标终态或 disarm 后恢复普通空闲回收;owner 撤权、租约失效、scope 卸载和原有 `maxExecutionMs` 期限仍优先结束执行,不为每轮重置期限。若宿主缺少 GoalRoundDriver,armed 目标最多保持到该期限;此保留检查本身不派发任务。
410
428
 
411
- 当前 Web 只支持单已认证控制面的文本交互;图片、完整 queue/steer、跨渠道 owner 别名和子 Agent 历史仍未验收。原生 Web 安装及浏览器验证范围见 [RSI 当前状态](../../docs/rsi-status.md),配置、Policy 与权限见 [Web owner 包说明](../assistant-web-owner/README.md)。
429
+ 当前 Web 只支持单已认证控制面的文本交互;图片、完整 queue/steer、跨渠道 owner 别名和子 Agent 历史仍未验收。原生 Web 安装、配置、Policy 与权限见 [Web owner 包说明](../assistant-web-owner/README.md),浏览器探针及证据边界见 [E2E 指南](../../scripts/e2e/README.md)。
412
430
 
413
431
  可选 Host 接口 `registerForegroundTaskObserver()` 只接受当前 Control Plane 拥有的注册,在认证 Inbox 的执行绑定后同步通知开始,资源释放并保存真实执行回执后通知结束。它不改变 schema 23 或学习来源摘要,不注册模型工具;注销、owner/服务换代及重启后不补发历史事件,观察错误不影响正常聊天。部署版本与 readiness 核对由 [Control Plane](../plugin-control-plane) 持有;这些事件本身不证明任务质量或具体工具调用。
414
432
 
@@ -1,6 +1,15 @@
1
+ declare module '@deepseek-ai/dsh-llm' {
2
+ interface MessageSourceMap {
3
+ 'assistant-delivery': {
4
+ kind: 'assistant-delivery';
5
+ form?: 'notice';
6
+ summary?: string;
7
+ };
8
+ }
9
+ }
1
10
  import type { Context } from '@deepseek-ai/cordis';
2
11
  import { type Agent } from '@deepseek-ai/dsh-agent';
3
- import type { AgentPresets } from '@deepseek-ai/dsh-agent-presets';
12
+ import type { AgentPresetRegistry as AgentPresets } from '@deepseek-ai/dsh-agent-preset-registry';
4
13
  import { type SessionEvent } from '@deepseek-ai/dsh-session';
5
14
  import { type AssistantPolicyService } from '@dsh-enhanced/assistant-policy';
6
15
  import type { InboundPrepareContext, InboundPrepareResult, InboundProcessResult, MarkInboundDispatching, PreparedInboundMessage } from './coordinator.js';
@@ -82,6 +91,7 @@ interface DshDeliveryRuntimeOptions {
82
91
  dispatchPreferenceFeedback(events: readonly Readonly<DeliveryPreferenceEvent>[]): Promise<'recorded' | 'unavailable' | 'unknown'>;
83
92
  replyCompletedPreferenceTurn(agent: Agent, binding: Readonly<ConversationBinding>, envelope: Readonly<InboundEnvelope>, input: ModelCommandReply): 'recorded' | 'unavailable' | 'unknown' | Promise<'recorded' | 'unavailable' | 'unknown'>;
84
93
  dispatchObjectiveFeedback(binding: Readonly<ConversationBinding>, envelope: Readonly<InboundEnvelope>, objectiveStatus: ObjectiveCommand | import('./feedback-command.js').ObjectiveFeedbackStatus): Promise<ObjectiveCommandResult>;
94
+ dispatchNaturalObjectiveFeedback(binding: Readonly<ConversationBinding>, envelope: Readonly<InboundEnvelope>): Promise<void>;
85
95
  dispatchWorkflowCommand(binding: Readonly<ConversationBinding>, envelope: Readonly<InboundEnvelope>, command: Extract<WorkflowCommand, {
86
96
  kind: 'retract' | 'save';
87
97
  }>): Promise<'conflict' | 'invalid-target' | 'recorded' | 'unavailable' | 'unknown'>;
@@ -110,6 +120,12 @@ interface ModelCommandReply {
110
120
  permissionPicker?: PermissionPickerIntent;
111
121
  fallbackText?: string;
112
122
  }
123
+ /** Bounded, common-credential-shape filtering for an owner learning reply. */
124
+ export declare function redactOwnerLearningReply(value: string, maxBytes: number): Readonly<{
125
+ text: string;
126
+ truncated: boolean;
127
+ redacted: boolean;
128
+ }>;
113
129
  /**
114
130
  * Convert one durable session fact into a bounded, user-visible progress update.
115
131
  * Reasoning/thinking content and provider error messages never cross this boundary. Tool calls/results
@@ -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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"}
@@ -275,6 +275,16 @@ function redactProgressResultText(value) {
275
275
  }
276
276
  return redactProgressText(value);
277
277
  }
278
+ /** Bounded, common-credential-shape filtering for an owner learning reply. */
279
+ export function redactOwnerLearningReply(value, maxBytes) {
280
+ const filtered = redactProgressResultText(value);
281
+ const bytes = Buffer.from(filtered, 'utf8');
282
+ let end = Math.min(bytes.length, maxBytes);
283
+ while (end > 0 && end < bytes.length && (bytes[end] & 0xc0) === 0x80)
284
+ end--;
285
+ return Object.freeze({ text: bytes.subarray(0, end).toString('utf8'), truncated: end < bytes.length,
286
+ redacted: filtered !== value });
287
+ }
278
288
  function progressResultPreview(content, depth = 0) {
279
289
  if (depth > 4)
280
290
  return TRUNCATED_PROGRESS_VALUE;
@@ -303,9 +313,6 @@ function progressResultPreview(content, depth = 0) {
303
313
  else if (block.type === 'tool-call') {
304
314
  append(`${block.name}\n${progressArgumentsPreview(block.arguments)}`);
305
315
  }
306
- else if (block.type === 'tool-result') {
307
- append(progressResultPreview(block.content, depth + 1));
308
- }
309
316
  }
310
317
  return boundedProgressToolPreview(redactProgressText(parts.join('\n')));
311
318
  }
@@ -363,20 +370,16 @@ export function deliveryProgressFromSessionEvent(event) {
363
370
  // old tool result look like a tool invocation from the active turn.
364
371
  if (!isAppendSurfaceEvent(event))
365
372
  return undefined;
366
- const block = event.data.message.content.find(value => value.type === 'tool-result');
367
- const callId = block?.type === 'tool-result'
368
- ? block.toolCallId
369
- : event.data.message.source?.callId;
373
+ const result = event.data.message;
374
+ const callId = result.toolCallId;
370
375
  if (callId === undefined)
371
376
  return undefined;
372
- const resultPreview = block?.type === 'tool-result'
373
- ? progressResultPreview(block.content)
374
- : '';
377
+ const resultPreview = progressResultPreview(result.content);
375
378
  const code = event.data.error?.code;
376
379
  return {
377
380
  kind: 'tool-finished',
378
381
  callId: String(callId),
379
- failed: event.data.error !== undefined || (block?.type === 'tool-result' && block.isError === true),
382
+ failed: event.data.error !== undefined || result.isError === true,
380
383
  ...(resultPreview === '' ? {} : { resultPreview }),
381
384
  ...(code === undefined ? {} : { code: boundedProgressText(code) }),
382
385
  };
@@ -451,6 +454,7 @@ function permissionPickerGuard(envelope) {
451
454
  function permissionPresetTargets(service) {
452
455
  const workspace = [];
453
456
  const full = [];
457
+ const nativeAuto = [];
454
458
  const table = [];
455
459
  for (const name of service.names) {
456
460
  const spec = service.resolve(name);
@@ -459,12 +463,14 @@ function permissionPresetTargets(service) {
459
463
  workspace.push(name);
460
464
  if (spec.sandbox === 'danger-full-access' && spec.approval === 'never')
461
465
  full.push(name);
466
+ if (name === 'auto' && spec.sandbox === 'danger-full-access' && spec.approval === 'ask')
467
+ nativeAuto.push(name);
462
468
  }
463
- if (workspace.length > 2 || full.length > 1) {
469
+ if (workspace.length > 2 || full.length > 1 || nativeAuto.length > 1) {
464
470
  throw new Error('ambiguous permission preset table');
465
471
  }
466
472
  const ask = workspace[0];
467
- const auto = workspace[1] ?? ask;
473
+ const auto = nativeAuto[0] ?? workspace[1] ?? ask;
468
474
  return {
469
475
  ...(ask === undefined ? {} : { ask, auto: auto }),
470
476
  ...(full[0] === undefined ? {} : { full: full[0] }),
@@ -500,22 +506,26 @@ async function appendApprovalReviewer(session, reviewer) {
500
506
  function currentPermissionLevel(service, targets, session) {
501
507
  const events = session.snapshotEvents();
502
508
  const current = service.current(session);
509
+ const reviewer = approvalReviewerOf(events, session.header.version);
503
510
  if (current === targets.full) {
504
511
  return explicitSandboxMode(events) === 'danger-full-access'
505
512
  && explicitApprovalPolicy(events) === 'never'
506
- && approvalReviewerOf(events) === 'none'
513
+ && reviewer === 'none'
507
514
  ? 'full'
508
515
  : 'custom';
509
516
  }
510
- if (explicitSandboxMode(events) !== 'workspace-write' || explicitApprovalPolicy(events) !== 'ask')
517
+ if (explicitApprovalPolicy(events) !== 'ask')
518
+ return 'custom';
519
+ if (current === targets.auto && targets.auto !== targets.ask) {
520
+ return explicitSandboxMode(events) === service.resolve(targets.auto).sandbox
521
+ && reviewer === 'auto-review' ? 'auto' : 'custom';
522
+ }
523
+ if (explicitSandboxMode(events) !== service.resolve(targets.ask).sandbox)
511
524
  return 'custom';
512
- const reviewer = approvalReviewerOf(events);
513
525
  if (targets.ask === targets.auto && current === targets.ask)
514
526
  return reviewer === 'auto-review' ? 'auto' : 'ask';
515
527
  if (current === targets.ask)
516
528
  return reviewer === 'user' ? 'ask' : 'custom';
517
- if (current === targets.auto)
518
- return reviewer === 'auto-review' ? 'auto' : 'custom';
519
529
  return 'custom';
520
530
  }
521
531
  function canonicalPresetReviewer(name) {
@@ -528,7 +538,7 @@ function canonicalPresetReviewer(name) {
528
538
  return undefined;
529
539
  }
530
540
  async function ensurePermissionReviewer(session, preset, reviewer) {
531
- if (approvalReviewerOf(session.snapshotEvents()) === reviewer)
541
+ if (approvalReviewerOf(session.snapshotEvents(), session.header.version) === reviewer)
532
542
  return;
533
543
  if (canonicalPresetReviewer(preset) === reviewer) {
534
544
  // PermissionPresetService deliberately makes a net-zero selection a no-op.
@@ -1014,10 +1024,7 @@ function finalAssistant(events, from, expectedTurn) {
1014
1024
  }
1015
1025
  }
1016
1026
  if (event.type === 'tool/result' && event.data.turn === expectedTurn) {
1017
- const block = event.data.message.content.find(value => value.type === 'tool-result');
1018
- const callId = block?.type === 'tool-result'
1019
- ? block.toolCallId
1020
- : event.data.message.source?.callId;
1027
+ const callId = event.data.message.toolCallId;
1021
1028
  if (callId !== undefined)
1022
1029
  unpairedToolCalls.delete(String(callId));
1023
1030
  }
@@ -1049,7 +1056,7 @@ function finalAssistant(events, from, expectedTurn) {
1049
1056
  };
1050
1057
  }
1051
1058
  function isScheduledGoalRuntimeContext(source) {
1052
- return (source.kind === 'plugin' && source.plugin === '@deepseek-ai/dsh-system-prompt' && source.form === 'snapshot')
1059
+ return source.kind === 'runtime-context'
1053
1060
  || (source.kind === 'skill-catalog' && source.form === 'catalog');
1054
1061
  }
1055
1062
  /**
@@ -1325,7 +1332,7 @@ export class DshDeliveryRuntime {
1325
1332
  // has retired. `whenIdle()` is deliberately avoided here because it
1326
1333
  // can follow a later wakeup forever; the current Agent state and inbox
1327
1334
  // are the bounded observation needed before declaring quiescence.
1328
- if (agent.status !== 'idle' || agent.inbox.hasPending)
1335
+ if (agent.status !== 'idle' || (agent.inbox.nextTurn.length > 0 || agent.inbox.nextStep.length > 0))
1329
1336
  return;
1330
1337
  const current = disposition();
1331
1338
  if (current === 'settled')
@@ -1706,7 +1713,7 @@ export class DshDeliveryRuntime {
1706
1713
  liftRestriction = agent.ctx.tools.restrict({ allow: [] });
1707
1714
  liftGuard = agent.ctx.tools.guard(() => AUTOMATIC_COMPLETION_TOOL_DENIAL);
1708
1715
  signal.throwIfAborted();
1709
- if (agent.status !== 'idle' || agent.inbox.hasPending) {
1716
+ if (agent.status !== 'idle' || (agent.inbox.nextTurn.length > 0 || agent.inbox.nextStep.length > 0)) {
1710
1717
  throw new AutomaticCompletionUnavailableError('assistant-delivery: automatic completion lost the idle scheduling boundary');
1711
1718
  }
1712
1719
  const latestBoundary = agent.session.snapshotEvents().findLast(event => event.type === 'turn/start' || event.type === 'turn/end');
@@ -1738,7 +1745,7 @@ export class DshDeliveryRuntime {
1738
1745
  }
1739
1746
  }
1740
1747
  async setupAgent(agentCtx, preparedAgent, workspace, presetId, principal, selected, agentPresets, initiator = 'external') {
1741
- const agent = preparedAgent ?? agentCtx.agent;
1748
+ const agent = preparedAgent;
1742
1749
  if (agent === undefined)
1743
1750
  throw new Error('assistant-delivery: unpublished Agent identity is missing');
1744
1751
  if (agent.session.header.cwd !== workspace || agent.session.header.agentPreset !== presetId) {
@@ -2177,9 +2184,8 @@ export class DshDeliveryRuntime {
2177
2184
  permissionPresets.set(session, target);
2178
2185
  // Legacy/seeded sessions may have no explicit knob events even when
2179
2186
  // their effective defaults match this preset. Materialize both facts
2180
- // before enabling either reviewer so auto is a coherent, replayable
2181
- // ask + workspace-write state rather than an inference from defaults.
2182
- ensureSandboxMode(session, 'workspace-write');
2187
+ // before enabling either reviewer so Auto uses the Host's fixed bundle.
2188
+ ensureSandboxMode(session, permissionPresets.resolve(target).sandbox);
2183
2189
  ensureApprovalPolicy(session, 'ask');
2184
2190
  const reviewer = action.level === 'auto' ? 'auto-review' : 'user';
2185
2191
  await ensurePermissionReviewer(session, target, reviewer);
@@ -2305,7 +2311,7 @@ export class DshDeliveryRuntime {
2305
2311
  const persistence = this.ctx.get('sessionPersistence');
2306
2312
  const persisted = persistence === undefined
2307
2313
  ? false
2308
- : (await persistence.list(lease.signal)).some(header => String(header.id) === String(id));
2314
+ : (await persistence.list({ signal: lease.signal })).some(snapshot => String(snapshot.header.id) === String(id));
2309
2315
  if (persisted) {
2310
2316
  handle = await this.resumeAgent({
2311
2317
  resumeSessionId: id,
@@ -2404,7 +2410,7 @@ export class DshDeliveryRuntime {
2404
2410
  setup: async (agentCtx, preparedAgent) => {
2405
2411
  // Restored inbox entries may wake immediately on Session publication.
2406
2412
  // Install the background-only gate before that publication boundary.
2407
- const agent = preparedAgent ?? agentCtx.agent;
2413
+ const agent = preparedAgent;
2408
2414
  if (agent === undefined)
2409
2415
  throw new Error('assistant-delivery: wake Agent missing');
2410
2416
  releaseFences = this.installScheduledGoalFences(agent, input);
@@ -2412,7 +2418,7 @@ export class DshDeliveryRuntime {
2412
2418
  const llm = this.ctx.get('llm');
2413
2419
  if (llm === undefined)
2414
2420
  throw new Error('assistant-delivery: llm service is required');
2415
- requireAdapterToolCallProtocol(llm, selected.provider, selected.model, presetId, agentCtx.tools.schemas(preparedAgent ?? agentCtx.agent).length);
2421
+ requireAdapterToolCallProtocol(llm, selected.provider, selected.model, presetId, agentCtx.tools.schemas(preparedAgent).length);
2416
2422
  },
2417
2423
  });
2418
2424
  const agent = handle.agent;
@@ -2426,7 +2432,7 @@ export class DshDeliveryRuntime {
2426
2432
  || current.activation !== 'disarmed' || current.roundsStarted >= current.maxGoalRounds) {
2427
2433
  return denied();
2428
2434
  }
2429
- if (agent.status !== 'idle' || agent.inbox.hasPending) {
2435
+ if (agent.status !== 'idle' || (agent.inbox.nextTurn.length > 0 || agent.inbox.nextStep.length > 0)) {
2430
2436
  return denied();
2431
2437
  }
2432
2438
  this.assertScheduledGoal(input, agent, 'before-resume');
@@ -2693,7 +2699,7 @@ export class DshDeliveryRuntime {
2693
2699
  input.assertCurrent(agent, 'running');
2694
2700
  return;
2695
2701
  }
2696
- if (agent.status !== 'idle' || agent.inbox.hasPending)
2702
+ if (agent.status !== 'idle' || (agent.inbox.nextTurn.length > 0 || agent.inbox.nextStep.length > 0))
2697
2703
  return;
2698
2704
  input.assertCurrent(agent, 'terminal');
2699
2705
  // Native idle/round-limit can precede the asynchronous step and
@@ -2705,7 +2711,7 @@ export class DshDeliveryRuntime {
2705
2711
  return;
2706
2712
  signal.throwIfAborted();
2707
2713
  this.assertScheduledGoal(input, agent, 'terminal');
2708
- if (agent.status !== 'idle' || agent.inbox.hasPending)
2714
+ if (agent.status !== 'idle' || (agent.inbox.nextTurn.length > 0 || agent.inbox.nextStep.length > 0))
2709
2715
  throw new Error('assistant-delivery: goal changed during terminal settlement');
2710
2716
  finish(true);
2711
2717
  }).catch(() => {
@@ -3460,6 +3466,14 @@ export class DshDeliveryRuntime {
3460
3466
  if (markDispatching === undefined) {
3461
3467
  return { outcome: 'not-processed', failureCode: 'dispatch-gate-unavailable', retryable: true };
3462
3468
  }
3469
+ // Persist owner feedback before model/session preparation, which may be
3470
+ // unavailable independently. The ordinary Inbox still proceeds to Agent.
3471
+ try {
3472
+ await this.options.dispatchNaturalObjectiveFeedback(binding, envelope);
3473
+ }
3474
+ catch {
3475
+ this.ctx.logger.warn('assistant-delivery: natural objective intent could not be prepared; continuing ordinary Agent turn');
3476
+ }
3463
3477
  const agents = this.ctx.get('agents');
3464
3478
  const sessions = this.ctx.get('sessions');
3465
3479
  if (agents === undefined || sessions === undefined) {
@@ -3513,7 +3527,7 @@ export class DshDeliveryRuntime {
3513
3527
  const llm = this.ctx.get('llm');
3514
3528
  if (llm === undefined)
3515
3529
  throw new Error('assistant-delivery: llm service is required');
3516
- requireAdapterToolCallProtocol(llm, selected.provider, selected.model, presetId, agentCtx.tools.schemas(preparedAgent ?? agentCtx.agent).length);
3530
+ requireAdapterToolCallProtocol(llm, selected.provider, selected.model, presetId, agentCtx.tools.schemas(preparedAgent).length);
3517
3531
  } });
3518
3532
  const agent = handle.agent;
3519
3533
  await this.reconcileNativeFullPermissionReviewer(agent.session);
@@ -3663,8 +3677,7 @@ export class DshDeliveryRuntime {
3663
3677
  text: automaticCompletionPrompt(nextKind, this.options.maxTextBytes, this.options.maxOutputTokens),
3664
3678
  }],
3665
3679
  source: {
3666
- kind: 'plugin',
3667
- plugin: '@dsh-enhanced/assistant-delivery',
3680
+ kind: 'assistant-delivery',
3668
3681
  form: 'notice',
3669
3682
  summary: `Automatic answer completion attempt ${automaticTurns}`,
3670
3683
  },