dsh-deeppilot 0.8.0 → 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,122 +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 (265 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` rewrote the settings subsystem: `installSection`,
61
- `SettingsSectionHooks`, and the client `settingsScope` service are gone,
62
- section values persist in this plugin own profile config entry, and the
63
- settings UI refuses writes to fields the schema does not declare
64
- `.volatile()`. The plugin adapts across both generations: `live()` in
65
- `src/config.ts` feature-detects the volatile method and, on schemastery
66
- 3.18.2, writes the same metadata through `extra('volatile', true)` (an
67
- unconditional `.volatile()` throws at import on ≤ 0.1.6 and kills
68
- activation); volatile fields are exactly the ones the settings surface
69
- writes (`enabled`, `local`, `remote`, plus read-time `debug`) while
70
- `devicesPath`, `historyBufferMax`, and `push` keep remount-on-edit
71
- semantics; `normalizeOptions` unwraps the `{ get() }`
72
- references 0.1.7 carries in `apply()` options (a surviving reference fails
73
- every plain-value comparison the bridge makes), the host re-runs its
74
- transport reconciles on `loader/volatile-update`, and the client binds
75
- `ctx.configForms.get('deeppilot')` through `src/client/settings-scope.ts`
76
- when `settingsScope` is absent. Neither seam is declared in the client
77
- entry's `inject`: a service name no running host provides keeps the whole
78
- entry pending (`dsh-deeppilot: pending (waiting for service: settingsScope)`
79
- on the first 0.1.7 boot), so both are awaited as optional injections, and
80
- both are read through `ctx.get()` because a Cordis context proxy throws
81
- `cannot get property "settingsScope" without inject` on an undeclared
82
- service read; `tests/client-entry.test.ts` activates the real entry against
83
- a Cordis context shaped like each generation and pins that audit. The same
84
- release added
85
- `session.projections`; the bridge feature-detects it via
86
- `supportsProjections` and refreshes a session projection baseline on open,
87
- while older hosts keep list-row projection hints. Plugin-manager display
88
- metadata (`locale/*.json`, `package.json.icon`) and `--dump-config-schema`
89
- are additive and inert on older hosts; `npm run check:config-schema`
90
- projects this package Config through the pinned 0.1.7 CLI in CI and pins
91
- the volatile annotations on the four live fields (devDependency floor:
92
- `@deepseek-ai/schemastery` 3.18.3, which is also what a profile install
93
- resolves through the `^3.18.2` peer range).
94
- - DSH `0.1.6-alpha.2` made runtime plugin removal real, through both the
95
- Plugin Manager and the client entry reconciler. Every long-lived resource is
96
- registered through `ctx.effect`, and the settings-page stylesheet stamps
97
- `data-plugin="dsh-deeppilot"` so the module system's `removeOwnedStyles()`
98
- can delete it; the module system only auto-claims styles present during
99
- factory materialization, while this sheet is injected from `apply()`.
100
- Without that stamp, disabling the plugin would leave its sheet styling the
101
- page.
102
- - The compatibility facade converts the
103
- current Session controller's raw event arrays into the stable wrapped
104
- history entries consumed by the phone bridge. Sessions persisted by earlier
105
- Hosts can therefore be listed and opened when the rc.1 Host's own
106
- persistence reader accepts their log vocabulary. Unsupported persisted
107
- formats still fail closed in the Host without modifying the original log.
20
+ ## Separate protocol and data boundaries
108
21
 
109
- ## 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.
110
26
 
111
- - Intel macOS support for the embedded helper;
112
- - signed/notarized helper distribution;
113
- - validation against the `0.1.7-*` package line: the peer range admits
114
- `0.1.7-alpha.1` and later `0.1.7` releases, but typecheck, unit-suite, and
115
- runtime evidence against those host packages have not been produced yet;
116
- - repair or migration of persisted history rejected by the Host's own session
117
- reader;
118
- - every DSH developer-preview revision;
119
- - physical-device performance and every carrier/network combination;
120
- - production APNs delivery without a real provider credential and device.
27
+ ## Evidence limits
121
28
 
122
- 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/icon.svg CHANGED
@@ -1,13 +1,12 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="DeepPilot">
2
2
  <defs>
3
- <linearGradient id="dp-bg" x1="0" y1="0" x2="128" y2="128" gradientUnits="userSpaceOnUse">
4
- <stop offset="0" stop-color="#2563eb"/>
5
- <stop offset="1" stop-color="#0c1b4a"/>
3
+ <linearGradient id="dp-glyph" x1="0" y1="-18.1112" x2="0" y2="52.2563" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0" stop-color="#404040"/>
5
+ <stop offset="1" stop-color="#000000"/>
6
6
  </linearGradient>
7
7
  </defs>
8
- <rect width="128" height="128" rx="28" fill="url(#dp-bg)"/>
9
- <g transform="translate(24 24) scale(3.5)" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
10
- <path d="m22 2-7 20-4-9-9-4Z"/>
11
- <path d="M22 2 11 13"/>
8
+ <rect width="128" height="128" fill="#ffffff"/>
9
+ <g transform="translate(17.5525 17.0725) scale(3.950123)">
10
+ <path fill="url(#dp-glyph)" fill-rule="evenodd" d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z"/>
12
11
  </g>
13
12
  </svg>
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
  });