dsh-gitbash-shell 0.31.1 → 0.32.1

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.
package/src/shell.js CHANGED
@@ -316,19 +316,16 @@ export class GitBashSandboxExecutor extends SandboxBashExecutor {
316
316
  * @returns {object} the request with the parity facts merged in
317
317
  */
318
318
  /**
319
- * The plugin row's live dialect settings, across eras. dsh 0.1.7 replaced the
320
- * settings namespace API: the service still exists but exposes only
321
- * `describe()` / `update()` — `get(ns)` is gone — so the old read silently
322
- * returned undefined on the new host and the Linux-parity env below never
323
- * applied. The new era reads the row Config's projected values from the form
324
- * descriptors (the same read dsh-agent-lang uses for the `locale` namespace).
319
+ * The plugin row's live dialect settings. The settings service exposes only
320
+ * `describe()` / `update()`, so the row Config's projected values come from
321
+ * the form descriptors (the same read dsh-agent-lang uses for the `locale`
322
+ * namespace).
325
323
  * @returns the row's settings object, or undefined when unavailable.
326
324
  */
327
325
  dialectSettings() {
328
326
  try {
329
327
  const settings = this.ctx && typeof this.ctx.get === 'function' ? this.ctx.get('settings') : undefined
330
328
  if (settings === undefined || settings === null) return undefined
331
- if (typeof settings.get === 'function') return settings.get(SETTINGS_NAMESPACE)
332
329
  if (typeof settings.describe === 'function') {
333
330
  const entry = settings.describe().find((row) => row !== null && typeof row === 'object' && row.ns === SETTINGS_NAMESPACE)
334
331
  return entry === undefined ? undefined : entry.value
@@ -1,282 +0,0 @@
1
- # ERA (persona-split): dsh >= 0.1.3-alpha.2 text — the persona row uses the
2
- # `prefix:`/`suffix:` keys (40792330c0 split dsh-persona single text key).
3
- # The pre-split texts live in the sibling files named in the banner below; the
4
- # plugin probes the roster AND the persona form at materialization and writes
5
- # the picked text as the preset own agent.cordis.yml.
6
- # ERA: dsh >= 0.1.2 text (built-in preset id `ptc`, presented with mode: ptc).
7
- # The dsh <= 0.1.1 era text (built-in id `code`) lives in agent.cordis.yml; the
8
- # plugin probes the roster at materialization and writes the picked text as the
9
- # preset's own agent.cordis.yml.
10
- # The `ptc` agent preset: the standard coding agent, presented as PTC mode.
11
- #
12
- # Most of `standard` is here unchanged. The deliberate exception is the
13
- # general-purpose `workflow` tool: PTC mode uses `run_code` as its model-authored
14
- # composition surface. The `tool-presentation` row turns the remaining registry
15
- # into a generated SDK, so a sequence that would be five round trips becomes one.
16
- #
17
- # The registry itself stays on the host plane — the agent loop's scheduler and
18
- # the API proxy's presenters are its consumers — so what this preset owns is
19
- # the PRESENTATION of that registry for this agent alone. Native sessions run
20
- # beside this one in the same process, each seeing its own catalog.
21
- #
22
- # This file is an AGENT-PLANE composition. It is mounted under one agent's
23
- # scope context, so every tool and prompt section it registers belongs to that
24
- # session alone. The host composition (`base.cordis.yml` + `web.cordis.yml`)
25
- # keeps everything a preset must not own: the registries themselves, the
26
- # sandbox and approval stack, persistence, and the model route.
27
- #
28
- # A service row here MUST sit inside a group carrying an `isolate` realm.
29
- # Without one it publishes into the root realm, where it is process-global
30
- # rather than per-session and the second session mounting this preset collides
31
- # with the first; `dsh-agent-presets` rejects that at mount. `true` means an
32
- # entry-local realm — one private instance per mounted session, which is the
33
- # default this deployment wants. A shared label would instead pool one instance
34
- # across every session naming it.
35
-
36
- # ── identity ────────────────────────────────────────────────────────────────
37
-
38
- # The preset's own persona, shadowing the deployment default for this agent.
39
- # `{{model}}` and `{{cwd}}` resolve from the agent's own route and workspace.
40
- - id: persona
41
- name: '@deepseek-ai/dsh-persona'
42
- config:
43
- suffix: Your working directory is {{cwd}}.
44
- prefix: >-
45
- You are a coding agent powered by the {{model}} model.
46
-
47
- - id: agent-instructions
48
- name: '@deepseek-ai/dsh-agent-instructions'
49
- config:
50
- maxBytes: 65536
51
-
52
- # ── shell ───────────────────────────────────────────────────────────────────
53
-
54
- # `shell-env` stays in the HOST composition: `apps/cli/src/web.ts` injects it to
55
- # publish `DSH_WEB_URL`/`DSH_WEB_MODE`, and a host row that injects a service is
56
- # the criterion for host-plane ownership — injection resolves before any session
57
- # exists, so there is no agent to key by. Behind a preset realm those variables
58
- # never reached the model's shell at all. Both shell tools consume the host
59
- # registry from here; the host executor is the Git Bash provider (`dsh-gitbash-shell`)
60
- # host-plane too.
61
- - id: tool-bash
62
- name: '@deepseek-ai/dsh-tool-bash'
63
- # Git Bash on Windows: the host executor is dsh-gitbash-shell (see $DSH_HOME/cordis.patch.yml).
64
- disabled: false
65
-
66
- - id: tool-pwsh
67
- name: '@deepseek-ai/dsh-tool-pwsh'
68
- disabled: true
69
-
70
- # ── filesystem ──────────────────────────────────────────────────────────────
71
-
72
- # Both register into the host `tools` registry and provide nothing, so
73
- # they need no realm. The `fs` service and its policy stay in the host.
74
- - id: tool-fs
75
- name: '@deepseek-ai/dsh-tool-fs'
76
-
77
- - id: tool-fs-search
78
- name: '@deepseek-ai/dsh-tool-fs-search'
79
- config:
80
- sampleOverCapGlobResults: false
81
-
82
- # ── background jobs ────────────────────────────────────────────────────────
83
-
84
- # Only the model-facing controls. The task REGISTRY stays on the host plane:
85
- # its producers sit outside any realm this file could put it in — `tool-bash`
86
- # above resolves it with `ctx.get`, and an entry-local realm here is invisible
87
- # to every sibling row, so `run_in_background` would answer "background jobs
88
- # unavailable" while these controls sat in the catalog. The registry is keyed by
89
- # owning agent anyway, so one host instance serves every session. What a preset
90
- # chooses is whether its agent can collect and stop background work at all.
91
- - id: tool-jobs
92
- name: '@deepseek-ai/dsh-tool-jobs'
93
-
94
- # ── skills ──────────────────────────────────────────────────────────────────
95
-
96
- # The skill REGISTRY lives in the host composition and is layered per scope:
97
- # these rows register into THIS preset's layer of it, so they need no realm.
98
- # `skill-filesystem` contributes local-root discovery for agents on this preset, and
99
- # `tool-skill` gives them the catalog and loader; the merged catalog also
100
- # carries whatever the deployment registered globally (repository plugins).
101
- - id: skill-filesystem
102
- name: '@deepseek-ai/dsh-skill-filesystem'
103
-
104
- - id: tool-skill
105
- name: '@deepseek-ai/dsh-tool-skill'
106
-
107
- # ── goals ───────────────────────────────────────────────────────────────────
108
-
109
- # The goal service and session driver stay on the host plane, where the Gateway
110
- # can resolve them. The human command and model-facing tool register into this
111
- # preset's scoped layers.
112
- - id: command-goal
113
- name: '@deepseek-ai/dsh-command-goal'
114
-
115
- - id: tool-goal
116
- name: '@deepseek-ai/dsh-tool-goal'
117
-
118
- # ── plan mode ───────────────────────────────────────────────────────────────
119
-
120
- # Plan state is per-agent by nature, so an entry-local realm is not a
121
- # workaround here — it is the correct lifetime.
122
- - id: planning
123
- name: cordis:group
124
- group: true
125
- isolate:
126
- planMode: true
127
- config:
128
- - id: plan-mode
129
- name: '@deepseek-ai/dsh-plan-mode'
130
- config:
131
- section: |
132
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
133
-
134
- Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
135
-
136
- The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
137
-
138
- Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
139
-
140
- Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
141
-
142
- When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
143
-
144
- # ── compaction ──────────────────────────────────────────────────────────────
145
-
146
- # `compaction-basic` reads `toolResultPrune` through `ctx.get`, so the pruner must
147
- # share this realm rather than sit outside it.
148
- #
149
- # `tokenMeter` is deliberately NOT in this realm: the meter stays on the HOST
150
- # plane, and the rows here resolve that one instance. It takes no configuration,
151
- # keys every fold by Session, and owns the context-meter projection units the
152
- # browser reads for every session — behind a realm those units would come and go
153
- # with whichever presets happen to be mounted. What a preset chooses is whether
154
- # its agent compacts at all, which is `compaction-basic` below.
155
- - id: compaction
156
- name: cordis:group
157
- group: true
158
- isolate:
159
- compaction: true
160
- toolResultPruner: true
161
- config:
162
- - id: compaction-basic
163
- name: '@deepseek-ai/dsh-compaction-basic'
164
-
165
- - id: command-compact
166
- name: '@deepseek-ai/dsh-command-compact'
167
-
168
- - id: tool-result-pruner
169
- name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
170
- config:
171
- thresholdChars: 8192
172
- headChars: 4096
173
- tailChars: 1024
174
-
175
- # ── delegation and workflows ────────────────────────────────────────────────
176
-
177
- # The `subagents` registry and its spawn/fork backends live in the HOST
178
- # composition: the registry is a process singleton whose cross-session queries
179
- # the api-proxy serves to the browser, and a provider name may only be
180
- # registered once. This preset contributes the delegation TOOLS, which resolve
181
- # that host registry.
182
- #
183
- # `workflows` is different — nothing outside an agent reads it — so every row
184
- # that reaches it shares one entry-local realm here, and a consumer left
185
- # outside would resolve a host registry this preset does not populate.
186
- - id: delegation
187
- name: cordis:group
188
- group: true
189
- isolate:
190
- workflowEngine: true
191
- config:
192
- - id: tool-subagent-control
193
- name: '@deepseek-ai/dsh-tool-subagent-control'
194
-
195
- - id: tool-subagent-list-agents
196
- name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
197
-
198
- - id: tool-subagent
199
- name: '@deepseek-ai/dsh-tool-subagent'
200
- config:
201
- provider: spawn
202
- toolName: subagent
203
- modelSelectionSettings: true
204
- backgroundMode: continuable
205
-
206
- # Fork omits model selection so provider/model stay equal to the parent and
207
- # the inherited history remains eligible for KV Cache reuse. This preset
208
- # keeps fork continuable; parent and child inherit the same messaging tool,
209
- # while the parent id and return guidance follow the inherited history.
210
- - id: tool-subagent-fork
211
- name: '@deepseek-ai/dsh-tool-subagent'
212
- config:
213
- provider: fork
214
- toolName: subagent_fork
215
- backgroundMode: continuable
216
-
217
- # Production dsh does not install these optional providers. Install the
218
- # matching Bundle in this Profile and restart the Host, then copy this
219
- # preset and remove `disabled` from the matching tool row. Host availability
220
- # alone grants no tool.
221
- - id: tool-subagent-codex
222
- name: '@deepseek-ai/dsh-tool-subagent'
223
- disabled: true
224
- config:
225
- provider: codex
226
- toolName: subagent_codex
227
- backgroundMode: one-shot
228
- maxDepth: provider-managed
229
-
230
- - id: tool-subagent-claude-code
231
- name: '@deepseek-ai/dsh-tool-subagent'
232
- disabled: true
233
- config:
234
- provider: claude-code
235
- toolName: subagent_claude_code
236
- backgroundMode: one-shot
237
- maxDepth: provider-managed
238
-
239
- - id: workflow-worker-thread
240
- name: '@deepseek-ai/dsh-workflow-worker-thread'
241
- config:
242
- provider: spawn
243
-
244
- - id: tool-workflow
245
- name: '@deepseek-ai/dsh-tool-workflow'
246
- # Keep the engine above for `ralph`, but do not publish a second
247
- # model-authored orchestration surface beside `run_code` in PTC mode.
248
- disabled: true
249
-
250
- - id: tool-ralph
251
- name: '@deepseek-ai/dsh-tool-ralph'
252
- config:
253
- subagentProvider: spawn
254
- maxRounds: 64
255
-
256
- # ── remaining model-facing rows ─────────────────────────────────────────────
257
-
258
- - id: tool-ask-user
259
- name: '@deepseek-ai/dsh-tool-ask-user'
260
-
261
- - id: tool-todo
262
- name: '@deepseek-ai/dsh-tool-todo'
263
- config:
264
- allowParallelInProgress: true
265
-
266
- # The `web` service and its search provider stay in the host composition; only
267
- # the model-facing tool is per-session.
268
- - id: tool-web
269
- name: '@deepseek-ai/dsh-tool-web'
270
- config:
271
- fetch: true
272
- searchTimeoutMs: 60000
273
-
274
- # ── presentation ────────────────────────────────────────────────────────────
275
-
276
- # PTC mode for this agent alone. The row waits for the host's `codeRuntime`
277
- # rather than assuming it: a deployment that composes no TypeScript runtime
278
- # fails this preset at mount, naming this id, instead of at the first request.
279
- - id: tool-presentation
280
- name: '@deepseek-ai/dsh-agent-tool-presentation'
281
- config:
282
- mode: ptc
@@ -1,276 +0,0 @@
1
- # ERA: dsh >= 0.1.2 text (built-in preset id `ptc`, presented with mode: ptc).
2
- # The dsh <= 0.1.1 era text (built-in id `code`) lives in agent.cordis.yml; the
3
- # plugin probes the roster at materialization and writes the picked text as the
4
- # preset's own agent.cordis.yml.
5
- # The `ptc` agent preset: the standard coding agent, presented as PTC mode.
6
- #
7
- # Most of `standard` is here unchanged. The deliberate exception is the
8
- # general-purpose `workflow` tool: PTC mode uses `run_code` as its model-authored
9
- # composition surface. The `tool-presentation` row turns the remaining registry
10
- # into a generated SDK, so a sequence that would be five round trips becomes one.
11
- #
12
- # The registry itself stays on the host plane — the agent loop's scheduler and
13
- # the API proxy's presenters are its consumers — so what this preset owns is
14
- # the PRESENTATION of that registry for this agent alone. Native sessions run
15
- # beside this one in the same process, each seeing its own catalog.
16
- #
17
- # This file is an AGENT-PLANE composition. It is mounted under one agent's
18
- # scope context, so every tool and prompt section it registers belongs to that
19
- # session alone. The host composition (`base.cordis.yml` + `web.cordis.yml`)
20
- # keeps everything a preset must not own: the registries themselves, the
21
- # sandbox and approval stack, persistence, and the model route.
22
- #
23
- # A service row here MUST sit inside a group carrying an `isolate` realm.
24
- # Without one it publishes into the root realm, where it is process-global
25
- # rather than per-session and the second session mounting this preset collides
26
- # with the first; `dsh-agent-presets` rejects that at mount. `true` means an
27
- # entry-local realm — one private instance per mounted session, which is the
28
- # default this deployment wants. A shared label would instead pool one instance
29
- # across every session naming it.
30
-
31
- # ── identity ────────────────────────────────────────────────────────────────
32
-
33
- # The preset's own persona, shadowing the deployment default for this agent.
34
- # `{{model}}` and `{{cwd}}` resolve from the agent's own route and workspace.
35
- - id: persona
36
- name: '@deepseek-ai/dsh-persona'
37
- config:
38
- text: >-
39
- You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.
40
-
41
- - id: agent-instructions
42
- name: '@deepseek-ai/dsh-agent-instructions'
43
- config:
44
- maxBytes: 65536
45
-
46
- # ── shell ───────────────────────────────────────────────────────────────────
47
-
48
- # `shell-env` stays in the HOST composition: `apps/cli/src/web.ts` injects it to
49
- # publish `DSH_WEB_URL`/`DSH_WEB_MODE`, and a host row that injects a service is
50
- # the criterion for host-plane ownership — injection resolves before any session
51
- # exists, so there is no agent to key by. Behind a preset realm those variables
52
- # never reached the model's shell at all. Both shell tools consume the host
53
- # registry from here; the host executor is the Git Bash provider (`dsh-gitbash-shell`)
54
- # host-plane too.
55
- - id: tool-bash
56
- name: '@deepseek-ai/dsh-tool-bash'
57
- # Git Bash on Windows: the host executor is dsh-gitbash-shell (see $DSH_HOME/cordis.patch.yml).
58
- disabled: false
59
-
60
- - id: tool-pwsh
61
- name: '@deepseek-ai/dsh-tool-pwsh'
62
- disabled: true
63
-
64
- # ── filesystem ──────────────────────────────────────────────────────────────
65
-
66
- # Both register into the host `tools` registry and provide nothing, so
67
- # they need no realm. The `fs` service and its policy stay in the host.
68
- - id: tool-fs
69
- name: '@deepseek-ai/dsh-tool-fs'
70
-
71
- - id: tool-fs-search
72
- name: '@deepseek-ai/dsh-tool-fs-search'
73
- config:
74
- sampleOverCapGlobResults: false
75
-
76
- # ── background jobs ────────────────────────────────────────────────────────
77
-
78
- # Only the model-facing controls. The task REGISTRY stays on the host plane:
79
- # its producers sit outside any realm this file could put it in — `tool-bash`
80
- # above resolves it with `ctx.get`, and an entry-local realm here is invisible
81
- # to every sibling row, so `run_in_background` would answer "background jobs
82
- # unavailable" while these controls sat in the catalog. The registry is keyed by
83
- # owning agent anyway, so one host instance serves every session. What a preset
84
- # chooses is whether its agent can collect and stop background work at all.
85
- - id: tool-jobs
86
- name: '@deepseek-ai/dsh-tool-jobs'
87
-
88
- # ── skills ──────────────────────────────────────────────────────────────────
89
-
90
- # The skill REGISTRY lives in the host composition and is layered per scope:
91
- # these rows register into THIS preset's layer of it, so they need no realm.
92
- # `skill-filesystem` contributes local-root discovery for agents on this preset, and
93
- # `tool-skill` gives them the catalog and loader; the merged catalog also
94
- # carries whatever the deployment registered globally (repository plugins).
95
- - id: skill-filesystem
96
- name: '@deepseek-ai/dsh-skill-filesystem'
97
-
98
- - id: tool-skill
99
- name: '@deepseek-ai/dsh-tool-skill'
100
-
101
- # ── goals ───────────────────────────────────────────────────────────────────
102
-
103
- # The goal service and session driver stay on the host plane, where the Gateway
104
- # can resolve them. The human command and model-facing tool register into this
105
- # preset's scoped layers.
106
- - id: command-goal
107
- name: '@deepseek-ai/dsh-command-goal'
108
-
109
- - id: tool-goal
110
- name: '@deepseek-ai/dsh-tool-goal'
111
-
112
- # ── plan mode ───────────────────────────────────────────────────────────────
113
-
114
- # Plan state is per-agent by nature, so an entry-local realm is not a
115
- # workaround here — it is the correct lifetime.
116
- - id: planning
117
- name: cordis:group
118
- group: true
119
- isolate:
120
- planMode: true
121
- config:
122
- - id: plan-mode
123
- name: '@deepseek-ai/dsh-plan-mode'
124
- config:
125
- section: |
126
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
127
-
128
- Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
129
-
130
- The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
131
-
132
- Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
133
-
134
- Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
135
-
136
- When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
137
-
138
- # ── compaction ──────────────────────────────────────────────────────────────
139
-
140
- # `compaction-basic` reads `toolResultPrune` through `ctx.get`, so the pruner must
141
- # share this realm rather than sit outside it.
142
- #
143
- # `tokenMeter` is deliberately NOT in this realm: the meter stays on the HOST
144
- # plane, and the rows here resolve that one instance. It takes no configuration,
145
- # keys every fold by Session, and owns the context-meter projection units the
146
- # browser reads for every session — behind a realm those units would come and go
147
- # with whichever presets happen to be mounted. What a preset chooses is whether
148
- # its agent compacts at all, which is `compaction-basic` below.
149
- - id: compaction
150
- name: cordis:group
151
- group: true
152
- isolate:
153
- compaction: true
154
- toolResultPruner: true
155
- config:
156
- - id: compaction-basic
157
- name: '@deepseek-ai/dsh-compaction-basic'
158
-
159
- - id: command-compact
160
- name: '@deepseek-ai/dsh-command-compact'
161
-
162
- - id: tool-result-pruner
163
- name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
164
- config:
165
- thresholdChars: 8192
166
- headChars: 4096
167
- tailChars: 1024
168
-
169
- # ── delegation and workflows ────────────────────────────────────────────────
170
-
171
- # The `subagents` registry and its spawn/fork backends live in the HOST
172
- # composition: the registry is a process singleton whose cross-session queries
173
- # the api-proxy serves to the browser, and a provider name may only be
174
- # registered once. This preset contributes the delegation TOOLS, which resolve
175
- # that host registry.
176
- #
177
- # `workflows` is different — nothing outside an agent reads it — so every row
178
- # that reaches it shares one entry-local realm here, and a consumer left
179
- # outside would resolve a host registry this preset does not populate.
180
- - id: delegation
181
- name: cordis:group
182
- group: true
183
- isolate:
184
- workflowEngine: true
185
- config:
186
- - id: tool-subagent-control
187
- name: '@deepseek-ai/dsh-tool-subagent-control'
188
-
189
- - id: tool-subagent-list-agents
190
- name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
191
-
192
- - id: tool-subagent
193
- name: '@deepseek-ai/dsh-tool-subagent'
194
- config:
195
- provider: spawn
196
- toolName: subagent
197
- modelSelectionSettings: true
198
- backgroundMode: continuable
199
-
200
- # Fork omits model selection so provider/model stay equal to the parent and
201
- # the inherited history remains eligible for KV Cache reuse. This preset
202
- # keeps fork continuable; parent and child inherit the same messaging tool,
203
- # while the parent id and return guidance follow the inherited history.
204
- - id: tool-subagent-fork
205
- name: '@deepseek-ai/dsh-tool-subagent'
206
- config:
207
- provider: fork
208
- toolName: subagent_fork
209
- backgroundMode: continuable
210
-
211
- # Production dsh does not install these optional providers. Install the
212
- # matching Bundle in this Profile and restart the Host, then copy this
213
- # preset and remove `disabled` from the matching tool row. Host availability
214
- # alone grants no tool.
215
- - id: tool-subagent-codex
216
- name: '@deepseek-ai/dsh-tool-subagent'
217
- disabled: true
218
- config:
219
- provider: codex
220
- toolName: subagent_codex
221
- backgroundMode: one-shot
222
- maxDepth: provider-managed
223
-
224
- - id: tool-subagent-claude-code
225
- name: '@deepseek-ai/dsh-tool-subagent'
226
- disabled: true
227
- config:
228
- provider: claude-code
229
- toolName: subagent_claude_code
230
- backgroundMode: one-shot
231
- maxDepth: provider-managed
232
-
233
- - id: workflow-worker-thread
234
- name: '@deepseek-ai/dsh-workflow-worker-thread'
235
- config:
236
- provider: spawn
237
-
238
- - id: tool-workflow
239
- name: '@deepseek-ai/dsh-tool-workflow'
240
- # Keep the engine above for `ralph`, but do not publish a second
241
- # model-authored orchestration surface beside `run_code` in PTC mode.
242
- disabled: true
243
-
244
- - id: tool-ralph
245
- name: '@deepseek-ai/dsh-tool-ralph'
246
- config:
247
- subagentProvider: spawn
248
- maxRounds: 64
249
-
250
- # ── remaining model-facing rows ─────────────────────────────────────────────
251
-
252
- - id: tool-ask-user
253
- name: '@deepseek-ai/dsh-tool-ask-user'
254
-
255
- - id: tool-todo
256
- name: '@deepseek-ai/dsh-tool-todo'
257
- config:
258
- allowParallelInProgress: true
259
-
260
- # The `web` service and its search provider stay in the host composition; only
261
- # the model-facing tool is per-session.
262
- - id: tool-web
263
- name: '@deepseek-ai/dsh-tool-web'
264
- config:
265
- fetch: true
266
- searchTimeoutMs: 60000
267
-
268
- # ── presentation ────────────────────────────────────────────────────────────
269
-
270
- # PTC mode for this agent alone. The row waits for the host's `codeRuntime`
271
- # rather than assuming it: a deployment that composes no TypeScript runtime
272
- # fails this preset at mount, naming this id, instead of at the first request.
273
- - id: tool-presentation
274
- name: '@deepseek-ai/dsh-agent-tool-presentation'
275
- config:
276
- mode: ptc