The sha256 revision returned by _load_subscriptions_unlocked was never compared by anyone, so _load_subscriptions_snapshot was dead weight; the loader now returns the dict and folds its duplicate excepts. _load_subscriptions reads without the store lock: writers publish by atomic rename, so readers always see one whole snapshot, and read-only homes (where the lock file cannot be created) keep listing routes. Nothing re-enters the lock any more, so the thread lock is a plain Lock. The "keep an explicit enabled: False" rule was copied into both the CLI subscribe path and the dashboard create path; it now lives in _replace_subscription after the CAS check (where the current record is authoritative) and the published route is returned, so the dashboard summary reflects what was actually stored. The rebind secret selection collapses to one expression (same result for all four profile-changed x --secret combinations), and the test-only _save_subscriptions is removed; tests seed through _mutate_subscriptions. The gateway's dynamic-route reload now records the stat key for a malformed or non-dict file too, so a bad version is parsed once rather than on every POST while the last good routes stay live. Docs describe the reload as stat-gated and lock-free.
35 KiB
35 KiB
sidebar_position, title, description
| sidebar_position | title | description |
|---|---|---|
| 13 | Webhooks | Receive events from GitHub, GitLab, and other services to trigger Hermes agent runs |
Webhooks
Receive events from external services (GitHub, GitLab, JIRA, Stripe, etc.) and trigger Hermes agent runs automatically. The webhook adapter runs an HTTP server that accepts POST requests, validates HMAC signatures, transforms payloads into agent prompts, and routes responses back to the source or to another configured platform.
The agent processes the event and can respond by posting comments on PRs, sending messages to Telegram/Discord, or logging the result.