Commit graph

587 commits

Author SHA1 Message Date
Zanuar Tri Romadon
c7c1074f28
fix: improve dropdown text readability in dark theme on usage page (#997)
- Add global CSS rules for select elements in dark mode
- Use color-scheme property to signal dark mode to browser
- Explicitly style option elements with dark theme colors
- Fix UsageStats dropdown to use correct CSS variables (bg-surface, text-text-main)

Fixes dropdown text being unreadable in dark theme on usage page:
- Provider filter dropdown
- Table view selector (Model/Account/API Key/Endpoint)
- Pagination page size selector

Tested in Chrome and Firefox with both light and dark themes.
2026-05-10 21:07:59 +07:00
decolua
530dc9cb3b # v0.4.28 (2026-05-10)
## Features
- Add bun:sqlite adapter with automatic runtime detection (Bun/Node)
- Add bulk API key import (format: `name|sk-key`, one per line)
## Fixes
- Fix add API key for custom providers
2026-05-10 08:44:14 +07:00
decolua
b39eb61c33 chore: release v0.4.27
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-09 22:48:07 +07:00
decolua
bee8dad946 feat(db): migrate from lowdb to SQLite with repos pattern
- Add modular DB layer (adapters, migrations, repos, helpers)
- Replace localDb/usageDb/requestDetailsDb monoliths with repos
- Add Tailscale tunnel integration & status check API
- Add /api/cli-tools/all-statuses aggregated endpoint
- Add settingsStore (Zustand) and mitm/dbReader
- Add DB unit tests (benchmark, concurrent, migration, vs-lowdb)
2026-05-09 17:48:20 +07:00
decolua
145f588cc0 feat: Added McpMarketplaceModal to the CoworkToolCard for improved plugin management. 2026-05-09 10:15:38 +07:00
Tran Long
c734913b3f
Update DeepSeek model pricing and add V4 Pro (#938)
Update all DeepSeek model prices to match current V4 Flash pricing
($0.14/$0.28 per 1M input/output tokens), and add V4 Pro model with
its own pricing ($0.435/$0.87). Also add deepseek-v4-pro to the
provider model list.

Co-authored-by: smarthomeblack <truongbber@gmail.com>
2026-05-09 10:11:39 +07:00
Aqil Aziz
62a42851f4
fix: prevent cached settings responses (#951) 2026-05-09 10:08:17 +07:00
Aqil Aziz
0f0c7ede46
fix: normalize Ollama Local provider input (#955) 2026-05-09 10:05:22 +07:00
tarun
ee00f82a50
Refactor connection proxy configuration logic (#970) 2026-05-09 09:58:52 +07:00
Aleksei
787d248030
Add Cloudflare Workers AI image generation (#973) 2026-05-09 09:53:39 +07:00
decolua
dd15d162fc Update changelog 2026-05-07 23:15:48 +07:00
decolua
ad661c1286 feat: enhance CommandCode integration with improved message handling 2026-05-07 23:02:07 +07:00
decolua
b72a443bd3 feat: add CommandCode provider support 2026-05-07 23:01:33 +07:00
decolua
0d61a1d546 feat: add OllamaLocalExecutor and update provider handling
- Introduced OllamaLocalExecutor to handle requests for the "ollama-local" provider.
- Removed the direct URL construction for "ollama-local" from BaseExecutor.
- Updated index.js to include the new OllamaLocalExecutor in the executors mapping.
- Enhanced the ProvidersPage component to support dynamic addition of OpenAI/Anthropic compatible providers.
2026-05-07 16:42:36 +07:00
Arden Hermawan
050e56f20b
Fix compatible provider API key setup (#925) 2026-05-07 16:17:03 +07:00
Tuan-TC
f77f90a828
fix(usage): filter totalRequests by selected time period (#857)
The totalRequests on dashboard/usage overview always showed lifetime total
instead of respecting the selected period (24h/7d/30d/60d). Now calculated
from period-filtered data like other stats.

Co-authored-by: Tuan-TC <tuan-tc@users.noreply.github.com>
2026-05-07 16:11:34 +07:00
Fajar Hidayat
0667a26b5a
feat: add model deselection functionality in ComboFormModal and ComboDetailPage (#889)
- Implemented handleDeselectModel function to allow users to deselect models in both ComboFormModal and ComboDetailPage.
- Updated ModelSelectModal to handle deselection and visually indicate selected models.
- Enhanced user experience by allowing models to be removed from the selection without closing the modal.
2026-05-07 15:55:43 +07:00
0x01001
25182ff772
feat: add support for configurable tunnel transport protocols (#919)
- Introduced DEFAULT_QUICK_TUNNEL_PROTOCOL and QUICK_TUNNEL_PROTOCOLS to allow users to specify the transport protocol for quick tunnels.
- Updated spawnQuickTunnel function to utilize the specified protocol from environment variables, defaulting to HTTP/2 if not provided.
- Enhanced the child process environment to include the selected tunnel transport protocol.
2026-05-07 15:50:36 +07:00
Jaime Botero
0d182018ab
fix: resolve Kiro IDE MITM handler bugs for AWS CodeWhisperer translation (#921)
- Request translation: add codeWhispererToMessages() to convert CodeWhisperer conversationState to OpenAI messages array
- Response format: replace pipeSSE() with pipeOpenAIasEventStream() to return AWS EventStream binary frames instead of SSE text
- Protocol headers: add required Smithy system headers (:message-type, :event-type, :content-type) to every EventStream frame
- Tool support: add extractTools() to convert CodeWhisperer toolSpecification to OpenAI tool format
- Tool arguments: add safeArgsString() to prevent '[object Object]' corruption during SSE accumulation
- Multi-turn context: add convertAssistantResponseMessage() and convertUserInputMessage() to preserve toolUses and toolResults in history
- Tool dispatch: send toolUseEvent.input as raw JSON string instead of parsed object to match Kiro's internal JSON.parse() expectation
2026-05-07 15:49:51 +07:00
decolua
5c62e73cc6 - Cowork: ComboFormModal
- BaseUrlSelect: add cloud endpoint option, custom URL local state, always
  default to first option; new cliEndpointMatch helper; CLI tool cards refactor
- API: new /v1/audio/voices and /v1/models/info; /v1/models filters disabled
  models, drop unused timestamp
- initializeApp: guard tunnel/tailscale auto-resume to once-per-process
- geminiHelper: ensureObjectType for schemas with properties but no type
- skills: minor SKILL.md tweaks (chat/embeddings/image/stt/tts/web-*)
2026-05-07 15:45:09 +07:00
decolua
6344abcf8d Refactor CLI tool cards to use BaseUrlSelect component and pass additional tunnel and Tailscale configuration 2026-05-05 20:22:21 +07:00
decolua
d4bc42e1f5 feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
  endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
  HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
  Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
  Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
  ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
  ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
  runwayml, stability-ai, topaz, black-forest-labs
2026-05-05 10:32:59 +07:00
decolua
bfb7d42164 Fix Bug 2026-05-04 11:35:32 +07:00
decolua
9c6be62a54 Feat : Skills 2026-05-04 11:29:02 +07:00
decolua
f08fa5f78d Fix input fields in tool cards 2026-05-03 22:24:57 +07:00
decolua
4ba546afe7 Enhance token refresh logic and improve MITM server handling
- Introduced a caching mechanism for in-flight token refresh requests to prevent race conditions and reduce unnecessary API calls.
- Added error handling for unrecoverable refresh errors, ensuring that the application can gracefully handle token reuse and invalidation scenarios.
- Updated the MITM server management to handle port 443 conflicts, allowing users to kill processes occupying the port before starting the server.
- Improved user feedback in the MitmServerCard component regarding port conflicts and admin privileges.
- Refactored the ComboList component to streamline the display of media provider combos.

This update aims to enhance the reliability and user experience of the token management and MITM functionalities.
2026-05-03 22:10:03 +07:00
decolua
6cdf40b44e Refactor global styles and enhance MITM functionality
- Updated global CSS to implement a new brand color palette and improve light/dark theme consistency.
- Enhanced the MitmServerCard component to provide clearer user feedback regarding admin privileges.
- Filtered LLM combos in the CombosPage to ensure only relevant data is displayed.
- Improved APIPageClient layout for better usability and visual consistency.
- Added functionality to save and load DNS tool states in the MITM manager.
- Updated OAuth configuration URLs for Qwen to reflect the new endpoint structure.
- Refined tunnel management logic to improve reliability and user experience.
2026-05-03 18:00:35 +07:00
decolua
f1bb5bd67e Squashed commit of the following:
commit 8b2ab7c9e05689c1bf55002cc79db8d22a398c75
Author: kundeng <kundeng@live.com>
Date:   Mon Apr 20 11:26:58 2026 -0400

    fix: send providerSpecificData in Edit modal validate calls

    The Check button in the Edit modal was sending only apiKey without the
    Azure endpoint/deployment/org, causing validation to fail.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

commit c894fa838d035ecd9a160339342371042697c327
Author: kundeng <kundeng@live.com>
Date:   Mon Apr 20 01:45:13 2026 -0400

    fix: persist Azure providerSpecificData and add connection test

    - Read body.providerSpecificData in POST /api/providers so Azure fields
      (endpoint, deployment, apiVersion, organization) are actually stored
    - Add azure case to testApiKeyConnection so the Test button works
      correctly instead of falling through to "not supported"

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

commit 00bd1a4151f4e73616969e25d1786c87d1ec0d5e
Author: kundeng <kundeng@live.com>
Date:   Mon Apr 20 01:24:39 2026 -0400

    fix: add Azure validation and make Organization required

    - Add Azure case to /api/providers/validate that sends a test chat
      completion with api-key header and organization
    - Pass Azure-specific data (endpoint, deployment, apiVersion, org) from
      Add modal to validate endpoint
    - Make Organization field required (needed for billing)

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

commit a66a04daab69b07baa4cc6b28772249e4b25ea19
Author: kundeng <kundeng@live.com>
Date:   Mon Apr 20 01:15:53 2026 -0400

    fix: add Azure config fields to Add API Key modal

    The Add modal was missing the Azure-specific fields (endpoint, deployment,
    API version, organization) — only the Edit modal had them.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

commit 6ac3f4a97af8468d210594495ce754f5d7a7978a
Author: kundeng <kundeng@live.com>
Date:   Mon Apr 20 01:06:45 2026 -0400

    feat: add Azure OpenAI as a dedicated provider

    Azure OpenAI uses a different URL scheme (deployments-based) and api-key
    header auth instead of Bearer tokens. This adds a dedicated AzureExecutor
    that constructs the correct URL and headers, plus dashboard UI fields for
    endpoint, deployment, API version, and organization.

    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-03 15:35:34 +07:00
dmdfami
8f2e6685a6 feat(cli-tools): add browser-local endpoint presets (#819)
Add reusable EndpointPresetControl for CLI tool Base URL/API key
presets, stored in browser localStorage. Wire into Claude, Codex,
OpenCode, Droid, OpenClaw, Hermes, and Copilot cards. Allow
selecting preset API keys not in dashboard keys list.

Thanks @dmdfami for the contribution!

Co-authored-by: dmdfami <dmdfami@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-03 15:35:34 +07:00
kenlin
f7e85e3e06
fix(v1/models): include alias-backed models in listing (#730)
Ensure /v1/models includes provider models added through alias mappings so compatible provider entries like huoshan/kimi-k2.6 are discoverable by clients.

Made-with: Cursor

Co-authored-by: Ken Lin <kenlin1988@foxmail.com>
2026-05-03 15:22:05 +07:00
Anurag Saxena
e39801de71
fix: improve cloudflared exit code error messages for better debugging (closes #423) (#659) 2026-05-03 15:18:27 +07:00
zerray
52ad3b6630
fix: prevent SSE listener leak in console-logs stream (#751)
The ReadableStream cancel() callback is not reliably invoked on client
disconnect under Next.js, causing emitter listeners (line/clear) and the
keepalive interval to accumulate, eventually triggering
MaxListenersExceededWarning.

Use request.signal as the primary disconnect trigger, with cancel() and
enqueue failures as fallbacks. Cleanup is idempotent via state.closed.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 15:11:47 +07:00
Rezky Hamid
e40f7ffb98
fix(mitm): gate sudo prompts on server platform (#822) 2026-05-03 15:00:43 +07:00
Rezky Hamid
a463ee00ff
feat(codex): add review model quota support (#836) 2026-05-03 14:57:33 +07:00
Zhen
14ff538f2e
Improve mobile layouts and restore Cloudflare provider (#840)
Co-authored-by: Delynn Assistant <zhen@dkzhen.org>
2026-05-03 14:55:43 +07:00
decolua
f410061e70 Refactor proxyFetch and enhance MediaProviderDetailPage layout
- Removed the isCloud check from proxyFetch.js, simplifying the fetch patching logic.
- Updated MediaProviderDetailPage to include a new section for API key retrieval, improving user experience with clearer layout and additional notice text.
- Enhanced ConnectionRow to better handle email display names.
- Improved ProviderDetailPage to conditionally render provider notices and API key links.
- Refactored localDb, requestDetailsDb, and usageDb to remove unnecessary isCloud checks, streamlining database interactions.
- Updated OAuthModal to combine waiting and manual input steps for a more cohesive user flow.
- Added API key URLs to several providers in providers.js for better accessibility.
2026-05-01 17:03:13 +07:00
decolua
f8d2a9ff76 Merge branch 'master' of https://github.com/decolua/9router 2026-05-01 16:37:11 +07:00
Abhishek Divekar
3f17ee0e21
Add sticky round-robin for combos (#831)
Made-with: Cursor
2026-05-01 16:36:36 +07:00
decolua
a6ac2641ea Merge branch 'master' of https://github.com/decolua/9router 2026-05-01 16:35:20 +07:00
Zhen
0da61d8f7b
Improve dashboard responsive layouts (#805)
* Improve dashboard responsive layouts

* Improve proxy pools mobile layout

* Improve CLI tool card input responsiveness

---------

Co-authored-by: Delynn Assistant <zhen@dkzhen.org>
2026-05-01 16:34:07 +07:00
decolua
b0da7c1211 Add Xiaomi MiMo provider support
- Introduced Xiaomi MiMo as a new provider in providerModels.js and providers.js.
- Updated model alias mapping in model.js to include Xiaomi MiMo.
- Enhanced validation route to support Xiaomi MiMo API endpoints.
- Added Xiaomi MiMo to APIKEY_PROVIDERS with relevant details.

This update expands the range of supported providers, improving integration capabilities.
2026-05-01 16:32:25 +07:00
H1d3rOne
860d94732a fix: custom provider prefix conflicts with built-in alias
When a custom OpenAI-compatible provider uses a prefix that matches
a built-in alias (e.g. 'ark' -> 'volcengine-ark'), resolveProviderAlias()
converts it to the built-in provider ID, causing the provider-node
matching logic to be skipped. The request is then routed to the wrong
provider, resulting in a 404 model_not_found error.

Fix: always check provider-node prefix matching using the original
user input (parsed.providerAlias) before falling back to the resolved
alias, regardless of whether resolveProviderAlias() transformed it.

Co-authored-by: H1d3rOne <H1d3rOne@users.noreply.github.com>
Made-with: Cursor
2026-05-01 16:28:51 +07:00
decolua
936d65ae1c Enhance chat handling and introduce Caveman feature
- Refactored handleChatCore to include Caveman functionality, allowing for terse-style system prompts to reduce output token usage.
- Updated APIPageClient to manage Caveman settings, including enabling/disabling and selecting compression levels.
- Adjusted AntigravityExecutor to consolidate function declarations for compatibility with Gemini.
- Removed unnecessary console logs during translator initialization across multiple routes.
2026-04-30 18:00:38 +07:00
decolua
34da52f144 Fix : Antigravity MITM 2026-04-29 17:28:38 +07:00
decolua
512e3de371 Update version to 0.4.9, enhance README with Trendshift badge, and add new embedding models to providerModels.js. Refactor TTS handling to support additional providers and improve API key validation for media providers. 2026-04-29 11:34:39 +07:00
decolua
8f81363675 Enhance token refresh functionality across multiple executors
- Updated refreshCredentials methods in various executors (Antigravity, Base, Default, Github, Kiro) to accept optional proxyOptions for improved proxy handling.
- Modified token refresh logic to utilize proxy-aware fetch for better network management.
- Enhanced usage retrieval functions to support proxy options, ensuring seamless integration with proxy configurations.
- Updated ModelSelectModal and ProviderInfoCard components to incorporate kind filtering for improved user experience in model selection.
- Added validation for API keys in the provider validation route, including support for webSearch/webFetch providers.
2026-04-28 17:28:57 +07:00
decolua
1bb621317d Add Cloudflare AI provider support and enhance connection management
- Introduced Cloudflare AI as a new provider with specific configurations in providerModels.js and providers.js.
- Updated DefaultExecutor to handle account ID resolution for Cloudflare AI connections.
- Enhanced AddApiKeyModal and EditConnectionModal to include account ID input for Cloudflare AI.
- Implemented validation for Cloudflare AI API key connections in testUtils.js and route.js.
- Updated UI components to reflect changes in provider management and connection handling.
2026-04-28 11:07:39 +07:00
decolua
111e78940a Refactor cloudflared process management to improve port-specific termination and enhance tunnel management. Update Antigravity cloaking comments for clarity. 2026-04-28 10:20:31 +07:00
decolua
8204bba79f Refactor MitmServerCard to use input field for API key selection and enhance shutdown process to remove DNS entries synchronously. Added removeAllDNSEntriesSync function for safe cleanup during shutdown. 2026-04-28 10:08:57 +07:00
Zhen
296e21c8ad
Add provider filter and expiry sorting to quota dashboard (#769)
Co-authored-by: Delynn Assistant <zhen@dkzhen.org>
2026-04-28 10:05:28 +07:00
mrcyclo
54a67dbeb8
Add TOOL_HOSTS constant for per-tool DNS mapping and integrate into MitmToolCard component (#788) 2026-04-28 09:50:11 +07:00
decolua
4ea842c062 Update version to 0.4.6 and add BytePlus provider to shared constants 2026-04-25 17:04:48 +07:00
decolua
83418e8a9d Add codex to image providers 2026-04-25 17:01:40 +07:00
decolua
14ff69bf90 - Added BytePlus Provider 2026-04-25 17:00:39 +07:00
decolua
0b8bed5793 Enhance image and embedding provider support
- Added new image models for GPT 5.2, 5.3, and 5.4, including capabilities for text-to-image and editing.
- Updated embedding handling to include optional dimensions in requests.
- Introduced support for custom embedding providers, allowing dynamic fetching and validation of custom nodes.
- Improved image generation handling with Codex integration, including progress tracking and error handling.
- Enhanced UI components to support adding custom embeddings and displaying their status.
2026-04-25 16:22:30 +07:00
decolua
cca615eaff - Cap maximum cooldown for rate limit handling in account unavailability and single-model chat flows
- Dynamic custom model fetching for model selection
2026-04-24 16:14:18 +07:00
decolua
030fb34f88 - Updated markAccountUnavailable function to accept resetsAtMs for precise cooldown management.
- Added email backfill functionality for Codex OAuth connections to improve account information accuracy.
2026-04-24 11:36:16 +07:00
decolua
65f11a603e feat: add Azure OpenAI provider support 2026-04-24 10:04:59 +07:00
kenlin
f2e7a98ce0
feat: add built-in Volcengine Ark provider support (#741)
Add Volcengine Ark as a first-class API key provider with official model presets, endpoint configuration, API key validation, model discovery, connection testing, provider logo, and runtime alias mapping for `ark/*` model IDs.

Made-with: Cursor

Co-authored-by: kingsy <kingsylin@vip.qq.com>
2026-04-24 09:28:50 +07:00
decolua
428e2c045c implement CLI token validation for enhanced security 2026-04-23 17:43:35 +07:00
decolua
368f4c3e7f - Added Hermes tool to CLI tools and updated related components. 2026-04-23 16:39:31 +07:00
decolua
8de9aae90c Feature : RTK compress 2026-04-22 15:36:51 +07:00
decolua
45731ae639 feat: add OpenCode Go provider and support for custom models
- Introduced OpenCode Go provider with relevant configurations.
- Enhanced model management by allowing users to add and delete custom models.
- Updated UI components to support model selection for image types.
- Adjusted sidebar visibility to include image media kinds.
2026-04-22 14:16:21 +07:00
decolua
abb04c5366 feat: add support for Grok Web and Perplexity Web providers 2026-04-22 11:58:53 +07:00
anuragg-saxenaa
4638cf0e81 fix(ollama-local): support custom host URL for remote Ollama servers (closes #578)
Add a shared resolveOllamaLocalHost() helper and wire it through the
executor, models/validate/test routes, so users can point ollama-local
at a remote Ollama instance instead of being locked to localhost:11434.

Also expose the host as an "Ollama Host URL" field in AddApiKeyModal
(empty = default localhost:11434), making the option reachable from the
dashboard without hand-editing db.json.

Co-authored-by: anuragg-saxenaa <anuragg.saxenaa@gmail.com>
Made-with: Cursor
2026-04-22 10:45:46 +07:00
Anurag Saxena
94ab0d715d
fix: update Qwen OAuth URLs from chat.qwen.ai to qwen.ai (closes #572) (#683)
* fix: make version update banner clickable to copy install command (closes #598)

* fix: resolve ollama-local baseUrl from providerSpecificData.baseUrl for remote Ollama hosts (closes #578)

* fix: add Ollama Cloud to usage/quota tracking (closes #681)

* fix: update Qwen OAuth URLs from chat.qwen.ai to qwen.ai per issue #572
2026-04-22 10:32:28 +07:00
decolua
d8c0a7ef44 refactor: enhance MITM server path resolution and ensure runtime server copy 2026-04-22 10:23:31 +07:00
Anurag Saxena
f825a523ab
fix: add clipboard fallback for navigator.clipboard unavailable contexts (closes #696) (#699) 2026-04-22 10:12:55 +07:00
Dmitriy
850766d54f
fix: handle undefined navigator.clipboard with fallback (#697)
- Add optional chaining check for navigator.clipboard
- Fallback to textarea + execCommand for SSR/non-HTTPS contexts
- Fixes TypeError when clipboard API is unavailable

Co-authored-by: Дмитрий Золотарь <d.zolotar@solarl.ru>
2026-04-22 10:12:30 +07:00
Luan Dias
afc4c308bb
fix: keep play_arrow spinning instead of switching to sync/progress_activity (#715)
The sync icon has counter-clockwise arrows by design, making the spin
animation appear counter-clockwise even though CSS rotates clockwise.
Keep play_arrow as the icon in both loading and idle states so the
clockwise spin is visually unambiguous.
2026-04-22 10:01:14 +07:00
decolua
6ab9927a28 fix: update backoff configuration and improve CLI detection messages
- Added installation guides for manual configuration in DroidToolCard.js and other tool cards to assist users in setting up the necessary CLI tools.
2026-04-17 12:54:50 +07:00
Anurag Saxena
877b7446bb
fix: enable Codex Apply/Reset buttons when CLI is installed (closes #591) (#606) 2026-04-17 12:23:02 +07:00
Anurag Saxena
f27db5429d
fix: show manual config option when Claude CLI detection fails (closes #589) (#602) 2026-04-17 12:21:21 +07:00
Anurag Saxena
dac6c3962a
fix: ensure LocalMutex acquire returns release callback correctly (closes #569) (#616) 2026-04-17 12:20:11 +07:00
decolua
3977edc460 Enhance error formatting to include low-level cause details, update HeaderMenu to use MenuItem component for better structure, and improve LanguageSwitcher to support controlled open state. Update subproject commit status. 2026-04-17 12:15:10 +07:00
decolua
75c4598da0 Add marked package, update Qwen executor for OAuth handling, and enhance changelog styles 2026-04-17 12:15:10 +07:00
decolua
75ad0bef8e Refactor error handling and localDb structure, and fix usage tracking bug. 2026-04-17 12:15:10 +07:00
Anurag Saxena
3badf1cbb6
fix: add Blackbox AI as a supported provider (closes #599) (#630)
* fix: add multi-model support for Factory Droid CLI tool (closes #521)

* Add Claude Opus 4.7 to cc and cl provider lists

RESEARCH confirmed GA release April 16, 2026. Adding to:
- cc (Claude Code): claude-opus-4-7
- cl (Cline): anthropic/claude-opus-4.7

Refs: TICKET-20260416-ENG-O4.7-001

* fix: add Blackbox AI as a supported provider (closes #599)
2026-04-17 12:06:00 +07:00
Anurag Saxena
1d872ce254
fix: add multi-model support for Factory Droid CLI tool (closes #521) (#618) 2026-04-17 12:04:46 +07:00
Anurag Saxena
63dbf89207
fix: show manual config option when OpenClaw detection fails (closes #579) (#615) 2026-04-17 12:04:14 +07:00
decolua
b669b6ffc1 Refactor error handling to config-driven approach with centralized error rules
Made-with: Cursor
2026-04-15 11:46:47 +07:00
Dang Dinh Quan
b1288c5064
* feat(kiro): wire aws identity center device flow into provider oauth (#587)
* feat(kiro): wire aws identity center device flow into provider oauth

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
2026-04-15 11:44:46 +07:00
decolua
224981d537 Fix bug 2026-04-14 12:51:23 +07:00
decolua
6bec1e085b Enhance Windows Tailscale installation process by adding support for curl and verifying installation success. Update fallback mechanism for Tailscale binary to include well-known Windows path. 2026-04-14 11:52:52 +07:00
decolua
1fa05eb2ab Refactor execSync and spawn calls to include windowsHide option for better compatibility on Windows environments. 2026-04-14 11:48:59 +07:00
decolua
04cdb75839 Add proactive token refresh lead times for providers and implement Codex proxy management 2026-04-14 11:41:06 +07:00
decolua
4bff21cb80 Enhance CodexExecutor with compact URL support 2026-04-14 10:18:27 +07:00
decolua
6a6e2fcd77 Fix : noAuth support for providers and adjusted MITM restart settings. 2026-04-14 10:14:50 +07:00
decolua
41c079baba - Improved dashboard access control by blocking tunnel/Tailscale access when disabled. 2026-04-13 17:38:09 +07:00
decolua
96ddec822d Fix Bug 2026-04-13 16:49:34 +07:00
decolua
3b1a608e8d Fix codex cache session id 2026-04-13 15:52:01 +07:00
decolua
4c28a1671d Enhance provider models and chat handling with new thinking configurations 2026-04-13 12:04:57 +07:00
decolua
ee1271b6fd Update GitHub Actions workflow for Docker image 2026-04-13 10:30:33 +07:00
decolua
89eb26dee2 Enhance proxy functionality with Vercel relay support 2026-04-13 10:08:24 +07:00
decolua
b3feb96740 Enhance TTS functionality and security settings
- Integrated Google TTS languages from a separate module for better maintainability.
- Updated local device voice fetching to support both macOS and Windows, improving cross-platform compatibility.
- Enhanced dashboard route protection by adding dynamic settings for login requirements and tunnel access.
- Introduced UI elements for managing security settings related to API key requirements and dashboard access via tunnel.
- Added default TTS response example in the media provider page for better user guidance.
- Updated constants to reflect changes in TTS provider configurations.

This commit improves the overall user experience and security of the TTS features.
2026-04-11 14:56:35 +07:00
decolua
ed17a8ffac Feat : Tailscale 2026-04-11 11:36:33 +07:00
Omar Nahhas Sanchez
838d9a7a04
fix: add 5s timeout to fetchCompatibleModelIds and skip upstream connections (#541)
The fetchCompatibleModelIds() function had no timeout on its fetch() call,
causing /v1/models to hang indefinitely when an openai-compatible provider
was unreachable or slow to respond.

Additionally, upstream/cross-instance connections (provider IDs containing
a UUID suffix like openai-compatible-chat-XXXXXXXX) would trigger recursive
/models fetches between instances, creating infinite loops.

Fixes:
- Add AbortController with 5-second timeout to the fetch() call
- Skip dynamic model fetching for upstream/cross-instance connections
  (detected by UUID suffix pattern in provider ID)
- Existing try/catch already handles abort errors gracefully

Co-authored-by: Agent Zero <agent@agent-zero.local>
2026-04-10 10:30:07 +07:00
raccoonwannafly
f8a267746a fix: enable Apply button when models are selected
Fix button state condition - check selectedModels.length instead of selectedModel.

Co-authored-by: raccoonwannafly <130273473+raccoonwannafly@users.noreply.github.com>
Made-with: Cursor
2026-04-10 10:27:21 +07:00
decolua
1a25c6e3b5 feat: multi-model support for OpenCode CLI config with subagent integration
- Allow selecting multiple models for 9router provider
- Merge models instead of overwriting (backwards-compatible)
- Support setting active model via click or Apply
- Click active model to clear default (model = '')
- Remove individual models via X button (persists to config)
- Add PATCH endpoint for clearing active model
- Update GET to return normalized model list
- Preserve subagent model configuration for explorer subagent

Made-with: Cursor
2026-04-10 10:22:42 +07:00
decolua
3c96e8d6d1 Feat : tts 2026-04-10 10:17:53 +07:00
decolua
39545cf4c8 Fix combo modal 2026-04-09 10:16:11 +07:00
decolua
507a5dbfea fix: OpenRouter custom models not showing after being added 2026-04-08 16:51:23 +07:00
tuanaiseo
1f3d3a8f7f
fix(security)(app): unauthenticated server shutdown endpoint enables d (#519)
The shutdown API calls `process.exit(0)` on POST without any authentication or authorization checks. Any party that can reach this endpoint can terminate the server process, causing immediate service disruption.

Affected files: route.js

Signed-off-by: tuanaiseo <221258316+tuanaiseo@users.noreply.github.com>
2026-04-08 15:39:09 +07:00
Payne
32a746181a
fix: update Cursor client version to 3.1.0 for Composer 2 compatibility (#525)
Cursor's API now rejects requests with outdated client versions,
returning [400]: Update Required for Composer 2. Bump
x-cursor-client-version from 2.3.41 to 3.1.0 across all three
locations where it is set.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 15:37:51 +07:00
decolua
00448b389b Fix bug 2026-04-07 11:35:25 +07:00
decolua
401772cb9a Fix bug strip image 2026-04-07 10:18:59 +07:00
decolua
fca829aa2a Fix bug 2026-04-06 17:36:04 +07:00
decolua
307be3b63d Fix bug 2026-04-06 17:32:44 +07:00
Anurag Saxena
7db4b9834e
fix: make API key optional for ollama-local provider validation (closes #492) (#493) 2026-04-06 15:10:15 +07:00
thuanhuynhh
ebb8d4eeb6
Cập nhật /v1/models hỗ trợ OpenAI/Anthropic Compatible (#497)
Sửa lỗi /v1/models chỉ biết lấy model từ danh sách tĩnh hoặc từ providerSpecificData.enabledModels. Với API Key Compatible Providers, endpoint test /api/providers/<id>/models vẫn lấy được model động từ upstream, nhưng /v1/models lại không fallback sang danh sách động đó. Ngoài ra alias trả ra cũng đang dùng providerId nội bộ thay vì prefix trong cấu hình.

Đã fix để OpenAI/Anthropic Compatible dùng đúng prefix làm alias public nếu chưa có enabledModels, /v1/models sẽ tự fetch động từ upstream /models
2026-04-06 15:09:58 +07:00
Manuel B.
6ec5890283
fix(github): sync top-level copilotToken after proactive refresh (#507)
checkAndRefreshToken() updated providerSpecificData.copilotToken but
not the top-level creds.copilotToken. GithubExecutor.buildHeaders()
reads the top-level key, so every request after a proactive refresh
still sent the expired token, causing 401 "IDE token expired".

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 15:02:09 +07:00
decolua
57cfaccceb Fix ModelSelectModal 2026-04-05 21:25:00 +07:00
decolua
333e704b2a MODEL_CAPS 2026-04-04 23:24:24 +07:00
decolua
5448eedbdd Feat : embedding dev 2026-04-04 15:07:07 +07:00
decolua
341a1c6490 Fix Model Price 2026-04-04 14:40:49 +07:00
decolua
d84489dba4 - Introduce default MITM router base URL and update related components to handle it.
- Add input for MITM router base URL in MitmServerCard component.
2026-04-04 11:25:58 +07:00
Anurag Saxena
2e740ad7e4
fix: pass isFree prop to ModelRow for custom models (closes #461) (#480) 2026-04-04 08:53:11 +07:00
Anurag Saxena
7f4f75a807
fix: pass HOME explicitly in sudo inlineCmd so MITM server resolves correct data dir (closes #478) (#482) 2026-04-04 08:52:31 +07:00
Anurag Saxena
006c337de5
fix: use which instead of command -v for openclaw CLI detection (closes #457) (#489) 2026-04-04 08:49:59 +07:00
decolua
93b8668e9e Fix AG 2026-04-01 11:48:38 +07:00
decolua
9708541f6d Fix bug 2026-03-31 15:44:19 +07:00
Vishal Raj V
8640503b36
feat(kilo): fetch free models from Kilo API + Windows build fixes (#455)
- Add /api/providers/kilo/free-models endpoint with 1hr cache
- Fetch and merge Kilo free models with hardcoded models for kilocode provider
- Display 'Free' badge on models fetched from Kilo API
- Fix Windows build: add cross-env, remove --webpack flag, add turbopack config
- Add outputFileTracingExcludes for Windows system directories
2026-03-31 09:22:21 +07:00
kwanLeeFrmVi
054facb08b fix(gemini): preserve thoughtSignature via tool_call ID smuggling + fix ELOCKED mutex
- Encode thoughtSignature into tool_call.id using _TSIG_ delimiter and base64url
- Decode _TSIG_ on request to restore thoughtSignature for Gemini multi-turn thinking
- Track pendingThoughtSignature across parts for deferred signature attachment
- Add LocalMutex (2-layer locking) to prevent ELOCKED on concurrent DB access
- Increase lockfile retries from 5 to 15 for multi-process robustness
- Restore db.json seed on first run to prevent ENOENT on lockfile.lock
- Use process.env.BASE_URL fallback in models test route
- Remove gemini-3-flash-lite-preview from provider models

Co-authored-by: kwanLeeFrmVi <quanle96@outlook.com>
Closes #450

Made-with: Cursor
2026-03-30 16:57:28 +07:00
kwanLeeFrmVi
1c160cc8d9 feat(claude-code): spoof TLS fingerprint and stabilize headers for Anthropic
- Add claudeHeaderCache.js to intercept and cache live Claude Code client headers
- Forward cached headers dynamically to api.anthropic.com via default.js
- Strip first-party identity headers (x-app, claude-code-* beta) for non-Anthropic upstreams
- Validate and sanitize tool call IDs to match Anthropic pattern (^[a-zA-Z0-9_-]+$)
- Skip thinking blocks when applying cache_control; fix max_tokens buffer (+1024)
- Strip cache_control from thinking blocks in openai-to-claude translator
- Comment out thoughtSignature in Gemini translator (kept for reference)
- Expand .gitignore to match all deploy*.sh variants

Co-authored-by: kwanLeeFrmVi <quanle96@outlook.com>
Closes #433

Made-with: Cursor
2026-03-30 16:27:28 +07:00
decolua
e6299eef56 Fix Bug 2026-03-30 12:21:24 +07:00
decolua
abbf8ec86f feat: add GitLab Duo and CodeBuddy support, update observability settings 2026-03-30 11:28:07 +07:00
decolua
bf99c600f1 Fix Bug 2026-03-27 11:45:54 +07:00
Anurag Saxena
fcc8320753
feat: add OpenCode provider support (#387)
Adds OpenCode (https://github.com/opencode-ai/opencode) as a supported
provider. OpenCode is an open-source terminal AI coding assistant with
an OpenAI-compatible API running locally.

Changes:
- open-sse/config/providers.js: add opencode baseUrl (localhost:4096)
  with openai format (fully compatible, no custom headers needed)
- open-sse/services/model.js: add 'oc' alias → opencode
- src/shared/constants/providers.js: add opencode to subscription
  providers with alias 'oc', icon 'terminal', color #E87040

Usage after setup: use model prefix 'oc/<model>' to route through
a running OpenCode instance (e.g. oc/claude-sonnet-4-5).

Closes #378
2026-03-27 11:17:23 +07:00
decolua
3f47038933 fix: rename tunnelUrl to tunnelPublicUrl for clarity in CLIToolsPageClient 2026-03-27 11:03:49 +07:00
Anurag Saxena
a6c764d772
fix: use better-sqlite3 for Cursor auto-import, drop sqlite3 CLI requirement (closes #395) (#411) 2026-03-27 10:45:11 +07:00
Anurag Saxena
2f0fd348c5
fix: add deprecation warning for Gemini CLI provider (closes #362) (#406) 2026-03-27 10:41:35 +07:00
decolua
8759545260 chore: add proper-lockfile for safe database read/write operations and implement retry logic for file access 2026-03-27 10:31:35 +07:00
decolua
3059df4014 chore: - Adjust opacity settings for ConnectionRow to improve user experience. 2026-03-26 10:48:53 +07:00
decolua
8df8b94180 Enhance image support in Kiro for Claude models. Update the message conversion logic to conditionally handle image types based on model capabilities. Additionally, hide the Basic Chat option in the sidebar for a cleaner UI. 2026-03-23 12:29:48 +07:00
decolua
0c9ad12055 Fix : Fix error 400 2026-03-23 12:05:22 +07:00
Ibrahim Ryan
8312af79a4 fix(cursor): verify Cursor installation on Linux before auto-import
On Linux, verify that Cursor IDE is actually installed before importing
tokens. Previously, leftover config files from a removed Cursor installation
would trigger a false positive, creating a phantom Cursor provider connection.

The check uses `which cursor` and falls back to checking for a .desktop file
in ~/.local/share/applications/

Fixes #313

Co-authored-by: Ibrahim Ryan <ryan@nuevanext.com>
Made-with: Cursor
2026-03-23 10:31:48 +07:00
Ryan
97f2a00e74
fix: test Codex connection against actual endpoint (#347)
Change Codex test from token-expiry-only check to probing the real
Codex API endpoint. Sends a minimal request body that triggers a fast
400 without consuming quota. A 400 confirms auth works; only 401/403
indicates a bad token.

Also adds generic acceptStatuses support to the OAuth test framework
so other providers can define non-200 success statuses.
2026-03-23 10:29:28 +07:00
Ryan
1ed6c4c76f
fix: prevent duplicate model aliases on import (#340) 2026-03-23 10:27:50 +07:00
Ryan
037d013af8
fix: skip disabled providers in combo fallback instead of returning 406 (#336)
When a provider has credentials but all are disabled, return 404 (NOT_FOUND)
instead of 400 (BAD_REQUEST). The combo handler already treats 404 as a
fallbackable error, so it will skip to the next model in the chain.

Previously, the 400 status caused the combo to stop with a hard error,
killing the client (e.g., Claude Code) even though other models in the
combo chain were available.

Also changed log level from error to warn since disabled credentials
are an expected configuration state, not an error.

Fixes #334
2026-03-23 10:25:35 +07:00
decolua
3e694a383f feat(combos): add per-combo round-robin strategy
Add ability to configure round-robin strategy for individual combos,
similar to per-provider strategy overrides.

Changes:
- Add comboStrategies setting to store per-combo strategy overrides
- Add Round Robin toggle to each combo card in combos page
- Update chat handler to check combo-specific strategy before global
- Combo-specific strategy takes precedence over global comboStrategy

When enabled, each request to that combo will cycle through providers
instead of always starting with the first one.

Made-with: Cursor
2026-03-23 10:08:24 +07:00
bitgineer
96f5e5c92a
Add combo round-robin strategy to distribute load across providers (#390)
- Add comboRotationState Map to track rotation per combo
- Add getRotatedModels() to rotate model order based on strategy
- Pass comboName and comboStrategy to handleComboChat()
- Add comboStrategy setting (default: fallback)
- Add UI toggle for Combo Round Robin in profile settings

When enabled, each request to a combo starts with a different provider
instead of always starting with the first one, distributing load evenly.

Co-authored-by: Antigravity Agent <antigravity@example.com>
2026-03-23 09:52:31 +07:00
Nguyễn Trung Hiếu
6b0cced884 feat(ui): add Basic Chat interface for testing models
Add a simple chat UI to the dashboard for quickly testing AI models from
connected providers. Features include:
- Model picker from all connected providers
- Streaming chat responses
- Image attachment support
- Session history with localStorage persistence
- Responsive design with dark theme

Note: Removed build.sh from original PR as it contained syntax errors and
was unrelated to the chat UI feature.

Co-authored-by: Nguyễn Trung Hiếu <140531897+bonelag@users.noreply.github.com>
Made-with: Cursor
2026-03-23 09:45:04 +07:00
Loc Nguyen Huu
8c0b4a3e84
[fix] fix mitm for docker and enhance dockerfile (#381)
* [fix] macos

* chore: clean up .gitignore by removing unnecessary start.sh entry

---------

Co-authored-by: lokinh <locnh@uniultra.xyz>
2026-03-23 09:23:14 +07:00
Andrew Peltekci
3f852775c6
fix(cursor): remove sql.js dependency from auto-import route (#368)
* fix(usage): track lifetime request total beyond history cap

* fix(ui): restore provider assets and model availability endpoint

* fix(cursor): remove sql.js dependency from auto-import route
2026-03-23 09:17:42 +07:00
Andrew Peltekci
9fe4726f34
fix(ui): restore provider assets and model availability endpoint (#367)
* fix(usage): track lifetime request total beyond history cap

* fix(ui): restore provider assets and model availability endpoint
2026-03-23 09:16:10 +07:00
Andrew Peltekci
5fedcad624
fix(usage): track lifetime request total beyond history cap (#366) 2026-03-23 09:14:01 +07:00
decolua
c8d2497423 refactor: update MitmServerCard and MitmToolCard to use modalError instead of message for error handling
- Replaced message state with modalError in both components for better error management.
- Removed unused message display logic and adjusted action handling to improve clarity.
- Enhanced error handling in doAction and doDnsAction functions to ignore errors gracefully.
- Updated API call responses to streamline user feedback on actions.
2026-03-20 12:44:20 +07:00
decolua
6af8043f2a Fix Tunnel 2026-03-20 00:26:01 +07:00
decolua
80583e203d Fix : Tunnel 2026-03-19 23:47:13 +07:00
decolua
f1c53a319e refactor: update MITM bypass logic and enhance combo name validation 2026-03-19 22:47:32 +07:00
Anurag Saxena
a0500dfc85
feat: add MiniMax M2.7 model support (#357)
Add MiniMax-M2.7 to provider models and pricing config alongside
existing M2.5. M2.7 is the latest reasoning model with 204K context.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 15:34:36 +07:00
decolua
fd4ec9e5b8 - Enhance passthrough function to support response inspection
- Add cursor tool configuration and update related components
2026-03-19 15:32:29 +07:00
decolua
9877f32efa update submodule: dev pointer to latest
Made-with: Cursor
2026-03-17 16:14:29 +07:00
decolua
03ff35100d Feat : Kiro MITM 2026-03-17 16:12:25 +07:00
decolua
065761268c Feat : Kiro MITM 2026-03-17 16:11:58 +07:00
B1nh M1nh
6546b162cc Make API key optional for MITM server
- Remove hard exit when ROUTER_API_KEY is missing
- Conditionally attach Authorization header only if API_KEY is set
- Allow MITM auto-start without requiring an active API key
- Fallback to default key when no active key is found

Made-with: Cursor
2026-03-17 09:38:19 +07:00
Peter Steinberger
11c6b0c42f Add multi-language support for UI
- Add 30 new locale files (ar, bn, cs, da, de, el, es, fi, fr, he, hi, hu, id, it, ja, ko, nl, no, pl, pt-BR, pt-PT, ro, ru, sv, th, tl, tr, uk, ur, zh-TW)
- Update i18n config to register new languages
- Update LanguageSwitcher component to support expanded language list
- Update localDb and pricing constants for i18n compatibility

Made-with: Cursor
2026-03-17 09:30:07 +07:00
decolua
62d7e61907 Fix MITM window 2026-03-16 09:27:26 +07:00
moophat
65af4328fd
Add optional modelID input for custom API Key Providers testing (#315)
* feat: add modelId fallback for provider validation

- If /models endpoint unavailable, validate via /chat/completions
- Add optional Model ID input in EditCompatibleNodeModal
- Improves compatibility with providers lacking /models endpoint

* feat: improve provider validation with modelId fallback

- Add Model ID input for chat/completions fallback validation
- Reorder UI: API Key → Model ID → Check button + Badge
- Display detailed BE error messages in FE
- Add status-specific error handling (401/403/400/404/5xx)
- Add unit tests for error message helpers
- Add vitest devDependency
2026-03-16 09:21:05 +07:00
decolua
1dd5d60724 Fix : MITM 2026-03-14 23:59:22 +07:00
decolua
f264bb9a23 Refactor error logging to provide clearer context on provider failures 2026-03-14 17:08:11 +07:00
decolua
b98f4ce20e refactor: Fix MITM 2026-03-14 16:38:44 +07:00
decolua
877eea8ebe chore: Update package version to 0.3.51 and improve connection handling in API route 2026-03-14 11:56:29 +07:00
Quan
39f651f5be feat: Add Google Cloud Vertex AI provider support (vertex, vertex-partner)
Co-authored-by: Quan <quanle96@outlook.com>
PR: https://github.com/decolua/9router/pull/298

Thanks to @kwanLeeFrmVi for the original implementation. Here is a summary
of changes made during review integration:

- Replaced google-auth-library with jose (already a project dependency)
  for SA JSON -> OAuth2 Bearer token minting (RS256 JWT assertion flow)
- Moved auth logic (parseSaJson, refreshVertexToken, token cache) from
  executor into open-sse/services/tokenRefresh.js to match project pattern
- Fixed executor to use proxyAwareFetch instead of raw fetch (proxy support)
- Simplified buildUrl: use global aiplatform.googleapis.com endpoint for
  both vertex (Gemini) and vertex-partner; removed region/modelFamily fields
- Added auto-detection of GCP project_id from raw API key via probe request
  (vertex-partner only, cached per key)
- Added vertex/vertex-partner cases to /api/providers/validate/route.js
- Updated model lists based on live testing:
  - vertex: gemini-3.1-pro-preview, gemini-3.1-flash-lite-preview,
    gemini-3-flash-preview, gemini-2.5-flash (removed gemini-2.5-pro: 404)
  - vertex-partner: deepseek-v3.2, qwen3-next-80b (instruct+thinking),
    glm-5 (removed Mistral/Llama: not enabled in test project)
  - gemini provider: added gemini-3.1-pro-preview, gemini-3.1-flash-lite-preview
- Removed bun.lock (project uses npm/package-lock.json)
- Removed region and modelFamily UI fields (global endpoint, auto-detect)
- Kiro token auto-refresh on AccessDeniedException (from commit 2)

Made-with: Cursor
2026-03-14 11:37:23 +07:00
decolua
adae2605bf Feat : Auto restart after crash 2026-03-14 09:37:29 +07:00
decolua
399adca63d feat: Add support for local Ollama Local provider 2026-03-13 10:22:59 +07:00
decolua
373b10ebb5 feat(chat): Enhance bypass handling and introduce CC filter naming feature
Fix : Ollam Provider response
2026-03-13 09:41:40 +07:00
decolua
b0c6b61398 Refactor config 2026-03-12 16:20:46 +07:00
decolua
8223c87988 feat(memory-management): Introduce MEMORY_CONFIG for session and DNS management, including session TTL, cleanup intervals, and proxy dispatcher limits. 2026-03-12 15:57:21 +07:00
decolua
372b985ee9 fix(translator): Ensure loading state is reset after error handling in TranslatorPage 2026-03-12 15:45:41 +07:00
decolua
32e3980a13 feat(ollama): Add Ollama provider support with models and configuration, including API endpoints and UI updates. 2026-03-12 15:24:02 +07:00
decolua
a224f68e5c feat(kimi-coding): Added Kimi Coding to the list of supported OAuth providers with specific configuration. 2026-03-12 10:48:11 +07:00
decolua
f1bf027c68 feat(usage): claude quota tracker 2026-03-12 09:42:17 +07:00
decolua
fe49b61dfb feat: - Introduced per-provider strategy overrides in settings, allowing for more flexible connection management.
- Added new provider models: DeepSeek 3.1, DeepSeek 3.2, and Qwen3 Coder Next.
- Implemented UI changes to support round-robin strategy with sticky limits in the provider detail page.
- Improved logging to display connection names instead of IDs for better clarity.
2026-03-11 18:04:38 +07:00
Hưng Nguyễn
2470ef84de
feat: add confbox dependency and refactor TOML parsing in codex settings (#282)
fix: update JSDoc for refreshAndUpdateCredentials return type
2026-03-11 17:00:49 +07:00
decolua
d9dad5bcf3 Fix : Add custom to model selector 2026-03-11 11:59:07 +07:00
decolua
a501c05969 fix(api): improve access token handling during credential refresh 2026-03-10 16:38:32 +07:00
Hồ Khánh Duy
10b22d1318
update: claude code (cc) models pricing (#275) 2026-03-09 23:40:37 +07:00
vothaianh
076e70c5a6 refactor(providers): simplify proxy UX — hover button + inline dropdown, remove selection toolbar
Made-with: Cursor
2026-03-09 17:17:59 +07:00
decolua
8c8eeecc70 refactor: replace better-sqlite3 with lowdb for request details storage
- Removed better-sqlite3 dependency and implemented lowdb for JSON-based storage.
- Updated observability settings handling and configuration retrieval.
- Cleaned up unused observability settings UI components in ProfilePage.
- Adjusted contributors badge display in README for better visibility.
2026-03-09 16:50:18 +07:00
apeltekci
29f3e1894e fix(cline): use workos auth token shape
Made-with: Cursor
2026-03-09 16:21:29 +07:00
huynhquangtoan
89405125e6 fix(proxyTest): improve error handling and update default test URL
Made-with: Cursor
2026-03-09 15:52:36 +07:00
decolua
9bca03bff7 chore: Delete the proxy pools migration API route.
Made-with: Cursor
2026-03-09 15:49:18 +07:00
Peter Steinberger
f94ac213b5 fix: avoid lost writes by running bulk proxy pool updates sequentially against JSON db
Made-with: Cursor
2026-03-09 15:48:21 +07:00
decolua
880f4eca91 feat(proxy): add proxy pool and per-connection binding + strictProxy support
- Centralize proxy management with reusable proxy pools
- Per-connection proxy binding with legacy fallback
- Add strictProxy option: fail hard instead of silently falling back to direct
- Resolve alicode-intl conflict: keep alicode-intl support + proxy support

Made-with: Cursor
2026-03-09 15:46:06 +07:00
Andrew Peltekci
4c469291a1
fix(test): support cline and kilocode oauth checks (#258) 2026-03-07 11:10:53 +07:00
decolua
758224749d Feat : Add support for the new "alicode-intl" provider 2026-03-07 10:08:55 +07:00
mxskeen
97860a0629 fix: custom model compatibility with antigravity/mitm (PR #250) 2026-03-06 16:44:16 +07:00
decolua
d347de8092 feat: enhance translator functionality and UI 2026-03-06 16:26:33 +07:00
decolua
cd6962c7a2 feat: implement batch processing for README translation
- Introduce BATCH_SIZE configuration for parallel language translation
- Update translation logic to process languages in batches with a delay to avoid rate limits
- Enhance logging to display current batch being processed

Also, add a new TimeAgo component for auto-updating time display in UsageStats.
2026-03-06 12:18:30 +07:00
eachann
afb83f4563 feat: add runtime i18n with English, Vietnamese, and Simplified Chinese support
- Implement runtime i18n using MutationObserver for automatic DOM translation
- Add language switcher dropdown in dashboard header (EN/VI/ZH)
- Support 3 languages: English (default), Tiếng Việt, 简体中文
- Add translation files: vi.json (197 entries), zh-CN.json (513 entries, cleaned)
- Translate dashboard UI: sidebar menu, header, settings, MITM page
- Use cookie-based locale persistence with /api/locale endpoint
- Zero component changes required - translations applied at runtime
- Fix Header flicker on route change with key={pathname}

Co-authored-by: eachann <each1024@qq.com>
Based on PR #247 from decolua/9router with runtime approach

Made-with: Cursor
2026-03-06 10:57:42 +07:00
decolua
b7b4ac5592 Fix bug 2026-03-06 09:59:15 +07:00
decolua
75f486b7a2 Added profile ARN handling in OAuth provider mapping and improved polling logic in OAuth modal for better user experience. 2026-03-06 00:21:27 +07:00
decolua
f4e08fcd16 Fix : MITM 2026-03-05 21:13:09 +07:00
decolua
1c3ba6ef69 - Enhanced the description of how the MITM server operates with a clearer flow of information. 2026-03-05 14:59:40 +07:00
maskeen
85ddb4753c
fix: show API Key Compatible providers in Antigravity CLI Tools model selector (#241) 2026-03-05 14:47:22 +07:00
decolua
573b0f0241 - Refines the overall structure of the CLI tools and MITM server functionalities.
- Add buildQwenBaseUrl function to construct URLs for Qwen resources.
- Update buildProviderUrl to support Qwen model requests.
- Enhance token refresh logic to include provider-specific data for Qwen.
- Refactor CLI Tools page to exclude MITM tools and streamline model retrieval.
- Introduce new components for MITM server management.
- Update API routes to handle Qwen-specific resource URLs and improve error handling.
2026-03-05 11:25:03 +07:00
decolua
7195fee2f6 Refactor UsageChart and UsageStats components to support dynamic period selection 2026-03-03 16:19:44 +07:00
decolua
11b2fcd643 Fix Antigravity OAuth 2026-03-03 16:01:10 +07:00
decolua
f2306e6962 Fix MITM 2026-03-03 15:52:20 +07:00
decolua
07d4cdfa7e Fix : Claude OAuth 2026-03-03 14:46:05 +07:00
decolua
38ded5c62f feat(cli-tools): add OpenCode tool integration to CLI Tools page 2026-03-03 11:04:56 +07:00
decolua
03fc685f72 Add OpenCode CLI 2026-03-03 10:10:03 +07:00
decolua
bfd9614fa2 - Add new "Quota Tracker" item to the sidebar navigation. 2026-03-03 09:53:30 +07:00
Thiên Toán
4e92a66379
fix(auth): wire up dashboard auth guard as Next.js proxy (#227)
Dashboard routes were accessible without authentication because
dashboardGuard.js was not connected to Next.js middleware pipeline.

Created src/proxy.js to export the auth guard using Next.js 16
proxy convention. Now /dashboard routes properly redirect to
/login when auth_token cookie is missing or invalid.
2026-03-02 15:21:50 +07:00
Владимир Акимов
0c832c9c59
feat(gemini): convert OpenAI SSE to Gemini SSE format in /v1beta/models route (#225)
* fix(translator): filter nameless hosted tools when converting Responses API to Chat format

Codex CLI sends "hosted" tools (e.g. `request_user_input`) via the OpenAI
Responses API. These tools have no explicit `name` field. The previous
`body.tools.map()` pass propagated `name: undefined` into the resulting
Chat Completions function declarations, which then became anonymous
`functionDeclarations` after the OpenAI→Gemini translation step.

Gemini strictly requires every function declaration to have a valid name
and rejects the entire request with:

  GenerateContentRequest.tools[0].function_declarations[4].name:
  Invalid function name. Must start with a letter or an underscore.

Fix: filter out any Responses API tool that lacks a non-empty `name`
string before converting to `{ type: "function", function: { name, ... } }`.
Named function tools are unaffected; only unnamed hosted tools are skipped.

Fixes: Gemini 400 error when Codex CLI is routed through 9router.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(gemini): convert OpenAI SSE to Gemini SSE format in /v1beta/models route

The @google/genai SDK always uses :streamGenerateContent?alt=sse for chat
and expects Gemini SSE chunk format. The upstream handleChat returns OpenAI
SSE format, causing the SDK to crash on the [DONE] sentinel.

Changes:
- Add transformOpenAISSEToGeminiSSE() using TransformStream that converts
  each OpenAI SSE chunk (choices[0].delta) to Gemini SSE format
  (candidates[0].content.parts) on the fly
- Drop the OpenAI [DONE] sentinel (Gemini SSE ends by stream close)
- Map finish_reason -> finishReason, attach usageMetadata on final chunk
- Support reasoning_content -> thought: true parts for thinking models
- Refactor finishReasonMap to shared FINISH_REASON_MAP constant
- Fix streaming dispatch: stream=true now calls transformOpenAISSEToGeminiSSE
  instead of passing OpenAI SSE through raw

Fixes: SyntaxError: "[DONE]" is not valid JSON in Gemini CLI

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-02 09:36:08 +07:00
decolua
4903a9b2cb Feat : console log 2026-03-02 09:31:16 +07:00
decolua
50990e84b4 Fix AG MITM 2026-03-01 18:40:55 +07:00
decolua
a7365c5a4e Fix : Codex on cursor 2026-03-01 15:35:41 +07:00
decolua
a84477e815 chore: update version and enhance dashboard components
- Add a warning message for Windows users in AntigravityToolCard to run the terminal as Administrator for MITM functionality.
- Refactor model testing logic in ProviderDetailPage to improve state management and user experience.
- Introduce new version notification in Sidebar for available updates.
2026-02-28 16:33:18 +07:00
decolua
2f4b813c5b feat(usage): implement timeout and error handling for antigravity usage and subscription requests
- Add a 10-second timeout for fetch requests in getAntigravityUsage and getAntigravitySubscriptionInfo functions.
- Include error logging for fetch failures in both functions.
- Update headers to include "x-request-source" for MITM bypass.
- Enhance proxyFetch with DNS resolution and MITM bypass capabilities.
- Ensure proxyFetch is loaded in the API route for proper fetch patching.
2026-02-28 12:12:49 +07:00
decolua
04ba66bc1e chore: Refactor CursorAuthModal to handle manual instructions for Windows users. 2026-02-28 12:12:49 +07:00
Thiên Toán
d1ce98ca8a
feat: add API key visibility toggle in Endpoint dashboard (#214)
- Added eye icon button to show/hide individual API keys
- Keys hidden by default on page load for security
- Copy button always copies full key regardless of visibility state
- Implemented per-key visibility state with React useState
- Added maskKey helper to display first 8 characters + "..."
- Clean up visibility state when keys are deleted

Improves security and UX when managing API keys in the dashboard.
2026-02-28 11:07:51 +07:00
gen
5a015e5b4d feat(proxy): add outbound HTTP proxy support for OAuth + provider requests
- Patch Node fetch via undici ProxyAgent when HTTP_PROXY/HTTPS_PROXY/ALL_PROXY is set
- Ensure proxy patch is loaded for both chat pipeline and OAuth token exchange
- Add Dashboard Settings → Network to edit outbound proxy and apply immediately
- Persist outbound proxy settings in local db and initialize on server startup
- Move proxy helpers to src/lib/network/ for better structure
- Rename src/proxy.js → src/dashboardGuard.js to avoid naming confusion
- Re-apply proxy env after DB import
- Fix: close old dispatcher on proxy URL change to prevent connection pool leak
- Fix: idempotency guard to avoid patching globalThis.fetch multiple times

Made-with: Cursor
2026-02-28 10:11:53 +07:00
decolua
833069caac Fix MITM on window 2026-02-28 10:04:57 +07:00
decolua
5954b8f4eb - Refactor chatCore.js to streamline imports and remove unused functions.
- Fix streaming /v1/responses
2026-02-27 11:15:12 +07:00
decolua
25c2ad7360 feat: implement model lock functionality for connection management 2026-02-27 10:29:11 +07:00
BiuBiuHu
6e6ea7d97f feat: add Aliyun Bailian (alicode) provider support
- Add alicode provider with OpenAI-compatible API endpoint
- Support 8 models via Aliyun Bailian Coding Plan
- Add API key validation and connection testing
- Use getDefaultModel() instead of hardcoded model names

Co-authored-by: decolua <decoluadt@example.com>
Made-with: Cursor
2026-02-27 09:34:16 +07:00
decolua
0e285a9ed3 Merge branch 'pr-203' 2026-02-27 09:33:14 +07:00
decolua
9ae5487bc7 Fix antigravity 2026-02-27 09:17:49 +07:00
BiuBiu_Hu
d14c18f77f refactor: rename provider to alicode (Aliyun Coding)
Rename alicloud to alicode to clearly indicate Aliyun's Coding Plan service.

- Provider ID: alicode (short for Aliyun Coding)
- Model format: alicode/qwen3.5-plus
- Simplified mapping - no more bidirectional aliases

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 08:05:05 +08:00
BiuBiu_Hu
b0ec81f4a5 feat: add Alibaba Cloud Coding Plan support
Add support for Alibaba Cloud Bailian Coding Plan, a coding-focused AI service
that provides fixed monthly pricing for multiple models.

Changes:
- Add alicloud provider with OpenAI-compatible API endpoint
- Support 8 models: qwen3.5-plus, kimi-k2.5, glm-5, MiniMax-M2.5,
  qwen3-max, qwen3-coder-next, qwen3-coder-plus, glm-4.7
- Use "ali" as provider alias (ali/model format)
- Add API key validation and connection testing
- Add frontend provider definition with "ALi" text icon

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 07:58:40 +08:00
decolua
9003675b71 - Updated CLI tool components to accept initial status as a prop, improving state management for tool statuses.
- Added functionality to fetch and set statuses for various CLI tools (Claude, Codex, Droid, OpenClaw, Antigravity) on component mount.
- Enhanced error handling and logging in the OAuth provider test utilities and DNS management functions.
- Improved the MITM server to handle multiple target hosts and provide clearer error messages regarding port usage.
2026-02-25 16:32:05 +07:00
decolua
484e7025e8 feat: add ProviderDetailPage component for managing provider connections and models
- Introduced a new ProviderDetailPage component to handle provider-specific functionalities.
- Implemented state management for connections, loading states, and model selections.
- Added API calls for fetching provider connections and model aliases.
- Included modals for OAuth and API key management.
- Enhanced user experience with model selection and saving capabilities.
2026-02-25 16:31:40 +07:00
Mai Trung Tiến
3cf900a0a1
feat: add database backup import/export (#194) 2026-02-25 15:32:38 +07:00
Quan
07717bad60 feat: cherry-pick PR #183 — multi-provider support, PWA, dynamic models, UI improvements
Cherry-picked from decolua/9router PR #183.
Note: open-sse changes included but need further review due to extensive modifications.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-25 11:40:50 +07:00
decolua
147fc168f9 fix bug 2026-02-25 10:40:15 +07:00
Blade
091ad3fc5d
Fix: Add missing glm-cn provider definition for Web UI discovery (#186)
- Add glm-cn to APIKEY_PROVIDERS in src/shared/constants/providers.js
- Align with existing glm-cn model definitions in providerModels.js
- Users can now see and select GLM (China) option in Web UI
- Follows same pattern as minimax-cn (red color for China region)
2026-02-25 10:34:52 +07:00
decolua
8221f7c027 Fix MITM 2026-02-23 21:56:40 +07:00
decolua
d21f7aaadc Fix bug Tunnel 2026-02-22 21:44:11 +07:00
decolua
a5eb5a864e chore: add Gemini 3.1 Pro models to provider configurations 2026-02-22 15:20:24 +07:00
decolua
930e917092 chore: update version and enhance provider model configurations. 2026-02-22 11:30:43 +07:00
zx07
ea67742f2a
feat: implement real project ID fetching for Antigravity (#170)
* feat: implement Project ID service to fetch and cache real Project IDs from Google Cloud Code API

* fix: implement caching and cleanup for Project ID retrieval

* feat: add project ID invalidation and refresh logic after token updates

* refactor: remove unnecessary format changes

* feat: add on-demand project ID retrieval for antigravity requests
2026-02-21 23:15:18 +07:00
decolua
94c4320632 Fix 2026-02-21 23:06:55 +07:00
decolua
0baa299722 feat :
- Added tunnel
- Removed cloud feature
2026-02-21 16:42:46 +07:00
decolua
adf57aa0c9 Fixed Codex 2026-02-21 14:36:06 +07:00
decolua
f2025cc776 feat: add Gemini 3.1 Pro models to provider 2026-02-20 21:05:02 +07:00
decolua
985985e454 refactor: update Antigravity model configurations and pricing 2026-02-20 17:52:15 +07:00
decolua
3debf84b9a Add Providers 2026-02-20 17:05:46 +07:00
Aakash Thakkar
d7e06c3085
fix: improve cursor auto-import reliability on macOS (#161)
The macOS auto-import was failing with "Cursor database not found" even
when Cursor was installed and logged in. This was caused by a single
hardcoded path and no fallback when the DB file existed but couldn't be
opened (e.g. WAL lock, Insiders variant).

Changes (macOS only — linux/win32 paths are unchanged):
- Probe both standard and Insiders DB locations on macOS
- Return a descriptive error when the DB file exists but can't be opened
- Try multiple known key names for token and machine ID
- Add fuzzy key fallback for future Cursor schema changes
- Normalize JSON-encoded string values from the DB

Adds unit tests covering all new and existing behavior.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-20 15:07:43 +07:00
Thiên Toán
73388a02a1
feat: add pause/resume functionality for API keys (#158)
- Add isActive field to API key schema with migration
- Implement PUT /api/keys/[id] endpoint for toggle
- Update validation to reject paused keys (403)
- Add UI toggle controls with confirmation
- Ensure cloud sync preserves pause state
2026-02-20 15:07:12 +07:00
Thiên Toán
806bd4ae14
feat: add API endpoint dimension to usage statistics dashboard (#152)
- Tracks endpoints like /v1/chat/completions, /v1/messages, /v1/responses
- New sortable/groupable table in usage dashboard with expandable groups
- Enhanced usage database aggregation by endpoint + model + provider
- Added endpoint tracking to all saveRequestUsage/saveRequestDetail calls
- Maintains backward compatibility with existing data structure
2026-02-20 15:03:18 +07:00
decolua
e1e5a81613 feat: add GLM 5 and MiniMax M2.5 models to providerModels.js; add Claude Sonnet 4.6 to CLI tools 2026-02-20 14:44:53 +07:00
zx
a229d79158 feat(antigravity): initial steps for Antigravity anti-ban alignment
Cherry-picked from decolua/9router#141 (author: LinearSakana / zx <me@char.moe>)

- Implement client identity spoofing with numeric enums (ideType: 9, pluginType: 2)
- Add runtime platform detection for User-Agent and metadata
- Implement per-connection session ID caching (binary-compatible format)
- Add ANTIGRAVITY_HEADERS (X-Client-Name, X-Client-Version, x-goog-api-client)
- Add X-Machine-Session-Id header injection
- Align metadata/mode parameters across all Antigravity API calls
- Implement double injection for system prompt (raw + [ignore] wrapped)
- Rename internal anti-loop header to x-request-source for anonymity

Skipped: commit 6 (signature side-channel caching) — kept DEFAULT_THINKING_GEMINI_SIGNATURE
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-20 14:44:29 +07:00
zx07
f933dd9c61
feat: add Qwen3.5 Coder Model configuration (#156)
Co-authored-by: zx <me@char.moe>
2026-02-19 21:55:11 +07:00
EdamAmex
c4aa4247bd
feat: Add GPT 5.3 Codex to GitHub Copilot (#150)
* Add GPT-5.3 Codex model to providerModels.js

* Add pricing constants for gpt-5.3-codex
2026-02-19 12:10:34 +07:00
すずねーう
4e2a3f888c
feat: Add Claude Sonnet 4.6 to GitHub Copilot (#149)
* Add Claude Sonnet 4.6 to GitHub Copilot

Claude Sonnet 4.6 is available in GitHub Copilot now.
https://github.blog/changelog/2026-02-17-claude-sonnet-4-6-is-now-generally-available-in-github-copilot/

* Add pricing constants for Claude Sonnet 4.6 for GitHub Copilot
2026-02-19 07:59:44 +07:00
decolua
d83bd86816 feat: allow custom user data directory via DATA_DIR environment variable 2026-02-18 13:53:31 +07:00
decolua
4cf25dc53d feat: implement API key requirement toggle 2026-02-18 13:46:14 +07:00
HXD.VN
e1b836168a
feat: add /v1/embeddings endpoint (OpenAI-compatible) (#146)
* feat: implement /v1/embeddings endpoint (#117)

Add OpenAI-compatible POST /v1/embeddings endpoint that routes through
the existing provider credential + fallback infrastructure.

Changes:
- open-sse/handlers/embeddingsCore.js: core handler (handleEmbeddingsCore)
  * Validates input (string or array), encoding_format
  * Builds provider-specific URL and headers for openai, openrouter,
    and openai-compatible providers
  * Handles 401/403 token refresh via executor.refreshCredentials
  * Returns normalized OpenAI-format response { object: 'list', data, model, usage }
- cloud/src/handlers/embeddings.js: cloud Worker handler (handleEmbeddings)
  * Auth + machineId resolution identical to handleChat
  * Provider credential fallback loop with rate-limit tracking
- cloud/src/index.js: wire new routes
  * POST /v1/embeddings  (new format — machineId from API key)
  * POST /{machineId}/v1/embeddings  (old format — machineId from URL)

* test: add unit tests for /v1/embeddings endpoint

- Setup vitest as test framework (tests/ directory)
- embeddingsCore.test.js (36 tests):
  - buildEmbeddingsBody: single string, array, encoding_format, default float
  - buildEmbeddingsUrl: openai, openrouter, openai-compatible-*, unsupported
  - buildEmbeddingsHeaders: per-provider headers, accessToken fallback
  - handleEmbeddingsCore: input validation, success path, provider errors,
    network errors, invalid JSON, token refresh 401 handling
- embeddings.cloud.test.js (23 tests):
  - CORS OPTIONS preflight
  - Auth: missing/invalid/old-format/wrong key → 401/400
  - Body validation: bad JSON, missing model, missing input, bad model → 400
  - Happy path: single string, array, delegation, CORS header, machineId override
  - Rate limiting: all-rate-limited → 429 + Retry-After, no credentials → 400
  - Error propagation: non-fallback errors, 429 exhausts accounts

Total: 59/59 tests passing
Framework: vitest v4.0.18, Node v22.22.0

* feat: add Next.js API route for /v1/embeddings endpoint

Wire the embeddings handler into Next.js App Router.

- src/app/api/v1/embeddings/route.js: Next.js API route (POST + OPTIONS)
- src/sse/handlers/embeddings.js: SSE-layer handler mirroring chat.js pattern

Uses handleEmbeddingsCore from open-sse/handlers/embeddingsCore.js with
the same auth, credential fallback, and token refresh logic as the chat
handler. Supports REQUIRE_API_KEY env var, provider fallback loop, and
consistent logging.
2026-02-18 13:24:02 +07:00
zx07
05b09e6165
feat: implement lazy loading for UsagePage with suspense fallback (#136)
Co-authored-by: zx <me@char.moe>
2026-02-16 16:30:36 +07:00
zx07
c7d44101b5
feat: add GPT 5.3 Codex Spark model to pricing and provider models (#133)
Co-authored-by: zx <me@char.moe>
2026-02-16 12:31:12 +07:00
Thiên Toán
6caef7f552
feat: add URL-based tab state persistence in usage page (#129)
- Add URL search params to track active tab
- Persist tab selection on page refresh
- Enable direct linking to specific tabs (overview, logs, limits, details)
- Implement smooth navigation without page scroll
2026-02-15 17:26:47 +07:00
decolua
3e4ca1889f - Add new model "minimax-m2.5" to providerModels. 2026-02-15 13:03:32 +07:00
decolua
e2db638982 feat: enhance request handling and error management in chatCore and streamToJsonConverter
- Added detailed request logging and latency tracking in handleChatCore.
- Improved error handling for SSE to JSON conversion and JSON parsing in streamToJsonConverter.
- Introduced a safe JSON parsing utility to handle potential parsing errors gracefully in requestDetailsDb.

Co-authored-by: zx <me@char.moe>
2026-02-15 12:02:53 +07:00
Nick Roth
202fee714b
feat(auth): add model-level rate limit locking for multi-bucket providers (#120)
Providers like Antigravity maintain separate quota buckets per model family
(e.g. Claude vs Gemini). A 429 on claude-opus previously locked the entire
account, preventing gemini-pro requests even though its quota was full.

This adds in-memory per-model locking so that only the specific model is
skipped during account selection while other models remain accessible.

Changes:
- Add model-aware lock tracking in auth.js (Map<connectionId:model, expiry>)
- Pass model context from chat handler to auth service
- Multi-bucket behavior gated to known providers (MULTI_BUCKET_PROVIDERS set)
- No database schema changes — locks are in-memory and clear on restart

Closes #110
2026-02-15 11:35:13 +07:00
zx07
d9bf4c9e59
feat(observability): add toggle for request detail recording (#122)
* feat(frontend): add toggle logic for observability configuration

(cherry picked from commit 71cef26df6160290c980710ff4a0d6e7aa926105)

* feat(backend): add toggle logic for observability configuration

(cherry picked from commit fb1a8d90e24f041c41b3039f7189791458b87f87)

---------

Co-authored-by: zx <me@char.moe>
2026-02-13 19:37:54 +07:00
zx07
03ab554d1c
feat: add support for GLM 5 (if) (#123)
(cherry picked from commit e26d65aa55726e330f6806aa1abfe05ac6801619)

Co-authored-by: zx <me@char.moe>
2026-02-13 19:37:13 +07:00
apple-techie
d7d5dc90bc fix: update Codex executor for gpt-5.3-codex support
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 18:12:38 +07:00
Blade096
1ae4e311b7 feat: add GLM Coding (China) provider and Usage by API Keys statistics
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-11 15:44:08 +07:00
decolua
c3baf52988 Update version to 0.2.76 and enhance MITM manager for cross-platform compatibility 2026-02-10 19:40:06 +07:00
decolua
d3c3a4ae0a Remove Docker publish workflow and update error handling in various modules
- Added handling for HTTP_STATUS.NOT_ACCEPTABLE in error types and messages.
- Enhanced the `prepareClaudeRequest` function to filter built-in tools for non-Anthropic providers and clean up empty tool arrays.
- Updated the `openaiToClaudeRequest` function to handle built-in tools more effectively and ensure proper tool conversion.
- Improved the `claudeToOpenAIResponse` function to skip processing for built-in server tool blocks.
- Refined error message handling in the `parseUpstreamError` function to ensure meaningful output.
- Adjusted command checks for tool installations across various settings routes to use `command -v` for better compatibility.
2026-02-10 19:18:40 +07:00
decolua
dd043f6ff4 Fix OpenClaw configuration options 2026-02-09 22:36:57 +07:00
decolua
102c193112 Feat : Setup cloudflare worker for cloud endpoint 2026-02-09 11:27:41 +07:00
Blade
c68b875a36
Add GLM Coding (China) provider with OpenAI-compatible API (#83) 2026-02-09 10:31:38 +07:00
Blade
85b7a0b136
Feature/ai observability dashboard (#79)
* feat: add AI request details feature with latency tracking

Add comprehensive request history and debugging capability to the Usage dashboard:

**Storage Layer** (usageDb.js):
- Add saveRequestDetail() for storing full request/response details
- Implement FIFO queue with 1000-record limit in request-details.json
- Auto-sanitize sensitive headers (authorization, api-key, cookie, token)
- Add getRequestDetails() with pagination and filtering support
- Add getRequestDetailById() for single record lookup

**Pipeline Integration** (chatCore.js):
- Track request start time and calculate total latency
- Record TTFT (Time To First Token) and total latency for all requests
- Capture full request details (messages, model, parameters)
- Save response content for non-streaming, mark streaming responses
- Handle error cases with detailed error information
- Async non-blocking saves to avoid impacting request performance

**API Layer** (/api/usage/request-details):
- GET endpoint with pagination (page, pageSize: 1-100)
- Filter by provider, model, connectionId, status, date range
- Returns { details: [...], pagination: {...} } format

**UI Components**:
- Drawer.js: Right slide-out panel with backdrop blur and ESC close
- Pagination.js: Full pagination with page size selector (10/20/50)
- RequestDetailsTab.js: Complete table view with filters and detail drawer

**Dashboard Integration**:
- Add "Details" tab to Usage page (4th tab after Overview/Logger/Limits)
- Table columns: Timestamp, Model, Provider, Input Tokens, Output Tokens, Latency (TTFT/Total), Action
- Provider filter dropdown (9 providers supported)
- Date range filters (start/end datetime)
- Click "Detail" button to view full request/response JSON in slide-out drawer

**Features**:
- Real-time latency monitoring (TTFT & Total)
- Complete request/response inspection for debugging
- Filterable and searchable request history
- Responsive design with mobile-friendly filters
- Data security with automatic header sanitization
- Performance: async saves don't block request pipeline

**Files Created/Modified**:
- src/lib/usageDb.js (modified)
- open-sse/handlers/chatCore.js (modified)
- src/app/api/usage/request-details/route.js (new)
- src/shared/components/Drawer.js (new)
- src/shared/components/Pagination.js (new)
- src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js (new)
- src/app/(dashboard)/dashboard/usage/page.js (modified)

Closes: AI Observability Dashboard feature

* feat: enhance request details with full config and streaming content capture

Improve Request Details feature to capture comprehensive request parameters
and actual streaming response content:

**Request Configuration Enhancement** (chatCore.js):
- Add extractRequestConfig() helper function to capture all request parameters
- Include temperature controls: temperature, top_p, top_k
- Include token limits: max_tokens, max_completion_tokens
- Include thinking/reasoning modes: thinking, reasoning, enable_thinking
- Include OpenAI parameters: presence_penalty, frequency_penalty, seed, stop,
  tools, tool_choice, response_format, n, logprobs, top_logprobs, logit_bias,
  user, parallel_tool_calls, prediction, store, metadata
- Apply to all request types: non-streaming, streaming, and error cases

**Streaming Content Capture** (chatCore.js & stream.js):
- Add onStreamComplete callback mechanism to stream processors
- Accumulate content from all formats: OpenAI, Claude, Gemini
- Track content from delta.content, delta.reasoning_content, delta.text,
  delta.thinking, and Gemini content.parts
- Save initial record with "[Streaming in progress...]" marker
- Update record with actual content when stream completes
- Include usage tokens when available from stream

**Files Modified**:
- open-sse/handlers/chatCore.js - extractRequestConfig() + streaming capture
- open-sse/utils/stream.js - onStreamComplete callback + content accumulation

**Benefits**:
- View complete request configuration in Request Details (thinking mode, etc.)
- See actual streaming response content instead of placeholder
- Better debugging and observability for AI requests

Refs: #request-details-enhancement

* feat: separate thinking/reasoning content from response content

Improve Request Details to display thinking process separately from final response:

**Backend Changes**:
- stream.js: Capture content and thinking separately in streaming mode
  - Add accumulatedThinking variable alongside accumulatedContent
  - Route delta.content to content, delta.reasoning_content to thinking
  - Support OpenAI (reasoning_content), Claude (thinking), Gemini (part.thought)
  - Update onStreamComplete callback to return { content, thinking } object

- chatCore.js: Update response structure to include thinking field
  - Non-streaming: Extract thinking from reasoning_content field
  - Streaming: Receive { content, thinking } from stream callback
  - Error responses: Include thinking: null
  - Initial streaming save: Include thinking: null

**Frontend Changes**:
- RequestDetailsTab.js: Display thinking and content in separate sections
  - Add amber/yellow themed "Thinking Process" section with psychology icon
  - Show "Final Response" label when thinking is present
  - Use distinct visual styling for thinking (amber bg) vs content (gray bg)
  - Only show thinking section when thinking content exists

**Benefits**:
- Users can clearly see model's reasoning process vs final answer
- Better debugging for models with thinking capabilities (Claude, o1, etc.)
- Visual distinction makes it easy to identify thinking vs response

Refs: #thinking-content-separation

* fix: map Claude thinking to reasoning_content field

Fix Claude thinking content to be properly captured as reasoning_content
instead of regular content, enabling separate display in Request Details:

**Changes**:
- claude-to-openai.js: Use reasoning_content field for thinking blocks
  - thinking start: send { reasoning_content: "" } instead of { content: "```\n```" }
  - thinking delta: map to reasoning_content instead of content
  - thinking stop: send { reasoning_content: "" } instead of { content: "```\n```" }

**Why This Matters**:
- Previously Claude thinking was sent as `content` field, mixed with actual response
- Now thinking uses `reasoning_content` field, matching OpenAI's o1 format
- stream.js can now properly route thinking to accumulatedThinking variable
- Request Details UI will show Claude thinking in separate "Thinking Process" section

**Supported Thinking Formats**:
- OpenAI: delta.reasoning_content → thinking
- Claude: delta.thinking → reasoning_content (now fixed)
- Gemini: part.thought === true → thinking

Refs: #claude-thinking-fix

* feat(observability): capture and display full 4-layer request chain

Capture complete request/response chain in AI Request Details:
- Add providerRequest field (translated request sent to provider)
- Add providerResponse field (raw provider response, streaming indicator)
- Update chatCore.js at all 5 saveRequestDetail() call sites
- Reorganize UI into 4 collapsible sections with Material icons
- Preserve backward compatibility for old records
- Add distinct styling for streaming indicator

* fix(observability): resolve React duplicate key warning in request details table

- Use composite key (detail.id + index) to ensure unique keys
- Prevents React warnings when database contains duplicate IDs from old ID generation

* fix(observability): display actual content in streaming request details

Change providerResponse field for streaming requests from placeholder
"[Streaming - raw response not captured]" to actual final content.

This improves debugging experience by showing the real AI response
in the "Provider Response (Raw)" section instead of a confusing
placeholder message.

Files changed:
- open-sse/handlers/chatCore.js: Save contentObj.content to providerResponse
- src/app/.../RequestDetailsTab.js: Remove special handling for placeholder

* refactor(observability): migrate request details to SQLite for improved concurrency

- Replace LowDB JSON storage with better-sqlite3
- Enable WAL mode for true concurrent read/write support
- Add 5 indexes to accelerate queries (timestamp, provider, model, connection_id, status)
- Perform pagination at the database level to reduce memory footprint
- Maintain 1000 record limit with automatic cleanup of old data
- Ensure API compatibility via re-exports, requiring no caller changes

Performance improvements:
- Concurrent Writes: Lock-free WAL mode prevents data contention
- Query Efficiency: Index-based searches replace full dataset loading
- Data Integrity: Atomic operations prevent file corruption

* fix(observability): resolve pagination statistics display issues

- Fix issue where totalItems=0 showed 'Showing 1 to 0 of 0 results'
- Hide pagination controls when totalItems=0 or totalPages<=1
- Standardize API response fields: pagination.total -> pagination.totalItems

Before: Incorrect stats shown for empty data, and pager visible even for single-page results
After: Stats hidden for empty data, pager hidden when navigation is unnecessary

* feat(observability): display friendly provider names in request details

- Add /api/usage/providers endpoint to dynamically fetch provider list with names
- Replace hardcoded provider options with dynamic loading from database
- Display friendly provider names instead of IDs in both table and detail drawer
- Support custom provider nodes (e.g., OpenAI-compatible) with user-defined names
- Add provider name caching to optimize performance

* fix(observability): use INSERT OR REPLACE for request details to handle streaming updates

* fix(observability): resolve zero-token display issue by ensuring streaming usage capture and fixing key mismatch

* fix(observability): separate TTFT and total latency calculation for streaming requests

* feat(observability): implement SQLite write queue and JSON size limits

- Added in-memory buffer and batch writing for SQLite to prevent lock contention
- Implemented  with configurable 1MB limit to prevent DB bloat
- Added dashboard UI for observability performance and data management settings
- Integrated graceful shutdown handlers to prevent data loss

* fix(observability): resolve ReferenceError by declaring dbInstance
2026-02-09 10:30:42 +07:00
decolua
388389c972 Revert "feat(request-details): implement observability settings and enhance request detail tracking"
This reverts commit cbabf5547c.
2026-02-09 10:29:38 +07:00
decolua
cbabf5547c feat(request-details): implement observability settings and enhance request detail tracking
- Added new observability settings in the dashboard for max records, batch size, flush interval, and max JSON size.
- Introduced `extractRequestConfig` function to capture full request configurations.
- Enhanced error handling by saving detailed request information on failures.
- Updated usage tracking to include new token metrics.
- Modified streaming functions to support detailed content and reasoning tracking.
2026-02-09 10:20:24 +07:00
decolua
635d327dbc chore: update package version to 0.2.71 and enhance MITM tools 2026-02-09 09:58:24 +07:00
decolua
bd0cebcfff
Merge pull request #80 from Blade096/fix/free-provider-not-found
fix(dashboard): resolve 'Provider not found' for free providers
2026-02-08 16:51:54 +07:00
Diego Souza
3d439839d9 feat(cloud): harden sync/auth flow, SSE fallback, and update changelog
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 16:45:31 +07:00
decolua
2e854bd4c9 feat(antigravity): integrate Antigravity tool with MITM support and update CLI tools 2026-02-08 16:28:13 +07:00
Blade096
45a4d3ba68 fix(dashboard): resolve 'Provider not found' for free providers 2026-02-08 01:19:50 +08:00
decolua
20a86d6561
Merge pull request #67 from diegosouzapw/feature/docker-runtime-readme-updates
feat: add Docker runtime setup and README docs updates
2026-02-07 11:24:10 +07:00
decolua
bdbe8162e7 feat(provider): add free providers and enhance error handling 2026-02-07 11:17:06 +07:00
Diego Souza
01c9410530 fix(login): avoid infinite loading on settings fetch failure 2026-02-06 23:41:29 +00:00
Diego Souza
49df3dce90 fix(auth): prevent auto-login after logout 2026-02-06 23:14:10 +00:00
Diego Souza
6c41573203 feat(cli-tools): update default local endpoint port to 20128 2026-02-06 22:44:58 +00:00
decolua
ff2ba87161
Merge pull request #65 from ramhaidar/fix/provider-connection-ux
fix(api-key): auto-validate on save to improve UX
2026-02-06 21:21:03 +07:00
ram/haidar
e6ef8528fc fix(db): improve error handling and null checks
- Added null checks for undefined/null values in database operations
- Improved error handling for corrupt JSON recovery
- Added schema migration support for missing keys
- Target: database stability and data integrity
2026-02-06 20:54:42 +07:00
ram/haidar
b275dfdc9c feat(providers): auto-validate API keys on save
- AddApiKeyModal and EditConnectionModal now automatically validate API keys during save
- Sets testStatus to 'active' when validation succeeds, removing need for manual Check button
- Added saving state to prevent duplicate submissions during validation
- Target: provider connection management UX
2026-02-06 20:54:19 +07:00
decolua
a2122e3e48 feat(cli-tools): update CLI tools and add new models
- Add Droid and OpenClaw tool cards to CLI tools
- Enhance ClaudeToolCard and CodexToolCard to display current base URLs
2026-02-06 20:53:20 +07:00
Blade096
7c609d7a3e feat(providers): add Minimax Coding (China) provider
- Add minimax-cn provider with China endpoint (api.minimaxi.com)
- Add provider icon and configuration
- Add validation and test support
- Add API configuration in open-sse

Co-authored-by: Blade096 <46746496+Blade096@users.noreply.github.com>
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 15:10:57 +07:00
decolua
fafa77316b Fix version 2026-02-06 11:38:52 +07:00
decolua
e8aa3e21fe - Added new model "Claude Opus 4.6" to the provider models. 2026-02-06 11:23:08 +07:00
Hellodebasishsahu
127475df84 feat(codex): add GPT 5.3, fix API translation, add thinking levels
- Add GPT 5.3 Codex model with thinking level variants (none/low/medium/high/xhigh)
- Extract thinking level from model name suffix (e.g., gpt-5.3-codex-high)
- Fix Codex translation: preserve openai-responses format for Droid CLI
- Add effort level logging in request logs

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 09:46:11 +07:00
decolua
a7a52be2d4 feat(ui): add model support for custom providers and improve UX
- Support custom provider models in combos and model selection
- Display custom provider names instead of technical IDs
- Make model fields readonly (selected via modal)
- Only show connected providers (remove fallback)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 09:39:10 +07:00
decolua
32aefe5a76 feat(executors): Improved UI components for displaying provider limits and usage statistics in the dashboard. 2026-02-05 18:38:50 +07:00
decolua
249fc28c49 feat(auth): Enhance authentication flow and settings management 2026-02-05 11:26:11 +07:00
decolua
0a026c7af6 feat(cursor): Add cursor Provider 2026-02-05 11:06:20 +07:00
decolua
abaeb22863 Merge branch 'pr-50' 2026-02-05 11:02:50 +07:00
decolua
0a394d0d9a fix(auth): allow HTTP for local network 2026-02-04 12:39:26 +07:00
triadmoko
137f315bec feat(cursor): Integrate Cursor IDE support with OAuth import token flow
- Add CursorExecutor for handling requests to the Cursor API using protobuf over HTTP/2.
- Implement CursorAuthModal for user token import from local SQLite database.
- Update provider models and constants to include Cursor as a supported provider.
- Enhance API service with token validation and user info extraction from Cursor tokens.
- Introduce utility functions for checksum generation and protobuf encoding/decoding for Cursor API interactions.
2026-02-04 12:07:29 +07:00
decolua
677cabc850 Merge branch 'pr-44' 2026-02-04 10:00:46 +07:00
decolua
e6e44ac364 Fix : usage convert 2026-02-04 09:54:11 +07:00
ramhaidar
8ceb8f24c3 chore(providers): use Anthropic Compatible logo
- Update Anthropic Compatible provider configuration to use the new m-variant logo (anthropic-m.png) instead of the standard anthropic.png for consistent branding across the provider icons.
- Target: provider icons
2026-02-03 15:41:10 +07:00
ramhaidar
da5bdef4cb feat: Add Anthropic Compatible provider support
- Added support for 'anthropic-compatible' provider nodes in backend.
- Implemented isAnthropicCompatible logic in open-sse for /messages URL construction and headers.
- Added UI for creating and managing Anthropic Compatible providers in the dashboard.
- Updated validation logic for Anthropic-compatible endpoints.
- Sanitize base URL input (strip trailing /messages) to prevent 404s and improve UX.
- Improve validation: use GET /models (2xx success), and support x-api-key / Authorization Bearer hybrid proxies.
- Enable model import via /models for Anthropic Compatible providers.
- Ensure Authorization is omitted when x-api-key is present to avoid strict proxy conflicts.
- Resolve Anthropic-compatible credentials by prefix during model resolution (e.g., acx/model).
- Update default executor to match provider header/url behavior for Anthropic-compatible providers.
2026-02-03 15:11:41 +07:00
decolua
df0e1d6485 feat: Update response handling and logging for improved usage tracking 2026-02-03 10:22:43 +07:00
ramhaidar
60bd686fb0 feat(providers): add provider icons to dashboard
- Add provider logo icons for all supported providers
- Update provider detail and list pages to display icons with text fallback
- Target: providers UI
2026-02-02 22:26:40 +07:00
decolua
0a28f9f924 feat: Add OpenAI-compatible provider nodes
- Support multiple OpenAI-compatible providers with custom prefix/baseUrl
- Add provider nodes CRUD (create/read/update/delete)
- URL building: baseUrl + /chat/completions or /responses
- Model import from /models endpoint
- API key validation via /models
- Usage type safety across all translators
- OAuth token auto-refresh for expired tokens
2026-02-02 19:45:12 +07:00