@dsh-electron/dsh-plugin-multi-root-workspace 0.1.11 → 0.1.12

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.
Files changed (49) hide show
  1. package/CHANGELOG.en.md +13 -1
  2. package/CHANGELOG.md +13 -1
  3. package/README.en.md +9 -8
  4. package/README.md +9 -8
  5. package/cordis.patch.yml +3 -2
  6. package/lib/auto-review.js +1 -1
  7. package/lib/client.js +96 -49
  8. package/lib/client.js.map +1 -1
  9. package/lib/{command-BGdz7VBH.js → command-CmLekG1M.js} +3 -2
  10. package/lib/command.js +1 -1
  11. package/lib/{compat-BiW-m_q0.js → compat-Bg2HFVMX.js} +3 -0
  12. package/lib/compat.js +1 -1
  13. package/lib/{sandbox-CXk5h-ct.js → dialects-Dr4rDR-H.js} +6 -264
  14. package/lib/{fs-BTXySwSG.js → fs-CfzJq2wd.js} +23 -8
  15. package/lib/fs.js +1 -1
  16. package/lib/index.js +7 -6
  17. package/lib/{instructions-MePoRigy.js → instructions-KsUwUFE0.js} +53 -37
  18. package/lib/instructions.js +1 -1
  19. package/lib/lsp.js +19 -16
  20. package/lib/native-win32-2waCRkPI.js +312 -0
  21. package/lib/process-fence.js +62 -12
  22. package/lib/protocol-4zdwV7u4.js +641 -0
  23. package/lib/{registry-KSsmU393.js → registry-YTUOjmVu.js} +368 -25
  24. package/lib/registry-operation-C2ZV3Jhw.js +116 -0
  25. package/lib/registry.js +3 -2
  26. package/lib/{review-context-AH-SXHmj.js → review-context-NDpKeMCc.js} +1 -1
  27. package/lib/review-context.js +1 -1
  28. package/lib/sandbox-C-vCJCp3.js +278 -0
  29. package/lib/sandbox.js +1 -1
  30. package/lib/scope.js +65 -9
  31. package/lib/skills.js +48 -29
  32. package/lib/types/authority/native-win32.d.ts +7 -0
  33. package/lib/types/authority/native.d.ts +23 -0
  34. package/lib/types/authority/protocol.d.ts +70 -0
  35. package/lib/types/compat/authority-storage.d.ts +6 -0
  36. package/lib/types/compat/dsh-version.d.ts +4 -4
  37. package/lib/types/compat/open-in-app-device.d.ts +1 -1
  38. package/lib/types/compat/process-entrypoints.d.ts +2 -0
  39. package/lib/types/compat/process-profile.d.ts +3 -0
  40. package/lib/types/compat/sandbox-confine.d.ts +2 -0
  41. package/lib/types/fs.d.ts +4 -1
  42. package/lib/types/instructions.d.ts +0 -47
  43. package/lib/types/registry-operation.d.ts +31 -0
  44. package/lib/types/registry.d.ts +47 -6
  45. package/lib/types/scope.d.ts +10 -0
  46. package/lib/types/skills/catalog.d.ts +3 -0
  47. package/lib/types/skills/pool.d.ts +1 -1
  48. package/lib/workspace-files.js +63 -7
  49. package/package.json +38 -31
package/CHANGELOG.en.md CHANGED
@@ -8,6 +8,17 @@ This file records the user-visible changes of every **released** version.
8
8
  - For installation sources, the supported upstream runtimes, and known limitations, see the [README](./README.en.md).
