repo = PLocalSwitch
rust.files = 89
rust.lines = 8642
typescript.files = 49
typescript.lines = 5074
typescript_tsx = 35
typescript_ts = 14
docs_markdown.files = 15
docs_markdown.lines = 1334
repo_files_excluding_git = 241
modules.gateway_api.files = 9
modules.gateway_api.lines = 1836
modules.gateway_api.stub_hits = 5
modules.router.files = 4
modules.router.lines = 540
modules.router.stub_hits = 0
modules.flex_adapter.files = 8
modules.flex_adapter.lines = 628
modules.flex_adapter.stub_hits = 5
modules.backend_adapters.files = 15
modules.backend_adapters.lines = 1444
modules.backend_adapters.stub_hits = 4
modules.cache_pool.files = 5
modules.cache_pool.lines = 293
modules.cache_pool.stub_hits = 2
modules.billing.files = 7
modules.billing.lines = 223
modules.billing.stub_hits = 2
modules.node_quality.files = 5
modules.node_quality.lines = 131
modules.node_quality.stub_hits = 3
modules.observability.files = 6
modules.observability.lines = 446
modules.observability.stub_hits = 1
modules.safety_runtime.files = 7
modules.safety_runtime.lines = 144
modules.safety_runtime.stub_hits = 0
modules.optional_components.files = 5
modules.optional_components.lines = 15
modules.optional_components.stub_hits = 2
modules.commands.files = 6
modules.commands.lines = 673
modules.commands.stub_hits = 0
modules.services.files = 5
modules.services.lines = 543
modules.services.stub_hits = 0
modules.(crate root).files = 7
modules.(crate root).lines = 1726
tests.total = 14
tests.files: list[3] [{"file": "src-tauri/src/billing/pricing.rs", "count": 4}, {"file": "src-tauri/src/gateway_api/inbound_sniffer.rs", "count": 4}, {"file": "src-tauri/src/observability/masking.rs", "count": 6}]
routes.count = 27
routes.items: list[27] [{"method": "GET", "path": "/", "file": "src-tauri/src/gateway_api/mod.rs"}, {"method": "POST", "path": "/*rest", "file": "src-tauri/src/gateway_api/inbound_routes.rs"}, {"method": "POST", "path": "/anthropic/v1/messages", "file": "src-tauri/src/gateway_api/inbound_routes.rs"}, {"method": "POST", "path": "/api/chat", "file": "src-tauri/src/gateway_api/inbound_routes.rs"}, {"method": "POST", "path": "/api/generate", "file": "src-tauri/src/gateway_api/inbound_routes.rs"}, {"method": "GET", "path": "/audit", "file": "src-tauri/src/gateway_api/manage_routes.rs"}, {"method": "GET", "path": "/audit/discrepancy", "file": "src-tauri/src/gateway_api/manage_routes.rs"}, {"method": "GET", "path": "/billing/client-keys", "file": "src-tauri/src/gateway_api/manage_routes.rs"}, {"method": "GET", "path": "/billing/rates", "file": "src-tauri/src/gateway_api/manage_routes.rs"}, {"method": "GET", "path": "/billing/summary", "file": "src-tauri/src/gateway_api/manage_routes.rs"}, {"method": "POST", "path": "/cache/purge", "file": "src-tauri/src/gateway_api/manage_routes.rs"}, {"method": "GET", "path": "/cache/stats", "file": "src-tauri/src/gateway_api/manage_routes.rs"}]
protocol_kinds.count = 14
protocol_kinds.items: list[14] ["OpenAI", "#", "Anthropic", "Gemini", "BedrockConverse", "CohereV2", "Qianfan", "DashScope", "Spark", "Hunyuan", "Ollama", "Vllm"]
adapters.count = 14
adapters.by_class.native = 5
adapters.by_class.passthrough = 8
adapters.by_class.stub = 1
adapters.items: list[14] [{"module": "anthropic_adapter", "lines": 332, "class": "native"}, {"module": "bedrock_adapter", "lines": 23, "class": "stub"}, {"module": "cohere_v2_adapter", "lines": 23, "class": "passthrough"}, {"module": "custom_openai_compat_adapter", "lines": 26, "class": "passthrough"}, {"module": "dashscope_adapter", "lines": 23, "class": "passthrough"}, {"module": "gemini_adapter", "lines": 258, "class": "native"}, {"module": "hunyuan_adapter", "lines": 23, "class": "passthrough"}, {"module": "ollama_adapter", "lines": 170, "class": "native"}, {"module": "openai_adapter", "lines": 79, "class": "native"}, {"module": "qianfan_adapter", "lines": 23, "class": "passthrough"}, {"module": "responses_adapter", "lines": 280, "class": "native"}, {"module": "spark_adapter", "lines": 24, "class": "passthrough"}]
stub_markers.count = 22
stub_markers.items: list[22] [{"file": "src-tauri/src/backend_adapters/bedrock_adapter.rs", "line": 13, "text": "Err(AppError::Labeled { label: ErrorLabel::Internal, message: \"BedrockConverseAdapter stub: translate_request TODO\".into() })"}, {"file": "src-tauri/src/backend_adapters/bedrock_adapter.rs", "line": 17, "text": "Err(AppError::Labeled { label: ErrorLabel::JsonParseFail, message: \"BedrockConverseAdapter stub: parse_response_body TODO\".into() })"}, {"file": "src-tauri/src/billing/tokenizer_pool.rs", "line": 6, "text": "pub enum TokenizerInstance { Tiktoken(()), External(()) }  // placeholder"}, {"file": "src-tauri/src/billing/tokenizer_pool.rs", "line": 9, "text": "pub fn count_tokens(&self, _model: &str, _text: &str) -> Option<u32> { None } // TODO"}, {"file": "src-tauri/src/cache_pool/mod.rs", "line": 13, "text": "pub mod backend;           // trait + InMemory impl + Redis stub (optional_components)"}, {"file": "src-tauri/src/cache_pool/mod.rs", "line": 23, "text": "// TODO: tokio::spawn(async move { loop { ... } });"}, {"file": "src-tauri/src/flex_adapter/capability_cache.rs", "line": 9, "text": "// TODO: 对每个 UpstreamNode 定期探测（首 token 延迟/支持字段），写 state.node_runtime.capabilities"}, {"file": "src-tauri/src/flex_adapter/capability_cache.rs", "line": 13, "text": "// TODO: 查 state.node_runtime.capabilities；不支持字段从 req 中剥离"}, {"file": "src-tauri/src/flex_adapter/flexible_parser.rs", "line": 5, "text": "// TODO: strict → anyhow!fail → flex 匹配 schema_aliases"}, {"file": "src-tauri/src/flex_adapter/flexible_parser.rs", "line": 6, "text": "Err(crate::error::AppError::Labeled { label: crate::error::ErrorLabel::JsonParseFail, message: \"flex_parser stub\".into() })"}, {"file": "src-tauri/src/flex_adapter/param_adjust.rs", "line": 4, "text": "// TODO"}, {"file": "src-tauri/src/gateway_api/inbound_routes.rs", "line": 98, "text": "// rest = \"{model}:generateContent\"（也可能是 streamGenerateContent —— stub 同样处理非流式）"}]
unreferenced_public_fns: list[27] ["apply_if_enabled", "calc", "commit_audit_record", "config_file_path", "count_tokens", "detect_path", "ensure_data_dir", "expecting", "find_rate", "from_request_parts", "from_triple", "inc_hit"]
constant_response_handlers: list[9] [{"handler": "audit_discrepancy_handler", "file": "src-tauri/src/gateway_api/manage_routes.rs", "body_lines": 6}, {"handler": "audit_list_handler", "file": "src-tauri/src/gateway_api/manage_routes.rs", "body_lines": 1}, {"handler": "billing_summary_handler", "file": "src-tauri/src/gateway_api/manage_routes.rs", "body_lines": 7}, {"handler": "cache_purge_handler", "file": "src-tauri/src/gateway_api/manage_routes.rs", "body_lines": 1}, {"handler": "embeddings_handler", "file": "src-tauri/src/gateway_api/openai_routes.rs", "body_lines": 3}, {"handler": "node_reset_handler", "file": "src-tauri/src/gateway_api/manage_routes.rs", "body_lines": 5}, {"handler": "sub_attempt_detail_handler", "file": "src-tauri/src/gateway_api/manage_routes.rs", "body_lines": 1}, {"handler": "trace_detail_handler", "file": "src-tauri/src/gateway_api/manage_routes.rs", "body_lines": 1}, {"handler": "traces_list_handler", "file": "src-tauri/src/gateway_api/manage_routes.rs", "body_lines": 1}]
db_tables: list[3] [{"table": "client_ledger", "file": "src-tauri/src/services/trace_store.rs"}, {"table": "error_logs", "file": "src-tauri/src/services/error_logger.rs"}, {"table": "traces", "file": "src-tauri/src/services/trace_store.rs"}]
config_top_level_keys: list[14] ["version", "app", "http", "db", "metrics", "cors", "model_aliases", "node_groups", "flex_adapter", "cache_pool", "billing", "node_quality"]