Spaces:
Sleeping
Sleeping
Commit History
-
fix: model list not updating at startup — fast-retry on auth race (#149)
icebear +1: icebear0828Unverified signatureRoot cause: token refresh and model fetch race at startup. Initial fetch fires 1s after boot, but accounts may still be refreshing OAuth tokens. isAuthenticated() returns false → fetch silently skips → next retry is ~1 hour later. - model-fetcher: fast-retry (10s × 12 attempts) until accounts are ready - config/models.yaml: add gpt-5.4/5.4-mini/5.3-codex (restored 2026-03-18) - Export hasFetchedModels() for observability - 4 new tests covering retry/fallback/immediate-success scenarios Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com>56be298 -
feat: account management page with batch operations (#146)
icebear +1: icebear0828Unverified signature* fix: treat unfetched plan types as possibly compatible in acquire() When model-fetcher fails to fetch models for a plan type (e.g. the selected free account had an expired token), _planModelMap only contains successfully fetched plans. acquire() then excludes all accounts whose planType is absent from the map — even though their compatibility is unknown, not negative. Add isPlanFetched() to model-store and use it in acquire() to distinguish "plan was fetched and model is absent" (exclude) from "plan was never fetched" (include as possibly compatible). This prevents false 503s when a plan's model fetch failed at startup. * feat: account management page with batch operations Add #/account-management page for bulk account management: - POST /auth/accounts/batch-delete and batch-status endpoints - Batch delete, set active, set disabled with confirmation - Status summary chips (clickable to filter) - Reuse AccountTable with optional proxy column - Import/export accessible from new pag…7516302 -
fix: write runtime cache to data/ instead of git-tracked config/ (#138)
icebear +1: icebear0828Unverified signaturemodel-store synced merged catalog back to config/models.yaml on every backend fetch (~1h), and update-checker mutated config/default.yaml on version detection. Both made the repo dirty after normal runtime. - syncStaticModels() → data/models-cache.yaml (gitignored) - applyVersionUpdate() → data/version-state.json (gitignored) - loadStaticModels() overlays cache on cold start for fallback - loadCurrentConfig() checks version override before YAML baseline - config/ is now read-only for runtime operations Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com>50720ce
-
fix: remove isCodexCompatibleId whitelist — trust backend model list (#129)
icebear +1: icebear0828Unverified signatureThe regex whitelist filtered out models like gpt-5.4-mini whose ID didn't match hardcoded patterns. Remove the filter entirely and trust the /codex/models endpoint which only returns Codex-compatible models. Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com>1e54caa
-
test: add plan-based model routing tests (14 cases)
icebear0828- model-store: plan map build, reverse index, plan updates, non-Codex slug filtering, gpt-oss admission, store debug output - account-pool: plan-matched acquire, team-only rejection, fallback on empty plans, plan map update re-routing, preference ordering Covers the exact code path where free accounts get blocked from models that the backend has since opened to free tier (gpt-5.4 case).9c1c54e
-
feat: model list auto-sync + theme contrast fix
icebear0828- Backend: auto-write merged catalog back to models.yaml after dynamic fetch - Frontend: poll /v1/models/catalog every 60s to pick up new models - Theme: light mode bg #f6f8f6 → #ffffff for clearer dark/light contrast - Remove unused legacy web/src/hooks/use-status.ts94a5578
-
fix: model store dual index, desktop UI fallback, dynamic port support
icebear0828- Model store: replace O(n) plan map with dual index (planType→models + modelId→plans), both O(1) - Desktop UI: fallback to web UI when desktop build missing, add startup path diagnostics - Server: resolve actual bound port from server.address() to support port=0 - Model fetcher: fix log message (said 5s, actually 1s) - Update Codex Desktop fingerprint to v26.311.21342 (build 993)b94940f
-
fix: strict plan filtering in model-aware account routing
icebear0828 +1: Claude Opus 4.6When mixing free and team/plus accounts, requesting a plan-restricted model (e.g. gpt-5.4) could fall back to incompatible free accounts, causing HTTP 400 "model not supported". Now acquire() returns null instead of degrading to incompatible accounts when the model's plan requirements are known but no matching account is available. Also reduces model-fetcher initial delay from 5s to 1s to populate the plan map faster at startup. Fixes #54 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>be3d093 -
feat: model-aware multi-plan account routing (#57)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* feat: model-aware multi-plan account routing Different ChatGPT plans have different model access (e.g. Team has gpt-5.4, Free has gpt-oss-*). This adds plan→model mapping discovery and intelligent request routing to prevent model-not-supported errors. - model-store: track which plans can access each model via planMap - model-fetcher: query backend per distinct plan type in parallel - account-pool: model-aware acquire() prefers matching planType accounts - proxy-handler: auto-retry with different account on model-not-supported 4xx Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: patch model-aware routing bugs from PR review - Fix double release when model retry has no available account - Tighten isModelNotSupportedError: add 4xx status guard, drop broad "invalid" keyword - Reuse selectByStrategy() in getDistinctPlanAccounts() instead of duplicated sort - Remove redundant triedEntryIds push Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-autho…90c89b6 -
fix: update model catalog — gpt-5.4/5.3-codex removed, gpt-5.2-codex is new flagship
icebear0828 +1: Claude Opus 4.6Backend dropped gpt-5.4, gpt-5.3-codex, gpt-5.3-codex-spark. New model list: gpt-5.2-codex (default), gpt-5.2, gpt-5.1-codex-max, gpt-5.1-codex, gpt-5.1, gpt-5-codex, gpt-5, gpt-oss-120b, gpt-oss-20b, gpt-5.1-codex-mini, gpt-5-codex-mini. - config/default.yaml: default model → gpt-5.2-codex - config/models.yaml: full rewrite matching backend /codex/models response - model-store.ts: isCodexCompatibleId() now matches gpt-oss-*, normalizeBackendModel() handles supported_reasoning_levels + effort key - codex-api.ts: getModels() adds ?client_version= (now required by backend) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>597668f
-
fix: preserve model name suffixes (-fast, -high, etc.) in API responses
icebear0828 +1: Claude Opus 4.6Response model name was losing suffixes because it used the stripped base model ID from parseModelName() instead of reconstructing with suffixes. Also adds `none` to EFFORT_SUFFIXES (gpt-5.4 supports none reasoning). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>bc98e69
-
feat: model name suffix system + service_tier + Docker persistence fix (#35)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* feat: model name suffix system + service_tier (fast mode) support Add a unified model name suffix convention so CLI tools (Claude Code, opencode, etc.) can control reasoning effort and speed mode purely through the model name — no extra API fields needed. Suffix parsing (`parseModelName`): - `-fast` / `-flex` → `service_tier` - `-minimal` / `-low` / `-medium` / `-high` / `-xhigh` → `reasoning_effort` - Known model IDs and aliases are never suffix-parsed - Priority: explicit API field > suffix > model default > config default Backend: - `parseModelName()` in model-store.ts (core suffix resolver) - `service_tier` field in Zod schema + CodexResponsesRequest interface - `default_service_tier` in config schema + default.yaml - All 3 translation layers (OpenAI/Anthropic/Gemini) use parseModelName() Dashboard: - Standard / Fast speed toggle in ApiConfig - AnthropicSetup shows compound model name with suffixes - CodeExamples builds compound model name, suppresses redundant params Exampl…5416ffb -
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: 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
-
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
-
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: 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
-
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