dsh-command-monitor
在 DeepSeek Harness Web GUI 里实时看到 AI 执行命令的悬浮窗:右下角一颗可拖动的悬浮按钮,点开就是「执行过程」面板——命令、输出、退出码、耗时一览,可上下翻、可选中复制、可导出 Markdown / 文本 / JSON。
(图为界面示意,实际配色跟随 dsh 的浅色 / 深色主题。)
这是什么
dsh 的会话视图里,工具调用一直存在,但命令执行过程被折叠在对话流里。dsh-command-monitor 把这些执行记录抽成一个始终在视野里的悬浮窗:
- 命令一发出就出现「运行中」,结束时补上 stdout / stderr、退出码与耗时;
- 不用来回滚动聊天记录,也不会打断你和 AI 的对话;
- 收起后只剩一颗悬浮按钮,不占地方;按钮和面板都能拖动。
插件是纯浏览器插件:不新增宿主服务、不抓 DOM、不重启 dsh web,只读取当前页面已经加载的会话数据。
功能
| 能力 | 说明 |
|---|---|
| 悬浮按钮 / 面板 | 收起为圆形按钮;点开为「执行过程」面板;按钮和面板都可拖动,位置与大小会记住 |
| 两种视图 | 命令:只看 bash / pwsh / terminal_*;全部:显示所有工具调用(读文件、搜索、编辑、MCP、子代理……) |
| 智能跟随 | 新记录自动滚到底部;往上翻自动暂停跟随,点「跟随」或「回到最新」恢复 |
| 完整条目 | 工具名、描述、开始时间、耗时、状态、cwd、命令、stdout+stderr、退出码;后台 / 超时 / 沙箱拒绝 / 输出截断都有标记 |
| 选择与复制 | 正文可自由选中;单条「复制」(命令 + 完整输出);顶部「复制」复制当前筛选下全部记录 |
| 下载 | Markdown、纯文本、JSON 三种格式,文件名 dsh-commands-<会话>-<时间>.<ext> |
| 会话跟随 | 自动跟随当前主会话;切换会话自动切换;离开对话视图时保留最后数据并标记「暂停更新」 |
| 主题自适应 | 使用 dsh 的 --dsw-* 设计 token,浅色 / 深色主题都正常 |
兼容性
| 项目 | 要求 |
|---|---|
| dsh | 0.2.1-rc.2 或更新(实测 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 |
| 宿主平台 | macOS / Linux / Windows(插件本身不区分平台) |
快速安装
插件安装进 dsh profile:包放进 profile 的 node_modules,再把包名加入 dsh.profile.bundles。
方式 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); - 打印验证步骤。
安装后 dsh 的 HMR 会自动重组插件图。通常无需重启 dsh web;如果页面没出现悬浮按钮,刷新一次页面即可。完整步骤、验证、升级、卸载见 部署手册。
方式 B:手动安装
cp -R . "$HOME/.dsh/profiles/web/node_modules/dsh-command-monitor"
然后编辑 ~/.dsh/profiles/web/package.json:
{
"dsh": {
"profile": {
"bundles": ["…", "dsh-command-monitor"]
}
},
"dependencies": {
"dsh-command-monitor": "file:/absolute/path/to/dsh-command-monitor"
}
}
$DSH_HOME默认是~/.dsh。Windows 下路径与命令请按 PowerShell 语法调整。
验证
- 打开 / 刷新 dsh Web GUI;
- 右下角出现带终端图标的悬浮按钮(有运行中命令时带角标);
- 点击按钮 → 「执行过程」面板;
- 在任一对话里让 AI 执行一条命令(例如
echo hello),面板里应出现对应条目。
使用
点开悬浮窗后:
- 拖动:按住悬浮按钮或面板标题栏拖动;面板左上角的小三角可调整大小。
- 翻看:鼠标滚轮在面板内上下滚动;往上翻会自动暂停「跟随」。
- 切换范围:面板顶部「命令 / 全部」。
- 复制:单条右侧「复制」,或顶部「复制」复制当前筛选全部。
- 下载:顶部「下载」→ Markdown / 纯文本 / JSON。
- 收起:面板标题栏最右侧「—」;再次点击悬浮按钮展开。
详细说明(条目字段、跟随逻辑、下载格式、存储键、FAQ)见 使用手册。
文档
| 文档 | 内容 |
|---|---|
| 使用手册 | 界面说明、全部交互、跟随 / 复制 / 下载细节、FAQ、限制 |
| 部署手册 | 安装 / 验证 / 升级 / 卸载 / 回滚 / 多 profile / 故障排查 |
| 开发手册 | 架构、数据流、slot 机制、HMR 调试、发布清单 |
| CHANGELOG | 版本变更记录 |
目录结构
dsh-command-monitor/
├── client.js # 浏览器半侧:悬浮 UI + 会话数据订阅 + 复制/下载(无构建)
├── index.js # 宿主半侧:空 apply,只为成为 Loader 条目
├── cordis.patch.yml # 作为 bundle 加载时插入的 Loader 行
├── package.json # dsh.bundle / dsh.client / exports 声明
├── icon.svg # 插件图标
├── docs/ # 使用、部署、开发手册 + 示意图
├── scripts/ # install / uninstall / check / sync-dev
├── .github/workflows/ # CI:语法与清单校验
└── README.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-*字体变量,跟随主题与字号设置。
架构图与实现细节见 开发手册。
已知限制
- 只跟随当前主会话,不汇总其它会话或子代理侧栏里的调用。
- 会话事件窗口按需加载:极老的命令需要先在聊天里向上滚动加载,悬浮窗才会看到。
- 命令输出在命令结束时一次性补齐(与聊天里的命令卡片一致),不是逐行流式;后台任务请用右侧任务面板看实时输出。
- 一次最多渲染最近 300 条(复制 / 下载仍包含当前筛选下的全部条目)。
- 悬浮窗依赖 Conversation 会话视图:切到「插件 / 上下文」等其它主面板时会保留最后数据并显示「暂停更新」,回到对话后恢复。
隐私与安全
- 插件只在浏览器本地运行,不发送任何网络请求,不读取凭据、不修改会话内容。
- 复制 / 下载都通过浏览器 Clipboard 与 Blob API 完成,数据留在本机。
- 宿主半侧
index.js是空实现,不注册工具、不读写文件。
English overview
A floating command/tool execution monitor for the DeepSeek Harness Web GUI. It registers one entry in the shell.overlay slot, follows the active conversation's Chat target (no DOM scraping), and renders a draggable pill / panel with command output, smart scroll-follow, per-entry copy, and Markdown / text / JSON export. Pure client-side plugin; no host service, no restart required.
License
MIT © 2026 j4ckzh0u and contributors.
No comments yet. Be the first to write one.