dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
在侧栏会话菜单中加入「删除」,把会话——带子代理时连同整棵后代树——搬进回收站(目录在磁盘上整体 rename 迁走,原子操作,不做复制),并提供侧栏回收站面板:标题与正文搜索、工作区筛选、排序、查看对话记录、恢复与彻底删除。删除时同时摘掉工作区槽位、置顶与归档标记以及投影缓存行,恢复时把会话放回侧栏原位置;彻底删除时清掉绑定该会话的定时任务并删除空掉的工程目录。已在 DeepSeek Harness 0.2.1-rc.2 上真机验证,删除后全盘无残留。
简体中文 | English
把「DSH 会话清理」装进 DSH 桌面版:侧栏每个会话的 ··· 菜单里多一项红色的删除(排在"归档"下面),一键移入回收站;侧栏底部有会话回收站入口,支持搜索、恢复与彻底删除。
删除不只是搬走日志目录:会话在 DSH 里留下的每一处痕都会一并处理——工作区记账槽位、置顶、归档标记、投影缓存行(含宿主留下的 .bak 备份)。带子代理的会话整棵树一起处理:宿主只级联销毁 agent,子会话的日志、记账、缓存行不会自己消失。恢复时逐项还原,包括侧栏里的原位置。彻底删除时再清掉绑定该会话的定时任务,以及空掉的工程目录。
会话 ··· 菜单里多出红色的删除(排在"归档"下面)。
会话回收站:标题/正文搜索、工作区筛选、排序、恢复与彻底删除。
查看对话记录:逐轮提问与助手回复,Markdown 渲染,超长回复中间省略。
以上图片由本仓库根目录的 screenshots.json 声明(插件市场详情页按它展示),路径相对该文件、指向仓库内的图片。
到 Releases 页面 下载最新版压缩包并解压,得到 dsh-session-cleaner/ 文件夹;也可以 git clone 本仓库。
dsh-session-cleaner/ 整个文件夹拷到 ~/.dsh/profiles/desktop/local/ 下(Windows 即 C:\Users\你.dsh\profiles\desktop\local\dsh-session-cleaner)~/.dsh/profiles/desktop/package.json:dependencies 里加一行:"dsh-session-cleaner": "file:./local/dsh-session-cleaner"dsh.profile.bundles 数组里加一项:"dsh-session-cleaner"node "%DSH_HOME%\dsh-runtimes\dsh-primary-runtime\dependencies\pnpm\bin\pnpm.cjs" install -C %DSH_HOME%\profiles\desktop0.2.1-rc.2 上做过含子会话级联与全盘残留扫描的完整回归session_projcache 存储域 v7、workspaceRegistry / schedule / storageDomain / webServer 服务、前端 slot 与 __ModuleLoader__)均逐一与 0.2.1-rc.3 源码核对,无不适配项0.1.x 未验证:那一系的会话格式经历过 v0→v4 迁移、宿主 API 变动也大,不建议直接用~/.dsh/dsh-session-cleaner/trash/,可手工搬回 sessions///··· → 删除:直接移入回收站,顶部提示"✓ 会话已删除至回收站"(可恢复,所以无二次确认)位置 · 移入回收站 · 恢复 · 彻底删除 /sessions/// · 整体 rename 到回收站(同盘瞬时,不复制) · 搬回原位 · 删除 工作区记账号位 workspace.json → 工作区的 sessionIds · 摘掉槽位(并记下后继会话作为锚点) · 挂回并插回原位置 · — 全局归档集合 archivedSessionIds · 摘掉(并记下删除前是否归档) · 按原状态还原 · — 全局置顶集合 pinnedSessionIds · 摘掉(并记下原次序) · 按原次序还原 · — 投影缓存行 storages/session_projcache/sessions/.json · 通过宿主存储域删除,快照留原文 · 原文写回(文件 + 宿主内存表) · 复查并清掉(含 .json.bak.*) 绑定该会话的定时任务(schedule 域) · 不动:快照里抄录一份 · 不用还原(从未被动过) · 清掉(进行中的 + 已结束的历史行) 它的子会话(origin: subagent + parentSession 指向它) · 一并搬进回收站的 .children/,各自留快照 · 一并还原(目录/槽位/缓存行/置顶/归档) · 一并清掉(缓存行 + 定时任务 + 空工程目录) /sessions// 工程目录 · — · 需要时重建 · 空了就删掉
schedule 服务不支持原样重建任务(新建会换 id、清空发送历史),删了就回不来了,而移入回收站必须是可逆的POST /delete(不进回收站的物理删除)与 POST /status。现在删除只有一条链:移入回收站 → 彻底删除dsh web 的 web profile)的 DeepSeek Harness 0.2.1-rc.3 上验证过;别的部署形态、更早的 0.2.x 与 0.1.x 都没测过(见上面「兼容性」)~/.dsh/profiles/desktop/package.json 里删掉 dsh-session-cleaner 的 dependencies 行、bundles 行pnpm install(用 DSH 自带的:node "%DSH_HOME%\dsh-runtimes\dsh-primary-runtime\dependencies\pnpm\bin\pnpm.cjs" install -C %DSH_HOME%\profiles\desktop)~/.dsh/profiles/desktop/local/dsh-session-cleaner本仓库就是插件的开发源码。改完代码后,DSH 不会自动加载新版本,必须手动把整个插件文件夹覆盖拷贝到以下两处,再重启 DSH:
~/.dsh/profiles/desktop/local/dsh-session-cleaner(安装源,Windows 即 C:\Users\你.dsh\profiles\desktop\local 下)~/.dsh/profiles/desktop/node_modules/dsh-session-cleaner(DSH 实际加载的目录)要点:
node "%DSH_HOME%\dsh-runtimes\dsh-primary-runtime\dependencies\pnpm\bin\pnpm.cjs" install -C %DSH_HOME%\profiles\desktoppackage.json 的 version,以及 lib/index.js 里的 buildId。插件启动时会在日志里打印 dsh-session-cleaner v,重启后一眼就能确认新版本真的生效了(2026-10 出过 package.json 已升、buildId 忘升导致日志仍显示旧版号的问题,两处务必一起改)。scripts/release.ps1 是维护者工具(不参与插件运行,也不会被装进发行包——package.json 的 files 只列了 lib、cordis.patch.yml、README.md、README.en.md)。它按顺序做完这几件事:
package.json#version 与 lib/index.js#buildId 一致(不一致直接报错,防止再出现"日志显示旧版本号");dsh-session-cleaner-.zip 并打印 SHA256;~/.dsh/profiles/desktop/ 下的 local 与 node_modules 两处;git commit → 打 v 标签 → 推送 main 与标签;dsh-session-cleaner v)并上传 zip。# 先干跑看一遍将要做的事(不改任何东西)
pwsh -NoProfile -File scripts/release.ps1 -DryRun
# 正式发版
pwsh -NoProfile -File scripts/release.ps1参数:-SkipGit、-SkipSync、-SkipRelease 可分别跳过某一步;-Proxy '' 关闭代理(默认走 http://127.0.0.1:7890);-Token 或环境变量 GH_TOKEN 指定令牌,都没有时脚本会尝试读取 Windows 凭据管理器里 git:https://github.com 的令牌(只放环境变量,不打印、不进命令行历史),仍取不到则跳过 Release 创建并提示手工上传。
scripts/verify.mjs 是维护者工具(不参与插件运行,也不会被装进发行包)。它用 mock 宿主 + 真实临时目录把关键路径真跑一遍:路径校验、移入回收站、恢复(含槽位/置顶/归档/缓存行还原)、彻底删除(含定时任务与空目录)、并发锁、重复目录拒绝、启动对账、保留期清理、真实 DSH 日志帧解析,以及客户端 bundle 的 slot 注册与双语语言包一致性。
node scripts\verify.mjs全绿(末行 N 通过 / 0 失败)再发版。
__ModuleLoader__),无不适配项,并在该版本上真机验证功能正常current 字段、sessions 服务没有 clear()、workspaces 服务没有 refresh()——三条原是删除后清主视图、刷新侧栏的 best-effort 调用,在 rc.3 上永远静默跳过。删除会话后的主视图清理由宿主的 session/disposed → api-session/removed 推送自动完成,无需插件干预;恢复后的侧栏刷新仍走 sessions.refresh()(rc.3 上存在且必要)。client 端 inject 随之去掉 workspacesicon.svg,以及 locale/zh.json、locale/en.json 中的 meta.title / meta.description,DSH 按当前界面语言显示「会话清理 / Session Cleaner」;发行脚本也把图标与语言包一并打进 zip,下载发行包的人同样看得到/trash/list 之前会把每条会话的投影缓存原文(projcacheRow,可能很大)一起返回,与"只回展示字段"的设计相悖;现在列表不再携带它(恢复/彻底删除仍从 meta 读)origin: 'subagent' + parentSession)发现整棵树,移入回收站、恢复、彻底删除都整棵走;子会话目录放在父项的 .children/ 下,启动对账对"搬了一半"按全有或全无回滚encodeSegment()(安全字符原样、其余 ~XXXX),之前误抄了项目段的 projectKey()(--…-- 形式)。宿主发的 id 全是安全字符,所以此前无实际影响,但遇到需转义的 id 会找不到目录persistence.resolveLog 在当前版本已不存在(死路径);locate({id}) 必须带 header 的 cwd 才能定位项目段,只传 id 会解析到 _no-cwd。现在目录发现完全按宿主的路径计算来,不依赖这两个入口cordis(不相关的第三方包),DSH 实际带的是 @deepseek-ai/cordis,而插件并未 import 它。留着会让别人安装时可能多装一个包__ModuleLoader__),无不适配项;并在该版本上做了真机全链路测试(删除→恢复→彻底删除,含子会话级联与全盘残留扫描)/delete 端点会删它,界面上走得到的路径从不删;现在移入回收站时通过宿主存储域删除,并连带清掉宿主的 .json.bak.* 备份pinnedSessionIds,恢复时按原次序还原insertSessionBefore 插回原位(attachSession 只会前插)POST /delete 与 POST /status 两个端点