deepseek-coordination 0.1.5 → 0.1.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
@@ -85,7 +85,7 @@ deepseek-coordination/
85
85
  ├─ tests/ golden (Windows/POSIX/desktop injection), table conformance, encoding, plugin, permission, takeover, workflow suites
86
86
  │ ├─ conformance.ps1 command.txt and spec/verbs.tsv must describe the same surface (5 cases)
87
87
  │ ├─ takeover.test.mjs byte-level format preservation, read windowing, eligibility (41 cases)
88
- │ ├─ workflow.test.mjs phase gates, the user's choice, and the KV-cache invariant (30 cases)
88
+ │ ├─ workflow.test.mjs phase gates, the user's choice, and the KV-cache invariant (31 cases)
89
89
  │ ├─ smoke-desktop-sh.sh what the POSIX desktop verbs actually inject (52 cases)
90
90
  │ └─ fake-xdotool, fake-wmctrl recording stand-ins, so the desktop verbs can be verified with no X server
91
91
  └─ permission.json authorization data (an empty file in the repository; that is the initial state)
@@ -914,7 +914,7 @@ npm run test:all # runs everything below, in order
914
914
  | Plugin | `node tests/plugin.test.mjs` | 13 | **13 passed, 0 failed** |
915
915
  | Takeover interceptions | `node tests/takeover.test.mjs` | 41 | **41 passed, 0 failed** |
916
916
  | Permission delegate | `node tests/permission.test.mjs` | 18 | **18 passed, 0 failed** |
917
- | Workflow | `node tests/workflow.test.mjs` | 30 | **30 passed, 0 failed** |
917
+ | Workflow | `node tests/workflow.test.mjs` | 31 | **31 passed, 0 failed** |
918
918
  | Bundle resolution | `node tools/verify-bundle.mjs` | 16 | **16 passed, 0 failed** |
919
919
  | Package completeness | `node tools/verify-package.mjs` | 21 | **21 passed, 0 failed** |
920
920
  | Plugin load | `node tools/verify-plugin-load.mjs` | 30 | **30 passed, 0 failed** |
