Spaces:
Sleeping
Sleeping
Commit History
-
feat: dashboard login gate for public deployments (#148)
icebear +1: icebear0828Unverified signature* feat: dashboard login gate for public deployments (#141) Cookie-based session auth when proxy_api_key is set and request is non-localhost. API routes (/v1/*) unaffected, Electron (localhost) auto-bypassed. - In-memory session store with TTL from session.ttl_minutes config - Dashboard auth middleware with path-based allowlist - Login/logout/status endpoints with per-IP brute-force protection - HTTPS auto-detection: Secure flag on cookie when X-Forwarded-Proto: https - Remote session cannot clear proxy_api_key (prevents disabling login gate) - Frontend LoginGate component with i18n (en/zh), conditional logout button * fix: dashboard login security hardening - Timing-safe password comparison (crypto.timingSafeEqual) - Rate limiter cleanup of expired entries to prevent memory leak - Extract shared parseSessionCookie to src/utils/parse-cookie.ts - Remove silent password.trim() that could cause subtle mismatches - Logout button visible on mobile (icon-only on small screens) - Fix fragi…91ee702 -
feat: usage stats page with time-series token tracking (#147)
icebear +1: icebear0828Unverified signature* feat: usage stats page with time-series token tracking - Background snapshot recording (piggybacks on quota refresh, ~5min interval) - UsageStatsStore: JSON persistence, 7-day retention, delta computation - GET /admin/usage-stats/summary — live cumulative totals - GET /admin/usage-stats/history — time-series deltas with hourly/daily granularity - Pure SVG line charts (input/output tokens + request count) - Granularity (hourly/daily) and range (24h/3d/7d) selectors - 13 backend tests (snapshot, delta, aggregation, retention, API routes) - i18n: en + zh * fix: usage stats review fixes — chart coords, refresh, cleanup --------- Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com>df56b50 -
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 -
feat: detect banned accounts and show status in dashboard (#142)
icebear +1: icebear0828Unverified signature* feat: detect banned accounts and show status in dashboard When upstream returns non-Cloudflare 403, the account is now marked as "banned" instead of silently failing quota fetches with no UI feedback. - Add "banned" to AccountStatus type - usage-refresher: detect 403 ban during quota fetch, auto-recover on success - proxy-handler: detect 403 ban during requests, fallback to next account - Dashboard: rose-colored "Banned"/"已封禁" badge in card/table views - Status filter dropdown includes "Banned" option - acquire() naturally skips banned (status !== "active") * feat: handle 401 token invalidation with auto-retry Previously 401 "token has been invalidated" was passed through to the client without marking the account or trying alternatives. - proxy-handler: 401 → markStatus("expired") + try next account - usage-refresher: 401 → markStatus("expired") during quota fetch - Refresh scheduler will attempt token renewal for expired accounts --------- Co-authored-by: icebear0828 <icebear…ba262d0
-
feat: add sticky rotation strategy (#107) (#110)
icebear +1: icebear0828Unverified signature* feat: add sticky rotation strategy with admin UI (#107) Keep using the same account until rate-limited or quota exhausted, instead of rotating across multiple accounts. - Add "sticky" to rotation_strategy config enum - Implement sticky sort in selectByStrategy() (last_used desc) - Add GET/POST /admin/rotation-settings endpoints - Add RotationSettings component (sticky vs rotation radio group) - Add i18n translations (en + zh) - 13 new tests (account-pool-sticky + rotation-settings routes) * refactor: extract ROTATION_STRATEGIES constant to eliminate hardcoded duplication Single source of truth for valid rotation strategies — route handler and Zod schema both reference the exported constant. --------- Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com>d0eeb87
-
feat: add quota settings UI to dashboard (#101)
icebear +1: icebear0828* feat: add quota settings UI to dashboard (#92) Allow users to configure quota refresh interval, warning thresholds, and skip-exhausted toggle directly from the web dashboard instead of editing YAML manually. * docs: update CHANGELOG for quota settings UI --------- Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com>07041c6 -
feat: auto-refresh quota with tiered warnings (#92) (#93)
icebear +1: icebear0828Unverified signatureBackground quota refresher fetches official usage every 5min (configurable), caches on AccountEntry for instant dashboard reads, and marks exhausted accounts as rate_limited. Tiered warning thresholds (default 80%/90%) trigger visual banners in the dashboard. Frontend auto-polls every 30s. Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com>4f2665c -
fix: skip proxy update checker in Electron mode (#89)
icebear +1: icebear0828Unverified signatureElectron has its own native auto-updater (electron-updater) that handles download and install via system tray. The backend's startProxyUpdateChecker() was also running, causing the web UI UpdateModal to pop up and conflict with the native updater. - Skip startProxyUpdateChecker() when deploy mode is "electron" - Don't auto-open UpdateModal in Electron mode Co-authored-by: icebear0828 <icebear0828@users.noreply.github.com>7445795
-
feat: bulk account import/export with selective export (#82)
icebear0828- GET /auth/accounts/export — export all accounts (with tokens) for backup - POST /auth/accounts/import — bulk import from JSON with dedup detection - Dashboard: import/export buttons next to refresh, multi-file import - Selective export: checkbox on each account card, select all/deselect all - 9 unit tests for backend routes268c5a4
-
fix: add color-scheme declaration to prevent browser auto-darkening
icebear0828Browsers with Auto Dark Mode (Chrome/Safari on macOS dark) override CSS colors when color-scheme is not declared. Added color-scheme: light/dark to :root/.dark CSS, index.html meta tag, and JS toggle to explicitly control the color scheme per theme state.f3c6831 -
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
-
feat: Docker image auto-publish to GHCR + Watchtower support
icebear0828- Add docker-publish.yml workflow: multi-arch (amd64/arm64) build on every push to master, published to ghcr.io/icebear0828/codex-proxy - Switch docker-compose.yml from local build to pre-built GHCR image - Add commented Watchtower service block for automatic updates - Simplify README Docker section: no git clone needed, just curl configs - Update dashboard Docker hint to mention Watchtower option - Add dockerAutoUpdateHint i18n key (en/zh)7ff102d -
fix: mode-specific update hints for Docker and Electron
icebear0828- apply-update 400 response now includes mode + hint per deploy type - Docker: docker compose pull && docker compose up -d (was --build) - Electron: prompt to use built-in auto-updater instead of GitHub link - Add electronUpdateHint i18n key (en/zh)009c43a -
feat: SSE update progress + reliable restart on Windows
icebear0828 +1: Claude Opus 4.6 (1M context)- apply-update returns SSE stream with step-by-step progress (pull → install → build → restart) - Frontend parses SSE, shows progress steps with checkmarks in modal - Restart helper writes temp .restart-helper.cjs file instead of -e inline script (fixes Windows command escaping issues) - RESTART_TIMEOUT increased from 30s to 120s - Frontend falls back to restart polling if connection drops mid-stream Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>236dd56 -
fix: dark mode tabs, StableText bilingual width, self-update reliability
icebear0828 +1: Claude Opus 4.6 (1M context)- CodeExamples: fix dark mode tab text invisible (text-dim alpha format broken with CSS variables, use plain #8b949e; tab background use solid #0d1117 instead of transparent bg-dark/30) - StableText: use both en+zh invisible references so button width never jumps on language switch (root cause of recurring i18n layout bug) - Header: remove version/commit display (already shown in footer) - self-update: git checkout -- . before pull to discard local drift; restart via helper script that waits for port release before starting new process (fixes EADDRINUSE on Windows) - apply-update: SSE streaming progress (pull → install → build → restart) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>ca241c4 -
fix: StableText uses both en+zh references for stable button width
icebear0828 +1: Claude Opus 4.6 (1M context)StableText previously used a single reference (either hardcoded English or dynamic t()), so buttons always jumped width on language switch. Now uses both translations.en[key] and translations.zh[key] as invisible grid references — width is always max(en, zh), never changes. Also fix self-update: run git checkout -- . before git pull to discard local modifications (e.g. package-lock.json drift) that block the pull. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>bdd4755
-
feat: display secondary rate limit window (weekly cap) in dashboard
icebear0828 +1: Claude Opus 4.6Add secondary_rate_limit to CodexQuota type and map secondary_window from Codex usage API. Dashboard now shows both primary (hourly) and secondary (weekly) quota bars with independent progress and reset times. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>2996fd8
-
fix: review improvements — schema walker, status helper, UI i18n, CI version skip
icebear0828 +1: Claude Opus 4.61. walkSchema: add patternProperties, if/then/else traversal + cycle detection 2. proxy-handler: extract toErrorStatus() helper, centralize 4x StatusCode casts 3. Header StableText: dynamic t() references for i18n + whitespace-nowrap on status button 4. sync-electron.yml: cancel-in-progress: false + merge two pushes into one Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>6220911
-
feat: add Test Connection diagnostic button (#63)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* feat: add Test Connection diagnostic button (#61) Add a "Test Connection" button to the Dashboard that runs 4 sequential checks (Server, Accounts, Transport, Upstream) and displays pass/fail/skip results with latency — helps Electron users diagnose connectivity issues without access to console logs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use socket address for localhost check, static import for buildHeaders - Replace spoofable x-forwarded-for/x-real-ip with getConnInfo() socket address for /debug/fingerprint and /debug/diagnostics endpoints - Add ::ffff:127.0.0.1 match for IPv4-mapped IPv6 addresses - Change dynamic import() of buildHeaders to static import 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>85a4cbd
-
fix: UpdateModal dialog not centered — add w-full h-full to override UA fit-content
icebear0828 +1: Claude Opus 4.6Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>0666092 -
fix: UpdateModal dialog narrow strip caused by UA fit-content conflict
icebear0828 +1: Claude Opus 4.6Move sizing (max-w-lg) from <dialog> to inner div; dialog now spans full viewport as transparent flex container with inset-0 + max-w-none, completely bypassing browser UA style constraints. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>2adeb3b -
feat: editable proxy_api_key from Dashboard settings panel
icebear0828 +1: Claude Opus 4.6Add GET/POST /admin/settings endpoints to read/write proxy_api_key in config/default.yaml with hot-reload. Dashboard gets a collapsible Settings panel with masked input, save, and clear key functionality. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>69a8388 -
fix: stable i18n layout + version sync from electron to master
icebear0828 +1: Claude Opus 4.6- Header: extract StableText component using inline-grid + whitespace-nowrap to prevent layout shift AND line wrapping when switching languages - getProxyInfo(): try git tag first, fall back to package.json (skip 1.0.0) - sync-electron.yml: after bumping electron, sync version to master's package.json with [skip ci] so git-mode users see real version number - Export NEW_VERSION to GITHUB_ENV for cross-step access Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>d712fd9 -
fix: version display uses git tag + remove inline-grid layout hack
icebear0828 +1: Claude Opus 4.6- getProxyInfo() now tries `git describe --tags` first, falls back to package.json (skipping placeholder "1.0.0"), so git-mode users see the actual release version or just the commit hash - Replace all inline-grid overlay technique with simple whitespace-nowrap to fix two-line button text caused by invisible reference spans Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>66b06ea -
fix: Electron OAuth login + i18n layout shift + update modal (#53)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* fix: Electron OAuth login + i18n toggle layout shift + update modal 1. OAuth login fix for Electron: - Add focus/visibilitychange listeners to detect new accounts immediately when user switches back from system browser (bypasses Chromium throttling) - Track completed sessions server-side so code-relay returns success instead of "Invalid or expired session" after callback server handled it 2. i18n layout stability: - Push Star/Updates buttons from md to lg breakpoint to reduce crowding - Add inline-grid overlay to Star, Check for Updates, Proxy Settings buttons 3. Update modal: extract from Header into standalone UpdateModal component with auto-restart support (git mode spawns new process, frontend auto-refreshes) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: add polling guard + fix Star button inline-grid reference width - Add re-entrancy guard to checkForNewAccount (both shared/ and web/) to prevent concurrent fetches from rapid focu…1b6fb15 -
feat: auto-release pipeline + multi-mode update system + commit hash display
icebear0828 +1: Claude Opus 4.6- sync-electron.yml: auto bump patch version + create tag after merge, concurrency group - release.yml: replace CHANGELOG extraction with GitHub auto-generated release notes - self-update.ts: support git/docker/electron deploy modes, GitHub Releases API, periodic checker - Header: show commit hash in status badge, expandable update panel with changelog - use-update-status: add applyUpdate, mode/commits/release fields Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>0c2aed2
-
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: proxy assignment management page with bulk operations (#34)
icebear +2: icebear0828, Claude Opus 4.6Unverified signature* feat: proxy assignment management page with bulk operations Add dedicated page (#/proxy-settings) for managing proxy assignments across hundreds of accounts with matrix-style dual-column layout: - Left sidebar: proxy group list with counts, search, click-to-filter - Right panel: paginated account table (50/page) with search, status filter, Shift+click range select, per-row proxy dropdown - Bulk actions: batch assign to proxy, round-robin even distribute, rule-based assignment modal - Import/export: download JSON assignments, upload with diff preview - Hash routing (zero-dependency), Header navigation links - Backend: 6 new bulk API endpoints + ProxyPool.bulkAssign() - i18n: 35 new translation keys (en + zh) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address PR review issues in proxy assignment feature - Make accountPool required param (was optional but always passed) - Extract isValidProxyId() helper to eliminate duplicated validation - Add resp.ok checks…f878eff -
perf: instant proxy mode switching via optimistic UI update
icebear0828Replace slow accounts.refresh() (fetches quota from chatgpt.com per account) with local state patch for immediate UI response.2ee9797 -
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: 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: collapsible model dropdown, default to gpt-5.4, remove legacy gpt-5
icebear0828 +1: Claude Opus 4.6- Model selector now collapses after selection (click-outside close) - Default model changed from gpt-5.2-codex to gpt-5.4 - Removed deprecated gpt-5, gpt-5-codex, gpt-5-codex-mini Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>c52388f
-
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
-
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
-
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
-
feat: add manual refresh button with timestamp to account list
icebear0828 +1: Claude Sonnet 4.6- Separate `refreshing` state from initial `loading` so the list stays visible while re-fetching (no blank flash on refresh) - Track `lastUpdated` timestamp, shown as "Updated at HH:MM:SS" next to the button (hidden on mobile, visible sm+) - Refresh button spins during fetch and is disabled to prevent double-tap - i18n: add `refresh` / `updatedAt` keys in both en and zh Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>e6a1587
-
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
-
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: Claude Code quick setup — dashboard card, model aliases & README
icebear0828 +1: Claude Opus 4.6Add one-click env var configuration for Claude Code in the web dashboard with model selector (opus/sonnet/haiku) and copy-all button. Map Claude model names to Codex models in aliases config. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>2f3712c
-
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
-
fix: useStatus not refreshing after first OAuth login
icebear0828 +1: Claude Opus 4.6Re-fetch /auth/status when account count changes so ApiConfig updates from "Loading..." to actual values after login. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>5db3721 -
fix: delete button always visible and not overlapped by status badge
icebear0828 +1: Claude Opus 4.6Move delete button from absolute-positioned overlay into the header flex row next to the status badge. Always visible, no longer hidden behind the "active" badge. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>4638989 -
fix: Anthropic/Gemini code examples now follow selected model
icebear0828 +1: Claude Opus 4.6Hardcoded model names (claude-sonnet-4, gemini-2.5-pro) replaced with the dynamic model variable in all protocol examples. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>717e975
-
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