@openma/deepseek-harness-acp 0.4.4 → 0.4.6

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
@@ -1,126 +1,162 @@
1
- # ACP adapter for DeepSeek Harness
2
-
3
- Use [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) from [Agent Client Protocol](https://agentclientprotocol.com/) clients such as [Zed](https://zed.dev).
4
-
5
- `@openma/deepseek-harness-acp` is a **dsh profile plugin** (a harness bundle) and a standalone stdio ACP server. In both shapes it maps the harness session-event log onto the full ACP update vocabulary and reuses your existing dsh setup — including the API key you saved in the dsh Web UI. No credentials in your editor config.
6
-
7
- ## Install (recommended: as a dsh plugin)
8
-
9
- **1. Have DeepSeek Harness** (you probably already do):
1
+ <p align="center">
2
+ <img src="assets/acp-x-deepseek.svg" width="520" alt="Agent Client Protocol × DeepSeek Harness" />
3
+ </p>
4
+
5
+ <h1 align="center">deepseek-harness-acp</h1>
6
+
7
+ <p align="center">
8
+ Use <a href="https://github.com/deepseek-ai/deepseek-harness">DeepSeek Harness</a> from
9
+ <a href="https://agentclientprotocol.com/">Agent Client Protocol</a> clients such as
10
+ <a href="https://zed.dev">Zed</a>.
11
+ </p>
12
+
13
+ <p align="center">
14
+ <a href="https://www.npmjs.com/package/@openma/deepseek-harness-acp"><img src="https://img.shields.io/npm/v/%40openma%2Fdeepseek-harness-acp?logo=npm&color=cb3837" alt="npm version" /></a>
15
+ <a href="https://www.npmjs.com/package/@openma/deepseek-harness-acp"><img src="https://img.shields.io/npm/dm/%40openma%2Fdeepseek-harness-acp" alt="npm downloads" /></a>
16
+ <a href="https://github.com/openma-ai/deepseek-harness-acp/actions/workflows/ci.yml"><img src="https://github.com/openma-ai/deepseek-harness-acp/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
17
+ <a href="https://agentclientprotocol.com/"><img src="https://img.shields.io/badge/ACP-protocol%20v1-6f42c1" alt="ACP protocol v1" /></a>
18
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue" alt="Apache-2.0" /></a>
19
+ <img src="https://img.shields.io/node/v/%40openma%2Fdeepseek-harness-acp" alt="node >= 22.15" />
20
+ </p>
21
+
22
+ ---
23
+
24
+ The adapter composes the harness **in-process** and maps its session-event log
25
+ onto the full ACP vocabulary: streamed text and reasoning, tool calls with
26
+ diffs and display terminals, plans, permission requests, session modes,
27
+ config options, slash commands, skills, and MCP servers. Credentials never
28
+ touch your editor config — it reuses the key you saved in the dsh Web UI, or
29
+ `dsh-acp login` saves one to the same store.
30
+
31
+ ## Two ways to plug it in
32
+
33
+ | | **A · Standalone server** | **B · dsh profile plugin** |
34
+ |---|---|---|
35
+ | Best for | Getting started in one command | Living inside your dsh setup |
36
+ | Install | `npm i -g @openma/deepseek-harness-acp` | `dsh plugin --profile acp add -w @openma/deepseek-harness-acp` |
37
+ | Zed runs | `dsh-acp` | `dsh --profile acp` |
38
+ | Harness | Your installed dsh — or the vendored fallback when none exists | The dsh that owns the profile |
39
+ | Composition | dsh-base + this bundle (profile machinery booted in-process) | dsh-base + this bundle + your profile's own patches |
40
+
41
+ Both shapes share `$DSH_HOME`: the same credential store, settings, presets,
42
+ and session logs as `dsh web` — conversations started in the Web UI can be
43
+ listed and loaded from the editor.
44
+
45
+ ### A · Standalone server
10
46
 
11
47
  ```bash
12
- npm install -g @deepseek-ai/dsh
13
- dsh web # first run: save your DeepSeek API key in Settings → Models
14
- ```
15
-
16
- **2. Add the ACP bundle to a profile:**
17
-
18
- ```bash
19
- dsh plugin --profile acp add -w @openma/deepseek-harness-acp
48
+ npm install -g @openma/deepseek-harness-acp
49
+ dsh-acp login # interactive; or save the key in the dsh Web UI
20
50
  ```
21
51
 
22
- This creates `$DSH_HOME/profiles/acp`, installs the package, and registers the
23
- bundle (its `dsh.bundle` patch mounts the bridge over `@deepseek-ai/dsh-base`
24
- — the same product baseline as `dsh web`, with the module-reload watcher off).
25
-
26
- **3. Point Zed at it** (`settings.json`):
27
-
28
52
  ```jsonc
53
+ // Zed settings.json
29
54
  {
30
55
  "agent_servers": {
31
- "DeepSeek Harness": {
32
- "command": "dsh",
33
- "args": ["--profile", "acp"]
34
- }
56
+ "DeepSeek Harness": { "command": "dsh-acp" }
35
57
  }
36
58
  }
37
59
  ```
38
60
 
39
- That's it — no `env`, no keys in the editor. Credentials come from the
40
- harness's own credential store (`$DSH_HOME/.credentials.yaml`, the file the
41
- Web UI writes, hot-reloaded), with the process environment
42
- (`DEEPSEEK_API_KEY` / `DEEPSEEK_BASE_URL`) as a fallback layer.
43
-
44
- Because the profile rides `dsh-base`, the agent in your editor is the full
45
- product: sandboxed bash and filesystem tools, todo plans, skills, subagents,
46
- workflows, web search, plan mode, LLM session titles, compaction — and it
47
- shares `$DSH_HOME/sessions`, so conversations started in the dsh Web UI can
48
- be listed and loaded from the editor.
49
-
50
- **MCP servers** configured in your client (Zed context servers, for example)
51
- are attached per session: each `session/new` server entry mounts a
52
- `@deepseek-ai/dsh-mcp-client` instance (stdio and streamable HTTP
53
- transports), whose tools join the agent as `mcp__<server>__<tool>`. A server
54
- that fails to start never takes the session down.
61
+ Self-contained: it finds your DeepSeek Harness via `--dsh-path` / `DSH_PATH`,
62
+ its own tree, `./node_modules`, `dsh` on PATH, or `npm root -g` — and ships a
63
+ vendored harness runtime as the **last** candidate, so it works out of the box
64
+ and always prefers the dsh you installed. When a real
65
+ `$DSH_HOME/profiles/acp` exists, that profile owns the composition.
55
66
 
