mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-08 03:01:47 +00:00
The Tenacity Release — Hermes Agent now finishes what it starts. - Durable multi-agent Kanban with heartbeat, reclaim, zombie detection, retry budgets, hallucination gate - /goal persistent cross-turn goals (Ralph loop) - Checkpoints v2 single-store rewrite with real pruning - Gateway auto-resume interrupted sessions after restart - no_agent cron watchdog mode - Post-write delta lint on write_file + patch - 8 P0 security closures — redaction ON by default, CVSS 8.1 Discord fix, WhatsApp stranger rejection, MCP/auth TOCTOU, SSRF floor, cron prompt-injection skill scanning - Google Chat (20th platform) + generic platform-plugin hooks - ProviderProfile ABC + plugins/model-providers/ - 7 i18n locales (zh/ja/de/es/fr/uk/tr) + display.language - video_analyze tool, xAI Custom Voices, SearXNG, OpenRouter caching - MCP SSE transport + OAuth + image MEDIA surfacing - 864 commits, 588 merged PRs, 295 contributors
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
"""
|
|
Hermes CLI - Unified command-line interface for Hermes Agent.
|
|
|
|
Provides subcommands for:
|
|
- hermes chat - Interactive chat (same as ./hermes)
|
|
- hermes gateway - Run gateway in foreground
|
|
- hermes gateway start - Start gateway service
|
|
- hermes gateway stop - Stop gateway service
|
|
- hermes setup - Interactive setup wizard
|
|
- hermes status - Show status of all components
|
|
- hermes cron - Manage cron jobs
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
|
|
__version__ = "0.13.0"
|
|
__release_date__ = "2026.5.7"
|
|
|
|
|
|
def _ensure_utf8():
|
|
"""Force UTF-8 stdout/stderr on Windows to prevent UnicodeEncodeError.
|
|
|
|
Windows services and terminals default to cp1252, which cannot encode
|
|
box-drawing characters used in CLI output. This causes unhandled
|
|
UnicodeEncodeError crashes on gateway startup.
|
|
"""
|
|
if sys.platform != "win32":
|
|
return
|
|
os.environ.setdefault("PYTHONUTF8", "1")
|
|
os.environ.setdefault("PYTHONIOENCODING", "utf-8")
|
|
for stream_name in ("stdout", "stderr"):
|
|
stream = getattr(sys, stream_name, None)
|
|
if stream is None:
|
|
continue
|
|
try:
|
|
if getattr(stream, "encoding", "").lower().replace("-", "") != "utf8":
|
|
new_stream = open(
|
|
stream.fileno(), "w", encoding="utf-8",
|
|
buffering=1, closefd=False,
|
|
)
|
|
setattr(sys, stream_name, new_stream)
|
|
except (AttributeError, OSError):
|
|
pass
|
|
|
|
|
|
_ensure_utf8()
|