Tam Nhu Tran
ee891bdd0e
docs(docker): document host continuity
2026-08-10 22:13:29 -04:00
Tam Nhu Tran
fc56ecaac4
fix(cliproxy): finish concurrent update recovery
2026-08-10 22:13:29 -04:00
Tam Nhu Tran
192b27fbb2
chore(hardening): refresh source inventory
2026-08-10 22:13:29 -04:00
Tam Nhu Tran
4502e5d503
fix(cliproxy): harden update recovery paths
2026-08-10 22:13:29 -04:00
Tam Nhu Tran
8e4def4713
fix(cliproxy): keep proxy available during updates
2026-08-10 22:13:29 -04:00
github-actions[bot]
51afccf504
chore(release): 8.9.0-dev.2
2026-08-09 04:31:15 +00:00
Kai (Tam Nhu) Tran
c3abc98e39
Merge pull request #1697 from kaitranntt/kai/ci/sync-docker-smoke-fix-dev
...
ci: sync Docker smoke fix into dev
2026-08-09 00:26:30 -04:00
Tam Nhu Tran
8ae7dd88f3
ci: merge main Docker smoke fix into dev
2026-08-09 00:16:48 -04:00
Kai (Tam Nhu) Tran
febdcdbbf4
Merge pull request #1696 from kaitranntt/kai/ci/docker-smoke-cold-start
...
ci(docker): allow cold-start healthcheck window
2026-08-09 00:14:23 -04:00
Tam Nhu Tran
78ad297e30
ci(docker): allow cold-start healthcheck window
2026-08-09 00:09:52 -04:00
github-actions[bot]
7c2d02f761
chore(release): 8.9.0-dev.1
2026-08-09 03:53:11 +00:00
semantic-release-bot
f8a9518b17
chore(release): 8.9.0 [skip ci]
...
## [8.9.0](https://github.com/kaitranntt/ccs/compare/v8.8.1...v8.9.0 ) (2026-08-09)
### Features
* **auth:** share canonical Claude memory ([6841025 ](https://github.com/kaitranntt/ccs/commit/6841025bb413c5ca1c8ce8e903b55dbd5f269036 )), closes [#1688 ](https://github.com/kaitranntt/ccs/issues/1688 )
* **bar:** support --port for ccs bar with sticky port persistence ([34608ce ](https://github.com/kaitranntt/ccs/commit/34608ce291fa7d763c8a949b88cd79c8074385df ))
* **cliproxy:** expose model context windows ([b073261 ](https://github.com/kaitranntt/ccs/commit/b0732613a318e92dff2a827e9f7e67bb04184378 ))
* **cliproxy:** expose request retry config ([d5ea4ee ](https://github.com/kaitranntt/ccs/commit/d5ea4eeea353687795856ee567f5adbc23cc8f32 ))
* **cliproxy:** persist scoped routing rules ([9fb2016 ](https://github.com/kaitranntt/ccs/commit/9fb2016f9012466afc92049b0b068dbafc487b57 ))
* **i18n:** add Brazilian Portuguese (pt-BR) locale ([bb2596e ](https://github.com/kaitranntt/ccs/commit/bb2596e296caa20a69c897ba472b7ada9eac2eda ))
* rebrand CCS as Claude Codex Switch ([#1658 ](https://github.com/kaitranntt/ccs/issues/1658 )) ([3608bf7 ](https://github.com/kaitranntt/ccs/commit/3608bf71a1515dd65f0cdf29e2c6b5fc1030d723 )), closes [#1657 ](https://github.com/kaitranntt/ccs/issues/1657 )
* support claude opus 5 ([ee90dd2 ](https://github.com/kaitranntt/ccs/commit/ee90dd26403e4366af7a4cdbf179e28f45887dc0 ))
* **ui:** add codex fast service-tier toggle ([108ff84 ](https://github.com/kaitranntt/ccs/commit/108ff843f142e0a88d000db2aaa731dbc89f450f ))
* **ui:** add fable tier row in model mapping ([b27a007 ](https://github.com/kaitranntt/ccs/commit/b27a007229388a98bd6254af76b33b1d1ad2135e ))
* **ui:** add per-tier codex effort dropdown in model mapping ([e57bded ](https://github.com/kaitranntt/ccs/commit/e57bded451de16fb31f639df8e92ebd554288946 ))
* **ui:** extend reasoning control to xai grok models ([30b54a0 ](https://github.com/kaitranntt/ccs/commit/30b54a09666642d65f80c01b60da9d19324cafdd ))
### Bug Fixes
* apply cliproxy retry settings safely ([480b795 ](https://github.com/kaitranntt/ccs/commit/480b79551b5f4e849c9f3341d6a8302141ce4bab ))
* **auth:** guard shared linking against instance replacement ([54efb82 ](https://github.com/kaitranntt/ccs/commit/54efb820553c4760cf081f363269ac1a16c85a3a ))
* **auth:** preserve explicit resume session continuity ([6721d47 ](https://github.com/kaitranntt/ccs/commit/6721d47502645325d58fc97a4d11bb53750d0c75 )), closes [#1685 ](https://github.com/kaitranntt/ccs/issues/1685 )
* **bar:** bound native credential and quota waits ([da2de60 ](https://github.com/kaitranntt/ccs/commit/da2de600159cffb9db27d6e7bbeef03daae2b3f0 ))
* **bar:** harden lifecycle process handling ([1a80717 ](https://github.com/kaitranntt/ccs/commit/1a80717f998079f449749db04aeed4b6eccc3349 ))
* **bar:** keep sticky port across `ccs bar stop` via launch.json fallback ([d27b53f ](https://github.com/kaitranntt/ccs/commit/d27b53f235fa16c6d5404b96fc183db4bfc9c1e3 ))
* **bar:** stop false re-auth on non-default native subscription profiles ([a5a5b74 ](https://github.com/kaitranntt/ccs/commit/a5a5b742e4255051b160001985c4c545e85b0cf8 ))
* **bar:** treat cached quota rows as stale once their reset passes ([833473c ](https://github.com/kaitranntt/ccs/commit/833473c5f61f2df4e6408783a38f18d903384917 ))
* **cliproxy:** classify Claude quota probe 429s ([bdcfc20 ](https://github.com/kaitranntt/ccs/commit/bdcfc20c0f78a19d5f7ed306f3094ac6f978482c ))
* **cliproxy:** correct Claude Opus 5 metadata ([af4e4fb ](https://github.com/kaitranntt/ccs/commit/af4e4fb3531b5474cb2aa719cc2aaae6f112cfb0 ))
* **cliproxy:** probe Gemini OAuth support ([19c6c3f ](https://github.com/kaitranntt/ccs/commit/19c6c3f4577932a3b9c1eb4f8818d6fbec838bca ))
* **cliproxy:** retry contended state locks ([66794e0 ](https://github.com/kaitranntt/ccs/commit/66794e07323780ca1376e29a8fb2833d82c747d1 ))
* **i18n:** complete Brazilian Portuguese locale ([0a80ddd ](https://github.com/kaitranntt/ccs/commit/0a80dddb9cf24ea37dd733fa67a58649cb31ebef ))
* **metrics:** enforce exact runtime inventory ([306a827 ](https://github.com/kaitranntt/ccs/commit/306a8276b3f081560d447ee68243bd35b9051cac ))
* propagate fable model mapping across runtime paths ([f7241d0 ](https://github.com/kaitranntt/ccs/commit/f7241d0874088bfbfd498745c28b8d0ea236029b ))
* **proxy:** hoist duplicate system messages before coalescing ([b720231 ](https://github.com/kaitranntt/ccs/commit/b720231077267e0fcf281ef77b6c188340f6a3b6 )), closes [#1459 ](https://github.com/kaitranntt/ccs/issues/1459 )
* **proxy:** stabilize upstream fetch transport ([d8210cf ](https://github.com/kaitranntt/ccs/commit/d8210cf0113cf6aa782f856db683e9123cb27711 )), closes [#1686 ](https://github.com/kaitranntt/ccs/issues/1686 )
* **shared-manager:** adopt diverged plugin registry files in linkInstancePlugins ([fa6b27f ](https://github.com/kaitranntt/ccs/commit/fa6b27f159fd8dd8782f98ae415b572c5cde4eee ))
* **shared-manager:** adopt diverged settings.json content before re-linking ([481f013 ](https://github.com/kaitranntt/ccs/commit/481f013ec2581b943131fde1f11e34a098013b38 )), closes [#57 ](https://github.com/kaitranntt/ccs/issues/57 ) [#1681 ](https://github.com/kaitranntt/ccs/issues/1681 )
* **shared-manager:** preserve diverged files safely ([7ae617f ](https://github.com/kaitranntt/ccs/commit/7ae617f0ee2b377b5d9b74186431fb29ed019368 ))
* **ui:** preserve codex tuning metadata in live catalog merge ([8d1a093 ](https://github.com/kaitranntt/ccs/commit/8d1a093cf94341e010903f2918c0dc18da19f94a ))
* **ui:** preserve untrusted origins in dev proxy ([c23b6be ](https://github.com/kaitranntt/ccs/commit/c23b6bee19af147ef015e67c373d47af2d952c89 ))
* **websearch:** honor disabled steering per launch ([abc3002 ](https://github.com/kaitranntt/ccs/commit/abc3002e89cb6f7fd7659b41084b6c835008c6cd ))
### Documentation
* **ai:** define documentation truth hierarchy ([3bb2d56 ](https://github.com/kaitranntt/ccs/commit/3bb2d56778a3e775e8d4f2fd236c5984c79e916d ))
* **architecture:** reconcile provider and target contracts ([ebe1746 ](https://github.com/kaitranntt/ccs/commit/ebe174645938c8f86f92eafaaaa57a0db94482a6 ))
* **architecture:** replace volatile maintainer snapshots ([721ca5f ](https://github.com/kaitranntt/ccs/commit/721ca5fc339391530de2498646db91c0dee6b24f ))
* clarify disabled WebSearch launch behavior ([f89f136 ](https://github.com/kaitranntt/ccs/commit/f89f136a1bda46dc58f7c7d9d9a4efccaea9c611 ))
* **config:** preserve active developer contracts ([fd0d436 ](https://github.com/kaitranntt/ccs/commit/fd0d4362b388e29dc394e5092bfd3af74d859977 ))
* **contributing:** align test and UI guidance ([1e11335 ](https://github.com/kaitranntt/ccs/commit/1e1133534835ea705624feab3f3384ce5bea322a ))
* document Brazilian Portuguese locale ([348d230 ](https://github.com/kaitranntt/ccs/commit/348d2302985b91eb4beedd397c517eb5ccaefcf6 ))
* **hygiene:** remove superseded local guides ([75e715e ](https://github.com/kaitranntt/ccs/commit/75e715eebdf5d759234057c0e7212aee022a11c6 ))
* **macos:** consolidate CCS Bar maintainer guidance ([4485fd6 ](https://github.com/kaitranntt/ccs/commit/4485fd64062d14e4dabb4815ca4173322b7d4f55 ))
* **operations:** refresh runtime contracts ([51e8062 ](https://github.com/kaitranntt/ccs/commit/51e806299564da03ac8ce98cad35cc962ec01078 ))
* **product:** refresh product and release contracts ([b918783 ](https://github.com/kaitranntt/ccs/commit/b918783293381a13f0ba90c17c57743a748fa733 ))
* **readme:** clarify supported proxy runtimes ([3e38208 ](https://github.com/kaitranntt/ccs/commit/3e38208b37b6a7e01ff561539367c524d1df4db8 )), closes [#1686 ](https://github.com/kaitranntt/ccs/issues/1686 )
* **readme:** route user guides to canonical docs ([deb1ed0 ](https://github.com/kaitranntt/ccs/commit/deb1ed0e67d6ca71953f0a78f72b9916c8bc8ed5 ))
* **roadmap:** replace historical trackers with live guidance ([426dc54 ](https://github.com/kaitranntt/ccs/commit/426dc541a935d60747ce0bfa8e598ff3fa86f94d ))
### Tests
* **cliproxy:** cover auto compact windows ([c107a67 ](https://github.com/kaitranntt/ccs/commit/c107a6752c9d1eb2d510b85fed37ea9bd26fc767 ))
* **cliproxy:** cover Claude quota probe 429s ([92fb66c ](https://github.com/kaitranntt/ccs/commit/92fb66c47bed4c305c8d77ac47330967509b6ff6 ))
* **cliproxy:** cover concurrent state writers ([d700030 ](https://github.com/kaitranntt/ccs/commit/d7000300188c1aff78bfc44cd643c9e4cb96819e ))
* **cliproxy:** cover Gemini OAuth capabilities ([c4fc5e8 ](https://github.com/kaitranntt/ccs/commit/c4fc5e89855f1a07b9d01a843c7874fc640e1371 ))
* **cliproxy:** cover routing rule preservation ([2ce3bfc ](https://github.com/kaitranntt/ccs/commit/2ce3bfca26df80481f87ad2b29c4a8d2835e6e7a ))
* **docs:** enforce documentation freshness ([8dc6b81 ](https://github.com/kaitranntt/ccs/commit/8dc6b817b2e9d66752892e12410ec17988676cb0 ))
* **proxy:** harden system message ordering ([c621241 ](https://github.com/kaitranntt/ccs/commit/c621241a2e308b6910b556696da40f1820ca9a1d )), closes [#1687 ](https://github.com/kaitranntt/ccs/issues/1687 )
* **ui:** cover Claude Opus 5 catalog visibility ([0629b4a ](https://github.com/kaitranntt/ccs/commit/0629b4a40573a41966da7218f5d9e64bd68b32be ))
* **websearch:** cover disabled launch snapshots ([9f5706c ](https://github.com/kaitranntt/ccs/commit/9f5706c275aa9142f88fcbe4ee4b95cce087b674 ))
### CI
* **review:** configure explicit reasoning effort ([26c1393 ](https://github.com/kaitranntt/ccs/commit/26c1393c161a7dfbe7bae7c5c9aff59a0447a002 ))
2026-08-09 03:44:08 +00:00
Kai (Tam Nhu) Tran
83268d15c8
Merge pull request #1695 from kaitranntt/kai/release/dev-to-main-20260808
...
feat: promote dev to main
2026-08-08 23:39:59 -04:00
github-actions[bot]
16ef7a3444
chore(release): 8.8.1-dev.22
2026-08-09 03:16:42 +00:00
Kai (Tam Nhu) Tran
27b0ea08fe
Merge pull request #1694 from kaitranntt/kai/feat/1688-share-claude-md
...
feat(auth): share canonical CLAUDE.md across account profiles
2026-08-08 23:12:23 -04:00
Tam Nhu Tran
54efb82055
fix(auth): guard shared linking against instance replacement
2026-08-08 23:06:29 -04:00
Tam Nhu Tran
5f9db033e7
chore: merge origin/dev into issue #1688
...
# Conflicts:
# docs/reports/hardening-inventory.json
# docs/reports/hardening-inventory.md
2026-08-08 22:29:46 -04:00
github-actions[bot]
184b7b9eb6
chore(release): 8.8.1-dev.21
2026-08-09 02:23:39 +00:00
Kai (Tam Nhu) Tran
eb4ea02479
Merge pull request #1693 from kaitranntt/kai/fix/1686-openrouter-fetch
...
fix(proxy): stabilize upstream fetch transport
2026-08-08 22:19:16 -04:00
Tam Nhu Tran
0ddeb09955
chore(dev): merge v8.8.1-dev.20 for issue 1686
2026-08-08 22:09:27 -04:00
github-actions[bot]
e9a3d2f7ac
chore(release): 8.8.1-dev.20
2026-08-09 02:02:51 +00:00
Kai (Tam Nhu) Tran
560e288cf4
Merge pull request #1692 from kaitranntt/kai/fix/1685-resume-continuity
...
fix(auth): preserve explicit resume session continuity
2026-08-08 21:58:33 -04:00
Tam Nhu Tran
ce8ad269f0
chore(merge): sync dev release v8.8.1-dev.19
2026-08-08 21:48:56 -04:00
github-actions[bot]
19204d01b0
chore(release): 8.8.1-dev.19
2026-08-09 01:42:06 +00:00
Kai (Tam Nhu) Tran
b465557fd8
Merge pull request #1691 from poomsc/feat/bar-port-flag
...
feat(bar): support --port for ccs bar with sticky port persistence
2026-08-08 21:37:54 -04:00
Tam Nhu Tran
4d5449a493
Merge remote-tracking branch 'origin/dev' into kai/review/pr-1691
...
# Conflicts:
# docs/reports/hardening-inventory.json
# docs/reports/hardening-inventory.md
2026-08-08 21:31:32 -04:00
github-actions[bot]
82780ae506
chore(release): 8.8.1-dev.18
2026-08-09 01:25:09 +00:00
Kai (Tam Nhu) Tran
273d9b5e99
Merge pull request #1690 from poomsc/fix/bar-native-profile-reauth
...
fix(bar): stop false re-auth on non-default native subscription profiles
2026-08-08 21:20:58 -04:00
Tam Nhu Tran
1a80717f99
fix(bar): harden lifecycle process handling
2026-08-08 21:17:51 -04:00
Tam Nhu Tran
6841025bb4
feat(auth): share canonical Claude memory
...
Refs #1688
2026-08-08 21:17:32 -04:00
Tam Nhu Tran
3e38208b37
docs(readme): clarify supported proxy runtimes
...
Refs #1686
2026-08-08 21:17:24 -04:00
Tam Nhu Tran
d8210cf011
fix(proxy): stabilize upstream fetch transport
...
Refs #1686
2026-08-08 21:17:13 -04:00
Tam Nhu Tran
379008383e
chore(reports): refresh hardening inventory
...
Refs #1685
2026-08-08 21:17:12 -04:00
Tam Nhu Tran
6721d47502
fix(auth): preserve explicit resume session continuity
...
Refs #1685
2026-08-08 21:17:01 -04:00
Tam Nhu Tran
59eec74f40
chore: merge released dev into PR #1690
2026-08-08 21:14:50 -04:00
Tam Nhu Tran
da2de60015
fix(bar): bound native credential and quota waits
2026-08-08 21:12:28 -04:00
github-actions[bot]
3e7f27fe9a
chore(release): 8.8.1-dev.17
2026-08-09 01:07:37 +00:00
Kai (Tam Nhu) Tran
d2f8939568
Merge pull request #1687 from yosnap/fix/coalesce-duplicate-system-messages
...
fix(proxy): hoist duplicate system messages before coalescing
2026-08-08 21:03:31 -04:00
Tam Nhu Tran
c621241a2e
test(proxy): harden system message ordering
...
Cover supported late-system and tool-result ordering invariants.
Refs #1687
2026-08-08 20:59:37 -04:00
poomsc and Claude Fable 5
d27b53f235
fix(bar): keep sticky port across ccs bar stop via launch.json fallback
...
`ccs bar stop` deletes bar.json, so a bar.json-only sticky port is lost on
every stop/start cycle: the next launch reverted to 3000 and the probe could
no longer find a server still running on the previously chosen port.
resolveBarPort now falls back to the --port recorded in launch.json (written
by launch, not deleted by stop), which restores both the sticky port and
probe discovery after a stop.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-08 14:50:18 +07:00
poomsc and Claude Fable 5
833473c5f6
fix(bar): treat cached quota rows as stale once their reset passes
...
A cached row whose next_reset has passed describes the previous quota
window — the quota snapped back at the boundary, so serving it for the rest
of the 10-min TTL shows wrong percentages and an already-elapsed reset time
in the bar. Both the per-profile TTL short-circuit and the rotating-slot
eligibility now mark such rows stale. Guarded by cachedAt < resetAt so a
post-reset payload that still reports a past reset cannot refetch-loop.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-08 14:43:52 +07:00
poomsc and Claude Fable 5
a5a5b742e4
fix(bar): stop false re-auth on non-default native subscription profiles
...
Fixes the two collector-side root causes of #1601 :
1. Claude per-profile credential reads were file-only, but on macOS Claude
Code stores the OAuth token for an isolated CLAUDE_CONFIG_DIR in a
per-directory Keychain item ("Claude Code-credentials-<sha256(dir)[0..8]>").
The .credentials.json file never exists, so every isolated profile was
parked with needsReauth:true forever. The reader now falls back to that
Keychain item (file-first, same security-CLI read the shipped global
fallback already performs; TTL-gated so it is not on every /summary).
2. Non-default profiles were cache-only forever, so they could never leave
the parked state even with valid credentials. getNativeAccountRows now
gives each surface ONE rotating live slot: the stalest eligible
non-default profile is refreshed per pass, skipping profiles inside
breaker/reauth cooldowns. Every account converges to real quota within a
few polls while the per-pass upstream budget stays constant (<= 2 calls
per surface regardless of profile count). Codex named profiles with valid
auth but sparse payloads now yield an active quota-less row instead of a
false needsReauth row.
Non-default rows keep paused:true (dimmed) even when freshly refreshed so
only the default renders active and rows do not flicker between polls.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-08-08 14:18:00 +07:00
poomsc and Claude 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
sn4p.dev
b720231077
fix(proxy): hoist duplicate system messages before coalescing
...
Claude Code sends the system prompt as the top-level `system` field and,
separately, sends skill/plugin listings as `role: "system"` entries inside
`messages` (#1459 made the transformer accept those). `transform()`
unconditionally prepends the top-level field, so once both are present the
OpenAI-compat payload ends up with two `system` messages that are not
adjacent. `coalesceMessages` only merges consecutive same-role messages and
explicitly skips `system`, so it cannot fix this.
Strict OpenAI-compatible backends (LiteLLM among them) reject that shape with:
400 A 'system' message can only appear at index 0 of the messages array.
Add `hoistSystemMessages`, run before `coalesceMessages`, which extracts every
`system` message in encounter order and reinserts a single merged one at
index 0. Content-preserving, no behavior change when at most one system
message is present.
2026-08-06 11:28:18 +02:00
github-actions[bot]
7fb56d62e1
chore(release): 8.8.1-dev.16
2026-08-03 00:28:51 +00:00
Kai (Tam Nhu) Tran
eaac5beecb
Merge pull request #1682 from nmelo/fix/adopt-diverged-settings
...
Preserve diverged CCS settings and plugin registry files during reconciliation.
2026-08-02 20:24:32 -04:00
Tam Nhu Tran
b022d362dd
chore(hardening): refresh filesystem inventory
2026-08-02 20:21:19 -04: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