Overview
Open full-size image ↗
Open full-size image ↗
Open full-size image ↗
中文 | English
dsh-filesnap restores conversations and tracked files together in DeepSeek Harness (DSH). Preview the files to write, restore or delete, then confirm. Keep the original conversation in a branch, and use /redo to reverse a mistaken rewind. No Git required.
0.3.1 adds redo confirmation, Active/Inactive branch markers, and automatic startup migrations. Buttons return results over independent RPC without writing operation logs to the conversation.
English walkthrough (older version) · 2:29 · 中文演示(旧版)· 2:24
Version 0.3.1 requires FileSnap engine 0.5.1+. Publish the engine before the plugin. An unavailable preview interface refuses the restore.
Install#
dsh plugin --profile web add dsh-filesnap
Requires DeepSeek Harness (integration verified with 0.1.2-rc.1) and Node.js ^22.19 or >=24. Linux, macOS and Windows on x64/arm64 are supported. The FileSnap 0.5.1+ engine installs with the plugin. For headless use, replace web with headless.
Restart the profile. No manual loader entry is needed. When upgrading from 0.2.1 or earlier, remove the manually added id: filesnap entry from ~/.dsh/profiles/<profile>/cordis.patch.yml to avoid a duplicate with the bundle.
Rewind and redo#
- Let DSH complete at least two turns. Assistant action rows offer rewind when a corresponding snapshot is available.
- Click rewind and review the target turn and complete file list. Cancel or Escape closes the dialog without creating a branch or restoring workspace files.
- Confirm to create a branch, restore the files and open the recovered conversation. The original prompt is offered back in an empty composer, preserving existing drafts and attachments.
- To reverse the rewind, click the redo action in the new branch or run
/redo. Button results appear in an independent panel.
If files, ignore rules or the turn change after preview, preview again. Confirmation tokens expire after five minutes and are single-use. Partial restore failures identify affected paths. Full workflow and limits.
Workspace snapshots and cleanup#
Click Show snapshot status in the session header to open the independent Workspace snapshots panel:
- See workspace records and shared file content separately. Shared content spans workspaces and is not this project's exclusive disk usage.
- Inspect the snapshot turn count per session and the unprotected files with their reasons.
- Open cleanup, review its scope and confirm. It collects only unreferenced data, keeping retained snapshots, redo recovery data and workspace files.
- Usage refreshes after cleanup. These are current usage figures, not estimated savings; referenced content cannot be reclaimed.
Old sessions and snapshots are not automatically deleted. Automatic retention policies are not implemented. Button results do not append chat cards.
Upgrading older data#
Legacy ↩ titles become 🔴 Inactive ·. Successful rewind/redo marks the branch to continue in 🟢 Active · and the branch being left 🔴 Inactive ·. These describe branch choice, not Agent run status. Ordinary historical titles are not guessed to be Active.
After installing and restarting the profile, the plugin automatically scans, backs up and migrates unloaded legacy conversations. This runs when DSH loads the plugin, not in npm postinstall. DSH Settings → FileSnap → Data migrations shows startup results and provides manual scans, confirmation and retries for every versioned task.
The first task is Legacy session compatibility → 0.3.1+. It marks old filesnap/* events as ignorable, preserving message content, sequence numbers and fork boundaries. Each changed artifact gets an original backup beside it. Compatible data is skipped. Loaded sessions are skipped too: close them and scan again; if still loaded, restart DSH and visit Settings before opening those conversations.
The current task supports DSH JSONL and Zstd logs and leaves other plugins' events unchanged. Migration and offline recovery.
Commands#
| Command | Result |
|---|---|
/rewind |
In the web UI, choose a turn from a menu, then preview and confirm file changes. In the terminal, list available points. |
/rewind <turn> |
Preview file changes for the state before that turn. |
/rewind <turn> --confirm <token> |
Confirm with the preview token. |
/redo |
Preview files restored to the pre-rewind state, then confirm. In the web UI, select the menu item to open the confirmation dialog. |
/rewind status |
Report protection and disk usage. |
/rewind cleanup |
Preview collection scope and return a confirmation token. |
/rewind cleanup --confirm <token> |
Collect unreferenced data. |
Bare /rewind and /redo in the web UI open native pickers. Other typed commands use DSH's standard command-result presentation without a model turn. Browser buttons and the picker use RPC directly. A headless rewind returns the new conversation id for the caller to open.
Choosing between this and dsh-rewind-plugin#
Both support coordinated conversation/file recovery and Web controls. SiriLee's plugin emphasizes rewind in the same window, conversation-only mode and shortcuts. This plugin emphasizes preserved original branches, /redo, and content deduplication across paths and snapshots.
There is no verified “universally best” ranking. Read the source comparison and UI FAQ. The original storage experiments used plugin 0.2.2 with engine 0.4.0; they are not fresh measurements of this release. Seven dedup experiments.
Coverage and limits#
- Recovery needs a prior capture. Binary files, Git-ignored files and observed
ctx.fsedits outside the project can be protected. Ignore rules, size limits and timing still apply. - Capture happens before tools run; write/edit hooks observe pre-images. This is not a whole-computer backup.
- Branches share the workspace. Opening a conversation does not switch file copies. Inherited snapshots resolve through native lineage, so retain ancestor conversations and their snapshot data.
- The first turn has no preceding completed turn to keep, so no browser rewind is offered at that boundary.
- Preview is not a workspace lock. External editors can race the final write; a refused restore may leave an already-created empty branch in the session list.
- Conversation-only mode, per-file restore selection, line diffs and new global shortcuts are not implemented.
Configuration#
| Field | Default | Purpose |
|---|---|---|
command |
automatic | Optional engine executable. |
dataDir |
platform data directory | Separate snapshot storage outside the project. |
timeoutMs |
120000 |
Per-invocation time limit. |
graceMs |
2000 |
Termination grace after cancellation or timeout. |
maxOutputBytes |
1048576 |
Per-stream memory limit. |
autoMigrate |
true |
Migrate unloaded legacy sessions on plugin load; disable to use manual Settings migrations. |
declareEdits |
true |
Observe pre-edit content through the filesystem interface. |
Further reading#
Architecture · Migrations · Troubleshooting · Roadmap · Benchmarks · Cross-assistant work · Contributing
Discussions · Issues · License
