# Task Details Sidebar (DSH plugin) English · [中文](./README.md) Every finished turn in Chat gets a **"View task details"** button. It opens that task's detail panel in the right sidebar; the panel width is draggable, and widening it expands each file row into full detail (saved path, date, size, line count, whether it still exists). What it is for: **after a task ends, you should not have to scroll back through the transcript to see what it read, what it changed, which tools it used, and how many tokens it burned.** What the panel shows: | Block | Implementation | |---|---| | The trigger | A button under each task (`conversation.chat.turnTail` slot) | | Input files | Files this task read, plus the user's message text and attachment names | | Intermediate artifacts | Files under temp/build/`.dsh` directories, `MEMORY.md` memory files, session logs (`.jsonl.zstd`) | | Output files | Files this task wrote or delivered; each opens a preview | | Tools / skills used | Call count, failure count, average duration; `skill` invocations listed separately | | Languages and shells | Languages inferred from file extensions, shells executed, command count | | Reusable? | A verdict based on delivered files, script output, skill use, and project changes | | Task flow | A step-by-step timeline, one row per tool call, failures marked in red | | Provider, model, usage, cache | Provider/model, input/output/cache-read/cache-write/reasoning tokens, cache hit rate with a progress bar | ## Install ```sh dsh plugin add dsh-task-details ``` Restart the DeepSeek Harness desktop app afterwards. Reopen any past task and the button appears at the bottom of it. From a source checkout: ```sh git clone https://github.com/zzt0818/dsh-task-details.git dsh plugin add link:./dsh-task-details ``` ## Development ```sh npm run build # inline the modules into the single browser artifact client.js npm test # run the whole suite ``` `client.js` is generated by `build.mjs`. Do not edit it by hand. ## Layout | File | Role | |---|---| | `index.js` | Host half: `POST /api/plugins/ui-task-details/describe` and `GET .../journal` | | `analyzer.js` | Pure functions: fold the session event stream into per-task inputs, tools, usage and files | | `model.js` | Address format, formatting, language inference, reuse verdict | | `details.js` | The panel view (with drag-to-resize) and the turn-tail button | | `preference.js` | Panel width preference, shared across tabs | | `styles.js` | Styles, built entirely from the host's `--dsw-alias-*` theme tokens | | `copy.js` | Chinese and English strings | | `client-entry.js` | Browser-side registration: slots, tab type, styles, dictionaries | | `client.js` | **Build artifact** produced by `build.mjs` | | `cordis.patch.yml` | Bundle patch that inserts the Host plugin row | | `icon.svg` / `locale/*.json` | Plugin icon and display metadata | ## Design notes - **The session journal is the source of truth.** The panel reads `sessions.binding(id).session.eventSource` directly rather than the Chat transcript, so tool calls Chat folds away are still visible, and the panel stays correct after reopening a past task or reconnecting. - **The Host half only adds what the browser cannot know**: whether a path still exists, its size, modification time and line count, plus where DSH keeps memory files and session logs under `.dsh`. - **The layout responds to width**: 460px by default, file rows expand at ≥560px, and the panel becomes two columns at ≥700px. The width is stored in `localStorage` and shared by every details tab. - **Theme-following**: every colour comes from a host token, so light and dark mode both work. ## Known limits - Inputs only count files a tool actually read, plus message attachments. Files you edit outside DSH are not recorded — that is an inherent limit of the session journal. - The panel only covers the part of the session the Chat has loaded. Older tasks need the Chat scrolled up first. - File paths in tool results come from `` markers and `file_path`/`path` arguments. Files created by a `>` redirection in a plain command line cannot be identified statically; they are reported as "path not seen" rather than invented. ## License [MIT](./LICENSE)