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

会话自动归档 wzn16/dsh-auto-archive

DeepSeek 客户端
wzn1635 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

按闲置时长自动归档冷会话并清理无用附件

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

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/wzn16/dsh-auto-archive.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成

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

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 91 处,展示前 47 条)
  • 读取本地文件
    lib/index.js:70
    const info = statSync(dirPath);
  • 读取本地文件
    lib/index.js:77
    entries = readdirSync(dirPath, { withFileTypes: true });
  • 读取本地文件
    lib/index.js:94
    total += statSync(child).size || 0;
  • 删除本地文件递归
    lib/index.js:177
    rmSync(dirPath, { recursive: true, force: true });
  • 读取本地文件
    lib/index.js:607
    return statSync(dir).isDirectory() ? dir : null;
  • 读取本地文件
    lib/index.js:679
    names = readdirSync(dir);
  • 读取本地文件
    lib/index.js:689
    const buf = readFileSync(join(dir, name));
  • 写入本地文件
    lib/index.js:841
    mkdirSync(trashBatch, { recursive: true });
  • 写入本地文件
    lib/index.js:849
    renameSync(src, join(trashBatch, sha));
  • 删除本地文件
    lib/index.js:881
    unlinkSync(p);
  • 删除本地文件递归
    lib/index.js:888
    rmSync(batchDir, { recursive: true, force: true });
  • 发起网络请求
    lib/client.js:118
    return fetch("/dsh-archived/" + action, {
  • 读取本地文件
    lib/auto-archive.js:119
    if (!existsSync(p))
  • 读取本地文件
    lib/auto-archive.js:121
    const raw = JSON.parse(readFileSync(p, "utf8"));
  • 写入本地文件
    lib/auto-archive.js:138
    writeFileSync(tmp, JSON.stringify([...titlelessCache]));
  • 写入本地文件
    lib/auto-archive.js:139
    renameSync(tmp, p);
  • 读取本地文件
    lib/auto-archive.js:225
    const files = existsSync(dir) ? readdirSync(dir) : [];
  • 读取本地文件
    lib/auto-archive.js:225
    const files = existsSync(dir) ? readdirSync(dir) : [];
  • 读取本地文件
    lib/auto-archive.js:231
    const buf = readFileSync(join(dir, name));
  • 读取本地文件
    lib/auto-archive.js:264
    if (!existsSync(p))
  • 写入本地文件
    lib/auto-archive.js:286
    writeFileSync(tmp, JSON.stringify(obj));
  • 写入本地文件
    lib/auto-archive.js:287
    renameSync(tmp, p);
  • 写入本地文件
    lib/auto-archive.js:541
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/auto-archive.js:543
    writeFileSync(tmp, JSON.stringify(state, null, 2), "utf8");
  • 读取本地文件
    src/auto-archive.ts:173
    if (!existsSync(p)) return;
  • 读取本地文件
    src/auto-archive.ts:174
    const raw = JSON.parse(readFileSync(p, "utf8")) as unknown;
  • 写入本地文件
    src/auto-archive.ts:187
    writeFileSync(tmp, JSON.stringify([...titlelessCache]));
  • 写入本地文件
    src/auto-archive.ts:188
    renameSync(tmp, p);
  • 读取本地文件
    src/auto-archive.ts:265
    const files = existsSync(dir) ? readdirSync(dir) : [];
  • 读取本地文件
    src/auto-archive.ts:265
    const files = existsSync(dir) ? readdirSync(dir) : [];
  • 读取本地文件
    src/auto-archive.ts:270
    const buf = readFileSync(join(dir, name));
  • 读取本地文件
    src/auto-archive.ts:298
    if (!existsSync(p)) return titlesDisk;
  • 写入本地文件
    src/auto-archive.ts:315
    writeFileSync(tmp, JSON.stringify(obj));
  • 写入本地文件
    src/auto-archive.ts:316
    renameSync(tmp, p);
  • 写入本地文件
    src/auto-archive.ts:607
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    src/auto-archive.ts:609
    writeFileSync(tmp, JSON.stringify(state, null, 2), "utf8");
  • 读取本地文件
    src/index.ts:279
    const info = statSync(dirPath);
  • 读取本地文件
    src/index.ts:284
    entries = readdirSync(dirPath, { withFileTypes: true });
  • 读取本地文件
    src/index.ts:297
    total += statSync(child).size || 0;
  • 删除本地文件递归
    src/index.ts:372
    rmSync(dirPath, { recursive: true, force: true });
  • 读取本地文件
    src/index.ts:834
    return statSync(dir).isDirectory() ? dir : null;
  • 读取本地文件
    src/index.ts:903
    names = readdirSync(dir);
  • 读取本地文件
    src/index.ts:911
    const buf = readFileSync(join(dir, name));
  • 写入本地文件
    src/index.ts:1048
    mkdirSync(trashBatch, { recursive: true });
  • 写入本地文件
    src/index.ts:1056
    renameSync(src, join(trashBatch, sha));
  • 删除本地文件
    src/index.ts:1086
    unlinkSync(p);
  • 删除本地文件递归
    src/index.ts:1092
    rmSync(batchDir, { recursive: true, force: true });
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

功能亮点

  • 按闲置时长归档会话
  • 管理已归档会话
  • 清理无用附件

DeepSeek Harness 自动归档:闲置超过阈值的会话自动归档,并提供完整的已归档会话管理界面 · DSH 自动归档插件

README

由 DeepSeek 最新模型翻译生成
dsh-auto-archive DSH 会话自动归档插件 —— 在原 dsh-archived-sessions(归档会话管理)基础上加入后台自动归档引擎,按闲置时长把冷会话自动移入归档区。 在 Harness 的「设置 → 归档会话」页面提供: 自动归档(新增) - 闲置阈值:会话文件超过 N 天未写入(默认 14 天)即自动归档;mtime 取会话目录内所有代际日志(session.jsonl.zstd / session.v3.jsonl.zstd 等)的最新写入时间 - ⚠️ 闲置 = 最后活跃时间(日志最后写入),不是会话创建时间。侧边栏列表显示的是创建时间,一个「17 天前」的会话如果几天前还有活动(如「继续会话」派生写入),实际并未闲置满阈值,不会被归档。
展开完整文档(README 剩余 1 节)
dsh-auto-archive

DSH 会话自动归档插件 —— 在原 dsh-archived-sessions(归档会话管理)基础上加入后台自动归档引擎,按闲置时长把冷会话自动移入归档区。

在 Harness 的「设置 → 归档会话」页面提供:

自动归档(新增)

- 闲置阈值:会话文件超过 N 天未写入(默认 14 天)即自动归档;mtime 取会话目录内所有代际日志(session.jsonl.zstd / session.v3.jsonl.zstd 等)的最新写入时间
- ⚠️ 闲置 = 最后活跃时间(日志最后写入),不是会话创建时间。侧边栏列表显示的是创建时间,一个「17 天前」的会话如果几天前还有活动(如「继续会话」派生写入),实际并未闲置满阈值,不会被归档。设置面板的会话清单同时显示两个口径(「创建 X 天前 · 闲置 Y 天」)
- 后台定时扫描:默认每天 1 次(可调 0.25–365 天),Harness 启动 3 分钟后跑首轮;扫描不重叠
- 安全护栏(自动归档只碰完全冷掉的会话):
- 正在运行回合的会话永不触碰
- 仍驻留内存(live)的会话一律跳过,哪怕文件已安静多日
- 置顶会话(侧边栏钉住)永不自动归档
- 手动排除清单(excludeIds)里的会话永不自动归档
- 已在归档区的会话天然幂等跳过
- 归档通道:优先走官方 workspaceRegistry.archiveSession(),异常时降级为 storage 域直写 + 私有缓存同步(与 dsh-session-manager 同一套兜底)
- 设置卡片:开关 / 阈值 / 周期编辑、立即扫描(仅预览)、立即扫描并归档(二次确认)、最近一次扫描审计与待归档预览列表
- 手动归档:会话清单逐个「归档」/「永不自动归档」(排除清单 UI 化),无需等闲置阈值

附件清理(v0.4.0 新增)

会话里粘贴/拖入的图片和文件原件存于 <harness-home>/attachments/v1/objects(按 sha256 分片),日积月累可达上百 MB。本插件把它和归档状态联动起来:

- 扫描:解压所有未归档(含活跃)会话日志,建立附件引用索引;「未被任何未归档会话引用」的附件 = 只被已归档会话或已删除会话使用 → 列为可清理
- 跨平台:引用匹配按附件的 sha256 文件名(与路径分隔符无关),Windows 反斜杠路径同样命中;匹配刻意宽松——宁可少清、绝不误删
- 安全:扫描手动触发(数百会话约 5–20 秒),不做任何自动删除;清理需两步确认且不可逆;逐文件删除,单个失败(如 Windows 上文件被杀毒/索引短暂占用)不中断整批
- 仅处理 objects/ 下的 sha 命名文件,request-images/、tmp/ 等一概不动

归档会话管理(继承自原插件)

- 查看所有已归档会话(标题、创建时间、所属目录、磁盘路径、占用空间)
- 释放(取消归档)—— 单个、批量、一键全部
- 从硬盘删除 —— 单个、批量、一键清空(两步确认)
- 点击标题展开预览会话内容(用户 / 助手 / 工具消息)

⚠️ 安全提示:本插件包含「从硬盘删除会话文件」能力,删除不可恢复。自动归档只做归档(可逆),删除始终需要手动触发。安装前请自行审阅源码。

状态持久化

配置与最近一次扫描审计存于 harness 根目录的 dsh-auto-archive.json(根目录由会话产物路径自动推导,如 ~/Library/Application Support/dsh-desktop/harness/dsh-auto-archive.json),原子写入,可直接手工编辑后重启。

安装(本地 link 方式)

1. profile 依赖加入本地链接
cd ~/Library/Application\ Support/dsh-desktop/harness/profiles/web
pnpm add "link:/path/to/dsh-auto-archive"

2. 重启 DSH,设置面板出现「归档会话」页与「自动归档」卡片

或从 GitHub 安装(推荐,克隆后 link):

1. 克隆仓库到本地任意位置
git clone https://github.com/wzn16/dsh-auto-archive.git

2. profile 依赖加入本地链接(路径换成你自己的克隆位置)
cd ~/Library/Application\ Support/dsh-desktop/harness/profiles/web
pnpm add "link:/path/to/dsh-auto-archive"

3. 重启 DSH,设置面板出现「归档会话」页与「自动归档」卡片

开发

npm install # typescript 等构建依赖(运行时零外部依赖)
npm run build # tsc 宿主 + tsc client + ModuleLoader 包装
npm run typecheck

源码结构:

- src/auto-archive.ts — 自动归档引擎:配置持久化、扫描/归档、调度器
- src/index.ts — 宿主半:/dsh-archived/* JSON API(list/unarchive/delete/detail + auto-status/auto-config-set/auto-scan)、路由注册、调度器生命周期
- src/client.tsx — Web 设置页:自动归档卡片 + 归档会话管理表格

致谢与许可

归档管理部分基于 MuWinds 的 dsh-archived-sessions(MIT)改写;自动归档引擎与降级归档逻辑参考了 dsh-session-manager 对 registry 缓存一致性的处理经验。本项目 MIT。
预览分享卡片长什么样 ↓wzn16/dsh-auto-archive
分享 · DeepSeek Harness Hub
wzn16/dsh-auto-archive

按闲置时长自动归档冷会话并清理无用附件

这是你的仓库?认领条目

回到顶部