dsh-terminal-wsl:在 DSH 上注册 WSL 持久终端后端

前言

在 Windows 上使用 DeepSeek Harness(DSH)时,内置终端栈默认走 shell 后端(PowerShell)。智能体若要执行 Linux 命令、使用 POSIX 环境与发行版内的工具链,需要把交互式会话或单条命令落到 WSL,而不是在 PowerShell 里绕引号。下面介绍社区插件 dsh-terminal-wsl:在不复制官方终端实现的前提下,为已内置的 terminal_* 工具增加 wsl 类型,并附带一次性 wsl 工具,便于在默认权限下执行单条 Linux 命令。

这是什么

  • 名称:dsh-terminal-wsl(npm 包名与 bundle 名一致)
  • 维护者:kx2398
  • 分类:客户端
  • 版本(资料中 package.json):0.2.0;要求 DSH >=0.2.2-rc.1 <0.3.0
  • 许可证:MIT

插件定位是:在 DSH 随附的 terminal-tool 栈上注册 wsl 终端后端。它复用 @deepseek-ai/dsh-terminal、dsh-terminal-bash、dsh-tool-terminal 与实验性终端 bundle,只改隔离组内的启动命令(wsl.exe),并与内置 shell(pwsh)后端并存;terminal_open({ type: "wsl" }) 即切换到发行版内的交互式 bash。

核心功能

持久 WSL 终端

在同一 isolate: { terminals: true } 组内再注册一个 dsh-terminal-bash 实例,将 shell 换为 C:\Windows\System32\wsl.exe,后端类型为 wsl。terminal_open、terminal_send、terminal_read、terminal_signal、terminal_close、terminal_list 等行为与官方后端一致,包括输出上限、就绪检测、所有者隔离与进程树清理。Windows 工作目录会映射为 /mnt/<盘符>/...;支持 SIGINT、行缓冲等。

一次性 wsl 工具

除 terminal_* 外,插件注册工具 wsl:以 argv 方式执行 wsl.exe -d <distro> -- bash -lc <base64 命令>,命令经 base64 交给 bash,避免 PowerShell 引号解析。在会话不是 danger-full-access 时,首次调用会通过 ctx.approval 发起一次针对该命令的权限申请(allowed-once);被拒绝则明确报错,并提示勿改用 PowerShell 绕路。

提示词与配置 bundle

index.js 向模型说明存在 wsl 类型、POSIX 环境与 cwd 映射。安装后 plugin_manager list_bundles 中应看到 bundle dsh-terminal-wsl(enabled/installed),rows 含 terminal-wsl-guidance,overrides 含 optional-persistent-terminals。安装、修改或卸载会重新组合终端组,已打开的终端会话会被关闭。

安装与启用

从 GitHub 按 tag 安装(命令来自项目 README):

plugin_manager({ action: "install_bundle", target: "github:kx2398/dsh-terminal-wsl#v0.2.0" })

也可下载 Release 中的 tgz 后本地安装:

plugin_manager({ action: "install_bundle", target: "file:<path-to>/dsh-terminal-wsl-0.2.0.tgz" })

开发时可用本地目录 link 安装:

plugin_manager({ action: "install_bundle", target: "<path-to>/dsh-terminal-wsl" })

插件在 DSH 进程权限下运行;安装前宜查看仓库源码与 MIT 许可证。社区目录 skillhub.cn 与 GitHub 为独立信息来源,与 DeepSeek / 幻方无官方从属关系。

配置要点

修改 cordis.patch.yml 中 optional-terminal-wsl 与 terminal-wsl-tool 相关项。默认目标发行版为 kali-linux,可用 wsl.exe -l -v 查看本机名称。

位置 默认 说明
shellArgs[1] kali-linux 持久终端的 -d 发行版
timeoutMs 60000 单次 terminal_send 等待上限
terminal-wsl-tool 的 config.distro kali-linux 与上面 -d 保持一致
terminal-wsl-tool 的 config.timeoutMs 120000 单条 wsl 命令默认超时

改配置后重载 bundle:

plugin_manager({ action: "set_bundle", target: "dsh-terminal-wsl", enabled: false })
plugin_manager({ action: "set_bundle", target: "dsh-terminal-wsl", enabled: true })

卸载:

plugin_manager({ action: "remove_bundle", target: "dsh-terminal-wsl" })

典型用法

持久交互式会话

会话需处于 danger-full-access 才能成功 terminal_open 持久 WSL(workspace-write 下 ConPTY 命名管道会被拦)。打开并探测环境:

terminal_open({ type: "wsl", name: "linux" })
terminal_send({ sessionId: "pty-6", text: "uname -srm; id -un; pwd; echo \"$TERM $PAGER\"" })

期望输出形态类似:Linux 内核信息、Linux 用户名、/mnt/c/... 工作区路径,以及 dumb cat(TERM / PAGER)。可继续验证 cd / export 跨 terminal_send 保持状态,以及 terminal_signal 发送 SIGINT 后会话仍存活,最后 terminal_close。

单条 Linux 命令

wsl({ command: "uname -srm; pwd" })
wsl({ command: "apt list --installed | head", workdir: "/tmp" })

workdir 为 Linux 绝对路径时在发行版内 cd。在 workspace-write 下首次调用会弹出权限申请,批准后执行。

适用场景与注意

适合:在 Windows 主机上跑 DSH,需要智能体长期在 WSL bash 里工作,或偶尔执行一条 Linux 命令且不愿退回 PowerShell。

限制(摘自 README):

  1. 持久 terminal_open({ type: "wsl" }) 要求会话级完全访问;默认权限下请用 wsl 工具(自带一次审批)。
  2. 审批粒度为单次命令,不会长期放行 WSL。
  3. Windows 沙箱策略约束不到 Linux 侧进程及 /mnt/... 写入,应按完全访问语义使用。
  4. 持久终端 cwd 依赖 Windows 形式路径的自动翻译;wsl 工具支持 Linux 绝对路径 workdir。
  5. 默认发行版写死在配置两处,换 Ubuntu 等需改 shellArgs 与 wsl 工具的 distro。
  6. 覆盖内置终端组,DSH 升级后宜用 scripts/check.mjs 比对上游快照。
  7. 仅 Windows 启用;其它平台相关行为 disabled。

离线可在插件目录执行 npm test 做契约与补丁结构自检,无需本机 DSH/WSL;真实会话行为需在 Windows + WSL 环境手工验证。

结尾

dsh-terminal-wsl 的价值在于:沿用 DSH 官方终端四层栈,只增加 wsl 后端与一次性 wsl 工具,让模型在 Windows 上既有 PowerShell 又有 Linux 通路,并明确权限与失败时的行为。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