dsh-deeppilot 0.9.13 → 0.9.15

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,29 +1,33 @@
1
1
  # Compatibility
2
2
 
3
- This branch targets exactly **eight DSH releases**: `0.2.0-rc.2`; the `alpha`
4
- channel releases `0.2.1-alpha.3`, `0.2.1-alpha.4`, `0.2.1-alpha.5`, and
5
- `0.2.2-alpha.2`; and the `next` channel releases `0.2.1-rc.2`, `0.2.1-rc.3`, and
6
- `0.2.1-rc.4`. The npm channels have
7
- moved since: `latest` now points at `0.2.1-rc.2`, promoted from `next`, `next`
8
- at `0.2.1-rc.4`, and `alpha` at `0.2.2-alpha.2`. All eight are
9
- named in both `engines.dsh` and `peerDependencies`; no other version is accepted.
10
- DSH evaluates that declaration before composing a profile — on every start, not
11
- only on install — so a newly published DSH release deactivates this plugin until
12
- the list is widened deliberately. That is the intended trade: a plugin that
13
- cannot run on an unaudited host fails visibly instead of misbehaving quietly.
14
- The decision and the reversal it represents are recorded in
15
- the maintainers' local decision record `docs/adr/0001-dsh-compatibility-policy.md`, with the supporting audit in
3
+ This branch accepts DSH hosts inside the rolling compatibility range
4
+ `>=0.2.1-rc.5 <0.3.0-0`. The lower bound is the newest audited `rc` release at
5
+ decision time — npm `latest` and `next` both point at `0.2.1-rc.5` — and every
6
+ later `0.2.x` release is admitted without a per-release source audit, including
7
+ the `alpha` channel release `0.2.2-alpha.2` and later alphas, later rc releases,
8
+ and `0.2.x` GA. `0.3.0` and its prereleases stay refused until a fresh audit.
9
+ The bound is written `<0.3.0-0` because DSH evaluates the range with
10
+ `semver.satisfies(..., { includePrerelease: true })`, where `<0.3.0` would admit
11
+ `0.3.0-rc.1`. The range is named in both `engines.dsh` and `peerDependencies`; a
12
+ host outside it is refused. DSH evaluates that declaration before composing a
13
+ profile — on every start, not only on install.
14
+
15
+ This is a deliberate policy trade: a new DSH release inside the range activates
16
+ without waiting for a per-release audit, so a breaking change inside `0.2.x`
17
+ would surface at runtime instead of at the activation gate. The gate that
18
+ remains is the `0.3.0` boundary. The decision, its predecessor policies, and the
19
+ reversals are recorded in the maintainers' local decision record
20
+ `docs/adr/0001-dsh-compatibility-policy.md`, with the supporting audits in
16
21
  [`docs/DSH_RELEASE_MEMORY.md`](./docs/DSH_RELEASE_MEMORY.md).
17
22
 
18
- The development packages this branch builds and typechecks against stay pinned
19
- to the exact release-candidate baseline, currently `0.2.0-rc.2`; the audited
20
- `alpha` and `rc` hosts are covered by the isolated composes and live runs
21
- recorded in the release memory.
23
+ The development packages this branch builds and typechecks against are pinned to
24
+ the lower bound, currently `0.2.1-rc.5`; the audited host lines above it are
25
+ covered by the isolated composes and live runs recorded in the release memory.
22
26
 
23
27
  | Component | Current contract | Evidence |
24
28
  |---|---|---|
25
29
  | Node.js | 22 or newer | Package engine and CI |
26
- | DSH CLI and Host API | `engines.dsh` and `peerDependencies` both name `0.2.0-rc.2 \|\| 0.2.1-alpha.3 \|\| 0.2.1-alpha.4 \|\| 0.2.1-alpha.5 \|\| 0.2.1-rc.2 \|\| 0.2.1-rc.3 \|\| 0.2.1-rc.4 \|\| 0.2.2-alpha.2` (dev pins `0.2.0-rc.2`) | Peer metadata, source typecheck, unit tests, bundle build, and config schema projection against a real 0.2.0-rc.2 CLI, plus isolated composes and live phone-protocol runs with the published 0.2.1-alpha.2, 0.2.1-alpha.3, and 0.2.1-alpha.4 CLIs, an isolated 0.2.1-alpha.5 host where this plugin now composes, starts, and answers `/phone/health` with 200 on its own LAN listener, a pre-widening 0.2.1-rc.2 host run where the unchanged declaration is refused at compose time, an isolated 0.2.1-rc.3 host where the widened declaration composes, starts, and answers `/phone/health` with 200, and isolated 0.2.1-rc.4 and 0.2.2-alpha.2 hosts where the eight-release declaration does the same (audits below) |
30
+ | DSH CLI and Host API | `engines.dsh` and `peerDependencies` both name the rolling range `>=0.2.1-rc.5 <0.3.0-0` (dev pins `0.2.1-rc.5`) | Peer metadata, source typecheck, unit tests, bundle build, and config schema projection against a real 0.2.1-rc.5 CLI, plus isolated composes and live phone-protocol runs across the audited hosts recorded below (0.2.1-alpha.2 through 0.2.2-alpha.2), a full-tree audit of 0.2.1-rc.5 against 0.2.1-rc.4, and an isolated rc.5 host that composes, starts, and answers `/phone/health` with 200 (`0.2.1-rc.5 audit outcome` below) |
27
31
  | DSH history read | `SessionController.inspect` when the host has it, `SessionController.page` otherwise | DSH 0.2.2-alpha.2 removed `inspect`; the adapter branches on its presence and maps the host page's `{type:'event',event}` records onto the bridge's `{event}` contract, expressing the phone's exclusive `beforeSeq` as the inclusive `throughSeq` cut. Unit tests cover both branches (audits below) |
