Repository Analysis

farion1231/cc-switch

A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Gemini CLI & Hermes Agent. Only official website: ccswitch.io

2.0 Likely human-written View on GitHub
2.0
Adjusted Score
2.0
Raw Score
100%
Time Factor
2026-05-30
Last Push
84,980
Stars
Rust
Language
257,989
Lines of Code
742
Files
285
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 24MEDIUM 66LOW 195

Pattern Findings

285 matches across 7 categories. Click a row to expand file-level details.

Decorative Section Separators66 hits · 198 pts
SeverityFileLineSnippet
MEDIUMsrc-tauri/src/session_manager/providers/hermes.rs52// ── SQLite scanning ─────────────────────────────────────────────────
MEDIUMsrc-tauri/src/session_manager/providers/hermes.rs283// ── JSONL scanning ──────────────────────────────────────────────────
MEDIUMsrc-tauri/src/proxy/copilot_optimizer.rs483// ─── 内部辅助 ─────────────────────────────────
MEDIUMsrc-tauri/src/proxy/copilot_optimizer.rs623// ─── 测试 ─────────────────────────────────────
MEDIUMsrc-tauri/src/commands/omo.rs39// ── OMO Slim commands ───────────────────────────────────────
MEDIUMsrc-tauri/src/commands/import_export.rs17// ─── File import/export ──────────────────────────────────────
MEDIUMsrc-tauri/src/commands/import_export.rs78// ─── File dialogs ────────────────────────────────────────────
MEDIUMsrc-tauri/src/commands/import_export.rs124// ─── Database backup management ─────────────────────────────
MEDIUMsrc-tauri/src/services/omo.rs22// ── Variant descriptor ─────────────────────────────────────────
MEDIUMsrc-tauri/src/services/omo.rs65// ── Service ────────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/omo.rs70 // ── Path helpers ────────────────────────────────────────
MEDIUMsrc-tauri/src/services/omo.rs106 // ── Field extraction ───────────────────────────────────
MEDIUMsrc-tauri/src/services/omo.rs121 // ── Merge helpers ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/omo.rs199 // ── Public API (variant-parameterized) ─────────────────
MEDIUMsrc-tauri/src/services/subscription.rs13// ── 数据类型 ──────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs90// ── Claude 凭据读取 ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs275// ── Claude API 查询 ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs429// ── Codex 凭据读取 ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs597// ── Codex API 查询 ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs734// ── Gemini 凭据读取 ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs933// ── Gemini Token 刷新 ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs968// ── Gemini API 查询 ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs1199// ── 入口函数 ──────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/subscription.rs1316// ── 辅助函数 ──────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/coding_plan.rs11// ── 供应商检测 ──────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/coding_plan.rs86// ── Kimi For Coding ─────────────────────────────────────────
MEDIUMsrc-tauri/src/services/coding_plan.rs184// ── 智谱 GLM ────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/coding_plan.rs309// ── MiniMax ─────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/coding_plan.rs430// ── 公开入口 ────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav.rs20// ─── WebDAV extension methods ────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav.rs30// ─── URL utilities ───────────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav.rs85// ─── Auth ────────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav.rs129// ─── HTTP operations ─────────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav.rs328// ─── Internal helpers ────────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav.rs357// ─── Service detection & error helpers ───────────────────────
MEDIUMsrc-tauri/src/services/webdav_sync.rs30// ─── Protocol constants ──────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav_sync.rs74// ─── Types ───────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav_sync.rs124// ─── Public API ──────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav_sync.rs262// ─── Sync status persistence (I3: deduplicated) ─────────────
MEDIUMsrc-tauri/src/services/webdav_sync.rs299// ─── Snapshot building ───────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav_sync.rs525// ─── Download & verify ───────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav_sync.rs623// ─── Remote path helpers ─────────────────────────────────────
MEDIUMsrc-tauri/src/services/webdav_sync.rs667// ─── Tests ───────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/balance.rs9// ── 供应商检测 ──────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/balance.rs64// ── DeepSeek ────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/balance.rs136// ── StepFun ─────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/balance.rs188// ── SiliconFlow ─────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/balance.rs259// ── OpenRouter ──────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/balance.rs318// ── Novita AI ───────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/balance.rs376// ── 工具函数 ────────────────────────────────────────────────
MEDIUMsrc-tauri/src/services/balance.rs386// ── 公开入口 ────────────────────────────────────────────────
MEDIUMsrc/components/UsageFooter.tsx281// ── 通用用量组件 ────────────────────────────────────────────
MEDIUMsrc/components/settings/WebdavSyncSection.tsx40// ─── WebDAV service presets ─────────────────────────────────
MEDIUMsrc/components/settings/WebdavSyncSection.tsx115// ─── Types ──────────────────────────────────────────────────
MEDIUMsrc/components/settings/WebdavSyncSection.tsx133// ─── ActionButton ───────────────────────────────────────────
MEDIUMsrc/components/settings/WebdavSyncSection.tsx170// ─── Main component ─────────────────────────────────────────
MEDIUMsrc/components/settings/WebdavSyncSection.tsx341 // ─── Handlers ───────────────────────────────────────────
MEDIUMsrc/components/settings/WebdavSyncSection.tsx523 // ─── Derived state ──────────────────────────────────────
MEDIUMsrc/components/settings/WebdavSyncSection.tsx543 // ─── Render ─────────────────────────────────────────────
MEDIUMsrc/components/providers/forms/ProviderForm.tsx771 // ── Extracted hooks: OpenCode / OMO / OpenClaw ─────────────────────
6 more matches not shown…
Over-Commented Block143 hits · 143 pts
SeverityFileLineSnippet
LOWsrc-tauri/build.rs1fn main() {
LOWsrc-tauri/src/hermes_config.rs1//! Hermes Agent 配置文件读写模块
LOWsrc-tauri/src/hermes_config.rs21//! api_key: sk-or-...
LOWsrc-tauri/src/hermes_config.rs121}
LOWsrc-tauri/src/hermes_config.rs341 })
LOWsrc-tauri/src/hermes_config.rs401
LOWsrc-tauri/src/hermes_config.rs781 let json_val =
LOWsrc-tauri/src/hermes_config.rs881//
LOWsrc-tauri/src/config.rs1use serde::{Deserialize, Serialize};
LOWsrc-tauri/src/provider.rs21 #[serde(rename = "createdAt")]
LOWsrc-tauri/src/provider.rs121pub struct UsageScript {
LOWsrc-tauri/src/provider.rs141 #[serde(rename = "userId")]
LOWsrc-tauri/src/provider.rs181/// 用量查询结果(支持多套餐)
LOWsrc-tauri/src/provider.rs221 /// 从 provider 自身配置读取认证信息(默认)
LOWsrc-tauri/src/provider.rs241
LOWsrc-tauri/src/provider.rs261 pub supports_1m: Option<bool>,
LOWsrc-tauri/src/provider.rs321 /// 成本倍数(用于计算实际成本)
LOWsrc-tauri/src/provider.rs341 pub api_format: Option<String>,
LOWsrc-tauri/src/provider.rs361 pub codex_fast_mode: Option<bool>,
LOWsrc-tauri/src/provider.rs421 pub claude: bool,
LOWsrc-tauri/src/provider.rs441 pub sonnet_model: Option<String>,
LOWsrc-tauri/src/provider.rs481pub struct UniversalProvider {
LOWsrc-tauri/src/provider.rs501 #[serde(skip_serializing_if = "Option::is_none")]
LOWsrc-tauri/src/provider.rs701
LOWsrc-tauri/src/codex_config.rs521/// cc-switch–generated file (identified by filename
LOWsrc-tauri/src/usage_events.rs1//! 使用统计实时刷新事件模块
LOWsrc-tauri/src/app_config.rs181 pub repo_owner: Option<String>,
LOWsrc-tauri/src/app_config.rs701 /// 已存在配置文件时的 Prompt 自动导入逻辑
LOWsrc-tauri/src/linux_fix.rs1//! Linux 专用的主窗口恢复补丁。
LOWsrc-tauri/src/linux_fix.rs21use tauri::{PhysicalSize, WebviewWindow};
LOWsrc-tauri/src/linux_fix.rs41/// 调用是 fire-and-forget:内部 spawn 一个异步任务在 ~250ms 后完成。
LOWsrc-tauri/src/settings.rs201 #[serde(default)]
LOWsrc-tauri/src/settings.rs221pub struct AppSettings {
LOWsrc-tauri/src/settings.rs241 /// 是否在主页面启用本地代理功能(默认关闭)
LOWsrc-tauri/src/settings.rs281 #[serde(default, skip_serializing_if = "Option::is_none")]
LOWsrc-tauri/src/settings.rs301 pub current_provider_opencode: Option<String>,
LOWsrc-tauri/src/settings.rs321 // ===== WebDAV 备份设置(旧版,保留向后兼容)=====
LOWsrc-tauri/src/gemini_config.rs61/// - Key 为空或包含无效字符
LOWsrc-tauri/src/gemini_config.rs341/// {
LOWsrc-tauri/src/gemini_config.rs361/// "auth": {
LOWsrc-tauri/src/database/mod.rs1//! 数据库模块 - SQLite 数据持久化
LOWsrc-tauri/src/database/dao/usage_rollup.rs1//! Usage rollup DAO
LOWsrc-tauri/src/proxy/body_filter.rs1//! 请求体过滤模块
LOWsrc-tauri/src/proxy/body_filter.rs21/// 过滤私有参数(以 `_` 开头的字段)
LOWsrc-tauri/src/proxy/body_filter.rs41#[cfg(test)]
LOWsrc-tauri/src/proxy/copilot_optimizer.rs1//! Copilot 请求优化器
LOWsrc-tauri/src/proxy/copilot_optimizer.rs21 pub initiator: &'static str,
LOWsrc-tauri/src/proxy/copilot_optimizer.rs321
LOWsrc-tauri/src/proxy/copilot_optimizer.rs361
LOWsrc-tauri/src/proxy/copilot_optimizer.rs441 }
LOWsrc-tauri/src/proxy/handler_context.rs21 pub first_byte_timeout: u64,
LOWsrc-tauri/src/proxy/handler_context.rs41 pub provider: Provider,
LOWsrc-tauri/src/proxy/handler_context.rs61 pub session_client_provided: bool,
LOWsrc-tauri/src/proxy/handler_context.rs241 /// 获取 Provider 列表(用于故障转移)
LOWsrc-tauri/src/proxy/session.rs1//! Proxy Session - 请求会话管理
LOWsrc-tauri/src/proxy/session.rs201 Generated,
LOWsrc-tauri/src/proxy/session.rs221/// ### Claude 请求
LOWsrc-tauri/src/proxy/sse.rs21 buffer.drain(..pos + len);
LOWsrc-tauri/src/proxy/types.rs1use serde::{Deserialize, Serialize};
LOWsrc-tauri/src/proxy/types.rs181 /// 流式静默超时(秒)
83 more matches not shown…
Magic Placeholder Names23 hits · 115 pts
SeverityFileLineSnippet
HIGHdeplink.html1208 "ANTHROPIC_AUTH_TOKEN": "sk-ant-your-api-key-here",
HIGHdeplink.html1221 "OPENAI_API_KEY": "sk-proj-your-api-key-here"
HIGHdeplink.html1236 "GEMINI_API_KEY": "AIzaSy-your-api-key-here",
HIGHdocs/user-manual/ja/5-faq/5.1-config-files.md239 apiKey: "your-api-key",
HIGHdocs/user-manual/ja/2-providers/2.1-add.md216 "ANTHROPIC_API_KEY": "your-api-key",
HIGHdocs/user-manual/ja/2-providers/2.1-add.md236 "OPENAI_API_KEY": "your-api-key"
HIGHdocs/user-manual/ja/2-providers/2.1-add.md284 "GEMINI_API_KEY": "your-api-key",
HIGHdocs/user-manual/zh/5-faq/5.1-config-files.md239 apiKey: "your-api-key",
HIGHdocs/user-manual/zh/2-providers/2.1-add.md216 "ANTHROPIC_API_KEY": "your-api-key",
HIGHdocs/user-manual/zh/2-providers/2.1-add.md236 "OPENAI_API_KEY": "your-api-key"
HIGHdocs/user-manual/zh/2-providers/2.1-add.md284 "GEMINI_API_KEY": "your-api-key",
HIGHdocs/user-manual/en/5-faq/5.1-config-files.md239 apiKey: "your-api-key",
HIGHdocs/user-manual/en/2-providers/2.1-add.md216 "ANTHROPIC_API_KEY": "your-api-key",
HIGHdocs/user-manual/en/2-providers/2.1-add.md236 "OPENAI_API_KEY": "your-api-key"
HIGHdocs/user-manual/en/2-providers/2.1-add.md284 "GEMINI_API_KEY": "your-api-key",
HIGHsrc/components/providers/forms/CommonConfigEditor.tsx256 "ANTHROPIC_AUTH_TOKEN": "your-api-key-here"
HIGHsrc/components/providers/forms/ProviderForm.tsx2234 "apiKey": "your-api-key-here"
HIGHsrc/components/providers/forms/ProviderForm.tsx2263 "apiKey": "your-api-key-here",
HIGHsrc/components/providers/forms/GeminiConfigSections.tsx99GEMINI_API_KEY=sk-your-api-key-here
HIGHsrc/i18n/locales/zh.json1101 "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}",
HIGHsrc/i18n/locales/ja.json1101 "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}",
HIGHsrc/i18n/locales/en.json1101 "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}",
HIGHsrc/i18n/locales/zh-TW.json1073 "authJsonPlaceholder": "{\n \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}",
Hyper-Verbose Identifiers36 hits · 38 pts
SeverityFileLineSnippet
LOWcc-switch-main/src/config/universalProviderPresets.ts126export function createUniversalProviderFromPreset(
LOWsrc/types/usage.ts200export function isNonNegativeDecimalString(value: string): boolean {
LOWsrc/types/omo.ts302export function parseOmoOtherFieldsObject(
LOWsrc/types/omo.ts427export function buildOmoSlimProfilePreview(
LOWsrc/config/universalProviderPresets.ts96export function createUniversalProviderFromPreset(
LOWsrc/config/openclawProviderPresets.ts57export function rebaseOpenClawSuggestedDefaults(
LOWsrc/utils/postChangeSync.ts7export async function syncCurrentProvidersLiveSafe(): Promise<{
LOWsrc/components/settings/WebdavSyncSection.tsx101function buildPasswordPreservationKey(values: {
LOW…c/components/settings/SkillStorageLocationSettings.tsx24export function SkillStorageLocationSettings({
LOWsrc/components/proxy/CircuitBreakerConfigPanel.tsx16export function CircuitBreakerConfigPanel() {
LOWsrc/components/openclaw/utils.ts17export function parseOpenClawEnvEditorValue(raw: string): OpenClawEnvConfig {
LOWsrc/components/openclaw/utils.ts44export function getOpenClawToolsProfileSelectValue(profile?: string): string {
LOWsrc/components/openclaw/utils.ts53export function getOpenClawUnsupportedProfile(profile?: string): string | null {
LOWsrc/components/openclaw/utils.ts60export function getOpenClawTimeoutInputValue(
LOWsrc/components/universal/UniversalProviderFormModal.tsx29export function UniversalProviderFormModal({
LOW…mponents/providers/forms/ClaudeDesktopProviderForm.tsx244export function ClaudeDesktopProviderForm({
LOWsrc/components/providers/forms/OmoFormFields.tsx255export function mergeCustomModelsIntoStore(
LOW…omponents/providers/forms/helpers/opencodeFormUtils.ts104export function parseOpencodeConfigStrict(
LOWsrc/components/usage/format.ts38function isTraditionalChineseLanguage(normalizedLanguage: string): boolean {
LOWsrc/hooks/useHermes.ts39export function invalidateHermesProviderCaches(queryClient: QueryClient) {
LOWsrc/hooks/useHermes.ts121export function useToggleHermesMemoryEnabled() {
LOWsrc/hooks/useOpenClaw.ts32export function useOpenClawLiveProviderIds(enabled: boolean) {
LOWsrc/hooks/useOpenClaw.ts77export function useOpenClawAgentsDefaults() {
LOWsrc/hooks/useOpenClaw.ts133export function useSaveOpenClawAgentsDefaults() {
LOWsrc/lib/api/copilot.ts226export async function copilotGetTokenForAccount(
LOWsrc/lib/api/copilot.ts238export async function copilotGetModelsForAccount(
LOWsrc/lib/api/copilot.ts252export async function copilotGetUsageForAccount(
LOWsrc/lib/api/config.ts11export async function getClaudeCommonConfigSnippet(): Promise<string | null> {
LOWsrc/lib/api/config.ts21export async function setClaudeCommonConfigSnippet(
LOWsrc/lib/api/config.ts65export async function extractCommonConfigSnippet(
LOWsrc/lib/query/failover.ts69export function useUpdateCircuitBreakerConfig() {
LOWsrc/lib/query/failover.ts108export function useAvailableProvidersForFailover(appType: string) {
LOWsrc/lib/query/failover.ts147export function useRemoveFromFailoverQueue() {
LOWsrc/lib/query/failover.ts201export function useSetAutoFailoverEnabled() {
LOWsrc/lib/query/proxy.ts92export function useSetProxyTakeoverForApp() {
LOWsrc/lib/query/proxy.ts183export function useUpdateGlobalProxyConfig() {
Verbosity Indicators15 hits · 25 pts
SeverityFileLineSnippet
LOWsrc-tauri/src/database/backup.rs573 // Step 1: Create safety backup of current database
LOWsrc-tauri/src/database/backup.rs579 // Step 2: Open the backup file and restore it to the main database
LOWsrc-tauri/src/database/backup.rs592 // Step 3: Run schema migrations (backup may be from an older version)
LOWsrc-tauri/src/proxy/providers/transform_responses.rs331 // Step 1: OpenAI nested details as fallback for cache tokens
LOWsrc-tauri/src/proxy/providers/transform_responses.rs349 // Step 2: Direct Anthropic-style fields override (authoritative if present)
LOWsrc-tauri/src/deeplink/provider.rs35 // Step 1: Merge config file if provided (v3.8+)
LOWsrc-tauri/src/deeplink/provider.rs523 // Step 1: Get config content
LOWsrc-tauri/src/deeplink/provider.rs538 // Step 2: Parse config based on format
LOWsrc-tauri/src/deeplink/provider.rs557 // Step 3: Extract values from config based on app type and merge with URL params
LOWsrc-tauri/src/services/env_manager.rs22 // Step 1: Create backup
LOWsrc-tauri/src/services/env_manager.rs25 // Step 2: Delete variables
LOWsrc-tauri/src/services/session_usage_codex.rs69 // Step 1: 小写
LOWsrc-tauri/src/services/session_usage_codex.rs72 // Step 2: 剥离 "provider/" 前缀(如 openai/, azure/)
LOWsrc-tauri/src/services/session_usage_codex.rs77 // Step 3: 剥离 ISO 日期后缀 -YYYY-MM-DD(正好 11 字符)
LOWsrc-tauri/src/services/session_usage_codex.rs92 // Step 4: 剥离紧凑日期后缀 -YYYYMMDD(正好 9 字符)
Synthetic Comment Markers1 hit · 5 pts
SeverityFileLineSnippet
HIGHdocs/user-manual/en/4-proxy/4.4-usage.md90- Output Tokens (green) - Response content generated by AI
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippet
LOWsrc-tauri/src/proxy/providers/codex_oauth_auth.rs1093 Some("user@example.com".to_string()),