READMESource: main@9bff0e42
dsh-session-unarchive
DeepSeek Harness 插件:查看并恢复已归档的会话。
原生 DSH 侧边栏只有「归档会话」、没有「取消归档」——会话一旦归档就从所有分组界面消失,且没有任何查看或恢复入口(这是 dsh-client-ui-workspace README 明确记录的已知限制)。本插件补齐这个能力:把归档的会话单独展示在一个「归档会话」入口里,可随时打开查看或恢复回原位。
⚠️ 核心行为:点「打开」会自动取消归档并打开会话(显示完整历史对话);打开后会话不再处于归档状态,如需再次归档需手动右键「归档会话」。
功能
- 侧边栏「归档 (N)」入口(客户端 UI):列在侧边栏底部(设置按钮旁),点开弹出面板,列出全部已归档会话,每个可「打开」或「恢复」。
session_archive工具:list/unarchive/unarchive-all(供 agent 调用)。/unarchive命令:list/restore <序号|id|关键词>/restore-all。- HTTP API:
GET /session-unarchive/api/archived、POST /session-unarchive/api/unarchive(供客户端 UI 调用)。
安装
本插件是 host + client 双半插件,零运行时依赖。
- 克隆到插件目录:
git clone https://github.com/simbamo/dsh-session-unarchive.git ~/.dsh/plugins/dsh-session-unarchive - 建符号链接到 profile node_modules:
ln -sfn ../../../plugins/dsh-session-unarchive ~/.dsh/profiles/web/node_modules/dsh-session-unarchive - 在
~/.dsh/profiles/web/package.json的 dependencies 里加:"dsh-session-unarchive": "link:/Users/<你>/....../dsh-session-unarchive" - 在
~/.dsh/profiles/web/cordis.patch.yml里插入 loader 条目:- insert: - id: dsh-session-unarchive name: dsh-session-unarchive - 重启 DSH web + 浏览器硬刷新。
装完必须重启 DSH web 才生效(agent 无法从会话内自重启 DSH web,需手动
kill $(lsof -nP -t -iTCP:3080 -sTCP:LISTEN)后重跑dsh web)。
使用
侧边栏 UI
重启后,侧边栏底部(设置按钮旁)会出现「归档 (N)」入口:
- 点开 → 列出全部已归档会话(标题 + 工作目录)
- 「打开」→ 自动取消归档并打开该会话:会话会移回它原来的工作区分组,并显示完整的历史对话记录
- 「恢复」→ 只取消归档(移回原位置,但不打开)
⚠️ 重点:「打开」会自动取消归档(因为 DSH 核心设计上不允许「归档会话」作为当前会话被打开——一旦设为当前会被立刻清空回空白对话)。所以打开后,该会话不再处于「已归档」状态,会回到原位置;如需再次归档,请在侧边栏该会话上右键 →「归档会话」手动操作。
命令
/unarchive list
/unarchive restore 3
/unarchive restore <id或标题关键词>
/unarchive restore-all
工具
让 agent 直接调 session_archive 工具(list / unarchive / unarchive-all)。
原理
- 归档集合持久化在
~/.dsh/storages/workspace.json的global.archivedSessionIds(由核心workspaceRegistry服务维护)。 - 原生只有
archiveSession()(写入归档集合)、没有unarchiveSession()。本插件在apply()阶段给ctx.workspaceRegistry实例补上unarchiveSession(sessionId),复用其自身的enqueueOperation串行化 +setState持久化,与原生完全对称。 - 客户端 UI 通过
sidebar.footer.action槽注册(DSH 原生侧边栏没有树内分组扩展槽,只能用 footer 入口方案),数据来自useWorkspaces(归档集合)与useSessions(标题)。 - 「恢复」通过 HTTP API 调 host 的
unarchiveSession,成功后ctx.workspaces.refresh()刷新侧边栏。 - 「打开」= 先 unarchive →
ctx.workspaces.refresh()→ 再ctx.sessions.open()。之所以必须这样,是因为 DSH 核心(dsh-client-runtime的 WorkspaceRuntime.project)有一段「投影清扫」逻辑:任何归档会话一旦成为当前会话,会被立刻clear()回空白对话——所以归档会话无法被直接打开,只能「先取消归档再打开」。
目录
lib/
index.js # host 端:unarchive 补丁 + 工具 + 命令 + HTTP API
client.js # 客户端 bundle:sidebar.footer.action 的「归档会话」面板
package.json
License
MIT
No comments yet. Be the first to write one.