@banbolee/dsh-fish-shell 0.4.0 → 0.5.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.
package/README.md CHANGED
@@ -3,7 +3,8 @@
3
3
  Fish shell executors and tool for DeepSeek Harness: run commands with
4
4
  **fish** instead of bash. Distribution-ready and surface-agnostic: works in
5
5
  any profile that mounts it — preset-roster based (dsh-tui, web) or
6
- host-tool based (headless).
6
+ host-tool based (headless) — and under **any agent preset** (standard, ptc,
7
+ cordis, minimal, or a third-party preset).
7
8
 
8
9
  ## What this bundle does
9
10
 
@@ -20,36 +21,104 @@ host-tool based (headless).
20
21
  without a sandbox. For custom compositions that deliberately run without a
21
22
  sandbox; composing it with `dsh-permission-presets` fails loud at load.
22
23
  - **Tool** (`tool.js`, exported as `@banbolee/dsh-fish-shell/tool`): a model-facing
23
- `fish` tool mounted host-globally, executing through `ctx.shell`. It passes
24
- the calling session's resolved sandbox policy (so `/permission` switches
25
- and the session workspace root are honored), collects the managed `DSH_*`
26
- environment from `ctx.shellEnv`, and renders the harness marker contract
27
- (`[exit code: N]`, `[stderr]`, `[sandbox: file access denied under <mode>
28
- mode]`, `[output truncated; full output: <path>]`). Its description teaches
29
- the model fish syntax.
30
- - **Agent preset** (bundled at `presets/fish/`): a copy of the shipped
31
- `standard` preset with the shell section removed (the `fish` tool is
32
- host-global, so the preset needs no shell row). The bundle patch adds the
33
- package's `presets/` directory as a system preset root and switches the
34
- preset-roster default to `fish` for both roster row ids (`agent-presets`
35
- used by web, `dsh-tui-agent-presets` used by dsh-tui). The tool plugin also
36
- installs the preset under `$DSH_HOME/.agent-presets/fish` create-only
37
- (never overwrites an existing file, including a user-authored one; a failed
38
- write is a warning) as a fallback for rosters whose row this bundle does
39
- not patch.
24
+ `fish` tool mounted host-globally, executing through `ctx.shell`. Its
25
+ functional surface is aligned with the official `@deepseek-ai/dsh-tool-bash`
26
+ (with shell wording swapped to fish):
27
+ - **Background execution**: `run_in_background: true` registers the command
28
+ with `ctx.jobs` (`kind: fish`) and returns `{kind: 'background', jobId}`;
29
+ output reads carry the lossy-read and sandbox runner-failure/denial
30
+ notices, and the job controller's `job_output`/`job_kill` handle the rest.
31
+ - **Sandbox escalation**: when the mounted executor confines, the schema
32
+ advertises `sandbox_permissions` + `justification`; an escalation is
33
+ resolved through `ctx.approval` BEFORE anything executes (strictly wider
34
+ modes only, fail-closed), and a denial result carries the same-turn
35
+ escalation hint. Headless compositions (no sandboxing executor) expose
36
+ neither field.
37
+ - **Result facts**: foreground results carry the complete canonical facts,
38
+ including the sandbox `enforcement`/`runnerFailed` fields.
39
+ - **UI presentation**: `presentCall`/`presentResult` render foreground calls
40
+ as terminal cards (with an exit-status pill) and background/error
41
+ outcomes as generic fenced console output.
42
+ - **Exit-code prompt section**: registers the `tool:fish` section
43
+ ("Check the [exit code: N] marker on every fish result…") at the
44
+ `TOOL_BASH` position.
45
+ - On top of all that it passes the calling session's resolved sandbox policy
46
+ (so `/permission` switches and the session workspace root are honored),
47
+ collects the managed `DSH_*` environment from `ctx.shellEnv`, renders the
48
+ harness marker contract (`[exit code: N]`, `[stderr]`, `[sandbox: file
49
+ access denied under <mode> mode]`, `[output truncated; full output:
50
+ <path>]`), and its description teaches the model fish syntax with
51
+ per-result `[fish syntax]` hints.
52
+ - **Per-agent fish policy** (`policy.js`, exported as
53
+ `@banbolee/dsh-fish-shell/policy`): a host-mounted Cordis plugin that makes
54
+ every agent see fish instead of bash **regardless of which agent preset it
55
+ runs under**. The bundle patch disables the base bash executor
56
+ (`bash-sandbox`) and the host bash tool (`tool-bash`), mounts the fish
57
+ executor and the host-global `fish` tool, and leaves presets untouched —
58
+ it no longer changes the roster default, injects preset roots, or writes
59
+ copies under `$DSH_HOME/.agent-presets/`. Presets still register their own
60
+ `bash`-named tool (standard/minimal do), and on `agent/created` (and again
61
+ on every `tools/change`, i.e. after `/preset` recomposes) the policy hides
62
+ that inherited bash tool per agent via
63
+ `agent.ctx.tools.restrict({ deny: ['bash'] })` and shadows the preset's
64
+ static `tool:bash` prompt guidance with an empty agent-scoped section. The
65
+ agent is left with exactly one shell tool: `fish`. Under `minimal` — whose
66
+ standing bash is the persistent PTY form (parameters carry only `command`,
67
+ output schema is a plain string) — the policy first registers a persistent
68
+ `fish` tool at the agent scope (shadowing the one-shot fish) and then
69
+ hides bash, so minimal sessions keep their persistent semantics in fish.
70
+ - **Persistent fish terminal backend** (`terminal-fish.js`, exported as
71
+ `@banbolee/dsh-fish-shell/terminal-fish`): a library — NOT mounted by the
72
+ bundle patch — providing the `fish` PTY backend used by the persistent
73
+ tool. It subclasses the official `BashTerminalBackend`, spawning
74
+ `fish --no-config -i` (config-overridable) with a controlled prompt that
75
+ speaks the harness readiness contract (OSC `133;D;<status>` + `dsh> `),
76
+ confined through the same sandbox policy, with the official
77
+ sandbox-mode fence copied in (the official module does not export it;
78
+ the copy takes an injectable owner-activity check for self-managed use).
79
+ The patch deliberately has no `fish-terminal` host row: the `terminals`
80
+ service is entry-local to the `minimal` preset's isolate realm and
81
+ invisible at the host plane (headless / dsh-tui / composition test
82
+ profiles), so such a row would stay pending forever. `apply` is exported
83
+ for direct assembly and tests (or a composition that explicitly mounts the
84
+ registry).
85
+ - **Persistent fish tool** (`persistent.js`, exported as
86
+ `@banbolee/dsh-fish-shell/persistent`): a fish translation of the official
87
+ `dsh-tool-bash-persistent` pattern — a per-agent cached PTY shell whose
88
+ cwd, variables, and functions survive across calls, with marker-wrapped
89
+ commands, serialized execution, deadline/timeout reset, and scrollback
90
+ reads. It deliberately exports no Cordis `apply`: `policy.js` calls
91
+ `registerPersistentFish(ctx, agentCtx)` at the agent boundary for the
92
+ persistent-bash preset. The PTY is **self-managed**: the tool owns one
93
+ `FishTerminalBackend` instance and drives its sessions directly
94
+ (`backend.spawn(...)`, `session.startSend/read/status/close`) instead of
95
+ going through the `terminals` registry, which agent-scope tools cannot
96
+ resolve (the registry lives only inside the minimal preset's entry-local
97
+ realm). Command quoting uses fish single-quote escaping and `eval` with
98
+ one string argument (fish 4 has no `$'...'` ANSI-C quoting and no
99
+ `eval --`), verified against real fish 4.0.0.
40
100
 
