Commit Graph
106 Commits
Author SHA1 Message Date
Kai (Tam Nhu) TranandGitHub b3ce680b58 Merge pull request #609 from kaitranntt/kai/fix/602-codex-model-suffix
fix(cliproxy): keep canonical codex model ids in settings
2026-02-22 11:46:12 -05:00
Tam Nhu Tran a81176da79 fix(cliproxy): keep canonical codex model ids in settings 2026-02-22 23:40:45 +07:00
Tam Nhu Tran 742b5ed580 fix(cliproxy): normalize codex effort aliases without reasoning proxy 2026-02-22 23:12:23 +07:00
Tam Nhu Tran 34292ca7f8 fix(cliproxy): prevent false remote timeout on reachable proxy 2026-02-22 22:38:50 +07:00
Tam Nhu Tran ca58cb5a08 fix(cliproxy): harden quota guards and review follow-ups 2026-02-22 02:35:07 +07:00
Tam Nhu Tran 8c790f41ff fix(cliproxy): close remaining quota edge-case gaps 2026-02-22 02:12:40 +07:00
Tam Nhu Tran d47620592d Merge remote-tracking branch 'origin/dev' into fix/548-claude-quota-balance
# Conflicts:
#	src/commands/cliproxy/help-subcommand.ts
#	src/commands/cliproxy/index.ts
#	src/commands/cliproxy/quota-subcommand.ts
2026-02-22 01:24:44 +07:00
Tam Nhu Tran 2385d9028a feat(cliproxy): add Claude quota windows and account failover 2026-02-22 01:19:02 +07:00
Kai (Tam Nhu) TranandGitHub 06a4f3f131 Merge pull request #599 from kaitranntt/fix/598-gemini-3-1-pro-preview
fix(cliproxy): support gemini-3.1-pro-preview alias routing
2026-02-22 00:57:30 +07:00
Tam Nhu Tran 63619cb9dc fix(cliproxy): harden antigravity alias generation 2026-02-22 00:35:20 +07:00
Tam Nhu Tran 653f8092ae fix(cliproxy): add gemini 3.1 preview alias compatibility 2026-02-22 00:14:15 +07:00
Kai (Tam Nhu) TranandGitHub 4c7501fe39 Merge pull request #596 from kaitranntt/feat/refactor-hardcode-dx-one-pr
refactor(core): centralize hardcoded paths and command/provider sources
2026-02-21 10:40:51 +07:00
Tam Nhu Tran 343ec959fc fix(core): resolve edge cases and hardcoded drift 2026-02-21 10:32:19 +07:00
Tam Nhu Tran 6429781e8f fix(cliproxy): normalize provider-aware Claude model IDs 2026-02-21 02:14:09 +07:00
Tam Nhu Tran 8201204380 fix(quota): address ghcp review follow-ups 2026-02-20 22:53:49 +07:00
Tam Nhu Tran 954baecfe4 fix(thinking): handle clear no-op and tighten override coverage 2026-02-19 16:26:56 +07:00
Tam Nhu Tran 92e2ec111d fix(thinking): harden codex reasoning controls across cli and dashboard 2026-02-19 14:13:41 +07:00
Tam Nhu Tran c73a26c51c fix(cliproxy): address review feedback on kimi catalog
- Sync kimi-k2.5 description between backend and UI catalogs
  to 'Latest multimodal model (262K context)' per official naming
- Add kimi-k2 pricing entry to avoid fallback to unknown model rate
- Add supportsModelConfig and getProviderCatalog tests for kimi
2026-02-19 10:41:32 +07:00
Tam Nhu Tran dd38df6b8d fix(cliproxy): add kimi-k2 pricing and kimi catalog tests
Address review feedback from PR #585:
- Add missing kimi-k2 pricing entry ($0.60/$2.50, cache $0.15)
  to avoid fallback to unknown model pricing
- Add kimi provider tests to model-catalog.test.js verifying
  catalog structure, default model, and model IDs
2026-02-19 10:36:42 +07:00
Tam Nhu Tran ecc4a3fe58 fix(cliproxy): normalize codex model and provider routing 2026-02-18 21:27:58 +07:00
Tam Nhu Tran a71496cc3d fix(cliproxy): harden provider alias and refresh edge cases
- guard provider alias generation against ambiguous collisions

- add account-scoped Gemini token refresh with strict account checks

- warn and fallback on invalid management remote ports

- align remaining HTTP remote defaults and extend cliproxy tests
2026-02-18 04:18:39 +07:00
Tam Nhu Tran 7e527af777 refactor(cliproxy): resolve remaining review parity and cleanup nits
- export buildProviderMap from provider capabilities and reuse in auth-types

