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

会话深度清理 HaiYu-22/dsh-session-purge

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

把会话日志与缓存从磁盘彻底删除,释放空间

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/10/4) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 57 处,展示前 46 条)
  • 写入本地文件
    dsh-session-purge/lib/index.js:71
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    dsh-session-purge/lib/index.js:72
    appendFileSync(path, `${new Date().toISOString()} session-purge loaded (pid ${process.pid})\n`, 'utf8')
  • 读取本地文件
    dsh-session-purge/lib/index.js:272
    entries = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    dsh-session-purge/lib/index.js:280
    else if (entry.isFile()) total += (await stat(child)).size
  • 读取本地文件
    dsh-session-purge/lib/index.js:384
    if (root === undefined || !existsSync(root)) return []
  • 读取本地文件
    dsh-session-purge/lib/index.js:387
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    dsh-session-purge/lib/index.js:396
    const parsed = JSON.parse(await readFile(join(directory, 'manifest.json'), 'utf8'))
  • 写入本地文件
    dsh-session-purge/lib/index.js:514
    await mkdir(dirname(destination), { recursive: true })
  • 写入本地文件
    dsh-session-purge/lib/index.js:516
    await rename(locator.sessionDir, destination)
  • 删除本地文件递归
    dsh-session-purge/lib/index.js:522
    await rm(locator.sessionDir, { recursive: true, force: true })
  • 写入本地文件
    dsh-session-purge/lib/index.js:535
    await writeFile(join(operationDir, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\n', 'utf8')
  • 删除本地文件
    dsh-session-purge/lib/index.js:568
    await rm(documentPath, { force: true })
  • 读取本地文件
    dsh-session-purge/lib/index.js:585
    return existsSync(join(candidate, 'session_projcache')) ? candidate : undefined
  • 删除本地文件递归
    dsh-session-purge/lib/index.js:601
    if (remaining.length === 0) await rm(projectDir, { recursive: true, force: true })
  • 删除本地文件递归
    dsh-session-purge/lib/index.js:666
    await rm(locator.sessionDir, { recursive: true, force: true })
  • 写入本地文件
    dsh-session-purge/lib/index.js:782
    await mkdir(dirname(target), { recursive: true })
  • 删除本地文件递归
    dsh-session-purge/lib/index.js:800
    await rm(manifest.directory, { recursive: true, force: true })
  • 删除本地文件递归
    dsh-session-purge/lib/index.js:834
    await rm(manifest.directory, { recursive: true, force: true })
  • 读取本地文件
    dsh-session-purge/lib/paths.js:98
    projects = await readdir(sessionsRoot, { withFileTypes: true })
  • 读取本地文件
    dsh-session-purge/lib/paths.js:109
    entries = await readdir(projectDir, { withFileTypes: true })
  • 读取本地文件
    dsh-session-purge/lib/paths.js:132
    projects = await readdir(sessionsRoot, { withFileTypes: true })
  • 读取本地文件
    dsh-session-purge/lib/paths.js:143
    entries = await readdir(projectDir, { withFileTypes: true })
  • 读取本地文件
    verification/client-compose-test.mjs:60
    console.log('bundle exists:', clientPath !== undefined && existsSync(clientPath))
  • 读取本地文件
    verification/client-test.mjs:51
    const source = await readFile(join(PLUGIN, 'lib', 'client.js'), 'utf8')
  • 读取本地文件
    verification/client-test.mjs:90
    for (const file of readdirSync(distDir).filter((name) => name.endsWith('.js'))) {
  • 读取本地文件
    verification/client-test.mjs:91
    const words = seedTableOf(readFileSync(join(distDir, file), 'utf8'))
  • 读取本地文件
    verification/compat-test.mjs:28
    const manifest = JSON.parse(readFileSync(join(PLUGIN, 'package.json'), 'utf8'))
  • 删除本地文件递归
    verification/host-test.mjs:20
    await rm(scratch, { recursive: true, force: true })
  • 写入本地文件
    verification/host-test.mjs:50
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    verification/host-test.mjs:51
    await writeFile(join(dir, 'session.v4.jsonl.zstd'), Buffer.alloc(bytes, 7))
  • 读取本地文件
    verification/host-test.mjs:92
    if (!existsSync(sessionsRoot)) return undefined
  • 读取本地文件
    verification/host-test.mjs:93
    for (const project of await readdir(sessionsRoot, { withFileTypes: true })) {
  • 读取本地文件
    verification/host-test.mjs:95
    if (existsSync(join(sessionsRoot, project.name, id))) {
  • 读取本地文件
    verification/host-test.mjs:157
    const trashEntries = await readdir(join(sessionsRoot, '.purge-trash'), { withFileTypes: true })
  • 读取本地文件
    verification/host-test.mjs:160
    const manifest = JSON.parse(await readFile(join(sessionsRoot, '.purge-trash', operationId, 'manifest.json'), 'utf8'))
  • 读取本地文件
    verification/host-test.mjs:163
    assert.ok(existsSync(join(sessionsRoot, '.purge-trash', operationId, 'session', 'session.v4.jsonl.zstd')), 'the log must be preserved in the trash')
  • 写入本地文件
    verification/host-test.mjs:226
    await mkdir(join(loneProject, loneId), { recursive: true })
  • 写入本地文件
    verification/host-test.mjs:227
    await writeFile(join(loneProject, loneId, 'session.v4.jsonl.zstd'), Buffer.alloc(64, 3))
  • 删除本地文件递归
    verification/host-test.mjs:303
    await rm(scratch, { recursive: true, force: true })
  • 读取本地文件
    verification/run.mjs:65
    if (!existsSync(runtime)) {
  • 读取本地文件
    verification/run.mjs:73
    if (!existsSync(home)) {
  • 写入本地文件
    verification/run.mjs:86
    mkdirSync(join(stage, 'lib'), { recursive: true })
  • 写入本地文件
    verification/run.mjs:87
    copyFileSync(join(repo, 'dsh-session-purge', 'package.json'), join(stage, 'package.json'))
  • 读取本地文件
    verification/run.mjs:89
    for (const name of readdirSync(libDir)) {
  • 写入本地文件
    verification/run.mjs:90
    if (name.endsWith('.js')) copyFileSync(join(libDir, name), join(stage, 'lib', name))
  • 执行外部命令来自配置/变量
    verification/run.mjs:109
    const result = spawnSync(process.execPath, [join(here, script)], { stdio: 'inherit', env })
扫描于 2026/11/5(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 彻底删除会话日志
  • 清理投影缓存
  • 清除归档条目

DeepSeek Harness 会话深度删除:从磁盘上彻底清掉会话日志、投影缓存和归档条目,而不是只把它藏起来

README

由 DeepSeek 最新模型翻译生成
dsh-session-purge DeepSeek Harness 会话的深度删除 —— 把会话日志、投影缓存和归档条目从磁盘上真正移除,而不是只藏起来。 中文说明在下 · 插件源码在 dsh-session-purge/ ·验证套件在 verification/ 中文说明 它解决什么问题 DSH 侧栏里的「归档」不删除任何东西。它只是把一个会话 id 写进 ~/.dsh/storages/workspace.json 的 archivedSessionIds,会话日志仍完整躺在磁盘上,随时可以「取消归档」恢复。持久化层的文档把这点写成了设计决定: Nothing deletes session files — logs accumulate under root until removed externally; the seam has no deletion API. 所以 DSH 自身没有任何办法回收这些空间。本插件补上这条维护路径。
展开完整文档(README 剩余 1 节)
dsh-session-purge

DeepSeek Harness 会话的深度删除 —— 把会话日志、投影缓存和归档条目从磁盘上真正移除,而不是只藏起来。

中文说明在下 · 插件源码在 dsh-session-purge/ ·验证套件在 verification/

中文说明

它解决什么问题

DSH 侧栏里的「归档」不删除任何东西。它只是把一个会话 id 写进 ~/.dsh/storages/workspace.json 的 archivedSessionIds,会话日志仍完整躺在磁盘上,随时可以「取消归档」恢复。持久化层的文档把这点写成了设计决定:

Nothing deletes session files — logs accumulate under root until removed externally; the seam has no deletion API.

所以 DSH 自身没有任何办法回收这些空间。本插件补上这条维护路径。

一次删除会清掉什么

| 落点 | 处理 |
| ~/.dsh/sessions/<项目目录>/<会话目录>/(含该会话全部格式代号的日志文件) | 移入回收站或永久删除 |
| ~/.dsh/storages/session_projcache/sessions/<会话 id>.json | 删除(派生缓存,丢失只会多一次回放) |
| ~/.dsh/storages/workspace.json 的 archivedSessionIds 条目 | 移除 |
| 清空后的项目目录 | 自动回收 |
| 侧栏列表 | 删除后立即重新拉取,会话行消失 |

三种用法

1. 侧栏菜单:任意会话行 → ⋯ → 永久删除(在「归档会话」下面)→ 确认。
不要求先归档。

2. 斜杠命令 /purge(不产生模型消息):

/purge candidates 列出可清理的会话及可回收空间 /purge list 列出全部已存储会话(含活动/回收站标记) /purge delete <id...> [permanent] 删除;默认移入回收站,可恢复 /purge delete-archived 清理全部已归档/冷会话 /purge trash 列出回收站批次 /purge restore <operationId...> 还原批次 /purge empty [<operationId...>] 清空回收站(这一步才真正腾出磁盘空间)

3. 模型工具 session_purge:action 为 list / delete / restore / trash / empty。

回收站在哪里

~/.dsh/sessions/.purge-trash/<时间戳>-<会话id>-<随机>/ ├── manifest.json # 会话 id、原始完整路径、原始 cwd、大小、删除时间 └── session/ # 原会话目录整体

移入回收站并不腾出空间(只是换目录,仍在同一卷上),要真正回收必须 /purge empty 或手工删掉该目录。清空后若无内容,连 .purge-trash 目录本身也会被删掉。

设计上的两个安全点

- 活动会话不会被硬删:后端仍持有它的写句柄,删文件会让内存状态与磁盘不一致。
插件会先用归档接缝的 stopActivity 停掉它的工作并等待;超时则明确拒绝 并给出可执行的下一步。
- 默认可恢复:不勾「同时永久抹除」就是移入回收站。勾了则直接 unlink,不可恢复。

安装

1) 链接进目标 profile 的 node_modules $profileDir = "$env:USERPROFILE\.dsh\profiles\desktop" $pkg = "<本仓库路径>\dsh-session-purge" New-Item -ItemType Directory -Force -Path "$profileDir\node_modules\@dsh-local" | Out-Null cmd /c mklink /J "$profileDir\node_modules\@dsh-local\dsh-session-purge" "$pkg"

2) 在 $profileDir\cordis.patch.yml 顶层数组里加入
- insert:
- id: session-purge
name: '@dsh-local/dsh-session-purge'

注意(最容易踩的一条):链接在工作区外的插件,其裸导入(zod、 @deepseek-ai/)只有在插件自己的 package.json peerDependencies 里声明过才会被 DSH 的路由接管;不声明会落到原生解析并静默判定入口 inactive——应用照常启动,插件不出现,也没有任何可见报错。本包已声明。

生效方式:宿主半边(lib/index.js)由 dsh-hmr 监听 profile 配置后就地挂载;浏览器半边(lib/client.js)的内容每个宿主进程只快照一次,改完需要在应用内「插件」页面把本插件停用再启用,或完全退出应用重开。

已验证

见 verification/。八个脚本驱动真实的 Cordis / Typert / 客户端合成器,覆盖删除逻辑、装载、解析、描述符注册、平台种子表、以及三个客户端插槽契约。运行:

node verification/run.mjs

插件源码与四个踩坑记录(peerDependencies 路由、Config 接受缺省、 hooks 只放可观察源、对话框不能放进菜单行、remote. 命名空间需注入作用域、 fs.rm 删目录必须 recursive)都在 dsh-session-purge/README.md。

退出与回滚

- 临时停用:在 cordis.patch.yml 里把该条改成 disabled: true。
- 完全卸载:删掉 insert 条目,再删除 profile 的 node_modules\@dsh-local\dsh-session-purge 链接。插件不写任何自有状态(回收站可手工删除),卸载后磁盘上不留残留。

许可

MIT © 2026 HaiYu-22。

仅做本地会话存储维护;删除不可恢复(除非使用默认的回收站路径),请自行确认目标。
预览分享卡片长什么样 ↓HaiYu-22/dsh-session-purge
分享 · DeepSeek Harness Hub
HaiYu-22/dsh-session-purge

把会话日志与缓存从磁盘彻底删除,释放空间

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