@lynn123411/dsh-a6api 1.1.0 → 1.2.0

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/lib/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server/catalog.ts", "../src/server/a6api-client.ts", "../src/server/probe.ts", "../src/server/sync.ts", "../src/index.ts"],
4
- "sourcesContent": ["import type { A6ApiModelMeta } from '../types.js';\n\nexport const A6API_CATALOG: Record<string, A6ApiModelMeta> = {\n // --- OpenAI Series ---\n 'gpt-5.6-sol': {\n id: 'gpt-5.6-sol',\n name: 'GPT-5.6 Sol',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.6-terra': {\n id: 'gpt-5.6-terra',\n name: 'GPT-5.6 Terra',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.6-luna': {\n id: 'gpt-5.6-luna',\n name: 'GPT-5.6 Luna',\n brand: 'OpenAI',\n contextWindow: 524288,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'gpt-5.6': {\n id: 'gpt-5.6',\n name: 'GPT-5.6',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.5': {\n id: 'gpt-5.5',\n name: 'GPT-5.5',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'gpt-5.4': {\n id: 'gpt-5.4',\n name: 'GPT-5.4',\n brand: 'OpenAI',\n contextWindow: 524288,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 2500000, output: 10000000, cacheRead: 250000, cacheWrite: 3000000 },\n },\n 'gpt-5.4-mini': {\n id: 'gpt-5.4-mini',\n name: 'GPT-5.4 Mini',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 150000, output: 600000, cacheRead: 75000, cacheWrite: 150000 },\n },\n 'gpt-5.3-codex': {\n id: 'gpt-5.3-codex',\n name: 'GPT-5.3 Codex',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 200000, cacheWrite: 2000000 },\n },\n 'gpt-5.3-codex-spark': {\n id: 'gpt-5.3-codex-spark',\n name: 'GPT-5.3 Codex Spark',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 100000, cacheWrite: 1000000 },\n },\n 'gpt-5.2': {\n id: 'gpt-5.2',\n name: 'GPT-5.2',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 200000, cacheWrite: 2000000 },\n },\n 'gpt-4o': {\n id: 'gpt-4o',\n name: 'GPT-4o',\n brand: 'OpenAI',\n contextWindow: 128000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2500000, output: 10000000, cacheRead: 1250000, cacheWrite: 2500000 },\n },\n 'gpt-4o-mini': {\n id: 'gpt-4o-mini',\n name: 'GPT-4o Mini',\n brand: 'OpenAI',\n contextWindow: 128000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 150000, output: 600000, cacheRead: 75000, cacheWrite: 150000 },\n },\n\n // --- Anthropic Claude Series ---\n 'claude-opus-5': {\n id: 'claude-opus-5',\n name: 'Claude Opus 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'anthropic',\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-sonnet-5': {\n id: 'claude-sonnet-5',\n name: 'Claude Sonnet 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'anthropic',\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-fable-5': {\n id: 'claude-fable-5',\n name: 'Claude Fable 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-opus-4-8': {\n id: 'claude-opus-4-8',\n name: 'Claude Opus 4.8',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-opus-4-7': {\n id: 'claude-opus-4-7',\n name: 'Claude Opus 4.7',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-opus-4-6': {\n id: 'claude-opus-4-6',\n name: 'Claude Opus 4.6',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-sonnet-4-6': {\n id: 'claude-sonnet-4-6',\n name: 'Claude Sonnet 4.6',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-haiku-4-5': {\n id: 'claude-haiku-4-5',\n name: 'Claude Haiku 4.5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 8192,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 250000, output: 1250000, cacheRead: 25000, cacheWrite: 312500 },\n },\n\n // --- DeepSeek Series ---\n 'deepseek-v4-pro': {\n id: 'deepseek-v4-pro',\n name: 'DeepSeek V4 Pro',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n 'deepseek-v4-flash': {\n id: 'deepseek-v4-flash',\n name: 'DeepSeek V4 Flash',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'DeepSeek-V4-Flash-0731': {\n id: 'DeepSeek-V4-Flash-0731',\n name: 'DeepSeek V4 Flash (0731)',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-v4-pro-0813': {\n id: 'deepseek-v4-pro-0813',\n name: 'DeepSeek V4 Pro (0813)',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n 'deepseek-v4-flash-vision-exp': {\n id: 'deepseek-v4-flash-vision-exp',\n name: 'DeepSeek V4 Flash Vision Exp',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-chat': {\n id: 'deepseek-chat',\n name: 'DeepSeek Chat',\n brand: 'DeepSeek',\n contextWindow: 65536,\n maxTokens: 8192,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-reasoner': {\n id: 'deepseek-reasoner',\n name: 'DeepSeek Reasoner',\n brand: 'DeepSeek',\n contextWindow: 65536,\n maxTokens: 16384,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n\n // --- Google Gemini Series ---\n 'gemini-3.7-flash': {\n id: 'gemini-3.7-flash',\n name: 'Gemini 3.7 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 100000, output: 400000, cacheRead: 25000, cacheWrite: 100000 },\n },\n 'gemini-3.6-flash': {\n id: 'gemini-3.6-flash',\n name: 'Gemini 3.6 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 100000, output: 400000, cacheRead: 25000, cacheWrite: 100000 },\n },\n 'gemini-3.5-flash': {\n id: 'gemini-3.5-flash',\n name: 'Gemini 3.5 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-3.5-flash-high': {\n id: 'gemini-3.5-flash-high',\n name: 'Gemini 3.5 Flash High',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { high: 'high' },\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-3.1-pro-preview': {\n id: 'gemini-3.1-pro-preview',\n name: 'Gemini 3.1 Pro Preview',\n brand: 'Google',\n contextWindow: 2097152,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 1250000, output: 5000000, cacheRead: 312500, cacheWrite: 1250000 },\n },\n 'gemini-3.1-flash-lite-preview': {\n id: 'gemini-3.1-flash-lite-preview',\n name: 'Gemini 3.1 Flash Lite Preview',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-2.5-pro': {\n id: 'gemini-2.5-pro',\n name: 'Gemini 2.5 Pro',\n brand: 'Google',\n contextWindow: 2097152,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 1250000, output: 5000000, cacheRead: 312500, cacheWrite: 1250000 },\n },\n 'gemini-2.5-flash': {\n id: 'gemini-2.5-flash',\n name: 'Gemini 2.5 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n\n // --- xAI Grok Series ---\n 'grok-4.6': {\n id: 'grok-4.6',\n name: 'Grok 4.6',\n brand: 'xAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', high: 'high' },\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'grok-4.5': {\n id: 'grok-4.5',\n name: 'Grok 4.5',\n brand: 'xAI',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'grok-4.3': {\n id: 'grok-4.3',\n name: 'Grok 4.3',\n brand: 'xAI',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n\n // --- Zhipu GLM Series ---\n 'glm-5.3': {\n id: 'glm-5.3',\n name: 'GLM 5.3',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n 'glm-5.3-flash': {\n id: 'glm-5.3-flash',\n name: 'GLM 5.3 Flash',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 100000, output: 200000, cacheRead: 10000, cacheWrite: 100000 },\n },\n 'glm-5.2': {\n id: 'glm-5.2',\n name: 'GLM 5.2',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n\n // --- Moonshot Kimi Series ---\n 'kimi-k3': {\n id: 'kimi-k3',\n name: 'Kimi K3',\n brand: 'Moonshot',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 1500000, output: 6000000, cacheRead: 300000, cacheWrite: 1500000 },\n },\n 'kimi-k2.7-code': {\n id: 'kimi-k2.7-code',\n name: 'Kimi K2.7 Code',\n brand: 'Moonshot',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n\n // --- Alibaba Qwen Series ---\n 'qwen3.8-max': {\n id: 'qwen3.8-max',\n name: 'Qwen 3.8 Max',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 400000, cacheWrite: 2000000 },\n },\n 'qwen3.8-flash': {\n id: 'qwen3.8-flash',\n name: 'Qwen 3.8 Flash',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 100000, output: 300000, cacheRead: 20000, cacheWrite: 100000 },\n },\n 'qwen3.7-max': {\n id: 'qwen3.7-max',\n name: 'Qwen 3.7 Max',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 400000, cacheWrite: 2000000 },\n },\n\n // --- MiniMax Series ---\n 'minimax-m3': {\n id: 'minimax-m3',\n name: 'MiniMax M3',\n brand: 'MiniMax',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n};\n\n/** Infer Brand from model name if not in catalog. */\nexport function inferBrand(modelId: string): string {\n const m = modelId.toLowerCase();\n if (m.startsWith('gpt') || m.startsWith('o1') || m.startsWith('o3') || m.startsWith('chatgpt')) return 'OpenAI';\n if (m.startsWith('claude')) return 'Anthropic';\n if (m.startsWith('gemini') || m.startsWith('google') || m.startsWith('imagen')) return 'Google';\n if (m.startsWith('deepseek')) return 'DeepSeek';\n if (m.startsWith('grok')) return 'xAI';\n if (m.startsWith('glm') || m.startsWith('zhipu') || m.startsWith('cog')) return 'Zhipu';\n if (m.startsWith('kimi') || m.startsWith('moonshot')) return 'Moonshot';\n if (m.startsWith('qwen')) return 'Alibaba';\n if (m.startsWith('minimax')) return 'MiniMax';\n if (m.startsWith('mimo') || m.startsWith('xiaomi')) return 'Xiaomi';\n if (m.startsWith('hunyuan') || m.startsWith('tencent') || m.startsWith('hy')) return 'Tencent';\n return 'Other';\n}\n\n/** Resolve metadata for any model ID, falling back to safe defaults. */\nexport function resolveModelMeta(modelId: string): A6ApiModelMeta {\n if (A6API_CATALOG[modelId]) {\n return A6API_CATALOG[modelId];\n }\n // Case-insensitive lookup\n const lowerId = modelId.toLowerCase();\n for (const [k, v] of Object.entries(A6API_CATALOG)) {\n if (k.toLowerCase() === lowerId) {\n return v;\n }\n }\n const brand = inferBrand(modelId);\n const isVision = lowerId.includes('vision') || lowerId.includes('vl') || lowerId.includes('image');\n const hasReasoning = lowerId.includes('think') || lowerId.includes('reason') || lowerId.includes('pro') || lowerId.includes('sol');\n\n return {\n id: modelId,\n name: modelId,\n brand,\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: isVision ? ['text', 'image'] : ['text'],\n ...(hasReasoning ? { thinkingFormat: 'deepseek' } : {}),\n };\n}\n", "import type { BalanceInfo, MerchantChannelInfo, OfficialPrices, ApiRoutingLogItem } from '../types.js';\nimport { resolveModelMeta } from './catalog.js';\n\n/** Normalize Base URL removing trailing slashes */\nexport function cleanBaseUrl(url: string): string {\n if (!url) return 'https://api.a6api.com';\n return url.trim().replace(/\\/+$/, '');\n}\n\n/** Format relative time */\nexport function formatRelativeTime(timestampSec: number): string {\n if (!timestampSec || timestampSec <= 0) return '\u521A\u521A';\n const now = Math.floor(Date.now() / 1000);\n const diff = now - timestampSec;\n if (diff < 0) return '\u521A\u521A';\n if (diff < 60) return '\u521A\u521A';\n if (diff < 3600) return `${Math.floor(diff / 60)} \u5206\u949F\u524D`;\n if (diff < 86400) return `${Math.floor(diff / 3600)} \u5C0F\u65F6\u524D`;\n return `${Math.floor(diff / 86400)} \u5929\u524D`;\n}\n\n/** Format CNY Price */\nexport function formatCnyPrice(micros: number, exchangeRate = 6.7209): string {\n if (micros === undefined || micros === null) return '\u2014';\n if (micros === 0) return '\u00A50';\n const usd = micros / 1_000_000;\n const cny = usd * exchangeRate;\n if (cny < 0.0001) return `\u00A5${cny.toFixed(6)}`;\n if (cny < 0.01) return `\u00A5${cny.toFixed(4)}`;\n if (cny < 1) return `\u00A5${cny.toFixed(4)}`;\n return `\u00A5${cny.toFixed(3)}`;\n}\n\nexport function buildWebHeaders(userId?: string, sessionCookie?: string): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',\n };\n const uid = userId ? String(userId).trim() : '';\n if (uid) {\n headers['New-Api-User'] = uid;\n }\n if (sessionCookie && sessionCookie.trim()) {\n const raw = sessionCookie.trim();\n if (raw.startsWith('session=')) {\n headers['Cookie'] = raw;\n } else if (raw.includes(';')) {\n headers['Cookie'] = raw;\n } else {\n // Set both Authorization (for System Access Token) and Cookie fallback\n headers['Authorization'] = raw;\n headers['Cookie'] = `session=${raw}`;\n }\n }\n return headers;\n}\n\n/** Fetch User Balance (Real Account Balance Only) */\nexport async function fetchBalance(\n baseURL: string,\n apiKey: string,\n userId?: string,\n sessionCookie?: string,\n): Promise<BalanceInfo | null> {\n const cleanUrl = cleanBaseUrl(baseURL);\n\n let hasAccountAuth = false;\n let accountBalanceUsd = 0;\n let accountBalanceFormatted = '\u672A\u8FDE\u63A5';\n let accountBalanceCnyFormatted = '';\n let username: string | undefined;\n let responseUserId: string | number | undefined = userId;\n let usedUsd = 0;\n let requestCount = 0;\n\n // 1. Fetch real account balance from Web Console API\n if (userId || sessionCookie) {\n const candidates = ['https://a6api.com/api/user/self', `${cleanUrl}/api/user/self`];\n const uniqueCandidates = [...new Set(candidates)];\n\n for (const url of uniqueCandidates) {\n try {\n const res = await fetch(url, {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(6000),\n });\n if (res.ok) {\n const json = await res.json();\n if (json?.data && json.data.quota !== undefined) {\n const quota = Number(json.data.quota || 0);\n const rawUsed = Number(json.data.used_quota || 0);\n const usd = Number((quota / 500000).toFixed(4));\n const cny = Number((usd * 6.7209).toFixed(2));\n const used = Number((rawUsed / 500000).toFixed(4));\n\n hasAccountAuth = true;\n accountBalanceUsd = usd;\n accountBalanceFormatted = `$${usd.toFixed(2)}`;\n accountBalanceCnyFormatted = `\u2248 \u00A5${cny.toFixed(2)}`;\n usedUsd = used;\n requestCount = Number(json.data.request_count || 0);\n username = json.data.username || json.data.display_name || undefined;\n if (json.data.id) responseUserId = json.data.id;\n break;\n }\n }\n } catch {\n // continue candidate\n }\n }\n }\n\n // 2. If only API Key is present, query usage for consumed statistics if auth is not yet connected\n if (!hasAccountAuth && apiKey && apiKey.trim()) {\n try {\n const usageRes = await fetch(`${cleanUrl}/v1/dashboard/billing/usage?start_date=2024-01-01&end_date=2030-12-31`, {\n headers: {\n Authorization: `Bearer ${apiKey.trim()}`,\n Accept: 'application/json',\n },\n signal: AbortSignal.timeout(6000),\n }).catch(() => null);\n\n if (usageRes && usageRes.ok) {\n const usageJson = await usageRes.json();\n usedUsd = Number(usageJson?.total_usage || 0);\n }\n } catch {}\n }\n\n if (!hasAccountAuth && (!apiKey || !apiKey.trim()) && (!userId || !userId.trim())) {\n return null;\n }\n\n return {\n hasAccountAuth,\n accountBalanceUsd,\n accountBalanceFormatted,\n accountBalanceCnyFormatted,\n usedUsd,\n usedFormatted: `$${usedUsd.toFixed(2)}`,\n requestCount,\n username,\n userId: responseUserId,\n isLow: hasAccountAuth ? accountBalanceUsd < 0.5 : false,\n updatedAt: Date.now(),\n };\n}\n\n/** Fetch Token Allowed Models */\nexport async function fetchTokenModels(baseURL: string, apiKey: string): Promise<string[]> {\n const cleanUrl = cleanBaseUrl(baseURL);\n if (!apiKey || !apiKey.trim()) return [];\n\n const endpoints = [`${cleanUrl}/v1/models`, `${cleanUrl}/models`];\n let lastErr = null;\n\n for (const url of endpoints) {\n try {\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${apiKey.trim()}`,\n Accept: 'application/json',\n },\n signal: AbortSignal.timeout(8000),\n });\n if (res.ok) {\n const json = await res.json();\n if (Array.isArray(json?.data)) {\n return json.data.map((m: any) => String(m.id || m.name)).filter(Boolean);\n }\n }\n } catch (err) {\n lastErr = err;\n }\n }\n\n if (lastErr) {\n console.warn('[dsh-a6api] fetchTokenModels failed:', lastErr);\n }\n return [];\n}\n\n/** Fetch Recent User Routing Logs */\nexport async function fetchRecentLogs(\n userId?: string,\n sessionCookie?: string,\n limit = 30,\n): Promise<ApiRoutingLogItem[]> {\n if (!userId && !sessionCookie) return [];\n try {\n const res = await fetch(`https://a6api.com/api/log/self?p=1&page_size=${limit}&type=0`, {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(8000),\n });\n if (res.ok) {\n const json = await res.json();\n if (Array.isArray(json?.data?.items)) {\n return json.data.items.map((it: any) => {\n const rawQuota = Number(it.quota || 0);\n const costUsd = rawQuota / 500000;\n let costFormatted = '$0.00';\n if (costUsd > 0) {\n if (costUsd < 0.0001) costFormatted = `$${costUsd.toFixed(6)}`;\n else if (costUsd < 0.01) costFormatted = `$${costUsd.toFixed(4)}`;\n else costFormatted = `$${costUsd.toFixed(4)}`;\n }\n\n const rawChannel = Number(it.channel || 0);\n let channelId: number | undefined = rawChannel > 0 ? rawChannel : undefined;\n if (!channelId && it.other) {\n try {\n const otherObj = JSON.parse(it.other);\n if (otherObj.actual_channel_id && Number(otherObj.actual_channel_id) > 0) {\n channelId = Number(otherObj.actual_channel_id);\n } else if (otherObj.billed_channel_id && Number(otherObj.billed_channel_id) > 0) {\n channelId = Number(otherObj.billed_channel_id);\n }\n } catch {}\n }\n\n const isError =\n it.type !== 2 ||\n (it.other && (\n it.other.includes('\"request_final_status\":\"failed\"') ||\n it.other.includes('\"request_final_status\":\"error\"') ||\n it.other.includes('\"request_final_status\":\"upstream_error\"')\n )) ||\n Boolean(it.content && it.content.startsWith('status_code='));\n\n return {\n id: it.id || it.request_id || String(Math.random()),\n created_at: Number(it.created_at || Date.now() / 1000),\n model_name: it.model_name || it.marketplace_model_name || '',\n channel: channelId,\n channel_name: it.channel_name || (channelId ? `\u5546\u6237 #${channelId}` : undefined),\n prompt_tokens: Number(it.prompt_tokens || 0),\n completion_tokens: Number(it.completion_tokens || 0),\n use_time: Number(it.use_time || 0),\n quota: rawQuota,\n cost_usd: costUsd,\n cost_formatted: costFormatted,\n token_name: it.token_name || 'API',\n status: isError ? ('error' as const) : ('success' as const),\n other: it.other,\n raw: it,\n };\n });\n }\n }\n } catch (err) {\n console.warn('[dsh-a6api] fetchRecentLogs error:', err);\n }\n return [];\n}\n\n/** Fetch Channel Card details from A6API Marketplace */\nexport async function fetchChannelDetails(\n channelId: number,\n userId?: string,\n sessionCookie?: string,\n targetModelName?: string,\n logSnapshot?: any,\n): Promise<MerchantChannelInfo | null> {\n if (!channelId) return null;\n const targetName = targetModelName || '';\n const meta = resolveModelMeta(targetName);\n\n try {\n const res = await fetch(\n `https://a6api.com/api/marketplace/channels/search?channel_id=${channelId}&view=list&page=1&page_size=20`,\n {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(8000),\n },\n );\n if (res.ok) {\n const json = await res.json();\n const items: any[] = json?.data?.items || [];\n if (items.length > 0) {\n // Find match for targetModelName if provided, otherwise first item\n const item =\n (targetName\n ? items.find((it) => it.model_name?.toLowerCase() === targetName.toLowerCase())\n : null) || items[0];\n\n const rate = Number(item.realtime_ratio_exchange_rate || 6.7209);\n const inMicros = Number(item.input_price_micros || 0);\n const outMicros = Number(item.output_price_micros || 0);\n const cacheReadMicros = Number(item.cache_read_price_micros || 0);\n const cacheWriteMicros = Number(item.cache_write_price_micros || 0);\n\n // Parse Smart Routing Labels\n const labels: string[] = [];\n if (item.authenticity_guaranteed) {\n const badge = item.authenticity_guarantee_badge_key;\n if (badge === 'gold') labels.push('\u4FDD\u771F \u00B7 \u91D1\u6807');\n else if (badge === 'silver') labels.push('\u4FDD\u771F \u00B7 \u94F6\u6807');\n else if (badge === 'bronze') labels.push('\u4FDD\u771F \u00B7 \u94DC\u6807');\n else labels.push('\u4FDD\u771F');\n }\n if (Array.isArray(item.smart_routing_labels)) {\n for (const l of item.smart_routing_labels) {\n if (l === 'stable' && !labels.includes('\u7A33\u5B9A')) labels.push('\u7A33\u5B9A');\n if (l === 'cheap' && !labels.includes('\u4F4E\u4EF7')) labels.push('\u4F4E\u4EF7');\n if (l === 'fast' && !labels.includes('\u9AD8\u901F')) labels.push('\u9AD8\u901F');\n if (l === 'quality' && !labels.includes('\u9AD8\u8D28')) labels.push('\u9AD8\u8D28');\n }\n }\n if (labels.length === 0) {\n labels.push('\u7A33\u5B9A', '\u4F4E\u4EF7', '\u9AD8\u901F', '\u9AD8\u8D28');\n }\n\n // Official Prices\n let official_price: OfficialPrices | undefined;\n if (item.official_price && item.official_price.input_price_micros !== undefined) {\n const offIn = Number(item.official_price.input_price_micros || 0);\n const offOut = Number(item.official_price.output_price_micros || 0);\n const offCR = Number(item.official_price.cache_read_price_micros || 0);\n const offCW = Number(item.official_price.cache_write_price_micros || 0);\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n } else if (meta.officialPriceMicros) {\n const offIn = meta.officialPriceMicros.input;\n const offOut = meta.officialPriceMicros.output;\n const offCR = meta.officialPriceMicros.cacheRead;\n const offCW = meta.officialPriceMicros.cacheWrite;\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n }\n\n const successRate24h =\n item.success_rate_24h !== undefined ? Number(item.success_rate_24h) / 100 : 99.3;\n const recentSuccessRate =\n item.recent_success_rate !== undefined ? Number(item.recent_success_rate) / 100 : 100;\n const cacheHitRate =\n item.cache_hit_rate_24h !== undefined ? Number(item.cache_hit_rate_24h) / 100 : 72.0;\n const lastSuccessAt = Number(item.last_success_at || item.last_test_time || 0);\n\n const ratioCny = Number(item.realtime_ratio_cny || (inMicros / 1000000) * rate || 0.0341);\n const ratioFormatted = ratioCny.toFixed(4);\n\n return {\n listing_id: item.listing_id,\n channel_id: item.channel_id,\n channel_name: item.channel_name || `\u5546\u6237 #${channelId}`,\n supplier_name: item.supplier_name || item.supplier_nickname || 'GPT\u4F4E\u4EF7',\n supplier_id: item.supplier_id || 290,\n model_name: item.model_name || targetName,\n brand: item.brand || meta.brand || 'OpenAI',\n description: item.description || '\u9AD8\u5E76\u53D1 \u4E3B\u6253\u4FBF\u5B9C \u7A33\u5B9A',\n charge_type: item.charge_type || 'per_token',\n charge_type_text: item.charge_type === 'per_token' ? '\u6309\u91CF' : '\u6309\u91CF',\n sample_count: Number(item.sample_count || 100),\n sample_count_text: `\u8FD1 ${item.sample_count || 100} \u6B21\u6837\u672C`,\n input_price_micros: inMicros,\n output_price_micros: outMicros,\n cache_read_price_micros: cacheReadMicros,\n cache_write_price_micros: cacheWriteMicros,\n input_price_cny: formatCnyPrice(inMicros, rate),\n output_price_cny: formatCnyPrice(outMicros, rate),\n cache_read_price_cny: formatCnyPrice(cacheReadMicros, rate),\n cache_write_price_cny: formatCnyPrice(cacheWriteMicros, rate),\n official_price,\n realtime_ratio_cny: ratioCny,\n realtime_ratio_formatted: ratioFormatted,\n recent_success_rate_pct: recentSuccessRate,\n success_rate_24h_pct: successRate24h,\n success_rate_7d_pct: item.success_rate_7d !== undefined ? Number(item.success_rate_7d) / 100 : undefined,\n success_buckets: Array.isArray(item.success_buckets) ? item.success_buckets : undefined,\n b24: Array.isArray(item.b24) ? item.b24 : undefined,\n b7d: Array.isArray(item.b7d) ? item.b7d : undefined,\n sr_24h_state: item.sr_24h_state || 'rate',\n sr_7d_state: item.sr_7d_state || 'no_data',\n p50_ttft_ms: Number(item.p50_ttft_ms || 2273),\n recent_p50_ms: Number(item.recent_p50_ms || item.last_test_response_ms || 2340),\n cache_hit_rate_pct: cacheHitRate,\n labels,\n last_success_at: lastSuccessAt,\n last_success_text: formatRelativeTime(lastSuccessAt),\n authenticity_guaranteed: Boolean(item.authenticity_guaranteed),\n authenticity_badge: item.authenticity_guarantee_badge_key,\n is_pinned: Boolean(item.pin_status === 'pinned' || item.is_pinned),\n user_channel_disabled: Boolean(item.user_channel_disabled),\n supplier_channel_disabled: Boolean(item.supplier_channel_disabled),\n raw: item,\n };\n }\n }\n } catch (err) {\n console.warn('[dsh-a6api] fetchChannelDetails error:', err);\n }\n\n // Fallback if we have log snapshot info\n if (logSnapshot) {\n const rate = 6.7209;\n const inMicros = Number(logSnapshot.marketplace_price_input_micros || 20300);\n const outMicros = Number(logSnapshot.marketplace_price_output_micros || 101502);\n const cacheReadMicros = Number(logSnapshot.marketplace_price_cache_read_micros || 2030);\n const cacheWriteMicros = Number(logSnapshot.marketplace_price_cache_write_micros || 25375);\n\n let official_price: OfficialPrices | undefined;\n if (meta.officialPriceMicros) {\n const offIn = meta.officialPriceMicros.input;\n const offOut = meta.officialPriceMicros.output;\n const offCR = meta.officialPriceMicros.cacheRead;\n const offCW = meta.officialPriceMicros.cacheWrite;\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n }\n\n const ratioCny = Number((inMicros / 1000000) * rate || 0.0341);\n\n return {\n listing_id: logSnapshot.marketplace_listing_id,\n channel_id: channelId,\n channel_name: logSnapshot.channel_name || `\u5546\u6237 #${channelId}`,\n supplier_name: logSnapshot.supplier_nickname || logSnapshot.channel_name || 'GPT\u4F4E\u4EF7',\n supplier_id: 290,\n model_name: targetName || logSnapshot.model_name || '',\n brand: meta.brand || 'OpenAI',\n description: '\u9AD8\u5E76\u53D1 \u4E3B\u6253\u4FBF\u5B9C \u7A33\u5B9A',\n charge_type: 'per_token',\n charge_type_text: '\u6309\u91CF',\n sample_count: 100,\n sample_count_text: '\u8FD1 100 \u6B21\u6837\u672C',\n input_price_micros: inMicros,\n output_price_micros: outMicros,\n cache_read_price_micros: cacheReadMicros,\n cache_write_price_micros: cacheWriteMicros,\n input_price_cny: formatCnyPrice(inMicros, rate),\n output_price_cny: formatCnyPrice(outMicros, rate),\n cache_read_price_cny: formatCnyPrice(cacheReadMicros, rate),\n cache_write_price_cny: formatCnyPrice(cacheWriteMicros, rate),\n official_price,\n realtime_ratio_cny: ratioCny,\n realtime_ratio_formatted: ratioCny.toFixed(4),\n recent_success_rate_pct: 100,\n success_rate_24h_pct: 99.3,\n recent_p50_ms: Number(logSnapshot.use_time ? logSnapshot.use_time * 1000 : 2340),\n p50_ttft_ms: 2273,\n cache_hit_rate_pct: 72.0,\n labels: ['\u7A33\u5B9A', '\u4F4E\u4EF7', '\u9AD8\u901F', '\u9AD8\u8D28'],\n last_success_at: Math.floor(Date.now() / 1000),\n last_success_text: '\u521A\u521A',\n authenticity_guaranteed: false,\n is_pinned: false,\n user_channel_disabled: false,\n };\n }\n\n return null;\n}\n/** \u8F7B\u91CF\u62C9\u53D6\u4EF7\u683C\u6CE2\u52A8\u6761\u6570\uFF08\u4EC5 pending/unseen\uFF09 */\nexport async function fetchPriceFluctuation(\n userId?: string,\n sessionCookie?: string,\n accessToken?: string,\n): Promise<{ pendingCount: number; unseenCount: number; totalCount: number; notices?: any[]; authError?: boolean }> {\n const token = (accessToken || sessionCookie || '').trim();\n const uid = (userId || '').trim();\n if (!uid && !token) {\n return { pendingCount: 0, unseenCount: 0, totalCount: 0, authError: false };\n }\n const headers = buildWebHeaders(uid || undefined, token || undefined);\n const url = 'https://a6api.com/api/marketplace/price-notices';\n try {\n const res = await fetch(url, { headers, signal: AbortSignal.timeout(8000) });\n if (res.status === 401 || res.status === 403) {\n console.warn('[dsh-a6api] fetchPriceFluctuation auth failed', res.status);\n return { pendingCount: 0, unseenCount: 0, totalCount: 0, authError: true };\n }\n if (!res.ok) {\n console.warn('[dsh-a6api] fetchPriceFluctuation HTTP', res.status);\n return { pendingCount: 0, unseenCount: 0, totalCount: 0 };\n }\n const json: any = await res.json().catch(() => null);\n if (!json) return { pendingCount: 0, unseenCount: 0, totalCount: 0 };\n if (json.success === false) return { pendingCount: 0, unseenCount: 0, totalCount: 0 };\n\n // \u517C\u5BB9\u591A\u79CD\u8FD4\u56DE\u5F62\u6001\n let arr: any[] = [];\n if (Array.isArray(json)) arr = json;\n else if (Array.isArray(json.data)) arr = json.data;\n else if (Array.isArray(json.data?.notices)) arr = json.data.notices;\n else if (Array.isArray(json.data?.items)) arr = json.data.items;\n else if (Array.isArray(json.notices)) arr = json.notices;\n else if (Array.isArray(json.items)) arr = json.items;\n\n // \u533A\u5206\u201C\u5B57\u6BB5\u7F3A\u5931\u201D vs \u201C\u663E\u5F0F\u4E3A 0\u201D\u2014\u2014\u4EC5\u7F3A\u5931\u65F6\u624D\u515C\u5E95\n const pickWithPresent = (keys: string[]): { value: number; present: boolean } => {\n for (const k of keys) {\n const v = json?.data?.[k] ?? json?.[k];\n if (v !== undefined && v !== null) {\n const n = Number(v);\n if (!Number.isNaN(n)) return { value: n, present: true };\n }\n }\n return { value: 0, present: false };\n };\n const pendingPick = pickWithPresent(['pendingCount', 'pending_count', 'pending', 'openCount']);\n const unseenPick = pickWithPresent(['unseenCount', 'unseen_count', 'unseen', 'has_unseen_count']);\n let pending = pendingPick.value;\n let unseen = unseenPick.value;\n const total = arr.length;\n\n // \u4EC5\u5728\u8BA1\u6570\u952E\u7F3A\u5931\u65F6\u624D\u4ECE\u6570\u7EC4\u515C\u5E95\uFF0C\u907F\u514D\u8986\u76D6 API \u663E\u5F0F 0\n if (!pendingPick.present && arr.length > 0) {\n const counted = arr.filter((n: any) => {\n const s = String(n.state || n.status || '').toLowerCase();\n return s === 'open' || s === 'pending' || n.pending === true;\n }).length;\n // \u4EC5\u5F53\u6570\u7EC4\u6709\u53EF\u8BC6\u522B\u7684 state \u65F6\u624D\u7528 counted\uFF0C\u5426\u5219\u4FDD\u6301 0\uFF08\u4E0D\u731C\u6D4B\uFF09\n const hasState = arr.some((n: any) => n.state !== undefined || n.status !== undefined);\n if (hasState) pending = counted;\n // \u82E5\u65E0 state \u5B57\u6BB5\u4E14 pending \u7F3A\u5931\uFF0C\u4FDD\u6301 0\uFF0C\u4E0D\u518D\u9000\u5316\u4E3A total\n }\n if (!unseenPick.present && arr.length > 0) {\n unseen = arr.filter((n: any) => n.has_unseen === true || n.hasUnseen === true || n.unseen === true || n.is_unread === true).length;\n }\n\n // \u8C03\u8BD5\u65E5\u5FD7\u5DF2\u79FB\u9664\uFF08\u907F\u514D\u672A\u8131\u654F\u900F\u4F20\uFF09\uFF1B\u5982\u9700\u672C\u5730\u8C03\u8BD5\u53EF\u4E34\u65F6\u5F00\u542F DEBUG \u73AF\u5883\u53D8\u91CF\n // if (process.env.DEBUG) console.log('[dsh-a6api] price fluctuation sample', arr[0]);\n\n return { pendingCount: pending, unseenCount: unseen, totalCount: total, notices: arr };\n } catch (err) {\n console.warn('[dsh-a6api] fetchPriceFluctuation error', err);\n return { pendingCount: 0, unseenCount: 0, totalCount: 0 };\n }\n}\n", "import { cleanBaseUrl, fetchChannelDetails, fetchRecentLogs } from './a6api-client.js';\nimport type { MerchantChannelInfo } from '../types.js';\n\nexport interface ProbeResult {\n modelName: string;\n success: boolean;\n channelId?: number;\n channelName?: string;\n merchant?: MerchantChannelInfo | null;\n error?: string;\n durationMs?: number;\n}\n\n/** Delay helper */\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/** Probe a single model by sending a 1-token prompt and querying logs */\nexport async function probeSingleModel(\n baseURL: string,\n apiKey: string,\n userId?: string,\n accessToken?: string,\n modelName?: string,\n): Promise<ProbeResult> {\n const targetModel = modelName || '';\n const cleanUrl = cleanBaseUrl(baseURL);\n if (!apiKey) {\n return { modelName: targetModel, success: false, error: '\u672A\u914D\u7F6E API Key' };\n }\n\n const startTime = Date.now();\n let requestOk = false;\n let requestError = '';\n\n try {\n const res = await fetch(`${cleanUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey.trim()}`,\n },\n body: JSON.stringify({\n model: targetModel,\n messages: [{ role: 'user', content: '1' }],\n max_tokens: 1,\n }),\n // \u63A8\u7406\u6A21\u578B(\u5982 grok-4.6)\u5B9E\u6D4B\u5355\u6B21\u54CD\u5E94\u53EF\u8FBE 40-90s+,\u9608\u503C\u8FC7\u77ED\u4F1A\u88AB\u9891\u7E41\u6390\u65AD\u5BFC\u81F4\u63A2\u6D4B\u5931\u8D25\n signal: AbortSignal.timeout(180000),\n });\n\n if (res.ok) {\n requestOk = true;\n } else {\n const errText = await res.text();\n requestError = `HTTP ${res.status}: ${errText.slice(0, 150)}`;\n }\n } catch (err: any) {\n const raw = err?.message || String(err);\n // \u8D85\u65F6\u9519\u8BEF\u82F1\u6587\u539F\u6587\u5BF9\u7528\u6237\u4E0D\u53CB\u597D,\u8F6C\u4E3A\u4E2D\u6587\u63D0\u793A\n if (raw.includes('aborted due to timeout') || err?.name === 'TimeoutError') {\n requestError = '\u63A2\u6D4B\u8D85\u65F6(\u9608\u503C180\u79D2) \u2014 \u63A8\u7406\u6A21\u578B\u54CD\u5E94\u8F83\u6162,\u5DF2\u4FDD\u7559\u4E0A\u6B21\u5546\u6237\u6570\u636E,\u8BF7\u7A0D\u540E\u91CD\u8BD5';\n } else {\n requestError = raw;\n }\n }\n\n const durationMs = Date.now() - startTime;\n\n // \u4EC5\u8BF7\u6C42\u6210\u529F\u540E\u67E5\u65E5\u5FD7,\u5931\u8D25\u65F6\u76F4\u63A5\u8FD4\u56DE\u9519\u8BEF(\u4E0D\u5728\u5361\u7247\u4E0A\u56DE\u9000\u5C55\u793A\u5386\u53F2\u5546\u6237)\n if (requestOk && (userId || accessToken)) {\n // Wait slightly for gateway log writing (\u6162\u6A21\u578B\u8BF7\u6C42\u671F\u95F4\u65E5\u5FD7\u5DF2\u843D\u76D8,\u5FEB\u6A21\u578B\u9700\u8981\u7B49\u5F85)\n await sleep(1200);\n try {\n const logs = await fetchRecentLogs(userId, accessToken, 15);\n const minTimestamp = Math.floor(startTime / 1000) - 10;\n // Find recent log entry for this model\n const log =\n logs.find(\n (it) =>\n it.model_name?.toLowerCase() === targetModel.toLowerCase() &&\n Number(it.created_at || 0) >= minTimestamp,\n ) || logs.find((it) => it.model_name?.toLowerCase() === targetModel.toLowerCase());\n\n if (log && log.channel) {\n const channelId = Number(log.channel);\n let logSnapshot: any = null;\n if (log.other) {\n try {\n logSnapshot = { ...JSON.parse(log.other), channel_name: log.channel_name, model_name: log.model_name };\n } catch {}\n }\n const merchant = await fetchChannelDetails(channelId, userId, accessToken, targetModel, logSnapshot);\n return {\n modelName: targetModel,\n success: true,\n channelId,\n channelName: log.channel_name,\n merchant,\n durationMs,\n };\n }\n } catch (err: any) {\n console.warn(`[dsh-a6api] Log lookup error for ${targetModel}:`, err);\n }\n }\n\n return {\n modelName: targetModel,\n success: requestOk,\n durationMs,\n error: requestOk ? undefined : requestError,\n };\n}\n\n/** Pre-populate merchant cards from recent logs without triggering live probe */\nexport async function getKnownMerchantsFromLogs(\n userId?: string,\n accessToken?: string,\n modelNames: string[] = [],\n): Promise<Record<string, MerchantChannelInfo>> {\n if ((!userId && !accessToken) || modelNames.length === 0) return {};\n\n const result: Record<string, MerchantChannelInfo> = {};\n try {\n const logs = await fetchRecentLogs(userId, accessToken, 50);\n const modelToLog = new Map<string, any>();\n\n for (const log of logs) {\n const mName = log.model_name;\n const chId = Number(log.channel);\n if (mName && chId && !modelToLog.has(mName.toLowerCase())) {\n modelToLog.set(mName.toLowerCase(), log);\n }\n }\n\n const matchedEntries: { modelName: string; log: any }[] = [];\n for (const name of modelNames) {\n const log = modelToLog.get(name.toLowerCase());\n if (log) {\n matchedEntries.push({ modelName: name, log });\n }\n }\n\n // Fetch details with concurrency limit 4\n for (let i = 0; i < matchedEntries.length; i += 4) {\n const batch = matchedEntries.slice(i, i + 4);\n await Promise.all(\n batch.map(async ({ modelName, log }) => {\n try {\n const channelId = Number(log.channel);\n let logSnapshot: any = null;\n if (log.other) {\n try {\n logSnapshot = { ...JSON.parse(log.other), channel_name: log.channel_name, model_name: log.model_name };\n } catch {}\n }\n const card = await fetchChannelDetails(channelId, userId, accessToken, modelName, logSnapshot);\n if (card) {\n result[modelName] = card;\n }\n } catch {\n // ignore\n }\n }),\n );\n }\n } catch (err) {\n console.warn('[dsh-a6api] getKnownMerchantsFromLogs error:', err);\n }\n\n return result;\n}\n", "import * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { resolveModelMeta } from './catalog.js';\nimport type { A6ApiConfig } from '../types.js';\n\nexport const A6API_CRED_REF = 'A6API_API_KEY';\n\n/** \u539F\u5B50\u5199\u5165\uFF1A\u5148\u5199\u4E34\u65F6\u6587\u4EF6\uFF080600/0644\uFF09\u518D rename\uFF0C\u907F\u514D\u5D29\u6E83\u622A\u65AD\u4E0E\u6743\u9650\u4F4D\u6CC4\u9732 */\nasync function atomicWriteFile(filePath: string, content: string, mode = 0o600): Promise<void> {\n const dir = path.dirname(filePath);\n await fsp.mkdir(dir, { recursive: true });\n const tmpPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`);\n await fsp.writeFile(tmpPath, content, { mode });\n await fsp.rename(tmpPath, filePath);\n}\n\nfunction dshHome(): string {\n return process.env.DSH_HOME || path.join(os.homedir(), '.dsh');\n}\n\nfunction configFile(): string {\n return path.join(dshHome(), 'dsh-a6api-config.json');\n}\n\nfunction credentialsFile(): string {\n return path.join(dshHome(), '.credentials.yaml');\n}\n\nfunction settingsFile(): string {\n return path.join(dshHome(), 'settings.yaml');\n}\n\n/** Read plugin dedicated config */\nexport async function readPluginConfig(): Promise<A6ApiConfig> {\n const filePath = configFile();\n let raw = '';\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n // try reading default credential if exists\n const apiKey = (await readCredentialKey(A6API_CRED_REF)) || '';\n return {\n baseURL: 'https://api.a6api.com',\n apiKey,\n userId: '',\n activeModels: [],\n };\n }\n\n try {\n const parsed = JSON.parse(raw);\n const apiKey = parsed.apiKey || (await readCredentialKey(A6API_CRED_REF)) || '';\n const accessToken = parsed.accessToken || parsed.systemAccessToken || parsed.sessionCookie || '';\n return {\n baseURL: parsed.baseURL || 'https://api.a6api.com',\n apiKey,\n accessToken,\n userId: parsed.userId || '',\n sessionCookie: accessToken,\n activeModels: Array.isArray(parsed.activeModels) ? parsed.activeModels : [],\n customBaseURL: parsed.customBaseURL,\n };\n } catch {\n return {\n baseURL: 'https://api.a6api.com',\n apiKey: '',\n accessToken: '',\n userId: '',\n activeModels: [],\n };\n }\n}\n\n/** Save plugin dedicated config\uFF08\u5BC6\u94A5\u5355\u4E00\u771F\u76F8\u6E90\u5728 ~/.dsh/.credentials.yaml\uFF0C\u914D\u7F6E JSON \u4E0D\u518D\u5197\u4F59\u660E\u6587\uFF09 */\nexport async function savePluginConfig(config: A6ApiConfig): Promise<void> {\n const filePath = configFile();\n const { apiKey: _apiKey, ...safeConfig } = config;\n await atomicWriteFile(filePath, JSON.stringify(safeConfig, null, 2));\n\n // Also sync credential\n if (config.apiKey && config.apiKey.trim()) {\n await writeCredentialKey(A6API_CRED_REF, config.apiKey.trim());\n }\n}\n\n/** Read a key from .credentials.yaml */\nexport async function readCredentialKey(refKey: string): Promise<string | null> {\n try {\n const yaml = await fsp.readFile(credentialsFile(), 'utf8');\n let inRefs = false;\n for (const line of yaml.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 0) {\n inRefs = trimmed.startsWith('refs:');\n continue;\n }\n if (!inRefs) continue;\n const m = /^([A-Za-z0-9_.\\-]+):\\s*(.*)$/.exec(trimmed);\n if (m && m[1] === refKey) {\n let val = m[2].trim();\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.slice(1, -1);\n }\n return val;\n }\n }\n } catch {}\n return null;\n}\n\n/** Write/update a key in .credentials.yaml */\nexport async function writeCredentialKey(refKey: string, value: string): Promise<void> {\n const cFile = credentialsFile();\n let yaml = '';\n try {\n yaml = await fsp.readFile(cFile, 'utf8');\n } catch {\n yaml = 'version: 1\\nrefs:\\n';\n }\n\n const lines = yaml.split(/\\r?\\n/);\n let inRefs = false;\n let refsLineIdx = -1;\n let found = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 0) {\n if (trimmed.startsWith('refs:')) {\n inRefs = true;\n refsLineIdx = i;\n } else {\n inRefs = false;\n }\n continue;\n }\n if (inRefs) {\n const m = /^([A-Za-z0-9_.\\-]+):/.exec(trimmed);\n if (m && m[1] === refKey) {\n lines[i] = ` ${refKey}: ${JSON.stringify(value)}`;\n found = true;\n break;\n }\n }\n }\n\n if (!found) {\n if (refsLineIdx >= 0) {\n lines.splice(refsLineIdx + 1, 0, ` ${refKey}: ${JSON.stringify(value)}`);\n } else {\n lines.push('refs:', ` ${refKey}: ${JSON.stringify(value)}`);\n }\n }\n\n await atomicWriteFile(cFile, lines.join('\\n'), 0o600);\n}\n\n/** Sync active models to DSH settings.yaml under llm-pi-ai.providers.a6api */\nexport async function syncToDshSettings(baseURL: string, modelIds: string[]): Promise<void> {\n const sFile = settingsFile();\n let yaml = '';\n try {\n yaml = await fsp.readFile(sFile, 'utf8');\n } catch {\n yaml = 'llm-pi-ai:\\n providers:\\n';\n }\n\n // Build the YAML block for models\n const modelEntries = modelIds.map((id) => {\n const meta = resolveModelMeta(id);\n const lines = [\n ` - id: ${meta.id}`,\n ` name: ${meta.name}`,\n ` contextWindow: ${meta.contextWindow}`,\n ` maxTokens: ${meta.maxTokens}`,\n ` input:`,\n ...meta.modalities.map((m) => ` - ${m}`),\n ];\n if (meta.reasoningEfforts) {\n lines.push(` reasoningEfforts:`);\n for (const [k, v] of Object.entries(meta.reasoningEfforts)) {\n if (v) lines.push(` ${k}: ${v}`);\n }\n }\n return lines.join('\\n');\n });\n\n // Ensure OpenAI compatible endpoints in DSH settings.yaml have the /v1 suffix\n const dshBaseUrl = baseURL.endsWith('/v1') ? baseURL : `${baseURL.replace(/\\/+$/, '')}/v1`;\n\n const a6apiBlockLines = [\n ` a6api:`,\n ` displayName: A6API`,\n ` apiKeyEnv: ${A6API_CRED_REF}`,\n ` api: openai-completions`,\n ` baseURL: ${dshBaseUrl}`,\n ` models:`,\n ...(modelEntries.length > 0 ? modelEntries : [` []`]),\n ];\n\n // Look for `llm-pi-ai:` -> `providers:` -> `a6api:`\n const lines = yaml.split(/\\r?\\n/);\n let inLlm = false;\n let inProviders = false;\n let inA6 = false;\n let a6Start = -1;\n let a6End = -1;\n let providersLineIdx = -1;\n let llmLineIdx = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n\n if (indent === 0) {\n inLlm = trimmed.startsWith('llm-pi-ai:');\n if (inLlm) llmLineIdx = i;\n inProviders = false;\n inA6 = false;\n continue;\n }\n\n if (inLlm && indent === 2 && trimmed.startsWith('providers:')) {\n inProviders = true;\n providersLineIdx = i;\n inA6 = false;\n continue;\n }\n\n if (inProviders && indent === 4) {\n if (trimmed.startsWith('a6api:')) {\n inA6 = true;\n a6Start = i;\n a6End = i + 1;\n } else {\n if (inA6) {\n a6End = i;\n inA6 = false;\n }\n }\n continue;\n }\n\n if (inA6 && indent > 4) {\n a6End = i + 1;\n } else if (inA6 && indent <= 4) {\n a6End = i;\n inA6 = false;\n }\n }\n\n if (a6Start >= 0) {\n // Replace existing a6api block\n lines.splice(a6Start, a6End - a6Start, ...a6apiBlockLines);\n } else if (providersLineIdx >= 0) {\n // Insert under providers:\n lines.splice(providersLineIdx + 1, 0, ...a6apiBlockLines);\n } else if (llmLineIdx >= 0) {\n // Insert providers: then a6api\n lines.splice(llmLineIdx + 1, 0, ` providers:`, ...a6apiBlockLines);\n } else {\n // Insert llm-pi-ai: providers: a6api\n lines.push(`llm-pi-ai:`, ` providers:`, ...a6apiBlockLines);\n }\n\n await atomicWriteFile(sFile, lines.join('\\n'), 0o644);\n}\n\n/** Get currently configured model IDs in DSH settings for a6api */\nexport async function getDshConfiguredModels(): Promise<string[]> {\n try {\n const yaml = await fsp.readFile(settingsFile(), 'utf8');\n const lines = yaml.split(/\\r?\\n/);\n let inA6 = false;\n let inModels = false;\n const modelIds: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 4 && trimmed.startsWith('a6api:')) {\n inA6 = true;\n inModels = false;\n continue;\n }\n if (inA6 && indent <= 4 && !trimmed.startsWith('a6api:')) {\n inA6 = false;\n inModels = false;\n }\n if (inA6 && indent === 6 && trimmed.startsWith('models:')) {\n inModels = true;\n continue;\n }\n if (inModels && indent === 8 && trimmed.startsWith('- id:')) {\n const id = trimmed.replace(/^- id:\\s*/, '').trim();\n if (id) modelIds.push(id);\n }\n }\n return modelIds;\n } catch {\n return [];\n }\n}\n", "import { fetchBalance, fetchTokenModels, fetchRecentLogs, fetchPriceFluctuation } from './server/a6api-client.js';\nimport { getKnownMerchantsFromLogs, probeSingleModel } from './server/probe.js';\nimport { resolveModelMeta } from './server/catalog.js';\nimport {\n getDshConfiguredModels,\n readPluginConfig,\n savePluginConfig,\n syncToDshSettings,\n} from './server/sync.js';\nimport type { A6ApiConfig, A6ApiStateResponse, MerchantChannelInfo, ModelCardData } from './types.js';\n\nexport const name = '@lynn123411/dsh-a6api';\nexport const inject = ['webServer'];\n\nexport {\n fetchBalance,\n fetchTokenModels,\n fetchRecentLogs,\n fetchChannelDetails,\n} from './server/a6api-client.js';\nexport { probeSingleModel, getKnownMerchantsFromLogs } from './server/probe.js';\nexport { resolveModelMeta, A6API_CATALOG } from './server/catalog.js';\nexport { readPluginConfig, savePluginConfig, syncToDshSettings } from './server/sync.js';\n\nconst PREFIX = '/api/dsh-a6api';\n\n/** \u5BA2\u6237\u7AEF\u8131\u654F\u5360\u4F4D\u7B26\uFF1A\u670D\u52A1\u7AEF\u7EDD\u4E0D\u56DE\u4F20\u771F\u5B9E\u5BC6\u94A5 */\nconst MASK = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022';\n\n/** \u8131\u654F\u914D\u7F6E\uFF1AAPI Key / \u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C / userId \u4EC5\u4EE5\u5360\u4F4D\u7B26\u5F62\u5F0F\u4E0B\u53D1\uFF0C\u771F\u5B9E\u503C\u53EA\u5B58\u5728\u4E8E\u670D\u52A1\u7AEF */\nfunction maskConfig(c: A6ApiConfig): A6ApiConfig {\n return {\n ...c,\n apiKey: c.apiKey ? MASK : '',\n accessToken: c.accessToken || c.sessionCookie ? MASK : '',\n sessionCookie: '',\n userId: c.userId ? MASK : '',\n hasApiKey: Boolean(c.apiKey),\n hasToken: Boolean(c.accessToken || c.sessionCookie),\n };\n}\n\nfunction sendJson(res: any, status: number, body: any) {\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-cache',\n // \u4E0D\u8BBE access-control-allow-origin\uFF1A\u4EC5\u5141\u8BB8\u540C\u6E90\u8C03\u7528\uFF0C\u963B\u65AD\u8DE8\u7AD9\u8BFB\u53D6\u4E0E CSRF \u9884\u68C0\n });\n res.end(JSON.stringify(body));\n}\n\nfunction readBody(req: any): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n req.on('data', (chunk: any) => {\n data += chunk;\n if (data.length > 2 * 1024 * 1024) {\n req.destroy();\n reject(new Error('Body too large'));\n }\n });\n req.on('end', () => resolve(data.trim()));\n req.on('error', reject);\n });\n}\n\nasync function parseJsonBody(req: any): Promise<any> {\n const text = await readBody(req);\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n throw new Error('Invalid JSON body');\n }\n}\n\n// In-memory cache for merchant cards to avoid duplicate log calls\nconst merchantCardCache = new Map<string, { card: MerchantChannelInfo; at: number }>();\n/** \u5361\u7247\u7F13\u5B58\u6709\u6548\u671F:\u8FC7\u671F\u540E /state \u4ECE\u6700\u65B0\u65E5\u5FD7\u91CD\u65B0\u63A8\u5BFC,\u907F\u514D\u6C38\u8FDC\u5C55\u793A\u9648\u65E7\u5546\u6237 */\nconst MERCHANT_CARD_TTL_MS = 15 * 60 * 1000;\n\nexport function apply(ctx: any): void {\n // Register Web API routes\n const webServer = ctx.webServer || (ctx.get ? ctx.get('webServer') : null);\n if (webServer && typeof webServer.register === 'function') {\n ctx.effect(() => {\n const unregister = webServer.register({\n kind: 'prefix',\n path: PREFIX,\n handler: async (req: any, res: any) => {\n const url = new URL(req.url || '/', 'http://localhost');\n const pathname = url.pathname.replace(PREFIX, '') || '/';\n\n // CORS preflight\uFF1A\u540C\u6E90\u7B56\u7565\u4E0B\u65E0\u9700\u653E\u884C\u8DE8\u6E90\uFF08\u79FB\u9664 ACAO \u540E\u8DE8\u6E90\u9884\u68C0\u5929\u7136\u5931\u8D25\uFF09\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n return res.end();\n }\n\n try {\n // GET /state\n if (pathname === '/state' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const balance = await fetchBalance(config.baseURL, config.apiKey, config.userId, token);\n \n // Auto-persist discovered userId\n if (balance?.userId && String(balance.userId) !== config.userId) {\n config.userId = String(balance.userId);\n await savePluginConfig(config);\n }\n\n const dshConfiguredModels = await getDshConfiguredModels();\n\n // Fetch allowed model IDs for this token\n let modelIds: string[] = [];\n if (config.apiKey) {\n modelIds = await fetchTokenModels(config.baseURL, config.apiKey);\n }\n\n // Fallback to active/configured models if token query returned empty\n if (modelIds.length === 0) {\n modelIds = [\n ...new Set([\n ...config.activeModels,\n ...dshConfiguredModels,\n 'gpt-5.6-sol',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n 'claude-fable-5',\n 'claude-opus-5',\n 'grok-4.6',\n ]),\n ];\n }\n\n // Match known merchant cards from recent logs if not yet in cache\n if (config.userId || token) {\n const missing = modelIds.filter((m) => {\n const entry = merchantCardCache.get(m.toLowerCase());\n return !entry || Date.now() - entry.at >= MERCHANT_CARD_TTL_MS;\n });\n if (missing.length > 0) {\n const found = await getKnownMerchantsFromLogs(config.userId, token, missing);\n for (const [mName, card] of Object.entries(found)) {\n merchantCardCache.set(mName.toLowerCase(), { card, at: Date.now() });\n }\n }\n }\n\n const dshSet = new Set(dshConfiguredModels);\n const models: ModelCardData[] = modelIds.map((mId) => {\n const meta = resolveModelMeta(mId);\n const cacheEntry = merchantCardCache.get(mId.toLowerCase());\n const cachedCard =\n cacheEntry && Date.now() - cacheEntry.at < MERCHANT_CARD_TTL_MS\n ? cacheEntry.card\n : undefined;\n return {\n model_name: mId,\n brand: meta.brand,\n contextWindow: meta.contextWindow,\n maxTokens: meta.maxTokens,\n modalities: meta.modalities,\n hasReasoning: Boolean(meta.reasoningEfforts || meta.thinkingFormat),\n inDsh: dshSet.has(mId),\n merchant: cachedCard,\n probeStatus: cachedCard ? 'success' : 'idle',\n };\n });\n\n // Also fetch recent routing logs for Account tab\n const recentLogs = await fetchRecentLogs(config.userId, token, 20);\n\n const response: A6ApiStateResponse = {\n config: maskConfig(config),\n balance,\n models,\n dshConfiguredModels,\n recentLogs,\n };\n return sendJson(res, 200, { ok: true, data: response });\n }\n\n // POST /config\n if (pathname === '/config' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const current = await readPluginConfig();\n const rawToken =\n body.accessToken !== undefined && body.accessToken !== MASK\n ? body.accessToken\n : body.sessionCookie !== undefined && body.sessionCookie !== MASK\n ? body.sessionCookie\n : (current.accessToken || current.sessionCookie || '');\n const newApiKey =\n body.apiKey !== undefined && body.apiKey !== MASK ? body.apiKey : current.apiKey;\n\n const updated: A6ApiConfig = {\n baseURL: body.baseURL !== undefined ? body.baseURL : current.baseURL,\n apiKey: newApiKey,\n accessToken: rawToken,\n sessionCookie: rawToken,\n userId: body.userId !== undefined ? body.userId : current.userId,\n activeModels: Array.isArray(body.activeModels) ? body.activeModels : current.activeModels,\n customBaseURL: body.customBaseURL !== undefined ? body.customBaseURL : current.customBaseURL,\n };\n\n // Validate access token and auto-fetch balance & userId\n const balance = await fetchBalance(updated.baseURL, updated.apiKey, updated.userId, updated.accessToken);\n if (balance?.userId) {\n updated.userId = String(balance.userId);\n }\n\n await savePluginConfig(updated);\n\n // If active models exist, sync to DSH settings as well\n if (updated.activeModels.length > 0) {\n await syncToDshSettings(updated.baseURL, updated.activeModels);\n }\n return sendJson(res, 200, { ok: true, config: maskConfig(updated), balance });\n }\n\n // GET /balance\n if (pathname === '/balance' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const balance = await fetchBalance(config.baseURL, config.apiKey, config.userId, token);\n const recentLogs = await fetchRecentLogs(config.userId, token, 20);\n return sendJson(res, 200, { ok: true, balance, recentLogs });\n }\n\n // GET /logs\n if (pathname === '/logs' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const recentLogs = await fetchRecentLogs(config.userId, token, 30);\n return sendJson(res, 200, { ok: true, logs: recentLogs });\n }\n\n // POST /probe\n if (pathname === '/probe' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const modelName = body.modelName;\n\n if (modelName && modelName !== 'all') {\n const result = await probeSingleModel(config.baseURL, config.apiKey, config.userId, token, modelName);\n if (result.merchant) {\n merchantCardCache.set(modelName.toLowerCase(), { card: result.merchant, at: Date.now() });\n }\n return sendJson(res, 200, { ok: true, result });\n }\n\n // Probe all models in token\n let modelIds: string[] = body.modelNames;\n if (!Array.isArray(modelIds) || modelIds.length === 0) {\n modelIds = await fetchTokenModels(config.baseURL, config.apiKey);\n }\n if (modelIds.length === 0) {\n modelIds = config.activeModels;\n }\n\n const results = [];\n for (const m of modelIds) {\n const r = await probeSingleModel(config.baseURL, config.apiKey, config.userId, token, m);\n if (r.merchant) {\n merchantCardCache.set(m.toLowerCase(), { card: r.merchant, at: Date.now() });\n }\n results.push(r);\n }\n\n return sendJson(res, 200, { ok: true, results });\n }\n\n // POST /sync-models\n if (pathname === '/sync-models' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const config = await readPluginConfig();\n const modelIds = Array.isArray(body.modelIds) ? body.modelIds : [];\n const baseURL = body.baseURL || config.baseURL;\n\n config.activeModels = modelIds;\n config.baseURL = baseURL;\n await savePluginConfig(config);\n await syncToDshSettings(baseURL, modelIds);\n\n const dshConfiguredModels = await getDshConfiguredModels();\n return sendJson(res, 200, { ok: true, dshConfiguredModels });\n }\n\n // GET /price-fluctuation \u2014 \u8F7B\u91CF\u4EF7\u683C\u6CE2\u52A8\u6761\u6570\uFF08\u5F85\u5904\u7406 n\uFF09\uFF0C\u4EC5\u56DE\u4F20\u8BA1\u6570\n if (pathname === '/price-fluctuation' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n if (!token || !config.userId) {\n return sendJson(res, 200, { ok: true, data: { pendingCount: 0, unseenCount: 0, totalCount: 0, hasAuth: false, authError: false, updatedAt: Date.now() } });\n }\n const result = await fetchPriceFluctuation(config.userId, token, token);\n const { notices, ...counts } = result as any;\n // 401/403 \u65F6 authError=true\uFF0C\u5BA2\u6237\u7AEF\u53EF\u533A\u5206\u201C\u672A\u914D\u7F6E\u201D\u4E0E\u201C\u5931\u6548\u201D\n const hasAuth = !counts.authError;\n return sendJson(res, 200, { ok: true, data: { pendingCount: counts.pendingCount, unseenCount: counts.unseenCount, totalCount: counts.totalCount, hasAuth, authError: Boolean(counts.authError), updatedAt: Date.now() } });\n }\n\n return sendJson(res, 404, { ok: false, error: 'Not found' });\n } catch (err: any) {\n console.error('[dsh-a6api] API error:', err);\n return sendJson(res, 500, { ok: false, error: err?.message || String(err) });\n }\n },\n });\n\n return () => {\n if (typeof unregister === 'function') unregister();\n };\n }, 'dsh-a6api: web API router');\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { A6ApiModelMeta } from '../types.js';\n\nexport const A6API_CATALOG: Record<string, A6ApiModelMeta> = {\n // --- OpenAI Series ---\n 'gpt-5.6-sol': {\n id: 'gpt-5.6-sol',\n name: 'GPT-5.6 Sol',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.6-terra': {\n id: 'gpt-5.6-terra',\n name: 'GPT-5.6 Terra',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.6-luna': {\n id: 'gpt-5.6-luna',\n name: 'GPT-5.6 Luna',\n brand: 'OpenAI',\n contextWindow: 524288,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'gpt-5.6': {\n id: 'gpt-5.6',\n name: 'GPT-5.6',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 4000000, output: 20000000, cacheRead: 400000, cacheWrite: 5000000 },\n },\n 'gpt-5.5': {\n id: 'gpt-5.5',\n name: 'GPT-5.5',\n brand: 'OpenAI',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'gpt-5.4': {\n id: 'gpt-5.4',\n name: 'GPT-5.4',\n brand: 'OpenAI',\n contextWindow: 524288,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 2500000, output: 10000000, cacheRead: 250000, cacheWrite: 3000000 },\n },\n 'gpt-5.4-mini': {\n id: 'gpt-5.4-mini',\n name: 'GPT-5.4 Mini',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 150000, output: 600000, cacheRead: 75000, cacheWrite: 150000 },\n },\n 'gpt-5.3-codex': {\n id: 'gpt-5.3-codex',\n name: 'GPT-5.3 Codex',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 200000, cacheWrite: 2000000 },\n },\n 'gpt-5.3-codex-spark': {\n id: 'gpt-5.3-codex-spark',\n name: 'GPT-5.3 Codex Spark',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 100000, cacheWrite: 1000000 },\n },\n 'gpt-5.2': {\n id: 'gpt-5.2',\n name: 'GPT-5.2',\n brand: 'OpenAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 200000, cacheWrite: 2000000 },\n },\n 'gpt-4o': {\n id: 'gpt-4o',\n name: 'GPT-4o',\n brand: 'OpenAI',\n contextWindow: 128000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2500000, output: 10000000, cacheRead: 1250000, cacheWrite: 2500000 },\n },\n 'gpt-4o-mini': {\n id: 'gpt-4o-mini',\n name: 'GPT-4o Mini',\n brand: 'OpenAI',\n contextWindow: 128000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 150000, output: 600000, cacheRead: 75000, cacheWrite: 150000 },\n },\n\n // --- Anthropic Claude Series ---\n 'claude-opus-5': {\n id: 'claude-opus-5',\n name: 'Claude Opus 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'anthropic',\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-sonnet-5': {\n id: 'claude-sonnet-5',\n name: 'Claude Sonnet 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'anthropic',\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-fable-5': {\n id: 'claude-fable-5',\n name: 'Claude Fable 5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-opus-4-8': {\n id: 'claude-opus-4-8',\n name: 'Claude Opus 4.8',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-opus-4-7': {\n id: 'claude-opus-4-7',\n name: 'Claude Opus 4.7',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-opus-4-6': {\n id: 'claude-opus-4-6',\n name: 'Claude Opus 4.6',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 15000000, output: 75000000, cacheRead: 1500000, cacheWrite: 18750000 },\n },\n 'claude-sonnet-4-6': {\n id: 'claude-sonnet-4-6',\n name: 'Claude Sonnet 4.6',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 3000000, output: 15000000, cacheRead: 300000, cacheWrite: 3750000 },\n },\n 'claude-haiku-4-5': {\n id: 'claude-haiku-4-5',\n name: 'Claude Haiku 4.5',\n brand: 'Anthropic',\n contextWindow: 200000,\n maxTokens: 8192,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 250000, output: 1250000, cacheRead: 25000, cacheWrite: 312500 },\n },\n\n // --- DeepSeek Series ---\n 'deepseek-v4-pro': {\n id: 'deepseek-v4-pro',\n name: 'DeepSeek V4 Pro',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n 'deepseek-v4-flash': {\n id: 'deepseek-v4-flash',\n name: 'DeepSeek V4 Flash',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'DeepSeek-V4-Flash-0731': {\n id: 'DeepSeek-V4-Flash-0731',\n name: 'DeepSeek V4 Flash (0731)',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-v4-pro-0813': {\n id: 'deepseek-v4-pro-0813',\n name: 'DeepSeek V4 Pro (0813)',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n 'deepseek-v4-flash-vision-exp': {\n id: 'deepseek-v4-flash-vision-exp',\n name: 'DeepSeek V4 Flash Vision Exp',\n brand: 'DeepSeek',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-chat': {\n id: 'deepseek-chat',\n name: 'DeepSeek Chat',\n brand: 'DeepSeek',\n contextWindow: 65536,\n maxTokens: 8192,\n modalities: ['text'],\n officialPriceMicros: { input: 140000, output: 280000, cacheRead: 14000, cacheWrite: 140000 },\n },\n 'deepseek-reasoner': {\n id: 'deepseek-reasoner',\n name: 'DeepSeek Reasoner',\n brand: 'DeepSeek',\n contextWindow: 65536,\n maxTokens: 16384,\n modalities: ['text'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 550000, output: 2190000, cacheRead: 140000, cacheWrite: 550000 },\n },\n\n // --- Google Gemini Series ---\n 'gemini-3.7-flash': {\n id: 'gemini-3.7-flash',\n name: 'Gemini 3.7 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', low: 'low', medium: 'medium', high: 'high' },\n officialPriceMicros: { input: 100000, output: 400000, cacheRead: 25000, cacheWrite: 100000 },\n },\n 'gemini-3.6-flash': {\n id: 'gemini-3.6-flash',\n name: 'Gemini 3.6 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 100000, output: 400000, cacheRead: 25000, cacheWrite: 100000 },\n },\n 'gemini-3.5-flash': {\n id: 'gemini-3.5-flash',\n name: 'Gemini 3.5 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-3.5-flash-high': {\n id: 'gemini-3.5-flash-high',\n name: 'Gemini 3.5 Flash High',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n reasoningEfforts: { high: 'high' },\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-3.1-pro-preview': {\n id: 'gemini-3.1-pro-preview',\n name: 'Gemini 3.1 Pro Preview',\n brand: 'Google',\n contextWindow: 2097152,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 1250000, output: 5000000, cacheRead: 312500, cacheWrite: 1250000 },\n },\n 'gemini-3.1-flash-lite-preview': {\n id: 'gemini-3.1-flash-lite-preview',\n name: 'Gemini 3.1 Flash Lite Preview',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n 'gemini-2.5-pro': {\n id: 'gemini-2.5-pro',\n name: 'Gemini 2.5 Pro',\n brand: 'Google',\n contextWindow: 2097152,\n maxTokens: 65536,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 1250000, output: 5000000, cacheRead: 312500, cacheWrite: 1250000 },\n },\n 'gemini-2.5-flash': {\n id: 'gemini-2.5-flash',\n name: 'Gemini 2.5 Flash',\n brand: 'Google',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 75000, output: 300000, cacheRead: 18750, cacheWrite: 75000 },\n },\n\n // --- xAI Grok Series ---\n 'grok-4.6': {\n id: 'grok-4.6',\n name: 'Grok 4.6',\n brand: 'xAI',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n reasoningEfforts: { off: '', high: 'high' },\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'grok-4.5': {\n id: 'grok-4.5',\n name: 'Grok 4.5',\n brand: 'xAI',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text', 'image'],\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n 'grok-4.3': {\n id: 'grok-4.3',\n name: 'Grok 4.3',\n brand: 'xAI',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 2000000, output: 10000000, cacheRead: 200000, cacheWrite: 2500000 },\n },\n\n // --- Zhipu GLM Series ---\n 'glm-5.3': {\n id: 'glm-5.3',\n name: 'GLM 5.3',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n 'glm-5.3-flash': {\n id: 'glm-5.3-flash',\n name: 'GLM 5.3 Flash',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 100000, output: 200000, cacheRead: 10000, cacheWrite: 100000 },\n },\n 'glm-5.2': {\n id: 'glm-5.2',\n name: 'GLM 5.2',\n brand: 'Zhipu',\n contextWindow: 131072,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n\n // --- Moonshot Kimi Series ---\n 'kimi-k3': {\n id: 'kimi-k3',\n name: 'Kimi K3',\n brand: 'Moonshot',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 1500000, output: 6000000, cacheRead: 300000, cacheWrite: 1500000 },\n },\n 'kimi-k2.7-code': {\n id: 'kimi-k2.7-code',\n name: 'Kimi K2.7 Code',\n brand: 'Moonshot',\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n\n // --- Alibaba Qwen Series ---\n 'qwen3.8-max': {\n id: 'qwen3.8-max',\n name: 'Qwen 3.8 Max',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 400000, cacheWrite: 2000000 },\n },\n 'qwen3.8-flash': {\n id: 'qwen3.8-flash',\n name: 'Qwen 3.8 Flash',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 16384,\n modalities: ['text'],\n officialPriceMicros: { input: 100000, output: 300000, cacheRead: 20000, cacheWrite: 100000 },\n },\n 'qwen3.7-max': {\n id: 'qwen3.7-max',\n name: 'Qwen 3.7 Max',\n brand: 'Alibaba',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text', 'image'],\n thinkingFormat: 'deepseek',\n officialPriceMicros: { input: 2000000, output: 8000000, cacheRead: 400000, cacheWrite: 2000000 },\n },\n\n // --- MiniMax Series ---\n 'minimax-m3': {\n id: 'minimax-m3',\n name: 'MiniMax M3',\n brand: 'MiniMax',\n contextWindow: 1048576,\n maxTokens: 32768,\n modalities: ['text'],\n officialPriceMicros: { input: 1000000, output: 4000000, cacheRead: 200000, cacheWrite: 1000000 },\n },\n};\n\n/** Infer Brand from model name if not in catalog. */\nexport function inferBrand(modelId: string): string {\n const m = modelId.toLowerCase();\n if (m.startsWith('gpt') || m.startsWith('o1') || m.startsWith('o3') || m.startsWith('chatgpt')) return 'OpenAI';\n if (m.startsWith('claude')) return 'Anthropic';\n if (m.startsWith('gemini') || m.startsWith('google') || m.startsWith('imagen')) return 'Google';\n if (m.startsWith('deepseek')) return 'DeepSeek';\n if (m.startsWith('grok')) return 'xAI';\n if (m.startsWith('glm') || m.startsWith('zhipu') || m.startsWith('cog')) return 'Zhipu';\n if (m.startsWith('kimi') || m.startsWith('moonshot')) return 'Moonshot';\n if (m.startsWith('qwen')) return 'Alibaba';\n if (m.startsWith('minimax')) return 'MiniMax';\n if (m.startsWith('mimo') || m.startsWith('xiaomi')) return 'Xiaomi';\n if (m.startsWith('hunyuan') || m.startsWith('tencent') || m.startsWith('hy')) return 'Tencent';\n return 'Other';\n}\n\n/** Resolve metadata for any model ID, falling back to safe defaults. */\nexport function resolveModelMeta(modelId: string): A6ApiModelMeta {\n if (A6API_CATALOG[modelId]) {\n return A6API_CATALOG[modelId];\n }\n // Case-insensitive lookup\n const lowerId = modelId.toLowerCase();\n for (const [k, v] of Object.entries(A6API_CATALOG)) {\n if (k.toLowerCase() === lowerId) {\n return v;\n }\n }\n const brand = inferBrand(modelId);\n const isVision = lowerId.includes('vision') || lowerId.includes('vl') || lowerId.includes('image');\n const hasReasoning = lowerId.includes('think') || lowerId.includes('reason') || lowerId.includes('pro') || lowerId.includes('sol');\n\n return {\n id: modelId,\n name: modelId,\n brand,\n contextWindow: 262144,\n maxTokens: 32768,\n modalities: isVision ? ['text', 'image'] : ['text'],\n ...(hasReasoning ? { thinkingFormat: 'deepseek' } : {}),\n };\n}\n", "import type { BalanceInfo, MerchantChannelInfo, OfficialPrices, ApiRoutingLogItem } from '../types.js';\nimport { resolveModelMeta } from './catalog.js';\n\n/** Normalize Base URL removing trailing slashes */\nexport function cleanBaseUrl(url: string): string {\n if (!url) return 'https://api.a6api.com';\n return url.trim().replace(/\\/+$/, '');\n}\n\n/** Format relative time */\nexport function formatRelativeTime(timestampSec: number): string {\n if (!timestampSec || timestampSec <= 0) return '\u521A\u521A';\n const now = Math.floor(Date.now() / 1000);\n const diff = now - timestampSec;\n if (diff < 0) return '\u521A\u521A';\n if (diff < 60) return '\u521A\u521A';\n if (diff < 3600) return `${Math.floor(diff / 60)} \u5206\u949F\u524D`;\n if (diff < 86400) return `${Math.floor(diff / 3600)} \u5C0F\u65F6\u524D`;\n return `${Math.floor(diff / 86400)} \u5929\u524D`;\n}\n\n/** Format CNY Price */\nexport function formatCnyPrice(micros: number, exchangeRate = 6.7209): string {\n if (micros === undefined || micros === null) return '\u2014';\n if (micros === 0) return '\u00A50';\n const usd = micros / 1_000_000;\n const cny = usd * exchangeRate;\n if (cny < 0.0001) return `\u00A5${cny.toFixed(6)}`;\n if (cny < 0.01) return `\u00A5${cny.toFixed(4)}`;\n if (cny < 1) return `\u00A5${cny.toFixed(4)}`;\n return `\u00A5${cny.toFixed(3)}`;\n}\n\nexport function buildWebHeaders(userId?: string, sessionCookie?: string): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',\n };\n const uid = userId ? String(userId).trim() : '';\n if (uid) {\n headers['New-Api-User'] = uid;\n }\n if (sessionCookie && sessionCookie.trim()) {\n const raw = sessionCookie.trim();\n if (raw.startsWith('session=')) {\n headers['Cookie'] = raw;\n } else if (raw.includes(';')) {\n headers['Cookie'] = raw;\n } else {\n // Set both Authorization (for System Access Token) and Cookie fallback\n headers['Authorization'] = raw;\n headers['Cookie'] = `session=${raw}`;\n }\n }\n return headers;\n}\n\n/** Fetch User Balance (Real Account Balance Only) */\nexport async function fetchBalance(\n baseURL: string,\n apiKey: string,\n userId?: string,\n sessionCookie?: string,\n): Promise<BalanceInfo | null> {\n const cleanUrl = cleanBaseUrl(baseURL);\n\n let hasAccountAuth = false;\n let accountBalanceUsd = 0;\n let accountBalanceFormatted = '\u672A\u8FDE\u63A5';\n let accountBalanceCnyFormatted = '';\n let username: string | undefined;\n let responseUserId: string | number | undefined = userId;\n let usedUsd = 0;\n let requestCount = 0;\n\n // 1. Fetch real account balance from Web Console API\n if (userId || sessionCookie) {\n const candidates = ['https://a6api.com/api/user/self', `${cleanUrl}/api/user/self`];\n const uniqueCandidates = [...new Set(candidates)];\n\n for (const url of uniqueCandidates) {\n try {\n const res = await fetch(url, {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(6000),\n });\n if (res.ok) {\n const json = await res.json();\n if (json?.data && json.data.quota !== undefined) {\n const quota = Number(json.data.quota || 0);\n const rawUsed = Number(json.data.used_quota || 0);\n const usd = Number((quota / 500000).toFixed(4));\n const cny = Number((usd * 6.7209).toFixed(2));\n const used = Number((rawUsed / 500000).toFixed(4));\n\n hasAccountAuth = true;\n accountBalanceUsd = usd;\n accountBalanceFormatted = `$${usd.toFixed(2)}`;\n accountBalanceCnyFormatted = `\u2248 \u00A5${cny.toFixed(2)}`;\n usedUsd = used;\n requestCount = Number(json.data.request_count || 0);\n username = json.data.username || json.data.display_name || undefined;\n if (json.data.id) responseUserId = json.data.id;\n break;\n }\n }\n } catch {\n // continue candidate\n }\n }\n }\n\n // 2. If only API Key is present, query usage for consumed statistics if auth is not yet connected\n if (!hasAccountAuth && apiKey && apiKey.trim()) {\n try {\n const usageRes = await fetch(`${cleanUrl}/v1/dashboard/billing/usage?start_date=2024-01-01&end_date=2030-12-31`, {\n headers: {\n Authorization: `Bearer ${apiKey.trim()}`,\n Accept: 'application/json',\n },\n signal: AbortSignal.timeout(6000),\n }).catch(() => null);\n\n if (usageRes && usageRes.ok) {\n const usageJson = await usageRes.json();\n usedUsd = Number(usageJson?.total_usage || 0);\n }\n } catch {}\n }\n\n if (!hasAccountAuth && (!apiKey || !apiKey.trim()) && (!userId || !userId.trim())) {\n return null;\n }\n\n return {\n hasAccountAuth,\n accountBalanceUsd,\n accountBalanceFormatted,\n accountBalanceCnyFormatted,\n usedUsd,\n usedFormatted: `$${usedUsd.toFixed(2)}`,\n requestCount,\n username,\n userId: responseUserId,\n isLow: hasAccountAuth ? accountBalanceUsd < 0.5 : false,\n updatedAt: Date.now(),\n };\n}\n\n/** Fetch Token Allowed Models */\nexport async function fetchTokenModels(baseURL: string, apiKey: string): Promise<string[]> {\n const cleanUrl = cleanBaseUrl(baseURL);\n if (!apiKey || !apiKey.trim()) return [];\n\n const endpoints = [`${cleanUrl}/v1/models`, `${cleanUrl}/models`];\n let lastErr = null;\n\n for (const url of endpoints) {\n try {\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${apiKey.trim()}`,\n Accept: 'application/json',\n },\n signal: AbortSignal.timeout(8000),\n });\n if (res.ok) {\n const json = await res.json();\n if (Array.isArray(json?.data)) {\n return json.data.map((m: any) => String(m.id || m.name)).filter(Boolean);\n }\n }\n } catch (err) {\n lastErr = err;\n }\n }\n\n if (lastErr) {\n console.warn('[dsh-a6api] fetchTokenModels failed:', lastErr);\n }\n return [];\n}\n\n/** Fetch Recent User Routing Logs */\nexport async function fetchRecentLogs(\n userId?: string,\n sessionCookie?: string,\n limit = 30,\n): Promise<ApiRoutingLogItem[]> {\n if (!userId && !sessionCookie) return [];\n try {\n const res = await fetch(`https://a6api.com/api/log/self?p=1&page_size=${limit}&type=0`, {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(8000),\n });\n if (res.ok) {\n const json = await res.json();\n if (Array.isArray(json?.data?.items)) {\n return json.data.items.map((it: any) => {\n const rawQuota = Number(it.quota || 0);\n const costUsd = rawQuota / 500000;\n let costFormatted = '$0.00';\n if (costUsd > 0) {\n if (costUsd < 0.0001) costFormatted = `$${costUsd.toFixed(6)}`;\n else if (costUsd < 0.01) costFormatted = `$${costUsd.toFixed(4)}`;\n else costFormatted = `$${costUsd.toFixed(4)}`;\n }\n\n const rawChannel = Number(it.channel || 0);\n let channelId: number | undefined = rawChannel > 0 ? rawChannel : undefined;\n if (!channelId && it.other) {\n try {\n const otherObj = JSON.parse(it.other);\n if (otherObj.actual_channel_id && Number(otherObj.actual_channel_id) > 0) {\n channelId = Number(otherObj.actual_channel_id);\n } else if (otherObj.billed_channel_id && Number(otherObj.billed_channel_id) > 0) {\n channelId = Number(otherObj.billed_channel_id);\n }\n } catch {}\n }\n\n const isError =\n it.type !== 2 ||\n (it.other && (\n it.other.includes('\"request_final_status\":\"failed\"') ||\n it.other.includes('\"request_final_status\":\"error\"') ||\n it.other.includes('\"request_final_status\":\"upstream_error\"')\n )) ||\n Boolean(it.content && it.content.startsWith('status_code='));\n\n return {\n id: it.id || it.request_id || String(Math.random()),\n created_at: Number(it.created_at || Date.now() / 1000),\n model_name: it.model_name || it.marketplace_model_name || '',\n channel: channelId,\n channel_name: it.channel_name || (channelId ? `\u5546\u6237 #${channelId}` : undefined),\n prompt_tokens: Number(it.prompt_tokens || 0),\n completion_tokens: Number(it.completion_tokens || 0),\n use_time: Number(it.use_time || 0),\n quota: rawQuota,\n cost_usd: costUsd,\n cost_formatted: costFormatted,\n token_name: it.token_name || 'API',\n status: isError ? ('error' as const) : ('success' as const),\n other: it.other,\n raw: it,\n };\n });\n }\n }\n } catch (err) {\n console.warn('[dsh-a6api] fetchRecentLogs error:', err);\n }\n return [];\n}\n\n/** Fetch Channel Card details from A6API Marketplace */\nexport async function fetchChannelDetails(\n channelId: number,\n userId?: string,\n sessionCookie?: string,\n targetModelName?: string,\n logSnapshot?: any,\n): Promise<MerchantChannelInfo | null> {\n if (!channelId) return null;\n const targetName = targetModelName || '';\n const meta = resolveModelMeta(targetName);\n\n try {\n const res = await fetch(\n `https://a6api.com/api/marketplace/channels/search?channel_id=${channelId}&view=list&page=1&page_size=20`,\n {\n headers: buildWebHeaders(userId, sessionCookie),\n signal: AbortSignal.timeout(8000),\n },\n );\n if (res.ok) {\n const json = await res.json();\n const items: any[] = json?.data?.items || [];\n if (items.length > 0) {\n // Find match for targetModelName if provided, otherwise first item\n const item =\n (targetName\n ? items.find((it) => it.model_name?.toLowerCase() === targetName.toLowerCase())\n : null) || items[0];\n\n const rate = Number(item.realtime_ratio_exchange_rate || 6.7209);\n const inMicros = Number(item.input_price_micros || 0);\n const outMicros = Number(item.output_price_micros || 0);\n const cacheReadMicros = Number(item.cache_read_price_micros || 0);\n const cacheWriteMicros = Number(item.cache_write_price_micros || 0);\n\n // Parse Smart Routing Labels\n const labels: string[] = [];\n if (item.authenticity_guaranteed) {\n const badge = item.authenticity_guarantee_badge_key;\n if (badge === 'gold') labels.push('\u4FDD\u771F \u00B7 \u91D1\u6807');\n else if (badge === 'silver') labels.push('\u4FDD\u771F \u00B7 \u94F6\u6807');\n else if (badge === 'bronze') labels.push('\u4FDD\u771F \u00B7 \u94DC\u6807');\n else labels.push('\u4FDD\u771F');\n }\n if (Array.isArray(item.smart_routing_labels)) {\n for (const l of item.smart_routing_labels) {\n if (l === 'stable' && !labels.includes('\u7A33\u5B9A')) labels.push('\u7A33\u5B9A');\n if (l === 'cheap' && !labels.includes('\u4F4E\u4EF7')) labels.push('\u4F4E\u4EF7');\n if (l === 'fast' && !labels.includes('\u9AD8\u901F')) labels.push('\u9AD8\u901F');\n if (l === 'quality' && !labels.includes('\u9AD8\u8D28')) labels.push('\u9AD8\u8D28');\n }\n }\n if (labels.length === 0) {\n labels.push('\u7A33\u5B9A', '\u4F4E\u4EF7', '\u9AD8\u901F', '\u9AD8\u8D28');\n }\n\n // Official Prices\n let official_price: OfficialPrices | undefined;\n if (item.official_price && item.official_price.input_price_micros !== undefined) {\n const offIn = Number(item.official_price.input_price_micros || 0);\n const offOut = Number(item.official_price.output_price_micros || 0);\n const offCR = Number(item.official_price.cache_read_price_micros || 0);\n const offCW = Number(item.official_price.cache_write_price_micros || 0);\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n } else if (meta.officialPriceMicros) {\n const offIn = meta.officialPriceMicros.input;\n const offOut = meta.officialPriceMicros.output;\n const offCR = meta.officialPriceMicros.cacheRead;\n const offCW = meta.officialPriceMicros.cacheWrite;\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n }\n\n const successRate24h =\n item.success_rate_24h !== undefined ? Number(item.success_rate_24h) / 100 : 99.3;\n const recentSuccessRate =\n item.recent_success_rate !== undefined ? Number(item.recent_success_rate) / 100 : 100;\n const cacheHitRate =\n item.cache_hit_rate_24h !== undefined ? Number(item.cache_hit_rate_24h) / 100 : 72.0;\n const lastSuccessAt = Number(item.last_success_at || item.last_test_time || 0);\n\n const ratioCny = Number(item.realtime_ratio_cny || (inMicros / 1000000) * rate || 0.0341);\n const ratioFormatted = ratioCny.toFixed(4);\n\n return {\n listing_id: item.listing_id,\n channel_id: item.channel_id,\n channel_name: item.channel_name || `\u5546\u6237 #${channelId}`,\n supplier_name: item.supplier_name || item.supplier_nickname || 'GPT\u4F4E\u4EF7',\n supplier_id: item.supplier_id || 290,\n model_name: item.model_name || targetName,\n brand: item.brand || meta.brand || 'OpenAI',\n description: item.description || '\u9AD8\u5E76\u53D1 \u4E3B\u6253\u4FBF\u5B9C \u7A33\u5B9A',\n charge_type: item.charge_type || 'per_token',\n charge_type_text: item.charge_type === 'per_token' ? '\u6309\u91CF' : '\u6309\u91CF',\n sample_count: Number(item.sample_count || 100),\n sample_count_text: `\u8FD1 ${item.sample_count || 100} \u6B21\u6837\u672C`,\n input_price_micros: inMicros,\n output_price_micros: outMicros,\n cache_read_price_micros: cacheReadMicros,\n cache_write_price_micros: cacheWriteMicros,\n input_price_cny: formatCnyPrice(inMicros, rate),\n output_price_cny: formatCnyPrice(outMicros, rate),\n cache_read_price_cny: formatCnyPrice(cacheReadMicros, rate),\n cache_write_price_cny: formatCnyPrice(cacheWriteMicros, rate),\n official_price,\n realtime_ratio_cny: ratioCny,\n realtime_ratio_formatted: ratioFormatted,\n recent_success_rate_pct: recentSuccessRate,\n success_rate_24h_pct: successRate24h,\n success_rate_7d_pct: item.success_rate_7d !== undefined ? Number(item.success_rate_7d) / 100 : undefined,\n success_buckets: Array.isArray(item.success_buckets) ? item.success_buckets : undefined,\n b24: Array.isArray(item.b24) ? item.b24 : undefined,\n b7d: Array.isArray(item.b7d) ? item.b7d : undefined,\n sr_24h_state: item.sr_24h_state || 'rate',\n sr_7d_state: item.sr_7d_state || 'no_data',\n p50_ttft_ms: Number(item.p50_ttft_ms || 2273),\n recent_p50_ms: Number(item.recent_p50_ms || item.last_test_response_ms || 2340),\n cache_hit_rate_pct: cacheHitRate,\n labels,\n last_success_at: lastSuccessAt,\n last_success_text: formatRelativeTime(lastSuccessAt),\n authenticity_guaranteed: Boolean(item.authenticity_guaranteed),\n authenticity_badge: item.authenticity_guarantee_badge_key,\n is_pinned: Boolean(item.pin_status === 'pinned' || item.is_pinned),\n user_channel_disabled: Boolean(item.user_channel_disabled),\n supplier_channel_disabled: Boolean(item.supplier_channel_disabled),\n raw: item,\n };\n }\n }\n } catch (err) {\n console.warn('[dsh-a6api] fetchChannelDetails error:', err);\n }\n\n // Fallback if we have log snapshot info\n if (logSnapshot) {\n const rate = 6.7209;\n const inMicros = Number(logSnapshot.marketplace_price_input_micros || 20300);\n const outMicros = Number(logSnapshot.marketplace_price_output_micros || 101502);\n const cacheReadMicros = Number(logSnapshot.marketplace_price_cache_read_micros || 2030);\n const cacheWriteMicros = Number(logSnapshot.marketplace_price_cache_write_micros || 25375);\n\n let official_price: OfficialPrices | undefined;\n if (meta.officialPriceMicros) {\n const offIn = meta.officialPriceMicros.input;\n const offOut = meta.officialPriceMicros.output;\n const offCR = meta.officialPriceMicros.cacheRead;\n const offCW = meta.officialPriceMicros.cacheWrite;\n official_price = {\n input_price_micros: offIn,\n output_price_micros: offOut,\n cache_read_price_micros: offCR,\n cache_write_price_micros: offCW,\n input_cny: formatCnyPrice(offIn, rate),\n output_cny: formatCnyPrice(offOut, rate),\n cache_read_cny: formatCnyPrice(offCR, rate),\n cache_write_cny: formatCnyPrice(offCW, rate),\n };\n }\n\n const ratioCny = Number((inMicros / 1000000) * rate || 0.0341);\n\n return {\n listing_id: logSnapshot.marketplace_listing_id,\n channel_id: channelId,\n channel_name: logSnapshot.channel_name || `\u5546\u6237 #${channelId}`,\n supplier_name: logSnapshot.supplier_nickname || logSnapshot.channel_name || 'GPT\u4F4E\u4EF7',\n supplier_id: 290,\n model_name: targetName || logSnapshot.model_name || '',\n brand: meta.brand || 'OpenAI',\n description: '\u9AD8\u5E76\u53D1 \u4E3B\u6253\u4FBF\u5B9C \u7A33\u5B9A',\n charge_type: 'per_token',\n charge_type_text: '\u6309\u91CF',\n sample_count: 100,\n sample_count_text: '\u8FD1 100 \u6B21\u6837\u672C',\n input_price_micros: inMicros,\n output_price_micros: outMicros,\n cache_read_price_micros: cacheReadMicros,\n cache_write_price_micros: cacheWriteMicros,\n input_price_cny: formatCnyPrice(inMicros, rate),\n output_price_cny: formatCnyPrice(outMicros, rate),\n cache_read_price_cny: formatCnyPrice(cacheReadMicros, rate),\n cache_write_price_cny: formatCnyPrice(cacheWriteMicros, rate),\n official_price,\n realtime_ratio_cny: ratioCny,\n realtime_ratio_formatted: ratioCny.toFixed(4),\n recent_success_rate_pct: 100,\n success_rate_24h_pct: 99.3,\n recent_p50_ms: Number(logSnapshot.use_time ? logSnapshot.use_time * 1000 : 2340),\n p50_ttft_ms: 2273,\n cache_hit_rate_pct: 72.0,\n labels: ['\u7A33\u5B9A', '\u4F4E\u4EF7', '\u9AD8\u901F', '\u9AD8\u8D28'],\n last_success_at: Math.floor(Date.now() / 1000),\n last_success_text: '\u521A\u521A',\n authenticity_guaranteed: false,\n is_pinned: false,\n user_channel_disabled: false,\n };\n }\n\n return null;\n}\n/** \u8F7B\u91CF\u62C9\u53D6\u4EF7\u683C\u6CE2\u52A8\u6761\u6570\uFF08\u4EC5 pending/unseen\uFF09 */\nexport async function fetchPriceFluctuation(\n userId?: string,\n sessionCookie?: string,\n accessToken?: string,\n): Promise<{ pendingCount: number; unseenCount: number; totalCount: number; notices?: any[]; authError?: boolean }> {\n const token = (accessToken || sessionCookie || '').trim();\n const uid = (userId || '').trim();\n if (!uid && !token) {\n return { pendingCount: 0, unseenCount: 0, totalCount: 0, authError: false };\n }\n const headers = buildWebHeaders(uid || undefined, token || undefined);\n const url = 'https://a6api.com/api/marketplace/price-notices';\n try {\n const res = await fetch(url, { headers, signal: AbortSignal.timeout(8000) });\n if (res.status === 401 || res.status === 403) {\n console.warn('[dsh-a6api] fetchPriceFluctuation auth failed', res.status);\n return { pendingCount: 0, unseenCount: 0, totalCount: 0, authError: true };\n }\n if (!res.ok) {\n console.warn('[dsh-a6api] fetchPriceFluctuation HTTP', res.status);\n return { pendingCount: 0, unseenCount: 0, totalCount: 0 };\n }\n const json: any = await res.json().catch(() => null);\n if (!json) return { pendingCount: 0, unseenCount: 0, totalCount: 0 };\n if (json.success === false) return { pendingCount: 0, unseenCount: 0, totalCount: 0 };\n\n // \u517C\u5BB9\u591A\u79CD\u8FD4\u56DE\u5F62\u6001\n let arr: any[] = [];\n if (Array.isArray(json)) arr = json;\n else if (Array.isArray(json.data)) arr = json.data;\n else if (Array.isArray(json.data?.notices)) arr = json.data.notices;\n else if (Array.isArray(json.data?.items)) arr = json.data.items;\n else if (Array.isArray(json.notices)) arr = json.notices;\n else if (Array.isArray(json.items)) arr = json.items;\n\n // \u533A\u5206\u201C\u5B57\u6BB5\u7F3A\u5931\u201D vs \u201C\u663E\u5F0F\u4E3A 0\u201D\u2014\u2014\u4EC5\u7F3A\u5931\u65F6\u624D\u515C\u5E95\n const pickWithPresent = (keys: string[]): { value: number; present: boolean } => {\n for (const k of keys) {\n const v = json?.data?.[k] ?? json?.[k];\n if (v !== undefined && v !== null) {\n const n = Number(v);\n if (!Number.isNaN(n)) return { value: n, present: true };\n }\n }\n return { value: 0, present: false };\n };\n const pendingPick = pickWithPresent(['pendingCount', 'pending_count', 'pending', 'openCount']);\n const unseenPick = pickWithPresent(['unseenCount', 'unseen_count', 'unseen', 'has_unseen_count']);\n let pending = pendingPick.value;\n let unseen = unseenPick.value;\n const total = arr.length;\n\n // \u4EC5\u5728\u8BA1\u6570\u952E\u7F3A\u5931\u65F6\u624D\u4ECE\u6570\u7EC4\u515C\u5E95\uFF0C\u907F\u514D\u8986\u76D6 API \u663E\u5F0F 0\n if (!pendingPick.present && arr.length > 0) {\n const counted = arr.filter((n: any) => {\n const s = String(n.state || n.status || '').toLowerCase();\n return s === 'open' || s === 'pending' || n.pending === true;\n }).length;\n // \u4EC5\u5F53\u6570\u7EC4\u6709\u53EF\u8BC6\u522B\u7684 state \u65F6\u624D\u7528 counted\uFF0C\u5426\u5219\u4FDD\u6301 0\uFF08\u4E0D\u731C\u6D4B\uFF09\n const hasState = arr.some((n: any) => n.state !== undefined || n.status !== undefined);\n if (hasState) pending = counted;\n // \u82E5\u65E0 state \u5B57\u6BB5\u4E14 pending \u7F3A\u5931\uFF0C\u4FDD\u6301 0\uFF0C\u4E0D\u518D\u9000\u5316\u4E3A total\n }\n if (!unseenPick.present && arr.length > 0) {\n unseen = arr.filter((n: any) => n.has_unseen === true || n.hasUnseen === true || n.unseen === true || n.is_unread === true).length;\n }\n\n // \u8C03\u8BD5\u65E5\u5FD7\u5DF2\u79FB\u9664\uFF08\u907F\u514D\u672A\u8131\u654F\u900F\u4F20\uFF09\uFF1B\u5982\u9700\u672C\u5730\u8C03\u8BD5\u53EF\u4E34\u65F6\u5F00\u542F DEBUG \u73AF\u5883\u53D8\u91CF\n // if (process.env.DEBUG) console.log('[dsh-a6api] price fluctuation sample', arr[0]);\n\n return { pendingCount: pending, unseenCount: unseen, totalCount: total, notices: arr };\n } catch (err) {\n console.warn('[dsh-a6api] fetchPriceFluctuation error', err);\n return { pendingCount: 0, unseenCount: 0, totalCount: 0 };\n }\n}\n", "import { cleanBaseUrl, fetchChannelDetails, fetchRecentLogs } from './a6api-client.js';\nimport type { ApiRoutingLogItem, MerchantChannelInfo } from '../types.js';\n\nexport interface ProbeResult {\n modelName: string;\n success: boolean;\n channelId?: number;\n channelName?: string;\n merchant?: MerchantChannelInfo | null;\n error?: string;\n durationMs?: number;\n}\n\n/** Delay helper */\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/** Probe a single model by sending a 1-token prompt and querying logs */\nexport async function probeSingleModel(\n baseURL: string,\n apiKey: string,\n userId?: string,\n accessToken?: string,\n modelName?: string,\n): Promise<ProbeResult> {\n const targetModel = modelName || '';\n const cleanUrl = cleanBaseUrl(baseURL);\n if (!apiKey) {\n return { modelName: targetModel, success: false, error: '\u672A\u914D\u7F6E API Key' };\n }\n\n const startTime = Date.now();\n let requestOk = false;\n let requestError = '';\n\n try {\n const res = await fetch(`${cleanUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey.trim()}`,\n },\n body: JSON.stringify({\n model: targetModel,\n messages: [{ role: 'user', content: '1' }],\n max_tokens: 1,\n }),\n // \u63A8\u7406\u6A21\u578B(\u5982 grok-4.6)\u5B9E\u6D4B\u5355\u6B21\u54CD\u5E94\u53EF\u8FBE 40-90s+,\u9608\u503C\u8FC7\u77ED\u4F1A\u88AB\u9891\u7E41\u6390\u65AD\u5BFC\u81F4\u63A2\u6D4B\u5931\u8D25\n signal: AbortSignal.timeout(180000),\n });\n\n if (res.ok) {\n requestOk = true;\n } else {\n const errText = await res.text();\n requestError = `HTTP ${res.status}: ${errText.slice(0, 150)}`;\n }\n } catch (err: any) {\n const raw = err?.message || String(err);\n // \u8D85\u65F6\u9519\u8BEF\u82F1\u6587\u539F\u6587\u5BF9\u7528\u6237\u4E0D\u53CB\u597D,\u8F6C\u4E3A\u4E2D\u6587\u63D0\u793A\n if (raw.includes('aborted due to timeout') || err?.name === 'TimeoutError') {\n requestError = '\u63A2\u6D4B\u8D85\u65F6(\u9608\u503C180\u79D2) \u2014 \u63A8\u7406\u6A21\u578B\u54CD\u5E94\u8F83\u6162,\u5DF2\u4FDD\u7559\u4E0A\u6B21\u5546\u6237\u6570\u636E,\u8BF7\u7A0D\u540E\u91CD\u8BD5';\n } else {\n requestError = raw;\n }\n }\n\n const durationMs = Date.now() - startTime;\n\n // \u4EC5\u8BF7\u6C42\u6210\u529F\u540E\u67E5\u65E5\u5FD7,\u5931\u8D25\u65F6\u76F4\u63A5\u8FD4\u56DE\u9519\u8BEF(\u4E0D\u5728\u5361\u7247\u4E0A\u56DE\u9000\u5C55\u793A\u5386\u53F2\u5546\u6237)\n if (requestOk && (userId || accessToken)) {\n // Wait slightly for gateway log writing (\u6162\u6A21\u578B\u8BF7\u6C42\u671F\u95F4\u65E5\u5FD7\u5DF2\u843D\u76D8,\u5FEB\u6A21\u578B\u9700\u8981\u7B49\u5F85)\n await sleep(1200);\n try {\n const logs = await fetchRecentLogs(userId, accessToken, 15);\n const minTimestamp = Math.floor(startTime / 1000) - 10;\n // Find recent log entry for this model\n const log =\n logs.find(\n (it) =>\n it.model_name?.toLowerCase() === targetModel.toLowerCase() &&\n Number(it.created_at || 0) >= minTimestamp,\n ) || logs.find((it) => it.model_name?.toLowerCase() === targetModel.toLowerCase());\n\n if (log && log.channel) {\n const channelId = Number(log.channel);\n let logSnapshot: any = null;\n if (log.other) {\n try {\n logSnapshot = { ...JSON.parse(log.other), channel_name: log.channel_name, model_name: log.model_name };\n } catch {}\n }\n const merchant = await fetchChannelDetails(channelId, userId, accessToken, targetModel, logSnapshot);\n return {\n modelName: targetModel,\n success: true,\n channelId,\n channelName: log.channel_name,\n merchant,\n durationMs,\n };\n }\n } catch (err: any) {\n console.warn(`[dsh-a6api] Log lookup error for ${targetModel}:`, err);\n }\n }\n\n return {\n modelName: targetModel,\n success: requestOk,\n durationMs,\n error: requestOk ? undefined : requestError,\n };\n}\n\n/** Pre-populate merchant cards from recent logs without triggering live probe */\nexport async function getKnownMerchantsFromLogs(\n userId?: string,\n accessToken?: string,\n modelNames: string[] = [],\n logs?: ApiRoutingLogItem[],\n): Promise<Record<string, MerchantChannelInfo>> {\n if ((!userId && !accessToken) || modelNames.length === 0) return {};\n\n const result: Record<string, MerchantChannelInfo> = {};\n try {\n const items = logs !== undefined ? logs : await fetchRecentLogs(userId, accessToken, 50);\n // \u9632\u5FA1\u6027\u6392\u5E8F\uFF1A\u4E0E /state \u7684 lastRoutedMap \u4FDD\u6301\u4E00\u81F4\n const sorted = items.slice().sort((a: any, b: any) => (Number(b.created_at) || 0) - (Number(a.created_at) || 0));\n const modelToLog = new Map<string, any>();\n\n for (const log of sorted) {\n const mName = log.model_name;\n const chId = Number(log.channel);\n if (mName && chId && !modelToLog.has(mName.toLowerCase())) {\n modelToLog.set(mName.toLowerCase(), log);\n }\n }\n\n const matchedEntries: { modelName: string; log: any }[] = [];\n for (const name of modelNames) {\n const log = modelToLog.get(name.toLowerCase());\n if (log) {\n matchedEntries.push({ modelName: name, log });\n }\n }\n\n // Fetch details with concurrency limit 4\n for (let i = 0; i < matchedEntries.length; i += 4) {\n const batch = matchedEntries.slice(i, i + 4);\n await Promise.all(\n batch.map(async ({ modelName, log }) => {\n try {\n const channelId = Number(log.channel);\n let logSnapshot: any = null;\n if (log.other) {\n try {\n logSnapshot = { ...JSON.parse(log.other), channel_name: log.channel_name, model_name: log.model_name };\n } catch {}\n }\n const card = await fetchChannelDetails(channelId, userId, accessToken, modelName, logSnapshot);\n if (card) {\n result[modelName] = card;\n }\n } catch {\n // ignore\n }\n }),\n );\n }\n } catch (err) {\n console.warn('[dsh-a6api] getKnownMerchantsFromLogs error:', err);\n }\n\n return result;\n}\n", "import * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { resolveModelMeta } from './catalog.js';\nimport type { A6ApiConfig } from '../types.js';\n\nexport const A6API_CRED_REF = 'A6API_API_KEY';\n\n/** \u539F\u5B50\u5199\u5165\uFF1A\u5148\u5199\u4E34\u65F6\u6587\u4EF6\uFF080600/0644\uFF09\u518D rename\uFF0C\u907F\u514D\u5D29\u6E83\u622A\u65AD\u4E0E\u6743\u9650\u4F4D\u6CC4\u9732 */\nasync function atomicWriteFile(filePath: string, content: string, mode = 0o600): Promise<void> {\n const dir = path.dirname(filePath);\n await fsp.mkdir(dir, { recursive: true });\n const tmpPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`);\n await fsp.writeFile(tmpPath, content, { mode });\n await fsp.rename(tmpPath, filePath);\n}\n\nfunction dshHome(): string {\n return process.env.DSH_HOME || path.join(os.homedir(), '.dsh');\n}\n\nfunction configFile(): string {\n return path.join(dshHome(), 'dsh-a6api-config.json');\n}\n\nfunction credentialsFile(): string {\n return path.join(dshHome(), '.credentials.yaml');\n}\n\nfunction settingsFile(): string {\n return path.join(dshHome(), 'settings.yaml');\n}\n\n/** Read plugin dedicated config */\nexport async function readPluginConfig(): Promise<A6ApiConfig> {\n const filePath = configFile();\n let raw = '';\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n // try reading default credential if exists\n const apiKey = (await readCredentialKey(A6API_CRED_REF)) || '';\n return {\n baseURL: 'https://api.a6api.com',\n apiKey,\n userId: '',\n activeModels: [],\n };\n }\n\n try {\n const parsed = JSON.parse(raw);\n const apiKey = parsed.apiKey || (await readCredentialKey(A6API_CRED_REF)) || '';\n const accessToken = parsed.accessToken || parsed.systemAccessToken || parsed.sessionCookie || '';\n return {\n baseURL: parsed.baseURL || 'https://api.a6api.com',\n apiKey,\n accessToken,\n userId: parsed.userId || '',\n sessionCookie: accessToken,\n activeModels: Array.isArray(parsed.activeModels) ? parsed.activeModels : [],\n customBaseURL: parsed.customBaseURL,\n };\n } catch {\n return {\n baseURL: 'https://api.a6api.com',\n apiKey: '',\n accessToken: '',\n userId: '',\n activeModels: [],\n };\n }\n}\n\n/** Save plugin dedicated config\uFF08\u5BC6\u94A5\u5355\u4E00\u771F\u76F8\u6E90\u5728 ~/.dsh/.credentials.yaml\uFF0C\u914D\u7F6E JSON \u4E0D\u518D\u5197\u4F59\u660E\u6587\uFF09 */\nexport async function savePluginConfig(config: A6ApiConfig): Promise<void> {\n const filePath = configFile();\n const { apiKey: _apiKey, ...safeConfig } = config;\n await atomicWriteFile(filePath, JSON.stringify(safeConfig, null, 2));\n\n // Also sync credential\n if (config.apiKey && config.apiKey.trim()) {\n await writeCredentialKey(A6API_CRED_REF, config.apiKey.trim());\n }\n}\n\n/** Read a key from .credentials.yaml */\nexport async function readCredentialKey(refKey: string): Promise<string | null> {\n try {\n const yaml = await fsp.readFile(credentialsFile(), 'utf8');\n let inRefs = false;\n for (const line of yaml.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 0) {\n inRefs = trimmed.startsWith('refs:');\n continue;\n }\n if (!inRefs) continue;\n const m = /^([A-Za-z0-9_.\\-]+):\\s*(.*)$/.exec(trimmed);\n if (m && m[1] === refKey) {\n let val = m[2].trim();\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.slice(1, -1);\n }\n return val;\n }\n }\n } catch {}\n return null;\n}\n\n/** Write/update a key in .credentials.yaml */\nexport async function writeCredentialKey(refKey: string, value: string): Promise<void> {\n const cFile = credentialsFile();\n let yaml = '';\n try {\n yaml = await fsp.readFile(cFile, 'utf8');\n } catch {\n yaml = 'version: 1\\nrefs:\\n';\n }\n\n const lines = yaml.split(/\\r?\\n/);\n let inRefs = false;\n let refsLineIdx = -1;\n let found = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 0) {\n if (trimmed.startsWith('refs:')) {\n inRefs = true;\n refsLineIdx = i;\n } else {\n inRefs = false;\n }\n continue;\n }\n if (inRefs) {\n const m = /^([A-Za-z0-9_.\\-]+):/.exec(trimmed);\n if (m && m[1] === refKey) {\n lines[i] = ` ${refKey}: ${JSON.stringify(value)}`;\n found = true;\n break;\n }\n }\n }\n\n if (!found) {\n if (refsLineIdx >= 0) {\n lines.splice(refsLineIdx + 1, 0, ` ${refKey}: ${JSON.stringify(value)}`);\n } else {\n lines.push('refs:', ` ${refKey}: ${JSON.stringify(value)}`);\n }\n }\n\n await atomicWriteFile(cFile, lines.join('\\n'), 0o600);\n}\n\n/** Sync active models to DSH settings.yaml under llm-pi-ai.providers.a6api */\nexport async function syncToDshSettings(baseURL: string, modelIds: string[]): Promise<void> {\n const sFile = settingsFile();\n let yaml = '';\n try {\n yaml = await fsp.readFile(sFile, 'utf8');\n } catch {\n yaml = 'llm-pi-ai:\\n providers:\\n';\n }\n\n // Build the YAML block for models\n const modelEntries = modelIds.map((id) => {\n const meta = resolveModelMeta(id);\n const lines = [\n ` - id: ${meta.id}`,\n ` name: ${meta.name}`,\n ` contextWindow: ${meta.contextWindow}`,\n ` maxTokens: ${meta.maxTokens}`,\n ` input:`,\n ...meta.modalities.map((m) => ` - ${m}`),\n ];\n if (meta.reasoningEfforts) {\n lines.push(` reasoningEfforts:`);\n for (const [k, v] of Object.entries(meta.reasoningEfforts)) {\n if (v) lines.push(` ${k}: ${v}`);\n }\n }\n return lines.join('\\n');\n });\n\n // Ensure OpenAI compatible endpoints in DSH settings.yaml have the /v1 suffix\n const dshBaseUrl = baseURL.endsWith('/v1') ? baseURL : `${baseURL.replace(/\\/+$/, '')}/v1`;\n\n const a6apiBlockLines = [\n ` a6api:`,\n ` displayName: A6API`,\n ` apiKeyEnv: ${A6API_CRED_REF}`,\n ` api: openai-completions`,\n ` baseURL: ${dshBaseUrl}`,\n ` models:`,\n ...(modelEntries.length > 0 ? modelEntries : [` []`]),\n ];\n\n // Look for `llm-pi-ai:` -> `providers:` -> `a6api:`\n const lines = yaml.split(/\\r?\\n/);\n let inLlm = false;\n let inProviders = false;\n let inA6 = false;\n let a6Start = -1;\n let a6End = -1;\n let providersLineIdx = -1;\n let llmLineIdx = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n\n if (indent === 0) {\n inLlm = trimmed.startsWith('llm-pi-ai:');\n if (inLlm) llmLineIdx = i;\n inProviders = false;\n inA6 = false;\n continue;\n }\n\n if (inLlm && indent === 2 && trimmed.startsWith('providers:')) {\n inProviders = true;\n providersLineIdx = i;\n inA6 = false;\n continue;\n }\n\n if (inProviders && indent === 4) {\n if (trimmed.startsWith('a6api:')) {\n inA6 = true;\n a6Start = i;\n a6End = i + 1;\n } else {\n if (inA6) {\n a6End = i;\n inA6 = false;\n }\n }\n continue;\n }\n\n if (inA6 && indent > 4) {\n a6End = i + 1;\n } else if (inA6 && indent <= 4) {\n a6End = i;\n inA6 = false;\n }\n }\n\n if (a6Start >= 0) {\n // Replace existing a6api block\n lines.splice(a6Start, a6End - a6Start, ...a6apiBlockLines);\n } else if (providersLineIdx >= 0) {\n // Insert under providers:\n lines.splice(providersLineIdx + 1, 0, ...a6apiBlockLines);\n } else if (llmLineIdx >= 0) {\n // Insert providers: then a6api\n lines.splice(llmLineIdx + 1, 0, ` providers:`, ...a6apiBlockLines);\n } else {\n // Insert llm-pi-ai: providers: a6api\n lines.push(`llm-pi-ai:`, ` providers:`, ...a6apiBlockLines);\n }\n\n await atomicWriteFile(sFile, lines.join('\\n'), 0o644);\n}\n\n/** Get currently configured model IDs in DSH settings for a6api */\nexport async function getDshConfiguredModels(): Promise<string[]> {\n try {\n const yaml = await fsp.readFile(settingsFile(), 'utf8');\n const lines = yaml.split(/\\r?\\n/);\n let inA6 = false;\n let inModels = false;\n const modelIds: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent === 4 && trimmed.startsWith('a6api:')) {\n inA6 = true;\n inModels = false;\n continue;\n }\n if (inA6 && indent <= 4 && !trimmed.startsWith('a6api:')) {\n inA6 = false;\n inModels = false;\n }\n if (inA6 && indent === 6 && trimmed.startsWith('models:')) {\n inModels = true;\n continue;\n }\n if (inModels && indent === 8 && trimmed.startsWith('- id:')) {\n const id = trimmed.replace(/^- id:\\s*/, '').trim();\n if (id) modelIds.push(id);\n }\n }\n return modelIds;\n } catch {\n return [];\n }\n}\n", "import { fetchBalance, fetchTokenModels, fetchRecentLogs, fetchPriceFluctuation, formatRelativeTime } from './server/a6api-client.js';\nimport { getKnownMerchantsFromLogs, probeSingleModel } from './server/probe.js';\nimport { resolveModelMeta } from './server/catalog.js';\nimport {\n getDshConfiguredModels,\n readPluginConfig,\n savePluginConfig,\n syncToDshSettings,\n} from './server/sync.js';\nimport type { A6ApiConfig, A6ApiStateResponse, MerchantChannelInfo, ModelCardData } from './types.js';\n\nexport const name = '@lynn123411/dsh-a6api';\nexport const inject = ['webServer'];\n\nexport {\n fetchBalance,\n fetchTokenModels,\n fetchRecentLogs,\n fetchChannelDetails,\n} from './server/a6api-client.js';\nexport { probeSingleModel, getKnownMerchantsFromLogs } from './server/probe.js';\nexport { resolveModelMeta, A6API_CATALOG } from './server/catalog.js';\nexport { readPluginConfig, savePluginConfig, syncToDshSettings } from './server/sync.js';\n\nconst PREFIX = '/api/dsh-a6api';\n\n/** \u5BA2\u6237\u7AEF\u8131\u654F\u5360\u4F4D\u7B26\uFF1A\u670D\u52A1\u7AEF\u7EDD\u4E0D\u56DE\u4F20\u771F\u5B9E\u5BC6\u94A5 */\nconst MASK = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022';\n\n/** \u8131\u654F\u914D\u7F6E\uFF1AAPI Key / \u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C / userId \u4EC5\u4EE5\u5360\u4F4D\u7B26\u5F62\u5F0F\u4E0B\u53D1\uFF0C\u771F\u5B9E\u503C\u53EA\u5B58\u5728\u4E8E\u670D\u52A1\u7AEF */\nfunction maskConfig(c: A6ApiConfig): A6ApiConfig {\n return {\n ...c,\n apiKey: c.apiKey ? MASK : '',\n accessToken: c.accessToken || c.sessionCookie ? MASK : '',\n sessionCookie: '',\n userId: c.userId ? MASK : '',\n hasApiKey: Boolean(c.apiKey),\n hasToken: Boolean(c.accessToken || c.sessionCookie),\n };\n}\n\nfunction sendJson(res: any, status: number, body: any) {\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-cache',\n // \u4E0D\u8BBE access-control-allow-origin\uFF1A\u4EC5\u5141\u8BB8\u540C\u6E90\u8C03\u7528\uFF0C\u963B\u65AD\u8DE8\u7AD9\u8BFB\u53D6\u4E0E CSRF \u9884\u68C0\n });\n res.end(JSON.stringify(body));\n}\n\nfunction readBody(req: any): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n req.on('data', (chunk: any) => {\n data += chunk;\n if (data.length > 2 * 1024 * 1024) {\n req.destroy();\n reject(new Error('Body too large'));\n }\n });\n req.on('end', () => resolve(data.trim()));\n req.on('error', reject);\n });\n}\n\nasync function parseJsonBody(req: any): Promise<any> {\n const text = await readBody(req);\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n throw new Error('Invalid JSON body');\n }\n}\n\n// In-memory cache for merchant cards to avoid duplicate log calls\nconst merchantCardCache = new Map<string, { card: MerchantChannelInfo; at: number }>();\n/** \u5361\u7247\u7F13\u5B58\u6709\u6548\u671F:\u8FC7\u671F\u540E /state \u4ECE\u6700\u65B0\u65E5\u5FD7\u91CD\u65B0\u63A8\u5BFC,\u907F\u514D\u6C38\u8FDC\u5C55\u793A\u9648\u65E7\u5546\u6237 */\nconst MERCHANT_CARD_TTL_MS = 15 * 60 * 1000;\n\nexport function apply(ctx: any): void {\n // Register Web API routes\n const webServer = ctx.webServer || (ctx.get ? ctx.get('webServer') : null);\n if (webServer && typeof webServer.register === 'function') {\n ctx.effect(() => {\n const unregister = webServer.register({\n kind: 'prefix',\n path: PREFIX,\n handler: async (req: any, res: any) => {\n const url = new URL(req.url || '/', 'http://localhost');\n const pathname = url.pathname.replace(PREFIX, '') || '/';\n\n // CORS preflight\uFF1A\u540C\u6E90\u7B56\u7565\u4E0B\u65E0\u9700\u653E\u884C\u8DE8\u6E90\uFF08\u79FB\u9664 ACAO \u540E\u8DE8\u6E90\u9884\u68C0\u5929\u7136\u5931\u8D25\uFF09\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n return res.end();\n }\n\n try {\n // GET /state\n if (pathname === '/state' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const balance = await fetchBalance(config.baseURL, config.apiKey, config.userId, token);\n \n // Auto-persist discovered userId\n if (balance?.userId && String(balance.userId) !== config.userId) {\n config.userId = String(balance.userId);\n await savePluginConfig(config);\n }\n\n const dshConfiguredModels = await getDshConfiguredModels();\n\n // Fetch allowed model IDs for this token\n let modelIds: string[] = [];\n if (config.apiKey) {\n modelIds = await fetchTokenModels(config.baseURL, config.apiKey);\n }\n\n // Fallback to active/configured models if token query returned empty\n if (modelIds.length === 0) {\n modelIds = [\n ...new Set([\n ...config.activeModels,\n ...dshConfiguredModels,\n 'gpt-5.6-sol',\n 'gpt-5.6-terra',\n 'gpt-5.6-luna',\n 'claude-fable-5',\n 'claude-opus-5',\n 'grok-4.6',\n ]),\n ];\n }\n\n // \u4E00\u6B21\u62C9\u53D6\u65E5\u5FD7(\u63A5\u53E3\u5B9E\u6D4B\u4E0A\u9650 100 \u6761),\u540C\u4E00\u4EFD\u6570\u636E\u7528\u4E8E: \u2460\u5546\u6237\u5361\u7247\u9884\u586B\u5145 \u2461\u8DEF\u7531\u5FEB\u7167\u65F6\u6548\u6620\u5C04 \u2462Account \u9875\u6700\u8FD1\u660E\u7EC6\n const allLogs = await fetchRecentLogs(config.userId, token, 100);\n // \u9632\u5FA1\u6027\u6392\u5E8F\uFF1A\u4F9D\u8D56\u201C\u6700\u65B0\u5728\u524D\u201D\uFF0C\u82E5\u7F51\u5173\u6392\u5E8F\u53D8\u66F4\u4ECD\u80FD\u6B63\u786E\u53D6\u9996\u6761\n allLogs.sort((a, b) => (Number(b.created_at) || 0) - (Number(a.created_at) || 0));\n\n // Match known merchant cards from recent logs if not yet in cache (with 10s total timeout to avoid /state hang)\n if (config.userId || token) {\n const missing = modelIds.filter((m) => {\n const entry = merchantCardCache.get(m.toLowerCase());\n return !entry || Date.now() - entry.at >= MERCHANT_CARD_TTL_MS;\n });\n if (missing.length > 0) {\n let found: Record<string, MerchantChannelInfo> = {};\n try {\n found = await Promise.race([\n getKnownMerchantsFromLogs(config.userId, token, missing, allLogs),\n new Promise<Record<string, MerchantChannelInfo>>((resolve) => setTimeout(() => resolve({}), 10000)),\n ]);\n } catch {\n found = {};\n }\n for (const [mName, card] of Object.entries(found)) {\n merchantCardCache.set(mName.toLowerCase(), { card, at: Date.now() });\n }\n }\n }\n\n // \u8DEF\u7531\u5FEB\u7167\u65F6\u6548: \u6BCF\u4E2A\u6A21\u578B\u6700\u65B0\u4E00\u6761\u300C\u5E26 channel \u7684\u8C03\u7528\u65E5\u5FD7\u300D\u65F6\u95F4 \u2014\u2014 \u4E0E\u9884\u586B\u5145\u5361\u7247\u5546\u6237\u6570\u636E\u540C\u4E00\u6761\u89C4\u5219(\u53D6\u6700\u65B0\u547D\u4E2D\u5546\u6237\u8DEF\u7531\u7684\u8BF7\u6C42)\n const lastRoutedMap = new Map<string, number>();\n for (const log of allLogs) {\n const mName = log.model_name;\n const chId = Number(log.channel);\n const ts = Number(log.created_at) || 0;\n if (mName && chId > 0 && ts > 0 && !lastRoutedMap.has(mName.toLowerCase())) {\n lastRoutedMap.set(mName.toLowerCase(), ts);\n }\n }\n\n const dshSet = new Set(dshConfiguredModels);\n const models: ModelCardData[] = modelIds.map((mId) => {\n const meta = resolveModelMeta(mId);\n const cacheEntry = merchantCardCache.get(mId.toLowerCase());\n const cachedCard =\n cacheEntry && Date.now() - cacheEntry.at < MERCHANT_CARD_TTL_MS\n ? cacheEntry.card\n : undefined;\n const routedAt = lastRoutedMap.get(mId.toLowerCase());\n return {\n model_name: mId,\n brand: meta.brand,\n contextWindow: meta.contextWindow,\n maxTokens: meta.maxTokens,\n modalities: meta.modalities,\n hasReasoning: Boolean(meta.reasoningEfforts || meta.thinkingFormat),\n inDsh: dshSet.has(mId),\n merchant: cachedCard,\n probeStatus: cachedCard ? 'success' : 'idle',\n lastRoutedAt: routedAt,\n lastRoutedText: routedAt ? formatRelativeTime(routedAt) : undefined,\n };\n });\n\n // Account \u9875\u660E\u7EC6\u4FDD\u6301\u539F\u6709\u7A97\u53E3 (20 \u6761)\n const recentLogs = allLogs.slice(0, 20);\n\n const response: A6ApiStateResponse = {\n config: maskConfig(config),\n balance,\n models,\n dshConfiguredModels,\n recentLogs,\n };\n return sendJson(res, 200, { ok: true, data: response });\n }\n\n // POST /config\n if (pathname === '/config' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const current = await readPluginConfig();\n const rawToken =\n body.accessToken !== undefined && body.accessToken !== MASK\n ? body.accessToken\n : body.sessionCookie !== undefined && body.sessionCookie !== MASK\n ? body.sessionCookie\n : (current.accessToken || current.sessionCookie || '');\n const newApiKey =\n body.apiKey !== undefined && body.apiKey !== MASK ? body.apiKey : current.apiKey;\n\n const updated: A6ApiConfig = {\n baseURL: body.baseURL !== undefined ? body.baseURL : current.baseURL,\n apiKey: newApiKey,\n accessToken: rawToken,\n sessionCookie: rawToken,\n userId: body.userId !== undefined ? body.userId : current.userId,\n activeModels: Array.isArray(body.activeModels) ? body.activeModels : current.activeModels,\n customBaseURL: body.customBaseURL !== undefined ? body.customBaseURL : current.customBaseURL,\n };\n\n // Validate access token and auto-fetch balance & userId\n const balance = await fetchBalance(updated.baseURL, updated.apiKey, updated.userId, updated.accessToken);\n if (balance?.userId) {\n updated.userId = String(balance.userId);\n }\n\n await savePluginConfig(updated);\n\n // If active models exist, sync to DSH settings as well\n if (updated.activeModels.length > 0) {\n await syncToDshSettings(updated.baseURL, updated.activeModels);\n }\n return sendJson(res, 200, { ok: true, config: maskConfig(updated), balance });\n }\n\n // GET /balance\n if (pathname === '/balance' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const balance = await fetchBalance(config.baseURL, config.apiKey, config.userId, token);\n const recentLogs = await fetchRecentLogs(config.userId, token, 20);\n return sendJson(res, 200, { ok: true, balance, recentLogs });\n }\n\n // GET /logs\n if (pathname === '/logs' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const recentLogs = await fetchRecentLogs(config.userId, token, 30);\n return sendJson(res, 200, { ok: true, logs: recentLogs });\n }\n\n // POST /probe\n if (pathname === '/probe' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n const modelName = body.modelName;\n\n if (modelName && modelName !== 'all') {\n const result = await probeSingleModel(config.baseURL, config.apiKey, config.userId, token, modelName);\n if (result.merchant) {\n merchantCardCache.set(modelName.toLowerCase(), { card: result.merchant, at: Date.now() });\n }\n return sendJson(res, 200, { ok: true, result });\n }\n\n // Probe all models in token\n let modelIds: string[] = body.modelNames;\n if (!Array.isArray(modelIds) || modelIds.length === 0) {\n modelIds = await fetchTokenModels(config.baseURL, config.apiKey);\n }\n if (modelIds.length === 0) {\n modelIds = config.activeModels;\n }\n\n const results = [];\n for (const m of modelIds) {\n const r = await probeSingleModel(config.baseURL, config.apiKey, config.userId, token, m);\n if (r.merchant) {\n merchantCardCache.set(m.toLowerCase(), { card: r.merchant, at: Date.now() });\n }\n results.push(r);\n }\n\n return sendJson(res, 200, { ok: true, results });\n }\n\n // POST /sync-models\n if (pathname === '/sync-models' && req.method === 'POST') {\n const body = await parseJsonBody(req);\n const config = await readPluginConfig();\n const modelIds = Array.isArray(body.modelIds) ? body.modelIds : [];\n const baseURL = body.baseURL || config.baseURL;\n\n config.activeModels = modelIds;\n config.baseURL = baseURL;\n await savePluginConfig(config);\n await syncToDshSettings(baseURL, modelIds);\n\n const dshConfiguredModels = await getDshConfiguredModels();\n return sendJson(res, 200, { ok: true, dshConfiguredModels });\n }\n\n // GET /price-fluctuation \u2014 \u8F7B\u91CF\u4EF7\u683C\u6CE2\u52A8\u6761\u6570\uFF08\u5F85\u5904\u7406 n\uFF09\uFF0C\u4EC5\u56DE\u4F20\u8BA1\u6570\n if (pathname === '/price-fluctuation' && (req.method === 'GET' || req.method === 'HEAD')) {\n const config = await readPluginConfig();\n const token = config.accessToken || config.sessionCookie || '';\n if (!token || !config.userId) {\n return sendJson(res, 200, { ok: true, data: { pendingCount: 0, unseenCount: 0, totalCount: 0, hasAuth: false, authError: false, updatedAt: Date.now() } });\n }\n const result = await fetchPriceFluctuation(config.userId, token, token);\n const { notices, ...counts } = result as any;\n // 401/403 \u65F6 authError=true\uFF0C\u5BA2\u6237\u7AEF\u53EF\u533A\u5206\u201C\u672A\u914D\u7F6E\u201D\u4E0E\u201C\u5931\u6548\u201D\n const hasAuth = !counts.authError;\n return sendJson(res, 200, { ok: true, data: { pendingCount: counts.pendingCount, unseenCount: counts.unseenCount, totalCount: counts.totalCount, hasAuth, authError: Boolean(counts.authError), updatedAt: Date.now() } });\n }\n\n return sendJson(res, 404, { ok: false, error: 'Not found' });\n } catch (err: any) {\n console.error('[dsh-a6api] API error:', err);\n return sendJson(res, 500, { ok: false, error: err?.message || String(err) });\n }\n },\n });\n\n return () => {\n if (typeof unregister === 'function') unregister();\n };\n }, 'dsh-a6api: web API router');\n }\n}\n"],
5
+ "mappings": ";AAEO,IAAM,gBAAgD;AAAA;AAAA,EAE3D,eAAe;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AAAA,IACxE,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAU,WAAW,KAAQ,YAAY,IAAQ;AAAA,EAClG;AAAA,EACA,iBAAiB;AAAA,IACf,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AAAA,IACxE,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAU,WAAW,KAAQ,YAAY,IAAQ;AAAA,EAClG;AAAA,EACA,gBAAgB;AAAA,IACd,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AAAA,IACxE,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAU,WAAW,KAAQ,YAAY,KAAQ;AAAA,EAClG;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AAAA,IACxE,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAU,WAAW,KAAQ,YAAY,IAAQ;AAAA,EAClG;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AAAA,IACxE,qBAAqB,EAAE,OAAO,KAAS,QAAQ,MAAU,WAAW,KAAQ,YAAY,MAAQ;AAAA,EAClG;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AAAA,IACxE,qBAAqB,EAAE,OAAO,MAAS,QAAQ,KAAU,WAAW,MAAQ,YAAY,IAAQ;AAAA,EAClG;AAAA,EACA,gBAAgB;AAAA,IACd,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AAAA,IACxE,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,KAAQ,WAAW,MAAO,YAAY,KAAO;AAAA,EAC7F;AAAA,EACA,iBAAiB;AAAA,IACf,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AAAA,EACA,uBAAuB;AAAA,IACrB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AAAA,EACA,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAS,QAAQ,KAAU,WAAW,OAAS,YAAY,KAAQ;AAAA,EACnG;AAAA,EACA,eAAe;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,KAAQ,WAAW,MAAO,YAAY,KAAO;AAAA,EAC7F;AAAA;AAAA,EAGA,iBAAiB;AAAA,IACf,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,MAAU,QAAQ,MAAU,WAAW,MAAS,YAAY,OAAS;AAAA,EACrG;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,MAAU,WAAW,KAAQ,YAAY,MAAQ;AAAA,EAClG;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,KAAS,QAAQ,MAAU,WAAW,KAAQ,YAAY,MAAQ;AAAA,EAClG;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAU,QAAQ,MAAU,WAAW,MAAS,YAAY,OAAS;AAAA,EACrG;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAU,QAAQ,MAAU,WAAW,MAAS,YAAY,OAAS;AAAA,EACrG;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAU,QAAQ,MAAU,WAAW,MAAS,YAAY,OAAS;AAAA,EACrG;AAAA,EACA,qBAAqB;AAAA,IACnB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,KAAS,QAAQ,MAAU,WAAW,KAAQ,YAAY,MAAQ;AAAA,EAClG;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,OAAS,WAAW,MAAO,YAAY,OAAO;AAAA,EAC9F;AAAA;AAAA,EAGA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,OAAS,WAAW,MAAQ,YAAY,KAAO;AAAA,EAC/F;AAAA,EACA,qBAAqB;AAAA,IACnB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,MAAQ,WAAW,MAAO,YAAY,KAAO;AAAA,EAC7F;AAAA,EACA,0BAA0B;AAAA,IACxB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,MAAQ,WAAW,MAAO,YAAY,KAAO;AAAA,EAC7F;AAAA,EACA,wBAAwB;AAAA,IACtB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,OAAS,WAAW,MAAQ,YAAY,KAAO;AAAA,EAC/F;AAAA,EACA,gCAAgC;AAAA,IAC9B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,MAAQ,WAAW,MAAO,YAAY,KAAO;AAAA,EAC7F;AAAA,EACA,iBAAiB;AAAA,IACf,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,MAAQ,WAAW,MAAO,YAAY,KAAO;AAAA,EAC7F;AAAA,EACA,qBAAqB;AAAA,IACnB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,MAAQ,QAAQ,OAAS,WAAW,MAAQ,YAAY,KAAO;AAAA,EAC/F;AAAA;AAAA,EAGA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AAAA,IACxE,qBAAqB,EAAE,OAAO,KAAQ,QAAQ,KAAQ,WAAW,MAAO,YAAY,IAAO;AAAA,EAC7F;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,KAAQ,QAAQ,KAAQ,WAAW,MAAO,YAAY,IAAO;AAAA,EAC7F;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAO,QAAQ,KAAQ,WAAW,OAAO,YAAY,KAAM;AAAA,EAC3F;AAAA,EACA,yBAAyB;AAAA,IACvB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,MAAM,OAAO;AAAA,IACjC,qBAAqB,EAAE,OAAO,MAAO,QAAQ,KAAQ,WAAW,OAAO,YAAY,KAAM;AAAA,EAC3F;AAAA,EACA,0BAA0B;AAAA,IACxB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,OAAS,QAAQ,KAAS,WAAW,QAAQ,YAAY,MAAQ;AAAA,EACjG;AAAA,EACA,iCAAiC;AAAA,IAC/B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAO,QAAQ,KAAQ,WAAW,OAAO,YAAY,KAAM;AAAA,EAC3F;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,OAAS,QAAQ,KAAS,WAAW,QAAQ,YAAY,MAAQ;AAAA,EACjG;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,MAAO,QAAQ,KAAQ,WAAW,OAAO,YAAY,KAAM;AAAA,EAC3F;AAAA;AAAA,EAGA,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,kBAAkB,EAAE,KAAK,IAAI,MAAM,OAAO;AAAA,IAC1C,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAU,WAAW,KAAQ,YAAY,KAAQ;AAAA,EAClG;AAAA,EACA,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAU,WAAW,KAAQ,YAAY,KAAQ;AAAA,EAClG;AAAA,EACA,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAU,WAAW,KAAQ,YAAY,KAAQ;AAAA,EAClG;AAAA;AAAA,EAGA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AAAA,EACA,iBAAiB;AAAA,IACf,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,KAAQ,QAAQ,KAAQ,WAAW,KAAO,YAAY,IAAO;AAAA,EAC7F;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AAAA;AAAA,EAGA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,MAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,KAAQ;AAAA,EACjG;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AAAA;AAAA,EAGA,eAAe;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AAAA,EACA,iBAAiB;AAAA,IACf,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,KAAQ,QAAQ,KAAQ,WAAW,KAAO,YAAY,IAAO;AAAA,EAC7F;AAAA,EACA,eAAe;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,QAAQ,OAAO;AAAA,IAC5B,gBAAgB;AAAA,IAChB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AAAA;AAAA,EAGA,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,CAAC,MAAM;AAAA,IACnB,qBAAqB,EAAE,OAAO,KAAS,QAAQ,KAAS,WAAW,KAAQ,YAAY,IAAQ;AAAA,EACjG;AACF;AAGO,SAAS,WAAW,SAAyB;AAClD,QAAM,IAAI,QAAQ,YAAY;AAC9B,MAAI,EAAE,WAAW,KAAK,KAAK,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,SAAS,EAAG,QAAO;AACvG,MAAI,EAAE,WAAW,QAAQ,EAAG,QAAO;AACnC,MAAI,EAAE,WAAW,QAAQ,KAAK,EAAE,WAAW,QAAQ,KAAK,EAAE,WAAW,QAAQ,EAAG,QAAO;AACvF,MAAI,EAAE,WAAW,UAAU,EAAG,QAAO;AACrC,MAAI,EAAE,WAAW,MAAM,EAAG,QAAO;AACjC,MAAI,EAAE,WAAW,KAAK,KAAK,EAAE,WAAW,OAAO,KAAK,EAAE,WAAW,KAAK,EAAG,QAAO;AAChF,MAAI,EAAE,WAAW,MAAM,KAAK,EAAE,WAAW,UAAU,EAAG,QAAO;AAC7D,MAAI,EAAE,WAAW,MAAM,EAAG,QAAO;AACjC,MAAI,EAAE,WAAW,SAAS,EAAG,QAAO;AACpC,MAAI,EAAE,WAAW,MAAM,KAAK,EAAE,WAAW,QAAQ,EAAG,QAAO;AAC3D,MAAI,EAAE,WAAW,SAAS,KAAK,EAAE,WAAW,SAAS,KAAK,EAAE,WAAW,IAAI,EAAG,QAAO;AACrF,SAAO;AACT;AAGO,SAAS,iBAAiB,SAAiC;AAChE,MAAI,cAAc,OAAO,GAAG;AAC1B,WAAO,cAAc,OAAO;AAAA,EAC9B;AAEA,QAAM,UAAU,QAAQ,YAAY;AACpC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,aAAa,GAAG;AAClD,QAAI,EAAE,YAAY,MAAM,SAAS;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,WAAW,QAAQ,SAAS,QAAQ,KAAK,QAAQ,SAAS,IAAI,KAAK,QAAQ,SAAS,OAAO;AACjG,QAAM,eAAe,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,QAAQ,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,KAAK;AAEjI,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,WAAW,CAAC,QAAQ,OAAO,IAAI,CAAC,MAAM;AAAA,IAClD,GAAI,eAAe,EAAE,gBAAgB,WAAW,IAAI,CAAC;AAAA,EACvD;AACF;;;ACtfO,SAAS,aAAa,KAAqB;AAChD,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACtC;AAGO,SAAS,mBAAmB,cAA8B;AAC/D,MAAI,CAAC,gBAAgB,gBAAgB,EAAG,QAAO;AAC/C,QAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,QAAM,OAAO,MAAM;AACnB,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,OAAO,GAAI,QAAO;AACtB,MAAI,OAAO,KAAM,QAAO,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC;AAChD,MAAI,OAAO,MAAO,QAAO,GAAG,KAAK,MAAM,OAAO,IAAI,CAAC;AACnD,SAAO,GAAG,KAAK,MAAM,OAAO,KAAK,CAAC;AACpC;AAGO,SAAS,eAAe,QAAgB,eAAe,QAAgB;AAC5E,MAAI,WAAW,UAAa,WAAW,KAAM,QAAO;AACpD,MAAI,WAAW,EAAG,QAAO;AACzB,QAAM,MAAM,SAAS;AACrB,QAAM,MAAM,MAAM;AAClB,MAAI,MAAM,KAAQ,QAAO,OAAI,IAAI,QAAQ,CAAC,CAAC;AAC3C,MAAI,MAAM,KAAM,QAAO,OAAI,IAAI,QAAQ,CAAC,CAAC;AACzC,MAAI,MAAM,EAAG,QAAO,OAAI,IAAI,QAAQ,CAAC,CAAC;AACtC,SAAO,OAAI,IAAI,QAAQ,CAAC,CAAC;AAC3B;AAEO,SAAS,gBAAgB,QAAiB,eAAgD;AAC/F,QAAM,UAAkC;AAAA,IACtC,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AACA,QAAM,MAAM,SAAS,OAAO,MAAM,EAAE,KAAK,IAAI;AAC7C,MAAI,KAAK;AACP,YAAQ,cAAc,IAAI;AAAA,EAC5B;AACA,MAAI,iBAAiB,cAAc,KAAK,GAAG;AACzC,UAAM,MAAM,cAAc,KAAK;AAC/B,QAAI,IAAI,WAAW,UAAU,GAAG;AAC9B,cAAQ,QAAQ,IAAI;AAAA,IACtB,WAAW,IAAI,SAAS,GAAG,GAAG;AAC5B,cAAQ,QAAQ,IAAI;AAAA,IACtB,OAAO;AAEL,cAAQ,eAAe,IAAI;AAC3B,cAAQ,QAAQ,IAAI,WAAW,GAAG;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,aACpB,SACA,QACA,QACA,eAC6B;AAC7B,QAAM,WAAW,aAAa,OAAO;AAErC,MAAI,iBAAiB;AACrB,MAAI,oBAAoB;AACxB,MAAI,0BAA0B;AAC9B,MAAI,6BAA6B;AACjC,MAAI;AACJ,MAAI,iBAA8C;AAClD,MAAI,UAAU;AACd,MAAI,eAAe;AAGnB,MAAI,UAAU,eAAe;AAC3B,UAAM,aAAa,CAAC,mCAAmC,GAAG,QAAQ,gBAAgB;AAClF,UAAM,mBAAmB,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC;AAEhD,eAAW,OAAO,kBAAkB;AAClC,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,KAAK;AAAA,UAC3B,SAAS,gBAAgB,QAAQ,aAAa;AAAA,UAC9C,QAAQ,YAAY,QAAQ,GAAI;AAAA,QAClC,CAAC;AACD,YAAI,IAAI,IAAI;AACV,gBAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAI,MAAM,QAAQ,KAAK,KAAK,UAAU,QAAW;AAC/C,kBAAM,QAAQ,OAAO,KAAK,KAAK,SAAS,CAAC;AACzC,kBAAM,UAAU,OAAO,KAAK,KAAK,cAAc,CAAC;AAChD,kBAAM,MAAM,QAAQ,QAAQ,KAAQ,QAAQ,CAAC,CAAC;AAC9C,kBAAM,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAC5C,kBAAM,OAAO,QAAQ,UAAU,KAAQ,QAAQ,CAAC,CAAC;AAEjD,6BAAiB;AACjB,gCAAoB;AACpB,sCAA0B,IAAI,IAAI,QAAQ,CAAC,CAAC;AAC5C,yCAA6B,cAAM,IAAI,QAAQ,CAAC,CAAC;AACjD,sBAAU;AACV,2BAAe,OAAO,KAAK,KAAK,iBAAiB,CAAC;AAClD,uBAAW,KAAK,KAAK,YAAY,KAAK,KAAK,gBAAgB;AAC3D,gBAAI,KAAK,KAAK,GAAI,kBAAiB,KAAK,KAAK;AAC7C;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,kBAAkB,UAAU,OAAO,KAAK,GAAG;AAC9C,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,yEAAyE;AAAA,QAC/G,SAAS;AAAA,UACP,eAAe,UAAU,OAAO,KAAK,CAAC;AAAA,UACtC,QAAQ;AAAA,QACV;AAAA,QACA,QAAQ,YAAY,QAAQ,GAAI;AAAA,MAClC,CAAC,EAAE,MAAM,MAAM,IAAI;AAEnB,UAAI,YAAY,SAAS,IAAI;AAC3B,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,kBAAU,OAAO,WAAW,eAAe,CAAC;AAAA,MAC9C;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,MAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI;AACjF,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,IACrC;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,OAAO,iBAAiB,oBAAoB,MAAM;AAAA,IAClD,WAAW,KAAK,IAAI;AAAA,EACtB;AACF;AAGA,eAAsB,iBAAiB,SAAiB,QAAmC;AACzF,QAAM,WAAW,aAAa,OAAO;AACrC,MAAI,CAAC,UAAU,CAAC,OAAO,KAAK,EAAG,QAAO,CAAC;AAEvC,QAAM,YAAY,CAAC,GAAG,QAAQ,cAAc,GAAG,QAAQ,SAAS;AAChE,MAAI,UAAU;AAEd,aAAW,OAAO,WAAW;AAC3B,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3B,SAAS;AAAA,UACP,eAAe,UAAU,OAAO,KAAK,CAAC;AAAA,UACtC,QAAQ;AAAA,QACV;AAAA,QACA,QAAQ,YAAY,QAAQ,GAAI;AAAA,MAClC,CAAC;AACD,UAAI,IAAI,IAAI;AACV,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC7B,iBAAO,KAAK,KAAK,IAAI,CAAC,MAAW,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,OAAO;AAAA,QACzE;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,SAAS;AACX,YAAQ,KAAK,wCAAwC,OAAO;AAAA,EAC9D;AACA,SAAO,CAAC;AACV;AAGA,eAAsB,gBACpB,QACA,eACA,QAAQ,IACsB;AAC9B,MAAI,CAAC,UAAU,CAAC,cAAe,QAAO,CAAC;AACvC,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,gDAAgD,KAAK,WAAW;AAAA,MACtF,SAAS,gBAAgB,QAAQ,aAAa;AAAA,MAC9C,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,QAAI,IAAI,IAAI;AACV,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAI,MAAM,QAAQ,MAAM,MAAM,KAAK,GAAG;AACpC,eAAO,KAAK,KAAK,MAAM,IAAI,CAAC,OAAY;AACtC,gBAAM,WAAW,OAAO,GAAG,SAAS,CAAC;AACrC,gBAAM,UAAU,WAAW;AAC3B,cAAI,gBAAgB;AACpB,cAAI,UAAU,GAAG;AACf,gBAAI,UAAU,KAAQ,iBAAgB,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,qBACnD,UAAU,KAAM,iBAAgB,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,gBAC1D,iBAAgB,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,UAC7C;AAEA,gBAAM,aAAa,OAAO,GAAG,WAAW,CAAC;AACzC,cAAI,YAAgC,aAAa,IAAI,aAAa;AAClE,cAAI,CAAC,aAAa,GAAG,OAAO;AAC1B,gBAAI;AACF,oBAAM,WAAW,KAAK,MAAM,GAAG,KAAK;AACpC,kBAAI,SAAS,qBAAqB,OAAO,SAAS,iBAAiB,IAAI,GAAG;AACxE,4BAAY,OAAO,SAAS,iBAAiB;AAAA,cAC/C,WAAW,SAAS,qBAAqB,OAAO,SAAS,iBAAiB,IAAI,GAAG;AAC/E,4BAAY,OAAO,SAAS,iBAAiB;AAAA,cAC/C;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX;AAEA,gBAAM,UACJ,GAAG,SAAS,KACX,GAAG,UACF,GAAG,MAAM,SAAS,iCAAiC,KACnD,GAAG,MAAM,SAAS,gCAAgC,KAClD,GAAG,MAAM,SAAS,yCAAyC,MAE7D,QAAQ,GAAG,WAAW,GAAG,QAAQ,WAAW,cAAc,CAAC;AAE7D,iBAAO;AAAA,YACL,IAAI,GAAG,MAAM,GAAG,cAAc,OAAO,KAAK,OAAO,CAAC;AAAA,YAClD,YAAY,OAAO,GAAG,cAAc,KAAK,IAAI,IAAI,GAAI;AAAA,YACrD,YAAY,GAAG,cAAc,GAAG,0BAA0B;AAAA,YAC1D,SAAS;AAAA,YACT,cAAc,GAAG,iBAAiB,YAAY,iBAAO,SAAS,KAAK;AAAA,YACnE,eAAe,OAAO,GAAG,iBAAiB,CAAC;AAAA,YAC3C,mBAAmB,OAAO,GAAG,qBAAqB,CAAC;AAAA,YACnD,UAAU,OAAO,GAAG,YAAY,CAAC;AAAA,YACjC,OAAO;AAAA,YACP,UAAU;AAAA,YACV,gBAAgB;AAAA,YAChB,YAAY,GAAG,cAAc;AAAA,YAC7B,QAAQ,UAAW,UAAqB;AAAA,YACxC,OAAO,GAAG;AAAA,YACV,KAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,sCAAsC,GAAG;AAAA,EACxD;AACA,SAAO,CAAC;AACV;AAGA,eAAsB,oBACpB,WACA,QACA,eACA,iBACA,aACqC;AACrC,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,aAAa,mBAAmB;AACtC,QAAM,OAAO,iBAAiB,UAAU;AAExC,MAAI;AACF,UAAM,MAAM,MAAM;AAAA,MAChB,gEAAgE,SAAS;AAAA,MACzE;AAAA,QACE,SAAS,gBAAgB,QAAQ,aAAa;AAAA,QAC9C,QAAQ,YAAY,QAAQ,GAAI;AAAA,MAClC;AAAA,IACF;AACA,QAAI,IAAI,IAAI;AACV,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,QAAe,MAAM,MAAM,SAAS,CAAC;AAC3C,UAAI,MAAM,SAAS,GAAG;AAEpB,cAAM,QACH,aACG,MAAM,KAAK,CAAC,OAAO,GAAG,YAAY,YAAY,MAAM,WAAW,YAAY,CAAC,IAC5E,SAAS,MAAM,CAAC;AAEtB,cAAM,OAAO,OAAO,KAAK,gCAAgC,MAAM;AAC/D,cAAM,WAAW,OAAO,KAAK,sBAAsB,CAAC;AACpD,cAAM,YAAY,OAAO,KAAK,uBAAuB,CAAC;AACtD,cAAM,kBAAkB,OAAO,KAAK,2BAA2B,CAAC;AAChE,cAAM,mBAAmB,OAAO,KAAK,4BAA4B,CAAC;AAGlE,cAAM,SAAmB,CAAC;AAC1B,YAAI,KAAK,yBAAyB;AAChC,gBAAM,QAAQ,KAAK;AACnB,cAAI,UAAU,OAAQ,QAAO,KAAK,gCAAS;AAAA,mBAClC,UAAU,SAAU,QAAO,KAAK,gCAAS;AAAA,mBACzC,UAAU,SAAU,QAAO,KAAK,gCAAS;AAAA,cAC7C,QAAO,KAAK,cAAI;AAAA,QACvB;AACA,YAAI,MAAM,QAAQ,KAAK,oBAAoB,GAAG;AAC5C,qBAAW,KAAK,KAAK,sBAAsB;AACzC,gBAAI,MAAM,YAAY,CAAC,OAAO,SAAS,cAAI,EAAG,QAAO,KAAK,cAAI;AAC9D,gBAAI,MAAM,WAAW,CAAC,OAAO,SAAS,cAAI,EAAG,QAAO,KAAK,cAAI;AAC7D,gBAAI,MAAM,UAAU,CAAC,OAAO,SAAS,cAAI,EAAG,QAAO,KAAK,cAAI;AAC5D,gBAAI,MAAM,aAAa,CAAC,OAAO,SAAS,cAAI,EAAG,QAAO,KAAK,cAAI;AAAA,UACjE;AAAA,QACF;AACA,YAAI,OAAO,WAAW,GAAG;AACvB,iBAAO,KAAK,gBAAM,gBAAM,gBAAM,cAAI;AAAA,QACpC;AAGA,YAAI;AACJ,YAAI,KAAK,kBAAkB,KAAK,eAAe,uBAAuB,QAAW;AAC/E,gBAAM,QAAQ,OAAO,KAAK,eAAe,sBAAsB,CAAC;AAChE,gBAAM,SAAS,OAAO,KAAK,eAAe,uBAAuB,CAAC;AAClE,gBAAM,QAAQ,OAAO,KAAK,eAAe,2BAA2B,CAAC;AACrE,gBAAM,QAAQ,OAAO,KAAK,eAAe,4BAA4B,CAAC;AACtE,2BAAiB;AAAA,YACf,oBAAoB;AAAA,YACpB,qBAAqB;AAAA,YACrB,yBAAyB;AAAA,YACzB,0BAA0B;AAAA,YAC1B,WAAW,eAAe,OAAO,IAAI;AAAA,YACrC,YAAY,eAAe,QAAQ,IAAI;AAAA,YACvC,gBAAgB,eAAe,OAAO,IAAI;AAAA,YAC1C,iBAAiB,eAAe,OAAO,IAAI;AAAA,UAC7C;AAAA,QACF,WAAW,KAAK,qBAAqB;AACnC,gBAAM,QAAQ,KAAK,oBAAoB;AACvC,gBAAM,SAAS,KAAK,oBAAoB;AACxC,gBAAM,QAAQ,KAAK,oBAAoB;AACvC,gBAAM,QAAQ,KAAK,oBAAoB;AACvC,2BAAiB;AAAA,YACf,oBAAoB;AAAA,YACpB,qBAAqB;AAAA,YACrB,yBAAyB;AAAA,YACzB,0BAA0B;AAAA,YAC1B,WAAW,eAAe,OAAO,IAAI;AAAA,YACrC,YAAY,eAAe,QAAQ,IAAI;AAAA,YACvC,gBAAgB,eAAe,OAAO,IAAI;AAAA,YAC1C,iBAAiB,eAAe,OAAO,IAAI;AAAA,UAC7C;AAAA,QACF;AAEA,cAAM,iBACJ,KAAK,qBAAqB,SAAY,OAAO,KAAK,gBAAgB,IAAI,MAAM;AAC9E,cAAM,oBACJ,KAAK,wBAAwB,SAAY,OAAO,KAAK,mBAAmB,IAAI,MAAM;AACpF,cAAM,eACJ,KAAK,uBAAuB,SAAY,OAAO,KAAK,kBAAkB,IAAI,MAAM;AAClF,cAAM,gBAAgB,OAAO,KAAK,mBAAmB,KAAK,kBAAkB,CAAC;AAE7E,cAAM,WAAW,OAAO,KAAK,sBAAuB,WAAW,MAAW,QAAQ,MAAM;AACxF,cAAM,iBAAiB,SAAS,QAAQ,CAAC;AAEzC,eAAO;AAAA,UACL,YAAY,KAAK;AAAA,UACjB,YAAY,KAAK;AAAA,UACjB,cAAc,KAAK,gBAAgB,iBAAO,SAAS;AAAA,UACnD,eAAe,KAAK,iBAAiB,KAAK,qBAAqB;AAAA,UAC/D,aAAa,KAAK,eAAe;AAAA,UACjC,YAAY,KAAK,cAAc;AAAA,UAC/B,OAAO,KAAK,SAAS,KAAK,SAAS;AAAA,UACnC,aAAa,KAAK,eAAe;AAAA,UACjC,aAAa,KAAK,eAAe;AAAA,UACjC,kBAAkB,KAAK,gBAAgB,cAAc,iBAAO;AAAA,UAC5D,cAAc,OAAO,KAAK,gBAAgB,GAAG;AAAA,UAC7C,mBAAmB,UAAK,KAAK,gBAAgB,GAAG;AAAA,UAChD,oBAAoB;AAAA,UACpB,qBAAqB;AAAA,UACrB,yBAAyB;AAAA,UACzB,0BAA0B;AAAA,UAC1B,iBAAiB,eAAe,UAAU,IAAI;AAAA,UAC9C,kBAAkB,eAAe,WAAW,IAAI;AAAA,UAChD,sBAAsB,eAAe,iBAAiB,IAAI;AAAA,UAC1D,uBAAuB,eAAe,kBAAkB,IAAI;AAAA,UAC5D;AAAA,UACA,oBAAoB;AAAA,UACpB,0BAA0B;AAAA,UAC1B,yBAAyB;AAAA,UACzB,sBAAsB;AAAA,UACtB,qBAAqB,KAAK,oBAAoB,SAAY,OAAO,KAAK,eAAe,IAAI,MAAM;AAAA,UAC/F,iBAAiB,MAAM,QAAQ,KAAK,eAAe,IAAI,KAAK,kBAAkB;AAAA,UAC9E,KAAK,MAAM,QAAQ,KAAK,GAAG,IAAI,KAAK,MAAM;AAAA,UAC1C,KAAK,MAAM,QAAQ,KAAK,GAAG,IAAI,KAAK,MAAM;AAAA,UAC1C,cAAc,KAAK,gBAAgB;AAAA,UACnC,aAAa,KAAK,eAAe;AAAA,UACjC,aAAa,OAAO,KAAK,eAAe,IAAI;AAAA,UAC5C,eAAe,OAAO,KAAK,iBAAiB,KAAK,yBAAyB,IAAI;AAAA,UAC9E,oBAAoB;AAAA,UACpB;AAAA,UACA,iBAAiB;AAAA,UACjB,mBAAmB,mBAAmB,aAAa;AAAA,UACnD,yBAAyB,QAAQ,KAAK,uBAAuB;AAAA,UAC7D,oBAAoB,KAAK;AAAA,UACzB,WAAW,QAAQ,KAAK,eAAe,YAAY,KAAK,SAAS;AAAA,UACjE,uBAAuB,QAAQ,KAAK,qBAAqB;AAAA,UACzD,2BAA2B,QAAQ,KAAK,yBAAyB;AAAA,UACjE,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,0CAA0C,GAAG;AAAA,EAC5D;AAGA,MAAI,aAAa;AACf,UAAM,OAAO;AACb,UAAM,WAAW,OAAO,YAAY,kCAAkC,KAAK;AAC3E,UAAM,YAAY,OAAO,YAAY,mCAAmC,MAAM;AAC9E,UAAM,kBAAkB,OAAO,YAAY,uCAAuC,IAAI;AACtF,UAAM,mBAAmB,OAAO,YAAY,wCAAwC,KAAK;AAEzF,QAAI;AACJ,QAAI,KAAK,qBAAqB;AAC5B,YAAM,QAAQ,KAAK,oBAAoB;AACvC,YAAM,SAAS,KAAK,oBAAoB;AACxC,YAAM,QAAQ,KAAK,oBAAoB;AACvC,YAAM,QAAQ,KAAK,oBAAoB;AACvC,uBAAiB;AAAA,QACf,oBAAoB;AAAA,QACpB,qBAAqB;AAAA,QACrB,yBAAyB;AAAA,QACzB,0BAA0B;AAAA,QAC1B,WAAW,eAAe,OAAO,IAAI;AAAA,QACrC,YAAY,eAAe,QAAQ,IAAI;AAAA,QACvC,gBAAgB,eAAe,OAAO,IAAI;AAAA,QAC1C,iBAAiB,eAAe,OAAO,IAAI;AAAA,MAC7C;AAAA,IACF;AAEA,UAAM,WAAW,OAAQ,WAAW,MAAW,QAAQ,MAAM;AAE7D,WAAO;AAAA,MACL,YAAY,YAAY;AAAA,MACxB,YAAY;AAAA,MACZ,cAAc,YAAY,gBAAgB,iBAAO,SAAS;AAAA,MAC1D,eAAe,YAAY,qBAAqB,YAAY,gBAAgB;AAAA,MAC5E,aAAa;AAAA,MACb,YAAY,cAAc,YAAY,cAAc;AAAA,MACpD,OAAO,KAAK,SAAS;AAAA,MACrB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,yBAAyB;AAAA,MACzB,0BAA0B;AAAA,MAC1B,iBAAiB,eAAe,UAAU,IAAI;AAAA,MAC9C,kBAAkB,eAAe,WAAW,IAAI;AAAA,MAChD,sBAAsB,eAAe,iBAAiB,IAAI;AAAA,MAC1D,uBAAuB,eAAe,kBAAkB,IAAI;AAAA,MAC5D;AAAA,MACA,oBAAoB;AAAA,MACpB,0BAA0B,SAAS,QAAQ,CAAC;AAAA,MAC5C,yBAAyB;AAAA,MACzB,sBAAsB;AAAA,MACtB,eAAe,OAAO,YAAY,WAAW,YAAY,WAAW,MAAO,IAAI;AAAA,MAC/E,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,QAAQ,CAAC,gBAAM,gBAAM,gBAAM,cAAI;AAAA,MAC/B,iBAAiB,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,MAC7C,mBAAmB;AAAA,MACnB,yBAAyB;AAAA,MACzB,WAAW;AAAA,MACX,uBAAuB;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,sBACpB,QACA,eACA,aACkH;AAClH,QAAM,SAAS,eAAe,iBAAiB,IAAI,KAAK;AACxD,QAAM,OAAO,UAAU,IAAI,KAAK;AAChC,MAAI,CAAC,OAAO,CAAC,OAAO;AAClB,WAAO,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,MAAM;AAAA,EAC5E;AACA,QAAM,UAAU,gBAAgB,OAAO,QAAW,SAAS,MAAS;AACpE,QAAM,MAAM;AACZ,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,SAAS,QAAQ,YAAY,QAAQ,GAAI,EAAE,CAAC;AAC3E,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,cAAQ,KAAK,iDAAiD,IAAI,MAAM;AACxE,aAAO,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,KAAK;AAAA,IAC3E;AACA,QAAI,CAAC,IAAI,IAAI;AACX,cAAQ,KAAK,0CAA0C,IAAI,MAAM;AACjE,aAAO,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,EAAE;AAAA,IAC1D;AACA,UAAM,OAAY,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,QAAI,CAAC,KAAM,QAAO,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,EAAE;AACnE,QAAI,KAAK,YAAY,MAAO,QAAO,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,EAAE;AAGpF,QAAI,MAAa,CAAC;AAClB,QAAI,MAAM,QAAQ,IAAI,EAAG,OAAM;AAAA,aACtB,MAAM,QAAQ,KAAK,IAAI,EAAG,OAAM,KAAK;AAAA,aACrC,MAAM,QAAQ,KAAK,MAAM,OAAO,EAAG,OAAM,KAAK,KAAK;AAAA,aACnD,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAG,OAAM,KAAK,KAAK;AAAA,aACjD,MAAM,QAAQ,KAAK,OAAO,EAAG,OAAM,KAAK;AAAA,aACxC,MAAM,QAAQ,KAAK,KAAK,EAAG,OAAM,KAAK;AAG/C,UAAM,kBAAkB,CAAC,SAAwD;AAC/E,iBAAW,KAAK,MAAM;AACpB,cAAM,IAAI,MAAM,OAAO,CAAC,KAAK,OAAO,CAAC;AACrC,YAAI,MAAM,UAAa,MAAM,MAAM;AACjC,gBAAM,IAAI,OAAO,CAAC;AAClB,cAAI,CAAC,OAAO,MAAM,CAAC,EAAG,QAAO,EAAE,OAAO,GAAG,SAAS,KAAK;AAAA,QACzD;AAAA,MACF;AACA,aAAO,EAAE,OAAO,GAAG,SAAS,MAAM;AAAA,IACpC;AACA,UAAM,cAAc,gBAAgB,CAAC,gBAAgB,iBAAiB,WAAW,WAAW,CAAC;AAC7F,UAAM,aAAa,gBAAgB,CAAC,eAAe,gBAAgB,UAAU,kBAAkB,CAAC;AAChG,QAAI,UAAU,YAAY;AAC1B,QAAI,SAAS,WAAW;AACxB,UAAM,QAAQ,IAAI;AAGlB,QAAI,CAAC,YAAY,WAAW,IAAI,SAAS,GAAG;AAC1C,YAAM,UAAU,IAAI,OAAO,CAAC,MAAW;AACrC,cAAM,IAAI,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,YAAY;AACxD,eAAO,MAAM,UAAU,MAAM,aAAa,EAAE,YAAY;AAAA,MAC1D,CAAC,EAAE;AAEH,YAAM,WAAW,IAAI,KAAK,CAAC,MAAW,EAAE,UAAU,UAAa,EAAE,WAAW,MAAS;AACrF,UAAI,SAAU,WAAU;AAAA,IAE1B;AACA,QAAI,CAAC,WAAW,WAAW,IAAI,SAAS,GAAG;AACzC,eAAS,IAAI,OAAO,CAAC,MAAW,EAAE,eAAe,QAAQ,EAAE,cAAc,QAAQ,EAAE,WAAW,QAAQ,EAAE,cAAc,IAAI,EAAE;AAAA,IAC9H;AAKA,WAAO,EAAE,cAAc,SAAS,aAAa,QAAQ,YAAY,OAAO,SAAS,IAAI;AAAA,EACvF,SAAS,KAAK;AACZ,YAAQ,KAAK,2CAA2C,GAAG;AAC3D,WAAO,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,EAAE;AAAA,EAC1D;AACF;;;AC3hBA,IAAM,QAAQ,CAAC,OAAe,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAG9E,eAAsB,iBACpB,SACA,QACA,QACA,aACA,WACsB;AACtB,QAAM,cAAc,aAAa;AACjC,QAAM,WAAW,aAAa,OAAO;AACrC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,WAAW,aAAa,SAAS,OAAO,OAAO,6BAAc;AAAA,EACxE;AAEA,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,YAAY;AAChB,MAAI,eAAe;AAEnB,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,wBAAwB;AAAA,MACzD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,OAAO,KAAK,CAAC;AAAA,MACxC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO;AAAA,QACP,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,IAAI,CAAC;AAAA,QACzC,YAAY;AAAA,MACd,CAAC;AAAA;AAAA,MAED,QAAQ,YAAY,QAAQ,IAAM;AAAA,IACpC,CAAC;AAED,QAAI,IAAI,IAAI;AACV,kBAAY;AAAA,IACd,OAAO;AACL,YAAM,UAAU,MAAM,IAAI,KAAK;AAC/B,qBAAe,QAAQ,IAAI,MAAM,KAAK,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA,IAC7D;AAAA,EACF,SAAS,KAAU;AACjB,UAAM,MAAM,KAAK,WAAW,OAAO,GAAG;AAEtC,QAAI,IAAI,SAAS,wBAAwB,KAAK,KAAK,SAAS,gBAAgB;AAC1E,qBAAe;AAAA,IACjB,OAAO;AACL,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,IAAI,IAAI;AAGhC,MAAI,cAAc,UAAU,cAAc;AAExC,UAAM,MAAM,IAAI;AAChB,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,QAAQ,aAAa,EAAE;AAC1D,YAAM,eAAe,KAAK,MAAM,YAAY,GAAI,IAAI;AAEpD,YAAM,MACJ,KAAK;AAAA,QACH,CAAC,OACC,GAAG,YAAY,YAAY,MAAM,YAAY,YAAY,KACzD,OAAO,GAAG,cAAc,CAAC,KAAK;AAAA,MAClC,KAAK,KAAK,KAAK,CAAC,OAAO,GAAG,YAAY,YAAY,MAAM,YAAY,YAAY,CAAC;AAEnF,UAAI,OAAO,IAAI,SAAS;AACtB,cAAM,YAAY,OAAO,IAAI,OAAO;AACpC,YAAI,cAAmB;AACvB,YAAI,IAAI,OAAO;AACb,cAAI;AACF,0BAAc,EAAE,GAAG,KAAK,MAAM,IAAI,KAAK,GAAG,cAAc,IAAI,cAAc,YAAY,IAAI,WAAW;AAAA,UACvG,QAAQ;AAAA,UAAC;AAAA,QACX;AACA,cAAM,WAAW,MAAM,oBAAoB,WAAW,QAAQ,aAAa,aAAa,WAAW;AACnG,eAAO;AAAA,UACL,WAAW;AAAA,UACX,SAAS;AAAA,UACT;AAAA,UACA,aAAa,IAAI;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAU;AACjB,cAAQ,KAAK,oCAAoC,WAAW,KAAK,GAAG;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,SAAS;AAAA,IACT;AAAA,IACA,OAAO,YAAY,SAAY;AAAA,EACjC;AACF;AAGA,eAAsB,0BACpB,QACA,aACA,aAAuB,CAAC,GACxB,MAC8C;AAC9C,MAAK,CAAC,UAAU,CAAC,eAAgB,WAAW,WAAW,EAAG,QAAO,CAAC;AAElE,QAAM,SAA8C,CAAC;AACrD,MAAI;AACF,UAAM,QAAQ,SAAS,SAAY,OAAO,MAAM,gBAAgB,QAAQ,aAAa,EAAE;AAEvF,UAAM,SAAS,MAAM,MAAM,EAAE,KAAK,CAAC,GAAQ,OAAY,OAAO,EAAE,UAAU,KAAK,MAAM,OAAO,EAAE,UAAU,KAAK,EAAE;AAC/G,UAAM,aAAa,oBAAI,IAAiB;AAExC,eAAW,OAAO,QAAQ;AACxB,YAAM,QAAQ,IAAI;AAClB,YAAM,OAAO,OAAO,IAAI,OAAO;AAC/B,UAAI,SAAS,QAAQ,CAAC,WAAW,IAAI,MAAM,YAAY,CAAC,GAAG;AACzD,mBAAW,IAAI,MAAM,YAAY,GAAG,GAAG;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,iBAAoD,CAAC;AAC3D,eAAWA,SAAQ,YAAY;AAC7B,YAAM,MAAM,WAAW,IAAIA,MAAK,YAAY,CAAC;AAC7C,UAAI,KAAK;AACP,uBAAe,KAAK,EAAE,WAAWA,OAAM,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AAGA,aAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,GAAG;AACjD,YAAM,QAAQ,eAAe,MAAM,GAAG,IAAI,CAAC;AAC3C,YAAM,QAAQ;AAAA,QACZ,MAAM,IAAI,OAAO,EAAE,WAAW,IAAI,MAAM;AACtC,cAAI;AACF,kBAAM,YAAY,OAAO,IAAI,OAAO;AACpC,gBAAI,cAAmB;AACvB,gBAAI,IAAI,OAAO;AACb,kBAAI;AACF,8BAAc,EAAE,GAAG,KAAK,MAAM,IAAI,KAAK,GAAG,cAAc,IAAI,cAAc,YAAY,IAAI,WAAW;AAAA,cACvG,QAAQ;AAAA,cAAC;AAAA,YACX;AACA,kBAAM,OAAO,MAAM,oBAAoB,WAAW,QAAQ,aAAa,WAAW,WAAW;AAC7F,gBAAI,MAAM;AACR,qBAAO,SAAS,IAAI;AAAA,YACtB;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,gDAAgD,GAAG;AAAA,EAClE;AAEA,SAAO;AACT;;;AC7KA,YAAY,SAAS;AACrB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAIb,IAAM,iBAAiB;AAG9B,eAAe,gBAAgB,UAAkB,SAAiB,OAAO,KAAsB;AAC7F,QAAM,MAAW,aAAQ,QAAQ;AACjC,QAAU,UAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACxC,QAAM,UAAe,UAAK,KAAK,IAAS,cAAS,QAAQ,CAAC,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC,MAAM;AAC7F,QAAU,cAAU,SAAS,SAAS,EAAE,KAAK,CAAC;AAC9C,QAAU,WAAO,SAAS,QAAQ;AACpC;AAEA,SAAS,UAAkB;AACzB,SAAO,QAAQ,IAAI,YAAiB,UAAQ,WAAQ,GAAG,MAAM;AAC/D;AAEA,SAAS,aAAqB;AAC5B,SAAY,UAAK,QAAQ,GAAG,uBAAuB;AACrD;AAEA,SAAS,kBAA0B;AACjC,SAAY,UAAK,QAAQ,GAAG,mBAAmB;AACjD;AAEA,SAAS,eAAuB;AAC9B,SAAY,UAAK,QAAQ,GAAG,eAAe;AAC7C;AAGA,eAAsB,mBAAyC;AAC7D,QAAM,WAAW,WAAW;AAC5B,MAAI,MAAM;AACV,MAAI;AACF,UAAM,MAAU,aAAS,UAAU,MAAM;AAAA,EAC3C,QAAQ;AAEN,UAAM,SAAU,MAAM,kBAAkB,cAAc,KAAM;AAC5D,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,MACR,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,SAAS,OAAO,UAAW,MAAM,kBAAkB,cAAc,KAAM;AAC7E,UAAM,cAAc,OAAO,eAAe,OAAO,qBAAqB,OAAO,iBAAiB;AAC9F,WAAO;AAAA,MACL,SAAS,OAAO,WAAW;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,UAAU;AAAA,MACzB,eAAe;AAAA,MACf,cAAc,MAAM,QAAQ,OAAO,YAAY,IAAI,OAAO,eAAe,CAAC;AAAA,MAC1E,eAAe,OAAO;AAAA,IACxB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AACF;AAGA,eAAsB,iBAAiB,QAAoC;AACzE,QAAM,WAAW,WAAW;AAC5B,QAAM,EAAE,QAAQ,SAAS,GAAG,WAAW,IAAI;AAC3C,QAAM,gBAAgB,UAAU,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAGnE,MAAI,OAAO,UAAU,OAAO,OAAO,KAAK,GAAG;AACzC,UAAM,mBAAmB,gBAAgB,OAAO,OAAO,KAAK,CAAC;AAAA,EAC/D;AACF;AAGA,eAAsB,kBAAkB,QAAwC;AAC9E,MAAI;AACF,UAAM,OAAO,MAAU,aAAS,gBAAgB,GAAG,MAAM;AACzD,QAAI,SAAS;AACb,eAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,YAAM,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,UAAU;AACjD,UAAI,WAAW,GAAG;AAChB,iBAAS,QAAQ,WAAW,OAAO;AACnC;AAAA,MACF;AACA,UAAI,CAAC,OAAQ;AACb,YAAM,IAAI,+BAA+B,KAAK,OAAO;AACrD,UAAI,KAAK,EAAE,CAAC,MAAM,QAAQ;AACxB,YAAI,MAAM,EAAE,CAAC,EAAE,KAAK;AACpB,YAAK,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KAAO,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,GAAI;AAC5F,gBAAM,IAAI,MAAM,GAAG,EAAE;AAAA,QACvB;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAGA,eAAsB,mBAAmB,QAAgB,OAA8B;AACrF,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,OAAO;AACX,MAAI;AACF,WAAO,MAAU,aAAS,OAAO,MAAM;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,MAAI,SAAS;AACb,MAAI,cAAc;AAClB,MAAI,QAAQ;AAEZ,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,UAAM,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,UAAU;AACjD,QAAI,WAAW,GAAG;AAChB,UAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,iBAAS;AACT,sBAAc;AAAA,MAChB,OAAO;AACL,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AACA,QAAI,QAAQ;AACV,YAAM,IAAI,uBAAuB,KAAK,OAAO;AAC7C,UAAI,KAAK,EAAE,CAAC,MAAM,QAAQ;AACxB,cAAM,CAAC,IAAI,KAAK,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAChD,gBAAQ;AACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,QAAI,eAAe,GAAG;AACpB,YAAM,OAAO,cAAc,GAAG,GAAG,KAAK,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IAC1E,OAAO;AACL,YAAM,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,MAAM,KAAK,IAAI,GAAG,GAAK;AACtD;AAGA,eAAsB,kBAAkB,SAAiB,UAAmC;AAC1F,QAAM,QAAQ,aAAa;AAC3B,MAAI,OAAO;AACX,MAAI;AACF,WAAO,MAAU,aAAS,OAAO,MAAM;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,SAAS,IAAI,CAAC,OAAO;AACxC,UAAM,OAAO,iBAAiB,EAAE;AAChC,UAAMC,SAAQ;AAAA,MACZ,iBAAiB,KAAK,EAAE;AAAA,MACxB,mBAAmB,KAAK,IAAI;AAAA,MAC5B,4BAA4B,KAAK,aAAa;AAAA,MAC9C,wBAAwB,KAAK,SAAS;AAAA,MACtC;AAAA,MACA,GAAG,KAAK,WAAW,IAAI,CAAC,MAAM,iBAAiB,CAAC,EAAE;AAAA,IACpD;AACA,QAAI,KAAK,kBAAkB;AACzB,MAAAA,OAAM,KAAK,6BAA6B;AACxC,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,gBAAgB,GAAG;AAC1D,YAAI,EAAG,CAAAA,OAAM,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE;AAAA,MAC5C;AAAA,IACF;AACA,WAAOA,OAAM,KAAK,IAAI;AAAA,EACxB,CAAC;AAGD,QAAM,aAAa,QAAQ,SAAS,KAAK,IAAI,UAAU,GAAG,QAAQ,QAAQ,QAAQ,EAAE,CAAC;AAErF,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,oBAAoB,cAAc;AAAA,IAClC;AAAA,IACA,kBAAkB,UAAU;AAAA,IAC5B;AAAA,IACA,GAAI,aAAa,SAAS,IAAI,eAAe,CAAC,YAAY;AAAA,EAC5D;AAGA,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,MAAI,QAAQ;AACZ,MAAI,cAAc;AAClB,MAAI,OAAO;AACX,MAAI,UAAU;AACd,MAAI,QAAQ;AACZ,MAAI,mBAAmB;AACvB,MAAI,aAAa;AAEjB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,UAAM,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,UAAU;AAEjD,QAAI,WAAW,GAAG;AAChB,cAAQ,QAAQ,WAAW,YAAY;AACvC,UAAI,MAAO,cAAa;AACxB,oBAAc;AACd,aAAO;AACP;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK,QAAQ,WAAW,YAAY,GAAG;AAC7D,oBAAc;AACd,yBAAmB;AACnB,aAAO;AACP;AAAA,IACF;AAEA,QAAI,eAAe,WAAW,GAAG;AAC/B,UAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,eAAO;AACP,kBAAU;AACV,gBAAQ,IAAI;AAAA,MACd,OAAO;AACL,YAAI,MAAM;AACR,kBAAQ;AACR,iBAAO;AAAA,QACT;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,IAAI;AAAA,IACd,WAAW,QAAQ,UAAU,GAAG;AAC9B,cAAQ;AACR,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,WAAW,GAAG;AAEhB,UAAM,OAAO,SAAS,QAAQ,SAAS,GAAG,eAAe;AAAA,EAC3D,WAAW,oBAAoB,GAAG;AAEhC,UAAM,OAAO,mBAAmB,GAAG,GAAG,GAAG,eAAe;AAAA,EAC1D,WAAW,cAAc,GAAG;AAE1B,UAAM,OAAO,aAAa,GAAG,GAAG,gBAAgB,GAAG,eAAe;AAAA,EACpE,OAAO;AAEL,UAAM,KAAK,cAAc,gBAAgB,GAAG,eAAe;AAAA,EAC7D;AAEA,QAAM,gBAAgB,OAAO,MAAM,KAAK,IAAI,GAAG,GAAK;AACtD;AAGA,eAAsB,yBAA4C;AAChE,MAAI;AACF,UAAM,OAAO,MAAU,aAAS,aAAa,GAAG,MAAM;AACtD,UAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAI,OAAO;AACX,QAAI,WAAW;AACf,UAAM,WAAqB,CAAC;AAE5B,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,KAAK,KAAK;AAC1B,YAAM,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,UAAU;AACjD,UAAI,WAAW,KAAK,QAAQ,WAAW,QAAQ,GAAG;AAChD,eAAO;AACP,mBAAW;AACX;AAAA,MACF;AACA,UAAI,QAAQ,UAAU,KAAK,CAAC,QAAQ,WAAW,QAAQ,GAAG;AACxD,eAAO;AACP,mBAAW;AAAA,MACb;AACA,UAAI,QAAQ,WAAW,KAAK,QAAQ,WAAW,SAAS,GAAG;AACzD,mBAAW;AACX;AAAA,MACF;AACA,UAAI,YAAY,WAAW,KAAK,QAAQ,WAAW,OAAO,GAAG;AAC3D,cAAM,KAAK,QAAQ,QAAQ,aAAa,EAAE,EAAE,KAAK;AACjD,YAAI,GAAI,UAAS,KAAK,EAAE;AAAA,MAC1B;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AC5SO,IAAM,OAAO;AACb,IAAM,SAAS,CAAC,WAAW;AAYlC,IAAM,SAAS;AAGf,IAAM,OAAO;AAGb,SAAS,WAAW,GAA6B;AAC/C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,EAAE,SAAS,OAAO;AAAA,IAC1B,aAAa,EAAE,eAAe,EAAE,gBAAgB,OAAO;AAAA,IACvD,eAAe;AAAA,IACf,QAAQ,EAAE,SAAS,OAAO;AAAA,IAC1B,WAAW,QAAQ,EAAE,MAAM;AAAA,IAC3B,UAAU,QAAQ,EAAE,eAAe,EAAE,aAAa;AAAA,EACpD;AACF;AAEA,SAAS,SAAS,KAAU,QAAgB,MAAW;AACrD,MAAI,UAAU,QAAQ;AAAA,IACpB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA;AAAA,EAEnB,CAAC;AACD,MAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAC9B;AAEA,SAAS,SAAS,KAA2B;AAC3C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO;AACX,QAAI,GAAG,QAAQ,CAAC,UAAe;AAC7B,cAAQ;AACR,UAAI,KAAK,SAAS,IAAI,OAAO,MAAM;AACjC,YAAI,QAAQ;AACZ,eAAO,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACpC;AAAA,IACF,CAAC;AACD,QAAI,GAAG,OAAO,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC;AACxC,QAAI,GAAG,SAAS,MAAM;AAAA,EACxB,CAAC;AACH;AAEA,eAAe,cAAc,KAAwB;AACnD,QAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AACF;AAGA,IAAM,oBAAoB,oBAAI,IAAuD;AAErF,IAAM,uBAAuB,KAAK,KAAK;AAEhC,SAAS,MAAM,KAAgB;AAEpC,QAAM,YAAY,IAAI,cAAc,IAAI,MAAM,IAAI,IAAI,WAAW,IAAI;AACrE,MAAI,aAAa,OAAO,UAAU,aAAa,YAAY;AACzD,QAAI,OAAO,MAAM;AACf,YAAM,aAAa,UAAU,SAAS;AAAA,QACpC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,OAAO,KAAU,QAAa;AACrC,gBAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,kBAAkB;AACtD,gBAAM,WAAW,IAAI,SAAS,QAAQ,QAAQ,EAAE,KAAK;AAGrD,cAAI,IAAI,WAAW,WAAW;AAC5B,gBAAI,UAAU,GAAG;AACjB,mBAAO,IAAI,IAAI;AAAA,UACjB;AAEA,cAAI;AAEF,gBAAI,aAAa,aAAa,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS;AAC5E,oBAAM,SAAS,MAAM,iBAAiB;AACtC,oBAAM,QAAQ,OAAO,eAAe,OAAO,iBAAiB;AAC5D,oBAAM,UAAU,MAAM,aAAa,OAAO,SAAS,OAAO,QAAQ,OAAO,QAAQ,KAAK;AAGtF,kBAAI,SAAS,UAAU,OAAO,QAAQ,MAAM,MAAM,OAAO,QAAQ;AAC/D,uBAAO,SAAS,OAAO,QAAQ,MAAM;AACrC,sBAAM,iBAAiB,MAAM;AAAA,cAC/B;AAEA,oBAAM,sBAAsB,MAAM,uBAAuB;AAGzD,kBAAI,WAAqB,CAAC;AAC1B,kBAAI,OAAO,QAAQ;AACjB,2BAAW,MAAM,iBAAiB,OAAO,SAAS,OAAO,MAAM;AAAA,cACjE;AAGA,kBAAI,SAAS,WAAW,GAAG;AACzB,2BAAW;AAAA,kBACT,GAAG,oBAAI,IAAI;AAAA,oBACT,GAAG,OAAO;AAAA,oBACV,GAAG;AAAA,oBACH;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF,CAAC;AAAA,gBACH;AAAA,cACF;AAGA,oBAAM,UAAU,MAAM,gBAAgB,OAAO,QAAQ,OAAO,GAAG;AAE/D,sBAAQ,KAAK,CAAC,GAAG,OAAO,OAAO,EAAE,UAAU,KAAK,MAAM,OAAO,EAAE,UAAU,KAAK,EAAE;AAGhF,kBAAI,OAAO,UAAU,OAAO;AAC1B,sBAAM,UAAU,SAAS,OAAO,CAAC,MAAM;AACrC,wBAAM,QAAQ,kBAAkB,IAAI,EAAE,YAAY,CAAC;AACnD,yBAAO,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,MAAM;AAAA,gBAC5C,CAAC;AACD,oBAAI,QAAQ,SAAS,GAAG;AACtB,sBAAI,QAA6C,CAAC;AAClD,sBAAI;AACF,4BAAQ,MAAM,QAAQ,KAAK;AAAA,sBACzB,0BAA0B,OAAO,QAAQ,OAAO,SAAS,OAAO;AAAA,sBAChE,IAAI,QAA6C,CAAC,YAAY,WAAW,MAAM,QAAQ,CAAC,CAAC,GAAG,GAAK,CAAC;AAAA,oBACpG,CAAC;AAAA,kBACH,QAAQ;AACN,4BAAQ,CAAC;AAAA,kBACX;AACA,6BAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,sCAAkB,IAAI,MAAM,YAAY,GAAG,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,kBACrE;AAAA,gBACF;AAAA,cACF;AAGA,oBAAM,gBAAgB,oBAAI,IAAoB;AAC9C,yBAAW,OAAO,SAAS;AACzB,sBAAM,QAAQ,IAAI;AAClB,sBAAM,OAAO,OAAO,IAAI,OAAO;AAC/B,sBAAM,KAAK,OAAO,IAAI,UAAU,KAAK;AACrC,oBAAI,SAAS,OAAO,KAAK,KAAK,KAAK,CAAC,cAAc,IAAI,MAAM,YAAY,CAAC,GAAG;AAC1E,gCAAc,IAAI,MAAM,YAAY,GAAG,EAAE;AAAA,gBAC3C;AAAA,cACF;AAEA,oBAAM,SAAS,IAAI,IAAI,mBAAmB;AAC1C,oBAAM,SAA0B,SAAS,IAAI,CAAC,QAAQ;AACpD,sBAAM,OAAO,iBAAiB,GAAG;AACjC,sBAAM,aAAa,kBAAkB,IAAI,IAAI,YAAY,CAAC;AAC1D,sBAAM,aACJ,cAAc,KAAK,IAAI,IAAI,WAAW,KAAK,uBACvC,WAAW,OACX;AACN,sBAAM,WAAW,cAAc,IAAI,IAAI,YAAY,CAAC;AACpD,uBAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,OAAO,KAAK;AAAA,kBACZ,eAAe,KAAK;AAAA,kBACpB,WAAW,KAAK;AAAA,kBAChB,YAAY,KAAK;AAAA,kBACjB,cAAc,QAAQ,KAAK,oBAAoB,KAAK,cAAc;AAAA,kBAClE,OAAO,OAAO,IAAI,GAAG;AAAA,kBACrB,UAAU;AAAA,kBACV,aAAa,aAAa,YAAY;AAAA,kBACtC,cAAc;AAAA,kBACd,gBAAgB,WAAW,mBAAmB,QAAQ,IAAI;AAAA,gBAC5D;AAAA,cACF,CAAC;AAGD,oBAAM,aAAa,QAAQ,MAAM,GAAG,EAAE;AAEtC,oBAAM,WAA+B;AAAA,gBACnC,QAAQ,WAAW,MAAM;AAAA,gBACzB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AACA,qBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,SAAS,CAAC;AAAA,YACxD;AAGA,gBAAI,aAAa,aAAa,IAAI,WAAW,QAAQ;AACnD,oBAAM,OAAO,MAAM,cAAc,GAAG;AACpC,oBAAM,UAAU,MAAM,iBAAiB;AACvC,oBAAM,WACJ,KAAK,gBAAgB,UAAa,KAAK,gBAAgB,OACnD,KAAK,cACL,KAAK,kBAAkB,UAAa,KAAK,kBAAkB,OACzD,KAAK,gBACJ,QAAQ,eAAe,QAAQ,iBAAiB;AACzD,oBAAM,YACJ,KAAK,WAAW,UAAa,KAAK,WAAW,OAAO,KAAK,SAAS,QAAQ;AAE5E,oBAAM,UAAuB;AAAA,gBAC3B,SAAS,KAAK,YAAY,SAAY,KAAK,UAAU,QAAQ;AAAA,gBAC7D,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,eAAe;AAAA,gBACf,QAAQ,KAAK,WAAW,SAAY,KAAK,SAAS,QAAQ;AAAA,gBAC1D,cAAc,MAAM,QAAQ,KAAK,YAAY,IAAI,KAAK,eAAe,QAAQ;AAAA,gBAC7E,eAAe,KAAK,kBAAkB,SAAY,KAAK,gBAAgB,QAAQ;AAAA,cACjF;AAGA,oBAAM,UAAU,MAAM,aAAa,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,WAAW;AACvG,kBAAI,SAAS,QAAQ;AACnB,wBAAQ,SAAS,OAAO,QAAQ,MAAM;AAAA,cACxC;AAEA,oBAAM,iBAAiB,OAAO;AAG9B,kBAAI,QAAQ,aAAa,SAAS,GAAG;AACnC,sBAAM,kBAAkB,QAAQ,SAAS,QAAQ,YAAY;AAAA,cAC/D;AACA,qBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,QAAQ,WAAW,OAAO,GAAG,QAAQ,CAAC;AAAA,YAC9E;AAGA,gBAAI,aAAa,eAAe,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS;AAC9E,oBAAM,SAAS,MAAM,iBAAiB;AACtC,oBAAM,QAAQ,OAAO,eAAe,OAAO,iBAAiB;AAC5D,oBAAM,UAAU,MAAM,aAAa,OAAO,SAAS,OAAO,QAAQ,OAAO,QAAQ,KAAK;AACtF,oBAAM,aAAa,MAAM,gBAAgB,OAAO,QAAQ,OAAO,EAAE;AACjE,qBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,SAAS,WAAW,CAAC;AAAA,YAC7D;AAGA,gBAAI,aAAa,YAAY,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS;AAC3E,oBAAM,SAAS,MAAM,iBAAiB;AACtC,oBAAM,QAAQ,OAAO,eAAe,OAAO,iBAAiB;AAC5D,oBAAM,aAAa,MAAM,gBAAgB,OAAO,QAAQ,OAAO,EAAE;AACjE,qBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,WAAW,CAAC;AAAA,YAC1D;AAGA,gBAAI,aAAa,YAAY,IAAI,WAAW,QAAQ;AAClD,oBAAM,OAAO,MAAM,cAAc,GAAG;AACpC,oBAAM,SAAS,MAAM,iBAAiB;AACtC,oBAAM,QAAQ,OAAO,eAAe,OAAO,iBAAiB;AAC5D,oBAAM,YAAY,KAAK;AAEvB,kBAAI,aAAa,cAAc,OAAO;AACpC,sBAAM,SAAS,MAAM,iBAAiB,OAAO,SAAS,OAAO,QAAQ,OAAO,QAAQ,OAAO,SAAS;AACpG,oBAAI,OAAO,UAAU;AACnB,oCAAkB,IAAI,UAAU,YAAY,GAAG,EAAE,MAAM,OAAO,UAAU,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,gBAC1F;AACA,uBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,OAAO,CAAC;AAAA,cAChD;AAGA,kBAAI,WAAqB,KAAK;AAC9B,kBAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AACrD,2BAAW,MAAM,iBAAiB,OAAO,SAAS,OAAO,MAAM;AAAA,cACjE;AACA,kBAAI,SAAS,WAAW,GAAG;AACzB,2BAAW,OAAO;AAAA,cACpB;AAEA,oBAAM,UAAU,CAAC;AACjB,yBAAW,KAAK,UAAU;AACxB,sBAAM,IAAI,MAAM,iBAAiB,OAAO,SAAS,OAAO,QAAQ,OAAO,QAAQ,OAAO,CAAC;AACvF,oBAAI,EAAE,UAAU;AACd,oCAAkB,IAAI,EAAE,YAAY,GAAG,EAAE,MAAM,EAAE,UAAU,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,gBAC7E;AACA,wBAAQ,KAAK,CAAC;AAAA,cAChB;AAEA,qBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,QAAQ,CAAC;AAAA,YACjD;AAGA,gBAAI,aAAa,kBAAkB,IAAI,WAAW,QAAQ;AACxD,oBAAM,OAAO,MAAM,cAAc,GAAG;AACpC,oBAAM,SAAS,MAAM,iBAAiB;AACtC,oBAAM,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AACjE,oBAAM,UAAU,KAAK,WAAW,OAAO;AAEvC,qBAAO,eAAe;AACtB,qBAAO,UAAU;AACjB,oBAAM,iBAAiB,MAAM;AAC7B,oBAAM,kBAAkB,SAAS,QAAQ;AAEzC,oBAAM,sBAAsB,MAAM,uBAAuB;AACzD,qBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,oBAAoB,CAAC;AAAA,YAC7D;AAGA,gBAAI,aAAa,yBAAyB,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS;AACxF,oBAAM,SAAS,MAAM,iBAAiB;AACtC,oBAAM,QAAQ,OAAO,eAAe,OAAO,iBAAiB;AAC5D,kBAAI,CAAC,SAAS,CAAC,OAAO,QAAQ;AAC5B,uBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,OAAO,WAAW,OAAO,WAAW,KAAK,IAAI,EAAE,EAAE,CAAC;AAAA,cAC3J;AACA,oBAAM,SAAS,MAAM,sBAAsB,OAAO,QAAQ,OAAO,KAAK;AACtE,oBAAM,EAAE,SAAS,GAAG,OAAO,IAAI;AAE/B,oBAAM,UAAU,CAAC,OAAO;AACxB,qBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,EAAE,cAAc,OAAO,cAAc,aAAa,OAAO,aAAa,YAAY,OAAO,YAAY,SAAS,WAAW,QAAQ,OAAO,SAAS,GAAG,WAAW,KAAK,IAAI,EAAE,EAAE,CAAC;AAAA,YAC3N;AAEA,mBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,OAAO,OAAO,YAAY,CAAC;AAAA,UAC7D,SAAS,KAAU;AACjB,oBAAQ,MAAM,0BAA0B,GAAG;AAC3C,mBAAO,SAAS,KAAK,KAAK,EAAE,IAAI,OAAO,OAAO,KAAK,WAAW,OAAO,GAAG,EAAE,CAAC;AAAA,UAC7E;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,MAAM;AACX,YAAI,OAAO,eAAe,WAAY,YAAW;AAAA,MACnD;AAAA,IACF,GAAG,2BAA2B;AAAA,EAChC;AACF;",
6
6
  "names": ["name", "lines"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import type { MerchantChannelInfo } from '../types.js';
1
+ import type { ApiRoutingLogItem, MerchantChannelInfo } from '../types.js';
2
2
  export interface ProbeResult {
3
3
  modelName: string;
4
4
  success: boolean;
@@ -11,4 +11,4 @@ export interface ProbeResult {
11
11
  /** Probe a single model by sending a 1-token prompt and querying logs */
12
12
  export declare function probeSingleModel(baseURL: string, apiKey: string, userId?: string, accessToken?: string, modelName?: string): Promise<ProbeResult>;
13
13
  /** Pre-populate merchant cards from recent logs without triggering live probe */
14
- export declare function getKnownMerchantsFromLogs(userId?: string, accessToken?: string, modelNames?: string[]): Promise<Record<string, MerchantChannelInfo>>;
14
+ export declare function getKnownMerchantsFromLogs(userId?: string, accessToken?: string, modelNames?: string[], logs?: ApiRoutingLogItem[]): Promise<Record<string, MerchantChannelInfo>>;
@@ -120,6 +120,10 @@ export interface ModelCardData {
120
120
  probeError?: string;
121
121
  probeLatencyMs?: number;
122
122
  lastProbedAt?: number;
123
+ /** 路由快照时效:该模型最新一条「带 channel 的调用日志」时间(秒),即卡片商户数据来源请求的时刻 */
124
+ lastRoutedAt?: number;
125
+ /** 服务端算好的相对时间文案(如「3 小时前」),无记录时客户端显示「从未路由」 */
126
+ lastRoutedText?: string;
123
127
  }
124
128
  export interface BalanceInfo {
125
129
  hasAccountAuth: boolean;