9
9
  - The evidence, numbering, and release state of each version live in the [roadmap progress ledger](./docs/plans/active/2026-09-12-multi-root-workspace.md#进度总账). The body of each GitHub Release is generated from the commit history by `scripts/release-notes.mjs` and is the complete raw list behind this file.
10
10
 
11
+ ## [0.1.12] - 2026-10-30
12
+
13
+ ### Added
14
+
15
+ - **Multiple Hosts can use additional roots at the same time (on by default)**: the bundle now configures a shared storage authority (`sharedStorageRoot`) — previously only the Host holding the store lease could use additional roots, and a second Host sharing the same registry was fail-closed. Now a single owner opens the storage medium and manages persistence, while the other Hosts read and write through their own Registry facades over kernel-authenticated local IPC; every mutation and each new operation's admission is ordered at the owner: operations that arrive after a revocation are refused immediately, ones admitted before it may finish, and a disconnect preserves the established deny boundary; when the owner exits or crashes a follower contends, takes over, and recovers under a new epoch, and a lost committed reply is never replayed. Copied exec argv and expired handles cannot stand in for a fresh admission, the synchronous confine/spawn entry points keep their return shape, and every consumer path (fs, sandbox, shell/PTC/agent PTY, LSP, Files/watch, instructions, Skills) goes through admission. Profiles without `sharedStorageRoot` keep the legacy contended-fail-closed behavior ([ADR-0024](./docs/decisions/ADR-0024-registry-operation-admission.md), [ADR-0025](./docs/decisions/ADR-0025-shared-registry-authority.md), [shared service architecture](./docs/architecture/registry-authority-service.md)).
16
+ - **Exact support for DSH `0.2.1-rc.5`**: the delta from `0.2.1-rc.4` does not touch this plugin's interfaces, so no new adapter branch is needed; the dev pin stays at `0.2.2-alpha.2` and the support matrix now covers 20 exact releases.
17
+
18
+ ### Changed
19
+
20
+ - **Dependency security floors raised**: the plugin's direct `zod` floor moves to `^4.6.7`; on the development side `vitest` moves to `^4.1.12`, and `@modelcontextprotocol/sdk` `^1.32.2` is declared explicitly to keep GenAI's optional `mcpToTool` capability on a fixed release. The full development tree's advisories drop from 1 critical / 17 high / 27 moderate to 5 high / 6 moderate; the remaining advisories in host trees are introduced by DSH's own exact pins (e.g. zod `4.4.3`, Undici `8.11.2`) and are not resolved by this plugin release ([dependency security review](./docs/troubleshooting/dependency-security-alerts.md)).
21
+
11
22
  ## [0.1.11] - 2026-10-29
12
23
 
13
24
  ### Added
@@ -192,7 +203,8 @@ The first release: the three MVP milestones (M1–M3).
192
203
 
193
204
  - All eight findings of the pre-release external review (three of them release-blocking) are fixed, each with a regression test: a registered directory replaced by a symlink transplanting its authority (which introduced `recordedPath` — **re-resolving a path is not re-authorizing it**), concurrent registry mutations losing a write or reviving a revoked grant (per-primary-root mutations are serialized), a refresh not re-checking directories, a typed path being overwritten by the directory picker, the `reveal` response contract and failure code, duplicate ids not validated, the primary root missing from nesting validation, and CI testing before building.
194
205
 
195
- [Unreleased]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.11...HEAD
206
+ [Unreleased]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.12...HEAD
207
+ [0.1.12]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.11...v0.1.12
196
208
  [0.1.11]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.10...v0.1.11
197
209
  [0.1.10]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.9...v0.1.10
198
210
  [0.1.9]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.8...v0.1.9
package/CHANGELOG.md CHANGED
@@ -8,6 +8,17 @@ English: [CHANGELOG.en.md](./CHANGELOG.en.md)
8
8
  - 安装方式、受支持的上游运行时与已知限制见 [README](./README.md)。
9
9
  - 每个版本的实施证据、编号口径与发布状态见[路线图 §进度总账](./docs/plans/active/2026-09-12-multi-root-workspace.md#进度总账);GitHub Release 的正文由 `scripts/release-notes.mjs` 从 commit 历史生成,是本文件之外的完整原始清单。
10
10
 
11
+ ## [0.1.12] - 2026-10-30
12
+
13
+ ### Added
14
+
15
+ - **多个 Host 可同时使用附加根(默认开启)**:bundle 现默认配置共享存储权威(`sharedStorageRoot`)——此前只有持有 store 租约的 Host 能使用附加根,共享同一登记的第二个 Host 一律 fail-closed。现在唯一 owner 打开存储介质并管理持久化,其余 Host 经本机内核认证的 IPC 通过各自的 Registry facade 读写;所有变更与每个新操作的授权在 owner 处统一排序:撤权后的新操作立即被拒,撤权前已准入的操作可以完成,断线/失联时保留既有拒绝边界;owner 退出或崩溃时 follower 竞选接管并以新 epoch 恢复,丢失的已提交应答不会自动重放。已复制的执行参数与过期句柄不能顶替新准入,同步 confine/spawn 入口保持原有返回形状;fs、sandbox、shell/PTC/agent PTY、LSP、Files/watch、指令与 Skills 消费路径全部接入准入。未启用 `sharedStorageRoot` 的 profile 保留旧的「争用即 fail-closed」行为([ADR-0024](./docs/decisions/ADR-0024-registry-operation-admission.md)、[ADR-0025](./docs/decisions/ADR-0025-shared-registry-authority.md)、[共享服务架构](./docs/architecture/registry-authority-service.md))。
16
+ - **精确支持 DSH `0.2.1-rc.5`**:相对 `0.2.1-rc.4` 没有触及本插件的接口变化,不新增适配分支;开发 pin 保持 `0.2.2-alpha.2`,支持矩阵现为 20 个精确版本。
17
+
18
+ ### Changed
19
+
20
+ - **依赖安全下限提升**:本插件直接依赖的 `zod` 下限升至 `^4.6.7`;开发侧 `vitest` 升至 `^4.1.12`,并显式声明 `@modelcontextprotocol/sdk` `^1.32.2` 以保留 GenAI `mcpToTool` 的可选能力。完整开发树的公告告警从 1 critical / 17 high / 27 moderate 降为 5 high / 6 moderate;宿主树中剩余告警均由 DSH 精确 pin 引入(如 zod `4.4.3`、Undici `8.11.2`),不随本插件版本解决([依赖安全排查](./docs/troubleshooting/dependency-security-alerts.md))。
21
+
11
22
  ## [0.1.11] - 2026-10-29
12
23
 
13
24
  ### Added
@@ -192,7 +203,8 @@ English: [CHANGELOG.en.md](./CHANGELOG.en.md)
192
203
 
193
204
  - 发布前外部评审提出的 8 项发现(其中 3 项发布阻断)全部修复,每项各带一个回归测试:登记目录被替换为符号链接后授权转移(引入 `recordedPath`,**重新解析路径不等于重新授权**)、并发修改注册表丢写或复活已撤销的授权(每个主根的变更串行)、刷新不重新检查目录、手输路径被目录选择器覆盖、`reveal` 的应答契约与失败码、重复 id 未校验、主根未纳入嵌套校验、CI 先测后构建。
194
205
 
195
- [Unreleased]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.11...HEAD
206
+ [Unreleased]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.12...HEAD
207
+ [0.1.12]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.11...v0.1.12
196
208
  [0.1.11]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.10...v0.1.11
197
209
  [0.1.10]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.9...v0.1.10
198
210
  [0.1.9]: https://github.com/cherrchen/dsh-plugin-multi-root-workspace/compare/v0.1.8...v0.1.9
package/README.en.md CHANGED
@@ -20,7 +20,7 @@ Not every project is a monorepo. A real development project is usually several i
20
20
  - **Additional-root Skills**: discovers `.dsh/skills` and `.agents/skills` inside additional folders, invoked through the namespaced `/alias-id:skill-name` reference and the native `skill` tool; each root has an independent toggle and editable `aliasId`, with a global setting that defaults to on.
21
21
  - **Absent when absent**: with no additional root configured, its behavior is item-for-item identical to an uninstalled harness; every misconfiguration fails loudly instead of silently degrading.
22
22
 
23
- Current released version: `v0.1.11`. The user-visible changes of each version live in the [CHANGELOG](./CHANGELOG.en.md); progress and release state live in the [roadmap progress ledger](./docs/plans/active/2026-09-12-multi-root-workspace.md#进度总账).
23
+ Current released version: `v0.1.12`. The user-visible changes of each version live in the [CHANGELOG](./CHANGELOG.en.md); progress and release state live in the [roadmap progress ledger](./docs/plans/active/2026-09-12-multi-root-workspace.md#进度总账).
24
24
 
25
25
  ## Quick Start
26
26
 
@@ -49,7 +49,7 @@ The agent can now read, write, and run bash in that directory — the default is
49
49
  | `0.1.6` | `0.1.6-alpha.1`, `0.1.6-alpha.2` |
50
50
  | `0.1.7` | `0.1.7-alpha.1`, `0.1.7-alpha.2`, `0.1.7-rc.1`, `0.1.7-rc.2` |
51
51
  | `0.2.0` | `0.2.0-rc.1`, `0.2.0-rc.2` |
52
- | `0.2.1` | `0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.1-alpha.3`, `0.2.1-alpha.4`, `0.2.1-alpha.5`, `0.2.1-rc.1`, `0.2.1-rc.2`, `0.2.1-rc.3`, `0.2.1-rc.4` |
52
+ | `0.2.1` | `0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.1-alpha.3`, `0.2.1-alpha.4`, `0.2.1-alpha.5`, `0.2.1-rc.1`, `0.2.1-rc.2`, `0.2.1-rc.3`, `0.2.1-rc.4`, `0.2.1-rc.5` |
53
53
  | `0.2.2` | `0.2.2-alpha.2` |
54
54
 
55
55
  The plugin does not start — as if it were not installed — when the DSH release is not in the table or the `@deepseek-ai/dsh-*` packages disagree on a version.
@@ -93,8 +93,8 @@ This installs pre-built artifacts; the first install needs the `allowBuilds` add
93
93
  ```sh
94
94
  pnpm pack @dsh-electron/dsh-plugin-multi-root-workspace
95
95
  # or download the tgz from the GitHub Release assets, e.g.:
96
- # https://github.com/cherrchen/dsh-plugin-multi-root-workspace/releases/download/v0.1.11/dsh-electron-dsh-plugin-multi-root-workspace-0.1.11.tgz
97
- dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-0.1.11.tgz
96
+ # https://github.com/cherrchen/dsh-plugin-multi-root-workspace/releases/download/v0.1.12/dsh-electron-dsh-plugin-multi-root-workspace-0.1.12.tgz
97
+ dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-0.1.12.tgz
98
98
  ```
99
99
 
100
100
  Also pre-built, handy for air-gapped or offline delivery; the first install needs the same `allowBuilds` addition.
@@ -113,10 +113,10 @@ allowBuilds:
113
113
  koffi: true
114
114
  ```
115
115
 
116
- Pinning a version (e.g. `#v0.1.11`) is recommended so a later push cannot silently change what actually runs:
116
+ Pinning a version (e.g. `#v0.1.12`) is recommended so a later push cannot silently change what actually runs:
117
117
 
118
118
  ```sh
119
- dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace#v0.1.11
119
+ dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace#v0.1.12
120
120
  ```
121
121
 
122
122
  ### Install from a local clone
@@ -181,6 +181,7 @@ Expected output:
181
181
  - id: multi-root-registry
182
182
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/registry'
183
183
  config:
184
+ sharedStorageRoot: !!js dshHomePath('storages')
184
185
  leasePath: !!js dshHomePath('storages/multi_root_workspace.lock')
185
186
  maxAdditionalRoots: 16
186
187
  - id: multi-root-instructions
@@ -260,7 +261,7 @@ For multi-root reviewer context, enable the default-disabled [Auto Review row](.
260
261
  .
261
262
  ├── src/
262
263
  │ ├── roots.ts pure rules: canonicalization, conflict validation, record classification (available/missing/redirected/invalid)
263
- │ ├── registry.ts the root registry: dsh-storage-domain persistence, mutations of one primary root serialized in one queue
264
+ │ ├── registry.ts one storage core and Host facades, store-wide ordering of mutations and admissions
264
265
  │ ├── registry-lease.ts cross-process Registry Authority: POSIX flock (the kernel releases it on process death)
265
266
  │ ├── registry-lease-win32.ts ditto, the Windows named-semaphore implementation
266
267
  │ ├── scope.ts ctx.multiRootScope: the single authorization source, plus the model-visible topology snapshot
@@ -295,7 +296,7 @@ Issues and PRs are welcome:
295
296
  ## Known Limitations
296
297
 
297
298
  - An additional root's instruction files arrive as they become relevant: the one at the root's top level is injected before the session's first step, and a subdirectory's is injected once the session has **successfully** worked in that directory. A nested file is re-examined only when its directory is examined (the root's own every step; a subdirectory's because it was delivered from, or because of a fresh touch), delivery state is in-process (so a resumed session may be told again), and only the `read` / `write` / `edit` tool names count. The primary root's chain and the user-global file remain upstream's job, and this plugin does not inject them a second time ([ADR-0010](./docs/decisions/ADR-0010-additional-root-instruction-scope.md)).
298
- - Single writer per store: only one DSH process at a time may hold the root registry for a given `$DSH_HOME`; another process reports the registry as unavailable (`registry-contended`) and takes over on refresh once the holder exits or crashes. That is deliberate fail-closed behavior, not a race waiting to be fixed ([ADR-0007](./docs/decisions/ADR-0007-registry-authority-lease.md)).
299
+ - Hosts share one Registry service: one Host owns storage and each instance obtains admission for new operations. Disconnection stops new additional-root grants; a successor takes over through the kernel lease. Sharing is local to one user and lock namespace; Linux requires SO_PEERPIDFD, and Windows is limited to one login session. Existing processes and PTYs retain their launch snapshot ([architecture](./docs/architecture/registry-authority-service.md), Chinese).
299
300
  - The supported matrix is an exact-version allowlist: on a host whose release is not on the list, or whose core packages disagree about the release, the `fs` / `sandbox` / `registry` / `instructions` / `lsp` / `workspace-files` rows **do not start** and the composition degrades to "the plugin is not installed" ([ADR-0009](./docs/decisions/ADR-0009-dsh-compat-contract.md)).
300
301
  - The Windows multi-root runner inherits upstream partial enforcement, caller-owned directory requirements, and private-temp isolation. Running processes retain their initial roots; later processes use the updated set ([ADR-0011](./docs/decisions/ADR-0011-multi-root-workspace-consumers.md)).
301
302
  - **Network and device paths cannot be additional roots on Windows**: UNC (`\\server\share`), `\\?\`, `\\.\`, and mapped network drives are rejected at registration with `unsupported-path` — the restricted token's capability SID cannot be shown to bind SMB access ([ADR-0011 amendment](./docs/decisions/ADR-0011-multi-root-workspace-consumers.md)).
package/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
  - **附属根 Skills**:发现附属目录的 `.dsh/skills` 与 `.agents/skills`,附属根经 `/alias-id:skill-name` 命名空间调用原生 `skill` 工具;每根独立开关、可编辑 `aliasId`,全局设置默认开启。
21
21
  - **不配等于没装**:未登记附加根时行为与未装插件逐项一致;配置错误一律明确报错,从不静默降级。
22
22
 
23
- 当前发布版本 `v0.1.11`。各版本的用户可见变更见 [CHANGELOG](./CHANGELOG.md);进度与发布状态见[路线图 §进度总账](./docs/plans/active/2026-09-12-multi-root-workspace.md#进度总账)。
23
+ 当前发布版本 `v0.1.12`。各版本的用户可见变更见 [CHANGELOG](./CHANGELOG.md);进度与发布状态见[路线图 §进度总账](./docs/plans/active/2026-09-12-multi-root-workspace.md#进度总账)。
24
24
 
25
25
  ## 快速开始
26
26
 
@@ -51,7 +51,7 @@ tarball、GitHub、本地源码等其他安装方式见[安装](#安装)。
51
51
  | `0.1.6` | `0.1.6-alpha.1`、`0.1.6-alpha.2` |
52
52
  | `0.1.7` | `0.1.7-alpha.1`、`0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2` |
53
53
  | `0.2.0` | `0.2.0-rc.1`、`0.2.0-rc.2` |
54
- | `0.2.1` | `0.2.1-alpha.1`、`0.2.1-alpha.2`、`0.2.1-alpha.3`、`0.2.1-alpha.4`、`0.2.1-alpha.5`、`0.2.1-rc.1`、`0.2.1-rc.2`、`0.2.1-rc.3`、`0.2.1-rc.4` |
54
+ | `0.2.1` | `0.2.1-alpha.1`、`0.2.1-alpha.2`、`0.2.1-alpha.3`、`0.2.1-alpha.4`、`0.2.1-alpha.5`、`0.2.1-rc.1`、`0.2.1-rc.2`、`0.2.1-rc.3`、`0.2.1-rc.4`、`0.2.1-rc.5` |
55
55
  | `0.2.2` | `0.2.2-alpha.2` |
56
56
 
57
57
  DSH 版本不在表内、或 `@deepseek-ai/dsh-*` 各包版本不一致时,插件不会启动,行为等同没装。
@@ -95,8 +95,8 @@ dsh plugin --profile web add @dsh-electron/dsh-plugin-multi-root-workspace
95
95
  ```sh
96
96
  pnpm pack @dsh-electron/dsh-plugin-multi-root-workspace
97
97
  # 或从 GitHub Release 资产下载,例如:
98
- # https://github.com/cherrchen/dsh-plugin-multi-root-workspace/releases/download/v0.1.11/dsh-electron-dsh-plugin-multi-root-workspace-0.1.11.tgz
99
- dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-0.1.11.tgz
98
+ # https://github.com/cherrchen/dsh-plugin-multi-root-workspace/releases/download/v0.1.12/dsh-electron-dsh-plugin-multi-root-workspace-0.1.12.tgz
99
+ dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-0.1.12.tgz
100
100
  ```
101
101
 
102
102
  同样是预构建产物,适合内网或离线环境交付;首次安装同样需要添加 `allowBuilds`。
@@ -115,10 +115,10 @@ allowBuilds:
115
115
  koffi: true
116
116
  ```
117
117
 
118
- 建议锁定版本(如 `#v0.1.11`),让后续推送无法悄悄改变实际运行的内容:
118
+ 建议锁定版本(如 `#v0.1.12`),让后续推送无法悄悄改变实际运行的内容:
119
119
 
120
120
  ```sh
121
- dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace#v0.1.11
121
+ dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace#v0.1.12
122
122
  ```
123
123
 
124
124
  ### 从本地源码安装
@@ -183,6 +183,7 @@ dsh --profile web --dump-config | grep -A3 'multi-root'
183
183
  - id: multi-root-registry
184
184
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/registry'
185
185
  config:
186
+ sharedStorageRoot: !!js dshHomePath('storages')
186
187
  leasePath: !!js dshHomePath('storages/multi_root_workspace.lock')
187
188
  maxAdditionalRoots: 16
188
189
  - id: multi-root-instructions
@@ -262,7 +263,7 @@ Settings → Plugins → Multi-root Workspace 中的 **启用附属根 Skills**
262
263
  .
263
264
  ├── src/
264
265
  │ ├── roots.ts 纯规则层:canonical 化、冲突校验、登记状态分类(available/missing/redirected/invalid)
265
- │ ├── registry.ts 根注册表:dsh-storage-domain 持久化,同一主根的变更在一条队列里串行
266
+ │ ├── registry.ts 根注册表:dsh-storage-domain 持久化,唯一存储核心与 Host facade,store-wide 准入/变更排序
266
267
  │ ├── registry-lease.ts 跨进程 Registry Authority:POSIX flock(进程死亡由内核释放)
267
268
  │ ├── registry-lease-win32.ts 同上,Windows named semaphore 实现
268
269
  │ ├── scope.ts ctx.multiRootScope:唯一的授权源,兼发模型可见的拓扑快照
@@ -297,7 +298,7 @@ Settings → Plugins → Multi-root Workspace 中的 **启用附属根 Skills**
297
298
  ## 已知限制
298
299
 
299
300
  - 附加根的指令文件按需到达模型:根目录顶层的那一份在会话第一步之前注入,子目录里的那一份在本会话**成功**触碰过该目录之后注入;nested 文件只会在其目录被考察到时重新检查(根层每一步,子目录依赖已投递或有新触碰),投递状态是进程内的(resume 后可能再告知一次),也只识别 `read` / `write` / `edit` 三个工具名。主根与 user-global 的指令链仍由上游负责,本插件不重复注入([ADR-0010](./docs/decisions/ADR-0010-additional-root-instruction-scope.md))。
300
- - 跨进程单写者:同一 `$DSH_HOME` 上同时只允许一个 DSH 进程持有根登记表;另一个进程显示登记表不可用(`registry-contended`),持锁者退出或崩溃后刷新即接管——这是刻意的 fail-closed,不是待修的竞态([ADR-0007](./docs/decisions/ADR-0007-registry-authority-lease.md))。
301
+ - 多 Host 共享同一登记服务:只有一个 Host 管理存储,各实例逐操作取得授权;断线停止新附加授权,权威退出后按内核锁接管。限同机器、同用户及同锁命名空间;Linux 共享连接需要 SO_PEERPIDFD,Windows 限同登录会话。旧进程/PTY 保留启动快照([共享架构](./docs/architecture/registry-authority-service.md))。
301
302
  - 支持矩阵是精确版本 allowlist:宿主版本不在清单上、或核心包混装了不同版本时,`fs` / `sandbox` / `registry` / `instructions` / `lsp` / `workspace-files` 六行**不启动**,组合退化为"没装这个插件"([ADR-0009](./docs/decisions/ADR-0009-dsh-compat-contract.md))。
302
303
  - Windows 多根 runner 继承上游 partial enforcement、caller-owned 目录及 private temp 分离条件;已启动进程保留启动时根集合,后续进程使用更新后的集合([ADR-0011](./docs/decisions/ADR-0011-multi-root-workspace-consumers.md))。
303
304
  - **Windows 上的网络与设备路径不能成为附加根**:UNC(`\\server\share`)、`\\?\`、`\\.\` 与映射网络盘在登记时即以 `unsupported-path` 拒绝——restricted token 的 capability SID 无法绑定 SMB 访问([ADR-0011 修订](./docs/decisions/ADR-0011-multi-root-workspace-consumers.md))。
package/cordis.patch.yml CHANGED
@@ -79,8 +79,9 @@
79
79
  - id: multi-root-registry
80
80
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/registry'
81
81
  config:
82
- # Store-wide kernel lease beside the JSON domain document. A custom
83
- # storage-json.root must override this path in lockstep (ADR-0007).
82
+ # Shared authority owns this explicit JSON medium; followers use IPC.
83
+ # Change both paths together for a custom Registry store (ADR-0025).
84
+ sharedStorageRoot: !!js dshHomePath('storages')
84
85
  leasePath: !!js dshHomePath('storages/multi_root_workspace.lock')
85
86
  # Cap on stored additional-root records per primary root (integer,
86
87
  # 1..64; the count covers every state, so it is stable). A store that
@@ -1,4 +1,4 @@
1
- import { n as assertAutoReviewRelease, t as MultiRootReviewContext } from "./review-context-AH-SXHmj.js";
1
+ import { n as assertAutoReviewRelease, t as MultiRootReviewContext } from "./review-context-NDpKeMCc.js";
2
2
  import { t as assertForkPackages } from "./auto-review-packages-nRjnb4pU.js";
3
3
  import { t as wrapMethod } from "./method-wrapper-CFY3p3j2.js";
4
4
  //#region src/compat/auto-review-loader.ts
package/lib/client.js CHANGED
@@ -123,7 +123,7 @@ window.__ModuleLoader__.load({
123
123
  return typeof count === "number" && count > 0;
124
124
  }
125
125
  //#endregion
126
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/util.js
126
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/util.js
127
127
  function getEnumValues(entries) {
128
128
  const numericValues = Object.values(entries).filter((v) => typeof v === "number");
129
129
  return Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
@@ -430,6 +430,17 @@ window.__ModuleLoader__.load({
430
430
  function unwrapMessage(message) {
431
431
  return typeof message === "string" ? message : message?.message;
432
432
  }
433
+ /** The leading size checks of `defChecks` that set an upper bound, each paired with it. */
434
+ function sizeCaps(defChecks) {
435
+ const caps = [];
436
+ for (const ch of defChecks ?? []) {
437
+ const d = ch._zod.def;
438
+ if (!/_(length|size)$|_equals$/.test(d.check)) break;
439
+ const max = d.maximum ?? d.length ?? d.size;
440
+ if (max >= 0) caps.push([max, ch]);
441
+ }
442
+ return caps;
443
+ }
433
444
  function attachSchema(issues, start, inst) {
434
445
  var _a;
435
446
  for (let i = start; i < issues.length; i++) (_a = issues[i]).schema ?? (_a.schema = inst);
@@ -506,7 +517,6 @@ window.__ModuleLoader__.load({
506
517
  });
507
518
  else defineBound(proto, key, desc.value);
508
519
  }
509
- for (const sym of Object.getOwnPropertySymbols(table)) defineBound(proto, sym, table[sym]);
510
520
  }
511
521
  /** Shadows a prototype member with an own value, so a getter that builds from the instance runs once. */
512
522
  function own(inst, key, value, enumerable = true) {
@@ -647,7 +657,7 @@ window.__ModuleLoader__.load({
647
657
  return fn;
648
658
  }
649
659
  //#endregion
650
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/core.js
660
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/core.js
651
661
  var _a$1;
652
662
  const _zodDesc = {
653
663
  value: void 0,
@@ -692,8 +702,7 @@ window.__ModuleLoader__.load({
692
702
  } finally {
693
703
  _zodDesc.value = void 0;
694
704
  }
695
- }
696
- if (inst._zod.traits.has(name)) return;
705
+ } else if (inst._zod.traits.has(name)) return;
697
706
  inst._zod.traits.add(name);
698
707
  initializer(inst, def);
699
708
  if (initialized) {
@@ -754,7 +763,7 @@ window.__ModuleLoader__.load({
754
763
  return globalConfig;
755
764
  }
756
765
  //#endregion
757
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/errors.js
766
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/errors.js
758
767
  function _getMessage() {
759
768
  const internals = this._zod;
760
769
  internals.message ?? (internals.message = JSON.stringify(internals.def, jsonStringifyReplacer, 2));
@@ -870,7 +879,7 @@ window.__ModuleLoader__.load({
870
879
  return fieldErrors;
871
880
  }
872
881
  //#endregion
873
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/parse.js
882
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/parse.js
874
883
  function finalizeParams(callee, params) {
875
884
  return {
876
885
  callee: params?.callee ?? callee,
@@ -1073,7 +1082,7 @@ window.__ModuleLoader__.load({
1073
1082
  return _safeParseAsync(_Err)(schema, value, _ctx);
1074
1083
  };
1075
1084
  //#endregion
1076
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/regexes.js
1085
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/regexes.js
1077
1086
  /**
1078
1087
  * @deprecated CUID v1 is deprecated by its authors due to information leakage
1079
1088
  * (timestamps embedded in the id). Use {@link cuid2} instead.
@@ -1144,7 +1153,7 @@ window.__ModuleLoader__.load({
1144
1153
  const lowercase = /^[^A-Z]*$/;
1145
1154
  const uppercase = /^[^a-z]*$/;
1146
1155
  //#endregion
1147
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/checks.js
1156
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/checks.js
1148
1157
  const $ZodCheck = /*@__PURE__*/ $constructor("$ZodCheck", (inst, def) => {
1149
1158
  var _a;
1150
1159
  inst._zod ?? (inst._zod = {});
@@ -1440,7 +1449,7 @@ window.__ModuleLoader__.load({
1440
1449
  };
1441
1450
  });
1442
1451
  //#endregion
1443
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/doc.js
1452
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/doc.js
1444
1453
  var Doc = class {
1445
1454
  constructor(args = [], closed = {}) {
1446
1455
  this.content = [];
@@ -1474,14 +1483,14 @@ window.__ModuleLoader__.load({
1474
1483
  }
1475
1484
  };
1476
1485
  //#endregion
1477
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/versions.js
1486
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/versions.js
1478
1487
  const version = {
1479
1488
  major: 4,
1480
1489
  minor: 6,
1481
- patch: 2
1490
+ patch: 7
1482
1491
  };
1483
1492
  //#endregion
1484
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/schemas.js
1493
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/schemas.js
1485
1494
  const $ZodType = /*@__PURE__*/ $constructor("$ZodType", (inst, def) => {
1486
1495
  var _a;
1487
1496
  inst ?? (inst = {});
@@ -1641,10 +1650,27 @@ window.__ModuleLoader__.load({
1641
1650
  def.pattern ?? (def.pattern = email);
1642
1651
  $ZodStringFormat.init(inst, def);
1643
1652
  });
1644
- /** Parses a URL for `$ZodURL`, applying the one guard the URL constructor cannot express. Returns the parsed URL, or a code naming the stage that rejected it — the runtime needs that distinction to pick an issue note, and compiled code only needs to know it is not a URL. */
1653
+ function canParseURL(input) {
1654
+ try {
1655
+ if (typeof URL !== "undefined" && typeof URL.canParse === "function") return URL.canParse(input);
1656
+ new URL(input);
1657
+ return true;
1658
+ } catch {
1659
+ return false;
1660
+ }
1661
+ }
1662
+ function validateURL(trimmed, def) {
1663
+ if (!("normalize" in def) && !("hostname" in def) && !("protocol" in def)) return canParseURL(trimmed) || 2;
1664
+ return parseURLObject(trimmed, def);
1665
+ }
1666
+ /** Parses a URL while preserving the non-normalizing HTTP guard. */
1645
1667
  function parseURLObject(trimmed, def) {
1646
1668
  if (!def.normalize && def.protocol?.source === httpProtocol.source && !/^https?:\/\//i.test(trimmed)) return 1;
1647
1669
  try {
1670
+ if (typeof URL !== "undefined") {
1671
+ const URLStatic = URL;
1672
+ if (typeof URLStatic.parse === "function") return URLStatic.parse(trimmed) ?? 2;
1673
+ }
1648
1674
  return new URL(trimmed);
1649
1675
  } catch {
1650
1676
  return 2;
@@ -1668,7 +1694,7 @@ window.__ModuleLoader__.load({
1668
1694
  inst._zod.check = (payload) => {
1669
1695
  try {
1670
1696
  const trimmed = payload.value.trim();
1671
- const url = parseURLObject(trimmed, def);
1697
+ const url = validateURL(trimmed, def);
1672
1698
  if (url === 1) {
1673
1699
  payload.issues.push({
1674
1700
  code: "invalid_format",
@@ -1690,6 +1716,10 @@ window.__ModuleLoader__.load({
1690
1716
  });
1691
1717
  return;
1692
1718
  }
1719
+ if (url === true) {
1720
+ payload.value = stripTabAndNewline(trimmed);
1721
+ return;
1722
+ }
1693
1723
  if (def.hostname && !urlHostnameOk(url, def.hostname)) payload.issues.push({
1694
1724
  code: "invalid_format",
1695
1725
  format: "url",
@@ -1779,12 +1809,7 @@ window.__ModuleLoader__.load({
1779
1809
  const ipv6Alphabet = /^[0-9a-fA-F:.]+$/;
1780
1810
  function isValidIPv6(value) {
1781
1811
  if (!ipv6Alphabet.test(value)) return false;
1782
- try {
1783
- new URL(`http://[${value}]`);
1784
- return true;
1785
- } catch {
1786
- return false;
1787
- }
1812
+ return canParseURL(`http://[${value}]`);
1788
1813
  }
1789
1814
  const $ZodIPv6 = /*@__PURE__*/ $constructor("$ZodIPv6", (inst, def) => {
1790
1815
  def.pattern ?? (def.pattern = ipv6);
@@ -1962,6 +1987,26 @@ window.__ModuleLoader__.load({
1962
1987
  return payload;
1963
1988
  };
1964
1989
  });
1990
+ function capSize(inst, size) {
1991
+ const caps = sizeCaps(inst._zod.def.checks);
1992
+ if (!caps.length) return;
1993
+ const cap = Math.min(...caps.map((c) => c[0]));
1994
+ const parse = inst._zod.parse;
1995
+ inst._zod.parse = (payload, ctx) => {
1996
+ const n = size(payload.value);
1997
+ if (n > cap && !ctx?.skipChecks && ctx?.direction !== "backward") {
1998
+ for (const [max, ch] of sizeCaps(inst._zod.def.checks)) if (n > max && ch._zod.def.when(payload)) {
1999
+ const start = payload.issues.length;
2000
+ ch._zod.check(payload);
2001
+ payload.issues[start].continue = false;
2002
+ attachSchema(payload.issues, start, inst);
2003
+ return payload;
2004
+ }
2005
+ }
2006
+ return parse(payload, ctx);
2007
+ };
2008
+ }
2009
+ const arraySize = (input) => Array.isArray(input) ? input.length : -1;
1965
2010
  function handleArrayResult(result, final, index) {
1966
2011
  if (result.issues.length) final.issues.push(...prefixIssues(index, result.issues));
1967
2012
  final.value[index] = result.value;
@@ -1999,6 +2044,7 @@ window.__ModuleLoader__.load({
1999
2044
  if (proms.length) return Promise.all(proms).then(() => payload);
2000
2045
  return payload;
2001
2046
  };
2047
+ capSize(inst, arraySize);
2002
2048
  });
2003
2049
  function handlePropertyResult(result, final, key, input, optin, optout) {
2004
2050
  const isPresent = key in input;
@@ -2107,7 +2153,7 @@ window.__ModuleLoader__.load({
2107
2153
  }
2108
2154
  return propValues;
2109
2155
  });
2110
- const isObject$2 = isObject;
2156
+ const isObject$1 = isObject;
2111
2157
  const catchall = def.catchall;
2112
2158
  let value;
2113
2159
  const memo = globalConfig.memoizer;
@@ -2115,7 +2161,7 @@ window.__ModuleLoader__.load({
2115
2161
  inst._zod.parse = (payload, ctx) => {
2116
2162
  value ?? (value = _normalized.value);
2117
2163
  const input = payload.value;
2118
- if (!isObject$2(input)) {
2164
+ if (!isObject$1(input)) {
2119
2165
  payload.issues.push({
2120
2166
  expected: "object",
2121
2167
  code: "invalid_type",
@@ -2245,7 +2291,7 @@ window.__ModuleLoader__.load({
2245
2291
  return doc.compile();
2246
2292
  };
2247
2293
  let fastpass;
2248
- const isObject$1 = isObject;
2294
+ const isObject$2 = isObject;
2249
2295
  const jit = !globalConfig.jitless;
2250
2296
  const fastEnabled = jit && allowsEval.value;
2251
2297
  const catchall = def.catchall;
@@ -2253,7 +2299,7 @@ window.__ModuleLoader__.load({
2253
2299
  inst._zod.parse = (payload, ctx) => {
2254
2300
  value ?? (value = _normalized.value);
2255
2301
  const input = payload.value;
2256
- if (!isObject$1(input)) {
2302
+ if (!isObject$2(input)) {
2257
2303
  payload.issues.push({
2258
2304
  expected: "object",
2259
2305
  code: "invalid_type",
@@ -2683,7 +2729,7 @@ window.__ModuleLoader__.load({
2683
2729
  }
2684
2730
  }
2685
2731
  //#endregion
2686
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/memoizer.js
2732
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/memoizer.js
2687
2733
  var $ZodCyclicError = class extends Error {
2688
2734
  constructor() {
2689
2735
  super(`Cannot parse a reference cycle that closes through a transform`);
@@ -2694,7 +2740,7 @@ window.__ModuleLoader__.load({
2694
2740
  const STATE = "~memo";
2695
2741
  const NO_ISSUES = [];
2696
2742
  function isRef(value) {
2697
- return value !== null && (typeof value === "object" || typeof value === "function");
2743
+ return value !== null && typeof value === "object";
2698
2744
  }
2699
2745
  function cloneIssues(issues) {
2700
2746
  return issues.map((iss) => iss.path ? {
@@ -2741,9 +2787,6 @@ window.__ModuleLoader__.load({
2741
2787
  check(def.catchall);
2742
2788
  break;
2743
2789
  }
2744
- case "properties":
2745
- merge(shape(def.shape, false));
2746
- break;
2747
2790
  case "array":
2748
2791
  check(def.element);
2749
2792
  break;
@@ -2939,7 +2982,7 @@ window.__ModuleLoader__.load({
2939
2982
  return backEdges !== void 0 && isRef(value) && backEdges.has(value);
2940
2983
  }
2941
2984
  //#endregion
2942
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/locales/en.js
2985
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/locales/en.js
2943
2986
  const error = () => {
2944
2987
  const Sizable = {
2945
2988
  string: {
@@ -2994,6 +3037,7 @@ window.__ModuleLoader__.load({
2994
3037
  base64url: "base64url-encoded string",
2995
3038
  json_string: "JSON string",
2996
3039
  e164: "E.164 number",
3040
+ currency_code: "currency code",
2997
3041
  credit_card: "credit card number",
2998
3042
  iban: "IBAN",
2999
3043
  jwt: "JWT",
@@ -3046,7 +3090,7 @@ window.__ModuleLoader__.load({
3046
3090
  return { localeError: error() };
3047
3091
  }
3048
3092
  //#endregion
3049
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/registries.js
3093
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/registries.js
3050
3094
  var _a;
3051
3095
  var $ZodRegistry = class {
3052
3096
  constructor() {
@@ -3093,13 +3137,17 @@ window.__ModuleLoader__.load({
3093
3137
  (_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());
3094
3138
  const globalRegistry = globalThis.__zod_globalRegistry;
3095
3139
  //#endregion
3096
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/api.js
3140
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/api.js
3141
+ function snapshotChecks(def) {
3142
+ if (def.checks) def.checks = [...def.checks];
3143
+ return def;
3144
+ }
3097
3145
  // @__NO_SIDE_EFFECTS__
3098
3146
  function _string(Class, params) {
3099
- return new Class({
3147
+ return new Class(snapshotChecks({
3100
3148
  type: "string",
3101
3149
  ...normalizeParams(params)
3102
- });
3150
+ }));
3103
3151
  }
3104
3152
  // @__NO_SIDE_EFFECTS__
3105
3153
  function _email(Class, params) {
@@ -3371,11 +3419,11 @@ window.__ModuleLoader__.load({
3371
3419
  }
3372
3420
  // @__NO_SIDE_EFFECTS__
3373
3421
  function _number(Class, params) {
3374
- return new Class({
3422
+ return new Class(snapshotChecks({
3375
3423
  type: "number",
3376
3424
  checks: [],
3377
3425
  ...normalizeParams(params)
3378
- });
3426
+ }));
3379
3427
  }
3380
3428
  // @__NO_SIDE_EFFECTS__
3381
3429
  function _int(Class, params) {
@@ -3598,7 +3646,7 @@ window.__ModuleLoader__.load({
3598
3646
  return ch;
3599
3647
  }
3600
3648
  //#endregion
3601
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/to-json-schema.js
3649
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/to-json-schema.js
3602
3650
  function assignProps(target, ...sources) {
3603
3651
  for (const source of sources) for (const key of Reflect.ownKeys(source)) if (Object.prototype.propertyIsEnumerable.call(source, key)) assignProp(target, key, source[key]);
3604
3652
  return target;
@@ -4042,7 +4090,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4042
4090
  return finalize(ctx, schema);
4043
4091
  };
4044
4092
  //#endregion
4045
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/core/json-schema-processors.js
4093
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/core/json-schema-processors.js
4046
4094
  const narrowMin = (agg, key, value) => {
4047
4095
  if (agg[key] === void 0 || value > agg[key]) agg[key] = value;
4048
4096
  };
@@ -4229,13 +4277,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4229
4277
  key
4230
4278
  ]
4231
4279
  }));
4232
- const allKeys = new Set(Object.keys(shape));
4233
- const requiredKeys = new Set([...allKeys].filter((key) => {
4280
+ const requiredKeys = [];
4281
+ for (const key of Object.keys(shape)) {
4234
4282
  const field = def.shape[key];
4235
- if (ctx.io === "input") return inputOptin(field) === void 0;
4236
- else return field._zod.optout === void 0;
4237
- }));
4238
- if (requiredKeys.size > 0) json.required = Array.from(requiredKeys);
4283
+ if (ctx.io === "input" ? inputOptin(field) === void 0 : field._zod.optout === void 0) requiredKeys.push(key);
4284
+ }
4285
+ if (requiredKeys.length > 0) json.required = requiredKeys;
4239
4286
  if (def.catchall?._zod.def.type === "never") json.additionalProperties = false;
4240
4287
  else if (!def.catchall) {
4241
4288
  if (ctx.io === "output") json.additionalProperties = false;
@@ -4364,7 +4411,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4364
4411
  seen.ref = def.innerType;
4365
4412
  };
4366
4413
  //#endregion
4367
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/classic/errors.js
4414
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/classic/errors.js
4368
4415
  const _installedErrorProtos = /* @__PURE__ */ new WeakSet([Object.prototype, Error.prototype]);
4369
4416
  function _lazyMethod(proto, key, make) {
4370
4417
  Object.defineProperty(proto, key, {
@@ -4414,7 +4461,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4414
4461
  };
4415
4462
  const ZodRealError = /*@__PURE__*/ $constructor("ZodError", initializer, void 0, { Parent: Error });
4416
4463
  //#endregion
4417
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/classic/parse.js
4464
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/classic/parse.js
4418
4465
  const parse = /* @__PURE__ */ _parse(ZodRealError);
4419
4466
  const parseAsync = /* @__PURE__ */ _parseAsync(ZodRealError);
4420
4467
  const safeParse = /* @__PURE__ */ _safeParse(ZodRealError);
@@ -4428,7 +4475,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4428
4475
  const safeEncodeAsync = /* @__PURE__ */ _safeEncodeAsync(ZodRealError);
4429
4476
  const safeDecodeAsync = /* @__PURE__ */ _safeDecodeAsync(ZodRealError);
4430
4477
  //#endregion
4431
- //#region node_modules/.pnpm/zod@4.6.2/node_modules/zod/v4/classic/schemas.js
4478
+ //#region node_modules/.pnpm/zod@4.6.7/node_modules/zod/v4/classic/schemas.js
4432
4479
  function _ensureDefaultLocale() {
4433
4480
  if (!globalConfig.localeError) config(en_default());
4434
4481
  }
@@ -8349,7 +8396,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8349
8396
  * `@deepseek-ai/dsh-client-ui-primitives`.
8350
8397
  *
8351
8398
  * ```text
8352
- * 0.1.5-rc.2 through 0.2.1-rc.4 no `isMobileDevice` export
8399
+ * 0.1.5-rc.2 through 0.2.1-rc.5 no `isMobileDevice` export
8353
8400
  * 0.2.2-alpha.2 + `isMobileDevice` exported
8354
8401
  * ```
8355
8402
  *