Releases: Isle-ux/dsh-archive-keeper-plugin
Release list
v1.3.0 — 提炼全自动,删掉「重新提炼」按钮
v1.3.0 — 提炼全自动,删掉「重新提炼」按钮
本次发布把提炼改成彻底自动,并删除会卡住界面的手动触发入口。
核心变化
1. 提炼不再需要任何手动操作
此前只有归档列表变长时才会触发提炼。现在改为:归档列表有任何变化就检查一遍,且每次启动都会兜底补扫。归档完就不用再管了。
2. 删掉「重新提炼」按钮,连同 /run 与 /retry 路由
v1.1.0 曾声称修好「点重新提炼卡住界面」,但那次修复是治标的——它只是把按钮在提炼期间置灰。
真正的病根是接口本身:它做阻塞式全量磁盘 IO,而前端又在轮询它,两者叠加就把对话界面堵死。
这次直接去掉触发入口,而不是修触发入口,从结构上消除这类卡死。
3. 失败改为自动重试,重试用尽才记「提炼失败」
新增 attempts 计数(最多 3 次,ARCHIVE_KEEPER_MAX_ATTEMPTS 可调):
- 还在重试中的失败计入「待提炼」,不会过早打扰你
- 3 次用尽才进入「提炼失败」独立分组(红色,没有失败项时整组不显示)
- 该分组只提供一个动作:「删除」(这类会话没有摘要可恢复)
4. 修复「只留摘要的会话永远显示未提炼」
判据从「state 记着 ok」改为「state 记着 ok,或摘要文件确实存在」。
修复前实测「归档 15 / 已提炼 11」,4 条怎么都消不掉;修复后 15/15。
5. 原文已丢失的会话改为自动清理
missing 以前会永久占着「无法提炼」计数。现在确认原文确实不在磁盘上后自动从归档列表移除
(--no-purge 可关)。error 不清理——两者是不同概念:一个没得救,一个还能重试。
6. 重写提炼提示词,要点质量明显提升
明确了「自足、具体、有用、不编造、不写套话」的写作要求,列出重点抓取的信息
(用户偏好与禁忌 / 纠正与不满 / 环境事实 / 技术决策及理由 / 产出文件绝对路径 / 踩坑与解法 / 未完成事项),
并配了「差例 / 好例」对照。实测同一条真实会话,要点从「排查了报错、进行了修复」这类套话,
变成 8 条各自可独立读懂、带具体路径和版本号的结论。
7. 「提炼失败」的删除动作带双重安全闸
宿主侧要求会话确实处于 error 状态且重试已用尽才允许删除;keeper 侧再次校验状态。两层都过不了就拒绝。
安装 / 升级
# 从 GitHub 安装(推荐,git+https 避免 SSH 报错)
dsh plugin add "git+https://github.com/Isle-ux/dsh-archive-keeper-plugin.git"
# 或从下方 tgz 附件安装
dsh plugin add ./dsh-archive-keeper-1.3.0.tgz升级后请重启 DSH。
验证
| 层级 | 结果 |
|---|---|
| 语法检查 | 7/7 |
| 契约自检 | 49/49 |
| 沙盒功能测试 | 14/14 |
| HTTP 路由测试 | 31/31 |
| 完整栈浏览器验证 | 13 插件全装,0 boot 报错、0 pageerror |
浏览器验证直接链到本发布副本:界面显示「归档总数 15 · 已提炼 15」,筛选栏无「提炼失败」分组,
并确认已无「重新提炼」按钮。
Full Changelog: v1.2.0...v1.3.0
v1.2.0 — 终态会话不再反复重试 + 日志落盘 + JSON 截断容错
修复三个问题,并修掉一处隐藏崩溃。
1. 无法提炼的会话不再被反复重试
有些会话永远无法提炼——原文已从磁盘删掉(missing),或提炼确实失败(error)。此前判据是「只要不是 ok 就算待处理」,这些死记录每次运行都被重新挑中,「待提炼」永远降不到 0,界面看起来就像卡住了。
现在标记为终态并跳过:
- 数量单独显示为「无法提炼 N」,不再混进「待提炼」
- 每次运行写明跳过了几个、分别什么原因
- 要重试请显式加
--retry-failed,平时不再自动重试
面板计数现在是四项自洽:归档总数 = 已提炼 + 无法提炼 + 待提炼
2. 提炼日志落盘
新增 state/keeper.log,记录每次启动、每个会话结果、跳过原因,以及子进程异常退出时的尾部输出。出问题不用再靠复现。超 1 MB 自动留最后 2000 行轮转。
3. 模型输出被截断时不再白跑一趟
模型回复偶尔被长度上限截断,末尾少个 } 或半条数组,JSON.parse 直接失败,整个会话记为 error。现在会尝试把不完整的 JSON 补全后重新解析,能救回多少字段就留多少。
截断点若落在某个值的字符串中间,会主动放弃——硬拼出来是个被腰斩的摘要,比没有更误导人。
4. 修掉 extract.cjs 里隐藏的 ReferenceError
会话元数据缺失时会抛 file is not defined(file 是另一个函数的形参,不在该作用域内),导致该会话必然失败。真实会话把 id 放在事件顶层,所以这条路径平时走不到——属于「一旦触发就必然失败、且极难排查」的那类问题。
验证:14 项语法检查、契约自检 12/12、沙盒功能测试 12/12、HTTP 路由 15/15、JSON 抢救 17/17、发布包沙盒 21/21、tgz 安装验证 23/23、README 两条安装命令实测 10/10,并在完整 12 插件栈的浏览器里实测 0 boot 报错。
安装:
npm i git+https://github.com/Isle-ux/dsh-archive-keeper-plugin.git
⚠️ 别写成npm i github:Isle-ux/dsh-archive-keeper-plugin—— npm 会把github:简写改写成 SSH,没配 SSH key 的机器会直接报Permission denied (publickey)。
也可以下载下方 dsh-archive-keeper-1.2.0.tgz 本地安装(附 .sha256 校验和),这种方式不依赖 GitHub 连通性,网络不好时最稳。
v1.1.0 — 实时计数 & 修复重新提炼卡住界面
修复两个问题
1. 提炼完成后再次点击「重新提炼」会卡住界面
此前宿主的路由无论提炼是否真的启动都回报"已启动",前端因此一直停在等待状态;
同时按钮在提炼进行中既不置灰、也不拦截重复点击 —— 连点几次后界面看起来就像卡死了,
必须重新进入对话才能恢复。
现在:
- 提炼进行中,按钮变为「提炼中…」并置灰,点它不会有任何反应
- 宿主如实回报是否真的启动了提炼;已在提炼中时返回
started: false, reason: "already-running" - 提炼进行中自动把刷新频率从 15s 提到 1.5s,跑完立即恢复可点
- 提示文案区分「已开始提炼」「已有提炼正在进行,请稍候」「无法启动提炼」三种情况
2. 「归档总数 / 已提炼」只记历史累计,不会随实际变化
这两个数字此前取自已处理会话的历史记录,只增不减,会和实际列表对不上
(例如显示「归档总数 17 · 已提炼 17」,但列表里只有 16 条)。
现在改为实时统计,以当前归档列表为准:
归档总数 17 · 已提炼 16 · 待提炼 1
- 取消归档一个会话 → 归档总数立刻下降
- 摘要被删掉 → 已提炼立刻下降、待提炼相应上升
- 三者恒自洽:
归档总数 = 已提炼 + 待提炼 - 新增「待提炼」数字,正在提炼时追加显示
· 提炼中… - 历史累计值保留在接口的
historyArchivedTotal/historyProcessedTotal字段中
安装
npm i github:Isle-ux/dsh-archive-keeper-plugin验证情况
本次修复在 DSH 0.2.0-rc.2(Windows 11 桌面版)上完成验证:
- 语法检查:7 个 JS/CJS 文件全部通过
- 契约自检:模拟
ModuleLoader求值,apply/inject齐全、无default导出、
exports含"./client"—— 共 31 项通过 - 沙盒功能测试:临时目录造假数据,验证实时计数随归档增删同步变化、重复点击被正确拦截
- 真实浏览器验证:镜像 profile + 完整 12 插件栈启动,0 boot 报错,
「归档守护」面板正常渲染,两个修复均实测生效
⚠️ 兼容性说明:本插件按 DSH0.2.0-rc.2开发。不同 DSH 版本的座位名
(conversation.session.header.utilities)可能不同;若你的版本未声明该座位,
插件不会报错,只是不显示。详见 README 的「与其他插件的兼容性」一节。
完整对比:v1.0.0...v1.1.0
v1.0.0 — 归档守护首个正式版本
归档守护 v1.0.0 —— 首个正式版本
DSH 的「归档」只改标记、不动磁盘。时间一长,$DSH_HOME/sessions/ 会堆下一大坨再也不会翻的原文。
归档守护把归档会话自动提炼成结构化要点,并在对话头部加一个面板,让你逐条决定去留 —— 而且任何删除都先移入回收站,随时可恢复。
开发与验证环境:DSH
0.2.0-rc.2(桌面版 / Windows 11)
核心功能
🔄 归档后自动提炼
轮询归档列表,出现新的归档会话就调起提炼流程,压成结构化要点:概括 / 决定 / 事实 / 交付物 / 待办项 / 可作废项,并给出「是否值得留存」的判断。
✅ 由你自己定去留
每条归档都是可展开的卡片,四个选项:
| 选项 | 含义 |
|---|---|
| 保留原文 | 什么都不删 |
| 只留摘要 | 删除原文,只保留要点 |
| 彻底删除 | 原文和摘要都移入回收站 |
| 恢复原文 | 把之前移入回收站的原文搬回来 |
🗂 四级分组
按 年份 → 日期 → 时段 → 标签 归类。时段只分 上午 / 下午 / 晚上;年份日期越新越靠上;没打标签的归入「未分类」。
⚙ 自定义价值判断
内置 8 个常见标签(重要 / 环境事实 / 用户偏好 / 教训 / 待跟进 / 可复用 / 项目 / 灵感),可自建。收纳规则支持关键词 / 分类 / 用户轮数区间组合条件(多条件是「且」)—— 命中规则的会话优先纳入「值得留存」,没命中的才回落到默认判断。
🗑 回收站
所有删除都先移入 trash/,面板显示占用,可逐条恢复或清空。
安装
npm i github:Isle-ux/dsh-archive-keeper-plugin或克隆后链接进 profile 的 node_modules:
git clone https://github.com/Isle-ux/dsh-archive-keeper-plugin.git然后把插件加进 profile 的 dsh.profile.bundles。本包自带全部运行代码,无需额外依赖。
安全边界
- 永不自动删除任何东西。 删除只发生在你显式点击并二次确认之后。
- 删除是移动到
trash/,不是真删,随时可搬回。 - 清空回收站是唯一不可逆的操作,会二次确认。
- 数据写在用户目录,与插件安装位置无关 —— 升级或重装插件不影响已有数据。
兼容性
| 项目 | 说明 |
|---|---|
| 开发/验证版本 | DSH 0.2.0-rc.2(桌面版 / Windows 11),完整验证通过 |
| 生效范围 | 仅桌面版 / 网页版(界面半边注册在 conversation.session.header.utilities 座位) |
| Node.js | ≥ 20 |
| 模型 | 提炼步骤会调用模型,需在 DSH 里配好可用的模型路由 |
与其他插件的兼容性
不会与其他插件冲突。 conversation.session.header.utilities 是 kind: "list" 座位,支持多个插件并排显示(按 priority → order 排序),不是独占座位。你不需要在本插件和其他插件之间做取舍。
依据:DSH 源码里该座位的声明为 kind: "list"、scope: "session";DSH 自带的 dsh-client-ui-open-in-app 与 dsh-client-ui-schedule 本身就注册在同一条座位上。
唯一会冲突的情况是另一个插件往同一座位注册了完全相同的 id 且 priority 相同 —— 本插件的 id 带命名空间,不会撞车。
我不确定的部分:座位名 conversation.session.header.utilities 来自 DSH 0.2.0-rc.2。如果你的版本没有这条座位,界面半边不会报错,只是不显示;宿主半边(提炼、路由、回收站)仍然正常。本插件未在所有 DSH 版本上测试过,遇到问题欢迎提 Issue 并附版本号。
⚠️ 本插件是按 DSH0.2.0-rc.2开发的。如果你的 DSH 版本对插件清单有不同要求,可能需要按你的版本调整package.json。
English
Archive Keeper v1.0.0 — first stable release
Developed and verified against DSH
0.2.0-rc.2(desktop / Windows 11)
Archiving a session in DSH only flips a flag; it never touches the disk. Over time $DSH_HOME/sessions/ piles up with raw transcripts you will never read again.
This plugin automatically condenses archived sessions into structured digests and adds a panel to the conversation header so you decide what to keep — and every deletion goes to trash first, fully recoverable.
Highlights
- Auto-digest after archiving — summary / decisions / facts / deliverables / open threads / obsolete items, plus a "worth keeping" judgement
- You decide — Keep original · Summary only · Delete entirely · Restore original
- Four-level grouping — year → date → part of day (morning / afternoon / evening) → label
- Customizable — 8 built-in labels, plus admission rules on keywords / category / turn range
- Trash — everything is moved, not erased; restore individually or empty it
Install
npm i github:Isle-ux/dsh-archive-keeper-pluginSafety
Never deletes automatically. Deleting moves to trash/ and can be undone. Emptying the trash is the only irreversible action, and it double-confirms.
Compatibility
Desktop / web only · Node.js ≥ 20 · requires a configured model route in DSH · developed against DSH 0.2.0-rc.2.
Compatibility with other plugins
No conflict with other plugins. conversation.session.header.utilities is a kind: "list"
slot that renders multiple plugins side by side (sorted by priority → order) — not an
exclusive seat. You do not have to choose between this plugin and your others.
DSH's own dsh-client-ui-open-in-app and dsh-client-ui-schedule both register into this same
slot, and the slot is declared kind: "list" / scope: "session" in DSH's source.
The only conflicting case is another plugin registering into the same slot with an identical id
and the same priority; this plugin's ids are namespaced, so they will not collide.
What I cannot guarantee: the slot name comes from DSH 0.2.0-rc.2. If your version does not
declare that slot, the client half will not error — it simply will not appear; the host half
(digesting, routes, trash) keeps working. Not tested across all DSH versions — if you hit a
problem, open an Issue with your version number.
⚠️ Developed against DSH0.2.0-rc.2. If your DSH version has different manifest
requirements, you may need to adjustpackage.json.