Commit Graph

516 Commits

Author SHA1 Message Date
Julius Brussee f9a039a93d chore(release): cut v2.5.0 and @caveman-ai/cli 1.3.2 on the bin-v1.1.5 runtime
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bin-v1.1.5 cli-v1.3.2 v2.5.0
2026-09-02 15:39:01 +02:00
Julius Brussee 14b1c15f2a fix(cli): fail closed on unverifiable proxy owners, strip attributed routes on direct launch
Review follow-ups to #945: a listener caveman did not start this run and
cannot prove it owns (foreign process, or a proxy binary too old to
answer) now launches direct, and the direct-launch strip removes the
agent-attributed /w/<agent> route as well as the bare gateway URL, so a
leaked outer route never reaches the child. Qwen's ACP and extension
listing guards accept yargs camelCase spellings. Proxy-aware fetch no
longer sets an IP literal as TLS servername (rejected on Node 26). The
conformance-pin test fixture follows the pinned-upstream-binary job.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 15:39:01 +02:00
Julius Brussee d6c1cd39af fix(cli): launch direct when a foreign process owns the proxy port
A foreign listener on 127.0.0.1:8787 used to get the banner but still
receive the routed launch, which would send the operator's provider
keys to a process caveman does not own (#945). Treat it like a gate
mismatch and fall back to a direct launch.

Also: Claude Code refuses Remote Control behind any non-first-party
ANTHROPIC_BASE_URL, so `caveman claude remote-control` launches direct
and the limitation is documented (#947); caveman-compress reads the
first text block instead of content[0] so a leading tool_use block no
longer crashes after a paid call (closes #932's report); hook checksum
manifest regenerated after #794.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 15:25:28 +02:00
Julius Brussee c24123dd2b Merge remote-tracking branch 'origin/main'
# Conflicts:
#	README.md
#	docs/technical/agent-profile-registry.md
#	packages/cli/src/index.ts
#	packages/cli/tests/subscription-recovery.runtime.mjs
#	proxy/internal/gateway/chatgpt.go
#	proxy/internal/gateway/proxy.go
#	proxy/internal/gateway/retrieve_tool.go
#	proxy/internal/gateway/server.go
#	proxy/internal/gateway/subscription_live_zone_test.go
2026-09-02 15:19:57 +02:00
Julius Brussee d9faebc2b2 docs(readme): rewrite the front door around measured savings
Two-size install story, a What-you-save section with static SVG charts
rendered from the committed benchmark table, and plain-language copy
for non-programmers. Charts regenerate with benchmarks/render_charts.py.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 15:18:19 +02:00
Julius Brussee 7684fb1cef fix(cli): name per-session recovery and lock Qwen/Kilo control surfaces
Bare start never stamps global recovery; the banner now says which
sessions compress (those whose agent carries caveman_retrieve) and the
status mcp-missing row keys off any installed MCP marker.

Qwen: refuse extension, ACP, session-restore, control-command, and
enforced-auth surfaces that could reactivate a provider route outside
the locked session; replace modelProviders/providerProtocol wholesale
in the routed profile; keep web search and workflows off via env.
Kilo: daemon and console launch direct since they outlive the wrap.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 15:18:19 +02:00
Julius Brussee 41819dcba0 feat(proxy): prove MCP recovery from the request tool list
A bare proxy serves whichever client connects, so a machine-level MCP
install marker can never bind to one request. Read the namespaced
caveman retrieve tool out of the request's own tool list instead, so
subscription and OAuth sessions on a standalone proxy reach the live
zone when their agent carries the tool (#908).

Cache-breakpoint planning and the provider-native cache optimizers now
default on in optimization modes; explicit off and unknown values still
fail closed, and record mode never runs them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 15:18:19 +02:00
Julius Brussee 8dffbb2602 chore: remove cacheengine from this repo
The standalone cache planner is no longer in scope here. Drop the
directory and its BSL listing, license scope note, contributor note,
and the verify_repo license-boundary entry.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 15:18:19 +02:00
github-actions[bot] b2258d9719 chore: sync SKILL.md copies [skip ci] 2026-09-02 13:16:01 +00:00
Pedro Henrique Lopes De Melo 758c69e11b fix(stats): count each API response once, not once per content-block line (#794)
* fix(stats): count each API response once, not once per content-block line

* test(stats): cover response-line dedupe, retry path, and no-id fallback
2026-09-02 15:15:56 +02:00
Amir Fathi dbbc0929b0 fix(compress): validate candidates before touching the live file (#938)
compress_file() wrote each un-validated candidate straight to the live
source file and validated it in place. An interruption (Ctrl-C,
SIGTERM, OOM, or a harness killing the process) between that write and
a passing validation left the live file holding un-validated or
garbage output, with the out-of-tree backup as the only recovery path.

Each candidate is now staged next to the source and validated there;
the live file is written only once a candidate passes, and left
untouched if every attempt fails.

Fixes #544

Signed-off-by: Amir Fathi <amirfathi.me@gmail.com>
2026-09-02 15:15:51 +02:00
s4kura d88f5319bb fix: update retired benchmark model (#937)
Signed-off-by: Iams4kura <126048986+Iams4kura@users.noreply.github.com>
2026-09-02 15:15:47 +02:00
Julius Brussee b4de606fb8 Merge pull request #948 from zsltg/fix/pi-opencode-go-routing
fix(pi): route opencode-go through compat mount
2026-09-02 11:58:22 +02:00
Zsolt Gaspar 455f462407 docs(proxy): document built-in opencode-go compat mount
The proxy now registers /compat/opencode-go/ with a default upstream
and the OPENCODE_API_KEY credential variable. Add the mount and the
user override to the provider docs. Add the variable to the
credential list.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Zsolt Gaspar <17578237+zsltg@users.noreply.github.com>
2026-09-01 21:49:47 +02:00
Zsolt Gaspar 8c5bd6989f fix(pi): route opencode-go through compat mount
The pi extension routed models by wire protocol only. OpenCode Go
models use the OpenAI protocol, so the gateway sent them to
api.openai.com. The OpenCode Go key then caused a 401 error.

The extension now routes by provider and API. OpenCode Go models go
to the /w/pi/compat/opencode-go mount. The extension does not route
unknown providers and shows a pass-through warning.

The standalone proxy registers a built-in compat mount with the
upstream https://opencode.ai/zen/go. The config package holds the
built-in table, so the mount and its key policy come from one place.
A user compat entry with the same name wins. Keyless requests to this
mount use OPENCODE_API_KEY, not OPENAI_COMPAT_API_KEY.

Fixes #946

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Zsolt Gaspar <17578237+zsltg@users.noreply.github.com>
2026-09-01 21:49:47 +02:00
Julius Brussee 60dbb92d62 fix(proxy): lock Qwen side-route surfaces 2026-08-30 06:33:04 +02:00
Julius Brussee cdf3e16bfc fix(proxy): keep Qwen extension guard bounded 2026-08-30 06:15:33 +02:00
Julius Brussee c001dda57b fix(proxy): confine Qwen routed surfaces 2026-08-30 06:14:33 +02:00
Julius Brussee 4070b08c96 fix(ci): bind drift reports to probe lanes 2026-08-30 06:12:20 +02:00
Julius Brussee be2f788161 fix(cli): guard Kilo managed routing 2026-08-30 06:07:35 +02:00
Julius Brussee c52a567ac7 fix(ci): constrain profile contract commits 2026-08-30 06:03:31 +02:00
Julius Brussee 9978a02b7e fix(cli): parse Kilo boolean arity 2026-08-30 06:01:04 +02:00
Julius Brussee 768687e879 fix(ci): validate drift probe artifacts 2026-08-30 06:00:39 +02:00
Julius Brussee df6251dbe2 fix(cli): honor Kilo config directory 2026-08-30 05:58:49 +02:00
Julius Brussee 6925711f86 fix(ci): enforce conformance profile pins 2026-08-30 05:57:19 +02:00
Julius Brussee bc71040245 fix(cli): parse Kilo command arity 2026-08-30 05:56:28 +02:00
Julius Brussee 9377d1f062 fix(cli): follow Kilo config paths 2026-08-30 05:53:13 +02:00
Julius Brussee ca51a04ed2 fix(cli): guard Kilo route overrides 2026-08-30 05:46:42 +02:00
Julius Brussee 1c3af69637 fix(proxy): lock Kilo routing profile 2026-08-30 05:35:25 +02:00
Julius Brussee 8e3f72a4a9 feat(registry): allow optional Kilo upstream keys 2026-08-30 05:35:07 +02:00
Julius Brussee facc597029 fix(cli): guard Qwen route overrides 2026-08-30 05:29:20 +02:00
Julius Brussee 0c9f918849 fix(proxy): lock Qwen routing profile 2026-08-30 05:29:02 +02:00
Julius Brussee 15d08edd83 fix(ci): close profile validation gaps 2026-08-30 05:13:07 +02:00
Julius Brussee fb58e4acbb fix(cli): honor MCP surface opt-outs 2026-08-30 05:08:27 +02:00
Julius Brussee bedde358a5 fix(cli): transact agent MCP ownership 2026-08-30 05:04:13 +02:00
Julius Brussee 55992b71c5 fix(cli): detect Qwen late relaunch suppressors 2026-08-30 03:48:10 +02:00
Julius Brussee 86fb3a6506 fix(cli): guard Qwen late credential resolution 2026-08-30 03:45:01 +02:00
Julius Brussee 35ad321ccd fix(cli): match Qwen JSON and merge safety 2026-08-30 03:41:39 +02:00
Julius Brussee 30bf2e5182 fix(cli): mirror Qwen settings loader 2026-08-30 03:30:59 +02:00
Julius Brussee 167d470d74 ci: restore agent conformance workflow 2026-08-30 03:23:22 +02:00
Julius Brussee 4bc4cec8f5 fix(cli): mirror Qwen credential policy 2026-08-30 03:22:18 +02:00
Julius Brussee 6aac0628d6 fix(cli): respect Qwen workspace trust 2026-08-30 03:04:56 +02:00
Julius Brussee 20df023da3 fix(cli): honor Qwen effective upstream key 2026-08-30 02:57:05 +02:00
Julius Brussee 9cd2703f02 test(cli): cover Qwen stored-key fallback 2026-08-30 02:51:53 +02:00
Julius Brussee 522e549ee3 fix(registry): scope optional credential token 2026-08-30 02:51:38 +02:00
Julius Brussee a07b34dd12 fix(proxy): omit missing Qwen upstream key 2026-08-30 02:47:23 +02:00
Julius Brussee 5c2c517d92 feat(cli): omit unavailable profile credentials 2026-08-30 02:46:36 +02:00
Julius Brussee 3813313547 fix(proxy): close recovery tool namespace 2026-08-30 02:43:07 +02:00
Julius Brussee fd99c98f7c fix(cli): verify effective MCP recovery 2026-08-30 02:41:38 +02:00
Julius Brussee 9d5028bfae docs(proxy): document Qwen Code wrapping 2026-08-30 01:44:53 +02:00