feat: v1.1.0 - Sync upstream cc-switch v3.17.0#2
Merged
Merged
Conversation
Append a clickable CTA hook to the end of the Kimi K2.6 slogan in all four README locales (en/zh/ja/de), pointing to the existing aff=cc-switch Moonshot console link.
* fix claude mcp path for custom config dir * fix claude mcp custom profile isolation * fix claude mcp override path edges * fix ci test isolation
* fix(ui): improve skills and provider interactions * fix(skills): keep repo manager available on skills.sh * test(skills): cover repo switch after refresh * fix(skills): keep refresh available for empty repo results --------- Co-authored-by: thisTom <[email protected]>
…ng preset (farion1231#4401) Set the default Claude Code auto-compact window to 262144 for the Kimi For Coding provider preset, matching the official Kimi docs: https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html Use templateValues so users can customize the value (e.g. for future models or performance tuning) while keeping 262144 as the default.
* ci: add Windows ARM64 release artifacts * ci: keep release matrix jobs independent * ci: fix pnpm cache path on Windows runners * ci: setup pnpm with corepack on Windows ARM64 * ci: fix Windows ARM64 release build * ci: retry transient release bundler downloads * ci: remove non-minimal release workflow changes * ci: keep release matrix jobs independent macOS signing fails in forks without Apple secrets and, with default matrix fail-fast, cancels the sibling jobs (including Windows ARM64) before they finish. Disable fail-fast so each platform runs to completion. --------- Co-authored-by: MoonDreamStars <[email protected]>
…31#4438) * add glm-5.2 pricing * feat(usage): add live end time option for custom date range Add a "End time follows current time" checkbox in the custom date range picker. When enabled, the end time becomes read-only and automatically tracks the current moment, so usage data always reflects up-to-the-second consumption from the chosen start time. This is especially useful under the Coding Plan 5-hour quota window — users can set the start time to when their 5h window began and keep the end time live to monitor real-time token consumption. * style(usage): fix prettier formatting for UsageDashboard * fix(usage): include liveEndTime in React Query cache keys Without liveEndTime in the query key, a live custom range and a fixed custom range with the same stored endpoints share the same cache entry. After the live range refreshes (endDate = now), switching to the fixed range shows stale data fetched through "now" instead of the original end time.
在为 UsageScriptModal、ProviderForm、UniversalProviderFormModal 中 的 JsonEditor CodeMirror 编辑器添加 darkMode 支持,使用 useDarkMode() hook 监听 App 主题,自动切换 oneDark 编辑器主题。
…is too new (farion1231#4575) * feat(db): in-app recovery screen with upgrade button when DB version is too new When the SQLite user_version is newer than the app supports (SCHEMA_VERSION), Database::init() fails and previously dead-ended in a native Retry/Exit dialog (Retry just fails again). The app now boots a dedicated recovery screen instead. - Detect the recoverable "version too new" case and surface it via init_status (kind="db_version_too_new" + db_version/supported_version); force-show the main window and skip normal AppState boot (recovery commands need only AppHandle). - The recovery screen first checks for an available update: - update available -> "Upgrade app" runs the updater (download + install + restart) with a download progress bar. - no update (already latest) -> warns that the DB is too new even for the latest build (likely a third-party client), so upgrading cannot help. - install_update_and_restart now emits `update-download-progress` events; new `check_app_update_available` command. - i18n: en / ja / zh / zh-TW. Verified: pnpm typecheck + format:check + test:unit (351) green; cross-model review of Rust correctness and recovery-mode safety (no AppState panic). * fix(db): pre-check too-new DB before schema writes; exit on close in recovery mode Addresses review feedback on the too-new-DB recovery flow. - P1: stored_user_version_exceeds_supported() is now checked BEFORE Database::init(), so create_tables()'s DDL (incl. the unconditional DROP INDEX/DROP TABLE IF EXISTS failover_queue) never runs against a database whose user_version we cannot understand. The earlier post-init-failure recovery branch is removed; the pre-check is the single authoritative guard, so "don't write to a DB we can't read" now holds from the very first DB access. - P2: the window CloseRequested handler now detects recovery mode (init_error kind = db_version_too_new) and exits the app instead of honoring minimize_to_tray_on_close. Recovery mode returns before the tray is created, so hiding the window would leave the app running with no tray to bring it back; native-close now quits cleanly. Verified: cargo fmt --check clean; cross-model Rust review of both fixes (compile-correctness + no normal-startup/close regression).
* feat(proxy): 添加本地代理请求覆盖功能,支持自定义请求头和请求体 * fix(proxy): harden local request overrides validation * feat(proxy): 添加受保护的本地代理请求头名称验证功能 * fix(i18n): 更新本地代理请求覆盖的错误提示信息格式 --------- Co-authored-by: jason.mei <[email protected]>
…n1231#4583) * fix(copilot): 修复 GitHub Copilot 出站请求不走全局代理导致 model not supported * fix(proxy): 修复全局代理客户端配置未被应用到 Copilot/Codex OAuth 模块 两个关键问题: 1. CopilotAuthManager 在构造时写死 Client::new(),使得拉取 /models 列表、 换取 token 等认证流程无视全局代理配置(global_proxy_url),直连目标服务。 结果:直连时 /models 返回 0 个 Claude 模型 → live resolution 失效 → 模型 ID 无法正确归一化/匹配 → Copilot 上游返回 400 model_not_supported。 2. CodexOAuthManager 也有完全相同的问题,导致 Codex OAuth 认证请求绕过代理。 改动:删除两个模块的自持 http_client 字段,改为每次请求时从全局客户端现取 (crate::proxy::http_client::get())。这样: - 遵循全局代理 URL 配置 - 支持运行时热更新代理设置 - 符合代码库设计意图(http_client.rs 注释明确说"所有 HTTP 请求应使用此模块") 修复覆盖范围: - copilot_auth.rs: 7 处调用(token 获取、/models 拉取、model vendor 判断) - codex_oauth_auth.rs: 4 处调用(device code、OAuth token 刷新) Fixes farion1231#2016 farion1231#2931
* fix(proxy): decompress Codex request body before forward, support zstd Codex Desktop sends zstd-compressed request bodies when authenticated against the Codex backend, which broke local proxy routing because the handlers parsed the raw bytes with serde_json directly. Reworked on top of current main so it preserves the response_processor behavior that landed after this PR was first opened: - Extract content-encoding helpers into a shared proxy::content_encoding module. decompress_body keeps returning Option<Vec<u8>> so unknown encodings stay pass-through with their content-encoding header intact, and keeps the deflate zlib-then-raw fallback (RFC 9110). - Add zstd/zst support (zstd 0.13) and disable reqwest's auto zstd decompression via .no_zstd() for parity with gzip/br/deflate. - Decompress the request body before JSON parsing in the three Codex handlers (chat_completions / responses / responses_compact) and strip the stale content-encoding / content-length / transfer-encoding headers so the forwarder regenerates them. - Support stacked codings (e.g. "gzip, zstd") by decoding in reverse order and merge repeated Content-Encoding headers via get_all. Fixes farion1231#3764 Fixes farion1231#3696 Co-authored-by: chenx-dust <[email protected]> * fix(proxy): decompress upstream error bodies before reading them The forwarder error branch consumes non-2xx responses via String::from_utf8 directly, bypassing read_decoded_body. reqwest has no auto-decompression feature enabled, so a compressed error body (gzip/br/deflate/zstd) arrives as raw bytes, fails from_utf8, and gets dropped, hiding upstream rate-limit and auth details from the client. Decode the error body with the shared proxy::content_encoding helper, mirroring the success path. Falls back to the raw bytes when the encoding is unsupported or decoding fails. Co-authored-by: chenx-dust <[email protected]> --------- Co-authored-by: Jason <[email protected]> Co-authored-by: chenx-dust <[email protected]>
Volcengine official list price (CNY converted at ~7.14, USD/1M): pro input 0.84 / output 4.2 / cache-hit 0.17; turbo input 0.42 / output 2.1 / cache-hit 0.08. cache_creation kept 0 (Doubao bills cache storage by time, not per-token writes). Appended via INSERT OR IGNORE; 2.0 rows retained for historical usage accounting.
Point DouBaoSeed at doubao-seed-2-1-pro across all six clients (claude, claude-desktop, codex, opencode, openclaw, hermes), replacing doubao-seed-2-0-code-preview-latest. Sync display names to "Doubao Seed 2.1 Pro" and correct the openclaw cost field (0.002/0.006 -> 0.84/4.2 USD/1M) to match the new model.
The account-level AccessKey is buried in the Volcengine console menus, so surface a clickable, visible link to the IAM key management page (https://console.volcengine.com/iam/keymanage) right under the AK/SK hint. Opens via settingsApi.openExternal; adds the volcengineKeyConsoleLink label across all four locales.
The Codex provider form tied Chat-format conversion and route takeover (model mapping) to one toggle, so a provider serving a native Responses API could not use model mapping without forcing Chat Completions conversion. - Promote the upstream format (Chat Completions / Responses) to an independent, always-visible selector that triggers no sub-menus on its own. - The local-routing toggle now solely gates the advanced sub-sections: model mapping catalog, plus reasoning capability when the format is Chat. - Persist modelCatalog / codexChatReasoning based on the takeover toggle and derive its initial state from saved catalog presence (no new persisted field). - Refresh codexConfig i18n (zh/en/ja/zh-TW): add upstreamFormat* keys and reword the routing/advanced hints to reflect the decoupling. - Fix codexChatProviderPresets test expectation for the Doubao Seed 2.1 Pro rename.
…tton - Add an optional `enabled` flag to useScanUnmanagedSkills; the Skills panel scans once on mount (enabled:true), with 30s staleTime + keepPreviousData to dedupe disk IO across navigations. - App subscribes to the shared query (enabled:false) and renders a green dot + tooltip on the top-bar Import button when unmanaged skills are available.
Several Chinese providers now expose a native OpenAI Responses API endpoint, so Codex can reach them directly without the Responses->Chat route-takeover conversion. Switch these presets to apiFormat "openai_responses" and drop the now-unused codexChatReasoning and modelCatalog (removing modelCatalog also keeps the "local route mapping" toggle unchecked by default): - Qwen / DashScope Bailian (/compatible-mode/v1/responses) - Xiaomi MiMo + Token Plan (api.xiaomimimo.com/v1) - Volcengine Doubao (/api/v3/responses) - Meituan LongCat (/openai/v1) - MiniMax CN + intl (/v1/responses, confirmed in the official API reference) SiliconFlow-hosted MiniMax stays openai_chat (third-party endpoint, not MiniMax's own base_url). Also refresh stale model ids on the remaining chat-only providers: GLM 5.1->5.2, StepFun 3.5-flash-2603->3.7-flash, Ling 2.5-1T->2.6-1T.
Switch the Kimi K2.6 sponsor banner from the Moonshot CDN URL to in-repo assets. Chinese README uses kimi-banner-zh.png; English, Japanese and German use kimi-banner-en.png.
Commit 273cc48 migrated 7 CN providers from openai_chat to native openai_responses and refreshed model ids on the remaining chat-only providers, but the codexChatProviderPresets snapshot was not updated, breaking the unit tests on main. Drop the migrated providers (DouBaoSeed, Bailian, Longcat, MiniMax, MiniMax en, Xiaomi MiMo x2) from the chat list, sync GLM/StepFun/Ling model ids, and add a test locking the migrated presets to openai_responses with no modelCatalog (so the local route-mapping toggle stays unchecked).
Refresh the Kimi sponsor blurb to the K2.7 Code release (coding-focused agentic model, ~30% lower thinking-token usage vs K2.6) and bump the banner alt text from K2.6 to K2.7 Code. EN/ZH copy provided by the vendor; JA/DE translated to match.
Co-authored-by: abingyyds <[email protected]>
…Code Add OpenCode Go (opencode.ai/zen/go) provider presets across clients: - Codex: openai_chat conversion with model catalog (GLM/Kimi/DeepSeek/MiMo), no static codexChatReasoning so per-model capability is inferred - OpenCode: @ai-sdk/openai-compatible against /zen/go/v1 - Claude: add apiKeyUrl (opencode.ai/auth) and align websiteUrl to /go Auth is a plain pasteable API key (no OAuth). Go splits wire format by model: OpenAI /chat/completions for GLM/Kimi/DeepSeek/MiMo, Anthropic /messages for MiniMax/Qwen; these presets target the chat-format models.
…artner badge Decouple the in-app promotion banner from isPartner so a preset can show a promo phrase plus referral link without earning the paid-partner star. - ApiKeySection: gate the banner on partnerPromotionKey alone; the star is still driven solely by isPartner. This also un-suppresses the existing MiniMax cn/en promos, which already carried copy without isPartner. - OpenCode Go (claude/codex/opencode): point apiKeyUrl at the referral link and add partnerPromotionKey "opencode_go" (no isPartner set). - i18n: add the opencode_go promo string across zh/en/ja/zh-TW.
Swap the SubRouter apiKeyUrl across all 7 client presets from the neutral console/token page to the affiliate registration link (?aff=l3ri), matching the project's referral-link convention. Sync the preset test constant accordingly.
The Claude Desktop OpenCode Go preset was missed by the referral/promo update that landed for Claude Code / Codex / OpenCode, so its websiteUrl pointed at the bare opencode.ai domain with no apiKeyUrl or partnerPromotionKey. Align it with the other three: websiteUrl -> /go, apiKeyUrl -> the ref=2YTRG2NGTX referral link, and partnerPromotionKey "opencode_go" so the in-app promo banner shows. All four OpenCode Go presets now carry the referral link and promo copy.
Summarize the commits since v3.16.3 across Added/Changed/Fixed/Docs: the SubRouter and OpenCode Go partner presets, native Codex Responses migration for CN providers, proxy hardening (zstd decompression, OAuth-over-proxy, DeepSeek effort strip), and usage/pricing tooling (Volcengine Ark AK/SK queries, models.dev import, live date ranges, GLM-5.2/Doubao pricing).
Add a Changed entry for the removed Fable 5 Verified commemorative banner (1692291) and refresh the stats line to the content-scoped count (53 commits | 126 files | +8,149 / -1,016), excluding the changelog meta commits.
Add Hunyuan Hy3 (released 2026-07-06, 256K context) to seed_model_pricing under both the hunyuan-hy3 and hy3 ids, since the upstream billing id isn't yet confirmed and one of the two should match logged usage. Prices come from Tencent's launch-day list price (CNY 1 / 4 / 0.25 per 1M input / output / cache-hit), converted at 1 USD ~= 7.14: 0.14 / 0.56 / 0.035. cache_write is "0" (no published write rate). Hy3 actually uses input-length tiered billing (<16K / 16-32K / >=32K); the single-price table holds the lowest tier, so long-context requests are under-billed until this is revisited against the official billing page. New model, so seed only.
Expose the top-level `model` key of config.toml as an editable field in the Codex provider form, so users can switch to newly released models (e.g. gpt-5.6) without waiting for a preset update — preset updates only affect newly added providers, existing ones keep their saved TOML. The field syncs bidirectionally with the TOML editor (mirroring the base-URL pattern), suggests models from the mapping catalog plus the provider's /models endpoint, and offers a one-click "add to mapping" action when the value is outside a non-empty catalog. Hidden for official providers. Details: - Save-time catalog sync now only backfills the first mapping row into the top-level model when the field was left empty, so the explicit field wins over the implicit row-0 sync - Escape model names (and base_url) with TOML basic-string escaping and strip control characters from field input: /models ids are remote data and unescaped interpolation could inject config.toml lines (e.g. a forged [mcp_servers.*] command) - The strict model-line matcher now recognizes escaped output, empty strings and single-quoted literals, keeping extract/set round-trips stable; deliberately no key-only loose matching (it would misfire on assignment-looking text inside multiline strings) - Invalidate the fetched model list whenever the request identity changes (base URL, full-URL toggle, API key, custom UA) and discard in-flight responses via a sequence guard, so the dropdown never shows a previous provider's models - i18n for zh/en/ja/zh-TW
Add a show/hide toggle for the header project profile switcher under the Homepage Display section in settings. Defaults to visible so existing users keep the current behavior.
Parse cache_write_tokens from OpenAI usage details and preserve cache creation data across Chat, Responses, and Anthropic conversion paths. Add explicit input-token semantics to request logs and rollups so legacy rows subtract cache reads only while new total-inclusive rows subtract both cache reads and writes. Migrate v12 databases, normalize rollups to fresh input, and cover historical backfill behavior with regression tests.
Round-trip encrypted Responses reasoning items through bridge-owned Anthropic thinking blocks, discard orphaned reasoning-only history, and consume the official reasoning text event vocabulary. Track concurrent streaming items by stable IDs and output indexes, reuse a dedicated fallback block for keyless legacy reasoning, recover tool arguments from done events, and close blocks in protocol order. Normalize empty or incomplete non-streaming tool arguments, reject malformed completed calls, and persist upstream usage before returning terminal conversion errors.
Warn when caller-provided cache breakpoints already exceed the supported total of four while preserving the original markers and upgrading their TTLs. Clarify that automatic injection is governed by the remaining breakpoint budget, and add regression coverage proving excess caller markers are never deleted or reordered.
…idge Codex always sends prompt_cache_key in its Responses requests, but the Responses -> Chat Completions conversion dropped it, breaking session cache affinity on upstreams that route by key (e.g. Kimi Coding). - Re-inject prompt_cache_key after conversion in the forwarder: an explicit client key wins, otherwise a client-provided session ID; generated per-request UUIDs are never sent upstream. - Provider-aware gating: "auto" enables only known-compatible upstreams (api.openai.com, api.kimi.com/coding) because strict gateways reject unknown fields with HTTP 400 (e.g. Fireworks); an advanced Auto/Enabled/Disabled override is available on the Codex form in all four locales. - Kimi For Coding preset opts in explicitly.
Fail closed on HTTP 2xx failure envelopes and pre-output SSE failures so semantic upstream errors can trigger failover instead of becoming empty successful replies. Finalize incomplete and truncated streams explicitly, handle clean EOF and whole JSON responses, and keep tool-call stop reasons and terminal event ordering consistent. Preserve structured tool results, URL images, documents, system roles, and signed thinking across both conversion directions. Drop incomplete historical tool calls safely and classify malformed completed arguments as non-retryable client requests. Keep Codex-to-Anthropic prompt caching enabled by default while honoring the dedicated cache-injection switch.
Honor both the optimizer master switch and the cache-injection sub-switch before mutating native optimizer requests. Use the available four-breakpoint budget across tools, system content, the latest cacheable message, and an older user anchor for long tool-heavy conversations. Preserve caller-owned breakpoint limits, avoid thinking blocks as cache targets, normalize configured TTLs, and add regression coverage for disabled optimization and long histories.
Parse and retain Anthropic's ephemeral 5-minute and 1-hour cache-creation token buckets while preserving the existing aggregate cache-write metric for compatibility. Price 1-hour writes at the documented premium relative to the configured 5-minute write rate, clamp inconsistent provider details safely, and include TTL buckets in usage diagnostics. Persist 1-hour cache-write tokens with schema version 14 so zero-cost backfills and later pricing updates retain the original TTL semantics. Keep session import paths compatible through zero-valued detail fields.
Allow the built-in Codex official provider to participate in takeover mode while preserving Codex's native OAuth or API-key credentials instead of persisting them into provider records. Project official routing into a dedicated TOML provider, normalize inline tables, clean stale managed placeholders, and fail closed when the live configuration cannot be transformed safely. Validate forwarded authorization, make official 401/403 responses non-retryable, avoid circuit-breaker pollution, and share the first-party ChatGPT endpoint across the Codex and Claude adapters.
Do not derive unauthenticated health-check targets from runtime adapter defaults for official providers. Batch checks now skip official entries, and direct base-URL resolution fails explicitly instead of probing first-party endpoints without credentials. Cover the Codex official provider in the stream-check regression tests so future adapter changes cannot silently reintroduce these probes.
Let users switch between the built-in OpenAI provider and third-party Codex providers directly from the provider panel while takeover mode remains active. Centralize the frontend capability predicate so only the fixed codex-official seed receives native-login routing support, and keep copied UUID-based official entries clearly marked as unsupported. Add an idempotent backend command that recreates the deleted official seed, wire it into the add-provider flow, refresh localized guidance, and add mutation and provider-action regression coverage.
- Update Codex OAuth presets to the gpt-5.6 family (haiku -> gpt-5.6-luna) and bump the custom Codex template default model - Inject CLAUDE_CODE_MAX_CONTEXT_TOKENS / CLAUDE_CODE_AUTO_COMPACT_WINDOW (372000, the ChatGPT Codex catalog window with a ~353K effective budget, openai/codex#31860) into effective live settings so Claude Code stops assuming a 200K window and compacts before the upstream rejects the prompt - Gate the injected defaults on every configured model being gpt-5.6*: gpt-5.5's upstream catalog oscillates between 272K and 372K and must not inherit them; explicit user values always win - Strip the injected values on switch-away backfill (mirror-inverse of the injection conditions) so program defaults never harden into per-provider explicit values, and keep both keys out of the shared common-config snippet
- Add the bare gpt-5.6 row (official Sol alias) plus effort-suffix variants mirroring the gpt-5.5 accounting shape, priced at Sol rates - The GPT-5.6 family charges cache writes at 1.25x the uncached input rate (new for OpenAI; earlier GPT models keep their correct zero): set 6.25 / 3.125 / 1.25 for Sol / Terra / Luna across seed rows - Repair earlier zero-value gpt-5.6 tier seeds in existing databases, matching only untouched rows so user-customized prices survive
Claude Code caps unknown model ids at 200K, so the preset's standalone CLAUDE_CODE_AUTO_COMPACT_WINDOW=262144 was clamped by min(window, value) and never took effect. Pair it with CLAUDE_CODE_MAX_CONTEXT_TOKENS and route the endpoint's kimi-for-coding alias on every tier, since both context envs are ignored for claude-* prefixed model ids. Saved providers get the same context defaults injected into effective live settings at switch time, with a mirror-inverse strip on backfill so injected values never harden into provider config. Explicit user values always win over the injected defaults.
Drop the Max Context Tokens / Auto Compact Window template inputs from the Codex and Kimi For Coding presets and hardcode the values in the preset env (372000 / 262144). The rare user who wants different numbers can edit them directly in the JSON editor. Both keys stay on purpose: the compact window resolves as min(model window, value), so matching the window is behavior-neutral today, but the explicit env pins compaction locally against remote-config experiments dialing it down.
ChatGPT's Codex backend routes model availability by the originator and version header pair. Requests identifying as cc-switch without a version were assigned to a cohort where gpt-5.6-luna resolved to an unavailable internal engine, resulting in a misleading 404 Model not found response. Identify takeover requests as codex_cli_rs and send version 0.144.1, satisfying luna's minimal_client_version requirement of 0.144.0. A direct HTTP A/B test confirmed the existing headers returned 404 while the aligned identity completed successfully, so no WebSocket transport workaround is required.
Replace the legacy sudocode.us provider (a name collision) with the new paid sponsor SudoCode on sudocode.chat, updated in place across six clients: Claude Code, Codex, Claude Desktop, OpenCode, OpenClaw, Hermes. - Switch endpoints to api.sudocode.chat, add isPartner + partnerPromotionKey, and add four-locale partnerPromotion copy - Claude Code / Desktop use direct passthrough (no model mapping) - Codex / OpenCode / OpenClaw / Hermes use gpt-5.6-sol - Remove the Gemini entry (outside sponsor scope) - Replace the provider icon with the new brand PNG
…takeover live on save Mapped GPT models were rejected by Codex clients with "model does not support image inputs". Two root causes: - Catalog entries for native-Responses/Anthropic providers cloned a template whose input_modalities defaulted to ["text"], so every mapped model was advertised text-only. model_catalog_json replaces Codex's built-in model table wholesale, and both the TUI and the IDE extension block images pre-send when the current model is found without "image". - Editing the current Codex provider during proxy takeover only refreshed the DB backup, so removing the mapping left a stale model_catalog_json pointer (and its text-only catalog file) active in live config. Changes: - New shared model_capabilities module: explicit row declaration first, then a confirmed text-only registry (exact tail match only — prefix matching removed, variants enumerated so future -vl/-vision models fail open), everything else unknown. - Catalog generation writes input_modalities from that inference for all tool profiles: unknown models fail open to ["text","image"]; only confirmed text-only models are advertised as ["text"], giving users a clear client-side prompt instead of silent image stripping. - Live catalog reverse-import collapses modalities that match current inference, so registry corrections are not frozen into hidden row overrides and the rectifier's heuristic opt-out keeps working. - Saving the current Codex provider while takeover owns live now re-projects the live config (mirrors the hot-switch path), so mapping edits and removals take effect immediately. - Media rectifier delegates to the shared module; its preflight toggle is documented (4 locales) as proxy-request-only, never affecting catalog capability declarations.
…e accounting The forced 1-hour cache_control TTL (schema v14) was a mistake. Injected breakpoints return to Anthropic's standard 5-minute TTL, caller-owned markers are preserved verbatim instead of having their TTLs rewritten, and the 5m/1h cache-write buckets are removed from usage parsing and pricing (back to the single aggregate cache-creation rate). The cache TTL selector is removed from the rectifier settings panel along with its i18n keys in all four locales. SCHEMA_VERSION returns to 13: the unreleased cache_creation_1h_tokens column and the v13->v14 migration are removed. The feature never shipped in a release and the introducing commit was never pushed, so no databases were stamped v14 outside this machine (local DB verified at user_version 13).
The routing-required toast for Anthropic-format Codex providers only had a Chinese defaultValue in code; non-Chinese locales showed a mixed-language message. Add the reason string to zh/en/ja/zh-TW following the phrasing of the sibling proxyReason* keys.
Step-by-step guide for the v3.17.0 native Anthropic Messages upstream: add a custom Codex provider pointed at a Claude-family /v1/messages gateway, pick the anthropic upstream format, enable local routing, and verify the chain. Covers the auth-field choice (Bearer vs x-api-key), the Claude Code impersonation toggle, the 8192 max-output fallback, and a FAQ entry for gateways that restrict keys to Claude Code only. Includes four UI screenshots captured from the real 3.17.0 app with sample data, and links the guide from the v3.17.0 release notes in all three languages.
- Remove unused import std::io::Write in settings.rs - Remove needless return statements in misc.rs and settings.rs - Replace redundant closure with function reference in utils.rs - Add #[allow(clippy::incompatible_msrv)] for floor_char_boundary - Add #[allow(dead_code)] for unused but potentially useful functions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR syncs upstream cc-switch changes from v3.17.0 into Hyper MITM v1.1.0.
Upstream Changes Merged
Conflict Resolutions
HyperMITM-Specific Features Preserved
Validation
🤖 Generated with Claude Code