前言¶
DSH 的会话视图里,工具调用一直存在,但命令执行过程被折叠在对话流里。想看一条命令的 stdout、退出码、耗时,往往要在聊天记录里来回滚动找卡片;中途去别处看一眼,命令就跟着消息流沉下去了。
dsh-command-monitor 就是解决这件事的:它在 DeepSeek Harness Web GUI 右下角挂一颗可拖动的悬浮按钮,点开是「执行过程」面板,命令、输出、退出码、耗时一览无余,可翻、可选中复制、可导出。插件由 j4ckzh0u 维护,MIT 许可,纯浏览器插件:不新增宿主服务、不抓 DOM、不重启 dsh web,只读取当前页面已加载的会话数据。分类属于客户端插件(社区目录里星标为 1)。
下面介绍它的功能、安装方式、用法和限制。
这是什么¶
一句话:在 dsh Web GUI 里把工具/命令执行记录抽成一个始终在视野里的悬浮窗。
与现有做法的对比:
- 聊天记录里的命令卡片随消息流动,需要滚动定位;悬浮窗不打断对话,也不占版面,收起后只剩一颗按钮。
- 不重复解析网络数据,只订阅当前主会话已经装配好的
tool/call/tool/result节点,因此和聊天里的命令卡片基本同步。
核心功能¶
插件提供两块区域:收起态是右下角一颗圆形悬浮按钮,展开后是「执行过程」面板。功能如下:
| 能力 | 说明 |
|---|---|
| 悬浮按钮 / 面板 | 按钮和面板都可拖动,位置与大小会被记住 |
| 两种视图 | 命令:只看 bash / pwsh / terminal_*;全部:显示所有工具调用(读文件、搜索、编辑、MCP、子代理等) |
| 智能跟随 | 新记录自动滚到底部;往上翻自动暂停跟随,点「跟随」或「回到最新」恢复 |
| 完整条目 | 工具名、描述、开始时间、耗时、状态、cwd、命令、stdout+stderr、退出码;后台、超时、沙箱拒绝、输出截断都有标记 |
| 选择与复制 | 正文可自由选中;单条「复制」(命令 + 完整输出);顶部「复制」复制当前筛选下全部记录 |
| 下载 | Markdown、纯文本、JSON 三种格式,文件名格式为 dsh-commands-<会话>-<时间>.<ext> |
| 会话跟随 | 自动跟随当前主会话,切换会话自动切换;离开对话视图时保留最后数据并标记「暂停更新」 |
| 主题自适应 | 使用 dsh 的 --dsw-* 设计 token,浅色 / 深色主题都正常 |
兼容性¶
| 项目 | 要求 |
|---|---|
| dsh | 0.2.1-rc.2 或更新(README 标注实测 0.2.1-rc.5;范围见 package.json#engines.dsh) |
| 运行环境 | dsh Web GUI(dsh web / Web profile) |
| 浏览器 | 现代 Chromium / WebKit(需要 backdrop-filter、color-mix()、Pointer Events) |
| Node(安装环境) | ^22.19.0 || >=24.0.0 |
| 宿主平台 | macOS / Linux / Windows(插件本身不区分平台) |
插件包版本为 0.1.1,许可证 MIT。
安装与启用¶
插件安装进 dsh profile:包放进 profile 的 node_modules,再把包名加入 dsh.profile.bundles。README 给出两种方式。
方式 A:安装脚本(推荐):
git clone https://github.com/j4ckzh0u/dsh-command-monitor.git
cd dsh-command-monitor
# 默认安装到 web profile;也可以传其它 profile 名
./scripts/install.sh # 等价于 ./scripts/install.sh web
脚本会做三件事:把运行文件复制到 $DSH_HOME/profiles/<profile>/node_modules/dsh-command-monitor/;备份并更新 profile 的 package.json(dependencies + dsh.profile.bundles);打印验证步骤。
方式 B:手动安装。先把目录拷进 profile:
cp -R . "$HOME/.dsh/profiles/web/node_modules/dsh-command-monitor"
再编辑 ~/.dsh/profiles/web/package.json,加入 dependencies 与 bundles:
{
"dsh": {
"profile": {
"bundles": ["…", "dsh-command-monitor"]
}
},
"dependencies": {
"dsh-command-monitor": "file:/absolute/path/to/dsh-command-monitor"
}
}
README 说明:$DSH_HOME 默认是 ~/.dsh,Windows 下路径与命令需按 PowerShell 语法调整。
安装后 dsh 的 HMR 会自动重组插件图,通常无需重启 dsh web;如果页面没出现悬浮按钮,刷新一次页面即可。升级、卸载、回滚、多 profile 与故障排查见仓库内 docs/DEPLOYMENT.zh.md。
安装后的验证步骤:
- 打开 / 刷新 dsh Web GUI;
- 右下角出现带终端图标的悬浮按钮(有运行中命令时带角标);
- 点击按钮,展开「执行过程」面板;
- 在任一对话里让 AI 执行一条命令(例如
echo hello),面板里应出现对应条目。
典型用法¶
点开悬浮窗后的日常操作:
- 拖动:按住悬浮按钮或面板标题栏拖动;面板左上角的小三角可调整大小。
- 翻看:鼠标滚轮在面板内上下滚动;往上翻会自动暂停「跟随」。
- 切换范围:面板顶部「命令 / 全部」切换视图。
- 复制:单条右侧「复制」,或顶部「复制」复制当前筛选的全部记录。
- 下载:顶部「下载」→ Markdown / 纯文本 / JSON。
- 收起:面板标题栏最右侧「—」;再次点击悬浮按钮即可展开。
典型工作流可以是这样:让 AI 跑一条命令,面板出现「运行中」条目;命令结束,stdout / stderr、退出码、耗时补齐;如果输出需要存档,直接下载 Markdown 或 JSON,不用去聊天记录里复制粘贴。条目字段细节、跟随逻辑、下载格式与存储键见仓库内 docs/USAGE.zh.md。
实现要点¶
- UI 席位:使用
shell.overlay(root scope,整框浮层、可点击穿透),只占一个入口,不替换任何现有 UI。 - 数据来源:当前主会话的 Conversation
chattarget,即聊天里已经装配好的tool/call/tool/result节点;不抓 DOM,也不重复解析网络数据。 - 收集器:挂在
conversation.session.header.utilities的 headless 组件,用useChat读取当前会话,去抖后发布到模块级 store;切换会话自动重绑。 - 渲染:React 18(dsh 平台内置模块),无打包器;
client.js直接遵循 dsh 的window.__ModuleLoader__.loadCJS 协议,只依赖react。 - 样式:全部使用
--dsw-*token 与--dsh-*字体变量,跟随主题与字号设置。
架构图与细节见 docs/DEVELOPMENT.zh.md。
适用场景与注意¶
适合谁:
- 主要在 dsh Web GUI 里工作、希望命令执行过程始终可见的开发者;
- 需要把执行记录导出留档(Markdown / 文本 / JSON)的团队;
- 不想打断与 AI 的对话流、也不想重启
dsh web的人。
需要留意的限制(均来自 README 的「已知限制」):
- 只跟随当前主会话,不汇总其它会话或子代理侧栏里的调用;
- 会话事件窗口按需加载:极老的命令需要先在聊天里向上滚动加载,悬浮窗才会看到;
- 命令输出在命令结束时一次性补齐(与聊天里的命令卡片一致),不是逐行流式;后台任务请用右侧任务面板看实时输出;
- 一次最多渲染最近 300 条(复制 / 下载仍包含当前筛选下的全部条目);
- 悬浮窗依赖 Conversation 会话视图:切到「插件 / 上下文」等其它主面板时会保留最后数据并显示「暂停更新」,回到对话后恢复。
隐私与安全:插件只在浏览器本地运行,不发送任何网络请求,不读取凭据、不修改会话内容;复制 / 下载通过浏览器 Clipboard 与 Blob API 完成,数据留在本机;宿主半侧 index.js 是空实现,不注册工具、不读写文件。
安装前应通读源码(仓库较小,核心是 client.js 与 index.js)并确认 MIT 许可证符合团队要求。
结尾¶
dsh-command-monitor 的价值在于把命令执行从聊天流里抽出来:悬浮窗不占地方,展开即可看全命令、输出、退出码与耗时,复制和导出也都顺手。它不改变 dsh 的权限模型,只是一个浏览器端插件,代价低、装上就能用。
- 社区目录页:https://www.skillhub.cn/plugins/j4ckzh0u/dsh-command-monitor
- GitHub 仓库:https://github.com/j4ckzh0u/dsh-command-monitor