v0.21.2

Hermes Agent v0.21.2


Overview

v0.21.2 — The state.db Patch Release. Erschienen am 11. September 2026. 947 Non-Merge-Commits · 1.869 geänderte Dateien (+182.504 / −15.564) · 312 gemergte PRs · 140 Contributors seit v0.21.1.

v0.21.0 hat die Connection-Behandlung der Session-Speicherung neu geschrieben, und ein Teil dieser Neufassung hinterließ state.db bei einem Teil der Installationen fragil: Ein zweiter Writer konnte die Sperren des ersten aufheben, eine völlig gesunde Datenbank wurde als beschädigt eingestuft, und eine einzige kaputte Zeile genügte, um sessions list lahmzulegen. v0.21.2 schließt diese ganze Fehlerklasse. Sechs PRs stehen für 44 geschlossene Issues und arbeiten Schicht für Schicht an Lock-Ownership, WAL-Recovery, Lesepfaden und Diagnose, sodass die Datenbank entweder funktioniert oder laut und konkret scheitert – nie still, und nie so, dass sie die Konversation mitreißt.

Rund um diese Kampagne brachten die vier Tage seit v0.21.1 außerdem eine Reihe von Härtungen der Multi-Profil-Isolation, das Ende des Startsturms der Desktop-Backends, einen Credential-Vault, den der Agent nutzen kann, ohne je ein Secret zu sehen, einen reviewten, per SHA fixierten Plugin-Index mit einheitlicher Plugins-Seite im Desktop sowie ein kostenloses Nous-Kontingent mit geführtem Erststart. Diese Seite geht in dieser Reihenfolge durch das Fenster.


Highlights

1. Die state.db-Reliability-Kampagne: sechs PRs, 44 geschlossene Issues

