dsh-plugin-dev-kb 1.3.0 → 1.4.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 (364) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.en.md +4 -4
  3. package/README.md +5 -5
  4. package/kb/INDEX.md +18 -18
  5. package/kb/README.md +6 -4
  6. package/kb/extra/AGENTS.md +11 -10
  7. package/kb/extra/cookbook/adding-a-remote-api.md +2 -2
  8. package/kb/extra/cookbook/adding-a-remote-api.zh.md +2 -2
  9. package/kb/extra/cookbook/adding-a-session-format-version.md +48 -6
  10. package/kb/extra/cookbook/adding-a-session-format-version.zh.md +48 -6
  11. package/kb/extra/cookbook/reviewing-persistence-type-changes.md +120 -0
  12. package/kb/extra/cookbook/reviewing-persistence-type-changes.zh.md +120 -0
  13. package/kb/extra/deepseek-llm-api-wire-extensions.md +18 -19
  14. package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +17 -18
  15. package/kb/extra/development.md +27 -10
  16. package/kb/extra/development.zh.md +27 -10
  17. package/kb/extra/event-producer-consumer.md +89 -68
  18. package/kb/extra/event-producer-consumer.zh.md +90 -69
  19. package/kb/extra/glossary.md +1 -1
  20. package/kb/extra/glossary.zh.md +1 -1
  21. package/kb/extra/i18n/README.md +15 -7
  22. package/kb/extra/i18n/README.zh.md +15 -7
  23. package/kb/extra/i18n/terminology.md +4 -4
  24. package/kb/extra/i18n/translation-prompt.md +2 -2
  25. package/kb/extra/module-graph.md +574 -326
  26. package/kb/extra/module-graph.zh.md +574 -326
  27. package/kb/extra/persistence-changes/2026-09-11-initial.md +280 -0
  28. package/kb/extra/persistence-changes/2026-09-11-initial.zh.md +280 -0
  29. package/kb/extra/persistence-changes/2026-09-12-auto-review-error-metadata.md +52 -0
  30. package/kb/extra/persistence-changes/2026-09-12-auto-review-error-metadata.zh.md +52 -0
  31. package/kb/extra/persistence-changes/2026-09-14-image-offload.md +96 -0
  32. package/kb/extra/persistence-changes/2026-09-14-image-offload.zh.md +96 -0
  33. package/kb/extra/persistence-changes/2026-09-14-workspace-changes-event.md +48 -0
  34. package/kb/extra/persistence-changes/2026-09-14-workspace-changes-event.zh.md +48 -0
  35. package/kb/extra/persistence-changes/2026-09-16-session-format-v4.md +120 -0
  36. package/kb/extra/persistence-changes/2026-09-16-session-format-v4.zh.md +120 -0
  37. package/kb/extra/persistence-changes/2026-09-18-schedule-optional-title.md +48 -0
  38. package/kb/extra/persistence-changes/2026-09-18-schedule-optional-title.zh.md +48 -0
  39. package/kb/extra/persistence-changes/2026-09-20-unknown-child-catalog.md +48 -0
  40. package/kb/extra/persistence-changes/2026-09-20-unknown-child-catalog.zh.md +48 -0
  41. package/kb/extra/persistence-changes/2026-09-21-user-question-reply.md +60 -0
  42. package/kb/extra/persistence-changes/2026-09-21-user-question-reply.zh.md +60 -0
  43. package/kb/extra/persistence-changes/README.md +88 -0
  44. package/kb/extra/persistence-changes/README.zh.md +88 -0
  45. package/kb/extra/persistence-changes/historical-formats/README.md +75 -0
  46. package/kb/extra/persistence-changes/historical-formats/README.zh.md +75 -0
  47. package/kb/extra/persistence-changes/historical-formats/v0.md +5105 -0
  48. package/kb/extra/persistence-changes/historical-formats/v0.zh.md +5105 -0
  49. package/kb/extra/persistence-changes/historical-formats/v1.md +5107 -0
  50. package/kb/extra/persistence-changes/historical-formats/v1.zh.md +5107 -0
  51. package/kb/extra/persistence-changes/historical-formats/v2.md +5362 -0
  52. package/kb/extra/persistence-changes/historical-formats/v2.zh.md +5362 -0
  53. package/kb/extra/persistence-changes/historical-formats/v3.md +5634 -0
  54. package/kb/extra/persistence-changes/historical-formats/v3.zh.md +5634 -0
  55. package/kb/extra/persistence-changes/releases/README.md +103 -0
  56. package/kb/extra/persistence-changes/releases/README.zh.md +103 -0
  57. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.1.md +201 -0
  58. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.1.zh.md +201 -0
  59. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.2.md +261 -0
  60. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md +261 -0
  61. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.3.md +126 -0
  62. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md +126 -0
  63. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.4.md +75 -0
  64. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.4.zh.md +75 -0
  65. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.5.md +75 -0
  66. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.5.zh.md +75 -0
  67. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.1.md +75 -0
  68. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.1.zh.md +75 -0
  69. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.2.md +75 -0
  70. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.2.zh.md +75 -0
  71. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.3.md +75 -0
  72. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.3.zh.md +75 -0
  73. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.5.md +75 -0
  74. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.5.zh.md +75 -0
  75. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.6.md +75 -0
  76. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.6.zh.md +75 -0
  77. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.7.md +82 -0
  78. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md +82 -0
  79. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.8.md +110 -0
  80. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md +110 -0
  81. package/kb/extra/persistence-changes/releases/dsh-v0.1.1-rc.1.md +82 -0
  82. package/kb/extra/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md +82 -0
  83. package/kb/extra/persistence-changes/releases/dsh-v0.1.1-rc.2.md +119 -0
  84. package/kb/extra/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md +119 -0
  85. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.1.md +295 -0
  86. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md +295 -0
  87. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.2.md +286 -0
  88. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md +286 -0
  89. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.3.md +75 -0
  90. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.3.zh.md +75 -0
  91. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.4.md +95 -0
  92. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md +95 -0
  93. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.5.md +75 -0
  94. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.5.zh.md +75 -0
  95. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-rc.1.md +75 -0
  96. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-rc.1.zh.md +75 -0
  97. package/kb/extra/persistence-changes/releases/dsh-v0.1.3-alpha.1.md +154 -0
  98. package/kb/extra/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md +154 -0
  99. package/kb/extra/persistence-changes/releases/dsh-v0.1.3-alpha.2.md +86 -0
  100. package/kb/extra/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md +86 -0
  101. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-alpha.1.md +139 -0
  102. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md +139 -0
  103. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-alpha.2.md +95 -0
  104. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md +95 -0
  105. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-rc.1.md +75 -0
  106. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-rc.1.zh.md +75 -0
  107. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-rc.2.md +75 -0
  108. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-rc.2.zh.md +75 -0
  109. package/kb/extra/rescope.md +1 -1
  110. package/kb/extra/rescope.zh.md +1 -1
  111. package/kb/extra/session-format-status.md +22 -6
  112. package/kb/extra/session-format-status.zh.md +22 -6
  113. package/kb/extra/subsystems/agent-team.md +52 -28
  114. package/kb/extra/subsystems/agent-team.zh.md +52 -28
  115. package/kb/extra/subsystems/attachment.md +19 -9
  116. package/kb/extra/subsystems/attachment.zh.md +19 -9
  117. package/kb/extra/subsystems/boot.md +323 -0
  118. package/kb/extra/subsystems/boot.zh.md +323 -0
  119. package/kb/extra/subsystems/browser-use.md +67 -0
  120. package/kb/extra/subsystems/browser-use.zh.md +67 -0
  121. package/kb/extra/subsystems/claude-code-mods.md +146 -0
  122. package/kb/extra/subsystems/claude-code-mods.zh.md +146 -0
  123. package/kb/extra/subsystems/computer-use.md +56 -0
  124. package/kb/extra/subsystems/computer-use.zh.md +56 -0
  125. package/kb/extra/subsystems/deliverables.md +178 -0
  126. package/kb/extra/subsystems/deliverables.zh.md +178 -0
  127. package/kb/extra/subsystems/extensions.md +6 -4
  128. package/kb/extra/subsystems/extensions.zh.md +6 -4
  129. package/kb/extra/subsystems/feedback.md +4 -4
  130. package/kb/extra/subsystems/feedback.zh.md +4 -4
  131. package/kb/extra/subsystems/mcp.md +139 -0
  132. package/kb/extra/subsystems/mcp.zh.md +139 -0
  133. package/kb/extra/subsystems/office-to-pdf.md +87 -0
  134. package/kb/extra/subsystems/office-to-pdf.zh.md +87 -0
  135. package/kb/extra/subsystems/otel.md +44 -0
  136. package/kb/extra/subsystems/otel.zh.md +44 -0
  137. package/kb/extra/subsystems/product-telemetry.md +79 -0
  138. package/kb/extra/subsystems/product-telemetry.zh.md +79 -0
  139. package/kb/extra/subsystems/ssh.md +135 -0
  140. package/kb/extra/subsystems/ssh.zh.md +135 -0
  141. package/kb/extra/subsystems/todo.md +3 -3
  142. package/kb/extra/subsystems/todo.zh.md +3 -3
  143. package/kb/extra/subsystems/voice-input.md +164 -0
  144. package/kb/extra/subsystems/voice-input.zh.md +164 -0
  145. package/kb/extra/subsystems/webhook.md +3 -3
  146. package/kb/extra/subsystems/webhook.zh.md +1 -1
  147. package/kb/extra/testing.md +3 -3
  148. package/kb/extra/testing.zh.md +3 -3
  149. package/kb/extra/ui-radius.md +115 -0
  150. package/kb/extra/ui-radius.zh.md +115 -0
  151. package/kb/extra/upgrade-guide/v0.1.7-rc.2/schedule-optional-bundle/guide.md +22 -0
  152. package/kb/extra/upgrade-guide/v0.1.7-rc.2/schedule-optional-bundle/guide.zh.md +22 -0
  153. package/kb/extra/upgrade-guide/v0.1.7-rc.2/transcript-view-legacy-normal/guide.md +25 -0
  154. package/kb/extra/upgrade-guide/v0.1.7-rc.2/transcript-view-legacy-normal/guide.zh.md +25 -0
  155. package/kb/extra/upgrade-guide/v0.2.0-rc.2/account-sign-in-errors/guide.md +18 -0
  156. package/kb/extra/upgrade-guide/v0.2.0-rc.2/account-sign-in-errors/guide.zh.md +18 -0
  157. package/kb/extra/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/guide.md +23 -0
  158. package/kb/extra/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/guide.zh.md +23 -0
  159. package/kb/extra/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/guide.md +22 -0
  160. package/kb/extra/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/guide.zh.md +22 -0
  161. package/kb/extra/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/guide.md +27 -0
  162. package/kb/extra/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/guide.zh.md +27 -0
  163. package/kb/extra/web-styling.md +12 -3
  164. package/kb/extra/web-styling.zh.md +12 -3
  165. package/kb/meta/search-index.json +976 -256
  166. package/kb/meta/site-pages.txt +188 -188
  167. package/kb/meta/source.json +6 -6
  168. package/kb/meta/topics.md +10 -6
  169. package/kb/site/develop/basic/config.md +1 -0
  170. package/kb/site/develop/basic/index.md +1 -0
  171. package/kb/site/develop/basic/publish.md +9 -2
  172. package/kb/site/develop/basic/tool.md +1 -0
  173. package/kb/site/develop/cordis-tutorial/01-first-plugin.md +1 -0
  174. package/kb/site/develop/cordis-tutorial/02-lifecycle-and-effects.md +1 -0
  175. package/kb/site/develop/cordis-tutorial/03-services.md +1 -0
  176. package/kb/site/develop/cordis-tutorial/04-events.md +1 -0
  177. package/kb/site/develop/cordis-tutorial/05-config.md +28 -0
  178. package/kb/site/develop/cordis-tutorial/06-composition-and-hmr.md +3 -2
  179. package/kb/site/develop/cordis-tutorial/07-into-the-harness.md +1 -0
  180. package/kb/site/develop/cordis-tutorial/index.md +1 -0
  181. package/kb/site/develop/framework/events.md +1 -0
  182. package/kb/site/develop/framework/index.md +2 -1
  183. package/kb/site/develop/framework/service.md +1 -0
  184. package/kb/site/develop/practice/dynamic-cordis.md +9 -8
  185. package/kb/site/develop/practice/index.md +1 -0
  186. package/kb/site/develop/practice/llm-adapter.md +2 -1
  187. package/kb/site/en/develop/basic/config.md +1 -0
  188. package/kb/site/en/develop/basic/index.md +1 -0
  189. package/kb/site/en/develop/basic/publish.md +9 -2
  190. package/kb/site/en/develop/basic/tool.md +1 -0
  191. package/kb/site/en/develop/cordis-tutorial/01-first-plugin.md +1 -0
  192. package/kb/site/en/develop/cordis-tutorial/02-lifecycle-and-effects.md +1 -0
  193. package/kb/site/en/develop/cordis-tutorial/03-services.md +1 -0
  194. package/kb/site/en/develop/cordis-tutorial/04-events.md +1 -0
  195. package/kb/site/en/develop/cordis-tutorial/05-config.md +28 -0
  196. package/kb/site/en/develop/cordis-tutorial/06-composition-and-hmr.md +3 -2
  197. package/kb/site/en/develop/cordis-tutorial/07-into-the-harness.md +1 -0
  198. package/kb/site/en/develop/cordis-tutorial/index.md +1 -0
  199. package/kb/site/en/develop/framework/events.md +1 -0
  200. package/kb/site/en/develop/framework/index.md +2 -1
  201. package/kb/site/en/develop/framework/service.md +1 -0
  202. package/kb/site/en/develop/practice/dynamic-cordis.md +9 -8
  203. package/kb/site/en/develop/practice/index.md +1 -0
  204. package/kb/site/en/develop/practice/llm-adapter.md +2 -1
  205. package/kb/site/en/guide/github-review.md +1 -0
  206. package/kb/site/en/guide/mcp-memory.md +1 -0
  207. package/kb/site/en/guide/network-proxy.md +2 -1
  208. package/kb/site/en/guide/providers-custom-form.png +0 -0
  209. package/kb/site/en/guide/providers-models-page.png +0 -0
  210. package/kb/site/en/guide/providers.md +97 -82
  211. package/kb/site/en/guide/public-deployments.md +36 -0
  212. package/kb/site/en/guide/python-sdk.md +42 -21
  213. package/kb/site/en/guide/quickstart.md +2 -0
  214. package/kb/site/en/guide/schedule.md +70 -11
  215. package/kb/site/en/reference/agent-lifecycle.md +1 -0
  216. package/kb/site/en/reference/api-gateway.md +13 -11
  217. package/kb/site/en/reference/capability-seams.md +177 -59
  218. package/kb/site/en/reference/config-catalog.md +1758 -821
  219. package/kb/site/en/reference/cookbook/adding-a-package.md +57 -3
  220. package/kb/site/en/reference/cookbook/adding-a-settings-card.md +35 -64
  221. package/kb/site/en/reference/cookbook/adding-a-tool.md +4 -3
  222. package/kb/site/en/reference/cookbook/adding-an-llm-adapter.md +1 -0
  223. package/kb/site/en/reference/cookbook/extension-cookbook.md +6 -5
  224. package/kb/site/en/reference/cordis-api/context.md +1 -0
  225. package/kb/site/en/reference/cordis-api/events.md +1 -0
  226. package/kb/site/en/reference/cordis-api/fiber.md +4 -3
  227. package/kb/site/en/reference/cordis-api/inherited.md +16 -16
  228. package/kb/site/en/reference/cordis-api/registry.md +1 -0
  229. package/kb/site/en/reference/cordis-api/service.md +1 -0
  230. package/kb/site/en/reference/cordis-primer.md +1 -0
  231. package/kb/site/en/reference/index.md +18 -11
  232. package/kb/site/en/reference/persistence-catalog.md +7687 -54
  233. package/kb/site/en/reference/subsystems/approval.md +2 -1
  234. package/kb/site/en/reference/subsystems/client-modules.md +23 -15
  235. package/kb/site/en/reference/subsystems/client-resources.md +3 -1
  236. package/kb/site/en/reference/subsystems/commands.md +6 -1
  237. package/kb/site/en/reference/subsystems/compaction.md +50 -3
  238. package/kb/site/en/reference/subsystems/conversation.md +36 -6
  239. package/kb/site/en/reference/subsystems/core.md +97 -257
  240. package/kb/site/en/reference/subsystems/credentials.md +169 -5
  241. package/kb/site/en/reference/subsystems/filesystem.md +11 -0
  242. package/kb/site/en/reference/subsystems/goal.md +2 -1
  243. package/kb/site/en/reference/subsystems/index.md +16 -5
  244. package/kb/site/en/reference/subsystems/jobs.md +337 -127
  245. package/kb/site/en/reference/subsystems/llm-streaming.md +76 -36
  246. package/kb/site/en/reference/subsystems/lsp.md +1 -0
  247. package/kb/site/en/reference/subsystems/permission-presets.md +66 -29
  248. package/kb/site/en/reference/subsystems/persistence.md +4 -3
  249. package/kb/site/en/reference/subsystems/plan.md +2 -1
  250. package/kb/site/en/reference/subsystems/ptc-runtime.md +236 -0
  251. package/kb/site/en/reference/subsystems/sandbox.md +7 -5
  252. package/kb/site/en/reference/subsystems/schedule.md +392 -33
  253. package/kb/site/en/reference/subsystems/scope.md +2 -1
  254. package/kb/site/en/reference/subsystems/session-projection.md +22 -19
  255. package/kb/site/en/reference/subsystems/session-query.md +1 -0
  256. package/kb/site/en/reference/subsystems/session-reference.md +8 -6
  257. package/kb/site/en/reference/subsystems/session-telemetry.md +7 -4
  258. package/kb/site/en/reference/subsystems/session-title.md +6 -5
  259. package/kb/site/en/reference/subsystems/session.md +199 -81
  260. package/kb/site/en/reference/subsystems/settings.md +43 -292
  261. package/kb/site/en/reference/subsystems/shell.md +37 -28
  262. package/kb/site/en/reference/subsystems/sidebar-right.md +23 -12
  263. package/kb/site/en/reference/subsystems/skills.md +5 -6
  264. package/kb/site/en/reference/subsystems/slots.md +34 -13
  265. package/kb/site/en/reference/subsystems/spill.md +4 -3
  266. package/kb/site/en/reference/subsystems/storage.md +2 -2
  267. package/kb/site/en/reference/subsystems/subagent.md +50 -64
  268. package/kb/site/en/reference/subsystems/subprocess.md +17 -18
  269. package/kb/site/en/reference/subsystems/system-prompt.md +4 -1
  270. package/kb/site/en/reference/subsystems/terminal.md +1 -0
  271. package/kb/site/en/reference/subsystems/token-meter.md +1 -0
  272. package/kb/site/en/reference/subsystems/tools.md +40 -12
  273. package/kb/site/en/reference/subsystems/typert.md +153 -10
  274. package/kb/site/en/reference/subsystems/user-questions.md +131 -1
  275. package/kb/site/en/reference/subsystems/web-client.md +15 -9
  276. package/kb/site/en/reference/subsystems/web-server.md +74 -1
  277. package/kb/site/en/reference/subsystems/web.md +1 -0
  278. package/kb/site/en/reference/subsystems/workflow.md +10 -9
  279. package/kb/site/en/reference/subsystems/workspace.md +294 -34
  280. package/kb/site/en/reference/tool-catalog.md +782 -331
  281. package/kb/site/en/reference/tool-execution-pipeline.md +7 -3
  282. package/kb/site/guide/github-review.md +1 -0
  283. package/kb/site/guide/mcp-memory.md +1 -0
  284. package/kb/site/guide/network-proxy.md +2 -1
  285. package/kb/site/guide/providers-custom-form.zh.png +0 -0
  286. package/kb/site/guide/providers-models-page.zh.png +0 -0
  287. package/kb/site/guide/providers.md +109 -94
  288. package/kb/site/guide/public-deployments.md +36 -0
  289. package/kb/site/guide/python-sdk.md +42 -21
  290. package/kb/site/guide/quickstart.md +2 -0
  291. package/kb/site/guide/schedule.md +70 -11
  292. package/kb/site/reference/agent-lifecycle.md +1 -0
  293. package/kb/site/reference/api-gateway.md +13 -11
  294. package/kb/site/reference/capability-seams.md +177 -59
  295. package/kb/site/reference/config-catalog.md +1760 -822
  296. package/kb/site/reference/cookbook/adding-a-package.md +55 -3
  297. package/kb/site/reference/cookbook/adding-a-settings-card.md +35 -64
  298. package/kb/site/reference/cookbook/adding-a-tool.md +4 -3
  299. package/kb/site/reference/cookbook/adding-an-llm-adapter.md +1 -0
  300. package/kb/site/reference/cookbook/extension-cookbook.md +6 -5
  301. package/kb/site/reference/cordis-api/context.md +1 -0
  302. package/kb/site/reference/cordis-api/events.md +1 -0
  303. package/kb/site/reference/cordis-api/fiber.md +4 -3
  304. package/kb/site/reference/cordis-api/inherited.md +16 -16
  305. package/kb/site/reference/cordis-api/registry.md +1 -0
  306. package/kb/site/reference/cordis-api/service.md +1 -0
  307. package/kb/site/reference/cordis-primer.md +1 -0
  308. package/kb/site/reference/index.md +18 -11
  309. package/kb/site/reference/persistence-catalog.md +7693 -60
  310. package/kb/site/reference/subsystems/approval.md +2 -1
  311. package/kb/site/reference/subsystems/client-modules.md +23 -15
  312. package/kb/site/reference/subsystems/client-resources.md +3 -1
  313. package/kb/site/reference/subsystems/commands.md +6 -1
  314. package/kb/site/reference/subsystems/compaction.md +50 -3
  315. package/kb/site/reference/subsystems/conversation.md +35 -5
  316. package/kb/site/reference/subsystems/core.md +97 -257
  317. package/kb/site/reference/subsystems/credentials.md +169 -5
  318. package/kb/site/reference/subsystems/filesystem.md +11 -0
  319. package/kb/site/reference/subsystems/goal.md +2 -1
  320. package/kb/site/reference/subsystems/index.md +16 -5
  321. package/kb/site/reference/subsystems/jobs.md +336 -126
  322. package/kb/site/reference/subsystems/llm-streaming.md +76 -36
  323. package/kb/site/reference/subsystems/lsp.md +1 -0
  324. package/kb/site/reference/subsystems/permission-presets.md +66 -29
  325. package/kb/site/reference/subsystems/persistence.md +4 -3
  326. package/kb/site/reference/subsystems/plan.md +2 -1
  327. package/kb/site/reference/subsystems/ptc-runtime.md +236 -0
  328. package/kb/site/reference/subsystems/sandbox.md +7 -5
  329. package/kb/site/reference/subsystems/schedule.md +392 -33
  330. package/kb/site/reference/subsystems/scope.md +2 -1
  331. package/kb/site/reference/subsystems/session-projection.md +22 -19
  332. package/kb/site/reference/subsystems/session-query.md +1 -0
  333. package/kb/site/reference/subsystems/session-reference.md +8 -6
  334. package/kb/site/reference/subsystems/session-telemetry.md +7 -4
  335. package/kb/site/reference/subsystems/session-title.md +6 -5
  336. package/kb/site/reference/subsystems/session.md +199 -81
  337. package/kb/site/reference/subsystems/settings.md +43 -292
  338. package/kb/site/reference/subsystems/shell.md +37 -28
  339. package/kb/site/reference/subsystems/sidebar-right.md +23 -12
  340. package/kb/site/reference/subsystems/skills.md +5 -6
  341. package/kb/site/reference/subsystems/slots.md +34 -13
  342. package/kb/site/reference/subsystems/spill.md +3 -2
  343. package/kb/site/reference/subsystems/storage.md +2 -2
  344. package/kb/site/reference/subsystems/subagent.md +49 -63
  345. package/kb/site/reference/subsystems/subprocess.md +17 -18
  346. package/kb/site/reference/subsystems/system-prompt.md +4 -1
  347. package/kb/site/reference/subsystems/terminal.md +1 -0
  348. package/kb/site/reference/subsystems/token-meter.md +1 -0
  349. package/kb/site/reference/subsystems/tools.md +40 -12
  350. package/kb/site/reference/subsystems/typert.md +153 -10
  351. package/kb/site/reference/subsystems/user-questions.md +132 -2
  352. package/kb/site/reference/subsystems/web-client.md +15 -9
  353. package/kb/site/reference/subsystems/web-server.md +74 -1
  354. package/kb/site/reference/subsystems/web.md +1 -0
  355. package/kb/site/reference/subsystems/workflow.md +10 -9
  356. package/kb/site/reference/subsystems/workspace.md +294 -34
  357. package/kb/site/reference/tool-catalog.md +784 -333
  358. package/kb/site/reference/tool-execution-pipeline.md +7 -3
  359. package/package.json +2 -2
  360. package/skills/dsh-plugin-dev-kb.md +5 -4
  361. package/kb/site/en/reference/subsystems/code-runtime.md +0 -198
  362. package/kb/site/en/reference/subsystems/invariants.md +0 -91
  363. package/kb/site/reference/subsystems/code-runtime.md +0 -198
  364. package/kb/site/reference/subsystems/invariants.md +0 -91