56
- Override provider/model per profile in `$DSH_HOME/profiles/acp/cordis.patch.yml`
57
- (id-targeted patch on the `acp-bridge` row), or via `DSH_MODEL` /
58
- `DSH_PERMISSION_MODE` in the launch environment.
59
-
60
- ## Install (alternative: standalone server)
61
-
62
- The package is also a self-contained ACP server that attaches to a DeepSeek
63
- Harness installation — the way codex-acp runs the Codex you point it at:
67
+ ### B · dsh profile plugin
64
68
 
65
69
  ```bash
66
- npm install -g @openma/deepseek-harness-acp
67
- dsh-acp --help
70
+ npm install -g @deepseek-ai/dsh
71
+ dsh web # save your API key once
72
+ dsh plugin --profile acp add -w @openma/deepseek-harness-acp
68
73
  ```
69
74
 
70
75
  ```jsonc
76
+ // Zed settings.json
71
77
  {
72
78
  "agent_servers": {
73
- "DeepSeek Harness": {
74
- "command": "dsh-acp",
75
- "args": [] // optional: ["--dsh-path", "/path/to/dsh"]
76
- }
79
+ "DeepSeek Harness": { "command": "dsh", "args": ["--profile", "acp"] }
77
80
  }
78
81
  }
79
82
  ```
80
83
 
81
- It finds the harness via `--dsh-path`/`DSH_PATH`, its own tree,
82
- `./node_modules`, `dsh` on PATH, or `npm root -g` — and composes a fixed
83
- coding-agent tree from it (spine, sandboxed bash/fs, todo, compaction). Use
84
- this mode when you want an ACP server without creating a profile; use the
85
- profile mode when you want your full dsh composition in the editor.
84
+ This creates `$DSH_HOME/profiles/acp` and registers the package's
85
+ `dsh.bundle` patch: the bridge mounts over `@deepseek-ai/dsh-base` — the same
86
+ product baseline as `dsh web`, with the module-reload watcher off. Extend the
87
+ profile in `$DSH_HOME/profiles/acp/cordis.patch.yml` like any other dsh
88
+ profile.
89
+
90
+ ## Authentication
91
+
92
+ No keys in editor config, no secrets pasted into chat. ACP clients follow
93
+ the protocol: `initialize` advertises three **Agent Auth** methods.
94
+
95
+ 1. **API key** — `api-key`, or `api-key:<provider>` when more than one
96
+ route is live. The client may pass `_meta["api-key"].apiKey`.
97
+ 2. **Browser** — `browser`. The adapter opens a localhost sign-in page;
98
+ the secret never travels over ACP. Hidden when `NO_BROWSER` is set.
99
+ 3. **Custom gateway** — `gateway`, only when the client opts in with
100
+ `clientCapabilities.auth._meta.gateway === true`. The client sends
101
+ `_meta.gateway` `{ baseUrl, headers, providerName? }`.
102
+
103
+ The adapter writes credentials to the harness store. Missing credentials
104
+ fail `session/new` and `session/prompt` with `auth_required` (`-32000`).
105
+ Logout is the ACP `logout` method.
106
+
107
+ 1. **Harness credential store** — `$DSH_HOME/.credentials.yaml` (mode 600),
108
+ the file the dsh Web UI writes; hot-reloaded. Save a key with
109
+ `dsh-acp login [--provider <route>]`, or the Web UI (Settings → Models).
110
+ 2. **Process environment** — `DEEPSEEK_API_KEY` / `DEEPSEEK_BASE_URL` (and
111
+ the matching `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` for those routes) in
112
+ the environment that launches the agent.
113
+
114
+ The credential gate is the **current provider route**. An Anthropic-only
115
+ store is enough for an Anthropic session; a DeepSeek key does not unlock
116
+ another provider.
86
117
 
87
118
  ## Features
88
119
 
