# dsh-viewtune [中文](./README.md) A **reading** tab for DeepSeek Harness: while a turn runs you can see the process — thinking as it is written, tools as they run, which step it is on. When a turn finishes successfully the process folds away and the final answer stays. Over that sits an adjustable skin: a wallpaper, a frosted-glass layer, and a panel that keeps its settings inside the reading tab. Upstream's Chat / Trajectory tabs, the composer, the model picker, tools and approvals are all untouched; this plugin adds a reading view alongside them. Targets DeepSeek Harness **0.1.5-rc.2**. Display only — it does not change agent execution, the SDK, or credentials. Node.js `^22.19.0 || >=24`. ## Install Needs the official `dsh` on PATH (or `npx @deepseek-ai/dsh`) and **pnpm** — `dsh plugin add` runs pnpm inside `$DSH_HOME/profiles/web`. ```sh # from GitHub dsh plugin --profile web add github:Farewish/dsh-viewtune # or from a local directory / tarball dsh plugin --profile web add ./dsh-viewtune dsh plugin --profile web add ./dsh-viewtune-0.4.1.tgz ``` **Restart the Host** and reload the page afterwards: `dsh plugin add` only writes the profile, it does not hot-mount a running process. Remove it with: ```sh dsh plugin --profile web remove dsh-viewtune ``` Three things that are easy to get wrong: - `dsh.bundle` is captured **at boot**; do not hand-write the same insert into the profile's `cordis.patch.yml`, or it mounts twice. - The compiled `lib/` is **committed**, so installing needs no `prepare` and no `allowBuilds` in the profile. - Do not install this alongside upstream `dsh-better-display`: both bundle patches insert the same entry id, and mounting both duplicates it. `remove` this one first. ## What a turn looks like A conversation is a sequence of **turns** (a prompt plus its answer), and the reading view is organised by that unit: - **The process is visible**: thinking, tool calls, subagents and progress are rendered live, so a long turn is more than a spinner; a turn that **finished successfully** folds its process away and keeps the answer, while a running or unfinished one stays open. - **Every user message comes first**: a turn may open with a system prompt and carry several user / steering messages. They are all rendered, in source order, above the process disclosure — with or without a system prompt, the order is the same: ``` your messages → the disclosure (用时 X 秒, clickable) → the process (system prompt / thinking cards / tools / answer) ``` - **Short and long thinking share one frame**: a short thinking card no longer loses its border just because nothing overflowed; heading and body padding match the long one. - **A wait clock**: while the model is thinking or streaming, the status row shows how long *this turn* has been with the model. It shows **nothing for the first 3 seconds** (most waits are shorter, and a number appearing immediately only pulls the eye), and adds a 「暂未响应」 badge past ten. It is anchored to the **last handover** — a tool returning, context injected, a command finishing, your own message — not to the start of the turn, so a fresh wait does not inherit the minutes the tools already spent; and it does not tick while a tool is running, because then the tool is busy, not the model. - **A steps pill**: the action row under an answer says which step this answer landed on and how many the turn has, and opens the turn's process record in Chinese prose rather than raw JSON. - **Changed-line counts**: a tool row that changed files ends with `+N -M` (additions green, deletions red) and opens a per-file diff panel. The counts prefer the host's own `meta.diffs` and only fall back to the call's arguments — and only for the **three tools that actually mutate files**, because several unrelated tools carry a field named `content`; files changed by a child call count towards the row too. - **Interactive mcp-app cards**: an ````mcp-app```` code block in an answer becomes a live card inside `