dsh-step-clock
在网页版输入框上方用一句中文显示当前正在执行的智能体步骤:步号、正在执行的工具、以及已运行多久。步骤结束后会保留该步用时,直到下一步开始,因此慢步骤事后也能查证。
wste47
@wste47
⬇ 2
★ 0
main
安装
dsh plugin --profile web add github:wste47/dsh-step-clock
需要可复现安装时,可在仓库后追加 #commit 固定提交。
在网页版输入框上方用一句中文显示当前正在执行的智能体步骤:步号、正在执行的工具、以及已运行多久。步骤结束后会保留该步用时,直到下一步开始,因此慢步骤事后也能查证。
该插件未提供要点说明,请参考仓库 README。
deepseek-harnessdshdsh-plugin
- 安装并启动 DeepSeek Harness:
npx @deepseek-ai/dsh web - 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
- 用 dsh plugins list 确认已安装,必要时重启 Harness 生效
插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。
| 代码仓库 | github.com/wste47/dsh-step-clock |
| 许可证 | MIT |
| 主要语言 | main |
| 下载量 | 2 |
| GitHub 星标 | 0 |
| 最近推送 | 2026-09-12 |
| 收录日期 | 2026-09-19 |
| 分类 | 界面增强 |
事实信息来自公开插件目录快照(2026-10-01),介绍文案由本站再加工。
以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。
# dsh-step-clock
[中文](README.zh.md) | English
A live per-step elapsed-time bar for the [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) web GUI. It answers one question the built-in turn timer does not: **how long has the step that is running right now been running?**
```
● 正在执行 bash,已运行 1 分 12 秒 第 12 步 [bash] 1:12
```
and, once that step finishes, keeps the result on screen:
```
● 上一步(第 12 步)已完成,用时 3 分 45 秒 3:45
```
The bar sits in the composer dock — the strip just above the input box, where the todo and goal bars live — with a second seat below the composer so a tall goal bar cannot push it out of view.
## Why
The harness already shows a turn-level clock at the bottom of the conversation, but it only appears after 15 seconds and it measures the whole turn. When you are watching a long `bash` call you cannot tell whether it started two seconds ago or has been stuck for four minutes, and the turn clock cannot tell you either.
This plugin measures **the current step**, from the instant its activity actually started:
- **Tool steps** are anchored to the tool call's own start time. An in-flight call exists in the live snapshot only while it is in flight, so `0:47` means the call itself has been running 47 seconds — not an estimate derived from the turn.
- **Thinking steps** fall back to the step boundary, the closest honest anchor for model time.
- The clock ticks from `0:00` with **no delay threshold**.
## What it says
The bar states the situation in plain language rather than showing a bare number:
| State | Wording |
| --- | --- |
| Running a tool | `正在执行 ,已运行 47 秒` |
| Several tools at once | `正在执行 bash,另有 2 个工具并行,本步已运行 5 秒` |
| Model streaming | `模型正在思考,本步已耗时 23 秒` |
| Submitted, no output yet | `已提交,正在等待模型响应,已等待 3 秒` |
| Finished step | `上一步(第 12 步)已完成,用时 3 分 45 秒` |
| Nothing running | `空闲,等待下一步` |
Alongside it: the step number, a chip of the running tool names (up to 4, then `+N`, hover for all), and a compact `m:ss` clock at the right edge.
Durations read naturally — `47 秒`, `1 分 12 秒`, `2 分钟`, `1 小时 3 分` — so `0:03` is never ambiguous. The wording is Chinese, matching the language of the session this was built for.
### Why the finished step stays
A step is frequently over in well under a second, so a bar that exists only *during* a step is easy to miss. Holding the last step's duration until the next step replaces it means a slow step — a `bash` call that ran for four minutes, say — can be identified after the fact. The record is kept only when the step's own `start` and `end` timestamps are both present; when they are not, the bar reports itself idle rather than inventing a duration.
## Install
```sh
dsh plugin --profile web add @climber47/dsh-step-clock
```
Then restart `dsh web`. The bar appears above the composer during the next running step.
## How it works
A dsh bundle, mounted as one inserted row:
- `package.json` declares `dsh.bundle.patch`, which is what makes the package installable, and `dsh.client` (`platform: web`), which is what serves the browser half.
- `cordis.patch.yml` inserts the `step-clock` row.
- `lib/index.js` is the (intentionally empty) host half. A bundle's row resolves the package root, so the package must be importable; this plugin has no host behaviour.
- `lib/client.js` is the browser half, in the `window.__ModuleLoader__.load({ id, factory })` registration shape a client bundle must have. React is taken from the module loader via `require('react')` rather than bundled.
- It registers one additive entry in `conversation.input.dock` (`replaceRisk: none`, so every shipped todo / goal / queue entry is untouched) and injects its stylesheet by creating a tagged `
数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。