dsh-deeppilot 0.8.1 → 0.8.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/COMPATIBILITY.md +20 -145
- package/README.md +9 -29
- package/README.zh-CN.md +7 -25
- package/lib/client.js +21 -59
- package/lib/client.js.map +1 -1
- package/lib/index.d.ts +21 -27
- package/lib/index.js +41 -136
- package/lib/index.js.map +1 -1
- package/package.json +20 -20
package/COMPATIBILITY.md
CHANGED
|
@@ -1,154 +1,29 @@
|
|
|
1
1
|
# Compatibility
|
|
2
2
|
|
|
3
|
-
This
|
|
3
|
+
This branch targets **DSH 0.1.7-rc.1**. The DSH peer dependencies and the development packages are pinned to that exact release. Earlier DSH builds and later release candidates are outside this branch's support scope.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
| Component | Baseline | Evidence |
|
|
5
|
+
| Component | Current contract | Evidence |
|
|
8
6
|
|---|---|---|
|
|
9
|
-
| Node.js | 22 or newer |
|
|
10
|
-
| DSH CLI and Host API |
|
|
11
|
-
|
|
|
12
|
-
| Remote access | Tailscale Funnel
|
|
13
|
-
|
|
7
|
+
| Node.js | 22 or newer | Package engine and CI |
|
|
8
|
+
| DSH CLI and Host API | `0.1.7-rc.1` | Peer metadata, source typecheck, unit tests, bundle build, and config schema projection against rc.1 |
|
|
9
|
+
| iOS bridge | DeepPilot protocol v2 | Bridge protocol tests; device behavior must be checked with the running Host and app |
|
|
10
|
+
| Remote access | Tailscale Funnel on ports 443, 8443, or 10000 | Helper and supervisor tests |
|
|
11
|
+
|
|
12
|
+
## DSH interfaces used here
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
- The Host adapter uses Session and Workspace controllers, Gateway Remote Events, and `typertGateway.wireStream.open(endpoint, payload, uplink, peer, signal)`. Its in-process carrier passes `undefined` for `uplink` and `peer` and the cancellation signal in argument five.
|
|
15
|
+
- The resident Client sends relative RPC paths such as `api/$events/result`. The in-process transport resolves those paths to a local URL before constructing a Node `Request`; the shared Fetch handler dispatches it without a network request. This is required for iOS approval and question answers to settle at the Gateway.
|
|
16
|
+
- The client settings page binds `configForms.get('deeppilot')` when the service becomes available. The Host reads volatile config references from its profile entry and reconciles transports on `loader/volatile-update`.
|
|
17
|
+
- Typert strict codecs publish `create()` factories. Session opening reads `session.projections` for a complete baseline.
|
|
18
|
+
- The Host adapter retains a stable bridge-facing API so the phone protocol does not depend directly on DSH controller shapes. This adapter is an internal design boundary, not support for an older DSH Host.
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
- The pairing QR now encodes a `deeppilot://pair` link, and the settings page shows that same string in one copy field. An app build that predates the link only parses the JSON payload, so it must be updated before pairing against this plugin; a link pasted into an older app is rejected instead of being half-applied. The current app still accepts the JSON payload.
|
|
19
|
-
- Plugin `0.7.x` serves the LAN listener over self-signed TLS only; devices paired over LAN with `0.6.x` or older must pair again so the app receives the certificate fingerprint. The DSH web server no longer carries `/phone` compatibility routes. Funnel pairings are unaffected.
|
|
20
|
-
- Bearer authentication, URL credentials, and first-frame shared tokens are rejected. A supported client registers a P-256 public key through `/phone/pair` and signs each WebSocket challenge.
|
|
21
|
-
- Without a compatible embedded helper, the core bridge and trusted-LAN mode can still run; remote Funnel reports `unavailable`.
|
|
22
|
-
- If a DSH Host API is missing, only the dependent capability should be disabled. The plugin must not crash the Host.
|
|
23
|
-
- Plugin `0.7.x` requires DSH `0.1.5-rc.1` or newer within the `0.1.x` line.
|
|
24
|
-
Older plugin versions used developer-preview DSH builds and remain historical
|
|
25
|
-
artifacts.
|
|
26
|
-
- The declared peer range is a disjunction,
|
|
27
|
-
`^0.1.5-rc.1 || >=0.1.6-alpha.1 <0.2.0-0 || >=0.1.7-alpha.1 <0.2.0-0`,
|
|
28
|
-
because npm's prerelease rule only
|
|
29
|
-
lets a prerelease version satisfy a range whose comparators carry a
|
|
30
|
-
prerelease on the same `major.minor.patch` tuple. Neither `^0.1.5-rc.1` nor
|
|
31
|
-
`>=0.1.5-rc.1` alone admits a `0.1.6` prerelease, and the `0.1.7-alpha.*`
|
|
32
|
-
line is likewise rejected by `>=0.1.6-alpha.1 <0.2.0-0` because no
|
|
33
|
-
comparator there carries a prerelease on the `0.1.7` tuple — every new
|
|
34
|
-
prerelease line needs its own disjunct.
|
|
35
|
-
`tests/compatibility-metadata.test.ts`
|
|
36
|
-
asserts the range admits `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.6-alpha.1`,
|
|
37
|
-
`0.1.6-beta.1`, `0.1.6`, `0.1.7-alpha.1` and `0.1.7`,
|
|
38
|
-
and rejects `0.2.0`.
|
|
39
|
-
- DSH `0.1.6-alpha.1` replaced `agent/session-start` with `agent/created`,
|
|
40
|
-
deprecated the synchronous `snapshotEvents`/`eventAt`/`ownEvents` history
|
|
41
|
-
readers, and renamed the PTC packages to the `ptc-runtime` family. The plugin
|
|
42
|
-
uses none of those surfaces: every host dependency is resolved structurally
|
|
43
|
-
from the Cordis context (`sessionController`, `workspaceController`,
|
|
44
|
-
`directoryPickerController`, `sessionProjections`) and the `session/event`
|
|
45
|
-
and `api-session/*` events, all of which kept their `0.1.5-rc` shape.
|
|
46
|
-
- DSH `0.1.6-alpha.2` changed the strict codec shape carried by an
|
|
47
|
-
`InvocationDescriptor`. Through `0.1.6-alpha.1` a descriptor published the
|
|
48
|
-
schema value itself and every consumer called `codec.schema.parse(value)`;
|
|
49
|
-
`alpha.2` instead validates a lazy `create()` factory at registration and the
|
|
50
|
-
Gateway parses through `codec.create().parse(value)`. A codec carrying only
|
|
51
|
-
`schema` is rejected by the `alpha.2` registry
|
|
52
|
-
(`typert: … strict codec has no create() factory`), which aborts plugin
|
|
53
|
-
activation. One `strictCodec()` helper in `src/report-wire.ts` emits both
|
|
54
|
-
keys — the same hand-written, dependency-free codec — so a single published
|
|
55
|
-
package registers and parses on either generation, and
|
|
56
|
-
`tests/report-wire.test.ts` pins both access paths.
|
|
57
|
-
The other `alpha.2` Typert change — a contributed schema's materialized
|
|
58
|
-
`schema` becoming a lazy `create()` factory — does not apply here: this
|
|
59
|
-
Remote contributes no schemas, which the same test asserts.
|
|
60
|
-
- DSH `0.1.7-alpha.1` reordered the Host `typertGateway.wireStream.open`
|
|
61
|
-
parameters from `(endpoint, payload, signal)` to
|
|
62
|
-
`(endpoint, payload, uplink, peer, signal)`. The reorder is not additive: a
|
|
63
|
-
3-argument call lands the `AbortSignal` in the `uplink` slot, leaves `signal`
|
|
64
|
-
undefined, and the Host fails every stream inside
|
|
65
|
-
`AbortSignal.any([signal, …])` with
|
|
66
|
-
`TypeError [ERR_INVALID_ARG_TYPE]: The "signals[0]" argument must be an
|
|
67
|
-
instance of AbortSignal`. The resident Client's Connection treats that dead
|
|
68
|
-
generation as a lost connection and prints an endless
|
|
69
|
-
`[connection] connection lost, retry #N` loop with exponential backoff while
|
|
70
|
-
the phone's approval and question round-trips stay broken.
|
|
71
|
-
`openHostStream()` in `src/dsh012-remote-interactions.ts` selects the
|
|
72
|
-
contract from the published arity (`open.length`) and passes `undefined` for
|
|
73
|
-
both `uplink` and `peer` on 0.1.7 — the documented "operator's in-process
|
|
74
|
-
carrier" case, since DeepPilot's carrier owns the Host in process and has no
|
|
75
|
-
Client-to-Host uplink. `tests/dsh012-wire-stream-contract.test.ts` pins the
|
|
76
|
-
argument binding for a 3-arity and a 5-arity Host, and asserts the signal
|
|
77
|
-
lands in each contract's declared slot.
|
|
78
|
-
- DSH `0.1.7-alpha.1` rewrote the settings subsystem: `installSection`,
|
|
79
|
-
`SettingsSectionHooks`, and the client `settingsScope` service are gone,
|
|
80
|
-
section values persist in this plugin own profile config entry, and the
|
|
81
|
-
settings UI refuses writes to fields the schema does not declare
|
|
82
|
-
`.volatile()`. The plugin adapts across both generations: `live()` in
|
|
83
|
-
`src/config.ts` feature-detects the volatile method and, on schemastery
|
|
84
|
-
3.18.2, writes the same metadata through `extra('volatile', true)` (an
|
|
85
|
-
unconditional `.volatile()` throws at import on ≤ 0.1.6 and kills
|
|
86
|
-
activation); volatile fields are exactly the ones the settings surface
|
|
87
|
-
writes (`enabled`, `local`, `remote`, plus read-time `debug`) while
|
|
88
|
-
`devicesPath`, `historyBufferMax`, and `push` keep remount-on-edit
|
|
89
|
-
semantics; `normalizeOptions` unwraps the `{ get() }`
|
|
90
|
-
references 0.1.7 carries in `apply()` options (a surviving reference fails
|
|
91
|
-
every plain-value comparison the bridge makes), the host re-runs its
|
|
92
|
-
transport reconciles on `loader/volatile-update`, and the client binds
|
|
93
|
-
`ctx.configForms.get('deeppilot')` through `src/client/settings-scope.ts`
|
|
94
|
-
when `settingsScope` is absent. Neither seam is declared in the client
|
|
95
|
-
entry's `inject`: a service name no running host provides keeps the whole
|
|
96
|
-
entry pending (`dsh-deeppilot: pending (waiting for service: settingsScope)`
|
|
97
|
-
on the first 0.1.7 boot), so both are awaited as optional injections, and
|
|
98
|
-
both are read through `ctx.get()` because a Cordis context proxy throws
|
|
99
|
-
`cannot get property "settingsScope" without inject` on an undeclared
|
|
100
|
-
service read; `tests/client-entry.test.ts` activates the real entry against
|
|
101
|
-
a Cordis context shaped like each generation and pins that audit. The same
|
|
102
|
-
release added
|
|
103
|
-
`session.projections`; the bridge feature-detects it via
|
|
104
|
-
`supportsProjections` and refreshes a session projection baseline on open,
|
|
105
|
-
while older hosts keep list-row projection hints. Plugin-manager display
|
|
106
|
-
metadata (`locale/*.json`, `package.json.icon`) and `--dump-config-schema`
|
|
107
|
-
are additive and inert on older hosts; `npm run check:config-schema`
|
|
108
|
-
projects this package Config through the pinned 0.1.7 CLI in CI and pins
|
|
109
|
-
the volatile annotations on the four live fields (devDependency floor:
|
|
110
|
-
`@deepseek-ai/schemastery` 3.18.3, which is also what a profile install
|
|
111
|
-
resolves through the `^3.18.2` peer range).
|
|
112
|
-
- `icon.svg` is a vector recreation of the iOS app icon, built from the
|
|
113
|
-
private app's own Icon Composer sources (`ios/DeepPilot.icon/icon.json`
|
|
114
|
-
plus `Assets/deepseek.svg`) and the in-app composition its
|
|
115
|
-
`AppIconArtwork` applies: a white field, the DeepSeek brand glyph fitted
|
|
116
|
-
with 13% padding, and a `Color(white: 0.25)` → black vertical gradient.
|
|
117
|
-
The app's `.icon` bundle is not distributable through npm — the host
|
|
118
|
-
inlines a single relative SVG, PNG, JPEG, or WebP file under 256 KiB as a
|
|
119
|
-
`data:` URI — so the recreation is the only way to keep the two icons
|
|
120
|
-
visually identical. `tests/package-meta.test.ts` pins the host's reader
|
|
121
|
-
rules; regenerate the SVG from the app sources whenever the app icon
|
|
122
|
-
changes.
|
|
123
|
-
- DSH `0.1.6-alpha.2` made runtime plugin removal real, through both the
|
|
124
|
-
Plugin Manager and the client entry reconciler. Every long-lived resource is
|
|
125
|
-
registered through `ctx.effect`, and the settings-page stylesheet stamps
|
|
126
|
-
`data-plugin="dsh-deeppilot"` so the module system's `removeOwnedStyles()`
|
|
127
|
-
can delete it; the module system only auto-claims styles present during
|
|
128
|
-
factory materialization, while this sheet is injected from `apply()`.
|
|
129
|
-
Without that stamp, disabling the plugin would leave its sheet styling the
|
|
130
|
-
page.
|
|
131
|
-
- The compatibility facade converts the
|
|
132
|
-
current Session controller's raw event arrays into the stable wrapped
|
|
133
|
-
history entries consumed by the phone bridge. Sessions persisted by earlier
|
|
134
|
-
Hosts can therefore be listed and opened when the rc.1 Host's own
|
|
135
|
-
persistence reader accepts their log vocabulary. Unsupported persisted
|
|
136
|
-
formats still fail closed in the Host without modifying the original log.
|
|
20
|
+
## Separate protocol and data boundaries
|
|
137
21
|
|
|
138
|
-
|
|
22
|
+
- Protocol v2 is the only supported phone wire version. Protocol-v1 devices must pair again. The LAN listener uses its own TLS identity and certificate pinning; old LAN pairings without a fingerprint must also pair again.
|
|
23
|
+
- The current app accepts the `deeppilot://pair` link and the JSON pairing payload. Bearer authentication, URL credentials, and first-frame shared tokens are rejected; devices register a P-256 public key and sign each WebSocket challenge.
|
|
24
|
+
- The plugin's persisted device and Funnel state migration remains separate from DSH API version support. Session logs written by earlier DSH builds are readable only when the rc.1 Host's own history reader accepts them; this plugin does not rewrite those logs.
|
|
25
|
+
- An unavailable optional OS facility, transport, or controller disables its dependent capability without crashing the Host.
|
|
139
26
|
|
|
140
|
-
|
|
141
|
-
- signed/notarized helper distribution;
|
|
142
|
-
- validation against the `0.1.7-*` package line: the peer range admits
|
|
143
|
-
`0.1.7-alpha.1` and later `0.1.7` releases, and the `wireStream.open`
|
|
144
|
-
reorder that release introduced is adapted and pinned by
|
|
145
|
-
`tests/dsh012-wire-stream-contract.test.ts`, but the unit suite still runs
|
|
146
|
-
against the `0.1.5-rc.1`/`0.1.6-*` package families and no `0.1.7`
|
|
147
|
-
typecheck or full-suite evidence has been produced yet;
|
|
148
|
-
- repair or migration of persisted history rejected by the Host's own session
|
|
149
|
-
reader;
|
|
150
|
-
- every DSH developer-preview revision;
|
|
151
|
-
- physical-device performance and every carrier/network combination;
|
|
152
|
-
- production APNs delivery without a real provider credential and device.
|
|
27
|
+
## Evidence limits
|
|
153
28
|
|
|
154
|
-
|
|
29
|
+
Unit tests and config schema projection do not prove every network, Mac, Linux, Windows, or iPhone combination. In particular, physical-device performance, signed helper distribution, and production APNs delivery need their own checks. Include the exact DSH version, plugin commit, Node version, OS, connection mode, and sanitized status output when reporting a compatibility issue; never include credentials or message content.
|
package/README.md
CHANGED
|
@@ -32,30 +32,16 @@ Host on your own Mac and does not replace or modify the DSH Web UI.
|
|
|
32
32
|
|
|
33
33
|
## Install from npm
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
This source checkout targets Node.js 22+ and **DSH 0.1.7-rc.1** with a `web` profile. The package includes
|
|
36
36
|
Funnel helpers for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode
|
|
37
37
|
does not require the helper.
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
| `0.7.x` (previous stable) | DSH `0.1.5-rc.1` or newer | `dsh plugin --profile web add dsh-deeppilot@0.7.1` |
|
|
43
|
-
| `0.6.x` (legacy) | DSH `0.1.5-rc.1` or newer | `dsh plugin --profile web add dsh-deeppilot@0.6.2` |
|
|
44
|
-
|
|
45
|
-
`0.8.x` is built and typechecked against the DSH
|
|
46
|
-
[0.1.5-rc.1](https://www.npmjs.com/package/@deepseek-ai/dsh/v/0.1.5-rc.1)
|
|
47
|
-
and [0.1.7-alpha.1](https://www.npmjs.com/package/@deepseek-ai/dsh/v/0.1.7-alpha.1)
|
|
48
|
-
Host and client package families — the config-schema release check projects the
|
|
49
|
-
plugin's Config through the pinned 0.1.7 CLI. It uses the Gateway multi-client
|
|
50
|
-
Remote Events routing that keeps Web and DeepPilot independently answerable.
|
|
51
|
-
Earlier plugin alphas remain historical artifacts; users installing the `alpha`
|
|
52
|
-
tag for pre-release testing should update DSH to `0.1.5-rc.1` or newer.
|
|
39
|
+
The current working tree pins its DSH packages and compatibility checks to
|
|
40
|
+
`0.1.7-rc.1`. A previously published plugin package may still carry its own
|
|
41
|
+
older compatibility declaration until a release is made from this tree.
|
|
53
42
|
|
|
54
43
|
```sh
|
|
55
|
-
# DSH 0.1.5-rc.1 or newer (recommended):
|
|
56
44
|
dsh plugin --profile web add dsh-deeppilot
|
|
57
|
-
# DSH 0.1.1-rc.2 through 0.1.2-alpha.1 (previous stable):
|
|
58
|
-
dsh plugin --profile web add dsh-deeppilot@0.5.0
|
|
59
45
|
dsh web
|
|
60
46
|
```
|
|
61
47
|
|
|
@@ -94,16 +80,12 @@ DeepPilot state under `$DSH_HOME/deeppilot/`.
|
|
|
94
80
|
|
|
95
81
|
## Publishing (maintainers)
|
|
96
82
|
|
|
97
|
-
|
|
98
|
-
`0.7.x` keeps the pre-0.1.7 settings API during the migration window, `0.6.x`
|
|
99
|
-
keeps the pre-TLS LAN transport for the same DSH family, and `0.5.x` stays
|
|
100
|
-
compatible with DSH `0.1.1-rc.2`–`0.1.2-alpha.1`. Keep them published:
|
|
83
|
+
Release from this branch only after validating against DSH `0.1.7-rc.1`:
|
|
101
84
|
|
|
102
85
|
1. Bump `version` in `package.json` and in the root `""` entry of
|
|
103
86
|
`package-lock.json`, then run `npm test && npm run typecheck && npm run build`
|
|
104
|
-
and inspect `npm pack --dry-run --json
|
|
105
|
-
|
|
106
|
-
admits the `0.1.5-rc.*`, the `0.1.6-*`, and the `0.1.7-*` lines).
|
|
87
|
+
and inspect `npm pack --dry-run --json`. The compatibility metadata test
|
|
88
|
+
enforces the exact rc.1 peer and development dependency versions.
|
|
107
89
|
2. Commit the release and push it. `npm publish` runs `prepack` (build) and
|
|
108
90
|
`prepublishOnly` (test + typecheck) automatically.
|
|
109
91
|
3. Publish pre-releases without touching `latest`:
|
|
@@ -112,10 +94,8 @@ compatible with DSH `0.1.1-rc.2`–`0.1.2-alpha.1`. Keep them published:
|
|
|
112
94
|
npm publish --tag alpha
|
|
113
95
|
```
|
|
114
96
|
|
|
115
|
-
After a successful publish,
|
|
116
|
-
|
|
117
|
-
package by installing it into a DSH `0.1.5-rc.1` profile before pointing
|
|
118
|
-
users at it.
|
|
97
|
+
After a successful publish, verify the dist tag and install the package in
|
|
98
|
+
a DSH `0.1.7-rc.1` profile before pointing users at it.
|
|
119
99
|
4. Tag the release commit `vX.Y.Z` and prepare a GitHub Release
|
|
120
100
|
(English + 简体中文 notes) that links this README section.
|
|
121
101
|
5. Publish stable releases with `npm publish --tag latest`, which moves
|
package/README.zh-CN.md
CHANGED
|
@@ -30,28 +30,14 @@
|
|
|
30
30
|
|
|
31
31
|
## 从 npm 安装
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
当前源码仅面向 Node.js 22+ 与带 `web` profile 的 **DSH 0.1.7-rc.1**。npm 包内置 macOS、Linux、Windows
|
|
34
34
|
的 amd64/arm64 Funnel helper;可信局域网模式不依赖 helper。
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
| `0.8.x`(当前稳定版,`latest`) | DSH `0.1.5-rc.1` 或更高 | `dsh plugin --profile web add dsh-deeppilot` |
|
|
39
|
-
| `0.7.x`(旧版稳定版) | DSH `0.1.5-rc.1` 或更高 | `dsh plugin --profile web add dsh-deeppilot@0.7.1` |
|
|
40
|
-
| `0.6.x`(历史版本) | DSH `0.1.5-rc.1` 或更高 | `dsh plugin --profile web add dsh-deeppilot@0.6.2` |
|
|
41
|
-
|
|
42
|
-
`0.8.x` 基于 DSH
|
|
43
|
-
[0.1.5-rc.1](https://www.npmjs.com/package/@deepseek-ai/dsh/v/0.1.5-rc.1)
|
|
44
|
-
与 [0.1.7-alpha.1](https://www.npmjs.com/package/@deepseek-ai/dsh/v/0.1.7-alpha.1)
|
|
45
|
-
的 Host 与 client 包族构建并完成类型检查 —— 发布前的 config-schema 检查会通过
|
|
46
|
-
固定的 0.1.7 CLI 投影本插件的 Config。它使用 Gateway 多 Client Remote Events
|
|
47
|
-
路由,使 Web 与 DeepPilot 能独立处理同一交互。旧 alpha 仅保留为历史产物;安装
|
|
48
|
-
`alpha` tag 进行预发布测试的用户应先把 DSH 更新到 `0.1.5-rc.1` 或更高版本。
|
|
36
|
+
当前工作树的 DSH 包和兼容性检查均固定为 `0.1.7-rc.1`。从此工作树发布新版本前,
|
|
37
|
+
已发布的旧插件包仍可能带有各自的旧兼容声明。
|
|
49
38
|
|
|
50
39
|
```sh
|
|
51
|
-
# DSH 0.1.5-rc.1 或更高(推荐):
|
|
52
40
|
dsh plugin --profile web add dsh-deeppilot
|
|
53
|
-
# DSH 0.1.1-rc.2 至 0.1.2-alpha.1(旧版稳定):
|
|
54
|
-
dsh plugin --profile web add dsh-deeppilot@0.5.0
|
|
55
41
|
dsh web
|
|
56
42
|
```
|
|
57
43
|
|
|
@@ -82,14 +68,12 @@ dsh plugin --profile web remove dsh-deeppilot
|
|
|
82
68
|
|
|
83
69
|
## 发布说明(维护者)
|
|
84
70
|
|
|
85
|
-
|
|
86
|
-
`0.7.x` 保留 0.1.7 之前的设置 API,`0.6.x` 在同一 DSH 版本族上保留 TLS 化之前的
|
|
87
|
-
局域网传输,`0.5.x` 保持兼容 DSH `0.1.1-rc.2`–`0.1.2-alpha.1`,各版本线都要保持发布:
|
|
71
|
+
此分支仅在 DSH `0.1.7-rc.1` 下完成验证后发布:
|
|
88
72
|
|
|
89
73
|
1. 同步修改 `package.json` 与 `package-lock.json` 根 `""` 条目中的
|
|
90
74
|
`version`,然后运行 `npm test && npm run typecheck && npm run build`,
|
|
91
|
-
并检查 `npm pack --dry-run --json
|
|
92
|
-
|
|
75
|
+
并检查 `npm pack --dry-run --json`。兼容性元数据测试会校验 peer 与开发依赖
|
|
76
|
+
均固定为 rc.1。
|
|
93
77
|
2. 提交发布并推送。`npm publish` 会自动执行 `prepack`(构建)与
|
|
94
78
|
`prepublishOnly`(测试 + 类型检查)。
|
|
95
79
|
3. 发布预发布版本,不要动 `latest`:
|
|
@@ -98,9 +82,7 @@ dsh plugin --profile web remove dsh-deeppilot
|
|
|
98
82
|
npm publish --tag alpha
|
|
99
83
|
```
|
|
100
84
|
|
|
101
|
-
|
|
102
|
-
`"latest": "0.8.x"` 与 `"alpha": "0.8.x-alpha.y"`。向用户推荐前,请先在
|
|
103
|
-
DSH `0.1.5-rc.1` profile 中安装验证发布的包。
|
|
85
|
+
发布成功后检查 dist tag,并在 DSH `0.1.7-rc.1` profile 中安装验证发布的包。
|
|
104
86
|
4. 为发布提交打 `vX.Y.Z` tag,并准备包含英文与简体中文说明的
|
|
105
87
|
GitHub Release,链接本 README 的发布说明。
|
|
106
88
|
5. 稳定版用 `npm publish --tag latest` 发布,使 `latest` 切换到新版本。
|
package/lib/client.js
CHANGED
|
@@ -290,28 +290,11 @@ window.__ModuleLoader__.load({
|
|
|
290
290
|
if (typeof value !== "boolean") reject("boolean");
|
|
291
291
|
return value;
|
|
292
292
|
} };
|
|
293
|
-
/**
|
|
294
|
-
* One strict boundary codec carrying both generation shapes of the supported
|
|
295
|
-
* `0.1.x` host family.
|
|
296
|
-
*
|
|
297
|
-
* Through `0.1.6-alpha.1` a descriptor published the schema value itself and
|
|
298
|
-
* every consumer parsed through `codec.schema.parse(value)`. `0.1.6-alpha.2`
|
|
299
|
-
* switched to a lazily materialized process-realm factory: `TypertRegistry`
|
|
300
|
-
* now rejects a strict codec without `create()`, and the Gateway parses
|
|
301
|
-
* through `codec.create().parse(value)`.
|
|
302
|
-
*
|
|
303
|
-
* Publishing both keys — `create()` returning the same hand-written,
|
|
304
|
-
* dependency-free codec — keeps one package valid across the entire declared
|
|
305
|
-
* peer range instead of forking the wire contract per host generation. The
|
|
306
|
-
* cast is required because each generation's `TypertCodec` declares only its
|
|
307
|
-
* own key, so a fresh object literal carrying both fails excess-property
|
|
308
|
-
* checking against either one.
|
|
309
|
-
*/
|
|
293
|
+
/** The rc.1 Gateway materializes each strict codec through `create()`. */
|
|
310
294
|
function strictCodec(typeSymbol, schema) {
|
|
311
295
|
return {
|
|
312
296
|
mode: "strict",
|
|
313
297
|
typeSymbol,
|
|
314
|
-
schema,
|
|
315
298
|
create: () => schema
|
|
316
299
|
};
|
|
317
300
|
}
|
|
@@ -579,7 +562,7 @@ window.__ModuleLoader__.load({
|
|
|
579
562
|
"diag.mountFailed": "报告远程未挂载(remote mount 失败)— 请确认宿主包含 typert 组合",
|
|
580
563
|
"diag.mountFailedShort": "remote mount 失败: ",
|
|
581
564
|
"diag.callFailed": "report remote 调用失败",
|
|
582
|
-
"diag.settingsUnavailable": "
|
|
565
|
+
"diag.settingsUnavailable": "设置表单不可用(configForms 未提供)",
|
|
583
566
|
"diag.missingReportHook": "useDeepPilotReport hook 缺失",
|
|
584
567
|
"diag.missingEnabledHook": "useDeepPilotEnabled hook 缺失",
|
|
585
568
|
"diag.missingLocalEnabledHook": "useDeepPilotLocalEnabled hook 缺失",
|
|
@@ -762,7 +745,7 @@ window.__ModuleLoader__.load({
|
|
|
762
745
|
"diag.mountFailed": "Report remote not mounted (mount failed) — confirm the host includes the typert composition",
|
|
763
746
|
"diag.mountFailedShort": "remote mount failed: ",
|
|
764
747
|
"diag.callFailed": "report remote call failed",
|
|
765
|
-
"diag.settingsUnavailable": "Settings
|
|
748
|
+
"diag.settingsUnavailable": "Settings form unavailable (configForms not provided)",
|
|
766
749
|
"diag.missingReportHook": "useDeepPilotReport hook missing",
|
|
767
750
|
"diag.missingEnabledHook": "useDeepPilotEnabled hook missing",
|
|
768
751
|
"diag.missingLocalEnabledHook": "useDeepPilotLocalEnabled hook missing",
|
|
@@ -949,8 +932,8 @@ window.__ModuleLoader__.load({
|
|
|
949
932
|
* materialization; this sheet is injected from `apply()`, which runs after
|
|
950
933
|
* that point, so it would never be attributed to us. Stamping `data-plugin`
|
|
951
934
|
* ourselves lets the module system's `removeOwnedStyles(id)` delete the sheet
|
|
952
|
-
* when the plugin is unloaded at runtime — the Plugin Manager and
|
|
953
|
-
* entry reconciler both support live removal
|
|
935
|
+
* when the plugin is unloaded at runtime — the rc.1 Plugin Manager and client
|
|
936
|
+
* entry reconciler both support live removal, and an
|
|
954
937
|
* orphaned sheet would otherwise keep styling a page we no longer own.
|
|
955
938
|
*/
|
|
956
939
|
function injectCss() {
|
|
@@ -4064,19 +4047,12 @@ window.__ModuleLoader__.load({
|
|
|
4064
4047
|
}, translateWith(props.t, "update.badge")) : null), diag.length > 0 ? (0, react.createElement)("p", { className: "pbb-diag" + (failed ? " pbb-diagBad" : "") }, translateWith(props.t, "diag.prefix") + diag.join(" | ")) : null);
|
|
4065
4048
|
}
|
|
4066
4049
|
//#endregion
|
|
4067
|
-
//#region src/client/
|
|
4068
|
-
/** Read one optional settings seam without an inject declaration on this entry. */
|
|
4069
|
-
function readSeam(ctx, name) {
|
|
4070
|
-
if (typeof ctx.get === "function") return ctx.get(name) ?? void 0;
|
|
4071
|
-
return ctx[name];
|
|
4072
|
-
}
|
|
4050
|
+
//#region src/client/config-form.ts
|
|
4073
4051
|
/**
|
|
4074
4052
|
* Deep-unwrap live-update references in a snapshot section.
|
|
4075
4053
|
*
|
|
4076
|
-
*
|
|
4077
|
-
*
|
|
4078
|
-
* values, so unwrap defensively at this single boundary regardless of which
|
|
4079
|
-
* schemastery instance produced the snapshot.
|
|
4054
|
+
* Volatile fields can arrive as `{ get() }` references. The settings page
|
|
4055
|
+
* compares plain values, so unwrap them at this boundary.
|
|
4080
4056
|
*/
|
|
4081
4057
|
function plainSection(value) {
|
|
4082
4058
|
if (value === null || typeof value !== "object") return value;
|
|
@@ -4086,7 +4062,7 @@ window.__ModuleLoader__.load({
|
|
|
4086
4062
|
return plain;
|
|
4087
4063
|
}
|
|
4088
4064
|
/**
|
|
4089
|
-
* Adapt one
|
|
4065
|
+
* Adapt one config form to the settings page's local contract.
|
|
4090
4066
|
*
|
|
4091
4067
|
* The form resolves writes as `Promise<boolean>` (false = the Host rejected or
|
|
4092
4068
|
* could not recover the write) where the scope face signals failure by
|
|
@@ -4094,7 +4070,7 @@ window.__ModuleLoader__.load({
|
|
|
4094
4070
|
* a `false` must be translated into one.
|
|
4095
4071
|
*
|
|
4096
4072
|
* @param forms - the 0.1.7 configForms service, if the host provides it.
|
|
4097
|
-
* @param entryId - profile entry id
|
|
4073
|
+
* @param entryId - profile entry id.
|
|
4098
4074
|
* @returns the adapted scope, or undefined when the service cannot resolve it.
|
|
4099
4075
|
*/
|
|
4100
4076
|
function adaptConfigForm(forms, entryId) {
|
|
@@ -4118,18 +4094,11 @@ window.__ModuleLoader__.load({
|
|
|
4118
4094
|
};
|
|
4119
4095
|
}
|
|
4120
4096
|
/**
|
|
4121
|
-
* Bind the
|
|
4122
|
-
*
|
|
4123
|
-
* Prefers the legacy settingsScope (present ≤ 0.1.6); falls back to the 0.1.7
|
|
4124
|
-
* config form when its service is already provisioned. Safe to call from any
|
|
4125
|
-
* context — including one that declares neither service, which on a Cordis
|
|
4126
|
-
* context is the difference between `undefined` and a thrown
|
|
4127
|
-
* `cannot get property "settingsScope" without inject`. Callers that apply
|
|
4128
|
-
* before `configForms` is provided re-run this inside the optional
|
|
4129
|
-
* `ctx.inject(['configForms'], …)` callback (see client index.ts).
|
|
4097
|
+
* Bind the rc.1 form if its service is already provisioned. Callers that
|
|
4098
|
+
* apply first retry inside `ctx.inject(['configForms'], …)`.
|
|
4130
4099
|
*/
|
|
4131
|
-
function
|
|
4132
|
-
return
|
|
4100
|
+
function bindConfigForm(ctx) {
|
|
4101
|
+
return adaptConfigForm(ctx.get("configForms"), "deeppilot");
|
|
4133
4102
|
}
|
|
4134
4103
|
//#endregion
|
|
4135
4104
|
//#region src/client/index.ts
|
|
@@ -4187,13 +4156,9 @@ window.__ModuleLoader__.load({
|
|
|
4187
4156
|
/**
|
|
4188
4157
|
* Services this client entry cannot start without.
|
|
4189
4158
|
*
|
|
4190
|
-
*
|
|
4191
|
-
*
|
|
4192
|
-
*
|
|
4193
|
-
* reported exactly `dsh-deeppilot: pending (waiting for service:
|
|
4194
|
-
* settingsScope)` while every other service resolved and the entry never
|
|
4195
|
-
* applied. Both settings seams are optional injections inside `apply`
|
|
4196
|
-
* instead; see the scope binding below.
|
|
4159
|
+
* `configForms` is provided by the settings-page fiber, which may activate
|
|
4160
|
+
* after this entry. It is attached through an optional injection below so
|
|
4161
|
+
* the entry can activate before the settings page does.
|
|
4197
4162
|
*/
|
|
4198
4163
|
const inject = [
|
|
4199
4164
|
"slots",
|
|
@@ -4274,9 +4239,9 @@ window.__ModuleLoader__.load({
|
|
|
4274
4239
|
status: "loading",
|
|
4275
4240
|
enabled: true
|
|
4276
4241
|
});
|
|
4277
|
-
let scope =
|
|
4278
|
-
/** Adopters registered before attachScope runs, so a late-bound
|
|
4279
|
-
*
|
|
4242
|
+
let scope = bindConfigForm(anyCtx);
|
|
4243
|
+
/** Adopters registered before attachScope runs, so a late-bound config form
|
|
4244
|
+
* still subscribes all. */
|
|
4280
4245
|
const scopeAdoptions = [];
|
|
4281
4246
|
const adoptEnabled = () => {
|
|
4282
4247
|
if (scope === void 0) return;
|
|
@@ -4450,12 +4415,9 @@ window.__ModuleLoader__.load({
|
|
|
4450
4415
|
if (scope === void 0) {
|
|
4451
4416
|
const bindScopeFrom = (sub) => {
|
|
4452
4417
|
if (scope !== void 0) return;
|
|
4453
|
-
scope =
|
|
4418
|
+
scope = bindConfigForm(sub);
|
|
4454
4419
|
attachScope();
|
|
4455
4420
|
};
|
|
4456
|
-
ctx.inject(["settingsScope"], (sub) => {
|
|
4457
|
-
bindScopeFrom(sub);
|
|
4458
|
-
});
|
|
4459
4421
|
ctx.inject(["configForms"], (sub) => {
|
|
4460
4422
|
bindScopeFrom(sub);
|
|
4461
4423
|
});
|