Skip to content

Releases: dsh-wsl-workspace-maintainers/dsh-wsl-workspace

v0.7.11

Choose a tag to compare

@github-actions github-actions released this 25 Oct 06:50
3f3338d

WSL 入口终于成为 Workspace UI 的一部分,模式选择器也只展示当前工作区能用的那一族模式。

  • W 不再单独站在侧栏左下角(#114,修 #96)。 宽侧栏里,入口位于 Workspace 区块标题右侧、紧邻原生的“添加工作区”按钮;首页工作区的“添加工作区…”菜单中也新增了同一入口。折叠成轨道式侧栏时仍回退到设置旁的 W 按钮,所以所有侧栏形态都有可用入口。
  • 模式选择器一次只显示一个世界。 普通会话只列出 Standard / PTC / Minimal / Creator,WSL 会话只列出对应的 WSL · … 变体;隐藏项同时退出键盘顺序,不会出现“看不见却还能被方向键选中”的行。
  • 菜单隐藏只在预设选择器上生效。 修掉了运行时探测的一个边界:其他插件或宿主以后新增的异步菜单即使也带 _itemName 标记,也不会被本插件的预设过滤逻辑永久藏起来。对应回归已加入 test:client。
  • 首页工作区 Chip 现在可以二次点击关闭菜单。 首次点击打开,第二次点击不再触发 outside-pointerdown 后又被 Chip 的 click 重开。

本版在 DSH 0.1.5-rc.2 与 0.2.1-rc.2 的隔离实例上验证了宽侧栏、折叠侧栏、菜单入口、普通/WSL 双向模式过滤和二次点击关闭;构建、客户端、单元、node、world、contract、install、profile 与 artifact identity 门禁均通过。

v0.7.10

Choose a tag to compare

@github-actions github-actions released this 24 Oct 06:21
2cc1aa0

Desktop 会话在第六个组合上重新活过来,WSL shell 带上了脚本赖以分支的会话事实,世界也不再因 read_image 重名而拒绝挂载。 三个面向用户的修复,一个更瘦的安装包,一套会自己盯上游的构建。

  • Desktop 会话在第六个组合上创建失败已修(#60)。 上游在每个 agent/created 事件上安装 @deepseek-ai/dsh-tool-subagent 且没有组合门(上游讨论 6751),于是每个保留顶层委托行的拷贝预设都会把该工具多注册一次——到第六个组合(三个出厂预设加本插件的三个变体)时,Desktop 创建会话当场失败:tool "subagent" is already registered in this scope。WSL 变换现在为没有组合门的宿主家族剥掉这一行(当前兼容窗口内逐版本核验过不存在;读不到版本也按同方向处理——代价不对称:少一个 subagent 工具对上少一个会话)。代价写明:在上游补上门槛之前,WSL 会话没有 subagent / list_subagent_models 工具;门槛出现时谓词自动收窄,本仓无需再发版。
  • WSL shell 携带 DSH_SHELL 与 DSH_SESSION_ID(#115,社区贡献者 Bright000026)。 宿主的持久 bash 在每个子进程里设这两个变量;WSL 持久 shell 此前列了键却从未设值,按它们分支的脚本悄悄走错路。现在两者都随调用进入发行版,DSH_SHELL 已列入 WSLENV。
  • WSL 变体不再因 read_image 重名拒绝挂载(#105)。 0.2.1 起宿主工具层拒绝两行注册同名工具;dsh-tool-fs 默认注册 read_image,而本世界加的那条 realm 安全的读取才是会话内真正应答的那条——于是用一行配置关掉宿主那份,世界正常挂载。
  • 安装包只带英文与中文。 其余七种翻译 README 移到仓库 docs/translations/——保留(原作者的刻意选择),但不再随包分发:安装后的任何东西都不读它们,且自 docs-parity 闸退役后它们一直靠手工同步、无人看守。文件内所有互链已按新位置重写。
  • 维护者侧: 每帧 CI 快了约一分钟(钉版宿主树跨运行缓存、未变化时不再重装——本机实测 42 s → 0.2 s,CI 每 job 22 s → 1 s);每周上游漂移雷达盯 registry,首跑就抓到 0.2.1-rc.3 在 dist-tag 未动时已发布、且全部门禁对它绿——窗口随时可升;tag 现在只发布有绿色 checks 运行的 commit;会话 bash 的生命周期(发帧→结算、卡死命令恰好执行一次、死壳重放、abort 语义、串行化、dispose)有了离线回归测试 tests/wsl-bash-session.test.ts;重放尺子的类级得分站上 20 of 20。

v0.7.9

Choose a tag to compare

@Ruler4396 Ruler4396 released this 21 Oct 00:54
60d22bc

盘符路径的工作区终于能读到自己的技能,键盘门也能翻译那里的 Linux cwd。 两处都是静默失败:注册在 Windows 盘符路径下的 /mnt/<drive> 工作区(9P 服务不了 drvfs)技能目录恒空且无报错;wsl_terminal 则以“发行版未知”拒绝 Linux cwd,尽管对话框早已把它存了下来。技能 provider 现在按其余 provider 的方式解析这个工作区,并把 /mnt 路径按盘符拼写读取;键盘门读同一份登记。这两条是世界一致性表先发现、而不是用户先报的——本仓第一次由闸领先于报告。

  • 浏览失败不再留下残留消息。 切回一个可用发行版时,之前那句“无法浏览该目录”会盖在刚刚加载好的列表上:一个 error 字符串说不出自己装的是哪种失败,于是浏览失败由“取代它的那次成功浏览”退休——只退休这一种,预设失败、发行版列表失败是另一件事。
  • /mnt/<drive> 只有一种拼写。 C://项目//src(粘贴来的路径,或某个工具把分隔符写重了)过去会产出 /mnt/c//项目/src,同一个目录得到两个缓存键,技能扫描与工作区存储可能对“这是哪条路径”各执一词。
  • 回答“下一个问题能不能抓到”的测试。 今天早先落地的五道闸之外,本版加入 scripts/mutation-sweep.mjs:把套件从未针对过的缺陷种进去,看哪道闸注意到。它第一次运行就找到一处真缺口——glob 内联上限的边界从未被断言过——锁已补进 tests/wsl-search.test.ts。@deepseek-ai/dsh-jobs 已钉进闭包,让后台作业工具在会话探针里存在;字节断言仍需要活着的 agent,因此报告为声明式未测量,而不是通过。
  • 本版不声称修复:#78 (run_code 在 \\wsl.localhost\… 根 + workspace-write 下)保持原状:护栏会点名拒绝这个形状,给 WSL 世界一个真沙箱是产品决策,不是测试问题。

v0.7.8

Choose a tag to compare

@Ruler4396 Ruler4396 released this 20 Oct 02:55

这一版把 0.7.7 自己那份记录里已经写下的修复真正发出去。 registry 上的 0.7.7 tarball 是在那些修复落地之前构建的;#85 把它们补进了已经发布的那条记录——改的是文字,不是字节。其中两条今天从 tarball 本身就能证:dsh-wsl-workspace@0.7.7 没有 lib/wsl-image-tool.js(在 WSL 世界里应答 read_image 的那一行,#83),而它的 lib/index.js 里 PERSONA_APPEND 仍以 Your working directory {{cwd}} is inside a WSL … 结尾——正是让严格渲染器报 unknown prompt variable "{{cwd}}"(#95)的那句。本版携带的各条修复,说明就写在下面 0.7.7 那一段(#79、#81、#83、#84、#86、#87),原文不改;加这一行只是让记录与字节一致。

  • wsl-* 会话现在声明并实测针对 DSH 0.2.1-rc.2。 兼容窗口的头、dshReleases 与两份 README 一起前进,测试树所依据的宿主族钉在 0.2.1-rc.2(#92)。那个版本在这插件底下改了什么写在那条 PR 里,而不是留给运行时去发现——前台 bash 与 fs 工具套件各多了一只 workingDirectory 手——而消费方台账新增的五对,现在每一对背后都有一次真调用(#94)。

  • 不作声明:#89 (0.2.1-rc.2 上「五个 file: 行 never started」)在本包、web profile、Desktop 自带宿主三面都不复现,全部绿;在报告者答复前保持打开。

v0.7.7 — WSL 工作区的 bash 在 Desktop 0.2.x 上恢复,装到的体积减了近八成

Choose a tag to compare

@Ruler4396 Ruler4396 released this 13 Oct 01:46
38c173e

WSL 工作区里每一次 bash 调用又能用了

这一发覆盖 0.7.5 → 0.7.7 的全部改动。0.7.6 从未发布到 npm(registry 上的版本序列是 … 0.7.4、0.7.5、0.7.7),所以它没有单独的 tarball、也不该有一个自己的 tag;这一发就是它在 GitHub 上的记录。

症状(issue #51):在 DSH Desktop 0.2.x 上,一个 WSL 工作区里的每一发 bash 都失败,而 read/write/edit 照常工作——故障正好被"看起来还能用"盖住。

根因是三件事,不是三件事里的一件:0.2.x 把 shell 接缝换成了 ctx.shell.execute(spec) 再 await result(),而插件实现的是 0.1.x 的 resolve/run/start,于是常驻和一次性两条路一起断;宿主把 PS1/PROMPT_COMMAND 作为 Windows 变量注入,而 WSL 不在 WSLENV 里具名就不带进发行版,所以常驻 shell 用的是发行版默认提示符、宿主认不出它;宿主的 PTY 档判定"结束"的方式是在终端文本里找到哨兵行、并要求退出码紧跟一个换行——而交互式 Linux shell 会重绘那一行,把擦掉的格子填成空格,判定永远不成立:真机会话里同一发命令连续三次各挂 303.8 s,之后才被宿主抹掉 shell。

0.7.7 的修法:这个世界改挂载插件自己的 bash——一条长命的 bash --norc -i 走管道,命令 base64 送入、以带 per-command nonce 的 NUL 分隔记录回答,"结束"因此是字节通道上的一个事件,而不是终端文本里的模式匹配;登录环境在启动时被静默 source,history expansion 关掉(顺带关掉了 ! 那一族失败)。要键盘的程序按进程实况判定而不是按名字——/proc 状态、wchan、终端是否在他的描述符里、是否在烧 CPU;被抓到在等的命令会被停住,并在同一次调用里换进它自己的伪终端重跑(script -qec)。调用自带的 stdin 参数随同一帧送入、变成一个供命令读取的文件(上限 32 KiB,超出按名字拒绝且什么都不运行)。本机两侧构建档的实测读数(记在 CHANGELOG.md 的 0.7.7 一节):首发改约 0.5 s 含启动,之后中位 8 ms;同一行经"每次调用起一个 wsl.exe"的旧路径是 222–236 ms,人在开着的终端里手敲看到的是 16 ms。cd/export/退出码/中文/!/sed -i/tar/git commit/sudo 逐一验过,而同一行经宿主 PTY 档仍然超时——那条对照是新 bash-session-real 门禁的最后一格,所以被换掉的行为无法静默回来。旧 PTY 档用 DSH_WSL_PTY_SHELL=1 仍可开回来对照。这一档在装了本构建的 DSH Desktop 真模型里点过,那一轮抓出两枚离线门禁看不见的缺陷(宿主加载器会剥掉 exports.default,于是模块级 inject 到不了 fiber,每发都失败在 cannot get property "subprocess" without inject;会话 shell 帧的回声只以尾部到达 stderr,于是我们自己 framing 的碎片进了模型的正文),两处都已修,且各有一枚从产品自己那条通道进入的格子。

一并解决的

  • bash_background 的 job_output 在 0.2.x 永远为空(issue #56)。@deepseek-ai/dsh-jobs-local@0.2.x 只从 spec.output 这组 pull-source 填充输出环,从不读 run() 返回的 readOutput,而本插件的生产者只设了后者——任务确实跑了、stdout 也落了盘,死的是读取通道。现在两通道齐发:spec.output 里 stdout 与一只带 stderr 标签的 source 各读自己那组独立游标(与 readOutput drain 的是同一批,互不抢字节),同时保留 readOutput 给 0.1.x 注册表;spillPath 原样透传。新增一枚单元门禁复刻 0.2.x 的 drain 循环,旧生产者在其上必红。
  • 会话 shell 被 exit/quit/logout 结束的那一形(PR #68):现在答它自己的两条流并带退出码,不再把 shell 的自述丢掉。
  • WSL 会话里的文件引用(issue #49,本发只算半修):对话里的文件链接、工具行的 :行号、回合尾部的变更文件都经右栏 Sidebar 打开,而地址里是模型原样写下的 Linux 路径;宿主用 node:path.resolve(cwd, path) 解析它,POSIX 绝对路径因此是根相对的——/mnt/d/x 落到了工作区所在盘(D:\mnt\d\x),发行版内路径落到 cwd 共享根下面,而 9P 提供不了的 drvfs 挂载报 EPERM:面板报"文件不存在"。客户端这半现在在 Sidebar 看到它之前翻译地址(/mnt/<drive>/… 回 X:\…,其余走该发行版的 UNC 共享),一次改动同时修好面板正文与同一地址上的元数据读取。:行号 那一形仍报"文件不存在",本版未修。
  • bash 与宿主 bash 逐字段对齐(0.7.6 那一轮的内容):34 行日常命令的矩阵抓出四处不算 everyday-good,全修——run_in_background: true 是个被静默忽略的参数(现在委托给 bash_background 用的同一个 jobs 生产者)、相对 workdir 解析成空并落在上一次调用留下的目录(现在接在会话目录上,让 bash 自己的 cd 错误说话)、超过上限的流只留一个布尔就说丢了头部(现在溢写到文件并回 [output truncated; full output: …],与一次性路径同一句话同一目录)、重建把 detached 子进程留在世上(现在只收带自己会话令牌的那些,并留一枚必须活着的对照进程)。journal 除 cd 与导出变量外还会重放 shell 选项、shopt、alias 与函数,并分帧送入——因为 eval 先解析整串再执行任何一段,第 50 行的 shopt 救不了第 1623 行需要 extglob 才能被解析的补全函数。现在的差异是一张表,两道门禁读它:tests/wsl-bash-parity.test.ts 对装好的宿主包比契约,scripts/compatibility/bash-parity-real.mjs 在真发行版上把同一支探针经两个工具各跑一遍比字节——未声明的差异,或声明过却不再成立的差异,是红构建而不是意外(docs/bash-parity.md)。实测占用:一个会话在 Windows 侧约 9.1 MB 工作集(两个 wsl.exe),发行版内 3.4 MB,vmmem 不变,流未溢出前不写任何运行期文件。
  • 新工具 wsl_terminal:管道没法打字,所以要口令的程序(sudo、ssh 首连指纹、REPL、编辑器、TUI)原先只被诊断、停住、换一枚一次性伪终端重跑,好让模型读到程序自己的抱怨,之后仍得由人接手。现在多了一扇 agent 能打字进去的门:open 起一个交互终端、send 送字(默认回车,submit: false 只送不跑)、read 翻页读留屏、signal 送 SIGINT/SIGTERM/SIGKILL/SIGTSTP/SIGHUP(SIGINT 即 Ctrl-C)、close 结束、list 报告开着什么。它是宿主自己的 PTY 注册表与 dsh-terminal-bash 后端指向本插件的中继——和右栏终端标签同一套机构,只是把手换成了 agent。三条代价写在 README 里而不是藏着:后端的静默窗被从 3000 ms 降到 1200 ms(一次 send 若宿主认不出提示符,约 1.2–1.8 s 就返回而不是约 3.0–3.6 s)、一次 send 会说明是哪种情形而不假装安静的屏幕就是提示符、打进去的字成为会话记录的一部分所以口令仍须由用户给出。
  • "故意红"账本已清空,它记的十条债全部还清:check 不再把每一次 stat 失败折成 {exists:false}(只有 ENOENT 答"不存在",没人能读的目录与 9P 上的 EIO 一律抛出、由信封带上操作系统自己的话,issue #44 §6);NUL 分隔的 UTF-8 流(find -print0、grep -Z、git ls-files -z——本插件搜索路径自己就说这种话)不再被"有 NUL 就是 UTF-16LE"折成双倍长度的乱码,判定改成结构性的(BOM,或 NUL 出现在固定奇偶位且密度足够),已知编码的调用方直接传入即可跳过启发式;reg.exe 的 UTF-16LE 回答不再被硬编码的 UTF-8 解码成 undefined(空选择器、不抛错、不留日志),同一个模块现在只有一套解码策略;搜索路径的 stderr 改在用到文本的地方解码、300 的预算按字符切、无效模式分类器读解码后的文本;wsl.exe 的启动失败在 stderr 为空时回落到 stdout 的首个解码行,不再丢掉"是哪个发行版找不到";三处把参数列表交给命令解释器的调用点(verify-install.mjs、verify-artifact-identity.mjs、ci/install-pinned.mjs)改为按 npm_execpath → node.exe 旁边 → PATH 上的 npm 三个地方找 npm 自己的 bin/npm-cli.js,找不到就点名而不是猜(这正是 Node 如今拒绝的 DEP0190 形状,它会把带空格的路径重新分词、把 & | > < ^ % 交给解释器);install-pinned.mjs 建 junction 改用 fs.symlinkSync,错误自带 EEXIST/EPERM 而不是一个裸退出码。机制留了下来:任何未声明的新红仍然让门禁失败。
  • 装到的是插件本体,而不是仓库的一份拷贝。package.json#files 里带着 src/ 与两张 README 配图:改动前那棵树做一次全新 npm pack 是 79 个成员 / 2,757,545 B,其中 2,265,091 B(82.1%)是 30 个源文件加那 2 张图——运行期没有任何一方读它们(插件加载 lib/,读源码的那些门禁读的是仓库)。同一条命令现在是 47 个成员 / 492,454 B,两份成员清单的差别恰好就是被移除的 32 项。九份 README 的配图改成同一提交里的 raw.githubusercontent.com/…/HEAD/… 绝对地址,所以 npm 页面不依赖注册表改写相对路径也能出图。

验收(读数取自发布出去的那份字节)

项目 读数
npm 与这一发的对应关系 dist-tags.latest = 0.7.7,发布于 2026-10-12T05:58:13Z。把 registry 上那份 tarball 取回本机解开:47 个成员与 main 的 38c173e 逐字节相同(matched=47 / differ=0 / 不在 HEAD 里的 0)——所以本 tag 打在这一帧
体积,两个已发布版本实测 0.7.5 的 tarball 2,444,274 B(解压 3,206,485 B)→ 0.7.7 的 496,782 B(解压 1,520,080 B)
CI(验收面=云端帧绿) main 38c173e 的 checks 成功(run 37911370210,2026-10-09T09:27:18Z);compat-window 定时帧成功(run 38238173825,2026-10-12T10:44:06Z)
已声明版本 11 个(0.1.0-rc.7 · 0.1.0-rc.8 · 0.1.1-rc.1 · 0.1.1-rc.2 · 0.1.2-rc.1 · 0.1.3-alpha.2 · 0.1.5-rc.1 · 0.1.5-rc.2 · 0.1.7-rc.1 · 0.1.7-rc.2 · 0.2.0-rc.2),全标 compatible;DSH Desktop 0.2.0-rc.2 带的就是 0.2.0-rc.2,同在这张声明里
上线前行为矩阵的形状 npm run test:matrix 本帧自述:84 rows over 12 groups, 0 待跑 and 3 未定 still stand between this document and a release。这道闸绿不代表判决已齐——按矩阵 §0,"未定"与 DEFECT 一样挡住上线,不许被读成"已通过"
矩阵 2026-10-09 那轮(构建 = main + #68) G1 全组 8 行 MATCH;一张 32 行的批次跑了 31 行 → 27 MATCH、4 个开口、1 行产品侧按护栏 SKIPPED。原生侧同日同机、同一用户(ruler)、命令写成脚本文件后 bash <file> 逐条重测;G1 那轮里原先"未定"的 1.7 已撤销(假读数来自我的探针把复合命令交给 wsl.exe … bash -c <文本>,多一层解析把 ; 拆开,不是产品行为)
文档门禁 npm run test:docs 11 项全绿,含"CHANGELOG 双语对 17 个版本一致、最新一条 0.7.7 = package.json"与 259 条相对链接可解析

这一版没有解决的(按矩阵 §5 的规则点名,不许用"CI 绿了"代替这张表)

  • 状态列仍写"未定"的 3 行。3.6 cmd.exe /c ver、3.7 node.exe --version:会话里报 command not found;已读到会话进程自己的 PATH,它是启动它那个进程的 PATH 原样带进来的(Git-Bash 形:/mingw64/bin、/c/Users/…),HAS_SYS32=0——里面根本没有 System32 这一项,而从 Windows 侧启动的原生 shell 会把它翻译成 /mnt/c/WINDOWS/System32。所以这不是"某个窗口打不开",而是会话的 PATH 没把 Windows 路径转成发行版能用的形式。下一步二选一:在 Desktop 启动下复测(那里 PATH 是 Windows 形),或把这一行靠到"会话应当继承发行版交互 PATH"这个产品问题上。10.3 npx --yes tsc --version:给足分钟重跑后只用 1285 ms 就答了,但答的是 npx 自己的"This is not the tsc command you are looking for"——npx 把 tsc 解析成了同名的占位包,而原生登录形解析到全局安装的编译器、输出 Version 5.9.3;两侧各答各的解析结果,且上一轮 120 s 到期也因此有了解释(冷缓存的 npx 会超过工具默认的 120 s,热了以后 1.3 s,不是"会话拿不到网络")。这一行的原命令本身不确定一个答案,下一轮改成 npm exec --yes --package typescript -- tsc --version,让两侧解析同一个包。
  • 12.4 需要重发一次而不是重判:本轮把它当成命令发了(文档那一格写的是参数,不是命令),两侧都回 timeoutMs: command not found——那不是这行要测的东西。此前一次带 timeoutMs: 0 的真调用在 528 ms 正常返回 ZERO_OK_42,即被夹紧而不是静默变成 0 秒即死。4.4(写入 Windows 系统目录)产品侧按护栏没跑,只有原生侧的 touch: cannot touch '/mnt/c/Windows/system32/drivers/x': Permission denied 读数——SKIPPED 不算 MATCH。
  • #78(2026-10-10 新开,目前 0 条回复、尚无归因结论):WSL 变体的 run_code 仍走宿主 Windows ACL 沙箱,UNC 工作区根 + workspace-write 下 100% 启动失败(GetNamedSecurityInfoW failed (Win32 1))。本版未修。
  • #54:WSL 会话里 read_image 仍报 cannot get property "fs" without inject。本版未修。
  • bash 这一档是非交互 shell:要口令的 sudo 在这里答不了——约 100 ms 内失败并带上 sudo 自己的话。出路有三条:人在产品的右栏终端标签里跑一次,agent 走 wsl_terminal(口令仍须由用户给),或给会话用户在 sudoers 里 NOPASSWD、或以 DSH_WSL_USER 把会话起成 root。这扇门让这类提示可被回答,不等于已经被回答:sudoers 的授权是按命令给的,所以对刚失败的那发泛称"这个用户有 NOPASSWD"只能是猜。边界是一个 agent 一个 shell:一次 cd 决定下一发的起点(用绝对路径或显式 cd),结尾带 & 的命令在调用内部被后台化、立刻以退出码 0 返回而正文没有输出,真正的输出晚点到达(可能落到下一发的正文里);后台活请写成单独一行的 ( long-job > log 2>&1 ) &,或直接用后台任务工具。
  • 上一发 release 写过"更早的版本已标记 deprecated"。这句在今天的 registry 上不成立:0.1.0 到 0.7.5 这 18 个已发布版本的 deprecated 字段本回合逐个 npm view 查过,全空。事实只有:0.7.4 之前的版本在 DSH Desktop 上无法列出 WSL 发行版,请升级到 0.7.4 以上。

完整证据与规程在仓库里:docs/compatibility-evidence.md(逐轮追加的每版本验证据)、TESTING.md 的 Release checklist(14 步)、docs/release-behaviour-matrix.zh.md(84 行 × 12 组的判决表与取读数规程)、docs/bash-parity.md(与宿主 bash 的差异账)、docs/tty-triage.md(bash 失败的归因表:哪句症状属于管道、哪句属于伪终端、哪句属于宿主的 PTY 档)。

v0.7.5 — DSH Desktop 上的持久 shell 恢复

Choose a tag to compare

@6Mikao9 6Mikao9 released this 30 Sep 12:02
97f0e82

DSH Desktop 上的持久 shell 又能用了

DSH Desktop 的宿主进程本身就是打包后的 Electron 可执行文件、以 node 模式运行(ELECTRON_RUN_AS_NODE=1),而插件把 PTY 后端的 shellPath 指向 process.execPath、把 lib/wsl-relay.js 交给它当参数。Electron 二进制在 ConPTY 下不输出任何字节:中继的 wsl.exe 子进程继承到一条死流,中继 0 字节退出 0,后端的就绪探测永远看不到提示符,于是每一次 bash 都报 PTY shell exited during startup——而文件工具不走 PTY、照常能用,故障正好被"看起来还能用"盖住(issue #40)。

0.7.5 的修复:中继的解释器改为显式解析——先取 Desktop 传给宿主进程的 runtime payload 路径(process.argv 里的 …/resources/runtime/primary-runtime,那份 payload 里带着它自带的真 node),再退到可执行文件旁的同一路径、DSH_DESKTOP_NODE_EXECUTABLE、PATH 上的 node,最后才是 process.execPath。每个候选都要被问一次"你到底是什么"(-e 打印 process.versions.electron):只看 --version 分不出来——继承 ELECTRON_RUN_AS_NODE 时 Electron 回答的是 node 版本号,任何形如 ^v\d+\.\d+\.\d+ 的判断都会选中那个坏的。非 Electron 宿主(dsh web)直接返回 process.execPath、不启动任何探测进程,行为与 0.7.4 完全一致;Desktop 上则把选中的解释器与被拒绝的候选写进启动日志。

顺带修掉 issue #40 的第二个报错

bash_background 交给 jobs 注册表的 owner 形状不对,在 0.1.7 及以后每次都报 session "[object Object]" has no live agent。实测这条契约在 0.1.7-rc.1 变过:之前 start() 收 agent 对象本身(注册表读 owner.id 与 owner.ctx),之后收会话 id(用 agents.get(id) 解析)——宿主自己的生产者也是同时从 owner: parent 改成 owner: parent.id。现在按注册表是否提供 resolveOwner 选择该传哪种形状。

验收(都跑在发布出去的那份字节上)

项目 结果
真 DSH Desktop 上装 0.7.4 每次 bash → PTY shell exited during startup;bash_background → session "[object Object]" has no live agent
同一台桌面版装 0.7.5 bash 返回内核 / 工作区 / 用户;第二次独立 pwd 仍是 /tmp;bash_background → bash-1 running→completed、产物文件正确;刷新窗口后工作区仍能重开
11 个已声明版本(新增 0.2.0-rc.2) 每版本 16 项 harness 检查(14/16,两项是既有基线)+ 前端六项(含 F5 后重开),web.err 全 0 字节,文件在 Linux 侧独立复核
bash_background 逐个版本 11 个版本都是 bash-1 → completed → 退出码 0,产物文件 Linux 侧复核;job_kill 在新旧两侧都验过(running → killed,进程确实消失)
安装 空目录纯 npm npm install dsh-wsl-workspace@0.7.5 exit 0;11 个隔离 DSH_HOME 全部 READY
产物一致性 发布路径 tarball 与「提交的 lib/ 直接打包」SHA256 相同(8B125509821DCFD4AED06758B2AC7A5F901F73A90A5CF29161D0A6EEE3617311)

0.7.4 之前的 16 个版本仍为 deprecated(在 DSH Desktop 上无法列出 WSL 发行版),请升级到 0.7.4 或更新版本。完整证据、复现方法与桌面版模拟脚本见 docs/compatibility-evidence.md 与 TESTING.md。

感谢 @NIU-001-LIU 在 #39 中的诊断——它把方向指向了解释器。

v0.7.4 — WSL 对话框在 DSH Desktop 上恢复

Choose a tag to compare

@6Mikao9 6Mikao9 released this 28 Sep 16:55
a9b02d8

WSL 对话框在 DSH Desktop 上又能用了

DSH Desktop 会在插件加载之前包装 child_process:注入 windowsHide,再用 syncBuiltinESMExports() 回写内建模块。这份 execFile 上没有 util.promisify.custom,于是 promisify(execFile) 退回通用实现——只用回调的第一个参数 resolve——result.stdout 永远是 undefined。发行版查询去读它就抛 Cannot read properties of undefined (reading 'includes'),前端把异常吞掉、渲染出一个空的发行版列表:对话框能打开、下拉框里一个发行版都没有,工作区也创建不出来;而同一台机器上 wsl.exe -l -q 在终端里列得好好的(issues #35、#36)。

0.7.4 的修复:三处调用(列发行版 / 默认发行版 / 符号链接解析)改用 execFile 的回调形式,任何包装都改不了这个签名;wsl.exe 的查找改为候选列表(PATH → %SystemRoot%\System32\wsl.exe),失败时报出试过的每个候选及原因;新增 tests/exec-shape.mjs 复刻 Desktop 的包装形态并断言修复有效。

验收(都跑在发布出去的那份字节上)

项目 结果
同一份 Desktop 包装下的 0.7.3 listDistros → {"ok":false,…reading 'includes'},下拉为空,host-api 11/12
同一份 Desktop 包装下的 0.7.4 listDistros → ["Ubuntu","docker-desktop"],六项全过,host-api 12/12
十个已声明版本(0.1.0-rc.7 … 0.1.7-rc.2) 前端六项各跑一遍(含 F5 后重新打开工作区),web.err 全 0 字节,Linux 侧独立复核文件
安装 npm install dsh-wsl-workspace@0.7.4 与 @next 均 exit 0(空目录、纯 npm)
产物一致性 发布 tarball 的全部代码条目与兼容性矩阵跑的产物逐字节相同

0.7.4 之前的 16 个版本已标记 deprecated(在 DSH Desktop 上无法列出 WSL 发行版),请升级到 0.7.4 或更新版本。完整证据与复现方法见仓库的 docs/compatibility-evidence.md 与 TESTING.md。