Commit Graph
1205 Commits
Author SHA1 Message Date
poomscandClaude Fable 5 34608ce291 feat(bar): support --port for ccs bar with sticky port persistence
ccs bar always forced the dashboard onto port 3000 (first free of a
hardcoded candidate list), which collides with other local dev servers, and
bar.json was rewritten to 3000 on every launch.

- `ccs bar [launch] --port N` runs the server on exactly N: reuses a live
  server already on N, moves a running server from another port (SIGTERM via
  server.pid, wait for exit), errors clearly when N is busy or the value is
  invalid.
- The chosen port is persisted into launch.json args, so the Swift app
  self-starts the server on the same port.
- Without --port, launch and serve now try the port recorded in bar.json
  first (sticky), so the server keeps coming back on the port the user last
  chose instead of reverting to 3000.
- Bare flags (`ccs bar --port N`) route to the launch subcommand; --port is
  documented in `ccs bar --help`.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 14:09:58 +07:00
Tam Nhu Tran 7ae617f0ee fix(shared-manager): preserve diverged files safely 2026-08-02 20:21:09 -04:00
Nelson Melo fa6b27f159 fix(shared-manager): adopt diverged plugin registry files in linkInstancePlugins
The same atomic-rename divergence occurs in the plugins subtree: a
plugin install inside a session rewrites plugins/installed_plugins.json,
replacing the instance-level symlink with a regular file. The per-launch
relink then discarded it, so the plugin was effectively uninstalled on
every relaunch while settings.json still marked it enabled — sessions
then fail with 'Unknown skill: <plugin>:<skill>'.

Move adoptDivergedFileContent to fs-helpers (avoids a circular import)
and apply it to file-type plugin entries before re-linking.
2026-07-31 13:40:23 -04:00
Nelson Melo 481f013ec2 fix(shared-manager): adopt diverged settings.json content before re-linking
Claude Code saves settings.json atomically (temp file + rename), which
replaces the managed shared symlink with a regular file holding the
user's latest changes (see #57). The launch-time relink then deleted
that file without reading it, silently reverting plugin enables and any
other in-session settings change on every profile relaunch.

Adopt the diverged file's content into the canonical ~/.claude file
(with a .bak-ccs-adopt backup) before restoring the symlink, at both
the shared-level and instance-level reconciliation points.

Fixes #1681
2026-07-31 12:14:29 -04:00
Tam Nhu Tran 26c1393c16 ci(review): configure explicit reasoning effort 2026-07-31 10:32:32 -04:00
Tam Nhu Tran c107a6752c test(cliproxy): cover auto compact windows 2026-07-29 13:46:53 -04:00
Kai (Tam Nhu) Tran 236471100c Merge pull request #1676 from kaitranntt/kai/fix/1648-disabled-websearch-steering
fix(websearch): honor disabled steering per launch
2026-07-29 13:44:56 -04:00
Tam Nhu Tran 92fb66c47b test(cliproxy): cover Claude quota probe 429s 2026-07-29 13:22:21 -04:00
Tam Nhu Tran 9f5706c275 test(websearch): cover disabled launch snapshots 2026-07-29 13:22:21 -04:00
Tam Nhu Tran d700030018 test(cliproxy): cover concurrent state writers 2026-07-29 12:52:03 -04:00
Kenneth Wong ee90dd2640 feat: support claude opus 5 2026-07-27 15:07:26 +08:00
Kai (Tam Nhu) Tran b09f8191f3 Merge pull request #1669 from kaitranntt/kai/docs/1666-pruning-freshness
docs: prune stale guides and enforce freshness
2026-07-26 22:09:35 -04:00
Tam Nhu Tran 8dc6b817b2 test(docs): enforce documentation freshness 2026-07-26 09:36:01 -04:00
Tam Nhu Tran 306a8276b3 fix(metrics): enforce exact runtime inventory 2026-07-26 09:36:00 -04:00
Tam Nhu Tran 1e11335348 docs(contributing): align test and UI guidance 2026-07-26 09:34:18 -04:00
Tam Nhu Tran 2d909a162f Merge remote-tracking branch 'origin/dev' into kai/review/pr-1655-retry-followup 2026-07-22 15:08:11 -04:00
Tam Nhu Tran 480b79551b fix: apply cliproxy retry settings safely 2026-07-22 15:08:06 -04:00
Kai (Tam Nhu) Tran 9cbf02b1be Merge pull request #1652 from minhbi245/feat/fable-tier-mapping
feat(ui): add fable tier row in model mapping
2026-07-22 14:59:24 -04:00
Tam Nhu Tran f7241d0874 fix: propagate fable model mapping across runtime paths 2026-07-22 14:58:57 -04:00
Kai (Tam Nhu) Tran 3608bf71a1 feat: rebrand CCS as Claude Codex Switch (#1658)
Closes #1657
2026-07-22 14:23:42 -04:00
milesnguyen2405 b27a007229 feat(ui): add fable tier row in model mapping 2026-07-22 14:51:40 +07:00
Tam Nhu Tran 003342f604 hotfix(docker): select Alpine-compatible CLIProxy asset 2026-07-18 19:55:07 -04:00
Tam Nhu Tran 44718e98ef fix(auth): preserve xAI profile compatibility 2026-07-18 19:04:37 -04:00
Tam Nhu Tran 90c0409aac Merge remote-tracking branch 'origin/dev' into kai/review/1641-xai-grok 2026-07-18 18:14:56 -04:00
Tam Nhu Tran 6dc199a038 fix(ci): isolate Bar command fast tests 2026-07-18 17:46:53 -04:00
Tam Nhu Tran 8996c92fda fix(bar): preserve quota cache and reset semantics 2026-07-18 17:28:36 -04:00
Tam Nhu Tran f77ed33cc7 fix(bar): show Claude and Codex pool quota 2026-07-18 17:13:40 -04:00
minhbi245 54a2b4759b feat(cliproxy): add xAI Grok provider 2026-07-17 00:02:12 +07:00
Tam Nhu Tran 234dce3150 fix(codex-auth): reject aliased plugin cache paths 2026-07-15 11:36:15 -04:00
Tam Nhu Tran 960d6e23a0 test(codex-auth): cover profile cache repair entry points 2026-07-15 10:24:13 -04:00
Tam Nhu Tran e5d4d860b3 fix(codex-auth): share plugin cache across profiles 2026-07-15 10:24:13 -04:00
Tom Price a7f3e4bc0e fix: guard against missing modelBreakdowns in usage aggregation
The CCS Bar server was crash-looping with:

    [X] Cannot read properties of undefined (reading 'length')

Usage records from partially-written or legacy persisted files (e.g. a
Codex rollout scanned mid-write) can be missing modelBreakdowns despite
the type. getHourlyRequestCount() and the daily/monthly/hourly merges
read it unguarded, and the Bar re-runs aggregation every ~5 min and
restarts on crash - hence the loop.

Default modelBreakdowns to [] at every use site and fall back to 0 for
request count. Regression test added for all three merges.

I don't normally work in TS and this was heavily tool-assisted, but it
has fixed the crash loop on my machine.
2026-07-12 21:23:31 -04:00
Tam Nhu Tran 77e73dd091 fix(codex): preview joined migration TOML repair
Closes #1635
2026-07-10 08:54:18 -04:00
Sergey Galuza 1e63c37baf feat(pricing): register Claude Sonnet 5 in the pricing registry
Add explicit `claude-sonnet-5` and `claude-sonnet-5-thinking` entries to the
web-server PRICING_REGISTRY at the standard Sonnet rates ($3/$15 in/out,
$3.75/$0.30 cache).

The model catalog and dashboard already ship Sonnet 5 (it is the Claude
default), but pricing was missing: getModelPricing() fell through to
UNKNOWN_MODEL_PRICING, which only coincidentally matches Sonnet rates. As a
result hasCustomPricing('claude-sonnet-5') returned false and getKnownModels()
omitted it, so Sonnet 5 was treated as an unknown model in cost accounting and
known-model listings.

Registering it explicitly makes the pricing intentional and consistent with
every other Claude model, without changing any resolved values.

Built [OnSteroids](https://onsteroids.ai)
2026-07-07 14:51:43 +02:00
Kai (Tam Nhu) Tran 1ee7cac555 fix: reject case-variant symlinked file paths (#1629)
* fix: reject case-variant symlinked file paths

* fix: validate requested case-variant symlink paths
2026-07-01 01:26:48 -04:00
Kai (Tam Nhu) Tran 343899f6c1 fix: prevent default profile credential collision (#1628)
* fix: prevent default profile credential collision

* fix: isolate default profile credential fallback
2026-07-01 01:15:45 -04:00
Kai (Tam Nhu) Tran 0f9a87619c fix: cap native quota profile refresh fan-out (#1627)
* fix: cap native quota profile refresh fan-out

* fix: preserve native quota live cache state
2026-07-01 01:09:01 -04:00
Kai (Tam Nhu) Tran 3621f8dcb1 fix: validate CCS Bar launch shim target integrity (#1626)
* fix: validate CCS Bar launch shim target integrity

* fix: execute verified bar shim bytes
2026-07-01 00:49:56 -04:00
Kai (Tam Nhu) Tran 05685d1c21 fix: keep agy websearch permissions enabled (#1625) 2026-07-01 00:45:09 -04:00
Kai (Tam Nhu) Tran 0180b62453 fix(bar): use nonce-bound probe auth (#1623) 2026-06-30 13:10:56 -04:00
Kai (Tam Nhu) Tran 138ead0e1e fix(logging): redact browser debug endpoint (#1622)
* fix(logging): redact browser debug endpoint

* fix(logging): redact prompt argv values
2026-06-30 13:07:46 -04:00
Kai (Tam Nhu) Tran f2843ad2ce fix: fail closed on websearch launch provisioning (#1621) 2026-06-30 13:00:41 -04:00
Kai (Tam Nhu) Tran 0527e276b1 fix: skip paused codex accounts in bar refresh (#1620) 2026-06-30 12:59:54 -04:00
Kai (Tam Nhu) Tran 396e01ab6f fix: bound bar raw socket probes (#1618) 2026-06-30 12:53:35 -04:00
Kai (Tam Nhu) Tran 2f1453e397 fix(auth): honor legacy unified default profiles (#1619) 2026-06-30 12:53:03 -04:00
Kai (Tam Nhu) Tran 4283c4665c fix(cursor): propagate daemon auth token (#1616)
* fix(cursor): propagate daemon auth token

* fix(cursor): align daemon auth token propagation
2026-06-30 12:37:41 -04:00
Kai (Tam Nhu) Tran 3f1dce30bc fix: close bar launch case bypass (#1613) 2026-06-30 12:33:46 -04:00
Tam Nhu Tran 045fc93285 test(glmt): align thinking signature coverage 2026-06-29 12:58:38 -04:00
Sergey Galuza cbcdb6ba62 fix(glmt): emit thinking signature as opaque string
generateThinkingSignature() returned an object
({type, hash, length, timestamp}) but Anthropic requires a thinking
block's `signature` to be a non-empty opaque STRING. The object made
the thinking block invalid, breaking the stream against reasoning
backends and surfacing as a false 502 "did not respond within 600s".

Return a deterministic base64 token instead (no Date.now()), and
narrow ThinkingSignature to a string alias so existing imports stay
intact. The signature is only ever assigned, never read as an object,
so consumers are unaffected. Update the existing unit test to the
corrected string contract.

Built [OnSteroids](https://onsteroids.ai)
2026-06-29 13:27:09 +02:00
Sergey Galuza 37d2bae001 test(glmt): assert thinking signature is a non-empty opaque string
Add two contract tests on the public proxy path
createAnthropicProxyResponse: JSON and SSE. Anthropic requires a
thinking block's signature to be a non-empty opaque string, but ccs
currently fabricates the signature as an object via
generateThinkingSignature(), which breaks the stream against reasoning
backends.

Built [OnSteroids](https://onsteroids.ai)
2026-06-29 13:26:16 +02:00