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 CHANGED
@@ -1,154 +1,29 @@
1
1
  # Compatibility
2
2
 
3
- This file separates tested evidence from intended behavior. Passing unit tests does not prove every DSH build, network, Mac, or iPhone combination.
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
- ## Public-beta baseline
6
-
7
- | Component | Baseline | Evidence |
5
+ | Component | Current contract | Evidence |
8
6
  |---|---|---|
9
- | Node.js | 22 or newer | package engine and CI |
10
- | DSH CLI and Host API | the `0.1.5-rc.*` and `0.1.6-*`/`0.1.6` lines, `0.1.5-rc.1` minimum, for plugin `0.7.x` | plugin source typecheck, unit suite (301 tests) and `tsdown` build run against the `0.1.5-rc.2`, `0.1.6-alpha.1` and `0.1.6-alpha.2` package families; the `deeppilot/report` contribution registered through both the `0.1.6-alpha.1` and the `0.1.6-alpha.2` `TypertRegistry`; bridge and `/phone` protocol tests |
11
- | Host OS | macOS, Linux, Windows on packaged amd64/arm64 helper targets | helper checksums plus user-confirmed Windows/Linux Funnel launch and connection; local LAN validation remains part of alpha testing |
12
- | Remote access | Tailscale Funnel, ports 443/8443/10000 | helper and supervisor tests |
13
- | iOS | native DeepPilot client, protocol v2 | simulator build and v2 pairing/challenge evidence |
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
- ## Protocol boundary
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
- - Protocol v2 is the only supported wire version. Existing protocol-v1 devices must pair again after upgrading.
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
- ## Not yet claimed
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
- - Intel macOS support for the embedded helper;
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
- When reporting an issue, include `node --version`, the exact DSH package version, plugin commit/tag, macOS version and architecture, connection mode, and sanitized status output. Never include pairing codes, key material, APNs tokens, or message content.
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
- Requirements: Node.js 22+ and DSH with a `web` profile. The package includes
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
- | Plugin version | Required DSH | How to install |
40
- |---|---|---|
41
- | `0.8.x` (current stable, `latest`) | DSH `0.1.5-rc.1` or newer | `dsh plugin --profile web add dsh-deeppilot` |
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
- `0.8.x` targets DSH `0.1.5-rc.1`+ and adapts to the DSH 0.1.7 settings rewrite;
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` (the check
105
- `tests/compatibility-metadata.test.ts` enforces the peer range and asserts it
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, `npm view dsh-deeppilot dist-tags --json` shows
116
- `"latest": "0.8.x"` and `"alpha": "0.8.x-alpha.y"`. Verify the published
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
- 需要 Node.js 22+ 和带 `web` profile 的 DSH。npm 包内置 macOS、Linux、Windows
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
- | 插件版本 | 所需 DSH | 安装命令 |
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
- `0.8.x` 面向 DSH `0.1.5-rc.1`+ 并适配 DSH 0.1.7 的设置系统重写;迁移期内
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`(`tests/compatibility-metadata.test.ts`
92
- 会强制校验 peer 范围,并断言它同时接纳 `0.1.5-rc.*`、`0.1.6-*` 与 `0.1.7-*` 三条线)。
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
- 发布成功后,`npm view dsh-deeppilot dist-tags --json` 应显示
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": "设置命名空间不可用(settingsScope 未提供)",
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 namespace unavailable (settingsScope not provided)",
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 the client
953
- * entry reconciler both support live removal from 0.1.6-alpha.2 on, and an
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/settings-scope.ts
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
- * If a host parses section values through a volatile-capable schema, leaves
4077
- * can arrive as `{ get() }` references; the settings page compares plain
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 0.1.7 config form to the settings-scope face.
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; identical to the legacy namespace here.
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 settings scope for whichever host generation is running.
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 bindSettingsScope(ctx) {
4132
- return readSeam(ctx, "settingsScope")?.bind({ namespace: "deeppilot" }) ?? adaptConfigForm(readSeam(ctx, "configForms"), "deeppilot");
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
- * The settings seam is deliberately NOT here: DSH ≤ 0.1.6 provides
4191
- * `settingsScope`, 0.1.7 removed it in favor of `configForms`, and a name no
4192
- * running host provides keeps the whole entry pending forever — the 0.1.7 boot
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 = bindSettingsScope(anyCtx);
4278
- /** Adopters registered before attachScope runs, so a late-bound scope (0.1.7
4279
- * configForms provisioned after this plugin applies) still subscribes all. */
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 = bindSettingsScope(sub);
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
  });