@@ -1,172 +1,22 @@
1
1
  ---
2
2
  editSource: "docs/subsystems/settings.md"
3
+ rawMarkdownPath: "en/reference/subsystems/settings.md"
3
4
  outline: [2,3]
4
5
  ---
5
6
 
6
- # User Settings
7
+ # Plugin Configuration Forms
7
8
 
8
- The user-settings seam of [dsh-settings](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/settings/settings) holds one user-owned document of per-namespace sections and resolves each registered namespace as schema defaults, then the registrant's composition `base`, then the user section. Providers such as [dsh-settings-file](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/settings/settings-file) store the raw document and push external edits; consumer plugins register a schema and read or observe the resolved value. Composition config stays in `cordis.yml` — a namespace carries only the user-editable subset.
9
+ The [settings service](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/settings/settings/README.md) projects volatile Config fields from active profile entries. The [configuration editor](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/boot/config-editor/README.md) persists edits through Cordis patches. Business consumers read `.get()` on their own Config references.
9
10
 
10
- Source: [`packages/settings/settings/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/settings/settings/src/index.ts)
11
-
12
- ## Identity
13
-
14
- A namespace names one plugin-owned section of the user document. The brand prevents callers from mixing settings namespaces with other ids passed between packages or processes; construction validates lowercase kebab-case syntax.
15
-
16
- ```ts type-equiv
17
- /** Nominal id of one registered settings namespace. */
18
- type SettingsNamespace = Branded<'SettingsNamespace'>
19
- ```
20
-
21
- ## Registration
22
-
23
- Registration binds a schemastery schema to a namespace on the calling plugin's fiber — disposing that fiber removes the namespace and its observers. The options carry the composition layer, the owner's effect timing, and an optional check for what the schema cannot express.
24
-
25
- ```ts type-equiv
26
- /** Registration options beyond the namespace schema. */
27
- interface SettingsRegisterOptions<T> {
28
- /** Composition-layer values resolved below the user layer (entry-config subset). */
29
- base?: Partial<T>
30
- /** Owner's effect timing, surfaced to configuration UIs; defaults to `live`. */
31
- applies?: SettingsApplies
32
- /**
33
- * Reject a resolved section the owner could not act on, for constraints its
34
- * schema cannot express — a cross-field requirement, or one field's validity
35
- * depending on another's. Throwing here refuses the *write* that produced the
36
- * value, so a caller learns at `update`/`replace`/`mutate` instead of storing
37
- * something that would silently disable the owner.
38
- *
39
- * Kept separate from the schema because the schema is also what a
40
- * configuration surface renders and what an absent section resolves through;
41
- * folding a cross-field check into it would change both.
42
- *
43
- * Once the owner is registered, a stored section that fails this keeps the
44
- * namespace's last good value and warns, exactly as a schema failure does,
45
- * so an externally edited document cannot strand a running owner. At
46
- * registration there is no last good value yet, so a stored section that
47
- * already fails rejects the registration itself — again exactly as a schema
48
- * failure does.
49
- * @param value - the resolved section, schema-valid by construction.
50
- */
51
- validate?: (value: T) => void
52
- }
53
- ```
54
-
55
- `validate` runs after the schema admits a value, so it sees defaults and the composition base exactly as the owner will. `dsh-llm-pi-ai` uses it to refuse a provider profile it could not serve at the write that produced it, rather than storing one that would disable every route in its namespace.
56
-
57
- `applies` is a UI hint, not a mechanism: a `restart` owner never watches, so its value is read once at construction and configuration surfaces can badge the pending change.
58
-
59
- ```ts type-equiv
60
- /** When a namespace's changes take effect for its owner. */
61
- type SettingsApplies = 'live' | 'restart'
62
- ```
63
-
64
- ## Owner scope
65
-
66
- The scope is the owner-facing handle. `update` merges a sparse patch over the user section only (never into `base`); `replace` sets the section wholesale, which is the removal/reset path — keys absent from the replacement re-inherit `base` and schema defaults. Writes to one namespace are serialized in call order, and resolved values are deep-frozen snapshots.
67
-
68
- ```ts type-equiv
69
- /** Owner-facing handle for one registered namespace. */
70
- interface SettingsScope<T> {
71
- /** Current resolved value: schema defaults, then `base`, then the user layer. */
72
- get(): T
73
- /**
74
- * Observe committed changes to this namespace's resolved value. Invocations
75
- * of one callback run asynchronously, one at a time, in commit order; a
76
- * rejection is contained and logged like a sync throw. After the disposer
77
- * returns, no further invocation starts — one already queued is skipped;
78
- * one already started still settles, and service disposal waits for it.
79
- * @param callback - invoked after each commit with the next and previous values.
80
- * @returns the disposer removing this observer.
81
- */
82
- watch(callback: (next: T, prev: T) => void | Promise<void>): () => void
83
- /**
84
- * Merge a partial patch into this namespace's user layer and persist it.
85
- * @param patch - plain-object patch over the user section; JSON-compatible data
86
- * only (non-JSON values reject with their path before anything persists).
87
- */
88
- update(patch: object): Promise<void>
89
- /**
90
- * Replace this namespace's user section wholesale; absent keys re-inherit
91
- * the composition `base` and schema defaults (`replace({})` resets all).
92
- * @param section - the complete next user section; JSON-compatible data only,
93
- * as for {@link update}.
94
- */
95
- replace(section: object): Promise<void>
96
- }
97
- ```
11
+ ## Identity and values
98
12
 
99
- ## Descriptors
100
-
101
- `describe()` serializes every registered namespace for configuration surfaces: the schemastery `toJSON()` envelope drives schema-rendered forms, the resolved value fills them, and the detached `base`/`user` layers let a form mark user-overridden fields by presence. `describe({ redactSecrets: true })` — mandatory on every wire surface — strips `role('secret')` fields from all three layers and enumerates their `{path, set}` slots so a page can render write-only inputs without ever receiving a secret.
102
-
103
- ```ts type-equiv
104
- /** One registered namespace as surfaced to configuration UIs. */
105
- interface SettingsDescriptor {
106
- /** The registered namespace. */
107
- ns: SettingsNamespace
108
- /** Serialized schemastery schema (`schema.toJSON()`). */
109
- schema: unknown
110
- /** Current resolved value. */
111
- value: unknown
112
- /**
113
- * Monotonic revision of the raw user section this descriptor was read at.
114
- * Send it back as `expectedRevision` on a write to refuse a stale one.
115
- */
116
- revision: number
117
- /** Registrant's composition `base` layer (detached), when one was declared. */
118
- base?: unknown
119
- /**
120
- * Raw user section from the stored document (detached), when one exists and
121
- * is well-formed; a field's presence here is what marks it user-overridden.
122
- */
123
- user?: unknown
124
- /** Owner's declared effect timing. */
125
- applies: SettingsApplies
126
- /** Schema-declared secret positions; present only under `redactSecrets`. */
127
- secrets?: RedactedSecret[]
128
- }
129
- ```
13
+ A form namespace is the local id of a uniquely addressed entry in the active profile. Multiple plugin instances have separate forms when their entry ids differ. Ordinary fields are excluded. Descriptors carry resolved values, inherited values, explicit profile overrides, and an optimistic revision.
130
14
 
131
- A caller that holds only the redacted descriptor cannot safely rebuild a section, so removals travel as path ops instead. Each descriptor also carries a `revision` over the raw section; a write may send it back as `expectedRevision`, and one that no longer matches is refused rather than applied over the writer that landed first.
132
- ```ts type-equiv
133
- /**
134
- * One path-addressed edit to a namespace's user section. Path mutation exists
135
- * for a caller holding an INCOMPLETE view of the section — a configuration UI
136
- * reads the redacted descriptor, which by construction never received the
137
- * `role('secret')` fields. Such a caller can name the field it means without
138
- * restating the section: a wholesale `replace` rebuilt from a redacted
139
- * document silently deletes every secret the wire never returned.
140
- */
141
- type SettingsPathOp =
142
- | { op: 'set'; path: readonly string[]; value: unknown }
143
- | { op: 'unset'; path: readonly string[] }
144
- ```
15
+ ## Edits
145
16
 
146
- ```ts type-equiv
147
- /** Options for {@link SettingsProvider.describe}. */
148
- interface SettingsDescribeOptions {
149
- /**
150
- * Strip `role('secret')` fields from `value`/`base`/`user` and enumerate
151
- * them in each descriptor's `secrets`. Every wire surface MUST pass this;
152
- * the verbatim default exists for same-process configuration UIs only.
153
- */
154
- redactSecrets?: boolean
155
- }
156
- ```
157
-
158
- ## Change commits
17
+ `update` merges submitted fields. `replace` resets live fields to inherited configuration before applying submitted fields. `mutate` addresses individual paths, preserving secrets absent from a client response. Every write validates the complete Config and refuses stale revisions before persistence.
159
18
 
160
- Every committed change — an in-process write or an externally observed provider edit — emits `settings/updated (ns, next, prev, source)` after the new value is authoritative, and never when the resolved value is deep-equal. The source tag separates the two entry paths.
161
-
162
- ```ts type-equiv
163
- /** Origin of one committed settings change. */
164
- type SettingsUpdateSource = 'update' | 'provider'
165
- ```
166
-
167
- ## Native document operations
168
-
169
- `SettingsDocumentOpenValue` confirms that `settings/openSettingsDocument` prepared the provider-owned document and handed it to the native text editor. `AgentPresetDirectoryOpenValue` reports either a completed native handoff or the resolved user-preset directory when desktop opening is unavailable. Neither operation accepts a browser-selected Host path.
19
+ `settings/document-updated` invalidates form descriptors after Loader configuration changes. It is a UI notification; consumers use `loader/volatile-update` only when they need to refresh registration facts.
170
20
 
171
21
  <!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
172
22
 
@@ -176,105 +26,52 @@ type SettingsUpdateSource = 'update' | 'provider'
176
26
 
177
27
  Generated from source by `scripts/gen-cordis-catalog.ts` (verified fresh by `pnpm run verify-cordis-catalog` in doc-sync; regenerate with `pnpm run gen-cordis-catalog`) — the language sides differ only in locale-specific paired document paths. Signature blocks use a `ts cordis-catalog` fence and keep the original source JSDoc; dispatch modes are defined in the [primer](../cordis-primer.md#dispatch-modes), and the framework-inherited `ctx` API lives in [cordis-api/inherited.md](../cordis-api/inherited.md).
178
28
 
179
- <a id="ctxsettings--settingsprovider-abstract-seam"></a>
29
+ <a id="ctxsettings--settingsforms"></a>
180
30
 
181
- ### `ctx.settings` — `SettingsProvider` (abstract seam)
31
+ ### `ctx.settings` — `SettingsForms`
182
32
 
183
- Abstract settings service. Providers implement raw-document storage (`load`/`persist`) and push external changes through Settings.publish; the base class owns namespace registration, resolution, validation, change detection, and the `settings/updated` commit event.
33
+ Project Config schemas into forms and own optional instance-level UI policy.
184
34
 
185
35
  ```ts cordis-catalog
186
- /**
187
- * Prepare the provider's user-editable document for a native editor. File
188
- * providers may materialize an absent document before returning its path;
189
- * non-file providers return undefined.
190
- * @returns the absolute local document path, or undefined for non-file storage.
191
- */
192
- prepareDocument(): Promise<string | undefined>
193
-
194
- /**
195
- * Register a namespace schema and receive its owner scope. The registration
196
- * is an effect on the calling plugin's fiber: disposing that fiber removes
197
- * the namespace and its observers. An invalid stored section fails the
198
- * registration itself — the earliest point where the schema can judge it.
199
- * @param ns - unique namespace; duplicate registration fails loud.
200
- * @param schema - schemastery schema resolving this namespace's value.
201
- * @param options - composition `base` layer and effect timing.
202
- * @returns the owner scope for reads, observation, and updates.
203
- * @throws {TypeError} when `ns` is not a lowercase hyphenated identifier.
36
+ /** Register the calling plugin instance's page policy without changing its Config.
37
+ * @param presentation Automatic-page policy for this instance; `auto` defaults to true.
38
+ * @param owner Plugin instance the policy belongs to; defaults to the calling fiber.
39
+ * @returns Disposer; register it with the calling plugin's effects.
40
+ * @throws If this instance already has a registered policy.
204
41
  */
205
- register<const Namespace extends string, T>( ns: Namespace & SettingsNamespaceInput<Namespace>, schema: z<T>, options?: SettingsRegisterOptions<T>, ): SettingsScope<T>
42
+ configure(presentation: { auto?: boolean }, owner: Fiber = this.ctx.fiber): () => void
206
43
 
207
- /**
208
- * Attach one optional-settings consumer to this provider. The consumer
209
- * registers its composition entry as the base layer while this provider is
210
- * present, then falls back to that entry if the provider detaches.
211
- * @param owner - consumer context whose unload suppresses fallback work.
212
- * @param ns - consumer-owned settings namespace.
213
- * @param schema - schema resolving the namespace.
214
- * @param entry - composition entry used as the base and fallback value.
215
- * @param hooks - source sink, change notification, and optional validation.
216
- * @throws {TypeError} when `ns` is not a lowercase hyphenated identifier.
44
+ /** Locate the profile patch for native editing.
45
+ * @returns The existing profile patch path.
217
46
  */
218
- installSection<const Namespace extends string, T>( owner: Context, ns: Namespace & SettingsNamespaceInput<Namespace>, schema: z<T>, entry: T, hooks: SettingsSectionHooks<T>, ): void
47
+ prepareDocument(): Promise<string>
219
48
 
220
- /**
221
- * Describe every registered namespace for configuration surfaces, including
222
- * the composition `base` and raw user layers so a form can mark which fields
223
- * the user overrode (presence in `user`) and what a reset returns to.
224
- * @param options - redaction switch; wire surfaces must redact.
225
- * @returns one descriptor per registered namespace, in registration order.
49
+ /** Read active plugin schemas and their live values.
50
+ * @param options Redaction required for remote callers.
51
+ * @returns Forms keyed by unique profile entry ids.
226
52
  */
227
53
  describe(options?: SettingsDescribeOptions): SettingsDescriptor[]
228
54
 
229
- /**
230
- * Read one registered namespace's resolved value.
231
- * @param ns - the namespace to read.
232
- * @returns the resolved value, or `undefined` while unregistered.
233
- * @throws {TypeError} when `ns` is not a lowercase hyphenated identifier.
55
+ /** Merge editable fields into an entry's config.
56
+ * @param ns Profile entry id.
57
+ * @param patch Fields to merge.
58
+ * @param expectedRevision Revision returned by describe.
234
59
  */
235
- get<const Namespace extends string>(ns: Namespace & SettingsNamespaceInput<Namespace>): unknown
60
+ async update(ns: string, patch: object, expectedRevision?: number): Promise<void>
236
61
 
237
- /**
238
- * Merge a patch into one registered namespace's user layer, validate the
239
- * resolved candidate, persist through the provider, then commit and emit.
240
- * A validation failure rejects before anything is persisted. Writes to one
241
- * namespace are serialized: concurrent updates apply in call order, each
242
- * merging over the previous write's committed section.
243
- * @param ns - the registered namespace to update.
244
- * @param patch - plain-object patch over the user section.
245
- * @param expectedRevision - the descriptor `revision` the caller read; a
246
- * namespace that moved past it rejects with {@link SettingsConflictError}.
247
- * @throws {TypeError} when `ns` is not a lowercase hyphenated identifier.
62
+ /** Reset all live fields, then set the supplied fields; ordinary config is preserved.
63
+ * @param ns Profile entry id.
64
+ * @param section Complete form values.
65
+ * @param expectedRevision Revision returned by describe.
248
66
  */
249
- async update<const Namespace extends string>( ns: Namespace & SettingsNamespaceInput<Namespace>, patch: object, expectedRevision?: number, ): Promise<void>
67
+ async replace(ns: string, section: object, expectedRevision?: number): Promise<void>
250
68
 
251
- /**
252
- * Replace one registered namespace's user section wholesale, validate,
253
- * persist, then commit and emit. Keys absent from `section` fall back to the
254
- * composition `base` and schema defaults — this is the removal/reset path a
255
- * merge-only patch cannot express (`replace({})` re-inherits everything).
256
- * @param ns - the registered namespace to replace.
257
- * @param section - the complete next user section.
258
- * @param expectedRevision - the descriptor `revision` the caller read; a
259
- * namespace that moved past it rejects with {@link SettingsConflictError}.
260
- * @throws {TypeError} when `ns` is not a lowercase hyphenated identifier.
69
+ /** Apply field edits without restating redacted secrets; unsetting an array index removes its element.
70
+ * @param ns Profile entry id.
71
+ * @param ops Ordered form edits.
72
+ * @param expectedRevision Revision returned by describe.
261
73
  */
262
- async replace<const Namespace extends string>( ns: Namespace & SettingsNamespaceInput<Namespace>, section: object, expectedRevision?: number, ): Promise<void>
263
-
264
- /**
265
- * Apply path-addressed edits to one registered namespace's user section,
266
- * validate, persist, then commit and emit. The ops are applied to the
267
- * section as it stands when the write reaches the front of the queue, so a
268
- * caller never has to restate fields it did not touch — and, crucially,
269
- * cannot delete fields it never saw. This is the write path for any caller
270
- * holding a redacted view; `replace` remains the wholesale reset.
271
- * @param ns - the registered namespace to edit.
272
- * @param ops - ordered path edits; later ops observe earlier ones.
273
- * @param expectedRevision - the descriptor `revision` the caller read; a
274
- * namespace that moved past it rejects with {@link SettingsConflictError}.
275
- * @throws {TypeError} when `ns` is not a lowercase hyphenated identifier.
276
- */
277
- async mutate<const Namespace extends string>( ns: Namespace & SettingsNamespaceInput<Namespace>, ops: readonly SettingsPathOp[], expectedRevision?: number, ): Promise<void>
74
+ async mutate(ns: string, ops: readonly SettingsPathOp[], expectedRevision?: number): Promise<void>
278
75
  ```
279
76
 
280
77
  Source: [`packages/settings/settings/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/settings/settings/src/index.ts)
