Files
PaperClipAI/doc/HERMES_GATEWAY_ONBOARDING.md
T
DottaandPaperclip fd2f82ac5b [codex] Add built-in Hermes adapters (#8543)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Agent adapters are the boundary between the control plane and the
runtimes that actually do work.
> - Hermes support needs to be available as first-class local and
gateway adapters while still preserving the adapter-manager override
path for external packages.
> - The adapter work touches runtime execution, UI adapter metadata,
onboarding prompts, scoped credentials, release packaging, and smoke
coverage, so the handoff needs concrete verification rather than only
unit tests.
> - This pull request adds built-in Hermes local and Hermes gateway
support, keeps external adapter overrides compatible, and
documents/tests the gateway flow end to end.
> - The benefit is that operators can hire Hermes-backed agents without
a manual plugin install, while self-hosted installs can still
override/shadow the built-ins through Adapter manager packages.

## Linked Issues or Issue Description

No public GitHub issue exists for this exact Hermes built-in adapter,
gateway onboarding, and release-source work.

Problem description:
- Hermes local and gateway adapters need a public, reviewable source
path in the monorepo so package artifacts and built-in adapter behavior
match the application source.
- Operators need built-in `hermes_local` and `hermes_gateway` adapter
choices without losing the ability to install external Hermes packages
as overrides.
- Gateway onboarding needs secure defaults for API server URLs, API
keys, and generated agent setup text.
- Hermes-originated task bridge credentials need narrower API-key scope
configuration.
- Related public PRs found during duplicate search include #3027, #2363,
#7544, #7950, #8095, and #8543.

## What Changed

- Added the unified Hermes adapter package with local and gateway
server/UI/CLI exports, config schemas, transcript parsing, model
detection, and package metadata.
- Registered `hermes_local` and `hermes_gateway` as built-in adapters
across shared constants, server registries, CLI packaging, and UI
adapter registries.
- Kept the external adapter override path compatible so installed Hermes
packages can shadow built-ins and restore the built-in parser when
disabled.
- Added Hermes gateway onboarding docs, board-operator docs, Docker
smoke assets, and shell smoke harnesses for join/e2e validation.
- Added scoped task-bridge API-key support, authorization checks,
issue-origin handling, and tests for Hermes-created Paperclip tasks.
- Hardened gateway transport and redaction behavior for API keys,
headers, session data, and smoke diagnostics.
- Updated release packaging/bootstrap checks for the Hermes packages
while leaving `pnpm-lock.yaml` out of the PR per repository policy.

## Verification

Targeted local verification recorded before PR handoff:
- `pnpm --filter @paperclipai/hermes-paperclip-adapter exec vitest run
src/gateway/server/execute.test.ts` — 14/14 passed.
- `pnpm test:hermes-gateway-smoke` — 6/6 passed.
- Hermes package typecheck/build checks passed.
- Focused server/UI adapter tests passed — 31/31.
- Release helper Node tests passed — 18/18.
- `git diff --check origin/master..HEAD` passed.

Fresh Docker E2E smoke evidence:
- Ran `pnpm smoke:hermes-gateway-e2e` on 2026-06-26 with a fresh state
directory and fresh Docker container against a live Paperclip dev
server.
- Hermes direct execution reached `completed`.
- Hermes stop/cancel path reached `cancelled`.
- Hermes gateway created a Paperclip task, Paperclip ran the Hermes
agent, and the task reached `done` with the expected marker response.
- Temporary board auth keys, token files, smoke state, and Docker
containers were cleaned up after the run.

PR checks on head `b5eae40ce`:
- GitHub Actions passed: `policy`, `review`, `Typecheck + Release
Registry`, all general test shards, all serialized server shards,
`Build`, `Canary Dry Run`, `e2e`, and aggregate `verify`.
- External checks passed: Snyk and Socket Project Report.
- External Socket Pull Request Alerts remained pending after the
first-party CI matrix completed.

## Risks

- Medium risk: this spans adapter registration, package publishing,
gateway execution, onboarding docs, API-key scoping, and UI adapter
metadata.
- Migration risk is low: the scope-config migration adds a nullable
column and does not rewrite existing keys.
- Gateway execution depends on operator-provided Hermes API
configuration; the smoke covers the Docker gateway path but real
deployments may differ by network/auth setup.
- Direct Greptile review on the latest expanded diff is file-count
limited, although the commitperclip review gate passed.

> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and
discuss it in `#dev` before opening the PR. Feature PRs that overlap
with planned core work may need to be redirected — check the roadmap
first. See `CONTRIBUTING.md`.

## Model Used

OpenAI Codex, GPT-5 coding agent, tool use enabled in a local repository
workspace. Context window size is not exposed in this environment.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] Commitperclip review gate is green; direct Greptile review is
file-count limited on the latest expanded diff
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-06-26 16:04:58 -05:00

