Adds a "History" conversation view tab listing the session's user messages as a clickable directory, with auto-paging and click-to-jump back into the chat.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-chat-history
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:Stylelinzzz/dsh-chat-history
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
A "History" tab in the DeepSeek Harness session header: turns the user messages of the current session into a clickable directory. Click any entry to jump back to the Chat view and scroll to that message.
- Auto-generated: only real user questions (
usermessages) are listed — Tool / Thinking / Command / injected-context noise is filtered out, so even long agent sessions stay navigable. - Auto-paging: while the tab is active it keeps loading older history (50 messages per page) until the whole session log is in the client window — the directory is complete without manually scrolling the chat area.
- Click-to-jump: switches back to the Chat tab, smooth-scrolls to the target message, and flashes it for 1.5s.
- Zero conflicts: registered as a
conversation.viewsession tab (side by side with the official "Trajectory" tab) — it does not occupy thedetailsslot, so the official tool-call detail panel keeps working untouched.
Install
# install into a profile (e.g. web)
dsh plugin --profile web add dsh-chat-history
After restarting dsh web, open any session: the header tab bar shows Chat / Trajectory / History. Click History to use the directory.
Usage
- Open a session and click the History tab in the header.
- The directory lists every user message in order (number + single-line truncated title; hover shows the full text).
- The header shows loading state: "Loading earlier history…" while older pages are being fetched, or the total entry count once complete.
- Click any entry — it switches back to the Chat tab, scrolls to the message, and flashes it.
Development
- Pure client plugin: a hand-written
window.__ModuleLoader__.load({ id, factory })bundle — no build step required. - No restart needed after editing
lib/client.js: the profile's built-inclient-hmrstat-polls bundles every 500ms and hot-reloads on change (roughly 1s). - A restart is required when: adding a new plugin package, changing the
dsh.clientdeclaration inpackage.json, or toggling enable/disable incordis.patch.yml.
Compatibility
The plugin adapts to both DSH client data layouts and picks one at runtime:
| DSH | chat node source | cross-view switch |
|---|---|---|
>= 0.1.5 |
useChat((s) => s.order) / useChat((s) => s.nodes) |
openView("chat") |
<= 0.1.0-rc.x |
useSession((s) => s.chat.order) / s.chat.nodes |
click the Chat tab button |
The variant is selected by whether the useChat prop is injected (DSH 0.1.5 removed dsh-client-runtime and moved chat nodes out of the session snapshot into that hook). Sessions, paging state (hasMore / loadingOlder), the data-chat-anchor-key DOM anchors and the node kind === "user" shape are unchanged across both, so the directory logic itself is shared.
Requires a DSH build whose
conversation.viewslot is declared bydsh-client-ui-conversation(the official "Trajectory" tab is the reference implementation).
How it works
- Data source: the ordered chat node keys + keyed node store, filtered to
kind === "user"(see Compatibility for which hook supplies them). - DOM targeting: ui-conversation already stamps every message node with
data-chat-anchor-key— lookup by key directly. - Paging:
session.loadOlder()pulls 50 messages per page, driven byhasMore/loadingOlder; a 200-page budget backstops a host that keeps advertising more history. - Jump: since only the active view renders, first switch back to the Chat view (official
openViewon 0.1.5+, tab click before that), then poll for the target DOM andscrollIntoView+ flash.
License
MIT
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8296
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8296
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
omdsh-dev/DSH-better-sidebar★ 3968
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
ccch1mneyyy/dsh-TUI★ 3948
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 3877
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1413
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.