[windows][less-computer][dsh] Windows 上 dsh 后端必然失败:生成的 openless.patch.yml 缩进丢失,界面只显示 Node 版本号 #1204
Copy link
Copy link
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
现象
- 触发条件:Less Computer 的 Agent 后端选
dsh,发送任意消息。 - 当前表现:对话区只显示一行红字
Node.js v24.18.1,每次必现。设置页显示"已检测到 dsh v0.2.0-rc.2",终端里dsh --version也正常。 - 环境:Windows 11、OpenLess v2.0.0-Beta.4(build 20260930)、DeepSeek Harness Desktop 自带的 dsh 0.2.0-rc.2。
beta分支当前代码里相同代码未改动。
根因
openless-core/src/coding_agent.rs 的 build_dsh_patch_yaml 用行尾 \ 续行拼接 YAML:
Ok(format!(
"# Generated by OpenLess. Applied as the last patch layer for one headless run.\n\
- insert:\n\
- id: dsh-events\n\
name: {path}\n\
- id: headless-runner\n\
config:\n\
task: {task}\n"
))Rust 字符串里行尾 \ 会吃掉下一行开头的全部空白,源码里写的缩进在运行时全部丢失,实际写入 openless.patch.yml 的内容是:
# Generated by OpenLess. Applied as the last patch layer for one headless run.
- insert:
- id: dsh-events
name: "C:\\...\\dsh-events.mjs"
- id: headless-runner
config:
task: "..."这不是合法 YAML,dsh 解析补丁时直接崩溃退出:
Error: dsh: failed to parse overlay ...\openless.patch.yml: YAMLException: end of the stream or a document separator is expected (4:1)
...
Node.js v24.18.1
界面上为什么只显示 Node.js v24.18.1
summarize_stderr 的逻辑是:先找以 dsh: 开头、或包含 error: 的行;找不到就取 stderr 最后一行。真正的报错行是 Error: dsh: failed to parse ...,以大写 Error: 开头,既不满足 starts_with("dsh:"),也不满足区分大小写的 contains("error:"),于是回退到最后一行,也就是 Node 崩溃时打印的版本号。openless.log 里也没有这次失败的任何记录,用户无从排查。
验证过程
- 用 OpenLess 同样的参数(
--profile headless --patch <file> openless-task)、环境变量(DSH_PERMISSION_MODE、DSH_EVENTS_OUT=stderr)、工作目录、提示词包装,并模拟它的 Windows 启动方式(挂起启动、Job Object、隐藏窗口、管道 stdio),在补丁文件缩进正确时 dsh 全部正常返回。 - 只有换成 OpenLess 实际生成的无缩进文件才失败,并且报错与上面完全一致。
影响
- Less Computer + dsh 后端在 Beta.4 上完全不可用,不是个别环境问题。
- 失败原因被吞掉,用户只能看到一个 Node 版本号,很容易误判成 Node 版本、PATH 或 dsh 安装问题。
建议接受标准
-
build_dsh_patch_yaml的输出缩进正确,不依赖\续行保留空白(例如用concat!逐行拼接)。 - 新增单元测试:断言生成的补丁文本逐字正确(含缩进、Windows 反斜杠路径、换行和引号)。
-
summarize_stderr对error:的匹配不区分大小写,使Error: dsh: failed to parse ...能被选中,界面不再只显示 Node 版本号。
TODO / 不确定项
- 补丁文件的生成代码在
openless-core,与平台无关,其它平台的 dsh 后端大概率同样受影响;我只在 Windows 上验证过。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working
Activity
HKLHaoBin commentedon Oct 19, 2026
@xnqycs 感谢在 #1204 / #1205 中定位并验证原因。已从当前上游
beta(ec938209)建立 fork 测试分支,采用与 #1205 一致的最小修复方向,并保留三处不含敏感内容的诊断探针,想请你验证原始 Windows 场景。测试分支:
HKLHaoBin/openless:fix/issue-1204-dsh-patch精确提交:
6eab6c7e295ca84cb0e9fa9db8c02b920d3f4062。未创建新的 PR,也未修改上游分支。测试下载与 Actions
ok。以上三个运行均对应上述精确提交。修复包含:
concat!保留 YAML 缩进、error:的 ASCII 大小写不敏感匹配、缩进和转义/错误摘要回归测试。探针只记录补丁缩进布尔值、进程结果枚举、摘要是否匹配错误行等状态,不记录提示词、路径、原始 stderr 或真实会话标识。尚未完成你的 Windows 环境中的完整桌面端实机验证,因此不把 CI/产物构建成功当作原始故障已确认消失。请你用修复版复现 bug:
0.2.0-rc.2),发送一次最小、非敏感的文字任务。Node.js v24.18.1。%LOCALAPPDATA%\OpenLess\Logs\dsh-1204-12fe622d.ndjson。请保留且不要编辑/清空该日志;若未生成,也请说明。无需上传可能含敏感信息的完整应用日志或原始 stderr。