A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Gemini CLI & Hermes Agent. Only official website: ccswitch.io
285 matches across 7 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | src-tauri/src/session_manager/providers/hermes.rs | 52 | // ── SQLite scanning ───────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/session_manager/providers/hermes.rs | 283 | // ── JSONL scanning ────────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/proxy/copilot_optimizer.rs | 483 | // ─── 内部辅助 ───────────────────────────────── |
| MEDIUM | src-tauri/src/proxy/copilot_optimizer.rs | 623 | // ─── 测试 ───────────────────────────────────── |
| MEDIUM | src-tauri/src/commands/omo.rs | 39 | // ── OMO Slim commands ─────────────────────────────────────── |
| MEDIUM | src-tauri/src/commands/import_export.rs | 17 | // ─── File import/export ────────────────────────────────────── |
| MEDIUM | src-tauri/src/commands/import_export.rs | 78 | // ─── File dialogs ──────────────────────────────────────────── |
| MEDIUM | src-tauri/src/commands/import_export.rs | 124 | // ─── Database backup management ───────────────────────────── |
| MEDIUM | src-tauri/src/services/omo.rs | 22 | // ── Variant descriptor ───────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/omo.rs | 65 | // ── Service ──────────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/omo.rs | 70 | // ── Path helpers ──────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/omo.rs | 106 | // ── Field extraction ─────────────────────────────────── |
| MEDIUM | src-tauri/src/services/omo.rs | 121 | // ── Merge helpers ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/omo.rs | 199 | // ── Public API (variant-parameterized) ───────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 13 | // ── 数据类型 ────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 90 | // ── Claude 凭据读取 ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 275 | // ── Claude API 查询 ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 429 | // ── Codex 凭据读取 ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 597 | // ── Codex API 查询 ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 734 | // ── Gemini 凭据读取 ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 933 | // ── Gemini Token 刷新 ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 968 | // ── Gemini API 查询 ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 1199 | // ── 入口函数 ────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/subscription.rs | 1316 | // ── 辅助函数 ────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 11 | // ── 供应商检测 ────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 86 | // ── Kimi For Coding ───────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 184 | // ── 智谱 GLM ──────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 309 | // ── MiniMax ───────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/coding_plan.rs | 430 | // ── 公开入口 ──────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav.rs | 20 | // ─── WebDAV extension methods ──────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav.rs | 30 | // ─── URL utilities ─────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav.rs | 85 | // ─── Auth ──────────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav.rs | 129 | // ─── HTTP operations ───────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav.rs | 328 | // ─── Internal helpers ──────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav.rs | 357 | // ─── Service detection & error helpers ─────────────────────── |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 30 | // ─── Protocol constants ────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 74 | // ─── Types ─────────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 124 | // ─── Public API ────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 262 | // ─── Sync status persistence (I3: deduplicated) ───────────── |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 299 | // ─── Snapshot building ─────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 525 | // ─── Download & verify ─────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 623 | // ─── Remote path helpers ───────────────────────────────────── |
| MEDIUM | src-tauri/src/services/webdav_sync.rs | 667 | // ─── Tests ─────────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/balance.rs | 9 | // ── 供应商检测 ────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/balance.rs | 64 | // ── DeepSeek ──────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/balance.rs | 136 | // ── StepFun ───────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/balance.rs | 188 | // ── SiliconFlow ───────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/balance.rs | 259 | // ── OpenRouter ────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/balance.rs | 318 | // ── Novita AI ─────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/balance.rs | 376 | // ── 工具函数 ──────────────────────────────────────────────── |
| MEDIUM | src-tauri/src/services/balance.rs | 386 | // ── 公开入口 ──────────────────────────────────────────────── |
| MEDIUM | src/components/UsageFooter.tsx | 281 | // ── 通用用量组件 ──────────────────────────────────────────── |
| MEDIUM | src/components/settings/WebdavSyncSection.tsx | 40 | // ─── WebDAV service presets ───────────────────────────────── |
| MEDIUM | src/components/settings/WebdavSyncSection.tsx | 115 | // ─── Types ────────────────────────────────────────────────── |
| MEDIUM | src/components/settings/WebdavSyncSection.tsx | 133 | // ─── ActionButton ─────────────────────────────────────────── |
| MEDIUM | src/components/settings/WebdavSyncSection.tsx | 170 | // ─── Main component ───────────────────────────────────────── |
| MEDIUM | src/components/settings/WebdavSyncSection.tsx | 341 | // ─── Handlers ─────────────────────────────────────────── |
| MEDIUM | src/components/settings/WebdavSyncSection.tsx | 523 | // ─── Derived state ────────────────────────────────────── |
| MEDIUM | src/components/settings/WebdavSyncSection.tsx | 543 | // ─── Render ───────────────────────────────────────────── |
| MEDIUM | src/components/providers/forms/ProviderForm.tsx | 771 | // ── Extracted hooks: OpenCode / OMO / OpenClaw ───────────────────── |
| 6 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | src-tauri/build.rs | 1 | fn main() { |
| LOW | src-tauri/src/hermes_config.rs | 1 | //! Hermes Agent 配置文件读写模块 |
| LOW | src-tauri/src/hermes_config.rs | 21 | //! api_key: sk-or-... |
| LOW | src-tauri/src/hermes_config.rs | 121 | } |
| LOW | src-tauri/src/hermes_config.rs | 341 | }) |
| LOW | src-tauri/src/hermes_config.rs | 401 | |
| LOW | src-tauri/src/hermes_config.rs | 781 | let json_val = |
| LOW | src-tauri/src/hermes_config.rs | 881 | // |
| LOW | src-tauri/src/config.rs | 1 | use serde::{Deserialize, Serialize}; |
| LOW | src-tauri/src/provider.rs | 21 | #[serde(rename = "createdAt")] |
| LOW | src-tauri/src/provider.rs | 121 | pub struct UsageScript { |
| LOW | src-tauri/src/provider.rs | 141 | #[serde(rename = "userId")] |
| LOW | src-tauri/src/provider.rs | 181 | /// 用量查询结果(支持多套餐) |
| LOW | src-tauri/src/provider.rs | 221 | /// 从 provider 自身配置读取认证信息(默认) |
| LOW | src-tauri/src/provider.rs | 241 | |
| LOW | src-tauri/src/provider.rs | 261 | pub supports_1m: Option<bool>, |
| LOW | src-tauri/src/provider.rs | 321 | /// 成本倍数(用于计算实际成本) |
| LOW | src-tauri/src/provider.rs | 341 | pub api_format: Option<String>, |
| LOW | src-tauri/src/provider.rs | 361 | pub codex_fast_mode: Option<bool>, |
| LOW | src-tauri/src/provider.rs | 421 | pub claude: bool, |
| LOW | src-tauri/src/provider.rs | 441 | pub sonnet_model: Option<String>, |
| LOW | src-tauri/src/provider.rs | 481 | pub struct UniversalProvider { |
| LOW | src-tauri/src/provider.rs | 501 | #[serde(skip_serializing_if = "Option::is_none")] |
| LOW | src-tauri/src/provider.rs | 701 | |
| LOW | src-tauri/src/codex_config.rs | 521 | /// cc-switch–generated file (identified by filename |
| LOW | src-tauri/src/usage_events.rs | 1 | //! 使用统计实时刷新事件模块 |
| LOW | src-tauri/src/app_config.rs | 181 | pub repo_owner: Option<String>, |
| LOW | src-tauri/src/app_config.rs | 701 | /// 已存在配置文件时的 Prompt 自动导入逻辑 |
| LOW | src-tauri/src/linux_fix.rs | 1 | //! Linux 专用的主窗口恢复补丁。 |
| LOW | src-tauri/src/linux_fix.rs | 21 | use tauri::{PhysicalSize, WebviewWindow}; |
| LOW | src-tauri/src/linux_fix.rs | 41 | /// 调用是 fire-and-forget:内部 spawn 一个异步任务在 ~250ms 后完成。 |
| LOW | src-tauri/src/settings.rs | 201 | #[serde(default)] |
| LOW | src-tauri/src/settings.rs | 221 | pub struct AppSettings { |
| LOW | src-tauri/src/settings.rs | 241 | /// 是否在主页面启用本地代理功能(默认关闭) |
| LOW | src-tauri/src/settings.rs | 281 | #[serde(default, skip_serializing_if = "Option::is_none")] |
| LOW | src-tauri/src/settings.rs | 301 | pub current_provider_opencode: Option<String>, |
| LOW | src-tauri/src/settings.rs | 321 | // ===== WebDAV 备份设置(旧版,保留向后兼容)===== |
| LOW | src-tauri/src/gemini_config.rs | 61 | /// - Key 为空或包含无效字符 |
| LOW | src-tauri/src/gemini_config.rs | 341 | /// { |
| LOW | src-tauri/src/gemini_config.rs | 361 | /// "auth": { |
| LOW | src-tauri/src/database/mod.rs | 1 | //! 数据库模块 - SQLite 数据持久化 |
| LOW | src-tauri/src/database/dao/usage_rollup.rs | 1 | //! Usage rollup DAO |
| LOW | src-tauri/src/proxy/body_filter.rs | 1 | //! 请求体过滤模块 |
| LOW | src-tauri/src/proxy/body_filter.rs | 21 | /// 过滤私有参数(以 `_` 开头的字段) |
| LOW | src-tauri/src/proxy/body_filter.rs | 41 | #[cfg(test)] |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 1 | //! Copilot 请求优化器 |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 21 | pub initiator: &'static str, |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 321 | |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 361 | |
| LOW | src-tauri/src/proxy/copilot_optimizer.rs | 441 | } |
| LOW | src-tauri/src/proxy/handler_context.rs | 21 | pub first_byte_timeout: u64, |
| LOW | src-tauri/src/proxy/handler_context.rs | 41 | pub provider: Provider, |
| LOW | src-tauri/src/proxy/handler_context.rs | 61 | pub session_client_provided: bool, |
| LOW | src-tauri/src/proxy/handler_context.rs | 241 | /// 获取 Provider 列表(用于故障转移) |
| LOW | src-tauri/src/proxy/session.rs | 1 | //! Proxy Session - 请求会话管理 |
| LOW | src-tauri/src/proxy/session.rs | 201 | Generated, |
| LOW | src-tauri/src/proxy/session.rs | 221 | /// ### Claude 请求 |
| LOW | src-tauri/src/proxy/sse.rs | 21 | buffer.drain(..pos + len); |
| LOW | src-tauri/src/proxy/types.rs | 1 | use serde::{Deserialize, Serialize}; |
| LOW | src-tauri/src/proxy/types.rs | 181 | /// 流式静默超时(秒) |
| 83 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | deplink.html | 1208 | "ANTHROPIC_AUTH_TOKEN": "sk-ant-your-api-key-here", |
| HIGH | deplink.html | 1221 | "OPENAI_API_KEY": "sk-proj-your-api-key-here" |
| HIGH | deplink.html | 1236 | "GEMINI_API_KEY": "AIzaSy-your-api-key-here", |
| HIGH | docs/user-manual/ja/5-faq/5.1-config-files.md | 239 | apiKey: "your-api-key", |
| HIGH | docs/user-manual/ja/2-providers/2.1-add.md | 216 | "ANTHROPIC_API_KEY": "your-api-key", |
| HIGH | docs/user-manual/ja/2-providers/2.1-add.md | 236 | "OPENAI_API_KEY": "your-api-key" |
| HIGH | docs/user-manual/ja/2-providers/2.1-add.md | 284 | "GEMINI_API_KEY": "your-api-key", |
| HIGH | docs/user-manual/zh/5-faq/5.1-config-files.md | 239 | apiKey: "your-api-key", |
| HIGH | docs/user-manual/zh/2-providers/2.1-add.md | 216 | "ANTHROPIC_API_KEY": "your-api-key", |
| HIGH | docs/user-manual/zh/2-providers/2.1-add.md | 236 | "OPENAI_API_KEY": "your-api-key" |
| HIGH | docs/user-manual/zh/2-providers/2.1-add.md | 284 | "GEMINI_API_KEY": "your-api-key", |
| HIGH | docs/user-manual/en/5-faq/5.1-config-files.md | 239 | apiKey: "your-api-key", |
| HIGH | docs/user-manual/en/2-providers/2.1-add.md | 216 | "ANTHROPIC_API_KEY": "your-api-key", |
| HIGH | docs/user-manual/en/2-providers/2.1-add.md | 236 | "OPENAI_API_KEY": "your-api-key" |
| HIGH | docs/user-manual/en/2-providers/2.1-add.md | 284 | "GEMINI_API_KEY": "your-api-key", |
| HIGH | src/components/providers/forms/CommonConfigEditor.tsx | 256 | "ANTHROPIC_AUTH_TOKEN": "your-api-key-here" |
| HIGH | src/components/providers/forms/ProviderForm.tsx | 2234 | "apiKey": "your-api-key-here" |
| HIGH | src/components/providers/forms/ProviderForm.tsx | 2263 | "apiKey": "your-api-key-here", |
| HIGH | src/components/providers/forms/GeminiConfigSections.tsx | 99 | GEMINI_API_KEY=sk-your-api-key-here |
| HIGH | src/i18n/locales/zh.json | 1101 | "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}", |
| HIGH | src/i18n/locales/ja.json | 1101 | "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}", |
| HIGH | src/i18n/locales/en.json | 1101 | "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}", |
| HIGH | src/i18n/locales/zh-TW.json | 1073 | "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}", |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | cc-switch-main/src/config/universalProviderPresets.ts | 126 | export function createUniversalProviderFromPreset( |
| LOW | src/types/usage.ts | 200 | export function isNonNegativeDecimalString(value: string): boolean { |
| LOW | src/types/omo.ts | 302 | export function parseOmoOtherFieldsObject( |
| LOW | src/types/omo.ts | 427 | export function buildOmoSlimProfilePreview( |
| LOW | src/config/universalProviderPresets.ts | 96 | export function createUniversalProviderFromPreset( |
| LOW | src/config/openclawProviderPresets.ts | 57 | export function rebaseOpenClawSuggestedDefaults( |
| LOW | src/utils/postChangeSync.ts | 7 | export async function syncCurrentProvidersLiveSafe(): Promise<{ |
| LOW | src/components/settings/WebdavSyncSection.tsx | 101 | function buildPasswordPreservationKey(values: { |
| LOW | …c/components/settings/SkillStorageLocationSettings.tsx | 24 | export function SkillStorageLocationSettings({ |
| LOW | src/components/proxy/CircuitBreakerConfigPanel.tsx | 16 | export function CircuitBreakerConfigPanel() { |
| LOW | src/components/openclaw/utils.ts | 17 | export function parseOpenClawEnvEditorValue(raw: string): OpenClawEnvConfig { |
| LOW | src/components/openclaw/utils.ts | 44 | export function getOpenClawToolsProfileSelectValue(profile?: string): string { |
| LOW | src/components/openclaw/utils.ts | 53 | export function getOpenClawUnsupportedProfile(profile?: string): string | null { |
| LOW | src/components/openclaw/utils.ts | 60 | export function getOpenClawTimeoutInputValue( |
| LOW | src/components/universal/UniversalProviderFormModal.tsx | 29 | export function UniversalProviderFormModal({ |
| LOW | …mponents/providers/forms/ClaudeDesktopProviderForm.tsx | 244 | export function ClaudeDesktopProviderForm({ |
| LOW | src/components/providers/forms/OmoFormFields.tsx | 255 | export function mergeCustomModelsIntoStore( |
| LOW | …omponents/providers/forms/helpers/opencodeFormUtils.ts | 104 | export function parseOpencodeConfigStrict( |
| LOW | src/components/usage/format.ts | 38 | function isTraditionalChineseLanguage(normalizedLanguage: string): boolean { |
| LOW | src/hooks/useHermes.ts | 39 | export function invalidateHermesProviderCaches(queryClient: QueryClient) { |
| LOW | src/hooks/useHermes.ts | 121 | export function useToggleHermesMemoryEnabled() { |
| LOW | src/hooks/useOpenClaw.ts | 32 | export function useOpenClawLiveProviderIds(enabled: boolean) { |
| LOW | src/hooks/useOpenClaw.ts | 77 | export function useOpenClawAgentsDefaults() { |
| LOW | src/hooks/useOpenClaw.ts | 133 | export function useSaveOpenClawAgentsDefaults() { |
| LOW | src/lib/api/copilot.ts | 226 | export async function copilotGetTokenForAccount( |
| LOW | src/lib/api/copilot.ts | 238 | export async function copilotGetModelsForAccount( |
| LOW | src/lib/api/copilot.ts | 252 | export async function copilotGetUsageForAccount( |
| LOW | src/lib/api/config.ts | 11 | export async function getClaudeCommonConfigSnippet(): Promise<string | null> { |
| LOW | src/lib/api/config.ts | 21 | export async function setClaudeCommonConfigSnippet( |
| LOW | src/lib/api/config.ts | 65 | export async function extractCommonConfigSnippet( |
| LOW | src/lib/query/failover.ts | 69 | export function useUpdateCircuitBreakerConfig() { |
| LOW | src/lib/query/failover.ts | 108 | export function useAvailableProvidersForFailover(appType: string) { |
| LOW | src/lib/query/failover.ts | 147 | export function useRemoveFromFailoverQueue() { |
| LOW | src/lib/query/failover.ts | 201 | export function useSetAutoFailoverEnabled() { |
| LOW | src/lib/query/proxy.ts | 92 | export function useSetProxyTakeoverForApp() { |
| LOW | src/lib/query/proxy.ts | 183 | export function useUpdateGlobalProxyConfig() { |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | src-tauri/src/database/backup.rs | 573 | // Step 1: Create safety backup of current database |
| LOW | src-tauri/src/database/backup.rs | 579 | // Step 2: Open the backup file and restore it to the main database |
| LOW | src-tauri/src/database/backup.rs | 592 | // Step 3: Run schema migrations (backup may be from an older version) |
| LOW | src-tauri/src/proxy/providers/transform_responses.rs | 331 | // Step 1: OpenAI nested details as fallback for cache tokens |
| LOW | src-tauri/src/proxy/providers/transform_responses.rs | 349 | // Step 2: Direct Anthropic-style fields override (authoritative if present) |
| LOW | src-tauri/src/deeplink/provider.rs | 35 | // Step 1: Merge config file if provided (v3.8+) |
| LOW | src-tauri/src/deeplink/provider.rs | 523 | // Step 1: Get config content |
| LOW | src-tauri/src/deeplink/provider.rs | 538 | // Step 2: Parse config based on format |
| LOW | src-tauri/src/deeplink/provider.rs | 557 | // Step 3: Extract values from config based on app type and merge with URL params |
| LOW | src-tauri/src/services/env_manager.rs | 22 | // Step 1: Create backup |
| LOW | src-tauri/src/services/env_manager.rs | 25 | // Step 2: Delete variables |
| LOW | src-tauri/src/services/session_usage_codex.rs | 69 | // Step 1: 小写 |
| LOW | src-tauri/src/services/session_usage_codex.rs | 72 | // Step 2: 剥离 "provider/" 前缀(如 openai/, azure/) |
| LOW | src-tauri/src/services/session_usage_codex.rs | 77 | // Step 3: 剥离 ISO 日期后缀 -YYYY-MM-DD(正好 11 字符) |
| LOW | src-tauri/src/services/session_usage_codex.rs | 92 | // Step 4: 剥离紧凑日期后缀 -YYYYMMDD(正好 9 字符) |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | docs/user-manual/en/4-proxy/4.4-usage.md | 90 | - Output Tokens (green) - Response content generated by AI |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | src-tauri/src/proxy/providers/codex_oauth_auth.rs | 1093 | Some("user@example.com".to_string()), |