dsh-wsl-workspace 0.7.1 → 0.7.3

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/README.md CHANGED
@@ -43,6 +43,62 @@ Click "Create & open" to start a new session in the workspace. In the new sessio
43
43
 
44
44
  ## Changelog
45
45
 
46
+ ### 0.7.3 — 2026-09-23
47
+
48
+ - **The plugin loads on DSH `0.1.7-rc.1` again, and its modes come back.** The
49
+ `0.1.7` line renamed the host preset face — `read()` became `readDocument()`, which
50
+ returns a document (`{agentPreset, content, name, description}`) instead of the
51
+ composition text, and `AgentPreset` lost its `path` — so the variant generator
52
+ threw `agentPresets.read is not a function` on every boot and no `wsl-*` mode
53
+ ever reached the picker. The roster face is now probed by capability and both
54
+ generations are served: `readDocument()` where it exists, `read()` behind it.
55
+ - **A variant is a declaration row on that line.** `0.1.7` stopped scanning
56
+ `$DSH_HOME/.agent-presets/` — a preset there is a declarative
57
+ `@deepseek-ai/dsh-agent-preset` row, and the directory a variant used to be
58
+ written to is read by nothing at all. The generator now expands the composed
59
+ variant back into an entry list and publishes it through
60
+ `ctx.agentPresets.register()`; the plugin's effect owns the returned disposers, so
61
+ an unload or hot reload retires the variants instead of leaving orphans the next
62
+ apply could not replace (`Duplicate agent preset: wsl-<mode>`). Earlier releases
63
+ keep the directory channel, unchanged.
64
+ - **The world's own providers are named as `file:` URLs on that channel.** A preset
65
+ mounted from a declaration is imported by the registry's entry tree, which —
66
+ unlike the boot-time Include — does not turn an absolute path into a `file:` URL.
67
+ Without the rewrite the provider rows never started, the audit reported each as
68
+ `never started`, and the whole variant was refused as unusable.
69
+ - **The PTC variant is named again on `0.1.7`.** The label table that gives the
70
+ shipped modes their bilingual `WSL · …` names carried the mode's older id
71
+ (`code`) but not `ptc`, the id it has used since `0.1.1`. That stayed invisible
72
+ as long as the release published its own display name, because the lookup fell
73
+ through to it — but `0.1.7` publishes none, so the mode reached the picker as
74
+ `WSL · ptc` with the generic `WSL execution world for ptc: …` description. Both
75
+ ids are covered now, and the variant reads `WSL · PTC mode(PTC 模式)` on every
76
+ channel, like the other three shipped modes.
77
+ - `dsh.compatibility.dshReleases` declares `0.1.7-rc.1`. The two modules the
78
+ declaration channel needs (`@deepseek-ai/cordis-plugin-include`, `js-yaml`) are
79
+ resolved at call time and declared as **optional** peers, so a release that lacks
80
+ them fails one variant rather than refusing to load the plugin.
81
+
82
+ ### 0.7.2 — 2026-09-21
83
+
84
+ - **The WSL skill catalog is no longer re-walked on the request path (issue #25).**
85
+ The host rebuilds the catalog during a request and awaits each provider's
86
+ `list()`, and this provider kept its own answer for only 10 s — so every time the
87
+ catalog was re-collected (a new session or scope, or simply a lookup more than
88
+ 10 s after the last one) that request paid a full walk of the workspace, one
89
+ directory at a time: two `stat`s and one `readdir` each. A `readdir` over the
90
+ `\\wsl.localhost\…` 9P share measures 3-16 ms here and the walk's budget is 4096
91
+ directories, which is why a large workspace cost 20.4 s, on the request path. A
92
+ published catalog is now served as-is, and only the provider's own change detector
93
+ can drop it: a repeat lookup costs 1-3 ms and no filesystem traffic. The freshness
94
+ contract is unchanged — a new nested skills directory still appears within 30 s,
95
+ and an added, removed or edited skill within 3 s.
96
+ - The walk itself is cheaper: one BFS layer is probed concurrently (bounded) and
97
+ published in frontier order, so the catalog stays deterministic, and a
98
+ directory's `.dsh/skills` / `.agents/skills` are probed only when its own listing
99
+ showed that marker. The budget-sized walk went from 20.4 s to 4.8 s on the same
100
+ machine; node's filesystem thread pool caps the real parallelism.
101
+
46
102
  ### 0.7.1 — 2026-09-20
47
103
 
48
104
  - **`npm install dsh-wsl-workspace` no longer fails.** Verifying the published
package/README.zh.md CHANGED
@@ -44,6 +44,19 @@ dsh plugin --profile web add D:\path\to\dsh-wsl-workspace
44
44
 
45
45
  英文完整历史见 [README.md](README.md),本节为对应中文记录(0.4.3 及更早为摘要)。
46
46
 
47
+ ### 0.7.3 — 2026-09-23
48
+
49
+ - **插件在 DSH `0.1.7-rc.1` 上重新可加载,模式也回来了**。`0.1.7` 这条线改了宿主预设接口——`read()` 变为 `readDocument()`,返回的是文档(`{agentPreset, content, name, description}`)而不是组合文本,且 `AgentPreset` 不再有 `path`——于是变体生成器每次启动都抛 `agentPresets.read is not a function`,选择器里一个 `wsl-*` 模式都不会出现。现在改按**能力探测** roster 接口,两代都服务:有 `readDocument()` 就用它,否则回退 `read()`。
50
+ - **在这条线上,变体是一条声明行**。`0.1.7` 不再扫描 `$DSH_HOME/.agent-presets/`——那里的预设是一条声明式的 `@deepseek-ai/dsh-agent-preset` 行,而插件原先写变体的那个目录已经**没有任何代码会读**。生成器现在把组合好的变体展开回 entry list,通过 `ctx.agentPresets.register()` 发布;注销器由插件的 effect 持有,因此卸载或热重载会注销这些变体,而不是留下下一次 apply 无法替换的孤儿(`Duplicate agent preset: wsl-<mode>`)。更早的版本仍走原来的目录通道,行为不变。
51
+ - **该通道下,世界自己的提供者要以 `file:` URL 命名**。由声明挂载的预设由注册表自己的 entry tree 导入,而它——与启动期的 Include 不同——不会把绝对路径翻译成 `file:` URL。没有这层改写时那些提供者行根本不会启动,审计会逐条报 `never started`,整个变体被判为不可用而拒绝。
52
+ - **`0.1.7` 上 PTC 变体重新有名字了**。给已发布模式拼双语 `WSL · …` 名字的那张表里,PTC 这个模式只登记了旧 id(`code`),没有 `0.1.1` 起在用的 `ptc`。只要版本自己发布了显示名就看不出来——查不到会落到那个名字上——但 `0.1.7` 根本不发布显示名,于是模式以 `WSL · ptc` 和通用描述 `WSL execution world for ptc: …` 进了选择器。现在两个 id 都登记了,变体在各条通道上都显示为 `WSL · PTC mode(PTC 模式)`,与其余三个已发布模式一致。
53
+ - `dsh.compatibility.dshReleases` 增加 `0.1.7-rc.1`。声明通道需要的两个模块(`@deepseek-ai/cordis-plugin-include`、`js-yaml`)在调用时动态解析,并声明为**可选**同伴依赖:万一某个版本没有它们,只让一个变体失败,而不是让整个插件无法加载。
54
+
55
+ ### 0.7.2 — 2026-09-21
56
+
57
+ - **WSL 技能目录不再在请求路径上重走(issue #25)**。宿主会在请求期间重建技能目录并等待每个 provider 的 `list()`,而本插件只把答案保留 10 秒——于是每次重新收集(新会话、新作用域,或距上次查询超过 10 秒)都会让那个请求付一次整棵工作区的走查,而且是逐个目录:每目录两次 `stat` 加一次 `readdir`。本机 `\\wsl.localhost\…` 9P 共享的单次 `readdir` 实测 3~16 毫秒,走查预算固定 4096 个目录,所以大工作区那次走查是 20.4 秒、并且付在请求路径上。现在已发布的目录直接照原样返回,只有插件自己的变更探针能丢弃它:重复查找 1~3 毫秒、完全不碰文件系统。新鲜度契约不变——新增的嵌套技能目录仍在 30 秒内出现,新增、删除或改写技能仍在 3 秒内生效。
58
+ - 走查本身也变便宜了:BFS 同一层并发探测(有上限)、按 frontier 顺序发布以保证目录顺序确定,且只在目录自身的清单里出现 `.dsh` / `.agents` 时才探测对应 `skills`。同机实测命中预算的走查从 20.4 秒降到 4.8 秒;真正的并行度由 node 的文件系统线程池决定。
59
+
47
60
  ### 0.7.1 — 2026-09-20
48
61
 
49
62
  - **`npm install dsh-wsl-workspace` 不再失败**。校验已发布产物时发现了这次发布自己引入的回归:npm 会自动安装缺失的同伴依赖,而 0.6.0 新加的 `@deepseek-ai/dsh-tool-fs-search` 同伴自己又依赖 `@deepseek-ai/dsh-retention`,后者**并未公开发布**——于是纯 `npm install` 直接以 `E404 … @deepseek-ai/dsh-retention` 失败(0.4.3 装得没问题,所以是我们引入的)。`dsh plugin add` 走 pnpm,对未满足的同伴依赖**只警告**,这正是所有门禁与真实安装都没抓到的原因。十个宿主同伴依赖现在都在 `peerDependenciesMeta` 里标为 optional:包仍然声明宿主必须提供什么,但 npm 不再尝试去下载它们。
package/TESTING.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Testing
2
2
 
3
- This document describes how to verify `dsh-wsl-workspace` after a change or before a release. The suite covers unit tests, the preset-materialization integration test, a real-WSL smoke test, and a post-build lib verification gate.
3
+ This document describes how to verify `dsh-wsl-workspace` after a change or before a release. The suite covers unit tests, the two preset-channel integration tests (the retired directory generation and the declaration generation), a real-WSL smoke test, and a post-build lib verification gate.
4
4
 
5
5
  ## Prerequisites
6
6
 
@@ -39,7 +39,19 @@ Boots the host plugin's `apply()` against a fake context with `DSH_HOME` pointed
39
39
  node tests/host-materialize.mjs
40
40
  ```
41
41
 
42
- This covers variant generation, opaque source-directory mirroring (third-party assets travel with the variant), atomic publication (a failed regeneration preserves the previous complete variant), stale-variant cleanup, and legacy `wsl` preset removal.
42
+ This covers variant generation, opaque source-directory mirroring (third-party assets travel with the variant), atomic publication (a failed regeneration preserves the previous complete variant), stale-variant cleanup, and legacy `wsl` preset removal. Its fake roster face is the **directory generation** (`list()` reporting a `path`, `read()` returning text), i.e. the channel every release up to `0.1.5-rc.2` uses.
43
+
44
+ ## Preset declaration integration test
45
+
46
+ Boots the same `apply()` against the **declaration generation** of the roster face — `list()` reporting metadata without a directory, `readDocument()` returning a composition document, `register()` publishing a declaration — which is the channel `0.1.7-alpha.1` and later use, because that line stopped scanning `$DSH_HOME/.agent-presets/`:
47
+
48
+ ```powershell
49
+ node tests/host-declare.mjs
50
+ ```
51
+
52
+ This covers the capability switch, one declaration per healthy source (broken sources and existing `wsl-*` presets skipped), display name/description/order taken from the roster face rather than a `preset.yml`, the declaration's row list being an importable entry list (the world group, its isolating realm, the `!!js` disabled expression that must round-trip as an expression node, config values such as the relay and interpreter paths that must *not* become `file:` URLs), the world's own providers named as `file:` URLs pointing at real built files, that the retired root is neither written nor left holding stale leftovers, and that disposing the plugin retires every declaration it published.
53
+
54
+ Run both before a release: the two files are the two halves of the same generator, and a change to either channel must not silently break the other.
43
55
 
44
56
  ## Real-WSL smoke test
45
57
 
@@ -87,7 +99,7 @@ The WSL skill provider publishes `.dsh/skills` / `.agents/skills` from nested pr
87
99
  node scripts/repro-e2e.mjs
88
100
  ```
89
101
 
90
- The script hardcodes `\\wsl.localhost\Ubuntu\home\mille\repro-ws-root`; adjust the two paths at the top when running as another user or distro.
102
+ The script hardcodes `\\wsl.localhost\<distro>\home\<user>\repro-ws-root`; adjust the two paths at the top when running as another user or distro.
91
103
  3. In the running harness, open a session on the repro workspace and ask the agent to load the nested skills (`brainstorming`, `systematic-debugging`, `writing-plans`) through its skill tool — each must load with the `wsl-workspace` provider attribution, and no duplicate entries may appear. In a non-WSL workspace session the same skills must be "unknown".
92
104
  4. Clean-install check (simulates another user): `npm pack`, `npm install <tarball>` in an empty temp project (peers must resolve), then `dsh plugin --profile web add <extracted tarball dir>`, restart `dsh web`, and repeat the end-to-end checks below plus the nested-skill probe above.
93
105
 
@@ -106,12 +118,15 @@ After installing the plugin into a profile and restarting `dsh web`:
106
118
 
107
119
  1. `pnpm build` — clears `lib/`, rebuilds it, and runs the verification gate.
108
120
  2. `node --experimental-strip-types --test tests/*.test.ts` — all green (locales, variants, paths, shell, fs execution context, fs policy, wsl skills, wsl search).
109
- 3. `node tests/host-materialize.mjs` — all assertions pass.
110
- 4. `node --experimental-strip-types tests/smoke.ts` — real-WSL round-trip passes.
111
- 5. `node scripts/check-rank-parity.mjs` — host rank constants still match our copies.
112
- 6. `node scripts/repro-e2e.mjs` (after `scripts/repro-setup.sh`) — nested skill-catalog assertions pass.
113
- 7. `npm pack --dry-run` — confirm the tarball carries only live `lib/` chunks, `src/`, `cordis.patch.yml`, READMEs, `LICENSE`, and `NOTICE`.
114
- 8. Install the tarball into a clean profile (`dsh plugin --profile web add <tarball>`), restart `dsh web`, and run the end-to-end checks above plus the nested-skill probe. When the compatibility manifest changes, also run `scripts/verify-dsh-compat.sh` for every declared release.
121
+ 3. `node tests/host-materialize.mjs` — all assertions pass (the directory channel).
122
+ 4. `node tests/host-declare.mjs` — all assertions pass (the declaration channel).
123
+ 5. `node --experimental-strip-types tests/smoke.ts` — real-WSL round-trip passes.
124
+ 6. `node scripts/check-rank-parity.mjs` — host rank constants still match our copies.
125
+ 7. `node scripts/repro-e2e.mjs` (after `scripts/repro-setup.sh`) — nested skill-catalog assertions pass.
126
+ 8. `npm pack --dry-run` — confirm the tarball carries only live `lib/` chunks, `src/`, `cordis.patch.yml`, READMEs, `LICENSE`, and `NOTICE`.
127
+ 9. `npm run verify:install` — packs the tree and installs the tarball with **plain npm** into a scratch directory, with no pnpm and no host packages present. This is the gate that would have caught 0.7.0, whose `peerDependencies` made npm auto-install an unpublished package (`E404 @deepseek-ai/dsh-retention`): every other check and every real session goes through `dsh plugin add` (pnpm), which only *warns* about unmet peers and installs anyway. `prepublishOnly` runs it, so `npm publish` now refuses to ship a package that npm users cannot install.
128
+ 10. Install the tarball into a clean profile (`dsh plugin --profile web add <tarball>`), restart `dsh web`, and run the end-to-end checks above plus the nested-skill probe. When the compatibility manifest changes, also run `scripts/verify-dsh-compat.sh` for every declared release.
129
+ 11. For a release, install the *published* version by name into one isolated case per declared release and confirm each boots (the launcher only reports ready once the plugin's API route answers) — the check that proves the artifact on the registry, not just the local tree.
115
130
 
116
131
  ### The multi-release check harness
117
132
 
package/lib/client.js CHANGED
@@ -1136,8 +1136,8 @@ const zh = {
1136
1136
  "help.compat.versionLabel": "插件版本",
1137
1137
  "help.compat.unknown": "未能读取版本与兼容声明(宿主端没有响应)",
1138
1138
  "help.compat.body": "上方是这份构建声明兼容的 DSH 版本,每一条都在隔离实例上实测过(独立 DSH_HOME、依赖固定到该版本、跑满十项门禁)。\n插件在运行时自动识别 DSH 版本并选用对应的 API;两边都不支持时会明确报错,而不是留下一个空工作区。\n版本不在列表里通常仍然可用,但未经验证。",
1139
- "help.news.title": "本次更新(0.7.1)",
1140
- "help.news.body": "修掉了 npm 安装失败:npm 会自动安装缺失的同伴依赖,而 @deepseek-ai/dsh-tool-fs-search 自己又依赖并未公开发布的 @deepseek-ai/dsh-retention,于是 npm install dsh-wsl-workspace 直接 E404 失败(dsh plugin 走 pnpm、只警告,所以一直没暴露)。\n十个宿主同伴依赖现在都标为 optional:包仍声明宿主必须提供什么,但 npm 不再尝试下载它们。\nWSL 世界现在在会话能察觉到的每一处都与宿主一致:Linux 符号链接、会话的访问模式、发行版内的 grep / glob、实时技能目录、有状态的 shell,以及可跟踪的后台任务。\n新增 bash_background:持久 shell 的 schema 只有 command,没有生产者时 job_list 永远说\"没有后台任务\",而传给 bash 的 run_in_background 会被静默忽略;现在后台任务可跟踪,job_output 增量读取、job_kill 取消都照常工作。\nbash 的工具描述写明两件宿主没说的事:cd / export 跨调用保留,命令以 & 结尾会把整条命令后台化(请写成单独一行的 ( 长任务 > log 2>&1 ) &)。0.1.0-rc.7 的宿主缺少 Windows 进程检查器、持久 shell 起不来,插件会在启动时探测并回退到一次性 bash,不再让每次调用都报错。",
1139
+ "help.news.title": "本次更新(0.7.3)",
1140
+ "help.news.body": "插件在 DSH 0.1.7 上重新可加载、模式也回来了:那条线把预设平面改成了声明式的 @deepseek-ai/dsh-agent-preset 行,read() 变成 readDocument()、AgentPreset 不再有 path,于是变体生成器每次启动都抛 agentPresets.read is not a function,选择器里一个 wsl-* 模式都不会出现。现在按能力探测两代接口,两代都服务。\n在 0.1.7 上变体改为通过 ctx.agentPresets.register() 发布成一条声明;注销器由插件的 effect 持有,卸载或热重载会注销这些变体,而不是留下下一次 apply 无法替换的孤儿。更早的版本仍走原来的目录通道,行为不变。\n该通道下世界自己的 provider 行必须以 file: URL 命名:由声明挂载的预设由注册表自己的 entry tree 导入,它不会像启动期的 Include 那样把绝对路径翻译成 file: URL,否则那些行根本不会启动、整个变体被判为不可用而拒绝。relay 与解释器这类配置值仍保持原生路径。\n修掉了 PTC 变体的显示名:标签表里只登记了旧 id code,而 0.1.7 不发布显示名,于是模式显示为 WSL · ptc、描述也退化成 WSL execution world for ptc: …;现在两条通道都显示为 WSL · PTC mode(PTC 模式)。\n兼容性清单增加 0.1.7-rc.1;声明通道需要的两个模块(@deepseek-ai/cordis-plugin-include、js-yaml)在调用时解析,并声明为可选同伴依赖。",
1141
1141
  "help.usage.title": "用法与特性",
1142
1142
  "help.usage.body": "点击侧边栏底部的 W 按钮 → 选发行版 → 输入或浏览 Linux 路径 → 检查 → 创建并打开。\n创建出的会话里,bash 与文件工具都落在该发行版内,模型看到的路径全是 Linux 路径;Windows 盘可从会话内通过 /mnt/<盘符> 访问。\n四种模式(标准 / PTC / 极简 / 创造)各有 WSL 变体,在模式选择器里直接选即可,名字形如 WSL · Standard mode(标准模式)。\n用户名可选,等价于 wsl.exe -u <用户名>,只改变 bash 与 persistent-bash 的运行身份;文件工具走 Windows 侧共享,不受它影响。\n技能目录从会话 cwd 最近的 .git 祖先开始向下扫描 .dsh/skills 与 .agents/skills(含嵌套项目),上限 4 层目录 / 64 个技能目录 / 4096 个已访问目录,并按扫描根缓存 10 秒。9P 解不开的符号链接交给发行版 readlink 解析出真实路径(每次查找最多 32 条)后继续扫描,链接进来的项目与它下面的嵌套项目都能扫到。\n目录不再冻结:对 UNC 关闭文件监视之后,插件每 3 秒重查一次已发布的技能目录、并比对每个技能文件的修改时间与大小,所以新增、删除与改写都会在下一个回合生效;完整重新发现每 30 秒一次,用于找到此前不存在的技能目录(技能正文始终实时读取)。\n文件搜索由发行版内的 grep / glob 提供,源预设没有这两个工具的模式(极简)不会多出来:grep 用 GNU grep -E(\\d、\\w、(?i) 可用,环视与反向引用不支持),跳过隐藏项与 node_modules,不读 .gitignore;glob 用 GNU find 列文件、按 gitignore 风格匹配(* 不跨目录、** 跨、{a,b}、前导 ! 取反),按修改时间从旧到新排序。\n文件工具在链接处按真实路径工作,并按真实路径判策略:链接指向工作区外就等于工作区外。\nbash 由 PTY 承载的持久 shell 提供:登录环境、起始目录就是会话工作区,cd / export / venv / 后台任务跨调用保留(它取代了原先一次性 bash)。\n需要可跟踪的后台任务时用 bash_background:它立刻返回 job id,job_list / job_output(增量读取)/ job_kill 都作用于它;bash 本身没有 run_in_background 参数,传了会被忽略。job id 只在本次 DSH 进程内唯一,重启后会重新编号,引用前先用 job_list 确认。\nbash 与文件工具的 shell 都在发行版内运行、不受 DSH 文件策略约束;文件工具(read/write/edit)受策略约束,工作区内修改模式下只能写工作区内。",
1143
1143
  "help.known.title": "已知问题",
@@ -1180,8 +1180,8 @@ const en = {
1180
1180
  "help.compat.versionLabel": "Plugin version",
1181
1181
  "help.compat.unknown": "Version and compatibility declaration unavailable (the host side did not answer)",
1182
1182
  "help.compat.body": "The chips above are the DSH releases this build declares, each verified on an isolated instance (own DSH_HOME, dependencies pinned to that release, full check suite).\nThe plugin detects the DSH generation at runtime and picks the matching API; a release exposing neither fails loudly instead of leaving an empty workspace.\nA release outside the list usually still works, but is unverified.",
1183
- "help.news.title": "What's new in 0.7.1",
1184
- "help.news.body": "Fixed a failed npm install: npm auto-installs missing peers, and @deepseek-ai/dsh-tool-fs-search peers on @deepseek-ai/dsh-retention, which is not published - so npm install dsh-wsl-workspace died with E404.\nThe ten host peer dependencies are now marked optional, so npm leaves them to the host (dsh plugin add uses pnpm and only warned, which is why this stayed hidden).\nThe WSL world now matches the host everywhere a session can tell the difference: Linux symlinks, the session's access mode, in-distribution grep / glob, a live skill catalog, a stateful shell, and tracked background jobs.\nNew: bash_background. The persistent shell takes `command` only, so without a producer job_list always answered \"no background jobs\" and a run_in_background argument passed to bash was silently ignored; background work is now tracked, with incremental job_output reads and job_kill.\nThe bash tool description now states two things the host does not: cd / exports carry into the next call, and a command ending in & backgrounds the whole command - background the subshell instead, as ( long-job > log 2>&1 ) &.\n0.1.0-rc.7 lacks the Windows process inspector the persistent shell needs, so the plugin probes for it and falls back to a one-shot bash instead of failing every call.",
1183
+ "help.news.title": "What's new in 0.7.3",
1184
+ "help.news.body": "The plugin loads on DSH 0.1.7 again, and its modes come back: that line turned the preset plane into declarative @deepseek-ai/dsh-agent-preset rows, renamed read() to readDocument() and dropped AgentPreset.path.\nThe variant generator therefore threw agentPresets.read is not a function on every boot and no wsl-* mode reached the picker; both roster generations are now probed by capability.\nOn 0.1.7 a variant is published as a declaration through ctx.agentPresets.register(); the effect installed by the plugin owns the returned disposers, so an unload or hot reload retires the variants instead of leaving orphans the next apply could not replace.\nEarlier releases keep the directory channel, unchanged.\nOn that channel the provider rows of the world must be named as file: URLs: a preset mounted from a declaration is imported by the entry tree of the registry, which does not translate an absolute path the way the boot-time Include does.\nWithout that rewrite those rows never started and the whole variant was refused as unusable. Config values such as the relay and the interpreter stay native paths.\nThe PTC variant is named again: the label table carried only the older id code, and 0.1.7 publishes no display name, so the mode read WSL · ptc with the generic description WSL execution world for ptc: …; both channels now show WSL · PTC mode(PTC 模式).\nThe compatibility manifest adds 0.1.7-rc.1, and the two modules the declaration channel needs (@deepseek-ai/cordis-plugin-include, js-yaml) are resolved at call time and declared as optional peers.",
1185
1185
  "help.usage.title": "Usage and features",
1186
1186
  "help.usage.body": "Click the W button at the sidebar foot, pick a distribution, type or browse to a Linux path, press Check, then Create & open.\nIn that session the bash tool and the file tools run inside the distribution, so every path the model sees is a Linux path; Windows drives stay reachable as /mnt/<drive>.\nEach mode (Standard / PTC / Minimal / Creator) has a WSL variant in the mode picker, named like WSL · Standard mode.\nThe optional username behaves like wsl.exe -u <user> for bash and persistent-bash; the file tools go through the Windows-side share and are unaffected.\nThe skill catalog is discovered from the nearest .git ancestor of the session cwd downwards (.dsh/skills and .agents/skills, nested projects included), bounded to 4 levels / 64 skill directories / 4096 visited directories, and cached per scan root for 10 seconds.\nA link the share cannot follow is resolved through the distribution (wsl.exe readlink, at most 32 per lookup) and the scan continues at the real path, so a linked-in project and its own nested projects are found too.\nThe catalog is not frozen: published skills directories are re-checked every 3 seconds (skill file mtime + size), so an add, remove or edit appears on the next turn; a 30-second walk finds a skills directory that did not exist before.\nFile search comes from grep / glob inside the distribution, and a mode that mounts no search suite (Minimal) gains none. grep is GNU grep -E (no lookaround or backreferences), skips hidden entries and node_modules, and does not read .gitignore; glob matches gitignore-style patterns here, oldest first.\nThe file tools work at the resolved real path of a link, and the policy is judged there too: a link out of the workspace is an outside write.\n`bash` is a PTY-backed stateful shell: login environment, starting directory the session workspace, and cd / exports / background jobs survive between calls.\nFor a tracked background job use bash_background: it returns a job id immediately, and job_list / job_output (incremental) / job_kill act on it.\n`bash` itself has no run_in_background parameter and ignores one; job ids are unique within this DSH process, so confirm with job_list before acting on one.\nBoth it and the file tools' shell run inside the distribution, outside the DSH file policy; read/write/edit are inside it, and workspace-write only writes inside the workspace.",
1187
1187
  "help.known.title": "Known issues",