← 返回更新日志

Hermes v2026.9.11

2026-09-11 · GitHub 原文
# Hermes Agent v0.21.2(v2026.9.11)——`state.db` 补丁版本 **发布日期:**2026 年 9 月 11 日 > 补丁版本。v0.21.0 对会话存储的连接处理进行了大规模重写,但在部分安装环境中,这让 `state.db` 变得脆弱:第二个写入者会相互取消锁,健康的数据库会被报告为损坏,一条异常记录就能导致 `sessions list` 崩溃。本版本解决了这一类问题,并汇总了 v0.21.1 之后四天内合并到 `main` 的所有其他改动。 ## 关于此版本 以提交 `04dd80a977f40b05e5b2054111747af07a61886a` 为基准,自 v0.21.1 以来的窗口期包含 **947 个非合并提交**,涉及 **1,869 个变更文件**(+182,504 / −15,564)以及 **312 个已合并 PR**。共有 **140 位贡献者**出现在提交记录、共同作者署名或修复致谢中。 ## ✨ 重点更新 ### `state.db` 可靠性行动(6 个 PR,关闭 44 个 issue) 如果你的 `state.db` 在 0.21.0 之后损坏,这就是为你准备的版本。6 个 PR 修复了根本原因,而不是仅仅处理症状: - **不再存在第二个写入者。** Profile 网关每 5 秒就会将托管房间状态写入*根目录*的 `state.db`;仪表盘启动时会打开可写句柄;cron 生命周期保护机制会对正在使用的数据库执行原始 `open()`(这会取消网关的 POSIX 锁,是经典的“如何损坏 SQLite”方案);`doctor --fix` 会在数据库仍被持有时执行 checkpoint。现在这四个问题都已消除:托管房间使用 `shared-state.db`,仪表盘会优先以只读方式打开数据库,保护机制会通过受追踪的连接注册表操作,而 `doctor --fix` 在无法证明安全时会拒绝执行 checkpoint。(#108076 —— 修复 #103489 @RikETS、#102682 @JoaoMarcos44、#108012 @Halldrix、#105428 @TaoMasterCoder) - **健康的 WAL 数据库不再卡死。** OpenZFS 的 `(deleted)` 目录项,以及与 `append_message` 竞争的 `close()`,都会在完全正常的存储上产生持续存在的 `DeletedWalGenerationError`;读连接池会在日志模式尚未确认时被分发;WSL2 上一次暂时性的 `disk I/O error` 会导致 `get_session` 第一次尝试就失败;而“state.db 已锁定”的提示会在锁已经解除后才被广播。(#108082 —— 修复 #107411 @chelsealong、#105578 @ca-shrimp、#105711 @gaoanze888、#106958 @nikkoxgonzales;共同作者 @QDung210、@fangliquanflq、@Sahilvishnaliya) - **FTS 损坏不再导致当前回合失败。** 原本,作用域仅限于全文搜索索引的错误会被归类为整个文件损坏,从而使对话直接失败关闭。现在它会被标记为 `fts_index`:搜索功能降级,索引稍后重建,而转录存储保持不变。同一个 PR 还进行了以下修复:doctor 会准确描述结构性损坏,而不是笼统称为“FTS 写入损坏”;FTS 写入探针现在能捕获一种旧索引状态,这种状态此前会通过所有检查,但每次写入都会失败;`.recover` 输出不再因为孤立的 FTS5 shadow table 而导致启动失败;文件头被清零的数据库会尝试恢复,而不是直接拒绝;仪表盘分析轮询器会返回 503,而不是每天产生 52 万条 traceback。(#108130 —— 修复 #97843 @SulthanZahran1、#97841 @Finn763,#88604、#56824、#103657 @liuhao1024,#106890 @nftpoetrist,#103321 @jangomango76,#91413 @leegunwoo98,#102808 @TaoMasterCoder) - **单条损坏记录不再导致 `sessions list`、导出或 insights 失败。** 过去,TEXT 类型的时间戳或 `1e30` 这样的 epoch 值会导致整个列表崩溃;格式错误的标记 JSON 会使 `json_extract` 崩溃;超过 999 个 ID 会导致批量删除或清理失败。现在所有读取器都使用一个 `coerce_epoch()` 辅助函数(异常记录会显示为 `?`,并输出注明会话的 WARNING),同时加入了 `json_valid` 保护、IN 列表分块以及分批导出数据加载。(#108086 —— 修复 #106071 @Xipong、#101726 @efe-arv、#94701 @liuhao1024、#102679 @mssteuer、#100658 @Mi55ed) - **会话不会再绑定或读取其他 profile 的数据库。** 在 `HERMES_HOME` 覆盖配置发生竞争时,Desktop 启动后端可能会错误地固定到其他 profile 的 `state.db`;使用裸 ID 调用 `session_search` 时会静默扫描所有 profile,并返回其他人的转录内容;恢复指导会指向错误的文件;删除 profile 时会保持句柄打开(WinError 32)。(#108074 —— 修复 #102534 @HexLab98、#106975 @Sora-bluesky) - **当不需要写入时,打开 `state.db` 不再获取写锁。** 一个在繁忙网关后面打开存储的一次性 `hermes` 进程,过去会卡住 4–20 秒,随后因“database is locked”失败。现在耗时为 0.01 秒。(#108067 —— 修复 #106751 @kshitijk4poor、#101881 @jonpol01) 同一子系统在此窗口期还进行了以下更新:全新的 `state.db` 不再在获取重建锁之前发布 FTS 表(#106311);丢失 WAL generation 的句柄在关闭时不再对过期帧执行 checkpoint(#106315、#106840);被覆盖的第一页会与 WAL 一起隔离,而不是以破坏性方式打开(#106587);WAL 设置在无法验证数据库时会保持数据库不变(#106568);被隔离的句柄会拒绝执行 VACUUM/FTS optimize(#106343、#106349)。其中大多数问题来自 @kshitijk4poor 提供的社区诊断,后经修复。 ### 多 profile 隔离加固 针对多个 profile 在同一网关下运行(multiplex)的一组修复:次级 profile 的 bot 不再继承默认 profile 的允许列表(#107616);适配器不再将凭据发送到默认 profile 的主机(#107617);stdio MCP 服务器不再接收默认 profile 的 vault 密钥(#107630);`MEDIA:` 传递不再附带其他 profile 的 `.env` / `auth.json` / `state.db`(#107609);飞书云盘回调和 `/p/<profile>/` webhook 回复会继续留在路由到的 profile 中(#107620、#107626);次级 profile 也不再从每进程 memo 中获得兄弟 profile 的 Nous bearer(#107611)。 ### Desktop 后端批量生成风暴已结束 Bot Mode 过去会在启动时以及每次 roster tick 时,为每个 profile 生成或连接一个后端;将鼠标悬停在 Bots roster 上会为每一行生成一个后端;切换 profile 还可能生成重复的主后端。(#108069、#108107、#108118、#108134、#107969、#108112 —— 修复 #102512、#103634、#103399、#107997 以及其他由 @kshitijk4poor 完成的修复) ### 不接触密码的凭据保险库 现在,代理可以使用 1Password、Bitwarden 或本地 Hermes vault 登录、付款和填写地址,而完全不会看到任何秘密信息;双因素验证码可以来自已保存的验证器密钥,也可以在用户界面中请求输入(#106480、#107585)。私有 git 插件可以使用用户已保存的凭据安装(#106981)。 ### 插件目录与统一的 Plugins 页面 新增经过整理并使用 SHA 固定版本的插件索引,包含 CLI、准入 CI、文档和仪表盘(#69446);Desktop 获得一个统一的 Plugins 页面,负责代理插件与 Desktop 插件、安装、目录以及按提交固定版本(#107212、#107314、#107321);Radio 以可选 SDK 插件形式发布(#107072)。 ### Nous 免费层与引导式首次启动 现在只需一条命令登录,即可直接使用免费推理和连接器(#105258、#105260);可以在聊天中使用 `/login`(#105261);连接器工具(Gmail、Linear、Notion 等)可通过 `tool_search` 搜索(#106842);新增引导式首次启动流程,可通过 `HERMES_GUEST_ONBOARDING=1` 启用(#107697、#107958、#107985、#108211)。 ## 🐛 值得注意的错误修复 **网关与平台** - 配置文件中的裸 `display:` 键不再导致每个网关回合崩溃(#106305);被平台拒绝的排队通道最终结果会被记录并重新传递(#106316);卡住的 WebSocket 发送不再阻塞之后的所有事件(#106581);第一次回合不再等待 Python 工具链探测完成(#106556)。 - 启用 `bots_require_mention` 后,Telegram bot 必须被 @提及,从而避免 bot 之间形成循环(#106534);Matrix 支持渲染 LaTeX(#106515);Signal 支持渲染 Markdown 表格(#106538);WhatsApp 对阅后即焚消息的回复会保留引用(#106541);仅包含媒体的回复在所有平台上都会报告 SUCCESS(#106557)。 **提供商与路由** - `/model` 和辅助自动选择不再向未选择的提供商计费(#107366);也不再自动切换到没有凭据的提供商(#107281);Bedrock Claude/Converse/Mantle 模型在 `/model`、回退和恢复过程中能够正常工作(#107621、#107658);Bedrock Guardrails 已强制启用(#107815)。 - Codex:补丁预算中的图像 400 错误会缩减请求并重试(#106525);没有授权的主模型和回退模型不再来回振荡(#106549);Azure Foundry 的重复推理拒绝会被正确分类并清理(#106718 @erosika)。MCP OAuth 刷新不再擦除 refresh token(#106185)。Anthropic 客户端只发送一个凭据(#107978)。 - Nous Portal 和 OpenRouter 的模型选择器支持 DeepSeek V4.1 Flash(#107489);OpenAI 和 FAL 支持 GPT Image 2.5(#105988);原生 Anthropic 选择器支持 Opus 5 / Fable 5.1(#106636 @xxxigm)。 **代理循环与压缩** - 一个被阻塞的周期性回调不再阻塞租约刷新(#106308);回合中途的 `/steer` 会作为独立的用户记录持久化(#106317、#106344);本地推理的内存上限拒绝会执行退避,而不是压缩历史记录(#106307);部分流式传输后发生上下文溢出时,会结束当前回合(#106567);当提示词填满窗口后,长度续写会停止(#106571);压缩在辅助重试期间不再静默超时(#106866);`model_thresholds` 的键可以按提供商设置作用域(#108061)。 - 界面切换(Desktop↔TUI)不再重建系统提示词并破坏提示词缓存(#105844);CLI 会保留 `api_content` sidecar,使缓存能够在提前持久化后继续存在(#105842)。 **CLI、TUI 与 Desktop** - `hermes -z --resume` 可以继续会话(#106313);在扩展键终端中,Shift+字母和 Cmd+Shift+Z 可以正常工作(#90674 @francip、#105493);`browser_exec` 超时会终止整个进程树(#106589);更新检查每天只轮询一次 GitHub API,而不再每 30 分钟执行一次 git fetch(#107648);`hermes update` 会指出真实原因,并且不会因卡住的 fetch 而挂起(#108053)。 - Desktop:更新重启后 UI 语言仍会保留(#106476);过期的 OAuth 授权支持一键重新登录(#106965);HUD 模式会再次显示转录,并且始终将窗口控制权交还给用户(#107491、#107423);Desktop 父进程退出时后端也会退出(#107977);Windows 更新不再报告错误的失败状态(#106175、#107183);WSLg 使用 Windows GPU 进行渲染(#106528);从仪表盘移植了带 QR 码的 Telegram 快速设置(#107242);此外还有约 60 项 Desktop 修复,主要由 @OutThisLife 和 @kshitijk4poor 完成。 **Cron 与 Kanban** - 非计划时间执行的“立即运行”不再取消下一次计划运行(#106306);被终止的手动运行不再阻塞下一次运行 5 分钟(#106733);从一次性任务改为周期性任务后会继续执行(#106532);未固定版本的任务会使用创建时快照中的模型运行(#106499);`--clone-all` 不再复制 cron 任务(#106478);`kanban promote` 会拒绝尚未完成的父任务(#106550);`kanban_request_review` 会拒绝未知的审核者 profile(#106547)。 **工具与记忆** - stdio MCP 服务器在调用过程中退出时,不再重复执行工具调用(#106546);仅 skills 的后台审查不再删除记忆条目(#106310);mem0 memory 不再丢失较长的回合(#106542);当多个工具共享同一个词时,`tool_search` 会返回空结果,而不是返回五个工具(#106676);远程 NOPASSWD sudo 不再提示输入密码(#107939);RSS 和 Reddit 阅读不再默认激活(#105873)。 **维护工作** - `config.yaml` 备份统一存放在有数量限制的 `backups/config/` 目录中(#106388);`hermes backup` 只保留最新的 3 个 zip 文件(#106455);`hermes setup --reset` 会备份实际使用的配置(#106453);dpaste 回退方案中的 `debug share` 保留时间缩短为 1 天(#106531)。 ## 👥 贡献者 感谢在此窗口期贡献提交、共同作者署名以及修复 PR 的 **140 位贡献者**。 **`state.db` 行动——修复 PR 的作者:**@RikETS、@JoaoMarcos44、@Halldrix、@TaoMasterCoder、@chelsealong、@ca-shrimp、@gaoanze888、@nikkoxgonzales、@QDung210、@fangliquanflq、@Sahilvishnaliya、@kshitijk4poor、@jonpol01、@HexLab98、@Sora-bluesky、@Xipong、@efe-arv、@liuhao1024、@mssteuer、@Mi55ed、@SulthanZahran1、@Finn763、@nftpoetrist、@jangomango76、@leegunwoo98、@ggoldani。 **`state.db` 行动——问题报告者**(这些讨论串中的取证工作往往比修复本身还要出色):@thedigitalcarpenterdad、@Rroven、@aoeman84、@StephanRosin、@rubensandrade-sketch、@wanliqin、@chenzheshushi-commits、@CarlosReyesPena、@revazone、@reservassai-art、@Cuttingwater、@soroush5、@e-shizz、@shobhit-87labs、@shivanathd、@hoelzl、@i8ei、@Ace-Kelly、@YinsenWANG、@zbabiarz、@Sravanjangam、@0gl20shk0sbt36、@RChina、@bronder、@ccwssy、@bottenbenny,以及其 Discord 报告促成了此次行动开始的 @Hitman117890。 **此窗口期的所有贡献者(按字母顺序):**@0genlab、@0xalydev、@100yenadmin、@1052326311、@686f6c61、@69k4xmdfm2-blip、@abundantbeing、@Adolanium、@Ahmett101、@albert748、@AlexxRussell、@alt-glitch、@auroracapital、@austinpickett、@babatorik、@Bartok9、@benbarclay、@bennybuoy、@brian717、@briandevans、@buihongduc132、@ca-shrimp、@cervantesh、@Cesar-Azeredo、@ChanPark03、@chelsealong、@ckomma、@ClintonEmok、@crazyief、@ctaylor86、@dalzio、@DavidMetcalfe、@Drexuxux、@edosulai、@efe-arv、@emozilla、@ericmaddox、@erosika、@ethernet8023、@everm1nd、@FalconOrtiz、@fangliquanflq、@Finn763、@FirmamentalSpring、@francip、@g3org3yo、@gaoanze888、@ggoldani、@Halldrix、@haydster7、@hbizi、@helix4u、@HexLab98、@huklaa、@IAvecilla、@infinitycrew39、@jahfaliabdulrahman-dev、@jangomango76、@JoaoMarcos44、@jonpol01、@jwilson411、@KeyArgo、@kokhlo、@KoNit-K、@kshitijk4poor、@kyssta-exe、@leegunwoo98、@lesterlxt、@liuhao1024、@Mabolla、@manuelschipper、@MaxFreedomPollard、@mearls0501、@mengyuyuan、@Mi55ed、@MiseHinoha、@mjshorty、@mkrb84、@moisesvalero、@moken627-hub、@mssteuer、@nateEc、@nftpoetrist、@nickseelert、@nikkoxgonzales、@notwitcheer、@onuraycicek、@outdog-hwh、@OutThisLife、@philmossman、@phuongvm、@pierrenode、@portavales、@PRATHAMESH75、@QDung210、@rewbs、@RikETS、@romanovzky、@ryantuc、@Sahilvishnaliya、@salch-cred、@sgarrand、@shannonsands、@simpolism、@Solitud1nem、@somewheresy、@Sora-bluesky、@sprmn24、@squevo、@StellarisW、@Stoltemberg、@SulthanZahran1、@Svector-anu、@szicely、@TaoMasterCoder、@teknium1、@ten82e、@thedavidweng、@tkaufmann、@Totoro-qaq、@Tranquil-Flow、@tuancookiez-hub、@TurgutKural、@ugoenyioha、@unsupportedpastels、@victor-kyriazakos、@webtecnica、@wliu-dev、@wukangcheng1994、@Xipong、@Xixiartemis、@xkam7ar、@xxxigm、@yavarb、@yoniebans、@Youssef、@yoyodine-industries、@yuanchenglu、@YuhGuan、@Zeus-Deus。 另外:Youssef。 ## 更新方式 - 已有安装:`hermes update` - 全新安装:`curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash` - 受管理的部署应使用新的 tag,通过其部署工具进行更新。 - 如果你的 `state.db` 已经被 0.21.0/0.21.1 损坏:请先运行 `hermes doctor`;现在它能够正确区分结构性损坏与索引损坏,并在重建不足以解决问题时,指向(固定到对应 profile 的)`hermes sessions recover --inspect-only`。 **完整变更日志:**[v2026.9.7...v2026.9.11](https://github.com/NousResearch/hermes-agent/compare/v2026.9.7...v2026.9.11)