dpskh/dsh-rewind
将自上次检查点标记以来的所有内容折叠为一份自动生成的报告,在上下文中替换它,同时保留完整日志。
Project Overview项目介绍
@dpskh/tool-rewind is a DeepSeek Harness plugin that mounts ctx.rewind and a rewind tool, folding all exploration since the latest checkpoint into an LLM-generated report via the same surfaceOp: replace mechanism the harness uses for compaction, so subsequent requests no longer carry the intermediate steps while the durable log keeps them. It requires the sibling @dpskh/tool-checkpoint plugin to provide markers; mounting rewind alone fails with a no-checkpoint error. Note: the shrink check is character-based rather than token-based, and image blocks carry no text yardstick.
@dpskh/tool-rewind 是 DeepSeek Harness 插件,挂载后通过 ctx.rewind 服务和 rewind 工具,把最近 checkpoint 标记之后的所有探索步骤折叠成一份由 ctx.llm 自动生成的报告,采用与压缩相同的 surfaceOp: replace 机制替换会话表面,使后续请求不再携带中间步骤。需配合 @dpskh/tool-checkpoint 使用,否则因无标记而失败。注意:压缩检查基于字符而非 token,多模态块不计。
请帮我了解并安装插件:【dsh-rewind】【https://github.com/dpskh/dsh-rewind】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add github:dpskh/dsh-rewind
把 dpskh/dsh-rewind 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
@dpskh/tool-rewind — exploration fold for the DeepSeek Harness
English | 中文
One package, one entry plugin. Mounting @dpskh/tool-rewind provides ctx.rewind (a service that folds everything since the most recent checkpoint mark into an auto-generated report) and the model-facing rewind tool over it. The fold shadows the exploration's surface range with the report — the same surfaceOp: { op: 'replace' } mechanism the DeepSeek Harness compaction seam uses — so subsequent requests no longer carry the exploration's intermediate steps (reads, searches, experiments), while the durable log keeps the full exploration for audit. The report is produced by ctx.llm (auto-generated); the mark is owned and served by the sibling @dpskh/tool-checkpoint plugin (ctx.checkpoint.latestMark / hasActive / completeFold). This plugin writes no session events of its own — the fold commits only the core-vocabulary user/message replacement, so the durable session log stays readable by any harness. No upstream package is modified.
Configuration
- id: tool-rewind
name: '@dpskh/tool-rewind'
config:
toolName: rewind # model-facing tool name (default rewind)
maxTokens: 1024 # summarization output budget
maxSummarizationRetries: 2 # empty-completion retries before failing
summarizationProvider: deepseek # optional override of the routed provider
summarizationModel: deepseek-chat
reportLanguage: en # en | zh (report instruction language)
Provider/model resolution order for the report call: configured overrides, then the session's last routed request/header config, then the agent's options. Missing all three fails loud.
The report call runs with thinking disabled when the route exposes an off reasoning effort — condensing an exploration is mechanical, and a reasoning model's thinking tokens otherwise compete with the report text under maxTokens (thinking can exhaust the budget before any text starts, leaving an empty completion). Empty completions retry up to maxSummarizationRetries; an exhausted budget rejects with a message carrying the finish reason and token usage, which the rejection message preserves.
Working together
The fold needs a marker: mount both plugins so rewind can collapse the exploration anchored by a checkpoint. rewind alone has nothing to fold and fails with a no-checkpoint error; checkpoint alone records inert markers.
- id: tool-checkpoint
name: '@dpskh/tool-checkpoint' # https://github.com/dpskh/dsh-checkpoint
- id: tool-rewind
name: '@dpskh/tool-rewind'
config:
reportLanguage: en # en | zh report instruction language
Contract
ctx.rewind.rewind(agent, signal)— read the session's latest mark throughctx.checkpoint; select the surface span after it (never folding the rewind call itself, never splitting a tool-call/result pair at the trailing boundary); summarize the span overctx.llm; then commit, in one synchronous block, a replacementuser/messagecarrying the report with source marker{ kind: 'plugin', plugin: 'rewind' }(isRewindReportSourcerecognizes it) and stamp the mark folded throughctx.checkpoint.completeFold. Failures write nothing — the region stays intact, the mark stays active, and the fold is retryable — and reject with a classifiedRewindError(NO_CHECKPOINT,EMPTY_REGION,UNBALANCED,FOLD_IN_PROGRESS,CHANGED,SHRINK). A per-session in-process lock rejects concurrent folds. A mark taken mid-call — the checkpoint tool runs between its own tool-call and result — leaves that result orphaned right after the mark; selection skips exactly that node, so the checkpoint call's own pair stays visible and the fold starts at the exploration that follows. Exploration calls issued in parallel with the checkpoint (same assistant message) leave their results behind the mark too; those are folded, so a parallel exploration never collapses into an empty region.rewindtool — no arguments →{ markId, foldedNodes, start, end, foldedChars, reportChars }, wherefoldedCharsis the model-visible text the folded region contributed (assistant text, reasoning, tool-call arguments, and tool outputs) andreportCharsis the replacement report's length — the shrink accounting is visible in every result and error. Render intent: generic card.- Turn guard — while the session has an active (unfolded) checkpoint mark,
agent/turn-stoppinginjects a standing warning into the agent's next-step inbox (one per agent per turn), so the turn cannot end untilrewindfolds the exploration. Activeness is read throughctx.checkpoint. A rewind that legitimately fails (e.g. an empty region) cannot trap the turn in a warning loop.
Model Experience
Directly: the rewind tool call and its fold result. The replacement report message is model-visible from the next request on; the exploration's durable events stay in the log but out of the model-visible surface. A tool:rewind system-prompt section makes fold discipline a standing instruction (rewind immediately after the marked exploration, before unrelated work).
KV Cache effect
The report call reuses the session's system prompt and tool schemas so it stays a prefix of the last routed request (warm prefix cache). The fold itself shifts the model-visible prefix of subsequent requests by design.
Known Limitations and Deferred Work
- Shrink check is char-based — the report must be shorter than the folded region's model-visible text (measured in characters, not tokens); the yardstick counts every block the model reads: assistant/user text, reasoning, tool-call arguments, and tool outputs (recursively). A token-meter-based check would be more precise; image blocks carry no text yardstick and are conservatively ignored.
- Empty completions on routes without an
offreasoning effort — such routes keep their default thinking; if thinking exhaustsmaxTokensthe completion is empty and only the retry budget saves the fold. - One fold per marker — folding the same marker twice is rejected as an empty region; a new exploration needs a fresh
checkpoint. - Mid-exploration compaction — if automatic compaction shadows part of the exploration before
rewindruns, the fold covers whatever remains on the surface; the storage-resident mark survives either way.
liangmianya/dsh-synapse
alaliqing/claude-paper
omdsh-dev/dsh-annotation
Anionex/dsh-turn-rewind
hanshenmesen/dsh-turn-delete
qkycir-123/dsh-run2skill
Tyan66666/billion-context-dsh
PKUfudawei/dsh-capability-menu