@peterwangze/claude-trigger-router 1.0.0 → 1.0.1
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/dist/cli.js +0 -1
- 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/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: 3456,\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 interface ICompiledModelRef {\n id: string;\n providerName: string;\n modelName: string;\n interface?: 'openai' | 'anthropic';\n protocol: 'openai' | 'anthropic';\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 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 result[item.id] = {\n id: item.id,\n providerName: `model__${item.id}`,\n modelName: item.model,\n interface: modelInterface,\n protocol: modelInterface,\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 result[`${provider.name},${model}`] = {\n id: `${provider.name},${model}`,\n providerName: provider.name,\n modelName: model,\n interface: 'openai',\n protocol: 'openai',\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,\r\n CONFIG_FILE_JSON,\r\n CONFIG_FILE_YML,\r\n DEFAULT_CONFIG,\n DEFAULT_GOVERNANCE_CONFIG,\n DEFAULT_TRIGGER_CONFIG,\n DEFAULT_SMART_ROUTER_CONFIG,\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> {\r\n if (!existsSync(CONFIG_DIR)) {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n }\r\n}\r\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(\r\n ref: string,\r\n providers: IAppConfig['Providers'],\r\n fieldName: string\r\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 }\r\n return null;\r\n}\r\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) {\r\n if (ref) {\r\n const err = validateModelRef(ref, validProviders, field);\r\n if (err) errors.push(err);\r\n }\r\n }\r\n }\r\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) {\r\n errors.push('TriggerRouter.intent_model is required when llm_intent_recognition is enabled');\r\n } else if (config.TriggerRouter.intent_model && validProviders.length > 0) {\r\n const err = validateModelRef(config.TriggerRouter.intent_model, validProviders, 'TriggerRouter.intent_model');\r\n if (err) errors.push(err);\r\n }\r\n\r\n if (config.TriggerRouter.rules) {\r\n config.TriggerRouter.rules.forEach((rule, index) => {\r\n if (!rule.name) {\r\n errors.push(`TriggerRouter.rules[${index}].name is required`);\r\n }\r\n if (!rule.model) {\r\n errors.push(`TriggerRouter.rules[${index}].model is required`);\r\n } else if (validProviders.length > 0) {\r\n const err = validateModelRef(rule.model, validProviders, `TriggerRouter.rules[${index}].model`);\r\n if (err) errors.push(err);\r\n }\r\n if (!rule.patterns || rule.patterns.length === 0) {\r\n errors.push(`TriggerRouter.rules[${index}].patterns must be a non-empty array`);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // \u9A8C\u8BC1 SmartRouter \u914D\u7F6E\n if (config.SmartRouter?.enabled) {\n if (!config.SmartRouter.router_model) {\r\n errors.push('SmartRouter.router_model is required when SmartRouter is enabled');\r\n } else if (validProviders.length > 0) {\r\n const err = validateModelRef(config.SmartRouter.router_model, validProviders, 'SmartRouter.router_model');\r\n if (err) errors.push(err);\r\n }\r\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) {\r\n errors.push(`SmartRouter.candidates[${index}].model is required`);\r\n } else if (validProviders.length > 0) {\r\n const err = validateModelRef(candidate.model, validProviders, `SmartRouter.candidates[${index}].model`);\r\n if (err) errors.push(err);\r\n }\r\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\r\nexport function normalizeAndValidateConfig(config: Partial<IAppConfig> = {}): {\n config: IAppConfig;\n errors: string[];\n warnings: string[];\n} {\n const normalizedConfig = deepMerge(\r\n {\r\n ...DEFAULT_CONFIG,\r\n Router: {\n default: '',\n },\n Providers: [],\n SmartRouter: DEFAULT_SMART_ROUTER_CONFIG,\n },\r\n config\r\n ) as IAppConfig;\r\n\r\n if (config.TriggerRouter) {\n normalizedConfig.TriggerRouter = deepMerge(DEFAULT_TRIGGER_CONFIG, config.TriggerRouter) as IAppConfig['TriggerRouter'];\n }\n\n if (config.Governance) {\n normalizedConfig.Governance = deepMerge(DEFAULT_GOVERNANCE_CONFIG, config.Governance) as IAppConfig['Governance'];\n }\n\n if (config.Models) {\n normalizedConfig.Models = config.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", "export const SERVICE_NAME = 'claude-trigger-router';\r\nexport const SERVICE_HEALTH_PATH = '/api/health';\r\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> {\r\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}\r\n\r\nexport async function waitForService(port: number, timeoutMs = 5000): Promise<boolean> {\r\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 [{ type: 'image', source: item.source ?? item.image_url ?? item.url }];\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\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) => item?.type === 'text' && typeof item.text === 'string' ? [item.text] : [])\n : [];\n\n const messages = Array.isArray(input.messages)\n ? input.messages\n .filter((item) => item?.role)\n .map((item) => ({\n role: item.role,\n parts: normalizeContentParts(item.content),\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 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;\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 { 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 = 3456,\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 { 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\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 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 = 3456,\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 { 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 = 3456,\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 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>Thinking</th><th>Capabilities</th><th>Source</th></tr></thead>` +\n `<tbody><tr><td colspan=\"6\" 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><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=\"6\" 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 { 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\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 ?? 3456,\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: 3456, 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\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' | 'sticky' | 'smart_router' | 'intent';\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}\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\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 { 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 = 3456,\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';\nimport { ISmartRouterConfig } from './types';\nimport { logError, logWarn } from '../utils/log';\nimport { createSingleUserTextIR } from '../protocols/message-ir';\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\n\r\n/**\r\n * SmartRouter \u9009\u62E9\u7ED3\u679C\r\n */\r\nexport interface ISmartRouterResult {\r\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;\r\n}\r\n\r\n/**\r\n * SmartRouter Prompt \u6A21\u677F\r\n */\r\nconst SMART_ROUTER_PROMPT = `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.\r\n\r\nUser request:\r\n\"\"\"\r\n{request}\r\n\"\"\"\r\n\r\nAvailable models:\r\n{candidates}\r\n\r\nSelect the most appropriate model and respond in the following JSON format ONLY:\r\n{\r\n \"model\": \"<exact model identifier from the list>\",\r\n \"confidence\": <0.0-1.0>,\r\n \"reasoning\": \"<brief explanation>\"\r\n}\r\n\r\nImportant:\r\n- The \"model\" field MUST be one of the exact identifiers listed above\r\n- Respond ONLY with the JSON, no additional text`;\r\n\r\n/**\r\n * \u667A\u80FD\u8DEF\u7531\u9009\u62E9\u5668\u7C7B\r\n */\r\nexport class SmartRouterSelector {\r\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']): string {\r\n return SMART_ROUTER_PROMPT\r\n .replace('{request}', text)\r\n .replace('{candidates}', this.buildCandidatesList(candidates));\r\n }\r\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 3456\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(\r\n text: string,\r\n config: ISmartRouterConfig,\r\n port: number = 3456,\r\n fetchFn?: typeof fetch,\r\n apiKey?: string,\r\n timeoutMs?: number\r\n ): Promise<ISmartRouterResult | null> {\r\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);\r\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 ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: config.router_model,\n max_tokens: config.max_tokens ?? 256,\n ir: createSingleUserTextIR(prompt),\n })\n ),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\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';\nimport { contextAnalyzer } from './analyzer';\nimport { intentDetector } from './intent';\nimport { smartRouterSelector } from './smart-router';\nimport { log, logError } from '../utils/log';\nimport { IGovernanceConfig } from '../governance/types';\nimport { createTaskFingerprint, sessionStateStore } from '../governance/session-store';\nimport { semanticRouter } from '../governance/semantic-router';\nimport { resolveModelReference } from '../models/compile';\n\r\n/**\r\n * \u6A21\u578B\u9009\u62E9\u5668\u7C7B\r\n */\r\nexport class ModelSelector {\r\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 = 3456,\n smartRouterConfig?: ISmartRouterConfig,\n governanceConfig?: IGovernanceConfig,\n apiKey?: string,\n timeoutMs?: number\n ): Promise<IAnalysisResult> {\n const startTime = Date.now();\n const appConfig = (req as any).appConfig as IAppConfig | undefined;\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\r\n const matchResult = this.matchRuleFromText(text, config.rules);\r\n\r\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, // \u5173\u952E\u8BCD\u5339\u914D\u7F6E\u4FE1\u5EA6\u4E3A 1\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'trigger_rule',\n };\n }\n\n // \u7B2C\u4E8C\u6B65\uFF1ASticky routing\uFF0C\u4F18\u5148\u590D\u7528\u540C\u4F1A\u8BDD\u540C\u4EFB\u52A1\u7684\u6700\u8FD1\u7A33\u5B9A\u6A21\u578B\n if (governanceConfig?.enabled && governanceConfig.sticky?.enabled && req.sessionId) {\n const fingerprint = createTaskFingerprint(text);\n const sessionState = sessionStateStore.get(req.sessionId);\n\n if (\n fingerprint &&\n sessionState?.lastTaskFingerprint === fingerprint &&\n (sessionState.preferredModel || sessionState.lastSuccessfulModel)\n ) {\n const stickyModel = sessionState.preferredModel || sessionState.lastSuccessfulModel;\n if (stickyModel) {\n log(`[StickyRouting] Reusing model \"${stickyModel}\" for session \"${req.sessionId}\"`);\n return {\n matched: true,\n model: appConfig ? resolveModelReference(appConfig, stickyModel) ?? stickyModel : stickyModel,\n confidence: 0.95,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'sticky',\n };\n }\n }\n }\n\n // \u7B2C\u4E09\u6B65\uFF1ASemantic Router \u8BED\u4E49\u610F\u56FE\u5339\u914D\n if (governanceConfig?.enabled && governanceConfig.semantic?.enabled) {\n const semanticResult = governanceConfig.semantic.mode === 'classifier'\n ? await semanticRouter.analyzeWithClassifier(\n text,\n governanceConfig.semantic,\n port,\n undefined,\n apiKey,\n timeoutMs\n )\n : semanticRouter.analyze(text, governanceConfig.semantic);\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 return {\n matched: true,\n rule: matchedRule,\n model: appConfig ? resolveModelReference(appConfig, matchedRule.model) ?? matchedRule.model : matchedRule.model,\n confidence: semanticResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'intent',\n };\n }\n }\n }\n\n // \u7B2C\u56DB\u6B65\uFF1ASmartRouter \u667A\u80FD\u6A21\u578B\u9009\u62E9\n if (smartRouterConfig?.enabled && smartRouterConfig.candidates?.length >= 2) {\n try {\n const resolvedSmartRouterConfig = appConfig ? {\n ...smartRouterConfig,\n router_model: resolveModelReference(appConfig, smartRouterConfig.router_model) ?? smartRouterConfig.router_model,\n candidates: smartRouterConfig.candidates.map((candidate) => ({\n ...candidate,\n model: resolveModelReference(appConfig, candidate.model) ?? candidate.model,\n })),\n } : smartRouterConfig;\n const smartResult = await smartRouterSelector.selectModel(text, resolvedSmartRouterConfig, port, undefined, apiKey, timeoutMs);\n if (smartResult) {\n log(`[SmartRouter] Selected model \"${smartResult.model}\" (confidence: ${smartResult.confidence})`);\n return {\r\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 }\n } catch (error) {\n logError('[ModelSelector] SmartRouter error:', error);\n }\n }\n\n // \u7B2C\u4E94\u6B65\uFF1A\u5982\u679C\u542F\u7528\u4E86 LLM \u610F\u56FE\u8BC6\u522B\uFF0C\u8FDB\u884C\u610F\u56FE\u68C0\u6D4B\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') {\r\n const matchedRule = intentDetector.findRuleByIntent(intentResult.intent, config.rules);\r\n\r\n if (matchedRule) {\r\n return {\n matched: true,\n rule: matchedRule,\n model: appConfig ? resolveModelReference(appConfig, matchedRule.model) ?? matchedRule.model : matchedRule.model,\n confidence: intentResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'intent',\n };\n }\n }\n } catch (error) {\r\n logError('[ModelSelector] Intent detection error:', error);\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 * \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 {\n const startTime = Date.now();\n const appConfig = (req as any).appConfig as IAppConfig | undefined;\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) {\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,\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}\n\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\nexport const modelSelector = new ModelSelector();\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';\nimport { appendTraceReason } from '../governance/trace';\nimport { modelSelector } from './selector';\nimport { contextAnalyzer } from './analyzer';\nimport { log, logError } from '../utils/log';\nimport { IGovernanceConfig } from '../governance/types';\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 {\n private config: ITriggerConfig | null = null;\n private appConfig: IAppConfig | null = null;\n private port: number = 3456;\n private smartRouterConfig: ISmartRouterConfig | undefined = undefined;\n private governanceConfig: IGovernanceConfig | undefined = undefined;\n private apiKey?: string;\n private apiTimeoutMs?: number;\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 {\n this.appConfig = appConfig;\n this.config = appConfig.TriggerRouter || this.getDefaultConfig();\n this.port = appConfig.PORT || 3456;\r\n this.smartRouterConfig = appConfig.SmartRouter;\n this.governanceConfig = appConfig.Governance;\n this.apiKey = appConfig.APIKEY;\n this.apiTimeoutMs = appConfig.API_TIMEOUT_MS;\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 }\n\n const result = await modelSelector.selectModel(\n {\n ...req,\n appConfig: this.appConfig ?? undefined,\n } as IRequestContext,\n this.config,\n this.port,\n this.smartRouterConfig,\n this.governanceConfig,\n this.apiKey,\n this.apiTimeoutMs\n );\n\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 === 'sticky') {\n req.governanceTrace.stickyHit = true;\n appendTraceReason(req.governanceTrace, 'sticky_routing');\n } else if (result.routeSource === 'smart_router') {\n appendTraceReason(req.governanceTrace, 'smart_router');\n } else if (result.routeSource === 'intent') {\n appendTraceReason(req.governanceTrace, 'intent_detection');\n } else {\n appendTraceReason(req.governanceTrace, 'trigger_router:no_match');\n }\n }\n\n return result;\n }\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 {\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({\n ...req,\n appConfig: this.appConfig ?? undefined,\n } as IRequestContext, this.config);\n }\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] ${result.routeSource === 'sticky' ? 'Sticky routing selected' : result.rule ? `Matched rule \"${result.rule.name}\"` : 'SmartRouter selected'} -> 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 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: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\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';\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\nfunction omitRequestFields(body: Record<string, any>) {\n const {\n model,\n messages,\n system,\n tools,\n thinking,\n metadata,\n max_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 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 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 { CONFIG_FILE, 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 { getCompiledModelRef, resolveModelReference } from \"./models/compile\";\nimport { buildUpstreamRequest } 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 ?? 3456;\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 `./logs/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 server = createServer({\n jsonPath: CONFIG_FILE,\n initialConfig: {\n providers: config.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 // \u6267\u884C\u89E6\u53D1\u8DEF\u7531\n const triggerResult = await triggerRouter.route(req);\n req.triggerResult = triggerResult;\n\n if (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 = buildUpstreamRequest({\n model: compiledModel.modelName,\n interface: compiledModel.interface,\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 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> {\r\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();\r\n if (!healthy) {\r\n throw new Error('service health check failed');\r\n }\r\n}\r\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 {\r\n name?: string;\r\n api_base_url?: string;\r\n api_key?: string;\r\n models?: string[];\r\n transformer?: unknown;\r\n}\r\n\r\ninterface ILegacyConfigInput {\n providers?: ILegacyProviderInput[] | unknown;\n default?: string | unknown;\n trigger_router?: unknown;\n}\n\nfunction inferProtocolFromApiBaseUrl(apiBaseUrl?: string): 'openai' | 'anthropic' {\n if (apiBaseUrl?.includes('/v1/messages')) {\n return 'anthropic';\n }\n\n return 'openai';\n}\n\nfunction toModelId(name: string, model: string, index: number): string {\n const normalizedName = name.trim() || `provider_${index + 1}`;\n const normalizedModel = model\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '');\n\n return normalizedModel ? `${normalizedName}_${normalizedModel}` : normalizedName;\n}\n\nfunction createEmptyDraft(): ISetupConfigDraft {\n return {\n Providers: [],\n Models: [],\n Router: {},\n };\n}\n\r\nfunction createNonMigratableResult(): IMigrateLegacyConfigResult {\r\n return {\r\n draft: createEmptyDraft(),\r\n skippedFields: [],\r\n needsCompletion: true,\r\n missingFields: ['defaultModel', 'apiKey'],\r\n };\r\n}\r\n\r\nfunction isLegacyProviderInput(value: unknown): value is ILegacyProviderInput {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\nexport function migrateLegacyConfig(input: ILegacyConfigInput): IMigrateLegacyConfigResult {\r\n if (!Array.isArray(input.providers)) {\r\n return createNonMigratableResult();\r\n }\r\n\r\n if (!input.providers.every(isLegacyProviderInput)) {\r\n return createNonMigratableResult();\r\n }\r\n\r\n const skippedFields: string[] = [];\n const providers = input.providers.map((provider, index) => {\n if (provider.transformer !== undefined) {\n skippedFields.push(`providers[${index}].transformer`);\n }\n\r\n return {\r\n name: provider.name ?? '',\r\n api_base_url: provider.api_base_url,\r\n api_key: provider.api_key ?? '',\r\n models: Array.isArray(provider.models) ? provider.models : [],\n };\n });\n const models = providers.flatMap((provider, providerIndex) =>\n (provider.models.length ? provider.models : ['']).map((model) => ({\n id: 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,\n interface: inferProtocolFromApiBaseUrl(provider.api_base_url),\n protocol: inferProtocolFromApiBaseUrl(provider.api_base_url),\n model,\n }))\n ).filter((item) => item.model);\n\n if (input.trigger_router !== undefined) {\n skippedFields.push('trigger_router');\n }\n\n const hasDefaultModel = typeof input.default === 'string' && input.default.length > 0;\n const defaultModelId = hasDefaultModel\n ? (() => {\n const [providerName, modelName] = String(input.default).split(',');\n return models.find((item) => item.id === toModelId(providerName, modelName, 0) || (item.id.startsWith(`${providerName}_`) && item.model === modelName))?.id;\n })()\n : undefined;\n const hasMissingApiKey = providers.some((provider) => provider.api_key.length === 0);\n const missingFields: string[] = [];\n\n if (!hasDefaultModel) {\n missingFields.push('defaultModel');\n }\r\n if (hasMissingApiKey) {\r\n missingFields.push('apiKey');\r\n }\r\n\r\n return {\n draft: {\n Providers: [],\n Models: models,\n Router: hasDefaultModel && defaultModelId ? { default: defaultModelId } : {},\n },\n skippedFields,\n needsCompletion: missingFields.length > 0,\n missingFields,\n };\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 { getProviderPreset as getSharedProviderPreset } from '../provider-presets';\nimport { IProviderPreset, IMinimalConfigInput, ISetupConfigDraft, ISetupModelDraft, ProviderPresetKey } from './types';\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 {\n const preset = getSharedProviderPreset(key);\n if (!preset) {\n return undefined;\n }\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 };\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 {\n const models: ISetupModelDraft[] = input.providers.map((p) => {\n const preset = p.preset ? getProviderPreset(p.preset) : undefined;\n const modelDraft: ISetupModelDraft = {\n id: p.name,\n key: p.api_key,\n api_key: p.api_key,\n model: p.models[0] ?? '',\n interface: preset?.interface ?? 'openai',\n protocol: preset?.protocol ?? 'openai',\n };\n\n const explicitApiBaseUrl = p.api_base_url?.trim();\n const presetApiBaseUrl = preset?.api_base_url?.trim();\n const apiBaseUrl = explicitApiBaseUrl || presetApiBaseUrl;\n if (apiBaseUrl) {\n modelDraft.api = apiBaseUrl;\n modelDraft.api_base_url = apiBaseUrl;\n }\n\n return modelDraft;\n });\n\n let defaultModel = input.defaultModel?.trim();\n if (input.defaultModel && input.defaultModel.includes(',')) {\n const [providerName, modelName] = input.defaultModel.split(',');\n const matched = models.find((item) => item.id === providerName && item.model === modelName);\n if (matched) {\n defaultModel = matched.id;\n }\n }\n\n if (input.defaultModel === undefined && models.length > 0) {\n const firstModelId = models[0].id;\n if (firstModelId && models[0].model) {\n defaultModel = firstModelId;\n }\n }\n\n if (defaultModel === '' || defaultModel === undefined) {\n defaultModel = undefined;\n }\n\n return {\n Models: models,\n Router: defaultModel ? { default: defaultModel } : {},\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 | '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') {\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\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;\r\n if (\r\n currentConfigAction === 'create' ||\r\n currentConfigAction === 'overwrite'\r\n ) {\r\n if (detection.legacyConfig.kind === 'found' || detection.legacyConfig.kind === 'read_error') {\r\n legacyConfigAction = await deps.chooseLegacyConfigAction({\r\n legacyConfig: detection.legacyConfig,\r\n });\r\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([\n ...detection.currentConfig.errors,\n ...detection.currentConfig.warnings,\n ]);\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 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';\r\nimport { homedir } from 'os';\r\nimport { join } from 'path';\r\nimport { createInterface } from 'readline/promises';\r\nimport { stdin as input, stdout as output } from 'process';\r\nimport yaml from 'js-yaml';\n\nimport { CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from '../constants';\nimport { listProviderPresetKeys } from '../provider-presets';\nimport { run } from '../index';\nimport { waitForService } from '../service-health';\nimport { backupConfigFile, normalizeAndValidateConfig, writeConfigFile } from '../utils';\nimport { killProcess, readServiceInfo } from '../utils/processCheck';\r\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';\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}\n\ntype TCapabilityChoice = '\u9ED8\u8BA4' | '\u652F\u6301' | '\u7981\u7528';\ntype TCapabilityEditChoice = '\u4FDD\u6301\u5F53\u524D\u503C' | '\u7F16\u8F91 capability';\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 {\r\n const rl = createInterface({ input, output });\r\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) {\r\n output.write(`${message}\\n`);\r\n },\r\n };\r\n}\r\n\r\nfunction readStructuredConfigFile(filePath: string): unknown {\r\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}\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 readLegacyConfig(): Promise<RawLegacyConfigResult> {\r\n const legacyPath = process.env.CTR_SETUP_LEGACY_CONFIG_PATH || join(homedir(), '.ccr', 'config.yaml');\r\n if (!existsSync(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: readStructuredConfigFile(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 probeService() {\r\n const healthy = await waitForService(DEFAULT_CONFIG.PORT, 500);\r\n return healthy ? { kind: 'self_healthy' as const, port: DEFAULT_CONFIG.PORT } : { kind: 'none' as const };\r\n}\r\n\r\nasync function enterClaudeCode(): Promise<void> {\r\n const cliModule = await import('../cli');\r\n await cliModule.runClaudeCode();\r\n}\r\n\r\nasync function executeStart(): Promise<void> {\r\n const childProcess = await import('child_process');\r\n childProcess.spawn(process.execPath, [process.argv[1], 'start', '--daemon'], {\r\n detached: true,\r\n stdio: 'ignore',\r\n env: { ...process.env, CTR_DAEMON: '1' },\r\n }).unref();\r\n}\r\n\r\nasync function executeRestart(): Promise<void> {\r\n const info = readServiceInfo();\r\n if (info) {\r\n try {\r\n killProcess(info.pid);\r\n } catch {\r\n // Ignore stop failures here and rely on the following health check.\r\n }\r\n }\r\n await executeStart();\r\n}\r\n\r\nfunction mapConfigErrorsToRepairFields(errors: string[]) {\n const fields = getRepairFields(errors);\n return fields.includes('manualReview')\n ? { mode: 'manualReview' as const, fields }\n : { mode: 'repair' as const, fields };\n}\n\nfunction toCapabilityBoolean(choice: TCapabilityChoice): boolean | undefined {\n if (choice === '\u652F\u6301') {\n return true;\n }\n if (choice === '\u7981\u7528') {\n return false;\n }\n return undefined;\n}\n\nfunction applyCapabilityMetadata(model: any, metadata?: Record<string, unknown>) {\n if (!metadata || !Object.keys(metadata).length) {\n delete model.metadata;\n return model;\n }\n\n model.metadata = {\n ...(model.metadata ?? {}),\n ...metadata,\n };\n\n if (!Object.keys(model.metadata || {}).length) {\n delete model.metadata;\n }\n\n return model;\n}\n\nasync function promptCapabilityMetadata(io: ISetupIO, currentMetadata?: Record<string, unknown>) {\n const vendorHint = await io.input('Vendor hint\uFF08\u53EF\u9009\uFF09', String(currentMetadata?.vendor_hint ?? ''));\n const reasoningChoice = await io.choose('Reasoning support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\n const toolChoice = await io.choose('Tool support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\n const imageChoice = await io.choose('Image support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\n\n const nextMetadata: Record<string, unknown> = {};\n if (vendorHint.trim()) {\n nextMetadata.vendor_hint = vendorHint.trim();\n }\n\n const reasoning = toCapabilityBoolean(reasoningChoice);\n if (reasoning !== undefined) {\n nextMetadata.supports_reasoning = reasoning;\n }\n\n const tools = toCapabilityBoolean(toolChoice);\n if (tools !== undefined) {\n nextMetadata.supports_tools = tools;\n }\n\n const images = toCapabilityBoolean(imageChoice);\n if (images !== undefined) {\n nextMetadata.supports_images = images;\n }\n\n return nextMetadata;\n}\n\nasync function promptCapabilityMetadataForDraft(draft: ISetupConfigDraft, io: ISetupIO) {\n if (!draft.Models?.length) {\n return;\n }\n\n for (const model of draft.Models) {\n const modelLabel = model.id || model.model || 'unnamed-model';\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;\n if (editChoice !== '\u7F16\u8F91 capability') {\n continue;\n }\n\n const metadata = await promptCapabilityMetadata(io, model.metadata);\n applyCapabilityMetadata(model, metadata);\n }\n}\n\r\nfunction toDraftFromConfig(config: any): ISetupConfigDraft {\n const derivedModels = !Array.isArray(config?.Models) && Array.isArray(config?.Providers)\n ? config.Providers.flatMap((provider: any) =>\n (Array.isArray(provider.models) ? provider.models : []).map((model: string) => ({\n id: `${provider.name}_${String(model).toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '')}`,\n key: provider.api_key ?? '',\n api_key: provider.api_key ?? '',\n api: provider.api_base_url,\n api_base_url: provider.api_base_url,\n interface: provider.api_base_url?.includes('/v1/messages') ? 'anthropic' : 'openai',\n protocol: provider.api_base_url?.includes('/v1/messages') ? 'anthropic' : 'openai',\n model,\n }))\n )\n : [];\n\n return {\n Providers: Array.isArray(config?.Providers)\n ? config.Providers.map((provider: any) => ({\n name: provider.name ?? '',\n api_key: provider.api_key ?? '',\n api_base_url: provider.api_base_url,\n models: Array.isArray(provider.models) ? [...provider.models] : [],\n transformer: provider.transformer?.use ? { use: [...provider.transformer.use] } : undefined,\n }))\n : [],\n Models: Array.isArray(config?.Models)\n ? config.Models.map((model: any) => ({\n id: model.id ?? '',\n key: model.key ?? model.api_key ?? '',\n api_key: model.api_key ?? '',\n api: model.api ?? model.api_base_url,\n api_base_url: model.api_base_url,\n interface: model.interface ?? model.protocol,\n protocol: model.protocol,\n model: model.model ?? '',\n thinking: typeof model.thinking === 'string'\n ? model.thinking\n : model.thinking\n ? { ...model.thinking }\n : undefined,\n metadata: model.metadata ? { ...model.metadata } : undefined,\n }))\n : derivedModels,\n Router: {\n default: Array.isArray(config?.Models)\n ? config?.Router?.default\n : Array.isArray(config?.Providers) && typeof config?.Router?.default === 'string' && config.Router.default.includes(',')\n ? derivedModels.find((item) => {\n const [providerName, modelName] = config.Router.default.split(',');\n return item.id.startsWith(`${providerName}_`) && item.model === modelName;\n })?.id\n : config?.Router?.default,\n },\n };\n}\n\r\nasync function buildFreshConfig(io: ISetupIO): Promise<ISetupConfigDraft> {\n const presetOptions = listProviderPresetKeys('setup');\n const preset = await io.choose('\u9009\u62E9 provider \u9884\u8BBE', presetOptions) as ProviderPresetKey;\n const providerName = await io.input('Provider \u540D\u79F0', preset);\n const apiBaseUrl = preset === 'custom' ? await io.input('API Base URL') : await io.input('API Base URL\uFF08\u7559\u7A7A\u4F7F\u7528\u9884\u8BBE\uFF09', '');\n const apiKey = await io.input('API Key');\n const model = await io.input('\u9ED8\u8BA4\u6A21\u578B');\n const capabilityMode = await io.choose('\u662F\u5426\u914D\u7F6E capability \u63D0\u793A', ['\u4FDD\u6301\u9ED8\u8BA4', '\u914D\u7F6E capability \u63D0\u793A']);\n\n const draft = buildMinimalConfig({\n providers: [\n {\n name: providerName,\n api_key: apiKey,\n models: [model],\n preset,\n api_base_url: apiBaseUrl,\n },\n ],\n defaultModel: providerName,\n });\n\n if (capabilityMode === '\u914D\u7F6E capability \u63D0\u793A' && draft.Models?.[0]) {\n await promptCapabilityMetadataForDraft(draft, io);\n }\n\n return draft;\n}\n\r\nasync function completeDraft(input: { draft: ISetupConfigDraft; fields: string[]; io: ISetupIO }): Promise<ISetupConfigDraft> {\r\n const draft = toDraftFromConfig(input.draft);\n\n if (input.fields.includes('defaultModel')) {\n const defaultProvider = draft.Models?.[0]?.id ?? draft.Providers?.[0]?.name ?? 'provider';\n const defaultModel = draft.Models?.[0]?.model ?? draft.Providers?.[0]?.models?.[0] ?? '';\n const model = await input.io.input('\u9ED8\u8BA4\u6A21\u578B', defaultModel);\n if (draft.Models?.[0]) {\n draft.Models[0].model = model;\n draft.Router.default = defaultProvider;\n } else if (draft.Providers?.[0]) {\n draft.Providers[0].models = [model];\n draft.Router.default = `${defaultProvider},${model}`;\n }\n }\n\n if (input.fields.includes('apiKey')) {\n const apiKey = await input.io.input('API Key');\n if (draft.Models?.length) {\n draft.Models = draft.Models.map((model) => ({ ...model, key: model.key || apiKey, api_key: model.api_key || apiKey }));\n } else {\n draft.Providers = draft.Providers?.map((provider) => ({ ...provider, api_key: provider.api_key || apiKey }));\n }\n }\n\n if (input.fields.includes('apiBaseUrl')) {\n const apiBaseUrl = await input.io.input('API Base URL');\n if (draft.Models?.length) {\n draft.Models = draft.Models.map((model) => ({\n ...model,\n api: model.api || apiBaseUrl,\n api_base_url: model.api_base_url || apiBaseUrl,\n }));\n } else {\n draft.Providers = draft.Providers?.map((provider) => ({\n ...provider,\n api_base_url: provider.api_base_url || apiBaseUrl,\n }));\n }\n }\n\n if (input.fields.includes('capabilityHints') && draft.Models?.[0]) {\n await promptCapabilityMetadataForDraft(draft, input.io);\n }\n\n return draft;\n}\n\r\nfunction createDefaultDeps(io = createConsoleIO()): IRunSetupCliDeps {\r\n return {\r\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(DEFAULT_CONFIG.PORT, 5000),\r\n enterClaudeCode,\r\n io,\r\n };\r\n}\r\n\r\nexport async function runSetupCli(customDeps?: Partial<IRunSetupCliDeps>): Promise<void> {\r\n const defaults = createDefaultDeps(customDeps?.io);\r\n const deps = { ...defaults, ...customDeps } as IRunSetupCliDeps;\r\n\r\n await runSetup({\r\n detectSetupEnvironment: () =>\r\n detectSetupEnvironment({\r\n readCurrentConfig: deps.readCurrentConfig,\r\n readLegacyConfig: deps.readLegacyConfig,\r\n probeService: deps.probeService,\r\n }),\r\n chooseCurrentConfigAction: async ({ currentConfig }) => {\r\n if (currentConfig.kind === 'missing') {\r\n return 'create';\r\n }\r\n if (currentConfig.kind === 'valid') {\n deps.io.info('\u68C0\u6D4B\u5230\u73B0\u6709\u53EF\u7528\u914D\u7F6E\u3002');\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', ['reuse', 'overwrite', 'cancel'])) as 'reuse' | 'overwrite' | 'cancel';\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\r\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u65E0\u6CD5\u89E3\u6790\uFF1A${currentConfig.error}`);\r\n return (await deps.io.choose('\u9009\u62E9\u4E0B\u4E00\u6B65', ['rebuild', 'cancel'])) as 'rebuild' | 'cancel';\r\n },\r\n chooseLegacyConfigAction: async ({ legacyConfig }) => {\r\n if (legacyConfig.kind === 'found') {\r\n return (await deps.io.choose('\u68C0\u6D4B\u5230\u65E7 ccr \u914D\u7F6E\uFF0C\u662F\u5426\u8FC1\u79FB\uFF1F', ['migrate', 'skip'])) as 'migrate' | 'skip';\r\n }\r\n if (legacyConfig.kind === 'read_error') {\r\n deps.io.info(`\u65E7 ccr \u914D\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF1A${legacyConfig.error}`);\r\n }\r\n return 'skip';\r\n },\r\n buildFreshConfig: () => buildFreshConfig(deps.io),\r\n buildRepairConfig: async ({ currentConfig }) => toDraftFromConfig(currentConfig),\r\n completeDraft: ({ draft, fields }) => completeDraft({ draft, fields, io: deps.io }),\r\n migrateLegacyConfig,\r\n mapConfigErrorsToRepairFields,\r\n persistConfig: async ({ config, currentConfigPath, hasExistingConfig }) => {\n const normalized = normalizeAndValidateConfig(config as any);\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 }) => {\r\n const action = decideServiceAction({\r\n configChanged,\r\n detectedService,\r\n reloadSupported,\r\n });\r\n\r\n await applyServiceAction({\r\n action,\r\n executeStart: deps.executeStart,\r\n executeReload: deps.executeReload,\r\n executeRestart: deps.executeRestart,\r\n verifyHealth: deps.verifyHealth,\r\n });\r\n\r\n return {\r\n action: action.kind,\r\n healthChecked: true,\r\n };\r\n },\r\n enterClaudeCode: deps.enterClaudeCode,\r\n reloadSupported: false,\r\n });\r\n}\r\n", "#!/usr/bin/env node\r\n\r\n/**\r\n * CLI Entry Point\r\n *\r\n * \u547D\u4EE4\u884C\u5165\u53E3\r\n */\r\n\r\nimport { spawn } from \"child_process\";\r\nimport { join, dirname } from \"path\";\r\nimport open from \"openurl\";\r\nimport { existsSync, readFileSync, copyFileSync, mkdirSync } from \"fs\";\r\nimport { run, initializeClaudeConfig } from \"./index\";\r\nimport { isServiceRunning, killProcess, readServiceInfo } from \"./utils/processCheck\";\r\nimport { CONFIG_DIR, CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from \"./constants\";\r\nimport { waitForService } from \"./service-health\";\r\nimport { runSetupCli } from \"./setup\";\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 {\r\n const args = getArgs();\r\n const index = args.indexOf(flag) !== -1 ? args.indexOf(flag) : shortFlag ? args.indexOf(shortFlag) : -1;\r\n return index !== -1 ? args[index + 1] : undefined;\r\n}\r\n\r\n/**\r\n * \u4ECE\u547D\u4EE4\u884C\u53C2\u6570\u6216\u914D\u7F6E\u6587\u4EF6\u4E2D\u83B7\u53D6\u7AEF\u53E3\u53F7\r\n */\r\nfunction getPort(): number {\r\n // \u4F18\u5148\u4F7F\u7528\u547D\u4EE4\u884C\u53C2\u6570\r\n const portValue = getArgValue(\"--port\", \"-p\");\r\n if (portValue) {\r\n return parseInt(portValue, 10);\r\n }\r\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() {\r\n console.log(`\r\nClaude Trigger Router - \u667A\u80FD\u89E6\u53D1\u8DEF\u7531\u5668\r\n\r\n\u7528\u6CD5\uFF1Actr <\u547D\u4EE4> [\u9009\u9879]\r\n\r\n\u547D\u4EE4\uFF1A\r\n setup \u9996\u6B21\u4F7F\u7528\u5411\u5BFC\uFF08\u63A8\u8350\u65B0\u624B\uFF09\r\n init \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6\uFF08\u4ECE\u793A\u4F8B\u6A21\u677F\u590D\u5236\uFF09\r\n start \u542F\u52A8\u8DEF\u7531\u670D\u52A1\uFF08\u9ED8\u8BA4\u524D\u53F0\u8FD0\u884C\uFF09\r\n stop \u505C\u6B62\u540E\u53F0\u670D\u52A1\r\n restart \u91CD\u542F\u540E\u53F0\u670D\u52A1\r\n status \u67E5\u770B\u670D\u52A1\u8FD0\u884C\u72B6\u6001\uFF08PID\u3001\u7AEF\u53E3\u3001\u542F\u52A8\u65F6\u95F4\uFF09\r\n code \u901A\u8FC7\u8DEF\u7531\u5668\u8FD0\u884C Claude Code\uFF08\u9700\u5148\u542F\u52A8\u670D\u52A1\uFF09\r\n ui \u6253\u5F00\u7BA1\u7406 API \u8BF4\u660E\u9875\uFF08Web UI \u5F00\u53D1\u4E2D\uFF09\r\n help \u663E\u793A\u6B64\u5E2E\u52A9\u4FE1\u606F\r\n\r\n\u9009\u9879\uFF1A\r\n --port, -p \u6307\u5B9A\u76D1\u542C\u7AEF\u53E3\uFF08\u9ED8\u8BA4\uFF1A3456\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 # \u9996\u6B21\u4F7F\u7528\u5411\u5BFC\uFF08\u63A8\u8350\uFF09\r\n ctr init # \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6\r\n ctr start # \u524D\u53F0\u542F\u52A8\uFF08\u63A8\u8350\u9996\u6B21\u4F7F\u7528\uFF0C\u4FBF\u4E8E\u67E5\u770B\u65E5\u5FD7\uFF09\r\n ctr start --daemon # \u540E\u53F0\u542F\u52A8\r\n ctr status # \u67E5\u770B\u670D\u52A1\u72B6\u6001\r\n ctr code # \u542F\u52A8 Claude Code\uFF08\u9700\u5148\u8FD0\u884C ctr start\uFF09\r\n ctr stop # \u505C\u6B62\u540E\u53F0\u670D\u52A1\r\n ctr restart --daemon # \u91CD\u542F\u540E\u53F0\u670D\u52A1\r\n\r\n\u914D\u7F6E\u6587\u4EF6\uFF1A\r\n ${CONFIG_FILE}\r\n ${CONFIG_FILE_JSON}\r\n\r\n\u914D\u7F6E\u76EE\u5F55\uFF1A${CONFIG_DIR}\r\n\r\n\u66F4\u591A\u4FE1\u606F\uFF1Ahttps://github.com/peterwangze/claude-trigger-router\r\n`);\r\n}\r\n\r\n/**\r\n * \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6\r\n */\r\nfunction initConfig() {\r\n const force = hasArg(\"--force\");\r\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)) {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n }\r\n\r\n // \u67E5\u627E\u793A\u4F8B\u914D\u7F6E\u6587\u4EF6\r\n const examplePaths = [\r\n join(__dirname, \"..\", \"config\", \"trigger.example.yaml\"),\r\n join(dirname(process.argv[1]), \"..\", \"config\", \"trigger.example.yaml\"),\r\n ];\r\n\r\n const exampleFile = examplePaths.find((p) => existsSync(p));\r\n\r\n if (!exampleFile) {\r\n console.error(\"\u274C \u627E\u4E0D\u5230\u793A\u4F8B\u914D\u7F6E\u6587\u4EF6\u3002\");\r\n console.log(` \u8BF7\u624B\u52A8\u521B\u5EFA ${CONFIG_FILE}`);\r\n console.log(\" \u53C2\u8003\u6587\u6863\uFF1Ahttps://github.com/peterwangze/claude-trigger-router#configuration\");\r\n process.exit(1);\r\n }\r\n\r\n try {\r\n copyFileSync(exampleFile, CONFIG_FILE);\r\n const action = force ? \"\u5DF2\u8986\u76D6\" : \"\u5DF2\u521B\u5EFA\";\r\n console.log(`\u2705 \u914D\u7F6E\u6587\u4EF6${action}\uFF1A${CONFIG_FILE}`);\r\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 'Providers' \u4E0B\u914D\u7F6E\u4F60\u7684\u6A21\u578B\u63D0\u4F9B\u5546\");\r\n console.log(\" 3. \u5C06 'Router.default' \u8BBE\u7F6E\u4E3A\u4F60\u7684\u9ED8\u8BA4\u6A21\u578B\");\r\n console.log(\" 4. \u5728 'TriggerRouter.rules' \u4E0B\u81EA\u5B9A\u4E49\u89E6\u53D1\u89C4\u5219\");\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) {\r\n console.log(\"\uD83D\uDE80 Starting Claude Trigger Router (foreground)...\");\r\n console.log(\" Press Ctrl+C to stop\");\r\n\r\n try {\r\n await run({ port });\r\n } catch (error: any) {\r\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\nfunction startDaemon(port?: number) {\r\n if (isServiceRunning()) {\r\n console.log(\"\u2705 Service is already running in the background.\");\r\n return;\r\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, {\r\n detached: true,\r\n stdio: \"ignore\",\r\n env: { ...process.env, CTR_DAEMON: \"1\" },\r\n });\r\n\r\n child.unref();\r\n\r\n // \u7B49\u5F85\u670D\u52A1\u542F\u52A8\uFF08\u6700\u591A 5 \u79D2\uFF09\r\n const targetPort = port ?? getPort();\r\n let waited = 0;\r\n const interval = setInterval(() => {\r\n waited += 500;\r\n if (isServiceRunning()) {\r\n clearInterval(interval);\r\n console.log(`\u2705 Service started in background (port: ${targetPort})`);\r\n console.log(` Run 'ctr stop' to stop it.`);\r\n } else if (waited >= 5000) {\r\n clearInterval(interval);\r\n console.log(`\u2705 Service launched in background (port: ${targetPort})`);\r\n console.log(` If it fails to start, run 'ctr start' (without --daemon) to see errors.`);\r\n }\r\n }, 500);\r\n}\r\n\r\n/**\r\n * \u663E\u793A\u670D\u52A1\u72B6\u6001\r\n */\r\nfunction showStatus() {\r\n const info = readServiceInfo();\r\n if (!info || !isServiceRunning()) {\r\n console.log(\"\u23F9 \u670D\u52A1\u672A\u8FD0\u884C\");\r\n return;\r\n }\r\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\nfunction restartService() {\r\n stopService();\r\n setTimeout(() => startDaemon(getPort()), 1500);\r\n}\r\n\r\n/**\r\n * \u8FD0\u884C Claude Code\r\n */\r\nexport async function runClaudeCode() {\r\n const port = getPort();\r\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) {\r\n console.log(`\u26A0\uFE0F Trigger Router service is not running on port ${port}.`);\r\n console.log(\"\");\r\n console.log(\"Options:\");\r\n console.log(\" 1. Start service first: ctr start --daemon\");\r\n console.log(\" 2. Or start interactively in another terminal: ctr start\");\r\n console.log(\"\");\r\n const proceed = process.env.CTR_AUTO_START === \"1\";\r\n if (!proceed) {\r\n process.exit(1);\r\n }\r\n }\r\n\r\n console.log(`\uD83D\uDE80 Starting Claude Code with Trigger Router (port: ${port})...`);\r\n\r\n // \u542F\u52A8 Claude Code\uFF08Windows \u4E0A npm \u5168\u5C40\u547D\u4EE4\u4E3A .cmd shim\uFF0C\u9700\u8981 shell: true\uFF09\r\n const isWindows = process.platform === \"win32\";\r\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\nfunction openUI() {\r\n const port = getPort();\r\n const url = `http://127.0.0.1:${port}/ui`;\r\n\r\n console.log(`\uD83C\uDF10 Opening UI at ${url}`);\r\n\r\n try {\r\n open(url);\r\n } catch (error: any) {\r\n console.log(` Please open ${url} in your browser`);\r\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\":\r\n await runSetupCli();\r\n break;\r\n\r\n case \"init\":\r\n initConfig();\r\n break;\r\n\r\n case \"start\":\r\n if (isDaemonMode()) {\r\n startDaemon(getPort());\r\n } else {\r\n await startForeground(getPort());\r\n }\r\n break;\r\n\r\n case \"stop\":\r\n stopService();\r\n break;\r\n\r\n case \"status\":\r\n showStatus();\r\n break;\r\n\r\n case \"restart\":\r\n restartService();\r\n break;\r\n\r\n case \"code\":\r\n await runClaudeCode();\r\n break;\r\n\r\n case \"ui\":\r\n openUI();\r\n break;\r\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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",
|
|
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: 3456,\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 interface ICompiledModelRef {\n id: string;\n providerName: string;\n modelName: string;\n interface?: 'openai' | 'anthropic';\n protocol: 'openai' | 'anthropic';\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 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 result[item.id] = {\n id: item.id,\n providerName: `model__${item.id}`,\n modelName: item.model,\n interface: modelInterface,\n protocol: modelInterface,\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 result[`${provider.name},${model}`] = {\n id: `${provider.name},${model}`,\n providerName: provider.name,\n modelName: model,\n interface: 'openai',\n protocol: 'openai',\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,\r\n CONFIG_FILE_JSON,\r\n CONFIG_FILE_YML,\r\n DEFAULT_CONFIG,\n DEFAULT_GOVERNANCE_CONFIG,\n DEFAULT_TRIGGER_CONFIG,\n DEFAULT_SMART_ROUTER_CONFIG,\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> {\r\n if (!existsSync(CONFIG_DIR)) {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n }\r\n}\r\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(\r\n ref: string,\r\n providers: IAppConfig['Providers'],\r\n fieldName: string\r\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 }\r\n return null;\r\n}\r\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) {\r\n if (ref) {\r\n const err = validateModelRef(ref, validProviders, field);\r\n if (err) errors.push(err);\r\n }\r\n }\r\n }\r\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) {\r\n errors.push('TriggerRouter.intent_model is required when llm_intent_recognition is enabled');\r\n } else if (config.TriggerRouter.intent_model && validProviders.length > 0) {\r\n const err = validateModelRef(config.TriggerRouter.intent_model, validProviders, 'TriggerRouter.intent_model');\r\n if (err) errors.push(err);\r\n }\r\n\r\n if (config.TriggerRouter.rules) {\r\n config.TriggerRouter.rules.forEach((rule, index) => {\r\n if (!rule.name) {\r\n errors.push(`TriggerRouter.rules[${index}].name is required`);\r\n }\r\n if (!rule.model) {\r\n errors.push(`TriggerRouter.rules[${index}].model is required`);\r\n } else if (validProviders.length > 0) {\r\n const err = validateModelRef(rule.model, validProviders, `TriggerRouter.rules[${index}].model`);\r\n if (err) errors.push(err);\r\n }\r\n if (!rule.patterns || rule.patterns.length === 0) {\r\n errors.push(`TriggerRouter.rules[${index}].patterns must be a non-empty array`);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // \u9A8C\u8BC1 SmartRouter \u914D\u7F6E\n if (config.SmartRouter?.enabled) {\n if (!config.SmartRouter.router_model) {\r\n errors.push('SmartRouter.router_model is required when SmartRouter is enabled');\r\n } else if (validProviders.length > 0) {\r\n const err = validateModelRef(config.SmartRouter.router_model, validProviders, 'SmartRouter.router_model');\r\n if (err) errors.push(err);\r\n }\r\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) {\r\n errors.push(`SmartRouter.candidates[${index}].model is required`);\r\n } else if (validProviders.length > 0) {\r\n const err = validateModelRef(candidate.model, validProviders, `SmartRouter.candidates[${index}].model`);\r\n if (err) errors.push(err);\r\n }\r\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\r\nexport function normalizeAndValidateConfig(config: Partial<IAppConfig> = {}): {\n config: IAppConfig;\n errors: string[];\n warnings: string[];\n} {\n const normalizedConfig = deepMerge(\r\n {\r\n ...DEFAULT_CONFIG,\r\n Router: {\n default: '',\n },\n Providers: [],\n SmartRouter: DEFAULT_SMART_ROUTER_CONFIG,\n },\r\n config\r\n ) as IAppConfig;\r\n\r\n if (config.TriggerRouter) {\n normalizedConfig.TriggerRouter = deepMerge(DEFAULT_TRIGGER_CONFIG, config.TriggerRouter) as IAppConfig['TriggerRouter'];\n }\n\n if (config.Governance) {\n normalizedConfig.Governance = deepMerge(DEFAULT_GOVERNANCE_CONFIG, config.Governance) as IAppConfig['Governance'];\n }\n\n if (config.Models) {\n normalizedConfig.Models = config.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", "export const SERVICE_NAME = 'claude-trigger-router';\r\nexport const SERVICE_HEALTH_PATH = '/api/health';\r\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> {\r\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}\r\n\r\nexport async function waitForService(port: number, timeoutMs = 5000): Promise<boolean> {\r\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 [{ type: 'image', source: item.source ?? item.image_url ?? item.url }];\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\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) => item?.type === 'text' && typeof item.text === 'string' ? [item.text] : [])\n : [];\n\n const messages = Array.isArray(input.messages)\n ? input.messages\n .filter((item) => item?.role)\n .map((item) => ({\n role: item.role,\n parts: normalizeContentParts(item.content),\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 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;\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 { 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 = 3456,\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 { 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\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 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 = 3456,\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 { 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 = 3456,\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 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>Thinking</th><th>Capabilities</th><th>Source</th></tr></thead>` +\n `<tbody><tr><td colspan=\"6\" 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><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=\"6\" 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 { 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\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 ?? 3456,\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: 3456, 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\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' | 'sticky' | 'smart_router' | 'intent';\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}\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\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 { 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 = 3456,\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';\nimport { ISmartRouterConfig } from './types';\nimport { logError, logWarn } from '../utils/log';\nimport { createSingleUserTextIR } from '../protocols/message-ir';\nimport { toAnthropicMessagesRequest } from '../protocols/anthropic';\n\r\n/**\r\n * SmartRouter \u9009\u62E9\u7ED3\u679C\r\n */\r\nexport interface ISmartRouterResult {\r\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;\r\n}\r\n\r\n/**\r\n * SmartRouter Prompt \u6A21\u677F\r\n */\r\nconst SMART_ROUTER_PROMPT = `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.\r\n\r\nUser request:\r\n\"\"\"\r\n{request}\r\n\"\"\"\r\n\r\nAvailable models:\r\n{candidates}\r\n\r\nSelect the most appropriate model and respond in the following JSON format ONLY:\r\n{\r\n \"model\": \"<exact model identifier from the list>\",\r\n \"confidence\": <0.0-1.0>,\r\n \"reasoning\": \"<brief explanation>\"\r\n}\r\n\r\nImportant:\r\n- The \"model\" field MUST be one of the exact identifiers listed above\r\n- Respond ONLY with the JSON, no additional text`;\r\n\r\n/**\r\n * \u667A\u80FD\u8DEF\u7531\u9009\u62E9\u5668\u7C7B\r\n */\r\nexport class SmartRouterSelector {\r\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']): string {\r\n return SMART_ROUTER_PROMPT\r\n .replace('{request}', text)\r\n .replace('{candidates}', this.buildCandidatesList(candidates));\r\n }\r\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 3456\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(\r\n text: string,\r\n config: ISmartRouterConfig,\r\n port: number = 3456,\r\n fetchFn?: typeof fetch,\r\n apiKey?: string,\r\n timeoutMs?: number\r\n ): Promise<ISmartRouterResult | null> {\r\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);\r\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 ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify(\n toAnthropicMessagesRequest({\n model: config.router_model,\n max_tokens: config.max_tokens ?? 256,\n ir: createSingleUserTextIR(prompt),\n })\n ),\n ...(timeoutMs && timeoutMs > 0 ? { signal: AbortSignal.timeout(timeoutMs) } : {}),\n });\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';\nimport { contextAnalyzer } from './analyzer';\nimport { intentDetector } from './intent';\nimport { smartRouterSelector } from './smart-router';\nimport { log, logError } from '../utils/log';\nimport { IGovernanceConfig } from '../governance/types';\nimport { createTaskFingerprint, sessionStateStore } from '../governance/session-store';\nimport { semanticRouter } from '../governance/semantic-router';\nimport { resolveModelReference } from '../models/compile';\n\r\n/**\r\n * \u6A21\u578B\u9009\u62E9\u5668\u7C7B\r\n */\r\nexport class ModelSelector {\r\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 = 3456,\n smartRouterConfig?: ISmartRouterConfig,\n governanceConfig?: IGovernanceConfig,\n apiKey?: string,\n timeoutMs?: number\n ): Promise<IAnalysisResult> {\n const startTime = Date.now();\n const appConfig = (req as any).appConfig as IAppConfig | undefined;\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\r\n const matchResult = this.matchRuleFromText(text, config.rules);\r\n\r\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, // \u5173\u952E\u8BCD\u5339\u914D\u7F6E\u4FE1\u5EA6\u4E3A 1\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'trigger_rule',\n };\n }\n\n // \u7B2C\u4E8C\u6B65\uFF1ASticky routing\uFF0C\u4F18\u5148\u590D\u7528\u540C\u4F1A\u8BDD\u540C\u4EFB\u52A1\u7684\u6700\u8FD1\u7A33\u5B9A\u6A21\u578B\n if (governanceConfig?.enabled && governanceConfig.sticky?.enabled && req.sessionId) {\n const fingerprint = createTaskFingerprint(text);\n const sessionState = sessionStateStore.get(req.sessionId);\n\n if (\n fingerprint &&\n sessionState?.lastTaskFingerprint === fingerprint &&\n (sessionState.preferredModel || sessionState.lastSuccessfulModel)\n ) {\n const stickyModel = sessionState.preferredModel || sessionState.lastSuccessfulModel;\n if (stickyModel) {\n log(`[StickyRouting] Reusing model \"${stickyModel}\" for session \"${req.sessionId}\"`);\n return {\n matched: true,\n model: appConfig ? resolveModelReference(appConfig, stickyModel) ?? stickyModel : stickyModel,\n confidence: 0.95,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'sticky',\n };\n }\n }\n }\n\n // \u7B2C\u4E09\u6B65\uFF1ASemantic Router \u8BED\u4E49\u610F\u56FE\u5339\u914D\n if (governanceConfig?.enabled && governanceConfig.semantic?.enabled) {\n const semanticResult = governanceConfig.semantic.mode === 'classifier'\n ? await semanticRouter.analyzeWithClassifier(\n text,\n governanceConfig.semantic,\n port,\n undefined,\n apiKey,\n timeoutMs\n )\n : semanticRouter.analyze(text, governanceConfig.semantic);\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 return {\n matched: true,\n rule: matchedRule,\n model: appConfig ? resolveModelReference(appConfig, matchedRule.model) ?? matchedRule.model : matchedRule.model,\n confidence: semanticResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'intent',\n };\n }\n }\n }\n\n // \u7B2C\u56DB\u6B65\uFF1ASmartRouter \u667A\u80FD\u6A21\u578B\u9009\u62E9\n if (smartRouterConfig?.enabled && smartRouterConfig.candidates?.length >= 2) {\n try {\n const resolvedSmartRouterConfig = appConfig ? {\n ...smartRouterConfig,\n router_model: resolveModelReference(appConfig, smartRouterConfig.router_model) ?? smartRouterConfig.router_model,\n candidates: smartRouterConfig.candidates.map((candidate) => ({\n ...candidate,\n model: resolveModelReference(appConfig, candidate.model) ?? candidate.model,\n })),\n } : smartRouterConfig;\n const smartResult = await smartRouterSelector.selectModel(text, resolvedSmartRouterConfig, port, undefined, apiKey, timeoutMs);\n if (smartResult) {\n log(`[SmartRouter] Selected model \"${smartResult.model}\" (confidence: ${smartResult.confidence})`);\n return {\r\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 }\n } catch (error) {\n logError('[ModelSelector] SmartRouter error:', error);\n }\n }\n\n // \u7B2C\u4E94\u6B65\uFF1A\u5982\u679C\u542F\u7528\u4E86 LLM \u610F\u56FE\u8BC6\u522B\uFF0C\u8FDB\u884C\u610F\u56FE\u68C0\u6D4B\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') {\r\n const matchedRule = intentDetector.findRuleByIntent(intentResult.intent, config.rules);\r\n\r\n if (matchedRule) {\r\n return {\n matched: true,\n rule: matchedRule,\n model: appConfig ? resolveModelReference(appConfig, matchedRule.model) ?? matchedRule.model : matchedRule.model,\n confidence: intentResult.confidence,\n analysisTime: Date.now() - startTime,\n analyzedText: text,\n routeSource: 'intent',\n };\n }\n }\n } catch (error) {\r\n logError('[ModelSelector] Intent detection error:', error);\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 * \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 {\n const startTime = Date.now();\n const appConfig = (req as any).appConfig as IAppConfig | undefined;\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) {\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,\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}\n\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\nexport const modelSelector = new ModelSelector();\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';\nimport { appendTraceReason } from '../governance/trace';\nimport { modelSelector } from './selector';\nimport { contextAnalyzer } from './analyzer';\nimport { log, logError } from '../utils/log';\nimport { IGovernanceConfig } from '../governance/types';\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 {\n private config: ITriggerConfig | null = null;\n private appConfig: IAppConfig | null = null;\n private port: number = 3456;\n private smartRouterConfig: ISmartRouterConfig | undefined = undefined;\n private governanceConfig: IGovernanceConfig | undefined = undefined;\n private apiKey?: string;\n private apiTimeoutMs?: number;\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 {\n this.appConfig = appConfig;\n this.config = appConfig.TriggerRouter || this.getDefaultConfig();\n this.port = appConfig.PORT || 3456;\r\n this.smartRouterConfig = appConfig.SmartRouter;\n this.governanceConfig = appConfig.Governance;\n this.apiKey = appConfig.APIKEY;\n this.apiTimeoutMs = appConfig.API_TIMEOUT_MS;\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 }\n\n const result = await modelSelector.selectModel(\n {\n ...req,\n appConfig: this.appConfig ?? undefined,\n } as IRequestContext,\n this.config,\n this.port,\n this.smartRouterConfig,\n this.governanceConfig,\n this.apiKey,\n this.apiTimeoutMs\n );\n\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 === 'sticky') {\n req.governanceTrace.stickyHit = true;\n appendTraceReason(req.governanceTrace, 'sticky_routing');\n } else if (result.routeSource === 'smart_router') {\n appendTraceReason(req.governanceTrace, 'smart_router');\n } else if (result.routeSource === 'intent') {\n appendTraceReason(req.governanceTrace, 'intent_detection');\n } else {\n appendTraceReason(req.governanceTrace, 'trigger_router:no_match');\n }\n }\n\n return result;\n }\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 {\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({\n ...req,\n appConfig: this.appConfig ?? undefined,\n } as IRequestContext, this.config);\n }\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] ${result.routeSource === 'sticky' ? 'Sticky routing selected' : result.rule ? `Matched rule \"${result.rule.name}\"` : 'SmartRouter selected'} -> 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 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: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\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';\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\nfunction omitRequestFields(body: Record<string, any>) {\n const {\n model,\n messages,\n system,\n tools,\n thinking,\n metadata,\n max_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 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 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 { CONFIG_FILE, 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 { getCompiledModelRef, resolveModelReference } from \"./models/compile\";\nimport { buildUpstreamRequest } 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 ?? 3456;\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 `./logs/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 server = createServer({\n jsonPath: CONFIG_FILE,\n initialConfig: {\n providers: config.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 // \u6267\u884C\u89E6\u53D1\u8DEF\u7531\n const triggerResult = await triggerRouter.route(req);\n req.triggerResult = triggerResult;\n\n if (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 = buildUpstreamRequest({\n model: compiledModel.modelName,\n interface: compiledModel.interface,\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 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> {\r\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();\r\n if (!healthy) {\r\n throw new Error('service health check failed');\r\n }\r\n}\r\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 {\r\n name?: string;\r\n api_base_url?: string;\r\n api_key?: string;\r\n models?: string[];\r\n transformer?: unknown;\r\n}\r\n\r\ninterface ILegacyConfigInput {\n providers?: ILegacyProviderInput[] | unknown;\n default?: string | unknown;\n trigger_router?: unknown;\n}\n\nfunction inferProtocolFromApiBaseUrl(apiBaseUrl?: string): 'openai' | 'anthropic' {\n if (apiBaseUrl?.includes('/v1/messages')) {\n return 'anthropic';\n }\n\n return 'openai';\n}\n\nfunction toModelId(name: string, model: string, index: number): string {\n const normalizedName = name.trim() || `provider_${index + 1}`;\n const normalizedModel = model\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '');\n\n return normalizedModel ? `${normalizedName}_${normalizedModel}` : normalizedName;\n}\n\nfunction createEmptyDraft(): ISetupConfigDraft {\n return {\n Providers: [],\n Models: [],\n Router: {},\n };\n}\n\r\nfunction createNonMigratableResult(): IMigrateLegacyConfigResult {\r\n return {\r\n draft: createEmptyDraft(),\r\n skippedFields: [],\r\n needsCompletion: true,\r\n missingFields: ['defaultModel', 'apiKey'],\r\n };\r\n}\r\n\r\nfunction isLegacyProviderInput(value: unknown): value is ILegacyProviderInput {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\nexport function migrateLegacyConfig(input: ILegacyConfigInput): IMigrateLegacyConfigResult {\r\n if (!Array.isArray(input.providers)) {\r\n return createNonMigratableResult();\r\n }\r\n\r\n if (!input.providers.every(isLegacyProviderInput)) {\r\n return createNonMigratableResult();\r\n }\r\n\r\n const skippedFields: string[] = [];\n const providers = input.providers.map((provider, index) => {\n if (provider.transformer !== undefined) {\n skippedFields.push(`providers[${index}].transformer`);\n }\n\r\n return {\r\n name: provider.name ?? '',\r\n api_base_url: provider.api_base_url,\r\n api_key: provider.api_key ?? '',\r\n models: Array.isArray(provider.models) ? provider.models : [],\n };\n });\n const models = providers.flatMap((provider, providerIndex) =>\n (provider.models.length ? provider.models : ['']).map((model) => ({\n id: 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,\n interface: inferProtocolFromApiBaseUrl(provider.api_base_url),\n protocol: inferProtocolFromApiBaseUrl(provider.api_base_url),\n model,\n }))\n ).filter((item) => item.model);\n\n if (input.trigger_router !== undefined) {\n skippedFields.push('trigger_router');\n }\n\n const hasDefaultModel = typeof input.default === 'string' && input.default.length > 0;\n const defaultModelId = hasDefaultModel\n ? (() => {\n const [providerName, modelName] = String(input.default).split(',');\n return models.find((item) => item.id === toModelId(providerName, modelName, 0) || (item.id.startsWith(`${providerName}_`) && item.model === modelName))?.id;\n })()\n : undefined;\n const hasMissingApiKey = providers.some((provider) => provider.api_key.length === 0);\n const missingFields: string[] = [];\n\n if (!hasDefaultModel) {\n missingFields.push('defaultModel');\n }\r\n if (hasMissingApiKey) {\r\n missingFields.push('apiKey');\r\n }\r\n\r\n return {\n draft: {\n Providers: [],\n Models: models,\n Router: hasDefaultModel && defaultModelId ? { default: defaultModelId } : {},\n },\n skippedFields,\n needsCompletion: missingFields.length > 0,\n missingFields,\n };\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 { getProviderPreset as getSharedProviderPreset } from '../provider-presets';\nimport { IProviderPreset, IMinimalConfigInput, ISetupConfigDraft, ISetupModelDraft, ProviderPresetKey } from './types';\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 {\n const preset = getSharedProviderPreset(key);\n if (!preset) {\n return undefined;\n }\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 };\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 {\n const models: ISetupModelDraft[] = input.providers.map((p) => {\n const preset = p.preset ? getProviderPreset(p.preset) : undefined;\n const modelDraft: ISetupModelDraft = {\n id: p.name,\n key: p.api_key,\n api_key: p.api_key,\n model: p.models[0] ?? '',\n interface: preset?.interface ?? 'openai',\n protocol: preset?.protocol ?? 'openai',\n };\n\n const explicitApiBaseUrl = p.api_base_url?.trim();\n const presetApiBaseUrl = preset?.api_base_url?.trim();\n const apiBaseUrl = explicitApiBaseUrl || presetApiBaseUrl;\n if (apiBaseUrl) {\n modelDraft.api = apiBaseUrl;\n modelDraft.api_base_url = apiBaseUrl;\n }\n\n return modelDraft;\n });\n\n let defaultModel = input.defaultModel?.trim();\n if (input.defaultModel && input.defaultModel.includes(',')) {\n const [providerName, modelName] = input.defaultModel.split(',');\n const matched = models.find((item) => item.id === providerName && item.model === modelName);\n if (matched) {\n defaultModel = matched.id;\n }\n }\n\n if (input.defaultModel === undefined && models.length > 0) {\n const firstModelId = models[0].id;\n if (firstModelId && models[0].model) {\n defaultModel = firstModelId;\n }\n }\n\n if (defaultModel === '' || defaultModel === undefined) {\n defaultModel = undefined;\n }\n\n return {\n Models: models,\n Router: defaultModel ? { default: defaultModel } : {},\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 | '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') {\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\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;\r\n if (\r\n currentConfigAction === 'create' ||\r\n currentConfigAction === 'overwrite'\r\n ) {\r\n if (detection.legacyConfig.kind === 'found' || detection.legacyConfig.kind === 'read_error') {\r\n legacyConfigAction = await deps.chooseLegacyConfigAction({\r\n legacyConfig: detection.legacyConfig,\r\n });\r\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([\n ...detection.currentConfig.errors,\n ...detection.currentConfig.warnings,\n ]);\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 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';\r\nimport { homedir } from 'os';\r\nimport { join } from 'path';\r\nimport { createInterface } from 'readline/promises';\r\nimport { stdin as input, stdout as output } from 'process';\r\nimport yaml from 'js-yaml';\n\nimport { CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from '../constants';\nimport { listProviderPresetKeys } from '../provider-presets';\nimport { run } from '../index';\nimport { waitForService } from '../service-health';\nimport { backupConfigFile, normalizeAndValidateConfig, writeConfigFile } from '../utils';\nimport { killProcess, readServiceInfo } from '../utils/processCheck';\r\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';\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}\n\ntype TCapabilityChoice = '\u9ED8\u8BA4' | '\u652F\u6301' | '\u7981\u7528';\ntype TCapabilityEditChoice = '\u4FDD\u6301\u5F53\u524D\u503C' | '\u7F16\u8F91 capability';\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 {\r\n const rl = createInterface({ input, output });\r\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) {\r\n output.write(`${message}\\n`);\r\n },\r\n };\r\n}\r\n\r\nfunction readStructuredConfigFile(filePath: string): unknown {\r\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}\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 readLegacyConfig(): Promise<RawLegacyConfigResult> {\r\n const legacyPath = process.env.CTR_SETUP_LEGACY_CONFIG_PATH || join(homedir(), '.ccr', 'config.yaml');\r\n if (!existsSync(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: readStructuredConfigFile(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 probeService() {\r\n const healthy = await waitForService(DEFAULT_CONFIG.PORT, 500);\r\n return healthy ? { kind: 'self_healthy' as const, port: DEFAULT_CONFIG.PORT } : { kind: 'none' as const };\r\n}\r\n\r\nasync function enterClaudeCode(): Promise<void> {\r\n const cliModule = await import('../cli');\r\n await cliModule.runClaudeCode();\r\n}\r\n\r\nasync function executeStart(): Promise<void> {\r\n const childProcess = await import('child_process');\r\n childProcess.spawn(process.execPath, [process.argv[1], 'start', '--daemon'], {\r\n detached: true,\r\n stdio: 'ignore',\r\n env: { ...process.env, CTR_DAEMON: '1' },\r\n }).unref();\r\n}\r\n\r\nasync function executeRestart(): Promise<void> {\r\n const info = readServiceInfo();\r\n if (info) {\r\n try {\r\n killProcess(info.pid);\r\n } catch {\r\n // Ignore stop failures here and rely on the following health check.\r\n }\r\n }\r\n await executeStart();\r\n}\r\n\r\nfunction mapConfigErrorsToRepairFields(errors: string[]) {\n const fields = getRepairFields(errors);\n return fields.includes('manualReview')\n ? { mode: 'manualReview' as const, fields }\n : { mode: 'repair' as const, fields };\n}\n\nfunction toCapabilityBoolean(choice: TCapabilityChoice): boolean | undefined {\n if (choice === '\u652F\u6301') {\n return true;\n }\n if (choice === '\u7981\u7528') {\n return false;\n }\n return undefined;\n}\n\nfunction applyCapabilityMetadata(model: any, metadata?: Record<string, unknown>) {\n if (!metadata || !Object.keys(metadata).length) {\n delete model.metadata;\n return model;\n }\n\n model.metadata = {\n ...(model.metadata ?? {}),\n ...metadata,\n };\n\n if (!Object.keys(model.metadata || {}).length) {\n delete model.metadata;\n }\n\n return model;\n}\n\nasync function promptCapabilityMetadata(io: ISetupIO, currentMetadata?: Record<string, unknown>) {\n const vendorHint = await io.input('Vendor hint\uFF08\u53EF\u9009\uFF09', String(currentMetadata?.vendor_hint ?? ''));\n const reasoningChoice = await io.choose('Reasoning support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\n const toolChoice = await io.choose('Tool support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\n const imageChoice = await io.choose('Image support', ['\u9ED8\u8BA4', '\u652F\u6301', '\u7981\u7528']) as TCapabilityChoice;\n\n const nextMetadata: Record<string, unknown> = {};\n if (vendorHint.trim()) {\n nextMetadata.vendor_hint = vendorHint.trim();\n }\n\n const reasoning = toCapabilityBoolean(reasoningChoice);\n if (reasoning !== undefined) {\n nextMetadata.supports_reasoning = reasoning;\n }\n\n const tools = toCapabilityBoolean(toolChoice);\n if (tools !== undefined) {\n nextMetadata.supports_tools = tools;\n }\n\n const images = toCapabilityBoolean(imageChoice);\n if (images !== undefined) {\n nextMetadata.supports_images = images;\n }\n\n return nextMetadata;\n}\n\nasync function promptCapabilityMetadataForDraft(draft: ISetupConfigDraft, io: ISetupIO) {\n if (!draft.Models?.length) {\n return;\n }\n\n for (const model of draft.Models) {\n const modelLabel = model.id || model.model || 'unnamed-model';\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;\n if (editChoice !== '\u7F16\u8F91 capability') {\n continue;\n }\n\n const metadata = await promptCapabilityMetadata(io, model.metadata);\n applyCapabilityMetadata(model, metadata);\n }\n}\n\r\nfunction toDraftFromConfig(config: any): ISetupConfigDraft {\n const derivedModels = !Array.isArray(config?.Models) && Array.isArray(config?.Providers)\n ? config.Providers.flatMap((provider: any) =>\n (Array.isArray(provider.models) ? provider.models : []).map((model: string) => ({\n id: `${provider.name}_${String(model).toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '')}`,\n key: provider.api_key ?? '',\n api_key: provider.api_key ?? '',\n api: provider.api_base_url,\n api_base_url: provider.api_base_url,\n interface: provider.api_base_url?.includes('/v1/messages') ? 'anthropic' : 'openai',\n protocol: provider.api_base_url?.includes('/v1/messages') ? 'anthropic' : 'openai',\n model,\n }))\n )\n : [];\n\n return {\n Providers: Array.isArray(config?.Providers)\n ? config.Providers.map((provider: any) => ({\n name: provider.name ?? '',\n api_key: provider.api_key ?? '',\n api_base_url: provider.api_base_url,\n models: Array.isArray(provider.models) ? [...provider.models] : [],\n transformer: provider.transformer?.use ? { use: [...provider.transformer.use] } : undefined,\n }))\n : [],\n Models: Array.isArray(config?.Models)\n ? config.Models.map((model: any) => ({\n id: model.id ?? '',\n key: model.key ?? model.api_key ?? '',\n api_key: model.api_key ?? '',\n api: model.api ?? model.api_base_url,\n api_base_url: model.api_base_url,\n interface: model.interface ?? model.protocol,\n protocol: model.protocol,\n model: model.model ?? '',\n thinking: typeof model.thinking === 'string'\n ? model.thinking\n : model.thinking\n ? { ...model.thinking }\n : undefined,\n metadata: model.metadata ? { ...model.metadata } : undefined,\n }))\n : derivedModels,\n Router: {\n default: Array.isArray(config?.Models)\n ? config?.Router?.default\n : Array.isArray(config?.Providers) && typeof config?.Router?.default === 'string' && config.Router.default.includes(',')\n ? derivedModels.find((item) => {\n const [providerName, modelName] = config.Router.default.split(',');\n return item.id.startsWith(`${providerName}_`) && item.model === modelName;\n })?.id\n : config?.Router?.default,\n },\n };\n}\n\r\nasync function buildFreshConfig(io: ISetupIO): Promise<ISetupConfigDraft> {\n const presetOptions = listProviderPresetKeys('setup');\n const preset = await io.choose('\u9009\u62E9 provider \u9884\u8BBE', presetOptions) as ProviderPresetKey;\n const providerName = await io.input('Provider \u540D\u79F0', preset);\n const apiBaseUrl = preset === 'custom' ? await io.input('API Base URL') : await io.input('API Base URL\uFF08\u7559\u7A7A\u4F7F\u7528\u9884\u8BBE\uFF09', '');\n const apiKey = await io.input('API Key');\n const model = await io.input('\u9ED8\u8BA4\u6A21\u578B');\n const capabilityMode = await io.choose('\u662F\u5426\u914D\u7F6E capability \u63D0\u793A', ['\u4FDD\u6301\u9ED8\u8BA4', '\u914D\u7F6E capability \u63D0\u793A']);\n\n const draft = buildMinimalConfig({\n providers: [\n {\n name: providerName,\n api_key: apiKey,\n models: [model],\n preset,\n api_base_url: apiBaseUrl,\n },\n ],\n defaultModel: providerName,\n });\n\n if (capabilityMode === '\u914D\u7F6E capability \u63D0\u793A' && draft.Models?.[0]) {\n await promptCapabilityMetadataForDraft(draft, io);\n }\n\n return draft;\n}\n\r\nasync function completeDraft(input: { draft: ISetupConfigDraft; fields: string[]; io: ISetupIO }): Promise<ISetupConfigDraft> {\r\n const draft = toDraftFromConfig(input.draft);\n\n if (input.fields.includes('defaultModel')) {\n const defaultProvider = draft.Models?.[0]?.id ?? draft.Providers?.[0]?.name ?? 'provider';\n const defaultModel = draft.Models?.[0]?.model ?? draft.Providers?.[0]?.models?.[0] ?? '';\n const model = await input.io.input('\u9ED8\u8BA4\u6A21\u578B', defaultModel);\n if (draft.Models?.[0]) {\n draft.Models[0].model = model;\n draft.Router.default = defaultProvider;\n } else if (draft.Providers?.[0]) {\n draft.Providers[0].models = [model];\n draft.Router.default = `${defaultProvider},${model}`;\n }\n }\n\n if (input.fields.includes('apiKey')) {\n const apiKey = await input.io.input('API Key');\n if (draft.Models?.length) {\n draft.Models = draft.Models.map((model) => ({ ...model, key: model.key || apiKey, api_key: model.api_key || apiKey }));\n } else {\n draft.Providers = draft.Providers?.map((provider) => ({ ...provider, api_key: provider.api_key || apiKey }));\n }\n }\n\n if (input.fields.includes('apiBaseUrl')) {\n const apiBaseUrl = await input.io.input('API Base URL');\n if (draft.Models?.length) {\n draft.Models = draft.Models.map((model) => ({\n ...model,\n api: model.api || apiBaseUrl,\n api_base_url: model.api_base_url || apiBaseUrl,\n }));\n } else {\n draft.Providers = draft.Providers?.map((provider) => ({\n ...provider,\n api_base_url: provider.api_base_url || apiBaseUrl,\n }));\n }\n }\n\n if (input.fields.includes('capabilityHints') && draft.Models?.[0]) {\n await promptCapabilityMetadataForDraft(draft, input.io);\n }\n\n return draft;\n}\n\r\nfunction createDefaultDeps(io = createConsoleIO()): IRunSetupCliDeps {\r\n return {\r\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(DEFAULT_CONFIG.PORT, 5000),\r\n enterClaudeCode,\r\n io,\r\n };\r\n}\r\n\r\nexport async function runSetupCli(customDeps?: Partial<IRunSetupCliDeps>): Promise<void> {\r\n const defaults = createDefaultDeps(customDeps?.io);\r\n const deps = { ...defaults, ...customDeps } as IRunSetupCliDeps;\r\n\r\n await runSetup({\r\n detectSetupEnvironment: () =>\r\n detectSetupEnvironment({\r\n readCurrentConfig: deps.readCurrentConfig,\r\n readLegacyConfig: deps.readLegacyConfig,\r\n probeService: deps.probeService,\r\n }),\r\n chooseCurrentConfigAction: async ({ currentConfig }) => {\r\n if (currentConfig.kind === 'missing') {\r\n return 'create';\r\n }\r\n if (currentConfig.kind === 'valid') {\n deps.io.info('\u68C0\u6D4B\u5230\u73B0\u6709\u53EF\u7528\u914D\u7F6E\u3002');\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', ['reuse', 'overwrite', 'cancel'])) as 'reuse' | 'overwrite' | 'cancel';\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\r\n deps.io.info(`\u5F53\u524D\u914D\u7F6E\u65E0\u6CD5\u89E3\u6790\uFF1A${currentConfig.error}`);\r\n return (await deps.io.choose('\u9009\u62E9\u4E0B\u4E00\u6B65', ['rebuild', 'cancel'])) as 'rebuild' | 'cancel';\r\n },\r\n chooseLegacyConfigAction: async ({ legacyConfig }) => {\r\n if (legacyConfig.kind === 'found') {\r\n return (await deps.io.choose('\u68C0\u6D4B\u5230\u65E7 ccr \u914D\u7F6E\uFF0C\u662F\u5426\u8FC1\u79FB\uFF1F', ['migrate', 'skip'])) as 'migrate' | 'skip';\r\n }\r\n if (legacyConfig.kind === 'read_error') {\r\n deps.io.info(`\u65E7 ccr \u914D\u7F6E\u8BFB\u53D6\u5931\u8D25\uFF1A${legacyConfig.error}`);\r\n }\r\n return 'skip';\r\n },\r\n buildFreshConfig: () => buildFreshConfig(deps.io),\r\n buildRepairConfig: async ({ currentConfig }) => toDraftFromConfig(currentConfig),\r\n completeDraft: ({ draft, fields }) => completeDraft({ draft, fields, io: deps.io }),\r\n migrateLegacyConfig,\r\n mapConfigErrorsToRepairFields,\r\n persistConfig: async ({ config, currentConfigPath, hasExistingConfig }) => {\n const normalized = normalizeAndValidateConfig(config as any);\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 }) => {\r\n const action = decideServiceAction({\r\n configChanged,\r\n detectedService,\r\n reloadSupported,\r\n });\r\n\r\n await applyServiceAction({\r\n action,\r\n executeStart: deps.executeStart,\r\n executeReload: deps.executeReload,\r\n executeRestart: deps.executeRestart,\r\n verifyHealth: deps.verifyHealth,\r\n });\r\n\r\n return {\r\n action: action.kind,\r\n healthChecked: true,\r\n };\r\n },\r\n enterClaudeCode: deps.enterClaudeCode,\r\n reloadSupported: false,\r\n });\r\n}\r\n", "/**\n * CLI Entry Point\n *\n * \u547D\u4EE4\u884C\u5165\u53E3\n */\r\n\r\nimport { spawn } from \"child_process\";\r\nimport { join, dirname } from \"path\";\r\nimport open from \"openurl\";\r\nimport { existsSync, readFileSync, copyFileSync, mkdirSync } from \"fs\";\r\nimport { run, initializeClaudeConfig } from \"./index\";\r\nimport { isServiceRunning, killProcess, readServiceInfo } from \"./utils/processCheck\";\r\nimport { CONFIG_DIR, CONFIG_FILE, CONFIG_FILE_JSON, CONFIG_FILE_YML, DEFAULT_CONFIG } from \"./constants\";\r\nimport { waitForService } from \"./service-health\";\r\nimport { runSetupCli } from \"./setup\";\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 {\r\n const args = getArgs();\r\n const index = args.indexOf(flag) !== -1 ? args.indexOf(flag) : shortFlag ? args.indexOf(shortFlag) : -1;\r\n return index !== -1 ? args[index + 1] : undefined;\r\n}\r\n\r\n/**\r\n * \u4ECE\u547D\u4EE4\u884C\u53C2\u6570\u6216\u914D\u7F6E\u6587\u4EF6\u4E2D\u83B7\u53D6\u7AEF\u53E3\u53F7\r\n */\r\nfunction getPort(): number {\r\n // \u4F18\u5148\u4F7F\u7528\u547D\u4EE4\u884C\u53C2\u6570\r\n const portValue = getArgValue(\"--port\", \"-p\");\r\n if (portValue) {\r\n return parseInt(portValue, 10);\r\n }\r\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() {\r\n console.log(`\r\nClaude Trigger Router - \u667A\u80FD\u89E6\u53D1\u8DEF\u7531\u5668\r\n\r\n\u7528\u6CD5\uFF1Actr <\u547D\u4EE4> [\u9009\u9879]\r\n\r\n\u547D\u4EE4\uFF1A\r\n setup \u9996\u6B21\u4F7F\u7528\u5411\u5BFC\uFF08\u63A8\u8350\u65B0\u624B\uFF09\r\n init \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6\uFF08\u4ECE\u793A\u4F8B\u6A21\u677F\u590D\u5236\uFF09\r\n start \u542F\u52A8\u8DEF\u7531\u670D\u52A1\uFF08\u9ED8\u8BA4\u524D\u53F0\u8FD0\u884C\uFF09\r\n stop \u505C\u6B62\u540E\u53F0\u670D\u52A1\r\n restart \u91CD\u542F\u540E\u53F0\u670D\u52A1\r\n status \u67E5\u770B\u670D\u52A1\u8FD0\u884C\u72B6\u6001\uFF08PID\u3001\u7AEF\u53E3\u3001\u542F\u52A8\u65F6\u95F4\uFF09\r\n code \u901A\u8FC7\u8DEF\u7531\u5668\u8FD0\u884C Claude Code\uFF08\u9700\u5148\u542F\u52A8\u670D\u52A1\uFF09\r\n ui \u6253\u5F00\u7BA1\u7406 API \u8BF4\u660E\u9875\uFF08Web UI \u5F00\u53D1\u4E2D\uFF09\r\n help \u663E\u793A\u6B64\u5E2E\u52A9\u4FE1\u606F\r\n\r\n\u9009\u9879\uFF1A\r\n --port, -p \u6307\u5B9A\u76D1\u542C\u7AEF\u53E3\uFF08\u9ED8\u8BA4\uFF1A3456\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 # \u9996\u6B21\u4F7F\u7528\u5411\u5BFC\uFF08\u63A8\u8350\uFF09\r\n ctr init # \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6\r\n ctr start # \u524D\u53F0\u542F\u52A8\uFF08\u63A8\u8350\u9996\u6B21\u4F7F\u7528\uFF0C\u4FBF\u4E8E\u67E5\u770B\u65E5\u5FD7\uFF09\r\n ctr start --daemon # \u540E\u53F0\u542F\u52A8\r\n ctr status # \u67E5\u770B\u670D\u52A1\u72B6\u6001\r\n ctr code # \u542F\u52A8 Claude Code\uFF08\u9700\u5148\u8FD0\u884C ctr start\uFF09\r\n ctr stop # \u505C\u6B62\u540E\u53F0\u670D\u52A1\r\n ctr restart --daemon # \u91CD\u542F\u540E\u53F0\u670D\u52A1\r\n\r\n\u914D\u7F6E\u6587\u4EF6\uFF1A\r\n ${CONFIG_FILE}\r\n ${CONFIG_FILE_JSON}\r\n\r\n\u914D\u7F6E\u76EE\u5F55\uFF1A${CONFIG_DIR}\r\n\r\n\u66F4\u591A\u4FE1\u606F\uFF1Ahttps://github.com/peterwangze/claude-trigger-router\r\n`);\r\n}\r\n\r\n/**\r\n * \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6\r\n */\r\nfunction initConfig() {\r\n const force = hasArg(\"--force\");\r\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)) {\r\n mkdirSync(CONFIG_DIR, { recursive: true });\r\n }\r\n\r\n // \u67E5\u627E\u793A\u4F8B\u914D\u7F6E\u6587\u4EF6\r\n const examplePaths = [\r\n join(__dirname, \"..\", \"config\", \"trigger.example.yaml\"),\r\n join(dirname(process.argv[1]), \"..\", \"config\", \"trigger.example.yaml\"),\r\n ];\r\n\r\n const exampleFile = examplePaths.find((p) => existsSync(p));\r\n\r\n if (!exampleFile) {\r\n console.error(\"\u274C \u627E\u4E0D\u5230\u793A\u4F8B\u914D\u7F6E\u6587\u4EF6\u3002\");\r\n console.log(` \u8BF7\u624B\u52A8\u521B\u5EFA ${CONFIG_FILE}`);\r\n console.log(\" \u53C2\u8003\u6587\u6863\uFF1Ahttps://github.com/peterwangze/claude-trigger-router#configuration\");\r\n process.exit(1);\r\n }\r\n\r\n try {\r\n copyFileSync(exampleFile, CONFIG_FILE);\r\n const action = force ? \"\u5DF2\u8986\u76D6\" : \"\u5DF2\u521B\u5EFA\";\r\n console.log(`\u2705 \u914D\u7F6E\u6587\u4EF6${action}\uFF1A${CONFIG_FILE}`);\r\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 'Providers' \u4E0B\u914D\u7F6E\u4F60\u7684\u6A21\u578B\u63D0\u4F9B\u5546\");\r\n console.log(\" 3. \u5C06 'Router.default' \u8BBE\u7F6E\u4E3A\u4F60\u7684\u9ED8\u8BA4\u6A21\u578B\");\r\n console.log(\" 4. \u5728 'TriggerRouter.rules' \u4E0B\u81EA\u5B9A\u4E49\u89E6\u53D1\u89C4\u5219\");\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) {\r\n console.log(\"\uD83D\uDE80 Starting Claude Trigger Router (foreground)...\");\r\n console.log(\" Press Ctrl+C to stop\");\r\n\r\n try {\r\n await run({ port });\r\n } catch (error: any) {\r\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\nfunction startDaemon(port?: number) {\r\n if (isServiceRunning()) {\r\n console.log(\"\u2705 Service is already running in the background.\");\r\n return;\r\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, {\r\n detached: true,\r\n stdio: \"ignore\",\r\n env: { ...process.env, CTR_DAEMON: \"1\" },\r\n });\r\n\r\n child.unref();\r\n\r\n // \u7B49\u5F85\u670D\u52A1\u542F\u52A8\uFF08\u6700\u591A 5 \u79D2\uFF09\r\n const targetPort = port ?? getPort();\r\n let waited = 0;\r\n const interval = setInterval(() => {\r\n waited += 500;\r\n if (isServiceRunning()) {\r\n clearInterval(interval);\r\n console.log(`\u2705 Service started in background (port: ${targetPort})`);\r\n console.log(` Run 'ctr stop' to stop it.`);\r\n } else if (waited >= 5000) {\r\n clearInterval(interval);\r\n console.log(`\u2705 Service launched in background (port: ${targetPort})`);\r\n console.log(` If it fails to start, run 'ctr start' (without --daemon) to see errors.`);\r\n }\r\n }, 500);\r\n}\r\n\r\n/**\r\n * \u663E\u793A\u670D\u52A1\u72B6\u6001\r\n */\r\nfunction showStatus() {\r\n const info = readServiceInfo();\r\n if (!info || !isServiceRunning()) {\r\n console.log(\"\u23F9 \u670D\u52A1\u672A\u8FD0\u884C\");\r\n return;\r\n }\r\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\nfunction restartService() {\r\n stopService();\r\n setTimeout(() => startDaemon(getPort()), 1500);\r\n}\r\n\r\n/**\r\n * \u8FD0\u884C Claude Code\r\n */\r\nexport async function runClaudeCode() {\r\n const port = getPort();\r\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) {\r\n console.log(`\u26A0\uFE0F Trigger Router service is not running on port ${port}.`);\r\n console.log(\"\");\r\n console.log(\"Options:\");\r\n console.log(\" 1. Start service first: ctr start --daemon\");\r\n console.log(\" 2. Or start interactively in another terminal: ctr start\");\r\n console.log(\"\");\r\n const proceed = process.env.CTR_AUTO_START === \"1\";\r\n if (!proceed) {\r\n process.exit(1);\r\n }\r\n }\r\n\r\n console.log(`\uD83D\uDE80 Starting Claude Code with Trigger Router (port: ${port})...`);\r\n\r\n // \u542F\u52A8 Claude Code\uFF08Windows \u4E0A npm \u5168\u5C40\u547D\u4EE4\u4E3A .cmd shim\uFF0C\u9700\u8981 shell: true\uFF09\r\n const isWindows = process.platform === \"win32\";\r\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\nfunction openUI() {\r\n const port = getPort();\r\n const url = `http://127.0.0.1:${port}/ui`;\r\n\r\n console.log(`\uD83C\uDF10 Opening UI at ${url}`);\r\n\r\n try {\r\n open(url);\r\n } catch (error: any) {\r\n console.log(` Please open ${url} in your browser`);\r\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\":\r\n await runSetupCli();\r\n break;\r\n\r\n case \"init\":\r\n initConfig();\r\n break;\r\n\r\n case \"start\":\r\n if (isDaemonMode()) {\r\n startDaemon(getPort());\r\n } else {\r\n await startForeground(getPort());\r\n }\r\n break;\r\n\r\n case \"stop\":\r\n stopService();\r\n break;\r\n\r\n case \"status\":\r\n showStatus();\r\n break;\r\n\r\n case \"restart\":\r\n restartService();\r\n break;\r\n\r\n case \"code\":\r\n await runClaudeCode();\r\n break;\r\n\r\n case \"ui\":\r\n openUI();\r\n break;\r\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": ["providers", "modelMap", "router", "import_path", "input", "import_fs", "import_path", "import_lru_cache", "input", "input", "import_lru_cache", "event", "output", "input", "import_fs", "import_path", "Server", "spawn", "join", "event", "import_fs", "event", "output", "import_lru_cache", "init_types", "import_lru_cache", "import_lru_cache", "import_lru_cache", "init_types", "input", "input", "JSON5", "done", "import_fs", "import_promises", "import_os", "import_path", "input", "input", "getProviderPreset", "input", "input", "input", "input", "output", "yaml", "import_fs", "import_os", "import_path", "import_promises", "init_setup", "yaml", "initConfig", "open", "import_child_process", "import_path", "import_fs", "init_setup"]
|
|
7
7
|
}
|