Skip to content

Latest commit

 

History

96 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Hermes Agent Architecture Wiki

Wiki Source Knowledge Base Changelogs Version Verified License

基于 Nous Research Hermes Agent 源码的深度架构文档。 所有页面均经过逐行源码验证,确保准确性与时效性。


目录结构

核心架构

记忆与会话

工具与能力

  • 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 输出)

性能与优化

安全与可靠性

多 Agent

平台与扩展

更新日志(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 commit14ef631 agent/context_compressor.py:1935-1950 _effective_protect_first_n() 衰减 + 7ace96b rotation 三状态修复(goal 经 hermes_cli/goals.py:282 migrate_goal_to_session move-not-copy + 子 create_session 失败回滚 agent.session_id = old_session_id + :694-701 on_session_start(platform=) 转发)+ 2f3177a agent/auxiliary_client.py:121 _aux_interrupt_protection = threading.local() + aux_interrupt_protection() ctx mgr 让 Codex aux 流尊重压缩摘要保护(#23975)+ 1f874df fallback 摘要 active_task 单点(#49307)+ b6a4638 空 content raise 不再静默替换为空摘要(#11978/#11914)+ 3509be7 _MIN_CTX_TRIGGER_RATIO = 0.85 + _compute_threshold_tokens() 让 64K-ctx 模型在 ~54.4K 触发(#14690)+ d0de460 TUI /compress 显示前后摘要(#46686)+ 04730f3hermes_cli/context_switch_guard.py preflight-compress 预警 + 41e0c10 重复压缩告警走 _emit_status(#36908))— ⭐ Kanban cluster 8 commit + lifecycle hooksd164ed0 4 reclaim RESET SQL 加 AND claim_lock IS ?(#50366)+ 1f4c5ae _resolve_auto_decompose_settings 每 tick 重读(#50358)+ 84ba83b bounded init lock 10s(#50353)+ 9630ec6 _default_spawn env["TERMINAL_CWD"]=workspace(#50348)+ e217fd4 三新 plugin hook kanban_task_claimed/completed/blocked 注册 hermes_cli/plugins.py:192-194 VALID_HOOKS + _fire_kanban_lifecycle_hook write commit 后 best-effort(#50349)+ e581740 _dispatch_tick_lock board-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 commited96669 tools/url_safety.py:285-287 + :359-365 ip_str.split('%')[0] 剥 IPv6 scope-ID + fail-closed + ed3d12a WebSocket 空 peer fail-closed 4 endpoint + 5b45fb2 kanban markdown HTML 白名单消毒 plugins/kanban/dashboard/dist/index.js:337/:354/:368/:387 + ae46699/87615f4 restore_quick_snapshot 路径穿越(snapshot_id + snap_dir + manifest src/dst 全 .relative_to() 校验)+ 3b56d3a kanban tool payload secret redact 经 redact_sensitive_text(force=True) + a18bae6 _SECRET_CONFIG_KEYS frozenset + redact_config_value() 递归 masker(#50245/#50313 config show/set api_key 屏蔽)+ 9078b4b tools/file_tools.py:286 _is_blocked_device_path normpath + 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 commitb5b8a4c fresh-final 尊重 prefers_fresh_final_streaming 适配器 decline + __dict__ 双查防 MagicMock(#47048)+ 4c206b9/79f2978 5 plugin adapter sys.path.insert(parents[3]) 修 cron 命名空间冲突(#49410)+ 03563da hygiene 硬上限 400→5000 默(#50194)+ 4c349e8 hygiene 无法 rotate 时保留 transcript(#21301 P1)+ 8ac5e90 _JSON_MEDIA_TOOL_PATH_FIELDS + _collect_history_media_paths() 让 image_generate JSON-payload 路径入历史去重集(#46627)+ c11c510 busy 模式文本 follow-up 经 _queue_or_replace_pending_event FIFO 不再 newline-merge(#43066 sub-bug 2)+ d19aabb _finalize_shutdown_agents flush _session_messages 经 idempotent identity-tracked(#13121)+ 93ea9b0 入站媒体下载 128MiB cap(防 Discord Nitro 500MB OOM)+ bb77a8b 未映射 Windows gateway 经 detached watcher 重生(#50090/#50373)+ 7a131f7 stateless HTTP path supports_async_delivery=False 经 contextvar + notify_unsupported/sync fallback(#50319)+ e499d69 gateway.api_server.max_concurrent_runs 统一并发 cap 跨 3 endpoint + OpenAI 风格 429 + Retry-After(#50007)+ 51a338a + 0ee7546 + b577f25 + 4d7bb38 active_agents 轮边界 publish + /api/statusgateway_busy/drainable + parse_active_agents 三处统一)— ⭐ Telegram cluster 9 commit6183e8c Bot API 10.1 rich messages 默改 off hermes_cli/config.py:2161 "rich_messages": False + adapter _coerce_bool_extraplatforms.telegram.extra.rich_messages: true opt-in;CJK 不走 rich + 表格不强换行 + slash 富文本保留换行 + chunk 标记移出代码栅栏 + native rich echo reply 文本恢复 + 流式 final 经 editMessageText 重索引 + finalize 前暂停 typing + 最终回复后 typing indicator 不残留)— ⭐ Cron cluster 6 commit07424da ticker BaseException 不死 + heartbeat-aware status + f1f36b3 迁移期时区偏移修复防双触发 + 65d7c7f action='run' 立即执行 + 4cc28aa Telegram DM-topic 经 DeliveryRouter(#22773)+ d548908 直播适配器显式 confirmation 步骤(#38922/#47056/#43014)+ 73b9226 model.default 解析 fail-fast)— Plugins/Session lifecycle 7 commit9d883ac ctx.profile_name wrap get_active_profile_name() 经 HERMES_HOME(#50346)+ 9f67ba1 finalize_turn 三段 cleanup 各自 try/except + result["cleanup_errors"](#50009)+ b17180d AIAgent.close() step 7 session_db.end_session() + 9e4fe32 background review fork opt out + 56255f8 _collect_delegate_child_ids() 用父 id seed found 集合 + 99233fa/c7e8854 CLI/TUI force-quit/signal 持久化)— Miscc0409a8 SendResult.error_kind 7 类 typed(too_long/bad_format/forbidden/not_found/rate_limited/transient/unknown)+ 2609bcc i18n Spanish 完整(README.es.md 220 / CONTRIBUTING.es.md 602 / SECURITY.es.md 322)+ 65a477f Desktop About 加 Update now(#50186)+ 8666fd7 模型可见性跨 provider 保留 hide-all + 5e3e89c Hindsight 健康 grace 可配(#50341)+ 7bc6f18 Hindsight root 跳 + 472c068 MCP "unknown method" ping keepalive(#50028)+ Photon 三修 + 2f4f23f Codex app-server item/started → Telegram tool-progress 桥接(#38835)+ e0498bd Bedrock prompt-cache 计价 + 跨区域前缀剥除(#50307)+ a4b1554/491579f WhatsApp JID 规范 + bridge dir HERMES_HOME mirror + 4467c22 chat-completions timestamp 剥 + ac83365 Windows install 8.3 短 %TEMP% 展长 + 6f5f58e/41ba90f poll() 只读 + CLI drain dedup(#10156)+ 3e354b6 Copilot headers 保留 + 6984026 browser SSRF 容器化 + 8a506ed credential_pool env-seeded 非破坏 + 587b5b9 memory provider 外部 backup paths(#50325)+ 模型切换 3 修(#50375/#23767)+ 824c9d3 model.api_base→model.base_url 别名(#50385)+ a9c8025 approval honor 中断(#8697)+ Email 配置硬化(#40715)+ 16+ docs commit + AUTHOR_MAP 10+ salvage)— 验证基线 /tmp/hermes-agent clone @ 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 commitcompression.in_place:bool=False opt-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_messages WHERE 放宽 (m.active=1 OR m.compacted=1):3528-3532 主 FTS5 + :3611-3614 trigram)+ 边界 hook 双模触发(agent/conversation_compression.py:625 _is_boundary = bool(_old_sid) or in_place)+ gateway auto-compress 强 history_offset=0gateway/run.py:15872-15874)+ /compress slash 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_batchtools/async_delegation.py:337)批量当单异步槽位;runner _execute_and_aggregatetools/delegate_tool.py:2247)join 所有子;完成事件 is_batch=True:389)+ 单 consolidated 渲染 _format_async_delegationtools/process_registry.py:1549-1628 header :1586 TASK i/N :1614);模型级 background 入参作废由 _dispatch_delegate_taskrun_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 invariant tools_config.py:1528-1536 _get_platform_tools 末尾减 agent.disabled_toolsets)— ⭐ Gateway adapters → bundled plugins 9 个迁移(单 commit 56001054(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.py 1701 行;注册 register(ctx) PluginContext → ctx.register_platform()PlatformEntryplatform_registry.register();发现 _scan_directory walk 一级 + plugin.yaml manifest;Matrix YAML 补 4 键 allowed_users/ignore_user_patterns/process_notices/session_scopeplugins/platforms/matrix/adapter.py:4288 _apply_yaml_config :4297/:4312/:4317/:4319);~60 test 原地 retarget;单一新 test_slack_plugin_setup.pyc3292794 跟进补 2 漏字符串字面量)— Desktop 浮动 composer popout PR #49488renderer-only 不开新 BrowserWindow 无 IPC channelapps/desktop/src/store/composer-popout.ts nanostore + localStorage hermes.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 commit5a53e0f0 aux 摘要 401/403 abort(agent/context_compressor.py:771 _last_summary_auth_failure + :1593-1602 _is_auth_error + :2335 不管 config flag abort)+ f22dd8a7 agent loop is_auth 真失败转 fallback(agent/conversation_loop.py:2842-2858 + 新 retry flag turn_retry_state.py:65 auth_failover_attempted: bool = False)+ c884ff64 rewrite_prompt_model_identityagent/chat_completion_helpers.py:1045-1071)只改最后一次出现 + _sync_failover_system_messageagent/conversation_loop.py:469-492)8 站点接 + c253b073 clear_model_endpoint_credentials 中央 helper(hermes_cli/config.py:3934)+ 12 picker flow 接入 + 95a3affc Nous picker 重 load_config() + 37a4dd49 heal poisoned inference_base_urlDEFAULT_NOUS_INFERENCE_URLhermes_cli/auth.py:71)双站点)— Signal 加固 14 commit_validate_send_resultgateway/platforms/signal.py:1020)解 results[] + SignalRateLimitError 抛 + 新 gateway/platforms/signal_format.py 140 行共享 markdown→Signal UTF-16 偏移 textStyles + ADTS AAC 识别(:83 _guess_extension lines 105-109 if (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)+ MessageEventreply_to_author_id/name/is_own_message 3 字段 + 群组自身 mention 全剥(:640-641)+ stop-typing RPC(:1517-1538)+ 新 env_floatutils.py:326)+ 11 文件 22 处 env cast 替为 env_int/env_float;PR #49260/#49530/#49558/#49563/#49583/#49678/#49680)— Teams 原生附件 PR #49308_send_media_attachment shared helper(plugins/platforms/teams/adapter.py:1192-1240)+ send_video/send_voice/send_document + microsoft_teams.api.Attachment SDK + URL ref / data URI 双路径,无显式 size cap)— Language-aware title generation PR #45296auxiliary.title_generation.language config + _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 #49269HERMES_SESSION_SOURCE ContextVar 多站点 + _session_source + source="tool" 标记)— 内联键盘 model picker 默 persist PR #49176 salvagegateway/slash_commands.py:1155 is_global=persist_global + :1219-1247 config.yaml 写 + 扁平字符串 coerce 嵌套)— 终止 busy session internal-event 中断 PR #49738gateway/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_tail gateway/run.py:940-980)— 工具 model whitelist 不剥 prompt/image_urls + slash exec dispatch payload TUI/Desktop 双修 + Raft check_fn 静默 + Desktop GPU 加速被禁横幅(IPC hermes: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-agent clone @ 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 → 01f581d8dv0.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=False opt-in + gateway/session.py:616-651 _session_key_namespace(profile)/build_session_key(profile=) 默 profile→"agent:main" 命名→"agent:" + :97-104 SessionSource.profile:Optional[str]=None wire 字段 + :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-696 Source.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-5370 set_multiplex_active() + :6726-6794 _start_secondary_profile_adapters()->int orchestrator + 凭据指纹 + :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.py env fallback 经 get_secret + tools/mcp_tool.py MCP 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-178 class CronScheduler(ABC) 实验性 + name 抽象 + is_available() invariant:不得网络 IO + start(stop_event, *, adapters, loop, interval) 阻塞调度循环 + stop/on_jobs_changed/fire_due/reconcile 五 hook + class InProcessCronScheduler name="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.pyrun_one_job shared 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;赢时 stamp fire_claim={at, by} 推进 next_run_at + :979-981 mark_job_run() 完成清 fire_claim + 新插件 plugins/cron/chronos/__init__.py 241 行 class ChronosCronScheduler(CronScheduler) + _armed:dict cache + 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 NasCronClient HTTP 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() -> Callable pluggable indirection + gateway/platforms/api_server.py:3345-3402 _handle_cron_fire(request) -> web.Response POST /api/cron/fire Bearer + get_fire_verifier(cron.chronos) 401 on bad token / 400 on 缺 job_id / 202 + background provider.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) -> dict blocklists 复用 + 测试 scheduler_provider/claim_job_for_fire 84行/chronos_cron 203行/chronos_verify 182行(真 RS256 sign-verify)/cron_fire_webhook 152行 + 新 docs docs/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) 每轮调用:snapshot registry._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 ElicitationHandler MCP 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_DIR env 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() -> dict LRU 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-5726 user config 加载后调 apply_managed_overlay + :6119-6211hermes 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 经 catalog flow="external" 含 catalog-only 未连 provider + :5884-5924 list_oauth_providers(profile) + Desktop apps/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 model provider 集含 Bedrock + catalog-only OAuth status fallthrough)— Raft 新平台插件 3 commit(新 plugins/platforms/raft/plugin.yaml name:raft-platform / label:Raft / kind:platform / version:1.0.0 / author:botiverse / kind:platformrequires_env:RAFT_PROFILE 设置即 enable;adapter "external agent via wake-channel bridge",loopback HTTP 接 wake hints,碰消息正文 / 投递游标 + plugins/platforms/raft/adapter.py 774 行:174 _make_activity_event schema raft-activity.v1 + :260 class ActivityQueue bounded telemetry 队列 + :438 class RaftAdapter HTTP 服务器 + :768-774 注册 7 activity hooks + bridge subprocess stdin=DEVNULL + AUTHOR_MAP skyzh@mail.build→xxchan)— simplify-code skill db744e7d1skills/software-development/simplify-code/SKILL.md 212 行 灵感来自 Claude Code /simplify;3 risk tier SAFE(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 skill 9362ce257 (#48899) 加后立即 revert 92451151c HEAD 上 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)d2c53ff55 gateway/relay/adapter.py:85,89 set_inbound_handler/set_interrupt_inbound_handler 全绑 WebSocketRelayTransport 删 signed-HTTP fallback;a64fc490f hosted gateway 真 connect inbound/outbound round-trip;2c6e266e8 gateway/relay/__init__.py:207 self_provision_relay() :219 触发改 "relay_url 配 + NAS token + 无 secret 钉";245b95b09 tools/terminal_tool.py:2068-2082 gateway 进程内拒 hermes gateway start/stop/restart 防 agent 自杀)— image_generate 加 image-to-image / editing c02192ff6 (#48705)agent/image_gen_provider.py +79 ImageGenProvider ABC generate() 加 keyword-only image_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 gateway apps/desktop/src/app/command-palette/index.tsx:368 + apps/desktop/src/store/system-actions.ts:15 $gatewayRestarting jotai atom 状态栏 spinner + 重命名 Restart messaging→Restart gateway + 选 logs 可复制 + Restart action 在 messaging save/toggle toasts + Refresh Models cache bust apps/desktop/src/app/shell/model-menu-panel.tsx:119 refresh:true + 通知 click apps/desktop/src/lib/session-ids.ts:15 resume stored session id + selectable slash/shell logs preview-console.tsx:88 selectedLogIds + reasoning-effort picker web/src/components/ReasoningPicker.tsx 在 chat sidebar + session switcher panel apps/desktop/src/app/session-switcher.tsx:16 Chat tab + sessions 实时刷新 dc5cb0a44 + sessions sort by 最近活动 0d7abd555 + prefill 指令通知 b936f92b2 (/goal /undo) + vitest 入 dashboard npm test)— Gateway 鲁棒性 12 commit(cached agent max_iterations/max_turns 每轮 refresh from config gateway/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 命名 topic gateway/slash_commands.py:2805-2821 propagate _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 上下文 hydrate plugins/platforms/discord/adapter.py:28-40 class _Snowflake + :4255-4257 _fetch_channel_context(reply_target=) + :4315-4382 reply-anchored window scan + clarify dict-choice unwrap tools/clarify_tool.py:23-53 _flatten_choice() + :88-90 调 + :137-142 CLARIFY_SCHEMA docstring 明确 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-680 init + :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_text static + Hindsight plugins/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 经 stream agent/anthropic_adapter.py:2538-2589 _is_stream_unavailable_error/create_anthropic_message + run_agent.py:4079-4085 _anthropic_messages_create + FTS5 trigram fallback 不禁 FTS5 hermes_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 守 hosted a7b4fbcbc + DASHBOARD_TUI_MODE 重用 + pending-input 经 command.dispatch() 169952563 (#48848))— Dashboard 8 commit(chat TUI argv 出 event loop d06104a9e (#48561) + /api/cron/fire c34840e22 + DS Button prefix/size API d573e7c9e + upload temp file disconnect 清理 + python-multipart 锁 6752da9a7 (NS-501) + Slack allowed users wildcard 83c034bd5 + Slack setup hints + 验证 + sessions sort by 最近活动)— Sessions/Backup/Misc 10 commithermes_state.py 递归 CTE 让 child session 继承祖先 title 跨 compression lineage 6ad0bc20f/65d050cf0/8c70346e3 + hermes_cli/backup.py EXCLUDED_BACKUP_DIRS 排 .venv/node_modules/pycache e738c0833 (#48887) + Stripe Projects skill docs cfb55de5e (#48673) + undici audit bump b266ad748 (#49113) + hashless npm via importNpmLock 3ca0ef7e3 (#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-agent clone @ 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(新文件 gateway/relay/descriptor.py:77 CapabilityDescriptor frozen 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=1 additive-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_inbound handler + :139-149 on_interrupt(session_key, chat_id)interrupt_session_activity + :190-221 send_follow_up(session_key, kind, content, metadata) → SendResult token-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 WebSocketRelayTransport newline-delimited JSON 帧协议 + 7 帧类型 hello/descriptor/inbound/outbound/interrupt/outbound_result/interrupt_inbound + uuid requestId 相关 per-request future + 30s handshake/outbound timeout + send_interrupt fire-and-forget + :57-100 _event_from_wire SessionSource snake_case wire→dataclass + :158-174 _upgrade_headers Authorization Bearer 在 /relay WS 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's relayAuthToken.ts/deliverySigning.ts 字节级互证;新 gateway/relay/inbound_receiver.py:204 InboundDeliveryReceiver aiohttp 双 POST routes /message/interruptx-relay-signature/x-relay-timestamp over 原始 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 3 gateway/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 单测覆盖;237fa7d29HERMES_GATEWAY_RELAY dark-launch flag 改配置驱动 relay_url()GATEWAY_RELAY_URLgateway.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:44 CI guard:production 路径不 import StubConnector + test_relay_sheds_crypto.py A2 不变式: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:143 v1 契约 + §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-agnostic BillingState/parse_money/format_money/CardInfo/MonthlyCap/AutoReload dataclass + 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_billing handler + 2s 节流/5min 可取消 poll + tui_gateway/server.py +216 行 billing.state/charge/charge_status/auto_reload/step_up JSON-RPC + 结构化 success envelope result.ok + result.error=<code> + 新 ui-tui/src/app/slash/commands/billing.ts 332 行 全 TUI overlay 状态机 + ConfirmReq overlay 复用 + 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 registry plugins/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_async daemon offload drain+pending GET+commit POST 让命令线程立返 /new//branch//resume//undo 不卡;12 commit:813a4e383 (#28296) :2373-2439 on_session_switch hook bounded join 10s + commit if turn_count>0 + drain stale prefetch / a30b40c73 sync_turn :2309-2320 capture sid before worker + on_session_end :2360-2370 reset turn_count for 幂等 + 测 test_end_then_switch_does_not_double_commit / eddbf291a re-check is_alive after join 未 drain 跳 commit + on_memory_write 同 sid 快照 + prefetch_generation 拒 stale write / 91e9459e1 per-session writer dict 替单槽 _sync_thread 防 bounded join drop live worker / 00c045b43 综合硬化 / f3b813c02 测试 preserve content/write writes / 3ac6551ba :2399 rewound=bool(kwargs.get("rewound")) :2411-2430 rewound 时跳旋转只 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 / 99a20f8d9 plugin 期望更新) — ⭐ Memory 单轮 batch ops #48507tools/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 + 桥接外部 provider agent/agent_runtime_helpers.py:1842-1875 + agent/tool_executor.py:1012-1050 遍历 batch op 对 add/replace 调 on_memory_write + agent/background_review.py:300-408 batch op 显示;live 验证:consolidate-and-add 7→1 调用) — ⭐ Skills 用户修改 bundled-skill 发现+diff CLItools/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);CLI hermes_cli/skills_hub.py:1152 hermes skills list-modified [--json] + :1185 hermes skills diff <name> + :1870+ /skills list-modified /skills diff slash 镜像 + subcommands/skills.py:164/194 argparse + hermes update 提示在 main.py:9063 + 6073 两路径都点向新命令 + 不变式测 test_update_modified_notice.py:50 5 行窗内必现 hint 不固定路径数;f6fac60e6 refactor _skill_file_list() helper 去重 + diff 契约删 user_present25c590ccd rmtree 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 guard tests/tools/test_skills_sync.py:237;功能测 test_skills_list_modified_diff.py 132 行 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-scoped task:T:turn:U/session:S:turn:U/thread:PID:turn:U;Tier 2 request-scoped task: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 TestTurnTraceIsolation 2 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_unboundedly 50 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 计费 laneagent/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()归一化所有mcpmcp__(裸 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-1570 not 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_stream UploadFile+Form按 1 MiB 块直读到 temp + 100 MB cap streaming 中 enforce 413(不 full buffer 后)+ 原子os.replace(partial/abort 不覆盖现有)+ 加 python-multipart依赖;前端api.uploadFilemultipart/form-data raw 字节)— **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:1242agent._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_transcriptagent/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/Library/Application Support/Hermes// 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 send CLI)+ **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.py glob 命令 allowlist 守 + shell chaining 防)+ **Container 检测 cgroup-v2/containerd/CRI/K8s #47131**(hermes_constants.py:486+ KUBERNETES_SERVICE_HOSTenv +kubepods/containerd/criomarker +/proc/self/mountinfo fallback)+ **Windows 跨进程日志轮替**(hermes_logging.py:36+ ConcurrentRotatingFileHandler as RotatingFileHandlersys.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-PowerShellHostExeGet-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 删幂等 #48641 hermes_cli/web_server.py:7046-7067+ absent → 200already_absent:Truesecondary 窗 streaming #47919 electron/session-windows.cjs:24-34 chatWindowWebPreferences backgroundThrottling:false 主+secondary 共用 factory;PTY before-quit dispose #92e6d8c85 electron/main.cjs:6554-6558Electron 40.10.2 钉 #47792 package.json:137 electronVersion: "40.10.2" + 删 @electron-internal/extract-zip + nix npmDepsHash 刷新 + react-simple-icons @=13.11.1;electronDist 动态解析+self-heal #48091 apps/desktop/scripts/run-electron-builder.cjs 57 行 require.resolve("electron/package.json")动态 +_try_redownload_electron_dist() 镜像 retry;self-update 重 build retry once #48122 apps/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/safeDirectiveSegmentsfailed turn 跨 thread 隔离 use-message-stream.ts:1102-1109 errorMessage toast 稳 id;long user message 滚 #48619 thread.tsx:830 USER_BUBBLE_BASE_CLASS overflow-hidden→overflow-y-autoerror banner dismiss #47985 desktop-controller.tsx:753-785 dismissError 双清;/title 前置创行 #47987 tui_gateway/server.py:5004 _ensure_session_db_rowRTL list marker + quote border markdown-text.tsx:541/546/549 dir="auto"+:525 code dir="ltr"named custom provider 不退 bare custom #48547 agent/agent_init.py:1227-1233 4 站守;backend skew toast 24h snooze #47913 store/updates.ts:99-145 SKEW_TOAST_COOLDOWN_MSpre-session 模型选黏 + reasoning/fast 设置 #47447 lib/model-status-label.ts:25-34 currentPickerSelection()self-improvement review summary use-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:10choices=+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.py Python 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-23 4 个 composer localStorage key hermes.desktop.composer.{model,provider,reasoning-effort,fast} + apps/desktop/src/app/shell/model-menu-panel.tsx:45 ModelMenuCloseContext React Context 关闭 + 989d5d0 apps/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)+ 7d938cc agent/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 commitapps/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 调度 + i18n en.ts:192+zh.ts:188 + 0f75e99 apps/desktop/src/app/shell/app-shell.tsx:86 hideTitlebarControls=isSecondaryWindow()(从 isNewSessionWindow 扩到所有 secondary)+ statusbar :194 !isSecondaryWindow() 门 + apps/desktop/src/app/chat/index.tsx:127 ChatHeader 早返 + :311 secondary 跳 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:644 title commit 后广播 + apps/desktop/src/app/session/hooks/use-session-actions.ts:476 乐观创建后广播 + dd0e3e0 apps/desktop/src/components/assistant-ui/thread-list.tsx:140 主窗 pad pt-[calc(var(--titlebar-height)+1.5rem)]→pt-[calc(var(--titlebar-height)-0.5rem)]⭐ Watch window subagent 流 PR #47060 44e5848tools/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_build lazy watch 跳过 + :2878-2884 _on_tool_progresssubagent.text 跳父 emit + :2945-2951 _mirror_subagent_to_childsubagent.text 映 child sid message.deltasubagent.start 退化单次 header)+ :4248-4258 lazy session.resume_child_run_active 时早返空 history(WSL race 修)+ 窗口 chrome apps/desktop/src/app/chat/index.tsx:124-127 ChatHeaderisSecondaryWindow() 早返(从 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 #46895 c6b0eb4apps/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 artifactHreffile:/// 路径都过 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 #47011 0441b7fapps/desktop/electron/connection-config.cjs:175 pathWithGlobalRemoteProfile(path, profile, opts) global-remote 模式 + 无每-profile override 时追加 ?profile= + :283 导出 + apps/desktop/electron/main.cjs:66 导入 + :5619 hermes:api handler 调;后端 hermes_cli/web_server.py OAuth provider 路由按 profile scope + 新测 tests/hermes_cli/test_web_oauth_dispatch.py 133 行Electron pack 失败镜像 redownload PR #47266 d1ecebchermes_cli/main.py:5113 _electron_dist_binary(project_root)(mac Electron.app/.../Electron/win electron.exe/linux electron)+ :5130 _electron_dist_ok + :5144-5194 _redownload_electron_dist(project_root, env, *, mirror=None) 清残 dist+path.txt+注 ELECTRON_MIRRORnode install.js + :5459-5463 首次重试 + :5489-5493 镜像重试用 https://npmmirror.com/mirrors/electron/;redownload 仍失败时跳 npm run pack + scripts/install.ps1/scripts/install.shRestore-ElectronDist/Test-ElectronDist helper + 测 tests/hermes_cli/test_gui_command.py +155 行/browser 限本地 gateway PR #47245 a68ac0capps/desktop/src/lib/desktop-slash-commands.ts:33'browser'DesktopActionId + :107-112 /browser spec surface:action('browser') + :152 从 terminal-only blocklist 移除 + apps/desktop/src/app/types.ts:49-53BrowserManageResponse {connected?, url?, messages?[]} + apps/desktop/src/app/session/hooks/use-prompt-actions.ts:1148-1219 browser handler $connection.get()?.mode==='remote' → "local gateway only",否则 connect|disconnect|statusrequestGateway<BrowserManageResponse>('browser.manage', {action, session_id, url?});同 PR tools/skill_manager_tool.py_validate_delete_target 守 tree-escape — 外部 provider 终端断开 a0ec4f5apps/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 useEffectstatus==='open' 时订阅 + 写 ${command}\rhermesDesktop.terminal.write + 写完清 atom + apps/desktop/src/app/settings/providers-settings.tsx:34 GroupLabel helper + :174 第二个 "Other providers" header + :218 terminalDisconnect=!canDisconnect && Boolean(provider.disconnect_command) && canRunInTerminal() + :325-339 handleTerminalDisconnectrunInTerminal(command) + apps/desktop/src/types/hermes.tsdisconnect_command;后端 hermes_cli/web_server.py 返 per-OS disconnect_commandRight-sidebar explorer refresh 始终可点 PR #46244 9d2ec8dapps/desktop/src/app/right-sidebar/index.tsx:134 HEADER_ACTION_LABEL_REVEALpeer-hover/project-labelgroup-hover/project-header+group-focus-within/project-header + :219 RightSidebarSectionHeader div 挂 group/project-header class + 测试 +75 行 index.test.tsxdisplay.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}4cf9d80 verbose 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_actionsrun_agent.py:1411c2c55c4 全 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.pye3adbb5 前置 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 调用) — ⭐ Hooks session:compress 事件 e76e7b5init_agentevent_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;28f9247from urllib.parse import urlparse, parse_qs, urlunparse 死引 + 测 tests/run_agent/test_compression_boundary_hook.py:165 TestSessionCompressEvent + :213 test_event_emitted_on_compressioncompress_events + ctx["old_session_id"]/compression_count + test_no_callback_is_safe + test_callback_exception_does_not_break_compressionprompt.context_file_max_chars 可配 f6a42b1hermes_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_promptagent/system_prompt.pydrain_truncation_warnings()agent._emit_status() + 文档 configuration.md:614/620 / context-files.md:112/174/188 / prompt-assembly.md:1986ebc449 截断警告 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_contextstool_progress_style → tool_progress_grouping 改名(同日 fc956b9 引入→6373aba 改名)gateway/display_config.py:35 _GLOBAL_DEFAULTS["tool_progress_grouping"] + :242 _normaliseaccumulate|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-327Codex pool-only rate-limit 不弹 relogin 9a59ad7:新分类器 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.1 bbc842d+f4ef70fhermes_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_selection fallback;docs plugins/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 commit630b438 hermes_cli/models.py:2263-2280 Anthropic 分支 curated = list(_PROVIDER_MODELS.get("anthropic", []))merged = list(curated) → 大小写 insensitive merged_lower set 追 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_models 1b962f0providers/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) + 子类 override plugins/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/models 1039e90hermes_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)7493de7 78 行新测 tests/hermes_cli/test_user_providers_model_switch.py + scripts/release.py:420 "11052595+chimpera@users.noreply.github.com":"chimpera"自定义 provider dedup 保留 b7fa62chermes_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.pyGLM-5.2 入 OpenRouter+Nous b2da39a PR #47391hermes_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.jsonauxiliary auto 任务沿主 fallback chain PR #47235 4858942agent/auxiliary_client.py:3106 _fallback_entry_api_key + :3117 _resolve_fallback_entry(... ←resolve_provider_client) + :3135 _try_main_fallback_chainget_fallback_chain(load_config()) 迭代跳 failed/main/unhealthy + _resolve_autotask 参 + :3320-3333 在 Step 2 插用户 fallback + resolve_provider_client(... task=None) :3459Telegram 富文本默认开 + 流式 final 仍 rich PR #46890 a6364bfgateway/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-6720 reply 时 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 "stevenn.damatoo@gmail.com":"x1erra"Slack /debug via /hermes PR #47248 4d470b3hermes_cli/commands.py:1057 _SLACK_VIA_HERMES_ONLY=frozenset({"credits","debug"})debug(与 Telegram 对齐)+ check 点 :1107Mattermost notify-only flat-fallback 16fc717+5a0e0d3gateway/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_root 400/404+body 标识 + :181 async def _post_preserving_threadmetadata.get("notify") 且 broken-root 时 flat-fallback + 接 :352/:534/:575/:663 text/image/file/document 发送 — WhatsApp/email send_image(metadata=) e65d74bgateway/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 — Photon spectrumProjectId 收敛 5b3fa26plugins/platforms/photon/auth.py:15-17 文档:post-unify project.id==spectrumProjectId + :168 def load_dashboard_project_id() 优先 spectrum_project_id 而非 legacy dashboard_project_id + :185 entry-key fallback 链 + get_project() 删 + create_project 不再发 spectrum: true 切换始终 provisioned — ⭐ Honcho 网关身份树 gateway-gated 替换部署形状 PR #44431 merge d2b34e8bb5cb32 _migrate_pin_peer_name()plugins/memory/honcho/cli.py:380-391 pop pinPeerNamepinUserPeer + 克隆路径 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-735 orphan-guard:un-pin 会孤悬 peerName 历史时重提 + 各分支 cli.py:741/:754-758/:766-769 scrub 后写 pinUserPeer/userPeerAliases/runtimePeerPrefix99feb03 docs plugins/memory/honcho/README.md:140-144 pinUserPeer/userPeerAliases/runtimePeerPrefix 表行 + pinPeerName 降 deprecated;23a7458 website/docs/user-guide/features/honcho.md:160 "Gateway Identity Mapping" 节 + :174 解析器顺序 + :177 orphan 警告 + :181 deprecated 别名;2708c33+1544813 隐私 alice + Telegram UID 7654321 跨 README/cli.py/测试/docs;后续 6dde7d4 docs website/docs/user-guide/features/memory-providers.md:98 pinUserPeer 行 + :211 "every non-agent gateway user collapses to peerName" 进 Gateway Identity Mapping 子段;c7513df plugins/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 跳支持目录 9137b86agent/skill_utils.py:50 SKILL_SUPPORT_DIRS=frozenset(("references","templates","assets","scripts")) + :73 def is_skill_support_path(path) + :68 should_exclude_skill_path OR is_skill_support_path 与既有 EXCLUDED_SKILL_DIRS + tools/skills_tool.py:84/1027/1032/1043/1050/1077_is_skill_support_pathskill_view/发现遍历 — shop-app → CLI 化 shop skill v1.0.15094325 optional-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 删;d7668aa description ≤60 char + :5 author: Joe Rinaldi Johnson (joerj123), Hermes Agente236bb8 docs regen 删 website/docs/optional/productivity/productivity-shop-app.md 354 行 + 新 productivity-shop.md 238 行 + 更 website/docs/reference/optional-skills-catalog.md + website/sidebars.tscf52370 scripts/release.py:59 "joe.rinaldijohnson@shopify.com":"joerj123"TUI session-create no-race 测试隔离 PR #47230 2483200tests/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.py Python 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-agent clone @ 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-226 lock 内原子容量检查 + :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-2095 batch+background 互斥拒 + :2243-2317 父线程取 get_current_session_key() + :2261-2270 parent_agent._active_children 解绑让父中断/缓存 evict//new 不杀后台 + :3037-3054 schema + :3099 注册;tools/process_registry.py:1549-1616 _format_async_delegation()[ASYNC DELEGATION COMPLETE — <id>] 自包含块 + :1619 format_process_notificationevt_type=="async_delegation" 路由;gateway/run.py:5393 启动 schedule _async_delegation_watcher + :12337-12382 2s 轮询 + 非 async event 立即 requeue + _enrich_async_delegation_routing 解析 session_key + _inject_watch_notificationcli.py:981-982 shutdown interrupt_all + cli_commands_mixin.py:227-258 /stop + :260-295 /agents + tui_gateway/server.py:5598-5600 TUI 按 delegation_id dedup + hermes_cli/config.py:1778 delegation.max_async_children=3 + 测 tests/tools/test_async_delegation.py 473 行 15 测试)— feat — Hindsight observation_scopes 可配置 a376ca008plugins/memory/hindsight/__init__.py:21 文档 HINDSIGHT_RETAIN_OBSERVATION_SCOPES env + :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-1499 retain kwargs 注入 + :1614-1620 tool retain 路径切 client.aretain → client.aretain_batch 因前者不接此参)— feat — /status 显 model+context ead38107agateway/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_task goals 5035fa902agent/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)f1d6f0436 hermes_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_storetarget_path 参 + :3996 _profile_has_own_xai_oauth_state() + :4007 _write_through_xai_oauth_to_global_root()_global_auth_file_path() is Nonepytest 安全带 :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:1557 AUTHOR_MAP andrewdmwalker@gmail.com=capt-marbles8844e091c merge — MCP — fail-fast noninteractive OAuth dcc321695tools/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/a688d2a1b plugins/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 全字段 redact ad58dd51a + aab2e99baagent/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_PATTERNSr"ntn_[A-Za-z0-9]{10,}"(Notion internal integration token)+ dump 现在无条件触发 API 错误)— Gateway scoped lock 第三 stale 分支 ec05d2bc3gateway/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+jiffy start_time 重用让 cron/nginx/sshd 冒名 gateway) — Bedrock boto3>=1.34.59 软守 2cddc9c89agent/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.46 shadow venv pin 致 converse_streamAttributeError) — s6 / Supervisor 5 修硬化40d7c264f #46266 hermes_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 #46291 service_manager.py:756 _render_log_runchown hermes:hermes "$HERMES_HOME/logs/gateways" 非递归 + docker/stage2-hook.sh:319 cont-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 :758rm -f "$log_dir/lock" 在 chown 后 s6-log exec 前清陈旧 lockfile;95715dcb0 #46483 hermes_cli/main.py:467 _apply_profile_overrideif profile_name is None and not os.environ.get("HERMES_S6_SUPERVISED_CHILD") 让 supervised gateway-default 跳过 sticky active_profile 回退 — Container / Dashboard 4 修4eb0ff639 #46290 service_manager.py:118 gate 从 is_container() and _s6_running() 改为裸 _s6_running() 修 Fly Firecracker microVM 上 s6 dispatch 路径全 inert;aca11c227 #46293 container_boot.py:210 _strip_container_argv_prefix() + :237 _is_dashboard_container() + :439 main() 在 reconcile 前跳过;80f8ffc74 #46487 hermes_cli/main.py:10785-10790 cmd_dashboard() reroute env["HERMES_HOME"]=str(get_default_hermes_root()) 钉机器根防 $HOME/.hermes fallback;f79551378 #45120 scripts/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" 步 + ddf7c7af8 terminal_tool.py:1037-1052 resolve_task_overrides(task_id) 单 helper 路由 file_tools._registered_task_cwd_override_get_file_ops + b0c99c12d docstring 列四步顺序 + 8fce54499 file_tools.py:99-113 _sentinel_free_abs_cwd(raw) 抽 sentinel + expanduser + isabs validation 尾段(用 _TERMINAL_CWD_SENTINELS frozenset :96)+ 6cb88a087 merge — Cron — jobs.json 跨进程 fcntl/msvcrt 锁 e5b4cf7be + 733472952cron/jobs.py:58-59 _jobs_file_lock=threading.RLock() + _jobs_lock_state=threading.local() 重入追踪 + :70 _jobs_lock() contextmanager Unix fcntl.flock(LOCK_EX) / Windows msvcrt.locking(LK_LOCK,1) 跨进程 + :89-129 depth-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_source be7c919bf #46659tools/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_notificationcompletion_reason_status 文本 + exit code -15/143 append ", SIGTERM" + gateway/run.py:12337 agent-notify 合成走 format_process_notification({...}))— Messaging — WhatsApp group JID 路由 target ea49a7963 + 0d82060c7tools/send_message_tool.py:47-49 _WHATSAPP_JID_RE 匹配 @g.us|s.whatsapp.net|lid|broadcast|newsletter + :520-525 _parse_target_ref whatsapp 分支返 (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 clustereae3836eb + f02484feb + 30377e108 + 45e2f4fdc @assistant-ui/store 0.2.13 pin(package.json:38-41 overrides + .github/workflows/typecheck.yml:33-42desktop-build job 跑 npm run --prefix apps/desktop build 让 vite break 在 CI 暴露 + nix/lib.nix:24 npmDepsHash="sha256-m9cjbjzi4SaFCjODfdrawS5e+1ag+MpRn528/upSNqo=");f3b32e9f5 + c23a2eec1 + c33e0457d #46836 macOS Electron pack 重命名前补缺(apps/desktop/package.json:23 "prebuilder": ".../patch-electron-builder-mac-binary.cjs" + :138 "electronDist": "../../node_modules/electron/dist" + 新脚本 60 行 darwin-only patch app-builder-lib/out/electron/electronMac.js doRename() 在 rename → Hermes 前从 runtime dist 复缺失的 Contents/MacOS/ElectronENOENT);fbabf438a + bee13817f apps/desktop/src/store/profile.ts:213 ensureGatewayProfile() 在 gateway swap 后 resync $connection,让 remote pool profile 激活为后台后 image 附件走 image.attach_bytes 而非路径 image.attach0bbf325a8 #46665 dashboard 聊天侧栏 model card 经 session.create 传 management profile;ed20f5ed0 #42241/#46796 tui_gateway/server.py:1957 _apply_model_switch(parsed_flags=...) + :7013-7030 config.set 预解析显式 --provider 时绕开 broken-default agent build + Renderer use-model-controls.tsconfig.setslash.exec368fcf1ff #46772apps/desktop/electron/windows-user-env.cjs parse reg query + main.cjs:243-265 resolveHermesHome() Windows 上先读 HKCU\Environment 注册表;8fe334b05 #44159 apps/desktop/src/components/pane-shell/pane-shell.tsx:88 HOVER_REVEAL_EDGE_GUTTER='calc(0.5rem + 2px)'ae433634d apps/bootstrap-installer/tsconfig.json + shared/tsconfig.json ES2023 — Install / Depsa4ee1f223 + 98205da00 + 1db8f7ea8 + 39f479cba #46085 scripts/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/npmrcnpm install -g 落 on-PATH 命令链接目录;0bbff1fc7 #46744 pyproject.toml:104 "websockets==15.0.1" 入核 + :138 dev=[..., "setuptools==81.0.0"] 从 82.0.1 降配 torch>=2.11 caps setuptools<825f6be7f31 #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',...)CI9eb0bcd60.github/workflows/nix-lockfile-fix.yml + nix.yml29c698559 nix/lib.nix:24 npmDepsHash 刷新;92a456f71 esbuild/vite 锁回升(vite ^8.0.16 / esbuild ^0.28.1)+ hermes_cli/main.py autostash 防 update 时丢本地编辑;30377e108 Desktop renderer build on PRs(见上 @assistant-ui/store 集群)— Discord — slash 100 cap PR #460785e851bc6b + 8f4a718f9 + cffd6e3c8(merge) plugins/platforms/discord/adapter.py:39 _DISCORD_MAX_APP_COMMANDS=100 + :3530 slot_cap=_DISCORD_MAX_APP_COMMANDS-1/skill group + skip 逻辑两循环 + :3613-3620 一条警告 + 200 commands 回归测 — Web — revert(web) Parallel keyless search 撤回 f3fe99863 #46350plugins/web/parallel/provider.py 净 -345 + 删两测试文件 + tools/web_tools.py -234 + pyproject.toml SDK pin 撤)— Misca829e04d6 #46345 hermes_cli/profiles.py:458-486 _migrate_profile_config_if_outdated(profile_dir)set_hermes_home_override scope check_config_version() / migrate_config(interactive=False, quiet=True) 到新 profile + 清 override 防伪 v0→latest 警告 + b2a476646/2a08b8c86 hermes_cli/dump.py:255-272 env 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-1135 v10 trigram 回填在 v11 FTS rebuild 前跳 + 9df1a1a8d hermes_cli/doctor.py:791-802 providers_accepting_vendor_slugs"nvidia" + 60cc42e38 hermes_cli/inventory.py:160-188 user-defined ↔ aggregator 模型去重 + ba3883cd1 + 49e743985 MiniMax M3 reasoning extra_body 入 plugins/model-providers/minimax/__init__.py MiniMaxProfile.extra_body_for() 只在 api.minimax.io AND {"minimax-m3","minimax/minimax-m3"} 两 predicate 都真时发 {"reasoning_split":True} + 975b9f0a5 #46646 CONTRIBUTING.md 加 standard installer 节 + f7c1cbe66 #46795 桌面下载链接到站点根 + 4 条 AUTHOR_MAP(f79b109f4 0xneobyte / c17469cb1 Veritas-7 / 1227007ae capt-marbles / c23a2eec1 #38673 salvaged)— 验证基线 /tmp/hermes-agent clone @ 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 guard a218a0f15 主轴 + 5 修 新建 agent/ssl_guard.py 94 行 + agent/errors.py SSLConfigurationError + escape hatch HERMES_SKIP_SSL_GUARD + hermes_cli/doctor.py:316-318 "SSL / CA Certificates" 节 + 调用点上移到 agent/agent_init.py:903-905 _create_openai_client setup 内 — MCP stdio config exfil-shape 拦截972a9885e (#46083) + a27d7e68c (#46112)hermes_cli/mcp_security.py 96 行 双门匹配 _SHELL_INTERPRETERS frozenset + _EGRESS_PATTERN curl|wget|nc|ncat|socat|/dev/tcp/|Invoke-WebRequest + _EXFIL_HINT_PATTERN .env|--data-binary|-X POST|<filevalidate_mcp_server_entry()_filter_suspicious_mcp_servers()register_mcp_servers 任何 stdio spawn 调;+ 4936a49a0 MCP loop preservation _stop_mcp_loop(only_if_idle=True) 不撕 live agent loop — Approval 敏感文件三连da28d5d11 + abd69b811 + 2b67e96ae tools/approval.py:455 DANGEROUS_PATTERNS 守 cp/mv/install~/.ssh/.netrc/.bashrc + :577 _rewrite_resolved_user_home() 折叠绝对 HOME → ~/ + :208 _USER_SENSITIVE_WRITE_TARGETsed -i / perl|ruby -i in-place 编辑;+ 81e42335a (#45947) file-safety 松绑agent/file_safety.py:49-53.bashrc/.zshrc/.profile,HEAD 只硬阻 SSH/.env/oauth/credential — Read 工具 — 原生抽取 .ipynb / .docx / .xlsx 817f39231 (#37082)tools/read_extract.py 248 行 stdlib-onlyjson/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#45866 b4ba3f5e3apps/desktop/src/lib/completion-sound.ts 519 行 14 Web Audio 合成预设(无音频文件)+ 630a4ef03apps/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:notify IPC + Approve/Reject action buttons + b0288ae9b 完成音 picker 迁到 notifications-settings.tsx 98 行Desktop polish 526a1e24b PR#46029 4 连9cbb91abd #46014 clarify-tool UX + 715b69172 Compaction "Summarizing thread" 汇总指示(agent/conversation_compression.py:43-49 COMPACTION_STATUS_MARKER → Gateway kind="compacting" → Desktop compaction.ts store)+ 1eb13744b 滚屏保活 + 49dd91d68 #46030 CopyButton context-menu-item variant — Desktop misc 4 修08d89e7ab #46197 思考 shimmer 仅在 disclosure label thread.tsx:588-594 + 6b76284c7 #45853 离屏审批跳底按钮 surface "Approval needed" 经 requestScrollToBottom() + 0428945b5 #46073 apps/desktop/electron/backend-env.cjs:70-78 normalizeHermesHomeRoot()/profiles/<name> + 89bdb1e54 hermes_cli/web_server.py:10659/10709 read_text(encoding="utf-8")Agent — 模型 refusal 不重试改直透 content_filter c8ad2ca99 PR#46013 4 连bb46bf8ce Anthropic + Chat Completions transport 把 refusal 映射 finish_reason="content_filter" + 12c84d6c7 只在 refusal 是唯一 payload 时算终止 + 10bd01972 共享 _content_policy_blocked_result() builder agent/conversation_loop.py:411-433 + _CONTENT_POLICY_RECOVERY_HINT 常量 :405-408hermes fallback addCodex reasoning thinking-only 069bfd654 + 1d584a301 run_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 + 2c174bce2 gateway/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 #46074 gateway/run.py:4642-4699_queue_startup_restore_event() / _drain_startup_restore_queue() / _finish_startup_restore()Gateway repaired-turn 持久 2b4873f7f #46071 run_agent.py:1548-1641_flushed_db_message_ids 身份追踪取代位置切片防 repair_message_sequence 缩短历史时丢新尾 — Gateway intentional silence tokens 293c04fef + 0e22bf643 #46105 gateway/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 guard 7433d5f0e + 143679305 hermes_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-3880 PID 文件 scoping — Gateway 回复消息媒体附件 efbe1635d #46107 gateway/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 + 9f33d673e hermes_constants.py:362-395 get_subprocess_home()TERMINAL_HOME_MODE=auto|real|profile + :398-405 apply_subprocess_home_env()HERMES_REAL_HOMEHOME + TUI tui_gateway/server.py:1222-1236 _set_session_cwd() 走 profile-scoped _session_db(session) helper — Skills cluster 6c34088a1 PR#46237 + fc2b8b3d3 PR#46236 5 commit7f245b003 #45966 gateway/run.py:14376-14414 跨进程缓存失效经 message_count 对比 + 3bc4a2ff7 :12801-12850 _refresh_agent_cache_message_count() 每轮 rebase + 7bbe7024c #46201 全局/平台 disabled 并集 + ce19fdb7c 解析点全跟进 + 4e6d05c6a #46149 agent/skill_utils.py:275 _RAW_CONFIG_CACHE mtime+size keyed — Skills bundled-update 备份崩溃安全 3581131e7 + 9a2b97632 tools/skills_sync.py:509-525/590-595/608-625 三段孤儿 .bak 复原 / 清陈旧 .bak 防 move 失败 / restore 前清部分 destTelegram rich messages 24h 内两次翻转57c2a55be 端点 404 退路 → 12682d96b feat 配置 opt-out 还原9459057d7 #46102 math 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 + cf7d5932f gateway/platforms/email.py:354-394 _connect_smtp() 合并 4 call site;port 465 走 smtp_ssl_cls(...),否则 SMTP+starttls;超时/连接错 retry _connect(ipv4_only=True):110 _IPv4SMTP_SSLAF_INET/SOCK_STREAMModels — ZAI GLM-5.2 1M 上下文 bff78a34d + Kimi K2.7 Code 原生 picker 2a14e8957 #46309 agent/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 #46114 agent/model_metadata.py:116-119 cache/openrouter_model_metadata.json + 紧凑 JSON atomic_json_write(indent=0) + :110 _MODEL_CACHE_TTL=3600 1 小时 + 内存→磁盘→live /api/v1/models 三级回退 — Perf waveafc861550 #46065 Webhook 增量 prune(Deque 懒 O(stale) + _RATE_WINDOW_SECONDS=60.0)+ 110687914 #45831 tools/process_registry.py:132 _completion_event: threading.Event + :1098-1127 wait()sleep(1) + 8f278403d #45948 _rpc_server_loop(stop_event) settimeout 5→0.05 + 5105c3651 #46079 api-server _normalize_chat_content O(n²)→O(n) + 4b5ba112a #45979 agent/conversation_loop.py:74-100 _image_error_max_dimension() 解析 provider 错文本 clamp [512, 8000]Miscbf8effad0 #43852 utils.py:63 atomic_replace() 跨设备 EXDEV/EBUSY → copyfile+copystat+fsync+unlink 兜底 + 85e6232a0 Anthropic proxy /v1 支持(build_anthropic_client() 剥尾 + _endpoint_speaks_anthropic_messages()/anthropic/v1)+ 8d5d36d79 #28479 model_tools.py:1115-1125session_idregistry.dispatch + e986e3fc6 + 1b16c4817 Provider OAuth 账号移除 DELETE /api/providers/oauth/{provider_id}_require_token + _oauth_provider_disconnect_hint + 1fa761f8d #36142 Search 超时保部分结果 limit_reason="search_timeout" + 288f7026e Weixin "Personal" 重标 + d76a58bd1 sudo profile system install + 3 条 AUTHOR_MAP — 验证基线 /tmp/hermes-agent clone @ 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 stack apps/desktop/src/store/composer-status.ts 257 行 合并 $subagentsBySession/$backgroundStatusBySession/$todosBySession + 实时 subagent 窗口 openSessionInNewWindow + 用户气泡 <ActionBarPrimitive.Edit> 流式中可编辑 thread.tsx:976 + BrailleSpinner → GlyphSpinner 改名)+ Stick-to-bottom bbf020e (#45263)use-stick-to-bottom: ^1.1.6 + 76b9386thread-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 行 LRU BLOCK_CACHE_MAX + REVEAL_MIN_COMMIT_MS = 33 + 3cf7d43 warm AudioContext 省 850ms)+ Worktree-aware 侧栏 e906726git-worktrees.cjs 174 行 + use-worktree-info.ts 68 行 + workspace-groups.ts 326 行 + WorkspaceHeader/ReorderableList 抽取) — WhatsApp Business Cloud API 新平台 984e6cbgateway/platforms/whatsapp_cloud.py 1956 行 + whatsapp_common.py 367 行 + setup_whatsapp_cloud.py 530 行;HMAC webhook + wamid dedup + 原生按钮 + opus 语音;Platform.WHATSAPP_CLOUDgateway/run.py:6229-6239)— Photon iMessage spectrum-ts 3.0→3.1 573c4e6/9bfff6e(pkg :15 "spectrum-ts": "3.1.0" + markdown() builder 经 PHOTON_MARKDOWN + /react//unreact sidecar 端点)+ 156f4fb add_reaction/remove_reaction API + 05470aa action='unreact' send_message + tools/send_message_tool.py:173-177 + 0a963d8 hermes photon telemetry CLI 切换 — Telegram 富文本永远 on a59d5e3 (#45584) + 7c0605b 流式 final 仍富文本(prefers_fresh_final_streaming + RICH_MESSAGE_MAX_CHARS=32768) — 安全 fail-closed wavefc46354 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_url web_server.py:1679-1681 + c6a992e _host_derived_api_key() 注册标签链尾兜底 runtime_provider.py:103 + 5908822/9514ddb API key 不漏到非权威端点 + 4ead464 secure_parent_dir 拒 chmod /len(parts) < 3 + 5edb346 profile 下 write-deny <root>/.env agent/file_safety.pyGateway auto-resume 重复 agent 防御 6e2fd95 + 63097ee_schedule_resume_pending_sessionsasyncio.create_task 前占 _AGENT_PENDING_SENTINELgateway/run.py:4498-4602 + 全路径回归 test_restart_resume_pending.py)+ JSONL 抄写降级 4 commitb4b118c/351fdcc/024a8e3/1d27be0 state.db 唯一存储;磁盘既有 .jsonl 不动) + Kanban 6 修34120a0 sticky block + 7bcdced respawn defer blocker_auth + 88ee58f stale 不计 failure + 7552e0f/7c622b6 idx 后置 migration + cb125c2 (#45590) worker toolsets 钉 profile) — Billing /credits 7ba5df0 (#44776)agent/account_usage.py:342 CreditsView + cli.py:8399 _show_credits + gateway slash_commands.py:2945 + TUI server.py:4773 + c196269 充值时不提示) — Dashboard profile-scope 全量62b4618 (#45598) 会话+分析 + 88dbf95 (#44792) Channels + _profile_scope(profile) 包所有端点)+ 28bf8fb feat clone profiles from any source + d206e1f 本地文件浏览 home + 9102d4a Win11 host 显示 + a118b94 (#45150) skill install 加 --yesCLI 持久 approval scrollback 4474873 (#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_xai ruamel 圆滑改写 + b4ba425 doctor 表面 + a8a05c8 启动告警 + b4afc65 encrypted reasoning replay + 64a9a19 (#28952) 钉 x.ai 源 + a0c0312 xAI Web Search plugin 560 行 + ca192cf opt-in TTS 停顿) — Bitwarden Secrets Manager 552e9c7 (#30035)agent/secret_sources/bitwarden.py 515 行 + _BWS_VERSION="2.0.0" + install_bws() 懒载到 ~/.hermes/bin/bws SHA-256 校验 + secrets_cli.py setup/status/sync/disable/install) — Context Compression 重构波 11 commitaec3885 保近期轮 + 434c684/c7bee8f 自动聚焦近期用户轮 + 8905ee6/5d0408d flush 游标 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 wave544c31b (#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 / Providers957a8ff Bedrock 受限 Claude 省采样参数 + eed61a1 Gemini systemInstruction 加 role + c8e5f34 (#36141)google//gemini/ 自前缀 + 5acd185 Moonshot union 数组 + 4fd9397 Codex chatgpt.com 移 extra_headers + 7d11fa4 Codex final_answer 完成顶层 incomplete 响应 + bc060c7 (#45492) 移 unavailable claude-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) — MCP 5affecb (#44550) capability-gate tools/list 让 prompt-only MCP server 也连 — Skills hub2ee69d0 (#44500) ClawHub 浏览预算允许 unlimited + fc7e04e/8f92327/c6a380e identifier 级去重 + 1899c8f youtube 经 uv + 3fde8c1 (#30042) 排除依赖/venv + 4373e80 (#45616) Pages 部署回退健康索引 — Computer-usee02a7e5/531efe7 SOM/vision 路由 auxiliary.vision + 5aa4727 app= 过滤无匹配明示 + 4cc1887 保 capture_after 的 app context + 18cd1e5 type_text MCP 名修正 + drag 动作 — Approval allow_permanent 81436e1/55a18e6 端到端透传到 TUI + Desktop 提示 — Update / Installeraedb8ac (#28669) post-pull 语法校验 + 自动回滚 + 573b964/c814d3d 安装前清 unmerged-index + 9b01c4d (#45145) 不弹 polkit + 2a7308b (#26670) Windows hermes.exe 与并发实例隔离 + 78c11d9 更新前停 Windows gateway — Platformf82cb48 + 1185dfd .xls/.doc/.pptSUPPORTED_DOCUMENT_TYPES + gateway/platforms/{signal.py,email.py} + plugins/platforms/simplex/adapter.py DOCUMENT 兜底 + 0fd34e8 (#44778) Teams 文档/视频/音频缓存 — TUI2667601 reasoning-only 助手轮在恢复时仍可见 + b6c7ebf (#44953) provider_routing 透传 + b3f5e17/81cdbbd/d6df38b 长 approval 命令换行 — Misc05b9c84/652dd9c Telegram Bot API 10.1 富文本 + 6724daa (#45592) CLI idle timer + 0333a99 (#45582) session-only analytics 合并 + dba6380ca/d1f23bb2d salvage Yuanbao wechat forward e20e0bd (#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 蓝图 catalog1593ca540 上线 → e8b757845/e976faac7 硬化 → cb29e8a82 rebrand: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/blueprintsBlueprintSlot/AutomationBlueprint/fill_blueprint/blueprint_form_schema/blueprint_slash_command/blueprint_deeplink/blueprint_catalog_entry;slot 4 type time/enum/text/weekdays + WEEKDAY_PRESETS;14 个 blueprint;终结于同一 cron.jobs.create_job,无第二套 job 引擎;Electron hermes:// URL scheme + single-instance lock)+ Suggested Cron Jobs 9a09ea69fcron/suggestions.py 257 行 + cron/suggestion_catalog.py 154 行 4 个 catalog entry;4 来源 catalog/recipe/usage/integration;dedup+latch 按 key、pending cap、accept 走同一 create_jobtools/blueprints.py:217 register_blueprint_suggestion)+ memory/skills write_approval 布尔门96af61b6e (#38199) 上线三态 on|off|approve095f526b1 (#43354) 重构为 boolean write_approval 默 false + _config_version 28→29 migration → 70d5d7e39 (#43452) 修 inline prompt callback + gateway staging + /skills gateway review;tools/write_approval.py 493 行 write_approval_enabled/evaluate_gate;gateway /memory pending|approve|reject|mode + /skills pending|approve|reject|diff|modeacd7932c0 文档 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= 让 child HERMES_HOME 指向 profile dir;CLI <profile> dashboard 走机器 dashboard --isolated 保旧;前端 ProfileProvider/ProfileSwitcher 全局 selector URL-persisted;body.profile > ?profile=;amber ProfileScopeBanner)+ 73dd58499 (#44220) MCP loop HERMES_HOME 上下文 propagate(OAuth token-store 跨 profile 修) + d986bb0c6 (#39084) Profile Builder + a09343cc9 (#44231) SKILL.md editor + cron modal attach-skill + fa7f24e89 Webhook 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 Posture 3e74f75e4 (#43316)agent/coding_context.py 731 行 ContextProfile/RuntimeMode;4 域:System prompt operating brief + per-model edit-format tuning + skill index demote + Toolset collapse;activation agent.coding_context: auto|focus|on|off;subagent 自动继承;不 memoize)+ Skill index demote 而非 hideee1a744ac (#44342) API 改名 compact_skill_categories,每 skill 名字仍在 prompt 一行 names-only;4d6a133a9 (#44387) 一天后反转:demotion 只在 focus 模式下) + a4f179c50 (#44411) GPT/Codex steer V4A 单文件编辑(OpenAI codex-rs apply_patch 唯一 file editor) — Parallel Web Search & Extract e0e257171 1206+/98− 跨 15 文件(keyless 免费 Search MCP search.parallel.ai/mcp Streamable-HTTP JSON-RPC;keyed v1 REST client.search/extractparallel-web 0.4.2→0.6.0)+ 0a5762c78 mcp-web-client 中性 identity + 93764b930/32a73010b keyless web default 永远兜底 — Bedrock e24c935cf (#44293) IAM 拒绝 InvokeModelWithResponseStream 时自动 fallback converse()agent/bedrock_adapter.py:211 is_streaming_access_denied_error) — Anthropic 交错 thinking 5 连aaccaada2 顺序保真 anthropic_content_blocks 端到端 verbatim + 529bb1c3d strip output-only SDK 字段 + 7a1eed826 redact replayed tool input + 加宽 400 classifier + 86e10dd87 thinking-modified 400 路由 recovery + 9f95f72b9 strip api_messages + efcbbde48 in-memory only — SUMMARY_PREFIX 4 连8f8cad7ec (#41607) 抗陈旧任务 + d5e2fbf24 historical context framing + acb2954d8 历史 prefix 冻 + 6c752ca3a HEAD 收紧 wording(topic-overlap 三句塌缩成 WINS+discard 两句) — OpenRouter 183d86b3e (#43436) reasoning_effort 改 verbosity for adaptive Anthropic — Streaming 615ad9792 (#43570) socket read timeout floor 到 stale-stream 180/240/300s — Params 19c07c403 newer OpenAI 系列 max_completion_tokens 名匹配 + 2ce3ae3d1 错分类不误判 unsupported-param — Model 选择af978ecb1/243cada15 昂贵模型确认 + 57c671499 (#43103) Anthropic aliases 保留 + 5a4297a11 MiniMax M3 hardcode 1M — Desktop registry-driven slash + /resume/handoff 3ffbdfbcc (#42351) 1914+/478− 跨 31 文件Desktop composer 解耦 + 草稿 localStorage 6 连c710868fb/292192f7d/d7d281fa3/18d61bd06/3d14f01fd/fdc0d1956/65ddc7c4a per-session 附件) — Desktop VS Code Marketplace 主题 + 可调终端 pane + Floating HUD27a321157 .vsix zlib 手写 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/9121834b3 tighten/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 连**:e96ca1a0d empty 退出/轮转清理(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音频 +4e9be3ee3 test) — **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/4eadef18a DISCORD_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/32a73010b keyless 兜底 — **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 +3c489fda8 Slack 50-cap aliases — **Install/Update/Backup 7 连**:899acfe42winget 0x8A15002B 陈旧注册修 +9662b76d5PATH merge +a5c32cdf3 (#42172)中断 venv 自愈 +cedd9b6d4SSH 跳 passive +dd40600e0/ed2b9e43c backup 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 +2c1920822 audio 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 iMessage 4e4d27875 feat: gRPC-native iMessage channel (no webhook) 主轴收官(删 aiohttp webhook receiver + HMAC-SHA256 验签 + PHOTON_WEBHOOK_* 5 个 env + CLI webhook register/list/delete 3 子命令;改 GET /inbound NDJSON 长连接 + 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 条 npm overrides 钉补丁版钳 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;b3aef57f2 TYPE_CHECKING 包 httpx 修类型 + connect 局部 client ref 防 race;9fb83eaa2 spectrum-ts ^1.18.0 + npm install spectrum-ts@latest314af28e8 + 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-ts attachment()/voice() builder + /send-attachment 端点 + cron multimedia + validate_media_delivery_path 二次校验;fdf48c63c/e79e44af7/0d25cae04 API 收敛走 spectrumText/spectrumReply/spectrumTyping 后又删 replyTo(实测 iMessage 不可靠)+ typing 统一 space.send(spectrumTyping(state))2130ef68b flattenGroups: true064665688/92179352f/3b983e779 Home channel 支持裸 E.164 + DM GUID + _PHONE_PLATFORMS 加 photon + setup 自动 allowlist + _env_enablement home_channel seed;e9b26c7c8/84e4b4b9a/b58ff9345 彩色 banner + assignedPhoneNumber 取号 + auth.json 持久化 phone numbers;033765890 user API 全迁 Spectrum backend Basic auth + DEFAULT_SPECTRUM_HOST="https://spectrum.photon.codes"37561c214 device client_id hermes-agent → photon-cli 修 400 invalid_client + token 双重 validate(PhotonDashboardAuthError + validate_photon_token/api/auth/get-session/api/projects/);637cf94be strip_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 overlay 52f7e24a7(新 gateway RPC plugins.manage at tui_gateway/server.py:9252-9328 加入 _LONG_HANDLERS,action list/toggle,错误码 4017/4019/5026;新建 ui-tui/src/components/pluginsHub.tsx 238 行 + 配套 overlayStore/useInputHandlers/appOverlays 通路 + /plugins slash 无 arg 直开 overlay;键位 ↑↓/Enter/Space/Tab/1-9,0/Esc)+ /plugins slash 改写 b8eede7bdcli.py:7303-7366PluginManager.list_plugins() 改用 _discover_all_plugins 让 freshly-installed-but-not-enabled 也可见)+ plugin install subdir 支持 f6f573eba (#42963)owner/repo/path/to/plugin shorthand + <url>.git/path/to/plugin 自然边界 + <url>#path/to/plugin 显式 fragment;新 _resolve_subdir_within.. traversal/绝对路径/symlink-out)+ optional-mcps 入 wheel+sdist 39b76d901 (#39859)MANIFEST.in:3 graft optional-mcps + pyproject.toml:300-301 per-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 全链路加入d7886da08 Anthropic 直连列表 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 live context_length step-5f branch 967c325da (#42986)agent/model_metadata.py:1815-1835 if effective_provider == "openrouter": fetch entry.get("context_length") — 修 fable-5 等新 slug models.dev 缺时落到 200K 默认;保留 Kimi-family 32k underreport guard)— Curated models c4066091c (#42629)poolside/laguna-m.1:free + nvidia/nemotron-3-ultra-550b-a55b:free to OpenRouter free 块;e687292eb (#42628) Nous recommended-models 持久化 $HERMES_HOME/cache/nous_recommended_cache.json per-base map atomic write + Portal 失败 fallback;54318c65b (#42614) seed_cache_from_checkout(project_root)hermes update 时从 checkout website/static/api/model-catalog.json 自动 seed disk cache(covers Docker/no-git zip update 路径 main.py:5836-5838 与 git pull :8402-8416)— Observability 9f1c16a7f 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;021d1034d adaptive config 对齐 [components.config.tool_parallelism] mode="observe_only"(之前 [components.config] mode="route");85852b71d (#42691) preserve downstream errors via _run_managed_with_downstream_preservation + 按 _DownstreamExecutionError class-name + .original 属性 shape 探(不 import 私类)+ tolerant str.startswith match 让 Relay 未来加 traceback 后缀也不丢 unwrap;execute_llm + execute_tool 共享 scaffolding 去重 ~20 行 — Desktop reconnect/sleep/wake 恢复 cluster 8d71c3891 (#43004) useRouteResume 三 ref + seenGatewayStateRef 让 mount 不被误当 reconnect;72f522d46 + be2f739e9 sleep/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,Python delete_profile 现 capture remove_error 再 re-raise RuntimeErrord04616964 (#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 RPC dbbd1d4d0(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_attachment 8 个 helper)+ Desktop 后台流式 09a6a2ddd (#42399)(三个 Chromium switch disable-renderer-backgrounding / disable-backgrounding-occluded-windows / disable-background-timer-throttling + backgroundThrottling: false 修后台窗口 stuck on Thinking)+ Desktop ES2023 c1927d234 + debug report explicit URL only e0f6a35ac (#42515)EXPLICIT_URL_RE + LinkifiedText explicitOnlyagent.log 不被误识为域名)— TUI / CLI f8adefdeb fix(tui)TERMINAL_CONFIG_ENV_MAP at hermes_cli/config.py:5156terminal.* config 翻成 env var twin + apply_terminal_config_to_env() 让 TUI/dashboard 子进程也走 classic CLI 的同套 bridge;520b59db1 + 4b073d090 fix(tui) _load_fallback_model() 改 delegate to hermes_cli.fallback_config.get_fallback_chainHermesCLI.__init__/gateway.run 对齐;ab98818e5 + d66bac5a1 + 714183530 + b5f8996cc 修 native Windows confirm modal #33961(之前从 daemon thread input() 与 prompt_toolkit 主线程 stdin 锁死,/reset 卡 + Ctrl-C 吞)现走同 modal call_soon_threadsafe 路径;d1f23bb2d28 文件 85 个 call sitestdin=subprocess.DEVNULL 修 TUI 模式下 subprocess.run/Popen 继承 stdin 致 race-read EOF 让 gateway 干净 exit on mid-tool-execution;bddab61bc + 8bb60ff03scripts/check_subprocess_stdin.py regex scanner + 包成 pytest 让 CI 第一时间挂掉新漏;2c1aaa9cb + dba6380canoqa: subprocess-stdin marker 让 claude setup-token 交互登录保留 inherited stdin;a46462ec6 (#42435) hermes dashboard register 显式 --portal-url 持久写 .env 即使非 default + 从 --redirect-uri 派生 HERMES_DASHBOARD_PUBLIC_URL(仅 ORIGIN 不含 callback path) — hermes-ink 1e5ff4a57 (#42527) 终端 raw-mode 退出时关 DEC mouse tracking (1000/1002/1003/1006) 防 SGR 35;col;row M flood over prompt;re-entry 经 setImmediate 让 reassertTerminalModes 落在 alt-screen enable 之后 — Gateway-UI 9351cbafa (#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 adapter supports_code_blocks: bool;7 个 adapter (telegram/slack/whatsapp/matrix/weixin/feishu/discord) 设 True;6d2732e78 MarkdownV2 edit finalize(adapter REQUIRES_EDIT_FINALIZE: bool)+ f4531feee _strip_mdv2 顺序修先剥标准 **bold** 再 MarkdownV2 *bold*** 半剥成 *Sessions/Dashboard 639c1e363 feat(sessions) 加可选 max_concurrent_sessions cap(顶层 config 优先 over gateway.*)跨 CLI/TUI/dashboard/gateway;新建 hermes_cli/active_sessions.py 321 行 lease registry 在 $HERMES_HOME/runtime/active_sessions.json + .lock POSIX fcntl.flock/Windows msvcrt.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 registerHERMES_DASHBOARD_OAUTH_CLIENT_ID stable key 幂等(重跑更新而非新建副本)— Agent/Codex/API 3a74b7521 + 57775e9e1 (#42741) 识别 LM Studio/llama.cpp 把 ctx 报 token 但 prompt 报字符的措辞 "... 65536 tokens. ... your prompt contains 77409 characters" 走 output-cap 路径降 max_tokens 而非误路由到 compression;cb4cc08b0 Codex app-server thread/tokenUsage/updated 通知现也接入 session accounting(之前在 turn/completed 之外发因此被丢,导致 session_* 不长、context compressor 不动);新建 agent/codex_runtime.py:_record_codex_app_server_usage(agent, turn) 翻译 Codex bucket 名为 CanonicalUsage;b23184cad api-server _run_agent executor 现 set_session_vars(session_id=...) 让 tools 看到正确 HERMES_SESSION_ID(之前看 OS env stale)— Terminal a38cc69bc (#42653) POSIX _SANE_PATH 8 entry 缺啥补啥而非用 /usr/bin 哨兵跳过(修 macOS launchd 已含 /usr/bin/opt/homebrew/{bin,sbin}gh/brew 不可见);新 _path_env_key 处 Windows case-variant PATH/Path76f89d66d (#42695) test 锚定迁到 TERMINAL_CONFIG_ENV_MAP 替 AST-scan 已消失 _config_to_env_sync 字面量 — Yuanbao ffcd9d7ac 媒体解析三阶段 middleware 拆分(QuoteContextMiddleware → MediaResolveMiddleware → PatchAnchorsMiddleware)+ 私聊 fallback 从 _msg_content_cache 恢复 local 路径不 re-download + 三源 (own/quote/group-observed) first-occurrence dedup;24a934295 测试加 missing patch import 修 25 call site NameErrorSkills-hub 5e9d7a766 (#42347) 修两 bug 让 GitHub rate-limit-zeroed catalog 不再上线:(1) scripts/build_skills_index.py write-before-check → 失败时 exit 2 不写 + deploy-site.yml 移除 || echo non-fatal 让 step 严格致命;(2) GitHubSource._list_skills_in_repo 403 silent return → 经新共享 _github_get 重试 + 把 429 视作 rate-limit 信号;ClaudeMarketplaceSource 持持久 GitHubSource 让 rate-limit state 跨 marketplace-index fetch + per-skill inspect call 保留 — Doctor 732ababa1 + aa424e51a 允许 model.provider: custom:<name> 的 vendor slug + is_aggregator 识别 custom:<name> 作 OpenAI-compat aggregator(命名 custom provider)— Deps/Packaging/Nix f6416f50f (#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-timeout method signal→thread 跨 Windows;a5d05cf30 (HEAD) nix/lib.nix:152-160 npm-lockfile-changed branch 不再跑 .#fix-lockfiles("its so slow");02f878ec5 (#42856) Windows native 数据目录文档纠正到 %LOCALAPPDATA%\hermesscripts/install.ps1 设的真实路径,原文档错称 %USERPROFILE%\.hermes);68a997fed README 加 SEO 锚链 — 杂修+测试 50ad191a8 (#42626) autouse fixture monkeypatch.setattrraising=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/webhookX-Spectrum-Signature HMAC-SHA256 + ±5 分钟时钟漂移拒绝 + message.id 去重;outbound 因 Photon 暂未公开 HTTP send 端点改 spawn Node sidecar loopback 8789 跑 spectrum-ts SDK,shared bearer token;auth.py 581 行 RFC 8628 device-code 流 + token 持久化 ~/.hermes/auth.json:credential_pool.photoncli.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);186651857 group-chat mention 门禁;630318e95 refactor 把 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)):a706a349bgateway/authz_mixin.py 426 行 4 鉴权方法 + 1c68f6f81gateway/kanban_watchers.py 1064 行 6 kanban 方法(1035 LOC)+ 619bd7827gateway/slash_commands.py 3393 行 42 个 _handle_*_command 处理器(3200 LOC)合计 4883 LOC 自 run.py 移出;CLI 双轨:b2e605324+4da45e872+568e12761+1a626470chermes_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:9e360681f web_server.py +53 /api/hermes/update/check 加 best-effort commits list;ed1e2533b 新建 apps/desktop/src/lib/version-bar.ts + .test.ts 在 status-bar 同显 client vX · backend vY + drift flag;64da518db checkUpdates/applyUpdates 经 connection.mode === 'remote' 改驱动后端 /api/hermes/update 命令中心路径;9c264555b 新建 apps/desktop/src/lib/update-copy.ts + .test.ts resolveUpdateCopy({target, shownItems, copy}) 显 "Backend update available" + 无 changelog 时 honest copy;87ac7cac1 _recent_upstream_commitsHEAD..@{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.ts merge helper + store 两套独立 atom;81647458c remote restart 后 poll backend 直答清 overlay;cd030f5f4+b000e05b1+74239b494 overlay 成功/无返回的诚实判定 + i18n)— Desktop 主题 per-profile9b1e0d6f7 feat(desktop): assignable themes per profile (#42286)apps/desktop/src/themes/context.tsx:25-60PROFILE_SKINS_KEY/PROFILE_MODES_KEY/LAST_PROFILE_KEY per-profile 持久化 + profilePref<T>() factory 让 default profile 直走 legacy global slot 保 single-profile 安装零变化,命名 profile 自身记录、未赋值时 fallback global)— Desktop hover-reveal 折叠 sidebard65b513f2 (#41670) PaneShell hoverReveal prop:collapsed 时 hover 左边界 float 回为 fixed overlay 覆盖 main content + edge hot-zone + 持久 resize 宽度 + pointer-leave 退回;session sidebar opt-in) — Shift+click 状态栏 zap 切全局 YOLOfa42ac094 (#41666) 之前只切 per-session bypass 同 TUI Shift+Tab;Shift+点 zap 翻 approvals.mode config "off"/"manual" 全局影响 CLI/TUI/cron 且 survive 重启;statusbar-controls 经新 StatusbarSelectModifiers 透传 shiftKey;yolo-session.ts setGlobalYolo() config.set scope="global")— Desktop viewport 不再追流式输出e029b7597 (#41414):删 streaming ResizeObserver re-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 skillace4b722d 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_task batch mode 并发,整 diff 不裂片,每 reviewer 拿 terminal/file/search toolset + repo path;支持 focus/dry-run/scoped modifier;零核心修改全靠 orchestration)— Windows ConPTY 接通 dashboard /chat tababcf996b1 feat(windows): enable dashboard /chat tab via ConPTY (win_pty_bridge) + tests (#42251)新建 hermes_cli/win_pty_bridge.py 179 行 POSIX PtyBridge drop-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/pty WebSocket handler 完全 platform-agnostic)— Codex OAuth 帐户独立 pool entry + OpenRouter pool 自动侦测c78b3e1d3 hermes auth add openai-codex 改创独立 manual:device_code pool entry 不再经 singleton _save_codex_tokens 覆盖前一个;9c9d9113a (#42263) hermes_cli/auth.py:1589-1605 resolve_provider() 在 env 后 fallback load_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) ProviderProfilesupports_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-model supports_vision41f071428 (#41036) _supports_vision_override() 扩 legacy list-style custom_providers 路径)— Compression 防泄漏四连8513a6aec+cca3b77a4 cross-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 + 2a10da3a1 topic+split 后 /model+/reasoning override 保(之前 handler 从 raw event.source 推 override key 跳过 thread_id recovery,写在一种 key 下一回合读另一种 key #30479)+ b18490b89 transcript 全装 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 现也 echo current_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 集群8e4c447e5 duplicate user message in state.db(agent_failed_early+not-new-messages 两 fallback 路径 missing skip_db=True 重复持久化)+ dd0d1222a cascading interrupt hang(interrupt close worker httpx 触 RemoteProtocolError 被误为 transient connection error 重试,每次 retry 停 stream-stale timeout 300s)+ d55304c39 voice 在 agent 跑时也转录(之前 STT 在 running-agent guard 后跑,voice effectively 丢) + 4d0f2bd24+fec5ca71d busy_input FIFO(#28503) + 2e6286278 (#41716) Telegram polling-conflict reschedule 用 get_running_loopget_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)— Auxiliary2789bf4e2 (#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-only instructions/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 集群e88116256 git fetch scope 到目标 branch(bare git fetch origin 拉数千 auto-generated branch 让 installer 与 hermes update 停几分钟)+ fc0900d12+5d7abf911+a5c12f5f5 (#40998) commit-less checkout 重 clone 不删(rename 到 <dir>.broken-<ts> backup 永不 destructive rm -rf) + 4219a91df (#41940) nix addToSystemPackages 时 config.yaml 改 0660 group-writable + d02a59b67 (#41867)+7230fcb7f revert (#42151) nix cold npm 构建 + 15c99b437 (#40690) NixOS node-gyp PYTHON env — Hindsight/ACP/Curator09d66037f (#40605) Hindsight 仅新回合 delta 上送 + 777dc9da6 (#41724) ACP session provenance 元数据 _meta.hermes.sessionProvenance derive from parent_session_id/end_reason 不持久化 - 让 client 不再需要解析 status text、猜 token drop、读 state.db 新建 acp_adapter/provenance.py + 9b631e4ae+f5bd09af4 ACP 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 gate is_curation_eligible() + 候选枚举防 LLM consolidation pass 看到(之前 curator idle-archival 路径可 archive bundled plan skill 让 /plan 沉默返 Unknown command)— Terminal/file-tools6459b3d99 CWD-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 拒收 sentinel TERMINAL_CWD,worktree edits anchor 在 live cwd 存在前(之前 fresh worktree session registry 空 stale TERMINAL_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 围栏块替 noisy terminal: "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,未发新版;GitHub compare 报 108 commits / 290 文件 / 41 contributors,本日 main 线性枚举得 97 独立 SHA;约 62 fix / 12 feat / 8 chore / 6 test / 6 docs / 1 refactor / 1 hardening)— Compression 时间锚定d87f2939 agent/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% 压缩阈值0524c9bd 5 文件 +218 route-level override 仅 Codex OAuth 路由的 gpt-5.5 因硬钳 272K 窗口提至 85%,其他路由不动;compression.codex_gpt55_autoraise 默 true 可关)— Trajectory 配对保护f10a3309 trajectory_compressor.py +81/-10_is_boundary_clean/_snap_boundary 让压缩边界绝不切开 gpt+tool 块,对 RL 训练数据生成尤要紧;+121 测试)— Onboarding 结构化 profile-buildcb3e41e2 5 文件 +174:新建 agent/onboarding.py +60 profile_build_directive() 强制 agent 必先征同意 / 严禁沉默读已连接账户 / 经 memory target="user" 持久化;gateway/run.py +31/-1 首条消息 swap intro;hermes_cli/config.py +6onboarding.profile_build"ask";+73 测试)— Desktop 统一 overlay 设计系统f033b7d8 33 文件:所有 overlay raw <button> 统一到共享 Button + 共用 shadow-nous + --stroke-nous 发丝边线 + 1px inset outline + BrandMark 替 sparkle + LogView/ErrorState/SearchField/OverlaySplitLayout 跨 feature 复用;随附 d165933 DESIGN.md 成文规范)— Desktop 工具后端完整 GUI 配置20fd0bde settings/constants.ts +103/-2 ENUM_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 远程媒体中转16786f3b 11 文件:新端点 image.attach_bytes 25MB cap + pdf.attachpdftoppm 150 DPI 渲染 PNG 50MB/25 页 cap + GET /api/media base64 data URL 限白名单扩展名 + media root;Desktop use-prompt-actions.ts +47/-4 remote 模式自动切上传字节;media.ts +22 isRemoteGateway/gatewayMediaDataUrl)— Desktop per-session 回合计时器9d726807 5 文件 +142/-8:把 $turnStartedAt 从全局搬到 ClientSessionState,修后台仍跑回合切换显示从零的假象)— Dashboard 字体独立选择器9e631098 11 文件:新建 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_USERS opt-in;Discord _component_check_auth +19/-18 + 93 测试,与 Telegram/Matrix 契约对齐)— approval denylist shell-escape 剥除621bf3a 2 文件 +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 路径穿越拦截56f833e 2 文件 +95/-1 关 #40566:tools/skills_tool.py:_skill_lookup_path_error +57/-1 三检 POSIX/Windows 绝对路径 + .. traversal + Windows 盘符)— memory tool shadow 拒绝fe8920d 2 文件 +73/-1 关 #40902:MemoryManager.add_provider_HERMES_CORE_TOOLS 比对命中即拒入路由表防 clarify/delegate_task dispatch 劫持;built-ins always win)— Bitwarden zip-slip 防御8f7567c)+ api-server REST cron prompt 扫0c48b71 2 文件 +113:POST/PATCH /api/jobs/*_scan_cron_prompt() 与 agent tool 共用扫描器,defense-in-depth)— SEARXNG_URL config-aware 自动侦测7df81d05 HEAD merge #41482:新 _env_value() 先查 get_env_value() 后回落 os.getenv();让 config-only 设的 URL 也进 auto-detect cascade)— URL 非 ASCII percent-encode333f01b PR #41430)— Skills browse 全目录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 保留0e0d704 2 文件 +91/-11:新 _terminal_task_cwd() non-local backend 保留远端路径不被本地化清空;+f9ea492 测试)— Pillow 提核心依赖b13ab0b pyproject.toml +14/-8:oversized image 缩放在 vision-embed 关键 + 修 lazy-install 在 prompt_toolkit 持终端时锁死 #40490;[vision] extra 收为空 back-compat alias;+5b55f4f uv.lock 同步 + c3d750c + d47f919 教训外推所有 lazy-install 在 prompt_toolkit 持终端时强制 prompt=False)— 自定义 provider v11→v12 迁移保留 models 映射887295b 3 文件 +134/-17:新 _custom_provider_entry_to_provider_configmodels/context_length/rate_limit_delay/discover_models/extra_body/api_mode→transport/model→default_model 不丢 per-model context_length 元数据)— model.default_headers 三处一致生效a216ff8 agent 主 + ffe6652 aux #40033 + 591e6fb computer_use)— Kimi 严格 thinking ⊕ reasoning_effortce4e74b + 03392b6 opencode-go 同契约)— Windows 强化210f4e7+8720023+5dee40f powershell.exe 绝对路径 / b08662b stderr Unicode handler / fc086da JOB breakaway / fe0b3f2 watcher Popen 重试 / f3af489 install.sh root-owned npm cache 提示 #39688 / bec0796+fe2942a color-emoji fallback #40364)— MCP 已 ready 跳过 preflightaf08c43 关 #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)/ /model per-session 不泄进程 env(5a3092b 关 #41120)/ Desktop session 列表按 profile 过滤(b55ac45)+ Gateway startup 加固(330ca45)/ TUI liveSessionCount 只变值时 patch(8992955)/ uninstall Chat GUI 不动 agent(5b43bf72)/ Home Assistant 从 /update allowlist 退出(f4a73ab)/ install/TUI/workspace 安装作用域 6 连(4bf5202+0416f85+675fb10+1c0437d+7db7a94+f2e8234)/ Bitwarden 无 TTY 早报错(89040e0)/ OSV npx --package honor(c0424b0)/ 6 docs 修补 / 5 chore(release) AUTHOR_MAP

  • 2026-06-06-update: 75 commits 跨日同步(hermes-agent 66a6b9c930 → c79e3fd0bv0.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 发布3c231eb39pyproject.toml:10 + hermes_cli/__init__.py:17 __version__ = "0.16.0" + __release_date__ = "2026.6.5")— /version 全栈贯通9c1bb8d2c+30340eae2+78122c52chermes_cli/commands.py:219 CommandDef("version", aliases=("v",)) + CLI cli.py:9076-9079 + Gateway gateway/run.py:10942-10946 _handle_version_command reuse format_banner_version_label() 含 git SHA + Desktop slash-command + Slack /q 因 50 槽硬上限被新 /version 顶出去仍可 /hermes q 触达)— /usage 用量感知 Credits 系统fcb1944b4 33 文件 +4535/-26新建 agent/credits_tracker.py 723 行 CreditsState dataclass :93subscription_micros SIGNED 唯一允许负值 + 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_usage agent-independent(TUI slash-worker 无 agent 也能 print credits block);TUI appChrome.tsx +90 cents delta + escalating usage band 段 + (dev credits) banner 经 HERMES_DEV_CREDITStests/agent/test_credits_tracker.py 909 行 92 测试 9-state 矩阵;c79b6f23e grant-spent 一次性闪现不再 sticky)— /steer 桌面化 + 中转可信标记(6 commit:composer/controls.tsx:75-89 <SteeringWheel size={16}> busy + trimmed-draft 时显示 + composer/index.tsx:176 canSteerefa53fb3b Cmd/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")7cceead27 system note 渲染为 codicon (compass) 替 ⏩ emoji;0f45509da mid-turn steer trusted 不读为 injection)— Desktop 可重绑键盘快捷键面板(7 commit + Merge:新建 apps/desktop/src/lib/keybinds/actions.ts 125 行 单一 keybind registry(KEYBIND_CATEGORIES composer/profiles/session/navigation/view + PROFILE_SLOT_COUNT=18 ⌘1..9/⌘⌥1..9 + KEYBIND_READONLY composer.send/.steer/.history 等不变 row)+ 新建 combo.ts 169 行 event.code-based 规范化让 Shift 不变 base key(shift+/ 不变 shift+?) + 新建 store/keybinds.ts 139 行 nanostore $bindings 仅持久化与 default 不同的项 + $comboIndex reverse 查 + $capture armed 等下次 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 重构嵌套;812dc6957language-switcher.tsx 可搜索;112a0732c +3051 单 commit 大补译 ja/zh-hant;1c2189839 settings i18n keys 转 camelCase;fbd423b94 localize desktop chrome)— Home Assistant adapter 迁入 bundled pluginc37c6eaf2+ef7e5168b新建 plugins/platforms/homeassistant/adapter.py 128 行 + plugin.yaml 22 行,删 gateway/run.py -7 inline 路径,与 Mattermost/Discord 迁移对齐;/update allowlist 收紧让 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_copy deepcopy 兜底 + 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 浏览器重做56236b16e 4 文件 +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 配置2bf0a6e76 7 文件 +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 :7764 spawn-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+b91aade17 8 文件 +411 + 7 文件 +217:/api/model/optionsinclude_unconfigured + picker_hints + canonical_order 让 GUI 看到全宇宙;apps/desktop/src/app/settings/model-settings.tsx +174 inline "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/-37hermes_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 --replace workaround,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 末项;0cbcc7593 queue 可靠性 14 文件 +656/-122;e375c33f7 +71/-25 TUI message.complete 边界 force-send 一次中断路径 queue+interrupt 替 optimistic send;40386f33eshadow-composer 平衡 Apple HIG;8e629b9f3 +25/-11 onCompositionEnd flush 修 IME #39614 + 三测 中/日/韩)— Desktop About panel 显活版本 + macOS updater repair + OAuth path 修(3 commit:16beab421 +19 seed applicationVersion: resolveHermesVersion()hermes_cli/__init__.py 读 + click handler showAboutPanelFresh 每次开重解,in-place update 无需重启 reflect;0c0a70774 updater helper paths.rs 路径解析;b8234e759+be2c64be0oauth-net-request.cjs 20 行 helper + 34 测试避受限 origin header + serializeJsonBody wire 进生产路径)— FTS5 ":" 脱毒 + delegate content-blockd1771114e+f83918c31+f8a241e10hermes_state.py:2708-2739 _sanitize_fts5_query Step 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.exeebed881d4:抽 _run_quarantined_install helper 让 dep-verification repair 同走 rename-out-of-the-way/restore-on-failure;hermes_cli/main.py:8776 _hermes_exe_shims + :8791 _detect_concurrent_hermes_instancesproc.parents() 整祖先列扫 + 只排 shim 父进程;:8934 _quarantine_running_hermes_exe:12836 扫 stale hermes.exe.old.* 清理;regression test fail on old / pass on new)— Desktop log 大小封顶 + 级联轮转abbf05024+146e77684 apps/desktop/electron/main.cjs:265-268 DESKTOP_LOG_MAX_BYTES=10MB / BACKUP_COUNT=3 / DISCARD_BYTES=40MB:mirror Python RotatingFileHandler cascade live→.1→.2→.3 drop 最旧;steady-state ~40MB;DISCARD_BYTES 上 ceiling 直接删 multi-GB boot-loop 巨档自愈用户磁盘;同步/异步两路径都 try/catch 保 startup/shutdown 不被 logging 错阻;伴 2820d87ea tolerate stale dashboard --tui from 旧 desktop shell back-compat guard 防 crash loop)— Middleware next_call 单次性 + deepcopy 兜底 + translated 错误保留c4c5548eb+5abe45674hermes_cli/middleware.py:258-302 next_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 证书侦测fd234bad6 scripts/install.ps1 +40Show-NpmCertHintunable to get local issuer certificate 给 actionable NODE_EXTRA_CA_CERTS / strict-ssl remediation 修企业 MITM proxy / 缺 root CA 误读为权限问题 #38016)— Gateway plain text while busy 默认 interrupt54e7b74f7 4 文件 +52/-18 关 #38390/#31588:busy_input_mode 重夺单源真理,busy_text_mode 沦为遗留显式 override;所有默认 fallback queue → interruptgateway/run.py:3223-3245 _load_busy_input_mode/_load_busy_text_mode HEAD 实证;伴 ports compression.enabled=false 时 long-context 429/413/context-overflow 不再静默 _compress_context() 而是终结错 compaction_disabled: True)— 杂项50f9ad70f Dashboard cron 派单下拉读已配置 platforms / 338c07433 send-message ntfy topic 当显式 / ea266f43e rg/grep search error guard 接 partial matches 保留 +266 / 7c4aa3e4d+c79e3fd0b image-gen artifact 路径暴露 backend-visible + 抽 map_cache_path_to_container 共享 helper / 5af899c7c profile alias 显示反向查 wrapper dir / e6de6dd55 skill 详情对话框间距 / 78122c52c /q test 因 /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 会话聚合b94b3622b 52 文件 +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 Sockets4891f9ae7 12 文件 +585 / -173:新建 apps/desktop/src/store/gateway.ts 290 行primaryGateway + secondaries map + 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.title RPC 让 /title work、aux model 搜索移除)— Desktop 全局 Cmd+K 调色板 + UI 一致性大扫除ac9de2e80 + 15 style/feat commit:新建 apps/desktop/src/app/command-palette/index.tsx cmdk + store/command-palette.ts open/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 + 配置持久化4a1907bd1 36 文件 +4226 / -1378 + 1d9c3ebae 21 文件 +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 三新 providerBasicAuthProvider 用户名/密码acb0e2bac 新建 plugins/dashboard_auth/basic/__init__.py 491 行 无外部 IdP 无 DB + scrypt password_hash + stateless HMAC token + env 赢 config.yaml 与 Nous 一致)+ SelfHostedOIDCProvider 通用 OIDCf57ce341d 新建 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 registerbb291b6bb hermes_cli/main.py:12403 cmd_dashboard_register + :15712-15754 subparser 含 --issuer/--client-id/--portal-url)+ Desktop username/password 远端 gateway 登录bd12b3c23 + 9d07927a2 OAuth-aware + scheme probe bf590c81d + dead WS ticket 回避 385a508e4 + 重新 mint OAuth WS ticket on reconnect 928f1ac0e)+ ed63170e pluggable non-redirect password 登录+ Verify chain 一 provider 错不短路616c0a36b)— Discord 语音频道软件混音器8a9ded5b2 6 文件 +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 双面6bf55a473 4 文件 +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 视频会议邀请事件f3bbfda6d gateway/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 refactor slim parser)— Gateway max_tokens 全链路传播修复(#20741,4 commit:cf786593c gateway/run.py:1205-1232 max_tokens chain 优先级 HERMES_MAX_TOKENS > model.max_tokens > custom_providers max_output_tokens > None + :2621,2719 session override/runtime_kwargs;1c909e75e CLI cli.py +14 路径补 HERMES_MAX_TOKENS env override;14275d7ba hermes_cli/runtime_provider.py:477 _lift_max_output_tokens accepts max_output_tokensmax_tokens sibling 字段 + :559,581,631,720,759 5 处 call site;2dda393f9 tests/gateway/test_max_tokens_propagation.py +178 回归保护)— discover_models 在 named-custom 流接上(2 commit 7ae8aac3b+4b2d00f84 共 +294 行,custom_providers section 4 与 hermes model named-custom 不再静默忽略 discover_models: true)— Update 非交互默认 stash/restore72eb42d9e 8 文件 +335 / -255 revert #38542/#39568:hermes_cli/config.py:2287-2293 non_interactive_local_changes 新 key 默认 stash + _config_version 26→27hermes_cli/main.py:8378-8423 _discard_stashed_changes() 永不 reset --hard/clean -fd 用 stash + drop 保 ignored 路径生存;scripts/install.ps1 +76 Windows 同步 stash 替 git reset --hard HEAD + 只在真控制台 prompt restore + stash 保留含恢复指令;205 测试 4 case 覆盖 discard/stash/interactive/missing-section)— Update Windows 卫生 4 连db204ae20 ensure_uv() 穿越更新边界(首次安装后 hermes update 不崩)+ d880b5be0 Windows 不返 _UvResult namedtuple(subprocess argv 崩)+ 98528c78c 178 行 desktop 不与自身后端 race(先 graceful 拉自身再 spawn 升级器)+ 14fee4f11 +33 retry handoff 一次 + 1f347ee54 venv "move aside" 而非 gut(Windows 锁 .pyd) + c136eb4de rebuild 后验 core deps — hermes-ink SGR 鼠标分片根因修复f35432354 supersedes #29337/#17701/#18113/#26781/#28463/#35512:ui-tui/packages/hermes-ink/src/ink/termio/tokenize.ts +40 flush 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 整套死代码;725290db6 fuzz 测试加固)— TUI cgroup-aware V8 heap cap2f523a469 ui-tui/src/lib/memoryMonitor.ts:20-50 resolveThresholds() 阈值从 getHeapStatistics().heap_size_limit 派生 critical ~88% / high ~70% 真 ceiling 替硬编码 2.5GB,受 cgroup 限制的小容器不再静默 OOM kill)— State PRAGMA wal_checkpoint(TRUNCATE) 防 WAL 无限增长46b2afc56 hermes_state.py:597,617-651,4107 每 50 次写 off-hot-path + exit/dispose 时 TRUNCATE;19db9cd07 ACP 改走公开 update_session_meta() 不绕封装)— Gemini 原生 maxOutputTokens + 去 OpenAI extra_body 污染ec46f5912 7 文件 +277,agent/auxiliary_client.py:662-668 translate extra_body.reasoning → Gemini native;e8c3ac2f5 Fireworks/Mistral strict APIs 同向 strip extra_content)— perl/ruby -i 在 Hermes config/env 路径上落闸a6a4e6f9d+b04c6e95f tools/approval.py:446-454perl -pi -e/perl -p -i/perl -i.bak 三形式,与 sed -i 闸对齐堵 2026-06-01 双闸门遗漏的 perl/ruby 入口)— react-router-dom 7.17.0 GHSA-8x6r-g9mw-2r7846c16b928 + 6b77fd2a0 Nix npmDepsHash + 736dc0fd8 切 fetchNpmDeps)— Web SSRF 检查移出 event loopc60952ba9+93b5df318 tools/url_safety.py:355 async_is_safe_url DNS 不再阻塞 async web_search/fetch;mock 同步更新)— Vision ProviderProfile flag 取代 models.dev 目录d33d23c85+f736d2be8 agent/auxiliary_client.py:3958 _main_model_supports_vision 走 profile flag)+ 像素维度上限dd4ba4c2c+6bdbe3076 高分辨率小字节也 cap 防 API 拒 + 声明 Pillow)— MiniMax 视频 type=video block + M3 默认 aux 模型对齐前沿153fe2847+0b46c4163 outbound translate 把 Anthropic input_video → MiniMax video3d1d0a49f+b531b5d12+fa8e2f935 minimax+minimax-cn default_aux_model 钉 M3 frontier;9756dff5f Grok-4.3 陈旧 256k cache 失效)— Cron 顺序任务非阻塞 + 解耦完成9fbfeb31b+eb9cde734 cron/scheduler.py:161-195 持久 single-thread _sequential_pool 保 tick 间顺序但 dispatch 不阻塞;MCP 任务后清扫;30412a977 陈旧 cron-output 删前复验 #37721;b0d234f06 cron list 容忍 null repeat)— Docker wave(hindsight-client 烤进镜像 96f0ddc6a #38128 / libolm-dev for python-olm 2e628ae97 #33685 / chown gateway tree 03ba06ebf #37928 / chown build trees 5446153c9 #35027 regression / --user <uid> 拒绝 + guidance 343c54e35 #38579 / Unraid uid 例外 7402706c5 #38098 / config migrations on boot 04d620d91 #35508 / persistent 模式恢复 out-of-band 删 8a888441d #36631 / 孤儿容器清 82c157b26 #7440 / Docker 内 update-check 不报 phantom commits behind b1e399de9 #39559 / LF entrypoints 6ad015255 #12181 / .dockerignore Python 模式 eb43a5b5d #6092)— Skills 内置集瘦身 + environments: relevance gate38d3c49aa #39028:内置 skill 删过气 + 新 frontmatter 字段 cli/tui/desktop/gateway/* 决定何时实际激活进 prompt而非仅 UI 展示)— Auth set active_provider 三入口修5f62ba8e4 xai + cd68b8f0e qwen-oauth + 34a290352 google-gemini-cli 加 auth add 后不再 "auth 加完没生效")— MCP ${ENV} 在 discovery probe 解析 + shutdown 守护扩展b0a52d74a #38571 header auth env 展开;751b91446 probe iteration 失败也 shutdown;e9529578d+1bcfe9c58 异常守护从 Exception 扩到 BaseException 不让 SystemExit/KeyboardInterrupt short-circuit shutdown 卡死 child)— Install requires-python<3.14 + UV_PYTHON 钉 venv + PEP 639 SPDX license + FHS symlink475ecea3d #38535 + e223503b0 #38353 + aeec88c77 + 36f1cd7de shallow clone + ee7948ea6 排除 dev tooling from all extra + b459bac02 .bootstrap-marker 入 gitignore 让 update 不自动 stash 它)— Gateway 杂项硬化07f538267 dm_policy: pairing 不视为 open access 防 mention-gating 误判 / b7169f9bb /update 完成通知保留至目标 platform reconnect / 2982122be root-run gateway 投递 $HOME deliverables / 693f4c7e9 session_reset race 清 zombie agent slot / 454d6cbe5 Telegram sealed overflow chunk 显式 finalize 修末块格式 / 4ae3c988b shared-key loop 桥接到嵌套 platform 配置 / 899ee8c23 非 UTF-8 status/pid 文件容忍 / 71a9f44e8 平台 reconnect 时重试 startup auto-resume / 28ca4460a kanban dispatcher 守 malformed config + 空 summary / 74e845c00 Slack send_message 工具补 thread_ts / 7309f3bef Line inbound MessageType 映射 / fff056144 Google Chat OAuth client secret 锚 default Hermes root / f7dabd301 api-server json.loads 守 SQLite corrupt cache / 947e21b3d log silent file-delivery drops / e7a7872a8 tui_gateway dedup re-queued 进程通知 flood TUI / 86c64cfb5 Discord interactive views 超时视觉过期 / 3278b423d strip session token from subprocess env / 2059707fc+40fbb0f3c Windows native default Hermes home + 锚 detached/startup cwd 至 HERMES_HOME / 3858cf430 named profile 让 global-root active_provider fallback)— Desktop 后续修f583c6ebd+338f0b223+fef04a197 Electron cache 损坏 / Windows bootstrap 修复 / f66a929a6 render approval/sudo/secret prompts 不再静默超时 #38578 / 58eb473ba background-session clarify prompts 上浮 / b1b0f4b66 折叠组工具命令批准仍可见 #38829 / 825629424 持久 timed-out clarify 到 transcript / 5bcb63e40 TUI _sessions thread-safety lock / 8077e7d2f resume lock narrow / bd6d09876 keep resumed live history current / 98903d031 reuse live session on resume / 25742372e execute_code is_approved guard #39275)— Delegation max_spawn_depth 取消上限d41427504 7 文件 +30/-30 hermes_cli/config.py:1679-1682 max_spawn_depth: 1 floor 1 无 ceiling,拥抱 orchestrator-of-orchestrators-of-orchestrators 自由编排)— Models catalogfd87c6107 qwen/qwen3.7-plus 入 Nous + OR hermes_cli/models.py:55,173 #39409 / 3da44dbda+2a82519b0+ef5e48f3f :1170 nous: deepseek/deepseek-v4-flash 作 silent default 替 flagship + guard test 钉死不准未来 PR 又点回 flagship / 7f016f5f3 Desktop 每 provider 50 model 默认)— 杂项:OpenViking memory URI /agent/{agent}/ 段修 c14c37d46 #36969 / de60bf40c memory 用户安装 provider 父包注册 / 30c7b787d memory pip fallback / 46abf0401+dfe6fbb0b SSH WinError 1314 symlink copy2 fallback / Prompt 自知识扩 docs+skill f99665f99 #38538 / CLI resume relaunch 在 session 起始 cwd e7bc6189c #38562 + 391b59475 rich [dim] 替 ANSI / ad69d3edc 删 CWD 守 / 96cd37e21 dashboard orphaned embedded-chat session 回收 / 9ca11b35d /model picker provider-models prewarm 后台 / af8b917da termux 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_starthermes_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 providerdd5e97bd7,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 pickerea4fe1563,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 按钮 + 后台 bleed188e52db9/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 rebuilda1cda2410update.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";d3b1e4300swap_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.plist46e513ef5 Linux chrome-sandbox helper 4755)— Desktop 远端显示禁 GPU6a2909fe5 SSH X11/VNC/RDP 软件渲染防闪烁 apps/desktop/electron/bootstrap-platform.cjs +51 detectRemoteDisplay + HERMES_DESKTOP_DISABLE_GPU override + d0ea4caf7 WSLg vGPU 本地渲染例外)— Dashboard System 检查后再更新c5d199eadGET /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 credentialdd28f2ac9 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.packstruct.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.statecbc82511e_lifespan() async context manager 在 FastAPI 启动时正确 loop 创建 dict+lock,跨 TestClient/uvicorn reload "attached to a different loop" 修)— Doctor HERMES_MAX_ITERATIONS env 影子 / config drift 检测 + --fix6ee046a72 hermes_cli/doctor.py:894-922 cfg_max_turns ... env_ghost 关 #17534 - bridge 在更早 config-parse 错时 bail 就让 ghost 默默胜出 → config 显示 400 而 gateway 读 N/90)— Kanban 速率限制非永久阻塞4c544b633EX_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 不再 failed1d90b2398 enabled:false 改 dim 不再红 — failed)— TUI 持久化 trail OOM 修e76d8bf5aui-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 /saveget_hermes_home()/sessions/saved/ 含 system prompt;dfba3f3e5 右键复制清选区 + 群 transcript blocks)— Aux Nous-routed self-healab2472e69 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/tuid6b0c23f8 + --cli 显式覆盖 + 两 resolver _resolve_use_tui :1823_wants_tui_early :145 无依赖早期)— Debug 含 desktop.log1b302a047hermes_cli/logs.py +2 注册 + debug.py +32 summary report + share 上传 + gateway /debug collect_debug_report() 继承)— Packaging locales/ 进 wheel/sdist/Nixc349eca82 关 #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.12a51a7b9b9 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 bundle9272e4019 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=runningdocker/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 :4602PUT /api/mcp/servers/{name}/enabled :4583GET /api/system/stats :757PUT /api/webhooks/{name}/enabled :4903GET /api/ops/hooks :5242GET /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,302 AT 缺席 + 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 轮询重排错杀)— Agent runtime_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:31c40c72 project 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> 高亮;查询 g4ogpt-4oclad snntclaude-sonnet)— Desktop session 卫生/archive/media streaming(#37099,26 文件 +1000:tui_gateway/server.py:2771-2824 lazy DB row 不再泄 "Untitled" + hermes_state.py:267 archived INTEGER NOT NULL DEFAULT 0 + :1434-1448 set_session_archived() + :3270-3309 empty 计数/删只看非 archived + Electron hermes-media:// 协议 main.cjs:375-427 Range 支持 + 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-4408 decompose 取根 workspace_kind+workspace_path,子继承不强制 scratch;HERMES_KANBAN_TASK env 让 worker 看清自己上下文)— File-safety sandbox-mirror 双层 soft guard(#32213/#32407:agent/file_safety.py:498-640classify_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-4126 pre-extract 快照 + 文本被剥空时从 post-extract_media body 恢复 + :4333 response_delivery_dropped ERROR 守不变式)— Weixin asyncio.wait_for 替 aiohttp ClientTimeout(2 commit:gateway/platforms/weixin.py:370-414 _api_post/_api_get,修 cron run_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-1567 cache step 1 命中后 invalidation 让 1M 默认生效)— Bluebubbles 群消息 mention gating(97 行新代码 + 132 测试)— xAI 视频模型按 modality 路由(#37046 边 commit:8 文件 +167,video/video-with-image 分流)— Gateway 杂项(WeCom env-only allowlist f7a3509b + WhatsApp dm_policy 开放 0cd5867b + s6 心跳缺 sleep 回落 eee32cdd + 重启通知清理 b14e15c48 9 文件 +378)— Docker/CI 维护(python3-venv / docker -w workdir / arm64 registry cache / dashboard docker update guidance)— Installer(macOS 重命名 "Hermes" launcher #37516 + commit pinning 改 opt-in 1d9aacbd)— 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.py 6300→7079 行 +786,新增 17 个 /api/{mcp,pairing,webhooks,gateway,credentials,memory,ops} 端点)、/undo [N] 三层落地(#21910 + #36699,state primitives hermes_state.py:288 messages.active + :2426 rewind_to_message + :2513 restore_rewound + :2537 list_recent_user_messages 软删,CLI cli.py:7106 undo_last(n, prefill),TUI command.dispatch prefill,Gateway gateway/run.py:8022 /undo [N] + SessionStore.rewind_session + 16 locale 同步)— 加 Curator inactivity 修剪 + 全 skill 用量遥测agent/curator.py:53 + tools/skill_usage.py:326usage_report()/provenance(),hub 安装永不修剪,#36701)、Blank-slate skillsinstall --no-skills + hermes skills opt-out/opt-in + .no-bundled-skills marker,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 contextagent/model_metadata.py DEFAULT_CONTEXT_LENGTHS['minimax-m3']=1_000_000,#36214)、Model picker group-layer description47d2d0589/84d82453a/c9a28dfb0)、安全:Agent 写 ~/.hermes/config.yaml 双闸门(工具层 tools/file_tools.py:256 + 终端层 tools/approval.py:139-170,413 tee|>|>>|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)、Memory on_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)、fchmod Windows 防护(HEAD b9646276f,atomic_json_write)

  • 2026-05-31-update: 141 commits 跨日同步(hermes-agent 689ef5e2 → eb3cf9750,v0.15.1 维护窗口,无新发布)— Setup 重构(Quick Setup 直通 Nous Portal hermes_cli/setup.py:3010,3064 + Full Setup happy-defaults + 四个 setup picker 迁 curses,#35723/#35776)、/compress here [N] 用户选择压缩边界(新模块 hermes_cli/partial_compress.py 235 行 + 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_write line 772,#35252)+ UTF-8 BOM 处理_UTF8_BOM/_strip_leading_bom line 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.1pyproject.toml:86,118,125,178,#35118)、进程标题设为 'hermes'hermes_cli/main.py:68 _set_process_title setproctitle + 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 + HEAD eb3cf9750)、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 socketNous Tool Gateway 始终展示 + 选中即 OAuth(#35792)、TUI /agents delegation 提示 + WSL 131072x1 终端维度钳制、Turn-Completion Explainer(abnormal turn 不再返空白,agent/conversation_loop.py:4493-4540display.turn_completion_explainer 默认 True)、安全 wave(mutation-verifier footer 路径中和防 config.yaml 自动上传 #35584 + media-delivery denylist 多层 + secret scrubber 不再脱敏 Discord mention + _HERMES_GATEWAY env 防自指令循环 #30719 + dashboard chat WS 在 --insecure 非环回放行)、File-tools 相对路径锚定到绝对 base + 终端 cwd 持久化_resolve_command_cwd line 1738 ACP→env.cwd→init 优先级)+ spawn_via_env 防双 compound-rewrite 包裹LSP Windows .cmd shim 支持State 中模型切换持久化到 DBSessionDB.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 + /status token 标签精化

  • 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.py369075dc9)、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)、Kanban POST /runs/{run_id}/terminateplugins/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-1335a95fb2e1)、pluggable Context Engine ABCagent/context_engine.py:32 class ContextEngine(ABC)9b5dae17a)、Skills 目录大扩张(skills.sh 858→19,932 经 sitemap、ClawHub 200→20k+、NVIDIA tap),新增可选 skill antigravity-cli/grokKrea 2 进入 FAL 目录(与既有 plugins/image_gen/krea 直连后端并存,#33506)、FAL 视频经 Nous 网关Docker s6 wave(persist-across-processes #20561 + 孤儿回收 + PUID/PGID alias)、安全 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 行 + DashboardAuthProvider ABC + Nous Portal Provider 582 行 + WS 单次性 30s ticket + register_dashboard_auth_provider 第 8 个 PluginContext hook)、Honcho AI-native 跨会话用户建模 MemoryProviderplugins/memory/honcho/ 5 文件 5158 行 + dialectic Q&A + peer cards + identity-mapping single/multi/hybrid wizard + 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_exists helper)、Docker wave(Node 22 LTS multi-stage + chown 链 + s6 env 转译 + agent-browser boot discover)、Codex Responses-API 14 修复(drop responses.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% via load_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/pickeroptional-mcps/{n8n,linear},#30870)、Skills Hub 健康检查EXPECTED_FLOORS + MIN_TOTAL=1500 + 新鲜度徽章 + 每 4h watchdog cron,#32345)、3 个新可选 skillweb-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 --global scalar→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)— Docker s6-overlay 取代 tini 作 PID 1(BREAKING)+ 容器化运行时监管子系统(~20 commits:ServiceManager Protocol + S6ServiceManager + container_boot.py + per-profile gateway 监管 + 多架构 SHA256 校验)、安全 wave 3(~25 commits:6 处 symlink 拒绝矩阵 + /proc/*/environ|cmdline|maps deny + 项目本地 .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.dev querybatch,覆盖 venv/plugin/MCP 三面)、CLI 冷启动 -63%(Bitwarden disk L2 cache, 666ms→295ms)、Plugin hookregister_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.db 0o600)、ntfy 第 23 平台(plugin 化)、Plugin register_auxiliary_task() 新 hook API、跨 Profile 文件写入软护栏classify_cross_profile_target)、Streaming 完成可见性三连(guardrail halt 推到 stream / response_transformed 编辑 in-place / partial-stream finish_reason=length)、Kanban promote 子命令(--ids 批量)、Skills AST 深度诊断(audit --deep)、Bitwarden EU + 自托管、config.yaml model.provider 单一 source of truth

  • 2026-05-23-update: 49 commits daily deltahermes 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 dates 2026-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 源码分析生成。

About

Hermes agent + LLM Wiki + 源代码 完成 Hermes agent wiki

Resources

Stars

643 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors