Hermes Agent Archive / Skills

Approval transports

From Official Docs · October 5, 2026

An approval transport changes where a human sees and answers an existing Hermes tool-approval request. It does not decide whether a command needs approval and it is not an authorization-policy API. present may be synchronous or async. Hermes runs it on a bounded worker and enforces the canonical approvals.timeout even if the plugin does not. The request is immutable and contains redacted display text, its host presentation class ( cli or gateway ), the host timeout, allowed choices, and an opaque request ID/digest. Return the result of request.respond(choice) ; unbound dictionaries and stale or changed request IDs/digests are rejected. A plugin cannot return a scope that the host did not offer (for example, always on a once-only request). Registration alone does nothing. Enabling the plugin and explicitly selecting its transport are separate consent steps: Transport exceptions, timeouts, unavailable registrations, invalid choices, and stale responses deny by default. To deliberately show the prompt on the ordinary CLI/TUI/gateway/ACP surface when the selected transport fails, set transport_fallback: builtin . Without that exact opt-in, Hermes never materializes the prompt on anothe…

From the official Hermes Agent documentation.

def present(request):
    # Deliver request.command and request.description to your UI, wait for
    # its authenticated human response, then return a request-bound decision.
    choice = send_to_my_ui_and_wait(request)  # once/session/always/deny
    return request.respond(choice)

def register(ctx):
    ctx.register_approval_transport("my-ui", present)