41
101
  ## Install
42
102
 
103
+ **From npm (recommended)** — no clone needed:
104
+
43
105
  ```sh
44
- # from this checkout, per profile:
45
- dsh plugin --profile <name> add ./plugins/fish-shell
106
+ dsh plugin --profile <name> add @banbolee/dsh-fish-shell
46
107
  ```
47
108
 
48
- For a published npm package: `dsh plugin --profile <name> add @banbolee/dsh-fish-shell`.
109
+ From this checkout, per profile:
110
+
111
+ ```sh
112
+ dsh plugin --profile <name> add ./plugins/fish-shell
113
+ ```
49
114
 
50
- Add it to every profile that should default to fish (dsh-tui, web, headless,
51
- …). The bundle patch is a no-op (with a warning) for a roster row id that the
52
- profile does not have, so one patch file is safe across surfaces.
115
+ Add it to every profile that should run fish (dsh-tui, web, headless, …).
116
+ The bundle patch (`cordis.patch.yml`) is one safe patch across surfaces: it
117
+ disables the host bash executor and `tool-bash` rows, mounts the fish
118
+ executor and the host-global `fish` tool, and inserts the
119
+ `fish-preset-policy` row, which hides the preset-inherited `bash` tool per
120
+ agent (restriction + empty `tool:bash` prompt shadow, persistent-fish swap
121
+ under `minimal`). The patch no longer touches the preset roster.
53
122
 
