Skip to content

[windows][less-computer][dsh] Windows 上 dsh 后端必然失败:生成的 openless.patch.yml 缩进丢失,界面只显示 Node 版本号 #1204

Closed

Description

@xnqycs

现象

  • 触发条件: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 上验证过。

Activity

  1. HKLHaoBin commented on Oct 19, 2026

    @HKLHaoBin
    Collaborator

    @xnqycs 感谢在 #1204 / #1205 中定位并验证原因。已从当前上游 beta(ec938209)建立 fork 测试分支,采用与 #1205 一致的最小修复方向,并保留三处不含敏感内容的诊断探针,想请你验证原始 Windows 场景。

    测试分支:HKLHaoBin/openless:fix/issue-1204-dsh-patch

    精确提交:6eab6c7e295ca84cb0e9fa9db8c02b920d3f4062。未创建新的 PR,也未修改上游分支。

    测试下载与 Actions

    以上三个运行均对应上述精确提交。修复包含:concat! 保留 YAML 缩进、error: 的 ASCII 大小写不敏感匹配、缩进和转义/错误摘要回归测试。探针只记录补丁缩进布尔值、进程结果枚举、摘要是否匹配错误行等状态,不记录提示词、路径、原始 stderr 或真实会话标识。

    尚未完成你的 Windows 环境中的完整桌面端实机验证,因此不把 CI/产物构建成功当作原始故障已确认消失。请你用修复版复现 bug:

    1. 保留现有配置并安装上述 Windows 测试包,无需为了这次测试更换 Node、修改 PATH 或重装 dsh。
    2. 在 Less Computer 选择现有的 dsh 后端(原报告中的 0.2.0-rc.2),发送一次最小、非敏感的文字任务。
    3. 等待完成或报错,确认是否能正常返回;若失败,请确认界面是否显示实际错误,而不再只显示 Node.js v24.18.1。
    4. 回复测试结果,并附专用会话日志 %LOCALAPPDATA%\OpenLess\Logs\dsh-1204-12fe622d.ndjson。请保留且不要编辑/清空该日志;若未生成,也请说明。无需上传可能含敏感信息的完整应用日志或原始 stderr。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions