dsh-plugin-dev-kb 1.1.0 → 1.3.0

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 (121) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.en.md +14 -8
  3. package/README.md +14 -8
  4. package/docs/banner.svg +25 -0
  5. package/kb/INDEX.md +6 -2
  6. package/kb/README.md +4 -4
  7. package/kb/extra/AGENTS.md +2 -2
  8. package/kb/extra/cookbook/adding-a-session-format-version.md +109 -0
  9. package/kb/extra/cookbook/adding-a-session-format-version.zh.md +109 -0
  10. package/kb/extra/cookbook/adding-a-vendored-package.md +1 -1
  11. package/kb/extra/cookbook/adding-a-vendored-package.zh.md +1 -1
  12. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.md +1 -1
  13. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.zh.md +1 -1
  14. package/kb/extra/deepseek-llm-api-wire-extensions.md +2 -2
  15. package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +2 -2
  16. package/kb/extra/development.md +13 -3
  17. package/kb/extra/development.zh.md +13 -3
  18. package/kb/extra/event-producer-consumer.md +33 -31
  19. package/kb/extra/event-producer-consumer.zh.md +34 -32
  20. package/kb/extra/i18n/README.md +2 -1
  21. package/kb/extra/i18n/README.zh.md +3 -2
  22. package/kb/extra/i18n/translation-prompt.md +1 -1
  23. package/kb/extra/module-graph.md +62 -24
  24. package/kb/extra/module-graph.zh.md +62 -24
  25. package/kb/extra/rescope.md +1 -1
  26. package/kb/extra/rescope.zh.md +1 -1
  27. package/kb/extra/session-format-status.md +47 -0
  28. package/kb/extra/session-format-status.zh.md +47 -0
  29. package/kb/extra/subsystems/agent-team.md +1 -1
  30. package/kb/extra/subsystems/agent-team.zh.md +1 -1
  31. package/kb/extra/subsystems/feedback.md +164 -30
  32. package/kb/extra/subsystems/feedback.zh.md +164 -30
  33. package/kb/extra/testing.md +4 -3
  34. package/kb/extra/testing.zh.md +4 -3
  35. package/kb/extra/web-styling.md +1 -0
  36. package/kb/extra/web-styling.zh.md +1 -0
  37. package/kb/meta/search-index.json +151 -103
  38. package/kb/meta/site-pages.txt +188 -184
  39. package/kb/meta/source.json +5 -5
  40. package/kb/meta/topics.md +2 -2
  41. package/kb/site/develop/basic/publish.md +1 -1
  42. package/kb/site/en/develop/basic/publish.md +1 -1
  43. package/kb/site/en/guide/providers.md +1 -1
  44. package/kb/site/en/guide/python-sdk.md +19 -3
  45. package/kb/site/en/reference/agent-lifecycle.md +12 -5
  46. package/kb/site/en/reference/capability-seams.md +10 -3
  47. package/kb/site/en/reference/config-catalog.md +173 -42
  48. package/kb/site/en/reference/cookbook/adding-a-tool.md +1 -1
  49. package/kb/site/en/reference/cookbook/extension-cookbook.md +1 -1
  50. package/kb/site/en/reference/index.md +18 -8
  51. package/kb/site/en/reference/persistence-catalog.md +121 -48
  52. package/kb/site/en/reference/subsystems/approval.md +1 -1
  53. package/kb/site/en/reference/subsystems/client-modules.md +9 -0
  54. package/kb/site/en/reference/subsystems/client-resources.md +94 -0
  55. package/kb/site/en/reference/subsystems/compaction.md +1 -1
  56. package/kb/site/en/reference/subsystems/core.md +79 -16
  57. package/kb/site/en/reference/subsystems/filesystem.md +15 -0
  58. package/kb/site/en/reference/subsystems/goal.md +37 -1
  59. package/kb/site/en/reference/subsystems/index.md +2 -0
  60. package/kb/site/en/reference/subsystems/invariants.md +1 -1
  61. package/kb/site/en/reference/subsystems/llm-streaming.md +20 -10
  62. package/kb/site/en/reference/subsystems/lsp.md +1 -1
  63. package/kb/site/en/reference/subsystems/persistence.md +36 -15
  64. package/kb/site/en/reference/subsystems/schedule.md +1 -1
  65. package/kb/site/en/reference/subsystems/scope.md +1 -1
  66. package/kb/site/en/reference/subsystems/session-reference.md +4 -0
  67. package/kb/site/en/reference/subsystems/session-telemetry.md +22 -6
  68. package/kb/site/en/reference/subsystems/session.md +64 -42
  69. package/kb/site/en/reference/subsystems/shell.md +9 -6
  70. package/kb/site/en/reference/subsystems/sidebar-right.md +151 -0
  71. package/kb/site/en/reference/subsystems/slots.md +41 -33
  72. package/kb/site/en/reference/subsystems/spill.md +13 -6
  73. package/kb/site/en/reference/subsystems/subagent.md +20 -13
  74. package/kb/site/en/reference/subsystems/subprocess.md +25 -26
  75. package/kb/site/en/reference/subsystems/system-prompt.md +3 -1
  76. package/kb/site/en/reference/subsystems/token-meter.md +2 -1
  77. package/kb/site/en/reference/subsystems/tools.md +5 -5
  78. package/kb/site/en/reference/subsystems/workspace.md +80 -1
  79. package/kb/site/en/reference/tool-catalog.md +46 -2
  80. package/kb/site/en/reference/tool-execution-pipeline.md +2 -2
  81. package/kb/site/guide/providers.md +1 -1
  82. package/kb/site/guide/python-sdk.md +19 -3
  83. package/kb/site/reference/agent-lifecycle.md +12 -5
  84. package/kb/site/reference/capability-seams.md +10 -3
  85. package/kb/site/reference/config-catalog.md +173 -42
  86. package/kb/site/reference/cookbook/adding-a-tool.md +1 -1
  87. package/kb/site/reference/cookbook/extension-cookbook.md +1 -1
  88. package/kb/site/reference/index.md +18 -8
  89. package/kb/site/reference/persistence-catalog.md +127 -54
  90. package/kb/site/reference/subsystems/approval.md +1 -1
  91. package/kb/site/reference/subsystems/client-modules.md +9 -0
  92. package/kb/site/reference/subsystems/client-resources.md +94 -0
  93. package/kb/site/reference/subsystems/compaction.md +1 -1
  94. package/kb/site/reference/subsystems/core.md +79 -16
  95. package/kb/site/reference/subsystems/filesystem.md +15 -0
  96. package/kb/site/reference/subsystems/goal.md +37 -1
  97. package/kb/site/reference/subsystems/index.md +14 -12
  98. package/kb/site/reference/subsystems/invariants.md +1 -1
  99. package/kb/site/reference/subsystems/llm-streaming.md +20 -10
  100. package/kb/site/reference/subsystems/lsp.md +1 -1
  101. package/kb/site/reference/subsystems/persistence.md +36 -15
  102. package/kb/site/reference/subsystems/schedule.md +1 -1
  103. package/kb/site/reference/subsystems/scope.md +1 -1
  104. package/kb/site/reference/subsystems/session-reference.md +4 -0
  105. package/kb/site/reference/subsystems/session-telemetry.md +22 -6
  106. package/kb/site/reference/subsystems/session.md +64 -42
  107. package/kb/site/reference/subsystems/shell.md +9 -6
  108. package/kb/site/reference/subsystems/sidebar-right.md +151 -0
  109. package/kb/site/reference/subsystems/slots.md +41 -33
  110. package/kb/site/reference/subsystems/spill.md +13 -6
  111. package/kb/site/reference/subsystems/subagent.md +20 -13
  112. package/kb/site/reference/subsystems/subprocess.md +25 -26
  113. package/kb/site/reference/subsystems/system-prompt.md +3 -1
  114. package/kb/site/reference/subsystems/token-meter.md +2 -1
  115. package/kb/site/reference/subsystems/tools.md +5 -5
  116. package/kb/site/reference/subsystems/workspace.md +80 -1
  117. package/kb/site/reference/tool-catalog.md +46 -2
  118. package/kb/site/reference/tool-execution-pipeline.md +2 -2
  119. package/lib/index.js +25 -44
  120. package/package.json +3 -2
  121. package/skills/dsh-plugin-dev-kb.md +3 -3
