DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Rewind Plugin — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
R

@jochenyang/dsh-rewind-plugin

Rewind Plugin

DSH 的消息召回:将对话截回到所选用户消息之前,使该消息退出模型上下文,在记录中隐藏它,并将其原始文本放回输入框。通过内核自身的界面替换机制运行,因此不会从会话日志中删除任何内容。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:JochenYang/dsh-rewind-plugin#103421dfc703dfcdd8e5c89d8d6733a24957a739
README兼容性版本

兼容性与来源证明

Rewind Plugin 以 @jochenyang/dsh-rewind-plugin 发布,当前版本为 0.2.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/14

版本

0.2.0stable
2026/10/14
0.1.4stable
2026/10/9

相关插件

正在加载相关插件…

最新版
0.2.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/14
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 memory-context 分类下经过校验的插件。

Hindsight Coding Agents@vectorize-io/hindsight-coding-agents面向编程代理的仅反思式 Hindsight 长期记忆(可插拔支持多种运行框架:opencode、……),自动在后台导入(无需设置 CLI)。Ab Memorydsh-ab-memory--- description: "dsh-ab-memory 包:一种跨会话、基于文件的智能体记忆,提供五个工具(remember / recall / forget / load_skill / distill)以及始终启用的轻量注入。" kind: "package-reference" ---Contextdsh-context用于上下文洞察和管理的 DeepSeek Harness 插件,提供上下文仪表板和上下文命令,帮助了解上下文的构成及其演变过程。Memsearch Dsh@zilliz/memsearch-dsh适用于 DeepSeek Harness 的 MemSearch 插件:在多个代理之间共享 Markdown 记忆,支持捕获、步骤前上下文注入、记忆召回技能和技能候选审核面板。

README

dsh-rewind-plugin

dsh-rewind-plugin

English · 简体中文

Message recall for DeepSeek Harness: cut the conversation back to before a message you already sent.

A sent message cannot be edited or withdrawn. This plugin cuts the model-visible surface back to before a chosen user message, hides that message and everything after it in the transcript, and puts the original text back in the composer so you can correct it and send it again. Files the recalled turns changed are put back byte for byte, and every displaced byte is kept in a quarantine you can look into and clear. A recall that could not cover everything says so instead of claiming a clean revert.

See it

The recall confirmation dialog: one file will be restored, with its before/after diff, and the displaced bytes go to the quarantine

The confirmation dialog before a recall: which files the recall will change, a real before/after diff for each one, and where the bytes that were in the way end up. Nothing is deleted.

What it adds

SurfaceWhere
Per-message recall iconhover a user message in the transcript
/rewindbare lists the recallable messages; /rewind <n> recalls one; /rewind plan <n> previews without doing it
Composer prefillthe recalled text returns to the input box, once per recall
Settings → Recall quarantineits own page in Settings: every displaced file, grouped by session, discard per row or per session behind a confirm

The quarantine page registers into settings.section, the settings shell's own additive seat, so it sits beside the shipped General / Models / Plugins pages. A profile without the settings shell loses the page and nothing else.

Install

# from the registry
dsh plugin --profile web add @jochenyang/dsh-rewind-plugin

# or straight from the release tarball, no registry involved
dsh plugin --profile web add https://github.com/JochenYang/dsh-rewind-plugin/releases/latest/download/dsh-rewind-plugin.tgz

# or from the repository, built on install
dsh plugin --profile web add github:JochenYang/dsh-rewind-plugin

web is the shipped profile name — use whichever profile you run. Every form writes the package load it.

The official desktop client has no command for this. Its desktop profile is reserved for the Electron application, and the CLI refuses to touch it (error: profile "desktop" is managed exclusively by the Electron application). Install from inside the app instead: Settings → Plugins → Add plugin, enter @jochenyang/dsh-rewind-plugin under "Package name or address", install, and restart the app. That field also takes a Git address, a local directory or a .tgz, and the page says itself that a new plugin loads at the next start. load it.

peerDependencies deliberately declares no @deepseek-ai/dsh-* package. The installer compares every such peer against the running runtime version and refuses the install when it does not match, which would pin the plugin to one DSH release. This plugin needs nothing installed to run — the runtime packages below are already present in any DSH profile — so the check is skipped and any runtime version installs. The tradeoff is deliberate: a DSH release that breaks one of those interfaces will load the plugin and fail at that call, instead of being refused at install time.

Why nothing is lost