89
- - Streamed assistant text and reasoning (`agent_message_chunk` / `agent_thought_chunk`), with assembled-message fallback when an adapter emits no deltas.
90
- - Tool calls with ACP kinds, human titles, file locations, raw input/output — and real file diffs sourced from the fs tool's hunk metadata.
91
- - `todo_write` snapshots as ACP plans; token accounting as `usage_update` (context pressure) plus per-turn `PromptResponse.usage`.
92
- - Real cancellation: `session/cancel` interrupts the live turn through the harness agent, not by killing a process.
93
- - Permission requests: sandboxed wider-access retries surface as `session/request_permission` with allow-once / always-allow / reject options.
94
- - Session modes mapped to the harness sandbox policy: `read-only`, `workspace-write`, `danger-full-access` — switchable per session at runtime.
95
- - Model switching through session config options (`session/set_config_option`), preserving full conversation history via durable resume.
96
- - `session/load` with complete history replay from JSONL persistence, `session/list` from the same store, session titles as `session_info_update`.
97
- - Slash commands (`/status`) advertised through `available_commands_update`.
98
- - Env-var auth method advertisement (`DEEPSEEK_API_KEY`), honored by `authenticate`.
120
+ - **Streaming** — assistant text and reasoning deltas; assembled-message fallback.
121
+ - **Tool calls** — ACP kinds, human titles, file locations, real diffs from fs-tool hunks, raw input/output; command output on a **display terminal** when the client supports one, fenced output otherwise.
122
+ - **Permission presets as session modes** — `read-only` / `workspace-write` / `danger-full-access`, each a named `{sandbox, approval}` pair recorded as a durable session fact (also exposed as a config option for clients that only render those).
123
+ - **Agent presets** — `standard` / `code` / `minimal` / `cordis` as a config option; switching rebuilds the agent live with history preserved.
124
+ - **Live model catalog** — providers × models from the running composition (third-party providers added in the Web UI appear immediately), plus reasoning-effort selection that follows your product default.
125
+ - **Slash commands** — adapter built-ins (`/status`, `/model`) plus the harness command registry (`/compact`, `/goal`, `/permission`, `/plan`, …) executed without a model turn, plus **skills** (`/skill-name` — the harness's own invocation gesture). Login and logout are ACP methods, not chat commands.
126
+ - **Plans & usage** — `todo_write` snapshots as ACP plans; token accounting as `usage_update` and per-turn usage.
127
+ - **Sessions** — `session/load` with full history replay, `session/list`, silent restore when a client prompts an old session after an agent restart, titles as `session_info_update`.
128
+ - **MCP servers** — per-session `mcpServers` mount `@deepseek-ai/dsh-mcp-client` instances (stdio + streamable HTTP); tools join as `mcp__<server>__<tool>`; a failing server never takes the session down.
129
+ - **Real cancellation** — `session/cancel` interrupts the live turn through the harness agent.
99
130
 
100
131
  ## Configuration
101
132
 
102
- Flags win over environment variables, which win over defaults.
133
+ Flags win over environment variables, which win over defaults. All optional —
134
+ with no flags, sessions follow your product defaults (`settings.yaml`).
103
135
 
104
136
  | Flag | Env | Default | Purpose |
105
137
  |---|---|---|---|
106
138
  | `--dsh-path` | `DSH_PATH` | auto-detect | DeepSeek Harness installation |
107
- | `--provider` | `DSH_PROVIDER` | `deepseek-official` | Provider route for created agents |
108
- | `--model` | `DSH_MODEL` | `deepseek-v4-flash` | Default model |
109
- | `--models` | `DSH_ACP_MODELS` | `deepseek-v4-flash,deepseek-v4-pro` | Selectable models for the session **Model** option |
139
+ | `--provider` | `DSH_PROVIDER` | product default | Provider route override |
140
+ | `--model` | `DSH_MODEL` | product default | Model override |
110
141
  | `--max-tokens` | `DSH_MAX_TOKENS` | provider default | Per-request output-token cap |
111
- | `--permission-mode` | `DSH_PERMISSION_MODE` | `workspace-write` | Initial sandbox mode (`read-only` / `workspace-write` / `danger-full-access`) |
112
- | `--session-root` | `DSH_SESSION_ROOT` | `~/.dsh-acp/sessions` | JSONL session store |
113
- | `--persona` | `DSH_SYSTEM_PROMPT` | built-in coding persona | System-prompt persona (`{{model}}`, `{{cwd}}` interpolate) |
114
- | `--reasoning-effort` | `DSH_REASONING_EFFORT` | `high` | `off` / `high` / `max` |
115
- | `--no-thinking` | — | thinking on | Disable model thinking output |
116
- | `--bash-timeout` | `DSH_BASH_TIMEOUT_MS` | `60000` | Foreground bash timeout (ms) |
117
- | — | `DEEPSEEK_API_KEY` | — | API credential (advertised as the ACP auth method) |
142
+ | `--permission-mode` | `DSH_PERMISSION_MODE` | `workspace-write` | Initial permission preset |
143
+ | `--reasoning-effort` | `DSH_REASONING_EFFORT` | product default | `off` / `high` / `max` |
144
+ | — | `DEEPSEEK_API_KEY` | — | API credential (fallback to the credential store) |
118
145
  | — | `DEEPSEEK_BASE_URL` | DeepSeek endpoint | OpenAI-compatible endpoint override |
119
146
  | — | `DSH_ACP_DEBUG` | off | Verbose stderr diagnostics |
120
147
 
148
+ Subcommands: `dsh-acp login [api-key]` (interactive when omitted; input never
149
+ echoes), `dsh-acp update` (self-update via npm).
150
+
121
151
  ## Permissions and sandboxing
122
152
 
123
- Sessions start in `workspace-write`: bash and file mutations are confined to the session's `cwd` (plus shared temp roots), and a model retry requesting wider access raises an ACP permission request. Choosing **Always allow (this session)** flips the harness approval policy to `never` for that session. `danger-full-access` disables both the sandbox and the prompts — use it only in disposable checkouts or containers.
153
+ Sessions start in `workspace-write`: bash and file mutations are confined to
154
+ the session's `cwd` (plus shared temp roots), and a model retry requesting
155
+ wider access raises an ACP permission request. **Always allow (this
156
+ session)** flips the approval policy to `never` for that session.
157
+ `danger-full-access` disables both the sandbox and the prompts — use it only
158
+ in disposable checkouts or containers. Each level is one durable preset
159
+ (sandbox + approval together), the same three the Web UI offers.
124
160
 
125
161
  ## Architecture
126
162
 
@@ -129,20 +165,25 @@ ACP client (Zed, …)
129
165
  │ ACP JSON-RPC over stdio
130
166
  ▼
131
167
  dsh-acp
132
- ├─ src/harness.ts host discovery + module loading (DSH_PATH / auto-detect)
133
- ├─ src/app.ts composition built from the host's packages
134
- ├─ src/bridge/ the ACP bridge (cordis plugin)
135
- │ ├─ index.ts sessions, prompts, cancel, modes, options, permissions
136
- │ ├─ translate.ts session-event → ACP update projection (pure)
137
- │ ├─ history.ts stored-log replay for session/load (pure)
138
- │ └─ prompt.ts ACP prompt blocks → harness content blocks (pure)
168
+ ├─ src/profile-boot.ts boots the harness's own profile machinery
169
+ │ (dsh-base + this bundle + $DSH_HOME layers)
170
+ ├─ src/harness.ts host discovery (DSH_PATH → cwd → PATH → npm -g → vendored)
171
+ └─ src/bridge/ the ACP bridge (a cordis plugin)
172
+ ├─ index.ts sessions, prompts, cancel, modes, options,
173
+ │ commands, credentials, MCP mounts
174
+ ├─ translate.ts session-event → ACP update projection (pure)
175
+ ├─ history.ts stored-log replay for session/load (pure)
176
+ └─ prompt.ts ACP prompt blocks → harness content blocks (pure)
139
177
  ▼
140
- your @deepseek-ai/dsh installation (agent spine, llm-deepseek, persistence,
141
- sandbox, bash, fs, approvals, todo,
142
- token meter, compaction)
178
+ your @deepseek-ai/dsh installation (agent spine, llm, persistence, sandbox,
179
+ tools, presets, skills, compaction, …)
143
180
  ```
144
181
 
145
- The bridge consumes the harness `session/event` firehose (the same append-only log that persistence stores), so live streaming, history replay, and `session/list` all agree by construction. All harness modules — including cordis itself — load from the host tree, so plugin and service identity is never split across copies.
182
+ The bridge consumes the harness `session/event` firehose — the same
183
+ append-only log persistence stores — so live streaming, history replay, and
184
+ `session/list` agree by construction. All harness modules, including cordis
185
+ itself, load from one host tree: plugin and service identity is never split
186
+ across copies.
146
187
 
147
188
  ## Development
148
189
 
@@ -150,11 +191,10 @@ The bridge consumes the harness `session/event` firehose (the same append-only l
150
191
  npm install # dev deps include the harness packages (types + tests)
151
192
  npm run typecheck # tsc --noEmit
152
193
  npm test # vitest: unit + e2e smoke (boots the real composition; no model calls)
153
- npm run build # esbuild → dist/index.js
154
- npm run pack:local # build + npm pack
194
+ npm run build # esbuild → dist/
155
195
  ```
156
196
 
157
- The e2e suite exercises initialize, session/new, modes, model switching, `/status`, session/list, and cross-process session/load — all without a model credential. To also test against a standalone host install:
197
+ To also run the e2e suite against a standalone host install:
158
198
 
159
199
  ```bash
160
200
  npm install --prefix /tmp/dsh-host @deepseek-ai/dsh
@@ -163,21 +203,17 @@ DSH_ACP_TEST_HOST=/tmp/dsh-host npm test
163
203
 
164
204
  ### Live iteration: paired profiles
165
205
 
166
- Keep the profile you use in your editor on the published package, and point a
206
+ Keep the profile your editor uses on the published package, and point a
167
207
  second profile at this worktree via a pnpm symlink:
168
208
 
169
209
  ```bash
170
- # stable — what Zed uses day to day
171
- dsh plugin --profile acp add -w @openma/deepseek-harness-acp
172
-
173
- # dev — a symlink to this checkout; no packing, no version bumps
174
- dsh plugin --profile acp-test add -w "link:$PWD"
210
+ dsh plugin --profile acp add -w @openma/deepseek-harness-acp # stable
211
+ dsh plugin --profile acp-test add -w "link:$PWD" # dev (symlink)
175
212
  ```
176
213
 
177
- The dev loop is then just `npm run build` and a process restart (`dist/` and
178
- `cordis.patch.yml` are read through the link). Note pnpm treats `file:` as a
179
- copy install and caches same-version tarballs — `link:` avoids both. In Zed,
180
- register both entries:
214
+ The dev loop is `npm run build` + restart — `dist/` and `cordis.patch.yml`
215
+ are read through the link. (pnpm treats `file:` as a copy install and caches
216
+ same-version tarballs; `link:` avoids both.)
181
217
 
182
218
  ```jsonc
183
219
  {
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50.000000" height="50.000000" viewBox="0 0 50 50" fill="none">
2
+ <style>
3
+ @media (prefers-color-scheme: dark) {
4
+ path { fill: #fff; }
5
+ }
6
+ </style>
7
+ <path id="path" d="M48.8354 10.0479C48.3232 9.79199 48.1025 10.2798 47.8032 10.5278C47.7007 10.6079 47.6143 10.7119 47.5273 10.8076C46.7793 11.624 45.9048 12.1597 44.7622 12.0957C43.0923 12 41.666 12.5356 40.4058 13.8398C40.1377 12.2319 39.2476 11.272 37.8926 10.6558C37.1836 10.3359 36.4668 10.0156 35.9702 9.31982C35.6235 8.82373 35.5293 8.27197 35.356 7.72754C35.2456 7.3999 35.1353 7.06396 34.7651 7.00781C34.3633 6.94385 34.2056 7.2876 34.0479 7.57568C33.418 8.75195 33.1733 10.0479 33.1973 11.3599C33.2524 14.312 34.4736 16.6641 36.8999 18.3359C37.1758 18.5278 37.2466 18.7197 37.1597 19C36.9946 19.5757 36.7974 20.1357 36.624 20.7119C36.5137 21.0801 36.3486 21.1597 35.9624 21C34.6309 20.4321 33.481 19.5918 32.4644 18.5757C30.7393 16.8721 29.1792 14.9917 27.2334 13.52C26.7764 13.1758 26.3193 12.856 25.8467 12.5518C23.8618 10.584 26.1069 8.96777 26.627 8.77588C27.1704 8.57568 26.8159 7.8877 25.0591 7.896C23.3022 7.90381 21.6953 8.50391 19.647 9.30371C19.3477 9.42383 19.0322 9.51172 18.7095 9.58398C16.8501 9.22363 14.9199 9.14355 12.9033 9.37598C9.10596 9.80762 6.07275 11.6396 3.84326 14.7681C1.16455 18.5278 0.53418 22.7998 1.30664 27.2559C2.11768 31.9521 4.46582 35.8398 8.07373 38.8799C11.8159 42.0322 16.1255 43.5762 21.041 43.2803C24.0269 43.104 27.3516 42.6963 31.1016 39.4561C32.0469 39.936 33.0396 40.1279 34.686 40.272C35.9546 40.3921 37.1758 40.208 38.1211 40.0078C39.6021 39.688 39.4995 38.2881 38.9639 38.0322C34.623 35.9678 35.5762 36.8081 34.71 36.1279C36.9155 33.4639 40.2402 30.6958 41.54 21.728C41.6426 21.0161 41.5557 20.5679 41.54 19.9917C41.5322 19.6396 41.6108 19.5039 42.0049 19.4639C43.0923 19.3359 44.1479 19.0317 45.1167 18.4878C47.9292 16.9199 49.064 14.3438 49.3315 11.2559C49.3711 10.7837 49.3237 10.2959 48.8354 10.0479ZM24.3262 37.8398C20.1196 34.4639 18.0791 33.3521 17.2358 33.3999C16.4482 33.4482 16.5898 34.3682 16.7632 34.9678C16.9443 35.5601 17.1812 35.9683 17.5117 36.4878C17.7402 36.832 17.8979 37.3442 17.2832 37.728C15.9282 38.584 13.5728 37.4399 13.4624 37.3838C10.7207 35.7358 8.42822 33.5601 6.81348 30.584C5.25342 27.7197 4.34766 24.6479 4.19775 21.3677C4.1582 20.5757 4.38672 20.2959 5.15869 20.1519C6.17529 19.96 7.22314 19.9199 8.23926 20.0718C12.5327 20.7119 16.1885 22.6719 19.2529 25.7759C21.002 27.5439 22.3252 29.6558 23.6885 31.7202C25.1377 33.9121 26.6978 36 28.6831 37.7119C29.3843 38.312 29.9434 38.7681 30.479 39.104C28.8643 39.2881 26.1699 39.3281 24.3262 37.8398ZM26.3433 24.6001C26.3433 24.248 26.6191 23.9678 26.9658 23.9678C27.0444 23.9678 27.1152 23.9839 27.1782 24.0078C27.2651 24.04 27.3438 24.0879 27.4067 24.1602C27.5171 24.272 27.5801 24.4321 27.5801 24.6001C27.5801 24.9521 27.3042 25.2319 26.9575 25.2319C26.6108 25.2319 26.3433 24.9521 26.3433 24.6001ZM32.6064 27.8799C32.2046 28.0479 31.8027 28.1919 31.4165 28.208C30.8179 28.2397 30.1641 27.9922 29.8096 27.688C29.2583 27.2158 28.8643 26.9521 28.6987 26.1279C28.6279 25.7759 28.6675 25.2319 28.7305 24.9199C28.8721 24.248 28.7144 23.8159 28.2495 23.4238C27.8716 23.104 27.3911 23.0161 26.8633 23.0161C26.666 23.0161 26.4849 22.9277 26.3511 22.856C26.1304 22.7441 25.9492 22.4639 26.1226 22.1201C26.1777 22.0078 26.4458 21.7358 26.5088 21.688C27.2256 21.272 28.0527 21.4077 28.8169 21.7197C29.5259 22.0161 30.0615 22.5601 30.834 23.3281C31.6216 24.2559 31.7632 24.5117 32.2124 25.208C32.5669 25.752 32.8901 26.312 33.1104 26.9521C33.2446 27.3521 33.0713 27.6802 32.6064 27.8799Z" fill="#000" fill-opacity="1.000000" fill-rule="nonzero"/>
8
+ </svg>
package/cordis.patch.yml CHANGED
@@ -24,7 +24,8 @@
24
24
  # own composition (standard/code/minimal/cordis ship complete agent.cordis.yml
25
25
  # files) — the same split the web-app bundle makes, and what gives "minimal"
26
26
  # its two-tool surface. Host-plane services (job/skill/goal registries,
27
- # shell-env, sandbox, approval) stay in dsh-base and serve every preset.
27
+ # shell-env, sandbox, approval, the dynamic Cordis runner the cordis preset
28
+ # injects) stay on the host and serve every preset.
28
29
 
29
30
  - id: tool-bash
30
31
  disabled: true
@@ -105,6 +106,11 @@
105
106
  config:
106
107
  default: standard
107
108
 
109
+ # Same host row the web-app bundle mounts. Without it, preset "cordis"
110
+ # never activates: tool-cordis waits for dynamicCordisRunner, cordisInspect.
111
+ - id: cordis-host-runner
112
+ name: '@deepseek-ai/dsh-cordis-host-runner'
113
+
108
114
  - id: acp-bridge
109
115
  name: '@openma/deepseek-harness-acp/bridge'
110
116
  config: