DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

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

dsh-replay-theater

Replay Theater

以原始令牌节奏回放 DeepSeek Harness 会话——支持播放/暂停/单步/调速/定位的应用内回放剧场。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:ItBayMax/dsh-replay-theater#10638014fc2d337e13e4bbab8628ea4dbb87e090
README兼容性版本
The Theater tab replaying a recorded sessionTransport controls and the marker railTwo runs compared, with the first divergence highlighted

兼容性与来源证明

Replay Theater 以 dsh-replay-theater 发布,当前版本为 0.1.2。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

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

版本

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

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

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

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

认领这个 Plugin →
报告问题

README

dsh-replay-theater

English | 中文

Replay a DeepSeek Harness session at its original token cadence — an in-app playback theater with play, pause, single-step, speed and seek.

Not a static timeline: the assistant's answer grows token by token, spaced by the real millisecond gaps recorded when it was generated.

The Theater tab replaying a recorded session

More screenshots — transport controls, and side-by-side comparison

Transport bar and marker rail. Play/pause, single-step, restart, scrub, speed, and a "max pause" ceiling. Scalar events (step/start, tool/result, …) sit on their own rail, and the bar states how much silence was compressed — playback alters timing, so it says so.

Transport controls and the marker rail

Side-by-side comparison (v2). Load a recorded session.jsonl next to the live one and the theater reports where the two runs stop matching, with a seek coordinate for each side.

Two runs compared, with the first divergence highlighted

Why this exists

Upstream keeps every token's real inter-arrival gap in the session log, and says why:

// packages/core/session/src/chunk-rows.ts:44
/** Epoch-ms gaps between consecutive members; length is one less than the member count. */
dt: number[]

"one entry per member, never joined — token boundaries are data" — chunk-rows.ts:48

Packed storage deliberately does not join a run's members into one string, so the cadence survives. Nothing in the harness used that data. This plugin does.

Install

dsh plugin --profile web add dsh-replay-theater

Or from a checkout:

dsh plugin --profile web add "github:ItBayMax/dsh-replay-theater#main"

The package declares dsh.bundle, so the CLI reconciles it into the profile's layer list automatically — no manual cordis.patch.yml edit. Restart dsh web and open a session: a Theater tab appears beside Chat and Trajectory.

Use

ControlBehavior
▶ / ❚❚Play or pause. Playing at the end restarts from the beginning.
⏴ / ⏵Step one frame (one token) back or forward. Stepping pauses.
⤾Restart, paused, keeping the chosen speed.
ScrubSeek to an absolute position.
Speed0.5× to 8×.
Max pauseCompress silences longer than this (200 ms … ∞). ∞ keeps true wall-clock cadence.
Load earlier historyPage one older window in. Playback keeps its position.

When any silence was compressed, the transport bar says so and by how much. Playback alters the data's timing, so it tells you.

What it replays

Everything the browser's session window holds: assistant text, reasoning, and tool-call arguments — each as its own stream — plus scalar events (step/start, tool/result, …) as markers.

Tool calls show as accumulating JSON plus the tool name, not as full tool cards. Cards are ui-tool's job; this plugin is about cadence.

Limits

  • No random access. The dsh client cannot request an arbitrary sequence: history pages backwards only, one window at a time (session.loadOlder()), and a production tail page can hold hundreds of thousands of events. So the theater replays the loaded window and gives you an explicit "load earlier" action rather than silently pulling an entire log into the browser.
  • Long silences are compressed by default (2000 ms ceiling). Set ∞ for true cadence.
  • Live sessions grow under you. The window is followed, and playback keeps its position when frames are appended.
  • Types are mirrored, not imported. @deepseek-ai/dsh-api-session-controller is not published to npm, so src/core/wire.ts and src/client/dsh.ts carry structural mirrors of the upstream shapes, each annotated with the file:line it was read from (pinned to dsh 0a53fb5 / 0.1.2-alpha.2). They are structurally compatible, so swapping them for real imports later needs no call-site changes.

Compatibility

Developed against dsh 0.1.2-alpha.2 (upstream commit 0a53fb5). It reads only the public client surface — session.eventSource and session.loadOlder() — because upstream removed an entire client package (client/runtime) in 0.1.2; depending on internals is not survivable.

Development

npm install
npm test          # 158 tests
npm run typecheck

The replay core (src/core/) is framework-free and dsh-free, so its rules are unit-tested without a browser or a harness checkout:

npx vitest run tests/timeline.spec.ts tests/player.spec.ts

Test fixtures come in two kinds, for a documented reason:

  • tests/fixtures/synthetic.ts — hand-built records with exact dt arrays. Cadence assertions live here.
  • tests/fixtures/corpus-*.json — derived from an upstream recorded session by make-corpus-fixture.mjs, to prove the wire mirror accepts real shapes. It cannot carry cadence assertions: the upstream corpus normalizes seq/time away, and the longest consecutive same-block delta run in all 118 snapshot sessions is 2 members.

See docs/ for the architecture and per-phase implementation notes.

Offline CLI

The replay core is framework-free, so the same functions the browser tab uses also work in a script:

npm run build
node scripts/replay-cli.mjs path/to/session.jsonl --frames 20
node scripts/replay-cli.mjs run-a.jsonl run-b.jsonl        # compare two runs

Comparing two upstream snapshots, for example, reports where they stop matching:

comparison: diverged at frame 14 (marker-type), left seq 15 / right seq 15

License

MIT