6.9 KiB

Hermes Gateway Onboarding

Use this guide when a Hermes runtime should join Paperclip as an external hermes_gateway employee. This mirrors the OpenClaw gateway invite path, but Hermes uses the generic agent invite/onboarding flow instead of the OpenClaw-specific invite prompt endpoint.

Choose The Adapter

Paperclip ships both Hermes adapters as built-ins:

  • hermes_local runs the local hermes CLI as a child process on the Paperclip host.
  • hermes_gateway calls an already-running Hermes API server over HTTP/SSE.

No Adapter manager installation is required for normal use. Adapter manager is only needed when you intentionally install an external @paperclipai/hermes-paperclip-adapter package to override or shadow a built-in adapter while developing the Hermes package. If the external override is paused or removed, Paperclip restores the built-in hermes_local / hermes_gateway adapter.

Required Credentials

Keep these credentials distinct:

  • Hermes inference provider key: set at least one provider key for Hermes, such as OPENROUTER_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, GOOGLE_API_KEY, or MISTRAL_API_KEY.
  • Hermes gateway key: set API_SERVER_KEY before starting Hermes. Paperclip stores the same value as agentDefaultsPayload.apiKey so it can call Hermes.
  • Paperclip agent key: created after the board approves the join request and claimed once by the Hermes agent. Hermes uses this key as PAPERCLIP_API_KEY when it calls Paperclip.

Do not reuse the Hermes gateway key as the Paperclip agent key. The Hermes gateway key authenticates Paperclip-to-Hermes traffic; the claimed Paperclip key authenticates Hermes-to-Paperclip traffic.

Start Hermes Gateway

Install and configure Hermes first:

pip install hermes-agent
export OPENROUTER_API_KEY='<provider-key>'
export API_SERVER_KEY='<random-gateway-key>'
API_SERVER_ENABLED=true hermes gateway run --replace --accept-hooks

The default Hermes API server port is 8642. For local loopback testing, Paperclip can usually store http://127.0.0.1:8642 as the gateway URL. For Docker, LAN, tailnet, or reverse-proxy setups, use a URL reachable by the Paperclip server process.

Plain HTTP is accepted for loopback. Non-loopback HTTP is denied by default in the join flow; use HTTPS for real remote gateways. For private local development only, the join payload can set dangerouslyAllowInsecureRemoteHttp: true, and the smoke scripts expose the same escape hatch as HERMES_GATEWAY_ALLOW_INSECURE_HTTP=1.

Invite From Paperclip

In the board UI:

  1. Open the target company.
  2. Use the add-agent button in the agent sidebar.
  3. Generate an agent onboarding prompt/invite.
  4. Give the generated onboarding text to the Hermes runtime.

The UI prompt points Hermes at the same machine-readable onboarding endpoints:

  • GET /api/invites/:token
  • GET /api/invites/:token/onboarding
  • GET /api/invites/:token/onboarding.txt
  • GET /api/skills/index
  • GET /api/skills/paperclip

For CLI-driven setup, create and inspect the invite directly:

pnpm paperclipai invite create --company-id <company-id> --payload-json '{"requestType":"agent"}'
pnpm paperclipai invite show <token>
pnpm paperclipai invite onboarding:text <token>

