前言¶
在 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):
- 持久
terminal_open({ type: "wsl" })要求会话级完全访问;默认权限下请用wsl工具(自带一次审批)。 - 审批粒度为单次命令,不会长期放行 WSL。
- Windows 沙箱策略约束不到 Linux 侧进程及
/mnt/...写入,应按完全访问语义使用。 - 持久终端 cwd 依赖 Windows 形式路径的自动翻译;
wsl工具支持 Linux 绝对路径workdir。 - 默认发行版写死在配置两处,换 Ubuntu 等需改
shellArgs与wsl工具的distro。 - 覆盖内置终端组,DSH 升级后宜用
scripts/check.mjs比对上游快照。 - 仅 Windows 启用;其它平台相关行为 disabled。
离线可在插件目录执行 npm test 做契约与补丁结构自检,无需本机 DSH/WSL;真实会话行为需在 Windows + WSL 环境手工验证。
结尾¶
dsh-terminal-wsl 的价值在于:沿用 DSH 官方终端四层栈,只增加 wsl 后端与一次性 wsl 工具,让模型在 Windows 上既有 PowerShell 又有 Linux 通路,并明确权限与失败时的行为。