54
123
  ### Deployed copy and the symlink chain
55
124
 
@@ -59,32 +128,57 @@ runtime instance the harness uses — the launcher-maintained
59
128
  `profiles/node_modules/@deepseek-ai/*` symlink chain. A plain `link:` to this
60
129
  checkout (outside the profile tree) would resolve no `@deepseek-ai` package,
61
130
  so the deployed copy lives at `profiles/node_modules/@banbolee/dsh-fish-shell` (inside
62
- the tree). `scripts/sync-to-profile.sh` copies the plugin there after edits
63
- and checks the bundled fish preset for drift against the shipped `standard`
64
- preset; a pnpm `file:` dependency points each profile at the deployed copy. A
131
+ the tree). `scripts/sync-to-profile.sh` copies the plugin there after edits.
132
+ A pnpm `file:` dependency points each profile at the deployed copy. A
65
133
  package published to npm installs normally (its realpath already lies inside
66
134
  the profile tree).
67
135
 
68
136
  ## Per-surface behavior
69
137
 
70
- - **Preset-roster surfaces** (dsh-tui, web): agents compose tools from the
71
- `fish` preset (default) — `standard` minus the shell rows — and see exactly
72
- one shell tool, `fish`. **Upstream presets (`standard`, `code`) are not
73
- fish-safe**: they register a `bash`-named tool that still executes through
74
- the fish executor, so the name/description lie about the shell. Only the
75
- bundled `fish` preset is fish-only. (`minimal` has no one-shot shell tool.)
138
+ - **Preset-roster surfaces** (dsh-tui, web): the roster default is untouched
139
+ (`standard`). The `fish-preset-policy` plugin applies per agent, so an
140
+ agent under **any** preset — `standard`, `ptc`, `cordis`, `minimal`, or a
141
+ plain third-party preset — has its preset-inherited `bash` tool hidden and
142
+ sees exactly one shell tool: `fish`. The preset's static
143
+ `tool:bash` prompt guidance is shadowed (empty agent-scoped section), so
144
+ the model is not told to "check the bash result". Under `minimal` the
145
+ policy detects the preset's persistent bash and swaps in the persistent
146
+ `fish` tool instead, so minimal sessions keep their persistent semantics.
147
+ The persistent PTY is self-managed by the policy (one `FishTerminalBackend`
148
+ driven directly, no `terminals` registry), so it works in every surface —
149
+ the registry is only visible inside the minimal preset's entry-local
150
+ realm, which is exactly why the bundle mounts no `fish-terminal` row.
76
151
  - **Host-tool surfaces** (headless): the agent uses host-plane tools; the
77
152
  disabled host `tool-bash` and the host-global `fish` tool make fish the
78
153
  agent's only shell tool.
79
154
 
80
155
  ## Behavior
81
156
 
82
- - Every shell call spawns a fresh non-login shell (under the configured
157
+ - **One-shot** (standard, ptc, cordis, third-party presets, and headless):
158
+ every shell call spawns a fresh non-login shell (under the configured
83
159
  sandbox backend for `FishSandboxExecutor`); no state (cwd, variables,
84
160
  functions, history) persists between calls.
161
+ - **Persistent** (`minimal` preset, which mounts the persistent PTY bash
162
+ machinery): the agent's `fish` tool keeps one live fish session per agent.
163
+ The current directory, exported variables, and defined functions survive
164
+ across calls; commands run through the tool are serialized; a command that
165
+ exceeds the tool's deadline is interrupted and the shell is reset (the
166
+ next call starts from the workspace with a fresh shell). The persistent
167
+ fish PTY is spawned and driven by the tool itself through a
168
+ `FishTerminalBackend` (no `terminals` registry involved).
85
169
  - Output is bounded per stream by the executor's configured caps; timeouts
