🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话清理 Shihang-Hu/dsh-session-purge

DeepSeek Harness
Shihang-Hu9 天前有提交已提供中文文档扫描:含敏感能力

永久删除会话数据,并原地脱敏日志中的密钥

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Shihang-Hu/dsh-session-purge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 9 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 19 处,展示前 13 条)
  • 读取本地文件
    lib/index.js:114
    projects = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    lib/index.js:127
    info = await lstat(candidate)
  • 读取本地文件
    lib/index.js:143
    return await readdir(path, { withFileTypes: true })
  • 读取本地文件
    lib/index.js:174
    info = await lstat(root)
  • 读取本地文件
    lib/index.js:438
    return { state: JSON.parse(await readFile(join(home, 'storages', 'workspace.json'), 'utf8')) }
  • 写入本地文件
    lib/index.js:478
    await writeFile(staging, `${JSON.stringify(state, null, 2)}\n`, 'utf8')
  • 写入本地文件
    lib/index.js:479
    await rename(staging, registry)
  • 读取本地文件
    lib/index.js:498
    await stat(file)
  • 删除本地文件
    lib/index.js:499
    await rm(file, { force: true })
  • 删除本地文件递归
    lib/index.js:792
    for (const dir of dirs) await rm(dir, { recursive: true, force: true })
  • 删除本地文件递归
    lib/index.js:794
    for (const dir of dirs) await rm(dir, { recursive: true, force: true })
  • 删除本地文件递归
    lib/index.js:796
    for (const dir of dirs) await rm(dir, { recursive: true, force: true })
  • 删除本地文件递归
    lib/index.js:954
    await rm(dir, { recursive: true, force: true })
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

非官方 DeepSeek Harness 插件:永久清除会话(磁盘日志、投影缓存、工作区记账、临时输出、子代理级联),并在 zstd 会话日志中就地脱敏密钥。

README

由 DeepSeek 最新模型翻译生成
dsh-session-purge [!IMPORTANT] 社区第三方插件,与 DeepSeek 官方无隶属关系;触点均为 Harness 内部实现面(非文档化 API)。 兼容基线:@deepseek-ai/dsh-desktop 0.2.1-rc.3(Windows x64,nightly 渠道,2026-10-26 逐触点审计)。nightly 更新可能静默破坏兼容——升级 DSH 后先运行 node --test test/purge.test.mjs(应 28/28)。 [!WARNING] 删除即永久,无回收站;脱敏只改写本地日志文件,不能替代密钥轮换。 管理 DeepSeek Harness 会话数据的两个操作: - 永久删除:磁盘日志 + 投影缓存 + 工作区记账 + 工具输出临时文件,级联清除全部子代理会话; - 原地脱敏:把敏感值(完整值/前缀)掩码写入会话 zstd 日志,保留历史,帧结构不变。 入口 | 入口 | 位置 | | 设置 → 会话清理 | 按工作区分组的会话列表:单会话删除(行内两段确认,Enter/Esc/10 秒撤防)、脱敏对话框、「删除工作区」(组头按钮,两段确认;成员运行中整体 409 拒绝;部分失败保留工作区并逐条报告)、搜索与"仅磁盘残留"筛选 | | 会话行"…
展开完整文档(README 剩余 1 节)
dsh-session-purge

[!IMPORTANT]
社区第三方插件,与 DeepSeek 官方无隶属关系;触点均为 Harness 内部实现面(非文档化 API)。
兼容基线:@deepseek-ai/dsh-desktop 0.2.1-rc.3(Windows x64,nightly 渠道,2026-10-26 逐触点审计)。nightly 更新可能静默破坏兼容——升级 DSH 后先运行 node --test test/purge.test.mjs(应 28/28)。

[!WARNING]
删除即永久,无回收站;脱敏只改写本地日志文件,不能替代密钥轮换。

管理 DeepSeek Harness 会话数据的两个操作:

- 永久删除:磁盘日志 + 投影缓存 + 工作区记账 + 工具输出临时文件,级联清除全部子代理会话;
- 原地脱敏:把敏感值(完整值/前缀)掩码写入会话 zstd 日志,保留历史,帧结构不变。

入口

| 入口 | 位置 |
| 设置 → 会话清理 | 按工作区分组的会话列表:单会话删除(行内两段确认,Enter/Esc/10 秒撤防)、脱敏对话框、「删除工作区」(组头按钮,两段确认;成员运行中整体 409 拒绝;部分失败保留工作区并逐条报告)、搜索与"仅磁盘残留"筛选 |
| 会话行"…"菜单 | 末尾「删除」项(官方槽位 sidebar.workspaces.session.menu.item),删除该行会话且不切换当前对话 |

完成对话框报告释放字节、级联数与临时清扫摘要;对话框配色全部取宿主主题 token,跟随深浅色。

页面布局重置

客户端无内置入口;「会话清理」面板底部提供指令(F12 → Console 粘贴执行;重载后空白则手动重启客户端):

['dsh.sidebar-right.v1','dsh.sidebar-browser.v1','dsh.workspace.view.v5','dsh.conversation.contentWidth','dsh.trajectory'].forEach(p=>Object.keys(localStorage).filter(k=>k.startsWith(p)).forEach(k=>localStorage.removeItem(k)));
location.reload();

只清布局白名单(前缀匹配覆盖按会话键),不动快捷键、草稿、终端与计划任务。备选:更宽 localStorage.clear();更严(精确边界 + 旧启动标记键):

['dsh.sidebar-right.v1','dsh.sidebar-browser.v1','dsh.workspace.view.v5','dsh.conversation.contentWidth','dsh.trajectory.duration','dsh.trajectory.jsonStringWrapping','dsh.session-purge.reset-layout-on-boot'].forEach((p)=>Object.keys(localStorage).filter((k)=>k===p||k.startsWith(p+'.')).forEach((k)=>localStorage.removeItem(k)));location.reload()