28
32
  | iOS bridge | DeepPilot protocol v2 | Bridge protocol tests; device behavior must be checked with the running Host and app |
29
33
  | Remote access | Tailscale Funnel on ports 443, 8443, or 10000 | Helper and supervisor tests |
@@ -43,6 +47,7 @@ recorded in the release memory.
43
47
  - 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.
44
48
  - 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 current Host's own history reader accepts them; this plugin does not rewrite those logs.
45
49
  - An unavailable optional OS facility, transport, or controller disables its dependent capability without crashing the Host.
50
+ - Binary frames (`welcome.capabilities.binaryFrames`) are a plugin-level option between this plugin and the phone and do not depend on the DSH Host. The phone opts in per request with `binary: true`; older apps never do and keep receiving base64 text frames byte-for-byte as before, and older plugins ignore the field. The Funnel helper is a standard reverse proxy and passes binary WebSocket frames through unchanged.
46
51
 
47
52
  ## Schedules ship with the Web composition
48
53
 
@@ -67,7 +72,23 @@ built. The bridge mounts on `sessionController` / `connection` /
67
72
  `typertGateway`, all of which become ready before the Schedule service finishes
68
73
  its own initialization, so a probe taken at that moment would report `false` for
69
74
  the bridge's whole lifetime. On a live host with the service mounted the bit is
70
- `true` and the schedule list/create/history/delete flow passes.
75
+ `true` and the schedule list/create/history/delete flow passes on audited hosts
76
+ up to `0.2.2-alpha.2`.
77
+
78
+ **Known limitation on `0.2.2-alpha.3`.** That release moved automation to
79
+ host-level task management and rewrote the `dsh-schedule` service: `update` and
80
+ `delete` no longer exist (`edit({ action })` replaces them), `list` returns a
81
+ page object instead of an array, `create` takes its request first, and the
82
+ request body carries `timing` / `target` instead of the selector fields. The
83
+ bridge now serves both contracts from one adapter chosen by service shape, not
84
+ by version string: the legacy per-session path is unchanged, and the host-level
85
+ path adds the optional `schedulesHost` capability with host-level frames
86
+ (list / view / create / edit / run / limits) while projecting the legacy frames
87
+ onto host-level tasks, so an older App keeps schedule list, create, edit and
88
+ delete on that host. The wire contract is documented under
89
+ [`PROTOCOL.md`](./PROTOCOL.md) "Schedule 宿主级任务扩展". The audit and the
90
+ decision are recorded in
91
+ [`docs/DSH_RELEASE_MEMORY.md`](./docs/DSH_RELEASE_MEMORY.md).
71
92
 
72
93
  ## Configuration migration
73
94
 
@@ -77,6 +98,79 @@ carries the old top-level `debug: true` is accepted but that value is ignored:
77
98
  verbose logging must be turned on again from the settings page. No other config
78
99
  field changed shape, and the old key is not read anywhere in this version.
79
100
 
