Skills Plugins MCP Prompt Model 导航 博客 资讯 我的中心

dsh-session-repair-ui

会话头部修复按钮:检测并修复日志损坏,如 tool_call 串号、空 id、未知事件和 torn tail。

semidia @semidia ⬇ 1 ★ 1 main

安装

dsh plugin --profile web add github:semidia/dsh-session-repair-ui
下载安装清单

需要可复现安装时,可在仓库后追加 #commit 固定提交。

会话头部修复按钮:检测并修复日志损坏,如 tool_call 串号、空 id、未知事件和 torn tail。

该插件未提供要点说明,请参考仓库 README。

  1. 安装并启动 DeepSeek Harness:npx @deepseek-ai/dsh web
  2. 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
  3. 用 dsh plugins list 确认已安装,必要时重启 Harness 生效

插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。

代码仓库github.com/semidia/dsh-session-repair-ui
许可证MIT
主要语言main
下载量1
GitHub 星标1
最近推送2026-08-15
收录日期2026-09-19
分类会话与消息

事实信息来自公开插件目录快照(2026-10-01),介绍文案由本站再加工。

以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。

# dsh-session-repair-ui

在 DeepSeek Harness 的会话头部(「导出会话」按钮旁)增加一个「**修复会话**」按钮,用于检测并修复会导致会话「加载失败 / 发不了新消息」的日志损坏:

> 1. 助手消息声明了某个工具调用 id(`tool_calls`),但落盘的工具结果却记成了另一个 id —— 接口在续写历史时报
>    `An assistant message with 'tool_calls' must be followed by tool messages responding to each 'tool_call_id'`。
> 2. 模型输出了 **id 为空的工具调用**(`tool-call id=""`、`tool/call callId=""`、`tool/result source.callId=""`)——
>    会话加载时报 `session event at seq N message must have tool source`,整个历史被拒载。
> 3. 停用/移除插件留下的**未知事件类型**(如 `polyglot/served`)——加载时报 `SessionFormatUnsupportedError: … unknown to this harness and not marked ignorable`。
> 4. 崩溃写入留下的 **zstd 尾部残缺帧**(torn tail)。

## 功能(v2)

- 点按钮弹出面板,自动**只检测当前会话**(只读,不改任何东西)。
- 诊断分类显示:`无损坏 / 发现 N 处空工具调用 id / N 处调用-结果串号 / N 个未知事件类型(可安全修复)/ N 处需手动处理(seq 缺口 / 版本不匹配)`。
- 可安全修复项(自动):
  - 调用-结果 id 串号 → 重映射(同 turn 内数量相等时);
  - 空工具调用 id → 补确定性合成 id(`repaired-call--`,message / tool/call / tool/result 三处一致);
  - 未知事件类型 → 事件信封标记 `ignorable: true`(官方信封契约的"可安全跳过"机制);
  - zstd 尾部残缺 → 截断到最后一个完整帧(与 DSH 自身 crash-repair 行为一致)。
- 只报告不自动修:seq 缺口/重复、header 版本不匹配(日志由更新版本 harness 写入)、torn 之外的不平衡。
- 修复前自动备份(`.bak-repair`),**绝不删已提交事件、绝不改 seq**,其余字节原样保留。
- 修复成功后面板提示「已修复 N 处,请刷新页面重新打开本会话」。
- 样式遵循全局规则:幽灵式(透明底 + 细边框 + 主题文字色,激活态表面色填充),按钮与弹窗内部全部使用 `--dsw-alias-*` 主题变量,浅色/深色/任意强调色主题下都清晰,与 DSH 官方按钮一致。

## 原理

修复逻辑在包内自带的 `tools/repair-toolcalls.cjs`(zstd 帧级读写,v2)里:

1. **加载门分析**(`analyzeLog`):模拟 DSH 加载校验——header 版本、事件类型白名单(内置 `KNOWN_EVENT_TYPES` 镜像 + chunk 存储行标签)、chunk 行展开后 seq 连续性、JSONL 可解析性、zstd 帧完整性。
2. **工具调用配对**:按 turn 折叠「声明/发起的工具调用 id」与「结果 id」;`dangling`(有调用没结果)与 `orphan`(有结果但 id 对不上)数量相等时重映射;`empty` 三队列(空 block/toolcall/result id)平衡时补合成 id;不平衡只报告、不猜。
3. **未知事件 → ignorable**:白名单外且非 chunk 存储行、未标 `ignorable` 的事件,标记 `ignorable: true`(纯诊断/插件事件可安全跳过,不参与 surface 折叠)。
4. **torn 尾截断**:`scanZstdFrames` 找到最后一个完整帧之后的残缺字节,截断(备份后),与 DSH `dsh-session-persistence-jsonl` 的 crash-repair 语义一致。
5. **修复后自验**:重跑加载门 + 配对分析,无残留才报告成功。

## 安装

1. 把本目录放到 web profile 的 `node_modules/dsh-session-repair-ui`(或建 junction)。
2. 在 profile 的 `cordis.patch.yml` 里加一行:

```yaml
- insert:
    - id: dsh-session-repair-ui
      name: 'dsh-session-repair-ui'
```

3. 重启 `dsh web`。

## 架构

- Host(`lib/index.js`):通过 `ctx.connection.rpc.handle('/dsh-session-repair-ui', …)` 暴露 `repair/scan`(dry-run)与 `repair/apply`,内部用 `node:child_process.execFile` 调用包内修复工具;摘要解析会区分「空 id 修复数」与「串号重映射数」返回给前端。
- Client(`lib/client.js`):`window.__ModuleLoader__.load` 客户端,注册到 `conversation.session.header.utilities`,通过 `rpc.call` 调 Host;按钮与弹窗均使用幽灵式样式(`--dsw-alias-*` 主题变量:透明底、细边框、主题文字色,hover/激活态用 `--dsw-alias-interactive-bg-hover/active` 表面色填充)。

## 独立 CLI

修复工具也可脱离 UI 单独用:

```powershell
node tools/repair-toolcalls.cjs --root  --dry-run
node tools/repair-toolcalls.cjs --root
```

## License

MIT

数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。