@@ -48,6 +48,12 @@ Vendored CLI、仅用于构建和测试的可执行文件、进程内直接挂
48
48
 
49
49
  Python SDK 遵循相同的应用架构。其运行时 wheel 把普通 `dsh` CLI 打包为 `deepseek-harness-sdk-runtime-<platform>-<arch>`,客户端默认以显式 Harness home 启动 `dsh --profile sdk`。极简示例选择随附的 `sdk-minimal` profile。Python 暴露 profile 选择与有序 patch 文件,而不是完整 Cordis 树;持久外部插件通过 `dsh plugin` 安装。已删除的私有直读配置载体没有兼容 bin 或回退 parser。
50
50
 
51
+ ## 桌面应用
52
+
53
+ [Electron 桌面应用](https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/desktop/README.zh.md)持有保留的 `$DSH_HOME/profiles/desktop` npm 项目。每个签名 Electron 发行版绑定一个确切 dsh 版本并携带第一方离线 seed;启动时通过内置 pnpm 把该版本安装进可写 profile,同时保留旧 profile 中桌面插件的确切版本。CLI profile 与 Desktop 共享 `$DSH_HOME` 下受支持的产品数据,但绝不共享可执行包、插件激活、lockfile 或 `node_modules`。
54
+
55
+ Electron 通过内置的上游 Node.js 进程启动私有 Desktop Host 包;该包从保留 profile 加载已安装的 dsh 后端与匹配的客户端图。一元 RPC、Remote stream 与版本匹配的客户端资源经带版本的分帧字节管道传输,Node IPC 只保留生命周期控制,再通过安全的 `dsh-app://` 协议到达渲染进程;因此桌面组合不会开放 Web server 或 loopback 端口。只有壳自有 UI 能通过内置 pnpm 及其私有 `$DSH_HOME/desktop/pnpm/store` 执行插件事务。
56
+
51
57
  ## 核心包
52
58
 
53
59
  以下是向 Cordis 树贡献内容的部分核心包。
@@ -84,13 +90,15 @@ Python SDK 遵循相同的应用架构。其运行时 wheel 把普通 `dsh` CLI
84
90
  ```text
85
91
  turn/start
86
92
  claim next-step input plus one queued message
87
- assemble prompt sections + tool schemas
93
+ assemble prompt sections + tool schemas; project runtime context
88
94
  -> agent/pre-step reject | enter(messages, startsRequestSeries?)
89
95
  reject, or a first enter rewritten empty -> close the turn with no step
90
96
  step/start
91
- append entered messages as user/message
92
- derive model history from the log
93
- agent/request -> llm/stream -> agent/assistant-stream start
97
+ agent/request -> prepareCall (cancellation commits neither system nor users)
98
+ reconcile system/message using the prepared call capability
99
+ append entered messages as user/message; log request/header and request/context as needed
100
+ derive and freeze model history from the log
101
+ stream the bound prepared call -> llm/stream -> agent/assistant-stream start
94
102
  agent/assistant-stream chunk*
95
103
  assistant/message | assistant/attempt -> agent/assistant-stream end
96
104
  tool/call* -> tools/pre-execute -> tools/execute -> tools/post-execute -> tool/result*
@@ -100,11 +108,13 @@ turn/start
100
108
  turn/end
101
109
  ```