101
+ ## 0.2.2-rc.1 audit outcome
102
+
103
+ - **Same code as `0.2.2-alpha.3`.** 330 shared packages, zero structural
104
+ manifest changes, and only four non-manifest files differ (a build-commit
105
+ constant and three client bundles' version strings). The evaluator is
106
+ byte-identical, so the alpha.3 findings, including the host-level schedule
107
+ adapter, apply unchanged.
108
+ - **Vendor peers.** The host vendors `cordis 4.1.0` and `schemastery 3.19.0`,
109
+ the alpha.3 code renumbered as releases. The ranges append `~4.1.0` and
110
+ `~3.19.0`; earlier clauses stay because earlier hosts still vendor them. DSH's
111
+ evaluator ignores both peers; only npm's install-time resolution reads them.
112
+ - **Activation and boot.** The real rc.1 evaluator admits `0.9.14` and refuses
113
+ the published `0.9.13`. An isolated rc.1 host composes and starts the plugin,
114
+ and `/phone/health` answers 200 with `protocolVersion` 2.
115
+
116
+ ## 0.2.1-rc.5 audit outcome
117
+
118
+ The artifact-level audit of `dsh-v0.2.1-rc.5` (published to the npm registry
119
+ 2026-10-29T14:15:23Z; GitHub Release 2026-10-30T02:12:26Z, whose notes mention
120
+ only improved thinking-content display) against `dsh-v0.2.1-rc.4` found **no
121
+ runtime break**. The tree stays at 307 packages.
122
+
123
+ - **Whole-tree comparison.** 42,731 shared files: 42,421 byte-identical and 310
124
+ differing — 296 `package.json` files plus 14 non-manifest files in 7 packages;
125
+ one further file is new in rc.5 only
126
+ (`dsh-client-ui-chat/lib/types/client/reasoning-text.d.ts`, 363 B). `cordis`
127
+ and `schemastery` are byte-identical including their manifests, and the rc.4
128
+ tree fingerprint reproduced the previous audit's value, so both rounds compared
129
+ the same baseline.
130
+ - **No contract change.** All 307 manifests have zero `structural` changes (the
131
+ comparison covers the full 11,099-leaf union); the 3,706 dependency-spec
132
+ changes are mechanical `0.2.1-rc.4 → 0.2.1-rc.5` replacements. The evaluator
133
+ `dsh-app-boot/lib/index.js` is byte-identical to rc.4 (sha256 `5135179a…`), so
134
+ the activation gate behaves exactly as before.
135
+ - **The 15 non-manifest files (14 changed, 1 added) are outside this plugin's
136
+ surface.** `dsh-client-ui-chat` reworks the host's internal
137
+ `conversation.chat.reasoning.body` Slot (owner props gain `rawText`, and
138
+ reasoning text is stripped of its `<signature>` wrapper before display) plus
139
+ its types and three READMEs; `dsh-cordis-client-runner` updates the embedded
140
+ Slot registry metadata; `dsh-experimental-client-ui-cot-translation` changes
141
+ only JSDoc/type comments; `dsh-client-modules` changes a build-commit
142
+ constant; three settings/sidebar client bundles change only version strings
143
+ (same byte size). None of these packages is in the declaration surface (10
144
+ peers, 4 client injects, vendored cordis/schemastery) or the plugin call
145
+ surface, and a machine check over the 7 packages reports
146
+ `allOutsideDeclarationSurface`.
147
+ - **Patch anchor unchanged.** `dsh-web-app/cordis.patch.yml` is byte-identical to
148
+ rc.4 (same 595 lines / 117 entries / sha256 `cdceb423…`), so the
149
+ `id: directory-picker` block this plugin disables is untouched.
150
+ - **Export and client faces unchanged.** All 3,271 `lib/` modules and 681 entry
151
+ modules have identical export surfaces; the four client-injected packages are
152
+ byte-identical.
153
+ - **Activation matrix.** The previous closed list rejected `0.2.1-rc.5`; the
154
+ rolling range admits it together with `0.2.2-alpha.2`, `0.2.1`, later rc and
155
+ alpha releases and `0.2.x` GA. Twelve candidates are newly admitted and
156
+ exactly the seven former list members are newly refused; `0.3.0-rc.1`,
157
+ `0.3.0`, `0.3.0-0`, and `1.0.0` stay refused. Every verdict matched an
158
+ independent semver calculation. The range also admits unaudited
159
+ `0.2.2`/`0.2.3` prereleases by construction (`0.2.2-alpha.1`,
160
+ `0.2.2-alpha.2.1`, `0.2.2-ALPHA.2`, `0.2.2-0`); this is the accepted cost of a
161
+ rolling range, not an evaluator quirk.
162
+ - **Live load.** In an isolated `DSH_HOME` the rc.5 host composes the plugin
163
+ (`--dump-config` exit 0, no skip line), starts it, and the plugin's own LAN
164
+ listener answers `/phone/health` with 200; the isolated home receives
165
+ `deeppilot/host-id` and `deeppilot/lan-tls/`.
166
+ - **Vendor peers.** rc.5 still vendors `cordis 4.0.5` and `schemastery 3.18.5`,
167
+ both already inside the declared ranges, so no vendor clause changed.
168
+ - **Known boundary.** `dsh-client-ui-slots` has no artifact in either tree (same
169
+ as the rc.4 round), so it was not byte-compared; `react` was not compared; the
170
+ npm install-time resolution was not run.
171
+ - **Evidence.** `.rc5-verify/AUDIT.md`, `.rc5-verify/HOST-BOOT.md`, and the JSON
172
+ logs beside them.
173
+
80
174
  ## 0.2.2-alpha.2 audit outcome
81
175
 
82
176
  The artifact-level audit of `dsh-v0.2.2-alpha.2` (published to the npm registry
package/README.md CHANGED
@@ -32,6 +32,11 @@ Host on your own computer and does not replace or modify the DSH Web UI.
32
32
  - Connect over the LAN (TLS with a Host-issued certificate pinned during
33
33
  pairing) or the optional embedded Tailscale Funnel.
34
34
  - Receive live notifications and optional APNs notifications while offline.
35
+ - Quiet scheduled runs (DSH 0.2.2+): write a rule into a scheduled task's
36
+ prompt, such as "if everything is normal, don't notify me". The agent can
37
+ then skip that run's "task completed" notification with the
38
+ `deeppilot_skip_completion_notice` tool. Approvals, questions and errors
39
+ still notify, and tasks without such a rule notify on every run as before.
35
40
  - Self-update hint: the settings page footer shows the installed plugin
36
41
  version, with an inline "new version" link to the matching GitHub
37
42
  release when one exists (background check, stable releases only, no
@@ -39,25 +44,24 @@ Host on your own computer and does not replace or modify the DSH Web UI.
39
44
 
40
45
  ## Install from npm
41
46
 
42
- This source checkout targets Node.js 22+ and the eight DSH releases it has been
43
- audited against — `0.2.0-rc.2`, the `alpha` channel releases `0.2.1-alpha.3`,
44
- `0.2.1-alpha.4`, `0.2.1-alpha.5`, and `0.2.2-alpha.2`, and the `next` channel
45
- releases it has admitted in turn, `0.2.1-rc.2`, `0.2.1-rc.3`, and `0.2.1-rc.4` —
46
- with a `web` profile. (The npm channels move: `latest` now points at
47
- `0.2.1-rc.2`, which was promoted from `next`, `next` at `0.2.1-rc.4`, and
48
- `alpha` at `0.2.2-alpha.2`.) DSH checks a plugin's declared
49
- requirements before composing a profile, on every start rather than only on
50
- install, so any other host version refuses to activate this plugin. From DSH
51
- `0.2.1-alpha.4` on, that check reads `engines.dsh` and ignores
52
- `peerDependencies`; older hosts know only the peer range, so both name the same
53
- eight releases. The package includes Funnel helpers
54
- for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode does not require
55
- the helper. The helper is built with Go 1.27, which requires **macOS 13 Ventura
56
- or later**: on macOS 12 and earlier, Funnel mode cannot start, while
57
- trusted-LAN mode keeps working.
58
-
59
- The current working tree names exactly those six versions in `engines.dsh` and
60
- `peerDependencies` and is built/typechecked against `0.2.0-rc.2`. A previously
47
+ This source checkout targets Node.js 22+ and DSH hosts inside the rolling
48
+ compatibility range `>=0.2.1-rc.5 <0.3.0-0` with a `web` profile. The lower
49
+ bound is the newest audited `rc` release at decision time — npm `latest` and
50
+ `next` both point at `0.2.1-rc.5` — and every later `0.2.x` release is admitted
51
+ automatically, including the `alpha` channel release `0.2.2-alpha.2` and later
52
+ alphas, later rc releases, and `0.2.x` GA. `0.3.0` and its prereleases stay
53
+ refused until a fresh audit. DSH checks a plugin's declared requirements before
54
+ composing a profile, on every start rather than only on install, so a host
55
+ outside the range refuses to activate this plugin. From DSH `0.2.1-alpha.4` on,
56
+ that check reads `engines.dsh` and ignores `peerDependencies`; older hosts know
57
+ only the peer range, so both declare the identical range. The package includes
58
+ Funnel helpers for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode
59
+ does not require the helper. The helper is built with Go 1.27, which requires
60
+ **macOS 13 Ventura or later**: on macOS 12 and earlier, Funnel mode cannot
61
+ start, while trusted-LAN mode keeps working.
62
+
63
+ The current working tree declares that range in `engines.dsh` and
64
+ `peerDependencies` and is built/typechecked against `0.2.1-rc.5`. A previously
61
65
  published plugin package may still carry its own older compatibility
62
66
  declaration until a release is made from this tree.
63
67
 
@@ -66,9 +70,8 @@ dsh plugin --profile web add dsh-deeppilot
66
70
  dsh web
67
71
  ```
68
72
 
69
- After DSH restarts, open **Settings → DeepPilot**, enable the connection, show
70
- the pairing QR code, and scan it in the DeepPilot app. Below the QR code the same
71
- panel shows one copyable piece of pairing info (address, single-use code and
73
+ After DSH restarts, open **Settings → DeepPilot**, turn on **Allow phone connections**,
74
+ and click **Add phone** beside **Paired devices**, then scan the QR code in the app. The same panel also shows one copyable piece of pairing info (address, single-use code and
72
75
  certificate fingerprint) that can be pasted into the app in one step — useful for
73
76
  Simulator or when the camera is unavailable. Switching between the LAN and
74
77
  public address issues a matching new QR code and string immediately, with the
@@ -136,7 +139,15 @@ stored in the host registry and survive iPhone reconnects or changes to the
136
139
  system-reported name; saving an empty value restores the iPhone-reported
137
140
  default.
138
141
 
139
- The settings page's **Testing & troubleshooting** group has a `debug` toggle.
142
+ Each device's **More actions** control contains its fingerprint, rename action,
143
+ and deletion action; deletion still requires confirmation. Connection options,
144
+ connection help, diagnostic tools, and system information start collapsed.
145
+ Desktop secondary buttons are 28px high; custom action touch targets remain at
146
+ least 44px. **Add phone** uses DSH's built-in small outlined `Button`; all
147
+ toggles use its `Switch`. Native controls keep the host's appearance and sizing.
148
+ See [settings UI and validation](docs/SETTINGS_UI.md).
149
+
150
+ The settings page's **Diagnostic tools** group has a `debug` toggle.
140
151
  Turning it on prints per-frame and push diagnostics to the DSH host's terminal
141
152
  output (for example, the actual capability bits sent in `s2c.welcome`); it
142
153
  never prints pairing tokens, APNs tokens, or message content. The toggle is
package/README.zh-CN.md CHANGED
@@ -28,36 +28,39 @@
28
28
  - 局域网连接全程 TLS:插件自签证书,App 按配对二维码中的指纹固定信任;
29
29
  也可选用内嵌 Tailscale Funnel 远程连接;
30
30
  - 接收在线通知,以及可选的离线 APNs 推送;
31
+ - 计划任务按需提醒(DSH 0.2.2 起):在任务提示词里写明规则,例如"一切正常就不用提醒我",
32
+ Agent 即可通过 `deeppilot_skip_completion_notice` 工具跳过这一轮的「任务完成」通知;
33
+ 审批、提问和出错照常提醒,没写规则的任务照旧每轮提醒;
31
34
  - 更新提示:设置页底部显示当前插件版本,并在有新版本时附加一个指向
32
35
  对应 GitHub Release 的链接(后台静默检查,仅比较稳定版,不引入第
33
36
  三方依赖)。
34
37
 
35
38
  ## 从 npm 安装
36
39
 
37
- 当前源码面向 Node.js 22+ 与带 `web` profile 的**八个已审计 DSH 版本**:
38
- `0.2.0-rc.2`、`alpha` 通道的 `0.2.1-alpha.3`、
39
- `0.2.1-alpha.4`、`0.2.1-alpha.5` 与 `0.2.2-alpha.2`,以及先后三版 `next` 通道的
40
- `0.2.1-rc.2`、`0.2.1-rc.3` 与 `0.2.1-rc.4`(npm 通道会移动:`latest` 现指向由 `next` 转正的
41
- `0.2.1-rc.2`,`next` 指向 `0.2.1-rc.4`,`alpha` 指向 `0.2.2-alpha.2`)。
42
- DSH 在组合 profile 前会校验插件声明的
43
- 兼容要求,且**每次启动都会校验**(不只是安装时),因此其他宿主版本会拒绝
44
- 激活本插件。从 DSH `0.2.1-alpha.4` 起,该校验只读 `engines.dsh` 并忽略
45
- `peerDependencies`;更早的宿主只认 peer 范围,因此两处列出同一组八个版本。
46
- npm 包内置 macOS、Linux、Windows 的 amd64/arm64 Funnel helper;可信局域网
47
- 模式不依赖 helper。helper 用 Go 1.27 编译,要求 **macOS 13 Ventura 或更高版本**:
48
- macOS 12 及更早版本无法启动 Funnel 模式,可信局域网模式不受影响。
49
-
50
- 当前工作树的 `engines.dsh` 与 `peerDependencies` 精确列出这六个版本,构建与
51
- 类型检查针对 `0.2.0-rc.2`。从此工作树发布新版本前,已发布的旧插件包仍可能
52
- 带有各自旧的兼容声明。
40
+ 当前源码面向 Node.js 22+ 与**滚动兼容区间** `>=0.2.1-rc.5 <0.3.0-0` 内的
41
+ DSH 宿主(带 `web` profile)。下界是决策时最新的已审计 `rc` 版本(npm
42
+ `latest` 与 `next` 均指向 `0.2.1-rc.5`);其后的所有 `0.2.x` 版本自动放行,
43
+ 包括 `alpha` 通道的 `0.2.2-alpha.2` 及之后的 alpha、之后的 rc 与 `0.2.x`
44
+ 正式版。`0.3.0` 及其预发布仍需重新审计,由上界 `<0.3.0-0` 拦下。
45
+ DSH 在组合 profile 前会校验插件声明的兼容要求,且**每次启动都会校验**(不只是
46
+ 安装时),因此区间外的宿主会拒绝激活本插件。从 DSH `0.2.1-alpha.4` 起,该校验
47
+ 只读 `engines.dsh` 并忽略 `peerDependencies`;更早的宿主只认 peer 范围,因此
48
+ 两处声明同一区间。npm 包内置 macOS、Linux、Windows 的 amd64/arm64 Funnel
49
+ helper;可信局域网模式不依赖 helper。helper 用 Go 1.27 编译,要求 **macOS 13
50
+ Ventura 或更高版本**:macOS 12 及更早版本无法启动 Funnel 模式,可信局域网模式
51
+ 不受影响。
52
+
53
+ 当前工作树的 `engines.dsh` 与 `peerDependencies` 声明该区间,构建与类型检查
54
+ 针对 `0.2.1-rc.5`。从此工作树发布新版本前,已发布的旧插件包仍可能带有各自旧的
55
+ 兼容声明。
53
56
 
54
57
  ```sh
55
58
  dsh plugin --profile web add dsh-deeppilot
56
59
  dsh web
57
60
  ```
58
61
 
59
- DSH 重启后,打开 **设置 → DeepPilot**,启用连接并显示配对二维码,然后在
60
- DeepPilot App 中扫码。二维码下方同时显示一段可复制的「配对信息」(含地址、一次性配对码
62
+ DSH 重启后,打开 **设置 → DeepPilot**,开启“允许手机连接”,在“已配对设备”右侧
63
+ 点击“添加手机”,然后在 DeepPilot App 中扫码。配对面板中还显示一段可复制的「配对信息」(含地址、一次性配对码
61
64
  与证书指纹),在 App 里粘贴一次即可完成配对,适合模拟器或相机不可用时使用;在「内网 /
62
65
  公网」之间切换会立即为所选地址生成新的二维码与配对信息,面板保持展开。
63
66
 
@@ -114,7 +117,11 @@ DeepPilot 设置页提供“每个公网来源的连接上限”,默认 `8`,
114
117
  自定义名称;名称会保存在主机设备注册表中,即使 iPhone 重连或上报了新的系统名称
115
118
  也不会被覆盖。留空保存可恢复 iPhone 上报的默认名称。
116
119
 
117
- 设置页的“测试与故障排查”分组下有一个 `debug` 开关,打开后会在 DSH host 的
120
+ 设备行的“更多操作”可查看指纹、重命名或删除设备;删除仍需再次确认。
121
+ 连接选项、连接帮助、诊断工具和系统信息默认收起。桌面次要操作按钮高 28px,
122
+ 自有操作的触屏点击区域至少 44px。“添加手机”直接使用 DSH 内置 `Button` 的小号描边样式,所有开关使用内置 `Switch`;这些原生控件的外观与尺寸均沿用宿主。布局与验收方式见 [设置页说明](docs/SETTINGS_UI.md)。
123
+
124
+ 设置页的“诊断工具”分组下有一个 `debug` 开关,打开后会在 DSH host 的
118
125
  终端输出里打印逐帧与推送等诊断信息(例如 `s2c.welcome` 里实际发出的能力位),
119
126
  不会打印配对令牌、APNs token 或消息内容。该开关按连接快照,已建立的连接需要
120
127
  重连一次才按新值工作。
package/bin/SHA256SUMS CHANGED
@@ -1,6 +1,6 @@
1
- cc7f9ae55c7a8b717a45cd83fd671e2c9b6993f91c09f33c44fd28ea459eeba0 ./darwin-amd64/dsh-deeppilot-tunnel
2
- 37f7430994f6ad79a2a93573f79ea2a1b1a6108fac054117548d8268dca422db ./darwin-arm64/dsh-deeppilot-tunnel
3
- 051ff06069db0f4ede5570a693811f380cf0740065df3969113b0b5d9ded3c0f ./linux-amd64/dsh-deeppilot-tunnel
4
- f704a48365d952185e6b6c28d655db0e174cbf1b9557e3fe40493ca1f7c614fe ./linux-arm64/dsh-deeppilot-tunnel
5
- ac2470db2843958af431de284212018ff8f2f9aa147a08359aada21e3a5a09b1 ./windows-amd64/dsh-deeppilot-tunnel.exe
6
- 541da90383098daecda68f910058d8071439d07f2edd7726f0af6fdb3c778b7d ./windows-arm64/dsh-deeppilot-tunnel.exe
1
+ c79c889415f6fce13a2d0f19c94e2ceb5cbfc06ec5c841c1002092783663a6a6 ./darwin-amd64/dsh-deeppilot-tunnel
2
+ affe9151e5356b574e1a85c806b198c39b5804f3a305b655cd3eb03c628ae0cc ./darwin-arm64/dsh-deeppilot-tunnel
3
+ a2475a2844250a6ef03853fe64db63eb1a163d9fcd7f3f438f3ec7a142d3a044 ./linux-amd64/dsh-deeppilot-tunnel
4
+ 6241de8d3c67e6e2af98e6b6040a10d9352183f893d3aed82c879a76c8b79432 ./linux-arm64/dsh-deeppilot-tunnel
5
+ 9449d3c48cc11446cd0f35c030f28000b5934512512fc1d7eeaa769d8d8304f3 ./windows-amd64/dsh-deeppilot-tunnel.exe
6
+ fd0c912b5b39ba8bd385cb05c39665d89519c75b6f5ddbc506b7554926f6545f ./windows-arm64/dsh-deeppilot-tunnel.exe
@@ -17,6 +17,8 @@
17
17
  | `pluginManager.listVersions` / `registries` | 公开版本目录及软件源配置 | 已读 | 显示候选版本,读取精确协议声明,确定实际候选源 |
18
18
  | `pluginManager.updateBundle` / `listBundles` | 精确版本更新、实际安装清单 | 已读 | 由宿主完成 HMR 替换和失败回滚,再核对安装与运行版本 |
19
19
  | `plugin-manager/registry.registryPlan` | 公开软件源选择规则 | 已读并建立对照测试 | 预检宿主可能回退到的全部来源,禁止不同协议或完整性摘要绕过闸门 |
20
+ | `locale/<lang>.json` 的 `meta.detail` | 插件管理页按语言链读取详情文档,缺省退回包根 README | 已读 `dsh-plugin-detail` 选择规则 | 英文 `README.md`、中文 `README.zh-CN.md` |
21
+ | `settings.section.icon` 插槽 | 设置壳按 `settings.section` 同 id 渲染,`{size, active}` | 已读壳渲染与插槽声明 | 导航行显示单色线性手机图标;旧宿主不声明该插槽,保留默认图标 |
20
22
  | npm 精确版本 manifest | GET `{registry}/dsh-deeppilot/{version}` | 已读并限制响应大小及超时 | 核对包名、精确版本、bundle、`deepPilot.protocolVersion` 与强 SRI |
21
23
  | 其他新模块 | 新增包及发布清单 | 仅盘点 | 未接入,不引入额外产品行为 |
22
24
 
@@ -24,8 +26,8 @@
24
26
 
25
27
  | 类别 | 本轮范围内的状态 |
26
28
  |---|---|
27
- | 双方都有 | ZIP/Markdown 导出、瞬时流生命周期与正式事件关联、明确确认的更新及状态查询、兼容性闸门、宿主 HMR/回滚、断线后日志对账 |
28
- | 上游有、我方未接 | 自动化任务批量清理、Web 引用交互、插件富文本详情及其他 Web 专属入口;本轮未扩展手机对应功能 |
29
+ | 双方都有 | ZIP/Markdown 导出、瞬时流生命周期与正式事件关联、明确确认的更新及状态查询、兼容性闸门、宿主 HMR/回滚、断线后日志对账、插件详情页多语言文档、设置导航图标 |
30
+ | 上游有、我方未接 | Web 引用交互及其他 Web 专属入口(自动化任务批量清理已由下文 `deleteEnded` 接入);本轮未扩展手机对应功能 |
29
31
  | 我方有、上游没有 | 手机专用分块传输、独立瞬时 wire 帧、设备隔离的持久更新日志、App 协议版本闸门 |
30
32
  | 双方都没有 | 不支持的宿主上强制重启进程、手机静默安装、替用户发布 npm/GitHub 版本 |
31
33
 
@@ -38,6 +40,39 @@
38
40
  - 更新接受回执在目标校验和日志耐久写入后发送。最近结果保留供重连对账;同请求编号不能更换目标,也不能重复安装。日志不保存凭据或会话内容,设备归属仅保存摘要并只向所属设备返回。
39
41
  - “恢复”指 HMR 后重连并恢复当前会话。宿主无 HMR 时返回 `restart-required`;不会强杀宿主,不能声称已经自动重启。安装失败由宿主恢复旧版本,桥接只核验并呈现结果。
40
42
 
43
+ ## 宿主级计划任务(DSH 0.2.2-alpha.3)
44
+
45
+ `0.2.2-alpha.3` 把自动化任务改为宿主级模型(任务带 `target`,状态有
46
+ `active` / `paused` / `ended`),并重写了 `dsh-schedule` 服务面。插件按**服务形状**
47
+ (有 `edit`、无 `update`)选择适配器,不看版本号字符串;旧宿主逐字节保持原行为。
48
+ wire 契约见 [PROTOCOL.md](../PROTOCOL.md) 「Schedule 宿主级任务扩展」。
49
+
50
+ | 上游接口 | 本次阅读 | 桥接用途 |
51
+ |---|---|---|
52
+ | `schedule.list({active?,limit?,offset?})` | 分页对象 `{items,shown,total,limit,offset}` | 新帧 `c2s.schedule.host.list`;旧帧全量分页后过滤目标会话 |
53
+ | `schedule.view({id})` | 任务或 miss | `c2s.schedule.host.view` |
54
+ | `schedule.create(request, actorSessionId?, signal)` | `timing` + `target` 请求体 | `c2s.schedule.host.create`;旧帧把选择器转 `timing` + `target:{kind:"session"}` |
55
+ | `schedule.edit({id, action, patch?, expectedUpdatedAt?}, …)` | update/delete 合一 | `c2s.schedule.host.edit`;旧帧 update 用 `expected` 逐字段比较后转 `patch` |
56
+ | `schedule.run({id})` | 手动执行,执行中返回 `schedule_execution_pending` | `c2s.schedule.host.run`(E_BUSY 提示稍后) |
57
+ | `schedule.history({id,limit,before?})` | 与旧结构相同,不再校验会话归属 | 两种模型共用 `c2s.schedule.history`;宿主级忽略 `sessionId` |
58
+ | `schedule.deliveryLimits()` | `{newSessionIntervalSeconds}` | `c2s.schedule.host.limits` 只做展示,不自行节流 |
59
+ | `schedule.deleteInactive()` | `{deleted}`;alpha.3 删 `status="ended"`(alpha.2 判 `inactive`) | `c2s.schedule.host.deleteEnded`,回执 `deletedEnded`;手机端二次确认后才发 |
60
+ | 旧 `delete` / `update` / 按会话的 `list` | 仅在会话级宿主存在 | 旧帧原路径;宿主级宿主上由适配层映射 |
61
+
62
+ 差异对照补充:
63
+
64
+ | 类别 | 状态 |
65
+ |---|---|
66
+ | 双方都有 | 列表、创建、编辑、删除、清理已结束任务、投递历史、变更事件 |
67
+ | 上游有、我方未接 | `catalog`(不分页全量)——手机会话内入口改用分页列表连续翻页取全量,不需要单独的帧 |
68
+ | 我方有、上游没有 | 旧 App 的会话级视图(由宿主级任务反向投影)、按会话过滤的列表 |
69
+ | 双方都没有 | 任务执行结果回执、跨设备编辑锁(只用 `expectedUpdatedAt` 乐观冲突) |
70
+
71
+ 边界:旧视图过滤 `target.kind="session"` 且同会话、丢弃 `ended`、跳过 `rrule`(旧枚举无
72
+ 对应 kind,避免旧 App 整页解码失败);旧 `update` 的冲突保护是「`expected` 与当前任务
73
+ 逐字段比较」的尽力而为,旧视图没有 `updatedAt`;新帧用 `expectedUpdatedAt` 做真正的
74
+ 乐观冲突检测。`run` 按 `clientRequestId` 幂等,结果未知时客户端不得自动重试。
75
+
41
76
  ## 验证入口
42
77
 
43
- 插件用例:`tests/markdown-export.test.ts`、`tests/assistant-stream.test.ts`、`tests/plugin-update.test.ts`,以及 wire 注册表、历史适配和命令回归。iOS 测试及实机边界见私有项目的对接说明。真机、实际 npm 安装和 Funnel 验证不得由模拟或语法检查替代。
78
+ 插件用例:`tests/markdown-export.test.ts`、`tests/assistant-stream.test.ts`、`tests/plugin-update.test.ts`、`tests/schedule.test.ts`(双形态适配与七个新帧),以及 wire 注册表、历史适配和命令回归。iOS 测试及实机边界见私有项目的对接说明。真机、实际 npm 安装和 Funnel 验证不得由模拟或语法检查替代。