Spaces:
Paused
Paused
Commit History
-
fix: update checker shows correct status + version display + dark mode fixes
icebear0828- Fix 'Up to date' shown incorrectly when Codex version changed (add version_changed field) - Change update status text from <span> to clickable <button> - Add proxy version number next to 'Server Online' badge - Fix dark mode for ProxyPool form inputs and AccountCard proxy selector - Add fingerprintUpdating translation key (zh/en)3cf831b -
feat: proxy pool add form with separate protocol/host/port/auth fields
icebear0828 +1: Claude Opus 4.6Replace single URL input with structured fields (protocol dropdown, host, port, username, password) for easier configuration of authenticated proxies. Backend still accepts raw url for API compat. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>af3e19d -
fix: remove wall-clock timeout from streaming SSE to prevent thinking chain cutoff
icebear0828 +1: Claude Opus 4.6The 60s --max-time timeout was killing curl mid-stream during long reasoning/thinking outputs (30-120+ seconds). Streaming requests now rely on header timeout + AbortSignal for protection instead. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>ffcac87 -
fix: proxy pool review fixes — security, validation, robustness
icebear0828 +1: Claude Opus 4.6- Skip disabled proxies in healthCheckAll (avoid unnecessary network calls) - Validate proxy URL scheme (only http/https/socks5/socks5h allowed) - Deduplicate proxy URLs on add (return existing ID if URL already exists) - Mask proxy credentials server-side via getAllMasked() (remove client-side maskUrl) - Add try-catch to all use-proxies hook operations (prevent unhandled rejections) - Fix misleading route ordering comment in proxies.ts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>deae086 -
feat: add proxy pool for per-account proxy routing
icebear0828 +1: Claude Opus 4.6Add proxy pool system allowing different accounts to route through different upstream proxies for IP diversity and risk isolation. Backend: - ProxyPool manager with CRUD, assignment, round-robin, health checks - TlsTransport interface accepts per-request proxyUrl parameter - Both curl-cli and libcurl-ffi transports support per-request proxy - CodexApi forwards proxy through the request chain - REST API at /api/proxies for proxy + assignment management - Periodic health checks (default 5min) via api.ipify.org Frontend: - ProxyPool management section in dashboard - Per-account proxy selector dropdown in AccountCard - Four assignment modes: Global/Direct/Auto(Round-Robin)/Specific Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>4ebb914 -
feat: GitHub Star badge + check-for-updates in dashboard header
icebear0828 +1: Claude Opus 4.6- Header: ⭐ Star badge linking to GitHub repo (amber pill style) - Header: 🔄 Check for Updates button with status display - Checks both proxy self-update (git fetch/pull/build) and Codex fingerprint (appcast) - CLI: auto git pull + npm install + build, prompt restart - Docker: fingerprint auto-update, proxy shows manual rebuild hint - Electron: version display only, managed by desktop app - New endpoints: GET /admin/update-status, POST /admin/check-update - Footer: version info (proxy commit + Codex Desktop version) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>06a5304
-
fix: move /v1/models/catalog route before :modelId param route
icebear0828 +1: Claude Opus 4.6Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>2b84f47 -
feat: add gpt-5.4 + codex-spark support, matrix model selector, extended reasoning efforts
icebear0828 +1: Claude Opus 4.6- Add gpt-5.4 (4 efforts: minimal/low/medium/high) and gpt-5.3-codex-spark (minimal/low) to models.yaml - Update codex alias to gpt-5.4 - Generalize isCodexModelId → isCodexCompatibleId to match bare gpt-X.Y models - Add /v1/models/catalog endpoint returning full CodexModelInfo[] with reasoning efforts - Replace flat model dropdown with family × reasoning effort matrix selector in dashboard - Add reasoning_effort to code examples when non-default effort is selected - Bump client to v26.305.950 (build 863) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>7824fcd -
fix: auto-admit new Codex models from backend API
icebear0828 +1: Claude Opus 4.6Previously applyBackendModels() filtered out any model not in the static YAML catalog. New Codex releases (e.g. gpt-5.4-codex) were silently dropped. Now models matching gpt-*-codex* pass through. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>5b8472d -
fix: remove unsupported previous_response_id parameter (#30)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* fix: remove unsupported previous_response_id parameter (#29) The Codex backend no longer accepts `previous_response_id`. Sending it causes HTTP 400: "Unsupported parameter: previous_response_id". Remove the injection logic in proxy-handler and clean up related dead code across translation functions and session manager. Closes #29 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: remove dead SessionManager (was only used for previous_response_id) SessionManager, session hashing, and onResponseId session storage were only used to track previous_response_id across turns. Since the backend no longer supports this parameter, the entire session system is dead code. Remove it. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>3c0eaf7
-
refactor: extract startServer() + path abstraction for Electron reuse
icebear0828 +1: Claude Opus 4.6- Export startServer(options?) from src/index.ts so Electron can import it - Add src/paths.ts: centralized path getters (getConfigDir, getDataDir, etc.) with setPaths() hook for Electron to redirect to userData - Replace all process.cwd() calls with path getters across src/ - Extract shared/ from web/ (i18n, theme, hooks, utils) for desktop reuse - Add /desktop route in web.ts (serves desktop UI if built, no-op otherwise) CLI behavior is unchanged — all path getters default to process.cwd(). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>4a940a5 -
feat: add reasoning/thinking output support for OpenAI and Anthropic routes
icebear0828 +1: Claude Opus 4.6- Always send `summary: "auto"` to Codex API so reasoning summaries are available - Parse `response.reasoning_summary_text.delta/done` SSE events - OpenAI route: emit `reasoning_content` in chunks when client sends `reasoning_effort` - Anthropic route: emit thinking blocks when client sends `thinking.type: enabled/adaptive` - Extract block lifecycle helpers in Anthropic translator to eliminate duplication - Log unknown SSE events via console.debug for discovering new event types Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>7366e72 -
fix: Anthropic route thinking blocks validation + context token display
icebear0828 +1: Claude Opus 4.6- Add thinking/redacted_thinking to Anthropic content block schema (fixes /compact 400 error with extended thinking history) - Include input_tokens in message_delta usage (fixes Claude Code always showing 0% context) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>be3a571 -
fix: support thinking/redacted_thinking content blocks in Anthropic schema
icebear0828 +1: Claude Opus 4.6Claude Code /compact sends conversation history containing thinking and redacted_thinking content blocks which were rejected by the Zod schema. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>ca7b1cb -
feat: add image input support for all API routes
icebear0828 +1: Claude Opus 4.6Previously all image content was silently discarded by the translation layer. Now image_url (OpenAI), image/base64 (Anthropic), and inlineData (Gemini) content parts are translated to Codex input_image format and passed through to the backend. Closes #25 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>142c9c4
-
fix: normalize tool schemas missing `properties` field
icebear0828 +1: Claude Opus 4.6MCP tools with no parameters send `{"type":"object"}` without a `properties` key. The Codex/OpenAI backend strictly requires it, returning 400. Add a shared `normalizeSchema()` helper that injects `properties: {}` when missing, applied consistently across all four format converters (OpenAI tools, OpenAI functions, Anthropic, Gemini). Thanks to @lookvincent for identifying this issue (PR #22). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>2df0167 -
fix: window counter review issues — opacity modifier, catch-up spam, rounding
icebear0828 +1: Claude Opus 4.6- text-dim color uses <alpha-value> interpolation so dark:text-text-dim/70 works - Multi-window catch-up jumps to correct window in one step (no log spam) - formatWindowDuration uses Math.floor instead of Math.round Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>247b874 -
feat: add per-window usage counters with time-driven reset
icebear0828 +1: Claude Opus 4.6Dashboard previously showed cumulative token counts that never reset when the rate limit window rolled over. Now tracks per-window request/token counters that auto-reset via two layers: - Layer 1 (time-driven): refreshStatus() checks window_reset_at on every acquire/getAccounts call, zero API overhead - Layer 2 (backend sync): syncRateLimitWindow() corrects with actual backend values on Dashboard refresh Also syncs limit_window_seconds from backend and displays window duration badge (e.g. "3h") next to plan name in AccountCard. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>4f2220c
-
fix: stop resetting local usage counters on rate limit window rollover
icebear0828 +1: Claude Opus 4.6syncRateLimitWindow() was zeroing request_count, tokens, and empty_response_count whenever the backend rate limit window changed. This caused the dashboard to show 0 requests/tokens while the backend quota still reported usage (e.g. 50% used), because the two data sources are independent. Local counters now accumulate since account creation; users can still manually reset via the API. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>9d65acf
-
feat: add per-account empty response tracking with email in logs
icebear0828 +1: Claude Opus 4.6Track empty_response_count per account in AccountUsage, exposed via GET /auth/accounts. Logs now include account email for easier debugging. Counter resets on usage reset and rate limit window rollover. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>b3dfc6c -
fix: detect empty Codex responses and auto-retry with account rotation (#18)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* fix: detect empty Codex responses and auto-retry with account rotation Codex API intermittently returns HTTP 200 with valid SSE events but zero text deltas. Add EmptyResponseError detection in all three translation layers (OpenAI, Anthropic, Gemini) and a retry loop in proxy-handler that switches accounts on empty responses (up to 3 attempts). - Non-streaming: catch EmptyResponseError → release account → acquire new account → retry with fresh CodexApi (max 2 retries) - Streaming: inject "[Error] Codex returned an empty response" text chunk when response.completed fires with no content - All retries exhausted → 502 with clear error message Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: prevent double-release of account in empty-response retry loop The outer catch block used the original entryId, which was already released when EmptyResponseError switched to a new account. Introduce activeEntryId to track the currently-active account across retries. Also set Em…9d6278d -
chore: deduplicate model selector, auto-extract chromium version, harden update pipeline
icebear0828 +1: Claude Opus 4.6- Remove independent model dropdown from Anthropic SDK Setup; use shared Default Model from API Configuration - Auto-extract Chromium version from Electron via electron-to-chromium in extract-fingerprint - Add 5-min timeout kill timer for full-update child process to prevent permanent lock - Add try/finally in model-fetcher initial timer to prevent refresh loop interruption - Bump Codex Desktop to v26.228.1430 (build 760) - Update poll interval from 30min to 3 days Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>8728276 -
fix: harden prompt injection suppression and non-streaming error handling
icebear0828 +1: Claude Opus 4.6Strengthen SUPPRESS_PROMPT to prevent mini models from leaking Codex Desktop identity. Wrap collectTranslator in try/catch to return 502 JSON instead of 500 HTML on non-streaming errors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>2def35e -
fix: filter non-Codex models from backend to prevent resolveModelId fallback breakage
icebear0828 +1: Claude Opus 4.6Backend model fetch returns ChatGPT-only slugs (gpt-5-2, gpt-5-1, etc.) that the Codex Responses API doesn't accept. Now only models already in the static YAML catalog are merged from the backend. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>eea9e24 -
fix: handle error SSE events from Codex API instead of silently dropping them
icebear0828 +1: Claude Opus 4.6When the Codex API returns `event: error` or `event: response.failed`, the proxy now surfaces the error message to clients instead of returning empty responses. Also detects non-SSE JSON error bodies from upstream. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>cf0807a
-
fix: support thinking.type "adaptive" for latest Claude Code
icebear0828 +1: Claude Opus 4.6Claude Code now sends thinking.type: "adaptive" (with optional budget_tokens) instead of always "enabled"/"disabled". Added the new variant to the Zod schema and translation logic. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>be3ca8e
-
fix: Docker container auto-detect host proxy via host.docker.internal
icebear0828 +1: Claude Opus 4.6Docker containers can't reach host proxies on 127.0.0.1 (container loopback). Now probes both 127.0.0.1 and host.docker.internal so Docker users get automatic proxy detection without any configuration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>d7d7389
-
fix: use known-profile list instead of runtime detection for TLS impersonation
icebear0828 +1: Claude Opus 4.6The previous testProfile() approach using `curl -V` never validated the --impersonate target. Worse, v1.5.x silently accepts unknown profiles but applies NO impersonation (JA3 fingerprint = bare curl). Replace runtime detection with a deterministic known-profile list. Any configured chromeN is mapped to the nearest supported version (e.g. chrome137 → chrome136). This works reliably across all curl-impersonate versions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>38895cf -
fix: auto-fallback for unsupported TLS impersonate profiles
icebear0828 +1: Claude Opus 4.6curl-impersonate skips Chrome versions when the TLS fingerprint is unchanged (e.g. chrome137 doesn't exist, chrome136 covers it). Previously, configuring an unsupported profile like chrome137 caused `curl: (43) Unknown impersonation target` at runtime. Now `detectImpersonateSupport()` validates the configured profile by test-running it, and automatically descends to the nearest supported Chrome version. Also unified the FFI transport to use the resolved profile instead of a hardcoded "chrome136". Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>27e0738
-
feat: dynamic model list fetching from Codex backend (#9)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* feat: dynamic model list fetching from Codex backend Replace static-only model loading with a hybrid approach: - Static YAML models as fallback baseline - Background fetcher probes /codex/models and /models endpoints - Backend models merge into catalog (backend wins, YAML fills gaps) - Aliases always from YAML (user-customizable) - New /debug/models endpoint for diagnostics - All fetch errors non-fatal — gracefully falls back to static models Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: PR #9 review issues + complete Codex model catalog - Remove dead _backendModelCount variable from model-store - Fix hot-reload wiping backend models: add triggerImmediateRefresh() in model-fetcher, chain it in reloadAllConfigs() - Fix premature "hot-reloaded" log message ordering in config.ts - Gate raw model sample logging to first fetch only in codex-api - Remove dead re-exports from routes/models.ts - Expand getModels() to probe sentinel/chat-requirements + flatten nested …5f8456f
-
feat: OpenCode platform support, vitest tests, changelog & Docker hardening
icebear0828 +1: Claude Opus 4.6- Add opencode.json provider config for OpenCode IDE integration - Add CHANGELOG.md covering all versions (v0.1.0–v0.8.0) - Add vitest with unit tests for account-pool, codex-api, codex-event-extractor - Add request-id middleware to global middleware chain - Harden Dockerfile: non-root user, HEALTHCHECK probe - Simplify /health endpoint to return pool summary only Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>92c5df7 -
feat: native tool calling support across all protocols (#8)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* feat: native tool calling support across all protocols - Fix 500 errors: wrap c.req.json() in try-catch for all 3 routes, returning proper 400 responses for malformed JSON - Forward tool definitions to Codex API instead of sending tools: [] - Parse function call SSE events (output_item.added, function_call_arguments.delta/done) with item_id→call_id mapping - Translate tool calls back to each protocol's format: OpenAI: streaming tool_calls chunks + finish_reason "tool_calls" Anthropic: tool_use content blocks + stop_reason "tool_use" Gemini: functionCall parts in candidates - Convert tool results from each protocol to native function_call_output input items - New shared module: tool-format.ts for cross-protocol tool conversion Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address review issues in native tool calling - Fix Gemini call_id collision: use counter-based IDs with name→callId correlation instead of fragile fc_${name} pattern - Remove dead c…ab2754a
-
fix(api): return 400 invalid_json for malformed chat payload
icebear08280be9bdf -
refactor: remove dead code, unused config, and fix type violations
icebear0828 +1: Claude Opus 4.6- Remove deprecated public/dashboard.html (replaced by Preact frontend) - Remove unused streaming and environment config sections (zero references) - Fix all `any` type violations (CLAUDE.md rule) in yaml-mutate, update-checker, and web components - Extract duplicate OAuth callback setup into shared startOAuthFlow() helper - Fix Vite emptyOutDir to prevent stale build artifact accumulation - Simplify .gitignore to ignore entire public/ build output Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>50ae780
-
feat: accept tool/function messages across all protocols
icebear0828 +1: Claude Opus 4.6Client frameworks (LangChain, AutoGen, Claude Code, etc.) often send conversation histories containing tool role messages and tool_calls. Previously, Zod validation rejected these requests outright. Since the Codex backend doesn't support tool calls, this implements a graceful degradation strategy: accept all tool-related fields in the schema, then flatten tool messages into human-readable text during translation. Covers both old (functions/function_call/role:function) and new (tools/tool_calls/role:tool) OpenAI formats, plus Anthropic (tool_use/tool_result) and Gemini (functionCall/functionResponse). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>759fe9e
-
feat: suppress Codex Desktop directives in model responses
icebear0828 +1: Claude Opus 4.6Keep desktop-context.md in instructions for client fingerprinting, but inject a suppress prompt to prevent the model from outputting desktop-specific directives (::automation-update, ::code-comment, ::archive) and mentioning Codex Desktop features. Controlled by config model.suppress_desktop_directives (default: true). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>d817d67 -
feat: support developer role and array content in OpenAI protocol
icebear0828 +1: Claude Opus 4.6- Add "developer" to role enum (treated as system/instructions) - Accept array content parts (extract text, ignore non-text) - Flatten array content before passing to session manager Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>ebe8094 -
fix: startup log shows config proxy_api_key instead of random hash
icebear0828 +1: Claude Opus 4.6Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>a931669 -
fix: proxy_api_key from config not used in frontend or auth validation
icebear0828 +1: Claude Opus 4.6/auth/status now returns config.server.proxy_api_key when set instead of per-account random hash. validateProxyApiKey also accepts the configured key. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>1f63c38 -
feat: add pnpm/bun package manager support for local development
icebear0828 +1: Claude Opus 4.6Replace hardcoded npm calls in scripts with npx to be PM-agnostic, update error messages to mention all three package managers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>d3a5a81 -
fix: prevent .env inline comments from being parsed as JWT tokens
icebear0828 +1: Claude Opus 4.6Docker Compose env_file doesn't strip inline comments, so "CODEX_JWT_TOKEN= # comment" was treated as a real token, creating ghost accounts on every restart. - Move .env.example comments to separate lines - Validate JWT format in config.ts (must start with "eyJ") Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>a971da6 -
feat: add libcurl-impersonate FFI transport for Chrome TLS fingerprint
icebear0828 +1: Claude Opus 4.6Windows lacks curl-impersonate CLI, so use koffi FFI to call libcurl-impersonate DLL directly. Introduces TlsTransport abstraction with auto-selection: FFI on Windows, CLI subprocess on macOS/Linux. All three API protocols (OpenAI/Anthropic/Gemini) verified working. - New: src/tls/transport.ts (interface + singleton factory) - New: src/tls/curl-cli-transport.ts (extracted from codex-api.ts) - New: src/tls/libcurl-ffi-transport.ts (koffi FFI, curl_multi streaming) - New: scripts/poc-libcurl-ffi.ts (POC verification script) - Updated: setup-curl.ts auto-downloads DLL + cacert.pem on Windows - Updated: codex-api.ts uses transport abstraction (~200 lines removed) - Updated: curl-fetch.ts delegates to transport singleton Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>3d01305 -
refactor: architecture audit fixes round 2 (P0-P2)
icebear0828 +1: Claude Opus 4.6- Fix curl subprocess leak on client disconnect (abort signal propagation) - Cap SSE parse buffer at 10MB to prevent memory exhaustion - Fatal error triggers graceful shutdown instead of hard exit - Session hash: 128-bit + JSON.stringify to prevent collisions - Gemini SSE line endings normalized to \n\n - Extract shared translation utils (desktop context, instructions, budgetToEffort) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>d6c3bb0
-
feat: migrate dashboard to Preact + Vite
icebear0828 +1: Claude Opus 4.6- New web/ directory with Preact components, Tailwind CSS v3, Vite build - i18n via Context + useT() hook (zero DOM scanning on language switch) - Theme via ThemeProvider + useTheme() hook - Ghost text technique for stable header layout across EN/ZH - Backend: serve Vite build output from public/ - Docker: added frontend build step - Build: npm run build now builds frontend first, then backend Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>b7d4394 -
refactor: architecture audit fixes (P0-P2 stability & reliability)
icebear0828 +1: Claude Opus 4.6P0: curl header parse timeout (30s), kill curl on stream disconnect via AbortController, cap error response body at 1MB. P1: acquireLock TTL (5min auto-release), atomic config hot-reload, encapsulate 429 counting in AccountPool, graceful shutdown with server.close() + 5s drain period. P2: send error SSE event on stream failure, structured JSON logger, O(1) session LRU eviction via Map insertion order. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>b1107bc -
refactor: fingerprint alignment, auto-maintenance, Docker deployment
icebear0828 +1: Claude Opus 4.6Phase 1 - Eliminate fingerprint detection gaps: - Dynamic sec-ch-ua from config chromium_version (aligned with TLS profile) - Inject full fingerprint headers into curl-fetch (OAuth/appcast) - Unify Accept-Encoding based on curl-impersonate detection - Optimize header ordering (single sort pass) Phase 2 - Auto-maintenance: - Structured YAML mutation utility (replace regex hacks) - Auto full-update pipeline on new version detection - Config hot-reload after updates - Exponential backoff token refresh (5 attempts + 10m recovery) - Immediate persistence for critical data (tokens, cf_clearance) - Cookie v2 format with expiry timestamps - Graceful shutdown with 10s timeout protection - Usage counters auto-reset on rate limit window rollover Phase 3 - Docker deployment: - Dockerfile, docker-compose.yml, .dockerignore - Deployment docs in README Fixes: - Extract planType from JWT /auth claim (was looking in /profile) - Backfill missing planType on startup for existing accounts - Show full d…347f81b -
fix: remove fake Claude/Gemini model aliases, use dynamic catalog
icebear0828 +1: Claude Opus 4.6Remove non-existent Claude and Gemini model aliases from models.yaml. Gemini /v1beta/models endpoint now reads from getModelCatalog() instead of a hardcoded list. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>87cb62c -
refactor: extract shared proxy handler, eliminate route duplication
icebear0828 +1: Claude Opus 4.6- Extract withRetry() to src/utils/retry.ts (was duplicated 3x) - Create shared proxy-handler.ts encapsulating acquire/stream/release lifecycle - Refactor chat.ts, messages.ts, gemini.ts to use shared handler (-264 lines net) - Convert models.ts from default export to named createModelRoutes() - Extract GEMINI_STATUS_MAP to types/gemini.ts (was duplicated in error-handler) - Add SessionManager.destroy() with interval cleanup + unref - Remove dead captureCookies() method from codex-api.ts - Add stack trace logging to error handler - Fix hardcoded localhost in startup message - Use atomic write-to-temp-then-rename for cookie-jar and account-pool - Add warning logs for previously silent catch blocks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>8b777a2 -
fix: remove dead login.html reference causing UI fallback on fresh installs
icebear0828 +1: Claude Opus 4.6The login page was removed earlier but web.ts still tried to serve it when unauthenticated, causing a read error and showing the "UI files not found" fallback. Now always serves dashboard.html. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>fcc0669 -
feat: auto-detect local proxy (mihomo/clash/v2ray)
icebear0828 +1: Claude Opus 4.6On startup, probe common local proxy ports (7890, 7897, 10809, 1080, 10808) and automatically use the first one found. No config needed — just have a proxy running and it works. Priority: config proxy_url > HTTPS_PROXY env > auto-detect. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>e7285df