dsh-plugin-dev-kb 1.1.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 (370) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.en.md +14 -8
  3. package/README.md +15 -9
  4. package/docs/banner.svg +25 -0
  5. package/kb/INDEX.md +23 -19
  6. package/kb/README.md +8 -6
  7. package/kb/extra/AGENTS.md +11 -10
  8. package/kb/extra/cookbook/adding-a-remote-api.md +2 -2
  9. package/kb/extra/cookbook/adding-a-remote-api.zh.md +2 -2
  10. package/kb/extra/cookbook/adding-a-session-format-version.md +151 -0
  11. package/kb/extra/cookbook/adding-a-session-format-version.zh.md +151 -0
  12. package/kb/extra/cookbook/adding-a-vendored-package.md +1 -1
  13. package/kb/extra/cookbook/adding-a-vendored-package.zh.md +1 -1
  14. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.md +1 -1
  15. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.zh.md +1 -1
  16. package/kb/extra/cookbook/reviewing-persistence-type-changes.md +120 -0
  17. package/kb/extra/cookbook/reviewing-persistence-type-changes.zh.md +120 -0
  18. package/kb/extra/deepseek-llm-api-wire-extensions.md +19 -20
  19. package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +18 -19
  20. package/kb/extra/development.md +37 -10
  21. package/kb/extra/development.zh.md +37 -10
  22. package/kb/extra/event-producer-consumer.md +90 -67
  23. package/kb/extra/event-producer-consumer.zh.md +91 -68
  24. package/kb/extra/glossary.md +1 -1
  25. package/kb/extra/glossary.zh.md +1 -1
  26. package/kb/extra/i18n/README.md +16 -7
  27. package/kb/extra/i18n/README.zh.md +17 -8
  28. package/kb/extra/i18n/terminology.md +4 -4
  29. package/kb/extra/i18n/translation-prompt.md +3 -3
  30. package/kb/extra/module-graph.md +621 -335
  31. package/kb/extra/module-graph.zh.md +621 -335
  32. package/kb/extra/persistence-changes/2026-09-11-initial.md +280 -0
  33. package/kb/extra/persistence-changes/2026-09-11-initial.zh.md +280 -0
  34. package/kb/extra/persistence-changes/2026-09-12-auto-review-error-metadata.md +52 -0
  35. package/kb/extra/persistence-changes/2026-09-12-auto-review-error-metadata.zh.md +52 -0
  36. package/kb/extra/persistence-changes/2026-09-14-image-offload.md +96 -0
  37. package/kb/extra/persistence-changes/2026-09-14-image-offload.zh.md +96 -0
  38. package/kb/extra/persistence-changes/2026-09-14-workspace-changes-event.md +48 -0
  39. package/kb/extra/persistence-changes/2026-09-14-workspace-changes-event.zh.md +48 -0
  40. package/kb/extra/persistence-changes/2026-09-16-session-format-v4.md +120 -0
  41. package/kb/extra/persistence-changes/2026-09-16-session-format-v4.zh.md +120 -0
  42. package/kb/extra/persistence-changes/2026-09-18-schedule-optional-title.md +48 -0
  43. package/kb/extra/persistence-changes/2026-09-18-schedule-optional-title.zh.md +48 -0
  44. package/kb/extra/persistence-changes/2026-09-20-unknown-child-catalog.md +48 -0
  45. package/kb/extra/persistence-changes/2026-09-20-unknown-child-catalog.zh.md +48 -0
  46. package/kb/extra/persistence-changes/2026-09-21-user-question-reply.md +60 -0
  47. package/kb/extra/persistence-changes/2026-09-21-user-question-reply.zh.md +60 -0
  48. package/kb/extra/persistence-changes/README.md +88 -0
  49. package/kb/extra/persistence-changes/README.zh.md +88 -0
  50. package/kb/extra/persistence-changes/historical-formats/README.md +75 -0
  51. package/kb/extra/persistence-changes/historical-formats/README.zh.md +75 -0
  52. package/kb/extra/persistence-changes/historical-formats/v0.md +5105 -0
  53. package/kb/extra/persistence-changes/historical-formats/v0.zh.md +5105 -0
  54. package/kb/extra/persistence-changes/historical-formats/v1.md +5107 -0
  55. package/kb/extra/persistence-changes/historical-formats/v1.zh.md +5107 -0
  56. package/kb/extra/persistence-changes/historical-formats/v2.md +5362 -0
  57. package/kb/extra/persistence-changes/historical-formats/v2.zh.md +5362 -0
  58. package/kb/extra/persistence-changes/historical-formats/v3.md +5634 -0
  59. package/kb/extra/persistence-changes/historical-formats/v3.zh.md +5634 -0
  60. package/kb/extra/persistence-changes/releases/README.md +103 -0
  61. package/kb/extra/persistence-changes/releases/README.zh.md +103 -0
  62. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.1.md +201 -0
  63. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.1.zh.md +201 -0
  64. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.2.md +261 -0
  65. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md +261 -0
  66. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.3.md +126 -0
  67. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md +126 -0
  68. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.4.md +75 -0
  69. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.4.zh.md +75 -0
  70. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.5.md +75 -0
  71. package/kb/extra/persistence-changes/releases/dsh-v0.0.1-rc.5.zh.md +75 -0
  72. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.1.md +75 -0
  73. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.1.zh.md +75 -0
  74. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.2.md +75 -0
  75. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.2.zh.md +75 -0
  76. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.3.md +75 -0
  77. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.3.zh.md +75 -0
  78. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.5.md +75 -0
  79. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.5.zh.md +75 -0
  80. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.6.md +75 -0
  81. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.6.zh.md +75 -0
  82. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.7.md +82 -0
  83. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md +82 -0
  84. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.8.md +110 -0
  85. package/kb/extra/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md +110 -0
  86. package/kb/extra/persistence-changes/releases/dsh-v0.1.1-rc.1.md +82 -0
  87. package/kb/extra/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md +82 -0
  88. package/kb/extra/persistence-changes/releases/dsh-v0.1.1-rc.2.md +119 -0
  89. package/kb/extra/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md +119 -0
  90. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.1.md +295 -0
  91. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md +295 -0
  92. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.2.md +286 -0
  93. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md +286 -0
  94. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.3.md +75 -0
  95. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.3.zh.md +75 -0
  96. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.4.md +95 -0
  97. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md +95 -0
  98. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.5.md +75 -0
  99. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-alpha.5.zh.md +75 -0
  100. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-rc.1.md +75 -0
  101. package/kb/extra/persistence-changes/releases/dsh-v0.1.2-rc.1.zh.md +75 -0
  102. package/kb/extra/persistence-changes/releases/dsh-v0.1.3-alpha.1.md +154 -0
  103. package/kb/extra/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md +154 -0
  104. package/kb/extra/persistence-changes/releases/dsh-v0.1.3-alpha.2.md +86 -0
  105. package/kb/extra/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md +86 -0
  106. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-alpha.1.md +139 -0
  107. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md +139 -0
  108. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-alpha.2.md +95 -0
  109. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md +95 -0
  110. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-rc.1.md +75 -0
  111. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-rc.1.zh.md +75 -0
  112. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-rc.2.md +75 -0
  113. package/kb/extra/persistence-changes/releases/dsh-v0.1.5-rc.2.zh.md +75 -0
  114. package/kb/extra/rescope.md +2 -2
  115. package/kb/extra/rescope.zh.md +2 -2
  116. package/kb/extra/session-format-status.md +63 -0
  117. package/kb/extra/session-format-status.zh.md +63 -0
  118. package/kb/extra/subsystems/agent-team.md +52 -28
  119. package/kb/extra/subsystems/agent-team.zh.md +52 -28
  120. package/kb/extra/subsystems/attachment.md +19 -9
  121. package/kb/extra/subsystems/attachment.zh.md +19 -9
  122. package/kb/extra/subsystems/boot.md +323 -0
  123. package/kb/extra/subsystems/boot.zh.md +323 -0
  124. package/kb/extra/subsystems/browser-use.md +67 -0
  125. package/kb/extra/subsystems/browser-use.zh.md +67 -0
  126. package/kb/extra/subsystems/claude-code-mods.md +146 -0
  127. package/kb/extra/subsystems/claude-code-mods.zh.md +146 -0
  128. package/kb/extra/subsystems/computer-use.md +56 -0
  129. package/kb/extra/subsystems/computer-use.zh.md +56 -0
  130. package/kb/extra/subsystems/deliverables.md +178 -0
  131. package/kb/extra/subsystems/deliverables.zh.md +178 -0
  132. package/kb/extra/subsystems/extensions.md +6 -4
  133. package/kb/extra/subsystems/extensions.zh.md +6 -4
  134. package/kb/extra/subsystems/feedback.md +165 -31
  135. package/kb/extra/subsystems/feedback.zh.md +165 -31
  136. package/kb/extra/subsystems/mcp.md +139 -0
  137. package/kb/extra/subsystems/mcp.zh.md +139 -0
  138. package/kb/extra/subsystems/office-to-pdf.md +87 -0
  139. package/kb/extra/subsystems/office-to-pdf.zh.md +87 -0
  140. package/kb/extra/subsystems/otel.md +44 -0
  141. package/kb/extra/subsystems/otel.zh.md +44 -0
  142. package/kb/extra/subsystems/product-telemetry.md +79 -0
  143. package/kb/extra/subsystems/product-telemetry.zh.md +79 -0
  144. package/kb/extra/subsystems/ssh.md +135 -0
  145. package/kb/extra/subsystems/ssh.zh.md +135 -0
  146. package/kb/extra/subsystems/todo.md +3 -3
  147. package/kb/extra/subsystems/todo.zh.md +3 -3
  148. package/kb/extra/subsystems/voice-input.md +164 -0
  149. package/kb/extra/subsystems/voice-input.zh.md +164 -0
  150. package/kb/extra/subsystems/webhook.md +3 -3
  151. package/kb/extra/subsystems/webhook.zh.md +1 -1
  152. package/kb/extra/testing.md +5 -4
  153. package/kb/extra/testing.zh.md +5 -4
  154. package/kb/extra/ui-radius.md +115 -0
  155. package/kb/extra/ui-radius.zh.md +115 -0
  156. package/kb/extra/upgrade-guide/v0.1.7-rc.2/schedule-optional-bundle/guide.md +22 -0
  157. package/kb/extra/upgrade-guide/v0.1.7-rc.2/schedule-optional-bundle/guide.zh.md +22 -0
  158. package/kb/extra/upgrade-guide/v0.1.7-rc.2/transcript-view-legacy-normal/guide.md +25 -0
  159. package/kb/extra/upgrade-guide/v0.1.7-rc.2/transcript-view-legacy-normal/guide.zh.md +25 -0
  160. package/kb/extra/upgrade-guide/v0.2.0-rc.2/account-sign-in-errors/guide.md +18 -0
  161. package/kb/extra/upgrade-guide/v0.2.0-rc.2/account-sign-in-errors/guide.zh.md +18 -0
  162. package/kb/extra/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/guide.md +23 -0
  163. package/kb/extra/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/guide.zh.md +23 -0
  164. package/kb/extra/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/guide.md +22 -0
  165. package/kb/extra/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/guide.zh.md +22 -0
  166. package/kb/extra/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/guide.md +27 -0
  167. package/kb/extra/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/guide.zh.md +27 -0
  168. package/kb/extra/web-styling.md +12 -2
  169. package/kb/extra/web-styling.zh.md +12 -2
  170. package/kb/meta/search-index.json +1019 -251
  171. package/kb/meta/site-pages.txt +187 -183
  172. package/kb/meta/source.json +8 -8
  173. package/kb/meta/topics.md +11 -7
  174. package/kb/site/develop/basic/config.md +1 -0
  175. package/kb/site/develop/basic/index.md +1 -0
  176. package/kb/site/develop/basic/publish.md +10 -3
  177. package/kb/site/develop/basic/tool.md +1 -0
  178. package/kb/site/develop/cordis-tutorial/01-first-plugin.md +1 -0
  179. package/kb/site/develop/cordis-tutorial/02-lifecycle-and-effects.md +1 -0
  180. package/kb/site/develop/cordis-tutorial/03-services.md +1 -0
  181. package/kb/site/develop/cordis-tutorial/04-events.md +1 -0
  182. package/kb/site/develop/cordis-tutorial/05-config.md +28 -0
  183. package/kb/site/develop/cordis-tutorial/06-composition-and-hmr.md +3 -2
  184. package/kb/site/develop/cordis-tutorial/07-into-the-harness.md +1 -0
  185. package/kb/site/develop/cordis-tutorial/index.md +1 -0
  186. package/kb/site/develop/framework/events.md +1 -0
  187. package/kb/site/develop/framework/index.md +2 -1
  188. package/kb/site/develop/framework/service.md +1 -0
  189. package/kb/site/develop/practice/dynamic-cordis.md +9 -8
  190. package/kb/site/develop/practice/index.md +1 -0
  191. package/kb/site/develop/practice/llm-adapter.md +2 -1
  192. package/kb/site/en/develop/basic/config.md +1 -0
  193. package/kb/site/en/develop/basic/index.md +1 -0
  194. package/kb/site/en/develop/basic/publish.md +10 -3
  195. package/kb/site/en/develop/basic/tool.md +1 -0
  196. package/kb/site/en/develop/cordis-tutorial/01-first-plugin.md +1 -0
  197. package/kb/site/en/develop/cordis-tutorial/02-lifecycle-and-effects.md +1 -0
  198. package/kb/site/en/develop/cordis-tutorial/03-services.md +1 -0
  199. package/kb/site/en/develop/cordis-tutorial/04-events.md +1 -0
  200. package/kb/site/en/develop/cordis-tutorial/05-config.md +28 -0
  201. package/kb/site/en/develop/cordis-tutorial/06-composition-and-hmr.md +3 -2
  202. package/kb/site/en/develop/cordis-tutorial/07-into-the-harness.md +1 -0
  203. package/kb/site/en/develop/cordis-tutorial/index.md +1 -0
  204. package/kb/site/en/develop/framework/events.md +1 -0
  205. package/kb/site/en/develop/framework/index.md +2 -1
  206. package/kb/site/en/develop/framework/service.md +1 -0
  207. package/kb/site/en/develop/practice/dynamic-cordis.md +9 -8
  208. package/kb/site/en/develop/practice/index.md +1 -0
  209. package/kb/site/en/develop/practice/llm-adapter.md +2 -1
  210. package/kb/site/en/guide/github-review.md +1 -0
  211. package/kb/site/en/guide/mcp-memory.md +1 -0
  212. package/kb/site/en/guide/network-proxy.md +2 -1
  213. package/kb/site/en/guide/providers-custom-form.png +0 -0
  214. package/kb/site/en/guide/providers-models-page.png +0 -0
  215. package/kb/site/en/guide/providers.md +98 -83
  216. package/kb/site/en/guide/public-deployments.md +36 -0
  217. package/kb/site/en/guide/python-sdk.md +60 -23
  218. package/kb/site/en/guide/quickstart.md +2 -0
  219. package/kb/site/en/guide/schedule.md +70 -11
  220. package/kb/site/en/reference/agent-lifecycle.md +13 -5
  221. package/kb/site/en/reference/api-gateway.md +13 -11
  222. package/kb/site/en/reference/capability-seams.md +187 -62
  223. package/kb/site/en/reference/config-catalog.md +1887 -819
  224. package/kb/site/en/reference/cookbook/adding-a-package.md +57 -3
  225. package/kb/site/en/reference/cookbook/adding-a-settings-card.md +35 -64
  226. package/kb/site/en/reference/cookbook/adding-a-tool.md +5 -4
  227. package/kb/site/en/reference/cookbook/adding-an-llm-adapter.md +1 -0
  228. package/kb/site/en/reference/cookbook/extension-cookbook.md +7 -6
  229. package/kb/site/en/reference/cordis-api/context.md +1 -0
  230. package/kb/site/en/reference/cordis-api/events.md +1 -0
  231. package/kb/site/en/reference/cordis-api/fiber.md +4 -3
  232. package/kb/site/en/reference/cordis-api/inherited.md +16 -16
  233. package/kb/site/en/reference/cordis-api/registry.md +1 -0
  234. package/kb/site/en/reference/cordis-api/service.md +1 -0
  235. package/kb/site/en/reference/cordis-primer.md +1 -0
  236. package/kb/site/en/reference/index.md +32 -15
  237. package/kb/site/en/reference/persistence-catalog.md +7787 -81
  238. package/kb/site/en/reference/subsystems/approval.md +3 -2
  239. package/kb/site/en/reference/subsystems/client-modules.md +30 -13
  240. package/kb/site/en/reference/subsystems/client-resources.md +96 -0
  241. package/kb/site/en/reference/subsystems/commands.md +6 -1
  242. package/kb/site/en/reference/subsystems/compaction.md +50 -3
  243. package/kb/site/en/reference/subsystems/conversation.md +36 -6
  244. package/kb/site/en/reference/subsystems/core.md +174 -271
  245. package/kb/site/en/reference/subsystems/credentials.md +169 -5
  246. package/kb/site/en/reference/subsystems/filesystem.md +26 -0
  247. package/kb/site/en/reference/subsystems/goal.md +39 -2
  248. package/kb/site/en/reference/subsystems/index.md +18 -5
  249. package/kb/site/en/reference/subsystems/jobs.md +337 -127
  250. package/kb/site/en/reference/subsystems/llm-streaming.md +93 -43
  251. package/kb/site/en/reference/subsystems/lsp.md +2 -1
  252. package/kb/site/en/reference/subsystems/permission-presets.md +66 -29
  253. package/kb/site/en/reference/subsystems/persistence.md +40 -18
  254. package/kb/site/en/reference/subsystems/plan.md +2 -1
  255. package/kb/site/en/reference/subsystems/ptc-runtime.md +236 -0
  256. package/kb/site/en/reference/subsystems/sandbox.md +7 -5
  257. package/kb/site/en/reference/subsystems/schedule.md +392 -33
  258. package/kb/site/en/reference/subsystems/scope.md +2 -1
  259. package/kb/site/en/reference/subsystems/session-projection.md +22 -19
  260. package/kb/site/en/reference/subsystems/session-query.md +1 -0
  261. package/kb/site/en/reference/subsystems/session-reference.md +12 -6
  262. package/kb/site/en/reference/subsystems/session-telemetry.md +27 -8
  263. package/kb/site/en/reference/subsystems/session-title.md +6 -5
  264. package/kb/site/en/reference/subsystems/session.md +258 -118
  265. package/kb/site/en/reference/subsystems/settings.md +43 -292
  266. package/kb/site/en/reference/subsystems/shell.md +44 -32
  267. package/kb/site/en/reference/subsystems/sidebar-right.md +162 -0
  268. package/kb/site/en/reference/subsystems/skills.md +5 -6
  269. package/kb/site/en/reference/subsystems/slots.md +68 -39
  270. package/kb/site/en/reference/subsystems/spill.md +15 -7
  271. package/kb/site/en/reference/subsystems/storage.md +2 -2
  272. package/kb/site/en/reference/subsystems/subagent.md +65 -72
  273. package/kb/site/en/reference/subsystems/subprocess.md +42 -44
  274. package/kb/site/en/reference/subsystems/system-prompt.md +7 -2
  275. package/kb/site/en/reference/subsystems/terminal.md +1 -0
  276. package/kb/site/en/reference/subsystems/token-meter.md +3 -1
  277. package/kb/site/en/reference/subsystems/tools.md +44 -16
  278. package/kb/site/en/reference/subsystems/typert.md +153 -10
  279. package/kb/site/en/reference/subsystems/user-questions.md +131 -1
  280. package/kb/site/en/reference/subsystems/web-client.md +15 -9
  281. package/kb/site/en/reference/subsystems/web-server.md +74 -1
  282. package/kb/site/en/reference/subsystems/web.md +1 -0
  283. package/kb/site/en/reference/subsystems/workflow.md +10 -9
  284. package/kb/site/en/reference/subsystems/workspace.md +343 -4
  285. package/kb/site/en/reference/tool-catalog.md +806 -311
  286. package/kb/site/en/reference/tool-execution-pipeline.md +9 -5
  287. package/kb/site/guide/github-review.md +1 -0
  288. package/kb/site/guide/mcp-memory.md +1 -0
  289. package/kb/site/guide/network-proxy.md +2 -1
  290. package/kb/site/guide/providers-custom-form.zh.png +0 -0
  291. package/kb/site/guide/providers-models-page.zh.png +0 -0
  292. package/kb/site/guide/providers.md +109 -94
  293. package/kb/site/guide/public-deployments.md +36 -0
  294. package/kb/site/guide/python-sdk.md +60 -23
  295. package/kb/site/guide/quickstart.md +2 -0
  296. package/kb/site/guide/schedule.md +70 -11
  297. package/kb/site/reference/agent-lifecycle.md +13 -5
  298. package/kb/site/reference/api-gateway.md +13 -11
  299. package/kb/site/reference/capability-seams.md +187 -62
  300. package/kb/site/reference/config-catalog.md +1889 -820
  301. package/kb/site/reference/cookbook/adding-a-package.md +55 -3
  302. package/kb/site/reference/cookbook/adding-a-settings-card.md +35 -64
  303. package/kb/site/reference/cookbook/adding-a-tool.md +5 -4
  304. package/kb/site/reference/cookbook/adding-an-llm-adapter.md +1 -0
  305. package/kb/site/reference/cookbook/extension-cookbook.md +7 -6
  306. package/kb/site/reference/cordis-api/context.md +1 -0
  307. package/kb/site/reference/cordis-api/events.md +1 -0
  308. package/kb/site/reference/cordis-api/fiber.md +4 -3
  309. package/kb/site/reference/cordis-api/inherited.md +16 -16
  310. package/kb/site/reference/cordis-api/registry.md +1 -0
  311. package/kb/site/reference/cordis-api/service.md +1 -0
  312. package/kb/site/reference/cordis-primer.md +1 -0
  313. package/kb/site/reference/index.md +32 -15
  314. package/kb/site/reference/persistence-catalog.md +7791 -85
  315. package/kb/site/reference/subsystems/approval.md +3 -2
  316. package/kb/site/reference/subsystems/client-modules.md +30 -13
  317. package/kb/site/reference/subsystems/client-resources.md +96 -0
  318. package/kb/site/reference/subsystems/commands.md +6 -1
  319. package/kb/site/reference/subsystems/compaction.md +50 -3
  320. package/kb/site/reference/subsystems/conversation.md +35 -5
  321. package/kb/site/reference/subsystems/core.md +174 -271
  322. package/kb/site/reference/subsystems/credentials.md +169 -5
  323. package/kb/site/reference/subsystems/filesystem.md +26 -0
  324. package/kb/site/reference/subsystems/goal.md +39 -2
  325. package/kb/site/reference/subsystems/index.md +28 -15
  326. package/kb/site/reference/subsystems/jobs.md +336 -126
  327. package/kb/site/reference/subsystems/llm-streaming.md +93 -43
  328. package/kb/site/reference/subsystems/lsp.md +2 -1
  329. package/kb/site/reference/subsystems/permission-presets.md +66 -29
  330. package/kb/site/reference/subsystems/persistence.md +40 -18
  331. package/kb/site/reference/subsystems/plan.md +2 -1
  332. package/kb/site/reference/subsystems/ptc-runtime.md +236 -0
  333. package/kb/site/reference/subsystems/sandbox.md +7 -5
  334. package/kb/site/reference/subsystems/schedule.md +392 -33
  335. package/kb/site/reference/subsystems/scope.md +2 -1
  336. package/kb/site/reference/subsystems/session-projection.md +22 -19
  337. package/kb/site/reference/subsystems/session-query.md +1 -0
  338. package/kb/site/reference/subsystems/session-reference.md +12 -6
  339. package/kb/site/reference/subsystems/session-telemetry.md +27 -8
  340. package/kb/site/reference/subsystems/session-title.md +6 -5
  341. package/kb/site/reference/subsystems/session.md +258 -118
  342. package/kb/site/reference/subsystems/settings.md +43 -292
  343. package/kb/site/reference/subsystems/shell.md +44 -32
  344. package/kb/site/reference/subsystems/sidebar-right.md +162 -0
  345. package/kb/site/reference/subsystems/skills.md +5 -6
  346. package/kb/site/reference/subsystems/slots.md +68 -39
  347. package/kb/site/reference/subsystems/spill.md +15 -7
  348. package/kb/site/reference/subsystems/storage.md +2 -2
  349. package/kb/site/reference/subsystems/subagent.md +64 -71
  350. package/kb/site/reference/subsystems/subprocess.md +42 -44
  351. package/kb/site/reference/subsystems/system-prompt.md +7 -2
  352. package/kb/site/reference/subsystems/terminal.md +1 -0
  353. package/kb/site/reference/subsystems/token-meter.md +3 -1
  354. package/kb/site/reference/subsystems/tools.md +44 -16
  355. package/kb/site/reference/subsystems/typert.md +153 -10
  356. package/kb/site/reference/subsystems/user-questions.md +132 -2
  357. package/kb/site/reference/subsystems/web-client.md +15 -9
  358. package/kb/site/reference/subsystems/web-server.md +74 -1
  359. package/kb/site/reference/subsystems/web.md +1 -0
  360. package/kb/site/reference/subsystems/workflow.md +10 -9
  361. package/kb/site/reference/subsystems/workspace.md +343 -4
  362. package/kb/site/reference/tool-catalog.md +810 -315
  363. package/kb/site/reference/tool-execution-pipeline.md +9 -5
  364. package/lib/index.js +25 -44
  365. package/package.json +3 -2
  366. package/skills/dsh-plugin-dev-kb.md +6 -5
  367. package/kb/site/en/reference/subsystems/code-runtime.md +0 -198
  368. package/kb/site/en/reference/subsystems/invariants.md +0 -91
  369. package/kb/site/reference/subsystems/code-runtime.md +0 -198
  370. package/kb/site/reference/subsystems/invariants.md +0 -91
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  editSource: "docs/tool-catalog.md"
3
+ rawMarkdownPath: "en/reference/tool-catalog.md"
3
4
  ---
