dsh-deeppilot 0.9.1 → 0.9.2
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/docs/DSH_RELEASE_MEMORY.md +176 -0
- package/lib/client.js +488 -209
- package/lib/client.js.map +1 -1
- package/lib/index.d.ts +219 -85
- package/lib/index.js +6905 -6012
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,6 +5,52 @@
|
|
|
5
5
|
|
|
6
6
|
## Current decision
|
|
7
7
|
|
|
8
|
+
- **Audited release:** `dsh-v0.2.1-alpha.1` (official release page:
|
|
9
|
+
<https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.1-alpha.1>),
|
|
10
|
+
published 2026-10-03 on the npm `alpha` dist-tag. It is **not** `latest`;
|
|
11
|
+
`latest`/`next` still point at `0.2.0-rc.2`, which is what the current Host runs.
|
|
12
|
+
- **Comparison baseline:** `dsh-v0.2.0-rc.2` (the previous plugin baseline).
|
|
13
|
+
- **Plugin runtime verdict:** **no breaking change in the DSH APIs that DeepPilot
|
|
14
|
+
currently calls.** All 12 peer packages have **zero** changed `src/` files
|
|
15
|
+
between the two tags — each changed only its `package.json` version field and
|
|
16
|
+
its READMEs. See the 2026-10-03 entry below for the full finding-by-finding
|
|
17
|
+
table and for the three official upgrade guides checked against this plugin.
|
|
18
|
+
- **Nothing was changed to support this release.** `package.json`,
|
|
19
|
+
`package-lock.json`, generated `lib/`, `COMPATIBILITY.md`, and `PROTOCOL.md`
|
|
20
|
+
deliberately still describe the `0.2.0-rc.2` baseline. The release-audit-only
|
|
21
|
+
scope was agreed before the audit ran, so no version bump, no dependency
|
|
22
|
+
install, and no `lib/` regeneration was performed.
|
|
23
|
+
- **Peer range still admits it:** `>=0.2.0-rc.2 <0.3.0-0` satisfies
|
|
24
|
+
`0.2.1-alpha.1` under `semver.satisfies(..., { includePrerelease: true })`,
|
|
25
|
+
which is how DSH's `evaluatePluginCompatibility` gates activation. The same
|
|
26
|
+
holds for the `~4.0.4` / `~3.18.4` vendor ranges against `4.0.5-alpha.1` /
|
|
27
|
+
`3.18.5-alpha.1`. Under npm's **default** prerelease handling those three do
|
|
28
|
+
not match, so installing on an alpha host from npm reports peer warnings.
|
|
29
|
+
- **Protocol verdict:** no required DeepPilot phone-protocol break. Protocol v2,
|
|
30
|
+
pairing state, and device records are unchanged; already-paired phones need no
|
|
31
|
+
action.
|
|
32
|
+
- **Release verdict (`0.9.2`, shipped 2026-10-04):** `scripts/smoke-live.mts`
|
|
33
|
+
was run against a live **`dsh-v0.2.1-alpha.1`** web profile and passed with
|
|
34
|
+
**0 failures**. This is the first live-host verification since the 0.9.1
|
|
35
|
+
entry, and it retires the gate that entry left open ("pending separate
|
|
36
|
+
authorization before the `0.9.1` release ships") — on a newer host than the
|
|
37
|
+
rc.2 that entry contemplated, which is strictly stronger evidence: the
|
|
38
|
+
`0.2.1-alpha.1` source-diff above found zero changed `src/` files across all
|
|
39
|
+
12 peer packages, and the live run agrees. The plugin's own build and type
|
|
40
|
+
baselines stay pinned to `0.2.0-rc.2`; nothing about the pin changed for this
|
|
41
|
+
release.
|
|
42
|
+
- **Two tracked follow-ups:**
|
|
43
|
+
1. **Schedule documentation is now stale.** Automation tasks became a
|
|
44
|
+
built-in Web capability and `@deepseek-ai/dsh-experimental-schedule-bundle`
|
|
45
|
+
is in DSH's new `RETIRED_BUNDLES` set, so the user instruction "enable
|
|
46
|
+
Automation tasks in the plugin manager" points at a retired bundle.
|
|
47
|
+
Affects `PROTOCOL.md`, `COMPATIBILITY.md`, and the iOS copy. **Open.**
|
|
48
|
+
2. ~~`subagent_session` is unmapped.~~ **Resolved 2026-10-03:** mapped to
|
|
49
|
+
`E_PROTOCOL` in `src/wire-errors.ts` and added to the frozen expectation in
|
|
50
|
+
`tests/wire-errors.test.ts`. 525 unit tests, typecheck, and build pass.
|
|
51
|
+
|
|
52
|
+
### Previous decision — `dsh-v0.2.0-rc.2`
|
|
53
|
+
|
|
8
54
|
- **Audited release:** `dsh-v0.2.0-rc.2` (official release page:
|
|
9
55
|
<https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.0-rc.2>).
|
|
10
56
|
- **Comparison baseline:** `dsh-v0.2.0-rc.1` (the previous plugin baseline).
|
|
@@ -27,6 +73,9 @@
|
|
|
27
73
|
against the new range. The one remaining release-only step is a live
|
|
28
74
|
`scripts/smoke-live.mts` run on a real rc.2 host, pending separate
|
|
29
75
|
authorization before the `0.9.1` release ships.
|
|
76
|
+
**Closed 2026-10-04:** that gate was discharged by the `0.9.2` live run
|
|
77
|
+
instead — see the release verdict in "Current decision" above. It ran on
|
|
78
|
+
`0.2.1-alpha.1` rather than rc.2, which supersedes this entry's intent.
|
|
30
79
|
- **Protocol verdict:** no required DeepPilot phone-protocol break. Protocol v2,
|
|
31
80
|
pairing state, and device records are unchanged; already-paired phones need no
|
|
32
81
|
action.
|
|
@@ -35,6 +84,133 @@
|
|
|
35
84
|
bundle" below. The plugin needs no code change; the phone's copy now points
|
|
36
85
|
at the bundle.
|
|
37
86
|
|
|
87
|
+
## 2026-10-03 — audit of `dsh-v0.2.1-alpha.1`
|
|
88
|
+
|
|
89
|
+
### Scope and method
|
|
90
|
+
|
|
91
|
+
Compared `dsh-v0.2.0-rc.2...dsh-v0.2.1-alpha.1` (**266 commits, 4190 changed
|
|
92
|
+
files**) from a fresh blobless clone
|
|
93
|
+
(`git clone --filter=blob:none --no-checkout`), unshallowed before measuring.
|
|
94
|
+
Package names were mapped to monorepo paths by reading every `package.json`
|
|
95
|
+
through a sparse checkout, then each package's `src/` was diffed with
|
|
96
|
+
`git diff --name-status`. Baseline SHA `639ed015`, target SHA `5badb150`.
|
|
97
|
+
|
|
98
|
+
### Peer packages: 12 of 12 have zero changed source
|
|
99
|
+
|
|
100
|
+
Every peer package this plugin declares in `package.json` changed **only** its
|
|
101
|
+
`package.json` and its READMEs. No `src/` file moved:
|
|
102
|
+
|
|
103
|
+
| Package | Path | Version | Changed `src/` files |
|
|
104
|
+
| --- | --- | --- | --- |
|
|
105
|
+
| `@deepseek-ai/dsh` | `apps/cli` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
106
|
+
| `@deepseek-ai/dsh-api-gateway` | `packages/api/gateway` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
107
|
+
| `@deepseek-ai/dsh-api-remotes` | `packages/api/remotes` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
108
|
+
| `@deepseek-ai/dsh-client-connection` | `packages/client/connection` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
109
|
+
| `@deepseek-ai/dsh-client-locale` | `packages/client/locale` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
110
|
+
| `@deepseek-ai/dsh-client-ui-settings` | `packages/client/ui-settings` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
111
|
+
| `@deepseek-ai/dsh-client-ui-slots` | `packages/client/ui-slots` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
112
|
+
| `@deepseek-ai/dsh-settings` | `packages/settings/settings` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
113
|
+
| `@deepseek-ai/dsh-typert-protocol` | `packages/typert/protocol` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
114
|
+
| `@deepseek-ai/dsh-typert-registry` | `packages/typert/registry` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
|
|
115
|
+
| `@deepseek-ai/cordis` | `vendor/cordis` | `4.0.4` → `4.0.5-alpha.1` | 0 |
|
|
116
|
+
| `@deepseek-ai/schemastery` | `vendor/schemastery` | `3.18.4` → `3.18.5-alpha.1` | 0 |
|
|
117
|
+
|
|
118
|
+
The only non-manifest, non-README change inside a peer package is a **new test
|
|
119
|
+
case** in `packages/api/gateway/tests/gateway.host.spec.ts`, which records a
|
|
120
|
+
behaviour fix: a Service already disposed is skipped during SRC resolution. No
|
|
121
|
+
shipped code changed, so `typertGateway.wireStream.open(endpoint, payload,
|
|
122
|
+
uplink, peer, signal)` keeps its argument order — the seam this plugin's
|
|
123
|
+
highest-risk integration depends on.
|
|
124
|
+
|
|
125
|
+
### High-risk service surfaces
|
|
126
|
+
|
|
127
|
+
| Area | Finding | DeepPilot impact |
|
|
128
|
+
| --- | --- | --- |
|
|
129
|
+
| `api/session-controller` (`src/index.ts`, `src/list.ts`) | Adds one optional config key `listWorkSliceMs` (natural, min 1, **default 16**) and threads it into `new ApiSessionList(ctx, resolved.listWorkSliceMs)` so large listings yield between rows. No `@Remote` method signature changed. | None. The hand-written `SessionControllerLike` mirror still matches; the plugin never constructs the controller. |
|
|
130
|
+
| `api/workspace-controller` | Zero changed `src/` files. | None. |
|
|
131
|
+
| `schedule/schedule` | `src/tools.ts` and `src/invariant.ts` **deleted**; `ScheduleService.inject` drops `'tools'`; `src/types.ts` gains `SubagentSessionError`. | See the two rows below. |
|
|
132
|
+
| `boot/app-boot` | `createRuntimeResolution` now returns a `ProfileRuntimeResolution` **class instance** instead of a frozen plain object, and a new `RETIRED_BUNDLES` set exists. | None. `app-boot` is not in this plugin's peer set. |
|
|
133
|
+
|
|
134
|
+
### The three announced breaking changes, checked against this plugin
|
|
135
|
+
|
|
136
|
+
Each was traced to its implementation in the DSH tree rather than accepted from
|
|
137
|
+
the release note.
|
|
138
|
+
|
|
139
|
+
| Breaking change | Where it actually lands | DeepPilot impact |
|
|
140
|
+
| --- | --- | --- |
|
|
141
|
+
| **Runtime invariant plugins and every `./invariant` export removed.** | `@deepseek-ai/dsh-invariants`, `InvariantRegistry`, `InvariantInstaller` and all `<package>/invariant` subpaths stop being published; `sdk-minimal` drops five rows. Official guide: `docs/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/`. | **None.** The plugin source contains zero `invariant` references. In `package-lock.json` the package appears only as a transitive dependency of `dsh-credentials`, `dsh-scope`, `dsh-settings` and `dsh-system-prompt` — packages this plugin does not import or configure. `cordis.patch.yml` declares no invariant rows, so no `patch: entry ... not found` warning can occur. |
|
|
142
|
+
| **Subpath plugins no longer read their own `package.json`; text and icon must come from subpath exports.** | `boot/app-boot/src/package-meta.ts`: `manifestPath` is now `packageName === specifier ? optionalResourcePath(...) : undefined`, so only a package-root specifier reads a manifest; a subpath instead takes its icon from an exported `<specifier>/icon`. A new `assertPackageOwned` keeps an exported icon inside its owning package. Official guide: `docs/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/`, which states the affected group is "authors who export a subpath `package.json`". | **None.** `package.json` exports `./package.json` (package root) but **not** `./client/package.json`, and the root manifest still supplies `name`, `description` and `icon.svg`. Verified against Node's real exports gate in this repo: `dsh-deeppilot/client/package.json`, `dsh-deeppilot/client/icon` and `dsh-deeppilot/client/locale/en.json` all fail with `ERR_PACKAGE_PATH_NOT_EXPORTED` **today**, so the old code could never have resolved them either. Old and new resolution therefore produce the same result. |
|
|
143
|
+
| **Composer statistics split into `activity` and `usage` entries; plugins overriding the old `stats` row must change their registered ID.** | The `stats` composer row was reworked (the `composer-session-stats-pills` design note is archived). | **None.** The plugin registers exactly one client extension — `slots.inject('settings.section', ...)` in `src/client/index.ts:478` — and never registers a composer row. The `row.stats` at `src/host-bridge.ts:663` is this plugin's own wire structure, unrelated to the composer extension. |
|
|
144
|
+
|
|
145
|
+
### Automation tasks moved into the Web composition
|
|
146
|
+
|
|
147
|
+
This is the one substantive product change, and it invalidates documentation
|
|
148
|
+
rather than code.
|
|
149
|
+
|
|
150
|
+
`boot/app-boot/src/profile.ts` adds:
|
|
151
|
+
|
|
152
|
+
```ts
|
|
153
|
+
const RETIRED_BUNDLES: ReadonlySet<string> = new Set([
|
|
154
|
+
'@deepseek-ai/dsh-experimental-schedule-bundle',
|
|
155
|
+
])
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
and removes that bundle from `OPTIONAL_BUNDLES` (replaced by
|
|
159
|
+
`@deepseek-ai/dsh-experimental-inspector-profile`). `loadProfileDirectory`
|
|
160
|
+
rewrites the profile's `package.json` to drop the retired entry; stored tasks and
|
|
161
|
+
delivery records survive on disk. The official guide
|
|
162
|
+
(`docs/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/`) states that
|
|
163
|
+
`@deepseek-ai/dsh-web-app` now mounts `schedule` and `ui-schedule` in **every**
|
|
164
|
+
Web profile.
|
|
165
|
+
|
|
166
|
+
The plugin needs no code change. It resolves the service lazily through
|
|
167
|
+
`ctx.get('schedule')` (the fix recorded in the 2026-09-29 entry), never lists
|
|
168
|
+
`schedule` in `inject`, and already reports `E_UNSUPPORTED` when the service is
|
|
169
|
+
absent. On a `0.2.1-alpha.1` Web profile the service is simply always present,
|
|
170
|
+
so `welcome.capabilities.schedules` becomes `true` by default instead of by
|
|
171
|
+
opt-in.
|
|
172
|
+
|
|
173
|
+
What is now wrong is the instruction the plugin gives users. `PROTOCOL.md`
|
|
174
|
+
(line 899), `COMPATIBILITY.md` (lines 39–47), `docs/RELEASE_NOTES-0.9.0.md`, and
|
|
175
|
+
`docs/DEEPPILOT_FEATURE_PLAN.md` all tell the user to enable **Automation tasks**
|
|
176
|
+
in the plugin manager, and the iOS copy repeats it. On this release that entry is
|
|
177
|
+
retired and auto-cleaned, so the instruction sends users after a bundle that no
|
|
178
|
+
longer exists.
|
|
179
|
+
|
|
180
|
+
The upgrade guide's migration step 2 — keep `schedule`/`ui-schedule` overrides in
|
|
181
|
+
a patch layer and delete a top-level `time-context` override — **does not apply
|
|
182
|
+
here**: `cordis.patch.yml` is 20 lines long and contains only the three
|
|
183
|
+
directory-picker rows, with no `schedule`, `ui-schedule` or `time-context`
|
|
184
|
+
entries.
|
|
185
|
+
|
|
186
|
+
### New Schedule refusal: `subagent_session`
|
|
187
|
+
|
|
188
|
+
`ScheduleService` now refuses `create` and `update` when the target Session has
|
|
189
|
+
a delegation depth above zero, returning a new stable `ScheduleInputError`
|
|
190
|
+
code `subagent_session` ("This Session belongs to subagent routing, which never
|
|
191
|
+
receives reminder delivery"). `delete` deliberately still works so tasks stored
|
|
192
|
+
before the rule existed stay removable. The refusal is also visible to subagents
|
|
193
|
+
because the bridge reaches this code through the same `@Remote` methods.
|
|
194
|
+
|
|
195
|
+
`src/wire-errors.ts` now maps twelve Schedule codes, adding `subagent_session` →
|
|
196
|
+
`E_PROTOCOL` alongside `schedule_not_found`, `invalid_selector`, `not_future`,
|
|
197
|
+
`frequency_too_high`, `schedule_ended` and the rest. It was chosen over
|
|
198
|
+
`E_UNSUPPORTED` because the capability exists on the host — it is this request's
|
|
199
|
+
target that can never be satisfied, so a phone retry is pointless — which puts it
|
|
200
|
+
in the same class as the other input-shaped Schedule refusals. Without the
|
|
201
|
+
mapping `wireErrorOf` falls through to `WIRE_ERROR_FALLBACK` (`E_INTERNAL`), which
|
|
202
|
+
would tell the client the failure was worth retrying.
|
|
203
|
+
|
|
204
|
+
### Re-audit procedure used
|
|
205
|
+
|
|
206
|
+
Same blobless-clone method as the rc.2 and rc.1 entries, with two refinements:
|
|
207
|
+
unshallow before measuring (a `--depth=1` clone silently under-reports the diff,
|
|
208
|
+
returning 4190 vs 4760 paths depending on history), and resolve peer package
|
|
209
|
+
names through a sparse `package.json` checkout instead of guessing directory
|
|
210
|
+
names — the monorepo maps `@deepseek-ai/dsh-api-gateway` to
|
|
211
|
+
`packages/api/gateway`, `@deepseek-ai/dsh` to `apps/cli`, and the two vendored
|
|
212
|
+
packages to `vendor/`.
|
|
213
|
+
|
|
38
214
|
## 2026-09-29 — audit of `dsh-v0.2.0-rc.2`
|
|
39
215
|
|
|
40
216
|
### Scope and method
|