🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

智能体终端选择 ZhaoHanshao/dsh-plugin-agent-terminal

DeepSeek Harness
ZhaoHanshao10 天前有提交已提供中文文档扫描:含敏感能力

为每个会话单独指定智能体执行命令所用的终端

29.2/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ZhaoHanshao/dsh-plugin-agent-terminal
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · dev
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 10 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 15 处,展示前 15 条)
  • 读取本地文件
    lib/index.js:126
    const stat = statSync(path)
  • 读取本地文件
    lib/index.js:132
    const link = lstatSync(path)
  • 执行外部命令来自配置/变量
    lib/index.js:229
    const result = spawnSync(wsl, ['--list', '--quiet'], {
  • 执行外部命令固定命令
    lib/index.js:239
    spawnSync('cmd.exe', ['/d', '/s', '/c', `"${wsl}" --list --quiet > "${tmpFile}" 2>nul`], {
  • 读取本地文件
    lib/index.js:244
    if (existsSync(tmpFile)) buffer = readFileSync(tmpFile)
  • 读取本地文件
    lib/index.js:244
    if (existsSync(tmpFile)) buffer = readFileSync(tmpFile)
  • 读取本地文件
    lib/index.js:256
    try { if (existsSync(tmpFile)) rmSync(tmpFile, { force: true }) } catch {}
  • 删除本地文件
    lib/index.js:256
    try { if (existsSync(tmpFile)) rmSync(tmpFile, { force: true }) } catch {}
  • 写入本地文件
    lib/index.js:491
    writeFileSync(scriptPath, body, 'utf8')
  • 写入本地文件
    lib/index.js:514
    mkdirSync(scriptDirectory, { recursive: true })
  • 读取本地文件
    lib/index.js:591
    const parsed = JSON.parse(readFileSync(selectionFile(), 'utf8'))
  • 写入本地文件
    lib/index.js:609
    mkdirSync(dirname(selectionFile()), { recursive: true })
  • 写入本地文件
    lib/index.js:610
    writeFileSync(selectionFile(), JSON.stringify(selection, null, 2), 'utf8')
  • 发起网络请求
    lib/client.js:73
    const response = await fetch(`${API}/token`, { credentials: 'same-origin' })
  • 发起网络请求
    lib/client.js:83
    const response = await fetch(`${API}${path}`, {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

为每个会话单独选择 DSH 智能体运行命令所用的终端,与智能体模式无关。

README

由 DeepSeek 最新模型翻译生成
DSH Agent Terminal 为当前会话选择智能体执行命令时使用的终端,与「标准 / PTC / minimal」等模式选择完全独立。 标准模式 + cmd 可以共存;换终端不需要换模式,也不需要重建会话。 按会话选择智能体执行命令所用的终端,与智能体模式相互独立。 内置 cmd、PowerShell 5.1/7、Git Bash、WSL(按发行版)和自定义 shell,每一种都实际启动过确认可用,并把对应的命令方言告诉模型,免得它在 bash 里敲 dir、在 cmd 里敲 ls。 安装 这是标准 DSH bundle 包(dsh.bundle.patch),不需要构建步骤,也没有运行时依赖。
展开完整文档(README 剩余 1 节)
DSH Agent Terminal

为当前会话选择智能体执行命令时使用的终端,与「标准 / PTC / minimal」等模式选择完全独立。

标准模式 + cmd 可以共存;换终端不需要换模式,也不需要重建会话。

按会话选择智能体执行命令所用的终端,与智能体模式相互独立。
内置 cmd、PowerShell 5.1/7、Git Bash、WSL(按发行版)和自定义 shell,每一种都实际启动过确认可用,并把对应的命令方言告诉模型,免得它在 bash 里敲 dir、在 cmd 里敲 ls。

安装

这是标准 DSH bundle 包(dsh.bundle.patch),不需要构建步骤,也没有运行时依赖。
用 DSH 的 plugin_manager 安装,三种写法等价:

1) npm 注册表(发布到 npm 之后) action: install_bundle target: dsh-plugin-agent-terminal

2) git 规格(无需发布即可安装,仍然走 npm 解析) action: install_bundle target: github:ZhaoHanshao/dsh-plugin-agent-terminal

3) 本地目录(开发时可用,改代码即时生效) action: install_bundle target: <克隆出来的绝对路径>

命令行等价形式:

npm install dsh-plugin-agent-terminal # 发布后
npm install github:ZhaoHanshao/dsh-plugin-agent-terminal

安装后刷新页面,会话头部右侧会出现终端按钮。

要求:DSH(DeepSeek Harness)客户端;Windows 上已在 0.2.1-rc.3 验证,POSIX 平台的探测逻辑同样适用。包内不声明 engines.dsh:DSH 当前为预发布版(0.2.1-rc.3),而 semver 规定预发布版本不满足 >=0.2.0、^0.2.0 甚至 *,写死版本范围反而会让安装被版本闸门拒绝。

界面位置

选择器出现在两处,同一个组件:

| 位置 | 槽位 | 作用域 |
| 会话头部右侧工具区 | conversation.session.header.utilities(order -8,夹在「在应用中打开」和「定时任务」之间) | 当前会话 |
| 新会话落地页那一行 | conversation.hero.options(order 10,紧跟 workspace 与预设/模式控件之后) | 新会话默认 |

- 不占用左侧栏入口
- 没有独立的终端页面
- 有会话时写入该会话;新会话页尚无可绑定会话时自动写入「新会话默认」,下拉标题随之显示对应范围
- 新会话行用的是紧凑变体(隐藏版本徽标),以适配该行的密度

新会话页那一行紧邻模式选择器,正好体现核心设计:换终端不必换模式。

按钮显示当前终端名;未接管时显示「跟随默认」。展开后列出探测到的终端(含版本与可用性)、「跟随默认」项,以及自定义路径入口。

机制

智能体执行命令的链路是 tool-pwsh → ctx.shell → executor。这条路本身不能按会话变化:

- ctx.shell 是进程级单例,ShellExecRequest 里没有 session/agent 字段
- executor 的可执行文件写死(bash-local 是 ['bash','-c',…],pwsh-local 是 [pwshPath,…, '-Command', …])
- profile 插件无法 import DSH 内部包(实测 import.meta.resolve → ERR_MODULE_NOT_FOUND),所以也无法子类化

本插件走的是工具层按会话遮蔽:

1. 在 agent.ctx.tools 里注册同名工具,会遮蔽该会话的全局同名工具(实测有效,且不影响其他会话)。
2. 选择 cmd / bash 时注册对应工具,并用 restrict({deny:['pwsh']}) 隐藏原生工具,模型只会看到方言正确的那一个。
3. 执行走 ctx.subprocess + ctx.sandbox(profile 插件可直接使用,实测 spawn exit: 0、enforcement: partial)。

因此模式(preset)完全不受影响 —— 它决定智能体有哪些能力,本插件只决定这些能力用哪个终端执行。

安全设计

切换时先装新工具、成功后才撤销旧的。若新终端校验失败或注册抛错,旧工具与原生工具都保持原样 —— 切换终端绝不会把会话变成哑的。

终端探查

按 PATH + PATHEXT + 已知安装位置逐个解析,然后实际启动一次确认可用并取版本号,而不是文件存在就列。

处理了四个 Windows 特有的坑:

| 坑 | 现象 | 处理 |
| Store 别名是 reparse point | statSync 抛 EACCES,pwsh 7 被误判为没装 | stat 失败时退回 lstat |
| wsl --list 输出 UTF-16LE | 得到 U b u n t u | 按 utf16le 解码 |
| spawnSync 读 wsl 输出为空 | exit 0 但 stdout 空 | 重定向到临时文件再读 |
| %SystemRoot%\System32\bash.exe 是 WSL 启动器 | 与 Git Bash 重复 | 由发行版枚举代表,不单独列 |

WSL 按发行版展开(Ubuntu 等),跳过 docker-desktop 这类内部发行版。

路由

全部在 /agent-shell/api 下,除 token 外都要求 x-agent-shell-token 头 + 同源校验。

| 方法 | 路径 | 作用 |
| GET | /token | 令牌(同时注入页面 ) |
| GET | /shells?refresh=1 | 探测终端列表 |
| GET | /selection?session= | 读当前选择 |
| GET | /diagnostics?session= | 自检:当前生效的工具名、prompt 段落是否注册、注入的原文 |
| POST | /selection | 写选择(scope: session \| default,shellId: null 表示不接管) |
| POST | /verify | 验证自定义终端绝对路径,成功即登记并持久化 |

让模型用对话言(提示词)

只把工具改名成 bash 并不够:模型看到 D:\... 这样的 Windows 路径,仍会按「Windows ⇒ cmd」的惯性写出 dir、copy、type。因此对 bash 家族(含 niu.exe 这类自带 bash 的终端)注入两层约束:

1. 工具描述:明确列出禁止的 cmd / PowerShell 惯用法,并给出对应替代(dir→ls、copy→cp、%VAR%/$env:VAR→$VAR),同时说明盘符形态(MSYS 为 /c/code,WSL 为 /mnt/c/code)。
2. system prompt 段落(agent-terminal:dialect,注册在该会话作用域):在模型决定第一行命令写法之前就给出方言约定。cmd / PowerShell 终端则不注入禁止项,只陈述自身语法。

可用 /diagnostics?session= 核实实际注入内容,例如:

tool=bash promptRegistered=True
prompt: The shell tool runs bash (Niubash (niu.exe)). Write POSIX shell: ls, cp, rm, ...

自定义终端

添加 D:\App\Niubash\Bash\niu.exe 这类自带 bash 的终端时,流程是:

1. POST /verify 实际启动一次确认可用(本例返回 Niubash 1.4.4)
2. 登记进发现列表,并把路径写入选择文件的 customPaths
3. POST /selection 才能接受它

第 2 步曾经缺失:/verify 只验证不登记,而 /selection 只认发现列表里的 id,于是验证明明通过、选中却返回 unknown-shell —— 这就是自定义终端「加不进去」的根因。现在两处都修了,并且 /selection 收到未登记的 custom:<绝对路径> 时会就地验证并自动登记。

路径会被规范化(D:\\\\App 与 D:\App 视为同一终端),customPaths 读取时自动合并重复项,因此手输或转义产生的重复不会堆积。

重启后 customPaths 与配置的 extraShells 合并回发现流程,自定义终端不会丢。

标签取版本串里的产品名,例如 Niubash (niu.exe),比纯文件名易认。

配置

- id: agent-terminal
name: 'dsh-plugin-agent-terminal'
config:
timeoutMs: 120000 # 命令默认超时 maxOutputBytes: 262144 # 单流输出上限 verify: true # 是否实际启动验证 defaultShellId: null # 新会话默认终端;null = 不接管
extraShells: [] # 额外手工添加的绝对路径

已验证

- 本机探测到 5 个终端,全部实际启动验证通过:cmd、PowerShell 5.1 (5.1.26100.9711)、PowerShell 7 (7.6.8)、Git Bash (5.2.26)、WSL (2.6.3.0)
- 按会话绑定 gitbash 后,本会话的 shell 工具由 pwsh 变为 bash,真实运行于 Msys Git Bash,中文输出正常
- 切回原生后 pwsh 工具恢复,往返无损
- 会话头部选择器已注册(agent-terminal,order -8,active);左侧栏与主面板均已无本插件入口
- 新会话页选择器已注册(agent-terminal-hero,order 10,active)
- default 作用域读写正常(新会话页走这条路径),返回 defaultShellId 与完整终端信息
- 自定义终端 D:\App\Niubash\Bash\niu.exe:/verify 通过 → 出现在发现列表 → /selection 返回 200 → 实测 whoami 输出 niu,中文正常
- 自定义终端跨重启仍被发现(customPaths 持久化 + refresh=1 实测)
- 切到 niu.exe 后模型侧工具确为 bash,描述含「NOT cmd.exe / NOT PowerShell」及替代命令表;/diagnostics 报 promptRegistered=True,段落文本正确
- 重复分隔符路径(D:\\\\App)被规范化,customPaths 读取时自愈合并没有堆积
- 未知终端返回 400;无令牌/错令牌返回 403
- 以 github: 规格通过 plugin_manager 安装成功(非链接副本,lib/ 与 locale/ 齐全),安装后路由与客户端入口均正常

发布到 npm

包已就绪:无构建步骤、无依赖、files 覆盖全部运行时资源,npm pack 产出 9 个文件 / 27 kB。

npm login # 首次需要,交互式
npm publish # 包名 dsh-plugin-agent-terminal,当前未被占用

发布后即可用 install_bundle 的 target: dsh-plugin-agent-terminal 安装。
每次发版前建议先跑 npm pack --dry-run 核对文件清单。

已知限制

- 一次调用一个全新进程,无 PTY:vim、top 等交互式程序不可用。
- 会话 id 取自 agent.id;尚未开始的会话只能设置「新会话默认」。
- 插件目录名与包名必须一致,都叫 dsh-plugin-agent-terminal:clientModules 会把「不是客户端包」的否定结论按 specifier 缓存到重启,改名是唯一无需重启的补救方式。
预览分享卡片长什么样 ↓ZhaoHanshao/dsh-plugin-agent-terminal
分享 · DeepSeek Harness Hub
ZhaoHanshao/dsh-plugin-agent-terminal

为每个会话单独指定智能体执行命令所用的终端

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部