
Anionex/dsh-turn-rewind
dsh-turn-rewind
DSH — rewind conversation and workspace state, powered by a persistent Change Ledger
Install
npx @deepseek-ai/dsh plugin --profile web add @anionex/dsh-turn-rewindRestart `dsh web` after install. Bundle APIs can change during the developer preview.
README badge
[](https://dshhub.dev/plugins/dsh-turn-rewind)Paste this into your README. The star count updates with every catalog sync.
From the README
Excerpt from Anionex/dsh-turn-rewind, cleaned of badges and images.
DSH Turn Rewind
Message-anchored project-file recovery for DeepSeek Harness, with an option to restart from the restored request.
Turn Rewind is the user-facing feature, repository, and Profile Bundle name. Change Ledger is the durable restore engine underneath it: the ctx.changeLedger service, on-disk format, and storage path keep that name because they describe the reusable snapshot and recovery layer rather than the Web action alone.
Change Ledger gives a DSH session an explicit safety boundary around workspace mutations:
create restore point
↓
agent / user / external tools modify the worktree
↓
preview exact path-level drift
↓
review a full or selective restore plan
↓
press the final restore button in the rewind dialog
↓
create rescue point → restore → verify
It never commits, stashes, resets, switches branches, edits the Git index, or decides automatically that a change should be reverted.
What's new
Most recent work first:
- File rewind works in ordinary directories (0.3.0) — when the working directory is not a Git repository it is snapshotted as an ordinary directory (
.gitandnode_modulesexcluded by default, plus an optional.dsh-rewindignore), so messages-only rewind is no longer the only option. - The fastest path is now the default (0.3.8) — the new
automode uses Git-native checkpoints in a Git worktree (reusing the repository object database, so committed content is never stored twice) and the plugin's own store for ordinary directories. - Unchanged files are no longer re-read (0.3.5) — each workspace keeps a persistent path identity cache; a measured 20 000-file / 351 MB workspace dropped from 237 s to about 7 s per capture.
- One oversized file no longer discards a whole checkpoint (0.3.3) — it is skipped and reported while the rest is still captured, and a restore never touches a path its checkpoint did not record, so a file that was too large then and small now is never deleted.
- Checkpoint budget 5 s → 60 s, parallel capture (0.3.4) — a 5-second budget in a large directory could only ever report a skip.
- Rewind button and messages-only fixes (0.2.2 / 0.2.3) — adapted to the DSH 0.1.2-alpha client hooks and restored the messages-only mode that the Host rejected.
- Settings card matches the official cards (0.3.6 / 0.3.7) — one collapsed row that expands, consistent with every other plugin card.
Preview
Rewind appears as an icon-only third action under each user message, after its timestamp and native Copy action:
Opening it shows the affected files and offers three choices: restore the files and restart from before that message, restore only the files, or rewind only the messages and leave the files untouched:
Why it has a Change Ledger engine
A diff button can show current changes, but it does not own a durable restore lifecycle. Change Ledger owns:
- content-addressed restore-point manifests;
- Git worktree, HEAD, branch, and in-progress-operation fences;
- stale-plan detection between review and mutation;
- exact two-step confirmation plus DSH human approval;
- automatic pre-restore rescue points;
- post-restore hash verification;
- rollback after a failed restore;
- startup reconciliation of interrupted restore journals;
- a public
ctx.changeLedgerservice that other plugins can consume.
…
