Skip to content

cclank/Hermes-Wiki

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

88 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

平台与扩展

更新日志(42 个,最新优先 — 完整列表见 index.md

  • 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 个
  • 更新日志: 42 个
  • 源码覆盖: 关键模块逐行验证
  • 跟踪版本: v0.16.0(hermes-agent/main HEAD 6c752ca3a,2026-06-11 13:44 -0700,"refactor(agent): tighten SUMMARY_PREFIX wording and fix stale doc references";本期 212 commit 跨 a5d05cf30..6c752ca3a ~48h 窗口;未发新版)
  • 最后更新: 2026-06-11

使用方式

  • 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

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors