dsh-plugin-dev-kb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/cordis.patch.yml +12 -0
  4. package/kb/INDEX.md +210 -0
  5. package/kb/README.md +69 -0
  6. package/kb/extra/AGENTS.md +75 -0
  7. package/kb/extra/api-gateway.md +164 -0
  8. package/kb/extra/api-gateway.zh.md +164 -0
  9. package/kb/extra/cookbook/adding-a-vendored-package.md +59 -0
  10. package/kb/extra/cookbook/adding-a-vendored-package.zh.md +59 -0
  11. package/kb/extra/cookbook/maintaining-dsh-code-review.md +64 -0
  12. package/kb/extra/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  13. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  14. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  15. package/kb/extra/defensive-patterns.md +33 -0
  16. package/kb/extra/defensive-patterns.zh.md +33 -0
  17. package/kb/extra/development.md +171 -0
  18. package/kb/extra/development.zh.md +171 -0
  19. package/kb/extra/event-producer-consumer.md +76 -0
  20. package/kb/extra/event-producer-consumer.zh.md +78 -0
  21. package/kb/extra/glossary.md +45 -0
  22. package/kb/extra/glossary.zh.md +45 -0
  23. package/kb/extra/graph-atlas.md +24 -0
  24. package/kb/extra/graph-atlas.zh.md +26 -0
  25. package/kb/extra/i18n/README.md +60 -0
  26. package/kb/extra/i18n/README.zh.md +60 -0
  27. package/kb/extra/i18n/style-samples.md +87 -0
  28. package/kb/extra/i18n/terminology.md +214 -0
  29. package/kb/extra/i18n/translation-prompt.md +263 -0
  30. package/kb/extra/i18n/translation-rules.md +69 -0
  31. package/kb/extra/i18n/translation-rules.zh.md +69 -0
  32. package/kb/extra/module-graph.md +1641 -0
  33. package/kb/extra/module-graph.zh.md +1643 -0
  34. package/kb/extra/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  35. package/kb/extra/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  36. package/kb/extra/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  37. package/kb/extra/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  38. package/kb/extra/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  39. package/kb/extra/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  40. package/kb/extra/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  41. package/kb/extra/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  42. package/kb/extra/postmortem/README.md +18 -0
  43. package/kb/extra/postmortem/README.zh.md +18 -0
  44. package/kb/extra/rescope.md +53 -0
  45. package/kb/extra/rescope.zh.md +53 -0
  46. package/kb/extra/subsystems/attachment.md +125 -0
  47. package/kb/extra/subsystems/attachment.zh.md +125 -0
  48. package/kb/extra/subsystems/extensions.md +364 -0
  49. package/kb/extra/subsystems/extensions.zh.md +364 -0
  50. package/kb/extra/subsystems/feedback.md +266 -0
  51. package/kb/extra/subsystems/feedback.zh.md +266 -0
  52. package/kb/extra/testing.md +49 -0
  53. package/kb/extra/testing.zh.md +49 -0
  54. package/kb/extra/web-styling.md +25 -0
  55. package/kb/extra/web-styling.zh.md +25 -0
  56. package/kb/meta/search-index.json +1328 -0
  57. package/kb/meta/site-pages.txt +168 -0
  58. package/kb/meta/source.json +13 -0
  59. package/kb/meta/topics.md +75 -0
  60. package/kb/site/develop/basic/config.md +108 -0
  61. package/kb/site/develop/basic/index.md +146 -0
  62. package/kb/site/develop/basic/publish.md +185 -0
  63. package/kb/site/develop/basic/tool.md +54 -0
  64. package/kb/site/develop/cordis-tutorial/01-first-plugin.md +95 -0
  65. package/kb/site/develop/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  66. package/kb/site/develop/cordis-tutorial/03-services.md +98 -0
  67. package/kb/site/develop/cordis-tutorial/04-events.md +144 -0
  68. package/kb/site/develop/cordis-tutorial/05-config.md +84 -0
  69. package/kb/site/develop/cordis-tutorial/06-composition-and-hmr.md +113 -0
  70. package/kb/site/develop/cordis-tutorial/07-into-the-harness.md +107 -0
  71. package/kb/site/develop/cordis-tutorial/index.md +62 -0
  72. package/kb/site/develop/framework/events.md +145 -0
  73. package/kb/site/develop/framework/index.md +139 -0
  74. package/kb/site/develop/framework/service.md +152 -0
  75. package/kb/site/develop/practice/index.md +157 -0
  76. package/kb/site/develop/practice/llm-adapter.md +190 -0
  77. package/kb/site/en/develop/basic/config.md +108 -0
  78. package/kb/site/en/develop/basic/index.md +146 -0
  79. package/kb/site/en/develop/basic/publish.md +185 -0
  80. package/kb/site/en/develop/basic/tool.md +54 -0
  81. package/kb/site/en/develop/cordis-tutorial/01-first-plugin.md +95 -0
  82. package/kb/site/en/develop/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  83. package/kb/site/en/develop/cordis-tutorial/03-services.md +98 -0
  84. package/kb/site/en/develop/cordis-tutorial/04-events.md +144 -0
  85. package/kb/site/en/develop/cordis-tutorial/05-config.md +84 -0
  86. package/kb/site/en/develop/cordis-tutorial/06-composition-and-hmr.md +113 -0
  87. package/kb/site/en/develop/cordis-tutorial/07-into-the-harness.md +107 -0
  88. package/kb/site/en/develop/cordis-tutorial/index.md +60 -0
  89. package/kb/site/en/develop/framework/events.md +145 -0
  90. package/kb/site/en/develop/framework/index.md +139 -0
  91. package/kb/site/en/develop/framework/service.md +150 -0
  92. package/kb/site/en/develop/practice/index.md +157 -0
  93. package/kb/site/en/develop/practice/llm-adapter.md +190 -0
  94. package/kb/site/en/guide/providers-custom-form.png +0 -0
  95. package/kb/site/en/guide/providers-models-page.png +0 -0
  96. package/kb/site/en/guide/providers.md +100 -0
  97. package/kb/site/en/guide/python-sdk.md +106 -0
  98. package/kb/site/en/guide/quickstart.md +32 -0
  99. package/kb/site/en/index.md +8 -0
  100. package/kb/site/en/reference/agent-lifecycle.md +86 -0
  101. package/kb/site/en/reference/capability-seams.md +475 -0
  102. package/kb/site/en/reference/config-catalog.md +3155 -0
  103. package/kb/site/en/reference/cookbook/adding-a-conversation-node.md +235 -0
  104. package/kb/site/en/reference/cookbook/adding-a-package.md +120 -0
  105. package/kb/site/en/reference/cookbook/adding-a-settings-card.md +102 -0
  106. package/kb/site/en/reference/cookbook/adding-a-tool.md +96 -0
  107. package/kb/site/en/reference/cookbook/adding-an-llm-adapter.md +45 -0
  108. package/kb/site/en/reference/cookbook/extension-cookbook.md +131 -0
  109. package/kb/site/en/reference/cordis-api/context.md +368 -0
  110. package/kb/site/en/reference/cordis-api/events.md +211 -0
  111. package/kb/site/en/reference/cordis-api/fiber.md +379 -0
  112. package/kb/site/en/reference/cordis-api/inherited.md +43 -0
  113. package/kb/site/en/reference/cordis-api/registry.md +156 -0
  114. package/kb/site/en/reference/cordis-api/service.md +106 -0
  115. package/kb/site/en/reference/cordis-primer.md +46 -0
  116. package/kb/site/en/reference/index.md +131 -0
  117. package/kb/site/en/reference/persistence-catalog.md +949 -0
  118. package/kb/site/en/reference/subsystems/approval.md +173 -0
  119. package/kb/site/en/reference/subsystems/client-modules.md +121 -0
  120. package/kb/site/en/reference/subsystems/code-runtime.md +194 -0
  121. package/kb/site/en/reference/subsystems/commands.md +190 -0
  122. package/kb/site/en/reference/subsystems/compaction.md +241 -0
  123. package/kb/site/en/reference/subsystems/core.md +1073 -0
  124. package/kb/site/en/reference/subsystems/credentials.md +136 -0
  125. package/kb/site/en/reference/subsystems/filesystem.md +498 -0
  126. package/kb/site/en/reference/subsystems/goal.md +280 -0
  127. package/kb/site/en/reference/subsystems/index.md +58 -0
  128. package/kb/site/en/reference/subsystems/invariants.md +91 -0
  129. package/kb/site/en/reference/subsystems/jobs.md +293 -0
  130. package/kb/site/en/reference/subsystems/llm-streaming.md +920 -0
  131. package/kb/site/en/reference/subsystems/lsp.md +205 -0
  132. package/kb/site/en/reference/subsystems/permission-presets.md +134 -0
  133. package/kb/site/en/reference/subsystems/persistence.md +388 -0
  134. package/kb/site/en/reference/subsystems/plan.md +90 -0
  135. package/kb/site/en/reference/subsystems/sandbox.md +221 -0
  136. package/kb/site/en/reference/subsystems/schedule.md +189 -0
  137. package/kb/site/en/reference/subsystems/scope.md +62 -0
  138. package/kb/site/en/reference/subsystems/session-projection.md +265 -0
  139. package/kb/site/en/reference/subsystems/session-query.md +498 -0
  140. package/kb/site/en/reference/subsystems/session-reference.md +111 -0
  141. package/kb/site/en/reference/subsystems/session-telemetry.md +197 -0
  142. package/kb/site/en/reference/subsystems/session-title.md +207 -0
  143. package/kb/site/en/reference/subsystems/session.md +852 -0
  144. package/kb/site/en/reference/subsystems/settings.md +313 -0
  145. package/kb/site/en/reference/subsystems/shell.md +306 -0
  146. package/kb/site/en/reference/subsystems/skills.md +334 -0
  147. package/kb/site/en/reference/subsystems/spill.md +120 -0
  148. package/kb/site/en/reference/subsystems/storage.md +232 -0
  149. package/kb/site/en/reference/subsystems/subagent.md +737 -0
  150. package/kb/site/en/reference/subsystems/subprocess.md +327 -0
  151. package/kb/site/en/reference/subsystems/system-prompt.md +210 -0
  152. package/kb/site/en/reference/subsystems/terminal.md +187 -0
  153. package/kb/site/en/reference/subsystems/token-meter.md +93 -0
  154. package/kb/site/en/reference/subsystems/tools.md +723 -0
  155. package/kb/site/en/reference/subsystems/typert.md +339 -0
  156. package/kb/site/en/reference/subsystems/user-questions.md +181 -0
  157. package/kb/site/en/reference/subsystems/web-server.md +111 -0
  158. package/kb/site/en/reference/subsystems/web.md +202 -0
  159. package/kb/site/en/reference/subsystems/workflow.md +281 -0
  160. package/kb/site/en/reference/subsystems/workspace.md +231 -0
  161. package/kb/site/en/reference/tool-catalog.md +1877 -0
  162. package/kb/site/en/reference/tool-execution-pipeline.md +66 -0
  163. package/kb/site/guide/providers-custom-form.zh.png +0 -0
  164. package/kb/site/guide/providers-models-page.zh.png +0 -0
  165. package/kb/site/guide/providers.md +100 -0
  166. package/kb/site/guide/python-sdk.md +106 -0
  167. package/kb/site/guide/quickstart.md +32 -0
  168. package/kb/site/index.md +8 -0
  169. package/kb/site/reference/agent-lifecycle.md +86 -0
  170. package/kb/site/reference/capability-seams.md +475 -0
  171. package/kb/site/reference/config-catalog.md +3154 -0
  172. package/kb/site/reference/cookbook/adding-a-conversation-node.md +235 -0
  173. package/kb/site/reference/cookbook/adding-a-package.md +120 -0
  174. package/kb/site/reference/cookbook/adding-a-settings-card.md +102 -0
  175. package/kb/site/reference/cookbook/adding-a-tool.md +98 -0
  176. package/kb/site/reference/cookbook/adding-an-llm-adapter.md +45 -0
  177. package/kb/site/reference/cookbook/extension-cookbook.md +133 -0
  178. package/kb/site/reference/cordis-api/context.md +368 -0
  179. package/kb/site/reference/cordis-api/events.md +211 -0
  180. package/kb/site/reference/cordis-api/fiber.md +379 -0
  181. package/kb/site/reference/cordis-api/inherited.md +43 -0
  182. package/kb/site/reference/cordis-api/registry.md +156 -0
  183. package/kb/site/reference/cordis-api/service.md +106 -0
  184. package/kb/site/reference/cordis-primer.md +52 -0
  185. package/kb/site/reference/index.md +135 -0
  186. package/kb/site/reference/persistence-catalog.md +949 -0
  187. package/kb/site/reference/subsystems/approval.md +173 -0
  188. package/kb/site/reference/subsystems/client-modules.md +121 -0
  189. package/kb/site/reference/subsystems/code-runtime.md +194 -0
  190. package/kb/site/reference/subsystems/commands.md +190 -0
  191. package/kb/site/reference/subsystems/compaction.md +241 -0
  192. package/kb/site/reference/subsystems/core.md +1081 -0
  193. package/kb/site/reference/subsystems/credentials.md +136 -0
  194. package/kb/site/reference/subsystems/filesystem.md +498 -0
  195. package/kb/site/reference/subsystems/goal.md +280 -0
  196. package/kb/site/reference/subsystems/index.md +58 -0
  197. package/kb/site/reference/subsystems/invariants.md +91 -0
  198. package/kb/site/reference/subsystems/jobs.md +293 -0
  199. package/kb/site/reference/subsystems/llm-streaming.md +926 -0
  200. package/kb/site/reference/subsystems/lsp.md +205 -0
  201. package/kb/site/reference/subsystems/permission-presets.md +134 -0
  202. package/kb/site/reference/subsystems/persistence.md +388 -0
  203. package/kb/site/reference/subsystems/plan.md +90 -0
  204. package/kb/site/reference/subsystems/sandbox.md +221 -0
  205. package/kb/site/reference/subsystems/schedule.md +189 -0
  206. package/kb/site/reference/subsystems/scope.md +62 -0
  207. package/kb/site/reference/subsystems/session-projection.md +265 -0
  208. package/kb/site/reference/subsystems/session-query.md +498 -0
  209. package/kb/site/reference/subsystems/session-reference.md +111 -0
  210. package/kb/site/reference/subsystems/session-telemetry.md +197 -0
  211. package/kb/site/reference/subsystems/session-title.md +207 -0
  212. package/kb/site/reference/subsystems/session.md +854 -0
  213. package/kb/site/reference/subsystems/settings.md +313 -0
  214. package/kb/site/reference/subsystems/shell.md +306 -0
  215. package/kb/site/reference/subsystems/skills.md +334 -0
  216. package/kb/site/reference/subsystems/spill.md +120 -0
  217. package/kb/site/reference/subsystems/storage.md +232 -0
  218. package/kb/site/reference/subsystems/subagent.md +739 -0
  219. package/kb/site/reference/subsystems/subprocess.md +327 -0
  220. package/kb/site/reference/subsystems/system-prompt.md +210 -0
  221. package/kb/site/reference/subsystems/terminal.md +187 -0
  222. package/kb/site/reference/subsystems/token-meter.md +93 -0
  223. package/kb/site/reference/subsystems/tools.md +723 -0
  224. package/kb/site/reference/subsystems/typert.md +339 -0
  225. package/kb/site/reference/subsystems/user-questions.md +181 -0
  226. package/kb/site/reference/subsystems/web-server.md +111 -0
  227. package/kb/site/reference/subsystems/web.md +202 -0
  228. package/kb/site/reference/subsystems/workflow.md +281 -0
  229. package/kb/site/reference/subsystems/workspace.md +231 -0
  230. package/kb/site/reference/tool-catalog.md +1880 -0
  231. package/kb/site/reference/tool-execution-pipeline.md +66 -0
  232. package/package.json +40 -0
  233. package/scripts/rebuild-index.mjs +88 -0
  234. package/skills/dsh-plugin-dev-kb.md +66 -0