删除语义

ctx.get('sessions') → 活会话:flush(驻留对象在无代理持有时再驱逐)
ctx.get('storageDomain') → 'session_projcache' → 投影缓存行(域 + 文件双层)
ctx.get('storageDomain') → 'workspace' → 工作区记账 + 归档/置顶集合(域 + 文件双层)
$DSH_HOME/sessions/<projectKey>/<id>/ → 磁盘日志目录
%TEMP%/dsh-{subprocess,spill,acl-skill,...}-* → 内容提及该会话 id 的工具输出目录(归因清扫)
header.parentSession === id → 子代理级联
ctx.emit('api-session/removed') → 通知全部客户端刷新

- 顺序:先删日志并验证删净,再清记账(半删会话不会掉出分组);清理后逐层事后验证,未净显式报错,可直接重试;
- 护栏:会话 id 须匹配 session-<uuid>(或裸 uuid,不区分大小写);运行中拒绝(409);级联深度上限 MAX_CASCADE_DEPTH = 8,超出以 cascadeTruncated: true 显式报告;仅驻留不拒绝(先 flush 再清盘);路径必须落在预期根内;符号链接一律拒删;全走 Node fs,不经 shell;
- TEMP 清扫按内容归因(目录内容提及会话 id 才删),受文件数/字节预算约束(超限报 budgetHit);整棵级联只扫一次,各会话 tempSweep[].dirs 之和可能大于实际删除数(客户端摘要用去重合计 tempSweepTotal)。

脱敏语义

逐帧解压 → 替换 → 逐帧重压缩,帧数与行结构不变;写回前落备份、写回后完整校验(内容一致 + 敏感值绝迹 + 帧数一致),失败自动回滚;成功即删备份。备份清理失败不回滚(避免把脱敏结果还原成明文),报告 backupResidual/backupError;单文件失败不中断其余文件。

- secrets:完整值(6–512 字符,至多 64 项)→ 掩码 [REDACTED:xxxx…lenNN](保留前 4 位与总长);6–8 位短值会泄露大半,建议改用 prefixes 或直接轮换;
- prefixes:已知前缀(4–32 位 [A-Za-z0-9_-],至多 64 项),保留前缀、清除其后连续的字母/数字/_/-;
- 仅"运行中"拒绝(409);请勿对当前正查看的会话执行(界面状态未验证);
- 需 Node ≥ 23.8 的 zstd API(运行时检测;不满足时该路由 501,其余功能不受影响)。

目录结构与接口

dsh-session-purge/
├── package.json # 包清单:dsh.bundle.patch + dsh.client 声明 ├── cordis.patch.yml # bundle 层:向 profile 插入插件行 ├── lib/index.js # 宿主半:删除/脱敏管线 + 三个同源 HTTP 路由 ├── lib/client.js # 客户端半:对话框 / 设置面板 / 侧栏行菜单 └── test/purge.test.mjs # 单元测试(假 ctx + 临时 DSH home)

信任模型与宿主 api-request-trust 一致:授权主体必须为 loopback;sec-fetch-site: cross-site 一律拒绝;Origin 存在时必须等于该主体(桌面端经 dsh-app:// 转发会剥离 Origin,故缺失即放行)。

GET /_dsh/session-purge/list → { ok, sessions: [...] }(行含 workspaceId / workspace) POST /_dsh/session-purge/delete → { sessionId } → { ok, deleted[], freedBytes, projRows, wsRefs, tempSweep[], tempSweepTotal, live[], descendants[], cascadeTruncated } POST /_dsh/session-purge/delete-workspace → { workspaceId } → { ok, workspaceId, workspaceTitle, deleted[], failures[], freedBytes, projRows, wsRefs, tempSweep[], tempSweepTotal, workspaceRecordDeleted, cascadeTruncated } POST /_dsh/session-purge/redact → { sessionId, secrets?, prefixes? } → { ok, files[], totalReplacements, backupsResidual, failures }

安装(会修改 DSH profile)

克隆或下载本仓库(无 npm 依赖),然后二选一:把 dsh-session-purge 放入 profile 的 bundles 列表,或在目标 profile 的 cordis.patch.yml 中 insert 一行 name: 'dsh-session-purge'。二者都做会加载两次。桌面版实测无需重启(dsh-hmr 热加载插件行)。

测试

node --test test/purge.test.mjs

当前 28/28(Node 24.21;无 zstd 的运行时跳过脱敏用例)。

已知限制(如实)

- 无回收站;不回收 attachments 引用计数;
- TEMP 清扫是内容归因:从未提及会话 id 的输出会留存;
- 删除当前正查看的会话宿主不拦(无窗口守卫),其后界面表现未经端到端验证;
- 子代理不在面板列出(清理依赖主会话级联);对话页的子代理家族条目是父日志的派生投影,删除后界面残留到重建(磁盘与记账已净);孤儿子代理需手工清理;
- 驻留会话删除后:宿主仍持代理对象则保守跳过,幽灵行留到下次重启;
- Electron 渲染缓存可能短期保留已渲染内容(推断,未端到端验证);
- 端到端验证:0.2.0-rc.2 真机验证三个路由与两个入口;0.2.1-rc.3 起为逐触点静态审计(2026-10-26,未重复端到端);脱敏路由与"运行中拒绝"等守卫尚未在真实数据上触发过。

变更历史见 CHANGELOG.md(自 0.3.4 起记录)。
预览分享卡片长什么样 ↓Shihang-Hu/dsh-session-purge
分享 · DeepSeek Harness Hub
Shihang-Hu/dsh-session-purge

永久删除会话数据,并原地脱敏日志中的密钥

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部