# 更新日志
dsh-heartbeat 的完整版本历史,最新的在最上面。
> [README](README.md) 的「版本更新」章节只保留**当前大版本**(v2.1.x)——插件市场的「更新内容」读的就是那一节,所以那里不搬空;更早的记录都收在这里。
- 逐版独立的 release notes(v1.6.2 起):[docs/releases/](docs/releases/README.md)
- v1.4.x 及更早:见 [docs/releases/legacy-changelog.md](docs/releases/legacy-changelog.md)
---
v2.1.x
### v2.1.2 · 2026-11-04(修复:面板槽位同时注册短名与全名,issue #8 跟进)
- **面板槽位 key 改为双注册**:v2.1.1 只注册了 npm 全名 `@kanadego/dsh-heartbeat`,只覆盖 npm 安装方式。实测宿主 plugin-manager 的 `listBundles()` 名字取自 profile 的 `dependencies` / `dsh.profile.bundles` key —— **npm 安装时是全名,`file:` / 本地安装时是短名 `dsh-heartbeat`**,详情页以 `ledger.bundles.has(openPkg.name)` 判定是否渲染配置区,key 对不上则整块不显示。`client.js` 改为同时注册 `dsh-heartbeat` 与 `@kanadego/dsh-heartbeat` 两个 key,`scripts/panel-smoke.mjs` 断言同步覆盖双 key,两种安装方式下面板都不消失。
### v2.1.1 · 2026-11-04(修复:面板槽位 key 用全名,issue #8)
### v2.1.1 · 2026-11-04(修复:面板槽位 key 用全名,issue #8)
- **面板槽位 key 从短名改回 npm 全名**:`plugins.bundle.config` 注册的 key 曾被改成 `dsh-heartbeat`,理由是「宿主 bundle.name 是去掉 scope 的短名」——实测宿主 plugin-manager 的 listBundles 名字取自 manifest dependencies 的 key(完整包名 `@kanadego/dsh-heartbeat`),详情页以 ledger.bundles.has(openPkg.name) 判定是否渲染配置区。短名永远对不上,0.2.1-rc.3+ 上面板整块不显示(issue #8)。改动:client 注册 key 改回 `@kanadego/dsh-heartbeat`,scripts/panel-smoke.mjs 断言同步改回全名。v2.1.0 段里「槽位 key 必须用 bundle 短名」的那条是误判,订正如下。
### v2.1.0 · 未发布(专注模式 · 节律随机化 · 子代理不注入 · 闲逛去重)
节律、暂停与闲逛三处的实际体验修整,外加一条只在子代理身上才看得到的注入泄漏。
- **专注模式**:模块态 + `data/focus.json` 双写。设置卡与 CLI 认同一份状态——CLI 是独立进程,只改内存变量宿主看不见(审查时发现的严重缺陷),所以暂停状态同时落盘;宿主侧 `beat()` 入口取「内存有效值 / 文件 until」的较大者,两个客户端任一设置都能立刻生效,重启后文件那半仍有效(调试中的暂停就该跨重启存活)。暂停期间:不跳、不发消息、不计每日额度、不耗 token,状态栏显示「专注模式 · 至 HH:MM」,审计记一条 `silent / focus-mode`。CLI:`focus <分钟>` / `focus off` / 不带参数查状态。
- **节律随机化**:`setInterval` 改递归 `setTimeout`,每跳在基准值上抖动 ±`policy.heartbeat.intervalJitterPct`%(0–50,默认 20,设 0 关闭);启动那一跳固定 15 秒、不参与抖动;reschedule 时重排;下限 1 分钟;`interval_scheduled` 只在计划变化时记审计。
- **时间注入跳过子代理**:`shouldInjectTime` 之后加 `isSubagentSession`——`header.origin === 'subagent'`、`header.delegationDepth > 0`,header 缺失时回退扫 `sessionEvents` 前 8 条找 `subagent/descriptor`;命中则跳过并记 `time_inject_skipped`。判据来自实测的子代理会话首行(`origin`+`parentSession`+`delegationDepth:1`+`agentPreset`)。
- **闲逛去重**:`addSeed` 入库前查重,范围含近 30 天归档——完全相同网址 / 归一化后同名 / 相似度 >0.85 三条规则;`DEDUP_SIMILAR_MIN_CHARS = 12` 门槛,短标题只走精确与归一化判定(防止「话题素材 1」vs「话题素材 11」= 0.889、「没有新证据的话题」vs「有新证据的话题」= 0.923 被误杀)。判重命中记 `seed_duplicate` 审计(id + reason + similarity,不含正文)。
- **种子上限 2 → 4**:`config/interests.json` 的 `max_seeds_per_focus` 提到 4,`wanderPrompt` 原先硬编码「至多 2 条」改为按实际配置生成;`runWanderTurn` 的 `addSeed` 加 `noMerge: true`,一次闲逛的多条不再被同 topic 合并规则吃掉。
- **原生面板**:设置页里一串折叠区改成一个面板,注册到 `plugins.bundle.config`,七个 tab:状态 / 会话 / 素材 / 兴趣 / 画像 / 周报 / 设置。设置按「节律 / 时间与状态栏 / 表达 / 专注模式」分组,每个参数标生效时机;迁移导入加二次确认;周报正文默认收起。`settings.section` 上的旧面板在 v2.1.0 一并退役:不再挂第二份 UI,注册失败时只留一条「需要 DSH 0.2.1 及以上」的告警。
- **槽位 key 用短名**(`dsh-heartbeat`,不是 `@kanadego/dsh-heartbeat`):当时误判宿主的 bundle 名是去掉 scope 的短名,详情页整块配置区不渲染。**订正(v2.1.1,issue #8):宿主实际按 npm 全名匹配,该结论作废。**
- **面板外观重做**:顶部渐变 hero(logo + 标题 + 徽章)、胶囊式 tab 栏、内容卡片化(卡头带渐变竖条),状态页改成六格指标网格(上次心跳 / 版本 / 今日表达带进度条 / 时间注入 / 上次结果 / 此刻动态)。样式走 `hb-` 前缀的一套 CSS(`ensurePanelStyle()` 幂等注入),颜色全取 `--dsw-alias-*` 变量,深浅主题都跟手。
- **settings 改软依赖**(desktop 0.2.1-rc.3 上报:装完 pending、宿主起不来):`settings` 从模块级 `inject` 里挪走了。cordis 把模块级 inject 当成硬依赖,宿主不给这个服务插件就永远停在 `pending (waiting for service: settings)`——而桌面上光这么一个 pending 就够把整个壳带崩(`openInitialWindow` 里 `Web RPC failed`,随后崩溃弹窗三个按钮全无响应)。设置表单本来就只是便利:节律值来自 `data/settings/ui.json` 加 apply 时的 `config`,没有它照样跳。现在改由 `ctx.inject(['settings'], …)` 延迟挂载:心跳靠 `agents` 一个服务就能起,表单在服务出现时挂上、服务消失时它的副作用跟着回收(cordis 的作用域语义,已用最小 cordis 探针实测:只给 `agents` 时插件照常 apply、`settings` 回调不跑,服务补齐后回调跑一次)。顺手清掉两条早已走不到的旧分支(0.1.5 的 `installSection` 与 0.1.1/0.1.2 的 free-function 回退),`@deepseek-ai/dsh-settings` 随之从 dependencies / devDependencies 移除;新增 `tests/plugin-inject.test.ts` 盯住这一行,防止有人把它加回去。peerDependencies 显式列出 `0.2.1-rc.3`/`rc.4`/`rc.5`。
- **最小 Linux 支持**(issue #6):vault 主密钥不再硬依赖 `powershell.exe`,非 Windows 平台把 32 字节密钥直接写成 `data/vault.key`(0600,scratch → rename 原子发布,发布前回读比对),AES-256-GCM 加解密仍在本进程完成。三处原本会炸的地方改成讲清楚:非 Windows 读 KHBV1 容器不再 spawn 一个不存在的 PowerShell,而是明确报「KHBV1 只属于 Windows、数据不跨平台」;KHBV1 主密钥同理——拒绝而不是静默换新密钥(换掉等于把已有数据全变成打不开的)。`src/core/ps.ts` 的探针运行器在非 Windows 上直接返回失败,截屏 / 空闲 / 锁屏 / 前台窗口 / 桌面通知因此干净降级(静默时段、每日上限、冷却不受影响,只是「他大概在忙」这类判断不触发)。`package.json` 的 `os` 从 `["win32"]` 放开为 `["win32","linux","darwin"]`。数据目录不跨平台迁移(KHBV1 绑 Windows 用户与机器)。
v2.0.x
### v2.0.1 · 2026-10-25(客户端界面支持英文)
设置卡、状态卡与报告面板的文案全部改走 Harness 的 locale 服务。Harness 切成英文时,心跳的界面跟着变英文;中文界面**一个字都没动**。感谢 [@miztizm](https://github.com/miztizm) 的贡献([#5](https://github.com/Kanadego/dsh-heartbeat/pull/5))。
- **界面双语**:157 条文案收进 `heartbeat` 命名空间,zh / en 各一套。语言切换即时生效,不用重启、也不用刷新页面——设置行、状态卡、素材池、用户画像、周报、迁移界面都在里面。
- **中文逐字未改**:这一版只搬字符串。中文文案一个字没改;原先几个拼接碎片改成了模板,插值之后的渲染结果与原版完全一致。
- **数据与宿主侧不受影响**:数据目录、配置项、RPC 接口都没动,升级不需要迁移。心跳报告正文(引擎室那份)仍是原来的中文口径,宿主侧的本地化另开一轮做。
- **兼容性不变**:仍需 DSH 0.1.1 及以上(`locale` 服务从 0.1.1 起就有,已逐个版本验过);取不到 locale 时退回内置中文,不影响界面启动。
### v2.0.0 · 2026-10-17(心事匣 + 摘抄本 + 代码审查:22 项修复 + 结构整改)
第二次全量代码审查(22 项主发现 + 一节低优先级观察)的修复与结构整改,外加两个新功能:**心事匣**——心跳第一次有了「跳与跳之间的缝」;**摘抄本**——心跳第一次有了自己的笔记本。
- **心事匣(新功能)**:一格加密便签(`data/notepad.json`)。投递素材包里带上「你上跳留下的心事」,并附它留于第几跳、已搁多久、这期间被叫醒过几次;**照原样再写一遍算保留(年龄不重算)**,写新的就换掉它,什么都不做下一跳自动清。新增模型工具 `notepad`(write / read / clear),和账本工具一样注册给日常会话,引擎室看不到。序号只认真正的拍——**启动那一拍不计**,状态栏的时间注入也不算。
- **摘抄本(新功能)**:留句子和想记住的小事的地方,落 `data/excerpts.md`(**明文**,和账本同一条理由:要能翻、能手编;认不出的行在改写时原样留着)。注册成模型工具 `excerpt`(add / list / remove),和账本工具一样注册给日常会话,引擎室看不到。它和另两本分工明确——账本记待办(会勾掉),心事匣是留给下一跳的引子(一格、会被盖掉),摘抄本**只增不减**,除非她主动抹掉。
- **加密换代**:数据改用 AES-256-GCM,数据密钥交给 Windows DPAPI(CurrentUser)保管在 `data/vault.key`,进程启动解一次;旧版 1.x 的 DPAPI 容器照样能读,且在写入或每跳维护时自动换代(`vault upgrade` 一次性全换)。**升级后不要再退回 1.x**——旧版本读不了新容器(要退回就趁早、且先别跑 upgrade)。副产物:每个文件一次 PowerShell 的加解密路径消失了,全量测试从 97 秒降到 12 秒。
- **遗忘边界补全**:`wipe` 以前只删 live 三个文件,快照、归档分片、迁移备份都还在,重放能把画像原样长回来。现在 `wipe` 是真遗忘(连快照、归档分片、迁移备份一起删),`burn` 也补上了迁移备份与导入暂存残留。
- **迁移全或无**:导入时只要有一个文件不合格(路径越界、名字不在白名单、超出 5000 文件 / 64MB 预算),整包不落地并如实报错;此前是跳过坏文件、把其余部分导进去。
- **记忆的正确性**:journal 从「记模型的原始操作」改成「记规范化之后的最终事实」,重放只是原样回放、老化也成为可重放的事件——实时算出来的画像与重启后重放出来的画像完全一致(此前两条路径的宽松度不同,老化还不入流水)。旧格式流水照旧能读,新旧混在同一个文件里也逐行判定。
- **证据由代码生成**:模型只能引用本批次给出的观察编号(`o1`、`o2`…),引用位置、时间、来源种类一律由代码填。伪造引用、或自称「手写」把新记忆钉到信心上限的路径,从构造上不再可达。
- **锁失败关闭**:跨进程锁等不到就跳过这次写入并留痕,不再「等 3 秒没等到就照写」;陈旧锁要同时满足年龄与「持有进程确实不在了」才被回收。
- **每一跳都有取消链**:超时、看门狗与插件卸载会真正取消这一跳的模型调用与子进程,不再只是「不再等待」而让旧任务继续往下写。
- **画面不认旧图**:本跳没截到图,就取消本跳的画面资格并烧掉盘上旧图;截图与本跳的时间戳印章对得上才解密使用。
- **观察不丢**:合并期间新到的观察不再被整体清空,只清掉这一轮真正读过的那几条。
- **投递记账**:按说话的那一刻记账(含写入时点的完整复查:静默时段、每日上限、冷却、忙窗、是否正在打字),闸门在复查时若已变化也不影响账——话已经在对方那里,拒绝只说明条件变了,绝不表示「她没说话」。
- **RPC 通道失败关闭**:宿主没提供闸门时,只有 5 个只读端点照常服务,其余全部拒绝并留痕(此前只拒 6 个破坏性端点,等于把画像与素材池向 loopback 敞开)。端点表改为无原型对象,`constructor`、`__proto__` 这类名字不再能穿透。
- **表述收紧**:判「别说」时,之后的**决策与表达**两相不再调用模型(闲逛相在闸门之前触发,另算)——此前文档写「一个 token 都不花」过宽。账本块与摘要也加了长度上限,超预算按整条跳过,不再从句子中间切断。
- **工程卫生**:所有外部输入(模型输出、流水读入、迁移包、RPC 载荷)统一校验形状;原子写先 flush 再改名;加密临时窗口的崩溃残渣在首次使用时清理;CI 增加构建检查、`dist` 一致性检查与客户端 JS 语法检查(跟踪的 `dist` 此前早已过期,npm 会发错包——已重建)。
- **复用的引擎室不会松掉工具面**:`agent_reuse_live` 那条路径跳过 `setup`(白名单就在 `setup` 里钉),插件重启后的那一跳会带着全局层全量跑——实测 62 个工具。现在复用分支单独重新钉一遍白名单。
- **节律配置重启不再被默认值掀掉**:`timeInjectMin` / `statusbar` / `idleMode` / `tokenSaver` 四个字段原先带 schema 默认值,而启动时会用配置值覆盖 `ui.json`——默认值分不出「用户设了」和「没设」,于是每次重载都静悄悄把卡片的选择改回去(实测:状态栏开关重启后自己变回关)。现在这四个字段不写默认值,未设就走卡片、再落到出厂值。
- **投递时不再用裸 agent 发言**:目标会话没活着时,插件会 resume 一个临时 agent 来投递,而那次 resume 没挂预设——于是那一轮的工具面变成进程全局层(实测该会话从 1 个 `run_code` 变成 61 个、呈现模式退回 native,GUI 还弹出工具变更提示)。现在会读会话自己记着的预设 id(`agent-preset/selected`)并挂回去;读不到就照旧裸跑,并留痕 `deliver_target_preset`。
- 新增 38 条回归测试(审查修复)→ 测试 **344** 条;心事匣另加 17 条、摘抄本另加 14 条、复用分支的白名单另加 2 条、投递目标的预设另加 1 条,**总数 378**。
v1.9.x
### v1.9.3 · 2026-10-17(新功能:素材包可留白 + 摘要预算分区 + 画像与素材池 UI 重做)
- **素材包可以留白了**:素材包以前默认"必须挑一条说",agent 想沉默也得硬挑一条凑数。现在改成判断**要不要开口**——该说才选一条,不该说就把正文留空,只如实报一次「这轮没开口」和原因。沉默不再需要客套话。
- **摘要预算分区**:投递给引擎室的画像摘要总预算从 3200 放宽到 6000 字符,并且 tact / topic / wander 三类各有上限(2500 / ≥2400 / 850)——超预算按**整条**跳过并如实回报,不再从句子中间切断。
- **出厂默认更省**:心跳间隔 60 分钟、每日表达上限 10、状态栏默认关闭(都能在设置卡里改)。
- **节省 token 模式真能唤醒**:暂停期间每 3 分钟探一次(不取 agent、不调模型);绑定会话里出现你还没被消化的新消息就立刻恢复。暂停时状态栏写「你不在,心跳挂起」。
- **周报保留期数**:新增 `policy.weekly.keepReports`(默认 3),保存新一期时删掉更老的并留痕 `weekly_pruned`;CLI 与设置卡只给最近 N 期。
- **设置卡重做两块**:画像区改成四个分区按钮切换、每条一块、正文自动换行,并新增只读的「引擎室输入」视图;素材池改成四个按钮——**话题素材 / 聊天素材 / 话题·归档 / 聊天·归档**,归档不再单列一块,点进去行内按钮变成「恢复」。两处列表都加了滚动区,引擎室输入视图同样。
### v1.9.2 · 2026-10-10(修复:预设改为运行时注册 + 数据目录移出包外)
- **预设不再写进安装清单**:修复了心跳模式预设在 profile 解析不到宿主包时,导致整个插件树加载失败、DSH 启动不起来的问题。现已改为插件在加载时自己向宿主注册,超时或失败会自动回退并留痕。
- **补依赖不再把宿主装成两份**:修复了为解析预设包手工补齐依赖后,宿主装载机制出现两份实例、所有会话都无法恢复的问题。现在清单里不再出现任何宿主包,那条补法也用不上了。
- **会话恢复失败不再无限重试**:修复了旧格式会话迁移被拒时,引擎室被反复重试拖住、永远空转的问题。现已把这类永久性失败单独识别,当场重建会话并把正身指过去;真正暂时性的错误仍照旧退避重试。
- **数据目录默认移出包外**:修复了数据默认住在包目录里、`dsh plugin add` 与每次升级替换包目录时连带删掉画像、素材池与正身记录的问题(原本只有显式 `burn` 才会销毁)。默认位置现为 `/heartbeat-data`;老版本装在包内的 `data/` 首次启动自动搬迁——先备份、再逐文件校验(清单、大小、sha256 全部一致),全部通过才删原件与备份,任何一步失败都原地不动。
### v1.9.1 · 2026-10-07(代码审查:86 项修复)
进行了一次全量代码审查,共 86 项。没有功能上的加减,优化了代码结构,清理并修复了一批 bug 与潜在问题:
- **心跳不会再被卡死**:修复了心跳卡在模型调用上时会卡死的问题,现已增加看门狗兜底——此前某一跳若卡住,插件会一直以为自己在跳、之后再也不动,只有重启才好;现在超过 45 分钟即强制收尾并留痕 `beat_watchdog`,下一拍照常(不补跳)。
- **说了话就不会丢账**:修复了投递成功后因超时或异常而漏账、进而导致冷却与每日上限计算错误的问题——现在投递成功无条件落账,超时的也记 `spoke_late`。
- **观察游标改成宿主序号**:优化了游标记进度的逻辑,修复了可能存在的漏读、重读问题——此前按「第几条」记,会话一旦被压缩或事件被重写,游标就会指错地方;现在按宿主绝对序号记,升级后旧游标自动丢弃并重扫一遍(会留一条 `cursor_format_discarded`)。
- **素材不再「说一次就消失」**:优化了聊天种子退场机制,agent 能够在长期话题上连续聊天了——chat 类素材以前被说出口就当场退场,连上下文都没接上;现在至少活到下一次回收,有新证据还会继续留池。
- **画像合并能看到 psy 分区**:修订了用户画像 psy 分区的合并逻辑——**现 psy 分区的内容已可被 agent 看见**(此前模型看不见 psy 条目却能往那儿写,写进去因为没有 id 就再也改不动)。这有意放宽了原先「psy 不出库」的口径。
- **表达被拦下时留下痕迹**:现表达被拦时会留下痕迹,方便查询原因——以前素材包发了出去、目标却没说话时,日志里一片沉默;现在记 `expression_dropped`,连续三次另记一条 `expression_dropped_streak`。
- **RPC 通道多了道自检**:浏览器数据通道的鉴权依赖宿主提供的闸门;宿主没提供时,删除 / 迁移 / 改配置这类端点直接拒绝并留痕(`rpc_host_gate_missing`),而不是默默裸奔。
- **配置里「写了但没生效」的开关全接上**:`config/interests.json` 的 `_schedule`(每日闲逛场次、每场焦点数、每焦点最多几条)和 `config/busy-rules.json` 的四个阈值,以前只有一部分真在读,现在全部读。
- **作息峰值不再被噪声顶掉**:「近期活跃时段」要同时过两道门(强度阈值 + 相对最高值的占比),指数衰减残渣也会归零,不再把一次偶发熬夜报成你的作息。
- 工程卫生:补了类型声明(`types` 字段 + 构建产出 d.ts)、清了重复的锁文件(只留 npm)、加了 CI(Windows runner:`npm ci` → 类型检查 → 测试),并新增 47 个回归测试,测试总数到 **282**。
### v1.9.0 · 2026-10-06(新功能:素材报账,归账不再靠猜)
- **素材报账**:投递素材后由目标会话的 agent **亲口报账**——这轮用了哪几条、用的是「素材本身」还是「顺着素材自己说的话」,都如实记下。此前归账靠事后拿文本做兜底匹配,漏记错记都躲不掉;现在报账带**本次投递编号**核对,不会串到别轮。工具注册在全局层,日常会话里也能用。
- **话题偏好加权**:每条话题按「被采纳率」算权重(30 天半衰期,冷启动中性),闲逛挑话题时自动偏向你真接得住的那些,接不住的慢慢退到后面;**14 天没被碰过的老话题有硬地板**优先轮换,不会被高权重话题永远压在下面。
- **报账缺失可见**:真没等到报账的投递,周报里单独报一行,不再靠「静默次数」糊过去;这类投递不计入偏好统计,免得把「没记账」算成「发了没人要」。
- **素材池审计**:新增 / 合并 / 淘汰 / 归档裁剪 / 恢复 / 删除,全部写进 `data/logs/heartbeat.jsonl`(`seed_added`、`seed_retired`、`seed_archive_trimmed`、`seed_restored`、`seed_deleted`)。只记 id 与元数据,**不记素材正文**——那本日志是明文,正文来自对话,不该落到明文里。
- **归档区上限**:素材归档区超过 `seeds.archiveCap`(默认 50)时按**最老优先**裁掉,不再无限增长;CLI `seeds gc` 会打印裁剪条数。
- **迁移容器 KDF 参数化**:加密容器现在把 KDF 强度记进容器、解密封装按其解密并做范围校验(此前写死,哪天调强就会把旧容器误报成「密码错」)。**旧容器不受影响,照常解**。
- **周报锚定**:装好当周不再立刻出一份空报,而是记下起点、满 7 天出第一期——行为与说明文档一致。
- 修复:报账里的素材编号带方括号 / 引号(如 `[s3]`)现在能正确识别;报账工具写盘超时从 5s 放宽到 15s(DPAPI 单次可能到 2.7s,原来偏紧);闲置时的兜底素材改用画像里的真实条目 id,不再是占位编号。
v1.8.x
### v1.8.0 · 2026-10-05(新功能:周报 + 账本工具)
- **周报**:每 7 天一份,只报道这周干了些什么——表达与静默、画像新认识、账本、素材池、活跃高峰。后台以「心跳」署名写成中性叙述(不是会话里的 agent 在说话),模型失败自动降级为模板拼装。DPAPI 加密落盘,设置卡新增「周报」分区,toast 只提示不载正文。
- **账本工具**:账本注册成模型工具,日常会话里的 agent 听到你提到待办/承诺会**主动记账**、完成自己勾掉,不用再下命令。和心跳、CLI 是同一本账(`data/ledger.md`)。条目被勾掉时日期改记完成日。
- **journal 快照基点**:画像 journal 超 5000 条自动折叠成 DPAPI 快照 + 归档分片,live journal 从零开始,重放成本有界;verify/rebuild 跨快照依然正确。CLI `profile snapshot` 可手动触发。
- **换机迁移 GUI**:设置卡新增「换机迁移」分区(CLI 命令同步提供),支持将记忆迁移到新机器/重装后的新系统——DPAPI 加密的记忆此前换机即失,现在导出/导入迁移包即可,不用再敲命令。
- **引擎室开放压缩工具**:兼容 [billion-context](https://github.com/ranxianglei/billion-context) 插件——其压缩靠模型自调 `compress` 等工具,引擎室白名单现在会探测全局层,`compress`/`decompress`/`acp_status` 存在即放行(`search_context` 因与 dsh-acp 同名工具的历史冲突不自动放行);config `extraTools` 可手工追加。bili 需装在心跳所在 profile。
- **另有两项实用改进**:引擎室轮换后旧会话自动归档(侧栏不再堆积);观察每条字数上限改为 policy 可调(`observe.maxChars`)。
v1.7.x
### v1.7.4 · 2026-09-30(修复:引擎室会话撑爆上下文,心跳哑火)
修复了引擎室会话上下文涨过模型的上下文窗口后导致**合并、反刍、投递全部失败**,且宿主的自动压缩也救不了的bug。现在心跳会**自动轮换引擎室会话**:事件数超阈值、或某轮因上下文溢出失败时,自动新建一个干净的引擎室会话接替,旧会话原样留在会话列表里(画像、账本、素材池都在插件数据目录,不受影响)。
另外:设置卡「会话绑定」的会话列表现在自动隐藏**已归档**和**子代理**会话。
### v1.7.3 · 2026-09-29(修复:心跳拖住 DSH 关闭)
修复心跳正在跑时 DSH 关不掉的问题——此前桌面端更新若恰逢一跳在跑,宿主等心跳结束等不到,更新会报「未能安全停止任务」。现在收到关闭信号,心跳会立刻停下手里这一跳,不再拖住宿主。
### v1.7.2 · 2026-09-29(适配 DSH `0.2.0-rc.1`)
声明适配 `0.2.0-rc.1`,无行为改动。
### v1.7.1 · 2026-09-25(修复「心跳模式」预设丢失)
**修掉升级 0.1.7 后心跳预设静默失效的问题**:0.1.7 起宿主不再从文件系统用户目录加载 agent 预设,旧的安装方式失效,症状是审计出现 `preset_install skipped-no-root`、界面报 `Unknown agent preset: heartbeat`、闲逛轮报 `tools.restrict unknown web_search`——预设没挂上,心跳 agent 成了"裸 agent",连 `web_search` 都看不见。
改为在插件的安装清单里**声明式**注册预设(与官方 standard 预设同机制),重启即注册,「心跳模式」重新出现在 Agent 预设页。`0.1.5` 及更早的宿主仍走原来的文件安装路径,两边都不断。
- 预设内容与原先一致:上下文折叠组 + 唯一模型工具 `web_search`(不抓正文);**无 persona 行**——部署人格与心跳提示词已足够,不能被 "You are a coding agent" 盖掉。
- 升级后重启 DSH 即可,无需手动操作;本版读取的是内置声明,若 `~/.dsh/.agent-presets` 下那份是你手改过的,它不再生效。
### v1.7.0 · 2026-09-24
- **现已适配 `0.1.7-rc.2`**(实机验收通过)
- **设置接口**:0.1.7 换掉了插件配置界面的机制(改由宿主根据插件声明的字段自动生成表单),旧写法会失效。心跳现在自动探测宿主是哪一代,从三代接口里挑能用的——你跑哪版 DSH 都不用改配置。
- **客户端服务**:0.1.7 删除了一个客户端旧服务,插件若仍声明它,整个 Web 界面会加载失败(症状:打开只看到「Failed to load plugins」,聊天区都进不去)。已移除该声明;设置卡其余分区不受影响。
- **节律配置**:不再借宿主的设置接口读写,卡片编辑器直接写插件自己的配置文件,**点保存立即生效**(改间隔会当场重排下一跳),不用重启 DSH。优先级(低 → 高):出厂默认 < 用户设置(`data/settings/ui.json`)< 宿主 patch 覆盖。
- **会话消息源**:0.1.7 的会话日志升级到 V4,不再接受旧版通用的消息来源标记——旧写法会让心跳轮次整轮写入失败。心跳已改用自有的来源标记,引擎室轮次恢复正常。
- **psy 分区开关**:设置卡新增 psy 开关(默认关)。开启后画像合并才收 psy 分区条目;关闭时相关 ADD 一律拒收。值写在用户 policy 层(data/settings/policy.json),即时生效。
- **节省 token 模式**:设置卡新增开关(默认关)。开启后,你离开(键盘/鼠标闲置 ≥30 分钟)或 Windows 锁屏时整跳暂停——不采维护、不闲逛、不反刍、不投递,一个 token 都不花;回来自动恢复。暂停期间每 3 分钟只探一次环境、不花 token,你一回来就恢复;绑定会话里出现新消息(例如你用 QQ 找她)同样算你在场,不会因为键盘安静就一直挂着。暂停时状态栏会说「你不在」而不是「在场待着」。睡眠无需检测:睡眠中定时器本来不走,唤醒后闲置时长已覆盖睡眠期。探测失败一律放行(绝不因探测故障误暂停)。
v1.6.x
### v1.6.4 · 2026-09-20
> ⚠️ **v1.6.3 有 bug,请升级到 v1.6.4**。
**修复:设置卡「闲着模式」开关的渲染语法错误**——该语法错误会让脚本加载的客户端 bundle 无法注册,Web 界面报「Failed to load plugins」而无法进入。v1.6.4 修复此错误,设置卡可正常渲染,功能与 v1.6.3 一致。
**v1.6.3 的更新内容(并入本版本)——闲着模式(默认关闭)**:当素材池为空、而用户打开了「闲着模式」开关时,心跳改用本跳画像 digest 的话题切面兜底,仍走原有投递链路主动搭话(每日上限、静默时段等闸门照常生效)。未开启时维持原来的「空池即沉默」。
- 新增配置项 `heartbeat.idleMode`(默认 `false`),可在设置卡「节律配置」里切换,保存即时生效。
### v1.6.2 · 2026-09-20
**补丁:画像合并(consolidation)白名单修复**——画像从出生就空的问题根因在 `buildConsolidationPrompt` 从没把 `profile-schema.json` 的分区白名单传给裁决模型:引擎室凭直觉自创分区(如 `background`/`relation`/`preference`)全被 `partition not in schema` 拒绝,导致增量几乎 100% 被拒、画像长期为空。本次:
- 提示词注入完整白名单(partition/topic/subTopic + 各格 temporal 允许集),并明确禁止自创分区、evidence ref 必须写成 `cursors.json#<时间戳>` 而非带 `chat#` 前缀。
- 扩充 schema 槽位(新增 `acg`/`hardware`/`audio`/`writing`/`life`、`heartbeat`/`dsh`/`zcode`、`interaction`/`boundary`、`background`/`social` 等 topic)。
- 修复 `profile rebuild` 写明文 profile.json 的问题(改回 DPAPI 加密写)。
- 把历史被拒但有效的高价值观察回填进画像。
### v1.6.1 · 2026-09-20
**补丁:反刍轮超时降级**——决策轮(反刍)在 240s 预算内没等到模型回话时,不再把整跳记成异常:改为记 `decision_deferred` 审计、best-effort 取消孤儿轮次、本跳按沉默处理,素材自动留到下一跳(与表达轮 `spoke_deferred` 同一语义)。同时在反刍提示词里钉死一条纪律:画面与窗口只用于写「他此刻大概在:」,即使画面出现想查的内容也不发起搜索、不调用工具。
### v1.6.0 · 2026-09-19
**素材闭环**——截图→视觉识别→引擎室总结→投递→聊天→观察沉淀→consolidation 生成聊天种子→素材池→反刍投递,全链路打通:
- **素材池品类化**:种子分 `topic`(话题库存)/ `chat`(聊天长出)两类,分池上限 16 + 14;聊天种子有时效性——**投递过 1 次即退休**(话题类仍是 2 次)。
- **候选组包代码化**:反刍候选由代码凑齐——话题随机 4 条 + 聊天最新证据 2 条、不足互补、至多 6 条交给引擎室挑 ≤3 条;池子全空直接安静,不再空烧一次模型调用。
- **聊天种子**:画像合并(consolidation)时引擎室从观察对话里自主挑"值得聊的话题"存入素材池——只挑真兴趣和新事物,寒暄不记。合并与反刍彻底分工:合并只看观察对话,反刍只看素材池。
- **补货闲逛**:话题种子剩 ≤4 条时自动触发一次额外闲逛补货(不受浏览窗口与 4h 间隔限制,仍尊重焦点 3 天冷却,每天至多补 2 次);每次闲逛的搜索次数从"至多 3 次"放宽到 **3~9 次**。
- **视觉识别与"我在干嘛"**:截图改为全屏原图(修复降采样图被误判成全屏游戏);每跳经 [ModLens](https://github.com/liustack/modlens) 识别画面内容,投递的素材包会带一句「(他此刻大概在:…)」。**识别失败时画面与窗口标题一概不进入任何提示词**——隐私优先,宁可不说。provider 在插件侧钉死(默认 openai 兼容通道,`data/settings/vision.json` 可覆盖),不再受 ModLens 默认链探测干扰。
- **修复 `0.1.5` 下节律配置失效**:v1.5.x 起在 0.1.5 宿主上 UI 保存不生效、重启回默认(dsh-settings 包缺失 + 其 0.1.5 API 变更双重原因)。现已适配两代 API 并把依赖归位——0.1.5 用户务必升级。
- **UI**:心跳状态卡新增「插件版本」一行。
- 测试 163 条全绿。
v1.5.x
### v1.5.1 · 2026-09-16
**元数据补全,无行为改动**——只影响安装与生态对接:
- `package.json` 补 `repository` / `homepage` / `bugs` / `keywords`,npm 包与 GitHub 仓库正式关联;
- `@deepseek-ai/dsh-settings` 改以 `peerDependencies` 声明(此前只在 devDependencies,靠宿主环境碰巧解析到);移除两个从未被代码引用的 `dependencies`;
- 新增 `screenshots.json`:插件市场详情页按声明顺序展示设置页卡片截图。
### v1.5.0 · 2026-09-16
**反刍/投递改版**——说不说的决定权从引擎室交给目标会话里的 agent,引擎室只备料:
- **引擎室反刍备料**:从素材池挑 ≤3 条各压缩成一句(不带理由、不排序),输出机器 JSON;没得备就安静(`no material`)。
- **素材包三段式投递**:①「这是心跳插件素材投递…」声明 ②素材清单 ③(3 条里 ≥2 条用过头时)「也可以说一句真心话」。目标会话里的 agent 按当下处境自己判断说不说、说哪条,话落到你读的会话,素材自动归账。
- **表达提取健壮化**:修复素材投递偶发 `non-Chinese output discarded`——目标会话 agent 收到素材包后爱调工具时,末行落在收尾标签上被误拦。v1.5 起跳过工具收尾标签、取最后一个含中文的行,整段无中文才拒。
v1.4.x 及以前
早期版本的更新记录(v1.4.x → v1.0.0,以及 v0.x 脚本外挂时代)已移到 [`docs/releases/legacy-changelog.md`](docs/releases/legacy-changelog.md)。