@@ -0,0 +1,3155 @@
1
+ ---
2
+ editSource: "docs/config-catalog.md"
3
+ ---
4
+
5
+ <!-- Generated by scripts/gen-config-catalog.ts — do not edit by hand.
6
+ Run `pnpm run gen-config-catalog` to regenerate. -->
7
+
8
+ # Plugin Config Catalog
9
+
10
+ Every `config:` block a `cordis.yml` entry can set: for each loadable harness package, the verbatim config declaration (JSDoc included) its `apply` function or service constructor receives, with every referenced type pasted alongside (package-local types) or linked (everything else). The paste is the plugin's full declared config type — a field the runtime schema deliberately excludes is a runtime-only seam (its own JSDoc says so) and is not settable from `cordis.yml`. This is the **deployment**-axis reference — the wiring a plugin author works against is the generated Cordis API region on each [subsystem page](./subsystems/core.md), the model-facing tool schemas are the [tool catalog](./tool-catalog.md), and [subsystems/](./subsystems/core.md) documents the types these declarations reference.
11
+
12
+ This file is GENERATED from source (`scripts/gen-config-catalog.ts`) and verified fresh by `pnpm run verify-config-catalog` (part of `doc-sync`) — do not edit it by hand. Declaration blocks use a `ts config-catalog` fence (skipped by doc-typecheck, since a lone declaration referencing imports is not standalone-compilable). The generator also cross-checks the runtime schemastery schema against the pasted declaration — every schema-validated key, nested keys included, must be locatable on the declared config type — so the paste cannot hide a loader-accepted field.
13
+
14
+ A `Requires:` line lists the service keys the plugin `inject`s: its `cordis.yml` tree must also load providers for those services. Scope is the harness tier (`packages/`); the vendored cordis plugins a config tree may also load (`hmr`, the console logger, …) are pinned upstream source ([vendoring policy](https://github.com/deepseek-ai/deepseek-harness/blob/master/vendor/README.md)) and not catalogued here.
15
+
16
+ <a id="deepseek-aidsh-acp"></a>
17
+
18
+ ## `@deepseek-ai/dsh-acp`
19
+
20
+ Requires: `agents`
21
+
22
+ ```ts config-catalog
23
+ /** Plugin config: the provider/model selection used for each ACP-created agent. */
24
+ export interface AcpConfig {
25
+ /** Provider route for created agents. */
26
+ provider?: string
27
+ /** Model name for created agents. */
28
+ model?: string
29
+ /** Runtime-only transport override; production uses stdio. */
30
+ stream?: Stream
31
+ }
32
+ ```
33
+
34
+ Depends on: `Stream` (`@agentclientprotocol/sdk`)
35
+
36
+ Source: [`packages/acp/acp/src/index.ts:71`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/acp/acp/src/index.ts)
37
+
38
+ <a id="deepseek-aidsh-acp-demo"></a>
39
+
40
+ ## `@deepseek-ai/dsh-acp-demo`
41
+
42
+ ```ts config-catalog
43
+ /**
44
+ * App config: the swappable per-deployment values. `provider` and `model` configure
45
+ * each agent the ACP bridge creates at `session/new`; `persona` is the
46
+ * deployment persona (forwarded to the system-prompt plugin); `toolOrder` is
47
+ * the explicit model-facing tool order (forwarded to the system-prompt plugin);
48
+ * `tools` is the tool registry's config (its presentation `mode`, forwarded
49
+ * through agent-spine-demo); `persistenceRoot` is the JSONL backend's directory.
50
+ */
51
+ export interface Config {
52
+ /** Provider route for ACP-created agents. */
53
+ provider: string
54
+ /** Model name for ACP-created agents (must have a registered adapter). */
55
+ model: string
56
+ /** Bundled agent-loop concurrency cap; `1` is serial and omission uses its default. */
57
+ maxParallelToolCalls?: number
58
+ /** Deployment persona (the system-prompt plugin's `persona` config). */
59
+ persona?: string
60
+ /** Explicit model-facing tool order (the system-prompt plugin's `toolOrder` config; see dsh-system-prompt). */
61
+ toolOrder?: string[]
62
+ /** Tool-registry config — its presentation `mode` (forwarded through agent-spine-demo; see dsh-tools). */
63
+ tools?: ToolsConfig
64
+ /** DeepSeek Harness home directory exposed to bash and used for local skill discovery. */
65
+ dshHome?: string
66
+ /** Fallback session-title limits forwarded through agent-spine-demo. */
67
+ sessionTitle?: NonNullable<agentCore.Config['sessionTitle']>
68
+ /** Directory for JSONL sessions and the derived query index. Defaults to `./.sessions`. */
69
+ persistenceRoot?: string
70
+ /** Write delta-chunk runs as packed storage rows (the JSONL backend's `packChunks`). Defaults to `true`. */
71
+ packChunks?: boolean
72
+ /** JSONL artifact encoding; defaults to checksummed Zstandard frames. */
73
+ persistenceCompression?: JsonlCompression
74
+ /** Controls automatic AGENTS.md/CLAUDE.md loading; configure a byte budget or set `false`. */
75
+ workspaceContext: agentCore.Config['workspaceContext']
76
+ /** Skill registry, local-provider, and model-facing consumer config forwarded to agent-spine-demo. */
77
+ skills?: agentCore.SkillConfig
78
+ /** Model-facing bash tool config forwarded through agent-core. */
79
+ toolBash?: NonNullable<agentCore.Config['toolBash']>
80
+ /** Process-local background-job admission config forwarded through agent-core. */
81
+ jobs?: NonNullable<agentCore.Config['jobs']>
82
+ /** Generic background-job controls forwarded through agent-core; set false to omit their tools. */
83
+ toolJobs?: NonNullable<agentCore.Config['toolJobs']>
84
+ /** Persisted same-session goals; owner defaults enable them, or false disables the stack and tools. */
85
+ goals?: agentCore.GoalConfig | false
86
+ }
87
+ ```
88
+
89
+ Depends on: [`agentCore`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/examples/agent-spine-demo/src/index.ts) · [`JsonlCompression`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-persistence-jsonl/src/index.ts) · [`ToolsConfig`](#deepseek-aidsh-tools)
90
+
91
+ Source: [`packages/examples/acp-demo/src/index.ts:39`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/examples/acp-demo/src/index.ts)
92
+
93
+ <a id="deepseek-aidsh-agent-default-model"></a>
94
+
95
+ ## `@deepseek-ai/dsh-agent-default-model`
96
+
97
+ ```ts config-catalog
98
+ /** Composition entry for the default model selection. */
99
+ export interface Config {
100
+ /** Registered provider route. */
101
+ provider: string
102
+ /** Provider-owned model id. */
103
+ model: string
104
+ }
105
+ ```
106
+
107
+ Source: [`packages/core/agent-default-model/src/index.ts:41`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/agent-default-model/src/index.ts)
108
+
109
+ <a id="deepseek-aidsh-agent-instructions"></a>
110
+
111
+ ## `@deepseek-ai/dsh-agent-instructions`
112
+
113
+ ```ts config-catalog
114
+ /** User-facing workspace instruction loader configuration. */
115
+ export interface Config {
116
+ /** Harness home containing the fixed user-global `AGENTS.md`; defaults to `$DSH_HOME` or `~/.dsh`. */
117
+ dshHome?: string
118
+ /** Directory entries that identify the project root while walking upward from the session cwd. */
119
+ projectRootMarkers?: string[]
120
+ /** UTF-8 byte cap for one rendered baseline or dynamic batch; non-positive or non-finite disables loading. */
121
+ maxBytes: number
122
+ /** Maximum UTF-8 bytes read from one instruction file; larger files are ignored. */
123
+ maxSourceBytes?: number
124
+ /**
125
+ * Ordered same-directory project candidates; every existing file loads, with
126
+ * per-directory trimmed-content duplicates collapsed to the earliest candidate.
127
+ */
128
+ instructionFileCandidates?: string[]
129
+ /**
130
+ * Ordered same-directory local-overlay candidates loaded after the base files
131
+ * under the same per-directory trimmed-content dedup; empty disables the overlay.
132
+ */
133
+ localInstructionFileCandidates?: string[]
134
+ }
135
+ ```
136
+
137
+ Source: [`packages/context/agent-instructions/src/config.ts:18`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/context/agent-instructions/src/config.ts)
138
+
139
+ <a id="deepseek-aidsh-agent-loop"></a>
140
+
141
+ ## `@deepseek-ai/dsh-agent-loop`
142
+
143
+ Requires: `agents` · `sessions` · `llm` · `tools` · `systemPrompt`
144
+
145
+ ```ts config-catalog
146
+ /** Agent-loop plugin configuration. */
147
+ export interface Config {
148
+ /**
149
+ * Maximum parallel-safe calls in flight per agent step. `1` is serial;
150
+ * omission defaults to {@link DEFAULT_MAX_PARALLEL_TOOL_CALLS}.
151
+ */
152
+ maxParallelToolCalls?: number
153
+ /** Agents created or resumed at plugin startup. */
154
+ agents: (AgentOptions & {
155
+ /** Stable config label used in logs and as the fresh combined-id prefix. */
156
+ id: string
157
+ /** Optional stable identity; remounts resume its materialized history, while first use creates it fresh. */
158
+ sessionId?: SessionId
159
+ /** Optional workspace for a fresh session. */
160
+ cwd?: string
161
+ /** Persisted session to resume instead of creating a fresh session. */
162
+ resumeSessionId?: SessionId
163
+ })[]
164
+ }
165
+ ```
166
+
167
+ Depends on: [`AgentOptions`](./subsystems/core.md) · [`SessionId`](./subsystems/core.md)
168
+
169
+ Source: [`packages/core/agent-loop/src/index.ts:255`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/agent-loop/src/index.ts)
170
+
171
+ <a id="deepseek-aidsh-agent-presets"></a>
172
+
173
+ ## `@deepseek-ai/dsh-agent-presets`
174
+
175
+ Requires: `loader`
176
+
177
+ ```ts config-catalog
178
+ /** Plugin config: which preset is the default, and where presets live. */
179
+ export interface Config {
180
+ /** Preset id mounted when a caller names none. Missing at mount time fails loud. */
181
+ default: string
182
+ /** Scanned roots in precedence order; an earlier root wins a duplicate id. */
183
+ roots: PresetRoot[]
184
+ /**
185
+ * Append the harness home's `USER_PRESET_DIR` as a `user` root, after every
186
+ * configured root. False mounts a roster over `roots` alone.
187
+ */
188
+ includeUserRoot: boolean
189
+ }
190
+
191
+ /** One directory scanned for preset subdirectories. */
192
+ export interface PresetRoot {
193
+ /** Directory holding one subdirectory per preset; a leading `~` expands. */
194
+ path: string
195
+ /** Trust recorded on every preset discovered under this root. */
196
+ trust: PresetTrust
197
+ }
198
+
199
+ /**
200
+ * Where a preset's composition came from. A `system` preset ships with the
201
+ * deployment; a `user` preset was authored locally, by a person or by an
202
+ * agent, and therefore carries the same trust as shell access.
203
+ */
204
+ export type PresetTrust = 'system' | 'user'
205
+ ```
206
+
207
+ Source: [`packages/preset/agent-presets/src/preset.ts:52`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/preset/agent-presets/src/preset.ts)
208
+
209
+ <a id="deepseek-aidsh-agent-spine-demo"></a>
210
+
211
+ ## `@deepseek-ai/dsh-agent-spine-demo`
212
+
213
+ ```ts config-catalog
214
+ /**
215
+ * Bundle config: each field forwarded verbatim to the child that owns it —
216
+ * `agents` to the agent loop (an app that pre-creates no agents, like the ACP
217
+ * bridge, simply omits it), `includeHarnessIdentity`, `includeRuntimeContext`,
218
+ * `persona`, and `toolOrder` to the system-prompt plugin (the fixed opener,
219
+ * dynamic-context policy, deployment persona, and explicit model-facing tool
220
+ * order), the `tools` object to the tool registry (its presentation `mode`),
221
+ * `dshHome` to bash environment and local skill discovery, `sessionTitle` to
222
+ * the fallback title service, `skills` to the
223
+ * skill registry/local provider/tool consumer, `workspaceContext` to the
224
+ * agent-instructions loader, `jobs` to the process-local job provider, and
225
+ * `toolBash`/`toolJobs` to the model-facing tool plugins this bundle owns.
226
+ * Provider adapters own their `retryPolicy`; this bundle always mounts its
227
+ * executor.
228
+ * `goals` opts into and configures the persisted goal domain plus its model tool
229
+ * and same-session driver; `invariants` configures global and package-filtered
230
+ * relational checks. Owner schemas supply defaults for optional input;
231
+ * workspace context instead requires an explicit byte budget or `false` because
232
+ * it changes model-visible input. Producer opt-in stays producer-local:
233
+ * `toolBash` configures bash only; independently composed producers keep their
234
+ * own config. Set `toolBash: false` when another plugin owns the model-facing
235
+ * `bash` name.
236
+ */
237
+ export interface Config {
238
+ /** The agent-loop `agents` list (see dsh-agent-loop's `Config`). */
239
+ agents?: AgentLoopConfig['agents']
240
+ /** Agent-loop concurrency cap; `1` is serial. */
241
+ maxParallelToolCalls?: AgentLoopConfig['maxParallelToolCalls']
242
+ /** Whether the system prompt includes the fixed Harness identity (default true). */
243
+ includeHarnessIdentity?: SystemPromptConfig['includeHarnessIdentity']
244
+ /** Whether model history includes dynamic runtime-context snapshots (default true). */
245
+ includeRuntimeContext?: SystemPromptConfig['includeRuntimeContext']
246
+ /** The deployment persona (see dsh-system-prompt's `Config`). */
247
+ persona?: SystemPromptConfig['persona']
248
+ /** The explicit model-facing tool order (see dsh-system-prompt's `Config`). */
249
+ toolOrder?: SystemPromptConfig['toolOrder']
250
+ /** The tool registry's config — its presentation `mode` (see dsh-tools' `Config`). */
251
+ tools?: ToolsConfig
252
+ /** DeepSeek Harness home directory shared by shell context and local skill discovery. */
253
+ dshHome?: string
254
+ /** Deterministic fallback and accepted-title limits; omission uses the bundle's example policy. */
255
+ sessionTitle?: SessionTitleConfig
256
+ /** Workspace-context loader controls with an explicit byte budget; set `false` for hermetic prompts. */
257
+ workspaceContext: workspaceContext.Config | false
258
+ /**
259
+ * Skill registry, local provider, and model-facing consumer config.
260
+ * Skills use `enabled` because one nested config controls a provider stack;
261
+ * single model-tool plugins use `Config | false` to disable that one consumer.
262
+ */
263
+ skills?: SkillConfig
264
+ /** Model-facing bash tool config, or false when another plugin owns `bash`. */
265
+ toolBash?: toolBash.Config | false
266
+ /** Process-local background-job admission config. */
267
+ jobs?: JobsConfig
268
+ /** Generic background-job controls; set false to keep the job service without model-facing job tools. */
269
+ toolJobs?: toolJobs.Config | false
270
+ /** Global enablement and package-name filters for invariant companions. */
271
+ invariants?: InvariantConfig
272
+ /** Opt-in persisted same-session goal stack; set false or omit to leave it unmounted. */
273
+ goals?: GoalConfig | false
274
+ }
275
+
276
+ /** Skill bundle config forwarded to the registry, local provider, and model-facing consumer. */
277
+ export interface SkillConfig {
278
+ /** Mount the bundled local skill provider and model-facing skill tool (default true). */
279
+ enabled?: boolean
280
+ /** Registry-level discovery cache settings. */
281
+ registry?: SkillRegistryConfig
282
+ /** Local filesystem skill provider settings. */
283
+ filesystem?: SkillFileSystem.Config
284
+ /** Model-facing skill catalog and tool settings. */
285
+ tool?: toolSkill.Config
286
+ }
287
+
288
+ /** Persisted goal domain, model-tool policy, and same-session driver config. */
289
+ export interface GoalConfig {
290
+ /** Goal-domain creation defaults. */
291
+ domain?: GoalDomainConfig
292
+ /** Model-facing goal-tool authority policy. */
293
+ tool?: toolGoal.Config
294
+ }
295
+ ```
296
+
297
+ Depends on: [`AgentLoopConfig`](#deepseek-aidsh-agent-loop) · [`GoalDomainConfig`](#deepseek-aidsh-goal) · [`InvariantConfig`](#deepseek-aidsh-invariants) · [`JobsConfig`](#deepseek-aidsh-jobs-local) · [`SessionTitleConfig`](#deepseek-aidsh-session-title) · [`SkillFileSystem`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/skill/skill-filesystem/src/index.ts) · [`SkillRegistryConfig`](#deepseek-aidsh-skill) · [`SystemPromptConfig`](#deepseek-aidsh-system-prompt) · [`toolBash`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/tool-bash/src/index.ts) · [`toolGoal`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/goal/tool-goal/src/index.ts) · [`toolJobs`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/jobs/tool-jobs/src/index.ts) · [`ToolsConfig`](#deepseek-aidsh-tools) · [`toolSkill`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/skill/tool-skill/src/index.ts) · [`workspaceContext`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/context/agent-instructions/src/index.ts)
298
+
299
+ Source: [`packages/examples/agent-spine-demo/src/index.ts:92`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/examples/agent-spine-demo/src/index.ts)
300
+
301
+ <a id="deepseek-aidsh-agent-tool-presentation"></a>
302
+
303
+ ## `@deepseek-ai/dsh-agent-tool-presentation`
304
+
305
+ Requires: `tools`
306
+
307
+ ```ts config-catalog
308
+ /** Plugin config. */
309
+ export interface Config {
310
+ /**
311
+ * The form this agent's model sees. `native` sends every visible schema,
312
+ * `code` sends only `run_code` plus a generated SDK, `both` sends both.
313
+ * Required rather than defaulted: the deployment default is what a preset
314
+ * without this row already gets, so an omitted value would mean the row was
315
+ * composed for nothing.
316
+ */
317
+ mode: ToolPresentationMode
318
+ }
319
+ ```
320
+
321
+ Depends on: [`ToolPresentationMode`](./subsystems/tools.md)
322
+
323
+ Source: [`packages/core/agent-tool-presentation/src/index.ts:38`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/agent-tool-presentation/src/index.ts)
324
+
325
+ <a id="deepseek-aidsh-attachment-local"></a>
326
+
327
+ ## `@deepseek-ai/dsh-attachment-local`
328
+
329
+ ```ts config-catalog
330
+ /** Local attachment backend configuration. */
331
+ export interface Config {
332
+ /** Explicit harness home; omitted follows `DSH_HOME`, then `~/.dsh`. */
333
+ dshHome?: string
334
+ /** Maximum encoded bytes accepted for one image. */
335
+ maxImageBytes?: number
336
+ /** Maximum image count accepted in one submitted message. */
337
+ maxImagesPerMessage?: number
338
+ /** Maximum aggregate encoded image bytes accepted in one submitted message. */
339
+ maxMessageImageBytes?: number
340
+ /** Maximum intrinsic width multiplied by height accepted for one image. */
341
+ maxImagePixels?: number
342
+ }
343
+ ```
344
+
345
+ Source: [`packages/attachment/attachment-local/src/index.ts:24`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/attachment/attachment-local/src/index.ts)
346
+
347
+ <a id="deepseek-aidsh-bash-local"></a>
348
+
349
+ ## `@deepseek-ai/dsh-bash-local`
350
+
351
+ Requires: `subprocess`
352
+
353
+ ```ts config-catalog
354
+ /** Plugin config (all optional — `static Config` supplies the defaults). */
355
+ export interface Config {
356
+ /** Default working directory for commands (default: process.cwd()). */
357
+ cwd?: string
358
+ /** Default foreground timeout in milliseconds. */
359
+ timeoutMs?: number
360
+ /** Upper bound for per-call timeout overrides. */
361
+ maxTimeoutMs?: number
362
+ /** Per-stream in-memory output cap; overflow spills to a temp file. */
363
+ maxOutputBytes?: number
364
+ /** Per-stream spill-file cap; larger streams retain only their in-memory tail. */
365
+ maxSpillBytes?: number
366
+ /** Grace period for kill escalation and inherited pipes; at most `MAX_TIMER_DELAY_MS`. */
367
+ graceMs?: number
368
+ }
369
+ ```
370
+
371
+ Source: [`packages/shell/bash-local/src/index.ts:41`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/bash-local/src/index.ts)
372
+
373
+ <a id="deepseek-aidsh-bash-sandbox"></a>
374
+
375
+ ## `@deepseek-ai/dsh-bash-sandbox`
376
+
377
+ Requires: `subprocess` · `sandbox` · `sandboxPolicy`
378
+
379
+ ```ts config-catalog
380
+ /**
381
+ * Plugin config: the local executor's knobs, verbatim. The sandbox policy —
382
+ * the default mode and fallback `workspace-write` root — is NOT here: it lives
383
+ * on `ctx.sandboxPolicy` (`@deepseek-ai/dsh-sandbox-policy`), which resolves
384
+ * each calling session's mode and cwd for every enforcing capability. The runner
385
+ * choice is likewise the `ctx.sandbox` provider's config, not this executor's.
386
+ */
387
+ export type Config = LocalConfig
388
+ ```
389
+
390
+ Depends on: [`LocalConfig`](#deepseek-aidsh-bash-local)
391
+
392
+ Source: [`packages/shell/bash-sandbox/src/index.ts:35`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/bash-sandbox/src/index.ts)
393
+
394
+ <a id="deepseek-aidsh-client-connection"></a>
395
+
396
+ ## `@deepseek-ai/dsh-client-connection`
397
+
398
+ Requires: `webServer`
399
+
400
+ ```ts config-catalog
401
+ /** Plugin config: the deployment's non-loopback serving authorities. */
402
+ export interface ConnectionConfig {
403
+ /**
404
+ * Authorities this deployment serves beyond loopback: exact `host:port`, or
405
+ * port-less `host` matching any port. The /api trust fence refuses any
406
+ * request whose Host is neither loopback nor listed here, so a
407
+ * non-loopback (`0.0.0.0`) deployment must declare the names it is reached
408
+ * by (the dsh CLI derives the machine's LAN IP literals itself). An entry
409
+ * that is not a bare, canonical authority fails the plugin load.
410
+ */
411
+ trustedHosts?: string[]
412
+ /** Maximum buffered JSON body for every `/api` request. */
413
+ maxRequestBodyBytes?: number
414
+ }
415
+ ```
416
+
417
+ Source: [`packages/client/connection/src/index.ts:50`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/connection/src/index.ts)
418
+
419
+ <a id="deepseek-aidsh-client-hmr"></a>
420
+
421
+ ## `@deepseek-ai/dsh-client-hmr`
422
+
423
+ Requires: `clientModules` · `webServer`
424
+
425
+ ```ts config-catalog
426
+ /** Plugin config, validated by the same-named schemastery schema. */
427
+ export interface Config {
428
+ /** Bundle stat-poll interval in milliseconds (default 500, the build-side watcher's polling default). */
429
+ pollIntervalMs?: number
430
+ }
431
+ ```
432
+
433
+ Source: [`packages/client/hmr/src/index.ts:31`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/hmr/src/index.ts)
434
+
435
+ <a id="deepseek-aidsh-code-runtime-worker-thread"></a>
436
+
437
+ ## `@deepseek-ai/dsh-code-runtime-worker-thread`
438
+
439
+ ```ts config-catalog
440
+ /** Plugin config: every execution cap, changeable from `cordis.yml` (no hardcoded tunables). */
441
+ export interface Config {
442
+ /**
443
+ * Busy-time budget in milliseconds: the run fails with kind `'timeout'`
444
+ * once the worker's MEASURED event-loop active time
445
+ * (`worker.performance.eventLoopUtilization()`) exceeds this. Metering
446
+ * measured busy time — not wall time, not host-side pending-call
447
+ * bookkeeping — is what makes the budget both fair (a program awaiting a
448
+ * slow tool accrues nothing) and ungameable (a hot loop accrues whether
449
+ * or not a decoy dispatch is in flight).
450
+ */
451
+ computeMs?: number
452
+ /**
453
+ * Wall-clock ceiling in milliseconds; never pauses for anything. The
454
+ * backstop for what busy-time cannot see (a program awaiting a promise
455
+ * nobody will resolve). At most `2_147_483_647` (Node's maximum
456
+ * `setTimeout` delay, about 24.9 days): a longer value is rejected at load
457
+ * because `setTimeout` would clamp it to 1 ms.
458
+ */
459
+ maxWallMs?: number
460
+ /**
461
+ * Hard cap for serialized log-array, completion-value, and failure-message payloads;
462
+ * fixed result-envelope syntax is excluded.
463
+ */
464
+ maxOutputBytes?: number
465
+ /** The worker's max old-generation heap in MiB (`resourceLimits`); overflow kills the worker, surfacing as kind `'worker-exit'`. */
466
+ maxOldGenerationSizeMb?: number
467
+ }
468
+ ```
469
+
470
+ Source: [`packages/code-runtime/code-runtime-worker-thread/src/index.ts:25`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/code-runtime/code-runtime-worker-thread/src/index.ts)
471
+
472
+ <a id="deepseek-aidsh-compaction-basic"></a>
473
+
474
+ ## `@deepseek-ai/dsh-compaction-basic`
475
+
476
+ Requires: `llm` · `tokenMeter` · `sessions`
477
+
478
+ ```ts config-catalog
479
+ /** Basic compaction configuration with an optional exact-target policy table. */
480
+ export interface BasicCompactionConfig extends CompactionPolicyConfig {
481
+ /** Exact provider/model overrides; duplicate targets fail plugin load. */
482
+ modelPolicies?: ModelCompactPolicyConfig[]
483
+ /** Enable automatic step-boundary pressure and overflow-recovery listeners. Defaults to `true`. */
484
+ auto?: boolean
485
+ }
486
+
487
+ /** Policy fields shared by the default policy and exact model overrides. */
488
+ export interface CompactionPolicyConfig {
489
+ /** Compact at this fraction of the model's context window. Defaults to `0.8`. */
490
+ thresholdRatio?: number
491
+ /** Recent context retained as a fraction of the model's window. Defaults to `0.16`. */
492
+ retainRatio?: number
493
+ /** Absolute recent-context budget; mutually exclusive with `retainRatio`. */
494
+ retainTokens?: number
495
+ /** Summary provider; set together with `summarizationModel`, or inherit the conversation target. */
496
+ summarizationProvider?: string
497
+ /** Summary model; set together with `summarizationProvider`, or inherit the conversation target. */
498
+ summarizationModel?: string
499
+ /** Provider generation cap for summarization. Defaults to `8192`. */
500
+ maxTokens?: number
501
+ /** Extra attempts after the first compaction when pressure remains above threshold. Defaults to `1`. */
502
+ compactionRetries?: number
503
+ /** Maximum retries after canonical context overflow; `0` disables recovery. Defaults to `1`. */
504
+ maxOverflowRetries?: number
505
+ }
506
+
507
+ /** Exact provider/model override merged over the default compaction policy. */
508
+ export interface ModelCompactPolicyConfig extends CompactionPolicyConfig {
509
+ /** Registered provider route to match. */
510
+ provider: string
511
+ /** Exact routed model id to match within `provider`. */
512
+ model: string
513
+ }
514
+ ```
515
+
516
+ Source: [`packages/compaction/compaction-basic/src/types.ts:38`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/compaction/compaction-basic/src/types.ts)
517
+
518
+ <a id="deepseek-aidsh-compaction-tool-result-pruner"></a>
519
+
520
+ ## `@deepseek-ai/dsh-compaction-tool-result-pruner`
521
+
522
+ Requires: `tokenMeter`
523
+
524
+ ```ts config-catalog
525
+ /** Character-budget policy for deterministic tool-result pruning. */
526
+ export interface ToolResultPruneConfig {
527
+ /** Prune when total text exceeds this many Unicode code points. Defaults to `8192`. */
528
+ thresholdChars?: number
529
+ /** Maximum leading Unicode code points retained. Defaults to `4096`. */
530
+ headChars?: number
531
+ /** Maximum trailing Unicode code points retained. Defaults to `1024`. */
532
+ tailChars?: number
533
+ }
534
+ ```
535
+
536
+ Source: [`packages/compaction/compaction-tool-result-pruner/src/types.ts:4`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/compaction/compaction-tool-result-pruner/src/types.ts)
537
+
538
+ <a id="deepseek-aidsh-cordis-host-runner"></a>
539
+
540
+ ## `@deepseek-ai/dsh-cordis-host-runner`
541
+
542
+ Requires: `tools`
543
+
544
+ ```ts config-catalog
545
+ /** Runner configuration. */
546
+ export interface Config {
547
+ /** Maximum synchronous VM evaluation time in milliseconds. */
548
+ vmTimeoutMs?: number
549
+ }
550
+ ```
551
+
552
+ Source: [`packages/extensions/cordis-host-runner/src/index.ts:88`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/cordis-host-runner/src/index.ts)
553
+
554
+ <a id="deepseek-aidsh-credentials-local"></a>
555
+
556
+ ## `@deepseek-ai/dsh-credentials-local`
557
+
558
+ ```ts config-catalog
559
+ /** Plugin config: file location and hot-reload behavior. */
560
+ export interface Config {
561
+ /** Credentials document path; defaults to `.credentials.yaml` under the harness home. */
562
+ path?: string
563
+ /** Harness home used when `path` is omitted; defaults to `$DSH_HOME` or `~/.dsh`. */
564
+ dshHome?: string
565
+ /** Watch the document and hot-publish external edits; defaults to true. */
566
+ watch?: boolean
567
+ /** Watcher write-settle window in milliseconds; defaults to 100. */
568
+ debounceMs?: number
569
+ }
570
+ ```
571
+
572
+ Source: [`packages/credentials/credentials-local/src/index.ts:55`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/credentials/credentials-local/src/index.ts)
573
+
574
+ <a id="deepseek-aidsh-e2b"></a>
575
+
576
+ ## `@deepseek-ai/dsh-e2b`
577
+
578
+ ```ts config-catalog
579
+ /** Configuration for the shared E2B sandbox owner. */
580
+ export interface Config {
581
+ /** API key; omission reads `E2B_API_KEY`. It is never forwarded into the sandbox. */
582
+ apiKey?: string
583
+ /** Shared remote working directory, created before adapters receive the sandbox. */
584
+ cwd?: string
585
+ /** E2B sandbox lifetime in milliseconds; expiry always deletes the sandbox. */
586
+ timeoutMs?: number
587
+ }
588
+ ```
589
+
590
+ Source: [`packages/e2b/e2b/src/index.ts:43`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/e2b/e2b/src/index.ts)
591
+
592
+ <a id="deepseek-aidsh-fs-local"></a>
593
+
594
+ ## `@deepseek-ai/dsh-fs-local`
595
+
596
+ ```ts config-catalog
597
+ /** Configuration for the local filesystem backend. */
598
+ export interface Config {
599
+ /** Base directory for relative paths. Defaults to `process.cwd()`. */
600
+ cwd?: string
601
+ /**
602
+ * Exclusive UTF-8 byte limit on each overwrite-diff side, capped by the
603
+ * runtime's safe allocation/decode maximum. Defaults to 10 MiB.
604
+ */
605
+ diffBasisMaxBytes?: number
606
+ }
607
+ ```
608
+
609
+ Source: [`packages/fs/fs-local/src/index.ts:41`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/fs/fs-local/src/index.ts)
610
+
611
+ <a id="deepseek-aidsh-fs-sandbox"></a>
612
+
613
+ ## `@deepseek-ai/dsh-fs-sandbox`
614
+
615
+ Requires: `sandboxPolicy`
616
+
617
+ ```ts config-catalog
618
+ /**
619
+ * Plugin config: the local backend's knobs verbatim (`cwd` resolution default
620
+ * and `diffBasisMaxBytes` overwrite-presentation bound). The sandbox default
621
+ * (mode + `workspace-write` fallback root) is NOT here — `ctx.sandboxPolicy`
622
+ * resolves each calling session for every enforcing capability.
623
+ */
624
+ export type Config = LocalConfig
625
+ ```
626
+
627
+ Depends on: [`LocalConfig`](#deepseek-aidsh-fs-local)
628
+
629
+ Source: [`packages/fs/fs-sandbox/src/index.ts:49`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/fs/fs-sandbox/src/index.ts)
630
+
631
+ <a id="deepseek-aidsh-goal"></a>
632
+
633
+ ## `@deepseek-ai/dsh-goal`
634
+
635
+ Requires: `agents`
636
+
637
+ ```ts config-catalog
638
+ /** Deployment defaults for goal creation. */
639
+ export interface Config {
640
+ /** Total rounds used when a create request omits its own cap. */
641
+ defaultMaxGoalRounds?: number
642
+ }
643
+ ```
644
+
645
+ Source: [`packages/goal/goal/src/index.ts:116`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/goal/goal/src/index.ts)
646
+
647
+ <a id="deepseek-aidsh-headless"></a>
648
+
649
+ ## `@deepseek-ai/dsh-headless`
650
+
651
+ Requires: `agentDefaultModel` · `agents` · `sessions`
652
+
653
+ ```ts config-catalog
654
+ /** Plugin config: the task resolved from this app's injected provider service. */
655
+ export interface Config {
656
+ /** The prompt text for the single run. */
657
+ task: string
658
+ }
659
+ ```
660
+
661
+ Source: [`packages/bundle/headless/src/index.ts:31`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/bundle/headless/src/index.ts)
662
+
663
+ <a id="deepseek-aidsh-hooks-claude-code"></a>
664
+
665
+ ## `@deepseek-ai/dsh-hooks-claude-code`
666
+
667
+ Requires: `shell`
668
+
669
+ ```ts config-catalog
670
+ /** Plugin config: where the CC hook config lives + substitution roots. */
671
+ export interface Config {
672
+ /**
673
+ * Path to a `hooks.json` or a settings file whose `hooks` key holds the config.
674
+ * Process-level: read once at load, a relative path resolves against the process
675
+ * launch cwd, so one config applies to the whole process.
676
+ * TODO(per-session-hook-config): per-session discovery of a project-local
677
+ * `hooks.json` from each `session/new.cwd`.
678
+ */
679
+ configPath: string
680
+ /**
681
+ * Replaces `${CLAUDE_PLUGIN_ROOT}` in command strings (the plugin's root dir).
682
+ */
683
+ pluginRoot?: string
684
+ /**
685
+ * Replaces `${CLAUDE_PROJECT_DIR}` in command strings AND is exported as the
686
+ * `CLAUDE_PROJECT_DIR` env var for hook processes. When omitted, the env var
687
+ * defaults per-run to the agent's session workspace (`session.header.cwd`, the
688
+ * same dir the hook runs in) — Claude Code always exports this var, and common
689
+ * unmodified hooks reference `$CLAUDE_PROJECT_DIR` for project-relative paths.
690
+ */
691
+ projectDir?: string
692
+ /** Default per-hook timeout in ms when a hook sets none (CC default: 600000). */
693
+ defaultTimeoutMs?: number
694
+ /** Character cap for the `hook/result` event's persisted stderr summary. */
695
+ stderrSummaryMaxChars?: number
696
+ }
697
+ ```
698
+
699
+ Source: [`packages/hooks/hooks-claude-code/src/index.ts:45`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/hooks/hooks-claude-code/src/index.ts)
700
+
701
+ <a id="deepseek-aidsh-hooks-codex"></a>
702
+
703
+ ## `@deepseek-ai/dsh-hooks-codex`
704
+
705
+ Requires: `shell`
706
+
707
+ ```ts config-catalog
708
+ /** Plugin config: where the Codex hooks.json lives + the model name for payloads. */
709
+ export interface Config {
710
+ /**
711
+ * Path to a Codex `hooks.json`. Process-level: read once at load, a relative
712
+ * path resolves against the process launch cwd.
713
+ * TODO(per-session-hook-config): per-session project-local discovery from each
714
+ * `session/new.cwd`.
715
+ */
716
+ configPath: string
717
+ /** The model name stamped on every payload (Codex includes `model` on each event). */
718
+ model?: string
719
+ /** Default per-hook timeout in ms when a hook sets none (Codex default: 600000). */
720
+ defaultTimeoutMs?: number
721
+ /** Character cap for the `hook/result` event's persisted stderr summary. */
722
+ stderrSummaryMaxChars?: number
723
+ }
724
+ ```
725
+
726
+ Source: [`packages/hooks/hooks-codex/src/index.ts:44`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/hooks/hooks-codex/src/index.ts)
727
+
728
+ <a id="deepseek-aidsh-host-apiproxy"></a>
729
+
730
+ ## `@deepseek-ai/dsh-host-apiproxy`
731
+
732
+ Requires: `agentDefaultModel` · `agents` · `attachments` · `directoryPicker` · `llm` · `sessions` · `subagents` · `sessionQuery` · `tools` · `userQuestions` · `workspaceRegistry`
733
+
734
+ ```ts config-catalog
735
+ /** Gateway plugin configuration. */
736
+ export interface Config {
737
+ /**
738
+ * Whether this deployment can hand paths to a native desktop opener —
739
+ * the `hasDocument` capability the agent-preset roster reports. Absent,
740
+ * the platform is asked (macOS/Windows/WSL yes; Linux only with a display
741
+ * server); set it explicitly where detection misleads, e.g. `false` in a
742
+ * container whose DISPLAY points nowhere a user can see.
743
+ */
744
+ nativeOpen?: boolean
745
+ /**
746
+ * DEFLATE level for every session-log ZIP entry: `0` stores without
747
+ * compression, `1` favors CPU/latency, and `9` favors archive size.
748
+ * @default 6
749
+ */
750
+ sessionExportCompressionLevel?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
751
+ /**
752
+ * Maximum physical size of a cold Session artifact eligible for blankness
753
+ * verification. Zero disables probes.
754
+ * @default 1024
755
+ */
756
+ coldBlankProbeMaxBytes?: number
757
+ }
758
+ ```
759
+
760
+ Source: [`packages/host/apiproxy/src/index.ts:41`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/host/apiproxy/src/index.ts)
761
+
762
+ <a id="deepseek-aidsh-host-directory-picker-browse"></a>
763
+
764
+ ## `@deepseek-ai/dsh-host-directory-picker-browse`
765
+
766
+ ```ts config-catalog
767
+ /** Validated plugin configuration. */
768
+ export interface Config {
769
+ /** Complete-result bound of one listing level; see {@link BrowseDirectoryPicker.Config}. */
770
+ maxEntries: number
771
+ }
772
+ ```
773
+
774
+ Source: [`packages/host/directory-picker-browse/src/index.ts:181`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/host/directory-picker-browse/src/index.ts)
775
+
776
+ <a id="deepseek-aidsh-host-frontend-static"></a>
777
+
778
+ ## `@deepseek-ai/dsh-host-frontend-static`
779
+
780
+ Requires: `webServer`
781
+
782
+ ```ts config-catalog
783
+ /** Plugin config: the dist anchor. */
784
+ export interface Config {
785
+ /** Absolute path of index.html inside the dist root. */
786
+ distIndex: string
787
+ }
788
+ ```
789
+
790
+ Source: [`packages/host/frontend-static/src/index.ts:28`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/host/frontend-static/src/index.ts)
791
+
792
+ <a id="deepseek-aidsh-host-webserver"></a>
793
+
794
+ ## `@deepseek-ai/dsh-host-webserver`
795
+
796
+ ```ts config-catalog
797
+ /** Gateway config: the listen address. */
798
+ export interface Config {
799
+ /** Listen host; the two supported values are loopback and all-interfaces. */
800
+ host: '127.0.0.1' | '0.0.0.0'
801
+ /** Listen port; zero requests an OS-assigned port. */
802
+ port: number
803
+ }
804
+ ```
805
+
806
+ Source: [`packages/host/webserver/src/index.ts:45`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/host/webserver/src/index.ts)
807
+
808
+ <a id="deepseek-aidsh-invariants"></a>
809
+
810
+ ## `@deepseek-ai/dsh-invariants`
811
+
812
+ ```ts config-catalog
813
+ /** Runtime invariant selection configured on the service plugin. */
814
+ export interface Config {
815
+ /** Global switch; defaults to `true`. */
816
+ readonly enabled?: boolean
817
+ /** Case-sensitive JavaScript regex sources that admit package names; empty admits all. */
818
+ readonly package_allowlist?: string[]
819
+ /** Case-sensitive JavaScript regex sources that exclude package names after allowlist matching. */
820
+ readonly package_blocklist?: string[]
821
+ }
822
+ ```
823
+
824
+ Source: [`packages/runtime-diagnostics/invariants/src/index.ts:15`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/runtime-diagnostics/invariants/src/index.ts)
825
+
826
+ <a id="deepseek-aidsh-jobs-local"></a>
827
+
828
+ ## `@deepseek-ai/dsh-jobs-local`
829
+
830
+ ```ts config-catalog
831
+ /** Configuration for the process-local job registry. */
832
+ export interface Config {
833
+ /**
834
+ * Maximum `running` plus `stopping` jobs per exact owner or in the shared unowned bucket;
835
+ * omission defaults to 10.
836
+ */
837
+ maxConcurrentJobsPerOwner?: number
838
+ }
839
+ ```
840
+
841
+ Source: [`packages/jobs/jobs-local/src/index.ts:31`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/jobs/jobs-local/src/index.ts)
842
+
843
+ <a id="deepseek-aidsh-llm-deepseek"></a>
844
+
845
+ ## `@deepseek-ai/dsh-llm-deepseek`
846
+
847
+ Requires: `llm`
848
+
849
+ ```ts config-catalog
850
+ /**
851
+ * Plugin config, validated by the same-named schemastery schema and doubling
852
+ * as the `llm-deepseek` settings-section shape. Every field is optional in
853
+ * yml: a missing API key resolves through {@link Config.apiKeyEnv} at each
854
+ * request (a request without any key fails with `MISSING_CREDENTIAL`, not at
855
+ * plugin load), omitted thinking mode uses the provider default, and omitted
856
+ * reasoning effort resolves to `high`.
857
+ */
858
+ export interface Config {
859
+ /** Credential reference (environment-variable name) resolved per request; defaults to `DEEPSEEK_API_KEY`. */
860
+ apiKeyEnv?: string
861
+ /** Endpoint base; falls back to $DEEPSEEK_BASE_URL from a trusted environment layer, then the public API. */
862
+ baseURL?: string
863
+ /** Deployment thinking policy; `disabled` limits every conversation request to `off`. */
864
+ thinking?: 'enabled' | 'disabled'
865
+ /** Default thinking effort (default `high`); `off` disables thinking per request. */
866
+ reasoningEffort?: 'off' | 'low' | 'high' | 'max'
867
+ /** Default per-request output cap (default 256,000); a model's own cap and explicit request values win. */
868
+ maxTokens?: number
869
+ /** Positive context capacity used when the selected model has no exact value (default 1,000,000). */
870
+ defaultContextWindow?: number
871
+ /** Advisory models shown by discovery consumers; defaults to V4 Flash and V4 Pro. */
872
+ models?: DeepSeekCatalogModel[]
873
+ /** Maximum provider idle time while one stream read is outstanding (default five minutes). */
874
+ streamIdleTimeoutMs?: number
875
+ /** Provider-owned model-request retry policy; omission uses normal defaults. */
876
+ retryPolicy?: RetryPolicyConfig
877
+ }
878
+
879
+ /** One optional model entry advertised by the direct-fetch adapter. */
880
+ export interface DeepSeekCatalogModel {
881
+ /** Wire model id accepted by the configured endpoint. */
882
+ id: string
883
+ /** Selector label; defaults to {@link id}. */
884
+ name?: string
885
+ /** Optional selector detail for deployments with similar model variants. */
886
+ description?: string
887
+ /** Known combined request/response context capacity; omitted when deployment metadata is unavailable. */
888
+ contextWindow?: number
889
+ /** Per-request output cap for this model; omission falls back to the profile's {@link DeepSeekConnectionOptions.maxTokens}. */
890
+ maxTokens?: number
891
+ }
892
+ ```
893
+
894
+ Depends on: [`RetryPolicyConfig`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm/src/index.ts)
895
+
896
+ Source: [`packages/llm/llm-deepseek/src/index.ts:62`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-deepseek/src/index.ts)
897
+
898
+ <a id="deepseek-aidsh-llm-pi-ai"></a>
899
+
900
+ ## `@deepseek-ai/dsh-llm-pi-ai`
901
+
902
+ Requires: `llm`
903
+
904
+ ```ts config-catalog
905
+ /** Plugin configuration: the provider routes this instance owns. */
906
+ export interface Config {
907
+ /**
908
+ * pi-ai provider routes, keyed by provider. An empty (or omitted) dict is
909
+ * the dormant settings-driven posture: the adapter mounts with no routes
910
+ * and registers them the moment a settings section supplies profiles.
911
+ */
912
+ providers?: Record<string, PiAiProviderProfile>
913
+ }
914
+
915
+ /** Configuration for one pi-ai provider route; the `providers` dict key IS the route. */
916
+ export interface PiAiProviderProfile {
917
+ /** Credential reference (environment-variable name) resolved per request through `ctx.credentials`. */
918
+ apiKeyEnv?: string
919
+ /** Name shown by configuration surfaces; defaults to the route key. */
920
+ displayName?: string
921
+ /**
922
+ * Wire protocol every model on this route speaks. Omission keeps each
923
+ * installed catalog model's own protocol, which is why a catalog route needs
924
+ * no protocol at all; a route the catalog does not ship must name one.
925
+ */
926
+ api?: string
927
+ /** Endpoint for this route's models; defaults to the installed catalog's endpoint. */
928
+ baseURL?: string
929
+ /**
930
+ * This route's model catalog. Omission serves the installed catalog for the
931
+ * route unchanged; an explicit list replaces it, each entry defaulting its
932
+ * unset fields from the installed model of the same id.
933
+ */
934
+ models?: PiAiModelProfile[]
935
+ /**
936
+ * Installed-catalog customizations by model id: each entry reshapes that
937
+ * one model with the same fields a {@link models} entry takes, while the
938
+ * rest of the catalog keeps serving untouched. Only meaningful on a catalog
939
+ * route with no `models` list — `models` already replaces the catalog, so
940
+ * an override beside it, on a route the catalog does not ship, or naming a
941
+ * model the catalog does not describe is refused rather than skipped.
942
+ */
943
+ modelOverrides?: Record<string, PiAiModelOverride>
944
+ /**
945
+ * Reasoning-dispatch switches for every `openai-completions` model on this
946
+ * route; each model's own `compat` overrides per field. What neither sets
947
+ * keeps the installed catalog entry's value, then pi-ai's baseURL-derived
948
+ * detection.
949
+ */
950
+ compat?: PiAiCompatProfile
951
+ /**
952
+ * Context capacity for a model this route lists that neither the entry nor
953
+ * the installed catalog sizes (default 262,144). A guess by construction, so
954
+ * a deployment whose gateway serves smaller models corrects it here.
955
+ */
956
+ defaultContextWindow?: number
957
+ /**
958
+ * Output capability for a model this route lists that neither the entry nor
959
+ * the installed catalog sizes (default 32,768). This sizes the model; it
960
+ * never becomes a per-request cap on its own.
961
+ */
962
+ defaultMaxTokens?: number
963
+ /**
964
+ * Request modalities for a model this route lists that neither its entry's
965
+ * {@link PiAiModelProfile.input} nor the installed catalog declares (default
966
+ * `[text]`). A fallback like the capacities above, not an override: a
967
+ * catalog model keeps the modalities the catalog records for it, and this
968
+ * value never narrows one. A gateway serving vision models the catalog does
969
+ * not describe declares `[text, image]` once here instead of on every entry.
970
+ * Unlike an entry's list, this one may not be empty — nothing sits below it
971
+ * to answer instead.
972
+ */
973
+ defaultInput?: PiAiModality[]
974
+ /** Provider request headers; Harness attribution wins reserved names. */
975
+ headers?: Record<string, string>
976
+ /** Provider-neutral pi-ai reasoning level. */
977
+ reasoning?: ModelThinkingLevel
978
+ /** Token budgets used by reasoning providers that support them. */
979
+ thinkingBudgets?: ThinkingBudgets
980
+ /** Prompt-cache retention preference. */
981
+ cacheRetention?: CacheRetention
982
+ /** Streaming transport preference. */
983
+ transport?: Transport
984
+ /** HTTP/provider SDK timeout in milliseconds. */
985
+ timeoutMs?: number
986
+ /** WebSocket connection timeout in milliseconds. */
987
+ websocketConnectTimeoutMs?: number
988
+ /** Maximum provider idle time while one stream read is outstanding. */
989
+ streamIdleTimeoutMs?: number
990
+ /** Provider-owned model-request retry policy; omission uses normal defaults. */
991
+ retryPolicy?: RetryPolicyConfig
992
+ }
993
+
994
+ /** One configured model entry: an id plus the catalog fields it overrides. */
995
+ export interface PiAiModelProfile {
996
+ /** Model id sent to the provider and accepted by {@link GenerateOptions.model}. */
997
+ id: string
998
+ /** Display name for selectors; defaults to the catalog name, then the id. */
999
+ name?: string
1000
+ /** Maximum combined request and response context in tokens. */
1001
+ contextWindow?: number
1002
+ /**
1003
+ * Maximum output tokens. Configuring one also makes it this model's
1004
+ * per-request default; a value inherited from the installed catalog, or the
1005
+ * route's fallback, is the model's capability and never becomes a request
1006
+ * default on its own.
1007
+ */
1008
+ maxTokens?: number
1009
+ /**
1010
+ * Request modalities this model accepts. Absent — or empty, which describes
1011
+ * a model that accepts nothing and so states no answer either — keeps the
1012
+ * installed catalog entry's modalities, then the route's `defaultInput`.
1013
+ * Declaring images is what makes a hand-declared vision model usable, and
1014
+ * declaring text alone corrects a catalog model whose gateway does not serve
1015
+ * what the catalog records. This is a claim about the endpoint, not a check
1016
+ * of it: nothing interrogates a gateway for what it accepts, so a model
1017
+ * claiming images its endpoint refuses is refused by the provider instead,
1018
+ * mid-turn.
1019
+ */
1020
+ input?: PiAiModality[]
1021
+ /**
1022
+ * Selectable reasoning efforts. Absent inherits the installed catalog
1023
+ * entry's capability (a hand-declared model has none and does not reason);
1024
+ * `false` declares a non-reasoning model, which is how a profile strips
1025
+ * reasoning from a catalog model its gateway cannot serve; a non-empty dict
1026
+ * declares the offered levels and their wire spellings.
1027
+ */
1028
+ reasoningEfforts?: false | PiAiReasoningEfforts
1029
+ /** Reasoning-dispatch switches for this model, winning over the route's. */
1030
+ compat?: PiAiCompatProfile
1031
+ }
1032
+
1033
+ /**
1034
+ * Customization of one installed catalog model, keyed by its id in the
1035
+ * route's `modelOverrides` dict — the same fields a `models` entry may set,
1036
+ * with the id living in the key. Unlike a `models` list, overrides leave the
1037
+ * rest of the catalog serving untouched, which is what makes "correct one
1038
+ * model, keep the other thirty-seven" a three-line edit.
1039
+ */
1040
+ export type PiAiModelOverride = Omit<PiAiModelProfile, 'id'>
1041
+
1042
+ /**
1043
+ * Reasoning-dispatch compatibility switches, set on the route (its models'
1044
+ * default) or per model (winning over the route). Only the switches pi-ai's
1045
+ * reasoning dispatch reads are offered; the rest of pi-ai's compat surface
1046
+ * keeps its baseURL-derived auto-detection. pi-ai types both fields only on
1047
+ * `OpenAICompletionsCompat` — the other wire protocols define their reasoning
1048
+ * fields in the protocol itself — so resolution rejects a model-level switch
1049
+ * anywhere else, while a route-level default skips past models it cannot fit.
1050
+ */
1051
+ export interface PiAiCompatProfile {
1052
+ /** Reasoning parameter format the endpoint expects; absent keeps the catalog entry's, then pi-ai's baseURL-derived guess. */
1053
+ thinkingFormat?: PiAiThinkingFormat
1054
+ /** Whether the endpoint accepts `reasoning_effort`; absent keeps the catalog entry's, then pi-ai's baseURL-derived guess. */
1055
+ supportsReasoningEffort?: boolean
1056
+ }
1057
+
1058
+ /** One request modality a pi-ai model may accept. */
1059
+ export type PiAiModality = Model<Api>['input'][number]
1060
+
1061
+ /**
1062
+ * Selectable reasoning efforts for one model: each key is a level the model
1063
+ * offers (and selectors show), and its value is the wire spelling dispatch
1064
+ * sends for it. `off` alone may leave its value empty — "supported, send
1065
+ * nothing" — because for most providers not thinking is the parameter's
1066
+ * absence; every other declared level must name a wire value. A level absent
1067
+ * from the dict is not offered.
1068
+ */
1069
+ export type PiAiReasoningEfforts = Partial<Record<ModelThinkingLevel, string | null>>
1070
+
1071
+ /** One reasoning-dispatch wire format a profile may name. */
1072
+ export type PiAiThinkingFormat = Exclude<PiThinkingFormat, WithheldThinkingFormat>
1073
+
1074
+ /** The `compat.thinkingFormat` spellings pi-ai accepts on an `openai-completions` model. */
1075
+ type PiThinkingFormat = NonNullable<OpenAICompletionsCompat['thinkingFormat']>
1076
+
1077
+ /**
1078
+ * pi-ai thinking formats a profile cannot name: both drive the request through
1079
+ * `chatTemplateKwargs`, which this configuration does not expose.
1080
+ */
1081
+ type WithheldThinkingFormat = 'chat-template' | 'qwen-chat-template'
1082
+ ```
1083
+
1084
+ Depends on: `Api` (`@earendil-works/pi-ai`) · `CacheRetention` (`@earendil-works/pi-ai`) · `Model` (`@earendil-works/pi-ai`) · `ModelThinkingLevel` (`@earendil-works/pi-ai`) · `OpenAICompletionsCompat` (`@earendil-works/pi-ai`) · [`RetryPolicyConfig`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm/src/index.ts) · `ThinkingBudgets` (`@earendil-works/pi-ai`) · `Transport` (`@earendil-works/pi-ai`)
1085
+
1086
+ Source: [`packages/llm/llm-pi-ai/src/config.ts:172`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-pi-ai/src/config.ts)
1087
+
1088
+ <a id="deepseek-aidsh-llm-replay"></a>
1089
+
1090
+ ## `@deepseek-ai/dsh-llm-replay`
1091
+
1092
+ Requires: `llm`
1093
+
1094
+ ```ts config-catalog
1095
+ /** Plugin config: the {@link ReplayConfig} inputs, each defaulting to its `DSH_SNAPSHOT_*` env var in `apply`. */
1096
+ export interface Config {
1097
+ /** Override the fixture path; defaults to `$DSH_SNAPSHOT_FILE`. */
1098
+ file?: string
1099
+ /** Override the sidecar path; defaults to `$DSH_SNAPSHOT_OVERRIDE`. */
1100
+ overrideFile?: string
1101
+ /**
1102
+ * Override the child-log paths; defaults to `$DSH_SNAPSHOT_CHILD_FILES` (a
1103
+ * path-separator-delimited list). Each is a recorded subagent session log for
1104
+ * a nested-agent scenario; absent/empty for a single-session scenario.
1105
+ */
1106
+ childFiles?: string[]
1107
+ /** Optional replay-only provider catalog; absent or empty selects catch-all waterfall replay. */
1108
+ providers?: ReplayProviderConfig[]
1109
+ /** Optional per-chunk pacing delay in ms (see {@link ReplayConfig.paceMs}); absent keeps burst yield. */
1110
+ paceMs?: number
1111
+ }
1112
+
1113
+ /** One provider route exposed by the replay adapter. */
1114
+ export interface ReplayProviderConfig {
1115
+ /** Provider route used for replay requests. */
1116
+ id: string
1117
+ /** Selector label; defaults to {@link id}. */
1118
+ name?: string
1119
+ /** Advisory models exposed to replay scenarios that exercise discovery. */
1120
+ models?: ReplayModelConfig[]
1121
+ /** Optional provider-owned retry policy used by assembled recovery snapshots. */
1122
+ retryPolicy?: RetryPolicyConfig
1123
+ }
1124
+
1125
+ /** One model exposed by a replay-only provider catalog. */
1126
+ export interface ReplayModelConfig {
1127
+ /** Model id used for replay requests. */
1128
+ id: string
1129
+ /** Selector label; defaults to {@link id}. */
1130
+ name?: string
1131
+ /** Optional selector description. */
1132
+ description?: string
1133
+ /** Optional positive integer context capacity published by the replay adapter. */
1134
+ contextWindow?: number
1135
+ /** Optional declared input modalities, so a scenario can exercise capability gates (e.g. image-capable `read_image`). */
1136
+ inputModalities?: readonly ModelModality[]
1137
+ /**
1138
+ * Optional per-request output cap the replay route materializes when callers
1139
+ * omit one, so replay reconstructs the request header a live catalog produced.
1140
+ */
1141
+ defaultMaxTokens?: number
1142
+ /** Optional reasoning-effort ids the replay route accepts, in display order. */
1143
+ reasoningEfforts?: string[]
1144
+ /**
1145
+ * Optional effort materialized when callers omit one; must appear in
1146
+ * {@link reasoningEfforts} or call resolution rejects the route.
1147
+ */
1148
+ defaultReasoningEffort?: string
1149
+ }
1150
+ ```
1151
+
1152
+ Depends on: [`ModelModality`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm/src/index.ts) · [`RetryPolicyConfig`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm/src/index.ts)
1153
+
1154
+ Source: [`packages/test-support/llm-replay/src/index.ts:776`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/test-support/llm-replay/src/index.ts)
1155
+
1156
+ <a id="deepseek-aidsh-llm-retry"></a>
1157
+
1158
+ ## `@deepseek-ai/dsh-llm-retry`
1159
+
1160
+ Requires: `agents`
1161
+
1162
+ ```ts config-catalog
1163
+ /** This policy executor has no config; providers own `retryPolicy`. */
1164
+ export type Config = Readonly<Record<string, never>>
1165
+ ```
1166
+
1167
+ Source: [`packages/llm/llm-retry/src/index.ts:24`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-retry/src/index.ts)
1168
+
1169
+ <a id="deepseek-aidsh-lsp-stdio"></a>
1170
+
1171
+ ## `@deepseek-ai/dsh-lsp-stdio`
1172
+
1173
+ Requires: `fs` · `lsp` · `subprocess`
1174
+
1175
+ ```ts config-catalog
1176
+ /** Plugin configuration: provider id → local language-server configuration. */
1177
+ export interface Config {
1178
+ /** Non-empty table of stable provider ids to independent local server configurations. */
1179
+ servers: Record<string, LspLocalServerConfig>
1180
+ }
1181
+
1182
+ /** One configured local language server and its host bounds. */
1183
+ export interface LspLocalServerConfig {
1184
+ /** Executable to spawn (absolute, or resolved on PATH at load). */
1185
+ command: string
1186
+ /** Lowercase leading-dot extension → LSP language id (e.g. `{ '.ts': 'typescript' }`). */
1187
+ extensionToLanguage: Record<string, string>
1188
+ /** Arguments passed to the executable (no shell). Default `[]`. */
1189
+ args?: string[]
1190
+ /** Extra env vars merged on top of the scrubbed ambient env. Default `{}`. */
1191
+ env?: Record<string, string>
1192
+ /** Static `initialize` options forwarded to the server. Default `null`. */
1193
+ initializationOptions?: unknown
1194
+ /** Static answer to every `workspace/configuration` item. Default `null`. */
1195
+ configuration?: unknown
1196
+ /** Largest single framed message accepted from the server (bytes). Default 16000000. */
1197
+ maxMessageBytes?: number
1198
+ /** Largest stderr tail retained for diagnostics (bytes). Default 1000000. */
1199
+ maxStderrBytes?: number
1200
+ /** Largest source file this host will open (bytes). Default 4000000. */
1201
+ maxDocumentBytes?: number
1202
+ /** Graceful `shutdown`/`exit` budget before escalation (ms). Default 5000. */
1203
+ shutdownTimeoutMs?: number
1204
+ /** Request-cancel and SIGTERM→SIGKILL grace (ms). Default 2000. */
1205
+ killGraceMs?: number
1206
+ }
1207
+ ```
1208
+
1209
+ Source: [`packages/lsp/lsp-stdio/src/index.ts:82`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/lsp/lsp-stdio/src/index.ts)
1210
+
1211
+ <a id="deepseek-aidsh-mcp-client"></a>
1212
+
1213
+ ## `@deepseek-ai/dsh-mcp-client`
1214
+
1215
+ Requires: `tools`
1216
+
1217
+ ```ts config-catalog
1218
+ /** Configuration for one stdio or Streamable HTTP MCP server. */
1219
+ export type Config = StdioConfig | StreamableHttpConfig
1220
+
1221
+ /** Config for connecting to an MCP server via a spawned child process over stdio. */
1222
+ export interface StdioConfig {
1223
+ /** Selects child-process stdio transport. */
1224
+ transport: 'stdio'
1225
+ /**
1226
+ * Stable local namespace for this server's model-facing tool names
1227
+ * (`mcp__<serverName>__<rawName>`). Must match `[A-Za-z0-9_-]{1,32}` and be
1228
+ * unique across live mcp-client instances.
1229
+ */
1230
+ serverName: string
1231
+ /** Executable used to start the server. */
1232
+ command: string
1233
+ /** Arguments passed directly, without shell interpolation. */
1234
+ args: string[]
1235
+ /** Extra env vars merged on top of scrubbed ambient env. */
1236
+ env: Record<string, string>
1237
+ /** Working directory for the child process. */
1238
+ cwd: string
1239
+ /** Per-tool-call timeout in milliseconds. */
1240
+ toolCallTimeoutMs: number
1241
+ /** Fail plugin activation when the initial connection or tool synchronization fails. */
1242
+ failOnStartupError: boolean
1243
+ /** Automatic reconnect policy after a lost connection; omission uses the defaults. */
1244
+ reconnect?: ReconnectConfig
1245
+ }
1246
+
1247
+ /** Config for connecting to an MCP server over Streamable HTTP (SSE). */
1248
+ export interface StreamableHttpConfig {
1249
+ /** Selects Streamable HTTP transport. */
1250
+ transport: 'streamable-http'
1251
+ /**
1252
+ * Stable local namespace for this server's model-facing tool names
1253
+ * (`mcp__<serverName>__<rawName>`). Must match `[A-Za-z0-9_-]{1,32}` and be
1254
+ * unique across live mcp-client instances.
1255
+ */
1256
+ serverName: string
1257
+ /** MCP endpoint URL. */
1258
+ url: string
1259
+ /** Additional headers attached to MCP requests. */
1260
+ headers: Record<string, string>
1261
+ /** Per-tool-call timeout in milliseconds. */
1262
+ toolCallTimeoutMs: number
1263
+ /** Fail plugin activation when the initial connection or tool synchronization fails. */
1264
+ failOnStartupError: boolean
1265
+ /** Automatic reconnect policy after a lost connection; omission uses the defaults. */
1266
+ reconnect?: ReconnectConfig
1267
+ }
1268
+
1269
+ /** Automatic reconnect policy for one MCP server connection. */
1270
+ export interface ReconnectConfig {
1271
+ /** Reconnect automatically after a lost connection (default true). */
1272
+ enabled?: boolean
1273
+ /** First reconnect delay in milliseconds; doubles per consecutive failed attempt (default 500). */
1274
+ initialDelayMs?: number
1275
+ /** Backoff ceiling in milliseconds; also the uptime after which the attempt budget resets (default 30000). */
1276
+ maxDelayMs?: number
1277
+ /** Consecutive failed attempts per outage before giving up for good (default 10). */
1278
+ maxAttempts?: number
1279
+ }
1280
+ ```
1281
+
1282
+ Source: [`packages/mcp/mcp-client/src/index.ts:98`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/mcp/mcp-client/src/index.ts)
1283
+
1284
+ <a id="deepseek-aidsh-message-feedback"></a>
1285
+
1286
+ ## `@deepseek-ai/dsh-message-feedback`
1287
+
1288
+ Requires: `storageDomain` · `sessionPersistence` · `sessions`
1289
+
1290
+ ```ts config-catalog
1291
+ /** Required deployment policy for optional notes. */
1292
+ export interface Config {
1293
+ /** Maximum UTF-8 byte length accepted for one note. */
1294
+ readonly maxNoteBytes: number
1295
+ }
1296
+ ```
1297
+
1298
+ Source: [`packages/feedback/message-feedback/src/index.ts:49`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/feedback/message-feedback/src/index.ts)
1299
+
1300
+ <a id="deepseek-aidsh-permission-presets"></a>
1301
+
1302
+ ## `@deepseek-ai/dsh-permission-presets`
1303
+
1304
+ Requires: `shell` · `approval` · `sessions`
1305
+
1306
+ ```ts config-catalog
1307
+ /** The {@link PermissionPresetService} config: preset table and composition default. */
1308
+ export interface Config {
1309
+ /**
1310
+ * The preset table: name → knob bundle. Defaults to `workspace-write`
1311
+ * (workspace-write + ask) and `danger-full-access` (danger-full-access +
1312
+ * never). The name `custom` is reserved for the derived not-a-preset state.
1313
+ */
1314
+ presets?: Record<string, PresetSpec>
1315
+ /**
1316
+ * Default for new sessions. When omitted, the preset matching the composed
1317
+ * sandbox and approval defaults is used.
1318
+ */
1319
+ defaultPreset?: string
1320
+ }
1321
+
1322
+ /** One preset's sandbox/approval bundle and optional client presentation. */
1323
+ export interface PresetSpec {
1324
+ /** The `sandbox/mode` value the preset writes through. */
1325
+ sandbox: SandboxMode
1326
+ /** The `approval/policy` value the preset writes through. */
1327
+ approval: ApprovalPolicy
1328
+ /** The display label a client shows for this preset; the raw table key when omitted. */
1329
+ name?: string
1330
+ /** One user-facing sentence on what the preset means; omitted when not configured. */
1331
+ description?: string
1332
+ }
1333
+ ```
1334
+
1335
+ Depends on: [`ApprovalPolicy`](./subsystems/approval.md) · [`SandboxMode`](./subsystems/sandbox.md)
1336
+
1337
+ Source: [`packages/interaction/permission-presets/src/index.ts:140`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/permission-presets/src/index.ts)
1338
+
1339
+ <a id="deepseek-aidsh-persona"></a>
1340
+
1341
+ ## `@deepseek-ai/dsh-persona`
1342
+
1343
+ Requires: `systemPrompt`
1344
+
1345
+ ```ts config-catalog
1346
+ /** Plugin config: the persona text this composition contributes. */
1347
+ export interface Config {
1348
+ /**
1349
+ * Persona prose rendered as the `deployment:persona` section. A template:
1350
+ * complete `{{…}}` groups interpolate strictly against registered prompt
1351
+ * variables. Empty text drops the section at render, matching the registry.
1352
+ */
1353
+ text: string
1354
+ /** Make this persona the complete system prompt, suppressing every other section. */
1355
+ complete?: boolean
1356
+ /** Suppress dynamic runtime-context snapshots for this persona's agent scope. */
1357
+ includeRuntimeContext?: boolean
1358
+ }
1359
+ ```
1360
+
1361
+ Source: [`packages/preset/persona/src/index.ts:34`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/preset/persona/src/index.ts)
1362
+
1363
+ <a id="deepseek-aidsh-plan-mode"></a>
1364
+
1365
+ ## `@deepseek-ai/dsh-plan-mode`
1366
+
1367
+ Requires: `tools` · `systemPrompt`
1368
+
1369
+ ```ts config-catalog
1370
+ /** Deployment-owned plan guidance. */
1371
+ export interface PlanModeConfig {
1372
+ /** Guidance rendered as the `plan:policy` prompt section while plan mode is active. */
1373
+ section: string
1374
+ }
1375
+ ```
1376
+
1377
+ Source: [`packages/plan/plan-mode/src/index.ts:70`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/plan/plan-mode/src/index.ts)
1378
+
1379
+ <a id="deepseek-aidsh-pwsh-local"></a>
1380
+
1381
+ ## `@deepseek-ai/dsh-pwsh-local`
1382
+
1383
+ Requires: `subprocess`
1384
+
1385
+ ```ts config-catalog
1386
+ /** Plugin config (all optional — `static Config` supplies the defaults). */
1387
+ export interface Config {
1388
+ /** Default working directory for commands (default: process.cwd()). */
1389
+ cwd?: string
1390
+ /** Default foreground timeout in milliseconds. */
1391
+ timeoutMs?: number
1392
+ /** Upper bound for per-call timeout overrides. */
1393
+ maxTimeoutMs?: number
1394
+ /** Per-stream in-memory output cap; overflow spills to a temp file. */
1395
+ maxOutputBytes?: number
1396
+ /** Per-stream spill-file cap; larger streams retain only their in-memory tail. */
1397
+ maxSpillBytes?: number
1398
+ /** Grace period for kill escalation and inherited pipes; at most `MAX_TIMER_DELAY_MS`. */
1399
+ graceMs?: number
1400
+ /**
1401
+ * Explicit pwsh executable. When omitted, well-known Windows install
1402
+ * locations and PATH entries are probed in order (PowerShell 7 install,
1403
+ * PATH entries such as the Microsoft Store install, then Windows
1404
+ * PowerShell 5.1), falling back to a bare `pwsh` resolved through PATH.
1405
+ */
1406
+ pwshPath?: string
1407
+ }
1408
+ ```
1409
+
1410
+ Source: [`packages/shell/pwsh-local/src/index.ts:58`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/pwsh-local/src/index.ts)
1411
+
1412
+ <a id="deepseek-aidsh-pwsh-sandbox"></a>
1413
+
1414
+ ## `@deepseek-ai/dsh-pwsh-sandbox`
1415
+
1416
+ Requires: `subprocess` · `sandbox` · `sandboxPolicy`
1417
+
1418
+ ```ts config-catalog
1419
+ /**
1420
+ * Plugin config: the local executor's knobs, verbatim. The sandbox policy —
1421
+ * the default mode and fallback `workspace-write` root — is NOT here: it lives
1422
+ * on `ctx.sandboxPolicy` (`@deepseek-ai/dsh-sandbox-policy`), which resolves
1423
+ * each calling session's mode and cwd for every enforcing capability. The
1424
+ * runner choice is likewise the `ctx.sandbox` provider's config, not this
1425
+ * executor's.
1426
+ */
1427
+ export type Config = LocalConfig
1428
+ ```
1429
+
1430
+ Depends on: [`LocalConfig`](#deepseek-aidsh-pwsh-local)
1431
+
1432
+ Source: [`packages/shell/pwsh-sandbox/src/index.ts:40`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/pwsh-sandbox/src/index.ts)
1433
+
1434
+ <a id="deepseek-aidsh-repeat-tool-reminder"></a>
1435
+
1436
+ ## `@deepseek-ai/dsh-repeat-tool-reminder`
1437
+
1438
+ ```ts config-catalog
1439
+ /**
1440
+ * Plugin config, validated by the same-named schemastery schema plus the
1441
+ * load-time checks in `apply` (misconfiguration fails loud: an empty
1442
+ * `thresholds` list, a non-integer, a value below 2, or a duplicate throws at
1443
+ * plugin load, never a silent fall-back). `include`/`exclude` entries are
1444
+ * `*`-wildcard predicates over tool names at call time, not references to
1445
+ * registry entries — a pattern matching no currently registered tool is valid
1446
+ * (`exclude: [mcp_*]` must stay legal in a deployment that loads no MCP tools).
1447
+ */
1448
+ export interface Config {
1449
+ /** Consecutive-repeat counts that trigger a reminder (default `[3, 5, 8]`). */
1450
+ thresholds?: number[]
1451
+ /** Tool-name patterns to track; empty means every tool is tracked. */
1452
+ include?: string[]
1453
+ /** Tool-name patterns transparent to the chain (neither count nor reset). */
1454
+ exclude?: string[]
1455
+ /**
1456
+ * Maximum characters of canonical arguments quoted in the DETAILED reminder
1457
+ * (default 500). Large payloads (a `write` body, a long command) would
1458
+ * otherwise ride into the next request unbounded — precisely in a loop
1459
+ * scenario; the cap bounds the reminder, never the detection (the chain key
1460
+ * always compares the FULL canonical string).
1461
+ */
1462
+ argumentsPreviewChars?: number
1463
+ }
1464
+ ```
1465
+
1466
+ Source: [`packages/guard/repeat-tool-reminder/src/index.ts:28`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/guard/repeat-tool-reminder/src/index.ts)
1467
+
1468
+ <a id="deepseek-aidsh-sandbox-local"></a>
1469
+
1470
+ ## `@deepseek-ai/dsh-sandbox-local`
1471
+
1472
+ ```ts config-catalog
1473
+ /** Plugin config. All optional — `static Config` supplies the defaults. */
1474
+ export interface Config {
1475
+ /**
1476
+ * Override the runner argv; bwrap-compatible profile arguments are appended. A
1477
+ * non-empty override asserts full enforcement and skips built-in selection and
1478
+ * probing. A runner that starts but refuses its profile must be identifiable by
1479
+ * {@link runnerFailureSignatures}. Consumers classify a spawn rejection only after
1480
+ * confirming the workdir is usable. `ENOENT` or `EACCES` identifies the runner when
1481
+ * `error.path` equals argv[0] and `error.syscall` is `spawn` or `spawn <runner>`, or
1482
+ * when `error.path` is absent and `error.syscall` is exactly `spawn <runner>`.
1483
+ */
1484
+ runnerCommand?: string[]
1485
+ /**
1486
+ * Case-insensitive stderr substrings emitted when a configured
1487
+ * {@link runnerCommand} refuses its profile before executing the wrapped
1488
+ * command. Required and non-empty with `runnerCommand`; rejected without
1489
+ * it. Each entry is a non-empty, single-line, case-insensitive substring
1490
+ * covering the executable runner's own failure dialect.
1491
+ */
1492
+ runnerFailureSignatures?: string[]
1493
+ /** Positive timeout for each functional probe; zero would mean unbounded to Node. */
1494
+ probeTimeoutMs?: number
1495
+ }
1496
+ ```
1497
+
1498
+ Source: [`packages/sandbox/sandbox-local/src/index.ts:44`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/sandbox/sandbox-local/src/index.ts)
1499
+
1500
+ <a id="deepseek-aidsh-sandbox-policy"></a>
1501
+
1502
+ ## `@deepseek-ai/dsh-sandbox-policy`
1503
+
1504
+ ```ts config-catalog
1505
+ /**
1506
+ * Plugin config: the deployment's sandbox default. All optional — `Config`
1507
+ * supplies the defaults (`mode: 'read-only'` is the fail-safe default; a
1508
+ * deployment that wants a workspace-writable agent opts in explicitly). The
1509
+ * runner choice is NOT here (it is the `ctx.sandbox` provider's config), nor
1510
+ * is any per-family knob: this is the one shared policy home.
1511
+ */
1512
+ export interface Config {
1513
+ /** File-sandbox mode a session starts from (default: `read-only`). */
1514
+ mode?: SandboxMode
1515
+ /**
1516
+ * Fallback root for agentless calls and sessions without a cwd (default:
1517
+ * `process.cwd()`). Normal agent calls use their session cwd instead.
1518
+ */
1519
+ workspaceRoot?: string
1520
+ }
1521
+ ```
1522
+
1523
+ Depends on: [`SandboxMode`](./subsystems/sandbox.md)
1524
+
1525
+ Source: [`packages/sandbox/sandbox-policy/src/index.ts:67`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/sandbox/sandbox-policy/src/index.ts)
1526
+
1527
+ <a id="deepseek-aidsh-sdk-jsonrpc-server"></a>
1528
+
1529
+ ## `@deepseek-ai/dsh-sdk-jsonrpc-server`
1530
+
1531
+ Requires: `agents`
1532
+
1533
+ ```ts config-catalog
1534
+ /** JSON-RPC deployment config plus runtime-only test hooks. */
1535
+ export interface JsonRpcConfig {
1536
+ /** Report max-token turn/subagent termination as a successful SDK result. */
1537
+ maxTokensAsSuccess?: boolean
1538
+ /** Transport input override; production uses `process.stdin`. */
1539
+ input?: Readable
1540
+ /** Transport output override; production uses `process.stdout`. */
1541
+ output?: Writable
1542
+ /** Process-exit override; production uses `process.exit`. */
1543
+ exit?: (code: number) => void
1544
+ }
1545
+ ```
1546
+
1547
+ Depends on: `Readable` (`node:stream`) · `Writable` (`node:stream`)
1548
+
1549
+ Source: [`packages/sdk/server/src/index.ts:25`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/sdk/server/src/index.ts)
1550
+
1551
+ <a id="deepseek-aidsh-session-persistence-jsonl"></a>
1552
+
1553
+ ## `@deepseek-ai/dsh-session-persistence-jsonl`
1554
+
1555
+ Requires: `sessions`
1556
+
1557
+ ```ts config-catalog
1558
+ /** Plugin config: where the JSONL backend keeps its session logs, and the packed-row write switch. */
1559
+ export interface Config {
1560
+ /**
1561
+ * Root directory for all session files. Required (no default): a default of
1562
+ * `process.cwd()` would scatter session files as the process's cwd changes
1563
+ * (bash calls, subprocesses). Sessions group under human-readable project
1564
+ * directories, then per-session directories. An existing root must be a
1565
+ * readable directory; an absent root is created on first materialization.
1566
+ */
1567
+ root: string
1568
+ /**
1569
+ * Write runs of consecutive `assistant/chunk` delta events as packed
1570
+ * `text-chunks`/`reasoning-chunks`/`tool-call-chunks` rows (lossless,
1571
+ * ~60% smaller logs measured on a real session). Defaults to true; false
1572
+ * keeps one `SessionEvent` per line for diagnostics. Reading packed rows is
1573
+ * unconditional: a log's layout never depends on this switch.
1574
+ */
1575
+ packChunks?: boolean
1576
+ /** Physical encoding; defaults to checksummed Zstandard frames. */
1577
+ compression?: JsonlCompression
1578
+ /** Maximum cold Session preparations retained for history-to-resume reuse. */
1579
+ preparedSessionCacheSize?: number
1580
+ /** Fixed live-event coalescing window; not a backend completion deadline. */
1581
+ writeBatchMaxDelayMs?: number
1582
+ }
1583
+
1584
+ /** Physical encoding selected for JSONL session artifacts. */
1585
+ export type JsonlCompression = 'zstd' | 'none'
1586
+ ```
1587
+
1588
+ Source: [`packages/session/session-persistence-jsonl/src/index.ts:60`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-persistence-jsonl/src/index.ts)
1589
+
1590
+ <a id="deepseek-aidsh-session-persistence-sqlite"></a>
1591
+
1592
+ ## `@deepseek-ai/dsh-session-persistence-sqlite`
1593
+
1594
+ Requires: `sessions`
1595
+
1596
+ ```ts config-catalog
1597
+ /** Plugin configuration. */
1598
+ export interface Config {
1599
+ /**
1600
+ * Filesystem path to the SQLite database file. The special value `:memory:`
1601
+ * opens an in-process database (tests). On filesystems with POSIX modes,
1602
+ * missing directories and databases are created owner-only; existing path
1603
+ * modes are preserved. Filesystem setup errors other than an existing database
1604
+ * fail initialization. The backend does not protect confidentiality or
1605
+ * integrity when another principal can replace the database entry in its
1606
+ * parent directory.
1607
+ */
1608
+ path: string
1609
+ /**
1610
+ * SQLite `journal_mode` pragma. `wal` (the default) is the recorded
1611
+ * durability model; pick a rollback-journal mode (`delete`/`truncate`/
1612
+ * `persist`) on filesystems where WAL's shared-memory files do not work
1613
+ * (network mounts). See {@link JournalMode}.
1614
+ */
1615
+ journalMode?: JournalMode
1616
+ /** Maximum cold Session preparations retained for history-to-resume reuse. */
1617
+ preparedSessionCacheSize?: number
1618
+ /** Fixed live-event coalescing window; not a backend completion deadline. */
1619
+ writeBatchMaxDelayMs?: number
1620
+ }
1621
+
1622
+ /**
1623
+ * Journal modes the backend will run under. `wal` is the default and the
1624
+ * durability model the persistence ADR records; the rollback-journal modes
1625
+ * (`delete`/`truncate`/`persist`) exist for filesystems where WAL's
1626
+ * shared-memory files do not work (network mounts). `memory`/`off` are
1627
+ * excluded: dropping journal durability silently contradicts what this
1628
+ * backend promises.
1629
+ */
1630
+ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist'
1631
+ ```
1632
+
1633
+ Source: [`packages/session/session-persistence-sqlite/src/index.ts:70`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-persistence-sqlite/src/index.ts)
1634
+
1635
+ <a id="deepseek-aidsh-session-projection-cache"></a>
1636
+
1637
+ ## `@deepseek-ai/dsh-session-projection-cache`
1638
+
1639
+ Requires: `storageDomain` · `sessionProjections` · `sessionPersistence` · `sessions`
1640
+
1641
+ ```ts config-catalog
1642
+ /**
1643
+ * Plugin config. Both throttle triggers are deployment choices with no
1644
+ * universally correct value, so the composition states them explicitly
1645
+ * (cordis.yml); the two mandatory write points (`turn/end` and session
1646
+ * disposal) are policy, not tunables, and always fire.
1647
+ */
1648
+ export interface Config {
1649
+ /** Committed events per session that force a durable checkpoint write between mandatory points. */
1650
+ writeEveryEvents: number
1651
+ /** Longest time (milliseconds) a dirty checkpoint may stay unwritten between mandatory points. */
1652
+ writeIntervalMs: number
1653
+ }
1654
+ ```
1655
+
1656
+ Source: [`packages/session/session-projection-cache/src/index.ts:42`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-projection-cache/src/index.ts)
1657
+
1658
+ <a id="deepseek-aidsh-session-query-sqlite"></a>
1659
+
1660
+ ## `@deepseek-ai/dsh-session-query-sqlite`
1661
+
1662
+ Requires: `sessions`
1663
+
1664
+ ```ts config-catalog
1665
+ /** Combined session-query configuration backed by SQLite full-text search. */
1666
+ export interface Config extends SessionQueryConfig {
1667
+ /**
1668
+ * Dedicated derived-index path; `:memory:` is supported for ephemeral
1669
+ * indexes. Missing directories and database files are created owner-only on
1670
+ * POSIX filesystems; existing modes are preserved.
1671
+ */
1672
+ path: string
1673
+ /**
1674
+ * Open the SQLite module and handle at service activation or the first
1675
+ * search, or `never` to disable full-text search: the inherited exact
1676
+ * reads, filters, and traces stay available, while `searchSessions` and
1677
+ * `searchEvents` fail with `SESSION_QUERY_SEARCH_DISABLED` and SQLite is
1678
+ * never imported or opened. Defaults to `startup`.
1679
+ */
1680
+ openAt?: OpenAt
1681
+ /** SQLite journal mode. Defaults to `wal`. */
1682
+ journalMode?: JournalMode
1683
+ /** Page size when a request omits `limit`. At most `Number.MAX_SAFE_INTEGER - 1`; defaults to 20. */
1684
+ defaultLimit?: number
1685
+ /** Largest accepted page size. At most `Number.MAX_SAFE_INTEGER - 1`; defaults to 100. */
1686
+ maxLimit?: number
1687
+ /** Maximum snippet length in Unicode code points. Defaults to 240. */
1688
+ snippetChars?: number
1689
+ /** Maximum concurrent persisted-log inspections in one inherited batch read. Defaults to 4. */
1690
+ persistedInspectConcurrency?: number
1691
+ }
1692
+
1693
+ /** SQLite module/handle opening phase; `never` disables full-text search entirely. */
1694
+ export type OpenAt = 'startup' | 'first-search' | 'never'
1695
+
1696
+ /** Supported SQLite journal modes. */
1697
+ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist'
1698
+ ```
1699
+
1700
+ Depends on: [`SessionQueryConfig`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session-query/session-query/src/index.ts)
1701
+
1702
+ Source: [`packages/session-query/session-query-sqlite/src/index.ts:89`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session-query/session-query-sqlite/src/index.ts)
1703
+
1704
+ <a id="deepseek-aidsh-session-reference"></a>
1705
+
1706
+ ## `@deepseek-ai/dsh-session-reference`
1707
+
1708
+ Requires: `sessionQuery`
1709
+
1710
+ ```ts config-catalog
1711
+ /** Session-reference service configuration. */
1712
+ export interface Config {
1713
+ /** Maximum distinct source sessions referenced by one message, from one to three. */
1714
+ maxReferences?: number
1715
+ /** Default host candidate-list limit. */
1716
+ candidateLimit?: number
1717
+ /** Maximum rendered UTF-8 bytes for one source snapshot. */
1718
+ maxReferenceBytes?: number
1719
+ }
1720
+ ```
1721
+
1722
+ Source: [`packages/context/session-reference/src/config.ts:11`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/context/session-reference/src/config.ts)
1723
+
1724
+ <a id="deepseek-aidsh-session-telemetry-otel"></a>
1725
+
1726
+ ## `@deepseek-ai/dsh-session-telemetry-otel`
1727
+
1728
+ Requires: `sessions`
1729
+
1730
+ ```ts config-catalog
1731
+ /**
1732
+ * Plugin configuration: one sharing policy, two verbatim SDK option objects,
1733
+ * and one DSH-owned shutdown bound. Uploading modes validate their endpoint
1734
+ * and shutdown deadline at plugin load; `DISABLED` reads neither.
1735
+ */
1736
+ export interface Config {
1737
+ /** Sharing policy; defaults to local-only `DISABLED` behavior. */
1738
+ mode?: SessionTelemetryMode
1739
+ /**
1740
+ * Passed verbatim to the SDK's OTLP/HTTP log exporter — the complete
1741
+ * `OTLPExporterNodeConfigBase` shape (`headers`, `timeoutMillis`,
1742
+ * `compression`, `keepAlive`, …), owned and documented by the SDK. `url`
1743
+ * is the one field this package requires and validates itself.
1744
+ */
1745
+ exporter?: OTLPExporterNodeConfigBase & {
1746
+ /** Full logs endpoint (e.g. `https://collector.example.com/v1/logs`). Required outside `DISABLED`; validated at load. */
1747
+ url?: string
1748
+ }
1749
+ /**
1750
+ * Passed verbatim to `BatchLogRecordProcessor` (minus the exporter slot,
1751
+ * which this plugin fills); the SDK owns and documents these knobs.
1752
+ */
1753
+ processor?: Omit<BatchLogRecordProcessorOptions, 'exporter'>
1754
+ /** Maximum time spent awaiting the SDK provider's complete shutdown path. */
1755
+ shutdownTimeoutMillis?: number
1756
+ }
1757
+
1758
+ /** Session-sharing policy selected by {@link Config.mode}. */
1759
+ export enum SessionTelemetryMode {
1760
+ FULL = 'FULL',
1761
+ FEEDBACK_ONLY = 'FEEDBACK_ONLY',
1762
+ DISABLED = 'DISABLED',
1763
+ }
1764
+ ```
1765
+
1766
+ Depends on: `BatchLogRecordProcessorOptions` (`@opentelemetry/sdk-logs`) · `OTLPExporterNodeConfigBase` (`@opentelemetry/otlp-exporter-base`)
1767
+
1768
+ Source: [`packages/session/session-telemetry-otel/src/index.ts:91`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-telemetry-otel/src/index.ts)
1769
+
1770
+ <a id="deepseek-aidsh-session-title"></a>
1771
+
1772
+ ## `@deepseek-ai/dsh-session-title`
1773
+
1774
+ Requires: `sessions`
1775
+
1776
+ ```ts config-catalog
1777
+ /** Required deterministic fallback and accepted-title limits. */
1778
+ export interface Config {
1779
+ /** Maximum whitespace-delimited words in the built-in fallback. */
1780
+ readonly fallbackMaxWords: number
1781
+ /** Maximum UTF-8 bytes in the built-in fallback. */
1782
+ readonly fallbackMaxBytes: number
1783
+ /** Maximum UTF-8 bytes in any accepted title. */
1784
+ readonly maxTitleBytes: number
1785
+ }
1786
+ ```
1787
+
1788
+ Source: [`packages/session/session-title/src/index.ts:79`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-title/src/index.ts)
1789
+
1790
+ <a id="deepseek-aidsh-session-title-all-prompts-llm"></a>
1791
+
1792
+ ## `@deepseek-ai/dsh-session-title-all-prompts-llm`
1793
+
1794
+ Requires: `sessionTitle` · `llm` · `sessions`
1795
+
1796
+ ```ts config-catalog
1797
+ /** Required LLM policy; this plugin adds no defaults. */
1798
+ export type Config = SessionTitleLlmConfig
1799
+ ```
1800
+
1801
+ Depends on: [`SessionTitleLlmConfig`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-title-llm/src/index.ts)
1802
+
1803
+ Source: [`packages/session/session-title-all-prompts-llm/src/index.ts:15`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-title-all-prompts-llm/src/index.ts)
1804
+
1805
+ <a id="deepseek-aidsh-session-title-first-prompt-llm"></a>
1806
+
1807
+ ## `@deepseek-ai/dsh-session-title-first-prompt-llm`
1808
+
1809
+ Requires: `sessionTitle` · `llm` · `sessions`
1810
+
1811
+ ```ts config-catalog
1812
+ /** Required LLM policy; this plugin adds no defaults. */
1813
+ export type Config = SessionTitleLlmConfig
1814
+ ```
1815
+
1816
+ Depends on: [`SessionTitleLlmConfig`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-title-llm/src/index.ts)
1817
+
1818
+ Source: [`packages/session/session-title-first-prompt-llm/src/index.ts:15`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-title-first-prompt-llm/src/index.ts)
1819
+
1820
+ <a id="deepseek-aidsh-settings-file"></a>
1821
+
1822
+ ## `@deepseek-ai/dsh-settings-file`
1823
+
1824
+ ```ts config-catalog
1825
+ /** Plugin config: file location and hot-reload behavior. */
1826
+ export interface Config {
1827
+ /** Settings document path; defaults to `settings.yaml` under the harness home. */
1828
+ path?: string
1829
+ /** Harness home used when `path` is omitted; defaults to `$DSH_HOME` or `~/.dsh`. */
1830
+ dshHome?: string
1831
+ /** Watch the document and hot-publish external edits; defaults to true. */
1832
+ watch?: boolean
1833
+ /** Watcher write-settle window in milliseconds; defaults to 100. */
1834
+ debounceMs?: number
1835
+ }
1836
+ ```
1837
+
1838
+ Source: [`packages/settings/settings-file/src/index.ts:21`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/settings/settings-file/src/index.ts)
1839
+
1840
+ <a id="deepseek-aidsh-shell-env"></a>
1841
+
1842
+ ## `@deepseek-ai/dsh-shell-env`
1843
+
1844
+ ```ts config-catalog
1845
+ /** Plugin config (all optional — the built-in facts resolve without defaults). */
1846
+ export interface Config {
1847
+ /** DeepSeek Harness home directory exposed as `DSH_HOME`; defaults to `$DSH_HOME` or `~/.dsh`. */
1848
+ dshHome?: string
1849
+ }
1850
+ ```
1851
+
1852
+ Source: [`packages/shell/shell-env/src/index.ts:29`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/shell-env/src/index.ts)
1853
+
1854
+ <a id="deepseek-aidsh-skill"></a>
1855
+
1856
+ ## `@deepseek-ai/dsh-skill`
1857
+
1858
+ ```ts config-catalog
1859
+ /** Skill registry configuration. */
1860
+ export interface Config {
1861
+ /** Maximum number of completed cwd/provider catalogs kept in memory. */
1862
+ readonly collectCacheMaxEntries?: number
1863
+ }
1864
+ ```
1865
+
1866
+ Source: [`packages/skill/skill/src/index.ts:279`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/skill/skill/src/index.ts)
1867
+
1868
+ <a id="deepseek-aidsh-skill-filesystem"></a>
1869
+
1870
+ ## `@deepseek-ai/dsh-skill-filesystem`
1871
+
1872
+ Requires: `skills`
1873
+
1874
+ ```ts config-catalog
1875
+ /** Local filesystem skill provider configuration. */
1876
+ export interface Config {
1877
+ /** Unique provider name. Defaults to `local`. */
1878
+ providerName?: string
1879
+ /** Whether project and user roots are included around custom roots. */
1880
+ includeDefaultRoots?: boolean
1881
+ /** DeepSeek Harness config root. Defaults to `$DSH_HOME` or `~/.dsh`. */
1882
+ dshHome?: string
1883
+ /** Shared agent config root. Defaults to `$DSH_AGENTS_HOME` or `~/.agents`. */
1884
+ agentsHome?: string
1885
+ /** Additional skill roots scanned after project roots and before user roots. */
1886
+ customSkillDirs?: string[]
1887
+ /** Whether host-local skill roots are watched for catalog changes. */
1888
+ watch?: boolean
1889
+ /** Whether Chokidar uses polling instead of native filesystem events. */
1890
+ watchUsePolling?: boolean
1891
+ /** Milliseconds a changed skill entry must remain stable before it is observed. */
1892
+ watchStabilityThresholdMs?: number
1893
+ /** Milliseconds between Chokidar stability or polling probes. */
1894
+ watchPollIntervalMs?: number
1895
+ /** Maximum distinct project roots whose skill directories remain watched. */
1896
+ watchMaxProjects?: number
1897
+ /** Whether watched symbolic links follow their target files. */
1898
+ watchFollowSymlinks?: boolean
1899
+ /** Bundled skill root; defaults to `$DSH_BUNDLED_SKILL_DIR` when default roots are included, otherwise mounts none. */
1900
+ bundledSkillDir?: string
1901
+ }
1902
+ ```
1903
+
1904
+ Source: [`packages/skill/skill-filesystem/src/index.ts:49`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/skill/skill-filesystem/src/index.ts)
1905
+
1906
+ <a id="deepseek-aidsh-spill-local"></a>
1907
+
1908
+ ## `@deepseek-ai/dsh-spill-local`
1909
+
1910
+ ```ts config-catalog
1911
+ /** Plugin config (all optional — `static Config` supplies the defaults). */
1912
+ export interface Config {
1913
+ /**
1914
+ * Root directory for spill files. Omitted uses a lazily-created private
1915
+ * (0700) per-process directory under the OS temp dir — the safe default for
1916
+ * a local deployment. Set it to keep spill files under a known location.
1917
+ */
1918
+ root?: string
1919
+ }
1920
+ ```
1921
+
1922
+ Source: [`packages/spill/spill-local/src/index.ts:22`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/spill/spill-local/src/index.ts)
1923
+
1924
+ <a id="deepseek-aidsh-spill-policy"></a>
1925
+
1926
+ ## `@deepseek-ai/dsh-spill-policy`
1927
+
1928
+ Requires: `tools`
1929
+
1930
+ ```ts config-catalog
1931
+ /** Plugin config. */
1932
+ export interface Config {
1933
+ /**
1934
+ * The model-facing context cap for a plain-text tool result, in UTF-8 bytes.
1935
+ * Omitted disables the policy entirely (no-op). When set, a result larger than
1936
+ * this is spilled and replaced with a preview derived from this same budget.
1937
+ */
1938
+ maxInlineBytes?: number
1939
+ }
1940
+ ```
1941
+
1942
+ Source: [`packages/spill/spill-policy/src/index.ts:60`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/spill/spill-policy/src/index.ts)
1943
+
1944
+ <a id="deepseek-aidsh-storage-domain"></a>
1945
+
1946
+ ## `@deepseek-ai/dsh-storage-domain`
1947
+
1948
+ Requires: `storage`
1949
+
1950
+ ```ts config-catalog
1951
+ /**
1952
+ * Plugin config. Which backend serves which domain is decided here, not
1953
+ * globally on the hub: `backend` is the default route and `routes` overrides
1954
+ * it per domain name. A route naming an unregistered backend fails loud at
1955
+ * `open` with `backend-not-found`.
1956
+ */
1957
+ export interface Config {
1958
+ /** Default backend name for every domain without an explicit route. Required: there is no universally correct medium. */
1959
+ backend: string
1960
+ /** Per-domain overrides: domain name → backend name. */
1961
+ routes?: Record<string, string>
1962
+ }
1963
+ ```
1964
+
1965
+ Source: [`packages/storage/storage-domain/src/index.ts:52`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/storage/storage-domain/src/index.ts)
1966
+
1967
+ <a id="deepseek-aidsh-storage-json"></a>
1968
+
1969
+ ## `@deepseek-ai/dsh-storage-json`
1970
+
1971
+ Requires: `storage`
1972
+
1973
+ ```ts config-catalog
1974
+ /**
1975
+ * Plugin configuration.
1976
+ * `root` has NO default on purpose: a `process.cwd()` fallback would scatter
1977
+ * unit files wherever the process happens to start; assemblies state the
1978
+ * location explicitly.
1979
+ */
1980
+ export interface Config {
1981
+ /** Directory holding one `<unit>.json` file per unit. */
1982
+ root: string
1983
+ }
1984
+ ```
1985
+
1986
+ Source: [`packages/storage/storage-json/src/index.ts:27`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/storage/storage-json/src/index.ts)
1987
+
1988
+ <a id="deepseek-aidsh-storage-sqlite"></a>
1989
+
1990
+ ## `@deepseek-ai/dsh-storage-sqlite`
1991
+
1992
+ Requires: `storage`
1993
+
1994
+ ```ts config-catalog
1995
+ /** Plugin configuration. */
1996
+ export interface Config {
1997
+ /**
1998
+ * Filesystem path to the SQLite database file. The special value `:memory:`
1999
+ * opens an in-process database (tests). On filesystems with POSIX modes,
2000
+ * missing directories and databases are created owner-only; existing path
2001
+ * modes are preserved. Filesystem setup errors other than an existing
2002
+ * database fail the open. The backend does not protect confidentiality or
2003
+ * integrity when another principal can replace the database entry in its
2004
+ * parent directory.
2005
+ */
2006
+ path: string
2007
+ /**
2008
+ * SQLite `journal_mode` pragma. `wal` (the default) suits local disks; pick
2009
+ * a rollback-journal mode (`delete`/`truncate`/`persist`) on filesystems
2010
+ * where WAL's shared-memory files do not work (network mounts). See
2011
+ * {@link JournalMode}.
2012
+ */
2013
+ journalMode?: JournalMode
2014
+ }
2015
+
2016
+ /**
2017
+ * Journal modes the backend will run under. `wal` is the default; the
2018
+ * rollback-journal modes (`delete`/`truncate`/`persist`) exist for
2019
+ * filesystems where WAL's shared-memory files do not work (network mounts).
2020
+ * `memory`/`off` are excluded: dropping journal durability silently
2021
+ * contradicts the durability clause of the KV backend contract.
2022
+ */
2023
+ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist'
2024
+ ```
2025
+
2026
+ Source: [`packages/storage/storage-sqlite/src/index.ts:24`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/storage/storage-sqlite/src/index.ts)
2027
+
2028
+ <a id="deepseek-aidsh-subagent-acp"></a>
2029
+
2030
+ ## `@deepseek-ai/dsh-subagent-acp`
2031
+
2032
+ Requires: `subagents` · `subprocess`
2033
+
2034
+ ```ts config-catalog
2035
+ /** Config: how to spawn and drive the child ACP agent process. */
2036
+ export interface Config {
2037
+ /** Provider name on `ctx.subagents` (default `acp`). */
2038
+ providerName: string
2039
+ /** The executable to spawn for each run (the child ACP agent). */
2040
+ command: string
2041
+ /** Arguments passed to {@link command}. */
2042
+ args: string[]
2043
+ /**
2044
+ * Working directory override for the child process and its ACP session.
2045
+ * Must be non-empty; a relative path resolves against the harness launch
2046
+ * directory at load, and the result must be an existing directory. When
2047
+ * omitted, each child inherits its delegating parent session's cwd — and
2048
+ * starting one from a parent session that has no cwd fails.
2049
+ */
2050
+ cwd?: string
2051
+ /**
2052
+ * How to auto-answer the child's `session/request_permission` prompts:
2053
+ * `reject` (default — decline every prompt) or `allow` (approve via the first
2054
+ * `allow_once` or `allow_always` option). No prompt is surfaced to a human.
2055
+ */
2056
+ permission: PermissionPolicy
2057
+ /**
2058
+ * Extra environment variables for the child process — e.g. the child
2059
+ * harness's own `DEEPSEEK_API_KEY`. Forwarded on top of a credential-scrubbed
2060
+ * copy of the parent env, so an explicit key here reaches the child while
2061
+ * ambient secrets do not leak implicitly.
2062
+ */
2063
+ env: Record<string, string>
2064
+ /**
2065
+ * Grace period (ms) for the child's EOF-driven quiesce on dispose — its
2066
+ * window to flush persistence and tear down its own nested subprocesses
2067
+ * before the parent escalates to a signal. Must not exceed
2068
+ * `MAX_TIMER_DELAY_MS`.
2069
+ */
2070
+ disposeEofGraceMs?: number
2071
+ /** Termination-escalation grace (ms); must not exceed `MAX_TIMER_DELAY_MS`. */
2072
+ disposeGraceMs?: number
2073
+ }
2074
+
2075
+ /** Fixed response to child permission requests: reject by default, or select the first allow option. */
2076
+ export type PermissionPolicy = 'allow' | 'reject'
2077
+ ```
2078
+
2079
+ Source: [`packages/subagent/subagent-acp/src/index.ts:27`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent-acp/src/index.ts)
2080
+
2081
+ <a id="deepseek-aidsh-subagent-claude-code"></a>
2082
+
2083
+ ## `@deepseek-ai/dsh-subagent-claude-code`
2084
+
2085
+ Requires: `subagents` · `subprocess`
2086
+
2087
+ ```ts config-catalog
2088
+ /** Deployment-owned environment and process-release bound. */
2089
+ export interface Config {
2090
+ /**
2091
+ * Explicit environment entries layered over the subprocess seam's
2092
+ * credential-scrubbed parent environment.
2093
+ */
2094
+ env?: Record<string, string>
2095
+ /** Grace in milliseconds for Claude Code process-tree termination. */
2096
+ disposeGraceMs?: number
2097
+ }
2098
+ ```
2099
+
2100
+ Source: [`packages/subagent/subagent-claude-code/src/index.ts:32`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent-claude-code/src/index.ts)
2101
+
2102
+ <a id="deepseek-aidsh-subagent-codex"></a>
2103
+
2104
+ ## `@deepseek-ai/dsh-subagent-codex`
2105
+
2106
+ Requires: `subagents` · `subprocess`
2107
+
2108
+ ```ts config-catalog
2109
+ /** Deployment-owned environment and process-release bound. */
2110
+ export interface Config {
2111
+ /**
2112
+ * Explicit environment entries layered over the subprocess seam's
2113
+ * credential-scrubbed parent environment.
2114
+ */
2115
+ env?: Record<string, string>
2116
+ /** Grace in milliseconds for app-server process-tree termination. */
2117
+ disposeGraceMs?: number
2118
+ }
2119
+ ```
2120
+
2121
+ Source: [`packages/subagent/subagent-codex/src/index.ts:30`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent-codex/src/index.ts)
2122
+
2123
+ <a id="deepseek-aidsh-subagent-dsh-sdk"></a>
2124
+
2125
+ ## `@deepseek-ai/dsh-subagent-dsh-sdk`
2126
+
2127
+ Requires: `subagents`
2128
+
2129
+ ```ts config-catalog
2130
+ /** Config: how to spawn and drive the child SDK runtime process. */
2131
+ export interface Config {
2132
+ /** Provider name on `ctx.subagents` (default `dsh-sdk`). */
2133
+ providerName: string
2134
+ /** The executable to spawn for each run (the child runtime bin or packaged exe). */
2135
+ command: string
2136
+ /** Arguments passed to {@link command} (typically the child's `cordis.yml` path). */
2137
+ args: string[]
2138
+ /**
2139
+ * Working directory override for the child process and its SDK session
2140
+ * workspace. Must be non-empty; a relative path resolves against the
2141
+ * harness launch directory at load, and the result must be an existing
2142
+ * directory. When omitted, each child inherits its delegating parent
2143
+ * session's cwd — and starting one from a parent session that has no cwd
2144
+ * fails.
2145
+ */
2146
+ cwd?: string
2147
+ /** Provider route the child runtime initializes with (default `deepseek-official`). */
2148
+ provider: string
2149
+ /** Model the child runtime initializes with (default `deepseek-v4-flash`). */
2150
+ model: string
2151
+ /** Optional per-request output-token cap for the child runtime. */
2152
+ maxTokens?: number
2153
+ /**
2154
+ * Extra environment variables for the child process — e.g. the child
2155
+ * runtime's own `DEEPSEEK_API_KEY`, or `DSH_CORDIS_CONFIG` naming its
2156
+ * config. Forwarded on top of a credential-scrubbed copy of the parent
2157
+ * env, so an explicit key here reaches the child while ambient secrets do
2158
+ * not leak implicitly.
2159
+ */
2160
+ env: Record<string, string>
2161
+ /** Bound (ms) on the protocol `shutdown` exchange during dispose. */
2162
+ shutdownTimeoutMs?: number
2163
+ /**
2164
+ * Grace period (ms) for the child's EOF-driven quiesce on dispose — its
2165
+ * window to flush persistence and tear down its own nested subprocesses
2166
+ * before the parent escalates to a signal.
2167
+ */
2168
+ disposeEofGraceMs?: number
2169
+ /** Termination confirmation window (ms), including forced exit on every platform. */
2170
+ disposeGraceMs?: number
2171
+ }
2172
+ ```
2173
+
2174
+ Source: [`packages/subagent/subagent-dsh-sdk/src/index.ts:29`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent-dsh-sdk/src/index.ts)
2175
+
2176
+ <a id="deepseek-aidsh-subagent-fork-in-process"></a>
2177
+
2178
+ ## `@deepseek-ai/dsh-subagent-fork-in-process`
2179
+
2180
+ Requires: `subagents`
2181
+
2182
+ ```ts config-catalog
2183
+ /** Config: the registry name to register the provider under. */
2184
+ export interface Config {
2185
+ /** Provider name on `ctx.subagents` (default `fork`). */
2186
+ providerName: string
2187
+ }
2188
+ ```
2189
+
2190
+ Source: [`packages/subagent/subagent-fork-in-process/src/index.ts:31`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent-fork-in-process/src/index.ts)
2191
+
2192
+ <a id="deepseek-aidsh-subagent-spawn-in-process"></a>
2193
+
2194
+ ## `@deepseek-ai/dsh-subagent-spawn-in-process`
2195
+
2196
+ Requires: `subagents`
2197
+
2198
+ ```ts config-catalog
2199
+ /** Config: the registry name to register the provider under. */
2200
+ export interface Config {
2201
+ /** Provider name on `ctx.subagents` (default `spawn`). */
2202
+ providerName: string
2203
+ }
2204
+ ```
2205
+
2206
+ Source: [`packages/subagent/subagent-spawn-in-process/src/index.ts:25`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent-spawn-in-process/src/index.ts)
2207
+
2208
+ <a id="deepseek-aidsh-subprocess-e2b"></a>
2209
+
2210
+ ## `@deepseek-ai/dsh-subprocess-e2b`
2211
+
2212
+ Requires: `e2b`
2213
+
2214
+ ```ts config-catalog
2215
+ /** Configuration for the E2B subprocess adapter. */
2216
+ export interface Config {
2217
+ /** Remote status/liveness poll cadence in milliseconds; each tick is one control-plane request. */
2218
+ pollMs?: number
2219
+ }
2220
+ ```
2221
+
2222
+ Source: [`packages/e2b/subprocess-e2b/src/index.ts:25`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/e2b/subprocess-e2b/src/index.ts)
2223
+
2224
+ <a id="deepseek-aidsh-system-prompt"></a>
2225
+
2226
+ ## `@deepseek-ai/dsh-system-prompt`
2227
+
2228
+ ```ts config-catalog
2229
+ /** Plugin config: the deployment-authored fragment of the system prompt (see {@link Config.persona} for its contract). */
2230
+ export interface Config {
2231
+ /** Include the fixed DeepSeek Harness identity before the deployment persona (default true). */
2232
+ includeHarnessIdentity?: boolean
2233
+ /** Include dynamic runtime-context snapshots in model history (default true). */
2234
+ includeRuntimeContext?: boolean
2235
+ /**
2236
+ * Deployment-wide order-0 persona template. A scoped section named
2237
+ * `deployment:persona` shadows it; `{{variable}}` references are strict.
2238
+ */
2239
+ persona?: string
2240
+ /**
2241
+ * Model-facing tool names in order, with {@link TOOL_ORDER_REST} exactly once.
2242
+ * Invalid fields fail at load and unknown names fail at assembly; known names
2243
+ * hidden in one scope may be absent there. Omitted means lexicographic order.
2244
+ */
2245
+ toolOrder?: string[]
2246
+ }
2247
+ ```
2248
+
2249
+ Source: [`packages/core/system-prompt/src/index.ts:186`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/system-prompt/src/index.ts)
2250
+
2251
+ <a id="deepseek-aidsh-terminal-bash"></a>
2252
+
2253
+ ## `@deepseek-ai/dsh-terminal-bash`
2254
+
2255
+ Requires: `terminals` · `sandboxPolicy` · `subprocess`
2256
+
2257
+ ```ts config-catalog
2258
+ /** Public plugin configuration. */
2259
+ export interface Config {
2260
+ /** Backend registry type (default: `shell`). */
2261
+ backendType?: string
2262
+ /** Interactive shell executable (default: `/bin/bash`). */
2263
+ shellPath?: string
2264
+ /** Shell arguments (default: `--noprofile --norc -i`). */
2265
+ shellArgs?: string[]
2266
+ /** Terminal rows. */
2267
+ rows?: number
2268
+ /** Terminal columns. */
2269
+ cols?: number
2270
+ /** Maximum retained logical lines. */
2271
+ scrollbackLines?: number
2272
+ /** Maximum retained UTF-8 bytes. */
2273
+ scrollbackMaxBytes?: number
2274
+ /** Maximum bytes returned by one read or settled viewport. */
2275
+ maxReadBytes?: number
2276
+ /** Readiness polling interval. */
2277
+ pollIntervalMs?: number
2278
+ /** Delay before Linux exact syscall probes. */
2279
+ exactProbeAfterMs?: number
2280
+ /** Silence duration that yields `inferred_idle`. */
2281
+ idleSilenceMs?: number
2282
+ /**
2283
+ * Extra wait beyond `idleSilenceMs`, once a prompt marker was seen, for the shell to
2284
+ * regain the foreground before `inferred_idle` settles; at least one `pollIntervalMs`.
2285
+ */
2286
+ handoffGraceMs?: number
2287
+ /** Absolute send wait bound. */
2288
+ timeoutMs?: number
2289
+ /** Grace before teardown escalates to `SIGKILL`. */
2290
+ disposeGraceMs?: number
2291
+ }
2292
+ ```
2293
+
2294
+ Source: [`packages/terminal/terminal-bash/src/config.ts:6`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/terminal/terminal-bash/src/config.ts)
2295
+
2296
+ <a id="deepseek-aidsh-time-context"></a>
2297
+
2298
+ ## `@deepseek-ai/dsh-time-context`
2299
+
2300
+ Requires: `agents`
2301
+
2302
+ ```ts config-catalog
2303
+ /** Request-preparation clock formatting and append scheduling. Invalid values fail plugin load. */
2304
+ export interface Config {
2305
+ /** Fallback display zone when the open turn has no unique browser zone. Omit to use the process zone. */
2306
+ timeZone?: string
2307
+ /** Minimum milliseconds between durable injections in one session. Omit or set to 0 to inject at every eligible step. */
2308
+ refreshIntervalMs?: number
2309
+ }
2310
+ ```
2311
+
2312
+ Source: [`packages/context/time-context/src/index.ts:27`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/context/time-context/src/index.ts)
2313
+
2314
+ <a id="deepseek-aidsh-tmux-context"></a>
2315
+
2316
+ ## `@deepseek-ai/dsh-tmux-context`
2317
+
2318
+ Requires: `agents`
2319
+
2320
+ ```ts config-catalog
2321
+ /** Per-turn tmux-location scheduling. Invalid values fail plugin load. */
2322
+ export interface Config {
2323
+ /** Minimum milliseconds between durable injections in one session. Omit or set to 0 to inject on every eligible change. */
2324
+ refreshIntervalMs?: number
2325
+ }
2326
+ ```
2327
+
2328
+ Source: [`packages/context/tmux-context/src/index.ts:34`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/context/tmux-context/src/index.ts)
2329
+
2330
+ <a id="deepseek-aidsh-token-meter"></a>
2331
+
2332
+ ## `@deepseek-ai/dsh-token-meter`
2333
+
2334
+ ```ts config-catalog
2335
+ /** Token-meter plugin configuration; the fixed estimator has no settings. */
2336
+ export type TokenMeterConfig = Record<string, never>
2337
+ ```
2338
+
2339
+ Source: [`packages/llm/token-meter/src/types.ts:12`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/token-meter/src/types.ts)
2340
+
2341
+ <a id="deepseek-aidsh-tool-bash"></a>
2342
+
2343
+ ## `@deepseek-ai/dsh-tool-bash`
2344
+
2345
+ Requires: `tools` · `shell` · `systemPrompt` · `shellEnv`
2346
+
2347
+ ```ts config-catalog
2348
+ /** Configuration for the bash tool. */
2349
+ export interface Config {
2350
+ /** Expose `run_in_background` (default true); disabled calls are also rejected. */
2351
+ enableRunInBackground?: boolean
2352
+ }
2353
+ ```
2354
+
2355
+ Source: [`packages/shell/tool-bash/src/index.ts:34`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/tool-bash/src/index.ts)
2356
+
2357
+ <a id="deepseek-aidsh-tool-bash-persistent"></a>
2358
+
2359
+ ## `@deepseek-ai/dsh-tool-bash-persistent`
2360
+
2361
+ Requires: `tools` · `terminals`
2362
+
2363
+ ```ts config-catalog
2364
+ /** Configuration for the persistent Bash tool. */
2365
+ export interface Config {
2366
+ /** PTY backend used for each owner-isolated persistent shell (default `shell`). */
2367
+ backendType?: string
2368
+ /** Wall-clock limit for one command (default 300000). */
2369
+ timeoutMs?: number
2370
+ /** Maximum returned command-output characters before clipping (default 16000). */
2371
+ maxOutputChars?: number
2372
+ /** Model-facing tool description; deployments may describe their environment. */
2373
+ description?: string
2374
+ }
2375
+ ```
2376
+
2377
+ Source: [`packages/shell/tool-bash-persistent/src/index.ts:400`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/tool-bash-persistent/src/index.ts)
2378
+
2379
+ <a id="deepseek-aidsh-tool-fs"></a>
2380
+
2381
+ ## `@deepseek-ai/dsh-tool-fs`
2382
+
2383
+ Requires: `tools` · `fs` · `systemPrompt`
2384
+
2385
+ ```ts config-catalog
2386
+ /** Plugin config (all optional — `Config` supplies the defaults). */
2387
+ export interface Config {
2388
+ /** Default and maximum number of lines returned by one `read` call. */
2389
+ readLimit?: number
2390
+ /** Maximum characters returned for a single line before truncation. */
2391
+ readMaxLineLength?: number
2392
+ /** Maximum bytes returned for the selected lines of one `read` call. */
2393
+ readMaxBytes?: number
2394
+ /** Files at or above this size stream instead of loading whole into memory. */
2395
+ readStreamMinSize?: number
2396
+ }
2397
+ ```
2398
+
2399
+ Source: [`packages/fs/tool-fs/src/index.ts:25`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/fs/tool-fs/src/index.ts)
2400
+
2401
+ <a id="deepseek-aidsh-tool-fs-search"></a>
2402
+
2403
+ ## `@deepseek-ai/dsh-tool-fs-search`
2404
+
2405
+ Requires: `tools` · `systemPrompt` · `subprocess`
2406
+
2407
+ ```ts config-catalog
2408
+ /** Plugin config; over-cap glob sampling is an explicit deployment choice and the remaining fields have defaults. */
2409
+ export interface Config {
2410
+ /** Whether an over-cap `glob` page is sampled across top-level entries instead of taking the modification-time head. */
2411
+ sampleOverCapGlobResults: boolean
2412
+ /** Max paths one `glob` call retains inline; later paths go to the formatted spill file. */
2413
+ globMaxResults?: number
2414
+ /** Max flat matches one `grep` call retains inline; later matches go to the formatted spill file. */
2415
+ grepMaxMatches?: number
2416
+ /** Max bytes retained for one matched-line preview (the cut preserves UTF-8 boundaries). */
2417
+ grepMaxLineBytes?: number
2418
+ /** Max bytes of one search's serialized `presentationMeta`; trailing groups/paths drop past it so the persisted card stays bounded. */
2419
+ searchMetaMaxBytes?: number
2420
+ /** Max complete raw `rg` stdout bytes a search will parse; larger raw output fails with `SEARCH_RAW_OUTPUT_OVERFLOW`. */
2421
+ rawOutputMaxBytes?: number
2422
+ /** Terminate-escalation grace (ms), handed to the subprocess seam and bounded by `MAX_TIMER_DELAY_MS`. */
2423
+ graceMs?: number
2424
+ /** Max bytes retained for one search's stderr tail; the excerpt is embedded in `SEARCH_*` error messages, never shown on success. */
2425
+ stderrMaxBytes?: number
2426
+ /**
2427
+ * Cooperative tool-call timeout budget (ms) on both tools, enforced by
2428
+ * `@deepseek-ai/dsh-tool-call-timeout-policy` through `exec.signal`.
2429
+ */
2430
+ timeoutMs?: number
2431
+ }
2432
+ ```
2433
+
2434
+ Source: [`packages/fs/tool-fs-search/src/index.ts:73`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/fs/tool-fs-search/src/index.ts)
2435
+
2436
+ <a id="deepseek-aidsh-tool-goal"></a>
2437
+
2438
+ ## `@deepseek-ai/dsh-tool-goal`
2439
+
2440
+ Requires: `agents` · `goals` · `tools` · `systemPrompt`
2441
+
2442
+ ```ts config-catalog
2443
+ /** Model policy and hard lower bounds for goal-state updates. */
2444
+ export interface Config {
2445
+ /** Minimum admitted goal rounds before the model may self-report `blocked`. */
2446
+ blockedAfterConsecutiveRounds?: number
2447
+ }
2448
+ ```
2449
+
2450
+ Source: [`packages/goal/tool-goal/src/index.ts:26`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/goal/tool-goal/src/index.ts)
2451
+
2452
+ <a id="deepseek-aidsh-tool-jobs"></a>
2453
+
2454
+ ## `@deepseek-ai/dsh-tool-jobs`
2455
+
2456
+ Requires: `tools` · `jobs` · `systemPrompt`
2457
+
2458
+ ```ts config-catalog
2459
+ /** Configures bounded `job_output` waits and completion-notice delivery. */
2460
+ export interface Config {
2461
+ /** Wait duration applied when `job_output` sets `wait` without `timeout_ms` (default 30s). */
2462
+ waitTimeoutMs?: number
2463
+ /** Hard cap on any single wait; a larger model-supplied `timeout_ms` is clamped down to it (default 10min). */
2464
+ maxWaitTimeoutMs?: number
2465
+ /** Whether a completion opens a turn on an idle owner (default `wakeup`). */
2466
+ completionDelivery?: CompletionDelivery
2467
+ /**
2468
+ * Turns one owner may have opened by completion wakes before the next
2469
+ * notice degrades to injection, reset by any user-authored input (default 3).
2470
+ * Bounds the self-exciting chain where a woken turn starts the job whose
2471
+ * completion wakes it again.
2472
+ */
2473
+ maxConsecutiveWakes?: number
2474
+ }
2475
+
2476
+ /**
2477
+ * How an unreported completion reaches an owner that is already idle: `wakeup`
2478
+ * opens a turn for it, `quiet` leaves it pending until something else wakes the
2479
+ * owner. A busy owner is injected either way.
2480
+ */
2481
+ export type CompletionDelivery = 'quiet' | 'wakeup'
2482
+ ```
2483
+
2484
+ Source: [`packages/jobs/tool-jobs/src/index.ts:32`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/jobs/tool-jobs/src/index.ts)
2485
+
2486
+ <a id="deepseek-aidsh-tool-lsp"></a>
2487
+
2488
+ ## `@deepseek-ai/dsh-tool-lsp`
2489
+
2490
+ Requires: `tools` · `lsp` · `systemPrompt`
2491
+
2492
+ ```ts config-catalog
2493
+ /** Plugin configuration: result caps and the timeout budget. */
2494
+ export interface Config {
2495
+ /** Largest number of rendered locations before an omission marker (default 100). */
2496
+ maxLocations?: number
2497
+ /** Largest complete rendered result in characters, including truncation metadata (default 16000). */
2498
+ maxResultChars?: number
2499
+ /** Tool-call timeout budget in ms (default 60000). */
2500
+ timeoutMs?: number
2501
+ }
2502
+ ```
2503
+
2504
+ Source: [`packages/lsp/tool-lsp/src/index.ts:58`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/lsp/tool-lsp/src/index.ts)
2505
+
2506
+ <a id="deepseek-aidsh-tool-pwsh"></a>
2507
+
2508
+ ## `@deepseek-ai/dsh-tool-pwsh`
2509
+
2510
+ Requires: `tools` · `shell` · `systemPrompt` · `shellEnv`
2511
+
2512
+ ```ts config-catalog
2513
+ /** Configuration for the pwsh tool. */
2514
+ export interface Config {
2515
+ /** Expose `run_in_background` (default true); disabled calls are also rejected. */
2516
+ enableRunInBackground?: boolean
2517
+ }
2518
+ ```
2519
+
2520
+ Source: [`packages/shell/tool-pwsh/src/index.ts:52`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/tool-pwsh/src/index.ts)
2521
+
2522
+ <a id="deepseek-aidsh-tool-ralph"></a>
2523
+
2524
+ ## `@deepseek-ai/dsh-tool-ralph`
2525
+
2526
+ Requires: `tools` · `workflowEngine` · `subagents` · `systemPrompt`
2527
+
2528
+ ```ts config-catalog
2529
+ /** Deployment policy for the fixed Ralph workflow. */
2530
+ export interface Config {
2531
+ /** Fresh structured-output provider used for every round (default `spawn`). */
2532
+ subagentProvider?: string
2533
+ /** Default and deployment ceiling for one call's round count (default 256). */
2534
+ maxRounds?: number
2535
+ /** Maximum serialized characters in one structured handoff (default 16384). */
2536
+ maxHandoffChars?: number
2537
+ /** Maximum characters in a successful parent-facing terminal text (default 16384). */
2538
+ maxResultChars?: number
2539
+ }
2540
+ ```
2541
+
2542
+ Source: [`packages/workflow/tool-ralph/src/index.ts:23`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/tool-ralph/src/index.ts)
2543
+
2544
+ <a id="deepseek-aidsh-tool-session-query"></a>
2545
+
2546
+ ## `@deepseek-ai/dsh-tool-session-query`
2547
+
2548
+ Requires: `tools` · `systemPrompt` · `sessionQuery`
2549
+
2550
+ ```ts config-catalog
2551
+ /** Deployment-owned search count and timeout bounds. */
2552
+ export interface Config {
2553
+ /** Maximum authorized hits returned by one search call. Defaults to 100. */
2554
+ maxSearchResults?: number
2555
+ /** Cooperative full-text search deadline in milliseconds. Defaults to 30000. */
2556
+ searchTimeoutMs?: number
2557
+ }
2558
+ ```
2559
+
2560
+ Source: [`packages/session-query/tool-session-query/src/index.ts:29`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session-query/tool-session-query/src/index.ts)
2561
+
2562
+ <a id="deepseek-aidsh-tool-skill"></a>
2563
+
2564
+ ## `@deepseek-ai/dsh-tool-skill`
2565
+
2566
+ Requires: `agents` · `tools` · `skills`
2567
+
2568
+ ```ts config-catalog
2569
+ /** Model-facing skill catalog configuration. */
2570
+ export interface Config {
2571
+ /** Maximum normalized description length rendered in the session catalog; minimum 3. */
2572
+ catalogDescriptionMaxLength?: number
2573
+ }
2574
+ ```
2575
+
2576
+ Source: [`packages/skill/tool-skill/src/index.ts:61`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/skill/tool-skill/src/index.ts)
2577
+
2578
+ <a id="deepseek-aidsh-tool-str-replace-editor"></a>
2579
+
2580
+ ## `@deepseek-ai/dsh-tool-str-replace-editor`
2581
+
2582
+ Requires: `tools` · `fs`
2583
+
2584
+ ```ts config-catalog
2585
+ /** Configuration for the string-replacement editor tool. */
2586
+ export interface Config {
2587
+ /** Maximum returned view characters before clipping (default 16000). */
2588
+ maxOutputChars?: number
2589
+ /** Model-facing tool description. */
2590
+ description?: string
2591
+ }
2592
+ ```
2593
+
2594
+ Source: [`packages/fs/tool-str-replace-editor/src/index.ts:497`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/fs/tool-str-replace-editor/src/index.ts)
2595
+
2596
+ <a id="deepseek-aidsh-tool-subagent"></a>
2597
+
2598
+ ## `@deepseek-ai/dsh-tool-subagent`
2599
+
2600
+ Requires: `tools` · `subagents` · `systemPrompt`
2601
+
2602
+ ```ts config-catalog
2603
+ /** Config: which registered provider this tool delegates to, plus child defaults. */
2604
+ export interface Config {
2605
+ /** The `ctx.subagents` provider name to start runs on (e.g. `spawn`, `acp`). */
2606
+ provider: string
2607
+ /**
2608
+ * Model-facing tool name (default `subagent`). Each loaded instance must use
2609
+ * a distinct name.
2610
+ */
2611
+ toolName?: string
2612
+ /**
2613
+ * Expose `run_in_background` (default true). Disabled instances omit the
2614
+ * parameter and reject forced background calls.
2615
+ */
2616
+ enableRunInBackground?: boolean
2617
+ /**
2618
+ * Background execution policy (default `one-shot`). `one-shot` defaults calls
2619
+ * to foreground; `continuable` defaults them to background, requires a provider
2620
+ * with the `prepareContinuable` capability, and returns the durable child id.
2621
+ * Follow-up adapters remain independently optional.
2622
+ */
2623
+ backgroundMode?: 'one-shot' | 'continuable'
2624
+ /**
2625
+ * Agent options applied to every child; omitted fields use child-loop defaults.
2626
+ */
2627
+ agentOptions?: AgentOptions
2628
+ /**
2629
+ * Per-child persona that shadows `deployment:persona`. Requires the
2630
+ * provider's `persona` capability; omission preserves the deployment persona.
2631
+ */
2632
+ persona?: string
2633
+ /**
2634
+ * Tool filter applied to every child. Filtered tools disappear from its
2635
+ * prompt and reject execution. Requires the provider's `toolFilter`
2636
+ * capability; unknown names fail startup.
2637
+ */
2638
+ toolFilter?: {
2639
+ /** Global tool names the child keeps; everything else is removed. */
2640
+ allow?: string[]
2641
+ /** Global tool names removed from the child. */
2642
+ deny?: string[]
2643
+ }
2644
+ /**
2645
+ * Maximum child depth: a non-negative safe integer (default `3`; `0` forbids
2646
+ * delegation entirely), or `'provider-managed'` to send no cap. A numeric cap
2647
+ * requires the provider's `depthLimit` capability (mount fails loud
2648
+ * otherwise). The provider checks the calling agent's current depth at every
2649
+ * start; the tool remains model-visible so runtime policy owns rejection.
2650
+ * `'provider-managed'` is for an out-of-process provider whose recursion
2651
+ * budget belongs to the child runtime or its own deployment.
2652
+ */
2653
+ maxDepth?: number | 'provider-managed'
2654
+ }
2655
+ ```
2656
+
2657
+ Depends on: [`AgentOptions`](./subsystems/core.md)
2658
+
2659
+ Source: [`packages/subagent/tool-subagent/src/index.ts:29`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/tool-subagent/src/index.ts)
2660
+
2661
+ <a id="deepseek-aidsh-tool-subagent-report"></a>
2662
+
2663
+ ## `@deepseek-ai/dsh-tool-subagent-report`
2664
+
2665
+ Requires: `subagents` · `tools` · `systemPrompt`
2666
+
2667
+ ```ts config-catalog
2668
+ /** Config: how accepted reports are scheduled on the parent. */
2669
+ export interface Config {
2670
+ /**
2671
+ * Parent scheduling (default `wakeup`). `wakeup` creates one ordinary later
2672
+ * parent turn; `quiet` adds context without waking, so a parked parent learns
2673
+ * of the report only when something else wakes it.
2674
+ */
2675
+ reportDelivery?: SubagentReportDelivery
2676
+ }
2677
+ ```
2678
+
2679
+ Depends on: [`SubagentReportDelivery`](./subsystems/subagent.md)
2680
+
2681
+ Source: [`packages/subagent/tool-subagent-report/src/index.ts:27`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/tool-subagent-report/src/index.ts)
2682
+
2683
+ <a id="deepseek-aidsh-tool-terminal"></a>
2684
+
2685
+ ## `@deepseek-ai/dsh-tool-terminal`
2686
+
2687
+ Requires: `terminals` · `tools` · `systemPrompt`
2688
+
2689
+ ```ts config-catalog
2690
+ /** Model-facing terminal tool configuration. */
2691
+ export interface Config {
2692
+ /** Expose `run_in_background` and accept background sends (default true). */
2693
+ enableRunInBackground?: boolean
2694
+ /** Maximum UTF-8 bytes in one complete terminal or task-output result. */
2695
+ maxResultBytes?: number
2696
+ }
2697
+ ```
2698
+
2699
+ Source: [`packages/terminal/tool-terminal/src/index.ts:35`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/terminal/tool-terminal/src/index.ts)
2700
+
2701
+ <a id="deepseek-aidsh-tool-todo"></a>
2702
+
2703
+ ## `@deepseek-ai/dsh-tool-todo`
2704
+
2705
+ Requires: `tools`
2706
+
2707
+ ```ts config-catalog
2708
+ /** Model-facing todo tool configuration. */
2709
+ export interface Config {
2710
+ /**
2711
+ * Required deployment choice for whether several todos may be `in_progress` at once. True suits
2712
+ * agents that run work concurrently — subagents, background commands, workflow fan-out — and the
2713
+ * description then instructs the model to mark every actively worked task. False restores the
2714
+ * single-active discipline: the description asks for exactly one, and a call marking more is
2715
+ * rejected.
2716
+ */
2717
+ allowParallelInProgress: boolean
2718
+ }
2719
+ ```
2720
+
2721
+ Source: [`packages/todo/tool-todo/src/index.ts:29`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/todo/tool-todo/src/index.ts)
2722
+
2723
+ <a id="deepseek-aidsh-tool-web"></a>
2724
+
2725
+ ## `@deepseek-ai/dsh-tool-web`
2726
+
2727
+ Requires: `tools` · `web` · `systemPrompt`
2728
+
2729
+ ```ts config-catalog
2730
+ /** Plugin config: which web tools to register, the source cap, per-tool budgets, and the fetch output cap. */
2731
+ export interface Config {
2732
+ /** Register `web_search`. Defaults to true. */
2733
+ search?: boolean
2734
+ /** Register `web_fetch`. Defaults to true. */
2735
+ fetch?: boolean
2736
+ /** Upper bound on sources returned by one `web_search` call. */
2737
+ searchMaxResults?: number
2738
+ /** Cooperative timeout budget (ms) for `web_fetch`. Defaults to 30000. */
2739
+ fetchTimeoutMs?: number
2740
+ /** Cooperative timeout budget (ms) for `web_search`. Defaults to 30000. */
2741
+ searchTimeoutMs?: number
2742
+ /** Cap on source characters converted and complete `web_fetch` output characters. Defaults to 200000. */
2743
+ fetchMaxOutputChars?: number
2744
+ }
2745
+ ```
2746
+
2747
+ Source: [`packages/web/tool-web/src/index.ts:37`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/web/tool-web/src/index.ts)
2748
+
2749
+ <a id="deepseek-aidsh-tool-workflow"></a>
2750
+
2751
+ ## `@deepseek-ai/dsh-tool-workflow`
2752
+
2753
+ Requires: `tools` · `workflowEngine` · `systemPrompt`
2754
+
2755
+ ```ts config-catalog
2756
+ /** Config: the model-facing tool name plus result rendering caps. */
2757
+ export interface Config {
2758
+ /** The model-facing tool name to register (default `workflow`). */
2759
+ toolName?: string
2760
+ /** Rendered-result ceiling, in characters: a longer JSON value is truncated with a notice (default 50000). */
2761
+ maxResultChars?: number
2762
+ }
2763
+ ```
2764
+
2765
+ Source: [`packages/workflow/tool-workflow/src/index.ts:33`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/tool-workflow/src/index.ts)
2766
+
2767
+ <a id="deepseek-aidsh-tools"></a>
2768
+
2769
+ ## `@deepseek-ai/dsh-tools`
2770
+
2771
+ Requires: `systemPrompt`
2772
+
2773
+ ```ts config-catalog
2774
+ /** Plugin config: how the registered tools are presented to the model. */
2775
+ export interface Config {
2776
+ /**
2777
+ * Model presentation. `native` (default) sends every visible schema; `code`
2778
+ * sends only `run_code` plus a generated SDK prompt and collapses the
2779
+ * executor to the same surface (a model-direct call may only name
2780
+ * `run_code`; `run_code` SDK sub-dispatches keep every visible tool); `both`
2781
+ * sends both forms. Code modes require a `ctx.codeRuntime` whose `language`
2782
+ * has a registered SDK renderer (TypeScript or Python) and fail prompt
2783
+ * assembly when it is absent or has no renderer. Under `code`, native names
2784
+ * in `toolOrder` are invalid.
2785
+ */
2786
+ mode?: ToolPresentationMode
2787
+ /**
2788
+ * Concurrency cap for a `run_code` program's overlapping sub-calls
2789
+ * (default 10, the loop scheduler's own default). Sub-calls follow the
2790
+ * native scheduling contract — only calls whose tools classify
2791
+ * concurrency-safe overlap; exclusive calls form barriers — so `1`
2792
+ * restores strictly serial dispatch. Must be a positive integer.
2793
+ */
2794
+ maxParallelSubCalls?: number
2795
+ }
2796
+
2797
+ /** How the registry presents its tools to the model (see {@link Config.mode}). */
2798
+ export type ToolPresentationMode = 'native' | 'code' | 'both'
2799
+ ```
2800
+
2801
+ Source: [`packages/core/tools/src/index.ts:654`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/tools/src/index.ts)
2802
+
2803
+ <a id="deepseek-aidsh-typert-loader"></a>
2804
+
2805
+ ## `@deepseek-ai/dsh-typert-loader`
2806
+
2807
+ Requires: `typert` · `loader`
2808
+
2809
+ ```ts config-catalog
2810
+ /** Additional package artifacts whose owning plugins are nested behind another Loader entry. */
2811
+ export interface Config {
2812
+ /** Exact npm package names that must resolve and export `./typert`. */
2813
+ packages?: string[]
2814
+ }
2815
+ ```
2816
+
2817
+ Source: [`packages/typert/loader/src/index.ts:47`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/typert/loader/src/index.ts)
2818
+
2819
+ <a id="deepseek-aidsh-user-approval"></a>
2820
+
2821
+ ## `@deepseek-ai/dsh-user-approval`
2822
+
2823
+ ```ts config-catalog
2824
+ /** Plugin config. All optional — `static Config` supplies the defaults. */
2825
+ export interface Config {
2826
+ /**
2827
+ * The deployment's default {@link ApprovalPolicy} for sessions without an
2828
+ * `approval/policy` override — `'ask'` delegates to the composed answerers
2829
+ * (fail-closed with none); `'never'` auto-rejects every ask without
2830
+ * prompting (the deterministic CI/unattended stance).
2831
+ */
2832
+ readonly policy?: ApprovalPolicy
2833
+ }
2834
+
2835
+ /**
2836
+ * A session's approval policy — what happens to an {@link ApprovalService}
2837
+ * ask BEFORE any interactive answerer sees it:
2838
+ *
2839
+ * - `'ask'` (the default) — delegate to the composed answerers; with none
2840
+ * composed the chain falls through to the fail-closed `'unavailable'`.
2841
+ * - `'never'` — never prompt anyone: every ask resolves `'rejected'`
2842
+ * deterministically. The strict headless stance (CI, unattended runs) and
2843
+ * the policy whose outcome is knowable without asking.
2844
+ */
2845
+ export type ApprovalPolicy = 'ask' | 'never'
2846
+ ```
2847
+
2848
+ Source: [`packages/interaction/user-approval/src/index.ts:177`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/user-approval/src/index.ts)
2849
+
2850
+ <a id="deepseek-aidsh-web"></a>
2851
+
2852
+ ## `@deepseek-ai/dsh-web`
2853
+
2854
+ ```ts config-catalog
2855
+ /**
2856
+ * Config for the web seam. `searchProvider` / `fetchProvider` pin which provider
2857
+ * wins for each capability; both are optional (a single registered usable
2858
+ * provider auto-selects). Operational overrides such as environment variables
2859
+ * must feed these same fields rather than introduce a hidden priority chain.
2860
+ */
2861
+ export interface WebRuntimeConfig {
2862
+ /** Explicit search provider id. Omitted = auto-select when exactly one usable. */
2863
+ readonly searchProvider?: string
2864
+ /** Explicit fetch provider id. Omitted = auto-select when exactly one usable. */
2865
+ readonly fetchProvider?: string
2866
+ }
2867
+ ```
2868
+
2869
+ Source: [`packages/web/web/src/index.ts:55`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/web/web/src/index.ts)
2870
+
2871
+ <a id="deepseek-aidsh-web-app"></a>
2872
+
2873
+ ## `@deepseek-ai/dsh-web-app`
2874
+
2875
+ Requires: `webServer`
2876
+
2877
+ ```ts config-catalog
2878
+ /** Plugin config: composed deployment settings plus per-invocation command-line values. */
2879
+ export interface Config {
2880
+ /** Print the URL line on activation; a non-interactive layer can turn it off. */
2881
+ printUrl: boolean
2882
+ /**
2883
+ * Register the model-visible surface context (the `app:web-surface` prompt
2884
+ * section and the `DSH_WEB_URL` bash variable). A one-shot non-interactive
2885
+ * layer can turn it off when its user is not in the GUI, so the
2886
+ * orientation text would be false.
2887
+ */
2888
+ surfaceContext: boolean
2889
+ /** Explicit `--trusted-host` authorities from this invocation. */
2890
+ trustedHosts: string[]
2891
+ }
2892
+ ```
2893
+
2894
+ Source: [`packages/bundle/web-app/src/index.ts:38`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/bundle/web-app/src/index.ts)
2895
+
2896
+ <a id="deepseek-aidsh-web-fetch-http"></a>
2897
+
2898
+ ## `@deepseek-ai/dsh-web-fetch-http`
2899
+
2900
+ Requires: `web`
2901
+
2902
+ ```ts config-catalog
2903
+ /** Plugin config: the provider's transport and size limits plus its `User-Agent` (all defaulted). */
2904
+ export interface Config {
2905
+ /** Maximum accepted request URL length. */
2906
+ maxUrlLength?: number
2907
+ /** Maximum response body size in bytes. */
2908
+ maxResponseBytes?: number
2909
+ /** Maximum decoded body length in characters. */
2910
+ maxBodyChars?: number
2911
+ /** Default fetch timeout in milliseconds, within Node's timer range. */
2912
+ timeoutMs?: number
2913
+ /** Maximum number of same-origin redirect hops to follow. */
2914
+ maxRedirects?: number
2915
+ /** `User-Agent` header sent on every request. */
2916
+ userAgent?: string
2917
+ }
2918
+ ```
2919
+
2920
+ Source: [`packages/web/web-fetch-http/src/index.ts:34`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/web/web-fetch-http/src/index.ts)
2921
+
2922
+ <a id="deepseek-aidsh-web-search-deepseek"></a>
2923
+
2924
+ ## `@deepseek-ai/dsh-web-search-deepseek`
2925
+
2926
+ Requires: `web`
2927
+
2928
+ ```ts config-catalog
2929
+ /** Plugin config (all optional — `apply` fills env-var and constant defaults). */
2930
+ export interface Config {
2931
+ /** Literal DeepSeek API key; prefer {@link apiKeyEnv} so no secret enters configuration files. */
2932
+ apiKey?: string
2933
+ /** Credential reference resolved for each search; defaults to `DEEPSEEK_API_KEY`. */
2934
+ apiKeyEnv?: string
2935
+ /** Anthropic-compatible endpoint base; `/messages` is appended. */
2936
+ baseURL?: string
2937
+ /** Anthropic-format model name. Defaults to `deepseek-v4-flash`. */
2938
+ model?: string
2939
+ /** `anthropic-version` header value. Defaults to `2023-06-01`. */
2940
+ apiVersion?: string
2941
+ /** Upper bound on generated tokens for the Messages request. Defaults to 4096. */
2942
+ maxTokens?: number
2943
+ /** Maximum `web_search` server-tool uses per request. Defaults to 5. */
2944
+ maxUses?: number
2945
+ }
2946
+ ```
2947
+
2948
+ Source: [`packages/web/web-search-deepseek/src/index.ts:46`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/web/web-search-deepseek/src/index.ts)
2949
+
2950
+ <a id="deepseek-aidsh-web-search-exa"></a>
2951
+
2952
+ ## `@deepseek-ai/dsh-web-search-exa`
2953
+
2954
+ Requires: `web`
2955
+
2956
+ ```ts config-catalog
2957
+ /** Plugin config (all optional — `apply` fills env-var and constant defaults). */
2958
+ export interface Config {
2959
+ /** Exa API key. Falls back to `$EXA_API_KEY`. Empty → provider unavailable. */
2960
+ apiKey?: string
2961
+ /** Endpoint base; `/search` is appended. Defaults to the public API. */
2962
+ baseURL?: string
2963
+ /** Retrieval mode sent as Exa's `type`. Defaults to `auto`. */
2964
+ searchType?: 'auto' | 'keyword' | 'neural'
2965
+ /** Default result count when a request carries no `maxResults`. Omitted = none. */
2966
+ numResults?: number
2967
+ /** Highlight sentences requested per result. Defaults to 1. */
2968
+ highlightsPerResult?: number
2969
+ }
2970
+ ```
2971
+
2972
+ Source: [`packages/web/web-search-exa/src/index.ts:38`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/web/web-search-exa/src/index.ts)
2973
+
2974
+ <a id="deepseek-aidsh-web-search-perplexity"></a>
2975
+
2976
+ ## `@deepseek-ai/dsh-web-search-perplexity`
2977
+
2978
+ Requires: `web`
2979
+
2980
+ ```ts config-catalog
2981
+ /** Plugin config (all optional — `apply` fills env-var and constant defaults). */
2982
+ export interface Config {
2983
+ /** Perplexity API key. Falls back to `$PERPLEXITY_API_KEY`. Empty → unavailable. */
2984
+ apiKey?: string
2985
+ /** Endpoint base; `/chat/completions` is appended. Defaults to the public API. */
2986
+ baseURL?: string
2987
+ /** Search model name. Defaults to `sonar`. */
2988
+ model?: string
2989
+ /** Upper bound on generated answer tokens. Defaults to 1024. */
2990
+ maxTokens?: number
2991
+ /** Recency window sent as `search_recency_filter`. Omitted = no filter. */
2992
+ searchRecency?: 'day' | 'week' | 'month' | 'year'
2993
+ }
2994
+ ```
2995
+
2996
+ Source: [`packages/web/web-search-perplexity/src/index.ts:32`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/web/web-search-perplexity/src/index.ts)
2997
+
2998
+ <a id="deepseek-aidsh-workflow-worker-thread"></a>
2999
+
3000
+ ## `@deepseek-ai/dsh-workflow-worker-thread`
3001
+
3002
+ Requires: `subagents`
3003
+
3004
+ ```ts config-catalog
3005
+ /** Plugin config (all optional — `static Config` supplies the defaults). */
3006
+ export interface Config {
3007
+ /** The `ctx.subagents` provider children run on (default `spawn`). */
3008
+ provider?: string
3009
+ /** Concurrent `agent()` ceiling; `0` (the default) auto-resolves to `min(16, max(1, cores - 2))`. */
3010
+ maxConcurrentAgents?: number
3011
+ /** Total `agent()` calls one run may start — the runaway-loop backstop (default 1000). */
3012
+ maxTotalAgents?: number
3013
+ /** Items accepted by a single `parallel()`/`pipeline()` call (default 4096). */
3014
+ maxItemsPerCall?: number
3015
+ /** vm timeout for the script's initial synchronous slice, inside the worker (default 5000 ms). */
3016
+ syncTimeoutMs?: number
3017
+ /**
3018
+ * How long after a cancellation an unsettled script may keep running before
3019
+ * the run force-settles `cancelled` and its worker is TERMINATED (default
3020
+ * 5000 ms); also bounds `dispose()`.
3021
+ */
3022
+ disposeGraceMs?: number
3023
+ }
3024
+ ```
3025
+
3026
+ Source: [`packages/workflow/workflow-worker-thread/src/index.ts:32`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow-worker-thread/src/index.ts)
3027
+
3028
+ ## Loadable plugins with no config
3029
+
3030
+ These load from a `cordis.yml` entry with no `config:` block; they declare no configuration API.
3031
+
3032
+ - `@deepseek-ai/dsh-agent` ([`packages/core/agent/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/agent/src/index.ts))
3033
+ - `@deepseek-ai/dsh-api-gateway` — requires `typert` ([`packages/api/gateway/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/api/gateway/src/index.ts))
3034
+ - `@deepseek-ai/dsh-api-remotes` ([`packages/api/remotes/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/api/remotes/src/index.ts))
3035
+ - `@deepseek-ai/dsh-client-locale` ([`packages/client/locale/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/locale/src/index.ts))
3036
+ - `@deepseek-ai/dsh-client-modules` — requires `webServer` · `loader` ([`packages/client/modules/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/modules/src/index.ts))
3037
+ - `@deepseek-ai/dsh-client-runtime` ([`packages/client/runtime/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/runtime/src/index.ts))
3038
+ - `@deepseek-ai/dsh-client-ui-agent-preset` ([`packages/client/ui-agent-preset/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-agent-preset/src/index.ts))
3039
+ - `@deepseek-ai/dsh-client-ui-commands` ([`packages/client/ui-commands/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-commands/src/index.ts))
3040
+ - `@deepseek-ai/dsh-client-ui-conversation` ([`packages/client/ui-conversation/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-conversation/src/index.ts))
3041
+ - `@deepseek-ai/dsh-client-ui-cordis` ([`packages/extensions/ui-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/ui-cordis/src/index.ts))
3042
+ - `@deepseek-ai/dsh-client-ui-deliverables` — requires `systemPrompt` ([`packages/client/ui-deliverables/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-deliverables/src/index.ts))
3043
+ - `@deepseek-ai/dsh-client-ui-directory-picker-browse` ([`packages/client/ui-directory-picker-browse/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-directory-picker-browse/src/index.ts))
3044
+ - `@deepseek-ai/dsh-client-ui-directory-picker-native` ([`packages/client/ui-directory-picker-native/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-directory-picker-native/src/index.ts))
3045
+ - `@deepseek-ai/dsh-client-ui-goal` ([`packages/client/ui-goal/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-goal/src/index.ts))
3046
+ - `@deepseek-ai/dsh-client-ui-input-trigger` ([`packages/client/ui-input-trigger/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-input-trigger/src/index.ts))
3047
+ - `@deepseek-ai/dsh-client-ui-jobs` ([`packages/client/ui-jobs/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-jobs/src/index.ts))
3048
+ - `@deepseek-ai/dsh-client-ui-layout` ([`packages/client/ui-layout/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-layout/src/index.ts))
3049
+ - `@deepseek-ai/dsh-client-ui-message-feedback` ([`packages/client/ui-message-feedback/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-message-feedback/src/index.ts))
3050
+ - `@deepseek-ai/dsh-client-ui-model-selection` ([`packages/client/ui-model-selection/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-model-selection/src/index.ts))
3051
+ - `@deepseek-ai/dsh-client-ui-permission-presets` ([`packages/client/ui-permission-presets/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-permission-presets/src/index.ts))
3052
+ - `@deepseek-ai/dsh-client-ui-plan` ([`packages/client/ui-plan/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-plan/src/index.ts))
3053
+ - `@deepseek-ai/dsh-client-ui-settings` ([`packages/client/ui-settings/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-settings/src/index.ts))
3054
+ - `@deepseek-ai/dsh-client-ui-settings-general` ([`packages/client/ui-settings-general/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-settings-general/src/index.ts))
3055
+ - `@deepseek-ai/dsh-client-ui-settings-models` ([`packages/client/ui-settings-models/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-settings-models/src/index.ts))
3056
+ - `@deepseek-ai/dsh-client-ui-settings-plugin-inventory` ([`packages/client/ui-settings-plugin-inventory/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-settings-plugin-inventory/src/index.ts))
3057
+ - `@deepseek-ai/dsh-client-ui-settings-plugins` ([`packages/client/ui-settings-plugins/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-settings-plugins/src/index.ts))
3058
+ - `@deepseek-ai/dsh-client-ui-sidebar` ([`packages/client/ui-sidebar/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-sidebar/src/index.ts))
3059
+ - `@deepseek-ai/dsh-client-ui-skill` ([`packages/client/ui-skill/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-skill/src/index.ts))
3060
+ - `@deepseek-ai/dsh-client-ui-subagent` ([`packages/client/ui-subagent/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-subagent/src/index.ts))
3061
+ - `@deepseek-ai/dsh-client-ui-theme` ([`packages/client/ui-theme/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-theme/src/index.ts))
3062
+ - `@deepseek-ai/dsh-client-ui-tool` ([`packages/client/ui-tool/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-tool/src/index.ts))
3063
+ - `@deepseek-ai/dsh-client-ui-trajectory` ([`packages/client/ui-trajectory/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-trajectory/src/index.ts))
3064
+ - `@deepseek-ai/dsh-client-ui-user-questions` ([`packages/client/ui-user-questions/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-user-questions/src/index.ts))
3065
+ - `@deepseek-ai/dsh-client-ui-workflow-run` ([`packages/client/ui-workflow-run/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-workflow-run/src/index.ts))
3066
+ - `@deepseek-ai/dsh-client-ui-workspace` ([`packages/client/ui-workspace/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-workspace/src/index.ts))
3067
+ - `@deepseek-ai/dsh-command-compact` — requires `commands` · `compaction` ([`packages/compaction/command-compact/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/compaction/command-compact/src/index.ts))
3068
+ - `@deepseek-ai/dsh-command-feedback` — requires `commands` ([`packages/feedback/command-feedback/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/feedback/command-feedback/src/index.ts))
3069
+ - `@deepseek-ai/dsh-command-goal` — requires `commands` · `goals` ([`packages/goal/command-goal/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/goal/command-goal/src/index.ts))
3070
+ - `@deepseek-ai/dsh-commands` ([`packages/interaction/commands/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/commands/src/index.ts))
3071
+ - `@deepseek-ai/dsh-cordis-client-runner` ([`packages/extensions/cordis-client-runner/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/cordis-client-runner/src/index.ts))
3072
+ - `@deepseek-ai/dsh-fs-e2b` — requires `e2b` ([`packages/e2b/fs-e2b/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/e2b/fs-e2b/src/index.ts))
3073
+ - `@deepseek-ai/dsh-fs-observation-policy` ([`packages/fs/fs-observation-policy/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/fs/fs-observation-policy/src/index.ts))
3074
+ - `@deepseek-ai/dsh-goal-round-driver` — requires `agents` · `goals` · `sessions` ([`packages/goal/goal-round-driver/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/goal/goal-round-driver/src/index.ts))
3075
+ - `@deepseek-ai/dsh-host-directory-picker-auto` — requires `webServer` · `loader` ([`packages/host/directory-picker-auto/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/host/directory-picker-auto/src/index.ts))
3076
+ - `@deepseek-ai/dsh-host-directory-picker-native` ([`packages/host/directory-picker-native/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/host/directory-picker-native/src/index.ts))
3077
+ - `@deepseek-ai/dsh-host-plugin-inventory` — requires `loader` ([`packages/host/plugin-inventory/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/host/plugin-inventory/src/index.ts))
3078
+ - `@deepseek-ai/dsh-llm` ([`packages/llm/llm/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm/src/index.ts))
3079
+ - `@deepseek-ai/dsh-lsp` ([`packages/lsp/lsp/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/lsp/lsp/src/index.ts))
3080
+ - `@deepseek-ai/dsh-schedule` — requires `agents` · `sessions` · `tools` · `sessionPersistence` ([`packages/schedule/schedule/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/schedule/schedule/src/index.ts))
3081
+ - `@deepseek-ai/dsh-session` ([`packages/core/session/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/session/src/index.ts))
3082
+ - `@deepseek-ai/dsh-session-checkpoint-policy` — requires `llm` · `sessionPersistence` · `sessions` · `tools` ([`packages/session/session-checkpoint-policy/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-checkpoint-policy/src/index.ts))
3083
+ - `@deepseek-ai/dsh-session-log-export` — requires `commands` ([`packages/session-query/session-log-export/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session-query/session-log-export/src/index.ts))
3084
+ - `@deepseek-ai/dsh-session-projection` ([`packages/session/session-projection/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-projection/src/index.ts))
3085
+ - `@deepseek-ai/dsh-session-stats` — requires `sessionProjections` ([`packages/session/session-stats/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-stats/src/index.ts))
3086
+ - `@deepseek-ai/dsh-skill-badge` — requires `skills` ([`packages/skill/skill-badge/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/skill/skill-badge/src/index.ts))
3087
+ - `@deepseek-ai/dsh-storage` ([`packages/storage/storage/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/storage/storage/src/index.ts))
3088
+ - `@deepseek-ai/dsh-subagent` ([`packages/subagent/subagent/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent/src/index.ts))
3089
+ - `@deepseek-ai/dsh-subprocess-local` ([`packages/subprocess/subprocess-local/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subprocess/subprocess-local/src/index.ts))
3090
+ - `@deepseek-ai/dsh-terminal` ([`packages/terminal/terminal/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/terminal/terminal/src/index.ts))
3091
+ - `@deepseek-ai/dsh-tool-ask-user` — requires `tools` · `userQuestions` ([`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))
3092
+ - `@deepseek-ai/dsh-tool-call-timeout-policy` — requires `tools` ([`packages/guard/timeout-policy/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/guard/timeout-policy/src/index.ts))
3093
+ - `@deepseek-ai/dsh-tool-cordis` — requires `tools` · `systemPrompt` · `dynamicCordisRunner` · `cordisInspect` ([`packages/extensions/tool-cordis/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/extensions/tool-cordis/src/index.ts))
3094
+ - `@deepseek-ai/dsh-tool-subagent-control` — requires `tools` · `subagents` ([`packages/subagent/tool-subagent-control/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/tool-subagent-control/src/index.ts))
3095
+ - `@deepseek-ai/dsh-user-questions` ([`packages/interaction/user-questions/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/user-questions/src/index.ts))
3096
+ - `@deepseek-ai/dsh-workspace` — requires `storageDomain` · `sessionPersistence` ([`packages/workspace/workspace/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workspace/workspace/src/index.ts))
3097
+
3098
+ ## Seam packages (not directly loadable)
3099
+
3100
+ Abstract service classes — a deployment loads a concrete implementation package instead ([capability seams](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)).
3101
+
3102
+ - `@deepseek-ai/dsh-attachment` — abstract `AttachmentStore` ([`packages/attachment/attachment/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/attachment/attachment/src/index.ts))
3103
+ - `@deepseek-ai/dsh-code-runtime` — abstract `CodeRuntime` ([`packages/code-runtime/code-runtime/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/code-runtime/code-runtime/src/index.ts))
3104
+ - `@deepseek-ai/dsh-compaction` — abstract `CompactionEngine` ([`packages/compaction/compaction/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/compaction/compaction/src/index.ts))
3105
+ - `@deepseek-ai/dsh-credentials` — abstract `CredentialProvider` ([`packages/credentials/credentials/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/credentials/credentials/src/index.ts))
3106
+ - `@deepseek-ai/dsh-fs` — abstract `FileSystem` ([`packages/fs/fs/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/fs/fs/src/index.ts))
3107
+ - `@deepseek-ai/dsh-host-directory-picker` — abstract `DirectoryPicker` ([`packages/host/directory-picker/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/host/directory-picker/src/index.ts))
3108
+ - `@deepseek-ai/dsh-jobs` — abstract `JobRegistry` ([`packages/jobs/jobs/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/jobs/jobs/src/index.ts))
3109
+ - `@deepseek-ai/dsh-sandbox` — abstract `SandboxProvider` ([`packages/sandbox/sandbox/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/sandbox/sandbox/src/index.ts))
3110
+ - `@deepseek-ai/dsh-session-persistence` — abstract `SessionPersistence` ([`packages/session/session-persistence/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-persistence/src/index.ts))
3111
+ - `@deepseek-ai/dsh-session-query` — abstract `SessionQueryEngine` ([`packages/session-query/session-query/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session-query/session-query/src/index.ts))
3112
+ - `@deepseek-ai/dsh-settings` — abstract `SettingsProvider` ([`packages/settings/settings/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/settings/settings/src/index.ts))
3113
+ - `@deepseek-ai/dsh-shell` — abstract `ShellExecutor` ([`packages/shell/shell/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/shell/shell/src/index.ts))
3114
+ - `@deepseek-ai/dsh-spill` — abstract `SpillStore` ([`packages/spill/spill/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/spill/spill/src/index.ts))
3115
+ - `@deepseek-ai/dsh-subprocess` — abstract `SubprocessRuntime` ([`packages/subprocess/subprocess/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subprocess/subprocess/src/index.ts))
3116
+ - `@deepseek-ai/dsh-workflow` — abstract `WorkflowEngine` ([`packages/workflow/workflow/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/index.ts))
3117
+
3118
+ ## Library packages (no plugin entry)
3119
+
3120
+ Imported as libraries by other packages; a `cordis.yml` cannot load them.
3121
+
3122
+ - `@deepseek-ai/dsh-acp-snapshot` ([`packages/test-support/acp-snapshot/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/test-support/acp-snapshot/src/index.ts))
3123
+ - `@deepseek-ai/dsh-agent-loop-testkit` ([`packages/test-support/agent-loop-testkit/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/test-support/agent-loop-testkit/src/index.ts))
3124
+ - `@deepseek-ai/dsh-anonymous-user-id` ([`packages/identity/anonymous-user-id/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/identity/anonymous-user-id/src/index.ts))
3125
+ - `@deepseek-ai/dsh-app-boot` ([`packages/boot/app-boot/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/boot/app-boot/src/index.ts))
3126
+ - `@deepseek-ai/dsh-atomic-write` ([`packages/util/atomic-write/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/util/atomic-write/src/index.ts))
3127
+ - `@deepseek-ai/dsh-base` ([`packages/bundle/base/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/bundle/base/src/index.ts))
3128
+ - `@deepseek-ai/dsh-brand` ([`packages/util/brand/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/util/brand/src/index.ts))
3129
+ - `@deepseek-ai/dsh-client-schema-form` ([`packages/client/schema-form/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/schema-form/src/index.ts))
3130
+ - `@deepseek-ai/dsh-client-test-runtime` ([`packages/test-support/client-runtime/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/test-support/client-runtime/src/index.ts))
3131
+ - `@deepseek-ai/dsh-client-ui-attachment` ([`packages/client/ui-attachment/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-attachment/src/index.ts))
3132
+ - `@deepseek-ai/dsh-client-ui-primitives` ([`packages/client/ui-primitives/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-primitives/src/index.ts))
3133
+ - `@deepseek-ai/dsh-client-ui-slots` ([`packages/client/ui-slots/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-slots/src/index.ts))
3134
+ - `@deepseek-ai/dsh-client-web` ([`packages/client/web/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/web/src/index.ts))
3135
+ - `@deepseek-ai/dsh-client-web-react` ([`packages/client/web-react/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/web-react/src/index.ts))
3136
+ - `@deepseek-ai/dsh-cmdline` ([`packages/boot/cmdline/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/boot/cmdline/src/index.ts))
3137
+ - `@deepseek-ai/dsh-home-paths` ([`packages/util/home-paths/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/util/home-paths/src/index.ts))
3138
+ - `@deepseek-ai/dsh-hook-protocol` ([`packages/hooks/hook-protocol/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/hooks/hook-protocol/src/index.ts))
3139
+ - `@deepseek-ai/dsh-launch-environment` ([`packages/util/launch-environment/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/util/launch-environment/src/index.ts))
3140
+ - `@deepseek-ai/dsh-llm-mock-server` ([`packages/test-support/llm-mock-server/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/test-support/llm-mock-server/src/index.ts))
3141
+ - `@deepseek-ai/dsh-loader-smoke` ([`packages/test-support/loader-smoke/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/test-support/loader-smoke/src/index.ts))
3142
+ - `@deepseek-ai/dsh-native-command` ([`packages/util/native-command/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/util/native-command/src/index.ts))
3143
+ - `@deepseek-ai/dsh-output-retention` ([`packages/util/output-retention/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/util/output-retention/src/index.ts))
3144
+ - `@deepseek-ai/dsh-sandbox-windows-acl` ([`packages/sandbox/sandbox-windows-acl/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/sandbox/sandbox-windows-acl/src/index.ts))
3145
+ - `@deepseek-ai/dsh-scope` ([`packages/core/scope/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/scope/src/index.ts))
3146
+ - `@deepseek-ai/dsh-sdk-client` ([`packages/sdk/client/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/sdk/client/src/index.ts))
3147
+ - `@deepseek-ai/dsh-sdk-jsonrpc-demo` ([`packages/examples/jsonrpc-demo/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/examples/jsonrpc-demo/src/index.ts))
3148
+ - `@deepseek-ai/dsh-sdk-protocol` ([`packages/sdk/protocol/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/sdk/protocol/src/index.ts))
3149
+ - `@deepseek-ai/dsh-session-telemetry` ([`packages/session/session-telemetry/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-telemetry/src/index.ts))
3150
+ - `@deepseek-ai/dsh-session-title-llm` ([`packages/session/session-title-llm/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/session/session-title-llm/src/index.ts))
3151
+ - `@deepseek-ai/dsh-subagent-in-process-driver` ([`packages/subagent/subagent-in-process-driver/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/subagent/subagent-in-process-driver/src/index.ts))
3152
+ - `@deepseek-ai/dsh-timeout` ([`packages/util/timeout/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/util/timeout/src/index.ts))
3153
+ - `@deepseek-ai/dsh-typert-generator` ([`packages/typert/generator/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/typert/generator/src/index.ts))
3154
+ - `@deepseek-ai/dsh-typert-protocol` ([`packages/typert/protocol/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/typert/protocol/src/index.ts))
3155
+ - `@deepseek-ai/dsh-typert-registry` ([`packages/typert/registry/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/typert/registry/src/index.ts))