- add provider descriptions to backend capabilities and sync display names

- remove ui CLIPROXY_PORT alias and use CLIPROXY_DEFAULT_PORT directly

- return stable string from getProviderDescription

- extend backend/ui parity tests for display name and description values
2026-02-18 03:35:08 +07:00
Tam Nhu Tran 39593c161b refactor(cliproxy): address review feedback on parity and refresh flow
- make refresh ownership handling exhaustive in provider refresher

- extend backend/ui sync test to provider IDs and device-code providers

- remove DEFAULT_CURSOR_PORT re-export from use-cursor hook

- import cursor default port directly from shared defaults module
2026-02-18 03:24:28 +07:00
Tam Nhu Tran 63f422179e refactor(ui): centralize default ports and add parity test
- add ui default port constants for cliproxy and cursor

- wire preset utils to shared ui default port constants

- add backend/ui sync test to prevent port drift
2026-02-18 03:10:09 +07:00
Tam Nhu Tran 9031e5a085 fix(cliproxy): log unknown codex quota window labels
- detect and de-duplicate unclassified quota window labels

- emit diagnostics in verbose/debug modes for API label drift

- add unit tests for unknown-label extraction behavior
2026-02-17 20:53:03 +07:00
Tam Nhu Tran 0fe195cdc3 fix(test): add kimi to provider tests, remove merge conflict marker
- Add kimi to CLIPROXY_PROVIDER_IDS expected array
- Add kimi to device_code providers expected array
- Remove leftover >>>>>>> origin/dev merge conflict marker in cursor-daemon test
- Fix prettier formatting in image-analysis-check.ts
2026-02-17 17:31:27 +07:00
Tam Nhu Tran 539afea737 style: format source and test files 2026-02-17 17:03:11 +07:00
Tam Nhu Tran 94b03c7f75 refactor(cliproxy): DRY provider lists into single source of truth
- unify CLIPROXY_SUPPORTED_PROVIDERS to import from CLIPROXY_PROVIDER_IDS
- replace 4 inline union types with CLIProxyProvider import
- replace hardcoded provider arrays in migration-manager and proxy-routes
- remove duplicate PROVIDER_DISPLAY_NAMES, use getProviderDisplayName()
- sync test now imports from ui/src/lib/provider-config instead of hardcoded array

Adding a new CLIProxy provider no longer requires updating 14+ hardcoded lists.
2026-02-17 17:02:45 +07:00
Tam Nhu Tran 0431adf306 fix(targets): close all remaining multi-target droid edge cases 2026-02-17 03:22:45 +07:00
Tam Nhu Tran 4fc19c4390 feat(cliproxy): expose codex weekly reset schedule in quota views 2026-02-15 09:48:39 +07:00
Kai (Tam Nhu) TranandGitHub c9b4a9ccba Merge pull request #561 from kaitranntt/fix/552-review-followups
fix(cliproxy): harden Kiro device-code auth flow consistency
2026-02-14 13:38:00 +07:00
Tam Nhu Tran fd46ad022a fix(cliproxy): align kiro auth methods with upstream contracts
- add typed Kiro auth-method model and AWS device-code default

- map CLI flags and callback behavior by selected Kiro method

- harden CLI-only method guards and add contract regression tests

Refs #552

Refs #233
2026-02-14 13:33:28 +07:00
Tam Nhu Tran 945db1d690 feat(cliproxy): clarify codex effort mapping and preset UX 2026-02-14 11:31:18 +07:00
Tam Nhu Tran 826a42d8d6 fix(cliproxy): harden kiro device-code auth flow consistency 2026-02-14 10:55:14 +07:00
Tam Nhu Tran f02e7dc5c6 fix(cliproxy): address lifecycle port and thinking regressions 2026-02-14 10:23:39 +07:00
Tam Nhu Tran d28fb2cdbd test(cliproxy): stabilize thinking override assertion 2026-02-14 09:01:01 +07:00
Tam Nhu Tran f9df3cfa7a fix(cliproxy): unify codex reasoning flags and thinking flow 2026-02-14 07:44:59 +07:00
Tam Nhu Tran 3410c52f7e fix(codex): preserve sonnet high alias on variant model updates 2026-02-14 06:33:46 +07:00
Tam Nhu Tran 6c2083949f fix(cliproxy): mark Kiro as device_code flow for dashboard auth
CLIProxyAPIPlus uses device code flow for Kiro authentication, returning
{method: "device_code", state, status} without an immediate URL. The URL
is provided via polling the /get-auth-status endpoint.

Previously, Kiro was configured as authorization_code flow, causing
dashboard auth to fail with "No authorization URL received from CLIProxyAPI"
because the web-server routes expected synchronous URL response.

