dsh-work-status
简体中文 · English
一行状态看清 Agent 在做什么;点开是目标、当前步、最近的记录与上一轮。
一个 DeepSeek Harness 插件,用尽量少的注意力回答一个问题:
它现在在做什么、已经做完了什么、有没有卡住?
默认只在输入框上方占一行,点开是工作状态,再点收起。
● 本轮 29 步 6m49s ⌃
点开之后:
本轮 29 步 6m49s ×
目标 按你定的方案改:固定右下浮窗、行内展开、圆环状态点…
推理 6m35s · 工具 13s · 压缩 16 次 失败 3
清单 3/4 完成
○ 运行测试 tests/client-render.test.mjs 362ms
● 修改文件 lib/client.js 1.2s
✗ 压缩上下文 m00301–m00356 · 省 ~… 未恢复 27ms
没压成:范围已失效,本次没有新增压缩块
展开本轮历史 · 37 步 ⌄
上一轮 · 第 20 轮 2m14s ⌄
日志 · 复制 · 收起


动图(浅色):进行中、失败、失败被后来的同类成功救回(划掉转灰)、进度随清单推进——状态会变,静态图看不出来。 都用插件自己的样式表和文案、套主题令牌渲染;运行中的应用是同一套结构,只是填真实数据。
显示什么
- 默认一行:干活时显示当前动作与已用时,结束后显示本轮完成步数;不往对话区上浮任何卡片。
- 三层,从结论到细节:第一层是正文(模型说的话,按顺序累积,折三行,点「看全文」铺开);第二层是解释(过程行上的思考摘要,白灰小字);第三层是过程(搜代码、改文件、跑测试,点开看原始参数与结果)。要它说了什么就看第一层,要查它怎么做的再往下点。
- 三层怎么分:消息里的三种块就是三层——
text块是正文(模型说的话,「我先看看目录」这种过渡句也算,它和最终交付是同一档字体);reasoning块是解释(折成白灰小标题的那行「Think · 先看目录结构」);tool-call块是过程(工具调用,带目标与耗时)。点开一行才看到思考全文与工具参数——那是第三层的原始模样。 - 目标与当前问题:你提的要求、它正在处理的小问题,各自截断并可展开。
- 三个分开的时钟:模型推理、工具调用、上下文压缩各自计时,不合并成一个“已用时”;单步耗时按类别(本地 / 网络 / 后台)拆开,不是一笔糊账。
- 等人的时间不算工期:向你提问、等你点头审批的这段时间,会从「已用时」里扣掉,日志里单独写成「等人 N」;自己去泡杯茶回来,卡片上的用时也不会白涨。
- 只在有真实数据时给进度:agent 维护 todo 清单时才显示完成了几件(
清单 3/4 完成,分母就是它自己那份清单);没有清单就不画那一行,不对整轮外推 ETA,也不拿百分比冒充进度。 - 它自己说的话就是当前状态:模型在思考或写回答时,卡片那行直接写它刚写的思考(「先看目录结构,再按模块读入口文件」),不再用「模型思考中」这种占位词。这些本来就在事件流里,读一下就有,不调模型、不加延迟。
- "慢"和"卡住"分档:耐心值按当前在跑什么算——本地读写 20 秒、网络 60 秒、后台任务与子代理 120 秒、系统操作 30 秒。跑测试三分钟没动静是正常的,读文件三分钟就不是;同一个 45 秒阈值会把"正在拉包"误报成"挂住了"。
- 卡住时说它在哪卡住:不是「45s 没动静」这种秒数,而是具体的一句话——「在「运行测试」上等了 3 分钟,还没回来」「第 3 次动「界面代码」,可能绕在里面了」「「运行测试」连着失败 2 次,卡在这一步」。说不出具体处境时,退回一句最朴素的"没新动静",绝不编原因。
- 每个动作都说人话:
运行测试、修改文件、压缩上下文,带目标与耗时。失败标未恢复或已恢复(同一目标后来成功),能识别时直接给一句人话,不甩栈。 - 上下文维护按普通记录排:压缩 / 恢复 / 检索与工具行按时间排在一起,能看出它插在哪一步,又不虚增步数。
- 上一轮:上一轮折叠成一行放在分割线下,轮次结束后卡片仍能回答“刚做了什么”。
- 会话日志:轮次、步数、调用次数、每轮推理/工具用时、压缩次数与失败、最近 24 轮,可一键复制成纯文本。
- 诊断:底栏点「诊断」,七行当场可测的事实——插件版本、宿主版本(DSH 注入的
__DSH_BOOT__.release,含 commit)、运行环境(浏览器内核 + 系统,不贴整条 UA)、会话服务是否可用、投影数据到第几轮、下载接口状态(没拉到 / 通了没任务 / 几条)、挂载插槽。测不到的写「未知」,不猜。可一键复制成纯文本贴给维护者:家目录缩成~,不含 token、会话 id、对话内容。面板不显示、徽标不亮时,先看这一页。 - 下载进度(可选):本机若装了写状态的下载器(状态在
~/.agent-downloads/jobs/),卡片会多一块「下载」——文件名、百分比、速度、剩余时间、当前阶段,最多列 4 条;进程已经不在却还写着「下载中」的标成中断,不假装在跑。跑完的行只在本轮露个脸,这一轮一收就跟着走,不会一直挂在卡片上;正在下的不看轮次。没有那个目录就什么都不画。读写契约见 docs/DOWNLOAD-STATUS-SPEC.md:任何按这份约定写status.json的下载器都能接上,卡片本身不下载、不取消。 - 看不懂的步骤点开有大白话:把一步展开,下面多一行解释这步在干什么(「运行测试 = 验证改动没弄坏别的」)。按动作类型给解释,词典里没有的工具就不加这行。
刻意不做的事
- 不调模型、不注提示词、不对外发网络请求,数据不出本机(下载进度只读本机自己的接口)。
- 不还原“思考内容”,只报告可观察事件;事实与推断分开,不知道就写不知道。
- 没有 todo 数据就不画进度条,不做 0% / 100% 的装饰。
- 不评价 agent 想得对不对。
安装
插件是一个 DeepSeek Harness bundle,用插件管家安装。从 npm 装(插件中心的「安装」按钮走同一条路):
dsh plugin --profile web add dsh-work-status
其它来源:
| 来源 | 命令 |
|---|---|
| 本地目录 | install link:E:/path/to/dsh-work-status |
| 打包文件 | npm pack → install file:./dsh-work-status-<version>.tgz |
| GitHub | dsh plugin --profile web add github:xsllo425/dsh-work-status(插件内命令可简写为 install github:xsllo425/dsh-work-status) |
桌面端也可以走 插件 → 添加插件,直接填仓库地址。
- 改动宿主侧(
lib/activity.js、stateVersion)需要重启 Harness;只改客户端会随页面刷新加载。 - 卸载即移除这一行;插件不写自己的会话数据。
- 没有需要配置的项。
更新
插件不联网、不会自己更新,装法决定更新方式:
| 装法 | 更新 |
|---|---|
| npm | 重跑安装命令就是更新:dsh plugin --profile web add dsh-work-status(装到最新版) |
| GitHub | 重跑安装命令就是更新:dsh plugin --profile web add github:xsllo425/dsh-work-status。想固定在某个版本,在仓库地址后面加 tag(形如 #v0.9.1,版本号见 Releases 页) |
| 本地目录 | 在那个目录 git pull;用 link: 装的话改完重启就生效 |
| 打包文件 | 重新 npm pack,再按 file: 装一遍 |
想确认装的是哪一版,看 ~/.dsh/profiles/<profile>/node_modules/dsh-work-status/package.json 里的 version。只改客户端的版本刷新页面就够,动过宿主侧的版本要重启 Harness。每一版改了什么见 CHANGELOG.md。
本地步耗时统计
新会话的前几步想显示「同类通常 3–8 秒」,就得知道以前同类步用了多久,插件为此在本机记一份小统计。
- 位置:
~/.dsh/work-status/step-stats.json(Windows:%USERPROFILE%/.dsh/work-status/step-stats.json)。 - 内容:工具归类键(
model|read、tool|local|edit等)+ 整数毫秒。不含路径、命令、提示词、会话 id、时间戳。 - 有上限:每类最多 30 个样本、最多 48 类,文件长期只有几 KB。
- 随时可以直接删掉这个文件,等于回到冷启动;下一轮结束后会自动重建,插件不会因此报错。
- 想彻底关闭,设
DSH_WORK_STATUS_NO_HISTORY=1。 - 来自历史会话的参照在面板上标「据历史」;本会话同类样本攒够 5 个后会自动改用本会话数据。
兼容性
- DeepSeek Harness
>= 0.2.1-rc.2,Web UI。 - 可选:装了
dsh-claude-style并把桌宠放在输入框上方时,插件隐藏自己的徽标,改为右键桌宠打开面板。 - 不含对方的美术资产:只读它的 CSS 类名(
.dsh-claude-deepy/.dsh-claude-crab),不复制、不内联任何桌宠图片;螃蟹「Clawd」是 Anthropic 的角色,版权不在本项目。 - 不绑定主题:颜色、描边、字体都取宿主 CSS 变量(
--dsw-alias-*),浅色/深色/第三方主题自动跟随。
开发
node --check lib/client.js && node --check lib/activity.js && node --check lib/index.js
node --test tests/*.test.mjs # 176 项,无任何依赖
node scripts/check-manifest.mjs # 清单、导出、补丁行、图标、语言包
无运行时依赖,也无开发依赖,Node 24 直接跑。
lib/index.js 宿主入口,注册会话投影
lib/activity.js 纯事件折叠(stateVersion 21,投影键 "workStatus")
lib/client.js Web UI:徽标、面板、时间轨、日志、双语文案、样式
locale/*.json 插件列表里的名称与简介(中/英)
icon.svg 插件图标
cordis.patch.yml bundle 补丁行
docs/ HANDOFF.md、RESEARCH-COMMUNITY.md、STATS.md
客户端不折叠事件,只渲染投影。投影状态形状变化时必须递增 stateVersion——旧 checkpoint 会被丢弃,从日志重放。
文档
- docs/HANDOFF.md — 交接:投影契约、代码地图、测试策略、宿主怪癖
- docs/RESEARCH-COMMUNITY.md — 九个社区进度插件的对与错
- docs/STATS.md — 耗时显示背后的实测统计
- docs/RELEASE.md — 发布前检查清单
- docs/FINAL-CHECK.md — 交付前总检(范围级)
- CHANGELOG.md — 逐版本记录
想立刻清掉它:npm run reset-stats(先看路径可加 -- --dry)。
介绍用的 7 页 PPT:docs/dsh-work-status-intro.pptx(封面、界面、口径、边界、安装)。
边界
- 显示的一切都来自会话事件流;工具结果没回来时,那一行写「结果未知」,不猜。
- 数字都是本会话单轮或单步的;跨会话历史只存在本机,有上限,可随时删除(见下面「本地数据」)。
- 桌宠联动是 best-effort:它盯的是 dsh-claude-style 的吉祥物,属于主题内部实现。主题一改就可能失效;给
<html data-dws-pet="off">就能停掉联动,徽标会自动回来。 - 只有计划有真实总数(n/m 待办)时才画百分比;没有就不画进度行,绝不编进度条。
致谢
这个插件是在多个 AI 助手的协助下写成的。名单按本机会话记录整理(DSH、Claude Code、Codex 的会话里,实际改过本仓库文件的模型),按参与多少排列:
- DeepSeek Flash
- DeepSeek V4.1 Flash
- Claude Opus 5.5
- GPT-6.1 Terra
- GPT-6 Astra
- SCNet-Max
- GLM-5.3 Flash
- Kimi K3.1 Pro
- StepFun Step-5 Preview
许可
MIT,见 LICENSE。最初分叉自 oxygenforce 的 dsh-agent-activity 0.9.0,"把会话日志折叠成输入框上方一条状态"的思路来自它;0.13.0 起代码已全部改写,不再包含它的代码,见 NOTICE。
No comments yet. Be the first to write one.