4
5
 
5
6
  <!-- Generated by scripts/gen-tool-catalog.ts — do not edit by hand.
@@ -9,7 +10,7 @@ editSource: "docs/tool-catalog.md"
9
10
 
10
11
  Every model-facing tool a shipped plugin contributes to `ctx.tools`: the `name`, `description`, and JSON-Schema `parameters` the model receives via the system-prompt assembly. It complements the [subsystem pages](./subsystems/core.md) (the types plus each page's generated Cordis API region) — this page is the *tools* the agent is offered.
11
12
 
12
- This file is GENERATED and verified fresh by `pnpm run verify-tool-catalog` (part of `doc-sync`) — do not edit it by hand. Unlike the cordis catalog (a pure source-AST pass), this generator BOOTS each tool plugin on a real context and reads `ctx.tools.schemas()`, because a tool schema is not statically knowable (runtime-spread enums, concatenated descriptions, config-driven names, raw-JSON-Schema MCP tools). A completeness guard globs `packages/*/tool-*` and fails if any package is missing from the generator's boot manifest, so a new tool cannot be silently undocumented. See [the tool-schema-catalog Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md).
13
+ This file is GENERATED and verified fresh by `pnpm run verify-tool-catalog` (part of `doc-sync`) — do not edit it by hand. Unlike the cordis catalog (a pure source-AST pass), this generator BOOTS each tool plugin on a real context and reads `ctx.tools.schemas()`, because a tool schema is not statically knowable (runtime-spread enums, concatenated descriptions, config-driven names, raw-JSON-Schema MCP tools). A completeness guard globs `packages/*/tool-*` and fails if any package is missing from the generator's boot manifest, so a new tool cannot be silently undocumented.
13
14
 
14
15
  Scope: shipped product tools under `packages/*/tool-*`, each booted with its DEFAULT config, except where a Config field is REQUIRED with no default — there the generator must choose, and the per-package note records which branch this page shows. The registered tool NAME can be a load-time config (e.g. `tool-subagent`'s `toolName`), so a deployment may expose a package under a different or additional name — a per-package note records those shipped aliases where they exist. The `examples/` demo tools (e.g. `echo`) are excluded, matching the cordis catalog's packages-only scope.
15
16
 
@@ -19,12 +20,16 @@ This table connects model-visible tool names to the plugin package and service s
19
20
 
20
21
  | Tool package | Model-visible names | Requires | Writes / affects | Shipped aliases | Deployment note |
21
22
  | --- | --- | --- | --- | --- | --- |
22
- | `@deepseek-ai/dsh-tool-ask-user` | `ask_user_question` | `ctx.tools`, `ctx.userQuestions` | `tool/call`, `tool/result after a UI/provider answers the question` | - | ask_user_question pauses the tool call until the active UI provider returns a human answer. |
23
- | `@deepseek-ai/dsh-tools` | `run_code` | `ctx.tools`, `ctx.codeRuntime (execution time)`, `ctx.systemPrompt` | `tool/call`, `one tool/code-dispatch-start + tool/code-dispatch pair per bridged sub-call`, `tool/result` | - | Owned by the tool registry as a reserved transport outside filterable capability layers under `mode: ptc` / `mode: both` (see the PTC mode Agent Note). Under `ptc` it is the registry's only wire contribution; the other visible capabilities are declared in a generated SDK section in the loaded runtime's language, and a program calls them through bindings scheduled under the native concurrency contract (submission-ordered starts and policy; concurrency-safe bodies overlap up to `maxParallelSubCalls`) that re-enter the complete guarded tool pipeline and link each nested execution to this outer result. |
23
+ | `@deepseek-ai/dsh-plugin-manager` | `plugin_manager` | `ctx.tools`, `ctx.pluginManager`, `ctx.sandboxPolicy` | `tool/call`, `tool/result`, `user/message` | - | - |
24
+ | `@deepseek-ai/dsh-mcp-resources` | `list_mcp_resource_templates`, `list_mcp_resources`, `read_mcp_resource` | `ctx.tools`, `ctx.mcpResources` | `tool/call`, `tool/result` | - | - |
25
+ | `@deepseek-ai/dsh-experimental-browser-use-stagehand-native` | `stagehand_act`, `stagehand_extract`, `stagehand_navigate`, `stagehand_observe`, `stagehand_screenshot`, `stagehand_tabs` | `ctx.browserUse`, `ctx.agents`, `ctx.tools`, `ctx.systemPrompt` | `tool/call`, `tool/result` | - | - |
26
+ | `@deepseek-ai/dsh-tool-ask-user` | `ask_user_question` | `ctx.tools`, `ctx.userQuestions` | `tool/call`, `tool/result after an answer or timeout`, `late user/message` | - | ask_user_question keeps the original blocking behavior by default; set `mode: timed` to opt into a foreground timeout and pending result while the question remains answerable. In timed mode, `timeout: -1` keeps that call blocking indefinitely. |
27
+ | `@deepseek-ai/dsh-tools` | `run_code` | `ctx.tools`, `ctx.ptcRuntime (execution time)`, `ctx.systemPrompt` | `tool/call`, `one tool/ptc-dispatch-start + tool/ptc-dispatch pair per bridged sub-call`, `tool/result` | - | Owned by the tool registry as a reserved transport outside filterable capability layers under `mode: ptc` / `mode: both` (see the PTC mode Agent Note). Under `ptc` it is the registry's only wire contribution; the other visible capabilities are declared in a generated SDK section in the loaded runtime's language, and a program calls them through bindings scheduled under the native concurrency contract (submission-ordered starts and policy; concurrency-safe bodies overlap up to `maxParallelSubCalls`) that re-enter the complete guarded tool pipeline and link each nested execution to this outer result. |
24
28
  | `@deepseek-ai/dsh-plan-mode` | `exit_plan_mode` | `ctx.tools`, `ctx.systemPrompt`, `ctx.userQuestions (execution time, opportunistic)` | `tool/call`, `plan/mode inactive on an approved review`, `tool/result` | - | exit_plan_mode stays in the model-facing schema while planning is inactive so transitions add no tool-catalog churn on top of the plan-policy change. Its execute path rejects calls outside plan mode; in plan mode it presents the plan over the user-questions seam (approve / keep planning with feedback), and approval logs plan mode inactive at the step boundary. |
25
- | `@deepseek-ai/dsh-tool-bash` | `bash` | `ctx.tools`, `ctx.shell`, `ctx.systemPrompt`, `ctx.shellEnv`, `ctx.jobs at call time for run_in_background` | `tool/call`, `tool/result` | - | The bash tool is the model-facing consumer of the bash executor seam. A `run_in_background` run registers with the generic `ctx.jobs` runtime and is collected/stopped through the `job_*` tools from `@deepseek-ai/dsh-tool-jobs`; the `enableRunInBackground` config (default true) removes the parameter entirely when disabled. |
26
- | `@deepseek-ai/dsh-tool-pwsh` | `pwsh` | `ctx.tools`, `ctx.shell`, `ctx.systemPrompt`, `ctx.shellEnv`, `ctx.jobs at call time for run_in_background` | `tool/call`, `tool/result` | - | The pwsh tool is the PowerShell-dialect consumer of the bash executor seam for Windows compositions (a PowerShell executor such as `@deepseek-ai/dsh-pwsh-local` backs `ctx.shell`); it mirrors the bash tool call-for-call minus sandbox controls — `run_in_background` runs register with the generic `ctx.jobs` runtime and are collected/stopped through the `job_*` tools, and the managed `DSH_*` environment comes from `@deepseek-ai/dsh-shell-env`. Each call runs in a fresh process (no persistent PTY session), with native `C:\...` paths and `$env:NAME` variables. |
27
- | `@deepseek-ai/dsh-tool-cordis` | `cordis_define`, `cordis_inspect_list`, `cordis_inspect_query`, `cordis_inspect_self`, `cordis_run`, `cordis_stop`, `cordis_undefine` | `ctx.tools`, `ctx.dynamicCordisRunner` | `tool/call`, `tool/result`, `process-local dynamic package lifecycle` | - | Not in any shipped tree (a deliberate opt-in — dynamic package code reaches the real runtime, see .agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md). The toolset injects `ctx.dynamicCordisRunner` from `@deepseek-ai/dsh-cordis-host-runner`, which owns the definition registry and the vm sandbox; a composition missing it never activates the tools. A running package may register ADDITIONAL model-visible tools until it is stopped, undefined, or DSH restarts; a full changed request header logs those tool-set changes. |
29
+ | `@deepseek-ai/dsh-tool-bash` | `bash` | `ctx.tools`, `ctx.shell`, `ctx.systemPrompt`, `ctx.shellEnv`, `ctx.jobs for run_in_background and the job-backed foreground path` | `tool/call`, `tool/result` | - | The bash tool is the model-facing consumer of the bash executor seam. With a job registry composed every call registers with the generic `ctx.jobs` runtime as it starts, collected/stopped through the `job_*` tools from `@deepseek-ai/dsh-tool-jobs`; without one, or with `enableRunInBackground: false`, the tool registers a foreground-only schema without the `run_in_background` parameter. |
30
+ | `@deepseek-ai/dsh-tool-present` | `present` | `ctx.tools`, `ctx.fs`, `ctx.sessionProjections` | `tool/call`, `deliverables/presented after a successful final result`, `tool/result` | - | Deliveries belong to the calling Session; Web ui-deliverables supplies source-file opening and cards. |
31
+ | `@deepseek-ai/dsh-tool-pwsh` | `pwsh` | `ctx.tools`, `ctx.shell`, `ctx.systemPrompt`, `ctx.shellEnv`, `ctx.jobs for run_in_background and the job-backed foreground path` | `tool/call`, `tool/result` | - | The pwsh tool is the PowerShell-dialect consumer of the bash executor seam for Windows compositions (a PowerShell executor such as `@deepseek-ai/dsh-pwsh-local` backs `ctx.shell`); it mirrors the bash tool call-for-call minus sandbox controls — `run_in_background` runs register with the generic `ctx.jobs` runtime and are collected/stopped through the `job_*` tools, and the managed `DSH_*` environment comes from `@deepseek-ai/dsh-shell-env`. Each call runs in a fresh process (no persistent PTY session), with native `C:\...` paths and `$env:NAME` variables. |
32
+ | `@deepseek-ai/dsh-tool-cordis` | `cordis_inspect_list`, `cordis_inspect_query` | `ctx.tools`, `ctx.cordisInspect` | `tool/call`, `tool/result` | - | Creator mode provides two read-only runtime inspection tools. The Cordis host runner supplies the inspection registry; Client queries require a connected page. Author persistent changes as bundles and install them with plugin_manager. |
28
33
  | `@deepseek-ai/dsh-tool-bash-persistent` | `bash` | `ctx.tools`, `ctx.terminals`, `an owning Agent at execution time` | `tool/call`, `PTY shell state`, `tool/result` | - | One owner-isolated persistent bash tool; deployment composition supplies the PTY backend and may override the model-facing environment description. |
29
34
  | `@deepseek-ai/dsh-tool-pwsh-persistent` | `pwsh` | `ctx.tools`, `ctx.terminals`, `an owning Agent at execution time` | `tool/call`, `PTY shell state`, `tool/result` | - | One owner-isolated persistent pwsh tool, the Windows counterpart of the persistent bash tool; deployment composition supplies a pwsh-dialect PTY backend and may override the model-facing environment description. |
30
35
  | `@deepseek-ai/dsh-tool-str-replace-editor` | `str_replace_editor` | `ctx.tools`, `ctx.fs` | `tool/call`, `fs/observed after view presence/absence, edit absence, or successful mutation`, `tool/result` | - | Standalone view/create/unique literal replace/line insert tool over the filesystem seam; it composes with any shell or terminal API. |
@@ -32,7 +37,7 @@ This table connects model-visible tool names to the plugin package and service s
32
37
  | `@deepseek-ai/dsh-tool-fs-search` | `glob`, `grep` | `ctx.tools`, `ctx.subprocess`, `ctx.systemPrompt` | `tool/call`, `tool/result` | - | glob and grep are unconditional discovery tools that spawn the packaged ripgrep binary (`@vscode/ripgrep`) through ctx.subprocess as ordinary foreground calls (never background jobs) — no host `rg` install and no shell layer. The catalog uses `sampleOverCapGlobResults: true`; deployments must choose that behavior explicitly. Capped results save the complete formatted list through the optional ctx.spillStore backend; returned locators are follow-up-readable/searchable when the backend exposes local paths in co-located deployments. |
33
38
  | `@deepseek-ai/dsh-tool-terminal` | `terminal_close`, `terminal_list`, `terminal_open`, `terminal_read`, `terminal_send`, `terminal_signal` | `ctx.tools`, `ctx.terminals`, `ctx.systemPrompt`, `ctx.jobs at call time for run_in_background` | `tool/call`, `tool/result` | - | The six terminal tools are opt-in and complement one-shot shell/filesystem tools. `terminal_send(run_in_background: true)` registers with `ctx.jobs`; TUI, named key sequences, BEL, resize, auto-start, and cross-agent sharing are absent from the schema. |
34
39
  | `@deepseek-ai/dsh-tool-goal` | `create_goal`, `get_goal`, `update_goal` | `ctx.tools`, `ctx.agents`, `ctx.goals`, `ctx.systemPrompt`, `a calling Agent in an authorized open turn` | `tool/call`, `goal/change for mutations`, `tool/result` | - | create, edit, pause, and resume require direct-human root authority; complete and blocked also accept the exact current goal round. The default blocked lower bound is three admitted rounds. |
35
- | `@deepseek-ai/dsh-schedule` | `schedule_create`, `schedule_delete`, `schedule_list` | `ctx.tools`, `ctx.sessions`, `Session persistence`, `a future live root Agent` | `tool/call`, `schedule/change create or delete`, `tool/result` | - | Registered only inside live root Agent scopes created after the opt-in Schedule plugin loads. Version 1 accepts after_seconds, explicit absolute at, and bounded fixed-rate every_seconds, and discloses session-local delivery; management reads and mutations require the shared Session persistence barrier. |
40
+ | `@deepseek-ai/dsh-tool-schedule` | `schedule_create`, `schedule_delete`, `schedule_list`, `schedule_update` | `ctx.tools`, `ctx.schedule` | `tool/call`, `Schedule storage domain create, update, or delete`, `tool/result` | - | A preset or Agent scope mounts this package; the preset decides which agents receive the four management tools. Each call acts on the calling Agent's Session. Accepts after_seconds, explicit absolute at, bounded fixed-rate every_seconds, daily and weekly local times in an explicit IANA zone, and cron as a five-field expression. Management uses the Host storage domain; due messages resume the original Session. |
36
41
  | `@deepseek-ai/dsh-tool-lsp` | `lsp` | `ctx.tools`, `ctx.lsp`, `ctx.systemPrompt` | `tool/call`, `tool/result` | - | The lsp tool keeps provider selection and language-server subprocesses behind ctx.lsp, so its model-visible schema stays stable across providers. Requires a registered provider (e.g. `@deepseek-ai/dsh-lsp-stdio`) at runtime; without one, a query returns the structured `LSP_UNAVAILABLE` error rather than changing the schema. |
37
42
  | `@deepseek-ai/dsh-tool-ralph` | `ralph` | `ctx.tools`, `ctx.workflowEngine`, `ctx.subagents`, `ctx.systemPrompt`, `a calling Agent (exec.agent parents every fresh round)` | `tool/call`, `tool/result`, `workflow and child session events during execution` | - | A fixed foreground workflow starts one fresh structured child per round; the model selects only the immutable objective and an optional round cap. |
38
43
  | `@deepseek-ai/dsh-tool-skill` | `skill` | `ctx.tools`, `ctx.agents`, `ctx.skills` | `tool/call`, `tool/result`, `user/message replacement catalogs via agent.inject()` | - | - |
@@ -43,466 +48,743 @@ This table connects model-visible tool names to the plugin package and service s
43
48
  | `@deepseek-ai/dsh-experimental-tool-agent-team` | `interrupt_agent`, `list_agents`, `send_message`, `spawn_teammate`, `team_task_create`, `team_task_get`, `team_task_list`, `team_task_update`, `wait_agent` | `ctx.tools`, `ctx.systemPrompt`, `ctx.agentTeams`, `an exact live Team member Agent` | `tool/call`, `team/member`, `team/message/queued`, `team/message/delivered`, `team/task`, `tool/result` | - | All nine tools are scoped to implicit Team Leads and durable teammates. The shipped dsh-base bundle keeps the package disabled; the documented Agent Teams profile patch enables it while disabling the legacy continuable-child control names. |
44
49
  | `@deepseek-ai/dsh-tool-todo` | `todo_write` | `ctx.tools`, `owning Agent session` | `tool/call`, `todo/write`, `tool/result` | - | todo_write is session-owned state; UIs render the latest todo/write event as a checklist. `allowParallelInProgress` is required with no default, so the catalog states its choice: `true`, whose description invites several `in_progress` items. A deployment choosing `false` receives the same tool with a description asking for exactly one active task. |
45
50
  | `@deepseek-ai/dsh-tool-workflow` | `workflow` | `ctx.tools`, `ctx.workflowEngine`, `ctx.systemPrompt`, `a calling Agent (exec.agent parents the script children)` | `tool/call`, `tool/result` | - | - |
51
+ | `@deepseek-ai/dsh-tool-workspace-dependencies` | `load_workspace_dependencies` | `ctx.tools` | `tool/call`, `tool/result` | - | - |
46
52
  | `@deepseek-ai/dsh-tool-web` | `web_fetch`, `web_search` | `ctx.tools`, `ctx.web`, `ctx.systemPrompt` | `tool/call`, `tool/result` | - | web_search and web_fetch keep provider selection behind ctx.web so model-visible schemas stay stable across backend swaps. |
47
53
 
48
- <a id="deepseek-aidsh-tool-ask-user"></a>
54
+ <a id="deepseek-aidsh-plugin-manager"></a>
49
55
 
50
- ## `@deepseek-ai/dsh-tool-ask-user`
56
+ ## `@deepseek-ai/dsh-plugin-manager`
51
57
 
52
- ### `ask_user_question`
58
+ ### `plugin_manager`
53
59
 
54
- Ask the user a concise question when you need confirmation, a choice, or missing information before proceeding. Send one or more questions, each with a stable id that will be echoed in the answer.
60
+ List plugins or bundles in the current profile, enable or disable them, install a bundle, or remove an installed bundle. Every action requires danger-full-access permission or approval for this call. Approval does not change the session permission mode. Changes affect every session in this profile. List first to obtain exact identifiers. Package installation can execute allowed build scripts. Live profiles apply changes immediately; startup profiles require restart. Incompatible DSH peer dependencies block installation and activation. Version exemptions risk crashes and data loss: warn the user and obtain explicit permission for the exact plugin and runtime versions before granting one.
55
61
 
56
62
  ```json
57
63
  {
58
64
  "type": "object",
59
65
  "properties": {
60
- "questions": {
66
+ "action": {
67
+ "type": "string",
68
+ "description": "Management operation.",
69
+ "enum": [
70
+ "list_plugins",
71
+ "list_bundles",
72
+ "set_plugin",
73
+ "set_bundle",
74
+ "install_bundle",
75
+ "remove_bundle",
76
+ "list_version_exemptions",
77
+ "set_version_exemption"
78
+ ]
79
+ },
80
+ "target": {
81
+ "type": "string",
82
+ "description": "Plugin entry id, bundle package name, or installation spec, according to action."
83
+ },
84
+ "enabled": {
85
+ "type": "boolean",
86
+ "description": "Required for set operations; defaults to true for installation. For set_version_exemption, true grants and false revokes."
87
+ },
88
+ "runtimeVersion": {
89
+ "type": "string",
90
+ "description": "For set_version_exemption: exact DSH version from list_version_exemptions. Target must be the manifest package-name@version, not an alias or version range."
91
+ },
92
+ "acceptRisk": {
93
+ "type": "boolean",
94
+ "description": "For granting an exemption: true only after warning the user about possible crashes and data loss and receiving explicit permission for this exact plugin/runtime pair. General installation permission is not enough."
95
+ },
96
+ "approvedBuilds": {
61
97
  "type": "array",
62
- "description": "Questions to ask the user before continuing.",
98
+ "description": "For install_bundle: pass names from pendingBuilds only after the user explicitly approves running their install scripts in the conversation. This grants persistent permission for this profile.",
63
99
  "items": {
64
- "type": "object",
65
- "additionalProperties": true,
66
- "properties": {
67
- "id": {
68
- "type": "string",
69
- "description": "Stable id for this question; echoed in the answer."
70
- },
71
- "question": {
72
- "type": "string",
73
- "description": "The specific question to ask the user."
74
- },
75
- "header": {
76
- "type": "string",
77
- "description": "Optional short heading for the question, such as \"Confirm\" or \"Choose Mode\"."
78
- },
79
- "options": {
80
- "type": "array",
81
- "description": "Optional choices to show the user. If you recommend one, put it first and append \"(Recommended)\" to that label.",
82
- "items": {
83
- "type": "object",
84
- "additionalProperties": true,
85
- "properties": {
86
- "label": {
87
- "type": "string",
88
- "description": "Short user-facing option label."
89
- },
90
- "description": {
91
- "type": "string",
92
- "description": "One sentence explaining the tradeoff or impact."
93
- }
94
- },
95
- "required": [
96
- "label"
97
- ]
98
- }
99
- },
100
- "multi_select": {
101
- "type": "boolean",
102
- "description": "Whether the user may select more than one option. Defaults to false."
103
- }
104
- },
105
- "required": [
106
- "id",
107
- "question"
108
- ]
100
+ "type": "string"
109
101
  }
102
+ },
103
+ "registry": {
104
+ "type": "string",
105
+ "description": "For install_bundle: the npm registry URL asked first, when the user names one; otherwise the configured registry is asked, and its configured fallbacks while a registry is unreachable."
106
+ },
107
+ "offset": {
108
+ "type": "number",
109
+ "description": "Zero-based list offset; defaults to 0."
110
+ },
111
+ "limit": {
112
+ "type": "number",
113
+ "description": "List page size, from 1 to 100; defaults to 25."
110
114
  }
111
115
  },
112
116
  "required": [
113
- "questions"
117
+ "action"
114
118
  ]
115
119
  }
116
120
  ```
117
121
 
118
- Source: [`packages/interaction/tool-ask-user/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/tool-ask-user/src/index.ts)
122
+ Source: [`packages/boot/plugin-manager/src/tools.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/boot/plugin-manager/src/tools.ts)
119
123
 
120
- ask_user_question pauses the tool call until the active UI provider returns a human answer.
124
+ <a id="deepseek-aidsh-mcp-resources"></a>
121
125
 
122
- <a id="deepseek-aidsh-tools"></a>
126
+ ## `@deepseek-ai/dsh-mcp-resources`
123
127
 
124
- ## `@deepseek-ai/dsh-tools`
128
+ ### `list_mcp_resource_templates`
125
129
 
126
- ### `run_code`
127
-
128
- Execute a TypeScript program against the available tools. Takes two required arguments: `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work), and `description`, a short summary of what the program does. Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return is program output — curate it. Image-bearing subtool results are attached after the run.
130
+ List parameterized resource URI templates from an MCP server.
129
131
 
130
132
  ```json
131
133
  {
132
134
  "type": "object",
133
135
  "properties": {
134
- "code": {
136
+ "server": {
135
137
  "type": "string",
136
- "description": "The program: the body of an async TypeScript function."
138
+ "description": "Configured MCP server name."
137
139
  },
138
- "description": {
140
+ "cursor": {
139
141
  "type": "string",
140
- "description": "Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."
142
+ "description": "Continuation cursor returned by this server."
141
143
  }
142
144
  },
143
145
  "required": [
144
- "code",
145
- "description"
146
+ "server"
146
147
  ]
147
148
  }
148
149
  ```
149
150
 
150
- Source: [`packages/core/tools/src/ptc.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/tools/src/ptc.ts)
151
+ Source: [`packages/mcp/mcp-resources/src/tools.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/mcp/mcp-resources/src/tools.ts)
151
152
 
152
- Owned by the tool registry as a reserved transport outside filterable capability layers under `mode: ptc` / `mode: both` (see the PTC mode Agent Note). Under `ptc` it is the registry's only wire contribution; the other visible capabilities are declared in a generated SDK section in the loaded runtime's language, and a program calls them through bindings scheduled under the native concurrency contract (submission-ordered starts and policy; concurrency-safe bodies overlap up to `maxParallelSubCalls`) that re-enter the complete guarded tool pipeline and link each nested execution to this outer result.
153
+ ### `list_mcp_resources`
153
154
 
154
- <a id="deepseek-aidsh-plan-mode"></a>
155
+ List resources available from an MCP server.
155
156
 
156
- ## `@deepseek-ai/dsh-plan-mode`
157
+ ```json
158
+ {
159
+ "type": "object",
160
+ "properties": {
161
+ "server": {
162
+ "type": "string",
163
+ "description": "Configured MCP server name."
164
+ },
165
+ "cursor": {
166
+ "type": "string",
167
+ "description": "Continuation cursor returned by this server."
168
+ }
169
+ },
170
+ "required": [
171
+ "server"
172
+ ]
173
+ }
174
+ ```
157
175
 
158
- ### `exit_plan_mode`
176
+ Source: [`packages/mcp/mcp-resources/src/tools.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/mcp/mcp-resources/src/tools.ts)
177
+
178
+ ### `read_mcp_resource`
159
179
 
160
- Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. Send the COMPLETE plan as markdown, starting with a # heading that names it. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again.
180
+ Read an MCP resource by URI from the named server. Use a listed URI or an expanded resource template.
161
181
 
162
182
  ```json
163
183
  {
164
184
  "type": "object",
165
185
  "properties": {
166
- "plan": {
186
+ "server": {
167
187
  "type": "string",
168
- "description": "The complete plan, as markdown, starting with a # heading that names it."
188
+ "description": "Configured MCP server name."
189
+ },
190
+ "uri": {
191
+ "type": "string",
192
+ "description": "Resource URI to read."
169
193
  }
170
194
  },
171
195
  "required": [
172
- "plan"
196
+ "server",
197
+ "uri"
173
198
  ]
174
199
  }
175
200
  ```
176
201
 
177
- Source: [`packages/plan/plan-mode/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/plan/plan-mode/src/index.ts)
178
-
179
- exit_plan_mode stays in the model-facing schema while planning is inactive so transitions add no tool-catalog churn on top of the plan-policy change. Its execute path rejects calls outside plan mode; in plan mode it presents the plan over the user-questions seam (approve / keep planning with feedback), and approval logs plan mode inactive at the step boundary.
202
+ Source: [`packages/mcp/mcp-resources/src/tools.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/mcp/mcp-resources/src/tools.ts)
180
203
 
181
- <a id="deepseek-aidsh-tool-bash"></a>
204
+ <a id="deepseek-aidsh-experimental-browser-use-stagehand-native"></a>
182
205
 
183
- ## `@deepseek-ai/dsh-tool-bash`
206
+ ## `@deepseek-ai/dsh-experimental-browser-use-stagehand-native`
184
207
 
185
- ### `bash`
208
+ ### `stagehand_act`
186
209
 
187
- Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under <mode> mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.
210
+ Perform one natural-language browser action using the configured Stagehand model.
188
211
 
189
212
  ```json
190
213
  {
214
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
191
215
  "type": "object",
192
216
  "properties": {
193
- "command": {
217
+ "pageId": {
194
218
  "type": "string",
195
- "description": "The bash command to execute."
219
+ "minLength": 1
196
220
  },
197
- "description": {
221
+ "instruction": {
198
222
  "type": "string",
199
- "description": "Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\"."
200
- },
201
- "timeoutMs": {
202
- "type": "number",
203
- "description": "Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."
223
+ "minLength": 1
224
+ }
225
+ },
226
+ "required": [
227
+ "instruction"
228
+ ],
229
+ "additionalProperties": false
230
+ }
231
+ ```
232
+
233
+ Source: [`packages/experimental/browser-use-stagehand-native/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/browser-use-stagehand-native/src/index.ts)
234
+
235
+ ### `stagehand_extract`
236
+
237
+ Extract page data using the configured Stagehand model and an optional JSON Schema.
238
+
239
+ ```json
240
+ {
241
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
242
+ "type": "object",
243
+ "properties": {
244
+ "pageId": {
245
+ "type": "string",
246
+ "minLength": 1
204
247
  },
205
- "workdir": {
248
+ "instruction": {
206
249
  "type": "string",
207
- "description": "Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."
250
+ "minLength": 1
208
251
  },
209
- "run_in_background": {
210
- "type": "boolean",
211
- "description": "Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."
252
+ "schema": {
253
+ "type": "object",
254
+ "propertyNames": {
255
+ "type": "string"
256
+ },
257
+ "additionalProperties": {
258
+ "$ref": "#/$defs/__schema0"
259
+ }
212
260
  }
213
261
  },
214
262
  "required": [
215
- "command",
216
- "description"
217
- ]
263
+ "instruction"
264
+ ],
265
+ "additionalProperties": false,
266
+ "$defs": {
267
+ "__schema0": {
268
+ "anyOf": [
269
+ {
270
+ "type": "string"
271
+ },
272
+ {
273
+ "type": "number"
274
+ },
275
+ {
276
+ "type": "boolean"
277
+ },
278
+ {
279
+ "type": "null"
280
+ },
281
+ {
282
+ "type": "array",
283
+ "items": {
284
+ "$ref": "#/$defs/__schema0"
285
+ }
286
+ },
287
+ {
288
+ "type": "object",
289
+ "propertyNames": {
290
+ "type": "string"
291
+ },
292
+ "additionalProperties": {
293
+ "$ref": "#/$defs/__schema0"
294
+ }
295
+ }
296
+ ]
297
+ }
298
+ }
218
299
  }
219
300
  ```
220
301
 
221
- Source: [`packages/shell/tool-bash/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/tool-bash/src/index.ts)
302
+ Source: [`packages/experimental/browser-use-stagehand-native/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/browser-use-stagehand-native/src/index.ts)
222
303
 
223
- The bash tool is the model-facing consumer of the bash executor seam. A `run_in_background` run registers with the generic `ctx.jobs` runtime and is collected/stopped through the `job_*` tools from `@deepseek-ai/dsh-tool-jobs`; the `enableRunInBackground` config (default true) removes the parameter entirely when disabled.
304
+ ### `stagehand_navigate`
224
305
 
225
- <a id="deepseek-aidsh-tool-pwsh"></a>
306
+ Navigate a Stagehand browser tab to a URL.
226
307
 
227
- ## `@deepseek-ai/dsh-tool-pwsh`
308
+ ```json
309
+ {
310
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
311
+ "type": "object",
312
+ "properties": {
313
+ "pageId": {
314
+ "type": "string",
315
+ "minLength": 1
316
+ },
317
+ "url": {
318
+ "type": "string",
319
+ "format": "uri"
320
+ }
321
+ },
322
+ "required": [
323
+ "url"
324
+ ],
325
+ "additionalProperties": false
326
+ }
327
+ ```
228
328
 
229
- ### `pwsh`
329
+ Source: [`packages/experimental/browser-use-stagehand-native/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/browser-use-stagehand-native/src/index.ts)
230
330
 
231
- Execute a PowerShell command (`pwsh -Command`) and return its stdout/stderr. Each call runs in a fresh pwsh process: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Paths use native Windows form (`C:\...`); read environment variables with `$env:NAME`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$env:DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under <mode> mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. On Windows a force-killed command settles as `[exit code: 1]` without a signal marker — treat it as an interruption, not a command failure. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.
331
+ ### `stagehand_observe`
332
+
333
+ Find browser actions matching an instruction using the configured Stagehand model.
232
334
 
233
335
  ```json
234
336
  {
337
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
235
338
  "type": "object",
236
339
  "properties": {
237
- "command": {
340
+ "pageId": {
238
341
  "type": "string",
239
- "description": "The PowerShell command to execute."
342
+ "minLength": 1
240
343
  },
241
- "description": {
344
+ "instruction": {
242
345
  "type": "string",
243
- "description": "Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"Get-Process\" → \"List running processes\"."
244
- },
245
- "timeoutMs": {
246
- "type": "number",
247
- "description": "Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."
248
- },
249
- "workdir": {
346
+ "minLength": 1
347
+ }
348
+ },
349
+ "required": [
350
+ "instruction"
351
+ ],
352
+ "additionalProperties": false
353
+ }
354
+ ```
355
+
356
+ Source: [`packages/experimental/browser-use-stagehand-native/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/browser-use-stagehand-native/src/index.ts)
357
+
358
+ ### `stagehand_screenshot`
359
+
360
+ Capture a Stagehand tab screenshot for visual inspection.
361
+
362
+ ```json
363
+ {
364
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
365
+ "type": "object",
366
+ "properties": {
367
+ "pageId": {
250
368
  "type": "string",
251
- "description": "Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."
369
+ "minLength": 1
252
370
  },
253
- "run_in_background": {
254
- "type": "boolean",
255
- "description": "Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."
371
+ "fullPage": {
372
+ "default": false,
373
+ "type": "boolean"
256
374
  }
257
375
  },
258
376
  "required": [
259
- "command",
260
- "description"
261
- ]
377
+ "fullPage"
378
+ ],
379
+ "additionalProperties": false
262
380
  }
263
381
  ```
264
382
 
265
- Source: [`packages/shell/tool-pwsh/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/tool-pwsh/src/index.ts)
383
+ Source: [`packages/experimental/browser-use-stagehand-native/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/browser-use-stagehand-native/src/index.ts)
266
384
 
267
- The pwsh tool is the PowerShell-dialect consumer of the bash executor seam for Windows compositions (a PowerShell executor such as `@deepseek-ai/dsh-pwsh-local` backs `ctx.shell`); it mirrors the bash tool call-for-call minus sandbox controls — `run_in_background` runs register with the generic `ctx.jobs` runtime and are collected/stopped through the `job_*` tools, and the managed `DSH_*` environment comes from `@deepseek-ai/dsh-shell-env`. Each call runs in a fresh process (no persistent PTY session), with native `C:\...` paths and `$env:NAME` variables.
385
+ ### `stagehand_tabs`
268
386
 
269
- <a id="deepseek-aidsh-tool-cordis"></a>
387
+ List, create, select, or close a Stagehand browser tab.
270
388
 
271
- ## `@deepseek-ai/dsh-tool-cordis`
389
+ ```json
390
+ {
391
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
392
+ "oneOf": [
393
+ {
394
+ "type": "object",
395
+ "properties": {
396
+ "action": {
397
+ "type": "string",
398
+ "const": "list"
399
+ }
400
+ },
401
+ "required": [
402
+ "action"
403
+ ],
404
+ "additionalProperties": false
405
+ },
406
+ {
407
+ "type": "object",
408
+ "properties": {
409
+ "action": {
410
+ "type": "string",
411
+ "const": "new"
412
+ },
413
+ "url": {
414
+ "type": "string",
415
+ "format": "uri"
416
+ }
417
+ },
418
+ "required": [
419
+ "action"
420
+ ],
421
+ "additionalProperties": false
422
+ },
423
+ {
424
+ "type": "object",
425
+ "properties": {
426
+ "action": {
427
+ "type": "string",
428
+ "enum": [
429
+ "select",
430
+ "close"
431
+ ]
432
+ },
433
+ "pageId": {
434
+ "type": "string",
435
+ "minLength": 1
436
+ }
437
+ },
438
+ "required": [
439
+ "action",
440
+ "pageId"
441
+ ],
442
+ "additionalProperties": false
443
+ }
444
+ ],
445
+ "type": "object"
446
+ }
447
+ ```
272
448
 
273
- ### `cordis_define`
449
+ Source: [`packages/experimental/browser-use-stagehand-native/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/experimental/browser-use-stagehand-native/src/index.ts)
274
450
 
275
- Define an immutable Cordis Package. For a new Plugin, use kind:"new" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:"existing" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs.
451
+ <a id="deepseek-aidsh-tool-ask-user"></a>
452
+
453
+ ## `@deepseek-ai/dsh-tool-ask-user`
454
+
455
+ ### `ask_user_question`
456
+
457
+ Ask the user a concise question when you need confirmation, a choice, or missing information before proceeding.
276
458
 
277
459
  ```json
278
460
  {
279
461
  "type": "object",
280
462
  "properties": {
281
- "plugin": {
282
- "oneOf": [
283
- {
284
- "type": "object",
285
- "additionalProperties": false,
286
- "properties": {
287
- "kind": {
288
- "type": "string",
289
- "const": "new"
290
- },
291
- "idPrefix": {
292
- "type": "string",
293
- "description": "Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix."
294
- }
463
+ "questions": {
464
+ "type": "array",
465
+ "description": "Questions to ask the user before continuing.",
466
+ "items": {
467
+ "type": "object",
468
+ "additionalProperties": true,
469
+ "properties": {
470
+ "id": {
471
+ "type": "string",
472
+ "description": "Stable id for this question; echoed in the answer."
295
473
  },
296
- "required": [
297
- "kind",
298
- "idPrefix"
299
- ]
300
- },
301
- {
302
- "type": "object",
303
- "additionalProperties": false,
304
- "properties": {
305
- "kind": {
306
- "type": "string",
307
- "const": "existing"
308
- },
309
- "pluginId": {
310
- "type": "string",
311
- "description": "Exact ID of an existing Plugin; the new Package is appended to that instance."
474
+ "question": {
475
+ "type": "string",
476
+ "description": "The specific question to ask the user."
477
+ },
478
+ "header": {
479
+ "type": "string",
480
+ "description": "Optional short heading for the question, such as \"Confirm\" or \"Choose Mode\"."
481
+ },
482
+ "options": {
483
+ "type": "array",
484
+ "description": "Optional choices to show the user. If you recommend one, put it first and append \"(Recommended)\" to that label.",
485
+ "items": {
486
+ "type": "object",
487
+ "additionalProperties": true,
488
+ "properties": {
489
+ "label": {
490
+ "type": "string",
491
+ "description": "Short user-facing option label."
492
+ },
493
+ "description": {
494
+ "type": "string",
495
+ "description": "One sentence explaining the tradeoff or impact."
496
+ }
497
+ },
498
+ "required": [
499
+ "label"
500
+ ]
312
501
  }
313
502
  },
314
- "required": [
315
- "kind",
316
- "pluginId"
317
- ]
318
- }
319
- ]
503
+ "multi_select": {
504
+ "type": "boolean",
505
+ "description": "Whether the user may select more than one option. Defaults to false."
506
+ }
507
+ },
508
+ "required": [
509
+ "id",
510
+ "question"
511
+ ]
512
+ }
513
+ }
514
+ },
515
+ "required": [
516
+ "questions"
517
+ ]
518
+ }
519
+ ```
520
+
521
+ Source: [`packages/interaction/tool-ask-user/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/tool-ask-user/src/index.ts)
522
+
523
+ ask_user_question keeps the original blocking behavior by default; set `mode: timed` to opt into a foreground timeout and pending result while the question remains answerable. In timed mode, `timeout: -1` keeps that call blocking indefinitely.
524
+
525
+ <a id="deepseek-aidsh-tools"></a>
526
+
527
+ ## `@deepseek-ai/dsh-tools`
528
+
529
+ ### `run_code`
530
+
531
+ Execute a TypeScript program against the available tools. Takes two required arguments: `description`, a short summary of what the program does, and `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work). Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return is program output — curate it. Image-bearing subtool results are attached after the run.
532
+
533
+ ```json
534
+ {
535
+ "type": "object",
536
+ "properties": {
537
+ "description": {
538
+ "type": "string",
539
+ "description": "Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Provide `description` before `code` in the arguments. Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."
320
540
  },
321
- "name": {
541
+ "code": {
322
542
  "type": "string",
323
- "description": "Short, readable Package name."
543
+ "description": "The program: the body of an async TypeScript function."
544
+ },
545
+ "timeoutMs": {
546
+ "type": "number",
547
+ "description": "Positive elapsed-time budget in milliseconds, capped by the deployment maximum."
324
548
  },
325
- "purpose": {
549
+ "sandbox_permissions": {
326
550
  "type": "string",
327
- "description": "One-sentence, user-facing description of the Package purpose."
551
+ "description": "Wider sandbox mode for this complete program execution; requires justification and approval.",
552
+ "enum": [
553
+ "workspace-write",
554
+ "danger-full-access"
555
+ ]
328
556
  },
329
- "code": {
330
- "type": "object",
331
- "additionalProperties": false,
332
- "properties": {
333
- "host": {
334
- "type": "string",
335
- "description": "Plain JavaScript function body that returns the Host-half Cordis Plugin."
336
- },
337
- "client": {
338
- "type": "string",
339
- "description": "Plain JavaScript function body that returns the browser Client-half Cordis Plugin."
340
- }
341
- }
557
+ "justification": {
558
+ "type": "string",
559
+ "description": "Reason this complete program needs wider access, shown to the user for approval. Use the language of the user’s current request."
342
560
  }
343
561
  },
344
562
  "required": [
345
- "plugin",
346
- "name",
347
- "purpose",
563
+ "description",
348
564
  "code"
349
565
  ]
350
566
  }
351
567
  ```
352
568
 
353
- Source: [`packages/extensions/tool-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/tool-cordis/src/index.ts)
569
+ Source: [`packages/core/tools/src/ptc.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/tools/src/ptc.ts)
354
570
 
355
- ### `cordis_inspect_list`
571
+ Owned by the tool registry as a reserved transport outside filterable capability layers under `mode: ptc` / `mode: both` (see the PTC mode Agent Note). Under `ptc` it is the registry's only wire contribution; the other visible capabilities are declared in a generated SDK section in the loaded runtime's language, and a program calls them through bindings scheduled under the native concurrency contract (submission-ordered starts and policy; concurrency-safe bodies overlap up to `maxParallelSubCalls`) that re-enter the complete guarded tool pipeline and link each nested execution to this outer result.
356
572
 
357
- List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call.
573
+ <a id="deepseek-aidsh-plan-mode"></a>
574
+
575
+ ## `@deepseek-ai/dsh-plan-mode`
576
+
577
+ ### `exit_plan_mode`
578
+
579
+ Use only in plan mode. Present your plan for the user's review and, on approval, leave plan mode. The user may approve (carry out the plan from your next step) or keep planning — their feedback comes back in the tool result; revise and present again.
358
580
 
359
581
  ```json
360
582
  {
361
583
  "type": "object",
362
- "properties": {}
584
+ "properties": {
585
+ "plan": {
586
+ "type": "string",
587
+ "description": "The complete plan, as markdown, starting with a # heading that names it."
588
+ }
589
+ },
590
+ "required": [
591
+ "plan"
592
+ ]
363
593
  }
364
594
  ```
365
595
 
366
- Source: [`packages/extensions/tool-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/tool-cordis/src/index.ts)
596
+ Source: [`packages/plan/plan-mode/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/plan/plan-mode/src/index.ts)
367
597
 
368
- ### `cordis_inspect_query`
598
+ exit_plan_mode stays in the model-facing schema while planning is inactive so transitions add no tool-catalog churn on top of the plan-policy change. Its execute path rejects calls outside plan mode; in plan mode it presents the plan over the user-questions seam (approve / keep planning with feedback), and approval logs plan mode inactive at the step boundary.
369
599
 
370
- Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props.
600
+ <a id="deepseek-aidsh-tool-bash"></a>
601
+
602
+ ## `@deepseek-ai/dsh-tool-bash`
603
+
604
+ ### `bash`
605
+
606
+ Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell; pass `workdir` instead of using `cd`. Managed `$DSH_*` variables expose current harness environment facts. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Provide `description` before `command` in the arguments. Before any delete or move, verify that the resolved absolute target path is the intended one; never run it against a computed path you have not checked. An unset variable expands to an empty string, so guard variables in such paths with `${VAR:?}`. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under <mode> mode]`, a policy denial: do not retry another way.
371
607
 
372
608
  ```json
373
609
  {
374
610
  "type": "object",
375
611
  "properties": {
376
- "platform": {
612
+ "description": {
377
613
  "type": "string",
378
- "description": "Runtime platform that owns the Provider.",
379
- "enum": [
380
- "host",
381
- "client"
382
- ]
614
+ "description": "Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\"."
383
615
  },
384
- "provider": {
616
+ "command": {
385
617
  "type": "string",
386
- "description": "Exact Provider ID returned by cordis_inspect_list."
618
+ "description": "The bash command to execute."
387
619
  },
388
- "method": {
620
+ "timeoutMs": {
621
+ "type": "number",
622
+ "description": "Timeout in milliseconds. The executor applies its configured default and cap; on expiry the command moves to the background as a job instead of being killed."
623
+ },
624
+ "workdir": {
389
625
  "type": "string",
390
- "description": "Exact method name declared by the Provider manifest."
626
+ "description": "Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."
391
627
  },
392
- "input": {
393
- "description": "Optional query input; it must satisfy the method input schema."
628
+ "run_in_background": {
629
+ "type": "boolean",
630
+ "description": "Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."
394
631
  }
395
632
  },
396
633
  "required": [
397
- "platform",
398
- "provider",
399
- "method"
634
+ "description",
635
+ "command"
400
636
  ]
401
637
  }
402
638
  ```
403
639
 
404
- Source: [`packages/extensions/tool-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/tool-cordis/src/index.ts)
640
+ Source: [`packages/shell/tool-bash/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/tool-bash/src/index.ts)
405
641
 
406
- ### `cordis_inspect_self`
642
+ The bash tool is the model-facing consumer of the bash executor seam. With a job registry composed every call registers with the generic `ctx.jobs` runtime as it starts, collected/stopped through the `job_*` tools from `@deepseek-ai/dsh-tool-jobs`; without one, or with `enableRunInBackground: false`, the tool registers a foreground-only schema without the `run_in_background` parameter.
407
643
 
408
- Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers.
644
+ <a id="deepseek-aidsh-tool-present"></a>
645
+
646
+ ## `@deepseek-ai/dsh-tool-present`
647
+
648
+ ### `present`
649
+
650
+ Declare existing files as final deliverables for the user. Use it when the user needs a separate file, especially Office documents, spreadsheets, and slide decks; prefer your final response when that suffices. The user opens the current files; their contents are not copied.
409
651
 
410
652
  ```json
411
653
  {
412
654
  "type": "object",
413
655
  "properties": {
414
- "pluginId": {
415
- "type": "string",
416
- "description": "Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin."
417
- },
418
- "packageId": {
419
- "type": "string",
420
- "description": "Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned."
656
+ "files": {
657
+ "type": "array",
658
+ "description": "Usually the 1-2 most important deliverables; at most 4 per call.",
659
+ "items": {
660
+ "type": "object",
661
+ "additionalProperties": false,
662
+ "properties": {
663
+ "path": {
664
+ "type": "string",
665
+ "description": "Path of an existing regular file. Relative paths use the Session working directory."
666
+ },
667
+ "description": {
668
+ "type": "string",
669
+ "description": "Brief description for the user."
670
+ }
671
+ },
672
+ "required": [
673
+ "path"
674
+ ]
675
+ }
421
676
  }
422
- }
677
+ },
678
+ "required": [
679
+ "files"
680
+ ]
423
681
  }
424
682
  ```
425
683
 
426
- Source: [`packages/extensions/tool-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/tool-cordis/src/index.ts)
684
+ Source: [`packages/deliverables/tool-present/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/deliverables/tool-present/src/index.ts)
427
685
 
428
- ### `cordis_run`
686
+ Deliveries belong to the calling Session; Web ui-deliverables supplies source-file opening and cards.
429
687
 
430
- Activate one exact Package of a dynamic Plugin. Use mode:"run" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:"update" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it.
688
+ <a id="deepseek-aidsh-tool-pwsh"></a>
689
+
690
+ ## `@deepseek-ai/dsh-tool-pwsh`
691
+
692
+ ### `pwsh`
693
+
694
+ Execute a PowerShell command (`pwsh -Command`) and return its stdout/stderr. Each call runs in a fresh pwsh process; pass `workdir` instead of using `cd`. Paths use native Windows form (`C:\...`); read environment variables with `$env:NAME`. Managed `$env:DSH_*` variables expose current harness environment facts. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. On Windows a force-killed command settles as `[exit code: 1]` without a signal marker — treat it as an interruption, not a command failure. Provide `description` before `command` in the arguments. Before any delete or move, verify that the resolved absolute target path is the intended one; never run it against a computed path you have not checked. Do not assign to automatic variables such as `$HOME`; variable names are case-insensitive, so `$home` is the same read-only variable. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under <mode> mode]`, a policy denial: do not retry another way.
431
695
 
432
696
  ```json
433
697
  {
434
698
  "type": "object",
435
699
  "properties": {
436
- "pluginId": {
700
+ "description": {
437
701
  "type": "string",
438
- "description": "Stable Plugin ID returned by cordis_define."
702
+ "description": "Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"Get-Process\" → \"List running processes\"."
439
703
  },
440
- "packageId": {
704
+ "command": {
441
705
  "type": "string",
442
- "description": "Exact immutable Package ID to activate under that Plugin."
706
+ "description": "The PowerShell command to execute."
707
+ },
708
+ "timeoutMs": {
709
+ "type": "number",
710
+ "description": "Timeout in milliseconds. The executor applies its configured default and cap; on expiry the command moves to the background as a job instead of being killed."
443
711
  },
444
- "mode": {
712
+ "workdir": {
445
713
  "type": "string",
446
- "description": "Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package.",
447
- "enum": [
448
- "run",
449
- "update"
450
- ]
714
+ "description": "Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."
715
+ },
716
+ "run_in_background": {
717
+ "type": "boolean",
718
+ "description": "Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."
451
719
  }
452
720
  },
453
721
  "required": [
454
- "pluginId",
455
- "packageId",
456
- "mode"
722
+ "description",
723
+ "command"
457
724
  ]
458
725
  }
459
726
  ```
460
727
 
461
- Source: [`packages/extensions/tool-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/tool-cordis/src/index.ts)
728
+ Source: [`packages/shell/tool-pwsh/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/tool-pwsh/src/index.ts)
729
+
730
+ The pwsh tool is the PowerShell-dialect consumer of the bash executor seam for Windows compositions (a PowerShell executor such as `@deepseek-ai/dsh-pwsh-local` backs `ctx.shell`); it mirrors the bash tool call-for-call minus sandbox controls — `run_in_background` runs register with the generic `ctx.jobs` runtime and are collected/stopped through the `job_*` tools, and the managed `DSH_*` environment comes from `@deepseek-ai/dsh-shell-env`. Each call runs in a fresh process (no persistent PTY session), with native `C:\...` paths and `$env:NAME` variables.
731
+
732
+ <a id="deepseek-aidsh-tool-cordis"></a>
733
+
734
+ ## `@deepseek-ai/dsh-tool-cordis`
462
735
 
463
- ### `cordis_stop`
736
+ ### `cordis_inspect_list`
464
737
 
465
- Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal.
738
+ List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before writing or configuring a plugin, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call.
466
739
 
467
740
  ```json
468
741
  {
469
742
  "type": "object",
470
- "properties": {
471
- "pluginId": {
472
- "type": "string",
473
- "description": "Stable dynamic Plugin ID to stop."
474
- }
475
- },
476
- "required": [
477
- "pluginId"
478
- ]
743
+ "properties": {}
479
744
  }
480
745
  ```
481
746
 
482
747
  Source: [`packages/extensions/tool-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/tool-cordis/src/index.ts)
483
748
 
484
- ### `cordis_undefine`
749
+ ### `cordis_inspect_query`
485
750
 
486
- Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a "Plugin removed" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead.
751
+ Run a read-only query declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before writing plugin code to read exact Service methods, Event modes, plugin Config schemas, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response within the configured timeout; otherwise it reports a Client failure or asks you to reconnect and retry. This Tool cannot invoke business Service methods or modify the runtime.
487
752
 
488
753
  ```json
489
754
  {
490
755
  "type": "object",
491
756
  "properties": {
492
- "pluginId": {
757
+ "platform": {
758
+ "type": "string",
759
+ "description": "Runtime platform that owns the Provider.",
760
+ "enum": [
761
+ "host",
762
+ "client"
763
+ ]
764
+ },
765
+ "provider": {
766
+ "type": "string",
767
+ "description": "Exact Provider ID returned by cordis_inspect_list."
768
+ },
769
+ "method": {
493
770
  "type": "string",
494
- "description": "Stable dynamic Plugin ID to remove permanently."
771
+ "description": "Exact method name declared by the Provider manifest."
772
+ },
773
+ "input": {
774
+ "description": "Optional query input; it must satisfy the method input schema."
495
775
  }
496
776
  },
497
777
  "required": [
498
- "pluginId"
778
+ "platform",
779
+ "provider",
780
+ "method"
499
781
  ]
500
782
  }
501
783
  ```
502
784
 
503
785
  Source: [`packages/extensions/tool-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/tool-cordis/src/index.ts)
504
786
 
505
- Not in any shipped tree (a deliberate opt-in — dynamic package code reaches the real runtime, see .agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md). The toolset injects `ctx.dynamicCordisRunner` from `@deepseek-ai/dsh-cordis-host-runner`, which owns the definition registry and the vm sandbox; a composition missing it never activates the tools. A running package may register ADDITIONAL model-visible tools until it is stopped, undefined, or DSH restarts; a full changed request header logs those tool-set changes.
787
+ Creator mode provides two read-only runtime inspection tools. The Cordis host runner supplies the inspection registry; Client queries require a connected page. Author persistent changes as bundles and install them with plugin_manager.
506
788
 
507
789
  <a id="deepseek-aidsh-tool-bash-persistent"></a>
508
790
 
@@ -678,11 +960,11 @@ Edit an existing UTF-8 text file by replacing literal text.
678
960
  "properties": {
679
961
  "file_path": {
680
962
  "type": "string",
681
- "description": "Path to edit, resolved by the filesystem backend."
963
+ "description": "Path to edit, resolved by the filesystem backend. Provide `file_path` before `old_string` and `new_string` in the arguments."
682
964
  },
683
965
  "old_string": {
684
966
  "type": "string",
685
- "description": "Literal text to replace. Must match exactly."
967
+ "description": "Literal text to replace."
686
968
  },
687
969
  "new_string": {
688
970
  "type": "string",
@@ -734,7 +1016,7 @@ Source: [`packages/fs/tool-fs/src/index.ts`](https://github.com/deepseek-ai/deep
734
1016
 
735
1017
  ### `read_image`
736
1018
 
737
- Read a PNG/JPEG/WebP/GIF file and return the image itself. A path without a file extension is accepted; the format is detected from the file content, so normalized attachment paths can be passed directly without copying or renaming. Harness validates and downscales large supported images before the next model request, so use this tool directly instead of installing image libraries or creating thumbnails merely to inspect an image. Independent files may be read concurrently in small batches. Requires the current model to accept image input.
1019
+ Read a PNG/JPEG/WebP/GIF file and return the image itself. Large images are downscaled automatically; do not install image libraries or create thumbnails to inspect an image.
738
1020
 
739
1021
  ```json
740
1022
  {
@@ -763,7 +1045,7 @@ Create or fully replace a UTF-8 text file.
763
1045
  "properties": {
764
1046
  "file_path": {
765
1047
  "type": "string",
766
- "description": "Path to write, resolved by the filesystem backend."
1048
+ "description": "Path to write, resolved by the filesystem backend. Provide `file_path` before `content` in the arguments."
767
1049
  },
768
1050
  "content": {
769
1051
  "type": "string",
@@ -787,7 +1069,7 @@ The read-before-write/edit policy is added by `@deepseek-ai/dsh-fs-observation-p
787
1069
 
788
1070
  ### `glob`
789
1071
 
790
- Find files whose paths match a glob pattern. Returns matching file paths — never directories — including hidden and ignored files (VCS metadata directories are excluded). Up to 100 paths come back in modification-time order; a larger result instead returns 100 paths sampled across top-level entries, says so, and reports where the complete sorted list was saved. This tool does not enumerate directory entries.
1072
+ Find files, not directories, whose paths match a glob pattern, including hidden and ignored files. Returns up to 100 paths in modification-time order; a larger result is sampled across top-level entries and reports where the complete list was saved.
791
1073
 
792
1074
  ```json
793
1075
  {
@@ -812,7 +1094,7 @@ Source: [`packages/fs/tool-fs-search/src/index.ts`](https://github.com/deepseek-
812
1094
 
813
1095
  ### `grep`
814
1096
 
815
- Search file contents with a ripgrep regular expression. Returns matching lines with line numbers, grouped by file. Returns the first 250 matches inline; a capped result reports where the complete match list was saved. Use read on a matched file for surrounding context.
1097
+ Search file contents with a ripgrep regular expression. Returns matching lines with line numbers, grouped by file. Returns up to 250 matches; a larger result reports where the complete match list was saved.
816
1098
 
817
1099
  ```json
818
1100
  {
@@ -1012,7 +1294,7 @@ The six terminal tools are opt-in and complement one-shot shell/filesystem tools
1012
1294
 
1013
1295
  ### `create_goal`
1014
1296
 
1015
- Create one persisted same-session completion goal when the current direct human request is a long-running objective that should continue across autonomous goal rounds. You may infer that intent without requiring the user to say "create a goal". Do not use this for trivial single-turn work. Execution rejects non-human and subagent authority.
1297
+ Create a persisted goal that keeps this session working across automatic continuation rounds. Use it when the direct human request is a long-running objective, even if the user did not say "goal"; not for single-turn work.
1016
1298
 
1017
1299
  ```json
1018
1300
  {
@@ -1037,7 +1319,7 @@ Source: [`packages/goal/tool-goal/src/index.ts`](https://github.com/deepseek-ai/
1037
1319
 
1038
1320
  ### `get_goal`
1039
1321
 
1040
- Read the current same-session goal, including its exact id/revision, objective, phase, completed continuation rounds, round limit, blocker reason when present, and whether another continuation is armed. Call this before updating a goal.
1322
+ Read the current session goal, including the id and revision that update_goal requires.
1041
1323
 
1042
1324
  ```json
1043
1325
  {
@@ -1050,7 +1332,7 @@ Source: [`packages/goal/tool-goal/src/index.ts`](https://github.com/deepseek-ai/
1050
1332
 
1051
1333
  ### `update_goal`
1052
1334
 
1053
- Update the exact current goal revision. edit, pause, and resume require a direct top-level human request. During an automatic continuation of the current goal, complete and blocked are also allowed. blocked is rejected before the configured minimum round count; the model remains responsible for judging that the same condition persisted across those rounds and must explain it in blocked_reason.
1335
+ Update the current goal.
1054
1336
 
1055
1337
  ```json
1056
1338
  {
@@ -1066,7 +1348,7 @@ Update the exact current goal revision. edit, pause, and resume require a direct
1066
1348
  },
1067
1349
  "action": {
1068
1350
  "type": "string",
1069
- "description": "edit | pause | resume | complete | blocked",
1351
+ "description": "edit, pause, and resume require a direct top-level human request. complete and blocked are also allowed during an automatic continuation of this goal; blocked is rejected before the configured minimum round count.",
1070
1352
  "enum": [
1071
1353
  "edit",
1072
1354
  "pause",
@@ -1085,7 +1367,7 @@ Update the exact current goal revision. edit, pause, and resume require a direct
1085
1367
  },
1086
1368
  "blocked_reason": {
1087
1369
  "type": "string",
1088
- "description": "Concrete blocking condition; required only with action blocked."
1370
+ "description": "Required only with action blocked: the concrete condition that persisted across rounds and blocks progress."
1089
1371
  }
1090
1372
  },
1091
1373
  "required": [
@@ -1100,13 +1382,13 @@ Source: [`packages/goal/tool-goal/src/index.ts`](https://github.com/deepseek-ai/
1100
1382
 
1101
1383
  create, edit, pause, and resume require direct-human root authority; complete and blocked also accept the exact current goal round. The default blocked lower bound is three admitted rounds.
1102
1384
 
1103
- <a id="deepseek-aidsh-schedule"></a>
1385
+ <a id="deepseek-aidsh-tool-schedule"></a>
1104
1386
 
1105
- ## `@deepseek-ai/dsh-schedule`
1387
+ ## `@deepseek-ai/dsh-tool-schedule`
1106
1388
 
1107
1389
  ### `schedule_create`
1108
1390
 
1109
- Create one reminder in the current session. Supply a non-empty prompt and exactly one selector: a positive safe-integer after_seconds delay, at as a strict offset date-time or local date/time object, or safe-integer every_seconds of at least 300. Fixed-rate reminders stay creation-aligned, skip missed occurrences, and batch one latest occurrence per overdue rule. Delivery is session-local: the reminder runs on time only while this session is live and otherwise becomes overdue until the session is resumed.
1391
+ Create a reminder in the current session that delivers prompt when it becomes due. Supply exactly one timing parameter: after_seconds, at, every_seconds, daily, weekly, or cron. Local times that do not exist in the zone are skipped; repeated local times fire once, at the earlier instant. After downtime, a recurring reminder delivers only its latest missed occurrence. Delivery can repeat after a crash.
1110
1392
 
1111
1393
  ```json
1112
1394
  {
@@ -1116,13 +1398,82 @@ Create one reminder in the current session. Supply a non-empty prompt and exactl
1116
1398
  "type": "string",
1117
1399
  "description": "Reminder content to present when the target becomes due."
1118
1400
  },
1401
+ "title": {
1402
+ "type": "string",
1403
+ "description": "Task name of at most 120 characters, shown on the task card and in task lists."
1404
+ },
1119
1405
  "after_seconds": {
1120
1406
  "type": "number",
1121
- "description": "Positive safe-integer delay in seconds."
1407
+ "description": "Delay in whole seconds."
1122
1408
  },
1123
1409
  "every_seconds": {
1124
1410
  "type": "number",
1125
- "description": "Fixed-rate safe-integer interval in seconds, at least 300."
1411
+ "description": "Fixed-rate interval in whole seconds, at least 60, aligned to the creation time; changing it with schedule_update re-aligns it to the save time."
1412
+ },
1413
+ "daily": {
1414
+ "type": "object",
1415
+ "description": "Every day at a local time.",
1416
+ "additionalProperties": false,
1417
+ "properties": {
1418
+ "time": {
1419
+ "type": "string",
1420
+ "description": "HH:mm:ss with optional 1-3 fractional digits, for example 23:00:00."
1421
+ },
1422
+ "time_zone": {
1423
+ "type": "string",
1424
+ "description": "UTC or IANA Area/Location, for example Asia/Shanghai."
1425
+ }
1426
+ },
1427
+ "required": [
1428
+ "time",
1429
+ "time_zone"
1430
+ ]
1431
+ },
1432
+ "weekly": {
1433
+ "type": "object",
1434
+ "description": "On the given weekdays at a local time.",
1435
+ "additionalProperties": false,
1436
+ "properties": {
1437
+ "time": {
1438
+ "type": "string",
1439
+ "description": "HH:mm:ss with optional 1-3 fractional digits, for example 09:00:00."
1440
+ },
1441
+ "time_zone": {
1442
+ "type": "string",
1443
+ "description": "UTC or IANA Area/Location, for example Asia/Shanghai."
1444
+ },
1445
+ "weekdays": {
1446
+ "type": "array",
1447
+ "description": "ISO weekdays, Monday 1 through Sunday 7, without repetitions.",
1448
+ "items": {
1449
+ "type": "integer"
1450
+ }
1451
+ }
1452
+ },
1453
+ "required": [
1454
+ "time",
1455
+ "time_zone",
1456
+ "weekdays"
1457
+ ]
1458
+ },
1459
+ "cron": {
1460
+ "type": "object",
1461
+ "description": "Five-field Vixie cron expression in a time zone.",
1462
+ "additionalProperties": false,
1463
+ "properties": {
1464
+ "expression": {
1465
+ "type": "string",
1466
+ "description": "minute hour day-of-month month day-of-week, for example \"*/15 9-17 * * 1-5\". When both day fields are restricted, a date matches if either one matches."
1467
+ },
1468
+ "time_zone": {
1469
+ "type": "string",
1470
+ "description": "UTC or IANA Area/Location, for example Asia/Shanghai."
1471
+ }
1472
+ },
1473
+ "required": [
1474
+ "expression",
1475
+ "time_zone"
1476
+ ]
1126
1477
  },
1127
1478
  "at": {
1128
1479
  "oneOf": [
@@ -1150,20 +1501,21 @@ Create one reminder in the current session. Supply a non-empty prompt and exactl
1150
1501
  ]
1151
1502
  }
1152
1503
  ],
1153
- "description": "Absolute target as strict offset RFC 3339 or local date/time with an explicit IANA zone."
1504
+ "description": "Absolute target: an RFC 3339 date-time with offset, or a local date, time, and IANA time_zone."
1154
1505
  }
1155
1506
  },
1156
1507
  "required": [
1157
- "prompt"
1508
+ "prompt",
1509
+ "title"
1158
1510
  ]
1159
1511
  }
1160
1512
  ```
1161
1513
 
1162
- Source: [`packages/schedule/schedule/src/tools.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/schedule/src/tools.ts)
1514
+ Source: [`packages/schedule/tool-schedule/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/tool-schedule/src/index.ts)
1163
1515
 
1164
1516
  ### `schedule_delete`
1165
1517
 
1166
- Delete one active reminder in the current session by the exact id returned by schedule_create or schedule_list. Unknown or already-finished ids return deleted false.
1518
+ Delete a reminder in the current session, active or inactive. Deletion does not retract a reminder message that is already queued.
1167
1519
 
1168
1520
  ```json
1169
1521
  {
@@ -1171,7 +1523,7 @@ Delete one active reminder in the current session by the exact id returned by sc
1171
1523
  "properties": {
1172
1524
  "id": {
1173
1525
  "type": "string",
1174
- "description": "Exact session-local schedule id."
1526
+ "description": "Exact schedule id."
1175
1527
  }
1176
1528
  },
1177
1529
  "required": [
@@ -1180,11 +1532,11 @@ Delete one active reminder in the current session by the exact id returned by sc
1180
1532
  }
1181
1533
  ```
1182
1534
 
1183
- Source: [`packages/schedule/schedule/src/tools.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/schedule/src/tools.ts)
1535
+ Source: [`packages/schedule/tool-schedule/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/tool-schedule/src/index.ts)
1184
1536
 
1185
1537
  ### `schedule_list`
1186
1538
 
1187
- List every active reminder in the current session in creation order, including its exact id, UTC target, scheduled or overdue state, and session-local delivery mode.
1539
+ List the active reminders in the current session.
1188
1540
 
1189
1541
  ```json
1190
1542
  {
@@ -1193,9 +1545,135 @@ List every active reminder in the current session in creation order, including i
1193
1545
  }
1194
1546
  ```
1195
1547
 
1196
- Source: [`packages/schedule/schedule/src/tools.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/schedule/src/tools.ts)
1548
+ Source: [`packages/schedule/tool-schedule/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/tool-schedule/src/index.ts)
1549
+
1550
+ ### `schedule_update`
1551
+
1552
+ Change a reminder in place, keeping its id. Supply a new title, prompt, or at most one timing parameter; omitted fields keep their stored values. To change a relative delay, create a new reminder.
1553
+
1554
+ ```json
1555
+ {
1556
+ "type": "object",
1557
+ "properties": {
1558
+ "id": {
1559
+ "type": "string",
1560
+ "description": "Schedule id returned by schedule_list."
1561
+ },
1562
+ "title": {
1563
+ "type": "string",
1564
+ "description": "New task name of at most 120 characters."
1565
+ },
1566
+ "prompt": {
1567
+ "type": "string",
1568
+ "description": "New reminder content."
1569
+ },
1570
+ "every_seconds": {
1571
+ "type": "number",
1572
+ "description": "Fixed-rate interval in whole seconds, at least 60, aligned to the creation time; changing it with schedule_update re-aligns it to the save time."
1573
+ },
1574
+ "daily": {
1575
+ "type": "object",
1576
+ "description": "Every day at a local time.",
1577
+ "additionalProperties": false,
1578
+ "properties": {
1579
+ "time": {
1580
+ "type": "string",
1581
+ "description": "HH:mm:ss with optional 1-3 fractional digits, for example 23:00:00."
1582
+ },
1583
+ "time_zone": {
1584
+ "type": "string",
1585
+ "description": "UTC or IANA Area/Location, for example Asia/Shanghai."
1586
+ }
1587
+ },
1588
+ "required": [
1589
+ "time",
1590
+ "time_zone"
1591
+ ]
1592
+ },
1593
+ "weekly": {
1594
+ "type": "object",
1595
+ "description": "On the given weekdays at a local time.",
1596
+ "additionalProperties": false,
1597
+ "properties": {
1598
+ "time": {
1599
+ "type": "string",
1600
+ "description": "HH:mm:ss with optional 1-3 fractional digits, for example 09:00:00."
1601
+ },
1602
+ "time_zone": {
1603
+ "type": "string",
1604
+ "description": "UTC or IANA Area/Location, for example Asia/Shanghai."
1605
+ },
1606
+ "weekdays": {
1607
+ "type": "array",
1608
+ "description": "ISO weekdays, Monday 1 through Sunday 7, without repetitions.",
1609
+ "items": {
1610
+ "type": "integer"
1611
+ }
1612
+ }
1613
+ },
1614
+ "required": [
1615
+ "time",
1616
+ "time_zone",
1617
+ "weekdays"
1618
+ ]
1619
+ },
1620
+ "cron": {
1621
+ "type": "object",
1622
+ "description": "Five-field Vixie cron expression in a time zone.",
1623
+ "additionalProperties": false,
1624
+ "properties": {
1625
+ "expression": {
1626
+ "type": "string",
1627
+ "description": "minute hour day-of-month month day-of-week, for example \"*/15 9-17 * * 1-5\". When both day fields are restricted, a date matches if either one matches."
1628
+ },
1629
+ "time_zone": {
1630
+ "type": "string",
1631
+ "description": "UTC or IANA Area/Location, for example Asia/Shanghai."
1632
+ }
1633
+ },
1634
+ "required": [
1635
+ "expression",
1636
+ "time_zone"
1637
+ ]
1638
+ },
1639
+ "at": {
1640
+ "oneOf": [
1641
+ {
1642
+ "type": "string"
1643
+ },
1644
+ {
1645
+ "type": "object",
1646
+ "additionalProperties": false,
1647
+ "properties": {
1648
+ "date": {
1649
+ "type": "string"
1650
+ },
1651
+ "time": {
1652
+ "type": "string"
1653
+ },
1654
+ "time_zone": {
1655
+ "type": "string"
1656
+ }
1657
+ },
1658
+ "required": [
1659
+ "date",
1660
+ "time",
1661
+ "time_zone"
1662
+ ]
1663
+ }
1664
+ ],
1665
+ "description": "Absolute target: an RFC 3339 date-time with offset, or a local date, time, and IANA time_zone."
1666
+ }
1667
+ },
1668
+ "required": [
1669
+ "id"
1670
+ ]
1671
+ }
1672
+ ```
1673
+
1674
+ Source: [`packages/schedule/tool-schedule/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/tool-schedule/src/index.ts)
1197
1675
 
1198
- Registered only inside live root Agent scopes created after the opt-in Schedule plugin loads. Version 1 accepts after_seconds, explicit absolute at, and bounded fixed-rate every_seconds, and discloses session-local delivery; management reads and mutations require the shared Session persistence barrier.
1676
+ A preset or Agent scope mounts this package; the preset decides which agents receive the four management tools. Each call acts on the calling Agent's Session. Accepts after_seconds, explicit absolute at, bounded fixed-rate every_seconds, daily and weekly local times in an explicit IANA zone, and cron as a five-field expression. Management uses the Host storage domain; due messages resume the original Session.
1199
1677
 
1200
1678
  <a id="deepseek-aidsh-tool-lsp"></a>
1201
1679
 
@@ -1282,7 +1760,7 @@ A fixed foreground workflow starts one fresh structured child per round; the mod
1282
1760
 
1283
1761
  ### `skill`
1284
1762
 
1285
- Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill.
1763
+ Load the full instructions for a skill. Call it before acting on a task that names or clearly matches a skill in the session skill catalog.
1286
1764
 
1287
1765
  ```json
1288
1766
  {
@@ -1564,7 +2042,7 @@ Source: [`packages/subagent/tool-subagent/src/list-models.ts`](https://github.co
1564
2042
 
1565
2043
  ### `subagent`
1566
2044
 
1567
- Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the result by default. Set `run_in_background: true` to return a job id; collect with `job_output` and stop with `job_kill`.
2045
+ Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. This call waits for the result by default.
1568
2046
 
1569
2047
  ```json
1570
2048
  {
@@ -1580,7 +2058,7 @@ Delegate a self-contained task to a subagent (a separate agent that works in its
1580
2058
  },
1581
2059
  "run_in_background": {
1582
2060
  "type": "boolean",
1583
- "description": "Whether to run as a background job and return its id. Defaults to false; collect with job_output or stop with job_kill."
2061
+ "description": "Run as a background job and return its id (collect with job_output, stop with job_kill). Defaults to false."
1584
2062
  }
1585
2063
  },
1586
2064
  "required": [
@@ -1600,7 +2078,7 @@ The registered delegation name is the load-time `toolName` config (default `suba
1600
2078
 
1601
2079
  ### `interrupt_agent`
1602
2080
 
1603
- Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op.
2081
+ Ask a subagent to stop its current work. This call returns without waiting for it to stop. You can continue a direct child's conversation later with send_message. Subagents it started will keep running.
1604
2082
 
1605
2083
  ```json
1606
2084
  {
@@ -1608,7 +2086,7 @@ Request cancellation of a background agent's current turn by its agent id. The t
1608
2086
  "properties": {
1609
2087
  "agent_id": {
1610
2088
  "type": "string",
1611
- "description": "The agent id of the running agent to interrupt."
2089
+ "description": "The id of an agent created under you: your direct child or a deeper descendant."
1612
2090
  }
1613
2091
  },
1614
2092
  "required": [
@@ -1621,7 +2099,7 @@ Source: [`packages/subagent/tool-subagent-control/src/index.ts`](https://github.
1621
2099
 
1622
2100
  ### `list_agents`
1623
2101
 
1624
- List your continuable background subagents by durable id and label. Use it to recall which ones you started, not to poll for completion — you are told when one finishes. Status comes from the live registry: running means the agent is working right now, idle means it is loaded but between turns (it may be waiting on agents it started), and ready means it exists only in storage — resumable, not terminal, and not a result waiting to be collected; a `send_message` steers a running child at its nearest step boundary or starts a turn for an idle or ready child, and a direct child remains a `send_message` candidate in every status. The snapshot is not a delivery promise — `send_message` performs the authoritative check and may still fail. Children that could not be read are reported as diagnostics instead of being silently dropped. Scope `descendants` walks the whole tree below you in stable pre-order, annotating each entry with its durable direct-parent session id and depth. You may use `send_message` only for depth-1 entries; deeper entries are candidates for `interrupt_agent` only.
2102
+ List subagents you started, with their ids, labels, and status. running means it is working; inactive means it is not currently working. You will be notified when a subagent finishes; there is no need to keep checking its status. Use send_message to continue the conversation.
1625
2103
 
1626
2104
  ```json
1627
2105
  {
@@ -1629,7 +2107,7 @@ List your continuable background subagents by durable id and label. Use it to re
1629
2107
  "properties": {
1630
2108
  "scope": {
1631
2109
  "type": "string",
1632
- "description": "children (default) lists direct children only; descendants walks the complete tree below you.",
2110
+ "description": "children (default) lists direct children, which accept send_message in any status. descendants lists the whole tree below you with each entry's parent session id and depth; entries deeper than 1 accept only interrupt_agent.",
1633
2111
  "enum": [
1634
2112
  "children",
1635
2113
  "descendants"
@@ -1643,7 +2121,7 @@ Source: [`packages/subagent/tool-subagent-control/src/list-agents.ts`](https://g
1643
2121
 
1644
2122
  ### `send_message`
1645
2123
 
1646
- Send a message to a direct continuable child by its agent id. If you are a resident continuable child, you may also target your direct parent. If the target is still working, the message steers its nearest step; if it is idle, the message starts a turn. This call returns no answer from the agent — only confirmation that the message was delivered. A failure means the message was NOT delivered.
2124
+ Send a message to an agent. A working agent receives it at its next step; an idle agent starts a new turn with it. Returns delivery confirmation, not the agent's answer.
1647
2125
 
1648
2126
  ```json
1649
2127
  {
@@ -1675,7 +2153,7 @@ The globally named control tools over continuable background subagents: provider
1675
2153
 
1676
2154
  ### `job_kill`
1677
2155
 
1678
- Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops.
2156
+ Request cancellation of a running background job.
1679
2157
 
1680
2158
  ```json
1681
2159
  {
@@ -1713,7 +2191,7 @@ Source: [`packages/jobs/tool-jobs/src/index.ts`](https://github.com/deepseek-ai/
1713
2191
 
1714
2192
  ### `job_output`
1715
2193
 
1716
- Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap.
2194
+ Read a background job: output since the previous read for stream jobs, or the result of a finished final-output job.
1717
2195
 
1718
2196
  ```json
1719
2197
  {
@@ -1725,11 +2203,11 @@ Read a background job. Stream jobs return only output since the previous read; f
1725
2203
  },
1726
2204
  "wait": {
1727
2205
  "type": "boolean",
1728
- "description": "Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive."
2206
+ "description": "Block until the job finishes or the timeout expires; a timed-out wait leaves the job running. Defaults to false."
1729
2207
  },
1730
2208
  "timeout_ms": {
1731
2209
  "type": "number",
1732
- "description": "Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum."
2210
+ "description": "Max wait in milliseconds with wait: true. Defaults to and is capped by configuration."
1733
2211
  }
1734
2212
  },
1735
2213
  "required": [
@@ -1756,7 +2234,7 @@ Interrupt one teammate's current turn while preserving its pending inbox. Team L
1756
2234
  "properties": {
1757
2235
  "target": {
1758
2236
  "type": "string",
1759
- "description": "Teammate name."
2237
+ "description": "Teammate target returned by spawn_teammate or list_agents."
1760
2238
  }
1761
2239
  },
1762
2240
  "required": [
@@ -1769,7 +2247,7 @@ Source: [`packages/experimental/tool-agent-team/src/index.ts`](https://github.co
1769
2247
 
1770
2248
  ### `list_agents`
1771
2249
 
1772
- List the Lead and every durable teammate with current runtime status.
2250
+ List the Lead and every durable teammate with an addressable target and current availability. inactive means no turn is executing, not a task result. provisioning and failed describe member creation.
1773
2251
 
1774
2252
  ```json
1775
2253
  {
@@ -1782,7 +2260,7 @@ Source: [`packages/experimental/tool-agent-team/src/index.ts`](https://github.co
1782
2260
 
1783
2261
  ### `send_message`
1784
2262
 
1785
- Send one durable message to another Team member. A running target receives it at the nearest step boundary; an idle target starts a turn; an inactive teammate cold-resumes.
2263
+ Send one durable message to another Team member. A running target receives it at the nearest step boundary; an inactive target starts or resumes a turn.
1786
2264
 
1787
2265
  ```json
1788
2266
  {
@@ -1790,7 +2268,7 @@ Send one durable message to another Team member. A running target receives it at
1790
2268
  "properties": {
1791
2269
  "target": {
1792
2270
  "type": "string",
1793
- "description": "Team member name, or lead."
2271
+ "description": "Member target returned by spawn_teammate or list_agents, including lead."
1794
2272
  },
1795
2273
  "message": {
1796
2274
  "type": "string",
@@ -1925,7 +2403,7 @@ List shared tasks, including readiness, owner, revision, blockers, and write-sco
1925
2403
  },
1926
2404
  "owner": {
1927
2405
  "type": "string",
1928
- "description": "Optional member-name filter; use unowned for tasks without an owner."
2406
+ "description": "Optional member target from spawn_teammate or list_agents, matching ownerName; use unowned for tasks without an owner."
1929
2407
  },
1930
2408
  "ready": {
1931
2409
  "type": "boolean",
@@ -1999,7 +2477,7 @@ Compare-and-set a shared task action using the latest revision from team_task_ge
1999
2477
  },
2000
2478
  "owner": {
2001
2479
  "type": "string",
2002
- "description": "Member name for Lead-only reassign; omit to unassign."
2480
+ "description": "Member target from spawn_teammate or list_agents for Lead-only reassign; omit to unassign."
2003
2481
  }
2004
2482
  },
2005
2483
  "required": [
@@ -2038,7 +2516,7 @@ All nine tools are scoped to implicit Team Leads and durable teammates. The ship
2038
2516
 
2039
2517
  ### `todo_write`
2040
2518
 
2041
- Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished).
2519
+ Record and update a task list to plan multi-step work and show progress; skip it for trivial single-step tasks. Add one todo per concrete step before you start. While work remains, keep the todos being worked on `in_progress`, several only when work runs in parallel. Mark each todo `completed` as soon as it is done.
2042
2520
 
2043
2521
  ```json
2044
2522
  {
@@ -2090,17 +2568,13 @@ todo_write is session-owned state; UIs render the latest todo/write event as a c
2090
2568
 
2091
2569
  Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn.
2092
2570
 
2093
- The workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return <value>` — the value must be JSON-serializable and is this tool's result.
2094
-
2095
2571
  Script-body hooks:
2096
- - `agent(prompt, opts?): Promise<any>` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly.
2097
- - `pipeline(items, ...stages): Promise<any[]>` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages.
2572
+ - `agent(prompt, opts?): Promise<any>` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides.
2573
+ - `pipeline(items, ...stages): Promise<any[]>` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. A stage throw drops that ITEM to `null` and skips its remaining stages.
2098
2574
  - `parallel(thunks): Promise<any[]>` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`.
2099
2575
  - `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim.
2100
2576
 
2101
- Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`.
2102
-
2103
- Constraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes.
2577
+ Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) end the whole script instead of producing `null`. The script has no filesystem, network, timer, or Node.js APIs; the agents do the work.
2104
2578
 
2105
2579
  ```json
2106
2580
  {
@@ -2108,11 +2582,11 @@ Constraints: concurrency and total-agent caps apply; no filesystem, network, tim
2108
2582
  "properties": {
2109
2583
  "script": {
2110
2584
  "type": "string",
2111
- "description": "The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return <json-value>`)."
2585
+ "description": "The plain JavaScript body, not TypeScript and without an `export const meta` statement; top-level await is allowed. End with `return <value>`; the JSON-serializable value is this tool's result."
2112
2586
  },
2113
2587
  "meta": {
2114
2588
  "type": "object",
2115
- "description": "The workflow identity block (plain JSON — never code).",
2589
+ "description": "The workflow identity as plain JSON, not code.",
2116
2590
  "additionalProperties": true,
2117
2591
  "properties": {
2118
2592
  "name": {
@@ -2166,6 +2640,10 @@ Constraints: concurrency and total-agent caps apply; no filesystem, network, tim
2166
2640
  "type": "object",
2167
2641
  "description": "Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}).",
2168
2642
  "additionalProperties": true
2643
+ },
2644
+ "run_in_background": {
2645
+ "type": "boolean",
2646
+ "description": "Run as a background job: return a job id immediately instead of waiting; the return value arrives with the completion notice."
2169
2647
  }
2170
2648
  },
2171
2649
  "required": [
@@ -2177,6 +2655,23 @@ Constraints: concurrency and total-agent caps apply; no filesystem, network, tim
2177
2655
 
2178
2656
  Source: [`packages/workflow/tool-workflow/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/tool-workflow/src/index.ts)
2179
2657
 
2658
+ <a id="deepseek-aidsh-tool-workspace-dependencies"></a>
2659
+
2660
+ ## `@deepseek-ai/dsh-tool-workspace-dependencies`
2661
+
2662
+ ### `load_workspace_dependencies`
2663
+
2664
+ Get absolute paths to bundled Python and library directories, plus bundled Python distribution versions. Node.js and pnpm paths are included when the payload provides them. Python includes numpy, pandas, python-docx, python-pptx, openpyxl, Pillow, lxml, and XlsxWriter. Use these libraries for Office files unless the user or workspace instructions select another environment. When Node.js and pnpm paths are returned, run pnpm with that Node executable and pnpm script path. This does not change PATH or package-manager settings.
2665
+
2666
+ ```json
2667
+ {
2668
+ "type": "object",
2669
+ "properties": {}
2670
+ }
2671
+ ```
2672
+
2673
+ Source: [`packages/skill/tool-workspace-dependencies/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/skill/tool-workspace-dependencies/src/index.ts)
2674
+
2180
2675
  <a id="deepseek-aidsh-tool-web"></a>
2181
2676
 
2182
2677
  ## `@deepseek-ai/dsh-tool-web`
@@ -2204,7 +2699,7 @@ Source: [`packages/web/tool-web/src/index.ts`](https://github.com/deepseek-ai/de
2204
2699
 
2205
2700
  ### `web_search`
2206
2701
 
2207
- Search the web for current information. Provide 1–4 queries in the required queries array. Returns an optional summary answer and a list of source URLs.
2702
+ Search the web for current information. Returns an optional summary answer and a list of source URLs.
2208
2703
 
2209
2704
  ```json
2210
2705
  {
@@ -2212,7 +2707,7 @@ Search the web for current information. Provide 1–4 queries in the required qu
2212
2707
  "properties": {
2213
2708
  "queries": {
2214
2709
  "type": "array",
2215
- "description": "Required search queries; accepts 1–4 items and merges their results.",
2710
+ "description": "1–4 search queries; their results are merged.",
2216
2711
  "items": {
2217
2712
  "type": "string"
2218
2713
  }