Changes:
- provider-capabilities.ts: kiro.oauthFlow = 'device_code', callbackPort = null
- provider-config.ts: Add 'kiro' to DEVICE_CODE_PROVIDERS array
- provider-capabilities.test.ts: Update test expectations

This routes Kiro through /start endpoint which properly handles device code
flow via WebSocket events (deviceCodeReceived, deviceCodeCompleted, etc).

Closes #552
2026-02-13 19:33:33 +07:00
Tam Nhu Tran 7dd4ce5453 test(cliproxy): add regression coverage for update consistency
- verify provider change requires model and rewrites provider-specific env

- verify composite updates preserve custom settings path and fields
2026-02-13 06:19:46 +07:00
Tam Nhu Tran 1a23f912a4 fix(cliproxy): harden composite validation and runtime safeguards 2026-02-13 05:34:30 +07:00
Tam Nhu Tran 2816c6652d chore(merge): resolve conflicts with origin/dev 2026-02-12 16:25:25 +07:00
Tam Nhu Tran 0a8adb22fc fix(cliproxy): harden composite variant routing and validation 2026-02-12 15:18:33 +07:00
Tam Nhu Tran 924e3686c8 refactor(cliproxy): centralize provider capability registry 2026-02-12 12:59:17 +07:00
Tam Nhu Tran c35de7ec9a test(cliproxy): add thinking suffix test and document exit 0 behavior
- Add test case for comma-separated thinking params (32768,extended)
- Add clarifying comment to isProviderError() about exit 0 handling
2026-02-12 11:04:37 +07:00
Tam Nhu Tran e0ae5f20ff test(cliproxy): add composite variant v2 unit tests
- Thinking config: 24 tests for applyThinkingSuffix, detectTierFromModel,
  getThinkingValueForTier, and applyThinkingConfig with compositeTierThinking
- Fallback: 42 tests for isProviderError, detectFailedTier, applyFallback,
  and PROVIDER_ERROR_PATTERNS
- Variant service: 9 tests for updateCompositeVariant,
  saveCompositeVariantUnified, and listVariantsFromConfig with composite types