@@ -294,12 +91,6 @@ Host service backing the generated `ctx.remote.settings` namespace. Every remote
294
91
  */
295
92
  @Remote describe(): SettingsDescribeValue
296
93
 
297
- /**
298
- * Report whether this deployment can open an authored Agent preset directory natively.
299
- * @returns true when the matching open operation is available.
300
- */
301
- @Remote canOpenAgentPresetDirectory(): boolean
302
-
303
94
  /**
304
95
  * Merge a patch into one namespace's stored user section.
305
96
  * @param ns - namespace key to write.
@@ -339,15 +130,6 @@ Host service backing the generated `ctx.remote.settings` namespace. Every remote
339
130
  * @throws RemoteError when no document exists, preparation fails, or opening fails.
340
131
  */
341
132
  @Remote async openSettingsDocument(signal: AbortSignal): Promise<SettingsDocumentOpenValue>
342
-
343
- /**
344
- * Open one user-authored Agent preset directory or return its path when no native opener exists.
345
- * @param agentPreset - preset id resolved against Host-owned roots.
346
- * @param signal - caller lifetime; abort terminates the native command.
347
- * @returns an opened confirmation or the resolved directory for text display.
348
- * @throws RemoteError when the preset is missing, read-only, invalid, or cannot be opened.
349
- */
350
- @Remote async openAgentPresetDirectory( agentPreset: string, signal: AbortSignal, ): Promise<AgentPresetDirectoryOpenValue>
351
133
  ```
352
134
 
353
135
  Source: [`packages/api/settings-controller/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/api/settings-controller/src/index.ts)
