dsh-weknora
Tencent/WeKnora把 WeKnora 知识库接入 dsh 的四个只读工具:列出知识库、混合检索原文片段、按顺序还原单篇文档,以及直接取用 WeKnora 自己带引用的 RAG 或 ReAct agent 回答(含可续聊的 session id)。
让 bash 工具在本机设置里选定的 shell(Niubash、Git Bash、MSYS2、Cygwin 或 PATH 上的 bash.exe)中执行命令,不再改写为 PowerShell,并在 Windows 下隐藏 pwsh 工具。
English | 简体中文
给 DeepSeek Harness(DSH)加一个 `bash` 工具和一个 设置 → Shell 选择器 页面:bash 命令直接在本机真实存在的 shell(Niubash / Git Bash / MSYS2 / Cygwin / PATH 里的 bash.exe)里执行,不再被改写成 PowerShell 命令。
Windows 下还会隐藏官方 pwsh 工具,让 bash 成为唯一的 shell 工具。
之前:模型想跑 ls → 必须写成 Get-ChildItem(pwsh 工具),或依赖 dsh-ops 自带的 MSYS bash(沙箱里经常起不来)
之后:模型跑 ls → 直接在 Niubash bash 5.3 里执行,输出、退出码、后台任务、spill 与官方 bash 工具完全一致Windows 上的 DSH 默认有两条 shell 路径:
NtSetInformationToken / CreateFileMapping ... Win32 error 5),ops_bash 往往直接不可用。同时,Windows 上装了 Niubash、Git Bash、MSYS2 的用户,这些 bash 明明能正常跑(实测 Niubash 的 bash.exe 在 DSH 受限令牌下工作正常),但 DSH 并没有「选择本机 shell」的能力。
本插件补上这一层:检测本机所有 shell → 在设置页选一个 → 官方 `bash` 工具就用它执行。
@deepseek-ai/dsh-tool-bash 与 @deepseek-ai/dsh-bash-sandbox,只把执行文件换成你选的 shell。因此后台任务(run_in_background)、超时、输出 spill、沙箱升级、[exit code: N] 标记等行为与官方完全一致。pwsh 工具无法卸载,但只要本插件启用,就对每个 Agent 加作用域级屏蔽,bash 成为唯一 shell 工具;停用插件即恢复。ctx.shell 执行器,pwsh 执行器行原样保留;其他预设工具(文件、搜索、子代理等)不受影响。ctx.sandboxPolicy 执行,插件不提供任何绕过。项目 · 要求 操作系统 · Windows 10/11(主要目标;非 Windows 会退化为不过滤 pwsh,检测逻辑也面向 Windows) DSH · 0.2.1-rc.2 及以上(开发验证于 0.2.1-rc.2) 本机 shell · 至少一个 bash 兼容 shell:Niubash、Git Bash、MSYS2、Cygwin,或 PATH 上的 bash.exe Node · 由 DSH 自带,无需单独安装
plugin_manager install_bundle target = <本仓库的绝对路径>例如在 DSH 的 Agent 会话里:
install_bundle: /path/to/dsh-shell-switch安装后 profile 的 dsh.profile.bundles 会增加 dsh-shell-switch,node_modules/dsh-shell-switch 指向该目录(link),行 id 为 shell-switch。
git clone https://github.com/tianxingdao/dsh-shell-switch.git然后把克隆出来的目录作为 target,按方式一安装。
bash;pwsh 不再出现在工具列表。客户端页面在 Harness 启动时注册。安装后若设置页未出现,先刷新页面;仍未出现则重启一次 DSH。
bash 工具bash: {
command: "git status --short && npm test",
workdir: "<项目目录>", // 可选,默认会话工作目录
timeoutMs: 120000 // 可选,受配置上限约束
}cd / 变量 / 函数不跨调用保留;[exit code: N]、[killed by signal] 或 [timeout after N ms];run_in_background(配合 job_output / job_kill)。winuxsh.exe,禁用并标注原因);5.3.0)与完整路径;%DSH_HOME%\shell-switch.json,下一条命令生效;shell / shellPath / 自动检测;pwsh(Windows)本插件启用期间,Windows 下每个 Agent 的工具列表都会去掉 pwsh。这不是改组合、也不是卸载官方插件,而是在 Agent 作用域上加一条 deny 过滤,随插件卸载释放。
Agent 创建
└─ agent.ctx.isolate('shell') 每个 Agent 一个独立 shell 作用域
├─ ShellSwitchExecutor 继承官方 SandboxBashExecutor
│ ├─ confine(cmd) → ctx.sandbox.confine([<选中 shell>, '-c', cmd], policy)
│ └─ execute() → danger-full-access 时走 executeArgv
└─ @deepseek-ai/dsh-tool-bash 官方工具,注册进该 Agent 的 tools 层几个关键点:
agent/created,并为已存在的 Agent 补挂。ctx.shell 是单例服务,替换它会连带破坏 pwsh 工具。这里改为在隔离作用域里提供自己的 shell,只有挂载的官方 bash 工具能看到它。import '@deepseek-ai/dsh-*'。插件以宿主进程入口(process.argv[1])为锚点 createRequire,再 import() 官方包的真实路径;解析失败时可用 DSH_INSTALL 指定安装根目录。%DSH_HOME%\shell-switch.json(按 mtime 缓存),执行器每次 resolve() 重新解析,所以保存后下一条命令就换 shell。.
├─ index.js Host 半:shell 检测、执行器、按 Agent 挂载、pwsh 屏蔽、设置 API
├─ client.js Client 半:设置 → Shell 选择器(slot settings.section)
├─ cordis.patch.yml bundle 补丁,只插入一行 shell-switch
├─ locale/ 插件清单里的标题与描述(zh / en)
├─ icon.svg 插件图标
├─ package.json bundle 清单(dsh.bundle.patch + dsh.client)
├─ README.md 中文说明
└─ README.en.md 英文说明profile patch 中的 shell-switch 行:
- id: shell-switch
name: dsh-shell-switch
config:
shell: auto字段 · 默认 · 说明 shell · auto · 预设 shell id:niubash、git-bash、msys2、cygwin、bash、wsl 等;auto 取第一个 bash 兼容项 shellPath · 空 · 显式可执行文件路径,优先于 shell timeoutMs · 120000 · 前台命令默认超时 maxTimeoutMs · 600000 · 单次 timeoutMs 上限 maxOutputBytes · 64000 · 单流输出内存上限,超出转存 spill 文件 maxSpillBytes · 67108864 · spill 文件上限 graceMs · 3000 · 终止到强杀的宽限期
选择优先级:设置页保存的路径 → shellPath → shell → 自动检测。
%DSH_HOME%\shell-switch.json(设置页保存的值):
{
"shell": {
"path": "<bash.exe 的绝对路径>",
"at": "2026-01-01T00:00:00.000Z"
}
}Host 内部接口,仅回环地址、同源可访问(供设置页使用):
方法 · 路径 · 说明 GET · /api/dsh-shell-switch/state · 检测列表、当前选择、生效项、沙箱模式、pwsh 状态 POST · /api/dsh-shell-switch/select · { "path": "…" } 选择;{ "action": "reset" } 恢复默认
/state 示例(截断):
{
"ok": true,
"shells": [
{ "path": "<bash.exe 的绝对路径>", "label": "Niubash bash",
"version": "5.3.0", "compatible": true, "source": "registry" }
],
"selected": null,
"effective": { "label": "Niubash bash", "version": "5.3.0" },
"sandbox": { "mode": "workspace-write", "workspaceRoot": "<会话工作目录>" },
"pwsh": { "hidden": true, "restrictedAgents": 1, "errorCode": null }
}检测顺序(按真实路径去重):
...\CurrentVersion\Uninstall 中 DisplayName 含 Niubash / Winuxsh 的 InstallLocation → winuxcmd\usr\bin\bash.exe、winuxcmd\bin\bash.exe 等;Program Files、Program Files (x86)、LocalAppData\Programs);%SystemDrive%\msys64、msys32、cygwin64、cygwin;PATH 里的 bash.exe、pwsh.exe、nu.exe;winuxsh.exe、WSL System32\bash.exe、PowerShell 7 / 5.1、cmd.exe。兼容性说明:
bash.exe 在 DSH 受限令牌沙箱内实测可用(bash 5.3.0);read-only / workspace-write / danger-full-access;ctx.sandbox.confine(argv, policy)(Windows 上为 ACL 受限令牌链)包装后才启动进程;bash 工具;侧边栏终端不跟随该选择。pwsh 屏蔽依赖 Agent 作用域的 tools.restrict,所以:pwsh 过滤(那些平台本来也不会组合 pwsh)。plugin_manager remove_bundle target = dsh-shell-switch或停用条目 shell-switch。停用后:
bash 工具消失(会话恢复官方工具集);pwsh 工具恢复;%DSH_HOME%\shell-switch.json 保留,重新启用后继续生效;不需要时可手动删除。现象 · 处理 设置页没有「Shell」 · 插件是启动后安装的:刷新页面;仍没有则重启 DSH 工具列表里没有 bash · 确认行 shell-switch 处于启用状态且无报错;查看 %TEMP%\dsh-shell-switch-debug.log 报错找不到 DSH 安装 · 设置环境变量 DSH_INSTALL 指向 DSH 安装根目录后重启 报错「没有可用的 bash shell」 · 在设置页选择,或安装 Niubash/Git Bash/MSYS2 后点「重新扫描」 选中项显示「不是 bash 方言」 · 换一个「可用于 bash」分组里的 shell 命令报文件拒绝 · 属于会话沙箱策略,不是插件;按 DSH 的权限提示处理 pwsh 还在 · 该会话是在屏蔽前创建的:新开一个会话,或等下一次模型请求重算工具目录
日志:%TEMP%\dsh-shell-switch-debug.log(只在挂载、工具激活、屏蔽时写入)。
plugin_manager set_plugin 先 false 再 true 触发热重载(客户端需刷新页面);node --check index.js && node --check client.js;GET /api/dsh-shell-switch/state(在 DSH 进程所在机器上)。MIT