Files
Julius Brussee 3e62063e40 fix(codex): compress array-shaped tool output, record route eligibility, stop config self-corruption and hook stacking
Live-tested Codex 0.149 through the proxy and found four defects:

- proxy: custom_tool_call_output.output is an ARRAY of input_text parts on
  Codex 0.149+. The Responses extractor accepted only the string form, so
  every real Codex tool turn had an empty live zone and the subscription
  route compressed nothing (75-116 KB requests, zero savings). The captured
  real request now compresses; regression test pins the array shape.
- proxy: the /chatgpt route never recorded compression eligibility, so the
  CLI told every Codex subscription user "your agent never reached the
  compression layer" even when routing worked.
- cli: codexNativeConfig ran the legacy table strippers before removing its
  own marker blocks; the stripper swallowed the tables end marker, so the
  block enable had just written failed its own re-parse as "corrupted" on
  the next wrap and doctor reported drift forever. Markers come off first.
- cli: nativeHooksDocument matched caveman hook entries by exact command
  string, so a binary path change (upgrade, moved install) appended a new
  hook set per event instead of replacing it. Match on managed identity.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W2f7Lf7G9erA7YNn5SXPEj
2026-09-04 01:57:14 +02:00
..

Caveman Gateway — the public, byte-safe caveman standalone gateway.

A base-URL-swap reverse proxy: point an agent at http://127.0.0.1:8787 and its LLM traffic flows through Caveman with no code change. Single-operator, BYOK, zero cloud dependencies. Record mode is always a pass-through; on any transform problem the original bytes are forwarded unchanged. Standalone records truthful per-request spend to ~/.caveman/caveman.db and only ever labels savings inferred — never verified.

Source and binaries ship under BSL 1.1. This runtime is source-available, not OSI Open Source before Change Date. First-party self-hosted production is permitted; third-party hosted, managed, or embedded use requires commercial license. See LICENSE and ../LICENSING.md.

go build ./proxy/...                 # build
ANTHROPIC_API_KEY=… caveman-proxy    # serve on 127.0.0.1:8787
caveman-proxy stats                  # print the local spend summary as JSON

Bedrock Runtime is first-party in standalone mode; no raw endpoint is required. Use either the low-friction bearer key or a complete IAM pair:

AWS_REGION=us-east-1 AWS_BEARER_TOKEN_BEDROCK=… caveman-proxy
# or:
AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=… AWS_SECRET_ACCESS_KEY=… caveman-proxy

AWS_SESSION_TOKEN is honored for temporary IAM credentials. Credential precedence is an explicit inbound credential, then the Bedrock bearer token, then a complete IAM pair. A partial pair fails closed. Region precedence is providers.bedrock.region in caveman.yaml, CAVE_BEDROCK_REGION, AWS_REGION, AWS_DEFAULT_REGION, then us-east-1.

Inbound Bedrock x-api-key and bearer credentials are stamped as Bedrock API keys before auth-mode classification. A Claude Code user agent therefore cannot relabel paid Bedrock traffic as subscription traffic.

Driven by the caveman CLI: caveman start launches this binary, caveman wrap <agent> points the agent's provider-specific base URL at it. A Bedrock Claude Code wrap preserves the local AWS BYOK environment. Against a managed gateway it adds the Caveman project key through Claude Code's custom-header seam; the gateway resolves the project's stored Bedrock credential when the child has no AWS credential. When the environment does contain a bearer key or complete IAM tuple, wrap forwards it ephemerally as x-cave-upstream-key (bearer first; IAM encoded as AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY[:AWS_SESSION_TOKEN]). Newlines and incomplete IAM environments fail before launch.

Runtime is the default Bedrock lane. Mantle's Anthropic Messages-compatible route is separate, uses /bedrock/anthropic, and remains disabled unless the deployment explicitly enables CAVE_BEDROCK_MANTLE_ENABLED.

The byte-safe provider adapters under providers/ are shared with the managed gateway, which imports them from here.