Kai (Tam Nhu) Tran and GitHub
b565ef9980
Merge pull request #438 from kaitranntt/kai/fix/glmt-verbose-retry-logs
...
fix(glmt): gate retry rate limit logs behind verbose flag
2026-02-03 21:34:47 -05:00
kaitranntt
73824bc99e
fix(glmt): gate retry rate limit logs behind verbose flag
...
Rate limit retry messages now only appear when verbose mode is enabled,
keeping test output clean while preserving debug capability.
2026-02-03 21:09:18 -05:00
github-actions[bot]
38d2db9304
chore(release): 7.34.1-dev.2 [skip ci]
2026-02-04 01:00:01 +00:00
Kai (Tam Nhu) Tran and GitHub
384b147a64
Merge pull request #434 from kaitranntt/kai/fix/backup-redundancy
...
fix(backup): create backups only when settings content changes
2026-02-03 19:58:55 -05:00
kaitranntt
c324e92eb4
fix(backup): create backups only when settings content changes
...
Previously, PUT /api/settings/:profile created a backup on every request
regardless of whether the content actually changed. This led to hundreds
of identical backup files accumulating in ~/.ccs/backups/.
Changes:
- Compare existing content with new content before creating backup
- Reuse computed newContent for atomic write (DRY)
- Make hook injection idempotent by checking content before write
Fixes #433
2026-02-03 19:48:00 -05:00
github-actions[bot]
b833b149e0
chore(release): 7.34.1-dev.1 [skip ci]
2026-02-03 05:14:46 +00:00
Kai (Tam Nhu) Tran and GitHub
2e96d215e4
Merge pull request #432 from kaitranntt/fix/431-dynamic-model-display
...
fix(delegation): dynamic model display from settings
2026-02-03 00:13:38 -05:00
kaitranntt
f6b7045023
fix(delegation): dynamic model display from settings
...
- Read ANTHROPIC_MODEL from profile settings instead of hardcoding
- Display model name in full uppercase (GLM-4.7, not Glm-4.7)
- Add null/undefined guard to getModelDisplayName
- Remove hardcoded GLM-4.6/GLM-4.6 (Thinking) display names
Closes #431
2026-02-03 00:01:30 -05:00
semantic-release-bot
d39e24ba16
chore(release): 7.34.1 [skip ci]
...
## [7.34.1](https://github.com/kaitranntt/ccs/compare/v7.34.0...v7.34.1 ) (2026-02-03)
### Bug Fixes
* **dashboard:** cross-browser OAuth with manual callback fallback ([#417 ](https://github.com/kaitranntt/ccs/issues/417 )) ([#423 ](https://github.com/kaitranntt/ccs/issues/423 )) ([24b0312 ](https://github.com/kaitranntt/ccs/commit/24b03121fd43121f229bd4c07cbd7e3ee5a0234a ))
* **dashboard:** detect popup blocked during OAuth flow ([441870d ](https://github.com/kaitranntt/ccs/commit/441870d38e5e7d8069df5f4695cb28275f0d48b6 ))
* **jsonl:** add explicit UTF-8 BOM stripping ([09b5239 ](https://github.com/kaitranntt/ccs/commit/09b5239f58213b24f2e13116cb2384748bf8913f ))
* **quota:** add explicit 429 rate limit handling ([e596ab4 ](https://github.com/kaitranntt/ccs/commit/e596ab487d9782e4cd9633be081dc42e4a176668 ))
* **quota:** improve 403 error messaging for forbidden accounts ([5a308db ](https://github.com/kaitranntt/ccs/commit/5a308db409392d88e637ee66b9c693b8b7557198 ))
* **websearch:** add type guards and deduplication for global settings ([847aad0 ](https://github.com/kaitranntt/ccs/commit/847aad00fee1fd920ddf8ea3a4b0e85aa1f3dfa4 ))
* **websearch:** normalize double-slash paths in hook detection ([66f5fe6 ](https://github.com/kaitranntt/ccs/commit/66f5fe6b2c2a955b4b616c38042ab3c9ead199a1 ))
* **websearch:** normalize Windows path separators in hook detection ([d61c940 ](https://github.com/kaitranntt/ccs/commit/d61c940a087d4e9134fa0a9ae32dc8d79d42648d ))
* **websocket:** add maxPayload limit to prevent DoS attacks ([4fd2f60 ](https://github.com/kaitranntt/ccs/commit/4fd2f601f676c0710b078960ad1d6c45fba8a6ca ))
### Code Refactoring
* **oauth:** align box chars with CCS standard and add JSDoc ([258220b ](https://github.com/kaitranntt/ccs/commit/258220b7e8ec833efe772bf32b61800e20439ddb ))
* **websearch:** extract shared hook utils to DRY module ([1f8d9b8 ](https://github.com/kaitranntt/ccs/commit/1f8d9b82d5ad89cefe73966e9c1ef57692dd9284 )), closes [#420 ](https://github.com/kaitranntt/ccs/issues/420 )
### Tests
* **websearch:** add unit tests for hook-utils module ([deb6249 ](https://github.com/kaitranntt/ccs/commit/deb62490dbe797369460ac07ad42a0790463a460 ))
2026-02-03 04:50:13 +00:00
Kai (Tam Nhu) Tran and GitHub
29ba43ec66
Merge pull request #430 from kaitranntt/dev
...
Release: v7.34.0
2026-02-02 23:49:04 -05:00
github-actions[bot]
332d150a83
chore(release): 7.34.0-dev.3 [skip ci]
2026-02-03 04:42:32 +00:00
kaitranntt
258220b7e8
refactor(oauth): align box chars with CCS standard and add JSDoc
...
Use Unicode box characters (╔═╗║╚╝) per design guidelines and
add JSDoc to parseCallbackUrl helper function.
2026-02-02 23:41:13 -05:00
kaitranntt
441870d38e
fix(dashboard): detect popup blocked during OAuth flow
...
Show toast warning with manual URL copy instructions when
browser blocks OAuth popup window.
2026-02-02 23:40:48 -05:00
kaitranntt
09b5239f58
fix(jsonl): add explicit UTF-8 BOM stripping
...
Strip BOM character before JSON parsing to ensure robust
cross-platform JSONL file handling.
2026-02-02 23:40:36 -05:00
kaitranntt
66f5fe6b2c
fix(websearch): normalize double-slash paths in hook detection
...
Add .replace(/\/+/g, '/') to collapse multiple forward slashes,
preventing duplicate hook accumulation from malformed paths.
2026-02-02 23:40:25 -05:00
kaitranntt
e596ab487d
fix(quota): add explicit 429 rate limit handling
...
Match pattern from quota-fetcher-codex.ts for consistent
user-friendly error messages when rate limited.
2026-02-02 23:40:15 -05:00
kaitranntt
4fd2f601f6
fix(websocket): add maxPayload limit to prevent DoS attacks
...
Set 1MB payload limit and disable perMessageDeflate to prevent
memory exhaustion and zip bomb attacks on WebSocket server.
2026-02-02 23:40:04 -05:00
Kai (Tam Nhu) Tran and GitHub
24b03121fd
fix(dashboard): cross-browser OAuth with manual callback fallback ( #417 ) ( #423 )
...
- Remove destructive /start endpoint call from Dashboard OAuth dialog
(was killing running CLIProxy Docker instances via killProcessOnPort)
- Use /start-url + polling only (management API, non-destructive)
- Auto-open browser tab via window.open() with manual fallback URL display
- Add paste-callback CLI mode (--paste-callback flag) for headless/SSH
- Use dynamic proxy target with management headers instead of hardcoded localhost
- Extract timeout constants, restore invariant comment
- Move hook-utils tests from src/__tests__/ to tests/unit/ (fixes tsc)
- Add try-catch for preset apply, remove auth URL console.log
2026-02-02 16:11:36 -05:00
kaitranntt
deb62490db
test(websearch): add unit tests for hook-utils module
...
Add 17 tests for isCcsWebSearchHook and deduplicateCcsHooks functions
covering Unix/Windows paths, edge cases, and duplicate cleanup.
Also add invariant comment in hook-config.ts.
Addresses code review feedback from PR #424 .
2026-02-02 15:08:21 -05:00
github-actions[bot]
cc55999628
chore(release): 7.34.0-dev.2 [skip ci]
2026-02-02 17:03:13 +00:00
Kai (Tam Nhu) Tran and GitHub
5f8e2aeba8
Merge pull request #422 from kaitranntt/kai/fix/quota-forbidden-ux
...
fix(quota): improve 403 error messaging for forbidden accounts
2026-02-02 12:02:04 -05:00
github-actions[bot]
deca06c42b
chore(release): 7.34.0-dev.1 [skip ci]
2026-02-02 16:52:35 +00:00
kaitranntt
5a308db409
fix(quota): improve 403 error messaging for forbidden accounts
...
Instead of showing "Quota access forbidden" generic error, now shows:
- Antigravity: "403 Forbidden - No Gemini Code Assist access"
- Codex: "403 Forbidden - No quota API access"
Keeps success=false with isForbidden flag so UI can show distinct
"403" badge (similar to Antigravity-Manager) rather than conflating
with 0% exhausted state.
403 ≠ 0% exhausted - they are semantically different:
- 403: Account lacks API access entirely
- 0%: Account has access but quota is used up (shows reset time)
2026-02-02 11:52:23 -05:00
Kai (Tam Nhu) Tran and GitHub
dc75a4b9bb
Merge pull request #420 from kaitranntt/kai/fix/windows-websearch-duplicates
...
fix(websearch): normalize Windows path separators in hook detection
2026-02-02 11:51:34 -05:00
kaitranntt
1f8d9b82d5
refactor(websearch): extract shared hook utils to DRY module
...
- Create hook-utils.ts with isCcsWebSearchHook() and deduplicateCcsHooks()
- Update profile-hook-injector.ts and hook-config.ts to use shared module
- Combine double writeFileSync into single write in ensureHookConfig()
Addresses code review feedback on PR #420
2026-02-02 11:42:39 -05:00
kaitranntt
847aad00fe
fix(websearch): add type guards and deduplication for global settings
...
- Add typeof check before .replace() to prevent crash on non-string commands
- Add isCcsWebSearchHook() and deduplicateCcsHooks() to hook-config.ts
- Fix ensureHookConfig() detection to verify path, not just matcher
- Prevent overwriting user's custom WebSearch hooks
2026-02-02 11:36:48 -05:00
kaitranntt
d61c940a08
fix(websearch): normalize Windows path separators in hook detection
...
On Windows, path.join() produces backslash paths (C:\Users\.ccs\hooks\...)
but detection used forward slashes, causing:
- Failed hook detection on Windows
- Duplicate hooks added on every CCS invocation
Changes:
- Normalize path separators (\ -> /) before matching
- Add deduplicateCcsHooks() to auto-cleanup accumulated duplicates
- Fix affects hasCcsHook(), isCcsWebSearchHook(), removeHookConfig()
2026-02-02 11:18:20 -05:00
semantic-release-bot
be63056d11
chore(release): 7.34.0 [skip ci]
...
## [7.34.0](https://github.com/kaitranntt/ccs/compare/v7.33.0...v7.34.0 ) (2026-02-01)
### Features
* **glmt:** add rate limit resilience with exponential backoff retry ([3afdcea ](https://github.com/kaitranntt/ccs/commit/3afdcea379a6527657ba326895f328c219ad6a88 )), closes [#402 ](https://github.com/kaitranntt/ccs/issues/402 )
### Bug Fixes
* **claude:** update base config to Claude 4.5 model IDs ([09dd701 ](https://github.com/kaitranntt/ccs/commit/09dd7016eb2570ef9946f9e7be0bbc300f75337a ))
* **cliproxy:** load WebSearch hooks via --settings flag ([7aaf568 ](https://github.com/kaitranntt/ccs/commit/7aaf568c3f15ae0a5c9dcab14f3e61d811515c9a )), closes [#412 ](https://github.com/kaitranntt/ccs/issues/412 )
* **glmt:** add env var validation and max delay cap ([67a8e2c ](https://github.com/kaitranntt/ccs/commit/67a8e2cefcedad2f5a26f0d43952219379be5cc0 ))
* **glmt:** extract Retry-After from HTTP headers and cap maxRetries ([62ac3e2 ](https://github.com/kaitranntt/ccs/commit/62ac3e2ae9b941adaa35cc3962c4de54f917e065 ))
* **sync:** prevent duplicate backup folders on Windows ([a8b0547 ](https://github.com/kaitranntt/ccs/commit/a8b054781f9c18165e985de801500f31d87a88a8 )), closes [#409 ](https://github.com/kaitranntt/ccs/issues/409 )
* **update:** add line-buffering and unit tests for stderr filter ([b39726f ](https://github.com/kaitranntt/ccs/commit/b39726fc0713451679b26d3467e70e835c784851 ))
* **update:** filter npm cleanup warnings on Windows ([c9f8ed1 ](https://github.com/kaitranntt/ccs/commit/c9f8ed1a04faa95af68650dca4371804391daef8 )), closes [#405 ](https://github.com/kaitranntt/ccs/issues/405 )
2026-02-01 07:52:36 +00:00
Kai (Tam Nhu) Tran and GitHub
648bbc479f
Merge pull request #414 from kaitranntt/dev
...
fix(release): WebSearch hooks for CLIProxy profiles
2026-02-01 02:51:29 -05:00
github-actions[bot]
dcb1e53a9d
chore(release): 7.33.0-dev.5 [skip ci]
2026-02-01 07:51:09 +00:00
Kai (Tam Nhu) Tran and GitHub
8fd2346365
Merge pull request #413 from kaitranntt/fix/websearch-hook-cliproxy
...
fix(cliproxy): load WebSearch hooks via --settings flag
2026-02-01 02:50:03 -05:00
kaitranntt
7aaf568c3f
fix(cliproxy): load WebSearch hooks via --settings flag
...
- Add --settings flag to Claude CLI spawn for CLIProxy profiles
- Use getProviderSettingsPath() for hardcoded profiles (agy, gemini, codex, qwen)
- Use cfg.customSettingsPath for CLIProxy variants (user-defined providers)
- Block user --settings flag to prevent duplicate flags
- Enables WebSearch hooks to load for all CLIProxy profiles
Closes #412
2026-02-01 02:47:15 -05:00
github-actions[bot]
53c9a3da9e
chore(release): 7.33.0-dev.4 [skip ci]
2026-01-30 15:14:50 +00:00
Kai (Tam Nhu) Tran and GitHub
63474bb4f5
Merge pull request #411 from kaitranntt/kai/fix/claude-model-presets
...
fix(claude): update base config to Claude 4.5 model IDs
2026-01-30 10:13:47 -05:00
kaitranntt
09dd7016eb
fix(claude): update base config to Claude 4.5 model IDs
...
Updated default Claude model IDs from outdated v4 (May 2025) to
current v4.5 versions matching model-catalog.ts:
- ANTHROPIC_MODEL: claude-sonnet-4-5-20250929
- ANTHROPIC_DEFAULT_OPUS_MODEL: claude-opus-4-5-20251101
- ANTHROPIC_DEFAULT_SONNET_MODEL: claude-sonnet-4-5-20250929
- ANTHROPIC_DEFAULT_HAIKU_MODEL: claude-haiku-4-5-20251001
Fixes "unknown provider for model" 400 errors when users add
Claude accounts and switch to Haiku tier.
2026-01-30 10:09:47 -05:00
github-actions[bot]
4f4498232e
chore(release): 7.33.0-dev.3 [skip ci]
2026-01-30 14:26:38 +00:00
Kai (Tam Nhu) Tran and GitHub
711161e034
Merge pull request #410 from kaitranntt/fix/windows-sync-duplicate-backups
...
fix(sync): prevent duplicate backup folders on Windows
2026-01-30 09:25:31 -05:00
kaitranntt
a8b054781f
fix(sync): prevent duplicate backup folders on Windows
...
On Windows, symlinks often fail so copyFallback() copies directories instead.
Previously, subsequent `ccs sync` runs would see the copied folder, fail the
isOurSymlink() check, and create a new .backup-{date} folder every time.
This fix adds Windows copy detection in installItem() before calling backupItem().
When a valid CCS copy is detected, it refreshes the content instead of backing up.
Fixes #409
2026-01-30 09:17:55 -05:00
github-actions[bot]
63946eb5bc
chore(release): 7.33.0-dev.2 [skip ci]
2026-01-30 13:26:09 +00:00
Kai (Tam Nhu) Tran and GitHub
7be20765fe
Merge pull request #407 from kaitranntt/feat/glmt-rate-limit-resilience
...
feat(glmt): add rate limit resilience with exponential backoff retry
2026-01-30 08:25:03 -05:00
kaitranntt
62ac3e2ae9
fix(glmt): extract Retry-After from HTTP headers and cap maxRetries
...
- Extract Retry-After from actual HTTP response headers instead of parsing error messages
- Cap GLMT_MAX_RETRIES at 10 to prevent misconfiguration
- Prefer header-based Retry-After over message parsing (fallback preserved)
Addresses PR review feedback.
2026-01-30 08:14:10 -05:00
kaitranntt
67a8e2cefc
fix(glmt): add env var validation and max delay cap
...
- Validate GLMT_MAX_RETRIES and GLMT_RETRY_BASE_DELAY for NaN/negative
- Add 30s max delay cap to prevent excessively long waits
Addresses PR review feedback.
2026-01-30 08:05:38 -05:00
kaitranntt
3afdcea379
feat(glmt): add rate limit resilience with exponential backoff retry
...
Add retry logic and connection pooling to GLMT proxy for handling Z.AI
429 rate limit errors gracefully.
Changes:
- Add RetryConfig with env vars (GLMT_MAX_RETRIES, GLMT_RETRY_BASE_DELAY, GLMT_DISABLE_RETRY)
- Add exponential backoff with jitter and Retry-After header support
- Add forwardWithRetry() and forwardAndStreamWithRetry() wrappers
- Add HTTPS connection pooling via shared https.Agent
- Add comprehensive unit tests (19 tests covering all scenarios)
Fixes : #402
2026-01-30 07:53:04 -05:00
github-actions[bot]
a26d121450
chore(release): 7.33.0-dev.1 [skip ci]
2026-01-30 12:50:17 +00:00
Kai (Tam Nhu) Tran and GitHub
bf08d47f70
Merge pull request #406 from kaitranntt/fix/eperm-update-warnings
...
fix(update): filter npm cleanup warnings on Windows
2026-01-30 07:49:14 -05:00
kaitranntt
b39726fc07
fix(update): add line-buffering and unit tests for stderr filter
...
Address review feedback:
- Add line-buffering to handle chunk splitting edge case
- Add 14 unit tests for stderr filter logic
- Test chunk boundary handling, mixed output, edge cases
Handles case where "npm warn cleanup" could be split across chunks.
2026-01-30 07:43:38 -05:00
kaitranntt
c9f8ed1a04
fix(update): filter npm cleanup warnings on Windows
...
Filter cosmetic EPERM warnings during update on Windows when npm fails
to unlink native module prebuilds (bcrypt.node) due to file locking by
antivirus/indexing services. Update still succeeds - warnings are noise.
Closes #405
2026-01-30 07:35:34 -05:00
semantic-release-bot
3673b9d771
chore(release): 7.33.0 [skip ci]
...
## [7.33.0](https://github.com/kaitranntt/ccs/compare/v7.32.0...v7.33.0 ) (2026-01-30)
### Features
* **cliproxy:** add backend caching and reauth indicator for quota endpoints ([7947a7a ](https://github.com/kaitranntt/ccs/commit/7947a7ac89b977a34adc9ab72b89b38a61fb5200 ))
* **cliproxy:** add Codex/Gemini quota API routes ([2f5a50b ](https://github.com/kaitranntt/ccs/commit/2f5a50b801a48314b76f102ccdd4f71c4d1cf87d ))
* **cliproxy:** add proactive token refresh for Gemini quota (match AGY pattern) ([606bb72 ](https://github.com/kaitranntt/ccs/commit/606bb7272318bea9f294d9b563369d595b336cf4 ))
* **ui:** add Codex/Gemini quota API client and hooks ([19a57c3 ](https://github.com/kaitranntt/ccs/commit/19a57c395c29beb83661edb28286e01211b80261 ))
* **ui:** display Codex/Gemini quota in dashboard ([387c010 ](https://github.com/kaitranntt/ccs/commit/387c01026731d251459420d70830df418fd1311f ))
### Code Refactoring
* **ui:** address code review feedback ([32ef233 ](https://github.com/kaitranntt/ccs/commit/32ef23314a517bcda1816ce0c55691b3dd2616de ))
* **ui:** extract duplicated quota helpers to shared utils ([8ce7495 ](https://github.com/kaitranntt/ccs/commit/8ce749581ef7667bec29bdfe17d02f824e06bed4 )), closes [#400 ](https://github.com/kaitranntt/ccs/issues/400 )
* **ui:** extract shared QuotaTooltipContent component ([eeb0dde ](https://github.com/kaitranntt/ccs/commit/eeb0dde8cabf0db5eea758d50ca7fd0b126a6404 ))
### Tests
* **quota:** add extensive test suite for quota caching system ([3df2619 ](https://github.com/kaitranntt/ccs/commit/3df2619023abee095901636310818a676e02d639 ))
* **ui:** add comprehensive tests for quota utility functions ([0b8635d ](https://github.com/kaitranntt/ccs/commit/0b8635d3ba47cf954ad9cc5fe4d30c64ec77779c ))
2026-01-30 04:35:04 +00:00
Kai (Tam Nhu) Tran and GitHub
86d9a31e92
Merge pull request #401 from kaitranntt/dev
...
feat(release): promote dev to main - Codex/Gemini quota display
2026-01-29 23:33:59 -05:00
github-actions[bot]
bd89cabc8a
chore(release): 7.32.0-dev.1 [skip ci]
2026-01-30 04:30:44 +00:00