You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
borgmcp 5.7.0
Adds a Borg-owned Hermes user plugin, borg-representative-push, and borg representative hermes-plugin install [--hermes-home <path>] [--force] to place it.
The command copies exactly the plugin's two files into <Hermes home>/plugins/borg-representative-push/ and prints the configuration to add.
It refuses to replace an existing install without --force, refuses a symbolic-link target and a missing Hermes home, never edits Hermes config and never starts or restarts Hermes.
When the bound Coordinator replies, the plugin wakes the one Hermes conversation named by its session_key setting.
It supervises borg representative listen inside the Hermes messaging gateway only. The listener starts when that platform connects and never in the CLI, Desktop or worker processes.
Only a messaging-gateway conversation (Telegram, Discord, Slack and the other gateway platforms) can be woken. A Hermes Desktop chat cannot be woken: Hermes injects plugin messages only into gateway conversations.
The injected message is one fixed text that tells the conversation to call read, persist and relay, then deliver. No message body, sender or document passes through the plugin.
Gateway injection requires the Hermes permission allow_gateway_injection: true for the plugin.
Only one process may use the representative tools. The woken conversation runs in the gateway, so the gateway must own the tools lease. The guide shows how to scope it: a lazy MCP entry, and the mcp-borg-representative toolset disabled on every other platform, Desktop and CLI included.
Each undelivered reply wakes the conversation at most 1 + max_reinjects times (defaults: reinject_after_s 600, max_reinjects 3).
Every wake is counted in the plugin's state before Hermes is asked to start the turn, so a replayed hint or a gateway restart does not renew the count. A refused wake's reservation is rolled back when the state update succeeds; if that rollback fails, the wake is conservatively counted as spent.
A record is removed only when an observed borg_representative-deliver covers that reply.
A terminal listener stop (a binding refusal, or eviction, rebind, revocation or trust change) ends every wake, including queued and repeat wakes, until the gateway restarts.
Wakes fail closed on a state write error. If the wake count cannot be written, the plugin does not wake the conversation and logs why.
Plugin state lives in <Hermes home>/plugin-data/borg-representative-push/.
The plugin refuses that directory if it is a symbolic link and sets it to mode 0700.
Its files are created with mode 0600, and it never reads or writes through a symbolic link planted there.