基于 Nous Research Hermes Agent 源码的深度架构文档。 所有页面均经过逐行源码验证,确保准确性与时效性。
- agent-loop-and-prompt-assembly: Agent 循环、系统提示构建、平台提示、执行指导
- tool-registry-architecture: 中央工具注册系统,声明式注册+集中调度
- model-tools-dispatch: 工具编排与调度,异步桥接+动态 schema 调整+参数类型强制
- toolsets-system: 工具分组系统、递归解析、20+ 平台工具集
- prompt-builder-architecture: 系统提示模块化组装,注入防护+技能缓存+模型特定指导
- auxiliary-client-architecture: 辅助 LLM 客户端路由器,多 provider 解析链+自动降级
- provider-transport-architecture: Provider Transport ABC,统一抽象 Anthropic/Chat Completions/Responses API/Bedrock 的数据路径
- provider-plugin-system: NEW v0.13.0 ProviderProfile ABC + 30 个插件化 provider
- memory-system-architecture: 三层架构(MemoryStore/MemoryManager/MemoryProvider),冻结快照模式
- session-search-and-sessiondb: FTS5 搜索 + LLM 摘要的跨会话回忆,orphan 删除策略
- context-compressor-architecture: 自动上下文压缩 v3
- skills-and-memory-interaction: Skills 与 Memory 的互补关系和决策树
- skills-system-architecture: 渐进式披露架构 + Curator 后台维护(v0.13 新增 archive/prune/list-archived)
- browser-tool-architecture: 多后端浏览器自动化,accessibility tree+三层安全防护
- web-tools-architecture: 八大后端插件化搜索/提取(WebSearchProvider ABC + 注册表),LLM 智能内容压缩(web_crawl 工具于 2026-05-29 移除 #33824)
- code-execution-sandbox: execute_code 沙箱,7 工具限制+UDS/File RPC 两种通信模式
- voice-mode-architecture: Push-to-talk 语音交互,STT(5 Provider)+ TTS(10 内置 Provider,含 Piper 本地神经 TTS)
- context-references: @file/@folder/@diff/@url/@git 引用系统,安全沙箱+注入量限制
- fuzzy-matching-engine: 8 策略链模糊匹配,从精确到相似度匹配
- large-tool-result-handling: 三层溢出防护(工具内截断/单结果持久化/轮次聚合预算)
- lsp-integration: NEW v0.14 LSP 语义诊断集成,agent/lsp/ 11 modules + file-mutation footer 三层后写校验
- i18n-and-locales: NEW v0.13 i18n 薄切片本地化(仅 hermes 自身静态消息,不动 agent 输出)
- parallel-tool-execution: 智能并发安全检测
- prompt-caching-optimization: 冻结快照保护 prefix cache,75% 成本节省
- smart-model-routing: 智能模型路由
- security-defense-system: 多层防御 + Redaction 默认 ON + Discord guild-scoped + post-write delta lint(v0.13.0 安全 wave)+ Wave 4 Dashboard OAuth + security-guidance 插件(2026-05-27)
- dashboard-auth-oauth-gate: NEW 2026-05-27 Dashboard OAuth 鉴权闸门(可插拔 ABC + Nous Portal Provider + WS 单次性 ticket + Phase 0-7)
- interrupt-and-fault-tolerance: 中断传播、Fallback 模型链
- credential-pool-and-isolation: 多密钥自动轮换、Profile 隔离
- checkpoints-architecture: NEW v0.13.0 Checkpoint v2 共享 shadow git store
- tool-loop-guardrails: NEW v0.12.0 工具调用循环护栏,exact failure / same-tool failure / idempotent no-progress 三维检测
- multi-agent-architecture: 5 种运行时机制(delegate_task/MoA/Background Review/send_message/Kanban)
- kanban-multi-agent-board: 可持久化多 Agent 协作板(SQLite + WAL,心跳/熔断/幻觉拦截,跨 session/profile)
- goal-and-ralph-loop:
/goal+/subgoal持续推进系统(fail-open judge,回合预算,保 prompt cache) - configuration-and-profiles: 多 Profile 架构,完全隔离的 agent 实例(第二种多 Agent 方案)
- cli-architecture: CLI 架构、斜杠命令、hermes dump/proxy/kanban/curator/migrate
- terminal-backends: 7 种终端后端(含 Vercel Sandbox)、统一 spawn-per-call 执行模型
- messaging-gateway-architecture: 22 平台统一网关(含 Teams/LINE/SimpleX Chat/Google Chat 等插件平台),PlatformRegistry、Session auto-resume、统一 allowlist
- hermes-proxy: OAuth → OpenAI-compatible 本地代理,让 Aider/Cline/Codex 复用 Nous/SuperGrok 订阅
- gateway-session-management: 网关会话管理,多平台会话隔离+PII 脱敏+重置策略
- hook-system-architecture: 双 Hook 系统(Gateway Hooks + Plugin System),register_command/dispatch_tool,Dashboard 插件
- mcp-and-plugins: MCP 集成、插件钩子系统、OAuth 支持
- skin-engine: YAML 驱动的皮肤/主题系统
- worktree-isolation: Git Worktree 并行隔离模式
- cron-scheduling: 内置调度器、自然语言调度、多平台投递、
no_agentwatchdog 模式 - trajectory-and-data-generation: 轨迹保存、批量运行器、RL 训练环境
更新日志(50 个,最新优先 — 完整列表见 index.md)
-
2026-06-21-update: 179 commits 单日同步(hermes-agent
5a53e0f0 → 87ab373,v0.17.0 维护未发新版;约 70 fix / 16 feat / 13 test / 6 chore / 16 docs + 23 merge;~26h 单日窗口;266 文件 +17145/−1079)— ⭐ Compression cluster 9 commit(14ef631agent/context_compressor.py:1935-1950 _effective_protect_first_n()衰减 +7ace96brotation 三状态修复(goal 经hermes_cli/goals.py:282 migrate_goal_to_sessionmove-not-copy + 子 create_session 失败回滚agent.session_id = old_session_id+:694-701 on_session_start(platform=)转发)+2f3177aagent/auxiliary_client.py:121 _aux_interrupt_protection = threading.local()+aux_interrupt_protection()ctx mgr 让 Codex aux 流尊重压缩摘要保护(#23975)+1f874dffallback 摘要 active_task 单点(#49307)+b6a4638空 content raise 不再静默替换为空摘要(#11978/#11914)+3509be7_MIN_CTX_TRIGGER_RATIO = 0.85+_compute_threshold_tokens()让 64K-ctx 模型在 ~54.4K 触发(#14690)+d0de460TUI/compress显示前后摘要(#46686)+04730f3新hermes_cli/context_switch_guard.pypreflight-compress 预警 +41e0c10重复压缩告警走_emit_status(#36908))— ⭐ Kanban cluster 8 commit + lifecycle hooks(d164ed04 reclaim RESET SQL 加AND claim_lock IS ?(#50366)+1f4c5ae_resolve_auto_decompose_settings每 tick 重读(#50358)+84ba83bbounded init lock 10s(#50353)+9630ec6_default_spawn env["TERMINAL_CWD"]=workspace(#50348)+e217fd4三新 plugin hookkanban_task_claimed/completed/blocked注册hermes_cli/plugins.py:192-194 VALID_HOOKS+_fire_kanban_lifecycle_hookwrite commit 后 best-effort(#50349)+e581740_dispatch_tick_lockboard-scoped 非阻塞 flock(#50331)+15cfc28无路径 worktree 锚board.default_workdir+d79f67f_ensure_git_worktree实物化 +_git_common_dir短路复用(worktree 现真有 linked worktree 在<repo>/.worktrees/<task.id>上分支wt/<task.id>))— ⭐ Security cluster 9 commit(ed96669tools/url_safety.py:285-287 + :359-365ip_str.split('%')[0]剥 IPv6 scope-ID + fail-closed +ed3d12aWebSocket 空 peer fail-closed 4 endpoint +5b45fb2kanban markdown HTML 白名单消毒plugins/kanban/dashboard/dist/index.js:337/:354/:368/:387+ae46699/87615f4restore_quick_snapshot 路径穿越(snapshot_id + snap_dir + manifest src/dst 全.relative_to()校验)+3b56d3akanban tool payload secret redact 经redact_sensitive_text(force=True)+a18bae6_SECRET_CONFIG_KEYSfrozenset +redact_config_value()递归 masker(#50245/#50313 config show/set api_key 屏蔽)+9078b4btools/file_tools.py:286 _is_blocked_device_pathnormpath + 20 symlink 跳 walk +def3f63_is_blocked_device(filepath, base_dir=)锚 task cwd +71274f2/16899ae_looks_like_read_file_line_numbered_content拒 read_file 行号显示文本经 write_file 回写)— ⭐ Gateway/API server cluster 13 commit(b5b8a4cfresh-final 尊重prefers_fresh_final_streaming适配器 decline +__dict__双查防 MagicMock(#47048)+4c206b9/79f29785 plugin adaptersys.path.insert(parents[3])修 cron 命名空间冲突(#49410)+03563dahygiene 硬上限 400→5000 默(#50194)+4c349e8hygiene 无法 rotate 时保留 transcript(#21301 P1)+8ac5e90_JSON_MEDIA_TOOL_PATH_FIELDS+_collect_history_media_paths()让 image_generate JSON-payload 路径入历史去重集(#46627)+c11c510busy 模式文本 follow-up 经_queue_or_replace_pending_eventFIFO 不再 newline-merge(#43066 sub-bug 2)+d19aabb_finalize_shutdown_agentsflush_session_messages经 idempotent identity-tracked(#13121)+93ea9b0入站媒体下载 128MiB cap(防 Discord Nitro 500MB OOM)+bb77a8b未映射 Windows gateway 经 detached watcher 重生(#50090/#50373)+7a131f7stateless HTTP pathsupports_async_delivery=False经 contextvar +notify_unsupported/sync fallback(#50319)+e499d69gateway.api_server.max_concurrent_runs统一并发 cap 跨 3 endpoint + OpenAI 风格 429 + Retry-After(#50007)+51a338a + 0ee7546 + b577f25 + 4d7bb38active_agents轮边界 publish +/api/status加gateway_busy/drainable+parse_active_agents三处统一)— ⭐ Telegram cluster 9 commit(6183e8cBot API 10.1 rich messages 默改 offhermes_cli/config.py:2161 "rich_messages": False+ adapter_coerce_bool_extra经platforms.telegram.extra.rich_messages: trueopt-in;CJK 不走 rich + 表格不强换行 + slash 富文本保留换行 + chunk 标记移出代码栅栏 + native rich echo reply 文本恢复 + 流式 final 经 editMessageText 重索引 + finalize 前暂停 typing + 最终回复后 typing indicator 不残留)— ⭐ Cron cluster 6 commit(07424datickerBaseException不死 + heartbeat-aware status +f1f36b3迁移期时区偏移修复防双触发 +65d7c7f action='run'立即执行 +4cc28aaTelegram DM-topic 经DeliveryRouter(#22773)+d548908直播适配器显式 confirmation 步骤(#38922/#47056/#43014)+73b9226 model.default解析 fail-fast)— Plugins/Session lifecycle 7 commit(9d883ac ctx.profile_namewrapget_active_profile_name()经 HERMES_HOME(#50346)+9f67ba1 finalize_turn三段 cleanup 各自 try/except +result["cleanup_errors"](#50009)+b17180d AIAgent.close()step 7session_db.end_session()+9e4fe32background review fork opt out +56255f8 _collect_delegate_child_ids()用父 id seed found 集合 +99233fa/c7e8854CLI/TUI force-quit/signal 持久化)— Misc(c0409a8 SendResult.error_kind7 类 typed(too_long/bad_format/forbidden/not_found/rate_limited/transient/unknown)+2609bcci18n Spanish 完整(README.es.md 220 / CONTRIBUTING.es.md 602 / SECURITY.es.md 322)+65a477fDesktop About 加 Update now(#50186)+8666fd7模型可见性跨 provider 保留 hide-all +5e3e89cHindsight 健康 grace 可配(#50341)+7bc6f18Hindsight root 跳 +472c068MCP "unknown method" ping keepalive(#50028)+ Photon 三修 +2f4f23fCodex app-server item/started → Telegram tool-progress 桥接(#38835)+e0498bdBedrock prompt-cache 计价 + 跨区域前缀剥除(#50307)+a4b1554/491579fWhatsApp JID 规范 + bridge dir HERMES_HOME mirror +4467c22chat-completions timestamp 剥 +ac83365Windows install 8.3 短 %TEMP% 展长 +6f5f58e/41ba90fpoll() 只读 + CLI drain dedup(#10156)+3e354b6Copilot headers 保留 +6984026browser SSRF 容器化 +8a506edcredential_pool env-seeded 非破坏 +587b5b9memory provider 外部 backup paths(#50325)+ 模型切换 3 修(#50375/#23767)+824c9d3 model.api_base→model.base_url别名(#50385)+a9c8025approval honor 中断(#8697)+ Email 配置硬化(#40715)+ 16+ docs commit + AUTHOR_MAP 10+ salvage)— 验证基线/tmp/hermes-agentclone @87ab373+ 4 个并行 research agent 实证(A: Security 9 commit / B: Kanban 8 + lifecycle hooks / C: Compression 9 + Gateway/API 13 / D: Telegram 9 + Cron 6 + Misc 30+) -
2026-06-20-update: 69 commits 单日同步(hermes-agent
01f581d8d → 5a53e0f0,v0.17.0 维护未发新版;约 34 fix / 8 feat / 6 chore / 5 test / 3 refactor / 3 docs / 1 style + 8 merge;~22h 单日窗口;250 文件 +12225/−3725)— ⭐ Compression in-place compaction 6 commit(compression.in_place:bool=Falseopt-in 保留单 session_id;新archive_and_compact软归档非破坏性(hermes_state.py:2700++:2734-2737 UPDATE messages SET active=0, compacted=1)+ 新compacted列 3 态语义(:570+:3489-3494文档 active=1/compacted=0=live, active=0/compacted=1=archive in search, active=0/compacted=0=rewind out search)+search_messagesWHERE 放宽(m.active=1 OR m.compacted=1)(:3528-3532主 FTS5 +:3611-3614trigram)+ 边界 hook 双模触发(agent/conversation_compression.py:625 _is_boundary = bool(_old_sid) or in_place)+ gateway auto-compress 强history_offset=0(gateway/run.py:15872-15874)+/compressslash gate 扩if rotated or _in_place:(gateway/slash_commands.py:2636-2659)+agent._last_compaction_in_place信号 + 解 PR body 列 14 个 rotation 引发 issue 集群 #33618/#14238/#33907/#36777/#45117/#42228/#48989)— ⭐ Background delegation fan-out PR #49734(单 commit 5 文件 +721/-333;dispatch_async_delegation_batch(tools/async_delegation.py:337)批量当单异步槽位;runner_execute_and_aggregate(tools/delegate_tool.py:2247)join 所有子;完成事件is_batch=True(:389)+ 单 consolidated 渲染_format_async_delegation(tools/process_registry.py:1549-1628header:1586TASK i/N:1614);模型级background入参作废由_dispatch_delegate_task(run_agent.py:5210-5222)顶层强制background = (not _is_subagent);3 并发限delegation.max_concurrent_children+max_async_children=3默 +max_spawn_depth;满槽拒绝退化 inline sync 非排队;a6f08ff0单行 docs 澄清 subagent 模型 config 级非 per-call)— ⭐ Blank Slate setup mode PR #36733(第三 setup 模式hermes_cli/setup.py:2853-2861(不新 subcommand)+ 235 行 wizard:3056-3134+agent.disabled_toolsets全减集到{file, terminal}(:3026)+platform_toolsets.cli=["file","terminal"](:3006)+ 全 opt-out web/browser/code/vision/memory/delegation/cronjob/skills/imagegen/kanban/plugins/mcp/gateway/compression/checkpoints/smart_model_routing/session_reset(_blank_slate_minimize_config:3031)+set_bundled_skills_opt_out(True)(:3117-3118)+_blank_slate_walkthrough:3137-3214逐节 opt-in + gating invarianttools_config.py:1528-1536 _get_platform_tools末尾减agent.disabled_toolsets)— ⭐ Gateway adapters → bundled plugins 9 个迁移(单 commit56001054(salvage PR #41284)124 文件 +3647/-2583;slack/dingtalk/whatsapp/matrix/feishu/telegram/wecom/email/sms 全从gateway/platforms/<name>.py迁到plugins/platforms/<name>/{adapter,plugin.yaml,__init__}.py+ 旧路径全删无 stub;signal 不迁仍在gateway/platforms/signal.py1701 行;注册register(ctx)PluginContext →ctx.register_platform()→PlatformEntry→platform_registry.register();发现_scan_directorywalk 一级 +plugin.yamlmanifest;Matrix YAML 补 4 键allowed_users/ignore_user_patterns/process_notices/session_scope(plugins/platforms/matrix/adapter.py:4288 _apply_yaml_config:4297/:4312/:4317/:4319);~60 test 原地 retarget;单一新test_slack_plugin_setup.py;c3292794跟进补 2 漏字符串字面量)— Desktop 浮动 composer popout PR #49488(renderer-only 不开新 BrowserWindow 无 IPC channel;apps/desktop/src/store/composer-popout.tsnanostore + localStoragehermes.desktop.composerPopout.{enabled,position}+POPOUT_WIDTH_REM=19.5+apps/desktop/src/app/chat/composer/index.tsx:196 popoutAllowed=!isSecondaryWindow()二级窗强制 docked +apps/desktop/src/app/chat/composer/hooks/use-popout-drag.ts:93 useComposerPopoutGestures+ dock zone 4 常量DOCK_ZONE_BOTTOM_PX=72/CENTER_TOLERANCE_PX=150/VERTICAL_FALLOFF_PX=260/HORIZONTAL_FALLOFF_PX=220;无键盘快捷 —— 纯手势双击+拖拽切换)— Provider 失效转移 5 commit(5a53e0f0aux 摘要 401/403 abort(agent/context_compressor.py:771 _last_summary_auth_failure+:1593-1602 _is_auth_error+:2335不管 config flag abort)+f22dd8a7agent loop is_auth 真失败转 fallback(agent/conversation_loop.py:2842-2858+ 新 retry flagturn_retry_state.py:65 auth_failover_attempted: bool = False)+c884ff64rewrite_prompt_model_identity(agent/chat_completion_helpers.py:1045-1071)只改最后一次出现 +_sync_failover_system_message(agent/conversation_loop.py:469-492)8 站点接 +c253b073clear_model_endpoint_credentials中央 helper(hermes_cli/config.py:3934)+ 12 picker flow 接入 +95a3affcNous picker 重load_config()+37a4dd49heal poisonedinference_base_url经DEFAULT_NOUS_INFERENCE_URL(hermes_cli/auth.py:71)双站点)— Signal 加固 14 commit(_validate_send_result(gateway/platforms/signal.py:1020)解 results[] +SignalRateLimitError抛 + 新gateway/platforms/signal_format.py140 行共享 markdown→Signal UTF-16 偏移 textStyles + ADTS AAC 识别(:83 _guess_extensionlines 105-109if (data[1] & 0xF6) == 0xF0: return ".aac")+ ffmpeg remux to MP4(:141 _remux_aac_to_m4a)+ OrderedDict echo ring 50→512 + 5min TTL(:315-316)+_consume_sent_timestamp(:1110)替set.discard+ quote-cache_sent_message_timestamps OrderedDict[str, None]FIFO(:324+:809-820)+ reply-to-own 追踪_extract_quote_author/_quote_references_own_message(:773/:790)+MessageEvent加reply_to_author_id/name/is_own_message3 字段 + 群组自身 mention 全剥(:640-641)+ stop-typing RPC(:1517-1538)+ 新env_float(utils.py:326)+ 11 文件 22 处 env cast 替为env_int/env_float;PR #49260/#49530/#49558/#49563/#49583/#49678/#49680)— Teams 原生附件 PR #49308(_send_media_attachmentshared helper(plugins/platforms/teams/adapter.py:1192-1240)+send_video/send_voice/send_document+microsoft_teams.api.AttachmentSDK + URL ref / data URI 双路径,无显式 size cap)— Language-aware title generation PR #45296(auxiliary.title_generation.languageconfig +_TITLE_PROMPT/_TITLE_PROMPT_PINNED_LANGUAGE双模板(agent/title_generator.py:22-34)+ detection-by-instruction 无 code-level locale 检测)— Creative-ideation skill v2.1.0 PR #42402(22 新方法 + method-catalog/heuristics/anti-slop/exercises;28 文件 +2269/-190)— Dashboard 隐藏 sidecar 会话 PR #49269(HERMES_SESSION_SOURCEContextVar 多站点 +_session_source+source="tool"标记)— 内联键盘 model picker 默 persist PR #49176 salvage(gateway/slash_commands.py:1155 is_global=persist_global+:1219-1247config.yaml 写 + 扁平字符串 coerce 嵌套)— 终止 busy session internal-event 中断 PR #49738(gateway/run.py:4172-4184 if getattr(event, "internal", False): return False—— delegate_task background + notify_on_complete 不再中止活跃轮)— gateway resume restart loop 修(_strip_dangling_tool_call_tailgateway/run.py:940-980)— 工具 model whitelist 不剥prompt/image_urls+ slash exec dispatch payload TUI/Desktop 双修 + Raft check_fn 静默 + Desktop GPU 加速被禁横幅(IPChermes:get-remote-display-reason+<RemoteDisplayBanner>5 语 i18n)+ 隐藏 link-title 窗口静音(setAudioMuted(true)防 YouTube watch 自播)+ 右侧栏 tooltip + memory shutdown hook warning + CLI agent ref publish 让on_session_end生效 + 5 条 AUTHOR_MAP salvage(IamSanchoPanza/hakanpak/lkz-de/rratmansky/w31rdm4ch1nZ)+ 3 stale comment 清(tools/memory_tool.py:20,141-144,197-200+tools/fuzzy_match.py:9+run_agent.py:1531) — 验证基线/tmp/hermes-agentclone @5a53e0f0+ 4 个并行 research agent 实证(A: Compression in-place + auth failover 11 commit / B: Blank Slate + delegation + composer popout + Teams + lang titles + Creative-ideation 8 commit / C: gateway adapter migration + Signal 16 commit / D: 23 个 misc commit + AUTHOR_MAP + 7 merges) -
2026-06-19-update: 181 commits 跨日同步 + ⭐ v0.16.0 → v0.17.0 release(hermes-agent
03d9a95 → 01f581d8d,v0.17.0 已发经2bd1977d8 chore: release v0.17.0 (2026.6.19)+866f1d65c (#49236)Desktop fallback;约 76 fix / 39 feat / 14 test / 14 chore / 10 refactor / 4 docs / 24 merge;~24h 主活跃窗口;282 文件 +20287/−1661)— ⭐ Gateway Multiplex Phase 0-4 主轴 9 commit(单 gateway 进程内多 profile 并发;gateway/config.py:553 multiplex_profiles:bool=Falseopt-in +gateway/session.py:616-651 _session_key_namespace(profile)/build_session_key(profile=)默 profile→"agent:main" 命名→"agent:" +:97-104 SessionSource.profile:Optional[str]=Nonewire 字段 +:813-831 SessionStore._resolve_profile_for_key(source)+gateway/platforms/webhook.py:199-202注册/p/{profile}/webhooks/{route_name}与默/webhooks/{route_name}双路由 +:60-65 _PROFILE_REJECTED哨兵 +:413-441 _resolve_request_profile()验证 → 404 +:693-696Source.profile stamping + 新agent/secret_scope.py 205 行Phase 2 fail-closed credential 隔离::35 _MULTIPLEX_ACTIVE:bool=False+:39-50 set_multiplex_active/is_multiplex_active+:55-56 _SECRET_SCOPE:ContextVar[Optional[Mapping]]+:60-66 class UnscopedSecretError(RuntimeError)+:69-80 set_secret_scope/reset_secret_scope/current_secret_scope+:97-113 _GLOBAL_ENV_EXACT=frozenset({PATH, HOME, ...})allowlist +:114-116 _GLOBAL_ENV_PREFIXES+:122-163 get_secret(name) -> Optional[str]multiplex active + 无 scope + 不 allowlist → raise;否则 os.environ.get +:166-209 load_env_file/build_profile_secret_scope+gateway/run.py:46-52 @contextmanager _profile_runtime_scope(profile_home)+:1269 class MultiplexConfigError(RuntimeError)+:1275-1283 _PORT_BINDING_PLATFORM_VALUES=frozenset({webhook, api_server, msgraph_webhook, feishu, wecom_callback, bluebubbles, sms})不可多路 +:2401 _profile_adapters:Dict[str, Dict[Platform, BasePlatformAdapter]]+:5367-5370set_multiplex_active()+:6726-6794 _start_secondary_profile_adapters()->intorchestrator + 凭据指纹 +:6796-6854 _start_one_profile_adapters()->int端口/凭据冲突检测 raise MultiplexConfigError +:6857-6864 _make_profile_message_handler()stamp source.profile +:6866-6879 _adapter_credential_fingerprint()salted hash +hermes_cli/runtime_provider.py所有 os.getenv 走 _getenv→get_secret +agent/credential_pool.pyenv fallback 经 get_secret +tools/mcp_tool.pyMCP config interpolation 用 get_secret +hermes_cli/gateway.py:3854-3933 _guard_named_profile_under_multiplexer(force=False)lifecycle guard 防 named profile 在 multiplex 已运行时单独启动 +gateway/status.py:578-603 write_runtime_status(served_profiles=)写 runtime_status.json + 新文档website/docs/user-guide/multi-profile-gateways.md 133 行opt-in/路由/凭据隔离/端口绑定限制/--force + 4 套测试 phase0_165行/phase1_73行/credential_isolation_88行/adapter_registry_136行/lifecycle_55行/secret_scope_130行)— ⭐ Cron Chronos NAS-mediated scale-to-zero provider 11 commit(新cron/scheduler_provider.py:27-178class CronScheduler(ABC)实验性 +name抽象 +is_available()invariant:不得网络 IO +start(stop_event, *, adapters, loop, interval)阻塞调度循环 +stop/on_jobs_changed/fire_due/reconcile五 hook +class InProcessCronSchedulername="builtin" 60s 阻塞 ticker +:114-151 resolve_cron_scheduler() -> CronScheduler读 cron.provider 失败 degrade builtin + 新plugins/cron/__init__.py 344 行discovery machinery +@register_cron_scheduler装饰器 +load_cron_scheduler(name)+gateway/run.py _start_cron_ticker()deprecated shim +_start_gateway_housekeeping()拆出 channel-dir/cache cleanup/paste sweep/curator +start_gateway()resolve_cron_scheduler().start()+hermes_cli/web_server.py _start_desktop_cron_ticker()同走 resolver +cron/scheduler.py抽run_one_jobshared helper +cron/jobs.py:1076-1090 _machine_id()HERMES_MACHINE_ID env 或 hostname:pid +:1093-1127 claim_job_for_fire(job_id, *, claim_ttl_seconds=300) -> bool多机 at-most-once CAS:missing/disabled/paused→False / fresh claim→False / stale claim→overwrite + True;赢时 stampfire_claim={at, by}推进 next_run_at +:979-981 mark_job_run()完成清 fire_claim + 新插件plugins/cron/chronos/__init__.py 241 行class ChronosCronScheduler(CronScheduler)+_armed:dictcache +name="chronos"+is_available()config check only 无网络 +_have_nous_token()/_get_client()/_callback_url()lazy +start()reconcile + RETURN(非阻塞,由 NAS webhook 推触发)+on_jobs_changed()→reconcile +fire_due()→ABC default (claim + run_one_job) + re-arm 下一次 +reconcile()→arm 缺失/改变 cancel orphan + 新_nas_client.py 123 行 class NasCronClientHTTP wrapper (provision/cancel/list) + 新verify.py 103 行 _FIRE_PURPOSE="cron_fire"+verify_nas_fire_token(*, token, expected_audience, jwks_or_key, issuer, leeway_seconds) -> Optional[Dict]仅 RS/ES family(symmetric 拒)+ 校验 aud/exp/nbf/iss/purpose + 失败 None 不抛 +get_fire_verifier() -> Callablepluggable indirection +gateway/platforms/api_server.py:3345-3402 _handle_cron_fire(request) -> web.ResponsePOST/api/cron/fireBearer + get_fire_verifier(cron.chronos) 401 on bad token / 400 on 缺 job_id / 202 + backgroundprovider.fire_due()+ dashboard 同 surface +cron/scheduler.py:961-1041 _run_job_script():1034 env=_sanitize_subprocess_env(os.environ)防 provider 凭据泄漏给用户脚本 +tools/environments/local.py:206 _sanitize_subprocess_env(base_env, extra_env) -> dictblocklists 复用 + 测试 scheduler_provider/claim_job_for_fire 84行/chronos_cron 203行/chronos_verify 182行(真 RS256 sign-verify)/cron_fire_webhook 152行 + 新 docsdocs/chronos-managed-cron-contract.md+bfb6e0bb3 docs(cron): CronScheduler provider + cron.provider key)— ⭐ MCP late-connecting tools snapshot 8 commit(修:MCP HTTP/SSE 异步 connect 期间 agent build snapshot 时它们尚未 list_tools → 工具不入 system prompt;本 series:tools/mcp_tool.py:4361-4480 refresh_agent_mcp_tools(agent, *, quiet_mode=False)每轮调用:snapshotregistry._generation(line 4424) 在 rebuild 前 → rebuild → atomic publish:published_gen_raw = getattr(agent, "_tool_snapshot_generation", -1)(4458) →if snapshot_generation < published_gen: return拒 stale (4460) →agent._tool_snapshot_generation = max(published_gen, snapshot_generation)(4479) +agent/turn_context.py:126-129 build_turn_context()廉价预检has_registered_mcp_tools()然后refresh_agent_mcp_tools(quiet_mode=True)+ 3 轮 adversarial review:round 1 cache parity/gates/races / round 2 stale-publish race/parity holes / round 3 generation capture adjacency(捕获从"rebuild 开始"挪到"rebuild 前最后一刻"缩 race 窗)+ revert ACP rebuild 改回原始路径 + harden generation guard +tools/mcp_tool.py:22 服务端 config 文档 keepalive_interval:10+:291 _DEFAULT_KEEPALIVE_INTERVAL=180+:292 _MIN_KEEPALIVE_INTERVAL=5+:1694-1696 keepalive_interval = max(_MIN_KEEPALIVE_INTERVAL, float(config.get("keepalive_interval", _DEFAULT_KEEPALIVE_INTERVAL)))让短 TTL HTTP/SSE MCP 不每 idle 周期 reconnect + 新:1235-1389 class ElicitationHandlerMCP 1.1+ 服务端主动 elicitation 协议::1258 _OUTER_TIMEOUT_GRACE_SECONDS=5+:1260 __init__(server_name, config, owner)+:1281 async __call__(context, params)+:1320 import request_elicitation_consent from tools.approval+:1342 captured = getattr(self.owner, "_pending_call_context", None)抓 contextvars +:1354 captured.copy().run(request_elicitation_consent, ...)gateway-aware approval routing 让 Telegram/Discord/Slack 等平台正确弹审批 UI)— ⭐ Managed scope 系统级 /etc/hermes 配置层 10 commit(新hermes_cli/managed_scope.py 215 行::33 _DEFAULT_MANAGED_DIR=Path("/etc/hermes")POSIX 默 +:56 $HERMES_MANAGED_DIRenv override 优先(IT/bootstrap)+:52-71 get_managed_dir() -> Optional[Path]三级回退(env override → /etc/hermes 非 pytest → None)+:74 _invalidate_managed_cache()测试 hook +:115-125 load_managed_config() -> dictLRU cached + fail-open(读不到/格式错→{})+:128-134 load_managed_env() -> Dict[str, str]同 fail-open +:137-177 apply_managed_overlay(config) -> dict深合并 + env expansion +:202-204 managed_config_keys() -> set扁平 dotted key 集 +:207-209 is_key_managed(dotted_key) -> bool+:212-214 is_env_managed(name) -> bool+hermes_cli/config.py:5673-5726user config 加载后调 apply_managed_overlay +:6119-6211写hermes config set/env set经 is_key_managed/is_env_managed 拒 managed 键 +:5840-5842 managed_keys = managed_scope.managed_config_keys()doctor 输出 + managed.env后置覆盖(管理员强制 override user)+ cli.py 内 fast-path 也接 overlay + standalone loaders 都补 + config→env 桥经 overlay + 新文档website/docs/admin/managed-scope.md含部署模式 + 路径权限 + 重启行为 + IT 工作流 +bf9a0481f测试 pin config/env load 行为 before managed scope 防 regression)— ⭐ Unified provider catalog 8 commit(新hermes_cli/provider_catalog.py:45-52 _ACCOUNTS_AUTH_TYPES=frozenset({...})+:56-68 @dataclass(frozen=True) class ProviderDescriptor字段slug/label/description/auth_type/tab("keys"|"accounts")/api_key_env_vars/base_url_env_var/signup_url/order+:71-73 tab_for_auth_type(auth_type) -> str+:83-165 provider_catalog() -> list[ProviderDescriptor]单源含 OpenAI/Anthropic/Bedrock/OpenRouter/xAI/Codex/Custom +:168-170 provider_catalog_by_slug() -> dict+hermes_cli/web_server.py:3971-4056 _catalog_provider_env_metadata()经 catalog 派生 Keys tab metadata +:4059-4100 get_env_vars(profile)/api/env挂 provider/provider_label hints → Desktop Keys tab 按 backend grouping +:5836-5881 _build_oauth_catalog()Accounts tab 经 catalogflow="external"含 catalog-only 未连 provider +:5884-5924 list_oauth_providers(profile)+ Desktopapps/desktop/src/app/settings/providers-settings.tsx:121 OAuthPicker()+apps/desktop/src/app/settings/keys-settings.tsx按 provider 分组 + API-keys 搜索框 + priority-sorted by ProviderDescriptor.order +apps/desktop/src/hermes.ts:361 getEnvVars()/.:408 listOAuthProviders()+ parity test 锁 GUI ⊇hermes modelprovider 集含 Bedrock + catalog-only OAuth status fallthrough)— Raft 新平台插件 3 commit(新plugins/platforms/raft/plugin.yamlname:raft-platform / label:Raft / kind:platform / version:1.0.0 / author:botiverse / kind:platform;requires_env:RAFT_PROFILE设置即 enable;adapter "external agent via wake-channel bridge",loopback HTTP 接 wake hints,不碰消息正文 / 投递游标 +plugins/platforms/raft/adapter.py 774 行::174 _make_activity_eventschemaraft-activity.v1+:260 class ActivityQueuebounded telemetry 队列 +:438 class RaftAdapterHTTP 服务器 +:768-774注册 7 activity hooks + bridge subprocessstdin=DEVNULL+ AUTHOR_MAP [email protected]→xxchan)— simplify-code skilldb744e7d1(skills/software-development/simplify-code/SKILL.md 212 行灵感来自 Claude Code/simplify;3 risk tierSAFE(auto-apply 无 semantics 改变)/CAREFUL(verify 后)/RISKY(flag only) + Chesterton's Fence lines 90-91 删前 git blame 查 fence 缘由 + AI slop 检测 (redundant comments / as any cast / 过度 null-check / unused param) + silent failure 检测 (空 catch / 错误抑制无日志 / Optional 默静默) + 3 并行 subagent reviewer reuse/quality/efficiency + 触发关键词simplify/review my code/clean up;不 auto-run)— html-artifact skill9362ce257 (#48899)加后立即 revert92451151cHEAD 上 ABSENT 三个 sub-skill sketch/architecture-diagram/concept-diagrams 仍独立 — Relay WS-only Phase 3 (#48294) + hosted gateway 实际 connect 修 (#48828) + self-provision 触发改 relay-config+NAS-token 非 is_managed() (#48724) + terminal 块禁内部 gateway lifecycle (#245b95b09)(d2c53ff55gateway/relay/adapter.py:85,89 set_inbound_handler/set_interrupt_inbound_handler全绑 WebSocketRelayTransport 删 signed-HTTP fallback;a64fc490fhosted gateway 真 connect inbound/outbound round-trip;2c6e266e8gateway/relay/__init__.py:207 self_provision_relay():219触发改 "relay_url 配 + NAS token + 无 secret 钉";245b95b09tools/terminal_tool.py:2068-2082gateway 进程内拒 hermes gateway start/stop/restart 防 agent 自杀)— image_generate 加 image-to-image / editingc02192ff6 (#48705)(agent/image_gen_provider.py +79ImageGenProviderABCgenerate()加 keyword-onlyimage_url + reference_image_urls+ 新方法capabilities()声明 modalities + max_reference_images(默 0 text-only 向后兼容)+success_response.modality+normalize_reference_images()+tools/image_generation_tool.py +426顶层 schema 暴露 + 动态 schema 反映当前模型 actual edit capability + 6 plugin 更新:openai +146 行 DALL-E edit endpoint / xai +104 行 grok image edit / krea +69 行 保 dict-shaped image_style_references verbatim 防 KeyError / fal +41 行 text-to-image delegation 时不传 None kwargs(保字节相同)/ openai-codex +28 行 text-only 友好错误消息 / 测试 image_to_image 349 行 + 文档 image-gen-provider-plugin/image-generation/tools-reference)— Desktop UX 18 commit(Cmd+K Restart gatewayapps/desktop/src/app/command-palette/index.tsx:368+apps/desktop/src/store/system-actions.ts:15 $gatewayRestartingjotai atom 状态栏 spinner + 重命名 Restart messaging→Restart gateway + 选 logs 可复制 + Restart action 在 messaging save/toggle toasts + Refresh Models cache bustapps/desktop/src/app/shell/model-menu-panel.tsx:119 refresh:true+ 通知 clickapps/desktop/src/lib/session-ids.ts:15resume stored session id + selectable slash/shell logspreview-console.tsx:88 selectedLogIds+ reasoning-effort pickerweb/src/components/ReasoningPicker.tsx在 chat sidebar + session switcher panelapps/desktop/src/app/session-switcher.tsx:16Chat tab + sessions 实时刷新dc5cb0a44+ sessions sort by 最近活动0d7abd555+ prefill 指令通知b936f92b2(/goal /undo) + vitest 入 dashboard npm test)— Gateway 鲁棒性 12 commit(cached agentmax_iterations/max_turns每轮 refresh from configgateway/run.py:1206-1214 _current_max_iterations()+:14802-14804+ 测 + Windows restart silent outage 修gateway/status.py:166-203 looks_like_gateway_command_line()严格 matcher +hermes_cli/gateway.py:321-490 _scan_gateway_pids()+hermes_cli/gateway_windows.py:1304-1325 _wait_for_gateway_absent()+:1327-1353 restart()hardened + Discord 非对话 metadata 跟踪gateway/run.py:429-439 _non_conversational_metadata()+plugins/platforms/discord/adapter.py:622-625 _DISCORD_NONCONVERSATIONAL_METADATA_KEYS=frozenset+:668-720 class _DiscordNonConversationalMessageTracker防 startup status message 切割 history backfill + Telegram/title命名 topicgateway/slash_commands.py:2805-2821propagate_schedule_telegram_topic_title_rename()非仅 auto-titles + Telegram opt-in 在线/离线指示gateway/platforms/telegram.py:477-494 _status_indicator_enabled/_status_online_text/_status_offline_text+:2245-2298 _set_status_indicator()async + Discord reply 上下文 hydrateplugins/platforms/discord/adapter.py:28-40 class _Snowflake+:4255-4257 _fetch_channel_context(reply_target=)+:4315-4382reply-anchored window scan + clarify dict-choice unwraptools/clarify_tool.py:23-53 _flatten_choice()+:88-90调 +:137-142 CLARIFY_SCHEMAdocstring 明确 options 仅在 choices[] 不在 question text + Discord 同 _flatten_choice + soft-boundary truncate buttons)— Kanban 5 commit(机器全局 singleton 锁gateway/kanban_watchers.py:26-59 _acquire_singleton_lock(lock_path)+:62-74 _release_singleton_lock+:660-680init +:1129-1143双退出释放 防 embedded dispatcher 多副本 +hermes_cli/kanban_db.py:128-132 RECLAIM_DEFER_GRACE_SECONDS=120+:3296-3305 release_stale_claims()defer 守 +:5154-5169 _worker_survived_termination()+:5172-5210 _defer_reclaim_for_live_worker()延 claim_expires by GRACE_SECONDS +:5449-5458 detect_stale_running()同守 +:5131-5145 _terminate_reclaimed_worker()ProcessLookupError → terminated=True + cross-platform fcntl/msvcrt + UTF-8 encoding)— OpenViking + Hindsight 6 commit(OpenViking structured sync attribution + tool parts;plugins/memory/openviking/__init__.py:124-125 _SYNC_TRACE_ENV+_OPENVIKING_RECALL_TOOL_NAMES+:163-164 _sync_trace_enabled()+:2461-2464空 tool_id batch skip guard +_TOOL_STATUS_*常量 + alias sets + 复用 env_var_enabled +agent/message_content.py _message_text/_message_matches_textstatic + Hindsightplugins/memory/hindsight/__init__.py:53 _MIN_CLIENT_VERSION="0.6.1"+:101-111 _ensure_cloud_client_dependency()lazy install +:1004在 import 前调 +plugin.yaml:5 hindsight-client>=0.6.1)— Agent 8 commit(Anthropic aux 经 streamagent/anthropic_adapter.py:2538-2589 _is_stream_unavailable_error/create_anthropic_message+run_agent.py:4079-4085 _anthropic_messages_create+ FTS5 trigram fallback 不禁 FTS5hermes_state.py:775-792 _is_fts5_unavailable_error/_is_tokenizer_unavailable_error+:858-862 _warn_fts5_unavailable()条件触发 + 非可重试 API 错误摘要_summarize_api_error()防 HTML 漏入对话 +hermes_cli/debug_bundle.py含 gui.log + 1d2e35967 session store 不可用 visible warning + e48554a3e worktree 互斥锁防多进程 clobber)— CLI/TUI 10 commit(/model切换默认跨会话持久hermes_cli/model_switch.py:362-391 resolve_persist_behavior()+:304-365 parse_model_flags()is_session flag +cli.py:6974+hermes_cli/config.py:1590 cli_refresh_interval=1.0状态栏 keep alive + viewport 宽度变化清屏c06898098 (#49120)+ 状态栏 idle 不隐1b04e4ede (#49105)+ tmux 内 fast-echo 关ab8f06381/e52fffb60防游标漂移含 SSH-from-tmux + TUI 托管 dashboard chat 不死15e3b64b7+ idle exit 重启12dfcfdf7+/update守 hosteda7b4fbcbc+ DASHBOARD_TUI_MODE 重用 + pending-input 经command.dispatch()169952563 (#48848))— Dashboard 8 commit(chat TUI argv 出 event loopd06104a9e (#48561)+/api/cron/firec34840e22+ DS Button prefix/size APId573e7c9e+ upload temp file disconnect 清理 + python-multipart 锁6752da9a7 (NS-501)+ Slack allowed users wildcard83c034bd5+ Slack setup hints + 验证 + sessions sort by 最近活动)— Sessions/Backup/Misc 10 commit(hermes_state.py递归 CTE 让 child session 继承祖先 title 跨 compression lineage6ad0bc20f/65d050cf0/8c70346e3+hermes_cli/backup.py EXCLUDED_BACKUP_DIRS排 .venv/node_modules/pycachee738c0833 (#48887)+ Stripe Projects skill docscfb55de5e (#48673)+ undici audit bumpb266ad748 (#49113)+ hashless npm via importNpmLock3ca0ef7e3 (#48883)+ Docker WebUI 只读源36851fa57 (#48541)+ Windows managed-node 路径解析7a7b56d49/fcc169057/d4e7dd609 (#49254)+ 多条 AUTHOR_MAP salvage:lgalabru→PR#43112 / salesondemandio→PR#42664 / OpenViking / carlos.dddo / Cdddo / JoaoMarcos44 / channkim→PR#47049 / Sahil-SS9→PR#48466/44919/44909/42209 / tt-a1i / xxchan)— 验证基线/tmp/hermes-agentclone @01f581d8d+ 4 个并行 research agent 实证(A: Gateway Multiplex + Chronos cron 11 commit / B: MCP late-connect + managed_scope + provider catalog 17 commit / C: Raft + simplify-code + Relay + Desktop UX 14 commit / D: Gateway 鲁棒性 + Kanban + Agent/CLI/TUI + Dashboard 40+ commit) -
2026-06-18-update: 164 commits 跨日同步(hermes-agent
d1ecebc → 03d9a95,仍 v0.16.0 未发新版;约 70 fix / 25 feat / 16 test / 12 chore / 10 refactor / 7 docs / 3 perf / 21 merge;48h 双日窗口;285 文件 +25193/−1708)— ⭐ Relay/A2 Trust-Boundary 传输 Phase 0-3 主轴 23 commit(新文件/Library/Application Support/Hermes/gateway/relay/descriptor.py:77 CapabilityDescriptorfrozen dataclass JSON-serializable handshake payload +contract_version, platform, label, max_message_length, supports_draft_streaming/edit/threads, markdown_dialect, len_unit, emoji, platform_hint, pii_safe+to_json()/from_json()forward-compat +:76-120 from_platform_entry()+CONTRACT_VERSION=1additive-only;新gateway/relay/adapter.py:44-130 RelayAdapter(BasePlatformAdapter)从 descriptor 读MAX_MESSAGE_LENGTH/message_len_fn(chars/utf16)/supports_draft_streaming/supports_code_blocks +:32-41 _utf16_len/_LEN_FNS+:79-110 connect()注_on_inboundhandler +:139-149 on_interrupt(session_key, chat_id)→interrupt_session_activity+:190-221 send_follow_up(session_key, kind, content, metadata) → SendResulttoken-less A2 op +gateway/config.py:167 Platform.RELAY+:7-9 _PLATFORM_CONNECTED_CHECKERS RELAY checker;新gateway/relay/transport.py:1-75 RelayTransport(Protocol)lifecycle(connect/disconnect/handshake)+ inbound(set_inbound_handler)+ outbound(send_outbound/send_follow_up/get_chat_info/send_interrupt);新gateway/relay/ws_transport.py:102-299 WebSocketRelayTransportnewline-delimited JSON 帧协议 + 7 帧类型 hello/descriptor/inbound/outbound/interrupt/outbound_result/interrupt_inbound + uuidrequestId相关 per-request future + 30s handshake/outbound timeout + send_interrupt fire-and-forget +:57-100 _event_from_wireSessionSource snake_case wire→dataclass +:158-174 _upgrade_headersAuthorization Bearer 在/relayWS upgrade;新gateway/relay/auth.py:50-135 make_token/make_upgrade_token(gateway_id, secret, ttl_seconds)/verify_token(token, secrets)base64url(payload:exp:sig) HMAC_SHA256 多 secret 轮换窗 + Python port of connector'srelayAuthToken.ts/deliverySigning.ts字节级互证;新gateway/relay/inbound_receiver.py:204 InboundDeliveryReceiveraiohttp 双 POST routes/message和/interrupt验x-relay-signature/x-relay-timestampover 原始 raw request 字节(re-serialize 破 HMAC)+ 300s replay 窗 + per-tenant delivery key verify list;新hermes_cli/gateway_enroll.py:250 hermes gateway enroll子命令 (subcommands/gateway.py:50 cmd_gateway_enroll) 解 Nous Portal access token + POST{enrollmentToken, gatewayId}到 connector/relay/enroll+ 持久化GATEWAY_RELAY_ID/SECRET/DELIVERY_KEY到~/.hermes/.env+is_managed()拒;Phase 3gateway/relay/__init__.py:116-340 self_provision_if_managed()MANAGED + relay 已配 + secret 未钉时 in-process 自供给:resolve_nous_access_token()→ POST connector/relay/provision断言 endpoint+route keys → 设 env 让register_relay_adapter()读到 + 凭据仅驻内存(永不写~/.hermes/.env)+ 显式钉的 secret 尊重跳 self-provision +relay_endpoint()/relay_route_keys()/_provision_url()/_post_provision()+ 12 单测覆盖;237fa7d29删HERMES_GATEWAY_RELAYdark-launch flag 改配置驱动relay_url()读GATEWAY_RELAY_URL或gateway.relay_url+register_relay_adapter()URL 已配时注册无配时 no-op +gateway/run.py GatewayRunner.start()在插件发现后调 + 失败 log 不阻启;6 套测试:test_descriptor.py:66(6 测 roundtrip/frozen/unknown-key/optional defaults)+test_descriptor_from_entry.py:64+test_relay_adapter.py:77+test_relay_roundtrip.py:122(Discord+Telegram round-trip 泛化证明,utf16+markdown_v2 dialect)+test_relay_registration.py:55(配置驱动 gate)+test_relay_interrupt.py:69+test_ws_transport.py:179(live in-process websockets server real handshake/inbound/outbound/follow_up/disconnect pending waiter fail)+test_auth.py:167(upgrade token/deliver signature/rotation 窗)+test_inbound_receiver.py:150+test_no_stub_leak.py:44CI guard:production 路径不 import StubConnector +test_relay_sheds_crypto.pyA2 不变式:relay 路径不 import 平台 crypto(ed25519/HMAC/webhook sig)+test_relay_contract_conformance.py钉 contract docs ↔ Python 字段(SessionSource.to_dict()7 wire 键也加入文档)+ 整套 57 passed;测试用tests/gateway/relay/stub_connector.py:66 StubConnector(in-memory 测试专用 + canned send_result + push_inbound test driver);新docs/relay-connector-contract.md:143v1 契约 + §6 重写 A2 trust-boundary 模型:connector 是唯一 crypto/identity 边界 + §6.1 channel-auth schemes + SessionSource 判别器表(Discord guild_id REQUIRED)+ signed-body verify-at-edge + additive-only contract_version 政策) — ⭐ /billing 终端账单 #45449(新agent/billing_view.py 295 行surface-agnosticBillingState/parse_money/format_money/CardInfo/MonthlyCap/AutoReloaddataclass + fail-open builder + 新hermes_cli/nous_billing.py 406 行类型化 HTTP client 接 4 个/api/billing/*endpoint +BillingScopeRequired/BillingRateLimited/BillingAuthError异常 + Idempotency-Key 强制 +cli.py +657 行5 个 screen overview/buy→confirm→poll/auto-reload/monthly-limit(read-only)+_show_billinghandler + 2s 节流/5min 可取消 poll +tui_gateway/server.py +216 行billing.state/charge/charge_status/auto_reload/step_upJSON-RPC + 结构化 success enveloperesult.ok + result.error=<code>+ 新ui-tui/src/app/slash/commands/billing.ts 332 行全 TUI overlay 状态机 +ConfirmReqoverlay 复用 +insufficient_scope→lazy step-up/no_payment_method→portal错分支 + 新ui-tui/src/components/billingOverlay.tsx 684 行+hermes_cli/auth.py +97 行 NOUS_BILLING_MANAGE_SCOPE/nous_token_has_billing_scope()/step_up_nous_billing_scope()lazy 重 auth 持久化按_login_nous方式但不弹模型 picker;6 套测试共 1266 行 51+6+7+16+12+53 行(billing_view 决策+预算+fail-open / CLI / scope-stepup / portal URL / RPC / vitest);端到端 Decimal money(server 发 decimal 串 → 保 Decimal → 仅显示格式化)+ poll loop token 缓存避锁争用 + 401 时重 resolve fresh + CLI 非交互(_app is None)渲文本+portal deep-link 永不 prompt + CommandDef 入_SLACK_VIA_HERMES_ONLY经 Slack/hermes保 50-cap 对齐 + 截图.github/pr-screenshots/45449/) — ⭐ OpenViking session-boundary race 12 commit 收口(4 并发原语:(1) state lock Lock 保护 session 旋转 sync_turn 不跨边界 (2) per-session writer registryplugins/memory/openviking/__init__.py:1664 _inflight_writers: Dict[str, Set[Thread]]+:2080-2102 _spawn_writer自注+自反注 +:2129-2156 _drain_writers(sid, timeout)loop+re-join + 全部 drain 才允许 commit (3) prefetch_generation 单调 int worker capture 长操作完成时 if 已升 → 拒写 (4) async finalize:2232-2260 _finalize_session_asyncdaemon offload drain+pending GET+commit POST 让命令线程立返/new//branch//resume//undo不卡;12 commit:813a4e383 (#28296):2373-2439 on_session_switchhook bounded join 10s + commit if turn_count>0 + drain stale prefetch /a30b40c73sync_turn:2309-2320capture sid before worker + on_session_end:2360-2370reset turn_count for 幂等 + 测test_end_then_switch_does_not_double_commit/eddbf291are-check is_alive after join 未 drain 跳 commit + on_memory_write 同 sid 快照 + prefetch_generation 拒 stale write /91e9459e1per-session writer dict 替单槽_sync_thread防 bounded join drop live worker /00c045b43综合硬化 /f3b813c02测试 preserve content/write writes /3ac6551ba:2399 rewound=bool(kwargs.get("rewound")):2411-2430rewound 时跳旋转只 invalidate prefetch /c83544890命令线程不卡 drain+commit /2a5d51c16 (#48206)adapt current api /4de4a4e2d (#47973)type-correct skill-scaffolding sentinels /5494c1e9b (#48262):858-863 _write_ovcli_config改用atomic_json_write(mode=0o600)共享 helper 关 chmod-after-write TOCTOU /99a20f8d9plugin 期望更新) — ⭐ Memory 单轮 batch ops #48507(tools/memory_tool.py:450-563 MemoryStore.apply_batch(target, operations)全 op 按最终预算校验 + 原子写 + 任一失败回滚整批 +:792-826 _apply_batch_write_gate跨 op auth +:839-922 memory_tool(operations=[{action,content?,old_text?}])dispatcher + 桥接外部 provideragent/agent_runtime_helpers.py:1842-1875+agent/tool_executor.py:1012-1050遍历 batch op 对 add/replace 调on_memory_write+agent/background_review.py:300-408batch op 显示;live 验证:consolidate-and-add 7→1 调用) — ⭐ Skills 用户修改 bundled-skill 发现+diff CLI(tools/skills_sync.py:825 list_user_modified_bundled_skills()用 manifest origin-hash 基线 +:813 _is_tracked_user_modification(origin_hash, user_hash)共用谓词防 sync loop/discovery 漂移 +:881 diff_bundled_skill(name)文件级difflib.unified_diff()检 modified/added/removed/binary +:836 _read_for_diff单读返 (bytes,text);CLIhermes_cli/skills_hub.py:1152 hermes skills list-modified [--json]+:1185 hermes skills diff <name>+:1870+/skills list-modified/skills diffslash 镜像 +subcommands/skills.py:164/194argparse +hermes update提示在main.py:9063 + 6073两路径都点向新命令 + 不变式测test_update_modified_notice.py:505 行窗内必现 hint 不固定路径数;f6fac60e6refactor_skill_file_list()helper 去重 + diff 契约删user_present;25c590ccdrmtree guard 拒 SKILLS_DIR root(不只外部)+f1254c8ea (#48200):695 _rmtree_writable()必须严格 SKILLS_DIR 的 child 防坏路径拼接/恶意 manifest/折叠路径静默 wipe~/.hermes/+hermes_cli/config.py:2502-2510 pre_update_backup默 True + 5 case scope guardtests/tools/test_skills_sync.py:237;功能测test_skills_list_modified_diff.py132 行 6 测 pristine 不假阳/edited listed/diff pristine clean/diff modified+added/未知 ok=False/reset 一致) — ⭐ Langfuse trace state 按 turn/request id 隔离(plugins/observability/langfuse/__init__.py:247 _trace_key(task_id, session_id, turn_id="", api_request_id="")三 tier:Tier 1 turn-scopedtask:T:turn:U/session:S:turn:U/thread:PID:turn:U;Tier 2 request-scopedtask:T:api:R/...;Tier 3 legacy 裸 task_id/session:S;turn_id 优先(turn-scoped post_llm_call 无 api_request_id 必须 resolve 到 request hook 同 key)+:231 _scope_prefix抽取共用 task/session/thread fallback ladder 防漂移;:65 _MAX_TRACE_STATE=256+:713 _evict_stale_locked()在_STATE_LOCK下 insert 前调 LRU 驱逐非-finalizing turn(被打断/tool-only final/空 final content)防_TRACE_STATE无界增长 + 驱逐前结 root span;hook 签名升级:785 on_pre_llm_call/:843 on_pre_llm_request/:883 on_post_llm_call/:1050 on_pre_tool_call/:1056 on_post_tool_call全传 turn_id+api_request_id;端到端隔离tests/plugins/test_langfuse_plugin.py:254 TestTurnTraceIsolation2 turn(1 非-finalizing+2 normal)2 separate root trace 开(pre-fix 只 1,turn 2 merge into turn 1)+:381 test_non_finalizing_turns_do_not_grow_state_unboundedly50 turn vs cap=8 surviving keys turn 42-49 LRU 驱 0-41 +:402 test_trace_key_strings_unchanged_by_refactor钉所有 task/session/turn/api 组合精确输出防漂移) — ⭐ Anthropic OAuth wire mcp__ 双下划线前缀 #47723(关键 wire-format 变更:单下划线mcp_被 Anthropic 工具分类器算第三方 → HTTP 400 + 路由 extra-usage 计费 lane;agent/anthropic_adapter.py:375 _MCP_TOOL_PREFIX="mcp__"(之前"mcp_")+:2349+ tool prefix 跳已mcp_/mcp__防双前缀 +agent/transports/anthropic.py:91 MCP_PREFIX="mcp_"+:2370-2391 to_oauth_wire_name()归一化所有mcp到mcp__(裸 native + MCP server 工具如mcp_linear_get_issue):startswith("mcp__")不变 /startswith("mcp_")→"mcp__" + name[len("mcp_"):]/ else →MCP_TOOL_PREFIX + name;应用于 tool 定义和**消息历史** tool_use 块 +agent/transports/anthropic.py:132-151 normalize_response反向解经 registry 查找:registered name → single-underscore + bare(MCP server 工具)→ bare name(native)→ 兜底保留mcp_wire;测试重写:零单下划线到达 OAuth wire;mcp__圆 trip 解为 registered name 两类工具;实证:单mcp_工具翻整请求到 extra-usage /mcp__在 plan) — **⭐ Curator skill consolidation 改 opt-in #47840**(agent/curator.py:64 DEFAULT_CONSOLIDATE=False+:190-203 get_consolidate()读curator.consolidate默 False +:1428 run_curator_review(consolidate=None)None 读 config / True/False 覆盖 +:1546-1570not consolidate跳 fork aux-model review 整段直接写 prune-only;fc1119ca6rollback safety snapshot 自保护:可选 protect set 经snapshot_skills()穿到_prune_old()防 evict 正被恢复 snapshot;992b92238restore 收紧到 archive_skill() 的精确 14 位时间戳后缀防同前缀无关 archived skill) — **Dashboard 流式 multipart 上传 #47663**(之前 file 上传走 base64 data URL in JSON body 膨 33% + 内存缓冲 + 撞 proxy 502;新hermes_cli/web_server.py:1486-1560 upload_managed_file_streamUploadFile+Form按 1 MiB 块直读到 temp + 100 MB cap streaming 中 enforce 413(不 full buffer 后)+ 原子os.replace(partial/abort 不覆盖现有)+ 加python-multipart依赖;前端api.uploadFile改multipart/form-dataraw 字节)— **Docker supervised gateway --replace #47555 + 安装树自我修改硬化 #47490 + macOS launchd in-tree 推迟 #47842** + **runtime-pid 本机 only liveness + await-safe config-only scope /api/status + Chat tab session-end 恢复 #47674 + 完整 MCP catalog 明细 #48520** + **OpenViking 设置 UX 10 commit**(手动 setup path/密钥类型前置选/预创建 0600 关 TOCTOU/chmod 失败日志/15s health wait/_classify_runtime_openviking_health区分 responded vs unreachable/不健康端点跳 autostart)+ **Hindsight memory provider 入 Desktop 配置面板 #37546**(新apps/desktop/src/app/settings/provider-config-panel.tsx 1-182声明式 + schema-drivenhermes_cli/memory_providers.py 1-149 ProviderField/ProviderFieldOption+ GET/PUT/api/memory/providers/{name}/config+constants.ts:242 ENUM_OPTIONS'hindsight' 进 memory.provider)+ **xAI grok-composer-2.5-fast 入 OAuth picker + 200k ctx 修 + native web_search swap-only + incomplete-call 守 + Codex 设备码 429 重试 #47860 + session_id/x-client-request-id headers 复原 #47335**(agent/model_metadata.pygrok-composer 200000 /grok-composer-2.5-fast 262144+agent/transports/codex.py:60+/43+swap-only web_search 不额外授 +agent/codex_responses_adapter.py:69+不算 in_progress 为 incomplete +hermes_cli/auth.py:78+设备码 capped 指数退避 4 次 + raiseAuthError(code=CODEX_RATE_LIMITED_CODE)含 wait hint)+ **Model pickermax_models=0 ≠ unlimited语义锁 + 移除 50 cap #48279**(hermes_cli/model_switch.py:10+切片改is not Nonecheck /build_models_payload/list_authenticated_providers/list_picker_providers默改 None unlimited)+ **Prompt 跨平台 platform_hints override + context-file cap 按模型 ctx 自适配 #47846 + parallel-tool-call steer 去重**(agent/agent_init.py:1242读agent._platform_hint_overrides+agent/system_prompt.py:61-113 _resolve_platform_hint()append/replace/shorthand +hermes_cli/config.py:2173-2189 DEFAULT_CONFIG.platform_hints文档;agent/prompt_builder.py:961-984 _dynamic_context_file_max_chars()ctx_tokens40.06floor 20K ceiling 500K +:1540-1549 _truncate_content(context_length, read_path)标记点 truncated 文件路径引导 read_file;删GOOGLE_MODEL_OPERATIONAL_GUIDANCE重复 Parallel tool calls 段 + 注释修正)+ **Resume 跟随 compression-tip #48633 + /compress 跳旋转保护 + 旋转前 flush 待持久化消息 #47202**(hermes_state.py:2820-2841 resolve_resume_session_id()经get_compression_tip()forward 跟随 + 只跟end_reason='compression'parent,不混 delegation/branch;gateway/slash_commands.py:2588-2613仅当_compress_context产新 sid 才调rewrite_transcript;agent/conversation_compression.py:512-523 compress_context+cli.py:5975-5989 new_session旋前 flush + catch)+ **Kanban auto-subscribe calling session on create**(gateway sessions 用HERMES_SESSION_PLATFORM+HERMES_SESSION_CHAT_IDContextVars / TUI/desktop 用HERMES_SESSION_KEY子进程 env / 门kanban.auto_subscribe_on_create默 True)+ **Backup hermes import 跳易失 gateway 状态 #48243 + Update install-method stamp scope 改 code-tree #48188**(_IMPORT_SKIP_NAMES={gateway_state.json, gateway.pid, cron.pid, gateway.lock, processes.json}basename 跳防 hosted 实例 reconciler 读陈旧外来 state;detect_install_method()stamp 改驻 code tree(macOS/ Linux~/.local/share/hermes/ Windows%APPDATA%\Hermes)防 Docker bind-mount$HERMES_HOME单 stamp 描述两安装)+ **Photon iMessage mixed attachment text 保留 #46818**(plugins/platforms/photon/adapter.py:119+处理 'group' content type 扁平化 text+attachment +_normalize_binary_payloadhelper + sidecarindex.mjs/patch-spectrum-mixed-attachments.mjs 155 行在 npm postinstall+sidecar 启动应用 + Windows pathToFileURL+CRLF↔LF)+ **cua-driver MCP 操作员环境 scrub #37878**(tools/computer_use/cua_backend.py:3+ _sanitize_subprocess_env()防 credential exfil 到第三方 cua-driver binary 含 ANTHROPIC_API_KEY 测试)+ **MCP catalog Unreal Engine 5.8**(optional-mcps/unreal-engine/manifest.yaml 54 行HTTP127.0.0.1:8000/mcp无 auth;Epic experimental Unreal MCP plugin 嵌在 Editor)+ **Agent empty-name 工具调用循环抑制 #47967/#48109 + 多模态用户内容持久化保留 + send_message tool 撤回 #47856**(agent/conversation_loop.py:26+empty-name → 短 anti-priming error 无 catalog dump / 非空 unknown 仍 catalog;run_agent.py:10+避免 text-only persist_user_message override 覆盖 ACP image block;toolsets.py:14+drop model-tool 注册 + 空 'messaging' toolset,send engine 保留给 cron/gateway notifier/hermes sendCLI)+ **search_files headroom densification #47866**(tools/file_operations.py:250-278 _densify_matches()path-grouped lossless 57.8% token 降;≥5 matches 触发;不变式:ripgrep matches path-ordered)+ **Approval glob allowlist #43051**(tools/approval.pyglob 命令 allowlist 守 + shell chaining 防)+ **Container 检测 cgroup-v2/containerd/CRI/K8s #47131**(hermes_constants.py:486+KUBERNETES_SERVICE_HOSTenv +kubepods/containerd/criomarker +/proc/self/mountinfofallback)+ **Windows 跨进程日志轮替**(hermes_logging.py:36+ ConcurrentRotatingFileHandler as RotatingFileHandler仅sys.platform=='win32'+ portalocker pywin32 锁 + concurrent-log-handler==0.9.29)+ **install.ps1 PowerShell host 解析 + EAP 松绑后 uv venv fail-fast + native stderr 松绑 #48352/#48341**(scripts/install.ps1:320 Get-PowerShellHostExe用Get-Process -Id $PIDPATH-independent +:186 Invoke-NativeWithRelaxedErrorActionEAP=Continue 包 git/uv 防 PowerShell 5.1 NativeCommandError +:1460-1471relax 后立刻捕$LASTEXITCODE非 0 throw 防伪成功)+ **Desktop 23 commit**(stranded session 窗恢复 #47655:43/:307 $resumeExhaustedSessionId+ ErrorState 含 Retry 按钮;session 删幂等 #48641hermes_cli/web_server.py:7046-7067+ absent → 200already_absent:True;secondary 窗 streaming #47919electron/session-windows.cjs:24-34 chatWindowWebPreferences backgroundThrottling:false主+secondary 共用 factory;PTY before-quit dispose #92e6d8c85electron/main.cjs:6554-6558;Electron 40.10.2 钉 #47792package.json:137 electronVersion: "40.10.2"+ 删 @electron-internal/extract-zip + nix npmDepsHash 刷新 + react-simple-icons @=13.11.1;electronDist 动态解析+self-heal #48091apps/desktop/scripts/run-electron-builder.cjs 57 行 require.resolve("electron/package.json")动态 +_try_redownload_electron_dist()镜像 retry;self-update 重 build retry once #48122apps/bootstrap-installer/src-tauri/src/update.rs:296-328 rebuild_needs_retry()+electron/update-rebuild.cjs:21-29 runRebuildWithRetry();oversized 消息不冻结markdown-text.tsx:461 MAX_MARKDOWN_CHARS=200_000+:463-500 HugeTextFallback content-visibility:auto+ ExpandableBlock;huge fenced block stack overflow 防markdown-preprocess.ts:154-160 extend()替 spread 防 V8 argument-count overflow;message-render 隔离markdown-text.tsx:60-66 preprocessWithTailRepair try/catch+directive-text.tsx:325-339 safeEmbeddedImages/safeDirectiveSegments;failed turn 跨 thread 隔离use-message-stream.ts:1102-1109 errorMessage toast稳 id;long user message 滚 #48619thread.tsx:830 USER_BUBBLE_BASE_CLASS overflow-hidden→overflow-y-auto;error banner dismiss #47985desktop-controller.tsx:753-785 dismissError双清;/title 前置创行 #47987tui_gateway/server.py:5004 _ensure_session_db_row;RTL list marker + quote bordermarkdown-text.tsx:541/546/549 dir="auto"+:525 code dir="ltr";named custom provider 不退 bare custom #48547agent/agent_init.py:1227-12334 站守;backend skew toast 24h snooze #47913store/updates.ts:99-145 SKEW_TOAST_COOLDOWN_MS;pre-session 模型选黏 + reasoning/fast 设置 #47447lib/model-status-label.ts:25-34 currentPickerSelection();self-improvement review summaryuse-message-stream.ts:1084-1109 review.summary持久 system 消息 +tui_gateway/server.py:1911-1926 _load_memory_notifications)+ **TUI Enter slash 完成 + MCP late refresh + MCP 计数 connected only #48425/#48403/#48402**(ui-tui/src/domain/slash.ts applyCompletiontrailing-space-only 算 noop fall-through 提交 +tui_gateway/server.py:3413 _schedule_mcp_late_refresh30s 等 discovery 后 rebuild snapshot 仅 pre-first-turn 安全 + 重 emit session.info +ui-tui/src/components/branding.tsx:223+ mcpConnected=filter(s.connected)替全部配置计数;mcpConnected==0时段整 drop)+ **CLI keystroke 延迟 + URL 不当 path 补全 + 弃用 login 优雅降级 #47701/#47706**(cli.py:12714 ThreadedCompleter(_completer)把补全移出 event loop /hermes_cli/commands.py:1291+ if "://" in word: return None拒 URL token /subcommands/login.py:10删choices=+description=让任何 provider 都到 handler 打 redirect 到hermes auth/hermes model)+ **hermes debug显 commit 日期 #48104**(hermes_cli/dump.py:59 _get_git_commit_date()跑git log -1 --format=%cd --date=short返 YYYY-MM-DD;Docker/wheel 无.git时返空 baked SHA 仍识别)+ **6 条 AUTHOR_MAP salvage**(iamlukethedev / srojk34 / infinitycrew39 / Adolanium / #47904 / Rivuza全进scripts/release.pyPython dict)+ **PR infographic 资源删除 #48261**(docs/assets/ns504-chat-session-reconnect.png 1024 字节+infographic/kanban-db-corruption-defense/infographic.png 1200 KB都无引用) — 验证基线/tmp/hermes-agentclone @03d9a95` + 5 个并行 research agent 实证(A: Desktop UI 23 commit / B: Gateway+Relay+A2+Compression+Docker+Update 32 commit / C: OpenViking+Memory+Curator+Dashboard 35 commit / D: Skills+Langfuse+CLI+TUI+Install 33 commit / E: Prompt+Billing+xAI+Codex+Anthropic+Picker+Photon+MCP-catalog+cua-driver+AUTHOR_MAP+Merges 41 commit) -
2026-06-16-update: 65 commits 单日同步(hermes-agent
cffd6e3c8 → d1ecebc,仍 v0.16.0 未发新版;约 25 fix / 18 feat / 6 chore / 5 test / 4 docs / 1 refactor / 6 merge;28h 单日窗口;本期 65 commit 全部 committer date ∈ (2026-06-15 20:35 UTC, 2026-06-16 20:40 UTC] 的真正新增;cffd6e3c8..HEAD总 141 commit 中其余 76 个为前期 sync 已覆盖的旧 PR salvage(photon spectrum-ts/iMessage gRPC、yuanbao media pipeline middleware、agent char-based output-cap overflow、honcho identity-tree 各 sub-PR、apps/desktop sleep/wake recovery 等),本期不重复记录)— ⭐ Desktop composer model picker 全面替代 statusbar(PR #46959 4 commit):新文件apps/desktop/src/app/chat/composer/model-pill.tsx 72 行订阅$currentModel/$currentProvider/$currentFastMode/$currentReasoningEffort+formatModelStatusLabel+apps/desktop/src/store/model-presets.ts 86 行per-model effort/fast preset 本地化STORAGE_KEY="hermes.desktop.model-presets"+modelPresetKey(provider,model)="${provider}::${model}"+applyModelPreset({effort,fast}, ctx)在无ctx.sessionId时 no-op 避免写穿网关agent.reasoning_effort+apps/desktop/src/store/session.ts:18-234 个 composer localStorage keyhermes.desktop.composer.{model,provider,reasoning-effort,fast}+apps/desktop/src/app/shell/model-menu-panel.tsx:45 ModelMenuCloseContextReact Context 关闭 +989d5d0apps/desktop/src/lib/model-status-label.ts:71 /-\d{8}$/折叠日期 pinned snapshot +apps/desktop/src/store/model-visibility.ts:54-57 collapseModelFamilies同折叠(claude-opus-4-5-20251101 → claude-opus-4-5)+7d938ccagent/conversation_loop.py:303 _stored_prompt_matches_runtime(agent, prompt)比对Model:/Provider:行 vs runtime +tui_gateway/server.py:1684 _persist_live_session_system_prompt(session)经db.update_system_prompt重建 +:1705 _append_model_switch_marker(session, model, provider)追加[System: The active model for this chat has changed to {model} via provider {provider}…]进史历 +:2166-2168 _apply_model_switch接 — ⭐ Compact session window 家族 PR #46951 3 commit:apps/desktop/electron/main.cjs:5087 spawnSecondaryWindow({sessionId, watch, newSession})+:5148 createSessionWindow+:5155 createNewSessionWindow+apps/desktop/electron/preload.cjs:9 openNewSessionWindow:() => ipcRenderer.invoke('hermes:window:openNewSession')+apps/desktop/src/store/windows.ts:9 NEW_SESSION_WINDOW_FLAG="1"+:33 isNewSessionWindow()+:110-114 openNewSessionInNewWindow()+apps/desktop/src/lib/keybinds/actions.ts:69 {id:'session.newWindow', defaults:['mod+shift+n']}+apps/desktop/src/app/hooks/use-keybinds.ts:136调度 + i18nen.ts:192+zh.ts:188+0f75e99apps/desktop/src/app/shell/app-shell.tsx:86 hideTitlebarControls=isSecondaryWindow()(从isNewSessionWindow扩到所有 secondary)+ statusbar:194 !isSecondaryWindow()门 +apps/desktop/src/app/chat/index.tsx:127ChatHeader早返 +:311secondary 跳showIntro+67233d1新文件apps/desktop/src/store/session-sync.ts 25 行CHANNEL='hermes:sessions'BroadcastChannel +broadcastSessionsChanged()+onSessionsChanged(handler)+apps/desktop/src/app/desktop-controller.tsx:468-475订阅(跳 secondary 窗口)+apps/desktop/src/app/session/hooks/use-message-stream.ts:644title commit 后广播 +apps/desktop/src/app/session/hooks/use-session-actions.ts:476乐观创建后广播 +dd0e3e0apps/desktop/src/components/assistant-ui/thread-list.tsx:140主窗 padpt-[calc(var(--titlebar-height)+1.5rem)]→pt-[calc(var(--titlebar-height)-0.5rem)]— ⭐ Watch window subagent 流 PR #4706044e5848:tools/delegate_tool.py:870-876进度中继转发subagent.text(预览)+:1638-1647 _relay_child_text(delta)经child.run_conversation(..., stream_callback=_relay_child_text)+tui_gateway/server.py:907-913 _start_agent_buildlazy watch 跳过 +:2878-2884 _on_tool_progress对subagent.text跳父 emit +:2945-2951 _mirror_subagent_to_child把subagent.text映 child sidmessage.delta(subagent.start退化单次 header)+:4248-4258lazysession.resume在_child_run_active时早返空 history(WSL race 修)+ 窗口 chromeapps/desktop/src/app/chat/index.tsx:124-127 ChatHeader在isSecondaryWindow()早返(从isNewSessionWindow扩)+app-shell.tsx:83-86 hideTitlebarControls=isSecondaryWindow()+thread-list.tsx:147 secondaryTitlebarGap='calc(var(--titlebar-height) + 0.75rem)'(空格 load-bearing)+:265-270不透明拖条<div className="absolute inset-x-0 top-0 z-10 h-(--titlebar-height) bg-background [-webkit-app-region:drag]" />— 远端 gateway artifact 鉴权下载 PR #46895c6b0eb4:apps/desktop/src/lib/media.ts:62 mediaExternalUrl(path)远端感知 +:67 isRemoteGateway()分支构${conn.baseUrl}/api/files/download?path=…&token=…+apps/desktop/src/app/artifacts/index.tsx:128-133 artifactHref把file://与/路径都过mediaExternalUrl+hermes_cli/web_server.py:253 _QUERY_TOKEN_API_PATHS=frozenset({"/api/files/download"})+:1425 @app.get("/api/files/download")Content-Disposition: attachment、auth-gated、不在PUBLIC_API_PATHS中 + 测试apps/desktop/src/lib/media.remote.test.ts+tests/hermes_cli/test_web_server_files.py 60 行— 全局 remote profile REST 路由 PR #470110441b7f:apps/desktop/electron/connection-config.cjs:175 pathWithGlobalRemoteProfile(path, profile, opts)global-remote 模式 + 无每-profile override 时追加?profile=+:283导出 +apps/desktop/electron/main.cjs:66导入 +:5619 hermes:apihandler 调;后端hermes_cli/web_server.pyOAuth provider 路由按 profile scope + 新测tests/hermes_cli/test_web_oauth_dispatch.py 133 行— Electron pack 失败镜像 redownload PR #47266d1ecebc:hermes_cli/main.py:5113 _electron_dist_binary(project_root)(macElectron.app/.../Electron/winelectron.exe/linuxelectron)+:5130 _electron_dist_ok+:5144-5194 _redownload_electron_dist(project_root, env, *, mirror=None)清残 dist+path.txt+注ELECTRON_MIRROR跑node install.js+:5459-5463首次重试 +:5489-5493镜像重试用https://npmmirror.com/mirrors/electron/;redownload 仍失败时跳npm run pack+scripts/install.ps1/scripts/install.sh加Restore-ElectronDist/Test-ElectronDisthelper + 测tests/hermes_cli/test_gui_command.py +155 行—/browser限本地 gateway PR #47245a68ac0c:apps/desktop/src/lib/desktop-slash-commands.ts:33加'browser'进DesktopActionId+:107-112 /browserspecsurface:action('browser')+:152从 terminal-only blocklist 移除 +apps/desktop/src/app/types.ts:49-53新BrowserManageResponse {connected?, url?, messages?[]}+apps/desktop/src/app/session/hooks/use-prompt-actions.ts:1148-1219 browserhandler$connection.get()?.mode==='remote' → "local gateway only",否则connect|disconnect|status调requestGateway<BrowserManageResponse>('browser.manage', {action, session_id, url?});同 PRtools/skill_manager_tool.py加_validate_delete_target守 tree-escape — 外部 provider 终端断开a0ec4f5:apps/desktop/src/app/right-sidebar/store.ts:16 $terminalInjection=atom<null|string>(null)+:21-30 runInTerminal(command)置 takeover+injection +apps/desktop/src/app/right-sidebar/terminal/use-terminal-session.ts:680-700 useEffect在status==='open'时订阅 + 写${command}\r至hermesDesktop.terminal.write+ 写完清 atom +apps/desktop/src/app/settings/providers-settings.tsx:34 GroupLabelhelper +:174第二个 "Other providers" header +:218 terminalDisconnect=!canDisconnect && Boolean(provider.disconnect_command) && canRunInTerminal()+:325-339 handleTerminalDisconnect调runInTerminal(command)+apps/desktop/src/types/hermes.ts加disconnect_command;后端hermes_cli/web_server.py返 per-OSdisconnect_command— Right-sidebar explorer refresh 始终可点 PR #462449d2ec8d:apps/desktop/src/app/right-sidebar/index.tsx:134 HEADER_ACTION_LABEL_REVEAL从peer-hover/project-label改group-hover/project-header+group-focus-within/project-header+:219 RightSidebarSectionHeaderdiv 挂group/project-headerclass + 测试 +75 行index.test.tsx— ⭐display.memory_notifications三态 off/on/verbose(3 feat + 2 fix):hermes_cli/config.py:1441 DEFAULT_CONFIG["display"]加"memory_notifications":"on"+agent/agent_init.py:303 agent.memory_notifications属性 +agent/background_review.py:626 summarize_background_review_actions(notification_mode=...)解析 mode + 构 Memory➕/✏️/➖预览(add/replace 120 char、remove 60 char)+gateway/run.py:14805-14812网关解析display.memory_notifications赋 agent + 文档website/docs/user-guide/features/memory.md:248-267新## Background review notifications段 + 测tests/run_agent/test_background_review.py:390/397/404/414/425 test_memory_notifications_{off_returns_nothing,on,verbose,default_is_on,skill_patch_off_silent_verbose_shows_diff};4cf9d80verbose skill change 预览tools/skill_manager_tool.py:616 _create_skill加_change:{description}+:667 _edit_skill同(message 改"updated (full rewrite)")+:764 _patch_skill加_change:{old,new}截 200 +agent/background_review.py渲📝 Skill '{name}' patched: "old" → "new"/created:/rewritten:+ 转发_summarize_background_review_actions进run_agent.py:1411;c2c55c4全 provider 共用 strip:新规范解析器agent/skill_commands.py:58 extract_user_instruction_from_skill_message()+ 标记常量_SKILL_INVOCATION_PREFIX/_SINGLE_SKILL_MARKER/_BUNDLE_MARKER/_BUNDLE_USER_INSTRUCTION/_BUNDLE_FIRST_SKILL_BLOCK/_RUNTIME_NOTE(:44-53)+agent/memory_manager.py:435 MemoryManager._strip_skill_scaffolding静态方法 +prefetch_all(:458)/queue_prefetch_all(:485)/sync_all(:544)三调 + 新测tests/agent/test_memory_skill_scaffolding.py;e3adbb5前置plugins/memory/openviking/__init__.py:71 _derive_openviking_user_text()在queue_prefetch(:548)+sync(:588)调(c2c55c4 后改:42 from agent.skill_commands import extract_user_instruction_from_skill_message+:81调用) — ⭐ Hookssession:compress事件e76e7b5:init_agent接event_callback: Optional[Callable[[str, dict], None]]进agent/agent_init.py:198+:430赋值 +agent/conversation_compression.py:611-618触发 payload{platform, session_id, old_session_id, compression_count}+gateway/run.py:14374 _event_callback_sync桥_hooks_ref.emit(event_type, context)经asyncio.run_coroutine_threadsafe+:14747 agent.event_callback=_event_callback_sync+AIAgent.__init__在run_agent.py:388透传 kwarg;28f9247删from urllib.parse import urlparse, parse_qs, urlunparse死引 + 测tests/run_agent/test_compression_boundary_hook.py:165 TestSessionCompressEvent+:213 test_event_emitted_on_compression断compress_events+ctx["old_session_id"]/compression_count+test_no_callback_is_safe+test_callback_exception_does_not_break_compression—prompt.context_file_max_chars可配f6a42b1:hermes_cli/config.py:1110 "context_file_max_chars":20_000默认 +agent/prompt_builder.py:962 _get_context_file_max_chars()读 +:1516 _truncate_content(max_chars=None)+:1522警告"increase context_file_max_chars or trim the file!"+build_system_prompt在agent/system_prompt.py经drain_truncation_warnings()推agent._emit_status()+ 文档configuration.md:614/620/context-files.md:112/174/188/prompt-assembly.md:198;6ebc449截断警告 contextvar 隔离agent/prompt_builder.py:11 import contextvars+:984 _truncation_warnings = contextvars.ContextVar("context_file_truncation_warnings", default=None)+_record_truncation_warning(~:991)+drain_truncation_warnings()(:998)+ 测test_warnings_isolated_across_contexts—tool_progress_style → tool_progress_grouping改名(同日fc956b9引入→6373aba改名):gateway/display_config.py:35 _GLOBAL_DEFAULTS["tool_progress_grouping"]+:242 _normalise保accumulate|separate+gateway/run.py:13688解析 +:14027 can_edit = progress_grouping != "separate"+hermes_cli/config.py:1498 "tool_progress_grouping":"accumulate"+ 测tests/gateway/test_display_config.py:454-510 TestToolProgressGrouping+ 文档website/docs/user-guide/messaging/index.md:323-327— Codex pool-only rate-limit 不弹 relogin9a59ad7:新分类器hermes_cli/auth.py:3875 _codex_pool_rate_limit_status()扫auth_store["credential_pool"]["openai-codex"]找last_status="exhausted"+ code 429/quota/rate_limit +resolve_codex_runtime_credentials在:3809-3826 raise AuthError(code=CODEX_RATE_LIMITED_CODE, relogin_required=False)(不再 "missing credentials")+get_codex_auth_status()在:6003-6014返{logged_in:True, rate_limited:True, error_code:CODEX_RATE_LIMITED_CODE, reset_at}+ 常量:723 CODEX_RATE_LIMITED_CODE="codex_rate_limited"— xAI 默认grok-build-0.1bbc842d+f4ef70f:hermes_cli/models.py:113 _XAI_STATIC_FALLBACK[0]="grok-build-0.1"+:121 _XAI_TOP_MODEL="grok-build-0.1"+plugins/web/xai/provider.py:49 DEFAULT_MODEL="grok-build-0.1"+hermes_cli/model_setup_flows.py:520 _prompt_model_selectionfallback;docsplugins/web/xai/provider.py:22例 +website/docs/user-guide/features/web-search.md+zh-Hans+website/docs/guides/xai-grok-oauth.md;grok-4.3 仍在:114;聚合目录(Nous/OpenRouter)不动 — Models live+curated 合并 + curated-first + validate 兜底 PR #46857 3 commit:630b438hermes_cli/models.py:2263-2280Anthropic 分支curated = list(_PROVIDER_MODELS.get("anthropic", []))→merged = list(curated)→ 大小写 insensitivemerged_lowerset 追 live-only ID + 同 pattern 在 fetch_models 调用点~models.py:2376泛化 + 测tests/hermes_cli/test_provider_live_curated_merge.py 113 行;ee7b8a4:3585 validate_requested_model+:3947-3962"Model not in live /v1/models — check the curated catalog before rejecting"分支返{accepted:True, recognized:True, message:"Note: ... exists in the curated catalog — accepted."};658ac1d:1762 _model_in_provider_catalog(name_lower, providers)+:3952验证用纯目录 helper(无网)+:1861, 1896其他 catalog 成员检查走该 helper + 合并代码在:2263-2280保 curated 在前再追 live-only —model.base_url透传 fetch_models1b962f0:providers/base.py:162-217 fetch_models(*, api_key, base_url, timeout)解析顺序models_url → base_url → self.base_url + "/models"+hermes_cli/models.py:2374 live = _p.fetch_models(api_key=api_key, base_url=base_url or None)+ 子类 overrideplugins/model-providers/custom/__init__.py:42-52/openrouter/__init__.py:50-73+ 新测tests/providers/test_fetch_models_base_url.py 140 行;db44af0两 overlap user-defined provider 跨过滤测 22 行进tests/hermes_cli/test_inventory.py— 无 api_key 仍探针 /v1/models1039e90:hermes_cli/model_switch.py:1741-1758注释"With an api_key: always probe… Without an api_key AND no explicit models: probe anyway"+should_probe = bool(api_url) and discover and (bool(api_key) or not has_explicit_models)+fetch_api_models(api_key, api_url);7493de778 行新测tests/hermes_cli/test_user_providers_model_switch.py+scripts/release.py:420 "[email protected]":"chimpera"— 自定义 provider dedup 保留b7fa62c:hermes_cli/inventory.py:175-195先扫is_user_defined行收user_models然后主循环if row.get("is_user_defined"): continue才调_is_aggregator(slug)+ 回归测tests/hermes_cli/test_inventory.py— GLM-5.2 入 OpenRouter+Nousb2da39aPR #47391:hermes_cli/models.py:64 ("z-ai/glm-5.2","")进OPENROUTER_MODELS+:187 "z-ai/glm-5.2"进_PROVIDER_MODELS["nous"](在 glm-5.1 之前)+:263 "glm-5.2"进 zai picker + 重生成website/static/api/model-catalog.json— auxiliary auto 任务沿主 fallback chain PR #472354858942:agent/auxiliary_client.py:3106 _fallback_entry_api_key+:3117 _resolve_fallback_entry(... ←resolve_provider_client)+:3135 _try_main_fallback_chain读get_fallback_chain(load_config())迭代跳 failed/main/unhealthy +_resolve_auto接task参 +:3320-3333在 Step 2 插用户 fallback +resolve_provider_client(... task=None):3459— Telegram 富文本默认开 + 流式 final 仍 rich PR #46890a6364bf:gateway/platforms/telegram.py:428 _rich_messages_enabled默认翻True+:984 _needs_rich_rendering():富专用于 table/task-list/<details>/block-math +:1006 _rich_eligible()共享核心去expect_edits门 +:1257 async def _try_edit_rich(...)editMessageText+rich_message 路 +:2680-2681 if finalize and self._rich_eligible(content): rich_result = await self._try_edit_rich(...)— Rich-reply 跨重启 send-time 索引恢复01ae9b8+8ed16a7:新文件gateway/rich_sent_store.py:23 _MAX_ENTRIES=1000+:36 def record(...)+:68 def lookup(...)+ JSON store~/.hermes/state/rich_sent_index.json+gateway/platforms/telegram.py:1248-1249发送后 record(chat_id, message_id)→content+:6718-6720reply 时 text+caption 都空 →reply_to_text=rich_sent_store.lookup(str(chat.id), reply_to_id)+ 107 行新测 4 个(test_rich_reply_records_and_recovers_text/_lookup_miss_leaves_text_none/_native_quote_wins_over_lookup/_caption_wins_over_lookup)+3f80bca scripts/release.py:94 "[email protected]":"x1erra"— Slack/debugvia/hermesPR #472484d470b3:hermes_cli/commands.py:1057 _SLACK_VIA_HERMES_ONLY=frozenset({"credits","debug"})加debug(与 Telegram 对齐)+ check 点:1107— Mattermost notify-only flat-fallback16fc717+5a0e0d3:gateway/platforms/base.py:80 _mark_notify_metadata(metadata)浅克隆置notify=True应用:3899/:4005/:4055/:4282 _final_thread_metadata+plugins/platforms/mattermost/adapter.py:155 async def _thread_root_for_send从 reply_to/metadata 解析 root +:170 def _last_post_failure_is_broken_thread_root400/404+body 标识 +:181 async def _post_preserving_thread仅metadata.get("notify")且 broken-root 时 flat-fallback + 接:352/:534/:575/:663text/image/file/document 发送 — WhatsApp/emailsend_image(metadata=)e65d74b:gateway/platforms/whatsapp.py:843-862 async def send_image(... metadata: Optional[Dict[str, Any]] = None)+:862 super().send_image(..., metadata)fallback +gateway/platforms/email.py:675-683同 + 新契约测tests/gateway/test_media_metadata_contract.py 80 行+_accepts_metadata()helper 扫所有 adapter — PhotonspectrumProjectId收敛5b3fa26:plugins/platforms/photon/auth.py:15-17文档:post-unifyproject.id==spectrumProjectId+:168 def load_dashboard_project_id()优先spectrum_project_id而非 legacydashboard_project_id+:185entry-key fallback 链 +get_project()删 +create_project不再发spectrum: true切换始终 provisioned — ⭐ Honcho 网关身份树 gateway-gated 替换部署形状 PR #44431 merged2b34e8:bb5cb32 _migrate_pin_peer_name()在plugins/memory/honcho/cli.py:380-391poppinPeerName写pinUserPeer+ 克隆路径cli.py:51/56包 pinUserPeer + legacy 迁移;d7dfeed _gateway_platforms()在cli.py:394-408懒导gateway.config.load_gateway_config返已连平台或 None +cli.py:681-707无网关时 auto-skip 否则菜单[1] just me / [2] me + others / [3] only others / [s] skip / [e] edit raw keys+cli.py:724-735orphan-guard:un-pin 会孤悬 peerName 历史时重提 + 各分支cli.py:741/:754-758/:766-769scrub 后写pinUserPeer/userPeerAliases/runtimePeerPrefix;99feb03docsplugins/memory/honcho/README.md:140-144pinUserPeer/userPeerAliases/runtimePeerPrefix 表行 + pinPeerName 降 deprecated;23a7458website/docs/user-guide/features/honcho.md:160"Gateway Identity Mapping" 节 +:174解析器顺序 +:177orphan 警告 +:181deprecated 别名;2708c33+1544813隐私 alice + Telegram UID7654321跨 README/cli.py/测试/docs;后续6dde7d4docswebsite/docs/user-guide/features/memory-providers.md:98pinUserPeer 行 +:211"every non-agent gateway user collapses to peerName" 进 Gateway Identity Mapping 子段;c7513dfplugins/memory/honcho/README.md:140"every gateway runtime user collapses…" reframe 为 non-agent + pin-overrides-aliases +cli.py:458菜单提示词改 +honcho.md:168"every non-agent gateway user collapses to your peer. Pin overrides all aliases" 交叉引用session.py:335解析器优先级 — Skills 跳支持目录9137b86:agent/skill_utils.py:50 SKILL_SUPPORT_DIRS=frozenset(("references","templates","assets","scripts"))+:73 def is_skill_support_path(path)+:68 should_exclude_skill_pathORis_skill_support_path与既有EXCLUDED_SKILL_DIRS+tools/skills_tool.py:84/1027/1032/1043/1050/1077接_is_skill_support_path守skill_view/发现遍历 — shop-app → CLI 化 shop skill v1.0.1:5094325optional-skills/productivity/shop/SKILL.md:2-7 name:shop, version:1.0.1, prerequisites.commands:[curl,node]引catalog-mcp.md 236 行/direct-api.md 278 行/safety.md 36 行/legal.md,旧productivity/shop-app/SKILL.md删;d7668aadescription ≤60 char +:5 author: Joe Rinaldi Johnson (joerj123), Hermes Agent;e236bb8docs regen 删website/docs/optional/productivity/productivity-shop-app.md 354 行+ 新productivity-shop.md 238 行+ 更website/docs/reference/optional-skills-catalog.md+website/sidebars.ts;cf52370 scripts/release.py:59 "[email protected]":"joerj123"— TUI session-create no-race 测试隔离 PR #472302483200:tests/test_tui_gateway_server.py:4901-4942 test_session_create_no_race_keeps_worker_alive快照server._sessions→_saved_sessions+server._sessions.clear()+finally还原 +agent_ready.wait(timeout=2.0→10.0)并断言built返回值(之前默吞 timeout)+ 服务端引用点server.py:1011'replaced'check — 5 条 AUTHOR_MAP salvage(全进scripts/release.pyPython dict 而非tools/release/AUTHOR_MAP.json):3f80bca :94 x1erra/7493de7 :420 chimpera/1ac76a9 :52 MrDiamondBallz/db01910 :419 cyb0rgk1tty/cf52370 :59 joerj123/925b0d1 :95 zimigit2020— 验证基线/tmp/hermes-agentclone @d1ecebc+ 4 个并行 research agent 实证(A: Desktop UI 17 commit / B: Memory/Display/Gateway/Hooks/Prompt/Auth 15 commit / C: Models/xAI/Skills/Honcho 18 commit / D: Messaging Telegram/Slack/Mattermost/Photon/WhatsApp/AUTHOR_MAP 13 commit) -
2026-06-15-update: 77 commits 单日同步(hermes-agent
2a14e8957 → cffd6e3c8,仍 v0.16.0 未发新版;约 44 fix / 7 test / 4 feat / 4 chore / 3 docs / 2 🐛 fix / 2 refactor / 1 revert / 1 redact / 1 nix / 1 ci / 1 change / 1 unscoped / 5 merge;~31.5h 跨夜单日窗口;164 文件 +18569/−17867)— ⭐ feat — 异步后台子代理delegate_task(background=true)c66ecf0bc (#40946)(新文件tools/async_delegation.py 386 行—:96-97 _records注册表 +:124 active_count()+:152 dispatch_async_delegation()+:215-226lock 内原子容量检查 +:266 _finalize完成回调推type="async_delegation"event 进process_registry.completion_queue+:337 list_async_delegations()+:362 interrupt_all();tools/delegate_tool.py:2053 background:bool参 +:2090-2095batch+background 互斥拒 +:2243-2317父线程取get_current_session_key()+:2261-2270从parent_agent._active_children解绑让父中断/缓存 evict//new不杀后台 +:3037-3054schema +:3099注册;tools/process_registry.py:1549-1616 _format_async_delegation()渲[ASYNC DELEGATION COMPLETE — <id>]自包含块 +:1619 format_process_notification加evt_type=="async_delegation"路由;gateway/run.py:5393启动 schedule_async_delegation_watcher+:12337-123822s 轮询 + 非 async event 立即 requeue +_enrich_async_delegation_routing解析session_key+_inject_watch_notification;cli.py:981-982shutdowninterrupt_all+cli_commands_mixin.py:227-258/stop+:260-295/agents+tui_gateway/server.py:5598-5600TUI 按delegation_iddedup +hermes_cli/config.py:1778 delegation.max_async_children=3+ 测tests/tools/test_async_delegation.py 473 行 15 测试)— feat — Hindsight observation_scopes 可配置a376ca008(plugins/memory/hindsight/__init__.py:21文档HINDSIGHT_RETAIN_OBSERVATION_SCOPESenv +:330 _load_config读 +:381 _OBSERVATION_SCOPE_KEYWORDS={"per_tag","combined","all_combinations"}+:384 _normalize_observation_scopes()接受 keyword/JSON list-of-lists/扁平 tag list +:1240-1243/:1498-1499retain kwargs 注入 +:1614-1620tool retain 路径切client.aretain → client.aretain_batch因前者不接此参)— feat —/status显 model+contextead38107a(gateway/slash_commands.py:395-509 _handle_status_command()优先status_agent.model/provider/context_compressor.last_prompt_tokens/.context_length→ SessionDB row → user config + 新 locale 键gateway.status.model/model_provider/context/context_used+ 17 locale 同步 + 73 行测试)— feat — Display 显delegate_taskgoals5035fa902(agent/display.py:180 _delegate_task_goal_parts+:212-222 build_tool_preview渲"{count} tasks: Goal A | Goal B | Goal C"+:1057-1060 _get_cute_tool_message_impl渲"3x: Goal A | Goal B")— Auth — xAI OAuth 跨 profile 解析 + write-through global root + access skew 120→3600s(5 commit PR #43589 salvage):f1d6f0436hermes_cli/auth.py:3899 _xai_oauth_state_from_store()扫credential_pool["xai-oauth"]找含access_token+refresh_token条目 +:3937 _xai_oauth_state_has_usable_tokens()守 +:3946-3956 _read_xai_oauth_tokens()profile 缺 → 回退 global root;497352bc4:1087 _save_auth_store加target_path参 +:3996 _profile_has_own_xai_oauth_state()+:4007 _write_through_xai_oauth_to_global_root()守_global_auth_file_path() is None与 pytest 安全带:4030+:4061-4079 _save_xai_oauth_tokens在_auth_store_lock()内 write-through;febdddb41:111 XAI_ACCESS_TOKEN_REFRESH_SKEW_SECONDS=3600(原 120)适配 6h xAI access token;1227007ae scripts/release.py:1557AUTHOR_MAP[email protected]=capt-marbles;8844e091cmerge — MCP — fail-fast noninteractive OAuthdcc321695(tools/mcp_oauth.py:756-763 build_oauth_auth()现raise OAuthNonInteractiveError(...)在not _is_interactive() and not storage.has_cached_tokens()时,消息含hermes mcp login {server_name}hint +tools/mcp_oauth_manager.py:411/427-434 MCPOAuthManager镜像)— Security — Disk-cleanup protected walks 显式 frozenset + 后序 DFS(3 commit):c1a70a543/40699c329/a688d2a1bplugins/disk-cleanup/disk_cleanup.py:147 _EMPTY_DIR_PROTECTED_TOP_LEVEL=frozenset({"logs","memories","sessions","cron","cronjobs","cache","skills","plugins","disk-cleanup","optional-skills","hermes-agent","backups","profiles",".worktrees"})+:153 _EMPTY_DIR_SWEEP_PRUNE_DIRS=frozenset({".git","node_modules","venv",".venv","site-packages","__pycache__"})+:364-402 quick()空目录 sweep 重写sweep_stack: List[Tuple[Path, bool]]显式后序 DFS(替rglob("*")全遍历)防 gateway event loop 卡分钟级 — Privacy — API debug dump 全字段 redactad58dd51a + aab2e99ba(agent/agent_runtime_helpers.py:1228-1231 dump_api_request_debug()经redact_sensitive_text(force=True)+atomic_json_write+:1236 HERMES_DUMP_REQUEST_STDOUT也走 redacted +agent/redact.py:107 _PREFIX_PATTERNS新r"ntn_[A-Za-z0-9]{10,}"(Notion internal integration token)+ dump 现在无条件触发 API 错误)— Gateway scoped lock 第三 stale 分支ec05d2bc3(gateway/status.py:646-660 acquire_scoped_lock()新分支:PID + start_time 都非 None 且相等但not _looks_like_gateway_process(existing_pid)时调_read_process_cmdline检 cmdline 可读 →stale=True,防 Linux/systemd 启动期 PID+jiffystart_time重用让 cron/nginx/sshd 冒名 gateway) — Bedrockboto3>=1.34.59软守2cddc9c89(agent/bedrock_adapter.py:61 _MIN_BOTO3_VERSION=(1,34,59)+:64-88 _require_boto3()解析boto3.__version__三 int tuple,低版RuntimeError含升级 hint,parse 失败不阻塞 — 修 Ubuntu 24.04 系统boto3==1.34.46shadow venv pin 致converse_stream裸AttributeError) — s6 / Supervisor 5 修硬化:40d7c264f #46266hermes_cli/profiles.py:1271 _maybe_register_gateway_service()调register_profile_gateway(start_now=False)+service_manager.py:964-965写(tmp_dir / "down").touch()marker;61ee2dbfd #46291service_manager.py:756 _render_log_run加chown hermes:hermes "$HERMES_HOME/logs/gateways"非递归 +docker/stage2-hook.sh:319cont-init 预创父;b77096726 #46292:359 _write_gateway_desired_state(name, desired_state)+ 三 mutator (:821/:873/:883) 写 +container_boot.py:258 _read_desired_state优先desired_state字段防 transient 抹运维意图;c2b7669ad #46289:758加rm -f "$log_dir/lock"在 chown 后 s6-log exec 前清陈旧 lockfile;95715dcb0 #46483hermes_cli/main.py:467 _apply_profile_override守if profile_name is None and not os.environ.get("HERMES_S6_SUPERVISED_CHILD")让 supervisedgateway-default跳过 stickyactive_profile回退 — Container / Dashboard 4 修:4eb0ff639 #46290service_manager.py:118gate 从is_container() and _s6_running()改为裸_s6_running()修 Fly Firecracker microVM 上 s6 dispatch 路径全 inert;aca11c227 #46293container_boot.py:210 _strip_container_argv_prefix()+:237 _is_dashboard_container()+:439 main()在 reconcile 前跳过;80f8ffc74 #46487hermes_cli/main.py:10785-10790 cmd_dashboard()rerouteenv["HERMES_HOME"]=str(get_default_hermes_root())钉机器根防$HOME/.hermesfallback;f79551378 #45120scripts/install.ps1:1431-1442重建 venv 前taskkill /F /T /IM hermes.exe /FI "PID ne $myPid"+ 800ms sleep 释_bcrypt.pyd锁 — Tools — 文件工具尊重 session cwd(PR #46552 salvage 5 commit):d6a8d9dca_authoritative_workspace_root加新 "registered task/session cwd override" 步 +ddf7c7af8terminal_tool.py:1037-1052 resolve_task_overrides(task_id)单 helper 路由file_tools._registered_task_cwd_override与_get_file_ops+b0c99c12ddocstring 列四步顺序 +8fce54499file_tools.py:99-113 _sentinel_free_abs_cwd(raw)抽 sentinel + expanduser + isabs validation 尾段(用_TERMINAL_CWD_SENTINELSfrozenset:96)+6cb88a087merge — Cron —jobs.json跨进程 fcntl/msvcrt 锁e5b4cf7be + 733472952(cron/jobs.py:58-59 _jobs_file_lock=threading.RLock()+_jobs_lock_state=threading.local()重入追踪 +:70 _jobs_lock()contextmanager Unixfcntl.flock(LOCK_EX)/ Windowsmsvcrt.locking(LK_LOCK,1)跨进程 +:89-129depth-count 重入 +:554 _save_jobs_unlocked()private + 全 mutator 包with _jobs_lock():(create/update/remove/mark_job_run/advance_next_run/get_due_jobs/rewrite_skill_refs)+agent/curator_backup.py:459/466 _restore_cron_skill_links走_jobs_lock)— Process — completion 五态 + termination_sourcebe7c919bf #46659(tools/process_registry.py:103-104 ProcessSession.completion_reason: str = "exited"枚举exited|killed|lost|failed_start|already_exited+termination_source: str = ""枚举process.kill|kill_all|backend_lost|failed_start+kill_process(*, source="process.kill")+ 全 payload 含两字段 +:1619 format_process_notification按completion_reason选_status文本 + exit code -15/143 append", SIGTERM"+gateway/run.py:12337agent-notify 合成走format_process_notification({...}))— Messaging — WhatsApp group JID 路由 targetea49a7963 + 0d82060c7(tools/send_message_tool.py:47-49 _WHATSAPP_JID_RE匹配@g.us|s.whatsapp.net|lid|broadcast|newsletter+:520-525 _parse_target_refwhatsapp 分支返(target_ref, None, True)+gateway/channel_directory.py:26 CHANNEL_ALIASES_PATH=get_hermes_home()/"channel_aliases.json"+:29 _load_channel_aliases+:40 _apply_channel_aliases(platforms)在 rebuild 与 load 时都应用 +0d82060c7加入备份) — Desktop cluster:eae3836eb + f02484feb + 30377e108 + 45e2f4fdc@assistant-ui/store0.2.13 pin(package.json:38-41 overrides+.github/workflows/typecheck.yml:33-42新desktop-buildjob 跑npm run --prefix apps/desktop build让 vite break 在 CI 暴露 +nix/lib.nix:24 npmDepsHash="sha256-m9cjbjzi4SaFCjODfdrawS5e+1ag+MpRn528/upSNqo=");f3b32e9f5 + c23a2eec1 + c33e0457d #46836macOS Electron pack 重命名前补缺(apps/desktop/package.json:23 "prebuilder": ".../patch-electron-builder-mac-binary.cjs"+:138 "electronDist": "../../node_modules/electron/dist"+ 新脚本 60 行 darwin-only patchapp-builder-lib/out/electron/electronMac.js doRename()在 rename →Hermes前从 runtime dist 复缺失的Contents/MacOS/Electron修ENOENT);fbabf438a + bee13817fapps/desktop/src/store/profile.ts:213 ensureGatewayProfile()在 gateway swap 后 resync$connection,让 remote pool profile 激活为后台后 image 附件走image.attach_bytes而非路径image.attach;0bbf325a8 #46665dashboard 聊天侧栏 model card 经session.create传 management profile;ed20f5ed0 #42241/#46796tui_gateway/server.py:1957 _apply_model_switch(parsed_flags=...)+:7013-7030 config.set预解析显式--provider时绕开 broken-default agent build + Rendereruse-model-controls.ts发config.set替slash.exec;368fcf1ff #46772新apps/desktop/electron/windows-user-env.cjsparsereg query+main.cjs:243-265 resolveHermesHome()Windows 上先读 HKCU\Environment 注册表;8fe334b05 #44159apps/desktop/src/components/pane-shell/pane-shell.tsx:88 HOVER_REVEAL_EDGE_GUTTER='calc(0.5rem + 2px)';ae433634dapps/bootstrap-installer/tsconfig.json + shared/tsconfig.jsonES2023 — Install / Deps:a4ee1f223 + 98205da00 + 1db8f7ea8 + 39f479cba #46085scripts/install.sh:427-433 configure_managed_node_npm_prefix()+scripts/lib/node-bootstrap.sh:65-71 _nb_configure_npm_prefix()写prefix=$(dirname link_dir)进$HERMES_HOME/node/etc/npmrc让npm install -g落 on-PATH 命令链接目录;0bbff1fc7 #46744pyproject.toml:104 "websockets==15.0.1"入核 +:138 dev=[..., "setuptools==81.0.0"]从 82.0.1 降配torch>=2.11 caps setuptools<82;5f6be7f31 #46764:182 teams=["microsoft-teams-apps==2.0.13.4","aiohttp==3.13.4"]optional extra +tools/lazy_deps.py:159 "platform.teams"lazy-install +plugins/platforms/teams/adapter.py check_teams_requirements()调ensure_and_bind('platform.teams',...)— CI:9eb0bcd60删.github/workflows/nix-lockfile-fix.yml + nix.yml;29c698559nix/lib.nix:24 npmDepsHash刷新;92a456f71esbuild/vite 锁回升(vite ^8.0.16/esbuild ^0.28.1)+hermes_cli/main.pyautostash 防 update 时丢本地编辑;30377e108Desktop renderer build on PRs(见上@assistant-ui/store集群)— Discord — slash 100 cap PR #46078:5e851bc6b + 8f4a718f9 + cffd6e3c8(merge)plugins/platforms/discord/adapter.py:39 _DISCORD_MAX_APP_COMMANDS=100+:3530 slot_cap=_DISCORD_MAX_APP_COMMANDS-1保/skillgroup + skip 逻辑两循环 +:3613-3620一条警告 + 200 commands 回归测 — Web —revert(web)Parallel keyless search 撤回f3fe99863 #46350(plugins/web/parallel/provider.py净 -345 + 删两测试文件 +tools/web_tools.py-234 +pyproject.tomlSDK pin 撤)— Misc:a829e04d6 #46345 hermes_cli/profiles.py:458-486 _migrate_profile_config_if_outdated(profile_dir)用set_hermes_home_overridescopecheck_config_version()/migrate_config(interactive=False, quiet=True)到新 profile + 清 override 防伪 v0→latest 警告 +b2a476646/2a08b8c86 hermes_cli/dump.py:255-272env override ≠ config 时输出"{env_backend} (TERMINAL_ENV overrides ...)"+2f2e3616b tools/browser_tool.py:1180-1201 _get_session_inactivity_timeout()读browser.inactivity_timeout+5b2604df9 hermes_state.py:1133-1135v10 trigram 回填在 v11 FTS rebuild 前跳 +9df1a1a8d hermes_cli/doctor.py:791-802 providers_accepting_vendor_slugs加"nvidia"+60cc42e38 hermes_cli/inventory.py:160-188user-defined ↔ aggregator 模型去重 +ba3883cd1 + 49e743985MiniMax M3 reasoning extra_body 入plugins/model-providers/minimax/__init__.py MiniMaxProfile.extra_body_for()只在api.minimax.ioAND{"minimax-m3","minimax/minimax-m3"}两 predicate 都真时发{"reasoning_split":True}+975b9f0a5 #46646CONTRIBUTING.md 加 standard installer 节 +f7c1cbe66 #46795桌面下载链接到站点根 + 4 条 AUTHOR_MAP(f79b109f4 0xneobyte/c17469cb1 Veritas-7/1227007ae capt-marbles/c23a2eec1 #38673 salvaged)— 验证基线/tmp/hermes-agentclone @cffd6e3c8+ 4 个并行 research agent 实证 -
2026-06-14-update: 83 commits 单日同步(hermes-agent
0a865e5 → 2a14e8957,仍 v0.16.0 未发新版;约 54 fix / 6 perf / 6 feat / 5 test / 3 chore / 1 refactor / 1 docs / 1 style / 1 unscoped / 5 merge;~23.5h 单日窗口;166 文件 +8907/−692)— SSL CA bundle fail-fast guarda218a0f15 主轴 + 5 修新建agent/ssl_guard.py 94 行+agent/errors.py SSLConfigurationError+ escape hatchHERMES_SKIP_SSL_GUARD+hermes_cli/doctor.py:316-318"SSL / CA Certificates" 节 + 调用点上移到agent/agent_init.py:903-905 _create_openai_clientsetup 内 — MCP stdio config exfil-shape 拦截:972a9885e (#46083) + a27d7e68c (#46112)新hermes_cli/mcp_security.py 96 行双门匹配_SHELL_INTERPRETERSfrozenset +_EGRESS_PATTERNcurl|wget|nc|ncat|socat|/dev/tcp/|Invoke-WebRequest+_EXFIL_HINT_PATTERN.env|--data-binary|-X POST|<file;validate_mcp_server_entry()与_filter_suspicious_mcp_servers()在register_mcp_servers任何 stdio spawn 前调;+4936a49a0MCP loop preservation_stop_mcp_loop(only_if_idle=True)不撕 live agent loop — Approval 敏感文件三连:da28d5d11 + abd69b811 + 2b67e96aetools/approval.py:455DANGEROUS_PATTERNS 守cp/mv/install进~/.ssh/.netrc/.bashrc+:577 _rewrite_resolved_user_home()折叠绝对 HOME →~/+:208 _USER_SENSITIVE_WRITE_TARGET守sed -i / perl|ruby -iin-place 编辑;+81e42335a (#45947)file-safety 松绑:agent/file_safety.py:49-53删.bashrc/.zshrc/.profile,HEAD 只硬阻 SSH/.env/oauth/credential — Read 工具 — 原生抽取.ipynb/.docx/.xlsx817f39231 (#37082)新tools/read_extract.py 248 行stdlib-only(json/zipfile/xml.etree,零依赖);EXTRACTABLE_EXTENSIONS = frozenset({".ipynb", ".docx", ".xlsx"});xlsx 50MB / 5000 行 / 256 列上限;集成tools/file_tools.py:763-808在 binary-guard 前置 — Desktop 原生 OS 通知 + 完成音效cdf30a7ac PR#45866b4ba3f5e3新apps/desktop/src/lib/completion-sound.ts 519 行14 Web Audio 合成预设(无音频文件)+630a4ef03新apps/desktop/src/store/native-notifications.ts 203 行5 类型(approval/input/turnDone/turnError/backgroundDone)+ 1s 节流 +document.hidden||!document.hasFocus()门 +apps/desktop/electron/main.cjs:5611-5635 hermes:notifyIPC + Approve/Reject action buttons +b0288ae9b完成音 picker 迁到notifications-settings.tsx 98 行— Desktop polish526a1e24b PR#460294 连:9cbb91abd #46014clarify-tool UX +715b69172Compaction "Summarizing thread" 汇总指示(agent/conversation_compression.py:43-49 COMPACTION_STATUS_MARKER→ Gatewaykind="compacting"→ Desktopcompaction.tsstore)+1eb13744b滚屏保活 +49dd91d68 #46030CopyButtoncontext-menu-itemvariant — Desktop misc 4 修:08d89e7ab #46197思考 shimmer 仅在 disclosure labelthread.tsx:588-594+6b76284c7 #45853离屏审批跳底按钮 surface "Approval needed" 经requestScrollToBottom()+0428945b5 #46073apps/desktop/electron/backend-env.cjs:70-78 normalizeHermesHomeRoot()剥/profiles/<name>+89bdb1e54hermes_cli/web_server.py:10659/10709 read_text(encoding="utf-8")— Agent — 模型 refusal 不重试改直透 content_filterc8ad2ca99 PR#460134 连:bb46bf8ceAnthropic + Chat Completions transport 把 refusal 映射finish_reason="content_filter"+12c84d6c7只在 refusal 是唯一 payload 时算终止 +10bd01972共享_content_policy_blocked_result()builderagent/conversation_loop.py:411-433+_CONTENT_POLICY_RECOVERY_HINT常量:405-408提hermes fallback add— Codex reasoning thinking-only069bfd654 + 1d584a301run_agent.py:905-936 _disable_codex_reasoning_replay()弹codex_reasoning_items+:3278-3343 _is_thinking_only_assistant()把item.type=="reasoning"列表项当 thinking-only — Gateway 中断 replay 清理5191c1c2c + 2c174bce2gateway/run.py:767-776 _is_interrupted_tool_result()识 exit_code 130/-1 +:779-822 _strip_interrupted_tool_tails()删被中断 assistant→tool 段 +:825-837 _AUTO_CONTINUE_NOTE_PREFIX="[System note: Your previous turn"+ 保新输入 — Gateway 启动 auto-resume 串行10bad2faf #46074gateway/run.py:4642-4699新_queue_startup_restore_event() / _drain_startup_restore_queue() / _finish_startup_restore()— Gateway repaired-turn 持久2b4873f7f #46071run_agent.py:1548-1641改_flushed_db_message_ids身份追踪取代位置切片防repair_message_sequence缩短历史时丢新尾 — Gateway intentional silence tokens293c04fef + 0e22bf643 #46105gateway/response_filters.py:13 SILENT_REPLY_TOKEN="NO_REPLY"+:18-23 LIVE_GATEWAY_SILENT_MARKERS=frozenset({"[SILENT]","SILENT","NO_REPLY","NO REPLY"})+:30-44 is_intentional_silence_response()精确匹配 ≤64 字符 + 全响应等于 token 才静默 — Gateway shell-supervisor guard7433d5f0e + 143679305hermes_cli/gateway.py:3798-3818 _running_under_gateway_supervisor()检INVOCATION_ID/HERMES_S6_SUPERVISED_CHILD/XPC_SERVICE_NAME!="0"+:3821-3858 _guard_supervised_gateway_conflict()+:3861-3880PID 文件 scoping — Gateway 回复消息媒体附件efbe1635d #46107gateway/platforms/telegram.py:5563-5606 _cache_replied_media()从msg.reply_to_message下载 + cache + 文本附[Replied-to <kind> '<name>' saved at: <path>]— Profile / HOME 隔离b00060ce5 + 723c2331b + d842155da + 9f33d673ehermes_constants.py:362-395 get_subprocess_home()看TERMINAL_HOME_MODE=auto|real|profile+:398-405 apply_subprocess_home_env()设HERMES_REAL_HOME与HOME+ TUItui_gateway/server.py:1222-1236 _set_session_cwd()走 profile-scoped_session_db(session)helper — Skills cluster6c34088a1 PR#46237 + fc2b8b3d3 PR#462365 commit:7f245b003 #45966gateway/run.py:14376-14414跨进程缓存失效经 message_count 对比 +3bc4a2ff7:12801-12850 _refresh_agent_cache_message_count()每轮 rebase +7bbe7024c #46201全局/平台 disabled 并集 +ce19fdb7c解析点全跟进 +4e6d05c6a #46149agent/skill_utils.py:275 _RAW_CONFIG_CACHEmtime+size keyed — Skills bundled-update 备份崩溃安全3581131e7 + 9a2b97632tools/skills_sync.py:509-525/590-595/608-625三段孤儿.bak复原 / 清陈旧.bak防 move 失败 / restore 前清部分dest— Telegram rich messages 24h 内两次翻转:57c2a55be端点 404 退路 →12682d96b feat 配置 opt-out 还原→9459057d7 #46102math crash 守 →a1f51feb7 #46206(HEAD)默 False +prefers_fresh_final_streaming()无条件返 False(gateway/platforms/telegram.py:426 _coerce_bool_extra("rich_messages", False)) — Email SMTP_SSL port 465 + IPv4 兜底04d4471d7 + cf7d5932fgateway/platforms/email.py:354-394 _connect_smtp()合并 4 call site;port 465 走smtp_ssl_cls(...),否则SMTP+starttls;超时/连接错 retry_connect(ipv4_only=True);:110 _IPv4SMTP_SSL用AF_INET/SOCK_STREAM— Models — ZAI GLM-5.2 1M 上下文bff78a34d+ Kimi K2.7 Code 原生 picker2a14e8957 #46309agent/model_metadata.py:270 "glm-5.2": 1_048_576(needle-in-haystack 789K 实证)+hermes_cli/models.py:60/181/260/285全链路 +provider_model_ids()对{"kimi-coding","kimi-coding-cn"}合并 curated 与 live 保留 K2.7-code — OpenRouter 元数据磁盘缓存13a1bd0f8 #46114agent/model_metadata.py:116-119 cache/openrouter_model_metadata.json+ 紧凑 JSONatomic_json_write(indent=0)+:110 _MODEL_CACHE_TTL=36001 小时 + 内存→磁盘→live/api/v1/models三级回退 — Perf wave:afc861550 #46065Webhook 增量 prune(Deque懒 O(stale) +_RATE_WINDOW_SECONDS=60.0)+110687914 #45831tools/process_registry.py:132 _completion_event: threading.Event+:1098-1127 wait()替sleep(1)+8f278403d #45948_rpc_server_loop(stop_event)settimeout5→0.05+5105c3651 #46079api-server_normalize_chat_contentO(n²)→O(n) +4b5ba112a #45979agent/conversation_loop.py:74-100 _image_error_max_dimension()解析 provider 错文本 clamp[512, 8000]— Misc:bf8effad0 #43852 utils.py:63 atomic_replace()跨设备 EXDEV/EBUSY →copyfile+copystat+fsync+unlink兜底 +85e6232a0Anthropic proxy/v1支持(build_anthropic_client()剥尾 +_endpoint_speaks_anthropic_messages()识/anthropic/v1)+8d5d36d79 #28479 model_tools.py:1115-1125透session_id到registry.dispatch+e986e3fc6 + 1b16c4817Provider OAuth 账号移除DELETE /api/providers/oauth/{provider_id}守_require_token+_oauth_provider_disconnect_hint+1fa761f8d #36142Search 超时保部分结果limit_reason="search_timeout"+288f7026eWeixin "Personal" 重标 +d76a58bd1sudo profile system install + 3 条 AUTHOR_MAP — 验证基线/tmp/hermes-agentclone @2a14e8957+ 4 个并行 research agent 实证 -
2026-06-13-update: 391 commits 跨日同步(hermes-agent
6c752ca3a → 0a865e5,仍 v0.16.0 未发新版;约 211 fix / 39 chore / 35 feat / 21 test / 18 refactor / 10 docs / 9 perf / 30 merge;48h 双日窗口;含两批 historic salvage 2026-05-1905-23 ≈167 commit 在本期并入;446 文件 +31366/−4724)— Desktop UX 大改d62979a (#44630)(composer status stackapps/desktop/src/store/composer-status.ts 257 行合并$subagentsBySession/$backgroundStatusBySession/$todosBySession+ 实时 subagent 窗口openSessionInNewWindow+ 用户气泡<ActionBarPrimitive.Edit>流式中可编辑thread.tsx:976+BrailleSpinner → GlyphSpinner改名)+ Stick-to-bottombbf020e (#45263)(use-stick-to-bottom: ^1.1.6+76b9386删thread-virtualizer.tsx 481 行改thread-list.tsx 307 行 useStickToBottom+scroll-to-bottom-button.tsx 59 行+withSessionBusyRetry包所有prompt.submit)+ Perf 三连492c402 (#45343)(7c226cc ChatRuntimeBoundary隔$messages订阅 +edc36f3 remend-tail.ts 108 行LRUBLOCK_CACHE_MAX+REVEAL_MIN_COMMIT_MS = 33+3cf7d43warm AudioContext 省 850ms)+ Worktree-aware 侧栏e906726(git-worktrees.cjs 174 行+use-worktree-info.ts 68 行+workspace-groups.ts 326 行+WorkspaceHeader/ReorderableList抽取) — WhatsApp Business Cloud API 新平台984e6cb(gateway/platforms/whatsapp_cloud.py 1956 行+whatsapp_common.py 367 行+setup_whatsapp_cloud.py 530 行;HMAC webhook + wamid dedup + 原生按钮 + opus 语音;Platform.WHATSAPP_CLOUD在gateway/run.py:6229-6239)— Photon iMessage spectrum-ts 3.0→3.1573c4e6/9bfff6e(pkg:15 "spectrum-ts": "3.1.0"+markdown()builder 经PHOTON_MARKDOWN+/react//unreactsidecar 端点)+156f4fb add_reaction/remove_reactionAPI +05470aa action='unreact' send_message + tools/send_message_tool.py:173-177+0a963d8 hermes photon telemetryCLI 切换 — Telegram 富文本永远 ona59d5e3 (#45584)+7c0605b流式 final 仍富文本(prefers_fresh_final_streaming+RICH_MESSAGE_MAX_CHARS=32768) — 安全 fail-closed wave:fc46354 fix(security)own-policy adapter 无 allowlist 时 fail-closed(WhatsApp/WeCom/Weixin/QQBot/Yuanbao)gateway/authz_mixin.py:90-150,271-301+3380563 /api/status受门时删hermes_home/config_path/env_path/gateway_pid/gateway_health_urlweb_server.py:1679-1681+c6a992e _host_derived_api_key()注册标签链尾兜底runtime_provider.py:103+5908822/9514ddbAPI key 不漏到非权威端点 +4ead464 secure_parent_dir拒 chmod/和len(parts) < 3+5edb346profile 下 write-deny<root>/.envagent/file_safety.py— Gateway auto-resume 重复 agent 防御6e2fd95 + 63097ee(_schedule_resume_pending_sessions在asyncio.create_task前占_AGENT_PENDING_SENTINEL槽gateway/run.py:4498-4602+ 全路径回归test_restart_resume_pending.py)+ JSONL 抄写降级 4 commit(b4b118c/351fdcc/024a8e3/1d27be0state.db唯一存储;磁盘既有.jsonl不动) + Kanban 6 修(34120a0 sticky block+7bcdced respawn defer blocker_auth+88ee58f stale 不计 failure+7552e0f/7c622b6idx 后置 migration +cb125c2 (#45590)worker toolsets 钉 profile) — Billing/credits7ba5df0 (#44776)(agent/account_usage.py:342 CreditsView+cli.py:8399 _show_credits+ gatewayslash_commands.py:2945+ TUIserver.py:4773+c196269充值时不提示) — Dashboard profile-scope 全量(62b4618 (#45598)会话+分析 +88dbf95 (#44792)Channels +_profile_scope(profile)包所有端点)+28bf8fb feat clone profiles from any source+d206e1f本地文件浏览 home +9102d4aWin11 host 显示 +a118b94 (#45150)skill install 加--yes— CLI 持久 approval scrollback4474873 (#44702)+aa07983/bd66e7e/311ff96 Codex token 自愈(hermes_cli/auth.py:3527 _recover_codex_tokens_from_cli从~/.codex重导) + xAI 退役迁移 cluster(新hermes_cli/xai_retirement.py:16 RETIREMENT_DATE="May 15, 2026"+hermes_cli/migrate.py cmd_migrate_xairuamel 圆滑改写 +b4ba425doctor 表面 +a8a05c8启动告警 +b4afc65encrypted reasoning replay +64a9a19 (#28952)钉 x.ai 源 +a0c0312xAI Web Search plugin 560 行 +ca192cfopt-in TTS 停顿) — Bitwarden Secrets Manager552e9c7 (#30035)(agent/secret_sources/bitwarden.py 515 行+_BWS_VERSION="2.0.0"+install_bws()懒载到~/.hermes/bin/bwsSHA-256 校验 +secrets_cli.py setup/status/sync/disable/install) — Context Compression 重构波 11 commit(aec3885保近期轮 +434c684/c7bee8f自动聚焦近期用户轮 +8905ee6/5d0408dflush 游标 clamp/snapshot +691ff7c (#29824)末助手 reply 留 tail +2fef3e2 (#29824)合并 tail 拆分 +0db5cb8_SUMMARY_END_MARKER提至:92+749b721两 role 都附 marker +956af7f (#38389)COMPRESSED_SUMMARY_METADATA_KEY = "_compressed_summary"下划线前缀 wire 自剥 +286ecd2/8e5b759_MEDIA_DIRECTIVE_RE剥摘要器输入) — Perf wave:544c31b (#28866)agent-loop 47% per-conv 函数调用削减(load_config_readonly快路径 +agent/redact.py重写 +_resolved_api_call_timeout缓存)+6bd4311 (#29006)adaptive subprocess poll 省 ~195ms/工具调用 +6cb9917 (#28957)压缩可行性检查延后 — Models / Providers:957a8ffBedrock 受限 Claude 省采样参数 +eed61a1GeminisystemInstruction加 role +c8e5f34 (#36141)剥google//gemini/自前缀 +5acd185Moonshot union 数组 +4fd9397Codex chatgpt.com 移 extra_headers +7d11fa4Codex final_answer 完成顶层 incomplete 响应 +bc060c7 (#45492)移 unavailableclaude-fable-5+643dc82自定义 provider 会话身份保真 +e256f4a不恢复 bare billing provider{"auto","openrouter","custom"}+4b646bc (#45587)辅助保主 base_url +6a159be (#27132)ollama/vllm/llamacpp别名信任 — Delegation 默认子代理时钟移除bba9b51 (#45149)(DEFAULT_CHILD_TIMEOUT: Optional[float] = None) — MCP5affecb (#44550)capability-gatetools/list让 prompt-only MCP server 也连 — Skills hub:2ee69d0 (#44500)ClawHub 浏览预算允许 unlimited +fc7e04e/8f92327/c6a380eidentifier 级去重 +1899c8fyoutube 经 uv +3fde8c1 (#30042)排除依赖/venv +4373e80 (#45616)Pages 部署回退健康索引 — Computer-use:e02a7e5/531efe7SOM/vision 路由auxiliary.vision+5aa4727app= 过滤无匹配明示 +4cc1887保 capture_after 的 app context +18cd1e5type_text MCP 名修正 + drag 动作 — Approval allow_permanent81436e1/55a18e6端到端透传到 TUI + Desktop 提示 — Update / Installer:aedb8ac (#28669)post-pull 语法校验 + 自动回滚 +573b964/c814d3d安装前清 unmerged-index +9b01c4d (#45145)不弹 polkit +2a7308b (#26670)Windows hermes.exe 与并发实例隔离 +78c11d9更新前停 Windows gateway — Platform:f82cb48 + 1185dfd.xls/.doc/.ppt加SUPPORTED_DOCUMENT_TYPES+gateway/platforms/{signal.py,email.py}+plugins/platforms/simplex/adapter.pyDOCUMENT 兜底 +0fd34e8 (#44778)Teams 文档/视频/音频缓存 — TUI:2667601reasoning-only 助手轮在恢复时仍可见 +b6c7ebf (#44953)provider_routing透传 +b3f5e17/81cdbbd/d6df38b长 approval 命令换行 — Misc:05b9c84/652dd9cTelegram Bot API 10.1 富文本 +6724daa (#45592)CLI idle timer +0333a99 (#45582)session-only analytics 合并 +dba6380ca/d1f23bb2dsalvage Yuanbao wechat forwarde20e0bd (#43508) -
2026-06-11-update: 212 commits 跨日同步(hermes-agent
a5d05cf30 → 6c752ca3a,仍 v0.16.0 未发新版;约 131 fix / 25 feat / 9 chore / 6 test / 6 refactor / 3 style / 3 docs / 3 change / 1 revert / 1 perf / 15 merge / 5 misc;~48h 双日窗口)— Cron Recipes → Automation Blueprints 改名 + 14 蓝图 catalog(1593ca540上线 →e8b757845/e976faac7硬化 →cb29e8a82rebrand:cron/recipe_catalog.py → cron/blueprint_catalog.py 713 行,tools/recipes → tools/blueprints,/cron-recipe → /blueprint(alias/bp),hermes://cron-recipe/ → hermes://blueprint/,dashboard/api/cron/recipes → /api/cron/blueprints;BlueprintSlot/AutomationBlueprint/fill_blueprint/blueprint_form_schema/blueprint_slash_command/blueprint_deeplink/blueprint_catalog_entry;slot 4 typetime/enum/text/weekdays+WEEKDAY_PRESETS;14 个 blueprint;终结于同一cron.jobs.create_job,无第二套 job 引擎;Electronhermes://URL scheme + single-instance lock)+ Suggested Cron Jobs9a09ea69f(cron/suggestions.py 257 行+cron/suggestion_catalog.py 154 行4 个 catalog entry;4 来源catalog/recipe/usage/integration;dedup+latch 按 key、pending cap、accept 走同一create_job;tools/blueprints.py:217 register_blueprint_suggestion)+ memory/skillswrite_approval布尔门(96af61b6e (#38199)上线三态on|off|approve→095f526b1 (#43354)重构为 booleanwrite_approval默 false +_config_version 28→29migration →70d5d7e39 (#43452)修 inline prompt callback + gateway staging +/skillsgateway review;tools/write_approval.py 493 行write_approval_enabled/evaluate_gate;gateway/memory pending|approve|reject|mode+/skills pending|approve|reject|diff|mode;acd7932c0文档 cross-link)+ Dashboard 统一多 profile 管理875aa8f16 (#44007)1419+/310− 跨 21 文件(web_server.py +566 行profile参数 query/body 加到/api/config|env|mcp/servers|mcp/catalog|model/info|model/set全走_profile_scope();chat PTY?profile=让 childHERMES_HOME指向 profile dir;CLI<profile> dashboard走机器 dashboard--isolated保旧;前端ProfileProvider/ProfileSwitcher全局 selector URL-persisted;body.profile>?profile=;amberProfileScopeBanner)+73dd58499 (#44220)MCP loop HERMES_HOME 上下文 propagate(OAuth token-store 跨 profile 修) +d986bb0c6 (#39084)Profile Builder +a09343cc9 (#44231)SKILL.md editor + cron modal attach-skill +fa7f24e89Webhook enable from dashboard +9c051f57c (#44286)Anthropic API Key 检 +9c16ca879 (#44237)model 标准化 + backup confirm +c7bfc938d (#44374)Config 页 profile 路径 +63a421d4c (#42578)_require_token全部走 OAuth gate +7df3aa34b (#43214)public_url 静默拒绝 warn — Coding-Context Posture3e74f75e4 (#43316)(agent/coding_context.py 731 行ContextProfile/RuntimeMode;4 域:System prompt operating brief + per-model edit-format tuning + skill index demote + Toolset collapse;activationagent.coding_context: auto|focus|on|off;subagent 自动继承;不 memoize)+ Skill index demote 而非 hide(ee1a744ac (#44342)API 改名compact_skill_categories,每 skill 名字仍在 prompt 一行 names-only;4d6a133a9 (#44387)一天后反转:demotion 只在 focus 模式下) +a4f179c50 (#44411)GPT/Codex steer V4A 单文件编辑(OpenAI codex-rsapply_patch唯一 file editor) — Parallel Web Search & Extracte0e2571711206+/98− 跨 15 文件(keyless 免费 Search MCPsearch.parallel.ai/mcpStreamable-HTTP JSON-RPC;keyed v1 RESTclient.search/extract;parallel-web 0.4.2→0.6.0)+0a5762c78mcp-web-client中性 identity +93764b930/32a73010bkeyless web default 永远兜底 — Bedrocke24c935cf (#44293)IAM 拒绝InvokeModelWithResponseStream时自动 fallbackconverse()(agent/bedrock_adapter.py:211 is_streaming_access_denied_error) — Anthropic 交错 thinking 5 连:aaccaada2顺序保真anthropic_content_blocks端到端 verbatim +529bb1c3dstrip output-only SDK 字段 +7a1eed826redact replayed tool input + 加宽 400 classifier +86e10dd87thinking-modified 400 路由 recovery +9f95f72b9strip api_messages +efcbbde48in-memory only — SUMMARY_PREFIX 4 连:8f8cad7ec (#41607)抗陈旧任务 +d5e2fbf24historical context framing +acb2954d8历史 prefix 冻 +6c752ca3aHEAD 收紧 wording(topic-overlap 三句塌缩成 WINS+discard 两句) — OpenRouter183d86b3e (#43436)reasoning_effort 改 verbosity for adaptive Anthropic — Streaming615ad9792 (#43570)socket read timeout floor 到 stale-stream 180/240/300s — Params19c07c403newer OpenAI 系列max_completion_tokens名匹配 +2ce3ae3d1错分类不误判 unsupported-param — Model 选择:af978ecb1/243cada15昂贵模型确认 +57c671499 (#43103)Anthropic aliases 保留 +5a4297a11MiniMax M3 hardcode 1M — Desktop registry-driven slash + /resume/handoff3ffbdfbcc (#42351)1914+/478− 跨 31 文件 — Desktop composer 解耦 + 草稿 localStorage 6 连(c710868fb/292192f7d/d7d281fa3/18d61bd06/3d14f01fd/fdc0d1956/65ddc7c4aper-session 附件) — Desktop VS Code Marketplace 主题 + 可调终端 pane + Floating HUD(27a321157.vsixzlib 手写 zip reader + WCAG AA +8f73d0d94 (#42521)resizable terminal pane +Ctrl+\`` toggle +833410e02ANSI palette + Cmd-K HUD +ab5f1a1f1 (#43111)Mac 风^Tab/^⇧Tab/^1-9switcher +b96bd4808 (#43219)per-window chat +d33965396 (#43188)TUI titlebar session name) — **Desktop 远端 FS/api/fs/*5 连**(51f47f9a9 web_server.py:1439-1514+db79e9013facade +8878484f8remote-picker.tsx 177 行 +56a0f48ba/9121834b3tighten/scope) + **Desktop 远端 attach 5 连**(4906dcfc2stage OS dropsfile.attach/image.attach_bytes覆盖每 drop surface + 缩略图/spinner/race/16MB toast 4 连) — **Desktop misc 18 修**(1770263cc (#43234)default project dir +0d3e2cc53 (#43487)lineage dedup + 9 个 #4xxxx 修 + Nous overlay HUD/filled icons) — **Sessions 3 连**:e96ca1a0dempty 退出/轮转清理(hermes_state.py:3697 delete_session_if_empty+cli.py:5863 _discard_session_if_empty)+04b3f1953归档压缩 lineage +218452b05 (#43149)sqlite_master自愈(PRAGMA writable_schema=ONsurgery) — **Agent binary @file 引用 actionable**7ffc216bc+ **PDF/DOCX/音频附件 note 改写**(e7ae145acPDF/DOCX +13650ab7f音频 +4e9be3ee3test) — **Telegram 5 连**(3b4c715e1stripped-text fallback + tail-only delete guard + re-finalize skip +590b3c0d7partial overflow recover +da818510estream consumer cancelled finalize +d0e017bac (#44245)voice/audio >20MB pre-download gate +9ca969734 (#42090)transcribe tuple) — **Gateway 9 连**(13f1efdd1 (#43968)终端 header 折叠 +a8f404b29 (#40831)launchd domain probe +fa32af886/984e69ff6restart 去重 + post-Telegram QR auto-restart +5cf6e28a2 (#42675/#43236)容器重启 auto-start +f456f302d (#44267)临时 HERMES_HOME 拒写 service definition +264ac72b6/cb2c13055restart watcher env scrub +6a30cfca8 (#37556)post-delivery 前停 typing) — **Matrix4717989c1 (#18505)** room context 隔离 + handle_sync + allowed_users authz + i18n key + slash_commands mixin port — **Discord 7 连**:c3464ecf4 (#44383)runtime gateway task exit 恢复 +020ef76cf/08b1c44a5connect timeout cancel +311900842/aea0b7397voice-off 不断开 +e5580f43c/4eadef18aDISCORD_ALLOWED_ROLES端到端 — **Skills hub 7 连**:298bb93d3 (#43398)live per-source 进度 +105625d65overall_timeout 真 honor + ClawHubCATALOG_WALK_BUDGET_SECONDS+eee1da45f (#43395)cold start bound +9caa12f4efrontmatter name 解析 +0a593f132/d1383a6b1.envHERMES_HOME-aware +fdc90346e (#43221)red-team skills 移 optional(95%→25% block rate) — **Plugins/Web 3 连**:114e26573失败 sweep 不缓存 +93764b930/32a73010bkeyless 兜底 — **Cron 5 连**:7d8d000b1 (#43956)per-job profile revert +acd4f34e6/f7a6d6a6aprovider "custom" resolve +702f4df19 (#41976)容器重启 ownership +b4170f3ac (#43223)no-skills 不严检 — **CLI/TUI**:8972a151a (#44265)状态栏 idle clock +2f1951234 (#43439)全平台 UTF-8 stdout/stderrTextIOWrapper.reconfigure()+b2043cf15/5508f4bc5TUI/whatsapp-bridge UTF-8 +f8fd30942 (#43320)/d03cdd63e (#43036)one-shot cleanup +0b5b7ddfd/help quick commands +3c489fda8Slack 50-cap aliases — **Install/Update/Backup 7 连**:899acfe42winget 0x8A15002B 陈旧注册修 +9662b76d5PATH merge +a5c32cdf3 (#42172)中断 venv 自愈 +cedd9b6d4SSH 跳 passive +dd40600e0/ed2b9e43cbackup SQLite 同位 + 嵌套 skill 纳入 — **Tooling 20 连**:a72bb0375 (#38749)Docker 缩减 +5d8c44a39 (#30399)matrix 预装 +464276228Langfuse data URI redact +47e77ae16Curator atomic +dca11b665/e71d74682MCP stdio +3edd09a46 (#44205)WhatsApp stale bridge restart +4cecb1a13/90f4b3040/3bfbb3f2anpm audit / TS 6 / CI typecheck +72154ad87CI uv cache +f082b4ec5/07ac18590exit-4 runner +af3c8b80bpid-file race +6110aed9b (#43669)free model 抑 +15813336c/e4a1b35a3.env mode +1c055a4c5Grok Build code +6b330522e (#42641)AGENTS.md 设计哲学 — **TTS Gemini**:5718811depersona +2c1920822audio tag rewrite(tools/tts_tool.py +143 行`) -
2026-06-09-update: 105 commits 跨日同步(hermes-agent
754154a9c → a5d05cf30,仍 v0.16.0 未发新版;约 56 fix / 17 feat / 11 test / 5 chore / 3 refactor / 2 docs / 1 ci / 1 style / 8 merge)— Photon iMessage4e4d27875 feat: gRPC-native iMessage channel (no webhook)主轴收官(删 aiohttp webhook receiver + HMAC-SHA256 验签 +PHOTON_WEBHOOK_*5 个 env + CLIwebhook register/list/delete3 子命令;改GET /inboundNDJSON 长连接 + 25s heartbeat + consumer-state-machine;adapter docstring 重写 "Bidirectional bridge via spectrum-ts SDK gRPC stream";plugin.yaml:4 0.1.0 → 0.2.0;project_id 语义改写为 spectrumProjectId)+ 20 commit 跟进硬化(92dfd70d6 (#42732)生产硬化六件套:5 条 npmoverrides钉补丁版钳 protobufjs GHSA-66ff-xgx4-vchm + 4 个 @opentelemetry OTLP exporter CVE /crypto.timingSafeEqual替!==token compare / 2 MiB body size cap / re-subscribe capped exponential backoff + jitter /unhandledRejection处理 / dedup 按 insertion order 严格淘汰 4000 entries;b3aef57f2TYPE_CHECKING包 httpx 修类型 + connect 局部 client ref 防 race;9fb83eaa2spectrum-ts^1.18.0+npm install spectrum-ts@latest;314af28e8 + dbf2470d4入站附件/语音 base64 inline cap 20MiB → cache image/audio/document + voice MessageType + force_audio kwarg;4615e08d3 (#42397)出站 6 方法 override (send_image/_file/_voice/_video/_document/_animation) 经 spectrum-tsattachment()/voice()builder +/send-attachment端点 + cron multimedia +validate_media_delivery_path二次校验;fdf48c63c/e79e44af7/0d25cae04API 收敛走spectrumText/spectrumReply/spectrumTyping后又删 replyTo(实测 iMessage 不可靠)+ typing 统一space.send(spectrumTyping(state));2130ef68bflattenGroups: true;064665688/92179352f/3b983e779Home channel 支持裸 E.164 + DM GUID +_PHONE_PLATFORMS加 photon + setup 自动 allowlist +_env_enablementhome_channel seed;e9b26c7c8/84e4b4b9a/b58ff9345彩色 banner +assignedPhoneNumber取号 + auth.json 持久化 phone numbers;033765890user API 全迁 Spectrum backend Basic auth +DEFAULT_SPECTRUM_HOST="https://spectrum.photon.codes";37561c214device client_idhermes-agent → photon-cli修 400 invalid_client + token 双重 validate(PhotonDashboardAuthError+validate_photon_token先/api/auth/get-session再/api/projects/);637cf94bestrip_markdown+_send_with_retry(max_retries=2, base_delay=2.0)指数退避)— SimpleX 1.1.0 大演进0c2e81df0(PR #27978 salvage:群组SIMPLEX_GROUP_ALLOWED逗号分隔或*默认 disabled +chat_id=group:<id>;入站文件 rcvFileDescrReady→rcvFileComplete 延迟流程 +_pending_file_transfers;原生出站媒体send_image/video/document/voice全按 numeric ID/_send … json [...];MEDIA:<path>tag 自 reply 抽取按扩展名分发;HERMES_SIMPLEX_TEXT_BATCH_DELAY默 0.8s burst 批处理;SIMPLEX_AUTO_ACCEPT默 true contact request;MAX_MESSAGE_LENGTH 16000→8000+HEALTH_CHECK_STALE_THRESHOLD 120→300;_pending_responses + _corr_counter关联 ID 追踪;不动 core)— Plugins Hub TUI overlay52f7e24a7(新 gateway RPCplugins.manageattui_gateway/server.py:9252-9328加入_LONG_HANDLERS,action list/toggle,错误码 4017/4019/5026;新建ui-tui/src/components/pluginsHub.tsx 238 行+ 配套 overlayStore/useInputHandlers/appOverlays 通路 +/pluginsslash 无 arg 直开 overlay;键位 ↑↓/Enter/Space/Tab/1-9,0/Esc)+/pluginsslash 改写b8eede7bd(cli.py:7303-7366从PluginManager.list_plugins()改用_discover_all_plugins让 freshly-installed-but-not-enabled 也可见)+ plugin install subdir 支持f6f573eba (#42963)(owner/repo/path/to/pluginshorthand +<url>.git/path/to/plugin自然边界 +<url>#path/to/plugin显式 fragment;新_resolve_subdir_within防..traversal/绝对路径/symlink-out)+optional-mcps入 wheel+sdist39b76d901 (#39859)(MANIFEST.in:3 graft optional-mcps+pyproject.toml:300-301per-entry data-files 防 glob flatten 冲突)— Anthropic 默认现代 thinking 契约1febb0824 (#42991)(反转脆弱 version-substring allowlist 为 default-to-modern;_LEGACY_MANUAL_THINKING_CLAUDE_SUBSTRINGS列 3.x/4.0/4.1/4.5/4-2025 + Haiku 4.5;_NO_XHIGH_CLAUDE_SUBSTRINGS仅 4.6 family;_supports_adaptive_thinking/_supports_xhigh_effort/_forbids_sampling_params三 predicate 重写;unknown Claude 默 adaptive+xhigh+无 sampling params;_ANTHROPIC_OUTPUT_LIMITS["claude-fable"]=128_000;OpenRouter 同步_ANTHROPIC_REASONING_OPTIONAL_SUBSTRINGS+_anthropic_reasoning_is_mandatory())+ OpenRouter Anthropic reasoning-mandatory 适用所有路径46fedef07 (#43012)(不只 disabling 时省略 reasoning — 即使 enabled 也省,因 chat_completions 不回放 signed thinking blocks 让 OpenRouter 在 tool-replay turn 发thinking: {type: "disabled"}被 4.6+ 模型 400 拒)— Fable 5 全链路加入(d7886da08Anthropic 直连列表hermes_cli/models.py:329+ff9c110d5 (#42979)OPENROUTER_MODELS:36+_PROVIDER_MODELS["nous"]:158+agent/model_metadata.py:144 claude-fable-5: 1000000+agent/anthropic_adapter.py:127 claude-fable output_limit 128_000+website/static/api/model-catalog.json:16,152 updated_at 2026-06-09T17:20:16Z)+ OpenRouter livecontext_lengthstep-5f branch967c325da (#42986)(agent/model_metadata.py:1815-1835if effective_provider == "openrouter":fetchentry.get("context_length")— 修 fable-5 等新 slug models.dev 缺时落到 200K 默认;保留 Kimi-family 32k underreport guard)— Curated modelsc4066091c (#42629)加poolside/laguna-m.1:free+nvidia/nemotron-3-ultra-550b-a55b:freeto OpenRouter free 块;e687292eb (#42628)Nous recommended-models 持久化$HERMES_HOME/cache/nous_recommended_cache.jsonper-base map atomic write + Portal 失败 fallback;54318c65b (#42614)seed_cache_from_checkout(project_root)在hermes update时从 checkoutwebsite/static/api/model-catalog.json自动 seed disk cache(covers Docker/no-git zip update 路径main.py:5836-5838与 git pull:8402-8416)— Observability9f1c16a7f fix(langfuse):849翻 gate 让 sanitized response (post_api_request 路径) 的 usage dict fallback 真正运行(之前getattr(response, "usage", None)总 None 致每 turn token/cost 静默 0);9d61076f8 + ecd4679d8 + 728612c29 fix(observability/nemo-relay)plugins.toml lifecycle 三连:lazy reinit + direct fallback 保持 until init 成功 + try/finally 让 clear 失败也 re-arm;021d1034dadaptive config 对齐[components.config.tool_parallelism] mode="observe_only"(之前[components.config] mode="route");85852b71d (#42691)preserve downstream errors via_run_managed_with_downstream_preservation+ 按_DownstreamExecutionErrorclass-name +.original属性 shape 探(不 import 私类)+ tolerantstr.startswithmatch 让 Relay 未来加 traceback 后缀也不丢 unwrap;execute_llm + execute_tool 共享 scaffolding 去重 ~20 行 — Desktop reconnect/sleep/wake 恢复 cluster8d71c3891 (#43004)useRouteResume三 ref +seenGatewayStateRef让 mount 不被误当 reconnect;72f522d46 + be2f739e9sleep/wake 后第一prompt.submit返 "session not found" 时自动session.resume+ 重发;ba44de06d (#42998)Electron download 自愈三步 escalation(GitHub → 清 corrupt 重试 →ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/fallback;user-pinned 永远尊重);c4811c382 (#42946)icon 按 Apple grid pad;c6dc2fcd2 (#42613)profile delete 前先停后端防 Windows file lock,新prepareProfileDeleteRequest / teardownPoolBackendAndWait / profileNameFromDeleteRequest,Pythondelete_profile现 captureremove_error再 re-raiseRuntimeError;d04616964 (#42537)per-platform messaging sidebar sections + local-only recents +orderByIds前缀新 session + 同步 flush 终端态 +freshDraftReady区分新 chat vs stranded routed session + Ctrl+N 清 quick-create profile + 移除SmoothStreamingText包装让 markdown stream 独立 — Desktop file.attach RPCdbbd1d4d0(remote gateway 非 image 附件上传:@file:ref 在 remote 模式时读 dataUrl 发file.attach,gateway stage 到<workspace>/.hermes/desktop-attachments/返 workspace-relative ref;DESKTOP_BACKEND_CONTRACT 1→2;新_format_ref_value/_attachment_ref_path/_desktop_attachment_dir/_sanitize_attachment_name/_unique_attachment_path/_resolve_gateway_attachment_path/_decode_attachment_data_url/_stage_session_file_attachment8 个 helper)+ Desktop 后台流式09a6a2ddd (#42399)(三个 Chromium switchdisable-renderer-backgrounding / disable-backgrounding-occluded-windows / disable-background-timer-throttling+backgroundThrottling: false修后台窗口 stuck on Thinking)+ Desktop ES2023c1927d234+ debug report explicit URL onlye0f6a35ac (#42515)(EXPLICIT_URL_RE+LinkifiedText explicitOnly让agent.log不被误识为域名)— TUI / CLIf8adefdeb fix(tui)新TERMINAL_CONFIG_ENV_MAPathermes_cli/config.py:5156把terminal.*config 翻成 env var twin +apply_terminal_config_to_env()让 TUI/dashboard 子进程也走 classic CLI 的同套 bridge;520b59db1 + 4b073d090 fix(tui)_load_fallback_model()改 delegate tohermes_cli.fallback_config.get_fallback_chain与HermesCLI.__init__/gateway.run对齐;ab98818e5 + d66bac5a1 + 714183530 + b5f8996cc修 native Windows confirm modal #33961(之前从 daemon threadinput()与 prompt_toolkit 主线程 stdin 锁死,/reset卡 + Ctrl-C 吞)现走同 modalcall_soon_threadsafe路径;d1f23bb2d跨 28 文件 85 个 call site 加stdin=subprocess.DEVNULL修 TUI 模式下 subprocess.run/Popen 继承 stdin 致 race-read EOF 让 gateway 干净 exit on mid-tool-execution;bddab61bc + 8bb60ff03新scripts/check_subprocess_stdin.pyregex scanner + 包成 pytest 让 CI 第一时间挂掉新漏;2c1aaa9cb + dba6380ca加noqa: subprocess-stdinmarker 让claude setup-token交互登录保留 inherited stdin;a46462ec6 (#42435)hermes dashboard register显式--portal-url持久写.env即使非 default + 从--redirect-uri派生HERMES_DASHBOARD_PUBLIC_URL(仅 ORIGIN 不含 callback path) — hermes-ink1e5ff4a57 (#42527)终端 raw-mode 退出时关 DEC mouse tracking (1000/1002/1003/1006) 防 SGR35;col;row Mflood over prompt;re-entry 经setImmediate让 reassertTerminalModes 落在 alt-screen enable 之后 — Gateway-UI9351cbafa (#42616)image_generate 输出 auto-deliver as native media(producer allowlist +_JSON_MEDIA_TOOL_PATH_FIELDS = ("host_image", "image", "agent_visible_image")优先级序);3705625b7 (#42576) + 8d99b5bc4 (#42729)terminal command 渲为 bare fenced code block(无 language tag 因 Slack mrkdwn 把 "bash" 渲为字面 first line),verbose mode full + non-verbose all/new mode 单行 capped;gate on adaptersupports_code_blocks: bool;7 个 adapter (telegram/slack/whatsapp/matrix/weixin/feishu/discord) 设 True;6d2732e78MarkdownV2 edit finalize(adapterREQUIRES_EDIT_FINALIZE: bool)+f4531feee_strip_mdv2顺序修先剥标准**bold**再 MarkdownV2*bold*防**半剥成*— Sessions/Dashboard639c1e363 feat(sessions)加可选max_concurrent_sessionscap(顶层 config 优先 overgateway.*)跨 CLI/TUI/dashboard/gateway;新建hermes_cli/active_sessions.py 321 行lease registry 在$HERMES_HOME/runtime/active_sessions.json+.lockPOSIXfcntl.flock/Windowsmsvcrt.locking+psutil.Process.create_time()抗 pid recycling;fail-open 设计;4 处 claim site(gateway inbound/cli.run/cli single-query/tui session.start+.resume+.branch)+ JSON-RPC 4090 拒绝码;52ae9d9f0 (#42455)hermes dashboard register凭HERMES_DASHBOARD_OAUTH_CLIENT_IDstable key 幂等(重跑更新而非新建副本)— Agent/Codex/API3a74b7521 + 57775e9e1 (#42741)识别 LM Studio/llama.cpp 把 ctx 报 token 但 prompt 报字符的措辞"... 65536 tokens. ... your prompt contains 77409 characters"走 output-cap 路径降max_tokens而非误路由到 compression;cb4cc08b0Codex app-serverthread/tokenUsage/updated通知现也接入 session accounting(之前在turn/completed之外发因此被丢,导致session_*不长、context compressor 不动);新建agent/codex_runtime.py:_record_codex_app_server_usage(agent, turn)翻译 Codex bucket 名为 CanonicalUsage;b23184cadapi-server_run_agentexecutor 现set_session_vars(session_id=...)让 tools 看到正确HERMES_SESSION_ID(之前看 OS env stale)— Terminala38cc69bc (#42653)POSIX_SANE_PATH8 entry 缺啥补啥而非用/usr/bin哨兵跳过(修 macOS launchd 已含/usr/bin缺/opt/homebrew/{bin,sbin}让gh/brew不可见);新_path_env_key处 Windows case-variantPATH/Path;76f89d66d (#42695)test 锚定迁到TERMINAL_CONFIG_ENV_MAP替 AST-scan 已消失_config_to_env_sync字面量 — Yuanbaoffcd9d7ac媒体解析三阶段 middleware 拆分(QuoteContextMiddleware → MediaResolveMiddleware → PatchAnchorsMiddleware)+ 私聊 fallback 从_msg_content_cache恢复 local 路径不 re-download + 三源 (own/quote/group-observed) first-occurrence dedup;24a934295测试加 missingpatchimport 修 25 call siteNameError— Skills-hub5e9d7a766 (#42347)修两 bug 让 GitHub rate-limit-zeroed catalog 不再上线:(1)scripts/build_skills_index.pywrite-before-check → 失败时 exit 2 不写 +deploy-site.yml移除|| echo non-fatal让 step 严格致命;(2)GitHubSource._list_skills_in_repo403 silent return → 经新共享_github_get重试 + 把 429 视作 rate-limit 信号;ClaudeMarketplaceSource持持久GitHubSource让 rate-limit state 跨 marketplace-index fetch + per-skill inspect call 保留 — Doctor732ababa1 + aa424e51a允许model.provider: custom:<name>的 vendor slug +is_aggregator识别custom:<name>作 OpenAI-compat aggregator(命名 custom provider)— Deps/Packaging/Nixf6416f50f (#40179)PyJWT[crypto] 2.12.1→2.13.0(PYSEC-2026-175/177/178/179)+ 加urllib3>=2.7.0,<3(GHSA-mf9v-mfxr-j63j 解压炸弹 + GHSA-qccp-gfcp-xxvc 敏感 header proxy redirect);b5421f4ba (#40522)packaging==26.0入核心依赖(之前仅 transitively 到达,slim Docker 缺它致 hindsight_meets_minimum_version返 False 让 append mode 关 #40503、lazy_deps fallback "installed counts as satisfied" 破版本约束);5750d058f (#39881)pytest-timeoutmethodsignal→thread跨 Windows;a5d05cf30(HEAD)nix/lib.nix:152-160npm-lockfile-changed branch 不再跑.#fix-lockfiles("its so slow");02f878ec5 (#42856)Windows native 数据目录文档纠正到%LOCALAPPDATA%\hermes(scripts/install.ps1设的真实路径,原文档错称%USERPROFILE%\.hermes);68a997fedREADME 加 SEO 锚链 — 杂修+测试50ad191a8 (#42626)autouse fixturemonkeypatch.setattr加raising=False防 xdist 分进程 import race;d6c11a457 (#42356)test_concurrent_handles_tool_error改按args.get("q")决定 raise 而非共享计数防 race;4 条 AUTHOR_MAP(underthestars-zhy/m4dni5/ruangraung/mnajafian-nv/jooray) -
2026-06-08-update: 178 commits 跨日同步(hermes-agent
c9863772 → 754154a9c,仍 v0.16.0 未发新版;约 120 fix / 19 feat / 15 refactor / 12 test / 8 chore / 3 docs / 1 hardening)— Photon Spectrum iMessage 新平台插件(12 commit:新建plugins/platforms/photon/ 1981 行含adapter.py:200 class PhotonAdapter + :795 register()注册setup_fn=_cli.gateway_setup / pii_safe=True / allow_update_command=True / emoji="📱";inbound aiohttp 8788 端口/photon/webhook验X-Spectrum-SignatureHMAC-SHA256 + ±5 分钟时钟漂移拒绝 +message.id去重;outbound 因 Photon 暂未公开 HTTP send 端点改 spawn Node sidecar loopback 8789 跑spectrum-tsSDK,shared bearer token;auth.py 581 行RFC 8628 device-code 流 + token 持久化~/.hermes/auth.json:credential_pool.photon;cli.py 340 行hermes photon setup/status+ group-chat mention 门禁PHOTON_REQUIRE_MENTION+PHOTON_MENTION_PATTERNS与 BlueBubbles 对齐;d7f42e368全 channel parity(gateway setup 集成 + PII 安全 + allow_update_command);186651857group-chat mention 门禁;630318e95refactor 把login子命令折入setup;多个 CodeQL clear-text-{logging,storage} 修补全清零)— God-file 解耦运动 Phase 1-4(15+ refactor commit 析出 ~12k LOC):agent 内54870847c新建agent/turn_context.py 388 行 :39 @dataclass class TurnContext + build_turn_context()析出 run_conversation 前 ~470 行 prologue +524453dab新建agent/turn_retry_state.py 68 行 @dataclass TurnRetryState集中 15 个零散 per-attempt one-shot guard +55b83c3d9新建agent/turn_finalizer.py 428 行 def finalize_turn()析出 post-loop tail(run_conversation 4204→3846 LOC、conversation_loop.py 4578→4220);gateway/run.py 三 mixin(HEAD:1163-1165,1866 class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, GatewaySlashCommandsMixin)):a706a349b析gateway/authz_mixin.py 426 行4 鉴权方法 +1c68f6f81析gateway/kanban_watchers.py 1064 行6 kanban 方法(1035 LOC)+619bd7827析gateway/slash_commands.py 3393 行42 个_handle_*_command处理器(3200 LOC)合计 4883 LOC 自 run.py 移出;CLI 双轨:b2e605324+4da45e872+568e12761+1a626470c建hermes_cli/subcommands/ 39 子文件 2857 LOC把 main() 内 3297 行 argparse 树拆出(cron/profile/gateway/proxy/model/setup/postinstall/whatsapp/slack/login/logout/auth/status/webhook/hooks/doctor/security/dump/debug/backup/import/config/version/update/uninstall/dashboard/gui/logs/memory/acp/tools/insights/skills/pairing/plugins/mcp/claw 等 35 子命令)+a77efada5新建hermes_cli/model_setup_flows.py 2648 行析 18_model_flow_*provider-setup 向导(main.py 14050→11479)+0904bc7ea新建hermes_cli/cli_commands_mixin.py 2175 行析 32 slash-command handler(2077 LOC)+094aa85c3新建hermes_cli/cli_agent_setup_mixin.py 681 行析 agent-construction 5 方法(cli.py 14139→13492);全部 refactor 自陈 byte-identical/MRO-resolved 行为不变)— Desktop 客户端/后端版本与更新按钮分离(9 commit:9e360681fweb_server.py +53/api/hermes/update/check加 best-effortcommitslist;ed1e2533b新建apps/desktop/src/lib/version-bar.ts + .test.ts在 status-bar 同显client vX · backend vY+ drift flag;64da518dbcheckUpdates/applyUpdates 经connection.mode === 'remote'改驱动后端/api/hermes/update命令中心路径;9c264555b新建apps/desktop/src/lib/update-copy.ts + .test.tsresolveUpdateCopy({target, shownItems, copy})显 "Backend update available" + 无 changelog 时 honest copy;87ac7cac1_recent_upstream_commits从HEAD..@{upstream}改HEAD..origin/main修 feature branch 上 commits 空的 bug;56be1a63a把 status-bar 合并 pill 拆 client vX(always)+ backend vY (+N)(remote-only)两 button + 各自 overlay target + 删version-bar.tsmerge helper + store 两套独立 atom;81647458cremote restart 后 poll backend 直答清 overlay;cd030f5f4+b000e05b1+74239b494overlay 成功/无返回的诚实判定 + i18n)— Desktop 主题 per-profile(9b1e0d6f7 feat(desktop): assignable themes per profile (#42286):apps/desktop/src/themes/context.tsx:25-60加PROFILE_SKINS_KEY/PROFILE_MODES_KEY/LAST_PROFILE_KEYper-profile 持久化 +profilePref<T>()factory 让 default profile 直走 legacy global slot 保 single-profile 安装零变化,命名 profile 自身记录、未赋值时 fallback global)— Desktop hover-reveal 折叠 sidebar(d65b513f2 (#41670)PaneShell hoverRevealprop:collapsed 时 hover 左边界 float 回为 fixed overlay 覆盖 main content + edge hot-zone + 持久 resize 宽度 + pointer-leave 退回;session sidebar opt-in) — Shift+click 状态栏 zap 切全局 YOLO(fa42ac094 (#41666)之前只切 per-session bypass 同 TUI Shift+Tab;Shift+点 zap 翻approvals.modeconfig"off"/"manual"全局影响 CLI/TUI/cron 且 survive 重启;statusbar-controls经新StatusbarSelectModifiers透传 shiftKey;yolo-session.ts setGlobalYolo()config.set scope="global")— Desktop viewport 不再追流式输出(e029b7597 (#41414):删 streamingResizeObserverre-pin loop + post-run bottom lock 1.2s;保留 user submit/new turn/session change 一次性 jump-to-bottom)— Desktop just-finished session 切走不消失(395ed9189 (#42285):新 session 首回合持久化稍晚一拍,新增sessionsToKeep()跟踪 settled (working→idle) 让它撑过 refresh window 不被mergeSessionPage驱逐)— Desktop scoped session 事件 guard 收紧 + 反弹(de80d28f3 (#42178)把message/reasoning/tool/subagent必须带 session_id 修,但吞了 focused turn 自家 unscoped live answer →6e7033bb4 (#42359)把 guard 收窄到subagent.*唯一真背景家族)— Desktop zoom 持久化 #41747 / messaging source folders 6 commit / 新 model provider 在 Settings 出现 #41545 / sleep/wake 后 stale backend revalidate / renderer bundle 缺失硬失败 #41729 / dist 解开 ASAR 让 dashboard 静态可服 / Windows pack 时 Hermes.exe 锁 #42100 — 新 simplify-code skill(ace4b722d feat(skills): add simplify-code skill — parallel 3-agent code review and cleanup (#41691):新建skills/software-development/simplify-code/SKILL.md 175 行灵感来自 Claude Code/simplify,3 narrow reviewer(reuse/quality/efficiency)经delegate_taskbatch mode 并发,整 diff 不裂片,每 reviewer 拿terminal/file/searchtoolset + repo path;支持 focus/dry-run/scoped modifier;零核心修改全靠 orchestration)— Windows ConPTY 接通 dashboard/chattab(abcf996b1 feat(windows): enable dashboard /chat tab via ConPTY (win_pty_bridge) + tests (#42251):新建hermes_cli/win_pty_bridge.py 179 行POSIXPtyBridgedrop-in 替代用pywinpty.PtyProcess(已是 win32 declared 依赖)替 ptyprocess/fcntl/termios;spawn/read/write/resize/close/is_available + PtyUnavailableError公开 surface byte-identical;clamp ceiling 与 POSIX 对齐;hermes_cli/web_server.py:8285-8316平台分支让/api/ptyWebSocket handler 完全 platform-agnostic)— Codex OAuth 帐户独立 pool entry + OpenRouter pool 自动侦测(c78b3e1d3hermes auth add openai-codex改创独立manual:device_codepool entry 不再经 singleton_save_codex_tokens覆盖前一个;9c9d9113a (#42263)hermes_cli/auth.py:1589-1605resolve_provider()在 env 后 fallbackload_pool("openrouter").has_credentials()修hermes auth add openrouter后 manual entry 隐形 401 #42130)+ Approval 路径解析时机修(89d380261+b0efe1d64把 HERMES_HOME 解析从 import time 移到_normalize_command_for_detection()让 deferred-profile-resolution 也工作)— Vision providers 拒收 list-type tool content 主动降级(9513793ad (#41072)ProviderProfile加supports_vision_tool_messages: bool = True,Xiaomi MiMo 设 False,_tool_result_content_for_active_model现 proactively 查此字段,False 时返 text summary 免 400 "text is not set" round-trip)+ honor custom_providers per-modelsupports_vision(41f071428 (#41036)_supports_vision_override()扩 legacy list-stylecustom_providers路径)— Compression 防泄漏四连:8513a6aec+cca3b77a4cross-session stale_previous_summary守(cron/background session 压缩后未走/new//reset,stale summary 留实例污染下一 live session)+a77bc2c08 (#41708)background-review fork 共享 parent session_id,赢压缩竞争时新 child 永不被 gateway adopt 让下回合从 stale parent 再压一次造成同 parent 两 sibling children;改review_agent.compression_enabled = False+2a10da3a1topic+split 后/model+/reasoningoverride 保(之前 handler 从 rawevent.source推 override key 跳过 thread_id recovery,写在一种 key 下一回合读另一种 key #30479)+b18490b89transcript 全装 tail budget 时无限 loop(summary_target_ratio=0.45 + context_length=96000让 soft_ceiling 超 transcript 总大小,_find_tail_cut_by_tokens不 break early、no-op compression 不增_ineffective_compression_count,should_compress 每回合 True)— Memory 集群:86c537d20 (#41755)overflow 错语指令 in-turn 整合+retry(replace-overflow 现也 echocurrent_entries + usage)+aa6f2775f (#41945)end-of-turn sync 离 turn thread(broken Hindsight daemon 阻塞 298s 让 run_conversation 不返、agent 卡 running、跟进消息触发 aggressive interrupt 丢失新消息)+5e06c9ffe (#42123)AIAgent.close()清_session_messages(hard close 镜像 soft-eviction)+e9c1e757f (#41974)gateway_evict_cached_agent释放 httpx client(之前 17 call site 只 pop 不 release,AIAgent ref cycle 让 client pool 不立即 free、RSS 单调增 #29298)+3d029a53e余下泄漏点 4 个 site(~18MB/hr 增)— Gateway 集群:8e4c447e5duplicate user message in state.db(agent_failed_early+not-new-messages 两 fallback 路径 missingskip_db=True重复持久化)+dd0d1222acascading interrupt hang(interrupt close worker httpx 触 RemoteProtocolError 被误为 transient connection error 重试,每次 retry 停 stream-stale timeout 300s)+d55304c39voice 在 agent 跑时也转录(之前 STT 在 running-agent guard 后跑,voice effectively 丢) +4d0f2bd24+fec5ca71dbusy_input FIFO(#28503) +2e6286278 (#41716)Telegram polling-conflict reschedule 用get_running_loop替get_event_loop修 Python 3.11+ PTB dispatch error callback 时 RuntimeError +540801336 (#41764)DM session 凭 user_id 隔离(之前build_session_key把所有无 chat_id DM collapse 到agent:main:<platform>:dm共享 key → 单 AIAgent 服多用户 history 渗血)+e02f4c03c--replace老 PID 抗 SIGKILL 时中止(之前无条件清 PID file 启新 → 两 gateway 争 bot token #19471)+4d18717b6 (#41892)systemd--replace去除(在 Restart=always 下每次重启 self-kill loop)— Auxiliary:2789bf4e2 (#5709)Codex Responses 共用转换器(之前 auxiliary Codex adapter 自维护转换 loop,让 replay 含role=tool的消息泄入 Responses 入 input[] 抛 HTTP 400 "Invalid value: 'tool'")+02a4d6695 (#16587)单次 same-target retry 在 fallback 前(_is_transient_transport_error()闸) +399b8ee5f (#42155)Anthropic kwargs sanitize(Responses-onlyinstructions/input/store/parallel_tool_calls在 api_mode-flip 罕见 race 抵达 native Anthropic SDK 抛 non-retryable TypeError 杀整 turn;双 dispatch site 加sanitize_anthropic_kwargs()drop in place + WARN log #31673 breadcrumb)— Plugins 集群:ccacfdbd6 (#41066)_discover_all_plugins()recurse 2 level 发现web/* / image_gen/* / browser/* / video_gen/*之前 flat iterdir 漏;_plugin_status()双查 manifest name AND path-derived key +2b89afec7补 enable/disable mutation path(之前cmd_enable/cmd_disable经_plugin_exists()只查 top-level)+47d5177a7 (#42150)lazy-singleton 线程安全 helpers(get_honcho_client()与 fal_load_fal_client()用 unlocked check-then-init 让 racing thread 都跑昂贵 build、loser client open connection 泄;新建plugins/plugin_utils.py两 thread-safe lazy-singleton helper 闭 honcho TOCTOU #24759)— Install/Update 集群:e88116256git fetchscope 到目标 branch(baregit fetch origin拉数千 auto-generated branch 让 installer 与hermes update停几分钟)+fc0900d12+5d7abf911+a5c12f5f5 (#40998)commit-less checkout 重 clone 不删(rename 到<dir>.broken-<ts>backup 永不 destructiverm -rf) +4219a91df (#41940)nixaddToSystemPackages时 config.yaml 改 0660 group-writable +d02a59b67 (#41867)+7230fcb7f revert (#42151)nix cold npm 构建 +15c99b437 (#40690)NixOS node-gyp PYTHON env — Hindsight/ACP/Curator:09d66037f (#40605)Hindsight 仅新回合 delta 上送 +777dc9da6 (#41724)ACP session provenance 元数据_meta.hermes.sessionProvenancederive fromparent_session_id/end_reason不持久化 - 让 client 不再需要解析 status text、猜 token drop、读 state.db 新建acp_adapter/provenance.py+9b631e4ae+f5bd09af4ACP interrupt sentinel 简化(共用INTERRUPT_WAITING_FOR_MODEL_PREFIX唯一来源 of truth in conversation_loop.py,server.py 净 -17 LOC) +8e223b36e (#41817)Curator 加PROTECTED_BUILTIN_SKILLS ({plan})守 master gateis_curation_eligible()+ 候选枚举防 LLM consolidation pass 看到(之前 curator idle-archival 路径可 archive bundledplanskill 让/plan沉默返 Unknown command)— Terminal/file-tools:6459b3d99CWD-only override collapse 到 'default' 容器(让 TUI/gateway/dashboard 共一 long-lived container 让一次认证外部服务后跨 session 复用)+329c33dac补:collapse 后三 call site 仍 route lookup 经 collapsed id,写在 raw task_id 下读在 collapsed id 下 CWD-only override 的 cwd 被静默丢,env 在错根启动 exit 126 +e45b74583 (#41861)file-tools 拒收 sentinelTERMINAL_CWD,worktree edits anchor 在 live cwd 存在前(之前 fresh worktree session registry 空 staleTERMINAL_CWD='.'既无 worktree anchor 也无 warning,相对 write_file/patch 静默落主 checkout)— Slack channel-only scope #15421 + Volcengine 工具名 XML 片段剥 #33007 + WeChat 输入指示器 ticket 600s 过期刷新 #38085 + ollama default_max_tokens 65536 修截断到 128 token + custom endpoint 256K fallback 前查 DEFAULT_CONTEXT_LENGTHS + Profiles 跳 default 防重复扫 — 其余:terminal tool 在 markdown 平台渲 ```bash 围栏块替 noisyterminal: "cmd…"行 gated on `BasePlatformAdapter.supports_code_blocks` capability #41215 / TUI `process.on('exit')` terminal-mode backstop #42165(之前 die() 关 mouse tracking 不 reset) / Windows PTY stdin str 替 bytes #41953 / api_server `/health` 报 hermes version #40620 / `hermes_time.reset_cache()` 实现(docstring 提及但函数从未定义 hit AttributeError #41728) / `agent:start/end` hook context 加 `thread_id + chat_type` #41672 / TodoStore 内容长度+计数上限(compression 后重注入防 oversize) / OSC 8 hyperlink 剥(prompt_toolkit 不处 OSC,让 Rich `[link=...]` raw payload 泄入 banner title) / approval/clarify/sudo/secret modal 直绘不走 throttle #41098(之前 60s 超时静默 deny 让 `approvals.mode: manual` 不可用) / stream dropped mid-tool-call 不报 output truncation #42314(之前 finish_reason='length' route 到 output-cap 触 3 次无用 max_tokens-boosted retry + misleading "Response truncated" 错) / TUI 自动 heap dump 防 disk fill(HERMES_AUTO_HEAPDUMP=1 闸 + JSON sidecar + HERMES_HEAPDUMP_MAX_BYTES cap) / aiohttp/anthropic 额外 pin 与 lazy pin 对齐 + generalized regression guard #42335 / 多个 AUTHOR_MAP entry + docs 修补 / `498ae8029a (#41730)` delegate custom-endpoint 凭 endpoint identity 解(之前 parent+child 都 collapse 到 provider="custom" `_resolve_child_credential_pool()` 视作可互换、`_swap_credential()` 覆 child delegated base_url 为 parent endpoint → child 把 delegated model 名发到错 endpoint) / zombie subprocess reap(proc.poll 后调 wait) / dist USER_OWNED_EXCLUDE 嵌套目录不再 drop / image_gen artifact path backend-visible expose -
2026-06-07-update: ~100 commits 单日爆发(hermes-agent
c79e3fd0b → c9863772,仍 v0.16.0,未发新版;GitHubcompare报 108 commits / 290 文件 / 41 contributors,本日 main 线性枚举得 97 独立 SHA;约 62 fix / 12 feat / 8 chore / 6 test / 6 docs / 1 refactor / 1 hardening)— Compression 时间锚定(d87f2939agent/context_compressor.py +32/-1_generate_summary两条 prompt 路径都注_temporal_anchoring_rule把"打算 X"重写为"已于 YYYY-MM-DD X 完成",日期经hermes_time.now()取,时钟失败 fail-open 省略而非阻塞;+114 测试)— Codex gpt-5.5 路由 85% 压缩阈值(0524c9bd5 文件 +218 route-level override 仅 Codex OAuth 路由的 gpt-5.5 因硬钳 272K 窗口提至 85%,其他路由不动;compression.codex_gpt55_autoraise默 true 可关)— Trajectory 配对保护(f10a3309trajectory_compressor.py +81/-10新_is_boundary_clean/_snap_boundary让压缩边界绝不切开 gpt+tool 块,对 RL 训练数据生成尤要紧;+121 测试)— Onboarding 结构化 profile-build(cb3e41e25 文件 +174:新建agent/onboarding.py +60profile_build_directive()强制 agent 必先征同意 / 严禁沉默读已连接账户 / 经 memorytarget="user"持久化;gateway/run.py +31/-1首条消息 swap intro;hermes_cli/config.py +6新onboarding.profile_build默"ask";+73 测试)— Desktop 统一 overlay 设计系统(f033b7d833 文件:所有 overlay raw<button>统一到共享Button+ 共用shadow-nous+--stroke-nous发丝边线 + 1px inset outline +BrandMark替 sparkle +LogView/ErrorState/SearchField/OverlaySplitLayout跨 feature 复用;随附d165933 DESIGN.md成文规范)— Desktop 工具后端完整 GUI 配置(20fd0bdesettings/constants.ts +103/-2ENUM_OPTIONS含 10 TTS provider / 6 STT / 6 Terminal 全下拉 + 每后端字段 voice_id/language/model/device;i18n ja/zh-hant/zh +41 各;配9752434 feat(desktop): run tool backend post-setup installs from GUI)— Desktop+Gateway 远程媒体中转(16786f3b11 文件:新端点image.attach_bytes25MB cap +pdf.attach经pdftoppm150 DPI 渲染 PNG 50MB/25 页 cap +GET /api/mediabase64 data URL 限白名单扩展名 + media root;Desktopuse-prompt-actions.ts +47/-4remote 模式自动切上传字节;media.ts +22isRemoteGateway/gatewayMediaDataUrl)— Desktop per-session 回合计时器(9d7268075 文件 +142/-8:把$turnStartedAt从全局搬到ClientSessionState,修后台仍跑回合切换显示从零的假象)— Dashboard 字体独立选择器(9e63109811 文件:新建web/src/themes/fonts.ts含 Inter/IBM Plex/Atkinson Hyperlegible/Fraunces/JetBrains Mono 等 11+;ThemeSwitcher.tsx +119/-4 FontSection与主题正交 survives theme switches;后端web_server.py +46)— 三平台 fail-closed 安全波(f6f3636 Discord+410cb743 Slack+3fa15b33 Feishu:组件按钮 / 卡片 actions / 审批+slash-confirm 默认拒绝必须显式命中 user/role 白名单或*_ALLOW_ALL_USERSopt-in;Discord_component_check_auth +19/-18+ 93 测试,与 Telegram/Matrix 契约对齐)— approval denylist shell-escape 剥除(621bf3a2 文件 +11/-2 关 #36846/#36847:tools/approval.py:_normalize_command_for_detection +4剥\\([^\n])反斜杠 +''|""空字面量;tui_gateway/server.py +7/-2之前except ImportError: pass改 fail-closed 返 error 5001)— skill_view 路径穿越拦截(56f833e2 文件 +95/-1 关 #40566:tools/skills_tool.py:_skill_lookup_path_error +57/-1三检 POSIX/Windows 绝对路径 +..traversal + Windows 盘符)— memory tool shadow 拒绝(fe8920d2 文件 +73/-1 关 #40902:MemoryManager.add_provider与_HERMES_CORE_TOOLS比对命中即拒入路由表防clarify/delegate_taskdispatch 劫持;built-ins always win)— Bitwarden zip-slip 防御(8f7567c)+ api-server REST cron prompt 扫(0c48b712 文件 +113:POST/PATCH /api/jobs/*调_scan_cron_prompt()与 agent tool 共用扫描器,defense-in-depth)— SEARXNG_URL config-aware 自动侦测(7df81d05HEAD merge #41482:新_env_value()先查get_env_value()后回落os.getenv();让 config-only 设的 URL 也进 auto-detect cascade)— URL 非 ASCII percent-encode(333f01bPR #41430)— Skillsbrowse全目录(1892e22关 #41413:_PER_SOURCE_LIMIT["hermes-index"]5 000 → 1 000 000 让 ~90k catalog 全可见)— Kanban scratch 父清扫补漏(9405cd0主 +76f0178补 2 文件 +89:非 scratch 子完成时早 return 前先跑 parent sweep,修永久 scratch 工作区泄漏)— TUI SSH cwd 保留(0e0d7042 文件 +91/-11:新_terminal_task_cwd()non-local backend 保留远端路径不被本地化清空;+f9ea492测试)— Pillow 提核心依赖(b13ab0bpyproject.toml +14/-8:oversized image 缩放在 vision-embed 关键 + 修 lazy-install 在 prompt_toolkit 持终端时锁死 #40490;[vision]extra 收为空 back-compat alias;+5b55f4fuv.lock 同步 +c3d750c+d47f919教训外推所有 lazy-install 在 prompt_toolkit 持终端时强制prompt=False)— 自定义 provider v11→v12 迁移保留 models 映射(887295b3 文件 +134/-17:新_custom_provider_entry_to_provider_config保models/context_length/rate_limit_delay/discover_models/extra_body/api_mode→transport/model→default_model不丢 per-model context_length 元数据)—model.default_headers三处一致生效(a216ff8agent 主 +ffe6652aux #40033 +591e6fbcomputer_use)— Kimi 严格 thinking ⊕ reasoning_effort(ce4e74b+03392b6opencode-go 同契约)— Windows 强化(210f4e7+8720023+5dee40fpowershell.exe 绝对路径 /b08662bstderr Unicode handler /fc086daJOB breakaway /fe0b3f2watcher Popen 重试 /f3af489install.sh root-owned npm cache 提示 #39688 /bec0796+fe2942acolor-emoji fallback #40364)— MCP 已 ready 跳过 preflight(af08c43关 #40604)+ cua-driver MCP stdio 重连(365437e)— 杂修:qqbot WebSocket 100% CPU spin(3eeca46)/ ffmpeg TimeoutExpired(3289d4a)+ subprocess 超时守护(7223f22)/int(os.getenv())守护(2912d94关 #40598)/ Simplex display name(490c486)/ Honcho env fallback(e2cc24e)/ image-gen Codex 改 gpt-5.5(bb53edc)/ OpenRouter 输出 cap 解析(1fb99b1)/ Inventory force_fresh_nous_tier 仅 keyword(44c0c2d+eb70ab8)/ Desktop bootstrap install.sh 404 fallback(02aad08)/ 裸 URL autolinker 末尾 emphasis(349a3f6关 #41093)/ 同 provider 换 model 保 base_url(0507e46关 #41121)/ destructive-slash 取消返 bool(136dae7关 #40583)//modelper-session 不泄进程 env(5a3092b关 #41120)/ Desktop session 列表按 profile 过滤(b55ac45)+ Gateway startup 加固(330ca45)/ TUIliveSessionCount只变值时 patch(8992955)/ uninstall Chat GUI 不动 agent(5b43bf72)/ Home Assistant 从/updateallowlist 退出(f4a73ab)/ install/TUI/workspace 安装作用域 6 连(4bf5202+0416f85+675fb10+1c0437d+7db7a94+f2e8234)/ Bitwarden 无 TTY 早报错(89040e0)/ OSVnpx --packagehonor(c0424b0)/ 6 docs 修补 / 5 chore(release) AUTHOR_MAP -
2026-06-06-update: 75 commits 跨日同步(hermes-agent
66a6b9c930 → c79e3fd0b,v0.15.1 → v0.16.0 "The Surface Release",874 commits · 542 PRs · 170 contributors · 399 issues closed 自 v0.15.0;约 47 fix / 15 feat / 6 refactor / 5 test / 1 chore / 1 docs,约 24 小时窗口)— v0.16.0 发布(3c231eb39:pyproject.toml:10+hermes_cli/__init__.py:17 __version__ = "0.16.0"+__release_date__ = "2026.6.5")—/version全栈贯通(9c1bb8d2c+30340eae2+78122c52c:hermes_cli/commands.py:219 CommandDef("version", aliases=("v",))+ CLIcli.py:9076-9079+ Gatewaygateway/run.py:10942-10946 _handle_version_commandreuseformat_banner_version_label()含 git SHA + Desktop slash-command + Slack/q因 50 槽硬上限被新/version顶出去仍可/hermes q触达)—/usage用量感知 Credits 系统(fcb1944b433 文件 +4535/-26:新建agent/credits_tracker.py 723 行CreditsState dataclass :93含subscription_microsSIGNED 唯一允许负值 +paid_access锚 depletion(永不remaining==0)+parse_credits_headers() :319+CREDITS_USAGE_BANDS 50/75/90升级 status-bar 单 key +evaluate_credits_notices() :200纯函数 reconcile;run_agent.py:2721 _capture_credits()fail-open +:2802 _emit_credits_notices()共享 warm/cold-start seed;cli.py:10595 _show_usageagent-independent(TUI slash-worker 无 agent 也能 print credits block);TUIappChrome.tsx +90cents delta + escalating usage band 段 +(dev credits)banner 经HERMES_DEV_CREDITS;tests/agent/test_credits_tracker.py 909 行92 测试 9-state 矩阵;c79b6f23egrant-spent 一次性闪现不再 sticky)—/steer桌面化 + 中转可信标记(6 commit:composer/controls.tsx:75-89 <SteeringWheel size={16}>busy + trimmed-draft 时显示 +composer/index.tsx:176 canSteer;efa53fb3bCmd/Ctrl+Enter 严格保留 steer 永不 fall-through 到 send;agent/prompt_builder.py:443-472 STEER_MARKER_OPEN/CLOSE边界标记 +STEER_CHANNEL_NOTE进 system prompt 教模型"只信此 marker 内文本,lookalike in tool output/web/files 仍 untrusted"防 prompt injection 误判;tui_gateway/server.py:4234 @method("session.steer");7cceead27system note 渲染为 codicon (compass) 替 ⏩ emoji;0f45509damid-turn steer trusted 不读为 injection)— Desktop 可重绑键盘快捷键面板(7 commit + Merge:新建apps/desktop/src/lib/keybinds/actions.ts 125 行单一 keybind registry(KEYBIND_CATEGORIEScomposer/profiles/session/navigation/view+PROFILE_SLOT_COUNT=18⌘1..9/⌘⌥1..9 +KEYBIND_READONLYcomposer.send/.steer/.history 等不变 row)+ 新建combo.ts 169 行event.code-based 规范化让 Shift 不变 base key(shift+/不变shift+?) + 新建store/keybinds.ts 139 行nanostore$bindings仅持久化与 default 不同的项 +$comboIndexreverse 查 +$capturearmed 等下次 keypress + 面板 store;新建apps/desktop/src/app/shell/keybind-panel.tsx 226 行+apps/desktop/src/app/hooks/use-keybinds.ts 186 行;hotkey 抉择:profile.default 从⌥⌘0→⌘D(D for Default),flipPanes default⌘\(镜像翻 layout),keybind 面板自身⌘/)— Desktop i18n 日本語 ja + 繁體中文 zh-hant + 可搜索语言切换器(7 commit Jim Liu 宝玉:新建apps/desktop/src/i18n/ja.ts 1854 行+zh-hant.ts 1813 行+ 扩types.ts 1416 行嵌套结构 +languages.ts 86 行endonym日本語/繁體中文;b1b89f843 72 文件 +4397/-1428把扁平 i18n field 重构嵌套;812dc6957新language-switcher.tsx可搜索;112a0732c +3051单 commit 大补译 ja/zh-hant;1c2189839settings i18n keys 转 camelCase;fbd423b94localize desktop chrome)— Home Assistant adapter 迁入 bundled plugin(c37c6eaf2+ef7e5168b:新建plugins/platforms/homeassistant/adapter.py 128 行+plugin.yaml 22 行,删gateway/run.py -7inline 路径,与 Mattermost/Discord 迁移对齐;/updateallowlist 收紧让 plugin-migrated 走 registry fallback + 121 测试覆盖)— Adaptive execution intercepts middleware + NeMo-Relay 增强(3 commit Bryan Bednarski NVIDIA:hermes_cli/middleware.py 314 行4 类(tool_request/tool_execution/llm_request/llm_execution)+next_call单次性 +_safe_copydeepcopy 兜底 + translated downstream 失败 propagate;HEAD 8 处 Hermes call site(agent/conversation_loop.py:1243,1375+agent_runtime_helpers.py:1637,1806+tool_executor.py:184,227+model_tools.py:987,1114);plugins/observability/nemo_relay/__init__.py 836 行加adaptive_enabled/adaptive_mode字段 +ctx.register_middleware("llm_execution"/"tool_execution", ...);新建docs/middleware/README.md 260 行;总 +2168 行 +614 行测试)— Dashboard Skills hub 浏览器重做(56236b16e4 文件 +1281/-72 +e6de6dd55详情对话框间距):新端点GET /api/skills/hub/sources :6790列 hub + trust tier + GitHub rate-limit + featured + installed map /:6894 preview读 SKILL.md 文本+文件清单不安装 /:6955 scan跑 quarantine + scan_skill + should_allow_install 安全 verdict /:6849 search加 per-source counts + timeouts;前端web/src/pages/SkillsPage.tsx 1442 行HubBrowser landing connected-hubs strip + featured grid + trust-color cards + Detail dialog 读真 SKILL.md + 视觉安全扫描 + GitHub repo link;4 新端点 test class)— Dashboard 工具后端完整 GUI 配置(2bf0a6e767 文件 +866):CLI 新子命令hermes tools post-setup <KEY>非交互 +valid_post_setup_keys()校验防注入;3 新端点PUT /api/tools/toolsets/{name}/env :7706写~/.hermes/.env+POST /api/tools/toolsets/{name}/post-setup :7764spawn-action 跑 install hook + tail log;新建web/src/components/ToolsetConfigDrawer.tsx 448 行全生命周期 enable/disable/pick provider/save key/run install hook+log tail)— Desktop 暴露hermes model全 37 provider + stale-aux pin 警告(e8c837c92+b91aade178 文件 +411 + 7 文件 +217:/api/model/options加include_unconfigured + picker_hints + canonical_order让 GUI 看到全宇宙;apps/desktop/src/app/settings/model-settings.tsx +174inline "paste key → Activate" 流;switch main 时/api/model/set scope:'main'返stale_aux让 Desktop 显 banner + "Reset all to main" 提示,永不自动清 pin —— 专门便宜 aux 是合法配置 surface-and-offer 而非 nuke)— Gateway/Desktop macOS 26 launchd 降级(59c273ba3 +279/-33+360630733 +104/-37:hermes_cli/gateway.py:3002 _launchd_domain() user/<uid>替gui/<uid>(macOS 26 后者返 error 125)+:3015 _LAUNCHCTL_DOMAIN_UNSUPPORTED_CODES = frozenset({5, 125})持续不支持时:3051 _spawn_detached_gateway()真 detach 用nohup hermes gateway run --replaceworkaround,logs→gateway.log,PID 经 gateway.pid 跟踪让 stop/status/restart 继续工作;184 测试)— Composer Arrow 历史 + 队列融合 + drop-shadow 删除 + IME compositionend flush(8 commit:新建composer-input-history.ts 158 行+ 147 测试 ArrowUp/Down 翻已发送+queued 史 + queue 非空时 ArrowUp 编辑 queue 末项;0cbcc7593queue 可靠性 14 文件 +656/-122;e375c33f7 +71/-25TUImessage.complete边界 force-send 一次中断路径 queue+interrupt 替 optimistic send;40386f33e删shadow-composer平衡 Apple HIG;8e629b9f3 +25/-11onCompositionEndflush 修 IME #39614 + 三测 中/日/韩)— Desktop About panel 显活版本 + macOS updater repair + OAuth path 修(3 commit:16beab421 +19seedapplicationVersion: resolveHermesVersion()经hermes_cli/__init__.py读 + click handlershowAboutPanelFresh每次开重解,in-place update 无需重启 reflect;0c0a70774updater helper paths.rs 路径解析;b8234e759+be2c64be0抽oauth-net-request.cjs 20 行helper + 34 测试避受限originheader + serializeJsonBody wire 进生产路径)— FTS5 ":" 脱毒 + delegate content-block(d1771114e+f83918c31+f8a241e10:hermes_state.py:2708-2739 _sanitize_fts5_queryStep 2 在 strip 字符集[+{}():\"^]加:(col:term operator 在单 content 列上TODO: fix抛 no such column 被吞为零结果)+ 25 测试;tools/delegate_tool.py +33_stringify_tool_content拍平 content-block 数组([{"type": "text", ...}]blob)+ error block 识别;_extract_output_tail同走 helper)— CLI 更新时隔离 hermes.exe(ebed881d4:抽_run_quarantined_installhelper 让 dep-verification repair 同走 rename-out-of-the-way/restore-on-failure;hermes_cli/main.py:8776 _hermes_exe_shims+:8791 _detect_concurrent_hermes_instances用proc.parents()整祖先列扫 + 只排 shim 父进程;:8934 _quarantine_running_hermes_exe;:12836扫 stalehermes.exe.old.*清理;regression test fail on old / pass on new)— Desktop log 大小封顶 + 级联轮转(abbf05024+146e77684apps/desktop/electron/main.cjs:265-268 DESKTOP_LOG_MAX_BYTES=10MB / BACKUP_COUNT=3 / DISCARD_BYTES=40MB:mirror PythonRotatingFileHandlercascade live→.1→.2→.3 drop 最旧;steady-state ~40MB;DISCARD_BYTES 上 ceiling 直接删 multi-GB boot-loop 巨档自愈用户磁盘;同步/异步两路径都 try/catch 保 startup/shutdown 不被 logging 错阻;伴2820d87eatolerate staledashboard --tuifrom 旧 desktop shell back-compat guard 防 crash loop)— Middleware next_call 单次性 + deepcopy 兜底 + translated 错误保留(c4c5548eb+5abe45674:hermes_cli/middleware.py:258-302next_call单次性守护抛 RuntimeError 防 silently re-run downstream;:58-74 _safe_copy()deepcopy 失败回退 shallow dict copy 防threading.Lock/callbacks/file handles 在 payload 时整 middleware pass 被 abort;translated downstream 失败 propagate 不再返 None;BaseException 不 wrap)— Install Windows npm TLS 证书侦测(fd234bad6scripts/install.ps1 +40新Show-NpmCertHint检unable to get local issuer certificate给 actionableNODE_EXTRA_CA_CERTS/strict-sslremediation 修企业 MITM proxy / 缺 root CA 误读为权限问题 #38016)— Gateway plain text while busy 默认 interrupt(54e7b74f74 文件 +52/-18 关 #38390/#31588:busy_input_mode重夺单源真理,busy_text_mode沦为遗留显式 override;所有默认 fallbackqueue → interrupt;gateway/run.py:3223-3245 _load_busy_input_mode/_load_busy_text_modeHEAD 实证;伴 portscompression.enabled=false时 long-context 429/413/context-overflow 不再静默_compress_context()而是终结错compaction_disabled: True)— 杂项:50f9ad70fDashboard cron 派单下拉读已配置 platforms /338c07433send-message ntfy topic 当显式 /ea266f43erg/grep search error guard 接 partial matches 保留 +266 /7c4aa3e4d+c79e3fd0bimage-gen artifact 路径暴露 backend-visible + 抽map_cache_path_to_container共享 helper /5af899c7cprofile alias 显示反向查 wrapper dir /e6de6dd55skill 详情对话框间距 /78122c52c/qtest 因/version占槽更新 -
2026-06-05-update: 289 commits 跨日同步(hermes-agent
6fff744158 → 66a6b9c930,仍 v0.15.1;163 fix / 45 feat / 21 style / 16 chore / 10 docs / 7 test / 7 refactor / 2 perf / 1 revert / 1 polish;日产能 06-03:57 / 06-04:176 / 06-05:53 / 06-06:3)— Desktop 多 Profile 革命:Arc 风格 Profile Rail + 跨 Profile 会话聚合(b94b3622b52 文件 +2517 / -796:新建apps/desktop/src/lib/profile-color.ts 71 行确定性 hash hue + 12 swatches +apps/desktop/src/store/profile.ts 299 行5 nanostore atom + localStorage 持久化 +apps/desktop/src/app/chat/sidebar/profile-switcher.tsx 491 行dnd-kit 横向 reorder + 右键/长按 ContextMenu +hermes_state.py:3189 session_count(exclude_children)+hermes_cli/web_server.py:1637 get_profiles_sessions)+ 并发多 Profile Gateway Sockets(4891f9ae712 文件 +585 / -173:新建apps/desktop/src/store/gateway.ts 290 行含primaryGateway+secondariesmap + 1s/2s/4s..15s 退避 +activeGateway()路由 +ensureGatewayForProfile()单 profile fast-path,approval/sudo/secret prompts 改 per-session keyed-by-sessionId 暂存通过 needs-input 徽章呈现不再 hijack foreground)+ 每 Profile 独立远端 Gateway 主机(#39778,7 文件 +379 / -104:新建apps/desktop/electron/connection-config.cjs 254 行含profileRemoteOverride纯函数 + 6 单元测试 +resolveRemoteBackend(profile)4 级 precedence override→env→global→local,告别 "Profiles unavailable when connected to remote" 硬抛)+ Profile rail 14 条 follow-up(rename/delete 右键、drag-sort、长按选色、fluid haptic reordering、单 profile "+" 入口、"+" all-profiles 视图按 profile 起 session、cell-by-cell 步进、x 轴锁、session-id 搜索 SQL-bounded、session.titleRPC 让/titlework、aux model 搜索移除)— Desktop 全局 Cmd+K 调色板 + UI 一致性大扫除(ac9de2e80+ 15 style/feat commit:新建apps/desktop/src/app/command-palette/index.tsxcmdk +store/command-palette.tsopen/close/toggle + Cmd+P 别名cfbc47d89+ 共享 SearchField/ErrorState/Badge primitive + controlVariants 统 Input/Textarea/SelectTrigger +8c0f15478减按钮缩放 + flatten appearance settings + kill focus rings 全局 + boxless text 按钮变体)— Desktop i18n 简体中文 zh-Hans + 配置持久化(4a1907bd136 文件 +4226 / -1378 +1d9c3ebae21 文件 +830 / -135:新建apps/desktop/src/i18n/模块 2431 行含types.ts 610 行 Translations interface+en.ts 744 行+zh.ts 873 行+languages.ts 56 行endonym简体中文+runtime.ts/context.tsx/catalog.ts+ 24 屏改 hard-coded → t 对象 + Appearance 设置加 Language 下拉 + 改读 Hermes config 让 Desktop ↔ Dashboard ↔ CLI 共享语言)— Dashboard Auth 三新 provider:BasicAuthProvider 用户名/密码(acb0e2bac新建plugins/dashboard_auth/basic/__init__.py 491 行无外部 IdP 无 DB + scrypt password_hash + stateless HMAC token + env 赢 config.yaml 与 Nous 一致)+ SelfHostedOIDCProvider 通用 OIDC(f57ce341d新建plugins/dashboard_auth/self_hosted/__init__.py 736 行Authentik/Keycloak/Zitadel/Authelia/Auth0/Okta/Google 全兼容 — discovery + PKCE S256 + ID token RS256/ES256 验证 vs JWKS uri / iss / aud;public PKCE clients only# TODO(confidential-client))+hermes dashboard register(bb291b6bbhermes_cli/main.py:12403 cmd_dashboard_register+:15712-15754subparser 含--issuer/--client-id/--portal-url)+ Desktop username/password 远端 gateway 登录(bd12b3c23+9d07927a2OAuth-aware + scheme probebf590c81d+ dead WS ticket 回避385a508e4+ 重新 mint OAuth WS ticket on reconnect928f1ac0e)+ed63170epluggable non-redirect password 登录+ Verify chain 一 provider 错不短路(616c0a36b)— Discord 语音频道软件混音器(8a9ded5b26 文件 +952 / -1:新建plugins/platforms/discord/voice_mixer.py 378 行 :148 class VoiceMixer(discord.AudioSource)自己即 AudioSource,每 20ms 调read()把 child sources 加和 clamp int16,48kHz/2ch/int16 LE/20ms 3840 字节 ==discord.opus.Encoder.FRAME_SIZE;ambient idle bed 始终低音量底色 + verbal acks/TTS 在 speech 通道覆盖并 duck ambient gain;安装一次vc.play(mixer),children 增删,永不 stop 无is_playing()race;threading.Lock 守跨线程 state;test_discord_voice_mixer.py 264 行测试)— Telegram QR 入门 CLI + Dashboard 双面(6bf55a4734 文件 +833:新建hermes_cli/telegram_managed_bot.py 358 行扫码 → 自动消息 → 用户 id 写 allowlist + bot token 写 config,告别 BotFather 人工 token 复制;tests/hermes_cli/test_telegram_managed_bot.py 323 行+hermes_cli/setup.py +117 / gateway.py +51接入;Dashboard 同样 QR 入口2f0c8e90e)— Feishu 视频会议邀请事件(f3bbfda6dgateway/platforms/feishu.py:1635-1636,2481,3372订阅vc.bot.meeting_invited_v1+ 新建gateway/platforms/feishu_meeting_invite.py 212 行 handle_meeting_invited_event投递结构化通知给 agent;731475787 refactorslim parser)— Gatewaymax_tokens全链路传播修复(#20741,4 commit:cf786593cgateway/run.py:1205-1232 max_tokens chain优先级HERMES_MAX_TOKENS > model.max_tokens > custom_providers max_output_tokens > None+:2621,2719session override/runtime_kwargs;1c909e75eCLIcli.py +14路径补HERMES_MAX_TOKENSenv override;14275d7bahermes_cli/runtime_provider.py:477 _lift_max_output_tokensacceptsmax_output_tokens或max_tokenssibling 字段 +:559,581,631,720,7595 处 call site;2dda393f9 tests/gateway/test_max_tokens_propagation.py +178回归保护)—discover_models在 named-custom 流接上(2 commit7ae8aac3b+4b2d00f84共 +294 行,custom_providers section 4 与hermes model named-custom不再静默忽略discover_models: true)— Update 非交互默认 stash/restore(72eb42d9e8 文件 +335 / -255 revert #38542/#39568:hermes_cli/config.py:2287-2293 non_interactive_local_changes新 key 默认stash+_config_version 26→27;hermes_cli/main.py:8378-8423 _discard_stashed_changes()永不reset --hard/clean -fd用 stash + drop 保 ignored 路径生存;scripts/install.ps1 +76Windows 同步 stash 替git reset --hard HEAD+ 只在真控制台 prompt restore + stash 保留含恢复指令;205 测试 4 case 覆盖 discard/stash/interactive/missing-section)— Update Windows 卫生 4 连:db204ae20 ensure_uv()穿越更新边界(首次安装后 hermes update 不崩)+d880b5be0Windows 不返_UvResultnamedtuple(subprocess argv 崩)+98528c78c 178 行desktop 不与自身后端 race(先 graceful 拉自身再 spawn 升级器)+14fee4f11 +33retry handoff 一次 +1f347ee54venv "move aside" 而非 gut(Windows 锁 .pyd) +c136eb4derebuild 后验 core deps — hermes-ink SGR 鼠标分片根因修复(f35432354supersedes #29337/#17701/#18113/#26781/#28463/#35512:ui-tui/packages/hermes-ink/src/ink/termio/tokenize.ts +40flush state-aware xterm.js 纪律 — bare ESC 仍 flush,但 multi-byte control sequence (csi/osc/dcs/apc/ss3) 中不emit,one-tick truncation valve 第二次无进展 drop;6efc7eda5 -205 行删 SGR_MOUSE_FRAGMENT_RE/MOUSE_BURST_NOISE_RE/parseTextWithSgrMouseFragments 整套死代码;725290db6fuzz 测试加固)— TUI cgroup-aware V8 heap cap(2f523a469ui-tui/src/lib/memoryMonitor.ts:20-50 resolveThresholds()阈值从getHeapStatistics().heap_size_limit派生 critical ~88% / high ~70% 真 ceiling 替硬编码 2.5GB,受 cgroup 限制的小容器不再静默 OOM kill)— StatePRAGMA wal_checkpoint(TRUNCATE)防 WAL 无限增长(46b2afc56hermes_state.py:597,617-651,4107每 50 次写 off-hot-path + exit/dispose 时 TRUNCATE;19db9cd07ACP 改走公开update_session_meta()不绕封装)— Gemini 原生maxOutputTokens+ 去 OpenAI extra_body 污染(ec46f59127 文件 +277,agent/auxiliary_client.py:662-668translate extra_body.reasoning → Gemini native;e8c3ac2f5Fireworks/Mistral strict APIs 同向 stripextra_content)—perl/ruby -i在 Hermes config/env 路径上落闸(a6a4e6f9d+b04c6e95ftools/approval.py:446-454捕perl -pi -e/perl -p -i/perl -i.bak三形式,与sed -i闸对齐堵 2026-06-01 双闸门遗漏的 perl/ruby 入口)— react-router-dom 7.17.0 GHSA-8x6r-g9mw-2r78(46c16b928+6b77fd2a0Nix npmDepsHash +736dc0fd8切 fetchNpmDeps)— Web SSRF 检查移出 event loop(c60952ba9+93b5df318tools/url_safety.py:355 async_is_safe_urlDNS 不再阻塞 async web_search/fetch;mock 同步更新)— VisionProviderProfileflag 取代 models.dev 目录(d33d23c85+f736d2be8agent/auxiliary_client.py:3958 _main_model_supports_vision走 profile flag)+ 像素维度上限(dd4ba4c2c+6bdbe3076高分辨率小字节也 cap 防 API 拒 + 声明 Pillow)— MiniMax 视频type=videoblock + M3 默认 aux 模型对齐前沿(153fe2847+0b46c4163outbound translate 把 Anthropicinput_video→ MiniMaxvideo;3d1d0a49f+b531b5d12+fa8e2f935minimax+minimax-cndefault_aux_model钉 M3 frontier;9756dff5fGrok-4.3 陈旧 256k cache 失效)— Cron 顺序任务非阻塞 + 解耦完成(9fbfeb31b+eb9cde734cron/scheduler.py:161-195持久 single-thread_sequential_pool保 tick 间顺序但 dispatch 不阻塞;MCP 任务后清扫;30412a977陈旧 cron-output 删前复验 #37721;b0d234f06cron list容忍 nullrepeat)— Docker wave(hindsight-client 烤进镜像96f0ddc6a#38128 / libolm-dev for python-olm2e628ae97#33685 / chown gateway tree03ba06ebf#37928 / chown build trees5446153c9#35027 regression /--user <uid>拒绝 + guidance343c54e35#38579 / Unraid uid 例外7402706c5#38098 / config migrations on boot04d620d91#35508 / persistent 模式恢复 out-of-band 删8a888441d#36631 / 孤儿容器清82c157b26#7440 / Docker 内 update-check 不报 phantom commits behindb1e399de9#39559 / LF entrypoints6ad015255#12181 / .dockerignore Python 模式eb43a5b5d#6092)— Skills 内置集瘦身 +environments:relevance gate(38d3c49aa#39028:内置 skill 删过气 + 新 frontmatter 字段 cli/tui/desktop/gateway/* 决定何时实际激活进 prompt而非仅 UI 展示)— Authset active_provider三入口修(5f62ba8e4xai +cd68b8f0eqwen-oauth +34a290352google-gemini-cli 加auth add后不再 "auth 加完没生效")— MCP${ENV}在 discovery probe 解析 + shutdown 守护扩展(b0a52d74a#38571 header auth env 展开;751b91446probe iteration 失败也 shutdown;e9529578d+1bcfe9c58异常守护从 Exception 扩到 BaseException 不让 SystemExit/KeyboardInterrupt short-circuit shutdown 卡死 child)— Installrequires-python<3.14+ UV_PYTHON 钉 venv + PEP 639 SPDX license + FHS symlink(475ecea3d#38535 +e223503b0#38353 +aeec88c77+36f1cd7deshallow clone +ee7948ea6排除 dev tooling from all extra +b459bac02.bootstrap-marker入 gitignore 让 update 不自动 stash 它)— Gateway 杂项硬化(07f538267dm_policy: pairing不视为 open access 防 mention-gating 误判 /b7169f9bb/update完成通知保留至目标 platform reconnect /2982122beroot-run gateway 投递$HOMEdeliverables /693f4c7e9session_reset race 清 zombie agent slot /454d6cbe5Telegram sealed overflow chunk 显式 finalize 修末块格式 /4ae3c988bshared-key loop 桥接到嵌套 platform 配置 /899ee8c23非 UTF-8 status/pid 文件容忍 /71a9f44e8平台 reconnect 时重试 startup auto-resume /28ca4460akanban dispatcher 守 malformed config + 空 summary /74e845c00Slacksend_message工具补thread_ts/7309f3befLine inbound MessageType 映射 /fff056144Google Chat OAuth client secret 锚 default Hermes root /f7dabd301api-server json.loads 守 SQLite corrupt cache /947e21b3dlog silent file-delivery drops /e7a7872a8tui_gateway dedup re-queued 进程通知 flood TUI /86c64cfb5Discord interactive views 超时视觉过期 /3278b423dstrip session token from subprocess env /2059707fc+40fbb0f3cWindows native default Hermes home + 锚 detached/startup cwd 至 HERMES_HOME /3858cf430named profile 让 global-root active_provider fallback)— Desktop 后续修(f583c6ebd+338f0b223+fef04a197Electron cache 损坏 / Windows bootstrap 修复 /f66a929a6render approval/sudo/secret prompts 不再静默超时 #38578 /58eb473babackground-session clarify prompts 上浮 /b1b0f4b66折叠组工具命令批准仍可见 #38829 /825629424持久 timed-out clarify 到 transcript /5bcb63e40TUI _sessions thread-safety lock /8077e7d2fresume lock narrow /bd6d09876keep resumed live history current /98903d031reuse live session on resume /25742372eexecute_code is_approved guard #39275)— Delegationmax_spawn_depth取消上限(d414275047 文件 +30/-30hermes_cli/config.py:1679-1682 max_spawn_depth: 1floor 1 无 ceiling,拥抱 orchestrator-of-orchestrators-of-orchestrators 自由编排)— Models catalog(fd87c6107qwen/qwen3.7-plus入 Nous + ORhermes_cli/models.py:55,173#39409 /3da44dbda+2a82519b0+ef5e48f3f:1170 nous: deepseek/deepseek-v4-flash作 silent default 替 flagship + guard test 钉死不准未来 PR 又点回 flagship /7f016f5f3Desktop 每 provider 50 model 默认)— 杂项:OpenViking memory URI/agent/{agent}/段修c14c37d46#36969 /de60bf40cmemory 用户安装 provider 父包注册 /30c7b787dmemory pip fallback /46abf0401+dfe6fbb0bSSH WinError 1314 symlink copy2 fallback / Prompt 自知识扩 docs+skillf99665f99#38538 / CLI resume relaunch 在 session 起始 cwde7bc6189c#38562 +391b59475rich [dim] 替 ANSI /ad69d3edc删 CWD 守 /96cd37e21dashboard orphaned embedded-chat session 回收 /9ca11b35d/model picker provider-models prewarm 后台 /af8b917datermux frontend npm scope / 25+ AUTHOR_MAP + 10+ docs 同步
+- 2026-06-03-update: 131 commits 跨日同步(hermes-agent c47b9d126 → 6fff744158,仍 v0.15.1;69 fix / 12 feat / 8 test / 6 chore / 5 docs / 1 refactor / 1 polish / 1 perf / 1 ci)— Observability observer-grade telemetry hooks + NeMo-Relay 插件(#29722 salvage,26 文件 +3187:新 hook api_request_error/subagent_start 入 hermes_cli/plugins.py:128 VALID_HOOKS 共 21 个 + has_hook() 闸 hot path 零开销 + plugins/observability/nemo_relay/ 三文件 568/368/20 行 + docs/observability/README.md 316 行,与既有 plugins/observability/langfuse 并列;827f25142 perf 进一步把 per-tool emit 也闸住,懒派生 status/error 字段)— hermes portal 三 commit 一站化(da4f407e5 成为人类可读 onboarding 别名 11 文件 +200 + cd188b814 真正走 _model_flow_nous 27-model curated picker hermes_cli/setup.py:2723-2790 _run_portal_one_shot + 26a57467a SystemExit 防御 + 9ba7e5b1b retry hints 对齐)— Desktop xAI Grok 升级一等 OAuth provider(dd5e97bd7,5 文件 +434:loopback PKCE 流 hermes_cli/web_server.py:3160-3163 catalog flow=loopback + :3750 _start_xai_loopback_flow +222 行 + 6 后续修复包括 cancel 信号 worker、Copilot review、source_label 修正、OAuth 目录顺序)— Desktop 状态栏 inline model picker(ea4fe1563,11 文件 +788:Cursor 风格下拉替 modal,apps/desktop/src/app/shell/model-menu-panel.tsx 289 行 + model-edit-submenu.tsx 248 行 reasoning+fast hover-Edit + model-visibility-dialog.tsx 148 行 localStorage edit-models + 共享 dropdown primitives DropdownMenuSearch + nanostores 读 session state 防 menu rebuild)— Desktop session/scroll/sticky/clamp wave(~12 commits:in-flight new chats 不消失/不匿名 #37908 + scroll anchor 三连 e67ab2e04/3aa24e261/c930a49ce thread-virtualizer 与 native scroll anchoring 双修冲突 + 0caa23788 IME composing Enter 不再 split + viewport resize 不再误 disarm sticky-bottom + sticky human bubble 4 commit clamp ~2 行带 hover lift 含 --sticky-human-top 0.75rem token + 自定义 zoom 0.1 step 替 0.2 + clipboard image dedupe items/files 双重附加)— Desktop slash/@ 菜单 + Stop 按钮 + 后台 bleed(188e52db9/49f1b9e4b triggerKeyConsumedRef 替 timing-fragile trigger !== null guard 修 Esc 重开 + Arrow 不能 cycle 过头几个 + a23728dfc Stop 按钮真 interrupt 不再 interruptAndSendNextQueued() 抽 shouldAutoDrainOnSettle() + 28f1590b7 后台 session messages 不再 bleed 进激活 transcript 改 keyed-by-sessionId map staging)— Desktop macOS 自更新 clean rebuild(a1cda2410:update.rs rebuild PATH 头插 $HERMES_HOME/node/bin + venv bin + --target-app 参数 + ditto install stage + AtomicBool start_update guard;bootstrap.rs open <App>.app 替 exec 路径;failure.tsx "Update didn't finish";d3b1e4300 提 swap_in_new_bundle() 严格不变式永不留断臂 target;810e5864d LogStream 结构化 metadata 替 stderr: literal 前缀 + 1971b1052 4 处 emit_log 接 LogStream 修编译;746618217 已存在 macOS 安装收编 apps/desktop/electron/main.cjs +145 + 自动重定位到 /Applications + Dock 钉一次;1daecfa4b Dock 图钉用 pathToFileURL + type 15;21e172b94 麦克风 entitlement entitlements.mac.inherit.plist;46e513ef5 Linux chrome-sandbox helper 4755)— Desktop 远端显示禁 GPU(6a2909fe5 SSH X11/VNC/RDP 软件渲染防闪烁 apps/desktop/electron/bootstrap-platform.cjs +51 detectRemoteDisplay + HERMES_DESKTOP_DISABLE_GPU override + d0ea4caf7 WSLg vGPU 本地渲染例外)— Dashboard System 检查后再更新(c5d199ead:GET /api/hermes/update/check :1168 cache 6h ?force=1 失效 + POST /api/hermes/update :1140 + System 页 Check for updates 按钮 + Update now ConfirmDialog 展示 commit 数 + 5 端点测试 git/up-to-date/docker/soft-failure/auth-gate)— Dashboard Profiles 富化 + Channels env 去重(7fb8a6b5c:active-profile 切换 / 角色描述 auxiliary LLM 自动生成 / per-profile 模型 / gateway-running + distribution badges / 新建 clone-all;messaging 凭据 channel_managed 从 Keys/Env 页隐藏改 Channels 唯一;"messaging" → "Gateway" i18n)— Dashboard auth WS origin + PTY internal credential(dd28f2ac9 OAuth-gated 后非 Web origin 信任广义化让 packaged Hermes Desktop file:// 不被 403 + fd1ec8033 _build_gateway_ws_url() 加 gated 分支 PTY child 用进程内 mint-once credential 修嵌入 chat 在每个 gated 部署都不能用 + e114b31ed 直接单测覆盖 7 分支)— Dashboard PTY 维度 WSL2 钳制(966630563:WSL2 cols=131072 rows=1 struct.pack 抛 struct.error 之前只 catch OSError,钳到 [1,2000]×[1,1000])— Gateway ResponseStore + 未挂 adapter 泄 fd 修(4b06c98fe:reconnect 3 失败路径都 drop 新建 adapter 不挂 self.adapters 每次漏 2 fd(db + WAL)~12h 撑爆 2560 fd ulimit #37011 + 01eaba706 Copilot review 接)— Gateway /background 媒体按类型路由(082025abc:TTS→voice / video→send_video / image→send_image_file 替统一 send_document 复用 should_send_media_as_audio 处 Telegram OGG)— Gateway schtasks locale 安全解码(973decc05 Windows 中文 console 不再 UnicodeDecodeError)— Web-server event channel state 从模块全局搬 app.state(cbc82511e:_lifespan() async context manager 在 FastAPI 启动时正确 loop 创建 dict+lock,跨 TestClient/uvicorn reload "attached to a different loop" 修)— Doctor HERMES_MAX_ITERATIONS env 影子 / config drift 检测 + --fix(6ee046a72 hermes_cli/doctor.py:894-922 cfg_max_turns ... env_ghost 关 #17534 - bridge 在更早 config-parse 错时 bail 就让 ghost 默默胜出 → config 显示 400 而 gateway 读 N/90)— Kanban 速率限制非永久阻塞(4c544b633:EX_TEMPFAIL=75 哨兵 hermes_cli/kanban_db.py:158-161 + 冷却 :189-196 HERMES_KANBAN_RATE_LIMIT_COOLDOWN_SECONDS 默认 5min + :4821 rate_limited field + :4873-4884 reap + :5429 worker drain;真 crash 仍 trip 断路器)— Matrix ! bang 命令别名 + 死代码修(0022e94d7/a1264e996 underscore→hyphen 容忍 emit 可解析 token + skill command branch slash-prefixed 比较 + reply-fallback 后再规范化 + 162 测试)— MCP banner disabled 不再 failed(1d90b2398 enabled:false 改 dim 不再红 — failed)— TUI 持久化 trail OOM 修(e76d8bf5a:ui-tui/src/lib/text.ts:2-5 LIVE_RENDER/VERBOSE_TRAIL_MAX_CHARS=800 12 行 preview 替 16KB live-render budget 持久化 trail 掉 17×(12.2MB→0.7MB @800 msgs)+ memoryMonitor.ts 阈值从真实 V8 heap ceiling 派生 ~88%/70% 不再硬编码 2.5GB;e02a6038a TUI /save 写 get_hermes_home()/sessions/saved/ 含 system prompt;dfba3f3e5 右键复制清选区 + 群 transcript blocks)— Aux Nous-routed self-heal(ab2472e69 agent/auxiliary_client.py:2495 _is_model_not_found_error + :1624 _refresh_nous_recommended_model + :5121/:5583 两 call site,长寿命进程缓存 Portal 推荐 model 被 catalog 掉时不再 404 至重启)— CLI display.interface 可配置默认界面 cli/tui(d6b0c23f8 + --cli 显式覆盖 + 两 resolver _resolve_use_tui :1823 和 _wants_tui_early :145 无依赖早期)— Debug 含 desktop.log(1b302a047:hermes_cli/logs.py +2 注册 + debug.py +32 summary report + share 上传 + gateway /debug collect_debug_report() 继承)— Packaging locales/ 进 wheel/sdist/Nix(c349eca82 关 #23943/#27632/#35374:[tool.setuptools.data-files] locales = ["locales/*.yaml"] + MANIFEST.in graft locales + agent/i18n.py:88 _locales_dir HERMES_BUNDLED_LOCALES override → source → sysconfig data scheme + Nix wrapper 双保险,封闭安装下不再渲染原始 i18n key gateway.reset.header_default)— Refactor 单一 managed-uv 路径(4df280d51:新建 hermes_cli/managed_uv.py 228 行 5 函数 managed_uv_path :35/resolve_uv :48/ensure_uv :59/rebuild_venv :101/update_managed_uv :135;替换 PATH probe + conda guards + 5 位置 trust ordering + temp-dir fallback;删 install.sh 61 行 ensure_fts5/_python_has_fts5/_reinstall_python_with_fts5/_warn_no_fts5——managed uv 总装带 FTS5 当前 Python)— Workspace lockfile 整合 + Node ≥20.19/22.12(a51a7b9b9 per-package package-lock.json → root 单一 + Nix lib.nix 共享 + Python _workspace_root() helper + Desktop 内容 hash build stamp 替 --force-build/mtime + Dockerfile 单一 npm install;1dca7c620 Node 版本预检 + 214b7e070 install.ps1 处理 Windows core.autocrlf=true 引起的脏 worktree + 205ed71ba npm audit 6 修 tmp 0.2.5→0.2.7 等 + ba57ebec3 npmDepsHash refresh)— Docker TUI launcher 用 prebuilt bundle(9272e4019 HERMES_TUI_DIR env 修嵌入 dashboard Chat tab 在托管镜像 502 - PTY child 跑运行时 npm install 失败因 root lockfile 含 apps/* workspace 但镜像只装 root/web/ui-tui;d9f7e7ac8 首次启动 seed gateway_state.json from HERMES_GATEWAY_BOOTSTRAP_STATE=running 在 docker/stage2-hook.sh:307)— Cron skill bundles 展开(ae5b2de2f cron/scheduler.py +26 from agent.skill_bundles import build_bundle_invocation_message, resolve_bundle_command_key)— Setup browser/TTS picker 默认指向免费本地后端(b28dd3417 不再 Enter 即走 inline Nous Portal device-code 付费)— Submodule + RELEASE 清理(43fd63b4b 7 文件 -35 + 047e7cf36 残留 CONTRIBUTING.md / 64202200a 15 个 RELEASE_v*.md .gitignore 防)— 杂修(192020992 + 5fca754ee HERMES_DESKTOP_CHILD_PID 排除 desktop-managed backend 在 stale-dashboard kill 端到端关 #37532 + 6ed9a2de8 dashboard 远端 bind 允许 desktop WS origin + a429a2a0b CI nix flake check 折叠 package+devShell + bb1c8b6f1 honcho prewarm 去 flake + AUTHOR_MAP 4 entry + 5 docs 远端 backend 自含 + --tui flag + session token 钉法)
-
2026-06-02-update: 104 commits 跨日同步(hermes-agent
b9646276f → c47b9d126,仍 v0.15.1;43 fix / 23 feat / 7 test / 6 refactor / 5 docs / 5 chore / 1 ci)— Dashboard 第二轮全面强化:Channels 页面(#37211,web/src/pages/ChannelsPage.tsx +429一站式启停/测试 20+ messaging 平台 +web/src/lib/api.ts:476-490三 client 方法 +STATE_BADGE :34-49状态徽章)、完整管理面板 v2(#36736,hermes_cli/web_server.py +665新增 6 类后端端点:GET /api/mcp/catalog :4602、PUT /api/mcp/servers/{name}/enabled :4583、GET /api/system/stats :757、PUT /api/webhooks/{name}/enabled :4903、GET /api/ops/hooks :5242、GET /api/skills/hub/search :5496+ 6 个前端页面扩展)、nous-blue主题 + bulk sessions + schedule picker(#37383,41 文件 +3299 / -213:LENS_5I overlay 移植 + foreground z-index:200 修视觉伪影 + 14 种 i18n 同步 +web/src/lib/schedule.ts +382新建 +SessionsPage.tsx +407)、Dashboard auth refresh-token cookie 轮转(#37247:plugins/dashboard_auth/nous/__init__.py:244-302 refresh_session()+middleware.py:236,255,302AT 缺席 + RT 存在不再硬 401,3 回归 case)— Gateway 结构化 stream-event 协议(#37250,8 文件 +740:新建gateway/stream_events.py 171 行7 frozen dataclass(MessageChunk/MessageStop/Commentary/ToolCallChunk/ToolCallFinished/LongToolHint/GatewayNotice)+ 新建gateway/stream_dispatch.py 132 行 GatewayEventDispatcher+platforms/base.py:1873,1934,1955三 hook(supports_draft_streaming/render_message_event/format_tool_event)+ Telegram draft MarkdownV2 对齐告别 raw→formatted 跳变:2498,2535-2542)— Per-platform streaming 默认值(#37303,config.py:1365-1368 platforms.telegram.streaming=True/discord.streaming=False,deep-merge 不动用户值,不 bump_config_version,dashboard 自动暴露 toggle)— TUI 单一/model+ 统一 Sessions 浮层(#37112,17 文件 +480/-347:/provider别名收归 +activeSessionSwitcher.tsx :48-394合并/resume//sessions//session//switch入一浮层 + armed-delete 按 session id 而非 row index 防 1.5s 轮询重排错杀)— Agentruntime_cwd单一真源(8 commit:新建agent/runtime_cwd.py 62 行5 函数_SESSION_CWD ContextVar+resolve_agent_cwd()主用带 isdir guard +resolve_context_cwd()不 guard 给本地 CLI 留 fallback;接system_prompt.py:43+prompt_builder.py:17,806;修 #24882/#24969/#27383/#29265 多年悬而未决的 cwd 不进 system prompt;40 测试 +desktop:31c40c72project folder session 稳定化基于此)— Model picker 模糊搜索(3 commit:新建web/src/lib/fuzzy.ts 192 行+ 镜像ui-tui/src/lib/fuzzy.ts 177 行+ 109 测试,subsequence 评分 exact +20 / prefix +8 / boundary +3 / contig +5 / first +5 / gap penalty -3,fuzzyRank<T>()泛型 ranker 返 matched positions 给<mark>高亮;查询g4o匹gpt-4o、clad snnt匹claude-sonnet)— Desktop session 卫生/archive/media streaming(#37099,26 文件 +1000:tui_gateway/server.py:2771-2824lazy DB row 不再泄 "Untitled" +hermes_state.py:267 archived INTEGER NOT NULL DEFAULT 0+:1434-1448 set_session_archived()+:3270-3309empty 计数/删只看非 archived + Electronhermes-media://协议main.cjs:375-427Range 支持 + STREAMABLE_MEDIA_EXTS 白名单去 16MB cap)+ 9 后续修复(cancellable install / sidebar 搜索 / workspace 排序 / pinned 跨折叠保留 / model 与 skills+tools UI 合并 / content-hash build stamp--build-only/--force-build/ GUI triage 38 文件 +1638 / project folder session 稳定 / toolset provider 显示)— Skills hub browse cap 修复(#37143:hermes_cli/skills_hub.py:343 _PER_SOURCE_LIMIT补"hermes-index": 5000修 silent 50-item cap + Identifier 列复制 + source links + 网页门户 13 测试 + 类别 430→173 整理)— Cron skill 不可见 unicode 改净化非硬阻(#37245:tools/cronjob_tools.py:184-210 _strip_invisible_unicode返(cleaned, removed)保留 emoji ZWJ;净化后再扫让真注入仍能匹)— MCP HTTP fast-fail(2 commit:tools/mcp_tool.py:1480-1553 _preflight_content_type()HEAD→GET 回落,≤5s 检 HTML 抛NonMcpEndpointError不 retry,告别 hang 满connect_timeout)— Kanban 子任务/kanban_create继承根 workspace(#37172/#37182:kanban_db.py:4355-4408decompose 取根workspace_kind+workspace_path,子继承不强制 scratch;HERMES_KANBAN_TASKenv 让 worker 看清自己上下文)— File-safety sandbox-mirror 双层 soft guard(#32213/#32407:agent/file_safety.py:498-640新classify_sandbox_mirror_target+classify_container_mirror_target,path-shape 检测…/sandboxes/<backend>/<task>/home/.hermes/…防 docker 后端写 SOUL.md 两份分歧副本)— Telegram 观测群媒体缓存 → 平台无关原语(2 commit:gateway/platforms/base.py:1313-1366 cache_media_bytes(data, filename, mime_type, default_kind)任何 adapter 复用)— Gateway extract-stripped 工具响应恢复(#29346 2 commit:base.py:4082-4126pre-extract 快照 + 文本被剥空时从 post-extract_mediabody 恢复 +:4333response_delivery_droppedERROR 守不变式)— Weixinasyncio.wait_for替 aiohttp ClientTimeout(2 commit:gateway/platforms/weixin.py:370-414 _api_post/_api_get,修 cronrun_coroutine_threadsafe()场景下 "context manager should be used inside a task")— MiniMax-M3 ≤204,800 stale cache 主动失效(#36726:agent/model_metadata.py:1130 _model_name_suggests_minimax_m3()+:1554-1567cache step 1 命中后 invalidation 让 1M 默认生效)— Bluebubbles 群消息 mention gating(97 行新代码 + 132 测试)— xAI 视频模型按 modality 路由(#37046 边 commit:8 文件 +167,video/video-with-image 分流)— Gateway 杂项(WeCom env-only allowlistf7a3509b+ WhatsApp dm_policy 开放0cd5867b+ s6 心跳缺 sleep 回落eee32cdd+ 重启通知清理b14e15c489 文件 +378)— Docker/CI 维护(python3-venv / docker -w workdir / arm64 registry cache / dashboard docker update guidance)— Installer(macOS 重命名 "Hermes" launcher #37516 + commit pinning 改 opt-in1d9aacbd)— TUI status bar 10 连(窄屏 status/model 优先 / busy reservation indicator-style 感知 / FaceTicker 一致 / cwd cap 调用点 / 终端模式 leak 修)— Model picker 多修(OpenAI curated 不再被 OpenRouter 幻影 #37404/#37175 + gemini-3.5-flash 进 OAuth+API-key picker #37046 + gemini-3-flash-preview 恢复 #37606 + Codex OAuth 路径 #37517)— CLI/Memory/Simplex 小修(queued notes 安全前置 multimodal + Honcho fail open + Simplex idle ws 不误重连 + 25 用户故事 + Quickstart Skills 扩写) -
2026-06-01-update: 58 commits 跨日同步(hermes-agent
eb3cf9750 → b9646276f,仍 v0.15.1 维护窗口)— 三大特性集中合入:Hermes Desktop App(#20059,442 文件 +114,155,Electron+React+Vite,apps/desktop/+apps/bootstrap-installer/Tauri Windows 安装器 +hermes_cli/main.py:14716 desktop子命令 +HERMES_DESKTOP_REMOTE_URL/_TOKEN远程后端 WSL2 跨界)、Dashboard 全管理面板(#36704,9 文件 +3,189,McpPage/PairingPage/WebhooksPage/SystemPage+web_server.py6300→7079 行 +786,新增 17 个/api/{mcp,pairing,webhooks,gateway,credentials,memory,ops}端点)、/undo [N]三层落地(#21910 + #36699,state primitiveshermes_state.py:288 messages.active+:2426 rewind_to_message+:2513 restore_rewound+:2537 list_recent_user_messages软删,CLIcli.py:7106 undo_last(n, prefill),TUI command.dispatch prefill,Gatewaygateway/run.py:8022 /undo [N]+SessionStore.rewind_session+ 16 locale 同步)— 加 Curator inactivity 修剪 + 全 skill 用量遥测(agent/curator.py:53+tools/skill_usage.py:326新usage_report()/provenance(),hub 安装永不修剪,#36701)、Blank-slate skills(install --no-skills+hermes skills opt-out/opt-in+.no-bundled-skillsmarker,tools/skills_sync.py:43,753,#36228)、Setup 行内解释(Quick Setup "free OAuth, no API keys" vs Full setup "BYO keys",#36227)、Free tool pool entitlement 解耦(nous_account.py:64,111,152与付费 Nous 三档分离 + per-tool checklist setup,#36153)、MiniMax-M3 1M context(agent/model_metadata.py DEFAULT_CONTEXT_LENGTHS['minimax-m3']=1_000_000,#36214)、Model picker group-layer description(47d2d0589/84d82453a/c9a28dfb0)、安全:Agent 写~/.hermes/config.yaml双闸门(工具层tools/file_tools.py:256+ 终端层tools/approval.py:139-170,413tee|>|>>|cp|mv|sed -i全闸)、Skills guard 良性内容 +.skillignore/.clawhubignore蜜罐(SKILL.md不可忽略,tools/skills_guard.py +137)、Gateway MEDIA 标签 4 连(JSON/code-block/blockquote/inline-code 排除 + mask-as-locator 模式6c73e8ffa)+ 服务重启通知清理(b14e15c48)、Streaming broken-stream 不再误报输出截断(agent/conversation_loop.py +64,#36705)、Memoryon_session_switch(rewound=True)(agent/memory_provider.py:175)、Desktop/Dashboard 后续 9 修复(self-update tracks main / macOS desktop build stage / lazy session.create desktop_contract / PATCH /api/sessions/{id} rename / code comment 颜色 / 本地构 macOS 可重启 / drop files anywhere / docker/update守护 / OAuth/api/*not next=)、Docker s6 启动权限 10 连(HERMES_UID/GID 校验防提权 + s6 /init image 支持 + tini compat shim + Playwright headless_shell 发现 + non-root 不 drop privs)、Windows GA 去 early-beta 文案(#36093)、WSL 终端钳制 revert(误伤合法宽屏,#36096)、fchmodWindows 防护(HEADb9646276f,atomic_json_write) -
2026-05-31-update: 141 commits 跨日同步(hermes-agent
689ef5e2 → eb3cf9750,v0.15.1 维护窗口,无新发布)— Setup 重构(Quick Setup 直通 Nous Portalhermes_cli/setup.py:3010,3064+ Full Setup happy-defaults + 四个 setup picker 迁 curses,#35723/#35776)、/compress here [N]用户选择压缩边界(新模块hermes_cli/partial_compress.py235 行 + seam-alternation guard,#35048,灵感来自 Claude Code Rewind)、hermes prompt-size诊断命令(hermes_cli/prompt_size.py:141 cmd_prompt_size,#35276 关闭 #34667)、Kanban 双特性(task 文件附件task_attachments表 + 25 MB dashboard 上传 + traversal-safe + 13 测试kanban_db.py:1044/plugin_api.py:638-727,#35395;goal_mode卡片包 worker 进 /goal 循环kanban_db.py:737,974,1616+ judge 不达就续,#35710)、read_file 紧凑 gutter(<n>|content~14% token 节省 + 删HERMES_READ_GUTTER逃生口tools/file_operations.py:707-713,#35368/#35532)、write_file/patch 原子化(temp-file + rename,_atomic_writeline 772,#35252)+ UTF-8 BOM 处理(_UTF8_BOM/_strip_leading_bomline 127-143,#35278)、SQLite FTS5 优雅降级(hermes_state.py:452 _sqlite_supports_fts5+ trigram CJK 表同闸 + uv-managed Python 确保 FTS5,5ad2b4c6d/4fa20f9a8/ec67def5b)、CVE-2026-48710 Starlette BadHost pin>=1.0.1(pyproject.toml:86,118,125,178,#35118)、进程标题设为 'hermes'(hermes_cli/main.py:68 _set_process_titlesetproctitle + prctl/pthread_setname_np fallback)、Model picker 多 endpoint 合并 + catalog TTL 24h→1h + deepseek-v4-flash 进精选(#35227/#35756/#35659)、Streaming cumulative-resend 修复 → 6 小时后 revert(DeepSeek/Qianfan 累积 args 在共享流引误判,#35718 → #35860)、Anthropic thinking-signature 在 orphan-strip 后降级(Opus 4.8 extended-thinking + tool_use 签名失效)、Telegram DM topic 路由(合成通知保留元数据gateway/run.py +109+_get_dm_topic_info改在类上解析防 MagicMock 误判,4259bab7d+ HEADeb3cf9750)、WhatsApp/WeChat 文本去抖批处理(多条转发合并为单 turn)、Compressor 四连(stale handoff prefix 剥离 + 未答问题算 Active Task + 删冲突 resume 指令 + preflight rough estimate 钳制,#35344)、MCP 三连(stdio 子孙经os.killpg(pgid)回收tools/mcp_tool.py:2270-2281,3699+ 非阻塞启动hermes_cli/mcp_startup.py+ auth 重连改await asyncio.sleep)、Browser CDP DOM-node 序列化崩溃自动降级returnByValue=false(#35385)、Vision 4 MB embed cap 提前 + /voice 经 SSH 探测 PulseAudio/PipeWire socket、Nous Tool Gateway 始终展示 + 选中即 OAuth(#35792)、TUI/agentsdelegation 提示 + WSL131072x1终端维度钳制、Turn-Completion Explainer(abnormal turn 不再返空白,agent/conversation_loop.py:4493-4540,display.turn_completion_explainer默认 True)、安全 wave(mutation-verifier footer 路径中和防 config.yaml 自动上传 #35584 + media-delivery denylist 多层 + secret scrubber 不再脱敏 Discord mention +_HERMES_GATEWAYenv 防自指令循环 #30719 + dashboard chat WS 在--insecure非环回放行)、File-tools 相对路径锚定到绝对 base + 终端 cwd 持久化(_resolve_command_cwdline 1738 ACP→env.cwd→init 优先级)+ spawn_via_env 防双 compound-rewrite 包裹、LSP Windows .cmd shim 支持、State 中模型切换持久化到 DB(SessionDB.update_session_model)、uv tool upgrade/ pipx / Windows launcher-shim 等 8 条 update 簇、/stop同 thread 跨参与者 + pending_watchers 分批 100 + LRU cache 加封顶 + httpx pool timeout 重试 #35664 + 嵌套gateway.platforms块合并 + send_message 识 email target +/statustoken 标签精化 -
2026-05-29-update: 275 commits 跨日同步(hermes-agent
963d22c → 689ef5e2)— v0.15.0 + v0.15.1 双版本发布、claude-opus-4-8 + opus-4-8-fast 模型(#34003)、工具渐进式披露扩展到 MCP/插件工具(agent/tool_search.py,369075dc9)、MCP mTLS 客户端证书(tools/mcp_tool.py:573-625 _resolve_client_cert,#33721)、web_crawl 工具与 provider crawl 管线全面移除(23 文件,#33824)、hermes sessions optimize+ FTS5 段合并(hermes_state.py:3267 optimize_fts/:3306 vacuum)、KanbanPOST /runs/{run_id}/terminate(plugins/kanban/dashboard/plugin_api.py:1317)+ 一系列可靠性硬化(per-profile 并发上限、SQLite 抗撕裂写、worker SIGTERM、close-FD-after-connect、corrupt-DB 内容寻址备份名)、sync_turn新增messages上下文参数(agent/memory_provider.py:115-133,5a95fb2e1)、pluggable Context Engine ABC(agent/context_engine.py:32 class ContextEngine(ABC),9b5dae17a)、Skills 目录大扩张(skills.sh 858→19,932 经 sitemap、ClawHub 200→20k+、NVIDIA tap),新增可选 skillantigravity-cli/grok、Krea 2 进入 FAL 目录(与既有plugins/image_gen/krea直连后端并存,#33506)、FAL 视频经 Nous 网关、Docker s6 wave(persist-across-processes #20561 + 孤儿回收 +PUID/PGIDalias)、安全 wave(Nous 仅 JWT、子进程 AWS 凭据剥离、code-exec 审批旁路回归簇、API_SERVER_KEY必填、Docker stop/kill 进 dangerous patterns)、MEDIA 提取扩展名统一(#34517) -
2026-05-27-update: 645 commits 跨日同步(hermes-agent
556bf7c → 963d22c,默认远端分支master → main)— Dashboard OAuth 鉴权闸门 Phase 0-7 整体落地(hermes_cli/dashboard_auth/10 文件 1868 行 +DashboardAuthProviderABC + Nous Portal Provider 582 行 + WS 单次性 30s ticket +register_dashboard_auth_provider第 8 个 PluginContext hook)、Honcho AI-native 跨会话用户建模 MemoryProvider(plugins/memory/honcho/5 文件 5158 行 + dialectic Q&A + peer cards + identity-mappingsingle/multi/hybridwizard +pinUserPeer ↔ pinPeerName别名链 + 15 个 honcho 子修复)、Krea 图像生成 Provider 插件(Krea 2 Medium/Large,548 行)、security-guidance 插件 25 条 dangerous-pattern 警告(Apache-2.0 Anthropic fork,#33131)、TUI Session Orchestrator(in-TUI 多 session 同屏 635 行 +tui_gateway/server.py+221)、API Server 三连(Session CRUD +GET /v1/skills+GET /v1/toolsets,#33016)、Windows 原生支持收官(UTF-8 stdio shim / psutil PID / Scheduled Task / install.ps1 加固 / 79+63 skill platforms frontmatter / Playwright autoinstall /_pid_existshelper)、Docker wave(Node 22 LTS multi-stage + chown 链 + s6 env 转译 +agent-browserboot discover)、Codex Responses-API 14 修复(dropresponses.stream()helper + null/large/encrypted_content recovery + 凭据池 fallback isolation)、xAI 模型退役迁移工具链(hermes migrate xai [--apply]+ ruamel round-trip + doctor 提示 + chat 启动 warn)、xAI Web Search provider 插件(第 8 个 web provider)、Telegram 19 修复(in-place status edit + DM topic thread 修复 + heartbeat 原地编辑 + 静默 chatter + 2GB skip-STT 音频 + ignore_root_dm + pin user message)、性能 wave(agent-loop -47% viaload_config_readonly+ terminal poll -195ms + cold start -19s + termux fast-path)、Bitwarden EU + 自托管 server URL(#31378)、BrowseShSource 第 8 个 skill catalog(Browserbase 200+ 站点专用浏览器自动化)、hermes update --branch+ post-pull syntax-validate auto-rollback(#28669/#26172)、Nix #messaging / #full 包变体(#33108)、Honcho identity-mapping 三 shape wizard + gateway/run.py 暴露 honcho 配置到 doctor 视图 -
2026-05-26-update: 37 commits 跨日同步(hermes-agent
b62af47 → 556bf7c)— Promptware 防御(共享威胁模式库 252 行 + Memory load-time scan +<untrusted_tool_result>工具结果分隔符,#32269)、Nous-approved MCP 目录 + 交互式选择器(hermes mcp catalog/install/picker,optional-mcps/{n8n,linear},#30870)、Skills Hub 健康检查(EXPECTED_FLOORS+MIN_TOTAL=1500+ 新鲜度徽章 + 每 4h watchdog cron,#32345)、3 个新可选 skill(web-pentest/openhands/code-wiki)、Patch 工具三连(缩进保留 / CRLF 保留 / per-file 失败升级,#507/#32273)、Cron 扫描器二级分裂(strict vs loose,#32339)、Skill install 拒绝符号链接、Dashboard 插件资源 suffix-allowlist + 子进程影响型 env denylist(#32277)、Markdown 链接 scheme 收紧 + WeCom callback defusedxml(harden)、AGENTS.md 限定工作目录内载入、Telegram DM topic 投递 6 连、Anthropic API-key 路径跳过 OAuth autodiscovery、外部 secrets 每进程仅应用一次(#32271)、Gateway/model --globalscalar→dict coerce(#32272)、Agent outer-loop ERROR + traceback(#32264)、qwen3.6-plus → qwen3.7-max / 移除 grok-4-1-fast、TTS 双[pause]修复(#29417)、CLI fallback paste collapse(#32447)、Cron schedule 在 create 模式必填(#32427) -
2026-05-25-update: 175 commits 跨日同步(hermes-agent
186bf25 → b62af47)— Dockers6-overlay取代tini作 PID 1(BREAKING)+ 容器化运行时监管子系统(~20 commits:ServiceManagerProtocol +S6ServiceManager+container_boot.py+ per-profile gateway 监管 + 多架构 SHA256 校验)、安全 wave 3(~25 commits:6 处 symlink 拒绝矩阵 +/proc/*/environ|cmdline|mapsdeny + 项目本地.env读 deny +.env全 0o600 +_YOLO_MODE_FROZEN模块级冻结 + GHSA-rhgp-j443-p4rf config.yaml 路径合规 + Skills Guard multi-word Unicode-spoofing + 7 处凭据持久化 TOCTOU/path 加固)、hermes security audit(OSV.devquerybatch,覆盖 venv/plugin/MCP 三面)、CLI 冷启动 -63%(Bitwarden disk L2 cache, 666ms→295ms)、Plugin hook:register_tts_provider()+register_transcription_provider()+stt.providers.<name>command 注册表、openai-api新 Provider(直连api.openai.com,/v1/models直拉,gpt-5.5-pro)、CredentialPool 周配额轮换正确性(peek pool +explicit_api_key)、Gateway 在飞子 Agent 抗 busy-mode 中断(_agent_has_active_subagents降级 queue 语义)、Mattermost 迁移为 bundled plugin(plugin 化第二个 built-in 平台)、MCP OAuth 无头 paste-back 三连、Codex Responses-API TTFB watchdog + 上下文 token 估算修复、mid-tool-call partial-stream-stub 走finish_reason=length续传、Auxiliary 统一 main-model fallback(PR #31845)、Nous OAuth 401 可执行指导、/resume编号选择 + recap 调优键、/q改属/queue等 -
2026-05-24-update: 84 commits daily delta — 安全 wave 2(17 commits:Webhook fail-closed + Svix 签名 + Dashboard WebSocket loopback + Feishu/QQBot/Discord/DingTalk/MSGraph 审批授权 +
response_store.db0o600)、ntfy 第 23 平台(plugin 化)、Pluginregister_auxiliary_task()新 hook API、跨 Profile 文件写入软护栏(classify_cross_profile_target)、Streaming 完成可见性三连(guardrail halt 推到 stream /response_transformed编辑 in-place / partial-streamfinish_reason=length)、Kanbanpromote子命令(--ids批量)、Skills AST 深度诊断(audit --deep)、Bitwarden EU + 自托管、config.yaml model.provider单一 source of truth -
2026-05-23-update: 49 commits daily delta —
hermes setup --portal+hermes portal {status,open,tools}一键起步、Kanban DB 抗污染(KanbanDbCorruptError+ CodeQL 硬化 + scratch tip)、Memory.md/USER.md 外部漂移防护、审批"沉默 ≠ 同意"契约(#24912)、TLS FD 回收三层防御(#29507)、Plugin RCE 第二段(GHSA-5qr3-c538-wm9j)、Webhook INSECURE_NO_AUTH 动态路由保护、Telegram 状态消息 in-place edit、WhatsApp JID/LID alias、QQBot intent/op7-9/SILK 修复簇、OpenCode Go reasoning controls -
2026-05-22-update: v0.14.0 集大成 — Kanban、
/goal+/subgoal、Hermes Proxy、PyPI + Windows、Provider/Browser/Web/Video/Image/TTS 全面插件化、Curator 1781 行、LSP semantic diagnostics、Codex app-server、跨 session 1h Claude cache、Cold-start -19s、Teams/LINE/SimpleX/Google Chat、12 P0 + 50 P1 关闭 -
2026-05-20-update: v0.14.0(~2,480 commits across v0.12.0/v0.13.0/v0.14.0)
-
2026-05-16-update: v2026.5.16(2,890 commits since v2026.4.23)
-
2026-05-07-v0.13.0: v0.13.0 release — Provider plugin 化、Checkpoint v2、i18n、Curator 自治
-
2026-04-30-v0.12.0: v0.12.0 release (The Curator Release) — Persistent Goals、Tool-call Loop Guardrails、Kanban、Teams、4 新 Provider
-
2026-04-29-update: 182 commits (v2026.4.23),平台适配器插件化(PlatformRegistry + IRC)、Curator 后台技能维护、MiniMax OAuth、Vercel Sandbox、腾讯元宝
-
2026-04-18-update: 410 commits post-v0.10.0,Transport ABC 重构、Shell Hooks、Delegate Orchestrator、Step Plan/AI Gateway/xAI STT/KittenTTS、WeCom QR
-
2026-04-17-update: 641 commits (v0.10.0),压缩 v3、Bedrock/Gemini/Ollama Provider、Tool Gateway、插件命名空间技能、钉钉 QR 认证、Dashboard 插件
-
2026-04-10-update: 293 commits,Context Engine 插件化、watch_patterns、WeChat、xAI、Discord/Slack 增强
-
2026-04-09-update: 59 commits,结构化错误分类、统一执行层、三层溢出防护、BlueBubbles 等
- 概念页面: 46 个
- 实体页面: 2 个
- 更新日志: 49 个
- 源码覆盖: 关键模块逐行验证
- 跟踪版本: v0.17.0(hermes-agent/main HEAD
5a53e0f0,2026-06-20T11:38 -0700,"fix(compression): abort on auth failure instead of rotating into a degraded session";本期 69 commit 跨01f581d8d..5a53e0f0~22h 单日窗口;committer dates2026-06-20T02:32 +0530 → 2026-06-20T11:38 -0700;250 文件 +12225/−3725;v0.17.0 维护未发新版) - 最后更新: 2026-06-20
- GitHub 在线浏览: 直接点击上方目录链接
- Obsidian 本地知识库:
git clone https://github.com/cclank/Hermes-Wiki.git ~/Hermes-Wiki - 配合 Hermes Agent: 在 config.yaml 中设置
skills.config.wiki.path: ~/Hermes-Wiki
本文档基于 Hermes Agent 源码分析生成。