The session log is append-only and stays the source of truth. A recall appends one event carrying surfaceOp: { op: 'replace', startSeq, endSeq }, so the log keeps every event, and a reader that ignores surface ops still sees the full transcript.

Files are never unlinked. The bytes in the way move into $DSH_HOME/storages/dsh-rewind-plugin/quarantine/<session>/<slot>/ — with a manifest.json naming the original path — before the before-image is written back. A file the recalled range created is moved there rather than deleted.

A recall has to know what the range started from, so the plugin takes one bounded copy of the workspace before a turn's first writing tool and stores it content-addressed under $DSH_HOME/storages/dsh-rewind-plugin/{trees,blobs}. That copy is what makes a file a shell command rewrote restorable: the write / edit waterfalls still supply the exact before-image for the tools they see, and where the snapshot covered a path its bytes are the ones that go back.

What it needs at runtime

Resolved from the profile, never bundled:

@deepseek-ai/cordis, @deepseek-ai/dsh-commands, @deepseek-ai/dsh-session, @deepseek-ai/dsh-session-projection, @deepseek-ai/dsh-llm, @deepseek-ai/dsh-home-paths, @deepseek-ai/dsh-client-connection, @deepseek-ai/schemastery, zod.

The browser half requires only react, react/jsx-runtime, react-dom/client and @deepseek-ai/dsh-client-ui-primitives, all supplied by the shell's own module table. It does not list them in dsh.client.external because the shell already answers them.

Operational notes

  • One writer per session. DSH takes a cross-process exclusive write lock per session, held for the life of a write handle. Two DSH processes that share $DSH_HOME therefore cannot both write the same session: the second one's command execution is refused with session/writer-held, and a recall reports that the request never reached the kernel. Reading a session from a second instance is fine and different sessions never conflict — close it in the other window, or work in another session.
  • A recall needs an idle agent. A running turn is refused rather than raced, because cutting mid-turn would leave that turn's tool results without their call.

Known limits

  • A file changed by a tool this plugin cannot observe — a shell command, a script the model ran, a renderer — is covered by the workspace snapshot rather than by the write waterfalls. The snapshot is bounded (file count, total bytes, per-file bytes, a deadline, and the tool call's abort signal), so a very large tree, an unreadable file, a symlink or a timed-out walk can leave a path out. Every recall reports a coverage verdict — full, partial or none — with the reason and the writing tools involved, so a gap is visible instead of silent.
  • Dependency, VCS and cache directories (node_modules, .git, …) are outside coverage on purpose, so a recall that ran npm install does not report the dependency tree. Build output such as dist/ IS walked.
  • size + mtime unchanged counts as unchanged. A writer that restores an old mtime at an unchanged size is missed — the same bargain every sync tool makes.
  • The placeholder is an empty user/message. The DeepSeek provider's request path drops an empty user message, so it contributes no model-facing turn there; a provider that does not drop empty user content would see one extra empty message per recall.

Development

npm install
npm run build      # lib/index.js + lib/client.js
npm run typecheck
npm test           # bundles tests/*.test.ts with esbuild, then node --test

npm run build marks @deepseek-ai/*, @cordisjs/*, react, react-dom and zod external, and wraps the browser half in the window.__ModuleLoader__.load({ id, factory }) closure the web client loads. Never bundle an @deepseek-ai/* package: a second copy breaks class identity against the running host.

lib/ is committed, so dsh plugin add github:JochenYang/dsh-rewind-plugin installs without a build step — pnpm refuses to run a git dependency's build script unless the installing profile allowlists it. Run npm run build after changing src/; prepublishOnly does the same before a registry release.

Layout

PathWhat lives there
src/index.tsthe host half: /rewind, the write recorder, the snapshot/revert path
src/cut.tsthe recall computation — anchors, the replacement range, the placeholder
src/projection.tsthe rewindAnchors projection, the client's whole read face
src/routes.ts, src/quarantine.ts, src/snapshots.tsthe quarantine routes, listing/purge, and the before-images
src/trees.tsthe workspace snapshot store and its retention rules
src/recorder.tswhich file change belongs to which turn
src/wire.tsthe payload shapes and error codes both halves share
src/client.tsthe client half: icon, picker, prefill, hidden turns, the Settings page
src/client/the components, dictionaries and the injected stylesheet
cordis.patch.ymlthe one insert row that mounts the plugin

Changelog

Every release is documented in CHANGELOG.md, following Keep a Changelog 1.1.0. Version numbers follow Semantic Versioning 2.0.0. A Chinese mirror lives in CHANGELOG.zh-CN.md.

License

MIT