Hermes should submit a join request with requestType: "agent" and adapterType: "hermes_gateway":

{
  "requestType": "agent",
  "agentName": "Hermes Gateway Engineer",
  "adapterType": "hermes_gateway",
  "capabilities": "Hermes gateway agent with code, browser, web, and file tools.",
  "agentDefaultsPayload": {
    "apiBaseUrl": "http://127.0.0.1:8642",
    "apiKey": "<same-value-as-API_SERVER_KEY>",
    "paperclipApiUrl": "http://127.0.0.1:3100",
    "sessionKeyStrategy": "issue"
  }
}

Important URL roles:

  • agentDefaultsPayload.apiBaseUrl is the Hermes gateway URL that Paperclip calls.
  • agentDefaultsPayload.paperclipApiUrl is the Paperclip base URL that Hermes can call after approval and key claim.
  • PAPERCLIP_API_URL / PAPERCLIP_API_KEY are injected runtime values for Hermes-originated Paperclip API calls after the agent is approved.

Approve And Claim

After Hermes submits the join request:

  1. In Paperclip, review the pending agent join request.

  2. Approve it from the board UI, or use:

    pnpm paperclipai join list --company-id <company-id> --status pending_approval
    pnpm paperclipai join approve <request-id> --company-id <company-id>
    
  3. Hermes claims the one-time agent API key:

    pnpm paperclipai join claim-key <request-id> --claim-secret <secret>
    
  4. Store the claimed Paperclip key in Hermes runtime state or secrets. The claim secret and claimed key are sensitive and should not be pasted into issue comments, logs, or prompt text.

Once the key is claimed, create an issue assigned to the new Hermes gateway agent and wake it through the normal Paperclip heartbeat path.

Local Fresh-State Smoke

For a fresh Docker-backed Hermes gateway and end-to-end Paperclip join/run verification, use:

PAPERCLIP_API_URL=http://127.0.0.1:3100 \
PAPERCLIP_AUTH_HEADER='Bearer <board-token>' \
pnpm smoke:hermes-gateway-e2e

The E2E smoke:

  • builds a fresh Hermes gateway container
  • seeds a minimal non-secret Hermes model config
  • passes provider keys from the host environment without printing them
  • verifies Hermes /health, /v1/capabilities, /v1/runs, SSE, and stop
  • creates and approves a Paperclip agent-only invite
  • joins as hermes_gateway
  • wakes the agent on a smoke issue
  • removes Paperclip and Docker test state on success

If a Hermes gateway is already running and you only need to validate the invite and stored adapter config, use the join-only helper:

API_SERVER_ENABLED=true API_SERVER_KEY='<gateway-key>' hermes gateway run --replace --accept-hooks

PAPERCLIP_API_URL=http://127.0.0.1:3100 \
PAPERCLIP_AUTH_HEADER='Bearer <board-token>' \
HERMES_GATEWAY_API_BASE_URL=http://127.0.0.1:8642 \
HERMES_GATEWAY_API_KEY='<gateway-key>' \
pnpm smoke:hermes-gateway-join

See HERMES_GATEWAY_SMOKE.md for Docker Desktop, Linux, same-network Docker, LAN/private-network, and reverse-proxy/TLS examples.

Install Entry Points

Use these entry points depending on who is driving setup:

  • Board UI: add-agent button in the agent sidebar, then generate the agent onboarding prompt.
  • Invite API: GET /api/invites/:token/onboarding.txt for the generated llm.txt-style setup instructions.
  • CLI invite flow: pnpm paperclipai invite create, invite show, invite onboarding:text, join approve, and join claim-key.
  • Smoke helpers: pnpm smoke:hermes-gateway-e2e for fresh-state Docker verification and pnpm smoke:hermes-gateway-join for an already-running gateway.
  • Adapter development override: Adapter manager can install @paperclipai/hermes-paperclip-adapter as an external override, but normal operators should use the built-in hermes_local and hermes_gateway adapters.