π hermesd 2026.6.15 shipped.
A read-only terminal dashboard for Hermes Agent β one live screen for your whole ~/.hermes/: gateway, sessions, tokens, cost, tools, cron, skills, logs, memory, kanban, operations, and curator. No API keys. No network. Zero writes to agent state.
When you run an agent for real β a gateway across Telegram/Discord/Slack, cron jobs, dozens of sessions spawning sub-agents, 9 providers, skills, memory files β answering "is it healthy and where are my tokens going?" used to mean 6 commands tailing logs. hermesd reads it all and refreshes automatically.
π New in this release:
βΈ Curator panel (13) β the newest memory-curation run: beforeβafter skill counts, archived/pruned/added/consolidated, a per-tool call breakdown, the state-transition trail, model/provider, duration, and the LLM summary.
βΈ Sessions β Billing & Context β per session: end reason, billing endpoint (billing_base_url), billing mode, and the model's context-window limit joined from context_length_cache.yaml.
βΈ Tokens β By Endpoint Cost Status β spend/tokens aggregated per billing endpoint (finer than per-provider), plus a reconciliation line splitting sessions into unknown / subscription-included / estimated. Costs now show authoritative $ for reported/exact/included and ~$ only when truly estimated.
βΈ Gateway health β per-platform connection errors (e.g. discord "failed to reconnect"), active-agent count, restart-requested marker, β in the compact view.
βΈ Operations β Response Store stats from response_store.db; PR-monitor reads now cover every naming family with per-repo dedup.
βΈ Logs β extra streams: audit, mcp-stderr, workspace, workspace.error.
βΈ Kanban β task workflow fields a parentβchild decomposition tree.
π§ Fixed (the important part):
The agent had quietly changed several on-disk shapes and hermesd was reading stale formats β so panels silently blanked. Repaired: credential-pool list-vs-dict in auth.json, desktop build-stamp camelCase keys, retired pr-monitor keys, and cost-status vocabulary. To stop this recurring, I added an opt-in contract test (HERMESD_CONTRACT_TEST=1) that runs the collector against real ~/.hermes and fails the instant a populated field reads blank β catching the next drift before users do.
π‘οΈ Hardening:
- Rich markup-injection escaping on all untrusted ~/.hermes free-text (a [/] in a value could crash the TUI)
- symlink path-escape guards on every file read (stays inside the Hermes home)
- SQL LIKE wildcard escaping in message search
- cache-preservation invariant: on any read error, the last-good data stays on screen β the dashboard never blanks
β
Quality:
777 tests 1 opt-in contract test, 99% coverage, ruff mypy pip-audit clean, CI matrix on Python 3.11/3.12/3.13, trusted-publish to PyPI.
Read-only. Fast. Minimal deps (Rich Pydantic PyYAML). Python 3.11 .
@NousResearch
β
github.com/mudrii/hermesd
π¦ pip install hermesd β run hermesd
#AIAgents #LLMOps #DevTools #Python #OpenSource #Observability