Repository navigation
Releases: dsh-wsl-workspace-maintainers/dsh-wsl-workspace
Release list
v0.7.11
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
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
盘符路径的工作区终于能读到自己的技能,键盘门也能翻译那里的 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
这一版把 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 上恢复,装到的体积减了近八成
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 各读自己那组独立游标(与readOutputdrain 的是同一批,互不抢字节),同时保留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.7node.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.3npx --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 恢复
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 上恢复
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。