102
110
 
103
- `turn/*`、`step/*`、`user/message`、`assistant/message`、`assistant/attempt` 和 `tool/*` 是持久会话事件;其余是分属三个事件域的实时扩展点。`agent/assistant-stream` 发布进程本地 start、瞬态 chunk 与 end frame。loop 会在 committed end frame 前把完整紧凑 stream 提交为一个 message 或仅日志 attempt;Web Session-follow adapter 是该 live event 唯一的远程消费方。`agent/pre-step`、`agent/request`、`llm/stream` 和三个 `tools/*` 事件是 waterfall(瀑布式事件),其监听器必须调用 `next()` 才能委托下去;`agent/turn-stopping` 是 serial 事件,没有 `next()`。
111
+ `turn/*`、`step/*`、`system/message`、`user/message`、`assistant/message`、`assistant/attempt` 和 `tool/*` 是持久会话事件;其余是分属三个事件域的实时扩展点。`agent/assistant-stream` 发布进程本地 start、瞬态 chunk 与 end frame。loop 会在 committed end frame 前把完整紧凑 stream 提交为一个 message 或仅日志 attempt;Web Session-follow adapter 是该 live event 唯一的远程消费方。`agent/pre-step`、`agent/request`、`llm/stream` 和三个 `tools/*` 事件是 waterfall(瀑布式事件),其监听器必须调用 `next()` 才能委托下去;`agent/turn-stopping` 是 serial 事件,没有 `next()`。
104
112
 
105
113
  输入通过同一个 inbox 到达驱动器。有些消息会立即唤醒它;注入的上下文会留在 inbox 中,直到另一条消息将其唤醒。
106
114
 
