DeepSeek Harness Plugin

SpookySandwich/dsh-plugin-message-edit

Stars ★ 15 Downloads (30d) 1,810 Category Sessions & Messages Added 2026-08-23 npm dsh-plugin-message-edit

Edit a sent message to rewind and branch the conversation from that turn, switch versions with a counter under the bubble, and browse every branch in a turn-level version tree.

Install

# from npm (prebuilt)

dsh plugin --profile web add dsh-plugin-message-edit

# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)

dsh plugin --profile web add github:SpookySandwich/dsh-plugin-message-edit

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

English | 简体中文

CI

Edit a message you already sent and the conversation rewinds and branches from that point, the way ChatGPT, Claude and DeepSeek all do it. The old version is not overwritten — a ‹ 2/4 › counter appears under the bubble, and a Versions tab draws the whole tree.

demo

Version Tree Visualization

No matter how deeply conversations diverge or how many times prompts are edited, the Versions tab projects a clear, turn-level branching hierarchy with real-time active path highlights and instant navigation:

Version Tree

What it does

  • Edit and branch. Revise a past prompt and send: a new branch regenerates from the full context before that turn. This is a true rewind, not a fork that continues from the end.
  • Version counter. When a message has alternatives, ‹ n/m › appears beneath it. The arrows move between them instantaneously.
  • Version tree. A Versions tab lays the branches out as a graph you can pan, zoom and drag. The current path is highlighted; click any node to jump to that conversation.
  • Zero-flicker instant switching. Family-aware SWR client caching enables 0ms version switching and graph navigation without indicator flicker or loading delays.
  • In-memory host caching. Parsed turns and version metadata are cached in host memory, eliminating redundant disk I/O and JSON parsing for deep branching trees.
  • Automatic cancellation. Branching immediately cancels any still-streaming obsolete sibling turns across the conversation family to save tokens and compute.
  • Retry. Re-run a turn without editing it (Claude layout).
  • Copy. Put the message text on the clipboard.
  • Durable. Every branch is a real persisted session, and version links are stored as durable events so the tree survives restarts. New branches automatically group into the parent session's workspace.

Interface style

The three interfaces this imitates differ in where the controls sit and which ones exist, so the preset changes exactly that — never the colours, which stay native to DSH. Pick one under Settings → Message Tree; the panel previews it live.

Preset Controls under the bubble Shown Editor buttons
ChatGPT edit, copy on hover Cancel / Send inside the box
DeepSeek edit, copy always — like DSH itself Cancel / Send inside the box
Claude retry, edit, copy on hover Cancel / Save below the box

Only Claude offers retry on a user message, matching the real interface. There is no share button, because DSH has none.

Install

dsh plugin --profile web add dsh-plugin-message-edit

Restart DSH afterwards — the host half loads with the server. The interface follows DSH's display language (English / 中文).

How it works

DSH sessions are append-only event logs with no in-session branching, so a rewind has to be built:

  • The host half serves /message-tree. Editing a message creates a new session seeded with every event before the target turn, writes a durable message-tree/version marker naming what changed, and submits the edited prompt.
  • Those markers are read back to reconstruct the tree, the ‹ n/m › ring, and which branch you are currently on.
  • The marker is written with the envelope's ignorable flag. Plugin event types live outside the harness vocabulary, and without that flag the reader refuses to interpret the whole log — the session simply fails to open.
  • Only the plain user message node is shadowed, at priority -1. Reasoning, tool calls and steering rows keep the host renderer.

The host-side branching logic derives from dsh-message-edit (MIT © Moeblack), reworked for ChatGPT-style rewind semantics, sibling fan-out, and the interface presets above.

The names are similar, so to be explicit: this is a separate plugin. Its route, cordis id and durable event type keep a distinct message-tree spelling precisely so both can be installed side by side without colliding.

Documentation

For technical details and developer guides, see:

Compatibility

Version 1.2.1 (current source): Fix DSH 0.2 client activation and route edits, retries, and version switching through uiWorkspace.openSession.

Version 1.2.0: Unarchive a version through workspaceRegistry.unarchiveSession on official dsh 0.2.0-rc.2.

Version 1.1.0: Fix seeded edit/retry creation, clear inherited pending input before publication, identify version markers by session ownership, preserve reasoning effort, and read persisted branches through disposable session observations.

The declared host range is >=0.2.0-rc.2 <0.3.0-0; official dsh 0.2.0-rc.2 satisfies it. Keep the previous plugin release on older DSH. Validation record.

Install published versions from npm. To test the current source, run npm ci and npm pack, then dsh plugin --profile desktop add ./dsh-plugin-message-edit-1.2.1.tgz. See the release procedure for publication checks.

Version 1.1.0 has been verified in an isolated DSH 0.1.5-rc.2 Web environment: plugin loading, images, edit/retry, nested branches, and restored sessions. Model responses use a local test adapter; remote model services were not exercised.

The compatibility layer retains the older events / seedLength interfaces, covered by automated tests. This release targets official dsh 0.2.0-rc.2. Restart DSH after updating the plugin.

Coexists with dsh-plugin-smooth-stream and dsh-plugin-rollout-scout.

License

MIT © SpookySandwich. Portions of the host half derive from dsh-message-edit (MIT © Moeblack).

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →

Community comments

Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.