前言¶
DeepSeek Harness (DSH) 的设计理念是“一切皆插件”。在 Web 端使用 @ 触发会话候选时,DSH 官方引擎会对每个持久化会话完整解压并逐行解析 session.jsonl.zstd 来获取最新标题。随着会话数量增加,每次按键都要扫描大量日志,且缓存机制(LRU 仅缓存 5 个)难以应对高频查询。dsh-title-index 旨在通过磁盘索引解决这一性能瓶颈。
是什么¶
这是一个为 dsh Web 端会话标题读取加磁盘索引的插件,由维护者 gtaifu 开发,遵循 MIT 许可证。
核心功能¶
替换官方行
通过 cordis.patch.yml 禁用官方 session-query-sqlite 行并插入新行,注入名为 dsh-title-index 的服务。该插件继承官方 SqliteSessionQueryEngine 类,仅覆盖 readTitleSnapshots 方法,其余行为(如 listSessions、搜索等)保持官方实现。
索引机制
插件在磁盘上维护一个索引文件(默认 <DSH_HOME>/title-index.json),以 (sessionId, mtimeMs, size) 作为失效键。当命中索引时,直接返回缓存的标题快照;未命中时(新会话或日志有追加),走官方折叠逻辑并将结果写回索引。
自动失效重折叠
当标题生成插件重写日志导致文件 mtime 变化时,索引会自动失效,下次查询时重新折叠。
降级策略
对于活动会话、官方读取失败或索引损坏的情况,插件会原样回退到官方路径,不会劣化用户体验。
实测性能
在约 60MB zstd 日志的 114 个会话环境中,Top-50 @ 菜单标题读取时间从官方的 ~9.7s 降低至 ~0.3s。
安装与启用¶
- 安装插件
在 Web profile 下运行:
dsh plugin --profile web install
- 配置依赖与 bundle
在 profile 的package.json中添加依赖,并在dsh.profile.bundles中配置。必须将dsh-title-index排在@deepseek-ai/dsh-web-app之后,以保证补丁在官方行定义之后生效。
{
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-title-index"
]
}
},
"dependencies": {
"dsh-title-index": "github:gtaifu/dsh-title-index"
}
}
- 预热索引
首次冷启动会全量折叠一次以填充索引。可以使用预热命令提前完成:
node <profile>/node_modules/dsh-title-index/lib/bench.mjs
注意事项¶
- 已弃用:该插件目前已标记为 deprecated。DeepSeek Harness 0.1.2rc 已内置实现了更快的
@函数。 - 冷启动耗时:冷启动一次(索引缺失或格式升级后)约需要 8–9 秒。
- 依赖内部行为:插件依赖官方引擎的内部实现细节。
结语¶
dsh-title-index 通过引入磁盘索引机制,显著降低了 Web 端会话标题查询的开销。目前该功能已集成至 DSH 官方版本,社区目录与 GitHub 仓库仍保留此插件作为参考实现。