Commit Graph
4549 Commits
Author SHA1 Message Date
Thieu Nguyen ba0e768fbf fix(codex): normalize CLIProxy responses routes (#1605)
Normalize Codex Responses base URLs so CCS-backed Codex launches use /backend-api/codex on the original CLIProxy backend. Share the Codex Responses route builder with ccsxp provider repair, and repair stale native Codex provider auth blocks when env_key token injection is used.
2026-06-26 15:41:15 -04:00
github-actions[bot] 36ea9064e7 chore(release): 8.6.1-dev.4 2026-06-24 22:48:58 +00:00
Kai (Tam Nhu) Tran d7933c6243 feat(bar): swipeable profile carousel and condensed alerts (#1603)
Closes #1602
2026-06-24 18:44:53 -04:00
github-actions[bot] 0d20a102bd chore(release): 8.6.1-dev.3 2026-06-24 22:19:45 +00:00
Kai (Tam Nhu) Tran 62274dabfa fix(bar): align subscription carousel and collapse stale blank space (#1600)
Closes #1599
2026-06-24 18:15:43 -04:00
github-actions[bot] 7c635a1714 chore(release): 8.6.1-dev.2 2026-06-24 21:09:56 +00:00
Kai (Tam Nhu) Tran 482868ad97 Merge pull request #1596 from kaitranntt/kai/feat/1595-bar-multi-profile-quota
feat(bar): per-profile subscription quota for ccs auth + ccsx auth accounts
2026-06-24 17:01:40 -04:00
Kai (Tam Nhu) Tran 121d415cf8 Merge pull request #1598 from kaitranntt/kai/fix/1597-codex-responses-404
fix(codex): route codex CLI to /backend-api/codex on original CLIProxy backend
2026-06-24 17:01:12 -04:00
Tam Nhu Tran b514986ddd fix(bar): short-TTL parked rows + keep valid codex subs active
Addresses two review focus areas:

- Stale Parked Rows: profiles with no on-disk credentials cached their parked
  row for the full quota TTL, so a fresh login stayed dimmed for up to 10 min.
  Parked rows (quotaStatus 'unsupported') now use a 30s TTL so a new login is
  picked up within seconds.
- Codex Fallback: a named codex profile whose token authenticated but whose
  response lacked core windows was downgraded to a parked/needsAuth row, hiding
  a real subscription. It now emits an active (quota-less) row; only the bare
  default still falls back to global local session data.

Also fixes a latent coalescing bug the short TTL exposed: a synchronous return
inside the pending IIFE cleared state.pending during its own assignment, leaving
a stale resolved promise that the next call reused. The IIFE now yields once so
the assignment lands before the finally clears it.
2026-06-24 00:52:55 -04:00
Tam Nhu Tran a1a565177e fix(codex): route codex CLI to /backend-api/codex on original CLIProxy backend
The Codex CLI provider config uses wire_api = "responses", so the Codex CLI
appends "/responses" to its base_url. buildCodexCliproxyProviderBaseUrl derived
the base URL from the backend-aware route helper, which returns the bare root for
the original backend. Codex then called http://127.0.0.1:<port>/responses, which
the original CLIProxy binary does not serve, producing a 404 on every request.

The original backend serves the Codex Responses API only at /v1/responses and the
chatgpt_base_url-compatible alias /backend-api/codex/responses. Use that alias for
the original backend; keep the provider-scoped alias for the Plus backend.

Closes #1597
2026-06-24 00:08:02 -04:00
Tam Nhu Tran 7b610f0e82 fix(bar): keep is_default on cache-fallback rows
The collector cached each row before the default profile was resolved, so the
cache-fallback path (getCachedNativeAccountRows) served the default account with
is_default:false -- the UI then lost default ordering/tagging when /summary
served from cache. Write the resolved default flag back onto the cached copy so
the fallback stays consistent with a fresh collection.
2026-06-24 00:03:20 -04:00
Tam Nhu Tran f57eed8c34 feat(bar): make the profile carousel mouse-navigable
The horizontal paging carousel only responded to trackpad swipe; a mouse could
not move it. Add clickable prev/next arrows and make the page dots tappable --
each sets the scrollPosition binding (animated), so mouse users can page through
a provider's profiles. Trackpad swipe is unchanged.
2026-06-23 23:49:11 -04:00
Tam Nhu Tran a0a2dd00fa fix(bar): cache expired profiles and gate codex local fallback to the default
Addresses two review focus areas:

- Reauth polling: a 401/expired profile now caches its dimmed reauth row and
  opens a cooldown, so it is shown parked and re-checked at most every 10 min
  instead of being re-polled (and re-401'd) on every /summary refresh.
- Wrong fallback: the global ~/.codex session-log fallback now applies ONLY to
  the bare default account. A named codex profile with no on-disk auth parks
  instead of borrowing the default's local usage (no misattribution).
2026-06-23 23:47:06 -04:00
Tam Nhu Tran ae5cd9b98d chore(bar): drop low-value PR screenshot asset 2026-06-23 23:38:52 -04:00
Tam Nhu Tran d9bd5b6f86 fix(bar): tighten subscription carousel spacing
The per-provider carousel reserved more height than a card needs, leaving blank
space between each card and its page dots. Size the paged frame to the tallest
card (title + one bar per window + optional stale footnote) instead of a generous
estimate, and trim the subscriptions section spacing from 8 to 6.
2026-06-23 23:36:06 -04:00
Tam Nhu Tran 74ea8ead6c chore(bar): refresh PR screenshot with live ccs + ccsx defaults 2026-06-23 23:16:45 -04:00
Tam Nhu Tran 54ef5406ce fix(bar): show the active default ccs login as the leading Claude account
The multi-profile path enumerated only named ccs auth profiles, dropping the
bare ~/.claude default login that the shipped Bar showed. Re-add it as the
DEFAULT_PROFILE account read through the standard global credential lookup
(file, falling back to the single global 'Claude Code-credentials' Keychain
item Claude Code itself maintains) -- the one pre-existing global read, not a
per-profile Keychain scan. It leads the Claude carousel as 'ccs' + 'default'.
2026-06-23 23:16:36 -04:00
Tam Nhu Tran 4e6fe6ffbb chore(bar): refresh PR screenshot for default-first carousel 2026-06-23 23:10:25 -04:00
Tam Nhu Tran b9f6837913 fix(bar): lead carousel with default account, label it as the base command
Address UX review: the bare login (e.g. ~/.codex) is the default way of running a
surface, not a profile. Rename it from 'personal' to 'default' and present it as
the base command ('ccsx') with a 'default' badge, while named profiles show their
name ('ck') plus the owning surface tag ('ccsx'). Order each provider carousel so
the default account leads, then by tightest quota window.
2026-06-23 23:10:15 -04:00
Tam Nhu Tran 50893319e5 chore(bar): add PR evidence screenshot for multi-profile carousel 2026-06-23 22:56:58 -04:00
Tam Nhu Tran e8adcb8999 feat(bar): per-provider profile carousel with ccs/ccsx surface tags
Group native subscription rows by provider and render each provider as its own
horizontally paged carousel of profile cards (one profile per page, swipe
between a provider's profiles, page dots indicate count). Add a surface tag
chip (ccs/ccsx) and dim parked profiles. Switch the native-vs-pool split to the
is_subscription flag so pool codex accounts are not misclassified. Raise the
deployment target to macOS 14 for the native scroll paging APIs and bump the
Bar version to 1.9.0.
2026-06-23 22:56:48 -04:00
Tam Nhu Tran ed86a089ba feat(bar): enumerate ccs/ccsx subscription profiles with per-profile quota
Replace single-account native quota collection with per-profile enumeration:
read ccs auth (Claude) and ccsx auth (Codex) profile registries plus the bare
~/.codex login, fetch each profile's quota under the existing TTL cache,
per-profile circuit breaker and 2.5s summary deadline. Emit surface, profile
and is_subscription wire fields; account_id becomes "<surface>:<profile>".

Active profiles (valid token) are live-polled and shown undimmed regardless of
default status; profiles without resolvable on-disk credentials are parked
(cache-only, dimmed). Claude per-profile credentials are read from disk only --
no macOS Keychain access -- so a profile without a credentials file renders as
needs-reauth instead of triggering a keychain prompt.
2026-06-23 22:56:38 -04:00
github-actions[bot] 25d67f8ed7 chore(release): 8.6.1-dev.1 2026-06-23 21:42:31 +00:00
github-actions[bot] cf5bba576d chore(sync): merge main into dev after release
# Conflicts:
#	package.json
2026-06-23 21:38:20 +00:00
semantic-release-bot 984b1393e6 chore(release): 8.6.1 [skip ci]
## [8.6.1](https://github.com/kaitranntt/ccs/compare/v8.6.0...v8.6.1) (2026-06-23)

### Bug Fixes

* **bar:** update release target when publishing app ([999f130](https://github.com/kaitranntt/ccs/commit/999f130e4b4ab2aba919527558f300b2e0f83426))
2026-06-23 21:37:34 +00:00
Kai (Tam Nhu) Tran 87174062ae Merge pull request #1594 from kaitranntt/kai/fix/ccs-bar-release-target
fix(bar): update release target when publishing app
2026-06-23 17:33:52 -04:00
Tam Nhu Tran 999f130e4b fix(bar): update release target when publishing app 2026-06-23 17:25:10 -04:00
Kai (Tam Nhu) Tran 59a11f15df Merge pull request #1593 from kaitranntt/kai/chore/ccs-bar-1-8-1
chore(bar): bump CCS Bar to 1.8.1
2026-06-23 17:23:02 -04:00
Tam Nhu Tran db40e5bda0 chore(bar): bump CCS Bar to 1.8.1 2026-06-23 17:18:09 -04:00
github-actions[bot] dafee26abd chore(release): 8.6.0-dev.1 2026-06-23 17:01:46 +00:00
Kai (Tam Nhu) Tran fb9509d9be fix: make CCS Bar launch descriptor use private shim
Use a private safe ccs.js shim for native CCS Bar launch descriptors so symlinked Bun installs do not fall back to an app environment without node on PATH.
2026-06-23 12:57:33 -04:00
semantic-release-bot 4eda1b81da chore(release): 8.6.0 [skip ci]
## [8.6.0](https://github.com/kaitranntt/ccs/compare/v8.5.0...v8.6.0) (2026-06-23)

### Features

* **bar:** one-click in-app updater with update-available notification ([0a2c549](https://github.com/kaitranntt/ccs/commit/0a2c549268380fef29c5b73c0342c7614c3cf9e6)), closes [#1588](https://github.com/kaitranntt/ccs/issues/1588)

### Bug Fixes

* **auth:** de-duplicate error output and validate legacy profiles in default ([1913961](https://github.com/kaitranntt/ccs/commit/191396149ffa14d5bd6a59de91a594c6faabb6eb))
* **auth:** re-export interface-only barrel symbols as types for bun dev runs ([40d7617](https://github.com/kaitranntt/ccs/commit/40d7617cc1cc316671f839c1af26be47fa189cc3))
* **build:** 使用 type-only 导入平台类型 ([66251c5](https://github.com/kaitranntt/ccs/commit/66251c52786704088298098ad1562d5611195c43))
* **cli:** clearer profile/proxy/api errors and rich not-found suggestions ([9258aed](https://github.com/kaitranntt/ccs/commit/9258aed1ff44dbb8d6318c5f0f43fdf077aae08a))
* **cliproxy:** gate binary download log, fix pool message prefix and routing affinity help ([9d5b333](https://github.com/kaitranntt/ccs/commit/9d5b33382b36e5c8ce4cc5f77f7c9e4264eeca86))
* **cliproxy:** honor status --verbose and document --provider/diag in help ([a5feefe](https://github.com/kaitranntt/ccs/commit/a5feefe45a62044bbfede28edaaa175f20795399))
* **cliproxy:** keep --help working for all subcommands ([d8cd2f9](https://github.com/kaitranntt/ccs/commit/d8cd2f94b58ad0d6799e81cac42384b851618c3a))
* **cliproxy:** show global help regardless of flag order before --help ([310f4f6](https://github.com/kaitranntt/ccs/commit/310f4f6e522086090d9634812a94e9abde9d17a3))
* **cliproxy:** surface Control Panel URL and login key in status/start ([cee9822](https://github.com/kaitranntt/ccs/commit/cee982200813f9eda357aad25b6daa6fad80ef0d))
* **cliproxy:** 按 backend 生成 provider 路由 ([99ed809](https://github.com/kaitranntt/ccs/commit/99ed8090b152974dacf1219e94e36246664bd302))
* **cli:** warn on tokens --variant without --api-key; list bar serve in help ([5e4a90b](https://github.com/kaitranntt/ccs/commit/5e4a90b3e5694af0678d9f34b5e9c25c601a9a89))
* **dispatch:** restore copilot and legacy-cursor arg passthrough ([819d439](https://github.com/kaitranntt/ccs/commit/819d43914a7a85e14afde0f117b1f56d61a11cab))
* **dispatch:** route unknown bar/copilot/cursor subcommands and survive corrupt config ([2900743](https://github.com/kaitranntt/ccs/commit/29007437677183d856d0081a16d28461c7f4da4a))
* **doctor:** keep diagnostics running on corrupt config or unreadable auth ([8cfd13b](https://github.com/kaitranntt/ccs/commit/8cfd13ba96956532babbc171c9d9f997401620b0))
* **persist:** accurate symlink guard message on backup read ([e4c91d2](https://github.com/kaitranntt/ccs/commit/e4c91d285330ba73b45f78c159355d8bae996a0a))
* **proxy:** forward stream_options.include_usage to OpenAI-compatible upstreams ([2aaad43](https://github.com/kaitranntt/ccs/commit/2aaad43fd7940f3d51781a665b236dac6add1bf2))

### Documentation

* normalize Tuning Engines provider preset ([b889a75](https://github.com/kaitranntt/ccs/commit/b889a758b83bfc292f2e470043a8b3e801b65169))

### Tests

* **bar:** cover ccs bar install --await-quit relaunch path ([239f83d](https://github.com/kaitranntt/ccs/commit/239f83df9de368c59f0b7e33c2ea49e50b79bd35))
2026-06-23 01:39:23 +00:00
Kai (Tam Nhu) Tran fa9c3428a3 Merge pull request #1590 from kaitranntt/dev
feat: release CCS Bar one-click updater + accumulated dev fixes
2026-06-22 21:35:45 -04:00
github-actions[bot] 5f6566cd35 chore(release): 8.5.0-dev.5 2026-06-23 01:19:59 +00:00
Kai (Tam Nhu) Tran e547f9c248 Merge pull request #1589 from kaitranntt/kai/feat/1588-bar-one-click-updater
feat(bar): one-click in-app updater with update-available notification
2026-06-22 21:15:31 -04:00
Tam Nhu Tran 239f83df9d test(bar): cover ccs bar install --await-quit relaunch path 2026-06-22 21:07:13 -04:00
Tam Nhu Tran 0a2c549268 feat(bar): one-click in-app updater with update-available notification
Adds a lightweight self-update path to the CCS Bar menu-bar app so users are
told when a newer build is available and can update with one click.

- App: BarUpdateChecker fetches the published version.txt and compares it to
  the running bundle version (numeric semver). A throttled background check
  (post-launch, then every 6h) surfaces an "Update available" row in the menu;
  "Update Now" spawns `ccs bar install --launch --await-quit` then quits so the
  installer can swap the locked bundle and relaunch. A Settings toggle gates
  the auto-check (default on). Offline checks degrade silently.
- CLI: `ccs bar install --await-quit` waits for a running CCS Bar to quit
  (300ms poll, 15s cap) before swapping, enabling the one-click relaunch.
- Release: bar-release publishes a machine-readable version.txt asset beside
  the app zip so the check is cheap (no full download just to compare).
- Shares the ccs-binary resolver between DashboardLauncher and the updater.
- Bumps bar VERSION to 1.8.0; adds isNewer assertions to ccs-bar-check.

Closes #1588
2026-06-22 21:00:02 -04:00
Tam Nhu Tran d263fbc2ec chore(lint): regenerate throw-error baseline for shifted provider-preset-catalog throws 2026-06-22 20:59:52 -04:00
Kai (Tam Nhu) Tran 87eb4f2154 Merge pull request #1414 from cerebrixos/tuning-engines-provider
Add Tuning Engines provider
2026-06-22 17:18:57 -04:00
github-actions[bot] c02c4a7d58 chore(release): 8.5.0-dev.4 2026-06-22 20:46:14 +00:00
Kai (Tam Nhu) Tran d1cfb9b26e Merge pull request #1587 from kaitranntt/kai/fix/1585-control-panel-key-discoverable
fix(cliproxy): surface Control Panel URL and login key in status/start
2026-06-22 16:42:12 -04:00
github-actions[bot] 824935adf6 chore(release): 8.5.0-dev.3 2026-06-22 20:38:00 +00:00
Tam Nhu Tran cee9822008 fix(cliproxy): surface Control Panel URL and login key in status/start 2026-06-22 16:34:36 -04:00
Kai (Tam Nhu) Tran 8a0031e514 Merge pull request #1586 from kaitranntt/kai/chore/regen-throw-error-baseline
chore(lint): regenerate throw-error baseline
2026-06-22 16:33:53 -04:00
Tam Nhu Tran 6041c5ee73 chore(lint): regenerate throw-error baseline after request-transformer.ts line shift 2026-06-22 16:27:43 -04:00
Kai (Tam Nhu) Tran 2e702b1d35 Merge pull request #1574 from ReWiG/fix/stream-options-include-usage
fix(proxy): forward stream_options.include_usage to OpenAI-compatible upstreams
2026-06-22 16:16:40 -04:00
github-actions[bot] ca7757b712 chore(release): 8.5.0-dev.2 2026-06-22 20:15:34 +00:00
Kai (Tam Nhu) Tran 05c203aff2 Merge pull request #1575 from walker1211/codex/fix-cliproxy-provider-routes
Fix CLIProxy provider routes for original backend
2026-06-22 16:11:28 -04:00
github-actions[bot] a5149b39e9 chore(release): 8.5.0-dev.1 2026-06-22 17:43:36 +00:00
Kai (Tam Nhu) Tran 5f5d41948c Merge pull request #1583 from kaitranntt/kai/fix/cli-qa-ux-errors
fix(cli): UX and logistical fixes from a full feature-QA pass
2026-06-22 13:39:28 -04:00