100 Commits

Author SHA1 Message Date
Julius Brussee b36219e2b1 chore(release): cut @caveman-ai/cli 1.3.3 on the bin-v1.1.6 runtime
Bump every BINARY_RELEASE pin to bin-v1.1.6 and regenerate the compiled
agent-skills bundle, which still carried the pre-ASD-STE100 caveman skill.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W2f7Lf7G9erA7YNn5SXPEj
2026-09-04 02:18:53 +02:00
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
Julius Brussee 9911e5fd0d test(cli): kilo install assertion derives from the profile pin
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W2f7Lf7G9erA7YNn5SXPEj
2026-09-03 20:54:29 +02:00
Julius Brussee 18a8c091d8 chore(agents): bump tested pins after local probe (closes #958 #959 #960 #961 #962 #963 #964)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W2f7Lf7G9erA7YNn5SXPEj
2026-09-03 20:36:03 +02:00
Julius Brussee 9ed2c398de fix(cli): host hook callbacks return on first complete JSON payload, not EOF
shrink-hook (PreToolUse), the memory recall hook (UserPromptSubmit) and
native-hook are invoked directly by hosts and read stdin to EOF. Under the
Windows pipe implementation the host's close can lag arbitrarily (#729/#833,
#949), so a hook with its work done sat until the host's timeout. Same fix
shape as native-hook-fast and the Go bridge: resolve on the first complete
JSON object, keep the 2 MiB cap, unref stdin so the process can exit.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W2f7Lf7G9erA7YNn5SXPEj
2026-09-03 20:36:01 +02:00
Julius Brussee 3b74643f4d fix(cli): wait for a freshly started proxy's run state before judging its owner
A proxy caveman just started binds its port before its run state is
readable, so the immediate probe could report a foreign owner on slower
runners. Poll briefly after start and restart. Test fixes for CI: pin
XDG_CONFIG_HOME for in-process Kilo assertions, import the profile scope
checker through a file URL so Windows can load it, and skip the sh-stub
gh reporter tests on Windows.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 15:48:49 +02:00
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>
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 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 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 be2f788161 fix(cli): guard Kilo managed routing 2026-08-30 06:07:35 +02:00
Julius Brussee 9978a02b7e fix(cli): parse Kilo boolean arity 2026-08-30 06:01:04 +02:00
Julius Brussee df6251dbe2 fix(cli): honor Kilo config directory 2026-08-30 05:58:49 +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 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 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
Julius Brussee 620ece12ee feat(cli): manage Qwen MCP recovery 2026-08-30 01:38:31 +02:00
Julius Brussee cb485a1285 test(cli): cover Qwen wrap isolation 2026-08-30 01:23:55 +02:00
Julius Brussee 3850bf26c3 feat(proxy): add Qwen Code agent profile 2026-08-30 01:22:23 +02:00
Julius Brussee b34c6d2724 fix(registry): price Qwen provider models 2026-08-30 01:21:42 +02:00
Julius Brussee e831b58b05 feat(cli): preserve platform agent settings 2026-08-30 01:20:52 +02:00
Julius Brussee 4a5e6dfcf1 feat(cli): manage Kilo MCP recovery 2026-08-30 01:11:12 +02:00
Julius Brussee d11cce7354 docs(proxy): document Kilo Code wrapping 2026-08-30 01:05:12 +02:00
Julius Brussee 3d5fa5be85 fix(proxy): align profile IDs with slug limit 2026-08-30 01:02:24 +02:00
Julius Brussee da7f3caf2b fix(cli): resolve published agent aliases 2026-08-30 00:59:18 +02:00
Julius Brussee eced1e20f9 feat(proxy): add Kilo Code agent profile 2026-08-30 00:56:31 +02:00