86
170
  are clamped to the executor's cap; the model sees the harness marker
87
171
  contract.
172
+ - `run_in_background: true` starts long-running commands as background jobs
173
+ (`kind: fish`) and returns a job id immediately; read output with
174
+ `job_output` and stop it with `job_kill`. Requires the jobs services
175
+ (`@deepseek-ai/dsh-jobs` + `@deepseek-ai/dsh-tool-jobs`) to be composed;
176
+ the tool fails loud when they are not.
177
+ - Under a sandboxing executor, a denied command can be re-run wider in the
178
+ same turn with `sandbox_permissions` (the narrowest wider mode that
179
+ suffices) plus a one-sentence `justification`; the approval prompt raised
180
+ by that retry is how the user consents. Denials are final when approval
181
+ prompts are disabled or the escalation is rejected.
88
182
  - Requires `fish` on PATH; the executors fail loud when it is missing.
89
183
 
90
184
  ## Known Limitations
@@ -92,12 +186,28 @@ the profile tree).
92
186
  - Models default to bash idioms; the `fish` tool description teaches fish
93
187
  syntax, but a command written in bash dialect fails under fish. This is the
94
188
  intended trade of swapping the shell.
95
- - The `fish` tool has no `run_in_background` parameter and no sandbox
96
- escalation (`sandbox_permissions`) parameters yet; long commands must
97
- finish within the timeout, and a denied command cannot be re-run wider
98
- (the executor's `start()` and the approval stack are available to
99
- in-process consumers).
100
- - Upstream presets (`standard`, `code`) are not fish-safe; see
101
- Per-surface behavior.
189
+ - **The legacy bundled `fish` agent preset was removed**: this bundle ships
190
+ no `presets/fish/` directory, the sync script no longer deploys or
191
+ drift-checks one, and no user copy is written under
192
+ `$DSH_HOME/.agent-presets/fish`. A stale user copy of that directory from
193
+ an older bundle version is inert (the roster no longer points at it) and
194
+ can be deleted manually.
195
+ - **Persistent semantics under `minimal`** are provided by the persistent
196
+ `fish` tool (cwd, exported variables, and defined functions survive across
197
+ calls). Like the official persistent bash, a command that overruns the
198
+ deadline is interrupted and the shell is reset; an agent-scoped `fish`
199
+ tool shadows the host-global one-shot tool, so escalation fields
200
+ (`sandbox_permissions`/`justification`) and background execution
201
+ (`run_in_background`) are not part of the persistent surface.
202
+ - **Third-party preset boundaries**: the policy hides a `bash`-named tool
203
+ inherited from the preset. A preset that deliberately excludes the global
204
+ `fish` tool (an allowlist that filters it out) or registers its shell tool
205
+ under a different name is left exactly as authored, with a one-time
206
+ warning per agent — the bundle never mutates a third-party preset.
207
+ - The `fish` tool's model-facing surface is aligned with the official bash
208
+ tool: background execution (`run_in_background` via `ctx.jobs`), sandbox
209
+ escalation (`sandbox_permissions`/`justification` via `ctx.approval`),
210
+ terminal/generic UI presentation, and the `tool:fish` exit-code prompt
211
+ section are all supported.
102
212
  - POSIX only: the `fish` binary and the underlying process-group semantics
103
213
  are not available on Windows (the pwsh family covers Windows).
package/cordis.patch.yml CHANGED
@@ -1,19 +1,42 @@
1
- # @banbolee/dsh-fish-shell bundle: make fish the default shell executor instead of bash.
1
+ # @banbolee/dsh-fish-shell bundle: run commands with fish instead of bash,
2
+ # on every surface and under every agent preset.
2
3
  #
