Auto-handles APPROVAL_PENDING responses from the human-signoff proxy for Hermes Agent.
This plugin registers a pre_llm_call hook that injects approval handling instructions into every LLM turn. When a command is blocked and requires approval, the agent will:
- Show the approval URL to the user
- Automatically call
proxy_client wait-and-runto wait for approval and retry
This works across all channels (CLI, Telegram, Discord, WeChat, etc.) because plugin hooks are active in both CLI and Gateway modes.
- Human Signoff MVP is deployed and running
Install and login to proxy_client:
# Install proxy_client (if not already installed)
# Follow installation instructions from your Human Signoff MVP deployment
# Verify installation
which proxy_client
proxy_client --help
# Login
proxy_client login# Install from GitHub
hermes plugins install merico-ai/hermes-plugin-human-signoff-approval
# Enable the plugin
hermes plugins enable human-signoff-approvalNote: These instructions are for macOS only. On Linux, Gateway runs as a systemd service and requires different configuration.
Edit ~/Library/LaunchAgents/ai.hermes.gateway.plist and add proxy environment variables:
<key>EnvironmentVariables</key>
<dict>
<key>HTTP_PROXY</key>
<string>http://127.0.0.1:17771</string>
<key>HTTPS_PROXY</key>
<string>http://127.0.0.1:17771</string>
<key>NO_PROXY</key>
<string>localhost,127.0.0.1</string>
<key>TERMINAL_TIMEOUT</key>
<string>600</string>
</dict>Optional: Edit
~/.hermes/config.yamlto disable streaming mode:
display:
streaming: falseThis ensures approval URLs are delivered reliably in complete messages, especially for channels like WeChat. If you experience issues with approval URLs not showing in channels, try this setting.
Note: These instructions are for macOS only. On Linux, use
systemctl --user restart hermes-gateway.
launchctl bootout gui/$(id -u)/ai.hermes.gateway
sleep 2
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/ai.hermes.gateway.plistNote: CLI mode requires setting proxy environment variables manually. Gateway proxy configuration only affects the Gateway service.
# Set proxy environment variables and start chat
HTTP_PROXY=http://127.0.0.1:17771 \
HTTPS_PROXY=http://127.0.0.1:17771 \
NO_PROXY=localhost,127.0.0.1 \
hermes chat
# Send a command that requires approvalThrough any configured channel (Telegram, Discord, WeChat, etc.), send a command that requires approval. The agent will show the approval URL and automatically continue after you approve.
# Check plugin status (most reliable)
hermes plugins list
# Check plugin directory exists
ls -la ~/.hermes/plugins/human-signoff-approval/
# Optional: Check hook count (reference only)
# Note: "X hook(s) loaded" includes all hooks, not just plugins
tail -20 ~/.hermes/logs/agent.log | grep "hook(s) loaded"Important: The most reliable verification is hermes plugins list. The "hook(s) loaded" log message includes all hooks (system + plugins) and cannot confirm if the specific plugin is loaded.
Functional test (recommended): Send a command through your channel (WeChat, Telegram, etc.) that requires approval. If the plugin is working, it will:
- Display the approval URL
- Automatically call
proxy_client wait-and-run
# Disable and remove
hermes plugins disable human-signoff-approval
hermes plugins remove human-signoff-approval
# Or if manually installed
rm -rf ~/.hermes/plugins/human-signoff-approval- Check plugin is enabled:
hermes plugins list - Check agent logs:
tail -f ~/.hermes/logs/agent.log - Verify proxy_client is in PATH:
which proxy_client
- Ensure
display.streaming: falsein~/.hermes/config.yaml - Restart Hermes Gateway
- Check Gateway logs:
tail -f ~/.hermes/logs/gateway.log
- Ensure proxy_client is logged in:
proxy_client login - Check proxy_client can reach backend
- Verify
TERMINAL_TIMEOUT=600is set in Gateway environment
MIT License - see LICENSE file for details
For issues and questions, please use the GitHub issue tracker.