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

会话清理助手 Cans518/dsh-chat-prune

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

筛选并批量清理旧会话,删除前可备份

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · chat
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 17 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 70 处,展示前 52 条)
  • 读取本地文件
    lib/index.js:43
    const pluginVersion = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf8')).version
  • 读取本地文件
    lib/index.js:126
    await stat(path)
  • 读取本地文件
    lib/index.js:145
    if ((await lstat(current)).isSymbolicLink()) {
  • 读取本地文件
    lib/index.js:171
    const text = await readFile(path, 'utf8')
  • 写入本地文件
    lib/index.js:178
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    lib/index.js:183
    await writeFile(tmp, body, 'utf8')
  • 写入本地文件
    lib/index.js:184
    await rename(tmp, path)
  • 读取本地文件
    lib/index.js:198
    const slugs = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    lib/index.js:210
    if (!(await stat(candidate)).isDirectory()) throw new HttpError(409, '会话路径不是目录')
  • 写入本地文件
    lib/index.js:464
    await mkdir(dirname(backupDir), { recursive: true })
  • 写入本地文件
    lib/index.js:466
    await writeFile(
  • 删除本地文件递归
    lib/index.js:497
    await rm(located.dir, { recursive: true, force: true })
  • 删除本地文件
    lib/index.js:505
    await rm(target, { force: true })
  • 写入本地文件
    lib/index.js:992
    await mkdir(dirname(diagLog), { recursive: true })
  • 读取本地文件
    lib/session-sources.js:34
    try { saved = JSON.parse(await readFile(file, 'utf8')) }
  • 发起网络请求
    lib/session-sources.js:60
    response = await fetch(url, { method, redirect: 'error', signal: AbortSignal.timeout(30000),
  • 读取本地文件
    lib/session-sources.js:78
    if (!ping.home || pathKey(await realpath(ping.home)) !== pathKey(await realpath(source.home))) {
  • 写入本地文件
    lib/session-sources.js:87
    await mkdir(join(home, 'storages'), { recursive: true })
  • 写入本地文件
    lib/session-sources.js:91
    await writeFile(temporary, JSON.stringify(next, null, 2), { mode: 0o600 })
  • 写入本地文件
    lib/session-sources.js:92
    await rename(temporary, file)
  • 删除本地文件
    lib/session-sources.js:94
    await rm(temporary, { force: true })
  • 读取本地文件
    lib/session-sources.js:105
    const path = await realpath(input.home).catch(() => { throw sourceError(400, '数据目录不存在或无法读取') })
  • 读取本地文件
    lib/session-sources.js:106
    if (pathKey(path) === pathKey(await realpath(home))) throw sourceError(400, '此路径已是当前来源')
  • 读取本地文件
    lib/session-sources.js:107
    const sessionDirectory = await lstat(join(path, 'sessions')).catch(() => null)
  • 读取本地文件
    lib/conversation-storage.js:12
    entry = await lstat(join(dir, COMPRESSED_FILE))
  • 读取本地文件
    lib/conversation-storage.js:18
    if ((await lstat(join(dir, SUMMARY_FILE))).isSymbolicLink()) throw new Error('压缩清单不能是符号链接')
  • 读取本地文件
    lib/conversation-storage.js:19
    const summary = JSON.parse(await readFile(join(dir, SUMMARY_FILE), 'utf8'))
  • 读取本地文件
    lib/conversation-storage.js:30
    const sessions = await decodePackage(await readFile(join(located.dir, COMPRESSED_FILE)))
  • 读取本地文件
    lib/conversation-storage.js:40
    for (const entry of await readdir(dir, { withFileTypes: true })) {
  • 读取本地文件
    lib/conversation-storage.js:45
    const details = await lstat(path)
  • 写入本地文件
    lib/conversation-storage.js:63
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    lib/conversation-storage.js:71
    await writeFile(temporary, fileContent(file), { flag: 'wx' })
  • 写入本地文件
    lib/conversation-storage.js:72
    await utimes(temporary, new Date(file.mtime), new Date(file.mtime))
  • 删除本地文件
    lib/conversation-storage.js:75
    await rm(temporary, { force: true })
  • 删除本地文件
    lib/conversation-storage.js:90
    await rm(archive)
  • 删除本地文件
    lib/conversation-storage.js:91
    await rm(join(located.dir, SUMMARY_FILE), { force: true })
  • 写入本地文件
    lib/conversation-storage.js:92
    await writeFile(join(located.dir, '.dsh-last-access'), String(Date.now()))
  • 写入本地文件
    lib/conversation-storage.js:130
    await writeFile(temporary, archive, { flag: 'wx' })
  • 写入本地文件
    lib/conversation-storage.js:131
    await writeFile(join(located.dir, SUMMARY_FILE), JSON.stringify(summary))
  • 删除本地文件
    lib/conversation-storage.js:133
    } finally { await rm(temporary, { force: true }) }
  • 删除本地文件
    lib/conversation-storage.js:140
    await rm(path)
  • 删除本地文件
    lib/conversation-storage.js:145
    await rm(path, { force: true })
  • 读取本地文件
    lib/conversation-maintenance.js:27
    const value = JSON.parse(await readFile(settingsPath, 'utf8'))
  • 写入本地文件
    lib/conversation-maintenance.js:46
    await mkdir(join(home, 'storages'), { recursive: true })
  • 写入本地文件
    lib/conversation-maintenance.js:49
    await writeFile(temporary, JSON.stringify({ afterDays: value.afterDays }))
  • 写入本地文件
    lib/conversation-maintenance.js:50
    await rename(temporary, settingsPath)
  • 删除本地文件
    lib/conversation-maintenance.js:51
    } finally { await rm(temporary, { force: true }) }
  • 写入本地文件
    lib/conversation-maintenance.js:146
    await mkdir(workspacePath, { recursive: true })
  • 发起网络请求
    client-core.js:172
    const response = await fetch(url, {
  • 发起网络请求
    client-core.js:915
    fetch(`${API_BASE}/diag`, {
  • 发起网络请求
    client.js:1161
    const response = await fetch(url, {
  • 发起网络请求
    client.js:1904
    fetch(`${API_BASE}/diag`, {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-host-webserver
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

为 DSH NEXT 提供会话删除、搜索管理、删除确认和可选备份的社区插件。

README

由 DeepSeek 最新模型翻译生成
DSH Chat Prune 给 DSH NEXT 整理对话:先看清,再归档、保留或修剪。 MIT 开源 ·安装 ·使用说明 ·常见问题 ·参与开发 这是一个社区插件。既能从左侧会话列表删除单个对话,也能在「管理对话」中查看占用、筛选记录、批量归档和置顶,按保留规则找出值得修剪的旧会话。 能做什么 - 直接删除:鼠标移到会话行,点击右侧垃圾桶。 - 筛选与盘点:按标题、工作区、会话 ID、归档/置顶/加载状态、更新时间和记录大小筛选;支持最近、最早、最大和标题排序。 - 批量整理:选择本页或全部筛选结果,批量归档、取消归档、置顶或取消置顶。每页显示 50 条,减少长列表卡顿。 - 保留规则修剪:设置「每个工作区保留最近 N 条」和「只修剪早于多少天的记录」,生成候选;始终保护置顶、已加载及时间未知的会话。 - 先预览再执行:批量操作显示完整目标清单、记录大小和跳过数量;逐条执行并显示成功/失败明细,可停止后续任务。 - 确认后再删:删除前显示目标和备份设置,避免点错。 - 可选备份:批量删除默认勾选「删除前备份」,也可为单条删除设置全局备份;成功时显示备份位置。 - 列表同步更新:删除后同步更新工作区、置顶、归档和客户端会话名单,无需每删一次就重载界面。 - 跟随 DSH 主题:确认框、管理窗口和提示使用宿主的主题配色;切换主题时,已打开的窗口也会同步变化。
展开完整文档(README 剩余 1 节)
DSH Chat Prune

给 DSH NEXT 整理对话:先看清,再归档、保留或修剪。

MIT 开源 ·安装 ·使用说明 ·常见问题 ·参与开发

这是一个社区插件。既能从左侧会话列表删除单个对话,也能在「管理对话」中查看占用、筛选记录、批量归档和置顶,按保留规则找出值得修剪的旧会话。

能做什么

- 直接删除:鼠标移到会话行,点击右侧垃圾桶。
- 筛选与盘点:按标题、工作区、会话 ID、归档/置顶/加载状态、更新时间和记录大小筛选;支持最近、最早、最大和标题排序。
- 批量整理:选择本页或全部筛选结果,批量归档、取消归档、置顶或取消置顶。每页显示 50 条,减少长列表卡顿。
- 保留规则修剪:设置「每个工作区保留最近 N 条」和「只修剪早于多少天的记录」,生成候选;始终保护置顶、已加载及时间未知的会话。
- 先预览再执行:批量操作显示完整目标清单、记录大小和跳过数量;逐条执行并显示成功/失败明细,可停止后续任务。
- 确认后再删:删除前显示目标和备份设置,避免点错。
- 可选备份:批量删除默认勾选「删除前备份」,也可为单条删除设置全局备份;成功时显示备份位置。
- 列表同步更新:删除后同步更新工作区、置顶、归档和客户端会话名单,无需每删一次就重载界面。
- 跟随 DSH 主题:确认框、管理窗口和提示使用宿主的主题配色;切换主题时,已打开的窗口也会同步变化。
- 保护已加载的会话:默认拒绝删除仍被宿主使用的对话。

归档保留记录,删除会移除本地记录。 单条删除默认不备份;批量删除默认勾选备份。恢复备份仍需离线手动操作。删除前请核对确认窗口中的备份策略。

适用环境

| 项目 | 说明 |
| 宿主 | DSH NEXT,需支持客户端插件及工作区服务 |
| 系统 | 当前在线删除支持 Windows |
| Node.js | 使用桌面版自带的 dsh 命令安装即可;源码开发建议使用 Node.js 24,插件最低要求为 20 |
| 兼容性 | 已在本机 DSH NEXT 的真实 Host 和官方界面验证;不同宿主版本仍可能需要适配 |

macOS / Linux 的在线删除目前未开放。Node.js 缺少 zstd 支持时,部分压缩日志的标题可能读不到,仍可按对话 ID 管理。

安装

使用 DSH NEXT 桌面版自带的 dsh 命令安装。先打开过一次桌面应用以初始化 profile,再从系统托盘正常退出 DSH。

在终端执行:

dsh plugin --profile desktop add https://github.com/Cans518/dsh-chat-prune/releases/download/v0.4.0/dsh-chat-prune-0.4.0.tgz

安装完成后重新打开 DSH。该命令会安装依赖并自动启用插件,不需要手动编辑 package.json 或添加 YAML 挂载条目。安装包已包含构建产物,不需要用户克隆源码或编译。

这版 DSH 的完整命令是 dsh plugin --profile <profile> add <安装源>,不是顶层 dsh add。desktop 是桌面专用 profile,应使用桌面版提供的命令;npm 安装的独立 DSH CLI 不允许管理它。终端找不到 dsh 时,请先启用桌面版的命令行入口并重新打开终端。

使用 Web profile 时,将命令中的 desktop 换成 web。请确保安装到实际使用的 profile。

离线安装

也可以从 Releases 下载 .tgz,使用实际文件路径安装:

dsh plugin --profile desktop add "C:\Downloads\dsh-chat-prune-0.4.0.tgz"

从源码安装

适合开发者。构建完成后仍通过 DSH 命令安装:

git clone https://github.com/Cans518/dsh-chat-prune.git
cd dsh-chat-prune
npm ci --legacy-peer-deps
npm run build
npm test
npm pack
$pluginPackage = (Resolve-Path '.\dsh-chat-prune-0.4.0.tgz').Path
dsh plugin --profile desktop add $pluginPackage

怎么用

从侧栏删除

1. 展开左侧工作区。
2. 将鼠标移到要删除的具体会话行上。
3. 点击右侧垃圾桶,核对确认窗口中的目标和备份设置。
4. 点击「确认删除」。完成后,会话从列表中消失。

工作区文件夹行本身没有会话删除按钮。按 Escape 或点击「取消」可以放弃操作。

从「管理对话」删除

点击右下角的管理对话。每条记录展示标题、工作区、大小、文件更新时间、会话 ID 和保护状态。可以输入标题、工作区名称或 ID,也可以组合工作区、状态、天数和大小筛选。找到目标后点击该行的删除按钮即可单独删除。

同名、无标题、已归档的会话,以及记录已缺失但索引仍有残留的条目,都可以在这里查找。被宿主加载的会话会标记原因并禁止删除。

批量归档、置顶或删除

1. 先筛选目标,勾选记录,或点击「选择本页」/「选择全部筛选结果」。更改筛选会清空选择;翻页会保留选择。
2. 在「批量操作」中选择归档、取消归档、置顶、取消置顶或删除记录。
3. 点击「预览所选操作」,核对完整目标清单。取消不会更改记录。
4. 确认后逐条执行。可点击「停止后续任务」,等待当前请求完成后停止;已完成的操作保留。
5. 查看成功、失败、跳过和未执行数量,以及每条结果。失败项保留选择,修复原因后可重新预览。
归档会保留记录并取消置顶;取消归档不会自动恢复置顶。归档中的会话需要先取消归档才能置顶。有活动任务的归档由宿主拒绝,插件不会强制停止任务。缺少相应宿主能力时,操作选项不可用。

批量删除始终跳过置顶和已加载会话,且默认勾选备份。预览后会话更新、被置顶或被加载时,执行会拒绝对应记录并报告原因;不会自动扩大删除范围。请求超时会停止后续任务,需刷新确认结果后再重试。

按规则修剪旧会话

打开「按保留规则修剪」,设置保留数量和天数,再点击「生成修剪候选」。例如:每个工作区保留最近 10 条,只修剪早于 30 天的记录。

候选仅来自当前筛选范围,但「最近 N 条」按整个工作区计算。置顶、已加载、记录缺失及更新时间未知的会话不会进入候选;天数使用严格早于条件。生成候选和预览都不会修改数据,之后仍需选择操作、预览并确认。确认预览前会重新计算保留规则。

要清理缺失记录的残留索引,请使用「记录缺失」状态筛选并手动选择。修剪规则不会将这类条目混入旧记录。

「更新时间」取会话目录内非临时文件的最新修改时间,并非最后一条消息的精确时间;大小包含会话目录中的嵌套文件,不含投影缓存或已有备份。删除时另有缓存清理,且备份会消耗空间,因此显示的记录大小不等同于实际释放空间。

开启备份

在 DSH 正常退出后,编辑安装目录中的:

<DSH 数据目录>/profiles/<profile>/node_modules/dsh-chat-prune/cordis.patch.yml

把 backup: false 改为 backup: true,保存后重新打开 DSH。

| 设置 | 默认值 | 用途 |
| backup | false | true 时先完整备份会话目录,备份失败则不删除 |
| allowRunning | false | 建议保持默认;兼容开关,不能绕过宿主的写入锁 |
| icon | 'trash' | 保留配置项,目前只提供垃圾桶图标 |

备份保存在 <DSH 数据目录>/deleted-sessions/,每次备份目录中附有 restore.json,记录原路径和恢复说明。备份不会自动清理,请自行管理磁盘空间。

恢复需要先正常退出 DSH,再还原会话目录和对应索引,详见备份与恢复。关闭备份时,插件不提供恢复功能。

更新与卸载

从本项目 0.2.x 迁移

本项目从 0.3.0 起更名为 dsh-chat-prune。npm 上的 dsh-delete-chat 属于其他作者,请使用本仓库的 Release 安装地址。

如果安装过本项目的旧版,请先正常退出 DSH,另存旧插件 cordis.patch.yml 中自己修改过的设置,再依次执行:

dsh plugin --profile desktop remove dsh-delete-chat
dsh plugin --profile desktop add https://github.com/Cans518/dsh-chat-prune/releases/download/v0.4.0/dsh-chat-prune-0.4.0.tgz

需要恢复设置时,只将 backup、allowRunning、icon 的值填入新插件的配置文件,保留新版的 id 和 name;不要用旧文件覆盖整个新文件。然后重新打开 DSH。已有会话和 deleted-sessions 备份目录不受改名影响。请勿同时启用新旧两版。

更新: 正常退出 DSH,按新版本的 Release 说明重新执行 dsh plugin --profile desktop add <新安装包地址>,再打开 DSH。安装前请另存自己修改过的插件 cordis.patch.yml,更新后按需恢复设置。

已有依赖但被手动停用的插件,重复 add 不会自动重新启用;请到 DSH 的插件管理页启用。

源码开发时,已经安装并启用插件也可在构建和测试通过后运行本地更新脚本:

.\scripts\install-local.ps1 -Profile desktop

该脚本会备份旧文件、保留现有插件配置,并校验复制结果;不会自动重启 DSH。支持 -WhatIf 预览。

卸载: 正常退出 DSH,再执行:

dsh plugin --profile desktop remove dsh-chat-prune

命令会移除依赖和对应的 bundle 选择。重新打开 DSH 即可。卸载不会还原此前删除的会话,也不会自动清理备份。

常见问题

看不到垃圾桶?

先展开工作区,再悬停具体会话行。安装或更新后需要完整退出并重开 DSH。如果侧栏仍没有按钮,可检查右下角是否有「管理对话」,并确认启用的是当前使用的 profile。

为什么提示「正在运行或已加载」?

即使当前没有生成内容,宿主也可能仍占用该会话。请先释放它再删除。如果宿主没有关闭会话的入口,可以正常退出并重开 DSH,从「管理对话」中删除尚未打开的历史会话。

删除后为什么还在另一个列表里?

0.2.2 已修复客户端旧名单导致的残留显示。更新后完整重启一次 DSH;之后正常删除无需重载页面。若提示「删除已完成,但列表刷新失败」,请在管理窗口点击「刷新列表」,不必再次删除。

标题显示不出来怎么办?

无标题、日志格式不兼容或标题扫描超出限制时,会使用对话 ID。可在「管理对话」中按 ID 定位。

如何反馈问题?

请在 Issues 中说明插件版本、DSH 版本、操作步骤和完整错误提示。截图或日志请先去掉 API Key、对话正文及个人路径。插件不会自动上传对话内容到外部服务。

开发与贡献

开发命令、测试范围和目录说明见 CONTRIBUTING.md。接口、删除流程和恢复步骤见技术说明,历史问题与验证依据见 AUDIT.md。

欢迎提交 Issue 和 Pull Request。项目采用 MIT License;图标 SVG 也包含在本仓库的 MIT 授权中。本项目为社区维护,与 DSH 官方无隶属关系。
预览分享卡片长什么样 ↓Cans518/dsh-chat-prune
分享 · DeepSeek Harness Hub
Cans518/dsh-chat-prune

筛选并批量清理旧会话,删除前可备份

这是你的仓库?认领条目

回到顶部