3
- # Works across every surface:
4
- # - dsh-tui / web (agent-preset roster): disables the base bash executor
5
- # (`bash-sandbox`) and the host bash tool (`tool-bash`), mounts the fish
6
- # executor (ctx.shell) and a host-global `fish` tool, and points the
7
- # roster default at the bundled `fish` agent preset (discovered through
8
- # the package's own `presets/` directory, registered below as a system
9
- # preset root).
10
- # - headless (no preset roster; the agent uses host-plane tools): the
11
- # host-global `fish` tool and the disabled `tool-bash` already make fish
12
- # the agent's only shell tool.
4
+ # How it works now:
5
+ # - The base bash executor (`bash-sandbox`) and the host bash tool
6
+ # (`tool-bash`) are disabled at the host plane, the fish executor
7
+ # (ctx.shell) is mounted, and a host-global `fish` tool is registered
8
+ # (`fish-shell` + `tool-fish` rows below). Headless (no preset roster)
9
+ # agents therefore see only the `fish` tool.
10
+ # - Presets are NOT touched: the roster default stays `standard`, and no
11
+ # bundled preset root or user copy is installed. Standard/ptc/cordis/
12
+ # minimal/third-party presets keep registering their own `bash`-named
13
+ # tool at the preset standing scope.
14
+ # - `fish-preset-policy` fixes that per agent at the agent boundary: on
15
+ # `agent/created` and on every `tools/change` (preset recompose) it
16
+ # calls `agent.ctx.tools.restrict({ deny: ['bash'] })` to hide the
17
+ # preset-inherited bash tool and registers an empty agent-scoped
18
+ # `tool:bash` prompt section that shadows the preset's static bash
19
+ # guidance. The agent ends up with exactly one shell tool: `fish`.
13
20
  #
14
- # The model-facing `fish` tool is host-global so every surface sees it; the
15
- # bundled `fish` preset (standard with the shell rows removed) keeps agents
16
- # that select it free of a duplicate or bash shell tool.
21
+ # Boundaries:
22
+ # - `minimal` keeps its persistent PTY bash machinery mounted. When the
23
+ # policy detects the persistent bash form (a `bash` tool whose
24
+ # parameters carry only `command` and whose output schema is a plain
25
+ # string), it registers a persistent `fish` tool at the agent scope
26
+ # (shadowing the host one-shot fish) before hiding bash, so minimal
27
+ # sessions keep their persistent semantics — cwd, variables, and
28
+ # functions survive across calls — in fish.
29
+ # - The persistent fish PTY is SELF-MANAGED by the policy: `persistent.js`
30
+ # owns a `FishTerminalBackend` instance and calls `backend.spawn(...)`
31
+ # directly. Nothing is registered in the `terminals` registry (which is
32
+ # entry-local to the `minimal` preset and invisible at the host/agent
33
+ # plane), so the bundle must NOT mount the `terminal-fish` plugin row
34
+ # here — that would leave the entry pending forever in host-plane
35
+ # profiles (headless, dsh-tui, composition tests) that have no
36
+ # `terminals` service.
37
+ # - A third-party preset that allowlists the global `fish` tool out (or
38
+ # registers its shell tool under a non-`bash` name) is left as authored,
39
+ # with a one-time warning per agent.
17
40
  - id: bash-sandbox
18
41
  disabled: true
19
42
 
@@ -27,21 +50,5 @@
27
50
  - id: tool-fish
28
51
  name: '@banbolee/dsh-fish-shell/tool'
29
52
 
30
- - id: dsh-tui-agent-presets
31
- config:
32
- default: fish
33
- roots: !!js >-
34
- (() => {
35
- const base = ctx.baseUrl
36
- if (!base) return []
37
- const resolvePath = (url) => {
38
- const path = decodeURIComponent(url.pathname)
39
- return /^\/[A-Za-z]:/.test(path) ? path.slice(1) : path
40
- }
41
- const system = new URL('../node_modules/@deepseek-ai/dsh/config/agent-presets/', base)
42
- const own = new URL('./node_modules/@banbolee/dsh-fish-shell/presets/', base)
43
- return [
44
- { path: resolvePath(system), trust: 'system' },
45
- { path: resolvePath(own), trust: 'system' },
46
- ]
47
- })()
53
+ - id: fish-preset-policy
54
+ name: '@banbolee/dsh-fish-shell/policy'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@banbolee/dsh-fish-shell",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Fish shell executors and tool for DeepSeek Harness: run commands with fish instead of bash.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -8,14 +8,19 @@
8
8
  ".": "./index.js",
9
9
  "./local": "./local.js",
10
10
  "./tool": "./tool.js",
11
+ "./policy": "./policy.js",
12
+ "./terminal-fish": "./terminal-fish.js",
13
+ "./persistent": "./persistent.js",
11
14
  "./package.json": "./package.json"