@@ -360,49 +142,18 @@ Source: [`packages/api/settings-controller/src/index.ts`](https://github.com/dee
360
142
 
361
143
  #### `settings/document-updated` — emit
362
144
 
363
- One registered namespace's RAW user section changed, whether or not the resolved value did. `settings/updated` is the consumer-facing event and stays deep-equal-gated; this one exists for configuration surfaces, which must learn that a field went from inherited to overridden (same resolved value, different meaning) and that their held revision is stale. Listener containment matches `settings/updated`.
145
+ One profile entry's form values, availability, or page policy changed. Form clients re-read its schema, resolved values, and revision.
364
146
 
365
147
  ```ts cordis-catalog
366
148
  /**
367
- * One registered namespace's RAW user section changed, whether or not the
368
- * resolved value did. `settings/updated` is the consumer-facing event and
369
- * stays deep-equal-gated; this one exists for configuration surfaces,
370
- * which must learn that a field went from inherited to overridden (same
371
- * resolved value, different meaning) and that their held revision is
372
- * stale. Listener containment matches `settings/updated`.
373
- * @param ns - the namespace whose stored section changed.
374
- * @param revision - the namespace's new revision.
149
+ * One profile entry's form values, availability, or page policy changed.
150
+ * Form clients re-read its schema, resolved values, and revision.
151
+ * @param ns Profile entry id.
152
+ * @param revision The entry's new revision.
375
153
  * @mode emit
376
154
  */
377
155
  'settings/document-updated'(ns: SettingsNamespace, revision: number): void
378
156
  ```
379
157
 
380
- Source: [`packages/settings/settings/src/types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/settings/settings/src/types.ts)
381
-
382
- <a id="settingsupdated--emit"></a>
383
-
384
- #### `settings/updated` — emit
385
-
386
- Committed change to one registered namespace's resolved value. Emitted after the provider persisted (for `update`) or published (`provider`) the change; never emitted when the resolved value is deep-equal. Listener failures are contained and logged — a sync throw and an async rejection alike — except `INVARIANT`-coded failures, which rethrow after every listener ran; that rethrow reaches the emitter only from synchronous listeners, so invariant checks on this event must not be async functions.
387
-
388
- ```ts cordis-catalog
389
- /**
390
- * Committed change to one registered namespace's resolved value. Emitted
391
- * after the provider persisted (for `update`) or published (`provider`)
392
- * the change; never emitted when the resolved value is deep-equal.
393
- * Listener failures are contained and logged — a sync throw and an async
394
- * rejection alike — except `INVARIANT`-coded failures, which rethrow
395
- * after every listener ran; that rethrow reaches the emitter only from
396
- * synchronous listeners, so invariant checks on this event must not be
397
- * async functions.
398
- * @param ns - the namespace whose resolved value changed.
399
- * @param next - the new resolved value.
400
- * @param prev - the previous resolved value.
401
- * @param source - whether the change entered through `update()` or the provider.
402
- * @mode emit
403
- */
404
- 'settings/updated'(ns: SettingsNamespace, next: unknown, prev: unknown, source: SettingsUpdateSource): void
405
- ```
406
-
407
158
  Source: [`packages/settings/settings/src/types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/settings/settings/src/types.ts)
408
159
  <!-- END GENERATED cordis-surface -->
@@ -1,11 +1,12 @@
1
1
  ---
2
2
  editSource: "docs/subsystems/shell.md"
3
+ rawMarkdownPath: "en/reference/subsystems/shell.md"
3
4
  outline: [2,3]
4
5
  ---
5
6
 
6
- # Bash Executor
7
+ # Shell Executor
7
8
 
8
- The bash execution seam is split across a Service Definition ([dsh-shell](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/shell/shell), `ctx.shell`), Service Providers ([dsh-bash-local](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/shell/bash-local) and [dsh-bash-sandbox](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/shell/bash-sandbox)), and Consumer ([dsh-tool-bash](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/shell/tool-bash), the `bash` schema). Generic background-job ids, ownership, and controls live in [jobs.md](./jobs.md); this seam returns a task-free process handle. Managed-range mechanics live behind the [subprocess seam](./subprocess.md).
9
+ The shell execution seam uses [dsh-shell](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/shell/shell) as its Service Definition on `ctx.shell`. The [shell package group](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/README.md) lists its Bash and PowerShell providers and model-facing Consumers. Generic background-job ids, ownership, and controls live in [jobs.md](./jobs.md); this seam returns a process handle without job registration. Managed-range mechanics live behind the [subprocess seam](./subprocess.md).
9
10
 
10
11
  Source: [`packages/shell/shell/src/types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/shell/src/types.ts)
11
12
 
@@ -30,6 +31,8 @@ interface ShellExecRequest {
30
31
  workdir?: string | undefined
31
32
  /** Timeout override in milliseconds (implementations cap it). */
32
33
  timeoutMs?: number | undefined
34
+ /** Deadline policy at `timeoutMs` expiry (default `'kill'`). */
35
+ onExpiry?: ShellExpiryPolicy | undefined
33
36
  /**
34
37
  * Foreground stdout capture budget in bytes. Absent uses the executor's
35
38
  * default output cap. Trusted in-process consumers use this when they must
@@ -37,7 +40,7 @@ interface ShellExecRequest {
37
40
  * tool does not expose it as a parameter.
38
41
  */
39
42
  stdoutMaxBytes?: number | undefined
40
- /** Abort signal — implementations kill the command when it fires. */
43
+ /** Abort signal — implementations kill the command when it fires, and treat a signal that is already aborted as fired. */
41
44
  signal?: AbortSignal | undefined
42
45
  /**
43
46
  * Bytes to write to the command's stdin, then close it. Absent leaves stdin
@@ -71,19 +74,21 @@ interface ShellExecRequest {
71
74
  ```ts type-equiv
72
75
  /**
73
76
  * A resolved execution spec. {@link ShellExecutor.resolve} fills and caps the
74
- * required fields; {@link ShellExecutor.start} ignores `timeoutMs` because
75
- * background processes have no executor timeout.
77
+ * required fields; under `onExpiry: 'none'` the resolved `timeoutMs` arms no
78
+ * timer and is only echoed into {@link ShellRunResult.timeoutMs}.
76
79
  */
77
80
  interface ShellExecSpec {
78
81
  command: string
79
82
  workdir: string
80
83
  timeoutMs: number
84
+ /** Deadline policy at `timeoutMs` expiry ({@link ShellExecutor.resolve} defaults it to `'kill'`). */
85
+ onExpiry: ShellExpiryPolicy
81
86
  /**
82
- * Resolved foreground stdout capture budget in bytes. `run()` uses it for
83
- * stdout; background jobs and stderr keep the executor's own output cap.
87
+ * Resolved stdout capture budget in bytes, applied to every execution's
88
+ * stdout; stderr keeps the executor's own output cap.
84
89
  */
85
90
  stdoutMaxBytes: number
86
- /** Abort signal — implementations kill the command when it fires. */
91
+ /** Abort signal — implementations kill the command when it fires, and treat a signal that is already aborted as fired. */
87
92
  signal?: AbortSignal | undefined
88
93
  /** Bytes to write to stdin before closing it; absent means no stdin. */
89
94
  stdin?: string | undefined
@@ -110,11 +115,11 @@ interface ShellExecSpec {
110
115
  The outcome of one completed (or killed) foreground run. Orthogonal outcomes are reported **independently** — a process can both time out AND exit 0 because it trapped the signal — so `timedOut`, `aborted`, `signal`, and `exitCode` are each their own field; a caller never reads a cut-short run as a clean success.
111
116
 
112
117
  ```ts type-equiv
113
- /** The outcome of one completed (or killed) foreground run. */
118
+ /** The outcome of a foreground run, including timeout during preparation. */
114
119
  interface ShellRunResult {
115
- /** Exit code; null when the process died from a signal. */
120
+ /** Exit code; null when preparation expired or the process died from a signal. */
116
121
  exitCode: number | null
117
- /** Terminating signal (e.g. 'SIGTERM'); null on normal exit. */
122
+ /** Terminating signal, or null when none was reported, including preparation expiry. */
118
123
  signal: NodeJS.Signals | null
119
124
  /**
120
125
  * True when the executor's own timeout was the FIRST cause to cut the command
@@ -165,11 +170,11 @@ interface ShellSandboxInfo {
165
170
  }
166
171
  ```
167
172
 
168
- The `SANDBOX_UNAVAILABLE` error code (owned by the [sandbox seam](./sandbox.md)) is what the `ctx.sandbox` provider throws — and the executor propagates — when a confined mode has no usable backend. A selected runner refusing its profile reaches the same fail-closed foreground error; a settled background job records `runnerFailed`. The model receives denial/runner facts in results, learns the effective mode only when a denial marker names it, and can request a one-shot strictly wider retry through `sandbox_permissions` plus `justification`; `ctx.approval` must grant that exact call before anything executes. The complete policy and switching design is the [sandbox Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/feature/2026-07-06-sandbox.md).
173
+ The `SANDBOX_UNAVAILABLE` error code (owned by the [sandbox seam](./sandbox.md)) is what the `ctx.sandbox` provider throws — and the executor propagates — when a confined mode has no usable backend. A selected runner refusing its profile reaches the same fail-closed foreground error; a settled background job records `runnerFailed`. The model receives denial/runner facts in results, learns the effective mode only when a denial marker names it, and can request a one-shot strictly wider retry through `sandbox_permissions` plus `justification`; `ctx.approval` must grant that exact call before anything executes. The complete policy and switching design is the [sandbox reference](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/sandbox/sandbox-policy/README.md).
169
174
 
170
175
  ## Background processes: `ShellProcess`
171
176
 
172
- `start()` returns a handle with no id or owner. `dsh-tool-bash` adapts it into `ctx.jobs.start()` hooks; the generic runtime then owns job identity and lifecycle. `done` resolves when the underlying process settles and never rejects; a subprocess provider rejection becomes a `killed` process with a stage-neutral error on stderr. Reads remain valid after settlement, and sandbox facts are stamped before `done` resolves.
177
+ `start()` resolves with a handle after asynchronous launch preparation; cancellation or preparation failure rejects before publication. The handle has no id or owner. `dsh-tool-bash` adapts it into `ctx.jobs.start()` hooks; the generic runtime then owns job identity and lifecycle. `done` resolves when the underlying process settles and never rejects; a subprocess provider rejection becomes a `killed` process with a stage-neutral error on stderr. Reads remain valid after settlement, and sandbox facts are stamped before `done` resolves.
173
178
 
174
179
  ```ts type-equiv
175
180
  /**
@@ -198,6 +203,13 @@ interface ShellProcess {
198
203
  * full-stream spill files when available.
199
204
  */
200
205
  readOutput(): ShellProcessRead
206
+ /**
207
+ * Non-consuming offset readers over the same captured streams the consuming
208
+ * {@link readOutput} cursor drains, including the provider-failure note a
209
+ * rejected spawn leaves on stderr. Independent observers read here at their
210
+ * own offsets without stealing bytes from `readOutput`.
211
+ */
212
+ observed: ShellObservedStreams
201
213
  /**
202
214
  * Terminate the provider-managed range. Returns false when it had already finished
203
215
  * (no-op); idempotent.
@@ -240,36 +252,33 @@ Generated from source by `scripts/gen-cordis-catalog.ts` (verified fresh by `pnp
240
252
 
241
253
  Abstract bash execution service. Subclass, implement the abstract methods, and load the subclass as a plugin — it registers as `ctx.shell` (one implementation per context; loading a second throws, which is cordis' standard duplicate-service behavior).
242
254
 
255
+ execute resolves with the process handle after preparation. "Foreground" is a property of what the caller awaits, not of the spawn — a caller that awaits ShellExecution.result ran the command in the foreground; one that keeps the handle ran it in the background. A caller that waits only for a while runs the command under `onExpiry: 'none'` and bounds its own wait; the handle stays valid after the caller stops waiting.
256
+
243
257
  Implementations must honor these semantics:
244
258
 
245
- - run rejects only for infrastructure failures. Nonzero exits, timeout kills, and abort kills resolve with a ShellRunResult.
246
- - start returns immediately; no timeout applies to background processes. `done` settles at process close and never rejects; spawn failures settle as `killed` with the error on stderr.
259
+ - ShellExecution.result rejects only for infrastructure failures. Nonzero exits, timeout kills, and abort kills resolve with a descriptive result: first-cause `timedOut`/`aborted`, the spec's `timeoutMs` echoed.
260
+ - The handle is published after preparation. `done` settles at process close and never rejects; spawn failures settle as `killed` with the error on the read path, while `result()` carries the same failure as its rejection.
261
+ - `onExpiry: 'none'` arms no deadline; `'kill'` kills at expiry. Expiry during preparation returns a settled timed-out handle without output.
247
262
  - ShellProcess.readOutput is incremental: consecutive reads never repeat output. Lossy reads report truncation and available spill files.
248
- - A still-running background process is stopped and awaited when its owning composition tears down. With the subprocess seam that boundary is `ctx.subprocess` disposal, so a background process survives an executor-only reload.
263
+ - A still-running process is stopped and awaited when its owning composition tears down. With the subprocess seam that boundary is `ctx.subprocess` disposal, so a process survives an executor-only reload.
249
264
 
250
265
  ```ts cordis-catalog
251
266
  /**
252
267
  * Apply implementation-owned defaults and caps to a request before execution.
253
268
  * @param request - the caller's request; omitted fields get this
254
269
  * implementation's defaults, capped fields are clamped.
255
- * @returns the fully-specified spec to hand to {@link run}/{@link start}.
270
+ * @returns the fully-specified spec to hand to {@link execute}.
256
271
  */
257
272
  abstract resolve(request: ShellExecRequest): ShellExecSpec
258
273
 
259
274
  /**
260
- * Run a command in the foreground; resolves when it finishes.
261
- * @param spec - a resolved spec from {@link resolve}, never a raw request.
262
- * @returns the outcome; nonzero exits, timeout kills, and abort kills
263
- * resolve with a descriptive result rather than reject.
264
- */
265
- abstract run(spec: ShellExecSpec): Promise<ShellRunResult>
266
-
267
- /**
268
- * Start a background process and return its handle immediately.
275
+ * Prepare and spawn the command under its resolved deadline.
269
276
  * @param spec - a resolved spec from {@link resolve}, never a raw request.
270
- * @returns the live process handle (reads, kill, quiescence promise).
277
+ * @returns the prepared handle, including its result projection;
278
+ * preparation timeout yields an already-settled handle with no output.
279
+ * @throws on preparation failure or caller cancellation before process publication.
271
280
  */
272
- abstract start(spec: ShellExecSpec): ShellProcess
281
+ abstract execute(spec: ShellExecSpec): Promise<ShellExecution>
273
282
  ```
274
283
 
275
284
  Source: [`packages/shell/shell/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/shell/src/index.ts)