2026-02-12 07:40:40 +07:00
Kai (Tam Nhu) TranGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
051805074e feat: account safety, quota monitoring, and stability fixes (#530)
* fix(cliproxy): migrate deprecated gemini-claude-* model names to upstream claude-* names (#515)

* fix(cliproxy): migrate deprecated gemini-claude-* model names to upstream claude-* names

CLIProxyAPI registry no longer recognizes the gemini-claude-* prefix convention.
Model names in catalog, base config, and user settings are migrated to upstream
claude-* names. Auto-migration in env-builder rewrites existing user settings on
load and persists the change.

Closes #513

* fix: address code review feedback — sync UI layer and add migration tests

- Sync UI isNativeGeminiModel() with backend (remove gemini-claude- exclusion)
- Update UI model catalog agy entries from gemini-claude-* to claude-*
- Update CI/CD workflow and code-reviewer default model names
- Add unit tests for migrateDeprecatedModelNames() logic

* fix(hooks): isolate image type check before error-prone processing (#514)

* fix(hooks): isolate image type check before error-prone processing

Restructure processHook() into two phases so non-image Read calls
never see hook error messages. Phase 1 defensively checks tool name
and file extension, exiting 0 silently on any failure. Phase 2 only
runs for confirmed image/PDF files where errors are relevant.

Closes #511

* fix(hooks): sync image analyzer hook file on every profile launch

Add installImageAnalyzerHook() call to cliproxy executor, matching
the existing installWebSearchHook() pattern. This ensures the .cjs
file in ~/.ccs/hooks/ gets refreshed from the npm package on every
launch, so users receive hook updates after npm update.

* chore(release): 7.41.0-dev.1 [skip ci]

* fix(cliproxy): add fork:true for Claude model aliases in config generator (#523)

Config generator now outputs fork:true for Claude model alias entries,
ensuring both upstream (claude-*) and aliased (gemini-claude-*) model
names appear in /v1/models listings. Also preserves fork flag when
parsing user-added aliases during config regeneration.

Bumps config version to v7 to trigger regeneration on next ccs doctor.

Closes #522

* chore(release): 7.41.0-dev.2 [skip ci]

* feat(cliproxy): add account safety guards to prevent Google account bans (#516)

* feat(cliproxy): add account safety guards to prevent Google account bans

Implements cross-provider isolation to prevent Google from flagging
concurrent OAuth usage across different client IDs (ref: #509, #512).

Three pillars:
1. Auto-pause enforcement at session launch — conflicting accounts in
   other Google OAuth providers are paused so CLIProxyAPI can't use them,
   restored on session exit with crash recovery via auto-paused.json
2. Ban/disable detection — error responses matching Google ban patterns
   auto-pause the affected account to prevent further damage
3. Cross-provider conflict warnings during OAuth registration

Key design decisions:
- PID-based session tracking for crash recovery (dead PID = restore)
- Timestamp comparison prevents restoring ban-paused accounts on exit
- Schema validation on auto-paused.json prevents corrupted state
- Falls back to warn-only when another session is managing isolation

* fix(cliproxy): address code review feedback (attempt 1/5)

- Re-read auto-paused.json before write in enforceProviderIsolation to
  reduce concurrent write race window
- Use actual email from registry for display instead of raw accountId
- Export maskEmail for testability
- Add 27 unit tests covering ban detection, email masking,
  cross-provider duplicate detection, enforcement lifecycle,
  crash recovery, and timestamp-guarded restore

* fix(cliproxy): address remaining review feedback (attempt 2/5)

- Add handleBanDetection test verifying account pause on ban error
- Add warnCrossProviderDuplicates tests (true/false/non-Google)
- Document PID reuse limitation in isPidAlive JSDoc comment

* chore(release): 7.41.0-dev.3 [skip ci]

* feat(cliproxy): runtime quota monitoring during active sessions (#529)

* feat(cliproxy): add runtime quota monitoring during active sessions

Adds adaptive background quota polling to detect and respond to quota
exhaustion during active CLIProxy sessions. Prevents rate-limit-driven
account bans by auto-cooling exhausted accounts and switching defaults.

- Adaptive polling: 300s normal, 60s at 20% threshold, stops at 0%
- Stderr warnings at 20%, boxed exhaustion alerts at 0%
- Cooldown + default switch on exhaustion (existing patterns)
- Configurable via quota_management.runtime_monitor in config.yaml
- Timer.unref() prevents blocking process exit
- monitorStopped guard for in-flight poll safety

Closes #524

* fix: address code review feedback (attempt 1/5)

- M1: Round quotaPercent display with Math.round() to avoid ugly floats
- M2: Rename exhaust_threshold -> exhaustion_threshold for consistency
  with existing auto.exhaustion_threshold config field
- M3: Replace async not.toThrow() with direct await assertion pattern

* fix: address code review feedback (attempt 2/5)

- Remove .claude/agent-memory/ from tracking and add to .gitignore
- Unify cooldown_minutes default to 5 (was 10 in runtime_monitor, 5 in auto)
- Add threshold validation in startQuotaMonitor (warn > exhaustion)
- Document intentional post-switch monitoring gap in code comment

* chore(release): 7.41.0-dev.4 [skip ci]

* fix(cliproxy): mask email in ban detection and fix JSDoc default

- Use maskEmail() in handleBanDetection output for consistency
- Fix cooldown_minutes JSDoc: default is 5, not 10

* chore(release): 7.41.0-dev.5 [skip ci]

* fix(cliproxy): address all review feedback (Low + informational)

- Add sync constraint comment on process.exit handler (executor)
- Add TOCTOU race acceptability comment (account-safety)
- Mask email in handleQuotaExhaustion reason string
- Use realistic exhaustion_threshold (5) in test configs

* chore(release): 7.41.0-dev.6 [skip ci]

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-12 00:48:29 +07:00
Tam Nhu Tran 0483444864 fix: separate type-only exports and migrate test imports from dist/ to src/
Spinner interface re-exported as value in checks/index.ts caused Bun
runtime crash. Test files importing from dist/ failed without build step.
2026-02-11 14:05:33 +07:00
kaitranntt 917f0bbef7 test(cliproxy): add edge case coverage for Gemini schema sanitizer
Add tests for: exclusiveMinimum/exclusiveMaximum/multipleOf stripping,
uniqueItems/contains/additionalItems stripping, writeOnly/definitions
stripping, example with array values, default with complex nested
objects, empty properties/anyOf edge cases.

Fix proxy log message to say "Gemini-unsupported" instead of
"non-standard".
2026-02-07 06:25:29 -05:00
kaitranntt 505d6d0f11 fix(cliproxy): strip Gemini-unsupported schema fields including "examples"
Replace permissive JSON Schema Draft-07 whitelist with strict
Gemini-compatible field set (22 fields). The "examples" field
in Claude Code tool schemas caused 400 errors from Gemini API.

Also strips other unsupported fields: $ref, $defs, oneOf, allOf,
additionalProperties, const, if/then/else, etc.

Safe change — sanitizer only runs for CLIProxy profiles (Gemini,
Codex, Antigravity), never for direct Anthropic API requests.

Closes #155
2026-02-07 06:17:26 -05:00