Commit Graph
4537 Commits
Author SHA1 Message Date
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
Tam Nhu Tran 819d43914a fix(dispatch): restore copilot and legacy-cursor arg passthrough
Routing every non-flag token after 'copilot'/'legacy-cursor' to the subcommand
handler turned the legacy profile/prompt passthrough into an 'Unknown subcommand'
error. Route only known subcommands (matching prior behavior); other args pass
through to the copilot/cursor bridge flow. Bar keeps its unknown-subcommand exit
code (it has no passthrough).
2026-06-22 13:10:59 -04:00
Tam Nhu Tran d8cd2f94b5 fix(cliproxy): keep --help working for all subcommands
The earlier help-gating overcorrected: scoping global help to 'no real
subcommand' meant 'cliproxy status --help' (and list/quota) ran the command and
ignored --help. Restore global help on --help/-h anywhere (order-insensitive),
carving out only 'routing affinity --help', which renders its own help.
2026-06-22 13:10:59 -04:00
Tam Nhu Tran 310f4f6e52 fix(cliproxy): show global help regardless of flag order before --help
Top-level cliproxy help was order-sensitive: 'cliproxy --verbose --help' fell
through to dispatch instead of showing help. Fire global help whenever there is
no real subcommand (no args or a leading flag) and --help/-h appears anywhere;
real subcommands still handle their own --help.
2026-06-22 12:18:50 -04:00
Tam Nhu Tran 40d7617cc1 fix(auth): re-export interface-only barrel symbols as types for bun dev runs
The auth commands barrel re-exported 4 interface-only symbols (AuthCommandArgs,
ProfileOutput, ListOutput, CommandContext) via a value 'export {}', which bun's
per-file transpile cannot resolve at runtime (the tsc dist elides them, so users
were unaffected). Split them into 'export type {}' so 'bun run dev' / source runs
work.
2026-06-22 12:06:58 -04:00
Tam Nhu Tran 5e4a90b3e5 fix(cli): warn on tokens --variant without --api-key; list bar serve in help
'ccs tokens --variant <x>' without --api-key was a silent no-op; now it explains
that --variant only applies with --api-key. Add the existing 'serve' subcommand
to the bar help Commands list.
2026-06-22 12:06:58 -04:00
Tam Nhu Tran a5feefe45a fix(cliproxy): honor status --verbose and document --provider/diag in help
handleProxyStatus now respects --verbose (was parsed but ignored). Document the
existing --provider option on default/pause/resume and the 'diag' alias for
doctor in the cliproxy help text.
2026-06-22 12:06:58 -04:00
Tam Nhu Tran 016c47ec9a chore(lint): refresh throw-error baseline for shifted and converted throws 2026-06-22 12:06:58 -04:00
Tam Nhu Tran e4c91d2853 fix(persist): accurate symlink guard message on backup read
The guard fires on the backup READ step; use a typed ConfigError whose message
matches the actual step (refusing to read), not a misleading 'refusing to write'.
2026-06-22 12:06:58 -04:00
Tam Nhu Tran 9d5b33382b fix(cliproxy): gate binary download log, fix pool message prefix and routing affinity help
Only log 'Binary not found, downloading...' when a download will actually happen
(after the allowInstall guard). Stop double-prefixing pool enable/disable
messages that already carry [OK]/[!]. Route 'cliproxy routing affinity --help'
to affinity help instead of the generic cliproxy help.
2026-06-22 12:06:58 -04:00
Tam Nhu Tran 8cfd13ba96 fix(doctor): keep diagnostics running on corrupt config or unreadable auth
loadUnifiedConfig() printed the YAML error on every call (3-4x per run); print it
once per path per process. Run each doctor check group defensively so a thrown
check (corrupt config, EACCES auth dir) records an error and the SUMMARY/ERRORS
sections with recovery hints still render instead of crashing mid-run. Trim
embedded parser snippets to one line so they no longer leak into the summary
table or repeat across checks.
2026-06-22 12:06:58 -04:00
Tam Nhu Tran 2900743767 fix(dispatch): route unknown bar/copilot/cursor subcommands and survive corrupt config
Pre-dispatch only routed known subcommand tokens, so unknown bar/copilot/cursor
subcommands never reached their handlers (no error, no non-zero exit). Route them
through. Also wrap autoMigrate() so a corrupt config.yaml no longer crashes
startup, and print only the first line of a best-effort recovery failure.
2026-06-22 12:06:58 -04:00
Tam Nhu Tran 9258aed1ff fix(cli): clearer profile/proxy/api errors and rich not-found suggestions
Move resolveProfileAndTarget() inside the try block in ccs.ts so a missing
profile shows suggestions/available-profiles instead of a generic error. Use a
typed ProfileError for proxy start on an unknown profile (drops the irrelevant
install hint). api create: honor --yes for the OpenRouter model browser, show
ccs-codex/ccsx aliases for --target codex, and allow ANTHROPIC_EXTRA_MODELS on
import.
2026-06-22 12:06:58 -04:00