Repair DeepSeek Harness sessions that refuse to load. 修好打不开的 DSH 会话文件。 修磁盘上官方 loader 拒读的 session.jsonl.zstd:seq gap / torn zstd / 缺 message.id。默认 dry-run,--apply 先 .bak.<utc>。 不修 Web Chat 「conversation Context … more than one start Match」(重复 tool-call id,如 read:0)——那是前端折叠,文件往往是好的。 不修 冷历史超时 / SSH abort;不会给空 callId 或悬空 tool/call 编假结果。
在 DeepSeek Harness 终端运行:
dsh plugin --profile web add "github:xiaoshenming/dsh-session-surgeon#main"Copy a session ID from the sidebar ⋯ menu, then paste it into a new chat so the new session can learn from the old one — the Codex-style “continue from this thread” move that stock DSH does not expose.
Also repairs DeepSeek Harness sessions that refuse to load — seq gap, torn zstd, lone surrogates, and events missing their message id. inspect also warns on dangling tool/call (no matching tool/result → next model request 400) but will not invent a fake result. 官方以后修加载器,也救不回已经坏掉的 session.jsonl.zstd。
Compatible with
@deepseek-ai/dsh@0.1.2-rc.1and 0.1.3-alpha format generations (session.vN.jsonl.zstd). Catalog, seq-range handling, and format version follow the installed runtime.
Stock DSH session ⋯ only has rename / fork / archive. There is no “copy ID”.
After this plugin:
Left sidebar, click ⋯ on a session → 复制会话 ID
Open a new chat and paste something like:
Continue from session session-1e66cda9-a046-4893-8f4b-b817080acbea.
Read that log if you need prior context.
or, for an agent with tools:
session_inspect id=session-1e66cda9-a046-4893-8f4b-b817080acbea
Then keep going from where that conversation left off.
The ID is the durable handle (with or without the session- prefix — same session). Fork duplicates a file; copying the ID lets a new session refer to the old one, the way people pass a Codex thread id around.
One command, same as other DSH plugins:
dsh plugin --profile web add "github:xiaoshenming/dsh-session-surgeon#main"
Restart dsh web. Then:
Developers working in a checkout can still use dsh plugin --profile web add link:"$(pwd)".
In an agent chat that has this checkout (or the installed plugin skills), 更新插件 is enough: scan official Discussions, absorb in-scope repair feedback, changelog, reply, push main via px (127.0.0.1:7897). See skills/dsh-session-surgeon-update/SKILL.md.
Real crash families from official Discussions:
seq gap in committed region.tmp plaintextDefault repair is dry-run. --apply writes .bak.<utc> first, never invents missing seqs, and fills missing message ids without dropping events. If a crash-recovery closer collided with a still-live writer (#1586), repair drops those synthetic closers and keeps the live tail instead of truncating at the first gap. A packed chunk row that overlaps already-committed seqs but continues through the cursor (#5151) keeps the uncommitted suffix. Compact refuses an unloadable file — repair first, with all writers stopped. Alpha compressed sourceEventSeqs ranges (#5160) are native on 0.1.2-rc.1+ (surgeon does not rewrite). Older rc.2 still cannot fold them — repair expands inclusive pairs into dense integers; nothing is invented. A validated Alpha model/selection event is preserved and marked ignorable: true for rc.2; arbitrary unknown plugin events are never changed. Empty tool_calls[].id (#5182) is flagged empty-tool-call-id; repair will not invent an id.
No dsh web required after the plugin (or this repo) is on disk:
npx --yes github:xiaoshenming/dsh-session-surgeon scan
npx --yes github:xiaoshenming/dsh-session-surgeon inspect <session-id>
npx --yes github:xiaoshenming/dsh-session-surgeon repair <session-id> # dry-run
npx --yes github:xiaoshenming/dsh-session-surgeon repair <session-id> --apply # writes .bak.<utc> first
Or from a clone: node bin/dsh-session-surgeon.mjs scan.
Agent tools after install: session_scan / session_inspect / session_repair (apply defaults to false).
| command | meaning |
|---|---|
scan [root] |
list sessions + header health + orphan .tmp |
inspect <id> |
decode every zstd frame, expand packed rows, report seq gaps / missing ids / dangling tool/call |
repair <id> |
default --dry-run; --apply rewrites after .bak.<utc> |
compact <id> --keep-last-turns N |
keep the last N complete turns, renumber seq from 0 |
export <id> |
JSONL dump; redacts secrets unless --no-redact |
index [root] |
session / parent / goal / health table |
--format text prints a human table. Exit 0 on success, 2 on usage error, 1 on not-found / refuse.
Not a marketplace, not a token heatmap, not a memory plugin, not a Codex task store.
DSH has session id + optional same-session goal id, not a Codex-style resumable task id. Copying the session ID is the closest everyday equivalent. See docs/LEARNING-TASKS.md.
--apply and write .bak.<utc> first. Windows: fsync on the read-only backup handle used to abort with EPERM after the copy already succeeded; --apply now treats that as best-effort.~/.dsh/sessions (they contain user text and secrets).@deepseek-ai/dsh-tools in dependencies.sk-*, PEM blocks, and home paths unless --no-redact.MIT
登录后即可为该插件评分和评价。
还没有人评价这个插件,来抢个沙发吧!