Commit Graph

253 Commits

Author SHA1 Message Date
Badri Narayanan S
44632dc301 feat: add automatic user onboarding for accounts without projects
When loadCodeAssist returns no project, automatically call onboardUser API
to provision a managed project. This handles first-time setup for new accounts.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-15 12:27:37 +05:30
Badri Narayanan S
896bf81a36 revert: remove count_tokens endpoint (caused regression)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-14 23:43:16 +05:30
Badri Narayanan S
522ddcde42 refactor: use test-models helper for count tokens test
Replace hardcoded model IDs with centralized TEST_MODELS from constants.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-14 23:20:03 +05:30
Badri Narayanan S
fa29de7183 fix: handle unsigned thinking blocks in tool loops (#120)
When Claude Code strips thinking signatures it doesn't recognize,
the proxy would drop unsigned thinking blocks, causing the error
"Expected thinking but found text". This fix detects unsigned
thinking blocks and triggers recovery to close the tool loop.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-14 23:01:13 +05:30
Badri Narayanan S
dee7512bd8 fix: improve subscription tier detection for Pro accounts
The tier detection was incorrectly showing Pro accounts as "free" due to:
1. paidTier field being flaky/missing from some API responses
2. standard-tier not being recognized as a Pro tier
3. No fallback to allowedTiers when currentTier is missing

Changes:
- Add parseTierId() helper to centralize tier ID parsing
- Recognize "standard-tier" as Pro (Gemini Code Assist paid tier)
- Add fallback chain: paidTier > currentTier > allowedTiers
- Return "unknown" instead of incorrectly defaulting to "free"

Fixes #121

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-14 21:27:24 +05:30
Badri Narayanan S
772dabe7e4 fix: defer inlineData parts to end of array for parallel tool calls (#91)
When multiple tool_results contain images, the inlineData parts were
being interleaved between functionResponse parts, breaking Claude's API
requirement that functionResponse parts be consecutive.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-14 21:04:36 +05:30
Badri Narayanan S
97e1d9c417 Merge pull request #119 from minhphuc429/feature/count-tokens-endpoint
feat: implement /v1/messages/count_tokens endpoint
2026-01-14 18:04:09 +05:30
behemoth-phucnm
d33de409d4 docs: fix misleading tokenizer comments 2026-01-14 19:31:43 +07:00
minhphuc429
7da7e887bf feat: use official tokenizers for 99.99% accuracy
Replace gpt-tokenizer with model-specific official tokenizers:
- Claude models: @anthropic-ai/tokenizer (official Anthropic tokenizer)
- Gemini models: @lenml/tokenizer-gemini (GemmaTokenizer)

Changes:
- Add @anthropic-ai/tokenizer and @lenml/tokenizer-gemini dependencies
- Remove gpt-tokenizer dependency
- Update count-tokens.js with model-aware tokenization
- Use getModelFamily() to select appropriate tokenizer
- Lazy-load Gemini tokenizer (138MB) on first use
- Default to local estimation for all content types (no API calls)

Tested with all supported models:
- claude-sonnet-4-5, claude-opus-4-5-thinking, claude-sonnet-4-5-thinking
- gemini-3-flash, gemini-3-pro-low, gemini-3-pro-high
2026-01-14 16:04:13 +07:00
minhphuc429
2bdecf6e96 fix: ensure account manager initialized for count_tokens
- Add ensureInitialized() call before count_tokens handler
- Use hybrid approach: local estimation for text, API for images/docs
- This prevents "No accounts available" error on first request
2026-01-14 15:43:25 +07:00
minhphuc429
df81ba5632 feat: use API-based token counting for 100% accuracy
Switch from local estimation (gpt-tokenizer) to API-based counting
via Google Cloud Code API for accurate token counts. Falls back to
local estimation if API call fails.
2026-01-14 15:36:47 +07:00
minhphuc429
53da774bb6 test: add count tokens endpoint test suite
Add comprehensive test suite for /v1/messages/count_tokens endpoint:
- Simple text messages
- Multi-turn conversations
- System prompts (string and array format)
- Tool definitions and tool use/result blocks
- Thinking blocks
- Content arrays with text blocks
- Error handling for invalid requests
- Long text tokenization

Also adds npm script test:counttokens for running tests individually.
2026-01-14 15:36:11 +07:00
minhphuc429
acc228b920 feat: implement /v1/messages/count_tokens endpoint
Add Anthropic-compatible token counting endpoint using hybrid approach:
- Local estimation with gpt-tokenizer for text content (~95% accuracy)
- API-based counting for complex content (images, documents)
- Automatic fallback to local estimation on API errors

This resolves warnings in LiteLLM and other clients that rely on
pre-request token counting.
2026-01-14 15:32:27 +07:00
Yasin Köse
cc64b93f32 Merge pull request #107 from YasinKose/main
Feat(ui): add Turkish language support and UI enhancements

Introduces Turkish language support and several UI/UX improvements to the web management interface.
2026-01-14 16:08:50 +08:00
Badri Narayanan S
84cdf3571f Merge pull request #116 from simon-ami/feature/claude-config-presets
fix: resolve save preset modal scope issue in Claude config
2026-01-14 01:44:48 +05:30
simon-ami
f201df4718 fix: resolve save preset modal scope issue
- Remove nested x-data from save preset modal to fix scope access
- Add newPresetName to parent component state
- Ensure savingPreset state is correctly accessed from the button
- Clear input field on modal open and after successful save
2026-01-13 16:28:34 +01:00
Badri Narayanan S
12d196f6a0 refactor: centralize TEST_MODELS and DEFAULT_PRESETS in constants.js
- Move TEST_MODELS and DEFAULT_PRESETS to src/constants.js as single source of truth
- Update test-models.cjs helper to use dynamic import from constants
- Make getTestModels() and getModels() async functions
- Update all test files to await async model config loading
- Remove duplicate THINKING_MODELS and getThinkingModels() from test helper
- Make thinking tests more lenient for Gemini (doesn't always produce thinking blocks)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 19:20:57 +05:30
Badri Narayanan S
1a06098ae4 docs: add Claude CLI configuration to bug report template
Ask users to provide their settings.json or Settings → Claude CLI
screenshot to help diagnose configuration issues faster.

Addresses discussion #113

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 18:55:21 +05:30
Badri Narayanan S
632536e2d7 fix: use configured cooldown as cap for rate limit wait times
- Cooldown now caps API-provided reset times instead of being a fallback
- Fixed misleading UI descriptions for cooldown settings
- Removed unused cooldownDurationMs from settings object
- Updated default fallback values in frontend to 10s

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 18:28:52 +05:30
Badri Narayanan S
49e536e9a9 fix: reduce default cooldown from 60s to 10s
Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 18:16:30 +05:30
Badri Narayanan S
70fd1baaa8 fix: improve loadCodeAssist for Google One AI Pro accounts
- Add separate LOAD_CODE_ASSIST_ENDPOINTS (prod first) and
  LOAD_CODE_ASSIST_HEADERS (google-api-nodejs-client User-Agent)
- Add duetProject to metadata for project discovery
- Silent fallback when API returns success but no project
  (matches opencode-antigravity-auth behavior)
- Only warn when all endpoints fail with actual errors

Fixes #114, addresses discussion #113

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 18:11:45 +05:30
Badri Narayanan S
99a06632ea Merge pull request #102 from liuwuyu118/fix/image-response-and-ui-performance
fix: add image response support
2026-01-13 17:17:39 +05:30
Badri Narayanan S
140224ce85 Merge pull request #112 from mintfog/main
feat: add API key authentication for public deployment security
2026-01-13 17:15:26 +05:30
董飞祥
6172f5ef10 feat: add API key authentication for /v1/* endpoints 2026-01-13 16:46:31 +08:00
Badri Narayanan S
d1be2e2c1d Merge pull request #106 from simon-ami/feature/claude-config-presets
feat(webui): Add Configuration Presets for Claude CLI
2026-01-13 13:39:03 +05:30
liuwuyu118
860c0d6c2d fix: add image response support
Convert Google's inlineData format to Anthropic's image format:
- response-converter.js: Handle inlineData in non-streaming responses
- sse-parser.js: Parse inlineData for thinking models
- sse-streamer.js: Stream inlineData as image content blocks

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-13 11:17:17 +08:00
simon-ami
e24dff279c feat(webui): add configuration presets for Claude CLI
- Add backend storage logic in `src/utils/claude-config.js` to save/load/delete presets
- Add API endpoints (`GET`, `POST`, `DELETE`) for presets in `src/webui/index.js`
- Update `public/views/settings.html` with new Presets UI card and modals
- Update `public/js/components/claude-config.js` with auto-load logic and unsaved changes protection
- Add translations (EN/ZH) for new UI elements in `public/js/store.js`
- Add integration tests in `tests/frontend/test-frontend-settings.cjs`
- Update compiled CSS

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-12 11:59:32 +01:00
Badri Narayanan S
08b332b694 Merge pull request #101 from jgor20/overall-enhancements-to-web-ui
feat(webui): Comprehensive UI enhancements, responsive design, and routing improvements
2026-01-12 12:12:57 +05:30
jgor20
9231cbc60a docs: document usage stats module and UI enhancements in README and CLAUDE.md 2026-01-11 17:31:16 +00:00
jgor20
29acb34ee3 refactor(ui): consolidate filter control button styles and remove overflow from dropdowns 2026-01-11 17:19:20 +00:00
Badri Narayanan S
1045ebe097 Merge pull request #99 from simon-ami/main
Add "Restore Default Claude CLI" button to web console settings
2026-01-11 22:03:38 +05:30
simon-ami
097accd64f Merge branch 'pr-1' 2026-01-11 16:45:23 +01:00
simon-ami
f3b494ebe8 Add confirmation dialog for restoring default config
- Add Restore Default confirmation modal to settings.html
- Add translation strings to store.js
- Update claude-config.js to trigger modal instead of immediate restore

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-11 16:43:25 +01:00
jgor20
dde2910a1d perf(ui): optimize dashboard chart updates and rendering
Add debouncing to chart updates to prevent rapid flickering, implement checks to avoid redundant history processing and double renders, and disable quota chart animations to fix visual glitches.
2026-01-11 15:34:51 +00:00
Simon Benedict
e041afae6e Merge branch 'badrisnarayanan:main' into main 2026-01-11 16:15:22 +01:00
jgor20
a76c364921 refactor(ui): enhance chart destruction and instance management
Improve robustness of chart updates in dashboard components by adding
force destroy checks across canvas properties, component state, and
Chart.js registry to prevent memory leaks and instance conflicts.
Save new chart instances to both canvas and component for better tracking.
2026-01-11 15:12:41 +00:00
jgor20
fc35b71c2b feat(ui): add filter control styles for time range dropdown
Introduce new CSS classes for filter controls and apply them to the time range dropdown in the dashboard view, improving consistency and hover effects.
2026-01-11 15:06:20 +00:00
jgor20
5993456620 refactor(ui): simplify quota info handling in data store
Remove conditional check for empty quotaInfo and always include the row,
treating missing quota info as 0% or unknown for chart display consistency.
2026-01-11 15:01:10 +00:00
jgor20
85381f60a0 fix(ui): add TTL check for cache expiration
Add a 24-hour time-to-live check to the data cache restoration logic to prevent using stale cached data. This ensures data freshness by expiring and removing outdated cache entries before restoration. Also corrected a minor typo in the validity check comment.
2026-01-11 15:01:00 +00:00
jgor20
aa1a72dc62 refactor(ui): make sidebar width conditional on open state
Update class bindings in sidebar to apply width only when sidebar is open,
improving responsive behavior and preventing layout issues.
2026-01-11 14:58:37 +00:00
jgor20
ba24568bff refactor(components): structure model priority tiers in array
Extract hardcoded priority logic into a DEAD_THRESHOLD constant and MODEL_TIERS array for better maintainability and readability. This refactoring improves code organization without altering functionality.
2026-01-11 14:58:09 +00:00
jgor20
10cbe2125a perf(ui): debounce window resize event for sidebar responsiveness
Debounce the window resize event listener with a 150ms timeout to prevent excessive executions, improving performance during window resizing.
2026-01-11 14:51:07 +00:00
jgor20
dd7bfe724e refactor(ui): update sidebar collapsed selector for better specificity 2026-01-11 14:50:47 +00:00
jgor20
15e812c1fb fix(ui): add null check for remainingFraction in dashboard stats 2026-01-11 14:47:25 +00:00
jgor20
eb4cbc0ce5 refactor(components): enhance model identification precision
Switch from substring includes to regex word boundary tests for model names like opus, sonnet, and gemini variants, improving accuracy in the account manager's prioritization logic.
2026-01-11 14:46:41 +00:00
jgor20
de283a9ac8 merge: sync with upstream/main and resolve conflicts 2026-01-11 14:32:56 +00:00
jgor20
c17daf3948 feat(ui): enhance dashboard responsiveness for large screens
Improve layout and styling of dashboard filters and charts to better adapt to larger viewports, including updated flex directions, button sizes, and hover effects for lg breakpoints.
2026-01-11 14:21:26 +00:00
Badri Narayanan S
1142f3e452 Merge pull request #94 from jgor20/feat/webui-refresh-improvements
feat(webui): Improve connection health checks and monitoring
2026-01-11 19:46:29 +05:30
jgor20
f53195bd34 feat(ui): enhance header subtitles with badge styling
Refactor subtitle elements in accounts, dashboard, and models views to use styled badge containers with rounded backgrounds, borders, and improved typography for better visual consistency.
2026-01-11 13:56:11 +00:00
jgor20
0a0e3e2851 feat(ui): add data caching and hash-based routing
- Implement localStorage-based caching in data-store to restore accounts, models, and usage data on load, improving initial render performance
- Add hash-based routing in global store to sync active tab with URL, enabling browser back/forward navigation and direct linking to tabs
2026-01-11 13:47:15 +00:00