Commit Graph
4578 Commits
Author SHA1 Message Date
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
github-actions[bot] b47d502376 chore(release): 8.6.1-dev.11 2026-06-30 16:48:07 +00:00
Kai (Tam Nhu) Tran bb7c3a4037 fix(cliproxy): mask control panel login key (#1617) 2026-06-30 12:40:07 -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
github-actions[bot] 0e097f3301 chore(release): 8.6.1-dev.10 2026-06-30 16:25:42 +00:00
Kai (Tam Nhu) Tran 58a90d3633 fix(ci): include compose parity in CI Gate (#1614) 2026-06-30 12:21:41 -04:00
Kai (Tam Nhu) Tran 23b2c3d6af fix: restrict bar release workflow to main (#1612) 2026-06-30 12:21:33 -04:00
github-actions[bot] 2282e15a99 chore(release): 8.6.1-dev.9 2026-06-29 17:09:02 +00:00
Kai (Tam Nhu) Tran 717192748e Merge pull request #1611 from sgaluza/sergey/ccs-3-glmt-thinking-signature-obekt-vmesto-stroki-lomaet-strim
fix(glmt): emit thinking signature as opaque string
2026-06-29 13:04:54 -04:00
Tam Nhu Tran 8c05bf5d67 Merge remote-tracking branch 'origin/dev' into kai/review/pr-1611-thinking-signature 2026-06-29 12:59:09 -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
github-actions[bot] 173a72f50c chore(release): 8.6.1-dev.8 2026-06-28 20:23:18 +00:00
Kai (Tam Nhu) Tran 9fc24980a1 Merge pull request #1610 from kaitranntt/kai/fix/1608-launch-settings-hardening
fix(cliproxy): harden launch-settings overlay (cleanup-on-throw, coverage, naming)
2026-06-28 16:19:06 -04:00
Tam Nhu Tran 13e23e0fc5 docs(cliproxy): document strip-vs-overlay launch-settings siblings and model-key superset
Cross-reference the two helpers that solve the persisted-settings-env
override (overlay in launch-settings.ts, strip in
openai-compat-launch-settings.ts) and mark shell-executor's
ANTHROPIC_MODEL_ENV_KEYS as the intentional superset distinct from the
4-key list in extended-context-utils. See issue #1609.
2026-06-27 10:55:11 -04:00
Tam Nhu Tran e5db374e98 test(cliproxy): cover launch-settings corrupt-JSON fallback and overlay permissions
Add a test for the env-only overlay fallback when the persisted settings
file is corrupt (the existing 'missing file' test skips JSON.parse), and
a POSIX-gated assertion that the overlay is written 0600 inside a 0700
dir, since it carries an auth token.
2026-06-27 10:55:00 -04:00
Tam Nhu Tran 454e1555a7 fix(cliproxy): clean up launch-settings overlay on synchronous spawn failure
The runtime settings overlay cleanup was registered only on the child
'exit'/'error' events, which run after spawn() returns. A synchronous
spawn() throw (e.g. invalid arg/env) propagated out of launchClaude
before those handlers were wired, orphaning the secret-bearing 0600
overlay file in os.tmpdir(). Wrap the spawn in try/catch and run the
idempotent cleanup before rethrowing.
2026-06-27 10:54:50 -04:00
github-actions[bot] 97e16d1d1c chore(release): 8.6.1-dev.7 2026-06-27 14:27:47 +00:00
Tam Nhu Tran c70a73a139 Merge pull request #1606 from juwain/fix/codex-in-array-system-messages
fix(codex): keep proxy chain authoritative over --settings env
2026-06-27 10:20:25 -04:00
github-actions[bot] a44978c9c8 chore(release): 8.6.1-dev.6 2026-06-27 14:05:27 +00:00
Kai (Tam Nhu) Tran 9dd9bf2978 feat(websearch): add agy provider and deprecate gemini cli fallback (#1607)
Google retired the gemini CLI on 2026-06-18, so the gemini websearch fallback no longer
works. Add agy (Antigravity) as the primary CLI websearch provider end to end: runtime spawn
in websearch-transformer.cjs (agy --dangerously-skip-permissions --print-timeout Ns -p),
detection (agy.ts), config schema and defaults, hook env, status, dashboard persistence, and docs.

The legacy gemini provider stays present but is marked deprecated for enterprise users who
retain access. Image analysis already supported the agy provider (no change). The CLIProxy
gemini quota fetcher (Gemini API OAuth, not the cli binary) is untouched.

Validation: typecheck, lint, and the websearch + config + web-server unit suites pass.
2026-06-27 10:01:25 -04:00
github-actions[bot] 608ff97e35 chore(release): 8.6.1-dev.5 2026-06-26 19:45:20 +00:00
Thibault Jaigu a167f94e1b feat: add Requesty as an OpenAI-compatible provider (#1604)
Add a Requesty provider preset to the provider preset catalog, mirroring the existing OpenRouter preset (base https://router.requesty.ai/v1, default model openai/gpt-4o-mini, OpenAI-compatible).
2026-06-26 15:41:24 -04:00
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
juwain 3847443da3 fix(cliproxy): keep proxy-chain base URL authoritative over --settings env
Claude Code applies the --settings `env` block over the process
environment, so the persisted ANTHROPIC_BASE_URL (CLIProxy-direct)
overrode the ephemeral proxy-chain URL CCS injects via env. Claude then
bypassed the tool-sanitization / codex-reasoning proxies, surfacing as
`400 {"detail":"System messages are not allowed"}` for Codex.

Write a runtime settings overlay (in os.tmpdir(), matching
createOpenAICompatLaunchSettings) whose routing env keys reflect the
resolved launch environment, and pass it to `--settings`. The overlay is
cleaned up on Claude exit; subcommands keep the persisted path untouched.

Reuse the canonical routing/model env key lists from shell-executor
instead of duplicating them.
2026-06-26 17:11:12 +03: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