Skip to the content.

ADR-0004: Dual API keys (contribute + system)

Status: Accepted Date: 2026-08-14

Context

Current Hercules uses a single WebApi:ApiKey for all operations. Studio needs:

Decision

Two API key roles: contribute + system.

Key Role Permissions
contribute operator chat, skills CRUD, memory, config GET, config PATCH (non-destructive), mesh read, tools enable/disable, marketplace install
system admin all contribute + restart, lifecycle destructive (decommission), config PUT (full replace), MCP add/remove, quota changes, force checkout

Implementation

Agent generates both keys at first startup, prints to console, saves to data/security/keys.json.

ApiKeyMiddleware reads WebApi:ApiKeys array:

{
  "WebApi": {
    "ApiKeys": [
      { "key": "hc_contrib_<random>", "role": "contribute" },
      { "key": "hc_sys_<random>", "role": "system" }
    ]
  }
}

Studio behavior

Consequences

Alternatives considered