Jeder der folgenden Fehlermodi wurde reproduziert, behoben und mit einer Wache versehen, damit dieselbe Form nicht still zurückkehren kann.

  • Keine zweiten Writer mehr. Das Profil-Gateway schrieb den Status verwalteter Räume alle 5 Sekunden in die Root-state.db; das Dashboard öffnete beim Start ein beschreibbares Handle; die Cron-Lifecycle-Wache machte ein nacktes open() gegen eine lebende Datenbank, was ausreicht, um die POSIX-Locks des Gateways aufzuheben; und doctor --fix machte einen Checkpoint, während noch ein lebender Holder existierte. Heute liegen verwaltete Räume in shared-state.db, das Dashboard öffnet zuerst nur lesend, die Wache läuft über das Registry der verwalteten Verbindungen, und doctor --fix verweigert jeden Checkpoint, dessen Sicherheit es nicht beweisen kann (#108076).
  • Gesunde WAL-Datenbanken hängen nicht mehr. Eine Reihe von Formen, in denen eine funktionierende Datenbank für tot erklärt wurde, ist verschwunden: ein (deleted)-Dentry unter OpenZFS, close() im Rennen mit append_message, ein Read-Pool, der Verbindungen im nicht bestätigten Journal-Modus herausgibt, ein transienter disk I/O error unter WSL2, der get_session schon beim ersten Versuch scheitern ließ, und ein „state.db locked“, das noch gesendet wurde, nachdem die Sperren längst freigegeben waren (#108082).
  • Ein beschädigter Suchindex killt den Turn nicht mehr. Fehler, die nur den Volltextindex betrafen, wurden früher als Beschädigung der ganzen Datei gewertet und fail-closed behandelt. Jetzt werden sie als fts_index klassifiziert: Die Suche degradiert, der Index wird später neu aufgebaut, das Transkript bleibt unangetastet. Derselbe PR lässt doctor strukturelle Beschädigung ehrlich von Index-Beschädigung unterscheiden, ergänzt eine FTS-Schreibsonde, die die Form eines veralteten Index erkennt, bei der alle Prüfungen durchgehen und trotzdem jeder Schreibvorgang scheitert, verhindert, dass .recover wegen verwaister FTS5-Shadow-Tabellen nicht startet, rettet Datenbanken mit genulltem Header und lässt das Analytics-Polling des Dashboards eine 503 zurückgeben statt 520.000 Tracebacks pro Tag (#108130).
  • Eine einzige kaputte Zeile reißt sessions list, Export und Insights nicht mehr mit. Ein TEXT-Timestamp oder eine 1e30-Epoch ließen früher die ganze Liste abstürzen; fehlerhaftes Marker-JSON ließ json_extract abstürzen; mehr als 999 IDs ließen Massenlöschung und Prune abstürzen. Heute geht jeder Leser durch coerce_epoch() – eine schlechte Zeile erscheint als ? mit einem WARNING, das die Session benennt – plus json_valid-Wachen, gestückelte IN-Listen und gebündelte Export-Hydration (#108086).
  • Sessions binden sich nicht mehr an die Datenbank eines anderen Profils und lesen sie auch nicht. Der Backend-Start des Desktops konnte in einem HERMES_HOME-Override-Rennen die state.db des falschen Profils festnageln; session_search mit einer nackten ID scannte stillschweigend alle Profile und lieferte die Konversationen anderer Leute; die Recovery-Anleitung zeigte auf die falsche Datei; und beim Löschen eines Profils blieben Handles offen (WinError 32) (#108074).
  • Beim Öffnen von state.db wird kein Write-Lock mehr genommen, wenn es nichts zu schreiben gibt. Ein einmaliger hermes-Prozess, der hinter einem beschäftigten Gateway öffnete, hing früher 4–20 Sekunden und meldete dann „database is locked“. Jetzt braucht er 0,01 Sekunden (#108067).

Wenn deine state.db bereits durch 0.21.0 oder 0.21.1 beschädigt wurde, fang hier an:

hermes doctor
hermes sessions recover --inspect-only

2. Multi-Profil-Isolation verschärft

v0.21.2 macht aus der Grenze zwischen Profilen eine Konvention, die durchgesetzt wird: Bots eines Sekundärprofils erben nicht mehr die Allow-List des Standardprofils (#107616); Adapter senden keine Credentials mehr an den Host des Standardprofils (#107617); stdio-MCP-Server erhalten nicht mehr die Vault-Secrets des Standardprofils (#107630); die MEDIA:-Zustellung kann nicht mehr das .env / auth.json / state.db eines anderen Profils mitführen (#107609); Feishu-Drive-Callbacks und Webhook-Antworten unter /p/<profile>/ bleiben im gerouteten Profil (#107620, #107626); und ein Sekundärprofil bekommt nicht mehr den Nous-Bearer eines Schwesterprofils (#107611).

Zusammengenommen ist die Regel einfach: Gehört ein Prozess zu einem Profil, kommt er weder an Dateien und Secrets eines anderen Profils noch kann er Anfragen unter einer fremden Identität stellen.

3. Der Startsturm der Desktop-Backends ist vorbei

Bot Mode startete oder wählte früher beim Start und bei jedem Roster-Tick ein Backend pro Profil; das Überfahren der Bots-Liste startete ein Backend pro Zeile; und ein Profilwechsel konnte doppelte Primaries erzeugen. Jetzt folgen Erzeugung und Wiederverwendung von Backends einem expliziten Lifecycle, das Roster-Rendering hat keine Nebenwirkungen, und ein Profilwechsel liefert dir dasselbe Primary statt einer neuen Kopie (#108069, #108107, #108118, #108134, #107969, #108112). Was du als Nutzer merkst: Ein Kaltstart des Desktops klingt nicht mehr gleichzeitig nach startenden Lüftern und beschäftigtem Gateway.

4. Ein Credential-Vault, in den der Agent nicht hineinsehen kann

Der Agent kann sich jetzt bei 1Password, Bitwarden oder dem lokalen Hermes-Vault anmelden, bezahlen und Adressen ausfüllen, ohne das Secret je zu sehen; Zwei-Faktor-Codes kommen aus gespeicherten Authenticator-Secrets oder werden in deiner eigenen UI erfragt (#106480, #107585). Private Git-Plugins lassen sich ebenfalls mit gespeicherten Credentials installieren (#106981). Anders gesagt: Secrets wandern direkt aus dem Vault zur Zielseite oder ins Repository – der Agent orchestriert, sieht „erledigt“ oder „fehlgeschlagen“ und nie den Klartext.

5. Ein Plugin-Katalog und eine einheitliche Plugins-Seite

Plugins haben jetzt einen reviewten Index mit SHA-Fixierung, inklusive CLI, Aufnahme-CI, Doku und Dashboard (#69446). Der Desktop bekommt eine einzige Plugins-Seite, die Agent- und Desktop-Plugins an einer Stelle verwaltet – installieren, Katalog durchsuchen und auf einen Commit fixieren, ohne sie zu verlassen (#107212, #107314, #107321). Radio erscheint als optionales SDK-Plugin (#107072).

6. Kostenloses Nous-Kontingent und geführter Erststart

Kostenlose Inferenz und Connectoren funktionieren out of the box, mit einem Login per Befehl (#105258, #105260), und /login funktioniert direkt im Chat (#105261); Connector-Tools (Gmail, Linear, Notion und weitere) sind über tool_search auffindbar (#106842); und mit gesetztem HERMES_GUEST_ONBOARDING=1 wird der Erststart zu einem geführten Ablauf, der Konten, Connectoren und Modelle noch vor der ersten Konversation einrichtet (#107697, #107958, #107985, #108211).

export HERMES_GUEST_ONBOARDING=1

Improvements

v0.21.2 ist ein Patch-Release: Die folgenden Änderungen sind keine Schlagzeile, gehören aber zur selben Aufgabe – state.db davon abzubringen, zu lügen.

  • Reihenfolge von Rebuild und Veröffentlichung: Eine neu angelegte state.db veröffentlicht ihre FTS-Tabellen nicht mehr, bevor sie das Rebuild-Lock genommen hat (#106311).
  • WAL-Generationen und Exit: Handles, die eine WAL-Generation verloren haben, checkpointen beim Beenden keine veralteten Frames mehr (#106315, #106840), und eine nicht verifizierbare Datenbank bleibt bei der WAL-Initialisierung unangetastet (#106568).
  • Quarantäne statt destruktivem Öffnen: Eine Datenbank, deren Header überschrieben wurde, wird zusammen mit ihrem WAL in Quarantäne verschoben, statt destruktiv geöffnet zu werden (#106587), und in Quarantäne befindliche Handles verweigern VACUUM und FTS optimize (#106343, #106349).

Fixes

  • Gateway und Plattformen: Ein nackter display:-Schlüssel in der config.yaml lässt nicht mehr jeden Turn abstürzen (#106305); vom Plattform abgelehnte letzte Nachrichten einer Warteschlangen-Spur werden protokolliert und erneut zugestellt (#106316); ein hängender WebSocket-Send blockiert nicht mehr alle Events dahinter (#106581); der erste Turn wartet nicht mehr auf die Python-Toolchain-Sonde (#106556); bei aktiviertem bots_require_mention müssen Telegram-Bots per @ erwähnt werden, was das Hin und Her zwischen Bots unterbricht (#106534); Matrix rendert LaTeX (#106515); Signal rendert Markdown-Tabellen (#106538); WhatsApp-Antworten behalten das Zitat bei View-once-Nachrichten (#106541); reine Medienantworten melden auf allen Plattformen SUCCESS (#106557).
  • Provider und Routing: /model und das automatische Auxiliary-Routing können keinen Provider mehr abrechnen, den du nicht gewählt hast (#107366); Hermes fällt nie still auf einen Provider ohne Credentials zurück (#107281); Bedrock-Claude-/Converse-/Mantle-Modelle überstehen /model, Fallback und Recovery (#107621, #107658); Bedrock Guardrails greifen tatsächlich (#107815); ein 400 wegen des Patch-Budgets für Bilder in Codex wird mit verkleinertem Bild erneut versucht (#106525); ein nicht berechtigter Primär-Provider plus Fallback oszilliert nicht mehr (#106549); von Azure Foundry abgelehntes Replay-Reasoning wird klassifiziert und gekürzt (#106718); ein MCP-OAuth-Refresh löscht nicht mehr das Refresh-Token (#106185); der Anthropic-Client sendet genau ein Credential (#107978); DeepSeek V4.1 Flash kommt in die Picker von Nous Portal und OpenRouter (#107489); OpenAI und FAL unterstützen GPT Image 2.5 (#105988); Opus 5 und Fable 5.1 kommen in den nativen Anthropic-Picker (#106636).
  • Agent-Loop und Compaction: Ein blockierter periodischer Callback bremst nicht mehr das Lease-Refresh (#106308); ein /steer innerhalb eines Turns wird als eigene User-Zeile gespeichert (#106317, #106344); Ablehnungen wegen Memory-Limits bei lokaler Inferenz gehen in Backoff statt in eine Compaction der Historie (#106307); ein Context-Overflow nach teilweisem Streaming beendet den Turn (#106567); Längenfortsetzungen stoppen, wenn der vorherige Text das Fenster bereits gefüllt hat (#106571); Compaction läuft bei Aux-Retries nicht mehr still in einen Timeout (#106866); model_thresholds-Schlüssel können provider-qualifiziert werden (#108061); der Wechsel zwischen Desktop und TUI baut den System-Prompt nicht mehr neu auf, was den Prompt-Cache erhält (#105844); die CLI hält einen api_content-Sidecar, damit auch frühe Persistenz den Cache bewahrt (#105842).
  • CLI, TUI und Desktop: hermes -z --resume setzt die Session fort (#106313); erweiterte Tasten bringen Shift+Buchstabe und Cmd+Shift+Z in Terminals (#90674, #105493); Timeouts von browser_exec töten den ganzen Prozessbaum (#106589); die Update-Prüfung fragt einmal täglich die GitHub-API ab, statt alle 30 Minuten einen git fetch zu machen (#107648); hermes update nennt den echten Grund und hängt nicht mehr im Fetch (#108053); im Desktop überlebt die UI-Sprache einen Update-Neustart (#106476), abgelaufene OAuth-Grants bekommen einen Ein-Klick-Re-Login (#106965), der HUD-Modus zeigt die Konversation wieder und gibt das Fenster immer zurück (#107491, #107423), das Backend beendet sich, wenn sein Desktop-Parent endet (#107977), Windows-Updates melden keine falschen Fehler mehr (#106175, #107183), WSLg rendert auf Windows-GPUs (#106528), und das Telegram-QR-Schnellsetup zieht aus dem Dashboard ein (#107242).
  • Cron und Kanban: Ein „run now“ außerhalb der vollen Stunde cancelt nicht mehr den nächsten geplanten Lauf (#106306); ein abgeschossener manueller Lauf blockiert nicht mehr den nächsten 5-Minuten-Slot (#106733); ein von einmalig auf wiederkehrend umgestellter Job feuert weiter (#106532); Jobs ohne gepinntes Modell laufen mit dem bei der Erstellung aufgenommenen Modell (#106499); --clone-all kopiert keine Cron-Jobs mehr (#106478); kanban promote lehnt einen unfertigen Parent-Task ab (#106550); kanban_request_review lehnt ein unbekanntes Reviewer-Profil ab (#106547).
  • Tools und Memory: Ein stdio-MCP-Server, der mitten im Call stirbt, wiederholt den Tool-Aufruf nicht mehr (#106546); ein nur aus Skills bestehender Background-Review kann keine Memory-Einträge mehr löschen (#106310); mem0-Memories verlieren keine langen Turns mehr (#106542); tool_search liefert lieber nichts als fünf zusammenhanglose Tools, die sich ein Wort teilen (#106676); entferntes NOPASSWD-sudo fragt nicht mehr nach einer Freigabe (#107939); RSS- und Reddit-Leser sind nicht mehr standardmäßig aktiv (#105873).
  • Haushalt: config.yaml-Backups landen gebündelt in einem einzigen begrenzten Verzeichnis backups/config/ (#106388); hermes backup behält nur die drei neuesten ZIPs (#106455); hermes setup --reset sichert die echte Config (#106453); die debug share-Aufbewahrung auf dem dpaste-Fallback-Pfad sinkt auf 1 Tag (#106531).

Upgrade

Bestehende Installationen aktualisieren sich direkt:

hermes update

Neuinstallation:

curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash

Verwaltete Deployments sollten über ihr eigenes Deployment-Tooling mit dem neuen Tag aktualisiert werden.

Wenn die state.db bereits durch 0.21.0 oder 0.21.1 beschädigt wurde: Führe zuerst hermes doctor aus – es trennt jetzt strukturelle Beschädigung korrekt von Index-Beschädigung –, und wenn ein Rebuild nicht reicht, verweist es auf hermes sessions recover --inspect-only (profilbezogen).

Der vollständige Diff steht unter v2026.9.7…v2026.9.11.

← Hermes Agent Changelog