@@ -1068,10 +1068,11 @@ Copyright (c) 2026 Eloy Kim
1068
1068
  ```
1069
1069
 
1070
1070
  The licence file is pure ASCII, LF-terminated and BOM-free, consistent with the rest of the
1071
- repository's encoding contracts. One earlier description needs correcting: it is **not** listed in
1072
- `package.json`'s `files` whitelist (which has 20 entries; it includes `src/host/bin/dsh-os7.ps1` but
1073
- neither `LICENSE` nor `README.zh-CN.md`), so the file stays in a checkout but is not distributed with
1074
- the published package.
1071
+ repository's encoding contracts. An earlier description here claimed it was **not** distributed because it
1072
+ is not listed in `package.json`'s `files` whitelist. That was wrong, and the published tarball proves it:
1073
+ `npm pack deepseek-coordination@0.1.5` contains `package/LICENSE` **and** `package/README.zh-CN.md`, because
1074
+ npm always includes those two names regardless of `files`. The whitelist has 20 entries and includes
1075
+ `src/host/bin/dsh-os7.ps1`; the two files simply do not need to be in it.
1075
1076
 
1076
1077
  The verb contract and the specification documents are part of the source: a behaviour change should be
1077
1078
  reflected in `src/host/spec/verbs.tsv`, `src/host/command.txt` and `src/host/docs/os-spec.md`, not only
package/README.zh-CN.md CHANGED
@@ -603,7 +603,7 @@ npm run test:all # 按顺序跑下面全部
603
603
  | 插件 | `node tests/plugin.test.mjs` | 13 | **13 通过,0 失败** |
604
604
  | 接管拦截 | `node tests/takeover.test.mjs` | 41 | **41 通过,0 失败** |
605
605
  | 授权委托 | `node tests/permission.test.mjs` | 18 | **18 通过,0 失败** |
606
- | 工作流 | `node tests/workflow.test.mjs` | 30 | **30 通过,0 失败** |
606
+ | 工作流 | `node tests/workflow.test.mjs` | 31 | **31 通过,0 失败** |
607
607
  | bundle 解析 | `node tools/verify-bundle.mjs` | 16 | **16 通过,0 失败** |
608
608
  | 打包完整性 | `node tools/verify-package.mjs` | 21 | **21 通过,0 失败** |
609
609
  | 插件装载 | `node tools/verify-plugin-load.mjs` | 30 | **30 通过,0 失败** |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepseek-coordination",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Cross-platform atomic OS-interaction surface for the DeepSeek Harness: one argument-stable verb set implemented natively on each OS, with byte-exact charset, BOM and line-ending handling.",
@@ -1199,20 +1199,31 @@ export function workflowSectionText() {
1199
1199
  * The tool description.
1200
1200
  *
1201
1201
  * This is now the ONLY discovery path, because the prompt section is a frozen constant and cannot carry
1202
- * guidance. It is in the tool catalog, which sits inside the cached prefix and is sent once — so clarity
1203
- * here is cheaper than brevity, but it still has to be short enough not to bloat the prefix.
1202
+ * guidance. Two consequences it has to honour, and the first version of this text failed the first one:
1203
+ *
1204
+ * 1. it must NAME the tool. The earlier text said "Four calls:" and then listed `start` / `plan` /
1205
+ * `choose` / `run`, which reads as four tool names — a model following it would call tools that do not
1206
+ * exist. Caught by verifying the packed tarball rather than the checkout.
1207
+ * 2. every call in the shortest path is spelled as `workflow_plan(action: "...")`, so the model never has
1208
+ * to guess how the pieces fit together. The per-phase guidance is deliberately not here: it travels in
1209
+ * each result's `next` field, which is appended history and therefore costs the cache nothing.
1210
+ *
1211
+ * It lives in the tool catalog, inside the cached prefix, sent once and unchanged for the session.
1204
1212
  */
1205
1213
  const TOOL_DESCRIPTION = [
1206
- 'Intent-first workflow: agree on what is wanted and how it will be done, before doing it. Use it when a',
1207
- 'request is more than one obvious step, or when you would have to guess the user\'s intent, their',
1208
- 'preferred approach, or where the work belongs. Four calls:',
1209
- '"start" (the prompt verbatim, plus 1-3 questions about intent OR the assumptions you are making) ->',
1210
- '"plan" (approach and process, at least two alternatives with pros and cons, your recommendation) ->',
1211
- '"choose" (ASKS THE USER; you cannot answer it for them) ->',
1212
- '"run" (execute the chosen option; add "outcome" to close the workflow in the same call).',
1213
- 'Then "note" for a decision, "checkpoint" at a boundary. Long documents go to files and only a line',
1214
- 'returns, so the conversation stays small; results list the files. A step out of order is refused, and the',
1215
- 'refusal names the phase to record first. Every result carries "next", the one call to make. Also "status", "reset".',
1214
+ 'workflow_plan: agree on what is wanted and how it will be done, before doing it. Use it when a request is',
1215
+ 'more than one obvious step, or when you would have to guess the user\'s intent, their preferred approach,',
1216
+ 'or where the work belongs. Call it four times:',
1217
+ '1. workflow_plan(action: "start") — the user\'s prompt verbatim, plus 1-3 questions about intent OR the',
1218
+ 'assumptions you are making.',
1219
+ '2. workflow_plan(action: "plan") — the approach and process, at least two alternatives with pros and cons,',
1220
+ 'and which one you recommend.',
1221
+ '3. workflow_plan(action: "choose") — ASKS THE USER; their answer is recorded and you cannot answer it for them.',
1222
+ '4. workflow_plan(action: "run") — execute the chosen option; add "outcome" to close the workflow in this call.',
1223
+ 'Each result carries "next", the one call to make. Then workflow_plan(action: "note") for a decision, or',
1224
+ '"checkpoint" at a boundary. Long documents go to files and only a line comes back, so the conversation stays',
1225
+ 'small; results list the files. A step out of order is refused, and the refusal names the phase to record',
1226
+ 'first. Also available: "status", "reset".',
1216
1227
  ].join(' ')
1217
1228
 
1218
1229
  const QUESTION_SCHEMA = {