12
15
  },
13
16
  "files": [
14
17
  "index.js",
15
18
  "local.js",
16
19
  "tool.js",
20
+ "policy.js",
21
+ "terminal-fish.js",
22
+ "persistent.js",
17
23
  "cordis.patch.yml",
18
- "presets/",
19
24
  "README.md"
20
25
  ],
21
26
  "dsh": {
@@ -25,18 +30,49 @@
25
30
  },
26
31
  "peerDependencies": {
27
32
  "@deepseek-ai/cordis": "^4.0.2",
33
+ "@deepseek-ai/dsh-agent": "^0.1.5-rc.1",
28
34
  "@deepseek-ai/dsh-bash-local": "^0.1.5-rc.1",
29
35
  "@deepseek-ai/dsh-bash-sandbox": "^0.1.5-rc.1",
30
- "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.1"
36
+ "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.1",
37
+ "@deepseek-ai/dsh-jobs": "^0.1.5-rc.1",
38
+ "@deepseek-ai/dsh-llm": "^0.1.5-rc.1",
39
+ "@deepseek-ai/dsh-sandbox": "^0.1.5-rc.1",
40
+ "@deepseek-ai/dsh-sandbox-policy": "^0.1.5-rc.1",
41
+ "@deepseek-ai/dsh-scope": "^0.1.5-rc.1",
42
+ "@deepseek-ai/dsh-session-projection": "^0.1.5-rc.1",
43
+ "@deepseek-ai/dsh-shell": "^0.1.5-rc.1",
44
+ "@deepseek-ai/dsh-shell-env": "^0.1.5-rc.1",
45
+ "@deepseek-ai/dsh-subprocess": "^0.1.5-rc.1",
46
+ "@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.1",
47
+ "@deepseek-ai/dsh-terminal": "^0.1.5-rc.1",
48
+ "@deepseek-ai/dsh-terminal-bash": "^0.1.5-rc.1",
49
+ "@deepseek-ai/dsh-tools": "^0.1.5-rc.1",
50
+ "@deepseek-ai/dsh-user-approval": "^0.1.5-rc.1"
31
51
  },
32
52
  "devDependencies": {
33
53
  "@deepseek-ai/cordis": "^4.0.2",
54
+ "@deepseek-ai/dsh-agent": "^0.1.5-rc.1",
34
55
  "@deepseek-ai/dsh-bash-local": "^0.1.5-rc.1",
35
56
  "@deepseek-ai/dsh-bash-sandbox": "^0.1.5-rc.1",
36
57
  "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.1",
37
58
  "@deepseek-ai/dsh-invariants": "^0.1.5-rc.1",
59
+ "@deepseek-ai/dsh-jobs": "^0.1.5-rc.1",
60
+ "@deepseek-ai/dsh-llm": "^0.1.5-rc.1",
61
+ "@deepseek-ai/dsh-pwsh-local": "^0.1.5-rc.1",
62
+ "@deepseek-ai/dsh-sandbox": "^0.1.5-rc.1",
63
+ "@deepseek-ai/dsh-sandbox-policy": "^0.1.5-rc.1",
38
64
  "@deepseek-ai/dsh-scope": "^0.1.5-rc.1",
39
- "@deepseek-ai/dsh-shell": "^0.1.5-rc.1"
65
+ "@deepseek-ai/dsh-session-projection": "^0.1.5-rc.1",
66
+ "@deepseek-ai/dsh-shell": "^0.1.5-rc.1",
67
+ "@deepseek-ai/dsh-shell-env": "^0.1.5-rc.1",
68
+ "@deepseek-ai/dsh-subprocess": "^0.1.5-rc.1",
69
+ "@deepseek-ai/dsh-subprocess-local": "^0.1.5-rc.1",
70
+ "@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.1",
71
+ "@deepseek-ai/dsh-terminal": "^0.1.5-rc.1",
72
+ "@deepseek-ai/dsh-terminal-bash": "^0.1.5-rc.1",
73
+ "@deepseek-ai/dsh-tools": "^0.1.5-rc.1",
74
+ "@deepseek-ai/dsh-user-approval": "^0.1.5-rc.1",
75
+ "yaml": "^2.8.0"
40
76
  },
41
77
  "keywords": [
42
78
  "dsh",