deepseek-coordination 0.10.0 → 0.11.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 +52 -25
- package/README.zh-CN.md +51 -24
- package/lib/client.js +207 -1524
- package/lib/index.d.mts +67 -1
- package/lib/index.mjs +860 -122
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
A dual-face Cordis plugin for DeepSeek Harness: the host half owns a coordination SQLite database, seven model-facing tools and an HTTP surface; the web half mounts five composer dropdowns, a settings catalog and the service-level takeover dialog.
|
|
6
6
|
|
|
7
|
-
**Status: v0.
|
|
7
|
+
**Status: v0.11.0 (2026-10-18).** This release makes the settings page durable through the host's own override document, hands reasoning entirely to DSH, turns every numeric control into a number field, fixes the settings and takeover wiring against DSH 0.2.1, and adds the experimental cache proxy with brand-aware cache profiles. The package version, changelog and release tarball are the same tree; claims below were checked against source, not against the design documents alone.
|
|
8
8
|
|
|
9
9
|
| Status | Meaning in this README |
|
|
10
10
|
|---|---|
|
|
@@ -48,17 +48,19 @@ npm pack # prepack builds first; produces the installable tarball
|
|
|
48
48
|
| Peer package | Range | Side |
|
|
49
49
|
|---|---|---|
|
|
50
50
|
| `@deepseek-ai/cordis` | `^4.0.1` | Host runtime |
|
|
51
|
-
| `@deepseek-ai/dsh-host-webserver` | `^0.1.0-rc.7 \|\|
|
|
52
|
-
| `@deepseek-ai/dsh-client-runtime`, `-locale`, `-ui-slots`, `-ui-settings` | `^0.1.0-rc.7 \|\|
|
|
51
|
+
| `@deepseek-ai/dsh-host-webserver` | `^0.1.0-rc.7 \|\| >=0.2.1-rc.2` | Host route registration |
|
|
52
|
+
| `@deepseek-ai/dsh-client-runtime`, `-locale`, `-ui-slots`, `-ui-settings` | `^0.1.0-rc.7 \|\| >=0.2.1-rc.2` | Browser module table |
|
|
53
53
|
| `react` | `^18.2.0` | Browser module table; never bundled |
|
|
54
54
|
|
|
55
|
+
The client half is compiled against the 0.2.1-rc.2 client packages the desktop runtime ships (`-locale`, `-ui-settings`, `-ui-slots`, `-ui-conversation`). `@deepseek-ai/dsh-client-runtime` and `@deepseek-ai/dsh-host-webserver` publish no 0.2.x release, so their devDependencies stay on 0.1.0-rc.8 while their peer ranges accept the 0.2.1+ runtime the host provides. The open-ended `>=0.2.1-rc.2` accepts every later stable release; `^0.1.0-rc.7` keeps the 0.1 line installable.
|
|
56
|
+
|
|
55
57
|
### Install into a profile
|
|
56
58
|
|
|
57
59
|
Install the packed tarball, not the GitHub source:
|
|
58
60
|
|
|
59
61
|
```powershell
|
|
60
62
|
npm pack
|
|
61
|
-
dsh plugin --profile <name> add .\deepseek-coordination-0.
|
|
63
|
+
dsh plugin --profile <name> add .\deepseek-coordination-0.11.0.tgz
|
|
62
64
|
dsh --profile <name> --dump-config # expect a deepseek-coordination layer
|
|
63
65
|
```
|
|
64
66
|
|
|
@@ -157,16 +159,16 @@ The budgets live in `src/host/comprehension.ts` and the shared `ValidationBudget
|
|
|
157
159
|
|
|
158
160
|
### Scenes and the writing profile
|
|
159
161
|
|
|
160
|
-
| Scene |
|
|
161
|
-
|
|
162
|
-
| dialogue |
|
|
163
|
-
| writing |
|
|
164
|
-
| office |
|
|
165
|
-
| research |
|
|
166
|
-
| engineering |
|
|
167
|
-
| iterate |
|
|
162
|
+
| Scene | Plan | Outline | Revision | Score | Bash | Web | Max iterations |
|
|
163
|
+
|---|---|---|---|---|---|---|---|
|
|
164
|
+
| dialogue | – | – | – | – | no | yes | 1 |
|
|
165
|
+
| writing | yes | yes | yes | yes | no | yes | 3 |
|
|
166
|
+
| office | yes | – | – | – | no | yes | 1 |
|
|
167
|
+
| research | yes | – | – | – | no | yes | 3 |
|
|
168
|
+
| engineering | yes | – | – | – | yes | yes | 3 |
|
|
169
|
+
| iterate | – | – | – | yes | no | yes | 3 |
|
|
168
170
|
|
|
169
|
-
`writing` requires an outline and at least one revision round, requires a quality score, disallows bash, allows web search and caps the loop at three iterations. The pass threshold is `0.6`; `plan.ts` uses that writing threshold. The turn pipeline reads
|
|
171
|
+
`writing` requires an outline and at least one revision round, requires a quality score, disallows bash, allows web search and caps the loop at three iterations. The pass threshold is `0.6`; `plan.ts` uses that writing threshold. The turn pipeline reads the require-* flags, citation/evidence, `allowWeb` and `sandboxOnly`; reasoning (`thinking`, `reasoningEffort`) belongs to DSH — the page has no row for it, and the turn records what the session's own request header carries rather than a scene literal. `allowBash`, `maxIteration` and non-writing thresholds remain deferred diagnostics because no DSH port or consumer exists yet.
|
|
170
172
|
|
|
171
173
|
## Profession lock and turn lifecycle
|
|
172
174
|
|
|
@@ -188,7 +190,7 @@ Terminal turn states (`done`, `failed`, `cancelled`, `abandoned`) are irreversib
|
|
|
188
190
|
|
|
189
191
|
## Settings and configuration
|
|
190
192
|
|
|
191
|
-
The settings page is driven by `SETTINGS_CONTROLS` in `src/shared/selection.ts`: **
|
|
193
|
+
The settings page is driven by `SETTINGS_CONTROLS` in `src/shared/selection.ts`: **139 controls in 13 groups, 122 writable host rows, covering 155 config leaves**. Twelve scene leaves (`scenes.*.thinking`, `scenes.*.reasoningEffort`) stay in the schema but have no row: DSH's model page owns reasoning, and duplicating it here would create two sources of truth. The 18 top-level config keys include `database` and `databasePath`, which are deliberately not projected or writable.
|
|
192
194
|
|
|
193
195
|
| Group | Defaults / scope | Write path |
|
|
194
196
|
|---|---|---|
|
|
@@ -196,36 +198,59 @@ The settings page is driven by `SETTINGS_CONTROLS` in `src/shared/selection.ts`:
|
|
|
196
198
|
| `profession` | enabled/lock/rebuild/abandon forced `true`; default mirrors `defaults.profession`; audit/errorHint `true` | Forced flags read-only; audit/errorHint host rows (audit has no consumer) |
|
|
197
199
|
| `plan` | threshold `0.5`, maxRebuild `3`, 8 weights summing to 1, 8 dimension thresholds | Host rows; weights re-normalise on save |
|
|
198
200
|
| `orchestration` | maxReject `2`, maxSubTask `32`, groundTruth `true`, timeout `5000 ms`, shell ground truth `false`, modelRouting `true` | Host rows; `groundTruthTimeout` has no consumer |
|
|
199
|
-
| `cache` | enabled `true`, ttl `60000 ms`, fingerprintWindow `50`, effortWarning `true` | Host rows; `fingerprintWindow` has no consumer |
|
|
201
|
+
| `cache` | enabled `true`, ttl `60000 ms`, fingerprintWindow `50`, effortWarning `true` | Host rows; `enabled`/`effortWarning` gate the cache proxy decorator, `ttl` caches the model catalog, `fingerprintWindow` has no consumer |
|
|
200
202
|
| `bayesian` | prior `0.5`, stopEntropy `0.05`, infoGain `0.01`, maxRoutes `12`, calibrationFloor `0.1` | Host rows; `calibrationFloor` has no consumer |
|
|
201
203
|
| `comprehension` | stageTimeout `30000 ms`, searchEnabled `true`, maxEvidence `8`, highHistoryWindow `50` | Host rows |
|
|
202
204
|
| `compaction` | auto `true`, soft `0.70`, hard `0.88`, reserve `2048`, recentTurns `6`, cooldown `30000 ms`, maxPerSession `20` | auto/soft/hard host rows; structural fields read-only |
|
|
203
205
|
| `ui` | toolbar `true` (deprecated alias), showTooltip `true`, takeover `false`, refreshInterval `5000 ms`, compact `true`, locale `auto` | Host rows plus the two local switches; toolbar/locale read-only |
|
|
204
|
-
| `scenes` | six scene profiles,
|
|
206
|
+
| `scenes` | six scene profiles, 9 exposed rows each (thinking/effort remain schema-only) and a writing threshold of `0.6` | Host rows; only the writing score threshold is read by `plan.ts` |
|
|
205
207
|
| `parser` | enabled `true`, 1 MiB, 200k tokens, depth `256`, 2 s, cache `256`, graph 20k/100k | enabled + four limits host rows; depth and graph caps planned |
|
|
206
208
|
| `chain` | depth `8`, links `50`, tokenBudget `1500` | Host rows |
|
|
207
209
|
| `tools` | maxResultBytes `0` | Planned/read-only; not consumed |
|
|
208
210
|
| `defaults` | profession `execution`, interaction `think`, scene `dialogue`, validation `medium`, command `none` | Host rows |
|
|
209
211
|
|
|
210
|
-
`GET /deepseek-coordination/config` returns `{ values, defaults }`; `defaults` is `resolveConfig(undefined)`, so the page never duplicates a default literal. `POST /config` accepts a flat dotted patch such as `{ "plan.threshold": 0.7 }`, validates it against the catalog and the real Schemastery schema, applies it to the live config, re-resolves invariants (weight normalisation, alias mirror, forced flags, compaction clamps), rebuilds `TokenGovernor` when compaction changes, and
|
|
212
|
+
`GET /deepseek-coordination/config` returns `{ values, defaults }`; `defaults` is `resolveConfig(undefined)`, so the page never duplicates a default literal. `POST /config` accepts a flat dotted patch such as `{ "plan.threshold": 0.7 }`, validates it against the catalog and the real Schemastery schema, applies it to the live config, re-resolves invariants (weight normalisation, alias mirror, forced flags, compaction clamps), rebuilds `TokenGovernor` when compaction changes, and persists the applied paths.
|
|
211
213
|
|
|
212
|
-
Persistence is
|
|
214
|
+
Persistence is the host's own override document at `<database dir>/config.overrides.json`: a flat `{ "plan.threshold": 0.7 }` map written atomically beside the coordination database and merged over the profile config on the next start. It is not DSH's `ctx.settings.update`, which only accepts `.volatile()` schemas — and a volatile node turns every parsed value into a reference wrapper this host cannot adopt without rewriting every config reader. `persisted: true` therefore means "stored in the coordination host's own document"; a write that only touched ignored rows reports `false`. Unknown keys, `databasePath` and `database` are rejected with `INVALID_ARGUMENT`. Known but non-editable keys are reported in `ignored` and never written. `POST /config/compaction` remains as a small compatibility route for the old auto/soft/hard patch.
|
|
213
215
|
|
|
214
|
-
The page is Material UI end to end: one default-expanded `Accordion` per group, a `List` of rows, six scene tables (no scene dropdown), `Checkbox` for booleans, `RadioGroup` for enums, `
|
|
216
|
+
The page is Material UI end to end: one default-expanded `Accordion` per group, a `List` of rows, six scene tables (no scene dropdown), `Checkbox` for booleans, `RadioGroup` for enums, `TextField type="number"` for every number (weights and ratios included, rounded to the row's step for display only), and `Chip` only for the `主机 / 本机 / 强制 / 只读 / 计划中` status plus connection state. The full-access confirmation is a modal MUI `Dialog` above the tooltip layer, never an inline banner. There is no save button; controls apply on change/blur. A forced row draws a disabled control, a read-only row shows a value, and a planned row says the runtime does not read it yet. The settings nav icon is a host-shell workaround: the shell accepts only `{ id, order, label }` for a section, so the plugin decorates its nav button with a CSS mask of the Material `sync` glyph.
|
|
215
217
|
|
|
216
218
|
## Service-level takeover
|
|
217
219
|
|
|
218
220
|
- With `ui.takeover` on, `TakeoverGate` listens to DSH's `approval/request` and `user-questions/request` waterfalls. It records a durable pending row, emits `takeover/pending`, and waits for a human answer delivered through the client routes.
|
|
221
|
+
- The listener registers with `{ prepend: true }`. DSH's own approval and question UI listens to the same waterfalls, and a listener registered later never runs once the GUI claims the request. Note that a deployment approval policy of `never` makes DSH reject before the waterfall, so no dialog can appear regardless of this switch.
|
|
219
222
|
- A timeout, an aborted request signal, an explicit cancel, or plugin unload calls `next()`; the gate never turns “nobody answered” into `allowed-once` or a fabricated answer. `unavailable` is the host's fail-closed outcome and is rejected as a user decision.
|
|
220
223
|
- The dialog polls `/takeover/pending` every 1 s only while the local 权限接管 switch is on, the session id is real and the document is visible. The first pending request is rendered; a `1 / N` badge appears for a queue.
|
|
221
224
|
- Approval offers 仅本次允许 / 拒绝 / 取消; only `allowed-once` and `rejected` are submitted, while cancel/Esc/backdrop use the cancel route. Questions render radios for single-select, checkboxes for multi-select and optional free text; submit stays disabled until every question is answered.
|
|
222
225
|
- **Both switches are needed**: host `ui.takeover` (default `false`) opens the gate; the local 权限接管 switch makes the dialog poll. With the host switch off, the gate delegates immediately and there is nothing to show.
|
|
223
226
|
|
|
227
|
+
## Cache proxy (experimental, off by default)
|
|
228
|
+
|
|
229
|
+
DSH freezes a model request before any adapter sees it: `buildRequest()` deep-freezes the messages and `Object.freeze`s the request, and the `llm/stream` waterfall's fallback closes over that object. The one supported place where outgoing content can still be rebuilt is the adapter boundary, so the plugin registers an extra provider route (`coordination-proxy`) and forwards each request to the real provider after rebuilding it.
|
|
230
|
+
|
|
231
|
+
Wiring (`src/index.ts`, `src/host/proxy-adapter.ts`, `src/host/model-brand.ts`):
|
|
232
|
+
|
|
233
|
+
- `agent/request` rewrites the route to `coordination-proxy` and remembers the real one. Only allowlisted providers (`deepseek`, `deepseek-account`, `deepseek-official`) are intercepted; anything else keeps the route the harness chose.
|
|
234
|
+
- The adapter forwards through `ctx.llm.stream` with the real provider, so transport, retries, attribution headers and usage reporting stay with the real adapter.
|
|
235
|
+
- `ctx.llm.resolveModelInfo(provider, model)` supplies the host's model identity; it is classified onto a built-in cache brand (DeepSeek, OpenAI, Anthropic, Google, xAI, Moonshot, Qwen, Zhipu, Mistral, Meta, unknown) with `automaticPrefixCache`, `explicitCacheBreakpoints`, `minPrefixTokens`, `effortBreaksCache` and `stripVolatileHelps`.
|
|
236
|
+
- Outgoing content is decorated only when the family has an automatic prefix cache **and** `cache.enabled` is on: `CacheModule.decorate` moves fixed content first and replaces volatile fragments (ISO timestamps, UUIDs, long hex, current-time phrases) with stable placeholders. Explicit-breakpoint families (Anthropic) are never rewritten, because markers — not bytes — decide reuse there. The advisory `cacheWarning` field is stripped before forwarding.
|
|
237
|
+
|
|
238
|
+
Security model — the proxy sees every prompt, so it is built to be unable to leak:
|
|
239
|
+
|
|
240
|
+
1. no credential access (no `ctx.credentials`, no token, no `Authorization`, no API key);
|
|
241
|
+
2. no egress (the module has no imports and no `fetch`/`http`/`net`; forwarding is an in-process call);
|
|
242
|
+
3. no content persistence — `proxy.log` receives structural events only (`{event, provider, model, brand, messages, chars, tools, reason}`), never prompt or answer text;
|
|
243
|
+
4. provider allowlist enforced in both the routing listener and the adapter;
|
|
244
|
+
5. refusal and failure messages name the route only;
|
|
245
|
+
6. opt-in and reversible.
|
|
246
|
+
|
|
247
|
+
Enable it by creating `%DSH_HOME%\coordination\proxy.enable` (or `DSH_COORDINATION_PROXY=1`) and restarting. `GET /deepseek-coordination/proxy/status` reports counts and ids only: `available`, `enabled`, `decorate`, `upstream`, `model` (brand and policy), `forwards`, `refusals`. Delete the flag file and restart to return to the normal path.
|
|
248
|
+
|
|
224
249
|
## Auto-compaction and the token governor
|
|
225
250
|
|
|
226
251
|
`TokenGovernor` estimates context (CJK-aware O(n) estimator with a bounded 256-entry memo), plans a budget against `contextWindow - reserve`, and asks DSH's `compactIfNeeded` at `agent/pre-step` when utilisation crosses a threshold. Defaults: soft `0.70`, hard `0.88`, reserve `max(2048, 8% of window)` capped at 25%, recentTurns `6`, cooldown `30 s`, `maxPerSession 20`.
|
|
227
252
|
|
|
228
|
-
The soft threshold is editable as a 0.30–0.90 ratio; the hard threshold as 0.30–0.98 and strictly above soft. The old 60/70/80/88% values remain valid choices (`0.60`, `0.70`, `0.80`, `0.88`) even though the catalog now
|
|
253
|
+
The soft threshold is editable as a 0.30–0.90 ratio; the hard threshold as 0.30–0.98 and strictly above soft. The old 60/70/80/88% values remain valid choices (`0.60`, `0.70`, `0.80`, `0.88`) even though the catalog now edits it as a number field with 0.01 precision. Auto compaction is disabled by `compaction.auto=false`, but an explicit compact command is not governed by that switch.
|
|
229
254
|
|
|
230
255
|
Fail-safe rules are deliberate: the hook never blocks the step; a missing compaction port, `null`/`undefined` result, timeout, throw, spent per-session allowance or unelapsed cooldown all become a no-op, and the agent proceeds to `next()`. The governor snaps the policy at construction, so a live settings change also rebuilds it. DSH owns the actual safe range and replacement; this plugin only decides when it is worth asking.
|
|
231
256
|
|
|
@@ -314,6 +339,7 @@ There is no `coordination_write`, `coordination_refresh`, `outline`, `findSymbol
|
|
|
314
339
|
- File paths are workspace-relative; absolute paths, drive-rooted paths, UNC paths, `..` escapes and symlink escapes are rejected before a read. Binary/NUL/undecodable content is refused rather than guessed.
|
|
315
340
|
- The turn hook records turn metadata and an empty prompt row; it does not mirror the DSH transcript. No file content is copied into the coordination database.
|
|
316
341
|
- Permission presets are written to DSH immediately (full access needs a second confirmation) and are never stored in the offline localStorage copy. Offline replay covers only the five stored selection fields.
|
|
342
|
+
- The optional cache proxy adds no transport and no credential surface: it forwards through DSH's own `ctx.llm.stream`, traces structural counts only, and refuses providers outside its allowlist.
|
|
317
343
|
- Takeover never auto-approves. Timeout, abort, cancel and unload delegate with `next()`; only a human decision delivered through the answer route settles a window.
|
|
318
344
|
- Fail-closed behaviour is explicit: invalid takeover answers leave the window open; `PROFESSION_LOCKED` leaves the selection intact; parser uncertainty is `unverifiable`; graph/parse overflow is `truncated`; compaction failure is a no-op; chain `unknown` never auto-passes.
|
|
319
345
|
- The coordination DB stores task/audit rows (including `prompt` and trace rows), not credentials or provider secrets. The config projection contains no DSH credential, token or provider key.
|
|
@@ -322,10 +348,10 @@ There is no `coordination_write`, `coordination_refresh`, `outline`, `findSymbol
|
|
|
322
348
|
|
|
323
349
|
| Check | Result |
|
|
324
350
|
|---|---|
|
|
325
|
-
| `npm test` | **
|
|
351
|
+
| `npm test` | **507 tests, 506 pass, 1 skipped (GC-only), 0 fail**, ~3 s on Node 24.21.0 |
|
|
326
352
|
| `npm run typecheck` / `npm run test:tsc` | Clean |
|
|
327
353
|
| `npm run build` | Host + client bundles green; MUI `"use client"` directive warnings are non-fatal |
|
|
328
|
-
| `npm run pack:check` | OK:
|
|
354
|
+
| `npm run pack:check` | OK: the runtime tarball carries the four shipped files |
|
|
329
355
|
| Release CI | `.github/workflows/release.yml` runs typecheck, test:tsc, tests, pack:check and attaches the tarball to a `v*` GitHub Release |
|
|
330
356
|
|
|
331
357
|
Parser and structure numbers are guards, not promises: a 100k-character parse test stays under 3 s; the data-structure report records B+ tree 10k inserts at 8.3/9.8 ms, skip-list 10k inserts at 6.4 ms, red-black 10k random set/delete at 13.5 ms, sparse grid 10k cells at 5.1 ms, and `hashString` 100k calls at 4.3 ms on the audit machine. The complexity audit records the ordinal `COUNT(*)` → `MAX(ordinal)` change (≈65–69 ms → ≈12–14 ms for 2,000 statements) and route ranking (2,400 → 200 posterior statements for 200 × 12 routes).
|
|
@@ -334,16 +360,17 @@ Known limitations, stated rather than hidden:
|
|
|
334
360
|
|
|
335
361
|
1. **Durable graph is bounded.** `node`/`edge`/`snapshot` are now schema 24 and survive a new runtime; rehydration is bounded to the newest 10k nodes / 50k edges, removed symbols are not pruned, and a handle older than the rehydration window is `NOT_FOUND`.
|
|
336
362
|
2. **Domain extraction is parser-level; the chain projection is partial.** Book/Article/Part/Chapter/Section/Paragraph, Person/Venue, Condition, Sheet/Cell/Range, TeX proof status and CSV/TSV sheets are emitted and projected onto node cards. `partOf`/`condition` edges are not yet queryable through `coordination_chain`; xlsx/docx/pptx, Sign promotion, Lean/Coq/Isabelle status and cross-file Book composition remain deferred.
|
|
337
|
-
3. **The core turn pipeline is wired, the wider engines are not.** Comprehension → Organization → Plan/score and required Predict rows now run for `command=none` turns, with the scene policy applied where ports exist. Standalone Emotion/Bayesian/Cognition/Orchestration/Learning/Resource/Score, plan rebuild loops and decompose/dispatch/verify/synthesize remain library-only.
|
|
363
|
+
3. **The core turn pipeline is wired, the wider engines are not.** Comprehension → Organization → Plan/score and required Predict rows now run for `command=none` turns, with the scene policy applied where ports exist. Standalone Emotion/Bayesian/Cognition/Orchestration/Learning/Resource/Score, plan rebuild loops and decompose/dispatch/verify/synthesize remain library-only. Reasoning is DSH-owned and no longer reported as a plugin gap; `allowBash`, `maxIteration` and non-writing score thresholds are still recorded as deferred diagnostics, not faked.
|
|
338
364
|
4. **Configured caps are live.** `parser.maxAstDepth`, both dependency-graph caps and `tools.maxResultBytes` are consumed; parser/chain limits retune an existing runtime, and a config change no longer leaves a stale tool runtime.
|
|
339
365
|
5. **Workspace root is resolved, not hard-coded.** Tool option → service root → host root → sandbox-policy root → `process.cwd()` only as the last fallback.
|
|
340
366
|
6. **`parser.enabled` still needs registration.** The other file-layer limits retune live; turning the parser off fails closed immediately, but adding/removing the four tools requires the next registration (restart).
|
|
341
367
|
7. **No browser E2E test.** The UI is covered by types, build, the settings-catalog tests and the takeover/bridge/integration tests; visual verification remains manual/screenshot-based.
|
|
342
368
|
8. **Node engine is `>=22.13.0`.** `node:sqlite` is unflagged from 22.13.0/23.4.0; CI and this verification use 24.21.0.
|
|
343
|
-
9. **A profile can still record an older package spec.** Verify the installed version (`dsh --profile <name> --dump-config` or the profile's `package.json`); install the 0.
|
|
369
|
+
9. **A profile can still record an older package spec.** Verify the installed version (`dsh --profile <name> --dump-config` or the profile's `package.json`); install the 0.11.0 tarball or link the built checkout rather than assuming a previous install was upgraded.
|
|
370
|
+
10. **The cache proxy is experimental and off by default.** Its brand profiles are policy defaults, not measurements, and it only rewrites content for families with an automatic prefix cache; the observable gain on a stable session may be near zero, which is why it ships behind a flag and a status endpoint rather than enabled.
|
|
344
371
|
|
|
345
372
|
## Repository history and license
|
|
346
373
|
|
|
347
|
-
`0.1.x` is **dsh-os**, a different OS-interaction project, no longer on the branch tip; `0.2.0` became the DSH plugin bundle; `0.3`–`0.6` moved the UI from Angular to MDUI to plain React to Material UI; `0.7`–`0.9` added the five dropdowns, i18n, profession lock, takeover, compaction, the P0 parser, the domain model and the shared data structures; `0.10.0`
|
|
374
|
+
`0.1.x` is **dsh-os**, a different OS-interaction project, no longer on the branch tip; `0.2.0` became the DSH plugin bundle; `0.3`–`0.6` moved the UI from Angular to MDUI to plain React to Material UI; `0.7`–`0.9` added the five dropdowns, i18n, profession lock, takeover, compaction, the P0 parser, the domain model and the shared data structures; `0.10.0` added the settings catalog, the four file tools, the second data-structure pass and the verified tarball; `0.11.0` added durable settings, DSH-owned reasoning and the experimental cache proxy with brand profiles. Earlier states remain in git history and tags.
|
|
348
375
|
|
|
349
376
|
MIT © 2026 Eloy Kim. See [LICENSE](LICENSE). Source: [github.com/eloyhere/deepseek-coordination](https://github.com/eloyhere/deepseek-coordination).
|
package/README.zh-CN.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
一个面向 DeepSeek Harness 的双端 Cordis 插件:宿主端持有协调 SQLite 数据库、7 个模型可见工具和一组 HTTP 路由;浏览器端在输入框挂载五个下拉框,并提供设置目录与服务级接管对话框。
|
|
6
6
|
|
|
7
|
-
**当前版本:v0.
|
|
7
|
+
**当前版本:v0.11.0(2026-10-18)。** 本版把设置页改为持久化(落在宿主自己的覆盖文档),把推理完全交还 DSH,把所有数值控件改成数字输入框,修好设置写入与接管在 DSH 0.2.1 上的接线,并加入带品牌策略的实验性缓存代理。包版本、更新日志和发布 tarball 来自同一棵树;下文按源码核对,不以设计文档代替实现。
|
|
8
8
|
|
|
9
9
|
| 状态 | 含义 |
|
|
10
10
|
|---|---|
|
|
@@ -48,17 +48,19 @@ npm pack # 先执行 prepack,生成可安装 tarball
|
|
|
48
48
|
| Peer 包 | 范围 | 端 |
|
|
49
49
|
|---|---|---|
|
|
50
50
|
| `@deepseek-ai/cordis` | `^4.0.1` | 宿主运行时 |
|
|
51
|
-
| `@deepseek-ai/dsh-host-webserver` | `^0.1.0-rc.7 \|\|
|
|
52
|
-
| `@deepseek-ai/dsh-client-runtime`、`-locale`、`-ui-slots`、`-ui-settings` | `^0.1.0-rc.7 \|\|
|
|
51
|
+
| `@deepseek-ai/dsh-host-webserver` | `^0.1.0-rc.7 \|\| >=0.2.1-rc.2` | 宿主路由 |
|
|
52
|
+
| `@deepseek-ai/dsh-client-runtime`、`-locale`、`-ui-slots`、`-ui-settings` | `^0.1.0-rc.7 \|\| >=0.2.1-rc.2` | 浏览器模块表 |
|
|
53
53
|
| `react` | `^18.2.0` | 浏览器模块表;不会被打包 |
|
|
54
54
|
|
|
55
|
+
客户端半针对桌面运行时携带的 0.2.1-rc.2 客户端包(`-locale`、`-ui-settings`、`-ui-slots`、`-ui-conversation`)编译。`@deepseek-ai/dsh-client-runtime` 与 `@deepseek-ai/dsh-host-webserver` 没有发布 0.2.x,因此它们的 devDependency 仍是 0.1.0-rc.8,而 peer 范围接受宿主提供的 0.2.1+ 运行时。`>=0.2.1-rc.2` 接受之后的所有稳定版本,`^0.1.0-rc.7` 让 0.1 线仍可安装。
|
|
56
|
+
|
|
55
57
|
### 安装到 profile
|
|
56
58
|
|
|
57
59
|
安装打包后的 tarball,不要装 GitHub 源码:
|
|
58
60
|
|
|
59
61
|
```powershell
|
|
60
62
|
npm pack
|
|
61
|
-
dsh plugin --profile <name> add .\deepseek-coordination-0.
|
|
63
|
+
dsh plugin --profile <name> add .\deepseek-coordination-0.11.0.tgz
|
|
62
64
|
dsh --profile <name> --dump-config # 应出现 deepseek-coordination 层
|
|
63
65
|
```
|
|
64
66
|
|
|
@@ -157,16 +159,16 @@ deepseek-coordination/
|
|
|
157
159
|
|
|
158
160
|
### 情景与写作档
|
|
159
161
|
|
|
160
|
-
| 情景 |
|
|
161
|
-
|
|
162
|
-
| 对话 |
|
|
163
|
-
| 写作 |
|
|
164
|
-
| 办公 |
|
|
165
|
-
| 研究 |
|
|
166
|
-
| 工程 |
|
|
167
|
-
| 迭代 |
|
|
162
|
+
| 情景 | 计划 | 大纲 | 修订 | 评分 | Bash | 联网 | 最大轮次 |
|
|
163
|
+
|---|---|---|---|---|---|---|---|
|
|
164
|
+
| 对话 | – | – | – | – | 否 | 是 | 1 |
|
|
165
|
+
| 写作 | 是 | 是 | 是 | 是 | 否 | 是 | 3 |
|
|
166
|
+
| 办公 | 是 | – | – | – | 否 | 是 | 1 |
|
|
167
|
+
| 研究 | 是 | – | – | – | 否 | 是 | 3 |
|
|
168
|
+
| 工程 | 是 | – | – | – | 是 | 是 | 3 |
|
|
169
|
+
| 迭代 | – | – | – | 是 | 否 | 是 | 3 |
|
|
168
170
|
|
|
169
|
-
“写作”要求大纲和至少一轮修订,必须有质量评分,不允许 bash,允许联网,最多三轮。通过阈值为 `0.6`,`plan.ts` 使用该写作阈值。Turn 流水线读取
|
|
171
|
+
“写作”要求大纲和至少一轮修订,必须有质量评分,不允许 bash,允许联网,最多三轮。通过阈值为 `0.6`,`plan.ts` 使用该写作阈值。Turn 流水线读取 require-* 标志、引用/证据、`allowWeb` 与 `sandboxOnly`;推理(`thinking`、`reasoningEffort`)归 DSH 所有——页面没有对应行,Turn 记录的是会话自身请求头里的值,而不是情景字面量。`allowBash`、`maxIteration` 和非写作阈值仍是没有 DSH 端口/消费者的延迟诊断项。
|
|
170
172
|
|
|
171
173
|
## 职能锁定与 Turn 生命周期
|
|
172
174
|
|
|
@@ -188,7 +190,7 @@ deepseek-coordination/
|
|
|
188
190
|
|
|
189
191
|
## 设置与配置
|
|
190
192
|
|
|
191
|
-
设置页由 `src/shared/selection.ts` 的 `SETTINGS_CONTROLS` 生成:**13 组、
|
|
193
|
+
设置页由 `src/shared/selection.ts` 的 `SETTINGS_CONTROLS` 生成:**13 组、139 个控件、122 个可写宿主行,覆盖 155 个配置叶子**。其中 12 个情景叶子(`scenes.*.thinking`、`scenes.*.reasoningEffort`)留在 schema 里但没有对应行:推理由 DSH 的模型页负责,这里再放一套会形成两个真相来源。18 个顶层配置键包含 `database` 与 `databasePath`,这两个键故意不投影、不可写。
|
|
192
194
|
|
|
193
195
|
| 组 | 默认值 / 范围 | 写入路径 |
|
|
194
196
|
|---|---|---|
|
|
@@ -196,36 +198,59 @@ deepseek-coordination/
|
|
|
196
198
|
| `profession` | enabled/lock/rebuild/abandon 强制 `true`;default 镜像 `defaults.profession`;audit/errorHint `true` | 强制项只读;audit/errorHint 为宿主行(audit 无消费者) |
|
|
197
199
|
| `plan` | threshold `0.5`、maxRebuild `3`、8 个权重和为 1、8 个维度阈值 | 宿主行;保存后权重重新归一 |
|
|
198
200
|
| `orchestration` | maxReject `2`、maxSubTask `32`、groundTruth `true`、timeout `5000 ms`、shell ground truth `false`、modelRouting `true` | 宿主行;`groundTruthTimeout` 无消费者 |
|
|
199
|
-
| `cache` | enabled `true`、ttl `60000 ms`、fingerprintWindow `50`、effortWarning `true` | 宿主行;`fingerprintWindow` 无消费者 |
|
|
201
|
+
| `cache` | enabled `true`、ttl `60000 ms`、fingerprintWindow `50`、effortWarning `true` | 宿主行;`enabled`/`effortWarning` 控制缓存代理的改写开关,`ttl` 用于模型目录缓存,`fingerprintWindow` 无消费者 |
|
|
200
202
|
| `bayesian` | prior `0.5`、stopEntropy `0.05`、infoGain `0.01`、maxRoutes `12`、calibrationFloor `0.1` | 宿主行;`calibrationFloor` 无消费者 |
|
|
201
203
|
| `comprehension` | stageTimeout `30000 ms`、searchEnabled `true`、maxEvidence `8`、highHistoryWindow `50` | 宿主行 |
|
|
202
204
|
| `compaction` | auto `true`、soft `0.70`、hard `0.88`、reserve `2048`、recentTurns `6`、cooldown `30000 ms`、maxPerSession `20` | auto/soft/hard 为宿主行;结构字段只读 |
|
|
203
205
|
| `ui` | toolbar `true`(废弃别名)、showTooltip `true`、takeover `false`、refreshInterval `5000 ms`、compact `true`、locale `auto` | 宿主行 + 两个本机开关;toolbar/locale 只读 |
|
|
204
|
-
| `scenes` | 六个情景各
|
|
206
|
+
| `scenes` | 六个情景各 9 个可编辑行(思考/effort 仅保留在 schema);写作阈值 `0.6` | 宿主行;只有写作评分阈值被 `plan.ts` 读取 |
|
|
205
207
|
| `parser` | enabled `true`、1 MiB、200k tokens、depth `256`、2 s、cache `256`、graph 20k/100k | enabled + 四个上限为宿主行;depth 与 graph 上限仍是计划 |
|
|
206
208
|
| `chain` | depth `8`、links `50`、tokenBudget `1500` | 宿主行 |
|
|
207
209
|
| `tools` | maxResultBytes `0` | 计划/只读;未被消费 |
|
|
208
210
|
| `defaults` | 职能 `execution`、交互 `think`、情景 `dialogue`、验证 `medium`、命令 `none` | 宿主行 |
|
|
209
211
|
|
|
210
|
-
`GET /deepseek-coordination/config` 返回 `{ values, defaults }`;`defaults` 来自 `resolveConfig(undefined)`,页面不复制默认字面量。`POST /config` 接收扁平点路径补丁(如 `{ "plan.threshold": 0.7 }`),按目录和真实 Schemastery schema 校验,写入活动配置,重新执行不变量(权重归一、别名镜像、强制开关、压缩阈值夹取),在压缩变化时重建 `TokenGovernor
|
|
212
|
+
`GET /deepseek-coordination/config` 返回 `{ values, defaults }`;`defaults` 来自 `resolveConfig(undefined)`,页面不复制默认字面量。`POST /config` 接收扁平点路径补丁(如 `{ "plan.threshold": 0.7 }`),按目录和真实 Schemastery schema 校验,写入活动配置,重新执行不变量(权重归一、别名镜像、强制开关、压缩阈值夹取),在压缩变化时重建 `TokenGovernor`,最后持久化实际写入的路径。
|
|
211
213
|
|
|
212
|
-
|
|
214
|
+
持久化落在宿主自己的覆盖文档 `<数据库目录>/config.overrides.json`:一个扁平的 `{ "plan.threshold": 0.7 }` 映射,原子写在协调数据库旁边,下次启动时覆盖在 profile 配置之上。这里没有用 DSH 的 `ctx.settings.update`——它只接受 `.volatile()` schema,而 volatile 节点会把每个解析值变成引用包装,本宿主无法在不重写所有配置读取的前提下接受。因此 `persisted: true` 表示“已存入协调宿主自己的文档”;只命中 `ignored` 行的写入返回 `false`。未知键、`databasePath`、`database` 会以 `INVALID_ARGUMENT` 拒绝;已知但不可写的键进入 `ignored`,绝不写入。`POST /config/compaction` 保留为旧的 auto/soft/hard 兼容小路由。
|
|
213
215
|
|
|
214
|
-
设置页整体使用 Material UI:每组一个默认展开的 `Accordion`,行放在 `List` 中;六个情景各一张 `Table`(页面没有情景下拉框);布尔用 `Checkbox`,枚举用 `RadioGroup
|
|
216
|
+
设置页整体使用 Material UI:每组一个默认展开的 `Accordion`,行放在 `List` 中;六个情景各一张 `Table`(页面没有情景下拉框);布尔用 `Checkbox`,枚举用 `RadioGroup`,**所有数字都用 `TextField type="number"`(含权重与比例,显示时按该行 step 取整)**;`Chip` 只表示 `主机 / 本机 / 强制 / 只读 / 计划中` 状态和连接状态。完全权限确认是一个位于 tooltip 层之上的 MUI `Dialog` 模态框,不再是内联色块。没有保存按钮,控件在 change/blur 时提交。强制行画禁用控件,只读行显示值,计划行明确说明当前运行时尚未读取。设置导航图标是宿主 shell 的限制所致:section 只接受 `{ id, order, label }`,插件只能用 CSS mask 给导航按钮补一个 Material `sync` 图标。
|
|
215
217
|
|
|
216
218
|
## 服务级接管
|
|
217
219
|
|
|
218
220
|
- 打开 `ui.takeover` 后,`TakeoverGate` 监听 DSH 的 `approval/request` 与 `user-questions/request` 瀑布。它写一条持久 pending 行、发出 `takeover/pending`,等待客户端路由送来人工答案。
|
|
221
|
+
- 监听器用 `{ prepend: true }` 注册。DSH 自己的审批/提问 UI 监听同一个瀑布,注册晚的监听器在 GUI 认领请求后永远不会执行。注意:部署的审批策略为 `never` 时,DSH 在进入瀑布之前就直接拒绝,此时无论开关如何都不会出现对话框。
|
|
219
222
|
- 超时、请求 signal 中止、显式取消或插件卸载都会调用 `next()`;闸门绝不把“没人回答”变成 `allowed-once` 或编造的问题答案。`unavailable` 是宿主 fail-closed 的结果,不作为用户决定接受。
|
|
220
223
|
- 对话框只在以下条件同时成立时每 1 秒轮询 `/takeover/pending`:本机“权限接管”开关打开、session id 真实、页面可见。它渲染第一条 pending 请求;队列多于一条时显示 `1 / N` 徽标。
|
|
221
224
|
- 审批提供 仅本次允许 / 拒绝 / 取消;只提交 `allowed-once` 与 `rejected`,取消/Esc/点背景走 cancel 路由。提问按单选渲染 radio、多选渲染 checkbox,并允许每题自由文本;所有问题答完前提交按钮禁用。
|
|
222
225
|
- **两个开关都需要**:宿主 `ui.takeover`(默认 `false`)负责打开闸门,本机“权限接管”负责让对话框轮询。宿主开关关闭时闸门立即委托,没有窗口可显示。
|
|
223
226
|
|
|
227
|
+
## 缓存代理(实验性,默认关闭)
|
|
228
|
+
|
|
229
|
+
DSH 在任何 adapter 看到请求之前就把它冻结了:`buildRequest()` 深冻结消息并 `Object.freeze` 请求,而 `llm/stream` 瀑布的兜底闭包持有这个对象。唯一还能重建出站内容的位置是 adapter 边界,所以插件注册一个额外 provider 路由(`coordination-proxy`),把每个请求重建后转发给真实 provider。
|
|
230
|
+
|
|
231
|
+
接线(`src/index.ts`、`src/host/proxy-adapter.ts`、`src/host/model-brand.ts`):
|
|
232
|
+
|
|
233
|
+
- `agent/request` 把路由改成 `coordination-proxy` 并记住真实路由。只有白名单内的 provider(`deepseek`、`deepseek-account`、`deepseek-official`)会被拦截,其他 provider 保持宿主选择的路由。
|
|
234
|
+
- adapter 用真实 provider 调 `ctx.llm.stream` 转发,传输、重试、归因头和用量统计仍由真实 adapter 负责。
|
|
235
|
+
- `ctx.llm.resolveModelInfo(provider, model)` 提供宿主的模型身份,再分类到内置缓存品牌(DeepSeek、OpenAI、Anthropic、Google、xAI、Moonshot、Qwen、Zhipu、Mistral、Meta、未知),带 `automaticPrefixCache`、`explicitCacheBreakpoints`、`minPrefixTokens`、`effortBreaksCache`、`stripVolatileHelps`。
|
|
236
|
+
- 只有当该家族有自动前缀缓存**且** `cache.enabled` 打开时才改写出站内容:`CacheModule.decorate` 把固定内容前置,并把易变片段(ISO 时间戳、UUID、长 hex、"当前时间"措辞)替换为稳定占位符。显式断点家族(Anthropic)永不改写,因为那里决定复用率的是标记而不是字节。仅供 UI 的 `cacheWarning` 字段会在转发前剥掉。
|
|
237
|
+
|
|
238
|
+
安全模型——代理能看到所有 prompt,因此设计成无法成为泄露通道:
|
|
239
|
+
|
|
240
|
+
1. 不接触凭据(无 `ctx.credentials`、无 token、无 `Authorization`、无 API key);
|
|
241
|
+
2. 无出网能力(模块零 import,没有 `fetch`/`http`/`net`;转发是进程内调用);
|
|
242
|
+
3. 不落盘内容——`proxy.log` 只收结构化事件(`{event, provider, model, brand, messages, chars, tools, reason}`),绝无 prompt 或回答正文;
|
|
243
|
+
4. 白名单在路由监听器和 adapter 双侧强制;
|
|
244
|
+
5. 拒绝/失败信息只报路由名;
|
|
245
|
+
6. 默认关闭、可逆。
|
|
246
|
+
|
|
247
|
+
启用方式:创建 `%DSH_HOME%\coordination\proxy.enable`(或 `DSH_COORDINATION_PROXY=1`)后重启。`GET /deepseek-coordination/proxy/status` 只报告计数与标识:`available`、`enabled`、`decorate`、`upstream`、`model`(品牌与策略)、`forwards`、`refusals`。删掉开关文件重启即回到普通链路。
|
|
248
|
+
|
|
224
249
|
## 自动压缩与 Token 治理器
|
|
225
250
|
|
|
226
251
|
`TokenGovernor` 估算上下文(CJK 感知的 O(n) 估算器,带 256 项有界 memo),按 `contextWindow - reserve` 规划预算,并在 `agent/pre-step` 利用率越过阈值时请求 DSH 的 `compactIfNeeded`。默认:soft `0.70`、hard `0.88`、reserve `max(2048, 窗口的 8%)` 且不超过窗口 25%、recentTurns `6`、cooldown `30 s`、maxPerSession `20`。
|
|
227
252
|
|
|
228
|
-
soft 阈值可按 0.30–0.90 的比例编辑;hard 为 0.30–0.98,且必须严格高于 soft。旧界面里的 60/70/80/88% 仍是合法取值(`0.60`、`0.70`、`0.80`、`0.88`),只是目录页现在用
|
|
253
|
+
soft 阈值可按 0.30–0.90 的比例编辑;hard 为 0.30–0.98,且必须严格高于 soft。旧界面里的 60/70/80/88% 仍是合法取值(`0.60`、`0.70`、`0.80`、`0.88`),只是目录页现在用 0.01 精度的数字输入框,而不是四项选择器。`compaction.auto=false` 只关闭自动压缩,不约束显式 compact 命令。
|
|
229
254
|
|
|
230
255
|
失败封闭是刻意设计:钩子绝不阻塞 step;压缩 port 缺失、返回 `null`/`undefined`、超时、抛错、每会话额度用尽或 cooldown 未到,全部按 no-op 处理,agent 继续执行 `next()`。治理器在构造时快照策略,所以设置热更新会同时重建它。实际安全范围和替换由 DSH 负责,本插件只决定何时值得请求。
|
|
231
256
|
|
|
@@ -314,6 +339,7 @@ P0 解析器是词法级、确定性的:JS/TS/JSX(import/export/`require`/
|
|
|
314
339
|
- 文件路径必须是工作区相对路径;绝对路径、盘符路径、UNC、`..` 逃逸与符号链接逃逸在读取前拒绝。二进制/NUL/不可解码内容直接拒绝,不猜。
|
|
315
340
|
- Turn 钩子只写 Turn 元数据和一条空 prompt 行,不镜像 DSH 对话,也不把文件内容复制进协调库。
|
|
316
341
|
- 权限预设立即写给 DSH(完全权限需二次确认),从不进入离线 localStorage;离线重放只覆盖五个已存选择字段。
|
|
342
|
+
- 可选的缓存代理不新增传输层和凭据面:它通过 DSH 自己的 `ctx.llm.stream` 转发,只记录结构化计数,并拒绝白名单之外的 provider。
|
|
317
343
|
- 接管绝不自动批准。超时、中止、取消、卸载都以 `next()` 委托;只有通过 answer 路由送达的人工决定才会结算窗口。
|
|
318
344
|
- 失败封闭是明确的:非法接管答案保持窗口;`PROFESSION_LOCKED` 不改选择;解析不确定标 `unverifiable`;解析/图溢出标 `truncated`;压缩失败是 no-op;Chain 的 `unknown` 不会自动通过。
|
|
319
345
|
- 协调库保存任务/审计行(包括 `prompt` 与追踪行),不保存凭据或 provider secret。配置投影中没有 DSH 凭据、token 或 provider key。
|
|
@@ -322,10 +348,10 @@ P0 解析器是词法级、确定性的:JS/TS/JSX(import/export/`require`/
|
|
|
322
348
|
|
|
323
349
|
| 检查 | 结果 |
|
|
324
350
|
|---|---|
|
|
325
|
-
| `npm test` | **
|
|
351
|
+
| `npm test` | **507 tests,506 pass,1 skipped(仅 GC),0 fail**,Node 24.21.0 上约 3 s |
|
|
326
352
|
| `npm run typecheck` / `npm run test:tsc` | 通过 |
|
|
327
353
|
| `npm run build` | 宿主 + 客户端 bundle 通过;MUI 的 `"use client"` directive 警告不致命 |
|
|
328
|
-
| `npm run pack:check` | OK
|
|
354
|
+
| `npm run pack:check` | OK:运行时 tarball 含四个发布文件 |
|
|
329
355
|
| 发布 CI | `.github/workflows/release.yml` 运行 typecheck、test:tsc、测试、pack:check,并在 `v*` Release 附上 tarball |
|
|
330
356
|
|
|
331
357
|
解析器与结构的数字是守卫,不是承诺:100k 字符解析测试保持在 3 秒内;数据结构报告记录 B+ 树 10k 插入 8.3/9.8 ms、skip list 10k 插入 6.4 ms、红黑树 10k 随机 set/delete 13.5 ms、稀疏网格 10k 单元 5.1 ms、`hashString` 100k 次 4.3 ms;复杂度审计记录 Turn 序号从 `COUNT(*)` 改为 `MAX(ordinal)`(2,000 条语句约 65–69 ms → 约 12–14 ms)以及路由排序(200 × 12 条路由的 2,400 次 posterior 查询降到 200 次)。
|
|
@@ -340,10 +366,11 @@ P0 解析器是词法级、确定性的:JS/TS/JSX(import/export/`require`/
|
|
|
340
366
|
6. **`parser.enabled` 仍需重新注册。** 其他文件层上限会即时 retune;关闭 parser 会立即失败关闭,但从工具列表增删四个工具仍要等下一次注册(重启)。
|
|
341
367
|
7. **没有浏览器 E2E。** UI 由类型、构建、settings-catalog 测试以及 takeover/bridge/集成测试覆盖;视觉验证仍是人工/截图。
|
|
342
368
|
8. **Node 引擎为 `>=22.13.0`。** `node:sqlite` 从 22.13.0/23.4.0 起不再需要实验开关;CI 与本次验证使用 24.21.0。
|
|
343
|
-
9. **profile 里可能仍记录着旧的包 spec。** 请核对实际安装的版本(`dsh --profile <name> --dump-config` 或 profile 的 `package.json`);安装 0.
|
|
369
|
+
9. **profile 里可能仍记录着旧的包 spec。** 请核对实际安装的版本(`dsh --profile <name> --dump-config` 或 profile 的 `package.json`);安装 0.11.0 tarball 或链接已构建的 checkout,不要假定上一次安装已被升级。
|
|
370
|
+
10. **缓存代理是实验性的、默认关闭。** 品牌 profile 是策略默认值而不是实测值,且只对自动前缀缓存的家族改内容;在已经稳定的会话上收益可能接近零——这正是它藏在开关和状态端点后面的原因。
|
|
344
371
|
|
|
345
372
|
## 仓库历史与许可
|
|
346
373
|
|
|
347
|
-
`0.1.x` 是另一个项目 **dsh-os**,已不在分支顶端;`0.2.0` 变成 DSH 插件 bundle;`0.3`–`0.6` 的 UI 从 Angular 经 MDUI、纯 React 迁到 Material UI;`0.7`–`0.9` 加入五个下拉框、i18n、职能锁定、接管、压缩、P0 解析器、领域模型和共享数据结构;`0.10.0` 加入设置目录、四个文件工具、第二轮数据结构采用和可验证 tarball
|
|
374
|
+
`0.1.x` 是另一个项目 **dsh-os**,已不在分支顶端;`0.2.0` 变成 DSH 插件 bundle;`0.3`–`0.6` 的 UI 从 Angular 经 MDUI、纯 React 迁到 Material UI;`0.7`–`0.9` 加入五个下拉框、i18n、职能锁定、接管、压缩、P0 解析器、领域模型和共享数据结构;`0.10.0` 加入设置目录、四个文件工具、第二轮数据结构采用和可验证 tarball;`0.11.0` 加入持久设置、推理交还 DSH,以及带品牌策略的实验性缓存代理。旧状态仍在 git 历史和 tag 中。
|
|
348
375
|
|
|
349
376
|
MIT © 2026 Eloy Kim。见 [LICENSE](LICENSE)。源码:[github.com/eloyhere/deepseek-coordination](https://github.com/eloyhere/deepseek-coordination)。
|