A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Gemini CLI & Hermes Agent. Only official website: ccswitch.io
This report presents the forensic synthetic code analysis of farion1231/cc-switch, a Rust project with 116,946 GitHub stars. SynthScan v2.0 examined 315,655 lines of code across 828 source files, recording 446 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 2.5 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 446 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src-tauri/src/session_manager/providers/hermes.rs | 52 | // ── SQLite scanning ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/session_manager/providers/hermes.rs | 283 | // ── JSONL scanning ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/proxy/copilot_optimizer.rs | 483 | // ─── 内部辅助 ───────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/proxy/copilot_optimizer.rs | 623 | // ─── 测试 ───────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/omo.rs | 39 | // ── OMO Slim commands ─────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/import_export.rs | 17 | // ─── File import/export ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/import_export.rs | 78 | // ─── File dialogs ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/import_export.rs | 124 | // ─── Database backup management ───────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/omo.rs | 22 | // ── Variant descriptor ───────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/omo.rs | 65 | // ── Service ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/omo.rs | 70 | // ── Path helpers ──────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/omo.rs | 106 | // ── Field extraction ─────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/omo.rs | 121 | // ── Merge helpers ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/omo.rs | 199 | // ── Public API (variant-parameterized) ───────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 13 | // ── 数据类型 ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 96 | // ── Claude 凭据读取 ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 281 | // ── Claude API 查询 ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 454 | // ── Codex 凭据读取 ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 622 | // ── Codex API 查询 ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 763 | // ── Gemini 凭据读取 ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 962 | // ── Gemini Token 刷新 ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 997 | // ── Gemini API 查询 ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 1226 | // ── 入口函数 ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/subscription.rs | 1347 | // ── 辅助函数 ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 21 | // ─── Protocol constants ────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 36 | // ─── Error helpers ─────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 60 | // ─── Types ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 103 | // ─── Snapshot building ─────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 164 | // ─── Manifest handling ─────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 248 | // ─── Artifact verification ─────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 307 | // ─── Snapshot application ──────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 342 | // ─── Utilities ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 396 | // ─── Sync status persistence ───────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/sync_protocol.rs | 416 | // ─── Tests ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 11 | // ── 供应商检测 ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 100 | // ── Kimi For Coding ───────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 208 | // ── 智谱 GLM ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 408 | // ── MiniMax ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 493 | // ── ZenMux ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 697 | // ── 火山方舟 Agent Plan / Coding Plan ─────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 788 | // ── 火山引擎签名 V4(AK/SK)───────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 1172 | // ── 公开入口 ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 1188 | // ── 智谱团队套餐(Team Plan)────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav.rs | 20 | // ─── WebDAV extension methods ──────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav.rs | 30 | // ─── URL utilities ─────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav.rs | 85 | // ─── Auth ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav.rs | 129 | // ─── HTTP operations ───────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav.rs | 328 | // ─── Internal helpers ──────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav.rs | 357 | // ─── Service detection & error helpers ─────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 30 | // ─── Sync lock ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 51 | // ─── Public API ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 189 | // ─── Sync status persistence ───────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 243 | // ─── Download & verify ─────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 276 | // ─── Remote path helpers ───────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 308 | // ─── Tests ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/balance.rs | 15 | // ── 供应商检测 ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/balance.rs | 70 | // ── DeepSeek ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/balance.rs | 148 | // ── StepFun ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/balance.rs | 206 | // ── SiliconFlow ───────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/services/balance.rs | 283 | // ── OpenRouter ────────────────────────────────────────────── | COMMENT |
| 38 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src-tauri/build.rs | 1 | fn main() { | COMMENT |
| LOW | src-tauri/src/codex_state_db.rs | 1 | //! Locating Codex's per-thread state SQLite databases. | COMMENT |
| LOW | src-tauri/src/codex_history_migration.rs | 341 | generation.is_dir() && backup_generation_matches_dir(&generation, codex_dir_key) | COMMENT |
| LOW | src-tauri/src/hermes_config.rs | 1 | //! Hermes Agent 配置文件读写模块 | COMMENT |
| LOW | src-tauri/src/hermes_config.rs | 21 | //! api_key: sk-or-... | COMMENT |
| LOW | src-tauri/src/hermes_config.rs | 221 | } | COMMENT |
| LOW | src-tauri/src/hermes_config.rs | 481 | /// ``` | COMMENT |
| LOW | src-tauri/src/hermes_config.rs | 781 | /// Upserts into the `custom_providers:` YAML sequence (matched by `name`). | COMMENT |
| LOW | src-tauri/src/hermes_config.rs | 1001 | serde_yaml::from_str(&json_str) | COMMENT |
| LOW | src-tauri/src/config.rs | 1 | use serde::{Deserialize, Serialize}; | COMMENT |
| LOW | src-tauri/src/lib.rs | 1521 | // 处理退出请求(所有平台) | COMMENT |
| LOW | src-tauri/src/lib.rs | 2041 | COMMENT | |
| LOW | src-tauri/src/provider.rs | 21 | #[serde(skip_serializing_if = "Option::is_none")] | COMMENT |
| LOW | src-tauri/src/provider.rs | 221 | pub enabled: bool, | COMMENT |
| LOW | src-tauri/src/provider.rs | 241 | pub user_id: Option<String>, | COMMENT |
| LOW | src-tauri/src/provider.rs | 261 | pub secret_access_key: Option<String>, | COMMENT |
| LOW | src-tauri/src/provider.rs | 341 | #[serde(rename_all = "camelCase")] | COMMENT |
| LOW | src-tauri/src/provider.rs | 401 | #[serde(rename = "claudeDesktopMode", skip_serializing_if = "Option::is_none")] | COMMENT |
| LOW | src-tauri/src/provider.rs | 421 | rename = "partnerPromotionKey", | COMMENT |
| LOW | src-tauri/src/provider.rs | 441 | #[serde(rename = "apiFormat", skip_serializing_if = "Option::is_none")] | COMMENT |
| LOW | src-tauri/src/provider.rs | 461 | /// "auto" enables known-compatible upstreams; "enabled" / "disabled" are overrides. | COMMENT |
| LOW | src-tauri/src/provider.rs | 481 | /// request body, so without this the path falls back to a conservative | COMMENT |
| LOW | src-tauri/src/provider.rs | 501 | #[serde(rename = "liveConfigManaged", skip_serializing_if = "Option::is_none")] | COMMENT |
| LOW | src-tauri/src/provider.rs | 581 | #[derive(Debug, Clone, Serialize, Deserialize, Default)] | COMMENT |
| LOW | src-tauri/src/provider.rs | 601 | /// Sonnet 默认模型 | COMMENT |
| LOW | src-tauri/src/provider.rs | 641 | COMMENT | |
| LOW | src-tauri/src/provider.rs | 661 | #[serde(default)] | COMMENT |
| LOW | src-tauri/src/provider.rs | 861 | }) | COMMENT |
| LOW | src-tauri/src/codex_config.rs | 21 | pub const CC_SWITCH_CODEX_MODEL_CATALOG_FILENAME: &str = "cc-switch-model-catalog.json"; | COMMENT |
| LOW | src-tauri/src/codex_config.rs | 41 | /// | COMMENT |
| LOW | src-tauri/src/codex_config.rs | 101 | false | COMMENT |
| LOW | src-tauri/src/codex_config.rs | 121 | /// Additionally the Codex `web_search` hosted tool is unusable on this path | COMMENT |
| LOW | src-tauri/src/codex_config.rs | 521 | } | COMMENT |
| LOW | src-tauri/src/codex_config.rs | 1021 | COMMENT | |
| LOW | src-tauri/src/codex_config.rs | 1161 | COMMENT | |
| LOW | src-tauri/src/usage_events.rs | 1 | //! 使用统计实时刷新事件模块 | COMMENT |
| LOW | src-tauri/src/app_config.rs | 181 | pub repo_owner: Option<String>, | COMMENT |
| LOW | src-tauri/src/app_config.rs | 701 | /// 已存在配置文件时的 Prompt 自动导入逻辑 | COMMENT |
| LOW | src-tauri/src/linux_fix.rs | 1 | //! Linux 专用的主窗口恢复补丁。 | COMMENT |
| LOW | src-tauri/src/linux_fix.rs | 21 | use tauri::{PhysicalSize, WebviewWindow}; | COMMENT |
| LOW | src-tauri/src/linux_fix.rs | 41 | /// 调用是 fire-and-forget:内部 spawn 一个异步任务在 ~250ms 后完成。 | COMMENT |
| LOW | src-tauri/src/settings.rs | 321 | pub struct CodexOfficialHistoryUnifyMigration { | COMMENT |
| LOW | src-tauri/src/settings.rs | 341 | // ===== 设备级 UI 设置 ===== | COMMENT |
| LOW | src-tauri/src/settings.rs | 361 | #[serde(default)] | COMMENT |
| LOW | src-tauri/src/settings.rs | 381 | /// Run official Codex providers under the shared "custom" model_provider id | COMMENT |
| LOW | src-tauri/src/settings.rs | 421 | // ===== 当前供应商 ID(设备级)===== | COMMENT |
| LOW | src-tauri/src/settings.rs | 441 | #[serde(default, skip_serializing_if = "Option::is_none")] | COMMENT |
| LOW | src-tauri/src/settings.rs | 461 | #[serde(default, skip_serializing_if = "Option::is_none")] | COMMENT |
| LOW | src-tauri/src/gemini_config.rs | 61 | /// - Key 为空或包含无效字符 | COMMENT |
| LOW | src-tauri/src/gemini_config.rs | 341 | /// { | COMMENT |
| LOW | src-tauri/src/gemini_config.rs | 361 | /// "auth": { | COMMENT |
| LOW | src-tauri/src/database/mod.rs | 1 | //! 数据库模块 - SQLite 数据持久化 | COMMENT |
| LOW | src-tauri/src/database/dao/usage_rollup.rs | 1 | //! Usage rollup DAO | COMMENT |
| LOW | src-tauri/src/proxy/body_filter.rs | 1 | //! 请求体过滤模块 | COMMENT |
| LOW | src-tauri/src/proxy/body_filter.rs | 21 | /// 过滤私有参数(以 `_` 开头的字段) | COMMENT |
| LOW | src-tauri/src/proxy/body_filter.rs | 41 | #[cfg(test)] | COMMENT |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 1 | //! Copilot 请求优化器 | COMMENT |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 21 | pub initiator: &'static str, | COMMENT |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 321 | COMMENT | |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 361 | COMMENT | |
| 116 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | deplink.html | 1208 | "ANTHROPIC_AUTH_TOKEN": "sk-ant-your-api-key-here", | CODE |
| HIGH | deplink.html | 1221 | "OPENAI_API_KEY": "sk-proj-your-api-key-here" | CODE |
| HIGH | deplink.html | 1236 | "GEMINI_API_KEY": "AIzaSy-your-api-key-here", | CODE |
| HIGH | docs/user-manual/ja/5-faq/5.1-config-files.md | 263 | apiKey: "your-api-key", | CODE |
| HIGH | docs/user-manual/ja/2-providers/2.1-add.md | 216 | "ANTHROPIC_API_KEY": "your-api-key", | CODE |
| HIGH | docs/user-manual/ja/2-providers/2.1-add.md | 236 | "OPENAI_API_KEY": "your-api-key" | CODE |
| HIGH | docs/user-manual/ja/2-providers/2.1-add.md | 284 | "GEMINI_API_KEY": "your-api-key", | CODE |
| HIGH | docs/user-manual/zh/5-faq/5.1-config-files.md | 263 | apiKey: "your-api-key", | CODE |
| HIGH | docs/user-manual/zh/2-providers/2.1-add.md | 216 | "ANTHROPIC_API_KEY": "your-api-key", | CODE |
| HIGH | docs/user-manual/zh/2-providers/2.1-add.md | 236 | "OPENAI_API_KEY": "your-api-key" | CODE |
| HIGH | docs/user-manual/zh/2-providers/2.1-add.md | 284 | "GEMINI_API_KEY": "your-api-key", | CODE |
| HIGH | docs/user-manual/en/5-faq/5.1-config-files.md | 263 | apiKey: "your-api-key", | CODE |
| HIGH | docs/user-manual/en/2-providers/2.1-add.md | 216 | "ANTHROPIC_API_KEY": "your-api-key", | CODE |
| HIGH | docs/user-manual/en/2-providers/2.1-add.md | 236 | "OPENAI_API_KEY": "your-api-key" | CODE |
| HIGH | docs/user-manual/en/2-providers/2.1-add.md | 284 | "GEMINI_API_KEY": "your-api-key", | CODE |
| HIGH | src/components/providers/forms/CommonConfigEditor.tsx | 256 | "ANTHROPIC_AUTH_TOKEN": "your-api-key-here" | CODE |
| HIGH | src/components/providers/forms/ProviderForm.tsx | 2408 | "apiKey": "your-api-key-here" | CODE |
| HIGH | src/components/providers/forms/ProviderForm.tsx | 2438 | "apiKey": "your-api-key-here", | CODE |
| HIGH | src/components/providers/forms/GeminiConfigSections.tsx | 99 | GEMINI_API_KEY=sk-your-api-key-here | CODE |
| HIGH | src/i18n/locales/zh.json | 1253 | "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}", | CODE |
| HIGH | src/i18n/locales/ja.json | 1253 | "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}", | CODE |
| HIGH | src/i18n/locales/en.json | 1253 | "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}", | CODE |
| HIGH | src/i18n/locales/zh-TW.json | 1225 | "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/guides/codex-deepseek-routing-guide-ja.md | 30 | ## Step 1: Codex プロバイダーを追加する | COMMENT |
| LOW | docs/guides/codex-deepseek-routing-guide-ja.md | 43 | ## Step 2: ローカルルーティングを有効にして Codex をルーティングする | COMMENT |
| LOW | docs/guides/codex-deepseek-routing-guide-ja.md | 54 | ## Step 3: プロバイダーを切り替えて Codex を再起動する | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-ja.md | 94 | ### Step 1: スイッチを見つける | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-ja.md | 110 | ### Step 2: スイッチをオフからオンに切り替える → 確認ダイアログが表示される | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-ja.md | 162 | ### Step 1: スイッチをオンからオフに切り替える → バックアップを探索 → 確認ダイアログが表示される | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-ja.md | 181 | ### Step 2: 復元はどう実行されるか(バックアップ台帳に従って正確に戻す) | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-ja.md | 197 | ### Step 3: 通知を見て、結果を確認する | COMMENT |
| LOW | docs/guides/codex-kimi-routing-guide-en.md | 37 | ## Step 1: Add a Codex provider | COMMENT |
| LOW | docs/guides/codex-kimi-routing-guide-en.md | 50 | ## Step 2: Enable local routing and route Codex | COMMENT |
| LOW | docs/guides/codex-kimi-routing-guide-en.md | 61 | ## Step 3: Switch providers and restart Codex | COMMENT |
| LOW | docs/guides/codex-claude-routing-guide-ja.md | 32 | ## Step 1: Codex プロバイダーを追加する | COMMENT |
| LOW | docs/guides/codex-claude-routing-guide-ja.md | 59 | ## Step 2: ローカルルーティングを有効にして Codex をルーティングする | COMMENT |
| LOW | docs/guides/codex-claude-routing-guide-ja.md | 70 | ## Step 3: プロバイダーを切り替えて Codex を再起動する | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-en.md | 42 | ## Step 1: Switch back to OpenAI Official and complete official login | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-en.md | 52 | ## Step 2: Enable Codex App Enhancements | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-en.md | 73 | ## Step 3: Add a third-party Codex provider | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-en.md | 84 | ## Step 4: Enable local routing and route Codex when needed | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-en.md | 101 | ## Step 5: Switch to the third-party provider and restart Codex | COMMENT |
| LOW | docs/guides/codex-deepseek-routing-guide-en.md | 30 | ## Step 1: Add a Codex provider | COMMENT |
| LOW | docs/guides/codex-deepseek-routing-guide-en.md | 43 | ## Step 2: Enable local routing and route Codex | COMMENT |
| LOW | docs/guides/codex-deepseek-routing-guide-en.md | 54 | ## Step 3: Switch providers and restart Codex | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-en.md | 94 | ### Step 1: Find the switch | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-en.md | 110 | ### Step 2: Flip the switch from off to on -> a confirmation dialog pops up | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-en.md | 162 | ### Step 1: Flip the switch from on to off -> probe for backups -> a confirmation dialog pops up | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-en.md | 181 | ### Step 2: How restore runs (precise flip-back per the backup ledger) | COMMENT |
| LOW | docs/guides/codex-unified-session-history-guide-en.md | 197 | ### Step 3: Read the toast, confirm the result | COMMENT |
| LOW | docs/guides/codex-kimi-routing-guide-ja.md | 37 | ## Step 1: Codex プロバイダーを追加する | COMMENT |
| LOW | docs/guides/codex-kimi-routing-guide-ja.md | 50 | ## Step 2: ローカルルーティングを有効にして Codex をルーティングする | COMMENT |
| LOW | docs/guides/codex-kimi-routing-guide-ja.md | 61 | ## Step 3: プロバイダーを切り替えて Codex を再起動する | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-ja.md | 42 | ## Step 1: OpenAI Official に戻して公式ログインを完了する | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-ja.md | 52 | ## Step 2: Codex アプリ拡張を有効化する | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-ja.md | 73 | ## Step 3: サードパーティ Codex プロバイダーを追加する | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-ja.md | 84 | ## Step 4: 必要に応じてローカルルーティングと Codex ルーティングを有効化する | COMMENT |
| LOW | …cs/guides/codex-official-auth-preservation-guide-ja.md | 101 | ## Step 5: サードパーティプロバイダーへ切り替えて Codex を再起動する | COMMENT |
| LOW | docs/guides/codex-claude-routing-guide-en.md | 32 | ## Step 1: Add a Codex provider | COMMENT |
| LOW | docs/guides/codex-claude-routing-guide-en.md | 59 | ## Step 2: Enable local routing and take over Codex | COMMENT |
| LOW | docs/guides/codex-claude-routing-guide-en.md | 70 | ## Step 3: Switch providers and restart Codex | COMMENT |
| LOW | docs/user-manual/en/1-getting-started/1.4-quickstart.md | 5 | ## Step 1: Add a Provider | COMMENT |
| LOW | docs/user-manual/en/1-getting-started/1.4-quickstart.md | 18 | ## Step 2: Switch Provider | COMMENT |
| LOW | docs/user-manual/en/1-getting-started/1.4-quickstart.md | 29 | ## Step 3: Activation | COMMENT |
| LOW | docs/user-manual/en/2-providers/2.6-claude-desktop.md | 29 | ### Step 1: Open the Claude Desktop Panel | COMMENT |
| LOW | docs/user-manual/en/2-providers/2.6-claude-desktop.md | 41 | ### Step 2: Import or Add Providers | COMMENT |
| LOW | docs/user-manual/en/2-providers/2.6-claude-desktop.md | 82 | ### Step 3: Switch and Restart Claude Desktop | COMMENT |
| LOW⚡ | src-tauri/src/database/backup.rs | 573 | // Step 1: Create safety backup of current database | COMMENT |
| LOW⚡ | src-tauri/src/database/backup.rs | 579 | // Step 2: Open the backup file and restore it to the main database | COMMENT |
| LOW | src-tauri/src/database/backup.rs | 592 | // Step 3: Run schema migrations (backup may be from an older version) | COMMENT |
| LOW | src-tauri/src/proxy/providers/transform_responses.rs | 491 | // Step 1: OpenAI nested details as fallback for cache tokens | COMMENT |
| LOW | src-tauri/src/proxy/providers/transform_responses.rs | 522 | // Step 2: Direct Anthropic-style fields override (authoritative if present) | COMMENT |
| LOW | src-tauri/src/deeplink/provider.rs | 35 | // Step 1: Merge config file if provided (v3.8+) | COMMENT |
| LOW | src-tauri/src/deeplink/provider.rs | 557 | // Step 1: Get config content | COMMENT |
| LOW | src-tauri/src/deeplink/provider.rs | 572 | // Step 2: Parse config based on format | COMMENT |
| LOW | src-tauri/src/deeplink/provider.rs | 591 | // Step 3: Extract values from config based on app type and merge with URL params | COMMENT |
| LOW⚡ | src-tauri/src/services/env_manager.rs | 22 | // Step 1: Create backup | COMMENT |
| LOW⚡ | src-tauri/src/services/env_manager.rs | 25 | // Step 2: Delete variables | COMMENT |
| LOW⚡ | src-tauri/src/services/session_usage_codex.rs | 223 | // Step 1: 小写 | COMMENT |
| LOW⚡ | src-tauri/src/services/session_usage_codex.rs | 226 | // Step 2: 剥离 "provider/" 前缀(如 openai/, azure/) | COMMENT |
| LOW⚡ | src-tauri/src/services/session_usage_codex.rs | 231 | // Step 3: 剥离 ISO 日期后缀 -YYYY-MM-DD(正好 11 字符) | COMMENT |
| LOW | src-tauri/src/services/session_usage_codex.rs | 246 | // Step 4: 剥离紧凑日期后缀 -YYYYMMDD(正好 9 字符) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/types/usage.ts | 227 | export function isNonNegativeDecimalString(value: string): boolean { | CODE |
| LOW | src/types/omo.ts | 302 | export function parseOmoOtherFieldsObject( | CODE |
| LOW | src/types/omo.ts | 427 | export function buildOmoSlimProfilePreview( | CODE |
| LOW | src/config/universalProviderPresets.ts | 96 | export function createUniversalProviderFromPreset( | CODE |
| LOW | src/config/openclawProviderPresets.ts | 58 | export function rebaseOpenClawSuggestedDefaults( | CODE |
| LOW | src/utils/providerCapabilities.ts | 7 | export function supportsOfficialProxyTakeover( | CODE |
| LOW | src/utils/postChangeSync.ts | 7 | export async function syncCurrentProvidersLiveSafe(): Promise<{ | CODE |
| LOW | src/components/UsageScriptModal.tsx | 161 | function isOfficialSubscriptionProvider(provider: Provider, appId: AppId) { | CODE |
| LOW | src/components/settings/WebdavSyncSection.tsx | 160 | function buildPasswordPreservationKey(values: { | CODE |
| LOW | …c/components/settings/SkillStorageLocationSettings.tsx | 24 | export function SkillStorageLocationSettings({ | CODE |
| LOW | src/components/proxy/CircuitBreakerConfigPanel.tsx | 16 | export function CircuitBreakerConfigPanel() { | CODE |
| LOW | src/components/openclaw/utils.ts | 17 | export function parseOpenClawEnvEditorValue(raw: string): OpenClawEnvConfig { | CODE |
| LOW⚡ | src/components/openclaw/utils.ts | 44 | export function getOpenClawToolsProfileSelectValue(profile?: string): string { | CODE |
| LOW⚡ | src/components/openclaw/utils.ts | 53 | export function getOpenClawUnsupportedProfile(profile?: string): string | null { | CODE |
| LOW⚡ | src/components/openclaw/utils.ts | 60 | export function getOpenClawTimeoutInputValue( | CODE |
| LOW | src/components/universal/UniversalProviderFormModal.tsx | 30 | export function UniversalProviderFormModal({ | CODE |
| LOW | …mponents/providers/forms/ClaudeDesktopProviderForm.tsx | 250 | export function ClaudeDesktopProviderForm({ | CODE |
| LOW | src/components/providers/forms/OmoFormFields.tsx | 254 | export function mergeCustomModelsIntoStore( | CODE |
| LOW | …ts/providers/forms/LocalProxyRequestOverridesField.tsx | 16 | export function LocalProxyRequestOverridesField({ | CODE |
| LOW | …omponents/providers/forms/helpers/opencodeFormUtils.ts | 109 | export function parseOpencodeConfigStrict( | CODE |
| LOW | src/components/usage/ModelsDevPickerDialog.tsx | 76 | export function normalizeModelIdForPricing(modelId: string): string { | CODE |
| LOW | src/components/usage/ConnectivityCheckConfigPanel.tsx | 15 | export function ConnectivityCheckConfigPanel() { | CODE |
| LOW | src/components/usage/format.ts | 38 | function isTraditionalChineseLanguage(normalizedLanguage: string): boolean { | CODE |
| LOW | src/hooks/useHermes.ts | 39 | export function invalidateHermesProviderCaches(queryClient: QueryClient) { | CODE |
| LOW | src/hooks/useHermes.ts | 121 | export function useToggleHermesMemoryEnabled() { | CODE |
| LOW | src/hooks/useOpenClaw.ts | 32 | export function useOpenClawLiveProviderIds(enabled: boolean) { | CODE |
| LOW | src/hooks/useOpenClaw.ts | 77 | export function useOpenClawAgentsDefaults() { | CODE |
| LOW | src/hooks/useOpenClaw.ts | 133 | export function useSaveOpenClawAgentsDefaults() { | CODE |
| LOW | src/lib/requestOverrides.ts | 65 | export function isProtectedLocalProxyHeaderName(name: string): boolean { | CODE |
| LOW | src/lib/requestOverrides.ts | 152 | export function formatRequestOverrideObject( | CODE |
| LOW | src/lib/requestOverrides.ts | 159 | export function buildLocalProxyRequestOverrides( | CODE |
| LOW | src/lib/api/copilot.ts | 226 | export async function copilotGetTokenForAccount( | CODE |
| LOW | src/lib/api/copilot.ts | 238 | export async function copilotGetModelsForAccount( | CODE |
| LOW | src/lib/api/copilot.ts | 252 | export async function copilotGetUsageForAccount( | CODE |
| LOW | src/lib/api/config.ts | 11 | export async function getClaudeCommonConfigSnippet(): Promise<string | null> { | CODE |
| LOW | src/lib/api/config.ts | 21 | export async function setClaudeCommonConfigSnippet( | CODE |
| LOW | src/lib/api/config.ts | 62 | export async function updateTomlCommonConfigSnippet( | CODE |
| LOW | src/lib/api/config.ts | 88 | export async function extractCommonConfigSnippet( | CODE |
| LOW | src/lib/query/failover.ts | 69 | export function useUpdateCircuitBreakerConfig() { | CODE |
| LOW | src/lib/query/failover.ts | 108 | export function useAvailableProvidersForFailover(appType: string) { | CODE |
| LOW | src/lib/query/failover.ts | 147 | export function useRemoveFromFailoverQueue() { | CODE |
| LOW | src/lib/query/failover.ts | 201 | export function useSetAutoFailoverEnabled() { | CODE |
| LOW | src/lib/query/proxy.ts | 92 | export function useSetProxyTakeoverForApp() { | CODE |
| LOW | src/lib/query/proxy.ts | 183 | export function useUpdateGlobalProxyConfig() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src-tauri/src/proxy/providers/codex_oauth_auth.rs | 1087 | Some("user@example.com".to_string()), | CODE |
| LOW | src/components/providers/forms/HermesFormFields.tsx | 92 | const candidate = trimmed.replace(TEMPLATE_TOKEN_RE, "placeholder"); | CODE |
| LOW | src/i18n/locales/zh.json | 52 | "placeholder": "请输入API Key", | CODE |
| LOW | src/i18n/locales/zh.json | 2284 | "placeholder": "状态筛选", | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 2503 | "placeholder": "127.0.0.1", | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 2508 | "placeholder": "15721", | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 2513 | "placeholder": "3", | CODE |
| LOW⚡ | src/i18n/locales/zh.json | 2518 | "placeholder": "0(不限)或 300", | CODE |
| LOW | src/i18n/locales/ja.json | 52 | "placeholder": "API Key を入力", | CODE |
| LOW | src/i18n/locales/ja.json | 2284 | "placeholder": "状態で絞り込み", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 2503 | "placeholder": "127.0.0.1", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 2508 | "placeholder": "15721", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 2513 | "placeholder": "3", | CODE |
| LOW⚡ | src/i18n/locales/ja.json | 2518 | "placeholder": "0(無制限)または 300", | CODE |
| LOW | src/i18n/locales/en.json | 52 | "placeholder": "Enter API Key", | CODE |
| LOW | src/i18n/locales/en.json | 2284 | "placeholder": "Filter by status", | CODE |
| LOW⚡ | src/i18n/locales/en.json | 2503 | "placeholder": "127.0.0.1", | CODE |
| LOW⚡ | src/i18n/locales/en.json | 2508 | "placeholder": "15721", | CODE |
| LOW⚡ | src/i18n/locales/en.json | 2513 | "placeholder": "3", | CODE |
| LOW⚡ | src/i18n/locales/en.json | 2518 | "placeholder": "0 (unlimited) or 300", | CODE |
| LOW | src/i18n/locales/zh-TW.json | 52 | "placeholder": "請輸入 API Key", | CODE |
| LOW | src/i18n/locales/zh-TW.json | 2256 | "placeholder": "狀態篩選", | CODE |
| LOW⚡ | src/i18n/locales/zh-TW.json | 2475 | "placeholder": "127.0.0.1", | CODE |
| LOW⚡ | src/i18n/locales/zh-TW.json | 2480 | "placeholder": "15721", | CODE |
| LOW⚡ | src/i18n/locales/zh-TW.json | 2485 | "placeholder": "3", | CODE |
| LOW⚡ | src/i18n/locales/zh-TW.json | 2490 | "placeholder": "0(不限)或 300", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src-tauri/src/database/backup.rs | 573 | // Step 1: Create safety backup of current database | COMMENT |
| LOW⚡ | src-tauri/src/database/backup.rs | 579 | // Step 2: Open the backup file and restore it to the main database | COMMENT |
| LOW | src-tauri/src/database/backup.rs | 592 | // Step 3: Run schema migrations (backup may be from an older version) | COMMENT |
| LOW | src-tauri/src/proxy/providers/transform_responses.rs | 491 | // Step 1: OpenAI nested details as fallback for cache tokens | COMMENT |
| LOW | src-tauri/src/proxy/providers/transform_responses.rs | 522 | // Step 2: Direct Anthropic-style fields override (authoritative if present) | COMMENT |
| LOW | src-tauri/src/deeplink/provider.rs | 35 | // Step 1: Merge config file if provided (v3.8+) | COMMENT |
| LOW | src-tauri/src/deeplink/provider.rs | 557 | // Step 1: Get config content | COMMENT |
| LOW | src-tauri/src/deeplink/provider.rs | 572 | // Step 2: Parse config based on format | COMMENT |
| LOW | src-tauri/src/deeplink/provider.rs | 591 | // Step 3: Extract values from config based on app type and merge with URL params | COMMENT |
| LOW⚡ | src-tauri/src/services/env_manager.rs | 22 | // Step 1: Create backup | COMMENT |
| LOW⚡ | src-tauri/src/services/env_manager.rs | 25 | // Step 2: Delete variables | COMMENT |
| LOW⚡ | src-tauri/src/services/session_usage_codex.rs | 223 | // Step 1: 小写 | COMMENT |
| LOW⚡ | src-tauri/src/services/session_usage_codex.rs | 226 | // Step 2: 剥离 "provider/" 前缀(如 openai/, azure/) | COMMENT |
| LOW⚡ | src-tauri/src/services/session_usage_codex.rs | 231 | // Step 3: 剥离 ISO 日期后缀 -YYYY-MM-DD(正好 11 字符) | COMMENT |
| LOW | src-tauri/src/services/session_usage_codex.rs | 246 | // Step 4: 剥离紧凑日期后缀 -YYYYMMDD(正好 9 字符) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | src-tauri/src/resources/gpt5_5_template.json | 42 | "base_instructions": "You are Codex, a coding agent based on GPT-5. You and the user share one workspace, and your job | CODE |
| MEDIUM⚡ | src-tauri/src/resources/gpt5_5_template.json | 44 | "instructions_template": "You are Codex, a coding agent based on GPT-5. You and the user share one workspace, and yo | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/user-manual/en/4-proxy/4.4-usage.md | 90 | - Output Tokens (green) - Response content generated by AI | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src-tauri/src/resources/gpt5_5_template.json | 42 | "base_instructions": "You are Codex, a coding agent based on GPT-5. You and the user share one workspace, and your job | CODE |
| LOW⚡ | src-tauri/src/resources/gpt5_5_template.json | 44 | "instructions_template": "You are Codex, a coding agent based on GPT-5. You and the user share one workspace, and yo | CODE |