107
- `agent/pre-step` 决定模型看到什么。监听器可以改写已领取的消息,也可以直接拒绝它们;首次领取被拒绝或被改写为空时,仍会关闭一个不含步骤的持久轮次,因此日志会记录这次尝试。enter 决策还可以设置 `startsRequestSeries` 来开启独立的模型消息序列:loop 会随之记录一个新的 `request/header`(原因为 `series`,或在封装同时变化时为携带 `startsSeries: true` 的 `change`)。重建下游 enter 决策的监听器必须展开它(`{ ...decision, messages }`),该声明才能存活。每个步骤读取插件注册的提示词片段和工具 schema。
115
+ `agent/pre-step` 决定接纳的输入。监听器可以改写或拒绝已领取消息;首次领取被拒绝或为空时,关闭不含步骤的持久轮次。enter 决策可设置 `startsRequestSeries`:循环记录新的 `request/header`(原因为 `series`,或在封装同时变化时为携带 `startsSeries: true` 的 `change`)。包装监听器通过 `{ ...decision, messages }` 保留该声明。组装与 `step/start` 之后,`agent/request` 和 `prepareCall()` 先解析实际路由,再提交系统提示词与已接纳用户消息;在任一异步阶段取消都不会提交这两者。提示词准入依据已准备调用的能力,而非先前的 `request/context`。每次尝试同步协调同一份已渲染组装结果、仅在首次尝试追加用户消息、按需记录 header/context、派生并冻结请求,再通过绑定调用发起流式请求。重试不重复组装或 `agent/pre-step`。附接后的 surface 替换开启新请求序列,包括恢复后的首次 pre-step 中发生的替换;未变化的恢复延续序列。首次接纳的步骤在用户消息之前预留系统头节点,即使提示词为空(不产生协议消息)。提示词仅通过 `system/message` 历史传递:空渲染文本清除所有生效的系统节点,模型不再看到旧提示词;具备能力的路由可在缓存前缀之后追加非空更新;不具备能力的路由与新请求序列将非空提示词文本归并到首个系统节点,并为非空的后续系统节点记录空内容替换([决策](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-09-02-system-prompt-as-surface-node.zh.md);[决策规则](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/agent-loop/README.zh.md#understand-the-implementation))。
116
+
117
+ 循环发送不可变请求,同时保留实时取消能力。只有已由该循环完整冻结的消息对象身份才能复用冻结证明;[agent-loop](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/agent-loop/README.zh.md)拥有请求构造规则。
108
118
 
109
119
  详情见[时序图](./agent-lifecycle.md)、[工具流水线](./tool-execution-pipeline.md)和[取消与错误恢复](./subsystems/core.md#the-agent-handle)。
110
120
 
@@ -112,7 +122,7 @@ turn/end
112
122
 
113
123
  会话日志是模型所见上下文的来源。`deriveMessages()` 从中投影出模型历史。每个 `assistant/message` 都嵌入产生其组装内容的精确紧凑带时间 stream;`assistant/attempt` 保留已到达 settlement 的失败、重试、取消与 stream error attempt,且不添加模型历史。fork、恢复、transcript(文本记录)、遥测与持久化都从这些持久 settlement 派生,实时 UI 增量则来自 `agent/assistant-stream`;如果进程在 settlement 前硬中断,则不会留下持久 attempt stream(见[决策](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-09-01-v2-embedded-assistant-streams.zh.md))。
114
124
 
115
- Session 消费方只了解当前逻辑格式。仅 header 的 `stat` 与 `list` 会重新扫描每个 Session 目录,选择数值最高的规范 generation,并在不加载事件或发布后继的情况下转换受支持的历史 header。已存储 Session 的 `open` 选择同一 generation,拒绝未来版本,或在内存中组合静态相邻迁移链、校验最终结果,并在返回句柄前以不覆盖方式只发布该版本命名的后继文件且保持源文件不变;语义层的中断轮次修复仍由句柄消费方负责。JSONL v0 使用 `session.jsonl[.zstd]`,v1 及后续版本使用小写 `session.vN.jsonl[.zstd]`;已提交 generation 路径绝不重命名、替换或删除。JSONL provider 负责物理 framing、压缩、generation 选择与排他发布,每个相邻迁移包只负责一个 `vN -> vN+1` 步骤([决策](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-08-31-released-session-format-migrations.zh.md))。
125
+ Session 消费方只了解当前逻辑格式。仅 header 的 `stat` 与 `list` 会重新扫描每个 Session 目录,选择数值最高的规范 generation,并在不加载事件或发布后继的情况下转换受支持的历史 header。已存储 Session 的 `open` 选择同一 generation,拒绝未来版本,或只 Decode 并组合一次构建时静态确定的相邻迁移链,再返回经过校验的当前逻辑事件。只读 open 直接使用这份内存结果,不发布后继;写 open 则先编码、校验并在未改变源的旁边排他发布最终版本命名的后继。未被后续事件封住的普通中断尾部仍由句柄消费方修复;只有在后续 `turn/start` 已经封住一种有限的已发布 restart 时,migration 才会插入缺失的 interrupted `turn/end`。JSONL v0 使用 `session.jsonl[.zstd]`,v1 及后续版本使用小写 `session.vN.jsonl[.zstd]`;已提交 generation 路径绝不重命名、替换或删除。JSONL provider 负责物理 framing、压缩、generation 选择与排他发布,每个相邻迁移包只负责一个 `vN -> vN+1` 步骤([决策](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-08-31-released-session-format-migrations.zh.md))。
116
126
 
117
127
  **模型可见即已记录。** 抵达模型请求的一切都必须能从日志重建,并由一项运行时不变量断言这一点。因此,新增一项模型可见输入就需要新增一个会话事件:扩展 `SessionEventMap` 并从日志渲染。
118
128
 
@@ -124,7 +134,7 @@ Session 消费方只了解当前逻辑格式。仅 header 的 `stat` 与 `list`
124
134
 
125
135
  seam 正是替换一个提供方就能改变整个产品的原因。文件系统与进程提供方共享同一个执行世界,因此把它们指向远程沙箱,也就把 Bash、PTY 和 LSP 一并搬了过去,无需提供方专用 fork。[subagent 提供方](./subsystems/subagent.md)在同一个接口之后同样千差万别,从新建一个子 agent,到把一个轮次委派给另一个产品。
126
136
 
127
- [实验性 Agent Teams](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md) 是 `ctx.agentTeams` 上的私有显式启用协作 seam,在可继续 subagent 之上提供持久 roster、任务板和 mailbox。
137
+ [实验性 Agent Teams](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md) 是 `ctx.agentTeams` 上公开发布、显式启用的协作 seam,在可继续 subagent 之上提供持久 roster、任务板和 mailbox。
128
138
 
129
139
  ## 新行为的归属位置
130
140
 
@@ -10,7 +10,7 @@ outline: "deep"
10
10
 
11
11
  会话持久事件日志中可能出现的所有事件类型:完整持久化的 `SessionEvent` 信封,以及可通过合并扩展的 `SessionEventMap` 中的每个成员,包括 `@deepseek-ai/dsh-session` 所属的词汇和本仓库中每个插件对 `@deepseek-ai/dsh-session/types` 的声明合并,并附有源 JSDoc、完整 payload 声明、surface 标记和声明位置。本文档是 [session.md](./subsystems/session.md)(surface 排序与 `deriveMessages()` 投影)、[persistence.md](./subsystems/persistence.md)(如何让日志持久化)和 [session.md](./subsystems/session.md#cordis-surface) 中生成区域(实时总线接线;日志事件**不是** cordis 事件,它通过唯一的 `session/event` emit 到达监听器)的补充。
12
12
 
13
- 英文源文件根据源码生成(`scripts/gen-persistence-catalog.ts`),并由 `pnpm run verify-persistence-catalog`(`doc-sync`(文档同步门禁)的一部分)验证新鲜度;本中文文件作为经评审对侧通过双语配对维护。声明块保留源码声明和嵌套属性的 JSDoc,只移除其所在接口/模块带来的缩进,并使用 `ts persistence-catalog` 围栏(doc-typecheck 会跳过这些围栏,因为声明引用了其所属模块中的类型)。payload 中的类型名称会链接到记录该类型的页面。参见 [persistence-log-catalog Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/archived/process/2026-07-04-persistence-log-catalog.md)
13
+ 英文源文件根据源码生成(`scripts/gen-persistence-catalog.ts`),并由 `pnpm run verify-persistence-catalog`(`doc-sync`(文档同步门禁)的一部分)验证新鲜度;本中文文件作为经评审对侧通过双语配对维护。声明块保留源码声明和嵌套属性的 JSDoc,只移除其所在接口/模块带来的缩进,并使用 `ts persistence-catalog` 围栏(doc-typecheck 会跳过这些围栏,因为声明引用了其所属模块中的类型)。payload 中的类型名称会链接到记录该类型的页面。已归档的 [persistence-log-catalog 记录](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/archived/process/2026-07-04-persistence-log-catalog.md)记载了最初的目录决策。
14
14
 
15
15
  以下信封声明组合了每个事件的 `type`、单调递增的 `seq`、以 epoch 毫秒表示的 `time`、`data`、可选的未知类型跳过标记 `ignorable`,以及条件字段 `surfaceOp`/`sourceEventSeqs`。**surface** 表示 `SurfaceEventType` 成员:它会生成一条 LLM(大语言模型)消息,并声明该事件如何加入 surface 列表。**log-only** 表示其他所有事件:这类记录可持久化、可回放,但不参与派生历史。每个 payload 均可进行 JSON 序列化(在 `Session.append` 处强制执行)。当前 writer 会写入 `SESSION_FORMAT_VERSION`;受支持的历史产物通过构建期静态相邻迁移目录进入这套当前词汇(参见[版本生命周期](./subsystems/persistence.md))。范围仅限本仓库中的包;下游插件可以继续合并其他当前版本事件类型,这些类型按设计不属于本目录,并且在后续格式迁移边中需要显式 disposition。
16
16
 
@@ -23,10 +23,11 @@ export type SessionEventType = keyof SessionEventMap
23
23
  /**
24
24
  * The subset of {@link SessionEventType} values whose events produce LLM
25
25
  * messages and are eligible to appear on the ordered surface. Only these
26
- * event types may carry {@link SurfaceOp}; user and tool events may also cite
26
+ * event types may carry {@link SurfaceOp}; system, user, and tool events may also cite
27
27
  * earlier sources through {@link SessionEvent.sourceEventSeqs}.
28
28
  */
29
29
  export type SurfaceEventType =
30
+ | 'system/message'
30
31
  | 'user/message'
31
32
  | 'assistant/message'
32
33
  | 'tool/result'
@@ -37,16 +38,16 @@ export type SurfaceEventType =
37
38
  *
38
39
  * - `'append'`: added to the tail — normal path for user/assistant/tool
39
40
  * messages.
40
- * - `{ op: 'replace', start, end }`: replaces surface nodes from `start`
41
- * (inclusive) through `end` (inclusive) with this node. Both must exist as
42
- * surface nodes in the current surface. `start === end` replaces a single
41
+ * - `{ op: 'replace', startSeq, endSeq }`: replaces surface nodes from `startSeq`
42
+ * (inclusive) through `endSeq` (inclusive) with this node. Both must exist as
43
+ * surface nodes in the current surface. `startSeq === endSeq` replaces a single
43
44
  * node. The node's {@link SessionEvent.sourceEventSeqs} must include every
44
45
  * shadowed surface node. Used by compaction; any surface-replacing producer
45
46
  * may use it.
46
47
  */
47
48
  export type SurfaceOp =
48
49
  | 'append'
49
- | { op: 'replace'; start: SessionSeq; end: SessionSeq }
50
+ | { op: 'replace'; startSeq: SessionSeq; endSeq: SessionSeq }
50
51
 
51
52
  /**
52
53
  * One immutable entry in the session log.
@@ -55,7 +56,7 @@ export type SurfaceOp =
55
56
  * unions), so `switch (event.type)` narrows `event.data` without casts.
56
57
  *
57
58
  * The {@link sourceEventSeqs} and {@link surfaceOp} fields are conditional:
58
- * they only exist on {@link SurfaceEventType} variants (`user/message`,
59
+ * they only exist on {@link SurfaceEventType} variants (`system/message`, `user/message`,
59
60
  * `assistant/message`, `tool/result`).
60
61
  * Non-surface events (boundary markers, attempts, errors) never carry
61
62
  * surface metadata — the compiler enforces this at `Session.append()`
@@ -80,20 +81,14 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
80
81
  * inconvenience) rather than silently resuming a gutted session.
81
82
  */
82
83
  ignorable?: true
83
- } & (K extends SurfaceEventType ? {
84
- /**
85
- * Seq numbers of earlier events that this event cites as sources, such as
86
- * the surface nodes shadowed by a compaction replacement. A v2
87
- * `assistant/message` embeds its provider stream and cannot carry this field.
88
- */
89
- sourceEventSeqs?: SessionSeq[]
90
- /** How this event entered the surface; absent for non-surface events. */
91
- surfaceOp?: SurfaceOp
92
- } : object)
84
+ } & (K extends SurfaceEventType ? SurfaceIntent<K> : {
85
+ surfaceOp?: never
86
+ sourceEventSeqs?: never
87
+ })
93
88
  }[T]
94
89
  ```
95
90
 
96
- 来源:[`packages/core/session/src/types.ts:379`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts) · [`packages/core/session/src/types.ts:387`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts) · [`packages/core/session/src/types.ts:416`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts) · [`packages/core/session/src/types.ts:447`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
91
+ 来源:[`packages/core/session/src/types.ts:404`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts) · [`packages/core/session/src/types.ts:412`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts) · [`packages/core/session/src/types.ts:434`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts) · [`packages/core/session/src/types.ts:465`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
97
92
 
98
93
  ## 事件
99
94
 
@@ -106,8 +101,8 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
106
101
  ```ts persistence-catalog
107
102
  /**
108
103
  * One normalized mutation of an agent's durable pending-message lists.
109
- * Live dispatch precedes projection mutation, so synchronous observers may
110
- * read the pre-splice inbox to recover the removed messages.
104
+ * The session-projection registry applies the committed event before
105
+ * `Session.append()` returns; Inbox live notifications follow that commit.
111
106
  */
112
107
  'agent/inbox/spliced': {
113
108
  target: InboxTarget
@@ -118,7 +113,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
118
113
  }
119
114
  ```
120
115
 
121
- 来源:[`packages/core/agent/src/types.ts:58`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/agent/src/types.ts)
116
+ 来源:[`packages/core/agent/src/types.ts:87`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/agent/src/types.ts)
122
117
 
123
118
  ### `agent-preset/*`
124
119
 
@@ -203,7 +198,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
203
198
  }
204
199
  ```
205
200
 
206
- 来源:[`packages/interaction/user-approval/src/index.ts:32`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/user-approval/src/index.ts)
201
+ 来源:[`packages/interaction/user-approval/src/index.ts:33`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/user-approval/src/index.ts)
207
202
 
208
203
  ### `assistant/*`
209
204
 
@@ -220,7 +215,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
220
215
  'assistant/attempt': { turn: number; step: number; stream: AssistantStreamRecord[] }
221
216
  ```
222
217
 
223
- 来源:[`packages/core/session/src/types.ts:313`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
218
+ 来源:[`packages/core/session/src/types.ts:335`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
224
219
 
225
220
  <a id="assistantmessage--surface"></a>
226
221
 
@@ -250,7 +245,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
250
245
 
251
246
  类型:[TokenUsage](./subsystems/llm-streaming.md)
252
247
 
253
- 来源:[`packages/core/session/src/types.ts:299`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
248
+ 来源:[`packages/core/session/src/types.ts:321`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
254
249
 
255
250
  ### `command/*`
256
251
 
@@ -406,8 +401,45 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
406
401
 
407
402
  来源:[`packages/compaction/compaction/src/types.ts:34`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/compaction/compaction/src/types.ts)
408
403
 
404
+ ### `deliverables/*`
405
+
406
+ <a id="deliverablespresented--log-only"></a>
407
+
408
+ #### `deliverables/presented` — 仅日志
409
+
410
+ ```ts persistence-catalog
411
+ /** Declared filesystem files from a successful final present result, including nested calls. */
412
+ 'deliverables/presented': { turn: number; callId: ToolCallId; files: PresentedFile[] }
413
+ ```
414
+
415
+ 类型: [ToolCallId](./subsystems/core.md)
416
+
417
+ 来源: [`packages/fs/tool-present/src/types.ts:15`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/fs/tool-present/src/types.ts)
418
+
409
419
  ### `feedback/*`
410
420
 
421
+ <a id="feedbackmessage-delete--log-only"></a>
422
+
423
+ #### `feedback/message-delete` — log-only
424
+
425
+ ```ts persistence-catalog
426
+ /** Log-only deletion; earlier ratings and notes remain in the log. */
427
+ 'feedback/message-delete': MessageFeedbackDelete
428
+ ```
429
+
430
+ 来源:[`packages/feedback/message-feedback/src/types.ts:55`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/feedback/message-feedback/src/types.ts)
431
+
432
+ <a id="feedbackmessage-put--log-only"></a>
433
+
434
+ #### `feedback/message-put` — log-only
435
+
436
+ ```ts persistence-catalog
437
+ /** Log-only human feedback; never enters model history. */
438
+ 'feedback/message-put': MessageFeedbackPut
439
+ ```
440
+
441
+ 来源:[`packages/feedback/message-feedback/src/types.ts:53`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/feedback/message-feedback/src/types.ts)
442
+
411
443
  <a id="feedbackrecord--log-only"></a>
412
444
 
413
445
  #### `feedback/record` — log-only
@@ -417,10 +449,10 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
417
449
  * One recorded human remark about this session. Log-only and independent
418
450
  * of its trigger; it never enters model context or derived history.
419
451
  */
420
- 'feedback/record': { text: string }
452
+ 'feedback/record': FeedbackRecord
421
453
  ```
422
454
 
423
- 来源:[`packages/feedback/command-feedback/src/index.ts:62`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/feedback/command-feedback/src/index.ts)
455
+ 来源:[`packages/feedback/command-feedback/src/types.ts:40`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/feedback/command-feedback/src/types.ts)
424
456
 
425
457
  ### `goal/*`
426
458
 
@@ -525,7 +557,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
525
557
  'model/selection': ModelSelection
526
558
  ```
527
559
 
528
- 来源:[`packages/api/session-controller/src/types.ts:41`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/api/session-controller/src/types.ts)
560
+ 来源:[`packages/api/session-controller/src/types.ts:40`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/api/session-controller/src/types.ts)
529
561
 
530
562
  ### `permission/*`
531
563
 
@@ -570,13 +602,15 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
570
602
 
571
603
  ```ts persistence-catalog
572
604
  /**
573
- * Route metadata for the next request, logged only when the route or capacity
574
- * changes. It does not participate in request reconstruction or header equality.
605
+ * Route metadata for the next request, logged only when the route, capacity,
606
+ * or system prompt update mode changes. It does not participate in request
607
+ * reconstruction or header equality. Prompt admission uses the bound prepared
608
+ * call's capability, not this snapshot from an earlier request.
575
609
  */
576
610
  'request/context': RequestContext
577
611
  ```
578
612
 
579
- 来源:[`packages/core/session/src/types.ts:341`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
613
+ 来源:[`packages/core/session/src/types.ts:377`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
580
614
 
581
615
  <a id="requestheader--log-only"></a>
582
616
 
@@ -595,7 +629,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
595
629
  }
596
630
  ```
597
631
 
598
- 来源:[`packages/core/session/src/types.ts:331`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
632
+ 来源:[`packages/core/session/src/types.ts:365`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
599
633
 
600
634
  ### `sandbox/*`
601
635
 
@@ -670,7 +704,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
670
704
  'session/end-seed': { inherited?: true }
671
705
  ```
672
706
 
673
- 来源:[`packages/core/session/src/types.ts:375`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
707
+ 来源:[`packages/core/session/src/types.ts:400`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
674
708
 
675
709
  <a id="sessiontitle--log-only"></a>
676
710
 
@@ -719,7 +753,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
719
753
  }
720
754
  ```
721
755
 
722
- 来源:[`packages/session/session-log-deepseek/src/types.ts:59`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-log-deepseek/src/types.ts)
756
+ 来源:[`packages/session/session-log-deepseek/src/types.ts:81`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-log-deepseek/src/types.ts)
723
757
 
724
758
  ### `step/*`
725
759
 
@@ -732,7 +766,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
732
766
  'step/end': { turn: number; step: number }
733
767
  ```
734
768
 
735
- 来源:[`packages/core/session/src/types.ts:281`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
769
+ 来源:[`packages/core/session/src/types.ts:289`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
736
770
 
737
771
  <a id="stepstart--log-only"></a>
738
772
 
@@ -743,10 +777,24 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
743
777
  'step/start': { turn: number; step: number }
744
778
  ```
745
779
 
746
- 来源:[`packages/core/session/src/types.ts:279`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
780
+ 来源:[`packages/core/session/src/types.ts:287`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
747
781
 
748
782
  ### `subagent/*`
749
783
 
784
+ <a id="subagentcatalog--log-only"></a>
785
+
786
+ #### `subagent/catalog` — log-only
787
+
788
+ ```ts persistence-catalog
789
+ /**
790
+ * A direct child's complete discovery fact.
791
+ * @param data - versioned parent-owned catalog entry.
792
+ */
793
+ 'subagent/catalog': SubagentCatalogEvent
794
+ ```
795
+
796
+ 来源:[`packages/subagent/subagent/src/catalog.ts:40`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent/src/catalog.ts)
797
+
750
798
  <a id="subagentdescriptor--log-only"></a>
751
799
 
752
800
  #### `subagent/descriptor` — log-only
@@ -783,6 +831,30 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
783
831
 
784
832
  来源:[`packages/subagent/tool-subagent/src/model-selection-state.ts:17`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/tool-subagent/src/model-selection-state.ts)
785
833
 
834
+ ### `system/*`
835
+
836
+ <a id="systemmessage--surface"></a>
837
+
838
+ #### `system/message` — surface
839
+
840
+ ```ts persistence-catalog
841
+ /**
842
+ * The rendered system prompt on the model-visible surface. The loop appends
843
+ * the first one as surface node 0 before the step's first `user/message`.
844
+ * A prepared in-history route can append nonempty changes in a continuing
845
+ * series. An incapable route or new series normalizes text to the first system
846
+ * node. Normalization empties nonempty later nodes, then rewrites the head if
847
+ * needed, through logged per-node replacements. An empty rendering always
848
+ * clears all active system nodes, leaving no older instructions model-visible.
849
+ * Empty later nodes are dormant and project to no message; an empty head with
850
+ * no active later node records "no system prompt". Restored nonempty text follows
851
+ * the same route and series rule; empty nodes never restore older text.
852
+ */
853
+ 'system/message': { turn: number; step: number; message: SystemMessage }
854
+ ```
855
+
856
+ 来源:[`packages/core/session/src/types.ts:310`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
857
+
786
858
  ### `team/*`
787
859
 
788
860
  <a id="teammember--log-only"></a>
@@ -796,7 +868,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
796
868
 
797
869
  类型:[TeamId](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md) · [TeamMemberSnapshot](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md)
798
870
 
799
- 来源:[`packages/experimental/agent-team/src/types.ts:204`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/agent-team/src/types.ts)
871
+ 来源:[`packages/experimental/agent-team/src/types.ts:221`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/agent-team/src/types.ts)
800
872
 
801
873
  <a id="teammessagedelivered--log-only"></a>
802
874
 
@@ -814,7 +886,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
814
886
 
815
887
  类型:[TeamId](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md) · [TeamMessageId](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md)
816
888
 
817
- 来源:[`packages/experimental/agent-team/src/types.ts:210`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/agent-team/src/types.ts)
889
+ 来源:[`packages/experimental/agent-team/src/types.ts:227`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/agent-team/src/types.ts)
818
890
 
819
891
  <a id="teammessagequeued--log-only"></a>
820
892
 
@@ -827,7 +899,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
827
899
 
828
900
  类型:[TeamId](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md) · [TeamMessageSnapshot](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md)
829
901
 
830
- 来源:[`packages/experimental/agent-team/src/types.ts:208`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/agent-team/src/types.ts)
902
+ 来源:[`packages/experimental/agent-team/src/types.ts:225`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/agent-team/src/types.ts)
831
903
 
832
904
  <a id="teamtask--log-only"></a>
833
905
 
@@ -840,7 +912,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
840
912
 
841
913
  类型:[TeamId](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md) · [TeamTaskSnapshot](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/agent-team.zh.md)
842
914
 
843
- 来源:[`packages/experimental/agent-team/src/types.ts:206`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/agent-team/src/types.ts)
915
+ 来源:[`packages/experimental/agent-team/src/types.ts:223`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/agent-team/src/types.ts)
844
916
 
845
917
  ### `todo/*`
846
918
 
@@ -874,16 +946,16 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
874
946
 
875
947
  类型:[ToolCallId](./subsystems/core.md)
876
948
 
877
- 来源:[`packages/core/session/src/types.ts:308`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
949
+ 来源:[`packages/core/session/src/types.ts:341`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
878
950
 
879
- <a id="toolcode-dispatch--log-only"></a>
951
+ <a id="toolptc-dispatch--log-only"></a>
880
952
 
881
- #### `tool/code-dispatch` — log-only
953
+ #### `tool/ptc-dispatch` — log-only
882
954
 
883
955
  ```ts persistence-catalog
884
956
  /**
885
957
  * One bridged sub-dispatch SETTLING: the pairing ids (matching the
886
- * `tool/code-dispatch-start` with the same `subCallId`), the tool `name`
958
+ * `tool/ptc-dispatch-start` with the same `subCallId`), the tool `name`
887
959
  * with the same JSON-normalized `arguments`, and the sub-call's complete
888
960
  * model-facing outcome in `tool/result`'s own vocabulary
889
961
  * (`content` + `isError`), so UIs render a sub-call through the exact
@@ -896,30 +968,30 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
896
968
  * before returning), so its execution-enclosure relation holds by
897
969
  * construction.
898
970
  */
899
- 'tool/code-dispatch': PtcDispatchEventData
971
+ 'tool/ptc-dispatch': PtcDispatchEventData
900
972
  ```
901
973
 
902
974
  来源:[`packages/core/tools/src/types.ts:56`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/tools/src/types.ts)
903
975
 
904
- <a id="toolcode-dispatch-start--log-only"></a>
976
+ <a id="toolptc-dispatch-start--log-only"></a>
905
977
 
906
- #### `tool/code-dispatch-start` — log-only
978
+ #### `tool/ptc-dispatch-start` — log-only
907
979
 
908
980
  ```ts persistence-catalog
909
981
  /**
910
982
  * One sub-dispatch STARTING inside a `run_code` program: the parent
911
- * `run_code` call id, the deterministic sub-call id (`<parent>:code:<n>`,
912
- * numbered in submission order), and the tool `name` with its
983
+ * `run_code` call id, the opaque sub-call id (new calls use
984
+ * `<parent>:ptc:<n>`, numbered in submission order), and the tool `name` with its
913
985
  * JSON-normalized `arguments` — the exact value dispatched, normalized
914
986
  * BEFORE dispatch, so this append can never fail on payload shape.
915
987
  * Appended when the scheduler actually starts the call (not at
916
988
  * submission), so a start means the tool body pipeline was entered; a
917
989
  * call abandoned in the queue logs nothing. Log-only: `deriveMessages()`
918
990
  * ignores it; UIs use it for live per-sub-call running state and pair it
919
- * with `tool/code-dispatch` by `subCallId` (timing = the two events'
991
+ * with `tool/ptc-dispatch` by `subCallId` (timing = the two events'
920
992
  * `time` fields).
921
993
  */
922
- 'tool/code-dispatch-start': PtcDispatchStartEventData
994
+ 'tool/ptc-dispatch-start': PtcDispatchStartEventData
923
995
  ```
924
996
 
925
997
  来源:[`packages/core/tools/src/types.ts:40`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/tools/src/types.ts)
@@ -944,12 +1016,13 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
944
1016
  turn: number
945
1017
  step: number
946
1018
  message: ToolResultMessage
1019
+ /** Optional failure identity; allowed only when the tool-result block has `isError: true`. */
947
1020
  error?: { name: string; code: string }
948
1021
  meta?: JsonValue
949
1022
  }
950
1023
  ```
951
1024
 
952
- 来源:[`packages/core/session/src/types.ts:320`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
1025
+ 来源:[`packages/core/session/src/types.ts:353`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
953
1026
 
954
1027
  ### `tool-workflow/*`
955
1028
 
@@ -1029,7 +1102,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
1029
1102
 
1030
1103
  类型:[TurnEndReason](./subsystems/session.md)
1031
1104
 
1032
- 来源:[`packages/core/session/src/types.ts:277`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
1105
+ 来源:[`packages/core/session/src/types.ts:285`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
1033
1106
 
1034
1107
  <a id="turnstart--log-only"></a>
1035
1108
 
@@ -1045,7 +1118,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
1045
1118
  'turn/start': { turn: number }
1046
1119
  ```
1047
1120
 
1048
- 来源:[`packages/core/session/src/types.ts:268`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
1121
+ 来源:[`packages/core/session/src/types.ts:276`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
1049
1122
 
1050
1123
  ### `user/*`
1051
1124
 
@@ -1064,7 +1137,7 @@ export type SessionEvent<T extends SessionEventType = SessionEventType> = {
1064
1137
  'user/message': UserMessage
1065
1138
  ```
1066
1139
 
1067
- 来源:[`packages/core/session/src/types.ts:289`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
1140
+ 来源:[`packages/core/session/src/types.ts:297`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/types.ts)
1068
1141
 
1069
1142
  ### `web/*`
1070
1143
 
@@ -49,7 +49,7 @@ type ApprovalOutcome = 'allowed-once' | 'rejected' | 'cancelled' | 'unavailable'
49
49
  type ApprovalPolicy = 'ask' | 'never'
50
50
  ```
51
51
 
52
- 两种策略都会将各自完整的当前含义贡献给缓存安全的运行时上下文快照。带来源的 `user/message` 是持久化且模型可见的输入;审批状态变化时,会在保留的历史后追加一份新的完整快照,而不改写请求头中的系统提示词。
52
+ 两种策略都会将各自完整的当前含义贡献给缓存安全的运行时上下文快照。带来源的 `user/message` 是持久化且模型可见的输入;审批状态变化时,会在保留的历史后追加一份新的完整快照,而不触碰承载渲染后系统提示词的 `system/message` 节点。
53
53
 
54
54
  ## 审批请求
55
55
 
@@ -133,6 +133,15 @@ graph(): WebBootGraph
133
133
  */
134
134
  clientPath(id: string): string | undefined
135
135
 
136
+ /**
137
+ * Serve an advertised revisioned bundle or source map without a Web server.
138
+ * Unknown URLs return 404, unsupported methods return 405, and `HEAD`
139
+ * returns the same immutable headers without a body.
140
+ * @param request - shell-carrier request for a `/plugins` resource.
141
+ * @returns the exact response also exposed by the optional Web route.
142
+ */
143
+ fetchBundle(request: Request): Response
144
+
136
145
  /**
137
146
  * Filesystem baseline captured before an entry's current bytes were read.
138
147
  * HMR compares it with the live files when installing a watch, so a write