Spaces:
Paused
Paused
Commit History
-
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: 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 -
docs: auto-sync changelog to README [skip ci]
github-actions[bot]6a579f0 -
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 -
docs: auto-sync changelog to README [skip ci]
github-actions[bot]0e1248b -
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 -
docs: add desktop app download section, update model table
icebear0828 +1: Claude Opus 4.6- Add Desktop App (GitHub Releases) download section to Quick Start - Add Desktop badge (Win | Mac | Linux) - Update model table: gpt-5.4 as default, add codex-spark, add reasoning efforts column - Update Claude Code mapping: Opus → gpt-5.4, Sonnet → gpt-5.3-codex - Sync English README with same changes + add Claude Code setup section Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>794d451
-
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 -
docs: auto-sync changelog to README [skip ci]
github-actions[bot]4355a35 -
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 -
docs: auto-sync changelog to README [skip ci]
github-actions[bot]ec445ea -
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 -
docs: remove external contributor mention from CHANGELOG
icebear0828 +1: Claude Opus 4.6Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>fda1a14 -
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 -
ci: improve changelog sync to show only Added highlights
icebear0828 +1: Claude Opus 4.6Rewrite sync-changelog workflow from Python to Node.js. Extract only ### Added sections (max 3 versions, 5 items each) instead of dumping the full changelog. Add workflow_dispatch trigger for manual runs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>2029dd9 -
ci: auto-sync CHANGELOG to README via GitHub Actions
icebear0828 +1: Claude Opus 4.6Extracts the 3 most recent version sections from CHANGELOG.md and injects them between <!-- CHANGELOG:START/END --> markers in README.md. Triggered on push to master when CHANGELOG.md changes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>680b9a3 -
docs: add recent changes section to README
icebear0828 +1: Claude Opus 4.6Show key changelog highlights directly on the main page with a link to the full CHANGELOG.md for details. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>35c714c -
chore: update client fingerprint to v26.303 / Chromium 144
icebear0828 +1: Claude Opus 4.6Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>22b2541 -
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 -
Merge branch 'feat/window-counters'
icebear0828e336506 -
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
-
docs: update CHANGELOG for refresh button feature
icebear082821cd05d -
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 -
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 -
docs: add Docker cross-container networking tip, fix outdated section name
icebear0828 +1: Claude Opus 4.6- Add note to use host LAN IP instead of host.docker.internal for cross-container access (closes #17) - Fix "Claude Code Quick Setup" → "Anthropic SDK Setup" in README Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>d40d20b -
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: tighten JS detection regex in extract-fingerprint to catch more minified patterns
icebear0828 +1: Claude Opus 4.6Change quantifier from * to + so bare identifier lines in markdown are not falsely matched, while consecutive punctuation sequences like backtick-comma-paren are still caught as minified JS. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>7cc27d8 -
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
-
chore: bump Codex Desktop to v26.227.1448 (build 747)
icebear08282171187 -
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: remove corrupted JS from desktop-context.md that broke tool_calls (#13)
icebear0828 +1: Claude Opus 4.6The extractPrompts() end marker matched `; but minified code uses `, — causing ~7KB of garbage JS to leak into every request's instructions field. Truncated desktop-context.md to clean content and fixed the extraction script regex. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>6c4df8c -
docs: update changelog with dynamic model list & review fixes
icebear0828 +1: Claude Opus 4.6Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>8057cb9 -
Merge pull request #15 from icebear0828/fix/docker-proxy-detection
icebearUnverified signaturefix: Docker 容器自动检测宿主机代理15c7155 -
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
-
Merge pull request #12 from icebear0828/fix/impersonate-known-profiles
icebearUnverified signaturefix: deterministic impersonate profile resolution via known-profile list059677f -
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