@peterwangze/claude-trigger-router 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -18
- package/config/trigger.advanced.yaml +16 -20
- package/dist/cli.js +727 -262
- package/dist/cli.js.map +2 -2
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/constants.ts", "../src/models/schema.ts", "../src/models/compile.ts", "../src/utils/log.ts", "../src/utils/config.ts", "../src/utils/index.ts", "../src/service-health.ts", "../src/governance/types.ts", "../src/governance/trace.ts", "../src/governance/session-store.ts", "../src/protocols/message-ir.ts", "../src/protocols/anthropic.ts", "../src/governance/context-alignment.ts", "../src/governance/cascade-gate.ts", "../src/governance/semantic-router.ts", "../src/governance/shadow-supervisor.ts", "../src/governance/response-governance.ts", "../src/router/cache.ts", "../src/utils/SSEParser.transform.ts", "../src/governance/stream-response-governance.ts", "../src/governance/metrics.ts", "../src/governance/metrics-export.ts", "../src/governance/index.ts", "../src/provider-presets.ts", "../src/server.ts", "../src/router/index.ts", "../src/middleware/auth.ts", "../src/utils/processCheck.ts", "../src/utils/SSESerializer.transform.ts", "../src/utils/rewriteStream.ts", "../src/agents/image.agent.ts", "../src/agents/index.ts", "../src/trigger/types.ts", "../src/trigger/matcher.ts", "../src/trigger/analyzer.ts", "../src/trigger/intent.ts", "../src/trigger/smart-router.ts", "../src/trigger/selector.ts", "../src/trigger/index.ts", "../src/protocols/openai.ts", "../src/protocols/index.ts", "../src/index.ts", "../src/setup/service.ts", "../src/setup/repair.ts", "../src/setup/migrate.ts", "../src/setup/detect.ts", "../src/setup/templates.ts", "../src/setup/persist.ts", "../src/setup/decision.ts", "../src/setup/setup.ts", "../src/setup/index.ts", "../src/doctor/index.ts", "../src/cli.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Constants\n *\n * \u5E38\u91CF\u5B9A\u4E49\n */\n\nimport { homedir } from 'os';\nimport { join } from 'path';\n\n/**\n * \u914D\u7F6E\u76EE\u5F55\n */\nexport const CONFIG_DIR = join(homedir(), '.claude-trigger-router');\n\n/**\n * \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\n */\nexport const CONFIG_FILE = join(CONFIG_DIR, 'config.yaml');\n\n/**\n * JSON \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u517C\u5BB9\uFF09\n */\nexport const CONFIG_FILE_JSON = join(CONFIG_DIR, 'config.json');\n\n/**\n * .yml \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u517C\u5BB9\uFF09\n */\nexport const CONFIG_FILE_YML = join(CONFIG_DIR, 'config.yml');\n\n/**\n * \u65E5\u5FD7\u76EE\u5F55\n */\nexport const HOME_DIR = join(CONFIG_DIR, 'logs');\n\n/**\n * PID \u6587\u4EF6\u8DEF\u5F84\n */\nexport const PID_FILE = join(CONFIG_DIR, 'claude-trigger-router.pid');\n\n/**\n * Governance trace \u6301\u4E45\u5316\u6587\u4EF6\n */\nexport const GOVERNANCE_TRACE_FILE = join(CONFIG_DIR, 'governance-traces.json');\n\n/**\n * Governance trace \u5F52\u6863\u76EE\u5F55\n */\nexport const GOVERNANCE_TRACE_ARCHIVE_DIR = join(CONFIG_DIR, 'governance-trace-archives');\n\n/**\n * Governance metrics \u5BFC\u51FA\u5386\u53F2\u6587\u4EF6\n */\nexport const GOVERNANCE_EXPORT_HISTORY_FILE = join(CONFIG_DIR, 'governance-metrics-export-history.json');\n\n/**\n * Governance metrics \u5FEB\u7167\u76EE\u5F55\n */\nexport const GOVERNANCE_SNAPSHOT_DIR = join(CONFIG_DIR, 'governance-metric-snapshots');\n\n/**\n * Governance metrics \u5B9A\u65F6\u5FEB\u7167\u8C03\u5EA6\u6587\u4EF6\n */\nexport const GOVERNANCE_SCHEDULE_FILE = join(CONFIG_DIR, 'governance-metric-schedules.json');\n\n/**\n * \u9ED8\u8BA4\u914D\u7F6E\n */\nexport const DEFAULT_CONFIG = {\n HOST: '127.0.0.1',\n PORT: 5678,\n LOG: true,\n LOG_LEVEL: 'debug',\n API_TIMEOUT_MS: 600000,\n NON_INTERACTIVE_MODE: false,\n};\n\n/**\n * \u9ED8\u8BA4\u89E6\u53D1\u8DEF\u7531\u914D\u7F6E\n */\nexport const DEFAULT_TRIGGER_CONFIG = {\n enabled: true,\n analysis_scope: 'last_message' as const,\n llm_intent_recognition: false,\n rules: [],\n};\n\n/**\n * \u9ED8\u8BA4 SmartRouter \u914D\u7F6E\n * \u6CE8\u610F\uFF1Aenabled \u9ED8\u8BA4\u4E3A false\uFF0C\u987B\u5728 config.yaml \u4E2D\u663E\u5F0F\u5F00\u542F\n */\nexport const DEFAULT_SMART_ROUTER_CONFIG = {\n enabled: false,\n router_model: '',\n candidates: [] as Array<{ model: string; description: string }>,\n cache_ttl: 600000,\n max_tokens: 256,\n fallback: 'default' as const,\n};\n\n/**\n * \u9ED8\u8BA4 Governance \u914D\u7F6E\n * \u6CE8\u610F\uFF1A\u603B\u5F00\u5173\u9ED8\u8BA4\u5173\u95ED\uFF0C\u5B50\u80FD\u529B\u9ED8\u8BA4\u5747\u4E3A\u4FDD\u5B88\u914D\u7F6E\n */\nexport const DEFAULT_GOVERNANCE_CONFIG = {\n enabled: false,\n sticky: {\n enabled: false,\n session_ttl_ms: 3600000,\n fingerprint_similarity_threshold: 0.82,\n break_on_explicit_route: true,\n alignment: {\n enabled: false,\n summarizer_model: '',\n max_summary_tokens: 256,\n },\n },\n cascade: {\n enabled: false,\n max_attempts: 2,\n stream_guard: false,\n triggers: {\n compile_failure: true,\n test_failure: true,\n placeholder_patterns: ['TODO', '...rest of code', 'placeholder'],\n },\n levels: [],\n },\n semantic: {\n enabled: false,\n mode: 'embedding' as const,\n threshold: 0.85,\n prototypes: {},\n },\n shadow: {\n enabled: false,\n mode: 'async_audit' as const,\n sample_rate: 0.2,\n verifier_model: '',\n checks: {\n placeholder_patterns: true,\n length_anomaly: true,\n missing_code_block: true,\n },\n },\n observability: {\n anomaly_thresholds: {\n min_sample_size: 3,\n cascade_warn_rate: 0.4,\n cascade_critical_rate: 0.6,\n shadow_warn_rate: 0.5,\n shadow_critical_rate: 0.7,\n latency_warn_ms: 1500,\n latency_critical_ms: 3000,\n spike_warn_rate: 0.5,\n spike_delta_rate: 0.3,\n },\n },\n};\n\n/**\n * \u652F\u6301\u7684\u914D\u7F6E\u6587\u4EF6\u6269\u5C55\u540D\n */\nexport const SUPPORTED_CONFIG_EXTENSIONS = ['.yaml', '.yml', '.json'];\n", "import { IModelEndpointConfig, IModelThinkingConfig, TModelThinkingAlias } from '../trigger/types';\n\nexport type ModelInterface = 'openai' | 'anthropic';\n\nexport function getModelApi(item: Partial<IModelEndpointConfig>): string {\n return item.api?.trim() || item.api_base_url?.trim() || '';\n}\n\nexport function getModelKey(item: Partial<IModelEndpointConfig>): string {\n return item.key?.trim() || item.api_key?.trim() || '';\n}\n\nexport function getModelInterface(item: Partial<IModelEndpointConfig>): ModelInterface | undefined {\n return item.interface || item.protocol;\n}\n\nexport function normalizeThinkingConfig(\n thinking?: IModelEndpointConfig['thinking']\n): IModelThinkingConfig | undefined {\n if (!thinking) {\n return undefined;\n }\n\n if (typeof thinking === 'string') {\n if (thinking === 'low' || thinking === 'medium' || thinking === 'high') {\n return {\n mode: 'on',\n effort: thinking,\n };\n }\n\n return {\n mode: thinking,\n };\n }\n\n return {\n ...thinking,\n };\n}\n\nexport function toThinkingAlias(\n thinking?: IModelThinkingConfig\n): TModelThinkingAlias | IModelThinkingConfig | undefined {\n if (!thinking) {\n return undefined;\n }\n\n if (thinking.budget_tokens !== undefined) {\n return {\n ...thinking,\n };\n }\n\n if (thinking.mode === 'on' && thinking.effort && !thinking.budget_tokens) {\n return thinking.effort;\n }\n\n if (thinking.mode && !thinking.effort) {\n return thinking.mode;\n }\n\n return {\n ...thinking,\n };\n}\n\nexport function normalizeModelEndpointConfig(item: Partial<IModelEndpointConfig>): IModelEndpointConfig {\n const api = getModelApi(item);\n const key = getModelKey(item);\n const modelInterface = getModelInterface(item);\n\n return {\n ...item,\n id: item.id?.trim() ?? '',\n api,\n api_base_url: api,\n key,\n api_key: key,\n interface: modelInterface,\n protocol: modelInterface,\n model: item.model?.trim() ?? '',\n thinking: normalizeThinkingConfig(item.thinking),\n metadata: item.metadata\n ? {\n ...item.metadata,\n }\n : undefined,\n };\n}\n\nexport function toExternalModelConfig(item: Partial<IModelEndpointConfig>) {\n const normalized = normalizeModelEndpointConfig(item);\n return {\n id: normalized.id,\n api: normalized.api_base_url,\n key: normalized.api_key,\n interface: normalized.protocol,\n model: normalized.model,\n thinking: toThinkingAlias(normalized.thinking as IModelThinkingConfig | undefined),\n metadata: normalized.metadata,\n };\n}\n", "import { IAppConfig, ICompiledModelCapabilities, IModelEndpointConfig, IModelThinkingConfig, IProvider } from '../trigger/types';\nimport { getModelApi, getModelInterface, getModelKey, normalizeModelEndpointConfig } from './schema';\n\nexport type TCompatibilityProfile =\n | 'anthropic-native'\n | 'openai-compatible-anthropic-dispatch';\n\nexport type TDispatchFormat = 'anthropic_messages' | 'openai_chat';\n\nexport interface ICompatibilityProfileDescription {\n label: string;\n summary: string;\n}\n\nexport interface ICompiledModelRef {\n id: string;\n providerName: string;\n modelName: string;\n interface?: 'openai' | 'anthropic';\n protocol: 'openai' | 'anthropic';\n compatibilityProfile: TCompatibilityProfile;\n dispatchFormat: TDispatchFormat;\n thinking?: IModelThinkingConfig;\n capabilities: ICompiledModelCapabilities;\n source: 'models' | 'providers';\n}\n\nexport interface ICompiledModelRegistry {\n providers: IProvider[];\n modelMap: Record<string, ICompiledModelRef>;\n}\n\nexport interface ICompiledCapabilityWarningEntry {\n path: string;\n modelId: string;\n level: 'info' | 'warn';\n code: string;\n message: string;\n}\n\nexport interface ICompiledCapabilityWarningReport {\n entries: ICompiledCapabilityWarningEntry[];\n summary: {\n total: number;\n warn: number;\n info: number;\n };\n}\n\nfunction inferTransformer(protocol: 'openai' | 'anthropic'): any {\n if (protocol === 'openai') {\n return {\n use: ['openrouter'],\n };\n }\n\n return undefined;\n}\n\nfunction inferCompatibilityProfile(\n item: Pick<IModelEndpointConfig, 'api' | 'api_base_url' | 'metadata'>,\n modelInterface: 'openai' | 'anthropic'\n): TCompatibilityProfile {\n if (modelInterface === 'anthropic') {\n return 'anthropic-native';\n }\n\n return 'openai-compatible-anthropic-dispatch';\n}\n\nexport function getDispatchFormatForProfile(\n modelInterface: 'openai' | 'anthropic',\n compatibilityProfile: TCompatibilityProfile\n): TDispatchFormat {\n if (modelInterface === 'anthropic') {\n return 'anthropic_messages';\n }\n\n switch (compatibilityProfile) {\n case 'openai-compatible-anthropic-dispatch':\n return 'anthropic_messages';\n case 'anthropic-native':\n return 'anthropic_messages';\n default:\n return 'anthropic_messages';\n }\n}\n\nexport function describeCompatibilityProfile(profile: TCompatibilityProfile): ICompatibilityProfileDescription {\n switch (profile) {\n case 'anthropic-native':\n return {\n label: 'Anthropic native',\n summary: '\u76EE\u6807\u63A5\u53E3\u539F\u751F\u63A5\u53D7 Anthropic messages \u5F62\u6001\uFF0C\u8BF7\u6C42\u65E0\u9700\u505A OpenAI-compatible \u517C\u5BB9\u8F6C\u6362\u3002',\n };\n case 'openai-compatible-anthropic-dispatch':\n return {\n label: 'OpenAI-compatible / Anthropic dispatch',\n summary: '\u76EE\u6807\u63A5\u53E3\u5C5E\u4E8E OpenAI-compatible \u517C\u5BB9\u65CF\uFF0C\u8FD0\u884C\u65F6\u4F1A\u81EA\u52A8\u4F7F\u7528 Anthropic-style dispatch \u5904\u7406 tools\u3001messages \u4E0E\u63A7\u5236\u5B57\u6BB5\u5DEE\u5F02\u3002',\n };\n default:\n return {\n label: profile,\n summary: '\u672A\u77E5\u517C\u5BB9\u753B\u50CF\u3002',\n };\n }\n}\n\nexport function describeDispatchFormat(format: TDispatchFormat): ICompatibilityProfileDescription {\n switch (format) {\n case 'anthropic_messages':\n return {\n label: 'Anthropic-style messages',\n summary: '\u8FD0\u884C\u65F6\u4F1A\u628A\u7EDF\u4E00\u8BF7\u6C42\u7F16\u8BD1\u6210 Anthropic messages \u5F62\u6001\u540E\u518D\u53D1\u5F80\u76EE\u6807\u63A5\u53E3\u3002',\n };\n case 'openai_chat':\n return {\n label: 'OpenAI chat completions',\n summary: '\u8FD0\u884C\u65F6\u4F1A\u628A\u7EDF\u4E00\u8BF7\u6C42\u7F16\u8BD1\u6210 OpenAI chat completions \u5F62\u6001\u540E\u518D\u53D1\u5F80\u76EE\u6807\u63A5\u53E3\u3002',\n };\n default:\n return {\n label: format,\n summary: '\u672A\u77E5 dispatch \u5F62\u6001\u3002',\n };\n }\n}\n\nfunction buildCompiledCapabilities(\n item: Pick<IModelEndpointConfig, 'thinking' | 'metadata'>,\n modelInterface: 'openai' | 'anthropic'\n): ICompiledModelCapabilities {\n const reasoningSupported = item.metadata?.supports_reasoning !== false;\n\n return {\n thinking: {\n supported: reasoningSupported,\n ...(reasoningSupported ? (item.thinking ?? {}) : {}),\n },\n tools: item.metadata?.supports_tools !== false,\n images: item.metadata?.supports_images !== false,\n systemMessageStyle: modelInterface,\n };\n}\n\nexport function compileModelsToProviders(models: IModelEndpointConfig[]): IProvider[] {\n return models.map((rawItem) => {\n const item = normalizeModelEndpointConfig(rawItem);\n const modelInterface = getModelInterface(item) || 'openai';\n return {\n name: `model__${item.id}`,\n api_base_url: getModelApi(item),\n api_key: getModelKey(item),\n models: [item.model],\n transformer: inferTransformer(modelInterface),\n };\n });\n}\n\nexport function buildModelRegistry(config: IAppConfig): ICompiledModelRegistry {\n if (Array.isArray(config.Models) && config.Models.length > 0) {\n const providers = compileModelsToProviders(config.Models);\n const modelMap = config.Models.reduce<Record<string, ICompiledModelRef>>((result, rawItem) => {\n const item = normalizeModelEndpointConfig(rawItem);\n const modelInterface = getModelInterface(item) || 'openai';\n const compatibilityProfile = inferCompatibilityProfile(item, modelInterface);\n result[item.id] = {\n id: item.id,\n providerName: `model__${item.id}`,\n modelName: item.model,\n interface: modelInterface,\n protocol: modelInterface,\n compatibilityProfile,\n dispatchFormat: getDispatchFormatForProfile(modelInterface, compatibilityProfile),\n thinking: item.thinking,\n capabilities: buildCompiledCapabilities(item, modelInterface),\n source: 'models',\n };\n return result;\n }, {});\n\n return {\n providers,\n modelMap,\n };\n }\n\n const providers = config.Providers ?? [];\n const modelMap = providers.reduce<Record<string, ICompiledModelRef>>((result, provider) => {\n for (const model of provider.models ?? []) {\n const compatibilityProfile = inferCompatibilityProfile(\n { api_base_url: provider.api_base_url },\n 'openai'\n );\n result[`${provider.name},${model}`] = {\n id: `${provider.name},${model}`,\n providerName: provider.name,\n modelName: model,\n interface: 'openai',\n protocol: 'openai',\n compatibilityProfile,\n dispatchFormat: getDispatchFormatForProfile('openai', compatibilityProfile),\n capabilities: {\n thinking: {\n supported: true,\n },\n tools: true,\n images: true,\n systemMessageStyle: 'openai',\n },\n source: 'providers',\n };\n }\n return result;\n }, {});\n\n return {\n providers,\n modelMap,\n };\n}\n\nexport function resolveModelReference(config: IAppConfig, ref?: string): string | undefined {\n if (!ref) {\n return undefined;\n }\n\n if (ref.includes(',')) {\n return ref;\n }\n\n const registry = buildModelRegistry(config);\n const compiled = registry.modelMap[ref];\n if (!compiled) {\n return ref;\n }\n\n return `${compiled.providerName},${compiled.modelName}`;\n}\n\nexport function getCompiledModelRef(config: IAppConfig, ref?: string): ICompiledModelRef | undefined {\n if (!ref) {\n return undefined;\n }\n\n const registry = buildModelRegistry(config);\n if (!ref.includes(',')) {\n return registry.modelMap[ref];\n }\n\n const resolvedRef = registry.modelMap[ref];\n if (resolvedRef) {\n return resolvedRef;\n }\n\n const [providerName, modelName] = ref.split(',');\n return Object.values(registry.modelMap).find(\n (item) => item.providerName === providerName && item.modelName === modelName\n );\n}\n\nexport function isKnownModelReference(config: IAppConfig, ref?: string): boolean {\n if (!ref) {\n return false;\n }\n\n if (ref.includes(',')) {\n const [provider, model] = ref.split(',');\n return Boolean(\n config.Providers?.find((item) =>\n item.name === provider && item.models?.includes(model)\n )\n );\n }\n\n const registry = buildModelRegistry(config);\n return Boolean(registry.modelMap[ref]);\n}\n\nexport function collectCapabilityWarnings(\n config: Partial<IAppConfig>,\n registry?: ICompiledModelRegistry\n): ICompiledCapabilityWarningReport {\n const entries: ICompiledCapabilityWarningEntry[] = [];\n const models = Array.isArray(config?.Models) ? config.Models : [];\n const resolvedRegistry = registry ?? buildModelRegistry(config as IAppConfig);\n\n models.forEach((model, index) => {\n const modelId = typeof model?.id === 'string' ? model.id.trim() : '';\n if (!modelId) {\n return;\n }\n\n const compiledModel = resolvedRegistry.modelMap?.[modelId];\n if (!compiledModel) {\n return;\n }\n\n if (model?.thinking && compiledModel.capabilities?.thinking?.supported === false) {\n entries.push({\n path: `Models[${index}].thinking`,\n modelId,\n level: 'warn',\n code: 'thinking_ignored',\n message: `Models[${index}].thinking is configured, but model \"${modelId}\" disables reasoning. Runtime requests will ignore thinking.`,\n });\n }\n\n if (model?.metadata?.supports_tools === false) {\n entries.push({\n path: `Models[${index}].metadata.supports_tools`,\n modelId,\n level: 'info',\n code: 'tools_text_fallback',\n message: `Models[${index}].metadata.supports_tools disables tools for model \"${modelId}\". Tool definitions and tool call/result blocks will fall back to plain text.`,\n });\n }\n\n if (model?.metadata?.supports_images === false) {\n entries.push({\n path: `Models[${index}].metadata.supports_images`,\n modelId,\n level: 'info',\n code: 'images_text_fallback',\n message: `Models[${index}].metadata.supports_images disables image input for model \"${modelId}\". Image blocks will fall back to plain text descriptions.`,\n });\n }\n });\n\n return {\n entries,\n summary: {\n total: entries.length,\n warn: entries.filter((entry) => entry.level === 'warn').length,\n info: entries.filter((entry) => entry.level === 'info').length,\n },\n };\n}\n", "/**\n * Log Utilities\n *\n * \u65E5\u5FD7\u5DE5\u5177\n */\n\nimport { IAppConfig } from '../trigger/types';\n\n// \u65E5\u5FD7\u7EA7\u522B\u679A\u4E3E\uFF08\u6570\u503C\u8D8A\u5927\u8D8A\u8BE6\u7EC6\uFF09\nconst LOG_LEVELS: Record<string, number> = {\n fatal: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n};\n\nlet logEnabled = true;\nlet currentLevel = LOG_LEVELS.debug;\n\n/**\n * \u914D\u7F6E\u65E5\u5FD7\n */\nexport function configureLogging(config: IAppConfig): void {\n logEnabled = config.LOG !== false;\n const level = (config.LOG_LEVEL || 'debug').toLowerCase();\n currentLevel = LOG_LEVELS[level] ?? LOG_LEVELS.debug;\n}\n\n/**\n * \u68C0\u67E5\u7ED9\u5B9A\u7EA7\u522B\u662F\u5426\u5E94\u8BE5\u8F93\u51FA\n */\nfunction shouldLog(level: number): boolean {\n return logEnabled && level <= currentLevel;\n}\n\n/**\n * \u683C\u5F0F\u5316\u65F6\u95F4\u6233\n */\nfunction ts(): string {\n return new Date().toISOString();\n}\n\n/**\n * INFO \u65E5\u5FD7\uFF08\u539F log\uFF09\n */\nexport function log(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.info)) return;\n console.log(`[${ts()}] [INFO]`, ...args);\n}\n\n/**\n * ERROR \u65E5\u5FD7\n */\nexport function logError(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.error)) return;\n console.error(`[${ts()}] [ERROR]`, ...args);\n}\n\n/**\n * WARN \u65E5\u5FD7\n */\nexport function logWarn(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.warn)) return;\n console.warn(`[${ts()}] [WARN]`, ...args);\n}\n\n/**\n * DEBUG \u65E5\u5FD7\n */\nexport function logDebug(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.debug)) return;\n console.log(`[${ts()}] [DEBUG]`, ...args);\n}\n\n/**\n * TRACE \u65E5\u5FD7\n */\nexport function logTrace(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.trace)) return;\n console.log(`[${ts()}] [TRACE]`, ...args);\n}\n\n/**\n * FATAL \u65E5\u5FD7\uFF08\u603B\u662F\u8F93\u51FA\uFF0C\u56E0\u4E3A\u662F\u81F4\u547D\u9519\u8BEF\uFF09\n */\nexport function logFatal(...args: any[]): void {\n console.error(`[${ts()}] [FATAL]`, ...args);\n}\n", "/**\r\n * Config Utilities\r\n *\r\n * \u914D\u7F6E\u52A0\u8F7D\u548C\u7BA1\u7406\u5DE5\u5177\r\n */\r\n\r\nimport { existsSync, mkdirSync } from 'fs';\r\nimport { readFile, writeFile } from 'fs/promises';\r\nimport { join } from 'path';\r\nimport * as yaml from 'js-yaml';\r\nimport {\n CONFIG_DIR,\n CONFIG_FILE,\n CONFIG_FILE_JSON,\n CONFIG_FILE_YML,\n DEFAULT_CONFIG,\n DEFAULT_GOVERNANCE_CONFIG,\n DEFAULT_TRIGGER_CONFIG,\n DEFAULT_SMART_ROUTER_CONFIG,\n HOME_DIR,\n} from '../constants';\nimport { IAppConfig, ITriggerConfig } from '../trigger/types';\nimport { collectCapabilityWarnings, isKnownModelReference } from '../models/compile';\nimport { getModelApi, getModelInterface, getModelKey, normalizeModelEndpointConfig, toExternalModelConfig } from '../models/schema';\nimport { logError, logWarn } from './log';\n\r\n/**\r\n * \u786E\u4FDD\u914D\u7F6E\u76EE\u5F55\u5B58\u5728\r\n */\r\nexport async function initDir(): Promise<void> {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n if (!existsSync(HOME_DIR)) {\n mkdirSync(HOME_DIR, { recursive: true });\n }\n}\n\r\n/**\r\n * \u5C1D\u8BD5\u52A0\u8F7D YAML \u914D\u7F6E\u6587\u4EF6\r\n * \u8FD4\u56DE null \u8868\u793A\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1B\u89E3\u6790\u5931\u8D25\u65F6\u629B\u51FA\u9519\u8BEF\uFF08\u533A\u5206\u4E24\u79CD\u60C5\u51B5\uFF09\r\n */\r\nasync function loadYamlConfig(path: string): Promise<Partial<IAppConfig> | null> {\r\n if (!existsSync(path)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const content = await readFile(path, 'utf-8');\r\n return yaml.load(content) as Partial<IAppConfig>;\r\n } catch (error: any) {\r\n const divider = '\u2500'.repeat(60);\r\n console.error(`\\n${divider}`);\r\n console.error(' \u274C \u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF08YAML \u683C\u5F0F\u9519\u8BEF\uFF09');\r\n console.error(divider);\r\n console.error(` \u6587\u4EF6\uFF1A${path}`);\r\n console.error(` \u9519\u8BEF\uFF1A${error.message || error}`);\r\n console.error(` \u63D0\u793A\uFF1A\u8BF7\u68C0\u67E5 YAML \u7F29\u8FDB\u662F\u5426\u4F7F\u7528\u7A7A\u683C\uFF08\u4E0D\u80FD\u7528 Tab\uFF09`);\r\n console.error(` \u53EF\u7528\u5728\u7EBF\u5DE5\u5177\u9A8C\u8BC1\uFF1Ahttps://yaml.lint.me`);\r\n console.error(`${divider}\\n`);\r\n throw new Error(`YAML parse error in ${path}: ${error.message}`);\r\n }\r\n}\r\n\r\n/**\r\n * \u5C1D\u8BD5\u52A0\u8F7D JSON \u914D\u7F6E\u6587\u4EF6\r\n * \u8FD4\u56DE null \u8868\u793A\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1B\u89E3\u6790\u5931\u8D25\u65F6\u629B\u51FA\u9519\u8BEF\uFF08\u533A\u5206\u4E24\u79CD\u60C5\u51B5\uFF09\r\n */\r\nasync function loadJsonConfig(path: string): Promise<Partial<IAppConfig> | null> {\r\n if (!existsSync(path)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const content = await readFile(path, 'utf-8');\r\n return JSON.parse(content);\r\n } catch (error: any) {\r\n const divider = '\u2500'.repeat(60);\r\n console.error(`\\n${divider}`);\r\n console.error(' \u274C \u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF08JSON \u683C\u5F0F\u9519\u8BEF\uFF09');\r\n console.error(divider);\r\n console.error(` \u6587\u4EF6\uFF1A${path}`);\r\n console.error(` \u9519\u8BEF\uFF1A${error.message || error}`);\r\n console.error(` \u63D0\u793A\uFF1A\u8BF7\u68C0\u67E5 JSON \u683C\u5F0F\uFF0C\u4F8B\u5982\u662F\u5426\u6709\u591A\u4F59\u9017\u53F7\u6216\u7F3A\u5C11\u5F15\u53F7`);\r\n console.error(`${divider}\\n`);\r\n throw new Error(`JSON parse error in ${path}: ${error.message}`);\r\n }\r\n}\r\n\r\n/**\r\n * \u6DF1\u5EA6\u5408\u5E76\u914D\u7F6E\u5BF9\u8C61\r\n */\r\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const sourceValue = source[key];\r\n const targetValue = result[key];\r\n\r\n if (\r\n sourceValue &&\r\n typeof sourceValue === 'object' &&\r\n !Array.isArray(sourceValue) &&\r\n targetValue &&\r\n typeof targetValue === 'object' &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n result[key] = deepMerge(targetValue, sourceValue);\r\n } else {\r\n result[key] = sourceValue as T[Extract<keyof T, string>];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * \u6821\u9A8C \"provider,model\" \u683C\u5F0F\u7684\u6A21\u578B\u5F15\u7528\u662F\u5426\u5728 Providers \u5217\u8868\u4E2D\u5B58\u5728\r\n * \u8FD4\u56DE\u9519\u8BEF\u63CF\u8FF0\uFF0C\u5408\u6CD5\u5219\u8FD4\u56DE null\r\n */\r\nfunction validateModelRef(\n ref: string,\n providers: IAppConfig['Providers'],\n fieldName: string\n): string | null {\r\n if (!ref || !ref.includes(',')) {\r\n return `${fieldName} \u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u5E94\u4E3A \"provider,model\"\uFF0C\u5F53\u524D\u503C\uFF1A\"${ref}\"`;\r\n }\r\n const [providerName, modelName] = ref.split(',');\r\n const provider = providers.find(p => p.name === providerName);\r\n if (!provider) {\r\n return `${fieldName} \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u63D0\u4F9B\u5546 \"${providerName}\"\uFF0C\u8BF7\u68C0\u67E5 Providers \u914D\u7F6E`;\r\n }\r\n if (!provider.models.includes(modelName)) {\r\n return `${fieldName} \u5F15\u7528\u7684\u6A21\u578B \"${modelName}\" \u4E0D\u5728\u63D0\u4F9B\u5546 \"${providerName}\" \u7684 models \u5217\u8868\u4E2D`;\r\n }\n return null;\n}\n\nfunction validateKnownModelRef(\n ref: string,\n config: Partial<IAppConfig>,\n providers: IAppConfig['Providers'],\n fieldName: string\n): string | null {\n if (isKnownModelReference(config as IAppConfig, ref)) {\n return null;\n }\n\n return validateModelRef(ref, providers, fieldName);\n}\n\r\n/**\r\n * \u9A8C\u8BC1\u914D\u7F6E\r\n */\r\nfunction validateConfig(config: Partial<IAppConfig>): string[] {\n const errors: string[] = [];\n\n if (config.Models !== undefined) {\n if (!Array.isArray(config.Models)) {\n errors.push('Models must be an array when provided');\n } else {\n const ids = new Set<string>();\n config.Models.forEach((item, index) => {\n if (!item.id?.trim()) {\n errors.push(`Models[${index}].id is required`);\n } else if (ids.has(item.id.trim())) {\n errors.push(`Models[${index}].id must be unique`);\n } else {\n ids.add(item.id.trim());\n }\n\n if (!getModelApi(item)) {\n errors.push(`Models[${index}].api is required`);\n }\n\n if (!getModelKey(item)) {\n errors.push(`Models[${index}].key is required`);\n }\n\n const modelInterface = getModelInterface(item);\n if (!modelInterface) {\n errors.push(`Models[${index}].interface is required`);\n } else if (!['openai', 'anthropic'].includes(modelInterface)) {\n errors.push(`Models[${index}].interface must be either \"openai\" or \"anthropic\"`);\n }\n\n if (!item.model?.trim()) {\n errors.push(`Models[${index}].model is required`);\n }\n\n const thinking = item.thinking;\n if (thinking?.mode && !['off', 'auto', 'on'].includes(thinking.mode)) {\n errors.push(`Models[${index}].thinking.mode must be one of \"off\", \"auto\", \"on\"`);\n }\n\n if (thinking?.effort && !['low', 'medium', 'high'].includes(thinking.effort)) {\n errors.push(`Models[${index}].thinking.effort must be one of \"low\", \"medium\", \"high\"`);\n }\n\n if (thinking?.budget_tokens !== undefined && thinking.budget_tokens <= 0) {\n errors.push(`Models[${index}].thinking.budget_tokens must be greater than 0`);\n }\n });\n }\n }\n\n // \u9A8C\u8BC1 Providers\n const hasModels = Array.isArray(config.Models) && config.Models.length > 0;\n\n if (!hasModels && (!config.Providers || !Array.isArray(config.Providers) || config.Providers.length === 0)) {\n errors.push('Providers is required and must be a non-empty array');\n } else if (config.Providers && Array.isArray(config.Providers)) {\n config.Providers.forEach((provider, index) => {\n if (!provider.name) {\n errors.push(`Providers[${index}].name is required`);\n }\r\n if (!provider.api_base_url) {\r\n errors.push(`Providers[${index}].api_base_url is required`);\r\n }\r\n if (!provider.models || provider.models.length === 0) {\r\n errors.push(`Providers[${index}].models must be a non-empty array`);\r\n }\r\n });\r\n }\r\n\r\n // \u9A8C\u8BC1 Router\r\n if (!config.Router?.default) {\r\n errors.push('Router.default is required');\r\n }\r\n\r\n // Provider/model \u4EA4\u53C9\u5F15\u7528\u6821\u9A8C\uFF08\u4EC5\u5728 Providers \u5217\u8868\u6709\u6548\u65F6\u6267\u884C\uFF09\r\n const validProviders = config.Providers?.filter(p => p.name && p.models?.length) ?? [];\n if (validProviders.length > 0) {\r\n const router = config.Router;\r\n if (router) {\r\n const routerModelFields: Array<[string | undefined, string]> = [\r\n [router.default, 'Router.default'],\r\n [router.background, 'Router.background'],\r\n [router.think, 'Router.think'],\r\n [router.longContext, 'Router.longContext'],\r\n [router.webSearch, 'Router.webSearch'],\r\n [router.image, 'Router.image'],\r\n ];\r\n for (const [ref, field] of routerModelFields) {\n if (ref) {\n const err = validateKnownModelRef(ref, config, validProviders, field);\n if (err) errors.push(err);\n }\n }\n }\n }\r\n\r\n // \u9A8C\u8BC1\u89E6\u53D1\u8DEF\u7531\u914D\u7F6E\r\n if (config.TriggerRouter) {\r\n if (config.TriggerRouter.llm_intent_recognition && !config.TriggerRouter.intent_model) {\n errors.push('TriggerRouter.intent_model is required when llm_intent_recognition is enabled');\n } else if (config.TriggerRouter.intent_model && validProviders.length > 0) {\n const err = validateKnownModelRef(config.TriggerRouter.intent_model, config, validProviders, 'TriggerRouter.intent_model');\n if (err) errors.push(err);\n }\n\r\n if (config.TriggerRouter.rules) {\n config.TriggerRouter.rules.forEach((rule, index) => {\n if (!rule.name) {\n errors.push(`TriggerRouter.rules[${index}].name is required`);\n }\n if (!rule.model) {\n errors.push(`TriggerRouter.rules[${index}].model is required`);\n } else if (validProviders.length > 0) {\n const err = validateKnownModelRef(rule.model, config, validProviders, `TriggerRouter.rules[${index}].model`);\n if (err) errors.push(err);\n }\n const hasSemanticOnlyMatch = Boolean(\n rule.description ||\n rule.semantic_profile?.prototype ||\n rule.semantic_profile?.enabled\n );\n if ((!rule.patterns || rule.patterns.length === 0) && !hasSemanticOnlyMatch) {\n errors.push(`TriggerRouter.rules[${index}].patterns must be a non-empty array`);\n }\n });\n }\n }\n\r\n // \u9A8C\u8BC1 SmartRouter \u914D\u7F6E\n if (config.SmartRouter?.enabled) {\n if (!config.SmartRouter.router_model) {\n errors.push('SmartRouter.router_model is required when SmartRouter is enabled');\n } else if (validProviders.length > 0) {\n const err = validateKnownModelRef(config.SmartRouter.router_model, config, validProviders, 'SmartRouter.router_model');\n if (err) errors.push(err);\n }\n if (!config.SmartRouter.candidates || config.SmartRouter.candidates.length < 2) {\r\n errors.push('SmartRouter.candidates must have at least 2 entries when SmartRouter is enabled');\r\n } else {\r\n config.SmartRouter.candidates.forEach((candidate, index) => {\r\n if (!candidate.model) {\n errors.push(`SmartRouter.candidates[${index}].model is required`);\n } else if (validProviders.length > 0) {\n const err = validateKnownModelRef(candidate.model, config, validProviders, `SmartRouter.candidates[${index}].model`);\n if (err) errors.push(err);\n }\n if (!candidate.description) {\r\n errors.push(`SmartRouter.candidates[${index}].description is required`);\r\n }\r\n });\r\n }\r\n }\n\n // \u9A8C\u8BC1 Governance \u914D\u7F6E\n if (config.Governance?.enabled) {\n const sticky = config.Governance.sticky;\n if (sticky?.enabled) {\n if ((sticky.session_ttl_ms ?? 0) <= 0) {\n errors.push('Governance.sticky.session_ttl_ms must be greater than 0 when sticky routing is enabled');\n }\n const threshold = sticky.fingerprint_similarity_threshold;\n if (threshold !== undefined && (threshold < 0 || threshold > 1)) {\n errors.push('Governance.sticky.fingerprint_similarity_threshold must be between 0 and 1');\n }\n if (sticky.alignment?.enabled) {\n if (!sticky.alignment.summarizer_model) {\n errors.push('Governance.sticky.alignment.summarizer_model is required when alignment is enabled');\n } else if (!isKnownModelReference(config as IAppConfig, sticky.alignment.summarizer_model)) {\n const err = validateModelRef(\n sticky.alignment.summarizer_model,\n validProviders,\n 'Governance.sticky.alignment.summarizer_model'\n );\n if (err) errors.push(err);\n }\n if ((sticky.alignment.max_summary_tokens ?? 0) <= 0) {\n errors.push('Governance.sticky.alignment.max_summary_tokens must be greater than 0 when alignment is enabled');\n }\n }\n }\n\n const cascade = config.Governance.cascade;\n if (cascade?.enabled) {\n if ((cascade.max_attempts ?? 0) < 1) {\n errors.push('Governance.cascade.max_attempts must be at least 1 when cascade is enabled');\n }\n cascade.levels?.forEach((level, index) => {\n if (!level.from) {\n errors.push(`Governance.cascade.levels[${index}].from is required`);\n } else if (!isKnownModelReference(config as IAppConfig, level.from)) {\n const err = validateModelRef(level.from, validProviders, `Governance.cascade.levels[${index}].from`);\n if (err) errors.push(err);\n }\n if (!level.to) {\n errors.push(`Governance.cascade.levels[${index}].to is required`);\n } else if (!isKnownModelReference(config as IAppConfig, level.to)) {\n const err = validateModelRef(level.to, validProviders, `Governance.cascade.levels[${index}].to`);\n if (err) errors.push(err);\n }\n });\n }\n\n const semantic = config.Governance.semantic;\n if (semantic?.enabled) {\n const threshold = semantic.threshold;\n if (threshold !== undefined && (threshold < 0 || threshold > 1)) {\n errors.push('Governance.semantic.threshold must be between 0 and 1');\n }\n if (semantic.mode && !['embedding', 'classifier'].includes(semantic.mode)) {\n errors.push('Governance.semantic.mode must be either \"embedding\" or \"classifier\"');\n }\n if (semantic.mode === 'classifier') {\n if (!semantic.classifier_model) {\n errors.push('Governance.semantic.classifier_model is required when semantic mode is \"classifier\"');\n } else if (!isKnownModelReference(config as IAppConfig, semantic.classifier_model)) {\n const err = validateModelRef(semantic.classifier_model, validProviders, 'Governance.semantic.classifier_model');\n if (err) errors.push(err);\n }\n }\n }\n\n const shadow = config.Governance.shadow;\n if (shadow?.enabled) {\n const sampleRate = shadow.sample_rate;\n if (sampleRate !== undefined && (sampleRate < 0 || sampleRate > 1)) {\n errors.push('Governance.shadow.sample_rate must be between 0 and 1');\n }\n if (shadow.mode && !['async_audit', 'sync_guard'].includes(shadow.mode)) {\n errors.push('Governance.shadow.mode must be either \"async_audit\" or \"sync_guard\"');\n }\n if (shadow.verifier_model && !isKnownModelReference(config as IAppConfig, shadow.verifier_model)) {\n const err = validateModelRef(shadow.verifier_model, validProviders, 'Governance.shadow.verifier_model');\n if (err) errors.push(err);\n }\n }\n\n const anomalyThresholds = config.Governance.observability?.anomaly_thresholds;\n if (anomalyThresholds) {\n const rateFields: Array<[number | undefined, string]> = [\n [anomalyThresholds.cascade_warn_rate, 'Governance.observability.anomaly_thresholds.cascade_warn_rate'],\n [anomalyThresholds.cascade_critical_rate, 'Governance.observability.anomaly_thresholds.cascade_critical_rate'],\n [anomalyThresholds.shadow_warn_rate, 'Governance.observability.anomaly_thresholds.shadow_warn_rate'],\n [anomalyThresholds.shadow_critical_rate, 'Governance.observability.anomaly_thresholds.shadow_critical_rate'],\n [anomalyThresholds.spike_warn_rate, 'Governance.observability.anomaly_thresholds.spike_warn_rate'],\n [anomalyThresholds.spike_delta_rate, 'Governance.observability.anomaly_thresholds.spike_delta_rate'],\n ];\n for (const [value, field] of rateFields) {\n if (value !== undefined && (value < 0 || value > 1)) {\n errors.push(`${field} must be between 0 and 1`);\n }\n }\n\n const minSampleSize = anomalyThresholds.min_sample_size;\n if (minSampleSize !== undefined && minSampleSize < 1) {\n errors.push('Governance.observability.anomaly_thresholds.min_sample_size must be at least 1');\n }\n\n const latencyWarnMs = anomalyThresholds.latency_warn_ms;\n const latencyCriticalMs = anomalyThresholds.latency_critical_ms;\n if (latencyWarnMs !== undefined && latencyWarnMs < 1) {\n errors.push('Governance.observability.anomaly_thresholds.latency_warn_ms must be greater than 0');\n }\n if (latencyCriticalMs !== undefined && latencyCriticalMs < 1) {\n errors.push('Governance.observability.anomaly_thresholds.latency_critical_ms must be greater than 0');\n }\n if (\n anomalyThresholds.cascade_warn_rate !== undefined &&\n anomalyThresholds.cascade_critical_rate !== undefined &&\n anomalyThresholds.cascade_warn_rate > anomalyThresholds.cascade_critical_rate\n ) {\n errors.push('Governance.observability.anomaly_thresholds.cascade_warn_rate must be less than or equal to cascade_critical_rate');\n }\n if (\n anomalyThresholds.shadow_warn_rate !== undefined &&\n anomalyThresholds.shadow_critical_rate !== undefined &&\n anomalyThresholds.shadow_warn_rate > anomalyThresholds.shadow_critical_rate\n ) {\n errors.push('Governance.observability.anomaly_thresholds.shadow_warn_rate must be less than or equal to shadow_critical_rate');\n }\n if (\n latencyWarnMs !== undefined &&\n latencyCriticalMs !== undefined &&\n latencyWarnMs > latencyCriticalMs\n ) {\n errors.push('Governance.observability.anomaly_thresholds.latency_warn_ms must be less than or equal to latency_critical_ms');\n }\n }\n }\n\n return errors;\n}\n\nfunction normalizeUnifiedRouterInput(config: Partial<IAppConfig>): Partial<IAppConfig> {\n const routes = config.Router?.routes;\n const decision = config.Router?.decision;\n const defaults = config.Router?.defaults;\n const hasUnifiedRouterInput = Boolean(\n (Array.isArray(routes) && routes.length) ||\n decision ||\n defaults\n );\n\n if (!hasUnifiedRouterInput) {\n return config;\n }\n\n const nextConfig: Partial<IAppConfig> = {\n ...config,\n Router: {\n ...(config.Router ?? {}),\n },\n };\n\n if (Array.isArray(routes) && routes.length > 0) {\n const semanticExplicitlyEnabled = defaults?.semantic?.enabled;\n nextConfig.TriggerRouter = {\n ...(config.TriggerRouter ?? DEFAULT_TRIGGER_CONFIG),\n enabled: true,\n rules: routes.map((route) => ({\n name: route.name,\n priority: route.priority ?? 0,\n enabled: route.enabled ?? true,\n model: route.model,\n description: route.description,\n semantic_profile: route.match?.semantic || route.match?.semantic_profile\n ? {\n enabled: route.match?.semantic ?? true,\n prototype: route.match?.semantic_profile?.prototype,\n threshold: route.match?.semantic_profile?.threshold,\n }\n : undefined,\n patterns: [\n ...(Array.isArray(route.match?.keywords) && route.match?.keywords.length\n ? [{\n type: 'exact' as const,\n keywords: route.match?.keywords,\n }]\n : []),\n ...(typeof route.match?.regex === 'string' && route.match.regex.trim().length\n ? [{\n type: 'regex' as const,\n pattern: route.match.regex,\n }]\n : []),\n ],\n })),\n };\n\n const semanticPrototypes = Object.fromEntries(\n routes\n .filter((route) => route.match?.semantic || route.match?.semantic_profile?.prototype || route.description)\n .map((route) => [\n route.name,\n route.match?.semantic_profile?.prototype ?? route.description ?? '',\n ])\n .filter(([, prototype]) => typeof prototype === 'string' && prototype.trim().length > 0)\n );\n\n if (Object.keys(semanticPrototypes).length > 0 || defaults?.semantic) {\n nextConfig.Governance = {\n ...(config.Governance ?? DEFAULT_GOVERNANCE_CONFIG),\n enabled: config.Governance?.enabled ?? (\n semanticExplicitlyEnabled !== undefined\n ? semanticExplicitlyEnabled\n : Object.keys(semanticPrototypes).length > 0\n ),\n semantic: {\n ...((config.Governance?.semantic ?? {}) as NonNullable<IAppConfig['Governance']>['semantic']),\n ...(defaults?.semantic ?? {}),\n enabled: defaults?.semantic?.enabled ?? true,\n prototypes: {\n ...(config.Governance?.semantic?.prototypes ?? {}),\n ...semanticPrototypes,\n },\n },\n };\n }\n }\n\n if (decision) {\n nextConfig.SmartRouter = {\n ...(config.SmartRouter ?? DEFAULT_SMART_ROUTER_CONFIG),\n enabled: decision.smart_fallback ?? true,\n router_model: decision.router_model ?? config.SmartRouter?.router_model ?? '',\n candidates: decision.candidates ?? config.SmartRouter?.candidates ?? [],\n cache_ttl: decision.cache_ttl ?? config.SmartRouter?.cache_ttl,\n max_tokens: decision.max_tokens ?? config.SmartRouter?.max_tokens,\n fallback: decision.fallback ?? config.SmartRouter?.fallback,\n router_hint: decision.router_hint ?? config.SmartRouter?.router_hint,\n };\n }\n\n if (defaults?.sticky || defaults?.semantic) {\n nextConfig.Governance = {\n ...(nextConfig.Governance ?? config.Governance ?? DEFAULT_GOVERNANCE_CONFIG),\n enabled: config.Governance?.enabled ?? Boolean(\n defaults?.sticky?.enabled ||\n defaults?.semantic?.enabled ||\n nextConfig.Governance?.semantic?.enabled\n ),\n sticky: defaults?.sticky\n ? {\n ...((config.Governance?.sticky ?? {}) as NonNullable<IAppConfig['Governance']>['sticky']),\n ...defaults.sticky,\n }\n : config.Governance?.sticky,\n semantic: defaults?.semantic\n ? {\n ...((nextConfig.Governance?.semantic ?? config.Governance?.semantic ?? {}) as NonNullable<IAppConfig['Governance']>['semantic']),\n ...defaults.semantic,\n }\n : nextConfig.Governance?.semantic ?? config.Governance?.semantic,\n };\n }\n\n return nextConfig;\n}\n\nexport function normalizeAndValidateConfig(config: Partial<IAppConfig> = {}): {\n config: IAppConfig;\n errors: string[];\n warnings: string[];\n} {\n const normalizedInput = normalizeUnifiedRouterInput(config);\n const normalizedConfig = deepMerge(\n {\n ...DEFAULT_CONFIG,\n Router: {\n default: '',\n },\n Providers: [],\n SmartRouter: DEFAULT_SMART_ROUTER_CONFIG,\n },\n normalizedInput\n ) as IAppConfig;\n\n if (normalizedInput.TriggerRouter) {\n normalizedConfig.TriggerRouter = deepMerge(DEFAULT_TRIGGER_CONFIG, normalizedInput.TriggerRouter) as IAppConfig['TriggerRouter'];\n }\n\n if (normalizedInput.Governance) {\n normalizedConfig.Governance = deepMerge(DEFAULT_GOVERNANCE_CONFIG, normalizedInput.Governance) as IAppConfig['Governance'];\n }\n\n if (normalizedInput.Models) {\n normalizedConfig.Models = normalizedInput.Models.map((item) => normalizeModelEndpointConfig(item));\n }\n\n return {\n config: normalizedConfig,\n errors: validateConfig(normalizedConfig),\n warnings: collectCapabilityWarnings(normalizedConfig).entries.map((entry) => entry.message),\n };\n}\n\r\n/**\r\n * \u521D\u59CB\u5316\u5E76\u52A0\u8F7D\u914D\u7F6E\r\n */\r\nexport async function initConfig(): Promise<IAppConfig> {\r\n await initDir();\r\n\r\n // \u5C1D\u8BD5\u52A0\u8F7D\u914D\u7F6E\u6587\u4EF6\uFF08\u4F18\u5148\u987A\u5E8F\uFF1Aconfig.yaml \u2192 config.yml \u2192 config.json\uFF09\r\n let config: Partial<IAppConfig> | null = null;\r\n\r\n // \u5C1D\u8BD5 .yaml \u914D\u7F6E\r\n config = await loadYamlConfig(CONFIG_FILE);\r\n\r\n // \u5C1D\u8BD5 .yml \u914D\u7F6E\r\n if (!config) {\r\n config = await loadYamlConfig(CONFIG_FILE_YML);\r\n }\r\n\r\n // \u5982\u679C\u6CA1\u6709 YAML \u914D\u7F6E\uFF0C\u5C1D\u8BD5 JSON \u914D\u7F6E\r\n if (!config) {\r\n config = await loadJsonConfig(CONFIG_FILE_JSON);\r\n }\r\n\r\n // \u5982\u679C\u6CA1\u6709\u914D\u7F6E\u6587\u4EF6\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\r\n if (!config) {\r\n const divider = '\u2500'.repeat(60);\r\n console.error(`\\n${divider}`);\r\n console.error(' \u26A0\uFE0F No configuration file found');\r\n console.error(divider);\r\n console.error(` Expected: ${CONFIG_FILE}`);\r\n console.error(` Run 'ctr init' to create a configuration file.`);\r\n console.error(`${divider}\\n`);\r\n config = {};\r\n }\r\n\r\n const result = normalizeAndValidateConfig(config);\r\n\r\n if (result.errors.length > 0) {\n const divider = '\u2500'.repeat(60);\r\n console.error(`\\n${divider}`);\r\n console.error(' \u274C Configuration Error');\r\n console.error(divider);\r\n console.error(' The following issues were found in your config file:\\n');\r\n result.errors.forEach((err, i) => console.error(` ${i + 1}. ${err}`));\r\n console.error(`\\n Config file: ${CONFIG_FILE}`);\r\n console.error(` Run 'ctr init' to create a new config from the example.`);\r\n console.error(` Reference: https://github.com/peterwangze/claude-trigger-router#configuration`);\r\n console.error(`${divider}\\n`);\r\n throw new Error('Invalid configuration');\n }\n\n if (result.warnings.length > 0) {\n result.warnings.forEach((warning) => logWarn(`[ConfigWarning] ${warning}`));\n }\n\n return result.config;\n}\n\r\n/**\r\n * \u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6\r\n */\r\nexport async function readConfigFile(): Promise<IAppConfig> {\r\n return initConfig();\r\n}\r\n\r\n/**\r\n * \u5199\u5165\u914D\u7F6E\u6587\u4EF6\r\n * \u5199\u56DE\u7B56\u7565\uFF1A\u4F18\u5148\u4FDD\u6301\u539F\u6709\u683C\u5F0F\uFF08YAML \u6216 JSON\uFF09\u3002\r\n * \u82E5 YAML \u6587\u4EF6\u5B58\u5728\uFF0C\u5199\u5165 YAML\uFF1B\u82E5\u4EC5\u5B58\u5728 JSON \u6587\u4EF6\uFF0C\u5199\u5165 JSON\uFF1B\u5426\u5219\u9ED8\u8BA4\u5199 YAML\u3002\r\n */\r\nexport async function writeConfigFile(config: IAppConfig): Promise<void> {\r\n await initDir();\r\n\r\n // \u68C0\u6D4B\u539F\u59CB\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\uFF1A\u4EC5\u5B58\u5728 JSON \u4E14\u4E0D\u5B58\u5728 YAML/YML \u65F6\uFF0C\u5199\u56DE JSON\r\n const hasYaml = existsSync(CONFIG_FILE);\r\n const hasYml = existsSync(CONFIG_FILE_YML);\r\n const hasJson = existsSync(CONFIG_FILE_JSON);\r\n const useJson = !hasYaml && !hasYml && hasJson;\r\n\r\n // \u5199\u56DE\u540C\u540D\u6587\u4EF6\uFF1Ayaml \u2192 config.yaml\uFF0Cyml \u2192 config.yml\uFF0Cjson \u2192 config.json\uFF0C\u9ED8\u8BA4 yaml\r\n const targetFile = useJson ? CONFIG_FILE_JSON : (hasYml && !hasYaml ? CONFIG_FILE_YML : CONFIG_FILE);\r\n\r\n let content: string;\n const externalConfig = {\n ...config,\n Models: config.Models?.map((item) => toExternalModelConfig(item)),\n };\n\n if (useJson) {\n content = JSON.stringify(externalConfig, null, 2);\n } else {\n content = yaml.dump(externalConfig, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n });\r\n }\r\n\r\n await writeFile(targetFile, content, 'utf-8');\r\n}\r\n\r\n/**\r\n * \u5907\u4EFD\u914D\u7F6E\u6587\u4EF6\r\n */\r\nexport async function backupConfigFile(): Promise<string | null> {\r\n const configPath = existsSync(CONFIG_FILE) ? CONFIG_FILE :\r\n existsSync(CONFIG_FILE_YML) ? CONFIG_FILE_YML :\r\n existsSync(CONFIG_FILE_JSON) ? CONFIG_FILE_JSON : null;\r\n\r\n if (!configPath || !existsSync(configPath)) {\r\n return null;\r\n }\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const backupPath = join(CONFIG_DIR, `config.backup.${timestamp}.yaml`);\r\n\r\n try {\r\n const content = await readFile(configPath, 'utf-8');\r\n await writeFile(backupPath, content, 'utf-8');\r\n return backupPath;\r\n } catch (error) {\r\n logError('Error backing up config file:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * \u5408\u5E76\u89E6\u53D1\u914D\u7F6E\r\n * \u5C06\u72EC\u7ACB\u7684\u89E6\u53D1\u914D\u7F6E\u6587\u4EF6\u5408\u5E76\u5230\u4E3B\u914D\u7F6E\r\n */\r\nexport async function mergeTriggerConfig(\r\n config: IAppConfig,\r\n triggerConfigPath?: string\r\n): Promise<IAppConfig> {\r\n if (!triggerConfigPath) {\r\n return config;\r\n }\r\n\r\n const triggerConfig = await loadYamlConfig(triggerConfigPath);\r\n\r\n if (!triggerConfig?.TriggerRouter) {\r\n return config;\r\n }\r\n\r\n return {\r\n ...config,\r\n TriggerRouter: {\r\n ...DEFAULT_TRIGGER_CONFIG,\r\n ...triggerConfig.TriggerRouter,\r\n } as ITriggerConfig,\r\n };\r\n}\r\n", "/**\n * Utilities Index\n *\n * \u5DE5\u5177\u51FD\u6570\u5BFC\u51FA\n */\n\nexport * from './config';\nexport * from './log';\n", "import { Socket } from 'net';\n\nexport const SERVICE_NAME = 'claude-trigger-router';\nexport const SERVICE_HEALTH_PATH = '/api/health';\n\r\nexport function isExpectedServiceHealth(payload: unknown): boolean {\r\n if (!payload || typeof payload !== 'object') {\r\n return false;\r\n }\r\n\r\n const health = payload as {\r\n service?: unknown;\r\n ready?: unknown;\r\n };\r\n\r\n return health.service === SERVICE_NAME && health.ready === true;\r\n}\r\n\r\nexport async function probeServiceHealth(port: number, timeoutMs = 500): Promise<boolean> {\n try {\r\n const res = await fetch(`http://127.0.0.1:${port}${SERVICE_HEALTH_PATH}`, {\r\n signal: AbortSignal.timeout(timeoutMs),\r\n });\r\n\r\n if (!res.ok) {\r\n return false;\r\n }\r\n\r\n return isExpectedServiceHealth(await res.json());\r\n } catch {\r\n return false;\r\n }\r\n}\n\nexport async function isTcpPortOccupied(port: number, timeoutMs = 500): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = new Socket();\n let settled = false;\n\n const finish = (value: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n resolve(value);\n };\n\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', (error: NodeJS.ErrnoException) => {\n if (error.code === 'ECONNREFUSED') {\n finish(false);\n return;\n }\n finish(false);\n });\n\n socket.connect(port, '127.0.0.1');\n });\n}\n\nexport async function waitForService(port: number, timeoutMs = 5000): Promise<boolean> {\n const start = Date.now();\r\n while (Date.now() - start < timeoutMs) {\r\n if (await probeServiceHealth(port, 500)) {\r\n return true;\r\n }\r\n await new Promise((resolve) => setTimeout(resolve, 300));\r\n }\r\n return false;\r\n}\r\n", "/**\n * Governance Type Definitions\n *\n * \u6CBB\u7406\u5C42\u76F8\u5173\u7C7B\u578B\u5B9A\u4E49\n */\n\nexport type TSemanticRouterMode = 'embedding' | 'classifier';\nexport type TShadowSupervisorMode = 'async_audit' | 'sync_guard';\n\nexport interface IContextAlignmentConfig {\n /** \u662F\u5426\u542F\u7528\u6A21\u578B\u5207\u6362\u65F6\u7684\u4E0A\u4E0B\u6587\u5BF9\u9F50 */\n enabled: boolean;\n\n /** \u7528\u4E8E\u751F\u6210\u6280\u672F\u6458\u8981\u7684\u6A21\u578B */\n summarizer_model?: string;\n\n /** \u6458\u8981\u6700\u5927 token \u6570 */\n max_summary_tokens?: number;\n}\n\nexport interface IStickyRoutingConfig {\n /** \u662F\u5426\u542F\u7528\u4F1A\u8BDD\u7C98\u6027\u8DEF\u7531 */\n enabled: boolean;\n\n /** \u4F1A\u8BDD\u72B6\u6001 TTL */\n session_ttl_ms?: number;\n\n /** \u4EFB\u52A1\u6307\u7EB9\u76F8\u4F3C\u5EA6\u9608\u503C */\n fingerprint_similarity_threshold?: number;\n\n /** \u547D\u4E2D\u5F3A\u663E\u5F0F\u8DEF\u7531\u65F6\u662F\u5426\u5141\u8BB8\u6253\u7834\u7C98\u6027 */\n break_on_explicit_route?: boolean;\n\n /** \u6A21\u578B\u5207\u6362\u65F6\u7684\u4E0A\u4E0B\u6587\u5BF9\u9F50\u914D\u7F6E */\n alignment?: IContextAlignmentConfig;\n}\n\nexport interface ICascadeTriggerConfig {\n compile_failure?: boolean;\n test_failure?: boolean;\n placeholder_patterns?: string[];\n}\n\nexport interface ICascadeLevelConfig {\n from: string;\n to: string;\n reasoning?: string;\n}\n\nexport interface ICascadeGateConfig {\n /** \u662F\u5426\u542F\u7528\u7EA7\u8054\u5347\u7EA7 */\n enabled: boolean;\n\n /** \u6700\u5927\u5347\u7EA7\u5C1D\u8BD5\u6B21\u6570 */\n max_attempts?: number;\n\n /** \u662F\u5426\u5BF9\u6D41\u5F0F\u54CD\u5E94\u542F\u7528 buffer-and-retry \u5B88\u536B */\n stream_guard?: boolean;\n\n /** \u5347\u7EA7\u89E6\u53D1\u5668 */\n triggers?: ICascadeTriggerConfig;\n\n /** \u5347\u7EA7\u5C42\u7EA7 */\n levels?: ICascadeLevelConfig[];\n}\n\nexport interface ISemanticRouterConfig {\n /** \u662F\u5426\u542F\u7528\u8BED\u4E49\u8DEF\u7531 */\n enabled: boolean;\n\n /** \u8BED\u4E49\u8DEF\u7531\u6A21\u5F0F */\n mode?: TSemanticRouterMode;\n\n /** classifier \u6A21\u5F0F\u4E0B\u4F7F\u7528\u7684\u6A21\u578B */\n classifier_model?: string;\n\n /** \u8BED\u4E49\u547D\u4E2D\u9608\u503C */\n threshold?: number;\n\n /** \u539F\u578B\u610F\u56FE\u96C6\u5408 */\n prototypes?: Record<string, string>;\n}\n\nexport interface IShadowChecksConfig {\n placeholder_patterns?: boolean;\n length_anomaly?: boolean;\n missing_code_block?: boolean;\n}\n\nexport interface IShadowSupervisorConfig {\n /** \u662F\u5426\u542F\u7528\u5F71\u5B50\u76D1\u7763 */\n enabled: boolean;\n\n /** \u5DE5\u4F5C\u6A21\u5F0F */\n mode?: TShadowSupervisorMode;\n\n /** \u91C7\u6837\u7387 */\n sample_rate?: number;\n\n /** \u5BA1\u67E5\u6A21\u578B */\n verifier_model?: string;\n\n /** \u89C4\u5219\u68C0\u67E5\u9879 */\n checks?: IShadowChecksConfig;\n}\n\nexport interface IAnomalyThresholdsConfig {\n min_sample_size?: number;\n cascade_warn_rate?: number;\n cascade_critical_rate?: number;\n shadow_warn_rate?: number;\n shadow_critical_rate?: number;\n latency_warn_ms?: number;\n latency_critical_ms?: number;\n spike_warn_rate?: number;\n spike_delta_rate?: number;\n}\n\nexport interface IObservabilityConfig {\n anomaly_thresholds?: IAnomalyThresholdsConfig;\n}\n\nexport interface IGovernanceConfig {\n /** \u662F\u5426\u542F\u7528\u6CBB\u7406\u5C42 */\n enabled: boolean;\n\n sticky?: IStickyRoutingConfig;\n cascade?: ICascadeGateConfig;\n semantic?: ISemanticRouterConfig;\n shadow?: IShadowSupervisorConfig;\n observability?: IObservabilityConfig;\n}\n\nexport interface IGovernanceTrace {\n requestId: string;\n sessionKey?: string;\n initialModel?: string;\n finalModel?: string;\n routeReason: string[];\n stickyHit: boolean;\n alignmentUsed: boolean;\n semanticIntent?: string;\n cascadeTriggered: boolean;\n cascadeEvidence?: string[];\n cascadeNextModel?: string;\n shadowChecked: boolean;\n verificationResult?: string;\n latencyMs?: number;\n estimatedCost?: number;\n startedAt: number;\n completedAt?: number;\n}\n\nexport interface ISessionState {\n sessionKey: string;\n preferredModel?: string;\n lastSuccessfulModel?: string;\n lastTaskFingerprint?: string;\n updatedAt: number;\n}\n", "/**\n * Governance Trace Utilities\n *\n * \u6CBB\u7406\u5C42\u94FE\u8DEF\u8FFD\u8E2A\u5DE5\u5177\n */\n\nimport { randomUUID } from 'crypto';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs';\nimport { LRUCache } from 'lru-cache';\nimport { dirname, join } from 'path';\nimport { gunzipSync, gzipSync } from 'zlib';\nimport { GOVERNANCE_TRACE_ARCHIVE_DIR, GOVERNANCE_TRACE_FILE } from '../constants';\nimport { IGovernanceTrace } from './types';\n\nexport interface IGovernanceTraceStoreOptions {\n max?: number;\n ttlMs?: number;\n persistFile?: string;\n persistEnabled?: boolean;\n activePersistLimit?: number;\n archiveDir?: string;\n retainArchiveFiles?: number;\n compressArchives?: boolean;\n}\n\nexport interface IGovernanceTraceArchiveRecord {\n file: string;\n filePath: string;\n traceCount: number;\n startedAt?: number;\n endedAt?: number;\n compressed: boolean;\n}\n\nexport class GovernanceTraceStore {\n private cache: LRUCache<string, IGovernanceTrace>;\n private persistFile?: string;\n private persistEnabled: boolean;\n private activePersistLimit: number;\n private archiveDir?: string;\n private retainArchiveFiles: number;\n private compressArchives: boolean;\n\n constructor(options: IGovernanceTraceStoreOptions = {}) {\n const max = options.max ?? 500;\n const ttlMs = options.ttlMs ?? 1000 * 60 * 60;\n this.cache = new LRUCache<string, IGovernanceTrace>({\n max,\n ttl: ttlMs,\n });\n this.persistFile = options.persistFile ?? GOVERNANCE_TRACE_FILE;\n this.persistEnabled = options.persistEnabled ?? process.env.NODE_ENV !== 'test';\n this.activePersistLimit = options.activePersistLimit ?? 200;\n this.archiveDir = options.archiveDir ?? GOVERNANCE_TRACE_ARCHIVE_DIR;\n this.retainArchiveFiles = options.retainArchiveFiles ?? 5;\n this.compressArchives = options.compressArchives ?? true;\n this.loadFromDisk();\n }\n\n add(trace: IGovernanceTrace): void {\n this.cache.set(trace.requestId, { ...trace, routeReason: [...trace.routeReason] });\n this.persistToDisk();\n }\n\n get(requestId: string): IGovernanceTrace | undefined {\n return this.cache.get(requestId);\n }\n\n list(filters?: {\n requestId?: string;\n sessionKey?: string;\n routeReason?: string;\n cascadeTriggered?: boolean;\n shadowChecked?: boolean;\n limit?: number;\n }): IGovernanceTrace[] {\n let traces = Array.from(this.cache.values()).sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0));\n\n if (filters?.requestId) {\n traces = traces.filter((trace) => trace.requestId === filters.requestId);\n }\n\n if (filters?.sessionKey) {\n traces = traces.filter((trace) => trace.sessionKey === filters.sessionKey);\n }\n\n if (filters?.routeReason) {\n traces = traces.filter((trace) => trace.routeReason.includes(filters.routeReason!));\n }\n\n if (filters?.cascadeTriggered !== undefined) {\n traces = traces.filter((trace) => trace.cascadeTriggered === filters.cascadeTriggered);\n }\n\n if (filters?.shadowChecked !== undefined) {\n traces = traces.filter((trace) => trace.shadowChecked === filters.shadowChecked);\n }\n\n if (filters?.limit !== undefined && Number.isFinite(filters.limit) && filters.limit > 0) {\n traces = traces.slice(0, filters.limit);\n }\n\n return traces;\n }\n\n clear(): void {\n this.cache.clear();\n this.persistToDisk();\n this.clearArchives();\n }\n\n hydrate(traces: IGovernanceTrace[]): void {\n this.cache.clear();\n for (const trace of traces) {\n this.cache.set(trace.requestId, { ...trace, routeReason: [...trace.routeReason] });\n }\n this.persistToDisk();\n }\n\n listArchives(filters?: {\n date?: string;\n limit?: number;\n page?: number;\n pageSize?: number;\n }): IGovernanceTraceArchiveRecord[] {\n if (!this.archiveDir || !existsSync(this.archiveDir)) {\n return [];\n }\n\n let records = readdirSync(this.archiveDir)\n .filter((file) => file.endsWith('.json') || file.endsWith('.json.gz'))\n .sort()\n .reverse()\n .map((file) => this.readArchiveRecord(file))\n .filter((record): record is IGovernanceTraceArchiveRecord => Boolean(record));\n\n if (filters?.date) {\n records = records.filter((record) => {\n const started = record.startedAt ? new Date(record.startedAt).toISOString().slice(0, 10) : '';\n const ended = record.endedAt ? new Date(record.endedAt).toISOString().slice(0, 10) : '';\n return started === filters.date || ended === filters.date;\n });\n }\n\n const pageSize = filters?.pageSize && filters.pageSize > 0 ? filters.pageSize : undefined;\n const page = filters?.page && filters.page > 0 ? filters.page : 1;\n\n if (pageSize) {\n const start = (page - 1) * pageSize;\n records = records.slice(start, start + pageSize);\n } else if (filters?.limit && filters.limit > 0) {\n records = records.slice(0, filters.limit);\n }\n\n return records;\n }\n\n getArchivedTraces(file: string): IGovernanceTrace[] {\n if (!this.archiveDir) {\n return [];\n }\n\n const filePath = join(this.archiveDir, file);\n if (!existsSync(filePath)) {\n return [];\n }\n\n try {\n return this.readArchiveFile(filePath);\n } catch {\n return [];\n }\n }\n\n deleteArchive(file: string): boolean {\n if (!this.archiveDir) {\n return false;\n }\n\n const filePath = join(this.archiveDir, file);\n if (!existsSync(filePath)) {\n return false;\n }\n\n rmSync(filePath, { force: true });\n return true;\n }\n\n private loadFromDisk(): void {\n if (!this.persistEnabled || !this.persistFile) {\n return;\n }\n\n try {\n const traces: IGovernanceTrace[] = [];\n\n if (existsSync(this.persistFile)) {\n const content = readFileSync(this.persistFile, 'utf-8');\n traces.push(...(JSON.parse(content) as IGovernanceTrace[]));\n }\n\n if (this.archiveDir && existsSync(this.archiveDir)) {\n const archiveFiles = readdirSync(this.archiveDir)\n .filter((file) => file.endsWith('.json') || file.endsWith('.json.gz'))\n .sort()\n .reverse();\n\n for (const file of archiveFiles) {\n traces.push(...this.readArchiveFile(join(this.archiveDir, file)));\n }\n }\n\n const deduped = new Map<string, IGovernanceTrace>();\n for (const trace of traces.sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0))) {\n if (!deduped.has(trace.requestId)) {\n deduped.set(trace.requestId, trace);\n }\n }\n\n for (const trace of Array.from(deduped.values()).slice(0, this.cache.max)) {\n this.cache.set(trace.requestId, { ...trace, routeReason: [...(trace.routeReason ?? [])] });\n }\n } catch {\n // Ignore persistence corruption and continue with in-memory mode.\n }\n }\n\n private persistToDisk(): void {\n if (!this.persistEnabled || !this.persistFile) {\n return;\n }\n\n try {\n mkdirSync(dirname(this.persistFile), { recursive: true });\n const traces = Array.from(this.cache.values()).sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0));\n const activeTraces = traces.slice(0, this.activePersistLimit);\n const archivedTraces = traces.slice(this.activePersistLimit);\n\n if (archivedTraces.length > 0 && this.archiveDir) {\n this.writeArchive(archivedTraces);\n this.pruneArchives();\n this.cache.clear();\n for (const trace of activeTraces) {\n this.cache.set(trace.requestId, { ...trace, routeReason: [...trace.routeReason] });\n }\n }\n\n writeFileSync(this.persistFile, JSON.stringify(activeTraces, null, 2), 'utf-8');\n } catch {\n // Keep runtime resilient even if local persistence fails.\n }\n }\n\n private writeArchive(traces: IGovernanceTrace[]): void {\n if (!this.archiveDir || traces.length === 0) {\n return;\n }\n\n mkdirSync(this.archiveDir, { recursive: true });\n const filename = this.compressArchives\n ? `governance-traces-${Date.now()}.json.gz`\n : `governance-traces-${Date.now()}.json`;\n const filePath = join(this.archiveDir, filename);\n const content = JSON.stringify(traces, null, 2);\n if (this.compressArchives) {\n writeFileSync(filePath, gzipSync(Buffer.from(content, 'utf-8')));\n return;\n }\n writeFileSync(filePath, content, 'utf-8');\n }\n\n private readArchiveRecord(file: string): IGovernanceTraceArchiveRecord | null {\n if (!this.archiveDir) {\n return null;\n }\n\n const filePath = join(this.archiveDir, file);\n try {\n const traces = this.readArchiveFile(filePath);\n const startedAtValues = traces.map((trace) => trace.startedAt).filter((value) => typeof value === 'number');\n return {\n file,\n filePath,\n traceCount: traces.length,\n startedAt: startedAtValues.length ? Math.min(...startedAtValues) : undefined,\n endedAt: startedAtValues.length ? Math.max(...startedAtValues) : undefined,\n compressed: file.endsWith('.gz'),\n };\n } catch {\n return null;\n }\n }\n\n private pruneArchives(): void {\n if (!this.archiveDir || !existsSync(this.archiveDir)) {\n return;\n }\n\n const archiveFiles = readdirSync(this.archiveDir)\n .filter((file) => file.endsWith('.json') || file.endsWith('.json.gz'))\n .sort()\n .reverse();\n\n for (const file of archiveFiles.slice(this.retainArchiveFiles)) {\n rmSync(join(this.archiveDir, file), { force: true });\n }\n }\n\n private clearArchives(): void {\n if (!this.archiveDir || !existsSync(this.archiveDir)) {\n return;\n }\n\n for (const file of readdirSync(this.archiveDir).filter((item) => item.endsWith('.json') || item.endsWith('.json.gz'))) {\n rmSync(join(this.archiveDir, file), { force: true });\n }\n }\n\n private readArchiveFile(filePath: string): IGovernanceTrace[] {\n if (filePath.endsWith('.gz')) {\n const content = gunzipSync(readFileSync(filePath)).toString('utf-8');\n return JSON.parse(content) as IGovernanceTrace[];\n }\n return JSON.parse(readFileSync(filePath, 'utf-8')) as IGovernanceTrace[];\n }\n}\n\nexport const governanceTraceStore = new GovernanceTraceStore();\n\nexport function createGovernanceTrace(\n input: Partial<IGovernanceTrace> = {}\n): IGovernanceTrace {\n return {\n requestId: input.requestId ?? randomUUID(),\n sessionKey: input.sessionKey,\n initialModel: input.initialModel,\n finalModel: input.finalModel,\n routeReason: input.routeReason ? [...input.routeReason] : [],\n stickyHit: input.stickyHit ?? false,\n alignmentUsed: input.alignmentUsed ?? false,\n semanticIntent: input.semanticIntent,\n cascadeTriggered: input.cascadeTriggered ?? false,\n cascadeEvidence: input.cascadeEvidence ? [...input.cascadeEvidence] : [],\n cascadeNextModel: input.cascadeNextModel,\n shadowChecked: input.shadowChecked ?? false,\n verificationResult: input.verificationResult,\n latencyMs: input.latencyMs,\n estimatedCost: input.estimatedCost,\n startedAt: input.startedAt ?? Date.now(),\n completedAt: input.completedAt,\n };\n}\n\nexport function appendTraceReason(trace: IGovernanceTrace, reason: string): IGovernanceTrace {\n if (!trace.routeReason.includes(reason)) {\n trace.routeReason.push(reason);\n }\n return trace;\n}\n\nexport function finalizeTrace(\n trace: IGovernanceTrace,\n overrides: Partial<IGovernanceTrace> = {}\n): IGovernanceTrace {\n const completedAt = overrides.completedAt ?? Date.now();\n return {\n ...trace,\n ...overrides,\n routeReason: overrides.routeReason ? [...overrides.routeReason] : [...trace.routeReason],\n completedAt,\n latencyMs: overrides.latencyMs ?? Math.max(0, completedAt - trace.startedAt),\n };\n}\n\nexport function recordGovernanceTrace(trace: IGovernanceTrace): IGovernanceTrace {\n governanceTraceStore.add(trace);\n return trace;\n}\n", "/**\n * Session State Store\n *\n * \u7528\u4E8E\u4FDD\u5B58\u4F1A\u8BDD\u7EA7\u6CBB\u7406\u72B6\u6001\uFF0C\u4E3A sticky routing \u63D0\u4F9B\u57FA\u7840\u6570\u636E\u3002\n */\n\nimport { LRUCache } from 'lru-cache';\nimport { ISessionState } from './types';\n\nexport class SessionStateStore {\n private cache: LRUCache<string, ISessionState>;\n\n constructor(ttlMs = 1000 * 60 * 60) {\n this.cache = new LRUCache<string, ISessionState>({\n max: 1000,\n ttl: ttlMs,\n });\n }\n\n get(sessionKey: string | undefined): ISessionState | undefined {\n if (!sessionKey) return undefined;\n return this.cache.get(sessionKey);\n }\n\n put(sessionKey: string | undefined, state: Omit<ISessionState, 'sessionKey' | 'updatedAt'>): void {\n if (!sessionKey) return;\n this.cache.set(sessionKey, {\n sessionKey,\n ...state,\n updatedAt: Date.now(),\n });\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\nexport function createTaskFingerprint(text: string | undefined): string | undefined {\n if (!text) return undefined;\n const normalized = text\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, ' ');\n\n return normalized || undefined;\n}\n\nexport const sessionStateStore = new SessionStateStore();\n", "export type TMessageIRRole = 'system' | 'user' | 'assistant' | 'tool';\n\nexport type TMessageIRPart =\n | { type: 'text'; text: string }\n | { type: 'image'; source: any }\n | { type: 'tool_call'; id: string; name: string; arguments: string }\n | { type: 'tool_result'; tool_call_id: string; content: any };\n\nexport interface IMessageIRMessage {\n role: Exclude<TMessageIRRole, 'system'>;\n parts: TMessageIRPart[];\n}\n\nexport interface IMessageIR {\n system: string[];\n messages: IMessageIRMessage[];\n options?: {\n thinking?: {\n enabled?: boolean;\n effort?: 'low' | 'medium' | 'high';\n budget_tokens?: number;\n };\n };\n}\n\nfunction toTextPart(text: string): TMessageIRPart {\n return { type: 'text', text };\n}\n\nfunction normalizeContentParts(content: any): TMessageIRPart[] {\n if (typeof content === 'string') {\n return [toTextPart(content)];\n }\n\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content.flatMap((item) => {\n if (!item || typeof item !== 'object') {\n return [];\n }\n\n switch (item.type) {\n case 'text':\n return typeof item.text === 'string' ? [{ type: 'text', text: item.text }] : [];\n case 'image':\n case 'image_url':\n return [{\n type: 'image',\n source: item.source\n ?? (item.image_url\n ? {\n ...item.image_url,\n ...(item.media_type ? { media_type: item.media_type } : {}),\n }\n : item.url),\n }];\n case 'tool_use':\n return item.id && item.name\n ? [{ type: 'tool_call', id: item.id, name: item.name, arguments: JSON.stringify(item.input ?? {}) }]\n : [];\n case 'tool_result':\n return item.tool_use_id\n ? [{ type: 'tool_result', tool_call_id: item.tool_use_id, content: item.content }]\n : [];\n default:\n return [];\n }\n });\n}\n\nfunction normalizeOpenAIToolCalls(toolCalls: any): TMessageIRPart[] {\n if (!Array.isArray(toolCalls)) {\n return [];\n }\n\n return toolCalls.flatMap((toolCall) => {\n const id = toolCall?.id;\n const name = toolCall?.function?.name;\n const args = toolCall?.function?.arguments;\n if (!id || !name) {\n return [];\n }\n\n return [{\n type: 'tool_call' as const,\n id,\n name,\n arguments: typeof args === 'string' ? args : JSON.stringify(args ?? {}),\n }];\n });\n}\n\nexport function createMessageIR(input: {\n system?: any;\n messages?: any[];\n thinking?: any;\n}): IMessageIR {\n const system = typeof input.system === 'string'\n ? [input.system]\n : Array.isArray(input.system)\n ? input.system.flatMap((item) =>\n typeof item === 'string'\n ? [item]\n : item?.type === 'text' && typeof item.text === 'string'\n ? [item.text]\n : []\n )\n : [];\n\n const messages = Array.isArray(input.messages)\n ? input.messages\n .filter((item) => item?.role)\n .flatMap((item) => {\n if (item.role === 'system') {\n const systemParts = typeof item.content === 'string'\n ? [item.content]\n : normalizeContentParts(item.content)\n .filter((part) => part.type === 'text')\n .map((part) => part.text);\n system.push(...systemParts);\n return [];\n }\n\n if (item.role === 'tool' && item.tool_call_id) {\n return [{\n role: 'user' as const,\n parts: [{\n type: 'tool_result' as const,\n tool_call_id: item.tool_call_id,\n content: item.content,\n }],\n }];\n }\n\n const parts = [\n ...normalizeContentParts(item.content),\n ...(item.role === 'assistant' ? normalizeOpenAIToolCalls(item.tool_calls) : []),\n ];\n\n return [{\n role: item.role,\n parts,\n }];\n })\n : [];\n\n const thinking = input.thinking\n ? {\n enabled: input.thinking?.type === 'enabled' || input.thinking?.enabled === true,\n effort: input.thinking?.effort,\n budget_tokens: input.thinking?.budget_tokens,\n }\n : undefined;\n\n return {\n system,\n messages,\n options: thinking ? { thinking } : undefined,\n };\n}\n\nexport function createSingleUserTextIR(prompt: string, options?: IMessageIR['options']): IMessageIR {\n return {\n system: [],\n messages: [\n {\n role: 'user',\n parts: [toTextPart(prompt)],\n },\n ],\n options,\n };\n}\n", "import { IMessageIR } from './message-ir';\n\nfunction toAnthropicContent(parts: IMessageIR['messages'][number]['parts']) {\n return parts.map((part) => {\n switch (part.type) {\n case 'text':\n return { type: 'text', text: part.text };\n case 'image':\n return { type: 'image', source: part.source };\n case 'tool_call':\n return {\n type: 'tool_use',\n id: part.id,\n name: part.name,\n input: JSON.parse(part.arguments || '{}'),\n };\n case 'tool_result':\n return {\n type: 'tool_result',\n tool_use_id: part.tool_call_id,\n content: part.content,\n };\n default:\n return { type: 'text', text: '' };\n }\n });\n}\n\nexport function toAnthropicMessagesRequest(input: {\n model: string;\n max_tokens?: number;\n stream?: boolean;\n metadata?: Record<string, any>;\n tools?: any[];\n tool_choice?: any;\n ir: IMessageIR;\n}) {\n const body: Record<string, any> = {\n model: input.model,\n messages: input.ir.messages.map((message) => ({\n role: message.role,\n content: toAnthropicContent(message.parts),\n })),\n };\n\n if (input.max_tokens !== undefined) {\n body.max_tokens = input.max_tokens;\n }\n\n if (input.stream !== undefined) {\n body.stream = input.stream;\n }\n\n if (input.metadata) {\n body.metadata = input.metadata;\n }\n\n if (input.tools) {\n body.tools = input.tools.map((tool) => ({\n name: tool?.name ?? tool?.function?.name,\n description: tool?.description ?? tool?.function?.description,\n input_schema: tool?.input_schema ?? tool?.function?.parameters,\n }));\n }\n\n if (input.tool_choice) {\n if (typeof input.tool_choice === 'string') {\n body.tool_choice = input.tool_choice;\n } else if (input.tool_choice?.type === 'tool' && input.tool_choice?.name) {\n body.tool_choice = {\n type: 'tool',\n name: input.tool_choice.name,\n };\n } else if (input.tool_choice?.type === 'function' && input.tool_choice?.function?.name) {\n body.tool_choice = {\n type: 'tool',\n name: input.tool_choice.function.name,\n };\n }\n }\n\n if (input.ir.system.length) {\n body.system = input.ir.system.map((text) => ({ type: 'text', text }));\n }\n\n if (input.ir.options?.thinking?.enabled) {\n body.thinking = {\n type: 'enabled',\n ...(input.ir.options.thinking.effort ? { effort: input.ir.options.thinking.effort } : {}),\n ...(input.ir.options.thinking.budget_tokens ? { budget_tokens: input.ir.options.thinking.budget_tokens } : {}),\n };\n }\n\n return body;\n}\n", "/**\n * Context Alignment\n *\n * \u5728\u6A21\u578B\u5207\u6362\u65F6\u751F\u6210\u6280\u672F\u6458\u8981\uFF0C\u5E76\u628A\u6458\u8981\u6CE8\u5165\u5230\u540E\u7EED\u8BF7\u6C42\u7684 system \u4E0A\u4E0B\u6587\u4E2D\u3002\n */\n\nimport { IContextAlignmentConfig } from './types';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { logError, logWarn } from '../utils/log';\nimport { createSingleUserTextIR } from '../protocols/message-ir';\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\n\nconst CONTEXT_ALIGNMENT_PROMPT = `You are a technical handoff assistant.\nSummarize the current task so a different model can continue the work without losing context.\n\nPrevious model:\n{previousModel}\n\nNext model:\n{nextModel}\n\nUser request / latest task context:\n\"\"\"\n{request}\n\"\"\"\n\nRespond with a concise technical summary only. Focus on:\n- task goal\n- important technical constraints\n- any implied implementation direction\n- what the next model should continue doing\n\nDo not include markdown fences.`;\n\nexport class ContextAlignmentService {\n private buildPrompt(text: string, previousModel: string, nextModel: string): string {\n return CONTEXT_ALIGNMENT_PROMPT\n .replace('{previousModel}', previousModel)\n .replace('{nextModel}', nextModel)\n .replace('{request}', text);\n }\n\n async summarizeTransition(\n text: string,\n previousModel: string,\n nextModel: string,\n config: IContextAlignmentConfig,\n port: number = DEFAULT_CONFIG.PORT,\n fetchFn?: typeof fetch,\n apiKey?: string,\n timeoutMs?: number\n ): Promise<string | null> {\n if (!config.enabled || !config.summarizer_model || !text.trim()) {\n return null;\n }\n\n try {\n const fetchImpl = fetchFn || fetch;\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: config.summarizer_model,\n max_tokens: config.max_summary_tokens ?? 256,\n ir: createSingleUserTextIR(this.buildPrompt(text, previousModel, nextModel)),\n })\n ),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok) {\n logWarn('[ContextAlignment] Alignment request failed:', response.status);\n return null;\n }\n\n const data = await response.json() as any;\n const summary = data.content?.[0]?.text?.trim?.() || '';\n return summary || null;\n } catch (error) {\n logError('[ContextAlignment] Failed to summarize transition:', error);\n return null;\n }\n }\n\n injectAlignmentContext(system: any, summary: string, previousModel: string, nextModel: string): any {\n if (!summary) {\n return system;\n }\n\n const alignmentText =\n `<CTR-CONTEXT-ALIGNMENT from=\"${previousModel}\" to=\"${nextModel}\">\\n` +\n `${summary}\\n` +\n `</CTR-CONTEXT-ALIGNMENT>`;\n\n if (!system) {\n return [{ type: 'text', text: alignmentText }];\n }\n\n if (typeof system === 'string') {\n return [\n { type: 'text', text: alignmentText },\n { type: 'text', text: system },\n ];\n }\n\n if (Array.isArray(system)) {\n return [\n { type: 'text', text: alignmentText },\n ...system,\n ];\n }\n\n return [\n { type: 'text', text: alignmentText },\n system,\n ];\n }\n}\n\nexport const contextAlignmentService = new ContextAlignmentService();\n", "/**\n * Cascade Reasoning Gate\n *\n * \u7B2C\u4E00\u9636\u6BB5\u5148\u843D\u5730\u5931\u8D25\u8BC1\u636E\u8BC6\u522B\u4E0E\u5347\u7EA7\u51B3\u7B56\u57FA\u7840\uFF0C\u4E0D\u76F4\u63A5\u6267\u884C\u771F\u5B9E\u91CD\u6295\u3002\n */\n\nimport { ICascadeGateConfig } from './types';\n\nexport interface IFailureEvidence {\n type: 'compile_failure' | 'test_failure' | 'placeholder_pattern' | 'empty_response' | 'short_response' | 'quality_risk';\n detail: string;\n}\n\nexport interface ICascadeDecision {\n shouldEscalate: boolean;\n nextModel?: string;\n reasoning?: string;\n}\n\nexport async function executeCascadeRetry(\n requestBody: any,\n nextModel: string,\n port: number,\n apiKey?: string,\n timeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<any | null> {\n const fetchImpl = fetchFn || fetch;\n const currentAttempt = Number(requestBody?.metadata?.ctr_cascade_attempt ?? 0);\n const retryBody = {\n ...requestBody,\n model: nextModel,\n metadata: {\n ...(requestBody?.metadata ?? {}),\n ctr_cascade_attempt: currentAttempt + 1,\n },\n };\n\n try {\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(retryBody),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok) {\n return null;\n }\n\n return await response.json();\n } catch {\n return null;\n }\n}\n\nexport async function executeCascadeRetryStream(\n requestBody: any,\n nextModel: string,\n port: number,\n apiKey?: string,\n timeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<ReadableStream<Uint8Array> | null> {\n const fetchImpl = fetchFn || fetch;\n const currentAttempt = Number(requestBody?.metadata?.ctr_cascade_attempt ?? 0);\n const retryBody = {\n ...requestBody,\n model: nextModel,\n metadata: {\n ...(requestBody?.metadata ?? {}),\n ctr_cascade_attempt: currentAttempt + 1,\n },\n };\n\n try {\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(retryBody),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok || !response.body) {\n return null;\n }\n\n return response.body as ReadableStream<Uint8Array>;\n } catch {\n return null;\n }\n}\n\nfunction extractTextPayload(payload: any): string {\n if (!payload) return '';\n if (typeof payload === 'string') return payload;\n if (typeof payload?.content?.[0]?.text === 'string') {\n return payload.content[0].text;\n }\n if (typeof payload?.error?.message === 'string') {\n return payload.error.message;\n }\n return '';\n}\n\nexport function detectFailureEvidence(payload: any, config?: ICascadeGateConfig): IFailureEvidence[] {\n const evidences: IFailureEvidence[] = [];\n const text = extractTextPayload(payload).trim();\n const placeholderPatterns = config?.triggers?.placeholder_patterns ?? [];\n\n if (!text) {\n evidences.push({ type: 'empty_response', detail: 'Response payload is empty' });\n return evidences;\n }\n\n if (text.length < 20) {\n evidences.push({ type: 'short_response', detail: `Response is unusually short (${text.length} chars)` });\n }\n\n if (config?.triggers?.compile_failure && /compile failed|compilation failed|build failed|typescript error|syntaxerror/i.test(text)) {\n evidences.push({ type: 'compile_failure', detail: 'Detected compile/build failure marker in response' });\n }\n\n if (config?.triggers?.test_failure && /test failed|failing test|assertionerror|expected .* to/i.test(text)) {\n evidences.push({ type: 'test_failure', detail: 'Detected test failure marker in response' });\n }\n\n for (const pattern of placeholderPatterns) {\n if (pattern && text.toLowerCase().includes(pattern.toLowerCase())) {\n evidences.push({ type: 'placeholder_pattern', detail: `Matched placeholder pattern: ${pattern}` });\n }\n }\n\n return evidences;\n}\n\nexport function decideCascadeEscalation(\n currentModel: string | undefined,\n evidences: IFailureEvidence[],\n config?: ICascadeGateConfig,\n attempt = 0\n): ICascadeDecision {\n if (!config?.enabled || !currentModel || evidences.length === 0) {\n return { shouldEscalate: false };\n }\n\n const maxAttempts = config.max_attempts ?? 2;\n if (attempt >= maxAttempts) {\n return { shouldEscalate: false, reasoning: 'Reached max cascade attempts' };\n }\n\n const nextLevel = config.levels?.find((level) => level.from === currentModel);\n if (!nextLevel) {\n return { shouldEscalate: false, reasoning: 'No cascade level configured for current model' };\n }\n\n return {\n shouldEscalate: true,\n nextModel: nextLevel.to,\n reasoning: evidences.map((item) => item.type).join(', '),\n };\n}\n", "/**\n * Semantic Router\n *\n * \u7B2C\u4E00\u9636\u6BB5\u91C7\u7528 prototype \u8BED\u4E49\u5339\u914D\uFF0C\u540E\u7EED\u53EF\u6269\u5C55\u4E3A embedding/classifier\u3002\n */\n\nimport { ISemanticRouterConfig } from './types';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { logError, logWarn } from '../utils/log';\nimport { createSingleUserTextIR } from '../protocols/message-ir';\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\n\nexport interface ISemanticIntentResult {\n intent: string;\n confidence: number;\n matchedPrototype?: string;\n evidence?: string[];\n}\n\nexport interface ISemanticCandidateInput {\n intent: string;\n prototype: string;\n threshold?: number;\n}\n\nfunction normalize(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction tokenize(text: string): string[] {\n const normalized = normalize(text);\n if (!normalized) return [];\n\n const parts = normalized.split(' ').filter(Boolean);\n const chars = normalized\n .replace(/\\s+/g, '')\n .split('')\n .filter(Boolean);\n\n return Array.from(new Set([...parts, ...chars]));\n}\n\nfunction buildVector(tokens: string[]): Map<string, number> {\n const vector = new Map<string, number>();\n for (const token of tokens) {\n vector.set(token, (vector.get(token) ?? 0) + 1);\n }\n return vector;\n}\n\nfunction cosineSimilarity(left: Map<string, number>, right: Map<string, number>): number {\n let dot = 0;\n let leftNorm = 0;\n let rightNorm = 0;\n\n for (const value of left.values()) {\n leftNorm += value * value;\n }\n\n for (const value of right.values()) {\n rightNorm += value * value;\n }\n\n for (const [token, leftValue] of left.entries()) {\n const rightValue = right.get(token) ?? 0;\n dot += leftValue * rightValue;\n }\n\n if (leftNorm === 0 || rightNorm === 0) {\n return 0;\n }\n\n return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));\n}\n\nexport class SemanticRouter {\n private buildClassifierPrompt(text: string, prototypes: Record<string, string>): string {\n const intents = Object.entries(prototypes)\n .map(([intent, description]) => `- ${intent}: ${description}`)\n .join('\\n');\n\n return `You are a semantic intent classifier for an AI model router.\nAnalyze the user request and choose the best matching intent.\n\nUser request:\n\"\"\"\n${text}\n\"\"\"\n\nAvailable intents:\n${intents}\n\nReturn JSON only:\n{\n \"intent\": \"<intent>\",\n \"confidence\": 0.0,\n \"evidence\": [\"keyword\"]\n}`;\n }\n\n private analyzeEmbedding(text: string, config?: ISemanticRouterConfig): ISemanticIntentResult | null {\n if (!config?.enabled || !config.prototypes || Object.keys(config.prototypes).length === 0) {\n return null;\n }\n\n const inputTokens = tokenize(text);\n if (inputTokens.length === 0) {\n return null;\n }\n const inputVector = buildVector(inputTokens);\n\n const threshold = config.threshold ?? 0.85;\n let best: ISemanticIntentResult | null = null;\n\n for (const [intent, prototype] of Object.entries(config.prototypes)) {\n const prototypeTokens = tokenize(prototype);\n if (prototypeTokens.length === 0) continue;\n\n const prototypeVector = buildVector(prototypeTokens);\n const matched = prototypeTokens.filter((token) => inputTokens.includes(token));\n const confidence = cosineSimilarity(inputVector, prototypeVector);\n\n if (!best || confidence > best.confidence) {\n best = {\n intent,\n confidence,\n matchedPrototype: prototype,\n evidence: matched,\n };\n }\n }\n\n if (!best || best.confidence < threshold) {\n return null;\n }\n\n return best;\n }\n\n analyzeCandidates(text: string, candidates: ISemanticCandidateInput[], defaultThreshold = 0.85): ISemanticIntentResult | null {\n const inputTokens = tokenize(text);\n if (inputTokens.length === 0 || !candidates.length) {\n return null;\n }\n\n const inputVector = buildVector(inputTokens);\n let best: ISemanticIntentResult | null = null;\n let bestThreshold = defaultThreshold;\n\n for (const candidate of candidates) {\n const prototypeTokens = tokenize(candidate.prototype);\n if (prototypeTokens.length === 0) {\n continue;\n }\n\n const prototypeVector = buildVector(prototypeTokens);\n const matched = prototypeTokens.filter((token) => inputTokens.includes(token));\n const confidence = cosineSimilarity(inputVector, prototypeVector);\n if (!best || confidence > best.confidence) {\n best = {\n intent: candidate.intent,\n confidence,\n matchedPrototype: candidate.prototype,\n evidence: matched,\n };\n bestThreshold = candidate.threshold ?? defaultThreshold;\n }\n }\n\n if (!best || best.confidence < bestThreshold) {\n return null;\n }\n\n return best;\n }\n\n analyze(text: string, config?: ISemanticRouterConfig): ISemanticIntentResult | null {\n return this.analyzeEmbedding(text, config);\n }\n\n async analyzeWithClassifier(\n text: string,\n config?: ISemanticRouterConfig,\n port: number = DEFAULT_CONFIG.PORT,\n fetchFn?: typeof fetch,\n apiKey?: string,\n timeoutMs?: number\n ): Promise<ISemanticIntentResult | null> {\n if (!config?.enabled || config.mode !== 'classifier' || !config.prototypes || Object.keys(config.prototypes).length === 0) {\n return this.analyzeEmbedding(text, config);\n }\n\n try {\n const fetchImpl = fetchFn || fetch;\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: config.classifier_model,\n max_tokens: 128,\n ir: createSingleUserTextIR(this.buildClassifierPrompt(text, config.prototypes)),\n })\n ),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok) {\n logWarn('[SemanticRouter] Classifier request failed:', response.status);\n return this.analyzeEmbedding(text, config);\n }\n\n const data = await response.json() as any;\n const content = data.content?.[0]?.text || '';\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n logWarn('[SemanticRouter] No JSON found in classifier response');\n return this.analyzeEmbedding(text, config);\n }\n\n const parsed = JSON.parse(match[0]) as ISemanticIntentResult;\n const threshold = config.threshold ?? 0.85;\n if (!parsed.intent || (parsed.confidence ?? 0) < threshold) {\n return null;\n }\n\n return {\n intent: parsed.intent,\n confidence: parsed.confidence,\n evidence: Array.isArray(parsed.evidence) ? parsed.evidence : [],\n };\n } catch (error) {\n logError('[SemanticRouter] Classifier mode failed:', error);\n return this.analyzeEmbedding(text, config);\n }\n }\n}\n\nexport const semanticRouter = new SemanticRouter();\n", "/**\n * Shadow Supervisor\n *\n * \u7B2C\u4E00\u9636\u6BB5\u91C7\u7528\u5F02\u6B65\u5BA1\u8BA1\u601D\u8DEF\uFF0C\u4F46\u5B9E\u73B0\u4E3A\u8BF7\u6C42\u5B8C\u6210\u524D\u7684\u8F7B\u91CF\u672C\u5730\u5BA1\u67E5\u4E0E trace \u8BB0\u5F55\u3002\n */\n\nimport { IShadowSupervisorConfig } from './types';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { IFailureEvidence } from './cascade-gate';\nimport { logError, logWarn } from '../utils/log';\nimport { createSingleUserTextIR } from '../protocols/message-ir';\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\n\nexport interface IShadowAuditResult {\n triggered: boolean;\n riskLevel?: 'low' | 'medium' | 'high';\n findings: string[];\n}\n\nconst SHADOW_VERIFIER_PROMPT = `You are a response quality auditor.\nInspect the assistant output and decide whether it is low quality, incomplete, placeholder-heavy, or suspiciously weak.\n\nResponse:\n\"\"\"\n{response}\n\"\"\"\n\nReturn JSON only:\n{\n \"triggered\": true,\n \"riskLevel\": \"low|medium|high\",\n \"findings\": [\"short_reason\"]\n}\n\nIf no issue is found, return:\n{\n \"triggered\": false,\n \"findings\": []\n}`;\n\nfunction extractText(payload: any): string {\n if (!payload) return '';\n if (typeof payload === 'string') return payload;\n if (typeof payload?.content?.[0]?.text === 'string') return payload.content[0].text;\n if (typeof payload?.error?.message === 'string') return payload.error.message;\n return '';\n}\n\nexport class ShadowSupervisor {\n private buildVerifierPrompt(text: string): string {\n return SHADOW_VERIFIER_PROMPT.replace('{response}', text);\n }\n\n inspect(payload: any, config?: IShadowSupervisorConfig): IShadowAuditResult {\n if (!config?.enabled) {\n return { triggered: false, findings: [] };\n }\n\n const text = extractText(payload).trim();\n const findings: string[] = [];\n\n if (!text) {\n findings.push('empty_output');\n }\n\n if (config.checks?.placeholder_patterns) {\n if (/TODO|placeholder|\\.\\.\\.rest of code/i.test(text)) {\n findings.push('placeholder_pattern');\n }\n }\n\n if (config.checks?.length_anomaly && text && text.length < 30) {\n findings.push('length_anomaly');\n }\n\n if (config.checks?.missing_code_block && /```/.test(text) === false && /function|class|const|let|var/i.test(text)) {\n findings.push('missing_code_block');\n }\n\n if (findings.length === 0) {\n return { triggered: false, findings: [] };\n }\n\n const riskLevel =\n findings.includes('placeholder_pattern') || findings.includes('empty_output')\n ? 'high'\n : findings.length > 1\n ? 'medium'\n : 'low';\n\n return {\n triggered: true,\n riskLevel,\n findings,\n };\n }\n\n toFailureEvidence(audit: IShadowAuditResult): IFailureEvidence[] {\n if (!audit.triggered) {\n return [];\n }\n\n return audit.findings.map((finding) => {\n switch (finding) {\n case 'empty_output':\n return { type: 'empty_response', detail: 'Shadow supervisor detected empty output' };\n case 'length_anomaly':\n return { type: 'short_response', detail: 'Shadow supervisor detected length anomaly' };\n case 'placeholder_pattern':\n return { type: 'placeholder_pattern', detail: 'Shadow supervisor detected placeholder pattern' };\n default:\n return { type: 'quality_risk', detail: `Shadow supervisor detected ${finding}` };\n }\n });\n }\n\n async inspectWithVerifier(\n payload: any,\n config: IShadowSupervisorConfig,\n port: number = DEFAULT_CONFIG.PORT,\n fetchFn?: typeof fetch,\n apiKey?: string,\n timeoutMs?: number\n ): Promise<IShadowAuditResult> {\n const text = extractText(payload).trim();\n if (!config.enabled || !config.verifier_model || !text) {\n return this.inspect(payload, config);\n }\n\n try {\n const fetchImpl = fetchFn || fetch;\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: config.verifier_model,\n max_tokens: 128,\n ir: createSingleUserTextIR(this.buildVerifierPrompt(text)),\n })\n ),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok) {\n logWarn('[ShadowSupervisor] Verifier request failed:', response.status);\n return this.inspect(payload, config);\n }\n\n const data = await response.json() as any;\n const content = data.content?.[0]?.text || '';\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n logWarn('[ShadowSupervisor] No JSON found in verifier response');\n return this.inspect(payload, config);\n }\n\n const parsed = JSON.parse(match[0]) as IShadowAuditResult;\n return {\n triggered: Boolean(parsed.triggered),\n riskLevel: parsed.riskLevel,\n findings: Array.isArray(parsed.findings) ? parsed.findings : [],\n };\n } catch (error) {\n logError('[ShadowSupervisor] Verifier audit failed:', error);\n return this.inspect(payload, config);\n }\n }\n}\n\nexport const shadowSupervisor = new ShadowSupervisor();\n", "/**\n * Response Governance\n *\n * \u62BD\u53D6\u975E\u6D41\u5F0F\u54CD\u5E94\u7684\u6CBB\u7406\u94FE\uFF0C\u4FBF\u4E8E\u5728\u4E3B\u94FE\u590D\u7528\u5E76\u505A\u7EC4\u5408\u573A\u666F\u6D4B\u8BD5\u3002\n */\n\nimport { IAppConfig, IRequestContext } from '../trigger/types';\nimport { appendTraceReason, finalizeTrace, recordGovernanceTrace } from './trace';\nimport { createTaskFingerprint, sessionStateStore } from './session-store';\nimport { decideCascadeEscalation, detectFailureEvidence, executeCascadeRetry } from './cascade-gate';\nimport { shadowSupervisor } from './shadow-supervisor';\nimport { resolveModelReference } from '../models/compile';\n\nexport interface IResponseGovernanceDeps {\n decideCascadeEscalation?: typeof decideCascadeEscalation;\n detectFailureEvidence?: typeof detectFailureEvidence;\n executeCascadeRetry?: typeof executeCascadeRetry;\n}\n\nexport interface IApplyResponseGovernanceInput {\n req: IRequestContext & Record<string, any>;\n payload: any;\n config: IAppConfig;\n servicePort: number;\n deps?: IResponseGovernanceDeps;\n}\n\nexport async function applyResponseGovernance({\n req,\n payload,\n config,\n servicePort,\n deps,\n}: IApplyResponseGovernanceInput): Promise<any> {\n let nextPayload = payload;\n const resolvedCascadeConfig = config.Governance?.cascade\n ? {\n ...config.Governance.cascade,\n levels: config.Governance.cascade.levels?.map((level) => ({\n ...level,\n from: resolveModelReference(config, level.from) ?? level.from,\n to: resolveModelReference(config, level.to) ?? level.to,\n })),\n }\n : undefined;\n const resolvedShadowConfig = config.Governance?.shadow\n ? {\n ...config.Governance.shadow,\n verifier_model: resolveModelReference(config, config.Governance.shadow.verifier_model) ?? config.Governance.shadow.verifier_model,\n }\n : undefined;\n const detectFailureEvidenceFn = deps?.detectFailureEvidence ?? detectFailureEvidence;\n const decideCascadeEscalationFn = deps?.decideCascadeEscalation ?? decideCascadeEscalation;\n const executeCascadeRetryFn = deps?.executeCascadeRetry ?? executeCascadeRetry;\n\n if (\n config.Governance?.enabled &&\n resolvedCascadeConfig?.enabled &&\n req.governanceTrace\n ) {\n const evidences = detectFailureEvidenceFn(nextPayload, resolvedCascadeConfig);\n if (evidences.length > 0) {\n const cascadeAttempt = Number(req.body?.metadata?.ctr_cascade_attempt ?? 0);\n const decision = decideCascadeEscalationFn(\n req.body?.model,\n evidences,\n resolvedCascadeConfig,\n cascadeAttempt\n );\n req.governanceTrace.cascadeEvidence = evidences.map((item) => item.type);\n if (decision.shouldEscalate) {\n req.governanceTrace.cascadeTriggered = true;\n req.governanceTrace.cascadeNextModel = decision.nextModel;\n appendTraceReason(req.governanceTrace, 'cascade_gate');\n\n if (decision.nextModel) {\n const retriedPayload = await executeCascadeRetryFn(\n req.body,\n decision.nextModel,\n servicePort,\n config.APIKEY,\n config.API_TIMEOUT_MS\n );\n\n if (retriedPayload) {\n req.body.model = decision.nextModel;\n appendTraceReason(req.governanceTrace, 'cascade_retry_executed');\n nextPayload = retriedPayload;\n }\n }\n }\n }\n }\n\n if (config.Governance?.enabled && config.Governance.sticky?.enabled && req.sessionId && req.body?.model) {\n const fingerprint = createTaskFingerprint(req.triggerResult?.analyzedText);\n if (fingerprint) {\n sessionStateStore.put(req.sessionId, {\n preferredModel: req.body.model,\n lastSuccessfulModel: req.body.model,\n lastTaskFingerprint: fingerprint,\n });\n }\n }\n\n if (\n config.Governance?.enabled &&\n resolvedShadowConfig?.enabled &&\n req.governanceTrace\n ) {\n const audit = resolvedShadowConfig.verifier_model\n ? await shadowSupervisor.inspectWithVerifier(\n nextPayload,\n resolvedShadowConfig,\n servicePort,\n undefined,\n config.APIKEY,\n config.API_TIMEOUT_MS\n )\n : shadowSupervisor.inspect(nextPayload, resolvedShadowConfig);\n if (audit.triggered) {\n req.governanceTrace.shadowChecked = true;\n req.governanceTrace.verificationResult = `${audit.riskLevel}:${audit.findings.join(',')}`;\n appendTraceReason(req.governanceTrace, 'shadow_supervisor');\n\n if (\n resolvedShadowConfig.mode === 'sync_guard' &&\n resolvedCascadeConfig?.enabled &&\n audit.riskLevel !== 'low'\n ) {\n const guardAttempt = Number(req.body?.metadata?.ctr_cascade_attempt ?? 0);\n const guardDecision = decideCascadeEscalationFn(\n req.body?.model,\n shadowSupervisor.toFailureEvidence(audit),\n resolvedCascadeConfig,\n guardAttempt\n );\n\n if (guardDecision.shouldEscalate && guardDecision.nextModel) {\n const guardedPayload = await executeCascadeRetryFn(\n req.body,\n guardDecision.nextModel,\n servicePort,\n config.APIKEY,\n config.API_TIMEOUT_MS\n );\n\n if (guardedPayload) {\n req.body.model = guardDecision.nextModel;\n req.governanceTrace.verificationResult =\n `${audit.riskLevel}:${audit.findings.join(',')}|guard_retry:${guardDecision.nextModel}`;\n appendTraceReason(req.governanceTrace, 'shadow_sync_guard');\n nextPayload = guardedPayload;\n }\n }\n }\n }\n }\n\n if (req.governanceTrace) {\n req.governanceTrace = finalizeTrace(req.governanceTrace, {\n finalModel: req.body?.model ?? req.governanceTrace.finalModel,\n });\n recordGovernanceTrace(req.governanceTrace);\n }\n\n return nextPayload;\n}\n", "/**\n * Cache Utilities\n *\n * \u7F13\u5B58\u5DE5\u5177\n */\n\nimport { LRUCache } from 'lru-cache';\n\n/**\n * \u4F7F\u7528\u91CF\u6570\u636E\n */\nexport interface Usage {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\n/**\n * \u4F1A\u8BDD\u4F7F\u7528\u91CF\u7F13\u5B58\n */\nclass SessionUsageCache {\n private cache: LRUCache<string, Usage>;\n\n constructor() {\n this.cache = new LRUCache({\n max: 1000,\n ttl: 1000 * 60 * 60, // 1 \u5C0F\u65F6\n });\n }\n\n /**\n * \u5B58\u50A8\u4F7F\u7528\u91CF\n */\n put(sessionId: string | undefined, usage: Usage | undefined): void {\n if (!sessionId || !usage) return;\n this.cache.set(sessionId, usage);\n }\n\n /**\n * \u83B7\u53D6\u4F7F\u7528\u91CF\n */\n get(sessionId: string | undefined): Usage | undefined {\n if (!sessionId) return undefined;\n return this.cache.get(sessionId);\n }\n\n /**\n * \u6E05\u9664\u7F13\u5B58\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\nexport const sessionUsageCache = new SessionUsageCache();\n", "/**\n * SSE Parser Transform\n *\n * Server-Sent Events \u89E3\u6790\u8F6C\u6362\u6D41\n */\n\nexport class SSEParserTransform {\n private buffer: string = \"\";\n\n constructor() {\n const transformStream = new TransformStream({\n start: (controller) => {\n // Initialization if needed\n },\n transform: (chunk: Uint8Array, controller) => {\n const text = new TextDecoder().decode(chunk);\n this.buffer += text;\n\n this.parseBuffer(controller);\n },\n flush: (controller) => {\n if (this.buffer.trim()) {\n this.parseBuffer(controller);\n }\n },\n });\n\n // Copy readable and writable to this instance\n this.readable = transformStream.readable;\n this.writable = transformStream.writable;\n }\n\n readable: ReadableStream<any>;\n writable: WritableStream<any>;\n\n private parseBuffer(controller: TransformStreamDefaultController<any>) {\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() || \"\";\n\n let currentEvent: any = {};\n\n for (const line of lines) {\n if (line.startsWith(\"event:\")) {\n currentEvent.event = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n const dataStr = line.slice(5).trim();\n try {\n currentEvent.data = JSON.parse(dataStr);\n } catch {\n currentEvent.data = dataStr;\n }\n } else if (line === \"\" && Object.keys(currentEvent).length > 0) {\n controller.enqueue(currentEvent);\n currentEvent = {};\n }\n }\n }\n}\n", "/**\n * Stream Response Governance\n *\n * \u5904\u7406\u6D41\u5F0F\u54CD\u5E94\u4E0B\u7684\u6CBB\u7406\u903B\u8F91\uFF0C\u91CD\u70B9\u652F\u6301 cascade \u7684 stream_guard\u3002\n */\n\nimport { IAppConfig, IRequestContext } from '../trigger/types';\nimport { sessionUsageCache } from '../router/cache';\nimport { SSEParserTransform } from '../utils/SSEParser.transform';\nimport { appendTraceReason, finalizeTrace, recordGovernanceTrace } from './trace';\nimport { decideCascadeEscalation, detectFailureEvidence, executeCascadeRetryStream } from './cascade-gate';\nimport { resolveModelReference } from '../models/compile';\n\ninterface ICollectedSSE {\n events: any[];\n text: string;\n usage?: any;\n sawText: boolean;\n}\n\nexport interface IStreamGovernanceDeps {\n executeCascadeRetryStream?: typeof executeCascadeRetryStream;\n detectFailureEvidence?: typeof detectFailureEvidence;\n decideCascadeEscalation?: typeof decideCascadeEscalation;\n}\n\nfunction serializeEvent(event: any): Uint8Array {\n let output = '';\n if (event.event) {\n output += `event: ${event.event}\\n`;\n }\n if (event.data !== undefined) {\n output += `data: ${typeof event.data === 'string' ? event.data : JSON.stringify(event.data)}\\n`;\n }\n output += '\\n';\n return new TextEncoder().encode(output);\n}\n\nasync function collectSSE(stream: ReadableStream<Uint8Array>): Promise<ICollectedSSE> {\n const parser = new SSEParserTransform();\n const parsedStream = stream.pipeThrough(parser as any);\n const reader = parsedStream.getReader();\n const events: any[] = [];\n let text = '';\n let usage: any;\n let sawText = false;\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n events.push(value);\n\n const deltaText = value?.data?.delta?.text;\n if (typeof deltaText === 'string') {\n sawText = true;\n text += deltaText;\n }\n\n if (value?.event === 'message_delta' && value?.data?.usage) {\n usage = value.data.usage;\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return { events, text, usage, sawText };\n}\n\nexport function governStreamingResponse(\n stream: ReadableStream<Uint8Array>,\n req: IRequestContext & Record<string, any>,\n config: IAppConfig,\n servicePort: number,\n deps?: IStreamGovernanceDeps\n): ReadableStream<Uint8Array> {\n const executeCascadeRetryStreamFn = deps?.executeCascadeRetryStream ?? executeCascadeRetryStream;\n const detectFailureEvidenceFn = deps?.detectFailureEvidence ?? detectFailureEvidence;\n const decideCascadeEscalationFn = deps?.decideCascadeEscalation ?? decideCascadeEscalation;\n const resolvedCascadeConfig = config.Governance?.cascade\n ? {\n ...config.Governance.cascade,\n levels: config.Governance.cascade.levels?.map((level) => ({\n ...level,\n from: resolveModelReference(config, level.from) ?? level.from,\n to: resolveModelReference(config, level.to) ?? level.to,\n })),\n }\n : undefined;\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n const original = await collectSSE(stream);\n let selected = original;\n\n if (\n config.Governance?.enabled &&\n resolvedCascadeConfig?.enabled &&\n resolvedCascadeConfig.stream_guard &&\n req.governanceTrace &&\n original.sawText\n ) {\n const evidences = detectFailureEvidenceFn(\n { content: [{ text: original.text }] },\n resolvedCascadeConfig\n );\n\n if (evidences.length > 0) {\n const cascadeAttempt = Number(req.body?.metadata?.ctr_cascade_attempt ?? 0);\n const decision = decideCascadeEscalationFn(\n req.body?.model,\n evidences,\n resolvedCascadeConfig,\n cascadeAttempt\n );\n req.governanceTrace.cascadeEvidence = evidences.map((item) => item.type);\n\n if (decision.shouldEscalate && decision.nextModel) {\n req.governanceTrace.cascadeTriggered = true;\n req.governanceTrace.cascadeNextModel = decision.nextModel;\n appendTraceReason(req.governanceTrace, 'cascade_gate_stream');\n\n const retryStream = await executeCascadeRetryStreamFn(\n req.body,\n decision.nextModel,\n servicePort,\n config.APIKEY,\n config.API_TIMEOUT_MS\n );\n\n if (retryStream) {\n selected = await collectSSE(retryStream);\n req.body.model = decision.nextModel;\n appendTraceReason(req.governanceTrace, 'cascade_stream_retry_executed');\n }\n }\n }\n }\n\n for (const event of selected.events) {\n controller.enqueue(serializeEvent(event));\n }\n controller.close();\n\n if (req.sessionId && selected.usage) {\n sessionUsageCache.put(req.sessionId, selected.usage);\n }\n\n if (req.governanceTrace) {\n req.governanceTrace = finalizeTrace(req.governanceTrace, {\n finalModel: req.body?.model ?? req.governanceTrace.finalModel,\n });\n recordGovernanceTrace(req.governanceTrace);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n });\n}\n", "import { IGovernanceTrace } from './types';\nimport { governanceTraceStore } from './trace';\n\nexport interface IGovernanceMetricsFilters {\n requestId?: string;\n sessionKey?: string;\n routeReason?: string;\n cascadeTriggered?: boolean;\n shadowChecked?: boolean;\n limit?: number;\n}\n\nexport interface IGovernanceMetricsWindowOptions extends IGovernanceMetricsFilters {\n windowMs?: number;\n bucketCount?: number;\n now?: number;\n anomalyThresholds?: Partial<IGovernanceAnomalyThresholds>;\n}\n\nexport interface IGovernanceMetricsBucket {\n bucketStart: number;\n bucketEnd: number;\n label: string;\n metrics: IGovernanceMetrics;\n}\n\nexport interface IGovernanceDistributionEntry {\n key: string;\n count: number;\n rate: number;\n}\n\nexport interface IGovernanceAnomaly {\n type: string;\n severity: 'info' | 'warn' | 'critical';\n message: string;\n metric: string;\n value: number;\n threshold?: number;\n}\n\nexport interface IGovernanceAnomalyThresholds {\n minSampleSize: number;\n cascadeWarnRate: number;\n cascadeCriticalRate: number;\n shadowWarnRate: number;\n shadowCriticalRate: number;\n latencyWarnMs: number;\n latencyCriticalMs: number;\n spikeWarnRate: number;\n spikeDeltaRate: number;\n}\n\nexport interface IGovernanceMetrics {\n totalTraces: number;\n stickyHitCount: number;\n stickyHitRate: number;\n alignmentUsedCount: number;\n alignmentUsedRate: number;\n cascadeTriggeredCount: number;\n cascadeTriggeredRate: number;\n shadowCheckedCount: number;\n shadowCheckedRate: number;\n averageLatencyMs: number;\n averageEstimatedCost: number;\n routeReasonDistribution: Record<string, number>;\n finalModelDistribution: Record<string, number>;\n semanticIntentDistribution: Record<string, number>;\n}\n\nexport interface IGovernanceMetricsReport {\n windowMs?: number;\n bucketCount: number;\n windowStart?: number;\n windowEnd?: number;\n metrics: IGovernanceMetrics;\n buckets: IGovernanceMetricsBucket[];\n topRouteReasons: IGovernanceDistributionEntry[];\n topFinalModels: IGovernanceDistributionEntry[];\n topSemanticIntents: IGovernanceDistributionEntry[];\n anomalies: IGovernanceAnomaly[];\n}\n\nexport type TGovernanceMetricsExportFormat = 'json' | 'csv';\n\nconst DEFAULT_ANOMALY_THRESHOLDS: IGovernanceAnomalyThresholds = {\n minSampleSize: 3,\n cascadeWarnRate: 0.4,\n cascadeCriticalRate: 0.6,\n shadowWarnRate: 0.5,\n shadowCriticalRate: 0.7,\n latencyWarnMs: 1500,\n latencyCriticalMs: 3000,\n spikeWarnRate: 0.5,\n spikeDeltaRate: 0.3,\n};\n\nfunction normalizeAnomalyThresholds(\n input?: Partial<IGovernanceAnomalyThresholds>\n): IGovernanceAnomalyThresholds {\n return {\n minSampleSize: input?.minSampleSize ?? DEFAULT_ANOMALY_THRESHOLDS.minSampleSize,\n cascadeWarnRate: input?.cascadeWarnRate ?? DEFAULT_ANOMALY_THRESHOLDS.cascadeWarnRate,\n cascadeCriticalRate: input?.cascadeCriticalRate ?? DEFAULT_ANOMALY_THRESHOLDS.cascadeCriticalRate,\n shadowWarnRate: input?.shadowWarnRate ?? DEFAULT_ANOMALY_THRESHOLDS.shadowWarnRate,\n shadowCriticalRate: input?.shadowCriticalRate ?? DEFAULT_ANOMALY_THRESHOLDS.shadowCriticalRate,\n latencyWarnMs: input?.latencyWarnMs ?? DEFAULT_ANOMALY_THRESHOLDS.latencyWarnMs,\n latencyCriticalMs: input?.latencyCriticalMs ?? DEFAULT_ANOMALY_THRESHOLDS.latencyCriticalMs,\n spikeWarnRate: input?.spikeWarnRate ?? DEFAULT_ANOMALY_THRESHOLDS.spikeWarnRate,\n spikeDeltaRate: input?.spikeDeltaRate ?? DEFAULT_ANOMALY_THRESHOLDS.spikeDeltaRate,\n };\n}\n\nfunction rate(count: number, total: number): number {\n if (!total) {\n return 0;\n }\n\n return Number((count / total).toFixed(4));\n}\n\nfunction average(values: number[]): number {\n if (!values.length) {\n return 0;\n }\n\n const total = values.reduce((sum, value) => sum + value, 0);\n return Number((total / values.length).toFixed(2));\n}\n\nfunction increment(distribution: Record<string, number>, key?: string): void {\n if (!key) {\n return;\n }\n\n distribution[key] = (distribution[key] ?? 0) + 1;\n}\n\nfunction buildTopEntries(\n distribution: Record<string, number>,\n total: number,\n limit = 5\n): IGovernanceDistributionEntry[] {\n return Object.entries(distribution)\n .sort((left, right) => {\n if (right[1] !== left[1]) {\n return right[1] - left[1];\n }\n return left[0].localeCompare(right[0]);\n })\n .slice(0, limit)\n .map(([key, count]) => ({\n key,\n count,\n rate: rate(count, total),\n }));\n}\n\nfunction averageRate(values: number[]): number {\n if (!values.length) {\n return 0;\n }\n\n return Number((values.reduce((sum, value) => sum + value, 0) / values.length).toFixed(4));\n}\n\nfunction buildAnomalies(\n metrics: IGovernanceMetrics,\n buckets: IGovernanceMetricsBucket[],\n thresholds: IGovernanceAnomalyThresholds\n): IGovernanceAnomaly[] {\n const anomalies: IGovernanceAnomaly[] = [];\n\n if (metrics.totalTraces >= thresholds.minSampleSize && metrics.cascadeTriggeredRate >= thresholds.cascadeWarnRate) {\n anomalies.push({\n type: 'cascade_rate_high',\n severity: metrics.cascadeTriggeredRate >= thresholds.cascadeCriticalRate ? 'critical' : 'warn',\n message: `Cascade trigger rate is elevated at ${(metrics.cascadeTriggeredRate * 100).toFixed(1)}%`,\n metric: 'cascadeTriggeredRate',\n value: metrics.cascadeTriggeredRate,\n threshold: thresholds.cascadeWarnRate,\n });\n }\n\n if (metrics.totalTraces >= thresholds.minSampleSize && metrics.shadowCheckedRate >= thresholds.shadowWarnRate) {\n anomalies.push({\n type: 'shadow_rate_high',\n severity: metrics.shadowCheckedRate >= thresholds.shadowCriticalRate ? 'critical' : 'warn',\n message: `Shadow supervision rate is elevated at ${(metrics.shadowCheckedRate * 100).toFixed(1)}%`,\n metric: 'shadowCheckedRate',\n value: metrics.shadowCheckedRate,\n threshold: thresholds.shadowWarnRate,\n });\n }\n\n if (metrics.totalTraces >= thresholds.minSampleSize && metrics.averageLatencyMs >= thresholds.latencyWarnMs) {\n anomalies.push({\n type: 'latency_high',\n severity: metrics.averageLatencyMs >= thresholds.latencyCriticalMs ? 'critical' : 'warn',\n message: `Average latency is elevated at ${metrics.averageLatencyMs.toFixed(0)} ms`,\n metric: 'averageLatencyMs',\n value: metrics.averageLatencyMs,\n threshold: thresholds.latencyWarnMs,\n });\n }\n\n if (buckets.length >= 2) {\n const latestBucket = buckets[buckets.length - 1];\n const previousBuckets = buckets.slice(0, -1).filter((bucket) => bucket.metrics.totalTraces > 0);\n if (latestBucket.metrics.totalTraces > 0 && previousBuckets.length > 0) {\n const previousCascadeAverage = averageRate(\n previousBuckets.map((bucket) => bucket.metrics.cascadeTriggeredRate)\n );\n if (latestBucket.metrics.cascadeTriggeredRate >= thresholds.spikeWarnRate &&\n latestBucket.metrics.cascadeTriggeredRate >= previousCascadeAverage + thresholds.spikeDeltaRate) {\n anomalies.push({\n type: 'cascade_spike',\n severity: 'warn',\n message: `Latest bucket cascade rate spiked to ${(latestBucket.metrics.cascadeTriggeredRate * 100).toFixed(1)}%`,\n metric: 'cascadeTriggeredRate',\n value: latestBucket.metrics.cascadeTriggeredRate,\n threshold: previousCascadeAverage,\n });\n }\n\n const previousShadowAverage = averageRate(\n previousBuckets.map((bucket) => bucket.metrics.shadowCheckedRate)\n );\n if (latestBucket.metrics.shadowCheckedRate >= thresholds.spikeWarnRate &&\n latestBucket.metrics.shadowCheckedRate >= previousShadowAverage + thresholds.spikeDeltaRate) {\n anomalies.push({\n type: 'shadow_spike',\n severity: 'warn',\n message: `Latest bucket shadow rate spiked to ${(latestBucket.metrics.shadowCheckedRate * 100).toFixed(1)}%`,\n metric: 'shadowCheckedRate',\n value: latestBucket.metrics.shadowCheckedRate,\n threshold: previousShadowAverage,\n });\n }\n }\n }\n\n return anomalies;\n}\n\nexport function summarizeGovernanceMetrics(traces: IGovernanceTrace[]): IGovernanceMetrics {\n const stickyHitCount = traces.filter((trace) => trace.stickyHit).length;\n const alignmentUsedCount = traces.filter((trace) => trace.alignmentUsed).length;\n const cascadeTriggeredCount = traces.filter((trace) => trace.cascadeTriggered).length;\n const shadowCheckedCount = traces.filter((trace) => trace.shadowChecked).length;\n const latencyValues = traces\n .map((trace) => trace.latencyMs)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n const estimatedCostValues = traces\n .map((trace) => trace.estimatedCost)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n\n const routeReasonDistribution: Record<string, number> = {};\n const finalModelDistribution: Record<string, number> = {};\n const semanticIntentDistribution: Record<string, number> = {};\n\n for (const trace of traces) {\n for (const reason of trace.routeReason) {\n increment(routeReasonDistribution, reason);\n }\n increment(finalModelDistribution, trace.finalModel);\n increment(semanticIntentDistribution, trace.semanticIntent);\n }\n\n return {\n totalTraces: traces.length,\n stickyHitCount,\n stickyHitRate: rate(stickyHitCount, traces.length),\n alignmentUsedCount,\n alignmentUsedRate: rate(alignmentUsedCount, traces.length),\n cascadeTriggeredCount,\n cascadeTriggeredRate: rate(cascadeTriggeredCount, traces.length),\n shadowCheckedCount,\n shadowCheckedRate: rate(shadowCheckedCount, traces.length),\n averageLatencyMs: average(latencyValues),\n averageEstimatedCost: average(estimatedCostValues),\n routeReasonDistribution,\n finalModelDistribution,\n semanticIntentDistribution,\n };\n}\n\nfunction buildBucketLabel(bucketStart: number, bucketEnd: number): string {\n return `${new Date(bucketStart).toISOString()}~${new Date(bucketEnd).toISOString()}`;\n}\n\nfunction filterTracesByWindow(\n traces: IGovernanceTrace[],\n options: IGovernanceMetricsWindowOptions\n): { traces: IGovernanceTrace[]; windowStart?: number; windowEnd?: number } {\n if (!options.windowMs || options.windowMs <= 0) {\n return {\n traces,\n windowStart: traces.length ? Math.min(...traces.map((trace) => trace.startedAt)) : undefined,\n windowEnd: traces.length ? Math.max(...traces.map((trace) => trace.startedAt)) : undefined,\n };\n }\n\n const now = options.now ?? Date.now();\n const windowStart = now - options.windowMs;\n return {\n traces: traces.filter((trace) => trace.startedAt >= windowStart && trace.startedAt <= now),\n windowStart,\n windowEnd: now,\n };\n}\n\nfunction buildBuckets(\n traces: IGovernanceTrace[],\n windowStart: number | undefined,\n windowEnd: number | undefined,\n bucketCount: number\n): IGovernanceMetricsBucket[] {\n if (\n windowStart === undefined ||\n windowEnd === undefined ||\n bucketCount <= 0 ||\n windowEnd <= windowStart\n ) {\n return [];\n }\n\n const bucketSize = Math.max(1, Math.ceil((windowEnd - windowStart) / bucketCount));\n const buckets: IGovernanceMetricsBucket[] = [];\n\n for (let index = 0; index < bucketCount; index += 1) {\n const bucketStart = windowStart + (index * bucketSize);\n const bucketEnd = index === bucketCount - 1\n ? windowEnd\n : Math.min(windowEnd, bucketStart + bucketSize);\n const bucketTraces = traces.filter((trace) => {\n if (index === bucketCount - 1) {\n return trace.startedAt >= bucketStart && trace.startedAt <= bucketEnd;\n }\n return trace.startedAt >= bucketStart && trace.startedAt < bucketEnd;\n });\n\n buckets.push({\n bucketStart,\n bucketEnd,\n label: buildBucketLabel(bucketStart, bucketEnd),\n metrics: summarizeGovernanceMetrics(bucketTraces),\n });\n }\n\n return buckets;\n}\n\nexport function getGovernanceMetricsReport(\n options: IGovernanceMetricsWindowOptions = {}\n): IGovernanceMetricsReport {\n const baseTraces = governanceTraceStore.list({\n requestId: options.requestId,\n sessionKey: options.sessionKey,\n routeReason: options.routeReason,\n cascadeTriggered: options.cascadeTriggered,\n shadowChecked: options.shadowChecked,\n });\n const windowed = filterTracesByWindow(baseTraces, options);\n const limitedTraces = options.limit && options.limit > 0\n ? windowed.traces.slice(0, options.limit)\n : windowed.traces;\n const bucketCount = options.bucketCount && options.bucketCount > 0 ? options.bucketCount : 6;\n const metrics = summarizeGovernanceMetrics(limitedTraces);\n const buckets = buildBuckets(limitedTraces, windowed.windowStart, windowed.windowEnd, bucketCount);\n const thresholds = normalizeAnomalyThresholds(options.anomalyThresholds);\n\n return {\n windowMs: options.windowMs,\n bucketCount,\n windowStart: windowed.windowStart,\n windowEnd: windowed.windowEnd,\n metrics,\n buckets,\n topRouteReasons: buildTopEntries(metrics.routeReasonDistribution, limitedTraces.length),\n topFinalModels: buildTopEntries(metrics.finalModelDistribution, limitedTraces.length),\n topSemanticIntents: buildTopEntries(metrics.semanticIntentDistribution, limitedTraces.length),\n anomalies: buildAnomalies(metrics, buckets, thresholds),\n };\n}\n\nexport function getGovernanceMetrics(\n options: IGovernanceMetricsWindowOptions = {}\n): IGovernanceMetrics {\n return getGovernanceMetricsReport(options).metrics;\n}\n\nexport function exportGovernanceMetricsReport(\n report: IGovernanceMetricsReport,\n format: TGovernanceMetricsExportFormat = 'json'\n): string {\n if (format === 'json') {\n return JSON.stringify(report, null, 2);\n }\n\n const lines: string[] = [\n 'section,key,value',\n `summary,totalTraces,${report.metrics.totalTraces}`,\n `summary,stickyHitRate,${report.metrics.stickyHitRate}`,\n `summary,cascadeTriggeredRate,${report.metrics.cascadeTriggeredRate}`,\n `summary,shadowCheckedRate,${report.metrics.shadowCheckedRate}`,\n `summary,alignmentUsedRate,${report.metrics.alignmentUsedRate}`,\n `summary,averageLatencyMs,${report.metrics.averageLatencyMs}`,\n `summary,averageEstimatedCost,${report.metrics.averageEstimatedCost}`,\n ];\n\n for (const anomaly of report.anomalies) {\n lines.push(`anomaly,${anomaly.type},${anomaly.severity}:${anomaly.value}`);\n }\n\n for (const item of report.topRouteReasons) {\n lines.push(`topRouteReason,${item.key},${item.count}:${item.rate}`);\n }\n\n for (const item of report.topFinalModels) {\n lines.push(`topFinalModel,${item.key},${item.count}:${item.rate}`);\n }\n\n for (const item of report.topSemanticIntents) {\n lines.push(`topSemanticIntent,${item.key},${item.count}:${item.rate}`);\n }\n\n for (const bucket of report.buckets) {\n lines.push(\n `bucket,${bucket.label},${[\n bucket.metrics.totalTraces,\n bucket.metrics.stickyHitRate,\n bucket.metrics.cascadeTriggeredRate,\n bucket.metrics.shadowCheckedRate,\n bucket.metrics.alignmentUsedRate,\n ].join(':')}`\n );\n }\n\n return lines.join('\\n');\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport {\n GOVERNANCE_EXPORT_HISTORY_FILE,\n GOVERNANCE_SCHEDULE_FILE,\n GOVERNANCE_SNAPSHOT_DIR,\n} from '../constants';\nimport {\n exportGovernanceMetricsReport,\n getGovernanceMetricsReport,\n IGovernanceMetricsReport,\n IGovernanceMetricsWindowOptions,\n TGovernanceMetricsExportFormat,\n} from './metrics';\n\nexport interface IGovernanceMetricsExportRecord {\n id: string;\n createdAt: number;\n format: TGovernanceMetricsExportFormat;\n kind: 'manual' | 'scheduled';\n filePath: string;\n windowMs?: number;\n bucketCount: number;\n}\n\nexport interface IGovernanceSnapshotSchedule {\n id: string;\n intervalMs: number;\n format: TGovernanceMetricsExportFormat;\n enabled: boolean;\n createdAt: number;\n lastRunAt?: number;\n options: IGovernanceMetricsWindowOptions;\n}\n\ninterface IGovernanceMetricsExportStoreOptions {\n historyFile?: string;\n snapshotDir?: string;\n scheduleFile?: string;\n persistEnabled?: boolean;\n retainHistory?: number;\n}\n\nexport class GovernanceMetricsExportStore {\n private historyFile: string;\n private snapshotDir: string;\n private scheduleFile: string;\n private persistEnabled: boolean;\n private retainHistory: number;\n private history: IGovernanceMetricsExportRecord[] = [];\n private schedules = new Map<string, { meta: IGovernanceSnapshotSchedule; timer?: NodeJS.Timeout }>();\n\n constructor(options: IGovernanceMetricsExportStoreOptions = {}) {\n this.historyFile = options.historyFile ?? GOVERNANCE_EXPORT_HISTORY_FILE;\n this.snapshotDir = options.snapshotDir ?? GOVERNANCE_SNAPSHOT_DIR;\n this.scheduleFile = options.scheduleFile ?? GOVERNANCE_SCHEDULE_FILE;\n this.persistEnabled = options.persistEnabled ?? process.env.NODE_ENV !== 'test';\n this.retainHistory = options.retainHistory ?? 50;\n this.loadHistory();\n this.loadSchedules();\n }\n\n listHistory(): IGovernanceMetricsExportRecord[] {\n return [...this.history];\n }\n\n listSchedules(): IGovernanceSnapshotSchedule[] {\n return Array.from(this.schedules.values())\n .map((item) => ({ ...item.meta }))\n .sort((left, right) => right.createdAt - left.createdAt);\n }\n\n createSnapshot(\n options: IGovernanceMetricsWindowOptions = {},\n format: TGovernanceMetricsExportFormat = 'json',\n kind: 'manual' | 'scheduled' = 'manual'\n ): { record: IGovernanceMetricsExportRecord; report: IGovernanceMetricsReport; content: string } {\n const report = getGovernanceMetricsReport(options);\n const content = exportGovernanceMetricsReport(report, format);\n const timestamp = Date.now();\n const id = `export-${timestamp}-${Math.random().toString(16).slice(2, 8)}`;\n const filePath = join(this.snapshotDir, `${id}.${format}`);\n\n if (this.persistEnabled) {\n mkdirSync(this.snapshotDir, { recursive: true });\n writeFileSync(filePath, content, 'utf-8');\n }\n\n const record: IGovernanceMetricsExportRecord = {\n id,\n createdAt: timestamp,\n format,\n kind,\n filePath,\n windowMs: options.windowMs,\n bucketCount: report.bucketCount,\n };\n\n this.history = [record, ...this.history].slice(0, this.retainHistory);\n this.persistHistory();\n return { record, report, content };\n }\n\n startSchedule(\n intervalMs: number,\n options: IGovernanceMetricsWindowOptions = {},\n format: TGovernanceMetricsExportFormat = 'json'\n ): IGovernanceSnapshotSchedule {\n const id = `schedule-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`;\n const meta: IGovernanceSnapshotSchedule = {\n id,\n intervalMs,\n format,\n enabled: true,\n createdAt: Date.now(),\n options,\n };\n\n const timer = setInterval(() => {\n const result = this.createSnapshot(options, format, 'scheduled');\n const current = this.schedules.get(id);\n if (current) {\n current.meta.lastRunAt = result.record.createdAt;\n this.persistSchedules();\n }\n }, intervalMs);\n timer.unref?.();\n\n this.schedules.set(id, { meta, timer });\n this.persistSchedules();\n return { ...meta };\n }\n\n stopSchedule(id: string): boolean {\n const current = this.schedules.get(id);\n if (!current) {\n return false;\n }\n\n if (current.timer) {\n clearInterval(current.timer);\n }\n current.meta.enabled = false;\n this.schedules.delete(id);\n this.persistSchedules();\n return true;\n }\n\n clear(): void {\n for (const current of this.schedules.values()) {\n if (current.timer) {\n clearInterval(current.timer);\n }\n }\n this.schedules.clear();\n this.history = [];\n this.persistHistory();\n this.persistSchedules();\n }\n\n private loadHistory(): void {\n if (!this.persistEnabled || !existsSync(this.historyFile)) {\n return;\n }\n\n try {\n this.history = JSON.parse(readFileSync(this.historyFile, 'utf-8')) as IGovernanceMetricsExportRecord[];\n } catch {\n this.history = [];\n }\n }\n\n private persistHistory(): void {\n if (!this.persistEnabled) {\n return;\n }\n\n mkdirSync(dirname(this.historyFile), { recursive: true });\n writeFileSync(this.historyFile, JSON.stringify(this.history, null, 2), 'utf-8');\n }\n\n private loadSchedules(): void {\n if (!this.persistEnabled || !existsSync(this.scheduleFile)) {\n return;\n }\n\n try {\n const schedules = JSON.parse(readFileSync(this.scheduleFile, 'utf-8')) as IGovernanceSnapshotSchedule[];\n for (const schedule of schedules.filter((item) => item.enabled)) {\n this.restoreSchedule(schedule);\n }\n } catch {\n this.schedules.clear();\n }\n }\n\n private persistSchedules(): void {\n if (!this.persistEnabled) {\n return;\n }\n\n mkdirSync(dirname(this.scheduleFile), { recursive: true });\n const schedules = Array.from(this.schedules.values()).map((item) => item.meta);\n writeFileSync(this.scheduleFile, JSON.stringify(schedules, null, 2), 'utf-8');\n }\n\n private restoreSchedule(schedule: IGovernanceSnapshotSchedule): void {\n const timer = setInterval(() => {\n const result = this.createSnapshot(schedule.options, schedule.format, 'scheduled');\n const current = this.schedules.get(schedule.id);\n if (current) {\n current.meta.lastRunAt = result.record.createdAt;\n this.persistSchedules();\n }\n }, schedule.intervalMs);\n timer.unref?.();\n\n this.schedules.set(schedule.id, {\n meta: { ...schedule, enabled: true },\n timer,\n });\n }\n}\n\nexport const governanceMetricsExportStore = new GovernanceMetricsExportStore();\n", "export * from './types';\nexport * from './trace';\nexport * from './session-store';\nexport * from './context-alignment';\nexport * from './cascade-gate';\nexport * from './semantic-router';\nexport * from './shadow-supervisor';\nexport * from './response-governance';\nexport * from './stream-response-governance';\nexport * from './metrics';\nexport * from './metrics-export';\n", "export type ProviderPresetKey =\n | 'openrouter'\n | 'deepseek'\n | 'openai-compatible'\n | 'anthropic'\n | 'siliconflow'\n | 'custom';\n\nexport type ProviderPresetSurface = 'setup' | 'ui';\n\nexport interface IProviderPresetDefinition {\n label: string;\n api?: string;\n api_base_url?: string;\n interface?: 'openai' | 'anthropic';\n protocol?: 'openai' | 'anthropic';\n default_model?: string;\n model_examples?: string[];\n suggested_id?: string;\n key_placeholder?: string;\n vendor_hint?: string;\n default_thinking?: 'off' | 'auto' | 'on' | 'low' | 'medium' | 'high';\n surfaces: ProviderPresetSurface[];\n}\n\nconst PROVIDER_PRESETS: Record<ProviderPresetKey, IProviderPresetDefinition> = {\n openrouter: {\n label: 'OpenRouter',\n api: 'https://openrouter.ai/api/v1/chat/completions',\n api_base_url: 'https://openrouter.ai/api/v1/chat/completions',\n interface: 'openai',\n protocol: 'openai',\n default_model: 'anthropic/claude-sonnet-4',\n model_examples: ['anthropic/claude-sonnet-4', 'openai/gpt-5', 'google/gemini-2.5-pro'],\n suggested_id: 'sonnet',\n key_placeholder: 'sk-or-...',\n vendor_hint: 'openrouter',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n deepseek: {\n label: 'DeepSeek',\n api: 'https://api.deepseek.com/chat/completions',\n api_base_url: 'https://api.deepseek.com/chat/completions',\n interface: 'openai',\n protocol: 'openai',\n default_model: 'deepseek-chat',\n model_examples: ['deepseek-chat', 'deepseek-reasoner'],\n suggested_id: 'deepseek_chat',\n key_placeholder: 'sk-...',\n vendor_hint: 'deepseek',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n 'openai-compatible': {\n label: 'OpenAI-compatible',\n api: 'https://api.openai.com/v1/chat/completions',\n api_base_url: 'https://api.openai.com/v1/chat/completions',\n interface: 'openai',\n protocol: 'openai',\n default_model: 'gpt-5',\n model_examples: ['gpt-5', 'gpt-5-mini', 'gpt-4.1'],\n suggested_id: 'openai_main',\n key_placeholder: 'sk-...',\n vendor_hint: 'openai-compatible',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n anthropic: {\n label: 'Anthropic',\n api: 'https://api.anthropic.com/v1/messages',\n api_base_url: 'https://api.anthropic.com/v1/messages',\n interface: 'anthropic',\n protocol: 'anthropic',\n default_model: 'claude-sonnet-4-5',\n model_examples: ['claude-sonnet-4-5', 'claude-opus-4-1', 'claude-3-5-haiku-latest'],\n suggested_id: 'claude',\n key_placeholder: 'sk-ant-...',\n vendor_hint: 'anthropic',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n siliconflow: {\n label: 'SiliconFlow',\n api: 'https://api.siliconflow.cn/v1/chat/completions',\n api_base_url: 'https://api.siliconflow.cn/v1/chat/completions',\n interface: 'openai',\n protocol: 'openai',\n default_model: 'Qwen/Qwen3-32B',\n model_examples: ['Qwen/Qwen3-32B', 'deepseek-ai/DeepSeek-V3', 'THUDM/GLM-4-9B-Chat'],\n suggested_id: 'siliconflow_main',\n key_placeholder: 'sk-...',\n vendor_hint: 'siliconflow',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n custom: {\n label: 'Custom',\n surfaces: ['setup'],\n },\n};\n\nexport function getProviderPreset(key: ProviderPresetKey): IProviderPresetDefinition | undefined {\n const preset = PROVIDER_PRESETS[key];\n if (!preset) {\n return undefined;\n }\n\n return {\n ...preset,\n model_examples: preset.model_examples ? [...preset.model_examples] : undefined,\n surfaces: [...preset.surfaces],\n };\n}\n\nexport function listProviderPresetKeys(surface: ProviderPresetSurface): ProviderPresetKey[] {\n return (Object.keys(PROVIDER_PRESETS) as ProviderPresetKey[]).filter((key) =>\n PROVIDER_PRESETS[key].surfaces.includes(surface)\n );\n}\n\nexport function getUiProviderTemplates() {\n return listProviderPresetKeys('ui').reduce<Record<string, Partial<IProviderPresetDefinition>>>((result, key) => {\n const preset = PROVIDER_PRESETS[key];\n result[key] = {\n label: preset.label,\n interface: preset.interface,\n api: preset.api,\n default_model: preset.default_model,\n model_examples: preset.model_examples ? [...preset.model_examples] : [],\n suggested_id: preset.suggested_id,\n key_placeholder: preset.key_placeholder,\n vendor_hint: preset.vendor_hint,\n default_thinking: preset.default_thinking,\n };\n return result;\n }, {});\n}\n", "/**\r\n * Server\r\n *\r\n * Fastify \u670D\u52A1\u5668\u914D\u7F6E\r\n */\r\n\r\nimport Server from \"@musistudio/llms\";\nimport { readConfigFile, writeConfigFile, backupConfigFile, normalizeAndValidateConfig } from \"./utils\";\nimport { log } from \"./utils/log\";\nimport { SERVICE_NAME } from \"./service-health\";\nimport {\n governanceTraceStore,\n getGovernanceMetricsReport,\n exportGovernanceMetricsReport,\n governanceMetricsExportStore,\n} from \"./governance\";\nimport { buildModelRegistry, collectCapabilityWarnings } from \"./models/compile\";\nimport { getUiProviderTemplates } from \"./provider-presets\";\n\ntype CompiledProviderView = {\n name: string;\n api_base_url: string;\n models: string[];\n transformer: any;\n has_api_key: boolean;\n};\n\ntype CompiledRegistryView = {\n providers: CompiledProviderView[];\n modelMap: Record<string, any>;\n};\n\ntype ModelReferenceEntry = {\n path: string;\n value: string;\n referenceType: \"modelId\" | \"legacy\";\n};\n\nfunction toCompiledRegistryView(config: any): CompiledRegistryView {\n const registry = buildModelRegistry(config ?? {});\n return {\n providers: registry.providers.map((provider) => ({\n name: provider.name,\n api_base_url: provider.api_base_url,\n models: provider.models,\n transformer: provider.transformer,\n has_api_key: Boolean(provider.api_key),\n })),\n modelMap: registry.modelMap,\n };\n}\n\nfunction toInlineScriptJson(value: unknown): string {\n return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\nfunction collectModelReferences(config: any): ModelReferenceEntry[] {\n const refs: ModelReferenceEntry[] = [];\n const pushRef = (path: string, value: any) => {\n if (typeof value !== \"string\" || !value.trim()) {\n return;\n }\n refs.push({\n path,\n value,\n referenceType: value.includes(\",\") ? \"legacy\" : \"modelId\",\n });\n };\n\n pushRef(\"Router.default\", config?.Router?.default);\n pushRef(\"TriggerRouter.intent_model\", config?.TriggerRouter?.intent_model);\n config?.TriggerRouter?.rules?.forEach((rule: any, index: number) => {\n pushRef(`TriggerRouter.rules[${index}].model`, rule?.model);\n });\n pushRef(\"SmartRouter.router_model\", config?.SmartRouter?.router_model);\n config?.SmartRouter?.candidates?.forEach((candidate: any, index: number) => {\n pushRef(`SmartRouter.candidates[${index}].model`, candidate?.model);\n });\n pushRef(\"Governance.sticky.alignment.summarizer_model\", config?.Governance?.sticky?.alignment?.summarizer_model);\n config?.Governance?.cascade?.levels?.forEach((level: any, index: number) => {\n pushRef(`Governance.cascade.levels[${index}].from`, level?.from);\n pushRef(`Governance.cascade.levels[${index}].to`, level?.to);\n });\n pushRef(\"Governance.semantic.classifier_model\", config?.Governance?.semantic?.classifier_model);\n pushRef(\"Governance.shadow.verifier_model\", config?.Governance?.shadow?.verifier_model);\n\n return refs;\n}\n\nfunction scoreModelIdSuggestion(source: string, candidateId: string, candidate: any) {\n const sourceText = String(source || \"\").toLowerCase();\n const candidateText = `${candidateId} ${candidate?.modelName || \"\"}`.toLowerCase();\n let score = 0;\n\n if (candidateId.toLowerCase() === sourceText) {\n score += 100;\n }\n if (candidateId.toLowerCase().includes(sourceText) || sourceText.includes(candidateId.toLowerCase())) {\n score += 40;\n }\n\n const sourceParts = sourceText.split(/[^a-z0-9]+/).filter(Boolean);\n sourceParts.forEach((part) => {\n if (candidateText.includes(part)) {\n score += Math.min(part.length * 3, 18);\n }\n });\n\n return score;\n}\n\nfunction suggestModelReferences(value: string, nextCompiled: CompiledRegistryView) {\n return Object.entries(nextCompiled.modelMap ?? {})\n .map(([modelId, item]) => ({\n modelId,\n providerName: item.providerName,\n modelName: item.modelName,\n protocol: item.protocol,\n score: scoreModelIdSuggestion(value, modelId, item),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score || a.modelId.localeCompare(b.modelId))\n .slice(0, 3)\n .map(({ score, ...item }) => item);\n}\n\nfunction analyzeModelReferenceImpact(config: any, nextCompiled: CompiledRegistryView) {\n const references = collectModelReferences(config);\n const entries = references.map((ref) => {\n const resolved = ref.referenceType === \"modelId\" ? nextCompiled.modelMap?.[ref.value] : null;\n const suggestions = ref.referenceType === \"modelId\" && !resolved\n ? suggestModelReferences(ref.value, nextCompiled)\n : [];\n return {\n ...ref,\n status: ref.referenceType === \"modelId\"\n ? (resolved ? \"valid\" : \"missing\")\n : \"legacy\",\n resolvedTarget: resolved\n ? {\n providerName: resolved.providerName,\n modelName: resolved.modelName,\n protocol: resolved.protocol,\n }\n : null,\n suggestions,\n };\n });\n\n return {\n entries,\n summary: {\n total: entries.length,\n modelIdRefs: entries.filter((entry) => entry.referenceType === \"modelId\").length,\n legacyRefs: entries.filter((entry) => entry.referenceType === \"legacy\").length,\n validModelIds: entries.filter((entry) => entry.referenceType === \"modelId\" && entry.status === \"valid\").length,\n missingModelIds: entries.filter((entry) => entry.referenceType === \"modelId\" && entry.status === \"missing\").length,\n },\n };\n}\n\nfunction diffCompiledRegistry(base: CompiledRegistryView, next: CompiledRegistryView) {\n const providerNames = Array.from(new Set([\n ...base.providers.map((item) => item.name),\n ...next.providers.map((item) => item.name),\n ])).sort();\n const baseProviders = new Map(base.providers.map((item) => [item.name, item]));\n const nextProviders = new Map(next.providers.map((item) => [item.name, item]));\n const providerChanges = providerNames.flatMap((name) => {\n const before = baseProviders.get(name);\n const after = nextProviders.get(name);\n if (!before && after) {\n return [{ type: \"added\", name, before: null, after, fields: [\"provider\"] }];\n }\n if (before && !after) {\n return [{ type: \"removed\", name, before, after: null, fields: [\"provider\"] }];\n }\n const fields = [\n before?.api_base_url !== after?.api_base_url ? \"api_base_url\" : null,\n JSON.stringify(before?.models ?? []) !== JSON.stringify(after?.models ?? []) ? \"models\" : null,\n JSON.stringify(before?.transformer ?? {}) !== JSON.stringify(after?.transformer ?? {}) ? \"transformer\" : null,\n before?.has_api_key !== after?.has_api_key ? \"has_api_key\" : null,\n ].filter(Boolean);\n return fields.length ? [{ type: \"changed\", name, before, after, fields }] : [];\n });\n\n const modelIds = Array.from(new Set([\n ...Object.keys(base.modelMap ?? {}),\n ...Object.keys(next.modelMap ?? {}),\n ])).sort();\n const modelChanges = modelIds.flatMap((modelId) => {\n const before = base.modelMap?.[modelId];\n const after = next.modelMap?.[modelId];\n if (!before && after) {\n return [{ type: \"added\", modelId, before: null, after, fields: [\"model\"] }];\n }\n if (before && !after) {\n return [{ type: \"removed\", modelId, before, after: null, fields: [\"model\"] }];\n }\n const fields = [\n before?.providerName !== after?.providerName ? \"providerName\" : null,\n before?.modelName !== after?.modelName ? \"modelName\" : null,\n before?.protocol !== after?.protocol ? \"protocol\" : null,\n before?.compatibilityProfile !== after?.compatibilityProfile ? \"compatibilityProfile\" : null,\n before?.dispatchFormat !== after?.dispatchFormat ? \"dispatchFormat\" : null,\n JSON.stringify(before?.thinking ?? {}) !== JSON.stringify(after?.thinking ?? {}) ? \"thinking\" : null,\n JSON.stringify(before?.capabilities ?? {}) !== JSON.stringify(after?.capabilities ?? {}) ? \"capabilities\" : null,\n before?.source !== after?.source ? \"source\" : null,\n ].filter(Boolean);\n return fields.length ? [{ type: \"changed\", modelId, before, after, fields }] : [];\n });\n\n return {\n providerChanges,\n modelChanges,\n summary: {\n addedProviders: providerChanges.filter((item) => item.type === \"added\").length,\n removedProviders: providerChanges.filter((item) => item.type === \"removed\").length,\n changedProviders: providerChanges.filter((item) => item.type === \"changed\").length,\n addedModels: modelChanges.filter((item) => item.type === \"added\").length,\n removedModels: modelChanges.filter((item) => item.type === \"removed\").length,\n changedModels: modelChanges.filter((item) => item.type === \"changed\").length,\n },\n };\n}\n\n/**\n * \u521B\u5EFA\u670D\u52A1\u5668\n */\nexport const createServer = (config: any): Server => {\n const server = new Server(config);\n const configuredThresholds = config.initialConfig?.Governance?.observability?.anomaly_thresholds ?? {};\n\n const readGovernanceMetricsQuery = (query: any) => {\n const limit = query?.limit ? Number(query.limit) : undefined;\n const windowMs = query?.windowMs ? Number(query.windowMs) : undefined;\n const bucketCount = query?.bucketCount ? Number(query.bucketCount) : undefined;\n const now = query?.now ? Number(query.now) : undefined;\n const cascadeTriggered = query?.cascadeTriggered === undefined\n ? undefined\n : String(query.cascadeTriggered).toLowerCase() === 'true';\n const shadowChecked = query?.shadowChecked === undefined\n ? undefined\n : String(query.shadowChecked).toLowerCase() === 'true';\n\n return {\n requestId: query?.requestId,\n sessionKey: query?.sessionKey,\n routeReason: query?.routeReason,\n cascadeTriggered,\n shadowChecked,\n limit: Number.isFinite(limit) ? limit : undefined,\n windowMs: Number.isFinite(windowMs) ? windowMs : undefined,\n bucketCount: Number.isFinite(bucketCount) ? bucketCount : undefined,\n now: Number.isFinite(now) ? now : undefined,\n anomalyThresholds: {\n minSampleSize: query?.minSampleSize ? Number(query.minSampleSize) : configuredThresholds.min_sample_size,\n cascadeWarnRate: query?.cascadeWarnRate ? Number(query.cascadeWarnRate) : configuredThresholds.cascade_warn_rate,\n cascadeCriticalRate: query?.cascadeCriticalRate ? Number(query.cascadeCriticalRate) : configuredThresholds.cascade_critical_rate,\n shadowWarnRate: query?.shadowWarnRate ? Number(query.shadowWarnRate) : configuredThresholds.shadow_warn_rate,\n shadowCriticalRate: query?.shadowCriticalRate ? Number(query.shadowCriticalRate) : configuredThresholds.shadow_critical_rate,\n latencyWarnMs: query?.latencyWarnMs ? Number(query.latencyWarnMs) : configuredThresholds.latency_warn_ms,\n latencyCriticalMs: query?.latencyCriticalMs ? Number(query.latencyCriticalMs) : configuredThresholds.latency_critical_ms,\n spikeWarnRate: query?.spikeWarnRate ? Number(query.spikeWarnRate) : configuredThresholds.spike_warn_rate,\n spikeDeltaRate: query?.spikeDeltaRate ? Number(query.spikeDeltaRate) : configuredThresholds.spike_delta_rate,\n },\n };\n };\n\r\n // \u8BFB\u53D6\u914D\u7F6E API\n server.app.get(\"/api/config\", async (req: any, reply: any) => {\n return await readConfigFile();\n });\n\n server.app.get(\"/api/models/compiled\", async () => {\n const normalizedResult = normalizeAndValidateConfig(config.initialConfig ?? {});\n const normalized = normalizedResult.config;\n const compiled = toCompiledRegistryView(normalized);\n return {\n ...compiled,\n capabilityWarnings: collectCapabilityWarnings(normalized),\n warnings: normalizedResult.warnings,\n };\n });\n\n server.app.post(\"/api/models/compiled/preview\", async (req: any, reply: any) => {\n const rawConfig = req.body ?? {};\n let rawCompiled: CompiledRegistryView | null = null;\n try {\n rawCompiled = toCompiledRegistryView(rawConfig);\n } catch (_error) {\n rawCompiled = null;\n }\n\n const result = normalizeAndValidateConfig(rawConfig);\n if (result.errors.length > 0) {\n reply.code(400);\n return {\n success: false,\n message: \"Invalid configuration preview\",\n errors: result.errors,\n referenceImpact: rawCompiled ? analyzeModelReferenceImpact(rawConfig, rawCompiled) : undefined,\n capabilityWarnings: rawCompiled ? collectCapabilityWarnings(rawConfig) : undefined,\n warnings: result.warnings,\n };\n }\n\n const currentCompiled = toCompiledRegistryView(config.initialConfig ?? {});\n const previewCompiled = toCompiledRegistryView(result.config);\n return {\n success: true,\n providers: previewCompiled.providers,\n modelMap: previewCompiled.modelMap,\n normalizedConfig: result.config,\n diff: diffCompiledRegistry(currentCompiled, previewCompiled),\n referenceImpact: analyzeModelReferenceImpact(result.config, previewCompiled),\n capabilityWarnings: collectCapabilityWarnings(result.config),\n warnings: result.warnings,\n };\n });\n\r\n server.app.get(\"/api/health\", async () => {\n return {\n service: SERVICE_NAME,\n ready: true,\n port: config.initialConfig?.PORT,\n };\n });\n\n server.app.get(\"/api/governance/traces\", async (req: any) => {\n const limit = req.query?.limit ? Number(req.query.limit) : undefined;\n const cascadeTriggered = req.query?.cascadeTriggered === undefined\n ? undefined\n : String(req.query.cascadeTriggered).toLowerCase() === 'true';\n const shadowChecked = req.query?.shadowChecked === undefined\n ? undefined\n : String(req.query.shadowChecked).toLowerCase() === 'true';\n return {\n traces: governanceTraceStore.list({\n requestId: req.query?.requestId,\n sessionKey: req.query?.sessionKey,\n routeReason: req.query?.routeReason,\n cascadeTriggered,\n shadowChecked,\n limit: Number.isFinite(limit) ? limit : undefined,\n }),\n };\n });\n\n server.app.get(\"/api/governance/metrics\", async (req: any) => {\n return {\n ...getGovernanceMetricsReport(readGovernanceMetricsQuery(req.query)),\n };\n });\n\n server.app.get(\"/api/governance/metrics/export\", async (req: any, reply: any) => {\n const format = String(req.query?.format || 'json').toLowerCase() === 'csv' ? 'csv' : 'json';\n const report = getGovernanceMetricsReport(readGovernanceMetricsQuery(req.query));\n const content = exportGovernanceMetricsReport(report, format);\n\n reply.header(\n 'Content-Type',\n format === 'csv' ? 'text/csv; charset=utf-8' : 'application/json; charset=utf-8'\n );\n reply.header(\n 'Content-Disposition',\n `attachment; filename=\"governance-metrics.${format}\"`\n );\n return reply.send(content);\n });\n\n server.app.get(\"/api/governance/metrics/exports\", async () => {\n return {\n exports: governanceMetricsExportStore.listHistory(),\n schedules: governanceMetricsExportStore.listSchedules(),\n };\n });\n\n server.app.post(\"/api/governance/metrics/snapshots\", async (req: any) => {\n const format = String(req.body?.format || 'json').toLowerCase() === 'csv' ? 'csv' : 'json';\n const result = governanceMetricsExportStore.createSnapshot(\n readGovernanceMetricsQuery(req.body ?? {}),\n format,\n 'manual'\n );\n\n return {\n success: true,\n export: result.record,\n };\n });\n\n server.app.post(\"/api/governance/metrics/schedules\", async (req: any, reply: any) => {\n const intervalMs = Number(req.body?.intervalMs);\n if (!Number.isFinite(intervalMs) || intervalMs < 1000) {\n reply.code(400);\n return {\n success: false,\n message: 'intervalMs must be at least 1000 ms',\n };\n }\n\n const format = String(req.body?.format || 'json').toLowerCase() === 'csv' ? 'csv' : 'json';\n const schedule = governanceMetricsExportStore.startSchedule(\n intervalMs,\n readGovernanceMetricsQuery(req.body ?? {}),\n format\n );\n\n return {\n success: true,\n schedule,\n };\n });\n\n server.app.post(\"/api/governance/observability/anomaly-thresholds\", async (req: any, reply: any) => {\n const currentConfig = await readConfigFile();\n const nextConfig = {\n ...currentConfig,\n Governance: {\n ...(currentConfig.Governance ?? { enabled: false }),\n observability: {\n ...(currentConfig.Governance?.observability ?? {}),\n anomaly_thresholds: {\n ...(currentConfig.Governance?.observability?.anomaly_thresholds ?? {}),\n ...(req.body ?? {}),\n },\n },\n },\n };\n\n const result = normalizeAndValidateConfig(nextConfig);\n if (result.errors.length > 0) {\n reply.code(400);\n return {\n success: false,\n message: \"Invalid anomaly threshold configuration\",\n errors: result.errors,\n };\n }\n\n const backupPath = await backupConfigFile();\n if (backupPath) {\n log(`Backed up existing configuration file to ${backupPath}`);\n }\n\n await writeConfigFile(result.config);\n return {\n success: true,\n message: \"Anomaly thresholds saved successfully\",\n anomaly_thresholds: result.config.Governance?.observability?.anomaly_thresholds ?? {},\n };\n });\n\n server.app.get(\"/api/governance/traces/:requestId\", async (req: any, reply: any) => {\n const trace = governanceTraceStore.get(req.params.requestId);\n if (!trace) {\n reply.code(404);\n return {\n success: false,\n message: \"Governance trace not found\",\n };\n }\n\n return trace;\n });\n\n server.app.get(\"/api/governance/archives\", async (req: any) => {\n const limit = req.query?.limit ? Number(req.query.limit) : undefined;\n const page = req.query?.page ? Number(req.query.page) : undefined;\n const pageSize = req.query?.pageSize ? Number(req.query.pageSize) : undefined;\n return {\n archives: governanceTraceStore.listArchives({\n date: req.query?.date,\n limit: Number.isFinite(limit) ? limit : undefined,\n page: Number.isFinite(page) ? page : undefined,\n pageSize: Number.isFinite(pageSize) ? pageSize : undefined,\n }),\n };\n });\n\n server.app.get(\"/api/governance/archives/:file\", async (req: any, reply: any) => {\n const traces = governanceTraceStore.getArchivedTraces(req.params.file);\n if (!traces.length) {\n reply.code(404);\n return {\n success: false,\n message: 'Governance archive not found',\n };\n }\n\n return {\n file: req.params.file,\n traces,\n };\n });\n\n server.app.post(\"/api/governance/archives/:file/delete\", async (req: any, reply: any) => {\n const deleted = governanceTraceStore.deleteArchive(req.params.file);\n if (!deleted) {\n reply.code(404);\n return {\n success: false,\n message: 'Governance archive not found',\n };\n }\n\n return {\n success: true,\n file: req.params.file,\n };\n });\n\r\n // \u83B7\u53D6\u8F6C\u6362\u5668\u5217\u8868\r\n server.app.get(\"/api/transformers\", async () => {\r\n const transformers =\r\n server.app._server!.transformerService.getAllTransformers();\r\n const transformerList = Array.from(transformers.entries()).map(\r\n ([name, transformer]: [string, any]) => ({\r\n name,\r\n endpoint: transformer.endPoint || null,\r\n })\r\n );\r\n return { transformers: transformerList };\r\n });\r\n\r\n // \u4FDD\u5B58\u914D\u7F6E API\r\n server.app.post(\"/api/config\", async (req: any, reply: any) => {\r\n const result = normalizeAndValidateConfig(req.body ?? {});\r\n\r\n if (result.errors.length > 0) {\n reply.code(400);\n return {\n success: false,\n message: \"Invalid configuration\",\n errors: result.errors,\n warnings: result.warnings,\n };\n }\n\r\n // \u5907\u4EFD\u73B0\u6709\u914D\u7F6E\r\n const backupPath = await backupConfigFile();\r\n if (backupPath) {\r\n log(`Backed up existing configuration file to ${backupPath}`);\r\n }\r\n\r\n await writeConfigFile(result.config);\n return { success: true, message: \"Config saved successfully\", warnings: result.warnings };\n });\n\r\n // \u91CD\u542F\u670D\u52A1 API\r\n server.app.post(\"/api/restart\", async (req: any, reply: any) => {\r\n reply.send({ success: true, message: \"Service restart initiated\" });\r\n\r\n // \u5EF6\u8FDF\u91CD\u542F\u4EE5\u5141\u8BB8\u54CD\u5E94\u53D1\u9001\r\n // \u4F7F\u7528 __dirname \u5B9A\u4F4D\u5DF2\u7F16\u8BD1\u7684 cli.js\uFF08\u4E0E server.js \u5728\u540C\u4E00\u76EE\u5F55\uFF09\r\n // \u8C03\u7528 start \u800C\u975E restart\uFF0C\u907F\u514D\u9012\u5F52\u7684 stop\u2192start \u5FAA\u73AF\r\n setTimeout(() => {\r\n const { spawn } = require(\"child_process\");\r\n const { join } = require(\"path\");\r\n const cliPath = join(__dirname, \"cli.js\");\r\n\r\n // \u4FDD\u6301\u5F53\u524D\u8FD0\u884C\u7AEF\u53E3\uFF0C\u907F\u514D\u91CD\u542F\u540E\u7AEF\u53E3\u53D8\u56DE\u914D\u7F6E\u6587\u4EF6\u9ED8\u8BA4\u503C\r\n const currentPort = config.initialConfig?.PORT;\r\n const restartArgs = [cliPath, \"start\", \"--daemon\"];\r\n if (currentPort) {\r\n restartArgs.push(\"--port\", String(currentPort));\r\n }\r\n\r\n spawn(process.execPath, restartArgs, {\r\n detached: true,\r\n stdio: \"ignore\",\r\n }).unref();\r\n\r\n // \u7B49\u5F85\u65B0\u8FDB\u7A0B\u542F\u52A8\u540E\u518D\u9000\u51FA\u5F53\u524D\u8FDB\u7A0B\r\n setTimeout(() => process.exit(0), 500);\r\n }, 500);\r\n });\r\n\r\n // Web UI \u5165\u53E3\uFF08\u7B80\u6613 governance trace \u8C03\u8BD5\u9875\uFF09\n server.app.get(\"/ui\", async (_: any, reply: any) => {\n reply.header(\"Content-Type\", \"text/html; charset=utf-8\");\n return reply.send(\n `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>Claude Trigger Router</title>` +\n `<style>` +\n `body{font-family:ui-sans-serif,system-ui,sans-serif;padding:2rem;max-width:1100px;margin:0 auto;background:#f7f7f5;color:#1f2328}` +\n `.panel{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:1rem 1.25rem;margin-bottom:1rem}` +\n `.muted{color:#6b7280}` +\n `.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:.75rem;margin-top:1rem}` +\n `.stat{background:#f8fafc;border:1px solid #e5e7eb;border-radius:12px;padding:.85rem}` +\n `.stat strong{display:block;font-size:1.1rem;margin-top:.25rem}` +\n `.subpanel{margin-top:1rem;padding-top:1rem;border-top:1px solid #e5e7eb}` +\n `.bucket-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem;margin-top:.75rem}` +\n `.detail-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:1rem;margin-top:1rem}` +\n `.mini-list{list-style:none;padding:0;margin:.75rem 0 0}` +\n `.mini-list li{display:flex;justify-content:space-between;gap:1rem;padding:.45rem 0;border-bottom:1px dashed #e5e7eb}` +\n `.mini-list li:last-child{border-bottom:none}` +\n `.action-row{display:flex;gap:.75rem;flex-wrap:wrap;align-items:center;margin-top:.75rem}` +\n `.management-table{width:100%;margin-top:.75rem}` +\n `.management-table th,.management-table td{padding:.5rem;border-bottom:1px solid #e5e7eb;font-size:.92rem;vertical-align:top}` +\n `.alert-list{display:grid;gap:.75rem;margin-top:1rem}` +\n `.alert{border-radius:12px;padding:.85rem 1rem;border:1px solid}` +\n `.alert.warn{background:#fff7ed;border-color:#fdba74;color:#9a3412}` +\n `.alert.critical{background:#fef2f2;border-color:#fca5a5;color:#991b1b}` +\n `.alert.info{background:#eff6ff;border-color:#93c5fd;color:#1d4ed8}` +\n `.diff-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:.75rem;margin-top:.75rem}` +\n `.diff-chip{background:#f8fafc;border:1px solid #e5e7eb;border-radius:12px;padding:.75rem}` +\n `.diff-chip strong{display:block;font-size:1rem;margin-top:.2rem}` +\n `.models-form-grid{display:grid;gap:.75rem;margin-top:.75rem}` +\n `.model-card{border:1px solid #e5e7eb;border-radius:12px;padding:1rem;background:#fcfcfd}` +\n `.model-card-header{display:flex;justify-content:space-between;gap:1rem;align-items:center;margin-bottom:.75rem}` +\n `.model-card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}` +\n `.model-card-grid textarea{min-height:84px;resize:vertical}` +\n `.list-editor{display:grid;gap:.75rem;margin-top:.75rem}` +\n `.list-item{border:1px solid #e5e7eb;border-radius:12px;padding:.85rem;background:#fcfcfd}` +\n `.list-item-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}` +\n `.jump-highlight{outline:3px solid #f59e0b;box-shadow:0 0 0 6px rgba(245,158,11,.15);transition:box-shadow .25s ease,outline-color .25s ease}` +\n `.control-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:.75rem;margin-top:1rem}` +\n `.control-grid label{display:block;font-size:.85rem;color:#6b7280;margin-bottom:.35rem}` +\n `.trend-table{width:100%;margin-top:.75rem}` +\n `.trend-table th,.trend-table td{padding:.45rem;border-bottom:1px solid #e5e7eb;font-size:.92rem}` +\n `.row{display:flex;gap:1rem;flex-wrap:wrap;align-items:center}` +\n `input,select,button{font:inherit;padding:.55rem .75rem;border-radius:8px;border:1px solid #d1d5db}` +\n `button{background:#111827;color:#fff;border-color:#111827;cursor:pointer}` +\n `table{width:100%;border-collapse:collapse;margin-top:1rem}` +\n `th,td{text-align:left;padding:.65rem .5rem;border-bottom:1px solid #e5e7eb;vertical-align:top}` +\n `code,pre{font-family:ui-monospace,SFMono-Regular,monospace}` +\n `pre{white-space:pre-wrap;background:#0f172a;color:#e2e8f0;padding:1rem;border-radius:12px;overflow:auto}` +\n `.pill{display:inline-block;padding:.2rem .5rem;border-radius:999px;background:#eef2ff;color:#3730a3;font-size:.8rem}` +\n `</style></head>` +\n `<body>` +\n `<h2>Claude Trigger Router</h2>` +\n `<p class=\"muted\">\u7B80\u6613 Governance Trace \u8C03\u8BD5\u9875\u3002\u53EF\u67E5\u770B\u6700\u8FD1\u6CBB\u7406\u94FE\u8DEF\uFF0C\u6309 requestId / sessionKey / routeReason \u8FC7\u6EE4\uFF0C\u5E76\u6309 cascade / shadow \u72B6\u6001\u7B5B\u9009\uFF1B\u6CBB\u7406 trace \u73B0\u5DF2\u652F\u6301\u672C\u5730\u6301\u4E45\u5316\uFF0C\u91CD\u542F\u540E\u53EF\u7EE7\u7EED\u67E5\u770B\u8FD1\u671F\u7A97\u53E3\u3002</p>` +\n `<div class=\"panel\">` +\n `<div class=\"row\">` +\n `<input id=\"requestId\" placeholder=\"requestId\">` +\n `<input id=\"sessionKey\" placeholder=\"sessionKey\">` +\n `<input id=\"routeReason\" placeholder=\"routeReason\">` +\n `<select id=\"cascadeTriggered\"><option value=\"\">cascadeTriggered</option><option value=\"true\">cascade=true</option><option value=\"false\">cascade=false</option></select>` +\n `<select id=\"shadowChecked\"><option value=\"\">shadowChecked</option><option value=\"true\">shadow=true</option><option value=\"false\">shadow=false</option></select>` +\n `<select id=\"windowMs\">` +\n `<option value=\"900000\">15m window</option>` +\n `<option value=\"3600000\" selected>1h window</option>` +\n `<option value=\"21600000\">6h window</option>` +\n `<option value=\"86400000\">24h window</option>` +\n `</select>` +\n `<input id=\"limit\" placeholder=\"limit\" value=\"20\">` +\n `<button id=\"refreshBtn\">\u5237\u65B0</button>` +\n `</div>` +\n `<div class=\"muted\" style=\"margin-top:.75rem\">\u6570\u636E\u6E90\uFF1A<code>/api/models/compiled</code>\u3001<code>/api/models/compiled/preview</code>\u3001<code>/api/governance/traces</code>\u3001<code>/api/governance/traces/:requestId</code>\u3001<code>/api/governance/archives</code>\u3001<code>/api/governance/metrics</code>\u3001<code>/api/governance/metrics/export</code>\u3001<code>/api/governance/metrics/exports</code></div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Draft Config Preview</strong><span class=\"muted\">\u7F16\u8F91\u5F53\u524D\u914D\u7F6E\u8349\u7A3F\u5E76\u5373\u65F6\u9884\u89C8 compiled models \u7ED3\u679C\uFF0C\u4E0D\u843D\u76D8</span></div>` +\n `<div class=\"action-row\">` +\n `<button id=\"loadConfigDraftBtn\" type=\"button\">\u8F7D\u5165\u5F53\u524D\u914D\u7F6E</button>` +\n `<button id=\"addModelDraftBtn\" type=\"button\">\u65B0\u589E Model</button>` +\n `<button id=\"applyBalancedPresetBtn\" type=\"button\">\u5E94\u7528\u5E73\u8861\u9884\u8BBE</button>` +\n `<button id=\"previewBalancedPresetBtn\" type=\"button\">\u9884\u89C8\u5E73\u8861\u9884\u8BBE</button>` +\n `<button id=\"applyFastPresetBtn\" type=\"button\">\u5E94\u7528\u5FEB\u901F\u9884\u8BBE</button>` +\n `<button id=\"previewFastPresetBtn\" type=\"button\">\u9884\u89C8\u5FEB\u901F\u9884\u8BBE</button>` +\n `<button id=\"applyGovernancePresetBtn\" type=\"button\">\u5E94\u7528\u6CBB\u7406\u9884\u8BBE</button>` +\n `<button id=\"previewGovernancePresetBtn\" type=\"button\">\u9884\u89C8\u6CBB\u7406\u9884\u8BBE</button>` +\n `<button id=\"syncDraftJsonBtn\" type=\"button\">\u540C\u6B65 JSON \u8349\u7A3F</button>` +\n `<button id=\"previewConfigDraftBtn\" type=\"button\">\u9884\u89C8 compiled models</button>` +\n `<button id=\"saveConfigDraftBtn\" type=\"button\">\u4FDD\u5B58\u914D\u7F6E</button>` +\n `<span id=\"draftPreviewStatus\" class=\"muted\">\u5C1A\u672A\u9884\u89C8\u914D\u7F6E\u8349\u7A3F</span>` +\n `</div>` +\n `<div class=\"control-grid\">` +\n `<div><label>Preset mode</label><select id=\"draftPresetMode\"><option value=\"merge\" selected>append / merge</option><option value=\"replace\">overwrite</option></select></div>` +\n `<div><label>Mode guide</label><div id=\"draftPresetModeHint\" class=\"muted\">append / merge \u4F1A\u5C3D\u91CF\u4FDD\u7559\u5F53\u524D\u8349\u7A3F\uFF0C\u4EC5\u8865\u5145\u9884\u8BBE\u76F8\u5173\u5B57\u6BB5</div></div>` +\n `</div>` +\n `<div id=\"draftPresetList\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>Preset guide</strong><div class=\"muted\">\u9009\u62E9\u9884\u8BBE\u524D\u53EF\u5148\u67E5\u770B\u5176\u4F1A\u8986\u76D6\u7684\u533A\u57DF\u4E0E\u63A8\u8350\u7528\u9014</div></div>` +\n `</div>` +\n `<div id=\"draftPreviewMeta\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>Draft preview mode</strong><div class=\"muted\">\u5F53\u524D\u663E\u793A\u4E3A\u8349\u7A3F\u7F16\u8F91\u89C6\u56FE\uFF0C\u9884\u8BBE dry-run \u4F1A\u5728\u8FD9\u91CC\u63D0\u793A\u5F71\u54CD\u8303\u56F4\u3002</div></div>` +\n `</div>` +\n `<div id=\"draftSummaryGrid\" class=\"stats\">` +\n `<div class=\"stat\"><span class=\"muted\">Models</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Trigger rules</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Patterns</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Smart candidates</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Cascade levels</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Model refs</span><strong>0</strong></div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Validation Summary</strong><span class=\"muted\">\u96C6\u4E2D\u663E\u793A\u5F53\u524D\u8349\u7A3F\u7684\u9519\u8BEF\u4E0E warning\uFF0C\u5E76\u533A\u5206\u4FEE\u590D\u4F18\u5148\u7EA7</span></div>` +\n `<div id=\"draftValidationList\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>No validation issues</strong><div class=\"muted\">\u9884\u89C8\u524D\u4F1A\u5728\u8FD9\u91CC\u6C47\u603B\u8349\u7A3F\u95EE\u9898</div></div>` +\n `</div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Capability Warnings</strong><span class=\"muted\">\u663E\u793A\u6A21\u578B capability hint \u53EF\u80FD\u5E26\u6765\u7684\u8FD0\u884C\u65F6\u964D\u7EA7\u884C\u4E3A</span></div>` +\n `<div id=\"capabilityWarningsList\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>No capability warnings</strong><div class=\"muted\">\u9884\u89C8\u6216\u52A0\u8F7D compiled models \u540E\u4F1A\u5728\u8FD9\u91CC\u663E\u793A\u80FD\u529B\u964D\u7EA7\u63D0\u793A</div></div>` +\n `</div>` +\n `</div>` +\n `<div class=\"control-grid\">` +\n `<div><label>Router default (modelId)</label><input id=\"draftRouterDefault\" placeholder=\"\u4F8B\u5982 sonnet\"></div>` +\n `<div><label>Models count</label><input id=\"draftModelsCount\" value=\"0\" readonly></div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Routing Controls</strong><span class=\"muted\">\u9996\u6279\u8868\u5355\u5316\u7F16\u8F91 TriggerRouter / SmartRouter / Governance \u7684\u6838\u5FC3\u5F15\u7528</span></div>` +\n `<div class=\"detail-grid\">` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>TriggerRouter</strong><span class=\"muted\">\u89C4\u5219\u8DEF\u7531\u4E0E\u610F\u56FE\u8BC6\u522B</span></div>` +\n `<div class=\"control-grid\">` +\n `<div><label><input id=\"triggerEnabled\" type=\"checkbox\"> Enabled</label></div>` +\n `<div><label><input id=\"triggerIntentEnabled\" type=\"checkbox\"> Intent recognition</label></div>` +\n `<div><label>Analysis scope</label><select id=\"triggerAnalysisScope\"><option value=\"last_message\">last_message</option><option value=\"full_context\">full_context</option></select></div>` +\n `<div><label>Intent model</label><input id=\"triggerIntentModel\" list=\"topLevelTriggerIntentSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelTriggerIntentSuggestions\"></datalist></div>` +\n `</div>` +\n `<div style=\"margin-top:.75rem\"><div class=\"action-row\"><label>Rules</label><button id=\"addTriggerRuleBtn\" type=\"button\">\u65B0\u589E Rule</button></div><div id=\"triggerRulesList\" class=\"list-editor\"><div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No trigger rules yet</span></div></div></div>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>SmartRouter</strong><span class=\"muted\">\u667A\u80FD\u5019\u9009\u9009\u62E9</span></div>` +\n `<div class=\"control-grid\">` +\n `<div><label><input id=\"smartEnabled\" type=\"checkbox\"> Enabled</label></div>` +\n `<div><label>Router model</label><input id=\"smartRouterModel\" list=\"topLevelSmartRouterSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelSmartRouterSuggestions\"></datalist></div>` +\n `<div><label>Fallback</label><select id=\"smartFallback\"><option value=\"default\">default</option><option value=\"skip\">skip</option></select></div>` +\n `<div><label>Cache TTL</label><input id=\"smartCacheTtl\" placeholder=\"600000\"></div>` +\n `<div><label>Max tokens</label><input id=\"smartMaxTokens\" placeholder=\"256\"></div>` +\n `</div>` +\n `<div style=\"margin-top:.75rem\"><div class=\"action-row\"><label>Candidates</label><button id=\"addSmartCandidateBtn\" type=\"button\">\u65B0\u589E Candidate</button></div><div id=\"smartCandidatesList\" class=\"list-editor\"><div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No smart candidates yet</span></div></div></div>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Governance</strong><span class=\"muted\">\u5BF9\u9F50\u3001\u8BED\u4E49\u3001\u5F71\u5B50\u6821\u9A8C\u4E0E\u7EA7\u8054</span></div>` +\n `<div class=\"control-grid\">` +\n `<div><label><input id=\"governanceEnabled\" type=\"checkbox\"> Enabled</label></div>` +\n `<div><label><input id=\"governanceAlignmentEnabled\" type=\"checkbox\"> Alignment</label></div>` +\n `<div><label>Summarizer model</label><input id=\"governanceSummarizerModel\" list=\"topLevelGovernanceSummarizerSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelGovernanceSummarizerSuggestions\"></datalist></div>` +\n `<div><label><input id=\"governanceSemanticEnabled\" type=\"checkbox\"> Semantic</label></div>` +\n `<div><label>Classifier model</label><input id=\"governanceClassifierModel\" list=\"topLevelGovernanceClassifierSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelGovernanceClassifierSuggestions\"></datalist></div>` +\n `<div><label><input id=\"governanceShadowEnabled\" type=\"checkbox\"> Shadow</label></div>` +\n `<div><label>Verifier model</label><input id=\"governanceVerifierModel\" list=\"topLevelGovernanceVerifierSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelGovernanceVerifierSuggestions\"></datalist></div>` +\n `</div>` +\n `<div style=\"margin-top:.75rem\"><div class=\"action-row\"><label>Cascade levels</label><button id=\"addCascadeLevelBtn\" type=\"button\">\u65B0\u589E Level</button></div><div id=\"governanceCascadeLevelsList\" class=\"list-editor\"><div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No cascade levels yet</span></div></div></div>` +\n `</div>` +\n `</div>` +\n `</div>` +\n `<div id=\"modelsFormGrid\" class=\"models-form-grid\">` +\n `<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No draft models loaded yet</span></div>` +\n `</div>` +\n `<textarea id=\"configDraftEditor\" style=\"width:100%;min-height:240px;margin-top:.75rem;padding:.75rem;border-radius:12px;border:1px solid #d1d5db;font:12px/1.5 ui-monospace,SFMono-Regular,monospace\" spellcheck=\"false\" placeholder='{\"Models\":[{\"id\":\"sonnet\",\"api\":\"https://...\",\"key\":\"sk-...\",\"interface\":\"openai\",\"model\":\"anthropic/claude-sonnet-4\"}]}'></textarea>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Preview Diff</strong><span class=\"muted\">\u5BF9\u6BD4\u5F53\u524D\u8FD0\u884C\u914D\u7F6E\u4E0E\u8349\u7A3F\u914D\u7F6E\u7684 compiled model \u53D8\u5316</span></div>` +\n `<div id=\"compiledDiffSummary\" class=\"diff-summary\">` +\n `<div class=\"diff-chip\"><span class=\"muted\">Added providers</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Removed providers</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Changed providers</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Added models</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Removed models</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Changed models</span><strong>0</strong></div>` +\n `</div>` +\n `<table id=\"compiledDiffTable\" class=\"management-table\">` +\n `<thead><tr><th>Scope</th><th>Type</th><th>Key</th><th>Changed fields</th><th>Target</th></tr></thead>` +\n `<tbody><tr><td colspan=\"5\" class=\"muted\">Preview a draft to inspect compiled registry changes</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Reference Impact</strong><span class=\"muted\">\u5206\u6790 Router / TriggerRouter / Governance \u7B49 modelId \u5F15\u7528\u662F\u5426\u4ECD\u7136\u6709\u6548</span></div>` +\n `<div id=\"referenceImpactSummary\" class=\"diff-summary\">` +\n `<div class=\"diff-chip\"><span class=\"muted\">Total refs</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">modelId refs</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Legacy refs</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Valid modelIds</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Missing modelIds</span><strong>0</strong></div>` +\n `</div>` +\n `<table id=\"referenceImpactTable\" class=\"management-table\">` +\n `<thead><tr><th>Path</th><th>Ref</th><th>Type</th><th>Status</th><th>Resolved target</th><th>Suggestions</th></tr></thead>` +\n `<tbody><tr><td colspan=\"6\" class=\"muted\">Preview a draft to inspect model reference impact</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Compiled Models</strong><span class=\"muted\">\u67E5\u770B Models \u7F16\u8BD1\u540E\u7684 provider \u4E0E\u8DEF\u7531\u6620\u5C04</span></div>` +\n `<div id=\"compiledModelsStatus\" class=\"muted\" style=\"margin-top:.75rem\">\u52A0\u8F7D compiled models \u4E2D...</div>` +\n `<div class=\"detail-grid\">` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Compiled providers</strong><span class=\"muted\">\u5185\u90E8 provider\u3001\u6A21\u578B\u5217\u8868\u4E0E transformer</span></div>` +\n `<table id=\"compiledProvidersTable\" class=\"management-table\">` +\n `<thead><tr><th>Provider</th><th>Interface</th><th>Models</th><th>Transformer</th><th>API key</th></tr></thead>` +\n `<tbody><tr><td colspan=\"5\" class=\"muted\">Loading compiled providers...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Model map</strong><span class=\"muted\">modelId \u5230\u5185\u90E8 provider/model\u3001thinking \u4E0E capability \u914D\u7F6E</span></div>` +\n `<table id=\"compiledModelMapTable\" class=\"management-table\">` +\n `<thead><tr><th>Model ID</th><th>Internal target</th><th>Protocol</th><th>Compatibility profile</th><th>Dispatch format</th><th>Thinking</th><th>Capabilities</th><th>Source</th></tr></thead>` +\n `<tbody><tr><td colspan=\"8\" class=\"muted\">Loading model map...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `</div>` +\n `</div>` +\n `<div id=\"metricsGrid\" class=\"stats\">` +\n `<div class=\"stat\"><span class=\"muted\">Recent traces</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Sticky hit rate</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Cascade rate</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Shadow rate</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Alignment rate</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Avg latency</span><strong>-</strong></div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Anomaly alerts</strong><span class=\"muted\">\u68C0\u6D4B\u8FD1\u671F\u6CBB\u7406\u5F02\u5E38\u4E0E\u7A81\u589E</span></div>` +\n `<div id=\"anomalyList\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>No alerts yet</strong><div class=\"muted\">\u7B49\u5F85\u6CBB\u7406\u6307\u6807\u52A0\u8F7D</div></div>` +\n `</div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Anomaly tuning</strong><span class=\"muted\">\u6765\u81EA\u914D\u7F6E\u6587\u4EF6\uFF0C\u53EF\u5728\u6B64\u4E34\u65F6\u8986\u76D6\u5F53\u524D\u9875\u9762\u67E5\u8BE2</span></div>` +\n `<div class=\"control-grid\">` +\n `<div><label>Min sample</label><input id=\"minSampleSize\" value=\"${configuredThresholds.min_sample_size ?? 3}\"></div>` +\n `<div><label>Cascade warn</label><input id=\"cascadeWarnRate\" value=\"${configuredThresholds.cascade_warn_rate ?? 0.4}\"></div>` +\n `<div><label>Shadow warn</label><input id=\"shadowWarnRate\" value=\"${configuredThresholds.shadow_warn_rate ?? 0.5}\"></div>` +\n `<div><label>Latency warn ms</label><input id=\"latencyWarnMs\" value=\"${configuredThresholds.latency_warn_ms ?? 1500}\"></div>` +\n `</div>` +\n `<div class=\"row\" style=\"margin-top:.75rem\">` +\n `<button id=\"saveThresholdsBtn\" type=\"button\">\u4FDD\u5B58\u9608\u503C\u5230\u914D\u7F6E</button>` +\n `<span id=\"saveThresholdsStatus\" class=\"muted\">\u5F53\u524D\u4EC5\u4F5C\u4E3A\u9875\u9762\u67E5\u8BE2\u53C2\u6570\uFF1B\u70B9\u51FB\u53EF\u5199\u56DE\u914D\u7F6E\u6587\u4EF6</span>` +\n `</div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Window buckets</strong><span id=\"bucketHint\" class=\"muted\">\u6309\u65F6\u95F4\u7A97\u67E5\u770B\u8FD1\u671F\u6CBB\u7406\u8D8B\u52BF</span></div>` +\n `<div id=\"bucketGrid\" class=\"bucket-grid\">` +\n `<div class=\"stat\"><span class=\"muted\">Loading buckets</span><strong>-</strong></div>` +\n `</div>` +\n `</div>` +\n `<div class=\"detail-grid\">` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Route ranking</strong><span class=\"muted\">\u8FD1\u671F\u547D\u4E2D\u539F\u56E0 Top 5</span></div>` +\n `<ul id=\"routeRanking\" class=\"mini-list\"><li><span class=\"muted\">Loading</span><strong>-</strong></li></ul>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Model ranking</strong><span class=\"muted\">\u8FD1\u671F\u6700\u7EC8\u6A21\u578B Top 5</span></div>` +\n `<ul id=\"modelRanking\" class=\"mini-list\"><li><span class=\"muted\">Loading</span><strong>-</strong></li></ul>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Intent ranking</strong><span class=\"muted\">\u8FD1\u671F\u8BED\u4E49\u610F\u56FE Top 5</span></div>` +\n `<ul id=\"intentRanking\" class=\"mini-list\"><li><span class=\"muted\">Loading</span><strong>-</strong></li></ul>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Trend detail</strong><span class=\"muted\">\u6BCF\u4E2A bucket \u7684\u8BE6\u7EC6\u547D\u4E2D\u7387</span></div>` +\n `<table id=\"trendTable\" class=\"trend-table\">` +\n `<thead><tr><th>Bucket</th><th>Traces</th><th>Sticky</th><th>Cascade</th><th>Shadow</th><th>Alignment</th></tr></thead>` +\n `<tbody><tr><td colspan=\"6\" class=\"muted\">Loading...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `</div>` +\n `<table id=\"traceTable\">` +\n `<thead><tr><th>Request</th><th>Session</th><th>Final Model</th><th>Reasons</th><th>Latency</th><th>Inspect</th></tr></thead>` +\n `<tbody><tr><td colspan=\"6\" class=\"muted\">\u52A0\u8F7D\u4E2D...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"panel\">` +\n `<div class=\"row\"><strong>Trace Detail</strong><span id=\"detailHint\" class=\"muted\">\u70B9\u51FB\u4E0A\u8868\u4E2D\u7684 View \u67E5\u770B\u8BE6\u60C5</span></div>` +\n `<pre id=\"traceDetail\">{}</pre>` +\n `</div>` +\n `<div class=\"panel\">` +\n `<div class=\"row\"><strong>Snapshot Management</strong><span class=\"muted\">\u67E5\u770B\u5BFC\u51FA\u5386\u53F2\u3001\u5B9A\u65F6\u4EFB\u52A1\uFF0C\u5E76\u624B\u52A8\u521B\u5EFA\u5FEB\u7167</span></div>` +\n `<div class=\"action-row\">` +\n `<select id=\"snapshotFormat\"><option value=\"json\">snapshot json</option><option value=\"csv\">snapshot csv</option></select>` +\n `<button id=\"createSnapshotBtn\" type=\"button\">\u751F\u6210\u5FEB\u7167</button>` +\n `<span id=\"snapshotStatus\" class=\"muted\">\u5C1A\u672A\u521B\u5EFA\u5FEB\u7167</span>` +\n `</div>` +\n `<table id=\"exportTable\" class=\"management-table\">` +\n `<thead><tr><th>Export</th><th>Kind</th><th>Format</th><th>Created</th></tr></thead>` +\n `<tbody><tr><td colspan=\"4\" class=\"muted\">Loading exports...</td></tr></tbody>` +\n `</table>` +\n `<table id=\"scheduleTable\" class=\"management-table\">` +\n `<thead><tr><th>Schedule</th><th>Interval</th><th>Format</th><th>Last run</th></tr></thead>` +\n `<tbody><tr><td colspan=\"4\" class=\"muted\">Loading schedules...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"panel\">` +\n `<div class=\"row\"><strong>Archive Management</strong><span class=\"muted\">\u6D4F\u89C8\u538B\u7F29\u5F52\u6863\u5E76\u67E5\u770B\u5206\u9875\u7ED3\u679C</span></div>` +\n `<div class=\"action-row\">` +\n `<input id=\"archiveDate\" placeholder=\"YYYY-MM-DD\">` +\n `<input id=\"archivePage\" placeholder=\"page\" value=\"1\">` +\n `<input id=\"archivePageSize\" placeholder=\"pageSize\" value=\"5\">` +\n `<button id=\"loadArchivesBtn\" type=\"button\">\u52A0\u8F7D\u5F52\u6863</button>` +\n `<span id=\"archiveStatus\" class=\"muted\">\u5C1A\u672A\u52A0\u8F7D\u5F52\u6863</span>` +\n `</div>` +\n `<table id=\"archiveTable\" class=\"management-table\">` +\n `<thead><tr><th>Archive</th><th>Range</th><th>Count</th><th>Compressed</th></tr></thead>` +\n `<tbody><tr><td colspan=\"4\" class=\"muted\">Loading archives...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"panel\">` +\n `<p>\u5176\u4ED6\u7BA1\u7406 API\uFF1A</p>` +\n `<ul>` +\n `<li><code>GET /api/config</code> \u2014 \u8BFB\u53D6\u5F53\u524D\u914D\u7F6E</li>` +\n `<li><code>GET /api/models/compiled</code> \u2014 \u67E5\u770B Models \u7F16\u8BD1\u540E\u7684\u5185\u90E8 provider / model \u6620\u5C04</li>` +\n `<li><code>POST /api/models/compiled/preview</code> \u2014 \u7528\u914D\u7F6E\u8349\u7A3F\u9884\u89C8 compiled models \u7ED3\u679C\uFF0C\u4E0D\u5199\u56DE\u6587\u4EF6</li>` +\n `<li><code>POST /api/config</code> \u2014 \u4FDD\u5B58\u914D\u7F6E</li>` +\n `<li><code>GET /api/transformers</code> \u2014 \u67E5\u770B\u5DF2\u52A0\u8F7D transformer</li>` +\n `<li><code>POST /api/restart</code> \u2014 \u91CD\u542F\u670D\u52A1</li>` +\n `<li><code>GET /api/governance/archives</code> \u2014 \u67E5\u770B\u6CBB\u7406\u5F52\u6863\u5217\u8868</li>` +\n `<li><code>GET /api/governance/archives/:file</code> \u2014 \u67E5\u770B\u5F52\u6863\u5185 traces</li>` +\n `<li><code>POST /api/governance/archives/:file/delete</code> \u2014 \u5220\u9664\u6307\u5B9A\u5F52\u6863</li>` +\n `<li><code>POST /api/governance/metrics/snapshots</code> \u2014 \u751F\u6210\u4E00\u6B21\u6CBB\u7406\u6307\u6807\u5FEB\u7167</li>` +\n `<li><code>POST /api/governance/metrics/schedules</code> \u2014 \u6CE8\u518C\u5B9A\u65F6\u5FEB\u7167\u4EFB\u52A1</li>` +\n `</ul>` +\n `</div>` +\n `<script>` +\n `const tbody=document.querySelector('#traceTable tbody');` +\n `const detail=document.getElementById('traceDetail');` +\n `const detailHint=document.getElementById('detailHint');` +\n `const draftPreviewStatus=document.getElementById('draftPreviewStatus');` +\n `const draftPresetMode=document.getElementById('draftPresetMode');` +\n `const draftPresetModeHint=document.getElementById('draftPresetModeHint');` +\n `const draftPresetList=document.getElementById('draftPresetList');` +\n `const draftPreviewMeta=document.getElementById('draftPreviewMeta');` +\n `const draftValidationList=document.getElementById('draftValidationList');` +\n `const capabilityWarningsList=document.getElementById('capabilityWarningsList');` +\n `const configDraftEditor=document.getElementById('configDraftEditor');` +\n `const draftSummaryGrid=document.getElementById('draftSummaryGrid');` +\n `const modelsFormGrid=document.getElementById('modelsFormGrid');` +\n `const draftRouterDefault=document.getElementById('draftRouterDefault');` +\n `const draftModelsCount=document.getElementById('draftModelsCount');` +\n `const triggerEnabled=document.getElementById('triggerEnabled');` +\n `const triggerIntentEnabled=document.getElementById('triggerIntentEnabled');` +\n `const triggerAnalysisScope=document.getElementById('triggerAnalysisScope');` +\n `const triggerIntentModel=document.getElementById('triggerIntentModel');` +\n `const triggerRulesList=document.getElementById('triggerRulesList');` +\n `const smartEnabled=document.getElementById('smartEnabled');` +\n `const smartRouterModel=document.getElementById('smartRouterModel');` +\n `const smartFallback=document.getElementById('smartFallback');` +\n `const smartCacheTtl=document.getElementById('smartCacheTtl');` +\n `const smartMaxTokens=document.getElementById('smartMaxTokens');` +\n `const smartCandidatesList=document.getElementById('smartCandidatesList');` +\n `const governanceEnabled=document.getElementById('governanceEnabled');` +\n `const governanceAlignmentEnabled=document.getElementById('governanceAlignmentEnabled');` +\n `const governanceSummarizerModel=document.getElementById('governanceSummarizerModel');` +\n `const governanceSemanticEnabled=document.getElementById('governanceSemanticEnabled');` +\n `const governanceClassifierModel=document.getElementById('governanceClassifierModel');` +\n `const governanceShadowEnabled=document.getElementById('governanceShadowEnabled');` +\n `const governanceVerifierModel=document.getElementById('governanceVerifierModel');` +\n `const governanceCascadeLevelsList=document.getElementById('governanceCascadeLevelsList');` +\n `const topLevelTriggerIntentSuggestions=document.getElementById('topLevelTriggerIntentSuggestions');` +\n `const topLevelSmartRouterSuggestions=document.getElementById('topLevelSmartRouterSuggestions');` +\n `const topLevelGovernanceSummarizerSuggestions=document.getElementById('topLevelGovernanceSummarizerSuggestions');` +\n `const topLevelGovernanceClassifierSuggestions=document.getElementById('topLevelGovernanceClassifierSuggestions');` +\n `const topLevelGovernanceVerifierSuggestions=document.getElementById('topLevelGovernanceVerifierSuggestions');` +\n `const compiledModelsStatus=document.getElementById('compiledModelsStatus');` +\n `const compiledDiffSummary=document.getElementById('compiledDiffSummary');` +\n `const compiledDiffTableBody=document.querySelector('#compiledDiffTable tbody');` +\n `const referenceImpactSummary=document.getElementById('referenceImpactSummary');` +\n `const referenceImpactTableBody=document.querySelector('#referenceImpactTable tbody');` +\n `const compiledProvidersTableBody=document.querySelector('#compiledProvidersTable tbody');` +\n `const compiledModelMapTableBody=document.querySelector('#compiledModelMapTable tbody');` +\n `const metricsGrid=document.getElementById('metricsGrid');` +\n `const bucketGrid=document.getElementById('bucketGrid');` +\n `const bucketHint=document.getElementById('bucketHint');` +\n `const routeRanking=document.getElementById('routeRanking');` +\n `const modelRanking=document.getElementById('modelRanking');` +\n `const intentRanking=document.getElementById('intentRanking');` +\n `const anomalyList=document.getElementById('anomalyList');` +\n `const saveThresholdsStatus=document.getElementById('saveThresholdsStatus');` +\n `const snapshotStatus=document.getElementById('snapshotStatus');` +\n `const archiveStatus=document.getElementById('archiveStatus');` +\n `const exportTableBody=document.querySelector('#exportTable tbody');` +\n `const scheduleTableBody=document.querySelector('#scheduleTable tbody');` +\n `const archiveTableBody=document.querySelector('#archiveTable tbody');` +\n `const trendTableBody=document.querySelector('#trendTable tbody');` +\n `let currentDraftConfig={};` +\n `let knownModelIds=[];` +\n `let activeValidationHighlight=null;` +\n `const draftPresets={` +\n ` balanced:{ label:'\u5E73\u8861\u9884\u8BBE', description:'\u542F\u7528 SmartRouter\uFF0C\u5E76\u586B\u5145\u5E73\u8861/\u5FEB\u901F\u5019\u9009\u6A21\u578B\u7EC4\u5408\u3002', affects:['Router.default','SmartRouter.enabled','SmartRouter.candidates'], routerDefault:'sonnet', smartEnabled:true, smartCandidates:[{ model:'sonnet', description:'balanced default' },{ model:'haiku', description:'fast lightweight' }] },` +\n ` fast:{ label:'\u5FEB\u901F\u9884\u8BBE', description:'\u9ED8\u8BA4\u8D70\u8F7B\u91CF\u6A21\u578B\uFF0C\u5E76\u6DFB\u52A0\u4E00\u6761\u5FEB\u901F\u54CD\u5E94 TriggerRule\u3002', affects:['Router.default','TriggerRouter.enabled','TriggerRouter.rules'], routerDefault:'haiku', triggerEnabled:true, triggerRules:[{ name:'quick-response', enabled:true, priority:20, model:'haiku', patterns:[{ type:'exact', keywords:['\u5FEB\u901F\u5904\u7406','\u5FEB\u901F\u56DE\u7B54'] }] }] },` +\n ` governance:{ label:'\u6CBB\u7406\u9884\u8BBE', description:'\u6253\u5F00\u6CBB\u7406\u6838\u5FC3\u80FD\u529B\uFF0C\u5E76\u586B\u5165 summarizer/classifier/verifier \u793A\u4F8B\u6A21\u578B\u3002', affects:['Governance.enabled','Governance.sticky.alignment','Governance.semantic','Governance.shadow'], governanceEnabled:true, governanceAlignmentEnabled:true, governanceSemanticEnabled:true, governanceShadowEnabled:true, governanceSummarizerModel:'sonnet', governanceClassifierModel:'sonnet', governanceVerifierModel:'haiku' }` +\n `};` +\n `const modelProviderTemplates=${toInlineScriptJson(getUiProviderTemplates())};` +\n `const defaultProviderTemplateKey='openrouter';` +\n `function esc(v){return String(v ?? '').replace(/[&<>\"]/g,m=>({ '&':'&','<':'<','>':'>','\"':'"' }[m]));}` +\n `function pct(v){return (Number(v || 0) * 100).toFixed(1)+'%';}` +\n `function fmt(v){return Number(v || 0).toFixed(2);}` +\n `function shortTime(v){ const d=new Date(v); return d.toISOString().slice(11,16); }` +\n `function inferProviderTemplateKey(model){` +\n ` const explicit=String(model?.provider_template || '').trim();` +\n ` if(explicit && modelProviderTemplates[explicit]){ return explicit; }` +\n ` const api=String(model?.api || model?.api_base_url || '').trim().toLowerCase();` +\n ` const modelInterface=String(model?.interface || model?.protocol || '').trim().toLowerCase();` +\n ` const exactMatch=Object.entries(modelProviderTemplates).find(([,item])=>String(item.api || '').trim().toLowerCase()===api && String(item.interface || '').trim().toLowerCase()===modelInterface);` +\n ` if(exactMatch){ return exactMatch[0]; }` +\n ` if(api.includes('api.anthropic.com/v1/messages') || modelInterface === 'anthropic'){ return 'anthropic'; }` +\n ` if(api.includes('openrouter.ai')){ return 'openrouter'; }` +\n ` if(api.includes('deepseek.com')){ return 'deepseek'; }` +\n ` if(api.includes('siliconflow.cn')){ return 'siliconflow'; }` +\n ` if(api.includes('api.openai.com')){ return 'openai-compatible'; }` +\n ` return '';` +\n `}` +\n `function getProviderTemplateContext(model){` +\n ` const templateKey=inferProviderTemplateKey(model) || defaultProviderTemplateKey;` +\n ` return { templateKey, template:modelProviderTemplates[templateKey] || modelProviderTemplates[defaultProviderTemplateKey] || {} };` +\n `}` +\n `function createDraftModelFromTemplate(templateKey){` +\n ` const resolvedKey=(templateKey && modelProviderTemplates[templateKey]) ? templateKey : defaultProviderTemplateKey;` +\n ` const template=modelProviderTemplates[resolvedKey] || {};` +\n ` return { provider_template:resolvedKey, id:template.suggested_id || '', api:template.api || '', interface:template.interface || 'openai', model:template.default_model || '', thinking:template.default_thinking || 'auto' };` +\n `}` +\n `function getModelIdSuggestionsMarkup(idPrefix){` +\n ` return '<datalist id=\\\"'+idPrefix+'\\\">'+knownModelIds.map(modelId=>'<option value=\\\"'+esc(modelId)+'\\\"></option>').join('')+'</datalist>';` +\n `}` +\n `function resolvePresetModelId(seed){` +\n ` const source=String(seed || '').trim().toLowerCase();` +\n ` if(!source || !knownModelIds.length){ return seed; }` +\n ` if(knownModelIds.includes(seed)){ return seed; }` +\n ` const ranked=knownModelIds.map((modelId)=>{` +\n ` const target=String(modelId || '').toLowerCase();` +\n ` let score=0;` +\n ` if(target===source){ score+=100; }` +\n ` if(target.includes(source) || source.includes(target)){ score+=40; }` +\n ` source.split(/[^a-z0-9]+/).filter(Boolean).forEach((part)=>{ if(target.includes(part)){ score+=Math.min(part.length * 4, 24); } });` +\n ` return { modelId, score };` +\n ` }).filter((item)=>item.score>0).sort((a,b)=>b.score-a.score || a.modelId.localeCompare(b.modelId));` +\n ` return ranked.length ? ranked[0].modelId : seed;` +\n `}` +\n `function getTriggerPatternValidationHint(pattern){` +\n ` if((pattern?.type || 'exact') === 'regex'){` +\n ` return pattern?.pattern ? { level:'ok', message:'regex pattern \u5DF2\u914D\u7F6E' } : { level:'warn', message:'regex \u6A21\u5F0F\u9700\u8981\u586B\u5199 pattern' };` +\n ` }` +\n ` return Array.isArray(pattern?.keywords) && pattern.keywords.some((keyword)=>String(keyword || '').trim()) ? { level:'ok', message:'exact keywords \u5DF2\u914D\u7F6E' } : { level:'warn', message:'exact \u6A21\u5F0F\u81F3\u5C11\u9700\u8981\u4E00\u4E2A keyword' };` +\n `}` +\n `function renderDraftSummary(config){` +\n ` const models=Array.isArray(config?.Models) ? config.Models : [];` +\n ` const triggerRules=Array.isArray(config?.TriggerRouter?.rules) ? config.TriggerRouter.rules : [];` +\n ` const patternCount=triggerRules.reduce((sum,rule)=>sum + (Array.isArray(rule.patterns) ? rule.patterns.length : 0),0);` +\n ` const smartCandidates=Array.isArray(config?.SmartRouter?.candidates) ? config.SmartRouter.candidates : [];` +\n ` const cascadeLevels=Array.isArray(config?.Governance?.cascade?.levels) ? config.Governance.cascade.levels : [];` +\n ` const modelRefCount=[config?.Router?.default, config?.TriggerRouter?.intent_model, config?.SmartRouter?.router_model, config?.Governance?.sticky?.alignment?.summarizer_model, config?.Governance?.semantic?.classifier_model, config?.Governance?.shadow?.verifier_model].filter(v=>typeof v === 'string' && v.trim()).length + triggerRules.filter(rule=>rule?.model).length + smartCandidates.filter(item=>item?.model).length + cascadeLevels.reduce((sum,level)=>sum + (level?.from ? 1 : 0) + (level?.to ? 1 : 0), 0);` +\n ` draftSummaryGrid.innerHTML=[` +\n \" ['Models', models.length],\" +\n \" ['Trigger rules', triggerRules.length],\" +\n \" ['Patterns', patternCount],\" +\n \" ['Smart candidates', smartCandidates.length],\" +\n \" ['Cascade levels', cascadeLevels.length],\" +\n \" ['Model refs', modelRefCount]\" +\n ` ].map(([label,value])=>'<div class=\\\"stat\\\"><span class=\\\"muted\\\">'+esc(label)+'</span><strong>'+esc(value)+'</strong></div>').join('');` +\n `}` +\n `function renderDraftValidation(errors,warnings){` +\n ` const errorList=Array.isArray(errors) ? errors.filter(Boolean) : [];` +\n ` const warningList=Array.isArray(warnings) ? warnings.filter(Boolean) : [];` +\n ` if(!errorList.length && !warningList.length){ draftValidationList.innerHTML='<div class=\"alert info\"><strong>No validation issues</strong><div class=\"muted\">\u5F53\u524D\u8349\u7A3F\u672A\u53D1\u73B0\u96C6\u4E2D\u5C55\u793A\u7684\u95EE\u9898</div></div>'; return; }` +\n ` const extractPath=(text)=>{ const match=String(text).match(/^(Models(?:\\\\[[0-9]+\\\\])?(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?|Router(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?|TriggerRouter(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?|SmartRouter(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?|Governance(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?)/); return match ? match[1] : ''; };` +\n ` const grouped=[...errorList.map(item=>({ text:String(item), severity:'error' })), ...warningList.map(item=>({ text:String(item), severity:'warning' }))].reduce((acc,item)=>{` +\n ` const text=item.text;` +\n ` const bucket=text.startsWith('Models') ? 'Models' : text.startsWith('Router') ? 'Router' : text.startsWith('TriggerRouter') ? 'TriggerRouter' : text.startsWith('SmartRouter') ? 'SmartRouter' : text.startsWith('Governance') ? 'Governance' : text.startsWith('JSON parse error') ? 'Draft JSON' : 'Other';` +\n ` acc[bucket]=acc[bucket] || [];` +\n ` acc[bucket].push({ text, path: extractPath(text), severity:item.severity });` +\n ` return acc;` +\n ` }, {});` +\n ` const summary='<div class=\"alert info\"><div class=\"row\"><strong>Validation summary</strong><span class=\"pill\">'+esc(errorList.length)+' errors / '+esc(warningList.length)+' warnings</span></div><div class=\"muted\">'+(errorList.length ? '\u8BF7\u4F18\u5148\u4FEE\u590D errors\uFF0C\u518D\u51B3\u5B9A\u662F\u5426\u63A5\u53D7 warnings\u3002' : '\u5F53\u524D\u65E0\u963B\u65AD\u9519\u8BEF\uFF0C\u53EF\u6309\u9700\u5904\u7406 warnings\u3002')+'</div></div>';` +\n ` draftValidationList.innerHTML=summary + Object.entries(grouped).map(([bucket,items])=>{ const hasError=items.some(item=>item.severity==='error'); const levelClass=hasError ? 'warn' : 'info'; const actionLabel=hasError ? 'repair first' : 'review before save'; return '<div class=\"alert '+levelClass+'\"><div class=\"row\"><strong>'+esc(bucket)+'</strong><span class=\"pill\">'+esc(items.length)+' issues</span></div><div class=\"muted\">'+esc(actionLabel)+'</div><div>'+items.slice(0,4).map(item=>'<div>'+(item.path ? ('<button type=\"button\" class=\"pill\" data-validation-path=\\\"'+esc(item.path)+'\\\">'+esc(item.path)+'</button> ') : '')+'<span class=\\\"pill\\\">'+esc(item.severity==='error' ? 'error' : 'warning')+'</span> '+esc(item.text)+'</div>').join('')+'</div></div>'; }).join('');` +\n `}` +\n `function getCapabilityWarningActionLabel(code){` +\n ` if(code==='thinking_ignored'){ return '\u79FB\u9664 thinking'; }` +\n ` if(code==='tools_text_fallback' || code==='images_text_fallback'){ return '\u6062\u590D\u9ED8\u8BA4 capability'; }` +\n ` return '';` +\n `}` +\n `function renderCapabilityWarnings(report){` +\n ` const entries=Array.isArray(report?.entries) ? report.entries : [];` +\n ` if(!entries.length){ capabilityWarningsList.innerHTML='<div class=\"alert info\"><strong>No capability warnings</strong><div class=\"muted\">\u5F53\u524D compiled models \u672A\u53D1\u73B0\u9700\u8981\u989D\u5916\u63D0\u793A\u7684\u80FD\u529B\u964D\u7EA7</div></div>'; return; }` +\n ` const summary=report?.summary || {};` +\n ` capabilityWarningsList.innerHTML='<div class=\"alert info\"><strong>Capability warning summary</strong><div class=\"muted\">warn '+esc(summary.warn ?? 0)+' / info '+esc(summary.info ?? 0)+' / total '+esc(summary.total ?? entries.length)+'</div></div>' + entries.map(item=>{ const actionLabel=getCapabilityWarningActionLabel(item.code); return '<div class=\"alert '+esc(item.level === 'warn' ? 'warn' : 'info')+'\"><div class=\"row\"><strong>'+esc(item.code || item.level || 'warning')+'</strong><span class=\"pill\">'+esc(item.modelId || '-').trim()+'</span></div><div>'+(item.path ? ('<button type=\"button\" class=\"pill\" data-validation-path=\\\"'+esc(item.path)+'\\\">'+esc(item.path)+'</button> ') : '')+esc(item.message || '')+'</div>'+(actionLabel ? ('<div class=\\\"row\\\" style=\\\"margin-top:.5rem\\\"><button type=\\\"button\\\" data-apply-warning-path=\\\"'+esc(item.path || '')+'\\\" data-apply-warning-code=\\\"'+esc(item.code || '')+'\\\">'+esc(actionLabel)+'</button></div>') : '')+'</div>'; }).join('');` +\n `}` +\n `function findValidationTarget(path){` +\n ` if(!path){ return null; }` +\n ` if(path.startsWith('Models')){ return modelsFormGrid; }` +\n ` if(path === 'Router.default'){ return draftRouterDefault; }` +\n ` if(path.startsWith('TriggerRouter.intent_model')){ return triggerIntentModel; }` +\n ` if(path.startsWith('TriggerRouter.rules[')){ return triggerRulesList; }` +\n ` if(path.startsWith('SmartRouter.router_model')){ return smartRouterModel; }` +\n ` if(path.startsWith('SmartRouter.candidates[')){ return smartCandidatesList; }` +\n ` if(path.startsWith('Governance.cascade.levels[')){ return governanceCascadeLevelsList; }` +\n ` if(path.startsWith('Governance.sticky.alignment')){ return governanceSummarizerModel; }` +\n ` if(path.startsWith('Governance.semantic')){ return governanceClassifierModel; }` +\n ` if(path.startsWith('Governance.shadow')){ return governanceVerifierModel; }` +\n ` if(path.startsWith('Governance')){ return governanceEnabled; }` +\n ` return null;` +\n `}` +\n `function jumpToValidationPath(path){` +\n ` const target=findValidationTarget(path);` +\n ` if(!target || typeof target.scrollIntoView !== 'function'){ return; }` +\n ` if(activeValidationHighlight && activeValidationHighlight.classList){ activeValidationHighlight.classList.remove('jump-highlight'); }` +\n ` target.scrollIntoView({ behavior:'smooth', block:'center' });` +\n ` if(target.classList){ target.classList.add('jump-highlight'); activeValidationHighlight=target; setTimeout(()=>{ if(target.classList){ target.classList.remove('jump-highlight'); if(activeValidationHighlight===target){ activeValidationHighlight=null; } } }, 1800); }` +\n ` if(typeof target.focus === 'function'){ target.focus({ preventScroll:true }); }` +\n `}` +\n `function renderDraftPresetModeHint(){` +\n ` const overwriteMode=draftPresetMode.value === 'replace';` +\n ` draftPresetModeHint.textContent=overwriteMode ? 'overwrite \u4F1A\u91CD\u7F6E TriggerRouter / SmartRouter / Governance \u76F8\u5173\u8868\u5355\uFF0C\u518D\u5E94\u7528\u9884\u8BBE' : 'append / merge \u4F1A\u5C3D\u91CF\u4FDD\u7559\u5F53\u524D\u8349\u7A3F\uFF0C\u4EC5\u8865\u5145\u9884\u8BBE\u76F8\u5173\u5B57\u6BB5';` +\n `}` +\n `function deriveActualAffectedAreas(preview){` +\n ` const areas=new Set();` +\n ` const diff=preview?.diff || {};` +\n ` const impact=preview?.referenceImpact || {};` +\n ` if((diff.providerChanges || []).length || (diff.modelChanges || []).length){ areas.add('Models'); }` +\n ` (impact.entries || []).forEach((entry)=>{` +\n ` const path=String(entry.path || '');` +\n ` if(path.startsWith('Router.')){ areas.add('Router'); }` +\n ` else if(path.startsWith('TriggerRouter.')){ areas.add('TriggerRouter'); }` +\n ` else if(path.startsWith('SmartRouter.')){ areas.add('SmartRouter'); }` +\n ` else if(path.startsWith('Governance.')){ areas.add('Governance'); }` +\n ` });` +\n ` return Array.from(areas);` +\n `}` +\n `function renderDraftPreviewMeta(meta){` +\n ` if(!meta){ draftPreviewMeta.innerHTML='<div class=\"alert info\"><strong>Draft preview mode</strong><div class=\"muted\">\u5F53\u524D\u663E\u793A\u4E3A\u8349\u7A3F\u7F16\u8F91\u89C6\u56FE\uFF0C\u9884\u8BBE dry-run \u4F1A\u5728\u8FD9\u91CC\u63D0\u793A\u5F71\u54CD\u8303\u56F4\u3002</div></div>'; return; }` +\n ` draftPreviewMeta.innerHTML='<div class=\"alert info\"><strong>'+esc(meta.title || 'Preset dry-run')+'</strong><div>'+esc(meta.description || '')+'</div><div class=\"muted\">\u6A21\u5F0F\uFF1A'+esc(meta.mode || '-')+' \u00B7 \u9884\u8BBE\u58F0\u660E\u5F71\u54CD\u8303\u56F4\uFF1A'+esc((meta.affects || []).join(' / ') || '-')</div><div class=\"muted\">\u5B9E\u9645\u9884\u89C8\u547D\u4E2D\u533A\u57DF\uFF1A'+esc((meta.actualAffects || []).join(' / ') || '-')</div></div>';` +\n `}` +\n `function renderDraftPresetGuide(){` +\n ` draftPresetList.innerHTML=Object.entries(draftPresets).map(([key,preset])=>'<div class=\"alert info\"><strong>'+esc(preset.label || key)+'</strong><div>'+esc(preset.description || '')+'</div><div class=\"muted\">\u5F71\u54CD\u8303\u56F4\uFF1A'+esc((preset.affects || []).join(' / '))+'</div></div>').join('');` +\n `}` +\n `function updateTopLevelModelSuggestionLists(){` +\n ` const markup=knownModelIds.map(modelId=>'<option value=\\\"'+esc(modelId)+'\\\"></option>').join('');` +\n ` [topLevelTriggerIntentSuggestions,topLevelSmartRouterSuggestions,topLevelGovernanceSummarizerSuggestions,topLevelGovernanceClassifierSuggestions,topLevelGovernanceVerifierSuggestions].forEach(node=>{ if(node){ node.innerHTML=markup; } });` +\n `}` +\n `function renderModelsForm(models){` +\n ` const list=Array.isArray(models) ? models : [];` +\n ` draftModelsCount.value=String(list.length);` +\n ` if(!list.length){ modelsFormGrid.innerHTML='<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No draft models loaded yet</span></div>'; return; }` +\n ` modelsFormGrid.innerHTML=list.map((model,index)=>{ const templateContext=getProviderTemplateContext(model); const template=templateContext.template; return '<div class=\"model-card\" data-model-card=\\\"'+index+'\\\">' +` +\n ` '<div class=\"model-card-header\"><strong>Model #'+(index+1)+'</strong><button type=\"button\" data-remove-model=\\\"'+index+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\"model-card-grid\">' +` +\n ` '<div><label>Provider template</label><div class=\"row\"><select data-field=\\\"provider_template\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">custom</option>'+Object.entries(modelProviderTemplates).map(([key,item])=>'<option value=\\\"'+esc(key)+'\\\"'+(model.provider_template === key ? ' selected' : '')+'>'+esc(item.label)+'</option>').join('')+'</select><button type=\"button\" data-apply-template=\\\"'+index+'\\\">\u5E94\u7528</button></div></div>' +` +\n ` '<div><label>ID</label><input data-field=\\\"id\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.id || '')+'\\\" placeholder=\\\"'+esc(template.suggested_id || 'sonnet')+'\\\"><div class=\"muted\">\u5EFA\u8BAE\u6A21\u677F\uFF1A'+esc(template.label || templateContext.templateKey || 'custom')+'</div></div>' +` +\n ` '<div><label>Interface</label><select data-field=\\\"interface\\\" data-index=\\\"'+index+'\\\"><option value=\\\"openai\\\"'+(((model.interface || model.protocol || 'openai') === 'openai') ? ' selected' : '')+'>openai</option><option value=\\\"anthropic\\\"'+(((model.interface || model.protocol) === 'anthropic') ? ' selected' : '')+'>anthropic</option></select></div>' +` +\n ` '<div><label>Model</label><input data-field=\\\"model\\\" data-index=\\\"'+index+'\\\" list=\\\"modelSuggestions'+index+'\\\" value=\\\"'+esc(model.model || '')+'\\\" placeholder=\\\"'+esc(template.default_model || 'anthropic/claude-sonnet-4')+'\\\"><datalist id=\\\"modelSuggestions'+index+'\\\">'+((template.model_examples || []).map(item=>'<option value=\\\"'+esc(item)+'\\\"></option>').join(''))+'</datalist><div class=\"muted\">\u4F8B\u5982\uFF1A'+esc((template.model_examples || ['anthropic/claude-sonnet-4']).join(' / '))+'</div></div>' +` +\n ` '<div><label>API</label><input data-field=\\\"api\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.api || model.api_base_url || '')+'\\\" placeholder=\\\"'+esc(template.api || 'https://...')+'\\\"></div>' +` +\n ` '<div><label>Key</label><input data-field=\\\"key\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.key || model.api_key || '')+'\\\" placeholder=\\\"'+esc(template.key_placeholder || 'sk-...')+'\\\"></div>' +` +\n ` '<div><label>Thinking</label><select data-field=\\\"thinking_profile\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"off\\\"'+(((model.thinking === 'off') || model.thinking?.mode === 'off') ? ' selected' : '')+'>off</option><option value=\\\"auto\\\"'+(((model.thinking === 'auto') || model.thinking?.mode === 'auto') ? ' selected' : '')+'>auto</option><option value=\\\"on\\\"'+(((model.thinking === 'on') || (model.thinking?.mode === 'on' && !model.thinking?.effort)) ? ' selected' : '')+'>on</option><option value=\\\"low\\\"'+(((model.thinking === 'low') || (model.thinking?.mode === 'on' && model.thinking?.effort === 'low' && !model.thinking?.budget_tokens)) ? ' selected' : '')+'>low</option><option value=\\\"medium\\\"'+(((model.thinking === 'medium') || (model.thinking?.mode === 'on' && model.thinking?.effort === 'medium' && !model.thinking?.budget_tokens)) ? ' selected' : '')+'>medium</option><option value=\\\"high\\\"'+(((model.thinking === 'high') || (model.thinking?.mode === 'on' && model.thinking?.effort === 'high' && !model.thinking?.budget_tokens)) ? ' selected' : '')+'>high</option><option value=\\\"custom\\\"'+(((typeof model.thinking === 'object') && model.thinking && model.thinking.budget_tokens) ? ' selected' : '')+'>custom</option></select></div>' +` +\n ` '<div><label>Thinking mode</label><select data-field=\\\"thinking_mode\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"off\\\"'+(model.thinking?.mode === 'off' ? ' selected' : '')+'>off</option><option value=\\\"auto\\\"'+(model.thinking?.mode === 'auto' ? ' selected' : '')+'>auto</option><option value=\\\"on\\\"'+(model.thinking?.mode === 'on' ? ' selected' : '')+'>on</option></select></div>' +` +\n ` '<div><label>Thinking effort</label><select data-field=\\\"thinking_effort\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"low\\\"'+(model.thinking?.effort === 'low' ? ' selected' : '')+'>low</option><option value=\\\"medium\\\"'+(model.thinking?.effort === 'medium' ? ' selected' : '')+'>medium</option><option value=\\\"high\\\"'+(model.thinking?.effort === 'high' ? ' selected' : '')+'>high</option></select></div>' +` +\n ` '<div><label>Thinking budget</label><input data-field=\\\"thinking_budget_tokens\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.thinking?.budget_tokens || '')+'\\\" placeholder=\\\"1024\\\"></div>' +` +\n ` '<div><label>Vendor hint</label><input data-field=\\\"vendor_hint\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.metadata?.vendor_hint || '')+'\\\" placeholder=\\\"'+esc(template.vendor_hint || 'openrouter')+'\\\"></div>' +` +\n ` '<div><label>Reasoning support</label><select data-field=\\\"supports_reasoning\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"true\\\"'+(model.metadata?.supports_reasoning === true ? ' selected' : '')+'>supported</option><option value=\\\"false\\\"'+(model.metadata?.supports_reasoning === false ? ' selected' : '')+'>disabled</option></select></div>' +` +\n ` '<div><label>Tool support</label><select data-field=\\\"supports_tools\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"true\\\"'+(model.metadata?.supports_tools === true ? ' selected' : '')+'>supported</option><option value=\\\"false\\\"'+(model.metadata?.supports_tools === false ? ' selected' : '')+'>disabled</option></select></div>' +` +\n ` '<div><label>Image support</label><select data-field=\\\"supports_images\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"true\\\"'+(model.metadata?.supports_images === true ? ' selected' : '')+'>supported</option><option value=\\\"false\\\"'+(model.metadata?.supports_images === false ? ' selected' : '')+'>disabled</option></select></div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Metadata (advanced JSON)</label><textarea data-field=\\\"metadata\\\" data-index=\\\"'+index+'\\\" placeholder=\\\"{\\\\\\\"label\\\\\\\":\\\\\\\"Balanced profile\\\\\\\"}\\\">'+esc(model.metadata ? JSON.stringify(model.metadata, null, 2) : '')+'</textarea><div class=\"muted\">\u666E\u901A capability \u5EFA\u8BAE\u4F18\u5148\u4F7F\u7528\u4E0A\u9762\u7684\u663E\u5F0F\u5B57\u6BB5\uFF1B\u8FD9\u91CC\u4FDD\u7559\u7ED9\u9AD8\u7EA7\u6269\u5C55\u5143\u6570\u636E\u3002</div></div>' +` +\n ` '</div>' +` +\n ` '</div>'; }).join('');` +\n `}` +\n `function extractModelsFromForm(){` +\n ` const cards=Array.from(modelsFormGrid.querySelectorAll('[data-model-card]'));` +\n ` return cards.map((card,index)=>{` +\n ` const read=(field)=>card.querySelector('[data-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const providerTemplate=(read('provider_template')?.value || '').trim();` +\n ` const metadataRaw=(read('metadata')?.value || '').trim();` +\n ` let metadata;` +\n ` if(metadataRaw){ metadata=JSON.parse(metadataRaw); } else { metadata={}; }` +\n ` const thinkingProfile=(read('thinking_profile')?.value || '').trim();` +\n ` const vendorHint=(read('vendor_hint')?.value || '').trim();` +\n ` const supportsReasoning=(read('supports_reasoning')?.value || '').trim();` +\n ` const supportsTools=(read('supports_tools')?.value || '').trim();` +\n ` const supportsImages=(read('supports_images')?.value || '').trim();` +\n ` const thinking={};` +\n ` const mode=(read('thinking_mode')?.value || '').trim();` +\n ` const effort=(read('thinking_effort')?.value || '').trim();` +\n ` const budget=(read('thinking_budget_tokens')?.value || '').trim();` +\n ` if(mode) thinking.mode=mode;` +\n ` if(effort) thinking.effort=effort;` +\n ` if(budget) thinking.budget_tokens=Number(budget);` +\n ` const model={` +\n ` id:(read('id')?.value || '').trim(),` +\n ` api:(read('api')?.value || '').trim(),` +\n ` key:(read('key')?.value || '').trim(),` +\n ` interface:(read('interface')?.value || '').trim(),` +\n ` model:(read('model')?.value || '').trim(),` +\n ` };` +\n ` if(vendorHint){ metadata.vendor_hint=vendorHint; } else if(metadata && Object.prototype.hasOwnProperty.call(metadata,'vendor_hint')){ delete metadata.vendor_hint; }` +\n ` if(supportsReasoning){ metadata.supports_reasoning=supportsReasoning === 'true'; } else if(metadata && Object.prototype.hasOwnProperty.call(metadata,'supports_reasoning')){ delete metadata.supports_reasoning; }` +\n ` if(supportsTools){ metadata.supports_tools=supportsTools === 'true'; } else if(metadata && Object.prototype.hasOwnProperty.call(metadata,'supports_tools')){ delete metadata.supports_tools; }` +\n ` if(supportsImages){ metadata.supports_images=supportsImages === 'true'; } else if(metadata && Object.prototype.hasOwnProperty.call(metadata,'supports_images')){ delete metadata.supports_images; }` +\n ` if(providerTemplate){ model.provider_template=providerTemplate; }` +\n ` if(thinkingProfile && thinkingProfile !== 'custom'){ model.thinking=thinkingProfile; } else if(Object.keys(thinking).length){ model.thinking=thinking; }` +\n ` if(metadata !== undefined && Object.keys(metadata).length){ model.metadata=metadata; }` +\n ` return model;` +\n ` });` +\n `}` +\n `function applyProviderTemplate(index){` +\n ` const card=modelsFormGrid.querySelector('[data-model-card=\\\"'+index+'\\\"]');` +\n ` if(!card){ return; }` +\n ` const templateKey=(card.querySelector('[data-field=\\\"provider_template\\\"][data-index=\\\"'+index+'\\\"]')?.value || '').trim();` +\n ` const template=modelProviderTemplates[templateKey];` +\n ` if(!template){ return; }` +\n ` const modelInterface=card.querySelector('[data-field=\\\"interface\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const apiBaseUrl=card.querySelector('[data-field=\\\"api\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const modelInput=card.querySelector('[data-field=\\\"model\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(modelInterface){ modelInterface.value=template.interface || template.protocol; }` +\n ` if(apiBaseUrl && !apiBaseUrl.value.trim()){ apiBaseUrl.value=template.api || template.api_base_url; } else if(apiBaseUrl){ apiBaseUrl.value=template.api || template.api_base_url; }` +\n ` if(modelInput){ modelInput.placeholder=template.default_model || modelInput.placeholder; if(!modelInput.value.trim() && template.default_model){ modelInput.value=template.default_model; } }` +\n ` const modelIdInput=card.querySelector('[data-field=\\\"id\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(modelIdInput){ modelIdInput.placeholder=template.suggested_id || modelIdInput.placeholder; if(!modelIdInput.value.trim() && template.suggested_id){ modelIdInput.value=template.suggested_id; } }` +\n ` const keyInput=card.querySelector('[data-field=\\\"key\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(keyInput && template.key_placeholder){ keyInput.placeholder=template.key_placeholder; }` +\n ` const vendorHintInput=card.querySelector('[data-field=\\\"vendor_hint\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(vendorHintInput && template.vendor_hint){ vendorHintInput.placeholder=template.vendor_hint; }` +\n ` const thinkingProfile=card.querySelector('[data-field=\\\"thinking_profile\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(thinkingProfile && !thinkingProfile.value && template.default_thinking){ thinkingProfile.value=template.default_thinking; }` +\n ` const nextModels=extractModelsFromForm();` +\n ` if(nextModels[index]){ nextModels[index]={ ...nextModels[index], provider_template: templateKey }; }` +\n ` renderModelsForm(nextModels);` +\n `}` +\n `function renderTriggerRulesList(rules){` +\n ` const list=Array.isArray(rules) ? rules : [];` +\n ` if(!list.length){ triggerRulesList.innerHTML='<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No trigger rules yet</span></div>'; return; }` +\n ` triggerRulesList.innerHTML=list.map((rule,index)=>'<div class=\"list-item\" data-trigger-rule=\\\"'+index+'\\\">' +` +\n ` '<div class=\"action-row\"><strong>Rule #'+(index+1)+'</strong><button type=\"button\" data-remove-trigger-rule=\\\"'+index+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\"list-item-grid\">' +` +\n ` '<div><label>Name</label><input data-trigger-field=\\\"name\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(rule.name || '')+'\\\"></div>' +` +\n ` '<div><label>Model</label><input data-trigger-field=\\\"model\\\" data-index=\\\"'+index+'\\\" list=\\\"triggerModelSuggestions'+index+'\\\" value=\\\"'+esc(rule.model || '')+'\\\">'+getModelIdSuggestionsMarkup('triggerModelSuggestions'+index)+'</div>' +` +\n ` '<div><label>Priority</label><input data-trigger-field=\\\"priority\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(rule.priority ?? 10)+'\\\"></div>' +` +\n ` '<div><label><input type=\\\"checkbox\\\" data-trigger-field=\\\"enabled\\\" data-index=\\\"'+index+'\\\"'+(rule.enabled === false ? '' : ' checked')+'> Enabled</label></div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Description</label><input data-trigger-field=\\\"description\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(rule.description || '')+'\\\"></div>' +` +\n ` '</div>' +` +\n ` '<div class=\\\"action-row\\\" style=\\\"margin-top:.75rem\\\"><strong>Patterns</strong><button type=\\\"button\\\" data-add-trigger-pattern=\\\"'+index+'\\\">\u65B0\u589E Pattern</button></div>' +` +\n ` '<div class=\\\"list-editor\\\">'+(((rule.patterns || []).length ? rule.patterns : [{ type:'exact', keywords:[] }]).map((pattern,patternIndex)=>'<div class=\\\"list-item\\\" data-trigger-pattern=\\\"'+index+'-'+patternIndex+'\\\">' +` +\n ` '<div class=\\\"action-row\\\"><span class=\\\"muted\\\">Pattern #'+(patternIndex+1)+'</span><span class=\\\"pill\\\">'+esc(pattern.type || 'exact')+'</span><span class=\\\"muted\\\">'+esc(getTriggerPatternValidationHint(pattern).message)+'</span><button type=\\\"button\\\" data-remove-trigger-pattern=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\\\"list-item-grid\\\">' +` +\n ` '<div><label>Type</label><select data-trigger-pattern-field=\\\"type\\\" data-index=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\"><option value=\\\"exact\\\"'+(pattern.type !== 'regex' ? ' selected' : '')+'>exact</option><option value=\\\"regex\\\"'+(pattern.type === 'regex' ? ' selected' : '')+'>regex</option></select></div>' +` +\n ` '<div><label><input type=\\\"checkbox\\\" data-trigger-pattern-field=\\\"caseSensitive\\\" data-index=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\"'+(pattern.caseSensitive ? ' checked' : '')+'> Case sensitive</label></div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><div class=\\\"action-row\\\"><label>Keywords</label><button type=\\\"button\\\" data-add-trigger-keyword=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\"'+(pattern.type === 'regex' ? ' disabled' : '')+'>\u65B0\u589E Keyword</button></div><div class=\\\"list-editor\\\">'+((((pattern.keywords || []).length ? pattern.keywords : ['']).map((keyword,keywordIndex)=>'<div class=\\\"list-item\\\" data-trigger-keyword=\\\"'+index+'-'+patternIndex+'-'+keywordIndex+'\\\"><div class=\\\"action-row\\\"><span class=\\\"muted\\\">Keyword #'+(keywordIndex+1)+'</span><button type=\\\"button\\\" data-remove-trigger-keyword=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\" data-keyword-index=\\\"'+keywordIndex+'\\\"'+(pattern.type === 'regex' ? ' disabled' : '')+'>\u5220\u9664</button></div><input data-trigger-pattern-field=\\\"keyword_item\\\" data-index=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\" data-keyword-index=\\\"'+keywordIndex+'\\\" value=\\\"'+esc(keyword || '')+'\\\" placeholder=\\\"keyword\\\"'+(pattern.type === 'regex' ? ' disabled' : '')+'></div>')).join(''))+'</div><div class=\\\"muted\\\">'+(pattern.type === 'regex' ? 'regex \u6A21\u5F0F\u4E0B\u5FFD\u7565 keywords' : 'exact \u6A21\u5F0F\u4E0B\u6309\u5173\u952E\u8BCD\u5217\u8868\u5339\u914D')+'</div></div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Regex pattern</label><input data-trigger-pattern-field=\\\"pattern\\\" data-index=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\" value=\\\"'+esc(pattern.pattern || '')+'\\\" placeholder=\\\"error|exception\\\"'+(pattern.type === 'regex' ? '' : ' disabled')+'><div class=\\\"muted\\\">'+(pattern.type === 'regex' ? 'regex \u6A21\u5F0F\u4E0B\u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D' : 'exact \u6A21\u5F0F\u4E0B\u5FFD\u7565 regex pattern')+'</div></div>' +` +\n ` '</div>' +` +\n ` '</div>').join(''))+'</div>' +` +\n ` '</div>').join('');` +\n `}` +\n `function extractTriggerRulesFromForm(){` +\n ` return Array.from(triggerRulesList.querySelectorAll('[data-trigger-rule]')).map((card,index)=>{` +\n ` const read=(field)=>card.querySelector('[data-trigger-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const patterns=Array.from(card.querySelectorAll('[data-trigger-pattern]')).map((patternCard,patternIndex)=>{` +\n ` const patternRead=(field)=>patternCard.querySelector('[data-trigger-pattern-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"][data-pattern-index=\\\"'+patternIndex+'\\\"]');` +\n ` const type=(patternRead('type')?.value || 'exact').trim();` +\n ` const pattern={ type, caseSensitive:Boolean(patternRead('caseSensitive')?.checked) };` +\n ` const keywords=Array.from(patternCard.querySelectorAll('[data-trigger-pattern-field=\\\"keyword_item\\\"][data-index=\\\"'+index+'\\\"][data-pattern-index=\\\"'+patternIndex+'\\\"]')).map((node)=>node.value.trim()).filter(Boolean);` +\n ` const regexPattern=(patternRead('pattern')?.value || '').trim();` +\n ` if(type === 'regex'){ if(regexPattern){ pattern.pattern=regexPattern; } } else if(keywords.length){ pattern.keywords=keywords; }` +\n ` return pattern;` +\n ` });` +\n ` const rule={ name:(read('name')?.value || '').trim(), model:(read('model')?.value || '').trim(), priority:Number(read('priority')?.value || 10), enabled:Boolean(read('enabled')?.checked), patterns };` +\n ` const description=(read('description')?.value || '').trim(); if(description){ rule.description=description; } return rule;` +\n ` });` +\n `}` +\n `function renderSmartCandidatesList(candidates){` +\n ` const list=Array.isArray(candidates) ? candidates : [];` +\n ` if(!list.length){ smartCandidatesList.innerHTML='<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No smart candidates yet</span></div>'; return; }` +\n ` smartCandidatesList.innerHTML=list.map((candidate,index)=>'<div class=\"list-item\" data-smart-candidate=\\\"'+index+'\\\">' +` +\n ` '<div class=\"action-row\"><strong>Candidate #'+(index+1)+'</strong><button type=\"button\" data-remove-smart-candidate=\\\"'+index+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\"list-item-grid\">' +` +\n ` '<div><label>Model</label><input data-smart-field=\\\"model\\\" data-index=\\\"'+index+'\\\" list=\\\"smartModelSuggestions'+index+'\\\" value=\\\"'+esc(candidate.model || '')+'\\\">'+getModelIdSuggestionsMarkup('smartModelSuggestions'+index)+'</div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Description</label><input data-smart-field=\\\"description\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(candidate.description || '')+'\\\"></div>' +` +\n ` '</div>' +` +\n ` '</div>').join('');` +\n `}` +\n `function extractSmartCandidatesFromForm(){` +\n ` return Array.from(smartCandidatesList.querySelectorAll('[data-smart-candidate]')).map((card,index)=>{` +\n ` const read=(field)=>card.querySelector('[data-smart-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` return { model:(read('model')?.value || '').trim(), description:(read('description')?.value || '').trim() };` +\n ` });` +\n `}` +\n `function renderCascadeLevelsList(levels){` +\n ` const list=Array.isArray(levels) ? levels : [];` +\n ` if(!list.length){ governanceCascadeLevelsList.innerHTML='<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No cascade levels yet</span></div>'; return; }` +\n ` governanceCascadeLevelsList.innerHTML=list.map((level,index)=>'<div class=\"list-item\" data-cascade-level=\\\"'+index+'\\\">' +` +\n ` '<div class=\"action-row\"><strong>Level #'+(index+1)+'</strong><button type=\"button\" data-remove-cascade-level=\\\"'+index+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\"list-item-grid\">' +` +\n ` '<div><label>From</label><input data-cascade-field=\\\"from\\\" data-index=\\\"'+index+'\\\" list=\\\"cascadeFromSuggestions'+index+'\\\" value=\\\"'+esc(level.from || '')+'\\\">'+getModelIdSuggestionsMarkup('cascadeFromSuggestions'+index)+'</div>' +` +\n ` '<div><label>To</label><input data-cascade-field=\\\"to\\\" data-index=\\\"'+index+'\\\" list=\\\"cascadeToSuggestions'+index+'\\\" value=\\\"'+esc(level.to || '')+'\\\">'+getModelIdSuggestionsMarkup('cascadeToSuggestions'+index)+'</div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Reason</label><input data-cascade-field=\\\"reason\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(level.reason || '')+'\\\"></div>' +` +\n ` '</div>' +` +\n ` '</div>').join('');` +\n `}` +\n `function extractCascadeLevelsFromForm(){` +\n ` return Array.from(governanceCascadeLevelsList.querySelectorAll('[data-cascade-level]')).map((card,index)=>{` +\n ` const read=(field)=>card.querySelector('[data-cascade-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const level={ from:(read('from')?.value || '').trim(), to:(read('to')?.value || '').trim() };` +\n ` const reason=(read('reason')?.value || '').trim(); if(reason){ level.reason=reason; } return level;` +\n ` });` +\n `}` +\n `function buildDraftPayloadFromForm(){` +\n ` const payload=JSON.parse(JSON.stringify(currentDraftConfig || {}));` +\n ` payload.Models=extractModelsFromForm();` +\n ` const routerDefault=(draftRouterDefault.value || '').trim();` +\n ` if(routerDefault){ payload.Router={ ...(payload.Router || {}), default: routerDefault }; }` +\n ` else if(payload.Router){ delete payload.Router.default; if(!Object.keys(payload.Router).length){ delete payload.Router; } }` +\n ` const triggerRules=extractTriggerRulesFromForm();` +\n ` if(triggerEnabled.checked || triggerIntentEnabled.checked || triggerIntentModel.value.trim() || triggerRules.length){ payload.TriggerRouter={ ...(payload.TriggerRouter || {}), enabled: triggerEnabled.checked, analysis_scope: triggerAnalysisScope.value || 'last_message', llm_intent_recognition: triggerIntentEnabled.checked, intent_model: triggerIntentModel.value.trim(), rules: triggerRules }; } else { delete payload.TriggerRouter; }` +\n ` const smartCandidates=extractSmartCandidatesFromForm();` +\n ` if(smartEnabled.checked || smartRouterModel.value.trim() || smartCandidates.length || smartCacheTtl.value.trim() || smartMaxTokens.value.trim()){ payload.SmartRouter={ ...(payload.SmartRouter || {}), enabled: smartEnabled.checked, router_model: smartRouterModel.value.trim(), fallback: smartFallback.value || 'default', candidates: smartCandidates, cache_ttl: smartCacheTtl.value.trim() ? Number(smartCacheTtl.value.trim()) : undefined, max_tokens: smartMaxTokens.value.trim() ? Number(smartMaxTokens.value.trim()) : undefined }; } else { delete payload.SmartRouter; }` +\n ` const cascadeLevels=extractCascadeLevelsFromForm();` +\n ` if(governanceEnabled.checked || governanceAlignmentEnabled.checked || governanceSummarizerModel.value.trim() || governanceSemanticEnabled.checked || governanceClassifierModel.value.trim() || governanceShadowEnabled.checked || governanceVerifierModel.value.trim() || cascadeLevels.length){ payload.Governance={ ...(payload.Governance || {}), enabled: governanceEnabled.checked, sticky:{ ...((payload.Governance && payload.Governance.sticky) || {}), enabled: Boolean(governanceEnabled.checked || governanceAlignmentEnabled.checked), alignment:{ ...(((payload.Governance && payload.Governance.sticky && payload.Governance.sticky.alignment) || {})), enabled: governanceAlignmentEnabled.checked, summarizer_model: governanceSummarizerModel.value.trim() } }, semantic:{ ...((payload.Governance && payload.Governance.semantic) || {}), enabled: governanceSemanticEnabled.checked, mode:'classifier', classifier_model: governanceClassifierModel.value.trim() }, shadow:{ ...((payload.Governance && payload.Governance.shadow) || {}), enabled: governanceShadowEnabled.checked, verifier_model: governanceVerifierModel.value.trim() }, cascade:{ ...((payload.Governance && payload.Governance.cascade) || {}), enabled: Boolean(cascadeLevels.length), levels: cascadeLevels } }; } else { delete payload.Governance; }` +\n ` return payload;` +\n `}` +\n `function renderConfigControlForms(config){` +\n ` const trigger=config?.TriggerRouter || {};` +\n ` triggerEnabled.checked=Boolean(trigger.enabled);` +\n ` triggerIntentEnabled.checked=Boolean(trigger.llm_intent_recognition);` +\n ` triggerAnalysisScope.value=trigger.analysis_scope || 'last_message';` +\n ` triggerIntentModel.value=trigger.intent_model || '';` +\n ` renderTriggerRulesList(trigger.rules || []);` +\n ` const smart=config?.SmartRouter || {};` +\n ` smartEnabled.checked=Boolean(smart.enabled);` +\n ` smartRouterModel.value=smart.router_model || '';` +\n ` smartFallback.value=smart.fallback || 'default';` +\n ` smartCacheTtl.value=smart.cache_ttl ?? '';` +\n ` smartMaxTokens.value=smart.max_tokens ?? '';` +\n ` renderSmartCandidatesList(smart.candidates || []);` +\n ` const governance=config?.Governance || {};` +\n ` governanceEnabled.checked=Boolean(governance.enabled);` +\n ` governanceAlignmentEnabled.checked=Boolean(governance.sticky?.alignment?.enabled);` +\n ` governanceSummarizerModel.value=governance.sticky?.alignment?.summarizer_model || '';` +\n ` governanceSemanticEnabled.checked=Boolean(governance.semantic?.enabled);` +\n ` governanceClassifierModel.value=governance.semantic?.classifier_model || '';` +\n ` governanceShadowEnabled.checked=Boolean(governance.shadow?.enabled);` +\n ` governanceVerifierModel.value=governance.shadow?.verifier_model || '';` +\n ` renderCascadeLevelsList(governance.cascade?.levels || []);` +\n `}` +\n `function syncDraftEditorFromForm(){` +\n ` try {` +\n ` const payload=buildDraftPayloadFromForm();` +\n ` currentDraftConfig=payload;` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` renderDraftSummary(payload);` +\n ` renderDraftValidation([],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u540C\u6B65 Models \u8868\u5355\u5230 JSON \u8349\u7A3F';` +\n ` } catch (error) {` +\n ` draftPreviewStatus.textContent='\u540C\u6B65\u5931\u8D25\uFF1A'+error.message;` +\n ` }` +\n `}` +\n `function applyReferenceSuggestion(path,modelId){` +\n ` if(!modelId){ return; }` +\n ` if(path==='Router.default'){ draftRouterDefault.value=modelId; syncDraftEditorFromForm(); draftPreviewStatus.textContent='\u5DF2\u5C06\u5EFA\u8BAE\u6A21\u578B\u5E94\u7528\u5230 Router.default'; return; }` +\n ` const payload=JSON.parse(JSON.stringify(currentDraftConfig || {}));` +\n ` const pathMatch=path.match(/^([^.\\[]+)(?:\\.(.+))?$/);` +\n ` if(!pathMatch){ draftPreviewStatus.textContent='\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u4FEE\u590D\uFF1A'+path; return; }` +\n ` const tokens=path.replace(/\\[(\\d+)\\]/g,'.$1').split('.');` +\n ` let cursor=payload;` +\n ` for(let i=0;i<tokens.length-1;i++){` +\n ` const token=tokens[i];` +\n ` const nextToken=tokens[i+1];` +\n ` if(cursor[token] === undefined){ cursor[token]=String(Number(nextToken))===nextToken ? [] : {}; }` +\n ` cursor=cursor[token];` +\n ` }` +\n ` cursor[tokens[tokens.length-1]]=modelId;` +\n ` currentDraftConfig=payload;` +\n ` if(payload.Router?.default){ draftRouterDefault.value=payload.Router.default; }` +\n ` renderConfigControlForms(payload);` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` renderDraftSummary(payload);` +\n ` renderDraftValidation([],[]);` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u5C06\u5EFA\u8BAE\u6A21\u578B\u5E94\u7528\u5230 '+path+'\uFF0C\u53EF\u91CD\u65B0\u9884\u89C8\u9A8C\u8BC1';` +\n `}` +\n `function applyCapabilityWarningSuggestion(path,code){` +\n ` const payload=JSON.parse(JSON.stringify(currentDraftConfig || {}));` +\n ` const tokens=String(path || '').replace(/\\[(\\d+)\\]/g,'.$1').split('.').filter(Boolean);` +\n ` if(!tokens.length){ draftPreviewStatus.textContent='\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u4FEE\u590D\u8BE5 warning'; return; }` +\n ` let cursor=payload;` +\n ` for(let i=0;i<tokens.length-1;i++){ if(cursor == null){ break; } cursor=cursor[tokens[i]]; }` +\n ` const lastToken=tokens[tokens.length-1];` +\n ` if(code==='thinking_ignored'){` +\n ` if(cursor && Object.prototype.hasOwnProperty.call(cursor,lastToken)){ delete cursor[lastToken]; }` +\n ` } else if(code==='tools_text_fallback' || code==='images_text_fallback'){` +\n ` if(cursor && Object.prototype.hasOwnProperty.call(cursor,lastToken)){ delete cursor[lastToken]; }` +\n ` if(cursor && !Object.keys(cursor).length){` +\n ` const parentTokens=tokens.slice(0,-1);` +\n ` const maybeMetadataKey=parentTokens[parentTokens.length-1];` +\n ` if(maybeMetadataKey==='metadata'){` +\n ` let parentCursor=payload;` +\n ` for(let i=0;i<parentTokens.length-1;i++){ if(parentCursor == null){ break; } parentCursor=parentCursor[parentTokens[i]]; }` +\n ` if(parentCursor && Object.prototype.hasOwnProperty.call(parentCursor,'metadata')){ delete parentCursor.metadata; }` +\n ` }` +\n ` }` +\n ` } else {` +\n ` draftPreviewStatus.textContent='\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u4FEE\u590D\u8BE5 warning';` +\n ` return;` +\n ` }` +\n ` currentDraftConfig=payload;` +\n ` renderModelsForm(payload.Models || []);` +\n ` renderConfigControlForms(payload);` +\n ` draftRouterDefault.value=payload.Router?.default || '';` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` renderDraftSummary(payload);` +\n ` renderDraftValidation([],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u5E94\u7528 warning \u4FEE\u6B63\uFF1A'+code+'\uFF0C\u53EF\u91CD\u65B0\u9884\u89C8\u9A8C\u8BC1';` +\n `}` +\n `function renderCompiledDiff(diff){` +\n ` const summary=diff?.summary || {};` +\n ` compiledDiffSummary.innerHTML=[` +\n \" ['Added providers', summary.addedProviders ?? 0],\" +\n \" ['Removed providers', summary.removedProviders ?? 0],\" +\n \" ['Changed providers', summary.changedProviders ?? 0],\" +\n \" ['Added models', summary.addedModels ?? 0],\" +\n \" ['Removed models', summary.removedModels ?? 0],\" +\n \" ['Changed models', summary.changedModels ?? 0]\" +\n ` ].map(([label,value])=>'<div class=\\\"diff-chip\\\"><span class=\\\"muted\\\">'+esc(label)+'</span><strong>'+esc(value)+'</strong></div>').join('');` +\n ` const rows=[` +\n ` ...((diff?.providerChanges || []).map(item=>({ scope:'provider', key:item.name, type:item.type, fields:item.fields || [], target:item.after || item.before || {} }))),` +\n ` ...((diff?.modelChanges || []).map(item=>({ scope:'model', key:item.modelId, type:item.type, fields:item.fields || [], target:item.after || item.before || {} }))),` +\n ` ];` +\n ` compiledDiffTableBody.innerHTML=rows.length ? rows.map(item=>'<tr>' +` +\n ` '<td>'+esc(item.scope)+'</td>' +` +\n ` '<td>'+esc(item.type)+'</td>' +` +\n ` '<td><code>'+esc(item.key)+'</code></td>' +` +\n ` '<td>'+esc(item.fields.join(', ') || '-')+'</td>' +` +\n ` '<td><code>'+esc(item.target.providerName || item.target.name || '-')+'</code><div class=\"muted\">'+esc(item.target.modelName || (item.target.models || []).join(', ') || '-')}</div></td>' +` +\n ` '</tr>').join('') : '<tr><td colspan=\"5\" class=\"muted\">No compiled registry changes</td></tr>';` +\n `}` +\n `function renderReferenceImpact(impact){` +\n ` const summary=impact?.summary || {};` +\n ` referenceImpactSummary.innerHTML=[` +\n \" ['Total refs', summary.total ?? 0],\" +\n \" ['modelId refs', summary.modelIdRefs ?? 0],\" +\n \" ['Legacy refs', summary.legacyRefs ?? 0],\" +\n \" ['Valid modelIds', summary.validModelIds ?? 0],\" +\n \" ['Missing modelIds', summary.missingModelIds ?? 0]\" +\n ` ].map(([label,value])=>'<div class=\\\"diff-chip\\\"><span class=\\\"muted\\\">'+esc(label)+'</span><strong>'+esc(value)+'</strong></div>').join('');` +\n ` const entries=impact?.entries || [];` +\n ` referenceImpactTableBody.innerHTML=entries.length ? entries.map(item=>'<tr>' +` +\n ` '<td><code>'+esc(item.path)+'</code></td>' +` +\n ` '<td><code>'+esc(item.value)+'</code></td>' +` +\n ` '<td>'+esc(item.referenceType)+'</td>' +` +\n ` '<td>'+esc(item.status)+'</td>' +` +\n ` '<td><code>'+esc(item.resolvedTarget?.providerName || '-')+'</code><div class=\"muted\">'+esc(item.resolvedTarget?.modelName || '-')}</div></td>' +` +\n ` '<td>'+((item.suggestions || []).length ? item.suggestions.map(s=>'<div><code>'+esc(s.modelId)+'</code><div class=\"muted\">'+esc(s.modelName || '-')+'</div><button type=\"button\" data-apply-reference-path=\\\"'+esc(item.path)+'\\\" data-apply-reference-model=\\\"'+esc(s.modelId)+'\\\">\u5E94\u7528\u5EFA\u8BAE</button></div>').join('') : '<span class=\"muted\">-</span>')+'</td>' +` +\n ` '</tr>').join('') : '<tr><td colspan=\"6\" class=\"muted\">No model references found</td></tr>';` +\n `}` +\n `function renderCompiledModels(data){` +\n ` const providers=Array.isArray(data.providers) ? data.providers : [];` +\n ` const modelMapEntries=Object.entries(data.modelMap || {});` +\n ` knownModelIds=modelMapEntries.map(([modelId])=>modelId).sort();` +\n ` updateTopLevelModelSuggestionLists();` +\n ` renderCapabilityWarnings(data.capabilityWarnings);` +\n ` compiledModelsStatus.textContent='\u5DF2\u52A0\u8F7D '+providers.length+' \u4E2A compiled provider / '+modelMapEntries.length+' \u4E2A modelId \u6620\u5C04';` +\n ` compiledProvidersTableBody.innerHTML=providers.length ? providers.map(provider=>'<tr>' +` +\n ` '<td><code>'+esc(provider.name)+'</code><div class=\"muted\">'+esc(provider.api_base_url || '-')+'</div></td>' +` +\n ` '<td>'+esc(provider.transformer?.use?.[0] || '-')+'</td>' +` +\n ` '<td>'+esc((provider.models || []).join(', ') || '-')+'</td>' +` +\n ` '<td>'+esc(JSON.stringify(provider.transformer || {}))+'</td>' +` +\n ` '<td>'+esc(provider.has_api_key ? 'configured' : 'missing')+'</td>' +` +\n ` '</tr>').join('') : '<tr><td colspan=\"5\" class=\"muted\">No compiled providers</td></tr>';` +\n ` compiledModelMapTableBody.innerHTML=modelMapEntries.length ? modelMapEntries.map(([modelId,item])=>'<tr>' +` +\n ` '<td><code>'+esc(modelId)+'</code></td>' +` +\n ` '<td><code>'+esc(item.providerName || '-')+'</code><div class=\"muted\">'+esc(item.modelName || '-')+'</div></td>' +` +\n ` '<td>'+esc(item.protocol || '-')+'</td>' +` +\n ` '<td>'+esc(item.compatibilityProfile || '-')+'</td>' +` +\n ` '<td>'+esc(item.dispatchFormat || '-')+'</td>' +` +\n ` '<td><code>'+esc(JSON.stringify(item.thinking || { mode: 'off' }))+'</code></td>' +` +\n ` '<td><code>'+esc(JSON.stringify(item.capabilities || {}))+'</code></td>' +` +\n ` '<td>'+esc(item.source || '-')+'</td>' +` +\n ` '</tr>').join('') : '<tr><td colspan=\"8\" class=\"muted\">No compiled model map</td></tr>';` +\n ` if(data.diff){ renderCompiledDiff(data.diff); }` +\n ` if(data.referenceImpact){ renderReferenceImpact(data.referenceImpact); }` +\n ` renderConfigControlForms(currentDraftConfig);` +\n `}` +\n `async function loadConfigDraft(){` +\n ` draftPreviewStatus.textContent='\u52A0\u8F7D\u5F53\u524D\u914D\u7F6E\u4E2D...';` +\n ` const res=await fetch('/api/config');` +\n ` const data=await res.json();` +\n ` currentDraftConfig=data || {};` +\n ` renderModelsForm(currentDraftConfig.Models || []);` +\n ` renderConfigControlForms(currentDraftConfig);` +\n ` draftRouterDefault.value=currentDraftConfig.Router?.default || '';` +\n ` configDraftEditor.value=JSON.stringify(data,null,2);` +\n ` renderDraftSummary(currentDraftConfig);` +\n ` renderDraftValidation([],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u8F7D\u5165\u5F53\u524D\u914D\u7F6E\uFF0C\u53EF\u901A\u8FC7 Models \u8868\u5355\u6216 JSON \u8349\u7A3F\u7F16\u8F91';` +\n `}` +\n `async function previewConfigDraft(){` +\n ` let payload;` +\n ` try {` +\n ` payload=buildDraftPayloadFromForm();` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` } catch (error) {` +\n ` renderDraftValidation(['JSON parse error: '+error.message],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u8349\u7A3F\u89E3\u6790\u5931\u8D25\uFF1A'+error.message;` +\n ` return;` +\n ` }` +\n ` draftPreviewStatus.textContent='\u9884\u89C8\u7F16\u8BD1\u7ED3\u679C\u4E2D...';` +\n ` const res=await fetch('/api/models/compiled/preview',{` +\n ` method:'POST',` +\n ` headers:{'Content-Type':'application/json'},` +\n ` body:JSON.stringify(payload)` +\n ` });` +\n ` const data=await res.json();` +\n ` if(!res.ok){` +\n ` draftPreviewStatus.textContent='\u9884\u89C8\u5931\u8D25\uFF1A'+((data.errors || []).join('; ') || data.message || 'unknown error');` +\n ` renderDraftValidation(data.errors || [data.message || 'unknown error'], data.warnings || []);` +\n ` renderCapabilityWarnings(data.capabilityWarnings);` +\n ` renderCompiledDiff();` +\n ` renderReferenceImpact(data.referenceImpact);` +\n ` renderDraftPreviewMeta();` +\n ` return;` +\n ` }` +\n ` renderDraftValidation([], data.warnings || []);` +\n ` renderCompiledModels(data);` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u9884\u89C8\u5B8C\u6210\uFF1A\u5DF2\u6309\u8349\u7A3F\u914D\u7F6E\u5237\u65B0 compiled models';` +\n `}` +\n `async function saveConfigDraft(){` +\n ` let payload;` +\n ` try {` +\n ` payload=buildDraftPayloadFromForm();` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` } catch (error) {` +\n ` renderDraftValidation(['JSON parse error: '+error.message],[]);` +\n ` renderCapabilityWarnings();` +\n ` draftPreviewStatus.textContent='\u4FDD\u5B58\u5931\u8D25\uFF1A'+error.message;` +\n ` return;` +\n ` }` +\n ` draftPreviewStatus.textContent='\u4FDD\u5B58\u914D\u7F6E\u4E2D...';` +\n ` const res=await fetch('/api/config',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(payload) });` +\n ` const data=await res.json();` +\n ` renderDraftValidation(data.errors || [], data.warnings || []);` +\n ` if(!res.ok){` +\n ` draftPreviewStatus.textContent='\u4FDD\u5B58\u5931\u8D25\uFF1A'+((data.errors || []).join('; ') || data.message || 'unknown error');` +\n ` return;` +\n ` }` +\n ` currentDraftConfig=payload;` +\n ` await loadCompiledModels();` +\n ` draftPreviewStatus.textContent='\u5DF2\u4FDD\u5B58\u914D\u7F6E'+((data.warnings || []).length ? ('\uFF08\u542B '+data.warnings.length+' \u6761 warning\uFF09') : '');` +\n `}` +\n `function addDraftModel(){` +\n ` const nextModels=extractModelsFromForm();` +\n ` nextModels.push(createDraftModelFromTemplate(defaultProviderTemplateKey));` +\n ` renderModelsForm(nextModels);` +\n ` syncDraftEditorFromForm();` +\n `}` +\n `function addTriggerRule(){ const next=extractTriggerRulesFromForm(); next.push({ name:'', enabled:true, priority:10, model:'', patterns:[{ type:'exact', keywords:[] }] }); renderTriggerRulesList(next); syncDraftEditorFromForm(); }` +\n `function addTriggerPattern(ruleIndex){ const next=extractTriggerRulesFromForm(); if(!next[ruleIndex]){ return; } next[ruleIndex].patterns = Array.isArray(next[ruleIndex].patterns) ? next[ruleIndex].patterns : []; next[ruleIndex].patterns.push({ type:'exact', keywords:[] }); renderTriggerRulesList(next); syncDraftEditorFromForm(); }` +\n `function addTriggerKeyword(ruleIndex,patternIndex){ const next=extractTriggerRulesFromForm(); if(!next[ruleIndex] || !next[ruleIndex].patterns || !next[ruleIndex].patterns[patternIndex]){ return; } const pattern=next[ruleIndex].patterns[patternIndex]; pattern.keywords=Array.isArray(pattern.keywords) ? pattern.keywords : []; pattern.keywords.push(''); renderTriggerRulesList(next); syncDraftEditorFromForm(); }` +\n `function addSmartCandidate(){ const next=extractSmartCandidatesFromForm(); next.push({ model:'', description:'' }); renderSmartCandidatesList(next); syncDraftEditorFromForm(); }` +\n `function addCascadeLevel(){ const next=extractCascadeLevelsFromForm(); next.push({ from:'', to:'' }); renderCascadeLevelsList(next); syncDraftEditorFromForm(); }` +\n `modelsFormGrid.addEventListener('input',()=>syncDraftEditorFromForm());` +\n `modelsFormGrid.addEventListener('change',()=>syncDraftEditorFromForm());` +\n `modelsFormGrid.addEventListener('click',(e)=>{ const applyBtn=e.target.closest('button[data-apply-template]'); if(applyBtn){ const applyIndex=Number(applyBtn.dataset.applyTemplate); applyProviderTemplate(applyIndex); syncDraftEditorFromForm(); return; } const btn=e.target.closest('button[data-remove-model]'); if(!btn){ return; } const removeIndex=Number(btn.dataset.removeModel); const nextModels=extractModelsFromForm().filter((_,index)=>index!==removeIndex); renderModelsForm(nextModels); syncDraftEditorFromForm(); });` +\n `triggerRulesList.addEventListener('input',()=>syncDraftEditorFromForm());` +\n `triggerRulesList.addEventListener('change',()=>syncDraftEditorFromForm());` +\n `triggerRulesList.addEventListener('click',(e)=>{ const addKeywordBtn=e.target.closest('button[data-add-trigger-keyword]'); if(addKeywordBtn){ addTriggerKeyword(Number(addKeywordBtn.dataset.addTriggerKeyword), Number(addKeywordBtn.dataset.patternIndex)); return; } const removeKeywordBtn=e.target.closest('button[data-remove-trigger-keyword]'); if(removeKeywordBtn){ const ruleIndex=Number(removeKeywordBtn.dataset.removeTriggerKeyword); const patternIndex=Number(removeKeywordBtn.dataset.patternIndex); const keywordIndex=Number(removeKeywordBtn.dataset.keywordIndex); const next=extractTriggerRulesFromForm(); if(next[ruleIndex] && next[ruleIndex].patterns && next[ruleIndex].patterns[patternIndex]){ const pattern=next[ruleIndex].patterns[patternIndex]; pattern.keywords=(pattern.keywords || []).filter((_,index)=>index!==keywordIndex); if(!pattern.keywords.length){ pattern.keywords=['']; } renderTriggerRulesList(next); syncDraftEditorFromForm(); } return; } const addBtn=e.target.closest('button[data-add-trigger-pattern]'); if(addBtn){ addTriggerPattern(Number(addBtn.dataset.addTriggerPattern)); return; } const removePatternBtn=e.target.closest('button[data-remove-trigger-pattern]'); if(removePatternBtn){ const ruleIndex=Number(removePatternBtn.dataset.removeTriggerPattern); const patternIndex=Number(removePatternBtn.dataset.patternIndex); const next=extractTriggerRulesFromForm(); if(next[ruleIndex]){ next[ruleIndex].patterns=(next[ruleIndex].patterns || []).filter((_,index)=>index!==patternIndex); if(!next[ruleIndex].patterns.length){ next[ruleIndex].patterns=[{ type:'exact', keywords:[] }]; } renderTriggerRulesList(next); syncDraftEditorFromForm(); } return; } const btn=e.target.closest('button[data-remove-trigger-rule]'); if(!btn){ return; } const next=extractTriggerRulesFromForm().filter((_,index)=>index!==Number(btn.dataset.removeTriggerRule)); renderTriggerRulesList(next); syncDraftEditorFromForm(); });` +\n `smartCandidatesList.addEventListener('input',()=>syncDraftEditorFromForm());` +\n `smartCandidatesList.addEventListener('change',()=>syncDraftEditorFromForm());` +\n `smartCandidatesList.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-remove-smart-candidate]'); if(!btn){ return; } const next=extractSmartCandidatesFromForm().filter((_,index)=>index!==Number(btn.dataset.removeSmartCandidate)); renderSmartCandidatesList(next); syncDraftEditorFromForm(); });` +\n `governanceCascadeLevelsList.addEventListener('input',()=>syncDraftEditorFromForm());` +\n `governanceCascadeLevelsList.addEventListener('change',()=>syncDraftEditorFromForm());` +\n `governanceCascadeLevelsList.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-remove-cascade-level]'); if(!btn){ return; } const next=extractCascadeLevelsFromForm().filter((_,index)=>index!==Number(btn.dataset.removeCascadeLevel)); renderCascadeLevelsList(next); syncDraftEditorFromForm(); });` +\n `referenceImpactTableBody.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-apply-reference-path]'); if(!btn){ return; } applyReferenceSuggestion(btn.dataset.applyReferencePath, btn.dataset.applyReferenceModel); });` +\n `draftValidationList.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-validation-path]'); if(!btn){ return; } jumpToValidationPath(btn.dataset.validationPath); });` +\n `capabilityWarningsList.addEventListener('click',(e)=>{ const applyBtn=e.target.closest('button[data-apply-warning-path]'); if(applyBtn){ applyCapabilityWarningSuggestion(applyBtn.dataset.applyWarningPath, applyBtn.dataset.applyWarningCode); return; } const btn=e.target.closest('button[data-validation-path]'); if(!btn){ return; } jumpToValidationPath(btn.dataset.validationPath); });` +\n `draftRouterDefault.addEventListener('input',syncDraftEditorFromForm);` +\n `[triggerEnabled,triggerIntentEnabled,triggerAnalysisScope,triggerIntentModel,smartEnabled,smartRouterModel,smartFallback,smartCacheTtl,smartMaxTokens,governanceEnabled,governanceAlignmentEnabled,governanceSummarizerModel,governanceSemanticEnabled,governanceClassifierModel,governanceShadowEnabled,governanceVerifierModel].forEach(el=>{ el.addEventListener('input',syncDraftEditorFromForm); el.addEventListener('change',syncDraftEditorFromForm); });` +\n `function renderMetrics(metrics){` +\n ` metricsGrid.innerHTML=[` +\n \" ['Recent traces', metrics.totalTraces ?? 0],\" +\n \" ['Sticky hit rate', pct(metrics.stickyHitRate)],\" +\n \" ['Cascade rate', pct(metrics.cascadeTriggeredRate)],\" +\n \" ['Shadow rate', pct(metrics.shadowCheckedRate)],\" +\n \" ['Alignment rate', pct(metrics.alignmentUsedRate)],\" +\n \" ['Avg latency', fmt(metrics.averageLatencyMs)+' ms']\" +\n ` ].map(([label,value])=>'<div class=\\\"stat\\\"><span class=\\\"muted\\\">'+esc(label)+'</span><strong>'+esc(value)+'</strong></div>').join('');` +\n `}` +\n `function buildPresetPayload(presetName){` +\n ` const preset=draftPresets[presetName];` +\n ` if(!preset){ return null; }` +\n ` const overwriteMode=draftPresetMode.value === 'replace';` +\n ` const payload=buildDraftPayloadFromForm();` +\n ` if(overwriteMode){ delete payload.TriggerRouter; delete payload.SmartRouter; delete payload.Governance; }` +\n ` if(preset.routerDefault){ payload.Router={ ...(payload.Router || {}), default: resolvePresetModelId(preset.routerDefault) }; }` +\n ` if(preset.triggerEnabled !== undefined || preset.triggerRules){ payload.TriggerRouter={ ...(payload.TriggerRouter || {}), enabled: preset.triggerEnabled !== undefined ? Boolean(preset.triggerEnabled) : Boolean(payload.TriggerRouter?.enabled), analysis_scope: payload.TriggerRouter?.analysis_scope || 'last_message', llm_intent_recognition: payload.TriggerRouter?.llm_intent_recognition || false, intent_model: payload.TriggerRouter?.intent_model || '', rules: preset.triggerRules ? preset.triggerRules.map(rule=>({ ...rule, model: resolvePresetModelId(rule.model) })) : (payload.TriggerRouter?.rules || []) }; }` +\n ` if(preset.smartEnabled !== undefined || preset.smartCandidates){ payload.SmartRouter={ ...(payload.SmartRouter || {}), enabled: preset.smartEnabled !== undefined ? Boolean(preset.smartEnabled) : Boolean(payload.SmartRouter?.enabled), router_model: payload.SmartRouter?.router_model || '', fallback: payload.SmartRouter?.fallback || 'default', candidates: preset.smartCandidates ? preset.smartCandidates.map(item=>({ ...item, model: resolvePresetModelId(item.model) })) : (payload.SmartRouter?.candidates || []), cache_ttl: payload.SmartRouter?.cache_ttl, max_tokens: payload.SmartRouter?.max_tokens }; }` +\n ` if(preset.governanceEnabled !== undefined || preset.governanceAlignmentEnabled !== undefined || preset.governanceSemanticEnabled !== undefined || preset.governanceShadowEnabled !== undefined || preset.governanceSummarizerModel !== undefined || preset.governanceClassifierModel !== undefined || preset.governanceVerifierModel !== undefined){ payload.Governance={ ...(payload.Governance || {}), enabled: preset.governanceEnabled !== undefined ? Boolean(preset.governanceEnabled) : Boolean(payload.Governance?.enabled), sticky:{ ...((payload.Governance && payload.Governance.sticky) || {}), alignment:{ ...(((payload.Governance && payload.Governance.sticky && payload.Governance.sticky.alignment) || {})), enabled: preset.governanceAlignmentEnabled !== undefined ? Boolean(preset.governanceAlignmentEnabled) : Boolean(payload.Governance?.sticky?.alignment?.enabled), summarizer_model: preset.governanceSummarizerModel !== undefined ? resolvePresetModelId(preset.governanceSummarizerModel) : (payload.Governance?.sticky?.alignment?.summarizer_model || '') } }, semantic:{ ...((payload.Governance && payload.Governance.semantic) || {}), enabled: preset.governanceSemanticEnabled !== undefined ? Boolean(preset.governanceSemanticEnabled) : Boolean(payload.Governance?.semantic?.enabled), mode:(payload.Governance?.semantic?.mode || 'classifier'), classifier_model: preset.governanceClassifierModel !== undefined ? resolvePresetModelId(preset.governanceClassifierModel) : (payload.Governance?.semantic?.classifier_model || '') }, shadow:{ ...((payload.Governance && payload.Governance.shadow) || {}), enabled: preset.governanceShadowEnabled !== undefined ? Boolean(preset.governanceShadowEnabled) : Boolean(payload.Governance?.shadow?.enabled), verifier_model: preset.governanceVerifierModel !== undefined ? resolvePresetModelId(preset.governanceVerifierModel) : (payload.Governance?.shadow?.verifier_model || '') } }; }` +\n ` return payload;` +\n `}` +\n `function applyDraftPreset(presetName){` +\n ` const payload=buildPresetPayload(presetName);` +\n ` if(!payload){ return; }` +\n ` currentDraftConfig=payload;` +\n ` renderModelsForm(payload.Models || []);` +\n ` renderConfigControlForms(payload);` +\n ` draftRouterDefault.value=payload.Router?.default || '';` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` renderDraftSummary(payload);` +\n ` renderDraftValidation([],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u5E94\u7528\u9884\u8BBE\uFF1A'+presetName+'\uFF08'+(draftPresetMode.value === 'replace' ? 'overwrite' : 'append / merge')+'\uFF09';` +\n `}` +\n `async function previewDraftPreset(presetName){` +\n ` const payload=buildPresetPayload(presetName);` +\n ` if(!payload){ return; }` +\n ` const preset=draftPresets[presetName];` +\n ` const modeLabel=draftPresetMode.value === 'replace' ? 'overwrite' : 'append / merge';` +\n ` renderDraftPreviewMeta({ title:'Preset dry-run', description:(preset?.label || presetName)+' \u4EC5\u9884\u89C8\uFF0C\u4E0D\u4F1A\u5199\u56DE\u5F53\u524D\u8349\u7A3F\u3002', affects:preset?.affects || [], actualAffects:[], mode:modeLabel });` +\n ` draftPreviewStatus.textContent='\u9884\u89C8\u9884\u8BBE\u4E2D\uFF1A'+presetName;` +\n ` const res=await fetch('/api/models/compiled/preview',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(payload) });` +\n ` const data=await res.json();` +\n ` if(!res.ok){ renderDraftValidation(data.errors || [data.message || 'unknown error'], data.warnings || []); renderCapabilityWarnings(data.capabilityWarnings); renderCompiledDiff(); renderReferenceImpact(data.referenceImpact); renderDraftPreviewMeta({ title:'Preset dry-run', description:(preset?.label || presetName)+' \u9884\u89C8\u5931\u8D25\uFF0C\u4EE5\u4E0B\u4E3A\u5F53\u524D\u9884\u89C8\u5C1D\u8BD5\u547D\u4E2D\u7684\u533A\u57DF\u3002', affects:preset?.affects || [], actualAffects:deriveActualAffectedAreas(data), mode:modeLabel }); draftPreviewStatus.textContent='\u9884\u8BBE\u9884\u89C8\u5931\u8D25\uFF1A'+((data.errors || []).join('; ') || data.message || 'unknown error'); return; }` +\n ` renderDraftValidation([], data.warnings || []);` +\n ` renderCompiledModels(data);` +\n ` renderDraftPreviewMeta({ title:'Preset dry-run', description:(preset?.label || presetName)+' \u4EC5\u9884\u89C8\uFF0C\u4E0D\u4F1A\u5199\u56DE\u5F53\u524D\u8349\u7A3F\u3002', affects:preset?.affects || [], actualAffects:deriveActualAffectedAreas(data), mode:modeLabel });` +\n ` draftPreviewStatus.textContent='\u5DF2\u9884\u89C8\u9884\u8BBE\uFF1A'+presetName+'\uFF08\u672A\u5199\u56DE\u8349\u7A3F\uFF09';` +\n `}` +\n `function renderRanking(target,entries,emptyLabel){` +\n ` if(!entries || !entries.length){ target.innerHTML='<li><span class=\"muted\">'+esc(emptyLabel)+'</span><strong>0</strong></li>'; return; }` +\n ` target.innerHTML=entries.map(item=>'<li><span><code>'+esc(item.key)+'</code></span><strong>'+esc(item.count)+' \u00B7 '+esc(pct(item.rate))+'</strong></li>').join('');` +\n `}` +\n `function renderAnomalies(anomalies){` +\n ` if(!anomalies || !anomalies.length){ anomalyList.innerHTML='<div class=\"alert info\"><strong>No active alerts</strong><div class=\"muted\">\u5F53\u524D\u7A97\u53E3\u672A\u53D1\u73B0\u660E\u663E\u6CBB\u7406\u5F02\u5E38</div></div>'; return; }` +\n ` anomalyList.innerHTML=anomalies.map(item=>'<div class=\"alert '+esc(item.severity || 'info')+'\"><strong>'+esc(item.type)+'</strong><div>'+esc(item.message)+'</div></div>').join('');` +\n `}` +\n `function renderBuckets(report){` +\n ` const buckets=report.buckets || [];` +\n ` const windowMs=Number(report.windowMs || 0);` +\n ` bucketHint.textContent=windowMs ? ('\u6700\u8FD1 '+Math.round(windowMs / 60000)+' \u5206\u949F\uFF0C\u5171 '+(report.bucketCount || buckets.length || 0)+' \u6876') : '\u5F53\u524D\u672A\u542F\u7528\u65F6\u95F4\u7A97';` +\n ` if(!buckets.length){ bucketGrid.innerHTML='<div class=\"stat\"><span class=\"muted\">No bucket data</span><strong>0</strong></div>'; return; }` +\n ` bucketGrid.innerHTML=buckets.map(bucket=>` +\n \" '<div class=\\\"stat\\\">'+\"\n + \"'<span class=\\\"muted\\\">'+esc(shortTime(bucket.bucketStart))+' - '+esc(shortTime(bucket.bucketEnd))+'</span>'+\"\n + \"'<strong>'+esc(bucket.metrics.totalTraces)+'</strong>'+\"\n + \"'<div class=\\\"muted\\\">sticky '+esc(pct(bucket.metrics.stickyHitRate))+' / cascade '+esc(pct(bucket.metrics.cascadeTriggeredRate))+'</div>'+\"\n + \"'</div>'\"\n + `).join('');` +\n `}` +\n `function renderTrendTable(report){` +\n ` const buckets=report.buckets || [];` +\n ` if(!buckets.length){ trendTableBody.innerHTML='<tr><td colspan=\"6\" class=\"muted\">No trend data</td></tr>'; return; }` +\n ` trendTableBody.innerHTML=buckets.map(bucket=>'<tr>' +` +\n ` '<td>'+esc(shortTime(bucket.bucketStart))+' - '+esc(shortTime(bucket.bucketEnd))+'</td>' +` +\n ` '<td>'+esc(bucket.metrics.totalTraces)+'</td>' +` +\n ` '<td>'+esc(pct(bucket.metrics.stickyHitRate))+'</td>' +` +\n ` '<td>'+esc(pct(bucket.metrics.cascadeTriggeredRate))+'</td>' +` +\n ` '<td>'+esc(pct(bucket.metrics.shadowCheckedRate))+'</td>' +` +\n ` '<td>'+esc(pct(bucket.metrics.alignmentUsedRate))+'</td>' +` +\n ` '</tr>').join('');` +\n `}` +\n `function renderExportHistory(data){` +\n ` const exports=(data.exports || []);` +\n ` const schedules=(data.schedules || []);` +\n ` exportTableBody.innerHTML=exports.length ? exports.map(item=>'<tr><td><code>'+esc(item.id)+'</code></td><td>'+esc(item.kind)+'</td><td>'+esc(item.format)+'</td><td>'+esc(new Date(item.createdAt).toISOString())+'</td></tr>').join('') : '<tr><td colspan=\"4\" class=\"muted\">No exports yet</td></tr>';` +\n ` scheduleTableBody.innerHTML=schedules.length ? schedules.map(item=>'<tr><td><code>'+esc(item.id)+'</code></td><td>'+esc(item.intervalMs)+' ms</td><td>'+esc(item.format)+'</td><td>'+esc(item.lastRunAt ? new Date(item.lastRunAt).toISOString() : '-')}</td></tr>').join('') : '<tr><td colspan=\"4\" class=\"muted\">No schedules yet</td></tr>';` +\n `}` +\n `function renderArchives(data){` +\n ` const archives=(data.archives || []);` +\n ` archiveTableBody.innerHTML=archives.length ? archives.map(item=>'<tr><td><code>'+esc(item.file)+'</code></td><td>'+esc(item.startedAt ? new Date(item.startedAt).toISOString().slice(0,10) : '-')+' ~ '+esc(item.endedAt ? new Date(item.endedAt).toISOString().slice(0,10) : '-')+'</td><td>'+esc(item.traceCount)+'</td><td>'+esc(item.compressed ? 'yes' : 'no')+'</td></tr>').join('') : '<tr><td colspan=\"4\" class=\"muted\">No archives found</td></tr>';` +\n `}` +\n `async function loadCompiledModels(){` +\n ` compiledModelsStatus.textContent='\u52A0\u8F7D compiled models \u4E2D...';` +\n ` const res=await fetch('/api/models/compiled');` +\n ` const data=await res.json();` +\n ` renderDraftValidation([], data.warnings || []);` +\n ` renderCompiledModels(data);` +\n ` renderCompiledDiff();` +\n ` renderReferenceImpact();` +\n `}` +\n `async function loadTraces(){` +\n ` const requestId=document.getElementById('requestId').value.trim();` +\n ` const sessionKey=document.getElementById('sessionKey').value.trim();` +\n ` const routeReason=document.getElementById('routeReason').value.trim();` +\n ` const cascadeTriggered=document.getElementById('cascadeTriggered').value;` +\n ` const shadowChecked=document.getElementById('shadowChecked').value;` +\n ` const windowMs=document.getElementById('windowMs').value;` +\n ` const minSampleSize=document.getElementById('minSampleSize').value.trim();` +\n ` const cascadeWarnRate=document.getElementById('cascadeWarnRate').value.trim();` +\n ` const shadowWarnRate=document.getElementById('shadowWarnRate').value.trim();` +\n ` const latencyWarnMs=document.getElementById('latencyWarnMs').value.trim();` +\n ` const limit=document.getElementById('limit').value.trim();` +\n ` const params=new URLSearchParams();` +\n ` if(requestId) params.set('requestId',requestId);` +\n ` if(sessionKey) params.set('sessionKey',sessionKey);` +\n ` if(routeReason) params.set('routeReason',routeReason);` +\n ` if(cascadeTriggered) params.set('cascadeTriggered',cascadeTriggered);` +\n ` if(shadowChecked) params.set('shadowChecked',shadowChecked);` +\n ` if(windowMs) params.set('windowMs',windowMs);` +\n ` if(minSampleSize) params.set('minSampleSize',minSampleSize);` +\n ` if(cascadeWarnRate) params.set('cascadeWarnRate',cascadeWarnRate);` +\n ` if(shadowWarnRate) params.set('shadowWarnRate',shadowWarnRate);` +\n ` if(latencyWarnMs) params.set('latencyWarnMs',latencyWarnMs);` +\n ` params.set('bucketCount','6');` +\n ` if(limit) params.set('limit',limit);` +\n ` tbody.innerHTML='<tr><td colspan=\"6\" class=\"muted\">\u52A0\u8F7D\u4E2D...</td></tr>';` +\n ` const query=params.toString()?('?'+params.toString()):'';` +\n ` const [traceRes,metricsRes]=await Promise.all([` +\n ` fetch('/api/governance/traces'+query),` +\n ` fetch('/api/governance/metrics'+query)` +\n ` ]);` +\n ` const data=await traceRes.json();` +\n ` const metricsData=await metricsRes.json();` +\n ` renderMetrics(metricsData.metrics || {});` +\n ` renderBuckets(metricsData || {});` +\n ` renderAnomalies(metricsData.anomalies || []);` +\n ` renderRanking(routeRanking,metricsData.topRouteReasons || [],'No routes');` +\n ` renderRanking(modelRanking,metricsData.topFinalModels || [],'No models');` +\n ` renderRanking(intentRanking,metricsData.topSemanticIntents || [],'No intents');` +\n ` renderTrendTable(metricsData || {});` +\n ` const traces=data.traces || [];` +\n ` if(!traces.length){ tbody.innerHTML='<tr><td colspan=\"6\" class=\"muted\">\u6682\u65E0 trace</td></tr>'; return; }` +\n ` tbody.innerHTML=traces.map(t=>` +\n \" `<tr>`+\" +\n \" `<td><code>${esc(t.requestId)}</code></td>`+\" +\n \" `<td>${t.sessionKey ? `<span class=\\\"pill\\\">${esc(t.sessionKey)}</span>` : '<span class=\\\"muted\\\">-</span>'}</td>`+\" +\n \" `<td><code>${esc(t.finalModel || '')}</code></td>`+\" +\n \" `<td>${(t.routeReason || []).map(r=>`<span class=\\\"pill\\\">${esc(r)}</span>`).join(' ')}</td>`+\" +\n \" `<td>${esc(t.latencyMs ?? '')}</td>`+\" +\n \" `<td><button data-request=\\\"${esc(t.requestId)}\\\">View</button></td>`+\" +\n \" `</tr>`\" +\n ` ).join('');` +\n `}` +\n `async function loadDetail(requestId){` +\n ` const res=await fetch('/api/governance/traces/'+encodeURIComponent(requestId));` +\n ` const data=await res.json();` +\n ` detailHint.textContent='\u5F53\u524D\u67E5\u770B\uFF1A'+requestId;` +\n ` detail.textContent=JSON.stringify(data,null,2);` +\n `}` +\n `async function loadExports(){` +\n ` const res=await fetch('/api/governance/metrics/exports');` +\n ` renderExportHistory(await res.json());` +\n `}` +\n `async function createSnapshot(){` +\n ` snapshotStatus.textContent='\u521B\u5EFA\u5FEB\u7167\u4E2D...';` +\n ` const res=await fetch('/api/governance/metrics/snapshots',{` +\n ` method:'POST',` +\n ` headers:{'Content-Type':'application/json'},` +\n ` body:JSON.stringify({ format: document.getElementById('snapshotFormat').value, windowMs: Number(document.getElementById('windowMs').value || 0) || undefined })` +\n ` });` +\n ` const data=await res.json();` +\n ` snapshotStatus.textContent=res.ok ? ('\u5DF2\u521B\u5EFA\uFF1A'+data.export.id) : ('\u521B\u5EFA\u5931\u8D25\uFF1A'+(data.message || 'unknown error'));` +\n ` if(res.ok) await loadExports();` +\n `}` +\n `async function loadArchives(){` +\n ` archiveStatus.textContent='\u52A0\u8F7D\u5F52\u6863\u4E2D...';` +\n ` const params=new URLSearchParams();` +\n ` const archiveDate=document.getElementById('archiveDate').value.trim();` +\n ` const archivePage=document.getElementById('archivePage').value.trim();` +\n ` const archivePageSize=document.getElementById('archivePageSize').value.trim();` +\n ` if(archiveDate) params.set('date',archiveDate);` +\n ` if(archivePage) params.set('page',archivePage);` +\n ` if(archivePageSize) params.set('pageSize',archivePageSize);` +\n ` const res=await fetch('/api/governance/archives'+(params.toString()?('?'+params.toString()):''));` +\n ` const data=await res.json();` +\n ` renderArchives(data);` +\n ` archiveStatus.textContent='\u5F52\u6863\u52A0\u8F7D\u5B8C\u6210';` +\n `}` +\n `async function saveThresholds(){` +\n ` const payload={` +\n ` min_sample_size:Number(document.getElementById('minSampleSize').value || 0),` +\n ` cascade_warn_rate:Number(document.getElementById('cascadeWarnRate').value || 0),` +\n ` shadow_warn_rate:Number(document.getElementById('shadowWarnRate').value || 0),` +\n ` latency_warn_ms:Number(document.getElementById('latencyWarnMs').value || 0)` +\n ` };` +\n ` saveThresholdsStatus.textContent='\u4FDD\u5B58\u4E2D...';` +\n ` const res=await fetch('/api/governance/observability/anomaly-thresholds',{` +\n ` method:'POST',` +\n ` headers:{'Content-Type':'application/json'},` +\n ` body:JSON.stringify(payload)` +\n ` });` +\n ` const data=await res.json();` +\n ` if(!res.ok){ saveThresholdsStatus.textContent='\u4FDD\u5B58\u5931\u8D25\uFF1A'+(data.message || 'unknown error'); return; }` +\n ` saveThresholdsStatus.textContent='\u5DF2\u4FDD\u5B58\u5230\u914D\u7F6E\u6587\u4EF6';` +\n `}` +\n `document.getElementById('refreshBtn').addEventListener('click',loadTraces);` +\n `document.getElementById('loadConfigDraftBtn').addEventListener('click',loadConfigDraft);` +\n `document.getElementById('addModelDraftBtn').addEventListener('click',addDraftModel);` +\n `document.getElementById('applyBalancedPresetBtn').addEventListener('click',()=>applyDraftPreset('balanced'));` +\n `document.getElementById('previewBalancedPresetBtn').addEventListener('click',()=>previewDraftPreset('balanced'));` +\n `document.getElementById('applyFastPresetBtn').addEventListener('click',()=>applyDraftPreset('fast'));` +\n `document.getElementById('previewFastPresetBtn').addEventListener('click',()=>previewDraftPreset('fast'));` +\n `document.getElementById('applyGovernancePresetBtn').addEventListener('click',()=>applyDraftPreset('governance'));` +\n `document.getElementById('previewGovernancePresetBtn').addEventListener('click',()=>previewDraftPreset('governance'));` +\n `document.getElementById('addTriggerRuleBtn').addEventListener('click',addTriggerRule);` +\n `document.getElementById('addSmartCandidateBtn').addEventListener('click',addSmartCandidate);` +\n `document.getElementById('addCascadeLevelBtn').addEventListener('click',addCascadeLevel);` +\n `document.getElementById('syncDraftJsonBtn').addEventListener('click',syncDraftEditorFromForm);` +\n `document.getElementById('previewConfigDraftBtn').addEventListener('click',previewConfigDraft);` +\n `document.getElementById('saveConfigDraftBtn').addEventListener('click',saveConfigDraft);` +\n `draftPresetMode.addEventListener('change',renderDraftPresetModeHint);` +\n `document.getElementById('createSnapshotBtn').addEventListener('click',createSnapshot);` +\n `document.getElementById('loadArchivesBtn').addEventListener('click',loadArchives);` +\n `document.getElementById('saveThresholdsBtn').addEventListener('click',saveThresholds);` +\n `tbody.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-request]'); if(btn){ loadDetail(btn.dataset.request); } });` +\n `renderDraftPresetGuide();` +\n `renderDraftPresetModeHint();` +\n `renderDraftPreviewMeta();` +\n `loadConfigDraft();` +\n `loadCompiledModels();` +\n `loadExports();` +\n `loadArchives();` +\n `loadTraces();` +\n `</script>` +\n `</body></html>`\n );\n });\n\r\n return server;\r\n};\r\n", "/**\n * Router\n *\n * \u8DEF\u7531\u903B\u8F91\uFF0C\u590D\u7528\u81EA claude-code-router\n */\n\nimport {\n MessageCreateParamsBase,\n MessageParam,\n Tool,\n} from \"@anthropic-ai/sdk/resources/messages\";\nimport { get_encoding } from \"tiktoken\";\nimport { IAppConfig } from '../trigger/types';\nimport { sessionUsageCache, Usage } from './cache';\nimport { log, logError } from '../utils/log';\nimport { getCompiledModelRef, resolveModelReference } from '../models/compile';\n\nconst enc = get_encoding(\"cl100k_base\");\n\n/**\n * \u8BA1\u7B97 token \u6570\u91CF\n */\nconst calculateTokenCount = (\n messages: MessageParam[],\n system: any,\n tools: Tool[]\n) => {\n let tokenCount = 0;\n if (Array.isArray(messages)) {\n messages.forEach((message) => {\n if (typeof message.content === \"string\") {\n tokenCount += enc.encode(message.content).length;\n } else if (Array.isArray(message.content)) {\n message.content.forEach((contentPart: any) => {\n if (contentPart.type === \"text\") {\n tokenCount += enc.encode(contentPart.text).length;\n } else if (contentPart.type === \"tool_use\") {\n tokenCount += enc.encode(JSON.stringify(contentPart.input)).length;\n } else if (contentPart.type === \"tool_result\") {\n tokenCount += enc.encode(\n typeof contentPart.content === \"string\"\n ? contentPart.content\n : JSON.stringify(contentPart.content)\n ).length;\n }\n });\n }\n });\n }\n if (typeof system === \"string\") {\n tokenCount += enc.encode(system).length;\n } else if (Array.isArray(system)) {\n system.forEach((item: any) => {\n if (item.type !== \"text\") return;\n if (typeof item.text === \"string\") {\n tokenCount += enc.encode(item.text).length;\n } else if (Array.isArray(item.text)) {\n item.text.forEach((textPart: any) => {\n tokenCount += enc.encode(textPart || \"\").length;\n });\n }\n });\n }\n if (tools) {\n tools.forEach((tool: Tool) => {\n if (tool.description) {\n tokenCount += enc.encode(tool.name + tool.description).length;\n }\n if (tool.input_schema) {\n tokenCount += enc.encode(JSON.stringify(tool.input_schema)).length;\n }\n });\n }\n return tokenCount;\n};\n\n/**\n * \u83B7\u53D6\u4F7F\u7528\u7684\u6A21\u578B\n */\nconst getUseModel = async (\n req: any,\n tokenCount: number,\n config: IAppConfig,\n lastUsage?: Usage | undefined\n) => {\n // \u5982\u679C\u6A21\u578B\u5DF2\u7ECF\u5305\u542B\u9017\u53F7\uFF08\u5DF2\u7ECF\u88AB\u89E6\u53D1\u8DEF\u7531\u8BBE\u7F6E\uFF09\uFF0C\u76F4\u63A5\u8FD4\u56DE\n const explicitModel = resolveModelReference(config, req.body.model);\n if (explicitModel && explicitModel.includes(\",\")) {\n return explicitModel;\n }\n\n // if tokenCount is greater than the configured threshold, use the long context model\n const longContextThreshold = config.Router.longContextThreshold || 60000;\n const lastUsageThreshold =\n lastUsage &&\n lastUsage.input_tokens > longContextThreshold &&\n tokenCount > 20000;\n const tokenCountThreshold = tokenCount > longContextThreshold;\n if (\n (lastUsageThreshold || tokenCountThreshold) &&\n config.Router.longContext\n ) {\n log(\n \"Using long context model due to token count:\",\n tokenCount,\n \"threshold:\",\n longContextThreshold\n );\n return resolveModelReference(config, config.Router.longContext);\n }\n\n // \u5B50\u4EE3\u7406\u6A21\u578B\u6807\u8BB0\n if (\n req.body?.system?.length > 1 &&\n req.body?.system[1]?.text?.startsWith(\"<CTR-SUBAGENT-MODEL>\")\n ) {\n const model = req.body?.system[1].text.match(\n /<CTR-SUBAGENT-MODEL>(.*?)<\\/CTR-SUBAGENT-MODEL>/s\n );\n if (model) {\n req.body.system[1].text = req.body.system[1].text.replace(\n `<CTR-SUBAGENT-MODEL>${model[1]}</CTR-SUBAGENT-MODEL>`,\n \"\"\n );\n return resolveModelReference(config, model[1]);\n }\n }\n\n // If the model is claude-3-5-haiku, use the background model\n if (\n req.body.model?.startsWith(\"claude-3-5-haiku\") &&\n config.Router.background\n ) {\n log(\"Using background model for \", req.body.model);\n return resolveModelReference(config, config.Router.background);\n }\n\n // if exits thinking, use the think model\n if (req.body.thinking && config.Router.think) {\n log(\"Using think model for \", req.body.thinking);\n return resolveModelReference(config, config.Router.think);\n }\n\n // web search\n if (\n Array.isArray(req.body.tools) &&\n req.body.tools.some((tool: any) => tool.type?.startsWith(\"web_search\")) &&\n config.Router.webSearch\n ) {\n return resolveModelReference(config, config.Router.webSearch);\n }\n\n return resolveModelReference(config, config.Router!.default);\n};\n\nconst applyModelThinking = (req: any, config: IAppConfig, modelRef?: string): void => {\n const compiled = getCompiledModelRef(config, modelRef);\n const thinking = compiled?.thinking;\n\n if (!thinking) {\n return;\n }\n\n if (thinking.mode === 'off') {\n delete req.body.thinking;\n return;\n }\n\n if (thinking.mode === 'on') {\n req.body.thinking = {\n ...(typeof req.body.thinking === 'object' && req.body.thinking ? req.body.thinking : { type: 'enabled' }),\n type: 'enabled',\n };\n }\n\n if (thinking.mode === 'auto' && !req.body.thinking) {\n return;\n }\n\n if (!req.body.thinking) {\n req.body.thinking = { type: 'enabled' };\n }\n\n if (thinking.effort) {\n req.body.thinking.effort = thinking.effort;\n }\n\n if (thinking.budget_tokens) {\n req.body.thinking.budget_tokens = thinking.budget_tokens;\n }\n};\n\n/**\n * \u8DEF\u7531\u4E2D\u95F4\u4EF6\n */\nexport const router = async (req: any, _res: any, context: any) => {\n const { config, event } = context;\n\n // Parse sessionId from metadata.user_id\n if (req.body.metadata?.user_id) {\n const parts = req.body.metadata.user_id.split(\"_session_\");\n if (parts.length > 1) {\n req.sessionId = parts[1];\n }\n }\n\n const lastMessageUsage = sessionUsageCache.get(req.sessionId);\n const { messages, system = [], tools }: MessageCreateParamsBase = req.body;\n\n try {\n const tokenCount = calculateTokenCount(\n messages as MessageParam[],\n system,\n tools as Tool[]\n );\n\n let model;\n\n // \u81EA\u5B9A\u4E49\u8DEF\u7531\u5668\uFF08\u89E6\u53D1\u8DEF\u7531\u5DF2\u547D\u4E2D\u65F6\u8DF3\u8FC7\uFF0C\u907F\u514D\u8986\u76D6\u66F4\u9AD8\u4F18\u5148\u7EA7\u7684\u9009\u62E9\uFF09\n if (config.CUSTOM_ROUTER_PATH && !req.body.model.includes(\",\")) {\n try {\n const customRouter = require(config.CUSTOM_ROUTER_PATH);\n req.tokenCount = tokenCount;\n model = await customRouter(req, config, {\n event\n });\n } catch (e: any) {\n logError(\"failed to load custom router\", e.message);\n }\n }\n\n // \u5982\u679C\u6CA1\u6709\u901A\u8FC7\u89E6\u53D1\u8DEF\u7531\u6216\u81EA\u5B9A\u4E49\u8DEF\u7531\u8BBE\u7F6E\u6A21\u578B\uFF0C\u4F7F\u7528\u539F\u6709\u903B\u8F91\n if (!model && !req.body.model.includes(\",\")) {\n model = await getUseModel(req, tokenCount, config, lastMessageUsage);\n }\n\n // \u5982\u679C\u89E6\u53D1\u8DEF\u7531\u5DF2\u547D\u4E2D\uFF08\u6A21\u578B\u542B\u9017\u53F7\uFF09\uFF0C\u4FDD\u7559\u5176\u9009\u62E9\n req.body.model = model ?? req.body.model;\n applyModelThinking(req, config, req.body.model);\n req.tokenCount = tokenCount;\n } catch (error: any) {\n logError(\"Error in router middleware:\", error.message);\n req.body.model = config.Router!.default;\n }\n\n return;\n};\n", "/**\n * Auth Middleware\n *\n * \u8BA4\u8BC1\u4E2D\u95F4\u4EF6\n */\n\nimport { FastifyRequest, FastifyReply } from \"fastify\";\nimport { IAppConfig } from \"../trigger/types\";\n\n/**\n * API Key \u8BA4\u8BC1\u4E2D\u95F4\u4EF6\n */\nexport function apiKeyAuth(config: IAppConfig) {\n return (req: FastifyRequest, reply: FastifyReply, done: (err?: Error) => void) => {\n // \u5982\u679C\u6CA1\u6709\u914D\u7F6E APIKEY\uFF0C\u8DF3\u8FC7\u8BA4\u8BC1\n if (!config.APIKEY) {\n done();\n return;\n }\n\n // \u4ECE\u8BF7\u6C42\u5934\u83B7\u53D6 API Key\n const authHeader = req.headers.authorization;\n const xApiKey = req.headers[\"x-api-key\"];\n\n let providedKey: string | undefined;\n\n if (authHeader?.startsWith(\"Bearer \")) {\n providedKey = authHeader.slice(7);\n } else if (xApiKey) {\n providedKey = xApiKey as string;\n }\n\n if (!providedKey || providedKey !== config.APIKEY) {\n reply.code(401).send({ error: \"Unauthorized\" });\n done(new Error(\"Unauthorized\"));\n return;\n }\n\n done();\n };\n}\n", "/**\n * Process Check Utilities\n *\n * \u8FDB\u7A0B\u68C0\u67E5\u548C\u7BA1\u7406\u5DE5\u5177\n */\n\nimport { existsSync, readFileSync, unlinkSync, writeFileSync } from \"fs\";\nimport { spawnSync } from \"child_process\";\nimport { DEFAULT_CONFIG, PID_FILE } from \"../constants\";\nimport { logError } from \"./log\";\n\n/**\n * \u8DE8\u5E73\u53F0\u68C0\u67E5\u8FDB\u7A0B\u662F\u5426\u5B58\u5728\n */\nfunction isProcessAlive(pid: number): boolean {\n try {\n if (process.platform === \"win32\") {\n // Windows: \u4F7F\u7528 tasklist \u67E5\u8BE2 PID\n const result = spawnSync(\"tasklist\", [\"/FI\", `PID eq ${pid}`, \"/NH\", \"/FO\", \"CSV\"], {\n encoding: \"utf-8\",\n timeout: 3000,\n });\n return result.stdout?.includes(`\"${pid}\"`) ?? false;\n } else {\n // Unix: \u53D1\u9001\u4FE1\u53F7 0 \u68C0\u67E5\u8FDB\u7A0B\u662F\u5426\u5B58\u5728\n process.kill(pid, 0);\n return true;\n }\n } catch {\n return false;\n }\n}\n\nexport async function waitForProcessExit(pid: number, timeoutMs = 5000): Promise<boolean> {\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeoutMs) {\n if (!isProcessAlive(pid)) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return !isProcessAlive(pid);\n}\n\n/**\n * \u8DE8\u5E73\u53F0\u7EC8\u6B62\u8FDB\u7A0B\n */\nexport function killProcess(pid: number): void {\n if (process.platform === \"win32\") {\n spawnSync(\"taskkill\", [\"/F\", \"/PID\", String(pid)], { timeout: 5000 });\n } else {\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {\n // \u8FDB\u7A0B\u53EF\u80FD\u5DF2\u7ECF\u9000\u51FA\n }\n }\n}\n\n/**\n * \u68C0\u67E5\u670D\u52A1\u662F\u5426\u6B63\u5728\u8FD0\u884C\n */\nexport function isServiceRunning(): boolean {\n const info = readServiceInfo();\n if (!info || isNaN(info.pid) || info.pid <= 0) {\n cleanupPidFile();\n return false;\n }\n\n if (isProcessAlive(info.pid)) {\n return true;\n }\n\n // \u8FDB\u7A0B\u4E0D\u5B58\u5728\uFF0C\u6E05\u7406 PID \u6587\u4EF6\n cleanupPidFile();\n return false;\n}\n\n/**\n * PID \u6587\u4EF6\u4E2D\u7684\u670D\u52A1\u5143\u6570\u636E\n */\nexport interface IServiceInfo {\n pid: number;\n port: number;\n startTime: string;\n}\n\n/**\n * \u4FDD\u5B58 PID \u53CA\u670D\u52A1\u5143\u6570\u636E\n */\nexport function savePid(pid: number, port?: number): void {\n const info: IServiceInfo = {\n pid,\n port: port ?? DEFAULT_CONFIG.PORT,\n startTime: new Date().toISOString(),\n };\n writeFileSync(PID_FILE, JSON.stringify(info, null, 2), \"utf-8\");\n}\n\n/**\n * \u8BFB\u53D6\u670D\u52A1\u5143\u6570\u636E\uFF0C\u517C\u5BB9\u65E7\u7248\u7EAF\u6570\u5B57\u683C\u5F0F\n */\nexport function readServiceInfo(): IServiceInfo | null {\n if (!existsSync(PID_FILE)) return null;\n try {\n const content = readFileSync(PID_FILE, \"utf-8\").trim();\n // \u517C\u5BB9\u65E7\u683C\u5F0F\uFF08\u7EAF\u6570\u5B57 PID\uFF09\n if (/^\\d+$/.test(content)) {\n return { pid: parseInt(content, 10), port: DEFAULT_CONFIG.PORT, startTime: '' };\n }\n return JSON.parse(content) as IServiceInfo;\n } catch {\n return null;\n }\n}\n\n/**\n * \u6E05\u7406 PID \u6587\u4EF6\n */\nexport function cleanupPidFile(): void {\n if (existsSync(PID_FILE)) {\n try {\n unlinkSync(PID_FILE);\n } catch (error) {\n logError(\"Failed to cleanup PID file:\", error);\n }\n }\n}\n", "/**\n * SSE Serializer Transform\n *\n * Server-Sent Events \u5E8F\u5217\u5316\u8F6C\u6362\u6D41\n */\n\nexport class SSESerializerTransform {\n constructor() {\n const transformStream = new TransformStream({\n transform: (event: any, controller) => {\n let output = \"\";\n\n if (event.event) {\n output += `event: ${event.event}\\n`;\n }\n\n if (event.data) {\n const dataStr =\n typeof event.data === \"string\"\n ? event.data\n : JSON.stringify(event.data);\n output += `data: ${dataStr}\\n`;\n }\n\n output += \"\\n\";\n\n controller.enqueue(new TextEncoder().encode(output));\n },\n });\n\n // Copy readable and writable to this instance\n this.readable = transformStream.readable;\n this.writable = transformStream.writable;\n }\n\n readable: ReadableStream<any>;\n writable: WritableStream<any>;\n}\n", "/**\n * Rewrite Stream\n *\n * \u6D41\u91CD\u5199\u5DE5\u5177\n */\n\n/**\n * \u91CD\u5199\u6D41\n * \u5141\u8BB8\u5BF9 SSE \u6D41\u8FDB\u884C\u8F6C\u6362\u5904\u7406\n */\nexport function rewriteStream(\n stream: ReadableStream,\n handler: (\n data: any,\n controller: any\n ) => Promise<any>\n): ReadableStream {\n const reader = stream.getReader();\n\n return new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n break;\n }\n\n const result = await handler(value, controller);\n\n if (result !== undefined) {\n controller.enqueue(result);\n }\n }\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n}\n", "/**\n * Image Agent\n *\n * \u56FE\u50CF\u5904\u7406 Agent\n */\n\nimport { IAgent, ITool } from \"./type\";\nimport { LRUCache } from \"lru-cache\";\nimport { logDebug } from \"../utils/log\";\nimport { toAnthropicMessagesRequest } from \"../protocols/anthropic\";\n\ninterface ImageCacheEntry {\n source: any;\n timestamp: number;\n}\n\n/**\n * \u56FE\u50CF\u7F13\u5B58\n */\nclass ImageCache {\n private cache: LRUCache<string, ImageCacheEntry>;\n\n constructor(maxSize = 100) {\n this.cache = new LRUCache({\n max: maxSize,\n ttl: 24 * 60 * 60 * 1000,\n });\n }\n\n storeImage(id: string, source: any): void {\n if (this.hasImage(id)) return;\n this.cache.set(id, {\n source,\n timestamp: Date.now(),\n });\n }\n\n getImage(id: string): any {\n const entry = this.cache.get(id);\n return entry ? entry.source : null;\n }\n\n hasImage(hash: string): boolean {\n return this.cache.has(hash);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\nconst imageCache = new ImageCache();\n\n/**\n * \u56FE\u50CF Agent\n */\nexport class ImageAgent implements IAgent {\n name = \"image\";\n tools: Map<string, ITool>;\n\n constructor() {\n this.tools = new Map<string, ITool>();\n this.appendTools();\n }\n\n shouldHandle(req: any, config: any): boolean {\n if (!config.Router?.image || req.body.model === config.Router.image)\n return false;\n\n const lastMessage = req.body.messages[req.body.messages.length - 1];\n\n if (\n !config.forceUseImageAgent &&\n lastMessage.role === \"user\" &&\n Array.isArray(lastMessage.content) &&\n lastMessage.content.find((item: any) => item.type === \"image\")\n ) {\n req.body.model = config.Router.image;\n return false;\n }\n\n return req.body.messages.some(\n (msg: any) =>\n msg.role === \"user\" &&\n Array.isArray(msg.content) &&\n msg.content.some((item: any) => item.type === \"image\")\n );\n }\n\n appendTools() {\n this.tools.set(\"analyzeImage\", {\n name: \"analyzeImage\",\n description:\n \"Analyse image or images by ID and extract information such as OCR text, objects, layout, colors, or safety signals.\",\n input_schema: {\n type: \"object\",\n properties: {\n imageId: {\n type: \"array\",\n description: \"an array of IDs to analyse\",\n items: {\n type: \"string\",\n },\n },\n task: {\n type: \"string\",\n description:\n \"Details of task to perform on the image.The more detailed, the better\",\n },\n regions: {\n type: \"array\",\n description: \"Optional regions of interest within the image\",\n items: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"Optional label for the region\",\n },\n x: { type: \"number\", description: \"X coordinate\" },\n y: { type: \"number\", description: \"Y coordinate\" },\n w: { type: \"number\", description: \"Width of the region\" },\n h: { type: \"number\", description: \"Height of the region\" },\n units: {\n type: \"string\",\n enum: [\"px\", \"pct\"],\n description: \"Units for coordinates and size\",\n },\n },\n required: [\"x\", \"y\", \"w\", \"h\", \"units\"],\n },\n },\n },\n required: [\"imageId\", \"task\"],\n },\n handler: async (args, context) => {\n logDebug(\"analyzeImage args:\", JSON.stringify(args, null, 2));\n const imageMessages = [];\n let imageId;\n\n if (args.imageId && Array.isArray(args.imageId)) {\n args.imageId.forEach((imgId: string) => {\n const image = imageCache.getImage(\n `${context.req.id}_Image#${imgId}`\n );\n if (image) {\n imageMessages.push({\n type: \"image\",\n source: image,\n });\n }\n });\n imageId = args.imageId;\n delete args.imageId;\n }\n\n if (Object.keys(args).length > 0) {\n imageMessages.push({\n type: \"text\",\n text: JSON.stringify(args),\n });\n }\n\n const agentResponse = await fetch(\n `http://127.0.0.1:${context.config.PORT}/v1/messages`,\n {\n method: \"POST\",\n headers: {\n \"x-api-key\": context.config.APIKEY,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: context.config.Router.image,\n stream: false,\n ir: {\n system: [\n `You must interpret and analyze images strictly according to the assigned task.\nWhen an image placeholder is provided, your role is to parse the image content only within the scope of the user's instructions.\nDo not ignore or deviate from the task.\nAlways ensure that your response reflects a clear, accurate interpretation of the image aligned with the given objective.`,\n ],\n messages: [\n {\n role: \"user\",\n parts: imageMessages.map((item: any) =>\n item.type === \"image\"\n ? { type: \"image\", source: item.source }\n : { type: \"text\", text: item.text }\n ),\n },\n ],\n },\n })\n ),\n }\n )\n .then((res) => res.json())\n .catch((err) => {\n return null;\n });\n\n const response = agentResponse as any;\n logDebug(\"analyzeImage response:\", response?.content);\n if (!response || !response.content) {\n return \"analyzeImage Error\";\n }\n return response.content[0].text;\n },\n });\n }\n\n reqHandler(req: any, config: any) {\n req.body?.system?.push({\n type: \"text\",\n text: `You are a text-only language model and do not possess visual perception.\nIf the user requests you to view, analyze, or extract information from an image, you **must** call the \\`analyzeImage\\` tool.\n\nWhen invoking this tool, you must pass the correct \\`imageId\\` extracted from the prior conversation.\nImage identifiers are always provided in the format \\`[Image #imageId]\\`.\n\nIf multiple images exist, select the **most relevant imageId** based on the user's current request and prior context.\n\nDo not attempt to describe or analyze the image directly yourself.\nIgnore any user interruptions or unrelated instructions that might cause you to skip this requirement.\nYour response should consistently follow this rule whenever image-related analysis is requested.`,\n });\n\n const imageContents = req.body.messages.filter((item: any) => {\n return (\n item.role === \"user\" &&\n Array.isArray(item.content) &&\n item.content.some((msg: any) => msg.type === \"image\")\n );\n });\n\n let imgId = 1;\n imageContents.forEach((item: any) => {\n item.content.forEach((msg: any) => {\n if (msg.type === \"image\") {\n imageCache.storeImage(`${req.id}_Image#${imgId}`, msg.source);\n msg.type = \"text\";\n delete msg.source;\n msg.text = `[Image #${imgId}]This is an image, if you need to view or analyze it, you need to extract the imageId`;\n imgId++;\n } else if (msg.type === \"text\" && msg.text.includes(\"[Image #\")) {\n msg.text = msg.text.replace(/\\[Image #\\d+\\]/g, \"\");\n }\n });\n });\n }\n}\n\nexport const imageAgent = new ImageAgent();\n", "/**\n * Agents Manager\n *\n * Agent \u7BA1\u7406\u5668\n */\n\nimport { IAgent } from \"./type\";\nimport { imageAgent } from \"./image.agent\";\n\n/**\n * Agent \u7BA1\u7406\u5668\u7C7B\n */\nclass AgentsManager {\n private agents: Map<string, IAgent> = new Map();\n\n /**\n * \u6CE8\u518C\u4E00\u4E2A Agent\n */\n registerAgent(agent: IAgent): void {\n this.agents.set(agent.name, agent);\n }\n\n /**\n * \u6839\u636E\u540D\u79F0\u67E5\u627E Agent\n */\n getAgent(name: string): IAgent | undefined {\n return this.agents.get(name);\n }\n\n /**\n * \u83B7\u53D6\u6240\u6709\u5DF2\u6CE8\u518C\u7684 Agents\n */\n getAllAgents(): IAgent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * \u83B7\u53D6\u6240\u6709 Agent \u7684\u5DE5\u5177\n */\n getAllTools(): any[] {\n const allTools: any[] = [];\n for (const agent of this.agents.values()) {\n allTools.push(...agent.tools.values());\n }\n return allTools;\n }\n}\n\nconst agentsManager = new AgentsManager();\nagentsManager.registerAgent(imageAgent);\n\nexport default agentsManager;\n", "/**\n * Trigger Router Type Definitions\n *\n * \u89E6\u53D1\u8DEF\u7531\u5668\u7684\u6838\u5FC3\u7C7B\u578B\u5B9A\u4E49\n */\n\nimport { MessageParam } from \"@anthropic-ai/sdk/resources/messages\";\nimport { IGovernanceConfig, IGovernanceTrace } from '../governance/types';\n\n/**\n * \u89E6\u53D1\u6A21\u5F0F\u7C7B\u578B\n */\nexport type PatternType = 'exact' | 'regex';\n\n/**\n * \u89E6\u53D1\u6A21\u5F0F\u914D\u7F6E\n */\nexport interface ITriggerPattern {\n /** \u6A21\u5F0F\u7C7B\u578B\uFF1A\u7CBE\u786E\u5339\u914D\u6216\u6B63\u5219\u8868\u8FBE\u5F0F */\n type: PatternType;\n\n /** \u7CBE\u786E\u5339\u914D\u7684\u5173\u952E\u8BCD\u5217\u8868\uFF08type=exact \u65F6\u4F7F\u7528\uFF09 */\n keywords?: string[];\n\n /** \u6B63\u5219\u8868\u8FBE\u5F0F\u6A21\u5F0F\uFF08type=regex \u65F6\u4F7F\u7528\uFF09 */\n pattern?: string;\n\n /** \u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\uFF0C\u9ED8\u8BA4 false */\n caseSensitive?: boolean;\n}\n\n/**\n * \u89E6\u53D1\u89C4\u5219\n */\nexport interface ITriggerRule {\n /** \u89C4\u5219\u540D\u79F0\uFF0C\u7528\u4E8E\u65E5\u5FD7\u548C\u8C03\u8BD5 */\n name: string;\n\n /** \u4F18\u5148\u7EA7\uFF0C\u6570\u503C\u8D8A\u5927\u4F18\u5148\u7EA7\u8D8A\u9AD8\uFF0C\u9ED8\u8BA4 0 */\n priority: number;\n\n /** \u662F\u5426\u542F\u7528\u6B64\u89C4\u5219\uFF0C\u9ED8\u8BA4 true */\n enabled: boolean;\n\n /** \u89E6\u53D1\u6A21\u5F0F\u5217\u8868\uFF0C\u4EFB\u4E00\u6A21\u5F0F\u5339\u914D\u5373\u89E6\u53D1 */\n patterns: ITriggerPattern[];\n\n /** \u76EE\u6807\u6A21\u578B\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\n model: string;\n\n /** \u89C4\u5219\u63CF\u8FF0 */\n description?: string;\n\n /** \u89C4\u5219\u7EA7\u8BED\u4E49\u753B\u50CF\uFF0C\u7528\u4E8E\u7EDF\u4E00 Router \u8FD0\u884C\u65F6\u8BED\u4E49\u5339\u914D */\n semantic_profile?: {\n enabled?: boolean;\n prototype?: string;\n threshold?: number;\n };\n}\n\n/**\n * \u5206\u6790\u8303\u56F4\n */\nexport type AnalysisScope = 'last_message' | 'full_conversation';\n\n/**\n * \u89E6\u53D1\u8DEF\u7531\u914D\u7F6E\n */\nexport interface ITriggerConfig {\n /** \u662F\u5426\u542F\u7528\u89E6\u53D1\u8DEF\u7531\uFF0C\u9ED8\u8BA4 true */\n enabled: boolean;\n\n /** \u5206\u6790\u8303\u56F4\uFF1A\u6700\u540E\u4E00\u6761\u6D88\u606F\u6216\u5B8C\u6574\u5BF9\u8BDD\u5386\u53F2 */\n analysis_scope: AnalysisScope;\n\n /** \u662F\u5426\u542F\u7528 LLM \u610F\u56FE\u8BC6\u522B\uFF0C\u9ED8\u8BA4 false */\n llm_intent_recognition: boolean;\n\n /** \u610F\u56FE\u8BC6\u522B\u4F7F\u7528\u7684\u6A21\u578B\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\n intent_model?: string;\n\n /** \u89E6\u53D1\u89C4\u5219\u5217\u8868 */\n rules: ITriggerRule[];\n}\n\n/**\n * \u5206\u6790\u7ED3\u679C\n */\nexport interface IAnalysisResult {\n /** \u662F\u5426\u5339\u914D\u5230\u89C4\u5219 */\n matched: boolean;\n\n /** \u5339\u914D\u7684\u89C4\u5219\uFF08\u5982\u679C\u5339\u914D\u6210\u529F\uFF09 */\n rule?: ITriggerRule;\n\n /** \u9009\u4E2D\u7684\u6A21\u578B\uFF08\u5982\u679C\u5339\u914D\u6210\u529F\uFF09 */\n model?: string;\n\n /** \u5339\u914D\u7F6E\u4FE1\u5EA6 0-1 */\n confidence: number;\n\n /** \u5206\u6790\u8017\u65F6\uFF08\u6BEB\u79D2\uFF09 */\n analysisTime: number;\n\n /** \u5206\u6790\u7684\u6587\u672C\u5185\u5BB9 */\n analyzedText?: string;\n\n /** \u8DEF\u7531\u6765\u6E90 */\n routeSource?: 'trigger_rule' | 'semantic_match' | 'smart_router' | 'sticky_correction' | 'intent_fallback';\n}\n\n/**\n * \u5339\u914D\u7ED3\u679C\n */\nexport interface IMatchResult {\n /** \u662F\u5426\u5339\u914D */\n matched: boolean;\n\n /** \u5339\u914D\u7684\u6A21\u5F0F */\n pattern?: ITriggerPattern;\n\n /** \u5339\u914D\u7684\u5173\u952E\u8BCD\uFF08\u7CBE\u786E\u5339\u914D\u65F6\uFF09 */\n matchedKeyword?: string;\n\n /** \u6B63\u5219\u5339\u914D\u7ED3\u679C\uFF08\u6B63\u5219\u5339\u914D\u65F6\uFF09 */\n regexMatch?: RegExpMatchArray;\n}\n\n/**\n * \u610F\u56FE\u8BC6\u522B\u7ED3\u679C\n */\nexport interface IIntentResult {\n /** \u8BC6\u522B\u5230\u7684\u610F\u56FE */\n intent: string;\n\n /** \u7F6E\u4FE1\u5EA6 0-1 */\n confidence: number;\n\n /** \u76F8\u5173\u7684\u89C4\u5219\u540D\u79F0 */\n relatedRule?: string;\n}\n\n/**\n * \u5B8C\u6574\u914D\u7F6E\uFF08\u5305\u542B\u539F\u6709\u914D\u7F6E\u548C\u89E6\u53D1\u914D\u7F6E\uFF09\n */\nexport interface IAppConfig {\n // \u539F\u6709\u914D\u7F6E\n APIKEY?: string;\n HOST?: string;\n PORT?: number;\n PROXY_URL?: string;\n LOG?: boolean;\n LOG_LEVEL?: string;\n API_TIMEOUT_MS?: number;\n NON_INTERACTIVE_MODE?: boolean;\n\n /** \u6A21\u578B\u63D0\u4F9B\u5546\u914D\u7F6E */\n Providers: IProvider[];\n\n /** \u7B80\u5316\u6A21\u578B\u63A5\u5165\u914D\u7F6E */\n Models?: IModelEndpointConfig[];\n\n /** \u539F\u6709\u8DEF\u7531\u914D\u7F6E */\n Router: IRouterConfig;\n\n /** \u89E6\u53D1\u8DEF\u7531\u914D\u7F6E */\n TriggerRouter?: ITriggerConfig;\n\n /** \u667A\u80FD\u8DEF\u7531\u914D\u7F6E */\n SmartRouter?: ISmartRouterConfig;\n\n /** \u6CBB\u7406\u5C42\u914D\u7F6E */\n Governance?: IGovernanceConfig;\n\n /** \u81EA\u5B9A\u4E49\u8DEF\u7531\u5668\u8DEF\u5F84 */\n CUSTOM_ROUTER_PATH?: string;\n\n /** \u5F3A\u5236\u6240\u6709\u56FE\u7247\u8BF7\u6C42\u8D70 Image Agent \u6A21\u5F0F\uFF08\u9ED8\u8BA4 false\uFF09 */\n forceUseImageAgent?: boolean;\n}\n\n/**\n * \u63D0\u4F9B\u5546\u914D\u7F6E\n */\nexport interface IProvider {\n name: string;\n api_base_url: string;\n api_key: string;\n models: string[];\n transformer?: any;\n}\n\nexport interface IModelThinkingConfig {\n mode?: 'off' | 'auto' | 'on';\n effort?: 'low' | 'medium' | 'high';\n budget_tokens?: number;\n}\n\nexport type TModelThinkingAlias = 'off' | 'auto' | 'on' | 'low' | 'medium' | 'high';\n\nexport interface IModelEndpointMetadata {\n label?: string;\n vendor_hint?: string;\n supports_tools?: boolean;\n supports_reasoning?: boolean;\n supports_images?: boolean;\n}\n\nexport interface ICompiledModelCapabilities {\n thinking: {\n supported: boolean;\n mode?: 'off' | 'auto' | 'on';\n effort?: 'low' | 'medium' | 'high';\n budget_tokens?: number;\n };\n tools: boolean;\n images: boolean;\n systemMessageStyle: 'openai' | 'anthropic';\n}\n\nexport interface IModelEndpointConfig {\n id: string;\n api?: string;\n api_base_url?: string;\n key?: string;\n api_key?: string;\n interface?: 'openai' | 'anthropic';\n protocol?: 'openai' | 'anthropic';\n model: string;\n thinking?: IModelThinkingConfig | TModelThinkingAlias;\n metadata?: IModelEndpointMetadata;\n}\n\n/**\n * \u539F\u6709\u8DEF\u7531\u914D\u7F6E\n */\nexport interface IRouterConfig {\n default: string;\n background?: string;\n think?: string;\n longContext?: string;\n longContextThreshold?: number;\n webSearch?: string;\n image?: string;\n routes?: Array<{\n name: string;\n model: string;\n description?: string;\n priority?: number;\n enabled?: boolean;\n match?: {\n keywords?: string[];\n regex?: string;\n semantic?: boolean;\n semantic_profile?: {\n prototype?: string;\n threshold?: number;\n };\n };\n }>;\n decision?: {\n smart_fallback?: boolean;\n router_model?: string;\n candidates?: ISmartRouterCandidate[];\n cache_ttl?: number;\n max_tokens?: number;\n fallback?: 'default' | 'skip';\n router_hint?: {\n include_task_summary?: boolean;\n include_top_route_candidates?: boolean;\n };\n };\n defaults?: {\n sticky?: IGovernanceConfig['sticky'];\n semantic?: IGovernanceConfig['semantic'];\n route_trace?: boolean;\n };\n}\n\n/**\n * SmartRouter \u5019\u9009\u6A21\u578B\n */\nexport interface ISmartRouterCandidate {\n /** \u6A21\u578B\u6807\u8BC6\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\n model: string;\n\n /** \u6A21\u578B\u80FD\u529B\u63CF\u8FF0\uFF0C\u7528\u4E8E\u544A\u77E5 router_model \u8BE5\u6A21\u578B\u64C5\u957F\u4EC0\u4E48 */\n description: string;\n}\n\n/**\n * SmartRouter \u914D\u7F6E\n */\nexport interface ISmartRouterConfig {\n /** \u662F\u5426\u542F\u7528 SmartRouter\uFF0C\u9ED8\u8BA4 false */\n enabled: boolean;\n\n /** \u7528\u4E8E\u9009\u62E9\u6A21\u578B\u7684\u8DEF\u7531 LLM\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\n router_model: string;\n\n /** \u5019\u9009\u6A21\u578B\u5217\u8868\uFF08\u81F3\u5C11 2 \u4E2A\uFF09 */\n candidates: ISmartRouterCandidate[];\n\n /** \u7F13\u5B58 TTL\uFF08\u6BEB\u79D2\uFF09\uFF0C\u9ED8\u8BA4 600000\uFF0810 \u5206\u949F\uFF09 */\n cache_ttl?: number;\n\n /** router_model \u6700\u5927 token \u6570\uFF0C\u9ED8\u8BA4 256 */\n max_tokens?: number;\n\n /**\n * SmartRouter \u65E0\u7ED3\u679C\u65F6\u7684\u56DE\u9000\u7B56\u7565\n * - \"default\"\uFF1A\u7EE7\u7EED\u6267\u884C\u540E\u7EED\u8DEF\u7531\u94FE\uFF08\u9ED8\u8BA4\uFF09\n * - \"skip\"\uFF1A\u8DF3\u8FC7 SmartRouter\uFF0C\u76F4\u63A5\u8D70\u540E\u7EED\u8DEF\u7531\u94FE\n */\n fallback?: 'default' | 'skip';\n\n /** \u7ED3\u6784\u5316 router hint\uFF0C\u5E2E\u52A9\u8DEF\u7531\u6A21\u578B\u57FA\u4E8E\u9884\u7B5B\u9009\u7ED3\u679C\u505A\u515C\u5E95\u88C1\u51B3 */\n router_hint?: {\n include_task_summary?: boolean;\n include_top_route_candidates?: boolean;\n };\n}\n\n/**\n * \u8BF7\u6C42\u4E0A\u4E0B\u6587\uFF08\u6269\u5C55 FastifyRequest\uFF09\n */\nexport interface IRequestContext {\n /** \u4F1A\u8BDD ID */\n sessionId?: string;\n\n /** Token \u6570\u91CF */\n tokenCount?: number;\n\n /** \u4F7F\u7528\u7684 agents */\n agents?: string[];\n\n /** \u89E6\u53D1\u5206\u6790\u7ED3\u679C */\n triggerResult?: IAnalysisResult;\n\n /** \u8BF7\u6C42 ID */\n id?: string;\n\n /** \u6CBB\u7406\u8FFD\u8E2A\u4FE1\u606F */\n governanceTrace?: IGovernanceTrace;\n\n /** \u8BF7\u6C42 URL */\n url?: string;\n\n /** \u8FD0\u884C\u65F6\u5E94\u7528\u914D\u7F6E\uFF0C\u7528\u4E8E\u89E3\u6790 modelId \u7B49\u9AD8\u5C42\u62BD\u8C61 */\n appConfig?: IAppConfig;\n\n /** \u8BF7\u6C42\u4F53 */\n body: {\n model: string;\n messages: MessageParam[];\n system?: any;\n tools?: any[];\n thinking?: any;\n metadata?: any;\n };\n}\n", "/**\n * Pattern Matcher\n *\n * \u6A21\u5F0F\u5339\u914D\u5668\uFF0C\u652F\u6301\u7CBE\u786E\u5339\u914D\u548C\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\n */\n\nimport { ITriggerPattern, IMatchResult } from './types';\nimport { LRUCache } from 'lru-cache';\nimport { logError, logWarn } from '../utils/log';\n\n/**\n * \u6B63\u5219\u8868\u8FBE\u5F0F\u7F13\u5B58\n * \u907F\u514D\u91CD\u590D\u7F16\u8BD1\u76F8\u540C\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\n */\nconst regexCache = new LRUCache<string, RegExp>({\n max: 100,\n ttl: 1000 * 60 * 30, // 30 \u5206\u949F\n});\n\n/**\n * \u6A21\u5F0F\u5339\u914D\u5668\u7C7B\n */\nexport class PatternMatcher {\n /**\n * \u7CBE\u786E\u5339\u914D\n * \u68C0\u67E5\u6587\u672C\u662F\u5426\u5305\u542B\u4EFB\u4E00\u5173\u952E\u8BCD\n *\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\n * @param keywords \u5173\u952E\u8BCD\u5217\u8868\n * @param caseSensitive \u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\n * @returns \u5339\u914D\u7ED3\u679C\n */\n matchExact(\n text: string,\n keywords: string[],\n caseSensitive: boolean = false\n ): IMatchResult {\n if (!text || !keywords || keywords.length === 0) {\n return { matched: false };\n }\n\n const searchText = caseSensitive ? text : text.toLowerCase();\n\n for (const keyword of keywords) {\n if (!keyword) continue;\n\n const searchKeyword = caseSensitive ? keyword : keyword.toLowerCase();\n\n if (searchText.includes(searchKeyword)) {\n return {\n matched: true,\n matchedKeyword: keyword,\n };\n }\n }\n\n return { matched: false };\n }\n\n /**\n * \u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\n * \u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F\u68C0\u67E5\u6587\u672C\n *\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\n * @param pattern \u6B63\u5219\u8868\u8FBE\u5F0F\u6A21\u5F0F\u5B57\u7B26\u4E32\n * @returns \u5339\u914D\u7ED3\u679C\n */\n matchRegex(text: string, pattern: string): IMatchResult {\n if (!text || !pattern) {\n return { matched: false };\n }\n\n try {\n // \u5C1D\u8BD5\u4ECE\u7F13\u5B58\u83B7\u53D6\u7F16\u8BD1\u597D\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\n let regex = regexCache.get(pattern);\n\n if (!regex) {\n // \u7F16\u8BD1\u6B63\u5219\u8868\u8FBE\u5F0F\n regex = new RegExp(pattern, 'gm');\n regexCache.set(pattern, regex);\n }\n\n // \u91CD\u7F6E\u6B63\u5219\u8868\u8FBE\u5F0F\u7684 lastIndex\n regex.lastIndex = 0;\n\n const match = regex.exec(text);\n\n if (match) {\n return {\n matched: true,\n regexMatch: match,\n };\n }\n } catch (error) {\n logError(`[PatternMatcher] Invalid regex pattern: ${pattern}`, error);\n }\n\n return { matched: false };\n }\n\n /**\n * \u4F7F\u7528\u6307\u5B9A\u7684\u6A21\u5F0F\u8FDB\u884C\u5339\u914D\n *\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\n * @param pattern \u89E6\u53D1\u6A21\u5F0F\u914D\u7F6E\n * @returns \u5339\u914D\u7ED3\u679C\n */\n match(text: string, pattern: ITriggerPattern): IMatchResult {\n if (!text || !pattern) {\n return { matched: false };\n }\n\n switch (pattern.type) {\n case 'exact':\n return this.matchExact(\n text,\n pattern.keywords || [],\n pattern.caseSensitive || false\n );\n\n case 'regex':\n if (!pattern.pattern) {\n return { matched: false };\n }\n return this.matchRegex(text, pattern.pattern);\n\n default:\n logWarn(`[PatternMatcher] Unknown pattern type: ${pattern.type}`);\n return { matched: false };\n }\n }\n\n /**\n * \u68C0\u67E5\u6587\u672C\u662F\u5426\u5339\u914D\u4EFB\u4E00\u6A21\u5F0F\n *\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\n * @param patterns \u6A21\u5F0F\u5217\u8868\n * @returns \u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u7ED3\u679C\uFF0C\u5982\u679C\u6CA1\u6709\u5339\u914D\u5219\u8FD4\u56DE false\n */\n matchAny(text: string, patterns: ITriggerPattern[]): IMatchResult {\n if (!text || !patterns || patterns.length === 0) {\n return { matched: false };\n }\n\n for (const pattern of patterns) {\n const result = this.match(text, pattern);\n if (result.matched) {\n return result;\n }\n }\n\n return { matched: false };\n }\n\n /**\n * \u6E05\u9664\u6B63\u5219\u8868\u8FBE\u5F0F\u7F13\u5B58\n */\n clearCache(): void {\n regexCache.clear();\n }\n}\n\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\nexport const patternMatcher = new PatternMatcher();\n", "/**\n * Context Analyzer\n *\n * \u4E0A\u4E0B\u6587\u5206\u6790\u5668\uFF0C\u8D1F\u8D23\u4ECE\u8BF7\u6C42\u4E2D\u63D0\u53D6\u7528\u6237\u6D88\u606F\u5185\u5BB9\n */\n\nimport { MessageParam } from \"@anthropic-ai/sdk/resources/messages\";\nimport { AnalysisScope, ITriggerConfig, IRequestContext } from './types';\n\n/**\n * \u4E0A\u4E0B\u6587\u5206\u6790\u5668\u7C7B\n */\nexport class ContextAnalyzer {\n /**\n * \u4ECE\u6D88\u606F\u4E2D\u63D0\u53D6\u6587\u672C\u5185\u5BB9\n *\n * @param message \u6D88\u606F\u5BF9\u8C61\n * @returns \u63D0\u53D6\u7684\u6587\u672C\u5185\u5BB9\n */\n private extractTextFromMessage(message: MessageParam): string {\n if (typeof message.content === 'string') {\n return message.content;\n }\n\n if (Array.isArray(message.content)) {\n return message.content\n .filter((part: any) => part.type === 'text' && part.text)\n .map((part: any) => part.text)\n .join('\\n');\n }\n\n return '';\n }\n\n /**\n * \u63D0\u53D6\u6700\u540E\u4E00\u6761\u7528\u6237\u6D88\u606F\n *\n * @param messages \u6D88\u606F\u5217\u8868\n * @returns \u6700\u540E\u4E00\u6761\u7528\u6237\u6D88\u606F\u7684\u6587\u672C\u5185\u5BB9\n */\n extractLastUserMessage(messages: MessageParam[]): string {\n if (!messages || messages.length === 0) {\n return '';\n }\n\n // \u4ECE\u540E\u5F80\u524D\u627E\u6700\u540E\u4E00\u6761\u7528\u6237\u6D88\u606F\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message.role === 'user') {\n return this.extractTextFromMessage(message);\n }\n }\n\n return '';\n }\n\n /**\n * \u63D0\u53D6\u6240\u6709\u7528\u6237\u6D88\u606F\n *\n * @param messages \u6D88\u606F\u5217\u8868\n * @returns \u6240\u6709\u7528\u6237\u6D88\u606F\u7684\u6587\u672C\u5185\u5BB9\u6570\u7EC4\n */\n extractAllUserMessages(messages: MessageParam[]): string[] {\n if (!messages || messages.length === 0) {\n return [];\n }\n\n return messages\n .filter((message) => message.role === 'user')\n .map((message) => this.extractTextFromMessage(message));\n }\n\n /**\n * \u6839\u636E\u914D\u7F6E\u7684\u5206\u6790\u8303\u56F4\u63D0\u53D6\u6587\u672C\n *\n * @param messages \u6D88\u606F\u5217\u8868\n * @param scope \u5206\u6790\u8303\u56F4\n * @returns \u63D0\u53D6\u7684\u6587\u672C\u5185\u5BB9\n */\n extractTextByScope(messages: MessageParam[], scope: AnalysisScope): string {\n switch (scope) {\n case 'last_message':\n return this.extractLastUserMessage(messages);\n\n case 'full_conversation':\n const allMessages = this.extractAllUserMessages(messages);\n return allMessages.join('\\n\\n---\\n\\n');\n\n default:\n return this.extractLastUserMessage(messages);\n }\n }\n\n /**\n * \u5206\u6790\u8BF7\u6C42\uFF0C\u63D0\u53D6\u5F85\u5206\u6790\u7684\u6587\u672C\n *\n * @param req \u8BF7\u6C42\u5BF9\u8C61\n * @param config \u89E6\u53D1\u914D\u7F6E\n * @returns \u5F85\u5206\u6790\u7684\u6587\u672C\u5185\u5BB9\n */\n analyze(req: IRequestContext, config: ITriggerConfig): string {\n const messages = req.body?.messages;\n\n if (!messages) {\n return '';\n }\n\n const scope = config.analysis_scope || 'last_message';\n\n return this.extractTextByScope(messages, scope);\n }\n\n /**\n * \u68C0\u67E5\u6D88\u606F\u662F\u5426\u5305\u542B\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\n * \u5982\u679C\u6D88\u606F\u4E3B\u8981\u662F\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\uFF0C\u53EF\u80FD\u9700\u8981\u8DF3\u8FC7\u5206\u6790\n *\n * @param messages \u6D88\u606F\u5217\u8868\n * @returns \u662F\u5426\u4E3B\u8981\u662F\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\n */\n hasToolResults(messages: MessageParam[]): boolean {\n if (!messages || messages.length === 0) {\n return false;\n }\n\n // \u68C0\u67E5\u6700\u540E\u4E00\u6761\u7528\u6237\u6D88\u606F\n const lastMessage = messages[messages.length - 1];\n if (lastMessage.role !== 'user') {\n return false;\n }\n\n if (Array.isArray(lastMessage.content)) {\n const toolResults = lastMessage.content.filter(\n (part: any) => part.type === 'tool_result'\n );\n // \u5982\u679C\u5DE5\u5177\u7ED3\u679C\u5360\u6BD4\u8D85\u8FC7 50%\uFF0C\u8BA4\u4E3A\u4E3B\u8981\u662F\u5DE5\u5177\u8C03\u7528\n return toolResults.length > lastMessage.content.length / 2;\n }\n\n return false;\n }\n}\n\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\nexport const contextAnalyzer = new ContextAnalyzer();\n", "/**\r\n * Intent Detector\r\n *\r\n * \u610F\u56FE\u8BC6\u522B\u5668\uFF0C\u4F7F\u7528 LLM \u8F85\u52A9\u8BC6\u522B\u7528\u6237\u610F\u56FE\r\n */\r\n\r\nimport { LRUCache } from 'lru-cache';\r\nimport { ITriggerConfig, ITriggerRule, IIntentResult } from './types';\r\nimport { DEFAULT_CONFIG } from '../constants';\r\nimport { logError, logWarn } from '../utils/log';\r\n\r\n/**\r\n * \u610F\u56FE\u8BC6\u522B\u7F13\u5B58\r\n * \u76F8\u540C\u7684\u8F93\u5165\u5728\u7F13\u5B58\u6709\u6548\u671F\u5185\u76F4\u63A5\u8FD4\u56DE\u7F13\u5B58\u7ED3\u679C\r\n */\r\nconst intentCache = new LRUCache<string, IIntentResult>({\r\n max: 500,\r\n ttl: 1000 * 60 * 10, // 10 \u5206\u949F\r\n});\r\n\r\n/**\r\n * \u610F\u56FE\u8BC6\u522B\u7684 Prompt \u6A21\u677F\r\n */\r\nconst INTENT_PROMPT_TEMPLATE = `You are an intent classifier for an AI assistant router.\r\nAnalyze the following user message and identify the primary intent.\r\n\r\nUser Message:\r\n\"\"\"\r\n{message}\r\n\"\"\"\r\n\r\nAvailable intent categories:\r\n{intents}\r\n\r\nRespond in the following JSON format only:\r\n{\r\n \"intent\": \"<intent_name>\",\r\n \"confidence\": <0.0-1.0>,\r\n \"reasoning\": \"<brief explanation>\"\r\n}\r\n\r\nIf the message doesn't match any category well, respond with:\r\n{\r\n \"intent\": \"general\",\r\n \"confidence\": 0.5,\r\n \"reasoning\": \"No specific intent matched\"\r\n}\r\n\r\nImportant: Respond ONLY with the JSON, no additional text.`;\r\n\r\n/**\r\n * \u610F\u56FE\u8BC6\u522B\u5668\u7C7B\r\n */\r\nexport class IntentDetector {\r\n /**\r\n * \u751F\u6210\u7F13\u5B58 key\r\n * \u4F7F\u7528\u6D88\u606F\u5185\u5BB9\u7684 hash \u4F5C\u4E3A key\r\n */\r\n private generateCacheKey(text: string, intents: string[]): string {\r\n const content = `${text}:${intents.join(',')}`;\r\n // \u7B80\u5355\u7684 hash \u51FD\u6570\r\n let hash = 0;\r\n for (let i = 0; i < content.length; i++) {\r\n const char = content.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash; // Convert to 32bit integer\r\n }\r\n return hash.toString(16);\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA intent \u5217\u8868\u5B57\u7B26\u4E32\r\n */\r\n private buildIntentsList(rules: ITriggerRule[]): string {\r\n return rules\r\n .filter((rule) => rule.enabled)\r\n .map((rule) => `- ${rule.name}: ${rule.description || 'No description'}`)\r\n .join('\\n');\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u610F\u56FE\u8BC6\u522B\u7684 prompt\r\n */\r\n private buildPrompt(message: string, rules: ITriggerRule[]): string {\r\n const intents = this.buildIntentsList(rules);\r\n\r\n return INTENT_PROMPT_TEMPLATE\r\n .replace('{message}', message)\r\n .replace('{intents}', intents);\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528 LLM \u68C0\u6D4B\u610F\u56FE\r\n *\r\n * @param text \u5F85\u5206\u6790\u7684\u6587\u672C\r\n * @param config \u89E6\u53D1\u914D\u7F6E\r\n * @param fetchFn fetch \u51FD\u6570\uFF08\u7528\u4E8E\u53D1\u8D77 API \u8BF7\u6C42\uFF09\r\n * @returns \u610F\u56FE\u8BC6\u522B\u7ED3\u679C\r\n */\r\n async detectIntent(\r\n text: string,\r\n config: ITriggerConfig,\r\n port: number = DEFAULT_CONFIG.PORT,\r\n fetchFn?: typeof fetch,\r\n apiKey?: string,\r\n timeoutMs?: number\r\n ): Promise<IIntentResult> {\r\n // \u5982\u679C\u6CA1\u6709\u542F\u7528 LLM \u610F\u56FE\u8BC6\u522B\uFF0C\u8FD4\u56DE\u9ED8\u8BA4\u7ED3\u679C\r\n if (!config.llm_intent_recognition) {\r\n return {\r\n intent: 'general',\r\n confidence: 0,\r\n };\r\n }\r\n\r\n // \u5982\u679C\u6CA1\u6709\u914D\u7F6E intent_model\uFF0C\u8FD4\u56DE\u9ED8\u8BA4\u7ED3\u679C\r\n if (!config.intent_model) {\r\n logWarn('[IntentDetector] LLM intent recognition enabled but no intent_model configured');\r\n return {\r\n intent: 'general',\r\n confidence: 0,\r\n };\r\n }\r\n\r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cacheKey = this.generateCacheKey(text, config.rules.map(r => r.name));\r\n const cachedResult = intentCache.get(cacheKey);\r\n if (cachedResult) {\r\n return cachedResult;\r\n }\r\n\r\n try {\r\n const fetchImpl = fetchFn || fetch;\r\n\r\n // \u6784\u5EFA prompt\r\n const prompt = this.buildPrompt(text, config.rules);\r\n\r\n // \u8C03\u7528 LLM API\r\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\r\n },\r\n body: JSON.stringify({\r\n model: config.intent_model,\r\n max_tokens: 256,\r\n messages: [\r\n {\r\n role: 'user',\r\n content: prompt,\r\n },\r\n ],\r\n }),\r\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\r\n });\r\n\r\n if (!response.ok) {\r\n logError('[IntentDetector] LLM request failed:', response.status);\r\n return { intent: 'general', confidence: 0 };\r\n }\r\n\r\n const data = await response.json() as any;\r\n\r\n // \u89E3\u6790 LLM \u54CD\u5E94\r\n const content = data.content?.[0]?.text || '';\r\n\r\n // \u63D0\u53D6 JSON\r\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\r\n if (!jsonMatch) {\r\n logWarn('[IntentDetector] No JSON found in LLM response');\r\n return { intent: 'general', confidence: 0 };\r\n }\r\n\r\n const result = JSON.parse(jsonMatch[0]) as IIntentResult;\r\n\r\n // \u7F13\u5B58\u7ED3\u679C\r\n intentCache.set(cacheKey, result);\r\n\r\n return result;\r\n } catch (error) {\r\n logError('[IntentDetector] Error detecting intent:', error);\r\n return { intent: 'general', confidence: 0 };\r\n }\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u610F\u56FE\u627E\u5230\u5339\u914D\u7684\u89C4\u5219\r\n *\r\n * @param intent \u610F\u56FE\u540D\u79F0\r\n * @param rules \u89C4\u5219\u5217\u8868\r\n * @returns \u5339\u914D\u7684\u89C4\u5219\uFF0C\u5982\u679C\u6CA1\u6709\u5339\u914D\u5219\u8FD4\u56DE null\r\n */\r\n findRuleByIntent(intent: string, rules: ITriggerRule[]): ITriggerRule | null {\r\n return rules.find(\r\n (rule) => rule.enabled && rule.name.toLowerCase() === intent.toLowerCase()\r\n ) || null;\r\n }\r\n\r\n /**\r\n * \u6E05\u9664\u7F13\u5B58\r\n */\r\n clearCache(): void {\r\n intentCache.clear();\r\n }\r\n}\r\n\r\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\r\nexport const intentDetector = new IntentDetector();\r\n", "/**\r\n * SmartRouter Selector\r\n *\r\n * \u667A\u80FD\u8DEF\u7531\u9009\u62E9\u5668\uFF0C\u4F7F\u7528 LLM \u4ECE\u5019\u9009\u6A21\u578B\u5217\u8868\u4E2D\u9009\u62E9\u6700\u4F18\u6A21\u578B\r\n */\r\n\r\nimport { LRUCache } from 'lru-cache';\r\nimport { ISmartRouterConfig } from './types';\r\nimport { DEFAULT_CONFIG } from '../constants';\r\nimport { logError, logWarn } from '../utils/log';\r\nimport { createSingleUserTextIR } from '../protocols/message-ir';\r\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\r\n\r\n/**\r\n * SmartRouter \u9009\u62E9\u7ED3\u679C\r\n */\r\nexport interface ISmartRouterResult {\n /** \u9009\u4E2D\u7684\u6A21\u578B\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\r\n model: string;\r\n\r\n /** \u7F6E\u4FE1\u5EA6 0-1 */\r\n confidence: number;\r\n\r\n /** LLM \u7684\u9009\u62E9\u7406\u7531 */\r\n reasoning?: string;\n}\n\nexport interface ISmartRouterHintContext {\n taskSummary?: string;\n topRouteCandidates?: Array<{\n name: string;\n model: string;\n description?: string;\n confidence?: number;\n }>;\n}\n\r\n/**\r\n * SmartRouter Prompt \u6A21\u677F\r\n */\r\n/**\n * \u667A\u80FD\u8DEF\u7531\u9009\u62E9\u5668\u7C7B\n */\nexport class SmartRouterSelector {\n private cache: LRUCache<string, ISmartRouterResult>;\r\n\r\n constructor() {\r\n this.cache = new LRUCache<string, ISmartRouterResult>({\r\n max: 500,\r\n ttl: 600000, // \u9ED8\u8BA4 10 \u5206\u949F\uFF0C\u5177\u4F53\u6761\u76EE\u53EF\u88AB config.cache_ttl \u8986\u76D6\r\n });\r\n }\r\n\r\n /**\r\n * \u751F\u6210\u7F13\u5B58 key\uFF08\u57FA\u4E8E\u8BF7\u6C42\u6587\u672C + router_model + \u5019\u9009\u6A21\u578B\u5217\u8868\uFF09\r\n * \u6CE8\u610F\uFF1A\u5305\u542B router_model \u4EE5\u9632\u6B62\u5207\u6362\u8DEF\u7531\u6A21\u578B\u540E\u547D\u4E2D\u65E7\u7F13\u5B58\r\n */\r\n private generateCacheKey(text: string, routerModel: string, candidates: ISmartRouterConfig['candidates']): string {\r\n const content = `${text}:${routerModel}:${candidates.map(c => c.model).join(',')}`;\r\n let hash = 0;\r\n for (let i = 0; i < content.length; i++) {\r\n const char = content.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return hash.toString(16);\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u5019\u9009\u6A21\u578B\u5217\u8868\u5B57\u7B26\u4E32\r\n */\r\n private buildCandidatesList(candidates: ISmartRouterConfig['candidates']): string {\r\n return candidates\r\n .map((c, i) => `${i + 1}. ${c.model} - ${c.description}`)\r\n .join('\\n');\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u5B8C\u6574 prompt\r\n */\r\n private buildPrompt(text: string, candidates: ISmartRouterConfig['candidates'], hint?: ISmartRouterHintContext): string {\n const sections = [\n 'You are a model routing assistant. Your job is to select the most appropriate AI model from the given candidates to handle the user\\'s request.',\n ];\n\n if (hint?.taskSummary) {\n sections.push(`Task summary:\\n\"\"\"\\n${hint.taskSummary}\\n\"\"\"`);\n }\n\n if (hint?.topRouteCandidates?.length) {\n sections.push(\n 'Pre-filtered route candidates:\\n' +\n hint.topRouteCandidates\n .map((candidate, index) =>\n `${index + 1}. ${candidate.name} -> ${candidate.model}` +\n `${candidate.description ? ` (${candidate.description})` : ''}` +\n `${candidate.confidence !== undefined ? ` [confidence=${candidate.confidence}]` : ''}`\n )\n .join('\\n')\n );\n }\n\n sections.push(\n `User request:\\n\"\"\"\\n${text}\\n\"\"\"`,\n `Available models:\\n${this.buildCandidatesList(candidates)}`,\n `Select the most appropriate model and respond in the following JSON format ONLY:\n{\n \"model\": \"<exact model identifier from the list>\",\n \"confidence\": <0.0-1.0>,\n \"reasoning\": \"<brief explanation>\"\n}\n\nImportant:\n- The \"model\" field MUST be one of the exact identifiers listed above\n- Respond ONLY with the JSON, no additional text`\n );\n\n return sections.join('\\n\\n');\n }\n\r\n /**\r\n * \u4F7F\u7528 LLM \u9009\u62E9\u6700\u4F18\u6A21\u578B\r\n *\r\n * @param text \u8BF7\u6C42\u6587\u672C\r\n * @param config SmartRouter \u914D\u7F6E\r\n * @param port \u672C\u5730\u670D\u52A1\u7AEF\u53E3\uFF08\u9ED8\u8BA4 5678\uFF09\r\n * @param fetchFn \u53EF\u6CE8\u5165\u7684 fetch \u51FD\u6570\uFF08\u7528\u4E8E\u6D4B\u8BD5\uFF09\r\n * @returns \u9009\u62E9\u7ED3\u679C\uFF0C\u5931\u8D25\u65F6\u8FD4\u56DE null\r\n */\r\n async selectModel(\n text: string,\n config: ISmartRouterConfig,\n port: number = DEFAULT_CONFIG.PORT,\n fetchFn?: typeof fetch,\n apiKey?: string,\n timeoutMs?: number,\n hint?: ISmartRouterHintContext\n ): Promise<ISmartRouterResult | null> {\n // \u672A\u542F\u7528\u6216\u5019\u9009\u4E0D\u8DB3\r\n if (!config.enabled) {\r\n return null;\r\n }\r\n\r\n if (!config.candidates || config.candidates.length < 2) {\r\n return null;\r\n }\r\n\r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cacheKey = this.generateCacheKey(text, config.router_model, config.candidates);\r\n const cached = this.cache.get(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n try {\r\n const fetchImpl = fetchFn || fetch;\r\n const prompt = this.buildPrompt(text, config.candidates, hint);\n\r\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-ctr-smart-router': '1',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\r\n toAnthropicMessagesRequest({\r\n model: config.router_model,\r\n max_tokens: config.max_tokens ?? 256,\r\n ir: createSingleUserTextIR(prompt),\r\n })\r\n ),\r\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\r\n });\r\n\r\n if (!response.ok) {\r\n logError('[SmartRouter] LLM request failed:', (response as any).status);\r\n return null;\r\n }\r\n\r\n const data = await response.json() as any;\r\n const content = data.content?.[0]?.text || '';\r\n\r\n // \u63D0\u53D6 JSON\r\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\r\n if (!jsonMatch) {\r\n logWarn('[SmartRouter] No JSON found in LLM response');\r\n return null;\r\n }\r\n\r\n const parsed = JSON.parse(jsonMatch[0]) as ISmartRouterResult;\r\n\r\n // \u9A8C\u8BC1\u8FD4\u56DE\u7684\u6A21\u578B\u5728\u5019\u9009\u5217\u8868\u4E2D\r\n const validModels = config.candidates.map(c => c.model);\r\n if (!validModels.includes(parsed.model)) {\r\n logWarn(`[SmartRouter] LLM returned unknown model: \"${parsed.model}\"`);\r\n return null;\r\n }\r\n\r\n // \u7F13\u5B58\u7ED3\u679C\uFF08\u4F7F\u7528\u914D\u7F6E\u7684 TTL \u8FDB\u884C\u6309\u6761\u76EE\u8986\u76D6\uFF09\r\n this.cache.set(cacheKey, parsed, { ttl: config.cache_ttl ?? 600000 });\r\n\r\n return parsed;\r\n } catch (error) {\r\n logError('[SmartRouter] Error selecting model:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u9664\u7F13\u5B58\uFF08\u7528\u4E8E\u6D4B\u8BD5\uFF09\r\n */\r\n clearCache(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n\r\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\r\nexport const smartRouterSelector = new SmartRouterSelector();\r\n", "/**\r\n * Model Selector\r\n *\r\n * \u6A21\u578B\u9009\u62E9\u5668\uFF0C\u8D1F\u8D23\u6839\u636E\u89E6\u53D1\u89C4\u5219\u9009\u62E9\u5408\u9002\u7684\u6A21\u578B\r\n */\r\n\r\nimport { ITriggerConfig, ITriggerRule, IAnalysisResult, IMatchResult, IRequestContext, ISmartRouterConfig, IAppConfig } from './types';\nimport { patternMatcher } from './matcher';\r\nimport { contextAnalyzer } from './analyzer';\r\nimport { intentDetector } from './intent';\r\nimport { smartRouterSelector } from './smart-router';\r\nimport { log, logError } from '../utils/log';\r\nimport { DEFAULT_CONFIG } from '../constants';\r\nimport { IGovernanceConfig } from '../governance/types';\r\nimport { createTaskFingerprint, sessionStateStore } from '../governance/session-store';\r\nimport { semanticRouter } from '../governance/semantic-router';\nimport { resolveModelReference } from '../models/compile';\n\ninterface IStickyCorrectionContext {\n sessionModel?: string;\n fingerprint?: string;\n}\n\r\n/**\r\n * \u6A21\u578B\u9009\u62E9\u5668\u7C7B\r\n */\r\nexport class ModelSelector {\n private resolveRouteModel(appConfig: IAppConfig | undefined, ref: string | undefined): string | undefined {\n if (!ref) {\n return undefined;\n }\n return appConfig ? resolveModelReference(appConfig, ref) ?? ref : ref;\n }\n\n private buildSemanticCandidates(\n rules: ITriggerRule[],\n governanceConfig?: IGovernanceConfig\n ) {\n const defaultThreshold = governanceConfig?.semantic?.threshold;\n const legacyPrototypes = governanceConfig?.semantic?.prototypes ?? {};\n\n return this.sortRulesByPriority(rules)\n .map((rule) => {\n const prototype = rule.semantic_profile?.prototype\n ?? legacyPrototypes[rule.name]\n ?? rule.description;\n const semanticEnabled = rule.semantic_profile?.enabled !== false && Boolean(prototype);\n if (!semanticEnabled || !prototype) {\n return null;\n }\n\n return {\n rule,\n prototype,\n threshold: rule.semantic_profile?.threshold ?? defaultThreshold,\n };\n })\n .filter(Boolean) as Array<{ rule: ITriggerRule; prototype: string; threshold?: number }>;\n }\n\n private getStickyCorrection(\n text: string,\n req: IRequestContext,\n governanceConfig?: IGovernanceConfig\n ): IStickyCorrectionContext {\n if (!governanceConfig?.enabled || !governanceConfig.sticky?.enabled || !req.sessionId) {\n return {};\n }\n\n const fingerprint = createTaskFingerprint(text);\n const sessionState = sessionStateStore.get(req.sessionId);\n if (\n !fingerprint ||\n sessionState?.lastTaskFingerprint !== fingerprint ||\n !(sessionState.preferredModel || sessionState.lastSuccessfulModel)\n ) {\n return {};\n }\n\n return {\n fingerprint,\n sessionModel: sessionState.preferredModel || sessionState.lastSuccessfulModel,\n };\n }\n\n private applyStickyCorrection(\n candidate: IAnalysisResult | null,\n sticky: IStickyCorrectionContext,\n appConfig?: IAppConfig\n ): IAnalysisResult | null {\n if (!sticky.sessionModel) {\n return candidate;\n }\n\n const stickyModel = this.resolveRouteModel(appConfig, sticky.sessionModel);\n if (!stickyModel) {\n return candidate;\n }\n\n if (!candidate) {\n log(`[StickyRouting] Reusing model \"${stickyModel}\" as unified router correction`);\n return {\n matched: true,\n model: stickyModel,\n confidence: 0.95,\n analysisTime: 0,\n routeSource: 'sticky_correction',\n };\n }\n\n if (candidate.model === stickyModel) {\n return candidate;\n }\n\n log(`[StickyRouting] Correcting selected model \"${candidate.model}\" -> \"${stickyModel}\"`);\n return {\n ...candidate,\n model: stickyModel,\n confidence: Math.max(candidate.confidence, 0.95),\n routeSource: 'sticky_correction',\n };\n }\n\n private buildSmartRouterHint(text: string, rules: ITriggerRule[]) {\n return {\n taskSummary: text.slice(0, 240),\n topRouteCandidates: this.sortRulesByPriority(rules)\n .filter((rule) => rule.description)\n .slice(0, 3)\n .map((rule) => ({\n name: rule.name,\n model: rule.model,\n description: rule.description,\n confidence: undefined,\n })),\n };\n }\n /**\r\n * \u6309\u4F18\u5148\u7EA7\u6392\u5E8F\u89C4\u5219\r\n * \u4F18\u5148\u7EA7\u6570\u503C\u8D8A\u5927\uFF0C\u4F18\u5148\u7EA7\u8D8A\u9AD8\r\n *\r\n * @param rules \u89C4\u5219\u5217\u8868\r\n * @returns \u6392\u5E8F\u540E\u7684\u89C4\u5219\u5217\u8868\uFF08\u964D\u5E8F\uFF09\r\n */\r\n sortRulesByPriority(rules: ITriggerRule[]): ITriggerRule[] {\r\n return [...rules]\r\n .filter((rule) => rule.enabled !== false)\r\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528\u89C4\u5219\u5339\u914D\u6587\u672C\r\n *\r\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\r\n * @param rule \u89C4\u5219\r\n * @returns \u5339\u914D\u7ED3\u679C\r\n */\r\n matchRule(text: string, rule: ITriggerRule): IMatchResult {\r\n if (!text || !rule || !rule.patterns || rule.patterns.length === 0) {\r\n return { matched: false };\r\n }\r\n\r\n return patternMatcher.matchAny(text, rule.patterns);\r\n }\r\n\r\n /**\r\n * \u4ECE\u6587\u672C\u4E2D\u5339\u914D\u89C4\u5219\r\n * \u6309\u4F18\u5148\u7EA7\u987A\u5E8F\u5339\u914D\uFF0C\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u89C4\u5219\r\n *\r\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\r\n * @param rules \u89C4\u5219\u5217\u8868\r\n * @returns \u5339\u914D\u7684\u89C4\u5219\uFF0C\u5982\u679C\u6CA1\u6709\u5339\u914D\u5219\u8FD4\u56DE null\r\n */\r\n matchRuleFromText(text: string, rules: ITriggerRule[]): { rule: ITriggerRule; result: IMatchResult } | null {\r\n if (!text || !rules || rules.length === 0) {\r\n return null;\r\n }\r\n\r\n // \u6309\u4F18\u5148\u7EA7\u6392\u5E8F\r\n const sortedRules = this.sortRulesByPriority(rules);\r\n\r\n for (const rule of sortedRules) {\r\n const result = this.matchRule(text, rule);\r\n if (result.matched) {\r\n return { rule, result };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * \u9009\u62E9\u6A21\u578B\r\n * \u7EFC\u5408\u4F7F\u7528\u5173\u952E\u8BCD\u5339\u914D\u548C LLM \u610F\u56FE\u8BC6\u522B\r\n *\r\n * @param req \u8BF7\u6C42\u5BF9\u8C61\r\n * @param config \u89E6\u53D1\u914D\u7F6E\r\n * @returns \u5206\u6790\u7ED3\u679C\r\n */\r\n async selectModel(\r\n req: IRequestContext,\r\n config: ITriggerConfig,\r\n port: number = DEFAULT_CONFIG.PORT,\r\n smartRouterConfig?: ISmartRouterConfig,\r\n governanceConfig?: IGovernanceConfig,\r\n apiKey?: string,\r\n timeoutMs?: number\r\n ): Promise<IAnalysisResult> {\r\n const startTime = Date.now();\r\n const appConfig = (req as any).appConfig as IAppConfig | undefined;\r\n\r\n // \u5982\u679C\u89E6\u53D1\u8DEF\u7531\u672A\u542F\u7528\uFF0C\u76F4\u63A5\u8FD4\u56DE\u4E0D\u5339\u914D\r\n if (!config.enabled) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // \u63D0\u53D6\u5F85\u5206\u6790\u7684\u6587\u672C\r\n const text = contextAnalyzer.analyze(req, config);\r\n\r\n if (!text) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: '',\r\n };\r\n }\r\n\r\n // \u7B2C\u4E00\u6B65\uFF1A\u5173\u952E\u8BCD/\u6B63\u5219\u5339\u914D\n const matchResult = this.matchRuleFromText(text, config.rules);\n\r\n if (matchResult) {\r\n return {\r\n matched: true,\r\n rule: matchResult.rule,\r\n model: appConfig ? resolveModelReference(appConfig, matchResult.rule.model) ?? matchResult.rule.model : matchResult.rule.model,\r\n confidence: 1.0, // \u5173\u952E\u8BCD\u5339\u914D\u7F6E\u4FE1\u5EA6\u4E3A 1\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: text,\r\n routeSource: 'trigger_rule',\n };\n }\n\n const stickyCorrection = this.getStickyCorrection(text, req, governanceConfig);\n\n // \u7B2C\u4E8C\u6B65\uFF1ASemantic Router \u8BED\u4E49\u8F85\u52A9\u5339\u914D\n const semanticCandidates = this.buildSemanticCandidates(config.rules, governanceConfig);\n if (governanceConfig?.enabled && governanceConfig.semantic?.enabled && semanticCandidates.length > 0) {\n const semanticConfig = {\n ...governanceConfig.semantic,\n prototypes: Object.fromEntries(semanticCandidates.map((candidate) => [candidate.rule.name, candidate.prototype])),\n };\n const semanticResult = semanticConfig.mode === 'classifier'\n ? await semanticRouter.analyzeWithClassifier(\n text,\n semanticConfig,\n port,\n undefined,\n apiKey,\n timeoutMs\n )\n : semanticRouter.analyzeCandidates(\n text,\n semanticCandidates.map((candidate) => ({\n intent: candidate.rule.name,\n prototype: candidate.prototype,\n threshold: candidate.threshold,\n })),\n semanticConfig.threshold\n );\n if (semanticResult) {\n const matchedRule = config.rules.find(\n (rule) => rule.enabled !== false && rule.name.toLowerCase() === semanticResult.intent.toLowerCase()\n );\n\n if (matchedRule) {\n log(`[SemanticRouter] Matched intent \"${semanticResult.intent}\" -> \"${matchedRule.model}\"`);\n if (req.governanceTrace) {\n req.governanceTrace.semanticIntent = semanticResult.intent;\n }\n const semanticSelection: IAnalysisResult = {\n matched: true,\n rule: matchedRule,\n model: this.resolveRouteModel(appConfig, matchedRule.model),\n confidence: semanticResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'semantic_match',\n };\n return this.applyStickyCorrection(semanticSelection, stickyCorrection, appConfig) ?? semanticSelection;\n }\n }\n }\n\n // \u7B2C\u4E09\u6B65\uFF1ASmartRouter \u4F5C\u4E3A\u7ED3\u6784\u5316 fallback\n if (smartRouterConfig?.enabled && smartRouterConfig.candidates?.length >= 2) {\n try {\n const resolvedSmartRouterConfig = appConfig ? {\n ...smartRouterConfig,\n router_model: this.resolveRouteModel(appConfig, smartRouterConfig.router_model) ?? smartRouterConfig.router_model,\n candidates: smartRouterConfig.candidates.map((candidate) => ({\n ...candidate,\n model: this.resolveRouteModel(appConfig, candidate.model) ?? candidate.model,\n })),\n } : smartRouterConfig;\n const smartResult = await smartRouterSelector.selectModel(\n text,\n resolvedSmartRouterConfig,\n port,\n undefined,\n apiKey,\n timeoutMs,\n this.buildSmartRouterHint(text, config.rules)\n );\n if (smartResult) {\n log(`[SmartRouter] Selected model \"${smartResult.model}\" (confidence: ${smartResult.confidence})`);\n const smartSelection: IAnalysisResult = {\n matched: true,\n model: smartResult.model,\n confidence: smartResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'smart_router',\n };\n return this.applyStickyCorrection(smartSelection, stickyCorrection, appConfig) ?? smartSelection;\n }\n } catch (error) {\n logError('[ModelSelector] SmartRouter error:', error);\n }\n }\n\n // \u7B2C\u56DB\u6B65\uFF1A\u4FDD\u7559 legacy intent fallback \u4F5C\u4E3A\u517C\u5BB9\u515C\u5E95\n if (config.llm_intent_recognition && config.intent_model) {\n try {\n const intentResult = await intentDetector.detectIntent(text, config, port, undefined, apiKey, timeoutMs);\n\r\n if (intentResult.confidence > 0.5 && intentResult.intent !== 'general') {\n const matchedRule = intentDetector.findRuleByIntent(intentResult.intent, config.rules);\n\n if (matchedRule) {\n const intentSelection: IAnalysisResult = {\n matched: true,\n rule: matchedRule,\n model: this.resolveRouteModel(appConfig, matchedRule.model),\n confidence: intentResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'intent_fallback',\n };\n return this.applyStickyCorrection(intentSelection, stickyCorrection, appConfig) ?? intentSelection;\n }\n }\n } catch (error) {\n logError('[ModelSelector] Intent detection error:', error);\n }\n }\n\n // \u7B2C\u4E94\u6B65\uFF1A\u82E5\u524D\u5C42\u5747\u672A\u7A33\u5B9A\u547D\u4E2D\uFF0C\u518D\u5C1D\u8BD5 sticky correction \u4F5C\u4E3A\u6700\u540E\u7A33\u5B9A\u6027\u4FEE\u6B63\n const stickyOnlySelection = this.applyStickyCorrection(null, stickyCorrection, appConfig);\n if (stickyOnlySelection) {\n return {\n ...stickyOnlySelection,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n };\n }\n\n return {\n matched: false,\n confidence: 0,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\r\n };\r\n }\r\n\r\n /**\r\n * \u540C\u6B65\u7248\u672C\u7684\u6A21\u578B\u9009\u62E9\r\n * \u4EC5\u4F7F\u7528\u5173\u952E\u8BCD\u5339\u914D\uFF0C\u4E0D\u8FDB\u884C LLM \u610F\u56FE\u8BC6\u522B\r\n *\r\n * @param req \u8BF7\u6C42\u5BF9\u8C61\r\n * @param config \u89E6\u53D1\u914D\u7F6E\r\n * @returns \u5206\u6790\u7ED3\u679C\r\n */\r\n selectModelSync(req: IRequestContext, config: ITriggerConfig): IAnalysisResult {\r\n const startTime = Date.now();\r\n const appConfig = (req as any).appConfig as IAppConfig | undefined;\r\n\r\n // \u5982\u679C\u89E6\u53D1\u8DEF\u7531\u672A\u542F\u7528\uFF0C\u76F4\u63A5\u8FD4\u56DE\u4E0D\u5339\u914D\r\n if (!config.enabled) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // \u63D0\u53D6\u5F85\u5206\u6790\u7684\u6587\u672C\r\n const text = contextAnalyzer.analyze(req, config);\r\n\r\n if (!text) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: '',\r\n };\r\n }\r\n\r\n // \u5173\u952E\u8BCD/\u6B63\u5219\u5339\u914D\r\n const matchResult = this.matchRuleFromText(text, config.rules);\r\n\r\n if (matchResult) {\r\n return {\r\n matched: true,\r\n rule: matchResult.rule,\r\n model: appConfig ? resolveModelReference(appConfig, matchResult.rule.model) ?? matchResult.rule.model : matchResult.rule.model,\r\n confidence: 1.0,\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: text,\r\n };\r\n }\r\n\r\n // \u6CA1\u6709\u5339\u914D\u4EFB\u4F55\u89C4\u5219\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: text,\r\n };\r\n }\r\n}\r\n\r\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\r\nexport const modelSelector = new ModelSelector();\r\n", "/**\r\n * Trigger Router Module\r\n *\r\n * \u89E6\u53D1\u8DEF\u7531\u6A21\u5757\u5165\u53E3\r\n */\r\n\r\nexport * from './types';\r\nexport * from './matcher';\r\nexport * from './analyzer';\r\nexport * from './intent';\r\nexport * from './selector';\r\nexport * from './smart-router';\r\n\r\nimport { ITriggerConfig, IAnalysisResult, IAppConfig, IRequestContext, ISmartRouterConfig } from './types';\r\nimport { appendTraceReason } from '../governance/trace';\r\nimport { modelSelector } from './selector';\r\nimport { contextAnalyzer } from './analyzer';\r\nimport { log, logError } from '../utils/log';\r\nimport { DEFAULT_CONFIG } from '../constants';\r\nimport { IGovernanceConfig } from '../governance/types';\r\n\r\n/**\r\n * \u89E6\u53D1\u8DEF\u7531\u5668\u7C7B\r\n * \u5C01\u88C5\u5B8C\u6574\u7684\u89E6\u53D1\u8DEF\u7531\u903B\u8F91\r\n */\r\nexport class TriggerRouter {\r\n private config: ITriggerConfig | null = null;\r\n private appConfig: IAppConfig | null = null;\r\n private port: number = DEFAULT_CONFIG.PORT;\r\n private smartRouterConfig: ISmartRouterConfig | undefined = undefined;\r\n private governanceConfig: IGovernanceConfig | undefined = undefined;\r\n private apiKey?: string;\r\n private apiTimeoutMs?: number;\r\n\r\n /**\r\n * \u521D\u59CB\u5316\u89E6\u53D1\u8DEF\u7531\u5668\r\n *\r\n * @param appConfig \u5E94\u7528\u914D\u7F6E\r\n */\r\n init(appConfig: IAppConfig): void {\r\n this.appConfig = appConfig;\r\n this.config = appConfig.TriggerRouter || this.getDefaultConfig();\r\n this.port = appConfig.PORT || DEFAULT_CONFIG.PORT;\r\n this.smartRouterConfig = appConfig.SmartRouter;\r\n this.governanceConfig = appConfig.Governance;\r\n this.apiKey = appConfig.APIKEY;\r\n this.apiTimeoutMs = appConfig.API_TIMEOUT_MS;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u9ED8\u8BA4\u914D\u7F6E\r\n */\r\n private getDefaultConfig(): ITriggerConfig {\r\n return {\r\n enabled: false,\r\n analysis_scope: 'last_message',\r\n llm_intent_recognition: false,\r\n rules: [],\r\n };\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u89E6\u53D1\u8DEF\u7531\u662F\u5426\u542F\u7528\r\n */\r\n isEnabled(): boolean {\r\n return this.config?.enabled ?? false;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5F53\u524D\u914D\u7F6E\r\n */\r\n getConfig(): ITriggerConfig | null {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * \u6267\u884C\u89E6\u53D1\u8DEF\u7531\r\n * \u5206\u6790\u8BF7\u6C42\u5E76\u8FD4\u56DE\u5339\u914D\u7684\u6A21\u578B\r\n *\r\n * @param req \u8BF7\u6C42\u5BF9\u8C61\r\n * @returns \u5206\u6790\u7ED3\u679C\r\n */\r\n async route(req: IRequestContext): Promise<IAnalysisResult> {\r\n if (!this.config || !this.config.enabled) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: 0,\r\n };\r\n }\r\n\r\n // \u8DF3\u8FC7\u5DE5\u5177\u8C03\u7528\u5FAA\u73AF\u4E2D\u7684\u8BF7\u6C42\uFF0C\u907F\u514D\u65E0\u610F\u4E49\u7684\u89E6\u53D1\u5206\u6790\r\n const messages = req.body?.messages;\r\n if (messages && contextAnalyzer.hasToolResults(messages)) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: 0,\r\n };\r\n }\r\n\r\n const result = await modelSelector.selectModel(\r\n {\r\n ...req,\r\n appConfig: this.appConfig ?? undefined,\r\n } as IRequestContext,\r\n this.config,\r\n this.port,\r\n this.smartRouterConfig,\r\n this.governanceConfig,\r\n this.apiKey,\r\n this.apiTimeoutMs\r\n );\r\n\r\n if (req.governanceTrace) {\n if (result.routeSource === 'trigger_rule' && result.rule?.name) {\n appendTraceReason(req.governanceTrace, `trigger_rule:${result.rule.name}`);\n } else if (result.routeSource === 'semantic_match' && result.rule?.name) {\n appendTraceReason(req.governanceTrace, `semantic_match:${result.rule.name}`);\n } else if (result.routeSource === 'sticky_correction') {\n req.governanceTrace.stickyHit = true;\n appendTraceReason(req.governanceTrace, 'sticky_correction');\n } else if (result.routeSource === 'smart_router') {\n appendTraceReason(req.governanceTrace, 'smart_decision');\n } else if (result.routeSource === 'intent_fallback') {\n appendTraceReason(req.governanceTrace, 'intent_fallback');\n } else {\n appendTraceReason(req.governanceTrace, 'trigger_router:no_match');\n }\n }\n\r\n return result;\r\n }\r\n\r\n /**\r\n * \u540C\u6B65\u7248\u672C\u7684\u89E6\u53D1\u8DEF\u7531\r\n * \u4EC5\u4F7F\u7528\u5173\u952E\u8BCD\u5339\u914D\r\n *\r\n * @param req \u8BF7\u6C42\u5BF9\u8C61\r\n * @returns \u5206\u6790\u7ED3\u679C\r\n */\r\n routeSync(req: IRequestContext): IAnalysisResult {\r\n if (!this.config || !this.config.enabled) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: 0,\r\n };\r\n }\r\n\r\n // \u8DF3\u8FC7\u5DE5\u5177\u8C03\u7528\u5FAA\u73AF\u4E2D\u7684\u8BF7\u6C42\r\n const messages = req.body?.messages;\r\n if (messages && contextAnalyzer.hasToolResults(messages)) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: 0,\r\n };\r\n }\r\n\r\n return modelSelector.selectModelSync({\r\n ...req,\r\n appConfig: this.appConfig ?? undefined,\r\n } as IRequestContext, this.config);\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA Fastify \u4E2D\u95F4\u4EF6\r\n * \u7528\u4E8E\u5728\u8BF7\u6C42\u5904\u7406\u524D\u6267\u884C\u89E6\u53D1\u8DEF\u7531\r\n *\r\n * @param appConfig \u5E94\u7528\u914D\u7F6E\r\n * @returns Fastify \u4E2D\u95F4\u4EF6\u51FD\u6570\r\n */\r\n createMiddleware(appConfig: IAppConfig) {\r\n this.init(appConfig);\r\n\r\n return async (req: any, reply: any) => {\r\n if (!this.isEnabled()) {\r\n return;\r\n }\r\n\r\n // \u53EA\u5904\u7406 /v1/messages \u8BF7\u6C42\r\n if (!req.url.startsWith('/v1/messages')) {\r\n return;\r\n }\r\n\r\n const startTime = Date.now();\r\n\r\n try {\r\n const result = await this.route(req);\r\n\r\n if (result.matched && result.model) {\r\n // \u8BBE\u7F6E\u9009\u4E2D\u7684\u6A21\u578B\r\n req.body.model = result.model;\r\n\r\n // \u8BB0\u5F55\u89E6\u53D1\u7ED3\u679C\u5230\u8BF7\u6C42\u4E0A\u4E0B\u6587\r\n req.triggerResult = result;\r\n\r\n log(\n `[TriggerRouter] ${\n result.routeSource === 'sticky_correction'\n ? 'Sticky correction selected'\n : result.routeSource === 'semantic_match'\n ? `Semantic match \"${result.rule?.name}\"`\n : result.routeSource === 'smart_router'\n ? 'Smart fallback selected'\n : result.routeSource === 'intent_fallback'\n ? `Intent fallback \"${result.rule?.name}\"`\n : result.rule\n ? `Matched rule \"${result.rule.name}\"`\n : 'Unified router selected'\n } -> model \"${result.model}\" ` +\n `(confidence: ${result.confidence}, time: ${result.analysisTime}ms)`\n );\n }\n } catch (error) {\r\n logError('[TriggerRouter] Error in trigger routing:', error);\r\n }\r\n };\r\n }\r\n}\r\n\r\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\r\nexport const triggerRouter = new TriggerRouter();\r\n", "import { IMessageIR } from './message-ir';\n\nfunction toOpenAIContent(parts: IMessageIR['messages'][number]['parts']) {\n const contentParts = parts.filter(\n (part) => part.type === 'text' || part.type === 'image'\n );\n\n if (!contentParts.length) {\n return null;\n }\n\n if (contentParts.length === 1 && contentParts[0].type === 'text') {\n return contentParts[0].text;\n }\n\n return contentParts.map((part) => {\n switch (part.type) {\n case 'text':\n return { type: 'text', text: part.text };\n case 'image':\n return { type: 'image_url', image_url: { url: part.source?.url ?? part.source } };\n default:\n return { type: 'text', text: '' };\n }\n });\n}\n\nfunction toOpenAIToolCalls(parts: IMessageIR['messages'][number]['parts']) {\n return parts\n .filter((part) => part.type === 'tool_call')\n .map((part) => ({\n id: part.id,\n type: 'function',\n function: {\n name: part.name,\n arguments: part.arguments,\n },\n }));\n}\n\nfunction toOpenAIToolResultMessages(parts: IMessageIR['messages'][number]['parts']) {\n return parts\n .filter((part) => part.type === 'tool_result')\n .map((part) => ({\n role: 'tool',\n tool_call_id: part.tool_call_id,\n content: typeof part.content === 'string' ? part.content : JSON.stringify(part.content),\n }));\n}\n\nfunction getToolName(tool: any) {\n return tool?.name ?? tool?.function?.name;\n}\n\nfunction getToolDescription(tool: any) {\n return tool?.description ?? tool?.function?.description;\n}\n\nfunction getToolInputSchema(tool: any) {\n return tool?.input_schema ?? tool?.function?.parameters;\n}\n\nfunction toOpenAITools(tools?: any[]) {\n if (!Array.isArray(tools) || !tools.length) {\n return undefined;\n }\n\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: getToolName(tool),\n description: getToolDescription(tool),\n parameters: getToolInputSchema(tool),\n },\n }));\n}\n\nfunction toOpenAIToolChoice(toolChoice?: any) {\n if (!toolChoice) {\n return undefined;\n }\n\n if (typeof toolChoice === 'string') {\n return toolChoice;\n }\n\n if (toolChoice.type === 'auto') {\n return 'auto';\n }\n\n if (toolChoice.type === 'any') {\n return 'required';\n }\n\n if (toolChoice.type === 'tool' && toolChoice.name) {\n return {\n type: 'function',\n function: {\n name: toolChoice.name,\n },\n };\n }\n\n return toolChoice;\n}\n\nexport function toOpenAIChatRequest(input: {\n model: string;\n max_completion_tokens?: number;\n stream?: boolean;\n tools?: any[];\n tool_choice?: any;\n ir: IMessageIR;\n}) {\n const messages = [\n ...input.ir.system.map((text) => ({ role: 'system', content: text })),\n ...input.ir.messages.flatMap((message) => {\n const content = toOpenAIContent(message.parts);\n const toolCalls = message.role === 'assistant'\n ? toOpenAIToolCalls(message.parts)\n : [];\n const toolResults = toOpenAIToolResultMessages(message.parts);\n const nextMessages: any[] = [];\n\n if (content !== null || toolCalls.length) {\n nextMessages.push({\n role: message.role,\n content,\n ...(toolCalls.length ? { tool_calls: toolCalls } : {}),\n });\n }\n\n if (toolResults.length) {\n nextMessages.push(...toolResults);\n }\n\n return nextMessages;\n }),\n ];\n\n const body: Record<string, any> = {\n model: input.model,\n messages,\n };\n\n if (input.max_completion_tokens !== undefined) {\n body.max_completion_tokens = input.max_completion_tokens;\n }\n\n if (input.stream !== undefined) {\n body.stream = input.stream;\n }\n\n const tools = toOpenAITools(input.tools);\n if (tools) {\n body.tools = tools;\n }\n\n const toolChoice = toOpenAIToolChoice(input.tool_choice);\n if (toolChoice !== undefined) {\n body.tool_choice = toolChoice;\n }\n\n if (input.ir.options?.thinking?.enabled) {\n body.reasoning = {\n ...(input.ir.options.thinking.effort ? { effort: input.ir.options.thinking.effort } : {}),\n };\n }\n\n return body;\n}\n", "import { createMessageIR, IMessageIR } from './message-ir';\nimport { toAnthropicMessagesRequest } from './anthropic';\nimport { toOpenAIChatRequest } from './openai';\nimport { ICompiledModelCapabilities } from '../trigger/types';\nimport { TCompatibilityProfile, TDispatchFormat, getDispatchFormatForProfile } from '../models/compile';\n\nexport type TProtocolDiagnosticCode =\n | 'thinking_ignored'\n | 'images_text_fallback'\n | 'tools_text_fallback';\n\nexport interface IProtocolDiagnosticDescription {\n code: TProtocolDiagnosticCode;\n severity: 'info' | 'warn';\n label: string;\n summary: string;\n action: string;\n}\n\nfunction stringifyFallbackContent(value: any): string {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === undefined) {\n return '';\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction applyCapabilityFallbacks(input: {\n ir: IMessageIR;\n request: Record<string, any>;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const diagnostics: string[] = [];\n const nextRequest = { ...input.request };\n const nextIR: IMessageIR = {\n ...input.ir,\n system: [...input.ir.system],\n messages: input.ir.messages.map((message) => ({\n ...message,\n parts: message.parts.map((part) => ({ ...part })),\n })),\n options: input.ir.options ? { ...input.ir.options } : undefined,\n };\n\n if (input.capabilities?.thinking.supported === false && nextIR.options?.thinking) {\n diagnostics.push('thinking_ignored');\n delete nextIR.options.thinking;\n delete nextRequest.thinking;\n if (nextIR.options && !Object.keys(nextIR.options).length) {\n delete nextIR.options;\n }\n }\n\n const hasImageParts = nextIR.messages.some((message) =>\n message.parts.some((part) => part.type === 'image')\n );\n if (input.capabilities?.images === false && hasImageParts) {\n diagnostics.push('images_text_fallback');\n nextIR.messages = nextIR.messages.map((message) => ({\n ...message,\n parts: message.parts.flatMap((part) => {\n if (part.type !== 'image') {\n return [part];\n }\n\n return [\n {\n type: 'text' as const,\n text: '[Image content omitted because the target model does not support image input.]',\n },\n ];\n }),\n }));\n }\n\n const hasToolParts = nextIR.messages.some((message) =>\n message.parts.some((part) => part.type === 'tool_call' || part.type === 'tool_result')\n );\n if (input.capabilities?.tools === false && (Array.isArray(nextRequest.tools) && nextRequest.tools.length || hasToolParts)) {\n diagnostics.push('tools_text_fallback');\n delete nextRequest.tools;\n delete nextRequest.tool_choice;\n nextIR.messages = nextIR.messages.map((message) => ({\n ...message,\n parts: message.parts.flatMap((part) => {\n if (part.type === 'tool_call') {\n return [\n {\n type: 'text' as const,\n text: `[Tool call omitted because the target model does not support tools] ${part.name}(${part.arguments})`,\n },\n ];\n }\n\n if (part.type === 'tool_result') {\n return [\n {\n type: 'text' as const,\n text: `[Tool result preserved as plain text] ${stringifyFallbackContent(part.content)}`,\n },\n ];\n }\n\n return [part];\n }),\n }));\n }\n\n return {\n diagnostics,\n ir: nextIR,\n request: nextRequest,\n };\n}\n\nexport function describeProtocolDiagnostic(code: TProtocolDiagnosticCode): IProtocolDiagnosticDescription {\n switch (code) {\n case 'thinking_ignored':\n return {\n code,\n severity: 'info',\n label: 'thinking \u5DF2\u5FFD\u7565',\n summary: '\u5F53\u524D\u6A21\u578B\u6216\u63A5\u53E3\u672A\u542F\u7528 reasoning \u80FD\u529B\uFF0C\u8BF7\u6C42\u4E2D\u7684 thinking \u8BBE\u7F6E\u4E0D\u4F1A\u7EE7\u7EED\u4F20\u7ED9\u4E0A\u6E38\u3002',\n action: '\u5982\u9700\u4FDD\u7559 thinking\uFF0C\u8BF7\u5207\u56DE\u652F\u6301 reasoning \u7684\u6A21\u578B\uFF0C\u6216\u79FB\u9664\u5F53\u524D\u6A21\u578B\u4E0A\u7684 thinking \u914D\u7F6E\u3002',\n };\n case 'images_text_fallback':\n return {\n code,\n severity: 'warn',\n label: '\u56FE\u7247\u5DF2\u964D\u7EA7\u4E3A\u6587\u672C',\n summary: '\u5F53\u524D\u6A21\u578B\u672A\u58F0\u660E\u56FE\u7247\u8F93\u5165\u80FD\u529B\uFF0C\u8BF7\u6C42\u4E2D\u7684\u56FE\u7247\u5185\u5BB9\u4F1A\u9000\u5316\u4E3A\u6587\u672C\u63D0\u793A\uFF0C\u4E0D\u4F1A\u539F\u6837\u53D1\u9001\u5230\u4E0A\u6E38\u3002',\n action: '\u5982\u9700\u4FDD\u7559\u56FE\u7247\u8F93\u5165\uFF0C\u8BF7\u542F\u7528 supports_images \u6216\u5207\u56DE\u652F\u6301\u56FE\u7247\u7684\u6A21\u578B\u3002',\n };\n case 'tools_text_fallback':\n return {\n code,\n severity: 'warn',\n label: '\u5DE5\u5177\u8C03\u7528\u5DF2\u964D\u7EA7\u4E3A\u6587\u672C',\n summary: '\u5F53\u524D\u6A21\u578B\u672A\u58F0\u660E\u5DE5\u5177\u80FD\u529B\uFF0Ctool definitions \u4E0E tool call/result \u4F1A\u9000\u5316\u4E3A\u666E\u901A\u6587\u672C\u5185\u5BB9\u3002',\n action: '\u5982\u9700\u4FDD\u7559\u5DE5\u5177\u8C03\u7528\uFF0C\u8BF7\u542F\u7528 supports_tools \u6216\u5207\u56DE\u652F\u6301\u5DE5\u5177\u7684\u6A21\u578B\u3002',\n };\n default:\n return {\n code,\n severity: 'info',\n label: code,\n summary: '\u672A\u77E5\u534F\u8BAE\u8BCA\u65AD\u3002',\n action: '\u8BF7\u7ED3\u5408\u539F\u59CB\u8BF7\u6C42\u548C\u4E0A\u6E38\u54CD\u5E94\u7EE7\u7EED\u6392\u67E5\u3002',\n };\n }\n}\n\nfunction omitRequestFields(body: Record<string, any>) {\n const {\n model,\n messages,\n system,\n tools,\n thinking,\n metadata,\n max_tokens,\n max_completion_tokens,\n ...rest\n } = body;\n\n return rest;\n}\n\nexport function buildUpstreamRequestFromIR(input: {\n model: string;\n interface: 'openai' | 'anthropic';\n request: Record<string, any>;\n ir: IMessageIR;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const fallback = applyCapabilityFallbacks({\n ir: input.ir,\n request: input.request,\n capabilities: input.capabilities,\n });\n const passthrough = omitRequestFields(fallback.request);\n\n if (input.interface === 'anthropic') {\n return {\n diagnostics: fallback.diagnostics,\n ...passthrough,\n ...toAnthropicMessagesRequest({\n model: input.model,\n max_tokens: fallback.request.max_tokens,\n stream: fallback.request.stream,\n metadata: fallback.request.metadata,\n tools: fallback.request.tools,\n tool_choice: fallback.request.tool_choice,\n ir: fallback.ir,\n }),\n };\n }\n\n return {\n diagnostics: fallback.diagnostics,\n ...passthrough,\n ...toOpenAIChatRequest({\n model: input.model,\n max_completion_tokens: fallback.request.max_tokens ?? fallback.request.max_completion_tokens,\n stream: fallback.request.stream,\n tools: fallback.request.tools,\n tool_choice: fallback.request.tool_choice,\n ir: fallback.ir,\n }),\n };\n}\n\nexport function buildProviderDispatchRequestFromIR(input: {\n model: string;\n interface: 'openai' | 'anthropic';\n compatibilityProfile: TCompatibilityProfile;\n request: Record<string, any>;\n ir: IMessageIR;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const fallback = applyCapabilityFallbacks({\n ir: input.ir,\n request: input.request,\n capabilities: input.capabilities,\n });\n const passthrough = omitRequestFields(fallback.request);\n const dispatchFormat: TDispatchFormat = getDispatchFormatForProfile(input.interface, input.compatibilityProfile);\n\n if (dispatchFormat === 'openai_chat') {\n return {\n dispatchFormat,\n diagnostics: fallback.diagnostics,\n ...passthrough,\n ...toOpenAIChatRequest({\n model: input.model,\n max_completion_tokens: fallback.request.max_tokens ?? fallback.request.max_completion_tokens,\n stream: fallback.request.stream,\n tools: fallback.request.tools,\n tool_choice: fallback.request.tool_choice,\n ir: fallback.ir,\n }),\n };\n }\n\n return {\n dispatchFormat,\n diagnostics: fallback.diagnostics,\n ...passthrough,\n ...toAnthropicMessagesRequest({\n model: input.model,\n max_tokens: fallback.request.max_tokens ?? fallback.request.max_completion_tokens,\n stream: fallback.request.stream,\n metadata: fallback.request.metadata,\n tools: fallback.request.tools,\n tool_choice: fallback.request.tool_choice,\n ir: fallback.ir,\n }),\n };\n}\n\nexport function buildProviderDispatchRequest(input: {\n model: string;\n interface: 'openai' | 'anthropic';\n compatibilityProfile: TCompatibilityProfile;\n request: Record<string, any>;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const ir = createMessageIR(input.request);\n const { diagnostics, dispatchFormat, ...body } = buildProviderDispatchRequestFromIR({\n model: input.model,\n interface: input.interface,\n compatibilityProfile: input.compatibilityProfile,\n request: input.request,\n ir,\n capabilities: input.capabilities,\n });\n\n return {\n ir,\n body,\n diagnostics,\n dispatchFormat,\n };\n}\n\nexport function buildUpstreamRequest(input: {\n model: string;\n interface: 'openai' | 'anthropic';\n request: Record<string, any>;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const ir = createMessageIR(input.request);\n const { diagnostics, ...body } = buildUpstreamRequestFromIR({\n model: input.model,\n interface: input.interface,\n request: input.request,\n ir,\n capabilities: input.capabilities,\n });\n\n return {\n ir,\n body,\n diagnostics,\n };\n}\n", "/**\n * Claude Trigger Router\n *\n * \u667A\u80FD\u89E6\u53D1\u8DEF\u7531\u5668\u4E3B\u5165\u53E3\n */\n\nimport { existsSync } from \"fs\";\nimport { writeFile } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { initConfig, initDir } from \"./utils\";\nimport { createServer } from \"./server\";\nimport { router } from \"./router\";\nimport { apiKeyAuth } from \"./middleware/auth\";\nimport {\n cleanupPidFile,\n isServiceRunning,\n savePid,\n} from \"./utils/processCheck\";\nimport { HOME_DIR } from \"./constants\";\nimport { configureLogging, log, logError, logWarn, logDebug } from \"./utils/log\";\nimport { sessionUsageCache } from \"./router/cache\";\nimport { SSEParserTransform } from \"./utils/SSEParser.transform\";\nimport { SSESerializerTransform } from \"./utils/SSESerializer.transform\";\nimport { rewriteStream } from \"./utils/rewriteStream\";\nimport JSON5 from \"json5\";\nimport { IAgent } from \"./agents/type\";\nimport agentsManager from \"./agents\";\nimport { EventEmitter } from \"node:events\";\nimport { triggerRouter } from \"./trigger\";\nimport { createStream } from 'rotating-file-stream';\nimport { appendTraceReason, applyResponseGovernance, contextAlignmentService, createGovernanceTrace, governStreamingResponse, sessionStateStore } from \"./governance\";\nimport { buildModelRegistry, getCompiledModelRef, resolveModelReference } from \"./models/compile\";\nimport { buildProviderDispatchRequest } from \"./protocols\";\n\nconst event = new EventEmitter();\n\nfunction cloneRequestBody<T>(value: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n\n return JSON.parse(JSON.stringify(value));\n}\n\n/**\n * \u521D\u59CB\u5316 Claude \u914D\u7F6E\n */\nasync function initializeClaudeConfig() {\n const homeDir = homedir();\n const configPath = join(homeDir, \".claude.json\");\n if (!existsSync(configPath)) {\n // \u81EA\u52A8\u521B\u5EFA ~/.claude.json\uFF0C\u6807\u8BB0 onboarding \u5DF2\u5B8C\u6210\uFF0C\u907F\u514D Claude Code \u91CD\u590D\u8D70\u5F15\u5BFC\u6D41\u7A0B\n // \u4EC5\u5728\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u521B\u5EFA\uFF0C\u4E0D\u4F1A\u8986\u76D6\u7528\u6237\u5DF2\u6709\u7684\u914D\u7F6E\n log(`Creating ${configPath} for Claude Code compatibility (onboarding bypass)`);\n const userID = Array.from(\n { length: 64 },\n () => Math.random().toString(16)[2]\n ).join(\"\");\n const configContent = {\n numStartups: 184,\n autoUpdaterStatus: \"enabled\",\n userID,\n hasCompletedOnboarding: true,\n lastOnboardingVersion: \"1.0.17\",\n projects: {},\n };\n await writeFile(configPath, JSON.stringify(configContent, null, 2));\n }\n}\n\ninterface RunOptions {\n port?: number;\n}\n\n/**\n * \u8FD0\u884C\u670D\u52A1\n */\nasync function run(options: RunOptions = {}) {\n // \u68C0\u67E5\u670D\u52A1\u662F\u5426\u5DF2\u5728\u8FD0\u884C\n if (isServiceRunning()) {\n log(\"\u2705 Service is already running in the background.\");\n return;\n }\n\n await initDir();\n\n const config = await initConfig();\n\n // \u914D\u7F6E\u65E5\u5FD7\n configureLogging(config);\n\n let HOST = config.HOST || \"127.0.0.1\";\n\n if (config.HOST && !config.APIKEY) {\n HOST = \"127.0.0.1\";\n logWarn(\"\u26A0\uFE0F API key is not set. HOST is forced to 127.0.0.1.\");\n }\n\n const port = options.port ?? config.PORT ?? DEFAULT_CONFIG.PORT;\n\n // \u4FDD\u5B58 PID \u53CA\u5143\u6570\u636E\uFF08\u7AEF\u53E3\u3001\u542F\u52A8\u65F6\u95F4\uFF09\uFF0C\u4F9B ctr status \u7B49\u547D\u4EE4\u4F7F\u7528\n savePid(process.pid, port);\n\n // \u5904\u7406\u9000\u51FA\u4FE1\u53F7\n process.on(\"SIGINT\", () => {\n log(\"Received SIGINT, cleaning up...\");\n cleanupPidFile();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", () => {\n cleanupPidFile();\n process.exit(0);\n });\n\n const servicePort = process.env.SERVICE_PORT\n ? parseInt(process.env.SERVICE_PORT)\n : port;\n\n // \u5C06\u5B9E\u9645\u8FD0\u884C\u7AEF\u53E3\u5199\u56DE config\uFF0C\u786E\u4FDD\u6240\u6709\u5185\u90E8\u6A21\u5757\uFF08TriggerRouter\u3001ImageAgent \u7B49\uFF09\n // \u81EA\u56DE\u8C03\u65F6\u4F7F\u7528\u540C\u4E00\u7AEF\u53E3\uFF0C\u907F\u514D --port \u8986\u76D6\u4E0E\u914D\u7F6E\u6587\u4EF6 PORT \u4E0D\u4E00\u81F4\u5BFC\u81F4\u7684\u95EE\u9898\n config.PORT = servicePort;\n\n // \u914D\u7F6E\u65E5\u5FD7\u5668\n const pad = (num: number) => (num > 9 ? \"\" : \"0\") + num;\n const generator = (time: Date | number, index: number | undefined) => {\n if (!time) {\n time = new Date();\n }\n const date = new Date(time);\n const month = date.getFullYear() + \"\" + pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hour = pad(date.getHours());\n const minute = pad(date.getMinutes());\n const seconds = pad(date.getSeconds());\n\n return `ctr-${month}${day}${hour}${minute}${seconds}${index ? `_${index}` : ''}.log`;\n };\n\n const loggerConfig =\n config.LOG !== false\n ? {\n level: config.LOG_LEVEL || \"debug\",\n stream: createStream(generator, {\n path: HOME_DIR,\n maxFiles: 3,\n interval: \"1d\",\n compress: 'gzip'\n }),\n }\n : false;\n\n // \u521B\u5EFA\u670D\u52A1\u5668\n const registry = buildModelRegistry(config);\n const server = createServer({\n useJsonFile: false,\n initialConfig: {\n providers: registry.providers,\n HOST: HOST,\n PORT: servicePort,\n LOG_FILE: join(\n homedir(),\n \".claude-trigger-router\",\n \"claude-trigger-router.log\"\n ),\n },\n logger: loggerConfig,\n });\n\n // \u8BA4\u8BC1\u4E2D\u95F4\u4EF6\n server.addHook(\"preHandler\", async (req: any, reply: any) => {\n return new Promise<void>((resolve, reject) => {\n const done = (err?: Error) => {\n if (err) reject(err);\n else resolve();\n };\n apiKeyAuth(config)(req, reply, done);\n });\n });\n\n // \u521D\u59CB\u5316\u89E6\u53D1\u8DEF\u7531\u5668\n triggerRouter.init(config);\n log(`[TriggerRouter] Initialized, enabled: ${triggerRouter.isEnabled()}`);\n\n // \u89E6\u53D1\u8DEF\u7531\u4E2D\u95F4\u4EF6\uFF08\u5728\u539F\u6709\u8DEF\u7531\u4E4B\u524D\uFF09\n server.addHook(\"preHandler\", async (req: any, reply: any) => {\n if (req.url.startsWith(\"/v1/messages\")) {\n if (req.body.metadata?.user_id) {\n const parts = req.body.metadata.user_id.split(\"_session_\");\n if (parts.length > 1) {\n req.sessionId = parts[1];\n }\n }\n\n req.governanceTrace = createGovernanceTrace({\n requestId: req.id,\n sessionKey: req.sessionId,\n initialModel: req.body?.model,\n });\n appendTraceReason(req.governanceTrace, \"request_received\");\n\n const bypassTriggerRouter = req.headers[\"x-ctr-smart-router\"] === \"1\";\n const triggerResult = bypassTriggerRouter\n ? { matched: false, confidence: 0, analysisTime: 0 }\n : await triggerRouter.route(req);\n req.triggerResult = triggerResult;\n\n if (!bypassTriggerRouter && triggerResult.matched && triggerResult.model) {\n const previousSessionState = req.sessionId ? sessionStateStore.get(req.sessionId) : undefined;\n const previousModel = previousSessionState?.lastSuccessfulModel;\n const alignmentConfig = config.Governance?.sticky?.alignment;\n\n if (\n config.Governance?.enabled &&\n alignmentConfig?.enabled &&\n previousModel &&\n previousModel !== triggerResult.model &&\n triggerResult.analyzedText\n ) {\n const resolvedAlignmentConfig = {\n ...alignmentConfig,\n summarizer_model: resolveModelReference(config, alignmentConfig.summarizer_model) ?? alignmentConfig.summarizer_model,\n };\n const summary = await contextAlignmentService.summarizeTransition(\n triggerResult.analyzedText,\n previousModel,\n triggerResult.model,\n resolvedAlignmentConfig,\n servicePort,\n undefined,\n config.APIKEY,\n config.API_TIMEOUT_MS\n );\n\n if (summary) {\n req.body.system = contextAlignmentService.injectAlignmentContext(\n req.body.system,\n summary,\n previousModel,\n triggerResult.model\n );\n req.governanceTrace.alignmentUsed = true;\n appendTraceReason(req.governanceTrace, 'context_alignment');\n }\n }\n\n req.body.model = triggerResult.model;\n req.governanceTrace.finalModel = triggerResult.model;\n\n log(\n `[TriggerRouter] Matched rule \"${triggerResult.rule?.name}\" -> \"${triggerResult.model}\"`\n );\n }\n\n // Agent \u5904\u7406\n const useAgents: string[] = [];\n\n for (const agent of agentsManager.getAllAgents()) {\n if (agent.shouldHandle(req, config)) {\n useAgents.push(agent.name);\n agent.reqHandler(req, config);\n\n if (agent.tools.size) {\n if (!req.body?.tools?.length) {\n req.body.tools = [];\n }\n req.body.tools.unshift(\n ...Array.from(agent.tools.values()).map((item) => ({\n name: item.name,\n description: item.description,\n input_schema: item.input_schema,\n }))\n );\n }\n }\n }\n\n if (useAgents.length) {\n req.agents = useAgents;\n }\n\n // \u6267\u884C\u539F\u6709\u8DEF\u7531\n await router(req, reply, {\n config,\n event,\n });\n\n const compiledModel = getCompiledModelRef(config, req.body?.model);\n if (compiledModel?.interface && req.body?.messages) {\n const originalBody = cloneRequestBody(req.body);\n const upstream = buildProviderDispatchRequest({\n model: compiledModel.modelName,\n interface: compiledModel.interface,\n compatibilityProfile: compiledModel.compatibilityProfile,\n request: originalBody,\n capabilities: compiledModel.capabilities,\n });\n\n req.originalRequestBody = originalBody;\n req.messageIR = upstream.ir;\n req.upstreamRequestBody = upstream.body;\n req.upstreamInterface = compiledModel.interface;\n req.protocolDiagnostics = upstream.diagnostics;\n if (upstream.diagnostics.length) {\n logWarn(\n `[ProtocolDispatch] Model \"${compiledModel.id}\" reported capability diagnostics: ${upstream.diagnostics.join(', ')}`\n );\n }\n req.body = {\n ...upstream.body,\n model: req.body.model,\n };\n }\n }\n });\n\n // \u9519\u8BEF\u5904\u7406\n server.addHook(\"onError\", async (request: any, reply: any, error: any) => {\n event.emit(\"onError\", request, reply, error);\n });\n\n // \u54CD\u5E94\u5904\u7406\n server.addHook(\"onSend\", (req: any, reply: any, payload: any, done: any) => {\n if (req.originalRequestBody) {\n req.body = req.originalRequestBody;\n }\n\n if (req.sessionId && req.url.startsWith(\"/v1/messages\")) {\n if (payload instanceof ReadableStream) {\n if (req.agents) {\n const abortController = new AbortController();\n const sseParser = new SSEParserTransform();\n const eventStream = payload.pipeThrough(sseParser as any);\n let currentAgent: IAgent | undefined;\n let currentToolIndex = -1;\n let currentToolName = \"\";\n let currentToolArgs = \"\";\n let currentToolId = \"\";\n const toolMessages: any[] = [];\n const assistantMessages: any[] = [];\n\n const sseSerializer = new SSESerializerTransform();\n\n const agentStream = rewriteStream(eventStream, async (data: any, controller: any) => {\n try {\n // \u5DE5\u5177\u8C03\u7528\u5F00\u59CB\n if (\n data.event === \"content_block_start\" &&\n data?.data?.content_block?.name\n ) {\n const agent = req.agents.find((name: string) =>\n agentsManager\n .getAgent(name)\n ?.tools.get(data.data.content_block.name)\n );\n if (agent) {\n currentAgent = agentsManager.getAgent(agent);\n currentToolIndex = data.data.index;\n currentToolName = data.data.content_block.name;\n currentToolId = data.data.content_block.id;\n return undefined;\n }\n }\n\n // \u6536\u96C6\u5DE5\u5177\u53C2\u6570\n if (\n currentToolIndex > -1 &&\n data.data.index === currentToolIndex &&\n data.data?.delta?.type === \"input_json_delta\"\n ) {\n currentToolArgs += data.data?.delta?.partial_json;\n return undefined;\n }\n\n // \u5DE5\u5177\u8C03\u7528\u5B8C\u6210\n if (\n currentToolIndex > -1 &&\n data.data.index === currentToolIndex &&\n data.data.type === \"content_block_stop\"\n ) {\n try {\n const args = JSON5.parse(currentToolArgs);\n assistantMessages.push({\n type: \"tool_use\",\n id: currentToolId,\n name: currentToolName,\n input: args,\n });\n const toolResult = await currentAgent?.tools\n .get(currentToolName)\n ?.handler(args, {\n req,\n config,\n });\n logDebug(\"Tool result:\", toolResult);\n toolMessages.push({\n tool_use_id: currentToolId,\n type: \"tool_result\",\n content: toolResult,\n });\n currentAgent = undefined;\n currentToolIndex = -1;\n currentToolName = \"\";\n currentToolArgs = \"\";\n currentToolId = \"\";\n } catch (e) {\n logError(\"Tool execution error:\", e);\n }\n return undefined;\n }\n\n if (data.event === \"message_delta\" && toolMessages.length) {\n req.body.messages.push({\n role: \"assistant\",\n content: assistantMessages,\n });\n req.body.messages.push({\n role: \"user\",\n content: toolMessages,\n });\n const response = await fetch(\n `http://127.0.0.1:${servicePort}/v1/messages`,\n {\n method: \"POST\",\n headers: {\n \"x-api-key\": config.APIKEY || \"\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(req.body),\n }\n );\n if (!response.ok) {\n return undefined;\n }\n const innerSseParser = new SSEParserTransform();\n const stream = response.body!.pipeThrough(innerSseParser as any);\n const reader = stream.getReader();\n while (true) {\n try {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n if (\n [\"message_start\", \"message_stop\"].includes(value.event)\n ) {\n continue;\n }\n\n if (!controller.desiredSize) {\n logWarn(\"Stream backpressure detected\");\n break;\n }\n\n controller.enqueue(value);\n } catch (readError: any) {\n if (\n readError.name === \"AbortError\" ||\n readError.code === \"ERR_STREAM_PREMATURE_CLOSE\"\n ) {\n log(\n \"Stream reading aborted due to client disconnect\"\n );\n abortController.abort();\n break;\n }\n throw readError;\n }\n }\n return undefined;\n }\n return data;\n } catch (error: any) {\n logError(\n \"Unexpected error in stream processing:\",\n error\n );\n\n if (error.code === \"ERR_STREAM_PREMATURE_CLOSE\") {\n log(\"Stream prematurely closed, aborting operations\");\n abortController.abort();\n return undefined;\n }\n\n throw error;\n }\n }).pipeThrough(sseSerializer as any);\n\n return done(\n null,\n governStreamingResponse(agentStream, req, config, servicePort)\n );\n }\n\n return done(null, governStreamingResponse(payload, req, config, servicePort));\n }\n sessionUsageCache.put(req.sessionId, payload.usage);\n }\n if (typeof payload === \"object\" && payload.error) {\n return done(payload.error, null);\n }\n done(null, payload);\n });\n\n server.addHook(\"onSend\", async (req: any, reply: any, payload: any) => {\n if (payload instanceof ReadableStream) {\n return payload;\n }\n\n payload = await applyResponseGovernance({\n req,\n payload,\n config,\n servicePort,\n });\n\n if (req.governanceTrace) {\n logDebug(\"[GovernanceTrace]\", JSON.stringify(req.governanceTrace));\n }\n\n logDebug(\"onSend hook triggered\");\n event.emit(\"onSend\", req, reply, payload);\n return payload;\n });\n\n await server.start();\n}\n\nexport { run, initializeClaudeConfig };\n", "import { DetectedService } from './detect';\r\n\r\ninterface IDecideServiceActionInput {\r\n configChanged: boolean;\r\n detectedService: DetectedService;\r\n reloadSupported: boolean;\r\n}\r\n\r\nexport type SetupServiceAction =\r\n | { kind: 'reuse' }\r\n | { kind: 'start' }\r\n | { kind: 'reload' }\r\n | { kind: 'restart' };\r\n\r\ninterface IApplyServiceActionInput {\r\n action: SetupServiceAction;\r\n executeStart: () => Promise<void>;\r\n executeReload: () => Promise<void>;\r\n executeRestart: () => Promise<void>;\r\n verifyHealth: () => Promise<boolean>;\r\n}\r\n\r\nexport function decideServiceAction(input: IDecideServiceActionInput): SetupServiceAction {\r\n if (input.detectedService.kind === 'non_self_occupied') {\r\n throw new Error('target port is occupied by another service');\r\n }\r\n\r\n if (input.detectedService.kind === 'none') {\r\n return { kind: 'start' };\r\n }\r\n\r\n if (input.detectedService.kind === 'self_unhealthy') {\r\n return { kind: 'restart' };\r\n }\r\n\r\n if (input.configChanged && input.detectedService.kind === 'self_healthy') {\r\n return input.reloadSupported ? { kind: 'reload' } : { kind: 'restart' };\r\n }\r\n\r\n return { kind: 'reuse' };\r\n}\r\n\r\nexport async function applyServiceAction(input: IApplyServiceActionInput): Promise<void> {\n if (input.action.kind === 'start') {\r\n await input.executeStart();\r\n }\r\n\r\n if (input.action.kind === 'reload') {\r\n await input.executeReload();\r\n }\r\n\r\n if (input.action.kind === 'restart') {\r\n await input.executeRestart();\r\n }\r\n\r\n const healthy = await input.verifyHealth();\n if (!healthy) {\n if (input.action.kind === 'restart') {\n throw new Error('service health check failed after restart; the previous ctr service may still be shutting down. Please wait a moment and retry, or run `ctr stop` first.');\n }\n if (input.action.kind === 'start') {\n throw new Error('service health check failed after start; please check whether the target port is already occupied or the configuration is still invalid.');\n }\n if (input.action.kind === 'reload') {\n throw new Error('service health check failed after reload; please retry or run `ctr restart` / `ctr stop` first.');\n }\n throw new Error('service health check failed while reusing the current service; please run `ctr status` or `ctr restart` to verify it.');\n }\n}\n", "export type SetupRepairField = 'defaultModel' | 'apiKey' | 'apiBaseUrl' | 'capabilityHints' | 'manualReview';\n\r\nfunction mapRepairField(error: string): SetupRepairField {\r\n if (error === 'Router.default is required') {\r\n return 'defaultModel';\r\n }\r\n\r\n if (/^(Providers\\[\\d+\\]\\.api_key|Models\\[\\d+\\]\\.key) is required$/.test(error)) {\n return 'apiKey';\n }\n\n if (/^(Providers\\[\\d+\\]\\.api_base_url|Models\\[\\d+\\]\\.api) is required$/.test(error)) {\n return 'apiBaseUrl';\n }\n\n if (\n /^Models\\[\\d+\\]\\.thinking is configured, but model \".+\" disables reasoning\\./.test(error) ||\n /^Models\\[\\d+\\]\\.metadata\\.supports_tools disables tools/.test(error) ||\n /^Models\\[\\d+\\]\\.metadata\\.supports_images disables image input/.test(error)\n ) {\n return 'capabilityHints';\n }\n\n return 'manualReview';\n}\n\r\nexport function getRepairFields(errors: string[]): SetupRepairField[] {\r\n const fields: SetupRepairField[] = [];\r\n\r\n for (const error of errors) {\r\n const field = mapRepairField(error);\r\n if (!fields.includes(field)) {\r\n fields.push(field);\r\n }\r\n }\r\n\r\n return fields;\r\n}\r\n", "import { ISetupConfigDraft } from './types';\r\n\r\nexport interface IMigrateLegacyConfigResult {\r\n draft: ISetupConfigDraft;\r\n skippedFields: string[];\r\n needsCompletion: boolean;\r\n missingFields: string[];\r\n}\r\n\r\ninterface ILegacyProviderInput {\n name?: string;\n api_base_url?: string;\n api_key?: string;\n models?: string[];\n transformer?: {\n use?: string[];\n [key: string]: unknown;\n } | unknown;\n headers?: unknown;\n}\n\r\ninterface ILegacyRouterInput {\n default?: string;\n background?: unknown;\n think?: unknown;\n longContext?: unknown;\n longContextThreshold?: unknown;\n webSearch?: unknown;\n}\n\r\ninterface ILegacyConfigInput {\r\n providers?: ILegacyProviderInput[] | unknown;\r\n default?: string | unknown;\r\n trigger_router?: unknown;\r\n Providers?: ILegacyProviderInput[] | unknown;\r\n Router?: ILegacyRouterInput | unknown;\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface INormalizedLegacyConfig {\n providers: Array<{\n name: string;\n api_base_url?: string;\n api_key: string;\n models: string[];\n }>;\n defaultRoute?: string;\n routeSlots: {\n background?: string;\n think?: string;\n longContext?: string;\n longContextThreshold?: number;\n webSearch?: string;\n };\n supportedTopLevelConfig: Partial<ISetupConfigDraft>;\n skippedFields: string[];\n}\n\nconst KNOWN_UNSUPPORTED_TOP_LEVEL_FIELDS = new Set([\n 'CLAUDE_PATH',\n 'transformers',\n 'StatusLine',\n 'trigger_router',\n]);\n\r\nfunction inferProtocolFromApiBaseUrl(apiBaseUrl?: string): 'openai' | 'anthropic' {\r\n if (apiBaseUrl?.includes('/v1/messages')) {\r\n return 'anthropic';\r\n }\r\n\r\n return 'openai';\r\n}\r\n\r\nfunction normalizeSegment(value: string): string {\r\n return value\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '_')\r\n .replace(/^_+|_+$/g, '');\r\n}\r\n\r\nfunction toModelId(name: string, model: string, index: number): string {\n const normalizedName = normalizeSegment(name) || `provider_${index + 1}`;\r\n const normalizedModel = normalizeSegment(model);\r\n\r\n return normalizedModel ? `${normalizedName}_${normalizedModel}` : normalizedName;\r\n}\r\n\r\nfunction createEmptyDraft(): ISetupConfigDraft {\r\n return {\r\n Providers: [],\r\n Models: [],\r\n Router: {},\r\n };\r\n}\r\n\r\nfunction createNonMigratableResult(): IMigrateLegacyConfigResult {\n return {\n draft: createEmptyDraft(),\n skippedFields: [],\n needsCompletion: true,\n missingFields: ['defaultModel', 'apiKey', 'apiBaseUrl'],\n };\n}\n\nfunction isLegacyProviderInput(value: unknown): value is ILegacyProviderInput {\n return typeof value === 'object' && value !== null;\n}\n\r\nfunction isLegacyRouterInput(value: unknown): value is ILegacyRouterInput {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\nfunction pushUnique(target: string[], value: string): void {\n if (!target.includes(value)) {\n target.push(value);\n }\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string'\n ? value.trim()\n : undefined;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n if (value.toLowerCase() === 'true') {\n return true;\n }\n if (value.toLowerCase() === 'false') {\n return false;\n }\n }\n return undefined;\n}\n\nfunction readFiniteNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction extractSupportedTopLevelConfig(input: ILegacyConfigInput, consumedTopLevelFields: Set<string>): Partial<ISetupConfigDraft> {\n const nextConfig: Partial<ISetupConfigDraft> = {};\n const hasOwn = (key: string) => Object.prototype.hasOwnProperty.call(input, key);\n\n const host = readString(input.HOST);\n if (hasOwn('HOST')) {\n nextConfig.HOST = host;\n consumedTopLevelFields.add('HOST');\n }\n\n const port = readFiniteNumber(input.PORT);\n if (hasOwn('PORT') && port !== undefined) {\n nextConfig.PORT = port;\n consumedTopLevelFields.add('PORT');\n }\n\n const log = readBoolean(input.LOG);\n if (hasOwn('LOG') && log !== undefined) {\n nextConfig.LOG = log;\n consumedTopLevelFields.add('LOG');\n }\n\n const logLevel = readString(input.LOG_LEVEL);\n if (hasOwn('LOG_LEVEL')) {\n nextConfig.LOG_LEVEL = logLevel;\n consumedTopLevelFields.add('LOG_LEVEL');\n }\n\n const apiTimeoutMs = readFiniteNumber(input.API_TIMEOUT_MS);\n if (hasOwn('API_TIMEOUT_MS') && apiTimeoutMs !== undefined) {\n nextConfig.API_TIMEOUT_MS = apiTimeoutMs;\n consumedTopLevelFields.add('API_TIMEOUT_MS');\n }\n\n const proxyUrl = readString(input.PROXY_URL);\n if (hasOwn('PROXY_URL')) {\n nextConfig.PROXY_URL = proxyUrl;\n consumedTopLevelFields.add('PROXY_URL');\n }\n\n const apiKey = readString(input.APIKEY);\n if (hasOwn('APIKEY')) {\n nextConfig.APIKEY = apiKey;\n consumedTopLevelFields.add('APIKEY');\n }\n\n const customRouterPath = readString(input.CUSTOM_ROUTER_PATH);\n if (hasOwn('CUSTOM_ROUTER_PATH')) {\n nextConfig.CUSTOM_ROUTER_PATH = customRouterPath;\n consumedTopLevelFields.add('CUSTOM_ROUTER_PATH');\n }\n\n return nextConfig;\n}\n\r\nfunction normalizeLegacyConfig(input: ILegacyConfigInput): INormalizedLegacyConfig | null {\r\n const lowerProviders = Array.isArray(input.providers) && input.providers.every(isLegacyProviderInput)\r\n ? input.providers\r\n : null;\r\n const upperProviders = Array.isArray(input.Providers) && input.Providers.every(isLegacyProviderInput)\r\n ? input.Providers\r\n : null;\r\n\r\n const providerKey = lowerProviders && lowerProviders.length > 0\r\n ? 'providers'\r\n : upperProviders && upperProviders.length > 0\r\n ? 'Providers'\r\n : lowerProviders\r\n ? 'providers'\r\n : upperProviders\r\n ? 'Providers'\r\n : null;\r\n\r\n if (!providerKey) {\r\n return null;\r\n }\r\n\r\n const rawProviders = providerKey === 'providers' ? lowerProviders : upperProviders;\r\n if (!rawProviders) {\r\n return null;\r\n }\r\n\r\n const skippedFields: string[] = [];\n const alternateProviderKey = providerKey === 'providers' ? 'Providers' : 'providers';\r\n const alternateDefaultKey = providerKey === 'providers' ? 'Router' : 'default';\r\n const alternateDefaultValue = providerKey === 'providers' ? input.Router : input.default;\r\n const alternateProviders = providerKey === 'providers' ? upperProviders : lowerProviders;\r\n if (alternateProviders !== null) {\r\n pushUnique(skippedFields, alternateProviderKey);\r\n }\r\n if (alternateDefaultValue !== undefined) {\r\n pushUnique(skippedFields, alternateDefaultKey);\r\n }\r\n\r\n const consumedTopLevelFields = new Set<string>([providerKey]);\n const supportedTopLevelConfig = extractSupportedTopLevelConfig(input, consumedTopLevelFields);\n const providers = rawProviders.map((provider, index) => {\n if (provider.transformer !== undefined) {\n pushUnique(skippedFields, `${providerKey}[${index}].transformer`);\n }\n if (provider.headers !== undefined) {\r\n pushUnique(skippedFields, `${providerKey}[${index}].headers`);\r\n }\r\n\r\n return {\r\n name: provider.name ?? '',\n api_base_url: provider.api_base_url,\n api_key: provider.api_key ?? '',\n models: Array.isArray(provider.models) ? provider.models : [],\n };\n });\n\r\n let defaultRoute: string | undefined;\n const routeSlots: INormalizedLegacyConfig['routeSlots'] = {};\n if (providerKey === 'providers') {\n consumedTopLevelFields.add('default');\n defaultRoute = typeof input.default === 'string' ? input.default : undefined;\n } else {\n consumedTopLevelFields.add('Router');\n if (isLegacyRouterInput(input.Router)) {\n defaultRoute = typeof input.Router.default === 'string' ? input.Router.default : undefined;\n routeSlots.background = readString(input.Router.background);\n routeSlots.think = readString(input.Router.think);\n routeSlots.longContext = readString(input.Router.longContext);\n routeSlots.webSearch = readString(input.Router.webSearch);\n routeSlots.longContextThreshold = readFiniteNumber(input.Router.longContextThreshold);\n }\n }\n\r\n for (const key of Object.keys(input)) {\r\n if (consumedTopLevelFields.has(key)) {\r\n continue;\r\n }\r\n\r\n pushUnique(skippedFields, key);\r\n }\r\n\r\n return {\n providers,\n defaultRoute,\n routeSlots,\n supportedTopLevelConfig,\n skippedFields,\n };\n}\n\r\nexport function migrateLegacyConfig(input: ILegacyConfigInput): IMigrateLegacyConfigResult {\n const normalized = normalizeLegacyConfig(input);\r\n if (!normalized) {\r\n return createNonMigratableResult();\r\n }\r\n\r\n const rawEntries = normalized.providers.flatMap((provider, providerIndex) =>\r\n (provider.models.length ? provider.models : [''])\r\n .map((model) => ({\n candidateId: toModelId(provider.name, model, providerIndex),\n api: provider.api_base_url,\n api_base_url: provider.api_base_url,\n key: provider.api_key,\n api_key: provider.api_key,\r\n interface: inferProtocolFromApiBaseUrl(provider.api_base_url),\n protocol: inferProtocolFromApiBaseUrl(provider.api_base_url),\n model,\n providerName: provider.name,\n }))\n .filter((item) => item.model)\n );\n\r\n const seenIds = new Map<string, number>();\n const routeLookup = new Map<string, string>();\n\r\n const models = rawEntries.map((entry) => {\r\n const count = seenIds.get(entry.candidateId) ?? 0;\r\n seenIds.set(entry.candidateId, count + 1);\r\n const finalId = count === 0 ? entry.candidateId : `${entry.candidateId}_${count + 1}`;\r\n routeLookup.set(`${entry.providerName.trim()},${entry.model}`, finalId);\r\n return {\r\n id: finalId,\r\n api: entry.api,\r\n api_base_url: entry.api_base_url,\r\n key: entry.key,\n api_key: entry.api_key,\n interface: entry.interface,\n protocol: entry.protocol,\n model: entry.model,\n };\n });\n\n const resolveLegacyRoute = (ref: string | undefined, fieldName: string): string | undefined => {\n if (!ref) {\n return undefined;\n }\n\n const [rawProviderName, rawModelName] = String(ref).split(',');\n const providerName = (rawProviderName ?? '').trim();\n const modelName = (rawModelName ?? '').trim();\n const fromLookup = routeLookup.get(`${providerName},${modelName}`);\n if (fromLookup) {\n return fromLookup;\n }\n\n pushUnique(normalized.skippedFields, fieldName);\n return undefined;\n };\n\n const hasLegacyDefaultRoute =\n typeof normalized.defaultRoute === 'string' && normalized.defaultRoute.length > 0;\n const defaultModelId = hasLegacyDefaultRoute\n ? resolveLegacyRoute(normalized.defaultRoute, 'Router.default')\n : undefined;\n const backgroundModelId = resolveLegacyRoute(normalized.routeSlots.background, 'Router.background');\n const thinkModelId = resolveLegacyRoute(normalized.routeSlots.think, 'Router.think');\n const longContextModelId = resolveLegacyRoute(normalized.routeSlots.longContext, 'Router.longContext');\n const webSearchModelId = resolveLegacyRoute(normalized.routeSlots.webSearch, 'Router.webSearch');\n const hasMissingApiKey = normalized.providers.some((provider) => provider.api_key.length === 0);\n const hasMissingApiBaseUrl = normalized.providers.some((provider) => (provider.api_base_url?.trim() ?? '').length === 0);\n const missingFields: string[] = [];\n\n if (!defaultModelId) {\n missingFields.push('defaultModel');\n }\n if (hasMissingApiKey) {\n missingFields.push('apiKey');\n }\n if (hasMissingApiBaseUrl) {\n missingFields.push('apiBaseUrl');\n }\n\n return {\n draft: {\n ...normalized.supportedTopLevelConfig,\n Providers: [],\n Models: models,\n Router: {\n ...(defaultModelId ? { default: defaultModelId } : {}),\n ...(backgroundModelId ? { background: backgroundModelId } : {}),\n ...(thinkModelId ? { think: thinkModelId } : {}),\n ...(longContextModelId ? { longContext: longContextModelId } : {}),\n ...(normalized.routeSlots.longContextThreshold !== undefined ? { longContextThreshold: normalized.routeSlots.longContextThreshold } : {}),\n ...(webSearchModelId ? { webSearch: webSearchModelId } : {}),\n },\n },\n skippedFields: normalized.skippedFields,\n needsCompletion: missingFields.length > 0,\n missingFields,\r\n };\r\n}\r\n", "import { normalizeAndValidateConfig } from '../utils/config';\r\nimport { IAppConfig } from '../trigger/types';\r\n\r\nexport type ConfigFormat = 'yaml' | 'yml' | 'json';\r\n\r\nexport type RawCurrentConfigResult =\r\n | { kind: 'missing' }\r\n | {\r\n kind: 'found';\r\n path: string;\r\n format: ConfigFormat;\r\n config: Partial<IAppConfig>;\r\n }\r\n | {\r\n kind: 'parse_error';\r\n path: string;\r\n format: ConfigFormat;\r\n error: string;\r\n };\r\n\r\nexport type RawLegacyConfigResult =\r\n | { kind: 'missing' }\r\n | {\r\n kind: 'found';\r\n path: string;\r\n config: unknown;\r\n }\r\n | {\r\n kind: 'read_error';\r\n path: string;\r\n error: string;\r\n };\r\n\r\nexport type DetectedService =\r\n | { kind: 'none' }\r\n | { kind: 'self_healthy'; port: number }\r\n | { kind: 'self_unhealthy'; port: number }\r\n | { kind: 'non_self_occupied'; port: number };\r\n\r\nexport type SetupCurrentConfig =\r\n | { kind: 'missing' }\r\n | {\n kind: 'valid';\n path: string;\n format: ConfigFormat;\n config: IAppConfig;\n errors: [];\n warnings: string[];\n }\n | {\n kind: 'invalid';\n path: string;\n format: ConfigFormat;\n config: IAppConfig;\n errors: string[];\n warnings: string[];\n }\n | {\r\n kind: 'parse_error';\r\n path: string;\r\n format: ConfigFormat;\r\n error: string;\r\n };\r\n\r\nexport interface IDetectSetupEnvironmentDeps {\r\n readCurrentConfig: () => Promise<RawCurrentConfigResult>;\r\n readLegacyConfig: () => Promise<RawLegacyConfigResult>;\r\n probeService: () => Promise<DetectedService>;\r\n}\r\n\r\nexport interface ISetupEnvironmentDetectionResult {\r\n currentConfig: SetupCurrentConfig;\r\n legacyConfig: RawLegacyConfigResult;\r\n detectedService: DetectedService;\r\n}\r\n\r\nfunction normalizeCurrentConfig(result: RawCurrentConfigResult): SetupCurrentConfig {\r\n if (result.kind === 'missing' || result.kind === 'parse_error') {\r\n return result;\r\n }\r\n\r\n const normalized = normalizeAndValidateConfig(result.config);\r\n if (normalized.errors.length === 0) {\r\n return {\r\n kind: 'valid',\r\n path: result.path,\r\n format: result.format,\n config: normalized.config,\n errors: [],\n warnings: normalized.warnings,\n };\n }\n\r\n return {\r\n kind: 'invalid',\r\n path: result.path,\r\n format: result.format,\n config: normalized.config,\n errors: normalized.errors,\n warnings: normalized.warnings,\n };\n}\n\r\nexport async function detectSetupEnvironment(\r\n deps: IDetectSetupEnvironmentDeps\r\n): Promise<ISetupEnvironmentDetectionResult> {\r\n const [currentConfig, legacyConfig, detectedService] = await Promise.all([\r\n deps.readCurrentConfig(),\r\n deps.readLegacyConfig(),\r\n deps.probeService(),\r\n ]);\r\n\r\n return {\r\n currentConfig: normalizeCurrentConfig(currentConfig),\r\n legacyConfig,\r\n detectedService,\r\n };\r\n}\r\n", "/**\n * Setup Templates\n *\n * \u63D0\u4F9B\u914D\u7F6E\u6A21\u677F\u548C\u9884\u8BBE\n */\n\nimport { DEFAULT_CONFIG } from '../constants';\nimport { getProviderPreset as getSharedProviderPreset } from '../provider-presets';\nimport { IProviderPreset, IMinimalConfigInput, ISetupConfigDraft, ISetupModelDraft, IUsableMinimalTemplateConfig, ProviderPresetKey } from './types';\n\r\ntype IModelIdAwareProviderInput = IMinimalConfigInput['providers'][number] & {\r\n model_id?: string;\r\n};\r\n\r\n/**\r\n * \u83B7\u53D6 Provider \u9884\u8BBE\u914D\u7F6E\r\n * @param key \u9884\u8BBE\u952E\u540D\r\n * @returns \u9884\u8BBE\u914D\u7F6E\uFF0C\u4E0D\u5B58\u5728\u5219\u8FD4\u56DE undefined\r\n */\r\nexport function getProviderPreset(key: ProviderPresetKey): IProviderPreset | undefined {\r\n const preset = getSharedProviderPreset(key);\r\n if (!preset) {\r\n return undefined;\r\n }\r\n\r\n return {\n api: preset.api,\n api_base_url: preset.api_base_url,\n interface: preset.interface,\n protocol: preset.protocol,\n default_thinking: preset.default_thinking,\n };\n}\n\r\n/**\r\n * \u6784\u5EFA\u6700\u5C0F\u914D\u7F6E\r\n * @param input \u6700\u5C0F\u914D\u7F6E\u8F93\u5165\r\n * @returns \u5B8C\u6574\u7684\u5E94\u7528\u914D\u7F6E\r\n */\r\nexport function buildMinimalConfig(input: IMinimalConfigInput): ISetupConfigDraft {\r\n const providers = input.providers as IModelIdAwareProviderInput[];\r\n\r\n const models: ISetupModelDraft[] = providers.map((p) => {\r\n const preset = p.preset ? getProviderPreset(p.preset) : undefined;\r\n const modelDraft: ISetupModelDraft = {\r\n id: p.model_id?.trim() || p.name,\r\n key: p.api_key,\r\n api_key: p.api_key,\r\n model: p.models[0] ?? '',\r\n interface: preset?.interface ?? 'openai',\r\n protocol: preset?.protocol ?? 'openai',\r\n };\r\n\r\n const explicitApiBaseUrl = p.api_base_url?.trim();\r\n const presetApiBaseUrl = preset?.api_base_url?.trim();\r\n const apiBaseUrl = explicitApiBaseUrl || presetApiBaseUrl;\r\n if (apiBaseUrl) {\r\n modelDraft.api = apiBaseUrl;\r\n modelDraft.api_base_url = apiBaseUrl;\r\n }\r\n\r\n return modelDraft;\r\n });\r\n\r\n let defaultModel = input.defaultModel?.trim();\r\n if (input.defaultModel && input.defaultModel.includes(',')) {\r\n const [providerName, modelName] = input.defaultModel.split(',');\r\n const matched = models.find((item) => item.id === providerName && item.model === modelName);\r\n if (matched) {\r\n defaultModel = matched.id;\r\n }\r\n }\r\n\r\n if (input.defaultModel === undefined && models.length > 0) {\r\n const firstModelId = models[0].id;\r\n if (firstModelId && models[0].model) {\r\n defaultModel = firstModelId;\r\n }\r\n }\r\n\r\n if (defaultModel === '' || defaultModel === undefined) {\r\n defaultModel = undefined;\r\n }\r\n\r\n return {\n Models: models,\n Router: defaultModel ? { default: defaultModel } : {},\n };\n}\n\nexport function buildUsableMinimalTemplateConfig(): IUsableMinimalTemplateConfig {\n const openRouterPreset = getSharedProviderPreset('openrouter');\n const modelId = openRouterPreset?.suggested_id ?? 'sonnet';\n const modelName = openRouterPreset?.default_model ?? 'anthropic/claude-sonnet-4';\n const thinking = openRouterPreset?.default_thinking ?? 'auto';\n\n const draft = buildMinimalConfig({\n providers: [\n {\n name: 'openrouter',\n model_id: modelId,\n preset: 'openrouter',\n api_key: 'sk-xxx',\n models: [modelName],\n } as IModelIdAwareProviderInput,\n ],\n defaultModel: modelId,\n });\n\n const primaryModel = draft.Models?.[0];\n\n return {\n HOST: DEFAULT_CONFIG.HOST,\n PORT: DEFAULT_CONFIG.PORT,\n LOG: DEFAULT_CONFIG.LOG,\n LOG_LEVEL: DEFAULT_CONFIG.LOG_LEVEL,\n Models: primaryModel\n ? [\n {\n id: primaryModel.id,\n api: primaryModel.api,\n key: primaryModel.key,\n interface: primaryModel.interface,\n model: primaryModel.model,\n thinking,\n },\n ]\n : [],\n Router: draft.Router,\n };\n}\n", "import { extname } from 'path';\r\n\r\nimport { IAppConfig } from '../trigger/types';\r\n\r\ninterface IPersistSetupConfigInput {\r\n config: IAppConfig;\r\n currentConfigPath: string;\r\n hasExistingConfig: boolean;\r\n validateConfig: (config: IAppConfig) => string[];\r\n backupCurrentConfig: () => Promise<string | null>;\r\n writeConfig: (config: IAppConfig) => Promise<void>;\r\n}\r\n\r\ninterface IPersistSetupConfigResult {\r\n configChanged: boolean;\r\n configPath: string;\r\n backupPath?: string;\r\n}\r\n\r\nfunction formatUtcTimestamp(date: Date): string {\r\n const year = date.getUTCFullYear();\r\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\r\n const day = String(date.getUTCDate()).padStart(2, '0');\r\n const hours = String(date.getUTCHours()).padStart(2, '0');\r\n const minutes = String(date.getUTCMinutes()).padStart(2, '0');\r\n const seconds = String(date.getUTCSeconds()).padStart(2, '0');\r\n const milliseconds = String(date.getUTCMilliseconds()).padStart(3, '0');\r\n\r\n return `${year}${month}${day}T${hours}${minutes}${seconds}${milliseconds}`;\r\n}\r\n\r\nexport function buildBackupPath(currentConfigPath: string, now: Date, suffix?: string): string {\r\n const extension = extname(currentConfigPath) || '.yaml';\r\n const timestamp = formatUtcTimestamp(now);\r\n const collisionSuffix = suffix ? `-${suffix}` : '';\r\n\r\n return currentConfigPath.replace(\r\n new RegExp(`${extension.replace('.', '\\\\.')}$`),\r\n `.backup.${timestamp}${collisionSuffix}${extension}`\r\n );\r\n}\r\n\r\nexport async function persistSetupConfig(\r\n input: IPersistSetupConfigInput\r\n): Promise<IPersistSetupConfigResult> {\r\n const errors = input.validateConfig(input.config);\r\n if (errors.length > 0) {\r\n throw new Error('config validation failed');\r\n }\r\n\r\n let backupPath: string | undefined;\r\n if (input.hasExistingConfig) {\r\n const createdBackupPath = await input.backupCurrentConfig();\r\n if (!createdBackupPath) {\r\n throw new Error('failed to back up existing config');\r\n }\r\n backupPath = createdBackupPath;\r\n }\r\n\r\n await input.writeConfig(input.config);\r\n\r\n return {\r\n configChanged: true,\r\n configPath: input.currentConfigPath,\r\n backupPath,\r\n };\r\n}\r\n", "import { ISetupEnvironmentDetectionResult } from './detect';\r\n\r\nexport type CurrentConfigAction =\r\n | 'reuse'\r\n | 'overwrite'\r\n | 'fresh'\r\n | 'repair'\r\n | 'rebuild'\r\n | 'create'\r\n | 'cancel';\r\n\r\nexport type LegacyConfigAction = 'migrate' | 'skip';\r\n\r\nexport type SetupBranchDecision =\r\n | { kind: 'reuse_current' }\r\n | { kind: 'repair_current' }\r\n | { kind: 'unparseable_current' }\r\n | { kind: 'migrate_legacy' }\r\n | { kind: 'fresh_init' }\r\n | { kind: 'cancelled' };\r\n\r\nexport interface IDecideSetupBranchInput {\r\n detection: ISetupEnvironmentDetectionResult;\r\n currentConfigAction: CurrentConfigAction;\r\n legacyConfigAction?: LegacyConfigAction;\r\n}\r\n\r\nfunction resolveLegacyChoice(\r\n detection: ISetupEnvironmentDetectionResult,\r\n legacyConfigAction?: LegacyConfigAction\r\n): SetupBranchDecision {\r\n if (detection.legacyConfig.kind === 'found') {\r\n if (!legacyConfigAction) {\r\n throw new Error('legacy migration choice is required');\r\n }\r\n\r\n return legacyConfigAction === 'migrate'\r\n ? { kind: 'migrate_legacy' }\r\n : { kind: 'fresh_init' };\r\n }\r\n\r\n if (detection.legacyConfig.kind === 'read_error') {\r\n if (!legacyConfigAction) {\r\n throw new Error('legacy read error must be acknowledged');\r\n }\r\n if (legacyConfigAction !== 'skip') {\r\n throw new Error('legacy migration action is only valid when legacy config is found');\r\n }\r\n return { kind: 'fresh_init' };\r\n }\r\n\r\n if (legacyConfigAction) {\r\n throw new Error('legacy migration action is only valid when legacy config is found');\r\n }\r\n\r\n return { kind: 'fresh_init' };\r\n}\r\n\r\nfunction invalidCurrentAction(): never {\r\n throw new Error('invalid current config action');\r\n}\r\n\r\nfunction invalidLegacyAction(): never {\r\n throw new Error('invalid legacy config action');\r\n}\r\n\r\nfunction ensureNoLegacyAction(legacyConfigAction?: LegacyConfigAction): void {\r\n if (legacyConfigAction) {\r\n invalidLegacyAction();\r\n }\r\n}\r\n\r\nfunction ensureLegacyFlow(\r\n detection: ISetupEnvironmentDetectionResult,\r\n legacyConfigAction?: LegacyConfigAction\r\n): SetupBranchDecision {\r\n return resolveLegacyChoice(detection, legacyConfigAction);\r\n}\r\n\r\nfunction invalidAction(): never {\r\n return invalidCurrentAction();\r\n}\r\n\r\nexport function decideSetupBranch(input: IDecideSetupBranchInput): SetupBranchDecision {\r\n const { detection, currentConfigAction, legacyConfigAction } = input;\r\n\r\n if (currentConfigAction === 'cancel') {\r\n ensureNoLegacyAction(legacyConfigAction);\r\n return { kind: 'cancelled' };\r\n }\r\n\r\n switch (detection.currentConfig.kind) {\r\n case 'valid':\r\n if (currentConfigAction === 'reuse') {\r\n ensureNoLegacyAction(legacyConfigAction);\r\n return { kind: 'reuse_current' };\r\n }\r\n if (currentConfigAction === 'overwrite' || currentConfigAction === 'fresh') {\r\n return ensureLegacyFlow(detection, legacyConfigAction);\r\n }\r\n return invalidAction();\r\n\r\n case 'invalid':\r\n if (currentConfigAction === 'repair') {\r\n ensureNoLegacyAction(legacyConfigAction);\r\n return { kind: 'repair_current' };\r\n }\r\n if (currentConfigAction === 'overwrite') {\r\n return ensureLegacyFlow(detection, legacyConfigAction);\r\n }\r\n return invalidAction();\r\n\r\n case 'parse_error':\r\n ensureNoLegacyAction(legacyConfigAction);\r\n if (currentConfigAction === 'rebuild') {\r\n return { kind: 'unparseable_current' };\r\n }\r\n return invalidAction();\r\n\r\n case 'missing':\r\n if (currentConfigAction === 'create') {\r\n return ensureLegacyFlow(detection, legacyConfigAction);\r\n }\r\n return invalidAction();\r\n }\r\n}\r\n", "import { CONFIG_FILE } from '../constants';\r\nimport { decideSetupBranch, LegacyConfigAction } from './decision';\r\nimport { ISetupEnvironmentDetectionResult } from './detect';\r\nimport { IMigrateLegacyConfigResult } from './migrate';\r\nimport { ISetupPrompts, ISetupRepairPlan } from './prompts';\r\nimport { ISetupConfigDraft } from './types';\r\n\r\ninterface IRunSetupDeps extends ISetupPrompts {\r\n detectSetupEnvironment: () => Promise<ISetupEnvironmentDetectionResult>;\r\n migrateLegacyConfig: (input: unknown) => IMigrateLegacyConfigResult;\r\n mapConfigErrorsToRepairFields: (errors: string[]) => ISetupRepairPlan;\r\n persistConfig: (input: {\r\n config: ISetupConfigDraft;\r\n currentConfigPath: string;\r\n hasExistingConfig: boolean;\r\n }) => Promise<{\r\n configChanged: boolean;\r\n configPath: string;\r\n backupPath?: string;\r\n }>;\r\n ensureServiceReady: (input: {\r\n configChanged: boolean;\r\n detectedService: ISetupEnvironmentDetectionResult['detectedService'];\r\n reloadSupported: boolean;\r\n }) => Promise<{\r\n action: 'reuse' | 'start' | 'reload' | 'restart';\r\n healthChecked: boolean;\r\n }>;\r\n enterClaudeCode: () => Promise<void>;\r\n reloadSupported: boolean;\r\n}\r\n\r\nfunction getTargetConfigPath(detection: ISetupEnvironmentDetectionResult): string {\r\n if (detection.currentConfig.kind === 'valid' || detection.currentConfig.kind === 'invalid') {\r\n return detection.currentConfig.path;\r\n }\r\n\r\n if (detection.currentConfig.kind === 'parse_error') {\r\n return detection.currentConfig.path;\r\n }\r\n\r\n return CONFIG_FILE;\r\n}\r\n\r\nfunction getLegacyProviderCount(input: unknown): number {\r\n if (typeof input !== 'object' || input === null) {\r\n return 0;\r\n }\r\n\r\n const legacyConfig = input as { providers?: unknown; Providers?: unknown };\r\n if (Array.isArray(legacyConfig.providers)) {\r\n return legacyConfig.providers.length;\r\n }\r\n\r\n if (Array.isArray(legacyConfig.Providers)) {\r\n return legacyConfig.Providers.length;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nfunction getMigratedModelCount(draft: ISetupConfigDraft): number {\r\n if (Array.isArray(draft.Models)) {\r\n return draft.Models.length;\r\n }\r\n\r\n if (Array.isArray(draft.Providers)) {\r\n return draft.Providers.reduce((total, provider) => total + (provider.models?.length ?? 0), 0);\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nexport async function runSetup(deps: IRunSetupDeps): Promise<void> {\r\n const detection = await deps.detectSetupEnvironment();\r\n const currentConfigAction = await deps.chooseCurrentConfigAction({\r\n currentConfig: detection.currentConfig,\r\n legacyConfig: detection.legacyConfig,\r\n });\r\n\r\n let legacyConfigAction: LegacyConfigAction | undefined;\n if (\n currentConfigAction === 'create' ||\n currentConfigAction === 'overwrite' ||\n currentConfigAction === 'fresh'\n ) {\n if (detection.legacyConfig.kind === 'found' || detection.legacyConfig.kind === 'read_error') {\n legacyConfigAction = await deps.chooseLegacyConfigAction({\n legacyConfig: detection.legacyConfig,\n });\n }\r\n }\r\n\r\n const branch = decideSetupBranch({\r\n detection,\r\n currentConfigAction,\r\n legacyConfigAction,\r\n });\r\n\r\n if (branch.kind === 'cancelled') {\r\n return;\r\n }\r\n\r\n let configChanged = false;\r\n\r\n if (branch.kind === 'repair_current') {\r\n if (detection.currentConfig.kind !== 'invalid') {\r\n throw new Error('repair_current requires invalid current config');\r\n }\r\n\r\n const repairPlan = deps.mapConfigErrorsToRepairFields([\r\n ...detection.currentConfig.errors,\r\n ...detection.currentConfig.warnings,\r\n ]);\r\n if (repairPlan.mode === 'manualReview') {\r\n throw new Error('manual review is required for current config');\r\n }\r\n\r\n const baseDraft = await deps.buildRepairConfig({\r\n currentConfig: detection.currentConfig.config,\r\n fields: repairPlan.fields,\r\n });\r\n const completedDraft = await deps.completeDraft({\r\n draft: baseDraft,\r\n fields: repairPlan.fields,\r\n });\r\n const persistResult = await deps.persistConfig({\r\n config: completedDraft,\r\n currentConfigPath: detection.currentConfig.path,\r\n hasExistingConfig: true,\r\n });\r\n configChanged = persistResult.configChanged;\r\n }\r\n\r\n if (branch.kind === 'reuse_current') {\r\n await deps.ensureServiceReady({\r\n configChanged: false,\r\n detectedService: detection.detectedService,\r\n reloadSupported: deps.reloadSupported,\r\n });\r\n\r\n await deps.enterClaudeCode();\r\n return;\r\n }\r\n\r\n if (branch.kind === 'unparseable_current') {\r\n const draft = await deps.buildFreshConfig();\r\n const persistResult = await deps.persistConfig({\r\n config: draft,\r\n currentConfigPath: detection.currentConfig.path,\r\n hasExistingConfig: true,\r\n });\r\n configChanged = persistResult.configChanged;\r\n }\r\n\r\n if (branch.kind === 'fresh_init') {\r\n const draft = await deps.buildFreshConfig();\r\n const persistResult = await deps.persistConfig({\r\n config: draft,\r\n currentConfigPath: getTargetConfigPath(detection),\r\n hasExistingConfig: detection.currentConfig.kind !== 'missing',\r\n });\r\n configChanged = persistResult.configChanged;\r\n }\r\n\r\n if (branch.kind === 'migrate_legacy') {\r\n if (detection.legacyConfig.kind !== 'found') {\r\n throw new Error('migrate_legacy requires legacy config');\r\n }\r\n\r\n const migrated = deps.migrateLegacyConfig(detection.legacyConfig.config);\r\n deps.io.info(`\u5DF2\u8BC6\u522B\u65E7\u914D\u7F6E\u4E2D\u7684 ${getLegacyProviderCount(detection.legacyConfig.config)} \u4E2A provider\u3002`);\r\n deps.io.info(`\u5DF2\u4ECE\u65E7\u914D\u7F6E\u8FC1\u79FB ${getMigratedModelCount(migrated.draft)} \u4E2A\u6A21\u578B\u3002`);\r\n if (migrated.draft.Router.default) {\r\n deps.io.info(`\u8FC1\u79FB\u540E\u7684\u9ED8\u8BA4\u6A21\u578B\uFF1A${migrated.draft.Router.default}`);\r\n } else {\r\n deps.io.info('\u8FC1\u79FB\u540E\u7684\u9ED8\u8BA4\u6A21\u578B\u4ECD\u9700\u8865\u5168\u3002');\r\n }\r\n if (migrated.skippedFields.length > 0) {\r\n deps.io.info(`\u4EE5\u4E0B\u65E7\u5B57\u6BB5\u672A\u81EA\u52A8\u8FC1\u79FB\uFF1A${migrated.skippedFields.join(', ')}`);\r\n }\r\n\r\n let finalDraft = migrated.draft;\r\n if (migrated.needsCompletion) {\r\n finalDraft = await deps.completeDraft({\r\n draft: migrated.draft,\r\n fields: migrated.missingFields,\r\n });\r\n }\r\n\r\n const persistResult = await deps.persistConfig({\r\n config: finalDraft,\r\n currentConfigPath: getTargetConfigPath(detection),\r\n hasExistingConfig: detection.currentConfig.kind !== 'missing',\r\n });\r\n configChanged = persistResult.configChanged;\r\n }\r\n\r\n if (branch.kind === 'fresh_init' || branch.kind === 'repair_current' || branch.kind === 'unparseable_current' || branch.kind === 'migrate_legacy') {\r\n await deps.ensureServiceReady({\r\n configChanged,\r\n detectedService: detection.detectedService,\r\n reloadSupported: deps.reloadSupported,\r\n });\r\n\r\n await deps.enterClaudeCode();\r\n return;\r\n }\r\n\r\n}\r\n", "import { existsSync, readFileSync } from 'fs';\nimport { createServer } from 'net';\nimport { homedir } from 'os';\nimport { join } from 'path';\r\nimport { createInterface } from 'readline/promises';\r\nimport { stdin as input, stdout as output } from 'process';\r\nimport JSON5 from 'json5';\r\nimport yaml from 'js-yaml';\r\n\r\nimport { CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from '../constants';\r\nimport { getProviderPreset, listProviderPresetKeys } from '../provider-presets';\r\nimport { run } from '../index';\r\nimport { isTcpPortOccupied, waitForService } from '../service-health';\nimport { backupConfigFile, normalizeAndValidateConfig, writeConfigFile } from '../utils';\r\nimport { isServiceRunning, killProcess, readServiceInfo, waitForProcessExit } from '../utils/processCheck';\nimport { decideServiceAction, applyServiceAction } from './service';\r\nimport { getRepairFields } from './repair';\r\nimport { migrateLegacyConfig } from './migrate';\r\nimport { detectSetupEnvironment, RawCurrentConfigResult, RawLegacyConfigResult } from './detect';\r\nimport { buildMinimalConfig } from './templates';\r\nimport { persistSetupConfig } from './persist';\r\nimport { runSetup } from './setup';\nimport { ISetupConfigDraft, ProviderPresetKey } from './types';\n\r\ninterface ISetupIO {\n choose: (message: string, options: string[]) => Promise<string>;\n input: (message: string, defaultValue?: string) => Promise<string>;\n info: (message: string) => void;\n close?: () => void;\n}\n\r\ntype TCapabilityChoice = '\u9ED8\u8BA4' | '\u652F\u6301' | '\u7981\u7528';\r\ntype TCapabilityEditChoice = '\u4FDD\u6301\u5F53\u524D\u503C' | '\u7F16\u8F91 capability';\r\n\r\ninterface IRunSetupCliDeps {\r\n readCurrentConfig: () => Promise<RawCurrentConfigResult>;\r\n readLegacyConfig: () => Promise<RawLegacyConfigResult>;\r\n probeService: () => Promise<{ kind: 'none' } | { kind: 'self_healthy'; port: number } | { kind: 'self_unhealthy'; port: number } | { kind: 'non_self_occupied'; port: number }>;\r\n backupCurrentConfig: () => Promise<string | null>;\r\n writeConfig: (config: any) => Promise<void>;\r\n executeStart: () => Promise<void>;\r\n executeReload: () => Promise<void>;\r\n executeRestart: () => Promise<void>;\r\n verifyHealth: () => Promise<boolean>;\r\n enterClaudeCode: () => Promise<void>;\r\n io: ISetupIO;\r\n}\r\n\r\nfunction createConsoleIO(): ISetupIO {\n if (process.env.CTR_SETUP_FORCE_SCRIPTED_INPUT === '1') {\n const scriptedInput = readFileSync(0, 'utf-8');\n const answers = scriptedInput.split(/\\r?\\n/).map((item) => item.trim()).filter((item) => item.length > 0);\n let cursor = 0;\n\n const nextAnswer = async (): Promise<string> => answers[cursor++] ?? '';\n\n return {\n async choose(message, options) {\n output.write(`${message}\\n`);\n options.forEach((option, index) => {\n output.write(` ${index + 1}. ${option}\\n`);\n });\n\n const answer = await nextAnswer();\n const pickedIndex = Number(answer);\n if (Number.isInteger(pickedIndex) && pickedIndex >= 1 && pickedIndex <= options.length) {\n return options[pickedIndex - 1];\n }\n const matched = options.find((option) => option === answer);\n if (matched) {\n return matched;\n }\n throw new Error(`invalid scripted answer for \"${message}\": ${answer || '<empty>'}`);\n },\n async input(message, defaultValue) {\n const suffix = defaultValue ? ` (${defaultValue})` : '';\n output.write(`${message}${suffix}: `);\n const answer = await nextAnswer();\n return answer || defaultValue || '';\n },\n info(message) {\n output.write(`${message}\\n`);\n },\n close() {\n // No-op for scripted stdin.\n },\n };\n }\n\n if (!input.isTTY) {\n let loaded = false;\n let answers: string[] = [];\n let cursor = 0;\n\n const loadAnswers = async () => {\n if (loaded) {\n return;\n }\n loaded = true;\n const chunks: string[] = [];\n for await (const chunk of input) {\n chunks.push(String(chunk));\n }\n answers = chunks.join('').split(/\\r?\\n/).map((item) => item.trim()).filter((item) => item.length > 0);\n };\n\n const nextAnswer = async (): Promise<string> => {\n await loadAnswers();\n return answers[cursor++] ?? '';\n };\n\n return {\n async choose(message, options) {\n output.write(`${message}\\n`);\n options.forEach((option, index) => {\n output.write(` ${index + 1}. ${option}\\n`);\n });\n\n const answer = await nextAnswer();\n const pickedIndex = Number(answer);\n if (Number.isInteger(pickedIndex) && pickedIndex >= 1 && pickedIndex <= options.length) {\n return options[pickedIndex - 1];\n }\n const matched = options.find((option) => option === answer);\n if (matched) {\n return matched;\n }\n throw new Error(`invalid scripted answer for \"${message}\": ${answer || '<empty>'}`);\n },\n async input(message, defaultValue) {\n const suffix = defaultValue ? ` (${defaultValue})` : '';\n output.write(`${message}${suffix}: `);\n const answer = await nextAnswer();\n return answer || defaultValue || '';\n },\n info(message) {\n output.write(`${message}\\n`);\n },\n close() {\n // No-op for buffered non-interactive stdin.\n },\n };\n }\n\n const rl = createInterface({ input, output });\n\r\n const ask = async (message: string): Promise<string> => {\r\n const answer = await rl.question(message);\r\n return answer.trim();\r\n };\r\n\r\n return {\r\n async choose(message, options) {\r\n output.write(`${message}\\n`);\r\n options.forEach((option, index) => {\r\n output.write(` ${index + 1}. ${option}\\n`);\r\n });\r\n\r\n while (true) {\r\n const answer = await ask('> ');\r\n const pickedIndex = Number(answer);\r\n if (Number.isInteger(pickedIndex) && pickedIndex >= 1 && pickedIndex <= options.length) {\r\n return options[pickedIndex - 1];\r\n }\r\n const matched = options.find((option) => option === answer);\r\n if (matched) {\r\n return matched;\r\n }\r\n output.write('\u8BF7\u8F93\u5165\u9009\u9879\u7F16\u53F7\u3002\\n');\r\n }\r\n },\r\n async input(message, defaultValue) {\r\n const suffix = defaultValue ? ` (${defaultValue})` : '';\r\n const answer = await ask(`${message}${suffix}: `);\r\n return answer || defaultValue || '';\r\n },\r\n info(message) {\n output.write(`${message}\\n`);\n },\n close() {\n rl.close();\n },\n };\n}\n\r\nfunction readStructuredConfigFile(filePath: string): unknown {\n const content = readFileSync(filePath, 'utf-8');\r\n if (filePath.endsWith('.json')) {\r\n return JSON.parse(content);\r\n }\r\n return yaml.load(content);\r\n}\n\nfunction getCurrentRuntimeFields(): Partial<Record<'HOST' | 'PORT' | 'LOG' | 'LOG_LEVEL' | 'API_TIMEOUT_MS', unknown>> {\n const candidates = [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON];\n const currentPath = candidates.find((filePath) => existsSync(filePath));\n if (!currentPath) {\n return {};\n }\n\n try {\n const config = readStructuredConfigFile(currentPath) as Record<string, unknown> | null;\n if (!config || typeof config !== 'object') {\n return {};\n }\n\n const fields: Partial<Record<'HOST' | 'PORT' | 'LOG' | 'LOG_LEVEL' | 'API_TIMEOUT_MS', unknown>> = {};\n for (const key of ['HOST', 'PORT', 'LOG', 'LOG_LEVEL', 'API_TIMEOUT_MS'] as const) {\n if (config[key] !== undefined) {\n fields[key] = config[key];\n }\n }\n return fields;\n } catch {\n return {};\n }\n}\n\nfunction getConfiguredPortFromCurrentFiles(): number {\n const candidates = [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON];\n const currentPath = candidates.find((filePath) => existsSync(filePath));\n if (!currentPath) {\n return DEFAULT_CONFIG.PORT;\n }\n\n try {\n const config = readStructuredConfigFile(currentPath) as { PORT?: unknown } | null;\n if (config && typeof config.PORT === 'number' && Number.isFinite(config.PORT) && config.PORT > 0) {\n return config.PORT;\n }\n } catch {\n // Fall back to default port when current config cannot be parsed.\n }\n\n return DEFAULT_CONFIG.PORT;\n}\n\nasync function getAvailablePort(): Promise<number> {\n const server = createServer();\n try {\n return await new Promise<number>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n const address = server.address();\n if (!address || typeof address === 'string') {\n reject(new Error('failed to resolve available port'));\n return;\n }\n resolve(address.port);\n });\n });\n } finally {\n if (server.listening) {\n await new Promise<void>((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));\n }\n }\n}\n\r\nfunction readLegacyConfigFile(filePath: string): unknown {\r\n const content = readFileSync(filePath, 'utf-8');\r\n if (filePath.endsWith('.json')) {\r\n return JSON5.parse(content);\r\n }\r\n return yaml.load(content);\r\n}\r\n\r\ninterface IReadLegacyConfigDeps {\r\n homeDir?: string;\r\n exists?: (filePath: string) => boolean;\r\n readConfig?: (filePath: string) => unknown;\r\n}\r\n\r\nexport async function readLegacyConfig(deps: IReadLegacyConfigDeps = {}): Promise<RawLegacyConfigResult> {\r\n const baseHomeDir = deps.homeDir || homedir();\r\n const exists = deps.exists || existsSync;\r\n const readConfig = deps.readConfig || readLegacyConfigFile;\r\n const overridePath = process.env.CTR_SETUP_LEGACY_CONFIG_PATH;\r\n const candidatePaths = overridePath\r\n ? [overridePath]\r\n : [\r\n join(baseHomeDir, '.ccr', 'config.yaml'),\r\n join(baseHomeDir, '.claude-code-router', 'config.yaml'),\r\n join(baseHomeDir, '.claude-code-router', 'config.json'),\r\n ];\r\n\r\n const legacyPath = candidatePaths.find((filePath) => exists(filePath));\r\n if (!legacyPath) {\r\n return { kind: 'missing' };\r\n }\r\n\r\n try {\r\n return {\r\n kind: 'found',\r\n path: legacyPath,\r\n config: readConfig(legacyPath),\r\n };\r\n } catch (error) {\r\n return {\r\n kind: 'read_error',\r\n path: legacyPath,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\nasync function readCurrentConfig(): Promise<RawCurrentConfigResult> {\r\n const candidates = [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON];\r\n const currentPath = candidates.find((filePath) => existsSync(filePath));\r\n if (!currentPath) {\r\n return { kind: 'missing' };\r\n }\r\n\r\n try {\r\n return {\r\n kind: 'found',\r\n path: currentPath,\r\n format: currentPath.endsWith('.json') ? 'json' : currentPath.endsWith('.yml') ? 'yml' : 'yaml',\r\n config: (readStructuredConfigFile(currentPath) ?? {}) as Record<string, unknown>,\r\n };\r\n } catch (error) {\r\n return {\r\n kind: 'parse_error',\r\n path: currentPath,\r\n format: currentPath.endsWith('.json') ? 'json' : currentPath.endsWith('.yml') ? 'yml' : 'yaml',\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\nasync function probeService() {\n const port = getConfiguredPortFromCurrentFiles();\n const healthy = await waitForService(port, 500);\n if (healthy) {\n return isServiceRunning()\n ? { kind: 'self_healthy' as const, port }\n : { kind: 'non_self_occupied' as const, port };\n }\n\n const occupied = await isTcpPortOccupied(port, 500);\n if (!occupied) {\n return { kind: 'none' as const };\n }\n\n return isServiceRunning()\n ? { kind: 'self_unhealthy' as const, port }\n : { kind: 'non_self_occupied' as const, port };\n}\n\r\nasync function enterClaudeCode(): Promise<void> {\n if (process.env.CTR_SETUP_SKIP_ENTER_CODE === '1') {\n return;\n }\n const cliModule = await import('../cli');\n await cliModule.runClaudeCode();\n}\n\nfunction shouldAutoEnterClaudeCodeAfterSetup(): boolean {\n return process.env.CTR_SETUP_AUTO_ENTER_CODE === '1';\n}\n\r\nasync function executeStart(): Promise<void> {\n const childProcess = await import('child_process');\n childProcess.spawn(process.execPath, [process.argv[1], 'start'], {\n detached: true,\n stdio: 'ignore',\n env: { ...process.env, CTR_DAEMON: '1' },\n }).unref();\n}\n\r\nasync function executeRestart(): Promise<void> {\n const info = readServiceInfo();\n if (info) {\n try {\n killProcess(info.pid);\n await waitForProcessExit(info.pid, 5000);\n } catch {\n // Ignore stop failures here and rely on the following health check.\n }\n }\n await executeStart();\n}\r\n\r\nfunction mapConfigErrorsToRepairFields(errors: string[]) {\r\n const fields = getRepairFields(errors);\r\n return fields.includes('manualReview')\r\n ? { mode: 'manualReview' as const, fields }\r\n : { mode: 'repair' as const, fields };\r\n}\r\n\r\nfunction mapValidCurrentConfigChoice(choice: string): 'reuse' | 'overwrite' | 'fresh' | 'cancel' {\r\n if (choice === 'reuse' || choice === '\u76F4\u63A5\u4F7F\u7528\u5F53\u524D\u914D\u7F6E\uFF08\u63A8\u8350\uFF09') {\r\n return 'reuse';\r\n }\r\n if (choice === 'overwrite' || choice === '\u68C0\u67E5\u5E76\u8C03\u6574\u5F53\u524D\u914D\u7F6E') {\r\n return 'overwrite';\r\n }\r\n if (choice === 'fresh' || choice === '\u653E\u5F03\u5F53\u524D\u914D\u7F6E\uFF0C\u91CD\u65B0\u5F00\u59CB') {\r\n return 'fresh';\r\n }\r\n if (choice === 'cancel') {\r\n return 'cancel';\r\n }\r\n throw new Error('invalid current config action');\r\n}\r\n\r\nfunction mapLegacyConfigChoice(choice: string): 'migrate' | 'skip' {\r\n if (choice === 'migrate' || choice === '\u8FC1\u79FB\u65E7\u914D\u7F6E\uFF08\u63A8\u8350\uFF09') {\r\n return 'migrate';\r\n }\r\n if (choice === 'skip' || choice === '\u8DF3\u8FC7\u8FC1\u79FB\uFF0C\u624B\u52A8\u65B0\u5EFA') {\r\n return 'skip';\r\n }\r\n throw new Error('invalid legacy config action');\r\n}\r\n\r\nfunction toCapabilityBoolean(choice: TCapabilityChoice): boolean | undefined {\r\n if (choice === '\u652F\u6301') {\r\n return true;\r\n }\r\n if (choice === '\u7981\u7528') {\r\n return false;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction applyCapabilityMetadata(model: any, metadata?: Record<string, unknown>) {\r\n if (!metadata || !Object.keys(metadata).length) {\r\n delete model.metadata;\r\n return model;\r\n }\r\n\r\n model.metadata = {\r\n ...(model.metadata ?? {}),\r\n ...metadata,\r\n };\r\n\r\n if (!Object.keys(model.metadata || {}).length) {\r\n delete model.metadata;\r\n }\r\n\r\n return model;\r\n}\r\n\r\nasync function promptCapabilityMetadata(io: ISetupIO, currentMetadata?: Record<string, unknown>) {\r\n const vendorHint = await io.input('Vendor hint\uFF08\u53EF\u9009\uFF09', String(currentMetadata?.vendor_hint ?? ''));\r\n const reasoningChoice = await io.choose('Reasoning support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\r\n const toolChoice = await io.choose('Tool support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\r\n const imageChoice = await io.choose('Image support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\r\n\r\n const nextMetadata: Record<string, unknown> = {};\r\n if (vendorHint.trim()) {\r\n nextMetadata.vendor_hint = vendorHint.trim();\r\n }\r\n\r\n const reasoning = toCapabilityBoolean(reasoningChoice);\r\n if (reasoning !== undefined) {\r\n nextMetadata.supports_reasoning = reasoning;\r\n }\r\n\r\n const tools = toCapabilityBoolean(toolChoice);\r\n if (tools !== undefined) {\r\n nextMetadata.supports_tools = tools;\r\n }\r\n\r\n const images = toCapabilityBoolean(imageChoice);\r\n if (images !== undefined) {\r\n nextMetadata.supports_images = images;\r\n }\r\n\r\n return nextMetadata;\r\n}\r\n\r\nasync function promptCapabilityMetadataForDraft(draft: ISetupConfigDraft, io: ISetupIO) {\r\n if (!draft.Models?.length) {\r\n return;\r\n }\r\n\r\n for (const model of draft.Models) {\r\n const modelLabel = model.id || model.model || 'unnamed-model';\r\n const editChoice = await io.choose(`\u662F\u5426\u914D\u7F6E\u6A21\u578B ${modelLabel} \u7684 capability \u63D0\u793A`, ['\u4FDD\u6301\u5F53\u524D\u503C', '\u7F16\u8F91 capability']) as TCapabilityEditChoice;\r\n if (editChoice !== '\u7F16\u8F91 capability') {\r\n continue;\r\n }\r\n\r\n const metadata = await promptCapabilityMetadata(io, model.metadata);\r\n applyCapabilityMetadata(model, metadata);\r\n }\r\n}\r\n\r\nfunction toDraftFromConfig(config: any): ISetupConfigDraft {\r\n const derivedModels = !Array.isArray(config?.Models) && Array.isArray(config?.Providers)\r\n ? config.Providers.flatMap((provider: any) =>\r\n (Array.isArray(provider.models) ? provider.models : []).map((model: string) => ({\r\n id: `${provider.name}_${String(model).toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '')}`,\r\n key: provider.api_key ?? '',\r\n api_key: provider.api_key ?? '',\r\n api: provider.api_base_url,\r\n api_base_url: provider.api_base_url,\r\n interface: provider.api_base_url?.includes('/v1/messages') ? 'anthropic' : 'openai',\r\n protocol: provider.api_base_url?.includes('/v1/messages') ? 'anthropic' : 'openai',\r\n model,\r\n }))\r\n )\r\n : [];\r\n\r\n return {\r\n Providers: Array.isArray(config?.Providers)\r\n ? config.Providers.map((provider: any) => ({\r\n name: provider.name ?? '',\r\n api_key: provider.api_key ?? '',\r\n api_base_url: provider.api_base_url,\r\n models: Array.isArray(provider.models) ? [...provider.models] : [],\r\n transformer: provider.transformer?.use ? { use: [...provider.transformer.use] } : undefined,\r\n }))\r\n : [],\r\n Models: Array.isArray(config?.Models)\r\n ? config.Models.map((model: any) => ({\r\n id: model.id ?? '',\r\n key: model.key ?? model.api_key ?? '',\r\n api_key: model.api_key ?? '',\r\n api: model.api ?? model.api_base_url,\r\n api_base_url: model.api_base_url,\r\n interface: model.interface ?? model.protocol,\r\n protocol: model.protocol,\r\n model: model.model ?? '',\r\n thinking: typeof model.thinking === 'string'\r\n ? model.thinking\r\n : model.thinking\r\n ? { ...model.thinking }\r\n : undefined,\r\n metadata: model.metadata ? { ...model.metadata } : undefined,\r\n }))\r\n : derivedModels,\r\n Router: {\r\n default: Array.isArray(config?.Models)\r\n ? config?.Router?.default\r\n : Array.isArray(config?.Providers) && typeof config?.Router?.default === 'string' && config.Router.default.includes(',')\r\n ? derivedModels.find((item) => {\r\n const [providerName, modelName] = config.Router.default.split(',');\r\n return item.id.startsWith(`${providerName}_`) && item.model === modelName;\r\n })?.id\r\n : config?.Router?.default,\r\n },\r\n };\r\n}\r\n\r\nfunction toSuggestedModelId(providerName: string, model: string, preset: ProviderPresetKey): string {\r\n const presetDefinition = getProviderPreset(preset);\r\n if (presetDefinition?.suggested_id) {\r\n return presetDefinition.suggested_id;\r\n }\r\n\r\n const source = model || providerName || 'model';\r\n return source.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '') || 'model';\r\n}\r\n\r\nasync function buildFreshConfig(io: ISetupIO): Promise<ISetupConfigDraft> {\r\n const connectMode = await io.choose('\u8FD9\u4E2A\u6A21\u578B\u63A5\u5230\u54EA\u91CC\uFF1F', ['\u4F7F\u7528\u5E38\u89C1\u63A5\u5165\u6A21\u677F', '\u624B\u52A8\u586B\u5199\u63A5\u53E3']);\r\n\r\n let preset: ProviderPresetKey = 'custom';\r\n let providerName = 'provider';\r\n let apiBaseUrl = '';\r\n\r\n if (connectMode === '\u4F7F\u7528\u5E38\u89C1\u63A5\u5165\u6A21\u677F') {\r\n const presetOptions = listProviderPresetKeys('setup');\r\n preset = await io.choose('\u9009\u62E9 provider \u9884\u8BBE', presetOptions) as ProviderPresetKey;\r\n providerName = await io.input('Provider \u540D\u79F0', preset);\r\n apiBaseUrl = preset === 'custom' ? await io.input('API Base URL') : await io.input('API Base URL\uFF08\u7559\u7A7A\u4F7F\u7528\u9884\u8BBE\uFF09', '');\r\n } else {\r\n providerName = await io.input('Provider \u540D\u79F0', 'provider');\r\n apiBaseUrl = await io.input('API Base URL');\r\n }\r\n\r\n const apiKey = await io.input('API Key');\r\n const presetDefinition = getProviderPreset(preset);\r\n const model = await io.input('\u4E0A\u6E38\u6A21\u578B\u540D', presetDefinition?.default_model ?? '');\r\n const modelId = await io.input('\u9ED8\u8BA4\u6A21\u578B ID', toSuggestedModelId(providerName, model, preset));\r\n const capabilityMode = await io.choose('\u662F\u5426\u914D\u7F6E capability \u63D0\u793A', ['\u4FDD\u6301\u9ED8\u8BA4', '\u914D\u7F6E capability \u63D0\u793A']);\r\n\r\n const draft = buildMinimalConfig({\r\n providers: [\r\n {\r\n name: providerName,\r\n model_id: modelId,\r\n api_key: apiKey,\r\n models: [model],\r\n preset,\r\n api_base_url: apiBaseUrl,\r\n },\r\n ],\r\n defaultModel: modelId,\r\n });\r\n\r\n if (capabilityMode === '\u914D\u7F6E capability \u63D0\u793A' && draft.Models?.[0]) {\r\n await promptCapabilityMetadataForDraft(draft, io);\r\n }\r\n\r\n return draft;\r\n}\r\n\r\nasync function completeDraft(input: { draft: ISetupConfigDraft; fields: string[]; io: ISetupIO }): Promise<ISetupConfigDraft> {\r\n const draft = toDraftFromConfig(input.draft);\r\n\r\n if (input.fields.includes('defaultModel')) {\r\n const defaultProvider = draft.Models?.[0]?.id ?? draft.Providers?.[0]?.name ?? 'provider';\r\n const defaultModel = draft.Models?.[0]?.model ?? draft.Providers?.[0]?.models?.[0] ?? '';\r\n const model = await input.io.input('\u9ED8\u8BA4\u6A21\u578B', defaultModel);\r\n if (draft.Models?.[0]) {\r\n draft.Models[0].model = model;\r\n draft.Router.default = defaultProvider;\r\n } else if (draft.Providers?.[0]) {\r\n draft.Providers[0].models = [model];\r\n draft.Router.default = `${defaultProvider},${model}`;\r\n }\r\n }\r\n\r\n if (input.fields.includes('apiKey')) {\r\n const apiKey = await input.io.input('API Key');\r\n if (draft.Models?.length) {\r\n draft.Models = draft.Models.map((model) => ({ ...model, key: model.key || apiKey, api_key: model.api_key || apiKey }));\r\n } else {\r\n draft.Providers = draft.Providers?.map((provider) => ({ ...provider, api_key: provider.api_key || apiKey }));\r\n }\r\n }\r\n\r\n if (input.fields.includes('apiBaseUrl')) {\r\n const apiBaseUrl = await input.io.input('API Base URL');\r\n if (draft.Models?.length) {\r\n draft.Models = draft.Models.map((model) => ({\r\n ...model,\r\n api: model.api || apiBaseUrl,\r\n api_base_url: model.api_base_url || apiBaseUrl,\r\n }));\r\n } else {\r\n draft.Providers = draft.Providers?.map((provider) => ({\r\n ...provider,\r\n api_base_url: provider.api_base_url || apiBaseUrl,\r\n }));\r\n }\r\n }\r\n\r\n if (input.fields.includes('capabilityHints') && draft.Models?.[0]) {\r\n await promptCapabilityMetadataForDraft(draft, input.io);\r\n }\r\n\r\n return draft;\r\n}\r\n\r\nfunction createDefaultDeps(io = createConsoleIO()): IRunSetupCliDeps {\n return {\n readCurrentConfig,\r\n readLegacyConfig,\r\n probeService,\r\n backupCurrentConfig: backupConfigFile,\r\n writeConfig: writeConfigFile,\r\n executeStart,\r\n executeReload: executeRestart,\r\n executeRestart,\r\n verifyHealth: () => waitForService(getConfiguredPortFromCurrentFiles(), 5000),\n enterClaudeCode,\n io,\n };\n}\n\nfunction printRoutingNextSteps(io: ISetupIO): void {\n io.info('\u4F60\u53EF\u4EE5\u6309\u9700\u7EE7\u7EED\u914D\u7F6E\u8DEF\u7531\u80FD\u529B\uFF1A');\n io.info(' - TriggerRouter\uFF1A\u9002\u5408\u9AD8\u786E\u5B9A\u6027\u4EFB\u52A1\uFF0C\u628A\u67B6\u6784\u8BBE\u8BA1\u3001\u4EE3\u7801\u5BA1\u67E5\u7B49\u8BF7\u6C42\u56FA\u5B9A\u5207\u5230\u6307\u5B9A\u6A21\u578B');\n io.info(' - SmartRouter\uFF1A\u9002\u5408\u6A21\u7CCA\u4EFB\u52A1\uFF0C\u5728\u5019\u9009\u6A21\u578B\u4E4B\u95F4\u81EA\u52A8\u9009\u62E9\u66F4\u5408\u9002\u7684\u6A21\u578B');\n io.info(' - \u914D\u7F6E\u6A21\u677F\u53C2\u8003\uFF1Aconfig/trigger.advanced.yaml');\n}\n\nexport async function runSetupCli(customDeps?: Partial<IRunSetupCliDeps>): Promise<void> {\n const defaults = createDefaultDeps(customDeps?.io);\n const deps = { ...defaults, ...customDeps } as IRunSetupCliDeps;\n\n try {\n await runSetup({\n detectSetupEnvironment: () =>\n detectSetupEnvironment({\n readCurrentConfig: deps.readCurrentConfig,\n readLegacyConfig: deps.readLegacyConfig,\n probeService: deps.probeService,\n }),\n chooseCurrentConfigAction: async ({ currentConfig }) => {\n if (currentConfig.kind === 'missing') {\n return 'create';\n }\n if (currentConfig.kind === 'valid') {\n deps.io.info('\u68C0\u6D4B\u5230\u5F53\u524D claude-trigger-router \u914D\u7F6E\u5DF2\u53EF\u7528\u3002');\n if (currentConfig.warnings.length > 0) {\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u63D0\u793A\uFF1A${currentConfig.warnings.join('; ')}`);\n }\n return mapValidCurrentConfigChoice(\n await deps.io.choose('\u4F60\u60F3\u76F4\u63A5\u4F7F\u7528\u5B83\uFF0C\u8FD8\u662F\u91CD\u65B0\u8C03\u6574\uFF1F', [\n '\u76F4\u63A5\u4F7F\u7528\u5F53\u524D\u914D\u7F6E\uFF08\u63A8\u8350\uFF09',\n '\u68C0\u67E5\u5E76\u8C03\u6574\u5F53\u524D\u914D\u7F6E',\n '\u653E\u5F03\u5F53\u524D\u914D\u7F6E\uFF0C\u91CD\u65B0\u5F00\u59CB',\n ])\n );\n }\n if (currentConfig.kind === 'invalid') {\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u6821\u9A8C\u5931\u8D25\uFF1A${currentConfig.errors.join('; ')}`);\n if (currentConfig.warnings.length > 0) {\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u63D0\u793A\uFF1A${currentConfig.warnings.join('; ')}`);\n }\n return (await deps.io.choose('\u9009\u62E9\u4E0B\u4E00\u6B65', ['repair', 'overwrite', 'cancel'])) as 'repair' | 'overwrite' | 'cancel';\n }\n\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u65E0\u6CD5\u89E3\u6790\uFF1A${currentConfig.error}`);\n return (await deps.io.choose('\u9009\u62E9\u4E0B\u4E00\u6B65', ['rebuild', 'cancel'])) as 'rebuild' | 'cancel';\n },\n chooseLegacyConfigAction: async ({ legacyConfig }) => {\n if (legacyConfig.kind === 'found') {\n return mapLegacyConfigChoice(\n await deps.io.choose('\u68C0\u6D4B\u5230\u65E7 claude-code-router \u914D\u7F6E\u3002\u662F\u5426\u8FC1\u79FB\u4E3A\u5F53\u524D\u63A8\u8350\u914D\u7F6E\uFF1F', [\n '\u8FC1\u79FB\u65E7\u914D\u7F6E\uFF08\u63A8\u8350\uFF09',\n '\u8DF3\u8FC7\u8FC1\u79FB\uFF0C\u624B\u52A8\u65B0\u5EFA',\n ])\n );\n }\n if (legacyConfig.kind === 'read_error') {\n deps.io.info(`\u65E7 ccr \u914D\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF1A${legacyConfig.error}`);\n }\n return 'skip';\n },\n buildFreshConfig: () => buildFreshConfig(deps.io),\n buildRepairConfig: async ({ currentConfig }) => toDraftFromConfig(currentConfig),\n completeDraft: ({ draft, fields }) => completeDraft({ draft, fields, io: deps.io }),\n migrateLegacyConfig,\n mapConfigErrorsToRepairFields,\n io: deps.io,\n persistConfig: async ({ config, currentConfigPath, hasExistingConfig }) => {\n let normalized = normalizeAndValidateConfig({\n ...(hasExistingConfig ? getCurrentRuntimeFields() : {}),\n ...(config as any),\n });\n {\n const targetPort = normalized.config.PORT ?? DEFAULT_CONFIG.PORT;\n const occupied = await isTcpPortOccupied(targetPort, 500);\n if (occupied && !isServiceRunning()) {\n const fallbackPort = await getAvailablePort();\n deps.io.info(`\u68C0\u6D4B\u5230\u9ED8\u8BA4\u7AEF\u53E3 ${targetPort} \u5DF2\u88AB\u5360\u7528\uFF0Csetup \u5DF2\u81EA\u52A8\u6539\u7528\u53EF\u7528\u7AEF\u53E3 ${fallbackPort}\u3002`);\n normalized = normalizeAndValidateConfig({\n ...normalized.config,\n PORT: fallbackPort,\n });\n }\n }\n const persisted = await persistSetupConfig({\n config: normalized.config,\n currentConfigPath,\n hasExistingConfig,\n validateConfig: (inputConfig) => normalizeAndValidateConfig(inputConfig).errors,\n backupCurrentConfig: deps.backupCurrentConfig,\n writeConfig: deps.writeConfig,\n });\n if (normalized.warnings.length > 0) {\n deps.io.info(`\u914D\u7F6E\u63D0\u793A\uFF1A${normalized.warnings.join('; ')}`);\n }\n return persisted;\n },\n ensureServiceReady: async ({ configChanged, detectedService, reloadSupported }) => {\n const effectiveDetectedService = configChanged\n ? await deps.probeService()\n : detectedService;\n const action = decideServiceAction({\n configChanged,\n detectedService: effectiveDetectedService,\n reloadSupported,\n });\n\n await applyServiceAction({\n action,\n executeStart: deps.executeStart,\n executeReload: deps.executeReload,\n executeRestart: deps.executeRestart,\n verifyHealth: deps.verifyHealth,\n });\n\n return {\n action: action.kind,\n healthChecked: true,\n };\n },\n enterClaudeCode: async () => {\n printRoutingNextSteps(deps.io);\n if (!shouldAutoEnterClaudeCodeAfterSetup()) {\n deps.io.info('\u4E3A\u907F\u514D setup \u7ED3\u675F\u540E\u63A5\u7BA1\u5F53\u524D\u7EC8\u7AEF\uFF0C\u8BF7\u624B\u52A8\u8FD0\u884C\uFF1Actr code');\n deps.io.info('\u5982\u679C\u4F60\u660E\u786E\u9700\u8981 setup \u7ED3\u675F\u540E\u81EA\u52A8\u8FDB\u5165 Claude Code\uFF0C\u53EF\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF CTR_SETUP_AUTO_ENTER_CODE=1');\n return;\n }\n\n deps.io.close?.();\n await deps.enterClaudeCode();\n },\n reloadSupported: false,\n });\n } finally {\n deps.io.close?.();\n }\n}\n", "import { existsSync, readFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { createInterface } from 'readline/promises';\nimport { stdin as input, stdout as output } from 'process';\nimport { spawn } from 'child_process';\nimport JSON5 from 'json5';\nimport yaml from 'js-yaml';\n\nimport { CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from '../constants';\nimport { normalizeAndValidateConfig, writeConfigFile, backupConfigFile } from '../utils';\nimport { migrateLegacyConfig } from '../setup/migrate';\nimport { readLegacyConfig } from '../setup';\nimport { IAppConfig, IModelEndpointConfig } from '../trigger/types';\nimport { getModelApi, getModelInterface, getModelKey } from '../models/schema';\nimport { buildModelRegistry, describeCompatibilityProfile, describeDispatchFormat } from '../models/compile';\nimport { buildProviderDispatchRequest, describeProtocolDiagnostic, TProtocolDiagnosticCode } from '../protocols';\nimport { isServiceRunning, killProcess, readServiceInfo } from '../utils/processCheck';\nimport { isTcpPortOccupied, probeServiceHealth, waitForService } from '../service-health';\nimport { buildUsableMinimalTemplateConfig } from '../setup/templates';\n\ninterface IDoctorIO {\n info(message: string): void;\n error(message: string): void;\n choose(message: string, options: string[]): Promise<string>;\n input(message: string, defaultValue?: string): Promise<string>;\n confirm(message: string, defaultValue?: boolean): Promise<boolean>;\n close?(): void;\n}\n\ninterface IDoctorDeps {\n readLegacyConfig: typeof readLegacyConfig;\n backupCurrentConfig: typeof backupConfigFile;\n writeConfig: typeof writeConfigFile;\n isServiceRunning: typeof isServiceRunning;\n readServiceInfo: typeof readServiceInfo;\n killProcess: typeof killProcess;\n probeServiceHealth: typeof probeServiceHealth;\n isTcpPortOccupied: typeof isTcpPortOccupied;\n waitForService: typeof waitForService;\n io: IDoctorIO;\n startDaemon: () => Promise<void>;\n}\n\ninterface IConfigLoadResult {\n path: string;\n existed: boolean;\n config?: Partial<IAppConfig>;\n repairedParse: boolean;\n messages: string[];\n}\n\ntype TProbeResult =\n | { kind: 'success' }\n | { kind: 'failure'; category: 'auth_error' | 'model_not_found' | 'endpoint_unreachable' | 'protocol_mismatch' | 'remote_error'; message: string };\n\ninterface IProbeFailureExplanation {\n label: string;\n summary: string;\n action: string;\n}\n\nfunction collectCompatibilityPreviewDiagnostics(model: IModelEndpointConfig) {\n const registry = buildModelRegistry({\n Providers: [],\n Models: [model],\n Router: {\n default: model.id,\n },\n } as IAppConfig);\n const compiledModel = registry.modelMap[model.id];\n if (!compiledModel) {\n return [];\n }\n\n const preview = buildProviderDispatchRequest({\n model: compiledModel.modelName,\n interface: compiledModel.interface ?? 'openai',\n compatibilityProfile: compiledModel.compatibilityProfile,\n capabilities: compiledModel.capabilities,\n request: {\n model: compiledModel.id,\n max_tokens: 32,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'compatibility preview',\n },\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: 'image/png',\n data: 'preview',\n },\n },\n ],\n },\n ],\n tools: [\n {\n name: 'preview_tool',\n description: 'Preview tool',\n input_schema: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n },\n },\n },\n ],\n tool_choice: {\n type: 'tool',\n name: 'preview_tool',\n },\n thinking: {\n type: 'enabled',\n effort: 'medium',\n },\n },\n });\n\n return preview.diagnostics.map((code) => describeProtocolDiagnostic(code as TProtocolDiagnosticCode));\n}\n\nfunction hasArg(flag: string): boolean {\n return process.argv.slice(2).includes(flag);\n}\n\nfunction createConsoleIO(): IDoctorIO {\n if (process.env.CTR_DOCTOR_FORCE_SCRIPTED_INPUT === '1') {\n const scriptedInput = readFileSync(0, 'utf-8');\n const answers = scriptedInput.split(/\\r?\\n/).map((item) => item.trim()).filter(Boolean);\n let cursor = 0;\n const nextAnswer = async () => answers[cursor++] ?? '';\n\n return {\n info(message) {\n output.write(`${message}\\n`);\n },\n error(message) {\n output.write(`${message}\\n`);\n },\n async choose(message, options) {\n output.write(`${message}\\n`);\n options.forEach((option, index) => output.write(` ${index + 1}. ${option}\\n`));\n const answer = await nextAnswer();\n const index = Number(answer);\n if (Number.isInteger(index) && index >= 1 && index <= options.length) {\n return options[index - 1];\n }\n return options.find((option) => option === answer) ?? options[0];\n },\n async input(message, defaultValue) {\n output.write(`${message}${defaultValue ? ` (${defaultValue})` : ''}: `);\n const answer = await nextAnswer();\n return answer || defaultValue || '';\n },\n async confirm(message, defaultValue = true) {\n output.write(`${message} ${defaultValue ? '[Y/n]' : '[y/N]'}\\n`);\n const answer = (await nextAnswer()).toLowerCase();\n if (!answer) {\n return defaultValue;\n }\n return ['y', 'yes', '1', 'true'].includes(answer);\n },\n close() {\n // noop\n },\n };\n }\n\n const rl = createInterface({ input, output });\n const ask = async (message: string) => (await rl.question(message)).trim();\n\n return {\n info(message) {\n output.write(`${message}\\n`);\n },\n error(message) {\n output.write(`${message}\\n`);\n },\n async choose(message, options) {\n output.write(`${message}\\n`);\n options.forEach((option, index) => output.write(` ${index + 1}. ${option}\\n`));\n while (true) {\n const answer = await ask('> ');\n const index = Number(answer);\n if (Number.isInteger(index) && index >= 1 && index <= options.length) {\n return options[index - 1];\n }\n const matched = options.find((option) => option === answer);\n if (matched) {\n return matched;\n }\n output.write('\u8BF7\u8F93\u5165\u9009\u9879\u7F16\u53F7\u3002\\n');\n }\n },\n async input(message, defaultValue) {\n const answer = await ask(`${message}${defaultValue ? ` (${defaultValue})` : ''}: `);\n return answer || defaultValue || '';\n },\n async confirm(message, defaultValue = true) {\n const answer = (await ask(`${message} ${defaultValue ? '[Y/n]' : '[y/N]'}: `)).toLowerCase();\n if (!answer) {\n return defaultValue;\n }\n return ['y', 'yes'].includes(answer);\n },\n close() {\n rl.close();\n },\n };\n}\n\nfunction getConfigCandidates(): string[] {\n return [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON];\n}\n\nfunction inferInterfaceFromApi(api?: string): 'openai' | 'anthropic' | undefined {\n const trimmed = api?.trim();\n if (!trimmed) {\n return undefined;\n }\n return trimmed.includes('/v1/messages') ? 'anthropic' : 'openai';\n}\n\nfunction sanitizeModelId(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '') || 'model';\n}\n\nfunction tryLoadStructuredConfig(filePath: string, content: string): { config: Partial<IAppConfig>; repairedParse: boolean; messages: string[] } {\n if (filePath.endsWith('.json')) {\n try {\n return { config: JSON.parse(content), repairedParse: false, messages: [] };\n } catch {\n return {\n config: JSON5.parse(content),\n repairedParse: true,\n messages: ['\u68C0\u6D4B\u5230 JSON \u914D\u7F6E\u5305\u542B\u5BBD\u677E\u8BED\u6CD5\uFF0Cdoctor \u5DF2\u6309\u6807\u51C6 JSON \u7ED3\u6784\u91CD\u65B0\u5F52\u4E00\u5316\u3002'],\n };\n }\n }\n\n try {\n return { config: yaml.load(content) as Partial<IAppConfig>, repairedParse: false, messages: [] };\n } catch (error: any) {\n const sanitized = content.replace(/\\t/g, ' ');\n if (sanitized !== content) {\n return {\n config: yaml.load(sanitized) as Partial<IAppConfig>,\n repairedParse: true,\n messages: ['\u68C0\u6D4B\u5230 YAML \u4F7F\u7528\u4E86 Tab \u7F29\u8FDB\uFF0Cdoctor \u5DF2\u81EA\u52A8\u4FEE\u590D\u4E3A\u7A7A\u683C\u7F29\u8FDB\u3002'],\n };\n }\n throw error;\n }\n}\n\nfunction loadCurrentConfig(): IConfigLoadResult {\n const existingPath = getConfigCandidates().find((filePath) => existsSync(filePath));\n const path = existingPath ?? CONFIG_FILE;\n if (!existingPath) {\n return {\n path,\n existed: false,\n repairedParse: false,\n messages: ['\u672A\u68C0\u6D4B\u5230\u5F53\u524D Claude Trigger Router \u914D\u7F6E\u3002'],\n };\n }\n\n const content = readFileSync(existingPath, 'utf-8');\n const loaded = tryLoadStructuredConfig(existingPath, content);\n return {\n path,\n existed: true,\n repairedParse: loaded.repairedParse,\n messages: loaded.messages,\n config: loaded.config,\n };\n}\n\nfunction getModelLookupId(model: Partial<IModelEndpointConfig>): string {\n return model.id?.trim() || sanitizeModelId(model.model ?? '');\n}\n\nfunction repairDeterministicConfig(config: Partial<IAppConfig>): { config: Partial<IAppConfig>; changes: string[] } {\n const nextConfig: Partial<IAppConfig> = {\n ...config,\n HOST: config.HOST ?? DEFAULT_CONFIG.HOST,\n PORT: config.PORT ?? DEFAULT_CONFIG.PORT,\n LOG: config.LOG ?? DEFAULT_CONFIG.LOG,\n LOG_LEVEL: config.LOG_LEVEL ?? DEFAULT_CONFIG.LOG_LEVEL,\n };\n const changes: string[] = [];\n\n if (Array.isArray(config.Models) && config.Models.length > 0) {\n nextConfig.Models = config.Models.map((item, index) => {\n const api = getModelApi(item);\n const key = getModelKey(item);\n const inferredInterface = getModelInterface(item) ?? inferInterfaceFromApi(api);\n const id = item.id?.trim() || (item.model ? sanitizeModelId(item.model) : `model_${index + 1}`);\n\n if (!item.id?.trim()) {\n changes.push(`\u5DF2\u8865\u5168 Models[${index}].id -> ${id}`);\n }\n if (inferredInterface && !getModelInterface(item)) {\n changes.push(`\u5DF2\u8865\u5168 Models[${index}].interface -> ${inferredInterface}`);\n }\n if (api && item.api !== api) {\n changes.push(`\u5DF2\u5F52\u4E00 Models[${index}].api`);\n }\n if (key && item.key !== key) {\n changes.push(`\u5DF2\u5F52\u4E00 Models[${index}].key`);\n }\n\n return {\n ...item,\n id,\n api: api || undefined,\n api_base_url: api || undefined,\n key: key || undefined,\n api_key: key || undefined,\n interface: inferredInterface,\n protocol: inferredInterface,\n };\n });\n\n if (!nextConfig.Router?.default) {\n if (nextConfig.Models.length === 1) {\n nextConfig.Router = {\n ...(nextConfig.Router ?? {}),\n default: getModelLookupId(nextConfig.Models[0]),\n };\n changes.push(`\u5DF2\u8865\u5168 Router.default -> ${nextConfig.Router.default}`);\n } else if (typeof config.Router?.default === 'string' && config.Router.default.includes(',')) {\n const [providerName, modelName] = config.Router.default.split(',').map((item) => item.trim());\n const matched = nextConfig.Models.find((item) =>\n item.model === modelName && (item.id === providerName || item.id.startsWith(`${sanitizeModelId(providerName)}_`))\n );\n if (matched) {\n nextConfig.Router = {\n ...(nextConfig.Router ?? {}),\n default: matched.id,\n };\n changes.push(`\u5DF2\u5F52\u4E00 Router.default -> ${matched.id}`);\n }\n }\n }\n } else if (Array.isArray(config.Providers) && config.Providers.length > 0) {\n const migrated = migrateLegacyConfig(config as any);\n nextConfig.Models = migrated.draft.Models;\n nextConfig.Router = {\n ...(nextConfig.Router ?? {}),\n ...migrated.draft.Router,\n };\n nextConfig.Providers = [];\n changes.push('\u5DF2\u5C06 legacy Providers \u7ED3\u6784\u5F52\u4E00\u4E3A Models \u7ED3\u6784\u3002');\n }\n\n return { config: nextConfig, changes };\n}\n\nasync function completeMissingModelFields(\n config: Partial<IAppConfig>,\n io: IDoctorIO\n): Promise<{ config: Partial<IAppConfig>; changes: string[] }> {\n const changes: string[] = [];\n const nextConfig: Partial<IAppConfig> = {\n ...config,\n Models: Array.isArray(config.Models) ? config.Models.map((item) => ({ ...item })) : [],\n Router: { ...(config.Router ?? {}) },\n };\n\n for (let index = 0; index < (nextConfig.Models?.length ?? 0); index += 1) {\n const model = nextConfig.Models![index];\n const label = model.id || model.model || `Models[${index}]`;\n\n if (!model.id?.trim()) {\n model.id = sanitizeModelId(await io.input(`\u8865\u5168 ${label} \u7684\u6A21\u578B ID`, sanitizeModelId(model.model || `model_${index + 1}`)));\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684\u6A21\u578B ID -> ${model.id}`);\n }\n if (!getModelApi(model)) {\n const api = await io.input(`\u8865\u5168 ${label} \u7684 API Base URL`);\n model.api = api;\n model.api_base_url = api;\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684 API Base URL`);\n }\n if (!getModelKey(model)) {\n const key = await io.input(`\u8865\u5168 ${label} \u7684 API Key`);\n model.key = key;\n model.api_key = key;\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684 API Key`);\n }\n if (!getModelInterface(model)) {\n const interfaceChoice = await io.choose(`\u8865\u5168 ${label} \u7684\u63A5\u53E3\u7C7B\u578B`, ['openai', 'anthropic']);\n model.interface = interfaceChoice as 'openai' | 'anthropic';\n model.protocol = model.interface;\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684\u63A5\u53E3\u7C7B\u578B -> ${model.interface}`);\n }\n if (!model.model?.trim()) {\n model.model = await io.input(`\u8865\u5168 ${label} \u7684\u4E0A\u6E38\u6A21\u578B\u540D`);\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684\u4E0A\u6E38\u6A21\u578B\u540D`);\n }\n }\n\n if (!nextConfig.Router?.default) {\n if ((nextConfig.Models?.length ?? 0) === 1) {\n nextConfig.Router!.default = nextConfig.Models![0].id;\n changes.push(`\u5DF2\u8865\u5168 Router.default -> ${nextConfig.Router!.default}`);\n } else if ((nextConfig.Models?.length ?? 0) > 1) {\n const choice = await io.choose('\u8865\u5168\u9ED8\u8BA4\u6A21\u578B', nextConfig.Models!.map((item) => item.id));\n nextConfig.Router!.default = choice;\n changes.push(`\u5DF2\u8865\u5168 Router.default -> ${choice}`);\n }\n }\n\n return { config: nextConfig, changes };\n}\n\nasync function probeModelAvailability(model: IModelEndpointConfig): Promise<TProbeResult> {\n const api = getModelApi(model);\n const key = getModelKey(model);\n const modelInterface = getModelInterface(model);\n\n if (!api || !key || !modelInterface || !model.model) {\n return {\n kind: 'failure',\n category: 'protocol_mismatch',\n message: '\u6A21\u578B\u914D\u7F6E\u7F3A\u5C11 api/key/interface/model\uFF0C\u65E0\u6CD5\u53D1\u8D77\u63A2\u6D4B\u3002',\n };\n }\n\n try {\n const registry = buildModelRegistry({\n Providers: [],\n Models: [model],\n Router: {\n default: model.id,\n },\n } as IAppConfig);\n const compiledModel = registry.modelMap[model.id];\n const dispatchRequest = compiledModel\n ? buildProviderDispatchRequest({\n model: compiledModel.modelName,\n interface: compiledModel.interface ?? modelInterface,\n compatibilityProfile: compiledModel.compatibilityProfile,\n capabilities: compiledModel.capabilities,\n request: {\n model: compiledModel.id,\n max_tokens: 1,\n stream: true,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'ok',\n },\n ],\n },\n ],\n },\n })\n : null;\n\n const response = await fetch(api, {\n method: 'POST',\n signal: AbortSignal.timeout(10000),\n headers: modelInterface === 'anthropic'\n ? {\n 'content-type': 'application/json',\n 'x-api-key': key,\n 'anthropic-version': '2023-06-01',\n }\n : {\n 'content-type': 'application/json',\n authorization: `Bearer ${key}`,\n },\n body: JSON.stringify(dispatchRequest?.body ?? (modelInterface === 'anthropic'\n ? {\n model: model.model,\n max_tokens: 1,\n stream: true,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'ok',\n },\n ],\n },\n ],\n }\n : {\n model: model.model,\n max_tokens: 1,\n stream: true,\n messages: [\n {\n role: 'user',\n content: 'ok',\n },\n ],\n })),\n });\n\n if (response.ok) {\n return { kind: 'success' };\n }\n\n const body = await response.text();\n if (response.status === 401 || response.status === 403) {\n return { kind: 'failure', category: 'auth_error', message: `${response.status} ${body}` };\n }\n if (response.status === 404) {\n return { kind: 'failure', category: 'model_not_found', message: `${response.status} ${body}` };\n }\n if (response.status === 400) {\n return { kind: 'failure', category: 'protocol_mismatch', message: `${response.status} ${body}` };\n }\n\n return { kind: 'failure', category: 'remote_error', message: `${response.status} ${body}` };\n } catch (error: any) {\n return {\n kind: 'failure',\n category: 'endpoint_unreachable',\n message: error?.message || String(error),\n };\n }\n}\n\nfunction explainProbeFailure(category: TProbeResult extends { kind: 'failure'; category: infer T } ? T : never): IProbeFailureExplanation {\n switch (category) {\n case 'auth_error':\n return {\n label: '\u9274\u6743\u5931\u8D25',\n summary: '\u4E0A\u6E38\u63A5\u53E3\u62D2\u7EDD\u4E86\u5F53\u524D API Key\uFF0C\u6216\u5F53\u524D\u8D26\u53F7\u6CA1\u6709\u8BBF\u95EE\u8BE5\u6A21\u578B\u7684\u6743\u9650\u3002',\n action: '\u8BF7\u68C0\u67E5 API Key\u3001\u8D26\u53F7\u8BA2\u9605\u72B6\u6001\uFF0C\u4EE5\u53CA\u5F53\u524D\u8D26\u53F7\u662F\u5426\u5177\u5907\u76EE\u6807\u6A21\u578B\u6743\u9650\u3002',\n };\n case 'model_not_found':\n return {\n label: '\u6A21\u578B\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u9650',\n summary: '\u4E0A\u6E38\u63A5\u53E3\u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u6A21\u578B\u540D\uFF0C\u6216\u5F53\u524D\u8D26\u53F7\u6CA1\u6709\u8BE5\u6A21\u578B\u7684\u8BBF\u95EE\u6743\u9650\u3002',\n action: '\u8BF7\u68C0\u67E5\u6A21\u578B\u540D\u662F\u5426\u6B63\u786E\uFF0C\u4EE5\u53CA\u5F53\u524D\u8D26\u53F7\u662F\u5426\u5DF2\u5F00\u901A\u8BE5\u6A21\u578B\u3002',\n };\n case 'endpoint_unreachable':\n return {\n label: '\u63A5\u53E3\u4E0D\u53EF\u8FBE',\n summary: 'doctor \u65E0\u6CD5\u8FDE\u63A5\u5230\u5F53\u524D API \u5730\u5740\uFF0C\u53EF\u80FD\u662F\u5730\u5740\u3001\u7F51\u7EDC\u3001TLS \u6216\u4EE3\u7406\u914D\u7F6E\u95EE\u9898\u3002',\n action: '\u8BF7\u68C0\u67E5 API Base URL\u3001\u7F51\u7EDC\u8FDE\u901A\u6027\u3001TLS \u8BC1\u4E66\u94FE\uFF0C\u4EE5\u53CA\u662F\u5426\u9700\u8981\u4EE3\u7406\u3002',\n };\n case 'protocol_mismatch':\n return {\n label: '\u534F\u8BAE\u517C\u5BB9\u5931\u8D25',\n summary: '\u5F53\u524D\u4E0A\u6E38\u63A5\u53E3\u4E0E\u7EDF\u4E00\u6D88\u606F\u62BD\u8C61\u5728 messages\u3001tools\u3001stream \u6216\u63A7\u5236\u5B57\u6BB5\u4E0A\u5B58\u5728\u517C\u5BB9\u5DEE\u5F02\u3002',\n action: '\u8BF7\u5148\u786E\u8BA4 API Base URL \u548C interface \u662F\u5426\u914D\u7F6E\u6B63\u786E\uFF1B\u5982\u679C\u6587\u672C\u8BF7\u6C42\u6B63\u5E38\u4F46\u5DE5\u5177\u8C03\u7528\u5931\u8D25\uFF0C\u8BF7\u4FDD\u7559\u539F\u59CB\u62A5\u9519\u7EE7\u7EED\u6536\u655B\u517C\u5BB9\u5C42\u3002',\n };\n case 'remote_error':\n return {\n label: '\u4E0A\u6E38\u8FD4\u56DE\u9519\u8BEF',\n summary: '\u8BF7\u6C42\u5DF2\u7ECF\u5230\u8FBE\u4E0A\u6E38\uFF0C\u4F46\u4E0A\u6E38\u8FD4\u56DE\u4E86\u5176\u4ED6\u4E1A\u52A1\u6216\u670D\u52A1\u7AEF\u9519\u8BEF\u3002',\n action: '\u8BF7\u7ED3\u5408\u539F\u59CB\u9519\u8BEF\u4FE1\u606F\u68C0\u67E5\u4E0A\u6E38\u670D\u52A1\u72B6\u6001\u3001\u6A21\u578B\u914D\u989D\u6216\u8D26\u53F7\u9650\u5236\u3002',\n };\n default:\n return {\n label: category,\n summary: '\u672A\u77E5\u8FDC\u7AEF\u9519\u8BEF\u3002',\n action: '\u8BF7\u4FDD\u7559\u539F\u59CB\u9519\u8BEF\u4FE1\u606F\u540E\u7EE7\u7EED\u6392\u67E5\u3002',\n };\n }\n}\n\nasync function ensureServiceUsable(config: IAppConfig, deps: IDoctorDeps, configChanged: boolean): Promise<void> {\n const port = config.PORT ?? DEFAULT_CONFIG.PORT;\n const healthy = await deps.probeServiceHealth(port, 500);\n const occupied = await deps.isTcpPortOccupied(port, 500);\n const running = deps.isServiceRunning();\n\n if (healthy && !configChanged) {\n deps.io.info(`\u670D\u52A1\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7\uFF1Ahttp://127.0.0.1:${port}`);\n return;\n }\n\n if (occupied && !healthy && !running) {\n throw new Error(`\u7AEF\u53E3 ${port} \u5DF2\u88AB\u5176\u4ED6\u670D\u52A1\u5360\u7528\uFF0Cdoctor \u65E0\u6CD5\u81EA\u52A8\u542F\u52A8\u5F53\u524D\u670D\u52A1\u3002`);\n }\n\n if (running) {\n const info = deps.readServiceInfo();\n if (info) {\n try {\n deps.killProcess(info.pid);\n } catch {\n // ignore and rely on restart probe\n }\n }\n }\n\n await deps.startDaemon();\n const verified = await deps.waitForService(port, 5000);\n if (!verified) {\n throw new Error(`doctor \u81EA\u52A8\u542F\u52A8\u540E\u5065\u5EB7\u68C0\u67E5\u4ECD\u672A\u901A\u8FC7\uFF08\u7AEF\u53E3 ${port}\uFF09\u3002`);\n }\n deps.io.info(`\u670D\u52A1\u5DF2\u5C31\u7EEA\uFF1Ahttp://127.0.0.1:${port}`);\n}\n\nfunction createDefaultDeps(io = createConsoleIO()): IDoctorDeps {\n return {\n readLegacyConfig,\n backupCurrentConfig: backupConfigFile,\n writeConfig: writeConfigFile,\n isServiceRunning,\n readServiceInfo,\n killProcess,\n probeServiceHealth,\n isTcpPortOccupied,\n waitForService,\n io,\n startDaemon: async () => {\n spawn(process.execPath, [process.argv[1], 'start', '--daemon'], {\n detached: true,\n stdio: 'ignore',\n env: { ...process.env, CTR_DAEMON: '1' },\n }).unref();\n },\n };\n}\n\nexport async function runDoctorCli(customDeps?: Partial<IDoctorDeps>): Promise<void> {\n const defaults = createDefaultDeps(customDeps?.io);\n const deps = { ...defaults, ...customDeps } as IDoctorDeps;\n let configChanged = false;\n\n try {\n deps.io.info('\u5F00\u59CB\u8BCA\u65AD\u5F53\u524D Claude Trigger Router \u914D\u7F6E...');\n const current = loadCurrentConfig();\n current.messages.forEach((message) => deps.io.info(message));\n\n let workingConfig: Partial<IAppConfig> | undefined = current.config;\n if (!workingConfig) {\n const legacy = await deps.readLegacyConfig();\n if (legacy.kind === 'found') {\n deps.io.info('\u672A\u68C0\u6D4B\u5230\u5F53\u524D\u914D\u7F6E\uFF0C\u4F46\u53D1\u73B0\u65E7 claude-code-router \u914D\u7F6E\uFF0Cdoctor \u5C06\u5148\u5C1D\u8BD5\u8FC1\u79FB\u3002');\n const migrated = migrateLegacyConfig(legacy.config as any);\n workingConfig = {\n ...buildUsableMinimalTemplateConfig(),\n ...migrated.draft,\n };\n } else {\n throw new Error('\u672A\u68C0\u6D4B\u5230\u53EF\u8BCA\u65AD\u7684\u5F53\u524D\u914D\u7F6E\uFF1B\u8BF7\u5148\u8FD0\u884C ctr setup \u6216 ctr init --force\u3002');\n }\n }\n\n const deterministic = repairDeterministicConfig(workingConfig);\n workingConfig = deterministic.config;\n deterministic.changes.forEach((message) => deps.io.info(message));\n\n const completed = await completeMissingModelFields(workingConfig, deps.io);\n workingConfig = completed.config;\n completed.changes.forEach((message) => deps.io.info(message));\n\n const normalized = normalizeAndValidateConfig(workingConfig);\n if (normalized.errors.length > 0) {\n deps.io.error(`doctor \u4ECD\u53D1\u73B0\u65E0\u6CD5\u81EA\u52A8\u4FEE\u590D\u7684\u914D\u7F6E\u9519\u8BEF\uFF1A${normalized.errors.join('; ')}`);\n throw new Error('doctor could not fully repair config');\n }\n if (normalized.warnings.length > 0) {\n deps.io.info(`\u914D\u7F6E\u63D0\u793A\uFF1A${normalized.warnings.join('; ')}`);\n }\n\n const registry = buildModelRegistry(normalized.config);\n for (const model of normalized.config.Models ?? []) {\n const compiledModel = registry.modelMap[model.id];\n if (!compiledModel) {\n continue;\n }\n const compatibility = describeCompatibilityProfile(compiledModel.compatibilityProfile);\n const dispatch = describeDispatchFormat(compiledModel.dispatchFormat);\n deps.io.info(\n `\u6A21\u578B\u517C\u5BB9\u7B56\u7565\uFF1A${model.id} -> ${compatibility.label}`\n );\n deps.io.info(`\u517C\u5BB9\u8BF4\u660E\uFF1A${compatibility.summary}`);\n deps.io.info(`\u8BF7\u6C42\u7F16\u8BD1\uFF1A${dispatch.label}\u3002${dispatch.summary}`);\n const previewDiagnostics = collectCompatibilityPreviewDiagnostics(model);\n for (const diagnostic of previewDiagnostics) {\n deps.io.info(`\u8FD0\u884C\u65F6\u517C\u5BB9\u63D0\u793A\uFF1A${diagnostic.label}`);\n deps.io.info(`\u8FD0\u884C\u65F6\u8BF4\u660E\uFF1A${diagnostic.summary}`);\n deps.io.info(`\u8FD0\u884C\u65F6\u5EFA\u8BAE\uFF1A${diagnostic.action}`);\n }\n }\n\n const needWrite = current.repairedParse || deterministic.changes.length > 0 || completed.changes.length > 0 || !current.existed;\n if (needWrite) {\n if (current.existed) {\n const backupPath = await deps.backupCurrentConfig();\n if (backupPath) {\n deps.io.info(`\u5DF2\u5907\u4EFD\u5F53\u524D\u914D\u7F6E\uFF1A${backupPath}`);\n }\n }\n await deps.writeConfig(normalized.config);\n deps.io.info(`\u5DF2\u5199\u56DE\u4FEE\u590D\u540E\u7684\u914D\u7F6E\uFF1A${current.path}`);\n configChanged = true;\n }\n\n await ensureServiceUsable(normalized.config, deps, configChanged);\n\n const shouldProbeModels = hasArg('--check-models')\n ? await deps.io.confirm(`\u5373\u5C06\u5411 ${normalized.config.Models?.length ?? 0} \u4E2A\u6A21\u578B\u53D1\u9001\u6700\u5C0F\u63A2\u6D4B\u8BF7\u6C42\uFF0C\u53EF\u80FD\u6D88\u8017\u5C11\u91CF\u989D\u5EA6\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F`, true)\n : await deps.io.confirm(`\u662F\u5426\u7EE7\u7EED\u63A2\u6D4B ${normalized.config.Models?.length ?? 0} \u4E2A\u6A21\u578B\u7684\u53EF\u7528\u6027\uFF1F\u8FD9\u4F1A\u6D88\u8017\u5C11\u91CF\u989D\u5EA6\u3002`, false);\n\n if (!shouldProbeModels) {\n deps.io.info('\u5DF2\u8DF3\u8FC7\u6A21\u578B\u63A2\u6D4B\u3002\u914D\u7F6E\u548C\u670D\u52A1\u8BCA\u65AD\u5DF2\u5B8C\u6210\u3002');\n return;\n }\n\n let probeSuccess = 0;\n let probeFailure = 0;\n for (const model of normalized.config.Models ?? []) {\n const result = await probeModelAvailability(model);\n if (result.kind === 'success') {\n deps.io.info(`\u6A21\u578B\u63A2\u6D4B\u6210\u529F\uFF1A${model.id}`);\n probeSuccess += 1;\n continue;\n }\n\n const explanation = explainProbeFailure(result.category);\n probeFailure += 1;\n deps.io.error(`\u6A21\u578B\u63A2\u6D4B\u5931\u8D25\uFF1A${model.id} -> ${explanation.label}`);\n deps.io.info(`\u5931\u8D25\u8BF4\u660E\uFF1A${explanation.summary}`);\n deps.io.info(`\u5904\u7406\u5EFA\u8BAE\uFF1A${explanation.action}`);\n deps.io.info(`\u8FDC\u7AEF\u539F\u59CB\u4FE1\u606F\uFF1A${result.message}`);\n deps.io.info('\u8FD9\u7C7B\u8FDC\u7AEF\u5931\u8D25\u9700\u8981\u4F60\u786E\u8BA4\u5E76\u624B\u52A8\u5904\u7406\uFF1Bdoctor \u4E0D\u4F1A\u81EA\u52A8\u4FEE\u6539\u6A21\u578B\u8BED\u4E49\u6216\u8FDC\u7AEF\u8D26\u53F7\u914D\u7F6E\u3002');\n }\n\n deps.io.info(`\u6A21\u578B\u63A2\u6D4B\u5B8C\u6210\uFF1A\u6210\u529F ${probeSuccess}\uFF0C\u5931\u8D25 ${probeFailure}\u3002`);\n deps.io.info('doctor \u8BCA\u65AD\u5B8C\u6210\u3002');\n } finally {\n deps.io.close?.();\n }\n}\n", "/**\r\n * CLI Entry Point\r\n *\r\n * \u547D\u4EE4\u884C\u5165\u53E3\r\n */\r\n\r\nimport { spawn, spawnSync } from \"child_process\";\nimport { join } from \"path\";\nimport open from \"openurl\";\nimport { existsSync, readFileSync, mkdirSync, writeFileSync } from \"fs\";\nimport { run, initializeClaudeConfig } from \"./index\";\nimport { isServiceRunning, killProcess, readServiceInfo } from \"./utils/processCheck\";\nimport { CONFIG_DIR, CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from \"./constants\";\nimport { isTcpPortOccupied, waitForService } from \"./service-health\";\nimport { runSetupCli } from \"./setup\";\nimport { buildUsableMinimalTemplateConfig } from \"./setup/templates\";\nimport { runDoctorCli } from \"./doctor\";\n\r\nconst PACKAGE_JSON_PATH = join(__dirname, \"..\", \"package.json\");\nconst PACKAGE_PAGE_URL = \"https://www.npmjs.com/package/@peterwangze/claude-trigger-router\";\nconst PACKAGE_REGISTRY_LATEST_URL = \"https://registry.npmjs.org/@peterwangze%2Fclaude-trigger-router/latest\";\nconst PACKAGE_REGISTRY_URL = \"https://registry.npmjs.org/\";\n\r\nfunction getPackageInfo(): { name: string; version: string } {\r\n const content = readFileSync(PACKAGE_JSON_PATH, \"utf-8\");\r\n const pkg = JSON.parse(content) as { name?: string; version?: string };\r\n\r\n return {\r\n name: pkg.name ?? \"@peterwangze/claude-trigger-router\",\r\n version: pkg.version ?? \"unknown\",\r\n };\r\n}\r\n\r\nfunction getArgs(): string[] {\r\n return process.argv.slice(2);\r\n}\r\n\r\nfunction getCommand(): string | undefined {\r\n return getArgs()[0];\r\n}\r\n\r\nfunction hasArg(flag: string, shortFlag?: string): boolean {\r\n const args = getArgs();\r\n return args.includes(flag) || (shortFlag ? args.includes(shortFlag) : false);\r\n}\r\n\r\nfunction getArgValue(flag: string, shortFlag?: string): string | undefined {\n const args = getArgs();\n const index = args.indexOf(flag) !== -1 ? args.indexOf(flag) : shortFlag ? args.indexOf(shortFlag) : -1;\n return index !== -1 ? args[index + 1] : undefined;\n}\n\nfunction parsePortValue(portValue: string, sourceLabel: string): number {\n const trimmed = portValue.trim();\n if (!/^\\d+$/.test(trimmed)) {\n throw new Error(`${sourceLabel} \u4E0D\u662F\u5408\u6CD5\u7AEF\u53E3\uFF1A${portValue}`);\n }\n\n const port = Number.parseInt(trimmed, 10);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`${sourceLabel} \u8D85\u51FA\u5408\u6CD5\u8303\u56F4\uFF081-65535\uFF09\uFF1A${portValue}`);\n }\n\n return port;\n}\n\n/**\n * \u4ECE\u547D\u4EE4\u884C\u53C2\u6570\u6216\u914D\u7F6E\u6587\u4EF6\u4E2D\u83B7\u53D6\u7AEF\u53E3\u53F7\n */\nfunction getPort(): number {\n // \u4F18\u5148\u4F7F\u7528\u547D\u4EE4\u884C\u53C2\u6570\n const portValue = getArgValue(\"--port\", \"-p\");\n if (portValue) {\n return parsePortValue(portValue, \"\u547D\u4EE4\u884C\u7AEF\u53E3\u53C2\u6570\");\n }\n\r\n // \u5C1D\u8BD5\u4ECE\u914D\u7F6E\u6587\u4EF6\u8BFB\u53D6\uFF08\u987A\u5E8F\uFF1Aconfig.yaml \u2192 config.yml \u2192 config.json\uFF09\r\n try {\r\n const yaml = require(\"js-yaml\");\r\n if (existsSync(CONFIG_FILE)) {\r\n const content = readFileSync(CONFIG_FILE, \"utf-8\");\r\n const config = yaml.load(content) as any;\r\n if (config?.PORT) return config.PORT;\r\n } else if (existsSync(CONFIG_FILE_YML)) {\r\n const content = readFileSync(CONFIG_FILE_YML, \"utf-8\");\r\n const config = yaml.load(content) as any;\r\n if (config?.PORT) return config.PORT;\r\n } else if (existsSync(CONFIG_FILE_JSON)) {\r\n const content = readFileSync(CONFIG_FILE_JSON, \"utf-8\");\r\n const config = JSON.parse(content);\r\n if (config?.PORT) return config.PORT;\r\n }\r\n } catch {\r\n // \u914D\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C\r\n }\r\n\r\n return DEFAULT_CONFIG.PORT;\r\n}\r\n\r\n/**\r\n * \u68C0\u67E5\u547D\u4EE4\u884C\u53C2\u6570\u4E2D\u662F\u5426\u5305\u542B daemon \u6807\u5FD7\r\n */\r\nfunction isDaemonMode(): boolean {\r\n return hasArg(\"--daemon\", \"-d\");\r\n}\r\n\r\n/**\r\n * \u6253\u5370\u5E2E\u52A9\u4FE1\u606F\r\n */\r\nexport function printHelp() {\n console.log(`\nClaude Trigger Router - \u667A\u80FD\u89E6\u53D1\u8DEF\u7531\u5668\n\r\n\u7528\u6CD5\uFF1Actr <\u547D\u4EE4> [\u9009\u9879]\r\n\r\n\u547D\u4EE4\uFF1A\n setup \u68C0\u6D4B\u5E76\u590D\u7528\u5DF2\u6709\u914D\u7F6E\uFF0C\u5FC5\u8981\u65F6\u8FC1\u79FB\u65E7\u914D\u7F6E\u6216\u65B0\u5EFA\u6700\u5C0F\u914D\u7F6E\n doctor \u8BCA\u65AD\u5E76\u4FEE\u590D\u5F53\u524D\u914D\u7F6E\uFF0C\u6309\u9700\u63A2\u6D4B\u6A21\u578B\u53EF\u7528\u6027\n init \u521D\u59CB\u5316\u6700\u5C0F\u914D\u7F6E\u6A21\u677F\n start \u542F\u52A8\u8DEF\u7531\u670D\u52A1\uFF08\u9ED8\u8BA4\u524D\u53F0\u8FD0\u884C\uFF09\n stop \u505C\u6B62\u540E\u53F0\u670D\u52A1\n restart \u91CD\u542F\u540E\u53F0\u670D\u52A1\n status \u67E5\u770B\u670D\u52A1\u8FD0\u884C\u72B6\u6001\uFF08PID\u3001\u7AEF\u53E3\u3001\u542F\u52A8\u65F6\u95F4\uFF09\n version \u67E5\u770B\u5F53\u524D\u5B89\u88C5\u7248\u672C\u4E0E\u5305\u4FE1\u606F\n upgrade \u67E5\u770B\u5347\u7EA7\u5230\u6700\u65B0 npm \u7248\u672C\u7684\u6307\u5F15\n code \u901A\u8FC7\u8DEF\u7531\u5668\u8FD0\u884C Claude Code\uFF08\u9700\u5148\u542F\u52A8\u670D\u52A1\uFF09\n ui \u6253\u5F00\u672C\u5730\u7BA1\u7406\u9875\uFF08\u914D\u7F6E\u9884\u89C8\u4E0E\u8C03\u8BD5\uFF09\n help \u663E\u793A\u6B64\u5E2E\u52A9\u4FE1\u606F\n\r\n\u9009\u9879\uFF1A\r\n --port, -p \u6307\u5B9A\u76D1\u542C\u7AEF\u53E3\uFF08\u9ED8\u8BA4\uFF1A5678\uFF09\r\n --daemon, -d \u4EE5\u540E\u53F0\u65B9\u5F0F\u8FD0\u884C\uFF08\u914D\u5408 start/restart \u4F7F\u7528\uFF09\r\n --force \u5F3A\u5236\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\uFF08\u914D\u5408 init \u4F7F\u7528\uFF09\r\n\r\n\u4F7F\u7528\u793A\u4F8B\uFF1A\r\n ctr setup # \u590D\u7528\u5F53\u524D\u914D\u7F6E / \u8FC1\u79FB\u65E7\u914D\u7F6E / \u65B0\u5EFA\u6700\u5C0F\u914D\u7F6E\n ctr doctor # \u8BCA\u65AD\u914D\u7F6E / \u4FEE\u590D\u683C\u5F0F\u95EE\u9898 / \u6309\u9700\u63A2\u6D4B\u6A21\u578B\u53EF\u7528\u6027\n ctr init # \u521D\u59CB\u5316\u6700\u5C0F\u914D\u7F6E\u6A21\u677F\n ctr version # \u67E5\u770B\u5F53\u524D\u5B89\u88C5\u7248\u672C\r\n ctr upgrade # \u67E5\u770B\u5347\u7EA7\u5230\u6700\u65B0\u7248\u672C\u7684\u547D\u4EE4\r\n ctr start # \u524D\u53F0\u542F\u52A8\uFF08\u63A8\u8350\u9996\u6B21\u4F7F\u7528\uFF0C\u4FBF\u4E8E\u67E5\u770B\u65E5\u5FD7\uFF09\n ctr start --daemon # \u540E\u53F0\u542F\u52A8\n ctr status # \u67E5\u770B\u670D\u52A1\u72B6\u6001\n ctr code # \u542F\u52A8 Claude Code\uFF08\u9700\u5148\u8FD0\u884C ctr start\uFF09\n ctr ui # \u6253\u5F00\u672C\u5730\u7BA1\u7406\u9875\uFF08\u53EF\u9009\uFF09\n ctr stop # \u505C\u6B62\u540E\u53F0\u670D\u52A1\n ctr restart --daemon # \u91CD\u542F\u540E\u53F0\u670D\u52A1\n\r\n\u914D\u7F6E\u6587\u4EF6\uFF1A\n ${CONFIG_FILE}\n ${CONFIG_FILE_JSON}\n\n\u914D\u7F6E\u76EE\u5F55\uFF1A${CONFIG_DIR}\n\n\u8865\u5145\u8BF4\u660E\uFF1A\n ctr restart \u5F53\u524D\u9ED8\u8BA4\u6309\u540E\u53F0\u6A21\u5F0F\u91CD\u542F\uFF1B\u53EF\u5199 ctr restart \u6216 ctr restart --daemon\n\n\u66F4\u591A\u4FE1\u606F\uFF1Ahttps://github.com/peterwangze/claude-trigger-router\n`);\n}\n\r\nfunction getLatestPackageVersionViaNpm(packageName: string, timeoutMs = 5000): string | null {\n try {\n const result = spawnSync(\"npm\", [\"view\", packageName, \"version\", \"--registry\", PACKAGE_REGISTRY_URL], {\n encoding: \"utf-8\",\n timeout: timeoutMs,\n shell: process.platform === \"win32\",\n });\n\n if (result.status !== 0) {\n return null;\n }\n\n const value = result.stdout?.trim();\n return value ? value : null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestPackageVersion(packageName: string, timeoutMs = 4000): Promise<string | null> {\n try {\n const response = await fetch(PACKAGE_REGISTRY_LATEST_URL, {\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\r\n return null;\r\n }\r\n\n const payload = await response.json() as { version?: unknown };\n if (typeof payload.version === \"string\") {\n return payload.version;\n }\n } catch {\n // Fall through to npm CLI lookup.\n }\n\n return getLatestPackageVersionViaNpm(packageName);\n}\n\r\nfunction isNewerVersion(current: string, latest: string): boolean {\r\n const currentParts = current.split(\".\").map((part) => Number.parseInt(part, 10));\r\n const latestParts = latest.split(\".\").map((part) => Number.parseInt(part, 10));\r\n const length = Math.max(currentParts.length, latestParts.length);\r\n\r\n for (let index = 0; index < length; index += 1) {\r\n const currentValue = Number.isFinite(currentParts[index]) ? currentParts[index] : 0;\r\n const latestValue = Number.isFinite(latestParts[index]) ? latestParts[index] : 0;\r\n\r\n if (latestValue > currentValue) {\r\n return true;\r\n }\r\n\r\n if (latestValue < currentValue) {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nasync function printVersion() {\n const pkg = getPackageInfo();\n const latestVersion = await getLatestPackageVersion(pkg.name);\n\r\n console.log(`Package: ${pkg.name}`);\r\n console.log(`Version: ${pkg.version}`);\r\n console.log(`Latest: ${latestVersion ?? \"unavailable\"}`);\r\n if (latestVersion && isNewerVersion(pkg.version, latestVersion)) {\r\n console.log(`Upgrade: npm install -g ${pkg.name}@latest`);\r\n }\r\n console.log(`NPM: ${PACKAGE_PAGE_URL}`);\r\n}\r\n\r\nfunction printUpgradeGuidance() {\n const pkg = getPackageInfo();\r\n\r\n console.log(`\u5F53\u524D\u5B89\u88C5\u7248\u672C\uFF1A${pkg.version}`);\r\n console.log(`\u5305\u540D\uFF1A${pkg.name}`);\r\n console.log(\"\u5347\u7EA7\u5230\u6700\u65B0\u7248\u672C\uFF1A\");\r\n console.log(` npm install -g ${pkg.name}@latest`);\r\n console.log(\"\u8BF7\u5728\u5F53\u524D ctr \u8FDB\u7A0B\u5916\u6267\u884C\u5347\u7EA7\u547D\u4EE4\uFF0C\u907F\u514D\u81EA\u5347\u7EA7\u65F6\u5360\u7528\u5F53\u524D\u6587\u4EF6\u3002\");\r\n console.log(\"\u5982\u679C\u4F60\u6700\u521D\u662F\u901A\u8FC7 GitHub \u6E90\u5B89\u88C5\uFF0C\u8BF7\u7EE7\u7EED\u4F7F\u7528\u539F\u5B89\u88C5\u6765\u6E90\uFF0C\u5F53\u524D\u547D\u4EE4\u4E0D\u4F1A\u81EA\u52A8\u5207\u6362\u6765\u6E90\u3002\");\r\n console.log(\"\u5168\u5C40\u5B89\u88C5\u5728\u67D0\u4E9B\u73AF\u5883\u4E0B\u53EF\u80FD\u9700\u8981\u7BA1\u7406\u5458/root \u6743\u9650\u3002\");\n console.log(`NPM: ${PACKAGE_PAGE_URL}`);\n}\n\nfunction printRestartGuidanceHint() {\n console.log(\"\u8BF4\u660E\uFF1A`ctr restart` \u5F53\u524D\u9ED8\u8BA4\u6309\u540E\u53F0\u6A21\u5F0F\u91CD\u542F\u670D\u52A1\uFF0C`--daemon` \u53EA\u662F\u663E\u5F0F\u5199\u6CD5\u3002\");\n}\n\nfunction isClaudeCommandAvailable(timeoutMs = 3000): boolean {\n try {\n const result = spawnSync(\"claude\", [\"--version\"], {\n encoding: \"utf-8\",\n timeout: timeoutMs,\n stdio: \"ignore\",\n shell: process.platform === \"win32\",\n });\n\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\r\n/**\r\n * \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6\r\n */\r\nfunction initConfig() {\n const force = hasArg(\"--force\");\n\r\n const existingConfig = [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON].find(existsSync);\r\n if (existingConfig && !force) {\r\n console.log(`\u26A0\uFE0F \u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A${existingConfig}`);\r\n console.log(\" \u5982\u9700\u8986\u76D6\uFF0C\u8BF7\u4F7F\u7528 --force \u53C2\u6570\u3002\");\r\n return;\r\n }\r\n\r\n // \u786E\u4FDD\u914D\u7F6E\u76EE\u5F55\u5B58\u5728\r\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n\n try {\n const yaml = require(\"js-yaml\");\n const templateConfig = buildUsableMinimalTemplateConfig();\n const content = yaml.dump(templateConfig, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n });\n writeFileSync(CONFIG_FILE, content, \"utf-8\");\n const action = force ? \"\u5DF2\u8986\u76D6\" : \"\u5DF2\u521B\u5EFA\";\n console.log(`\u2705 \u914D\u7F6E\u6587\u4EF6${action}\uFF1A${CONFIG_FILE}`);\n console.log(\"\");\r\n console.log(\"\u4E0B\u4E00\u6B65\uFF1A\");\r\n console.log(\" 1. \u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\uFF0C\u586B\u5165\u4F60\u7684 API \u5BC6\u94A5\");\r\n console.log(\" 2. \u5728 'Models' \u4E0B\u8865\u5168\u4F60\u7684\u6A21\u578B\u63A5\u5165\u4FE1\u606F\");\r\n console.log(\" 3. \u5C06 'Router.default' \u8BBE\u7F6E\u4E3A\u9ED8\u8BA4\u6A21\u578B ID\");\r\n console.log(\" 4. \u5982\u9700\u9AD8\u7EA7\u8DEF\u7531\uFF0C\u518D\u7EE7\u7EED\u914D\u7F6E\u89C4\u5219\u6216\u667A\u80FD\u8DEF\u7531\");\r\n console.log(` 5. \u8FD0\u884C\uFF1Actr start`);\r\n } catch (error: any) {\r\n console.error(\"\u274C \u521B\u5EFA\u914D\u7F6E\u6587\u4EF6\u5931\u8D25:\", error.message);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * \u4EE5\u524D\u53F0\u65B9\u5F0F\u542F\u52A8\u670D\u52A1\r\n */\r\nasync function startForeground(port?: number) {\n const targetPort = port ?? getPort();\n const healthy = await waitForService(targetPort, 500);\n const occupied = await isTcpPortOccupied(targetPort, 500);\n if (healthy && occupied && isServiceRunning()) {\n console.log(`\u2705 Service is already running on port ${targetPort}.`);\n console.log(\" Use 'ctr status' to inspect it or 'ctr stop' before starting again.\");\n return;\n }\n if (!healthy && occupied && !isServiceRunning()) {\n console.error(`\u274C Port ${targetPort} is already occupied by another service.`);\n process.exit(1);\n }\n\n console.log(\"\uD83D\uDE80 Starting Claude Trigger Router (foreground)...\");\n console.log(\" Press Ctrl+C to stop\");\n\n try {\n await run({ port: targetPort });\n } catch (error: any) {\n if (error.message?.includes(\"Invalid configuration\")) {\r\n console.error(\"\\n\u274C Configuration error. Run 'ctr init' to create a config file.\");\r\n } else {\r\n console.error(\"\u274C Failed to start service:\", error.message);\r\n }\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * \u4EE5\u540E\u53F0\uFF08daemon\uFF09\u65B9\u5F0F\u542F\u52A8\u670D\u52A1\r\n */\r\nasync function startDaemon(port?: number) {\n const targetPort = port ?? getPort();\n const healthy = await waitForService(targetPort, 500);\n const occupied = await isTcpPortOccupied(targetPort, 500);\n if (!healthy && occupied && !isServiceRunning()) {\n console.log(`\u274C Port ${targetPort} is already occupied by another service.`);\n return;\n }\n\n if (isServiceRunning()) {\n console.log(\"\u2705 Service is already running in the background.\");\n return;\n }\r\n\r\n const nodeExec = process.execPath;\r\n const scriptPath = process.argv[1];\r\n\r\n // \u6784\u9020\u4E0D\u542B --daemon \u7684\u53C2\u6570\r\n const childArgs = [scriptPath, \"start\"];\r\n if (port) {\r\n childArgs.push(\"--port\", String(port));\r\n }\r\n\r\n const child = spawn(nodeExec, childArgs, {\n detached: true,\n stdio: \"ignore\",\n env: { ...process.env, CTR_DAEMON: \"1\" },\n });\n\n child.unref();\n\n const startConfirmed = await new Promise<boolean>((resolve, reject) => {\n let settled = false;\n const deadline = Date.now() + 5000;\n\n const finish = (value: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(value);\n };\n\n child.once(\"error\", reject);\n child.once(\"exit\", () => finish(false));\n\n const poll = () => {\n if (settled) {\n return;\n }\n if (isServiceRunning()) {\n finish(true);\n return;\n }\n if (Date.now() >= deadline) {\n finish(false);\n return;\n }\n setTimeout(poll, 250);\n };\n\n poll();\n });\n\n if (!startConfirmed) {\n console.error(`\u274C Service failed to start in background (port: ${targetPort}).`);\n console.error(\" Run 'ctr start' (without --daemon) to inspect the startup error.\");\n process.exit(1);\n }\n\n console.log(`\u2705 Service started in background (port: ${targetPort})`);\n console.log(` Run 'ctr stop' to stop it.`);\n}\n\r\n/**\r\n * \u663E\u793A\u670D\u52A1\u72B6\u6001\r\n */\r\nasync function showStatus() {\n const info = readServiceInfo();\n if (!info || !isServiceRunning()) {\n const targetPort = getPort();\n const healthy = await waitForService(targetPort, 500);\n const occupied = await isTcpPortOccupied(targetPort, 500);\n if (!healthy && occupied) {\n console.log(`\u26A0\uFE0F \u7AEF\u53E3 ${targetPort} \u5DF2\u88AB\u5176\u4ED6\u670D\u52A1\u5360\u7528\uFF0C\u5F53\u524D\u4E0D\u662F claude-trigger-router\u3002`);\n return;\n }\n console.log(\"\u23F9 \u670D\u52A1\u672A\u8FD0\u884C\");\n return;\n }\n const startTime = info.startTime ? new Date(info.startTime).toLocaleString() : \"\u672A\u77E5\";\r\n console.log(\"\u2705 \u670D\u52A1\u8FD0\u884C\u4E2D\");\r\n console.log(` PID\uFF1A${info.pid}`);\r\n console.log(` \u7AEF\u53E3\uFF1A${info.port}`);\r\n console.log(` \u542F\u52A8\u65F6\u95F4\uFF1A${startTime}`);\r\n console.log(` \u63A5\u5165\u5730\u5740\uFF1Ahttp://127.0.0.1:${info.port}`);\r\n}\r\n\r\n/**\r\n * \u505C\u6B62\u670D\u52A1\r\n */\r\nfunction stopService() {\r\n const info = readServiceInfo();\r\n if (!info || !isServiceRunning()) {\r\n console.log(\"\u26A0\uFE0F \u672A\u53D1\u73B0\u8FD0\u884C\u4E2D\u7684\u670D\u52A1\u3002\");\r\n return;\r\n }\r\n\r\n try {\r\n console.log(`\uD83D\uDED1 \u6B63\u5728\u505C\u6B62\u670D\u52A1\uFF08PID: ${info.pid}\uFF0C\u7AEF\u53E3: ${info.port}\uFF09...`);\r\n killProcess(info.pid);\r\n console.log(\"\u2705 \u670D\u52A1\u5DF2\u505C\u6B62\u3002\");\r\n } catch (error: any) {\r\n console.error(\"\u274C \u505C\u6B62\u670D\u52A1\u5931\u8D25:\", error.message);\r\n }\r\n}\r\n\r\n/**\r\n * \u91CD\u542F\u670D\u52A1\uFF08daemon \u6A21\u5F0F\uFF09\r\n */\r\nasync function restartService() {\n stopService();\n await new Promise((resolve) => setTimeout(resolve, 1500));\n await startDaemon(getPort());\n}\n\r\n/**\r\n * \u8FD0\u884C Claude Code\r\n */\r\nexport async function runClaudeCode() {\n const port = getPort();\n\r\n // \u786E\u4FDD ~/.claude.json \u5B58\u5728\uFF08\u8DF3\u8FC7 Claude Code \u9996\u6B21\u5F15\u5BFC\u6D41\u7A0B\uFF09\r\n // \u4EC5\u5728\u6B64\u5904\u6267\u884C\uFF0C\u907F\u514D\u5728 ctr start \u65F6\u4EA7\u751F\u4E0D\u5FC5\u8981\u7684\u5168\u5C40\u526F\u4F5C\u7528\r\n await initializeClaudeConfig();\r\n\r\n // \u5148\u770B\u672C\u5730\u5143\u6570\u636E\uFF0C\u518D\u7528\u5065\u5EB7\u68C0\u67E5\u786E\u8BA4\u5F53\u524D\u7AEF\u53E3\u4E0A\u786E\u5B9E\u662F\u672C\u670D\u52A1\r\n const running = isServiceRunning();\r\n console.log(`\uD83D\uDD0D Checking if service is available on port ${port}...`);\r\n const reachable = await waitForService(port, 2000);\r\n\r\n if (!reachable) {\n console.log(`\u26A0\uFE0F Trigger Router service is not running on port ${port}.`);\n console.log(\"\");\n console.log(\"Options:\");\n console.log(\" 1. Start service first: ctr start --daemon\");\n console.log(\" 2. Or start interactively in another terminal: ctr start\");\n console.log(\"\");\n process.exit(1);\n }\n\n console.log(`\uD83D\uDE80 Starting Claude Code with Trigger Router (port: ${port})...`);\n if (!isClaudeCommandAvailable()) {\n console.error(\"\u274C \u672A\u68C0\u6D4B\u5230 Claude Code CLI\u3002\");\n console.log(\" \u8BF7\u5148\u5B89\u88C5\uFF1Anpm install -g @anthropic-ai/claude-code\");\n process.exit(1);\n }\n\n // \u542F\u52A8 Claude Code\uFF08Windows \u4E0A npm \u5168\u5C40\u547D\u4EE4\u4E3A .cmd shim\uFF0C\u9700\u8981 shell: true\uFF09\n const isWindows = process.platform === \"win32\";\n const claude = spawn(\"claude\", [], {\r\n stdio: \"inherit\",\r\n shell: isWindows,\r\n env: {\r\n ...process.env,\r\n ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}`,\r\n },\r\n });\r\n\r\n claude.on(\"error\", (error) => {\r\n console.error(\"\u274C \u542F\u52A8 Claude Code \u5931\u8D25:\", error.message);\r\n console.log(\" \u8BF7\u786E\u8BA4 Claude Code \u5DF2\u5168\u5C40\u5B89\u88C5\uFF1Anpm install -g @anthropic-ai/claude-code\");\r\n if (isWindows) {\r\n console.log(\" Windows \u7528\u6237\u8BF7\u786E\u8BA4\u5728 PowerShell \u6216 CMD \u4E2D\u8FD0\u884C\uFF0C\u800C\u975E Git Bash\");\r\n }\r\n });\r\n\r\n claude.on(\"exit\", (code) => {\r\n process.exit(code || 0);\r\n });\r\n}\r\n\r\n/**\r\n * \u6253\u5F00 Web UI\r\n */\r\nasync function openUI() {\n const port = getPort();\n const url = `http://127.0.0.1:${port}/ui`;\n const healthy = await waitForService(port, 800);\n\n console.log(`\uD83C\uDF10 Opening UI at ${url}`);\n if (!healthy) {\n console.log(\"\u26A0\uFE0F \u5F53\u524D UI \u670D\u52A1\u672A\u5C31\u7EEA\uFF1B\u5982\u679C\u9875\u9762\u65E0\u6CD5\u6253\u5F00\uFF0C\u8BF7\u5148\u8FD0\u884C ctr start \u6216 ctr start --daemon\u3002\");\n }\n\n if (process.env.CTR_UI_SKIP_OPEN === \"1\") {\n console.log(\" Browser launch skipped by CTR_UI_SKIP_OPEN=1\");\n return;\n }\n\n try {\n open(url);\n } catch (error: any) {\n console.log(` Please open ${url} in your browser`);\n }\r\n}\r\n\r\n/**\r\n * \u4E3B\u51FD\u6570\r\n */\r\nexport async function main() {\r\n const command = getCommand();\r\n\r\n switch (command) {\r\n case \"setup\":\n await runSetupCli();\n break;\n\n case \"doctor\":\n await runDoctorCli();\n break;\n\r\n case \"init\":\r\n initConfig();\r\n break;\r\n\r\n case \"start\":\n if (isDaemonMode()) {\n await startDaemon(getPort());\n } else {\n await startForeground(getPort());\n }\n break;\r\n\r\n case \"stop\":\r\n stopService();\r\n break;\r\n\r\n case \"status\":\n await showStatus();\n break;\n\r\n case \"version\":\r\n await printVersion();\r\n break;\r\n\r\n case \"upgrade\":\n printUpgradeGuidance();\n break;\n\n case \"restart\":\n printRestartGuidanceHint();\n await restartService();\n break;\n\r\n case \"code\":\r\n await runClaudeCode();\r\n break;\r\n\r\n case \"ui\":\n await openUI();\n break;\n\r\n case \"help\":\r\n case \"--help\":\r\n case \"-h\":\r\n printHelp();\r\n break;\r\n\r\n default:\r\n if (command) {\r\n console.log(`Unknown command: ${command}`);\r\n }\r\n printHelp();\r\n process.exit(command ? 1 : 0);\r\n }\r\n}\r\n\r\nif (process.env.CTR_SKIP_MAIN !== \"1\") {\r\n main().catch((error) => {\r\n console.error(\"Error:\", error);\r\n process.exit(1);\r\n });\r\n}\r\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAMA,WACA,aAKa,YAKA,aAKA,kBAKA,iBAKA,UAKA,UAKA,uBAKA,8BAKA,gCAKA,yBAKA,0BAKAA,iBAYA,wBAWA,6BAaA;AAvGb;AAAA;AAAA;AAMA,gBAAwB;AACxB,kBAAqB;AAKd,IAAM,iBAAa,sBAAK,mBAAQ,GAAG,wBAAwB;AAK3D,IAAM,kBAAc,kBAAK,YAAY,aAAa;AAKlD,IAAM,uBAAmB,kBAAK,YAAY,aAAa;AAKvD,IAAM,sBAAkB,kBAAK,YAAY,YAAY;AAKrD,IAAM,eAAW,kBAAK,YAAY,MAAM;AAKxC,IAAM,eAAW,kBAAK,YAAY,2BAA2B;AAK7D,IAAM,4BAAwB,kBAAK,YAAY,wBAAwB;AAKvE,IAAM,mCAA+B,kBAAK,YAAY,2BAA2B;AAKjF,IAAM,qCAAiC,kBAAK,YAAY,wCAAwC;AAKhG,IAAM,8BAA0B,kBAAK,YAAY,6BAA6B;AAK9E,IAAM,+BAA2B,kBAAK,YAAY,kCAAkC;AAKpF,IAAMA,kBAAiB;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IACxB;AAKO,IAAM,yBAAyB;AAAA,MACpC,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,wBAAwB;AAAA,MACxB,OAAO,CAAC;AAAA,IACV;AAMO,IAAM,8BAA8B;AAAA,MACzC,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY,CAAC;AAAA,MACb,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAMO,IAAM,4BAA4B;AAAA,MACvC,SAAS;AAAA,MACT,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,kCAAkC;AAAA,QAClC,yBAAyB;AAAA,QACzB,WAAW;AAAA,UACT,SAAS;AAAA,UACT,kBAAkB;AAAA,UAClB,oBAAoB;AAAA,QACtB;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,QACd,cAAc;AAAA,QACd,UAAU;AAAA,UACR,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,sBAAsB,CAAC,QAAQ,mBAAmB,aAAa;AAAA,QACjE;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,QACN,WAAW;AAAA,QACX,YAAY,CAAC;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,QAAQ;AAAA,UACN,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,oBAAoB;AAAA,QACtB;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,oBAAoB;AAAA,UAClB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,UACnB,uBAAuB;AAAA,UACvB,kBAAkB;AAAA,UAClB,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,UACjB,qBAAqB;AAAA,UACrB,iBAAiB;AAAA,UACjB,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACzJO,SAAS,YAAY,MAA6C;AACvE,SAAO,KAAK,KAAK,KAAK,KAAK,KAAK,cAAc,KAAK,KAAK;AAC1D;AAEO,SAAS,YAAY,MAA6C;AACvE,SAAO,KAAK,KAAK,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK;AACrD;AAEO,SAAS,kBAAkB,MAAiE;AACjG,SAAO,KAAK,aAAa,KAAK;AAChC;AAEO,SAAS,wBACd,UACkC;AAClC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,aAAa,UAAU;AAChC,QAAI,aAAa,SAAS,aAAa,YAAY,aAAa,QAAQ;AACtE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,EACL;AACF;AAEO,SAAS,gBACd,UACwD;AACxD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,kBAAkB,QAAW;AACxC,WAAO;AAAA,MACL,GAAG;AAAA,IACL;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,QAAQ,SAAS,UAAU,CAAC,SAAS,eAAe;AACxE,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,SAAS,QAAQ,CAAC,SAAS,QAAQ;AACrC,WAAO,SAAS;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,EACL;AACF;AAEO,SAAS,6BAA6B,MAA2D;AACtG,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,MAAM,YAAY,IAAI;AAC5B,QAAM,iBAAiB,kBAAkB,IAAI;AAE7C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,KAAK,IAAI,KAAK,KAAK;AAAA,IACvB;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO,KAAK,OAAO,KAAK,KAAK;AAAA,IAC7B,UAAU,wBAAwB,KAAK,QAAQ;AAAA,IAC/C,UAAU,KAAK,WACX;AAAA,MACE,GAAG,KAAK;AAAA,IACV,IACA;AAAA,EACN;AACF;AAEO,SAAS,sBAAsB,MAAqC;AACzE,QAAM,aAAa,6BAA6B,IAAI;AACpD,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf,KAAK,WAAW;AAAA,IAChB,KAAK,WAAW;AAAA,IAChB,WAAW,WAAW;AAAA,IACtB,OAAO,WAAW;AAAA,IAClB,UAAU,gBAAgB,WAAW,QAA4C;AAAA,IACjF,UAAU,WAAW;AAAA,EACvB;AACF;AAtGA;AAAA;AAAA;AAAA;AAAA;;;ACiDA,SAAS,iBAAiB,UAAuC;AAC/D,MAAI,aAAa,UAAU;AACzB,WAAO;AAAA,MACL,KAAK,CAAC,YAAY;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,0BACP,MACA,gBACuB;AACvB,MAAI,mBAAmB,aAAa;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,4BACd,gBACA,sBACiB;AACjB,MAAI,mBAAmB,aAAa;AAClC,WAAO;AAAA,EACT;AAEA,UAAQ,sBAAsB;AAAA,IAC5B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,6BAA6B,SAAkE;AAC7G,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AACE,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,EACJ;AACF;AAEO,SAAS,uBAAuB,QAA2D;AAChG,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AACE,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,EACJ;AACF;AAEA,SAAS,0BACP,MACA,gBAC4B;AAC5B,QAAM,qBAAqB,KAAK,UAAU,uBAAuB;AAEjE,SAAO;AAAA,IACL,UAAU;AAAA,MACR,WAAW;AAAA,MACX,GAAI,qBAAsB,KAAK,YAAY,CAAC,IAAK,CAAC;AAAA,IACpD;AAAA,IACA,OAAO,KAAK,UAAU,mBAAmB;AAAA,IACzC,QAAQ,KAAK,UAAU,oBAAoB;AAAA,IAC3C,oBAAoB;AAAA,EACtB;AACF;AAEO,SAAS,yBAAyB,QAA6C;AACpF,SAAO,OAAO,IAAI,CAAC,YAAY;AAC7B,UAAM,OAAO,6BAA6B,OAAO;AACjD,UAAM,iBAAiB,kBAAkB,IAAI,KAAK;AAClD,WAAO;AAAA,MACP,MAAM,UAAU,KAAK,EAAE;AAAA,MACvB,cAAc,YAAY,IAAI;AAAA,MAC9B,SAAS,YAAY,IAAI;AAAA,MACzB,QAAQ,CAAC,KAAK,KAAK;AAAA,MACnB,aAAa,iBAAiB,cAAc;AAAA,IAC9C;AAAA,EACA,CAAC;AACH;AAEO,SAAS,mBAAmB,QAA4C;AAC7E,MAAI,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,GAAG;AAC5D,UAAMC,aAAY,yBAAyB,OAAO,MAAM;AACxD,UAAMC,YAAW,OAAO,OAAO,OAA0C,CAAC,QAAQ,YAAY;AAC5F,YAAM,OAAO,6BAA6B,OAAO;AACjD,YAAM,iBAAiB,kBAAkB,IAAI,KAAK;AAClD,YAAM,uBAAuB,0BAA0B,MAAM,cAAc;AAC3E,aAAO,KAAK,EAAE,IAAI;AAAA,QAChB,IAAI,KAAK;AAAA,QACT,cAAc,UAAU,KAAK,EAAE;AAAA,QAC/B,WAAW,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,UAAU;AAAA,QACV;AAAA,QACA,gBAAgB,4BAA4B,gBAAgB,oBAAoB;AAAA,QAClF,UAAU,KAAK;AAAA,QACf,cAAc,0BAA0B,MAAM,cAAc;AAAA,QAC5D,QAAQ;AAAA,MACR;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAEL,WAAO;AAAA,MACL,WAAAD;AAAA,MACA,UAAAC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,aAAa,CAAC;AACvC,QAAM,WAAW,UAAU,OAA0C,CAAC,QAAQ,aAAa;AACzF,eAAW,SAAS,SAAS,UAAU,CAAC,GAAG;AACzC,YAAM,uBAAuB;AAAA,QAC3B,EAAE,cAAc,SAAS,aAAa;AAAA,QACtC;AAAA,MACF;AACA,aAAO,GAAG,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI;AAAA,QACpC,IAAI,GAAG,SAAS,IAAI,IAAI,KAAK;AAAA,QAC7B,cAAc,SAAS;AAAA,QACvB,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,QACV;AAAA,QACA,gBAAgB,4BAA4B,UAAU,oBAAoB;AAAA,QAC1E,cAAc;AAAA,UACZ,UAAU;AAAA,YACR,WAAW;AAAA,UACb;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,oBAAoB;AAAA,QACtB;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,QAAoB,KAAkC;AAC1F,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,SAAS,GAAG,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,mBAAmB,MAAM;AAC1C,QAAM,WAAW,SAAS,SAAS,GAAG;AACtC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,SAAS,YAAY,IAAI,SAAS,SAAS;AACvD;AAEO,SAAS,oBAAoB,QAAoB,KAA6C;AACnG,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,mBAAmB,MAAM;AAC1C,MAAI,CAAC,IAAI,SAAS,GAAG,GAAG;AACtB,WAAO,SAAS,SAAS,GAAG;AAAA,EAC9B;AAEA,QAAM,cAAc,SAAS,SAAS,GAAG;AACzC,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,cAAc,SAAS,IAAI,IAAI,MAAM,GAAG;AAC/C,SAAO,OAAO,OAAO,SAAS,QAAQ,EAAE;AAAA,IACtC,CAAC,SAAS,KAAK,iBAAiB,gBAAgB,KAAK,cAAc;AAAA,EACrE;AACF;AAEO,SAAS,sBAAsB,QAAoB,KAAuB;AAC/E,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,SAAS,GAAG,GAAG;AACrB,UAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,GAAG;AACvC,WAAO;AAAA,MACL,OAAO,WAAW;AAAA,QAAK,CAAC,SACtB,KAAK,SAAS,YAAY,KAAK,QAAQ,SAAS,KAAK;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,mBAAmB,MAAM;AAC1C,SAAO,QAAQ,SAAS,SAAS,GAAG,CAAC;AACvC;AAEO,SAAS,0BACd,QACA,UACkC;AAClC,QAAM,UAA6C,CAAC;AACpD,QAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,SAAS,CAAC;AAChE,QAAM,mBAAmB,YAAY,mBAAmB,MAAoB;AAE5E,SAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,UAAM,UAAU,OAAO,OAAO,OAAO,WAAW,MAAM,GAAG,KAAK,IAAI;AAClE,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,gBAAgB,iBAAiB,WAAW,OAAO;AACzD,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA,QAAI,OAAO,YAAY,cAAc,cAAc,UAAU,cAAc,OAAO;AAChF,cAAQ,KAAK;AAAA,QACX,MAAM,UAAU,KAAK;AAAA,QACrB;AAAA,QACA,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,UAAU,KAAK,wCAAwC,OAAO;AAAA,MACzE,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,UAAU,mBAAmB,OAAO;AAC7C,cAAQ,KAAK;AAAA,QACX,MAAM,UAAU,KAAK;AAAA,QACrB;AAAA,QACA,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,UAAU,KAAK,uDAAuD,OAAO;AAAA,MACxF,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,UAAU,oBAAoB,OAAO;AAC9C,cAAQ,KAAK;AAAA,QACX,MAAM,UAAU,KAAK;AAAA,QACrB;AAAA,QACA,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,UAAU,KAAK,8DAA8D,OAAO;AAAA,MAC/F,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,OAAO,CAAC,UAAU,MAAM,UAAU,MAAM,EAAE;AAAA,MACxD,MAAM,QAAQ,OAAO,CAAC,UAAU,MAAM,UAAU,MAAM,EAAE;AAAA,IAC1D;AAAA,EACF;AACF;AAjVA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACuBO,SAAS,iBAAiB,QAA0B;AACzD,eAAa,OAAO,QAAQ;AAC5B,QAAM,SAAS,OAAO,aAAa,SAAS,YAAY;AACxD,iBAAe,WAAW,KAAK,KAAK,WAAW;AACjD;AAKA,SAAS,UAAU,OAAwB;AACzC,SAAO,cAAc,SAAS;AAChC;AAKA,SAAS,KAAa;AACpB,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAKO,SAAS,OAAO,MAAmB;AACxC,MAAI,CAAC,UAAU,WAAW,IAAI,EAAG;AACjC,UAAQ,IAAI,IAAI,GAAG,CAAC,YAAY,GAAG,IAAI;AACzC;AAKO,SAAS,YAAY,MAAmB;AAC7C,MAAI,CAAC,UAAU,WAAW,KAAK,EAAG;AAClC,UAAQ,MAAM,IAAI,GAAG,CAAC,aAAa,GAAG,IAAI;AAC5C;AAKO,SAAS,WAAW,MAAmB;AAC5C,MAAI,CAAC,UAAU,WAAW,IAAI,EAAG;AACjC,UAAQ,KAAK,IAAI,GAAG,CAAC,YAAY,GAAG,IAAI;AAC1C;AAKO,SAAS,YAAY,MAAmB;AAC7C,MAAI,CAAC,UAAU,WAAW,KAAK,EAAG;AAClC,UAAQ,IAAI,IAAI,GAAG,CAAC,aAAa,GAAG,IAAI;AAC1C;AA1EA,IASM,YASF,YACA;AAnBJ;AAAA;AAAA;AASA,IAAM,aAAqC;AAAA,MACzC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAO;AAAA,MACP,MAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAEA,IAAI,aAAa;AACjB,IAAI,eAAe,WAAW;AAAA;AAAA;;;ACU9B,eAAsB,UAAyB;AAC7C,MAAI,KAAC,sBAAW,UAAU,GAAG;AAC3B,6BAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACA,MAAI,KAAC,sBAAW,QAAQ,GAAG;AACzB,6BAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EACzC;AACF;AAMA,eAAe,eAAe,MAAmD;AAC/E,MAAI,KAAC,sBAAW,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,UAAM,0BAAS,MAAM,OAAO;AAC5C,WAAY,UAAK,OAAO;AAAA,EAC1B,SAAS,OAAY;AACnB,UAAM,UAAU,SAAI,OAAO,EAAE;AAC7B,YAAQ,MAAM;AAAA,EAAK,OAAO,EAAE;AAC5B,YAAQ,MAAM,qGAA0B;AACxC,YAAQ,MAAM,OAAO;AACrB,YAAQ,MAAM,uBAAQ,IAAI,EAAE;AAC5B,YAAQ,MAAM,uBAAQ,MAAM,WAAW,KAAK,EAAE;AAC9C,YAAQ,MAAM,gIAAiC;AAC/C,YAAQ,MAAM,oFAAuC;AACrD,YAAQ,MAAM,GAAG,OAAO;AAAA,CAAI;AAC5B,UAAM,IAAI,MAAM,uBAAuB,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,EACjE;AACF;AAMA,eAAe,eAAe,MAAmD;AAC/E,MAAI,KAAC,sBAAW,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,UAAM,0BAAS,MAAM,OAAO;AAC5C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAY;AACnB,UAAM,UAAU,SAAI,OAAO,EAAE;AAC7B,YAAQ,MAAM;AAAA,EAAK,OAAO,EAAE;AAC5B,YAAQ,MAAM,qGAA0B;AACxC,YAAQ,MAAM,OAAO;AACrB,YAAQ,MAAM,uBAAQ,IAAI,EAAE;AAC5B,YAAQ,MAAM,uBAAQ,MAAM,WAAW,KAAK,EAAE;AAC9C,YAAQ,MAAM,oJAAiC;AAC/C,YAAQ,MAAM,GAAG,OAAO;AAAA,CAAI;AAC5B,UAAM,IAAI,MAAM,uBAAuB,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,EACjE;AACF;AAKA,SAAS,UAAyC,QAAW,QAAuB;AAClF,QAAM,SAAS,EAAE,GAAG,OAAO;AAE3B,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,GAAG;AACrD,YAAM,cAAc,OAAO,GAAG;AAC9B,YAAM,cAAc,OAAO,GAAG;AAE9B,UACE,eACA,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,KAC1B,eACA,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,GAC1B;AACA,eAAO,GAAG,IAAI,UAAU,aAAa,WAAW;AAAA,MAClD,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,iBACP,KACA,WACA,WACe;AACf,MAAI,CAAC,OAAO,CAAC,IAAI,SAAS,GAAG,GAAG;AAC9B,WAAO,GAAG,SAAS,oGAAmC,GAAG;AAAA,EAC3D;AACA,QAAM,CAAC,cAAc,SAAS,IAAI,IAAI,MAAM,GAAG;AAC/C,QAAM,WAAW,UAAU,KAAK,OAAK,EAAE,SAAS,YAAY;AAC5D,MAAI,CAAC,UAAU;AACb,WAAO,GAAG,SAAS,kEAAgB,YAAY;AAAA,EACjD;AACA,MAAI,CAAC,SAAS,OAAO,SAAS,SAAS,GAAG;AACxC,WAAO,GAAG,SAAS,oCAAW,SAAS,qCAAY,YAAY;AAAA,EACjE;AACA,SAAO;AACT;AAEA,SAAS,sBACP,KACA,QACA,WACA,WACe;AACf,MAAI,sBAAsB,QAAsB,GAAG,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,KAAK,WAAW,SAAS;AACnD;AAKA,SAAS,eAAe,QAAuC;AAC7D,QAAM,SAAmB,CAAC;AAE1B,MAAI,OAAO,WAAW,QAAW;AAC/B,QAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG;AACjC,aAAO,KAAK,uCAAuC;AAAA,IACrD,OAAO;AACL,YAAM,MAAM,oBAAI,IAAY;AAC5B,aAAO,OAAO,QAAQ,CAAC,MAAM,UAAU;AACrC,YAAI,CAAC,KAAK,IAAI,KAAK,GAAG;AACpB,iBAAO,KAAK,UAAU,KAAK,kBAAkB;AAAA,QAC/C,WAAW,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG;AAClC,iBAAO,KAAK,UAAU,KAAK,qBAAqB;AAAA,QAClD,OAAO;AACL,cAAI,IAAI,KAAK,GAAG,KAAK,CAAC;AAAA,QACxB;AAEA,YAAI,CAAC,YAAY,IAAI,GAAG;AACtB,iBAAO,KAAK,UAAU,KAAK,mBAAmB;AAAA,QAChD;AAEA,YAAI,CAAC,YAAY,IAAI,GAAG;AACtB,iBAAO,KAAK,UAAU,KAAK,mBAAmB;AAAA,QAChD;AAEA,cAAM,iBAAiB,kBAAkB,IAAI;AAC7C,YAAI,CAAC,gBAAgB;AACnB,iBAAO,KAAK,UAAU,KAAK,yBAAyB;AAAA,QACtD,WAAW,CAAC,CAAC,UAAU,WAAW,EAAE,SAAS,cAAc,GAAG;AAC5D,iBAAO,KAAK,UAAU,KAAK,oDAAoD;AAAA,QACjF;AAEA,YAAI,CAAC,KAAK,OAAO,KAAK,GAAG;AACvB,iBAAO,KAAK,UAAU,KAAK,qBAAqB;AAAA,QAClD;AAEA,cAAM,WAAW,KAAK;AACtB,YAAI,UAAU,QAAQ,CAAC,CAAC,OAAO,QAAQ,IAAI,EAAE,SAAS,SAAS,IAAI,GAAG;AACpE,iBAAO,KAAK,UAAU,KAAK,oDAAoD;AAAA,QACjF;AAEA,YAAI,UAAU,UAAU,CAAC,CAAC,OAAO,UAAU,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG;AAC5E,iBAAO,KAAK,UAAU,KAAK,0DAA0D;AAAA,QACvF;AAEA,YAAI,UAAU,kBAAkB,UAAa,SAAS,iBAAiB,GAAG;AACxE,iBAAO,KAAK,UAAU,KAAK,iDAAiD;AAAA,QAC9E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,YAAY,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS;AAEzE,MAAI,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,MAAM,QAAQ,OAAO,SAAS,KAAK,OAAO,UAAU,WAAW,IAAI;AAC1G,WAAO,KAAK,qDAAqD;AAAA,EACnE,WAAW,OAAO,aAAa,MAAM,QAAQ,OAAO,SAAS,GAAG;AAC9D,WAAO,UAAU,QAAQ,CAAC,UAAU,UAAU;AAC5C,UAAI,CAAC,SAAS,MAAM;AAClB,eAAO,KAAK,aAAa,KAAK,oBAAoB;AAAA,MACpD;AACA,UAAI,CAAC,SAAS,cAAc;AAC1B,eAAO,KAAK,aAAa,KAAK,4BAA4B;AAAA,MAC5D;AACA,UAAI,CAAC,SAAS,UAAU,SAAS,OAAO,WAAW,GAAG;AACpD,eAAO,KAAK,aAAa,KAAK,oCAAoC;AAAA,MACpE;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,OAAO,QAAQ,SAAS;AAC3B,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAGA,QAAM,iBAAiB,OAAO,WAAW,OAAO,OAAK,EAAE,QAAQ,EAAE,QAAQ,MAAM,KAAK,CAAC;AACrF,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAMC,UAAS,OAAO;AACtB,QAAIA,SAAQ;AACV,YAAM,oBAAyD;AAAA,QAC7D,CAACA,QAAO,SAAiB,gBAAgB;AAAA,QACzC,CAACA,QAAO,YAAiB,mBAAmB;AAAA,QAC5C,CAACA,QAAO,OAAiB,cAAc;AAAA,QACvC,CAACA,QAAO,aAAiB,oBAAoB;AAAA,QAC7C,CAACA,QAAO,WAAiB,kBAAkB;AAAA,QAC3C,CAACA,QAAO,OAAiB,cAAc;AAAA,MACzC;AACA,iBAAW,CAAC,KAAK,KAAK,KAAK,mBAAmB;AAC5C,YAAI,KAAK;AACP,gBAAM,MAAM,sBAAsB,KAAK,QAAQ,gBAAgB,KAAK;AACpE,cAAI,IAAK,QAAO,KAAK,GAAG;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,eAAe;AACxB,QAAI,OAAO,cAAc,0BAA0B,CAAC,OAAO,cAAc,cAAc;AACrF,aAAO,KAAK,+EAA+E;AAAA,IAC7F,WAAW,OAAO,cAAc,gBAAgB,eAAe,SAAS,GAAG;AACzE,YAAM,MAAM,sBAAsB,OAAO,cAAc,cAAc,QAAQ,gBAAgB,4BAA4B;AACzH,UAAI,IAAK,QAAO,KAAK,GAAG;AAAA,IAC1B;AAEA,QAAI,OAAO,cAAc,OAAO;AAC9B,aAAO,cAAc,MAAM,QAAQ,CAAC,MAAM,UAAU;AAClD,YAAI,CAAC,KAAK,MAAM;AACd,iBAAO,KAAK,uBAAuB,KAAK,oBAAoB;AAAA,QAC9D;AACA,YAAI,CAAC,KAAK,OAAO;AACf,iBAAO,KAAK,uBAAuB,KAAK,qBAAqB;AAAA,QAC/D,WAAW,eAAe,SAAS,GAAG;AACpC,gBAAM,MAAM,sBAAsB,KAAK,OAAO,QAAQ,gBAAgB,uBAAuB,KAAK,SAAS;AAC3G,cAAI,IAAK,QAAO,KAAK,GAAG;AAAA,QAC1B;AACA,cAAM,uBAAuB;AAAA,UAC3B,KAAK,eACL,KAAK,kBAAkB,aACvB,KAAK,kBAAkB;AAAA,QACzB;AACA,aAAK,CAAC,KAAK,YAAY,KAAK,SAAS,WAAW,MAAM,CAAC,sBAAsB;AAC3E,iBAAO,KAAK,uBAAuB,KAAK,sCAAsC;AAAA,QAChF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,OAAO,aAAa,SAAS;AAC/B,QAAI,CAAC,OAAO,YAAY,cAAc;AACpC,aAAO,KAAK,kEAAkE;AAAA,IAChF,WAAW,eAAe,SAAS,GAAG;AACpC,YAAM,MAAM,sBAAsB,OAAO,YAAY,cAAc,QAAQ,gBAAgB,0BAA0B;AACrH,UAAI,IAAK,QAAO,KAAK,GAAG;AAAA,IAC1B;AACA,QAAI,CAAC,OAAO,YAAY,cAAc,OAAO,YAAY,WAAW,SAAS,GAAG;AAC9E,aAAO,KAAK,iFAAiF;AAAA,IAC/F,OAAO;AACL,aAAO,YAAY,WAAW,QAAQ,CAAC,WAAW,UAAU;AAC1D,YAAI,CAAC,UAAU,OAAO;AACpB,iBAAO,KAAK,0BAA0B,KAAK,qBAAqB;AAAA,QAClE,WAAW,eAAe,SAAS,GAAG;AACpC,gBAAM,MAAM,sBAAsB,UAAU,OAAO,QAAQ,gBAAgB,0BAA0B,KAAK,SAAS;AACnH,cAAI,IAAK,QAAO,KAAK,GAAG;AAAA,QAC1B;AACA,YAAI,CAAC,UAAU,aAAa;AAC1B,iBAAO,KAAK,0BAA0B,KAAK,2BAA2B;AAAA,QACxE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,OAAO,YAAY,SAAS;AAC9B,UAAM,SAAS,OAAO,WAAW;AACjC,QAAI,QAAQ,SAAS;AACnB,WAAK,OAAO,kBAAkB,MAAM,GAAG;AACrC,eAAO,KAAK,wFAAwF;AAAA,MACtG;AACA,YAAM,YAAY,OAAO;AACzB,UAAI,cAAc,WAAc,YAAY,KAAK,YAAY,IAAI;AAC/D,eAAO,KAAK,4EAA4E;AAAA,MAC1F;AACA,UAAI,OAAO,WAAW,SAAS;AAC7B,YAAI,CAAC,OAAO,UAAU,kBAAkB;AACtC,iBAAO,KAAK,oFAAoF;AAAA,QAClG,WAAW,CAAC,sBAAsB,QAAsB,OAAO,UAAU,gBAAgB,GAAG;AAC1F,gBAAM,MAAM;AAAA,YACV,OAAO,UAAU;AAAA,YACjB;AAAA,YACA;AAAA,UACF;AACA,cAAI,IAAK,QAAO,KAAK,GAAG;AAAA,QAC1B;AACA,aAAK,OAAO,UAAU,sBAAsB,MAAM,GAAG;AACnD,iBAAO,KAAK,iGAAiG;AAAA,QAC/G;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,WAAW;AAClC,QAAI,SAAS,SAAS;AACpB,WAAK,QAAQ,gBAAgB,KAAK,GAAG;AACnC,eAAO,KAAK,4EAA4E;AAAA,MAC1F;AACA,cAAQ,QAAQ,QAAQ,CAAC,OAAO,UAAU;AACxC,YAAI,CAAC,MAAM,MAAM;AACf,iBAAO,KAAK,6BAA6B,KAAK,oBAAoB;AAAA,QACpE,WAAW,CAAC,sBAAsB,QAAsB,MAAM,IAAI,GAAG;AACnE,gBAAM,MAAM,iBAAiB,MAAM,MAAM,gBAAgB,6BAA6B,KAAK,QAAQ;AACnG,cAAI,IAAK,QAAO,KAAK,GAAG;AAAA,QAC1B;AACA,YAAI,CAAC,MAAM,IAAI;AACb,iBAAO,KAAK,6BAA6B,KAAK,kBAAkB;AAAA,QAClE,WAAW,CAAC,sBAAsB,QAAsB,MAAM,EAAE,GAAG;AACjE,gBAAM,MAAM,iBAAiB,MAAM,IAAI,gBAAgB,6BAA6B,KAAK,MAAM;AAC/F,cAAI,IAAK,QAAO,KAAK,GAAG;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,OAAO,WAAW;AACnC,QAAI,UAAU,SAAS;AACrB,YAAM,YAAY,SAAS;AAC3B,UAAI,cAAc,WAAc,YAAY,KAAK,YAAY,IAAI;AAC/D,eAAO,KAAK,uDAAuD;AAAA,MACrE;AACA,UAAI,SAAS,QAAQ,CAAC,CAAC,aAAa,YAAY,EAAE,SAAS,SAAS,IAAI,GAAG;AACzE,eAAO,KAAK,qEAAqE;AAAA,MACnF;AACA,UAAI,SAAS,SAAS,cAAc;AAClC,YAAI,CAAC,SAAS,kBAAkB;AAC9B,iBAAO,KAAK,qFAAqF;AAAA,QACnG,WAAW,CAAC,sBAAsB,QAAsB,SAAS,gBAAgB,GAAG;AAClF,gBAAM,MAAM,iBAAiB,SAAS,kBAAkB,gBAAgB,sCAAsC;AAC9G,cAAI,IAAK,QAAO,KAAK,GAAG;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,WAAW;AACjC,QAAI,QAAQ,SAAS;AACnB,YAAM,aAAa,OAAO;AAC1B,UAAI,eAAe,WAAc,aAAa,KAAK,aAAa,IAAI;AAClE,eAAO,KAAK,uDAAuD;AAAA,MACrE;AACA,UAAI,OAAO,QAAQ,CAAC,CAAC,eAAe,YAAY,EAAE,SAAS,OAAO,IAAI,GAAG;AACvE,eAAO,KAAK,qEAAqE;AAAA,MACnF;AACA,UAAI,OAAO,kBAAkB,CAAC,sBAAsB,QAAsB,OAAO,cAAc,GAAG;AAChG,cAAM,MAAM,iBAAiB,OAAO,gBAAgB,gBAAgB,kCAAkC;AACtG,YAAI,IAAK,QAAO,KAAK,GAAG;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,oBAAoB,OAAO,WAAW,eAAe;AAC3D,QAAI,mBAAmB;AACrB,YAAM,aAAkD;AAAA,QACtD,CAAC,kBAAkB,mBAAmB,+DAA+D;AAAA,QACrG,CAAC,kBAAkB,uBAAuB,mEAAmE;AAAA,QAC7G,CAAC,kBAAkB,kBAAkB,8DAA8D;AAAA,QACnG,CAAC,kBAAkB,sBAAsB,kEAAkE;AAAA,QAC3G,CAAC,kBAAkB,iBAAiB,6DAA6D;AAAA,QACjG,CAAC,kBAAkB,kBAAkB,8DAA8D;AAAA,MACrG;AACA,iBAAW,CAAC,OAAO,KAAK,KAAK,YAAY;AACvC,YAAI,UAAU,WAAc,QAAQ,KAAK,QAAQ,IAAI;AACnD,iBAAO,KAAK,GAAG,KAAK,0BAA0B;AAAA,QAChD;AAAA,MACF;AAEA,YAAM,gBAAgB,kBAAkB;AACxC,UAAI,kBAAkB,UAAa,gBAAgB,GAAG;AACpD,eAAO,KAAK,gFAAgF;AAAA,MAC9F;AAEA,YAAM,gBAAgB,kBAAkB;AACxC,YAAM,oBAAoB,kBAAkB;AAC5C,UAAI,kBAAkB,UAAa,gBAAgB,GAAG;AACpD,eAAO,KAAK,oFAAoF;AAAA,MAClG;AACA,UAAI,sBAAsB,UAAa,oBAAoB,GAAG;AAC5D,eAAO,KAAK,wFAAwF;AAAA,MACtG;AACA,UACE,kBAAkB,sBAAsB,UACxC,kBAAkB,0BAA0B,UAC5C,kBAAkB,oBAAoB,kBAAkB,uBACxD;AACA,eAAO,KAAK,mHAAmH;AAAA,MACjI;AACA,UACE,kBAAkB,qBAAqB,UACvC,kBAAkB,yBAAyB,UAC3C,kBAAkB,mBAAmB,kBAAkB,sBACvD;AACA,eAAO,KAAK,iHAAiH;AAAA,MAC/H;AACA,UACE,kBAAkB,UAClB,sBAAsB,UACtB,gBAAgB,mBAChB;AACA,eAAO,KAAK,+GAA+G;AAAA,MAC7H;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,QAAkD;AACrF,QAAM,SAAS,OAAO,QAAQ;AAC9B,QAAM,WAAW,OAAO,QAAQ;AAChC,QAAM,WAAW,OAAO,QAAQ;AAChC,QAAM,wBAAwB;AAAA,IAC3B,MAAM,QAAQ,MAAM,KAAK,OAAO,UACjC,YACA;AAAA,EACF;AAEA,MAAI,CAAC,uBAAuB;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,aAAkC;AAAA,IACtC,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAI,OAAO,UAAU,CAAC;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC9C,UAAM,4BAA4B,UAAU,UAAU;AACtD,eAAW,gBAAgB;AAAA,MACzB,GAAI,OAAO,iBAAiB;AAAA,MAC5B,SAAS;AAAA,MACT,OAAO,OAAO,IAAI,CAAC,WAAW;AAAA,QAC5B,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM,YAAY;AAAA,QAC5B,SAAS,MAAM,WAAW;AAAA,QAC1B,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,kBAAkB,MAAM,OAAO,YAAY,MAAM,OAAO,mBACpD;AAAA,UACE,SAAS,MAAM,OAAO,YAAY;AAAA,UAClC,WAAW,MAAM,OAAO,kBAAkB;AAAA,UAC1C,WAAW,MAAM,OAAO,kBAAkB;AAAA,QAC5C,IACA;AAAA,QACJ,UAAU;AAAA,UACR,GAAI,MAAM,QAAQ,MAAM,OAAO,QAAQ,KAAK,MAAM,OAAO,SAAS,SAC9D,CAAC;AAAA,YACC,MAAM;AAAA,YACN,UAAU,MAAM,OAAO;AAAA,UACzB,CAAC,IACD,CAAC;AAAA,UACL,GAAI,OAAO,MAAM,OAAO,UAAU,YAAY,MAAM,MAAM,MAAM,KAAK,EAAE,SACnE,CAAC;AAAA,YACC,MAAM;AAAA,YACN,SAAS,MAAM,MAAM;AAAA,UACvB,CAAC,IACD,CAAC;AAAA,QACP;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,UAAM,qBAAqB,OAAO;AAAA,MAChC,OACG,OAAO,CAAC,UAAU,MAAM,OAAO,YAAY,MAAM,OAAO,kBAAkB,aAAa,MAAM,WAAW,EACxG,IAAI,CAAC,UAAU;AAAA,QACd,MAAM;AAAA,QACN,MAAM,OAAO,kBAAkB,aAAa,MAAM,eAAe;AAAA,MACnE,CAAC,EACA,OAAO,CAAC,CAAC,EAAE,SAAS,MAAM,OAAO,cAAc,YAAY,UAAU,KAAK,EAAE,SAAS,CAAC;AAAA,IAC3F;AAEA,QAAI,OAAO,KAAK,kBAAkB,EAAE,SAAS,KAAK,UAAU,UAAU;AACpE,iBAAW,aAAa;AAAA,QACtB,GAAI,OAAO,cAAc;AAAA,QACzB,SAAS,OAAO,YAAY,YAC1B,8BAA8B,SAC1B,4BACA,OAAO,KAAK,kBAAkB,EAAE,SAAS;AAAA,QAE/C,UAAU;AAAA,UACR,GAAK,OAAO,YAAY,YAAY,CAAC;AAAA,UACrC,GAAI,UAAU,YAAY,CAAC;AAAA,UAC3B,SAAS,UAAU,UAAU,WAAW;AAAA,UACxC,YAAY;AAAA,YACV,GAAI,OAAO,YAAY,UAAU,cAAc,CAAC;AAAA,YAChD,GAAG;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,eAAW,cAAc;AAAA,MACvB,GAAI,OAAO,eAAe;AAAA,MAC1B,SAAS,SAAS,kBAAkB;AAAA,MACpC,cAAc,SAAS,gBAAgB,OAAO,aAAa,gBAAgB;AAAA,MAC3E,YAAY,SAAS,cAAc,OAAO,aAAa,cAAc,CAAC;AAAA,MACtE,WAAW,SAAS,aAAa,OAAO,aAAa;AAAA,MACrD,YAAY,SAAS,cAAc,OAAO,aAAa;AAAA,MACvD,UAAU,SAAS,YAAY,OAAO,aAAa;AAAA,MACnD,aAAa,SAAS,eAAe,OAAO,aAAa;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,UAAU,UAAU,UAAU,UAAU;AAC1C,eAAW,aAAa;AAAA,MACtB,GAAI,WAAW,cAAc,OAAO,cAAc;AAAA,MAClD,SAAS,OAAO,YAAY,WAAW;AAAA,QACrC,UAAU,QAAQ,WAClB,UAAU,UAAU,WACpB,WAAW,YAAY,UAAU;AAAA,MACnC;AAAA,MACA,QAAQ,UAAU,SACd;AAAA,QACE,GAAK,OAAO,YAAY,UAAU,CAAC;AAAA,QACnC,GAAG,SAAS;AAAA,MACd,IACA,OAAO,YAAY;AAAA,MACvB,UAAU,UAAU,WAChB;AAAA,QACE,GAAK,WAAW,YAAY,YAAY,OAAO,YAAY,YAAY,CAAC;AAAA,QACxE,GAAG,SAAS;AAAA,MACd,IACA,WAAW,YAAY,YAAY,OAAO,YAAY;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,SAA8B,CAAC,GAIxE;AACA,QAAM,kBAAkB,4BAA4B,MAAM;AAC1D,QAAM,mBAAmB;AAAA,IACvB;AAAA,MACE,GAAGC;AAAA,MACH,QAAQ;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,WAAW,CAAC;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,MAAI,gBAAgB,eAAe;AACjC,qBAAiB,gBAAgB,UAAU,wBAAwB,gBAAgB,aAAa;AAAA,EAClG;AAEA,MAAI,gBAAgB,YAAY;AAC9B,qBAAiB,aAAa,UAAU,2BAA2B,gBAAgB,UAAU;AAAA,EAC/F;AAEA,MAAI,gBAAgB,QAAQ;AAC1B,qBAAiB,SAAS,gBAAgB,OAAO,IAAI,CAAC,SAAS,6BAA6B,IAAI,CAAC;AAAA,EACnG;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,eAAe,gBAAgB;AAAA,IACvC,UAAU,0BAA0B,gBAAgB,EAAE,QAAQ,IAAI,CAAC,UAAU,MAAM,OAAO;AAAA,EAC5F;AACF;AAKA,eAAsB,aAAkC;AACtD,QAAM,QAAQ;AAGd,MAAI,SAAqC;AAGzC,WAAS,MAAM,eAAe,WAAW;AAGzC,MAAI,CAAC,QAAQ;AACX,aAAS,MAAM,eAAe,eAAe;AAAA,EAC/C;AAGA,MAAI,CAAC,QAAQ;AACX,aAAS,MAAM,eAAe,gBAAgB;AAAA,EAChD;AAGA,MAAI,CAAC,QAAQ;AACX,UAAM,UAAU,SAAI,OAAO,EAAE;AAC7B,YAAQ,MAAM;AAAA,EAAK,OAAO,EAAE;AAC5B,YAAQ,MAAM,8CAAoC;AAClD,YAAQ,MAAM,OAAO;AACrB,YAAQ,MAAM,eAAe,WAAW,EAAE;AAC1C,YAAQ,MAAM,kDAAkD;AAChE,YAAQ,MAAM,GAAG,OAAO;AAAA,CAAI;AAC5B,aAAS,CAAC;AAAA,EACZ;AAEA,QAAM,SAAS,2BAA2B,MAAM;AAEhD,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,UAAU,SAAI,OAAO,EAAE;AAC7B,YAAQ,MAAM;AAAA,EAAK,OAAO,EAAE;AAC5B,YAAQ,MAAM,+BAA0B;AACxC,YAAQ,MAAM,OAAO;AACrB,YAAQ,MAAM,0DAA0D;AACxE,WAAO,OAAO,QAAQ,CAAC,KAAK,MAAM,QAAQ,MAAM,KAAK,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;AACrE,YAAQ,MAAM;AAAA,iBAAoB,WAAW,EAAE;AAC/C,YAAQ,MAAM,2DAA2D;AACzE,YAAQ,MAAM,mFAAmF;AACjG,YAAQ,MAAM,GAAG,OAAO;AAAA,CAAI;AAC5B,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,WAAO,SAAS,QAAQ,CAAC,YAAY,QAAQ,mBAAmB,OAAO,EAAE,CAAC;AAAA,EAC5E;AAEA,SAAO,OAAO;AAChB;AAKA,eAAsB,iBAAsC;AAC1D,SAAO,WAAW;AACpB;AAOA,eAAsB,gBAAgB,QAAmC;AACvE,QAAM,QAAQ;AAGd,QAAM,cAAU,sBAAW,WAAW;AACtC,QAAM,aAAS,sBAAW,eAAe;AACzC,QAAM,cAAU,sBAAW,gBAAgB;AAC3C,QAAM,UAAU,CAAC,WAAW,CAAC,UAAU;AAGvC,QAAM,aAAa,UAAU,mBAAoB,UAAU,CAAC,UAAU,kBAAkB;AAExF,MAAI;AACJ,QAAM,iBAAiB;AAAA,IACrB,GAAG;AAAA,IACH,QAAQ,OAAO,QAAQ,IAAI,CAAC,SAAS,sBAAsB,IAAI,CAAC;AAAA,EAClE;AAEA,MAAI,SAAS;AACX,cAAU,KAAK,UAAU,gBAAgB,MAAM,CAAC;AAAA,EAClD,OAAO;AACL,cAAe,UAAK,gBAAgB;AAAA,MAClC,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,YAAM,2BAAU,YAAY,SAAS,OAAO;AAC9C;AAKA,eAAsB,mBAA2C;AAC/D,QAAM,iBAAa,sBAAW,WAAW,IAAI,kBAC1B,sBAAW,eAAe,IAAI,sBAC9B,sBAAW,gBAAgB,IAAI,mBAAmB;AAErE,MAAI,CAAC,cAAc,KAAC,sBAAW,UAAU,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,iBAAa,mBAAK,YAAY,iBAAiB,SAAS,OAAO;AAErE,MAAI;AACF,UAAM,UAAU,UAAM,0BAAS,YAAY,OAAO;AAClD,cAAM,2BAAU,YAAY,SAAS,OAAO;AAC5C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,aAAS,iCAAiC,KAAK;AAC/C,WAAO;AAAA,EACT;AACF;AAjuBA,IAMA,WACA,iBACAC,cACA;AATA;AAAA;AAAA;AAMA,gBAAsC;AACtC,sBAAoC;AACpC,IAAAA,eAAqB;AACrB,WAAsB;AACtB;AAYA;AACA;AACA;AAAA;AAAA;;;ACxBA;AAAA;AAAA;AAMA;AACA;AAAA;AAAA;;;ACFO,SAAS,wBAAwB,SAA2B;AACjE,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AAKf,SAAO,OAAO,YAAY,gBAAgB,OAAO,UAAU;AAC7D;AAEA,eAAsB,mBAAmB,MAAc,YAAY,KAAuB;AACxF,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,oBAAoB,IAAI,GAAG,mBAAmB,IAAI;AAAA,MACxE,QAAQ,YAAY,QAAQ,SAAS;AAAA,IACvC,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,aAAO;AAAA,IACT;AAEA,WAAO,wBAAwB,MAAM,IAAI,KAAK,CAAC;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBAAkB,MAAc,YAAY,KAAuB;AACvF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,SAAS,IAAI,kBAAO;AAC1B,QAAI,UAAU;AAEd,UAAM,SAAS,CAAC,UAAmB;AACjC,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,aAAO,QAAQ;AACf,cAAQ,KAAK;AAAA,IACf;AAEA,WAAO,WAAW,SAAS;AAC3B,WAAO,KAAK,WAAW,MAAM,OAAO,IAAI,CAAC;AACzC,WAAO,KAAK,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1C,WAAO,KAAK,SAAS,CAAC,UAAiC;AACrD,UAAI,MAAM,SAAS,gBAAgB;AACjC,eAAO,KAAK;AACZ;AAAA,MACF;AACA,aAAO,KAAK;AAAA,IACd,CAAC;AAED,WAAO,QAAQ,MAAM,WAAW;AAAA,EAClC,CAAC;AACH;AAEA,eAAsB,eAAe,MAAc,YAAY,KAAwB;AACrF,QAAM,QAAQ,KAAK,IAAI;AACvB,SAAO,KAAK,IAAI,IAAI,QAAQ,WAAW;AACrC,QAAI,MAAM,mBAAmB,MAAM,GAAG,GAAG;AACvC,aAAO;AAAA,IACT;AACA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,EACzD;AACA,SAAO;AACT;AAxEA,gBAEa,cACA;AAHb;AAAA;AAAA;AAAA,iBAAuB;AAEhB,IAAM,eAAe;AACrB,IAAM,sBAAsB;AAAA;AAAA;;;ACHnC;AAAA;AAAA;AAAA;AAAA;;;ACyUO,SAAS,sBACdC,SAAmC,CAAC,GAClB;AAClB,SAAO;AAAA,IACL,WAAWA,OAAM,iBAAa,0BAAW;AAAA,IACzC,YAAYA,OAAM;AAAA,IAClB,cAAcA,OAAM;AAAA,IACpB,YAAYA,OAAM;AAAA,IAClB,aAAaA,OAAM,cAAc,CAAC,GAAGA,OAAM,WAAW,IAAI,CAAC;AAAA,IAC3D,WAAWA,OAAM,aAAa;AAAA,IAC9B,eAAeA,OAAM,iBAAiB;AAAA,IACtC,gBAAgBA,OAAM;AAAA,IACtB,kBAAkBA,OAAM,oBAAoB;AAAA,IAC5C,iBAAiBA,OAAM,kBAAkB,CAAC,GAAGA,OAAM,eAAe,IAAI,CAAC;AAAA,IACvE,kBAAkBA,OAAM;AAAA,IACxB,eAAeA,OAAM,iBAAiB;AAAA,IACtC,oBAAoBA,OAAM;AAAA,IAC1B,WAAWA,OAAM;AAAA,IACjB,eAAeA,OAAM;AAAA,IACrB,WAAWA,OAAM,aAAa,KAAK,IAAI;AAAA,IACvC,aAAaA,OAAM;AAAA,EACrB;AACF;AAEO,SAAS,kBAAkB,OAAyB,QAAkC;AAC3F,MAAI,CAAC,MAAM,YAAY,SAAS,MAAM,GAAG;AACvC,UAAM,YAAY,KAAK,MAAM;AAAA,EAC/B;AACA,SAAO;AACT;AAEO,SAAS,cACd,OACA,YAAuC,CAAC,GACtB;AAClB,QAAM,cAAc,UAAU,eAAe,KAAK,IAAI;AACtD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,aAAa,UAAU,cAAc,CAAC,GAAG,UAAU,WAAW,IAAI,CAAC,GAAG,MAAM,WAAW;AAAA,IACvF;AAAA,IACA,WAAW,UAAU,aAAa,KAAK,IAAI,GAAG,cAAc,MAAM,SAAS;AAAA,EAC7E;AACF;AAEO,SAAS,sBAAsB,OAA2C;AAC/E,uBAAqB,IAAI,KAAK;AAC9B,SAAO;AACT;AAzXA,IAMA,eACAC,YACA,kBACAC,cACA,aAwBa,sBAqSA;AAvUb;AAAA;AAAA;AAMA,oBAA2B;AAC3B,IAAAD,aAAwF;AACxF,uBAAyB;AACzB,IAAAC,eAA8B;AAC9B,kBAAqC;AACrC;AAuBO,IAAM,uBAAN,MAA2B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAER,YAAY,UAAwC,CAAC,GAAG;AACtD,cAAM,MAAM,QAAQ,OAAO;AAC3B,cAAM,QAAQ,QAAQ,SAAS,MAAO,KAAK;AAC3C,aAAK,QAAQ,IAAI,0BAAmC;AAAA,UAClD;AAAA,UACA,KAAK;AAAA,QACP,CAAC;AACD,aAAK,cAAc,QAAQ,eAAe;AAC1C,aAAK,iBAAiB,QAAQ,kBAAkB,QAAQ,IAAI,aAAa;AACzE,aAAK,qBAAqB,QAAQ,sBAAsB;AACxD,aAAK,aAAa,QAAQ,cAAc;AACxC,aAAK,qBAAqB,QAAQ,sBAAsB;AACxD,aAAK,mBAAmB,QAAQ,oBAAoB;AACpD,aAAK,aAAa;AAAA,MACpB;AAAA,MAEA,IAAI,OAA+B;AACjC,aAAK,MAAM,IAAI,MAAM,WAAW,EAAE,GAAG,OAAO,aAAa,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC;AACjF,aAAK,cAAc;AAAA,MACrB;AAAA,MAEA,IAAI,WAAiD;AACnD,eAAO,KAAK,MAAM,IAAI,SAAS;AAAA,MACjC;AAAA,MAEA,KAAK,SAOkB;AACrB,YAAI,SAAS,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,MAAM,EAAE,aAAa,EAAE;AAEnG,YAAI,SAAS,WAAW;AACtB,mBAAS,OAAO,OAAO,CAAC,UAAU,MAAM,cAAc,QAAQ,SAAS;AAAA,QACzE;AAEA,YAAI,SAAS,YAAY;AACvB,mBAAS,OAAO,OAAO,CAAC,UAAU,MAAM,eAAe,QAAQ,UAAU;AAAA,QAC3E;AAEA,YAAI,SAAS,aAAa;AACxB,mBAAS,OAAO,OAAO,CAAC,UAAU,MAAM,YAAY,SAAS,QAAQ,WAAY,CAAC;AAAA,QACpF;AAEA,YAAI,SAAS,qBAAqB,QAAW;AAC3C,mBAAS,OAAO,OAAO,CAAC,UAAU,MAAM,qBAAqB,QAAQ,gBAAgB;AAAA,QACvF;AAEA,YAAI,SAAS,kBAAkB,QAAW;AACxC,mBAAS,OAAO,OAAO,CAAC,UAAU,MAAM,kBAAkB,QAAQ,aAAa;AAAA,QACjF;AAEA,YAAI,SAAS,UAAU,UAAa,OAAO,SAAS,QAAQ,KAAK,KAAK,QAAQ,QAAQ,GAAG;AACvF,mBAAS,OAAO,MAAM,GAAG,QAAQ,KAAK;AAAA,QACxC;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,QAAc;AACZ,aAAK,MAAM,MAAM;AACjB,aAAK,cAAc;AACnB,aAAK,cAAc;AAAA,MACrB;AAAA,MAEA,QAAQ,QAAkC;AACxC,aAAK,MAAM,MAAM;AACjB,mBAAW,SAAS,QAAQ;AAC1B,eAAK,MAAM,IAAI,MAAM,WAAW,EAAE,GAAG,OAAO,aAAa,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC;AAAA,QACnF;AACA,aAAK,cAAc;AAAA,MACrB;AAAA,MAEA,aAAa,SAKuB;AAClC,YAAI,CAAC,KAAK,cAAc,KAAC,uBAAW,KAAK,UAAU,GAAG;AACpD,iBAAO,CAAC;AAAA,QACV;AAEA,YAAI,cAAU,wBAAY,KAAK,UAAU,EACtC,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,UAAU,CAAC,EACpE,KAAK,EACL,QAAQ,EACR,IAAI,CAAC,SAAS,KAAK,kBAAkB,IAAI,CAAC,EAC1C,OAAO,CAAC,WAAoD,QAAQ,MAAM,CAAC;AAE9E,YAAI,SAAS,MAAM;AACjB,oBAAU,QAAQ,OAAO,CAAC,WAAW;AACnC,kBAAM,UAAU,OAAO,YAAY,IAAI,KAAK,OAAO,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AAC3F,kBAAM,QAAQ,OAAO,UAAU,IAAI,KAAK,OAAO,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AACrF,mBAAO,YAAY,QAAQ,QAAQ,UAAU,QAAQ;AAAA,UACvD,CAAC;AAAA,QACH;AAEA,cAAM,WAAW,SAAS,YAAY,QAAQ,WAAW,IAAI,QAAQ,WAAW;AAChF,cAAM,OAAO,SAAS,QAAQ,QAAQ,OAAO,IAAI,QAAQ,OAAO;AAEhE,YAAI,UAAU;AACZ,gBAAM,SAAS,OAAO,KAAK;AAC3B,oBAAU,QAAQ,MAAM,OAAO,QAAQ,QAAQ;AAAA,QACjD,WAAW,SAAS,SAAS,QAAQ,QAAQ,GAAG;AAC9C,oBAAU,QAAQ,MAAM,GAAG,QAAQ,KAAK;AAAA,QAC1C;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,kBAAkB,MAAkC;AAClD,YAAI,CAAC,KAAK,YAAY;AACpB,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,eAAW,mBAAK,KAAK,YAAY,IAAI;AAC3C,YAAI,KAAC,uBAAW,QAAQ,GAAG;AACzB,iBAAO,CAAC;AAAA,QACV;AAEA,YAAI;AACF,iBAAO,KAAK,gBAAgB,QAAQ;AAAA,QACtC,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,MAEA,cAAc,MAAuB;AACnC,YAAI,CAAC,KAAK,YAAY;AACpB,iBAAO;AAAA,QACT;AAEA,cAAM,eAAW,mBAAK,KAAK,YAAY,IAAI;AAC3C,YAAI,KAAC,uBAAW,QAAQ,GAAG;AACzB,iBAAO;AAAA,QACT;AAEA,+BAAO,UAAU,EAAE,OAAO,KAAK,CAAC;AAChC,eAAO;AAAA,MACT;AAAA,MAEQ,eAAqB;AAC3B,YAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,aAAa;AAC7C;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,SAA6B,CAAC;AAEpC,kBAAI,uBAAW,KAAK,WAAW,GAAG;AAChC,kBAAM,cAAU,yBAAa,KAAK,aAAa,OAAO;AACtD,mBAAO,KAAK,GAAI,KAAK,MAAM,OAAO,CAAwB;AAAA,UAC5D;AAEA,cAAI,KAAK,kBAAc,uBAAW,KAAK,UAAU,GAAG;AAClD,kBAAM,mBAAe,wBAAY,KAAK,UAAU,EAC7C,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,UAAU,CAAC,EACpE,KAAK,EACL,QAAQ;AAEX,uBAAW,QAAQ,cAAc;AAC/B,qBAAO,KAAK,GAAG,KAAK,oBAAgB,mBAAK,KAAK,YAAY,IAAI,CAAC,CAAC;AAAA,YAClE;AAAA,UACF;AAEA,gBAAM,UAAU,oBAAI,IAA8B;AAClD,qBAAW,SAAS,OAAO,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,MAAM,EAAE,aAAa,EAAE,GAAG;AAClF,gBAAI,CAAC,QAAQ,IAAI,MAAM,SAAS,GAAG;AACjC,sBAAQ,IAAI,MAAM,WAAW,KAAK;AAAA,YACpC;AAAA,UACF;AAEA,qBAAW,SAAS,MAAM,KAAK,QAAQ,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG;AACzE,iBAAK,MAAM,IAAI,MAAM,WAAW,EAAE,GAAG,OAAO,aAAa,CAAC,GAAI,MAAM,eAAe,CAAC,CAAE,EAAE,CAAC;AAAA,UAC3F;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,MAEQ,gBAAsB;AAC5B,YAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,aAAa;AAC7C;AAAA,QACF;AAEA,YAAI;AACF,wCAAU,sBAAQ,KAAK,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,gBAAM,SAAS,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,MAAM,EAAE,aAAa,EAAE;AACrG,gBAAM,eAAe,OAAO,MAAM,GAAG,KAAK,kBAAkB;AAC5D,gBAAM,iBAAiB,OAAO,MAAM,KAAK,kBAAkB;AAE3D,cAAI,eAAe,SAAS,KAAK,KAAK,YAAY;AAChD,iBAAK,aAAa,cAAc;AAChC,iBAAK,cAAc;AACnB,iBAAK,MAAM,MAAM;AACjB,uBAAW,SAAS,cAAc;AAChC,mBAAK,MAAM,IAAI,MAAM,WAAW,EAAE,GAAG,OAAO,aAAa,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC;AAAA,YACnF;AAAA,UACF;AAEA,wCAAc,KAAK,aAAa,KAAK,UAAU,cAAc,MAAM,CAAC,GAAG,OAAO;AAAA,QAChF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,MAEQ,aAAa,QAAkC;AACrD,YAAI,CAAC,KAAK,cAAc,OAAO,WAAW,GAAG;AAC3C;AAAA,QACF;AAEA,kCAAU,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAC9C,cAAM,WAAW,KAAK,mBAClB,qBAAqB,KAAK,IAAI,CAAC,aAC/B,qBAAqB,KAAK,IAAI,CAAC;AACnC,cAAM,eAAW,mBAAK,KAAK,YAAY,QAAQ;AAC/C,cAAM,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC;AAC9C,YAAI,KAAK,kBAAkB;AACzB,wCAAc,cAAU,sBAAS,OAAO,KAAK,SAAS,OAAO,CAAC,CAAC;AAC/D;AAAA,QACF;AACA,sCAAc,UAAU,SAAS,OAAO;AAAA,MAC1C;AAAA,MAEQ,kBAAkB,MAAoD;AAC5E,YAAI,CAAC,KAAK,YAAY;AACpB,iBAAO;AAAA,QACT;AAEA,cAAM,eAAW,mBAAK,KAAK,YAAY,IAAI;AAC3C,YAAI;AACF,gBAAM,SAAS,KAAK,gBAAgB,QAAQ;AAC5C,gBAAM,kBAAkB,OAAO,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,OAAO,CAAC,UAAU,OAAO,UAAU,QAAQ;AAC1G,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA,YAAY,OAAO;AAAA,YACnB,WAAW,gBAAgB,SAAS,KAAK,IAAI,GAAG,eAAe,IAAI;AAAA,YACnE,SAAS,gBAAgB,SAAS,KAAK,IAAI,GAAG,eAAe,IAAI;AAAA,YACjE,YAAY,KAAK,SAAS,KAAK;AAAA,UACjC;AAAA,QACF,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEQ,gBAAsB;AAC5B,YAAI,CAAC,KAAK,cAAc,KAAC,uBAAW,KAAK,UAAU,GAAG;AACpD;AAAA,QACF;AAEA,cAAM,mBAAe,wBAAY,KAAK,UAAU,EAC7C,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,UAAU,CAAC,EACpE,KAAK,EACL,QAAQ;AAEX,mBAAW,QAAQ,aAAa,MAAM,KAAK,kBAAkB,GAAG;AAC9D,qCAAO,mBAAK,KAAK,YAAY,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,MAEQ,gBAAsB;AAC5B,YAAI,CAAC,KAAK,cAAc,KAAC,uBAAW,KAAK,UAAU,GAAG;AACpD;AAAA,QACF;AAEA,mBAAW,YAAQ,wBAAY,KAAK,UAAU,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,UAAU,CAAC,GAAG;AACrH,qCAAO,mBAAK,KAAK,YAAY,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,MAEQ,gBAAgB,UAAsC;AAC5D,YAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,gBAAM,cAAU,4BAAW,yBAAa,QAAQ,CAAC,EAAE,SAAS,OAAO;AACnE,iBAAO,KAAK,MAAM,OAAO;AAAA,QAC3B;AACA,eAAO,KAAK,UAAM,yBAAa,UAAU,OAAO,CAAC;AAAA,MACnD;AAAA,IACF;AAEO,IAAM,uBAAuB,IAAI,qBAAqB;AAAA;AAAA;;;ACjStD,SAAS,sBAAsB,MAA8C;AAClF,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,aAAa,KAChB,KAAK,EACL,YAAY,EACZ,QAAQ,QAAQ,GAAG;AAEtB,SAAO,cAAc;AACvB;AA9CA,IAMAC,mBAGa,mBAuCA;AAhDb;AAAA;AAAA;AAMA,IAAAA,oBAAyB;AAGlB,IAAM,oBAAN,MAAwB;AAAA,MACrB;AAAA,MAER,YAAY,QAAQ,MAAO,KAAK,IAAI;AAClC,aAAK,QAAQ,IAAI,2BAAgC;AAAA,UAC/C,KAAK;AAAA,UACL,KAAK;AAAA,QACP,CAAC;AAAA,MACH;AAAA,MAEA,IAAI,YAA2D;AAC7D,YAAI,CAAC,WAAY,QAAO;AACxB,eAAO,KAAK,MAAM,IAAI,UAAU;AAAA,MAClC;AAAA,MAEA,IAAI,YAAgC,OAA8D;AAChG,YAAI,CAAC,WAAY;AACjB,aAAK,MAAM,IAAI,YAAY;AAAA,UACzB;AAAA,UACA,GAAG;AAAA,UACH,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,MAEA,QAAc;AACZ,aAAK,MAAM,MAAM;AAAA,MACnB;AAAA,IACF;AAYO,IAAM,oBAAoB,IAAI,kBAAkB;AAAA;AAAA;;;ACvBvD,SAAS,WAAW,MAA8B;AAChD,SAAO,EAAE,MAAM,QAAQ,KAAK;AAC9B;AAEA,SAAS,sBAAsB,SAAgC;AAC7D,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,CAAC,WAAW,OAAO,CAAC;AAAA,EAC7B;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,QAAQ,QAAQ,CAAC,SAAS;AAC/B,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,aAAO,CAAC;AAAA,IACV;AAEA,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO,OAAO,KAAK,SAAS,WAAW,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC;AAAA,MAChF,KAAK;AAAA,MACL,KAAK;AACH,eAAO,CAAC;AAAA,UACN,MAAM;AAAA,UACN,QAAQ,KAAK,WACP,KAAK,YACL;AAAA,YACE,GAAG,KAAK;AAAA,YACR,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,UAC3D,IACA,KAAK;AAAA,QACb,CAAC;AAAA,MACH,KAAK;AACH,eAAO,KAAK,MAAM,KAAK,OACnB,CAAC,EAAE,MAAM,aAAa,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,WAAW,KAAK,UAAU,KAAK,SAAS,CAAC,CAAC,EAAE,CAAC,IACjG,CAAC;AAAA,MACP,KAAK;AACH,eAAO,KAAK,cACR,CAAC,EAAE,MAAM,eAAe,cAAc,KAAK,aAAa,SAAS,KAAK,QAAQ,CAAC,IAC/E,CAAC;AAAA,MACP;AACE,eAAO,CAAC;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AAEA,SAAS,yBAAyB,WAAkC;AAClE,MAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,UAAU,QAAQ,CAAC,aAAa;AACrC,UAAM,KAAK,UAAU;AACrB,UAAM,OAAO,UAAU,UAAU;AACjC,UAAM,OAAO,UAAU,UAAU;AACjC,QAAI,CAAC,MAAM,CAAC,MAAM;AAChB,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,CAAC;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,WAAW,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,QAAQ,CAAC,CAAC;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,gBAAgBC,QAIjB;AACb,QAAM,SAAS,OAAOA,OAAM,WAAW,WACnC,CAACA,OAAM,MAAM,IACb,MAAM,QAAQA,OAAM,MAAM,IACxBA,OAAM,OAAO;AAAA,IAAQ,CAAC,SACpB,OAAO,SAAS,WACZ,CAAC,IAAI,IACL,MAAM,SAAS,UAAU,OAAO,KAAK,SAAS,WAC5C,CAAC,KAAK,IAAI,IACV,CAAC;AAAA,EACT,IACA,CAAC;AAEP,QAAM,WAAW,MAAM,QAAQA,OAAM,QAAQ,IACzCA,OAAM,SACH,OAAO,CAAC,SAAS,MAAM,IAAI,EAC3B,QAAQ,CAAC,SAAS;AACjB,QAAI,KAAK,SAAS,UAAU;AAC1B,YAAM,cAAc,OAAO,KAAK,YAAY,WACxC,CAAC,KAAK,OAAO,IACb,sBAAsB,KAAK,OAAO,EAC/B,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAS,KAAK,IAAI;AAC9B,aAAO,KAAK,GAAG,WAAW;AAC1B,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,KAAK,SAAS,UAAU,KAAK,cAAc;AAC7C,aAAO,CAAC;AAAA,QACN,MAAM;AAAA,QACN,OAAO,CAAC;AAAA,UACN,MAAM;AAAA,UACN,cAAc,KAAK;AAAA,UACnB,SAAS,KAAK;AAAA,QAChB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ;AAAA,MACZ,GAAG,sBAAsB,KAAK,OAAO;AAAA,MACrC,GAAI,KAAK,SAAS,cAAc,yBAAyB,KAAK,UAAU,IAAI,CAAC;AAAA,IAC/E;AAEA,WAAO,CAAC;AAAA,MACN,MAAM,KAAK;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH,CAAC,IACH,CAAC;AAEL,QAAM,WAAWA,OAAM,WACnB;AAAA,IACE,SAASA,OAAM,UAAU,SAAS,aAAaA,OAAM,UAAU,YAAY;AAAA,IAC3E,QAAQA,OAAM,UAAU;AAAA,IACxB,eAAeA,OAAM,UAAU;AAAA,EACjC,IACA;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,WAAW,EAAE,SAAS,IAAI;AAAA,EACrC;AACF;AAEO,SAAS,uBAAuB,QAAgB,SAA6C;AAClG,SAAO;AAAA,IACL,QAAQ,CAAC;AAAA,IACT,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,OAAO,CAAC,WAAW,MAAM,CAAC;AAAA,MAC5B;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AA9KA;AAAA;AAAA;AAAA;AAAA;;;ACEA,SAAS,mBAAmB,OAAgD;AAC1E,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,MACzC,KAAK;AACH,eAAO,EAAE,MAAM,SAAS,QAAQ,KAAK,OAAO;AAAA,MAC9C,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,MAAM,KAAK;AAAA,UACX,OAAO,KAAK,MAAM,KAAK,aAAa,IAAI;AAAA,QAC1C;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa,KAAK;AAAA,UAClB,SAAS,KAAK;AAAA,QAChB;AAAA,MACF;AACE,eAAO,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,IACpC;AAAA,EACF,CAAC;AACH;AAEO,SAAS,2BAA2BC,QAQxC;AACD,QAAM,OAA4B;AAAA,IAChC,OAAOA,OAAM;AAAA,IACb,UAAUA,OAAM,GAAG,SAAS,IAAI,CAAC,aAAa;AAAA,MAC5C,MAAM,QAAQ;AAAA,MACd,SAAS,mBAAmB,QAAQ,KAAK;AAAA,IAC3C,EAAE;AAAA,EACJ;AAEA,MAAIA,OAAM,eAAe,QAAW;AAClC,SAAK,aAAaA,OAAM;AAAA,EAC1B;AAEA,MAAIA,OAAM,WAAW,QAAW;AAC9B,SAAK,SAASA,OAAM;AAAA,EACtB;AAEA,MAAIA,OAAM,UAAU;AAClB,SAAK,WAAWA,OAAM;AAAA,EACxB;AAEA,MAAIA,OAAM,OAAO;AACf,SAAK,QAAQA,OAAM,MAAM,IAAI,CAAC,UAAU;AAAA,MACtC,MAAM,MAAM,QAAQ,MAAM,UAAU;AAAA,MACpC,aAAa,MAAM,eAAe,MAAM,UAAU;AAAA,MAClD,cAAc,MAAM,gBAAgB,MAAM,UAAU;AAAA,IACtD,EAAE;AAAA,EACJ;AAEA,MAAIA,OAAM,aAAa;AACrB,QAAI,OAAOA,OAAM,gBAAgB,UAAU;AACzC,WAAK,cAAcA,OAAM;AAAA,IAC3B,WAAWA,OAAM,aAAa,SAAS,UAAUA,OAAM,aAAa,MAAM;AACxE,WAAK,cAAc;AAAA,QACjB,MAAM;AAAA,QACN,MAAMA,OAAM,YAAY;AAAA,MAC1B;AAAA,IACF,WAAWA,OAAM,aAAa,SAAS,cAAcA,OAAM,aAAa,UAAU,MAAM;AACtF,WAAK,cAAc;AAAA,QACjB,MAAM;AAAA,QACN,MAAMA,OAAM,YAAY,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,MAAIA,OAAM,GAAG,OAAO,QAAQ;AAC1B,SAAK,SAASA,OAAM,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,KAAK,EAAE;AAAA,EACtE;AAEA,MAAIA,OAAM,GAAG,SAAS,UAAU,SAAS;AACvC,SAAK,WAAW;AAAA,MACd,MAAM;AAAA,MACN,GAAIA,OAAM,GAAG,QAAQ,SAAS,SAAS,EAAE,QAAQA,OAAM,GAAG,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,MACvF,GAAIA,OAAM,GAAG,QAAQ,SAAS,gBAAgB,EAAE,eAAeA,OAAM,GAAG,QAAQ,SAAS,cAAc,IAAI,CAAC;AAAA,IAC9G;AAAA,EACF;AAEA,SAAO;AACT;AA9FA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAYM,0BAsBO,yBAyFA;AA3Hb;AAAA;AAAA;AAOA;AACA;AACA;AACA;AAEA,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsB1B,IAAM,0BAAN,MAA8B;AAAA,MAC3B,YAAY,MAAc,eAAuB,WAA2B;AAClF,eAAO,yBACJ,QAAQ,mBAAmB,aAAa,EACxC,QAAQ,eAAe,SAAS,EAChC,QAAQ,aAAa,IAAI;AAAA,MAC9B;AAAA,MAEA,MAAM,oBACJ,MACA,eACA,WACA,QACA,OAAeC,gBAAe,MAC9B,SACA,QACA,WACwB;AACxB,YAAI,CAAC,OAAO,WAAW,CAAC,OAAO,oBAAoB,CAAC,KAAK,KAAK,GAAG;AAC/D,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,YAAY,WAAW;AAC7B,gBAAM,WAAW,MAAM,UAAU,oBAAoB,IAAI,gBAAgB;AAAA,YACvE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,GAAI,SAAS,EAAE,aAAa,OAAO,IAAI,CAAC;AAAA,YAC1C;AAAA,YACA,MAAM,KAAK;AAAA,cACT,2BAA2B;AAAA,gBACzB,OAAO,OAAO;AAAA,gBACd,YAAY,OAAO,sBAAsB;AAAA,gBACzC,IAAI,uBAAuB,KAAK,YAAY,MAAM,eAAe,SAAS,CAAC;AAAA,cAC7E,CAAC;AAAA,YACH;AAAA,YACA,GAAI,aAAa,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,SAAS,EAAE,IAAI,CAAC;AAAA,UACjF,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AAChB,oBAAQ,gDAAgD,SAAS,MAAM;AACvE,mBAAO;AAAA,UACT;AAEA,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAM,UAAU,KAAK,UAAU,CAAC,GAAG,MAAM,OAAO,KAAK;AACrD,iBAAO,WAAW;AAAA,QACpB,SAAS,OAAO;AACd,mBAAS,sDAAsD,KAAK;AACpE,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,uBAAuB,QAAa,SAAiB,eAAuB,WAAwB;AAClG,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,QACT;AAEA,cAAM,gBACJ,gCAAgC,aAAa,SAAS,SAAS;AAAA,EAC5D,OAAO;AAAA;AAGZ,YAAI,CAAC,QAAQ;AACX,iBAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,cAAc,CAAC;AAAA,QAC/C;AAEA,YAAI,OAAO,WAAW,UAAU;AAC9B,iBAAO;AAAA,YACL,EAAE,MAAM,QAAQ,MAAM,cAAc;AAAA,YACpC,EAAE,MAAM,QAAQ,MAAM,OAAO;AAAA,UAC/B;AAAA,QACF;AAEA,YAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,iBAAO;AAAA,YACL,EAAE,MAAM,QAAQ,MAAM,cAAc;AAAA,YACpC,GAAG;AAAA,UACL;AAAA,QACF;AAEA,eAAO;AAAA,UACL,EAAE,MAAM,QAAQ,MAAM,cAAc;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEO,IAAM,0BAA0B,IAAI,wBAAwB;AAAA;AAAA;;;ACxGnE,eAAsB,oBACpB,aACA,WACA,MACA,QACA,WACA,SACqB;AACrB,QAAM,YAAY,WAAW;AAC7B,QAAM,iBAAiB,OAAO,aAAa,UAAU,uBAAuB,CAAC;AAC7E,QAAM,YAAY;AAAA,IAChB,GAAG;AAAA,IACH,OAAO;AAAA,IACP,UAAU;AAAA,MACR,GAAI,aAAa,YAAY,CAAC;AAAA,MAC9B,qBAAqB,iBAAiB;AAAA,IACxC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,UAAU,oBAAoB,IAAI,gBAAgB;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,SAAS,EAAE,aAAa,OAAO,IAAI,CAAC;AAAA,MAC1C;AAAA,MACA,MAAM,KAAK,UAAU,SAAS;AAAA,MAC9B,GAAI,aAAa,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,SAAS,EAAE,IAAI,CAAC;AAAA,IACjF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,0BACpB,aACA,WACA,MACA,QACA,WACA,SAC4C;AAC5C,QAAM,YAAY,WAAW;AAC7B,QAAM,iBAAiB,OAAO,aAAa,UAAU,uBAAuB,CAAC;AAC7E,QAAM,YAAY;AAAA,IAChB,GAAG;AAAA,IACH,OAAO;AAAA,IACP,UAAU;AAAA,MACR,GAAI,aAAa,YAAY,CAAC;AAAA,MAC9B,qBAAqB,iBAAiB;AAAA,IACxC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,UAAU,oBAAoB,IAAI,gBAAgB;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,SAAS,EAAE,aAAa,OAAO,IAAI,CAAC;AAAA,MAC1C;AAAA,MACA,MAAM,KAAK,UAAU,SAAS;AAAA,MAC9B,GAAI,aAAa,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,SAAS,EAAE,IAAI,CAAC;AAAA,IACjF,CAAC;AAED,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,aAAO;AAAA,IACT;AAEA,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,SAAsB;AAChD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,OAAO,SAAS,UAAU,CAAC,GAAG,SAAS,UAAU;AACnD,WAAO,QAAQ,QAAQ,CAAC,EAAE;AAAA,EAC5B;AACA,MAAI,OAAO,SAAS,OAAO,YAAY,UAAU;AAC/C,WAAO,QAAQ,MAAM;AAAA,EACvB;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,SAAc,QAAiD;AACnG,QAAM,YAAgC,CAAC;AACvC,QAAM,OAAO,mBAAmB,OAAO,EAAE,KAAK;AAC9C,QAAM,sBAAsB,QAAQ,UAAU,wBAAwB,CAAC;AAEvE,MAAI,CAAC,MAAM;AACT,cAAU,KAAK,EAAE,MAAM,kBAAkB,QAAQ,4BAA4B,CAAC;AAC9E,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,IAAI;AACpB,cAAU,KAAK,EAAE,MAAM,kBAAkB,QAAQ,gCAAgC,KAAK,MAAM,UAAU,CAAC;AAAA,EACzG;AAEA,MAAI,QAAQ,UAAU,mBAAmB,+EAA+E,KAAK,IAAI,GAAG;AAClI,cAAU,KAAK,EAAE,MAAM,mBAAmB,QAAQ,oDAAoD,CAAC;AAAA,EACzG;AAEA,MAAI,QAAQ,UAAU,gBAAgB,0DAA0D,KAAK,IAAI,GAAG;AAC1G,cAAU,KAAK,EAAE,MAAM,gBAAgB,QAAQ,2CAA2C,CAAC;AAAA,EAC7F;AAEA,aAAW,WAAW,qBAAqB;AACzC,QAAI,WAAW,KAAK,YAAY,EAAE,SAAS,QAAQ,YAAY,CAAC,GAAG;AACjE,gBAAU,KAAK,EAAE,MAAM,uBAAuB,QAAQ,gCAAgC,OAAO,GAAG,CAAC;AAAA,IACnG;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,wBACd,cACA,WACA,QACA,UAAU,GACQ;AAClB,MAAI,CAAC,QAAQ,WAAW,CAAC,gBAAgB,UAAU,WAAW,GAAG;AAC/D,WAAO,EAAE,gBAAgB,MAAM;AAAA,EACjC;AAEA,QAAM,cAAc,OAAO,gBAAgB;AAC3C,MAAI,WAAW,aAAa;AAC1B,WAAO,EAAE,gBAAgB,OAAO,WAAW,+BAA+B;AAAA,EAC5E;AAEA,QAAM,YAAY,OAAO,QAAQ,KAAK,CAAC,UAAU,MAAM,SAAS,YAAY;AAC5E,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,gBAAgB,OAAO,WAAW,gDAAgD;AAAA,EAC7F;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,WAAW,UAAU;AAAA,IACrB,WAAW,UAAU,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI;AAAA,EACzD;AACF;AAvKA;AAAA;AAAA;AAAA;AAAA;;;ACyBA,SAAS,UAAU,MAAsB;AACvC,SAAO,KACJ,YAAY,EACZ,QAAQ,qBAAqB,GAAG,EAChC,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEA,SAAS,SAAS,MAAwB;AACxC,QAAM,aAAa,UAAU,IAAI;AACjC,MAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,QAAM,QAAQ,WAAW,MAAM,GAAG,EAAE,OAAO,OAAO;AAClD,QAAM,QAAQ,WACX,QAAQ,QAAQ,EAAE,EAClB,MAAM,EAAE,EACR,OAAO,OAAO;AAEjB,SAAO,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC;AACjD;AAEA,SAAS,YAAY,QAAuC;AAC1D,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,QAAQ;AAC1B,WAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAA2B,OAAoC;AACvF,MAAI,MAAM;AACV,MAAI,WAAW;AACf,MAAI,YAAY;AAEhB,aAAW,SAAS,KAAK,OAAO,GAAG;AACjC,gBAAY,QAAQ;AAAA,EACtB;AAEA,aAAW,SAAS,MAAM,OAAO,GAAG;AAClC,iBAAa,QAAQ;AAAA,EACvB;AAEA,aAAW,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAC/C,UAAM,aAAa,MAAM,IAAI,KAAK,KAAK;AACvC,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,aAAa,KAAK,cAAc,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS;AACzD;AA7EA,IA+Ea,gBAsKA;AArPb;AAAA;AAAA;AAOA;AACA;AACA;AACA;AAqEO,IAAM,iBAAN,MAAqB;AAAA,MAClB,sBAAsB,MAAc,YAA4C;AACtF,cAAM,UAAU,OAAO,QAAQ,UAAU,EACtC,IAAI,CAAC,CAAC,QAAQ,WAAW,MAAM,KAAK,MAAM,KAAK,WAAW,EAAE,EAC5D,KAAK,IAAI;AAEZ,eAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKT,IAAI;AAAA;AAAA;AAAA;AAAA,EAIJ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQP;AAAA,MAEQ,iBAAiB,MAAc,QAA8D;AACnG,YAAI,CAAC,QAAQ,WAAW,CAAC,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,WAAW,GAAG;AACzF,iBAAO;AAAA,QACT;AAEA,cAAM,cAAc,SAAS,IAAI;AACjC,YAAI,YAAY,WAAW,GAAG;AAC5B,iBAAO;AAAA,QACT;AACA,cAAM,cAAc,YAAY,WAAW;AAE3C,cAAM,YAAY,OAAO,aAAa;AACtC,YAAI,OAAqC;AAEzC,mBAAW,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACnE,gBAAM,kBAAkB,SAAS,SAAS;AAC1C,cAAI,gBAAgB,WAAW,EAAG;AAElC,gBAAM,kBAAkB,YAAY,eAAe;AACnD,gBAAM,UAAU,gBAAgB,OAAO,CAAC,UAAU,YAAY,SAAS,KAAK,CAAC;AAC7E,gBAAM,aAAa,iBAAiB,aAAa,eAAe;AAEhE,cAAI,CAAC,QAAQ,aAAa,KAAK,YAAY;AACzC,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA,kBAAkB;AAAA,cAClB,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,QAAQ,KAAK,aAAa,WAAW;AACxC,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,kBAAkB,MAAc,YAAuC,mBAAmB,MAAoC;AAC5H,cAAM,cAAc,SAAS,IAAI;AACjC,YAAI,YAAY,WAAW,KAAK,CAAC,WAAW,QAAQ;AAClD,iBAAO;AAAA,QACT;AAEA,cAAM,cAAc,YAAY,WAAW;AAC3C,YAAI,OAAqC;AACzC,YAAI,gBAAgB;AAEpB,mBAAW,aAAa,YAAY;AAClC,gBAAM,kBAAkB,SAAS,UAAU,SAAS;AACpD,cAAI,gBAAgB,WAAW,GAAG;AAChC;AAAA,UACF;AAEA,gBAAM,kBAAkB,YAAY,eAAe;AACnD,gBAAM,UAAU,gBAAgB,OAAO,CAAC,UAAU,YAAY,SAAS,KAAK,CAAC;AAC7E,gBAAM,aAAa,iBAAiB,aAAa,eAAe;AAChE,cAAI,CAAC,QAAQ,aAAa,KAAK,YAAY;AACzC,mBAAO;AAAA,cACL,QAAQ,UAAU;AAAA,cAClB;AAAA,cACA,kBAAkB,UAAU;AAAA,cAC5B,UAAU;AAAA,YACZ;AACA,4BAAgB,UAAU,aAAa;AAAA,UACzC;AAAA,QACF;AAEA,YAAI,CAAC,QAAQ,KAAK,aAAa,eAAe;AAC5C,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,QAAQ,MAAc,QAA8D;AAClF,eAAO,KAAK,iBAAiB,MAAM,MAAM;AAAA,MAC3C;AAAA,MAEA,MAAM,sBACJ,MACA,QACA,OAAeC,gBAAe,MAC9B,SACA,QACA,WACuC;AACvC,YAAI,CAAC,QAAQ,WAAW,OAAO,SAAS,gBAAgB,CAAC,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,WAAW,GAAG;AACzH,iBAAO,KAAK,iBAAiB,MAAM,MAAM;AAAA,QAC3C;AAEA,YAAI;AACF,gBAAM,YAAY,WAAW;AAC7B,gBAAM,WAAW,MAAM,UAAU,oBAAoB,IAAI,gBAAgB;AAAA,YACvE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,GAAI,SAAS,EAAE,aAAa,OAAO,IAAI,CAAC;AAAA,YAC1C;AAAA,YACA,MAAM,KAAK;AAAA,cACT,2BAA2B;AAAA,gBACzB,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,IAAI,uBAAuB,KAAK,sBAAsB,MAAM,OAAO,UAAU,CAAC;AAAA,cAChF,CAAC;AAAA,YACH;AAAA,YACA,GAAI,aAAa,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,SAAS,EAAE,IAAI,CAAC;AAAA,UACjF,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AAChB,oBAAQ,+CAA+C,SAAS,MAAM;AACtE,mBAAO,KAAK,iBAAiB,MAAM,MAAM;AAAA,UAC3C;AAEA,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAM,UAAU,KAAK,UAAU,CAAC,GAAG,QAAQ;AAC3C,gBAAM,QAAQ,QAAQ,MAAM,aAAa;AACzC,cAAI,CAAC,OAAO;AACV,oBAAQ,uDAAuD;AAC/D,mBAAO,KAAK,iBAAiB,MAAM,MAAM;AAAA,UAC3C;AAEA,gBAAM,SAAS,KAAK,MAAM,MAAM,CAAC,CAAC;AAClC,gBAAM,YAAY,OAAO,aAAa;AACtC,cAAI,CAAC,OAAO,WAAW,OAAO,cAAc,KAAK,WAAW;AAC1D,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,YACL,QAAQ,OAAO;AAAA,YACf,YAAY,OAAO;AAAA,YACnB,UAAU,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AAAA,UAChE;AAAA,QACF,SAAS,OAAO;AACd,mBAAS,4CAA4C,KAAK;AAC1D,iBAAO,KAAK,iBAAiB,MAAM,MAAM;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAEO,IAAM,iBAAiB,IAAI,eAAe;AAAA;AAAA;;;AC7MjD,SAAS,YAAY,SAAsB;AACzC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,OAAO,SAAS,UAAU,CAAC,GAAG,SAAS,SAAU,QAAO,QAAQ,QAAQ,CAAC,EAAE;AAC/E,MAAI,OAAO,SAAS,OAAO,YAAY,SAAU,QAAO,QAAQ,MAAM;AACtE,SAAO;AACT;AA9CA,IAmBM,wBA6BO,kBA6HA;AA7Kb;AAAA;AAAA;AAOA;AAEA;AACA;AACA;AAQA,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BxB,IAAM,mBAAN,MAAuB;AAAA,MACpB,oBAAoB,MAAsB;AAChD,eAAO,uBAAuB,QAAQ,cAAc,IAAI;AAAA,MAC1D;AAAA,MAEA,QAAQ,SAAc,QAAsD;AAC1E,YAAI,CAAC,QAAQ,SAAS;AACpB,iBAAO,EAAE,WAAW,OAAO,UAAU,CAAC,EAAE;AAAA,QAC1C;AAEA,cAAM,OAAO,YAAY,OAAO,EAAE,KAAK;AACvC,cAAM,WAAqB,CAAC;AAE5B,YAAI,CAAC,MAAM;AACT,mBAAS,KAAK,cAAc;AAAA,QAC9B;AAEA,YAAI,OAAO,QAAQ,sBAAsB;AACvC,cAAI,uCAAuC,KAAK,IAAI,GAAG;AACrD,qBAAS,KAAK,qBAAqB;AAAA,UACrC;AAAA,QACF;AAEA,YAAI,OAAO,QAAQ,kBAAkB,QAAQ,KAAK,SAAS,IAAI;AAC7D,mBAAS,KAAK,gBAAgB;AAAA,QAChC;AAEA,YAAI,OAAO,QAAQ,sBAAsB,MAAM,KAAK,IAAI,MAAM,SAAS,gCAAgC,KAAK,IAAI,GAAG;AACjH,mBAAS,KAAK,oBAAoB;AAAA,QACpC;AAEA,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO,EAAE,WAAW,OAAO,UAAU,CAAC,EAAE;AAAA,QAC1C;AAEA,cAAM,YACJ,SAAS,SAAS,qBAAqB,KAAK,SAAS,SAAS,cAAc,IACxE,SACA,SAAS,SAAS,IAChB,WACA;AAER,eAAO;AAAA,UACL,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,kBAAkB,OAA+C;AAC/D,YAAI,CAAC,MAAM,WAAW;AACpB,iBAAO,CAAC;AAAA,QACV;AAEA,eAAO,MAAM,SAAS,IAAI,CAAC,YAAY;AACrC,kBAAQ,SAAS;AAAA,YACf,KAAK;AACH,qBAAO,EAAE,MAAM,kBAAkB,QAAQ,0CAA0C;AAAA,YACrF,KAAK;AACH,qBAAO,EAAE,MAAM,kBAAkB,QAAQ,4CAA4C;AAAA,YACvF,KAAK;AACH,qBAAO,EAAE,MAAM,uBAAuB,QAAQ,iDAAiD;AAAA,YACjG;AACE,qBAAO,EAAE,MAAM,gBAAgB,QAAQ,8BAA8B,OAAO,GAAG;AAAA,UACnF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,oBACJ,SACA,QACA,OAAeC,gBAAe,MAC9B,SACA,QACA,WAC6B;AAC7B,cAAM,OAAO,YAAY,OAAO,EAAE,KAAK;AACvC,YAAI,CAAC,OAAO,WAAW,CAAC,OAAO,kBAAkB,CAAC,MAAM;AACtD,iBAAO,KAAK,QAAQ,SAAS,MAAM;AAAA,QACrC;AAEA,YAAI;AACF,gBAAM,YAAY,WAAW;AAC7B,gBAAM,WAAW,MAAM,UAAU,oBAAoB,IAAI,gBAAgB;AAAA,YACvE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,GAAI,SAAS,EAAE,aAAa,OAAO,IAAI,CAAC;AAAA,YAC1C;AAAA,YACA,MAAM,KAAK;AAAA,cACT,2BAA2B;AAAA,gBACzB,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,IAAI,uBAAuB,KAAK,oBAAoB,IAAI,CAAC;AAAA,cAC3D,CAAC;AAAA,YACH;AAAA,YACA,GAAI,aAAa,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,SAAS,EAAE,IAAI,CAAC;AAAA,UACjF,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AAChB,oBAAQ,+CAA+C,SAAS,MAAM;AACtE,mBAAO,KAAK,QAAQ,SAAS,MAAM;AAAA,UACrC;AAEA,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAM,UAAU,KAAK,UAAU,CAAC,GAAG,QAAQ;AAC3C,gBAAM,QAAQ,QAAQ,MAAM,aAAa;AACzC,cAAI,CAAC,OAAO;AACV,oBAAQ,uDAAuD;AAC/D,mBAAO,KAAK,QAAQ,SAAS,MAAM;AAAA,UACrC;AAEA,gBAAM,SAAS,KAAK,MAAM,MAAM,CAAC,CAAC;AAClC,iBAAO;AAAA,YACL,WAAW,QAAQ,OAAO,SAAS;AAAA,YACnC,WAAW,OAAO;AAAA,YAClB,UAAU,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AAAA,UAChE;AAAA,QACF,SAAS,OAAO;AACd,mBAAS,6CAA6C,KAAK;AAC3D,iBAAO,KAAK,QAAQ,SAAS,MAAM;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEO,IAAM,mBAAmB,IAAI,iBAAiB;AAAA;AAAA;;;AClJrD,eAAsB,wBAAwB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAC9C,MAAI,cAAc;AAClB,QAAM,wBAAwB,OAAO,YAAY,UAC7C;AAAA,IACE,GAAG,OAAO,WAAW;AAAA,IACrB,QAAQ,OAAO,WAAW,QAAQ,QAAQ,IAAI,CAAC,WAAW;AAAA,MACxD,GAAG;AAAA,MACH,MAAM,sBAAsB,QAAQ,MAAM,IAAI,KAAK,MAAM;AAAA,MACzD,IAAI,sBAAsB,QAAQ,MAAM,EAAE,KAAK,MAAM;AAAA,IACvD,EAAE;AAAA,EACJ,IACA;AACJ,QAAM,uBAAuB,OAAO,YAAY,SAC5C;AAAA,IACE,GAAG,OAAO,WAAW;AAAA,IACrB,gBAAgB,sBAAsB,QAAQ,OAAO,WAAW,OAAO,cAAc,KAAK,OAAO,WAAW,OAAO;AAAA,EACrH,IACA;AACJ,QAAM,0BAA0B,MAAM,yBAAyB;AAC/D,QAAM,4BAA4B,MAAM,2BAA2B;AACnE,QAAM,wBAAwB,MAAM,uBAAuB;AAE3D,MACE,OAAO,YAAY,WACnB,uBAAuB,WACvB,IAAI,iBACJ;AACA,UAAM,YAAY,wBAAwB,aAAa,qBAAqB;AAC5E,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,iBAAiB,OAAO,IAAI,MAAM,UAAU,uBAAuB,CAAC;AAC1E,YAAM,WAAW;AAAA,QACf,IAAI,MAAM;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,gBAAgB,kBAAkB,UAAU,IAAI,CAAC,SAAS,KAAK,IAAI;AACvE,UAAI,SAAS,gBAAgB;AAC3B,YAAI,gBAAgB,mBAAmB;AACvC,YAAI,gBAAgB,mBAAmB,SAAS;AAChD,0BAAkB,IAAI,iBAAiB,cAAc;AAErD,YAAI,SAAS,WAAW;AACtB,gBAAM,iBAAiB,MAAM;AAAA,YAC3B,IAAI;AAAA,YACJ,SAAS;AAAA,YACT;AAAA,YACA,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAEA,cAAI,gBAAgB;AAClB,gBAAI,KAAK,QAAQ,SAAS;AAC1B,8BAAkB,IAAI,iBAAiB,wBAAwB;AAC/D,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,WAAW,OAAO,WAAW,QAAQ,WAAW,IAAI,aAAa,IAAI,MAAM,OAAO;AACvG,UAAM,cAAc,sBAAsB,IAAI,eAAe,YAAY;AACzE,QAAI,aAAa;AACf,wBAAkB,IAAI,IAAI,WAAW;AAAA,QACnC,gBAAgB,IAAI,KAAK;AAAA,QACzB,qBAAqB,IAAI,KAAK;AAAA,QAC9B,qBAAqB;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MACE,OAAO,YAAY,WACnB,sBAAsB,WACtB,IAAI,iBACJ;AACA,UAAM,QAAQ,qBAAqB,iBAC/B,MAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,IACT,IACA,iBAAiB,QAAQ,aAAa,oBAAoB;AAC9D,QAAI,MAAM,WAAW;AACnB,UAAI,gBAAgB,gBAAgB;AACpC,UAAI,gBAAgB,qBAAqB,GAAG,MAAM,SAAS,IAAI,MAAM,SAAS,KAAK,GAAG,CAAC;AACvF,wBAAkB,IAAI,iBAAiB,mBAAmB;AAE1D,UACE,qBAAqB,SAAS,gBAC9B,uBAAuB,WACvB,MAAM,cAAc,OACpB;AACA,cAAM,eAAe,OAAO,IAAI,MAAM,UAAU,uBAAuB,CAAC;AACxE,cAAM,gBAAgB;AAAA,UACpB,IAAI,MAAM;AAAA,UACV,iBAAiB,kBAAkB,KAAK;AAAA,UACxC;AAAA,UACA;AAAA,QACF;AAEA,YAAI,cAAc,kBAAkB,cAAc,WAAW;AAC3D,gBAAM,iBAAiB,MAAM;AAAA,YAC3B,IAAI;AAAA,YACJ,cAAc;AAAA,YACd;AAAA,YACA,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAEA,cAAI,gBAAgB;AAClB,gBAAI,KAAK,QAAQ,cAAc;AAC/B,gBAAI,gBAAgB,qBAClB,GAAG,MAAM,SAAS,IAAI,MAAM,SAAS,KAAK,GAAG,CAAC,gBAAgB,cAAc,SAAS;AACvF,8BAAkB,IAAI,iBAAiB,mBAAmB;AAC1D,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,iBAAiB;AACvB,QAAI,kBAAkB,cAAc,IAAI,iBAAiB;AAAA,MACvD,YAAY,IAAI,MAAM,SAAS,IAAI,gBAAgB;AAAA,IACrD,CAAC;AACD,0BAAsB,IAAI,eAAe;AAAA,EAC3C;AAEA,SAAO;AACT;AAvKA;AAAA;AAAA;AAOA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACXA,IAMAC,mBAeM,mBAkCO;AAvDb;AAAA;AAAA;AAMA,IAAAA,oBAAyB;AAezB,IAAM,oBAAN,MAAwB;AAAA,MACd;AAAA,MAER,cAAc;AACZ,aAAK,QAAQ,IAAI,2BAAS;AAAA,UACxB,KAAK;AAAA,UACL,KAAK,MAAO,KAAK;AAAA;AAAA,QACnB,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAA+B,OAAgC;AACjE,YAAI,CAAC,aAAa,CAAC,MAAO;AAC1B,aAAK,MAAM,IAAI,WAAW,KAAK;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAkD;AACpD,YAAI,CAAC,UAAW,QAAO;AACvB,eAAO,KAAK,MAAM,IAAI,SAAS;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,QAAc;AACZ,aAAK,MAAM,MAAM;AAAA,MACnB;AAAA,IACF;AAEO,IAAM,oBAAoB,IAAI,kBAAkB;AAAA;AAAA;;;ACvDvD,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,qBAAN,MAAyB;AAAA,MACtB,SAAiB;AAAA,MAEzB,cAAc;AACZ,cAAM,kBAAkB,IAAI,gBAAgB;AAAA,UAC1C,OAAO,CAAC,eAAe;AAAA,UAEvB;AAAA,UACA,WAAW,CAAC,OAAmB,eAAe;AAC5C,kBAAM,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK;AAC3C,iBAAK,UAAU;AAEf,iBAAK,YAAY,UAAU;AAAA,UAC7B;AAAA,UACA,OAAO,CAAC,eAAe;AACrB,gBAAI,KAAK,OAAO,KAAK,GAAG;AACtB,mBAAK,YAAY,UAAU;AAAA,YAC7B;AAAA,UACF;AAAA,QACF,CAAC;AAGD,aAAK,WAAW,gBAAgB;AAChC,aAAK,WAAW,gBAAgB;AAAA,MAClC;AAAA,MAEA;AAAA,MACA;AAAA,MAEQ,YAAY,YAAmD;AACrE,cAAM,QAAQ,KAAK,OAAO,MAAM,IAAI;AACpC,aAAK,SAAS,MAAM,IAAI,KAAK;AAE7B,YAAI,eAAoB,CAAC;AAEzB,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,yBAAa,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAAA,UAC1C,WAAW,KAAK,WAAW,OAAO,GAAG;AACnC,kBAAM,UAAU,KAAK,MAAM,CAAC,EAAE,KAAK;AACnC,gBAAI;AACF,2BAAa,OAAO,KAAK,MAAM,OAAO;AAAA,YACxC,QAAQ;AACN,2BAAa,OAAO;AAAA,YACtB;AAAA,UACF,WAAW,SAAS,MAAM,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AAC9D,uBAAW,QAAQ,YAAY;AAC/B,2BAAe,CAAC;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC/BA,SAAS,eAAeC,QAAwB;AAC9C,MAAIC,UAAS;AACb,MAAID,OAAM,OAAO;AACf,IAAAC,WAAU,UAAUD,OAAM,KAAK;AAAA;AAAA,EACjC;AACA,MAAIA,OAAM,SAAS,QAAW;AAC5B,IAAAC,WAAU,SAAS,OAAOD,OAAM,SAAS,WAAWA,OAAM,OAAO,KAAK,UAAUA,OAAM,IAAI,CAAC;AAAA;AAAA,EAC7F;AACA,EAAAC,WAAU;AACV,SAAO,IAAI,YAAY,EAAE,OAAOA,OAAM;AACxC;AAEA,eAAe,WAAW,QAA4D;AACpF,QAAM,SAAS,IAAI,mBAAmB;AACtC,QAAM,eAAe,OAAO,YAAY,MAAa;AACrD,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,SAAgB,CAAC;AACvB,MAAI,OAAO;AACX,MAAI;AACJ,MAAI,UAAU;AAEd,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,OAAO,KAAK,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,aAAO,KAAK,KAAK;AAEjB,YAAM,YAAY,OAAO,MAAM,OAAO;AACtC,UAAI,OAAO,cAAc,UAAU;AACjC,kBAAU;AACV,gBAAQ;AAAA,MACV;AAEA,UAAI,OAAO,UAAU,mBAAmB,OAAO,MAAM,OAAO;AAC1D,gBAAQ,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO,EAAE,QAAQ,MAAM,OAAO,QAAQ;AACxC;AAEO,SAAS,wBACd,QACA,KACA,QACA,aACA,MAC4B;AAC5B,QAAM,8BAA8B,MAAM,6BAA6B;AACvE,QAAM,0BAA0B,MAAM,yBAAyB;AAC/D,QAAM,4BAA4B,MAAM,2BAA2B;AACnE,QAAM,wBAAwB,OAAO,YAAY,UAC7C;AAAA,IACE,GAAG,OAAO,WAAW;AAAA,IACrB,QAAQ,OAAO,WAAW,QAAQ,QAAQ,IAAI,CAAC,WAAW;AAAA,MACxD,GAAG;AAAA,MACH,MAAM,sBAAsB,QAAQ,MAAM,IAAI,KAAK,MAAM;AAAA,MACzD,IAAI,sBAAsB,QAAQ,MAAM,EAAE,KAAK,MAAM;AAAA,IACvD,EAAE;AAAA,EACJ,IACA;AAEJ,SAAO,IAAI,eAA2B;AAAA,IACpC,MAAM,MAAM,YAAY;AACtB,UAAI;AACF,cAAM,WAAW,MAAM,WAAW,MAAM;AACxC,YAAI,WAAW;AAEf,YACE,OAAO,YAAY,WACnB,uBAAuB,WACvB,sBAAsB,gBACtB,IAAI,mBACJ,SAAS,SACT;AACA,gBAAM,YAAY;AAAA,YAChB,EAAE,SAAS,CAAC,EAAE,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,YACrC;AAAA,UACF;AAEA,cAAI,UAAU,SAAS,GAAG;AACxB,kBAAM,iBAAiB,OAAO,IAAI,MAAM,UAAU,uBAAuB,CAAC;AAC1E,kBAAM,WAAW;AAAA,cACf,IAAI,MAAM;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,gBAAI,gBAAgB,kBAAkB,UAAU,IAAI,CAAC,SAAS,KAAK,IAAI;AAEvE,gBAAI,SAAS,kBAAkB,SAAS,WAAW;AACjD,kBAAI,gBAAgB,mBAAmB;AACvC,kBAAI,gBAAgB,mBAAmB,SAAS;AAChD,gCAAkB,IAAI,iBAAiB,qBAAqB;AAE5D,oBAAM,cAAc,MAAM;AAAA,gBACxB,IAAI;AAAA,gBACJ,SAAS;AAAA,gBACT;AAAA,gBACA,OAAO;AAAA,gBACP,OAAO;AAAA,cACT;AAEA,kBAAI,aAAa;AACf,2BAAW,MAAM,WAAW,WAAW;AACvC,oBAAI,KAAK,QAAQ,SAAS;AAC1B,kCAAkB,IAAI,iBAAiB,+BAA+B;AAAA,cACxE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,mBAAWD,UAAS,SAAS,QAAQ;AACnC,qBAAW,QAAQ,eAAeA,MAAK,CAAC;AAAA,QAC1C;AACA,mBAAW,MAAM;AAEjB,YAAI,IAAI,aAAa,SAAS,OAAO;AACnC,4BAAkB,IAAI,IAAI,WAAW,SAAS,KAAK;AAAA,QACrD;AAEA,YAAI,IAAI,iBAAiB;AACvB,cAAI,kBAAkB,cAAc,IAAI,iBAAiB;AAAA,YACvD,YAAY,IAAI,MAAM,SAAS,IAAI,gBAAgB;AAAA,UACrD,CAAC;AACD,gCAAsB,IAAI,eAAe;AAAA,QAC3C;AAAA,MACF,SAAS,OAAO;AACd,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAjKA;AAAA;AAAA;AAOA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACsFA,SAAS,2BACPE,QAC8B;AAC9B,SAAO;AAAA,IACL,eAAeA,QAAO,iBAAiB,2BAA2B;AAAA,IAClE,iBAAiBA,QAAO,mBAAmB,2BAA2B;AAAA,IACtE,qBAAqBA,QAAO,uBAAuB,2BAA2B;AAAA,IAC9E,gBAAgBA,QAAO,kBAAkB,2BAA2B;AAAA,IACpE,oBAAoBA,QAAO,sBAAsB,2BAA2B;AAAA,IAC5E,eAAeA,QAAO,iBAAiB,2BAA2B;AAAA,IAClE,mBAAmBA,QAAO,qBAAqB,2BAA2B;AAAA,IAC1E,eAAeA,QAAO,iBAAiB,2BAA2B;AAAA,IAClE,gBAAgBA,QAAO,kBAAkB,2BAA2B;AAAA,EACtE;AACF;AAEA,SAAS,KAAK,OAAe,OAAuB;AAClD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,OAAO,QAAQ,CAAC,CAAC;AAC1C;AAEA,SAAS,QAAQ,QAA0B;AACzC,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAC1D,SAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,CAAC,CAAC;AAClD;AAEA,SAAS,UAAU,cAAsC,KAAoB;AAC3E,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AAEA,eAAa,GAAG,KAAK,aAAa,GAAG,KAAK,KAAK;AACjD;AAEA,SAAS,gBACP,cACA,OACA,QAAQ,GACwB;AAChC,SAAO,OAAO,QAAQ,YAAY,EAC/B,KAAK,CAAC,MAAM,UAAU;AACrB,QAAI,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG;AACxB,aAAO,MAAM,CAAC,IAAI,KAAK,CAAC;AAAA,IAC1B;AACA,WAAO,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC;AAAA,EACvC,CAAC,EACA,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA,MAAM,KAAK,OAAO,KAAK;AAAA,EACzB,EAAE;AACN;AAEA,SAAS,YAAY,QAA0B;AAC7C,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,OAAO,QAAQ,QAAQ,CAAC,CAAC;AAC1F;AAEA,SAAS,eACP,SACA,SACA,YACsB;AACtB,QAAM,YAAkC,CAAC;AAEzC,MAAI,QAAQ,eAAe,WAAW,iBAAiB,QAAQ,wBAAwB,WAAW,iBAAiB;AACjH,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,UAAU,QAAQ,wBAAwB,WAAW,sBAAsB,aAAa;AAAA,MACxF,SAAS,wCAAwC,QAAQ,uBAAuB,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC/F,QAAQ;AAAA,MACR,OAAO,QAAQ;AAAA,MACf,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,eAAe,WAAW,iBAAiB,QAAQ,qBAAqB,WAAW,gBAAgB;AAC7G,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,UAAU,QAAQ,qBAAqB,WAAW,qBAAqB,aAAa;AAAA,MACpF,SAAS,2CAA2C,QAAQ,oBAAoB,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC/F,QAAQ;AAAA,MACR,OAAO,QAAQ;AAAA,MACf,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,eAAe,WAAW,iBAAiB,QAAQ,oBAAoB,WAAW,eAAe;AAC3G,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,UAAU,QAAQ,oBAAoB,WAAW,oBAAoB,aAAa;AAAA,MAClF,SAAS,kCAAkC,QAAQ,iBAAiB,QAAQ,CAAC,CAAC;AAAA,MAC9E,QAAQ;AAAA,MACR,OAAO,QAAQ;AAAA,MACf,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,UAAU,GAAG;AACvB,UAAM,eAAe,QAAQ,QAAQ,SAAS,CAAC;AAC/C,UAAM,kBAAkB,QAAQ,MAAM,GAAG,EAAE,EAAE,OAAO,CAAC,WAAW,OAAO,QAAQ,cAAc,CAAC;AAC9F,QAAI,aAAa,QAAQ,cAAc,KAAK,gBAAgB,SAAS,GAAG;AACtE,YAAM,yBAAyB;AAAA,QAC7B,gBAAgB,IAAI,CAAC,WAAW,OAAO,QAAQ,oBAAoB;AAAA,MACrE;AACA,UAAI,aAAa,QAAQ,wBAAwB,WAAW,iBAC1D,aAAa,QAAQ,wBAAwB,yBAAyB,WAAW,gBAAgB;AACjG,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,yCAAyC,aAAa,QAAQ,uBAAuB,KAAK,QAAQ,CAAC,CAAC;AAAA,UAC7G,QAAQ;AAAA,UACR,OAAO,aAAa,QAAQ;AAAA,UAC5B,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAEA,YAAM,wBAAwB;AAAA,QAC5B,gBAAgB,IAAI,CAAC,WAAW,OAAO,QAAQ,iBAAiB;AAAA,MAClE;AACA,UAAI,aAAa,QAAQ,qBAAqB,WAAW,iBACvD,aAAa,QAAQ,qBAAqB,wBAAwB,WAAW,gBAAgB;AAC7F,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,wCAAwC,aAAa,QAAQ,oBAAoB,KAAK,QAAQ,CAAC,CAAC;AAAA,UACzG,QAAQ;AAAA,UACR,OAAO,aAAa,QAAQ;AAAA,UAC5B,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,QAAgD;AACzF,QAAM,iBAAiB,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,EAAE;AACjE,QAAM,qBAAqB,OAAO,OAAO,CAAC,UAAU,MAAM,aAAa,EAAE;AACzE,QAAM,wBAAwB,OAAO,OAAO,CAAC,UAAU,MAAM,gBAAgB,EAAE;AAC/E,QAAM,qBAAqB,OAAO,OAAO,CAAC,UAAU,MAAM,aAAa,EAAE;AACzE,QAAM,gBAAgB,OACnB,IAAI,CAAC,UAAU,MAAM,SAAS,EAC9B,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAC;AACzF,QAAM,sBAAsB,OACzB,IAAI,CAAC,UAAU,MAAM,aAAa,EAClC,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAC;AAEzF,QAAM,0BAAkD,CAAC;AACzD,QAAM,yBAAiD,CAAC;AACxD,QAAM,6BAAqD,CAAC;AAE5D,aAAW,SAAS,QAAQ;AAC1B,eAAW,UAAU,MAAM,aAAa;AACtC,gBAAU,yBAAyB,MAAM;AAAA,IAC3C;AACA,cAAU,wBAAwB,MAAM,UAAU;AAClD,cAAU,4BAA4B,MAAM,cAAc;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,aAAa,OAAO;AAAA,IACpB;AAAA,IACA,eAAe,KAAK,gBAAgB,OAAO,MAAM;AAAA,IACjD;AAAA,IACA,mBAAmB,KAAK,oBAAoB,OAAO,MAAM;AAAA,IACzD;AAAA,IACA,sBAAsB,KAAK,uBAAuB,OAAO,MAAM;AAAA,IAC/D;AAAA,IACA,mBAAmB,KAAK,oBAAoB,OAAO,MAAM;AAAA,IACzD,kBAAkB,QAAQ,aAAa;AAAA,IACvC,sBAAsB,QAAQ,mBAAmB;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,aAAqB,WAA2B;AACxE,SAAO,GAAG,IAAI,KAAK,WAAW,EAAE,YAAY,CAAC,IAAI,IAAI,KAAK,SAAS,EAAE,YAAY,CAAC;AACpF;AAEA,SAAS,qBACP,QACA,SAC0E;AAC1E,MAAI,CAAC,QAAQ,YAAY,QAAQ,YAAY,GAAG;AAC9C,WAAO;AAAA,MACL;AAAA,MACA,aAAa,OAAO,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,SAAS,CAAC,IAAI;AAAA,MACnF,WAAW,OAAO,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,SAAS,CAAC,IAAI;AAAA,IACnF;AAAA,EACF;AAEA,QAAM,MAAM,QAAQ,OAAO,KAAK,IAAI;AACpC,QAAM,cAAc,MAAM,QAAQ;AAClC,SAAO;AAAA,IACL,QAAQ,OAAO,OAAO,CAAC,UAAU,MAAM,aAAa,eAAe,MAAM,aAAa,GAAG;AAAA,IACzF;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,SAAS,aACP,QACA,aACA,WACA,aAC4B;AAC5B,MACE,gBAAgB,UAChB,cAAc,UACd,eAAe,KACf,aAAa,aACb;AACA,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,eAAe,WAAW,CAAC;AACjF,QAAM,UAAsC,CAAC;AAE7C,WAAS,QAAQ,GAAG,QAAQ,aAAa,SAAS,GAAG;AACnD,UAAM,cAAc,cAAe,QAAQ;AAC3C,UAAM,YAAY,UAAU,cAAc,IACtC,YACA,KAAK,IAAI,WAAW,cAAc,UAAU;AAChD,UAAM,eAAe,OAAO,OAAO,CAAC,UAAU;AAC5C,UAAI,UAAU,cAAc,GAAG;AAC7B,eAAO,MAAM,aAAa,eAAe,MAAM,aAAa;AAAA,MAC9D;AACA,aAAO,MAAM,aAAa,eAAe,MAAM,YAAY;AAAA,IAC7D,CAAC;AAED,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA,OAAO,iBAAiB,aAAa,SAAS;AAAA,MAC9C,SAAS,2BAA2B,YAAY;AAAA,IAClD,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,2BACd,UAA2C,CAAC,GAClB;AAC1B,QAAM,aAAa,qBAAqB,KAAK;AAAA,IAC3C,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,kBAAkB,QAAQ;AAAA,IAC1B,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,QAAM,WAAW,qBAAqB,YAAY,OAAO;AACzD,QAAM,gBAAgB,QAAQ,SAAS,QAAQ,QAAQ,IACnD,SAAS,OAAO,MAAM,GAAG,QAAQ,KAAK,IACtC,SAAS;AACb,QAAM,cAAc,QAAQ,eAAe,QAAQ,cAAc,IAAI,QAAQ,cAAc;AAC3F,QAAM,UAAU,2BAA2B,aAAa;AACxD,QAAM,UAAU,aAAa,eAAe,SAAS,aAAa,SAAS,WAAW,WAAW;AACjG,QAAM,aAAa,2BAA2B,QAAQ,iBAAiB;AAEvE,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,aAAa,SAAS;AAAA,IACtB,WAAW,SAAS;AAAA,IACpB;AAAA,IACA;AAAA,IACA,iBAAiB,gBAAgB,QAAQ,yBAAyB,cAAc,MAAM;AAAA,IACtF,gBAAgB,gBAAgB,QAAQ,wBAAwB,cAAc,MAAM;AAAA,IACpF,oBAAoB,gBAAgB,QAAQ,4BAA4B,cAAc,MAAM;AAAA,IAC5F,WAAW,eAAe,SAAS,SAAS,UAAU;AAAA,EACxD;AACF;AAQO,SAAS,8BACd,QACA,SAAyC,QACjC;AACR,MAAI,WAAW,QAAQ;AACrB,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAEA,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA,uBAAuB,OAAO,QAAQ,WAAW;AAAA,IACjD,yBAAyB,OAAO,QAAQ,aAAa;AAAA,IACrD,gCAAgC,OAAO,QAAQ,oBAAoB;AAAA,IACnE,6BAA6B,OAAO,QAAQ,iBAAiB;AAAA,IAC7D,6BAA6B,OAAO,QAAQ,iBAAiB;AAAA,IAC7D,4BAA4B,OAAO,QAAQ,gBAAgB;AAAA,IAC3D,gCAAgC,OAAO,QAAQ,oBAAoB;AAAA,EACrE;AAEA,aAAW,WAAW,OAAO,WAAW;AACtC,UAAM,KAAK,WAAW,QAAQ,IAAI,IAAI,QAAQ,QAAQ,IAAI,QAAQ,KAAK,EAAE;AAAA,EAC3E;AAEA,aAAW,QAAQ,OAAO,iBAAiB;AACzC,UAAM,KAAK,kBAAkB,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAAA,EACpE;AAEA,aAAW,QAAQ,OAAO,gBAAgB;AACxC,UAAM,KAAK,iBAAiB,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAAA,EACnE;AAEA,aAAW,QAAQ,OAAO,oBAAoB;AAC5C,UAAM,KAAK,qBAAqB,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAAA,EACvE;AAEA,aAAW,UAAU,OAAO,SAAS;AACnC,UAAM;AAAA,MACJ,UAAU,OAAO,KAAK,IAAI;AAAA,QACxB,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,MACjB,EAAE,KAAK,GAAG,CAAC;AAAA,IACb;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAxbA,IAqFM;AArFN;AAAA;AAAA;AACA;AAoFA,IAAM,6BAA2D;AAAA,MAC/D,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,gBAAgB;AAAA,IAClB;AAAA;AAAA;;;AC/FA,IAAAC,YACAC,cA0Ca,8BAqLA;AAhOb;AAAA;AAAA;AAAA,IAAAD,aAAmE;AACnE,IAAAC,eAA8B;AAC9B;AAKA;AAoCO,IAAM,+BAAN,MAAmC;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAA4C,CAAC;AAAA,MAC7C,YAAY,oBAAI,IAA2E;AAAA,MAEnG,YAAY,UAAgD,CAAC,GAAG;AAC9D,aAAK,cAAc,QAAQ,eAAe;AAC1C,aAAK,cAAc,QAAQ,eAAe;AAC1C,aAAK,eAAe,QAAQ,gBAAgB;AAC5C,aAAK,iBAAiB,QAAQ,kBAAkB,QAAQ,IAAI,aAAa;AACzE,aAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,aAAK,YAAY;AACjB,aAAK,cAAc;AAAA,MACrB;AAAA,MAEA,cAAgD;AAC9C,eAAO,CAAC,GAAG,KAAK,OAAO;AAAA,MACzB;AAAA,MAEA,gBAA+C;AAC7C,eAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EACtC,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,KAAK,EAAE,EAChC,KAAK,CAAC,MAAM,UAAU,MAAM,YAAY,KAAK,SAAS;AAAA,MAC3D;AAAA,MAEA,eACE,UAA2C,CAAC,GAC5C,SAAyC,QACzC,OAA+B,UACgE;AAC/F,cAAM,SAAS,2BAA2B,OAAO;AACjD,cAAM,UAAU,8BAA8B,QAAQ,MAAM;AAC5D,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,KAAK,UAAU,SAAS,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACxE,cAAM,eAAW,mBAAK,KAAK,aAAa,GAAG,EAAE,IAAI,MAAM,EAAE;AAEzD,YAAI,KAAK,gBAAgB;AACvB,oCAAU,KAAK,aAAa,EAAE,WAAW,KAAK,CAAC;AAC/C,wCAAc,UAAU,SAAS,OAAO;AAAA,QAC1C;AAEA,cAAM,SAAyC;AAAA,UAC7C;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,QAAQ;AAAA,UAClB,aAAa,OAAO;AAAA,QACtB;AAEA,aAAK,UAAU,CAAC,QAAQ,GAAG,KAAK,OAAO,EAAE,MAAM,GAAG,KAAK,aAAa;AACpE,aAAK,eAAe;AACpB,eAAO,EAAE,QAAQ,QAAQ,QAAQ;AAAA,MACnC;AAAA,MAEA,cACE,YACA,UAA2C,CAAC,GAC5C,SAAyC,QACZ;AAC7B,cAAM,KAAK,YAAY,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC3E,cAAM,OAAoC;AAAA,UACxC;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,WAAW,KAAK,IAAI;AAAA,UACpB;AAAA,QACF;AAEA,cAAM,QAAQ,YAAY,MAAM;AAC9B,gBAAM,SAAS,KAAK,eAAe,SAAS,QAAQ,WAAW;AAC/D,gBAAM,UAAU,KAAK,UAAU,IAAI,EAAE;AACrC,cAAI,SAAS;AACX,oBAAQ,KAAK,YAAY,OAAO,OAAO;AACvC,iBAAK,iBAAiB;AAAA,UACxB;AAAA,QACF,GAAG,UAAU;AACb,cAAM,QAAQ;AAEd,aAAK,UAAU,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AACtC,aAAK,iBAAiB;AACtB,eAAO,EAAE,GAAG,KAAK;AAAA,MACnB;AAAA,MAEA,aAAa,IAAqB;AAChC,cAAM,UAAU,KAAK,UAAU,IAAI,EAAE;AACrC,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,QACT;AAEA,YAAI,QAAQ,OAAO;AACjB,wBAAc,QAAQ,KAAK;AAAA,QAC7B;AACA,gBAAQ,KAAK,UAAU;AACvB,aAAK,UAAU,OAAO,EAAE;AACxB,aAAK,iBAAiB;AACtB,eAAO;AAAA,MACT;AAAA,MAEA,QAAc;AACZ,mBAAW,WAAW,KAAK,UAAU,OAAO,GAAG;AAC7C,cAAI,QAAQ,OAAO;AACjB,0BAAc,QAAQ,KAAK;AAAA,UAC7B;AAAA,QACF;AACA,aAAK,UAAU,MAAM;AACrB,aAAK,UAAU,CAAC;AAChB,aAAK,eAAe;AACpB,aAAK,iBAAiB;AAAA,MACxB;AAAA,MAEQ,cAAoB;AAC1B,YAAI,CAAC,KAAK,kBAAkB,KAAC,uBAAW,KAAK,WAAW,GAAG;AACzD;AAAA,QACF;AAEA,YAAI;AACF,eAAK,UAAU,KAAK,UAAM,yBAAa,KAAK,aAAa,OAAO,CAAC;AAAA,QACnE,QAAQ;AACN,eAAK,UAAU,CAAC;AAAA,QAClB;AAAA,MACF;AAAA,MAEQ,iBAAuB;AAC7B,YAAI,CAAC,KAAK,gBAAgB;AACxB;AAAA,QACF;AAEA,sCAAU,sBAAQ,KAAK,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,sCAAc,KAAK,aAAa,KAAK,UAAU,KAAK,SAAS,MAAM,CAAC,GAAG,OAAO;AAAA,MAChF;AAAA,MAEQ,gBAAsB;AAC5B,YAAI,CAAC,KAAK,kBAAkB,KAAC,uBAAW,KAAK,YAAY,GAAG;AAC1D;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,YAAY,KAAK,UAAM,yBAAa,KAAK,cAAc,OAAO,CAAC;AACrE,qBAAW,YAAY,UAAU,OAAO,CAAC,SAAS,KAAK,OAAO,GAAG;AAC/D,iBAAK,gBAAgB,QAAQ;AAAA,UAC/B;AAAA,QACF,QAAQ;AACN,eAAK,UAAU,MAAM;AAAA,QACvB;AAAA,MACF;AAAA,MAEQ,mBAAyB;AAC/B,YAAI,CAAC,KAAK,gBAAgB;AACxB;AAAA,QACF;AAEA,sCAAU,sBAAQ,KAAK,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACzD,cAAM,YAAY,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI;AAC7E,sCAAc,KAAK,cAAc,KAAK,UAAU,WAAW,MAAM,CAAC,GAAG,OAAO;AAAA,MAC9E;AAAA,MAEQ,gBAAgB,UAA6C;AACnE,cAAM,QAAQ,YAAY,MAAM;AAC9B,gBAAM,SAAS,KAAK,eAAe,SAAS,SAAS,SAAS,QAAQ,WAAW;AACjF,gBAAM,UAAU,KAAK,UAAU,IAAI,SAAS,EAAE;AAC9C,cAAI,SAAS;AACX,oBAAQ,KAAK,YAAY,OAAO,OAAO;AACvC,iBAAK,iBAAiB;AAAA,UACxB;AAAA,QACF,GAAG,SAAS,UAAU;AACtB,cAAM,QAAQ;AAEd,aAAK,UAAU,IAAI,SAAS,IAAI;AAAA,UAC9B,MAAM,EAAE,GAAG,UAAU,SAAS,KAAK;AAAA,UACnC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEO,IAAM,+BAA+B,IAAI,6BAA6B;AAAA;AAAA;;;AChO7E;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;AC4FO,SAAS,kBAAkB,KAA+D;AAC/F,QAAM,SAAS,iBAAiB,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,OAAO,iBAAiB,CAAC,GAAG,OAAO,cAAc,IAAI;AAAA,IACrE,UAAU,CAAC,GAAG,OAAO,QAAQ;AAAA,EAC/B;AACF;AAEO,SAAS,uBAAuB,SAAqD;AAC1F,SAAQ,OAAO,KAAK,gBAAgB,EAA0B;AAAA,IAAO,CAAC,QACpE,iBAAiB,GAAG,EAAE,SAAS,SAAS,OAAO;AAAA,EACjD;AACF;AAEO,SAAS,yBAAyB;AACvC,SAAO,uBAAuB,IAAI,EAAE,OAA2D,CAAC,QAAQ,QAAQ;AAC9G,UAAM,SAAS,iBAAiB,GAAG;AACnC,WAAO,GAAG,IAAI;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,KAAK,OAAO;AAAA,MACZ,eAAe,OAAO;AAAA,MACtB,gBAAgB,OAAO,iBAAiB,CAAC,GAAG,OAAO,cAAc,IAAI,CAAC;AAAA,MACtE,cAAc,OAAO;AAAA,MACrB,iBAAiB,OAAO;AAAA,MACxB,aAAa,OAAO;AAAA,MACpB,kBAAkB,OAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAzIA,IAyBM;AAzBN;AAAA;AAAA;AAyBA,IAAM,mBAAyE;AAAA,MAC7E,YAAY;AAAA,QACV,OAAO;AAAA,QACP,KAAK;AAAA,QACL,cAAc;AAAA,QACd,WAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,QACf,gBAAgB,CAAC,6BAA6B,gBAAgB,uBAAuB;AAAA,QACrF,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,UAAU,CAAC,SAAS,IAAI;AAAA,MAC1B;AAAA,MACA,UAAU;AAAA,QACR,OAAO;AAAA,QACP,KAAK;AAAA,QACL,cAAc;AAAA,QACd,WAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,QACf,gBAAgB,CAAC,iBAAiB,mBAAmB;AAAA,QACrD,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,UAAU,CAAC,SAAS,IAAI;AAAA,MAC1B;AAAA,MACA,qBAAqB;AAAA,QACnB,OAAO;AAAA,QACP,KAAK;AAAA,QACL,cAAc;AAAA,QACd,WAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,QACf,gBAAgB,CAAC,SAAS,cAAc,SAAS;AAAA,QACjD,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,UAAU,CAAC,SAAS,IAAI;AAAA,MAC1B;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,QACP,KAAK;AAAA,QACL,cAAc;AAAA,QACd,WAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,QACf,gBAAgB,CAAC,qBAAqB,mBAAmB,yBAAyB;AAAA,QAClF,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,UAAU,CAAC,SAAS,IAAI;AAAA,MAC1B;AAAA,MACA,aAAa;AAAA,QACX,OAAO;AAAA,QACP,KAAK;AAAA,QACL,cAAc;AAAA,QACd,WAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,QACf,gBAAgB,CAAC,kBAAkB,2BAA2B,qBAAqB;AAAA,QACnF,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,UAAU,CAAC,SAAS,IAAI;AAAA,MAC1B;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,UAAU,CAAC,OAAO;AAAA,MACpB;AAAA,IACF;AAAA;AAAA;;;AC9DA,SAAS,uBAAuB,QAAmC;AACjE,QAAM,WAAW,mBAAmB,UAAU,CAAC,CAAC;AAChD,SAAO;AAAA,IACL,WAAW,SAAS,UAAU,IAAI,CAAC,cAAc;AAAA,MAC/C,MAAM,SAAS;AAAA,MACf,cAAc,SAAS;AAAA,MACvB,QAAQ,SAAS;AAAA,MACjB,aAAa,SAAS;AAAA,MACtB,aAAa,QAAQ,SAAS,OAAO;AAAA,IACvC,EAAE;AAAA,IACF,UAAU,SAAS;AAAA,EACrB;AACF;AAEA,SAAS,mBAAmB,OAAwB;AAClD,SAAO,KAAK,UAAU,KAAK,EAAE,QAAQ,MAAM,SAAS;AACtD;AAEA,SAAS,uBAAuB,QAAoC;AAClE,QAAM,OAA8B,CAAC;AACrC,QAAM,UAAU,CAAC,MAAc,UAAe;AAC5C,QAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,GAAG;AAC9C;AAAA,IACF;AACA,SAAK,KAAK;AAAA,MACR;AAAA,MACA;AAAA,MACA,eAAe,MAAM,SAAS,GAAG,IAAI,WAAW;AAAA,IAClD,CAAC;AAAA,EACH;AAEA,UAAQ,kBAAkB,QAAQ,QAAQ,OAAO;AACjD,UAAQ,8BAA8B,QAAQ,eAAe,YAAY;AACzE,UAAQ,eAAe,OAAO,QAAQ,CAAC,MAAW,UAAkB;AAClE,YAAQ,uBAAuB,KAAK,WAAW,MAAM,KAAK;AAAA,EAC5D,CAAC;AACD,UAAQ,4BAA4B,QAAQ,aAAa,YAAY;AACrE,UAAQ,aAAa,YAAY,QAAQ,CAAC,WAAgB,UAAkB;AAC1E,YAAQ,0BAA0B,KAAK,WAAW,WAAW,KAAK;AAAA,EACpE,CAAC;AACD,UAAQ,gDAAgD,QAAQ,YAAY,QAAQ,WAAW,gBAAgB;AAC/G,UAAQ,YAAY,SAAS,QAAQ,QAAQ,CAAC,OAAY,UAAkB;AAC1E,YAAQ,6BAA6B,KAAK,UAAU,OAAO,IAAI;AAC/D,YAAQ,6BAA6B,KAAK,QAAQ,OAAO,EAAE;AAAA,EAC7D,CAAC;AACD,UAAQ,wCAAwC,QAAQ,YAAY,UAAU,gBAAgB;AAC9F,UAAQ,oCAAoC,QAAQ,YAAY,QAAQ,cAAc;AAEtF,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAgB,aAAqB,WAAgB;AACnF,QAAM,aAAa,OAAO,UAAU,EAAE,EAAE,YAAY;AACpD,QAAM,gBAAgB,GAAG,WAAW,IAAI,WAAW,aAAa,EAAE,GAAG,YAAY;AACjF,MAAI,QAAQ;AAEZ,MAAI,YAAY,YAAY,MAAM,YAAY;AAC5C,aAAS;AAAA,EACX;AACA,MAAI,YAAY,YAAY,EAAE,SAAS,UAAU,KAAK,WAAW,SAAS,YAAY,YAAY,CAAC,GAAG;AACpG,aAAS;AAAA,EACX;AAEA,QAAM,cAAc,WAAW,MAAM,YAAY,EAAE,OAAO,OAAO;AACjE,cAAY,QAAQ,CAAC,SAAS;AAC5B,QAAI,cAAc,SAAS,IAAI,GAAG;AAChC,eAAS,KAAK,IAAI,KAAK,SAAS,GAAG,EAAE;AAAA,IACvC;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAe,cAAoC;AACjF,SAAO,OAAO,QAAQ,aAAa,YAAY,CAAC,CAAC,EAC9C,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO;AAAA,IACzB;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,OAAO,uBAAuB,OAAO,SAAS,IAAI;AAAA,EACpD,EAAE,EACD,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,EAC/B,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC,EACtE,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,MAAM,IAAI;AACrC;AAEA,SAAS,4BAA4B,QAAa,cAAoC;AACpF,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,UAAU,WAAW,IAAI,CAAC,QAAQ;AACtC,UAAM,WAAW,IAAI,kBAAkB,YAAY,aAAa,WAAW,IAAI,KAAK,IAAI;AACxF,UAAM,cAAc,IAAI,kBAAkB,aAAa,CAAC,WACpD,uBAAuB,IAAI,OAAO,YAAY,IAC9C,CAAC;AACL,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,IAAI,kBAAkB,YACzB,WAAW,UAAU,YACtB;AAAA,MACJ,gBAAgB,WACZ;AAAA,QACE,cAAc,SAAS;AAAA,QACvB,WAAW,SAAS;AAAA,QACpB,UAAU,SAAS;AAAA,MACrB,IACA;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,aAAa,QAAQ,OAAO,CAAC,UAAU,MAAM,kBAAkB,SAAS,EAAE;AAAA,MAC1E,YAAY,QAAQ,OAAO,CAAC,UAAU,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MACxE,eAAe,QAAQ,OAAO,CAAC,UAAU,MAAM,kBAAkB,aAAa,MAAM,WAAW,OAAO,EAAE;AAAA,MACxG,iBAAiB,QAAQ,OAAO,CAAC,UAAU,MAAM,kBAAkB,aAAa,MAAM,WAAW,SAAS,EAAE;AAAA,IAC9G;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,MAA4B,MAA4B;AACpF,QAAM,gBAAgB,MAAM,KAAK,oBAAI,IAAI;AAAA,IACvC,GAAG,KAAK,UAAU,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IACzC,GAAG,KAAK,UAAU,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,EAC3C,CAAC,CAAC,EAAE,KAAK;AACT,QAAM,gBAAgB,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;AAC7E,QAAM,gBAAgB,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;AAC7E,QAAM,kBAAkB,cAAc,QAAQ,CAAC,SAAS;AACtD,UAAM,SAAS,cAAc,IAAI,IAAI;AACrC,UAAM,QAAQ,cAAc,IAAI,IAAI;AACpC,QAAI,CAAC,UAAU,OAAO;AACpB,aAAO,CAAC,EAAE,MAAM,SAAS,MAAM,QAAQ,MAAM,OAAO,QAAQ,CAAC,UAAU,EAAE,CAAC;AAAA,IAC5E;AACA,QAAI,UAAU,CAAC,OAAO;AACpB,aAAO,CAAC,EAAE,MAAM,WAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;AAAA,IAC9E;AACA,UAAM,SAAS;AAAA,MACb,QAAQ,iBAAiB,OAAO,eAAe,iBAAiB;AAAA,MAChE,KAAK,UAAU,QAAQ,UAAU,CAAC,CAAC,MAAM,KAAK,UAAU,OAAO,UAAU,CAAC,CAAC,IAAI,WAAW;AAAA,MAC1F,KAAK,UAAU,QAAQ,eAAe,CAAC,CAAC,MAAM,KAAK,UAAU,OAAO,eAAe,CAAC,CAAC,IAAI,gBAAgB;AAAA,MACzG,QAAQ,gBAAgB,OAAO,cAAc,gBAAgB;AAAA,IAC/D,EAAE,OAAO,OAAO;AAChB,WAAO,OAAO,SAAS,CAAC,EAAE,MAAM,WAAW,MAAM,QAAQ,OAAO,OAAO,CAAC,IAAI,CAAC;AAAA,EAC/E,CAAC;AAED,QAAM,WAAW,MAAM,KAAK,oBAAI,IAAI;AAAA,IAClC,GAAG,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC;AAAA,IAClC,GAAG,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC;AAAA,EACpC,CAAC,CAAC,EAAE,KAAK;AACT,QAAM,eAAe,SAAS,QAAQ,CAAC,YAAY;AACjD,UAAM,SAAS,KAAK,WAAW,OAAO;AACtC,UAAM,QAAQ,KAAK,WAAW,OAAO;AACrC,QAAI,CAAC,UAAU,OAAO;AACpB,aAAO,CAAC,EAAE,MAAM,SAAS,SAAS,QAAQ,MAAM,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC;AAAA,IAC5E;AACA,QAAI,UAAU,CAAC,OAAO;AACpB,aAAO,CAAC,EAAE,MAAM,WAAW,SAAS,QAAQ,OAAO,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;AAAA,IAC9E;AACA,UAAM,SAAS;AAAA,MACb,QAAQ,iBAAiB,OAAO,eAAe,iBAAiB;AAAA,MAChE,QAAQ,cAAc,OAAO,YAAY,cAAc;AAAA,MACvD,QAAQ,aAAa,OAAO,WAAW,aAAa;AAAA,MACpD,QAAQ,yBAAyB,OAAO,uBAAuB,yBAAyB;AAAA,MACxF,QAAQ,mBAAmB,OAAO,iBAAiB,mBAAmB;AAAA,MACtE,KAAK,UAAU,QAAQ,YAAY,CAAC,CAAC,MAAM,KAAK,UAAU,OAAO,YAAY,CAAC,CAAC,IAAI,aAAa;AAAA,MAChG,KAAK,UAAU,QAAQ,gBAAgB,CAAC,CAAC,MAAM,KAAK,UAAU,OAAO,gBAAgB,CAAC,CAAC,IAAI,iBAAiB;AAAA,MAC5G,QAAQ,WAAW,OAAO,SAAS,WAAW;AAAA,IAChD,EAAE,OAAO,OAAO;AAChB,WAAO,OAAO,SAAS,CAAC,EAAE,MAAM,WAAW,SAAS,QAAQ,OAAO,OAAO,CAAC,IAAI,CAAC;AAAA,EAClF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB,gBAAgB,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EAAE;AAAA,MACxE,kBAAkB,gBAAgB,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,EAAE;AAAA,MAC5E,kBAAkB,gBAAgB,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,EAAE;AAAA,MAC5E,aAAa,aAAa,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EAAE;AAAA,MAClE,eAAe,aAAa,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,EAAE;AAAA,MACtE,eAAe,aAAa,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,EAAE;AAAA,IACxE;AAAA,EACF;AACF;AAhOA,IAMA,aA+Na;AArOb;AAAA;AAAA;AAMA,kBAAmB;AACnB;AACA;AACA;AACA;AAMA;AACA;AAoNO,IAAM,eAAe,CAAC,WAAwB;AACnD,YAAM,SAAS,IAAI,YAAAC,QAAO,MAAM;AAChC,YAAM,uBAAuB,OAAO,eAAe,YAAY,eAAe,sBAAsB,CAAC;AAErG,YAAM,6BAA6B,CAAC,UAAe;AACjD,cAAM,QAAQ,OAAO,QAAQ,OAAO,MAAM,KAAK,IAAI;AACnD,cAAM,WAAW,OAAO,WAAW,OAAO,MAAM,QAAQ,IAAI;AAC5D,cAAM,cAAc,OAAO,cAAc,OAAO,MAAM,WAAW,IAAI;AACrE,cAAM,MAAM,OAAO,MAAM,OAAO,MAAM,GAAG,IAAI;AAC7C,cAAM,mBAAmB,OAAO,qBAAqB,SACjD,SACA,OAAO,MAAM,gBAAgB,EAAE,YAAY,MAAM;AACrD,cAAM,gBAAgB,OAAO,kBAAkB,SAC3C,SACA,OAAO,MAAM,aAAa,EAAE,YAAY,MAAM;AAElD,eAAO;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,YAAY,OAAO;AAAA,UACnB,aAAa,OAAO;AAAA,UACpB;AAAA,UACA;AAAA,UACA,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,UACxC,UAAU,OAAO,SAAS,QAAQ,IAAI,WAAW;AAAA,UACjD,aAAa,OAAO,SAAS,WAAW,IAAI,cAAc;AAAA,UAC1D,KAAK,OAAO,SAAS,GAAG,IAAI,MAAM;AAAA,UAClC,mBAAmB;AAAA,YACjB,eAAe,OAAO,gBAAgB,OAAO,MAAM,aAAa,IAAI,qBAAqB;AAAA,YACzF,iBAAiB,OAAO,kBAAkB,OAAO,MAAM,eAAe,IAAI,qBAAqB;AAAA,YAC/F,qBAAqB,OAAO,sBAAsB,OAAO,MAAM,mBAAmB,IAAI,qBAAqB;AAAA,YAC3G,gBAAgB,OAAO,iBAAiB,OAAO,MAAM,cAAc,IAAI,qBAAqB;AAAA,YAC5F,oBAAoB,OAAO,qBAAqB,OAAO,MAAM,kBAAkB,IAAI,qBAAqB;AAAA,YACxG,eAAe,OAAO,gBAAgB,OAAO,MAAM,aAAa,IAAI,qBAAqB;AAAA,YACzF,mBAAmB,OAAO,oBAAoB,OAAO,MAAM,iBAAiB,IAAI,qBAAqB;AAAA,YACrG,eAAe,OAAO,gBAAgB,OAAO,MAAM,aAAa,IAAI,qBAAqB;AAAA,YACzF,gBAAgB,OAAO,iBAAiB,OAAO,MAAM,cAAc,IAAI,qBAAqB;AAAA,UAC9F;AAAA,QACF;AAAA,MACF;AAGA,aAAO,IAAI,IAAI,eAAe,OAAO,KAAU,UAAe;AAC5D,eAAO,MAAM,eAAe;AAAA,MAC9B,CAAC;AAED,aAAO,IAAI,IAAI,wBAAwB,YAAY;AACjD,cAAM,mBAAmB,2BAA2B,OAAO,iBAAiB,CAAC,CAAC;AAC9E,cAAM,aAAa,iBAAiB;AACpC,cAAM,WAAW,uBAAuB,UAAU;AAClD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,oBAAoB,0BAA0B,UAAU;AAAA,UACxD,UAAU,iBAAiB;AAAA,QAC7B;AAAA,MACF,CAAC;AAED,aAAO,IAAI,KAAK,gCAAgC,OAAO,KAAU,UAAe;AAC9E,cAAM,YAAY,IAAI,QAAQ,CAAC;AAC/B,YAAI,cAA2C;AAC/C,YAAI;AACF,wBAAc,uBAAuB,SAAS;AAAA,QAChD,SAAS,QAAQ;AACf,wBAAc;AAAA,QAChB;AAEA,cAAM,SAAS,2BAA2B,SAAS;AACnD,YAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAM,KAAK,GAAG;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,YACT,QAAQ,OAAO;AAAA,YACf,iBAAiB,cAAc,4BAA4B,WAAW,WAAW,IAAI;AAAA,YACrF,oBAAoB,cAAc,0BAA0B,SAAS,IAAI;AAAA,YACzE,UAAU,OAAO;AAAA,UACnB;AAAA,QACF;AAEA,cAAM,kBAAkB,uBAAuB,OAAO,iBAAiB,CAAC,CAAC;AACzE,cAAM,kBAAkB,uBAAuB,OAAO,MAAM;AAC5D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,WAAW,gBAAgB;AAAA,UAC3B,UAAU,gBAAgB;AAAA,UAC1B,kBAAkB,OAAO;AAAA,UACzB,MAAM,qBAAqB,iBAAiB,eAAe;AAAA,UAC3D,iBAAiB,4BAA4B,OAAO,QAAQ,eAAe;AAAA,UAC3E,oBAAoB,0BAA0B,OAAO,MAAM;AAAA,UAC3D,UAAU,OAAO;AAAA,QACnB;AAAA,MACF,CAAC;AAED,aAAO,IAAI,IAAI,eAAe,YAAY;AACxC,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAM,OAAO,eAAe;AAAA,QAC9B;AAAA,MACF,CAAC;AAED,aAAO,IAAI,IAAI,0BAA0B,OAAO,QAAa;AAC3D,cAAM,QAAQ,IAAI,OAAO,QAAQ,OAAO,IAAI,MAAM,KAAK,IAAI;AAC3D,cAAM,mBAAmB,IAAI,OAAO,qBAAqB,SACrD,SACA,OAAO,IAAI,MAAM,gBAAgB,EAAE,YAAY,MAAM;AACzD,cAAM,gBAAgB,IAAI,OAAO,kBAAkB,SAC/C,SACA,OAAO,IAAI,MAAM,aAAa,EAAE,YAAY,MAAM;AACtD,eAAO;AAAA,UACL,QAAQ,qBAAqB,KAAK;AAAA,YAChC,WAAW,IAAI,OAAO;AAAA,YACtB,YAAY,IAAI,OAAO;AAAA,YACvB,aAAa,IAAI,OAAO;AAAA,YACxB;AAAA,YACA;AAAA,YACA,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,UAC1C,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAED,aAAO,IAAI,IAAI,2BAA2B,OAAO,QAAa;AAC5D,eAAO;AAAA,UACL,GAAG,2BAA2B,2BAA2B,IAAI,KAAK,CAAC;AAAA,QACrE;AAAA,MACF,CAAC;AAED,aAAO,IAAI,IAAI,kCAAkC,OAAO,KAAU,UAAe;AAC/E,cAAM,SAAS,OAAO,IAAI,OAAO,UAAU,MAAM,EAAE,YAAY,MAAM,QAAQ,QAAQ;AACrF,cAAM,SAAS,2BAA2B,2BAA2B,IAAI,KAAK,CAAC;AAC/E,cAAM,UAAU,8BAA8B,QAAQ,MAAM;AAE5D,cAAM;AAAA,UACJ;AAAA,UACA,WAAW,QAAQ,4BAA4B;AAAA,QACjD;AACA,cAAM;AAAA,UACJ;AAAA,UACA,4CAA4C,MAAM;AAAA,QACpD;AACA,eAAO,MAAM,KAAK,OAAO;AAAA,MAC3B,CAAC;AAED,aAAO,IAAI,IAAI,mCAAmC,YAAY;AAC5D,eAAO;AAAA,UACL,SAAS,6BAA6B,YAAY;AAAA,UAClD,WAAW,6BAA6B,cAAc;AAAA,QACxD;AAAA,MACF,CAAC;AAED,aAAO,IAAI,KAAK,qCAAqC,OAAO,QAAa;AACvE,cAAM,SAAS,OAAO,IAAI,MAAM,UAAU,MAAM,EAAE,YAAY,MAAM,QAAQ,QAAQ;AACpF,cAAM,SAAS,6BAA6B;AAAA,UAC1C,2BAA2B,IAAI,QAAQ,CAAC,CAAC;AAAA,UACzC;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF,CAAC;AAED,aAAO,IAAI,KAAK,qCAAqC,OAAO,KAAU,UAAe;AACnF,cAAM,aAAa,OAAO,IAAI,MAAM,UAAU;AAC9C,YAAI,CAAC,OAAO,SAAS,UAAU,KAAK,aAAa,KAAM;AACrD,gBAAM,KAAK,GAAG;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,SAAS,OAAO,IAAI,MAAM,UAAU,MAAM,EAAE,YAAY,MAAM,QAAQ,QAAQ;AACpF,cAAM,WAAW,6BAA6B;AAAA,UAC5C;AAAA,UACA,2BAA2B,IAAI,QAAQ,CAAC,CAAC;AAAA,UACzC;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,IAAI,KAAK,oDAAoD,OAAO,KAAU,UAAe;AAClG,cAAM,gBAAgB,MAAM,eAAe;AAC3C,cAAM,aAAa;AAAA,UACjB,GAAG;AAAA,UACH,YAAY;AAAA,YACV,GAAI,cAAc,cAAc,EAAE,SAAS,MAAM;AAAA,YACjD,eAAe;AAAA,cACb,GAAI,cAAc,YAAY,iBAAiB,CAAC;AAAA,cAChD,oBAAoB;AAAA,gBAClB,GAAI,cAAc,YAAY,eAAe,sBAAsB,CAAC;AAAA,gBACpE,GAAI,IAAI,QAAQ,CAAC;AAAA,cACnB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,SAAS,2BAA2B,UAAU;AACpD,YAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAM,KAAK,GAAG;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,YACT,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF;AAEA,cAAM,aAAa,MAAM,iBAAiB;AAC1C,YAAI,YAAY;AACd,cAAI,4CAA4C,UAAU,EAAE;AAAA,QAC9D;AAEA,cAAM,gBAAgB,OAAO,MAAM;AACnC,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,oBAAoB,OAAO,OAAO,YAAY,eAAe,sBAAsB,CAAC;AAAA,QACtF;AAAA,MACF,CAAC;AAED,aAAO,IAAI,IAAI,qCAAqC,OAAO,KAAU,UAAe;AAClF,cAAM,QAAQ,qBAAqB,IAAI,IAAI,OAAO,SAAS;AAC3D,YAAI,CAAC,OAAO;AACV,gBAAM,KAAK,GAAG;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,MACT,CAAC;AAED,aAAO,IAAI,IAAI,4BAA4B,OAAO,QAAa;AAC7D,cAAM,QAAQ,IAAI,OAAO,QAAQ,OAAO,IAAI,MAAM,KAAK,IAAI;AAC3D,cAAM,OAAO,IAAI,OAAO,OAAO,OAAO,IAAI,MAAM,IAAI,IAAI;AACxD,cAAM,WAAW,IAAI,OAAO,WAAW,OAAO,IAAI,MAAM,QAAQ,IAAI;AACpE,eAAO;AAAA,UACL,UAAU,qBAAqB,aAAa;AAAA,YAC1C,MAAM,IAAI,OAAO;AAAA,YACjB,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,YACxC,MAAM,OAAO,SAAS,IAAI,IAAI,OAAO;AAAA,YACrC,UAAU,OAAO,SAAS,QAAQ,IAAI,WAAW;AAAA,UACnD,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAED,aAAO,IAAI,IAAI,kCAAkC,OAAO,KAAU,UAAe;AAC/E,cAAM,SAAS,qBAAqB,kBAAkB,IAAI,OAAO,IAAI;AACrE,YAAI,CAAC,OAAO,QAAQ;AAClB,gBAAM,KAAK,GAAG;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,MAAM,IAAI,OAAO;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,IAAI,KAAK,yCAAyC,OAAO,KAAU,UAAe;AACvF,cAAM,UAAU,qBAAqB,cAAc,IAAI,OAAO,IAAI;AAClE,YAAI,CAAC,SAAS;AACZ,gBAAM,KAAK,GAAG;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,MAAM,IAAI,OAAO;AAAA,QACnB;AAAA,MACF,CAAC;AAGD,aAAO,IAAI,IAAI,qBAAqB,YAAY;AAC9C,cAAM,eACJ,OAAO,IAAI,QAAS,mBAAmB,mBAAmB;AAC5D,cAAM,kBAAkB,MAAM,KAAK,aAAa,QAAQ,CAAC,EAAE;AAAA,UACzD,CAAC,CAAC,MAAM,WAAW,OAAsB;AAAA,YACvC;AAAA,YACA,UAAU,YAAY,YAAY;AAAA,UACpC;AAAA,QACF;AACA,eAAO,EAAE,cAAc,gBAAgB;AAAA,MACzC,CAAC;AAGD,aAAO,IAAI,KAAK,eAAe,OAAO,KAAU,UAAe;AAC7D,cAAM,SAAS,2BAA2B,IAAI,QAAQ,CAAC,CAAC;AAExD,YAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAM,KAAK,GAAG;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,YACT,QAAQ,OAAO;AAAA,YACf,UAAU,OAAO;AAAA,UACnB;AAAA,QACF;AAGA,cAAM,aAAa,MAAM,iBAAiB;AAC1C,YAAI,YAAY;AACd,cAAI,4CAA4C,UAAU,EAAE;AAAA,QAC9D;AAEA,cAAM,gBAAgB,OAAO,MAAM;AACnC,eAAO,EAAE,SAAS,MAAM,SAAS,6BAA6B,UAAU,OAAO,SAAS;AAAA,MAC1F,CAAC;AAGD,aAAO,IAAI,KAAK,gBAAgB,OAAO,KAAU,UAAe;AAC9D,cAAM,KAAK,EAAE,SAAS,MAAM,SAAS,4BAA4B,CAAC;AAKlE,mBAAW,MAAM;AACf,gBAAM,EAAE,OAAAC,OAAM,IAAI,QAAQ,eAAe;AACzC,gBAAM,EAAE,MAAAC,MAAK,IAAI,QAAQ,MAAM;AAC/B,gBAAM,UAAUA,MAAK,WAAW,QAAQ;AAGxC,gBAAM,cAAc,OAAO,eAAe;AAC1C,gBAAM,cAAc,CAAC,SAAS,SAAS,UAAU;AACjD,cAAI,aAAa;AACf,wBAAY,KAAK,UAAU,OAAO,WAAW,CAAC;AAAA,UAChD;AAEA,UAAAD,OAAM,QAAQ,UAAU,aAAa;AAAA,YACnC,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC,EAAE,MAAM;AAGT,qBAAW,MAAM,QAAQ,KAAK,CAAC,GAAG,GAAG;AAAA,QACvC,GAAG,GAAG;AAAA,MACR,CAAC;AAGD,aAAO,IAAI,IAAI,OAAO,OAAO,GAAQ,UAAe;AAClD,cAAM,OAAO,gBAAgB,0BAA0B;AACvD,eAAO,MAAM;AAAA,UACX,oukBAmOkE,qBAAqB,mBAAmB,CAAC,8EACrC,qBAAqB,qBAAqB,GAAG,4EAC/C,qBAAqB,oBAAoB,GAAG,+EACzC,qBAAqB,mBAAmB,IAAI,+kWA8JnF,mBAAmB,uBAAuB,CAAC,CAAC;AAAA,QAyzB9E;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAAA;AAAA;;;ACxwDA,IAWA,iBAMM,KAKA,qBAyDA,aA4EA,oBAwCO;AAnMb;AAAA;AAAA;AAWA,sBAA6B;AAE7B;AACA;AACA;AAEA,IAAM,UAAM,8BAAa,aAAa;AAKtC,IAAM,sBAAsB,CAC1B,UACA,QACA,UACG;AACH,UAAI,aAAa;AACjB,UAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,iBAAS,QAAQ,CAAC,YAAY;AAC5B,cAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,0BAAc,IAAI,OAAO,QAAQ,OAAO,EAAE;AAAA,UAC5C,WAAW,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACzC,oBAAQ,QAAQ,QAAQ,CAAC,gBAAqB;AAC5C,kBAAI,YAAY,SAAS,QAAQ;AAC/B,8BAAc,IAAI,OAAO,YAAY,IAAI,EAAE;AAAA,cAC7C,WAAW,YAAY,SAAS,YAAY;AAC1C,8BAAc,IAAI,OAAO,KAAK,UAAU,YAAY,KAAK,CAAC,EAAE;AAAA,cAC9D,WAAW,YAAY,SAAS,eAAe;AAC7C,8BAAc,IAAI;AAAA,kBAChB,OAAO,YAAY,YAAY,WAC3B,YAAY,UACZ,KAAK,UAAU,YAAY,OAAO;AAAA,gBACxC,EAAE;AAAA,cACJ;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,OAAO,WAAW,UAAU;AAC9B,sBAAc,IAAI,OAAO,MAAM,EAAE;AAAA,MACnC,WAAW,MAAM,QAAQ,MAAM,GAAG;AAChC,eAAO,QAAQ,CAAC,SAAc;AAC5B,cAAI,KAAK,SAAS,OAAQ;AAC1B,cAAI,OAAO,KAAK,SAAS,UAAU;AACjC,0BAAc,IAAI,OAAO,KAAK,IAAI,EAAE;AAAA,UACtC,WAAW,MAAM,QAAQ,KAAK,IAAI,GAAG;AACnC,iBAAK,KAAK,QAAQ,CAAC,aAAkB;AACnC,4BAAc,IAAI,OAAO,YAAY,EAAE,EAAE;AAAA,YAC3C,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,OAAO;AACT,cAAM,QAAQ,CAAC,SAAe;AAC5B,cAAI,KAAK,aAAa;AACpB,0BAAc,IAAI,OAAO,KAAK,OAAO,KAAK,WAAW,EAAE;AAAA,UACzD;AACA,cAAI,KAAK,cAAc;AACrB,0BAAc,IAAI,OAAO,KAAK,UAAU,KAAK,YAAY,CAAC,EAAE;AAAA,UAC9D;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAKA,IAAM,cAAc,OAClB,KACA,YACA,QACA,cACG;AAEH,YAAM,gBAAgB,sBAAsB,QAAQ,IAAI,KAAK,KAAK;AAClE,UAAI,iBAAiB,cAAc,SAAS,GAAG,GAAG;AAChD,eAAO;AAAA,MACT;AAGA,YAAM,uBAAuB,OAAO,OAAO,wBAAwB;AACnE,YAAM,qBACJ,aACA,UAAU,eAAe,wBACzB,aAAa;AACf,YAAM,sBAAsB,aAAa;AACzC,WACG,sBAAsB,wBACvB,OAAO,OAAO,aACd;AACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,eAAO,sBAAsB,QAAQ,OAAO,OAAO,WAAW;AAAA,MAChE;AAGA,UACE,IAAI,MAAM,QAAQ,SAAS,KAC3B,IAAI,MAAM,OAAO,CAAC,GAAG,MAAM,WAAW,sBAAsB,GAC5D;AACA,cAAM,QAAQ,IAAI,MAAM,OAAO,CAAC,EAAE,KAAK;AAAA,UACrC;AAAA,QACF;AACA,YAAI,OAAO;AACT,cAAI,KAAK,OAAO,CAAC,EAAE,OAAO,IAAI,KAAK,OAAO,CAAC,EAAE,KAAK;AAAA,YAChD,uBAAuB,MAAM,CAAC,CAAC;AAAA,YAC/B;AAAA,UACF;AACA,iBAAO,sBAAsB,QAAQ,MAAM,CAAC,CAAC;AAAA,QAC/C;AAAA,MACF;AAGA,UACE,IAAI,KAAK,OAAO,WAAW,kBAAkB,KAC7C,OAAO,OAAO,YACd;AACA,YAAI,+BAA+B,IAAI,KAAK,KAAK;AACjD,eAAO,sBAAsB,QAAQ,OAAO,OAAO,UAAU;AAAA,MAC/D;AAGA,UAAI,IAAI,KAAK,YAAY,OAAO,OAAO,OAAO;AAC5C,YAAI,0BAA0B,IAAI,KAAK,QAAQ;AAC/C,eAAO,sBAAsB,QAAQ,OAAO,OAAO,KAAK;AAAA,MAC1D;AAGA,UACE,MAAM,QAAQ,IAAI,KAAK,KAAK,KAC5B,IAAI,KAAK,MAAM,KAAK,CAAC,SAAc,KAAK,MAAM,WAAW,YAAY,CAAC,KACtE,OAAO,OAAO,WACd;AACA,eAAO,sBAAsB,QAAQ,OAAO,OAAO,SAAS;AAAA,MAC9D;AAEA,aAAO,sBAAsB,QAAQ,OAAO,OAAQ,OAAO;AAAA,IAC7D;AAEA,IAAM,qBAAqB,CAAC,KAAU,QAAoB,aAA4B;AACpF,YAAM,WAAW,oBAAoB,QAAQ,QAAQ;AACrD,YAAM,WAAW,UAAU;AAE3B,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,SAAS,SAAS,OAAO;AAC3B,eAAO,IAAI,KAAK;AAChB;AAAA,MACF;AAEA,UAAI,SAAS,SAAS,MAAM;AAC1B,YAAI,KAAK,WAAW;AAAA,UAClB,GAAI,OAAO,IAAI,KAAK,aAAa,YAAY,IAAI,KAAK,WAAW,IAAI,KAAK,WAAW,EAAE,MAAM,UAAU;AAAA,UACvG,MAAM;AAAA,QACR;AAAA,MACF;AAEA,UAAI,SAAS,SAAS,UAAU,CAAC,IAAI,KAAK,UAAU;AAClD;AAAA,MACF;AAEA,UAAI,CAAC,IAAI,KAAK,UAAU;AACtB,YAAI,KAAK,WAAW,EAAE,MAAM,UAAU;AAAA,MACxC;AAEA,UAAI,SAAS,QAAQ;AACnB,YAAI,KAAK,SAAS,SAAS,SAAS;AAAA,MACtC;AAEA,UAAI,SAAS,eAAe;AAC1B,YAAI,KAAK,SAAS,gBAAgB,SAAS;AAAA,MAC7C;AAAA,IACF;AAKO,IAAM,SAAS,OAAO,KAAU,MAAW,YAAiB;AACjE,YAAM,EAAE,QAAQ,OAAAE,OAAM,IAAI;AAG1B,UAAI,IAAI,KAAK,UAAU,SAAS;AAC9B,cAAM,QAAQ,IAAI,KAAK,SAAS,QAAQ,MAAM,WAAW;AACzD,YAAI,MAAM,SAAS,GAAG;AACpB,cAAI,YAAY,MAAM,CAAC;AAAA,QACzB;AAAA,MACF;AAEA,YAAM,mBAAmB,kBAAkB,IAAI,IAAI,SAAS;AAC5D,YAAM,EAAE,UAAU,SAAS,CAAC,GAAG,MAAM,IAA6B,IAAI;AAEtE,UAAI;AACF,cAAM,aAAa;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI;AAGJ,YAAI,OAAO,sBAAsB,CAAC,IAAI,KAAK,MAAM,SAAS,GAAG,GAAG;AAC9D,cAAI;AACF,kBAAM,eAAe,QAAQ,OAAO,kBAAkB;AACtD,gBAAI,aAAa;AACjB,oBAAQ,MAAM,aAAa,KAAK,QAAQ;AAAA,cACtC,OAAAA;AAAA,YACF,CAAC;AAAA,UACH,SAAS,GAAQ;AACf,qBAAS,gCAAgC,EAAE,OAAO;AAAA,UACpD;AAAA,QACF;AAGA,YAAI,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,SAAS,GAAG,GAAG;AAC3C,kBAAQ,MAAM,YAAY,KAAK,YAAY,QAAQ,gBAAgB;AAAA,QACrE;AAGA,YAAI,KAAK,QAAQ,SAAS,IAAI,KAAK;AACnC,2BAAmB,KAAK,QAAQ,IAAI,KAAK,KAAK;AAC9C,YAAI,aAAa;AAAA,MACnB,SAAS,OAAY;AACnB,iBAAS,+BAA+B,MAAM,OAAO;AACrD,YAAI,KAAK,QAAQ,OAAO,OAAQ;AAAA,MAClC;AAEA;AAAA,IACF;AAAA;AAAA;;;AC1OO,SAAS,WAAW,QAAoB;AAC7C,SAAO,CAAC,KAAqB,OAAqB,SAAgC;AAEhF,QAAI,CAAC,OAAO,QAAQ;AAClB,WAAK;AACL;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,QAAQ;AAC/B,UAAM,UAAU,IAAI,QAAQ,WAAW;AAEvC,QAAI;AAEJ,QAAI,YAAY,WAAW,SAAS,GAAG;AACrC,oBAAc,WAAW,MAAM,CAAC;AAAA,IAClC,WAAW,SAAS;AAClB,oBAAc;AAAA,IAChB;AAEA,QAAI,CAAC,eAAe,gBAAgB,OAAO,QAAQ;AACjD,YAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,eAAe,CAAC;AAC9C,WAAK,IAAI,MAAM,cAAc,CAAC;AAC9B;AAAA,IACF;AAEA,SAAK;AAAA,EACP;AACF;AAxCA;AAAA;AAAA;AAAA;AAAA;;;ACcA,SAAS,eAAe,KAAsB;AAC5C,MAAI;AACF,QAAI,QAAQ,aAAa,SAAS;AAEhC,YAAM,aAAS,gCAAU,YAAY,CAAC,OAAO,UAAU,GAAG,IAAI,OAAO,OAAO,KAAK,GAAG;AAAA,QAClF,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AACD,aAAO,OAAO,QAAQ,SAAS,IAAI,GAAG,GAAG,KAAK;AAAA,IAChD,OAAO;AAEL,cAAQ,KAAK,KAAK,CAAC;AACnB,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,mBAAmB,KAAa,YAAY,KAAwB;AACxF,QAAM,YAAY,KAAK,IAAI;AAC3B,SAAO,KAAK,IAAI,IAAI,YAAY,WAAW;AACzC,QAAI,CAAC,eAAe,GAAG,GAAG;AACxB,aAAO;AAAA,IACT;AACA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,EACzD;AACA,SAAO,CAAC,eAAe,GAAG;AAC5B;AAKO,SAAS,YAAY,KAAmB;AAC7C,MAAI,QAAQ,aAAa,SAAS;AAChC,wCAAU,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG,EAAE,SAAS,IAAK,CAAC;AAAA,EACtE,OAAO;AACL,QAAI;AACF,cAAQ,KAAK,KAAK,SAAS;AAAA,IAC7B,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAKO,SAAS,mBAA4B;AAC1C,QAAM,OAAO,gBAAgB;AAC7B,MAAI,CAAC,QAAQ,MAAM,KAAK,GAAG,KAAK,KAAK,OAAO,GAAG;AAC7C,mBAAe;AACf,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,KAAK,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AAGA,iBAAe;AACf,SAAO;AACT;AAcO,SAAS,QAAQ,KAAa,MAAqB;AACxD,QAAM,OAAqB;AAAA,IACzB;AAAA,IACA,MAAM,QAAQC,gBAAe;AAAA,IAC7B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,gCAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAChE;AAKO,SAAS,kBAAuC;AACrD,MAAI,KAAC,uBAAW,QAAQ,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,cAAU,yBAAa,UAAU,OAAO,EAAE,KAAK;AAErD,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,aAAO,EAAE,KAAK,SAAS,SAAS,EAAE,GAAG,MAAMA,gBAAe,MAAM,WAAW,GAAG;AAAA,IAChF;AACA,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,iBAAuB;AACrC,UAAI,uBAAW,QAAQ,GAAG;AACxB,QAAI;AACF,iCAAW,QAAQ;AAAA,IACrB,SAAS,OAAO;AACd,eAAS,+BAA+B,KAAK;AAAA,IAC/C;AAAA,EACF;AACF;AA/HA,IAMAC,YACA;AAPA;AAAA;AAAA;AAMA,IAAAA,aAAoE;AACpE,2BAA0B;AAC1B;AACA;AAAA;AAAA;;;ACTA,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,yBAAN,MAA6B;AAAA,MAClC,cAAc;AACZ,cAAM,kBAAkB,IAAI,gBAAgB;AAAA,UAC1C,WAAW,CAACC,QAAY,eAAe;AACrC,gBAAIC,UAAS;AAEb,gBAAID,OAAM,OAAO;AACf,cAAAC,WAAU,UAAUD,OAAM,KAAK;AAAA;AAAA,YACjC;AAEA,gBAAIA,OAAM,MAAM;AACd,oBAAM,UACJ,OAAOA,OAAM,SAAS,WAClBA,OAAM,OACN,KAAK,UAAUA,OAAM,IAAI;AAC/B,cAAAC,WAAU,SAAS,OAAO;AAAA;AAAA,YAC5B;AAEA,YAAAA,WAAU;AAEV,uBAAW,QAAQ,IAAI,YAAY,EAAE,OAAOA,OAAM,CAAC;AAAA,UACrD;AAAA,QACF,CAAC;AAGD,aAAK,WAAW,gBAAgB;AAChC,aAAK,WAAW,gBAAgB;AAAA,MAClC;AAAA,MAEA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;AC3BO,SAAS,cACd,QACA,SAIgB;AAChB,QAAM,SAAS,OAAO,UAAU;AAEhC,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,MAAM,YAAY;AACtB,UAAI;AACF,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,cAAI,MAAM;AACR,uBAAW,MAAM;AACjB;AAAA,UACF;AAEA,gBAAM,SAAS,MAAM,QAAQ,OAAO,UAAU;AAE9C,cAAI,WAAW,QAAW;AACxB,uBAAW,QAAQ,MAAM;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,mBAAW,MAAM,KAAK;AAAA,MACxB,UAAE;AACA,eAAO,YAAY;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AA3CA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAOAC,mBAYM,YAoCA,YAKO,YAqMA;AAjQb;AAAA;AAAA;AAOA,IAAAA,oBAAyB;AACzB;AACA;AAUA,IAAM,aAAN,MAAiB;AAAA,MACP;AAAA,MAER,YAAY,UAAU,KAAK;AACzB,aAAK,QAAQ,IAAI,2BAAS;AAAA,UACxB,KAAK;AAAA,UACL,KAAK,KAAK,KAAK,KAAK;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,MAEA,WAAW,IAAY,QAAmB;AACxC,YAAI,KAAK,SAAS,EAAE,EAAG;AACvB,aAAK,MAAM,IAAI,IAAI;AAAA,UACjB;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,MAEA,SAAS,IAAiB;AACxB,cAAM,QAAQ,KAAK,MAAM,IAAI,EAAE;AAC/B,eAAO,QAAQ,MAAM,SAAS;AAAA,MAChC;AAAA,MAEA,SAAS,MAAuB;AAC9B,eAAO,KAAK,MAAM,IAAI,IAAI;AAAA,MAC5B;AAAA,MAEA,QAAc;AACZ,aAAK,MAAM,MAAM;AAAA,MACnB;AAAA,MAEA,OAAe;AACb,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA,IACF;AAEA,IAAM,aAAa,IAAI,WAAW;AAK3B,IAAM,aAAN,MAAmC;AAAA,MACxC,OAAO;AAAA,MACP;AAAA,MAEA,cAAc;AACZ,aAAK,QAAQ,oBAAI,IAAmB;AACpC,aAAK,YAAY;AAAA,MACnB;AAAA,MAEA,aAAa,KAAU,QAAsB;AAC3C,YAAI,CAAC,OAAO,QAAQ,SAAS,IAAI,KAAK,UAAU,OAAO,OAAO;AAC5D,iBAAO;AAET,cAAM,cAAc,IAAI,KAAK,SAAS,IAAI,KAAK,SAAS,SAAS,CAAC;AAElE,YACE,CAAC,OAAO,sBACR,YAAY,SAAS,UACrB,MAAM,QAAQ,YAAY,OAAO,KACjC,YAAY,QAAQ,KAAK,CAAC,SAAc,KAAK,SAAS,OAAO,GAC7D;AACA,cAAI,KAAK,QAAQ,OAAO,OAAO;AAC/B,iBAAO;AAAA,QACT;AAEA,eAAO,IAAI,KAAK,SAAS;AAAA,UACvB,CAAC,QACC,IAAI,SAAS,UACb,MAAM,QAAQ,IAAI,OAAO,KACzB,IAAI,QAAQ,KAAK,CAAC,SAAc,KAAK,SAAS,OAAO;AAAA,QACzD;AAAA,MACF;AAAA,MAEA,cAAc;AACZ,aAAK,MAAM,IAAI,gBAAgB;AAAA,UAC7B,MAAM;AAAA,UACN,aACE;AAAA,UACF,cAAc;AAAA,YACZ,MAAM;AAAA,YACN,YAAY;AAAA,cACV,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb,OAAO;AAAA,kBACL,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,cACA,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aACE;AAAA,cACJ;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,YAAY;AAAA,oBACV,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,aAAa;AAAA,oBACf;AAAA,oBACA,GAAG,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,oBACjD,GAAG,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,oBACjD,GAAG,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,oBACxD,GAAG,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,oBACzD,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,MAAM,CAAC,MAAM,KAAK;AAAA,sBAClB,aAAa;AAAA,oBACf;AAAA,kBACF;AAAA,kBACA,UAAU,CAAC,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,gBACxC;AAAA,cACF;AAAA,YACF;AAAA,YACA,UAAU,CAAC,WAAW,MAAM;AAAA,UAC9B;AAAA,UACA,SAAS,OAAO,MAAM,YAAY;AAChC,qBAAS,sBAAsB,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC5D,kBAAM,gBAAgB,CAAC;AACvB,gBAAI;AAEJ,gBAAI,KAAK,WAAW,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC/C,mBAAK,QAAQ,QAAQ,CAAC,UAAkB;AACtC,sBAAM,QAAQ,WAAW;AAAA,kBACvB,GAAG,QAAQ,IAAI,EAAE,UAAU,KAAK;AAAA,gBAClC;AACA,oBAAI,OAAO;AACT,gCAAc,KAAK;AAAA,oBACjB,MAAM;AAAA,oBACN,QAAQ;AAAA,kBACV,CAAC;AAAA,gBACH;AAAA,cACF,CAAC;AACD,wBAAU,KAAK;AACf,qBAAO,KAAK;AAAA,YACd;AAEA,gBAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,4BAAc,KAAK;AAAA,gBACjB,MAAM;AAAA,gBACN,MAAM,KAAK,UAAU,IAAI;AAAA,cAC3B,CAAC;AAAA,YACH;AAEA,kBAAM,gBAAgB,MAAM;AAAA,cAC1B,oBAAoB,QAAQ,OAAO,IAAI;AAAA,cACvC;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,kBACP,aAAa,QAAQ,OAAO;AAAA,kBAC5B,gBAAgB;AAAA,gBAClB;AAAA,gBACA,MAAM,KAAK;AAAA,kBACT,2BAA2B;AAAA,oBACzB,OAAO,QAAQ,OAAO,OAAO;AAAA,oBAC7B,QAAQ;AAAA,oBACR,IAAI;AAAA,sBACF,QAAQ;AAAA,wBACN;AAAA;AAAA;AAAA;AAAA,sBAIF;AAAA,sBACA,UAAU;AAAA,wBACR;AAAA,0BACE,MAAM;AAAA,0BACN,OAAO,cAAc;AAAA,4BAAI,CAAC,SACxB,KAAK,SAAS,UACV,EAAE,MAAM,SAAS,QAAQ,KAAK,OAAO,IACrC,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,0BACtC;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF,EACG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EACxB,MAAM,CAAC,QAAQ;AACd,qBAAO;AAAA,YACT,CAAC;AAEH,kBAAM,WAAW;AACjB,qBAAS,0BAA0B,UAAU,OAAO;AACpD,gBAAI,CAAC,YAAY,CAAC,SAAS,SAAS;AAClC,qBAAO;AAAA,YACT;AACA,mBAAO,SAAS,QAAQ,CAAC,EAAE;AAAA,UAC7B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEA,WAAW,KAAU,QAAa;AAChC,YAAI,MAAM,QAAQ,KAAK;AAAA,UACrB,MAAM;AAAA,UACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWR,CAAC;AAED,cAAM,gBAAgB,IAAI,KAAK,SAAS,OAAO,CAAC,SAAc;AAC5D,iBACE,KAAK,SAAS,UACd,MAAM,QAAQ,KAAK,OAAO,KAC1B,KAAK,QAAQ,KAAK,CAAC,QAAa,IAAI,SAAS,OAAO;AAAA,QAExD,CAAC;AAED,YAAI,QAAQ;AACZ,sBAAc,QAAQ,CAAC,SAAc;AACnC,eAAK,QAAQ,QAAQ,CAAC,QAAa;AACjC,gBAAI,IAAI,SAAS,SAAS;AACxB,yBAAW,WAAW,GAAG,IAAI,EAAE,UAAU,KAAK,IAAI,IAAI,MAAM;AAC5D,kBAAI,OAAO;AACX,qBAAO,IAAI;AACX,kBAAI,OAAO,WAAW,KAAK;AAC3B;AAAA,YACF,WAAW,IAAI,SAAS,UAAU,IAAI,KAAK,SAAS,UAAU,GAAG;AAC/D,kBAAI,OAAO,IAAI,KAAK,QAAQ,mBAAmB,EAAE;AAAA,YACnD;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEO,IAAM,aAAa,IAAI,WAAW;AAAA;AAAA;;;ACjQzC,IAYM,eAoCA,eAGC;AAnDP;AAAA;AAAA;AAOA;AAKA,IAAM,gBAAN,MAAoB;AAAA,MACV,SAA8B,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,MAK9C,cAAc,OAAqB;AACjC,aAAK,OAAO,IAAI,MAAM,MAAM,KAAK;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,SAAS,MAAkC;AACzC,eAAO,KAAK,OAAO,IAAI,IAAI;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,eAAyB;AACvB,eAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,MACxC;AAAA;AAAA;AAAA;AAAA,MAKA,cAAqB;AACnB,cAAM,WAAkB,CAAC;AACzB,mBAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,mBAAS,KAAK,GAAG,MAAM,MAAM,OAAO,CAAC;AAAA,QACvC;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,IAAM,gBAAgB,IAAI,cAAc;AACxC,kBAAc,cAAc,UAAU;AAEtC,IAAO,iBAAQ;AAAA;AAAA;;;ACnDf,IAAAC,cAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAOAC,mBAOM,YAQO,gBA6IA;AAnKb;AAAA;AAAA;AAOA,IAAAA,oBAAyB;AACzB;AAMA,IAAM,aAAa,IAAI,2BAAyB;AAAA,MAC9C,KAAK;AAAA,MACL,KAAK,MAAO,KAAK;AAAA;AAAA,IACnB,CAAC;AAKM,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAU1B,WACE,MACA,UACA,gBAAyB,OACX;AACd,YAAI,CAAC,QAAQ,CAAC,YAAY,SAAS,WAAW,GAAG;AAC/C,iBAAO,EAAE,SAAS,MAAM;AAAA,QAC1B;AAEA,cAAM,aAAa,gBAAgB,OAAO,KAAK,YAAY;AAE3D,mBAAW,WAAW,UAAU;AAC9B,cAAI,CAAC,QAAS;AAEd,gBAAM,gBAAgB,gBAAgB,UAAU,QAAQ,YAAY;AAEpE,cAAI,WAAW,SAAS,aAAa,GAAG;AACtC,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,gBAAgB;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAEA,eAAO,EAAE,SAAS,MAAM;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,WAAW,MAAc,SAA+B;AACtD,YAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,iBAAO,EAAE,SAAS,MAAM;AAAA,QAC1B;AAEA,YAAI;AAEF,cAAI,QAAQ,WAAW,IAAI,OAAO;AAElC,cAAI,CAAC,OAAO;AAEV,oBAAQ,IAAI,OAAO,SAAS,IAAI;AAChC,uBAAW,IAAI,SAAS,KAAK;AAAA,UAC/B;AAGA,gBAAM,YAAY;AAElB,gBAAM,QAAQ,MAAM,KAAK,IAAI;AAE7B,cAAI,OAAO;AACT,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,mBAAS,2CAA2C,OAAO,IAAI,KAAK;AAAA,QACtE;AAEA,eAAO,EAAE,SAAS,MAAM;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,MAAc,SAAwC;AAC1D,YAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,iBAAO,EAAE,SAAS,MAAM;AAAA,QAC1B;AAEA,gBAAQ,QAAQ,MAAM;AAAA,UACpB,KAAK;AACH,mBAAO,KAAK;AAAA,cACV;AAAA,cACA,QAAQ,YAAY,CAAC;AAAA,cACrB,QAAQ,iBAAiB;AAAA,YAC3B;AAAA,UAEF,KAAK;AACH,gBAAI,CAAC,QAAQ,SAAS;AACpB,qBAAO,EAAE,SAAS,MAAM;AAAA,YAC1B;AACA,mBAAO,KAAK,WAAW,MAAM,QAAQ,OAAO;AAAA,UAE9C;AACE,oBAAQ,0CAA0C,QAAQ,IAAI,EAAE;AAChE,mBAAO,EAAE,SAAS,MAAM;AAAA,QAC5B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,SAAS,MAAc,UAA2C;AAChE,YAAI,CAAC,QAAQ,CAAC,YAAY,SAAS,WAAW,GAAG;AAC/C,iBAAO,EAAE,SAAS,MAAM;AAAA,QAC1B;AAEA,mBAAW,WAAW,UAAU;AAC9B,gBAAM,SAAS,KAAK,MAAM,MAAM,OAAO;AACvC,cAAI,OAAO,SAAS;AAClB,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO,EAAE,SAAS,MAAM;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,aAAmB;AACjB,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAGO,IAAM,iBAAiB,IAAI,eAAe;AAAA;AAAA;;;ACnKjD,IAYa,iBAmIA;AA/Ib;AAAA;AAAA;AAYO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOnB,uBAAuB,SAA+B;AAC5D,YAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,iBAAO,QAAQ;AAAA,QACjB;AAEA,YAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,iBAAO,QAAQ,QACZ,OAAO,CAAC,SAAc,KAAK,SAAS,UAAU,KAAK,IAAI,EACvD,IAAI,CAAC,SAAc,KAAK,IAAI,EAC5B,KAAK,IAAI;AAAA,QACd;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,uBAAuB,UAAkC;AACvD,YAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,iBAAO;AAAA,QACT;AAGA,iBAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,gBAAM,UAAU,SAAS,CAAC;AAC1B,cAAI,QAAQ,SAAS,QAAQ;AAC3B,mBAAO,KAAK,uBAAuB,OAAO;AAAA,UAC5C;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,uBAAuB,UAAoC;AACzD,YAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,iBAAO,CAAC;AAAA,QACV;AAEA,eAAO,SACJ,OAAO,CAAC,YAAY,QAAQ,SAAS,MAAM,EAC3C,IAAI,CAAC,YAAY,KAAK,uBAAuB,OAAO,CAAC;AAAA,MAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,mBAAmB,UAA0B,OAA8B;AACzE,gBAAQ,OAAO;AAAA,UACb,KAAK;AACH,mBAAO,KAAK,uBAAuB,QAAQ;AAAA,UAE7C,KAAK;AACH,kBAAM,cAAc,KAAK,uBAAuB,QAAQ;AACxD,mBAAO,YAAY,KAAK,aAAa;AAAA,UAEvC;AACE,mBAAO,KAAK,uBAAuB,QAAQ;AAAA,QAC/C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,QAAQ,KAAsB,QAAgC;AAC5D,cAAM,WAAW,IAAI,MAAM;AAE3B,YAAI,CAAC,UAAU;AACb,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,OAAO,kBAAkB;AAEvC,eAAO,KAAK,mBAAmB,UAAU,KAAK;AAAA,MAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,eAAe,UAAmC;AAChD,YAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,iBAAO;AAAA,QACT;AAGA,cAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAChD,YAAI,YAAY,SAAS,QAAQ;AAC/B,iBAAO;AAAA,QACT;AAEA,YAAI,MAAM,QAAQ,YAAY,OAAO,GAAG;AACtC,gBAAM,cAAc,YAAY,QAAQ;AAAA,YACtC,CAAC,SAAc,KAAK,SAAS;AAAA,UAC/B;AAEA,iBAAO,YAAY,SAAS,YAAY,QAAQ,SAAS;AAAA,QAC3D;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAGO,IAAM,kBAAkB,IAAI,gBAAgB;AAAA;AAAA;;;AC/InD,IAMAC,mBASM,aAQA,wBA8BO,gBA2JA;AAhNb;AAAA;AAAA;AAMA,IAAAA,oBAAyB;AAEzB;AACA;AAMA,IAAM,cAAc,IAAI,2BAAgC;AAAA,MACtD,KAAK;AAAA,MACL,KAAK,MAAO,KAAK;AAAA;AAAA,IACnB,CAAC;AAKD,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BxB,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKlB,iBAAiB,MAAc,SAA2B;AAChE,cAAM,UAAU,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG,CAAC;AAE5C,YAAI,OAAO;AACX,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,gBAAM,OAAO,QAAQ,WAAW,CAAC;AACjC,kBAAS,QAAQ,KAAK,OAAQ;AAC9B,iBAAO,OAAO;AAAA,QAChB;AACA,eAAO,KAAK,SAAS,EAAE;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAiB,OAA+B;AACtD,eAAO,MACJ,OAAO,CAAC,SAAS,KAAK,OAAO,EAC7B,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,KAAK,KAAK,eAAe,gBAAgB,EAAE,EACvE,KAAK,IAAI;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAY,SAAiB,OAA+B;AAClE,cAAM,UAAU,KAAK,iBAAiB,KAAK;AAE3C,eAAO,uBACJ,QAAQ,aAAa,OAAO,EAC5B,QAAQ,aAAa,OAAO;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,aACJ,MACA,QACA,OAAeC,gBAAe,MAC9B,SACA,QACA,WACwB;AAExB,YAAI,CAAC,OAAO,wBAAwB;AAClC,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,YAAY;AAAA,UACd;AAAA,QACF;AAGA,YAAI,CAAC,OAAO,cAAc;AACxB,kBAAQ,gFAAgF;AACxF,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,YAAY;AAAA,UACd;AAAA,QACF;AAGA,cAAM,WAAW,KAAK,iBAAiB,MAAM,OAAO,MAAM,IAAI,OAAK,EAAE,IAAI,CAAC;AAC1E,cAAM,eAAe,YAAY,IAAI,QAAQ;AAC7C,YAAI,cAAc;AAChB,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,YAAY,WAAW;AAG7B,gBAAM,SAAS,KAAK,YAAY,MAAM,OAAO,KAAK;AAGlD,gBAAM,WAAW,MAAM,UAAU,oBAAoB,IAAI,gBAAgB;AAAA,YACvE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,GAAI,SAAS,EAAE,aAAa,OAAO,IAAI,CAAC;AAAA,YAC1C;AAAA,YACA,MAAM,KAAK,UAAU;AAAA,cACnB,OAAO,OAAO;AAAA,cACd,YAAY;AAAA,cACZ,UAAU;AAAA,gBACR;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS;AAAA,gBACX;AAAA,cACF;AAAA,YACF,CAAC;AAAA,YACD,GAAI,aAAa,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,SAAS,EAAE,IAAI,CAAC;AAAA,UACjF,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AAChB,qBAAS,wCAAwC,SAAS,MAAM;AAChE,mBAAO,EAAE,QAAQ,WAAW,YAAY,EAAE;AAAA,UAC5C;AAEA,gBAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,gBAAM,UAAU,KAAK,UAAU,CAAC,GAAG,QAAQ;AAG3C,gBAAM,YAAY,QAAQ,MAAM,aAAa;AAC7C,cAAI,CAAC,WAAW;AACd,oBAAQ,gDAAgD;AACxD,mBAAO,EAAE,QAAQ,WAAW,YAAY,EAAE;AAAA,UAC5C;AAEA,gBAAM,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;AAGtC,sBAAY,IAAI,UAAU,MAAM;AAEhC,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,mBAAS,4CAA4C,KAAK;AAC1D,iBAAO,EAAE,QAAQ,WAAW,YAAY,EAAE;AAAA,QAC5C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,iBAAiB,QAAgB,OAA4C;AAC3E,eAAO,MAAM;AAAA,UACX,CAAC,SAAS,KAAK,WAAW,KAAK,KAAK,YAAY,MAAM,OAAO,YAAY;AAAA,QAC3E,KAAK;AAAA,MACP;AAAA;AAAA;AAAA;AAAA,MAKA,aAAmB;AACjB,oBAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAGO,IAAM,iBAAiB,IAAI,eAAe;AAAA;AAAA;;;AChNjD,IAMAC,mBAqCa,qBA+KA;AA1Nb;AAAA;AAAA;AAMA,IAAAA,oBAAyB;AAEzB;AACA;AACA;AACA;AAgCO,IAAM,sBAAN,MAA0B;AAAA,MACvB;AAAA,MAER,cAAc;AACZ,aAAK,QAAQ,IAAI,2BAAqC;AAAA,UACpD,KAAK;AAAA,UACL,KAAK;AAAA;AAAA,QACP,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,iBAAiB,MAAc,aAAqB,YAAsD;AAChH,cAAM,UAAU,GAAG,IAAI,IAAI,WAAW,IAAI,WAAW,IAAI,OAAK,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC;AAChF,YAAI,OAAO;AACX,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,gBAAM,OAAO,QAAQ,WAAW,CAAC;AACjC,kBAAS,QAAQ,KAAK,OAAQ;AAC9B,iBAAO,OAAO;AAAA,QAChB;AACA,eAAO,KAAK,SAAS,EAAE;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAoB,YAAsD;AAChF,eAAO,WACJ,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE,EACvD,KAAK,IAAI;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAY,MAAc,YAA8C,MAAwC;AACtH,cAAM,WAAW;AAAA,UACf;AAAA,QACF;AAEA,YAAI,MAAM,aAAa;AACrB,mBAAS,KAAK;AAAA;AAAA,EAAuB,KAAK,WAAW;AAAA,IAAO;AAAA,QAC9D;AAEA,YAAI,MAAM,oBAAoB,QAAQ;AACpC,mBAAS;AAAA,YACP,qCACA,KAAK,mBACF;AAAA,cAAI,CAAC,WAAW,UACf,GAAG,QAAQ,CAAC,KAAK,UAAU,IAAI,OAAO,UAAU,KAAK,GAClD,UAAU,cAAc,KAAK,UAAU,WAAW,MAAM,EAAE,GAC1D,UAAU,eAAe,SAAY,gBAAgB,UAAU,UAAU,MAAM,EAAE;AAAA,YACtF,EACC,KAAK,IAAI;AAAA,UACd;AAAA,QACF;AAEA,iBAAS;AAAA,UACP;AAAA;AAAA,EAAuB,IAAI;AAAA;AAAA,UAC3B;AAAA,EAAsB,KAAK,oBAAoB,UAAU,CAAC;AAAA,UAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUF;AAEA,eAAO,SAAS,KAAK,MAAM;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAM,YACJ,MACA,QACA,OAAeC,gBAAe,MAC9B,SACA,QACA,WACA,MACoC;AAEpC,YAAI,CAAC,OAAO,SAAS;AACnB,iBAAO;AAAA,QACT;AAEA,YAAI,CAAC,OAAO,cAAc,OAAO,WAAW,SAAS,GAAG;AACtD,iBAAO;AAAA,QACT;AAGA,cAAM,WAAW,KAAK,iBAAiB,MAAM,OAAO,cAAc,OAAO,UAAU;AACnF,cAAM,SAAS,KAAK,MAAM,IAAI,QAAQ;AACtC,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,YAAY,WAAW;AAC7B,gBAAM,SAAS,KAAK,YAAY,MAAM,OAAO,YAAY,IAAI;AAE7D,gBAAM,WAAW,MAAM,UAAU,oBAAoB,IAAI,gBAAgB;AAAA,YACvE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,sBAAsB;AAAA,cACtB,GAAI,SAAS,EAAE,aAAa,OAAO,IAAI,CAAC;AAAA,YAC1C;AAAA,YACA,MAAM,KAAK;AAAA,cACT,2BAA2B;AAAA,gBACzB,OAAO,OAAO;AAAA,gBACd,YAAY,OAAO,cAAc;AAAA,gBACjC,IAAI,uBAAuB,MAAM;AAAA,cACnC,CAAC;AAAA,YACH;AAAA,YACA,GAAI,aAAa,YAAY,IAAI,EAAE,QAAQ,YAAY,QAAQ,SAAS,EAAE,IAAI,CAAC;AAAA,UACjF,CAAC;AAED,cAAI,CAAC,SAAS,IAAI;AAChB,qBAAS,qCAAsC,SAAiB,MAAM;AACtE,mBAAO;AAAA,UACT;AAEA,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAM,UAAU,KAAK,UAAU,CAAC,GAAG,QAAQ;AAG3C,gBAAM,YAAY,QAAQ,MAAM,aAAa;AAC7C,cAAI,CAAC,WAAW;AACd,oBAAQ,6CAA6C;AACrD,mBAAO;AAAA,UACT;AAEA,gBAAM,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;AAGtC,gBAAM,cAAc,OAAO,WAAW,IAAI,OAAK,EAAE,KAAK;AACtD,cAAI,CAAC,YAAY,SAAS,OAAO,KAAK,GAAG;AACvC,oBAAQ,8CAA8C,OAAO,KAAK,GAAG;AACrE,mBAAO;AAAA,UACT;AAGA,eAAK,MAAM,IAAI,UAAU,QAAQ,EAAE,KAAK,OAAO,aAAa,IAAO,CAAC;AAEpE,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,mBAAS,wCAAwC,KAAK;AACtD,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAmB;AACjB,aAAK,MAAM,MAAM;AAAA,MACnB;AAAA,IACF;AAGO,IAAM,sBAAsB,IAAI,oBAAoB;AAAA;AAAA;;;AC1N3D,IA0Ba,eA2ZA;AArbb;AAAA;AAAA;AAOA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAUO,IAAM,gBAAN,MAAoB;AAAA,MACjB,kBAAkB,WAAmC,KAA6C;AACxG,YAAI,CAAC,KAAK;AACR,iBAAO;AAAA,QACT;AACA,eAAO,YAAY,sBAAsB,WAAW,GAAG,KAAK,MAAM;AAAA,MACpE;AAAA,MAEQ,wBACN,OACA,kBACA;AACA,cAAM,mBAAmB,kBAAkB,UAAU;AACrD,cAAM,mBAAmB,kBAAkB,UAAU,cAAc,CAAC;AAEpE,eAAO,KAAK,oBAAoB,KAAK,EAClC,IAAI,CAAC,SAAS;AACb,gBAAM,YAAY,KAAK,kBAAkB,aACpC,iBAAiB,KAAK,IAAI,KAC1B,KAAK;AACV,gBAAM,kBAAkB,KAAK,kBAAkB,YAAY,SAAS,QAAQ,SAAS;AACrF,cAAI,CAAC,mBAAmB,CAAC,WAAW;AAClC,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA,WAAW,KAAK,kBAAkB,aAAa;AAAA,UACjD;AAAA,QACF,CAAC,EACA,OAAO,OAAO;AAAA,MACnB;AAAA,MAEQ,oBACN,MACA,KACA,kBAC0B;AAC1B,YAAI,CAAC,kBAAkB,WAAW,CAAC,iBAAiB,QAAQ,WAAW,CAAC,IAAI,WAAW;AACrF,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,cAAc,sBAAsB,IAAI;AAC9C,cAAM,eAAe,kBAAkB,IAAI,IAAI,SAAS;AACxD,YACE,CAAC,eACD,cAAc,wBAAwB,eACtC,EAAE,aAAa,kBAAkB,aAAa,sBAC9C;AACA,iBAAO,CAAC;AAAA,QACV;AAEA,eAAO;AAAA,UACL;AAAA,UACA,cAAc,aAAa,kBAAkB,aAAa;AAAA,QAC5D;AAAA,MACF;AAAA,MAEQ,sBACN,WACA,QACA,WACwB;AACxB,YAAI,CAAC,OAAO,cAAc;AACxB,iBAAO;AAAA,QACT;AAEA,cAAM,cAAc,KAAK,kBAAkB,WAAW,OAAO,YAAY;AACzE,YAAI,CAAC,aAAa;AAChB,iBAAO;AAAA,QACT;AAEA,YAAI,CAAC,WAAW;AACd,cAAI,kCAAkC,WAAW,gCAAgC;AACjF,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,aAAa;AAAA,UACf;AAAA,QACF;AAEA,YAAI,UAAU,UAAU,aAAa;AACnC,iBAAO;AAAA,QACT;AAEA,YAAI,8CAA8C,UAAU,KAAK,SAAS,WAAW,GAAG;AACxF,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO;AAAA,UACP,YAAY,KAAK,IAAI,UAAU,YAAY,IAAI;AAAA,UAC/C,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MAEQ,qBAAqB,MAAc,OAAuB;AAChE,eAAO;AAAA,UACL,aAAa,KAAK,MAAM,GAAG,GAAG;AAAA,UAC9B,oBAAoB,KAAK,oBAAoB,KAAK,EAC/C,OAAO,CAAC,SAAS,KAAK,WAAW,EACjC,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,UAAU;AAAA,YACd,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,aAAa,KAAK;AAAA,YAClB,YAAY;AAAA,UACd,EAAE;AAAA,QACN;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,oBAAoB,OAAuC;AACzD,eAAO,CAAC,GAAG,KAAK,EACb,OAAO,CAAC,SAAS,KAAK,YAAY,KAAK,EACvC,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,UAAU,MAAc,MAAkC;AACxD,YAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,SAAS,WAAW,GAAG;AAClE,iBAAO,EAAE,SAAS,MAAM;AAAA,QAC1B;AAEA,eAAO,eAAe,SAAS,MAAM,KAAK,QAAQ;AAAA,MACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,kBAAkB,MAAc,OAA4E;AAC1G,YAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,WAAW,GAAG;AACzC,iBAAO;AAAA,QACT;AAGA,cAAM,cAAc,KAAK,oBAAoB,KAAK;AAElD,mBAAW,QAAQ,aAAa;AAC9B,gBAAM,SAAS,KAAK,UAAU,MAAM,IAAI;AACxC,cAAI,OAAO,SAAS;AAClB,mBAAO,EAAE,MAAM,OAAO;AAAA,UACxB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,YACJ,KACA,QACA,OAAeC,gBAAe,MAC9B,mBACA,kBACA,QACA,WAC0B;AAC1B,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,YAAa,IAAY;AAG/B,YAAI,CAAC,OAAO,SAAS;AACnB,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc,KAAK,IAAI,IAAI;AAAA,UAC7B;AAAA,QACF;AAGA,cAAM,OAAO,gBAAgB,QAAQ,KAAK,MAAM;AAEhD,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc,KAAK,IAAI,IAAI;AAAA,YAC3B,cAAc;AAAA,UAChB;AAAA,QACF;AAGA,cAAM,cAAc,KAAK,kBAAkB,MAAM,OAAO,KAAK;AAE7D,YAAI,aAAa;AACf,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,MAAM,YAAY;AAAA,YAClB,OAAO,YAAY,sBAAsB,WAAW,YAAY,KAAK,KAAK,KAAK,YAAY,KAAK,QAAQ,YAAY,KAAK;AAAA,YACzH,YAAY;AAAA;AAAA,YACZ,cAAc,KAAK,IAAI,IAAI;AAAA,YAC3B,cAAc;AAAA,YACd,aAAa;AAAA,UACf;AAAA,QACF;AAEA,cAAM,mBAAmB,KAAK,oBAAoB,MAAM,KAAK,gBAAgB;AAG7E,cAAM,qBAAqB,KAAK,wBAAwB,OAAO,OAAO,gBAAgB;AACtF,YAAI,kBAAkB,WAAW,iBAAiB,UAAU,WAAW,mBAAmB,SAAS,GAAG;AACpG,gBAAM,iBAAiB;AAAA,YACrB,GAAG,iBAAiB;AAAA,YACpB,YAAY,OAAO,YAAY,mBAAmB,IAAI,CAAC,cAAc,CAAC,UAAU,KAAK,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,UAClH;AACA,gBAAM,iBAAiB,eAAe,SAAS,eAC3C,MAAM,eAAe;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IACA,eAAe;AAAA,YACb;AAAA,YACA,mBAAmB,IAAI,CAAC,eAAe;AAAA,cACrC,QAAQ,UAAU,KAAK;AAAA,cACvB,WAAW,UAAU;AAAA,cACrB,WAAW,UAAU;AAAA,YACvB,EAAE;AAAA,YACF,eAAe;AAAA,UACjB;AACJ,cAAI,gBAAgB;AAClB,kBAAM,cAAc,OAAO,MAAM;AAAA,cAC/B,CAAC,SAAS,KAAK,YAAY,SAAS,KAAK,KAAK,YAAY,MAAM,eAAe,OAAO,YAAY;AAAA,YACpG;AAEA,gBAAI,aAAa;AACf,kBAAI,oCAAoC,eAAe,MAAM,SAAS,YAAY,KAAK,GAAG;AAC1F,kBAAI,IAAI,iBAAiB;AACvB,oBAAI,gBAAgB,iBAAiB,eAAe;AAAA,cACtD;AACA,oBAAM,oBAAqC;AAAA,gBACzC,SAAS;AAAA,gBACT,MAAM;AAAA,gBACN,OAAO,KAAK,kBAAkB,WAAW,YAAY,KAAK;AAAA,gBAC1D,YAAY,eAAe;AAAA,gBAC3B,cAAc,KAAK,IAAI,IAAI;AAAA,gBAC3B,cAAc;AAAA,gBACd,aAAa;AAAA,cACf;AACA,qBAAO,KAAK,sBAAsB,mBAAmB,kBAAkB,SAAS,KAAK;AAAA,YACvF;AAAA,UACF;AAAA,QACF;AAGA,YAAI,mBAAmB,WAAW,kBAAkB,YAAY,UAAU,GAAG;AAC3E,cAAI;AACF,kBAAM,4BAA4B,YAAY;AAAA,cAC5C,GAAG;AAAA,cACH,cAAc,KAAK,kBAAkB,WAAW,kBAAkB,YAAY,KAAK,kBAAkB;AAAA,cACrG,YAAY,kBAAkB,WAAW,IAAI,CAAC,eAAe;AAAA,gBAC3D,GAAG;AAAA,gBACH,OAAO,KAAK,kBAAkB,WAAW,UAAU,KAAK,KAAK,UAAU;AAAA,cACzE,EAAE;AAAA,YACJ,IAAI;AACJ,kBAAM,cAAc,MAAM,oBAAoB;AAAA,cAC5C;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,KAAK,qBAAqB,MAAM,OAAO,KAAK;AAAA,YAC9C;AACA,gBAAI,aAAa;AACf,kBAAI,iCAAiC,YAAY,KAAK,kBAAkB,YAAY,UAAU,GAAG;AACjG,oBAAM,iBAAkC;AAAA,gBACtC,SAAS;AAAA,gBACT,OAAO,YAAY;AAAA,gBACnB,YAAY,YAAY;AAAA,gBACxB,cAAc,KAAK,IAAI,IAAI;AAAA,gBAC3B,cAAc;AAAA,gBACd,aAAa;AAAA,cACf;AACA,qBAAO,KAAK,sBAAsB,gBAAgB,kBAAkB,SAAS,KAAK;AAAA,YACpF;AAAA,UACF,SAAS,OAAO;AACd,qBAAS,sCAAsC,KAAK;AAAA,UACtD;AAAA,QACF;AAGA,YAAI,OAAO,0BAA0B,OAAO,cAAc;AACxD,cAAI;AACF,kBAAM,eAAe,MAAM,eAAe,aAAa,MAAM,QAAQ,MAAM,QAAW,QAAQ,SAAS;AAEvG,gBAAI,aAAa,aAAa,OAAO,aAAa,WAAW,WAAW;AACtE,oBAAM,cAAc,eAAe,iBAAiB,aAAa,QAAQ,OAAO,KAAK;AAErF,kBAAI,aAAa;AACf,sBAAM,kBAAmC;AAAA,kBACvC,SAAS;AAAA,kBACT,MAAM;AAAA,kBACN,OAAO,KAAK,kBAAkB,WAAW,YAAY,KAAK;AAAA,kBAC1D,YAAY,aAAa;AAAA,kBACzB,cAAc,KAAK,IAAI,IAAI;AAAA,kBAC3B,cAAc;AAAA,kBACd,aAAa;AAAA,gBACf;AACA,uBAAO,KAAK,sBAAsB,iBAAiB,kBAAkB,SAAS,KAAK;AAAA,cACrF;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,qBAAS,2CAA2C,KAAK;AAAA,UAC3D;AAAA,QACF;AAGA,cAAM,sBAAsB,KAAK,sBAAsB,MAAM,kBAAkB,SAAS;AACxF,YAAI,qBAAqB;AACvB,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,cAAc,KAAK,IAAI,IAAI;AAAA,YAC3B,cAAc;AAAA,UAChB;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc,KAAK,IAAI,IAAI;AAAA,UAC3B,cAAc;AAAA,QAChB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,gBAAgB,KAAsB,QAAyC;AAC7E,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,YAAa,IAAY;AAG/B,YAAI,CAAC,OAAO,SAAS;AACnB,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc,KAAK,IAAI,IAAI;AAAA,UAC7B;AAAA,QACF;AAGA,cAAM,OAAO,gBAAgB,QAAQ,KAAK,MAAM;AAEhD,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc,KAAK,IAAI,IAAI;AAAA,YAC3B,cAAc;AAAA,UAChB;AAAA,QACF;AAGA,cAAM,cAAc,KAAK,kBAAkB,MAAM,OAAO,KAAK;AAE7D,YAAI,aAAa;AACf,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,MAAM,YAAY;AAAA,YAClB,OAAO,YAAY,sBAAsB,WAAW,YAAY,KAAK,KAAK,KAAK,YAAY,KAAK,QAAQ,YAAY,KAAK;AAAA,YACzH,YAAY;AAAA,YACZ,cAAc,KAAK,IAAI,IAAI;AAAA,YAC3B,cAAc;AAAA,UAChB;AAAA,QACF;AAGA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc,KAAK,IAAI,IAAI;AAAA,UAC3B,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAGO,IAAM,gBAAgB,IAAI,cAAc;AAAA;AAAA;;;ACrb/C,IAyBa,eAsMA;AA/Nb;AAAA;AAAA;AAMA,IAAAC;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAOO,IAAM,gBAAN,MAAoB;AAAA,MACjB,SAAgC;AAAA,MAChC,YAA+B;AAAA,MAC/B,OAAeC,gBAAe;AAAA,MAC9B,oBAAoD;AAAA,MACpD,mBAAkD;AAAA,MAClD;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOR,KAAK,WAA6B;AAChC,aAAK,YAAY;AACjB,aAAK,SAAS,UAAU,iBAAiB,KAAK,iBAAiB;AAC/D,aAAK,OAAO,UAAU,QAAQA,gBAAe;AAC7C,aAAK,oBAAoB,UAAU;AACnC,aAAK,mBAAmB,UAAU;AAClC,aAAK,SAAS,UAAU;AACxB,aAAK,eAAe,UAAU;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKQ,mBAAmC;AACzC,eAAO;AAAA,UACL,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,wBAAwB;AAAA,UACxB,OAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,YAAqB;AACnB,eAAO,KAAK,QAAQ,WAAW;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,YAAmC;AACjC,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,MAAM,KAAgD;AAC1D,YAAI,CAAC,KAAK,UAAU,CAAC,KAAK,OAAO,SAAS;AACxC,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc;AAAA,UAChB;AAAA,QACF;AAGA,cAAM,WAAW,IAAI,MAAM;AAC3B,YAAI,YAAY,gBAAgB,eAAe,QAAQ,GAAG;AACxD,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc;AAAA,UAChB;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,cAAc;AAAA,UACjC;AAAA,YACE,GAAG;AAAA,YACH,WAAW,KAAK,aAAa;AAAA,UAC/B;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AAEA,YAAI,IAAI,iBAAiB;AACvB,cAAI,OAAO,gBAAgB,kBAAkB,OAAO,MAAM,MAAM;AAC9D,8BAAkB,IAAI,iBAAiB,gBAAgB,OAAO,KAAK,IAAI,EAAE;AAAA,UAC3E,WAAW,OAAO,gBAAgB,oBAAoB,OAAO,MAAM,MAAM;AACvE,8BAAkB,IAAI,iBAAiB,kBAAkB,OAAO,KAAK,IAAI,EAAE;AAAA,UAC7E,WAAW,OAAO,gBAAgB,qBAAqB;AACrD,gBAAI,gBAAgB,YAAY;AAChC,8BAAkB,IAAI,iBAAiB,mBAAmB;AAAA,UAC5D,WAAW,OAAO,gBAAgB,gBAAgB;AAChD,8BAAkB,IAAI,iBAAiB,gBAAgB;AAAA,UACzD,WAAW,OAAO,gBAAgB,mBAAmB;AACnD,8BAAkB,IAAI,iBAAiB,iBAAiB;AAAA,UAC1D,OAAO;AACL,8BAAkB,IAAI,iBAAiB,yBAAyB;AAAA,UAClE;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,UAAU,KAAuC;AAC/C,YAAI,CAAC,KAAK,UAAU,CAAC,KAAK,OAAO,SAAS;AACxC,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc;AAAA,UAChB;AAAA,QACF;AAGA,cAAM,WAAW,IAAI,MAAM;AAC3B,YAAI,YAAY,gBAAgB,eAAe,QAAQ,GAAG;AACxD,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc;AAAA,UAChB;AAAA,QACF;AAEA,eAAO,cAAc,gBAAgB;AAAA,UACnC,GAAG;AAAA,UACH,WAAW,KAAK,aAAa;AAAA,QAC/B,GAAsB,KAAK,MAAM;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,iBAAiB,WAAuB;AACtC,aAAK,KAAK,SAAS;AAEnB,eAAO,OAAO,KAAU,UAAe;AACrC,cAAI,CAAC,KAAK,UAAU,GAAG;AACrB;AAAA,UACF;AAGA,cAAI,CAAC,IAAI,IAAI,WAAW,cAAc,GAAG;AACvC;AAAA,UACF;AAEA,gBAAM,YAAY,KAAK,IAAI;AAE3B,cAAI;AACF,kBAAM,SAAS,MAAM,KAAK,MAAM,GAAG;AAEnC,gBAAI,OAAO,WAAW,OAAO,OAAO;AAElC,kBAAI,KAAK,QAAQ,OAAO;AAGxB,kBAAI,gBAAgB;AAEpB;AAAA,gBACE,mBACE,OAAO,gBAAgB,sBACnB,+BACA,OAAO,gBAAgB,mBACrB,mBAAmB,OAAO,MAAM,IAAI,MACpC,OAAO,gBAAgB,iBACrB,4BACA,OAAO,gBAAgB,oBACrB,oBAAoB,OAAO,MAAM,IAAI,MACrC,OAAO,OACL,iBAAiB,OAAO,KAAK,IAAI,MACjC,yBACd,cAAc,OAAO,KAAK,kBACV,OAAO,UAAU,WAAW,OAAO,YAAY;AAAA,cACjE;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,qBAAS,6CAA6C,KAAK;AAAA,UAC7D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGO,IAAM,gBAAgB,IAAI,cAAc;AAAA;AAAA;;;AC7N/C,SAAS,gBAAgB,OAAgD;AACvE,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,SAAS,KAAK,SAAS,UAAU,KAAK,SAAS;AAAA,EAClD;AAEA,MAAI,CAAC,aAAa,QAAQ;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,KAAK,aAAa,CAAC,EAAE,SAAS,QAAQ;AAChE,WAAO,aAAa,CAAC,EAAE;AAAA,EACzB;AAEA,SAAO,aAAa,IAAI,CAAC,SAAS;AAChC,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,MACzC,KAAK;AACH,eAAO,EAAE,MAAM,aAAa,WAAW,EAAE,KAAK,KAAK,QAAQ,OAAO,KAAK,OAAO,EAAE;AAAA,MAClF;AACE,eAAO,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,IACpC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBAAkB,OAAgD;AACzE,SAAO,MACJ,OAAO,CAAC,SAAS,KAAK,SAAS,WAAW,EAC1C,IAAI,CAAC,UAAU;AAAA,IACd,IAAI,KAAK;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF,EAAE;AACN;AAEA,SAAS,2BAA2B,OAAgD;AAClF,SAAO,MACJ,OAAO,CAAC,SAAS,KAAK,SAAS,aAAa,EAC5C,IAAI,CAAC,UAAU;AAAA,IACd,MAAM;AAAA,IACN,cAAc,KAAK;AAAA,IACnB,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,OAAO;AAAA,EACxF,EAAE;AACN;AAEA,SAAS,YAAY,MAAW;AAC9B,SAAO,MAAM,QAAQ,MAAM,UAAU;AACvC;AAEA,SAAS,mBAAmB,MAAW;AACrC,SAAO,MAAM,eAAe,MAAM,UAAU;AAC9C;AAEA,SAAS,mBAAmB,MAAW;AACrC,SAAO,MAAM,gBAAgB,MAAM,UAAU;AAC/C;AAEA,SAAS,cAAc,OAAe;AACpC,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,QAAQ;AAC1C,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,YAAY,IAAI;AAAA,MACtB,aAAa,mBAAmB,IAAI;AAAA,MACpC,YAAY,mBAAmB,IAAI;AAAA,IACrC;AAAA,EACF,EAAE;AACJ;AAEA,SAAS,mBAAmB,YAAkB;AAC5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,eAAe,UAAU;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,SAAS,QAAQ;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,SAAS,OAAO;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,SAAS,UAAU,WAAW,MAAM;AACjD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoBC,QAOjC;AACD,QAAM,WAAW;AAAA,IACf,GAAGA,OAAM,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,UAAU,SAAS,KAAK,EAAE;AAAA,IACpE,GAAGA,OAAM,GAAG,SAAS,QAAQ,CAAC,YAAY;AACxC,YAAM,UAAU,gBAAgB,QAAQ,KAAK;AAC7C,YAAM,YAAY,QAAQ,SAAS,cAC/B,kBAAkB,QAAQ,KAAK,IAC/B,CAAC;AACL,YAAM,cAAc,2BAA2B,QAAQ,KAAK;AAC5D,YAAM,eAAsB,CAAC;AAE7B,UAAI,YAAY,QAAQ,UAAU,QAAQ;AACxC,qBAAa,KAAK;AAAA,UAChB,MAAM,QAAQ;AAAA,UACd;AAAA,UACA,GAAI,UAAU,SAAS,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,QACtD,CAAC;AAAA,MACH;AAEA,UAAI,YAAY,QAAQ;AACtB,qBAAa,KAAK,GAAG,WAAW;AAAA,MAClC;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,OAA4B;AAAA,IAChC,OAAOA,OAAM;AAAA,IACb;AAAA,EACF;AAEA,MAAIA,OAAM,0BAA0B,QAAW;AAC7C,SAAK,wBAAwBA,OAAM;AAAA,EACrC;AAEA,MAAIA,OAAM,WAAW,QAAW;AAC9B,SAAK,SAASA,OAAM;AAAA,EACtB;AAEA,QAAM,QAAQ,cAAcA,OAAM,KAAK;AACvC,MAAI,OAAO;AACT,SAAK,QAAQ;AAAA,EACf;AAEA,QAAM,aAAa,mBAAmBA,OAAM,WAAW;AACvD,MAAI,eAAe,QAAW;AAC5B,SAAK,cAAc;AAAA,EACrB;AAEA,MAAIA,OAAM,GAAG,SAAS,UAAU,SAAS;AACvC,SAAK,YAAY;AAAA,MACf,GAAIA,OAAM,GAAG,QAAQ,SAAS,SAAS,EAAE,QAAQA,OAAM,GAAG,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,IACzF;AAAA,EACF;AAEA,SAAO;AACT;AA1KA;AAAA;AAAA;AAAA;AAAA;;;ACmBA,SAAS,yBAAyB,OAAoB;AACpD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,yBAAyBC,QAI/B;AACD,QAAM,cAAwB,CAAC;AAC/B,QAAM,cAAc,EAAE,GAAGA,OAAM,QAAQ;AACvC,QAAM,SAAqB;AAAA,IACzB,GAAGA,OAAM;AAAA,IACT,QAAQ,CAAC,GAAGA,OAAM,GAAG,MAAM;AAAA,IAC3B,UAAUA,OAAM,GAAG,SAAS,IAAI,CAAC,aAAa;AAAA,MAC5C,GAAG;AAAA,MACH,OAAO,QAAQ,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,EAAE;AAAA,IAClD,EAAE;AAAA,IACF,SAASA,OAAM,GAAG,UAAU,EAAE,GAAGA,OAAM,GAAG,QAAQ,IAAI;AAAA,EACxD;AAEA,MAAIA,OAAM,cAAc,SAAS,cAAc,SAAS,OAAO,SAAS,UAAU;AAChF,gBAAY,KAAK,kBAAkB;AACnC,WAAO,OAAO,QAAQ;AACtB,WAAO,YAAY;AACnB,QAAI,OAAO,WAAW,CAAC,OAAO,KAAK,OAAO,OAAO,EAAE,QAAQ;AACzD,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,SAAS;AAAA,IAAK,CAAC,YAC1C,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO;AAAA,EACpD;AACA,MAAIA,OAAM,cAAc,WAAW,SAAS,eAAe;AACzD,gBAAY,KAAK,sBAAsB;AACvC,WAAO,WAAW,OAAO,SAAS,IAAI,CAAC,aAAa;AAAA,MAClD,GAAG;AAAA,MACH,OAAO,QAAQ,MAAM,QAAQ,CAAC,SAAS;AACrC,YAAI,KAAK,SAAS,SAAS;AACzB,iBAAO,CAAC,IAAI;AAAA,QACd;AAEA,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,EAAE;AAAA,EACJ;AAEA,QAAM,eAAe,OAAO,SAAS;AAAA,IAAK,CAAC,YACzC,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,eAAe,KAAK,SAAS,aAAa;AAAA,EACvF;AACA,MAAIA,OAAM,cAAc,UAAU,UAAU,MAAM,QAAQ,YAAY,KAAK,KAAK,YAAY,MAAM,UAAU,eAAe;AACzH,gBAAY,KAAK,qBAAqB;AACtC,WAAO,YAAY;AACnB,WAAO,YAAY;AACnB,WAAO,WAAW,OAAO,SAAS,IAAI,CAAC,aAAa;AAAA,MAClD,GAAG;AAAA,MACH,OAAO,QAAQ,MAAM,QAAQ,CAAC,SAAS;AACrC,YAAI,KAAK,SAAS,aAAa;AAC7B,iBAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,MAAM,uEAAuE,KAAK,IAAI,IAAI,KAAK,SAAS;AAAA,YAC1G;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,SAAS,eAAe;AAC/B,iBAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,MAAM,yCAAyC,yBAAyB,KAAK,OAAO,CAAC;AAAA,YACvF;AAAA,UACF;AAAA,QACF;AAEA,eAAO,CAAC,IAAI;AAAA,MACd,CAAC;AAAA,IACH,EAAE;AAAA,EACJ;AAEA,SAAO;AAAA,IACL;AAAA,IACA,IAAI;AAAA,IACJ,SAAS;AAAA,EACX;AACF;AAEO,SAAS,2BAA2B,MAA+D;AACxG,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AACE,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,EACJ;AACF;AAEA,SAAS,kBAAkB,MAA2B;AACpD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO;AACT;AA8CO,SAAS,mCAAmCA,QAOhD;AACD,QAAM,WAAW,yBAAyB;AAAA,IACxC,IAAIA,OAAM;AAAA,IACV,SAASA,OAAM;AAAA,IACf,cAAcA,OAAM;AAAA,EACtB,CAAC;AACD,QAAM,cAAc,kBAAkB,SAAS,OAAO;AACtD,QAAM,iBAAkC,4BAA4BA,OAAM,WAAWA,OAAM,oBAAoB;AAE/G,MAAI,mBAAmB,eAAe;AACpC,WAAO;AAAA,MACL;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,GAAG;AAAA,MACH,GAAG,oBAAoB;AAAA,QACrB,OAAOA,OAAM;AAAA,QACb,uBAAuB,SAAS,QAAQ,cAAc,SAAS,QAAQ;AAAA,QACvE,QAAQ,SAAS,QAAQ;AAAA,QACzB,OAAO,SAAS,QAAQ;AAAA,QACxB,aAAa,SAAS,QAAQ;AAAA,QAC9B,IAAI,SAAS;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,SAAS;AAAA,IACtB,GAAG;AAAA,IACH,GAAG,2BAA2B;AAAA,MAC5B,OAAOA,OAAM;AAAA,MACb,YAAY,SAAS,QAAQ,cAAc,SAAS,QAAQ;AAAA,MAC5D,QAAQ,SAAS,QAAQ;AAAA,MACzB,UAAU,SAAS,QAAQ;AAAA,MAC3B,OAAO,SAAS,QAAQ;AAAA,MACxB,aAAa,SAAS,QAAQ;AAAA,MAC9B,IAAI,SAAS;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEO,SAAS,6BAA6BA,QAM1C;AACD,QAAM,KAAK,gBAAgBA,OAAM,OAAO;AACxC,QAAM,EAAE,aAAa,gBAAgB,GAAG,KAAK,IAAI,mCAAmC;AAAA,IAClF,OAAOA,OAAM;AAAA,IACb,WAAWA,OAAM;AAAA,IACjB,sBAAsBA,OAAM;AAAA,IAC5B,SAASA,OAAM;AAAA,IACf;AAAA,IACA,cAAcA,OAAM;AAAA,EACtB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAnSA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AAAA;AAAA;;;ACiCA,SAAS,iBAAoB,OAAa;AACxC,MAAI,OAAO,oBAAoB,YAAY;AACzC,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AAEA,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAKA,eAAe,yBAAyB;AACtC,QAAM,cAAU,oBAAQ;AACxB,QAAM,iBAAa,mBAAK,SAAS,cAAc;AAC/C,MAAI,KAAC,uBAAW,UAAU,GAAG;AAG3B,QAAI,YAAY,UAAU,oDAAoD;AAC9E,UAAM,SAAS,MAAM;AAAA,MACnB,EAAE,QAAQ,GAAG;AAAA,MACb,MAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC;AAAA,IACpC,EAAE,KAAK,EAAE;AACT,UAAM,gBAAgB;AAAA,MACpB,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB;AAAA,MACA,wBAAwB;AAAA,MACxB,uBAAuB;AAAA,MACvB,UAAU,CAAC;AAAA,IACb;AACA,cAAM,4BAAU,YAAY,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AAAA,EACpE;AACF;AASA,eAAe,IAAI,UAAsB,CAAC,GAAG;AAE3C,MAAI,iBAAiB,GAAG;AACtB,QAAI,sDAAiD;AACrD;AAAA,EACF;AAEA,QAAM,QAAQ;AAEd,QAAM,SAAS,MAAM,WAAW;AAGhC,mBAAiB,MAAM;AAEvB,MAAI,OAAO,OAAO,QAAQ;AAE1B,MAAI,OAAO,QAAQ,CAAC,OAAO,QAAQ;AACjC,WAAO;AACP,YAAQ,+DAAqD;AAAA,EAC/D;AAEA,QAAM,OAAO,QAAQ,QAAQ,OAAO,QAAQ,eAAe;AAG3D,UAAQ,QAAQ,KAAK,IAAI;AAGzB,UAAQ,GAAG,UAAU,MAAM;AACzB,QAAI,iCAAiC;AACrC,mBAAe;AACf,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,UAAQ,GAAG,WAAW,MAAM;AAC1B,mBAAe;AACf,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,QAAM,cAAc,QAAQ,IAAI,eAC5B,SAAS,QAAQ,IAAI,YAAY,IACjC;AAIJ,SAAO,OAAO;AAGd,QAAM,MAAM,CAAC,SAAiB,MAAM,IAAI,KAAK,OAAO;AACpD,QAAM,YAAY,CAAC,MAAqB,UAA8B;AACpE,QAAI,CAAC,MAAM;AACT,aAAO,oBAAI,KAAK;AAAA,IAClB;AACA,UAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,UAAM,QAAQ,KAAK,YAAY,IAAI,KAAK,IAAI,KAAK,SAAS,IAAI,CAAC;AAC/D,UAAM,MAAM,IAAI,KAAK,QAAQ,CAAC;AAC9B,UAAM,OAAO,IAAI,KAAK,SAAS,CAAC;AAChC,UAAM,SAAS,IAAI,KAAK,WAAW,CAAC;AACpC,UAAM,UAAU,IAAI,KAAK,WAAW,CAAC;AAErC,WAAO,OAAO,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,EAChF;AAEA,QAAM,eACJ,OAAO,QAAQ,QACX;AAAA,IACE,OAAO,OAAO,aAAa;AAAA,IAC3B,YAAQ,0CAAa,WAAW;AAAA,MAC9B,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,IACA;AAGN,QAAM,WAAW,mBAAmB,MAAM;AAC1C,QAAM,SAAS,aAAa;AAAA,IAC1B,aAAa;AAAA,IACb,eAAe;AAAA,MACb,WAAW,SAAS;AAAA,MACpB;AAAA,MACA,MAAM;AAAA,MACN,cAAU;AAAA,YACR,oBAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAGD,SAAO,QAAQ,cAAc,OAAO,KAAU,UAAe;AAC3D,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,YAAM,OAAO,CAAC,QAAgB;AAC5B,YAAI,IAAK,QAAO,GAAG;AAAA,YACd,SAAQ;AAAA,MACf;AACA,iBAAW,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,IACrC,CAAC;AAAA,EACH,CAAC;AAGD,gBAAc,KAAK,MAAM;AACzB,MAAI,yCAAyC,cAAc,UAAU,CAAC,EAAE;AAGxE,SAAO,QAAQ,cAAc,OAAO,KAAU,UAAe;AAC3D,QAAI,IAAI,IAAI,WAAW,cAAc,GAAG;AACtC,UAAI,IAAI,KAAK,UAAU,SAAS;AAC9B,cAAM,QAAQ,IAAI,KAAK,SAAS,QAAQ,MAAM,WAAW;AACzD,YAAI,MAAM,SAAS,GAAG;AACpB,cAAI,YAAY,MAAM,CAAC;AAAA,QACzB;AAAA,MACF;AAEA,UAAI,kBAAkB,sBAAsB;AAAA,QAC1C,WAAW,IAAI;AAAA,QACf,YAAY,IAAI;AAAA,QAChB,cAAc,IAAI,MAAM;AAAA,MAC1B,CAAC;AACD,wBAAkB,IAAI,iBAAiB,kBAAkB;AAEzD,YAAM,sBAAsB,IAAI,QAAQ,oBAAoB,MAAM;AAClE,YAAM,gBAAgB,sBAClB,EAAE,SAAS,OAAO,YAAY,GAAG,cAAc,EAAE,IACjD,MAAM,cAAc,MAAM,GAAG;AACjC,UAAI,gBAAgB;AAEpB,UAAI,CAAC,uBAAuB,cAAc,WAAW,cAAc,OAAO;AACtE,cAAM,uBAAuB,IAAI,YAAY,kBAAkB,IAAI,IAAI,SAAS,IAAI;AACpF,cAAM,gBAAgB,sBAAsB;AAC5C,cAAM,kBAAkB,OAAO,YAAY,QAAQ;AAErD,YACE,OAAO,YAAY,WACnB,iBAAiB,WACjB,iBACA,kBAAkB,cAAc,SAChC,cAAc,cACZ;AACA,gBAAM,0BAA0B;AAAA,YAC9B,GAAG;AAAA,YACH,kBAAkB,sBAAsB,QAAQ,gBAAgB,gBAAgB,KAAK,gBAAgB;AAAA,UACvG;AACA,gBAAM,UAAU,MAAM,wBAAwB;AAAA,YAC5C,cAAc;AAAA,YACd;AAAA,YACA,cAAc;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACT,OAAO;AAAA,UACT;AAEA,cAAI,SAAS;AACX,gBAAI,KAAK,SAAS,wBAAwB;AAAA,cACxC,IAAI,KAAK;AAAA,cACT;AAAA,cACA;AAAA,cACA,cAAc;AAAA,YAChB;AACA,gBAAI,gBAAgB,gBAAgB;AACpC,8BAAkB,IAAI,iBAAiB,mBAAmB;AAAA,UAC5D;AAAA,QACF;AAEA,YAAI,KAAK,QAAQ,cAAc;AAC/B,YAAI,gBAAgB,aAAa,cAAc;AAE/C;AAAA,UACE,iCAAiC,cAAc,MAAM,IAAI,SAAS,cAAc,KAAK;AAAA,QACvF;AAAA,MACF;AAGA,YAAM,YAAsB,CAAC;AAE7B,iBAAW,SAAS,eAAc,aAAa,GAAG;AAChD,YAAI,MAAM,aAAa,KAAK,MAAM,GAAG;AACnC,oBAAU,KAAK,MAAM,IAAI;AACzB,gBAAM,WAAW,KAAK,MAAM;AAE5B,cAAI,MAAM,MAAM,MAAM;AACpB,gBAAI,CAAC,IAAI,MAAM,OAAO,QAAQ;AAC5B,kBAAI,KAAK,QAAQ,CAAC;AAAA,YACpB;AACA,gBAAI,KAAK,MAAM;AAAA,cACb,GAAG,MAAM,KAAK,MAAM,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU;AAAA,gBACjD,MAAM,KAAK;AAAA,gBACX,aAAa,KAAK;AAAA,gBAClB,cAAc,KAAK;AAAA,cACrB,EAAE;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,UAAU,QAAQ;AACpB,YAAI,SAAS;AAAA,MACf;AAGA,YAAM,OAAO,KAAK,OAAO;AAAA,QACvB;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,gBAAgB,oBAAoB,QAAQ,IAAI,MAAM,KAAK;AACjE,UAAI,eAAe,aAAa,IAAI,MAAM,UAAU;AAClD,cAAM,eAAe,iBAAiB,IAAI,IAAI;AAC9C,cAAM,WAAW,6BAA6B;AAAA,UAC5C,OAAO,cAAc;AAAA,UACrB,WAAW,cAAc;AAAA,UACzB,sBAAsB,cAAc;AAAA,UACpC,SAAS;AAAA,UACT,cAAc,cAAc;AAAA,QAC9B,CAAC;AAED,YAAI,sBAAsB;AAC1B,YAAI,YAAY,SAAS;AACzB,YAAI,sBAAsB,SAAS;AACnC,YAAI,oBAAoB,cAAc;AACtC,YAAI,sBAAsB,SAAS;AACnC,YAAI,SAAS,YAAY,QAAQ;AAC/B;AAAA,YACE,6BAA6B,cAAc,EAAE,sCAAsC,SAAS,YAAY,KAAK,IAAI,CAAC;AAAA,UACpH;AAAA,QACF;AACA,YAAI,OAAO;AAAA,UACT,GAAG,SAAS;AAAA,UACZ,OAAO,IAAI,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,SAAO,QAAQ,WAAW,OAAO,SAAc,OAAY,UAAe;AACxE,UAAM,KAAK,WAAW,SAAS,OAAO,KAAK;AAAA,EAC7C,CAAC;AAGD,SAAO,QAAQ,UAAU,CAAC,KAAU,OAAY,SAAc,SAAc;AAC1E,QAAI,IAAI,qBAAqB;AAC3B,UAAI,OAAO,IAAI;AAAA,IACjB;AAEA,QAAI,IAAI,aAAa,IAAI,IAAI,WAAW,cAAc,GAAG;AACvD,UAAI,mBAAmB,gBAAgB;AACrC,YAAI,IAAI,QAAQ;AACd,gBAAM,kBAAkB,IAAI,gBAAgB;AAC5C,gBAAM,YAAY,IAAI,mBAAmB;AACzC,gBAAM,cAAc,QAAQ,YAAY,SAAgB;AACxD,cAAI;AACJ,cAAI,mBAAmB;AACvB,cAAI,kBAAkB;AACtB,cAAI,kBAAkB;AACtB,cAAI,gBAAgB;AACpB,gBAAM,eAAsB,CAAC;AAC7B,gBAAM,oBAA2B,CAAC;AAElC,gBAAM,gBAAgB,IAAI,uBAAuB;AAEjD,gBAAM,cAAc,cAAc,aAAa,OAAO,MAAW,eAAoB;AACjF,gBAAI;AAEF,kBACE,KAAK,UAAU,yBACf,MAAM,MAAM,eAAe,MAC3B;AACA,sBAAM,QAAQ,IAAI,OAAO;AAAA,kBAAK,CAAC,SAC7B,eACG,SAAS,IAAI,GACZ,MAAM,IAAI,KAAK,KAAK,cAAc,IAAI;AAAA,gBAC5C;AACA,oBAAI,OAAO;AACT,iCAAe,eAAc,SAAS,KAAK;AAC3C,qCAAmB,KAAK,KAAK;AAC7B,oCAAkB,KAAK,KAAK,cAAc;AAC1C,kCAAgB,KAAK,KAAK,cAAc;AACxC,yBAAO;AAAA,gBACT;AAAA,cACF;AAGA,kBACE,mBAAmB,MACnB,KAAK,KAAK,UAAU,oBACpB,KAAK,MAAM,OAAO,SAAS,oBAC3B;AACA,mCAAmB,KAAK,MAAM,OAAO;AACrC,uBAAO;AAAA,cACT;AAGA,kBACE,mBAAmB,MACnB,KAAK,KAAK,UAAU,oBACpB,KAAK,KAAK,SAAS,sBACnB;AACA,oBAAI;AACF,wBAAM,OAAO,aAAAC,QAAM,MAAM,eAAe;AACxC,oCAAkB,KAAK;AAAA,oBACrB,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,MAAM;AAAA,oBACN,OAAO;AAAA,kBACT,CAAC;AACD,wBAAM,aAAa,MAAM,cAAc,MACpC,IAAI,eAAe,GAClB,QAAQ,MAAM;AAAA,oBACd;AAAA,oBACA;AAAA,kBACF,CAAC;AACH,2BAAS,gBAAgB,UAAU;AACnC,+BAAa,KAAK;AAAA,oBAChB,aAAa;AAAA,oBACb,MAAM;AAAA,oBACN,SAAS;AAAA,kBACX,CAAC;AACD,iCAAe;AACf,qCAAmB;AACnB,oCAAkB;AAClB,oCAAkB;AAClB,kCAAgB;AAAA,gBAClB,SAAS,GAAG;AACV,2BAAS,yBAAyB,CAAC;AAAA,gBACrC;AACA,uBAAO;AAAA,cACT;AAEA,kBAAI,KAAK,UAAU,mBAAmB,aAAa,QAAQ;AACzD,oBAAI,KAAK,SAAS,KAAK;AAAA,kBACrB,MAAM;AAAA,kBACN,SAAS;AAAA,gBACX,CAAC;AACD,oBAAI,KAAK,SAAS,KAAK;AAAA,kBACrB,MAAM;AAAA,kBACN,SAAS;AAAA,gBACX,CAAC;AACD,sBAAM,WAAW,MAAM;AAAA,kBACrB,oBAAoB,WAAW;AAAA,kBAC/B;AAAA,oBACE,QAAQ;AAAA,oBACR,SAAS;AAAA,sBACP,aAAa,OAAO,UAAU;AAAA,sBAC9B,gBAAgB;AAAA,oBAClB;AAAA,oBACA,MAAM,KAAK,UAAU,IAAI,IAAI;AAAA,kBAC/B;AAAA,gBACF;AACA,oBAAI,CAAC,SAAS,IAAI;AAChB,yBAAO;AAAA,gBACT;AACA,sBAAM,iBAAiB,IAAI,mBAAmB;AAC9C,sBAAM,SAAS,SAAS,KAAM,YAAY,cAAqB;AAC/D,sBAAM,SAAS,OAAO,UAAU;AAChC,uBAAO,MAAM;AACX,sBAAI;AACF,0BAAM,EAAE,OAAO,MAAAC,MAAK,IAAI,MAAM,OAAO,KAAK;AAC1C,wBAAIA,OAAM;AACR;AAAA,oBACF;AACA,wBACE,CAAC,iBAAiB,cAAc,EAAE,SAAS,MAAM,KAAK,GACtD;AACA;AAAA,oBACF;AAEA,wBAAI,CAAC,WAAW,aAAa;AAC3B,8BAAQ,8BAA8B;AACtC;AAAA,oBACF;AAEA,+BAAW,QAAQ,KAAK;AAAA,kBAC1B,SAAS,WAAgB;AACvB,wBACE,UAAU,SAAS,gBACnB,UAAU,SAAS,8BACnB;AACA;AAAA,wBACE;AAAA,sBACF;AACA,sCAAgB,MAAM;AACtB;AAAA,oBACF;AACA,0BAAM;AAAA,kBACR;AAAA,gBACF;AACA,uBAAO;AAAA,cACT;AACA,qBAAO;AAAA,YACT,SAAS,OAAY;AACnB;AAAA,gBACE;AAAA,gBACA;AAAA,cACF;AAEA,kBAAI,MAAM,SAAS,8BAA8B;AAC/C,oBAAI,gDAAgD;AACpD,gCAAgB,MAAM;AACtB,uBAAO;AAAA,cACT;AAEA,oBAAM;AAAA,YACR;AAAA,UACF,CAAC,EAAE,YAAY,aAAoB;AAErC,iBAAO;AAAA,YACL;AAAA,YACA,wBAAwB,aAAa,KAAK,QAAQ,WAAW;AAAA,UAC/D;AAAA,QACF;AAEA,eAAO,KAAK,MAAM,wBAAwB,SAAS,KAAK,QAAQ,WAAW,CAAC;AAAA,MAC9E;AACA,wBAAkB,IAAI,IAAI,WAAW,QAAQ,KAAK;AAAA,IACpD;AACA,QAAI,OAAO,YAAY,YAAY,QAAQ,OAAO;AAChD,aAAO,KAAK,QAAQ,OAAO,IAAI;AAAA,IACjC;AACA,SAAK,MAAM,OAAO;AAAA,EACpB,CAAC;AAED,SAAO,QAAQ,UAAU,OAAO,KAAU,OAAY,YAAiB;AACrE,QAAI,mBAAmB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAEA,cAAU,MAAM,wBAAwB;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,IAAI,iBAAiB;AACvB,eAAS,qBAAqB,KAAK,UAAU,IAAI,eAAe,CAAC;AAAA,IACnE;AAEA,aAAS,uBAAuB;AAChC,UAAM,KAAK,UAAU,KAAK,OAAO,OAAO;AACxC,WAAO;AAAA,EACT,CAAC;AAED,QAAM,OAAO,MAAM;AACrB;AA/gBA,IAMAC,YACAC,kBACAC,YACAC,cAgBA,cAGA,oBAEA,6BAKM;AAnCN;AAAA;AAAA;AAMA,IAAAH,aAA2B;AAC3B,IAAAC,mBAA0B;AAC1B,IAAAC,aAAwB;AACxB,IAAAC,eAAqB;AACrB;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAkB;AAElB;AACA,yBAA6B;AAC7B;AACA,kCAA6B;AAC7B;AACA;AACA;AAEA,IAAM,QAAQ,IAAI,gCAAa;AAAA;AAAA;;;ACbxB,SAAS,oBAAoBC,QAAsD;AACxF,MAAIA,OAAM,gBAAgB,SAAS,qBAAqB;AACtD,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,MAAIA,OAAM,gBAAgB,SAAS,QAAQ;AACzC,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AAEA,MAAIA,OAAM,gBAAgB,SAAS,kBAAkB;AACnD,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,MAAIA,OAAM,iBAAiBA,OAAM,gBAAgB,SAAS,gBAAgB;AACxE,WAAOA,OAAM,kBAAkB,EAAE,MAAM,SAAS,IAAI,EAAE,MAAM,UAAU;AAAA,EACxE;AAEA,SAAO,EAAE,MAAM,QAAQ;AACzB;AAEA,eAAsB,mBAAmBA,QAAgD;AACvF,MAAIA,OAAM,OAAO,SAAS,SAAS;AACjC,UAAMA,OAAM,aAAa;AAAA,EAC3B;AAEA,MAAIA,OAAM,OAAO,SAAS,UAAU;AAClC,UAAMA,OAAM,cAAc;AAAA,EAC5B;AAEA,MAAIA,OAAM,OAAO,SAAS,WAAW;AACnC,UAAMA,OAAM,eAAe;AAAA,EAC7B;AAEA,QAAM,UAAU,MAAMA,OAAM,aAAa;AACzC,MAAI,CAAC,SAAS;AACZ,QAAIA,OAAM,OAAO,SAAS,WAAW;AACnC,YAAM,IAAI,MAAM,0JAA0J;AAAA,IAC5K;AACA,QAAIA,OAAM,OAAO,SAAS,SAAS;AACjC,YAAM,IAAI,MAAM,0IAA0I;AAAA,IAC5J;AACA,QAAIA,OAAM,OAAO,SAAS,UAAU;AAClC,YAAM,IAAI,MAAM,iGAAiG;AAAA,IACnH;AACA,UAAM,IAAI,MAAM,uHAAuH;AAAA,EACzI;AACF;AApEA;AAAA;AAAA;AAAA;AAAA;;;ACEA,SAAS,eAAe,OAAiC;AACvD,MAAI,UAAU,8BAA8B;AAC1C,WAAO;AAAA,EACT;AAEA,MAAI,+DAA+D,KAAK,KAAK,GAAG;AAC9E,WAAO;AAAA,EACT;AAEA,MAAI,oEAAoE,KAAK,KAAK,GAAG;AACnF,WAAO;AAAA,EACT;AAEA,MACE,8EAA8E,KAAK,KAAK,KACxF,0DAA0D,KAAK,KAAK,KACpE,iEAAiE,KAAK,KAAK,GAC3E;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,QAAsC;AACpE,QAAM,SAA6B,CAAC;AAEpC,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,eAAe,KAAK;AAClC,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AArCA;AAAA;AAAA;AAAA;AAAA;;;ACiEA,SAAS,4BAA4B,YAA6C;AAChF,MAAI,YAAY,SAAS,cAAc,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MACJ,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,UAAU,MAAc,OAAe,OAAuB;AACrE,QAAM,iBAAiB,iBAAiB,IAAI,KAAK,YAAY,QAAQ,CAAC;AACtE,QAAM,kBAAkB,iBAAiB,KAAK;AAE9C,SAAO,kBAAkB,GAAG,cAAc,IAAI,eAAe,KAAK;AACpE;AAEA,SAAS,mBAAsC;AAC7C,SAAO;AAAA,IACL,WAAW,CAAC;AAAA,IACZ,QAAQ,CAAC;AAAA,IACT,QAAQ,CAAC;AAAA,EACX;AACF;AAEA,SAAS,4BAAwD;AAC/D,SAAO;AAAA,IACL,OAAO,iBAAiB;AAAA,IACxB,eAAe,CAAC;AAAA,IAChB,iBAAiB;AAAA,IACjB,eAAe,CAAC,gBAAgB,UAAU,YAAY;AAAA,EACxD;AACF;AAEA,SAAS,sBAAsB,OAA+C;AAC5E,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,oBAAoB,OAA6C;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,WAAW,QAAkB,OAAqB;AACzD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO,KAAK,KAAK;AAAA,EACnB;AACF;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,OAAO,UAAU,WACpB,MAAM,KAAK,IACX;AACN;AAEA,SAAS,YAAY,OAAqC;AACxD,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,MAAM,YAAY,MAAM,QAAQ;AAClC,aAAO;AAAA,IACT;AACA,QAAI,MAAM,YAAY,MAAM,SAAS;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAoC;AAC5D,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,UAAM,SAAS,OAAO,KAAK;AAC3B,QAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,+BAA+BC,QAA2B,wBAAiE;AAClI,QAAM,aAAyC,CAAC;AAChD,QAAM,SAAS,CAAC,QAAgB,OAAO,UAAU,eAAe,KAAKA,QAAO,GAAG;AAE/E,QAAM,OAAO,WAAWA,OAAM,IAAI;AAClC,MAAI,OAAO,MAAM,GAAG;AAClB,eAAW,OAAO;AAClB,2BAAuB,IAAI,MAAM;AAAA,EACnC;AAEA,QAAM,OAAO,iBAAiBA,OAAM,IAAI;AACxC,MAAI,OAAO,MAAM,KAAK,SAAS,QAAW;AACxC,eAAW,OAAO;AAClB,2BAAuB,IAAI,MAAM;AAAA,EACnC;AAEA,QAAMC,OAAM,YAAYD,OAAM,GAAG;AACjC,MAAI,OAAO,KAAK,KAAKC,SAAQ,QAAW;AACtC,eAAW,MAAMA;AACjB,2BAAuB,IAAI,KAAK;AAAA,EAClC;AAEA,QAAM,WAAW,WAAWD,OAAM,SAAS;AAC3C,MAAI,OAAO,WAAW,GAAG;AACvB,eAAW,YAAY;AACvB,2BAAuB,IAAI,WAAW;AAAA,EACxC;AAEA,QAAM,eAAe,iBAAiBA,OAAM,cAAc;AAC1D,MAAI,OAAO,gBAAgB,KAAK,iBAAiB,QAAW;AAC1D,eAAW,iBAAiB;AAC5B,2BAAuB,IAAI,gBAAgB;AAAA,EAC7C;AAEA,QAAM,WAAW,WAAWA,OAAM,SAAS;AAC3C,MAAI,OAAO,WAAW,GAAG;AACvB,eAAW,YAAY;AACvB,2BAAuB,IAAI,WAAW;AAAA,EACxC;AAEA,QAAM,SAAS,WAAWA,OAAM,MAAM;AACtC,MAAI,OAAO,QAAQ,GAAG;AACpB,eAAW,SAAS;AACpB,2BAAuB,IAAI,QAAQ;AAAA,EACrC;AAEA,QAAM,mBAAmB,WAAWA,OAAM,kBAAkB;AAC5D,MAAI,OAAO,oBAAoB,GAAG;AAChC,eAAW,qBAAqB;AAChC,2BAAuB,IAAI,oBAAoB;AAAA,EACjD;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsBA,QAA2D;AACxF,QAAM,iBAAiB,MAAM,QAAQA,OAAM,SAAS,KAAKA,OAAM,UAAU,MAAM,qBAAqB,IAChGA,OAAM,YACN;AACJ,QAAM,iBAAiB,MAAM,QAAQA,OAAM,SAAS,KAAKA,OAAM,UAAU,MAAM,qBAAqB,IAChGA,OAAM,YACN;AAEJ,QAAM,cAAc,kBAAkB,eAAe,SAAS,IAC1D,cACA,kBAAkB,eAAe,SAAS,IACxC,cACA,iBACE,cACA,iBACE,cACA;AAEV,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,gBAAgB,cAAc,iBAAiB;AACpE,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,gBAA0B,CAAC;AACjC,QAAM,uBAAuB,gBAAgB,cAAc,cAAc;AACzE,QAAM,sBAAsB,gBAAgB,cAAc,WAAW;AACrE,QAAM,wBAAwB,gBAAgB,cAAcA,OAAM,SAASA,OAAM;AACjF,QAAM,qBAAqB,gBAAgB,cAAc,iBAAiB;AAC1E,MAAI,uBAAuB,MAAM;AAC/B,eAAW,eAAe,oBAAoB;AAAA,EAChD;AACA,MAAI,0BAA0B,QAAW;AACvC,eAAW,eAAe,mBAAmB;AAAA,EAC/C;AAEA,QAAM,yBAAyB,oBAAI,IAAY,CAAC,WAAW,CAAC;AAC5D,QAAM,0BAA0B,+BAA+BA,QAAO,sBAAsB;AAC5F,QAAM,YAAY,aAAa,IAAI,CAAC,UAAU,UAAU;AACtD,QAAI,SAAS,gBAAgB,QAAW;AACtC,iBAAW,eAAe,GAAG,WAAW,IAAI,KAAK,eAAe;AAAA,IAClE;AACA,QAAI,SAAS,YAAY,QAAW;AAClC,iBAAW,eAAe,GAAG,WAAW,IAAI,KAAK,WAAW;AAAA,IAC9D;AAEA,WAAO;AAAA,MACL,MAAM,SAAS,QAAQ;AAAA,MACvB,cAAc,SAAS;AAAA,MACvB,SAAS,SAAS,WAAW;AAAA,MAC7B,QAAQ,MAAM,QAAQ,SAAS,MAAM,IAAI,SAAS,SAAS,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,MAAI;AACJ,QAAM,aAAoD,CAAC;AAC3D,MAAI,gBAAgB,aAAa;AAC/B,2BAAuB,IAAI,SAAS;AACpC,mBAAe,OAAOA,OAAM,YAAY,WAAWA,OAAM,UAAU;AAAA,EACrE,OAAO;AACL,2BAAuB,IAAI,QAAQ;AACnC,QAAI,oBAAoBA,OAAM,MAAM,GAAG;AACrC,qBAAe,OAAOA,OAAM,OAAO,YAAY,WAAWA,OAAM,OAAO,UAAU;AACjF,iBAAW,aAAa,WAAWA,OAAM,OAAO,UAAU;AAC1D,iBAAW,QAAQ,WAAWA,OAAM,OAAO,KAAK;AAChD,iBAAW,cAAc,WAAWA,OAAM,OAAO,WAAW;AAC5D,iBAAW,YAAY,WAAWA,OAAM,OAAO,SAAS;AACxD,iBAAW,uBAAuB,iBAAiBA,OAAM,OAAO,oBAAoB;AAAA,IACtF;AAAA,EACF;AAEA,aAAW,OAAO,OAAO,KAAKA,MAAK,GAAG;AACpC,QAAI,uBAAuB,IAAI,GAAG,GAAG;AACnC;AAAA,IACF;AAEA,eAAW,eAAe,GAAG;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoBA,QAAuD;AACzF,QAAM,aAAa,sBAAsBA,MAAK;AAC9C,MAAI,CAAC,YAAY;AACf,WAAO,0BAA0B;AAAA,EACnC;AAEA,QAAM,aAAa,WAAW,UAAU;AAAA,IAAQ,CAAC,UAAU,mBACxD,SAAS,OAAO,SAAS,SAAS,SAAS,CAAC,EAAE,GAC5C,IAAI,CAAC,WAAW;AAAA,MACf,aAAa,UAAU,SAAS,MAAM,OAAO,aAAa;AAAA,MAC1D,KAAK,SAAS;AAAA,MACd,cAAc,SAAS;AAAA,MACvB,KAAK,SAAS;AAAA,MACd,SAAS,SAAS;AAAA,MAClB,WAAW,4BAA4B,SAAS,YAAY;AAAA,MAC5D,UAAU,4BAA4B,SAAS,YAAY;AAAA,MAC3D;AAAA,MACA,cAAc,SAAS;AAAA,IACzB,EAAE,EACD,OAAO,CAAC,SAAS,KAAK,KAAK;AAAA,EAChC;AAEA,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,cAAc,oBAAI,IAAoB;AAE5C,QAAM,SAAS,WAAW,IAAI,CAAC,UAAU;AACvC,UAAM,QAAQ,QAAQ,IAAI,MAAM,WAAW,KAAK;AAChD,YAAQ,IAAI,MAAM,aAAa,QAAQ,CAAC;AACxC,UAAM,UAAU,UAAU,IAAI,MAAM,cAAc,GAAG,MAAM,WAAW,IAAI,QAAQ,CAAC;AACnF,gBAAY,IAAI,GAAG,MAAM,aAAa,KAAK,CAAC,IAAI,MAAM,KAAK,IAAI,OAAO;AACtE,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,KAAK,MAAM;AAAA,MACX,cAAc,MAAM;AAAA,MACpB,KAAK,MAAM;AAAA,MACX,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AAED,QAAM,qBAAqB,CAAC,KAAyB,cAA0C;AAC7F,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,UAAM,CAAC,iBAAiB,YAAY,IAAI,OAAO,GAAG,EAAE,MAAM,GAAG;AAC7D,UAAM,gBAAgB,mBAAmB,IAAI,KAAK;AAClD,UAAM,aAAa,gBAAgB,IAAI,KAAK;AAC5C,UAAM,aAAa,YAAY,IAAI,GAAG,YAAY,IAAI,SAAS,EAAE;AACjE,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAEA,eAAW,WAAW,eAAe,SAAS;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,wBACJ,OAAO,WAAW,iBAAiB,YAAY,WAAW,aAAa,SAAS;AAClF,QAAM,iBAAiB,wBACnB,mBAAmB,WAAW,cAAc,gBAAgB,IAC5D;AACJ,QAAM,oBAAoB,mBAAmB,WAAW,WAAW,YAAY,mBAAmB;AAClG,QAAM,eAAe,mBAAmB,WAAW,WAAW,OAAO,cAAc;AACnF,QAAM,qBAAqB,mBAAmB,WAAW,WAAW,aAAa,oBAAoB;AACrG,QAAM,mBAAmB,mBAAmB,WAAW,WAAW,WAAW,kBAAkB;AAC/F,QAAM,mBAAmB,WAAW,UAAU,KAAK,CAAC,aAAa,SAAS,QAAQ,WAAW,CAAC;AAC9F,QAAM,uBAAuB,WAAW,UAAU,KAAK,CAAC,cAAc,SAAS,cAAc,KAAK,KAAK,IAAI,WAAW,CAAC;AACvH,QAAM,gBAA0B,CAAC;AAEjC,MAAI,CAAC,gBAAgB;AACnB,kBAAc,KAAK,cAAc;AAAA,EACnC;AACA,MAAI,kBAAkB;AACpB,kBAAc,KAAK,QAAQ;AAAA,EAC7B;AACA,MAAI,sBAAsB;AACxB,kBAAc,KAAK,YAAY;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,GAAG,WAAW;AAAA,MACd,WAAW,CAAC;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,GAAI,iBAAiB,EAAE,SAAS,eAAe,IAAI,CAAC;AAAA,QACpD,GAAI,oBAAoB,EAAE,YAAY,kBAAkB,IAAI,CAAC;AAAA,QAC7D,GAAI,eAAe,EAAE,OAAO,aAAa,IAAI,CAAC;AAAA,QAC9C,GAAI,qBAAqB,EAAE,aAAa,mBAAmB,IAAI,CAAC;AAAA,QAChE,GAAI,WAAW,WAAW,yBAAyB,SAAY,EAAE,sBAAsB,WAAW,WAAW,qBAAqB,IAAI,CAAC;AAAA,QACvI,GAAI,mBAAmB,EAAE,WAAW,iBAAiB,IAAI,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,eAAe,WAAW;AAAA,IAC1B,iBAAiB,cAAc,SAAS;AAAA,IACxC;AAAA,EACF;AACF;AA/YA;AAAA;AAAA;AAAA;AAAA;;;AC4EA,SAAS,uBAAuB,QAAoD;AAClF,MAAI,OAAO,SAAS,aAAa,OAAO,SAAS,eAAe;AAC9D,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,2BAA2B,OAAO,MAAM;AAC3D,MAAI,WAAW,OAAO,WAAW,GAAG;AAClC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf,QAAQ,WAAW;AAAA,MACnB,QAAQ,CAAC;AAAA,MACT,UAAU,WAAW;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW;AAAA,IACnB,UAAU,WAAW;AAAA,EACvB;AACF;AAEA,eAAsB,uBACpB,MAC2C;AAC3C,QAAM,CAAC,eAAe,cAAc,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvE,KAAK,kBAAkB;AAAA,IACvB,KAAK,iBAAiB;AAAA,IACtB,KAAK,aAAa;AAAA,EACpB,CAAC;AAED,SAAO;AAAA,IACL,eAAe,uBAAuB,aAAa;AAAA,IACnD;AAAA,IACA;AAAA,EACF;AACF;AArHA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACmBO,SAASE,mBAAkB,KAAqD;AACrF,QAAM,SAAS,kBAAwB,GAAG;AAC1C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,cAAc,OAAO;AAAA,IACrB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,kBAAkB,OAAO;AAAA,EAC3B;AACF;AAOO,SAAS,mBAAmBC,QAA+C;AAChF,QAAM,YAAYA,OAAM;AAExB,QAAM,SAA6B,UAAU,IAAI,CAAC,MAAM;AACtD,UAAM,SAAS,EAAE,SAASD,mBAAkB,EAAE,MAAM,IAAI;AACxD,UAAM,aAA+B;AAAA,MACnC,IAAI,EAAE,UAAU,KAAK,KAAK,EAAE;AAAA,MAC5B,KAAK,EAAE;AAAA,MACP,SAAS,EAAE;AAAA,MACX,OAAO,EAAE,OAAO,CAAC,KAAK;AAAA,MACtB,WAAW,QAAQ,aAAa;AAAA,MAChC,UAAU,QAAQ,YAAY;AAAA,IAChC;AAEA,UAAM,qBAAqB,EAAE,cAAc,KAAK;AAChD,UAAM,mBAAmB,QAAQ,cAAc,KAAK;AACpD,UAAM,aAAa,sBAAsB;AACzC,QAAI,YAAY;AACd,iBAAW,MAAM;AACjB,iBAAW,eAAe;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT,CAAC;AAED,MAAI,eAAeC,OAAM,cAAc,KAAK;AAC5C,MAAIA,OAAM,gBAAgBA,OAAM,aAAa,SAAS,GAAG,GAAG;AAC1D,UAAM,CAAC,cAAc,SAAS,IAAIA,OAAM,aAAa,MAAM,GAAG;AAC9D,UAAM,UAAU,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,gBAAgB,KAAK,UAAU,SAAS;AAC1F,QAAI,SAAS;AACX,qBAAe,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,MAAIA,OAAM,iBAAiB,UAAa,OAAO,SAAS,GAAG;AACzD,UAAM,eAAe,OAAO,CAAC,EAAE;AAC/B,QAAI,gBAAgB,OAAO,CAAC,EAAE,OAAO;AACnC,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,iBAAiB,MAAM,iBAAiB,QAAW;AACrD,mBAAe;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,eAAe,EAAE,SAAS,aAAa,IAAI,CAAC;AAAA,EACtD;AACF;AAEO,SAAS,mCAAiE;AAC/E,QAAM,mBAAmB,kBAAwB,YAAY;AAC7D,QAAM,UAAU,kBAAkB,gBAAgB;AAClD,QAAM,YAAY,kBAAkB,iBAAiB;AACrD,QAAM,WAAW,kBAAkB,oBAAoB;AAEvD,QAAM,QAAQ,mBAAmB;AAAA,IAC/B,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ,CAAC,SAAS;AAAA,MACpB;AAAA,IACF;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,eAAe,MAAM,SAAS,CAAC;AAErC,SAAO;AAAA,IACL,MAAMC,gBAAe;AAAA,IACrB,MAAMA,gBAAe;AAAA,IACrB,KAAKA,gBAAe;AAAA,IACpB,WAAWA,gBAAe;AAAA,IAC1B,QAAQ,eACJ;AAAA,MACE;AAAA,QACE,IAAI,aAAa;AAAA,QACjB,KAAK,aAAa;AAAA,QAClB,KAAK,aAAa;AAAA,QAClB,WAAW,aAAa;AAAA,QACxB,OAAO,aAAa;AAAA,QACpB;AAAA,MACF;AAAA,IACF,IACA,CAAC;AAAA,IACL,QAAQ,MAAM;AAAA,EAChB;AACF;AAlIA;AAAA;AAAA;AAMA;AACA;AAAA;AAAA;;;ACmCA,eAAsB,mBACpBC,QACoC;AACpC,QAAM,SAASA,OAAM,eAAeA,OAAM,MAAM;AAChD,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,MAAI;AACJ,MAAIA,OAAM,mBAAmB;AAC3B,UAAM,oBAAoB,MAAMA,OAAM,oBAAoB;AAC1D,QAAI,CAAC,mBAAmB;AACtB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,iBAAa;AAAA,EACf;AAEA,QAAMA,OAAM,YAAYA,OAAM,MAAM;AAEpC,SAAO;AAAA,IACL,eAAe;AAAA,IACf,YAAYA,OAAM;AAAA,IAClB;AAAA,EACF;AACF;AAlEA;AAAA;AAAA;AAAA;AAAA;;;AC2BA,SAAS,oBACP,WACA,oBACqB;AACrB,MAAI,UAAU,aAAa,SAAS,SAAS;AAC3C,QAAI,CAAC,oBAAoB;AACvB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,WAAO,uBAAuB,YAC1B,EAAE,MAAM,iBAAiB,IACzB,EAAE,MAAM,aAAa;AAAA,EAC3B;AAEA,MAAI,UAAU,aAAa,SAAS,cAAc;AAChD,QAAI,CAAC,oBAAoB;AACvB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,QAAI,uBAAuB,QAAQ;AACjC,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACrF;AACA,WAAO,EAAE,MAAM,aAAa;AAAA,EAC9B;AAEA,MAAI,oBAAoB;AACtB,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AAEA,SAAO,EAAE,MAAM,aAAa;AAC9B;AAEA,SAAS,uBAA8B;AACrC,QAAM,IAAI,MAAM,+BAA+B;AACjD;AAEA,SAAS,sBAA6B;AACpC,QAAM,IAAI,MAAM,8BAA8B;AAChD;AAEA,SAAS,qBAAqB,oBAA+C;AAC3E,MAAI,oBAAoB;AACtB,wBAAoB;AAAA,EACtB;AACF;AAEA,SAAS,iBACP,WACA,oBACqB;AACrB,SAAO,oBAAoB,WAAW,kBAAkB;AAC1D;AAEA,SAAS,gBAAuB;AAC9B,SAAO,qBAAqB;AAC9B;AAEO,SAAS,kBAAkBC,QAAqD;AACrF,QAAM,EAAE,WAAW,qBAAqB,mBAAmB,IAAIA;AAE/D,MAAI,wBAAwB,UAAU;AACpC,yBAAqB,kBAAkB;AACvC,WAAO,EAAE,MAAM,YAAY;AAAA,EAC7B;AAEA,UAAQ,UAAU,cAAc,MAAM;AAAA,IACpC,KAAK;AACH,UAAI,wBAAwB,SAAS;AACnC,6BAAqB,kBAAkB;AACvC,eAAO,EAAE,MAAM,gBAAgB;AAAA,MACjC;AACA,UAAI,wBAAwB,eAAe,wBAAwB,SAAS;AAC1E,eAAO,iBAAiB,WAAW,kBAAkB;AAAA,MACvD;AACA,aAAO,cAAc;AAAA,IAEvB,KAAK;AACH,UAAI,wBAAwB,UAAU;AACpC,6BAAqB,kBAAkB;AACvC,eAAO,EAAE,MAAM,iBAAiB;AAAA,MAClC;AACA,UAAI,wBAAwB,aAAa;AACvC,eAAO,iBAAiB,WAAW,kBAAkB;AAAA,MACvD;AACA,aAAO,cAAc;AAAA,IAEvB,KAAK;AACH,2BAAqB,kBAAkB;AACvC,UAAI,wBAAwB,WAAW;AACrC,eAAO,EAAE,MAAM,sBAAsB;AAAA,MACvC;AACA,aAAO,cAAc;AAAA,IAEvB,KAAK;AACH,UAAI,wBAAwB,UAAU;AACpC,eAAO,iBAAiB,WAAW,kBAAkB;AAAA,MACvD;AACA,aAAO,cAAc;AAAA,EACzB;AACF;AA7HA;AAAA;AAAA;AAAA;AAAA;;;ACgCA,SAAS,oBAAoB,WAAqD;AAChF,MAAI,UAAU,cAAc,SAAS,WAAW,UAAU,cAAc,SAAS,WAAW;AAC1F,WAAO,UAAU,cAAc;AAAA,EACjC;AAEA,MAAI,UAAU,cAAc,SAAS,eAAe;AAClD,WAAO,UAAU,cAAc;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuBC,QAAwB;AACtD,MAAI,OAAOA,WAAU,YAAYA,WAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,eAAeA;AACrB,MAAI,MAAM,QAAQ,aAAa,SAAS,GAAG;AACzC,WAAO,aAAa,UAAU;AAAA,EAChC;AAEA,MAAI,MAAM,QAAQ,aAAa,SAAS,GAAG;AACzC,WAAO,aAAa,UAAU;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAkC;AAC/D,MAAI,MAAM,QAAQ,MAAM,MAAM,GAAG;AAC/B,WAAO,MAAM,OAAO;AAAA,EACtB;AAEA,MAAI,MAAM,QAAQ,MAAM,SAAS,GAAG;AAClC,WAAO,MAAM,UAAU,OAAO,CAAC,OAAO,aAAa,SAAS,SAAS,QAAQ,UAAU,IAAI,CAAC;AAAA,EAC9F;AAEA,SAAO;AACT;AAEA,eAAsB,SAAS,MAAoC;AACjE,QAAM,YAAY,MAAM,KAAK,uBAAuB;AACpD,QAAM,sBAAsB,MAAM,KAAK,0BAA0B;AAAA,IAC/D,eAAe,UAAU;AAAA,IACzB,cAAc,UAAU;AAAA,EAC1B,CAAC;AAED,MAAI;AACJ,MACE,wBAAwB,YACxB,wBAAwB,eACxB,wBAAwB,SACxB;AACA,QAAI,UAAU,aAAa,SAAS,WAAW,UAAU,aAAa,SAAS,cAAc;AAC3F,2BAAqB,MAAM,KAAK,yBAAyB;AAAA,QACvD,cAAc,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,SAAS,kBAAkB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,OAAO,SAAS,aAAa;AAC/B;AAAA,EACF;AAEA,MAAI,gBAAgB;AAEpB,MAAI,OAAO,SAAS,kBAAkB;AACpC,QAAI,UAAU,cAAc,SAAS,WAAW;AAC9C,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,UAAM,aAAa,KAAK,8BAA8B;AAAA,MACpD,GAAG,UAAU,cAAc;AAAA,MAC3B,GAAG,UAAU,cAAc;AAAA,IAC7B,CAAC;AACD,QAAI,WAAW,SAAS,gBAAgB;AACtC,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,UAAM,YAAY,MAAM,KAAK,kBAAkB;AAAA,MAC7C,eAAe,UAAU,cAAc;AAAA,MACvC,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,UAAM,iBAAiB,MAAM,KAAK,cAAc;AAAA,MAC9C,OAAO;AAAA,MACP,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,UAAM,gBAAgB,MAAM,KAAK,cAAc;AAAA,MAC7C,QAAQ;AAAA,MACR,mBAAmB,UAAU,cAAc;AAAA,MAC3C,mBAAmB;AAAA,IACrB,CAAC;AACD,oBAAgB,cAAc;AAAA,EAChC;AAEA,MAAI,OAAO,SAAS,iBAAiB;AACnC,UAAM,KAAK,mBAAmB;AAAA,MAC5B,eAAe;AAAA,MACf,iBAAiB,UAAU;AAAA,MAC3B,iBAAiB,KAAK;AAAA,IACxB,CAAC;AAED,UAAM,KAAK,gBAAgB;AAC3B;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,uBAAuB;AACzC,UAAM,QAAQ,MAAM,KAAK,iBAAiB;AAC1C,UAAM,gBAAgB,MAAM,KAAK,cAAc;AAAA,MAC7C,QAAQ;AAAA,MACR,mBAAmB,UAAU,cAAc;AAAA,MAC3C,mBAAmB;AAAA,IACrB,CAAC;AACD,oBAAgB,cAAc;AAAA,EAChC;AAEA,MAAI,OAAO,SAAS,cAAc;AAChC,UAAM,QAAQ,MAAM,KAAK,iBAAiB;AAC1C,UAAM,gBAAgB,MAAM,KAAK,cAAc;AAAA,MAC7C,QAAQ;AAAA,MACR,mBAAmB,oBAAoB,SAAS;AAAA,MAChD,mBAAmB,UAAU,cAAc,SAAS;AAAA,IACtD,CAAC;AACD,oBAAgB,cAAc;AAAA,EAChC;AAEA,MAAI,OAAO,SAAS,kBAAkB;AACpC,QAAI,UAAU,aAAa,SAAS,SAAS;AAC3C,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,WAAW,KAAK,oBAAoB,UAAU,aAAa,MAAM;AACvE,SAAK,GAAG,KAAK,oDAAY,uBAAuB,UAAU,aAAa,MAAM,CAAC,wBAAc;AAC5F,SAAK,GAAG,KAAK,8CAAW,sBAAsB,SAAS,KAAK,CAAC,2BAAO;AACpE,QAAI,SAAS,MAAM,OAAO,SAAS;AACjC,WAAK,GAAG,KAAK,yDAAY,SAAS,MAAM,OAAO,OAAO,EAAE;AAAA,IAC1D,OAAO;AACL,WAAK,GAAG,KAAK,gFAAe;AAAA,IAC9B;AACA,QAAI,SAAS,cAAc,SAAS,GAAG;AACrC,WAAK,GAAG,KAAK,qEAAc,SAAS,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,IAChE;AAEA,QAAI,aAAa,SAAS;AAC1B,QAAI,SAAS,iBAAiB;AAC5B,mBAAa,MAAM,KAAK,cAAc;AAAA,QACpC,OAAO,SAAS;AAAA,QAChB,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,UAAM,gBAAgB,MAAM,KAAK,cAAc;AAAA,MAC7C,QAAQ;AAAA,MACR,mBAAmB,oBAAoB,SAAS;AAAA,MAChD,mBAAmB,UAAU,cAAc,SAAS;AAAA,IACtD,CAAC;AACD,oBAAgB,cAAc;AAAA,EAChC;AAEA,MAAI,OAAO,SAAS,gBAAgB,OAAO,SAAS,oBAAoB,OAAO,SAAS,yBAAyB,OAAO,SAAS,kBAAkB;AACjJ,UAAM,KAAK,mBAAmB;AAAA,MAC5B;AAAA,MACA,iBAAiB,UAAU;AAAA,MAC3B,iBAAiB,KAAK;AAAA,IACxB,CAAC;AAED,UAAM,KAAK,gBAAgB;AAC3B;AAAA,EACF;AAEF;AAjNA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;AC+CA,SAAS,kBAA4B;AACnC,MAAI,QAAQ,IAAI,mCAAmC,KAAK;AACtD,UAAM,oBAAgB,yBAAa,GAAG,OAAO;AAC7C,UAAM,UAAU,cAAc,MAAM,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACxG,QAAI,SAAS;AAEb,UAAM,aAAa,YAA6B,QAAQ,QAAQ,KAAK;AAErE,WAAO;AAAA,MACL,MAAM,OAAO,SAAS,SAAS;AAC7B,uBAAAC,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAC3B,gBAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,yBAAAA,OAAO,MAAM,KAAK,QAAQ,CAAC,KAAK,MAAM;AAAA,CAAI;AAAA,QAC5C,CAAC;AAED,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,cAAc,OAAO,MAAM;AACjC,YAAI,OAAO,UAAU,WAAW,KAAK,eAAe,KAAK,eAAe,QAAQ,QAAQ;AACtF,iBAAO,QAAQ,cAAc,CAAC;AAAA,QAChC;AACA,cAAM,UAAU,QAAQ,KAAK,CAAC,WAAW,WAAW,MAAM;AAC1D,YAAI,SAAS;AACX,iBAAO;AAAA,QACT;AACA,cAAM,IAAI,MAAM,gCAAgC,OAAO,MAAM,UAAU,SAAS,EAAE;AAAA,MACpF;AAAA,MACA,MAAM,MAAM,SAAS,cAAc;AACjC,cAAM,SAAS,eAAe,KAAK,YAAY,MAAM;AACrD,uBAAAA,OAAO,MAAM,GAAG,OAAO,GAAG,MAAM,IAAI;AACpC,cAAM,SAAS,MAAM,WAAW;AAChC,eAAO,UAAU,gBAAgB;AAAA,MACnC;AAAA,MACA,KAAK,SAAS;AACZ,uBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,MAC7B;AAAA,MACA,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,eAAAC,MAAM,OAAO;AAChB,QAAI,SAAS;AACb,QAAI,UAAoB,CAAC;AACzB,QAAI,SAAS;AAEb,UAAM,cAAc,YAAY;AAC9B,UAAI,QAAQ;AACV;AAAA,MACF;AACA,eAAS;AACT,YAAM,SAAmB,CAAC;AAC1B,uBAAiB,SAAS,eAAAA,OAAO;AAC/B,eAAO,KAAK,OAAO,KAAK,CAAC;AAAA,MAC3B;AACA,gBAAU,OAAO,KAAK,EAAE,EAAE,MAAM,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,IACtG;AAEA,UAAM,aAAa,YAA6B;AAC9C,YAAM,YAAY;AAClB,aAAO,QAAQ,QAAQ,KAAK;AAAA,IAC9B;AAEA,WAAO;AAAA,MACL,MAAM,OAAO,SAAS,SAAS;AAC7B,uBAAAD,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAC3B,gBAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,yBAAAA,OAAO,MAAM,KAAK,QAAQ,CAAC,KAAK,MAAM;AAAA,CAAI;AAAA,QAC5C,CAAC;AAED,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,cAAc,OAAO,MAAM;AACjC,YAAI,OAAO,UAAU,WAAW,KAAK,eAAe,KAAK,eAAe,QAAQ,QAAQ;AACtF,iBAAO,QAAQ,cAAc,CAAC;AAAA,QAChC;AACA,cAAM,UAAU,QAAQ,KAAK,CAAC,WAAW,WAAW,MAAM;AAC1D,YAAI,SAAS;AACX,iBAAO;AAAA,QACT;AACA,cAAM,IAAI,MAAM,gCAAgC,OAAO,MAAM,UAAU,SAAS,EAAE;AAAA,MACpF;AAAA,MACA,MAAM,MAAM,SAAS,cAAc;AACjC,cAAM,SAAS,eAAe,KAAK,YAAY,MAAM;AACrD,uBAAAA,OAAO,MAAM,GAAG,OAAO,GAAG,MAAM,IAAI;AACpC,cAAM,SAAS,MAAM,WAAW;AAChC,eAAO,UAAU,gBAAgB;AAAA,MACnC;AAAA,MACA,KAAK,SAAS;AACZ,uBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,MAC7B;AAAA,MACA,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAK,kCAAgB,EAAE,sBAAAC,OAAO,uBAAAD,OAAO,CAAC;AAE5C,QAAM,MAAM,OAAO,YAAqC;AACtD,UAAM,SAAS,MAAM,GAAG,SAAS,OAAO;AACxC,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,SAAO;AAAA,IACL,MAAM,OAAO,SAAS,SAAS;AAC7B,qBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAC3B,cAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,uBAAAA,OAAO,MAAM,KAAK,QAAQ,CAAC,KAAK,MAAM;AAAA,CAAI;AAAA,MAC5C,CAAC;AAED,aAAO,MAAM;AACX,cAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,cAAM,cAAc,OAAO,MAAM;AACjC,YAAI,OAAO,UAAU,WAAW,KAAK,eAAe,KAAK,eAAe,QAAQ,QAAQ;AACtF,iBAAO,QAAQ,cAAc,CAAC;AAAA,QAChC;AACA,cAAM,UAAU,QAAQ,KAAK,CAAC,WAAW,WAAW,MAAM;AAC1D,YAAI,SAAS;AACX,iBAAO;AAAA,QACT;AACA,uBAAAA,OAAO,MAAM,oDAAY;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,MAAM,MAAM,SAAS,cAAc;AACjC,YAAM,SAAS,eAAe,KAAK,YAAY,MAAM;AACrD,YAAM,SAAS,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,IAAI;AAChD,aAAO,UAAU,gBAAgB;AAAA,IACnC;AAAA,IACA,KAAK,SAAS;AACZ,qBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,IAC7B;AAAA,IACA,QAAQ;AACN,SAAG,MAAM;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,UAA2B;AAC3D,QAAM,cAAU,yBAAa,UAAU,OAAO;AAC9C,MAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AACA,SAAO,eAAAE,QAAK,KAAK,OAAO;AAC1B;AAEA,SAAS,0BAA8G;AACrH,QAAM,aAAa,CAAC,aAAa,iBAAiB,gBAAgB;AAClE,QAAM,cAAc,WAAW,KAAK,CAAC,iBAAa,uBAAW,QAAQ,CAAC;AACtE,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,SAAS,yBAAyB,WAAW;AACnD,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAA6F,CAAC;AACpG,eAAW,OAAO,CAAC,QAAQ,QAAQ,OAAO,aAAa,gBAAgB,GAAY;AACjF,UAAI,OAAO,GAAG,MAAM,QAAW;AAC7B,eAAO,GAAG,IAAI,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,oCAA4C;AACnD,QAAM,aAAa,CAAC,aAAa,iBAAiB,gBAAgB;AAClE,QAAM,cAAc,WAAW,KAAK,CAAC,iBAAa,uBAAW,QAAQ,CAAC;AACtE,MAAI,CAAC,aAAa;AAChB,WAAOC,gBAAe;AAAA,EACxB;AAEA,MAAI;AACF,UAAM,SAAS,yBAAyB,WAAW;AACnD,QAAI,UAAU,OAAO,OAAO,SAAS,YAAY,OAAO,SAAS,OAAO,IAAI,KAAK,OAAO,OAAO,GAAG;AAChG,aAAO,OAAO;AAAA,IAChB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAOA,gBAAe;AACxB;AAEA,eAAe,mBAAoC;AACjD,QAAM,aAAS,0BAAa;AAC5B,MAAI;AACF,WAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AACpD,aAAO,KAAK,SAAS,MAAM;AAC3B,aAAO,OAAO,GAAG,aAAa,MAAM;AAClC,cAAM,UAAU,OAAO,QAAQ;AAC/B,YAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,iBAAO,IAAI,MAAM,kCAAkC,CAAC;AACpD;AAAA,QACF;AACA,gBAAQ,QAAQ,IAAI;AAAA,MACtB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,UAAE;AACA,QAAI,OAAO,WAAW;AACpB,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW,OAAO,MAAM,CAAC,UAAU,QAAQ,OAAO,KAAK,IAAI,QAAQ,CAAC,CAAC;AAAA,IACzG;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,UAA2B;AACvD,QAAM,cAAU,yBAAa,UAAU,OAAO;AAC9C,MAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,WAAO,cAAAC,QAAM,MAAM,OAAO;AAAA,EAC5B;AACA,SAAO,eAAAF,QAAK,KAAK,OAAO;AAC1B;AAQA,eAAsB,iBAAiB,OAA8B,CAAC,GAAmC;AACvG,QAAM,cAAc,KAAK,eAAW,oBAAQ;AAC5C,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,eAAe,QAAQ,IAAI;AACjC,QAAM,iBAAiB,eACnB,CAAC,YAAY,IACb;AAAA,QACE,mBAAK,aAAa,QAAQ,aAAa;AAAA,QACvC,mBAAK,aAAa,uBAAuB,aAAa;AAAA,QACtD,mBAAK,aAAa,uBAAuB,aAAa;AAAA,EACxD;AAEJ,QAAM,aAAa,eAAe,KAAK,CAAC,aAAa,OAAO,QAAQ,CAAC;AACrE,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,MAAI;AACF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,WAAW,UAAU;AAAA,IAC/B;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,eAAe,oBAAqD;AAClE,QAAM,aAAa,CAAC,aAAa,iBAAiB,gBAAgB;AAClE,QAAM,cAAc,WAAW,KAAK,CAAC,iBAAa,uBAAW,QAAQ,CAAC;AACtE,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,MAAI;AACF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,YAAY,SAAS,OAAO,IAAI,SAAS,YAAY,SAAS,MAAM,IAAI,QAAQ;AAAA,MACxF,QAAS,yBAAyB,WAAW,KAAK,CAAC;AAAA,IACrD;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,YAAY,SAAS,OAAO,IAAI,SAAS,YAAY,SAAS,MAAM,IAAI,QAAQ;AAAA,MACxF,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,eAAe,eAAe;AAC5B,QAAM,OAAO,kCAAkC;AAC/C,QAAM,UAAU,MAAM,eAAe,MAAM,GAAG;AAC9C,MAAI,SAAS;AACX,WAAO,iBAAiB,IACpB,EAAE,MAAM,gBAAyB,KAAK,IACtC,EAAE,MAAM,qBAA8B,KAAK;AAAA,EACjD;AAEA,QAAM,WAAW,MAAM,kBAAkB,MAAM,GAAG;AAClD,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,MAAM,OAAgB;AAAA,EACjC;AAEA,SAAO,iBAAiB,IACpB,EAAE,MAAM,kBAA2B,KAAK,IACxC,EAAE,MAAM,qBAA8B,KAAK;AACjD;AAEA,eAAe,kBAAiC;AAC9C,MAAI,QAAQ,IAAI,8BAA8B,KAAK;AACjD;AAAA,EACF;AACA,QAAM,YAAY,MAAM;AACxB,QAAM,UAAU,cAAc;AAChC;AAEA,SAAS,sCAA+C;AACtD,SAAO,QAAQ,IAAI,8BAA8B;AACnD;AAEA,eAAe,eAA8B;AAC3C,QAAM,eAAe,MAAM,OAAO,eAAe;AACjD,eAAa,MAAM,QAAQ,UAAU,CAAC,QAAQ,KAAK,CAAC,GAAG,OAAO,GAAG;AAAA,IAC/D,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK,EAAE,GAAG,QAAQ,KAAK,YAAY,IAAI;AAAA,EACzC,CAAC,EAAE,MAAM;AACX;AAEA,eAAe,iBAAgC;AAC7C,QAAM,OAAO,gBAAgB;AAC7B,MAAI,MAAM;AACR,QAAI;AACF,kBAAY,KAAK,GAAG;AACpB,YAAM,mBAAmB,KAAK,KAAK,GAAI;AAAA,IACzC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,aAAa;AACrB;AAEA,SAAS,8BAA8B,QAAkB;AACvD,QAAM,SAAS,gBAAgB,MAAM;AACrC,SAAO,OAAO,SAAS,cAAc,IACjC,EAAE,MAAM,gBAAyB,OAAO,IACxC,EAAE,MAAM,UAAmB,OAAO;AACxC;AAEA,SAAS,4BAA4B,QAA4D;AAC/F,MAAI,WAAW,WAAW,WAAW,4EAAgB;AACnD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,eAAe,WAAW,0DAAa;AACpD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,WAAW,WAAW,sEAAe;AAClD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,+BAA+B;AACjD;AAEA,SAAS,sBAAsB,QAAoC;AACjE,MAAI,WAAW,aAAa,WAAW,0DAAa;AAClD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU,WAAW,0DAAa;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,8BAA8B;AAChD;AAEA,SAAS,oBAAoB,QAAgD;AAC3E,MAAI,WAAW,gBAAM;AACnB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,gBAAM;AACnB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAY,UAAoC;AAC/E,MAAI,CAAC,YAAY,CAAC,OAAO,KAAK,QAAQ,EAAE,QAAQ;AAC9C,WAAO,MAAM;AACb,WAAO;AAAA,EACT;AAEA,QAAM,WAAW;AAAA,IACf,GAAI,MAAM,YAAY,CAAC;AAAA,IACvB,GAAG;AAAA,EACL;AAEA,MAAI,CAAC,OAAO,KAAK,MAAM,YAAY,CAAC,CAAC,EAAE,QAAQ;AAC7C,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEA,eAAe,yBAAyB,IAAc,iBAA2C;AAC/F,QAAM,aAAa,MAAM,GAAG,MAAM,uCAAmB,OAAO,iBAAiB,eAAe,EAAE,CAAC;AAC/F,QAAM,kBAAkB,MAAM,GAAG,OAAO,qBAAqB,CAAC,gBAAM,gBAAM,cAAI,CAAC;AAC/E,QAAM,aAAa,MAAM,GAAG,OAAO,gBAAgB,CAAC,gBAAM,gBAAM,cAAI,CAAC;AACrE,QAAM,cAAc,MAAM,GAAG,OAAO,iBAAiB,CAAC,gBAAM,gBAAM,cAAI,CAAC;AAEvE,QAAM,eAAwC,CAAC;AAC/C,MAAI,WAAW,KAAK,GAAG;AACrB,iBAAa,cAAc,WAAW,KAAK;AAAA,EAC7C;AAEA,QAAM,YAAY,oBAAoB,eAAe;AACrD,MAAI,cAAc,QAAW;AAC3B,iBAAa,qBAAqB;AAAA,EACpC;AAEA,QAAM,QAAQ,oBAAoB,UAAU;AAC5C,MAAI,UAAU,QAAW;AACvB,iBAAa,iBAAiB;AAAA,EAChC;AAEA,QAAM,SAAS,oBAAoB,WAAW;AAC9C,MAAI,WAAW,QAAW;AACxB,iBAAa,kBAAkB;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,eAAe,iCAAiC,OAA0B,IAAc;AACtF,MAAI,CAAC,MAAM,QAAQ,QAAQ;AACzB;AAAA,EACF;AAEA,aAAW,SAAS,MAAM,QAAQ;AAChC,UAAM,aAAa,MAAM,MAAM,MAAM,SAAS;AAC9C,UAAM,aAAa,MAAM,GAAG,OAAO,wCAAU,UAAU,mCAAoB,CAAC,kCAAS,yBAAe,CAAC;AACrG,QAAI,eAAe,2BAAiB;AAClC;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,yBAAyB,IAAI,MAAM,QAAQ;AAClE,4BAAwB,OAAO,QAAQ;AAAA,EACzC;AACF;AAEA,SAAS,kBAAkB,QAAgC;AACzD,QAAM,gBAAgB,CAAC,MAAM,QAAQ,QAAQ,MAAM,KAAK,MAAM,QAAQ,QAAQ,SAAS,IACnF,OAAO,UAAU;AAAA,IAAQ,CAAC,cACvB,MAAM,QAAQ,SAAS,MAAM,IAAI,SAAS,SAAS,CAAC,GAAG,IAAI,CAAC,WAAmB;AAAA,MAC9E,IAAI,GAAG,SAAS,IAAI,IAAI,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,YAAY,EAAE,CAAC;AAAA,MACvG,KAAK,SAAS,WAAW;AAAA,MACzB,SAAS,SAAS,WAAW;AAAA,MAC7B,KAAK,SAAS;AAAA,MACd,cAAc,SAAS;AAAA,MACvB,WAAW,SAAS,cAAc,SAAS,cAAc,IAAI,cAAc;AAAA,MAC3E,UAAU,SAAS,cAAc,SAAS,cAAc,IAAI,cAAc;AAAA,MAC1E;AAAA,IACF,EAAE;AAAA,EACJ,IACA,CAAC;AAEL,SAAO;AAAA,IACL,WAAW,MAAM,QAAQ,QAAQ,SAAS,IACtC,OAAO,UAAU,IAAI,CAAC,cAAmB;AAAA,MACvC,MAAM,SAAS,QAAQ;AAAA,MACvB,SAAS,SAAS,WAAW;AAAA,MAC7B,cAAc,SAAS;AAAA,MACvB,QAAQ,MAAM,QAAQ,SAAS,MAAM,IAAI,CAAC,GAAG,SAAS,MAAM,IAAI,CAAC;AAAA,MACjE,aAAa,SAAS,aAAa,MAAM,EAAE,KAAK,CAAC,GAAG,SAAS,YAAY,GAAG,EAAE,IAAI;AAAA,IACpF,EAAE,IACF,CAAC;AAAA,IACL,QAAQ,MAAM,QAAQ,QAAQ,MAAM,IAChC,OAAO,OAAO,IAAI,CAAC,WAAgB;AAAA,MACjC,IAAI,MAAM,MAAM;AAAA,MAChB,KAAK,MAAM,OAAO,MAAM,WAAW;AAAA,MACnC,SAAS,MAAM,WAAW;AAAA,MAC1B,KAAK,MAAM,OAAO,MAAM;AAAA,MACxB,cAAc,MAAM;AAAA,MACpB,WAAW,MAAM,aAAa,MAAM;AAAA,MACpC,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM,SAAS;AAAA,MACtB,UAAU,OAAO,MAAM,aAAa,WAChC,MAAM,WACN,MAAM,WACJ,EAAE,GAAG,MAAM,SAAS,IACpB;AAAA,MACN,UAAU,MAAM,WAAW,EAAE,GAAG,MAAM,SAAS,IAAI;AAAA,IACrD,EAAE,IACF;AAAA,IACJ,QAAQ;AAAA,MACN,SAAS,MAAM,QAAQ,QAAQ,MAAM,IACjC,QAAQ,QAAQ,UAChB,MAAM,QAAQ,QAAQ,SAAS,KAAK,OAAO,QAAQ,QAAQ,YAAY,YAAY,OAAO,OAAO,QAAQ,SAAS,GAAG,IACnH,cAAc,KAAK,CAAC,SAAS;AAC3B,cAAM,CAAC,cAAc,SAAS,IAAI,OAAO,OAAO,QAAQ,MAAM,GAAG;AACjE,eAAO,KAAK,GAAG,WAAW,GAAG,YAAY,GAAG,KAAK,KAAK,UAAU;AAAA,MAClE,CAAC,GAAG,KACJ,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,cAAsB,OAAe,QAAmC;AAClG,QAAM,mBAAmB,kBAAkB,MAAM;AACjD,MAAI,kBAAkB,cAAc;AAClC,WAAO,iBAAiB;AAAA,EAC1B;AAEA,QAAM,SAAS,SAAS,gBAAgB;AACxC,SAAO,OAAO,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,YAAY,EAAE,KAAK;AACrF;AAEA,eAAe,iBAAiB,IAA0C;AACxE,QAAM,cAAc,MAAM,GAAG,OAAO,0DAAa,CAAC,oDAAY,sCAAQ,CAAC;AAEvE,MAAI,SAA4B;AAChC,MAAI,eAAe;AACnB,MAAI,aAAa;AAEjB,MAAI,gBAAgB,oDAAY;AAC9B,UAAM,gBAAgB,uBAAuB,OAAO;AACpD,aAAS,MAAM,GAAG,OAAO,sCAAkB,aAAa;AACxD,mBAAe,MAAM,GAAG,MAAM,yBAAe,MAAM;AACnD,iBAAa,WAAW,WAAW,MAAM,GAAG,MAAM,cAAc,IAAI,MAAM,GAAG,MAAM,gEAAwB,EAAE;AAAA,EAC/G,OAAO;AACL,mBAAe,MAAM,GAAG,MAAM,yBAAe,UAAU;AACvD,iBAAa,MAAM,GAAG,MAAM,cAAc;AAAA,EAC5C;AAEA,QAAM,SAAS,MAAM,GAAG,MAAM,SAAS;AACvC,QAAM,mBAAmB,kBAAkB,MAAM;AACjD,QAAM,QAAQ,MAAM,GAAG,MAAM,kCAAS,kBAAkB,iBAAiB,EAAE;AAC3E,QAAM,UAAU,MAAM,GAAG,MAAM,+BAAW,mBAAmB,cAAc,OAAO,MAAM,CAAC;AACzF,QAAM,iBAAiB,MAAM,GAAG,OAAO,oDAAsB,CAAC,4BAAQ,sCAAkB,CAAC;AAEzF,QAAM,QAAQ,mBAAmB;AAAA,IAC/B,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ,CAAC,KAAK;AAAA,QACd;AAAA,QACA,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AAED,MAAI,mBAAmB,0CAAsB,MAAM,SAAS,CAAC,GAAG;AAC9D,UAAM,iCAAiC,OAAO,EAAE;AAAA,EAClD;AAEA,SAAO;AACT;AAEA,eAAe,cAAcD,QAAiG;AAC5H,QAAM,QAAQ,kBAAkBA,OAAM,KAAK;AAE3C,MAAIA,OAAM,OAAO,SAAS,cAAc,GAAG;AACzC,UAAM,kBAAkB,MAAM,SAAS,CAAC,GAAG,MAAM,MAAM,YAAY,CAAC,GAAG,QAAQ;AAC/E,UAAM,eAAe,MAAM,SAAS,CAAC,GAAG,SAAS,MAAM,YAAY,CAAC,GAAG,SAAS,CAAC,KAAK;AACtF,UAAM,QAAQ,MAAMA,OAAM,GAAG,MAAM,4BAAQ,YAAY;AACvD,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,YAAM,OAAO,CAAC,EAAE,QAAQ;AACxB,YAAM,OAAO,UAAU;AAAA,IACzB,WAAW,MAAM,YAAY,CAAC,GAAG;AAC/B,YAAM,UAAU,CAAC,EAAE,SAAS,CAAC,KAAK;AAClC,YAAM,OAAO,UAAU,GAAG,eAAe,IAAI,KAAK;AAAA,IACpD;AAAA,EACF;AAEA,MAAIA,OAAM,OAAO,SAAS,QAAQ,GAAG;AACnC,UAAM,SAAS,MAAMA,OAAM,GAAG,MAAM,SAAS;AAC7C,QAAI,MAAM,QAAQ,QAAQ;AACxB,YAAM,SAAS,MAAM,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,KAAK,MAAM,OAAO,QAAQ,SAAS,MAAM,WAAW,OAAO,EAAE;AAAA,IACvH,OAAO;AACL,YAAM,YAAY,MAAM,WAAW,IAAI,CAAC,cAAc,EAAE,GAAG,UAAU,SAAS,SAAS,WAAW,OAAO,EAAE;AAAA,IAC7G;AAAA,EACF;AAEA,MAAIA,OAAM,OAAO,SAAS,YAAY,GAAG;AACvC,UAAM,aAAa,MAAMA,OAAM,GAAG,MAAM,cAAc;AACtD,QAAI,MAAM,QAAQ,QAAQ;AACxB,YAAM,SAAS,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,QAC1C,GAAG;AAAA,QACH,KAAK,MAAM,OAAO;AAAA,QAClB,cAAc,MAAM,gBAAgB;AAAA,MACtC,EAAE;AAAA,IACJ,OAAO;AACL,YAAM,YAAY,MAAM,WAAW,IAAI,CAAC,cAAc;AAAA,QACpD,GAAG;AAAA,QACH,cAAc,SAAS,gBAAgB;AAAA,MACzC,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,MAAIA,OAAM,OAAO,SAAS,iBAAiB,KAAK,MAAM,SAAS,CAAC,GAAG;AACjE,UAAM,iCAAiC,OAAOA,OAAM,EAAE;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAK,gBAAgB,GAAqB;AACnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB,aAAa;AAAA,IACb;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,cAAc,MAAM,eAAe,kCAAkC,GAAG,GAAI;AAAA,IAC5E;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,IAAoB;AACjD,KAAG,KAAK,sFAAgB;AACxB,KAAG,KAAK,6MAAkD;AAC1D,KAAG,KAAK,uKAA0C;AAClD,KAAG,KAAK,4EAAyC;AACnD;AAEA,eAAsB,YAAY,YAAuD;AACvF,QAAM,WAAW,kBAAkB,YAAY,EAAE;AACjD,QAAM,OAAO,EAAE,GAAG,UAAU,GAAG,WAAW;AAE1C,MAAI;AACF,UAAM,SAAS;AAAA,MACb,wBAAwB,MACtB,uBAAuB;AAAA,QACrB,mBAAmB,KAAK;AAAA,QACxB,kBAAkB,KAAK;AAAA,QACvB,cAAc,KAAK;AAAA,MACrB,CAAC;AAAA,MACH,2BAA2B,OAAO,EAAE,cAAc,MAAM;AACtD,YAAI,cAAc,SAAS,WAAW;AACpC,iBAAO;AAAA,QACT;AACA,YAAI,cAAc,SAAS,SAAS;AAClC,eAAK,GAAG,KAAK,2FAAoC;AACjD,cAAI,cAAc,SAAS,SAAS,GAAG;AACrC,iBAAK,GAAG,KAAK,6CAAU,cAAc,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,UAC5D;AACA,iBAAO;AAAA,YACL,MAAM,KAAK,GAAG,OAAO,8FAAmB;AAAA,cACtC;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,cAAc,SAAS,WAAW;AACpC,eAAK,GAAG,KAAK,yDAAY,cAAc,OAAO,KAAK,IAAI,CAAC,EAAE;AAC1D,cAAI,cAAc,SAAS,SAAS,GAAG;AACrC,iBAAK,GAAG,KAAK,6CAAU,cAAc,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,UAC5D;AACA,iBAAQ,MAAM,KAAK,GAAG,OAAO,kCAAS,CAAC,UAAU,aAAa,QAAQ,CAAC;AAAA,QACzE;AAEA,aAAK,GAAG,KAAK,yDAAY,cAAc,KAAK,EAAE;AAC9C,eAAQ,MAAM,KAAK,GAAG,OAAO,kCAAS,CAAC,WAAW,QAAQ,CAAC;AAAA,MAC7D;AAAA,MACA,0BAA0B,OAAO,EAAE,aAAa,MAAM;AACpD,YAAI,aAAa,SAAS,SAAS;AACjC,iBAAO;AAAA,YACL,MAAM,KAAK,GAAG,OAAO,0IAA2C;AAAA,cAC9D;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,aAAa,SAAS,cAAc;AACtC,eAAK,GAAG,KAAK,wDAAgB,aAAa,KAAK,EAAE;AAAA,QACnD;AACA,eAAO;AAAA,MACT;AAAA,MACA,kBAAkB,MAAM,iBAAiB,KAAK,EAAE;AAAA,MAChD,mBAAmB,OAAO,EAAE,cAAc,MAAM,kBAAkB,aAAa;AAAA,MAC/E,eAAe,CAAC,EAAE,OAAO,OAAO,MAAM,cAAc,EAAE,OAAO,QAAQ,IAAI,KAAK,GAAG,CAAC;AAAA,MAClF;AAAA,MACA;AAAA,MACA,IAAI,KAAK;AAAA,MACT,eAAe,OAAO,EAAE,QAAQ,mBAAmB,kBAAkB,MAAM;AACzE,YAAI,aAAa,2BAA2B;AAAA,UAC1C,GAAI,oBAAoB,wBAAwB,IAAI,CAAC;AAAA,UACrD,GAAI;AAAA,QACN,CAAC;AACD;AACE,gBAAM,aAAa,WAAW,OAAO,QAAQE,gBAAe;AAC5D,gBAAM,WAAW,MAAM,kBAAkB,YAAY,GAAG;AACxD,cAAI,YAAY,CAAC,iBAAiB,GAAG;AACnC,kBAAM,eAAe,MAAM,iBAAiB;AAC5C,iBAAK,GAAG,KAAK,8CAAW,UAAU,+FAAyB,YAAY,QAAG;AAC1E,yBAAa,2BAA2B;AAAA,cACtC,GAAG,WAAW;AAAA,cACd,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM,YAAY,MAAM,mBAAmB;AAAA,UACzC,QAAQ,WAAW;AAAA,UACnB;AAAA,UACA;AAAA,UACA,gBAAgB,CAAC,gBAAgB,2BAA2B,WAAW,EAAE;AAAA,UACzE,qBAAqB,KAAK;AAAA,UAC1B,aAAa,KAAK;AAAA,QACpB,CAAC;AACD,YAAI,WAAW,SAAS,SAAS,GAAG;AAClC,eAAK,GAAG,KAAK,iCAAQ,WAAW,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,QACvD;AACA,eAAO;AAAA,MACT;AAAA,MACA,oBAAoB,OAAO,EAAE,eAAe,iBAAiB,gBAAgB,MAAM;AACjF,cAAM,2BAA2B,gBAC7B,MAAM,KAAK,aAAa,IACxB;AACJ,cAAM,SAAS,oBAAoB;AAAA,UACjC;AAAA,UACA,iBAAiB;AAAA,UACjB;AAAA,QACF,CAAC;AAED,cAAM,mBAAmB;AAAA,UACvB;AAAA,UACA,cAAc,KAAK;AAAA,UACnB,eAAe,KAAK;AAAA,UACpB,gBAAgB,KAAK;AAAA,UACrB,cAAc,KAAK;AAAA,QACrB,CAAC;AAED,eAAO;AAAA,UACL,QAAQ,OAAO;AAAA,UACf,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,iBAAiB,YAAY;AAC3B,8BAAsB,KAAK,EAAE;AAC7B,YAAI,CAAC,oCAAoC,GAAG;AAC1C,eAAK,GAAG,KAAK,mIAAoC;AACjD,eAAK,GAAG,KAAK,qLAAuE;AACpF;AAAA,QACF;AAEA,aAAK,GAAG,QAAQ;AAChB,cAAM,KAAK,gBAAgB;AAAA,MAC7B;AAAA,MACA,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH,UAAE;AACA,SAAK,GAAG,QAAQ;AAAA,EAClB;AACF;AAhyBA,IAAAE,YACAC,aACAC,YACAC,cACAC,kBACA,gBACAC,eACA;AAPA,IAAAC,cAAA;AAAA;AAAA;AAAA,IAAAN,aAAyC;AACzC,IAAAC,cAA6B;AAC7B,IAAAC,aAAwB;AACxB,IAAAC,eAAqB;AACrB,IAAAC,mBAAgC;AAChC,qBAAiD;AACjD,IAAAC,gBAAkB;AAClB,qBAAiB;AAEjB;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACyCA,SAAS,uCAAuC,OAA6B;AAC3E,QAAM,WAAW,mBAAmB;AAAA,IAClC,WAAW,CAAC;AAAA,IACZ,QAAQ,CAAC,KAAK;AAAA,IACd,QAAQ;AAAA,MACN,SAAS,MAAM;AAAA,IACjB;AAAA,EACF,CAAe;AACf,QAAM,gBAAgB,SAAS,SAAS,MAAM,EAAE;AAChD,MAAI,CAAC,eAAe;AAClB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,6BAA6B;AAAA,IAC3C,OAAO,cAAc;AAAA,IACrB,WAAW,cAAc,aAAa;AAAA,IACtC,sBAAsB,cAAc;AAAA,IACpC,cAAc,cAAc;AAAA,IAC5B,SAAS;AAAA,MACP,OAAO,cAAc;AAAA,MACrB,YAAY;AAAA,MACZ,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,YAAY;AAAA,gBACZ,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,cAAc;AAAA,YACZ,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO,EAAE,MAAM,SAAS;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,QAAQ,YAAY,IAAI,CAAC,SAAS,2BAA2B,IAA+B,CAAC;AACtG;AAEA,SAAS,OAAO,MAAuB;AACrC,SAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,SAAS,IAAI;AAC5C;AAEA,SAASE,mBAA6B;AACpC,MAAI,QAAQ,IAAI,oCAAoC,KAAK;AACvD,UAAM,oBAAgB,yBAAa,GAAG,OAAO;AAC7C,UAAM,UAAU,cAAc,MAAM,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AACtF,QAAI,SAAS;AACb,UAAM,aAAa,YAAY,QAAQ,QAAQ,KAAK;AAEpD,WAAO;AAAA,MACL,KAAK,SAAS;AACZ,wBAAAC,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,MAC7B;AAAA,MACA,MAAM,SAAS;AACb,wBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,MAC7B;AAAA,MACA,MAAM,OAAO,SAAS,SAAS;AAC7B,wBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAC3B,gBAAQ,QAAQ,CAAC,QAAQC,WAAU,gBAAAD,OAAO,MAAM,KAAKC,SAAQ,CAAC,KAAK,MAAM;AAAA,CAAI,CAAC;AAC9E,cAAM,SAAS,MAAM,WAAW;AAChC,cAAM,QAAQ,OAAO,MAAM;AAC3B,YAAI,OAAO,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS,QAAQ,QAAQ;AACpE,iBAAO,QAAQ,QAAQ,CAAC;AAAA,QAC1B;AACA,eAAO,QAAQ,KAAK,CAAC,WAAW,WAAW,MAAM,KAAK,QAAQ,CAAC;AAAA,MACjE;AAAA,MACA,MAAM,MAAM,SAAS,cAAc;AACjC,wBAAAD,OAAO,MAAM,GAAG,OAAO,GAAG,eAAe,KAAK,YAAY,MAAM,EAAE,IAAI;AACtE,cAAM,SAAS,MAAM,WAAW;AAChC,eAAO,UAAU,gBAAgB;AAAA,MACnC;AAAA,MACA,MAAM,QAAQ,SAAS,eAAe,MAAM;AAC1C,wBAAAA,OAAO,MAAM,GAAG,OAAO,IAAI,eAAe,UAAU,OAAO;AAAA,CAAI;AAC/D,cAAM,UAAU,MAAM,WAAW,GAAG,YAAY;AAChD,YAAI,CAAC,QAAQ;AACX,iBAAO;AAAA,QACT;AACA,eAAO,CAAC,KAAK,OAAO,KAAK,MAAM,EAAE,SAAS,MAAM;AAAA,MAClD;AAAA,MACA,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAK,kCAAgB,EAAE,uBAAAE,OAAO,wBAAAF,OAAO,CAAC;AAC5C,QAAM,MAAM,OAAO,aAAqB,MAAM,GAAG,SAAS,OAAO,GAAG,KAAK;AAEzE,SAAO;AAAA,IACL,KAAK,SAAS;AACZ,sBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,IAC7B;AAAA,IACA,MAAM,SAAS;AACb,sBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,IAC7B;AAAA,IACA,MAAM,OAAO,SAAS,SAAS;AAC7B,sBAAAA,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAC3B,cAAQ,QAAQ,CAAC,QAAQ,UAAU,gBAAAA,OAAO,MAAM,KAAK,QAAQ,CAAC,KAAK,MAAM;AAAA,CAAI,CAAC;AAC9E,aAAO,MAAM;AACX,cAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,cAAM,QAAQ,OAAO,MAAM;AAC3B,YAAI,OAAO,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS,QAAQ,QAAQ;AACpE,iBAAO,QAAQ,QAAQ,CAAC;AAAA,QAC1B;AACA,cAAM,UAAU,QAAQ,KAAK,CAAC,WAAW,WAAW,MAAM;AAC1D,YAAI,SAAS;AACX,iBAAO;AAAA,QACT;AACA,wBAAAA,OAAO,MAAM,oDAAY;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,MAAM,MAAM,SAAS,cAAc;AACjC,YAAM,SAAS,MAAM,IAAI,GAAG,OAAO,GAAG,eAAe,KAAK,YAAY,MAAM,EAAE,IAAI;AAClF,aAAO,UAAU,gBAAgB;AAAA,IACnC;AAAA,IACA,MAAM,QAAQ,SAAS,eAAe,MAAM;AAC1C,YAAM,UAAU,MAAM,IAAI,GAAG,OAAO,IAAI,eAAe,UAAU,OAAO,IAAI,GAAG,YAAY;AAC3F,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AACA,aAAO,CAAC,KAAK,KAAK,EAAE,SAAS,MAAM;AAAA,IACrC;AAAA,IACA,QAAQ;AACN,SAAG,MAAM;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,sBAAgC;AACvC,SAAO,CAAC,aAAa,iBAAiB,gBAAgB;AACxD;AAEA,SAAS,sBAAsB,KAAkD;AAC/E,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,SAAS,cAAc,IAAI,cAAc;AAC1D;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,MAAM,KAAK,EAAE,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,YAAY,EAAE,KAAK;AAC3F;AAEA,SAAS,wBAAwB,UAAkB,SAA8F;AAC/I,MAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,QAAI;AACF,aAAO,EAAE,QAAQ,KAAK,MAAM,OAAO,GAAG,eAAe,OAAO,UAAU,CAAC,EAAE;AAAA,IAC3E,QAAQ;AACN,aAAO;AAAA,QACL,QAAQ,cAAAG,QAAM,MAAM,OAAO;AAAA,QAC3B,eAAe;AAAA,QACf,UAAU,CAAC,qKAA6C;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,WAAO,EAAE,QAAQ,gBAAAC,QAAK,KAAK,OAAO,GAA0B,eAAe,OAAO,UAAU,CAAC,EAAE;AAAA,EACjG,SAAS,OAAY;AACnB,UAAM,YAAY,QAAQ,QAAQ,OAAO,IAAI;AAC7C,QAAI,cAAc,SAAS;AACzB,aAAO;AAAA,QACL,QAAQ,gBAAAA,QAAK,KAAK,SAAS;AAAA,QAC3B,eAAe;AAAA,QACf,UAAU,CAAC,4IAAwC;AAAA,MACrD;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,oBAAuC;AAC9C,QAAM,eAAe,oBAAoB,EAAE,KAAK,CAAC,iBAAa,uBAAW,QAAQ,CAAC;AAClF,QAAM,OAAO,gBAAgB;AAC7B,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,eAAe;AAAA,MACf,UAAU,CAAC,+EAAkC;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,cAAU,yBAAa,cAAc,OAAO;AAClD,QAAM,SAAS,wBAAwB,cAAc,OAAO;AAC5D,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,eAAe,OAAO;AAAA,IACtB,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,EACjB;AACF;AAEA,SAAS,iBAAiB,OAA8C;AACtE,SAAO,MAAM,IAAI,KAAK,KAAK,gBAAgB,MAAM,SAAS,EAAE;AAC9D;AAEA,SAAS,0BAA0B,QAAiF;AAClH,QAAM,aAAkC;AAAA,IACtC,GAAG;AAAA,IACH,MAAM,OAAO,QAAQC,gBAAe;AAAA,IACpC,MAAM,OAAO,QAAQA,gBAAe;AAAA,IACpC,KAAK,OAAO,OAAOA,gBAAe;AAAA,IAClC,WAAW,OAAO,aAAaA,gBAAe;AAAA,EAChD;AACA,QAAM,UAAoB,CAAC;AAE3B,MAAI,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,GAAG;AAC5D,eAAW,SAAS,OAAO,OAAO,IAAI,CAAC,MAAM,UAAU;AACrD,YAAM,MAAM,YAAY,IAAI;AAC5B,YAAM,MAAM,YAAY,IAAI;AAC5B,YAAM,oBAAoB,kBAAkB,IAAI,KAAK,sBAAsB,GAAG;AAC9E,YAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ,gBAAgB,KAAK,KAAK,IAAI,SAAS,QAAQ,CAAC;AAE5F,UAAI,CAAC,KAAK,IAAI,KAAK,GAAG;AACpB,gBAAQ,KAAK,6BAAc,KAAK,WAAW,EAAE,EAAE;AAAA,MACjD;AACA,UAAI,qBAAqB,CAAC,kBAAkB,IAAI,GAAG;AACjD,gBAAQ,KAAK,6BAAc,KAAK,kBAAkB,iBAAiB,EAAE;AAAA,MACvE;AACA,UAAI,OAAO,KAAK,QAAQ,KAAK;AAC3B,gBAAQ,KAAK,6BAAc,KAAK,OAAO;AAAA,MACzC;AACA,UAAI,OAAO,KAAK,QAAQ,KAAK;AAC3B,gBAAQ,KAAK,6BAAc,KAAK,OAAO;AAAA,MACzC;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,cAAc,OAAO;AAAA,QACrB,KAAK,OAAO;AAAA,QACZ,SAAS,OAAO;AAAA,QAChB,WAAW;AAAA,QACX,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAED,QAAI,CAAC,WAAW,QAAQ,SAAS;AAC/B,UAAI,WAAW,OAAO,WAAW,GAAG;AAClC,mBAAW,SAAS;AAAA,UAClB,GAAI,WAAW,UAAU,CAAC;AAAA,UAC1B,SAAS,iBAAiB,WAAW,OAAO,CAAC,CAAC;AAAA,QAChD;AACA,gBAAQ,KAAK,wCAAyB,WAAW,OAAO,OAAO,EAAE;AAAA,MACnE,WAAW,OAAO,OAAO,QAAQ,YAAY,YAAY,OAAO,OAAO,QAAQ,SAAS,GAAG,GAAG;AAC5F,cAAM,CAAC,cAAc,SAAS,IAAI,OAAO,OAAO,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAC5F,cAAM,UAAU,WAAW,OAAO;AAAA,UAAK,CAAC,SACtC,KAAK,UAAU,cAAc,KAAK,OAAO,gBAAgB,KAAK,GAAG,WAAW,GAAG,gBAAgB,YAAY,CAAC,GAAG;AAAA,QACjH;AACA,YAAI,SAAS;AACX,qBAAW,SAAS;AAAA,YAClB,GAAI,WAAW,UAAU,CAAC;AAAA,YAC1B,SAAS,QAAQ;AAAA,UACnB;AACA,kBAAQ,KAAK,wCAAyB,QAAQ,EAAE,EAAE;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,MAAM,QAAQ,OAAO,SAAS,KAAK,OAAO,UAAU,SAAS,GAAG;AACzE,UAAM,WAAW,oBAAoB,MAAa;AAClD,eAAW,SAAS,SAAS,MAAM;AACnC,eAAW,SAAS;AAAA,MAClB,GAAI,WAAW,UAAU,CAAC;AAAA,MAC1B,GAAG,SAAS,MAAM;AAAA,IACpB;AACA,eAAW,YAAY,CAAC;AACxB,YAAQ,KAAK,wFAAsC;AAAA,EACrD;AAEA,SAAO,EAAE,QAAQ,YAAY,QAAQ;AACvC;AAEA,eAAe,2BACb,QACA,IAC6D;AAC7D,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAkC;AAAA,IACtC,GAAG;AAAA,IACH,QAAQ,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC;AAAA,IACrF,QAAQ,EAAE,GAAI,OAAO,UAAU,CAAC,EAAG;AAAA,EACrC;AAEA,WAAS,QAAQ,GAAG,SAAS,WAAW,QAAQ,UAAU,IAAI,SAAS,GAAG;AACxE,UAAM,QAAQ,WAAW,OAAQ,KAAK;AACtC,UAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,UAAU,KAAK;AAExD,QAAI,CAAC,MAAM,IAAI,KAAK,GAAG;AACrB,YAAM,KAAK,gBAAgB,MAAM,GAAG,MAAM,gBAAM,KAAK,0BAAW,gBAAgB,MAAM,SAAS,SAAS,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrH,cAAQ,KAAK,sBAAO,KAAK,6BAAc,MAAM,EAAE,EAAE;AAAA,IACnD;AACA,QAAI,CAAC,YAAY,KAAK,GAAG;AACvB,YAAM,MAAM,MAAM,GAAG,MAAM,gBAAM,KAAK,sBAAiB;AACvD,YAAM,MAAM;AACZ,YAAM,eAAe;AACrB,cAAQ,KAAK,sBAAO,KAAK,sBAAiB;AAAA,IAC5C;AACA,QAAI,CAAC,YAAY,KAAK,GAAG;AACvB,YAAM,MAAM,MAAM,GAAG,MAAM,gBAAM,KAAK,iBAAY;AAClD,YAAM,MAAM;AACZ,YAAM,UAAU;AAChB,cAAQ,KAAK,sBAAO,KAAK,iBAAY;AAAA,IACvC;AACA,QAAI,CAAC,kBAAkB,KAAK,GAAG;AAC7B,YAAM,kBAAkB,MAAM,GAAG,OAAO,gBAAM,KAAK,mCAAU,CAAC,UAAU,WAAW,CAAC;AACpF,YAAM,YAAY;AAClB,YAAM,WAAW,MAAM;AACvB,cAAQ,KAAK,sBAAO,KAAK,sCAAa,MAAM,SAAS,EAAE;AAAA,IACzD;AACA,QAAI,CAAC,MAAM,OAAO,KAAK,GAAG;AACxB,YAAM,QAAQ,MAAM,GAAG,MAAM,gBAAM,KAAK,uCAAS;AACjD,cAAQ,KAAK,sBAAO,KAAK,uCAAS;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,CAAC,WAAW,QAAQ,SAAS;AAC/B,SAAK,WAAW,QAAQ,UAAU,OAAO,GAAG;AAC1C,iBAAW,OAAQ,UAAU,WAAW,OAAQ,CAAC,EAAE;AACnD,cAAQ,KAAK,wCAAyB,WAAW,OAAQ,OAAO,EAAE;AAAA,IACpE,YAAY,WAAW,QAAQ,UAAU,KAAK,GAAG;AAC/C,YAAM,SAAS,MAAM,GAAG,OAAO,wCAAU,WAAW,OAAQ,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAClF,iBAAW,OAAQ,UAAU;AAC7B,cAAQ,KAAK,wCAAyB,MAAM,EAAE;AAAA,IAChD;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,YAAY,QAAQ;AACvC;AAEA,eAAe,uBAAuB,OAAoD;AACxF,QAAM,MAAM,YAAY,KAAK;AAC7B,QAAM,MAAM,YAAY,KAAK;AAC7B,QAAM,iBAAiB,kBAAkB,KAAK;AAE9C,MAAI,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,OAAO;AACnD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI;AACF,UAAM,WAAW,mBAAmB;AAAA,MAClC,WAAW,CAAC;AAAA,MACZ,QAAQ,CAAC,KAAK;AAAA,MACd,QAAQ;AAAA,QACN,SAAS,MAAM;AAAA,MACjB;AAAA,IACF,CAAe;AACf,UAAM,gBAAgB,SAAS,SAAS,MAAM,EAAE;AAChD,UAAM,kBAAkB,gBACpB,6BAA6B;AAAA,MAC3B,OAAO,cAAc;AAAA,MACrB,WAAW,cAAc,aAAa;AAAA,MACtC,sBAAsB,cAAc;AAAA,MACpC,cAAc,cAAc;AAAA,MAC5B,SAAS;AAAA,QACP,OAAO,cAAc;AAAA,QACrB,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,IACD;AAEJ,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,QAAQ,YAAY,QAAQ,GAAK;AAAA,MACjC,SAAS,mBAAmB,cACxB;AAAA,QACE,gBAAgB;AAAA,QAChB,aAAa;AAAA,QACb,qBAAqB;AAAA,MACvB,IACA;AAAA,QACE,gBAAgB;AAAA,QAChB,eAAe,UAAU,GAAG;AAAA,MAC9B;AAAA,MACJ,MAAM,KAAK,UAAU,iBAAiB,SAAS,mBAAmB,cAC9D;AAAA,QACE,OAAO,MAAM;AAAA,QACb,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,IACA;AAAA,QACE,OAAO,MAAM;AAAA,QACb,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF,EAAE;AAAA,IACR,CAAC;AAED,QAAI,SAAS,IAAI;AACf,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,aAAO,EAAE,MAAM,WAAW,UAAU,cAAc,SAAS,GAAG,SAAS,MAAM,IAAI,IAAI,GAAG;AAAA,IAC1F;AACA,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO,EAAE,MAAM,WAAW,UAAU,mBAAmB,SAAS,GAAG,SAAS,MAAM,IAAI,IAAI,GAAG;AAAA,IAC/F;AACA,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO,EAAE,MAAM,WAAW,UAAU,qBAAqB,SAAS,GAAG,SAAS,MAAM,IAAI,IAAI,GAAG;AAAA,IACjG;AAEA,WAAO,EAAE,MAAM,WAAW,UAAU,gBAAgB,SAAS,GAAG,SAAS,MAAM,IAAI,IAAI,GAAG;AAAA,EAC5F,SAAS,OAAY;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,OAAO,WAAW,OAAO,KAAK;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAA6G;AACxI,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AACE,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,EACJ;AACF;AAEA,eAAe,oBAAoB,QAAoB,MAAmB,eAAuC;AAC/G,QAAM,OAAO,OAAO,QAAQA,gBAAe;AAC3C,QAAM,UAAU,MAAM,KAAK,mBAAmB,MAAM,GAAG;AACvD,QAAM,WAAW,MAAM,KAAK,kBAAkB,MAAM,GAAG;AACvD,QAAM,UAAU,KAAK,iBAAiB;AAEtC,MAAI,WAAW,CAAC,eAAe;AAC7B,SAAK,GAAG,KAAK,0EAA6B,IAAI,EAAE;AAChD;AAAA,EACF;AAEA,MAAI,YAAY,CAAC,WAAW,CAAC,SAAS;AACpC,UAAM,IAAI,MAAM,gBAAM,IAAI,kIAA8B;AAAA,EAC1D;AAEA,MAAI,SAAS;AACX,UAAM,OAAO,KAAK,gBAAgB;AAClC,QAAI,MAAM;AACR,UAAI;AACF,aAAK,YAAY,KAAK,GAAG;AAAA,MAC3B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,YAAY;AACvB,QAAM,WAAW,MAAM,KAAK,eAAe,MAAM,GAAI;AACrD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,2GAA2B,IAAI,cAAI;AAAA,EACrD;AACA,OAAK,GAAG,KAAK,wDAA0B,IAAI,EAAE;AAC/C;AAEA,SAASC,mBAAkB,KAAKP,iBAAgB,GAAgB;AAC9D,SAAO;AAAA,IACL;AAAA,IACA,qBAAqB;AAAA,IACrB,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,YAAY;AACvB,uCAAM,QAAQ,UAAU,CAAC,QAAQ,KAAK,CAAC,GAAG,SAAS,UAAU,GAAG;AAAA,QAC9D,UAAU;AAAA,QACV,OAAO;AAAA,QACP,KAAK,EAAE,GAAG,QAAQ,KAAK,YAAY,IAAI;AAAA,MACzC,CAAC,EAAE,MAAM;AAAA,IACX;AAAA,EACF;AACF;AAEA,eAAsB,aAAa,YAAkD;AACnF,QAAM,WAAWO,mBAAkB,YAAY,EAAE;AACjD,QAAM,OAAO,EAAE,GAAG,UAAU,GAAG,WAAW;AAC1C,MAAI,gBAAgB;AAEpB,MAAI;AACF,SAAK,GAAG,KAAK,4EAAoC;AACjD,UAAM,UAAU,kBAAkB;AAClC,YAAQ,SAAS,QAAQ,CAAC,YAAY,KAAK,GAAG,KAAK,OAAO,CAAC;AAE3D,QAAI,gBAAiD,QAAQ;AAC7D,QAAI,CAAC,eAAe;AAClB,YAAM,SAAS,MAAM,KAAK,iBAAiB;AAC3C,UAAI,OAAO,SAAS,SAAS;AAC3B,aAAK,GAAG,KAAK,uKAAoD;AACjE,cAAM,WAAW,oBAAoB,OAAO,MAAa;AACzD,wBAAgB;AAAA,UACd,GAAG,iCAAiC;AAAA,UACpC,GAAG,SAAS;AAAA,QACd;AAAA,MACF,OAAO;AACL,cAAM,IAAI,MAAM,gJAAiD;AAAA,MACnE;AAAA,IACF;AAEA,UAAM,gBAAgB,0BAA0B,aAAa;AAC7D,oBAAgB,cAAc;AAC9B,kBAAc,QAAQ,QAAQ,CAAC,YAAY,KAAK,GAAG,KAAK,OAAO,CAAC;AAEhE,UAAM,YAAY,MAAM,2BAA2B,eAAe,KAAK,EAAE;AACzE,oBAAgB,UAAU;AAC1B,cAAU,QAAQ,QAAQ,CAAC,YAAY,KAAK,GAAG,KAAK,OAAO,CAAC;AAE5D,UAAM,aAAa,2BAA2B,aAAa;AAC3D,QAAI,WAAW,OAAO,SAAS,GAAG;AAChC,WAAK,GAAG,MAAM,oGAAyB,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE;AACrE,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,QAAI,WAAW,SAAS,SAAS,GAAG;AAClC,WAAK,GAAG,KAAK,iCAAQ,WAAW,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,IACvD;AAEA,UAAM,WAAW,mBAAmB,WAAW,MAAM;AACrD,eAAW,SAAS,WAAW,OAAO,UAAU,CAAC,GAAG;AAClD,YAAM,gBAAgB,SAAS,SAAS,MAAM,EAAE;AAChD,UAAI,CAAC,eAAe;AAClB;AAAA,MACF;AACA,YAAM,gBAAgB,6BAA6B,cAAc,oBAAoB;AACrF,YAAM,WAAW,uBAAuB,cAAc,cAAc;AACpE,WAAK,GAAG;AAAA,QACN,6CAAU,MAAM,EAAE,OAAO,cAAc,KAAK;AAAA,MAC9C;AACA,WAAK,GAAG,KAAK,iCAAQ,cAAc,OAAO,EAAE;AAC5C,WAAK,GAAG,KAAK,iCAAQ,SAAS,KAAK,SAAI,SAAS,OAAO,EAAE;AACzD,YAAM,qBAAqB,uCAAuC,KAAK;AACvE,iBAAW,cAAc,oBAAoB;AAC3C,aAAK,GAAG,KAAK,mDAAW,WAAW,KAAK,EAAE;AAC1C,aAAK,GAAG,KAAK,uCAAS,WAAW,OAAO,EAAE;AAC1C,aAAK,GAAG,KAAK,uCAAS,WAAW,MAAM,EAAE;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ,iBAAiB,cAAc,QAAQ,SAAS,KAAK,UAAU,QAAQ,SAAS,KAAK,CAAC,QAAQ;AACxH,QAAI,WAAW;AACb,UAAI,QAAQ,SAAS;AACnB,cAAM,aAAa,MAAM,KAAK,oBAAoB;AAClD,YAAI,YAAY;AACd,eAAK,GAAG,KAAK,mDAAW,UAAU,EAAE;AAAA,QACtC;AAAA,MACF;AACA,YAAM,KAAK,YAAY,WAAW,MAAM;AACxC,WAAK,GAAG,KAAK,+DAAa,QAAQ,IAAI,EAAE;AACxC,sBAAgB;AAAA,IAClB;AAEA,UAAM,oBAAoB,WAAW,QAAQ,MAAM,aAAa;AAEhE,UAAM,oBAAoB,OAAO,gBAAgB,IAC7C,MAAM,KAAK,GAAG,QAAQ,sBAAO,WAAW,OAAO,QAAQ,UAAU,CAAC,iKAA+B,IAAI,IACrG,MAAM,KAAK,GAAG,QAAQ,wCAAU,WAAW,OAAO,QAAQ,UAAU,CAAC,2GAAsB,KAAK;AAEpG,QAAI,CAAC,mBAAmB;AACtB,WAAK,GAAG,KAAK,oHAAqB;AAClC;AAAA,IACF;AAEA,QAAI,eAAe;AACnB,QAAI,eAAe;AACnB,eAAW,SAAS,WAAW,OAAO,UAAU,CAAC,GAAG;AAClD,YAAM,SAAS,MAAM,uBAAuB,KAAK;AACjD,UAAI,OAAO,SAAS,WAAW;AAC7B,aAAK,GAAG,KAAK,6CAAU,MAAM,EAAE,EAAE;AACjC,wBAAgB;AAChB;AAAA,MACF;AAEA,YAAM,cAAc,oBAAoB,OAAO,QAAQ;AACvD,sBAAgB;AAChB,WAAK,GAAG,MAAM,6CAAU,MAAM,EAAE,OAAO,YAAY,KAAK,EAAE;AAC1D,WAAK,GAAG,KAAK,iCAAQ,YAAY,OAAO,EAAE;AAC1C,WAAK,GAAG,KAAK,iCAAQ,YAAY,MAAM,EAAE;AACzC,WAAK,GAAG,KAAK,6CAAU,OAAO,OAAO,EAAE;AACvC,WAAK,GAAG,KAAK,2NAA4C;AAAA,IAC3D;AAEA,SAAK,GAAG,KAAK,0DAAa,YAAY,sBAAO,YAAY,QAAG;AAC5D,SAAK,GAAG,KAAK,uCAAc;AAAA,EAC7B,UAAE;AACA,SAAK,GAAG,QAAQ;AAAA,EAClB;AACF;AA1uBA,IAAAC,YAGAC,kBACAC,iBACAC,uBACAC,eACAC;AAPA;AAAA;AAAA;AAAA,IAAAL,aAAyC;AAGzC,IAAAC,mBAAgC;AAChC,IAAAC,kBAAiD;AACjD,IAAAC,wBAAsB;AACtB,IAAAC,gBAAkB;AAClB,IAAAC,kBAAiB;AAEjB;AACA;AACA;AACA,IAAAC;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACnBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA,SAAS,iBAAoD;AAC3D,QAAM,cAAU,yBAAa,mBAAmB,OAAO;AACvD,QAAM,MAAM,KAAK,MAAM,OAAO;AAE9B,SAAO;AAAA,IACL,MAAM,IAAI,QAAQ;AAAA,IAClB,SAAS,IAAI,WAAW;AAAA,EAC1B;AACF;AAEA,SAAS,UAAoB;AAC3B,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;AAEA,SAAS,aAAiC;AACxC,SAAO,QAAQ,EAAE,CAAC;AACpB;AAEA,SAASC,QAAO,MAAc,WAA6B;AACzD,QAAM,OAAO,QAAQ;AACrB,SAAO,KAAK,SAAS,IAAI,MAAM,YAAY,KAAK,SAAS,SAAS,IAAI;AACxE;AAEA,SAAS,YAAY,MAAc,WAAwC;AACzE,QAAM,OAAO,QAAQ;AACrB,QAAM,QAAQ,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,QAAQ,IAAI,IAAI,YAAY,KAAK,QAAQ,SAAS,IAAI;AACrG,SAAO,UAAU,KAAK,KAAK,QAAQ,CAAC,IAAI;AAC1C;AAEA,SAAS,eAAe,WAAmB,aAA6B;AACtE,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,CAAC,QAAQ,KAAK,OAAO,GAAG;AAC1B,UAAM,IAAI,MAAM,GAAG,WAAW,8CAAW,SAAS,EAAE;AAAA,EACtD;AAEA,QAAM,OAAO,OAAO,SAAS,SAAS,EAAE;AACxC,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,OAAO;AACvD,UAAM,IAAI,MAAM,GAAG,WAAW,iEAAoB,SAAS,EAAE;AAAA,EAC/D;AAEA,SAAO;AACT;AAKA,SAAS,UAAkB;AAEzB,QAAM,YAAY,YAAY,UAAU,IAAI;AAC5C,MAAI,WAAW;AACb,WAAO,eAAe,WAAW,4CAAS;AAAA,EAC5C;AAGA,MAAI;AACF,UAAMC,QAAO,QAAQ,SAAS;AAC9B,YAAI,uBAAW,WAAW,GAAG;AAC3B,YAAM,cAAU,yBAAa,aAAa,OAAO;AACjD,YAAM,SAASA,MAAK,KAAK,OAAO;AAChC,UAAI,QAAQ,KAAM,QAAO,OAAO;AAAA,IAClC,eAAW,uBAAW,eAAe,GAAG;AACtC,YAAM,cAAU,yBAAa,iBAAiB,OAAO;AACrD,YAAM,SAASA,MAAK,KAAK,OAAO;AAChC,UAAI,QAAQ,KAAM,QAAO,OAAO;AAAA,IAClC,eAAW,uBAAW,gBAAgB,GAAG;AACvC,YAAM,cAAU,yBAAa,kBAAkB,OAAO;AACtD,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAI,QAAQ,KAAM,QAAO,OAAO;AAAA,IAClC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAOC,gBAAe;AACxB;AAKA,SAAS,eAAwB;AAC/B,SAAOF,QAAO,YAAY,IAAI;AAChC;AAKO,SAAS,YAAY;AAC1B,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAuCV,WAAW;AAAA,IACX,gBAAgB;AAAA;AAAA,gCAEb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAMhB;AACD;AAEA,SAAS,8BAA8B,aAAqB,YAAY,KAAqB;AAC3F,MAAI;AACF,UAAM,aAAS,iCAAU,OAAO,CAAC,QAAQ,aAAa,WAAW,cAAc,oBAAoB,GAAG;AAAA,MACpG,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO,QAAQ,aAAa;AAAA,IAC9B,CAAC;AAED,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,OAAO,QAAQ,KAAK;AAClC,WAAO,QAAQ,QAAQ;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,wBAAwB,aAAqB,YAAY,KAA8B;AACpG,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,6BAA6B;AAAA,MACxD,QAAQ,YAAY,QAAQ,SAAS;AAAA,IACvC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,QAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,8BAA8B,WAAW;AAClD;AAEA,SAAS,eAAe,SAAiB,QAAyB;AAChE,QAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC;AAC/E,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC;AAC7E,QAAM,SAAS,KAAK,IAAI,aAAa,QAAQ,YAAY,MAAM;AAE/D,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAAG;AAC9C,UAAM,eAAe,OAAO,SAAS,aAAa,KAAK,CAAC,IAAI,aAAa,KAAK,IAAI;AAClF,UAAM,cAAc,OAAO,SAAS,YAAY,KAAK,CAAC,IAAI,YAAY,KAAK,IAAI;AAE/E,QAAI,cAAc,cAAc;AAC9B,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,cAAc;AAC9B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,eAAe;AAC5B,QAAM,MAAM,eAAe;AAC3B,QAAM,gBAAgB,MAAM,wBAAwB,IAAI,IAAI;AAE5D,UAAQ,IAAI,YAAY,IAAI,IAAI,EAAE;AAClC,UAAQ,IAAI,YAAY,IAAI,OAAO,EAAE;AACrC,UAAQ,IAAI,WAAW,iBAAiB,aAAa,EAAE;AACvD,MAAI,iBAAiB,eAAe,IAAI,SAAS,aAAa,GAAG;AAC/D,YAAQ,IAAI,2BAA2B,IAAI,IAAI,SAAS;AAAA,EAC1D;AACA,UAAQ,IAAI,QAAQ,gBAAgB,EAAE;AACxC;AAEA,SAAS,uBAAuB;AAC9B,QAAM,MAAM,eAAe;AAE3B,UAAQ,IAAI,6CAAU,IAAI,OAAO,EAAE;AACnC,UAAQ,IAAI,qBAAM,IAAI,IAAI,EAAE;AAC5B,UAAQ,IAAI,kDAAU;AACtB,UAAQ,IAAI,oBAAoB,IAAI,IAAI,SAAS;AACjD,UAAQ,IAAI,yKAAkC;AAC9C,UAAQ,IAAI,kOAA8C;AAC1D,UAAQ,IAAI,gIAA4B;AACxC,UAAQ,IAAI,QAAQ,gBAAgB,EAAE;AACxC;AAEA,SAAS,2BAA2B;AAClC,UAAQ,IAAI,2KAAmD;AACjE;AAEA,SAAS,yBAAyB,YAAY,KAAe;AAC3D,MAAI;AACF,UAAM,aAAS,iCAAU,UAAU,CAAC,WAAW,GAAG;AAAA,MAChD,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,MACP,OAAO,QAAQ,aAAa;AAAA,IAC9B,CAAC;AAED,WAAO,OAAO,WAAW;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAASG,cAAa;AACpB,QAAM,QAAQH,QAAO,SAAS;AAE9B,QAAM,iBAAiB,CAAC,aAAa,iBAAiB,gBAAgB,EAAE,KAAK,qBAAU;AACvF,MAAI,kBAAkB,CAAC,OAAO;AAC5B,YAAQ,IAAI,iEAAe,cAAc,EAAE;AAC3C,YAAQ,IAAI,iFAA0B;AACtC;AAAA,EACF;AAGA,MAAI,KAAC,uBAAW,UAAU,GAAG;AAC3B,8BAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AAEA,MAAI;AACF,UAAMC,QAAO,QAAQ,SAAS;AAC9B,UAAM,iBAAiB,iCAAiC;AACxD,UAAM,UAAUA,MAAK,KAAK,gBAAgB;AAAA,MACxC,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AACD,kCAAc,aAAa,SAAS,OAAO;AAC3C,UAAM,SAAS,QAAQ,uBAAQ;AAC/B,YAAQ,IAAI,kCAAS,MAAM,SAAI,WAAW,EAAE;AAC5C,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,0BAAM;AAClB,YAAQ,IAAI,0FAAyB;AACrC,YAAQ,IAAI,yFAA6B;AACzC,YAAQ,IAAI,4EAAoC;AAChD,YAAQ,IAAI,yHAA0B;AACtC,YAAQ,IAAI,kCAAmB;AAAA,EACjC,SAAS,OAAY;AACnB,YAAQ,MAAM,4DAAe,MAAM,OAAO;AAC1C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAe,gBAAgB,MAAe;AAC5C,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,UAAU,MAAM,eAAe,YAAY,GAAG;AACpD,QAAM,WAAW,MAAM,kBAAkB,YAAY,GAAG;AACxD,MAAI,WAAW,YAAY,iBAAiB,GAAG;AAC7C,YAAQ,IAAI,6CAAwC,UAAU,GAAG;AACjE,YAAQ,IAAI,wEAAwE;AACpF;AAAA,EACF;AACA,MAAI,CAAC,WAAW,YAAY,CAAC,iBAAiB,GAAG;AAC/C,YAAQ,MAAM,eAAU,UAAU,0CAA0C;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,0DAAmD;AAC/D,UAAQ,IAAI,yBAAyB;AAErC,MAAI;AACF,UAAM,IAAI,EAAE,MAAM,WAAW,CAAC;AAAA,EAChC,SAAS,OAAY;AACnB,QAAI,MAAM,SAAS,SAAS,uBAAuB,GAAG;AACpD,cAAQ,MAAM,uEAAkE;AAAA,IAClF,OAAO;AACL,cAAQ,MAAM,mCAA8B,MAAM,OAAO;AAAA,IAC3D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAe,YAAY,MAAe;AACxC,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,UAAU,MAAM,eAAe,YAAY,GAAG;AACpD,QAAM,WAAW,MAAM,kBAAkB,YAAY,GAAG;AACxD,MAAI,CAAC,WAAW,YAAY,CAAC,iBAAiB,GAAG;AAC/C,YAAQ,IAAI,eAAU,UAAU,0CAA0C;AAC1E;AAAA,EACF;AAEA,MAAI,iBAAiB,GAAG;AACtB,YAAQ,IAAI,sDAAiD;AAC7D;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ;AACzB,QAAM,aAAa,QAAQ,KAAK,CAAC;AAGjC,QAAM,YAAY,CAAC,YAAY,OAAO;AACtC,MAAI,MAAM;AACR,cAAU,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,EACvC;AAEA,QAAM,YAAQ,6BAAM,UAAU,WAAW;AAAA,IACvC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK,EAAE,GAAG,QAAQ,KAAK,YAAY,IAAI;AAAA,EACzC,CAAC;AAED,QAAM,MAAM;AAEZ,QAAM,iBAAiB,MAAM,IAAI,QAAiB,CAAC,SAAS,WAAW;AACrE,QAAI,UAAU;AACd,UAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,UAAM,SAAS,CAAC,UAAmB;AACjC,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,cAAQ,KAAK;AAAA,IACf;AAEA,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAM,KAAK,QAAQ,MAAM,OAAO,KAAK,CAAC;AAEtC,UAAM,OAAO,MAAM;AACjB,UAAI,SAAS;AACX;AAAA,MACF;AACA,UAAI,iBAAiB,GAAG;AACtB,eAAO,IAAI;AACX;AAAA,MACF;AACA,UAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,eAAO,KAAK;AACZ;AAAA,MACF;AACA,iBAAW,MAAM,GAAG;AAAA,IACtB;AAEA,SAAK;AAAA,EACP,CAAC;AAED,MAAI,CAAC,gBAAgB;AACnB,YAAQ,MAAM,uDAAkD,UAAU,IAAI;AAC9E,YAAQ,MAAM,qEAAqE;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,+CAA0C,UAAU,GAAG;AACnE,UAAQ,IAAI,+BAA+B;AAC7C;AAKA,eAAe,aAAa;AAC1B,QAAM,OAAO,gBAAgB;AAC7B,MAAI,CAAC,QAAQ,CAAC,iBAAiB,GAAG;AAChC,UAAM,aAAa,QAAQ;AAC3B,UAAM,UAAU,MAAM,eAAe,YAAY,GAAG;AACpD,UAAM,WAAW,MAAM,kBAAkB,YAAY,GAAG;AACxD,QAAI,CAAC,WAAW,UAAU;AACxB,cAAQ,IAAI,8BAAU,UAAU,6GAAuC;AACvE;AAAA,IACF;AACA,YAAQ,IAAI,wCAAU;AACtB;AAAA,EACF;AACA,QAAM,YAAY,KAAK,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe,IAAI;AAC/E,UAAQ,IAAI,uCAAS;AACrB,UAAQ,IAAI,eAAU,KAAK,GAAG,EAAE;AAChC,UAAQ,IAAI,wBAAS,KAAK,IAAI,EAAE;AAChC,UAAQ,IAAI,oCAAW,SAAS,EAAE;AAClC,UAAQ,IAAI,qDAA4B,KAAK,IAAI,EAAE;AACrD;AAKA,SAAS,cAAc;AACrB,QAAM,OAAO,gBAAgB;AAC7B,MAAI,CAAC,QAAQ,CAAC,iBAAiB,GAAG;AAChC,YAAQ,IAAI,4EAAgB;AAC5B;AAAA,EACF;AAEA,MAAI;AACF,YAAQ,IAAI,4DAAkB,KAAK,GAAG,uBAAQ,KAAK,IAAI,WAAM;AAC7D,gBAAY,KAAK,GAAG;AACpB,YAAQ,IAAI,6CAAU;AAAA,EACxB,SAAS,OAAY;AACnB,YAAQ,MAAM,gDAAa,MAAM,OAAO;AAAA,EAC1C;AACF;AAKA,eAAe,iBAAiB;AAC9B,cAAY;AACZ,QAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,IAAI,CAAC;AACxD,QAAM,YAAY,QAAQ,CAAC;AAC7B;AAKA,eAAsB,gBAAgB;AACpC,QAAM,OAAO,QAAQ;AAIrB,QAAM,uBAAuB;AAG7B,QAAM,UAAU,iBAAiB;AACjC,UAAQ,IAAI,sDAA+C,IAAI,KAAK;AACpE,QAAM,YAAY,MAAM,eAAe,MAAM,GAAI;AAEjD,MAAI,CAAC,WAAW;AACd,YAAQ,IAAI,+DAAqD,IAAI,GAAG;AACxE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,UAAU;AACtB,YAAQ,IAAI,+CAA+C;AAC3D,YAAQ,IAAI,6DAA6D;AACzE,YAAQ,IAAI,EAAE;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,6DAAsD,IAAI,MAAM;AAC5E,MAAI,CAAC,yBAAyB,GAAG;AAC/B,YAAQ,MAAM,uDAAyB;AACvC,YAAQ,IAAI,2EAAkD;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,aAAS,6BAAM,UAAU,CAAC,GAAG;AAAA,IACjC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,oBAAoB,oBAAoB,IAAI;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,SAAO,GAAG,SAAS,CAAC,UAAU;AAC5B,YAAQ,MAAM,iDAAwB,MAAM,OAAO;AACnD,YAAQ,IAAI,gHAAmE;AAC/E,QAAI,WAAW;AACb,cAAQ,IAAI,qHAAoD;AAAA,IAClE;AAAA,EACF,CAAC;AAED,SAAO,GAAG,QAAQ,CAAC,SAAS;AAC1B,YAAQ,KAAK,QAAQ,CAAC;AAAA,EACxB,CAAC;AACH;AAKA,eAAe,SAAS;AACtB,QAAM,OAAO,QAAQ;AACrB,QAAM,MAAM,oBAAoB,IAAI;AACpC,QAAM,UAAU,MAAM,eAAe,MAAM,GAAG;AAE9C,UAAQ,IAAI,2BAAoB,GAAG,EAAE;AACrC,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,4LAA+D;AAAA,EAC7E;AAEA,MAAI,QAAQ,IAAI,qBAAqB,KAAK;AACxC,YAAQ,IAAI,iDAAiD;AAC7D;AAAA,EACF;AAEA,MAAI;AACF,uBAAAG,SAAK,GAAG;AAAA,EACV,SAAS,OAAY;AACnB,YAAQ,IAAI,kBAAkB,GAAG,kBAAkB;AAAA,EACrD;AACF;AAKA,eAAsB,OAAO;AAC3B,QAAM,UAAU,WAAW;AAE3B,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,YAAM,YAAY;AAClB;AAAA,IAEF,KAAK;AACH,YAAM,aAAa;AACnB;AAAA,IAEF,KAAK;AACH,MAAAD,YAAW;AACX;AAAA,IAEF,KAAK;AACH,UAAI,aAAa,GAAG;AAClB,cAAM,YAAY,QAAQ,CAAC;AAAA,MAC7B,OAAO;AACL,cAAM,gBAAgB,QAAQ,CAAC;AAAA,MACjC;AACA;AAAA,IAEF,KAAK;AACH,kBAAY;AACZ;AAAA,IAEF,KAAK;AACH,YAAM,WAAW;AACjB;AAAA,IAEF,KAAK;AACH,YAAM,aAAa;AACnB;AAAA,IAEF,KAAK;AACH,2BAAqB;AACrB;AAAA,IAEF,KAAK;AACH,+BAAyB;AACzB,YAAM,eAAe;AACrB;AAAA,IAEF,KAAK;AACH,YAAM,cAAc;AACpB;AAAA,IAEF,KAAK;AACH,YAAM,OAAO;AACb;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,gBAAU;AACV;AAAA,IAEF;AACE,UAAI,SAAS;AACX,gBAAQ,IAAI,oBAAoB,OAAO,EAAE;AAAA,MAC3C;AACA,gBAAU;AACV,cAAQ,KAAK,UAAU,IAAI,CAAC;AAAA,EAChC;AACF;AA5mBA,IAMAE,uBACAC,cACA,gBACAC,YASM,mBACA,kBACA,6BACA;AArBN;AAAA;AAMA,IAAAF,wBAAiC;AACjC,IAAAC,eAAqB;AACrB,qBAAiB;AACjB,IAAAC,aAAmE;AACnE;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AAEA,IAAM,wBAAoB,mBAAK,WAAW,MAAM,cAAc;AAC9D,IAAM,mBAAmB;AACzB,IAAM,8BAA8B;AACpC,IAAM,uBAAuB;AAylB7B,QAAI,QAAQ,IAAI,kBAAkB,KAAK;AACrC,WAAK,EAAE,MAAM,CAAC,UAAU;AACtB,gBAAQ,MAAM,UAAU,KAAK;AAC7B,gBAAQ,KAAK,CAAC;AAAA,MAChB,CAAC;AAAA,IACH;AAAA;AAAA;",
|
|
4
|
+
"sourcesContent": ["/**\n * Constants\n *\n * \u5E38\u91CF\u5B9A\u4E49\n */\n\nimport { homedir } from 'os';\nimport { join } from 'path';\n\n/**\n * \u914D\u7F6E\u76EE\u5F55\n */\nexport const CONFIG_DIR = join(homedir(), '.claude-trigger-router');\n\n/**\n * \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\n */\nexport const CONFIG_FILE = join(CONFIG_DIR, 'config.yaml');\n\n/**\n * JSON \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u517C\u5BB9\uFF09\n */\nexport const CONFIG_FILE_JSON = join(CONFIG_DIR, 'config.json');\n\n/**\n * .yml \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u517C\u5BB9\uFF09\n */\nexport const CONFIG_FILE_YML = join(CONFIG_DIR, 'config.yml');\n\n/**\n * \u65E5\u5FD7\u76EE\u5F55\n */\nexport const HOME_DIR = join(CONFIG_DIR, 'logs');\n\n/**\n * PID \u6587\u4EF6\u8DEF\u5F84\n */\nexport const PID_FILE = join(CONFIG_DIR, 'claude-trigger-router.pid');\n\n/**\n * Governance trace \u6301\u4E45\u5316\u6587\u4EF6\n */\nexport const GOVERNANCE_TRACE_FILE = join(CONFIG_DIR, 'governance-traces.json');\n\n/**\n * Governance trace \u5F52\u6863\u76EE\u5F55\n */\nexport const GOVERNANCE_TRACE_ARCHIVE_DIR = join(CONFIG_DIR, 'governance-trace-archives');\n\n/**\n * Governance metrics \u5BFC\u51FA\u5386\u53F2\u6587\u4EF6\n */\nexport const GOVERNANCE_EXPORT_HISTORY_FILE = join(CONFIG_DIR, 'governance-metrics-export-history.json');\n\n/**\n * Governance metrics \u5FEB\u7167\u76EE\u5F55\n */\nexport const GOVERNANCE_SNAPSHOT_DIR = join(CONFIG_DIR, 'governance-metric-snapshots');\n\n/**\n * Governance metrics \u5B9A\u65F6\u5FEB\u7167\u8C03\u5EA6\u6587\u4EF6\n */\nexport const GOVERNANCE_SCHEDULE_FILE = join(CONFIG_DIR, 'governance-metric-schedules.json');\n\n/**\n * \u9ED8\u8BA4\u914D\u7F6E\n */\nexport const DEFAULT_CONFIG = {\n HOST: '127.0.0.1',\n PORT: 5678,\n LOG: true,\n LOG_LEVEL: 'debug',\n API_TIMEOUT_MS: 600000,\n NON_INTERACTIVE_MODE: false,\n};\n\n/**\n * \u9ED8\u8BA4\u89E6\u53D1\u8DEF\u7531\u914D\u7F6E\n */\nexport const DEFAULT_TRIGGER_CONFIG = {\n enabled: true,\n analysis_scope: 'last_message' as const,\n llm_intent_recognition: false,\n rules: [],\n};\n\n/**\n * \u9ED8\u8BA4 SmartRouter \u914D\u7F6E\n * \u6CE8\u610F\uFF1Aenabled \u9ED8\u8BA4\u4E3A false\uFF0C\u987B\u5728 config.yaml \u4E2D\u663E\u5F0F\u5F00\u542F\n */\nexport const DEFAULT_SMART_ROUTER_CONFIG = {\n enabled: false,\n analysis_scope: 'last_message' as const,\n router_model: '',\n candidates: [] as Array<{ model: string; description: string }>,\n cache_ttl: 600000,\n max_tokens: 256,\n fallback: 'default' as const,\n};\n\n/**\n * \u9ED8\u8BA4 Governance \u914D\u7F6E\n * \u6CE8\u610F\uFF1A\u603B\u5F00\u5173\u9ED8\u8BA4\u5173\u95ED\uFF0C\u5B50\u80FD\u529B\u9ED8\u8BA4\u5747\u4E3A\u4FDD\u5B88\u914D\u7F6E\n */\nexport const DEFAULT_GOVERNANCE_CONFIG = {\n enabled: false,\n sticky: {\n enabled: false,\n session_ttl_ms: 3600000,\n fingerprint_similarity_threshold: 0.82,\n break_on_explicit_route: true,\n alignment: {\n enabled: false,\n summarizer_model: '',\n max_summary_tokens: 256,\n },\n },\n cascade: {\n enabled: false,\n max_attempts: 2,\n stream_guard: false,\n triggers: {\n compile_failure: true,\n test_failure: true,\n placeholder_patterns: ['TODO', '...rest of code', 'placeholder'],\n },\n levels: [],\n },\n semantic: {\n enabled: false,\n mode: 'embedding' as const,\n threshold: 0.85,\n prototypes: {},\n },\n shadow: {\n enabled: false,\n mode: 'async_audit' as const,\n sample_rate: 0.2,\n verifier_model: '',\n checks: {\n placeholder_patterns: true,\n length_anomaly: true,\n missing_code_block: true,\n },\n },\n observability: {\n anomaly_thresholds: {\n min_sample_size: 3,\n cascade_warn_rate: 0.4,\n cascade_critical_rate: 0.6,\n shadow_warn_rate: 0.5,\n shadow_critical_rate: 0.7,\n latency_warn_ms: 1500,\n latency_critical_ms: 3000,\n spike_warn_rate: 0.5,\n spike_delta_rate: 0.3,\n },\n },\n};\n\n/**\n * \u652F\u6301\u7684\u914D\u7F6E\u6587\u4EF6\u6269\u5C55\u540D\n */\nexport const SUPPORTED_CONFIG_EXTENSIONS = ['.yaml', '.yml', '.json'];\n", "import { IModelEndpointConfig, IModelThinkingConfig, TModelThinkingAlias } from '../trigger/types';\n\nexport type ModelInterface = 'openai' | 'anthropic';\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nexport function inferInterfaceFromApiEndpoint(api?: string, modelName?: string): ModelInterface | undefined {\n const trimmed = api?.trim().toLowerCase();\n if (!trimmed) {\n return undefined;\n }\n\n if (trimmed.includes('/chat/completions')) {\n return 'openai';\n }\n\n if (trimmed.includes('api.anthropic.com')) {\n return 'anthropic';\n }\n\n if (trimmed.includes('/messages')) {\n return 'anthropic';\n }\n\n const normalizedModelName = modelName?.trim().toLowerCase() || '';\n if (\n normalizedModelName.startsWith('claude') &&\n !trimmed.includes('/v1/chat/completions') &&\n (trimmed.endsWith('/v1') || /^https?:\\/\\/[^/]+\\/?$/.test(trimmed))\n ) {\n return 'anthropic';\n }\n\n return trimmed.includes('/v1/messages') ? 'anthropic' : 'openai';\n}\n\nfunction normalizeEndpointPath(pathname: string, modelInterface: ModelInterface): string {\n const trimmedPath = trimTrailingSlash(pathname || '');\n const normalizedPath = trimmedPath || '';\n const lowerPath = normalizedPath.toLowerCase();\n\n if (modelInterface === 'anthropic') {\n if (lowerPath.endsWith('/v1/messages') || lowerPath.endsWith('/messages')) {\n return normalizedPath || '/v1/messages';\n }\n if (lowerPath.endsWith('/v1')) {\n return `${normalizedPath}/messages`;\n }\n if (!normalizedPath) {\n return '/v1/messages';\n }\n return `${normalizedPath}/messages`;\n }\n\n if (lowerPath.endsWith('/chat/completions')) {\n return normalizedPath || '/chat/completions';\n }\n if (lowerPath.endsWith('/v1')) {\n return `${normalizedPath}/chat/completions`;\n }\n if (!normalizedPath) {\n return '/v1/chat/completions';\n }\n return `${normalizedPath}/chat/completions`;\n}\n\nexport function normalizeApiEndpoint(api?: string, explicitInterface?: ModelInterface): string {\n const trimmed = api?.trim() || '';\n if (!trimmed) {\n return '';\n }\n\n const modelInterface = explicitInterface ?? inferInterfaceFromApiEndpoint(trimmed) ?? 'openai';\n\n try {\n const url = new URL(trimmed);\n url.pathname = normalizeEndpointPath(url.pathname, modelInterface);\n return url.toString();\n } catch {\n const [base, suffix = ''] = trimmed.split(/([?#].*)/, 2);\n const normalizedBase = trimTrailingSlash(base);\n const normalizedPath = normalizeEndpointPath(normalizedBase, modelInterface);\n return `${normalizedPath}${suffix}`;\n }\n}\n\nexport function getModelApi(item: Partial<IModelEndpointConfig>): string {\n const rawApi = item.api?.trim() || item.api_base_url?.trim() || '';\n const explicitInterface = item.interface || item.protocol;\n return normalizeApiEndpoint(rawApi, explicitInterface);\n}\n\nexport function getModelKey(item: Partial<IModelEndpointConfig>): string {\n return item.key?.trim() || item.api_key?.trim() || '';\n}\n\nexport function getModelInterface(item: Partial<IModelEndpointConfig>): ModelInterface | undefined {\n return item.interface || item.protocol;\n}\n\nexport function normalizeThinkingConfig(\n thinking?: IModelEndpointConfig['thinking']\n): IModelThinkingConfig | undefined {\n if (!thinking) {\n return undefined;\n }\n\n if (typeof thinking === 'string') {\n if (thinking === 'low' || thinking === 'medium' || thinking === 'high') {\n return {\n mode: 'on',\n effort: thinking,\n };\n }\n\n return {\n mode: thinking,\n };\n }\n\n return {\n ...thinking,\n };\n}\n\nexport function toThinkingAlias(\n thinking?: IModelThinkingConfig\n): TModelThinkingAlias | IModelThinkingConfig | undefined {\n if (!thinking) {\n return undefined;\n }\n\n if (thinking.budget_tokens !== undefined) {\n return {\n ...thinking,\n };\n }\n\n if (thinking.mode === 'on' && thinking.effort && !thinking.budget_tokens) {\n return thinking.effort;\n }\n\n if (thinking.mode && !thinking.effort) {\n return thinking.mode;\n }\n\n return {\n ...thinking,\n };\n}\n\nexport function normalizeModelEndpointConfig(item: Partial<IModelEndpointConfig>): IModelEndpointConfig {\n const api = getModelApi(item);\n const key = getModelKey(item);\n const modelInterface = getModelInterface(item);\n\n return {\n ...item,\n id: item.id?.trim() ?? '',\n api,\n api_base_url: api,\n key,\n api_key: key,\n interface: modelInterface,\n protocol: modelInterface,\n model: item.model?.trim() ?? '',\n thinking: normalizeThinkingConfig(item.thinking),\n metadata: item.metadata\n ? {\n ...item.metadata,\n }\n : undefined,\n };\n}\n\nexport function toExternalModelConfig(item: Partial<IModelEndpointConfig>) {\n const normalized = normalizeModelEndpointConfig(item);\n return {\n id: normalized.id,\n api: normalized.api_base_url,\n key: normalized.api_key,\n interface: normalized.protocol,\n model: normalized.model,\n thinking: toThinkingAlias(normalized.thinking as IModelThinkingConfig | undefined),\n metadata: normalized.metadata,\n };\n}\n", "import { IAppConfig, ICompiledModelCapabilities, IModelEndpointConfig, IModelThinkingConfig, IProvider } from '../trigger/types';\nimport { getModelApi, getModelInterface, getModelKey, normalizeModelEndpointConfig } from './schema';\n\nexport type TCompatibilityProfile =\n | 'anthropic-native'\n | 'openai-compatible-anthropic-dispatch';\n\nexport type TDispatchFormat = 'anthropic_messages' | 'openai_chat';\n\nexport interface ICompatibilityProfileDescription {\n label: string;\n summary: string;\n}\n\nexport interface ICompiledModelRef {\n id: string;\n providerName: string;\n modelName: string;\n interface?: 'openai' | 'anthropic';\n protocol: 'openai' | 'anthropic';\n compatibilityProfile: TCompatibilityProfile;\n dispatchFormat: TDispatchFormat;\n thinking?: IModelThinkingConfig;\n capabilities: ICompiledModelCapabilities;\n source: 'models' | 'providers';\n}\n\nexport interface ICompiledModelRegistry {\n providers: IProvider[];\n modelMap: Record<string, ICompiledModelRef>;\n}\n\nexport interface ICompiledCapabilityWarningEntry {\n path: string;\n modelId: string;\n level: 'info' | 'warn';\n code: string;\n message: string;\n}\n\nexport interface ICompiledCapabilityWarningReport {\n entries: ICompiledCapabilityWarningEntry[];\n summary: {\n total: number;\n warn: number;\n info: number;\n };\n}\n\nfunction inferTransformer(protocol: 'openai' | 'anthropic'): any {\n if (protocol === 'openai') {\n return {\n use: ['openrouter'],\n };\n }\n\n return undefined;\n}\n\nfunction inferCompatibilityProfile(\n item: Pick<IModelEndpointConfig, 'api' | 'api_base_url' | 'metadata'>,\n modelInterface: 'openai' | 'anthropic'\n): TCompatibilityProfile {\n if (modelInterface === 'anthropic') {\n return 'anthropic-native';\n }\n\n return 'openai-compatible-anthropic-dispatch';\n}\n\nexport function getDispatchFormatForProfile(\n modelInterface: 'openai' | 'anthropic',\n compatibilityProfile: TCompatibilityProfile\n): TDispatchFormat {\n if (modelInterface === 'anthropic') {\n return 'anthropic_messages';\n }\n\n switch (compatibilityProfile) {\n case 'openai-compatible-anthropic-dispatch':\n return 'anthropic_messages';\n case 'anthropic-native':\n return 'anthropic_messages';\n default:\n return 'anthropic_messages';\n }\n}\n\nexport function describeCompatibilityProfile(profile: TCompatibilityProfile): ICompatibilityProfileDescription {\n switch (profile) {\n case 'anthropic-native':\n return {\n label: 'Anthropic native',\n summary: '\u76EE\u6807\u63A5\u53E3\u539F\u751F\u63A5\u53D7 Anthropic messages \u5F62\u6001\uFF0C\u8BF7\u6C42\u65E0\u9700\u505A OpenAI-compatible \u517C\u5BB9\u8F6C\u6362\u3002',\n };\n case 'openai-compatible-anthropic-dispatch':\n return {\n label: 'OpenAI-compatible / Anthropic dispatch',\n summary: '\u76EE\u6807\u63A5\u53E3\u5C5E\u4E8E OpenAI-compatible \u517C\u5BB9\u65CF\uFF0C\u8FD0\u884C\u65F6\u4F1A\u81EA\u52A8\u4F7F\u7528 Anthropic-style dispatch \u5904\u7406 tools\u3001messages \u4E0E\u63A7\u5236\u5B57\u6BB5\u5DEE\u5F02\u3002',\n };\n default:\n return {\n label: profile,\n summary: '\u672A\u77E5\u517C\u5BB9\u753B\u50CF\u3002',\n };\n }\n}\n\nexport function describeDispatchFormat(format: TDispatchFormat): ICompatibilityProfileDescription {\n switch (format) {\n case 'anthropic_messages':\n return {\n label: 'Anthropic-style messages',\n summary: '\u8FD0\u884C\u65F6\u4F1A\u628A\u7EDF\u4E00\u8BF7\u6C42\u7F16\u8BD1\u6210 Anthropic messages \u5F62\u6001\u540E\u518D\u53D1\u5F80\u76EE\u6807\u63A5\u53E3\u3002',\n };\n case 'openai_chat':\n return {\n label: 'OpenAI chat completions',\n summary: '\u8FD0\u884C\u65F6\u4F1A\u628A\u7EDF\u4E00\u8BF7\u6C42\u7F16\u8BD1\u6210 OpenAI chat completions \u5F62\u6001\u540E\u518D\u53D1\u5F80\u76EE\u6807\u63A5\u53E3\u3002',\n };\n default:\n return {\n label: format,\n summary: '\u672A\u77E5 dispatch \u5F62\u6001\u3002',\n };\n }\n}\n\nfunction buildCompiledCapabilities(\n item: Pick<IModelEndpointConfig, 'thinking' | 'metadata'>,\n modelInterface: 'openai' | 'anthropic'\n): ICompiledModelCapabilities {\n const reasoningSupported = item.metadata?.supports_reasoning !== false;\n\n return {\n thinking: {\n supported: reasoningSupported,\n ...(reasoningSupported ? (item.thinking ?? {}) : {}),\n },\n tools: item.metadata?.supports_tools !== false,\n images: item.metadata?.supports_images !== false,\n systemMessageStyle: modelInterface,\n };\n}\n\nexport function compileModelsToProviders(models: IModelEndpointConfig[]): IProvider[] {\n return models.map((rawItem) => {\n const item = normalizeModelEndpointConfig(rawItem);\n const modelInterface = getModelInterface(item) || 'openai';\n return {\n name: `model__${item.id}`,\n api_base_url: getModelApi(item),\n api_key: getModelKey(item),\n models: [item.model],\n transformer: inferTransformer(modelInterface),\n };\n });\n}\n\nexport function buildModelRegistry(config: IAppConfig): ICompiledModelRegistry {\n if (Array.isArray(config.Models) && config.Models.length > 0) {\n const providers = compileModelsToProviders(config.Models);\n const modelMap = config.Models.reduce<Record<string, ICompiledModelRef>>((result, rawItem) => {\n const item = normalizeModelEndpointConfig(rawItem);\n const modelInterface = getModelInterface(item) || 'openai';\n const compatibilityProfile = inferCompatibilityProfile(item, modelInterface);\n result[item.id] = {\n id: item.id,\n providerName: `model__${item.id}`,\n modelName: item.model,\n interface: modelInterface,\n protocol: modelInterface,\n compatibilityProfile,\n dispatchFormat: getDispatchFormatForProfile(modelInterface, compatibilityProfile),\n thinking: item.thinking,\n capabilities: buildCompiledCapabilities(item, modelInterface),\n source: 'models',\n };\n return result;\n }, {});\n\n return {\n providers,\n modelMap,\n };\n }\n\n const providers = config.Providers ?? [];\n const modelMap = providers.reduce<Record<string, ICompiledModelRef>>((result, provider) => {\n for (const model of provider.models ?? []) {\n const compatibilityProfile = inferCompatibilityProfile(\n { api_base_url: provider.api_base_url },\n 'openai'\n );\n result[`${provider.name},${model}`] = {\n id: `${provider.name},${model}`,\n providerName: provider.name,\n modelName: model,\n interface: 'openai',\n protocol: 'openai',\n compatibilityProfile,\n dispatchFormat: getDispatchFormatForProfile('openai', compatibilityProfile),\n capabilities: {\n thinking: {\n supported: true,\n },\n tools: true,\n images: true,\n systemMessageStyle: 'openai',\n },\n source: 'providers',\n };\n }\n return result;\n }, {});\n\n return {\n providers,\n modelMap,\n };\n}\n\nexport function resolveModelReference(config: IAppConfig, ref?: string): string | undefined {\n if (!ref) {\n return undefined;\n }\n\n if (ref.includes(',')) {\n return ref;\n }\n\n const registry = buildModelRegistry(config);\n const compiled = registry.modelMap[ref];\n if (!compiled) {\n return ref;\n }\n\n return `${compiled.providerName},${compiled.modelName}`;\n}\n\nexport function getCompiledModelRef(config: IAppConfig, ref?: string): ICompiledModelRef | undefined {\n if (!ref) {\n return undefined;\n }\n\n const registry = buildModelRegistry(config);\n if (!ref.includes(',')) {\n return registry.modelMap[ref];\n }\n\n const resolvedRef = registry.modelMap[ref];\n if (resolvedRef) {\n return resolvedRef;\n }\n\n const [providerName, modelName] = ref.split(',');\n return Object.values(registry.modelMap).find(\n (item) => item.providerName === providerName && item.modelName === modelName\n );\n}\n\nexport function isKnownModelReference(config: IAppConfig, ref?: string): boolean {\n if (!ref) {\n return false;\n }\n\n if (ref.includes(',')) {\n const [provider, model] = ref.split(',');\n return Boolean(\n config.Providers?.find((item) =>\n item.name === provider && item.models?.includes(model)\n )\n );\n }\n\n const registry = buildModelRegistry(config);\n return Boolean(registry.modelMap[ref]);\n}\n\nexport function collectCapabilityWarnings(\n config: Partial<IAppConfig>,\n registry?: ICompiledModelRegistry\n): ICompiledCapabilityWarningReport {\n const entries: ICompiledCapabilityWarningEntry[] = [];\n const models = Array.isArray(config?.Models) ? config.Models : [];\n const resolvedRegistry = registry ?? buildModelRegistry(config as IAppConfig);\n\n models.forEach((model, index) => {\n const modelId = typeof model?.id === 'string' ? model.id.trim() : '';\n if (!modelId) {\n return;\n }\n\n const compiledModel = resolvedRegistry.modelMap?.[modelId];\n if (!compiledModel) {\n return;\n }\n\n if (model?.thinking && compiledModel.capabilities?.thinking?.supported === false) {\n entries.push({\n path: `Models[${index}].thinking`,\n modelId,\n level: 'warn',\n code: 'thinking_ignored',\n message: `Models[${index}].thinking is configured, but model \"${modelId}\" disables reasoning. Runtime requests will ignore thinking.`,\n });\n }\n\n if (model?.metadata?.supports_tools === false) {\n entries.push({\n path: `Models[${index}].metadata.supports_tools`,\n modelId,\n level: 'info',\n code: 'tools_text_fallback',\n message: `Models[${index}].metadata.supports_tools disables tools for model \"${modelId}\". Tool definitions and tool call/result blocks will fall back to plain text.`,\n });\n }\n\n if (model?.metadata?.supports_images === false) {\n entries.push({\n path: `Models[${index}].metadata.supports_images`,\n modelId,\n level: 'info',\n code: 'images_text_fallback',\n message: `Models[${index}].metadata.supports_images disables image input for model \"${modelId}\". Image blocks will fall back to plain text descriptions.`,\n });\n }\n });\n\n return {\n entries,\n summary: {\n total: entries.length,\n warn: entries.filter((entry) => entry.level === 'warn').length,\n info: entries.filter((entry) => entry.level === 'info').length,\n },\n };\n}\n", "/**\n * Log Utilities\n *\n * \u65E5\u5FD7\u5DE5\u5177\n */\n\nimport { IAppConfig } from '../trigger/types';\n\n// \u65E5\u5FD7\u7EA7\u522B\u679A\u4E3E\uFF08\u6570\u503C\u8D8A\u5927\u8D8A\u8BE6\u7EC6\uFF09\nconst LOG_LEVELS: Record<string, number> = {\n fatal: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n};\n\nlet logEnabled = true;\nlet currentLevel = LOG_LEVELS.debug;\n\n/**\n * \u914D\u7F6E\u65E5\u5FD7\n */\nexport function configureLogging(config: IAppConfig): void {\n logEnabled = config.LOG !== false;\n const level = (config.LOG_LEVEL || 'debug').toLowerCase();\n currentLevel = LOG_LEVELS[level] ?? LOG_LEVELS.debug;\n}\n\n/**\n * \u68C0\u67E5\u7ED9\u5B9A\u7EA7\u522B\u662F\u5426\u5E94\u8BE5\u8F93\u51FA\n */\nfunction shouldLog(level: number): boolean {\n return logEnabled && level <= currentLevel;\n}\n\n/**\n * \u683C\u5F0F\u5316\u65F6\u95F4\u6233\n */\nfunction ts(): string {\n return new Date().toISOString();\n}\n\n/**\n * INFO \u65E5\u5FD7\uFF08\u539F log\uFF09\n */\nexport function log(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.info)) return;\n console.log(`[${ts()}] [INFO]`, ...args);\n}\n\n/**\n * ERROR \u65E5\u5FD7\n */\nexport function logError(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.error)) return;\n console.error(`[${ts()}] [ERROR]`, ...args);\n}\n\n/**\n * WARN \u65E5\u5FD7\n */\nexport function logWarn(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.warn)) return;\n console.warn(`[${ts()}] [WARN]`, ...args);\n}\n\n/**\n * DEBUG \u65E5\u5FD7\n */\nexport function logDebug(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.debug)) return;\n console.log(`[${ts()}] [DEBUG]`, ...args);\n}\n\n/**\n * TRACE \u65E5\u5FD7\n */\nexport function logTrace(...args: any[]): void {\n if (!shouldLog(LOG_LEVELS.trace)) return;\n console.log(`[${ts()}] [TRACE]`, ...args);\n}\n\n/**\n * FATAL \u65E5\u5FD7\uFF08\u603B\u662F\u8F93\u51FA\uFF0C\u56E0\u4E3A\u662F\u81F4\u547D\u9519\u8BEF\uFF09\n */\nexport function logFatal(...args: any[]): void {\n console.error(`[${ts()}] [FATAL]`, ...args);\n}\n", "/**\r\n * Config Utilities\r\n *\r\n * \u914D\u7F6E\u52A0\u8F7D\u548C\u7BA1\u7406\u5DE5\u5177\r\n */\r\n\r\nimport { existsSync, mkdirSync } from 'fs';\r\nimport { readFile, writeFile } from 'fs/promises';\r\nimport { join } from 'path';\r\nimport * as yaml from 'js-yaml';\r\nimport {\n CONFIG_DIR,\n CONFIG_FILE,\n CONFIG_FILE_JSON,\n CONFIG_FILE_YML,\n DEFAULT_CONFIG,\n DEFAULT_GOVERNANCE_CONFIG,\n DEFAULT_TRIGGER_CONFIG,\n DEFAULT_SMART_ROUTER_CONFIG,\n HOME_DIR,\n} from '../constants';\nimport { IAppConfig, ITriggerConfig } from '../trigger/types';\nimport { collectCapabilityWarnings, isKnownModelReference } from '../models/compile';\nimport { getModelApi, getModelInterface, getModelKey, normalizeModelEndpointConfig, toExternalModelConfig } from '../models/schema';\nimport { logError, logWarn } from './log';\n\r\n/**\r\n * \u786E\u4FDD\u914D\u7F6E\u76EE\u5F55\u5B58\u5728\r\n */\r\nexport async function initDir(): Promise<void> {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n if (!existsSync(HOME_DIR)) {\n mkdirSync(HOME_DIR, { recursive: true });\n }\n}\n\r\n/**\r\n * \u5C1D\u8BD5\u52A0\u8F7D YAML \u914D\u7F6E\u6587\u4EF6\r\n * \u8FD4\u56DE null \u8868\u793A\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1B\u89E3\u6790\u5931\u8D25\u65F6\u629B\u51FA\u9519\u8BEF\uFF08\u533A\u5206\u4E24\u79CD\u60C5\u51B5\uFF09\r\n */\r\nasync function loadYamlConfig(path: string): Promise<Partial<IAppConfig> | null> {\r\n if (!existsSync(path)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const content = await readFile(path, 'utf-8');\r\n return yaml.load(content) as Partial<IAppConfig>;\r\n } catch (error: any) {\r\n const divider = '\u2500'.repeat(60);\r\n console.error(`\\n${divider}`);\r\n console.error(' \u274C \u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF08YAML \u683C\u5F0F\u9519\u8BEF\uFF09');\r\n console.error(divider);\r\n console.error(` \u6587\u4EF6\uFF1A${path}`);\r\n console.error(` \u9519\u8BEF\uFF1A${error.message || error}`);\r\n console.error(` \u63D0\u793A\uFF1A\u8BF7\u68C0\u67E5 YAML \u7F29\u8FDB\u662F\u5426\u4F7F\u7528\u7A7A\u683C\uFF08\u4E0D\u80FD\u7528 Tab\uFF09`);\r\n console.error(` \u53EF\u7528\u5728\u7EBF\u5DE5\u5177\u9A8C\u8BC1\uFF1Ahttps://yaml.lint.me`);\r\n console.error(`${divider}\\n`);\r\n throw new Error(`YAML parse error in ${path}: ${error.message}`);\r\n }\r\n}\r\n\r\n/**\r\n * \u5C1D\u8BD5\u52A0\u8F7D JSON \u914D\u7F6E\u6587\u4EF6\r\n * \u8FD4\u56DE null \u8868\u793A\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1B\u89E3\u6790\u5931\u8D25\u65F6\u629B\u51FA\u9519\u8BEF\uFF08\u533A\u5206\u4E24\u79CD\u60C5\u51B5\uFF09\r\n */\r\nasync function loadJsonConfig(path: string): Promise<Partial<IAppConfig> | null> {\r\n if (!existsSync(path)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const content = await readFile(path, 'utf-8');\r\n return JSON.parse(content);\r\n } catch (error: any) {\r\n const divider = '\u2500'.repeat(60);\r\n console.error(`\\n${divider}`);\r\n console.error(' \u274C \u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF08JSON \u683C\u5F0F\u9519\u8BEF\uFF09');\r\n console.error(divider);\r\n console.error(` \u6587\u4EF6\uFF1A${path}`);\r\n console.error(` \u9519\u8BEF\uFF1A${error.message || error}`);\r\n console.error(` \u63D0\u793A\uFF1A\u8BF7\u68C0\u67E5 JSON \u683C\u5F0F\uFF0C\u4F8B\u5982\u662F\u5426\u6709\u591A\u4F59\u9017\u53F7\u6216\u7F3A\u5C11\u5F15\u53F7`);\r\n console.error(`${divider}\\n`);\r\n throw new Error(`JSON parse error in ${path}: ${error.message}`);\r\n }\r\n}\r\n\r\n/**\r\n * \u6DF1\u5EA6\u5408\u5E76\u914D\u7F6E\u5BF9\u8C61\r\n */\r\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const sourceValue = source[key];\r\n const targetValue = result[key];\r\n\r\n if (\r\n sourceValue &&\r\n typeof sourceValue === 'object' &&\r\n !Array.isArray(sourceValue) &&\r\n targetValue &&\r\n typeof targetValue === 'object' &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n result[key] = deepMerge(targetValue, sourceValue);\r\n } else {\r\n result[key] = sourceValue as T[Extract<keyof T, string>];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * \u6821\u9A8C \"provider,model\" \u683C\u5F0F\u7684\u6A21\u578B\u5F15\u7528\u662F\u5426\u5728 Providers \u5217\u8868\u4E2D\u5B58\u5728\r\n * \u8FD4\u56DE\u9519\u8BEF\u63CF\u8FF0\uFF0C\u5408\u6CD5\u5219\u8FD4\u56DE null\r\n */\r\nfunction validateModelRef(\n ref: string,\n providers: IAppConfig['Providers'],\n fieldName: string\n): string | null {\r\n if (!ref || !ref.includes(',')) {\r\n return `${fieldName} \u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u5E94\u4E3A \"provider,model\"\uFF0C\u5F53\u524D\u503C\uFF1A\"${ref}\"`;\r\n }\r\n const [providerName, modelName] = ref.split(',');\r\n const provider = providers.find(p => p.name === providerName);\r\n if (!provider) {\r\n return `${fieldName} \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u63D0\u4F9B\u5546 \"${providerName}\"\uFF0C\u8BF7\u68C0\u67E5 Providers \u914D\u7F6E`;\r\n }\r\n if (!provider.models.includes(modelName)) {\r\n return `${fieldName} \u5F15\u7528\u7684\u6A21\u578B \"${modelName}\" \u4E0D\u5728\u63D0\u4F9B\u5546 \"${providerName}\" \u7684 models \u5217\u8868\u4E2D`;\r\n }\n return null;\n}\n\nfunction validateKnownModelRef(\n ref: string,\n config: Partial<IAppConfig>,\n providers: IAppConfig['Providers'],\n fieldName: string\n): string | null {\n if (isKnownModelReference(config as IAppConfig, ref)) {\n return null;\n }\n\n return validateModelRef(ref, providers, fieldName);\n}\n\nfunction validateRoutingRule(\n rule: NonNullable<ITriggerConfig['rules']>[number],\n index: number,\n containerName: string,\n config: Partial<IAppConfig>,\n validProviders: IAppConfig['Providers'],\n errors: string[]\n): void {\n if (!rule.name) {\n errors.push(`${containerName}[${index}].name is required`);\n }\n if (!rule.model) {\n errors.push(`${containerName}[${index}].model is required`);\n } else if (validProviders.length > 0) {\n const err = validateKnownModelRef(rule.model, config, validProviders, `${containerName}[${index}].model`);\n if (err) errors.push(err);\n }\n const hasSemanticOnlyMatch = Boolean(\n rule.description ||\n rule.semantic_profile?.prototype ||\n rule.semantic_profile?.enabled\n );\n if ((!rule.patterns || rule.patterns.length === 0) && !hasSemanticOnlyMatch) {\n errors.push(`${containerName}[${index}].patterns must be a non-empty array`);\n }\n}\n\nfunction validateStickyRoutingConfig(\n sticky: IGovernanceConfig['sticky'] | undefined,\n config: Partial<IAppConfig>,\n validProviders: IAppConfig['Providers'],\n prefix: string,\n errors: string[]\n): void {\n if (!sticky?.enabled) {\n return;\n }\n\n if ((sticky.session_ttl_ms ?? 0) <= 0) {\n errors.push(`${prefix}.session_ttl_ms must be greater than 0 when sticky routing is enabled`);\n }\n const threshold = sticky.fingerprint_similarity_threshold;\n if (threshold !== undefined && (threshold < 0 || threshold > 1)) {\n errors.push(`${prefix}.fingerprint_similarity_threshold must be between 0 and 1`);\n }\n if (sticky.alignment?.enabled) {\n if (!sticky.alignment.summarizer_model) {\n errors.push(`${prefix}.alignment.summarizer_model is required when alignment is enabled`);\n } else if (!isKnownModelReference(config as IAppConfig, sticky.alignment.summarizer_model)) {\n const err = validateModelRef(\n sticky.alignment.summarizer_model,\n validProviders,\n `${prefix}.alignment.summarizer_model`\n );\n if (err) errors.push(err);\n }\n if ((sticky.alignment.max_summary_tokens ?? 0) <= 0) {\n errors.push(`${prefix}.alignment.max_summary_tokens must be greater than 0 when alignment is enabled`);\n }\n }\n}\n\nfunction validateSemanticRoutingConfig(\n semantic: IGovernanceConfig['semantic'] | undefined,\n config: Partial<IAppConfig>,\n validProviders: IAppConfig['Providers'],\n prefix: string,\n errors: string[]\n): void {\n if (!semantic?.enabled) {\n return;\n }\n\n const threshold = semantic.threshold;\n if (threshold !== undefined && (threshold < 0 || threshold > 1)) {\n errors.push(`${prefix}.threshold must be between 0 and 1`);\n }\n if (semantic.mode && !['embedding', 'classifier'].includes(semantic.mode)) {\n errors.push(`${prefix}.mode must be either \"embedding\" or \"classifier\"`);\n }\n if (semantic.mode === 'classifier') {\n if (!semantic.classifier_model) {\n errors.push(`${prefix}.classifier_model is required when semantic mode is \"classifier\"`);\n } else if (!isKnownModelReference(config as IAppConfig, semantic.classifier_model)) {\n const err = validateModelRef(semantic.classifier_model, validProviders, `${prefix}.classifier_model`);\n if (err) errors.push(err);\n }\n }\n}\n\r\n/**\r\n * \u9A8C\u8BC1\u914D\u7F6E\r\n */\r\nfunction validateConfig(config: Partial<IAppConfig>): string[] {\n const errors: string[] = [];\n\n if (config.Models !== undefined) {\n if (!Array.isArray(config.Models)) {\n errors.push('Models must be an array when provided');\n } else {\n const ids = new Set<string>();\n config.Models.forEach((item, index) => {\n if (!item.id?.trim()) {\n errors.push(`Models[${index}].id is required`);\n } else if (ids.has(item.id.trim())) {\n errors.push(`Models[${index}].id must be unique`);\n } else {\n ids.add(item.id.trim());\n }\n\n if (!getModelApi(item)) {\n errors.push(`Models[${index}].api is required`);\n }\n\n if (!getModelKey(item)) {\n errors.push(`Models[${index}].key is required`);\n }\n\n const modelInterface = getModelInterface(item);\n if (!modelInterface) {\n errors.push(`Models[${index}].interface is required`);\n } else if (!['openai', 'anthropic'].includes(modelInterface)) {\n errors.push(`Models[${index}].interface must be either \"openai\" or \"anthropic\"`);\n }\n\n if (!item.model?.trim()) {\n errors.push(`Models[${index}].model is required`);\n }\n\n const thinking = item.thinking;\n if (thinking?.mode && !['off', 'auto', 'on'].includes(thinking.mode)) {\n errors.push(`Models[${index}].thinking.mode must be one of \"off\", \"auto\", \"on\"`);\n }\n\n if (thinking?.effort && !['low', 'medium', 'high'].includes(thinking.effort)) {\n errors.push(`Models[${index}].thinking.effort must be one of \"low\", \"medium\", \"high\"`);\n }\n\n if (thinking?.budget_tokens !== undefined && thinking.budget_tokens <= 0) {\n errors.push(`Models[${index}].thinking.budget_tokens must be greater than 0`);\n }\n });\n }\n }\n\n // \u9A8C\u8BC1 Providers\n const hasModels = Array.isArray(config.Models) && config.Models.length > 0;\n\n if (!hasModels && (!config.Providers || !Array.isArray(config.Providers) || config.Providers.length === 0)) {\n errors.push('Providers is required and must be a non-empty array');\n } else if (config.Providers && Array.isArray(config.Providers)) {\n config.Providers.forEach((provider, index) => {\n if (!provider.name) {\n errors.push(`Providers[${index}].name is required`);\n }\r\n if (!provider.api_base_url) {\r\n errors.push(`Providers[${index}].api_base_url is required`);\r\n }\r\n if (!provider.models || provider.models.length === 0) {\r\n errors.push(`Providers[${index}].models must be a non-empty array`);\r\n }\r\n });\r\n }\r\n\r\n // \u9A8C\u8BC1 Router\r\n if (!config.Router?.default) {\r\n errors.push('Router.default is required');\r\n }\r\n\r\n // Provider/model \u4EA4\u53C9\u5F15\u7528\u6821\u9A8C\uFF08\u4EC5\u5728 Providers \u5217\u8868\u6709\u6548\u65F6\u6267\u884C\uFF09\n const validProviders = config.Providers?.filter(p => p.name && p.models?.length) ?? [];\n const runtimeSmartRouter = deriveRuntimeSmartRouterConfig(config as IAppConfig, config);\n if (validProviders.length > 0) {\n const router = config.Router;\n if (router) {\r\n const routerModelFields: Array<[string | undefined, string]> = [\r\n [router.default, 'Router.default'],\r\n [router.background, 'Router.background'],\r\n [router.think, 'Router.think'],\r\n [router.longContext, 'Router.longContext'],\r\n [router.webSearch, 'Router.webSearch'],\r\n [router.image, 'Router.image'],\r\n ];\r\n for (const [ref, field] of routerModelFields) {\n if (ref) {\n const err = validateKnownModelRef(ref, config, validProviders, field);\n if (err) errors.push(err);\n }\n }\n }\n }\r\n\r\n // \u9A8C\u8BC1\u7EDF\u4E00 SmartRouter \u8FD0\u884C\u65F6 contract\uFF08\u517C\u5BB9 Trigger/Governance \u8F93\u5165\u540E\u7EDF\u4E00\u843D\u5230\u8FD9\u91CC\uFF09\n if (runtimeSmartRouter?.enabled) {\n if (runtimeSmartRouter.router_model && validProviders.length > 0) {\n const err = validateKnownModelRef(runtimeSmartRouter.router_model, config, validProviders, 'SmartRouter.router_model');\n if (err) errors.push(err);\n }\n if (runtimeSmartRouter.router_model) {\n if (!runtimeSmartRouter.candidates || runtimeSmartRouter.candidates.length < 2) {\n errors.push('SmartRouter.candidates must have at least 2 entries when SmartRouter.router_model is configured');\n }\n }\n if (runtimeSmartRouter.candidates && runtimeSmartRouter.candidates.length > 0) {\n runtimeSmartRouter.candidates.forEach((candidate, index) => {\n if (!candidate.model) {\n errors.push(`SmartRouter.candidates[${index}].model is required`);\n } else if (validProviders.length > 0) {\n const err = validateKnownModelRef(candidate.model, config, validProviders, `SmartRouter.candidates[${index}].model`);\n if (err) errors.push(err);\n }\n if (!candidate.description) {\n errors.push(`SmartRouter.candidates[${index}].description is required`);\n }\n });\n }\n if (runtimeSmartRouter.rules) {\n runtimeSmartRouter.rules.forEach((rule, index) => {\n validateRoutingRule(rule, index, 'SmartRouter.rules', config, validProviders, errors);\n });\n }\n validateStickyRoutingConfig(runtimeSmartRouter.sticky, config, validProviders, 'SmartRouter.sticky', errors);\n validateSemanticRoutingConfig(runtimeSmartRouter.semantic, config, validProviders, 'SmartRouter.semantic', errors);\n }\n\n // \u9A8C\u8BC1 Governance \u914D\u7F6E\n if (config.Governance?.enabled) {\n const cascade = config.Governance.cascade;\n if (cascade?.enabled) {\n if ((cascade.max_attempts ?? 0) < 1) {\n errors.push('Governance.cascade.max_attempts must be at least 1 when cascade is enabled');\n }\n cascade.levels?.forEach((level, index) => {\n if (!level.from) {\n errors.push(`Governance.cascade.levels[${index}].from is required`);\n } else if (!isKnownModelReference(config as IAppConfig, level.from)) {\n const err = validateModelRef(level.from, validProviders, `Governance.cascade.levels[${index}].from`);\n if (err) errors.push(err);\n }\n if (!level.to) {\n errors.push(`Governance.cascade.levels[${index}].to is required`);\n } else if (!isKnownModelReference(config as IAppConfig, level.to)) {\n const err = validateModelRef(level.to, validProviders, `Governance.cascade.levels[${index}].to`);\n if (err) errors.push(err);\n }\n });\n }\n\n const shadow = config.Governance.shadow;\n if (shadow?.enabled) {\n const sampleRate = shadow.sample_rate;\n if (sampleRate !== undefined && (sampleRate < 0 || sampleRate > 1)) {\n errors.push('Governance.shadow.sample_rate must be between 0 and 1');\n }\n if (shadow.mode && !['async_audit', 'sync_guard'].includes(shadow.mode)) {\n errors.push('Governance.shadow.mode must be either \"async_audit\" or \"sync_guard\"');\n }\n if (shadow.verifier_model && !isKnownModelReference(config as IAppConfig, shadow.verifier_model)) {\n const err = validateModelRef(shadow.verifier_model, validProviders, 'Governance.shadow.verifier_model');\n if (err) errors.push(err);\n }\n }\n\n const anomalyThresholds = config.Governance.observability?.anomaly_thresholds;\n if (anomalyThresholds) {\n const rateFields: Array<[number | undefined, string]> = [\n [anomalyThresholds.cascade_warn_rate, 'Governance.observability.anomaly_thresholds.cascade_warn_rate'],\n [anomalyThresholds.cascade_critical_rate, 'Governance.observability.anomaly_thresholds.cascade_critical_rate'],\n [anomalyThresholds.shadow_warn_rate, 'Governance.observability.anomaly_thresholds.shadow_warn_rate'],\n [anomalyThresholds.shadow_critical_rate, 'Governance.observability.anomaly_thresholds.shadow_critical_rate'],\n [anomalyThresholds.spike_warn_rate, 'Governance.observability.anomaly_thresholds.spike_warn_rate'],\n [anomalyThresholds.spike_delta_rate, 'Governance.observability.anomaly_thresholds.spike_delta_rate'],\n ];\n for (const [value, field] of rateFields) {\n if (value !== undefined && (value < 0 || value > 1)) {\n errors.push(`${field} must be between 0 and 1`);\n }\n }\n\n const minSampleSize = anomalyThresholds.min_sample_size;\n if (minSampleSize !== undefined && minSampleSize < 1) {\n errors.push('Governance.observability.anomaly_thresholds.min_sample_size must be at least 1');\n }\n\n const latencyWarnMs = anomalyThresholds.latency_warn_ms;\n const latencyCriticalMs = anomalyThresholds.latency_critical_ms;\n if (latencyWarnMs !== undefined && latencyWarnMs < 1) {\n errors.push('Governance.observability.anomaly_thresholds.latency_warn_ms must be greater than 0');\n }\n if (latencyCriticalMs !== undefined && latencyCriticalMs < 1) {\n errors.push('Governance.observability.anomaly_thresholds.latency_critical_ms must be greater than 0');\n }\n if (\n anomalyThresholds.cascade_warn_rate !== undefined &&\n anomalyThresholds.cascade_critical_rate !== undefined &&\n anomalyThresholds.cascade_warn_rate > anomalyThresholds.cascade_critical_rate\n ) {\n errors.push('Governance.observability.anomaly_thresholds.cascade_warn_rate must be less than or equal to cascade_critical_rate');\n }\n if (\n anomalyThresholds.shadow_warn_rate !== undefined &&\n anomalyThresholds.shadow_critical_rate !== undefined &&\n anomalyThresholds.shadow_warn_rate > anomalyThresholds.shadow_critical_rate\n ) {\n errors.push('Governance.observability.anomaly_thresholds.shadow_warn_rate must be less than or equal to shadow_critical_rate');\n }\n if (\n latencyWarnMs !== undefined &&\n latencyCriticalMs !== undefined &&\n latencyWarnMs > latencyCriticalMs\n ) {\n errors.push('Governance.observability.anomaly_thresholds.latency_warn_ms must be less than or equal to latency_critical_ms');\n }\n }\n }\n\n return errors;\n}\n\nfunction normalizeUnifiedRouterInput(config: Partial<IAppConfig>): Partial<IAppConfig> {\n const routes = config.Router?.routes;\n const decision = config.Router?.decision;\n const defaults = config.Router?.defaults;\n const hasUnifiedRouterInput = Boolean(\n (Array.isArray(routes) && routes.length) ||\n decision ||\n defaults\n );\n\n if (!hasUnifiedRouterInput) {\n return config;\n }\n\n const nextConfig: Partial<IAppConfig> = {\n ...config,\n Router: {\n ...(config.Router ?? {}),\n },\n };\n\n const normalizedRules = Array.isArray(routes) && routes.length > 0\n ? routes.map((route) => ({\n name: route.name,\n priority: route.priority ?? 0,\n enabled: route.enabled ?? true,\n model: route.model,\n description: route.description,\n semantic_profile: route.match?.semantic || route.match?.semantic_profile\n ? {\n enabled: route.match?.semantic ?? true,\n prototype: route.match?.semantic_profile?.prototype,\n threshold: route.match?.semantic_profile?.threshold,\n }\n : undefined,\n patterns: [\n ...(Array.isArray(route.match?.keywords) && route.match?.keywords.length\n ? [{\n type: 'exact' as const,\n keywords: route.match?.keywords,\n }]\n : []),\n ...(typeof route.match?.regex === 'string' && route.match.regex.trim().length\n ? [{\n type: 'regex' as const,\n pattern: route.match.regex,\n }]\n : []),\n ],\n }))\n : [];\n\n const semanticPrototypes = Object.fromEntries(\n normalizedRules\n .filter((rule) => rule.semantic_profile?.enabled !== false && (rule.semantic_profile?.prototype || rule.description))\n .map((rule) => [\n rule.name,\n rule.semantic_profile?.prototype ?? rule.description ?? '',\n ])\n .filter(([, prototype]) => typeof prototype === 'string' && prototype.trim().length > 0)\n );\n\n if (decision || normalizedRules.length > 0 || defaults?.sticky || defaults?.semantic || config.SmartRouter) {\n nextConfig.SmartRouter = {\n ...(config.SmartRouter ?? DEFAULT_SMART_ROUTER_CONFIG),\n enabled: decision?.smart_fallback ?? config.SmartRouter?.enabled ?? true,\n router_model: decision?.router_model ?? config.SmartRouter?.router_model ?? '',\n candidates: decision?.candidates ?? config.SmartRouter?.candidates ?? [],\n cache_ttl: decision?.cache_ttl ?? config.SmartRouter?.cache_ttl,\n max_tokens: decision?.max_tokens ?? config.SmartRouter?.max_tokens,\n fallback: decision?.fallback ?? config.SmartRouter?.fallback,\n router_hint: decision?.router_hint ?? config.SmartRouter?.router_hint,\n rules: normalizedRules.length > 0 ? normalizedRules : config.SmartRouter?.rules,\n semantic: Object.keys(semanticPrototypes).length > 0 || defaults?.semantic || config.SmartRouter?.semantic\n ? {\n ...(config.SmartRouter?.semantic ?? config.Governance?.semantic ?? {}),\n ...(defaults?.semantic ?? {}),\n prototypes: {\n ...(config.Governance?.semantic?.prototypes ?? {}),\n ...(config.SmartRouter?.semantic?.prototypes ?? {}),\n ...semanticPrototypes,\n },\n }\n : config.SmartRouter?.semantic,\n sticky: defaults?.sticky\n ? {\n ...(config.SmartRouter?.sticky ?? config.Governance?.sticky ?? {}),\n ...defaults.sticky,\n }\n : config.SmartRouter?.sticky ?? config.Governance?.sticky,\n };\n }\n\n return nextConfig;\n}\n\nexport function deriveRuntimeSmartRouterConfig(\n config: IAppConfig,\n source?: Partial<IAppConfig>\n): IAppConfig['SmartRouter'] {\n const smartRouterInput = source?.SmartRouter ?? config.SmartRouter;\n const baseSmartRouterConfig = smartRouterInput ?? DEFAULT_SMART_ROUTER_CONFIG;\n const legacyIntentEnabled = Boolean(config.TriggerRouter?.llm_intent_recognition);\n const legacyIntentModel = config.TriggerRouter?.intent_model;\n const legacySemanticPrototypes = Object.fromEntries(\n (config.TriggerRouter?.rules ?? [])\n .filter((rule) => rule.enabled !== false && rule.description)\n .map((rule) => [rule.name, rule.description as string])\n );\n const hasExplicitSmartRouterConfig = Boolean(\n source?.SmartRouter !== undefined ||\n baseSmartRouterConfig.enabled ||\n baseSmartRouterConfig.router_model ||\n baseSmartRouterConfig.rules?.length ||\n baseSmartRouterConfig.candidates?.length ||\n baseSmartRouterConfig.semantic ||\n baseSmartRouterConfig.sticky\n );\n const defaultSummarizerModel =\n baseSmartRouterConfig.router_model\n || config.Router?.default\n || legacyIntentModel\n || '';\n const derivedSemantic = deepMerge(\n DEFAULT_GOVERNANCE_CONFIG.semantic,\n baseSmartRouterConfig.semantic ?? (\n legacyIntentEnabled || config.Governance?.semantic\n ? {\n ...(config.Governance?.semantic ?? {}),\n ...(legacyIntentEnabled\n ? {\n enabled: true,\n mode: 'classifier' as const,\n classifier_model: legacyIntentModel,\n prototypes: {\n ...(config.Governance?.semantic?.prototypes ?? {}),\n ...legacySemanticPrototypes,\n },\n }\n : {}),\n }\n : {}\n )\n ) as NonNullable<IAppConfig['SmartRouter']>['semantic'];\n const derivedSticky = deepMerge(\n DEFAULT_GOVERNANCE_CONFIG.sticky,\n baseSmartRouterConfig.sticky ?? config.Governance?.sticky ?? {}\n ) as NonNullable<IAppConfig['SmartRouter']>['sticky'];\n const smartRouterEnabled = hasExplicitSmartRouterConfig\n ? baseSmartRouterConfig.enabled\n : Boolean(config.TriggerRouter?.enabled);\n const hasExplicitSemanticToggle = Boolean(\n baseSmartRouterConfig.semantic ||\n config.Governance?.semantic ||\n legacyIntentEnabled\n );\n const hasExplicitStickyToggle = Boolean(\n baseSmartRouterConfig.sticky ||\n config.Governance?.sticky\n );\n\n const semantic = smartRouterEnabled\n ? {\n ...derivedSemantic,\n enabled: hasExplicitSemanticToggle\n ? (baseSmartRouterConfig.semantic?.enabled ?? derivedSemantic.enabled)\n : true,\n threshold: hasExplicitSemanticToggle\n ? derivedSemantic.threshold\n : 0.2,\n }\n : derivedSemantic;\n\n const sticky = smartRouterEnabled\n ? {\n ...derivedSticky,\n enabled: hasExplicitStickyToggle\n ? (baseSmartRouterConfig.sticky?.enabled ?? derivedSticky.enabled)\n : true,\n alignment: {\n ...derivedSticky.alignment,\n enabled: hasExplicitStickyToggle && (\n baseSmartRouterConfig.sticky?.alignment ||\n config.Governance?.sticky?.alignment\n )\n ? (baseSmartRouterConfig.sticky?.alignment?.enabled ?? derivedSticky.alignment?.enabled)\n : true,\n summarizer_model:\n baseSmartRouterConfig.sticky?.alignment?.summarizer_model\n || derivedSticky.alignment?.summarizer_model\n || defaultSummarizerModel,\n },\n }\n : derivedSticky;\n\n return {\n ...baseSmartRouterConfig,\n enabled: smartRouterEnabled,\n analysis_scope: baseSmartRouterConfig.analysis_scope ?? config.TriggerRouter?.analysis_scope ?? 'last_message',\n rules: baseSmartRouterConfig.rules?.length\n ? baseSmartRouterConfig.rules\n : config.TriggerRouter?.rules ?? [],\n semantic,\n sticky,\n };\n}\n\nexport function normalizeAndValidateConfig(config: Partial<IAppConfig> = {}): {\n config: IAppConfig;\n errors: string[];\n warnings: string[];\n} {\n const normalizedInput = normalizeUnifiedRouterInput(config);\n const normalizedConfig = deepMerge(\n {\n ...DEFAULT_CONFIG,\n Router: {\n default: '',\n },\n Providers: [],\n SmartRouter: DEFAULT_SMART_ROUTER_CONFIG,\n },\n normalizedInput\n ) as IAppConfig;\n\n if (normalizedInput.Governance) {\n normalizedConfig.Governance = deepMerge(DEFAULT_GOVERNANCE_CONFIG, normalizedInput.Governance) as IAppConfig['Governance'];\n }\n\n normalizedConfig.SmartRouter = deepMerge(\n DEFAULT_SMART_ROUTER_CONFIG,\n deriveRuntimeSmartRouterConfig(normalizedConfig, normalizedInput)\n ) as IAppConfig['SmartRouter'];\n\n if (\n normalizedInput.TriggerRouter ||\n normalizedInput.SmartRouter ||\n normalizedInput.Router?.routes ||\n normalizedInput.Router?.decision ||\n normalizedInput.Router?.defaults\n ) {\n delete (normalizedConfig as Partial<IAppConfig>).TriggerRouter;\n }\n\n if (normalizedConfig.SmartRouter?.sticky) {\n normalizedConfig.SmartRouter.sticky = deepMerge(\n DEFAULT_GOVERNANCE_CONFIG.sticky,\n normalizedConfig.SmartRouter.sticky\n ) as NonNullable<IAppConfig['SmartRouter']>['sticky'];\n }\n\n if (normalizedConfig.SmartRouter?.semantic) {\n normalizedConfig.SmartRouter.semantic = deepMerge(\n DEFAULT_GOVERNANCE_CONFIG.semantic,\n normalizedConfig.SmartRouter.semantic\n ) as NonNullable<IAppConfig['SmartRouter']>['semantic'];\n }\n\n if (normalizedInput.Models) {\n normalizedConfig.Models = normalizedInput.Models.map((item) => normalizeModelEndpointConfig(item));\n }\n\n return {\n config: normalizedConfig,\n errors: validateConfig(normalizedConfig),\n warnings: collectCapabilityWarnings(normalizedConfig).entries.map((entry) => entry.message),\n };\n}\n\r\n/**\r\n * \u521D\u59CB\u5316\u5E76\u52A0\u8F7D\u914D\u7F6E\r\n */\r\nexport async function initConfig(): Promise<IAppConfig> {\r\n await initDir();\r\n\r\n // \u5C1D\u8BD5\u52A0\u8F7D\u914D\u7F6E\u6587\u4EF6\uFF08\u4F18\u5148\u987A\u5E8F\uFF1Aconfig.yaml \u2192 config.yml \u2192 config.json\uFF09\r\n let config: Partial<IAppConfig> | null = null;\r\n\r\n // \u5C1D\u8BD5 .yaml \u914D\u7F6E\r\n config = await loadYamlConfig(CONFIG_FILE);\r\n\r\n // \u5C1D\u8BD5 .yml \u914D\u7F6E\r\n if (!config) {\r\n config = await loadYamlConfig(CONFIG_FILE_YML);\r\n }\r\n\r\n // \u5982\u679C\u6CA1\u6709 YAML \u914D\u7F6E\uFF0C\u5C1D\u8BD5 JSON \u914D\u7F6E\r\n if (!config) {\r\n config = await loadJsonConfig(CONFIG_FILE_JSON);\r\n }\r\n\r\n // \u5982\u679C\u6CA1\u6709\u914D\u7F6E\u6587\u4EF6\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\r\n if (!config) {\r\n const divider = '\u2500'.repeat(60);\r\n console.error(`\\n${divider}`);\r\n console.error(' \u26A0\uFE0F No configuration file found');\r\n console.error(divider);\r\n console.error(` Expected: ${CONFIG_FILE}`);\r\n console.error(` Run 'ctr init' to create a configuration file.`);\r\n console.error(`${divider}\\n`);\r\n config = {};\r\n }\r\n\r\n const result = normalizeAndValidateConfig(config);\r\n\r\n if (result.errors.length > 0) {\n const divider = '\u2500'.repeat(60);\r\n console.error(`\\n${divider}`);\r\n console.error(' \u274C Configuration Error');\r\n console.error(divider);\r\n console.error(' The following issues were found in your config file:\\n');\r\n result.errors.forEach((err, i) => console.error(` ${i + 1}. ${err}`));\r\n console.error(`\\n Config file: ${CONFIG_FILE}`);\r\n console.error(` Run 'ctr init' to create a new config from the example.`);\r\n console.error(` Reference: https://github.com/peterwangze/claude-trigger-router#configuration`);\r\n console.error(`${divider}\\n`);\r\n throw new Error('Invalid configuration');\n }\n\n if (result.warnings.length > 0) {\n result.warnings.forEach((warning) => logWarn(`[ConfigWarning] ${warning}`));\n }\n\n return result.config;\n}\n\r\n/**\r\n * \u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6\r\n */\r\nexport async function readConfigFile(): Promise<IAppConfig> {\r\n return initConfig();\r\n}\r\n\r\n/**\r\n * \u5199\u5165\u914D\u7F6E\u6587\u4EF6\r\n * \u5199\u56DE\u7B56\u7565\uFF1A\u4F18\u5148\u4FDD\u6301\u539F\u6709\u683C\u5F0F\uFF08YAML \u6216 JSON\uFF09\u3002\r\n * \u82E5 YAML \u6587\u4EF6\u5B58\u5728\uFF0C\u5199\u5165 YAML\uFF1B\u82E5\u4EC5\u5B58\u5728 JSON \u6587\u4EF6\uFF0C\u5199\u5165 JSON\uFF1B\u5426\u5219\u9ED8\u8BA4\u5199 YAML\u3002\r\n */\r\nexport async function writeConfigFile(config: IAppConfig): Promise<void> {\r\n await initDir();\r\n\r\n // \u68C0\u6D4B\u539F\u59CB\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\uFF1A\u4EC5\u5B58\u5728 JSON \u4E14\u4E0D\u5B58\u5728 YAML/YML \u65F6\uFF0C\u5199\u56DE JSON\r\n const hasYaml = existsSync(CONFIG_FILE);\r\n const hasYml = existsSync(CONFIG_FILE_YML);\r\n const hasJson = existsSync(CONFIG_FILE_JSON);\r\n const useJson = !hasYaml && !hasYml && hasJson;\r\n\r\n // \u5199\u56DE\u540C\u540D\u6587\u4EF6\uFF1Ayaml \u2192 config.yaml\uFF0Cyml \u2192 config.yml\uFF0Cjson \u2192 config.json\uFF0C\u9ED8\u8BA4 yaml\r\n const targetFile = useJson ? CONFIG_FILE_JSON : (hasYml && !hasYaml ? CONFIG_FILE_YML : CONFIG_FILE);\r\n\r\n let content: string;\n const externalConfig = {\n ...config,\n Models: config.Models?.map((item) => toExternalModelConfig(item)),\n };\n\n if (useJson) {\n content = JSON.stringify(externalConfig, null, 2);\n } else {\n content = yaml.dump(externalConfig, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n });\r\n }\r\n\r\n await writeFile(targetFile, content, 'utf-8');\r\n}\r\n\r\n/**\r\n * \u5907\u4EFD\u914D\u7F6E\u6587\u4EF6\r\n */\r\nexport async function backupConfigFile(): Promise<string | null> {\r\n const configPath = existsSync(CONFIG_FILE) ? CONFIG_FILE :\r\n existsSync(CONFIG_FILE_YML) ? CONFIG_FILE_YML :\r\n existsSync(CONFIG_FILE_JSON) ? CONFIG_FILE_JSON : null;\r\n\r\n if (!configPath || !existsSync(configPath)) {\r\n return null;\r\n }\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const backupPath = join(CONFIG_DIR, `config.backup.${timestamp}.yaml`);\r\n\r\n try {\r\n const content = await readFile(configPath, 'utf-8');\r\n await writeFile(backupPath, content, 'utf-8');\r\n return backupPath;\r\n } catch (error) {\r\n logError('Error backing up config file:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * \u5408\u5E76\u89E6\u53D1\u914D\u7F6E\r\n * \u5C06\u72EC\u7ACB\u7684\u89E6\u53D1\u914D\u7F6E\u6587\u4EF6\u5408\u5E76\u5230\u4E3B\u914D\u7F6E\r\n */\r\nexport async function mergeTriggerConfig(\r\n config: IAppConfig,\r\n triggerConfigPath?: string\r\n): Promise<IAppConfig> {\r\n if (!triggerConfigPath) {\r\n return config;\r\n }\r\n\r\n const triggerConfig = await loadYamlConfig(triggerConfigPath);\r\n\r\n if (!triggerConfig?.TriggerRouter) {\r\n return config;\r\n }\r\n\r\n return {\r\n ...config,\r\n TriggerRouter: {\r\n ...DEFAULT_TRIGGER_CONFIG,\r\n ...triggerConfig.TriggerRouter,\r\n } as ITriggerConfig,\r\n };\r\n}\r\n", "/**\n * Utilities Index\n *\n * \u5DE5\u5177\u51FD\u6570\u5BFC\u51FA\n */\n\nexport * from './config';\nexport * from './log';\n", "import { Socket } from 'net';\n\nexport const SERVICE_NAME = 'claude-trigger-router';\nexport const SERVICE_HEALTH_PATH = '/api/health';\n\r\nexport function isExpectedServiceHealth(payload: unknown): boolean {\r\n if (!payload || typeof payload !== 'object') {\r\n return false;\r\n }\r\n\r\n const health = payload as {\r\n service?: unknown;\r\n ready?: unknown;\r\n };\r\n\r\n return health.service === SERVICE_NAME && health.ready === true;\r\n}\r\n\r\nexport async function probeServiceHealth(port: number, timeoutMs = 500): Promise<boolean> {\n try {\r\n const res = await fetch(`http://127.0.0.1:${port}${SERVICE_HEALTH_PATH}`, {\r\n signal: AbortSignal.timeout(timeoutMs),\r\n });\r\n\r\n if (!res.ok) {\r\n return false;\r\n }\r\n\r\n return isExpectedServiceHealth(await res.json());\r\n } catch {\r\n return false;\r\n }\r\n}\n\nexport async function isTcpPortOccupied(port: number, timeoutMs = 500): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = new Socket();\n let settled = false;\n\n const finish = (value: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n resolve(value);\n };\n\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', (error: NodeJS.ErrnoException) => {\n if (error.code === 'ECONNREFUSED') {\n finish(false);\n return;\n }\n finish(false);\n });\n\n socket.connect(port, '127.0.0.1');\n });\n}\n\nexport async function waitForService(port: number, timeoutMs = 5000): Promise<boolean> {\n const start = Date.now();\r\n while (Date.now() - start < timeoutMs) {\r\n if (await probeServiceHealth(port, 500)) {\r\n return true;\r\n }\r\n await new Promise((resolve) => setTimeout(resolve, 300));\r\n }\r\n return false;\r\n}\r\n", "/**\n * Governance Type Definitions\n *\n * \u6CBB\u7406\u5C42\u76F8\u5173\u7C7B\u578B\u5B9A\u4E49\n */\n\nexport type TSemanticRouterMode = 'embedding' | 'classifier';\nexport type TShadowSupervisorMode = 'async_audit' | 'sync_guard';\n\nexport interface IContextAlignmentConfig {\n /** \u662F\u5426\u542F\u7528\u6A21\u578B\u5207\u6362\u65F6\u7684\u4E0A\u4E0B\u6587\u5BF9\u9F50 */\n enabled: boolean;\n\n /** \u7528\u4E8E\u751F\u6210\u6280\u672F\u6458\u8981\u7684\u6A21\u578B */\n summarizer_model?: string;\n\n /** \u6458\u8981\u6700\u5927 token \u6570 */\n max_summary_tokens?: number;\n}\n\nexport interface IStickyRoutingConfig {\n /** \u662F\u5426\u542F\u7528\u4F1A\u8BDD\u7C98\u6027\u8DEF\u7531 */\n enabled: boolean;\n\n /** \u4F1A\u8BDD\u72B6\u6001 TTL */\n session_ttl_ms?: number;\n\n /** \u4EFB\u52A1\u6307\u7EB9\u76F8\u4F3C\u5EA6\u9608\u503C */\n fingerprint_similarity_threshold?: number;\n\n /** \u547D\u4E2D\u5F3A\u663E\u5F0F\u8DEF\u7531\u65F6\u662F\u5426\u5141\u8BB8\u6253\u7834\u7C98\u6027 */\n break_on_explicit_route?: boolean;\n\n /** \u6A21\u578B\u5207\u6362\u65F6\u7684\u4E0A\u4E0B\u6587\u5BF9\u9F50\u914D\u7F6E */\n alignment?: IContextAlignmentConfig;\n}\n\nexport interface ICascadeTriggerConfig {\n compile_failure?: boolean;\n test_failure?: boolean;\n placeholder_patterns?: string[];\n}\n\nexport interface ICascadeLevelConfig {\n from: string;\n to: string;\n reasoning?: string;\n}\n\nexport interface ICascadeGateConfig {\n /** \u662F\u5426\u542F\u7528\u7EA7\u8054\u5347\u7EA7 */\n enabled: boolean;\n\n /** \u6700\u5927\u5347\u7EA7\u5C1D\u8BD5\u6B21\u6570 */\n max_attempts?: number;\n\n /** \u662F\u5426\u5BF9\u6D41\u5F0F\u54CD\u5E94\u542F\u7528 buffer-and-retry \u5B88\u536B */\n stream_guard?: boolean;\n\n /** \u5347\u7EA7\u89E6\u53D1\u5668 */\n triggers?: ICascadeTriggerConfig;\n\n /** \u5347\u7EA7\u5C42\u7EA7 */\n levels?: ICascadeLevelConfig[];\n}\n\nexport interface ISemanticRouterConfig {\n /** \u662F\u5426\u542F\u7528\u8BED\u4E49\u8DEF\u7531 */\n enabled: boolean;\n\n /** \u8BED\u4E49\u8DEF\u7531\u6A21\u5F0F */\n mode?: TSemanticRouterMode;\n\n /** classifier \u6A21\u5F0F\u4E0B\u4F7F\u7528\u7684\u6A21\u578B */\n classifier_model?: string;\n\n /** \u8BED\u4E49\u547D\u4E2D\u9608\u503C */\n threshold?: number;\n\n /** \u539F\u578B\u610F\u56FE\u96C6\u5408 */\n prototypes?: Record<string, string>;\n}\n\nexport interface IShadowChecksConfig {\n placeholder_patterns?: boolean;\n length_anomaly?: boolean;\n missing_code_block?: boolean;\n}\n\nexport interface IShadowSupervisorConfig {\n /** \u662F\u5426\u542F\u7528\u5F71\u5B50\u76D1\u7763 */\n enabled: boolean;\n\n /** \u5DE5\u4F5C\u6A21\u5F0F */\n mode?: TShadowSupervisorMode;\n\n /** \u91C7\u6837\u7387 */\n sample_rate?: number;\n\n /** \u5BA1\u67E5\u6A21\u578B */\n verifier_model?: string;\n\n /** \u89C4\u5219\u68C0\u67E5\u9879 */\n checks?: IShadowChecksConfig;\n}\n\nexport interface IAnomalyThresholdsConfig {\n min_sample_size?: number;\n cascade_warn_rate?: number;\n cascade_critical_rate?: number;\n shadow_warn_rate?: number;\n shadow_critical_rate?: number;\n latency_warn_ms?: number;\n latency_critical_ms?: number;\n spike_warn_rate?: number;\n spike_delta_rate?: number;\n}\n\nexport interface IObservabilityConfig {\n anomaly_thresholds?: IAnomalyThresholdsConfig;\n}\n\nexport interface IGovernanceConfig {\n /** \u662F\u5426\u542F\u7528\u6CBB\u7406\u5C42 */\n enabled: boolean;\n\n sticky?: IStickyRoutingConfig;\n cascade?: ICascadeGateConfig;\n semantic?: ISemanticRouterConfig;\n shadow?: IShadowSupervisorConfig;\n observability?: IObservabilityConfig;\n}\n\nexport interface IGovernanceTrace {\n requestId: string;\n sessionKey?: string;\n initialModel?: string;\n finalModel?: string;\n routeReason: string[];\n stickyHit: boolean;\n alignmentUsed: boolean;\n semanticIntent?: string;\n cascadeTriggered: boolean;\n cascadeEvidence?: string[];\n cascadeNextModel?: string;\n shadowChecked: boolean;\n verificationResult?: string;\n latencyMs?: number;\n estimatedCost?: number;\n startedAt: number;\n completedAt?: number;\n}\n\nexport interface ISessionState {\n sessionKey: string;\n preferredModel?: string;\n lastSuccessfulModel?: string;\n lastTaskFingerprint?: string;\n updatedAt: number;\n}\n", "/**\n * Governance Trace Utilities\n *\n * \u6CBB\u7406\u5C42\u94FE\u8DEF\u8FFD\u8E2A\u5DE5\u5177\n */\n\nimport { randomUUID } from 'crypto';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs';\nimport { LRUCache } from 'lru-cache';\nimport { dirname, join } from 'path';\nimport { gunzipSync, gzipSync } from 'zlib';\nimport { GOVERNANCE_TRACE_ARCHIVE_DIR, GOVERNANCE_TRACE_FILE } from '../constants';\nimport { IGovernanceTrace } from './types';\n\nexport interface IGovernanceTraceStoreOptions {\n max?: number;\n ttlMs?: number;\n persistFile?: string;\n persistEnabled?: boolean;\n activePersistLimit?: number;\n archiveDir?: string;\n retainArchiveFiles?: number;\n compressArchives?: boolean;\n}\n\nexport interface IGovernanceTraceArchiveRecord {\n file: string;\n filePath: string;\n traceCount: number;\n startedAt?: number;\n endedAt?: number;\n compressed: boolean;\n}\n\nexport class GovernanceTraceStore {\n private cache: LRUCache<string, IGovernanceTrace>;\n private persistFile?: string;\n private persistEnabled: boolean;\n private activePersistLimit: number;\n private archiveDir?: string;\n private retainArchiveFiles: number;\n private compressArchives: boolean;\n\n constructor(options: IGovernanceTraceStoreOptions = {}) {\n const max = options.max ?? 500;\n const ttlMs = options.ttlMs ?? 1000 * 60 * 60;\n this.cache = new LRUCache<string, IGovernanceTrace>({\n max,\n ttl: ttlMs,\n });\n this.persistFile = options.persistFile ?? GOVERNANCE_TRACE_FILE;\n this.persistEnabled = options.persistEnabled ?? process.env.NODE_ENV !== 'test';\n this.activePersistLimit = options.activePersistLimit ?? 200;\n this.archiveDir = options.archiveDir ?? GOVERNANCE_TRACE_ARCHIVE_DIR;\n this.retainArchiveFiles = options.retainArchiveFiles ?? 5;\n this.compressArchives = options.compressArchives ?? true;\n this.loadFromDisk();\n }\n\n add(trace: IGovernanceTrace): void {\n this.cache.set(trace.requestId, { ...trace, routeReason: [...trace.routeReason] });\n this.persistToDisk();\n }\n\n get(requestId: string): IGovernanceTrace | undefined {\n return this.cache.get(requestId);\n }\n\n list(filters?: {\n requestId?: string;\n sessionKey?: string;\n routeReason?: string;\n cascadeTriggered?: boolean;\n shadowChecked?: boolean;\n limit?: number;\n }): IGovernanceTrace[] {\n let traces = Array.from(this.cache.values()).sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0));\n\n if (filters?.requestId) {\n traces = traces.filter((trace) => trace.requestId === filters.requestId);\n }\n\n if (filters?.sessionKey) {\n traces = traces.filter((trace) => trace.sessionKey === filters.sessionKey);\n }\n\n if (filters?.routeReason) {\n traces = traces.filter((trace) => trace.routeReason.includes(filters.routeReason!));\n }\n\n if (filters?.cascadeTriggered !== undefined) {\n traces = traces.filter((trace) => trace.cascadeTriggered === filters.cascadeTriggered);\n }\n\n if (filters?.shadowChecked !== undefined) {\n traces = traces.filter((trace) => trace.shadowChecked === filters.shadowChecked);\n }\n\n if (filters?.limit !== undefined && Number.isFinite(filters.limit) && filters.limit > 0) {\n traces = traces.slice(0, filters.limit);\n }\n\n return traces;\n }\n\n clear(): void {\n this.cache.clear();\n this.persistToDisk();\n this.clearArchives();\n }\n\n hydrate(traces: IGovernanceTrace[]): void {\n this.cache.clear();\n for (const trace of traces) {\n this.cache.set(trace.requestId, { ...trace, routeReason: [...trace.routeReason] });\n }\n this.persistToDisk();\n }\n\n listArchives(filters?: {\n date?: string;\n limit?: number;\n page?: number;\n pageSize?: number;\n }): IGovernanceTraceArchiveRecord[] {\n if (!this.archiveDir || !existsSync(this.archiveDir)) {\n return [];\n }\n\n let records = readdirSync(this.archiveDir)\n .filter((file) => file.endsWith('.json') || file.endsWith('.json.gz'))\n .sort()\n .reverse()\n .map((file) => this.readArchiveRecord(file))\n .filter((record): record is IGovernanceTraceArchiveRecord => Boolean(record));\n\n if (filters?.date) {\n records = records.filter((record) => {\n const started = record.startedAt ? new Date(record.startedAt).toISOString().slice(0, 10) : '';\n const ended = record.endedAt ? new Date(record.endedAt).toISOString().slice(0, 10) : '';\n return started === filters.date || ended === filters.date;\n });\n }\n\n const pageSize = filters?.pageSize && filters.pageSize > 0 ? filters.pageSize : undefined;\n const page = filters?.page && filters.page > 0 ? filters.page : 1;\n\n if (pageSize) {\n const start = (page - 1) * pageSize;\n records = records.slice(start, start + pageSize);\n } else if (filters?.limit && filters.limit > 0) {\n records = records.slice(0, filters.limit);\n }\n\n return records;\n }\n\n getArchivedTraces(file: string): IGovernanceTrace[] {\n if (!this.archiveDir) {\n return [];\n }\n\n const filePath = join(this.archiveDir, file);\n if (!existsSync(filePath)) {\n return [];\n }\n\n try {\n return this.readArchiveFile(filePath);\n } catch {\n return [];\n }\n }\n\n deleteArchive(file: string): boolean {\n if (!this.archiveDir) {\n return false;\n }\n\n const filePath = join(this.archiveDir, file);\n if (!existsSync(filePath)) {\n return false;\n }\n\n rmSync(filePath, { force: true });\n return true;\n }\n\n private loadFromDisk(): void {\n if (!this.persistEnabled || !this.persistFile) {\n return;\n }\n\n try {\n const traces: IGovernanceTrace[] = [];\n\n if (existsSync(this.persistFile)) {\n const content = readFileSync(this.persistFile, 'utf-8');\n traces.push(...(JSON.parse(content) as IGovernanceTrace[]));\n }\n\n if (this.archiveDir && existsSync(this.archiveDir)) {\n const archiveFiles = readdirSync(this.archiveDir)\n .filter((file) => file.endsWith('.json') || file.endsWith('.json.gz'))\n .sort()\n .reverse();\n\n for (const file of archiveFiles) {\n traces.push(...this.readArchiveFile(join(this.archiveDir, file)));\n }\n }\n\n const deduped = new Map<string, IGovernanceTrace>();\n for (const trace of traces.sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0))) {\n if (!deduped.has(trace.requestId)) {\n deduped.set(trace.requestId, trace);\n }\n }\n\n for (const trace of Array.from(deduped.values()).slice(0, this.cache.max)) {\n this.cache.set(trace.requestId, { ...trace, routeReason: [...(trace.routeReason ?? [])] });\n }\n } catch {\n // Ignore persistence corruption and continue with in-memory mode.\n }\n }\n\n private persistToDisk(): void {\n if (!this.persistEnabled || !this.persistFile) {\n return;\n }\n\n try {\n mkdirSync(dirname(this.persistFile), { recursive: true });\n const traces = Array.from(this.cache.values()).sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0));\n const activeTraces = traces.slice(0, this.activePersistLimit);\n const archivedTraces = traces.slice(this.activePersistLimit);\n\n if (archivedTraces.length > 0 && this.archiveDir) {\n this.writeArchive(archivedTraces);\n this.pruneArchives();\n this.cache.clear();\n for (const trace of activeTraces) {\n this.cache.set(trace.requestId, { ...trace, routeReason: [...trace.routeReason] });\n }\n }\n\n writeFileSync(this.persistFile, JSON.stringify(activeTraces, null, 2), 'utf-8');\n } catch {\n // Keep runtime resilient even if local persistence fails.\n }\n }\n\n private writeArchive(traces: IGovernanceTrace[]): void {\n if (!this.archiveDir || traces.length === 0) {\n return;\n }\n\n mkdirSync(this.archiveDir, { recursive: true });\n const filename = this.compressArchives\n ? `governance-traces-${Date.now()}.json.gz`\n : `governance-traces-${Date.now()}.json`;\n const filePath = join(this.archiveDir, filename);\n const content = JSON.stringify(traces, null, 2);\n if (this.compressArchives) {\n writeFileSync(filePath, gzipSync(Buffer.from(content, 'utf-8')));\n return;\n }\n writeFileSync(filePath, content, 'utf-8');\n }\n\n private readArchiveRecord(file: string): IGovernanceTraceArchiveRecord | null {\n if (!this.archiveDir) {\n return null;\n }\n\n const filePath = join(this.archiveDir, file);\n try {\n const traces = this.readArchiveFile(filePath);\n const startedAtValues = traces.map((trace) => trace.startedAt).filter((value) => typeof value === 'number');\n return {\n file,\n filePath,\n traceCount: traces.length,\n startedAt: startedAtValues.length ? Math.min(...startedAtValues) : undefined,\n endedAt: startedAtValues.length ? Math.max(...startedAtValues) : undefined,\n compressed: file.endsWith('.gz'),\n };\n } catch {\n return null;\n }\n }\n\n private pruneArchives(): void {\n if (!this.archiveDir || !existsSync(this.archiveDir)) {\n return;\n }\n\n const archiveFiles = readdirSync(this.archiveDir)\n .filter((file) => file.endsWith('.json') || file.endsWith('.json.gz'))\n .sort()\n .reverse();\n\n for (const file of archiveFiles.slice(this.retainArchiveFiles)) {\n rmSync(join(this.archiveDir, file), { force: true });\n }\n }\n\n private clearArchives(): void {\n if (!this.archiveDir || !existsSync(this.archiveDir)) {\n return;\n }\n\n for (const file of readdirSync(this.archiveDir).filter((item) => item.endsWith('.json') || item.endsWith('.json.gz'))) {\n rmSync(join(this.archiveDir, file), { force: true });\n }\n }\n\n private readArchiveFile(filePath: string): IGovernanceTrace[] {\n if (filePath.endsWith('.gz')) {\n const content = gunzipSync(readFileSync(filePath)).toString('utf-8');\n return JSON.parse(content) as IGovernanceTrace[];\n }\n return JSON.parse(readFileSync(filePath, 'utf-8')) as IGovernanceTrace[];\n }\n}\n\nexport const governanceTraceStore = new GovernanceTraceStore();\n\nexport function createGovernanceTrace(\n input: Partial<IGovernanceTrace> = {}\n): IGovernanceTrace {\n return {\n requestId: input.requestId ?? randomUUID(),\n sessionKey: input.sessionKey,\n initialModel: input.initialModel,\n finalModel: input.finalModel,\n routeReason: input.routeReason ? [...input.routeReason] : [],\n stickyHit: input.stickyHit ?? false,\n alignmentUsed: input.alignmentUsed ?? false,\n semanticIntent: input.semanticIntent,\n cascadeTriggered: input.cascadeTriggered ?? false,\n cascadeEvidence: input.cascadeEvidence ? [...input.cascadeEvidence] : [],\n cascadeNextModel: input.cascadeNextModel,\n shadowChecked: input.shadowChecked ?? false,\n verificationResult: input.verificationResult,\n latencyMs: input.latencyMs,\n estimatedCost: input.estimatedCost,\n startedAt: input.startedAt ?? Date.now(),\n completedAt: input.completedAt,\n };\n}\n\nexport function appendTraceReason(trace: IGovernanceTrace, reason: string): IGovernanceTrace {\n if (!trace.routeReason.includes(reason)) {\n trace.routeReason.push(reason);\n }\n return trace;\n}\n\nexport function finalizeTrace(\n trace: IGovernanceTrace,\n overrides: Partial<IGovernanceTrace> = {}\n): IGovernanceTrace {\n const completedAt = overrides.completedAt ?? Date.now();\n return {\n ...trace,\n ...overrides,\n routeReason: overrides.routeReason ? [...overrides.routeReason] : [...trace.routeReason],\n completedAt,\n latencyMs: overrides.latencyMs ?? Math.max(0, completedAt - trace.startedAt),\n };\n}\n\nexport function recordGovernanceTrace(trace: IGovernanceTrace): IGovernanceTrace {\n governanceTraceStore.add(trace);\n return trace;\n}\n", "/**\n * Session State Store\n *\n * \u7528\u4E8E\u4FDD\u5B58\u4F1A\u8BDD\u7EA7\u6CBB\u7406\u72B6\u6001\uFF0C\u4E3A sticky routing \u63D0\u4F9B\u57FA\u7840\u6570\u636E\u3002\n */\n\nimport { LRUCache } from 'lru-cache';\nimport { ISessionState } from './types';\n\nexport class SessionStateStore {\n private cache: LRUCache<string, ISessionState>;\n\n constructor(ttlMs = 1000 * 60 * 60) {\n this.cache = new LRUCache<string, ISessionState>({\n max: 1000,\n ttl: ttlMs,\n });\n }\n\n get(sessionKey: string | undefined): ISessionState | undefined {\n if (!sessionKey) return undefined;\n return this.cache.get(sessionKey);\n }\n\n put(sessionKey: string | undefined, state: Omit<ISessionState, 'sessionKey' | 'updatedAt'>): void {\n if (!sessionKey) return;\n this.cache.set(sessionKey, {\n sessionKey,\n ...state,\n updatedAt: Date.now(),\n });\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\nexport function createTaskFingerprint(text: string | undefined): string | undefined {\n if (!text) return undefined;\n const normalized = text\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, ' ');\n\n return normalized || undefined;\n}\n\nexport const sessionStateStore = new SessionStateStore();\n", "export type TMessageIRRole = 'system' | 'user' | 'assistant' | 'tool';\n\nexport type TMessageIRPart =\n | { type: 'text'; text: string }\n | { type: 'image'; source: any }\n | { type: 'tool_call'; id: string; name: string; arguments: string }\n | { type: 'tool_result'; tool_call_id: string; content: any };\n\nexport interface IMessageIRMessage {\n role: Exclude<TMessageIRRole, 'system'>;\n parts: TMessageIRPart[];\n}\n\nexport interface IMessageIR {\n system: string[];\n messages: IMessageIRMessage[];\n options?: {\n thinking?: {\n enabled?: boolean;\n effort?: 'low' | 'medium' | 'high';\n budget_tokens?: number;\n };\n };\n}\n\nfunction toTextPart(text: string): TMessageIRPart {\n return { type: 'text', text };\n}\n\nfunction normalizeContentParts(content: any): TMessageIRPart[] {\n if (typeof content === 'string') {\n return [toTextPart(content)];\n }\n\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content.flatMap((item) => {\n if (!item || typeof item !== 'object') {\n return [];\n }\n\n switch (item.type) {\n case 'text':\n return typeof item.text === 'string' ? [{ type: 'text', text: item.text }] : [];\n case 'image':\n case 'image_url':\n return [{\n type: 'image',\n source: item.source\n ?? (item.image_url\n ? {\n ...item.image_url,\n ...(item.media_type ? { media_type: item.media_type } : {}),\n }\n : item.url),\n }];\n case 'tool_use':\n return item.id && item.name\n ? [{ type: 'tool_call', id: item.id, name: item.name, arguments: JSON.stringify(item.input ?? {}) }]\n : [];\n case 'tool_result':\n return item.tool_use_id\n ? [{ type: 'tool_result', tool_call_id: item.tool_use_id, content: item.content }]\n : [];\n default:\n return [];\n }\n });\n}\n\nfunction normalizeOpenAIToolCalls(toolCalls: any): TMessageIRPart[] {\n if (!Array.isArray(toolCalls)) {\n return [];\n }\n\n return toolCalls.flatMap((toolCall) => {\n const id = toolCall?.id;\n const name = toolCall?.function?.name;\n const args = toolCall?.function?.arguments;\n if (!id || !name) {\n return [];\n }\n\n return [{\n type: 'tool_call' as const,\n id,\n name,\n arguments: typeof args === 'string' ? args : JSON.stringify(args ?? {}),\n }];\n });\n}\n\nexport function createMessageIR(input: {\n system?: any;\n messages?: any[];\n thinking?: any;\n}): IMessageIR {\n const system = typeof input.system === 'string'\n ? [input.system]\n : Array.isArray(input.system)\n ? input.system.flatMap((item) =>\n typeof item === 'string'\n ? [item]\n : item?.type === 'text' && typeof item.text === 'string'\n ? [item.text]\n : []\n )\n : [];\n\n const messages = Array.isArray(input.messages)\n ? input.messages\n .filter((item) => item?.role)\n .flatMap((item) => {\n if (item.role === 'system') {\n const systemParts = typeof item.content === 'string'\n ? [item.content]\n : normalizeContentParts(item.content)\n .filter((part) => part.type === 'text')\n .map((part) => part.text);\n system.push(...systemParts);\n return [];\n }\n\n if (item.role === 'tool' && item.tool_call_id) {\n return [{\n role: 'user' as const,\n parts: [{\n type: 'tool_result' as const,\n tool_call_id: item.tool_call_id,\n content: item.content,\n }],\n }];\n }\n\n const parts = [\n ...normalizeContentParts(item.content),\n ...(item.role === 'assistant' ? normalizeOpenAIToolCalls(item.tool_calls) : []),\n ];\n\n return [{\n role: item.role,\n parts,\n }];\n })\n : [];\n\n const thinking = input.thinking\n ? {\n enabled: input.thinking?.type === 'enabled' || input.thinking?.enabled === true,\n effort: input.thinking?.effort,\n budget_tokens: input.thinking?.budget_tokens,\n }\n : undefined;\n\n return {\n system,\n messages,\n options: thinking ? { thinking } : undefined,\n };\n}\n\nexport function createSingleUserTextIR(prompt: string, options?: IMessageIR['options']): IMessageIR {\n return {\n system: [],\n messages: [\n {\n role: 'user',\n parts: [toTextPart(prompt)],\n },\n ],\n options,\n };\n}\n", "import { IMessageIR } from './message-ir';\n\nfunction toAnthropicContent(parts: IMessageIR['messages'][number]['parts']) {\n return parts.map((part) => {\n switch (part.type) {\n case 'text':\n return { type: 'text', text: part.text };\n case 'image':\n return { type: 'image', source: part.source };\n case 'tool_call':\n return {\n type: 'tool_use',\n id: part.id,\n name: part.name,\n input: JSON.parse(part.arguments || '{}'),\n };\n case 'tool_result':\n return {\n type: 'tool_result',\n tool_use_id: part.tool_call_id,\n content: part.content,\n };\n default:\n return { type: 'text', text: '' };\n }\n });\n}\n\nexport function toAnthropicMessagesRequest(input: {\n model: string;\n max_tokens?: number;\n stream?: boolean;\n metadata?: Record<string, any>;\n tools?: any[];\n tool_choice?: any;\n ir: IMessageIR;\n}) {\n const body: Record<string, any> = {\n model: input.model,\n messages: input.ir.messages.map((message) => ({\n role: message.role,\n content: toAnthropicContent(message.parts),\n })),\n };\n\n if (input.max_tokens !== undefined) {\n body.max_tokens = input.max_tokens;\n }\n\n if (input.stream !== undefined) {\n body.stream = input.stream;\n }\n\n if (input.metadata) {\n body.metadata = input.metadata;\n }\n\n if (input.tools) {\n body.tools = input.tools.map((tool) => ({\n name: tool?.name ?? tool?.function?.name,\n description: tool?.description ?? tool?.function?.description,\n input_schema: tool?.input_schema ?? tool?.function?.parameters,\n }));\n }\n\n if (input.tool_choice) {\n if (typeof input.tool_choice === 'string') {\n body.tool_choice = input.tool_choice;\n } else if (input.tool_choice?.type === 'tool' && input.tool_choice?.name) {\n body.tool_choice = {\n type: 'tool',\n name: input.tool_choice.name,\n };\n } else if (input.tool_choice?.type === 'function' && input.tool_choice?.function?.name) {\n body.tool_choice = {\n type: 'tool',\n name: input.tool_choice.function.name,\n };\n }\n }\n\n if (input.ir.system.length) {\n body.system = input.ir.system.map((text) => ({ type: 'text', text }));\n }\n\n if (input.ir.options?.thinking?.enabled) {\n body.thinking = {\n type: 'enabled',\n ...(input.ir.options.thinking.effort ? { effort: input.ir.options.thinking.effort } : {}),\n ...(input.ir.options.thinking.budget_tokens ? { budget_tokens: input.ir.options.thinking.budget_tokens } : {}),\n };\n }\n\n return body;\n}\n", "/**\n * Context Alignment\n *\n * \u5728\u6A21\u578B\u5207\u6362\u65F6\u751F\u6210\u6280\u672F\u6458\u8981\uFF0C\u5E76\u628A\u6458\u8981\u6CE8\u5165\u5230\u540E\u7EED\u8BF7\u6C42\u7684 system \u4E0A\u4E0B\u6587\u4E2D\u3002\n */\n\nimport { IContextAlignmentConfig } from './types';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { logError, logWarn } from '../utils/log';\nimport { createSingleUserTextIR } from '../protocols/message-ir';\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\n\nconst CONTEXT_ALIGNMENT_PROMPT = `You are a technical handoff assistant.\nSummarize the current task so a different model can continue the work without losing context.\n\nPrevious model:\n{previousModel}\n\nNext model:\n{nextModel}\n\nUser request / latest task context:\n\"\"\"\n{request}\n\"\"\"\n\nRespond with a concise technical summary only. Focus on:\n- task goal\n- important technical constraints\n- any implied implementation direction\n- what the next model should continue doing\n\nDo not include markdown fences.`;\n\nexport class ContextAlignmentService {\n private buildPrompt(text: string, previousModel: string, nextModel: string): string {\n return CONTEXT_ALIGNMENT_PROMPT\n .replace('{previousModel}', previousModel)\n .replace('{nextModel}', nextModel)\n .replace('{request}', text);\n }\n\n async summarizeTransition(\n text: string,\n previousModel: string,\n nextModel: string,\n config: IContextAlignmentConfig,\n port: number = DEFAULT_CONFIG.PORT,\n fetchFn?: typeof fetch,\n apiKey?: string,\n timeoutMs?: number\n ): Promise<string | null> {\n if (!config.enabled || !config.summarizer_model || !text.trim()) {\n return null;\n }\n\n try {\n const fetchImpl = fetchFn || fetch;\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: config.summarizer_model,\n max_tokens: config.max_summary_tokens ?? 256,\n ir: createSingleUserTextIR(this.buildPrompt(text, previousModel, nextModel)),\n })\n ),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok) {\n logWarn('[ContextAlignment] Alignment request failed:', response.status);\n return null;\n }\n\n const data = await response.json() as any;\n const summary = data.content?.[0]?.text?.trim?.() || '';\n return summary || null;\n } catch (error) {\n logError('[ContextAlignment] Failed to summarize transition:', error);\n return null;\n }\n }\n\n injectAlignmentContext(system: any, summary: string, previousModel: string, nextModel: string): any {\n if (!summary) {\n return system;\n }\n\n const alignmentText =\n `<CTR-CONTEXT-ALIGNMENT from=\"${previousModel}\" to=\"${nextModel}\">\\n` +\n `${summary}\\n` +\n `</CTR-CONTEXT-ALIGNMENT>`;\n\n if (!system) {\n return [{ type: 'text', text: alignmentText }];\n }\n\n if (typeof system === 'string') {\n return [\n { type: 'text', text: alignmentText },\n { type: 'text', text: system },\n ];\n }\n\n if (Array.isArray(system)) {\n return [\n { type: 'text', text: alignmentText },\n ...system,\n ];\n }\n\n return [\n { type: 'text', text: alignmentText },\n system,\n ];\n }\n}\n\nexport const contextAlignmentService = new ContextAlignmentService();\n", "/**\n * Cascade Reasoning Gate\n *\n * \u7B2C\u4E00\u9636\u6BB5\u5148\u843D\u5730\u5931\u8D25\u8BC1\u636E\u8BC6\u522B\u4E0E\u5347\u7EA7\u51B3\u7B56\u57FA\u7840\uFF0C\u4E0D\u76F4\u63A5\u6267\u884C\u771F\u5B9E\u91CD\u6295\u3002\n */\n\nimport { ICascadeGateConfig } from './types';\n\nexport interface IFailureEvidence {\n type: 'compile_failure' | 'test_failure' | 'placeholder_pattern' | 'empty_response' | 'short_response' | 'quality_risk';\n detail: string;\n}\n\nexport interface ICascadeDecision {\n shouldEscalate: boolean;\n nextModel?: string;\n reasoning?: string;\n}\n\nexport async function executeCascadeRetry(\n requestBody: any,\n nextModel: string,\n port: number,\n apiKey?: string,\n timeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<any | null> {\n const fetchImpl = fetchFn || fetch;\n const currentAttempt = Number(requestBody?.metadata?.ctr_cascade_attempt ?? 0);\n const retryBody = {\n ...requestBody,\n model: nextModel,\n metadata: {\n ...(requestBody?.metadata ?? {}),\n ctr_cascade_attempt: currentAttempt + 1,\n },\n };\n\n try {\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(retryBody),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok) {\n return null;\n }\n\n return await response.json();\n } catch {\n return null;\n }\n}\n\nexport async function executeCascadeRetryStream(\n requestBody: any,\n nextModel: string,\n port: number,\n apiKey?: string,\n timeoutMs?: number,\n fetchFn?: typeof fetch\n): Promise<ReadableStream<Uint8Array> | null> {\n const fetchImpl = fetchFn || fetch;\n const currentAttempt = Number(requestBody?.metadata?.ctr_cascade_attempt ?? 0);\n const retryBody = {\n ...requestBody,\n model: nextModel,\n metadata: {\n ...(requestBody?.metadata ?? {}),\n ctr_cascade_attempt: currentAttempt + 1,\n },\n };\n\n try {\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(retryBody),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok || !response.body) {\n return null;\n }\n\n return response.body as ReadableStream<Uint8Array>;\n } catch {\n return null;\n }\n}\n\nfunction extractTextPayload(payload: any): string {\n if (!payload) return '';\n if (typeof payload === 'string') return payload;\n if (typeof payload?.content?.[0]?.text === 'string') {\n return payload.content[0].text;\n }\n if (typeof payload?.error?.message === 'string') {\n return payload.error.message;\n }\n return '';\n}\n\nexport function detectFailureEvidence(payload: any, config?: ICascadeGateConfig): IFailureEvidence[] {\n const evidences: IFailureEvidence[] = [];\n const text = extractTextPayload(payload).trim();\n const placeholderPatterns = config?.triggers?.placeholder_patterns ?? [];\n\n if (!text) {\n evidences.push({ type: 'empty_response', detail: 'Response payload is empty' });\n return evidences;\n }\n\n if (text.length < 20) {\n evidences.push({ type: 'short_response', detail: `Response is unusually short (${text.length} chars)` });\n }\n\n if (config?.triggers?.compile_failure && /compile failed|compilation failed|build failed|typescript error|syntaxerror/i.test(text)) {\n evidences.push({ type: 'compile_failure', detail: 'Detected compile/build failure marker in response' });\n }\n\n if (config?.triggers?.test_failure && /test failed|failing test|assertionerror|expected .* to/i.test(text)) {\n evidences.push({ type: 'test_failure', detail: 'Detected test failure marker in response' });\n }\n\n for (const pattern of placeholderPatterns) {\n if (pattern && text.toLowerCase().includes(pattern.toLowerCase())) {\n evidences.push({ type: 'placeholder_pattern', detail: `Matched placeholder pattern: ${pattern}` });\n }\n }\n\n return evidences;\n}\n\nexport function decideCascadeEscalation(\n currentModel: string | undefined,\n evidences: IFailureEvidence[],\n config?: ICascadeGateConfig,\n attempt = 0\n): ICascadeDecision {\n if (!config?.enabled || !currentModel || evidences.length === 0) {\n return { shouldEscalate: false };\n }\n\n const maxAttempts = config.max_attempts ?? 2;\n if (attempt >= maxAttempts) {\n return { shouldEscalate: false, reasoning: 'Reached max cascade attempts' };\n }\n\n const nextLevel = config.levels?.find((level) => level.from === currentModel);\n if (!nextLevel) {\n return { shouldEscalate: false, reasoning: 'No cascade level configured for current model' };\n }\n\n return {\n shouldEscalate: true,\n nextModel: nextLevel.to,\n reasoning: evidences.map((item) => item.type).join(', '),\n };\n}\n", "/**\n * Semantic Router\n *\n * \u7B2C\u4E00\u9636\u6BB5\u91C7\u7528 prototype \u8BED\u4E49\u5339\u914D\uFF0C\u540E\u7EED\u53EF\u6269\u5C55\u4E3A embedding/classifier\u3002\n */\n\nimport { ISemanticRouterConfig } from './types';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { logError, logWarn } from '../utils/log';\nimport { createSingleUserTextIR } from '../protocols/message-ir';\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\n\nexport interface ISemanticIntentResult {\n intent: string;\n confidence: number;\n matchedPrototype?: string;\n evidence?: string[];\n}\n\nexport interface ISemanticCandidateInput {\n intent: string;\n prototype: string;\n threshold?: number;\n}\n\nfunction normalize(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction tokenize(text: string): string[] {\n const normalized = normalize(text);\n if (!normalized) return [];\n\n const parts = normalized.split(' ').filter(Boolean);\n const chars = normalized\n .replace(/\\s+/g, '')\n .split('')\n .filter(Boolean);\n\n return Array.from(new Set([...parts, ...chars]));\n}\n\nfunction buildVector(tokens: string[]): Map<string, number> {\n const vector = new Map<string, number>();\n for (const token of tokens) {\n vector.set(token, (vector.get(token) ?? 0) + 1);\n }\n return vector;\n}\n\nfunction cosineSimilarity(left: Map<string, number>, right: Map<string, number>): number {\n let dot = 0;\n let leftNorm = 0;\n let rightNorm = 0;\n\n for (const value of left.values()) {\n leftNorm += value * value;\n }\n\n for (const value of right.values()) {\n rightNorm += value * value;\n }\n\n for (const [token, leftValue] of left.entries()) {\n const rightValue = right.get(token) ?? 0;\n dot += leftValue * rightValue;\n }\n\n if (leftNorm === 0 || rightNorm === 0) {\n return 0;\n }\n\n return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));\n}\n\nexport class SemanticRouter {\n private buildClassifierPrompt(text: string, prototypes: Record<string, string>): string {\n const intents = Object.entries(prototypes)\n .map(([intent, description]) => `- ${intent}: ${description}`)\n .join('\\n');\n\n return `You are a semantic intent classifier for an AI model router.\nAnalyze the user request and choose the best matching intent.\n\nUser request:\n\"\"\"\n${text}\n\"\"\"\n\nAvailable intents:\n${intents}\n\nReturn JSON only:\n{\n \"intent\": \"<intent>\",\n \"confidence\": 0.0,\n \"evidence\": [\"keyword\"]\n}`;\n }\n\n private analyzeEmbedding(text: string, config?: ISemanticRouterConfig): ISemanticIntentResult | null {\n if (!config?.enabled || !config.prototypes || Object.keys(config.prototypes).length === 0) {\n return null;\n }\n\n const inputTokens = tokenize(text);\n if (inputTokens.length === 0) {\n return null;\n }\n const inputVector = buildVector(inputTokens);\n\n const threshold = config.threshold ?? 0.85;\n let best: ISemanticIntentResult | null = null;\n\n for (const [intent, prototype] of Object.entries(config.prototypes)) {\n const prototypeTokens = tokenize(prototype);\n if (prototypeTokens.length === 0) continue;\n\n const prototypeVector = buildVector(prototypeTokens);\n const matched = prototypeTokens.filter((token) => inputTokens.includes(token));\n const confidence = cosineSimilarity(inputVector, prototypeVector);\n\n if (!best || confidence > best.confidence) {\n best = {\n intent,\n confidence,\n matchedPrototype: prototype,\n evidence: matched,\n };\n }\n }\n\n if (!best || best.confidence < threshold) {\n return null;\n }\n\n return best;\n }\n\n analyzeCandidates(text: string, candidates: ISemanticCandidateInput[], defaultThreshold = 0.85): ISemanticIntentResult | null {\n const inputTokens = tokenize(text);\n if (inputTokens.length === 0 || !candidates.length) {\n return null;\n }\n\n const inputVector = buildVector(inputTokens);\n let best: ISemanticIntentResult | null = null;\n let bestThreshold = defaultThreshold;\n\n for (const candidate of candidates) {\n const prototypeTokens = tokenize(candidate.prototype);\n if (prototypeTokens.length === 0) {\n continue;\n }\n\n const prototypeVector = buildVector(prototypeTokens);\n const matched = prototypeTokens.filter((token) => inputTokens.includes(token));\n const confidence = cosineSimilarity(inputVector, prototypeVector);\n if (!best || confidence > best.confidence) {\n best = {\n intent: candidate.intent,\n confidence,\n matchedPrototype: candidate.prototype,\n evidence: matched,\n };\n bestThreshold = candidate.threshold ?? defaultThreshold;\n }\n }\n\n if (!best || best.confidence < bestThreshold) {\n return null;\n }\n\n return best;\n }\n\n analyze(text: string, config?: ISemanticRouterConfig): ISemanticIntentResult | null {\n return this.analyzeEmbedding(text, config);\n }\n\n async analyzeWithClassifier(\n text: string,\n config?: ISemanticRouterConfig,\n port: number = DEFAULT_CONFIG.PORT,\n fetchFn?: typeof fetch,\n apiKey?: string,\n timeoutMs?: number\n ): Promise<ISemanticIntentResult | null> {\n if (!config?.enabled || config.mode !== 'classifier' || !config.prototypes || Object.keys(config.prototypes).length === 0) {\n return this.analyzeEmbedding(text, config);\n }\n\n try {\n const fetchImpl = fetchFn || fetch;\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: config.classifier_model,\n max_tokens: 128,\n ir: createSingleUserTextIR(this.buildClassifierPrompt(text, config.prototypes)),\n })\n ),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok) {\n logWarn('[SemanticRouter] Classifier request failed:', response.status);\n return this.analyzeEmbedding(text, config);\n }\n\n const data = await response.json() as any;\n const content = data.content?.[0]?.text || '';\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n logWarn('[SemanticRouter] No JSON found in classifier response');\n return this.analyzeEmbedding(text, config);\n }\n\n const parsed = JSON.parse(match[0]) as ISemanticIntentResult;\n const threshold = config.threshold ?? 0.85;\n if (!parsed.intent || (parsed.confidence ?? 0) < threshold) {\n return null;\n }\n\n return {\n intent: parsed.intent,\n confidence: parsed.confidence,\n evidence: Array.isArray(parsed.evidence) ? parsed.evidence : [],\n };\n } catch (error) {\n logError('[SemanticRouter] Classifier mode failed:', error);\n return this.analyzeEmbedding(text, config);\n }\n }\n}\n\nexport const semanticRouter = new SemanticRouter();\n", "/**\n * Shadow Supervisor\n *\n * \u7B2C\u4E00\u9636\u6BB5\u91C7\u7528\u5F02\u6B65\u5BA1\u8BA1\u601D\u8DEF\uFF0C\u4F46\u5B9E\u73B0\u4E3A\u8BF7\u6C42\u5B8C\u6210\u524D\u7684\u8F7B\u91CF\u672C\u5730\u5BA1\u67E5\u4E0E trace \u8BB0\u5F55\u3002\n */\n\nimport { IShadowSupervisorConfig } from './types';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { IFailureEvidence } from './cascade-gate';\nimport { logError, logWarn } from '../utils/log';\nimport { createSingleUserTextIR } from '../protocols/message-ir';\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\n\nexport interface IShadowAuditResult {\n triggered: boolean;\n riskLevel?: 'low' | 'medium' | 'high';\n findings: string[];\n}\n\nconst SHADOW_VERIFIER_PROMPT = `You are a response quality auditor.\nInspect the assistant output and decide whether it is low quality, incomplete, placeholder-heavy, or suspiciously weak.\n\nResponse:\n\"\"\"\n{response}\n\"\"\"\n\nReturn JSON only:\n{\n \"triggered\": true,\n \"riskLevel\": \"low|medium|high\",\n \"findings\": [\"short_reason\"]\n}\n\nIf no issue is found, return:\n{\n \"triggered\": false,\n \"findings\": []\n}`;\n\nfunction extractText(payload: any): string {\n if (!payload) return '';\n if (typeof payload === 'string') return payload;\n if (typeof payload?.content?.[0]?.text === 'string') return payload.content[0].text;\n if (typeof payload?.error?.message === 'string') return payload.error.message;\n return '';\n}\n\nexport class ShadowSupervisor {\n private buildVerifierPrompt(text: string): string {\n return SHADOW_VERIFIER_PROMPT.replace('{response}', text);\n }\n\n inspect(payload: any, config?: IShadowSupervisorConfig): IShadowAuditResult {\n if (!config?.enabled) {\n return { triggered: false, findings: [] };\n }\n\n const text = extractText(payload).trim();\n const findings: string[] = [];\n\n if (!text) {\n findings.push('empty_output');\n }\n\n if (config.checks?.placeholder_patterns) {\n if (/TODO|placeholder|\\.\\.\\.rest of code/i.test(text)) {\n findings.push('placeholder_pattern');\n }\n }\n\n if (config.checks?.length_anomaly && text && text.length < 30) {\n findings.push('length_anomaly');\n }\n\n if (config.checks?.missing_code_block && /```/.test(text) === false && /function|class|const|let|var/i.test(text)) {\n findings.push('missing_code_block');\n }\n\n if (findings.length === 0) {\n return { triggered: false, findings: [] };\n }\n\n const riskLevel =\n findings.includes('placeholder_pattern') || findings.includes('empty_output')\n ? 'high'\n : findings.length > 1\n ? 'medium'\n : 'low';\n\n return {\n triggered: true,\n riskLevel,\n findings,\n };\n }\n\n toFailureEvidence(audit: IShadowAuditResult): IFailureEvidence[] {\n if (!audit.triggered) {\n return [];\n }\n\n return audit.findings.map((finding) => {\n switch (finding) {\n case 'empty_output':\n return { type: 'empty_response', detail: 'Shadow supervisor detected empty output' };\n case 'length_anomaly':\n return { type: 'short_response', detail: 'Shadow supervisor detected length anomaly' };\n case 'placeholder_pattern':\n return { type: 'placeholder_pattern', detail: 'Shadow supervisor detected placeholder pattern' };\n default:\n return { type: 'quality_risk', detail: `Shadow supervisor detected ${finding}` };\n }\n });\n }\n\n async inspectWithVerifier(\n payload: any,\n config: IShadowSupervisorConfig,\n port: number = DEFAULT_CONFIG.PORT,\n fetchFn?: typeof fetch,\n apiKey?: string,\n timeoutMs?: number\n ): Promise<IShadowAuditResult> {\n const text = extractText(payload).trim();\n if (!config.enabled || !config.verifier_model || !text) {\n return this.inspect(payload, config);\n }\n\n try {\n const fetchImpl = fetchFn || fetch;\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: config.verifier_model,\n max_tokens: 128,\n ir: createSingleUserTextIR(this.buildVerifierPrompt(text)),\n })\n ),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\n\n if (!response.ok) {\n logWarn('[ShadowSupervisor] Verifier request failed:', response.status);\n return this.inspect(payload, config);\n }\n\n const data = await response.json() as any;\n const content = data.content?.[0]?.text || '';\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n logWarn('[ShadowSupervisor] No JSON found in verifier response');\n return this.inspect(payload, config);\n }\n\n const parsed = JSON.parse(match[0]) as IShadowAuditResult;\n return {\n triggered: Boolean(parsed.triggered),\n riskLevel: parsed.riskLevel,\n findings: Array.isArray(parsed.findings) ? parsed.findings : [],\n };\n } catch (error) {\n logError('[ShadowSupervisor] Verifier audit failed:', error);\n return this.inspect(payload, config);\n }\n }\n}\n\nexport const shadowSupervisor = new ShadowSupervisor();\n", "/**\n * Response Governance\n *\n * \u62BD\u53D6\u975E\u6D41\u5F0F\u54CD\u5E94\u7684\u6CBB\u7406\u94FE\uFF0C\u4FBF\u4E8E\u5728\u4E3B\u94FE\u590D\u7528\u5E76\u505A\u7EC4\u5408\u573A\u666F\u6D4B\u8BD5\u3002\n */\n\nimport { IAppConfig, IRequestContext } from '../trigger/types';\nimport { appendTraceReason, finalizeTrace, recordGovernanceTrace } from './trace';\nimport { createTaskFingerprint, sessionStateStore } from './session-store';\nimport { decideCascadeEscalation, detectFailureEvidence, executeCascadeRetry } from './cascade-gate';\nimport { shadowSupervisor } from './shadow-supervisor';\nimport { resolveModelReference } from '../models/compile';\n\nexport interface IResponseGovernanceDeps {\n decideCascadeEscalation?: typeof decideCascadeEscalation;\n detectFailureEvidence?: typeof detectFailureEvidence;\n executeCascadeRetry?: typeof executeCascadeRetry;\n}\n\nexport interface IApplyResponseGovernanceInput {\n req: IRequestContext & Record<string, any>;\n payload: any;\n config: IAppConfig;\n servicePort: number;\n deps?: IResponseGovernanceDeps;\n}\n\nexport async function applyResponseGovernance({\n req,\n payload,\n config,\n servicePort,\n deps,\n}: IApplyResponseGovernanceInput): Promise<any> {\n let nextPayload = payload;\n const effectiveStickyConfig = config.SmartRouter?.sticky\n ? {\n ...(config.Governance?.sticky ?? {}),\n ...config.SmartRouter.sticky,\n }\n : config.Governance?.sticky;\n const resolvedCascadeConfig = config.Governance?.cascade\n ? {\n ...config.Governance.cascade,\n levels: config.Governance.cascade.levels?.map((level) => ({\n ...level,\n from: resolveModelReference(config, level.from) ?? level.from,\n to: resolveModelReference(config, level.to) ?? level.to,\n })),\n }\n : undefined;\n const resolvedShadowConfig = config.Governance?.shadow\n ? {\n ...config.Governance.shadow,\n verifier_model: resolveModelReference(config, config.Governance.shadow.verifier_model) ?? config.Governance.shadow.verifier_model,\n }\n : undefined;\n const detectFailureEvidenceFn = deps?.detectFailureEvidence ?? detectFailureEvidence;\n const decideCascadeEscalationFn = deps?.decideCascadeEscalation ?? decideCascadeEscalation;\n const executeCascadeRetryFn = deps?.executeCascadeRetry ?? executeCascadeRetry;\n\n if (\n config.Governance?.enabled &&\n resolvedCascadeConfig?.enabled &&\n req.governanceTrace\n ) {\n const evidences = detectFailureEvidenceFn(nextPayload, resolvedCascadeConfig);\n if (evidences.length > 0) {\n const cascadeAttempt = Number(req.body?.metadata?.ctr_cascade_attempt ?? 0);\n const decision = decideCascadeEscalationFn(\n req.body?.model,\n evidences,\n resolvedCascadeConfig,\n cascadeAttempt\n );\n req.governanceTrace.cascadeEvidence = evidences.map((item) => item.type);\n if (decision.shouldEscalate) {\n req.governanceTrace.cascadeTriggered = true;\n req.governanceTrace.cascadeNextModel = decision.nextModel;\n appendTraceReason(req.governanceTrace, 'cascade_gate');\n\n if (decision.nextModel) {\n const retriedPayload = await executeCascadeRetryFn(\n req.body,\n decision.nextModel,\n servicePort,\n config.APIKEY,\n config.API_TIMEOUT_MS\n );\n\n if (retriedPayload) {\n req.body.model = decision.nextModel;\n appendTraceReason(req.governanceTrace, 'cascade_retry_executed');\n nextPayload = retriedPayload;\n }\n }\n }\n }\n }\n\n if (effectiveStickyConfig?.enabled && req.sessionId && req.body?.model) {\n const fingerprint = createTaskFingerprint(req.triggerResult?.analyzedText);\n if (fingerprint) {\n sessionStateStore.put(req.sessionId, {\n preferredModel: req.body.model,\n lastSuccessfulModel: req.body.model,\n lastTaskFingerprint: fingerprint,\n });\n }\n }\n\n if (\n config.Governance?.enabled &&\n resolvedShadowConfig?.enabled &&\n req.governanceTrace\n ) {\n const audit = resolvedShadowConfig.verifier_model\n ? await shadowSupervisor.inspectWithVerifier(\n nextPayload,\n resolvedShadowConfig,\n servicePort,\n undefined,\n config.APIKEY,\n config.API_TIMEOUT_MS\n )\n : shadowSupervisor.inspect(nextPayload, resolvedShadowConfig);\n if (audit.triggered) {\n req.governanceTrace.shadowChecked = true;\n req.governanceTrace.verificationResult = `${audit.riskLevel}:${audit.findings.join(',')}`;\n appendTraceReason(req.governanceTrace, 'shadow_supervisor');\n\n if (\n resolvedShadowConfig.mode === 'sync_guard' &&\n resolvedCascadeConfig?.enabled &&\n audit.riskLevel !== 'low'\n ) {\n const guardAttempt = Number(req.body?.metadata?.ctr_cascade_attempt ?? 0);\n const guardDecision = decideCascadeEscalationFn(\n req.body?.model,\n shadowSupervisor.toFailureEvidence(audit),\n resolvedCascadeConfig,\n guardAttempt\n );\n\n if (guardDecision.shouldEscalate && guardDecision.nextModel) {\n const guardedPayload = await executeCascadeRetryFn(\n req.body,\n guardDecision.nextModel,\n servicePort,\n config.APIKEY,\n config.API_TIMEOUT_MS\n );\n\n if (guardedPayload) {\n req.body.model = guardDecision.nextModel;\n req.governanceTrace.verificationResult =\n `${audit.riskLevel}:${audit.findings.join(',')}|guard_retry:${guardDecision.nextModel}`;\n appendTraceReason(req.governanceTrace, 'shadow_sync_guard');\n nextPayload = guardedPayload;\n }\n }\n }\n }\n }\n\n if (req.governanceTrace) {\n req.governanceTrace = finalizeTrace(req.governanceTrace, {\n finalModel: req.body?.model ?? req.governanceTrace.finalModel,\n });\n recordGovernanceTrace(req.governanceTrace);\n }\n\n return nextPayload;\n}\n", "/**\n * Cache Utilities\n *\n * \u7F13\u5B58\u5DE5\u5177\n */\n\nimport { LRUCache } from 'lru-cache';\n\n/**\n * \u4F7F\u7528\u91CF\u6570\u636E\n */\nexport interface Usage {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\n/**\n * \u4F1A\u8BDD\u4F7F\u7528\u91CF\u7F13\u5B58\n */\nclass SessionUsageCache {\n private cache: LRUCache<string, Usage>;\n\n constructor() {\n this.cache = new LRUCache({\n max: 1000,\n ttl: 1000 * 60 * 60, // 1 \u5C0F\u65F6\n });\n }\n\n /**\n * \u5B58\u50A8\u4F7F\u7528\u91CF\n */\n put(sessionId: string | undefined, usage: Usage | undefined): void {\n if (!sessionId || !usage) return;\n this.cache.set(sessionId, usage);\n }\n\n /**\n * \u83B7\u53D6\u4F7F\u7528\u91CF\n */\n get(sessionId: string | undefined): Usage | undefined {\n if (!sessionId) return undefined;\n return this.cache.get(sessionId);\n }\n\n /**\n * \u6E05\u9664\u7F13\u5B58\n */\n clear(): void {\n this.cache.clear();\n }\n}\n\nexport const sessionUsageCache = new SessionUsageCache();\n", "/**\n * SSE Parser Transform\n *\n * Server-Sent Events \u89E3\u6790\u8F6C\u6362\u6D41\n */\n\nexport class SSEParserTransform {\n private buffer: string = \"\";\n\n constructor() {\n const transformStream = new TransformStream({\n start: (controller) => {\n // Initialization if needed\n },\n transform: (chunk: Uint8Array, controller) => {\n const text = new TextDecoder().decode(chunk);\n this.buffer += text;\n\n this.parseBuffer(controller);\n },\n flush: (controller) => {\n if (this.buffer.trim()) {\n this.parseBuffer(controller);\n }\n },\n });\n\n // Copy readable and writable to this instance\n this.readable = transformStream.readable;\n this.writable = transformStream.writable;\n }\n\n readable: ReadableStream<any>;\n writable: WritableStream<any>;\n\n private parseBuffer(controller: TransformStreamDefaultController<any>) {\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() || \"\";\n\n let currentEvent: any = {};\n\n for (const line of lines) {\n if (line.startsWith(\"event:\")) {\n currentEvent.event = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n const dataStr = line.slice(5).trim();\n try {\n currentEvent.data = JSON.parse(dataStr);\n } catch {\n currentEvent.data = dataStr;\n }\n } else if (line === \"\" && Object.keys(currentEvent).length > 0) {\n controller.enqueue(currentEvent);\n currentEvent = {};\n }\n }\n }\n}\n", "/**\n * Stream Response Governance\n *\n * \u5904\u7406\u6D41\u5F0F\u54CD\u5E94\u4E0B\u7684\u6CBB\u7406\u903B\u8F91\uFF0C\u91CD\u70B9\u652F\u6301 cascade \u7684 stream_guard\u3002\n */\n\nimport { IAppConfig, IRequestContext } from '../trigger/types';\nimport { sessionUsageCache } from '../router/cache';\nimport { SSEParserTransform } from '../utils/SSEParser.transform';\nimport { appendTraceReason, finalizeTrace, recordGovernanceTrace } from './trace';\nimport { decideCascadeEscalation, detectFailureEvidence, executeCascadeRetryStream } from './cascade-gate';\nimport { resolveModelReference } from '../models/compile';\n\ninterface ICollectedSSE {\n events: any[];\n text: string;\n usage?: any;\n sawText: boolean;\n}\n\nexport interface IStreamGovernanceDeps {\n executeCascadeRetryStream?: typeof executeCascadeRetryStream;\n detectFailureEvidence?: typeof detectFailureEvidence;\n decideCascadeEscalation?: typeof decideCascadeEscalation;\n}\n\nfunction serializeEvent(event: any): Uint8Array {\n let output = '';\n if (event.event) {\n output += `event: ${event.event}\\n`;\n }\n if (event.data !== undefined) {\n output += `data: ${typeof event.data === 'string' ? event.data : JSON.stringify(event.data)}\\n`;\n }\n output += '\\n';\n return new TextEncoder().encode(output);\n}\n\nasync function collectSSE(stream: ReadableStream<Uint8Array>): Promise<ICollectedSSE> {\n const parser = new SSEParserTransform();\n const parsedStream = stream.pipeThrough(parser as any);\n const reader = parsedStream.getReader();\n const events: any[] = [];\n let text = '';\n let usage: any;\n let sawText = false;\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n events.push(value);\n\n const deltaText = value?.data?.delta?.text;\n if (typeof deltaText === 'string') {\n sawText = true;\n text += deltaText;\n }\n\n if (value?.event === 'message_delta' && value?.data?.usage) {\n usage = value.data.usage;\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return { events, text, usage, sawText };\n}\n\nexport function governStreamingResponse(\n stream: ReadableStream<Uint8Array>,\n req: IRequestContext & Record<string, any>,\n config: IAppConfig,\n servicePort: number,\n deps?: IStreamGovernanceDeps\n): ReadableStream<Uint8Array> {\n const executeCascadeRetryStreamFn = deps?.executeCascadeRetryStream ?? executeCascadeRetryStream;\n const detectFailureEvidenceFn = deps?.detectFailureEvidence ?? detectFailureEvidence;\n const decideCascadeEscalationFn = deps?.decideCascadeEscalation ?? decideCascadeEscalation;\n const resolvedCascadeConfig = config.Governance?.cascade\n ? {\n ...config.Governance.cascade,\n levels: config.Governance.cascade.levels?.map((level) => ({\n ...level,\n from: resolveModelReference(config, level.from) ?? level.from,\n to: resolveModelReference(config, level.to) ?? level.to,\n })),\n }\n : undefined;\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n const original = await collectSSE(stream);\n let selected = original;\n\n if (\n config.Governance?.enabled &&\n resolvedCascadeConfig?.enabled &&\n resolvedCascadeConfig.stream_guard &&\n req.governanceTrace &&\n original.sawText\n ) {\n const evidences = detectFailureEvidenceFn(\n { content: [{ text: original.text }] },\n resolvedCascadeConfig\n );\n\n if (evidences.length > 0) {\n const cascadeAttempt = Number(req.body?.metadata?.ctr_cascade_attempt ?? 0);\n const decision = decideCascadeEscalationFn(\n req.body?.model,\n evidences,\n resolvedCascadeConfig,\n cascadeAttempt\n );\n req.governanceTrace.cascadeEvidence = evidences.map((item) => item.type);\n\n if (decision.shouldEscalate && decision.nextModel) {\n req.governanceTrace.cascadeTriggered = true;\n req.governanceTrace.cascadeNextModel = decision.nextModel;\n appendTraceReason(req.governanceTrace, 'cascade_gate_stream');\n\n const retryStream = await executeCascadeRetryStreamFn(\n req.body,\n decision.nextModel,\n servicePort,\n config.APIKEY,\n config.API_TIMEOUT_MS\n );\n\n if (retryStream) {\n selected = await collectSSE(retryStream);\n req.body.model = decision.nextModel;\n appendTraceReason(req.governanceTrace, 'cascade_stream_retry_executed');\n }\n }\n }\n }\n\n for (const event of selected.events) {\n controller.enqueue(serializeEvent(event));\n }\n controller.close();\n\n if (req.sessionId && selected.usage) {\n sessionUsageCache.put(req.sessionId, selected.usage);\n }\n\n if (req.governanceTrace) {\n req.governanceTrace = finalizeTrace(req.governanceTrace, {\n finalModel: req.body?.model ?? req.governanceTrace.finalModel,\n });\n recordGovernanceTrace(req.governanceTrace);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n });\n}\n", "import { IGovernanceTrace } from './types';\nimport { governanceTraceStore } from './trace';\n\nexport interface IGovernanceMetricsFilters {\n requestId?: string;\n sessionKey?: string;\n routeReason?: string;\n cascadeTriggered?: boolean;\n shadowChecked?: boolean;\n limit?: number;\n}\n\nexport interface IGovernanceMetricsWindowOptions extends IGovernanceMetricsFilters {\n windowMs?: number;\n bucketCount?: number;\n now?: number;\n anomalyThresholds?: Partial<IGovernanceAnomalyThresholds>;\n}\n\nexport interface IGovernanceMetricsBucket {\n bucketStart: number;\n bucketEnd: number;\n label: string;\n metrics: IGovernanceMetrics;\n}\n\nexport interface IGovernanceDistributionEntry {\n key: string;\n count: number;\n rate: number;\n}\n\nexport interface IGovernanceAnomaly {\n type: string;\n severity: 'info' | 'warn' | 'critical';\n message: string;\n metric: string;\n value: number;\n threshold?: number;\n}\n\nexport interface IGovernanceAnomalyThresholds {\n minSampleSize: number;\n cascadeWarnRate: number;\n cascadeCriticalRate: number;\n shadowWarnRate: number;\n shadowCriticalRate: number;\n latencyWarnMs: number;\n latencyCriticalMs: number;\n spikeWarnRate: number;\n spikeDeltaRate: number;\n}\n\nexport interface IGovernanceMetrics {\n totalTraces: number;\n stickyHitCount: number;\n stickyHitRate: number;\n alignmentUsedCount: number;\n alignmentUsedRate: number;\n cascadeTriggeredCount: number;\n cascadeTriggeredRate: number;\n shadowCheckedCount: number;\n shadowCheckedRate: number;\n averageLatencyMs: number;\n averageEstimatedCost: number;\n routeReasonDistribution: Record<string, number>;\n finalModelDistribution: Record<string, number>;\n semanticIntentDistribution: Record<string, number>;\n}\n\nexport interface IGovernanceMetricsReport {\n windowMs?: number;\n bucketCount: number;\n windowStart?: number;\n windowEnd?: number;\n metrics: IGovernanceMetrics;\n buckets: IGovernanceMetricsBucket[];\n topRouteReasons: IGovernanceDistributionEntry[];\n topFinalModels: IGovernanceDistributionEntry[];\n topSemanticIntents: IGovernanceDistributionEntry[];\n anomalies: IGovernanceAnomaly[];\n}\n\nexport type TGovernanceMetricsExportFormat = 'json' | 'csv';\n\nconst DEFAULT_ANOMALY_THRESHOLDS: IGovernanceAnomalyThresholds = {\n minSampleSize: 3,\n cascadeWarnRate: 0.4,\n cascadeCriticalRate: 0.6,\n shadowWarnRate: 0.5,\n shadowCriticalRate: 0.7,\n latencyWarnMs: 1500,\n latencyCriticalMs: 3000,\n spikeWarnRate: 0.5,\n spikeDeltaRate: 0.3,\n};\n\nfunction normalizeAnomalyThresholds(\n input?: Partial<IGovernanceAnomalyThresholds>\n): IGovernanceAnomalyThresholds {\n return {\n minSampleSize: input?.minSampleSize ?? DEFAULT_ANOMALY_THRESHOLDS.minSampleSize,\n cascadeWarnRate: input?.cascadeWarnRate ?? DEFAULT_ANOMALY_THRESHOLDS.cascadeWarnRate,\n cascadeCriticalRate: input?.cascadeCriticalRate ?? DEFAULT_ANOMALY_THRESHOLDS.cascadeCriticalRate,\n shadowWarnRate: input?.shadowWarnRate ?? DEFAULT_ANOMALY_THRESHOLDS.shadowWarnRate,\n shadowCriticalRate: input?.shadowCriticalRate ?? DEFAULT_ANOMALY_THRESHOLDS.shadowCriticalRate,\n latencyWarnMs: input?.latencyWarnMs ?? DEFAULT_ANOMALY_THRESHOLDS.latencyWarnMs,\n latencyCriticalMs: input?.latencyCriticalMs ?? DEFAULT_ANOMALY_THRESHOLDS.latencyCriticalMs,\n spikeWarnRate: input?.spikeWarnRate ?? DEFAULT_ANOMALY_THRESHOLDS.spikeWarnRate,\n spikeDeltaRate: input?.spikeDeltaRate ?? DEFAULT_ANOMALY_THRESHOLDS.spikeDeltaRate,\n };\n}\n\nfunction rate(count: number, total: number): number {\n if (!total) {\n return 0;\n }\n\n return Number((count / total).toFixed(4));\n}\n\nfunction average(values: number[]): number {\n if (!values.length) {\n return 0;\n }\n\n const total = values.reduce((sum, value) => sum + value, 0);\n return Number((total / values.length).toFixed(2));\n}\n\nfunction increment(distribution: Record<string, number>, key?: string): void {\n if (!key) {\n return;\n }\n\n distribution[key] = (distribution[key] ?? 0) + 1;\n}\n\nfunction buildTopEntries(\n distribution: Record<string, number>,\n total: number,\n limit = 5\n): IGovernanceDistributionEntry[] {\n return Object.entries(distribution)\n .sort((left, right) => {\n if (right[1] !== left[1]) {\n return right[1] - left[1];\n }\n return left[0].localeCompare(right[0]);\n })\n .slice(0, limit)\n .map(([key, count]) => ({\n key,\n count,\n rate: rate(count, total),\n }));\n}\n\nfunction averageRate(values: number[]): number {\n if (!values.length) {\n return 0;\n }\n\n return Number((values.reduce((sum, value) => sum + value, 0) / values.length).toFixed(4));\n}\n\nfunction buildAnomalies(\n metrics: IGovernanceMetrics,\n buckets: IGovernanceMetricsBucket[],\n thresholds: IGovernanceAnomalyThresholds\n): IGovernanceAnomaly[] {\n const anomalies: IGovernanceAnomaly[] = [];\n\n if (metrics.totalTraces >= thresholds.minSampleSize && metrics.cascadeTriggeredRate >= thresholds.cascadeWarnRate) {\n anomalies.push({\n type: 'cascade_rate_high',\n severity: metrics.cascadeTriggeredRate >= thresholds.cascadeCriticalRate ? 'critical' : 'warn',\n message: `Cascade trigger rate is elevated at ${(metrics.cascadeTriggeredRate * 100).toFixed(1)}%`,\n metric: 'cascadeTriggeredRate',\n value: metrics.cascadeTriggeredRate,\n threshold: thresholds.cascadeWarnRate,\n });\n }\n\n if (metrics.totalTraces >= thresholds.minSampleSize && metrics.shadowCheckedRate >= thresholds.shadowWarnRate) {\n anomalies.push({\n type: 'shadow_rate_high',\n severity: metrics.shadowCheckedRate >= thresholds.shadowCriticalRate ? 'critical' : 'warn',\n message: `Shadow supervision rate is elevated at ${(metrics.shadowCheckedRate * 100).toFixed(1)}%`,\n metric: 'shadowCheckedRate',\n value: metrics.shadowCheckedRate,\n threshold: thresholds.shadowWarnRate,\n });\n }\n\n if (metrics.totalTraces >= thresholds.minSampleSize && metrics.averageLatencyMs >= thresholds.latencyWarnMs) {\n anomalies.push({\n type: 'latency_high',\n severity: metrics.averageLatencyMs >= thresholds.latencyCriticalMs ? 'critical' : 'warn',\n message: `Average latency is elevated at ${metrics.averageLatencyMs.toFixed(0)} ms`,\n metric: 'averageLatencyMs',\n value: metrics.averageLatencyMs,\n threshold: thresholds.latencyWarnMs,\n });\n }\n\n if (buckets.length >= 2) {\n const latestBucket = buckets[buckets.length - 1];\n const previousBuckets = buckets.slice(0, -1).filter((bucket) => bucket.metrics.totalTraces > 0);\n if (latestBucket.metrics.totalTraces > 0 && previousBuckets.length > 0) {\n const previousCascadeAverage = averageRate(\n previousBuckets.map((bucket) => bucket.metrics.cascadeTriggeredRate)\n );\n if (latestBucket.metrics.cascadeTriggeredRate >= thresholds.spikeWarnRate &&\n latestBucket.metrics.cascadeTriggeredRate >= previousCascadeAverage + thresholds.spikeDeltaRate) {\n anomalies.push({\n type: 'cascade_spike',\n severity: 'warn',\n message: `Latest bucket cascade rate spiked to ${(latestBucket.metrics.cascadeTriggeredRate * 100).toFixed(1)}%`,\n metric: 'cascadeTriggeredRate',\n value: latestBucket.metrics.cascadeTriggeredRate,\n threshold: previousCascadeAverage,\n });\n }\n\n const previousShadowAverage = averageRate(\n previousBuckets.map((bucket) => bucket.metrics.shadowCheckedRate)\n );\n if (latestBucket.metrics.shadowCheckedRate >= thresholds.spikeWarnRate &&\n latestBucket.metrics.shadowCheckedRate >= previousShadowAverage + thresholds.spikeDeltaRate) {\n anomalies.push({\n type: 'shadow_spike',\n severity: 'warn',\n message: `Latest bucket shadow rate spiked to ${(latestBucket.metrics.shadowCheckedRate * 100).toFixed(1)}%`,\n metric: 'shadowCheckedRate',\n value: latestBucket.metrics.shadowCheckedRate,\n threshold: previousShadowAverage,\n });\n }\n }\n }\n\n return anomalies;\n}\n\nexport function summarizeGovernanceMetrics(traces: IGovernanceTrace[]): IGovernanceMetrics {\n const stickyHitCount = traces.filter((trace) => trace.stickyHit).length;\n const alignmentUsedCount = traces.filter((trace) => trace.alignmentUsed).length;\n const cascadeTriggeredCount = traces.filter((trace) => trace.cascadeTriggered).length;\n const shadowCheckedCount = traces.filter((trace) => trace.shadowChecked).length;\n const latencyValues = traces\n .map((trace) => trace.latencyMs)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n const estimatedCostValues = traces\n .map((trace) => trace.estimatedCost)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n\n const routeReasonDistribution: Record<string, number> = {};\n const finalModelDistribution: Record<string, number> = {};\n const semanticIntentDistribution: Record<string, number> = {};\n\n for (const trace of traces) {\n for (const reason of trace.routeReason) {\n increment(routeReasonDistribution, reason);\n }\n increment(finalModelDistribution, trace.finalModel);\n increment(semanticIntentDistribution, trace.semanticIntent);\n }\n\n return {\n totalTraces: traces.length,\n stickyHitCount,\n stickyHitRate: rate(stickyHitCount, traces.length),\n alignmentUsedCount,\n alignmentUsedRate: rate(alignmentUsedCount, traces.length),\n cascadeTriggeredCount,\n cascadeTriggeredRate: rate(cascadeTriggeredCount, traces.length),\n shadowCheckedCount,\n shadowCheckedRate: rate(shadowCheckedCount, traces.length),\n averageLatencyMs: average(latencyValues),\n averageEstimatedCost: average(estimatedCostValues),\n routeReasonDistribution,\n finalModelDistribution,\n semanticIntentDistribution,\n };\n}\n\nfunction buildBucketLabel(bucketStart: number, bucketEnd: number): string {\n return `${new Date(bucketStart).toISOString()}~${new Date(bucketEnd).toISOString()}`;\n}\n\nfunction filterTracesByWindow(\n traces: IGovernanceTrace[],\n options: IGovernanceMetricsWindowOptions\n): { traces: IGovernanceTrace[]; windowStart?: number; windowEnd?: number } {\n if (!options.windowMs || options.windowMs <= 0) {\n return {\n traces,\n windowStart: traces.length ? Math.min(...traces.map((trace) => trace.startedAt)) : undefined,\n windowEnd: traces.length ? Math.max(...traces.map((trace) => trace.startedAt)) : undefined,\n };\n }\n\n const now = options.now ?? Date.now();\n const windowStart = now - options.windowMs;\n return {\n traces: traces.filter((trace) => trace.startedAt >= windowStart && trace.startedAt <= now),\n windowStart,\n windowEnd: now,\n };\n}\n\nfunction buildBuckets(\n traces: IGovernanceTrace[],\n windowStart: number | undefined,\n windowEnd: number | undefined,\n bucketCount: number\n): IGovernanceMetricsBucket[] {\n if (\n windowStart === undefined ||\n windowEnd === undefined ||\n bucketCount <= 0 ||\n windowEnd <= windowStart\n ) {\n return [];\n }\n\n const bucketSize = Math.max(1, Math.ceil((windowEnd - windowStart) / bucketCount));\n const buckets: IGovernanceMetricsBucket[] = [];\n\n for (let index = 0; index < bucketCount; index += 1) {\n const bucketStart = windowStart + (index * bucketSize);\n const bucketEnd = index === bucketCount - 1\n ? windowEnd\n : Math.min(windowEnd, bucketStart + bucketSize);\n const bucketTraces = traces.filter((trace) => {\n if (index === bucketCount - 1) {\n return trace.startedAt >= bucketStart && trace.startedAt <= bucketEnd;\n }\n return trace.startedAt >= bucketStart && trace.startedAt < bucketEnd;\n });\n\n buckets.push({\n bucketStart,\n bucketEnd,\n label: buildBucketLabel(bucketStart, bucketEnd),\n metrics: summarizeGovernanceMetrics(bucketTraces),\n });\n }\n\n return buckets;\n}\n\nexport function getGovernanceMetricsReport(\n options: IGovernanceMetricsWindowOptions = {}\n): IGovernanceMetricsReport {\n const baseTraces = governanceTraceStore.list({\n requestId: options.requestId,\n sessionKey: options.sessionKey,\n routeReason: options.routeReason,\n cascadeTriggered: options.cascadeTriggered,\n shadowChecked: options.shadowChecked,\n });\n const windowed = filterTracesByWindow(baseTraces, options);\n const limitedTraces = options.limit && options.limit > 0\n ? windowed.traces.slice(0, options.limit)\n : windowed.traces;\n const bucketCount = options.bucketCount && options.bucketCount > 0 ? options.bucketCount : 6;\n const metrics = summarizeGovernanceMetrics(limitedTraces);\n const buckets = buildBuckets(limitedTraces, windowed.windowStart, windowed.windowEnd, bucketCount);\n const thresholds = normalizeAnomalyThresholds(options.anomalyThresholds);\n\n return {\n windowMs: options.windowMs,\n bucketCount,\n windowStart: windowed.windowStart,\n windowEnd: windowed.windowEnd,\n metrics,\n buckets,\n topRouteReasons: buildTopEntries(metrics.routeReasonDistribution, limitedTraces.length),\n topFinalModels: buildTopEntries(metrics.finalModelDistribution, limitedTraces.length),\n topSemanticIntents: buildTopEntries(metrics.semanticIntentDistribution, limitedTraces.length),\n anomalies: buildAnomalies(metrics, buckets, thresholds),\n };\n}\n\nexport function getGovernanceMetrics(\n options: IGovernanceMetricsWindowOptions = {}\n): IGovernanceMetrics {\n return getGovernanceMetricsReport(options).metrics;\n}\n\nexport function exportGovernanceMetricsReport(\n report: IGovernanceMetricsReport,\n format: TGovernanceMetricsExportFormat = 'json'\n): string {\n if (format === 'json') {\n return JSON.stringify(report, null, 2);\n }\n\n const lines: string[] = [\n 'section,key,value',\n `summary,totalTraces,${report.metrics.totalTraces}`,\n `summary,stickyHitRate,${report.metrics.stickyHitRate}`,\n `summary,cascadeTriggeredRate,${report.metrics.cascadeTriggeredRate}`,\n `summary,shadowCheckedRate,${report.metrics.shadowCheckedRate}`,\n `summary,alignmentUsedRate,${report.metrics.alignmentUsedRate}`,\n `summary,averageLatencyMs,${report.metrics.averageLatencyMs}`,\n `summary,averageEstimatedCost,${report.metrics.averageEstimatedCost}`,\n ];\n\n for (const anomaly of report.anomalies) {\n lines.push(`anomaly,${anomaly.type},${anomaly.severity}:${anomaly.value}`);\n }\n\n for (const item of report.topRouteReasons) {\n lines.push(`topRouteReason,${item.key},${item.count}:${item.rate}`);\n }\n\n for (const item of report.topFinalModels) {\n lines.push(`topFinalModel,${item.key},${item.count}:${item.rate}`);\n }\n\n for (const item of report.topSemanticIntents) {\n lines.push(`topSemanticIntent,${item.key},${item.count}:${item.rate}`);\n }\n\n for (const bucket of report.buckets) {\n lines.push(\n `bucket,${bucket.label},${[\n bucket.metrics.totalTraces,\n bucket.metrics.stickyHitRate,\n bucket.metrics.cascadeTriggeredRate,\n bucket.metrics.shadowCheckedRate,\n bucket.metrics.alignmentUsedRate,\n ].join(':')}`\n );\n }\n\n return lines.join('\\n');\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport {\n GOVERNANCE_EXPORT_HISTORY_FILE,\n GOVERNANCE_SCHEDULE_FILE,\n GOVERNANCE_SNAPSHOT_DIR,\n} from '../constants';\nimport {\n exportGovernanceMetricsReport,\n getGovernanceMetricsReport,\n IGovernanceMetricsReport,\n IGovernanceMetricsWindowOptions,\n TGovernanceMetricsExportFormat,\n} from './metrics';\n\nexport interface IGovernanceMetricsExportRecord {\n id: string;\n createdAt: number;\n format: TGovernanceMetricsExportFormat;\n kind: 'manual' | 'scheduled';\n filePath: string;\n windowMs?: number;\n bucketCount: number;\n}\n\nexport interface IGovernanceSnapshotSchedule {\n id: string;\n intervalMs: number;\n format: TGovernanceMetricsExportFormat;\n enabled: boolean;\n createdAt: number;\n lastRunAt?: number;\n options: IGovernanceMetricsWindowOptions;\n}\n\ninterface IGovernanceMetricsExportStoreOptions {\n historyFile?: string;\n snapshotDir?: string;\n scheduleFile?: string;\n persistEnabled?: boolean;\n retainHistory?: number;\n}\n\nexport class GovernanceMetricsExportStore {\n private historyFile: string;\n private snapshotDir: string;\n private scheduleFile: string;\n private persistEnabled: boolean;\n private retainHistory: number;\n private history: IGovernanceMetricsExportRecord[] = [];\n private schedules = new Map<string, { meta: IGovernanceSnapshotSchedule; timer?: NodeJS.Timeout }>();\n\n constructor(options: IGovernanceMetricsExportStoreOptions = {}) {\n this.historyFile = options.historyFile ?? GOVERNANCE_EXPORT_HISTORY_FILE;\n this.snapshotDir = options.snapshotDir ?? GOVERNANCE_SNAPSHOT_DIR;\n this.scheduleFile = options.scheduleFile ?? GOVERNANCE_SCHEDULE_FILE;\n this.persistEnabled = options.persistEnabled ?? process.env.NODE_ENV !== 'test';\n this.retainHistory = options.retainHistory ?? 50;\n this.loadHistory();\n this.loadSchedules();\n }\n\n listHistory(): IGovernanceMetricsExportRecord[] {\n return [...this.history];\n }\n\n listSchedules(): IGovernanceSnapshotSchedule[] {\n return Array.from(this.schedules.values())\n .map((item) => ({ ...item.meta }))\n .sort((left, right) => right.createdAt - left.createdAt);\n }\n\n createSnapshot(\n options: IGovernanceMetricsWindowOptions = {},\n format: TGovernanceMetricsExportFormat = 'json',\n kind: 'manual' | 'scheduled' = 'manual'\n ): { record: IGovernanceMetricsExportRecord; report: IGovernanceMetricsReport; content: string } {\n const report = getGovernanceMetricsReport(options);\n const content = exportGovernanceMetricsReport(report, format);\n const timestamp = Date.now();\n const id = `export-${timestamp}-${Math.random().toString(16).slice(2, 8)}`;\n const filePath = join(this.snapshotDir, `${id}.${format}`);\n\n if (this.persistEnabled) {\n mkdirSync(this.snapshotDir, { recursive: true });\n writeFileSync(filePath, content, 'utf-8');\n }\n\n const record: IGovernanceMetricsExportRecord = {\n id,\n createdAt: timestamp,\n format,\n kind,\n filePath,\n windowMs: options.windowMs,\n bucketCount: report.bucketCount,\n };\n\n this.history = [record, ...this.history].slice(0, this.retainHistory);\n this.persistHistory();\n return { record, report, content };\n }\n\n startSchedule(\n intervalMs: number,\n options: IGovernanceMetricsWindowOptions = {},\n format: TGovernanceMetricsExportFormat = 'json'\n ): IGovernanceSnapshotSchedule {\n const id = `schedule-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`;\n const meta: IGovernanceSnapshotSchedule = {\n id,\n intervalMs,\n format,\n enabled: true,\n createdAt: Date.now(),\n options,\n };\n\n const timer = setInterval(() => {\n const result = this.createSnapshot(options, format, 'scheduled');\n const current = this.schedules.get(id);\n if (current) {\n current.meta.lastRunAt = result.record.createdAt;\n this.persistSchedules();\n }\n }, intervalMs);\n timer.unref?.();\n\n this.schedules.set(id, { meta, timer });\n this.persistSchedules();\n return { ...meta };\n }\n\n stopSchedule(id: string): boolean {\n const current = this.schedules.get(id);\n if (!current) {\n return false;\n }\n\n if (current.timer) {\n clearInterval(current.timer);\n }\n current.meta.enabled = false;\n this.schedules.delete(id);\n this.persistSchedules();\n return true;\n }\n\n clear(): void {\n for (const current of this.schedules.values()) {\n if (current.timer) {\n clearInterval(current.timer);\n }\n }\n this.schedules.clear();\n this.history = [];\n this.persistHistory();\n this.persistSchedules();\n }\n\n private loadHistory(): void {\n if (!this.persistEnabled || !existsSync(this.historyFile)) {\n return;\n }\n\n try {\n this.history = JSON.parse(readFileSync(this.historyFile, 'utf-8')) as IGovernanceMetricsExportRecord[];\n } catch {\n this.history = [];\n }\n }\n\n private persistHistory(): void {\n if (!this.persistEnabled) {\n return;\n }\n\n mkdirSync(dirname(this.historyFile), { recursive: true });\n writeFileSync(this.historyFile, JSON.stringify(this.history, null, 2), 'utf-8');\n }\n\n private loadSchedules(): void {\n if (!this.persistEnabled || !existsSync(this.scheduleFile)) {\n return;\n }\n\n try {\n const schedules = JSON.parse(readFileSync(this.scheduleFile, 'utf-8')) as IGovernanceSnapshotSchedule[];\n for (const schedule of schedules.filter((item) => item.enabled)) {\n this.restoreSchedule(schedule);\n }\n } catch {\n this.schedules.clear();\n }\n }\n\n private persistSchedules(): void {\n if (!this.persistEnabled) {\n return;\n }\n\n mkdirSync(dirname(this.scheduleFile), { recursive: true });\n const schedules = Array.from(this.schedules.values()).map((item) => item.meta);\n writeFileSync(this.scheduleFile, JSON.stringify(schedules, null, 2), 'utf-8');\n }\n\n private restoreSchedule(schedule: IGovernanceSnapshotSchedule): void {\n const timer = setInterval(() => {\n const result = this.createSnapshot(schedule.options, schedule.format, 'scheduled');\n const current = this.schedules.get(schedule.id);\n if (current) {\n current.meta.lastRunAt = result.record.createdAt;\n this.persistSchedules();\n }\n }, schedule.intervalMs);\n timer.unref?.();\n\n this.schedules.set(schedule.id, {\n meta: { ...schedule, enabled: true },\n timer,\n });\n }\n}\n\nexport const governanceMetricsExportStore = new GovernanceMetricsExportStore();\n", "export * from './types';\nexport * from './trace';\nexport * from './session-store';\nexport * from './context-alignment';\nexport * from './cascade-gate';\nexport * from './semantic-router';\nexport * from './shadow-supervisor';\nexport * from './response-governance';\nexport * from './stream-response-governance';\nexport * from './metrics';\nexport * from './metrics-export';\n", "export type ProviderPresetKey =\n | 'openrouter'\n | 'deepseek'\n | 'openai-compatible'\n | 'anthropic'\n | 'siliconflow'\n | 'custom';\n\nexport type ProviderPresetSurface = 'setup' | 'ui';\n\nexport interface IProviderPresetDefinition {\n label: string;\n api?: string;\n api_base_url?: string;\n interface?: 'openai' | 'anthropic';\n protocol?: 'openai' | 'anthropic';\n default_model?: string;\n model_examples?: string[];\n suggested_id?: string;\n key_placeholder?: string;\n vendor_hint?: string;\n default_thinking?: 'off' | 'auto' | 'on' | 'low' | 'medium' | 'high';\n surfaces: ProviderPresetSurface[];\n}\n\nconst PROVIDER_PRESETS: Record<ProviderPresetKey, IProviderPresetDefinition> = {\n openrouter: {\n label: 'OpenRouter',\n api: 'https://openrouter.ai/api/v1/chat/completions',\n api_base_url: 'https://openrouter.ai/api/v1/chat/completions',\n interface: 'openai',\n protocol: 'openai',\n default_model: 'anthropic/claude-sonnet-4',\n model_examples: ['anthropic/claude-sonnet-4', 'openai/gpt-5', 'google/gemini-2.5-pro'],\n suggested_id: 'sonnet',\n key_placeholder: 'sk-or-...',\n vendor_hint: 'openrouter',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n deepseek: {\n label: 'DeepSeek',\n api: 'https://api.deepseek.com/chat/completions',\n api_base_url: 'https://api.deepseek.com/chat/completions',\n interface: 'openai',\n protocol: 'openai',\n default_model: 'deepseek-chat',\n model_examples: ['deepseek-chat', 'deepseek-reasoner'],\n suggested_id: 'deepseek_chat',\n key_placeholder: 'sk-...',\n vendor_hint: 'deepseek',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n 'openai-compatible': {\n label: 'OpenAI-compatible',\n api: 'https://api.openai.com/v1/chat/completions',\n api_base_url: 'https://api.openai.com/v1/chat/completions',\n interface: 'openai',\n protocol: 'openai',\n default_model: 'gpt-5',\n model_examples: ['gpt-5', 'gpt-5-mini', 'gpt-4.1'],\n suggested_id: 'openai_main',\n key_placeholder: 'sk-...',\n vendor_hint: 'openai-compatible',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n anthropic: {\n label: 'Anthropic',\n api: 'https://api.anthropic.com/v1/messages',\n api_base_url: 'https://api.anthropic.com/v1/messages',\n interface: 'anthropic',\n protocol: 'anthropic',\n default_model: 'claude-sonnet-4-5',\n model_examples: ['claude-sonnet-4-5', 'claude-opus-4-1', 'claude-3-5-haiku-latest'],\n suggested_id: 'claude',\n key_placeholder: 'sk-ant-...',\n vendor_hint: 'anthropic',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n siliconflow: {\n label: 'SiliconFlow',\n api: 'https://api.siliconflow.cn/v1/chat/completions',\n api_base_url: 'https://api.siliconflow.cn/v1/chat/completions',\n interface: 'openai',\n protocol: 'openai',\n default_model: 'Qwen/Qwen3-32B',\n model_examples: ['Qwen/Qwen3-32B', 'deepseek-ai/DeepSeek-V3', 'THUDM/GLM-4-9B-Chat'],\n suggested_id: 'siliconflow_main',\n key_placeholder: 'sk-...',\n vendor_hint: 'siliconflow',\n default_thinking: 'auto',\n surfaces: ['setup', 'ui'],\n },\n custom: {\n label: 'Custom',\n surfaces: ['setup'],\n },\n};\n\nexport function getProviderPreset(key: ProviderPresetKey): IProviderPresetDefinition | undefined {\n const preset = PROVIDER_PRESETS[key];\n if (!preset) {\n return undefined;\n }\n\n return {\n ...preset,\n model_examples: preset.model_examples ? [...preset.model_examples] : undefined,\n surfaces: [...preset.surfaces],\n };\n}\n\nexport function listProviderPresetKeys(surface: ProviderPresetSurface): ProviderPresetKey[] {\n return (Object.keys(PROVIDER_PRESETS) as ProviderPresetKey[]).filter((key) =>\n PROVIDER_PRESETS[key].surfaces.includes(surface)\n );\n}\n\nexport function getUiProviderTemplates() {\n return listProviderPresetKeys('ui').reduce<Record<string, Partial<IProviderPresetDefinition>>>((result, key) => {\n const preset = PROVIDER_PRESETS[key];\n result[key] = {\n label: preset.label,\n interface: preset.interface,\n api: preset.api,\n default_model: preset.default_model,\n model_examples: preset.model_examples ? [...preset.model_examples] : [],\n suggested_id: preset.suggested_id,\n key_placeholder: preset.key_placeholder,\n vendor_hint: preset.vendor_hint,\n default_thinking: preset.default_thinking,\n };\n return result;\n }, {});\n}\n", "/**\r\n * Server\r\n *\r\n * Fastify \u670D\u52A1\u5668\u914D\u7F6E\r\n */\r\n\r\nimport Server from \"@musistudio/llms\";\nimport { readConfigFile, writeConfigFile, backupConfigFile, normalizeAndValidateConfig, deriveRuntimeSmartRouterConfig } from \"./utils\";\nimport { log } from \"./utils/log\";\nimport { SERVICE_NAME } from \"./service-health\";\nimport {\n governanceTraceStore,\n getGovernanceMetricsReport,\n exportGovernanceMetricsReport,\n governanceMetricsExportStore,\n} from \"./governance\";\nimport { buildModelRegistry, collectCapabilityWarnings } from \"./models/compile\";\nimport { getUiProviderTemplates } from \"./provider-presets\";\n\ntype CompiledProviderView = {\n name: string;\n api_base_url: string;\n models: string[];\n transformer: any;\n has_api_key: boolean;\n};\n\ntype CompiledRegistryView = {\n providers: CompiledProviderView[];\n modelMap: Record<string, any>;\n};\n\ntype ModelReferenceEntry = {\n path: string;\n value: string;\n referenceType: \"modelId\" | \"legacy\";\n};\n\nfunction toCompiledRegistryView(config: any): CompiledRegistryView {\n const registry = buildModelRegistry(config ?? {});\n return {\n providers: registry.providers.map((provider) => ({\n name: provider.name,\n api_base_url: provider.api_base_url,\n models: provider.models,\n transformer: provider.transformer,\n has_api_key: Boolean(provider.api_key),\n })),\n modelMap: registry.modelMap,\n };\n}\n\nfunction toInlineScriptJson(value: unknown): string {\n return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\nfunction collectModelReferences(config: any): ModelReferenceEntry[] {\n const refs: ModelReferenceEntry[] = [];\n const normalizedConfig = normalizeAndValidateConfig(config ?? {}).config;\n const runtimeSmartRouterConfig = deriveRuntimeSmartRouterConfig(normalizedConfig);\n const pushRef = (path: string, value: any) => {\n if (typeof value !== \"string\" || !value.trim()) {\n return;\n }\n refs.push({\n path,\n value,\n referenceType: value.includes(\",\") ? \"legacy\" : \"modelId\",\n });\n };\n\n pushRef(\"Router.default\", normalizedConfig?.Router?.default);\n pushRef(\"SmartRouter.router_model\", runtimeSmartRouterConfig?.router_model);\n runtimeSmartRouterConfig?.rules?.forEach((rule: any, index: number) => {\n pushRef(`SmartRouter.rules[${index}].model`, rule?.model);\n });\n runtimeSmartRouterConfig?.candidates?.forEach((candidate: any, index: number) => {\n pushRef(`SmartRouter.candidates[${index}].model`, candidate?.model);\n });\n pushRef(\"SmartRouter.sticky.alignment.summarizer_model\", runtimeSmartRouterConfig?.sticky?.alignment?.summarizer_model);\n pushRef(\"SmartRouter.semantic.classifier_model\", runtimeSmartRouterConfig?.semantic?.classifier_model);\n normalizedConfig?.Governance?.cascade?.levels?.forEach((level: any, index: number) => {\n pushRef(`Governance.cascade.levels[${index}].from`, level?.from);\n pushRef(`Governance.cascade.levels[${index}].to`, level?.to);\n });\n pushRef(\"Governance.shadow.verifier_model\", normalizedConfig?.Governance?.shadow?.verifier_model);\n\n return refs;\n}\n\nfunction scoreModelIdSuggestion(source: string, candidateId: string, candidate: any) {\n const sourceText = String(source || \"\").toLowerCase();\n const candidateText = `${candidateId} ${candidate?.modelName || \"\"}`.toLowerCase();\n let score = 0;\n\n if (candidateId.toLowerCase() === sourceText) {\n score += 100;\n }\n if (candidateId.toLowerCase().includes(sourceText) || sourceText.includes(candidateId.toLowerCase())) {\n score += 40;\n }\n\n const sourceParts = sourceText.split(/[^a-z0-9]+/).filter(Boolean);\n sourceParts.forEach((part) => {\n if (candidateText.includes(part)) {\n score += Math.min(part.length * 3, 18);\n }\n });\n\n return score;\n}\n\nfunction suggestModelReferences(value: string, nextCompiled: CompiledRegistryView) {\n return Object.entries(nextCompiled.modelMap ?? {})\n .map(([modelId, item]) => ({\n modelId,\n providerName: item.providerName,\n modelName: item.modelName,\n protocol: item.protocol,\n score: scoreModelIdSuggestion(value, modelId, item),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score || a.modelId.localeCompare(b.modelId))\n .slice(0, 3)\n .map(({ score, ...item }) => item);\n}\n\nfunction analyzeModelReferenceImpact(config: any, nextCompiled: CompiledRegistryView) {\n const references = collectModelReferences(config);\n const entries = references.map((ref) => {\n const resolved = ref.referenceType === \"modelId\" ? nextCompiled.modelMap?.[ref.value] : null;\n const suggestions = ref.referenceType === \"modelId\" && !resolved\n ? suggestModelReferences(ref.value, nextCompiled)\n : [];\n return {\n ...ref,\n status: ref.referenceType === \"modelId\"\n ? (resolved ? \"valid\" : \"missing\")\n : \"legacy\",\n resolvedTarget: resolved\n ? {\n providerName: resolved.providerName,\n modelName: resolved.modelName,\n protocol: resolved.protocol,\n }\n : null,\n suggestions,\n };\n });\n\n return {\n entries,\n summary: {\n total: entries.length,\n modelIdRefs: entries.filter((entry) => entry.referenceType === \"modelId\").length,\n legacyRefs: entries.filter((entry) => entry.referenceType === \"legacy\").length,\n validModelIds: entries.filter((entry) => entry.referenceType === \"modelId\" && entry.status === \"valid\").length,\n missingModelIds: entries.filter((entry) => entry.referenceType === \"modelId\" && entry.status === \"missing\").length,\n },\n };\n}\n\nfunction projectConfiguredBranch(raw: any, normalized: any): any {\n if (raw === undefined) {\n return undefined;\n }\n\n if (raw === null || normalized === null) {\n return normalized;\n }\n\n if (Array.isArray(raw)) {\n return normalized;\n }\n\n if (typeof raw !== \"object\" || typeof normalized !== \"object\") {\n return normalized;\n }\n\n const result: Record<string, unknown> = {};\n Object.keys(raw).forEach((key) => {\n if (normalized[key] === undefined) {\n return;\n }\n result[key] = projectConfiguredBranch(raw[key], normalized[key]);\n });\n return result;\n}\n\nfunction mergeSmartRouterProjection(target: Record<string, unknown>, patch: Record<string, unknown> | undefined) {\n if (!patch || !Object.keys(patch).length) {\n return target;\n }\n\n return {\n ...target,\n ...patch,\n semantic: patch.semantic\n ? {\n ...((target.semantic as Record<string, unknown>) || {}),\n ...(patch.semantic as Record<string, unknown>),\n }\n : target.semantic,\n sticky: patch.sticky\n ? {\n ...((target.sticky as Record<string, unknown>) || {}),\n ...(patch.sticky as Record<string, unknown>),\n alignment: (patch.sticky as any)?.alignment\n ? {\n ...(((target.sticky as any)?.alignment as Record<string, unknown>) || {}),\n ...((patch.sticky as any).alignment as Record<string, unknown>),\n }\n : (target.sticky as any)?.alignment,\n }\n : target.sticky,\n };\n}\n\nfunction buildPersistedConfig(rawConfig: any, normalizedConfig: any) {\n const persisted = {\n HOST: normalizedConfig.HOST,\n PORT: normalizedConfig.PORT,\n LOG: normalizedConfig.LOG,\n LOG_LEVEL: normalizedConfig.LOG_LEVEL,\n API_TIMEOUT_MS: normalizedConfig.API_TIMEOUT_MS,\n NON_INTERACTIVE_MODE: normalizedConfig.NON_INTERACTIVE_MODE,\n APIKEY: normalizedConfig.APIKEY,\n PROXY_URL: normalizedConfig.PROXY_URL,\n CUSTOM_ROUTER_PATH: normalizedConfig.CUSTOM_ROUTER_PATH,\n Providers: normalizedConfig.Providers,\n Models: normalizedConfig.Models,\n Router: normalizedConfig.Router,\n } as Record<string, unknown>;\n\n const runtimeSmartRouter = deriveRuntimeSmartRouterConfig(normalizedConfig, rawConfig);\n let smartRouterProjection = projectConfiguredBranch(rawConfig?.SmartRouter, runtimeSmartRouter) ?? {};\n\n if (rawConfig?.TriggerRouter) {\n smartRouterProjection = mergeSmartRouterProjection(smartRouterProjection, {\n ...(rawConfig.TriggerRouter.enabled !== undefined ? { enabled: runtimeSmartRouter.enabled } : {}),\n ...(rawConfig.TriggerRouter.analysis_scope !== undefined ? { analysis_scope: runtimeSmartRouter.analysis_scope } : {}),\n ...(rawConfig.TriggerRouter.rules !== undefined ? { rules: runtimeSmartRouter.rules } : {}),\n ...((rawConfig.TriggerRouter.llm_intent_recognition !== undefined || rawConfig.TriggerRouter.intent_model !== undefined)\n ? {\n semantic: {\n enabled: runtimeSmartRouter.semantic?.enabled,\n mode: runtimeSmartRouter.semantic?.mode,\n classifier_model: runtimeSmartRouter.semantic?.classifier_model,\n },\n }\n : {}),\n });\n }\n\n if (rawConfig?.Governance?.sticky) {\n smartRouterProjection = mergeSmartRouterProjection(\n smartRouterProjection,\n { sticky: projectConfiguredBranch(rawConfig.Governance.sticky, runtimeSmartRouter.sticky) }\n );\n }\n\n if (rawConfig?.Governance?.semantic) {\n smartRouterProjection = mergeSmartRouterProjection(\n smartRouterProjection,\n { semantic: projectConfiguredBranch(rawConfig.Governance.semantic, runtimeSmartRouter.semantic) }\n );\n }\n\n if (Object.keys(smartRouterProjection).length > 0) {\n persisted.SmartRouter = smartRouterProjection;\n }\n\n const governanceProjection = projectConfiguredBranch(rawConfig?.Governance, normalizedConfig?.Governance);\n if (governanceProjection && typeof governanceProjection === \"object\") {\n delete governanceProjection.sticky;\n delete governanceProjection.semantic;\n if (Object.keys(governanceProjection).length > 0) {\n persisted.Governance = governanceProjection;\n }\n }\n\n return persisted;\n}\n\nfunction buildDraftConfigView(config: any) {\n const normalizedConfig = normalizeAndValidateConfig(config ?? {}).config as any;\n const runtimeSmartRouterConfig = deriveRuntimeSmartRouterConfig(normalizedConfig);\n const draftConfig = {\n ...normalizedConfig,\n SmartRouter: runtimeSmartRouterConfig,\n } as any;\n\n delete draftConfig.TriggerRouter;\n\n if (draftConfig.Governance) {\n const projectedGovernance = {\n ...draftConfig.Governance,\n };\n delete projectedGovernance.sticky;\n delete projectedGovernance.semantic;\n\n const hasResidualGovernance = Boolean(\n projectedGovernance.shadow ||\n projectedGovernance.cascade ||\n projectedGovernance.observability\n );\n\n if (!hasResidualGovernance) {\n delete draftConfig.Governance;\n } else {\n projectedGovernance.enabled = Boolean(\n projectedGovernance.enabled &&\n hasResidualGovernance\n );\n draftConfig.Governance = projectedGovernance;\n }\n }\n\n return draftConfig;\n}\n\nfunction diffCompiledRegistry(base: CompiledRegistryView, next: CompiledRegistryView) {\n const providerNames = Array.from(new Set([\n ...base.providers.map((item) => item.name),\n ...next.providers.map((item) => item.name),\n ])).sort();\n const baseProviders = new Map(base.providers.map((item) => [item.name, item]));\n const nextProviders = new Map(next.providers.map((item) => [item.name, item]));\n const providerChanges = providerNames.flatMap((name) => {\n const before = baseProviders.get(name);\n const after = nextProviders.get(name);\n if (!before && after) {\n return [{ type: \"added\", name, before: null, after, fields: [\"provider\"] }];\n }\n if (before && !after) {\n return [{ type: \"removed\", name, before, after: null, fields: [\"provider\"] }];\n }\n const fields = [\n before?.api_base_url !== after?.api_base_url ? \"api_base_url\" : null,\n JSON.stringify(before?.models ?? []) !== JSON.stringify(after?.models ?? []) ? \"models\" : null,\n JSON.stringify(before?.transformer ?? {}) !== JSON.stringify(after?.transformer ?? {}) ? \"transformer\" : null,\n before?.has_api_key !== after?.has_api_key ? \"has_api_key\" : null,\n ].filter(Boolean);\n return fields.length ? [{ type: \"changed\", name, before, after, fields }] : [];\n });\n\n const modelIds = Array.from(new Set([\n ...Object.keys(base.modelMap ?? {}),\n ...Object.keys(next.modelMap ?? {}),\n ])).sort();\n const modelChanges = modelIds.flatMap((modelId) => {\n const before = base.modelMap?.[modelId];\n const after = next.modelMap?.[modelId];\n if (!before && after) {\n return [{ type: \"added\", modelId, before: null, after, fields: [\"model\"] }];\n }\n if (before && !after) {\n return [{ type: \"removed\", modelId, before, after: null, fields: [\"model\"] }];\n }\n const fields = [\n before?.providerName !== after?.providerName ? \"providerName\" : null,\n before?.modelName !== after?.modelName ? \"modelName\" : null,\n before?.protocol !== after?.protocol ? \"protocol\" : null,\n before?.compatibilityProfile !== after?.compatibilityProfile ? \"compatibilityProfile\" : null,\n before?.dispatchFormat !== after?.dispatchFormat ? \"dispatchFormat\" : null,\n JSON.stringify(before?.thinking ?? {}) !== JSON.stringify(after?.thinking ?? {}) ? \"thinking\" : null,\n JSON.stringify(before?.capabilities ?? {}) !== JSON.stringify(after?.capabilities ?? {}) ? \"capabilities\" : null,\n before?.source !== after?.source ? \"source\" : null,\n ].filter(Boolean);\n return fields.length ? [{ type: \"changed\", modelId, before, after, fields }] : [];\n });\n\n return {\n providerChanges,\n modelChanges,\n summary: {\n addedProviders: providerChanges.filter((item) => item.type === \"added\").length,\n removedProviders: providerChanges.filter((item) => item.type === \"removed\").length,\n changedProviders: providerChanges.filter((item) => item.type === \"changed\").length,\n addedModels: modelChanges.filter((item) => item.type === \"added\").length,\n removedModels: modelChanges.filter((item) => item.type === \"removed\").length,\n changedModels: modelChanges.filter((item) => item.type === \"changed\").length,\n },\n };\n}\n\n/**\n * \u521B\u5EFA\u670D\u52A1\u5668\n */\nexport const createServer = (config: any): Server => {\n const server = new Server(config);\n const configuredThresholds = config.initialConfig?.Governance?.observability?.anomaly_thresholds ?? {};\n\n const readGovernanceMetricsQuery = (query: any) => {\n const limit = query?.limit ? Number(query.limit) : undefined;\n const windowMs = query?.windowMs ? Number(query.windowMs) : undefined;\n const bucketCount = query?.bucketCount ? Number(query.bucketCount) : undefined;\n const now = query?.now ? Number(query.now) : undefined;\n const cascadeTriggered = query?.cascadeTriggered === undefined\n ? undefined\n : String(query.cascadeTriggered).toLowerCase() === 'true';\n const shadowChecked = query?.shadowChecked === undefined\n ? undefined\n : String(query.shadowChecked).toLowerCase() === 'true';\n\n return {\n requestId: query?.requestId,\n sessionKey: query?.sessionKey,\n routeReason: query?.routeReason,\n cascadeTriggered,\n shadowChecked,\n limit: Number.isFinite(limit) ? limit : undefined,\n windowMs: Number.isFinite(windowMs) ? windowMs : undefined,\n bucketCount: Number.isFinite(bucketCount) ? bucketCount : undefined,\n now: Number.isFinite(now) ? now : undefined,\n anomalyThresholds: {\n minSampleSize: query?.minSampleSize ? Number(query.minSampleSize) : configuredThresholds.min_sample_size,\n cascadeWarnRate: query?.cascadeWarnRate ? Number(query.cascadeWarnRate) : configuredThresholds.cascade_warn_rate,\n cascadeCriticalRate: query?.cascadeCriticalRate ? Number(query.cascadeCriticalRate) : configuredThresholds.cascade_critical_rate,\n shadowWarnRate: query?.shadowWarnRate ? Number(query.shadowWarnRate) : configuredThresholds.shadow_warn_rate,\n shadowCriticalRate: query?.shadowCriticalRate ? Number(query.shadowCriticalRate) : configuredThresholds.shadow_critical_rate,\n latencyWarnMs: query?.latencyWarnMs ? Number(query.latencyWarnMs) : configuredThresholds.latency_warn_ms,\n latencyCriticalMs: query?.latencyCriticalMs ? Number(query.latencyCriticalMs) : configuredThresholds.latency_critical_ms,\n spikeWarnRate: query?.spikeWarnRate ? Number(query.spikeWarnRate) : configuredThresholds.spike_warn_rate,\n spikeDeltaRate: query?.spikeDeltaRate ? Number(query.spikeDeltaRate) : configuredThresholds.spike_delta_rate,\n },\n };\n };\n\r\n // \u8BFB\u53D6\u914D\u7F6E API\n server.app.get(\"/api/config\", async (req: any, reply: any) => {\n return buildDraftConfigView(await readConfigFile());\n });\n\n server.app.get(\"/api/models/compiled\", async () => {\n const normalizedResult = normalizeAndValidateConfig(config.initialConfig ?? {});\n const normalized = normalizedResult.config;\n const compiled = toCompiledRegistryView(normalized);\n return {\n ...compiled,\n capabilityWarnings: collectCapabilityWarnings(normalized),\n warnings: normalizedResult.warnings,\n };\n });\n\n server.app.post(\"/api/models/compiled/preview\", async (req: any, reply: any) => {\n const rawConfig = req.body ?? {};\n let rawCompiled: CompiledRegistryView | null = null;\n try {\n rawCompiled = toCompiledRegistryView(rawConfig);\n } catch (_error) {\n rawCompiled = null;\n }\n\n const result = normalizeAndValidateConfig(rawConfig);\n if (result.errors.length > 0) {\n reply.code(400);\n return {\n success: false,\n message: \"Invalid configuration preview\",\n errors: result.errors,\n referenceImpact: rawCompiled ? analyzeModelReferenceImpact(rawConfig, rawCompiled) : undefined,\n capabilityWarnings: rawCompiled ? collectCapabilityWarnings(rawConfig) : undefined,\n warnings: result.warnings,\n };\n }\n\n const currentCompiled = toCompiledRegistryView(config.initialConfig ?? {});\n const previewCompiled = toCompiledRegistryView(result.config);\n return {\n success: true,\n providers: previewCompiled.providers,\n modelMap: previewCompiled.modelMap,\n normalizedConfig: buildDraftConfigView(result.config),\n diff: diffCompiledRegistry(currentCompiled, previewCompiled),\n referenceImpact: analyzeModelReferenceImpact(result.config, previewCompiled),\n capabilityWarnings: collectCapabilityWarnings(result.config),\n warnings: result.warnings,\n };\n });\n\r\n server.app.get(\"/api/health\", async () => {\n return {\n service: SERVICE_NAME,\n ready: true,\n port: config.initialConfig?.PORT,\n };\n });\n\n server.app.get(\"/api/governance/traces\", async (req: any) => {\n const limit = req.query?.limit ? Number(req.query.limit) : undefined;\n const cascadeTriggered = req.query?.cascadeTriggered === undefined\n ? undefined\n : String(req.query.cascadeTriggered).toLowerCase() === 'true';\n const shadowChecked = req.query?.shadowChecked === undefined\n ? undefined\n : String(req.query.shadowChecked).toLowerCase() === 'true';\n return {\n traces: governanceTraceStore.list({\n requestId: req.query?.requestId,\n sessionKey: req.query?.sessionKey,\n routeReason: req.query?.routeReason,\n cascadeTriggered,\n shadowChecked,\n limit: Number.isFinite(limit) ? limit : undefined,\n }),\n };\n });\n\n server.app.get(\"/api/governance/metrics\", async (req: any) => {\n return {\n ...getGovernanceMetricsReport(readGovernanceMetricsQuery(req.query)),\n };\n });\n\n server.app.get(\"/api/governance/metrics/export\", async (req: any, reply: any) => {\n const format = String(req.query?.format || 'json').toLowerCase() === 'csv' ? 'csv' : 'json';\n const report = getGovernanceMetricsReport(readGovernanceMetricsQuery(req.query));\n const content = exportGovernanceMetricsReport(report, format);\n\n reply.header(\n 'Content-Type',\n format === 'csv' ? 'text/csv; charset=utf-8' : 'application/json; charset=utf-8'\n );\n reply.header(\n 'Content-Disposition',\n `attachment; filename=\"governance-metrics.${format}\"`\n );\n return reply.send(content);\n });\n\n server.app.get(\"/api/governance/metrics/exports\", async () => {\n return {\n exports: governanceMetricsExportStore.listHistory(),\n schedules: governanceMetricsExportStore.listSchedules(),\n };\n });\n\n server.app.post(\"/api/governance/metrics/snapshots\", async (req: any) => {\n const format = String(req.body?.format || 'json').toLowerCase() === 'csv' ? 'csv' : 'json';\n const result = governanceMetricsExportStore.createSnapshot(\n readGovernanceMetricsQuery(req.body ?? {}),\n format,\n 'manual'\n );\n\n return {\n success: true,\n export: result.record,\n };\n });\n\n server.app.post(\"/api/governance/metrics/schedules\", async (req: any, reply: any) => {\n const intervalMs = Number(req.body?.intervalMs);\n if (!Number.isFinite(intervalMs) || intervalMs < 1000) {\n reply.code(400);\n return {\n success: false,\n message: 'intervalMs must be at least 1000 ms',\n };\n }\n\n const format = String(req.body?.format || 'json').toLowerCase() === 'csv' ? 'csv' : 'json';\n const schedule = governanceMetricsExportStore.startSchedule(\n intervalMs,\n readGovernanceMetricsQuery(req.body ?? {}),\n format\n );\n\n return {\n success: true,\n schedule,\n };\n });\n\n server.app.post(\"/api/governance/observability/anomaly-thresholds\", async (req: any, reply: any) => {\n const currentConfig = await readConfigFile();\n const nextConfig = {\n ...currentConfig,\n Governance: {\n ...(currentConfig.Governance ?? { enabled: false }),\n observability: {\n ...(currentConfig.Governance?.observability ?? {}),\n anomaly_thresholds: {\n ...(currentConfig.Governance?.observability?.anomaly_thresholds ?? {}),\n ...(req.body ?? {}),\n },\n },\n },\n };\n\n const result = normalizeAndValidateConfig(nextConfig);\n if (result.errors.length > 0) {\n reply.code(400);\n return {\n success: false,\n message: \"Invalid anomaly threshold configuration\",\n errors: result.errors,\n };\n }\n\n const backupPath = await backupConfigFile();\n if (backupPath) {\n log(`Backed up existing configuration file to ${backupPath}`);\n }\n\n await writeConfigFile(result.config);\n return {\n success: true,\n message: \"Anomaly thresholds saved successfully\",\n anomaly_thresholds: result.config.Governance?.observability?.anomaly_thresholds ?? {},\n };\n });\n\n server.app.get(\"/api/governance/traces/:requestId\", async (req: any, reply: any) => {\n const trace = governanceTraceStore.get(req.params.requestId);\n if (!trace) {\n reply.code(404);\n return {\n success: false,\n message: \"Governance trace not found\",\n };\n }\n\n return trace;\n });\n\n server.app.get(\"/api/governance/archives\", async (req: any) => {\n const limit = req.query?.limit ? Number(req.query.limit) : undefined;\n const page = req.query?.page ? Number(req.query.page) : undefined;\n const pageSize = req.query?.pageSize ? Number(req.query.pageSize) : undefined;\n return {\n archives: governanceTraceStore.listArchives({\n date: req.query?.date,\n limit: Number.isFinite(limit) ? limit : undefined,\n page: Number.isFinite(page) ? page : undefined,\n pageSize: Number.isFinite(pageSize) ? pageSize : undefined,\n }),\n };\n });\n\n server.app.get(\"/api/governance/archives/:file\", async (req: any, reply: any) => {\n const traces = governanceTraceStore.getArchivedTraces(req.params.file);\n if (!traces.length) {\n reply.code(404);\n return {\n success: false,\n message: 'Governance archive not found',\n };\n }\n\n return {\n file: req.params.file,\n traces,\n };\n });\n\n server.app.post(\"/api/governance/archives/:file/delete\", async (req: any, reply: any) => {\n const deleted = governanceTraceStore.deleteArchive(req.params.file);\n if (!deleted) {\n reply.code(404);\n return {\n success: false,\n message: 'Governance archive not found',\n };\n }\n\n return {\n success: true,\n file: req.params.file,\n };\n });\n\r\n // \u83B7\u53D6\u8F6C\u6362\u5668\u5217\u8868\r\n server.app.get(\"/api/transformers\", async () => {\r\n const transformers =\r\n server.app._server!.transformerService.getAllTransformers();\r\n const transformerList = Array.from(transformers.entries()).map(\r\n ([name, transformer]: [string, any]) => ({\r\n name,\r\n endpoint: transformer.endPoint || null,\r\n })\r\n );\r\n return { transformers: transformerList };\r\n });\r\n\r\n // \u4FDD\u5B58\u914D\u7F6E API\r\n server.app.post(\"/api/config\", async (req: any, reply: any) => {\n const result = normalizeAndValidateConfig(req.body ?? {});\n\r\n if (result.errors.length > 0) {\n reply.code(400);\n return {\n success: false,\n message: \"Invalid configuration\",\n errors: result.errors,\n warnings: result.warnings,\n };\n }\n\r\n // \u5907\u4EFD\u73B0\u6709\u914D\u7F6E\r\n const backupPath = await backupConfigFile();\r\n if (backupPath) {\n log(`Backed up existing configuration file to ${backupPath}`);\n }\n\n await writeConfigFile(buildPersistedConfig(req.body ?? {}, result.config));\n return { success: true, message: \"Config saved successfully\", warnings: result.warnings };\n });\n\r\n // \u91CD\u542F\u670D\u52A1 API\r\n server.app.post(\"/api/restart\", async (req: any, reply: any) => {\r\n reply.send({ success: true, message: \"Service restart initiated\" });\r\n\r\n // \u5EF6\u8FDF\u91CD\u542F\u4EE5\u5141\u8BB8\u54CD\u5E94\u53D1\u9001\r\n // \u4F7F\u7528 __dirname \u5B9A\u4F4D\u5DF2\u7F16\u8BD1\u7684 cli.js\uFF08\u4E0E server.js \u5728\u540C\u4E00\u76EE\u5F55\uFF09\r\n // \u8C03\u7528 start \u800C\u975E restart\uFF0C\u907F\u514D\u9012\u5F52\u7684 stop\u2192start \u5FAA\u73AF\r\n setTimeout(() => {\r\n const { spawn } = require(\"child_process\");\r\n const { join } = require(\"path\");\r\n const cliPath = join(__dirname, \"cli.js\");\r\n\r\n // \u4FDD\u6301\u5F53\u524D\u8FD0\u884C\u7AEF\u53E3\uFF0C\u907F\u514D\u91CD\u542F\u540E\u7AEF\u53E3\u53D8\u56DE\u914D\u7F6E\u6587\u4EF6\u9ED8\u8BA4\u503C\r\n const currentPort = config.initialConfig?.PORT;\r\n const restartArgs = [cliPath, \"start\", \"--daemon\"];\r\n if (currentPort) {\r\n restartArgs.push(\"--port\", String(currentPort));\r\n }\r\n\r\n spawn(process.execPath, restartArgs, {\r\n detached: true,\r\n stdio: \"ignore\",\r\n }).unref();\r\n\r\n // \u7B49\u5F85\u65B0\u8FDB\u7A0B\u542F\u52A8\u540E\u518D\u9000\u51FA\u5F53\u524D\u8FDB\u7A0B\r\n setTimeout(() => process.exit(0), 500);\r\n }, 500);\r\n });\r\n\r\n // Web UI \u5165\u53E3\uFF08\u7B80\u6613 governance trace \u8C03\u8BD5\u9875\uFF09\n server.app.get(\"/ui\", async (_: any, reply: any) => {\n reply.header(\"Content-Type\", \"text/html; charset=utf-8\");\n return reply.send(\n `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>Claude Trigger Router</title>` +\n `<style>` +\n `body{font-family:ui-sans-serif,system-ui,sans-serif;padding:2rem;max-width:1100px;margin:0 auto;background:#f7f7f5;color:#1f2328}` +\n `.panel{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:1rem 1.25rem;margin-bottom:1rem}` +\n `.muted{color:#6b7280}` +\n `.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:.75rem;margin-top:1rem}` +\n `.stat{background:#f8fafc;border:1px solid #e5e7eb;border-radius:12px;padding:.85rem}` +\n `.stat strong{display:block;font-size:1.1rem;margin-top:.25rem}` +\n `.subpanel{margin-top:1rem;padding-top:1rem;border-top:1px solid #e5e7eb}` +\n `.bucket-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem;margin-top:.75rem}` +\n `.detail-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:1rem;margin-top:1rem}` +\n `.mini-list{list-style:none;padding:0;margin:.75rem 0 0}` +\n `.mini-list li{display:flex;justify-content:space-between;gap:1rem;padding:.45rem 0;border-bottom:1px dashed #e5e7eb}` +\n `.mini-list li:last-child{border-bottom:none}` +\n `.action-row{display:flex;gap:.75rem;flex-wrap:wrap;align-items:center;margin-top:.75rem}` +\n `.management-table{width:100%;margin-top:.75rem}` +\n `.management-table th,.management-table td{padding:.5rem;border-bottom:1px solid #e5e7eb;font-size:.92rem;vertical-align:top}` +\n `.alert-list{display:grid;gap:.75rem;margin-top:1rem}` +\n `.alert{border-radius:12px;padding:.85rem 1rem;border:1px solid}` +\n `.alert.warn{background:#fff7ed;border-color:#fdba74;color:#9a3412}` +\n `.alert.critical{background:#fef2f2;border-color:#fca5a5;color:#991b1b}` +\n `.alert.info{background:#eff6ff;border-color:#93c5fd;color:#1d4ed8}` +\n `.diff-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:.75rem;margin-top:.75rem}` +\n `.diff-chip{background:#f8fafc;border:1px solid #e5e7eb;border-radius:12px;padding:.75rem}` +\n `.diff-chip strong{display:block;font-size:1rem;margin-top:.2rem}` +\n `.models-form-grid{display:grid;gap:.75rem;margin-top:.75rem}` +\n `.model-card{border:1px solid #e5e7eb;border-radius:12px;padding:1rem;background:#fcfcfd}` +\n `.model-card-header{display:flex;justify-content:space-between;gap:1rem;align-items:center;margin-bottom:.75rem}` +\n `.model-card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}` +\n `.model-card-grid textarea{min-height:84px;resize:vertical}` +\n `.list-editor{display:grid;gap:.75rem;margin-top:.75rem}` +\n `.list-item{border:1px solid #e5e7eb;border-radius:12px;padding:.85rem;background:#fcfcfd}` +\n `.list-item-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}` +\n `.jump-highlight{outline:3px solid #f59e0b;box-shadow:0 0 0 6px rgba(245,158,11,.15);transition:box-shadow .25s ease,outline-color .25s ease}` +\n `.control-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:.75rem;margin-top:1rem}` +\n `.control-grid label{display:block;font-size:.85rem;color:#6b7280;margin-bottom:.35rem}` +\n `.trend-table{width:100%;margin-top:.75rem}` +\n `.trend-table th,.trend-table td{padding:.45rem;border-bottom:1px solid #e5e7eb;font-size:.92rem}` +\n `.row{display:flex;gap:1rem;flex-wrap:wrap;align-items:center}` +\n `input,select,button{font:inherit;padding:.55rem .75rem;border-radius:8px;border:1px solid #d1d5db}` +\n `button{background:#111827;color:#fff;border-color:#111827;cursor:pointer}` +\n `table{width:100%;border-collapse:collapse;margin-top:1rem}` +\n `th,td{text-align:left;padding:.65rem .5rem;border-bottom:1px solid #e5e7eb;vertical-align:top}` +\n `code,pre{font-family:ui-monospace,SFMono-Regular,monospace}` +\n `pre{white-space:pre-wrap;background:#0f172a;color:#e2e8f0;padding:1rem;border-radius:12px;overflow:auto}` +\n `.pill{display:inline-block;padding:.2rem .5rem;border-radius:999px;background:#eef2ff;color:#3730a3;font-size:.8rem}` +\n `</style></head>` +\n `<body>` +\n `<h2>Claude Trigger Router</h2>` +\n `<p class=\"muted\">\u7B80\u6613 Governance Trace \u8C03\u8BD5\u9875\u3002\u53EF\u67E5\u770B\u6700\u8FD1\u6CBB\u7406\u94FE\u8DEF\uFF0C\u6309 requestId / sessionKey / routeReason \u8FC7\u6EE4\uFF0C\u5E76\u6309 cascade / shadow \u72B6\u6001\u7B5B\u9009\uFF1B\u6CBB\u7406 trace \u73B0\u5DF2\u652F\u6301\u672C\u5730\u6301\u4E45\u5316\uFF0C\u91CD\u542F\u540E\u53EF\u7EE7\u7EED\u67E5\u770B\u8FD1\u671F\u7A97\u53E3\u3002</p>` +\n `<div class=\"panel\">` +\n `<div class=\"row\">` +\n `<input id=\"requestId\" placeholder=\"requestId\">` +\n `<input id=\"sessionKey\" placeholder=\"sessionKey\">` +\n `<input id=\"routeReason\" placeholder=\"routeReason\">` +\n `<select id=\"cascadeTriggered\"><option value=\"\">cascadeTriggered</option><option value=\"true\">cascade=true</option><option value=\"false\">cascade=false</option></select>` +\n `<select id=\"shadowChecked\"><option value=\"\">shadowChecked</option><option value=\"true\">shadow=true</option><option value=\"false\">shadow=false</option></select>` +\n `<select id=\"windowMs\">` +\n `<option value=\"900000\">15m window</option>` +\n `<option value=\"3600000\" selected>1h window</option>` +\n `<option value=\"21600000\">6h window</option>` +\n `<option value=\"86400000\">24h window</option>` +\n `</select>` +\n `<input id=\"limit\" placeholder=\"limit\" value=\"20\">` +\n `<button id=\"refreshBtn\">\u5237\u65B0</button>` +\n `</div>` +\n `<div class=\"muted\" style=\"margin-top:.75rem\">\u6570\u636E\u6E90\uFF1A<code>/api/models/compiled</code>\u3001<code>/api/models/compiled/preview</code>\u3001<code>/api/governance/traces</code>\u3001<code>/api/governance/traces/:requestId</code>\u3001<code>/api/governance/archives</code>\u3001<code>/api/governance/metrics</code>\u3001<code>/api/governance/metrics/export</code>\u3001<code>/api/governance/metrics/exports</code></div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Draft Config Preview</strong><span class=\"muted\">\u7F16\u8F91\u5F53\u524D\u914D\u7F6E\u8349\u7A3F\u5E76\u5373\u65F6\u9884\u89C8 compiled models \u7ED3\u679C\uFF0C\u4E0D\u843D\u76D8</span></div>` +\n `<div class=\"action-row\">` +\n `<button id=\"loadConfigDraftBtn\" type=\"button\">\u8F7D\u5165\u5F53\u524D\u914D\u7F6E</button>` +\n `<button id=\"addModelDraftBtn\" type=\"button\">\u65B0\u589E Model</button>` +\n `<button id=\"applyBalancedPresetBtn\" type=\"button\">\u5E94\u7528\u5E73\u8861\u9884\u8BBE</button>` +\n `<button id=\"previewBalancedPresetBtn\" type=\"button\">\u9884\u89C8\u5E73\u8861\u9884\u8BBE</button>` +\n `<button id=\"applyFastPresetBtn\" type=\"button\">\u5E94\u7528\u5FEB\u901F\u9884\u8BBE</button>` +\n `<button id=\"previewFastPresetBtn\" type=\"button\">\u9884\u89C8\u5FEB\u901F\u9884\u8BBE</button>` +\n `<button id=\"applyGovernancePresetBtn\" type=\"button\">\u5E94\u7528\u6CBB\u7406\u9884\u8BBE</button>` +\n `<button id=\"previewGovernancePresetBtn\" type=\"button\">\u9884\u89C8\u6CBB\u7406\u9884\u8BBE</button>` +\n `<button id=\"syncDraftJsonBtn\" type=\"button\">\u540C\u6B65 JSON \u8349\u7A3F</button>` +\n `<button id=\"previewConfigDraftBtn\" type=\"button\">\u9884\u89C8 compiled models</button>` +\n `<button id=\"saveConfigDraftBtn\" type=\"button\">\u4FDD\u5B58\u914D\u7F6E</button>` +\n `<span id=\"draftPreviewStatus\" class=\"muted\">\u5C1A\u672A\u9884\u89C8\u914D\u7F6E\u8349\u7A3F</span>` +\n `</div>` +\n `<div class=\"control-grid\">` +\n `<div><label>Preset mode</label><select id=\"draftPresetMode\"><option value=\"merge\" selected>append / merge</option><option value=\"replace\">overwrite</option></select></div>` +\n `<div><label>Mode guide</label><div id=\"draftPresetModeHint\" class=\"muted\">append / merge \u4F1A\u5C3D\u91CF\u4FDD\u7559\u5F53\u524D\u8349\u7A3F\uFF0C\u4EC5\u8865\u5145\u9884\u8BBE\u76F8\u5173\u5B57\u6BB5</div></div>` +\n `</div>` +\n `<div id=\"draftPresetList\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>Preset guide</strong><div class=\"muted\">\u9009\u62E9\u9884\u8BBE\u524D\u53EF\u5148\u67E5\u770B\u5176\u4F1A\u8986\u76D6\u7684\u533A\u57DF\u4E0E\u63A8\u8350\u7528\u9014</div></div>` +\n `</div>` +\n `<div id=\"draftPreviewMeta\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>Draft preview mode</strong><div class=\"muted\">\u5F53\u524D\u663E\u793A\u4E3A\u8349\u7A3F\u7F16\u8F91\u89C6\u56FE\uFF0C\u9884\u8BBE dry-run \u4F1A\u5728\u8FD9\u91CC\u63D0\u793A\u5F71\u54CD\u8303\u56F4\u3002</div></div>` +\n `</div>` +\n `<div id=\"draftSummaryGrid\" class=\"stats\">` +\n `<div class=\"stat\"><span class=\"muted\">Models</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Routing rules</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Patterns</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Smart candidates</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Cascade levels</span><strong>0</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Model refs</span><strong>0</strong></div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Validation Summary</strong><span class=\"muted\">\u96C6\u4E2D\u663E\u793A\u5F53\u524D\u8349\u7A3F\u7684\u9519\u8BEF\u4E0E warning\uFF0C\u5E76\u533A\u5206\u4FEE\u590D\u4F18\u5148\u7EA7</span></div>` +\n `<div id=\"draftValidationList\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>No validation issues</strong><div class=\"muted\">\u9884\u89C8\u524D\u4F1A\u5728\u8FD9\u91CC\u6C47\u603B\u8349\u7A3F\u95EE\u9898</div></div>` +\n `</div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Capability Warnings</strong><span class=\"muted\">\u663E\u793A\u6A21\u578B capability hint \u53EF\u80FD\u5E26\u6765\u7684\u8FD0\u884C\u65F6\u964D\u7EA7\u884C\u4E3A</span></div>` +\n `<div id=\"capabilityWarningsList\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>No capability warnings</strong><div class=\"muted\">\u9884\u89C8\u6216\u52A0\u8F7D compiled models \u540E\u4F1A\u5728\u8FD9\u91CC\u663E\u793A\u80FD\u529B\u964D\u7EA7\u63D0\u793A</div></div>` +\n `</div>` +\n `</div>` +\n `<div class=\"control-grid\">` +\n `<div><label>Router default (modelId)</label><input id=\"draftRouterDefault\" placeholder=\"\u4F8B\u5982 sonnet\"></div>` +\n `<div><label>Models count</label><input id=\"draftModelsCount\" value=\"0\" readonly></div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Routing Controls</strong><span class=\"muted\">\u56F4\u7ED5 SmartRouter \u7EDF\u4E00\u8DEF\u7531\u5F15\u64CE\u7F16\u8F91\u89C4\u5219\u3001\u5019\u9009\u4E0E\u6CBB\u7406\u589E\u5F3A\u517C\u5BB9\u914D\u7F6E</span></div>` +\n `<div class=\"detail-grid\">` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Routing rules</strong><span class=\"muted\">\u663E\u5F0F\u89C4\u5219\u3001\u8BED\u4E49\u63D0\u793A\u4E0E\u517C\u5BB9\u8F93\u5165</span></div>` +\n `<div class=\"control-grid\">` +\n `<div><label><input id=\"triggerEnabled\" type=\"checkbox\"> Enabled</label></div>` +\n `<div><label><input id=\"triggerIntentEnabled\" type=\"checkbox\"> Intent recognition</label></div>` +\n `<div><label>Analysis scope</label><select id=\"triggerAnalysisScope\"><option value=\"last_message\">last_message</option><option value=\"full_context\">full_context</option></select></div>` +\n `<div><label>Intent model</label><input id=\"triggerIntentModel\" list=\"topLevelTriggerIntentSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelTriggerIntentSuggestions\"></datalist></div>` +\n `</div>` +\n `<div style=\"margin-top:.75rem\"><div class=\"action-row\"><label>Rules</label><button id=\"addTriggerRuleBtn\" type=\"button\">\u65B0\u589E Rule</button></div><div id=\"triggerRulesList\" class=\"list-editor\"><div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No routing rules yet</span></div></div></div>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>SmartRouter</strong><span class=\"muted\">\u667A\u80FD\u5019\u9009\u9009\u62E9</span></div>` +\n `<div class=\"control-grid\">` +\n `<div><label><input id=\"smartEnabled\" type=\"checkbox\"> Enabled</label></div>` +\n `<div><label>Router model</label><input id=\"smartRouterModel\" list=\"topLevelSmartRouterSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelSmartRouterSuggestions\"></datalist></div>` +\n `<div><label>Fallback</label><select id=\"smartFallback\"><option value=\"default\">default</option><option value=\"skip\">skip</option></select></div>` +\n `<div><label>Cache TTL</label><input id=\"smartCacheTtl\" placeholder=\"600000\"></div>` +\n `<div><label>Max tokens</label><input id=\"smartMaxTokens\" placeholder=\"256\"></div>` +\n `</div>` +\n `<div style=\"margin-top:.75rem\"><div class=\"action-row\"><label>Candidates</label><button id=\"addSmartCandidateBtn\" type=\"button\">\u65B0\u589E Candidate</button></div><div id=\"smartCandidatesList\" class=\"list-editor\"><div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No smart candidates yet</span></div></div></div>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Governance</strong><span class=\"muted\">\u5F71\u5B50\u6821\u9A8C\u3001\u7EA7\u8054\u4E0E\u89C2\u6D4B\u76F8\u5173\u914D\u7F6E</span></div>` +\n `<div class=\"control-grid\">` +\n `<div><label><input id=\"governanceEnabled\" type=\"checkbox\"> Enabled</label></div>` +\n `<div><label><input id=\"governanceAlignmentEnabled\" type=\"checkbox\"> Alignment</label></div>` +\n `<div><label>Summarizer model</label><input id=\"governanceSummarizerModel\" list=\"topLevelGovernanceSummarizerSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelGovernanceSummarizerSuggestions\"></datalist></div>` +\n `<div><label><input id=\"governanceSemanticEnabled\" type=\"checkbox\"> Semantic</label></div>` +\n `<div><label>Classifier model</label><input id=\"governanceClassifierModel\" list=\"topLevelGovernanceClassifierSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelGovernanceClassifierSuggestions\"></datalist></div>` +\n `<div><label><input id=\"governanceShadowEnabled\" type=\"checkbox\"> Shadow</label></div>` +\n `<div><label>Verifier model</label><input id=\"governanceVerifierModel\" list=\"topLevelGovernanceVerifierSuggestions\" placeholder=\"modelId\"><datalist id=\"topLevelGovernanceVerifierSuggestions\"></datalist></div>` +\n `</div>` +\n `<div style=\"margin-top:.75rem\"><div class=\"action-row\"><label>Cascade levels</label><button id=\"addCascadeLevelBtn\" type=\"button\">\u65B0\u589E Level</button></div><div id=\"governanceCascadeLevelsList\" class=\"list-editor\"><div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No cascade levels yet</span></div></div></div>` +\n `</div>` +\n `</div>` +\n `</div>` +\n `<div id=\"modelsFormGrid\" class=\"models-form-grid\">` +\n `<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No draft models loaded yet</span></div>` +\n `</div>` +\n `<textarea id=\"configDraftEditor\" style=\"width:100%;min-height:240px;margin-top:.75rem;padding:.75rem;border-radius:12px;border:1px solid #d1d5db;font:12px/1.5 ui-monospace,SFMono-Regular,monospace\" spellcheck=\"false\" placeholder='{\"Models\":[{\"id\":\"sonnet\",\"api\":\"https://...\",\"key\":\"sk-...\",\"interface\":\"openai\",\"model\":\"anthropic/claude-sonnet-4\"}]}'></textarea>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Preview Diff</strong><span class=\"muted\">\u5BF9\u6BD4\u5F53\u524D\u8FD0\u884C\u914D\u7F6E\u4E0E\u8349\u7A3F\u914D\u7F6E\u7684 compiled model \u53D8\u5316</span></div>` +\n `<div id=\"compiledDiffSummary\" class=\"diff-summary\">` +\n `<div class=\"diff-chip\"><span class=\"muted\">Added providers</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Removed providers</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Changed providers</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Added models</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Removed models</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Changed models</span><strong>0</strong></div>` +\n `</div>` +\n `<table id=\"compiledDiffTable\" class=\"management-table\">` +\n `<thead><tr><th>Scope</th><th>Type</th><th>Key</th><th>Changed fields</th><th>Target</th></tr></thead>` +\n `<tbody><tr><td colspan=\"5\" class=\"muted\">Preview a draft to inspect compiled registry changes</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Reference Impact</strong><span class=\"muted\">\u5206\u6790 Router / SmartRouter / Governance\uFF08shadow/cascade\uFF09\u7B49 modelId \u5F15\u7528\u662F\u5426\u4ECD\u7136\u6709\u6548</span></div>` +\n `<div id=\"referenceImpactSummary\" class=\"diff-summary\">` +\n `<div class=\"diff-chip\"><span class=\"muted\">Total refs</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">modelId refs</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Legacy refs</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Valid modelIds</span><strong>0</strong></div>` +\n `<div class=\"diff-chip\"><span class=\"muted\">Missing modelIds</span><strong>0</strong></div>` +\n `</div>` +\n `<table id=\"referenceImpactTable\" class=\"management-table\">` +\n `<thead><tr><th>Path</th><th>Ref</th><th>Type</th><th>Status</th><th>Resolved target</th><th>Suggestions</th></tr></thead>` +\n `<tbody><tr><td colspan=\"6\" class=\"muted\">Preview a draft to inspect model reference impact</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Compiled Models</strong><span class=\"muted\">\u67E5\u770B Models \u7F16\u8BD1\u540E\u7684 provider \u4E0E\u8DEF\u7531\u6620\u5C04</span></div>` +\n `<div id=\"compiledModelsStatus\" class=\"muted\" style=\"margin-top:.75rem\">\u52A0\u8F7D compiled models \u4E2D...</div>` +\n `<div class=\"detail-grid\">` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Compiled providers</strong><span class=\"muted\">\u5185\u90E8 provider\u3001\u6A21\u578B\u5217\u8868\u4E0E transformer</span></div>` +\n `<table id=\"compiledProvidersTable\" class=\"management-table\">` +\n `<thead><tr><th>Provider</th><th>Interface</th><th>Models</th><th>Transformer</th><th>API key</th></tr></thead>` +\n `<tbody><tr><td colspan=\"5\" class=\"muted\">Loading compiled providers...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Model map</strong><span class=\"muted\">modelId \u5230\u5185\u90E8 provider/model\u3001thinking \u4E0E capability \u914D\u7F6E</span></div>` +\n `<table id=\"compiledModelMapTable\" class=\"management-table\">` +\n `<thead><tr><th>Model ID</th><th>Internal target</th><th>Protocol</th><th>Compatibility profile</th><th>Dispatch format</th><th>Thinking</th><th>Capabilities</th><th>Source</th></tr></thead>` +\n `<tbody><tr><td colspan=\"8\" class=\"muted\">Loading model map...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `</div>` +\n `</div>` +\n `<div id=\"metricsGrid\" class=\"stats\">` +\n `<div class=\"stat\"><span class=\"muted\">Recent traces</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Sticky hit rate</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Cascade rate</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Shadow rate</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Alignment rate</span><strong>-</strong></div>` +\n `<div class=\"stat\"><span class=\"muted\">Avg latency</span><strong>-</strong></div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Anomaly alerts</strong><span class=\"muted\">\u68C0\u6D4B\u8FD1\u671F\u6CBB\u7406\u5F02\u5E38\u4E0E\u7A81\u589E</span></div>` +\n `<div id=\"anomalyList\" class=\"alert-list\">` +\n `<div class=\"alert info\"><strong>No alerts yet</strong><div class=\"muted\">\u7B49\u5F85\u6CBB\u7406\u6307\u6807\u52A0\u8F7D</div></div>` +\n `</div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Anomaly tuning</strong><span class=\"muted\">\u6765\u81EA\u914D\u7F6E\u6587\u4EF6\uFF0C\u53EF\u5728\u6B64\u4E34\u65F6\u8986\u76D6\u5F53\u524D\u9875\u9762\u67E5\u8BE2</span></div>` +\n `<div class=\"control-grid\">` +\n `<div><label>Min sample</label><input id=\"minSampleSize\" value=\"${configuredThresholds.min_sample_size ?? 3}\"></div>` +\n `<div><label>Cascade warn</label><input id=\"cascadeWarnRate\" value=\"${configuredThresholds.cascade_warn_rate ?? 0.4}\"></div>` +\n `<div><label>Shadow warn</label><input id=\"shadowWarnRate\" value=\"${configuredThresholds.shadow_warn_rate ?? 0.5}\"></div>` +\n `<div><label>Latency warn ms</label><input id=\"latencyWarnMs\" value=\"${configuredThresholds.latency_warn_ms ?? 1500}\"></div>` +\n `</div>` +\n `<div class=\"row\" style=\"margin-top:.75rem\">` +\n `<button id=\"saveThresholdsBtn\" type=\"button\">\u4FDD\u5B58\u9608\u503C\u5230\u914D\u7F6E</button>` +\n `<span id=\"saveThresholdsStatus\" class=\"muted\">\u5F53\u524D\u4EC5\u4F5C\u4E3A\u9875\u9762\u67E5\u8BE2\u53C2\u6570\uFF1B\u70B9\u51FB\u53EF\u5199\u56DE\u914D\u7F6E\u6587\u4EF6</span>` +\n `</div>` +\n `</div>` +\n `<div class=\"subpanel\">` +\n `<div class=\"row\"><strong>Window buckets</strong><span id=\"bucketHint\" class=\"muted\">\u6309\u65F6\u95F4\u7A97\u67E5\u770B\u8FD1\u671F\u6CBB\u7406\u8D8B\u52BF</span></div>` +\n `<div id=\"bucketGrid\" class=\"bucket-grid\">` +\n `<div class=\"stat\"><span class=\"muted\">Loading buckets</span><strong>-</strong></div>` +\n `</div>` +\n `</div>` +\n `<div class=\"detail-grid\">` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Route ranking</strong><span class=\"muted\">\u8FD1\u671F\u547D\u4E2D\u539F\u56E0 Top 5</span></div>` +\n `<ul id=\"routeRanking\" class=\"mini-list\"><li><span class=\"muted\">Loading</span><strong>-</strong></li></ul>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Model ranking</strong><span class=\"muted\">\u8FD1\u671F\u6700\u7EC8\u6A21\u578B Top 5</span></div>` +\n `<ul id=\"modelRanking\" class=\"mini-list\"><li><span class=\"muted\">Loading</span><strong>-</strong></li></ul>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Intent ranking</strong><span class=\"muted\">\u8FD1\u671F\u8BED\u4E49\u610F\u56FE Top 5</span></div>` +\n `<ul id=\"intentRanking\" class=\"mini-list\"><li><span class=\"muted\">Loading</span><strong>-</strong></li></ul>` +\n `</div>` +\n `<div class=\"panel\" style=\"margin-bottom:0\">` +\n `<div class=\"row\"><strong>Trend detail</strong><span class=\"muted\">\u6BCF\u4E2A bucket \u7684\u8BE6\u7EC6\u547D\u4E2D\u7387</span></div>` +\n `<table id=\"trendTable\" class=\"trend-table\">` +\n `<thead><tr><th>Bucket</th><th>Traces</th><th>Sticky</th><th>Cascade</th><th>Shadow</th><th>Alignment</th></tr></thead>` +\n `<tbody><tr><td colspan=\"6\" class=\"muted\">Loading...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `</div>` +\n `<table id=\"traceTable\">` +\n `<thead><tr><th>Request</th><th>Session</th><th>Final Model</th><th>Reasons</th><th>Latency</th><th>Inspect</th></tr></thead>` +\n `<tbody><tr><td colspan=\"6\" class=\"muted\">\u52A0\u8F7D\u4E2D...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"panel\">` +\n `<div class=\"row\"><strong>Trace Detail</strong><span id=\"detailHint\" class=\"muted\">\u70B9\u51FB\u4E0A\u8868\u4E2D\u7684 View \u67E5\u770B\u8BE6\u60C5</span></div>` +\n `<pre id=\"traceDetail\">{}</pre>` +\n `</div>` +\n `<div class=\"panel\">` +\n `<div class=\"row\"><strong>Snapshot Management</strong><span class=\"muted\">\u67E5\u770B\u5BFC\u51FA\u5386\u53F2\u3001\u5B9A\u65F6\u4EFB\u52A1\uFF0C\u5E76\u624B\u52A8\u521B\u5EFA\u5FEB\u7167</span></div>` +\n `<div class=\"action-row\">` +\n `<select id=\"snapshotFormat\"><option value=\"json\">snapshot json</option><option value=\"csv\">snapshot csv</option></select>` +\n `<button id=\"createSnapshotBtn\" type=\"button\">\u751F\u6210\u5FEB\u7167</button>` +\n `<span id=\"snapshotStatus\" class=\"muted\">\u5C1A\u672A\u521B\u5EFA\u5FEB\u7167</span>` +\n `</div>` +\n `<table id=\"exportTable\" class=\"management-table\">` +\n `<thead><tr><th>Export</th><th>Kind</th><th>Format</th><th>Created</th></tr></thead>` +\n `<tbody><tr><td colspan=\"4\" class=\"muted\">Loading exports...</td></tr></tbody>` +\n `</table>` +\n `<table id=\"scheduleTable\" class=\"management-table\">` +\n `<thead><tr><th>Schedule</th><th>Interval</th><th>Format</th><th>Last run</th></tr></thead>` +\n `<tbody><tr><td colspan=\"4\" class=\"muted\">Loading schedules...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"panel\">` +\n `<div class=\"row\"><strong>Archive Management</strong><span class=\"muted\">\u6D4F\u89C8\u538B\u7F29\u5F52\u6863\u5E76\u67E5\u770B\u5206\u9875\u7ED3\u679C</span></div>` +\n `<div class=\"action-row\">` +\n `<input id=\"archiveDate\" placeholder=\"YYYY-MM-DD\">` +\n `<input id=\"archivePage\" placeholder=\"page\" value=\"1\">` +\n `<input id=\"archivePageSize\" placeholder=\"pageSize\" value=\"5\">` +\n `<button id=\"loadArchivesBtn\" type=\"button\">\u52A0\u8F7D\u5F52\u6863</button>` +\n `<span id=\"archiveStatus\" class=\"muted\">\u5C1A\u672A\u52A0\u8F7D\u5F52\u6863</span>` +\n `</div>` +\n `<table id=\"archiveTable\" class=\"management-table\">` +\n `<thead><tr><th>Archive</th><th>Range</th><th>Count</th><th>Compressed</th></tr></thead>` +\n `<tbody><tr><td colspan=\"4\" class=\"muted\">Loading archives...</td></tr></tbody>` +\n `</table>` +\n `</div>` +\n `<div class=\"panel\">` +\n `<p>\u5176\u4ED6\u7BA1\u7406 API\uFF1A</p>` +\n `<ul>` +\n `<li><code>GET /api/config</code> \u2014 \u8BFB\u53D6\u5F53\u524D\u914D\u7F6E</li>` +\n `<li><code>GET /api/models/compiled</code> \u2014 \u67E5\u770B Models \u7F16\u8BD1\u540E\u7684\u5185\u90E8 provider / model \u6620\u5C04</li>` +\n `<li><code>POST /api/models/compiled/preview</code> \u2014 \u7528\u914D\u7F6E\u8349\u7A3F\u9884\u89C8 compiled models \u7ED3\u679C\uFF0C\u4E0D\u5199\u56DE\u6587\u4EF6</li>` +\n `<li><code>POST /api/config</code> \u2014 \u4FDD\u5B58\u914D\u7F6E</li>` +\n `<li><code>GET /api/transformers</code> \u2014 \u67E5\u770B\u5DF2\u52A0\u8F7D transformer</li>` +\n `<li><code>POST /api/restart</code> \u2014 \u91CD\u542F\u670D\u52A1</li>` +\n `<li><code>GET /api/governance/archives</code> \u2014 \u67E5\u770B\u6CBB\u7406\u5F52\u6863\u5217\u8868</li>` +\n `<li><code>GET /api/governance/archives/:file</code> \u2014 \u67E5\u770B\u5F52\u6863\u5185 traces</li>` +\n `<li><code>POST /api/governance/archives/:file/delete</code> \u2014 \u5220\u9664\u6307\u5B9A\u5F52\u6863</li>` +\n `<li><code>POST /api/governance/metrics/snapshots</code> \u2014 \u751F\u6210\u4E00\u6B21\u6CBB\u7406\u6307\u6807\u5FEB\u7167</li>` +\n `<li><code>POST /api/governance/metrics/schedules</code> \u2014 \u6CE8\u518C\u5B9A\u65F6\u5FEB\u7167\u4EFB\u52A1</li>` +\n `</ul>` +\n `</div>` +\n `<script>` +\n `const tbody=document.querySelector('#traceTable tbody');` +\n `const detail=document.getElementById('traceDetail');` +\n `const detailHint=document.getElementById('detailHint');` +\n `const draftPreviewStatus=document.getElementById('draftPreviewStatus');` +\n `const draftPresetMode=document.getElementById('draftPresetMode');` +\n `const draftPresetModeHint=document.getElementById('draftPresetModeHint');` +\n `const draftPresetList=document.getElementById('draftPresetList');` +\n `const draftPreviewMeta=document.getElementById('draftPreviewMeta');` +\n `const draftValidationList=document.getElementById('draftValidationList');` +\n `const capabilityWarningsList=document.getElementById('capabilityWarningsList');` +\n `const configDraftEditor=document.getElementById('configDraftEditor');` +\n `const draftSummaryGrid=document.getElementById('draftSummaryGrid');` +\n `const modelsFormGrid=document.getElementById('modelsFormGrid');` +\n `const draftRouterDefault=document.getElementById('draftRouterDefault');` +\n `const draftModelsCount=document.getElementById('draftModelsCount');` +\n `const triggerEnabled=document.getElementById('triggerEnabled');` +\n `const triggerIntentEnabled=document.getElementById('triggerIntentEnabled');` +\n `const triggerAnalysisScope=document.getElementById('triggerAnalysisScope');` +\n `const triggerIntentModel=document.getElementById('triggerIntentModel');` +\n `const triggerRulesList=document.getElementById('triggerRulesList');` +\n `const smartEnabled=document.getElementById('smartEnabled');` +\n `const smartRouterModel=document.getElementById('smartRouterModel');` +\n `const smartFallback=document.getElementById('smartFallback');` +\n `const smartCacheTtl=document.getElementById('smartCacheTtl');` +\n `const smartMaxTokens=document.getElementById('smartMaxTokens');` +\n `const smartCandidatesList=document.getElementById('smartCandidatesList');` +\n `const governanceEnabled=document.getElementById('governanceEnabled');` +\n `const governanceAlignmentEnabled=document.getElementById('governanceAlignmentEnabled');` +\n `const governanceSummarizerModel=document.getElementById('governanceSummarizerModel');` +\n `const governanceSemanticEnabled=document.getElementById('governanceSemanticEnabled');` +\n `const governanceClassifierModel=document.getElementById('governanceClassifierModel');` +\n `const governanceShadowEnabled=document.getElementById('governanceShadowEnabled');` +\n `const governanceVerifierModel=document.getElementById('governanceVerifierModel');` +\n `const governanceCascadeLevelsList=document.getElementById('governanceCascadeLevelsList');` +\n `const topLevelTriggerIntentSuggestions=document.getElementById('topLevelTriggerIntentSuggestions');` +\n `const topLevelSmartRouterSuggestions=document.getElementById('topLevelSmartRouterSuggestions');` +\n `const topLevelGovernanceSummarizerSuggestions=document.getElementById('topLevelGovernanceSummarizerSuggestions');` +\n `const topLevelGovernanceClassifierSuggestions=document.getElementById('topLevelGovernanceClassifierSuggestions');` +\n `const topLevelGovernanceVerifierSuggestions=document.getElementById('topLevelGovernanceVerifierSuggestions');` +\n `const compiledModelsStatus=document.getElementById('compiledModelsStatus');` +\n `const compiledDiffSummary=document.getElementById('compiledDiffSummary');` +\n `const compiledDiffTableBody=document.querySelector('#compiledDiffTable tbody');` +\n `const referenceImpactSummary=document.getElementById('referenceImpactSummary');` +\n `const referenceImpactTableBody=document.querySelector('#referenceImpactTable tbody');` +\n `const compiledProvidersTableBody=document.querySelector('#compiledProvidersTable tbody');` +\n `const compiledModelMapTableBody=document.querySelector('#compiledModelMapTable tbody');` +\n `const metricsGrid=document.getElementById('metricsGrid');` +\n `const bucketGrid=document.getElementById('bucketGrid');` +\n `const bucketHint=document.getElementById('bucketHint');` +\n `const routeRanking=document.getElementById('routeRanking');` +\n `const modelRanking=document.getElementById('modelRanking');` +\n `const intentRanking=document.getElementById('intentRanking');` +\n `const anomalyList=document.getElementById('anomalyList');` +\n `const saveThresholdsStatus=document.getElementById('saveThresholdsStatus');` +\n `const snapshotStatus=document.getElementById('snapshotStatus');` +\n `const archiveStatus=document.getElementById('archiveStatus');` +\n `const exportTableBody=document.querySelector('#exportTable tbody');` +\n `const scheduleTableBody=document.querySelector('#scheduleTable tbody');` +\n `const archiveTableBody=document.querySelector('#archiveTable tbody');` +\n `const trendTableBody=document.querySelector('#trendTable tbody');` +\n `let currentDraftConfig={};` +\n `let knownModelIds=[];` +\n `let activeValidationHighlight=null;` +\n `const draftPresets={` +\n ` balanced:{ label:'\u5E73\u8861\u9884\u8BBE', description:'\u542F\u7528 SmartRouter\uFF0C\u5E76\u586B\u5145\u5E73\u8861/\u5FEB\u901F\u5019\u9009\u6A21\u578B\u7EC4\u5408\u3002', affects:['Router.default','SmartRouter.enabled','SmartRouter.candidates'], routerDefault:'sonnet', smartEnabled:true, smartCandidates:[{ model:'sonnet', description:'balanced default' },{ model:'haiku', description:'fast lightweight' }] },` +\n ` fast:{ label:'\u5FEB\u901F\u9884\u8BBE', description:'\u9ED8\u8BA4\u8D70\u8F7B\u91CF\u6A21\u578B\uFF0C\u5E76\u6DFB\u52A0\u4E00\u6761\u5FEB\u901F\u54CD\u5E94\u8DEF\u7531\u89C4\u5219\u3002', affects:['Router.default','SmartRouter.enabled','SmartRouter.rules'], routerDefault:'haiku', triggerEnabled:true, triggerRules:[{ name:'quick-response', enabled:true, priority:20, model:'haiku', patterns:[{ type:'exact', keywords:['\u5FEB\u901F\u5904\u7406','\u5FEB\u901F\u56DE\u7B54'] }] }] },` +\n ` governance:{ label:'\u6CBB\u7406\u9884\u8BBE', description:'\u6253\u5F00\u6CBB\u7406\u589E\u5F3A\u4E0E\u6821\u9A8C\u80FD\u529B\uFF0C\u5E76\u586B\u5165 summarizer/classifier/verifier \u793A\u4F8B\u6A21\u578B\u3002', affects:['Governance.enabled','SmartRouter.sticky.alignment','SmartRouter.semantic','Governance.shadow'], governanceEnabled:true, governanceAlignmentEnabled:true, governanceSemanticEnabled:true, governanceShadowEnabled:true, governanceSummarizerModel:'sonnet', governanceClassifierModel:'sonnet', governanceVerifierModel:'haiku' }` +\n `};` +\n `const modelProviderTemplates=${toInlineScriptJson(getUiProviderTemplates())};` +\n `const defaultProviderTemplateKey='openrouter';` +\n `function esc(v){return String(v ?? '').replace(/[&<>\"]/g,m=>({ '&':'&','<':'<','>':'>','\"':'"' }[m]));}` +\n `function pct(v){return (Number(v || 0) * 100).toFixed(1)+'%';}` +\n `function fmt(v){return Number(v || 0).toFixed(2);}` +\n `function shortTime(v){ const d=new Date(v); return d.toISOString().slice(11,16); }` +\n `function inferProviderTemplateKey(model){` +\n ` const explicit=String(model?.provider_template || '').trim();` +\n ` if(explicit && modelProviderTemplates[explicit]){ return explicit; }` +\n ` const api=String(model?.api || model?.api_base_url || '').trim().toLowerCase();` +\n ` const modelInterface=String(model?.interface || model?.protocol || '').trim().toLowerCase();` +\n ` const exactMatch=Object.entries(modelProviderTemplates).find(([,item])=>String(item.api || '').trim().toLowerCase()===api && String(item.interface || '').trim().toLowerCase()===modelInterface);` +\n ` if(exactMatch){ return exactMatch[0]; }` +\n ` if(api.includes('api.anthropic.com/v1/messages') || modelInterface === 'anthropic'){ return 'anthropic'; }` +\n ` if(api.includes('openrouter.ai')){ return 'openrouter'; }` +\n ` if(api.includes('deepseek.com')){ return 'deepseek'; }` +\n ` if(api.includes('siliconflow.cn')){ return 'siliconflow'; }` +\n ` if(api.includes('api.openai.com')){ return 'openai-compatible'; }` +\n ` return '';` +\n `}` +\n `function getProviderTemplateContext(model){` +\n ` const templateKey=inferProviderTemplateKey(model) || defaultProviderTemplateKey;` +\n ` return { templateKey, template:modelProviderTemplates[templateKey] || modelProviderTemplates[defaultProviderTemplateKey] || {} };` +\n `}` +\n `function createDraftModelFromTemplate(templateKey){` +\n ` const resolvedKey=(templateKey && modelProviderTemplates[templateKey]) ? templateKey : defaultProviderTemplateKey;` +\n ` const template=modelProviderTemplates[resolvedKey] || {};` +\n ` return { provider_template:resolvedKey, id:template.suggested_id || '', api:template.api || '', interface:template.interface || 'openai', model:template.default_model || '', thinking:template.default_thinking || 'auto' };` +\n `}` +\n `function getModelIdSuggestionsMarkup(idPrefix){` +\n ` return '<datalist id=\\\"'+idPrefix+'\\\">'+knownModelIds.map(modelId=>'<option value=\\\"'+esc(modelId)+'\\\"></option>').join('')+'</datalist>';` +\n `}` +\n `function resolvePresetModelId(seed){` +\n ` const source=String(seed || '').trim().toLowerCase();` +\n ` if(!source || !knownModelIds.length){ return seed; }` +\n ` if(knownModelIds.includes(seed)){ return seed; }` +\n ` const ranked=knownModelIds.map((modelId)=>{` +\n ` const target=String(modelId || '').toLowerCase();` +\n ` let score=0;` +\n ` if(target===source){ score+=100; }` +\n ` if(target.includes(source) || source.includes(target)){ score+=40; }` +\n ` source.split(/[^a-z0-9]+/).filter(Boolean).forEach((part)=>{ if(target.includes(part)){ score+=Math.min(part.length * 4, 24); } });` +\n ` return { modelId, score };` +\n ` }).filter((item)=>item.score>0).sort((a,b)=>b.score-a.score || a.modelId.localeCompare(b.modelId));` +\n ` return ranked.length ? ranked[0].modelId : seed;` +\n `}` +\n `function getTriggerPatternValidationHint(pattern){` +\n ` if((pattern?.type || 'exact') === 'regex'){` +\n ` return pattern?.pattern ? { level:'ok', message:'regex pattern \u5DF2\u914D\u7F6E' } : { level:'warn', message:'regex \u6A21\u5F0F\u9700\u8981\u586B\u5199 pattern' };` +\n ` }` +\n ` return Array.isArray(pattern?.keywords) && pattern.keywords.some((keyword)=>String(keyword || '').trim()) ? { level:'ok', message:'exact keywords \u5DF2\u914D\u7F6E' } : { level:'warn', message:'exact \u6A21\u5F0F\u81F3\u5C11\u9700\u8981\u4E00\u4E2A keyword' };` +\n `}` +\n `function getDraftSmartRouterConfig(config){` +\n ` const smart={ ...((config && config.SmartRouter) || {}) };` +\n ` const smartExplicit=config && Object.prototype.hasOwnProperty.call(config,'SmartRouter');` +\n ` const legacyIntentEnabled=Boolean(config?.TriggerRouter?.llm_intent_recognition);` +\n ` const legacyIntentModel=config?.TriggerRouter?.intent_model || '';` +\n ` if(!smart.analysis_scope && config?.TriggerRouter?.analysis_scope){ smart.analysis_scope=config.TriggerRouter.analysis_scope; }` +\n ` if((!Array.isArray(smart.rules) || !smart.rules.length) && Array.isArray(config?.TriggerRouter?.rules)){ smart.rules=config.TriggerRouter.rules; }` +\n ` if(!smart.semantic && (config?.Governance?.semantic || config?.TriggerRouter?.llm_intent_recognition)){ smart.semantic={ ...((config && config.Governance && config.Governance.semantic) || {}) }; if(config?.TriggerRouter?.llm_intent_recognition){ smart.semantic.enabled=true; smart.semantic.mode=smart.semantic.mode || 'classifier'; smart.semantic.classifier_model=smart.semantic.classifier_model || config.TriggerRouter.intent_model || ''; } }` +\n ` if(!smart.sticky && config?.Governance?.sticky){ smart.sticky={ ...(config.Governance.sticky || {}) }; }` +\n ` if(!smartExplicit && !smart.enabled && (config?.TriggerRouter?.enabled || smart.rules?.length || smart.router_model || smart.candidates?.length || smart.semantic || smart.sticky)){ smart.enabled=true; }` +\n ` if(smart.enabled){` +\n ` smart.analysis_scope=smart.analysis_scope || 'last_message';` +\n ` smart.semantic={ ...(smart.semantic || {}) };` +\n ` smart.semantic.enabled=smart.semantic.enabled !== undefined ? smart.semantic.enabled : true;` +\n ` smart.semantic.threshold=smart.semantic.threshold !== undefined ? smart.semantic.threshold : 0.2;` +\n ` if(legacyIntentEnabled){ smart.semantic.mode=smart.semantic.mode || 'classifier'; smart.semantic.classifier_model=smart.semantic.classifier_model || legacyIntentModel; }` +\n ` smart.sticky={ ...(smart.sticky || {}) };` +\n ` smart.sticky.enabled=smart.sticky.enabled !== undefined ? smart.sticky.enabled : true;` +\n ` smart.sticky.alignment={ ...((smart.sticky && smart.sticky.alignment) || {}) };` +\n ` smart.sticky.alignment.enabled=smart.sticky.alignment.enabled !== undefined ? smart.sticky.alignment.enabled : true;` +\n ` smart.sticky.alignment.summarizer_model=smart.sticky.alignment.summarizer_model || smart.router_model || config?.Router?.default || legacyIntentModel || '';` +\n ` }` +\n ` return smart;` +\n `}` +\n `function renderDraftSummary(config){` +\n ` const models=Array.isArray(config?.Models) ? config.Models : [];` +\n ` const smart=getDraftSmartRouterConfig(config);` +\n ` const triggerRules=Array.isArray(smart?.rules) ? smart.rules : [];` +\n ` const patternCount=triggerRules.reduce((sum,rule)=>sum + (Array.isArray(rule.patterns) ? rule.patterns.length : 0),0);` +\n ` const smartCandidates=Array.isArray(smart?.candidates) ? smart.candidates : [];` +\n ` const cascadeLevels=Array.isArray(config?.Governance?.cascade?.levels) ? config.Governance.cascade.levels : [];` +\n ` const modelRefCount=[config?.Router?.default, smart?.router_model, smart?.sticky?.alignment?.summarizer_model, smart?.semantic?.classifier_model, config?.Governance?.shadow?.verifier_model].filter(v=>typeof v === 'string' && v.trim()).length + triggerRules.filter(rule=>rule?.model).length + smartCandidates.filter(item=>item?.model).length + cascadeLevels.reduce((sum,level)=>sum + (level?.from ? 1 : 0) + (level?.to ? 1 : 0), 0);` +\n ` draftSummaryGrid.innerHTML=[` +\n \" ['Models', models.length],\" +\n \" ['Routing rules', triggerRules.length],\" +\n \" ['Patterns', patternCount],\" +\n \" ['Smart candidates', smartCandidates.length],\" +\n \" ['Cascade levels', cascadeLevels.length],\" +\n \" ['Model refs', modelRefCount]\" +\n ` ].map(([label,value])=>'<div class=\\\"stat\\\"><span class=\\\"muted\\\">'+esc(label)+'</span><strong>'+esc(value)+'</strong></div>').join('');` +\n `}` +\n `function renderDraftValidation(errors,warnings){` +\n ` const errorList=Array.isArray(errors) ? errors.filter(Boolean) : [];` +\n ` const warningList=Array.isArray(warnings) ? warnings.filter(Boolean) : [];` +\n ` if(!errorList.length && !warningList.length){ draftValidationList.innerHTML='<div class=\"alert info\"><strong>No validation issues</strong><div class=\"muted\">\u5F53\u524D\u8349\u7A3F\u672A\u53D1\u73B0\u96C6\u4E2D\u5C55\u793A\u7684\u95EE\u9898</div></div>'; return; }` +\n ` const extractPath=(text)=>{ const match=String(text).match(/^(Models(?:\\\\[[0-9]+\\\\])?(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?|Router(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?|TriggerRouter(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?|SmartRouter(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?|Governance(?:\\\\.[A-Za-z0-9_\\\\[\\\\]\\\\.]+)?)/); return match ? match[1] : ''; };` +\n ` const grouped=[...errorList.map(item=>({ text:String(item), severity:'error' })), ...warningList.map(item=>({ text:String(item), severity:'warning' }))].reduce((acc,item)=>{` +\n ` const text=item.text;` +\n ` const bucket=text.startsWith('Models') ? 'Models' : text.startsWith('Router') ? 'Router' : text.startsWith('TriggerRouter') ? 'SmartRouter' : text.startsWith('SmartRouter') ? 'SmartRouter' : (text.startsWith('Governance.sticky') || text.startsWith('Governance.semantic')) ? 'SmartRouter' : text.startsWith('Governance') ? 'Governance' : text.startsWith('JSON parse error') ? 'Draft JSON' : 'Other';` +\n ` acc[bucket]=acc[bucket] || [];` +\n ` acc[bucket].push({ text, path: extractPath(text), severity:item.severity });` +\n ` return acc;` +\n ` }, {});` +\n ` const summary='<div class=\"alert info\"><div class=\"row\"><strong>Validation summary</strong><span class=\"pill\">'+esc(errorList.length)+' errors / '+esc(warningList.length)+' warnings</span></div><div class=\"muted\">'+(errorList.length ? '\u8BF7\u4F18\u5148\u4FEE\u590D errors\uFF0C\u518D\u51B3\u5B9A\u662F\u5426\u63A5\u53D7 warnings\u3002' : '\u5F53\u524D\u65E0\u963B\u65AD\u9519\u8BEF\uFF0C\u53EF\u6309\u9700\u5904\u7406 warnings\u3002')+'</div></div>';` +\n ` draftValidationList.innerHTML=summary + Object.entries(grouped).map(([bucket,items])=>{ const hasError=items.some(item=>item.severity==='error'); const levelClass=hasError ? 'warn' : 'info'; const actionLabel=hasError ? 'repair first' : 'review before save'; return '<div class=\"alert '+levelClass+'\"><div class=\"row\"><strong>'+esc(bucket)+'</strong><span class=\"pill\">'+esc(items.length)+' issues</span></div><div class=\"muted\">'+esc(actionLabel)+'</div><div>'+items.slice(0,4).map(item=>'<div>'+(item.path ? ('<button type=\"button\" class=\"pill\" data-validation-path=\\\"'+esc(item.path)+'\\\">'+esc(item.path)+'</button> ') : '')+'<span class=\\\"pill\\\">'+esc(item.severity==='error' ? 'error' : 'warning')+'</span> '+esc(item.text)+'</div>').join('')+'</div></div>'; }).join('');` +\n `}` +\n `function getCapabilityWarningActionLabel(code){` +\n ` if(code==='thinking_ignored'){ return '\u79FB\u9664 thinking'; }` +\n ` if(code==='tools_text_fallback' || code==='images_text_fallback'){ return '\u6062\u590D\u9ED8\u8BA4 capability'; }` +\n ` return '';` +\n `}` +\n `function renderCapabilityWarnings(report){` +\n ` const entries=Array.isArray(report?.entries) ? report.entries : [];` +\n ` if(!entries.length){ capabilityWarningsList.innerHTML='<div class=\"alert info\"><strong>No capability warnings</strong><div class=\"muted\">\u5F53\u524D compiled models \u672A\u53D1\u73B0\u9700\u8981\u989D\u5916\u63D0\u793A\u7684\u80FD\u529B\u964D\u7EA7</div></div>'; return; }` +\n ` const summary=report?.summary || {};` +\n ` capabilityWarningsList.innerHTML='<div class=\"alert info\"><strong>Capability warning summary</strong><div class=\"muted\">warn '+esc(summary.warn ?? 0)+' / info '+esc(summary.info ?? 0)+' / total '+esc(summary.total ?? entries.length)+'</div></div>' + entries.map(item=>{ const actionLabel=getCapabilityWarningActionLabel(item.code); return '<div class=\"alert '+esc(item.level === 'warn' ? 'warn' : 'info')+'\"><div class=\"row\"><strong>'+esc(item.code || item.level || 'warning')+'</strong><span class=\"pill\">'+esc(item.modelId || '-').trim()+'</span></div><div>'+(item.path ? ('<button type=\"button\" class=\"pill\" data-validation-path=\\\"'+esc(item.path)+'\\\">'+esc(item.path)+'</button> ') : '')+esc(item.message || '')+'</div>'+(actionLabel ? ('<div class=\\\"row\\\" style=\\\"margin-top:.5rem\\\"><button type=\\\"button\\\" data-apply-warning-path=\\\"'+esc(item.path || '')+'\\\" data-apply-warning-code=\\\"'+esc(item.code || '')+'\\\">'+esc(actionLabel)+'</button></div>') : '')+'</div>'; }).join('');` +\n `}` +\n `function findValidationTarget(path){` +\n ` if(!path){ return null; }` +\n ` if(path.startsWith('Models')){ return modelsFormGrid; }` +\n ` if(path === 'Router.default'){ return draftRouterDefault; }` +\n ` if(path.startsWith('TriggerRouter.intent_model')){ return triggerIntentModel; }` +\n ` if(path.startsWith('TriggerRouter.rules[')){ return triggerRulesList; }` +\n ` if(path.startsWith('SmartRouter.router_model')){ return smartRouterModel; }` +\n ` if(path.startsWith('SmartRouter.candidates[')){ return smartCandidatesList; }` +\n ` if(path.startsWith('Governance.cascade.levels[')){ return governanceCascadeLevelsList; }` +\n ` if(path.startsWith('Governance.sticky.alignment')){ return governanceSummarizerModel; }` +\n ` if(path.startsWith('Governance.semantic')){ return governanceClassifierModel; }` +\n ` if(path.startsWith('Governance.shadow')){ return governanceVerifierModel; }` +\n ` if(path.startsWith('Governance')){ return governanceEnabled; }` +\n ` return null;` +\n `}` +\n `function jumpToValidationPath(path){` +\n ` const target=findValidationTarget(path);` +\n ` if(!target || typeof target.scrollIntoView !== 'function'){ return; }` +\n ` if(activeValidationHighlight && activeValidationHighlight.classList){ activeValidationHighlight.classList.remove('jump-highlight'); }` +\n ` target.scrollIntoView({ behavior:'smooth', block:'center' });` +\n ` if(target.classList){ target.classList.add('jump-highlight'); activeValidationHighlight=target; setTimeout(()=>{ if(target.classList){ target.classList.remove('jump-highlight'); if(activeValidationHighlight===target){ activeValidationHighlight=null; } } }, 1800); }` +\n ` if(typeof target.focus === 'function'){ target.focus({ preventScroll:true }); }` +\n `}` +\n `function renderDraftPresetModeHint(){` +\n ` const overwriteMode=draftPresetMode.value === 'replace';` +\n ` draftPresetModeHint.textContent=overwriteMode ? 'overwrite \u4F1A\u91CD\u7F6E SmartRouter / Governance \u76F8\u5173\u8868\u5355\uFF0C\u518D\u5E94\u7528\u9884\u8BBE' : 'append / merge \u4F1A\u5C3D\u91CF\u4FDD\u7559\u5F53\u524D\u8349\u7A3F\uFF0C\u4EC5\u8865\u5145 SmartRouter / Governance \u76F8\u5173\u5B57\u6BB5';` +\n `}` +\n `function deriveActualAffectedAreas(preview){` +\n ` const areas=new Set();` +\n ` const diff=preview?.diff || {};` +\n ` const impact=preview?.referenceImpact || {};` +\n ` if((diff.providerChanges || []).length || (diff.modelChanges || []).length){ areas.add('Models'); }` +\n ` (impact.entries || []).forEach((entry)=>{` +\n ` const path=String(entry.path || '');` +\n ` if(path.startsWith('Router.')){ areas.add('Router'); }` +\n ` else if(path.startsWith('TriggerRouter.')){ areas.add('SmartRouter'); }` +\n ` else if(path.startsWith('SmartRouter.')){ areas.add('SmartRouter'); }` +\n ` else if(path.startsWith('Governance.sticky') || path.startsWith('Governance.semantic')){ areas.add('SmartRouter'); }` +\n ` else if(path.startsWith('Governance.')){ areas.add('Governance'); }` +\n ` });` +\n ` return Array.from(areas);` +\n `}` +\n `function renderDraftPreviewMeta(meta){` +\n ` if(!meta){ draftPreviewMeta.innerHTML='<div class=\"alert info\"><strong>Draft preview mode</strong><div class=\"muted\">\u5F53\u524D\u663E\u793A\u4E3A\u8349\u7A3F\u7F16\u8F91\u89C6\u56FE\uFF0C\u9884\u8BBE dry-run \u4F1A\u5728\u8FD9\u91CC\u63D0\u793A\u5F71\u54CD\u8303\u56F4\u3002</div></div>'; return; }` +\n ` draftPreviewMeta.innerHTML='<div class=\"alert info\"><strong>'+esc(meta.title || 'Preset dry-run')+'</strong><div>'+esc(meta.description || '')+'</div><div class=\"muted\">\u6A21\u5F0F\uFF1A'+esc(meta.mode || '-')+' \u00B7 \u9884\u8BBE\u58F0\u660E\u5F71\u54CD\u8303\u56F4\uFF1A'+esc((meta.affects || []).join(' / ') || '-')</div><div class=\"muted\">\u5B9E\u9645\u9884\u89C8\u547D\u4E2D\u533A\u57DF\uFF1A'+esc((meta.actualAffects || []).join(' / ') || '-')</div></div>';` +\n `}` +\n `function renderDraftPresetGuide(){` +\n ` draftPresetList.innerHTML=Object.entries(draftPresets).map(([key,preset])=>'<div class=\"alert info\"><strong>'+esc(preset.label || key)+'</strong><div>'+esc(preset.description || '')+'</div><div class=\"muted\">\u5F71\u54CD\u8303\u56F4\uFF1A'+esc((preset.affects || []).join(' / '))+'</div></div>').join('');` +\n `}` +\n `function updateTopLevelModelSuggestionLists(){` +\n ` const markup=knownModelIds.map(modelId=>'<option value=\\\"'+esc(modelId)+'\\\"></option>').join('');` +\n ` [topLevelTriggerIntentSuggestions,topLevelSmartRouterSuggestions,topLevelGovernanceSummarizerSuggestions,topLevelGovernanceClassifierSuggestions,topLevelGovernanceVerifierSuggestions].forEach(node=>{ if(node){ node.innerHTML=markup; } });` +\n `}` +\n `function renderModelsForm(models){` +\n ` const list=Array.isArray(models) ? models : [];` +\n ` draftModelsCount.value=String(list.length);` +\n ` if(!list.length){ modelsFormGrid.innerHTML='<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No draft models loaded yet</span></div>'; return; }` +\n ` modelsFormGrid.innerHTML=list.map((model,index)=>{ const templateContext=getProviderTemplateContext(model); const template=templateContext.template; return '<div class=\"model-card\" data-model-card=\\\"'+index+'\\\">' +` +\n ` '<div class=\"model-card-header\"><strong>Model #'+(index+1)+'</strong><button type=\"button\" data-remove-model=\\\"'+index+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\"model-card-grid\">' +` +\n ` '<div><label>Provider template</label><div class=\"row\"><select data-field=\\\"provider_template\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">custom</option>'+Object.entries(modelProviderTemplates).map(([key,item])=>'<option value=\\\"'+esc(key)+'\\\"'+(model.provider_template === key ? ' selected' : '')+'>'+esc(item.label)+'</option>').join('')+'</select><button type=\"button\" data-apply-template=\\\"'+index+'\\\">\u5E94\u7528</button></div></div>' +` +\n ` '<div><label>ID</label><input data-field=\\\"id\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.id || '')+'\\\" placeholder=\\\"'+esc(template.suggested_id || 'sonnet')+'\\\"><div class=\"muted\">\u5EFA\u8BAE\u6A21\u677F\uFF1A'+esc(template.label || templateContext.templateKey || 'custom')+'</div></div>' +` +\n ` '<div><label>Interface</label><select data-field=\\\"interface\\\" data-index=\\\"'+index+'\\\"><option value=\\\"openai\\\"'+(((model.interface || model.protocol || 'openai') === 'openai') ? ' selected' : '')+'>openai</option><option value=\\\"anthropic\\\"'+(((model.interface || model.protocol) === 'anthropic') ? ' selected' : '')+'>anthropic</option></select></div>' +` +\n ` '<div><label>Model</label><input data-field=\\\"model\\\" data-index=\\\"'+index+'\\\" list=\\\"modelSuggestions'+index+'\\\" value=\\\"'+esc(model.model || '')+'\\\" placeholder=\\\"'+esc(template.default_model || 'anthropic/claude-sonnet-4')+'\\\"><datalist id=\\\"modelSuggestions'+index+'\\\">'+((template.model_examples || []).map(item=>'<option value=\\\"'+esc(item)+'\\\"></option>').join(''))+'</datalist><div class=\"muted\">\u4F8B\u5982\uFF1A'+esc((template.model_examples || ['anthropic/claude-sonnet-4']).join(' / '))+'</div></div>' +` +\n ` '<div><label>API</label><input data-field=\\\"api\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.api || model.api_base_url || '')+'\\\" placeholder=\\\"'+esc(template.api || 'https://...')+'\\\"></div>' +` +\n ` '<div><label>Key</label><input data-field=\\\"key\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.key || model.api_key || '')+'\\\" placeholder=\\\"'+esc(template.key_placeholder || 'sk-...')+'\\\"></div>' +` +\n ` '<div><label>Thinking</label><select data-field=\\\"thinking_profile\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"off\\\"'+(((model.thinking === 'off') || model.thinking?.mode === 'off') ? ' selected' : '')+'>off</option><option value=\\\"auto\\\"'+(((model.thinking === 'auto') || model.thinking?.mode === 'auto') ? ' selected' : '')+'>auto</option><option value=\\\"on\\\"'+(((model.thinking === 'on') || (model.thinking?.mode === 'on' && !model.thinking?.effort)) ? ' selected' : '')+'>on</option><option value=\\\"low\\\"'+(((model.thinking === 'low') || (model.thinking?.mode === 'on' && model.thinking?.effort === 'low' && !model.thinking?.budget_tokens)) ? ' selected' : '')+'>low</option><option value=\\\"medium\\\"'+(((model.thinking === 'medium') || (model.thinking?.mode === 'on' && model.thinking?.effort === 'medium' && !model.thinking?.budget_tokens)) ? ' selected' : '')+'>medium</option><option value=\\\"high\\\"'+(((model.thinking === 'high') || (model.thinking?.mode === 'on' && model.thinking?.effort === 'high' && !model.thinking?.budget_tokens)) ? ' selected' : '')+'>high</option><option value=\\\"custom\\\"'+(((typeof model.thinking === 'object') && model.thinking && model.thinking.budget_tokens) ? ' selected' : '')+'>custom</option></select></div>' +` +\n ` '<div><label>Thinking mode</label><select data-field=\\\"thinking_mode\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"off\\\"'+(model.thinking?.mode === 'off' ? ' selected' : '')+'>off</option><option value=\\\"auto\\\"'+(model.thinking?.mode === 'auto' ? ' selected' : '')+'>auto</option><option value=\\\"on\\\"'+(model.thinking?.mode === 'on' ? ' selected' : '')+'>on</option></select></div>' +` +\n ` '<div><label>Thinking effort</label><select data-field=\\\"thinking_effort\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"low\\\"'+(model.thinking?.effort === 'low' ? ' selected' : '')+'>low</option><option value=\\\"medium\\\"'+(model.thinking?.effort === 'medium' ? ' selected' : '')+'>medium</option><option value=\\\"high\\\"'+(model.thinking?.effort === 'high' ? ' selected' : '')+'>high</option></select></div>' +` +\n ` '<div><label>Thinking budget</label><input data-field=\\\"thinking_budget_tokens\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.thinking?.budget_tokens || '')+'\\\" placeholder=\\\"1024\\\"></div>' +` +\n ` '<div><label>Vendor hint</label><input data-field=\\\"vendor_hint\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(model.metadata?.vendor_hint || '')+'\\\" placeholder=\\\"'+esc(template.vendor_hint || 'openrouter')+'\\\"></div>' +` +\n ` '<div><label>Reasoning support</label><select data-field=\\\"supports_reasoning\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"true\\\"'+(model.metadata?.supports_reasoning === true ? ' selected' : '')+'>supported</option><option value=\\\"false\\\"'+(model.metadata?.supports_reasoning === false ? ' selected' : '')+'>disabled</option></select></div>' +` +\n ` '<div><label>Tool support</label><select data-field=\\\"supports_tools\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"true\\\"'+(model.metadata?.supports_tools === true ? ' selected' : '')+'>supported</option><option value=\\\"false\\\"'+(model.metadata?.supports_tools === false ? ' selected' : '')+'>disabled</option></select></div>' +` +\n ` '<div><label>Image support</label><select data-field=\\\"supports_images\\\" data-index=\\\"'+index+'\\\"><option value=\\\"\\\">default</option><option value=\\\"true\\\"'+(model.metadata?.supports_images === true ? ' selected' : '')+'>supported</option><option value=\\\"false\\\"'+(model.metadata?.supports_images === false ? ' selected' : '')+'>disabled</option></select></div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Metadata (advanced JSON)</label><textarea data-field=\\\"metadata\\\" data-index=\\\"'+index+'\\\" placeholder=\\\"{\\\\\\\"label\\\\\\\":\\\\\\\"Balanced profile\\\\\\\"}\\\">'+esc(model.metadata ? JSON.stringify(model.metadata, null, 2) : '')+'</textarea><div class=\"muted\">\u666E\u901A capability \u5EFA\u8BAE\u4F18\u5148\u4F7F\u7528\u4E0A\u9762\u7684\u663E\u5F0F\u5B57\u6BB5\uFF1B\u8FD9\u91CC\u4FDD\u7559\u7ED9\u9AD8\u7EA7\u6269\u5C55\u5143\u6570\u636E\u3002</div></div>' +` +\n ` '</div>' +` +\n ` '</div>'; }).join('');` +\n `}` +\n `function extractModelsFromForm(){` +\n ` const cards=Array.from(modelsFormGrid.querySelectorAll('[data-model-card]'));` +\n ` return cards.map((card,index)=>{` +\n ` const read=(field)=>card.querySelector('[data-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const providerTemplate=(read('provider_template')?.value || '').trim();` +\n ` const metadataRaw=(read('metadata')?.value || '').trim();` +\n ` let metadata;` +\n ` if(metadataRaw){ metadata=JSON.parse(metadataRaw); } else { metadata={}; }` +\n ` const thinkingProfile=(read('thinking_profile')?.value || '').trim();` +\n ` const vendorHint=(read('vendor_hint')?.value || '').trim();` +\n ` const supportsReasoning=(read('supports_reasoning')?.value || '').trim();` +\n ` const supportsTools=(read('supports_tools')?.value || '').trim();` +\n ` const supportsImages=(read('supports_images')?.value || '').trim();` +\n ` const thinking={};` +\n ` const mode=(read('thinking_mode')?.value || '').trim();` +\n ` const effort=(read('thinking_effort')?.value || '').trim();` +\n ` const budget=(read('thinking_budget_tokens')?.value || '').trim();` +\n ` if(mode) thinking.mode=mode;` +\n ` if(effort) thinking.effort=effort;` +\n ` if(budget) thinking.budget_tokens=Number(budget);` +\n ` const model={` +\n ` id:(read('id')?.value || '').trim(),` +\n ` api:(read('api')?.value || '').trim(),` +\n ` key:(read('key')?.value || '').trim(),` +\n ` interface:(read('interface')?.value || '').trim(),` +\n ` model:(read('model')?.value || '').trim(),` +\n ` };` +\n ` if(vendorHint){ metadata.vendor_hint=vendorHint; } else if(metadata && Object.prototype.hasOwnProperty.call(metadata,'vendor_hint')){ delete metadata.vendor_hint; }` +\n ` if(supportsReasoning){ metadata.supports_reasoning=supportsReasoning === 'true'; } else if(metadata && Object.prototype.hasOwnProperty.call(metadata,'supports_reasoning')){ delete metadata.supports_reasoning; }` +\n ` if(supportsTools){ metadata.supports_tools=supportsTools === 'true'; } else if(metadata && Object.prototype.hasOwnProperty.call(metadata,'supports_tools')){ delete metadata.supports_tools; }` +\n ` if(supportsImages){ metadata.supports_images=supportsImages === 'true'; } else if(metadata && Object.prototype.hasOwnProperty.call(metadata,'supports_images')){ delete metadata.supports_images; }` +\n ` if(providerTemplate){ model.provider_template=providerTemplate; }` +\n ` if(thinkingProfile && thinkingProfile !== 'custom'){ model.thinking=thinkingProfile; } else if(Object.keys(thinking).length){ model.thinking=thinking; }` +\n ` if(metadata !== undefined && Object.keys(metadata).length){ model.metadata=metadata; }` +\n ` return model;` +\n ` });` +\n `}` +\n `function applyProviderTemplate(index){` +\n ` const card=modelsFormGrid.querySelector('[data-model-card=\\\"'+index+'\\\"]');` +\n ` if(!card){ return; }` +\n ` const templateKey=(card.querySelector('[data-field=\\\"provider_template\\\"][data-index=\\\"'+index+'\\\"]')?.value || '').trim();` +\n ` const template=modelProviderTemplates[templateKey];` +\n ` if(!template){ return; }` +\n ` const modelInterface=card.querySelector('[data-field=\\\"interface\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const apiBaseUrl=card.querySelector('[data-field=\\\"api\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const modelInput=card.querySelector('[data-field=\\\"model\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(modelInterface){ modelInterface.value=template.interface || template.protocol; }` +\n ` if(apiBaseUrl && !apiBaseUrl.value.trim()){ apiBaseUrl.value=template.api || template.api_base_url; } else if(apiBaseUrl){ apiBaseUrl.value=template.api || template.api_base_url; }` +\n ` if(modelInput){ modelInput.placeholder=template.default_model || modelInput.placeholder; if(!modelInput.value.trim() && template.default_model){ modelInput.value=template.default_model; } }` +\n ` const modelIdInput=card.querySelector('[data-field=\\\"id\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(modelIdInput){ modelIdInput.placeholder=template.suggested_id || modelIdInput.placeholder; if(!modelIdInput.value.trim() && template.suggested_id){ modelIdInput.value=template.suggested_id; } }` +\n ` const keyInput=card.querySelector('[data-field=\\\"key\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(keyInput && template.key_placeholder){ keyInput.placeholder=template.key_placeholder; }` +\n ` const vendorHintInput=card.querySelector('[data-field=\\\"vendor_hint\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(vendorHintInput && template.vendor_hint){ vendorHintInput.placeholder=template.vendor_hint; }` +\n ` const thinkingProfile=card.querySelector('[data-field=\\\"thinking_profile\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` if(thinkingProfile && !thinkingProfile.value && template.default_thinking){ thinkingProfile.value=template.default_thinking; }` +\n ` const nextModels=extractModelsFromForm();` +\n ` if(nextModels[index]){ nextModels[index]={ ...nextModels[index], provider_template: templateKey }; }` +\n ` renderModelsForm(nextModels);` +\n `}` +\n `function renderTriggerRulesList(rules){` +\n ` const list=Array.isArray(rules) ? rules : [];` +\n ` if(!list.length){ triggerRulesList.innerHTML='<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No routing rules yet</span></div>'; return; }` +\n ` triggerRulesList.innerHTML=list.map((rule,index)=>'<div class=\"list-item\" data-trigger-rule=\\\"'+index+'\\\">' +` +\n ` '<div class=\"action-row\"><strong>Rule #'+(index+1)+'</strong><button type=\"button\" data-remove-trigger-rule=\\\"'+index+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\"list-item-grid\">' +` +\n ` '<div><label>Name</label><input data-trigger-field=\\\"name\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(rule.name || '')+'\\\"></div>' +` +\n ` '<div><label>Model</label><input data-trigger-field=\\\"model\\\" data-index=\\\"'+index+'\\\" list=\\\"triggerModelSuggestions'+index+'\\\" value=\\\"'+esc(rule.model || '')+'\\\">'+getModelIdSuggestionsMarkup('triggerModelSuggestions'+index)+'</div>' +` +\n ` '<div><label>Priority</label><input data-trigger-field=\\\"priority\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(rule.priority ?? 10)+'\\\"></div>' +` +\n ` '<div><label><input type=\\\"checkbox\\\" data-trigger-field=\\\"enabled\\\" data-index=\\\"'+index+'\\\"'+(rule.enabled === false ? '' : ' checked')+'> Enabled</label></div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Description</label><input data-trigger-field=\\\"description\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(rule.description || '')+'\\\"></div>' +` +\n ` '</div>' +` +\n ` '<div class=\\\"action-row\\\" style=\\\"margin-top:.75rem\\\"><strong>Patterns</strong><button type=\\\"button\\\" data-add-trigger-pattern=\\\"'+index+'\\\">\u65B0\u589E Pattern</button></div>' +` +\n ` '<div class=\\\"list-editor\\\">'+(((rule.patterns || []).length ? rule.patterns : [{ type:'exact', keywords:[] }]).map((pattern,patternIndex)=>'<div class=\\\"list-item\\\" data-trigger-pattern=\\\"'+index+'-'+patternIndex+'\\\">' +` +\n ` '<div class=\\\"action-row\\\"><span class=\\\"muted\\\">Pattern #'+(patternIndex+1)+'</span><span class=\\\"pill\\\">'+esc(pattern.type || 'exact')+'</span><span class=\\\"muted\\\">'+esc(getTriggerPatternValidationHint(pattern).message)+'</span><button type=\\\"button\\\" data-remove-trigger-pattern=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\\\"list-item-grid\\\">' +` +\n ` '<div><label>Type</label><select data-trigger-pattern-field=\\\"type\\\" data-index=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\"><option value=\\\"exact\\\"'+(pattern.type !== 'regex' ? ' selected' : '')+'>exact</option><option value=\\\"regex\\\"'+(pattern.type === 'regex' ? ' selected' : '')+'>regex</option></select></div>' +` +\n ` '<div><label><input type=\\\"checkbox\\\" data-trigger-pattern-field=\\\"caseSensitive\\\" data-index=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\"'+(pattern.caseSensitive ? ' checked' : '')+'> Case sensitive</label></div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><div class=\\\"action-row\\\"><label>Keywords</label><button type=\\\"button\\\" data-add-trigger-keyword=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\"'+(pattern.type === 'regex' ? ' disabled' : '')+'>\u65B0\u589E Keyword</button></div><div class=\\\"list-editor\\\">'+((((pattern.keywords || []).length ? pattern.keywords : ['']).map((keyword,keywordIndex)=>'<div class=\\\"list-item\\\" data-trigger-keyword=\\\"'+index+'-'+patternIndex+'-'+keywordIndex+'\\\"><div class=\\\"action-row\\\"><span class=\\\"muted\\\">Keyword #'+(keywordIndex+1)+'</span><button type=\\\"button\\\" data-remove-trigger-keyword=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\" data-keyword-index=\\\"'+keywordIndex+'\\\"'+(pattern.type === 'regex' ? ' disabled' : '')+'>\u5220\u9664</button></div><input data-trigger-pattern-field=\\\"keyword_item\\\" data-index=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\" data-keyword-index=\\\"'+keywordIndex+'\\\" value=\\\"'+esc(keyword || '')+'\\\" placeholder=\\\"keyword\\\"'+(pattern.type === 'regex' ? ' disabled' : '')+'></div>')).join(''))+'</div><div class=\\\"muted\\\">'+(pattern.type === 'regex' ? 'regex \u6A21\u5F0F\u4E0B\u5FFD\u7565 keywords' : 'exact \u6A21\u5F0F\u4E0B\u6309\u5173\u952E\u8BCD\u5217\u8868\u5339\u914D')+'</div></div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Regex pattern</label><input data-trigger-pattern-field=\\\"pattern\\\" data-index=\\\"'+index+'\\\" data-pattern-index=\\\"'+patternIndex+'\\\" value=\\\"'+esc(pattern.pattern || '')+'\\\" placeholder=\\\"error|exception\\\"'+(pattern.type === 'regex' ? '' : ' disabled')+'><div class=\\\"muted\\\">'+(pattern.type === 'regex' ? 'regex \u6A21\u5F0F\u4E0B\u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D' : 'exact \u6A21\u5F0F\u4E0B\u5FFD\u7565 regex pattern')+'</div></div>' +` +\n ` '</div>' +` +\n ` '</div>').join(''))+'</div>' +` +\n ` '</div>').join('');` +\n `}` +\n `function extractTriggerRulesFromForm(){` +\n ` return Array.from(triggerRulesList.querySelectorAll('[data-trigger-rule]')).map((card,index)=>{` +\n ` const read=(field)=>card.querySelector('[data-trigger-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const patterns=Array.from(card.querySelectorAll('[data-trigger-pattern]')).map((patternCard,patternIndex)=>{` +\n ` const patternRead=(field)=>patternCard.querySelector('[data-trigger-pattern-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"][data-pattern-index=\\\"'+patternIndex+'\\\"]');` +\n ` const type=(patternRead('type')?.value || 'exact').trim();` +\n ` const pattern={ type, caseSensitive:Boolean(patternRead('caseSensitive')?.checked) };` +\n ` const keywords=Array.from(patternCard.querySelectorAll('[data-trigger-pattern-field=\\\"keyword_item\\\"][data-index=\\\"'+index+'\\\"][data-pattern-index=\\\"'+patternIndex+'\\\"]')).map((node)=>node.value.trim()).filter(Boolean);` +\n ` const regexPattern=(patternRead('pattern')?.value || '').trim();` +\n ` if(type === 'regex'){ if(regexPattern){ pattern.pattern=regexPattern; } } else if(keywords.length){ pattern.keywords=keywords; }` +\n ` return pattern;` +\n ` });` +\n ` const rule={ name:(read('name')?.value || '').trim(), model:(read('model')?.value || '').trim(), priority:Number(read('priority')?.value || 10), enabled:Boolean(read('enabled')?.checked), patterns };` +\n ` const description=(read('description')?.value || '').trim(); if(description){ rule.description=description; } return rule;` +\n ` });` +\n `}` +\n `function renderSmartCandidatesList(candidates){` +\n ` const list=Array.isArray(candidates) ? candidates : [];` +\n ` if(!list.length){ smartCandidatesList.innerHTML='<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No smart candidates yet</span></div>'; return; }` +\n ` smartCandidatesList.innerHTML=list.map((candidate,index)=>'<div class=\"list-item\" data-smart-candidate=\\\"'+index+'\\\">' +` +\n ` '<div class=\"action-row\"><strong>Candidate #'+(index+1)+'</strong><button type=\"button\" data-remove-smart-candidate=\\\"'+index+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\"list-item-grid\">' +` +\n ` '<div><label>Model</label><input data-smart-field=\\\"model\\\" data-index=\\\"'+index+'\\\" list=\\\"smartModelSuggestions'+index+'\\\" value=\\\"'+esc(candidate.model || '')+'\\\">'+getModelIdSuggestionsMarkup('smartModelSuggestions'+index)+'</div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Description</label><input data-smart-field=\\\"description\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(candidate.description || '')+'\\\"></div>' +` +\n ` '</div>' +` +\n ` '</div>').join('');` +\n `}` +\n `function extractSmartCandidatesFromForm(){` +\n ` return Array.from(smartCandidatesList.querySelectorAll('[data-smart-candidate]')).map((card,index)=>{` +\n ` const read=(field)=>card.querySelector('[data-smart-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` return { model:(read('model')?.value || '').trim(), description:(read('description')?.value || '').trim() };` +\n ` });` +\n `}` +\n `function renderCascadeLevelsList(levels){` +\n ` const list=Array.isArray(levels) ? levels : [];` +\n ` if(!list.length){ governanceCascadeLevelsList.innerHTML='<div class=\"panel\" style=\"margin-bottom:0\"><span class=\"muted\">No cascade levels yet</span></div>'; return; }` +\n ` governanceCascadeLevelsList.innerHTML=list.map((level,index)=>'<div class=\"list-item\" data-cascade-level=\\\"'+index+'\\\">' +` +\n ` '<div class=\"action-row\"><strong>Level #'+(index+1)+'</strong><button type=\"button\" data-remove-cascade-level=\\\"'+index+'\\\">\u5220\u9664</button></div>' +` +\n ` '<div class=\"list-item-grid\">' +` +\n ` '<div><label>From</label><input data-cascade-field=\\\"from\\\" data-index=\\\"'+index+'\\\" list=\\\"cascadeFromSuggestions'+index+'\\\" value=\\\"'+esc(level.from || '')+'\\\">'+getModelIdSuggestionsMarkup('cascadeFromSuggestions'+index)+'</div>' +` +\n ` '<div><label>To</label><input data-cascade-field=\\\"to\\\" data-index=\\\"'+index+'\\\" list=\\\"cascadeToSuggestions'+index+'\\\" value=\\\"'+esc(level.to || '')+'\\\">'+getModelIdSuggestionsMarkup('cascadeToSuggestions'+index)+'</div>' +` +\n ` '<div style=\\\"grid-column:1/-1\\\"><label>Reason</label><input data-cascade-field=\\\"reason\\\" data-index=\\\"'+index+'\\\" value=\\\"'+esc(level.reason || '')+'\\\"></div>' +` +\n ` '</div>' +` +\n ` '</div>').join('');` +\n `}` +\n `function extractCascadeLevelsFromForm(){` +\n ` return Array.from(governanceCascadeLevelsList.querySelectorAll('[data-cascade-level]')).map((card,index)=>{` +\n ` const read=(field)=>card.querySelector('[data-cascade-field=\\\"'+field+'\\\"][data-index=\\\"'+index+'\\\"]');` +\n ` const level={ from:(read('from')?.value || '').trim(), to:(read('to')?.value || '').trim() };` +\n ` const reason=(read('reason')?.value || '').trim(); if(reason){ level.reason=reason; } return level;` +\n ` });` +\n `}` +\n `function buildDraftPayloadFromForm(){` +\n ` const payload=JSON.parse(JSON.stringify(currentDraftConfig || {}));` +\n ` payload.Models=extractModelsFromForm();` +\n ` const routerDefault=(draftRouterDefault.value || '').trim();` +\n ` if(routerDefault){ payload.Router={ ...(payload.Router || {}), default: routerDefault }; }` +\n ` else if(payload.Router){ delete payload.Router.default; if(!Object.keys(payload.Router).length){ delete payload.Router; } }` +\n ` const triggerRules=extractTriggerRulesFromForm();` +\n ` const smartCandidates=extractSmartCandidatesFromForm();` +\n ` const smartRouterEnabled=Boolean(smartEnabled.checked || triggerEnabled.checked || triggerIntentEnabled.checked || triggerIntentModel.value.trim() || triggerRules.length || smartRouterModel.value.trim() || smartCandidates.length || smartCacheTtl.value.trim() || smartMaxTokens.value.trim() || governanceAlignmentEnabled.checked || governanceSummarizerModel.value.trim() || governanceSemanticEnabled.checked || governanceClassifierModel.value.trim());` +\n ` if(smartRouterEnabled){ payload.SmartRouter={ ...(payload.SmartRouter || {}), enabled: true, analysis_scope: triggerAnalysisScope.value || payload.SmartRouter?.analysis_scope || 'last_message', router_model: smartRouterModel.value.trim(), fallback: smartFallback.value || 'default', candidates: smartCandidates, cache_ttl: smartCacheTtl.value.trim() ? Number(smartCacheTtl.value.trim()) : undefined, max_tokens: smartMaxTokens.value.trim() ? Number(smartMaxTokens.value.trim()) : undefined, rules: triggerRules, semantic:(governanceSemanticEnabled.checked || triggerIntentEnabled.checked || governanceClassifierModel.value.trim() || triggerIntentModel.value.trim()) ? { ...(((payload.SmartRouter || {}).semantic) || {}), enabled:Boolean(governanceSemanticEnabled.checked || triggerIntentEnabled.checked), mode:'classifier', classifier_model: governanceClassifierModel.value.trim() || triggerIntentModel.value.trim() } : undefined, sticky:(governanceAlignmentEnabled.checked || governanceSummarizerModel.value.trim()) ? { ...(((payload.SmartRouter || {}).sticky) || {}), enabled:true, alignment:{ ...((((payload.SmartRouter || {}).sticky || {}).alignment) || {}), enabled:Boolean(governanceAlignmentEnabled.checked), summarizer_model: governanceSummarizerModel.value.trim() } } : undefined }; } else { delete payload.SmartRouter; }` +\n ` delete payload.TriggerRouter;` +\n ` const cascadeLevels=extractCascadeLevelsFromForm();` +\n ` if(governanceEnabled.checked || governanceShadowEnabled.checked || governanceVerifierModel.value.trim() || cascadeLevels.length){ payload.Governance={ ...(payload.Governance || {}), enabled: governanceEnabled.checked, shadow:{ ...((payload.Governance && payload.Governance.shadow) || {}), enabled: governanceShadowEnabled.checked, verifier_model: governanceVerifierModel.value.trim() }, cascade:{ ...((payload.Governance && payload.Governance.cascade) || {}), enabled: Boolean(cascadeLevels.length), levels: cascadeLevels } }; } else { delete payload.Governance; }` +\n ` return payload;` +\n `}` +\n `function renderConfigControlForms(config){` +\n ` const smart=getDraftSmartRouterConfig(config);` +\n ` const trigger=config?.TriggerRouter || {};` +\n ` triggerEnabled.checked=Boolean(smart.enabled);` +\n ` triggerIntentEnabled.checked=Boolean(smart.semantic?.enabled && smart.semantic?.mode === 'classifier');` +\n ` triggerAnalysisScope.value=smart.analysis_scope || 'last_message';` +\n ` triggerIntentModel.value=smart.semantic?.classifier_model || trigger.intent_model || '';` +\n ` renderTriggerRulesList(smart.rules || trigger.rules || []);` +\n ` smartEnabled.checked=Boolean(smart.enabled);` +\n ` smartRouterModel.value=smart.router_model || '';` +\n ` smartFallback.value=smart.fallback || 'default';` +\n ` smartCacheTtl.value=smart.cache_ttl ?? '';` +\n ` smartMaxTokens.value=smart.max_tokens ?? '';` +\n ` renderSmartCandidatesList(smart.candidates || []);` +\n ` const governance=config?.Governance || {};` +\n ` governanceEnabled.checked=Boolean(governance.enabled);` +\n ` governanceAlignmentEnabled.checked=Boolean(smart.sticky?.alignment?.enabled);` +\n ` governanceSummarizerModel.value=smart.sticky?.alignment?.summarizer_model || '';` +\n ` governanceSemanticEnabled.checked=Boolean(smart.semantic?.enabled);` +\n ` governanceClassifierModel.value=smart.semantic?.classifier_model || '';` +\n ` governanceShadowEnabled.checked=Boolean(governance.shadow?.enabled);` +\n ` governanceVerifierModel.value=governance.shadow?.verifier_model || '';` +\n ` renderCascadeLevelsList(governance.cascade?.levels || []);` +\n `}` +\n `function syncDraftEditorFromForm(){` +\n ` try {` +\n ` const payload=buildDraftPayloadFromForm();` +\n ` currentDraftConfig=payload;` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` renderDraftSummary(payload);` +\n ` renderDraftValidation([],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u540C\u6B65 Models \u8868\u5355\u5230 JSON \u8349\u7A3F';` +\n ` } catch (error) {` +\n ` draftPreviewStatus.textContent='\u540C\u6B65\u5931\u8D25\uFF1A'+error.message;` +\n ` }` +\n `}` +\n `function applyReferenceSuggestion(path,modelId){` +\n ` if(!modelId){ return; }` +\n ` if(path==='Router.default'){ draftRouterDefault.value=modelId; syncDraftEditorFromForm(); draftPreviewStatus.textContent='\u5DF2\u5C06\u5EFA\u8BAE\u6A21\u578B\u5E94\u7528\u5230 Router.default'; return; }` +\n ` const payload=JSON.parse(JSON.stringify(currentDraftConfig || {}));` +\n ` const pathMatch=path.match(/^([^.\\[]+)(?:\\.(.+))?$/);` +\n ` if(!pathMatch){ draftPreviewStatus.textContent='\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u4FEE\u590D\uFF1A'+path; return; }` +\n ` const tokens=path.replace(/\\[(\\d+)\\]/g,'.$1').split('.');` +\n ` let cursor=payload;` +\n ` for(let i=0;i<tokens.length-1;i++){` +\n ` const token=tokens[i];` +\n ` const nextToken=tokens[i+1];` +\n ` if(cursor[token] === undefined){ cursor[token]=String(Number(nextToken))===nextToken ? [] : {}; }` +\n ` cursor=cursor[token];` +\n ` }` +\n ` cursor[tokens[tokens.length-1]]=modelId;` +\n ` currentDraftConfig=payload;` +\n ` if(payload.Router?.default){ draftRouterDefault.value=payload.Router.default; }` +\n ` renderConfigControlForms(payload);` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` renderDraftSummary(payload);` +\n ` renderDraftValidation([],[]);` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u5C06\u5EFA\u8BAE\u6A21\u578B\u5E94\u7528\u5230 '+path+'\uFF0C\u53EF\u91CD\u65B0\u9884\u89C8\u9A8C\u8BC1';` +\n `}` +\n `function applyCapabilityWarningSuggestion(path,code){` +\n ` const payload=JSON.parse(JSON.stringify(currentDraftConfig || {}));` +\n ` const tokens=String(path || '').replace(/\\[(\\d+)\\]/g,'.$1').split('.').filter(Boolean);` +\n ` if(!tokens.length){ draftPreviewStatus.textContent='\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u4FEE\u590D\u8BE5 warning'; return; }` +\n ` let cursor=payload;` +\n ` for(let i=0;i<tokens.length-1;i++){ if(cursor == null){ break; } cursor=cursor[tokens[i]]; }` +\n ` const lastToken=tokens[tokens.length-1];` +\n ` if(code==='thinking_ignored'){` +\n ` if(cursor && Object.prototype.hasOwnProperty.call(cursor,lastToken)){ delete cursor[lastToken]; }` +\n ` } else if(code==='tools_text_fallback' || code==='images_text_fallback'){` +\n ` if(cursor && Object.prototype.hasOwnProperty.call(cursor,lastToken)){ delete cursor[lastToken]; }` +\n ` if(cursor && !Object.keys(cursor).length){` +\n ` const parentTokens=tokens.slice(0,-1);` +\n ` const maybeMetadataKey=parentTokens[parentTokens.length-1];` +\n ` if(maybeMetadataKey==='metadata'){` +\n ` let parentCursor=payload;` +\n ` for(let i=0;i<parentTokens.length-1;i++){ if(parentCursor == null){ break; } parentCursor=parentCursor[parentTokens[i]]; }` +\n ` if(parentCursor && Object.prototype.hasOwnProperty.call(parentCursor,'metadata')){ delete parentCursor.metadata; }` +\n ` }` +\n ` }` +\n ` } else {` +\n ` draftPreviewStatus.textContent='\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u4FEE\u590D\u8BE5 warning';` +\n ` return;` +\n ` }` +\n ` currentDraftConfig=payload;` +\n ` renderModelsForm(payload.Models || []);` +\n ` renderConfigControlForms(payload);` +\n ` draftRouterDefault.value=payload.Router?.default || '';` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` renderDraftSummary(payload);` +\n ` renderDraftValidation([],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u5E94\u7528 warning \u4FEE\u6B63\uFF1A'+code+'\uFF0C\u53EF\u91CD\u65B0\u9884\u89C8\u9A8C\u8BC1';` +\n `}` +\n `function renderCompiledDiff(diff){` +\n ` const summary=diff?.summary || {};` +\n ` compiledDiffSummary.innerHTML=[` +\n \" ['Added providers', summary.addedProviders ?? 0],\" +\n \" ['Removed providers', summary.removedProviders ?? 0],\" +\n \" ['Changed providers', summary.changedProviders ?? 0],\" +\n \" ['Added models', summary.addedModels ?? 0],\" +\n \" ['Removed models', summary.removedModels ?? 0],\" +\n \" ['Changed models', summary.changedModels ?? 0]\" +\n ` ].map(([label,value])=>'<div class=\\\"diff-chip\\\"><span class=\\\"muted\\\">'+esc(label)+'</span><strong>'+esc(value)+'</strong></div>').join('');` +\n ` const rows=[` +\n ` ...((diff?.providerChanges || []).map(item=>({ scope:'provider', key:item.name, type:item.type, fields:item.fields || [], target:item.after || item.before || {} }))),` +\n ` ...((diff?.modelChanges || []).map(item=>({ scope:'model', key:item.modelId, type:item.type, fields:item.fields || [], target:item.after || item.before || {} }))),` +\n ` ];` +\n ` compiledDiffTableBody.innerHTML=rows.length ? rows.map(item=>'<tr>' +` +\n ` '<td>'+esc(item.scope)+'</td>' +` +\n ` '<td>'+esc(item.type)+'</td>' +` +\n ` '<td><code>'+esc(item.key)+'</code></td>' +` +\n ` '<td>'+esc(item.fields.join(', ') || '-')+'</td>' +` +\n ` '<td><code>'+esc(item.target.providerName || item.target.name || '-')+'</code><div class=\"muted\">'+esc(item.target.modelName || (item.target.models || []).join(', ') || '-')}</div></td>' +` +\n ` '</tr>').join('') : '<tr><td colspan=\"5\" class=\"muted\">No compiled registry changes</td></tr>';` +\n `}` +\n `function renderReferenceImpact(impact){` +\n ` const summary=impact?.summary || {};` +\n ` referenceImpactSummary.innerHTML=[` +\n \" ['Total refs', summary.total ?? 0],\" +\n \" ['modelId refs', summary.modelIdRefs ?? 0],\" +\n \" ['Legacy refs', summary.legacyRefs ?? 0],\" +\n \" ['Valid modelIds', summary.validModelIds ?? 0],\" +\n \" ['Missing modelIds', summary.missingModelIds ?? 0]\" +\n ` ].map(([label,value])=>'<div class=\\\"diff-chip\\\"><span class=\\\"muted\\\">'+esc(label)+'</span><strong>'+esc(value)+'</strong></div>').join('');` +\n ` const entries=impact?.entries || [];` +\n ` referenceImpactTableBody.innerHTML=entries.length ? entries.map(item=>'<tr>' +` +\n ` '<td><code>'+esc(item.path)+'</code></td>' +` +\n ` '<td><code>'+esc(item.value)+'</code></td>' +` +\n ` '<td>'+esc(item.referenceType)+'</td>' +` +\n ` '<td>'+esc(item.status)+'</td>' +` +\n ` '<td><code>'+esc(item.resolvedTarget?.providerName || '-')+'</code><div class=\"muted\">'+esc(item.resolvedTarget?.modelName || '-')}</div></td>' +` +\n ` '<td>'+((item.suggestions || []).length ? item.suggestions.map(s=>'<div><code>'+esc(s.modelId)+'</code><div class=\"muted\">'+esc(s.modelName || '-')+'</div><button type=\"button\" data-apply-reference-path=\\\"'+esc(item.path)+'\\\" data-apply-reference-model=\\\"'+esc(s.modelId)+'\\\">\u5E94\u7528\u5EFA\u8BAE</button></div>').join('') : '<span class=\"muted\">-</span>')+'</td>' +` +\n ` '</tr>').join('') : '<tr><td colspan=\"6\" class=\"muted\">No model references found</td></tr>';` +\n `}` +\n `function renderCompiledModels(data){` +\n ` const providers=Array.isArray(data.providers) ? data.providers : [];` +\n ` const modelMapEntries=Object.entries(data.modelMap || {});` +\n ` knownModelIds=modelMapEntries.map(([modelId])=>modelId).sort();` +\n ` updateTopLevelModelSuggestionLists();` +\n ` renderCapabilityWarnings(data.capabilityWarnings);` +\n ` compiledModelsStatus.textContent='\u5DF2\u52A0\u8F7D '+providers.length+' \u4E2A compiled provider / '+modelMapEntries.length+' \u4E2A modelId \u6620\u5C04';` +\n ` compiledProvidersTableBody.innerHTML=providers.length ? providers.map(provider=>'<tr>' +` +\n ` '<td><code>'+esc(provider.name)+'</code><div class=\"muted\">'+esc(provider.api_base_url || '-')+'</div></td>' +` +\n ` '<td>'+esc(provider.transformer?.use?.[0] || '-')+'</td>' +` +\n ` '<td>'+esc((provider.models || []).join(', ') || '-')+'</td>' +` +\n ` '<td>'+esc(JSON.stringify(provider.transformer || {}))+'</td>' +` +\n ` '<td>'+esc(provider.has_api_key ? 'configured' : 'missing')+'</td>' +` +\n ` '</tr>').join('') : '<tr><td colspan=\"5\" class=\"muted\">No compiled providers</td></tr>';` +\n ` compiledModelMapTableBody.innerHTML=modelMapEntries.length ? modelMapEntries.map(([modelId,item])=>'<tr>' +` +\n ` '<td><code>'+esc(modelId)+'</code></td>' +` +\n ` '<td><code>'+esc(item.providerName || '-')+'</code><div class=\"muted\">'+esc(item.modelName || '-')+'</div></td>' +` +\n ` '<td>'+esc(item.protocol || '-')+'</td>' +` +\n ` '<td>'+esc(item.compatibilityProfile || '-')+'</td>' +` +\n ` '<td>'+esc(item.dispatchFormat || '-')+'</td>' +` +\n ` '<td><code>'+esc(JSON.stringify(item.thinking || { mode: 'off' }))+'</code></td>' +` +\n ` '<td><code>'+esc(JSON.stringify(item.capabilities || {}))+'</code></td>' +` +\n ` '<td>'+esc(item.source || '-')+'</td>' +` +\n ` '</tr>').join('') : '<tr><td colspan=\"8\" class=\"muted\">No compiled model map</td></tr>';` +\n ` if(data.diff){ renderCompiledDiff(data.diff); }` +\n ` if(data.referenceImpact){ renderReferenceImpact(data.referenceImpact); }` +\n ` renderConfigControlForms(currentDraftConfig);` +\n `}` +\n `async function loadConfigDraft(){` +\n ` draftPreviewStatus.textContent='\u52A0\u8F7D\u5F53\u524D\u914D\u7F6E\u4E2D...';` +\n ` const res=await fetch('/api/config');` +\n ` const data=await res.json();` +\n ` currentDraftConfig=data || {};` +\n ` renderModelsForm(currentDraftConfig.Models || []);` +\n ` renderConfigControlForms(currentDraftConfig);` +\n ` draftRouterDefault.value=currentDraftConfig.Router?.default || '';` +\n ` configDraftEditor.value=JSON.stringify(data,null,2);` +\n ` renderDraftSummary(currentDraftConfig);` +\n ` renderDraftValidation([],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u8F7D\u5165\u5F53\u524D\u914D\u7F6E\uFF0C\u53EF\u901A\u8FC7 Models \u8868\u5355\u6216 JSON \u8349\u7A3F\u7F16\u8F91';` +\n `}` +\n `async function previewConfigDraft(){` +\n ` let payload;` +\n ` try {` +\n ` payload=buildDraftPayloadFromForm();` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` } catch (error) {` +\n ` renderDraftValidation(['JSON parse error: '+error.message],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u8349\u7A3F\u89E3\u6790\u5931\u8D25\uFF1A'+error.message;` +\n ` return;` +\n ` }` +\n ` draftPreviewStatus.textContent='\u9884\u89C8\u7F16\u8BD1\u7ED3\u679C\u4E2D...';` +\n ` const res=await fetch('/api/models/compiled/preview',{` +\n ` method:'POST',` +\n ` headers:{'Content-Type':'application/json'},` +\n ` body:JSON.stringify(payload)` +\n ` });` +\n ` const data=await res.json();` +\n ` if(!res.ok){` +\n ` draftPreviewStatus.textContent='\u9884\u89C8\u5931\u8D25\uFF1A'+((data.errors || []).join('; ') || data.message || 'unknown error');` +\n ` renderDraftValidation(data.errors || [data.message || 'unknown error'], data.warnings || []);` +\n ` renderCapabilityWarnings(data.capabilityWarnings);` +\n ` renderCompiledDiff();` +\n ` renderReferenceImpact(data.referenceImpact);` +\n ` renderDraftPreviewMeta();` +\n ` return;` +\n ` }` +\n ` renderDraftValidation([], data.warnings || []);` +\n ` renderCompiledModels(data);` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u9884\u89C8\u5B8C\u6210\uFF1A\u5DF2\u6309\u8349\u7A3F\u914D\u7F6E\u5237\u65B0 compiled models';` +\n `}` +\n `async function saveConfigDraft(){` +\n ` let payload;` +\n ` try {` +\n ` payload=buildDraftPayloadFromForm();` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` } catch (error) {` +\n ` renderDraftValidation(['JSON parse error: '+error.message],[]);` +\n ` renderCapabilityWarnings();` +\n ` draftPreviewStatus.textContent='\u4FDD\u5B58\u5931\u8D25\uFF1A'+error.message;` +\n ` return;` +\n ` }` +\n ` draftPreviewStatus.textContent='\u4FDD\u5B58\u914D\u7F6E\u4E2D...';` +\n ` const res=await fetch('/api/config',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(payload) });` +\n ` const data=await res.json();` +\n ` renderDraftValidation(data.errors || [], data.warnings || []);` +\n ` if(!res.ok){` +\n ` draftPreviewStatus.textContent='\u4FDD\u5B58\u5931\u8D25\uFF1A'+((data.errors || []).join('; ') || data.message || 'unknown error');` +\n ` return;` +\n ` }` +\n ` currentDraftConfig=payload;` +\n ` await loadCompiledModels();` +\n ` draftPreviewStatus.textContent='\u5DF2\u4FDD\u5B58\u914D\u7F6E'+((data.warnings || []).length ? ('\uFF08\u542B '+data.warnings.length+' \u6761 warning\uFF09') : '');` +\n `}` +\n `function addDraftModel(){` +\n ` const nextModels=extractModelsFromForm();` +\n ` nextModels.push(createDraftModelFromTemplate(defaultProviderTemplateKey));` +\n ` renderModelsForm(nextModels);` +\n ` syncDraftEditorFromForm();` +\n `}` +\n `function addTriggerRule(){ const next=extractTriggerRulesFromForm(); next.push({ name:'', enabled:true, priority:10, model:'', patterns:[{ type:'exact', keywords:[] }] }); renderTriggerRulesList(next); syncDraftEditorFromForm(); }` +\n `function addTriggerPattern(ruleIndex){ const next=extractTriggerRulesFromForm(); if(!next[ruleIndex]){ return; } next[ruleIndex].patterns = Array.isArray(next[ruleIndex].patterns) ? next[ruleIndex].patterns : []; next[ruleIndex].patterns.push({ type:'exact', keywords:[] }); renderTriggerRulesList(next); syncDraftEditorFromForm(); }` +\n `function addTriggerKeyword(ruleIndex,patternIndex){ const next=extractTriggerRulesFromForm(); if(!next[ruleIndex] || !next[ruleIndex].patterns || !next[ruleIndex].patterns[patternIndex]){ return; } const pattern=next[ruleIndex].patterns[patternIndex]; pattern.keywords=Array.isArray(pattern.keywords) ? pattern.keywords : []; pattern.keywords.push(''); renderTriggerRulesList(next); syncDraftEditorFromForm(); }` +\n `function addSmartCandidate(){ const next=extractSmartCandidatesFromForm(); next.push({ model:'', description:'' }); renderSmartCandidatesList(next); syncDraftEditorFromForm(); }` +\n `function addCascadeLevel(){ const next=extractCascadeLevelsFromForm(); next.push({ from:'', to:'' }); renderCascadeLevelsList(next); syncDraftEditorFromForm(); }` +\n `modelsFormGrid.addEventListener('input',()=>syncDraftEditorFromForm());` +\n `modelsFormGrid.addEventListener('change',()=>syncDraftEditorFromForm());` +\n `modelsFormGrid.addEventListener('click',(e)=>{ const applyBtn=e.target.closest('button[data-apply-template]'); if(applyBtn){ const applyIndex=Number(applyBtn.dataset.applyTemplate); applyProviderTemplate(applyIndex); syncDraftEditorFromForm(); return; } const btn=e.target.closest('button[data-remove-model]'); if(!btn){ return; } const removeIndex=Number(btn.dataset.removeModel); const nextModels=extractModelsFromForm().filter((_,index)=>index!==removeIndex); renderModelsForm(nextModels); syncDraftEditorFromForm(); });` +\n `triggerRulesList.addEventListener('input',()=>syncDraftEditorFromForm());` +\n `triggerRulesList.addEventListener('change',()=>syncDraftEditorFromForm());` +\n `triggerRulesList.addEventListener('click',(e)=>{ const addKeywordBtn=e.target.closest('button[data-add-trigger-keyword]'); if(addKeywordBtn){ addTriggerKeyword(Number(addKeywordBtn.dataset.addTriggerKeyword), Number(addKeywordBtn.dataset.patternIndex)); return; } const removeKeywordBtn=e.target.closest('button[data-remove-trigger-keyword]'); if(removeKeywordBtn){ const ruleIndex=Number(removeKeywordBtn.dataset.removeTriggerKeyword); const patternIndex=Number(removeKeywordBtn.dataset.patternIndex); const keywordIndex=Number(removeKeywordBtn.dataset.keywordIndex); const next=extractTriggerRulesFromForm(); if(next[ruleIndex] && next[ruleIndex].patterns && next[ruleIndex].patterns[patternIndex]){ const pattern=next[ruleIndex].patterns[patternIndex]; pattern.keywords=(pattern.keywords || []).filter((_,index)=>index!==keywordIndex); if(!pattern.keywords.length){ pattern.keywords=['']; } renderTriggerRulesList(next); syncDraftEditorFromForm(); } return; } const addBtn=e.target.closest('button[data-add-trigger-pattern]'); if(addBtn){ addTriggerPattern(Number(addBtn.dataset.addTriggerPattern)); return; } const removePatternBtn=e.target.closest('button[data-remove-trigger-pattern]'); if(removePatternBtn){ const ruleIndex=Number(removePatternBtn.dataset.removeTriggerPattern); const patternIndex=Number(removePatternBtn.dataset.patternIndex); const next=extractTriggerRulesFromForm(); if(next[ruleIndex]){ next[ruleIndex].patterns=(next[ruleIndex].patterns || []).filter((_,index)=>index!==patternIndex); if(!next[ruleIndex].patterns.length){ next[ruleIndex].patterns=[{ type:'exact', keywords:[] }]; } renderTriggerRulesList(next); syncDraftEditorFromForm(); } return; } const btn=e.target.closest('button[data-remove-trigger-rule]'); if(!btn){ return; } const next=extractTriggerRulesFromForm().filter((_,index)=>index!==Number(btn.dataset.removeTriggerRule)); renderTriggerRulesList(next); syncDraftEditorFromForm(); });` +\n `smartCandidatesList.addEventListener('input',()=>syncDraftEditorFromForm());` +\n `smartCandidatesList.addEventListener('change',()=>syncDraftEditorFromForm());` +\n `smartCandidatesList.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-remove-smart-candidate]'); if(!btn){ return; } const next=extractSmartCandidatesFromForm().filter((_,index)=>index!==Number(btn.dataset.removeSmartCandidate)); renderSmartCandidatesList(next); syncDraftEditorFromForm(); });` +\n `governanceCascadeLevelsList.addEventListener('input',()=>syncDraftEditorFromForm());` +\n `governanceCascadeLevelsList.addEventListener('change',()=>syncDraftEditorFromForm());` +\n `governanceCascadeLevelsList.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-remove-cascade-level]'); if(!btn){ return; } const next=extractCascadeLevelsFromForm().filter((_,index)=>index!==Number(btn.dataset.removeCascadeLevel)); renderCascadeLevelsList(next); syncDraftEditorFromForm(); });` +\n `referenceImpactTableBody.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-apply-reference-path]'); if(!btn){ return; } applyReferenceSuggestion(btn.dataset.applyReferencePath, btn.dataset.applyReferenceModel); });` +\n `draftValidationList.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-validation-path]'); if(!btn){ return; } jumpToValidationPath(btn.dataset.validationPath); });` +\n `capabilityWarningsList.addEventListener('click',(e)=>{ const applyBtn=e.target.closest('button[data-apply-warning-path]'); if(applyBtn){ applyCapabilityWarningSuggestion(applyBtn.dataset.applyWarningPath, applyBtn.dataset.applyWarningCode); return; } const btn=e.target.closest('button[data-validation-path]'); if(!btn){ return; } jumpToValidationPath(btn.dataset.validationPath); });` +\n `draftRouterDefault.addEventListener('input',syncDraftEditorFromForm);` +\n `[triggerEnabled,triggerIntentEnabled,triggerAnalysisScope,triggerIntentModel,smartEnabled,smartRouterModel,smartFallback,smartCacheTtl,smartMaxTokens,governanceEnabled,governanceAlignmentEnabled,governanceSummarizerModel,governanceSemanticEnabled,governanceClassifierModel,governanceShadowEnabled,governanceVerifierModel].forEach(el=>{ el.addEventListener('input',syncDraftEditorFromForm); el.addEventListener('change',syncDraftEditorFromForm); });` +\n `function renderMetrics(metrics){` +\n ` metricsGrid.innerHTML=[` +\n \" ['Recent traces', metrics.totalTraces ?? 0],\" +\n \" ['Sticky hit rate', pct(metrics.stickyHitRate)],\" +\n \" ['Cascade rate', pct(metrics.cascadeTriggeredRate)],\" +\n \" ['Shadow rate', pct(metrics.shadowCheckedRate)],\" +\n \" ['Alignment rate', pct(metrics.alignmentUsedRate)],\" +\n \" ['Avg latency', fmt(metrics.averageLatencyMs)+' ms']\" +\n ` ].map(([label,value])=>'<div class=\\\"stat\\\"><span class=\\\"muted\\\">'+esc(label)+'</span><strong>'+esc(value)+'</strong></div>').join('');` +\n `}` +\n `function buildPresetPayload(presetName){` +\n ` const preset=draftPresets[presetName];` +\n ` if(!preset){ return null; }` +\n ` const overwriteMode=draftPresetMode.value === 'replace';` +\n ` const payload=buildDraftPayloadFromForm();` +\n ` if(overwriteMode){ delete payload.TriggerRouter; delete payload.SmartRouter; delete payload.Governance; }` +\n ` if(preset.routerDefault){ payload.Router={ ...(payload.Router || {}), default: resolvePresetModelId(preset.routerDefault) }; }` +\n ` if(preset.triggerEnabled !== undefined || preset.triggerRules){ payload.SmartRouter={ ...(payload.SmartRouter || {}), enabled: preset.triggerEnabled !== undefined ? Boolean(preset.triggerEnabled) : Boolean(payload.SmartRouter?.enabled), analysis_scope: payload.SmartRouter?.analysis_scope || 'last_message', router_model: payload.SmartRouter?.router_model || '', fallback: payload.SmartRouter?.fallback || 'default', candidates: payload.SmartRouter?.candidates || [], cache_ttl: payload.SmartRouter?.cache_ttl, max_tokens: payload.SmartRouter?.max_tokens, rules: preset.triggerRules ? preset.triggerRules.map(rule=>({ ...rule, model: resolvePresetModelId(rule.model) })) : (payload.SmartRouter?.rules || []) }; delete payload.TriggerRouter; }` +\n ` if(preset.smartEnabled !== undefined || preset.smartCandidates){ payload.SmartRouter={ ...(payload.SmartRouter || {}), enabled: preset.smartEnabled !== undefined ? Boolean(preset.smartEnabled) : Boolean(payload.SmartRouter?.enabled), router_model: payload.SmartRouter?.router_model || '', fallback: payload.SmartRouter?.fallback || 'default', candidates: preset.smartCandidates ? preset.smartCandidates.map(item=>({ ...item, model: resolvePresetModelId(item.model) })) : (payload.SmartRouter?.candidates || []), cache_ttl: payload.SmartRouter?.cache_ttl, max_tokens: payload.SmartRouter?.max_tokens, rules: payload.SmartRouter?.rules || [] }; }` +\n ` if(preset.governanceEnabled !== undefined || preset.governanceAlignmentEnabled !== undefined || preset.governanceSemanticEnabled !== undefined || preset.governanceShadowEnabled !== undefined || preset.governanceSummarizerModel !== undefined || preset.governanceClassifierModel !== undefined || preset.governanceVerifierModel !== undefined){ payload.SmartRouter={ ...(payload.SmartRouter || {}), enabled: payload.SmartRouter?.enabled !== undefined ? Boolean(payload.SmartRouter?.enabled) : Boolean(preset.governanceEnabled), sticky:{ ...((payload.SmartRouter && payload.SmartRouter.sticky) || {}), enabled: preset.governanceAlignmentEnabled !== undefined ? Boolean(preset.governanceAlignmentEnabled) : Boolean(payload.SmartRouter?.sticky?.enabled), alignment:{ ...(((payload.SmartRouter && payload.SmartRouter.sticky && payload.SmartRouter.sticky.alignment) || {})), enabled: preset.governanceAlignmentEnabled !== undefined ? Boolean(preset.governanceAlignmentEnabled) : Boolean(payload.SmartRouter?.sticky?.alignment?.enabled), summarizer_model: preset.governanceSummarizerModel !== undefined ? resolvePresetModelId(preset.governanceSummarizerModel) : (payload.SmartRouter?.sticky?.alignment?.summarizer_model || '') } }, semantic:{ ...((payload.SmartRouter && payload.SmartRouter.semantic) || {}), enabled: preset.governanceSemanticEnabled !== undefined ? Boolean(preset.governanceSemanticEnabled) : Boolean(payload.SmartRouter?.semantic?.enabled), mode:(payload.SmartRouter?.semantic?.mode || 'classifier'), classifier_model: preset.governanceClassifierModel !== undefined ? resolvePresetModelId(preset.governanceClassifierModel) : (payload.SmartRouter?.semantic?.classifier_model || '') } }; payload.Governance={ ...(payload.Governance || {}), enabled: preset.governanceEnabled !== undefined ? Boolean(preset.governanceEnabled) : Boolean(payload.Governance?.enabled), shadow:{ ...((payload.Governance && payload.Governance.shadow) || {}), enabled: preset.governanceShadowEnabled !== undefined ? Boolean(preset.governanceShadowEnabled) : Boolean(payload.Governance?.shadow?.enabled), verifier_model: preset.governanceVerifierModel !== undefined ? resolvePresetModelId(preset.governanceVerifierModel) : (payload.Governance?.shadow?.verifier_model || '') } }; }` +\n ` return payload;` +\n `}` +\n `function applyDraftPreset(presetName){` +\n ` const payload=buildPresetPayload(presetName);` +\n ` if(!payload){ return; }` +\n ` currentDraftConfig=payload;` +\n ` renderModelsForm(payload.Models || []);` +\n ` renderConfigControlForms(payload);` +\n ` draftRouterDefault.value=payload.Router?.default || '';` +\n ` configDraftEditor.value=JSON.stringify(payload,null,2);` +\n ` renderDraftSummary(payload);` +\n ` renderDraftValidation([],[]);` +\n ` renderCapabilityWarnings();` +\n ` renderDraftPreviewMeta();` +\n ` draftPreviewStatus.textContent='\u5DF2\u5E94\u7528\u9884\u8BBE\uFF1A'+presetName+'\uFF08'+(draftPresetMode.value === 'replace' ? 'overwrite' : 'append / merge')+'\uFF09';` +\n `}` +\n `async function previewDraftPreset(presetName){` +\n ` const payload=buildPresetPayload(presetName);` +\n ` if(!payload){ return; }` +\n ` const preset=draftPresets[presetName];` +\n ` const modeLabel=draftPresetMode.value === 'replace' ? 'overwrite' : 'append / merge';` +\n ` renderDraftPreviewMeta({ title:'Preset dry-run', description:(preset?.label || presetName)+' \u4EC5\u9884\u89C8\uFF0C\u4E0D\u4F1A\u5199\u56DE\u5F53\u524D\u8349\u7A3F\u3002', affects:preset?.affects || [], actualAffects:[], mode:modeLabel });` +\n ` draftPreviewStatus.textContent='\u9884\u89C8\u9884\u8BBE\u4E2D\uFF1A'+presetName;` +\n ` const res=await fetch('/api/models/compiled/preview',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(payload) });` +\n ` const data=await res.json();` +\n ` if(!res.ok){ renderDraftValidation(data.errors || [data.message || 'unknown error'], data.warnings || []); renderCapabilityWarnings(data.capabilityWarnings); renderCompiledDiff(); renderReferenceImpact(data.referenceImpact); renderDraftPreviewMeta({ title:'Preset dry-run', description:(preset?.label || presetName)+' \u9884\u89C8\u5931\u8D25\uFF0C\u4EE5\u4E0B\u4E3A\u5F53\u524D\u9884\u89C8\u5C1D\u8BD5\u547D\u4E2D\u7684\u533A\u57DF\u3002', affects:preset?.affects || [], actualAffects:deriveActualAffectedAreas(data), mode:modeLabel }); draftPreviewStatus.textContent='\u9884\u8BBE\u9884\u89C8\u5931\u8D25\uFF1A'+((data.errors || []).join('; ') || data.message || 'unknown error'); return; }` +\n ` renderDraftValidation([], data.warnings || []);` +\n ` renderCompiledModels(data);` +\n ` renderDraftPreviewMeta({ title:'Preset dry-run', description:(preset?.label || presetName)+' \u4EC5\u9884\u89C8\uFF0C\u4E0D\u4F1A\u5199\u56DE\u5F53\u524D\u8349\u7A3F\u3002', affects:preset?.affects || [], actualAffects:deriveActualAffectedAreas(data), mode:modeLabel });` +\n ` draftPreviewStatus.textContent='\u5DF2\u9884\u89C8\u9884\u8BBE\uFF1A'+presetName+'\uFF08\u672A\u5199\u56DE\u8349\u7A3F\uFF09';` +\n `}` +\n `function renderRanking(target,entries,emptyLabel){` +\n ` if(!entries || !entries.length){ target.innerHTML='<li><span class=\"muted\">'+esc(emptyLabel)+'</span><strong>0</strong></li>'; return; }` +\n ` target.innerHTML=entries.map(item=>'<li><span><code>'+esc(item.key)+'</code></span><strong>'+esc(item.count)+' \u00B7 '+esc(pct(item.rate))+'</strong></li>').join('');` +\n `}` +\n `function renderAnomalies(anomalies){` +\n ` if(!anomalies || !anomalies.length){ anomalyList.innerHTML='<div class=\"alert info\"><strong>No active alerts</strong><div class=\"muted\">\u5F53\u524D\u7A97\u53E3\u672A\u53D1\u73B0\u660E\u663E\u6CBB\u7406\u5F02\u5E38</div></div>'; return; }` +\n ` anomalyList.innerHTML=anomalies.map(item=>'<div class=\"alert '+esc(item.severity || 'info')+'\"><strong>'+esc(item.type)+'</strong><div>'+esc(item.message)+'</div></div>').join('');` +\n `}` +\n `function renderBuckets(report){` +\n ` const buckets=report.buckets || [];` +\n ` const windowMs=Number(report.windowMs || 0);` +\n ` bucketHint.textContent=windowMs ? ('\u6700\u8FD1 '+Math.round(windowMs / 60000)+' \u5206\u949F\uFF0C\u5171 '+(report.bucketCount || buckets.length || 0)+' \u6876') : '\u5F53\u524D\u672A\u542F\u7528\u65F6\u95F4\u7A97';` +\n ` if(!buckets.length){ bucketGrid.innerHTML='<div class=\"stat\"><span class=\"muted\">No bucket data</span><strong>0</strong></div>'; return; }` +\n ` bucketGrid.innerHTML=buckets.map(bucket=>` +\n \" '<div class=\\\"stat\\\">'+\"\n + \"'<span class=\\\"muted\\\">'+esc(shortTime(bucket.bucketStart))+' - '+esc(shortTime(bucket.bucketEnd))+'</span>'+\"\n + \"'<strong>'+esc(bucket.metrics.totalTraces)+'</strong>'+\"\n + \"'<div class=\\\"muted\\\">sticky '+esc(pct(bucket.metrics.stickyHitRate))+' / cascade '+esc(pct(bucket.metrics.cascadeTriggeredRate))+'</div>'+\"\n + \"'</div>'\"\n + `).join('');` +\n `}` +\n `function renderTrendTable(report){` +\n ` const buckets=report.buckets || [];` +\n ` if(!buckets.length){ trendTableBody.innerHTML='<tr><td colspan=\"6\" class=\"muted\">No trend data</td></tr>'; return; }` +\n ` trendTableBody.innerHTML=buckets.map(bucket=>'<tr>' +` +\n ` '<td>'+esc(shortTime(bucket.bucketStart))+' - '+esc(shortTime(bucket.bucketEnd))+'</td>' +` +\n ` '<td>'+esc(bucket.metrics.totalTraces)+'</td>' +` +\n ` '<td>'+esc(pct(bucket.metrics.stickyHitRate))+'</td>' +` +\n ` '<td>'+esc(pct(bucket.metrics.cascadeTriggeredRate))+'</td>' +` +\n ` '<td>'+esc(pct(bucket.metrics.shadowCheckedRate))+'</td>' +` +\n ` '<td>'+esc(pct(bucket.metrics.alignmentUsedRate))+'</td>' +` +\n ` '</tr>').join('');` +\n `}` +\n `function renderExportHistory(data){` +\n ` const exports=(data.exports || []);` +\n ` const schedules=(data.schedules || []);` +\n ` exportTableBody.innerHTML=exports.length ? exports.map(item=>'<tr><td><code>'+esc(item.id)+'</code></td><td>'+esc(item.kind)+'</td><td>'+esc(item.format)+'</td><td>'+esc(new Date(item.createdAt).toISOString())+'</td></tr>').join('') : '<tr><td colspan=\"4\" class=\"muted\">No exports yet</td></tr>';` +\n ` scheduleTableBody.innerHTML=schedules.length ? schedules.map(item=>'<tr><td><code>'+esc(item.id)+'</code></td><td>'+esc(item.intervalMs)+' ms</td><td>'+esc(item.format)+'</td><td>'+esc(item.lastRunAt ? new Date(item.lastRunAt).toISOString() : '-')}</td></tr>').join('') : '<tr><td colspan=\"4\" class=\"muted\">No schedules yet</td></tr>';` +\n `}` +\n `function renderArchives(data){` +\n ` const archives=(data.archives || []);` +\n ` archiveTableBody.innerHTML=archives.length ? archives.map(item=>'<tr><td><code>'+esc(item.file)+'</code></td><td>'+esc(item.startedAt ? new Date(item.startedAt).toISOString().slice(0,10) : '-')+' ~ '+esc(item.endedAt ? new Date(item.endedAt).toISOString().slice(0,10) : '-')+'</td><td>'+esc(item.traceCount)+'</td><td>'+esc(item.compressed ? 'yes' : 'no')+'</td></tr>').join('') : '<tr><td colspan=\"4\" class=\"muted\">No archives found</td></tr>';` +\n `}` +\n `async function loadCompiledModels(){` +\n ` compiledModelsStatus.textContent='\u52A0\u8F7D compiled models \u4E2D...';` +\n ` const res=await fetch('/api/models/compiled');` +\n ` const data=await res.json();` +\n ` renderDraftValidation([], data.warnings || []);` +\n ` renderCompiledModels(data);` +\n ` renderCompiledDiff();` +\n ` renderReferenceImpact();` +\n `}` +\n `async function loadTraces(){` +\n ` const requestId=document.getElementById('requestId').value.trim();` +\n ` const sessionKey=document.getElementById('sessionKey').value.trim();` +\n ` const routeReason=document.getElementById('routeReason').value.trim();` +\n ` const cascadeTriggered=document.getElementById('cascadeTriggered').value;` +\n ` const shadowChecked=document.getElementById('shadowChecked').value;` +\n ` const windowMs=document.getElementById('windowMs').value;` +\n ` const minSampleSize=document.getElementById('minSampleSize').value.trim();` +\n ` const cascadeWarnRate=document.getElementById('cascadeWarnRate').value.trim();` +\n ` const shadowWarnRate=document.getElementById('shadowWarnRate').value.trim();` +\n ` const latencyWarnMs=document.getElementById('latencyWarnMs').value.trim();` +\n ` const limit=document.getElementById('limit').value.trim();` +\n ` const params=new URLSearchParams();` +\n ` if(requestId) params.set('requestId',requestId);` +\n ` if(sessionKey) params.set('sessionKey',sessionKey);` +\n ` if(routeReason) params.set('routeReason',routeReason);` +\n ` if(cascadeTriggered) params.set('cascadeTriggered',cascadeTriggered);` +\n ` if(shadowChecked) params.set('shadowChecked',shadowChecked);` +\n ` if(windowMs) params.set('windowMs',windowMs);` +\n ` if(minSampleSize) params.set('minSampleSize',minSampleSize);` +\n ` if(cascadeWarnRate) params.set('cascadeWarnRate',cascadeWarnRate);` +\n ` if(shadowWarnRate) params.set('shadowWarnRate',shadowWarnRate);` +\n ` if(latencyWarnMs) params.set('latencyWarnMs',latencyWarnMs);` +\n ` params.set('bucketCount','6');` +\n ` if(limit) params.set('limit',limit);` +\n ` tbody.innerHTML='<tr><td colspan=\"6\" class=\"muted\">\u52A0\u8F7D\u4E2D...</td></tr>';` +\n ` const query=params.toString()?('?'+params.toString()):'';` +\n ` const [traceRes,metricsRes]=await Promise.all([` +\n ` fetch('/api/governance/traces'+query),` +\n ` fetch('/api/governance/metrics'+query)` +\n ` ]);` +\n ` const data=await traceRes.json();` +\n ` const metricsData=await metricsRes.json();` +\n ` renderMetrics(metricsData.metrics || {});` +\n ` renderBuckets(metricsData || {});` +\n ` renderAnomalies(metricsData.anomalies || []);` +\n ` renderRanking(routeRanking,metricsData.topRouteReasons || [],'No routes');` +\n ` renderRanking(modelRanking,metricsData.topFinalModels || [],'No models');` +\n ` renderRanking(intentRanking,metricsData.topSemanticIntents || [],'No intents');` +\n ` renderTrendTable(metricsData || {});` +\n ` const traces=data.traces || [];` +\n ` if(!traces.length){ tbody.innerHTML='<tr><td colspan=\"6\" class=\"muted\">\u6682\u65E0 trace</td></tr>'; return; }` +\n ` tbody.innerHTML=traces.map(t=>` +\n \" `<tr>`+\" +\n \" `<td><code>${esc(t.requestId)}</code></td>`+\" +\n \" `<td>${t.sessionKey ? `<span class=\\\"pill\\\">${esc(t.sessionKey)}</span>` : '<span class=\\\"muted\\\">-</span>'}</td>`+\" +\n \" `<td><code>${esc(t.finalModel || '')}</code></td>`+\" +\n \" `<td>${(t.routeReason || []).map(r=>`<span class=\\\"pill\\\">${esc(r)}</span>`).join(' ')}</td>`+\" +\n \" `<td>${esc(t.latencyMs ?? '')}</td>`+\" +\n \" `<td><button data-request=\\\"${esc(t.requestId)}\\\">View</button></td>`+\" +\n \" `</tr>`\" +\n ` ).join('');` +\n `}` +\n `async function loadDetail(requestId){` +\n ` const res=await fetch('/api/governance/traces/'+encodeURIComponent(requestId));` +\n ` const data=await res.json();` +\n ` detailHint.textContent='\u5F53\u524D\u67E5\u770B\uFF1A'+requestId;` +\n ` detail.textContent=JSON.stringify(data,null,2);` +\n `}` +\n `async function loadExports(){` +\n ` const res=await fetch('/api/governance/metrics/exports');` +\n ` renderExportHistory(await res.json());` +\n `}` +\n `async function createSnapshot(){` +\n ` snapshotStatus.textContent='\u521B\u5EFA\u5FEB\u7167\u4E2D...';` +\n ` const res=await fetch('/api/governance/metrics/snapshots',{` +\n ` method:'POST',` +\n ` headers:{'Content-Type':'application/json'},` +\n ` body:JSON.stringify({ format: document.getElementById('snapshotFormat').value, windowMs: Number(document.getElementById('windowMs').value || 0) || undefined })` +\n ` });` +\n ` const data=await res.json();` +\n ` snapshotStatus.textContent=res.ok ? ('\u5DF2\u521B\u5EFA\uFF1A'+data.export.id) : ('\u521B\u5EFA\u5931\u8D25\uFF1A'+(data.message || 'unknown error'));` +\n ` if(res.ok) await loadExports();` +\n `}` +\n `async function loadArchives(){` +\n ` archiveStatus.textContent='\u52A0\u8F7D\u5F52\u6863\u4E2D...';` +\n ` const params=new URLSearchParams();` +\n ` const archiveDate=document.getElementById('archiveDate').value.trim();` +\n ` const archivePage=document.getElementById('archivePage').value.trim();` +\n ` const archivePageSize=document.getElementById('archivePageSize').value.trim();` +\n ` if(archiveDate) params.set('date',archiveDate);` +\n ` if(archivePage) params.set('page',archivePage);` +\n ` if(archivePageSize) params.set('pageSize',archivePageSize);` +\n ` const res=await fetch('/api/governance/archives'+(params.toString()?('?'+params.toString()):''));` +\n ` const data=await res.json();` +\n ` renderArchives(data);` +\n ` archiveStatus.textContent='\u5F52\u6863\u52A0\u8F7D\u5B8C\u6210';` +\n `}` +\n `async function saveThresholds(){` +\n ` const payload={` +\n ` min_sample_size:Number(document.getElementById('minSampleSize').value || 0),` +\n ` cascade_warn_rate:Number(document.getElementById('cascadeWarnRate').value || 0),` +\n ` shadow_warn_rate:Number(document.getElementById('shadowWarnRate').value || 0),` +\n ` latency_warn_ms:Number(document.getElementById('latencyWarnMs').value || 0)` +\n ` };` +\n ` saveThresholdsStatus.textContent='\u4FDD\u5B58\u4E2D...';` +\n ` const res=await fetch('/api/governance/observability/anomaly-thresholds',{` +\n ` method:'POST',` +\n ` headers:{'Content-Type':'application/json'},` +\n ` body:JSON.stringify(payload)` +\n ` });` +\n ` const data=await res.json();` +\n ` if(!res.ok){ saveThresholdsStatus.textContent='\u4FDD\u5B58\u5931\u8D25\uFF1A'+(data.message || 'unknown error'); return; }` +\n ` saveThresholdsStatus.textContent='\u5DF2\u4FDD\u5B58\u5230\u914D\u7F6E\u6587\u4EF6';` +\n `}` +\n `document.getElementById('refreshBtn').addEventListener('click',loadTraces);` +\n `document.getElementById('loadConfigDraftBtn').addEventListener('click',loadConfigDraft);` +\n `document.getElementById('addModelDraftBtn').addEventListener('click',addDraftModel);` +\n `document.getElementById('applyBalancedPresetBtn').addEventListener('click',()=>applyDraftPreset('balanced'));` +\n `document.getElementById('previewBalancedPresetBtn').addEventListener('click',()=>previewDraftPreset('balanced'));` +\n `document.getElementById('applyFastPresetBtn').addEventListener('click',()=>applyDraftPreset('fast'));` +\n `document.getElementById('previewFastPresetBtn').addEventListener('click',()=>previewDraftPreset('fast'));` +\n `document.getElementById('applyGovernancePresetBtn').addEventListener('click',()=>applyDraftPreset('governance'));` +\n `document.getElementById('previewGovernancePresetBtn').addEventListener('click',()=>previewDraftPreset('governance'));` +\n `document.getElementById('addTriggerRuleBtn').addEventListener('click',addTriggerRule);` +\n `document.getElementById('addSmartCandidateBtn').addEventListener('click',addSmartCandidate);` +\n `document.getElementById('addCascadeLevelBtn').addEventListener('click',addCascadeLevel);` +\n `document.getElementById('syncDraftJsonBtn').addEventListener('click',syncDraftEditorFromForm);` +\n `document.getElementById('previewConfigDraftBtn').addEventListener('click',previewConfigDraft);` +\n `document.getElementById('saveConfigDraftBtn').addEventListener('click',saveConfigDraft);` +\n `draftPresetMode.addEventListener('change',renderDraftPresetModeHint);` +\n `document.getElementById('createSnapshotBtn').addEventListener('click',createSnapshot);` +\n `document.getElementById('loadArchivesBtn').addEventListener('click',loadArchives);` +\n `document.getElementById('saveThresholdsBtn').addEventListener('click',saveThresholds);` +\n `tbody.addEventListener('click',(e)=>{ const btn=e.target.closest('button[data-request]'); if(btn){ loadDetail(btn.dataset.request); } });` +\n `renderDraftPresetGuide();` +\n `renderDraftPresetModeHint();` +\n `renderDraftPreviewMeta();` +\n `loadConfigDraft();` +\n `loadCompiledModels();` +\n `loadExports();` +\n `loadArchives();` +\n `loadTraces();` +\n `</script>` +\n `</body></html>`\n );\n });\n\r\n return server;\r\n};\r\n", "/**\n * Router\n *\n * \u8DEF\u7531\u903B\u8F91\uFF0C\u590D\u7528\u81EA claude-code-router\n */\n\nimport {\n MessageCreateParamsBase,\n MessageParam,\n Tool,\n} from \"@anthropic-ai/sdk/resources/messages\";\nimport { get_encoding } from \"tiktoken\";\nimport { IAppConfig } from '../trigger/types';\nimport { sessionUsageCache, Usage } from './cache';\nimport { log, logError } from '../utils/log';\nimport { getCompiledModelRef, resolveModelReference } from '../models/compile';\n\nconst enc = get_encoding(\"cl100k_base\");\n\n/**\n * \u8BA1\u7B97 token \u6570\u91CF\n */\nconst calculateTokenCount = (\n messages: MessageParam[],\n system: any,\n tools: Tool[]\n) => {\n let tokenCount = 0;\n if (Array.isArray(messages)) {\n messages.forEach((message) => {\n if (typeof message.content === \"string\") {\n tokenCount += enc.encode(message.content).length;\n } else if (Array.isArray(message.content)) {\n message.content.forEach((contentPart: any) => {\n if (contentPart.type === \"text\") {\n tokenCount += enc.encode(contentPart.text).length;\n } else if (contentPart.type === \"tool_use\") {\n tokenCount += enc.encode(JSON.stringify(contentPart.input)).length;\n } else if (contentPart.type === \"tool_result\") {\n tokenCount += enc.encode(\n typeof contentPart.content === \"string\"\n ? contentPart.content\n : JSON.stringify(contentPart.content)\n ).length;\n }\n });\n }\n });\n }\n if (typeof system === \"string\") {\n tokenCount += enc.encode(system).length;\n } else if (Array.isArray(system)) {\n system.forEach((item: any) => {\n if (item.type !== \"text\") return;\n if (typeof item.text === \"string\") {\n tokenCount += enc.encode(item.text).length;\n } else if (Array.isArray(item.text)) {\n item.text.forEach((textPart: any) => {\n tokenCount += enc.encode(textPart || \"\").length;\n });\n }\n });\n }\n if (tools) {\n tools.forEach((tool: Tool) => {\n if (tool.description) {\n tokenCount += enc.encode(tool.name + tool.description).length;\n }\n if (tool.input_schema) {\n tokenCount += enc.encode(JSON.stringify(tool.input_schema)).length;\n }\n });\n }\n return tokenCount;\n};\n\n/**\n * \u83B7\u53D6\u4F7F\u7528\u7684\u6A21\u578B\n */\nconst getUseModel = async (\n req: any,\n tokenCount: number,\n config: IAppConfig,\n lastUsage?: Usage | undefined\n) => {\n // \u5982\u679C\u6A21\u578B\u5DF2\u7ECF\u5305\u542B\u9017\u53F7\uFF08\u5DF2\u7ECF\u88AB\u89E6\u53D1\u8DEF\u7531\u8BBE\u7F6E\uFF09\uFF0C\u76F4\u63A5\u8FD4\u56DE\n const explicitModel = resolveModelReference(config, req.body.model);\n if (explicitModel && explicitModel.includes(\",\")) {\n return explicitModel;\n }\n\n // if tokenCount is greater than the configured threshold, use the long context model\n const longContextThreshold = config.Router.longContextThreshold || 60000;\n const lastUsageThreshold =\n lastUsage &&\n lastUsage.input_tokens > longContextThreshold &&\n tokenCount > 20000;\n const tokenCountThreshold = tokenCount > longContextThreshold;\n if (\n (lastUsageThreshold || tokenCountThreshold) &&\n config.Router.longContext\n ) {\n log(\n \"Using long context model due to token count:\",\n tokenCount,\n \"threshold:\",\n longContextThreshold\n );\n return resolveModelReference(config, config.Router.longContext);\n }\n\n // \u5B50\u4EE3\u7406\u6A21\u578B\u6807\u8BB0\n if (\n req.body?.system?.length > 1 &&\n req.body?.system[1]?.text?.startsWith(\"<CTR-SUBAGENT-MODEL>\")\n ) {\n const model = req.body?.system[1].text.match(\n /<CTR-SUBAGENT-MODEL>(.*?)<\\/CTR-SUBAGENT-MODEL>/s\n );\n if (model) {\n req.body.system[1].text = req.body.system[1].text.replace(\n `<CTR-SUBAGENT-MODEL>${model[1]}</CTR-SUBAGENT-MODEL>`,\n \"\"\n );\n return resolveModelReference(config, model[1]);\n }\n }\n\n // If the model is claude-3-5-haiku, use the background model\n if (\n req.body.model?.startsWith(\"claude-3-5-haiku\") &&\n config.Router.background\n ) {\n log(\"Using background model for \", req.body.model);\n return resolveModelReference(config, config.Router.background);\n }\n\n // if exits thinking, use the think model\n if (req.body.thinking && config.Router.think) {\n log(\"Using think model for \", req.body.thinking);\n return resolveModelReference(config, config.Router.think);\n }\n\n // web search\n if (\n Array.isArray(req.body.tools) &&\n req.body.tools.some((tool: any) => tool.type?.startsWith(\"web_search\")) &&\n config.Router.webSearch\n ) {\n return resolveModelReference(config, config.Router.webSearch);\n }\n\n return resolveModelReference(config, config.Router!.default);\n};\n\nconst applyModelThinking = (req: any, config: IAppConfig, modelRef?: string): void => {\n const compiled = getCompiledModelRef(config, modelRef);\n const thinking = compiled?.thinking;\n\n if (!thinking) {\n return;\n }\n\n if (thinking.mode === 'off') {\n delete req.body.thinking;\n return;\n }\n\n if (thinking.mode === 'on') {\n req.body.thinking = {\n ...(typeof req.body.thinking === 'object' && req.body.thinking ? req.body.thinking : { type: 'enabled' }),\n type: 'enabled',\n };\n }\n\n if (thinking.mode === 'auto' && !req.body.thinking) {\n return;\n }\n\n if (!req.body.thinking) {\n req.body.thinking = { type: 'enabled' };\n }\n\n if (thinking.effort) {\n req.body.thinking.effort = thinking.effort;\n }\n\n if (thinking.budget_tokens) {\n req.body.thinking.budget_tokens = thinking.budget_tokens;\n }\n};\n\n/**\n * \u8DEF\u7531\u4E2D\u95F4\u4EF6\n */\nexport const router = async (req: any, _res: any, context: any) => {\n const { config, event } = context;\n\n // Parse sessionId from metadata.user_id\n if (req.body.metadata?.user_id) {\n const parts = req.body.metadata.user_id.split(\"_session_\");\n if (parts.length > 1) {\n req.sessionId = parts[1];\n }\n }\n\n const lastMessageUsage = sessionUsageCache.get(req.sessionId);\n const { messages, system = [], tools }: MessageCreateParamsBase = req.body;\n\n try {\n const tokenCount = calculateTokenCount(\n messages as MessageParam[],\n system,\n tools as Tool[]\n );\n\n let model;\n\n // \u81EA\u5B9A\u4E49\u8DEF\u7531\u5668\uFF08\u89E6\u53D1\u8DEF\u7531\u5DF2\u547D\u4E2D\u65F6\u8DF3\u8FC7\uFF0C\u907F\u514D\u8986\u76D6\u66F4\u9AD8\u4F18\u5148\u7EA7\u7684\u9009\u62E9\uFF09\n if (config.CUSTOM_ROUTER_PATH && !req.body.model.includes(\",\")) {\n try {\n const customRouter = require(config.CUSTOM_ROUTER_PATH);\n req.tokenCount = tokenCount;\n model = await customRouter(req, config, {\n event\n });\n } catch (e: any) {\n logError(\"failed to load custom router\", e.message);\n }\n }\n\n // \u5982\u679C\u6CA1\u6709\u901A\u8FC7\u89E6\u53D1\u8DEF\u7531\u6216\u81EA\u5B9A\u4E49\u8DEF\u7531\u8BBE\u7F6E\u6A21\u578B\uFF0C\u4F7F\u7528\u539F\u6709\u903B\u8F91\n if (!model && !req.body.model.includes(\",\")) {\n model = await getUseModel(req, tokenCount, config, lastMessageUsage);\n }\n\n // \u5982\u679C\u89E6\u53D1\u8DEF\u7531\u5DF2\u547D\u4E2D\uFF08\u6A21\u578B\u542B\u9017\u53F7\uFF09\uFF0C\u4FDD\u7559\u5176\u9009\u62E9\n req.body.model = model ?? req.body.model;\n applyModelThinking(req, config, req.body.model);\n req.tokenCount = tokenCount;\n } catch (error: any) {\n logError(\"Error in router middleware:\", error.message);\n req.body.model = config.Router!.default;\n }\n\n return;\n};\n", "/**\n * Auth Middleware\n *\n * \u8BA4\u8BC1\u4E2D\u95F4\u4EF6\n */\n\nimport { FastifyRequest, FastifyReply } from \"fastify\";\nimport { IAppConfig } from \"../trigger/types\";\n\n/**\n * API Key \u8BA4\u8BC1\u4E2D\u95F4\u4EF6\n */\nexport function apiKeyAuth(config: IAppConfig) {\n return (req: FastifyRequest, reply: FastifyReply, done: (err?: Error) => void) => {\n // \u5982\u679C\u6CA1\u6709\u914D\u7F6E APIKEY\uFF0C\u8DF3\u8FC7\u8BA4\u8BC1\n if (!config.APIKEY) {\n done();\n return;\n }\n\n // \u4ECE\u8BF7\u6C42\u5934\u83B7\u53D6 API Key\n const authHeader = req.headers.authorization;\n const xApiKey = req.headers[\"x-api-key\"];\n\n let providedKey: string | undefined;\n\n if (authHeader?.startsWith(\"Bearer \")) {\n providedKey = authHeader.slice(7);\n } else if (xApiKey) {\n providedKey = xApiKey as string;\n }\n\n if (!providedKey || providedKey !== config.APIKEY) {\n reply.code(401).send({ error: \"Unauthorized\" });\n done(new Error(\"Unauthorized\"));\n return;\n }\n\n done();\n };\n}\n", "/**\n * Process Check Utilities\n *\n * \u8FDB\u7A0B\u68C0\u67E5\u548C\u7BA1\u7406\u5DE5\u5177\n */\n\nimport { existsSync, readFileSync, unlinkSync, writeFileSync } from \"fs\";\nimport { spawnSync } from \"child_process\";\nimport { DEFAULT_CONFIG, PID_FILE } from \"../constants\";\nimport { logError } from \"./log\";\n\n/**\n * \u8DE8\u5E73\u53F0\u68C0\u67E5\u8FDB\u7A0B\u662F\u5426\u5B58\u5728\n */\nfunction isProcessAlive(pid: number): boolean {\n try {\n if (process.platform === \"win32\") {\n // Windows: \u4F7F\u7528 tasklist \u67E5\u8BE2 PID\n const result = spawnSync(\"tasklist\", [\"/FI\", `PID eq ${pid}`, \"/NH\", \"/FO\", \"CSV\"], {\n encoding: \"utf-8\",\n timeout: 3000,\n });\n return result.stdout?.includes(`\"${pid}\"`) ?? false;\n } else {\n // Unix: \u53D1\u9001\u4FE1\u53F7 0 \u68C0\u67E5\u8FDB\u7A0B\u662F\u5426\u5B58\u5728\n process.kill(pid, 0);\n return true;\n }\n } catch {\n return false;\n }\n}\n\nexport async function waitForProcessExit(pid: number, timeoutMs = 5000): Promise<boolean> {\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeoutMs) {\n if (!isProcessAlive(pid)) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return !isProcessAlive(pid);\n}\n\n/**\n * \u8DE8\u5E73\u53F0\u7EC8\u6B62\u8FDB\u7A0B\n */\nexport function killProcess(pid: number): void {\n if (process.platform === \"win32\") {\n spawnSync(\"taskkill\", [\"/F\", \"/PID\", String(pid)], { timeout: 5000 });\n } else {\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {\n // \u8FDB\u7A0B\u53EF\u80FD\u5DF2\u7ECF\u9000\u51FA\n }\n }\n}\n\n/**\n * \u68C0\u67E5\u670D\u52A1\u662F\u5426\u6B63\u5728\u8FD0\u884C\n */\nexport function isServiceRunning(): boolean {\n const info = readServiceInfo();\n if (!info || isNaN(info.pid) || info.pid <= 0) {\n cleanupPidFile();\n return false;\n }\n\n if (isProcessAlive(info.pid)) {\n return true;\n }\n\n // \u8FDB\u7A0B\u4E0D\u5B58\u5728\uFF0C\u6E05\u7406 PID \u6587\u4EF6\n cleanupPidFile();\n return false;\n}\n\n/**\n * PID \u6587\u4EF6\u4E2D\u7684\u670D\u52A1\u5143\u6570\u636E\n */\nexport interface IServiceInfo {\n pid: number;\n port: number;\n startTime: string;\n}\n\n/**\n * \u4FDD\u5B58 PID \u53CA\u670D\u52A1\u5143\u6570\u636E\n */\nexport function savePid(pid: number, port?: number): void {\n const info: IServiceInfo = {\n pid,\n port: port ?? DEFAULT_CONFIG.PORT,\n startTime: new Date().toISOString(),\n };\n writeFileSync(PID_FILE, JSON.stringify(info, null, 2), \"utf-8\");\n}\n\n/**\n * \u8BFB\u53D6\u670D\u52A1\u5143\u6570\u636E\uFF0C\u517C\u5BB9\u65E7\u7248\u7EAF\u6570\u5B57\u683C\u5F0F\n */\nexport function readServiceInfo(): IServiceInfo | null {\n if (!existsSync(PID_FILE)) return null;\n try {\n const content = readFileSync(PID_FILE, \"utf-8\").trim();\n // \u517C\u5BB9\u65E7\u683C\u5F0F\uFF08\u7EAF\u6570\u5B57 PID\uFF09\n if (/^\\d+$/.test(content)) {\n return { pid: parseInt(content, 10), port: DEFAULT_CONFIG.PORT, startTime: '' };\n }\n return JSON.parse(content) as IServiceInfo;\n } catch {\n return null;\n }\n}\n\n/**\n * \u6E05\u7406 PID \u6587\u4EF6\n */\nexport function cleanupPidFile(): void {\n if (existsSync(PID_FILE)) {\n try {\n unlinkSync(PID_FILE);\n } catch (error) {\n logError(\"Failed to cleanup PID file:\", error);\n }\n }\n}\n", "/**\n * SSE Serializer Transform\n *\n * Server-Sent Events \u5E8F\u5217\u5316\u8F6C\u6362\u6D41\n */\n\nexport class SSESerializerTransform {\n constructor() {\n const transformStream = new TransformStream({\n transform: (event: any, controller) => {\n let output = \"\";\n\n if (event.event) {\n output += `event: ${event.event}\\n`;\n }\n\n if (event.data) {\n const dataStr =\n typeof event.data === \"string\"\n ? event.data\n : JSON.stringify(event.data);\n output += `data: ${dataStr}\\n`;\n }\n\n output += \"\\n\";\n\n controller.enqueue(new TextEncoder().encode(output));\n },\n });\n\n // Copy readable and writable to this instance\n this.readable = transformStream.readable;\n this.writable = transformStream.writable;\n }\n\n readable: ReadableStream<any>;\n writable: WritableStream<any>;\n}\n", "/**\n * Rewrite Stream\n *\n * \u6D41\u91CD\u5199\u5DE5\u5177\n */\n\n/**\n * \u91CD\u5199\u6D41\n * \u5141\u8BB8\u5BF9 SSE \u6D41\u8FDB\u884C\u8F6C\u6362\u5904\u7406\n */\nexport function rewriteStream(\n stream: ReadableStream,\n handler: (\n data: any,\n controller: any\n ) => Promise<any>\n): ReadableStream {\n const reader = stream.getReader();\n\n return new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n break;\n }\n\n const result = await handler(value, controller);\n\n if (result !== undefined) {\n controller.enqueue(result);\n }\n }\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n}\n", "/**\n * Image Agent\n *\n * \u56FE\u50CF\u5904\u7406 Agent\n */\n\nimport { IAgent, ITool } from \"./type\";\nimport { LRUCache } from \"lru-cache\";\nimport { logDebug } from \"../utils/log\";\nimport { toAnthropicMessagesRequest } from \"../protocols/anthropic\";\n\ninterface ImageCacheEntry {\n source: any;\n timestamp: number;\n}\n\n/**\n * \u56FE\u50CF\u7F13\u5B58\n */\nclass ImageCache {\n private cache: LRUCache<string, ImageCacheEntry>;\n\n constructor(maxSize = 100) {\n this.cache = new LRUCache({\n max: maxSize,\n ttl: 24 * 60 * 60 * 1000,\n });\n }\n\n storeImage(id: string, source: any): void {\n if (this.hasImage(id)) return;\n this.cache.set(id, {\n source,\n timestamp: Date.now(),\n });\n }\n\n getImage(id: string): any {\n const entry = this.cache.get(id);\n return entry ? entry.source : null;\n }\n\n hasImage(hash: string): boolean {\n return this.cache.has(hash);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\nconst imageCache = new ImageCache();\n\n/**\n * \u56FE\u50CF Agent\n */\nexport class ImageAgent implements IAgent {\n name = \"image\";\n tools: Map<string, ITool>;\n\n constructor() {\n this.tools = new Map<string, ITool>();\n this.appendTools();\n }\n\n shouldHandle(req: any, config: any): boolean {\n if (!config.Router?.image || req.body.model === config.Router.image)\n return false;\n\n const lastMessage = req.body.messages[req.body.messages.length - 1];\n\n if (\n !config.forceUseImageAgent &&\n lastMessage.role === \"user\" &&\n Array.isArray(lastMessage.content) &&\n lastMessage.content.find((item: any) => item.type === \"image\")\n ) {\n req.body.model = config.Router.image;\n return false;\n }\n\n return req.body.messages.some(\n (msg: any) =>\n msg.role === \"user\" &&\n Array.isArray(msg.content) &&\n msg.content.some((item: any) => item.type === \"image\")\n );\n }\n\n appendTools() {\n this.tools.set(\"analyzeImage\", {\n name: \"analyzeImage\",\n description:\n \"Analyse image or images by ID and extract information such as OCR text, objects, layout, colors, or safety signals.\",\n input_schema: {\n type: \"object\",\n properties: {\n imageId: {\n type: \"array\",\n description: \"an array of IDs to analyse\",\n items: {\n type: \"string\",\n },\n },\n task: {\n type: \"string\",\n description:\n \"Details of task to perform on the image.The more detailed, the better\",\n },\n regions: {\n type: \"array\",\n description: \"Optional regions of interest within the image\",\n items: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"Optional label for the region\",\n },\n x: { type: \"number\", description: \"X coordinate\" },\n y: { type: \"number\", description: \"Y coordinate\" },\n w: { type: \"number\", description: \"Width of the region\" },\n h: { type: \"number\", description: \"Height of the region\" },\n units: {\n type: \"string\",\n enum: [\"px\", \"pct\"],\n description: \"Units for coordinates and size\",\n },\n },\n required: [\"x\", \"y\", \"w\", \"h\", \"units\"],\n },\n },\n },\n required: [\"imageId\", \"task\"],\n },\n handler: async (args, context) => {\n logDebug(\"analyzeImage args:\", JSON.stringify(args, null, 2));\n const imageMessages = [];\n let imageId;\n\n if (args.imageId && Array.isArray(args.imageId)) {\n args.imageId.forEach((imgId: string) => {\n const image = imageCache.getImage(\n `${context.req.id}_Image#${imgId}`\n );\n if (image) {\n imageMessages.push({\n type: \"image\",\n source: image,\n });\n }\n });\n imageId = args.imageId;\n delete args.imageId;\n }\n\n if (Object.keys(args).length > 0) {\n imageMessages.push({\n type: \"text\",\n text: JSON.stringify(args),\n });\n }\n\n const agentResponse = await fetch(\n `http://127.0.0.1:${context.config.PORT}/v1/messages`,\n {\n method: \"POST\",\n headers: {\n \"x-api-key\": context.config.APIKEY,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: context.config.Router.image,\n stream: false,\n ir: {\n system: [\n `You must interpret and analyze images strictly according to the assigned task.\nWhen an image placeholder is provided, your role is to parse the image content only within the scope of the user's instructions.\nDo not ignore or deviate from the task.\nAlways ensure that your response reflects a clear, accurate interpretation of the image aligned with the given objective.`,\n ],\n messages: [\n {\n role: \"user\",\n parts: imageMessages.map((item: any) =>\n item.type === \"image\"\n ? { type: \"image\", source: item.source }\n : { type: \"text\", text: item.text }\n ),\n },\n ],\n },\n })\n ),\n }\n )\n .then((res) => res.json())\n .catch((err) => {\n return null;\n });\n\n const response = agentResponse as any;\n logDebug(\"analyzeImage response:\", response?.content);\n if (!response || !response.content) {\n return \"analyzeImage Error\";\n }\n return response.content[0].text;\n },\n });\n }\n\n reqHandler(req: any, config: any) {\n req.body?.system?.push({\n type: \"text\",\n text: `You are a text-only language model and do not possess visual perception.\nIf the user requests you to view, analyze, or extract information from an image, you **must** call the \\`analyzeImage\\` tool.\n\nWhen invoking this tool, you must pass the correct \\`imageId\\` extracted from the prior conversation.\nImage identifiers are always provided in the format \\`[Image #imageId]\\`.\n\nIf multiple images exist, select the **most relevant imageId** based on the user's current request and prior context.\n\nDo not attempt to describe or analyze the image directly yourself.\nIgnore any user interruptions or unrelated instructions that might cause you to skip this requirement.\nYour response should consistently follow this rule whenever image-related analysis is requested.`,\n });\n\n const imageContents = req.body.messages.filter((item: any) => {\n return (\n item.role === \"user\" &&\n Array.isArray(item.content) &&\n item.content.some((msg: any) => msg.type === \"image\")\n );\n });\n\n let imgId = 1;\n imageContents.forEach((item: any) => {\n item.content.forEach((msg: any) => {\n if (msg.type === \"image\") {\n imageCache.storeImage(`${req.id}_Image#${imgId}`, msg.source);\n msg.type = \"text\";\n delete msg.source;\n msg.text = `[Image #${imgId}]This is an image, if you need to view or analyze it, you need to extract the imageId`;\n imgId++;\n } else if (msg.type === \"text\" && msg.text.includes(\"[Image #\")) {\n msg.text = msg.text.replace(/\\[Image #\\d+\\]/g, \"\");\n }\n });\n });\n }\n}\n\nexport const imageAgent = new ImageAgent();\n", "/**\n * Agents Manager\n *\n * Agent \u7BA1\u7406\u5668\n */\n\nimport { IAgent } from \"./type\";\nimport { imageAgent } from \"./image.agent\";\n\n/**\n * Agent \u7BA1\u7406\u5668\u7C7B\n */\nclass AgentsManager {\n private agents: Map<string, IAgent> = new Map();\n\n /**\n * \u6CE8\u518C\u4E00\u4E2A Agent\n */\n registerAgent(agent: IAgent): void {\n this.agents.set(agent.name, agent);\n }\n\n /**\n * \u6839\u636E\u540D\u79F0\u67E5\u627E Agent\n */\n getAgent(name: string): IAgent | undefined {\n return this.agents.get(name);\n }\n\n /**\n * \u83B7\u53D6\u6240\u6709\u5DF2\u6CE8\u518C\u7684 Agents\n */\n getAllAgents(): IAgent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * \u83B7\u53D6\u6240\u6709 Agent \u7684\u5DE5\u5177\n */\n getAllTools(): any[] {\n const allTools: any[] = [];\n for (const agent of this.agents.values()) {\n allTools.push(...agent.tools.values());\n }\n return allTools;\n }\n}\n\nconst agentsManager = new AgentsManager();\nagentsManager.registerAgent(imageAgent);\n\nexport default agentsManager;\n", "/**\n * Trigger Router Type Definitions\n *\n * \u89E6\u53D1\u8DEF\u7531\u5668\u7684\u6838\u5FC3\u7C7B\u578B\u5B9A\u4E49\n */\n\nimport { MessageParam } from \"@anthropic-ai/sdk/resources/messages\";\nimport { IGovernanceConfig, IGovernanceTrace } from '../governance/types';\n\n/**\n * \u89E6\u53D1\u6A21\u5F0F\u7C7B\u578B\n */\nexport type PatternType = 'exact' | 'regex';\n\n/**\n * \u89E6\u53D1\u6A21\u5F0F\u914D\u7F6E\n */\nexport interface ITriggerPattern {\n /** \u6A21\u5F0F\u7C7B\u578B\uFF1A\u7CBE\u786E\u5339\u914D\u6216\u6B63\u5219\u8868\u8FBE\u5F0F */\n type: PatternType;\n\n /** \u7CBE\u786E\u5339\u914D\u7684\u5173\u952E\u8BCD\u5217\u8868\uFF08type=exact \u65F6\u4F7F\u7528\uFF09 */\n keywords?: string[];\n\n /** \u6B63\u5219\u8868\u8FBE\u5F0F\u6A21\u5F0F\uFF08type=regex \u65F6\u4F7F\u7528\uFF09 */\n pattern?: string;\n\n /** \u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\uFF0C\u9ED8\u8BA4 false */\n caseSensitive?: boolean;\n}\n\n/**\n * \u89E6\u53D1\u89C4\u5219\n */\nexport interface ITriggerRule {\n /** \u89C4\u5219\u540D\u79F0\uFF0C\u7528\u4E8E\u65E5\u5FD7\u548C\u8C03\u8BD5 */\n name: string;\n\n /** \u4F18\u5148\u7EA7\uFF0C\u6570\u503C\u8D8A\u5927\u4F18\u5148\u7EA7\u8D8A\u9AD8\uFF0C\u9ED8\u8BA4 0 */\n priority: number;\n\n /** \u662F\u5426\u542F\u7528\u6B64\u89C4\u5219\uFF0C\u9ED8\u8BA4 true */\n enabled: boolean;\n\n /** \u89E6\u53D1\u6A21\u5F0F\u5217\u8868\uFF0C\u4EFB\u4E00\u6A21\u5F0F\u5339\u914D\u5373\u89E6\u53D1 */\n patterns: ITriggerPattern[];\n\n /** \u76EE\u6807\u6A21\u578B\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\n model: string;\n\n /** \u89C4\u5219\u63CF\u8FF0 */\n description?: string;\n\n /** \u89C4\u5219\u7EA7\u8BED\u4E49\u753B\u50CF\uFF0C\u7528\u4E8E\u7EDF\u4E00 Router \u8FD0\u884C\u65F6\u8BED\u4E49\u5339\u914D */\n semantic_profile?: {\n enabled?: boolean;\n prototype?: string;\n threshold?: number;\n };\n}\n\n/**\n * \u5206\u6790\u8303\u56F4\n */\nexport type AnalysisScope = 'last_message' | 'full_conversation';\n\n/**\n * \u89E6\u53D1\u8DEF\u7531\u914D\u7F6E\n */\nexport interface ITriggerConfig {\n /** \u662F\u5426\u542F\u7528\u89E6\u53D1\u8DEF\u7531\uFF0C\u9ED8\u8BA4 true */\n enabled: boolean;\n\n /** \u5206\u6790\u8303\u56F4\uFF1A\u6700\u540E\u4E00\u6761\u6D88\u606F\u6216\u5B8C\u6574\u5BF9\u8BDD\u5386\u53F2 */\n analysis_scope: AnalysisScope;\n\n /** \u662F\u5426\u542F\u7528 LLM \u610F\u56FE\u8BC6\u522B\uFF0C\u9ED8\u8BA4 false */\n llm_intent_recognition: boolean;\n\n /** \u610F\u56FE\u8BC6\u522B\u4F7F\u7528\u7684\u6A21\u578B\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\n intent_model?: string;\n\n /** \u89E6\u53D1\u89C4\u5219\u5217\u8868 */\n rules: ITriggerRule[];\n}\n\n/**\n * \u5206\u6790\u7ED3\u679C\n */\nexport interface IAnalysisResult {\n /** \u662F\u5426\u5339\u914D\u5230\u89C4\u5219 */\n matched: boolean;\n\n /** \u5339\u914D\u7684\u89C4\u5219\uFF08\u5982\u679C\u5339\u914D\u6210\u529F\uFF09 */\n rule?: ITriggerRule;\n\n /** \u9009\u4E2D\u7684\u6A21\u578B\uFF08\u5982\u679C\u5339\u914D\u6210\u529F\uFF09 */\n model?: string;\n\n /** \u5339\u914D\u7F6E\u4FE1\u5EA6 0-1 */\n confidence: number;\n\n /** \u5206\u6790\u8017\u65F6\uFF08\u6BEB\u79D2\uFF09 */\n analysisTime: number;\n\n /** \u5206\u6790\u7684\u6587\u672C\u5185\u5BB9 */\n analyzedText?: string;\n\n /** \u8DEF\u7531\u6765\u6E90 */\n routeSource?: 'smart_rule' | 'semantic_match' | 'smart_router' | 'sticky_correction';\n}\n\n/**\n * \u5339\u914D\u7ED3\u679C\n */\nexport interface IMatchResult {\n /** \u662F\u5426\u5339\u914D */\n matched: boolean;\n\n /** \u5339\u914D\u7684\u6A21\u5F0F */\n pattern?: ITriggerPattern;\n\n /** \u5339\u914D\u7684\u5173\u952E\u8BCD\uFF08\u7CBE\u786E\u5339\u914D\u65F6\uFF09 */\n matchedKeyword?: string;\n\n /** \u6B63\u5219\u5339\u914D\u7ED3\u679C\uFF08\u6B63\u5219\u5339\u914D\u65F6\uFF09 */\n regexMatch?: RegExpMatchArray;\n}\n\n/**\n * \u610F\u56FE\u8BC6\u522B\u7ED3\u679C\n */\nexport interface IIntentResult {\n /** \u8BC6\u522B\u5230\u7684\u610F\u56FE */\n intent: string;\n\n /** \u7F6E\u4FE1\u5EA6 0-1 */\n confidence: number;\n\n /** \u76F8\u5173\u7684\u89C4\u5219\u540D\u79F0 */\n relatedRule?: string;\n}\n\n/**\n * \u5B8C\u6574\u914D\u7F6E\uFF08\u5305\u542B\u539F\u6709\u914D\u7F6E\u548C\u89E6\u53D1\u914D\u7F6E\uFF09\n */\nexport interface IAppConfig {\n // \u539F\u6709\u914D\u7F6E\n APIKEY?: string;\n HOST?: string;\n PORT?: number;\n PROXY_URL?: string;\n LOG?: boolean;\n LOG_LEVEL?: string;\n API_TIMEOUT_MS?: number;\n NON_INTERACTIVE_MODE?: boolean;\n\n /** \u6A21\u578B\u63D0\u4F9B\u5546\u914D\u7F6E */\n Providers: IProvider[];\n\n /** \u7B80\u5316\u6A21\u578B\u63A5\u5165\u914D\u7F6E */\n Models?: IModelEndpointConfig[];\n\n /** \u539F\u6709\u8DEF\u7531\u914D\u7F6E */\n Router: IRouterConfig;\n\n /** \u89E6\u53D1\u8DEF\u7531\u914D\u7F6E */\n TriggerRouter?: ITriggerConfig;\n\n /** \u667A\u80FD\u8DEF\u7531\u914D\u7F6E */\n SmartRouter?: ISmartRouterConfig;\n\n /** \u6CBB\u7406\u5C42\u914D\u7F6E */\n Governance?: IGovernanceConfig;\n\n /** \u81EA\u5B9A\u4E49\u8DEF\u7531\u5668\u8DEF\u5F84 */\n CUSTOM_ROUTER_PATH?: string;\n\n /** \u5F3A\u5236\u6240\u6709\u56FE\u7247\u8BF7\u6C42\u8D70 Image Agent \u6A21\u5F0F\uFF08\u9ED8\u8BA4 false\uFF09 */\n forceUseImageAgent?: boolean;\n}\n\n/**\n * \u63D0\u4F9B\u5546\u914D\u7F6E\n */\nexport interface IProvider {\n name: string;\n api_base_url: string;\n api_key: string;\n models: string[];\n transformer?: any;\n}\n\nexport interface IModelThinkingConfig {\n mode?: 'off' | 'auto' | 'on';\n effort?: 'low' | 'medium' | 'high';\n budget_tokens?: number;\n}\n\nexport type TModelThinkingAlias = 'off' | 'auto' | 'on' | 'low' | 'medium' | 'high';\n\nexport interface IModelEndpointMetadata {\n label?: string;\n vendor_hint?: string;\n supports_tools?: boolean;\n supports_reasoning?: boolean;\n supports_images?: boolean;\n}\n\nexport interface ICompiledModelCapabilities {\n thinking: {\n supported: boolean;\n mode?: 'off' | 'auto' | 'on';\n effort?: 'low' | 'medium' | 'high';\n budget_tokens?: number;\n };\n tools: boolean;\n images: boolean;\n systemMessageStyle: 'openai' | 'anthropic';\n}\n\nexport interface IModelEndpointConfig {\n id: string;\n api?: string;\n api_base_url?: string;\n key?: string;\n api_key?: string;\n interface?: 'openai' | 'anthropic';\n protocol?: 'openai' | 'anthropic';\n model: string;\n thinking?: IModelThinkingConfig | TModelThinkingAlias;\n metadata?: IModelEndpointMetadata;\n}\n\n/**\n * \u539F\u6709\u8DEF\u7531\u914D\u7F6E\n */\nexport interface IRouterConfig {\n default: string;\n background?: string;\n think?: string;\n longContext?: string;\n longContextThreshold?: number;\n webSearch?: string;\n image?: string;\n routes?: Array<{\n name: string;\n model: string;\n description?: string;\n priority?: number;\n enabled?: boolean;\n match?: {\n keywords?: string[];\n regex?: string;\n semantic?: boolean;\n semantic_profile?: {\n prototype?: string;\n threshold?: number;\n };\n };\n }>;\n decision?: {\n smart_fallback?: boolean;\n router_model?: string;\n candidates?: ISmartRouterCandidate[];\n cache_ttl?: number;\n max_tokens?: number;\n fallback?: 'default' | 'skip';\n router_hint?: {\n include_task_summary?: boolean;\n include_top_route_candidates?: boolean;\n };\n };\n defaults?: {\n sticky?: IGovernanceConfig['sticky'];\n semantic?: IGovernanceConfig['semantic'];\n route_trace?: boolean;\n };\n}\n\n/**\n * SmartRouter \u5019\u9009\u6A21\u578B\n */\nexport interface ISmartRouterCandidate {\n /** \u6A21\u578B\u6807\u8BC6\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\n model: string;\n\n /** \u6A21\u578B\u80FD\u529B\u63CF\u8FF0\uFF0C\u7528\u4E8E\u544A\u77E5 router_model \u8BE5\u6A21\u578B\u64C5\u957F\u4EC0\u4E48 */\n description: string;\n}\n\n/**\n * SmartRouter \u914D\u7F6E\n */\nexport interface ISmartRouterConfig {\n /** \u662F\u5426\u542F\u7528 SmartRouter\uFF0C\u9ED8\u8BA4 false */\n enabled: boolean;\n\n /** \u8DEF\u7531\u5206\u6790\u8303\u56F4\uFF0C\u672A\u914D\u7F6E\u65F6\u56DE\u9000\u5230 legacy trigger \u7684 last_message \u8BED\u4E49 */\n analysis_scope?: AnalysisScope;\n\n /**\n * \u53EF\u9009\u7684\u8DEF\u7531 LLM\u3002\n * - \u672A\u914D\u7F6E\u65F6\uFF1A\u884C\u4E3A\u9000\u5316\u4E3A\u201C\u5173\u952E\u8BCD/\u6B63\u5219\u524D\u7F6E\u7B5B\u9009 + \u8BED\u4E49\u589E\u5F3A\u5339\u914D + \u9ED8\u8BA4\u8DEF\u7531\u515C\u5E95\u201D\n * - \u914D\u7F6E\u540E\uFF1A\u5728\u524D\u7F6E\u7B5B\u9009\u4E0E\u8BED\u4E49\u589E\u5F3A\u4E4B\u540E\uFF0C\u518D\u7531 router_model \u505A\u6700\u7EC8\u9009\u6A21\u5224\u65AD\n */\n router_model?: string;\n\n /** \u5019\u9009\u6A21\u578B\u5217\u8868\uFF08\u914D\u7F6E router_model \u65F6\u81F3\u5C11 2 \u4E2A\uFF09 */\n candidates?: ISmartRouterCandidate[];\n\n /** SmartRouter \u5185\u90E8\u7684\u524D\u7F6E\u89C4\u5219\u80FD\u529B\uFF0C\u4F5C\u4E3A Trigger \u80FD\u529B\u7684\u7EDF\u4E00\u5185\u6536\u5165\u53E3 */\n rules?: ITriggerRule[];\n\n /** \u8BED\u4E49\u589E\u5F3A\u5339\u914D\u80FD\u529B\uFF0C\u9ED8\u8BA4\u53EF\u7531\u6CBB\u7406\u80FD\u529B\u5185\u6536\u8FDB\u6765 */\n semantic?: IGovernanceConfig['semantic'];\n\n /** \u8BED\u4E49\u7C98\u8FDE / \u4E0A\u4E0B\u6587\u5BF9\u9F50\u7B49\u9ED8\u8BA4\u8DEF\u7531\u589E\u5F3A\u80FD\u529B */\n sticky?: IGovernanceConfig['sticky'];\n\n /** \u7F13\u5B58 TTL\uFF08\u6BEB\u79D2\uFF09\uFF0C\u9ED8\u8BA4 600000\uFF0810 \u5206\u949F\uFF09 */\n cache_ttl?: number;\n\n /** router_model \u6700\u5927 token \u6570\uFF0C\u9ED8\u8BA4 256 */\n max_tokens?: number;\n\n /**\n * SmartRouter \u65E0\u7ED3\u679C\u65F6\u7684\u56DE\u9000\u7B56\u7565\n * - \"default\"\uFF1A\u7EE7\u7EED\u6267\u884C\u540E\u7EED\u8DEF\u7531\u94FE\uFF08\u9ED8\u8BA4\uFF09\n * - \"skip\"\uFF1A\u8DF3\u8FC7 SmartRouter\uFF0C\u76F4\u63A5\u8D70\u540E\u7EED\u8DEF\u7531\u94FE\n */\n fallback?: 'default' | 'skip';\n\n /** \u7ED3\u6784\u5316 router hint\uFF0C\u5E2E\u52A9\u8DEF\u7531\u6A21\u578B\u57FA\u4E8E\u9884\u7B5B\u9009\u7ED3\u679C\u505A\u515C\u5E95\u88C1\u51B3 */\n router_hint?: {\n include_task_summary?: boolean;\n include_top_route_candidates?: boolean;\n };\n}\n\n/**\n * \u8BF7\u6C42\u4E0A\u4E0B\u6587\uFF08\u6269\u5C55 FastifyRequest\uFF09\n */\nexport interface IRequestContext {\n /** \u4F1A\u8BDD ID */\n sessionId?: string;\n\n /** Token \u6570\u91CF */\n tokenCount?: number;\n\n /** \u4F7F\u7528\u7684 agents */\n agents?: string[];\n\n /** \u89E6\u53D1\u5206\u6790\u7ED3\u679C */\n triggerResult?: IAnalysisResult;\n\n /** \u8BF7\u6C42 ID */\n id?: string;\n\n /** \u6CBB\u7406\u8FFD\u8E2A\u4FE1\u606F */\n governanceTrace?: IGovernanceTrace;\n\n /** \u8BF7\u6C42 URL */\n url?: string;\n\n /** \u8FD0\u884C\u65F6\u5E94\u7528\u914D\u7F6E\uFF0C\u7528\u4E8E\u89E3\u6790 modelId \u7B49\u9AD8\u5C42\u62BD\u8C61 */\n appConfig?: IAppConfig;\n\n /** \u8BF7\u6C42\u4F53 */\n body: {\n model: string;\n messages: MessageParam[];\n system?: any;\n tools?: any[];\n thinking?: any;\n metadata?: any;\n };\n}\n", "/**\n * Pattern Matcher\n *\n * \u6A21\u5F0F\u5339\u914D\u5668\uFF0C\u652F\u6301\u7CBE\u786E\u5339\u914D\u548C\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\n */\n\nimport { ITriggerPattern, IMatchResult } from './types';\nimport { LRUCache } from 'lru-cache';\nimport { logError, logWarn } from '../utils/log';\n\n/**\n * \u6B63\u5219\u8868\u8FBE\u5F0F\u7F13\u5B58\n * \u907F\u514D\u91CD\u590D\u7F16\u8BD1\u76F8\u540C\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\n */\nconst regexCache = new LRUCache<string, RegExp>({\n max: 100,\n ttl: 1000 * 60 * 30, // 30 \u5206\u949F\n});\n\n/**\n * \u6A21\u5F0F\u5339\u914D\u5668\u7C7B\n */\nexport class PatternMatcher {\n /**\n * \u7CBE\u786E\u5339\u914D\n * \u68C0\u67E5\u6587\u672C\u662F\u5426\u5305\u542B\u4EFB\u4E00\u5173\u952E\u8BCD\n *\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\n * @param keywords \u5173\u952E\u8BCD\u5217\u8868\n * @param caseSensitive \u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\n * @returns \u5339\u914D\u7ED3\u679C\n */\n matchExact(\n text: string,\n keywords: string[],\n caseSensitive: boolean = false\n ): IMatchResult {\n if (!text || !keywords || keywords.length === 0) {\n return { matched: false };\n }\n\n const searchText = caseSensitive ? text : text.toLowerCase();\n\n for (const keyword of keywords) {\n if (!keyword) continue;\n\n const searchKeyword = caseSensitive ? keyword : keyword.toLowerCase();\n\n if (searchText.includes(searchKeyword)) {\n return {\n matched: true,\n matchedKeyword: keyword,\n };\n }\n }\n\n return { matched: false };\n }\n\n /**\n * \u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\n * \u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F\u68C0\u67E5\u6587\u672C\n *\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\n * @param pattern \u6B63\u5219\u8868\u8FBE\u5F0F\u6A21\u5F0F\u5B57\u7B26\u4E32\n * @returns \u5339\u914D\u7ED3\u679C\n */\n matchRegex(text: string, pattern: string): IMatchResult {\n if (!text || !pattern) {\n return { matched: false };\n }\n\n try {\n // \u5C1D\u8BD5\u4ECE\u7F13\u5B58\u83B7\u53D6\u7F16\u8BD1\u597D\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\n let regex = regexCache.get(pattern);\n\n if (!regex) {\n // \u7F16\u8BD1\u6B63\u5219\u8868\u8FBE\u5F0F\n regex = new RegExp(pattern, 'gm');\n regexCache.set(pattern, regex);\n }\n\n // \u91CD\u7F6E\u6B63\u5219\u8868\u8FBE\u5F0F\u7684 lastIndex\n regex.lastIndex = 0;\n\n const match = regex.exec(text);\n\n if (match) {\n return {\n matched: true,\n regexMatch: match,\n };\n }\n } catch (error) {\n logError(`[PatternMatcher] Invalid regex pattern: ${pattern}`, error);\n }\n\n return { matched: false };\n }\n\n /**\n * \u4F7F\u7528\u6307\u5B9A\u7684\u6A21\u5F0F\u8FDB\u884C\u5339\u914D\n *\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\n * @param pattern \u89E6\u53D1\u6A21\u5F0F\u914D\u7F6E\n * @returns \u5339\u914D\u7ED3\u679C\n */\n match(text: string, pattern: ITriggerPattern): IMatchResult {\n if (!text || !pattern) {\n return { matched: false };\n }\n\n switch (pattern.type) {\n case 'exact':\n return this.matchExact(\n text,\n pattern.keywords || [],\n pattern.caseSensitive || false\n );\n\n case 'regex':\n if (!pattern.pattern) {\n return { matched: false };\n }\n return this.matchRegex(text, pattern.pattern);\n\n default:\n logWarn(`[PatternMatcher] Unknown pattern type: ${pattern.type}`);\n return { matched: false };\n }\n }\n\n /**\n * \u68C0\u67E5\u6587\u672C\u662F\u5426\u5339\u914D\u4EFB\u4E00\u6A21\u5F0F\n *\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\n * @param patterns \u6A21\u5F0F\u5217\u8868\n * @returns \u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u7ED3\u679C\uFF0C\u5982\u679C\u6CA1\u6709\u5339\u914D\u5219\u8FD4\u56DE false\n */\n matchAny(text: string, patterns: ITriggerPattern[]): IMatchResult {\n if (!text || !patterns || patterns.length === 0) {\n return { matched: false };\n }\n\n for (const pattern of patterns) {\n const result = this.match(text, pattern);\n if (result.matched) {\n return result;\n }\n }\n\n return { matched: false };\n }\n\n /**\n * \u6E05\u9664\u6B63\u5219\u8868\u8FBE\u5F0F\u7F13\u5B58\n */\n clearCache(): void {\n regexCache.clear();\n }\n}\n\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\nexport const patternMatcher = new PatternMatcher();\n", "/**\n * Context Analyzer\n *\n * \u4E0A\u4E0B\u6587\u5206\u6790\u5668\uFF0C\u8D1F\u8D23\u4ECE\u8BF7\u6C42\u4E2D\u63D0\u53D6\u7528\u6237\u6D88\u606F\u5185\u5BB9\n */\n\nimport { MessageParam } from \"@anthropic-ai/sdk/resources/messages\";\nimport { AnalysisScope, ITriggerConfig, IRequestContext } from './types';\n\n/**\n * \u4E0A\u4E0B\u6587\u5206\u6790\u5668\u7C7B\n */\nexport class ContextAnalyzer {\n /**\n * \u4ECE\u6D88\u606F\u4E2D\u63D0\u53D6\u6587\u672C\u5185\u5BB9\n *\n * @param message \u6D88\u606F\u5BF9\u8C61\n * @returns \u63D0\u53D6\u7684\u6587\u672C\u5185\u5BB9\n */\n private extractTextFromMessage(message: MessageParam): string {\n if (typeof message.content === 'string') {\n return message.content;\n }\n\n if (Array.isArray(message.content)) {\n return message.content\n .filter((part: any) => part.type === 'text' && part.text)\n .map((part: any) => part.text)\n .join('\\n');\n }\n\n return '';\n }\n\n /**\n * \u63D0\u53D6\u6700\u540E\u4E00\u6761\u7528\u6237\u6D88\u606F\n *\n * @param messages \u6D88\u606F\u5217\u8868\n * @returns \u6700\u540E\u4E00\u6761\u7528\u6237\u6D88\u606F\u7684\u6587\u672C\u5185\u5BB9\n */\n extractLastUserMessage(messages: MessageParam[]): string {\n if (!messages || messages.length === 0) {\n return '';\n }\n\n // \u4ECE\u540E\u5F80\u524D\u627E\u6700\u540E\u4E00\u6761\u7528\u6237\u6D88\u606F\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message.role === 'user') {\n return this.extractTextFromMessage(message);\n }\n }\n\n return '';\n }\n\n /**\n * \u63D0\u53D6\u6240\u6709\u7528\u6237\u6D88\u606F\n *\n * @param messages \u6D88\u606F\u5217\u8868\n * @returns \u6240\u6709\u7528\u6237\u6D88\u606F\u7684\u6587\u672C\u5185\u5BB9\u6570\u7EC4\n */\n extractAllUserMessages(messages: MessageParam[]): string[] {\n if (!messages || messages.length === 0) {\n return [];\n }\n\n return messages\n .filter((message) => message.role === 'user')\n .map((message) => this.extractTextFromMessage(message));\n }\n\n /**\n * \u6839\u636E\u914D\u7F6E\u7684\u5206\u6790\u8303\u56F4\u63D0\u53D6\u6587\u672C\n *\n * @param messages \u6D88\u606F\u5217\u8868\n * @param scope \u5206\u6790\u8303\u56F4\n * @returns \u63D0\u53D6\u7684\u6587\u672C\u5185\u5BB9\n */\n extractTextByScope(messages: MessageParam[], scope: AnalysisScope): string {\n switch (scope) {\n case 'last_message':\n return this.extractLastUserMessage(messages);\n\n case 'full_conversation':\n const allMessages = this.extractAllUserMessages(messages);\n return allMessages.join('\\n\\n---\\n\\n');\n\n default:\n return this.extractLastUserMessage(messages);\n }\n }\n\n /**\n * \u5206\u6790\u8BF7\u6C42\uFF0C\u63D0\u53D6\u5F85\u5206\u6790\u7684\u6587\u672C\n *\n * @param req \u8BF7\u6C42\u5BF9\u8C61\n * @param config \u89E6\u53D1\u914D\u7F6E\n * @returns \u5F85\u5206\u6790\u7684\u6587\u672C\u5185\u5BB9\n */\n analyze(req: IRequestContext, config: ITriggerConfig): string {\n const messages = req.body?.messages;\n\n if (!messages) {\n return '';\n }\n\n const scope = config.analysis_scope || 'last_message';\n\n return this.extractTextByScope(messages, scope);\n }\n\n /**\n * \u68C0\u67E5\u6D88\u606F\u662F\u5426\u5305\u542B\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\n * \u5982\u679C\u6D88\u606F\u4E3B\u8981\u662F\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\uFF0C\u53EF\u80FD\u9700\u8981\u8DF3\u8FC7\u5206\u6790\n *\n * @param messages \u6D88\u606F\u5217\u8868\n * @returns \u662F\u5426\u4E3B\u8981\u662F\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\n */\n hasToolResults(messages: MessageParam[]): boolean {\n if (!messages || messages.length === 0) {\n return false;\n }\n\n // \u68C0\u67E5\u6700\u540E\u4E00\u6761\u7528\u6237\u6D88\u606F\n const lastMessage = messages[messages.length - 1];\n if (lastMessage.role !== 'user') {\n return false;\n }\n\n if (Array.isArray(lastMessage.content)) {\n const toolResults = lastMessage.content.filter(\n (part: any) => part.type === 'tool_result'\n );\n // \u5982\u679C\u5DE5\u5177\u7ED3\u679C\u5360\u6BD4\u8D85\u8FC7 50%\uFF0C\u8BA4\u4E3A\u4E3B\u8981\u662F\u5DE5\u5177\u8C03\u7528\n return toolResults.length > lastMessage.content.length / 2;\n }\n\n return false;\n }\n}\n\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\nexport const contextAnalyzer = new ContextAnalyzer();\n", "/**\r\n * Intent Detector\r\n *\r\n * \u610F\u56FE\u8BC6\u522B\u5668\uFF0C\u4F7F\u7528 LLM \u8F85\u52A9\u8BC6\u522B\u7528\u6237\u610F\u56FE\r\n */\r\n\r\nimport { LRUCache } from 'lru-cache';\r\nimport { ITriggerConfig, ITriggerRule, IIntentResult } from './types';\r\nimport { DEFAULT_CONFIG } from '../constants';\r\nimport { logError, logWarn } from '../utils/log';\r\n\r\n/**\r\n * \u610F\u56FE\u8BC6\u522B\u7F13\u5B58\r\n * \u76F8\u540C\u7684\u8F93\u5165\u5728\u7F13\u5B58\u6709\u6548\u671F\u5185\u76F4\u63A5\u8FD4\u56DE\u7F13\u5B58\u7ED3\u679C\r\n */\r\nconst intentCache = new LRUCache<string, IIntentResult>({\r\n max: 500,\r\n ttl: 1000 * 60 * 10, // 10 \u5206\u949F\r\n});\r\n\r\n/**\r\n * \u610F\u56FE\u8BC6\u522B\u7684 Prompt \u6A21\u677F\r\n */\r\nconst INTENT_PROMPT_TEMPLATE = `You are an intent classifier for an AI assistant router.\r\nAnalyze the following user message and identify the primary intent.\r\n\r\nUser Message:\r\n\"\"\"\r\n{message}\r\n\"\"\"\r\n\r\nAvailable intent categories:\r\n{intents}\r\n\r\nRespond in the following JSON format only:\r\n{\r\n \"intent\": \"<intent_name>\",\r\n \"confidence\": <0.0-1.0>,\r\n \"reasoning\": \"<brief explanation>\"\r\n}\r\n\r\nIf the message doesn't match any category well, respond with:\r\n{\r\n \"intent\": \"general\",\r\n \"confidence\": 0.5,\r\n \"reasoning\": \"No specific intent matched\"\r\n}\r\n\r\nImportant: Respond ONLY with the JSON, no additional text.`;\r\n\r\n/**\r\n * \u610F\u56FE\u8BC6\u522B\u5668\u7C7B\r\n */\r\nexport class IntentDetector {\r\n /**\r\n * \u751F\u6210\u7F13\u5B58 key\r\n * \u4F7F\u7528\u6D88\u606F\u5185\u5BB9\u7684 hash \u4F5C\u4E3A key\r\n */\r\n private generateCacheKey(text: string, intents: string[]): string {\r\n const content = `${text}:${intents.join(',')}`;\r\n // \u7B80\u5355\u7684 hash \u51FD\u6570\r\n let hash = 0;\r\n for (let i = 0; i < content.length; i++) {\r\n const char = content.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash; // Convert to 32bit integer\r\n }\r\n return hash.toString(16);\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA intent \u5217\u8868\u5B57\u7B26\u4E32\r\n */\r\n private buildIntentsList(rules: ITriggerRule[]): string {\r\n return rules\r\n .filter((rule) => rule.enabled)\r\n .map((rule) => `- ${rule.name}: ${rule.description || 'No description'}`)\r\n .join('\\n');\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u610F\u56FE\u8BC6\u522B\u7684 prompt\r\n */\r\n private buildPrompt(message: string, rules: ITriggerRule[]): string {\r\n const intents = this.buildIntentsList(rules);\r\n\r\n return INTENT_PROMPT_TEMPLATE\r\n .replace('{message}', message)\r\n .replace('{intents}', intents);\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528 LLM \u68C0\u6D4B\u610F\u56FE\r\n *\r\n * @param text \u5F85\u5206\u6790\u7684\u6587\u672C\r\n * @param config \u89E6\u53D1\u914D\u7F6E\r\n * @param fetchFn fetch \u51FD\u6570\uFF08\u7528\u4E8E\u53D1\u8D77 API \u8BF7\u6C42\uFF09\r\n * @returns \u610F\u56FE\u8BC6\u522B\u7ED3\u679C\r\n */\r\n async detectIntent(\r\n text: string,\r\n config: ITriggerConfig,\r\n port: number = DEFAULT_CONFIG.PORT,\r\n fetchFn?: typeof fetch,\r\n apiKey?: string,\r\n timeoutMs?: number\r\n ): Promise<IIntentResult> {\r\n // \u5982\u679C\u6CA1\u6709\u542F\u7528 LLM \u610F\u56FE\u8BC6\u522B\uFF0C\u8FD4\u56DE\u9ED8\u8BA4\u7ED3\u679C\r\n if (!config.llm_intent_recognition) {\r\n return {\r\n intent: 'general',\r\n confidence: 0,\r\n };\r\n }\r\n\r\n // \u5982\u679C\u6CA1\u6709\u914D\u7F6E intent_model\uFF0C\u8FD4\u56DE\u9ED8\u8BA4\u7ED3\u679C\r\n if (!config.intent_model) {\r\n logWarn('[IntentDetector] LLM intent recognition enabled but no intent_model configured');\r\n return {\r\n intent: 'general',\r\n confidence: 0,\r\n };\r\n }\r\n\r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cacheKey = this.generateCacheKey(text, config.rules.map(r => r.name));\r\n const cachedResult = intentCache.get(cacheKey);\r\n if (cachedResult) {\r\n return cachedResult;\r\n }\r\n\r\n try {\r\n const fetchImpl = fetchFn || fetch;\r\n\r\n // \u6784\u5EFA prompt\r\n const prompt = this.buildPrompt(text, config.rules);\r\n\r\n // \u8C03\u7528 LLM API\r\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\r\n },\r\n body: JSON.stringify({\r\n model: config.intent_model,\r\n max_tokens: 256,\r\n messages: [\r\n {\r\n role: 'user',\r\n content: prompt,\r\n },\r\n ],\r\n }),\r\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\r\n });\r\n\r\n if (!response.ok) {\r\n logError('[IntentDetector] LLM request failed:', response.status);\r\n return { intent: 'general', confidence: 0 };\r\n }\r\n\r\n const data = await response.json() as any;\r\n\r\n // \u89E3\u6790 LLM \u54CD\u5E94\r\n const content = data.content?.[0]?.text || '';\r\n\r\n // \u63D0\u53D6 JSON\r\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\r\n if (!jsonMatch) {\r\n logWarn('[IntentDetector] No JSON found in LLM response');\r\n return { intent: 'general', confidence: 0 };\r\n }\r\n\r\n const result = JSON.parse(jsonMatch[0]) as IIntentResult;\r\n\r\n // \u7F13\u5B58\u7ED3\u679C\r\n intentCache.set(cacheKey, result);\r\n\r\n return result;\r\n } catch (error) {\r\n logError('[IntentDetector] Error detecting intent:', error);\r\n return { intent: 'general', confidence: 0 };\r\n }\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u610F\u56FE\u627E\u5230\u5339\u914D\u7684\u89C4\u5219\r\n *\r\n * @param intent \u610F\u56FE\u540D\u79F0\r\n * @param rules \u89C4\u5219\u5217\u8868\r\n * @returns \u5339\u914D\u7684\u89C4\u5219\uFF0C\u5982\u679C\u6CA1\u6709\u5339\u914D\u5219\u8FD4\u56DE null\r\n */\r\n findRuleByIntent(intent: string, rules: ITriggerRule[]): ITriggerRule | null {\r\n return rules.find(\r\n (rule) => rule.enabled && rule.name.toLowerCase() === intent.toLowerCase()\r\n ) || null;\r\n }\r\n\r\n /**\r\n * \u6E05\u9664\u7F13\u5B58\r\n */\r\n clearCache(): void {\r\n intentCache.clear();\r\n }\r\n}\r\n\r\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\r\nexport const intentDetector = new IntentDetector();\r\n", "/**\r\n * SmartRouter Selector\r\n *\r\n * \u667A\u80FD\u8DEF\u7531\u9009\u62E9\u5668\uFF0C\u4F7F\u7528 LLM \u4ECE\u5019\u9009\u6A21\u578B\u5217\u8868\u4E2D\u9009\u62E9\u6700\u4F18\u6A21\u578B\r\n */\r\n\r\nimport { LRUCache } from 'lru-cache';\r\nimport { ISmartRouterConfig } from './types';\r\nimport { DEFAULT_CONFIG } from '../constants';\r\nimport { logError, logWarn } from '../utils/log';\r\nimport { createSingleUserTextIR } from '../protocols/message-ir';\r\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\r\n\r\n/**\r\n * SmartRouter \u9009\u62E9\u7ED3\u679C\r\n */\r\nexport interface ISmartRouterResult {\n /** \u9009\u4E2D\u7684\u6A21\u578B\uFF0C\u683C\u5F0F\uFF1Aprovider_name,model_name */\r\n model: string;\r\n\r\n /** \u7F6E\u4FE1\u5EA6 0-1 */\r\n confidence: number;\r\n\r\n /** LLM \u7684\u9009\u62E9\u7406\u7531 */\r\n reasoning?: string;\n}\n\nexport interface ISmartRouterHintContext {\n taskSummary?: string;\n topRouteCandidates?: Array<{\n name: string;\n model: string;\n description?: string;\n confidence?: number;\n }>;\n}\n\r\n/**\r\n * SmartRouter Prompt \u6A21\u677F\r\n */\r\n/**\n * \u667A\u80FD\u8DEF\u7531\u9009\u62E9\u5668\u7C7B\n */\nexport class SmartRouterSelector {\n private cache: LRUCache<string, ISmartRouterResult>;\r\n\r\n constructor() {\r\n this.cache = new LRUCache<string, ISmartRouterResult>({\r\n max: 500,\r\n ttl: 600000, // \u9ED8\u8BA4 10 \u5206\u949F\uFF0C\u5177\u4F53\u6761\u76EE\u53EF\u88AB config.cache_ttl \u8986\u76D6\r\n });\r\n }\r\n\r\n /**\r\n * \u751F\u6210\u7F13\u5B58 key\uFF08\u57FA\u4E8E\u8BF7\u6C42\u6587\u672C + router_model + \u5019\u9009\u6A21\u578B\u5217\u8868\uFF09\r\n * \u6CE8\u610F\uFF1A\u5305\u542B router_model \u4EE5\u9632\u6B62\u5207\u6362\u8DEF\u7531\u6A21\u578B\u540E\u547D\u4E2D\u65E7\u7F13\u5B58\r\n */\r\n private generateCacheKey(text: string, routerModel: string, candidates: ISmartRouterConfig['candidates']): string {\r\n const content = `${text}:${routerModel}:${candidates.map(c => c.model).join(',')}`;\r\n let hash = 0;\r\n for (let i = 0; i < content.length; i++) {\r\n const char = content.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return hash.toString(16);\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u5019\u9009\u6A21\u578B\u5217\u8868\u5B57\u7B26\u4E32\r\n */\r\n private buildCandidatesList(candidates: ISmartRouterConfig['candidates']): string {\r\n return candidates\r\n .map((c, i) => `${i + 1}. ${c.model} - ${c.description}`)\r\n .join('\\n');\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u5B8C\u6574 prompt\r\n */\r\n private buildPrompt(text: string, candidates: ISmartRouterConfig['candidates'], hint?: ISmartRouterHintContext): string {\n const sections = [\n 'You are a model routing assistant. Your job is to select the most appropriate AI model from the given candidates to handle the user\\'s request.',\n ];\n\n if (hint?.taskSummary) {\n sections.push(`Task summary:\\n\"\"\"\\n${hint.taskSummary}\\n\"\"\"`);\n }\n\n if (hint?.topRouteCandidates?.length) {\n sections.push(\n 'Pre-filtered route candidates:\\n' +\n hint.topRouteCandidates\n .map((candidate, index) =>\n `${index + 1}. ${candidate.name} -> ${candidate.model}` +\n `${candidate.description ? ` (${candidate.description})` : ''}` +\n `${candidate.confidence !== undefined ? ` [confidence=${candidate.confidence}]` : ''}`\n )\n .join('\\n')\n );\n }\n\n sections.push(\n `User request:\\n\"\"\"\\n${text}\\n\"\"\"`,\n `Available models:\\n${this.buildCandidatesList(candidates)}`,\n `Select the most appropriate model and respond in the following JSON format ONLY:\n{\n \"model\": \"<exact model identifier from the list>\",\n \"confidence\": <0.0-1.0>,\n \"reasoning\": \"<brief explanation>\"\n}\n\nImportant:\n- The \"model\" field MUST be one of the exact identifiers listed above\n- Respond ONLY with the JSON, no additional text`\n );\n\n return sections.join('\\n\\n');\n }\n\r\n /**\r\n * \u4F7F\u7528 LLM \u9009\u62E9\u6700\u4F18\u6A21\u578B\r\n *\r\n * @param text \u8BF7\u6C42\u6587\u672C\r\n * @param config SmartRouter \u914D\u7F6E\r\n * @param port \u672C\u5730\u670D\u52A1\u7AEF\u53E3\uFF08\u9ED8\u8BA4 5678\uFF09\r\n * @param fetchFn \u53EF\u6CE8\u5165\u7684 fetch \u51FD\u6570\uFF08\u7528\u4E8E\u6D4B\u8BD5\uFF09\r\n * @returns \u9009\u62E9\u7ED3\u679C\uFF0C\u5931\u8D25\u65F6\u8FD4\u56DE null\r\n */\r\n async selectModel(\n text: string,\n config: ISmartRouterConfig,\n port: number = DEFAULT_CONFIG.PORT,\n fetchFn?: typeof fetch,\n apiKey?: string,\n timeoutMs?: number,\n hint?: ISmartRouterHintContext\n ): Promise<ISmartRouterResult | null> {\n // \u672A\u542F\u7528\u6216\u5019\u9009\u4E0D\u8DB3\n if (!config.enabled) {\n return null;\n }\n\n if (!config.router_model) {\n return null;\n }\n\n if (!config.candidates || config.candidates.length < 2) {\n return null;\n }\n\r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cacheKey = this.generateCacheKey(text, config.router_model, config.candidates);\r\n const cached = this.cache.get(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n try {\r\n const fetchImpl = fetchFn || fetch;\r\n const prompt = this.buildPrompt(text, config.candidates, hint);\n\r\n const response = await fetchImpl(`http://127.0.0.1:${port}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-ctr-smart-router': '1',\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\r\n toAnthropicMessagesRequest({\r\n model: config.router_model,\r\n max_tokens: config.max_tokens ?? 256,\r\n ir: createSingleUserTextIR(prompt),\r\n })\r\n ),\r\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\r\n });\r\n\r\n if (!response.ok) {\r\n logError('[SmartRouter] LLM request failed:', (response as any).status);\r\n return null;\r\n }\r\n\r\n const data = await response.json() as any;\r\n const content = data.content?.[0]?.text || '';\r\n\r\n // \u63D0\u53D6 JSON\r\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\r\n if (!jsonMatch) {\r\n logWarn('[SmartRouter] No JSON found in LLM response');\r\n return null;\r\n }\r\n\r\n const parsed = JSON.parse(jsonMatch[0]) as ISmartRouterResult;\r\n\r\n // \u9A8C\u8BC1\u8FD4\u56DE\u7684\u6A21\u578B\u5728\u5019\u9009\u5217\u8868\u4E2D\r\n const validModels = config.candidates.map(c => c.model);\r\n if (!validModels.includes(parsed.model)) {\r\n logWarn(`[SmartRouter] LLM returned unknown model: \"${parsed.model}\"`);\r\n return null;\r\n }\r\n\r\n // \u7F13\u5B58\u7ED3\u679C\uFF08\u4F7F\u7528\u914D\u7F6E\u7684 TTL \u8FDB\u884C\u6309\u6761\u76EE\u8986\u76D6\uFF09\r\n this.cache.set(cacheKey, parsed, { ttl: config.cache_ttl ?? 600000 });\r\n\r\n return parsed;\r\n } catch (error) {\r\n logError('[SmartRouter] Error selecting model:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u9664\u7F13\u5B58\uFF08\u7528\u4E8E\u6D4B\u8BD5\uFF09\r\n */\r\n clearCache(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n\r\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\r\nexport const smartRouterSelector = new SmartRouterSelector();\r\n", "/**\r\n * Model Selector\r\n *\r\n * \u6A21\u578B\u9009\u62E9\u5668\uFF0C\u8D1F\u8D23\u6839\u636E\u89E6\u53D1\u89C4\u5219\u9009\u62E9\u5408\u9002\u7684\u6A21\u578B\r\n */\r\n\r\nimport { ITriggerConfig, ITriggerRule, IAnalysisResult, IMatchResult, IRequestContext, ISmartRouterConfig, IAppConfig } from './types';\nimport { patternMatcher } from './matcher';\r\nimport { contextAnalyzer } from './analyzer';\r\nimport { intentDetector } from './intent';\r\nimport { smartRouterSelector } from './smart-router';\r\nimport { log, logError } from '../utils/log';\r\nimport { DEFAULT_CONFIG } from '../constants';\r\nimport { IGovernanceConfig } from '../governance/types';\r\nimport { createTaskFingerprint, sessionStateStore } from '../governance/session-store';\r\nimport { semanticRouter } from '../governance/semantic-router';\nimport { resolveModelReference } from '../models/compile';\n\ninterface IStickyCorrectionContext {\n sessionModel?: string;\n fingerprint?: string;\n}\n\r\n/**\r\n * \u6A21\u578B\u9009\u62E9\u5668\u7C7B\r\n */\r\nexport class ModelSelector {\n private isRoutingEnabled(config: ITriggerConfig, smartRouterConfig?: ISmartRouterConfig): boolean {\n if (smartRouterConfig) {\n return Boolean(smartRouterConfig.enabled);\n }\n return Boolean(config.enabled);\n }\n\n private getRoutingRules(config: ITriggerConfig, smartRouterConfig?: ISmartRouterConfig): ITriggerRule[] {\n return smartRouterConfig?.rules?.length\n ? smartRouterConfig.rules\n : config.rules;\n }\n\n private getEffectiveGovernanceConfig(\n smartRouterConfig?: ISmartRouterConfig,\n governanceConfig?: IGovernanceConfig\n ): IGovernanceConfig | undefined {\n if (!smartRouterConfig?.semantic && !smartRouterConfig?.sticky) {\n return governanceConfig;\n }\n\n return {\n ...(governanceConfig ?? {}),\n enabled: Boolean(\n governanceConfig?.enabled ||\n smartRouterConfig.semantic?.enabled ||\n smartRouterConfig.sticky?.enabled\n ),\n sticky: smartRouterConfig.sticky\n ? {\n ...(governanceConfig?.sticky ?? {}),\n ...smartRouterConfig.sticky,\n }\n : governanceConfig?.sticky,\n semantic: smartRouterConfig.semantic\n ? {\n ...(governanceConfig?.semantic ?? {}),\n ...smartRouterConfig.semantic,\n prototypes: {\n ...(governanceConfig?.semantic?.prototypes ?? {}),\n ...(smartRouterConfig.semantic?.prototypes ?? {}),\n },\n }\n : governanceConfig?.semantic,\n cascade: governanceConfig?.cascade,\n shadow: governanceConfig?.shadow,\n observability: governanceConfig?.observability,\n };\n }\n\n private resolveRouteModel(appConfig: IAppConfig | undefined, ref: string | undefined): string | undefined {\n if (!ref) {\n return undefined;\n }\n return appConfig ? resolveModelReference(appConfig, ref) ?? ref : ref;\n }\n\n private buildSemanticCandidates(\n rules: ITriggerRule[],\n governanceConfig?: IGovernanceConfig\n ) {\n const defaultThreshold = governanceConfig?.semantic?.threshold;\n const legacyPrototypes = governanceConfig?.semantic?.prototypes ?? {};\n\n return this.sortRulesByPriority(rules)\n .map((rule) => {\n const prototype = rule.semantic_profile?.prototype\n ?? legacyPrototypes[rule.name]\n ?? rule.description;\n const semanticEnabled = rule.semantic_profile?.enabled !== false && Boolean(prototype);\n if (!semanticEnabled || !prototype) {\n return null;\n }\n\n return {\n rule,\n prototype,\n threshold: rule.semantic_profile?.threshold ?? defaultThreshold,\n };\n })\n .filter(Boolean) as Array<{ rule: ITriggerRule; prototype: string; threshold?: number }>;\n }\n\n private getStickyCorrection(\n text: string,\n req: IRequestContext,\n governanceConfig?: IGovernanceConfig\n ): IStickyCorrectionContext {\n if (!governanceConfig?.enabled || !governanceConfig.sticky?.enabled || !req.sessionId) {\n return {};\n }\n\n const fingerprint = createTaskFingerprint(text);\n const sessionState = sessionStateStore.get(req.sessionId);\n if (\n !fingerprint ||\n sessionState?.lastTaskFingerprint !== fingerprint ||\n !(sessionState.preferredModel || sessionState.lastSuccessfulModel)\n ) {\n return {};\n }\n\n return {\n fingerprint,\n sessionModel: sessionState.preferredModel || sessionState.lastSuccessfulModel,\n };\n }\n\n private applyStickyCorrection(\n candidate: IAnalysisResult | null,\n sticky: IStickyCorrectionContext,\n appConfig?: IAppConfig\n ): IAnalysisResult | null {\n if (!sticky.sessionModel) {\n return candidate;\n }\n\n const stickyModel = this.resolveRouteModel(appConfig, sticky.sessionModel);\n if (!stickyModel) {\n return candidate;\n }\n\n if (!candidate) {\n log(`[StickyRouting] Reusing model \"${stickyModel}\" as unified router correction`);\n return {\n matched: true,\n model: stickyModel,\n confidence: 0.95,\n analysisTime: 0,\n routeSource: 'sticky_correction',\n };\n }\n\n if (candidate.model === stickyModel) {\n return candidate;\n }\n\n log(`[StickyRouting] Correcting selected model \"${candidate.model}\" -> \"${stickyModel}\"`);\n return {\n ...candidate,\n model: stickyModel,\n confidence: Math.max(candidate.confidence, 0.95),\n routeSource: 'sticky_correction',\n };\n }\n\n private buildSmartRouterHint(text: string, rules: ITriggerRule[]) {\n return {\n taskSummary: text.slice(0, 240),\n topRouteCandidates: this.sortRulesByPriority(rules)\n .filter((rule) => rule.description)\n .slice(0, 3)\n .map((rule) => ({\n name: rule.name,\n model: rule.model,\n description: rule.description,\n confidence: undefined,\n })),\n };\n }\n /**\r\n * \u6309\u4F18\u5148\u7EA7\u6392\u5E8F\u89C4\u5219\r\n * \u4F18\u5148\u7EA7\u6570\u503C\u8D8A\u5927\uFF0C\u4F18\u5148\u7EA7\u8D8A\u9AD8\r\n *\r\n * @param rules \u89C4\u5219\u5217\u8868\r\n * @returns \u6392\u5E8F\u540E\u7684\u89C4\u5219\u5217\u8868\uFF08\u964D\u5E8F\uFF09\r\n */\r\n sortRulesByPriority(rules: ITriggerRule[]): ITriggerRule[] {\r\n return [...rules]\r\n .filter((rule) => rule.enabled !== false)\r\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528\u89C4\u5219\u5339\u914D\u6587\u672C\r\n *\r\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\r\n * @param rule \u89C4\u5219\r\n * @returns \u5339\u914D\u7ED3\u679C\r\n */\r\n matchRule(text: string, rule: ITriggerRule): IMatchResult {\r\n if (!text || !rule || !rule.patterns || rule.patterns.length === 0) {\r\n return { matched: false };\r\n }\r\n\r\n return patternMatcher.matchAny(text, rule.patterns);\r\n }\r\n\r\n /**\r\n * \u4ECE\u6587\u672C\u4E2D\u5339\u914D\u89C4\u5219\r\n * \u6309\u4F18\u5148\u7EA7\u987A\u5E8F\u5339\u914D\uFF0C\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u89C4\u5219\r\n *\r\n * @param text \u5F85\u5339\u914D\u7684\u6587\u672C\r\n * @param rules \u89C4\u5219\u5217\u8868\r\n * @returns \u5339\u914D\u7684\u89C4\u5219\uFF0C\u5982\u679C\u6CA1\u6709\u5339\u914D\u5219\u8FD4\u56DE null\r\n */\r\n matchRuleFromText(text: string, rules: ITriggerRule[]): { rule: ITriggerRule; result: IMatchResult } | null {\r\n if (!text || !rules || rules.length === 0) {\r\n return null;\r\n }\r\n\r\n // \u6309\u4F18\u5148\u7EA7\u6392\u5E8F\r\n const sortedRules = this.sortRulesByPriority(rules);\r\n\r\n for (const rule of sortedRules) {\r\n const result = this.matchRule(text, rule);\r\n if (result.matched) {\r\n return { rule, result };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * \u9009\u62E9\u6A21\u578B\r\n * \u7EFC\u5408\u4F7F\u7528\u5173\u952E\u8BCD\u5339\u914D\u548C LLM \u610F\u56FE\u8BC6\u522B\r\n *\r\n * @param req \u8BF7\u6C42\u5BF9\u8C61\r\n * @param config \u89E6\u53D1\u914D\u7F6E\r\n * @returns \u5206\u6790\u7ED3\u679C\r\n */\r\n async selectModel(\n req: IRequestContext,\n config: ITriggerConfig,\n port: number = DEFAULT_CONFIG.PORT,\r\n smartRouterConfig?: ISmartRouterConfig,\r\n governanceConfig?: IGovernanceConfig,\r\n apiKey?: string,\r\n timeoutMs?: number\r\n ): Promise<IAnalysisResult> {\n const startTime = Date.now();\n const appConfig = (req as any).appConfig as IAppConfig | undefined;\n const effectiveGovernanceConfig = this.getEffectiveGovernanceConfig(smartRouterConfig, governanceConfig);\n const routingRules = this.getRoutingRules(config, smartRouterConfig);\n const analysisConfig = smartRouterConfig?.analysis_scope\n ? {\n ...config,\n analysis_scope: smartRouterConfig.analysis_scope,\n }\n : config;\n\n // \u5982\u679C\u7EDF\u4E00\u8DEF\u7531\u672A\u542F\u7528\uFF0C\u76F4\u63A5\u8FD4\u56DE\u4E0D\u5339\u914D\n if (!this.isRoutingEnabled(config, smartRouterConfig)) {\n return {\n matched: false,\n confidence: 0,\n analysisTime: Date.now() - startTime,\r\n };\r\n }\r\n\n // \u63D0\u53D6\u5F85\u5206\u6790\u7684\u6587\u672C\n const text = contextAnalyzer.analyze(req, analysisConfig);\n\r\n if (!text) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: '',\r\n };\r\n }\n\n // \u7B2C\u4E00\u6B65\uFF1A\u5173\u952E\u8BCD/\u6B63\u5219\u5339\u914D\n const matchResult = this.matchRuleFromText(text, routingRules);\n\n if (matchResult) {\n return {\n matched: true,\r\n rule: matchResult.rule,\r\n model: appConfig ? resolveModelReference(appConfig, matchResult.rule.model) ?? matchResult.rule.model : matchResult.rule.model,\r\n confidence: 1.0, // \u5173\u952E\u8BCD\u5339\u914D\u7F6E\u4FE1\u5EA6\u4E3A 1\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: text,\r\n routeSource: 'smart_rule',\n };\n }\n\n const stickyCorrection = this.getStickyCorrection(text, req, effectiveGovernanceConfig);\n\n // \u7B2C\u4E8C\u6B65\uFF1ASemantic Router \u8BED\u4E49\u8F85\u52A9\u5339\u914D\n const semanticCandidates = this.buildSemanticCandidates(routingRules, effectiveGovernanceConfig);\n if (effectiveGovernanceConfig?.enabled && effectiveGovernanceConfig.semantic?.enabled && semanticCandidates.length > 0) {\n const semanticConfig = {\n ...effectiveGovernanceConfig.semantic,\n prototypes: Object.fromEntries(semanticCandidates.map((candidate) => [candidate.rule.name, candidate.prototype])),\n };\n const semanticResult = semanticConfig.mode === 'classifier'\n ? await semanticRouter.analyzeWithClassifier(\n text,\n semanticConfig,\n port,\n undefined,\n apiKey,\n timeoutMs\n )\n : semanticRouter.analyzeCandidates(\n text,\n semanticCandidates.map((candidate) => ({\n intent: candidate.rule.name,\n prototype: candidate.prototype,\n threshold: candidate.threshold,\n })),\n semanticConfig.threshold\n );\n if (semanticResult) {\n const matchedRule = routingRules.find(\n (rule) => rule.enabled !== false && rule.name.toLowerCase() === semanticResult.intent.toLowerCase()\n );\n\n if (matchedRule) {\n log(`[SemanticRouter] Matched intent \"${semanticResult.intent}\" -> \"${matchedRule.model}\"`);\n if (req.governanceTrace) {\n req.governanceTrace.semanticIntent = semanticResult.intent;\n }\n const semanticSelection: IAnalysisResult = {\n matched: true,\n rule: matchedRule,\n model: this.resolveRouteModel(appConfig, matchedRule.model),\n confidence: semanticResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'semantic_match',\n };\n return this.applyStickyCorrection(semanticSelection, stickyCorrection, appConfig) ?? semanticSelection;\n }\n }\n }\n\n // \u7B2C\u4E09\u6B65\uFF1ASmartRouter \u4F5C\u4E3A\u7ED3\u6784\u5316 fallback\n if (smartRouterConfig?.enabled && smartRouterConfig.router_model && smartRouterConfig.candidates?.length >= 2) {\n try {\n const resolvedSmartRouterConfig = appConfig ? {\n ...smartRouterConfig,\n router_model: this.resolveRouteModel(appConfig, smartRouterConfig.router_model) ?? smartRouterConfig.router_model,\n candidates: smartRouterConfig.candidates.map((candidate) => ({\n ...candidate,\n model: this.resolveRouteModel(appConfig, candidate.model) ?? candidate.model,\n })),\n } : smartRouterConfig;\n const smartResult = await smartRouterSelector.selectModel(\n text,\n resolvedSmartRouterConfig,\n port,\n undefined,\n apiKey,\n timeoutMs,\n this.buildSmartRouterHint(text, routingRules)\n );\n if (smartResult) {\n log(`[SmartRouter] Selected model \"${smartResult.model}\" (confidence: ${smartResult.confidence})`);\n const smartSelection: IAnalysisResult = {\n matched: true,\n model: smartResult.model,\n confidence: smartResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'smart_router',\n };\n return this.applyStickyCorrection(smartSelection, stickyCorrection, appConfig) ?? smartSelection;\n }\n } catch (error) {\n logError('[ModelSelector] SmartRouter error:', error);\n }\n }\n\n // \u7B2C\u56DB\u6B65\uFF1A\u4FDD\u7559 legacy intent fallback \u4F5C\u4E3A\u517C\u5BB9\u515C\u5E95\n if (!smartRouterConfig?.enabled && config.llm_intent_recognition && config.intent_model) {\n try {\n const intentResult = await intentDetector.detectIntent(text, config, port, undefined, apiKey, timeoutMs);\n\n if (intentResult.confidence > 0.5 && intentResult.intent !== 'general') {\n const matchedRule = intentDetector.findRuleByIntent(intentResult.intent, routingRules);\n\n if (matchedRule) {\n const intentSelection: IAnalysisResult = {\n matched: true,\n rule: matchedRule,\n model: this.resolveRouteModel(appConfig, matchedRule.model),\n confidence: intentResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'semantic_match',\n };\n return this.applyStickyCorrection(intentSelection, stickyCorrection, appConfig) ?? intentSelection;\n }\n }\n } catch (error) {\n logError('[ModelSelector] Intent detection error:', error);\n }\n }\n\n // \u7B2C\u4E94\u6B65\uFF1A\u82E5\u524D\u5C42\u5747\u672A\u7A33\u5B9A\u547D\u4E2D\uFF0C\u518D\u5C1D\u8BD5 sticky correction \u4F5C\u4E3A\u6700\u540E\u7A33\u5B9A\u6027\u4FEE\u6B63\n const stickyOnlySelection = this.applyStickyCorrection(null, stickyCorrection, appConfig);\n if (stickyOnlySelection) {\n return {\n ...stickyOnlySelection,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n };\n }\n\n return {\n matched: false,\n confidence: 0,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\r\n };\r\n }\r\n\r\n /**\r\n * \u540C\u6B65\u7248\u672C\u7684\u6A21\u578B\u9009\u62E9\r\n * \u4EC5\u4F7F\u7528\u5173\u952E\u8BCD\u5339\u914D\uFF0C\u4E0D\u8FDB\u884C LLM \u610F\u56FE\u8BC6\u522B\r\n *\r\n * @param req \u8BF7\u6C42\u5BF9\u8C61\r\n * @param config \u89E6\u53D1\u914D\u7F6E\r\n * @returns \u5206\u6790\u7ED3\u679C\r\n */\r\n selectModelSync(\n req: IRequestContext,\n config: ITriggerConfig,\n smartRouterConfig?: ISmartRouterConfig\n ): IAnalysisResult {\n const startTime = Date.now();\n const appConfig = (req as any).appConfig as IAppConfig | undefined;\n const effectiveGovernanceConfig = this.getEffectiveGovernanceConfig(smartRouterConfig, undefined);\n const analysisConfig = smartRouterConfig?.analysis_scope\n ? {\n ...config,\n analysis_scope: smartRouterConfig.analysis_scope,\n }\n : config;\n\n // \u5982\u679C\u7EDF\u4E00\u8DEF\u7531\u672A\u542F\u7528\uFF0C\u76F4\u63A5\u8FD4\u56DE\u4E0D\u5339\u914D\n if (!this.isRoutingEnabled(config, smartRouterConfig)) {\n return {\n matched: false,\n confidence: 0,\n analysisTime: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // \u63D0\u53D6\u5F85\u5206\u6790\u7684\u6587\u672C\n const text = contextAnalyzer.analyze(req, analysisConfig);\n\r\n if (!text) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: '',\r\n };\r\n }\n\n const routingRules = this.getRoutingRules(config, smartRouterConfig);\n const stickyCorrection = this.getStickyCorrection(text, req, effectiveGovernanceConfig);\n\n // \u7B2C\u4E00\u6B65\uFF1A\u5173\u952E\u8BCD/\u6B63\u5219\u5339\u914D\n const matchResult = this.matchRuleFromText(text, routingRules);\n\n if (matchResult) {\n return {\n matched: true,\n rule: matchResult.rule,\n model: appConfig ? resolveModelReference(appConfig, matchResult.rule.model) ?? matchResult.rule.model : matchResult.rule.model,\n confidence: 1.0,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'smart_rule',\n };\n }\n\n // \u7B2C\u4E8C\u6B65\uFF1A\u540C\u6B65\u8DEF\u5F84\u4E0B\u4E5F\u5C3D\u91CF\u6267\u884C\u8BED\u4E49\u589E\u5F3A\uFF08\u4EC5 embedding/prototype \u5206\u6790\uFF0C\u4E0D\u89E6\u53D1 classifier/LLM\uFF09\n const semanticCandidates = this.buildSemanticCandidates(routingRules, effectiveGovernanceConfig);\n if (effectiveGovernanceConfig?.enabled && effectiveGovernanceConfig.semantic?.enabled && semanticCandidates.length > 0) {\n const semanticResult = semanticRouter.analyzeCandidates(\n text,\n semanticCandidates.map((candidate) => ({\n intent: candidate.rule.name,\n prototype: candidate.prototype,\n threshold: candidate.threshold,\n })),\n effectiveGovernanceConfig.semantic.threshold\n );\n\n if (semanticResult) {\n const matchedRule = routingRules.find(\n (rule) => rule.enabled !== false && rule.name.toLowerCase() === semanticResult.intent.toLowerCase()\n );\n\n if (matchedRule) {\n const semanticSelection: IAnalysisResult = {\n matched: true,\n rule: matchedRule,\n model: this.resolveRouteModel(appConfig, matchedRule.model),\n confidence: semanticResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'semantic_match',\n };\n return this.applyStickyCorrection(semanticSelection, stickyCorrection, appConfig) ?? semanticSelection;\n }\n }\n }\n\n // \u7B2C\u4E09\u6B65\uFF1A\u540C\u6B65\u8DEF\u5F84\u4E0B\u82E5\u524D\u5C42\u90FD\u672A\u547D\u4E2D\uFF0C\u518D\u5C1D\u8BD5 sticky \u4F5C\u4E3A\u7A33\u5B9A\u4FEE\u6B63\n const stickyOnlySelection = this.applyStickyCorrection(null, stickyCorrection, appConfig);\n if (stickyOnlySelection) {\n return {\n ...stickyOnlySelection,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n };\n }\n\n // \u6CA1\u6709\u5339\u914D\u4EFB\u4F55\u89C4\u5219\n return {\n matched: false,\n confidence: 0,\r\n analysisTime: Date.now() - startTime,\r\n analyzedText: text,\r\n };\r\n }\r\n}\r\n\r\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\r\nexport const modelSelector = new ModelSelector();\r\n", "/**\r\n * SmartRouter runtime module\n *\r\n * \u89E6\u53D1\u8DEF\u7531\u6A21\u5757\u5165\u53E3\r\n */\r\n\r\nexport * from './types';\r\nexport * from './matcher';\r\nexport * from './analyzer';\r\nexport * from './intent';\r\nexport * from './selector';\r\nexport * from './smart-router';\r\n\r\nimport { ITriggerConfig, IAnalysisResult, IAppConfig, IRequestContext, ISmartRouterConfig } from './types';\r\nimport { appendTraceReason } from '../governance/trace';\nimport { modelSelector } from './selector';\nimport { contextAnalyzer } from './analyzer';\nimport { log, logError } from '../utils/log';\nimport { DEFAULT_CONFIG } from '../constants';\nimport { IGovernanceConfig } from '../governance/types';\nimport { deriveRuntimeSmartRouterConfig } from '../utils/config';\n\r\n/**\r\n * SmartRouter \u8FD0\u884C\u65F6\u5F15\u64CE\u3002\n *\n * TriggerRouter \u7C7B\u540D\u4FDD\u7559\u4E3A\u517C\u5BB9\u5BFC\u51FA\uFF1B\u8FD0\u884C\u65F6 contract \u5DF2\u4EE5 SmartRouter \u4E3A\u7EDF\u4E00\u5165\u53E3\u3002\n */\r\nexport class TriggerRouter {\r\n private config: ITriggerConfig | null = null;\r\n private appConfig: IAppConfig | null = null;\r\n private port: number = DEFAULT_CONFIG.PORT;\r\n private smartRouterConfig: ISmartRouterConfig | undefined = undefined;\n private governanceConfig: IGovernanceConfig | undefined = undefined;\r\n private apiKey?: string;\r\n private apiTimeoutMs?: number;\r\n\r\n /**\r\n * \u521D\u59CB\u5316 SmartRouter \u8FD0\u884C\u65F6\n *\r\n * @param appConfig \u5E94\u7528\u914D\u7F6E\r\n */\r\n init(appConfig: IAppConfig): void {\n this.appConfig = appConfig;\n this.config = appConfig.TriggerRouter || this.getDefaultConfig();\n this.port = appConfig.PORT || DEFAULT_CONFIG.PORT;\n this.smartRouterConfig = deriveRuntimeSmartRouterConfig(appConfig, appConfig);\n this.governanceConfig = appConfig.Governance;\n this.apiKey = appConfig.APIKEY;\n this.apiTimeoutMs = appConfig.API_TIMEOUT_MS;\n }\n\r\n /**\r\n * \u83B7\u53D6\u9ED8\u8BA4\u914D\u7F6E\r\n */\r\n private getDefaultConfig(): ITriggerConfig {\n return {\n enabled: false,\n analysis_scope: 'last_message',\n llm_intent_recognition: false,\n rules: [],\n };\n }\n\n /**\n * \u68C0\u67E5 SmartRouter \u8FD0\u884C\u65F6\u662F\u5426\u542F\u7528\n */\n isEnabled(): boolean {\n return Boolean(this.smartRouterConfig?.enabled);\n }\n\r\n /**\r\n * \u83B7\u53D6\u5F53\u524D\u914D\u7F6E\r\n */\r\n getConfig(): ITriggerConfig | null {\n return this.config;\n }\n\n getSmartRouterConfig(): ISmartRouterConfig | undefined {\n return this.smartRouterConfig;\n }\n\r\n /**\r\n * \u6267\u884C SmartRouter \u7EDF\u4E00\u8DEF\u7531\n * \u5206\u6790\u8BF7\u6C42\u5E76\u8FD4\u56DE\u5339\u914D\u7684\u6A21\u578B\r\n *\r\n * @param req \u8BF7\u6C42\u5BF9\u8C61\r\n * @returns \u5206\u6790\u7ED3\u679C\r\n */\r\n async route(req: IRequestContext): Promise<IAnalysisResult> {\n if (!this.config || !this.isEnabled()) {\n return {\n matched: false,\n confidence: 0,\n analysisTime: 0,\r\n };\r\n }\r\n\r\n // \u8DF3\u8FC7\u5DE5\u5177\u8C03\u7528\u5FAA\u73AF\u4E2D\u7684\u8BF7\u6C42\uFF0C\u907F\u514D\u65E0\u610F\u4E49\u7684\u89E6\u53D1\u5206\u6790\r\n const messages = req.body?.messages;\r\n if (messages && contextAnalyzer.hasToolResults(messages)) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: 0,\r\n };\r\n }\r\n\r\n const result = await modelSelector.selectModel(\r\n {\r\n ...req,\r\n appConfig: this.appConfig ?? undefined,\r\n } as IRequestContext,\r\n this.config,\r\n this.port,\r\n this.smartRouterConfig,\r\n this.governanceConfig,\r\n this.apiKey,\r\n this.apiTimeoutMs\r\n );\r\n\r\n if (req.governanceTrace) {\n if (result.routeSource === 'smart_rule' && result.rule?.name) {\n appendTraceReason(req.governanceTrace, `smart_rule:${result.rule.name}`);\n } else if (result.routeSource === 'semantic_match' && result.rule?.name) {\n appendTraceReason(req.governanceTrace, `semantic_match:${result.rule.name}`);\n } else if (result.routeSource === 'sticky_correction') {\n req.governanceTrace.stickyHit = true;\n appendTraceReason(req.governanceTrace, 'sticky_correction');\n } else if (result.routeSource === 'smart_router') {\n appendTraceReason(req.governanceTrace, 'smart_router');\n } else {\n appendTraceReason(req.governanceTrace, 'smart_router:no_match');\n }\n }\n\r\n return result;\r\n }\r\n\r\n /**\r\n * \u540C\u6B65\u7248\u672C\u7684 SmartRouter \u7EDF\u4E00\u8DEF\u7531\n *\r\n * @param req \u8BF7\u6C42\u5BF9\u8C61\r\n * @returns \u5206\u6790\u7ED3\u679C\r\n */\r\n routeSync(req: IRequestContext): IAnalysisResult {\n if (!this.config || !this.isEnabled()) {\n return {\n matched: false,\n confidence: 0,\n analysisTime: 0,\r\n };\r\n }\r\n\r\n // \u8DF3\u8FC7\u5DE5\u5177\u8C03\u7528\u5FAA\u73AF\u4E2D\u7684\u8BF7\u6C42\r\n const messages = req.body?.messages;\r\n if (messages && contextAnalyzer.hasToolResults(messages)) {\r\n return {\r\n matched: false,\r\n confidence: 0,\r\n analysisTime: 0,\r\n };\r\n }\r\n\r\n return modelSelector.selectModelSync({\n ...req,\n appConfig: this.appConfig ?? undefined,\n } as IRequestContext, this.config, this.smartRouterConfig);\n }\n\r\n /**\r\n * \u521B\u5EFA Fastify \u4E2D\u95F4\u4EF6\n * \u7528\u4E8E\u5728\u8BF7\u6C42\u5904\u7406\u524D\u6267\u884C SmartRouter \u7EDF\u4E00\u8DEF\u7531\n *\r\n * @param appConfig \u5E94\u7528\u914D\u7F6E\r\n * @returns Fastify \u4E2D\u95F4\u4EF6\u51FD\u6570\r\n */\r\n createMiddleware(appConfig: IAppConfig) {\r\n this.init(appConfig);\r\n\r\n return async (req: any, reply: any) => {\r\n if (!this.isEnabled()) {\r\n return;\r\n }\r\n\r\n // \u53EA\u5904\u7406 /v1/messages \u8BF7\u6C42\r\n if (!req.url.startsWith('/v1/messages')) {\r\n return;\r\n }\r\n\r\n const startTime = Date.now();\r\n\r\n try {\r\n const result = await this.route(req);\r\n\r\n if (result.matched && result.model) {\r\n // \u8BBE\u7F6E\u9009\u4E2D\u7684\u6A21\u578B\r\n req.body.model = result.model;\r\n\r\n // \u8BB0\u5F55\u89E6\u53D1\u7ED3\u679C\u5230\u8BF7\u6C42\u4E0A\u4E0B\u6587\r\n req.triggerResult = result;\r\n\r\n log(\n `[SmartRouter] ${\n result.routeSource === 'sticky_correction'\n ? 'Sticky correction selected'\n : result.routeSource === 'semantic_match'\n ? `Semantic match \"${result.rule?.name}\"`\n : result.routeSource === 'smart_router'\n ? 'Smart fallback selected'\n : result.rule\n ? `Matched rule \"${result.rule.name}\"`\n : 'Unified router selected'\n } -> model \"${result.model}\" ` +\n `(confidence: ${result.confidence}, time: ${result.analysisTime}ms)`\n );\n }\n } catch (error) {\r\n logError('[SmartRouter] Error in routing:', error);\n }\r\n };\r\n }\r\n}\r\n\r\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\r\nexport const triggerRouter = new TriggerRouter();\r\n", "import { IMessageIR } from './message-ir';\n\nfunction toOpenAIContent(parts: IMessageIR['messages'][number]['parts']) {\n const contentParts = parts.filter(\n (part) => part.type === 'text' || part.type === 'image'\n );\n\n if (!contentParts.length) {\n return null;\n }\n\n if (contentParts.length === 1 && contentParts[0].type === 'text') {\n return contentParts[0].text;\n }\n\n return contentParts.map((part) => {\n switch (part.type) {\n case 'text':\n return { type: 'text', text: part.text };\n case 'image':\n return { type: 'image_url', image_url: { url: part.source?.url ?? part.source } };\n default:\n return { type: 'text', text: '' };\n }\n });\n}\n\nfunction toOpenAIToolCalls(parts: IMessageIR['messages'][number]['parts']) {\n return parts\n .filter((part) => part.type === 'tool_call')\n .map((part) => ({\n id: part.id,\n type: 'function',\n function: {\n name: part.name,\n arguments: part.arguments,\n },\n }));\n}\n\nfunction toOpenAIToolResultMessages(parts: IMessageIR['messages'][number]['parts']) {\n return parts\n .filter((part) => part.type === 'tool_result')\n .map((part) => ({\n role: 'tool',\n tool_call_id: part.tool_call_id,\n content: typeof part.content === 'string' ? part.content : JSON.stringify(part.content),\n }));\n}\n\nfunction getToolName(tool: any) {\n return tool?.name ?? tool?.function?.name;\n}\n\nfunction getToolDescription(tool: any) {\n return tool?.description ?? tool?.function?.description;\n}\n\nfunction getToolInputSchema(tool: any) {\n return tool?.input_schema ?? tool?.function?.parameters;\n}\n\nfunction toOpenAITools(tools?: any[]) {\n if (!Array.isArray(tools) || !tools.length) {\n return undefined;\n }\n\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: getToolName(tool),\n description: getToolDescription(tool),\n parameters: getToolInputSchema(tool),\n },\n }));\n}\n\nfunction toOpenAIToolChoice(toolChoice?: any) {\n if (!toolChoice) {\n return undefined;\n }\n\n if (typeof toolChoice === 'string') {\n return toolChoice;\n }\n\n if (toolChoice.type === 'auto') {\n return 'auto';\n }\n\n if (toolChoice.type === 'any') {\n return 'required';\n }\n\n if (toolChoice.type === 'tool' && toolChoice.name) {\n return {\n type: 'function',\n function: {\n name: toolChoice.name,\n },\n };\n }\n\n return toolChoice;\n}\n\nexport function toOpenAIChatRequest(input: {\n model: string;\n max_completion_tokens?: number;\n stream?: boolean;\n tools?: any[];\n tool_choice?: any;\n ir: IMessageIR;\n}) {\n const messages = [\n ...input.ir.system.map((text) => ({ role: 'system', content: text })),\n ...input.ir.messages.flatMap((message) => {\n const content = toOpenAIContent(message.parts);\n const toolCalls = message.role === 'assistant'\n ? toOpenAIToolCalls(message.parts)\n : [];\n const toolResults = toOpenAIToolResultMessages(message.parts);\n const nextMessages: any[] = [];\n\n if (content !== null || toolCalls.length) {\n nextMessages.push({\n role: message.role,\n content,\n ...(toolCalls.length ? { tool_calls: toolCalls } : {}),\n });\n }\n\n if (toolResults.length) {\n nextMessages.push(...toolResults);\n }\n\n return nextMessages;\n }),\n ];\n\n const body: Record<string, any> = {\n model: input.model,\n messages,\n };\n\n if (input.max_completion_tokens !== undefined) {\n body.max_completion_tokens = input.max_completion_tokens;\n }\n\n if (input.stream !== undefined) {\n body.stream = input.stream;\n }\n\n const tools = toOpenAITools(input.tools);\n if (tools) {\n body.tools = tools;\n }\n\n const toolChoice = toOpenAIToolChoice(input.tool_choice);\n if (toolChoice !== undefined) {\n body.tool_choice = toolChoice;\n }\n\n if (input.ir.options?.thinking?.enabled) {\n body.reasoning = {\n ...(input.ir.options.thinking.effort ? { effort: input.ir.options.thinking.effort } : {}),\n };\n }\n\n return body;\n}\n", "import { createMessageIR, IMessageIR } from './message-ir';\nimport { toAnthropicMessagesRequest } from './anthropic';\nimport { toOpenAIChatRequest } from './openai';\nimport { ICompiledModelCapabilities } from '../trigger/types';\nimport { TCompatibilityProfile, TDispatchFormat, getDispatchFormatForProfile } from '../models/compile';\n\nexport type TProtocolDiagnosticCode =\n | 'thinking_ignored'\n | 'images_text_fallback'\n | 'tools_text_fallback';\n\nexport interface IProtocolDiagnosticDescription {\n code: TProtocolDiagnosticCode;\n severity: 'info' | 'warn';\n label: string;\n summary: string;\n action: string;\n}\n\nfunction stringifyFallbackContent(value: any): string {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === undefined) {\n return '';\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction applyCapabilityFallbacks(input: {\n ir: IMessageIR;\n request: Record<string, any>;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const diagnostics: string[] = [];\n const nextRequest = { ...input.request };\n const nextIR: IMessageIR = {\n ...input.ir,\n system: [...input.ir.system],\n messages: input.ir.messages.map((message) => ({\n ...message,\n parts: message.parts.map((part) => ({ ...part })),\n })),\n options: input.ir.options ? { ...input.ir.options } : undefined,\n };\n\n if (input.capabilities?.thinking.supported === false && nextIR.options?.thinking) {\n diagnostics.push('thinking_ignored');\n delete nextIR.options.thinking;\n delete nextRequest.thinking;\n if (nextIR.options && !Object.keys(nextIR.options).length) {\n delete nextIR.options;\n }\n }\n\n const hasImageParts = nextIR.messages.some((message) =>\n message.parts.some((part) => part.type === 'image')\n );\n if (input.capabilities?.images === false && hasImageParts) {\n diagnostics.push('images_text_fallback');\n nextIR.messages = nextIR.messages.map((message) => ({\n ...message,\n parts: message.parts.flatMap((part) => {\n if (part.type !== 'image') {\n return [part];\n }\n\n return [\n {\n type: 'text' as const,\n text: '[Image content omitted because the target model does not support image input.]',\n },\n ];\n }),\n }));\n }\n\n const hasToolParts = nextIR.messages.some((message) =>\n message.parts.some((part) => part.type === 'tool_call' || part.type === 'tool_result')\n );\n if (input.capabilities?.tools === false && (Array.isArray(nextRequest.tools) && nextRequest.tools.length || hasToolParts)) {\n diagnostics.push('tools_text_fallback');\n delete nextRequest.tools;\n delete nextRequest.tool_choice;\n nextIR.messages = nextIR.messages.map((message) => ({\n ...message,\n parts: message.parts.flatMap((part) => {\n if (part.type === 'tool_call') {\n return [\n {\n type: 'text' as const,\n text: `[Tool call omitted because the target model does not support tools] ${part.name}(${part.arguments})`,\n },\n ];\n }\n\n if (part.type === 'tool_result') {\n return [\n {\n type: 'text' as const,\n text: `[Tool result preserved as plain text] ${stringifyFallbackContent(part.content)}`,\n },\n ];\n }\n\n return [part];\n }),\n }));\n }\n\n return {\n diagnostics,\n ir: nextIR,\n request: nextRequest,\n };\n}\n\nexport function describeProtocolDiagnostic(code: TProtocolDiagnosticCode): IProtocolDiagnosticDescription {\n switch (code) {\n case 'thinking_ignored':\n return {\n code,\n severity: 'info',\n label: 'thinking \u5DF2\u5FFD\u7565',\n summary: '\u5F53\u524D\u6A21\u578B\u6216\u63A5\u53E3\u672A\u542F\u7528 reasoning \u80FD\u529B\uFF0C\u8BF7\u6C42\u4E2D\u7684 thinking \u8BBE\u7F6E\u4E0D\u4F1A\u7EE7\u7EED\u4F20\u7ED9\u4E0A\u6E38\u3002',\n action: '\u5982\u9700\u4FDD\u7559 thinking\uFF0C\u8BF7\u5207\u56DE\u652F\u6301 reasoning \u7684\u6A21\u578B\uFF0C\u6216\u79FB\u9664\u5F53\u524D\u6A21\u578B\u4E0A\u7684 thinking \u914D\u7F6E\u3002',\n };\n case 'images_text_fallback':\n return {\n code,\n severity: 'warn',\n label: '\u56FE\u7247\u5DF2\u964D\u7EA7\u4E3A\u6587\u672C',\n summary: '\u5F53\u524D\u6A21\u578B\u672A\u58F0\u660E\u56FE\u7247\u8F93\u5165\u80FD\u529B\uFF0C\u8BF7\u6C42\u4E2D\u7684\u56FE\u7247\u5185\u5BB9\u4F1A\u9000\u5316\u4E3A\u6587\u672C\u63D0\u793A\uFF0C\u4E0D\u4F1A\u539F\u6837\u53D1\u9001\u5230\u4E0A\u6E38\u3002',\n action: '\u5982\u9700\u4FDD\u7559\u56FE\u7247\u8F93\u5165\uFF0C\u8BF7\u542F\u7528 supports_images \u6216\u5207\u56DE\u652F\u6301\u56FE\u7247\u7684\u6A21\u578B\u3002',\n };\n case 'tools_text_fallback':\n return {\n code,\n severity: 'warn',\n label: '\u5DE5\u5177\u8C03\u7528\u5DF2\u964D\u7EA7\u4E3A\u6587\u672C',\n summary: '\u5F53\u524D\u6A21\u578B\u672A\u58F0\u660E\u5DE5\u5177\u80FD\u529B\uFF0Ctool definitions \u4E0E tool call/result \u4F1A\u9000\u5316\u4E3A\u666E\u901A\u6587\u672C\u5185\u5BB9\u3002',\n action: '\u5982\u9700\u4FDD\u7559\u5DE5\u5177\u8C03\u7528\uFF0C\u8BF7\u542F\u7528 supports_tools \u6216\u5207\u56DE\u652F\u6301\u5DE5\u5177\u7684\u6A21\u578B\u3002',\n };\n default:\n return {\n code,\n severity: 'info',\n label: code,\n summary: '\u672A\u77E5\u534F\u8BAE\u8BCA\u65AD\u3002',\n action: '\u8BF7\u7ED3\u5408\u539F\u59CB\u8BF7\u6C42\u548C\u4E0A\u6E38\u54CD\u5E94\u7EE7\u7EED\u6392\u67E5\u3002',\n };\n }\n}\n\nfunction omitRequestFields(body: Record<string, any>) {\n const {\n model,\n messages,\n system,\n tools,\n thinking,\n metadata,\n max_tokens,\n max_completion_tokens,\n ...rest\n } = body;\n\n return rest;\n}\n\nexport function buildUpstreamRequestFromIR(input: {\n model: string;\n interface: 'openai' | 'anthropic';\n request: Record<string, any>;\n ir: IMessageIR;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const fallback = applyCapabilityFallbacks({\n ir: input.ir,\n request: input.request,\n capabilities: input.capabilities,\n });\n const passthrough = omitRequestFields(fallback.request);\n\n if (input.interface === 'anthropic') {\n return {\n diagnostics: fallback.diagnostics,\n ...passthrough,\n ...toAnthropicMessagesRequest({\n model: input.model,\n max_tokens: fallback.request.max_tokens,\n stream: fallback.request.stream,\n metadata: fallback.request.metadata,\n tools: fallback.request.tools,\n tool_choice: fallback.request.tool_choice,\n ir: fallback.ir,\n }),\n };\n }\n\n return {\n diagnostics: fallback.diagnostics,\n ...passthrough,\n ...toOpenAIChatRequest({\n model: input.model,\n max_completion_tokens: fallback.request.max_tokens ?? fallback.request.max_completion_tokens,\n stream: fallback.request.stream,\n tools: fallback.request.tools,\n tool_choice: fallback.request.tool_choice,\n ir: fallback.ir,\n }),\n };\n}\n\nexport function buildProviderDispatchRequestFromIR(input: {\n model: string;\n interface: 'openai' | 'anthropic';\n compatibilityProfile: TCompatibilityProfile;\n request: Record<string, any>;\n ir: IMessageIR;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const fallback = applyCapabilityFallbacks({\n ir: input.ir,\n request: input.request,\n capabilities: input.capabilities,\n });\n const passthrough = omitRequestFields(fallback.request);\n const dispatchFormat: TDispatchFormat = getDispatchFormatForProfile(input.interface, input.compatibilityProfile);\n\n if (dispatchFormat === 'openai_chat') {\n return {\n dispatchFormat,\n diagnostics: fallback.diagnostics,\n ...passthrough,\n ...toOpenAIChatRequest({\n model: input.model,\n max_completion_tokens: fallback.request.max_tokens ?? fallback.request.max_completion_tokens,\n stream: fallback.request.stream,\n tools: fallback.request.tools,\n tool_choice: fallback.request.tool_choice,\n ir: fallback.ir,\n }),\n };\n }\n\n return {\n dispatchFormat,\n diagnostics: fallback.diagnostics,\n ...passthrough,\n ...toAnthropicMessagesRequest({\n model: input.model,\n max_tokens: fallback.request.max_tokens ?? fallback.request.max_completion_tokens,\n stream: fallback.request.stream,\n metadata: fallback.request.metadata,\n tools: fallback.request.tools,\n tool_choice: fallback.request.tool_choice,\n ir: fallback.ir,\n }),\n };\n}\n\nexport function buildProviderDispatchRequest(input: {\n model: string;\n interface: 'openai' | 'anthropic';\n compatibilityProfile: TCompatibilityProfile;\n request: Record<string, any>;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const ir = createMessageIR(input.request);\n const { diagnostics, dispatchFormat, ...body } = buildProviderDispatchRequestFromIR({\n model: input.model,\n interface: input.interface,\n compatibilityProfile: input.compatibilityProfile,\n request: input.request,\n ir,\n capabilities: input.capabilities,\n });\n\n return {\n ir,\n body,\n diagnostics,\n dispatchFormat,\n };\n}\n\nexport function buildUpstreamRequest(input: {\n model: string;\n interface: 'openai' | 'anthropic';\n request: Record<string, any>;\n capabilities?: ICompiledModelCapabilities;\n}) {\n const ir = createMessageIR(input.request);\n const { diagnostics, ...body } = buildUpstreamRequestFromIR({\n model: input.model,\n interface: input.interface,\n request: input.request,\n ir,\n capabilities: input.capabilities,\n });\n\n return {\n ir,\n body,\n diagnostics,\n };\n}\n", "/**\n * Claude Trigger Router\n *\n * \u667A\u80FD\u89E6\u53D1\u8DEF\u7531\u5668\u4E3B\u5165\u53E3\n */\n\nimport { existsSync } from \"fs\";\nimport { writeFile } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { initConfig, initDir } from \"./utils\";\nimport { createServer } from \"./server\";\nimport { router } from \"./router\";\nimport { apiKeyAuth } from \"./middleware/auth\";\nimport {\n cleanupPidFile,\n isServiceRunning,\n savePid,\n} from \"./utils/processCheck\";\nimport { HOME_DIR } from \"./constants\";\nimport { configureLogging, log, logError, logWarn, logDebug } from \"./utils/log\";\nimport { sessionUsageCache } from \"./router/cache\";\nimport { SSEParserTransform } from \"./utils/SSEParser.transform\";\nimport { SSESerializerTransform } from \"./utils/SSESerializer.transform\";\nimport { rewriteStream } from \"./utils/rewriteStream\";\nimport JSON5 from \"json5\";\nimport { IAgent } from \"./agents/type\";\nimport agentsManager from \"./agents\";\nimport { EventEmitter } from \"node:events\";\nimport { triggerRouter as smartRouterRuntime } from \"./trigger\";\nimport { createStream } from 'rotating-file-stream';\nimport { appendTraceReason, applyResponseGovernance, contextAlignmentService, createGovernanceTrace, governStreamingResponse, sessionStateStore } from \"./governance\";\nimport { buildModelRegistry, getCompiledModelRef, resolveModelReference } from \"./models/compile\";\nimport { buildProviderDispatchRequest } from \"./protocols\";\n\nconst event = new EventEmitter();\n\nfunction cloneRequestBody<T>(value: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n\n return JSON.parse(JSON.stringify(value));\n}\n\n/**\n * \u521D\u59CB\u5316 Claude \u914D\u7F6E\n */\nasync function initializeClaudeConfig() {\n const homeDir = homedir();\n const configPath = join(homeDir, \".claude.json\");\n if (!existsSync(configPath)) {\n // \u81EA\u52A8\u521B\u5EFA ~/.claude.json\uFF0C\u6807\u8BB0 onboarding \u5DF2\u5B8C\u6210\uFF0C\u907F\u514D Claude Code \u91CD\u590D\u8D70\u5F15\u5BFC\u6D41\u7A0B\n // \u4EC5\u5728\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u521B\u5EFA\uFF0C\u4E0D\u4F1A\u8986\u76D6\u7528\u6237\u5DF2\u6709\u7684\u914D\u7F6E\n log(`Creating ${configPath} for Claude Code compatibility (onboarding bypass)`);\n const userID = Array.from(\n { length: 64 },\n () => Math.random().toString(16)[2]\n ).join(\"\");\n const configContent = {\n numStartups: 184,\n autoUpdaterStatus: \"enabled\",\n userID,\n hasCompletedOnboarding: true,\n lastOnboardingVersion: \"1.0.17\",\n projects: {},\n };\n await writeFile(configPath, JSON.stringify(configContent, null, 2));\n }\n}\n\ninterface RunOptions {\n port?: number;\n}\n\n/**\n * \u8FD0\u884C\u670D\u52A1\n */\nasync function run(options: RunOptions = {}) {\n // \u68C0\u67E5\u670D\u52A1\u662F\u5426\u5DF2\u5728\u8FD0\u884C\n if (isServiceRunning()) {\n log(\"\u2705 Service is already running in the background.\");\n return;\n }\n\n await initDir();\n\n const config = await initConfig();\n\n // \u914D\u7F6E\u65E5\u5FD7\n configureLogging(config);\n\n let HOST = config.HOST || \"127.0.0.1\";\n\n if (config.HOST && !config.APIKEY) {\n HOST = \"127.0.0.1\";\n logWarn(\"\u26A0\uFE0F API key is not set. HOST is forced to 127.0.0.1.\");\n }\n\n const port = options.port ?? config.PORT ?? DEFAULT_CONFIG.PORT;\n\n // \u4FDD\u5B58 PID \u53CA\u5143\u6570\u636E\uFF08\u7AEF\u53E3\u3001\u542F\u52A8\u65F6\u95F4\uFF09\uFF0C\u4F9B ctr status \u7B49\u547D\u4EE4\u4F7F\u7528\n savePid(process.pid, port);\n\n // \u5904\u7406\u9000\u51FA\u4FE1\u53F7\n process.on(\"SIGINT\", () => {\n log(\"Received SIGINT, cleaning up...\");\n cleanupPidFile();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", () => {\n cleanupPidFile();\n process.exit(0);\n });\n\n const servicePort = process.env.SERVICE_PORT\n ? parseInt(process.env.SERVICE_PORT)\n : port;\n\n // \u5C06\u5B9E\u9645\u8FD0\u884C\u7AEF\u53E3\u5199\u56DE config\uFF0C\u786E\u4FDD\u6240\u6709\u5185\u90E8\u6A21\u5757\uFF08TriggerRouter\u3001ImageAgent \u7B49\uFF09\n // \u81EA\u56DE\u8C03\u65F6\u4F7F\u7528\u540C\u4E00\u7AEF\u53E3\uFF0C\u907F\u514D --port \u8986\u76D6\u4E0E\u914D\u7F6E\u6587\u4EF6 PORT \u4E0D\u4E00\u81F4\u5BFC\u81F4\u7684\u95EE\u9898\n config.PORT = servicePort;\n\n // \u914D\u7F6E\u65E5\u5FD7\u5668\n const pad = (num: number) => (num > 9 ? \"\" : \"0\") + num;\n const generator = (time: Date | number, index: number | undefined) => {\n if (!time) {\n time = new Date();\n }\n const date = new Date(time);\n const month = date.getFullYear() + \"\" + pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hour = pad(date.getHours());\n const minute = pad(date.getMinutes());\n const seconds = pad(date.getSeconds());\n\n return `ctr-${month}${day}${hour}${minute}${seconds}${index ? `_${index}` : ''}.log`;\n };\n\n const loggerConfig =\n config.LOG !== false\n ? {\n level: config.LOG_LEVEL || \"debug\",\n stream: createStream(generator, {\n path: HOME_DIR,\n maxFiles: 3,\n interval: \"1d\",\n compress: 'gzip'\n }),\n }\n : false;\n\n // \u521B\u5EFA\u670D\u52A1\u5668\n const registry = buildModelRegistry(config);\n const server = createServer({\n useJsonFile: false,\n initialConfig: {\n providers: registry.providers,\n HOST: HOST,\n PORT: servicePort,\n LOG_FILE: join(\n homedir(),\n \".claude-trigger-router\",\n \"claude-trigger-router.log\"\n ),\n },\n logger: loggerConfig,\n });\n\n // \u8BA4\u8BC1\u4E2D\u95F4\u4EF6\n server.addHook(\"preHandler\", async (req: any, reply: any) => {\n return new Promise<void>((resolve, reject) => {\n const done = (err?: Error) => {\n if (err) reject(err);\n else resolve();\n };\n apiKeyAuth(config)(req, reply, done);\n });\n });\n\n // \u521D\u59CB\u5316 SmartRouter \u7EDF\u4E00\u8DEF\u7531\u5F15\u64CE\n smartRouterRuntime.init(config);\n log(`[SmartRouter] Initialized, enabled: ${smartRouterRuntime.isEnabled()}`);\n\n // SmartRouter \u7EDF\u4E00\u8DEF\u7531\u4E2D\u95F4\u4EF6\uFF08\u5728\u539F\u6709\u8DEF\u7531\u4E4B\u524D\uFF09\n server.addHook(\"preHandler\", async (req: any, reply: any) => {\n if (req.url.startsWith(\"/v1/messages\")) {\n if (req.body.metadata?.user_id) {\n const parts = req.body.metadata.user_id.split(\"_session_\");\n if (parts.length > 1) {\n req.sessionId = parts[1];\n }\n }\n\n req.governanceTrace = createGovernanceTrace({\n requestId: req.id,\n sessionKey: req.sessionId,\n initialModel: req.body?.model,\n });\n appendTraceReason(req.governanceTrace, \"request_received\");\n\n const bypassSmartRouter = req.headers[\"x-ctr-smart-router\"] === \"1\";\n const triggerResult = bypassSmartRouter\n ? { matched: false, confidence: 0, analysisTime: 0 }\n : await smartRouterRuntime.route(req);\n req.triggerResult = triggerResult;\n\n if (!bypassSmartRouter && triggerResult.matched && triggerResult.model) {\n const previousSessionState = req.sessionId ? sessionStateStore.get(req.sessionId) : undefined;\n const previousModel = previousSessionState?.lastSuccessfulModel;\n const alignmentConfig =\n smartRouterRuntime.getSmartRouterConfig()?.sticky?.alignment\n ?? config.Governance?.sticky?.alignment;\n\n if (\n smartRouterRuntime.getSmartRouterConfig()?.enabled &&\n alignmentConfig?.enabled &&\n previousModel &&\n previousModel !== triggerResult.model &&\n triggerResult.analyzedText\n ) {\n const resolvedAlignmentConfig = {\n ...alignmentConfig,\n summarizer_model: resolveModelReference(config, alignmentConfig.summarizer_model) ?? alignmentConfig.summarizer_model,\n };\n const summary = await contextAlignmentService.summarizeTransition(\n triggerResult.analyzedText,\n previousModel,\n triggerResult.model,\n resolvedAlignmentConfig,\n servicePort,\n undefined,\n config.APIKEY,\n config.API_TIMEOUT_MS\n );\n\n if (summary) {\n req.body.system = contextAlignmentService.injectAlignmentContext(\n req.body.system,\n summary,\n previousModel,\n triggerResult.model\n );\n req.governanceTrace.alignmentUsed = true;\n appendTraceReason(req.governanceTrace, 'context_alignment');\n }\n }\n\n req.body.model = triggerResult.model;\n req.governanceTrace.finalModel = triggerResult.model;\n\n log(\n `[SmartRouter] Selected \"${triggerResult.rule?.name ?? triggerResult.routeSource ?? 'route'}\" -> \"${triggerResult.model}\"`\n );\n }\n\n // Agent \u5904\u7406\n const useAgents: string[] = [];\n\n for (const agent of agentsManager.getAllAgents()) {\n if (agent.shouldHandle(req, config)) {\n useAgents.push(agent.name);\n agent.reqHandler(req, config);\n\n if (agent.tools.size) {\n if (!req.body?.tools?.length) {\n req.body.tools = [];\n }\n req.body.tools.unshift(\n ...Array.from(agent.tools.values()).map((item) => ({\n name: item.name,\n description: item.description,\n input_schema: item.input_schema,\n }))\n );\n }\n }\n }\n\n if (useAgents.length) {\n req.agents = useAgents;\n }\n\n // \u6267\u884C\u539F\u6709\u8DEF\u7531\n await router(req, reply, {\n config,\n event,\n });\n\n const compiledModel = getCompiledModelRef(config, req.body?.model);\n if (compiledModel?.interface && req.body?.messages) {\n const originalBody = cloneRequestBody(req.body);\n const upstream = buildProviderDispatchRequest({\n model: compiledModel.modelName,\n interface: compiledModel.interface,\n compatibilityProfile: compiledModel.compatibilityProfile,\n request: originalBody,\n capabilities: compiledModel.capabilities,\n });\n\n req.originalRequestBody = originalBody;\n req.messageIR = upstream.ir;\n req.upstreamRequestBody = upstream.body;\n req.upstreamInterface = compiledModel.interface;\n req.protocolDiagnostics = upstream.diagnostics;\n if (upstream.diagnostics.length) {\n logWarn(\n `[ProtocolDispatch] Model \"${compiledModel.id}\" reported capability diagnostics: ${upstream.diagnostics.join(', ')}`\n );\n }\n req.body = {\n ...upstream.body,\n model: req.body.model,\n };\n }\n }\n });\n\n // \u9519\u8BEF\u5904\u7406\n server.addHook(\"onError\", async (request: any, reply: any, error: any) => {\n event.emit(\"onError\", request, reply, error);\n });\n\n // \u54CD\u5E94\u5904\u7406\n server.addHook(\"onSend\", (req: any, reply: any, payload: any, done: any) => {\n if (req.originalRequestBody) {\n req.body = req.originalRequestBody;\n }\n\n if (req.sessionId && req.url.startsWith(\"/v1/messages\")) {\n if (payload instanceof ReadableStream) {\n if (req.agents) {\n const abortController = new AbortController();\n const sseParser = new SSEParserTransform();\n const eventStream = payload.pipeThrough(sseParser as any);\n let currentAgent: IAgent | undefined;\n let currentToolIndex = -1;\n let currentToolName = \"\";\n let currentToolArgs = \"\";\n let currentToolId = \"\";\n const toolMessages: any[] = [];\n const assistantMessages: any[] = [];\n\n const sseSerializer = new SSESerializerTransform();\n\n const agentStream = rewriteStream(eventStream, async (data: any, controller: any) => {\n try {\n // \u5DE5\u5177\u8C03\u7528\u5F00\u59CB\n if (\n data.event === \"content_block_start\" &&\n data?.data?.content_block?.name\n ) {\n const agent = req.agents.find((name: string) =>\n agentsManager\n .getAgent(name)\n ?.tools.get(data.data.content_block.name)\n );\n if (agent) {\n currentAgent = agentsManager.getAgent(agent);\n currentToolIndex = data.data.index;\n currentToolName = data.data.content_block.name;\n currentToolId = data.data.content_block.id;\n return undefined;\n }\n }\n\n // \u6536\u96C6\u5DE5\u5177\u53C2\u6570\n if (\n currentToolIndex > -1 &&\n data.data.index === currentToolIndex &&\n data.data?.delta?.type === \"input_json_delta\"\n ) {\n currentToolArgs += data.data?.delta?.partial_json;\n return undefined;\n }\n\n // \u5DE5\u5177\u8C03\u7528\u5B8C\u6210\n if (\n currentToolIndex > -1 &&\n data.data.index === currentToolIndex &&\n data.data.type === \"content_block_stop\"\n ) {\n try {\n const args = JSON5.parse(currentToolArgs);\n assistantMessages.push({\n type: \"tool_use\",\n id: currentToolId,\n name: currentToolName,\n input: args,\n });\n const toolResult = await currentAgent?.tools\n .get(currentToolName)\n ?.handler(args, {\n req,\n config,\n });\n logDebug(\"Tool result:\", toolResult);\n toolMessages.push({\n tool_use_id: currentToolId,\n type: \"tool_result\",\n content: toolResult,\n });\n currentAgent = undefined;\n currentToolIndex = -1;\n currentToolName = \"\";\n currentToolArgs = \"\";\n currentToolId = \"\";\n } catch (e) {\n logError(\"Tool execution error:\", e);\n }\n return undefined;\n }\n\n if (data.event === \"message_delta\" && toolMessages.length) {\n req.body.messages.push({\n role: \"assistant\",\n content: assistantMessages,\n });\n req.body.messages.push({\n role: \"user\",\n content: toolMessages,\n });\n const response = await fetch(\n `http://127.0.0.1:${servicePort}/v1/messages`,\n {\n method: \"POST\",\n headers: {\n \"x-api-key\": config.APIKEY || \"\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(req.body),\n }\n );\n if (!response.ok) {\n return undefined;\n }\n const innerSseParser = new SSEParserTransform();\n const stream = response.body!.pipeThrough(innerSseParser as any);\n const reader = stream.getReader();\n while (true) {\n try {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n if (\n [\"message_start\", \"message_stop\"].includes(value.event)\n ) {\n continue;\n }\n\n if (!controller.desiredSize) {\n logWarn(\"Stream backpressure detected\");\n break;\n }\n\n controller.enqueue(value);\n } catch (readError: any) {\n if (\n readError.name === \"AbortError\" ||\n readError.code === \"ERR_STREAM_PREMATURE_CLOSE\"\n ) {\n log(\n \"Stream reading aborted due to client disconnect\"\n );\n abortController.abort();\n break;\n }\n throw readError;\n }\n }\n return undefined;\n }\n return data;\n } catch (error: any) {\n logError(\n \"Unexpected error in stream processing:\",\n error\n );\n\n if (error.code === \"ERR_STREAM_PREMATURE_CLOSE\") {\n log(\"Stream prematurely closed, aborting operations\");\n abortController.abort();\n return undefined;\n }\n\n throw error;\n }\n }).pipeThrough(sseSerializer as any);\n\n return done(\n null,\n governStreamingResponse(agentStream, req, config, servicePort)\n );\n }\n\n return done(null, governStreamingResponse(payload, req, config, servicePort));\n }\n sessionUsageCache.put(req.sessionId, payload.usage);\n }\n if (typeof payload === \"object\" && payload.error) {\n return done(payload.error, null);\n }\n done(null, payload);\n });\n\n server.addHook(\"onSend\", async (req: any, reply: any, payload: any) => {\n if (payload instanceof ReadableStream) {\n return payload;\n }\n\n payload = await applyResponseGovernance({\n req,\n payload,\n config,\n servicePort,\n });\n\n if (req.governanceTrace) {\n logDebug(\"[GovernanceTrace]\", JSON.stringify(req.governanceTrace));\n }\n\n logDebug(\"onSend hook triggered\");\n event.emit(\"onSend\", req, reply, payload);\n return payload;\n });\n\n await server.start();\n}\n\nexport { run, initializeClaudeConfig };\n", "import { DetectedService } from './detect';\r\n\r\ninterface IDecideServiceActionInput {\r\n configChanged: boolean;\r\n detectedService: DetectedService;\r\n reloadSupported: boolean;\r\n}\r\n\r\nexport type SetupServiceAction =\r\n | { kind: 'reuse' }\r\n | { kind: 'start' }\r\n | { kind: 'reload' }\r\n | { kind: 'restart' };\r\n\r\ninterface IApplyServiceActionInput {\r\n action: SetupServiceAction;\r\n executeStart: () => Promise<void>;\r\n executeReload: () => Promise<void>;\r\n executeRestart: () => Promise<void>;\r\n verifyHealth: () => Promise<boolean>;\r\n}\r\n\r\nexport function decideServiceAction(input: IDecideServiceActionInput): SetupServiceAction {\r\n if (input.detectedService.kind === 'non_self_occupied') {\r\n throw new Error('target port is occupied by another service');\r\n }\r\n\r\n if (input.detectedService.kind === 'none') {\r\n return { kind: 'start' };\r\n }\r\n\r\n if (input.detectedService.kind === 'self_unhealthy') {\r\n return { kind: 'restart' };\r\n }\r\n\r\n if (input.configChanged && input.detectedService.kind === 'self_healthy') {\r\n return input.reloadSupported ? { kind: 'reload' } : { kind: 'restart' };\r\n }\r\n\r\n return { kind: 'reuse' };\r\n}\r\n\r\nexport async function applyServiceAction(input: IApplyServiceActionInput): Promise<void> {\n if (input.action.kind === 'start') {\r\n await input.executeStart();\r\n }\r\n\r\n if (input.action.kind === 'reload') {\r\n await input.executeReload();\r\n }\r\n\r\n if (input.action.kind === 'restart') {\r\n await input.executeRestart();\r\n }\r\n\r\n const healthy = await input.verifyHealth();\n if (!healthy) {\n if (input.action.kind === 'restart') {\n throw new Error('service health check failed after restart; the previous ctr service may still be shutting down. Please wait a moment and retry, or run `ctr stop` first.');\n }\n if (input.action.kind === 'start') {\n throw new Error('service health check failed after start; please check whether the target port is already occupied or the configuration is still invalid.');\n }\n if (input.action.kind === 'reload') {\n throw new Error('service health check failed after reload; please retry or run `ctr restart` / `ctr stop` first.');\n }\n throw new Error('service health check failed while reusing the current service; please run `ctr status` or `ctr restart` to verify it.');\n }\n}\n", "export type SetupRepairField = 'defaultModel' | 'apiKey' | 'apiBaseUrl' | 'capabilityHints' | 'manualReview';\n\r\nfunction mapRepairField(error: string): SetupRepairField {\r\n if (error === 'Router.default is required') {\r\n return 'defaultModel';\r\n }\r\n\r\n if (/^(Providers\\[\\d+\\]\\.api_key|Models\\[\\d+\\]\\.key) is required$/.test(error)) {\n return 'apiKey';\n }\n\n if (/^(Providers\\[\\d+\\]\\.api_base_url|Models\\[\\d+\\]\\.api) is required$/.test(error)) {\n return 'apiBaseUrl';\n }\n\n if (\n /^Models\\[\\d+\\]\\.thinking is configured, but model \".+\" disables reasoning\\./.test(error) ||\n /^Models\\[\\d+\\]\\.metadata\\.supports_tools disables tools/.test(error) ||\n /^Models\\[\\d+\\]\\.metadata\\.supports_images disables image input/.test(error)\n ) {\n return 'capabilityHints';\n }\n\n return 'manualReview';\n}\n\r\nexport function getRepairFields(errors: string[]): SetupRepairField[] {\r\n const fields: SetupRepairField[] = [];\r\n\r\n for (const error of errors) {\r\n const field = mapRepairField(error);\r\n if (!fields.includes(field)) {\r\n fields.push(field);\r\n }\r\n }\r\n\r\n return fields;\r\n}\r\n", "import { ISetupConfigDraft } from './types';\nimport { inferInterfaceFromApiEndpoint, normalizeApiEndpoint } from '../models/schema';\n\r\nexport interface IMigrateLegacyConfigResult {\r\n draft: ISetupConfigDraft;\r\n skippedFields: string[];\r\n needsCompletion: boolean;\r\n missingFields: string[];\r\n}\r\n\r\ninterface ILegacyProviderInput {\n name?: string;\n api_base_url?: string;\n api_key?: string;\n models?: string[];\n transformer?: {\n use?: string[];\n [key: string]: unknown;\n } | unknown;\n headers?: unknown;\n}\n\r\ninterface ILegacyRouterInput {\n default?: string;\n background?: unknown;\n think?: unknown;\n longContext?: unknown;\n longContextThreshold?: unknown;\n webSearch?: unknown;\n}\n\r\ninterface ILegacyConfigInput {\r\n providers?: ILegacyProviderInput[] | unknown;\r\n default?: string | unknown;\r\n trigger_router?: unknown;\r\n Providers?: ILegacyProviderInput[] | unknown;\r\n Router?: ILegacyRouterInput | unknown;\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface INormalizedLegacyConfig {\n providers: Array<{\n name: string;\n api_base_url?: string;\n api_key: string;\n models: string[];\n }>;\n defaultRoute?: string;\n routeSlots: {\n background?: string;\n think?: string;\n longContext?: string;\n longContextThreshold?: number;\n webSearch?: string;\n };\n supportedTopLevelConfig: Partial<ISetupConfigDraft>;\n skippedFields: string[];\n}\n\nconst KNOWN_UNSUPPORTED_TOP_LEVEL_FIELDS = new Set([\n 'CLAUDE_PATH',\n 'transformers',\n 'StatusLine',\n 'trigger_router',\n]);\n\r\nfunction inferProtocolFromApiBaseUrl(apiBaseUrl?: string, modelName?: string): 'openai' | 'anthropic' {\n return inferInterfaceFromApiEndpoint(apiBaseUrl, modelName) ?? 'openai';\n}\n\r\nfunction normalizeSegment(value: string): string {\r\n return value\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '_')\r\n .replace(/^_+|_+$/g, '');\r\n}\r\n\r\nfunction toModelId(name: string, model: string, index: number): string {\n const normalizedName = normalizeSegment(name) || `provider_${index + 1}`;\r\n const normalizedModel = normalizeSegment(model);\r\n\r\n return normalizedModel ? `${normalizedName}_${normalizedModel}` : normalizedName;\r\n}\r\n\r\nfunction createEmptyDraft(): ISetupConfigDraft {\r\n return {\r\n Providers: [],\r\n Models: [],\r\n Router: {},\r\n };\r\n}\r\n\r\nfunction createNonMigratableResult(): IMigrateLegacyConfigResult {\n return {\n draft: createEmptyDraft(),\n skippedFields: [],\n needsCompletion: true,\n missingFields: ['defaultModel', 'apiKey', 'apiBaseUrl'],\n };\n}\n\nfunction isLegacyProviderInput(value: unknown): value is ILegacyProviderInput {\n return typeof value === 'object' && value !== null;\n}\n\r\nfunction isLegacyRouterInput(value: unknown): value is ILegacyRouterInput {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\nfunction pushUnique(target: string[], value: string): void {\n if (!target.includes(value)) {\n target.push(value);\n }\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string'\n ? value.trim()\n : undefined;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n if (value.toLowerCase() === 'true') {\n return true;\n }\n if (value.toLowerCase() === 'false') {\n return false;\n }\n }\n return undefined;\n}\n\nfunction readFiniteNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction extractSupportedTopLevelConfig(input: ILegacyConfigInput, consumedTopLevelFields: Set<string>): Partial<ISetupConfigDraft> {\n const nextConfig: Partial<ISetupConfigDraft> = {};\n const hasOwn = (key: string) => Object.prototype.hasOwnProperty.call(input, key);\n\n const host = readString(input.HOST);\n if (hasOwn('HOST')) {\n nextConfig.HOST = host;\n consumedTopLevelFields.add('HOST');\n }\n\n const port = readFiniteNumber(input.PORT);\n if (hasOwn('PORT') && port !== undefined) {\n nextConfig.PORT = port;\n consumedTopLevelFields.add('PORT');\n }\n\n const log = readBoolean(input.LOG);\n if (hasOwn('LOG') && log !== undefined) {\n nextConfig.LOG = log;\n consumedTopLevelFields.add('LOG');\n }\n\n const logLevel = readString(input.LOG_LEVEL);\n if (hasOwn('LOG_LEVEL')) {\n nextConfig.LOG_LEVEL = logLevel;\n consumedTopLevelFields.add('LOG_LEVEL');\n }\n\n const apiTimeoutMs = readFiniteNumber(input.API_TIMEOUT_MS);\n if (hasOwn('API_TIMEOUT_MS') && apiTimeoutMs !== undefined) {\n nextConfig.API_TIMEOUT_MS = apiTimeoutMs;\n consumedTopLevelFields.add('API_TIMEOUT_MS');\n }\n\n const proxyUrl = readString(input.PROXY_URL);\n if (hasOwn('PROXY_URL')) {\n nextConfig.PROXY_URL = proxyUrl;\n consumedTopLevelFields.add('PROXY_URL');\n }\n\n const apiKey = readString(input.APIKEY);\n if (hasOwn('APIKEY')) {\n nextConfig.APIKEY = apiKey;\n consumedTopLevelFields.add('APIKEY');\n }\n\n const customRouterPath = readString(input.CUSTOM_ROUTER_PATH);\n if (hasOwn('CUSTOM_ROUTER_PATH')) {\n nextConfig.CUSTOM_ROUTER_PATH = customRouterPath;\n consumedTopLevelFields.add('CUSTOM_ROUTER_PATH');\n }\n\n return nextConfig;\n}\n\r\nfunction normalizeLegacyConfig(input: ILegacyConfigInput): INormalizedLegacyConfig | null {\r\n const lowerProviders = Array.isArray(input.providers) && input.providers.every(isLegacyProviderInput)\r\n ? input.providers\r\n : null;\r\n const upperProviders = Array.isArray(input.Providers) && input.Providers.every(isLegacyProviderInput)\r\n ? input.Providers\r\n : null;\r\n\r\n const providerKey = lowerProviders && lowerProviders.length > 0\r\n ? 'providers'\r\n : upperProviders && upperProviders.length > 0\r\n ? 'Providers'\r\n : lowerProviders\r\n ? 'providers'\r\n : upperProviders\r\n ? 'Providers'\r\n : null;\r\n\r\n if (!providerKey) {\r\n return null;\r\n }\r\n\r\n const rawProviders = providerKey === 'providers' ? lowerProviders : upperProviders;\r\n if (!rawProviders) {\r\n return null;\r\n }\r\n\r\n const skippedFields: string[] = [];\n const alternateProviderKey = providerKey === 'providers' ? 'Providers' : 'providers';\r\n const alternateDefaultKey = providerKey === 'providers' ? 'Router' : 'default';\r\n const alternateDefaultValue = providerKey === 'providers' ? input.Router : input.default;\r\n const alternateProviders = providerKey === 'providers' ? upperProviders : lowerProviders;\r\n if (alternateProviders !== null) {\r\n pushUnique(skippedFields, alternateProviderKey);\r\n }\r\n if (alternateDefaultValue !== undefined) {\r\n pushUnique(skippedFields, alternateDefaultKey);\r\n }\r\n\r\n const consumedTopLevelFields = new Set<string>([providerKey]);\n const supportedTopLevelConfig = extractSupportedTopLevelConfig(input, consumedTopLevelFields);\n const providers = rawProviders.map((provider, index) => {\n if (provider.transformer !== undefined) {\n pushUnique(skippedFields, `${providerKey}[${index}].transformer`);\n }\n if (provider.headers !== undefined) {\r\n pushUnique(skippedFields, `${providerKey}[${index}].headers`);\r\n }\r\n\r\n return {\r\n name: provider.name ?? '',\n api_base_url: provider.api_base_url,\n api_key: provider.api_key ?? '',\n models: Array.isArray(provider.models) ? provider.models : [],\n };\n });\n\r\n let defaultRoute: string | undefined;\n const routeSlots: INormalizedLegacyConfig['routeSlots'] = {};\n if (providerKey === 'providers') {\n consumedTopLevelFields.add('default');\n defaultRoute = typeof input.default === 'string' ? input.default : undefined;\n } else {\n consumedTopLevelFields.add('Router');\n if (isLegacyRouterInput(input.Router)) {\n defaultRoute = typeof input.Router.default === 'string' ? input.Router.default : undefined;\n routeSlots.background = readString(input.Router.background);\n routeSlots.think = readString(input.Router.think);\n routeSlots.longContext = readString(input.Router.longContext);\n routeSlots.webSearch = readString(input.Router.webSearch);\n routeSlots.longContextThreshold = readFiniteNumber(input.Router.longContextThreshold);\n }\n }\n\r\n for (const key of Object.keys(input)) {\r\n if (consumedTopLevelFields.has(key)) {\r\n continue;\r\n }\r\n\r\n pushUnique(skippedFields, key);\r\n }\r\n\r\n return {\n providers,\n defaultRoute,\n routeSlots,\n supportedTopLevelConfig,\n skippedFields,\n };\n}\n\r\nexport function migrateLegacyConfig(input: ILegacyConfigInput): IMigrateLegacyConfigResult {\n const normalized = normalizeLegacyConfig(input);\r\n if (!normalized) {\r\n return createNonMigratableResult();\r\n }\r\n\r\n const rawEntries = normalized.providers.flatMap((provider, providerIndex) =>\n (provider.models.length ? provider.models : [''])\n .map((model) => ({\n candidateId: toModelId(provider.name, model, providerIndex),\n api: provider.api_base_url\n ? normalizeApiEndpoint(provider.api_base_url, inferProtocolFromApiBaseUrl(provider.api_base_url, model))\n : undefined,\n api_base_url: provider.api_base_url\n ? normalizeApiEndpoint(provider.api_base_url, inferProtocolFromApiBaseUrl(provider.api_base_url, model))\n : undefined,\n key: provider.api_key,\n api_key: provider.api_key,\n interface: inferProtocolFromApiBaseUrl(provider.api_base_url, model),\n protocol: inferProtocolFromApiBaseUrl(provider.api_base_url, model),\n model,\n providerName: provider.name,\n }))\n .filter((item) => item.model)\n );\n\r\n const seenIds = new Map<string, number>();\n const routeLookup = new Map<string, string>();\n\r\n const models = rawEntries.map((entry) => {\r\n const count = seenIds.get(entry.candidateId) ?? 0;\r\n seenIds.set(entry.candidateId, count + 1);\r\n const finalId = count === 0 ? entry.candidateId : `${entry.candidateId}_${count + 1}`;\r\n routeLookup.set(`${entry.providerName.trim()},${entry.model}`, finalId);\r\n return {\r\n id: finalId,\r\n api: entry.api,\r\n api_base_url: entry.api_base_url,\r\n key: entry.key,\n api_key: entry.api_key,\n interface: entry.interface,\n protocol: entry.protocol,\n model: entry.model,\n };\n });\n\n const resolveLegacyRoute = (ref: string | undefined, fieldName: string): string | undefined => {\n if (!ref) {\n return undefined;\n }\n\n const [rawProviderName, rawModelName] = String(ref).split(',');\n const providerName = (rawProviderName ?? '').trim();\n const modelName = (rawModelName ?? '').trim();\n const fromLookup = routeLookup.get(`${providerName},${modelName}`);\n if (fromLookup) {\n return fromLookup;\n }\n\n pushUnique(normalized.skippedFields, fieldName);\n return undefined;\n };\n\n const hasLegacyDefaultRoute =\n typeof normalized.defaultRoute === 'string' && normalized.defaultRoute.length > 0;\n const defaultModelId = hasLegacyDefaultRoute\n ? resolveLegacyRoute(normalized.defaultRoute, 'Router.default')\n : undefined;\n const backgroundModelId = resolveLegacyRoute(normalized.routeSlots.background, 'Router.background');\n const thinkModelId = resolveLegacyRoute(normalized.routeSlots.think, 'Router.think');\n const longContextModelId = resolveLegacyRoute(normalized.routeSlots.longContext, 'Router.longContext');\n const webSearchModelId = resolveLegacyRoute(normalized.routeSlots.webSearch, 'Router.webSearch');\n const hasMissingApiKey = normalized.providers.some((provider) => provider.api_key.length === 0);\n const hasMissingApiBaseUrl = normalized.providers.some((provider) => (provider.api_base_url?.trim() ?? '').length === 0);\n const missingFields: string[] = [];\n\n if (!defaultModelId) {\n missingFields.push('defaultModel');\n }\n if (hasMissingApiKey) {\n missingFields.push('apiKey');\n }\n if (hasMissingApiBaseUrl) {\n missingFields.push('apiBaseUrl');\n }\n\n return {\n draft: {\n ...normalized.supportedTopLevelConfig,\n Providers: [],\n Models: models,\n Router: {\n ...(defaultModelId ? { default: defaultModelId } : {}),\n ...(backgroundModelId ? { background: backgroundModelId } : {}),\n ...(thinkModelId ? { think: thinkModelId } : {}),\n ...(longContextModelId ? { longContext: longContextModelId } : {}),\n ...(normalized.routeSlots.longContextThreshold !== undefined ? { longContextThreshold: normalized.routeSlots.longContextThreshold } : {}),\n ...(webSearchModelId ? { webSearch: webSearchModelId } : {}),\n },\n },\n skippedFields: normalized.skippedFields,\n needsCompletion: missingFields.length > 0,\n missingFields,\r\n };\r\n}\r\n", "import { normalizeAndValidateConfig } from '../utils/config';\r\nimport { IAppConfig } from '../trigger/types';\r\n\r\nexport type ConfigFormat = 'yaml' | 'yml' | 'json';\r\n\r\nexport type RawCurrentConfigResult =\r\n | { kind: 'missing' }\r\n | {\r\n kind: 'found';\r\n path: string;\r\n format: ConfigFormat;\r\n config: Partial<IAppConfig>;\r\n }\r\n | {\r\n kind: 'parse_error';\r\n path: string;\r\n format: ConfigFormat;\r\n error: string;\r\n };\r\n\r\nexport type RawLegacyConfigResult =\r\n | { kind: 'missing' }\r\n | {\r\n kind: 'found';\r\n path: string;\r\n config: unknown;\r\n }\r\n | {\r\n kind: 'read_error';\r\n path: string;\r\n error: string;\r\n };\r\n\r\nexport type DetectedService =\r\n | { kind: 'none' }\r\n | { kind: 'self_healthy'; port: number }\r\n | { kind: 'self_unhealthy'; port: number }\r\n | { kind: 'non_self_occupied'; port: number };\r\n\r\nexport type SetupCurrentConfig =\r\n | { kind: 'missing' }\r\n | {\n kind: 'valid';\n path: string;\n format: ConfigFormat;\n config: IAppConfig;\n errors: [];\n warnings: string[];\n }\n | {\n kind: 'invalid';\n path: string;\n format: ConfigFormat;\n config: IAppConfig;\n errors: string[];\n warnings: string[];\n }\n | {\r\n kind: 'parse_error';\r\n path: string;\r\n format: ConfigFormat;\r\n error: string;\r\n };\r\n\r\nexport interface IDetectSetupEnvironmentDeps {\r\n readCurrentConfig: () => Promise<RawCurrentConfigResult>;\r\n readLegacyConfig: () => Promise<RawLegacyConfigResult>;\r\n probeService: () => Promise<DetectedService>;\r\n}\r\n\r\nexport interface ISetupEnvironmentDetectionResult {\r\n currentConfig: SetupCurrentConfig;\r\n legacyConfig: RawLegacyConfigResult;\r\n detectedService: DetectedService;\r\n}\r\n\r\nfunction normalizeCurrentConfig(result: RawCurrentConfigResult): SetupCurrentConfig {\r\n if (result.kind === 'missing' || result.kind === 'parse_error') {\r\n return result;\r\n }\r\n\r\n const normalized = normalizeAndValidateConfig(result.config);\r\n if (normalized.errors.length === 0) {\r\n return {\r\n kind: 'valid',\r\n path: result.path,\r\n format: result.format,\n config: normalized.config,\n errors: [],\n warnings: normalized.warnings,\n };\n }\n\r\n return {\r\n kind: 'invalid',\r\n path: result.path,\r\n format: result.format,\n config: normalized.config,\n errors: normalized.errors,\n warnings: normalized.warnings,\n };\n}\n\r\nexport async function detectSetupEnvironment(\r\n deps: IDetectSetupEnvironmentDeps\r\n): Promise<ISetupEnvironmentDetectionResult> {\r\n const [currentConfig, legacyConfig, detectedService] = await Promise.all([\r\n deps.readCurrentConfig(),\r\n deps.readLegacyConfig(),\r\n deps.probeService(),\r\n ]);\r\n\r\n return {\r\n currentConfig: normalizeCurrentConfig(currentConfig),\r\n legacyConfig,\r\n detectedService,\r\n };\r\n}\r\n", "/**\n * Setup Templates\n *\n * \u63D0\u4F9B\u914D\u7F6E\u6A21\u677F\u548C\u9884\u8BBE\n */\n\nimport { DEFAULT_CONFIG } from '../constants';\nimport { getProviderPreset as getSharedProviderPreset } from '../provider-presets';\nimport { IProviderPreset, IMinimalConfigInput, ISetupConfigDraft, ISetupModelDraft, IUsableMinimalTemplateConfig, ProviderPresetKey } from './types';\n\r\ntype IModelIdAwareProviderInput = IMinimalConfigInput['providers'][number] & {\r\n model_id?: string;\r\n};\r\n\r\n/**\r\n * \u83B7\u53D6 Provider \u9884\u8BBE\u914D\u7F6E\r\n * @param key \u9884\u8BBE\u952E\u540D\r\n * @returns \u9884\u8BBE\u914D\u7F6E\uFF0C\u4E0D\u5B58\u5728\u5219\u8FD4\u56DE undefined\r\n */\r\nexport function getProviderPreset(key: ProviderPresetKey): IProviderPreset | undefined {\r\n const preset = getSharedProviderPreset(key);\r\n if (!preset) {\r\n return undefined;\r\n }\r\n\r\n return {\n api: preset.api,\n api_base_url: preset.api_base_url,\n interface: preset.interface,\n protocol: preset.protocol,\n default_thinking: preset.default_thinking,\n };\n}\n\r\n/**\r\n * \u6784\u5EFA\u6700\u5C0F\u914D\u7F6E\r\n * @param input \u6700\u5C0F\u914D\u7F6E\u8F93\u5165\r\n * @returns \u5B8C\u6574\u7684\u5E94\u7528\u914D\u7F6E\r\n */\r\nexport function buildMinimalConfig(input: IMinimalConfigInput): ISetupConfigDraft {\r\n const providers = input.providers as IModelIdAwareProviderInput[];\r\n\r\n const models: ISetupModelDraft[] = providers.map((p) => {\r\n const preset = p.preset ? getProviderPreset(p.preset) : undefined;\r\n const modelDraft: ISetupModelDraft = {\n id: p.model_id?.trim() || p.name,\n key: p.api_key,\n api_key: p.api_key,\n model: p.models[0] ?? '',\n interface: p.interface ?? preset?.interface ?? 'openai',\n protocol: p.interface ?? preset?.protocol ?? 'openai',\n };\n\r\n const explicitApiBaseUrl = p.api_base_url?.trim();\r\n const presetApiBaseUrl = preset?.api_base_url?.trim();\r\n const apiBaseUrl = explicitApiBaseUrl || presetApiBaseUrl;\r\n if (apiBaseUrl) {\r\n modelDraft.api = apiBaseUrl;\r\n modelDraft.api_base_url = apiBaseUrl;\r\n }\r\n\r\n return modelDraft;\r\n });\r\n\r\n let defaultModel = input.defaultModel?.trim();\r\n if (input.defaultModel && input.defaultModel.includes(',')) {\r\n const [providerName, modelName] = input.defaultModel.split(',');\r\n const matched = models.find((item) => item.id === providerName && item.model === modelName);\r\n if (matched) {\r\n defaultModel = matched.id;\r\n }\r\n }\r\n\r\n if (input.defaultModel === undefined && models.length > 0) {\r\n const firstModelId = models[0].id;\r\n if (firstModelId && models[0].model) {\r\n defaultModel = firstModelId;\r\n }\r\n }\r\n\r\n if (defaultModel === '' || defaultModel === undefined) {\r\n defaultModel = undefined;\r\n }\r\n\r\n return {\n Models: models,\n Router: defaultModel ? { default: defaultModel } : {},\n };\n}\n\nexport function buildUsableMinimalTemplateConfig(): IUsableMinimalTemplateConfig {\n const openRouterPreset = getSharedProviderPreset('openrouter');\n const modelId = openRouterPreset?.suggested_id ?? 'sonnet';\n const modelName = openRouterPreset?.default_model ?? 'anthropic/claude-sonnet-4';\n const thinking = openRouterPreset?.default_thinking ?? 'auto';\n\n const draft = buildMinimalConfig({\n providers: [\n {\n name: 'openrouter',\n model_id: modelId,\n preset: 'openrouter',\n api_key: 'sk-xxx',\n models: [modelName],\n } as IModelIdAwareProviderInput,\n ],\n defaultModel: modelId,\n });\n\n const primaryModel = draft.Models?.[0];\n\n return {\n HOST: DEFAULT_CONFIG.HOST,\n PORT: DEFAULT_CONFIG.PORT,\n LOG: DEFAULT_CONFIG.LOG,\n LOG_LEVEL: DEFAULT_CONFIG.LOG_LEVEL,\n Models: primaryModel\n ? [\n {\n id: primaryModel.id,\n api: primaryModel.api,\n key: primaryModel.key,\n interface: primaryModel.interface,\n model: primaryModel.model,\n thinking,\n },\n ]\n : [],\n Router: draft.Router,\n };\n}\n", "import { extname } from 'path';\r\n\r\nimport { IAppConfig } from '../trigger/types';\r\n\r\ninterface IPersistSetupConfigInput {\r\n config: IAppConfig;\r\n currentConfigPath: string;\r\n hasExistingConfig: boolean;\r\n validateConfig: (config: IAppConfig) => string[];\r\n backupCurrentConfig: () => Promise<string | null>;\r\n writeConfig: (config: IAppConfig) => Promise<void>;\r\n}\r\n\r\ninterface IPersistSetupConfigResult {\r\n configChanged: boolean;\r\n configPath: string;\r\n backupPath?: string;\r\n}\r\n\r\nfunction formatUtcTimestamp(date: Date): string {\r\n const year = date.getUTCFullYear();\r\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\r\n const day = String(date.getUTCDate()).padStart(2, '0');\r\n const hours = String(date.getUTCHours()).padStart(2, '0');\r\n const minutes = String(date.getUTCMinutes()).padStart(2, '0');\r\n const seconds = String(date.getUTCSeconds()).padStart(2, '0');\r\n const milliseconds = String(date.getUTCMilliseconds()).padStart(3, '0');\r\n\r\n return `${year}${month}${day}T${hours}${minutes}${seconds}${milliseconds}`;\r\n}\r\n\r\nexport function buildBackupPath(currentConfigPath: string, now: Date, suffix?: string): string {\r\n const extension = extname(currentConfigPath) || '.yaml';\r\n const timestamp = formatUtcTimestamp(now);\r\n const collisionSuffix = suffix ? `-${suffix}` : '';\r\n\r\n return currentConfigPath.replace(\r\n new RegExp(`${extension.replace('.', '\\\\.')}$`),\r\n `.backup.${timestamp}${collisionSuffix}${extension}`\r\n );\r\n}\r\n\r\nexport async function persistSetupConfig(\r\n input: IPersistSetupConfigInput\r\n): Promise<IPersistSetupConfigResult> {\r\n const errors = input.validateConfig(input.config);\r\n if (errors.length > 0) {\r\n throw new Error('config validation failed');\r\n }\r\n\r\n let backupPath: string | undefined;\r\n if (input.hasExistingConfig) {\r\n const createdBackupPath = await input.backupCurrentConfig();\r\n if (!createdBackupPath) {\r\n throw new Error('failed to back up existing config');\r\n }\r\n backupPath = createdBackupPath;\r\n }\r\n\r\n await input.writeConfig(input.config);\r\n\r\n return {\r\n configChanged: true,\r\n configPath: input.currentConfigPath,\r\n backupPath,\r\n };\r\n}\r\n", "import { ISetupEnvironmentDetectionResult } from './detect';\r\n\r\nexport type CurrentConfigAction =\r\n | 'reuse'\r\n | 'overwrite'\r\n | 'fresh'\r\n | 'repair'\r\n | 'rebuild'\r\n | 'create'\r\n | 'cancel';\r\n\r\nexport type LegacyConfigAction = 'migrate' | 'skip';\r\n\r\nexport type SetupBranchDecision =\r\n | { kind: 'reuse_current' }\r\n | { kind: 'repair_current' }\r\n | { kind: 'unparseable_current' }\r\n | { kind: 'migrate_legacy' }\r\n | { kind: 'fresh_init' }\r\n | { kind: 'cancelled' };\r\n\r\nexport interface IDecideSetupBranchInput {\r\n detection: ISetupEnvironmentDetectionResult;\r\n currentConfigAction: CurrentConfigAction;\r\n legacyConfigAction?: LegacyConfigAction;\r\n}\r\n\r\nfunction resolveLegacyChoice(\r\n detection: ISetupEnvironmentDetectionResult,\r\n legacyConfigAction?: LegacyConfigAction\r\n): SetupBranchDecision {\r\n if (detection.legacyConfig.kind === 'found') {\r\n if (!legacyConfigAction) {\r\n throw new Error('legacy migration choice is required');\r\n }\r\n\r\n return legacyConfigAction === 'migrate'\r\n ? { kind: 'migrate_legacy' }\r\n : { kind: 'fresh_init' };\r\n }\r\n\r\n if (detection.legacyConfig.kind === 'read_error') {\r\n if (!legacyConfigAction) {\r\n throw new Error('legacy read error must be acknowledged');\r\n }\r\n if (legacyConfigAction !== 'skip') {\r\n throw new Error('legacy migration action is only valid when legacy config is found');\r\n }\r\n return { kind: 'fresh_init' };\r\n }\r\n\r\n if (legacyConfigAction) {\r\n throw new Error('legacy migration action is only valid when legacy config is found');\r\n }\r\n\r\n return { kind: 'fresh_init' };\r\n}\r\n\r\nfunction invalidCurrentAction(): never {\r\n throw new Error('invalid current config action');\r\n}\r\n\r\nfunction invalidLegacyAction(): never {\r\n throw new Error('invalid legacy config action');\r\n}\r\n\r\nfunction ensureNoLegacyAction(legacyConfigAction?: LegacyConfigAction): void {\r\n if (legacyConfigAction) {\r\n invalidLegacyAction();\r\n }\r\n}\r\n\r\nfunction ensureLegacyFlow(\r\n detection: ISetupEnvironmentDetectionResult,\r\n legacyConfigAction?: LegacyConfigAction\r\n): SetupBranchDecision {\r\n return resolveLegacyChoice(detection, legacyConfigAction);\r\n}\r\n\r\nfunction invalidAction(): never {\r\n return invalidCurrentAction();\r\n}\r\n\r\nexport function decideSetupBranch(input: IDecideSetupBranchInput): SetupBranchDecision {\r\n const { detection, currentConfigAction, legacyConfigAction } = input;\r\n\r\n if (currentConfigAction === 'cancel') {\r\n ensureNoLegacyAction(legacyConfigAction);\r\n return { kind: 'cancelled' };\r\n }\r\n\r\n switch (detection.currentConfig.kind) {\r\n case 'valid':\r\n if (currentConfigAction === 'reuse') {\r\n ensureNoLegacyAction(legacyConfigAction);\r\n return { kind: 'reuse_current' };\r\n }\r\n if (currentConfigAction === 'overwrite' || currentConfigAction === 'fresh') {\r\n return ensureLegacyFlow(detection, legacyConfigAction);\r\n }\r\n return invalidAction();\r\n\r\n case 'invalid':\r\n if (currentConfigAction === 'repair') {\r\n ensureNoLegacyAction(legacyConfigAction);\r\n return { kind: 'repair_current' };\r\n }\r\n if (currentConfigAction === 'overwrite') {\r\n return ensureLegacyFlow(detection, legacyConfigAction);\r\n }\r\n return invalidAction();\r\n\r\n case 'parse_error':\r\n ensureNoLegacyAction(legacyConfigAction);\r\n if (currentConfigAction === 'rebuild') {\r\n return { kind: 'unparseable_current' };\r\n }\r\n return invalidAction();\r\n\r\n case 'missing':\r\n if (currentConfigAction === 'create') {\r\n return ensureLegacyFlow(detection, legacyConfigAction);\r\n }\r\n return invalidAction();\r\n }\r\n}\r\n", "import { CONFIG_FILE } from '../constants';\r\nimport { decideSetupBranch, LegacyConfigAction } from './decision';\r\nimport { ISetupEnvironmentDetectionResult } from './detect';\r\nimport { IMigrateLegacyConfigResult } from './migrate';\r\nimport { ISetupPrompts, ISetupRepairPlan } from './prompts';\r\nimport { ISetupConfigDraft } from './types';\r\n\r\ninterface IRunSetupDeps extends ISetupPrompts {\r\n detectSetupEnvironment: () => Promise<ISetupEnvironmentDetectionResult>;\r\n migrateLegacyConfig: (input: unknown) => IMigrateLegacyConfigResult;\r\n mapConfigErrorsToRepairFields: (errors: string[]) => ISetupRepairPlan;\r\n persistConfig: (input: {\r\n config: ISetupConfigDraft;\r\n currentConfigPath: string;\r\n hasExistingConfig: boolean;\r\n }) => Promise<{\r\n configChanged: boolean;\r\n configPath: string;\r\n backupPath?: string;\r\n }>;\r\n ensureServiceReady: (input: {\r\n configChanged: boolean;\r\n detectedService: ISetupEnvironmentDetectionResult['detectedService'];\r\n reloadSupported: boolean;\r\n }) => Promise<{\r\n action: 'reuse' | 'start' | 'reload' | 'restart';\r\n healthChecked: boolean;\r\n }>;\r\n enterClaudeCode: () => Promise<void>;\r\n reloadSupported: boolean;\r\n}\r\n\r\nfunction getTargetConfigPath(detection: ISetupEnvironmentDetectionResult): string {\r\n if (detection.currentConfig.kind === 'valid' || detection.currentConfig.kind === 'invalid') {\r\n return detection.currentConfig.path;\r\n }\r\n\r\n if (detection.currentConfig.kind === 'parse_error') {\r\n return detection.currentConfig.path;\r\n }\r\n\r\n return CONFIG_FILE;\r\n}\r\n\r\nfunction getLegacyProviderCount(input: unknown): number {\r\n if (typeof input !== 'object' || input === null) {\r\n return 0;\r\n }\r\n\r\n const legacyConfig = input as { providers?: unknown; Providers?: unknown };\r\n if (Array.isArray(legacyConfig.providers)) {\r\n return legacyConfig.providers.length;\r\n }\r\n\r\n if (Array.isArray(legacyConfig.Providers)) {\r\n return legacyConfig.Providers.length;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nfunction getMigratedModelCount(draft: ISetupConfigDraft): number {\r\n if (Array.isArray(draft.Models)) {\r\n return draft.Models.length;\r\n }\r\n\r\n if (Array.isArray(draft.Providers)) {\r\n return draft.Providers.reduce((total, provider) => total + (provider.models?.length ?? 0), 0);\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nexport async function runSetup(deps: IRunSetupDeps): Promise<void> {\r\n const detection = await deps.detectSetupEnvironment();\r\n const currentConfigAction = await deps.chooseCurrentConfigAction({\r\n currentConfig: detection.currentConfig,\r\n legacyConfig: detection.legacyConfig,\r\n });\r\n\r\n let legacyConfigAction: LegacyConfigAction | undefined;\n if (\n currentConfigAction === 'create' ||\n currentConfigAction === 'overwrite' ||\n currentConfigAction === 'fresh'\n ) {\n if (detection.legacyConfig.kind === 'found' || detection.legacyConfig.kind === 'read_error') {\n legacyConfigAction = await deps.chooseLegacyConfigAction({\n legacyConfig: detection.legacyConfig,\n });\n }\r\n }\r\n\r\n const branch = decideSetupBranch({\r\n detection,\r\n currentConfigAction,\r\n legacyConfigAction,\r\n });\r\n\r\n if (branch.kind === 'cancelled') {\r\n return;\r\n }\r\n\r\n let configChanged = false;\r\n\r\n if (branch.kind === 'repair_current') {\r\n if (detection.currentConfig.kind !== 'invalid') {\r\n throw new Error('repair_current requires invalid current config');\r\n }\r\n\r\n const repairPlan = deps.mapConfigErrorsToRepairFields([\r\n ...detection.currentConfig.errors,\r\n ...detection.currentConfig.warnings,\r\n ]);\r\n if (repairPlan.mode === 'manualReview') {\r\n throw new Error('manual review is required for current config');\r\n }\r\n\r\n const baseDraft = await deps.buildRepairConfig({\r\n currentConfig: detection.currentConfig.config,\r\n fields: repairPlan.fields,\r\n });\r\n const completedDraft = await deps.completeDraft({\r\n draft: baseDraft,\r\n fields: repairPlan.fields,\r\n });\r\n const persistResult = await deps.persistConfig({\r\n config: completedDraft,\r\n currentConfigPath: detection.currentConfig.path,\r\n hasExistingConfig: true,\r\n });\r\n configChanged = persistResult.configChanged;\r\n }\r\n\r\n if (branch.kind === 'reuse_current') {\r\n await deps.ensureServiceReady({\r\n configChanged: false,\r\n detectedService: detection.detectedService,\r\n reloadSupported: deps.reloadSupported,\r\n });\r\n\r\n await deps.enterClaudeCode();\r\n return;\r\n }\r\n\r\n if (branch.kind === 'unparseable_current') {\r\n const draft = await deps.buildFreshConfig();\r\n const persistResult = await deps.persistConfig({\r\n config: draft,\r\n currentConfigPath: detection.currentConfig.path,\r\n hasExistingConfig: true,\r\n });\r\n configChanged = persistResult.configChanged;\r\n }\r\n\r\n if (branch.kind === 'fresh_init') {\r\n const draft = await deps.buildFreshConfig();\r\n const persistResult = await deps.persistConfig({\r\n config: draft,\r\n currentConfigPath: getTargetConfigPath(detection),\r\n hasExistingConfig: detection.currentConfig.kind !== 'missing',\r\n });\r\n configChanged = persistResult.configChanged;\r\n }\r\n\r\n if (branch.kind === 'migrate_legacy') {\r\n if (detection.legacyConfig.kind !== 'found') {\r\n throw new Error('migrate_legacy requires legacy config');\r\n }\r\n\r\n const migrated = deps.migrateLegacyConfig(detection.legacyConfig.config);\r\n deps.io.info(`\u5DF2\u8BC6\u522B\u65E7\u914D\u7F6E\u4E2D\u7684 ${getLegacyProviderCount(detection.legacyConfig.config)} \u4E2A provider\u3002`);\r\n deps.io.info(`\u5DF2\u4ECE\u65E7\u914D\u7F6E\u8FC1\u79FB ${getMigratedModelCount(migrated.draft)} \u4E2A\u6A21\u578B\u3002`);\r\n if (migrated.draft.Router.default) {\r\n deps.io.info(`\u8FC1\u79FB\u540E\u7684\u9ED8\u8BA4\u6A21\u578B\uFF1A${migrated.draft.Router.default}`);\r\n } else {\r\n deps.io.info('\u8FC1\u79FB\u540E\u7684\u9ED8\u8BA4\u6A21\u578B\u4ECD\u9700\u8865\u5168\u3002');\r\n }\r\n if (migrated.skippedFields.length > 0) {\r\n deps.io.info(`\u4EE5\u4E0B\u65E7\u5B57\u6BB5\u672A\u81EA\u52A8\u8FC1\u79FB\uFF1A${migrated.skippedFields.join(', ')}`);\r\n }\r\n\r\n let finalDraft = migrated.draft;\r\n if (migrated.needsCompletion) {\r\n finalDraft = await deps.completeDraft({\r\n draft: migrated.draft,\r\n fields: migrated.missingFields,\r\n });\r\n }\r\n\r\n const persistResult = await deps.persistConfig({\r\n config: finalDraft,\r\n currentConfigPath: getTargetConfigPath(detection),\r\n hasExistingConfig: detection.currentConfig.kind !== 'missing',\r\n });\r\n configChanged = persistResult.configChanged;\r\n }\r\n\r\n if (branch.kind === 'fresh_init' || branch.kind === 'repair_current' || branch.kind === 'unparseable_current' || branch.kind === 'migrate_legacy') {\r\n await deps.ensureServiceReady({\r\n configChanged,\r\n detectedService: detection.detectedService,\r\n reloadSupported: deps.reloadSupported,\r\n });\r\n\r\n await deps.enterClaudeCode();\r\n return;\r\n }\r\n\r\n}\r\n", "import { existsSync, readFileSync } from 'fs';\nimport { createServer } from 'net';\nimport { homedir } from 'os';\nimport { join } from 'path';\r\nimport { createInterface } from 'readline/promises';\r\nimport { stdin as input, stdout as output } from 'process';\r\nimport JSON5 from 'json5';\r\nimport yaml from 'js-yaml';\r\n\r\nimport { CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from '../constants';\r\nimport { getProviderPreset, listProviderPresetKeys } from '../provider-presets';\r\nimport { run } from '../index';\r\nimport { isTcpPortOccupied, waitForService } from '../service-health';\nimport { backupConfigFile, normalizeAndValidateConfig, writeConfigFile } from '../utils';\r\nimport { isServiceRunning, killProcess, readServiceInfo, waitForProcessExit } from '../utils/processCheck';\nimport { decideServiceAction, applyServiceAction } from './service';\r\nimport { getRepairFields } from './repair';\r\nimport { migrateLegacyConfig } from './migrate';\r\nimport { detectSetupEnvironment, RawCurrentConfigResult, RawLegacyConfigResult } from './detect';\r\nimport { buildMinimalConfig } from './templates';\r\nimport { persistSetupConfig } from './persist';\r\nimport { runSetup } from './setup';\nimport { ISetupConfigDraft, ProviderPresetKey } from './types';\n\r\ninterface ISetupIO {\n choose: (message: string, options: string[]) => Promise<string>;\n input: (message: string, defaultValue?: string) => Promise<string>;\n info: (message: string) => void;\n close?: () => void;\n}\n\ntype TCapabilityChoice = '\u9ED8\u8BA4' | '\u652F\u6301' | '\u7981\u7528';\ntype TCapabilityEditChoice = '\u4FDD\u6301\u5F53\u524D\u503C' | '\u7F16\u8F91 capability';\ntype TRoutingBootstrapChoice = '\u5148\u4FDD\u6301\u6700\u5C0F\u914D\u7F6E' | '\u5F00\u542F\u590D\u6742\u4EFB\u52A1\u89C4\u5219\u6A21\u677F' | '\u5F00\u542F\u590D\u6742\u4EFB\u52A1\u89C4\u5219 + \u667A\u80FD\u515C\u5E95';\n\ninterface ISetupCollectedModelInput {\n name: string;\n model_id: string;\n api_key: string;\n interface?: 'openai' | 'anthropic';\n models: string[];\n preset: ProviderPresetKey;\n api_base_url?: string;\n}\n\r\ninterface IRunSetupCliDeps {\r\n readCurrentConfig: () => Promise<RawCurrentConfigResult>;\r\n readLegacyConfig: () => Promise<RawLegacyConfigResult>;\r\n probeService: () => Promise<{ kind: 'none' } | { kind: 'self_healthy'; port: number } | { kind: 'self_unhealthy'; port: number } | { kind: 'non_self_occupied'; port: number }>;\r\n backupCurrentConfig: () => Promise<string | null>;\r\n writeConfig: (config: any) => Promise<void>;\r\n executeStart: () => Promise<void>;\r\n executeReload: () => Promise<void>;\r\n executeRestart: () => Promise<void>;\r\n verifyHealth: () => Promise<boolean>;\r\n enterClaudeCode: () => Promise<void>;\r\n io: ISetupIO;\r\n}\r\n\r\nfunction createConsoleIO(): ISetupIO {\n if (process.env.CTR_SETUP_FORCE_SCRIPTED_INPUT === '1') {\n const scriptedInput = readFileSync(0, 'utf-8');\n const answers = scriptedInput.split(/\\r?\\n/).map((item) => item.trim()).filter((item) => item.length > 0);\n let cursor = 0;\n\n const nextAnswer = async (): Promise<string> => answers[cursor++] ?? '';\n\n return {\n async choose(message, options) {\n output.write(`${message}\\n`);\n options.forEach((option, index) => {\n output.write(` ${index + 1}. ${option}\\n`);\n });\n\n const answer = await nextAnswer();\n const pickedIndex = Number(answer);\n if (Number.isInteger(pickedIndex) && pickedIndex >= 1 && pickedIndex <= options.length) {\n return options[pickedIndex - 1];\n }\n const matched = options.find((option) => option === answer);\n if (matched) {\n return matched;\n }\n throw new Error(`invalid scripted answer for \"${message}\": ${answer || '<empty>'}`);\n },\n async input(message, defaultValue) {\n const suffix = defaultValue ? ` (${defaultValue})` : '';\n output.write(`${message}${suffix}: `);\n const answer = await nextAnswer();\n return answer || defaultValue || '';\n },\n info(message) {\n output.write(`${message}\\n`);\n },\n close() {\n // No-op for scripted stdin.\n },\n };\n }\n\n if (!input.isTTY) {\n let loaded = false;\n let answers: string[] = [];\n let cursor = 0;\n\n const loadAnswers = async () => {\n if (loaded) {\n return;\n }\n loaded = true;\n const chunks: string[] = [];\n for await (const chunk of input) {\n chunks.push(String(chunk));\n }\n answers = chunks.join('').split(/\\r?\\n/).map((item) => item.trim()).filter((item) => item.length > 0);\n };\n\n const nextAnswer = async (): Promise<string> => {\n await loadAnswers();\n return answers[cursor++] ?? '';\n };\n\n return {\n async choose(message, options) {\n output.write(`${message}\\n`);\n options.forEach((option, index) => {\n output.write(` ${index + 1}. ${option}\\n`);\n });\n\n const answer = await nextAnswer();\n const pickedIndex = Number(answer);\n if (Number.isInteger(pickedIndex) && pickedIndex >= 1 && pickedIndex <= options.length) {\n return options[pickedIndex - 1];\n }\n const matched = options.find((option) => option === answer);\n if (matched) {\n return matched;\n }\n throw new Error(`invalid scripted answer for \"${message}\": ${answer || '<empty>'}`);\n },\n async input(message, defaultValue) {\n const suffix = defaultValue ? ` (${defaultValue})` : '';\n output.write(`${message}${suffix}: `);\n const answer = await nextAnswer();\n return answer || defaultValue || '';\n },\n info(message) {\n output.write(`${message}\\n`);\n },\n close() {\n // No-op for buffered non-interactive stdin.\n },\n };\n }\n\n const rl = createInterface({ input, output });\n\r\n const ask = async (message: string): Promise<string> => {\r\n const answer = await rl.question(message);\r\n return answer.trim();\r\n };\r\n\r\n return {\r\n async choose(message, options) {\r\n output.write(`${message}\\n`);\r\n options.forEach((option, index) => {\r\n output.write(` ${index + 1}. ${option}\\n`);\r\n });\r\n\r\n while (true) {\r\n const answer = await ask('> ');\r\n const pickedIndex = Number(answer);\r\n if (Number.isInteger(pickedIndex) && pickedIndex >= 1 && pickedIndex <= options.length) {\r\n return options[pickedIndex - 1];\r\n }\r\n const matched = options.find((option) => option === answer);\r\n if (matched) {\r\n return matched;\r\n }\r\n output.write('\u8BF7\u8F93\u5165\u9009\u9879\u7F16\u53F7\u3002\\n');\r\n }\r\n },\r\n async input(message, defaultValue) {\r\n const suffix = defaultValue ? ` (${defaultValue})` : '';\r\n const answer = await ask(`${message}${suffix}: `);\r\n return answer || defaultValue || '';\r\n },\r\n info(message) {\n output.write(`${message}\\n`);\n },\n close() {\n rl.close();\n },\n };\n}\n\r\nfunction readStructuredConfigFile(filePath: string): unknown {\n const content = readFileSync(filePath, 'utf-8');\r\n if (filePath.endsWith('.json')) {\r\n return JSON.parse(content);\r\n }\r\n return yaml.load(content);\r\n}\n\nfunction getCurrentRuntimeFields(): Partial<Record<'HOST' | 'PORT' | 'LOG' | 'LOG_LEVEL' | 'API_TIMEOUT_MS', unknown>> {\n const candidates = [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON];\n const currentPath = candidates.find((filePath) => existsSync(filePath));\n if (!currentPath) {\n return {};\n }\n\n try {\n const config = readStructuredConfigFile(currentPath) as Record<string, unknown> | null;\n if (!config || typeof config !== 'object') {\n return {};\n }\n\n const fields: Partial<Record<'HOST' | 'PORT' | 'LOG' | 'LOG_LEVEL' | 'API_TIMEOUT_MS', unknown>> = {};\n for (const key of ['HOST', 'PORT', 'LOG', 'LOG_LEVEL', 'API_TIMEOUT_MS'] as const) {\n if (config[key] !== undefined) {\n fields[key] = config[key];\n }\n }\n return fields;\n } catch {\n return {};\n }\n}\n\nfunction getConfiguredPortFromCurrentFiles(): number {\n const candidates = [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON];\n const currentPath = candidates.find((filePath) => existsSync(filePath));\n if (!currentPath) {\n return DEFAULT_CONFIG.PORT;\n }\n\n try {\n const config = readStructuredConfigFile(currentPath) as { PORT?: unknown } | null;\n if (config && typeof config.PORT === 'number' && Number.isFinite(config.PORT) && config.PORT > 0) {\n return config.PORT;\n }\n } catch {\n // Fall back to default port when current config cannot be parsed.\n }\n\n return DEFAULT_CONFIG.PORT;\n}\n\nasync function getAvailablePort(): Promise<number> {\n const server = createServer();\n try {\n return await new Promise<number>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n const address = server.address();\n if (!address || typeof address === 'string') {\n reject(new Error('failed to resolve available port'));\n return;\n }\n resolve(address.port);\n });\n });\n } finally {\n if (server.listening) {\n await new Promise<void>((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));\n }\n }\n}\n\r\nfunction readLegacyConfigFile(filePath: string): unknown {\r\n const content = readFileSync(filePath, 'utf-8');\r\n if (filePath.endsWith('.json')) {\r\n return JSON5.parse(content);\r\n }\r\n return yaml.load(content);\r\n}\r\n\r\ninterface IReadLegacyConfigDeps {\r\n homeDir?: string;\r\n exists?: (filePath: string) => boolean;\r\n readConfig?: (filePath: string) => unknown;\r\n}\r\n\r\nexport async function readLegacyConfig(deps: IReadLegacyConfigDeps = {}): Promise<RawLegacyConfigResult> {\r\n const baseHomeDir = deps.homeDir || homedir();\r\n const exists = deps.exists || existsSync;\r\n const readConfig = deps.readConfig || readLegacyConfigFile;\r\n const overridePath = process.env.CTR_SETUP_LEGACY_CONFIG_PATH;\r\n const candidatePaths = overridePath\r\n ? [overridePath]\r\n : [\r\n join(baseHomeDir, '.ccr', 'config.yaml'),\r\n join(baseHomeDir, '.claude-code-router', 'config.yaml'),\r\n join(baseHomeDir, '.claude-code-router', 'config.json'),\r\n ];\r\n\r\n const legacyPath = candidatePaths.find((filePath) => exists(filePath));\r\n if (!legacyPath) {\r\n return { kind: 'missing' };\r\n }\r\n\r\n try {\r\n return {\r\n kind: 'found',\r\n path: legacyPath,\r\n config: readConfig(legacyPath),\r\n };\r\n } catch (error) {\r\n return {\r\n kind: 'read_error',\r\n path: legacyPath,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\nasync function readCurrentConfig(): Promise<RawCurrentConfigResult> {\r\n const candidates = [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON];\r\n const currentPath = candidates.find((filePath) => existsSync(filePath));\r\n if (!currentPath) {\r\n return { kind: 'missing' };\r\n }\r\n\r\n try {\r\n return {\r\n kind: 'found',\r\n path: currentPath,\r\n format: currentPath.endsWith('.json') ? 'json' : currentPath.endsWith('.yml') ? 'yml' : 'yaml',\r\n config: (readStructuredConfigFile(currentPath) ?? {}) as Record<string, unknown>,\r\n };\r\n } catch (error) {\r\n return {\r\n kind: 'parse_error',\r\n path: currentPath,\r\n format: currentPath.endsWith('.json') ? 'json' : currentPath.endsWith('.yml') ? 'yml' : 'yaml',\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\nasync function probeService() {\n const port = getConfiguredPortFromCurrentFiles();\n const healthy = await waitForService(port, 500);\n if (healthy) {\n return isServiceRunning()\n ? { kind: 'self_healthy' as const, port }\n : { kind: 'non_self_occupied' as const, port };\n }\n\n const occupied = await isTcpPortOccupied(port, 500);\n if (!occupied) {\n return { kind: 'none' as const };\n }\n\n return isServiceRunning()\n ? { kind: 'self_unhealthy' as const, port }\n : { kind: 'non_self_occupied' as const, port };\n}\n\r\nasync function enterClaudeCode(): Promise<void> {\n if (process.env.CTR_SETUP_SKIP_ENTER_CODE === '1') {\n return;\n }\n const cliModule = await import('../cli');\n await cliModule.runClaudeCode();\n}\n\nfunction shouldAutoEnterClaudeCodeAfterSetup(): boolean {\n return process.env.CTR_SETUP_AUTO_ENTER_CODE === '1';\n}\n\r\nasync function executeStart(): Promise<void> {\n const childProcess = await import('child_process');\n childProcess.spawn(process.execPath, [process.argv[1], 'start'], {\n detached: true,\n stdio: 'ignore',\n env: { ...process.env, CTR_DAEMON: '1' },\n }).unref();\n}\n\r\nasync function executeRestart(): Promise<void> {\n const info = readServiceInfo();\n if (info) {\n try {\n killProcess(info.pid);\n await waitForProcessExit(info.pid, 5000);\n } catch {\n // Ignore stop failures here and rely on the following health check.\n }\n }\n await executeStart();\n}\r\n\r\nfunction mapConfigErrorsToRepairFields(errors: string[]) {\r\n const fields = getRepairFields(errors);\r\n return fields.includes('manualReview')\r\n ? { mode: 'manualReview' as const, fields }\r\n : { mode: 'repair' as const, fields };\r\n}\r\n\r\nfunction mapValidCurrentConfigChoice(choice: string): 'reuse' | 'overwrite' | 'fresh' | 'cancel' {\r\n if (choice === 'reuse' || choice === '\u76F4\u63A5\u4F7F\u7528\u5F53\u524D\u914D\u7F6E\uFF08\u63A8\u8350\uFF09') {\r\n return 'reuse';\r\n }\r\n if (choice === 'overwrite' || choice === '\u68C0\u67E5\u5E76\u8C03\u6574\u5F53\u524D\u914D\u7F6E') {\r\n return 'overwrite';\r\n }\r\n if (choice === 'fresh' || choice === '\u653E\u5F03\u5F53\u524D\u914D\u7F6E\uFF0C\u91CD\u65B0\u5F00\u59CB') {\r\n return 'fresh';\r\n }\r\n if (choice === 'cancel') {\r\n return 'cancel';\r\n }\r\n throw new Error('invalid current config action');\r\n}\r\n\r\nfunction mapLegacyConfigChoice(choice: string): 'migrate' | 'skip' {\r\n if (choice === 'migrate' || choice === '\u8FC1\u79FB\u65E7\u914D\u7F6E\uFF08\u63A8\u8350\uFF09') {\r\n return 'migrate';\r\n }\r\n if (choice === 'skip' || choice === '\u8DF3\u8FC7\u8FC1\u79FB\uFF0C\u624B\u52A8\u65B0\u5EFA') {\r\n return 'skip';\r\n }\r\n throw new Error('invalid legacy config action');\r\n}\r\n\r\nfunction toCapabilityBoolean(choice: TCapabilityChoice): boolean | undefined {\r\n if (choice === '\u652F\u6301') {\r\n return true;\r\n }\r\n if (choice === '\u7981\u7528') {\r\n return false;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction applyCapabilityMetadata(model: any, metadata?: Record<string, unknown>) {\r\n if (!metadata || !Object.keys(metadata).length) {\r\n delete model.metadata;\r\n return model;\r\n }\r\n\r\n model.metadata = {\r\n ...(model.metadata ?? {}),\r\n ...metadata,\r\n };\r\n\r\n if (!Object.keys(model.metadata || {}).length) {\r\n delete model.metadata;\r\n }\r\n\r\n return model;\r\n}\r\n\r\nasync function promptCapabilityMetadata(io: ISetupIO, currentMetadata?: Record<string, unknown>) {\r\n const vendorHint = await io.input('Vendor hint\uFF08\u53EF\u9009\uFF09', String(currentMetadata?.vendor_hint ?? ''));\r\n const reasoningChoice = await io.choose('Reasoning support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\r\n const toolChoice = await io.choose('Tool support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\r\n const imageChoice = await io.choose('Image support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\r\n\r\n const nextMetadata: Record<string, unknown> = {};\r\n if (vendorHint.trim()) {\r\n nextMetadata.vendor_hint = vendorHint.trim();\r\n }\r\n\r\n const reasoning = toCapabilityBoolean(reasoningChoice);\r\n if (reasoning !== undefined) {\r\n nextMetadata.supports_reasoning = reasoning;\r\n }\r\n\r\n const tools = toCapabilityBoolean(toolChoice);\r\n if (tools !== undefined) {\r\n nextMetadata.supports_tools = tools;\r\n }\r\n\r\n const images = toCapabilityBoolean(imageChoice);\r\n if (images !== undefined) {\r\n nextMetadata.supports_images = images;\r\n }\r\n\r\n return nextMetadata;\r\n}\r\n\r\nasync function promptCapabilityMetadataForDraft(draft: ISetupConfigDraft, io: ISetupIO) {\r\n if (!draft.Models?.length) {\r\n return;\r\n }\r\n\r\n for (const model of draft.Models) {\r\n const modelLabel = model.id || model.model || 'unnamed-model';\r\n const editChoice = await io.choose(`\u662F\u5426\u914D\u7F6E\u6A21\u578B ${modelLabel} \u7684 capability \u63D0\u793A`, ['\u4FDD\u6301\u5F53\u524D\u503C', '\u7F16\u8F91 capability']) as TCapabilityEditChoice;\r\n if (editChoice !== '\u7F16\u8F91 capability') {\r\n continue;\r\n }\r\n\r\n const metadata = await promptCapabilityMetadata(io, model.metadata);\r\n applyCapabilityMetadata(model, metadata);\r\n }\r\n}\r\n\r\nfunction toDraftFromConfig(config: any): ISetupConfigDraft {\r\n const derivedModels = !Array.isArray(config?.Models) && Array.isArray(config?.Providers)\r\n ? config.Providers.flatMap((provider: any) =>\r\n (Array.isArray(provider.models) ? provider.models : []).map((model: string) => ({\r\n id: `${provider.name}_${String(model).toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '')}`,\r\n key: provider.api_key ?? '',\r\n api_key: provider.api_key ?? '',\r\n api: provider.api_base_url,\r\n api_base_url: provider.api_base_url,\r\n interface: provider.api_base_url?.includes('/v1/messages') ? 'anthropic' : 'openai',\r\n protocol: provider.api_base_url?.includes('/v1/messages') ? 'anthropic' : 'openai',\r\n model,\r\n }))\r\n )\r\n : [];\r\n\r\n return {\r\n Providers: Array.isArray(config?.Providers)\r\n ? config.Providers.map((provider: any) => ({\r\n name: provider.name ?? '',\r\n api_key: provider.api_key ?? '',\r\n api_base_url: provider.api_base_url,\r\n models: Array.isArray(provider.models) ? [...provider.models] : [],\r\n transformer: provider.transformer?.use ? { use: [...provider.transformer.use] } : undefined,\r\n }))\r\n : [],\r\n Models: Array.isArray(config?.Models)\r\n ? config.Models.map((model: any) => ({\r\n id: model.id ?? '',\r\n key: model.key ?? model.api_key ?? '',\r\n api_key: model.api_key ?? '',\r\n api: model.api ?? model.api_base_url,\r\n api_base_url: model.api_base_url,\r\n interface: model.interface ?? model.protocol,\r\n protocol: model.protocol,\r\n model: model.model ?? '',\r\n thinking: typeof model.thinking === 'string'\r\n ? model.thinking\r\n : model.thinking\r\n ? { ...model.thinking }\r\n : undefined,\r\n metadata: model.metadata ? { ...model.metadata } : undefined,\r\n }))\r\n : derivedModels,\r\n Router: {\r\n default: Array.isArray(config?.Models)\r\n ? config?.Router?.default\r\n : Array.isArray(config?.Providers) && typeof config?.Router?.default === 'string' && config.Router.default.includes(',')\r\n ? derivedModels.find((item) => {\r\n const [providerName, modelName] = config.Router.default.split(',');\r\n return item.id.startsWith(`${providerName}_`) && item.model === modelName;\r\n })?.id\r\n : config?.Router?.default,\r\n },\r\n };\r\n}\r\n\r\nfunction toUniqueSuggestedModelId(preferredId: string, existingIds: string[]): string {\n const normalizedPreferredId = preferredId.trim() || 'model';\n if (!existingIds.includes(normalizedPreferredId)) {\n return normalizedPreferredId;\n }\n\n let suffix = 2;\n while (existingIds.includes(`${normalizedPreferredId}_${suffix}`)) {\n suffix += 1;\n }\n return `${normalizedPreferredId}_${suffix}`;\n}\n\nfunction appendModelToDraft(\n draft: ISetupConfigDraft,\n modelInput: ISetupCollectedModelInput,\n options: { setAsDefault?: boolean } = {}\n): ISetupConfigDraft {\n const fragment = buildMinimalConfig({\n providers: [modelInput],\n defaultModel: options.setAsDefault ? modelInput.model_id : undefined,\n });\n\n const nextDraft: ISetupConfigDraft = {\n ...draft,\n Models: [...(draft.Models ?? [])],\n Router: { ...(draft.Router ?? {}) },\n };\n\n if (fragment.Models?.[0]) {\n nextDraft.Models?.push(fragment.Models[0]);\n }\n\n if (options.setAsDefault) {\n nextDraft.Router.default = modelInput.model_id;\n } else if (!nextDraft.Router.default) {\n nextDraft.Router.default = modelInput.model_id;\n }\n\n return nextDraft;\n}\n\nfunction createComplexTaskRules(modelId: string) {\n return [\n {\n name: 'architecture',\n priority: 90,\n enabled: true,\n description: '\u67B6\u6784\u8BBE\u8BA1\u3001\u7CFB\u7EDF\u89C4\u5212\u548C\u5927\u8303\u56F4\u91CD\u6784\u4EFB\u52A1',\n patterns: [\n { type: 'exact', keywords: ['\u67B6\u6784\u8BBE\u8BA1', '\u7CFB\u7EDF\u8BBE\u8BA1', '\u6280\u672F\u65B9\u6848', 'architecture', 'system design'] },\n { type: 'regex', pattern: '(\u67B6\u6784|\u7CFB\u7EDF\u8BBE\u8BA1|\u6280\u672F\u65B9\u6848|architecture|system design)' },\n ],\n model: modelId,\n },\n {\n name: 'code_review',\n priority: 80,\n enabled: true,\n description: '\u4EE3\u7801\u5BA1\u67E5\u3001\u98CE\u9669\u8BC4\u4F30\u548C\u8D28\u91CF\u5206\u6790\u4EFB\u52A1',\n patterns: [\n { type: 'exact', keywords: ['\u4EE3\u7801\u5BA1\u67E5', 'code review', 'review code', '\u98CE\u9669\u8BC4\u4F30'] },\n { type: 'regex', pattern: '(\u4EE3\u7801|code).{0,6}(\u5BA1\u67E5|review|\u5BA1\u6838|\u68C0\u67E5)' },\n ],\n model: modelId,\n },\n {\n name: 'deep_reasoning',\n priority: 70,\n enabled: true,\n description: '\u590D\u6742\u63A8\u7406\u3001\u6DF1\u5165\u5206\u6790\u548C\u591A\u6B65\u51B3\u7B56\u4EFB\u52A1',\n patterns: [\n { type: 'exact', keywords: ['\u6DF1\u5165\u5206\u6790', '\u590D\u6742\u63A8\u7406', '\u4E25\u8C28\u5206\u6790', 'deep analysis', 'reasoning'] },\n { type: 'regex', pattern: '(\u6DF1\u5165|\u590D\u6742|\u4E25\u8C28).{0,6}(\u5206\u6790|\u63A8\u7406|\u8BBA\u8BC1)' },\n ],\n model: modelId,\n },\n ];\n}\n\nfunction applyRoutingBootstrap(\n draft: ISetupConfigDraft,\n choice: TRoutingBootstrapChoice,\n specializedModelId: string\n): ISetupConfigDraft {\n if (choice === '\u5148\u4FDD\u6301\u6700\u5C0F\u914D\u7F6E') {\n return draft;\n }\n\n const defaultModelId = draft.Router.default;\n if (!defaultModelId) {\n return draft;\n }\n\n const specializedModel = draft.Models?.find((item) => item.id === specializedModelId);\n if (!specializedModel) {\n return draft;\n }\n\n const nextDraft: ISetupConfigDraft = {\n ...draft,\n SmartRouter: {\n enabled: true,\n analysis_scope: 'last_message',\n rules: createComplexTaskRules(specializedModelId),\n ...(choice === '\u5F00\u542F\u590D\u6742\u4EFB\u52A1\u89C4\u5219 + \u667A\u80FD\u515C\u5E95'\n ? {\n router_model: defaultModelId,\n candidates: [\n {\n model: defaultModelId,\n description: '\u9ED8\u8BA4\u6A21\u578B\uFF0C\u9002\u5408\u901A\u7528\u7F16\u7A0B\u3001\u65E5\u5E38\u4FEE\u590D\u548C\u5FEB\u901F\u54CD\u5E94\u4EFB\u52A1',\n },\n {\n model: specializedModelId,\n description: `\u590D\u6742\u4EFB\u52A1\u6A21\u578B\uFF08${specializedModel.model}\uFF09\uFF0C\u9002\u5408\u67B6\u6784\u8BBE\u8BA1\u3001\u4EE3\u7801\u5BA1\u67E5\u548C\u6DF1\u5165\u63A8\u7406`,\n },\n ],\n }\n : {}),\n },\n };\n\n return nextDraft;\n}\n\nasync function promptModelConnection(\n io: ISetupIO,\n input: {\n intro?: string;\n modelIdPrompt: string;\n suggestedModelId: string;\n }\n): Promise<ISetupCollectedModelInput> {\n if (input.intro) {\n io.info(input.intro);\n }\n\n const modelId = await io.input(input.modelIdPrompt, input.suggestedModelId);\n const connectMode = await io.choose('\u8FD9\u4E2A\u6A21\u578B\u63A5\u5230\u54EA\u91CC\uFF1F', ['\u4F7F\u7528\u5E38\u89C1\u63A5\u5165\u6A21\u677F', '\u624B\u52A8\u586B\u5199\u63A5\u53E3']);\n\n let preset: ProviderPresetKey = 'custom';\n let providerName = 'provider';\n let apiBaseUrl = '';\n\n if (connectMode === '\u4F7F\u7528\u5E38\u89C1\u63A5\u5165\u6A21\u677F') {\n const presetOptions = listProviderPresetKeys('setup');\n preset = await io.choose('\u9009\u62E9 provider \u9884\u8BBE', presetOptions) as ProviderPresetKey;\n providerName = await io.input('Provider \u540D\u79F0', preset);\n apiBaseUrl = preset === 'custom' ? await io.input('API Base URL') : await io.input('API Base URL\uFF08\u7559\u7A7A\u4F7F\u7528\u9884\u8BBE\uFF09', '');\n } else {\n providerName = await io.input('Provider \u540D\u79F0', 'provider');\n apiBaseUrl = await io.input('API Base URL');\n }\n\n const apiKey = await io.input('API Key');\n const presetDefinition = getProviderPreset(preset);\n const model = await io.input('\u4E0A\u6E38\u6A21\u578B\u540D', presetDefinition?.default_model ?? '');\n const interfaceChoice = connectMode === '\u624B\u52A8\u586B\u5199\u63A5\u53E3'\n ? await io.choose('\u63A5\u53E3\u7C7B\u578B', ['openai', 'anthropic']) as 'openai' | 'anthropic'\n : presetDefinition?.interface;\n\n return {\n name: providerName,\n model_id: modelId,\n api_key: apiKey,\n interface: interfaceChoice,\n models: [model],\n preset,\n api_base_url: apiBaseUrl,\n };\n}\n\nasync function buildFreshConfig(io: ISetupIO): Promise<ISetupConfigDraft> {\n const primaryModel = await promptModelConnection(io, {\n intro: '\u6211\u4EEC\u5148\u521B\u5EFA\u4E00\u4EFD\u6700\u5C0F\u53EF\u7528\u914D\u7F6E\u3002',\n modelIdPrompt: '\u8FD9\u4E2A\u9ED8\u8BA4\u6A21\u578B\u5728\u672C\u5730\u8981\u53EB\u4EC0\u4E48\u540D\u5B57\uFF1F',\n suggestedModelId: 'sonnet',\n });\n\n let draft = buildMinimalConfig({\n providers: [primaryModel],\n defaultModel: primaryModel.model_id,\n });\n\n const addSecondModelChoice = await io.choose('\u73B0\u5728\u8981\u4E0D\u8981\u7EE7\u7EED\u6DFB\u52A0\u4E00\u4E2A\u201C\u590D\u6742\u4EFB\u52A1\u4E13\u7528\u6A21\u578B\u201D\uFF1F', [\n '\u5148\u4E0D\u6DFB\u52A0',\n '\u6DFB\u52A0\u4E00\u4E2A\u590D\u6742\u4EFB\u52A1\u4E13\u7528\u6A21\u578B',\n ]);\n\n if (addSecondModelChoice === '\u6DFB\u52A0\u4E00\u4E2A\u590D\u6742\u4EFB\u52A1\u4E13\u7528\u6A21\u578B') {\n const suggestedSecondModelId = toUniqueSuggestedModelId('reasoner', draft.Models?.map((item) => item.id) ?? []);\n const specializedModel = await promptModelConnection(io, {\n intro: '\u8FD9\u4E2A\u6A21\u578B\u901A\u5E38\u7528\u4E8E\u67B6\u6784\u8BBE\u8BA1\u3001\u4EE3\u7801\u5BA1\u67E5\u6216\u590D\u6742\u63A8\u7406\u7B49\u66F4\u91CD\u7684\u4EFB\u52A1\u3002',\n modelIdPrompt: '\u8FD9\u4E2A\u590D\u6742\u4EFB\u52A1\u6A21\u578B\u5728\u672C\u5730\u8981\u53EB\u4EC0\u4E48\u540D\u5B57\uFF1F',\n suggestedModelId: suggestedSecondModelId,\n });\n draft = appendModelToDraft(draft, specializedModel);\n\n const routingChoice = await io.choose('\u73B0\u5728\u8981\u4E0D\u8981\u5F00\u542F\u9AD8\u7EA7\u8DEF\u7531\uFF1F', [\n '\u5148\u4FDD\u6301\u6700\u5C0F\u914D\u7F6E',\n '\u5F00\u542F\u590D\u6742\u4EFB\u52A1\u89C4\u5219\u6A21\u677F',\n '\u5F00\u542F\u590D\u6742\u4EFB\u52A1\u89C4\u5219 + \u667A\u80FD\u515C\u5E95',\n ]) as TRoutingBootstrapChoice;\n\n draft = applyRoutingBootstrap(draft, routingChoice, specializedModel.model_id);\n\n if (routingChoice !== '\u5148\u4FDD\u6301\u6700\u5C0F\u914D\u7F6E') {\n io.info(`\u5DF2\u4E3A\u4F60\u751F\u6210 SmartRouter \u8DEF\u7531\u6A21\u677F\uFF0C\u9ED8\u8BA4\u6A21\u578B\u4ECD\u662F ${primaryModel.model_id}\uFF0C\u590D\u6742\u4EFB\u52A1\u4F1A\u4F18\u5148\u4F7F\u7528 ${specializedModel.model_id}\u3002`);\n }\n }\n\n const capabilityMode = await io.choose('\u662F\u5426\u914D\u7F6E capability \u63D0\u793A', ['\u4FDD\u6301\u9ED8\u8BA4', '\u914D\u7F6E capability \u63D0\u793A']);\n\n if (capabilityMode === '\u914D\u7F6E capability \u63D0\u793A' && draft.Models?.[0]) {\n await promptCapabilityMetadataForDraft(draft, io);\n }\n\r\n return draft;\r\n}\r\n\r\nasync function completeDraft(input: { draft: ISetupConfigDraft; fields: string[]; io: ISetupIO }): Promise<ISetupConfigDraft> {\r\n const draft = toDraftFromConfig(input.draft);\r\n\r\n if (input.fields.includes('defaultModel')) {\r\n const defaultProvider = draft.Models?.[0]?.id ?? draft.Providers?.[0]?.name ?? 'provider';\r\n const defaultModel = draft.Models?.[0]?.model ?? draft.Providers?.[0]?.models?.[0] ?? '';\r\n const model = await input.io.input('\u9ED8\u8BA4\u6A21\u578B', defaultModel);\r\n if (draft.Models?.[0]) {\r\n draft.Models[0].model = model;\r\n draft.Router.default = defaultProvider;\r\n } else if (draft.Providers?.[0]) {\r\n draft.Providers[0].models = [model];\r\n draft.Router.default = `${defaultProvider},${model}`;\r\n }\r\n }\r\n\r\n if (input.fields.includes('apiKey')) {\r\n const apiKey = await input.io.input('API Key');\r\n if (draft.Models?.length) {\r\n draft.Models = draft.Models.map((model) => ({ ...model, key: model.key || apiKey, api_key: model.api_key || apiKey }));\r\n } else {\r\n draft.Providers = draft.Providers?.map((provider) => ({ ...provider, api_key: provider.api_key || apiKey }));\r\n }\r\n }\r\n\r\n if (input.fields.includes('apiBaseUrl')) {\r\n const apiBaseUrl = await input.io.input('API Base URL');\r\n if (draft.Models?.length) {\r\n draft.Models = draft.Models.map((model) => ({\r\n ...model,\r\n api: model.api || apiBaseUrl,\r\n api_base_url: model.api_base_url || apiBaseUrl,\r\n }));\r\n } else {\r\n draft.Providers = draft.Providers?.map((provider) => ({\r\n ...provider,\r\n api_base_url: provider.api_base_url || apiBaseUrl,\r\n }));\r\n }\r\n }\r\n\r\n if (input.fields.includes('capabilityHints') && draft.Models?.[0]) {\r\n await promptCapabilityMetadataForDraft(draft, input.io);\r\n }\r\n\r\n return draft;\r\n}\r\n\r\nfunction createDefaultDeps(io = createConsoleIO()): IRunSetupCliDeps {\n return {\n readCurrentConfig,\r\n readLegacyConfig,\r\n probeService,\r\n backupCurrentConfig: backupConfigFile,\r\n writeConfig: writeConfigFile,\r\n executeStart,\r\n executeReload: executeRestart,\r\n executeRestart,\r\n verifyHealth: () => waitForService(getConfiguredPortFromCurrentFiles(), 5000),\n enterClaudeCode,\n io,\n };\n}\n\nfunction printRoutingNextSteps(io: ISetupIO): void {\n io.info('\u4F60\u53EF\u4EE5\u6309\u9700\u7EE7\u7EED\u914D\u7F6E\u8DEF\u7531\u80FD\u529B\uFF1A');\n io.info(' - SmartRouter.rules\uFF1A\u9002\u5408\u9AD8\u786E\u5B9A\u6027\u4EFB\u52A1\uFF0C\u628A\u67B6\u6784\u8BBE\u8BA1\u3001\u4EE3\u7801\u5BA1\u67E5\u7B49\u8BF7\u6C42\u56FA\u5B9A\u5207\u5230\u6307\u5B9A\u6A21\u578B');\n io.info(' - SmartRouter candidates\uFF1A\u9002\u5408\u6A21\u7CCA\u4EFB\u52A1\uFF0C\u5728\u5019\u9009\u6A21\u578B\u4E4B\u95F4\u81EA\u52A8\u9009\u62E9\u66F4\u5408\u9002\u7684\u6A21\u578B');\n io.info(' - \u914D\u7F6E\u6A21\u677F\u53C2\u8003\uFF1Aconfig/trigger.advanced.yaml');\n}\n\nexport async function runSetupCli(customDeps?: Partial<IRunSetupCliDeps>): Promise<void> {\n const defaults = createDefaultDeps(customDeps?.io);\n const deps = { ...defaults, ...customDeps } as IRunSetupCliDeps;\n\n try {\n await runSetup({\n detectSetupEnvironment: () =>\n detectSetupEnvironment({\n readCurrentConfig: deps.readCurrentConfig,\n readLegacyConfig: deps.readLegacyConfig,\n probeService: deps.probeService,\n }),\n chooseCurrentConfigAction: async ({ currentConfig }) => {\n if (currentConfig.kind === 'missing') {\n return 'create';\n }\n if (currentConfig.kind === 'valid') {\n deps.io.info('\u68C0\u6D4B\u5230\u5F53\u524D claude-trigger-router \u914D\u7F6E\u5DF2\u53EF\u7528\u3002');\n if (currentConfig.warnings.length > 0) {\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u63D0\u793A\uFF1A${currentConfig.warnings.join('; ')}`);\n }\n return mapValidCurrentConfigChoice(\n await deps.io.choose('\u4F60\u60F3\u76F4\u63A5\u4F7F\u7528\u5B83\uFF0C\u8FD8\u662F\u91CD\u65B0\u8C03\u6574\uFF1F', [\n '\u76F4\u63A5\u4F7F\u7528\u5F53\u524D\u914D\u7F6E\uFF08\u63A8\u8350\uFF09',\n '\u68C0\u67E5\u5E76\u8C03\u6574\u5F53\u524D\u914D\u7F6E',\n '\u653E\u5F03\u5F53\u524D\u914D\u7F6E\uFF0C\u91CD\u65B0\u5F00\u59CB',\n ])\n );\n }\n if (currentConfig.kind === 'invalid') {\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u6821\u9A8C\u5931\u8D25\uFF1A${currentConfig.errors.join('; ')}`);\n if (currentConfig.warnings.length > 0) {\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u63D0\u793A\uFF1A${currentConfig.warnings.join('; ')}`);\n }\n return (await deps.io.choose('\u9009\u62E9\u4E0B\u4E00\u6B65', ['repair', 'overwrite', 'cancel'])) as 'repair' | 'overwrite' | 'cancel';\n }\n\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u65E0\u6CD5\u89E3\u6790\uFF1A${currentConfig.error}`);\n return (await deps.io.choose('\u9009\u62E9\u4E0B\u4E00\u6B65', ['rebuild', 'cancel'])) as 'rebuild' | 'cancel';\n },\n chooseLegacyConfigAction: async ({ legacyConfig }) => {\n if (legacyConfig.kind === 'found') {\n return mapLegacyConfigChoice(\n await deps.io.choose('\u68C0\u6D4B\u5230\u65E7 claude-code-router \u914D\u7F6E\u3002\u662F\u5426\u8FC1\u79FB\u4E3A\u5F53\u524D\u63A8\u8350\u914D\u7F6E\uFF1F', [\n '\u8FC1\u79FB\u65E7\u914D\u7F6E\uFF08\u63A8\u8350\uFF09',\n '\u8DF3\u8FC7\u8FC1\u79FB\uFF0C\u624B\u52A8\u65B0\u5EFA',\n ])\n );\n }\n if (legacyConfig.kind === 'read_error') {\n deps.io.info(`\u65E7 ccr \u914D\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF1A${legacyConfig.error}`);\n }\n return 'skip';\n },\n buildFreshConfig: () => buildFreshConfig(deps.io),\n buildRepairConfig: async ({ currentConfig }) => toDraftFromConfig(currentConfig),\n completeDraft: ({ draft, fields }) => completeDraft({ draft, fields, io: deps.io }),\n migrateLegacyConfig,\n mapConfigErrorsToRepairFields,\n io: deps.io,\n persistConfig: async ({ config, currentConfigPath, hasExistingConfig }) => {\n let normalized = normalizeAndValidateConfig({\n ...(hasExistingConfig ? getCurrentRuntimeFields() : {}),\n ...(config as any),\n });\n {\n const targetPort = normalized.config.PORT ?? DEFAULT_CONFIG.PORT;\n const occupied = await isTcpPortOccupied(targetPort, 500);\n if (occupied && !isServiceRunning()) {\n const fallbackPort = await getAvailablePort();\n deps.io.info(`\u68C0\u6D4B\u5230\u9ED8\u8BA4\u7AEF\u53E3 ${targetPort} \u5DF2\u88AB\u5360\u7528\uFF0Csetup \u5DF2\u81EA\u52A8\u6539\u7528\u53EF\u7528\u7AEF\u53E3 ${fallbackPort}\u3002`);\n normalized = normalizeAndValidateConfig({\n ...normalized.config,\n PORT: fallbackPort,\n });\n }\n }\n const persisted = await persistSetupConfig({\n config: normalized.config,\n currentConfigPath,\n hasExistingConfig,\n validateConfig: (inputConfig) => normalizeAndValidateConfig(inputConfig).errors,\n backupCurrentConfig: deps.backupCurrentConfig,\n writeConfig: deps.writeConfig,\n });\n if (normalized.warnings.length > 0) {\n deps.io.info(`\u914D\u7F6E\u63D0\u793A\uFF1A${normalized.warnings.join('; ')}`);\n }\n return persisted;\n },\n ensureServiceReady: async ({ configChanged, detectedService, reloadSupported }) => {\n const effectiveDetectedService = configChanged\n ? await deps.probeService()\n : detectedService;\n const action = decideServiceAction({\n configChanged,\n detectedService: effectiveDetectedService,\n reloadSupported,\n });\n\n await applyServiceAction({\n action,\n executeStart: deps.executeStart,\n executeReload: deps.executeReload,\n executeRestart: deps.executeRestart,\n verifyHealth: deps.verifyHealth,\n });\n\n return {\n action: action.kind,\n healthChecked: true,\n };\n },\n enterClaudeCode: async () => {\n printRoutingNextSteps(deps.io);\n if (!shouldAutoEnterClaudeCodeAfterSetup()) {\n deps.io.info('\u4E3A\u907F\u514D setup \u7ED3\u675F\u540E\u63A5\u7BA1\u5F53\u524D\u7EC8\u7AEF\uFF0C\u8BF7\u624B\u52A8\u8FD0\u884C\uFF1Actr code');\n deps.io.info('\u5982\u679C\u4F60\u660E\u786E\u9700\u8981 setup \u7ED3\u675F\u540E\u81EA\u52A8\u8FDB\u5165 Claude Code\uFF0C\u53EF\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF CTR_SETUP_AUTO_ENTER_CODE=1');\n return;\n }\n\n deps.io.close?.();\n await deps.enterClaudeCode();\n },\n reloadSupported: false,\n });\n } finally {\n deps.io.close?.();\n }\n}\n", "import { existsSync, readFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { createInterface } from 'readline/promises';\nimport { stdin as input, stdout as output } from 'process';\nimport { spawn } from 'child_process';\nimport JSON5 from 'json5';\nimport yaml from 'js-yaml';\n\nimport { CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from '../constants';\nimport { normalizeAndValidateConfig, writeConfigFile, backupConfigFile } from '../utils';\nimport { migrateLegacyConfig } from '../setup/migrate';\nimport { readLegacyConfig } from '../setup';\nimport { IAppConfig, IModelEndpointConfig } from '../trigger/types';\nimport { getModelApi, getModelInterface, getModelKey, inferInterfaceFromApiEndpoint } from '../models/schema';\nimport { buildModelRegistry, describeCompatibilityProfile, describeDispatchFormat } from '../models/compile';\nimport { buildProviderDispatchRequest, describeProtocolDiagnostic, TProtocolDiagnosticCode } from '../protocols';\nimport { isServiceRunning, killProcess, readServiceInfo } from '../utils/processCheck';\nimport { isTcpPortOccupied, probeServiceHealth, waitForService } from '../service-health';\nimport { buildUsableMinimalTemplateConfig } from '../setup/templates';\n\ninterface IDoctorIO {\n info(message: string): void;\n error(message: string): void;\n choose(message: string, options: string[]): Promise<string>;\n input(message: string, defaultValue?: string): Promise<string>;\n confirm(message: string, defaultValue?: boolean): Promise<boolean>;\n close?(): void;\n}\n\ninterface IDoctorDeps {\n readLegacyConfig: typeof readLegacyConfig;\n backupCurrentConfig: typeof backupConfigFile;\n writeConfig: typeof writeConfigFile;\n isServiceRunning: typeof isServiceRunning;\n readServiceInfo: typeof readServiceInfo;\n killProcess: typeof killProcess;\n probeServiceHealth: typeof probeServiceHealth;\n isTcpPortOccupied: typeof isTcpPortOccupied;\n waitForService: typeof waitForService;\n io: IDoctorIO;\n startDaemon: () => Promise<void>;\n}\n\ninterface IConfigLoadResult {\n path: string;\n existed: boolean;\n config?: Partial<IAppConfig>;\n repairedParse: boolean;\n messages: string[];\n}\n\ntype TProbeResult =\n | { kind: 'success' }\n | { kind: 'failure'; category: 'auth_error' | 'model_not_found' | 'endpoint_unreachable' | 'protocol_mismatch' | 'remote_error'; message: string };\n\ninterface IProbeFailureExplanation {\n label: string;\n summary: string;\n action: string;\n}\n\nfunction collectCompatibilityPreviewDiagnostics(model: IModelEndpointConfig) {\n const registry = buildModelRegistry({\n Providers: [],\n Models: [model],\n Router: {\n default: model.id,\n },\n } as IAppConfig);\n const compiledModel = registry.modelMap[model.id];\n if (!compiledModel) {\n return [];\n }\n\n const preview = buildProviderDispatchRequest({\n model: compiledModel.modelName,\n interface: compiledModel.interface ?? 'openai',\n compatibilityProfile: compiledModel.compatibilityProfile,\n capabilities: compiledModel.capabilities,\n request: {\n model: compiledModel.id,\n max_tokens: 32,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'compatibility preview',\n },\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: 'image/png',\n data: 'preview',\n },\n },\n ],\n },\n ],\n tools: [\n {\n name: 'preview_tool',\n description: 'Preview tool',\n input_schema: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n },\n },\n },\n ],\n tool_choice: {\n type: 'tool',\n name: 'preview_tool',\n },\n thinking: {\n type: 'enabled',\n effort: 'medium',\n },\n },\n });\n\n return preview.diagnostics.map((code) => describeProtocolDiagnostic(code as TProtocolDiagnosticCode));\n}\n\nfunction hasArg(flag: string): boolean {\n return process.argv.slice(2).includes(flag);\n}\n\nfunction createConsoleIO(): IDoctorIO {\n if (process.env.CTR_DOCTOR_FORCE_SCRIPTED_INPUT === '1') {\n const scriptedInput = readFileSync(0, 'utf-8');\n const answers = scriptedInput.split(/\\r?\\n/).map((item) => item.trim()).filter(Boolean);\n let cursor = 0;\n const nextAnswer = async () => answers[cursor++] ?? '';\n\n return {\n info(message) {\n output.write(`${message}\\n`);\n },\n error(message) {\n output.write(`${message}\\n`);\n },\n async choose(message, options) {\n output.write(`${message}\\n`);\n options.forEach((option, index) => output.write(` ${index + 1}. ${option}\\n`));\n const answer = await nextAnswer();\n const index = Number(answer);\n if (Number.isInteger(index) && index >= 1 && index <= options.length) {\n return options[index - 1];\n }\n return options.find((option) => option === answer) ?? options[0];\n },\n async input(message, defaultValue) {\n output.write(`${message}${defaultValue ? ` (${defaultValue})` : ''}: `);\n const answer = await nextAnswer();\n return answer || defaultValue || '';\n },\n async confirm(message, defaultValue = true) {\n output.write(`${message} ${defaultValue ? '[Y/n]' : '[y/N]'}\\n`);\n const answer = (await nextAnswer()).toLowerCase();\n if (!answer) {\n return defaultValue;\n }\n return ['y', 'yes', '1', 'true'].includes(answer);\n },\n close() {\n // noop\n },\n };\n }\n\n const rl = createInterface({ input, output });\n const ask = async (message: string) => (await rl.question(message)).trim();\n\n return {\n info(message) {\n output.write(`${message}\\n`);\n },\n error(message) {\n output.write(`${message}\\n`);\n },\n async choose(message, options) {\n output.write(`${message}\\n`);\n options.forEach((option, index) => output.write(` ${index + 1}. ${option}\\n`));\n while (true) {\n const answer = await ask('> ');\n const index = Number(answer);\n if (Number.isInteger(index) && index >= 1 && index <= options.length) {\n return options[index - 1];\n }\n const matched = options.find((option) => option === answer);\n if (matched) {\n return matched;\n }\n output.write('\u8BF7\u8F93\u5165\u9009\u9879\u7F16\u53F7\u3002\\n');\n }\n },\n async input(message, defaultValue) {\n const answer = await ask(`${message}${defaultValue ? ` (${defaultValue})` : ''}: `);\n return answer || defaultValue || '';\n },\n async confirm(message, defaultValue = true) {\n const answer = (await ask(`${message} ${defaultValue ? '[Y/n]' : '[y/N]'}: `)).toLowerCase();\n if (!answer) {\n return defaultValue;\n }\n return ['y', 'yes'].includes(answer);\n },\n close() {\n rl.close();\n },\n };\n}\n\nfunction getConfigCandidates(): string[] {\n return [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON];\n}\n\nfunction inferInterfaceFromApi(api?: string, modelName?: string): 'openai' | 'anthropic' | undefined {\n return inferInterfaceFromApiEndpoint(api, modelName);\n}\n\nfunction sanitizeModelId(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '') || 'model';\n}\n\nfunction tryLoadStructuredConfig(filePath: string, content: string): { config: Partial<IAppConfig>; repairedParse: boolean; messages: string[] } {\n if (filePath.endsWith('.json')) {\n try {\n return { config: JSON.parse(content), repairedParse: false, messages: [] };\n } catch {\n return {\n config: JSON5.parse(content),\n repairedParse: true,\n messages: ['\u68C0\u6D4B\u5230 JSON \u914D\u7F6E\u5305\u542B\u5BBD\u677E\u8BED\u6CD5\uFF0Cdoctor \u5DF2\u6309\u6807\u51C6 JSON \u7ED3\u6784\u91CD\u65B0\u5F52\u4E00\u5316\u3002'],\n };\n }\n }\n\n try {\n return { config: yaml.load(content) as Partial<IAppConfig>, repairedParse: false, messages: [] };\n } catch (error: any) {\n const sanitized = content.replace(/\\t/g, ' ');\n if (sanitized !== content) {\n return {\n config: yaml.load(sanitized) as Partial<IAppConfig>,\n repairedParse: true,\n messages: ['\u68C0\u6D4B\u5230 YAML \u4F7F\u7528\u4E86 Tab \u7F29\u8FDB\uFF0Cdoctor \u5DF2\u81EA\u52A8\u4FEE\u590D\u4E3A\u7A7A\u683C\u7F29\u8FDB\u3002'],\n };\n }\n throw error;\n }\n}\n\nfunction loadCurrentConfig(): IConfigLoadResult {\n const existingPath = getConfigCandidates().find((filePath) => existsSync(filePath));\n const path = existingPath ?? CONFIG_FILE;\n if (!existingPath) {\n return {\n path,\n existed: false,\n repairedParse: false,\n messages: ['\u672A\u68C0\u6D4B\u5230\u5F53\u524D Claude Trigger Router \u914D\u7F6E\u3002'],\n };\n }\n\n const content = readFileSync(existingPath, 'utf-8');\n const loaded = tryLoadStructuredConfig(existingPath, content);\n return {\n path,\n existed: true,\n repairedParse: loaded.repairedParse,\n messages: loaded.messages,\n config: loaded.config,\n };\n}\n\nfunction getModelLookupId(model: Partial<IModelEndpointConfig>): string {\n return model.id?.trim() || sanitizeModelId(model.model ?? '');\n}\n\nfunction repairDeterministicConfig(config: Partial<IAppConfig>): { config: Partial<IAppConfig>; changes: string[] } {\n const nextConfig: Partial<IAppConfig> = {\n ...config,\n HOST: config.HOST ?? DEFAULT_CONFIG.HOST,\n PORT: config.PORT ?? DEFAULT_CONFIG.PORT,\n LOG: config.LOG ?? DEFAULT_CONFIG.LOG,\n LOG_LEVEL: config.LOG_LEVEL ?? DEFAULT_CONFIG.LOG_LEVEL,\n };\n const changes: string[] = [];\n\n if (Array.isArray(config.Models) && config.Models.length > 0) {\n nextConfig.Models = config.Models.map((item, index) => {\n const api = getModelApi(item);\n const key = getModelKey(item);\n const inferredInterface = getModelInterface(item) ?? inferInterfaceFromApi(api, item.model);\n const id = item.id?.trim() || (item.model ? sanitizeModelId(item.model) : `model_${index + 1}`);\n\n if (!item.id?.trim()) {\n changes.push(`\u5DF2\u8865\u5168 Models[${index}].id -> ${id}`);\n }\n if (inferredInterface && !getModelInterface(item)) {\n changes.push(`\u5DF2\u8865\u5168 Models[${index}].interface -> ${inferredInterface}`);\n }\n if (api && item.api !== api) {\n changes.push(`\u5DF2\u5F52\u4E00 Models[${index}].api`);\n }\n if (key && item.key !== key) {\n changes.push(`\u5DF2\u5F52\u4E00 Models[${index}].key`);\n }\n\n return {\n ...item,\n id,\n api: api || undefined,\n api_base_url: api || undefined,\n key: key || undefined,\n api_key: key || undefined,\n interface: inferredInterface,\n protocol: inferredInterface,\n };\n });\n\n if (!nextConfig.Router?.default) {\n if (nextConfig.Models.length === 1) {\n nextConfig.Router = {\n ...(nextConfig.Router ?? {}),\n default: getModelLookupId(nextConfig.Models[0]),\n };\n changes.push(`\u5DF2\u8865\u5168 Router.default -> ${nextConfig.Router.default}`);\n } else if (typeof config.Router?.default === 'string' && config.Router.default.includes(',')) {\n const [providerName, modelName] = config.Router.default.split(',').map((item) => item.trim());\n const matched = nextConfig.Models.find((item) =>\n item.model === modelName && (item.id === providerName || item.id.startsWith(`${sanitizeModelId(providerName)}_`))\n );\n if (matched) {\n nextConfig.Router = {\n ...(nextConfig.Router ?? {}),\n default: matched.id,\n };\n changes.push(`\u5DF2\u5F52\u4E00 Router.default -> ${matched.id}`);\n }\n }\n }\n } else if (Array.isArray(config.Providers) && config.Providers.length > 0) {\n const migrated = migrateLegacyConfig(config as any);\n nextConfig.Models = migrated.draft.Models;\n nextConfig.Router = {\n ...(nextConfig.Router ?? {}),\n ...migrated.draft.Router,\n };\n nextConfig.Providers = [];\n changes.push('\u5DF2\u5C06 legacy Providers \u7ED3\u6784\u5F52\u4E00\u4E3A Models \u7ED3\u6784\u3002');\n }\n\n return { config: nextConfig, changes };\n}\n\nasync function completeMissingModelFields(\n config: Partial<IAppConfig>,\n io: IDoctorIO\n): Promise<{ config: Partial<IAppConfig>; changes: string[] }> {\n const changes: string[] = [];\n const nextConfig: Partial<IAppConfig> = {\n ...config,\n Models: Array.isArray(config.Models) ? config.Models.map((item) => ({ ...item })) : [],\n Router: { ...(config.Router ?? {}) },\n };\n\n for (let index = 0; index < (nextConfig.Models?.length ?? 0); index += 1) {\n const model = nextConfig.Models![index];\n const label = model.id || model.model || `Models[${index}]`;\n\n if (!model.id?.trim()) {\n model.id = sanitizeModelId(await io.input(`\u8865\u5168 ${label} \u7684\u6A21\u578B ID`, sanitizeModelId(model.model || `model_${index + 1}`)));\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684\u6A21\u578B ID -> ${model.id}`);\n }\n if (!getModelApi(model)) {\n const api = await io.input(`\u8865\u5168 ${label} \u7684 API Base URL`);\n model.api = api;\n model.api_base_url = api;\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684 API Base URL`);\n }\n if (!getModelKey(model)) {\n const key = await io.input(`\u8865\u5168 ${label} \u7684 API Key`);\n model.key = key;\n model.api_key = key;\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684 API Key`);\n }\n if (!getModelInterface(model)) {\n const interfaceChoice = await io.choose(`\u8865\u5168 ${label} \u7684\u63A5\u53E3\u7C7B\u578B`, ['openai', 'anthropic']);\n model.interface = interfaceChoice as 'openai' | 'anthropic';\n model.protocol = model.interface;\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684\u63A5\u53E3\u7C7B\u578B -> ${model.interface}`);\n }\n if (!model.model?.trim()) {\n model.model = await io.input(`\u8865\u5168 ${label} \u7684\u4E0A\u6E38\u6A21\u578B\u540D`);\n changes.push(`\u5DF2\u8865\u5168 ${label} \u7684\u4E0A\u6E38\u6A21\u578B\u540D`);\n }\n }\n\n if (!nextConfig.Router?.default) {\n if ((nextConfig.Models?.length ?? 0) === 1) {\n nextConfig.Router!.default = nextConfig.Models![0].id;\n changes.push(`\u5DF2\u8865\u5168 Router.default -> ${nextConfig.Router!.default}`);\n } else if ((nextConfig.Models?.length ?? 0) > 1) {\n const choice = await io.choose('\u8865\u5168\u9ED8\u8BA4\u6A21\u578B', nextConfig.Models!.map((item) => item.id));\n nextConfig.Router!.default = choice;\n changes.push(`\u5DF2\u8865\u5168 Router.default -> ${choice}`);\n }\n }\n\n return { config: nextConfig, changes };\n}\n\nasync function probeModelAvailability(model: IModelEndpointConfig): Promise<TProbeResult> {\n const api = getModelApi(model);\n const key = getModelKey(model);\n const modelInterface = getModelInterface(model);\n\n if (!api || !key || !modelInterface || !model.model) {\n return {\n kind: 'failure',\n category: 'protocol_mismatch',\n message: '\u6A21\u578B\u914D\u7F6E\u7F3A\u5C11 api/key/interface/model\uFF0C\u65E0\u6CD5\u53D1\u8D77\u63A2\u6D4B\u3002',\n };\n }\n\n try {\n const registry = buildModelRegistry({\n Providers: [],\n Models: [model],\n Router: {\n default: model.id,\n },\n } as IAppConfig);\n const compiledModel = registry.modelMap[model.id];\n const dispatchRequest = compiledModel\n ? buildProviderDispatchRequest({\n model: compiledModel.modelName,\n interface: compiledModel.interface ?? modelInterface,\n compatibilityProfile: compiledModel.compatibilityProfile,\n capabilities: compiledModel.capabilities,\n request: {\n model: compiledModel.id,\n max_tokens: 1,\n stream: true,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'ok',\n },\n ],\n },\n ],\n },\n })\n : null;\n\n const response = await fetch(api, {\n method: 'POST',\n signal: AbortSignal.timeout(10000),\n headers: modelInterface === 'anthropic'\n ? {\n 'content-type': 'application/json',\n 'x-api-key': key,\n 'anthropic-version': '2023-06-01',\n }\n : {\n 'content-type': 'application/json',\n authorization: `Bearer ${key}`,\n },\n body: JSON.stringify(dispatchRequest?.body ?? (modelInterface === 'anthropic'\n ? {\n model: model.model,\n max_tokens: 1,\n stream: true,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'ok',\n },\n ],\n },\n ],\n }\n : {\n model: model.model,\n max_tokens: 1,\n stream: true,\n messages: [\n {\n role: 'user',\n content: 'ok',\n },\n ],\n })),\n });\n\n if (response.ok) {\n return { kind: 'success' };\n }\n\n const body = await response.text();\n if (response.status === 401 || response.status === 403) {\n return { kind: 'failure', category: 'auth_error', message: `${response.status} ${body}` };\n }\n if (response.status === 404) {\n return { kind: 'failure', category: 'model_not_found', message: `${response.status} ${body}` };\n }\n if (response.status === 400) {\n return { kind: 'failure', category: 'protocol_mismatch', message: `${response.status} ${body}` };\n }\n\n return { kind: 'failure', category: 'remote_error', message: `${response.status} ${body}` };\n } catch (error: any) {\n return {\n kind: 'failure',\n category: 'endpoint_unreachable',\n message: error?.message || String(error),\n };\n }\n}\n\nfunction explainProbeFailure(category: TProbeResult extends { kind: 'failure'; category: infer T } ? T : never): IProbeFailureExplanation {\n switch (category) {\n case 'auth_error':\n return {\n label: '\u9274\u6743\u5931\u8D25',\n summary: '\u4E0A\u6E38\u63A5\u53E3\u62D2\u7EDD\u4E86\u5F53\u524D API Key\uFF0C\u6216\u5F53\u524D\u8D26\u53F7\u6CA1\u6709\u8BBF\u95EE\u8BE5\u6A21\u578B\u7684\u6743\u9650\u3002',\n action: '\u8BF7\u68C0\u67E5 API Key\u3001\u8D26\u53F7\u8BA2\u9605\u72B6\u6001\uFF0C\u4EE5\u53CA\u5F53\u524D\u8D26\u53F7\u662F\u5426\u5177\u5907\u76EE\u6807\u6A21\u578B\u6743\u9650\u3002',\n };\n case 'model_not_found':\n return {\n label: '\u6A21\u578B\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u9650',\n summary: '\u4E0A\u6E38\u63A5\u53E3\u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u6A21\u578B\u540D\uFF0C\u6216\u5F53\u524D\u8D26\u53F7\u6CA1\u6709\u8BE5\u6A21\u578B\u7684\u8BBF\u95EE\u6743\u9650\u3002',\n action: '\u8BF7\u68C0\u67E5\u6A21\u578B\u540D\u662F\u5426\u6B63\u786E\uFF0C\u4EE5\u53CA\u5F53\u524D\u8D26\u53F7\u662F\u5426\u5DF2\u5F00\u901A\u8BE5\u6A21\u578B\u3002',\n };\n case 'endpoint_unreachable':\n return {\n label: '\u63A5\u53E3\u4E0D\u53EF\u8FBE',\n summary: 'doctor \u65E0\u6CD5\u8FDE\u63A5\u5230\u5F53\u524D API \u5730\u5740\uFF0C\u53EF\u80FD\u662F\u5730\u5740\u3001\u7F51\u7EDC\u3001TLS \u6216\u4EE3\u7406\u914D\u7F6E\u95EE\u9898\u3002',\n action: '\u8BF7\u68C0\u67E5 API Base URL\u3001\u7F51\u7EDC\u8FDE\u901A\u6027\u3001TLS \u8BC1\u4E66\u94FE\uFF0C\u4EE5\u53CA\u662F\u5426\u9700\u8981\u4EE3\u7406\u3002',\n };\n case 'protocol_mismatch':\n return {\n label: '\u534F\u8BAE\u517C\u5BB9\u5931\u8D25',\n summary: '\u5F53\u524D\u4E0A\u6E38\u63A5\u53E3\u4E0E\u7EDF\u4E00\u6D88\u606F\u62BD\u8C61\u5728 messages\u3001tools\u3001stream \u6216\u63A7\u5236\u5B57\u6BB5\u4E0A\u5B58\u5728\u517C\u5BB9\u5DEE\u5F02\u3002',\n action: '\u8BF7\u5148\u786E\u8BA4 API Base URL \u548C interface \u662F\u5426\u914D\u7F6E\u6B63\u786E\uFF1B\u5982\u679C\u6587\u672C\u8BF7\u6C42\u6B63\u5E38\u4F46\u5DE5\u5177\u8C03\u7528\u5931\u8D25\uFF0C\u8BF7\u4FDD\u7559\u539F\u59CB\u62A5\u9519\u7EE7\u7EED\u6536\u655B\u517C\u5BB9\u5C42\u3002',\n };\n case 'remote_error':\n return {\n label: '\u4E0A\u6E38\u8FD4\u56DE\u9519\u8BEF',\n summary: '\u8BF7\u6C42\u5DF2\u7ECF\u5230\u8FBE\u4E0A\u6E38\uFF0C\u4F46\u4E0A\u6E38\u8FD4\u56DE\u4E86\u5176\u4ED6\u4E1A\u52A1\u6216\u670D\u52A1\u7AEF\u9519\u8BEF\u3002',\n action: '\u8BF7\u7ED3\u5408\u539F\u59CB\u9519\u8BEF\u4FE1\u606F\u68C0\u67E5\u4E0A\u6E38\u670D\u52A1\u72B6\u6001\u3001\u6A21\u578B\u914D\u989D\u6216\u8D26\u53F7\u9650\u5236\u3002',\n };\n default:\n return {\n label: category,\n summary: '\u672A\u77E5\u8FDC\u7AEF\u9519\u8BEF\u3002',\n action: '\u8BF7\u4FDD\u7559\u539F\u59CB\u9519\u8BEF\u4FE1\u606F\u540E\u7EE7\u7EED\u6392\u67E5\u3002',\n };\n }\n}\n\nasync function ensureServiceUsable(config: IAppConfig, deps: IDoctorDeps, configChanged: boolean): Promise<void> {\n const port = config.PORT ?? DEFAULT_CONFIG.PORT;\n const healthy = await deps.probeServiceHealth(port, 500);\n const occupied = await deps.isTcpPortOccupied(port, 500);\n const running = deps.isServiceRunning();\n\n if (healthy && !configChanged) {\n deps.io.info(`\u670D\u52A1\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7\uFF1Ahttp://127.0.0.1:${port}`);\n return;\n }\n\n if (occupied && !healthy && !running) {\n throw new Error(`\u7AEF\u53E3 ${port} \u5DF2\u88AB\u5176\u4ED6\u670D\u52A1\u5360\u7528\uFF0Cdoctor \u65E0\u6CD5\u81EA\u52A8\u542F\u52A8\u5F53\u524D\u670D\u52A1\u3002`);\n }\n\n if (running) {\n const info = deps.readServiceInfo();\n if (info) {\n try {\n deps.killProcess(info.pid);\n } catch {\n // ignore and rely on restart probe\n }\n }\n }\n\n await deps.startDaemon();\n const verified = await deps.waitForService(port, 5000);\n if (!verified) {\n throw new Error(`doctor \u81EA\u52A8\u542F\u52A8\u540E\u5065\u5EB7\u68C0\u67E5\u4ECD\u672A\u901A\u8FC7\uFF08\u7AEF\u53E3 ${port}\uFF09\u3002`);\n }\n deps.io.info(`\u670D\u52A1\u5DF2\u5C31\u7EEA\uFF1Ahttp://127.0.0.1:${port}`);\n}\n\nfunction createDefaultDeps(io = createConsoleIO()): IDoctorDeps {\n return {\n readLegacyConfig,\n backupCurrentConfig: backupConfigFile,\n writeConfig: writeConfigFile,\n isServiceRunning,\n readServiceInfo,\n killProcess,\n probeServiceHealth,\n isTcpPortOccupied,\n waitForService,\n io,\n startDaemon: async () => {\n spawn(process.execPath, [process.argv[1], 'start', '--daemon'], {\n detached: true,\n stdio: 'ignore',\n env: { ...process.env, CTR_DAEMON: '1' },\n }).unref();\n },\n };\n}\n\nexport async function runDoctorCli(customDeps?: Partial<IDoctorDeps>): Promise<void> {\n const defaults = createDefaultDeps(customDeps?.io);\n const deps = { ...defaults, ...customDeps } as IDoctorDeps;\n let configChanged = false;\n\n try {\n deps.io.info('\u5F00\u59CB\u8BCA\u65AD\u5F53\u524D Claude Trigger Router \u914D\u7F6E...');\n const current = loadCurrentConfig();\n current.messages.forEach((message) => deps.io.info(message));\n\n let workingConfig: Partial<IAppConfig> | undefined = current.config;\n if (!workingConfig) {\n const legacy = await deps.readLegacyConfig();\n if (legacy.kind === 'found') {\n deps.io.info('\u672A\u68C0\u6D4B\u5230\u5F53\u524D\u914D\u7F6E\uFF0C\u4F46\u53D1\u73B0\u65E7 claude-code-router \u914D\u7F6E\uFF0Cdoctor \u5C06\u5148\u5C1D\u8BD5\u8FC1\u79FB\u3002');\n const migrated = migrateLegacyConfig(legacy.config as any);\n workingConfig = {\n ...buildUsableMinimalTemplateConfig(),\n ...migrated.draft,\n };\n } else {\n throw new Error('\u672A\u68C0\u6D4B\u5230\u53EF\u8BCA\u65AD\u7684\u5F53\u524D\u914D\u7F6E\uFF1B\u8BF7\u5148\u8FD0\u884C ctr setup \u6216 ctr init --force\u3002');\n }\n }\n\n const deterministic = repairDeterministicConfig(workingConfig);\n workingConfig = deterministic.config;\n deterministic.changes.forEach((message) => deps.io.info(message));\n\n const completed = await completeMissingModelFields(workingConfig, deps.io);\n workingConfig = completed.config;\n completed.changes.forEach((message) => deps.io.info(message));\n\n const normalized = normalizeAndValidateConfig(workingConfig);\n if (normalized.errors.length > 0) {\n deps.io.error(`doctor \u4ECD\u53D1\u73B0\u65E0\u6CD5\u81EA\u52A8\u4FEE\u590D\u7684\u914D\u7F6E\u9519\u8BEF\uFF1A${normalized.errors.join('; ')}`);\n throw new Error('doctor could not fully repair config');\n }\n if (normalized.warnings.length > 0) {\n deps.io.info(`\u914D\u7F6E\u63D0\u793A\uFF1A${normalized.warnings.join('; ')}`);\n }\n\n const registry = buildModelRegistry(normalized.config);\n for (const model of normalized.config.Models ?? []) {\n const compiledModel = registry.modelMap[model.id];\n if (!compiledModel) {\n continue;\n }\n const compatibility = describeCompatibilityProfile(compiledModel.compatibilityProfile);\n const dispatch = describeDispatchFormat(compiledModel.dispatchFormat);\n deps.io.info(\n `\u6A21\u578B\u517C\u5BB9\u7B56\u7565\uFF1A${model.id} -> ${compatibility.label}`\n );\n deps.io.info(`\u517C\u5BB9\u8BF4\u660E\uFF1A${compatibility.summary}`);\n deps.io.info(`\u8BF7\u6C42\u7F16\u8BD1\uFF1A${dispatch.label}\u3002${dispatch.summary}`);\n const previewDiagnostics = collectCompatibilityPreviewDiagnostics(model);\n for (const diagnostic of previewDiagnostics) {\n deps.io.info(`\u8FD0\u884C\u65F6\u517C\u5BB9\u63D0\u793A\uFF1A${diagnostic.label}`);\n deps.io.info(`\u8FD0\u884C\u65F6\u8BF4\u660E\uFF1A${diagnostic.summary}`);\n deps.io.info(`\u8FD0\u884C\u65F6\u5EFA\u8BAE\uFF1A${diagnostic.action}`);\n }\n }\n\n const needWrite = current.repairedParse || deterministic.changes.length > 0 || completed.changes.length > 0 || !current.existed;\n if (needWrite) {\n if (current.existed) {\n const backupPath = await deps.backupCurrentConfig();\n if (backupPath) {\n deps.io.info(`\u5DF2\u5907\u4EFD\u5F53\u524D\u914D\u7F6E\uFF1A${backupPath}`);\n }\n }\n await deps.writeConfig(normalized.config);\n deps.io.info(`\u5DF2\u5199\u56DE\u4FEE\u590D\u540E\u7684\u914D\u7F6E\uFF1A${current.path}`);\n configChanged = true;\n }\n\n await ensureServiceUsable(normalized.config, deps, configChanged);\n\n const shouldProbeModels = hasArg('--check-models')\n ? await deps.io.confirm(`\u5373\u5C06\u5411 ${normalized.config.Models?.length ?? 0} \u4E2A\u6A21\u578B\u53D1\u9001\u6700\u5C0F\u63A2\u6D4B\u8BF7\u6C42\uFF0C\u53EF\u80FD\u6D88\u8017\u5C11\u91CF\u989D\u5EA6\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F`, true)\n : await deps.io.confirm(`\u662F\u5426\u7EE7\u7EED\u63A2\u6D4B ${normalized.config.Models?.length ?? 0} \u4E2A\u6A21\u578B\u7684\u53EF\u7528\u6027\uFF1F\u8FD9\u4F1A\u6D88\u8017\u5C11\u91CF\u989D\u5EA6\u3002`, false);\n\n if (!shouldProbeModels) {\n deps.io.info('\u5DF2\u8DF3\u8FC7\u6A21\u578B\u63A2\u6D4B\u3002\u914D\u7F6E\u548C\u670D\u52A1\u8BCA\u65AD\u5DF2\u5B8C\u6210\u3002');\n return;\n }\n\n let probeSuccess = 0;\n let probeFailure = 0;\n for (const model of normalized.config.Models ?? []) {\n const result = await probeModelAvailability(model);\n if (result.kind === 'success') {\n deps.io.info(`\u6A21\u578B\u63A2\u6D4B\u6210\u529F\uFF1A${model.id}`);\n probeSuccess += 1;\n continue;\n }\n\n const explanation = explainProbeFailure(result.category);\n probeFailure += 1;\n deps.io.error(`\u6A21\u578B\u63A2\u6D4B\u5931\u8D25\uFF1A${model.id} -> ${explanation.label}`);\n deps.io.info(`\u5931\u8D25\u8BF4\u660E\uFF1A${explanation.summary}`);\n deps.io.info(`\u5904\u7406\u5EFA\u8BAE\uFF1A${explanation.action}`);\n deps.io.info(`\u8FDC\u7AEF\u539F\u59CB\u4FE1\u606F\uFF1A${result.message}`);\n deps.io.info('\u8FD9\u7C7B\u8FDC\u7AEF\u5931\u8D25\u9700\u8981\u4F60\u786E\u8BA4\u5E76\u624B\u52A8\u5904\u7406\uFF1Bdoctor \u4E0D\u4F1A\u81EA\u52A8\u4FEE\u6539\u6A21\u578B\u8BED\u4E49\u6216\u8FDC\u7AEF\u8D26\u53F7\u914D\u7F6E\u3002');\n }\n\n deps.io.info(`\u6A21\u578B\u63A2\u6D4B\u5B8C\u6210\uFF1A\u6210\u529F ${probeSuccess}\uFF0C\u5931\u8D25 ${probeFailure}\u3002`);\n deps.io.info('doctor \u8BCA\u65AD\u5B8C\u6210\u3002');\n } finally {\n deps.io.close?.();\n }\n}\n", "/**\r\n * CLI Entry Point\r\n *\r\n * \u547D\u4EE4\u884C\u5165\u53E3\r\n */\r\n\r\nimport { spawn, spawnSync } from \"child_process\";\nimport { join } from \"path\";\nimport open from \"openurl\";\nimport { existsSync, readFileSync, mkdirSync, writeFileSync } from \"fs\";\nimport { run, initializeClaudeConfig } from \"./index\";\nimport { isServiceRunning, killProcess, readServiceInfo } from \"./utils/processCheck\";\nimport { CONFIG_DIR, CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from \"./constants\";\nimport { isTcpPortOccupied, waitForService } from \"./service-health\";\nimport { runSetupCli } from \"./setup\";\nimport { buildUsableMinimalTemplateConfig } from \"./setup/templates\";\nimport { runDoctorCli } from \"./doctor\";\n\r\nconst PACKAGE_JSON_PATH = join(__dirname, \"..\", \"package.json\");\nconst PACKAGE_PAGE_URL = \"https://www.npmjs.com/package/@peterwangze/claude-trigger-router\";\nconst PACKAGE_REGISTRY_LATEST_URL = \"https://registry.npmjs.org/@peterwangze%2Fclaude-trigger-router/latest\";\nconst PACKAGE_REGISTRY_URL = \"https://registry.npmjs.org/\";\n\r\nfunction getPackageInfo(): { name: string; version: string } {\r\n const content = readFileSync(PACKAGE_JSON_PATH, \"utf-8\");\r\n const pkg = JSON.parse(content) as { name?: string; version?: string };\r\n\r\n return {\r\n name: pkg.name ?? \"@peterwangze/claude-trigger-router\",\r\n version: pkg.version ?? \"unknown\",\r\n };\r\n}\r\n\r\nfunction getArgs(): string[] {\r\n return process.argv.slice(2);\r\n}\r\n\r\nfunction getCommand(): string | undefined {\r\n return getArgs()[0];\r\n}\r\n\r\nfunction hasArg(flag: string, shortFlag?: string): boolean {\r\n const args = getArgs();\r\n return args.includes(flag) || (shortFlag ? args.includes(shortFlag) : false);\r\n}\r\n\r\nfunction getArgValue(flag: string, shortFlag?: string): string | undefined {\n const args = getArgs();\n const index = args.indexOf(flag) !== -1 ? args.indexOf(flag) : shortFlag ? args.indexOf(shortFlag) : -1;\n return index !== -1 ? args[index + 1] : undefined;\n}\n\nfunction parsePortValue(portValue: string, sourceLabel: string): number {\n const trimmed = portValue.trim();\n if (!/^\\d+$/.test(trimmed)) {\n throw new Error(`${sourceLabel} \u4E0D\u662F\u5408\u6CD5\u7AEF\u53E3\uFF1A${portValue}`);\n }\n\n const port = Number.parseInt(trimmed, 10);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`${sourceLabel} \u8D85\u51FA\u5408\u6CD5\u8303\u56F4\uFF081-65535\uFF09\uFF1A${portValue}`);\n }\n\n return port;\n}\n\n/**\n * \u4ECE\u547D\u4EE4\u884C\u53C2\u6570\u6216\u914D\u7F6E\u6587\u4EF6\u4E2D\u83B7\u53D6\u7AEF\u53E3\u53F7\n */\nfunction getPort(): number {\n // \u4F18\u5148\u4F7F\u7528\u547D\u4EE4\u884C\u53C2\u6570\n const portValue = getArgValue(\"--port\", \"-p\");\n if (portValue) {\n return parsePortValue(portValue, \"\u547D\u4EE4\u884C\u7AEF\u53E3\u53C2\u6570\");\n }\n\r\n // \u5C1D\u8BD5\u4ECE\u914D\u7F6E\u6587\u4EF6\u8BFB\u53D6\uFF08\u987A\u5E8F\uFF1Aconfig.yaml \u2192 config.yml \u2192 config.json\uFF09\r\n try {\r\n const yaml = require(\"js-yaml\");\r\n if (existsSync(CONFIG_FILE)) {\r\n const content = readFileSync(CONFIG_FILE, \"utf-8\");\r\n const config = yaml.load(content) as any;\r\n if (config?.PORT) return config.PORT;\r\n } else if (existsSync(CONFIG_FILE_YML)) {\r\n const content = readFileSync(CONFIG_FILE_YML, \"utf-8\");\r\n const config = yaml.load(content) as any;\r\n if (config?.PORT) return config.PORT;\r\n } else if (existsSync(CONFIG_FILE_JSON)) {\r\n const content = readFileSync(CONFIG_FILE_JSON, \"utf-8\");\r\n const config = JSON.parse(content);\r\n if (config?.PORT) return config.PORT;\r\n }\r\n } catch {\r\n // \u914D\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C\r\n }\r\n\r\n return DEFAULT_CONFIG.PORT;\r\n}\r\n\r\n/**\r\n * \u68C0\u67E5\u547D\u4EE4\u884C\u53C2\u6570\u4E2D\u662F\u5426\u5305\u542B daemon \u6807\u5FD7\r\n */\r\nfunction isDaemonMode(): boolean {\r\n return hasArg(\"--daemon\", \"-d\");\r\n}\r\n\r\n/**\r\n * \u6253\u5370\u5E2E\u52A9\u4FE1\u606F\r\n */\r\nexport function printHelp() {\n console.log(`\nClaude Trigger Router - \u667A\u80FD\u89E6\u53D1\u8DEF\u7531\u5668\n\r\n\u7528\u6CD5\uFF1Actr <\u547D\u4EE4> [\u9009\u9879]\r\n\r\n\u547D\u4EE4\uFF1A\n setup \u68C0\u6D4B\u5E76\u590D\u7528\u5DF2\u6709\u914D\u7F6E\uFF0C\u5FC5\u8981\u65F6\u8FC1\u79FB\u65E7\u914D\u7F6E\u6216\u65B0\u5EFA\u6700\u5C0F\u914D\u7F6E\n doctor \u8BCA\u65AD\u5E76\u4FEE\u590D\u5F53\u524D\u914D\u7F6E\uFF0C\u6309\u9700\u63A2\u6D4B\u6A21\u578B\u53EF\u7528\u6027\n init \u521D\u59CB\u5316\u6700\u5C0F\u914D\u7F6E\u6A21\u677F\n start \u542F\u52A8\u8DEF\u7531\u670D\u52A1\uFF08\u9ED8\u8BA4\u524D\u53F0\u8FD0\u884C\uFF09\n stop \u505C\u6B62\u540E\u53F0\u670D\u52A1\n restart \u91CD\u542F\u540E\u53F0\u670D\u52A1\n status \u67E5\u770B\u670D\u52A1\u8FD0\u884C\u72B6\u6001\uFF08PID\u3001\u7AEF\u53E3\u3001\u542F\u52A8\u65F6\u95F4\uFF09\n version \u67E5\u770B\u5F53\u524D\u5B89\u88C5\u7248\u672C\u4E0E\u5305\u4FE1\u606F\n upgrade \u67E5\u770B\u5347\u7EA7\u5230\u6700\u65B0 npm \u7248\u672C\u7684\u6307\u5F15\n code \u901A\u8FC7\u8DEF\u7531\u5668\u8FD0\u884C Claude Code\uFF08\u9700\u5148\u542F\u52A8\u670D\u52A1\uFF09\n ui \u6253\u5F00\u672C\u5730\u7BA1\u7406\u9875\uFF08\u914D\u7F6E\u9884\u89C8\u4E0E\u8C03\u8BD5\uFF09\n help \u663E\u793A\u6B64\u5E2E\u52A9\u4FE1\u606F\n\r\n\u9009\u9879\uFF1A\r\n --port, -p \u6307\u5B9A\u76D1\u542C\u7AEF\u53E3\uFF08\u9ED8\u8BA4\uFF1A5678\uFF09\r\n --daemon, -d \u4EE5\u540E\u53F0\u65B9\u5F0F\u8FD0\u884C\uFF08\u914D\u5408 start/restart \u4F7F\u7528\uFF09\r\n --force \u5F3A\u5236\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\uFF08\u914D\u5408 init \u4F7F\u7528\uFF09\r\n\r\n\u4F7F\u7528\u793A\u4F8B\uFF1A\r\n ctr setup # \u590D\u7528\u5F53\u524D\u914D\u7F6E / \u8FC1\u79FB\u65E7\u914D\u7F6E / \u65B0\u5EFA\u6700\u5C0F\u914D\u7F6E\n ctr doctor # \u8BCA\u65AD\u914D\u7F6E / \u4FEE\u590D\u683C\u5F0F\u95EE\u9898 / \u6309\u9700\u63A2\u6D4B\u6A21\u578B\u53EF\u7528\u6027\n ctr init # \u521D\u59CB\u5316\u6700\u5C0F\u914D\u7F6E\u6A21\u677F\n ctr version # \u67E5\u770B\u5F53\u524D\u5B89\u88C5\u7248\u672C\r\n ctr upgrade # \u67E5\u770B\u5347\u7EA7\u5230\u6700\u65B0\u7248\u672C\u7684\u547D\u4EE4\r\n ctr start # \u524D\u53F0\u542F\u52A8\uFF08\u63A8\u8350\u9996\u6B21\u4F7F\u7528\uFF0C\u4FBF\u4E8E\u67E5\u770B\u65E5\u5FD7\uFF09\n ctr start --daemon # \u540E\u53F0\u542F\u52A8\n ctr status # \u67E5\u770B\u670D\u52A1\u72B6\u6001\n ctr code # \u542F\u52A8 Claude Code\uFF08\u9700\u5148\u8FD0\u884C ctr start\uFF09\n ctr ui # \u6253\u5F00\u672C\u5730\u7BA1\u7406\u9875\uFF08\u53EF\u9009\uFF09\n ctr stop # \u505C\u6B62\u540E\u53F0\u670D\u52A1\n ctr restart --daemon # \u91CD\u542F\u540E\u53F0\u670D\u52A1\n\r\n\u914D\u7F6E\u6587\u4EF6\uFF1A\n ${CONFIG_FILE}\n ${CONFIG_FILE_JSON}\n\n\u914D\u7F6E\u76EE\u5F55\uFF1A${CONFIG_DIR}\n\n\u8865\u5145\u8BF4\u660E\uFF1A\n ctr restart \u5F53\u524D\u9ED8\u8BA4\u6309\u540E\u53F0\u6A21\u5F0F\u91CD\u542F\uFF1B\u53EF\u5199 ctr restart \u6216 ctr restart --daemon\n\n\u66F4\u591A\u4FE1\u606F\uFF1Ahttps://github.com/peterwangze/claude-trigger-router\n`);\n}\n\r\nfunction getLatestPackageVersionViaNpm(packageName: string, timeoutMs = 5000): string | null {\n try {\n const result = spawnSync(\"npm\", [\"view\", packageName, \"version\", \"--registry\", PACKAGE_REGISTRY_URL], {\n encoding: \"utf-8\",\n timeout: timeoutMs,\n shell: process.platform === \"win32\",\n });\n\n if (result.status !== 0) {\n return null;\n }\n\n const value = result.stdout?.trim();\n return value ? value : null;\n } catch {\n return null;\n }\n}\n\nasync function getLatestPackageVersion(packageName: string, timeoutMs = 4000): Promise<string | null> {\n try {\n const response = await fetch(PACKAGE_REGISTRY_LATEST_URL, {\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\r\n return null;\r\n }\r\n\n const payload = await response.json() as { version?: unknown };\n if (typeof payload.version === \"string\") {\n return payload.version;\n }\n } catch {\n // Fall through to npm CLI lookup.\n }\n\n return getLatestPackageVersionViaNpm(packageName);\n}\n\r\nfunction isNewerVersion(current: string, latest: string): boolean {\r\n const currentParts = current.split(\".\").map((part) => Number.parseInt(part, 10));\r\n const latestParts = latest.split(\".\").map((part) => Number.parseInt(part, 10));\r\n const length = Math.max(currentParts.length, latestParts.length);\r\n\r\n for (let index = 0; index < length; index += 1) {\r\n const currentValue = Number.isFinite(currentParts[index]) ? currentParts[index] : 0;\r\n const latestValue = Number.isFinite(latestParts[index]) ? latestParts[index] : 0;\r\n\r\n if (latestValue > currentValue) {\r\n return true;\r\n }\r\n\r\n if (latestValue < currentValue) {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nasync function printVersion() {\n const pkg = getPackageInfo();\n const latestVersion = await getLatestPackageVersion(pkg.name);\n\r\n console.log(`Package: ${pkg.name}`);\r\n console.log(`Version: ${pkg.version}`);\r\n console.log(`Latest: ${latestVersion ?? \"unavailable\"}`);\r\n if (latestVersion && isNewerVersion(pkg.version, latestVersion)) {\r\n console.log(`Upgrade: npm install -g ${pkg.name}@latest`);\r\n }\r\n console.log(`NPM: ${PACKAGE_PAGE_URL}`);\r\n}\r\n\r\nfunction printUpgradeGuidance() {\n const pkg = getPackageInfo();\r\n\r\n console.log(`\u5F53\u524D\u5B89\u88C5\u7248\u672C\uFF1A${pkg.version}`);\r\n console.log(`\u5305\u540D\uFF1A${pkg.name}`);\r\n console.log(\"\u5347\u7EA7\u5230\u6700\u65B0\u7248\u672C\uFF1A\");\r\n console.log(` npm install -g ${pkg.name}@latest`);\r\n console.log(\"\u8BF7\u5728\u5F53\u524D ctr \u8FDB\u7A0B\u5916\u6267\u884C\u5347\u7EA7\u547D\u4EE4\uFF0C\u907F\u514D\u81EA\u5347\u7EA7\u65F6\u5360\u7528\u5F53\u524D\u6587\u4EF6\u3002\");\r\n console.log(\"\u5982\u679C\u4F60\u6700\u521D\u662F\u901A\u8FC7 GitHub \u6E90\u5B89\u88C5\uFF0C\u8BF7\u7EE7\u7EED\u4F7F\u7528\u539F\u5B89\u88C5\u6765\u6E90\uFF0C\u5F53\u524D\u547D\u4EE4\u4E0D\u4F1A\u81EA\u52A8\u5207\u6362\u6765\u6E90\u3002\");\r\n console.log(\"\u5168\u5C40\u5B89\u88C5\u5728\u67D0\u4E9B\u73AF\u5883\u4E0B\u53EF\u80FD\u9700\u8981\u7BA1\u7406\u5458/root \u6743\u9650\u3002\");\n console.log(`NPM: ${PACKAGE_PAGE_URL}`);\n}\n\nfunction printRestartGuidanceHint() {\n console.log(\"\u8BF4\u660E\uFF1A`ctr restart` \u5F53\u524D\u9ED8\u8BA4\u6309\u540E\u53F0\u6A21\u5F0F\u91CD\u542F\u670D\u52A1\uFF0C`--daemon` \u53EA\u662F\u663E\u5F0F\u5199\u6CD5\u3002\");\n}\n\nfunction isClaudeCommandAvailable(timeoutMs = 3000): boolean {\n try {\n const result = spawnSync(\"claude\", [\"--version\"], {\n encoding: \"utf-8\",\n timeout: timeoutMs,\n stdio: \"ignore\",\n shell: process.platform === \"win32\",\n });\n\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\r\n/**\r\n * \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6\r\n */\r\nfunction initConfig() {\n const force = hasArg(\"--force\");\n\r\n const existingConfig = [CONFIG_FILE, CONFIG_FILE_YML, CONFIG_FILE_JSON].find(existsSync);\r\n if (existingConfig && !force) {\r\n console.log(`\u26A0\uFE0F \u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A${existingConfig}`);\r\n console.log(\" \u5982\u9700\u8986\u76D6\uFF0C\u8BF7\u4F7F\u7528 --force \u53C2\u6570\u3002\");\r\n return;\r\n }\r\n\r\n // \u786E\u4FDD\u914D\u7F6E\u76EE\u5F55\u5B58\u5728\r\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n\n try {\n const yaml = require(\"js-yaml\");\n const templateConfig = buildUsableMinimalTemplateConfig();\n const content = yaml.dump(templateConfig, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n });\n writeFileSync(CONFIG_FILE, content, \"utf-8\");\n const action = force ? \"\u5DF2\u8986\u76D6\" : \"\u5DF2\u521B\u5EFA\";\n console.log(`\u2705 \u914D\u7F6E\u6587\u4EF6${action}\uFF1A${CONFIG_FILE}`);\n console.log(\"\");\r\n console.log(\"\u4E0B\u4E00\u6B65\uFF1A\");\r\n console.log(\" 1. \u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\uFF0C\u586B\u5165\u4F60\u7684 API \u5BC6\u94A5\");\r\n console.log(\" 2. \u5728 'Models' \u4E0B\u8865\u5168\u4F60\u7684\u6A21\u578B\u63A5\u5165\u4FE1\u606F\");\r\n console.log(\" 3. \u5C06 'Router.default' \u8BBE\u7F6E\u4E3A\u9ED8\u8BA4\u6A21\u578B ID\");\r\n console.log(\" 4. \u5982\u9700\u9AD8\u7EA7\u8DEF\u7531\uFF0C\u518D\u7EE7\u7EED\u914D\u7F6E\u89C4\u5219\u6216\u667A\u80FD\u8DEF\u7531\");\r\n console.log(` 5. \u8FD0\u884C\uFF1Actr start`);\r\n } catch (error: any) {\r\n console.error(\"\u274C \u521B\u5EFA\u914D\u7F6E\u6587\u4EF6\u5931\u8D25:\", error.message);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * \u4EE5\u524D\u53F0\u65B9\u5F0F\u542F\u52A8\u670D\u52A1\r\n */\r\nasync function startForeground(port?: number) {\n const targetPort = port ?? getPort();\n const healthy = await waitForService(targetPort, 500);\n const occupied = await isTcpPortOccupied(targetPort, 500);\n if (healthy && occupied && isServiceRunning()) {\n console.log(`\u2705 Service is already running on port ${targetPort}.`);\n console.log(\" Use 'ctr status' to inspect it or 'ctr stop' before starting again.\");\n return;\n }\n if (!healthy && occupied && !isServiceRunning()) {\n console.error(`\u274C Port ${targetPort} is already occupied by another service.`);\n process.exit(1);\n }\n\n console.log(\"\uD83D\uDE80 Starting Claude Trigger Router (foreground)...\");\n console.log(\" Press Ctrl+C to stop\");\n\n try {\n await run({ port: targetPort });\n } catch (error: any) {\n if (error.message?.includes(\"Invalid configuration\")) {\r\n console.error(\"\\n\u274C Configuration error. Run 'ctr init' to create a config file.\");\r\n } else {\r\n console.error(\"\u274C Failed to start service:\", error.message);\r\n }\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * \u4EE5\u540E\u53F0\uFF08daemon\uFF09\u65B9\u5F0F\u542F\u52A8\u670D\u52A1\r\n */\r\nasync function startDaemon(port?: number) {\n const targetPort = port ?? getPort();\n const healthy = await waitForService(targetPort, 500);\n const occupied = await isTcpPortOccupied(targetPort, 500);\n if (!healthy && occupied && !isServiceRunning()) {\n console.log(`\u274C Port ${targetPort} is already occupied by another service.`);\n return;\n }\n\n if (isServiceRunning()) {\n console.log(\"\u2705 Service is already running in the background.\");\n return;\n }\r\n\r\n const nodeExec = process.execPath;\r\n const scriptPath = process.argv[1];\r\n\r\n // \u6784\u9020\u4E0D\u542B --daemon \u7684\u53C2\u6570\r\n const childArgs = [scriptPath, \"start\"];\r\n if (port) {\r\n childArgs.push(\"--port\", String(port));\r\n }\r\n\r\n const child = spawn(nodeExec, childArgs, {\n detached: true,\n stdio: \"ignore\",\n env: { ...process.env, CTR_DAEMON: \"1\" },\n });\n\n child.unref();\n\n const startConfirmed = await new Promise<boolean>((resolve, reject) => {\n let settled = false;\n const deadline = Date.now() + 5000;\n\n const finish = (value: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(value);\n };\n\n child.once(\"error\", reject);\n child.once(\"exit\", () => finish(false));\n\n const poll = () => {\n if (settled) {\n return;\n }\n if (isServiceRunning()) {\n finish(true);\n return;\n }\n if (Date.now() >= deadline) {\n finish(false);\n return;\n }\n setTimeout(poll, 250);\n };\n\n poll();\n });\n\n if (!startConfirmed) {\n console.error(`\u274C Service failed to start in background (port: ${targetPort}).`);\n console.error(\" Run 'ctr start' (without --daemon) to inspect the startup error.\");\n process.exit(1);\n }\n\n console.log(`\u2705 Service started in background (port: ${targetPort})`);\n console.log(` Run 'ctr stop' to stop it.`);\n}\n\r\n/**\r\n * \u663E\u793A\u670D\u52A1\u72B6\u6001\r\n */\r\nasync function showStatus() {\n const info = readServiceInfo();\n if (!info || !isServiceRunning()) {\n const targetPort = getPort();\n const healthy = await waitForService(targetPort, 500);\n const occupied = await isTcpPortOccupied(targetPort, 500);\n if (!healthy && occupied) {\n console.log(`\u26A0\uFE0F \u7AEF\u53E3 ${targetPort} \u5DF2\u88AB\u5176\u4ED6\u670D\u52A1\u5360\u7528\uFF0C\u5F53\u524D\u4E0D\u662F claude-trigger-router\u3002`);\n return;\n }\n console.log(\"\u23F9 \u670D\u52A1\u672A\u8FD0\u884C\");\n return;\n }\n const startTime = info.startTime ? new Date(info.startTime).toLocaleString() : \"\u672A\u77E5\";\r\n console.log(\"\u2705 \u670D\u52A1\u8FD0\u884C\u4E2D\");\r\n console.log(` PID\uFF1A${info.pid}`);\r\n console.log(` \u7AEF\u53E3\uFF1A${info.port}`);\r\n console.log(` \u542F\u52A8\u65F6\u95F4\uFF1A${startTime}`);\r\n console.log(` \u63A5\u5165\u5730\u5740\uFF1Ahttp://127.0.0.1:${info.port}`);\r\n}\r\n\r\n/**\r\n * \u505C\u6B62\u670D\u52A1\r\n */\r\nfunction stopService() {\r\n const info = readServiceInfo();\r\n if (!info || !isServiceRunning()) {\r\n console.log(\"\u26A0\uFE0F \u672A\u53D1\u73B0\u8FD0\u884C\u4E2D\u7684\u670D\u52A1\u3002\");\r\n return;\r\n }\r\n\r\n try {\r\n console.log(`\uD83D\uDED1 \u6B63\u5728\u505C\u6B62\u670D\u52A1\uFF08PID: ${info.pid}\uFF0C\u7AEF\u53E3: ${info.port}\uFF09...`);\r\n killProcess(info.pid);\r\n console.log(\"\u2705 \u670D\u52A1\u5DF2\u505C\u6B62\u3002\");\r\n } catch (error: any) {\r\n console.error(\"\u274C \u505C\u6B62\u670D\u52A1\u5931\u8D25:\", error.message);\r\n }\r\n}\r\n\r\n/**\r\n * \u91CD\u542F\u670D\u52A1\uFF08daemon \u6A21\u5F0F\uFF09\r\n */\r\nasync function restartService() {\n stopService();\n await new Promise((resolve) => setTimeout(resolve, 1500));\n await startDaemon(getPort());\n}\n\r\n/**\r\n * \u8FD0\u884C Claude Code\r\n */\r\nexport async function runClaudeCode() {\n const port = getPort();\n\r\n // \u786E\u4FDD ~/.claude.json \u5B58\u5728\uFF08\u8DF3\u8FC7 Claude Code \u9996\u6B21\u5F15\u5BFC\u6D41\u7A0B\uFF09\r\n // \u4EC5\u5728\u6B64\u5904\u6267\u884C\uFF0C\u907F\u514D\u5728 ctr start \u65F6\u4EA7\u751F\u4E0D\u5FC5\u8981\u7684\u5168\u5C40\u526F\u4F5C\u7528\r\n await initializeClaudeConfig();\r\n\r\n // \u5148\u770B\u672C\u5730\u5143\u6570\u636E\uFF0C\u518D\u7528\u5065\u5EB7\u68C0\u67E5\u786E\u8BA4\u5F53\u524D\u7AEF\u53E3\u4E0A\u786E\u5B9E\u662F\u672C\u670D\u52A1\r\n const running = isServiceRunning();\r\n console.log(`\uD83D\uDD0D Checking if service is available on port ${port}...`);\r\n const reachable = await waitForService(port, 2000);\r\n\r\n if (!reachable) {\n console.log(`\u26A0\uFE0F Trigger Router service is not running on port ${port}.`);\n console.log(\"\");\n console.log(\"Options:\");\n console.log(\" 1. Start service first: ctr start --daemon\");\n console.log(\" 2. Or start interactively in another terminal: ctr start\");\n console.log(\"\");\n process.exit(1);\n }\n\n console.log(`\uD83D\uDE80 Starting Claude Code with Trigger Router (port: ${port})...`);\n if (!isClaudeCommandAvailable()) {\n console.error(\"\u274C \u672A\u68C0\u6D4B\u5230 Claude Code CLI\u3002\");\n console.log(\" \u8BF7\u5148\u5B89\u88C5\uFF1Anpm install -g @anthropic-ai/claude-code\");\n process.exit(1);\n }\n\n // \u542F\u52A8 Claude Code\uFF08Windows \u4E0A npm \u5168\u5C40\u547D\u4EE4\u4E3A .cmd shim\uFF0C\u9700\u8981 shell: true\uFF09\n const isWindows = process.platform === \"win32\";\n const claude = spawn(\"claude\", [], {\n stdio: \"inherit\",\n shell: isWindows,\n env: {\n ...process.env,\n ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}`,\n ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY || \"ctr-local-proxy\",\n },\n });\n\r\n claude.on(\"error\", (error) => {\r\n console.error(\"\u274C \u542F\u52A8 Claude Code \u5931\u8D25:\", error.message);\r\n console.log(\" \u8BF7\u786E\u8BA4 Claude Code \u5DF2\u5168\u5C40\u5B89\u88C5\uFF1Anpm install -g @anthropic-ai/claude-code\");\r\n if (isWindows) {\r\n console.log(\" Windows \u7528\u6237\u8BF7\u786E\u8BA4\u5728 PowerShell \u6216 CMD \u4E2D\u8FD0\u884C\uFF0C\u800C\u975E Git Bash\");\r\n }\r\n });\r\n\r\n claude.on(\"exit\", (code) => {\r\n process.exit(code || 0);\r\n });\r\n}\r\n\r\n/**\r\n * \u6253\u5F00 Web UI\r\n */\r\nasync function openUI() {\n const port = getPort();\n const url = `http://127.0.0.1:${port}/ui`;\n const healthy = await waitForService(port, 800);\n\n console.log(`\uD83C\uDF10 Opening UI at ${url}`);\n if (!healthy) {\n console.log(\"\u26A0\uFE0F \u5F53\u524D UI \u670D\u52A1\u672A\u5C31\u7EEA\uFF1B\u5982\u679C\u9875\u9762\u65E0\u6CD5\u6253\u5F00\uFF0C\u8BF7\u5148\u8FD0\u884C ctr start \u6216 ctr start --daemon\u3002\");\n }\n\n if (process.env.CTR_UI_SKIP_OPEN === \"1\") {\n console.log(\" Browser launch skipped by CTR_UI_SKIP_OPEN=1\");\n return;\n }\n\n try {\n open(url);\n } catch (error: any) {\n console.log(` Please open ${url} in your browser`);\n }\r\n}\r\n\r\n/**\r\n * \u4E3B\u51FD\u6570\r\n */\r\nexport async function main() {\r\n const command = getCommand();\r\n\r\n switch (command) {\r\n case \"setup\":\n await runSetupCli();\n break;\n\n case \"doctor\":\n await runDoctorCli();\n break;\n\r\n case \"init\":\r\n initConfig();\r\n break;\r\n\r\n case \"start\":\n if (isDaemonMode()) {\n await startDaemon(getPort());\n } else {\n await startForeground(getPort());\n }\n break;\r\n\r\n case \"stop\":\r\n stopService();\r\n break;\r\n\r\n case \"status\":\n await showStatus();\n break;\n\r\n case \"version\":\r\n await printVersion();\r\n break;\r\n\r\n case \"upgrade\":\n printUpgradeGuidance();\n break;\n\n case \"restart\":\n printRestartGuidanceHint();\n await restartService();\n break;\n\r\n case \"code\":\r\n await runClaudeCode();\r\n break;\r\n\r\n case \"ui\":\n await openUI();\n break;\n\r\n case \"help\":\r\n case \"--help\":\r\n case \"-h\":\r\n printHelp();\r\n break;\r\n\r\n default:\r\n if (command) {\r\n console.log(`Unknown command: ${command}`);\r\n }\r\n printHelp();\r\n process.exit(command ? 1 : 0);\r\n }\r\n}\r\n\r\nif (process.env.CTR_SKIP_MAIN !== \"1\") {\r\n main().catch((error) => {\r\n console.error(\"Error:\", error);\r\n process.exit(1);\r\n });\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["DEFAULT_CONFIG", "providers", "modelMap", "router", "DEFAULT_CONFIG", "import_path", "input", "import_fs", "import_path", "import_lru_cache", "input", "input", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "import_lru_cache", "event", "output", "input", "import_fs", "import_path", "Server", "spawn", "join", "event", "DEFAULT_CONFIG", "import_fs", "event", "output", "import_lru_cache", "init_types", "import_lru_cache", "import_lru_cache", "DEFAULT_CONFIG", "import_lru_cache", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "init_types", "DEFAULT_CONFIG", "input", "input", "JSON5", "done", "import_fs", "import_promises", "import_os", "import_path", "input", "input", "log", "getProviderPreset", "input", "DEFAULT_CONFIG", "input", "input", "input", "output", "input", "yaml", "DEFAULT_CONFIG", "JSON5", "import_fs", "import_net", "import_os", "import_path", "import_promises", "import_json5", "init_setup", "createConsoleIO", "output", "index", "input", "JSON5", "yaml", "DEFAULT_CONFIG", "createDefaultDeps", "import_fs", "import_promises", "import_process", "import_child_process", "import_json5", "import_js_yaml", "init_setup", "hasArg", "yaml", "DEFAULT_CONFIG", "initConfig", "open", "import_child_process", "import_path", "import_fs", "init_setup"]
|
|
7
7
|
}
|