liangmianya/dsh-synapse
liangmianya/dsh-synapseDeepSeek Harness 的可视化非线性对话工作区:把会话、追问与分支变成可浏览、可拖拽的对话地图。
DSH 会话管理:列出全部会话并显示各自的磁盘占用,可按标题、会话 ID、类型标签、工作区或 agent preset 搜索,并按时间或工作区分组。支持单个或批量永久删除——同时清除日志文件、工作区账目与搜索索引,删除前两步确认、删除后复验;可按需显示子代理会话,侧边对话线程始终隐藏,本次启动中活动的会话会被拒绝直到重启。
DeepSeek Harness (DSH) 插件:在 设置 → 会话管理 中列出所有会话,并永久删除不需要的会话。
~/.dsh/sessions///)workspaceRegistry.detachSession)info、异常 warn);工作区账目摘除失败会作为 warnings 回传界面,而不是被静默吞掉活动会话限制:本次启动中打开过的会话(包括正在查看的当前会话)会被拒绝删除——活动 Agent 会重写日志,删除不彻底。重启应用后这些会话变成冷会话,即可正常删除。历史会话(此前运行留下的)随时可直接删除。
origin: "subagent" 的会话。勾选 「显示子代理会话 (N)」 即可列出它们(N 是当前被隐藏的数量)。subagent 标记,但它们不是子代理。本插件按 Side: 标题前缀识别,永远不显示——删掉它会让侧边栏那个对话标签页变成孤儿。子代理 / subagent、主会话 / main)、工作区路径、以及 agent preset(qq-chat、cordis 等)。输入 子代理(或其前缀 agent)会自动放开隐藏,一次列出全部子代理会话。cwd,按会话数量降序;无 cwd 的归入「未知工作区」)。删除中 12/357),单条失败只计入失败数、不中断整批,结束后汇总成功与部分失败。warn,绝不盲目 rm -r——那可能带走整个工作区分组。sessionPersistence.locate() 抛错时返回失败,而不是当成「没有产物」。AbortController),host 无响应不会把界面永久锁死。宿主 · 状态 DSH Desktop 2.0.18 / 内核 0.2.1-rc.2 · ✅ 已验证(安装门禁与所用 API 均通过) DSH Desktop 2.0.10 / 内核 0.1.5-rc.2 · ✅ 已验证(sessionPersistence.list() 返回 snapshot,本插件按 snapshot.header 读取) 内核 < 0.1.5-rc.2 · ❌ 不支持。该代 list() 返回的是裸 header,本插件取不到 id
宿主代次由package.json的engines.dsh(>=0.1.5-rc.2 <0.3.0-0)统一声明。DSH 的安装门禁优先读 `engines.dsh`,存在该字段时peerDependencies里的@deepseek-ai/dsh-*不再参与判断——内核升代只改这一处即可,不必逐条改 peer。
这条下界来自 2.0.10 的服务语义变化:sessionPersistence改为按SessionHandle(create/open)寻址,list()返回{ header, sizeBytes, revision }快照。若你的 DSH 更老,请先确认list()的返回结构再装。
在目标 profile 的 package.json(例如 ~/.dsh/profiles/desktop/package.json)中加入依赖与 bundle:
{
"dependencies": {
"dsh-session-delete": "github:BakaCirno233/dsh-session-delete"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"…其他插件…",
"dsh-session-delete"
]
}
}
}然后在 profile 目录执行 pnpm install,重启 DSH 应用。
使用:设置(齿轮)→ 会话管理。
"dependencies": {
"dsh-session-delete": "file:<本仓库的绝对路径>"
}pnpm install 后改 lib/ 里的代码,重启应用即可生效。
注意:file:依赖在 profile 的node_modules下是副本而不是符号链接。改完仓库代码后需要重新pnpm install(或手动把lib/*.js复制过去),否则运行的仍是旧代码。
lib/index.js — Host 半部:在本地 webServer 注册两个路由POST /api/session-delete/list → { sessions: [{ sessionId, live, running, sizeBytes?, agentPreset?, cwd? }] }POST /api/session-delete/delete → { ok, code?, message?, warnings? }node:fs/promises(rm),无需子进程lib/client.js — 浏览器半部:settings.section 的「会话管理」页,通过 fetch 调用宿主路由cordis.patch.yml — 把宿主插件行插入组合(宿主半部)package.json 的 dsh.client 声明让 Web 端自动发现 lib/client.js0.2.1-rc.2)修复
peerDependencies 里的 ^0.1.0-rc.5 在语义化版本下封顶于 0.2.0-0,而 DSH 2.0.18 的内核是 0.2.1-rc.2,6 条 @deepseek-ai/dsh-* peer 全部不满足,安装 preflight 因此拒绝。现在改用 engines.dsh(>=0.1.5-rc.2 <0.3.0-0)统一声明宿主代次;6 条 peer 同步更新为 ^0.1.5-rc.2 || ^0.2.0-rc.2(仅供包管理器参考,门禁以 engines.dsh 为准)。1.0.0 → 1.0.1:宿主按精确版本判断是否更新,不 bump 的话 pnpm 会认为装上的还是旧版。验证
evaluatePluginCompatibility()(@deepseek-ai/dsh-app-boot,运行版本 0.2.1-rc.2)实测:旧 manifest 被上述 6 条拒绝,新 manifest 通过。0.2.1-rc.2 的相关 API:sessionPersistence.list() 仍返回 { header, sizeBytes, revision }、locate() 仍返回 { kind, path }、webServer.register({ kind: "exact", path, handler })、workspaceRegistry.detachSession()、客户端 settings.section 槽位与 window.__ModuleLoader__ 协议均未变。兼容
sessionPersistence.list() 的返回结构:从 header 数组变为 snapshot 对象数组({ header, sizeBytes, revision })。直读 snapshot 的 id 会拿到 undefined。现在改走 snapshot.header 取出 id/cwd/agentPreset,sizeBytes 则直接取 snapshot 自带的(后端已经 stat 好了,删掉了独立的 sizeOf 函数)。修复
sessionPersistence.locate() 失败不再被当作「没有产物」而静默返回成功detachSession)失败不再被吞掉,改为回传 warnings 并写日志新增
sizeBytes / agentPreset / cwdinfo / 异常 warn)改进