@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.
- package/CHANGELOG.en.md +13 -1
- package/CHANGELOG.md +13 -1
- package/README.en.md +9 -8
- package/README.md +9 -8
- package/cordis.patch.yml +3 -2
- package/lib/auto-review.js +1 -1
- package/lib/client.js +96 -49
- package/lib/client.js.map +1 -1
- package/lib/{command-BGdz7VBH.js → command-CmLekG1M.js} +3 -2
- package/lib/command.js +1 -1
- package/lib/{compat-BiW-m_q0.js → compat-Bg2HFVMX.js} +3 -0
- package/lib/compat.js +1 -1
- package/lib/{sandbox-CXk5h-ct.js → dialects-Dr4rDR-H.js} +6 -264
- package/lib/{fs-BTXySwSG.js → fs-CfzJq2wd.js} +23 -8
- package/lib/fs.js +1 -1
- package/lib/index.js +7 -6
- package/lib/{instructions-MePoRigy.js → instructions-KsUwUFE0.js} +53 -37
- package/lib/instructions.js +1 -1
- package/lib/lsp.js +19 -16
- package/lib/native-win32-2waCRkPI.js +312 -0
- package/lib/process-fence.js +62 -12
- package/lib/protocol-4zdwV7u4.js +641 -0
- package/lib/{registry-KSsmU393.js → registry-YTUOjmVu.js} +368 -25
- package/lib/registry-operation-C2ZV3Jhw.js +116 -0
- package/lib/registry.js +3 -2
- package/lib/{review-context-AH-SXHmj.js → review-context-NDpKeMCc.js} +1 -1
- package/lib/review-context.js +1 -1
- package/lib/sandbox-C-vCJCp3.js +278 -0
- package/lib/sandbox.js +1 -1
- package/lib/scope.js +65 -9
- package/lib/skills.js +48 -29
- package/lib/types/authority/native-win32.d.ts +7 -0
- package/lib/types/authority/native.d.ts +23 -0
- package/lib/types/authority/protocol.d.ts +70 -0
- package/lib/types/compat/authority-storage.d.ts +6 -0
- package/lib/types/compat/dsh-version.d.ts +4 -4
- package/lib/types/compat/open-in-app-device.d.ts +1 -1
- package/lib/types/compat/process-entrypoints.d.ts +2 -0
- package/lib/types/compat/process-profile.d.ts +3 -0
- package/lib/types/compat/sandbox-confine.d.ts +2 -0
- package/lib/types/fs.d.ts +4 -1
- package/lib/types/instructions.d.ts +0 -47
- package/lib/types/registry-operation.d.ts +31 -0
- package/lib/types/registry.d.ts +47 -6
- package/lib/types/scope.d.ts +10 -0
- package/lib/types/skills/catalog.d.ts +3 -0
- package/lib/types/skills/pool.d.ts +1 -1
- package/lib/workspace-files.js +63 -7
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
97
|
-
dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-0.1.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
-
|
|
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.
|
|
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.
|
|
99
|
-
dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-0.1.
|
|
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.
|
|
118
|
+
建议锁定版本(如 `#v0.1.12`),让后续推送无法悄悄改变实际运行的内容:
|
|
119
119
|
|
|
120
120
|
```sh
|
|
121
|
-
dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace#v0.1.
|
|
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
|
-
-
|
|
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
|
-
#
|
|
83
|
-
#
|
|
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
|
package/lib/auto-review.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as assertAutoReviewRelease, t as MultiRootReviewContext } from "./review-context-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
1490
|
+
patch: 7
|
|
1482
1491
|
};
|
|
1483
1492
|
//#endregion
|
|
1484
|
-
//#region node_modules/.pnpm/zod@4.6.
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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.
|
|
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 &&
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
4233
|
-
const
|
|
4280
|
+
const requiredKeys = [];
|
|
4281
|
+
for (const key of Object.keys(shape)) {
|
|
4234
4282
|
const field = def.shape[key];
|
|
4235
|
-
if (ctx.io === "input"
|
|
4236
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
*
|