kaitranntt
eeb0dde8ca
refactor(ui): extract shared QuotaTooltipContent component
...
Address PR review feedback:
- Create QuotaTooltipContent component in shared/ for DRY principle
- Use component in account-item.tsx and account-card.tsx
- Use QUOTA_SUPPORTED_PROVIDERS constant in model-config-tab.tsx
- Reduces ~200 lines of duplicated tooltip rendering code
2026-01-29 22:33:07 -05:00
kaitranntt
32ef23314a
refactor(ui): address code review feedback
...
- Consolidate UnifiedQuotaResult type: import from utils.ts, re-export
- Remove unused useCodexQuota/useGeminiQuota hooks (useAccountQuota handles all)
- Remove unnecessary optional chaining where type guards guarantee property
2026-01-29 22:23:53 -05:00
kaitranntt
8ce749581e
refactor(ui): extract duplicated quota helpers to shared utils
...
Address PR review feedback:
- Add type guards (isAgyQuotaResult, isCodexQuotaResult, isGeminiQuotaResult)
- Add unified getProviderMinQuota() and getProviderResetTime() helpers
- Export QUOTA_SUPPORTED_PROVIDERS constant from hooks
- Update account-item.tsx and account-card.tsx to use shared functions
- Eliminate code duplication across provider-specific quota handling
Closes #400 review feedback
2026-01-29 22:17:57 -05:00
kaitranntt
387c010267
feat(ui): display Codex/Gemini quota in dashboard
...
- update account-card.tsx to show quota for all CLIProxy providers
- update account-item.tsx with provider-specific tooltip rendering
- enable showQuota for codex and gemini in model-config-tab.tsx
2026-01-29 21:51:39 -05:00
kaitranntt
19a57c395c
feat(ui): add Codex/Gemini quota API client and hooks
...
- add CodexQuotaResult and GeminiCliQuotaResult types
- add api.quota.getCodex and api.quota.getGemini API functions
- add useCodexQuota and useGeminiQuota React hooks
- add getMinCodexQuota, getMinGeminiQuota, getCodexResetTime, getGeminiResetTime utils
2026-01-29 21:50:43 -05:00
kaitranntt
2f5a50b801
feat(cliproxy): add Codex/Gemini quota API routes
...
- add dedicated /quota/codex/:accountId and /quota/gemini/:accountId endpoints
- reorder routes to place specific before generic for correct Express matching
- fix Gemini auth file detection to support new naming format
- handle nested token structure in Gemini auth files
2026-01-29 21:50:02 -05:00
semantic-release-bot
1d5c72a860
chore(release): 7.32.0 [skip ci]
...
## [7.32.0](https://github.com/kaitranntt/ccs/compare/v7.31.1...v7.32.0 ) (2026-01-30)
### Features
* **cliproxy:** add ToolSanitizationProxy for Gemini 64-char limit ([6363350 ](https://github.com/kaitranntt/ccs/commit/63633507d2eeeff7c76b73481894dd9f1148ba93 )), closes [#219 ](https://github.com/kaitranntt/ccs/issues/219 )
### Bug Fixes
* **cliproxy:** address PR [#399 ](https://github.com/kaitranntt/ccs/issues/399 ) review suggestions ([98b7f6f ](https://github.com/kaitranntt/ccs/commit/98b7f6f4545daca18b3c76619bd7c6a6496cc1ed ))
* **cliproxy:** route proxy logs to file instead of stderr ([4d292c6 ](https://github.com/kaitranntt/ccs/commit/4d292c62e46497411b8e151fe96e3e335a5be1c3 ))
### Code Refactoring
* **cliproxy:** address PR review suggestions ([d86c531 ](https://github.com/kaitranntt/ccs/commit/d86c53146ad7302600ad803faf0649391fa8f4e1 ))
### Tests
* **cliproxy:** add integration tests for ToolSanitizationProxy ([bf19002 ](https://github.com/kaitranntt/ccs/commit/bf190024f6d3b322ff945655fe65af665181a779 ))
2026-01-30 00:41:01 +00:00
Kai (Tam Nhu) Tran and GitHub
230a2b4641
Merge pull request #399 from kaitranntt/dev
...
feat(release): tool sanitization proxy for Gemini 64-char limit
2026-01-29 19:39:51 -05:00
github-actions[bot]
050f989b2e
chore(release): 7.31.1-dev.2 [skip ci]
2026-01-29 22:50:59 +00:00
kaitranntt
98b7f6f454
fix(cliproxy): address PR #399 review suggestions
...
- Move require('os') to top-level import
- Add debug logging for log dir creation failures
- Add hash collision detection and warning in ToolNameMapper
- Clarify proxy chain order comments in cliproxy-executor
2026-01-29 17:49:32 -05:00
github-actions[bot]
149dfc3d6d
chore(release): 7.31.1-dev.1 [skip ci]
2026-01-29 22:38:24 +00:00
Kai (Tam Nhu) Tran and GitHub
daf03d1d74
Merge pull request #398 from kaitranntt/kai/feat/tool-sanitization-proxy
...
feat(cliproxy): add ToolSanitizationProxy for Gemini 64-char limit
2026-01-29 17:37:20 -05:00
kaitranntt
d86c53146a
refactor(cliproxy): address PR review suggestions
...
- Add hash collision risk note to sanitizer docs (6-char MD5 = ~16M combos)
- Fix VALID_CHARS_REGEX comment to include '/' character
- Use getCcsDir() instead of os.homedir() for log path (CLAUDE.md compliance)
- Add JSDoc for isRecord type guard helper
2026-01-29 17:28:45 -05:00
kaitranntt
4d292c62e4
fix(cliproxy): route proxy logs to file instead of stderr
...
- Add file-based logging to ~/.ccs/logs/tool-sanitization-proxy.log
- Console output only when CCS_DEBUG=1 (prevents polluting Claude CLI output)
- Fallback to temp directory if logs dir creation fails
- Respects CCS_HOME for test isolation
2026-01-29 17:21:06 -05:00
kaitranntt
bf190024f6
test(cliproxy): add integration tests for ToolSanitizationProxy
...
- Test proxy lifecycle (start/stop)
- Test request sanitization (duplicates, truncation, passthrough)
- Test response restoration (buffered and SSE streaming)
- Test error handling (invalid JSON, upstream errors)
- Test multiple tools with mapping tracking
- Mock upstream server for isolated testing
2026-01-29 16:23:56 -05:00
kaitranntt
63633507d2
feat(cliproxy): add ToolSanitizationProxy for Gemini 64-char limit
...
Fixes #219 - MCP tool names exceeding Gemini's 64-character limit
now get sanitized automatically.
- Add tool-name-sanitizer: dedupe segments + smart truncate with hash
- Add tool-name-mapper: bidirectional mapping for response restoration
- Add tool-sanitization-proxy: HTTP proxy layer for all CLIProxy providers
- Chain: Claude CLI → ToolSanitizationProxy → [CodexReasoningProxy] → CLIProxy
- Add unit tests for sanitizer and mapper modules
2026-01-29 16:04:17 -05:00
semantic-release-bot
7f7dcb21f9
chore(release): 7.31.1 [skip ci]
...
## [7.31.1](https://github.com/kaitranntt/ccs/compare/v7.31.0...v7.31.1 ) (2026-01-29)
### Bug Fixes
* **cliproxy:** read Gemini tokens from CLIProxy auth directory ([9d96535 ](https://github.com/kaitranntt/ccs/commit/9d96535d28bf7070e8eccde6af16ef79262a65cf )), closes [#368 ](https://github.com/kaitranntt/ccs/issues/368 )
### Code Refactoring
* **cliproxy:** address code review feedback for token handling ([cddf931 ](https://github.com/kaitranntt/ccs/commit/cddf931fe6fb8b4c2b6b9edeb9d4e41a25e29535 )), closes [#396 ](https://github.com/kaitranntt/ccs/issues/396 )
2026-01-29 20:21:01 +00:00
Kai (Tam Nhu) Tran and GitHub
152b215151
Merge pull request #397 from kaitranntt/dev
...
fix(cliproxy): read Gemini tokens from CLIProxy auth directory
2026-01-29 15:19:52 -05:00
github-actions[bot]
ad1a18d31f
chore(release): 7.31.0-dev.1 [skip ci]
2026-01-29 20:16:35 +00:00
Kai (Tam Nhu) Tran and GitHub
c046d19687
Merge pull request #396 from kaitranntt/kai/fix/gemini-auth-token-mismatch
...
fix(cliproxy): read Gemini tokens from CLIProxy auth directory
2026-01-29 15:15:34 -05:00
kaitranntt
cddf931fe6
refactor(cliproxy): address code review feedback for token handling
...
- Remove module-level mutable state (lastTokenSourcePath)
- Add GeminiCredsWithSource interface for explicit source path passing
- Add isValidCliproxyToken() for proper type validation
- Use explicit path comparison instead of .includes('.gemini') heuristic
- Add descriptive comment for directory scan error handling
Addresses review feedback from PR #396
2026-01-29 15:10:20 -05:00
semantic-release-bot
2084ee3e85
chore(release): 7.31.0 [skip ci]
...
## [7.31.0](https://github.com/kaitranntt/ccs/compare/v7.30.1...v7.31.0 ) (2026-01-29)
### Features
* **cliproxy:** add multi-provider quota display for Codex and Gemini CLI ([30e611f ](https://github.com/kaitranntt/ccs/commit/30e611fc28e10f89d6aabb2cdbf9450d6ce748a1 ))
### Bug Fixes
* **cliproxy:** resolve regex escape bug and complete DRY refactor ([38ba6a9 ](https://github.com/kaitranntt/ccs/commit/38ba6a9fea564d3c48a083e6594c2c6e5cc82b20 )), closes [#395 ](https://github.com/kaitranntt/ccs/issues/395 )
* **config:** add missing base-claude.settings.json ([643232f ](https://github.com/kaitranntt/ccs/commit/643232f58e4a1954553f761cbad9863dab3133fa ))
### Code Refactoring
* **cliproxy:** extract shared auth utils and remove unused parameter ([e31d00f ](https://github.com/kaitranntt/ccs/commit/e31d00f0b99f51bd8768d351b2b38604d221935b )), closes [#395 ](https://github.com/kaitranntt/ccs/issues/395 )
### Tests
* **cliproxy:** add unit tests for quota fetchers and auth utilities ([ad8327d ](https://github.com/kaitranntt/ccs/commit/ad8327d17e8182d71f0c784e2ef6db30cb3877bb )), closes [#395 ](https://github.com/kaitranntt/ccs/issues/395 )
2026-01-29 20:06:31 +00:00
Kai (Tam Nhu) Tran and GitHub
2c51a55db0
Merge pull request #395 from kaitranntt/kai/feat/codex-gemini-quota-display
...
feat(cliproxy): add multi-provider quota display for Codex and Gemini CLI
2026-01-29 15:05:24 -05:00
kaitranntt
ad8327d17e
test(cliproxy): add unit tests for quota fetchers and auth utilities
...
Add comprehensive unit tests for:
- buildCodexQuotaWindows(): window parsing, clamping, reset time calculation
- buildGeminiCliBuckets(): bucket grouping, model series, token types
- resolveGeminiCliProjectId(): project ID extraction from account field
- sanitizeEmail(): email to filename conversion
- isTokenExpired(): token expiry validation
Also removes unused 'preferred' field from GEMINI_CLI_GROUPS (YAGNI)
39 new tests covering edge cases:
- Percentage clamping (0-100, 0-1)
- Missing/null fields
- camelCase/snake_case API responses
- Empty inputs
- Invalid date strings
Addresses code review feedback on PR #395
2026-01-29 15:01:26 -05:00
kaitranntt
9d96535d28
fix(cliproxy): read Gemini tokens from CLIProxy auth directory
...
Fixes token mismatch where Gemini auth succeeds but token immediately
expires. The issue was that isAuthenticated() checked CLIProxy auth dir
(~/.ccs/cliproxy/auth/) but ensureGeminiTokenValid() only read from
~/.gemini/oauth_creds.json.
Changes:
- Add readCliproxyGeminiCreds() to read from CLIProxy auth dir first
- Add mapCliproxyToGeminiCreds() to convert CLIProxyAPI format to internal
- Track token source path for correct write-back on refresh
- Add writeCliproxyGeminiCreds() to preserve email/project_id fields
- Fall back to ~/.gemini/oauth_creds.json for backward compatibility
Closes #368
2026-01-29 14:57:05 -05:00
kaitranntt
38ba6a9fea
fix(cliproxy): resolve regex escape bug and complete DRY refactor
...
- Fix regex escape in auth-utils.ts: `\\.` not `\\\\.` (dot matcher)
- Refactor quota-fetcher.ts to import from auth-utils.ts (DRY)
- Remove unused UnifiedQuotaResult type (YAGNI)
- Add maintenance comment to Gemini model groups
Addresses code review feedback on PR #395
2026-01-29 14:55:07 -05:00
kaitranntt
e31d00f0b9
refactor(cliproxy): extract shared auth utils and remove unused parameter
...
- Create auth-utils.ts with sanitizeEmail() and isTokenExpired()
- Remove duplicated functions from quota-fetcher-codex.ts
- Remove duplicated functions from quota-fetcher-gemini-cli.ts
- Remove unused _verbose parameter from displayAntigravityQuotaSection()
- Add descriptive comment to USER_AGENT constant
Addresses code review feedback on PR #395
2026-01-29 14:38:02 -05:00
kaitranntt
30e611fc28
feat(cliproxy): add multi-provider quota display for Codex and Gemini CLI
...
Add quota fetching for Codex (ChatGPT) and Gemini CLI providers with
unified CLI display. Extends `ccs cliproxy quota` with --provider flag.
New files:
- quota-types.ts: Shared type definitions for multi-provider quota
- quota-fetcher-codex.ts: Fetches from ChatGPT backend API
- quota-fetcher-gemini-cli.ts: Fetches from Google Cloud Code API
Features:
- Parallel quota fetching from all providers
- --provider flag to filter (agy|codex|gemini|all)
- Rate limit windows for Codex (primary/secondary/code review)
- Bucket grouping for Gemini CLI (Flash/Pro series)
- Reset time display with proper formatting
Edge case handling:
- 429 rate limit specific error messages
- Clamp percentages/fractions to valid ranges
- Null/negative reset time guards
- Empty --provider= value validation
2026-01-29 14:27:55 -05:00
github-actions[bot]
06154165f5
chore(release): 7.30.1-dev.1 [skip ci]
2026-01-29 18:35:28 +00:00
kaitranntt
643232f58e
fix(config): add missing base-claude.settings.json
...
The claude provider was fully registered in the codebase (types,
OAuth config, auth port 54545, model catalog, CLI routes) but the
required base config file was missing, causing "Base config not
found for provider 'claude'" error when running `ccs claude --add`.
2026-01-29 13:33:37 -05:00
semantic-release-bot
2b1d000759
chore(release): 7.30.1 [skip ci]
...
## [7.30.1](https://github.com/kaitranntt/ccs/compare/v7.30.0...v7.30.1 ) (2026-01-29)
### Bug Fixes
* **cliproxy:** update Claude model catalog to latest CLIProxy models ([d238a5d ](https://github.com/kaitranntt/ccs/commit/d238a5d43aa50e0629609349c6eb053170f2b586 )), closes [#392 ](https://github.com/kaitranntt/ccs/issues/392 )
* **copilot:** update fallback model ID to match catalog default ([2501843 ](https://github.com/kaitranntt/ccs/commit/25018431a50fae1a45121b28a0d16fa1731deace ))
2026-01-29 06:34:31 +00:00
Kai (Tam Nhu) Tran and GitHub
22d25c7715
Merge pull request #394 from kaitranntt/dev
...
fix: update Claude model catalog and copilot fallback
2026-01-29 01:33:23 -05:00
github-actions[bot]
91a990f024
chore(release): 7.30.0-dev.1 [skip ci]
2026-01-29 05:49:58 +00:00
Kai (Tam Nhu) Tran and GitHub
d912f89cb9
Merge pull request #393 from kaitranntt/fix/outdated-claude-model-catalog
...
fix(cliproxy): update Claude model catalog to latest CLIProxy models
2026-01-29 00:48:55 -05:00
kaitranntt
25018431a5
fix(copilot): update fallback model ID to match catalog default
...
Address code review feedback: update outdated fallback model ID
in copilot config form to use claude-sonnet-4-5-20250929
2026-01-29 00:45:49 -05:00
kaitranntt
d238a5d43a
fix(cliproxy): update Claude model catalog to latest CLIProxy models
...
- Updated claude-opus-4-5-20250220 → claude-opus-4-5-20251101
- Updated claude-sonnet-4-5-20250514 → claude-sonnet-4-5-20250929
- Updated claude-haiku-4-5-20250514 → claude-haiku-4-5-20251001
- Updated default model to claude-sonnet-4-5-20250929
- Updated all preset mappings to use new model IDs
Closes #392
2026-01-29 00:37:31 -05:00
semantic-release-bot
a46ac1115e
chore(release): 7.30.0 [skip ci]
...
## [7.30.0](https://github.com/kaitranntt/ccs/compare/v7.29.0...v7.30.0 ) (2026-01-28)
### Features
* **cliproxy:** add auto_sync config option ([fc23afd ](https://github.com/kaitranntt/ccs/commit/fc23afdfc78a955fc0a1ce7f55d2e2bd098fc6c4 ))
* **cliproxy:** add granular account tier prioritization (ultra/pro/free) ([aeb9abc ](https://github.com/kaitranntt/ccs/commit/aeb9abc998a5114007e34c478cf5c79213ea1fe7 )), closes [#387 ](https://github.com/kaitranntt/ccs/issues/387 )
* **cliproxy:** add local config sync module ([9de2682 ](https://github.com/kaitranntt/ccs/commit/9de26820629f5e95a487028a64c1a8a782674448 ))
* **cliproxy:** add Management API client for CLIProxy ([4cc89ea ](https://github.com/kaitranntt/ccs/commit/4cc89eaf8745d67548f032408cd284fd23c3bd5e ))
* **cliproxy:** add sync and alias CLI commands ([cb6c212 ](https://github.com/kaitranntt/ccs/commit/cb6c21216dcaf0536530f110af75dc20ee7c7738 ))
* **cliproxy:** add sync API routes ([56500fe ](https://github.com/kaitranntt/ccs/commit/56500fee98042fb333bd723818d2a3881cd28481 ))
* **cliproxy:** auto-sync on profile create ([b2ba402 ](https://github.com/kaitranntt/ccs/commit/b2ba402d0fb4204457ae1f09016cb21bd9b5a6e2 ))
* **cliproxy:** enable auto_sync by default ([28b0e89 ](https://github.com/kaitranntt/ccs/commit/28b0e89b34787f42d63e2dd1a036b75a761bcf6b ))
* **ui:** add CLIProxy sync components ([75a4e68 ](https://github.com/kaitranntt/ccs/commit/75a4e68f95ba5f8c7c8b647b8d5cf0d013dc425a ))
* **ui:** add granular account tier types (pro/ultra/free) ([890fd14 ](https://github.com/kaitranntt/ccs/commit/890fd140f2ede728f212ed0bfc77bc8609b3a09b ))
* **ui:** add tier badges to account cards ([31a91f6 ](https://github.com/kaitranntt/ccs/commit/31a91f609fad4af17f0e4bd3b0f0dbabe8bf2b77 ))
* **ui:** add toast feedback for sync actions ([f972a4e ](https://github.com/kaitranntt/ccs/commit/f972a4ee80ebdec7b0a645d29eba4d65ca847caf ))
* **ui:** allow custom model names in Quick Setup wizard ([ab9bbed ](https://github.com/kaitranntt/ccs/commit/ab9bbedfa92555d0502b064145c0cfd5bf24065c ))
* **ui:** mount SyncStatusCard to CLIProxy page ([afa3bda ](https://github.com/kaitranntt/ccs/commit/afa3bdafceb1829e0fef2994bcb51c731797657f ))
### Bug Fixes
* **cliproxy:** address edge cases in sync module ([9924b2f ](https://github.com/kaitranntt/ccs/commit/9924b2fb25650803c34d26eae151c53a007fa0bb ))
* **cliproxy:** address PR review feedback ([4967693 ](https://github.com/kaitranntt/ccs/commit/496769383979fb0b08bb03a57acd4ad2c10221c6 ))
* **cliproxy:** address sync review feedback ([e80d2d2 ](https://github.com/kaitranntt/ccs/commit/e80d2d2d05c00522cdaac03e6f55ecf10a938fc7 ))
* **cliproxy:** correct sync terminology and add unit tests ([c3f85bc ](https://github.com/kaitranntt/ccs/commit/c3f85bc4a8c1351b09d463bd1687e17fa8a989d5 ))
* **cliproxy:** harden sync against edge cases ([bbad73b ](https://github.com/kaitranntt/ccs/commit/bbad73b55450d04902b90a4fc4c006a8c7a3c5c1 ))
* **cliproxy:** improve sync robustness and consistency ([4124780 ](https://github.com/kaitranntt/ccs/commit/4124780ce07201f166971216fd48e5b072ec9dd5 ))
* **cliproxy:** preserve config comments during sync ([68a63a7 ](https://github.com/kaitranntt/ccs/commit/68a63a776812c7026a38f7dc7d5bb6996bc30190 ))
* **cliproxy:** use paidTier for account tier detection instead of allowedTiers ([de23029 ](https://github.com/kaitranntt/ccs/commit/de23029b572c9e1db1c8a004ec214ce5a465570a ))
* **ui:** add scroll boundary for account list in Quick Setup ([85aa747 ](https://github.com/kaitranntt/ccs/commit/85aa747aebccbde21111730f6eb63e047ac0b91d ))
* **ui:** fix account card layout overflow ([87cced8 ](https://github.com/kaitranntt/ccs/commit/87cced81952c168eaa4c6fd98059f089d765bcb3 ))
* **ui:** update sync card for local sync design ([e2b9c46 ](https://github.com/kaitranntt/ccs/commit/e2b9c465e4485c13086b82d282d9c67ae640dc77 ))
### Code Refactoring
* **cliproxy:** remove model alias functionality ([32dbd5e ](https://github.com/kaitranntt/ccs/commit/32dbd5e174338d7627637667c63162ea4b9ffe7f ))
* **ui:** merge sync into ProxyStatusWidget ([3761634 ](https://github.com/kaitranntt/ccs/commit/37616348f8e0edf934e68854faf6c783d4ff7aca ))
### Tests
* **cliproxy:** add management-api-client unit tests ([6611142 ](https://github.com/kaitranntt/ccs/commit/6611142dcc60180dbaa4b987c3fb801ce753ffb1 ))
2026-01-28 22:01:02 +00:00
Kai (Tam Nhu) Tran and GitHub
8a81e4ce15
Merge pull request #391 from kaitranntt/dev
...
feat(release): v7.29.0 - account tier prioritization & local sync
2026-01-28 16:59:56 -05:00
github-actions[bot]
2c649275d6
chore(release): 7.29.0-dev.2 [skip ci]
2026-01-28 21:54:57 +00:00
Kai (Tam Nhu) Tran and GitHub
c70014a5ba
Merge pull request #390 from kaitranntt/feat/account-tier-prioritization
...
feat(cliproxy): account tier prioritization (ultra/pro/free)
2026-01-28 16:53:56 -05:00
kaitranntt
4967693839
fix(cliproxy): address PR review feedback
...
- align tier fallback to 'unknown' instead of 'pro' in quota-manager
- update stale comment referencing old allowedTiers approach
2026-01-28 16:41:27 -05:00
kaitranntt
31a91f609f
feat(ui): add tier badges to account cards
...
- flow-viz: inline tier badge (ULTRA/PRO) with violet/yellow colors
- provider-editor: tier badge on avatar corner (U/P)
- subtle design with low opacity backgrounds
2026-01-28 16:31:16 -05:00
kaitranntt
890fd140f2
feat(ui): add granular account tier types (pro/ultra/free)
...
- update AccountTier from binary to granular
- add tier field to AccountRow and AccountData types
- pass tier through hooks data flow
2026-01-28 16:30:41 -05:00
kaitranntt
de23029b57
fix(cliproxy): use paidTier for account tier detection instead of allowedTiers
...
- paidTier.id contains actual subscription: g1-ultra-tier or g1-pro-tier
- allowedTiers[isDefault] returns standard-tier for all accounts (not useful)
- mapTierString now correctly parses g1-ultra-tier and g1-pro-tier formats
2026-01-28 15:17:23 -05:00
kaitranntt
87cced8195
fix(ui): fix account card layout overflow
...
- add min-w-0 flex-1 to left content container for proper shrinking
- add gap-2 between content and dropdown menu
- add shrink-0 to dropdown button to prevent overflow
2026-01-28 15:11:17 -05:00
kaitranntt
aeb9abc998
feat(cliproxy): add granular account tier prioritization (ultra/pro/free)
...
- change AccountTier from binary (free/paid) to granular (ultra/pro/free/unknown)
- update mapTierString() to parse API tier strings correctly
- remove faulty inferTierFromModels() fallback - tier comes only from API
- update default tier_priority config to ['ultra', 'pro', 'free']
- update model catalog tier types and display logic
Closes #387
2026-01-28 15:11:00 -05:00
github-actions[bot]
e01a622c97
chore(release): 7.29.0-dev.1 [skip ci]
2026-01-28 19:30:53 +00:00
Kai (Tam Nhu) Tran and GitHub
9ca73b93a3
Merge pull request #389 from kaitranntt/kai/feat/cliproxy-local-sync
...
feat(cliproxy): add local config sync with auto-sync watcher
2026-01-28 14:29:51 -05:00
kaitranntt
6611142dcc
test(cliproxy): add management-api-client unit tests
...
- Add 31 unit tests for fetchLocalSyncStatus, fetchProfiles, and performLocalSync
- Cover success, error, timeout, and network failure scenarios
- Remove unused --force flag from sync handler (YAGNI)
2026-01-28 14:12:42 -05:00
kaitranntt
bbad73b554
fix(cliproxy): harden sync against edge cases
...
Backend:
- Handle config file deletion race condition with try-catch
- Add null check for empty config files in yaml.load()
- Limit profile names to 64 chars, require alphanumeric content
- Add 5s timeout for watcher close() to prevent hangs
Frontend:
- Add 30s fetch timeout with AbortController for sync requests
2026-01-28 13:58:16 -05:00