dsh-plugin-dev-kb 1.0.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 (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/cordis.patch.yml +12 -0
  4. package/kb/INDEX.md +210 -0
  5. package/kb/README.md +69 -0
  6. package/kb/extra/AGENTS.md +75 -0
  7. package/kb/extra/api-gateway.md +164 -0
  8. package/kb/extra/api-gateway.zh.md +164 -0
  9. package/kb/extra/cookbook/adding-a-vendored-package.md +59 -0
  10. package/kb/extra/cookbook/adding-a-vendored-package.zh.md +59 -0
  11. package/kb/extra/cookbook/maintaining-dsh-code-review.md +64 -0
  12. package/kb/extra/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  13. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  14. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  15. package/kb/extra/defensive-patterns.md +33 -0
  16. package/kb/extra/defensive-patterns.zh.md +33 -0
  17. package/kb/extra/development.md +171 -0
  18. package/kb/extra/development.zh.md +171 -0
  19. package/kb/extra/event-producer-consumer.md +76 -0
  20. package/kb/extra/event-producer-consumer.zh.md +78 -0
  21. package/kb/extra/glossary.md +45 -0
  22. package/kb/extra/glossary.zh.md +45 -0
  23. package/kb/extra/graph-atlas.md +24 -0
  24. package/kb/extra/graph-atlas.zh.md +26 -0
  25. package/kb/extra/i18n/README.md +60 -0
  26. package/kb/extra/i18n/README.zh.md +60 -0
  27. package/kb/extra/i18n/style-samples.md +87 -0
  28. package/kb/extra/i18n/terminology.md +214 -0
  29. package/kb/extra/i18n/translation-prompt.md +263 -0
  30. package/kb/extra/i18n/translation-rules.md +69 -0
  31. package/kb/extra/i18n/translation-rules.zh.md +69 -0
  32. package/kb/extra/module-graph.md +1641 -0
  33. package/kb/extra/module-graph.zh.md +1643 -0
  34. package/kb/extra/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  35. package/kb/extra/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  36. package/kb/extra/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  37. package/kb/extra/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  38. package/kb/extra/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  39. package/kb/extra/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  40. package/kb/extra/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  41. package/kb/extra/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  42. package/kb/extra/postmortem/README.md +18 -0
  43. package/kb/extra/postmortem/README.zh.md +18 -0
  44. package/kb/extra/rescope.md +53 -0
  45. package/kb/extra/rescope.zh.md +53 -0
  46. package/kb/extra/subsystems/attachment.md +125 -0
  47. package/kb/extra/subsystems/attachment.zh.md +125 -0
  48. package/kb/extra/subsystems/extensions.md +364 -0
  49. package/kb/extra/subsystems/extensions.zh.md +364 -0
  50. package/kb/extra/subsystems/feedback.md +266 -0
  51. package/kb/extra/subsystems/feedback.zh.md +266 -0
  52. package/kb/extra/testing.md +49 -0
  53. package/kb/extra/testing.zh.md +49 -0
  54. package/kb/extra/web-styling.md +25 -0
  55. package/kb/extra/web-styling.zh.md +25 -0
  56. package/kb/meta/search-index.json +1328 -0
  57. package/kb/meta/site-pages.txt +168 -0
  58. package/kb/meta/source.json +13 -0
  59. package/kb/meta/topics.md +75 -0
  60. package/kb/site/develop/basic/config.md +108 -0
  61. package/kb/site/develop/basic/index.md +146 -0
  62. package/kb/site/develop/basic/publish.md +185 -0
  63. package/kb/site/develop/basic/tool.md +54 -0
  64. package/kb/site/develop/cordis-tutorial/01-first-plugin.md +95 -0
  65. package/kb/site/develop/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  66. package/kb/site/develop/cordis-tutorial/03-services.md +98 -0
  67. package/kb/site/develop/cordis-tutorial/04-events.md +144 -0
  68. package/kb/site/develop/cordis-tutorial/05-config.md +84 -0
  69. package/kb/site/develop/cordis-tutorial/06-composition-and-hmr.md +113 -0
  70. package/kb/site/develop/cordis-tutorial/07-into-the-harness.md +107 -0
  71. package/kb/site/develop/cordis-tutorial/index.md +62 -0
  72. package/kb/site/develop/framework/events.md +145 -0
  73. package/kb/site/develop/framework/index.md +139 -0
  74. package/kb/site/develop/framework/service.md +152 -0
  75. package/kb/site/develop/practice/index.md +157 -0
  76. package/kb/site/develop/practice/llm-adapter.md +190 -0
  77. package/kb/site/en/develop/basic/config.md +108 -0
  78. package/kb/site/en/develop/basic/index.md +146 -0
  79. package/kb/site/en/develop/basic/publish.md +185 -0
  80. package/kb/site/en/develop/basic/tool.md +54 -0
  81. package/kb/site/en/develop/cordis-tutorial/01-first-plugin.md +95 -0
  82. package/kb/site/en/develop/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  83. package/kb/site/en/develop/cordis-tutorial/03-services.md +98 -0
  84. package/kb/site/en/develop/cordis-tutorial/04-events.md +144 -0
  85. package/kb/site/en/develop/cordis-tutorial/05-config.md +84 -0
  86. package/kb/site/en/develop/cordis-tutorial/06-composition-and-hmr.md +113 -0
  87. package/kb/site/en/develop/cordis-tutorial/07-into-the-harness.md +107 -0
  88. package/kb/site/en/develop/cordis-tutorial/index.md +60 -0
  89. package/kb/site/en/develop/framework/events.md +145 -0
  90. package/kb/site/en/develop/framework/index.md +139 -0
  91. package/kb/site/en/develop/framework/service.md +150 -0
  92. package/kb/site/en/develop/practice/index.md +157 -0
  93. package/kb/site/en/develop/practice/llm-adapter.md +190 -0
  94. package/kb/site/en/guide/providers-custom-form.png +0 -0
  95. package/kb/site/en/guide/providers-models-page.png +0 -0
  96. package/kb/site/en/guide/providers.md +100 -0
  97. package/kb/site/en/guide/python-sdk.md +106 -0
  98. package/kb/site/en/guide/quickstart.md +32 -0
  99. package/kb/site/en/index.md +8 -0
  100. package/kb/site/en/reference/agent-lifecycle.md +86 -0
  101. package/kb/site/en/reference/capability-seams.md +475 -0
  102. package/kb/site/en/reference/config-catalog.md +3155 -0
  103. package/kb/site/en/reference/cookbook/adding-a-conversation-node.md +235 -0
  104. package/kb/site/en/reference/cookbook/adding-a-package.md +120 -0
  105. package/kb/site/en/reference/cookbook/adding-a-settings-card.md +102 -0
  106. package/kb/site/en/reference/cookbook/adding-a-tool.md +96 -0
  107. package/kb/site/en/reference/cookbook/adding-an-llm-adapter.md +45 -0
  108. package/kb/site/en/reference/cookbook/extension-cookbook.md +131 -0
  109. package/kb/site/en/reference/cordis-api/context.md +368 -0
  110. package/kb/site/en/reference/cordis-api/events.md +211 -0
  111. package/kb/site/en/reference/cordis-api/fiber.md +379 -0
  112. package/kb/site/en/reference/cordis-api/inherited.md +43 -0
  113. package/kb/site/en/reference/cordis-api/registry.md +156 -0
  114. package/kb/site/en/reference/cordis-api/service.md +106 -0
  115. package/kb/site/en/reference/cordis-primer.md +46 -0
  116. package/kb/site/en/reference/index.md +131 -0
  117. package/kb/site/en/reference/persistence-catalog.md +949 -0
  118. package/kb/site/en/reference/subsystems/approval.md +173 -0
  119. package/kb/site/en/reference/subsystems/client-modules.md +121 -0
  120. package/kb/site/en/reference/subsystems/code-runtime.md +194 -0
  121. package/kb/site/en/reference/subsystems/commands.md +190 -0
  122. package/kb/site/en/reference/subsystems/compaction.md +241 -0
  123. package/kb/site/en/reference/subsystems/core.md +1073 -0
  124. package/kb/site/en/reference/subsystems/credentials.md +136 -0
  125. package/kb/site/en/reference/subsystems/filesystem.md +498 -0
  126. package/kb/site/en/reference/subsystems/goal.md +280 -0
  127. package/kb/site/en/reference/subsystems/index.md +58 -0
  128. package/kb/site/en/reference/subsystems/invariants.md +91 -0
  129. package/kb/site/en/reference/subsystems/jobs.md +293 -0
  130. package/kb/site/en/reference/subsystems/llm-streaming.md +920 -0
  131. package/kb/site/en/reference/subsystems/lsp.md +205 -0
  132. package/kb/site/en/reference/subsystems/permission-presets.md +134 -0
  133. package/kb/site/en/reference/subsystems/persistence.md +388 -0
  134. package/kb/site/en/reference/subsystems/plan.md +90 -0
  135. package/kb/site/en/reference/subsystems/sandbox.md +221 -0
  136. package/kb/site/en/reference/subsystems/schedule.md +189 -0
  137. package/kb/site/en/reference/subsystems/scope.md +62 -0
  138. package/kb/site/en/reference/subsystems/session-projection.md +265 -0
  139. package/kb/site/en/reference/subsystems/session-query.md +498 -0
  140. package/kb/site/en/reference/subsystems/session-reference.md +111 -0
  141. package/kb/site/en/reference/subsystems/session-telemetry.md +197 -0
  142. package/kb/site/en/reference/subsystems/session-title.md +207 -0
  143. package/kb/site/en/reference/subsystems/session.md +852 -0
  144. package/kb/site/en/reference/subsystems/settings.md +313 -0
  145. package/kb/site/en/reference/subsystems/shell.md +306 -0
  146. package/kb/site/en/reference/subsystems/skills.md +334 -0
  147. package/kb/site/en/reference/subsystems/spill.md +120 -0
  148. package/kb/site/en/reference/subsystems/storage.md +232 -0
  149. package/kb/site/en/reference/subsystems/subagent.md +737 -0
  150. package/kb/site/en/reference/subsystems/subprocess.md +327 -0
  151. package/kb/site/en/reference/subsystems/system-prompt.md +210 -0
  152. package/kb/site/en/reference/subsystems/terminal.md +187 -0
  153. package/kb/site/en/reference/subsystems/token-meter.md +93 -0
  154. package/kb/site/en/reference/subsystems/tools.md +723 -0
  155. package/kb/site/en/reference/subsystems/typert.md +339 -0
  156. package/kb/site/en/reference/subsystems/user-questions.md +181 -0
  157. package/kb/site/en/reference/subsystems/web-server.md +111 -0
  158. package/kb/site/en/reference/subsystems/web.md +202 -0
  159. package/kb/site/en/reference/subsystems/workflow.md +281 -0
  160. package/kb/site/en/reference/subsystems/workspace.md +231 -0
  161. package/kb/site/en/reference/tool-catalog.md +1877 -0
  162. package/kb/site/en/reference/tool-execution-pipeline.md +66 -0
  163. package/kb/site/guide/providers-custom-form.zh.png +0 -0
  164. package/kb/site/guide/providers-models-page.zh.png +0 -0
  165. package/kb/site/guide/providers.md +100 -0
  166. package/kb/site/guide/python-sdk.md +106 -0
  167. package/kb/site/guide/quickstart.md +32 -0
  168. package/kb/site/index.md +8 -0
  169. package/kb/site/reference/agent-lifecycle.md +86 -0
  170. package/kb/site/reference/capability-seams.md +475 -0
  171. package/kb/site/reference/config-catalog.md +3154 -0
  172. package/kb/site/reference/cookbook/adding-a-conversation-node.md +235 -0
  173. package/kb/site/reference/cookbook/adding-a-package.md +120 -0
  174. package/kb/site/reference/cookbook/adding-a-settings-card.md +102 -0
  175. package/kb/site/reference/cookbook/adding-a-tool.md +98 -0
  176. package/kb/site/reference/cookbook/adding-an-llm-adapter.md +45 -0
  177. package/kb/site/reference/cookbook/extension-cookbook.md +133 -0
  178. package/kb/site/reference/cordis-api/context.md +368 -0
  179. package/kb/site/reference/cordis-api/events.md +211 -0
  180. package/kb/site/reference/cordis-api/fiber.md +379 -0
  181. package/kb/site/reference/cordis-api/inherited.md +43 -0
  182. package/kb/site/reference/cordis-api/registry.md +156 -0
  183. package/kb/site/reference/cordis-api/service.md +106 -0
  184. package/kb/site/reference/cordis-primer.md +52 -0
  185. package/kb/site/reference/index.md +135 -0
  186. package/kb/site/reference/persistence-catalog.md +949 -0
  187. package/kb/site/reference/subsystems/approval.md +173 -0
  188. package/kb/site/reference/subsystems/client-modules.md +121 -0
  189. package/kb/site/reference/subsystems/code-runtime.md +194 -0
  190. package/kb/site/reference/subsystems/commands.md +190 -0
  191. package/kb/site/reference/subsystems/compaction.md +241 -0
  192. package/kb/site/reference/subsystems/core.md +1081 -0
  193. package/kb/site/reference/subsystems/credentials.md +136 -0
  194. package/kb/site/reference/subsystems/filesystem.md +498 -0
  195. package/kb/site/reference/subsystems/goal.md +280 -0
  196. package/kb/site/reference/subsystems/index.md +58 -0
  197. package/kb/site/reference/subsystems/invariants.md +91 -0
  198. package/kb/site/reference/subsystems/jobs.md +293 -0
  199. package/kb/site/reference/subsystems/llm-streaming.md +926 -0
  200. package/kb/site/reference/subsystems/lsp.md +205 -0
  201. package/kb/site/reference/subsystems/permission-presets.md +134 -0
  202. package/kb/site/reference/subsystems/persistence.md +388 -0
  203. package/kb/site/reference/subsystems/plan.md +90 -0
  204. package/kb/site/reference/subsystems/sandbox.md +221 -0
  205. package/kb/site/reference/subsystems/schedule.md +189 -0
  206. package/kb/site/reference/subsystems/scope.md +62 -0
  207. package/kb/site/reference/subsystems/session-projection.md +265 -0
  208. package/kb/site/reference/subsystems/session-query.md +498 -0
  209. package/kb/site/reference/subsystems/session-reference.md +111 -0
  210. package/kb/site/reference/subsystems/session-telemetry.md +197 -0
  211. package/kb/site/reference/subsystems/session-title.md +207 -0
  212. package/kb/site/reference/subsystems/session.md +854 -0
  213. package/kb/site/reference/subsystems/settings.md +313 -0
  214. package/kb/site/reference/subsystems/shell.md +306 -0
  215. package/kb/site/reference/subsystems/skills.md +334 -0
  216. package/kb/site/reference/subsystems/spill.md +120 -0
  217. package/kb/site/reference/subsystems/storage.md +232 -0
  218. package/kb/site/reference/subsystems/subagent.md +739 -0
  219. package/kb/site/reference/subsystems/subprocess.md +327 -0
  220. package/kb/site/reference/subsystems/system-prompt.md +210 -0
  221. package/kb/site/reference/subsystems/terminal.md +187 -0
  222. package/kb/site/reference/subsystems/token-meter.md +93 -0
  223. package/kb/site/reference/subsystems/tools.md +723 -0
  224. package/kb/site/reference/subsystems/typert.md +339 -0
  225. package/kb/site/reference/subsystems/user-questions.md +181 -0
  226. package/kb/site/reference/subsystems/web-server.md +111 -0
  227. package/kb/site/reference/subsystems/web.md +202 -0
  228. package/kb/site/reference/subsystems/workflow.md +281 -0
  229. package/kb/site/reference/subsystems/workspace.md +231 -0
  230. package/kb/site/reference/tool-catalog.md +1880 -0
  231. package/kb/site/reference/tool-execution-pipeline.md +66 -0
  232. package/package.json +40 -0
  233. package/scripts/rebuild-index.mjs +88 -0
  234. package/skills/dsh-plugin-dev-kb.md +66 -0
@@ -0,0 +1,133 @@
1
+ ---
2
+ editSource: "docs/cookbook/extension-cookbook.zh.md"
3
+ ---
4
+
5
+ # 实操手册:扩展插件形态
6
+
7
+ harness 扩展的参考模式。代码片段省略了 import 和辅助实现,无法直接复制运行。具体编写路径见[包检查清单](./adding-a-package.md)、[第一个工具教程](../../develop/basic/tool.md)、[工具参考](./adding-a-tool.md)和 [LLM(大语言模型)适配器指南](./adding-an-llm-adapter.md);系统与扩展点映射由[架构文档](../index.md)负责。
8
+
9
+ ## 工具插件
10
+
11
+ 工具在 `ctx.tools` 上注册。带注解的 `defineTool` 示例(类型化的 `execute` 参数、结果构造、`run_in_background` 模式)见 [adding-a-tool.md](./adding-a-tool.md)——该指南是工具定义的真源。`ctx.tools.register()` 也直接接受原始 JSON Schema `ToolDefinition`(MCP 来源的工具就是这样到达的);`defineTool` 是第一方工具使用的类型化辅助函数。
12
+
13
+ <a id="a-hook-plugin-permission-gate-example"></a>
14
+
15
+ ## 钩子插件(以权限门禁为例)
16
+
17
+ 这个权限门禁是钩子插件的一个示例。它从 `tools/pre-execute` 门禁返回一个类型化的决策,用于允许或拒绝一次调用;沙箱、权限和 plan-mode 插件都可以使用该扩展点。钩子插件也可以拦截其他扩展点,本身并不等同于权限门禁。「原生钩子」是在拦截点上运行的普通 Cordis 插件,不需要外部协议。
18
+
19
+ ```ts
20
+ import type { Context } from '@deepseek-ai/cordis'
21
+ import type { PreToolDecision, ToolExecution } from '@deepseek-ai/dsh-tools'
22
+
23
+ declare function isAllowed(exec: ToolExecution): Promise<boolean>
24
+
25
+ export const name = 'permission-gate'
26
+
27
+ export function apply(ctx: Context) {
28
+ ctx.on('tools/pre-execute', async (exec, next): Promise<PreToolDecision> => {
29
+ if (!(await isAllowed(exec))) {
30
+ return { kind: 'deny', reason: 'Denied by policy.' }
31
+ }
32
+ return next()
33
+ })
34
+ }
35
+ ```
36
+
37
+ 这个 waterfall(瀑布式事件)是可重排的策略层。当不变式需要单调的最终拒绝时使用 `ctx.tools.guard()`;当插件需要包裹实际分发生命周期时(超时/重试/指标;仅 `exec.signal` 可替换)使用 `tools/execute`;显式结果变换使用 `tools/post-execute`;对不可变最终结果的受限观察使用 `tools/result`。选择规则见[添加工具指南](./adding-a-tool.md#execution-policy-and-observation)。
38
+
39
+ ## UI 插件
40
+
41
+ UI 插件从 `session/event` 事件流渲染(助手 token 流以 `assistant/chunk` 形式到达,加上轮次/步骤边界与工具活动),并通过 `agent.followup()` / `agent.steer()` 将输入驱动回去。如果浏览器插件要向内建 Web Client 贡献业务行,则应注册 `ConversationNodeDefinition` 与 keyed Chat renderer;具体步骤见 [Conversation Node 指南](./adding-a-conversation-node.md)。
42
+
43
+ ```ts
44
+ import type { Context } from '@deepseek-ai/cordis'
45
+ import { createUserMessage } from '@deepseek-ai/dsh-llm'
46
+ import { SessionId } from '@deepseek-ai/dsh-session'
47
+
48
+ declare function render(text: string): void
49
+ declare function onUserInput(handler: (text: string) => void): void
50
+
51
+ export const name = 'my-ui'
52
+ export const inject = ['agents']
53
+
54
+ export function apply(ctx: Context) {
55
+ ctx.on('session/event', (_session, event) => {
56
+ if (event.type === 'assistant/chunk' && event.data.chunk.type === 'text-delta') {
57
+ render(event.data.chunk.text)
58
+ }
59
+ })
60
+ onUserInput(text => ctx.agents.get(SessionId('client-session'))?.followup(createUserMessage({
61
+ content: [{ type: 'text', text }],
62
+ source: { kind: 'user' },
63
+ })))
64
+ }
65
+ ```
66
+
67
+ ## 外部协议驱动
68
+
69
+ *协议驱动*将协议对端接入 `ctx.agents`;它可以服务于 UI 或自动化客户端。stdio 驱动拥有 stdout,通过工厂创建或恢复 agent(智能体),并将协议请求映射为 `followup()` 或 `cancel()`。底层提示词请求返回其持久入队回执;它不会通过关联 `MessageId` 与 `turn/end` 获得结果。整个 agent 的状态应单独发布。自动化方法可以从回执等待到下一次 idle,并概括这一显式拥有的区间;UI 通常则会持续观察开放式事件流。通过 `AgentHandle.dispose()` 拆除 agent,以使 dispose(资源释放)达到完全停稳。
70
+
71
+ [`packages/acp/acp`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/acp/acp) 是仅面向自动化的完整示例:它通过 ACP(Agent Client Protocol)JSON-RPC stdio 提供全新文本会话,发出已提交的助手文本,并为其拥有的 agent 注册一次性机器权限应答器。其 [README](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/acp/acp/README.md) 定义确切的方法、事件顺序和生命周期约定。
72
+
73
+ ```ts
74
+ import type { Context } from '@deepseek-ai/cordis'
75
+
76
+ export const name = 'my-protocol-bridge'
77
+ export const inject = ['agents', 'sessions', 'sessionPersistence']
78
+
79
+ export function apply(ctx: Context) {
80
+ // Stream every logged assistant text/reasoning delta out to the client.
81
+ ctx.on('session/event', (_session, event) => {
82
+ if (event.type === 'assistant/chunk') {
83
+ const chunk = event.data.chunk
84
+ if (chunk.type === 'text-delta') {
85
+ // sendToClient({ kind: 'message_chunk', text: chunk.text })
86
+ }
87
+ }
88
+ })
89
+ // Inbound "prompt": create/resume an agent, feed it, and return its enqueue receipt.
90
+ // Whole-agent status is a separate notification; no turn end belongs to this prompt.
91
+ // Teardown reaches quiescence via AgentHandle.dispose() (stop + await exit).
92
+ }
93
+ ```
94
+
95
+ ## 可运行的组装示例
96
+
97
+ 可运行叶子从 `examples/*/cordis.yml` 加载各自的插件树;根目录的 `demo:*` 脚本和这些叶子目录是权威清单。产品 `dsh` 启动器负责 Web 和一次性 headless 执行,ACP 叶子使用 [`@deepseek-ai/dsh-acp-demo`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/examples/acp-demo),JSON-RPC 叶子使用 [`@deepseek-ai/dsh-sdk-jsonrpc-demo`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/examples/jsonrpc-demo)。headless 快照叶节点显式挂载 [`@deepseek-ai/dsh-agent-spine-demo`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/examples/agent-spine-demo) 和 JSONL 持久化,再通过示例自有的测试 fixture(测试前置数据)驱动这些组件,而不是通过已交付的 app 包。
98
+
99
+ ## 功能→机制映射
100
+
101
+ 每个产品功能都映射到一个文档化扩展点上的监听器——微内核声明由此可验证([微内核 Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-06-11-microkernel-event-taxonomy.md))。没有任何一行修改循环本身。
102
+
103
+ `system-prompt/assemble` 是一个专家协作式的整体装配变换:其返回的装配结果具有权威性,因此监听器作者有责任保留活跃的 Code Mode 和结构化输出协议的贡献。对于需要在展示、查找和执行之间保持对齐的工具过滤,优先使用 `ctx.tools.restrict()`。
104
+
105
+ | 产品功能 | 插件机制 |
106
+ |---|---|
107
+ | 钩子系统(用户级 + 项目级) | `agent/session-start`、`agent/pre-step`、`agent/request`、`tools/pre-execute`、`tools/post-execute` 和 `agent/turn-stopping` 上的监听器;waterfall 返回类型化决策,`agent/turn-stopping` 则可通过 steering(中途引导)触发下一步;`dsh-hooks-claude-code` / `dsh-hooks-codex` 桥接器将钩子配置文件映射到这些扩展点上 |
108
+ | `/goal` | `ctx.goals` 管理持久状态,`dsh-goal-round-driver` 通过公共 `Agent` 调度同会话 Round,独立的命令/工具生产方分别提供人类/模型控制 |
109
+ | `/loop` | 在 `turn/end` 会话事件上 `followup()` 下一次迭代;或强制继续 |
110
+ | 动态工作流 | `ctx.workflowEngine` + worker-thread 引擎 + `workflow` 工具;结构化的进程内子任务通过作用域化的提示词/工具注册、单调工具守卫、最终 `tools/result` 提交(包括外层 `run_code`)和结构化输出执行的单调 `concludeTurn()` 标记来强制输出 |
111
+ | 排队消息 + steering | 核心 `Agent.followup()` / `Agent.steer()` |
112
+ | 上下文压缩(context compaction)(自动 + 手动) | `ctx.compaction` seam + `dsh-compaction-basic`;自动压力检查运行在串行 `agent/pre-step`,标准的溢出恢复机制运行在 `agent/request-error`,手动调用方使用同一个压缩服务([压缩 Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md)) |
113
+ | 系统提示词可配置性 | `ctx.systemPrompt.section()`,支持排序与作用域局部覆盖 |
114
+ | AGENTS.md(根目录) | 一个读取该文件的 section 提供方 |
115
+ | AGENTS.md(子目录,按需触发)+ 文件变更通知 | 从 watcher / 工具结果监听器调用 `agent.inject()` |
116
+ | 内置工具 | `ctx.tools.register()`;schema 自动流入装配——`dsh-tool-*` 系列(bash、fs、web、subagent、todo)是已交付的示例 |
117
+ | ToolSearch / 渐进式披露 | 当可见集变化时替换一个作用域化的 `ctx.tools.restrict()` 注册;注册表保持展示、查找和执行三者对齐 |
118
+ | 工具截止时间 / 重试 / 指标 | 用 `tools/execute` 包裹核心分发;包装层可替换 `exec.signal`、委托执行,并在同一词法生命周期内检视规范化结果 |
119
+ | 最终工具结果指标 / 审计 / 捕获 | 用 `tools/result` 观察不可变的权威结果;仅当插件需要变换结果或附加上下文时才使用 `tools/post-execute` |
120
+ | 单调终端轮次策略 | 从成功的终端工具调用 `ToolExecution.concludeTurn()`;同一响应中后续工具调用仍可由守卫阻止,循环在该步骤后停止 |
121
+ | 子进程沙箱(landlock / sandbox-exec) | 通过 `dsh-bash-sandbox` 使用 `ctx.sandbox` 后端;能力级别的拒绝使用 `tools/pre-execute` |
122
+ | 权限系统 / AskUserQuestion | 从 `tools/pre-execute` 返回 `ask` 并通过 `ctx.approval` 应答;为普通用户提问注册一个独立的面向模型的 ask 工具 |
123
+ | Plan mode | [`@deepseek-ai/dsh-plan-mode`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/plan/plan-mode/README.md):落日志的 `plan/mode` 状态、`plan:policy` 引导段、`/plan [message]` 入口、`/plan off` 直接退出,以及经用户评审的 `exit_plan_mode` 出口;强制约束留在独立的沙箱/审批轴上 |
124
+ | subagent 委派 | `ctx.subagents` 提供方注册表(`dsh-subagent-spawn-in-process`/`-fork`/`-acp`/`-codex`/`-claude-code`/`-dsh-sdk`)+ `dsh-tool-subagent` 向模型暴露一个已配置的提供方 |
125
+ | MCP | 每个服务器一个插件:发现工具 → `ctx.tools.register()` |
126
+ | skill(技能) | section + 工具注册;调用时通过 `inject()` 注入 skill 内容 |
127
+ | 记忆 | section 提供方 + 工具 |
128
+ | 定时任务(cron) | 插件注册面向模型的调度工具;定时器触发 → 空闲时 `followup(…, {source: {kind: 'cron', …}})`/忙碌时 `inject()` 通知 |
129
+ | UI(GUI;CLI(命令行界面)输出 JSONL) | 监听 `session/event`(助手分片、边界、工具活动);输入 → `followup()` |
130
+ | Web Client Chat 业务节点 | 注册 `ConversationNodeDefinition` 与 `conversation.chat.node` keyed renderer |
131
+ | 遥测 / 可回放 trace | `session/event` → JSONL;回放 = `sessions.create(id, { seed })` |
132
+ | 模型适配器 | 通过 `registerAdapter` 注册 `LlmAdapter` 子类(`dsh-llm-deepseek`、`dsh-llm-pi-ai`) |
133
+ | 插件热重载 | 每个注册都是一个 `ctx.effect` → 随仓库提供的 HMR(热模块替换)直接生效 |
@@ -0,0 +1,368 @@
1
+ ---
2
+ editSource: "docs/cordis-api/context.zh.md"
3
+ ---
4
+
5
+ <!-- 英文源文件由 scripts/gen-cordis-catalog.ts 生成;本中文文件是通过双语配对维护的经评审对侧。
6
+ 更新时先运行 `pnpm run gen-cordis-catalog` 更新英文,再更新本文件并运行 `pnpm run verify-translation-pairing --write docs/cordis-api/context.md` 重新记录配对。 -->
7
+
8
+ # 上下文
9
+
10
+ 上下文是 Cordis 的核心对象:所有服务、事件和生命周期 API 都通过 `ctx` 访问。事件方法见[事件](./events.md),副作用与当前 fiber 见 [Fiber](./fiber.md),插件加载见[注册表](./registry.md)。
11
+
12
+ Cordis 插件的根依赖容器和子依赖容器。
13
+
14
+ 上下文是一个代理:普通属性读取通过服务解析器进行,而 `extend()`、`isolate()` 和 `intercept()` 会创建有作用域的子上下文,且不修改其父上下文。
15
+
16
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L42)
17
+
18
+ ### ctx.extend(meta?)
19
+
20
+ ```ts cordis-catalog
21
+ /**
22
+ * Create a child context with extra metadata on top of the current scope.
23
+ *
24
+ * The child prototypally inherits every property of this context; own
25
+ * properties of `meta` shadow the inherited ones. The parent is not mutated.
26
+ *
27
+ * @param meta — own properties (including symbol keys) to define on the child.
28
+ * @returns a child context inheriting from this one.
29
+ */
30
+ extend(meta = {}): this
31
+ ```
32
+
33
+ 在当前作用域之上创建一个带有额外元数据的子上下文。
34
+
35
+ 子上下文通过原型继承当前上下文的所有属性;`meta` 的自有属性会遮蔽继承的同名属性。父上下文不会被修改。
36
+
37
+ - `meta`:要在子上下文上定义的自有属性,包括以 symbol 为键的属性。
38
+
39
+ **返回**继承自当前上下文的子上下文。
40
+
41
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L99)
42
+
43
+ ### ctx.isolate(name, label?)
44
+
45
+ ```ts cordis-catalog
46
+ /**
47
+ * Create a child context with an independent service scope for `name`.
48
+ *
49
+ * Below the returned context, reads and writes of the service `name`
50
+ * resolve against the new label instead of the parent's, so a different
51
+ * implementation can be provided without affecting the parent scope.
52
+ * Passing the same `label` to two `isolate()` calls joins their scopes.
53
+ *
54
+ * @param name — the service name to isolate.
55
+ * @param label — scope label to join; defaults to a fresh unique symbol.
56
+ * @returns a child context whose `name` service resolves in the new scope.
57
+ */
58
+ isolate(name: string, label?: symbol)
59
+ ```
60
+
61
+ 创建一个子上下文,使 `name` 拥有独立的服务作用域。
62
+
63
+ 在返回的上下文之下,对服务 `name` 的读写会根据新标签解析,而不再根据父上下文的标签解析,因此可以提供不同的实现而不影响父作用域。将同一个 `label` 传给两次 `isolate()` 调用,可使二者加入同一作用域。
64
+
65
+ - `name`:要隔离的服务名称。
66
+ - `label`:要加入的作用域标签;默认为一个新建的唯一 symbol。
67
+
68
+ **返回**一个子上下文,其 `name` 服务在新作用域中解析。
69
+
70
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L121)
71
+
72
+ ### ctx.intercept(name, config)
73
+
74
+ ```ts cordis-catalog
75
+ /**
76
+ * Add service-specific intercept config for plugins started below this
77
+ * context.
78
+ *
79
+ * Plugins loaded under the returned context see `config` merged into the
80
+ * service's resolved config (ancestor entries first; see
81
+ * `Service[symbols.resolveConfig]`). The parent context is not affected.
82
+ *
83
+ * @param name — the service name whose config to intercept.
84
+ * @param config — the intercept config to merge for that service.
85
+ * @returns a child context carrying the additional intercept entry.
86
+ */
87
+ intercept<K extends InjectKey>(name: K, config: Context[K] extends { [symbols.config]: infer T } ? T : never): this
88
+ intercept(name: string, config: any): this
89
+ ```
90
+
91
+ 为在此上下文之下启动的插件添加服务专属的拦截配置。
92
+
93
+ 在返回的上下文下加载的插件会看到 `config` 已合并到服务解析后的配置中(祖先条目在前;见 `Service[symbols.resolveConfig]`)。父上下文不受影响。
94
+
95
+ - `name`:要拦截其配置的服务名称。
96
+ - `config`:要为该服务合并的拦截配置。
97
+
98
+ **返回**一个携带额外拦截条目的子上下文。
99
+
100
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L139)
101
+
102
+ ### ctx.root
103
+
104
+ ```ts cordis-catalog
105
+ /** The root context of the application (every child context shares it). @experimental */
106
+ root: this
107
+ ```
108
+
109
+ 应用的根上下文,所有子上下文均共享它。@experimental
110
+
111
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L22)
112
+
113
+ ### ctx.baseUrl
114
+
115
+ ```ts cordis-catalog
116
+ /** Base URL used to resolve relative plugin/module specifiers, if the runtime sets one. */
117
+ baseUrl?: string
118
+ ```
119
+
120
+ 用于解析相对插件/模块说明符的基础 URL,前提是运行时设置了该值。
121
+
122
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L24)
123
+
124
+ ### ctx.events
125
+
126
+ ```ts cordis-catalog
127
+ /** The event bus. Its methods are also mixed onto `ctx` (`ctx.on`, `ctx.emit`, ...). */
128
+ events: EventsService
129
+ ```
130
+
131
+ 事件总线。它的方法也会混入 `ctx`(`ctx.on`、`ctx.emit` 等)。
132
+
133
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L26)
134
+
135
+ ### ctx.logger
136
+
137
+ ```ts cordis-catalog
138
+ /** The logging service. Call `ctx.logger(name)` for a named logger. */
139
+ logger: LoggerService
140
+ ```
141
+
142
+ 日志服务。调用 `ctx.logger(name)` 可获取具名 logger。
143
+
144
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L28)
145
+
146
+ ### ctx.reflect
147
+
148
+ ```ts cordis-catalog
149
+ /** The reflection layer backing the context proxy (`ctx.get`, `ctx.provide`, ...). */
150
+ reflect: ReflectService
151
+ ```
152
+
153
+ 为上下文代理提供支持的反射层(`ctx.get`、`ctx.provide` 等)。
154
+
155
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L30)
156
+
157
+ ### ctx.registry
158
+
159
+ ```ts cordis-catalog
160
+ /** The plugin registry. Its methods are mixed onto `ctx` (`ctx.plugin`, `ctx.inject`). */
161
+ registry: RegistryService
162
+ ```
163
+
164
+ 插件注册表。它的方法会混入 `ctx`(`ctx.plugin`、`ctx.inject`)。
165
+
166
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L32)
167
+
168
+ ## 静态成员
169
+
170
+ ### Context.effect
171
+
172
+ ```ts cordis-catalog
173
+ /** Symbol key under which a disposer exposes its {@link EffectMeta} diagnostics tree. */
174
+ static readonly effect: unique symbol
175
+ ```
176
+
177
+ 资源释放函数用于公开其 EffectMeta 诊断树的 symbol 键。
178
+
179
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L44)
180
+
181
+ ### Context.filter
182
+
183
+ ```ts cordis-catalog
184
+ /** Symbol key for a context's listener filter, consulted on every event dispatch. */
185
+ static readonly filter: unique symbol
186
+ ```
187
+
188
+ 上下文监听器过滤器的 symbol 键,每次分派事件时都会查询该过滤器。
189
+
190
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L46)
191
+
192
+ ### Context.isolate
193
+
194
+ ```ts cordis-catalog
195
+ /** Symbol key of the isolation map (see the `Context[symbols.isolate]` property). */
196
+ static readonly isolate: unique symbol
197
+ ```
198
+
199
+ 隔离映射的 symbol 键(见 `Context[symbols.isolate]` 属性)。
200
+
201
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L48)
202
+
203
+ ### Context.intercept
204
+
205
+ ```ts cordis-catalog
206
+ /** Symbol key of the intercept map (see the `Context[symbols.intercept]` property). */
207
+ static readonly intercept: unique symbol
208
+ ```
209
+
210
+ 拦截映射的 symbol 键(见 `Context[symbols.intercept]` 属性)。
211
+
212
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L50)
213
+
214
+ ### Context.is(value)
215
+
216
+ ```ts cordis-catalog
217
+ /**
218
+ * Returns true for Cordis context proxies and context prototypes.
219
+ *
220
+ * Works across realms and across multiple copies of cordis, because the
221
+ * brand is keyed by a global symbol rather than by `instanceof`.
222
+ *
223
+ * @param value — the value to test.
224
+ * @returns `true` if `value` is a Cordis context, narrowing its type.
225
+ */
226
+ static is(value: any): value is Context
227
+ ```
228
+
229
+ 对于 Cordis 上下文代理和上下文原型,返回 true。
230
+
231
+ 此方法可跨 realm 和多个 cordis 副本工作,因为其品牌标识以全局 symbol 为键,而不是通过 `instanceof` 判断。
232
+
233
+ - `value`:要测试的值。
234
+
235
+ **返回** `true` 时,`value` 是 Cordis 上下文,并会收窄其类型。
236
+
237
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/context.ts#L61)
238
+
239
+ ## 服务存储与混入
240
+
241
+ ### ctx.get(name, strict?)
242
+
243
+ ```ts cordis-catalog
244
+ /**
245
+ * Read a service from the store without the inject requirement.
246
+ *
247
+ * @param name — the service name.
248
+ * @param strict — when `true` (default), only return implementations
249
+ * whose providing fiber is currently active.
250
+ * @returns the service value, or `undefined` when not (yet) provided.
251
+ */
252
+ get<K extends string & keyof this>(name: K, strict?: boolean): undefined | this[K]
253
+ get(name: string, strict?: boolean): any
254
+ ```
255
+
256
+ 从存储中读取服务,无需满足注入要求。
257
+
258
+ - `name`:服务名称。
259
+ - `strict`:设为 `true`(默认值)时,仅返回其提供方 fiber 当前处于活动状态的实现。
260
+
261
+ **返回**服务值;如果尚未提供,则返回 `undefined`。
262
+
263
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/reflect.ts#L17)
264
+
265
+ ### ctx.set(name, value)
266
+
267
+ ```ts cordis-catalog
268
+ /**
269
+ * Overwrite a provided service's value.
270
+ *
271
+ * Only the fiber that provided the service may set it; setting an
272
+ * unprovided name throws.
273
+ *
274
+ * @param name — the service name.
275
+ * @param value — the new service value.
276
+ */
277
+ set<K extends string & keyof this>(name: K, value: undefined | this[K]): void
278
+ set(name: string, value: any): void
279
+ ```
280
+
281
+ 覆盖已提供服务的值。
282
+
283
+ 只有提供该服务的 fiber 才能设置它;设置尚未提供的名称会抛出异常。
284
+
285
+ - `name`:服务名称。
286
+ - `value`:新的服务值。
287
+
288
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/reflect.ts#L29)
289
+
290
+ ### ctx.provide(name, value)
291
+
292
+ ```ts cordis-catalog
293
+ /**
294
+ * Register a service implementation owned by the current fiber.
295
+ *
296
+ * The service becomes visible to dependents in the same isolation scope
297
+ * once the fiber is active; it is unregistered (waking dependents) when
298
+ * the returned disposer runs or the fiber unloads. Throws if the name is
299
+ * already provided in this scope or declared as an accessor.
300
+ *
301
+ * @param name — the service name.
302
+ * @param value — the service value.
303
+ * @returns a disposer that unregisters the service.
304
+ */
305
+ provide<K extends string & keyof this>(name: K, value: undefined | this[K]): () => void
306
+ provide(name: string, value?: any): () => void
307
+ ```
308
+
309
+ 注册一个归当前 fiber 所有的服务实现。
310
+
311
+ fiber 激活后,该服务对同一隔离作用域内的依赖方可见;当返回的资源释放函数运行或 fiber 卸载时,该服务会被取消注册,并唤醒依赖方。如果该名称已在此作用域中被提供,或已声明为访问器,则抛出异常。
312
+
313
+ - `name`:服务名称。
314
+ - `value`:服务值。
315
+
316
+ **返回**一个用于取消注册该服务的资源释放函数。
317
+
318
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/reflect.ts#L44)
319
+
320
+ ### ctx.accessor(name, options)
321
+
322
+ ```ts cordis-catalog
323
+ /**
324
+ * Define a computed context property backed by get/set hooks.
325
+ *
326
+ * The accessor is removed when the current fiber unloads. Throws if the
327
+ * name is already declared.
328
+ *
329
+ * @param name — the context property name.
330
+ * @param options — the `get` hook and optional `set` hook.
331
+ */
332
+ accessor(name: string, options: Omit<Property.Accessor, 'type'>): void
333
+ ```
334
+
335
+ 定义一个由 get/set 钩子支持的计算型上下文属性。
336
+
337
+ 当前 fiber 卸载时会移除该访问器。如果该名称已被声明,则抛出异常。
338
+
339
+ - `name`:上下文属性名称。
340
+ - `options`:`get` 钩子和可选的 `set` 钩子。
341
+
342
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/reflect.ts#L56)
343
+
344
+ ### ctx.mixin(name, mixins)
345
+
346
+ ```ts cordis-catalog
347
+ /**
348
+ * Expose selected members of a service directly on `ctx`.
349
+ *
350
+ * Each mixed-in key becomes an accessor that forwards to the service
351
+ * (binding methods to it), so e.g. `ctx.on` forwards to `ctx.events.on`.
352
+ * Mixins are removed when the current fiber unloads.
353
+ *
354
+ * @param name — the context property holding the source service.
355
+ * @param mixins — keys to forward, or a source-key → ctx-key map.
356
+ */
357
+ mixin<K extends string & keyof this>(name: K, mixins: (keyof this & keyof this[K])[] | Dict<string>): void
358
+ mixin<T extends {}>(source: T, mixins: (keyof this & keyof T)[] | Dict<string>): void
359
+ ```
360
+
361
+ 直接在 `ctx` 上公开服务的指定成员。
362
+
363
+ 每个混入的键都会成为一个转发到该服务的访问器,并将方法绑定到该服务。例如,`ctx.on` 会转发到 `ctx.events.on`。当前 fiber 卸载时会移除这些混入。
364
+
365
+ - `name`:存放源服务的上下文属性。
366
+ - `mixins`:要转发的键,或从源键到 ctx 键的映射。
367
+
368
+ [源码](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/cordis/src/reflect.ts#L67)