Skip to content
dsh.fish
Bundle

dsh-plugin-node-time

Hover timestamps for DSH web chat nodes — start–end (and duration) on Think, Bash and every tool/step row · 在 web 界面 hover Think/Bash 等会话节点行时显示开始-结束时间与用时的 DeepSeek Harness 插件

Source
focksor
stars
1 stars
License
MIT
Updated
Updated yesterday

Readme

# dsh-plugin-node-time

Hover timestamps for DSH web. Hovering a chat node row — Think, Bash, Read/Edit/Write, Search, commands, compaction markers, sub-calls — pops a compact card with that node's start time → end time and how long it took.

English | [中文](README.zh.md)

![platform](https://img.shields.io/badge/platform-web-blue)
![dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)
[![Listed on dsh-plugin.org](https://dsh-plugin.org/badges/listed.svg)](https://dsh-plugin.org/plugins/focksor/dsh-plugin-node-time)

## The card

```
11:30:05.123 → 11:30:09.123
4.00s
```

- **Range line** — start → end in your local timezone; the date prefix appears when the node didn't happen today (and the year when it wasn't this year). A still-running node shows `start → …` with the elapsed time ticking every second; the line flips to the final range the moment the call settles.
- **Duration line** — humanized: `830ms` / `4.33s` / `1m 23s` / `1h 02m 30s`.
- **Extra line** — assistant steps also show `TTFT` (time to first token) when the step has recorded one.
- **Styling** rides the host's `--dsw-alias-*` design tokens, so it follows your theme; the card is `pointer-events: none` and never intercepts the mouse.

## What gets a card

| Row | Start | End |
| --- | --- | --- |
| Tool rows (Bash, Read, Edit, Search, …) and every nested sub-call | tool/call time | tool/result time |
| Think rows and assistant steps | step/start time | assistant/message time |
| Commands, compaction, turn errors, retries, context rows | — | event time (single line) |

Rows whose times the host already shows on hover (user messages, the turn tail) are left untouched, and a node whose call event fell outside the loaded history window simply shows what exists — or nothing.

## How it works

- **Trigger** — one delegated `mouseover`/`mouseout` pair on `document` (capture). A hit on a row header — `[data-disclosure-row]` (generic tool rows, Think, commands) or `[data-sample]` (the Bash/Pwsh sample card, whose expanded output lives outside the row root, so sweeping output never pops the card) — resolves through `data-chat-call-id` (exact tool-call/sub-call attribution) or `data-chat-anchor-key` (chat node), then reads the timing out of the current session snapshot — read at hover time, so it is always fresh.
- **Data** — the `sessions` service: `ToolChatData.root` lifecycle (`callTime`/`time`), `AssistantChatData.finalNode.timing` (`stepStartTime`/`firstTokenTime`/`completedTime`), `node.location.step` boundary events for running steps, and `data.time` for single-time nodes.
- **Zero host DOM writes** — the card is a `position: fixed` element appended to `document.body`; React re-renders can never wipe it, and no host component is replaced or patched.
- **Style contract** — the injected `<style>` arrives pre-tagged with `data-plugin="dsh-plugin-node-time"`: the client module system's `claimStyles` re-assigns every *untagged* head style to whichever plugin materializes next (HMR bookkeeping), so an untagged style gets claimed — and possibly cleaned up — by a neighbour. (This exact race is why v0.1.0 cards sometimes never appeared.)
- **Silent by design** — missing `sessions` service, changed contracts, or truncated windows degrade to "no card"; the plugin can never break the host.

## Install

```bash
dsh plugin --profile web add dsh-plugin-node-time
```

Restart `dsh web` to take effect.

### From source (local development)

```bash
pnpm install
pnpm run build
pnpm test
```

Then add this package to `~/.dsh/profiles/web/package.json` as a `link:` dependency, register it in `dsh.profile.bundles`, and restart `dsh web`.

## Keywords

dsh · deepseek harness · dsh plugin · web plugin · client plugin · chat ui · tooltip · hover · timestamp · start time · end time · duration · elapsed · node timing · tool timing · think · bash · subcalls · assistant step · 时间 · 开始时间 · 结束时间 · 用时 · 悬浮 · 节点时间 · 工具耗时

Install

dsh plugin --profile web add github:focksor/dsh-plugin-node-time#b0fdc406ed4c309518ab3d0eca7c97e6716f92fa

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
Source