@lynn123411/dsh-a6api 1.5.0 → 1.5.2

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/client.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client/index.ts", "../src/client/components/A6ApiSettings.tsx", "../src/client/store.ts", "../src/client/components/MerchantCard.tsx", "../src/client/components/BalanceCard.tsx", "../src/client/components/ConfigPanel.tsx", "../src/client/components/PricePill.tsx", "../src/client/components/MarketPill.tsx", "../src/client/components/ModelCatalogPanel.tsx", "../src/types.ts", "../src/client/components/A6ApiSidebarCard.tsx", "../src/client/styles/main.css"],
4
- "sourcesContent": ["import React from 'react';\nimport { A6ApiSettingsPanel } from './components/A6ApiSettings.js';\nimport { A6ApiSidebarCard } from './components/A6ApiSidebarCard.js';\nimport mainCss from './styles/main.css';\nimport { store } from './store.js';\n\nexport const name = '@lynn123411/dsh-a6api';\nexport const inject = ['slots'];\n\nfunction injectStyles() {\n if (typeof document === 'undefined') return;\n const styleId = 'dsh-a6api-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = mainCss;\n document.head.appendChild(style);\n }\n}\n\nfunction setupGlobalTooltip(): (() => void) | void {\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n if ((window as any).__dsh_a6api_tooltip_setup) return () => {};\n (window as any).__dsh_a6api_tooltip_setup = true;\n\n const portalId = 'dsh-a6api-tooltip';\n const arrowId = 'dsh-a6api-tooltip-arrow';\n let portal: HTMLElement | null = document.getElementById(portalId) as HTMLElement | null;\n let arrow: HTMLElement | null = document.getElementById(arrowId) as HTMLElement | null;\n if (!portal) {\n portal = document.createElement('div');\n portal.id = portalId;\n portal.setAttribute('role', 'tooltip');\n portal.style.cssText = 'position:fixed;left:0;top:0;transform:translate(-9999px,-9999px);padding:6px 10px;background:rgba(15,23,42,0.96);color:#f8fafc;font-size:11px;line-height:1.4;border-radius:6px;box-shadow:0 6px 18px rgba(0,0,0,0.28);border:1px solid rgba(255,255,255,0.12);max-width:min(320px,85vw);width:max-content;white-space:normal;word-break:break-word;overflow-wrap:anywhere;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transition:opacity 0.08s;z-index:2147483647;';\n document.body.appendChild(portal);\n }\n if (!arrow) {\n arrow = document.createElement('div');\n arrow.id = arrowId;\n arrow.style.cssText = 'position:fixed;left:0;top:0;width:8px;height:8px;background:rgba(15,23,42,0.96);transform:translate(-9999px,-9999px) rotate(45deg);border-left:1px solid rgba(255,255,255,0.12);border-top:1px solid rgba(255,255,255,0.12);pointer-events:none;opacity:0;visibility:hidden;z-index:2147483646;';\n document.body.appendChild(arrow);\n }\n\n let currentTarget: Element | null = null;\n\n function hide() {\n if (!portal || !arrow) return;\n portal.style.opacity = '0';\n (portal as HTMLElement).style.visibility = 'hidden';\n arrow.style.opacity = '0';\n (arrow as HTMLElement).style.visibility = 'hidden';\n document.body.classList.remove('dsh-a6api-tooltip-active');\n currentTarget = null;\n }\n\n function position(target: Element) {\n if (!portal || !arrow || !target) return;\n const text = target.getAttribute('data-tooltip');\n if (!text) return;\n (portal as HTMLElement).textContent = text;\n (portal as HTMLElement).style.visibility = 'hidden';\n (portal as HTMLElement).style.opacity = '0';\n (portal as HTMLElement).style.transform = 'translate(-9999px,-9999px)';\n (portal as HTMLElement).style.visibility = 'visible';\n const ttRect = (portal as HTMLElement).getBoundingClientRect();\n (portal as HTMLElement).style.visibility = 'hidden';\n const rect = target.getBoundingClientRect();\n const gap = 8;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const margin = 8;\n\n let pos = target.getAttribute('data-tooltip-pos') || '';\n if (!pos) {\n const spaceAbove = rect.top;\n const spaceBelow = vh - rect.bottom;\n if (spaceAbove < ttRect.height + gap + 12 && spaceBelow > spaceAbove) pos = 'down';\n else pos = 'top';\n }\n\n let top = 0;\n let left = 0;\n let arrowTop = 0;\n let arrowLeft = 0;\n const isDown = pos.startsWith('down');\n\n if (isDown) {\n top = rect.bottom + gap;\n arrowTop = rect.bottom + gap - 4;\n } else {\n top = rect.top - ttRect.height - gap;\n arrowTop = rect.top - gap - 4;\n }\n\n if (pos === 'left') {\n left = rect.right - ttRect.width;\n arrowLeft = rect.right - 14;\n } else if (pos === 'right') {\n left = rect.left;\n arrowLeft = rect.left + 14;\n } else if (pos === 'down-left') {\n left = rect.right - ttRect.width;\n arrowLeft = rect.right - 14;\n } else if (pos === 'down-right') {\n left = rect.left;\n arrowLeft = rect.left + 14;\n } else {\n left = rect.left + rect.width / 2 - ttRect.width / 2;\n arrowLeft = rect.left + rect.width / 2 - 4;\n }\n\n left = Math.max(margin, Math.min(left, vw - ttRect.width - margin));\n const minArrow = left + 8;\n const maxArrow = left + ttRect.width - 12;\n arrowLeft = Math.max(minArrow, Math.min(arrowLeft, maxArrow));\n\n if (top < margin) top = margin;\n if (top + ttRect.height > vh - margin) top = vh - ttRect.height - margin;\n\n (portal as HTMLElement).style.transform = 'translate(' + left + 'px,' + top + 'px)';\n (portal as HTMLElement).style.visibility = 'visible';\n (portal as HTMLElement).style.opacity = '1';\n (arrow as HTMLElement).style.transform = 'translate(' + arrowLeft + 'px,' + arrowTop + 'px) rotate(45deg)';\n (arrow as HTMLElement).style.visibility = 'visible';\n (arrow as HTMLElement).style.opacity = '1';\n document.body.classList.add('dsh-a6api-tooltip-active');\n }\n\n let hoverTimer: any = null;\n const onMouseOver = (e: any) => {\n const target = e.target && e.target.closest ? e.target.closest('[data-tooltip]') : null;\n if (!target) return;\n currentTarget = target;\n if (hoverTimer) clearTimeout(hoverTimer);\n hoverTimer = setTimeout(() => {\n if (currentTarget === target) position(target);\n }, 30);\n };\n const onMouseOut = (e: any) => {\n const target = e.target && e.target.closest ? e.target.closest('[data-tooltip]') : null;\n if (!target) return;\n const related = e.relatedTarget as Element | null;\n if (related && target.contains(related)) return;\n if (currentTarget === target) {\n if (hoverTimer) clearTimeout(hoverTimer);\n hide();\n }\n };\n const onFocusIn = (e: any) => {\n const target = e.target && e.target.closest ? e.target.closest('[data-tooltip]') : null;\n if (!target) return;\n currentTarget = target;\n position(target);\n };\n const onFocusOut = (e: any) => {\n const target = e.target && e.target.closest ? e.target.closest('[data-tooltip]') : null;\n if (!target) return;\n if (currentTarget === target) hide();\n };\n const onScrollOrResize = () => {\n if (currentTarget) {\n if (document.body.contains(currentTarget) && (currentTarget as any).matches && (currentTarget as HTMLElement).matches(':hover')) {\n position(currentTarget);\n } else if (document.activeElement === currentTarget) {\n position(currentTarget);\n } else {\n hide();\n }\n }\n };\n\n document.addEventListener('mouseover', onMouseOver, true);\n document.addEventListener('mouseout', onMouseOut, true);\n document.addEventListener('focusin', onFocusIn, true);\n document.addEventListener('focusout', onFocusOut, true);\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize);\n document.addEventListener('scroll', onScrollOrResize, true);\n\n return () => {\n document.removeEventListener('mouseover', onMouseOver, true);\n document.removeEventListener('mouseout', onMouseOut, true);\n document.removeEventListener('focusin', onFocusIn, true);\n document.removeEventListener('focusout', onFocusOut, true);\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize);\n document.removeEventListener('scroll', onScrollOrResize, true);\n if (hoverTimer) clearTimeout(hoverTimer);\n try { portal?.remove(); } catch {}\n try { arrow?.remove(); } catch {}\n document.body.classList.remove('dsh-a6api-tooltip-active');\n try { delete (window as any).__dsh_a6api_tooltip_setup; } catch { (window as any).__dsh_a6api_tooltip_setup = undefined; }\n currentTarget = null;\n };\n}\n\nexport function apply(ctx: any): void {\n injectStyles();\n if (typeof window !== 'undefined') {\n try {\n ctx.effect(() => {\n const dispose = setupGlobalTooltip();\n return () => {\n try { if (typeof dispose === 'function') (dispose as any)(); } catch {}\n };\n }, 'dsh-a6api: tooltip portal');\n } catch {}\n }\n if (typeof window === 'undefined') return;\n // \u542F\u52A8\u9884\u70ED + \u540E\u53F0\u8F6E\u8BE2\uFF1A\u63D2\u4EF6\u968F DSH \u542F\u52A8\u5373\u540E\u53F0\u62C9\u53D6\u4E00\u6B21\u5B8C\u6574\u72B6\u6001\uFF08\u670D\u52A1\u7AEF /state \u5DF2\u5E76\u884C\u5316\uFF09\uFF0C\n // \u4E4B\u540E\u6BCF 60s \u6574\u4F53\u5237\u65B0 \u2014\u2014 \u7528\u6237\u6253\u5F00\u4FA7\u8FB9\u680F\u6D6E\u5C42/\u8BBE\u7F6E\u9875\u65F6\u6570\u636E\u5DF2\u5C31\u7EEA\uFF0C\u79D2\u5F00\u65E0 spinner\n try {\n setTimeout(() => {\n try { store.warmUp(); } catch {}\n try { store.initPricePolling(); } catch {}\n }, 1500);\n } catch {}\n\n\n try {\n const slots = ctx?.slots || (ctx?.get ? ctx.get('slots') : null);\n if (!slots || typeof slots.inject !== 'function') return;\n\n slots.inject('settings.section', () => {\n return slots.register(\n {\n name: 'settings.section',\n id: 'dsh-a6api',\n order: 11,\n label: () => 'A6api',\n },\n A6ApiSettingsPanel,\n );\n });\n\n // \u4FA7\u8FB9\u680F\u5DE6\u4E0B\u89D2\u300CA6api\u300D\u6309\u94AE:\u70B9\u51FB\u5411\u4E0A\u5F39\u51FA\u5F53\u524D\u4F1A\u8BDD A6api \u6A21\u578B\u7684 MerchantCard \u6D6E\u5C42\n // getter \u5728 apply \u95ED\u5305\u521B\u5EFA\u4E00\u6B21,\u5F15\u7528\u7A33\u5B9A,\u907F\u514D entry \u91CD\u6E32\u67D3\u89E6\u53D1\u7EC4\u4EF6 effect \u53CD\u590D\u91CD\u8BA2\u9605\n const getModelDirectories = () =>\n ctx && typeof ctx.get === 'function' ? ctx.get('modelDirectories') : undefined;\n slots.inject('sidebar.footer.action', () => {\n return slots.register(\n {\n name: 'sidebar.footer.action',\n id: 'dsh-a6api-current-model',\n order: -1,\n label: () => 'A6api',\n },\n (props: any) =>\n React.createElement(A6ApiSidebarCard, {\n ...(props || {}),\n getModelDirectories,\n }),\n );\n });\n } catch (err) {\n console.warn('[dsh-a6api] Failed to inject slots:', err);\n }\n}", "import React, { useState, useEffect } from 'react';\nimport { store, type StoreState } from '../store.js';\nimport { MerchantCard } from './MerchantCard.js';\nimport { AccountPanel } from './BalanceCard.js';\nimport { ConfigPanel } from './ConfigPanel.js';\nimport { PricePill } from './PricePill.js';\nimport { MarketPill } from './MarketPill.js';\nimport { ModelCatalogPanel } from './ModelCatalogPanel.js';\n\ntype TabKey = 'models' | 'catalog' | 'account' | 'config';\n\nexport const A6ApiSettingsPanel: React.FC = () => {\n const [state, setState] = useState<StoreState>(store.getState());\n const [activeTab, setActiveTab] = useState<TabKey>('models');\n const [filterMode, setFilterMode] = useState<'all' | 'enabled' | 'probed'>('all');\n const [searchQuery, setSearchQuery] = useState('');\n const [refreshing, setRefreshing] = useState(false);\n const [refreshSuccess, setRefreshSuccess] = useState(false);\n\n useEffect(() => {\n const unsub = store.subscribe(() => {\n setState({ ...store.getState() });\n });\n store.fetchState();\n return unsub;\n }, []);\n\n // \u5168\u91CF\u63A2\u6D4B\u7684\u8FD0\u884C\u6001\uFF08\u8FDB\u884C\u4E2D/\u8FDB\u5EA6/\u603B\u6570\uFF09\u7531 store \u9A71\u52A8\uFF0C\u7EC4\u4EF6\u53EA\u8BA2\u9605\uFF1B\n // \u53D6\u6D88/\u7ACB\u5373\u91CD\u5F00/\u9762\u677F\u91CD\u6302\u8F7D\u65F6\u6309\u94AE\u4E0E\u8BA1\u6570\u59CB\u7EC8\u4E0E\u961F\u5217\u771F\u5B9E\u72B6\u6001\u4E00\u81F4\n const handleProbeAll = () => {\n store.probeAll();\n };\n\n const handleCancelProbeAll = () => {\n store.cancelProbeAll();\n };\n\n const handleRefreshState = async () => {\n setRefreshing(true);\n await store.fetchState();\n setRefreshing(false);\n setRefreshSuccess(true);\n setTimeout(() => setRefreshSuccess(false), 2000);\n };\n\n const inDshCount = state.models.filter((m) => m.inDsh).length;\n const probedCount = state.models.filter((m) => Boolean(m.merchant)).length;\n\n const filteredModels = state.models.filter((m) => {\n if (filterMode === 'enabled' && !m.inDsh) return false;\n if (filterMode === 'probed' && !m.merchant) return false;\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase().trim();\n return (\n m.model_name.toLowerCase().includes(q) ||\n m.brand.toLowerCase().includes(q) ||\n (m.merchant?.supplier_name && m.merchant.supplier_name.toLowerCase().includes(q)) ||\n (m.merchant?.channel_name && m.merchant.channel_name.toLowerCase().includes(q)) ||\n (m.merchant?.description && m.merchant.description.toLowerCase().includes(q))\n );\n }\n return true;\n });\n\n // \u56FA\u5B9A\u6A21\u578B\u4F4D\u7F6E\uFF1A\u542F\u7528\u7684\u6392\u5728\u6700\u524D\u9762\uFF0C\u672A\u542F\u7528\u7684\u6392\u5728\u540E\u9762\uFF1B\u7EC4\u5185\u6309\u6A21\u578B\u540D\u79F0\u5B57\u6BCD\u7EDD\u5BF9\u7A33\u5B9A\u6392\u5E8F\n const sortedModels = [...filteredModels].sort((a, b) => {\n if (a.inDsh !== b.inDsh) {\n return a.inDsh ? -1 : 1;\n }\n return a.model_name.localeCompare(b.model_name);\n });\n\n return (\n <div className=\"dsh-a6-container\">\n {/* 1. Header Title & Description */}\n <div className=\"dsh-a6-main-header\">\n <div className=\"dsh-a6-header-text\">\n <h2 className=\"dsh-a6-main-title\">A6api</h2>\n <p className=\"dsh-a6-main-subtitle\">\n \u805A\u5408\u5168\u7403\u4E3B\u6D41\u4E0E\u9AD8\u6027\u4EF7\u6BD4\u6A21\u578B\uFF0C\u5B9E\u65F6\u76D1\u63A7\u5546\u6237\u6307\u6807\u3001\u4EF7\u683C\u500D\u7387\u4E0E\u8D26\u6237\u8D44\u4EA7\u3002\n </p>\n </div>\n\n <div className=\"dsh-a6-header-badges\">\n {state.balance?.hasAccountAuth && (\n <div\n className=\"dsh-a6-header-balance-badge\"\n onClick={() => setActiveTab('account')}\n title=\"\u70B9\u51FB\u5207\u6362\u81F3\u300C\u8D26\u6237\u8D44\u4EA7\u300D\u9875\u9762\"\n >\n <span className=\"dsh-a6-hb-label\">\u8D26\u6237\u4F59\u989D:</span>\n <span className=\"dsh-a6-hb-amount\">{state.balance.accountBalanceFormatted}</span>\n </div>\n )}\n <PricePill pf={state.priceFluctuation} hasToken={Boolean(state.config?.hasToken)} />\n <MarketPill />\n </div>\n </div>\n\n {/* 2. Top Navigation Tabs */}\n <div className=\"dsh-a6-nav-tabs\">\n <button\n type=\"button\"\n className={`dsh-a6-nav-tab ${activeTab === 'models' ? 'active' : ''}`}\n onClick={() => setActiveTab('models')}\n >\n <span>\u53EF\u7528\u6A21\u578B</span>\n <span className=\"dsh-a6-tab-badge\">{state.models.length}</span>\n </button>\n\n <button\n type=\"button\"\n className={`dsh-a6-nav-tab ${activeTab === 'catalog' ? 'active' : ''}`}\n onClick={() => setActiveTab('catalog')}\n >\n <span>\u6A21\u578B\u76EE\u5F55</span>\n {state.catalog.length > 0 && <span className=\"dsh-a6-tab-badge\">{state.catalog.length}</span>}\n </button>\n\n <button\n type=\"button\"\n className={`dsh-a6-nav-tab ${activeTab === 'account' ? 'active' : ''}`}\n onClick={() => setActiveTab('account')}\n >\n <span>\u8D26\u6237\u8D44\u4EA7</span>\n {state.balance?.hasAccountAuth && (\n <span className=\"dsh-a6-tab-badge success\">\n {state.balance.accountBalanceFormatted}\n </span>\n )}\n </button>\n\n <button\n type=\"button\"\n className={`dsh-a6-nav-tab ${activeTab === 'config' ? 'active' : ''}`}\n onClick={() => setActiveTab('config')}\n >\n <span>\u57FA\u7840\u914D\u7F6E</span>\n </button>\n </div>\n\n {/* 3. Tab Content Pages */}\n {activeTab === 'catalog' && (\n <div className=\"dsh-a6-tab-page catalog-page\">\n <ModelCatalogPanel />\n </div>\n )}\n\n {activeTab === 'models' && (\n <div className=\"dsh-a6-tab-page models-page\">\n {/* Models Section Toolbar */}\n <div className=\"dsh-a6-section-header\">\n <div className=\"dsh-a6-filter-group\">\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${filterMode === 'all' ? 'active' : ''}`}\n onClick={() => setFilterMode('all')}\n >\n \u5168\u90E8 ({state.models.length})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${filterMode === 'enabled' ? 'active' : ''}`}\n onClick={() => setFilterMode('enabled')}\n >\n \u5DF2\u542F\u7528 ({inDshCount})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${filterMode === 'probed' ? 'active' : ''}`}\n onClick={() => setFilterMode('probed')}\n >\n \u5DF2\u63A2\u6D4B ({probedCount})\n </button>\n </div>\n\n <div className=\"dsh-a6-toolbar-right\">\n <div className=\"dsh-a6-search-wrapper\">\n <input\n type=\"text\"\n className=\"dsh-a6-input dsh-a6-search-input\"\n placeholder=\"\u641C\u7D22\u6A21\u578B / \u4F9B\u5E94\u5546 / \u6E20\u9053...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n {searchQuery && (\n <button\n type=\"button\"\n className=\"dsh-a6-clear-btn\"\n onClick={() => setSearchQuery('')}\n title=\"\u6E05\u7A7A\u641C\u7D22\"\n >\n \u00D7\n </button>\n )}\n </div>\n\n <button\n type=\"button\"\n className={`dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm ${refreshSuccess ? 'dsh-a6-btn-refresh-ok' : ''}`}\n onClick={handleRefreshState}\n disabled={refreshing || state.probeAllActive}\n data-tooltip={\n state.probeAllActive\n ? '\u5168\u91CF\u63A2\u6D4B\u8FDB\u884C\u4E2D\uFF0C\u5B8C\u6210\u540E\u53EF\u5237\u65B0'\n : '\u91CD\u65B0\u5411 A6API \u63A5\u53E3\u62C9\u53D6\u5F53\u524D\u4EE4\u724C\u7684\u53EF\u7528\u6A21\u578B\u5217\u8868\u53CA\u5DF2\u7F13\u5B58\u5546\u6237\u6307\u6807\uFF08\u4E0D\u6D88\u8017 Token\uFF09'\n }\n data-tooltip-pos=\"down\"\n >\n {refreshing ? '\u5237\u65B0\u4E2D...' : refreshSuccess ? '\u5DF2\u5237\u65B0 \u2713' : '\u5237\u65B0\u5217\u8868'}\n </button>\n\n {state.probeAllActive ? (\n <>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n disabled\n data-tooltip=\"\u6B63\u5728\u5E76\u53D1\u63A2\u6D4B\u5168\u90E8\u6A21\u578B\uFF0C\u5361\u7247\u9010\u4E2A\u56DE\u586B\u7ED3\u679C\"\n data-tooltip-pos=\"down-left\"\n >\n \u5168\u91CF\u63A2\u6D4B\u4E2D {state.probeAllDoneCount}/{state.probeAllTotal}\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-danger dsh-a6-btn-sm\"\n onClick={handleCancelProbeAll}\n data-tooltip=\"\u505C\u6B62\u53D6\u65B0\u4EFB\u52A1\uFF0C\u5DF2\u5728\u63A2\u6D4B\u4E2D\u7684\u6A21\u578B\u4F1A\u6B63\u5E38\u5B8C\u6210\u5E76\u56DE\u586B\"\n data-tooltip-pos=\"down-left\"\n >\n \u53D6\u6D88\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={handleProbeAll}\n disabled={state.models.length === 0}\n data-tooltip=\"\u5BF9\u5F53\u524D\u4EE4\u724C\u652F\u6301\u7684\u6240\u6709\u6A21\u578B\u5E76\u53D1\u53D1\u9001\u8BF7\u6C42\uFF0C\u6279\u91CF\u6355\u83B7\u5546\u6237\u8DEF\u7531\u4E0E\u6700\u65B0\u884C\u60C5\uFF08\u6BCF\u4E2A\u6A21\u578B\u6D88\u8017\u5C11\u91CFToken\uFF0C\u9047\u9650\u6D41\u81EA\u52A8\u91CD\u8BD5\uFF09\"\n data-tooltip-pos=\"down-left\"\n >\n \u4E00\u952E\u5168\u91CF\u63A2\u6D4B\n </button>\n )}\n </div>\n </div>\n\n {/* Model Cards List */}\n <div className=\"dsh-a6-cards-list\">\n {state.loading && state.models.length === 0 ? (\n <div className=\"dsh-a6-empty-state\">\n <div className=\"dsh-a6-spinner\" />\n <span>\u6B63\u5728\u8FDE\u63A5 A6API \u805A\u5408\u7AD9\u5E76\u52A0\u8F7D\u6A21\u578B\u884C\u60C5...</span>\n </div>\n ) : sortedModels.length > 0 ? (\n sortedModels.map((m) => (\n <MerchantCard key={m.model_name} model={m} />\n ))\n ) : (\n <div className=\"dsh-a6-empty-state\">\n {searchQuery ? (\n <span>\u672A\u641C\u7D22\u5230\u5339\u914D\u300C{searchQuery}\u300D\u7684\u6A21\u578B</span>\n ) : filterMode === 'enabled' ? (\n <span>\n \u5F53\u524D\u5C1A\u672A\u5728 DSH \u4E2D\u542F\u7528\u4EFB\u4F55 A6API \u6A21\u578B\uFF0C\u70B9\u51FB\u6A21\u578B\u5361\u7247\u53F3\u4FA7\u300C\u6DFB\u52A0\u5230 DSH\u300D\u5373\u53EF\u542F\u7528\u3002\n </span>\n ) : filterMode === 'probed' ? (\n <span>\n \u5C1A\u672A\u63A2\u6D4B\u4EFB\u4F55\u6A21\u578B\u5546\u6237\u7EBF\u8DEF\uFF0C\u70B9\u51FB\u6A21\u578B\u5361\u7247\u4E0A\u7684\u300C\u63A2\u6D4B\u5546\u5BB6\u300D\u6216\u4E0A\u65B9\u300C\u4E00\u952E\u5168\u91CF\u63A2\u6D4B\u300D\u5373\u53EF\u5F00\u59CB\u3002\n </span>\n ) : !state.config.hasApiKey ? (\n <span>\n \u8BF7\u524D\u5F80\u300C\u57FA\u7840\u914D\u7F6E\u300D\u9875\u9762\u586B\u5165\u60A8\u7684 A6API \u4EE4\u724C (API Key) \u5E76\u4FDD\u5B58\uFF0C\u5373\u53EF\u81EA\u52A8\u52A0\u8F7D\u53EF\u7528\u6A21\u578B\u5217\u8868\u3002\n </span>\n ) : (\n <span>\u5F53\u524D\u4EE4\u724C\u6682\u65E0\u53EF\u7528\u6A21\u578B\uFF0C\u8BF7\u68C0\u67E5 A6API \u63A7\u5236\u53F0\u4E2D\u7684\u4EE4\u724C\u9650\u5236\u8BBE\u7F6E\u3002</span>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {activeTab === 'account' && (\n <div className=\"dsh-a6-tab-page account-page\">\n <AccountPanel\n balance={state.balance}\n config={state.config}\n recentLogs={state.recentLogs}\n onNavigateToConfig={() => setActiveTab('config')}\n />\n </div>\n )}\n\n {activeTab === 'config' && (\n <div className=\"dsh-a6-tab-page config-page\">\n <ConfigPanel\n config={state.config}\n dshConfiguredModels={state.dshConfiguredModels}\n />\n </div>\n )}\n </div>\n );\n};", "import type {\n A6ApiConfig,\n A6ApiStateResponse,\n BalanceInfo,\n CatalogModelEntry,\n ModelCardData,\n ApiRoutingLogItem,\n PriceFluctuationState,\n MarketplacePin,\n} from '../types.js';\n\nfunction formatRelativeNow(tsSec: number): string {\n const diff = Math.floor(Date.now() / 1000) - tsSec;\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\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/** \u9650\u6D41\u7279\u5F81\uFF1A\u7F51\u5173 429 / Too Many Requests / rate limit\uFF08Key \u7EA7\u5E76\u53D1\u9650\u5236\u65F6\u51FA\u73B0\uFF1B\\b429\\b \u907F\u514D\u8BEF\u4F24\u4E0A\u6E38\u9519\u8BEF\u7801\u5982 42901\uFF09 */\nconst RATE_LIMIT_RE = /\\b429\\b|Too Many Requests|rate\\s*limit/i;\n\nexport interface StoreState {\n loading: boolean;\n config: A6ApiConfig;\n balance: BalanceInfo | null;\n models: ModelCardData[];\n dshConfiguredModels: string[];\n recentLogs: ApiRoutingLogItem[];\n probingModelNames: Set<string>;\n /** \u6B63\u5728\u6267\u884C\u56FA\u5B9A/\u53D6\u6D88\u56FA\u5B9A/\u7981\u7528/\u6062\u590D\u64CD\u4F5C\u7684\u6A21\u578B */\n actionBusyModels: Set<string>;\n /** \u5168\u91CF\u63A2\u6D4B\u662F\u5426\u8FDB\u884C\u4E2D\uFF08store \u9A71\u52A8 UI\uFF1A\u8FDB\u5EA6\u3001\u53D6\u6D88\u6309\u94AE\u3001\u91CD\u5165\u9632\u62A4\uFF09 */\n probeAllActive: boolean;\n /** \u5168\u91CF\u63A2\u6D4B\u603B\u6A21\u578B\u6570\uFF08\u5165\u961F\u65F6\u5FEB\u7167\uFF09 */\n probeAllTotal: number;\n /** \u5168\u91CF\u63A2\u6D4B\u5DF2\u5B8C\u6210\u6570\uFF08\u4E0E state.models \u89E3\u8026\uFF0C/state \u5237\u65B0\u4E0D\u4E22\uFF09 */\n probeAllDoneCount: number;\n /** \u5E73\u53F0\u56FA\u5B9A\u8BB0\u5F55\uFF08\u5361\u7247\u72B6\u6001\u8DDF\u968F\u5B98\u7F51\uFF09 */\n pins: MarketplacePin[];\n /** \u6A21\u578B\u76EE\u5F55\uFF08\u8FD0\u884C\u65F6 JSON\uFF0C\u5B57\u6BB5 = settings.yaml \u539F\u751F\u6A21\u578B\u5B57\u6BB5 + brand\uFF09 */\n catalog: CatalogModelEntry[];\n /** \u76EE\u5F55\u64CD\u4F5C\u8FDB\u884C\u4E2D\uFF08\u83B7\u53D6\u5E02\u573A\u6A21\u578B / OpenRouter \u67E5\u8BE2\uFF09 */\n catalogBusy: 'fetch' | 'query' | null;\n error: string | null;\n priceFluctuation: PriceFluctuationState;\n}\n\ntype Listener = () => void;\n\nclass A6ApiStore {\n private state: StoreState = {\n loading: true,\n config: {\n baseURL: 'https://api.a6api.com',\n apiKey: '',\n userId: '',\n activeModels: [],\n },\n balance: null,\n models: [],\n dshConfiguredModels: [],\n recentLogs: [],\n probingModelNames: new Set(),\n actionBusyModels: new Set(),\n probeAllActive: false,\n probeAllTotal: 0,\n probeAllDoneCount: 0,\n pins: [],\n catalog: [],\n catalogBusy: null,\n error: null,\n priceFluctuation: { pendingCount: 0, unseenCount: 0, totalCount: 0, updatedAt: null } as any,\n };\n\n private listeners: Set<Listener> = new Set();\n private autoRefreshTimer: any = null;\n /** \u542F\u52A8\u9884\u70ED\u5DF2\u89E6\u53D1\uFF08\u5E42\u7B49\uFF09\uFF1A\u63D2\u4EF6\u968F DSH \u542F\u52A8\u5373\u540E\u53F0\u62C9\u4E00\u6B21\u5B8C\u6574\u72B6\u6001 */\n private warmedUp = false;\n /** \u5168\u91CF\u63A2\u6D4B\u53D6\u6D88\u6807\u5FD7\uFF1A\u7F6E\u4F4D\u540E\u4E0D\u518D\u4ECE\u961F\u5217\u53D6\u65B0\u4EFB\u52A1\uFF0C\u5728\u9014\u63A2\u6D4B\u6B63\u5E38\u5B8C\u6210 */\n private probeCancelled = false;\n /** \u672C\u8F6E\u5168\u91CF\u63A2\u6D4B\u7684\u6A21\u578B\u540D\u5FEB\u7167\uFF08null = \u672A\u5728\u8FD0\u884C\uFF09\uFF0C\u7528\u4E8E\u8FDB\u5EA6\u8BA1\u6570\u4E0E /state \u5237\u65B0\u540E\u91CD\u6302\u72B6\u6001 */\n private probeAllSnapshot: string[] | null = null;\n /** \u672C\u8F6E\u5DF2\u5B8C\u6210\u63A2\u6D4B\u7684\u6A21\u578B\uFF08\u5E42\u7B49\u96C6\u5408\uFF0C\u9A71\u52A8 probeAllDoneCount\uFF09 */\n private probeAllDone = new Set<string>();\n /** \u5165\u961F\u524D\u5404\u6A21\u578B\u7684 probeError \u6682\u5B58\uFF0C\u53D6\u6D88\u65F6\u6062\u590D\u5386\u53F2\u9519\u8BEF\u63D0\u793A */\n private probeQueuedPrevError = new Map<string, string | undefined>();\n\n constructor() {\n this.startAutoRefresh();\n }\n\n public subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify() {\n for (const l of this.listeners) {\n try {\n l();\n } catch (err) {\n console.error('[dsh-a6api] listener error:', err);\n }\n }\n }\n\n public getState(): StoreState {\n return this.state;\n }\n\n public async fetchState(): Promise<void> {\n this.state.loading = true;\n this.notify();\n try {\n const res = await fetch('/api/dsh-a6api/state');\n if (res.ok) {\n const json = await res.json();\n if (json?.data) {\n const data: A6ApiStateResponse = json.data;\n this.state.config = data.config;\n this.state.balance = data.balance;\n this.state.models = data.models;\n // \u5168\u91CF\u63A2\u6D4B\u8FDB\u884C\u4E2D\uFF1A/state \u53EA\u4EA7 idle/success\uFF0C\u91CD\u6302 queued/probing\uFF0C\n // \u907F\u514D\u300C\u5237\u65B0\u5217\u8868 / \u56FA\u5B9A\u64CD\u4F5C / \u8F6E\u8BE2\u53D1\u73B0 pins \u53D8\u5316\u300D\u7B49 fetchState \u6253\u65AD\u6392\u961F\u4E0E\u8FDB\u5EA6\u8BA1\u6570\n const snapshot = this.probeAllSnapshot;\n if (this.state.probeAllActive && snapshot) {\n this.state.models = this.state.models.map((m) => {\n if (this.state.probingModelNames.has(m.model_name)) {\n return { ...m, probeStatus: 'probing' as const };\n }\n if (snapshot.includes(m.model_name) && !this.probeAllDone.has(m.model_name)) {\n return { ...m, probeStatus: 'queued' as const, probeError: undefined };\n }\n return m;\n });\n }\n this.state.dshConfiguredModels = data.dshConfiguredModels;\n if (Array.isArray(data.pins)) {\n this.state.pins = data.pins;\n }\n if (data.recentLogs) {\n this.state.recentLogs = data.recentLogs;\n }\n this.state.error = null;\n // \u82E5\u5DF2\u914D token\uFF0C\u987A\u5E26\u5237\u65B0\u4EF7\u683C\u6CE2\u52A8\uFF08\u9632\u91CD\u590D\uFF1A10s \u5185\u5DF2\u62C9\u8FC7\u5219\u8DF3\u8FC7\uFF09\n if (this.state.config?.hasToken) {\n const last = (this.state.priceFluctuation as any)?.updatedAt;\n if (!last || Date.now() - last > 10000) {\n this.fetchPriceFluctuation().catch(() => {});\n }\n }\n }\n }\n } catch (err: any) {\n this.state.error = err?.message || String(err);\n } finally {\n this.state.loading = false;\n this.notify();\n }\n }\n\n public async saveConfig(config: Partial<A6ApiConfig>): Promise<boolean> {\n try {\n const res = await fetch('/api/dsh-a6api/config', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(config),\n });\n if (res.ok) {\n await this.fetchState();\n return true;\n }\n } catch (err: any) {\n this.state.error = err?.message || String(err);\n this.notify();\n }\n return false;\n }\n\n public async refreshBalance(): Promise<void> {\n try {\n const res = await fetch('/api/dsh-a6api/balance');\n if (res.ok) {\n const json = await res.json();\n if (json?.balance) {\n this.state.balance = json.balance;\n }\n if (json?.recentLogs) {\n this.state.recentLogs = json.recentLogs;\n }\n this.notify();\n }\n } catch {}\n }\n\n // ===== \u6A21\u578B\u76EE\u5F55 =====\n\n public async fetchCatalog(): Promise<void> {\n try {\n const res = await fetch('/api/dsh-a6api/catalog');\n if (res.ok) {\n const json = await res.json();\n if (Array.isArray(json?.catalog)) {\n this.state.catalog = json.catalog;\n this.notify();\n }\n }\n } catch {}\n }\n\n /** \u4ECE A6API \u5E02\u573A\u62C9\u53D6\u5168\u90E8\u6A21\u578B ID \u5E76\u5165\u76EE\u5F55\uFF08\u4EC5\u65B0\u589E/\u8865\u54C1\u724C\uFF0C\u4E0D\u52A8\u5DF2\u6709\u53C2\u6570\uFF09 */\n public async fetchMarketModels(): Promise<{ ok: boolean; total?: number; added?: number; failedPages?: number; error?: string }> {\n if (this.state.catalogBusy) return { ok: false, error: '\u76EE\u5F55\u64CD\u4F5C\u8FDB\u884C\u4E2D' };\n this.state.catalogBusy = 'fetch';\n this.notify();\n try {\n const res = await fetch('/api/dsh-a6api/catalog/fetch-models', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n await this.fetchCatalog();\n return { ok: true, total: json.total, added: json.added, failedPages: json.failedPages || 0 };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n return { ok: false, error: msg };\n } finally {\n this.state.catalogBusy = null;\n this.notify();\n }\n }\n\n /** \u5BF9\u5168\u90E8\uFF08\u6216\u6307\u5B9A\uFF09\u76EE\u5F55\u6A21\u578B\u67E5 OpenRouter \u5E76\u586B\u5145\u53C2\u6570 */\n public async queryOpenRouter(modelIds?: string[]): Promise<{ ok: boolean; updated?: number; notFound?: string[]; error?: string }> {\n if (this.state.catalogBusy) return { ok: false, error: '\u76EE\u5F55\u64CD\u4F5C\u8FDB\u884C\u4E2D' };\n this.state.catalogBusy = 'query';\n this.notify();\n try {\n const res = await fetch('/api/dsh-a6api/catalog/query-openrouter', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ modelIds }),\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n await this.fetchCatalog();\n return { ok: true, updated: json.updated, notFound: json.notFound || [] };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n return { ok: false, error: msg };\n } finally {\n this.state.catalogBusy = null;\n this.notify();\n }\n }\n\n /** \u4FEE\u6539\u76EE\u5F55\u6761\u76EE\u53C2\u6570\uFF1B\u5DF2\u542F\u7528\u6A21\u578B\u7531\u670D\u52A1\u7AEF\u5373\u65F6\u91CD\u5199 settings.yaml */\n public async updateCatalogEntry(\n id: string,\n patch: Partial<CatalogModelEntry>,\n ): Promise<{ ok: boolean; error?: string }> {\n try {\n const res = await fetch('/api/dsh-a6api/catalog/update', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id, ...patch }),\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n await this.fetchCatalog();\n return { ok: true };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n return { ok: false, error: msg };\n }\n }\n\n /** \u6E05\u7A7A\u6A21\u578B\u76EE\u5F55\uFF08\u968F\u540E\u53EF\u91CD\u65B0\u4ECE A6API \u62C9\u53D6 / OpenRouter \u586B\u5145\uFF09 */\n public async clearCatalog(): Promise<{ ok: boolean; error?: string }> {\n try {\n const res = await fetch('/api/dsh-a6api/catalog/clear', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n await this.fetchCatalog();\n return { ok: true };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n return { ok: false, error: msg };\n }\n }\n\n public async fetchPriceFluctuation(): Promise<void> {\n try {\n const res = await fetch('/api/dsh-a6api/price-fluctuation');\n if (res.ok) {\n const json = await res.json();\n if (json?.data) {\n const d = json.data;\n const hasAuth = d.hasAuth !== false && !d.authError;\n // \u670D\u52A1\u7AEF\u5DF2\u533A\u5206\u201C\u672A\u914D\u7F6E/\u5931\u6548\u201D\u4E0E\u201C\u6709\u5F85\u5904\u7406 0\u201D\uFF0C\u5BA2\u6237\u7AEF\u5C0A\u91CD hasAuth\n if (!hasAuth) {\n // \u5931\u6548\u6216\u672A\u914D\u7F6E\u65F6\uFF0C\u663E\u793A -- \u800C\u975E 0\uFF08\u7531 UI \u5C42\u5224\u65AD\uFF09\uFF0C\u4F46\u4ECD\u66F4\u65B0\u65F6\u95F4\u907F\u514D\u9891\u7E41\u91CD\u8BD5\n const next = { pendingCount: 0, unseenCount: 0, totalCount: 0, updatedAt: Date.now(), hasAuth: false, authError: Boolean(d.authError) } as any;\n if (JSON.stringify(next) !== JSON.stringify(this.state.priceFluctuation)) {\n this.state.priceFluctuation = next;\n this.notify();\n }\n return;\n }\n const pending = Number(d.pendingCount ?? 0);\n const unseen = Number(d.unseenCount ?? 0);\n const total = Number(d.totalCount ?? 0);\n const next = { pendingCount: pending, unseenCount: unseen, totalCount: total, updatedAt: Date.now(), hasAuth: true, authError: false } as any;\n if (pending !== (this.state.priceFluctuation as any).pendingCount || unseen !== (this.state.priceFluctuation as any).unseenCount || (this.state.priceFluctuation as any).hasAuth === false || (this.state.priceFluctuation as any).updatedAt === null) {\n this.state.priceFluctuation = next;\n this.notify();\n } else if ((this.state.priceFluctuation as any).updatedAt === null) {\n this.state.priceFluctuation = next;\n this.notify();\n }\n }\n }\n } catch {}\n }\n\n /** \u5355\u6B21\u63A2\u6D4B\u8BF7\u6C42\uFF08\u4E0D\u4FEE\u6539\u72B6\u6001\uFF0C\u4F9B\u9650\u6D41\u91CD\u8BD5\u5FAA\u73AF\u590D\u7528\uFF09 */\n private async probeOnce(\n modelName: string,\n ): Promise<{ kind: 'ok'; json: any } | { kind: 'http'; status: number } | { kind: 'network'; error: string }> {\n try {\n const res = await fetch('/api/dsh-a6api/probe', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ modelName }),\n });\n if (res.ok) {\n const json = await res.json();\n return { kind: 'ok', json };\n }\n return { kind: 'http', status: res.status };\n } catch (err: any) {\n return { kind: 'network', error: err?.message || String(err) };\n }\n }\n\n private isRateLimitedOutcome(\n o: { kind: 'ok'; json: any } | { kind: 'http'; status: number } | { kind: 'network'; error: string },\n ): boolean {\n return (\n (o.kind === 'ok' &&\n Boolean(o.json?.result?.error && RATE_LIMIT_RE.test(String(o.json.result.error)))) ||\n (o.kind === 'http' && o.status === 429)\n );\n }\n\n /** \u628A\u4E00\u6B21\u63A2\u6D4B\u7ED3\u679C\u5E94\u7528\u5230\u5361\u7247\uFF08\u6309\u7ED3\u679C\u7C7B\u578B\u8D70\u539F\u6709\u6620\u5C04\u903B\u8F91\uFF09 */\n private applyProbeResult(\n modelName: string,\n outcome: { kind: 'ok'; json: any } | { kind: 'http'; status: number } | { kind: 'network'; error: string },\n ): void {\n const patch = (p: Partial<ModelCardData>) => {\n this.state.models = this.state.models.map((m) => (m.model_name === modelName ? { ...m, ...p } : m));\n this.notify();\n };\n if (outcome.kind === 'ok') {\n const json = outcome.json;\n if (json?.result?.merchant) {\n patch({\n merchant: json.result.merchant,\n probeStatus: 'success',\n probeLatencyMs: json.result.durationMs,\n probeError: undefined,\n lastProbedAt: Date.now(),\n // \u63A2\u6D4B\u8BF7\u6C42\u672C\u8EAB\u4F1A\u5199\u8DEF\u7531\u65E5\u5FD7,\u4E50\u89C2\u66F4\u65B0\u8DEF\u7531\u5FEB\u7167\u65F6\u6548,\u4E0B\u6B21 /state \u4EE5\u65E5\u5FD7\u4E3A\u51C6\n lastRoutedAt: Math.floor(Date.now() / 1000),\n lastRoutedText: formatRelativeNow(Math.floor(Date.now() / 1000)),\n });\n } else if (json?.result?.error) {\n patch({\n merchant: undefined,\n probeStatus: 'error',\n probeError: json.result.error,\n lastProbedAt: Date.now(),\n });\n } else {\n patch({\n probeStatus: json?.result?.success ? 'success' : 'idle',\n probeLatencyMs: json?.result?.durationMs,\n probeError: json?.result?.success\n ? '\u63A2\u6D4B\u6210\u529F,\u4F46\u672A\u6355\u83B7\u5546\u6237\u4FE1\u606F(\u9700\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C)'\n : undefined,\n lastProbedAt: Date.now(),\n });\n }\n } else if (outcome.kind === 'http') {\n patch({\n merchant: undefined,\n probeStatus: 'error',\n probeError: `HTTP ${outcome.status}`,\n lastProbedAt: Date.now(),\n });\n } else {\n patch({\n merchant: undefined,\n probeStatus: 'error',\n probeError: outcome.error,\n lastProbedAt: Date.now(),\n });\n }\n }\n\n public async probeModel(modelName: string): Promise<void> {\n this.state.probingModelNames.add(modelName);\n this.state.models = this.state.models.map((m) =>\n m.model_name === modelName ? { ...m, probeStatus: 'probing' as const } : m,\n );\n this.notify();\n\n try {\n let outcome = await this.probeOnce(modelName);\n // Key \u7EA7\u9650\u6D41(429)\u81EA\u52A8\u91CD\u8BD5\uFF1A\u9000\u907F 0.8s / 2s\uFF0C\u5171 3 \u6B21\uFF1B\u91CD\u8BD5\u671F\u95F4\u5361\u7247\u4FDD\u6301\u300C\u63A2\u6D4B\u4E2D\u300D\n if (this.isRateLimitedOutcome(outcome)) {\n for (let attempt = 2; attempt <= 3; attempt++) {\n await sleep(attempt === 2 ? 800 : 2000);\n outcome = await this.probeOnce(modelName);\n if (!this.isRateLimitedOutcome(outcome)) break;\n }\n if (this.isRateLimitedOutcome(outcome)) {\n this.state.models = this.state.models.map((m) =>\n m.model_name === modelName\n ? {\n ...m,\n merchant: undefined,\n probeStatus: 'error' as const,\n probeError: '\u8BF7\u6C42\u88AB\u9650\u6D41(429),\u5DF2\u81EA\u52A8\u91CD\u8BD5 3 \u6B21\u4ECD\u5931\u8D25,\u8BF7\u7A0D\u540E\u518D\u8BD5',\n lastProbedAt: Date.now(),\n }\n : m,\n );\n return;\n }\n }\n this.applyProbeResult(modelName, outcome);\n } finally {\n this.state.probingModelNames.delete(modelName);\n // \u8BA1\u5165\u5168\u91CF\u63A2\u6D4B\u8FDB\u5EA6\uFF08\u4EC5\u9650\u672C\u8F6E\u5FEB\u7167\u5185\u7684\u6A21\u578B\uFF1B\u5E42\u7B49\u96C6\u5408\uFF0C\u91CD\u590D\u63A2\u6D4B\u4E0D\u91CD\u590D\u8BA1\u6570\uFF09\n if (this.probeAllSnapshot?.includes(modelName)) {\n this.probeAllDone.add(modelName);\n this.state.probeAllDoneCount = this.probeAllDone.size;\n }\n this.notify();\n this.refreshBalance().catch(() => {});\n }\n }\n\n public async probeAll(): Promise<void> {\n // \u91CD\u5165\u9632\u62A4\uFF1A\u8FD0\u884C\u4E2D\u76F4\u63A5\u5FFD\u7565\uFF08store \u72B6\u6001\u9A71\u52A8 UI\uFF0C\u6B63\u5E38\u5165\u53E3\u5DF2\u4E0D\u53EF\u70B9\uFF0C\u9632\u5FA1\u5176\u4ED6\u8C03\u7528\u8DEF\u5F84\uFF09\n if (this.state.probeAllActive) return;\n const names = this.state.models.map((m) => m.model_name);\n if (names.length === 0) return;\n this.probeCancelled = false;\n this.probeAllSnapshot = names;\n this.probeAllDone.clear();\n // \u6682\u5B58\u5165\u961F\u524D\u7684\u63A2\u6D4B\u9519\u8BEF\u6587\u6848\uFF0C\u53D6\u6D88\u65F6\u6062\u590D\uFF08\u907F\u514D\u6392\u961F\u671F\u95F4\u6E05\u7A7A\u5386\u53F2\u9519\u8BEF\u63D0\u793A\uFF09\n this.probeQueuedPrevError = new Map(this.state.models.map((m) => [m.model_name, m.probeError]));\n this.state.probeAllActive = true;\n this.state.probeAllTotal = names.length;\n this.state.probeAllDoneCount = 0;\n // \u5168\u91CF\u5165\u961F\uFF1A\u7B49\u5F85\u4E2D\u7684\u6A21\u578B\u6309\u94AE\u663E\u793A\u300C\u7B49\u5F85\u63A2\u6D4B\u300D\u5E76\u7981\u7528\n this.state.models = this.state.models.map((m) => ({\n ...m,\n probeStatus: 'queued' as const,\n probeError: undefined,\n }));\n this.notify();\n // \u6D4F\u89C8\u5668\u540C\u6E90 HTTP/1.1 \u8FDE\u63A5\u6C60\u7EA6 6 \u8DEF\uFF0C\u518D\u9AD8\u4E5F\u5230\u4E0D\u4E86\u4E0A\u6E38\uFF1B8 \u4EC5\u4FDD\u8BC1\u69FD\u4F4D\u4E0D\u88AB\u6D4F\u89C8\u5668\u6392\u961F\u997F\u6B7B\n const CONCURRENCY = Math.min(8, names.length);\n let idx = 0;\n const worker = async () => {\n while (idx < names.length && !this.probeCancelled) {\n const name = names[idx++];\n // \u53D6\u6D88\u540E\u7ACB\u5373\u91CD\u5F00\u65F6\uFF0C\u4E0A\u4E00\u6B21\u8FD0\u884C\u7684\u5728\u9014\u63A2\u6D4B\u4ECD\u5360\u7528\u8BE5\u6A21\u578B\uFF1A\u8DF3\u8FC7\u907F\u514D\u5E76\u53D1\u53CC\u63A2\uFF0C\n // \u5176\u7ED3\u679C\u4ECD\u4F1A\u56DE\u586B\u5361\u7247\u5E76\u8BA1\u5165\u672C\u8F6E\u8FDB\u5EA6\n if (this.state.probingModelNames.has(name)) continue;\n await this.probeModel(name);\n }\n };\n try {\n await Promise.all(Array.from({ length: CONCURRENCY }, () => worker()));\n } finally {\n this.state.probeAllActive = false;\n this.probeAllSnapshot = null;\n this.probeAllDone.clear();\n this.state.probeAllDoneCount = 0;\n // \u53D6\u6D88\u65F6\u5269\u4F59\u6392\u961F\u6A21\u578B\u590D\u4F4D\u4E3A\u53EF\u624B\u52A8\u63A2\u6D4B\uFF08\u5E76\u6062\u590D\u5386\u53F2\u9519\u8BEF\u6587\u6848\uFF09\uFF1B\u6B63\u5E38\u8DD1\u5B8C\u65F6\u961F\u5217\u5DF2\u7A7A\uFF0C\u4E3A no-op\n this.restoreQueuedModels();\n this.notify();\n }\n }\n\n /** \u628A\u4ECD\u5904\u4E8E queued \u7684\u6A21\u578B\u590D\u4F4D\u4E3A idle \u5E76\u6062\u590D\u5165\u961F\u524D\u7684\u9519\u8BEF\u6587\u6848 */\n private restoreQueuedModels(): void {\n const prev = this.probeQueuedPrevError;\n this.state.models = this.state.models.map((m) =>\n m.probeStatus === 'queued'\n ? { ...m, probeStatus: 'idle' as const, probeError: prev.get(m.model_name) }\n : m,\n );\n this.probeQueuedPrevError = new Map();\n }\n\n /** \u53D6\u6D88\u5168\u91CF\u63A2\u6D4B\uFF1A\u7ACB\u5373\u590D\u4F4D\u6392\u961F\u6A21\u578B\uFF0C\u4E0D\u518D\u53D6\u65B0\u4EFB\u52A1\uFF0C\u5DF2\u5728\u9014\u7684\u63A2\u6D4B\u6B63\u5E38\u5B8C\u6210\u5E76\u56DE\u586B\u5361\u7247 */\n public cancelProbeAll(): void {\n if (!this.state.probeAllActive) return;\n this.probeCancelled = true;\n this.state.probeAllActive = false;\n this.probeAllSnapshot = null;\n this.probeAllDone.clear();\n this.state.probeAllDoneCount = 0;\n this.restoreQueuedModels();\n this.notify();\n }\n\n public async toggleDshModel(modelName: string): Promise<void> {\n const currentSet = new Set(this.state.dshConfiguredModels);\n if (currentSet.has(modelName)) {\n currentSet.delete(modelName);\n } else {\n currentSet.add(modelName);\n }\n const newModels = [...currentSet];\n try {\n const res = await fetch('/api/dsh-a6api/sync-models', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ modelIds: newModels }),\n });\n if (res.ok) {\n const json = await res.json();\n this.state.dshConfiguredModels = json.dshConfiguredModels || newModels;\n const dshSet = new Set(this.state.dshConfiguredModels);\n this.state.models = this.state.models.map((m) => ({\n ...m,\n inDsh: dshSet.has(m.model_name),\n }));\n this.notify();\n }\n } catch (err: any) {\n this.state.error = err?.message || String(err);\n this.notify();\n }\n }\n\n /**\n * \u56FA\u5B9A / \u53D6\u6D88\u56FA\u5B9A / \u7981\u7528 / \u6062\u590D \u7684\u7EDF\u4E00\u6267\u884C\u5668\u3002\n * \u6210\u529F\u540E\u4F1A\u5237\u65B0 /state\uFF08\u670D\u52A1\u7AEF\u4F1A\u628A\u5E73\u53F0\u56FA\u5B9A\u8BB0\u5F55\u53E0\u52A0\u56DE\u5361\u7247\uFF0C\u8DDF\u968F\u5B98\u7F51\u72B6\u6001\uFF09\u3002\n */\n private async runMarketplaceAction(\n modelName: string,\n endpoint: string,\n busySet: Set<string>,\n ): Promise<{ ok: boolean; error?: string }> {\n if (busySet.has(modelName)) return { ok: false, error: '\u64CD\u4F5C\u8FDB\u884C\u4E2D' };\n busySet.add(modelName);\n this.notify();\n try {\n const res = await fetch(`/api/dsh-a6api/${endpoint}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ modelName }),\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n if (Array.isArray(json.pins)) {\n this.state.pins = json.pins;\n }\n await this.fetchState();\n return { ok: true };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n this.notify();\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n this.notify();\n return { ok: false, error: msg };\n } finally {\n busySet.delete(modelName);\n this.notify();\n }\n }\n\n /** \u56FA\u5B9A\u5361\u7247\u5F53\u524D\u5546\u5BB6\u5230\u8BE5\u6A21\u578B */\n public pinModel(modelName: string): Promise<{ ok: boolean; error?: string }> {\n return this.runMarketplaceAction(modelName, 'pin', this.state.actionBusyModels);\n }\n\n /** \u53D6\u6D88\u8BE5\u6A21\u578B\u7684\u56FA\u5B9A */\n public unpinModel(modelName: string): Promise<{ ok: boolean; error?: string }> {\n return this.runMarketplaceAction(modelName, 'unpin', this.state.actionBusyModels);\n }\n\n /** \u7981\u7528\u5361\u7247\u5F53\u524D\u5546\u5BB6\u5BF9\u8BE5\u6A21\u578B\u7684\u670D\u52A1 */\n public disableModel(modelName: string): Promise<{ ok: boolean; error?: string }> {\n return this.runMarketplaceAction(modelName, 'disable', this.state.actionBusyModels);\n }\n\n /** \u6062\u590D\u88AB\u7981\u7528\u7684\u5546\u5BB6 */\n public restoreModel(modelName: string): Promise<{ ok: boolean; error?: string }> {\n return this.runMarketplaceAction(modelName, 'restore', this.state.actionBusyModels);\n }\n\n /**\n * \u542F\u52A8\u9884\u70ED\uFF1A\u63D2\u4EF6\u968F DSH \u542F\u52A8\u5373\u540E\u53F0\u62C9\u53D6\u4E00\u6B21\u5B8C\u6574\u72B6\u6001\u3002\n * \u4FA7\u8FB9\u680F\u6309\u94AE\u5728\u5E94\u7528\u542F\u52A8\u65F6\u5C31\u5DF2\u6302\u8F7D\uFF0C\u9884\u70ED\u8BA9\u7528\u6237\u6253\u5F00\u6D6E\u5C42/\u8BBE\u7F6E\u9875\u65F6\u6570\u636E\u65E9\u5DF2\u5C31\u7EEA \u2192 \u79D2\u5F00\u65E0 spinner\u3002\n * \u672A\u914D\u7F6E\u51ED\u636E\u65F6 /state \u8FD4\u56DE\u9ED8\u8BA4\u56DE\u9000\u6570\u636E\uFF0C\u65E0\u5BB3\uFF1B\u540E\u7EED\u4FDD\u5B58\u914D\u7F6E/\u8F6E\u8BE2\u4F1A\u6301\u7EED\u5237\u65B0\u3002\n * \u76EE\u5F55\u4E00\u5E76\u9884\u70ED\uFF08\u6A21\u578B\u76EE\u5F55 tab \u5FBD\u6807/\u9996\u5C4F\u4E0D\u7B49\u5F85\u9996\u6B21\u8FDB\u5165\uFF09\u3002\n */\n public warmUp(): void {\n if (this.warmedUp) return;\n this.warmedUp = true;\n this.fetchState().catch(() => {});\n this.fetchCatalog().catch(() => {});\n }\n\n private startAutoRefresh() {\n if (this.autoRefreshTimer) clearInterval(this.autoRefreshTimer);\n // 60s \u540E\u53F0\u6574\u4F53\u5237\u65B0\uFF1A/state \u5355\u6B21\u62C9\u53D6\u5373\u542B\u4F59\u989D/\u6A21\u578B/\u65E5\u5FD7/\u56FA\u5B9A\u8BB0\u5F55\uFF08\u670D\u52A1\u7AEF\u5DF2\u5E76\u884C\u5316\uFF09\uFF0C\n // \u53D6\u4EE3\u539F\u5148\u5206\u7ACB\u7684\u4F59\u989D/\u4EF7\u683C\u6CE2\u52A8/\u56FA\u5B9A\u8BB0\u5F55\u4E09\u4E2A\u8F6E\u8BE2\u3002\u4EF7\u683C\u6CE2\u52A8\u4E0E\u56FA\u5B9A\u8BB0\u5F55\u7531 fetchState\n // \u5185\u90E8\u7684\u53BB\u91CD\u903B\u8F91\u6309\u9700\u89E6\u53D1\uFF1B\u672A\u914D\u7F6E API Key \u65F6\u8DF3\u8FC7\uFF0C\u907F\u514D\u65E0\u610F\u4E49\u8BF7\u6C42\u3002\n this.autoRefreshTimer = setInterval(() => {\n if (this.state.config?.hasApiKey) {\n this.fetchState().catch(() => {});\n }\n }, 60000);\n }\n\n public stopAutoRefresh() {\n if (this.autoRefreshTimer) { clearInterval(this.autoRefreshTimer); this.autoRefreshTimer = null; }\n }\n\n public initPricePolling() {\n if (this.autoRefreshTimer) return;\n this.startAutoRefresh();\n if (this.state.config?.hasToken) {\n this.fetchPriceFluctuation().catch(() => {});\n }\n }\n}\n\nexport const store = new A6ApiStore();\n", "import React, { useState, useRef } from 'react';\nimport { store } from '../store.js';\nimport type { ModelCardData } from '../../types.js';\n\n// \u79D2\u7EA7\u65F6\u95F4\u6233 \u2192 \u7EDD\u5BF9\u65F6\u95F4\u6587\u6848 (MM-DD HH:mm:ss\uFF0C\u8DE8\u5E74\u65F6\u5E26\u5E74)\nconst formatAbsolute = (tsSec: number) => {\n const d = new Date(tsSec * 1000);\n const p = (n: number) => String(n).padStart(2, '0');\n const nowY = new Date().getFullYear();\n const y = d.getFullYear();\n const md = `${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;\n return y !== nowY ? `${y}-${md}` : md;\n};\n\nexport const MerchantCard: React.FC<{\n model: ModelCardData;\n}> = ({ model }) => {\n // \u8FDB\u5165\u540E\u9ED8\u8BA4\u4E0D\u5C55\u5F00\n const [expanded, setExpanded] = useState(false);\n const [pinConfirmOpen, setPinConfirmOpen] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const errorTimerRef = useRef<any>(null);\n\n const isProbing = model.probeStatus === 'probing';\n const isQueued = model.probeStatus === 'queued';\n const merchant = model.merchant;\n const isBusy = store.getState().actionBusyModels.has(model.model_name);\n const canWebAction = Boolean(store.getState().config?.hasToken);\n const hasMerchant = Boolean(merchant?.channel_id);\n const isPinnedHere = model.pinStatus === 'pin_here';\n const isPinnedElsewhere = model.pinStatus === 'pin_elsewhere';\n const isChannelDisabled = Boolean(merchant?.user_channel_disabled);\n\n const flashActionError = (msg: string) => {\n // \u8FDE\u7EED\u5931\u8D25\u65F6\u5148\u6E05\u6389\u65E7\u5B9A\u65F6\u5668\uFF0C\u907F\u514D\u524D\u4E00\u6761\u9519\u8BEF\u63D0\u524D\u6E05\u6389\u540E\u4E00\u6761\n if (errorTimerRef.current) clearTimeout(errorTimerRef.current);\n setActionError(msg);\n errorTimerRef.current = setTimeout(() => setActionError(null), 6000);\n };\n\n const handleProbe = (e: React.MouseEvent) => {\n e.stopPropagation();\n store.probeModel(model.model_name);\n };\n\n const handleToggleDsh = (e: React.MouseEvent) => {\n e.stopPropagation();\n store.toggleDshModel(model.model_name);\n };\n\n const handleOpenPinConfirm = (e: React.MouseEvent) => {\n e.stopPropagation();\n setActionError(null);\n setPinConfirmOpen(true);\n };\n\n const handleConfirmPin = async () => {\n setActionError(null);\n const r = await store.pinModel(model.model_name);\n if (!r.ok) {\n flashActionError(r.error || '\u56FA\u5B9A\u5931\u8D25');\n } else {\n setPinConfirmOpen(false);\n }\n };\n\n const handleUnpin = async (e: React.MouseEvent) => {\n e.stopPropagation();\n setActionError(null);\n const r = await store.unpinModel(model.model_name);\n if (!r.ok) flashActionError(r.error || '\u53D6\u6D88\u56FA\u5B9A\u5931\u8D25');\n };\n\n const handleDisable = async (e: React.MouseEvent) => {\n e.stopPropagation();\n setActionError(null);\n const r = await store.disableModel(model.model_name);\n if (!r.ok) flashActionError(r.error || '\u7981\u7528\u5931\u8D25');\n };\n\n const handleRestore = async (e: React.MouseEvent) => {\n e.stopPropagation();\n setActionError(null);\n const r = await store.restoreModel(model.model_name);\n if (!r.ok) flashActionError(r.error || '\u6062\u590D\u5931\u8D25');\n };\n\n // Success Rate Dot Generators\n const renderRealtimeDots = () => {\n if (merchant?.success_buckets && merchant.success_buckets.length > 0) {\n return merchant.success_buckets.slice(0, 10).map((b, i) => {\n const rate = b.success_rate;\n let colorClass = 'green';\n if (rate < 8000) colorClass = 'red';\n else if (rate < 9500) colorClass = 'yellow';\n return <div key={i} className={`dsh-a6-rate-dot ${colorClass}`} />;\n });\n }\n const count = 10;\n const greenCount = merchant ? Math.round((merchant.recent_success_rate_pct / 100) * count) : 10;\n return Array.from({ length: count }).map((_, i) => (\n <div key={i} className={`dsh-a6-rate-dot ${i < greenCount ? 'green' : 'empty'}`} />\n ));\n };\n\n const render24hDots = () => {\n if (merchant?.b24 && merchant.b24.length > 0) {\n return merchant.b24.slice(0, 12).map((b, i) => {\n if (!b.s || b.s === 0) {\n return <div key={i} className=\"dsh-a6-rate-dot empty\" />;\n }\n let colorClass = 'green';\n if (b.r < 8000) colorClass = 'red';\n else if (b.r < 9500) colorClass = 'yellow';\n return <div key={i} className={`dsh-a6-rate-dot ${colorClass}`} />;\n });\n }\n const count = 12;\n const greenCount = merchant ? Math.round((merchant.success_rate_24h_pct / 100) * count) : 12;\n return Array.from({ length: count }).map((_, i) => (\n <div key={i} className={`dsh-a6-rate-dot ${i < greenCount ? 'green' : 'empty'}`} />\n ));\n };\n\n const render7dDots = () => {\n if (merchant?.b7d && merchant.b7d.length > 0) {\n return merchant.b7d.slice(0, 7).map((b, i) => {\n if (!b.s || b.s === 0) {\n return <div key={i} className=\"dsh-a6-rate-dot empty\" />;\n }\n let colorClass = 'green';\n if (b.r && b.r < 8000) colorClass = 'red';\n else if (b.r && b.r < 9500) colorClass = 'yellow';\n return <div key={i} className={`dsh-a6-rate-dot ${colorClass}`} />;\n });\n }\n return Array.from({ length: 7 }).map((_, i) => (\n <div key={i} className={`dsh-a6-rate-dot ${i >= 4 ? 'green' : 'empty'}`} />\n ));\n };\n\n // Smart tag styling\n const getTagClass = (tag: string) => {\n if (tag.includes('\u4FDD\u771F')) return 'tag-guarantee';\n if (tag.includes('\u7A33\u5B9A')) return 'tag-stable';\n if (tag.includes('\u4F4E\u4EF7')) return 'tag-cheap';\n if (tag.includes('\u9AD8\u901F')) return 'tag-fast';\n if (tag.includes('\u9AD8\u8D28')) return 'tag-quality';\n return '';\n };\n\n // Realtime ratio pill\n const ratioText = merchant?.realtime_ratio_formatted || '0.0341';\n\n // Latency & Cache hit\n const latencySec = merchant\n ? ((merchant.p50_ttft_ms || merchant.recent_p50_ms || 2340) / 1000).toFixed(2) + 's'\n : model.probeLatencyMs\n ? (model.probeLatencyMs / 1000).toFixed(2) + 's'\n : '2.34s';\n const cacheHitPct = merchant ? merchant.cache_hit_rate_pct : 72.0;\n\n return (\n <div className={`dsh-a6-official-card ${model.inDsh ? 'in-dsh' : ''}`}>\n {/* 1. Main Top Row */}\n <div className=\"dsh-a6-card-main-bar\" onClick={() => setExpanded(!expanded)}>\n {/* Col 1: Model Title & Subtitle */}\n <div className=\"dsh-a6-bar-identity\">\n <div className=\"dsh-a6-title-col\">\n <div className=\"dsh-a6-title-line\">\n <span className=\"dsh-a6-name-text\">{model.model_name}</span>\n {merchant?.channel_id && (\n <>\n <span className=\"dsh-a6-dot-sep\">\u00B7</span>\n <span className=\"dsh-a6-merchant-id-text\">\n \u5546\u6237ID {merchant.channel_id}\n </span>\n </>\n )}\n {isPinnedHere && !isChannelDisabled && (\n <span\n className=\"dsh-a6-pin-badge here\"\n data-tooltip={\n `\u8BE5\u6A21\u578B\u5DF2\u56FA\u5B9A\u5230\u5F53\u524D\u5546\u5BB6${model.pinnedFallback === false ? '\uFF08\u4E25\u683C\u56FA\u5B9A\uFF09' : '\uFF0C\u5F02\u5E38\u65F6\u81EA\u52A8\u5207\u6362\u667A\u80FD\u4F18\u9009'}${model.pinTokenMatched === false ? '\uFF1B\u8BE5\u56FA\u5B9A\u5C5E\u4E8E\u5176\u4ED6\u4EE4\u724C\uFF0C\u4EC5\u4F9B\u53C2\u8003' : ''}`\n }\n data-tooltip-pos=\"down\"\n >\n \u5DF2\u56FA\u5B9A\n </span>\n )}\n {isPinnedElsewhere && (\n <span\n className=\"dsh-a6-pin-badge elsewhere\"\n data-tooltip={\n `\u8BE5\u6A21\u578B\u5DF2\u56FA\u5B9A\u5230${model.pinnedChannelId ? `\u5546\u6237 #${model.pinnedChannelId}` : '\u5176\u4ED6\u5546\u5BB6'}${model.pinnedSupplierName ? `\uFF08${model.pinnedSupplierName}\uFF09` : ''}${model.pinTokenMatched === false ? '\uFF1B\u8BE5\u56FA\u5B9A\u5C5E\u4E8E\u5176\u4ED6\u4EE4\u724C\uFF0C\u4EC5\u4F9B\u53C2\u8003' : ''}`\n }\n data-tooltip-pos=\"down\"\n >\n \u5DF2\u56FA\u5B9A\u5230\u5176\u4ED6\u5546\u5BB6\n </span>\n )}\n {isChannelDisabled && (\n <span className=\"dsh-a6-pin-badge disabled\" data-tooltip=\"\u5F53\u524D\u5546\u5BB6\u5DF2\u5BF9\u8BE5\u6A21\u578B\u7981\u7528\uFF0C\u8DEF\u7531\u4E0D\u4F1A\u547D\u4E2D\u6B64\u6E20\u9053\" data-tooltip-pos=\"down\">\n \u5DF2\u7981\u7528\n </span>\n )}\n </div>\n {merchant?.description && (\n <div className=\"dsh-a6-sub-desc\">{merchant.description}</div>\n )}\n </div>\n </div>\n\n {/* Col 2: Pricing Summary + Ratio Tag */}\n {merchant ? (\n <div className=\"dsh-a6-bar-pricing\">\n <div className=\"dsh-a6-price-col\">\n <span className=\"dsh-a6-price-top\" title=\"\u8F93\u5165\u4EF7 (1M)\">\n {merchant.input_price_cny}\n </span>\n <span className=\"dsh-a6-price-btm\" title=\"\u7F13\u5B58\u8BFB (1M)\">\n {merchant.cache_read_price_cny}\n </span>\n </div>\n <div className=\"dsh-a6-price-col\">\n <span className=\"dsh-a6-price-top\" title=\"\u8F93\u51FA\u4EF7 (1M)\">\n {merchant.output_price_cny}\n </span>\n <span className=\"dsh-a6-price-btm\" title=\"\u7F13\u5B58\u5199 (1M)\">\n {merchant.cache_write_price_cny}\n </span>\n </div>\n <div className=\"dsh-a6-ratio-pill\" title=\"\u5B9E\u65F6\u500D\u7387\u6BD4\u5B98\u65B9\u4EF7\">\n {ratioText}\n </div>\n </div>\n ) : (\n <div className=\"dsh-a6-bar-pricing unprobed\">\n <div\n className={`dsh-a6-unprobed-hint ${model.probeError ? 'error' : ''}`}\n data-tooltip={model.probeError || undefined}\n data-tooltip-pos=\"down\"\n >\n {isProbing ? '\u5546\u5BB6\u63A2\u6D4B\u4E2D...' : isQueued ? '\u6392\u961F\u7B49\u5F85\u63A2\u6D4B...' : model.probeError ? '\u63A2\u6D4B\u5931\u8D25' : '\u5C1A\u672A\u63A2\u6D4B\u5546\u5BB6'}\n </div>\n </div>\n )}\n\n {/* Col 3: Status / Health Bars (\u5B9E\u65F6, 24h, 7d) */}\n <div className=\"dsh-a6-bar-uptime\">\n <div className=\"dsh-a6-uptime-row\">\n <span className=\"dsh-a6-uptime-label\">\u5B9E\u65F6</span>\n <div className=\"dsh-a6-dots-track\">{renderRealtimeDots()}</div>\n <span className=\"dsh-a6-uptime-val\">\n {merchant ? `${merchant.recent_success_rate_pct.toFixed(1)}%` : '100.0%'}\n </span>\n </div>\n <div className=\"dsh-a6-uptime-row\">\n <span className=\"dsh-a6-uptime-label\">24h</span>\n <div className=\"dsh-a6-dots-track\">{render24hDots()}</div>\n <span className=\"dsh-a6-uptime-val\">\n {merchant ? `${merchant.success_rate_24h_pct.toFixed(1)}%` : '99.3%'}\n </span>\n </div>\n <div className=\"dsh-a6-uptime-row\">\n <span className=\"dsh-a6-uptime-label\">7d</span>\n <div className=\"dsh-a6-dots-track\">{render7dDots()}</div>\n <span className=\"dsh-a6-uptime-val\">\n {merchant?.sr_7d_state === 'no_data'\n ? '-'\n : merchant?.success_rate_7d_pct\n ? `${merchant.success_rate_7d_pct.toFixed(1)}%`\n : '-'}\n </span>\n </div>\n </div>\n\n {/* Col 4: Speed / Latency & Cache Hit Bar */}\n <div className=\"dsh-a6-bar-perf\">\n <div className=\"dsh-a6-perf-row\">\n <span className=\"dsh-a6-latency-text\">{latencySec}</span>\n <span className=\"dsh-a6-cache-hit-text\">{cacheHitPct.toFixed(1)}%</span>\n <div className=\"dsh-a6-hit-track\">\n <div\n className=\"dsh-a6-hit-fill\"\n style={{ width: `${Math.min(100, Math.max(0, cacheHitPct))}%` }}\n />\n </div>\n </div>\n </div>\n\n {/* Col 5: Smart Tags */}\n <div className=\"dsh-a6-bar-tags\">\n {(merchant?.labels || ['\u7A33\u5B9A', '\u4F4E\u4EF7', '\u9AD8\u901F', '\u9AD8\u8D28']).map((lbl, idx) => (\n <span key={idx} className={`dsh-a6-smart-pill ${getTagClass(lbl)}`}>\n {lbl}\n </span>\n ))}\n </div>\n\n </div>\n\n {/* 2. Bottom Footer: \u65F6\u95F4\u6233\u5DE6\u4E0B\u89D2 + \u64CD\u4F5C\u6309\u94AE\u53F3\u4E0B\u89D2 */}\n <div className=\"dsh-a6-card-footer\">\n <div className=\"dsh-a6-time-stack\">\n <span\n className=\"dsh-a6-time-ago\"\n data-tooltip=\"\u8BE5\u5546\u6237\u8DEF\u7EBF\u5168\u7F51\u6700\u8FD1\u4E00\u6B21\u6210\u529F\u54CD\u5E94\u65F6\u95F4\"\n >\n \u5168\u7F51\u6700\u8FD1\uFF1A{merchant?.last_success_text || '\u521A\u521A'}\n </span>\n <span\n className={`dsh-a6-time-ago dsh-a6-route-snapshot${model.lastRoutedAt ? '' : ' never'}`}\n data-tooltip={\n model.lastRoutedAt\n ? `\u4E2A\u4EBA\u6700\u540E\u4E00\u6B21\u8BF7\u6C42\u8BE5\u5546\u5BB6\u7684\u8BE5\u6A21\u578B ${formatAbsolute(model.lastRoutedAt)}`\n : '\u65E5\u5FD7\u4E2D\u6682\u65E0\u8BE5\u5546\u5BB6\u7684\u8BE5\u6A21\u578B\u8DEF\u7531\u8BB0\u5F55'\n }\n >\n \u4E2A\u4EBA\u6700\u8FD1\uFF1A{model.lastRoutedText || '\u4ECE\u672A\u8DEF\u7531'}\n </span>\n </div>\n\n {/* Col 6: \u64CD\u4F5C\u6309\u94AE\u7EC4 \u2014 \u5361\u7247\u53F3\u4E0B\u89D2 */}\n <div className=\"dsh-a6-bar-actions\" onClick={(e) => e.stopPropagation()}>\n <div className=\"dsh-a6-bar-actions-btns\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleProbe}\n disabled={isProbing || isQueued}\n data-tooltip={\n isQueued\n ? '\u6B63\u5728\u5168\u91CF\u63A2\u6D4B\u961F\u5217\u4E2D\u7B49\u5F85\uFF0C\u8BF7\u52FF\u91CD\u590D\u70B9\u51FB'\n : '\u5411\u8BE5\u6A21\u578B\u53D1\u9001\u4E00\u6B21\u8BF7\u6C42\u4EE5\u63A2\u6D4B\u5E76\u6355\u83B7\u5176\u5B9E\u9645\u547D\u4E2D\u7684\u5546\u6237 ID\u3001\u4EF7\u683C\u53CA\u5065\u5EB7\u5EA6\u6307\u6807\uFF08\u6D88\u8017\u5C11\u91CFToken\uFF09'\n }\n >\n {isProbing ? '\u63A2\u6D4B\u4E2D...' : isQueued ? '\u7B49\u5F85\u63A2\u6D4B' : '\u63A2\u6D4B\u5546\u5BB6'}\n </button>\n\n {isPinnedHere ? (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-danger dsh-a6-btn-sm\"\n onClick={handleUnpin}\n disabled={isBusy || !canWebAction || model.pinTokenMatched === false || isProbing || isQueued}\n data-tooltip={\n isProbing || isQueued\n ? '\u63A2\u6D4B\u5B8C\u6210\u540E\u518D\u53D6\u6D88\u56FA\u5B9A'\n : model.pinTokenMatched === false\n ? '\u8BE5\u56FA\u5B9A\u5C5E\u4E8E\u5176\u4ED6\u4EE4\u724C\uFF0C\u65E0\u6CD5\u5728\u6B64\u53D6\u6D88\uFF1B\u5982\u9700\u53D6\u6D88\u8BF7\u5230\u5B98\u7F51\u6216\u5148\u4E3A\u5F53\u524D\u4EE4\u724C\u56FA\u5B9A\u6B64\u5546\u5BB6'\n : canWebAction\n ? '\u53D6\u6D88\u56FA\u5B9A\u540E\u6062\u590D\u667A\u80FD\u4F18\u9009\u8DEF\u7531\uFF0C\u53EF\u91CD\u65B0\u63A2\u6D4B\u540E\u518D\u51B3\u5B9A\u662F\u5426\u56FA\u5B9A'\n : '\u9700\u5148\u5728\u300C\u57FA\u7840\u914D\u7F6E\u300D\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C/\u4F1A\u8BDD'\n }\n >\n {isBusy ? '\u5904\u7406\u4E2D...' : '\u53D6\u6D88\u56FA\u5B9A'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={handleOpenPinConfirm}\n disabled={isBusy || !hasMerchant || !canWebAction || isProbing || isQueued}\n data-tooltip={\n isProbing || isQueued\n ? '\u63A2\u6D4B\u5B8C\u6210\u540E\u518D\u56FA\u5B9A\u5546\u5BB6'\n : !hasMerchant\n ? '\u8BE5\u6A21\u578B\u6682\u65E0\u5546\u5BB6\u6570\u636E\uFF0C\u8BF7\u5148\u300C\u63A2\u6D4B\u5546\u5BB6\u300D'\n : !canWebAction\n ? '\u9700\u5148\u5728\u300C\u57FA\u7840\u914D\u7F6E\u300D\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C/\u4F1A\u8BDD'\n : '\u628A\u5F53\u524D\u5546\u5BB6\u56FA\u5B9A\u4E3A\u8BE5\u6A21\u578B\u7684\u670D\u52A1\u6E20\u9053\uFF08\u4F18\u5148\u8DEF\u7531\uFF0C\u5F02\u5E38\u65F6\u81EA\u52A8\u5207\u6362\u667A\u80FD\u4F18\u9009\uFF09'\n }\n >\n {isBusy ? '\u5904\u7406\u4E2D...' : '\u56FA\u5B9A\u5546\u5BB6'}\n </button>\n )}\n\n {isChannelDisabled ? (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleRestore}\n disabled={isBusy || !canWebAction || isProbing || isQueued}\n data-tooltip={\n isProbing || isQueued\n ? '\u63A2\u6D4B\u5B8C\u6210\u540E\u518D\u6062\u590D'\n : canWebAction\n ? '\u6062\u590D\u8BE5\u5546\u5BB6\u5BF9\u6B64\u6A21\u578B\u7684\u670D\u52A1'\n : '\u9700\u5148\u5728\u300C\u57FA\u7840\u914D\u7F6E\u300D\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C/\u4F1A\u8BDD'\n }\n >\n {isBusy ? '\u5904\u7406\u4E2D...' : '\u6062\u590D'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleDisable}\n disabled={isBusy || !hasMerchant || !canWebAction || isProbing || isQueued}\n data-tooltip={\n isProbing || isQueued\n ? '\u63A2\u6D4B\u5B8C\u6210\u540E\u518D\u7981\u7528'\n : !hasMerchant\n ? '\u8BE5\u6A21\u578B\u6682\u65E0\u5546\u5BB6\u6570\u636E\uFF0C\u8BF7\u5148\u300C\u63A2\u6D4B\u5546\u5BB6\u300D'\n : !canWebAction\n ? '\u9700\u5148\u5728\u300C\u57FA\u7840\u914D\u7F6E\u300D\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C/\u4F1A\u8BDD'\n : '\u7981\u7528\u5F53\u524D\u5546\u5BB6\u5BF9\u8BE5\u6A21\u578B\u7684\u670D\u52A1\uFF0C\u8DEF\u7531\u5C06\u4E0D\u518D\u547D\u4E2D\u6B64\u6E20\u9053'\n }\n >\n {isBusy ? '\u5904\u7406\u4E2D...' : '\u7981\u7528'}\n </button>\n )}\n\n <button\n type=\"button\"\n className={`dsh-a6-btn dsh-a6-btn-sm ${model.inDsh ? 'dsh-a6-btn-in-dsh' : 'dsh-a6-btn-primary'}`}\n onClick={handleToggleDsh}\n data-tooltip={model.inDsh ? '\u5DF2\u52A0\u5165 DSH \u6A21\u578B\u9009\u62E9\u5668 (\u70B9\u51FB\u79FB\u9664)' : '\u6DFB\u52A0\u81F3 DSH \u6A21\u578B\u9009\u62E9\u5668'}\n >\n {model.inDsh ? '\u79FB\u9664\u6A21\u578B' : '\u6DFB\u52A0\u6A21\u578B'}\n </button>\n\n <button\n type=\"button\"\n className={`dsh-a6-expand-toggle-btn ${expanded ? 'open' : ''}`}\n onClick={() => setExpanded(!expanded)}\n data-tooltip={expanded ? '\u6536\u8D77\u4EF7\u683C\u8BE6\u60C5' : '\u5C55\u5F00\u5B98\u65B9\u57FA\u51C6\u4EF7\u4E0E\u5546\u6237\u5B9E\u65F6\u4EF7\u5BF9\u6BD4\u8868'}\n data-tooltip-pos=\"left\"\n >\n {expanded ? '\u6536\u8D77' : '\u8BE6\u60C5'}\n </button>\n </div>\n </div>\n\n {actionError && (\n <div className=\"dsh-a6-action-error\" role=\"alert\">\n {actionError}\n </div>\n )}\n </div>\n\n {/* 2. Bottom Detailed Price Comparison Table (Only when expanded) */}\n {expanded && (\n <div className=\"dsh-a6-detail-container\">\n <div className=\"dsh-a6-detail-top-row\">\n <div className=\"dsh-a6-dt-left\">\n <span className=\"dsh-a6-dt-label\">\u6E20\u9053\u8BF4\u660E</span>\n <span className=\"dsh-a6-dt-desc\">\n {merchant?.description || '\u9AD8\u5E76\u53D1 \u4E3B\u6253\u4FBF\u5B9C \u7A33\u5B9A'}\n </span>\n </div>\n {merchant?.channel_name && (\n <div className=\"dsh-a6-dt-right\">\n <span className=\"dsh-a6-dt-label\">\u547D\u4E2D\u7EBF\u8DEF</span>\n <span className=\"dsh-a6-dt-channel-name\">\n {merchant.channel_name} (ID: {merchant.channel_id})\n </span>\n </div>\n )}\n </div>\n\n <div className=\"dsh-a6-dt-divider\" />\n\n {/* Clean Price Comparison Table */}\n <div className=\"dsh-a6-dt-table-col\">\n <table className=\"dsh-a6-price-table\">\n <thead>\n <tr>\n <th className=\"dsh-a6-th-blank\"></th>\n <th>\u8F93\u5165\u4EF7 (1M)</th>\n <th>\u8F93\u51FA\u4EF7 (1M)</th>\n <th>\u7F13\u5B58\u8BFB (1M)</th>\n <th>\u7F13\u5B58\u5199 (1M)</th>\n </tr>\n </thead>\n <tbody>\n <tr className=\"dsh-a6-tr-official\">\n <td className=\"dsh-a6-td-label\">\u5B98\u65B9\u4EF7</td>\n <td>{merchant?.official_price?.input_cny || '\u00A526.884'}</td>\n <td>{merchant?.official_price?.output_cny || '\u00A5134.418'}</td>\n <td>{merchant?.official_price?.cache_read_cny || '\u00A52.688'}</td>\n <td>{merchant?.official_price?.cache_write_cny || '\u00A533.605'}</td>\n </tr>\n <tr className=\"dsh-a6-tr-merchant\">\n <td className=\"dsh-a6-td-label\">\u5546\u6237\u4EF7</td>\n <td className=\"dsh-a6-td-bold\">{merchant?.input_price_cny || '\u00A50.1364'}</td>\n <td className=\"dsh-a6-td-bold\">{merchant?.output_price_cny || '\u00A50.6822'}</td>\n <td className=\"dsh-a6-td-bold\">{merchant?.cache_read_price_cny || '\u00A50.0136'}</td>\n <td className=\"dsh-a6-td-bold\">{merchant?.cache_write_price_cny || '\u00A50.1705'}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* 3. \u56FA\u5B9A\u786E\u8BA4\u5F39\u7A97\uFF08\u8F7B\u91CF\uFF0C\u65E0\u5546\u5BB6\u9009\u62E9\u5668/\u515C\u5E95\u5F00\u5173\uFF09 */}\n {pinConfirmOpen && merchant && (\n <div\n className=\"dsh-a6-pin-modal-overlay\"\n onClick={(e) => {\n e.stopPropagation();\n setPinConfirmOpen(false);\n }}\n >\n <div\n className=\"dsh-a6-pin-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"\u56FA\u5B9A\u5546\u5BB6\u786E\u8BA4\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"dsh-a6-pin-modal-title\">\u56FA\u5B9A\u5546\u5BB6</div>\n <div className=\"dsh-a6-pin-modal-body\">\n <div className=\"dsh-a6-pin-modal-row\">\n <span className=\"dsh-a6-pin-modal-label\">\u6A21\u578B</span>\n <span className=\"dsh-a6-pin-modal-value\">{model.model_name}</span>\n </div>\n <div className=\"dsh-a6-pin-modal-row\">\n <span className=\"dsh-a6-pin-modal-label\">\u5546\u5BB6</span>\n <span className=\"dsh-a6-pin-modal-value\">\n {merchant.channel_name} (ID: {merchant.channel_id})\n </span>\n </div>\n <div className=\"dsh-a6-pin-modal-row\">\n <span className=\"dsh-a6-pin-modal-label\">\u5F53\u524D\u4EF7</span>\n <span className=\"dsh-a6-pin-modal-value\">\n \u8F93\u5165 {merchant.input_price_cny} \u00B7 \u8F93\u51FA {merchant.output_price_cny}\n </span>\n </div>\n <p className=\"dsh-a6-pin-modal-note\">\n \u56FA\u5B9A\u540E\u8BE5\u6A21\u578B\u7684\u6D41\u91CF\u4F18\u5148\u8D70\u6B64\u5546\u5BB6\uFF1B\u5546\u5BB6\u5F02\u5E38\u65F6\u81EA\u52A8\u5207\u6362\u667A\u80FD\u4F18\u9009\uFF08\u5E73\u53F0\u9ED8\u8BA4\uFF09\u3002\u56FA\u5B9A\u751F\u6548\u4E8E\u5F53\u524D API Key \u4EE4\u724C\uFF0C\u53EF\u968F\u65F6\u53D6\u6D88\u3002\n </p>\n {actionError && <div className=\"dsh-a6-action-error\">{actionError}</div>}\n </div>\n <div className=\"dsh-a6-pin-modal-foot\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={() => setPinConfirmOpen(false)}\n disabled={isBusy}\n >\n \u53D6\u6D88\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={handleConfirmPin}\n disabled={isBusy}\n >\n {isBusy ? '\u56FA\u5B9A\u4E2D...' : '\u786E\u8BA4\u56FA\u5B9A'}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n", "import React, { useState } from 'react';\nimport { store } from '../store.js';\nimport type { BalanceInfo, A6ApiConfig, ApiRoutingLogItem } from '../../types.js';\n\nexport const AccountPanel: React.FC<{\n balance: BalanceInfo | null;\n config: A6ApiConfig;\n recentLogs?: ApiRoutingLogItem[];\n onNavigateToConfig?: () => void;\n}> = ({ balance, config, recentLogs = [], onNavigateToConfig }) => {\n const [refreshing, setRefreshing] = useState(false);\n\n const handleRefreshBalance = async () => {\n setRefreshing(true);\n await store.refreshBalance();\n setRefreshing(false);\n };\n\n const hasAuth = balance?.hasAccountAuth ?? false;\n const isLow = balance ? balance.isLow : false;\n\n const formatLogTime = (ts: number) => {\n if (!ts) return '\u521A\u521A';\n const d = new Date(ts * 1000);\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}:${d.getSeconds().toString().padStart(2, '0')}`;\n };\n\n return (\n <div className=\"dsh-a6-account-page\">\n {/* 1. Real Balance Banner */}\n <div className={`dsh-a6-balance-banner ${isLow ? 'low-balance' : ''}`}>\n <div className=\"dsh-a6-balance-header\">\n <div className=\"dsh-a6-balance-left\">\n <div className=\"dsh-a6-balance-main-title\">\n <span className=\"dsh-a6-balance-label\">\u8D26\u6237\u771F\u5B9E\u4F59\u989D (\u5B9E\u65F6\u540C\u6B65)</span>\n <div className=\"dsh-a6-balance-num-row\">\n <span className={`dsh-a6-balance-amount ${!hasAuth ? 'unauthed' : ''}`}>\n {hasAuth ? (balance?.accountBalanceFormatted ?? '$0.00') : '\u672A\u8FDE\u63A5'}\n </span>\n {hasAuth && balance?.accountBalanceCnyFormatted && (\n <span className=\"dsh-a6-balance-cny\">{balance.accountBalanceCnyFormatted}</span>\n )}\n <span className={`dsh-a6-status-pill ${hasAuth ? 'success' : 'warn'}`}>\n {hasAuth ? '\u8D26\u6237\u5DF2\u540C\u6B65' : '\u672A\u8FDE\u63A5\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C'}\n </span>\n </div>\n </div>\n\n {isLow && (\n <span className=\"dsh-a6-low-alert\">\n \u4F59\u989D\u8F83\u4F4E (&lt; $0.50)\uFF0C\u5EFA\u8BAE\u53CA\u65F6\u5145\u503C\u4EE5\u4FDD\u969C\u6B63\u5E38\u8C03\u7528\n </span>\n )}\n </div>\n\n <div className=\"dsh-a6-balance-actions\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleRefreshBalance}\n disabled={refreshing}\n data-tooltip=\"\u4ECE A6API \u63A7\u5236\u53F0\u540C\u6B65\u83B7\u53D6\u6700\u65B0\u8D26\u6237\u771F\u5B9E\u53EF\u7528\u4F59\u989D\u4E0E\u6D88\u8017\u7EDF\u8BA1\uFF08\u4E0D\u6D88\u8017 Token\uFF09\"\n data-tooltip-pos=\"down\"\n >\n {refreshing ? '\u5237\u65B0\u4E2D...' : '\u5237\u65B0\u4F59\u989D'}\n </button>\n <a\n href=\"https://a6api.com/console\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n style={{ textDecoration: 'none' }}\n data-tooltip=\"\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00 A6API \u63A7\u5236\u53F0\u8FDB\u884C\u5728\u7EBF\u5145\u503C\u6216\u7BA1\u7406\u51ED\u636E\"\n data-tooltip-pos=\"down-left\"\n >\n \u524D\u5F80\u5145\u503C / \u63A7\u5236\u53F0\n </a>\n </div>\n </div>\n\n {/* 2. Statistical KPI Cards */}\n <div className=\"dsh-a6-stat-cards-grid\">\n <div className=\"dsh-a6-kpi-card\">\n <span className=\"dsh-a6-kpi-label\">\u5173\u8054\u8D26\u6237</span>\n <span className=\"dsh-a6-kpi-val\">\n {hasAuth ? `${balance?.username || '\u5DF2\u8BA4\u8BC1\u7528\u6237'} (#${balance?.userId || '\u2014'})` : '\u672A\u7ED1\u5B9A'}\n </span>\n </div>\n <div className=\"dsh-a6-kpi-card\">\n <span className=\"dsh-a6-kpi-label\">\u5386\u53F2\u603B\u6D88\u8017</span>\n <span className=\"dsh-a6-kpi-val\">\n {hasAuth ? `$${balance?.usedUsd?.toFixed(2) ?? '0.00'}` : '\u2014'}\n </span>\n </div>\n <div className=\"dsh-a6-kpi-card\">\n <span className=\"dsh-a6-kpi-label\">\u7D2F\u8BA1\u8BF7\u6C42\u6B21\u6570</span>\n <span className=\"dsh-a6-kpi-val\">\n {hasAuth ? `${balance?.requestCount ?? 0} \u6B21` : '\u2014'}\n </span>\n </div>\n <div className=\"dsh-a6-kpi-card\">\n <span className=\"dsh-a6-kpi-label\">\u5B9E\u65F6\u6C47\u7387\u53C2\u8003</span>\n <span className=\"dsh-a6-kpi-val\">1 USD \u2248 6.7209 CNY</span>\n </div>\n </div>\n </div>\n\n {/* 3. Auth Warning Banner if Not Connected */}\n {!hasAuth && (\n <div className=\"dsh-a6-auth-banner-box\">\n <div className=\"dsh-a6-auth-banner-content\">\n <div className=\"dsh-a6-auth-banner-title\">\u8FDE\u63A5\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u4EE5\u89E3\u9501\u5B8C\u6574\u8D44\u4EA7\u76D1\u63A7</div>\n <div className=\"dsh-a6-auth-banner-desc\">\n \u586B\u5165\u60A8\u7684 <strong>A6API \u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C</strong> \u540E\uFF0C\u5373\u53EF\u5728\u6B64\u5B9E\u65F6\u67E5\u770B\u8D26\u6237\u771F\u5B9E\u53EF\u7528\u4F59\u989D\u3001\u5386\u53F2\u6D88\u8017\u3001\u7D2F\u8BA1\u8BF7\u6C42\u4EE5\u53CA\u5546\u6237\u8DEF\u7531\u4EF7\u683C\u6307\u6807\u3002\n </div>\n </div>\n {onNavigateToConfig && (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={onNavigateToConfig}\n >\n \u586B\u5199\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\n </button>\n )}\n </div>\n )}\n\n {/* 4. Recent Routing Requests Snapshot */}\n <div className=\"dsh-a6-logs-section\">\n <div className=\"dsh-a6-logs-header\">\n <span className=\"dsh-a6-logs-title\">\u6700\u8FD1\u8DEF\u7531\u8C03\u7528\u660E\u7EC6 (\u5B9E\u65F6\u5FEB\u7167)</span>\n <span className=\"dsh-a6-logs-subtitle\">\u5C55\u793A\u901A\u8FC7\u5F53\u524D A6API \u63A5\u5165\u7684\u8FD1\u671F\u8BF7\u6C42\u4E0E\u5546\u6237\u8DEF\u7531\u8017\u65F6</span>\n </div>\n\n {recentLogs && recentLogs.length > 0 ? (\n <div className=\"dsh-a6-logs-table-wrapper\">\n <table className=\"dsh-a6-logs-table\">\n <thead>\n <tr>\n <th>\u8C03\u7528\u65F6\u95F4</th>\n <th>\u72B6\u6001</th>\n <th>\u5546\u6237id</th>\n <th>\u8BF7\u6C42\u6A21\u578B</th>\n <th>\u8F93\u5165/\u8F93\u51FA</th>\n <th>\u82B1\u8D39</th>\n <th>\u8017\u65F6</th>\n </tr>\n </thead>\n <tbody>\n {recentLogs.map((log, idx) => {\n const isErr =\n log.status === 'error' ||\n (log.status as string) === 'failed' ||\n (log.raw && (\n log.raw.type !== 2 ||\n (log.raw.other && (\n log.raw.other.includes('\"request_final_status\":\"failed\"') ||\n log.raw.other.includes('\"request_final_status\":\"error\"') ||\n log.raw.other.includes('\"request_final_status\":\"upstream_error\"')\n )) ||\n Boolean(log.raw.content && log.raw.content.startsWith('status_code='))\n ));\n\n const channelNum = Number(log.channel || log.raw?.channel || 0);\n\n return (\n <tr key={log.id || idx}>\n <td className=\"dsh-a6-log-time\">{formatLogTime(log.created_at)}</td>\n <td>\n <span className={`dsh-a6-log-status ${isErr ? 'err' : 'ok'}`}>\n {isErr ? '\u5931\u8D25' : '\u6210\u529F'}\n </span>\n </td>\n <td className=\"dsh-a6-log-channel\">\n {channelNum > 0 ? (\n <span className=\"dsh-a6-log-channel-badge\">\n #{channelNum}\n </span>\n ) : (\n <span className=\"dsh-a6-log-channel-empty\">\n \u65E0\n </span>\n )}\n </td>\n <td className=\"dsh-a6-log-model\">\n <code>{log.model_name}</code>\n </td>\n <td className=\"dsh-a6-log-tokens\">\n {log.prompt_tokens || 0} / {log.completion_tokens || 0}\n </td>\n <td className=\"dsh-a6-log-cost\">\n {log.cost_formatted || '$0.00'}\n </td>\n <td className=\"dsh-a6-log-time-use\">\n {log.use_time ? `${log.use_time}s` : '\u2014'}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"dsh-a6-empty-logs\">\n <span>\u6682\u65E0\u8FD1\u671F\u8C03\u7528\u8BB0\u5F55\u3002\u5728 DSH \u4E2D\u53D1\u8D77\u6A21\u578B\u5BF9\u8BDD\u6216\u70B9\u51FB\u300C\u63A2\u6D4B\u5546\u5BB6\u300D\u540E\uFF0C\u8C03\u7528\u660E\u7EC6\u5C06\u5728\u6B64\u5B9E\u65F6\u5C55\u793A\u3002</span>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport { AccountPanel as BalanceCard };\n", "import React, { useState, useEffect } from 'react';\nimport { store } from '../store.js';\nimport type { A6ApiConfig } from '../../types.js';\n\n/** \u4E0E\u670D\u52A1\u7AEF maskConfig \u4E00\u81F4\u7684\u8131\u654F\u5360\u4F4D\u7B26\uFF1A\u4EE3\u8868\u300C\u5DF2\u914D\u7F6E\uFF0C\u4F46\u5BC6\u94A5\u53EA\u5B58\u4E8E\u672C\u673A\u300D */\nconst MASK = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022';\n\nexport const ConfigPanel: React.FC<{\n config: A6ApiConfig;\n dshConfiguredModels: string[];\n}> = ({ config, dshConfiguredModels }) => {\n const [apiKey, setApiKey] = useState(config.apiKey || '');\n const [accessToken, setAccessToken] = useState(config.accessToken || '');\n const [clearKey, setClearKey] = useState(false);\n const [clearToken, setClearToken] = useState(false);\n const [selectedNode, setSelectedNode] = useState(\n config.baseURL || 'https://api.a6api.com',\n );\n // \u81EA\u5B9A\u4E49\u8282\u70B9\u8F93\u5165\u6846\uFF1AbaseURL \u975E\u5B98\u65B9\u8282\u70B9\u65F6\u4EE5\u5176\u4E3A\u521D\u503C\uFF08customBaseURL \u6B7B\u5B57\u6BB5\u5DF2\u79FB\u9664\uFF09\n const [customNode, setCustomNode] = useState(\n config.baseURL && config.baseURL !== 'https://api.a6api.com' && config.baseURL !== 'https://a6.a6api.com'\n ? config.baseURL\n : '',\n );\n const [isCustom, setIsCustom] = useState(\n config.baseURL !== 'https://api.a6api.com' && config.baseURL !== 'https://a6.a6api.com',\n );\n const [showKey, setShowKey] = useState(false);\n const [showToken, setShowToken] = useState(false);\n const [showHelp, setShowHelp] = useState(false);\n\n const [saving, setSaving] = useState(false);\n const [saveSuccess, setSaveSuccess] = useState(false);\n\n // \u503C\u4E3A\u5360\u4F4D\u7B26\u5373\u8868\u793A\u300C\u5DF2\u4FDD\u5B58\u5BC6\u94A5\u300D\uFF0C\u6B64\u65F6\u8F93\u5165\u6846\u7559\u7A7A\u5C55\u793A\uFF0C\u4FDD\u5B58\u65F6\u4E0D\u56DE\u4F20\u5360\u4F4D\u7B26\n const apiKeySet = apiKey === MASK;\n const tokenSet = accessToken === MASK;\n\n useEffect(() => {\n setApiKey(config.apiKey || '');\n setAccessToken(config.accessToken || '');\n setClearKey(false);\n setClearToken(false);\n setSelectedNode(config.baseURL || 'https://api.a6api.com');\n setCustomNode(\n config.baseURL && config.baseURL !== 'https://api.a6api.com' && config.baseURL !== 'https://a6.a6api.com'\n ? config.baseURL\n : '',\n );\n setIsCustom(\n config.baseURL !== 'https://api.a6api.com' && config.baseURL !== 'https://a6.a6api.com',\n );\n }, [config]);\n\n const handleSave = async () => {\n setSaving(true);\n const finalBaseUrl = isCustom ? customNode.trim() || 'https://api.a6api.com' : selectedNode;\n // \u672A\u4FEE\u6539\uFF08\u5360\u4F4D\u7B26\u6001\uFF09\u2192 \u4E0D\u53D1\u9001\u8BE5\u5B57\u6BB5\uFF0C\u670D\u52A1\u7AEF\u4FDD\u7559\u539F\u503C\uFF1B\u70B9\u51FB\u300C\u6E05\u9664\u300D\u2192 \u53D1\u9001\u7A7A\u4E32\u5220\u9664\n const newApiKey = apiKeySet ? (clearKey ? '' : undefined) : apiKey.trim();\n const newToken = tokenSet ? (clearToken ? '' : undefined) : accessToken.trim();\n const ok = await store.saveConfig({\n ...(newApiKey !== undefined ? { apiKey: newApiKey } : {}),\n ...(newToken !== undefined ? { accessToken: newToken } : {}),\n baseURL: finalBaseUrl,\n });\n setSaving(false);\n if (ok) {\n setSaveSuccess(true);\n setTimeout(() => setSaveSuccess(false), 3500);\n }\n };\n\n return (\n <div className=\"dsh-a6-config-page\">\n {/* 1. API Gateway Node Selection */}\n <div className=\"dsh-a6-config-section\">\n <div className=\"dsh-a6-section-heading\">\n <span className=\"dsh-a6-heading-title\">API \u63A5\u5165\u8282\u70B9 (Base URL)</span>\n <span className=\"dsh-a6-heading-desc\">\n \u9009\u62E9\u79BB\u60A8\u6700\u8FD1\u7684 A6API \u805A\u5408\u7F51\u5173\u63A5\u5165\u70B9\uFF0C\u652F\u6301 CDN \u8282\u70B9\u4E0E\u76F4\u8FDE\u5907\u7528\u8282\u70B9\u3002\n </span>\n </div>\n\n <div className=\"dsh-a6-node-picker\">\n <button\n type=\"button\"\n className={`dsh-a6-node-pill ${!isCustom && selectedNode === 'https://api.a6api.com' ? 'active' : ''}`}\n onClick={() => {\n setIsCustom(false);\n setSelectedNode('https://api.a6api.com');\n }}\n >\n https://api.a6api.com (CDN \u63A8\u8350)\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-node-pill ${!isCustom && selectedNode === 'https://a6.a6api.com' ? 'active' : ''}`}\n onClick={() => {\n setIsCustom(false);\n setSelectedNode('https://a6.a6api.com');\n }}\n >\n https://a6.a6api.com (\u76F4\u8FDE\u5907\u7528)\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-node-pill ${isCustom ? 'active' : ''}`}\n onClick={() => setIsCustom(true)}\n >\n \u81EA\u5B9A\u4E49\u8282\u70B9\n </button>\n </div>\n\n {isCustom && (\n <input\n type=\"text\"\n className=\"dsh-a6-input\"\n placeholder=\"https://your-custom-gateway.com\"\n value={customNode}\n onChange={(e) => setCustomNode(e.target.value)}\n style={{ marginTop: '8px' }}\n />\n )}\n </div>\n\n {/* 2. Authentication Tokens */}\n <div className=\"dsh-a6-config-section\">\n <div className=\"dsh-a6-section-heading\">\n <span className=\"dsh-a6-heading-title\">\u8BBF\u95EE\u9274\u6743\u4E0E\u4EE4\u724C\u51ED\u636E</span>\n <span className=\"dsh-a6-heading-desc\">\n \u914D\u7F6E\u6A21\u578B\u8C03\u7528 API Key \u4EE5\u53CA\u7528\u4E8E\u540C\u6B65\u8D26\u6237\u4F59\u989D\u4E0E\u5546\u6237\u884C\u60C5\u7684\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u3002\n </span>\n </div>\n\n <div className=\"dsh-a6-config-fields-grid\">\n {/* API Key */}\n <div className=\"dsh-a6-field\">\n <div className=\"dsh-a6-field-header\">\n <label className=\"dsh-a6-label\">A6API \u4EE4\u724C (API Key)</label>\n <div className=\"dsh-a6-field-header-actions\">\n {apiKeySet && (\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => {\n setClearKey(true);\n setApiKey('');\n }}\n >\n \u6E05\u9664\n </button>\n )}\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => setShowKey(!showKey)}\n >\n {showKey ? '\u9690\u85CF' : '\u663E\u793A'}\n </button>\n </div>\n </div>\n <div className=\"dsh-a6-input-wrapper\">\n <input\n type={showKey ? 'text' : 'password'}\n className=\"dsh-a6-input\"\n placeholder={apiKeySet ? '\u5DF2\u4FDD\u5B58 \u00B7 \u8F93\u5165\u65B0 Key \u53EF\u66FF\u6362' : 'sk-xxxxxxxxxxxxxxxxxxxxxxxx'}\n value={apiKeySet ? '' : apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n />\n </div>\n <span className=\"dsh-a6-field-hint\">\n {apiKeySet\n ? '\u5DF2\u914D\u7F6E API Key\uFF08\u4EC5\u4FDD\u5B58\u5728\u672C\u673A ~/.dsh/.credentials.yaml\uFF0C\u4E0D\u56DE\u4F20\u754C\u9762\uFF09\u3002'\n : '\u7528\u4E8E\u5411 A6API \u53D1\u8D77\u6A21\u578B\u5BF9\u8BDD\u8BF7\u6C42\u4E0E\u62C9\u53D6\u767D\u540D\u5355\u6A21\u578B\u3002'}\n </span>\n </div>\n\n {/* System Access Token */}\n <div className=\"dsh-a6-field\">\n <div className=\"dsh-a6-field-header\">\n <label className=\"dsh-a6-label\">\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C (Access Token)</label>\n <div className=\"dsh-a6-field-header-actions\">\n {tokenSet && (\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => {\n setClearToken(true);\n setAccessToken('');\n }}\n >\n \u6E05\u9664\n </button>\n )}\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => setShowToken(!showToken)}\n >\n {showToken ? '\u9690\u85CF' : '\u663E\u793A'}\n </button>\n </div>\n </div>\n <div className=\"dsh-a6-input-wrapper\">\n <input\n type={showToken ? 'text' : 'password'}\n className=\"dsh-a6-input\"\n placeholder={\n tokenSet\n ? '\u5DF2\u4FDD\u5B58 \u00B7 \u8F93\u5165\u65B0\u4EE4\u724C\u53EF\u66FF\u6362'\n : '\u5728\u63A7\u5236\u53F0\u5B89\u5168\u8BBE\u7F6E\u4E2D\u590D\u5236\uFF0C\u4F8B\u5982 eyJhbGciOi...'\n }\n value={tokenSet ? '' : accessToken}\n onChange={(e) => setAccessToken(e.target.value)}\n />\n </div>\n <div className=\"dsh-a6-field-footer\">\n <span className=\"dsh-a6-field-hint\">\n {tokenSet\n ? '\u5DF2\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\uFF08\u4EC5\u4FDD\u5B58\u5728\u672C\u673A\uFF0C\u4E0D\u56DE\u4F20\u754C\u9762\uFF09\u3002'\n : '\u7528\u4E8E\u514D\u5931\u6548\u540C\u6B65\u8D26\u6237\u771F\u5B9E\u4F59\u989D\u4E0E\u5546\u6237\u6307\u6807\u3002'}\n </span>\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => setShowHelp(!showHelp)}\n style={{ fontSize: '11px', whiteSpace: 'nowrap' }}\n >\n {showHelp ? '\u6536\u8D77\u6559\u7A0B' : '\u83B7\u53D6\u6559\u7A0B'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Tutorial Drawer */}\n {showHelp && (\n <div className=\"dsh-a6-help-drawer\">\n <div className=\"dsh-a6-help-title\">\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u83B7\u53D6\u6B65\u9AA4\uFF08\u6C38\u4E45\u6709\u6548\uFF09\uFF1A</div>\n <ol className=\"dsh-a6-help-list\">\n <li>\n \u5728\u6D4F\u89C8\u5668\u6253\u5F00\u5E76\u767B\u5F55{' '}\n <a href=\"https://a6api.com/console/personal\" target=\"_blank\" rel=\"noreferrer\">\n a6api.com/console/personal\n </a>{' '}\n \uFF08\u4E2A\u4EBA\u8BBE\u7F6E - \u5B89\u5168\u8BBE\u7F6E\uFF09\n </li>\n <li>\u5728\u300C\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u300D\u680F\u76EE\u76F4\u63A5\u70B9\u51FB\u590D\u5236\u4EE4\u724C\u5B57\u7B26\u4E32\uFF08\u4F8B\u5982 <code>eyJhbGciOi...</code>\uFF09</li>\n <li>\u7C98\u8D34\u5230\u4E0A\u65B9\u7684\u300C\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u300D\u8F93\u5165\u6846\u4E2D\u5E76\u70B9\u51FB\u4E0B\u65B9\u300C\u4FDD\u5B58\u914D\u7F6E\u300D\u5373\u53EF\u81EA\u52A8\u540C\u6B65\u4F59\u989D\uFF01</li>\n </ol>\n </div>\n )}\n </div>\n\n {/* 3. DSH LLM Provider Integration Overview */}\n <div className=\"dsh-a6-config-section\">\n <div className=\"dsh-a6-section-heading\">\n <span className=\"dsh-a6-heading-title\">DSH \u539F\u751F LLM \u63D0\u4F9B\u5546\u96C6\u6210\u72B6\u6001</span>\n <span className=\"dsh-a6-heading-desc\">\n \u63D2\u4EF6\u5DF2\u5C06 A6API \u6CE8\u518C\u4E3A DSH \u539F\u751F\u6A21\u578B\u63D0\u4F9B\u5546 (<code>a6api</code>)\u3002\u5728\u300C\u53EF\u7528\u6A21\u578B\u300D\u4E2D\u542F\u7528\u7684\u6A21\u578B\u5C06\u81EA\u52A8\u5199\u5165 DSH \u914D\u7F6E\u6587\u4EF6\u3002\n </span>\n </div>\n\n <div className=\"dsh-a6-integration-card\">\n <div className=\"dsh-a6-int-row\">\n <span className=\"dsh-a6-int-key\">\u63D0\u4F9B\u5546\u6807\u8BC6</span>\n <span className=\"dsh-a6-int-val\"><code>a6api</code> (OpenAI-compatible)</span>\n </div>\n <div className=\"dsh-a6-int-row\">\n <span className=\"dsh-a6-int-key\">\u5F53\u524D\u5DF2\u542F\u7528\u6A21\u578B</span>\n <div className=\"dsh-a6-int-tags\">\n {dshConfiguredModels.length > 0 ? (\n dshConfiguredModels.map((m) => (\n <span key={m} className=\"dsh-a6-model-chip\">\n {m}\n </span>\n ))\n ) : (\n <span className=\"dsh-a6-empty-hint\">\u6682\u672A\u542F\u7528\u4EFB\u4F55\u6A21\u578B\uFF0C\u8BF7\u524D\u5F80\u300C\u53EF\u7528\u6A21\u578B\u300D\u9875\u9762\u70B9\u51FB\u300C\u6DFB\u52A0\u5230 DSH\u300D</span>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* 4. Save Action Bar */}\n <div className=\"dsh-a6-save-bar\">\n <div className=\"dsh-a6-save-status\">\n {saveSuccess && (\n <span className=\"dsh-a6-success-msg\">\n \u914D\u7F6E\u5DF2\u6210\u529F\u4FDD\u5B58\u5E76\u540C\u6B65\n </span>\n )}\n </div>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary\"\n onClick={handleSave}\n disabled={saving}\n style={{ minWidth: '100px' }}\n >\n {saving ? '\u6B63\u5728\u4FDD\u5B58...' : '\u4FDD\u5B58\u914D\u7F6E'}\n </button>\n </div>\n </div>\n );\n};\n", "import React from 'react';\nimport type { PriceFluctuationState } from '../../types.js';\n\n/**\n * \u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\uFF08\u8BBE\u7F6E\u9875\u5934\u90E8\u4E0E\u4FA7\u8FB9\u680F\u6D6E\u5C42\u5171\u7528\uFF09\uFF1A\n * \u672A\u914D\u7F6E\u4EE4\u724C\u663E\u793A `--`\uFF08\u7981\u7528\uFF09\uFF0C\u65E0\u53D8\u52A8\u7F6E\u7070\uFF08\u7981\u7528\uFF09\uFF0C\u6709\u5F85\u5904\u7406\u65F6\u70B9\u51FB\u8DF3\u5B98\u7F51\u5904\u7406\u3002\n * compact \u4E3A\u6D6E\u5C42\u5185\u7684\u7D27\u51D1\u7F29\u7A84\u7248\u3002\n */\nexport const PricePill: React.FC<{\n pf: PriceFluctuationState;\n hasToken: boolean;\n compact?: boolean;\n}> = ({ pf, hasToken, compact }) => {\n const n = Number(pf?.pendingCount ?? 0);\n const hasAuth = pf?.hasAuth !== false && !pf?.authError && Boolean(hasToken);\n const isAuthError = Boolean(pf?.authError);\n const isZero = n === 0;\n const isDisabled = !hasAuth || isZero;\n const compactCls = compact ? ' compact' : '';\n const cls = isDisabled\n ? !hasAuth\n ? `dsh-a6-price-pill disabled${compactCls}`\n : `dsh-a6-price-pill is-zero is-disabled-zero${compactCls}`\n : `dsh-a6-price-pill has-change${compactCls}`;\n const title = !hasAuth\n ? isAuthError\n ? '\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u5DF2\u5931\u6548\uFF0C\u8BF7\u524D\u5F80\u57FA\u7840\u914D\u7F6E\u66F4\u65B0'\n : '\u672A\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\uFF0C\u65E0\u6CD5\u83B7\u53D6\u4EF7\u683C\u53D8\u52A8'\n : isZero\n ? '\u6682\u65E0\u4EF7\u683C\u53D8\u52A8'\n : `\u6709 ${n} \u6761\u4EF7\u683C\u53D8\u52A8\u5F85\u5904\u7406\uFF0C\u70B9\u51FB\u524D\u5F80\u5B98\u7F51\u5904\u7406`;\n const onClick = () => {\n if (isDisabled) return;\n window.open('https://a6api.com/console/token', '_blank', 'noopener');\n };\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (isDisabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n };\n return (\n <div\n className={cls}\n onClick={isDisabled ? undefined : onClick}\n onKeyDown={onKeyDown}\n tabIndex={isDisabled ? -1 : 0}\n title={title}\n role=\"button\"\n aria-disabled={isDisabled}\n style={isDisabled ? { cursor: 'not-allowed' } : undefined}\n >\n <span className=\"dsh-a6-price-pill-label\">\u4EF7\u683C\u6CE2\u52A8\uFF1A</span>\n <span className=\"dsh-a6-price-pill-count\">{!hasAuth ? '--' : n}</span>\n </div>\n );\n};\n", "import React from 'react';\n\nconst MARKET_URL = 'https://a6api.com/models';\n\n/**\n * \u300C\u6A21\u578B\u5E02\u573A\u300D\u80F6\u56CA(\u4EC5\u4FA7\u8FB9\u680F\u6D6E\u5C42):\u4E0E\u8D26\u6237\u4F59\u989D / \u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\u540C\u6B3E\u5916\u89C2,\n * \u70B9\u51FB\u76F4\u8FBE A6api \u5B98\u7F51\u6A21\u578B\u5E02\u573A\u3002\n */\nexport const MarketPill: React.FC = () => {\n const onClick = () => {\n window.open(MARKET_URL, '_blank', 'noopener');\n };\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n };\n return (\n <div\n className=\"dsh-a6-market-pill\"\n onClick={onClick}\n onKeyDown={onKeyDown}\n tabIndex={0}\n role=\"button\"\n title=\"\u524D\u5F80 A6api \u6A21\u578B\u5E02\u573A\"\n >\n <span className=\"dsh-a6-market-pill-label\">\u6A21\u578B\u5E02\u573A</span>\n </div>\n );\n};\n", "import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { store } from '../store.js';\nimport { validateReasoningEfforts } from '../../types.js';\nimport type { CatalogModelEntry } from '../../types.js';\n\n/**\n * \u6A21\u578B\u76EE\u5F55\u9875\uFF08\u300C\u53EF\u7528\u6A21\u578B\u300D\u53F3\u4FA7 tab\uFF09\uFF1A\n * - \u300C\u4ECE A6API \u83B7\u53D6\u5E02\u573A\u6A21\u578B\u300D\uFF1A\u7FFB\u9875\u62C9\u53D6 A6API \u5E02\u573A\u5168\u90E8\u6A21\u578B ID \u5165\u76EE\u5F55\uFF08\u53C2\u6570\u521D\u59CB\u4E3A\u7A7A\uFF09\n * - \u300C\u4ECE OpenRouter \u4E00\u952E\u67E5\u8BE2\u300D\uFF1A\u5BF9\u5168\u90E8\u6A21\u578B\u67E5 OpenRouter \u5E76\u586B\u5145\u53C2\u6570\uFF08name \u4EC5\u7528\u6237\u624B\u52A8\u586B\u5199\uFF09\uFF1B\n * \u6BCF\u884C\u4E5F\u53EF\u5355\u72EC\u67E5\u8BE2\n * - \u7B5B\u9009\uFF1A\u53EF\u7528\u6A21\u578B\uFF08\u5F53\u524D\u4EE4\u724C\u767D\u540D\u5355\uFF0C\u4E0E\u300C\u53EF\u7528\u6A21\u578B\u300D\u9875\u540C\u6E90\uFF09/ \u53C2\u6570\u72B6\u6001\uFF08\u5DF2\u586B/\u672A\u586B\uFF09\n * - \u884C\u5185\u7F16\u8F91 settings.yaml \u539F\u751F\u6A21\u578B\u5B57\u6BB5\uFF1B\u4FDD\u5B58\u540E\u82E5\u8BE5\u6A21\u578B\u5DF2\u5728 DSH \u542F\u7528\uFF0C\n * \u670D\u52A1\u7AEF\u7ACB\u5373\u91CD\u5199 settings.yaml \u5BF9\u5E94\u6761\u76EE\uFF08\u53C2\u6570\u5373\u65F6\u751F\u6548\uFF09\n */\nexport const ModelCatalogPanel: React.FC = () => {\n const [catalog, setCatalog] = useState<CatalogModelEntry[]>(store.getState().catalog);\n const [models, setModels] = useState(store.getState().models);\n const [busy, setBusy] = useState<null | 'fetch' | 'query'>(store.getState().catalogBusy);\n const [search, setSearch] = useState('');\n const [availFilter, setAvailFilter] = useState<'all' | 'available' | 'unavailable'>('all');\n const [paramFilter, setParamFilter] = useState<'all' | 'filled' | 'empty'>('all');\n const [editingId, setEditingId] = useState<string | null>(null);\n const [queryingId, setQueryingId] = useState<string | null>(null);\n const [confirmClear, setConfirmClear] = useState(false);\n const confirmClearTimer = useRef<any>(null);\n const [msg, setMsg] = useState<{ kind: 'ok' | 'err'; text: string } | null>(null);\n const [draft, setDraft] = useState<{\n name: string;\n contextWindow: string;\n maxTokens: string;\n inputText: boolean;\n inputImage: boolean;\n reasoningText: string;\n reasoningFalse: boolean;\n }>({ name: '', contextWindow: '', maxTokens: '', inputText: false, inputImage: false, reasoningText: '', reasoningFalse: false });\n\n useEffect(() => {\n const unsub = store.subscribe(() => {\n const s = store.getState();\n setCatalog(s.catalog);\n setModels(s.models);\n setBusy(s.catalogBusy);\n });\n store.fetchCatalog();\n return unsub;\n }, []);\n\n // \u5F53\u524D\u4EE4\u724C\u767D\u540D\u5355\uFF08\u4E0E\u300C\u53EF\u7528\u6A21\u578B\u300D\u9875\u540C\u6E90\uFF09\uFF1B\u76EE\u5F55\u300C\u53EF\u7528\u300D\u7B5B\u9009\u57FA\u4E8E\u5B83\n const availableSet = useMemo(\n () => new Set(models.map((m) => m.model_name.toLowerCase())),\n [models],\n );\n\n const flash = (kind: 'ok' | 'err', text: string) => {\n setMsg({ kind, text });\n setTimeout(() => setMsg(null), 5000);\n };\n\n const handleFetchMarket = async () => {\n const r = await store.fetchMarketModels();\n if (r.ok) {\n if (r.failedPages && r.failedPages > 0) {\n flash('err', `\u5DF2\u83B7\u53D6 ${r.total} \u4E2A\u6A21\u578B\uFF08\u65B0\u589E ${r.added} \u4E2A\uFF09\uFF0C\u4F46\u6709 ${r.failedPages} \u9875\u62C9\u53D6\u5931\u8D25\uFF0C\u76EE\u5F55\u53EF\u80FD\u4E0D\u5B8C\u6574\uFF0C\u8BF7\u91CD\u8BD5`);\n } else {\n flash('ok', `\u5DF2\u83B7\u53D6 ${r.total} \u4E2A\u6A21\u578B\uFF08\u65B0\u589E ${r.added} \u4E2A\uFF09`);\n }\n } else flash('err', r.error || '\u83B7\u53D6\u5931\u8D25');\n };\n\n const handleQueryAll = async () => {\n const r = await store.queryOpenRouter();\n if (r.ok) {\n const nf = r.notFound?.length || 0;\n flash('ok', `\u5DF2\u66F4\u65B0 ${r.updated} \u4E2A\u6A21\u578B\u53C2\u6570${nf > 0 ? `\uFF0C${nf} \u4E2A\u672A\u5728 OpenRouter \u67E5\u5230\uFF08\u53C2\u6570\u7559\u7A7A\u53EF\u624B\u52A8\u586B\u5199\uFF09` : ''}`);\n } else flash('err', r.error || '\u67E5\u8BE2\u5931\u8D25');\n };\n\n const handleQueryOne = async (id: string) => {\n setQueryingId(id);\n const r = await store.queryOpenRouter([id]);\n setQueryingId(null);\n if (r.ok) {\n if ((r.updated || 0) > 0) flash('ok', `\u300C${id}\u300D\u5DF2\u4ECE OpenRouter \u586B\u5145\u53C2\u6570`);\n else flash('ok', `\u300C${id}\u300D\u5728 OpenRouter \u672A\u67E5\u5230\uFF0C\u53EF\u624B\u52A8\u586B\u5199\u53C2\u6570`);\n } else flash('err', r.error || '\u67E5\u8BE2\u5931\u8D25');\n };\n\n /** \u6E05\u7A7A\u76EE\u5F55\uFF1A\u9996\u6B21\u70B9\u51FB\u8FDB\u5165\u786E\u8BA4\u6001\uFF083s \u81EA\u52A8\u6062\u590D\uFF09\uFF0C\u518D\u6B21\u70B9\u51FB\u6267\u884C */\n const handleClear = async () => {\n if (!confirmClear) {\n setConfirmClear(true);\n if (confirmClearTimer.current) clearTimeout(confirmClearTimer.current);\n confirmClearTimer.current = setTimeout(() => setConfirmClear(false), 3000);\n return;\n }\n if (confirmClearTimer.current) clearTimeout(confirmClearTimer.current);\n setConfirmClear(false);\n setEditingId(null);\n const r = await store.clearCatalog();\n if (r.ok) flash('ok', '\u6A21\u578B\u76EE\u5F55\u5DF2\u6E05\u7A7A\uFF0C\u53EF\u91CD\u65B0\u300C\u4ECE A6API \u83B7\u53D6\u5E02\u573A\u6A21\u578B\u300D');\n else flash('err', r.error || '\u6E05\u7A7A\u5931\u8D25');\n };\n\n const startEdit = (entry: CatalogModelEntry) => {\n const re = entry.reasoningEfforts && typeof entry.reasoningEfforts === 'object' ? entry.reasoningEfforts : {};\n setDraft({\n name: entry.name || '',\n contextWindow: entry.contextWindow != null ? String(entry.contextWindow) : '',\n maxTokens: entry.maxTokens != null ? String(entry.maxTokens) : '',\n inputText: entry.input ? entry.input.includes('text') : false,\n inputImage: entry.input ? entry.input.includes('image') : false,\n // \u4FDD\u7559 off \u7B49 null \u503C\u9879\uFF08\u663E\u793A\u4E3A \"off: \"\uFF09\uFF0C\u907F\u514D\u7F16\u8F91\u4FDD\u5B58\u540E\u6863\u4F4D\u9759\u9ED8\u4E22\u5931\n reasoningText: Object.entries(re)\n .map(([k, v]) => `${k}: ${v === null ? '' : v}`)\n .join(', '),\n reasoningFalse: entry.reasoningEfforts === false,\n });\n setEditingId(entry.id);\n };\n\n const handleSave = async (id: string) => {\n const patch: Partial<CatalogModelEntry> = {};\n const name = draft.name.trim();\n // name \u4EC5\u7528\u6237\u624B\u52A8\u586B\u5199\uFF1A\u7A7A\u4E32 = \u6E05\u7A7A\uFF08\u53D1\u9001 null \u5220\u9664\u5DF2\u6709 name\uFF09\n patch.name = name || (null as any);\n const ctx = Number(draft.contextWindow);\n if (draft.contextWindow.trim() !== '') {\n if (!Number.isInteger(ctx) || ctx < 1) {\n flash('err', 'contextWindow \u5FC5\u987B\u662F\u6B63\u6574\u6570');\n return;\n }\n patch.contextWindow = ctx;\n } else {\n patch.contextWindow = null as any; // \u6E05\u7A7A = \u5220\u9664\u5B57\u6BB5\n }\n const maxT = Number(draft.maxTokens);\n if (draft.maxTokens.trim() !== '') {\n if (!Number.isInteger(maxT) || maxT < 1) {\n flash('err', 'maxTokens \u5FC5\u987B\u662F\u6B63\u6574\u6570');\n return;\n }\n patch.maxTokens = maxT;\n } else {\n patch.maxTokens = null as any;\n }\n const mods: ('text' | 'image')[] = [];\n if (draft.inputText) mods.push('text');\n if (draft.inputImage) mods.push('image');\n patch.input = mods.length > 0 ? mods : null as any;\n\n if (draft.reasoningFalse) {\n patch.reasoningEfforts = false;\n } else {\n const text = draft.reasoningText.trim();\n if (text) {\n const parsed: Record<string, string | null> = {};\n let bad = false;\n for (const seg of text.split(',')) {\n const idx = seg.indexOf(':');\n if (idx < 0) {\n bad = true;\n break;\n }\n const k = seg.slice(0, idx).trim();\n const v = seg.slice(idx + 1).trim();\n if (!k) {\n bad = true;\n break;\n }\n parsed[k] = v || null;\n }\n if (bad) {\n flash('err', 'reasoningEfforts \u683C\u5F0F\u5E94\u4E3A \"low: low, medium: medium\"');\n return;\n }\n // DSH \u8BED\u4E49\u9884\u68C0\uFF08\u4E0E\u670D\u52A1\u7AEF\u4E00\u81F4\uFF09\uFF1A\u952E \u2208 \u6863\u4F4D\u3001\u503C\u975E\u7A7A\uFF08\u4EC5 off \u53EF null\uFF09\u3001\u81F3\u5C11\u4E00\u4E2A\u975E off \u6863\u4F4D\n const checked = validateReasoningEfforts(parsed);\n if (!checked.ok) {\n flash('err', checked.error);\n return;\n }\n patch.reasoningEfforts = checked.value;\n } else {\n patch.reasoningEfforts = null as any; // \u5220\u9664\n }\n }\n\n const r = await store.updateCatalogEntry(id, patch);\n if (r.ok) {\n setEditingId(null);\n flash('ok', `\u300C${id}\u300D\u5DF2\u4FDD\u5B58${store.getState().dshConfiguredModels.some((m) => m.toLowerCase() === id.toLowerCase()) ? '\uFF0C\u5E76\u5DF2\u540C\u6B65\u5230 DSH \u914D\u7F6E' : ''}`);\n } else {\n flash('err', r.error || '\u4FDD\u5B58\u5931\u8D25');\n }\n };\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n return catalog\n .filter((e) => {\n if (q && !e.id.toLowerCase().includes(q) && !(e.name || '').toLowerCase().includes(q)) return false;\n const isAvail = availableSet.has(e.id.toLowerCase());\n if (availFilter === 'available' && !isAvail) return false;\n if (availFilter === 'unavailable' && isAvail) return false;\n const filled = e.contextWindow != null || e.maxTokens != null || (e.input && e.input.length > 0);\n if (paramFilter === 'filled' && !filled) return false;\n if (paramFilter === 'empty' && filled) return false;\n return true;\n })\n .sort((a, b) => a.id.localeCompare(b.id));\n }, [catalog, search, availFilter, paramFilter, availableSet]);\n\n const filledCount = catalog.filter((e) => e.contextWindow != null || e.maxTokens != null || (e.input && e.input.length > 0)).length;\n const availCount = catalog.filter((e) => availableSet.has(e.id.toLowerCase())).length;\n\n return (\n <div className=\"dsh-a6-catalog-page\">\n {/* \u5934\u90E8\u5DE5\u5177\u680F */}\n <div className=\"dsh-a6-section-header\">\n <div className=\"dsh-a6-catalog-toolbar\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={handleFetchMarket}\n disabled={busy !== null}\n data-tooltip=\"\u4ECE A6API \u5E02\u573A\u7FFB\u9875\u62C9\u53D6\u5168\u90E8\u652F\u6301\u6A21\u578B\u7684 ID\uFF08\u542B\u54C1\u724C\uFF09\uFF0C\u53C2\u6570\u521D\u59CB\u4E3A\u7A7A\uFF0C\u968F\u540E\u53EF\u7528 OpenRouter \u67E5\u8BE2\u586B\u5145\"\n data-tooltip-pos=\"down\"\n >\n {busy === 'fetch' ? '\u83B7\u53D6\u4E2D...' : '\u4ECE A6API \u83B7\u53D6\u5E02\u573A\u6A21\u578B'}\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleQueryAll}\n disabled={busy !== null || catalog.length === 0}\n data-tooltip=\"\u5BF9\u76EE\u5F55\u4E2D\u5168\u90E8\u6A21\u578B\u67E5\u8BE2 OpenRouter \u5E76\u586B\u5145 contextWindow / maxTokens / input\uFF1B\u67E5\u4E0D\u5230\u7684\u4FDD\u6301\u7559\u7A7A\u53EF\u624B\u52A8\u586B\u5199\"\n data-tooltip-pos=\"down\"\n >\n {busy === 'query' ? '\u67E5\u8BE2\u4E2D...' : '\u4ECE OpenRouter \u4E00\u952E\u67E5\u8BE2'}\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-btn dsh-a6-btn-danger dsh-a6-btn-sm${confirmClear ? ' dsh-a6-btn-clear-confirm' : ''}`}\n onClick={handleClear}\n disabled={busy !== null || catalog.length === 0}\n data-tooltip=\"\u6E05\u7A7A\u6A21\u578B\u76EE\u5F55\u5168\u90E8\u6761\u76EE\uFF0C\u53EF\u91CD\u65B0\u4ECE A6API \u83B7\u53D6\u5E76\u91CD\u65B0\u7528 OpenRouter \u586B\u5145\uFF08\u4E0D\u5F71\u54CD\u5DF2\u5199\u5165 DSH \u914D\u7F6E\u7684\u6A21\u578B\uFF09\"\n data-tooltip-pos=\"down\"\n >\n {confirmClear ? '\u786E\u8BA4\u6E05\u7A7A\uFF1F' : '\u6E05\u7A7A\u76EE\u5F55'}\n </button>\n <div className=\"dsh-a6-catalog-count\">\n \u5171 {catalog.length} \u4E2A \u00B7 \u53EF\u7528 {availCount} \u4E2A \u00B7 \u5DF2\u586B\u53C2\u6570 {filledCount} \u4E2A\n </div>\n </div>\n\n {/* \u7B5B\u9009\u533A */}\n <div className=\"dsh-a6-catalog-filters\">\n <div className=\"dsh-a6-filter-group\">\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${availFilter === 'all' ? 'active' : ''}`}\n onClick={() => setAvailFilter('all')}\n >\n \u5168\u90E8 ({catalog.length})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${availFilter === 'available' ? 'active' : ''}`}\n onClick={() => setAvailFilter('available')}\n >\n \u53EF\u7528 ({availCount})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${availFilter === 'unavailable' ? 'active' : ''}`}\n onClick={() => setAvailFilter('unavailable')}\n >\n \u4E0D\u53EF\u7528 ({catalog.length - availCount})\n </button>\n </div>\n <div className=\"dsh-a6-filter-group\">\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${paramFilter === 'all' ? 'active' : ''}`}\n onClick={() => setParamFilter('all')}\n >\n \u5168\u90E8\u53C2\u6570\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${paramFilter === 'filled' ? 'active' : ''}`}\n onClick={() => setParamFilter('filled')}\n >\n \u5DF2\u586B ({filledCount})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${paramFilter === 'empty' ? 'active' : ''}`}\n onClick={() => setParamFilter('empty')}\n >\n \u672A\u586B ({catalog.length - filledCount})\n </button>\n </div>\n <div className=\"dsh-a6-search-wrapper\">\n <input\n type=\"text\"\n className=\"dsh-a6-input dsh-a6-search-input\"\n placeholder=\"\u641C\u7D22\u6A21\u578B ID / \u540D\u79F0...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n {search && (\n <button\n type=\"button\"\n className=\"dsh-a6-clear-btn\"\n onClick={() => setSearch('')}\n title=\"\u6E05\u7A7A\u641C\u7D22\"\n >\n \u00D7\n </button>\n )}\n </div>\n </div>\n </div>\n\n {msg && (\n <div className={`dsh-a6-catalog-msg ${msg.kind}`}>\n {msg.text}\n </div>\n )}\n\n {/* \u5185\u5BB9 */}\n {catalog.length === 0 ? (\n <div className=\"dsh-a6-empty-state\">\n <span>\u6A21\u578B\u76EE\u5F55\u4E3A\u7A7A\u3002</span>\n <span className=\"dsh-a6-side-popup-hint\">\n \u70B9\u51FB\u300C\u4ECE A6API \u83B7\u53D6\u5E02\u573A\u6A21\u578B\u300D\u62C9\u53D6\u5168\u90E8\u652F\u6301\u7684\u6A21\u578B ID\uFF0C\u518D\u7528\u300C\u4ECE OpenRouter \u4E00\u952E\u67E5\u8BE2\u300D\u81EA\u52A8\u586B\u5145\u53C2\u6570\u3002\n </span>\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"dsh-a6-empty-state\">\n <span>\u5F53\u524D\u7B5B\u9009\u6761\u4EF6\u4E0B\u6CA1\u6709\u5339\u914D\u7684\u6A21\u578B</span>\n </div>\n ) : (\n <div className=\"dsh-a6-catalog-list\">\n {filtered.map((entry) => {\n const editing = editingId === entry.id;\n const isAvail = availableSet.has(entry.id.toLowerCase());\n const re = entry.reasoningEfforts && typeof entry.reasoningEfforts === 'object' ? entry.reasoningEfforts : null;\n return (\n <div key={entry.id} className={`dsh-a6-catalog-row${editing ? ' editing' : ''}`}>\n {/* \u7B2C\u4E00\u884C\uFF1A\u6A21\u578B ID + \u53EF\u7528\u5FBD\u7AE0 + \u540D\u79F0 + \u64CD\u4F5C */}\n <div className=\"dsh-a6-catalog-row-head\">\n <div className=\"dsh-a6-catalog-id\">\n <code>{entry.id}</code>\n {isAvail && <span className=\"dsh-a6-catalog-badge avail\">\u53EF\u7528</span>}\n {entry.name && entry.name !== entry.id && (\n <span className=\"dsh-a6-catalog-name\">{entry.name}</span>\n )}\n </div>\n <div className=\"dsh-a6-catalog-row-actions\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => handleQueryOne(entry.id)}\n disabled={busy !== null}\n data-tooltip=\"\u4ECE OpenRouter \u67E5\u8BE2\u8BE5\u6A21\u578B\u53C2\u6570\u5E76\u586B\u5145\"\n >\n {queryingId === entry.id ? '\u67E5\u8BE2\u4E2D...' : '\u67E5\u8BE2\u53C2\u6570'}\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => (editing ? setEditingId(null) : startEdit(entry))}\n >\n {editing ? '\u53D6\u6D88' : '\u7F16\u8F91'}\n </button>\n </div>\n </div>\n\n {/* \u7B2C\u4E8C\u884C\uFF1A\u53C2\u6570\uFF08\u7EDF\u4E00\u5728\u6A21\u578B ID \u4E0B\u65B9\uFF09 */}\n <div className=\"dsh-a6-catalog-meta\">\n <span className={`dsh-a6-catalog-param${entry.contextWindow != null ? '' : ' empty'}`}>\n \u4E0A\u4E0B\u6587 {entry.contextWindow != null ? entry.contextWindow.toLocaleString() : '\u2014'}\n </span>\n <span className={`dsh-a6-catalog-param${entry.maxTokens != null ? '' : ' empty'}`}>\n \u8F93\u51FA {entry.maxTokens != null ? entry.maxTokens.toLocaleString() : '\u2014'}\n </span>\n <span className={`dsh-a6-catalog-param${entry.input && entry.input.length > 0 ? '' : ' empty'}`}>\n \u8F93\u5165 {entry.input && entry.input.length > 0 ? entry.input.join('+') : '\u2014'}\n </span>\n {re && Object.keys(re).length > 0 && (\n <span className=\"dsh-a6-catalog-param\">\n \u63A8\u7406 {Object.keys(re).length} \u6863\n </span>\n )}\n {entry.reasoningEfforts === false && (\n <span className=\"dsh-a6-catalog-param\">\u975E\u63A8\u7406</span>\n )}\n </div>\n\n {editing && (\n <div className=\"dsh-a6-catalog-edit\">\n <div className=\"dsh-a6-edit-grid\">\n <label className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u540D\u79F0 (name)</span>\n <input\n type=\"text\"\n className=\"dsh-a6-input\"\n value={draft.name}\n onChange={(e) => setDraft({ ...draft, name: e.target.value })}\n placeholder=\"\u4EC5\u7528\u6237\u586B\u5199\uFF0C\u7559\u7A7A\u5219\u4E0D\u5199\u5165 DSH \u914D\u7F6E\"\n />\n </label>\n <label className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u4E0A\u4E0B\u6587\u7A97\u53E3 (contextWindow)</span>\n <input\n type=\"number\"\n min={1}\n className=\"dsh-a6-input\"\n value={draft.contextWindow}\n onChange={(e) => setDraft({ ...draft, contextWindow: e.target.value })}\n placeholder=\"\u5982 1048576\uFF08\u7559\u7A7A = \u4E0D\u586B\uFF0CDSH \u7528\u9ED8\u8BA4\uFF09\"\n />\n </label>\n <label className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u6700\u5927\u8F93\u51FA (maxTokens)</span>\n <input\n type=\"number\"\n min={1}\n className=\"dsh-a6-input\"\n value={draft.maxTokens}\n onChange={(e) => setDraft({ ...draft, maxTokens: e.target.value })}\n placeholder=\"\u5982 65536\uFF08\u7559\u7A7A = \u4E0D\u586B\uFF0CDSH \u7528\u9ED8\u8BA4\uFF09\"\n />\n </label>\n <div className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u8F93\u5165\u6A21\u6001 (input)</span>\n <div className=\"dsh-a6-checkbox-group\">\n <label className=\"dsh-a6-checkbox\">\n <input\n type=\"checkbox\"\n checked={draft.inputText}\n onChange={(e) => setDraft({ ...draft, inputText: e.target.checked })}\n />\n <span>text</span>\n </label>\n <label className=\"dsh-a6-checkbox\">\n <input\n type=\"checkbox\"\n checked={draft.inputImage}\n onChange={(e) => setDraft({ ...draft, inputImage: e.target.checked })}\n />\n <span>image</span>\n </label>\n </div>\n </div>\n <label className=\"dsh-a6-edit-field dsh-a6-edit-wide\">\n <span className=\"dsh-a6-label\">\n \u63A8\u7406\u6863\u4F4D (reasoningEfforts)\n <span className=\"dsh-a6-field-hint\" style={{ marginLeft: 6 }}>\n \u683C\u5F0F\uFF1Alow: low, medium: medium\uFF1B\u503C\u4E3A\u7A7A\u8868\u793A\u8BE5\u6863\u4F4D\u65E0 wire \u503C\n </span>\n </span>\n <input\n type=\"text\"\n className=\"dsh-a6-input\"\n value={draft.reasoningText}\n disabled={draft.reasoningFalse}\n onChange={(e) => setDraft({ ...draft, reasoningText: e.target.value })}\n placeholder=\"\u9ED8\u8BA4\u5DF2\u542B DSH \u5168\u90E8 7 \u6863\uFF08off/minimal/low/medium/high/xhigh/max\uFF09\uFF0C\u53EF\u4FEE\u6539\u6216\u7559\u7A7A\u5220\u9664\u8BE5\u5B57\u6BB5\"\n />\n </label>\n <label className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u63A8\u7406\u80FD\u529B</span>\n <label className=\"dsh-a6-checkbox\">\n <input\n type=\"checkbox\"\n checked={draft.reasoningFalse}\n onChange={(e) => setDraft({ ...draft, reasoningFalse: e.target.checked })}\n />\n <span>\u975E\u63A8\u7406\u6A21\u578B (reasoningEfforts: false)</span>\n </label>\n </label>\n </div>\n <div className=\"dsh-a6-edit-actions\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={() => handleSave(entry.id)}\n >\n \u4FDD\u5B58\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={() => setEditingId(null)}\n >\n \u53D6\u6D88\n </button>\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n", "export interface A6ApiConfig {\n baseURL: string;\n apiKey: string;\n accessToken?: string;\n userId?: string;\n activeModels: string[];\n /** \u670D\u52A1\u7AEF\u8131\u654F\u4E0B\u53D1\uFF1A\u662F\u5426\u5DF2\u914D\u7F6E API Key\uFF08\u771F\u5B9E\u5BC6\u94A5\u7EDD\u4E0D\u56DE\u4F20\u5BA2\u6237\u7AEF\uFF09 */\n hasApiKey?: boolean;\n /** \u670D\u52A1\u7AEF\u8131\u654F\u4E0B\u53D1\uFF1A\u662F\u5426\u5DF2\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C */\n hasToken?: boolean;\n}\n\n/**\n * \u6A21\u578B\u76EE\u5F55\u6761\u76EE\uFF08settings.yaml \u7684 llm-pi-ai \u539F\u751F\u6A21\u578B\u5B57\u6BB5 + \u5185\u90E8 brand\uFF09\u3002\n * \u53EF\u9009\u5B57\u6BB5\u7F3A\u7701 = \u53C2\u6570\u672A\u83B7\u53D6/\u672A\u586B\u5199\uFF0C\u5199 settings.yaml \u65F6\u7701\u7565\u8BE5\u5B57\u6BB5\uFF08llm-pi-ai \u9ED8\u8BA4\u503C\u515C\u5E95\uFF09\u3002\n */\nexport interface CatalogModelEntry {\n id: string;\n name?: string;\n contextWindow?: number;\n maxTokens?: number;\n input?: ('text' | 'image')[];\n /** false = \u660E\u786E\u975E\u63A8\u7406\u6A21\u578B\uFF1Bdict = \u6863\u4F4D \u2192 wire \u503C\uFF08\u503C\u53EF\u4E3A null\uFF0C\u540C llm-pi-ai \u8BED\u4E49\uFF09 */\n reasoningEfforts?: Record<string, string | null> | false;\n /** \u4EC5\u63D2\u4EF6\u5185\u90E8\u4F7F\u7528\uFF1A\u54C1\u724C\u6765\u81EA A6API \u5E02\u573A\u6E20\u9053\uFF0C\u4E0D\u5199\u5165 settings.yaml */\n brand?: string;\n /** \u6700\u8FD1\u4E00\u6B21 OpenRouter \u67E5\u8BE2/\u4EBA\u5DE5\u4FEE\u6539\u65F6\u95F4 */\n updatedAt?: number;\n}\n\n/** DSH llm-pi-ai \u652F\u6301\u7684\u5B8C\u6574\u601D\u8003\u6863\u4F4D\uFF08THINKING_LEVELS\uFF0C\u4E0E dsh-llm-pi-ai \u6E90\u7801\u4E00\u81F4\uFF09 */\nexport const THINKING_LEVEL_KEYS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'] as const;\n\nexport type ReasoningEffortsValue = Record<string, string | null> | false;\n\n/**\n * \u6821\u9A8C reasoningEfforts\uFF08DSH llm-pi-ai \u8BED\u4E49\uFF0C\u670D\u52A1\u7AEF\u4E0E\u5BA2\u6237\u7AEF\u5171\u7528\uFF09\uFF1A\n * - false = \u975E\u63A8\u7406\u6A21\u578B\uFF0C\u5408\u6CD5\n * - \u952E\u5FC5\u987B \u2208 THINKING_LEVEL_KEYS\uFF1B\u503C\u5FC5\u987B\u975E\u7A7A\u5B57\u7B26\u4E32\uFF0C\u4EC5 off \u5141\u8BB8 null\n * - \u7A7A\u5B57\u5178\u3001\u4EC5 off \u65E0\u5176\u4ED6\u6863\u4F4D\u5747\u975E\u6CD5\n */\nexport function validateReasoningEfforts(\n value: unknown,\n): { ok: true; value: ReasoningEffortsValue } | { ok: false; error: string } {\n if (value === false) return { ok: true, value: false };\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { ok: false, error: 'reasoningEfforts \u5FC5\u987B\u662F\u6863\u4F4D\u5B57\u5178\u6216 false' };\n }\n const dict = value as Record<string, unknown>;\n const keys = Object.keys(dict);\n if (keys.length === 0) return { ok: false, error: 'reasoningEfforts \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u5178' };\n const out: Record<string, string | null> = {};\n for (const k of keys) {\n if (!(THINKING_LEVEL_KEYS as readonly string[]).includes(k)) {\n return { ok: false, error: `reasoningEfforts \u952E \"${k}\" \u4E0D\u662F DSH \u652F\u6301\u7684\u6863\u4F4D\uFF08off/minimal/low/medium/high/xhigh/max\uFF09` };\n }\n const v = dict[k];\n if (v === null) {\n if (k !== 'off') {\n return { ok: false, error: `reasoningEfforts.${k} \u5FC5\u987B\u63D0\u4F9B wire \u503C\uFF0C\u4EC5 off \u5141\u8BB8\u7559\u7A7A` };\n }\n out[k] = null;\n } else if (typeof v === 'string' && v.length > 0) {\n out[k] = v;\n } else {\n return { ok: false, error: `reasoningEfforts.${k} \u7684\u503C\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32\u6216 null` };\n }\n }\n if (!keys.some((k) => k !== 'off')) {\n return { ok: false, error: 'reasoningEfforts \u9664 off \u5916\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u601D\u8003\u6863\u4F4D\uFF08\u975E\u63A8\u7406\u6A21\u578B\u8BF7\u7528 false\uFF09' };\n }\n return { ok: true, value: out };\n}\n\nexport interface A6ApiModelMeta {\n id: string;\n name: string;\n brand: string;\n contextWindow: number;\n maxTokens: number;\n modalities: ('text' | 'image')[];\n reasoningEfforts?: Record<string, string>;\n thinkingFormat?: string;\n officialPriceMicros?: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n };\n}\n\nexport interface OfficialPrices {\n input_cny: string;\n output_cny: string;\n cache_read_cny: string;\n cache_write_cny: string;\n input_price_micros?: number;\n output_price_micros?: number;\n cache_read_price_micros?: number;\n cache_write_price_micros?: number;\n}\n\nexport interface SuccessBucketItem {\n sample_count?: number;\n success_count?: number;\n success_rate: number;\n}\n\nexport interface Bucket24hItem {\n s?: number;\n k?: number;\n r: number;\n t?: number;\n d?: number;\n f?: number;\n c?: number;\n}\n\nexport interface Bucket7dItem {\n s?: number;\n k?: number;\n r?: number;\n t?: number;\n d?: number;\n f?: number;\n c?: number;\n}\n\nexport interface MerchantChannelInfo {\n listing_id?: number;\n channel_id: number;\n channel_name: string;\n supplier_name: string;\n supplier_id?: number;\n model_name: string;\n brand: string;\n description: string;\n charge_type?: string;\n charge_type_text?: string;\n sample_count?: number;\n sample_count_text?: string;\n input_price_micros: number;\n output_price_micros: number;\n cache_read_price_micros: number;\n cache_write_price_micros: number;\n input_price_cny: string;\n output_price_cny: string;\n cache_read_price_cny: string;\n cache_write_price_cny: string;\n official_price?: OfficialPrices;\n realtime_ratio_cny: number;\n realtime_ratio_formatted: string;\n recent_success_rate_pct: number;\n success_rate_24h_pct: number;\n success_rate_7d_pct?: number;\n success_buckets?: SuccessBucketItem[];\n b24?: Bucket24hItem[];\n b7d?: Bucket7dItem[];\n sr_24h_state?: string;\n sr_7d_state?: string;\n p50_ttft_ms?: number;\n recent_p50_ms: number;\n cache_hit_rate_pct: number;\n labels: string[];\n last_success_at: number;\n last_success_text: string;\n authenticity_guaranteed: boolean;\n authenticity_badge?: string;\n is_pinned?: boolean;\n /** \u5B98\u65B9\u6E20\u9053\u641C\u7D22\u8FD4\u56DE\u7684\u56FA\u5B9A\u72B6\u6001\uFF1Apin_here / pin_elsewhere / undefined */\n pin_status?: string;\n user_channel_disabled?: boolean;\n supplier_channel_disabled?: boolean;\n raw?: any;\n}\n\n/** \u5E73\u53F0\u4FA7\u56FA\u5B9A\u8BB0\u5F55\uFF08GET /api/marketplace/pins\uFF09 */\nexport interface MarketplacePin {\n id?: number;\n token_id: number;\n token_name?: string;\n model_name: string;\n channel_id?: number;\n channel_name?: string;\n supplier_name?: string;\n supplier_nickname?: string;\n /** \u5F02\u5E38\u65F6\u662F\u5426\u81EA\u52A8\u5207\u6362\u667A\u80FD\u4F18\u9009\uFF08false = \u4E25\u683C\u56FA\u5B9A\uFF09 */\n fallback_to_smart_routing?: boolean;\n created_at?: number;\n raw?: any;\n}\n\n/** \u4EE4\u724C\u5217\u8868\u6761\u76EE\uFF08GET /api/token/\uFF0C\u7528\u4E8E\u628A API Key \u89E3\u6790\u4E3A token_id\uFF09 */\nexport interface A6ApiTokenItem {\n id: number;\n name?: string;\n key?: string;\n status?: number;\n raw?: any;\n}\n\nexport interface ModelCardData {\n model_name: string;\n brand: string;\n contextWindow: number;\n maxTokens: number;\n modalities: ('text' | 'image')[];\n hasReasoning: boolean;\n inDsh: boolean;\n merchant?: MerchantChannelInfo;\n probeStatus: 'idle' | 'queued' | 'probing' | 'success' | 'error';\n probeError?: string;\n probeLatencyMs?: number;\n lastProbedAt?: number;\n /** \u8DEF\u7531\u5FEB\u7167\u65F6\u6548\uFF1A\u8BE5\u6A21\u578B\u6700\u65B0\u4E00\u6761\u300C\u5E26 channel \u7684\u8C03\u7528\u65E5\u5FD7\u300D\u65F6\u95F4\uFF08\u79D2\uFF09\uFF0C\u5373\u5361\u7247\u5546\u6237\u6570\u636E\u6765\u6E90\u8BF7\u6C42\u7684\u65F6\u523B */\n lastRoutedAt?: number;\n /** \u670D\u52A1\u7AEF\u7B97\u597D\u7684\u76F8\u5BF9\u65F6\u95F4\u6587\u6848\uFF08\u5982\u300C3 \u5C0F\u65F6\u524D\u300D\uFF09\uFF0C\u65E0\u8BB0\u5F55\u65F6\u5BA2\u6237\u7AEF\u663E\u793A\u300C\u4ECE\u672A\u8DEF\u7531\u300D */\n lastRoutedText?: string;\n /** \u5E73\u53F0\u56FA\u5B9A\u72B6\u6001\uFF08\u6309\u5F53\u524D API Key \u4EE4\u724C\uFF09\uFF1A\u56FA\u5B9A\u5230\u5361\u7247\u5546\u5BB6 / \u56FA\u5B9A\u5230\u5176\u4ED6\u5546\u5BB6 / \u672A\u56FA\u5B9A */\n pinStatus?: 'pin_here' | 'pin_elsewhere';\n /** \u56FA\u5B9A\u7684\u6E20\u9053 ID\uFF08pin_elsewhere \u65F6\u7528\u4E8E\u5C55\u793A\u56FA\u5B9A\u5230\u4E86\u54EA\u5BB6\uFF09 */\n pinnedChannelId?: number;\n pinnedSupplierName?: string;\n pinnedFallback?: boolean;\n /** \u8BE5\u6A21\u578B\u5BF9\u5E94\u7684\u56FA\u5B9A\u8BB0\u5F55\u662F\u5426\u5C5E\u4E8E\u5F53\u524D API Key \u4EE4\u724C\uFF08false \u65F6\u4EC5\u4F5C\u53C2\u8003\u5C55\u793A\uFF09 */\n pinTokenMatched?: boolean;\n}\n\nexport interface BalanceInfo {\n hasAccountAuth: boolean;\n accountBalanceUsd: number;\n accountBalanceFormatted: string;\n accountBalanceCnyFormatted: string;\n usedUsd: number;\n usedFormatted: string;\n requestCount: number;\n username?: string;\n userId?: string | number;\n isLow: boolean;\n updatedAt: number;\n}\n\nexport interface ApiRoutingLogItem {\n id: number | string;\n created_at: number;\n model_name: string;\n channel?: number | string;\n channel_name?: string;\n /** \u53D1\u8D77\u8BE5\u8BF7\u6C42\u7684\u4EE4\u724C ID\uFF08\u7528\u4E8E\u628A API Key \u89E3\u6790\u4E3A\u56FA\u5B9A/\u7981\u7528\u6240\u9700\u7684 token_id\uFF09 */\n token_id?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n use_time?: number;\n quota?: number;\n cost_usd?: number;\n cost_formatted?: string;\n token_name?: string;\n status: 'success' | 'error';\n other?: string;\n raw?: any;\n}\n\nexport interface A6ApiStateResponse {\n config: A6ApiConfig;\n balance: BalanceInfo | null;\n models: ModelCardData[];\n dshConfiguredModels: string[];\n recentLogs?: ApiRoutingLogItem[];\n /** \u5E73\u53F0\u56FA\u5B9A\u8BB0\u5F55\u5217\u8868\uFF08\u7528\u4E8E\u5361\u7247\u72B6\u6001\u8DDF\u968F\u5B98\u7F51\uFF09 */\n pins?: MarketplacePin[];\n}\n// \u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\uFF08\u8F7B\u91CF\u76D1\u542C\uFF09\nexport interface PriceFluctuationState {\n pendingCount: number;\n unseenCount: number;\n totalCount: number;\n updatedAt: number | null;\n hasAuth?: boolean;\n authError?: boolean;\n}\n", "import React, { useEffect, useRef, useState } from 'react';\nimport { store } from '../store.js';\nimport { MerchantCard } from './MerchantCard.js';\nimport { PricePill } from './PricePill.js';\nimport { MarketPill } from './MarketPill.js';\n\nconst POPUP_MAX_WIDTH = 500;\n\n/** \u628A DSH \u6A21\u578B ID \u5F52\u4E00\u5316\u4E3A A6api \u6A21\u578B\u540D(\u5265\u79BB provider \u524D\u7F00,\u5982 a6api/gpt-4o \u2192 gpt-4o) */\nconst normalizeModelId = (id: string): string => id.replace(/^[^/]+\\//, '');\n\ninterface A6ApiSidebarCardProps {\n /** \u5BBF\u4E3B\u6CE8\u5165:\u4FA7\u8FB9\u680F\u662F\u5426\u5BBD\u5E03\u5C40(false = 56px rail) */\n wide: boolean;\n /** \u5BBF\u4E3B\u6CE8\u5165:\u4F1A\u8BDD\u5217\u8868\u5FEB\u7167\u94A9\u5B50(\u53D6 current \u5373\u5F53\u524D\u4F1A\u8BDD ID) */\n useSessions?: (selector: (s: any) => any) => any;\n /** apply \u6CE8\u5165:modelDirectories \u670D\u52A1\u8BBF\u95EE\u5668(\u4E0E composer \u6A21\u578B\u9009\u62E9\u5668\u540C\u6E90) */\n getModelDirectories?: () => any;\n}\n\n/**\n * \u4FA7\u8FB9\u680F\u5DE6\u4E0B\u89D2\u300CA6api\u300D\u6309\u94AE + \u5411\u4E0A\u5F39\u51FA\u6D6E\u5C42(\u4EFB\u4F55\u4F1A\u8BDD\u5747\u53EF\u5C55\u5F00):\u9876\u90E8\u4E3A\u8D26\u6237\u901F\u89C8\u80F6\u56CA\u884C,\n * \u4E0B\u65B9\u4E3A\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B\u5BF9\u5E94\u7684 MerchantCard;\u4F1A\u8BDD\u672A\u4F7F\u7528 A6api \u6A21\u578B\u65F6\u5361\u7247\u533A\u57DF\u6574\u4F53\u7F6E\u7070\u4E0D\u53EF\u4EA4\u4E92\u3002\n * \u4E0E\u8BBE\u7F6E\u9875\u5171\u4EAB A6ApiStore \u5355\u4F8B:\u63A2\u6D4B/\u8F6E\u8BE2/\u64CD\u4F5C\u7ED3\u679C\u5B9E\u65F6\u540C\u6B65\u3002\n *\n * useSessions \u662F React hook,\u4E0D\u80FD\u6761\u4EF6\u8C03\u7528:\u7531\u5916\u5C42\u6309\u300C\u58F3\u662F\u5426\u6CE8\u5165\u300D\u5206\u6D3E\u5230\u4E24\u4E2A\u56FA\u5B9A\n * \u5206\u652F(\u5185\u5C42\u6052\u8C03\u7528 / \u65E0\u94A9\u5B50\u5206\u652F\u6052\u4E0D\u8C03\u7528),\u89C4\u907F Rules of Hooks \u98CE\u9669\u3002\n */\nexport const A6ApiSidebarCard: React.FC<A6ApiSidebarCardProps> = ({\n wide,\n useSessions,\n getModelDirectories,\n}) => {\n if (useSessions) {\n return (\n <A6ApiSidebarCardInner\n wide={wide}\n useSessions={useSessions}\n getModelDirectories={getModelDirectories}\n />\n );\n }\n return <A6ApiSidebarCardBody wide={wide} getModelDirectories={getModelDirectories} />;\n};\n\nconst A6ApiSidebarCardInner: React.FC<{\n wide: boolean;\n useSessions: (selector: (s: any) => any) => any;\n getModelDirectories?: () => any;\n}> = ({ wide, useSessions, getModelDirectories }) => {\n // \u6052\u8C03\u7528 hook(\u5B58\u5728\u6027\u7531\u5916\u5C42\u5206\u6D3E\u4FDD\u8BC1)\n const currentId: string | undefined = useSessions((s: any) => s?.current);\n return (\n <A6ApiSidebarCardBody\n wide={wide}\n currentId={currentId}\n getModelDirectories={getModelDirectories}\n />\n );\n};\n\ninterface A6ApiSidebarCardBodyProps {\n wide: boolean;\n currentId?: string;\n getModelDirectories?: () => any;\n}\n\nconst A6ApiSidebarCardBody: React.FC<A6ApiSidebarCardBodyProps> = ({\n wide,\n currentId,\n getModelDirectories,\n}) => {\n const [open, setOpen] = useState(false);\n const [selection, setSelection] = useState<{ provider?: string; model?: string } | null>(null);\n const [state, setState] = useState(store.getState());\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number } | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const popupRef = useRef<HTMLDivElement | null>(null);\n const flippedRef = useRef(false);\n const fetchedRef = useRef(false);\n const lastPosRef = useRef<{ left: number; top?: number; bottom?: number } | null>(null);\n\n // \u8BA2\u9605 modelDirectories:\u5F53\u524D\u4F1A\u8BDD\u7684\u6A21\u578B\u9009\u62E9(provider/model),\u670D\u52A1\u53EF\u80FD\u665A\u4E8E\u63D2\u4EF6\u52A0\u8F7D,500ms \u91CD\u8BD5\n useEffect(() => {\n let disposed = false;\n let unsub: (() => void) | null = null;\n let tries = 0;\n const connect = () => {\n if (disposed) return;\n const md = getModelDirectories?.();\n if (!md || typeof md.directoryFor !== 'function') {\n if (tries++ < 6) setTimeout(connect, 500);\n return;\n }\n let dir: any;\n try {\n dir = md.directoryFor(currentId);\n } catch {\n dir = undefined; // \u5B50\u4EE3\u7406\u7B49\u65E0\u6A21\u578B\u9009\u62E9\u573A\u666F\n }\n if (!dir) {\n setSelection(null);\n return;\n }\n const update = () => {\n try {\n const snap = dir.store?.getSnapshot?.();\n setSelection(snap?.current ?? null);\n } catch {\n setSelection(null);\n }\n };\n update();\n try {\n unsub = dir.store?.subscribe?.(update) ?? null;\n } catch {\n unsub = null;\n }\n };\n connect();\n return () => {\n disposed = true;\n if (unsub) {\n try {\n unsub();\n } catch {}\n }\n };\n }, [currentId, getModelDirectories]);\n\n // \u8BA2\u9605 A6api store(\u4E0E\u8BBE\u7F6E\u9875\u540C\u4E00\u5355\u4F8B,\u63A2\u6D4B/\u8F6E\u8BE2/\u64CD\u4F5C\u5B9E\u65F6\u540C\u6B65)\n useEffect(() => {\n const unsub = store.subscribe(() => setState({ ...store.getState() }));\n return unsub;\n }, []);\n\n const isA6api = Boolean(selection && selection.provider === 'a6api');\n const modelName = normalizeModelId(selection?.model || '');\n // \u5F53\u524D\u4F1A\u8BDD\u662F\u5426\u6B63\u5728\u4F7F\u7528 A6api \u6A21\u578B:\u51B3\u5B9A\u5361\u7247\u533A\u57DF\u6B63\u5E38\u5C55\u793A\u8FD8\u662F\u6574\u4F53\u7F6E\u7070(\u6D6E\u5C42\u672C\u8EAB\u4EFB\u4F55\u4F1A\u8BDD\u90FD\u53EF\u5C55\u5F00)\n const hasA6apiModel = isA6api && Boolean(modelName);\n\n // \u6309\u6A21\u578B\u540D\u67E5\u5546\u6237\u5361\u7247:\u975E A6api \u4F1A\u8BDD\u540C\u6837\u67E5\u8BE2(\u540C\u540D\u6A21\u578B\u4EE5\u7F6E\u7070\u6001\u5C55\u793A,\u63D0\u793A\u5176\u5728 A6api \u53EF\u7528)\n const card = modelName\n ? state.models.find((m) => m.model_name.toLowerCase() === modelName.toLowerCase())\n : undefined;\n\n const toggle = () => setOpen((v) => !v);\n\n // \u6253\u5F00\u65F6:\u5B9A\u4F4D(\u951A\u5B9A\u6309\u94AE\u5411\u4E0A\u5C55\u5F00,\u7A7A\u95F4\u4E0D\u8DB3/\u6309\u94AE\u51FA\u89C6\u53E3\u5219\u7FFB\u8F6C)+ \u60F0\u6027\u52A0\u8F7D /state\n useEffect(() => {\n if (!open) {\n setPos(null);\n lastPosRef.current = null;\n flippedRef.current = false;\n return;\n }\n // fetchState \u53EF\u91CD\u5165:store \u521D\u59CB loading=true \u4E14\u4EC5\u8BBE\u7F6E\u9875/\u672C\u7EC4\u4EF6\u89E6\u53D1\u62C9\u53D6,\u4E0D\u80FD\u4EE5 loading \u4F5C\u5B88\u536B\n if (state.models.length === 0 && !fetchedRef.current) {\n fetchedRef.current = true;\n store.fetchState().catch(() => {});\n }\n const place = () => {\n const btn = buttonRef.current;\n if (!btn) return;\n const r = btn.getBoundingClientRect();\n const vw = window.innerWidth;\n const width = Math.min(POPUP_MAX_WIDTH, vw - 16);\n const left = Math.max(8, Math.min(r.left, vw - width - 8));\n // \u6309\u94AE\u88AB footer \u6EDA\u52A8\u63A8\u51FA\u89C6\u53E3(top<0)\u65F6\u540C\u6837\u7FFB\u8F6C,\u907F\u514D\u6D6E\u5C42 bottom \u951A\u51FA\u89C6\u53E3\n const flipped = flippedRef.current || r.top < 8;\n if (flipped) flippedRef.current = true;\n const next = flipped\n ? { left, top: r.bottom + 8 }\n : { left, bottom: window.innerHeight - r.top + 8 };\n // \u4F4D\u7F6E\u672A\u53D8\u5219\u8DF3\u8FC7 setPos:\u6D6E\u5C42\u5185\u90E8\u6EDA\u52A8(capture \u4E5F\u4F1A\u6536\u5230)\u4E0D\u5E94\u89E6\u53D1\u6574\u5361\u91CD\u6E32\u67D3\n const last = lastPosRef.current;\n if (\n last &&\n last.left === next.left &&\n (last.top ?? null) === (next.top ?? null) &&\n (last.bottom ?? null) === (next.bottom ?? null)\n ) {\n return;\n }\n lastPosRef.current = next;\n setPos(next);\n };\n place();\n window.addEventListener('resize', place);\n window.addEventListener('scroll', place, true);\n return () => {\n window.removeEventListener('resize', place);\n window.removeEventListener('scroll', place, true);\n };\n }, [open]);\n\n // \u7FFB\u8F6C\u91CD\u6D4B:\u6D6E\u5C42\u5185\u5BB9\u589E\u957F(\u5361\u7247\u5C55\u5F00\u300C\u8BE6\u60C5\u300D\u7B49\u5185\u90E8\u72B6\u6001\u3001\u6570\u636E\u52A0\u8F7D)\u65F6\u81EA\u52A8\u7FFB\u8F6C\n useEffect(() => {\n if (!open || !popupRef.current) return;\n const checkFlip = () => {\n if (flippedRef.current || !popupRef.current) return;\n const rect = popupRef.current.getBoundingClientRect();\n if (rect.top < 8) {\n flippedRef.current = true;\n const btn = buttonRef.current;\n if (btn) {\n const r = btn.getBoundingClientRect();\n setPos({ left: lastPosRef.current?.left ?? 8, top: r.bottom + 8 });\n }\n }\n };\n checkFlip();\n const ro = new ResizeObserver(checkFlip);\n ro.observe(popupRef.current);\n return () => ro.disconnect();\n }, [open, pos]);\n\n // Esc / \u5916\u90E8\u70B9\u51FB\u5173\u95ED\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n const onPointerDown = (e: PointerEvent) => {\n const t = e.target as Node;\n if (popupRef.current?.contains(t)) return;\n if (buttonRef.current?.contains(t)) return;\n setOpen(false);\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, true);\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n }, [open]);\n\n return (\n <>\n <span\n className={`dsh-a6-side-btn-wrap${wide ? '' : ' rail'}`}\n data-tooltip={!hasA6apiModel ? '\u5F53\u524D\u4F1A\u8BDD\u672A\u4F7F\u7528 A6api \u6A21\u578B\uFF0C\u5361\u7247\u5DF2\u7F6E\u7070' : undefined}\n >\n <button\n ref={buttonRef}\n type=\"button\"\n className={`dsh-a6-side-btn${wide ? '' : ' rail'}`}\n onClick={toggle}\n aria-expanded={open}\n aria-label={wide ? undefined : 'A6api'}\n data-tooltip={hasA6apiModel ? (open ? '\u6536\u8D77 A6api \u6A21\u578B\u5361\u7247' : '\u67E5\u770B\u5F53\u524D\u4F1A\u8BDD\u7684 A6api \u6A21\u578B\u5361\u7247') : undefined}\n >\n {/* \u4E0E\u8BBE\u7F6E\u6309\u94AE\u540C\u6B3E\u9F7F\u8F6E\u56FE\u6807(currentColor \u8DDF\u968F\u6587\u5B57\u8272) */}\n <svg\n className=\"dsh-a6-side-btn-badge\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M14.0861 5.51366C13.8717 5.0575 13.588 4.58542 13.2889 4.18108C13.208 4.07172 13.1596 4.04373 13.0243 4.03054C12.4277 3.97255 11.8245 4.05527 11.2269 3.9972C10.7224 3.94816 10.3133 3.71661 10.0115 3.30919C9.66986 2.84777 9.43973 2.31343 9.09824 1.85234C9.01771 1.74365 8.96805 1.71589 8.83354 1.70282C8.29432 1.65044 7.70402 1.65061 7.16656 1.70282C7.03205 1.71589 6.98239 1.74365 6.90186 1.85234C6.56067 2.31303 6.33025 2.84774 5.98855 3.30919C5.68681 3.71661 5.27774 3.94816 4.77317 3.9972C4.17564 4.05527 3.57239 3.97255 2.97585 4.03054C2.84046 4.04373 2.79208 4.07172 2.71115 4.18108C2.41212 4.58542 2.12835 5.0575 1.91403 5.51366C1.85299 5.64359 1.85286 5.7018 1.91403 5.8319C2.14865 6.33077 2.49748 6.76892 2.73237 7.26854C2.9594 7.7515 2.96041 8.24717 2.73338 8.73044C2.49837 9.23061 2.14891 9.66837 1.91403 10.1681C1.85291 10.2982 1.85299 10.3564 1.91403 10.4863C2.12856 10.9429 2.41185 11.4142 2.71115 11.8189C2.79208 11.9283 2.84046 11.9563 2.97585 11.9694C3.57239 12.0274 4.17564 11.9447 4.77317 12.0028C5.27774 12.0518 5.68681 12.2834 5.98855 12.6908C6.33024 13.1522 6.56037 13.6866 6.90186 14.1476C6.98239 14.2563 7.03205 14.2841 7.16656 14.2972C7.70402 14.3494 8.29432 14.3495 8.83354 14.2972C8.96805 14.2841 9.01771 14.2563 9.09824 14.1476C9.43944 13.687 9.66985 13.1522 10.0115 12.6908C10.3133 12.2834 10.7224 12.0518 11.2269 12.0028C11.8244 11.9447 12.4271 12.0275 13.0243 11.9694C13.1596 11.9563 13.208 11.9283 13.2889 11.8189C13.5891 11.4131 13.872 10.942 14.0861 10.4863C14.1471 10.3564 14.1472 10.2982 14.0861 10.1681C13.8513 9.66861 13.5017 9.23061 13.2667 8.73044C13.0397 8.24717 13.0407 7.7515 13.2677 7.26854C13.5026 6.7689 13.8513 6.33106 14.0861 5.8319C14.1472 5.7018 14.1471 5.64359 14.0861 5.51366ZM15.3035 6.40373C15.0685 6.90359 14.7188 7.34119 14.4841 7.84037C14.4231 7.97025 14.423 8.02855 14.4841 8.15861C14.7189 8.65833 15.0685 9.09611 15.3035 9.59626C15.5308 10.0801 15.5308 10.5744 15.3035 11.0582C15.052 11.5933 14.7225 12.1426 14.37 12.6191C14.0685 13.0265 13.6581 13.259 13.1536 13.3081C12.5566 13.366 11.9541 13.2835 11.3573 13.3414C11.2228 13.3545 11.1731 13.3823 11.0926 13.491C10.7511 13.9521 10.521 14.4864 10.1793 14.9478C9.87828 15.3542 9.46719 15.5869 8.96387 15.6358C8.34008 15.6964 7.66194 15.6966 7.03623 15.6358C6.53291 15.5869 6.12182 15.3542 5.82084 14.9478C5.47911 14.4863 5.24878 13.9517 4.90753 13.491C4.82701 13.3823 4.77734 13.3545 4.64284 13.3414C4.04647 13.2835 3.44373 13.366 2.84653 13.3081C2.34201 13.259 1.93164 13.0265 1.63013 12.6191C1.27867 12.144 0.948453 11.5941 0.696621 11.0582C0.469315 10.5744 0.469279 10.0801 0.696621 9.59626C0.931628 9.09613 1.2813 8.65807 1.51597 8.15861C1.57708 8.02855 1.57702 7.97025 1.51597 7.84037C1.28117 7.34095 0.931635 6.9036 0.696621 6.40373C0.469213 5.91992 0.469367 5.42562 0.696621 4.94183C0.948441 4.40587 1.27868 3.85598 1.63013 3.38092C1.93164 2.97349 2.34201 2.74095 2.84653 2.6919C3.44353 2.63397 4.04599 2.71649 4.64284 2.65856C4.77734 2.64549 4.82701 2.61774 4.90753 2.50904C5.24905 2.04792 5.47913 1.51362 5.82084 1.05219C6.12182 0.645806 6.53291 0.413119 7.03623 0.364178C7.66002 0.303556 8.33816 0.303369 8.96387 0.364178C9.46719 0.413119 9.87828 0.645806 10.1793 1.05219C10.521 1.51365 10.7513 2.04828 11.0926 2.50904C11.1731 2.61774 11.2228 2.64549 11.3573 2.65856C11.9541 2.71649 12.5566 2.63397 13.1536 2.6919C13.6581 2.74095 14.0685 2.97349 14.37 3.38092C14.7214 3.85598 15.0517 4.40587 15.3035 4.94183C15.5307 5.42562 15.5309 5.91992 15.3035 6.40373Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M9.13764 7.99999C9.13764 7.3715 8.62855 6.8624 8.00005 6.8624C7.37155 6.8624 6.86246 7.3715 6.86246 7.99999C6.86246 8.62849 7.37155 9.13759 8.00005 9.13759C8.62855 9.13759 9.13764 8.62849 9.13764 7.99999ZM10.4834 7.99999C10.4834 9.37126 9.37132 10.4833 8.00005 10.4833C6.62878 10.4833 5.51674 9.37126 5.51674 7.99999C5.51674 6.62873 6.62878 5.51669 8.00005 5.51669C9.37132 5.51669 10.4834 6.62873 10.4834 7.99999Z\"\n fill=\"currentColor\"\n />\n </svg>\n {wide && <span className=\"dsh-a6-side-btn-label\">A6api</span>}\n </button>\n </span>\n\n {open && pos && (\n <div\n ref={popupRef}\n className=\"dsh-a6-side-popup\"\n role=\"dialog\"\n aria-label=\"\u5F53\u524D\u4F1A\u8BDD A6api \u6A21\u578B\u5361\u7247\"\n style={{ left: pos.left, ...(pos.top !== undefined ? { top: pos.top } : { bottom: pos.bottom }) }}\n >\n {/* \u8D26\u6237\u901F\u89C8\u80F6\u56CA\u884C\uFF1A\u8D26\u53F7\u7EA7\u6570\u636E\uFF0C\u4E0E\u5F53\u524D\u6A21\u578B\u5361\u7247\u65E0\u5173\uFF0C\u52A0\u8F7D/\u7A7A\u6001\u6052\u663E\u793A\uFF1B\n \u4F59\u989D\u80F6\u56CA\u7EAF\u5C55\u793A\uFF08\u4E0D\u53EF\u70B9\u51FB\uFF09\uFF0C\u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\u53EF\u8DF3\u5B98\u7F51\u5904\u7406\uFF0C\u6A21\u578B\u5E02\u573A\u80F6\u56CA\u76F4\u8FBE\u5B98\u7F51\u6A21\u578B\u9875 */}\n <div className=\"dsh-a6-side-pills\">\n {state.balance?.hasAccountAuth && (\n <div\n className=\"dsh-a6-header-balance-badge dsh-a6-side-balance-pill\"\n title=\"\u8D26\u6237\u4F59\u989D\uFF08\u6BCF 60 \u79D2\u81EA\u52A8\u540C\u6B65\uFF09\"\n >\n <span className=\"dsh-a6-hb-label\">\u8D26\u6237\u4F59\u989D:</span>\n <span className=\"dsh-a6-hb-amount\">{state.balance.accountBalanceFormatted}</span>\n </div>\n )}\n <PricePill\n pf={state.priceFluctuation}\n hasToken={Boolean(state.config?.hasToken)}\n compact\n />\n <MarketPill />\n </div>\n {/* \u6A21\u578B\u5361\u7247\u533A\u57DF:\u975E A6api \u4F1A\u8BDD\u6574\u4F53\u7F6E\u7070\u4E14\u4E0D\u53EF\u4EA4\u4E92(\u9876\u90E8\u8D26\u6237\u80F6\u56CA\u4E0D\u53D7\u5F71\u54CD) */}\n <div className={hasA6apiModel ? undefined : 'dsh-a6-side-card-dimmed'}>\n {card ? (\n <MerchantCard model={card} />\n ) : state.loading && state.models.length === 0 ? (\n <div className=\"dsh-a6-side-popup-empty\">\n <div className=\"dsh-a6-spinner\" />\n <span>\u6B63\u5728\u52A0\u8F7D A6api \u6570\u636E...</span>\n </div>\n ) : hasA6apiModel ? (\n <div className=\"dsh-a6-side-popup-empty\">\n <span>\u672A\u627E\u5230\u300C{modelName}\u300D\u7684\u5546\u6237\u6570\u636E</span>\n <span className=\"dsh-a6-side-popup-hint\">\u53EF\u5728\u300C\u8BBE\u7F6E \u2192 A6api\u300D\u4E2D\u63A2\u6D4B\u8BE5\u6A21\u578B</span>\n </div>\n ) : (\n <div className=\"dsh-a6-side-popup-empty\">\n <span>\u5F53\u524D\u4F1A\u8BDD\u672A\u4F7F\u7528 A6api \u6A21\u578B</span>\n <span className=\"dsh-a6-side-popup-hint\">\n {modelName ? `\u300C${modelName}\u300D\u6682\u65E0\u5546\u6237\u6570\u636E` : '\u5207\u6362\u5230 A6api \u6A21\u578B\u540E\u81EA\u52A8\u5C55\u793A\u5546\u6237\u5361\u7247'}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n </>\n );\n};\n", "/* A6API Plugin Styles - Clean Professional DSH Native Theme Integration */\n\n.dsh-a6-container {\n display: flex;\n flex-direction: column;\n color: var(--dsw-alias-label-primary, var(--ds-text-primary, #1e293b));\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n padding-bottom: 28px;\n}\n\n/* ==========================================================================\n 1. Master Header & Navigation Tabs (Image 2 Style)\n ========================================================================== */\n.dsh-a6-main-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n margin-bottom: 12px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-header-text {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dsh-a6-main-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--dsw-alias-label-primary, #0f172a);\n margin: 0;\n line-height: 1.2;\n}\n\n.dsh-a6-main-subtitle {\n font-size: 13px;\n color: var(--dsw-alias-label-secondary, #64748b);\n margin: 0;\n line-height: 1.5;\n}\n\n.dsh-a6-header-balance-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 16px;\n cursor: pointer;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all 0.15s;\n}\n\n.dsh-a6-header-badges {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-header-balance-badge:hover {\n border-color: #10b981;\n background: rgba(16, 185, 129, 0.04);\n}\n\n.dsh-a6-hb-label {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-price-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border-radius: 16px;\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all 0.15s;\n user-select: none;\n /* \u4E0E\u8D26\u6237\u4F59\u989D\u80F6\u56CA\u7B49\u9AD8\uFF1A\u7EE7\u627F\u540C\u6837\u5185\u8FB9\u8DDD\u4E0E\u884C\u9AD8\uFF0C\u907F\u514D\u89C6\u89C9\u5927\u5C0F\u5DEE\u5F02 */\n min-height: 28px;\n box-sizing: border-box;\n}\n\n.dsh-a6-price-pill.is-zero {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border-color: var(--dsw-alias-border-l2, #e2e8f0);\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-price-pill.is-zero:hover {\n border-color: #10b981;\n background: rgba(16, 185, 129, 0.04);\n}\n\n.dsh-a6-price-pill.is-zero.is-disabled-zero:hover {\n border-color: var(--dsw-alias-border-l2, #e2e8f0);\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n}\n\n.dsh-a6-price-pill.has-change {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border-color: var(--dsw-alias-border-l2, #e2e8f0);\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-price-pill.has-change:hover {\n border-color: #ef4444;\n background: rgba(239, 68, 68, 0.03);\n}\n\n.dsh-a6-price-pill.is-disabled-zero {\n cursor: not-allowed;\n opacity: 0.9;\n}\n\n.dsh-a6-price-pill.disabled {\n background: var(--dsw-alias-bg-layer-1, rgba(0,0,0,0.04));\n border-color: var(--dsw-alias-border-l3, #cbd5e1);\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n cursor: not-allowed;\n opacity: 0.85;\n}\n\n.dsh-a6-price-pill-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-price-pill-count {\n font-size: 13px;\n font-weight: 700;\n min-width: 8px;\n text-align: center;\n line-height: 1;\n}\n\n.dsh-a6-price-pill.is-zero .dsh-a6-price-pill-count {\n color: #10b981;\n}\n\n.dsh-a6-price-pill.has-change .dsh-a6-price-pill-count {\n color: #ef4444;\n}\n\n.dsh-a6-price-pill.disabled .dsh-a6-price-pill-count {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n/* \u300C\u6A21\u578B\u5E02\u573A\u300D\u80F6\u56CA(\u4FA7\u8FB9\u680F\u6D6E\u5C42):\u4E0E\u4F59\u989D / \u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\u540C\u6B3E\u5916\u89C2,\u70B9\u51FB\u76F4\u8FBE\u5B98\u7F51\u6A21\u578B\u9875 */\n.dsh-a6-market-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border-radius: 16px;\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all 0.15s;\n user-select: none;\n min-height: 28px;\n box-sizing: border-box;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-market-pill:hover {\n border-color: #10b981;\n background: rgba(16, 185, 129, 0.04);\n}\n\n.dsh-a6-market-pill-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-market-pill:hover .dsh-a6-market-pill-label {\n color: #10b981;\n}\n\n.dsh-a6-hb-amount {\n font-size: 13px;\n font-weight: 700;\n color: #10b981;\n}\n\n/* Nav Tabs */\n.dsh-a6-nav-tabs {\n display: flex;\n gap: 28px;\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n margin-bottom: 18px;\n margin-top: 4px;\n}\n\n.dsh-a6-nav-tab {\n background: transparent;\n border: none;\n padding: 10px 2px 12px 2px;\n font-size: 14px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n cursor: pointer;\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: color 0.15s;\n margin-bottom: -1px;\n}\n\n.dsh-a6-nav-tab:hover {\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-nav-tab.active {\n color: var(--dsw-alias-label-primary, #0f172a);\n font-weight: 600;\n border-bottom: 2px solid var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-tab-badge {\n font-size: 11px;\n font-weight: 500;\n padding: 1px 6px;\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.06));\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-tab-badge.success {\n background: rgba(16, 185, 129, 0.12);\n color: #10b981;\n}\n\n/* Tab Page Wrapper */\n.dsh-a6-tab-page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n animation: dsh-a6-fadein 0.15s ease-out;\n}\n\n@keyframes dsh-a6-fadein {\n from {\n opacity: 0.8;\n transform: translateY(2px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* ==========================================================================\n 2. Models Tab Toolbar & Filters\n ========================================================================== */\n.dsh-a6-section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n position: relative;\n z-index: 100;\n}\n\n.dsh-a6-filter-group {\n display: flex;\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.04));\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n border-radius: 6px;\n padding: 2px;\n}\n\n.dsh-a6-filter-btn {\n background: transparent;\n border: none;\n padding: 4px 10px;\n font-size: 12px;\n font-weight: 500;\n border-radius: 4px;\n color: var(--dsw-alias-label-secondary, #64748b);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.dsh-a6-filter-btn:hover {\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-filter-btn.active {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n color: var(--dsw-alias-label-primary, #0f172a);\n font-weight: 600;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.dsh-a6-toolbar-right {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.dsh-a6-search-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dsh-a6-search-input {\n width: 200px;\n height: 30px;\n padding-right: 22px;\n font-size: 12px;\n}\n\n.dsh-a6-clear-btn {\n position: absolute;\n right: 6px;\n background: transparent;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n font-size: 14px;\n padding: 2px;\n line-height: 1;\n}\n\n/* ==========================================================================\n 3. Clean Model Card\n ========================================================================== */\n.dsh-a6-cards-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.dsh-a6-official-card {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n padding: 12px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transition: border-color 0.15s, box-shadow 0.15s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);\n}\n\n.dsh-a6-official-card:hover {\n border-color: var(--dsw-alias-border-l1, #cbd5e1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n\n.dsh-a6-official-card.in-dsh {\n border-left: 3px solid #10b981;\n}\n\n/* Main Top Bar */\n.dsh-a6-card-main-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 14px;\n cursor: pointer;\n user-select: none;\n flex-wrap: wrap;\n}\n\n/* Identity Col (Clean text without Brand Logos) */\n.dsh-a6-bar-identity {\n display: flex;\n align-items: center;\n min-width: 180px;\n flex: 1.2;\n}\n\n.dsh-a6-title-col {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.dsh-a6-title-line {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-name-text {\n font-size: 14px;\n font-weight: 700;\n color: var(--dsw-alias-label-primary, #0f172a);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, monospace;\n}\n\n.dsh-a6-dot-sep {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-merchant-id-text {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #475569);\n}\n\n.dsh-a6-probe-fail-chip {\n margin-left: 8px;\n font-size: 11px;\n font-weight: 600;\n color: #dc2626;\n background: rgba(220, 38, 38, 0.08);\n border: 1px solid rgba(220, 38, 38, 0.35);\n border-radius: 999px;\n padding: 1px 8px;\n white-space: nowrap;\n cursor: help;\n}\n\n.dsh-a6-sub-desc {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n/* Pricing Col */\n.dsh-a6-bar-pricing {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n}\n\n.dsh-a6-bar-pricing.unprobed {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 12px;\n}\n\n.dsh-a6-unprobed-hint.error {\n color: #dc2626;\n font-weight: 600;\n}\n\n.dsh-a6-price-col {\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.dsh-a6-price-top {\n font-size: 13px;\n font-weight: 700;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-price-btm {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-ratio-pill {\n font-size: 11px;\n font-weight: 600;\n padding: 2px 7px;\n border-radius: 10px;\n background: #f0fdfa;\n color: #0d9488;\n border: 1px solid #99f6e4;\n white-space: nowrap;\n}\n\n/* Uptime / Health Col (\u5B9E\u65F6 / 24h / 7d) */\n.dsh-a6-bar-uptime {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 130px;\n}\n\n.dsh-a6-uptime-row {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 11px;\n}\n\n.dsh-a6-uptime-label {\n width: 24px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 10px;\n}\n\n.dsh-a6-dots-track {\n display: flex;\n gap: 2px;\n align-items: center;\n}\n\n.dsh-a6-rate-dot {\n width: 4px;\n height: 8px;\n border-radius: 2px;\n background: #10b981;\n}\n\n.dsh-a6-rate-dot.green {\n background: #10b981;\n}\n\n.dsh-a6-rate-dot.yellow {\n background: #f59e0b;\n}\n\n.dsh-a6-rate-dot.red {\n background: #ef4444;\n}\n\n.dsh-a6-rate-dot.empty {\n background: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.1));\n}\n\n.dsh-a6-uptime-val {\n font-weight: 600;\n font-size: 10px;\n color: var(--dsw-alias-label-secondary, #475569);\n min-width: 38px;\n text-align: right;\n}\n\n/* Performance Col (Speed / Cache Hit Bar) */\n.dsh-a6-bar-perf {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dsh-a6-perf-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dsh-a6-latency-text {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-cache-hit-text {\n font-size: 11px;\n font-weight: 600;\n color: #d97706;\n}\n\n.dsh-a6-hit-track {\n width: 38px;\n height: 4px;\n border-radius: 2px;\n background: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.08));\n overflow: hidden;\n}\n\n.dsh-a6-hit-fill {\n height: 100%;\n border-radius: 2px;\n background: linear-gradient(90deg, #f59e0b, #eab308);\n}\n\n/* Smart Tags */\n.dsh-a6-bar-tags {\n display: flex;\n gap: 5px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.dsh-a6-smart-pill {\n font-size: 11px;\n font-weight: 500;\n padding: 1px 6px;\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.04));\n border: 1px solid var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.08));\n color: var(--dsw-alias-label-secondary, #475569);\n}\n\n.dsh-a6-smart-pill.tag-stable {\n background: rgba(16, 185, 129, 0.08);\n border-color: rgba(16, 185, 129, 0.25);\n color: #10b981;\n}\n\n.dsh-a6-smart-pill.tag-cheap {\n background: rgba(59, 130, 246, 0.08);\n border-color: rgba(59, 130, 246, 0.25);\n color: #3b82f6;\n}\n\n.dsh-a6-smart-pill.tag-fast {\n background: rgba(249, 115, 22, 0.08);\n border-color: rgba(249, 115, 22, 0.25);\n color: #ea580c;\n}\n\n.dsh-a6-smart-pill.tag-quality {\n background: rgba(234, 179, 8, 0.08);\n border-color: rgba(234, 179, 8, 0.25);\n color: #ca8a04;\n}\n\n.dsh-a6-smart-pill.tag-guarantee {\n background: rgba(16, 185, 129, 0.12);\n border-color: rgba(16, 185, 129, 0.35);\n color: #059669;\n}\n\n/* Right Actions Group \u2014 \u9ED8\u8BA4\u9760\u53F3\uFF0C\u7A84\u5C4F\u65F6\u5360\u6EE1\u884C\u5BBD\u4E24\u7AEF\u5BF9\u9F50 */\n.dsh-a6-bar-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 0 0 auto;\n margin-left: auto;\n}\n\n@media (max-width: 900px) {\n .dsh-a6-bar-actions {\n flex: 1 1 100%;\n width: 100%;\n margin-left: 0;\n justify-content: space-between;\n }\n}\n\n.dsh-a6-time-ago {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n/* \u4E24\u884C\u65F6\u95F4\u6233\u5782\u76F4\u53E0\u653E (\u5168\u7F51\u6700\u8FD1 / \u4E2A\u4EBA\u6700\u8FD1) \u2014 \u5DE6\u5BF9\u9F50 */\n.dsh-a6-time-stack {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n flex-shrink: 0;\n text-align: left;\n}\n\n/* \u5361\u7247\u5E95\u90E8\u884C\uFF1A\u65F6\u95F4\u6233\u5DE6\u4E0B\u89D2\u5DE6\u5BF9\u9F50\uFF0C\u64CD\u4F5C\u6309\u94AE\u53F3\u4E0B\u89D2\u53F3\u5BF9\u9F50 */\n.dsh-a6-card-footer {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n padding-top: 2px;\n flex-wrap: wrap;\n}\n\n/* \u53F3\u4FA7\u4E09\u6309\u94AE\u7EC4 */\n.dsh-a6-bar-actions-btns {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.dsh-a6-route-snapshot.never {\n color: var(--dsw-alias-label-quaternary, #cbd5e1);\n}\n\n.dsh-a6-btn-in-dsh {\n background: rgba(16, 185, 129, 0.12);\n border: 1px solid rgba(16, 185, 129, 0.35);\n color: #059669;\n}\n\n.dsh-a6-btn-in-dsh:hover {\n background: rgba(16, 185, 129, 0.2);\n}\n\n.dsh-a6-expand-toggle-btn {\n background: transparent;\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary, #64748b);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 8px;\n height: 28px;\n transition: all 0.15s;\n}\n\n.dsh-a6-expand-toggle-btn:hover {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.04));\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* ==========================================================================\n 4. Bottom Detailed Comparison Box\n ========================================================================== */\n.dsh-a6-detail-container {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));\n border: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.8));\n border-radius: 8px;\n padding: 10px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.dsh-a6-detail-top-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-dt-left,\n.dsh-a6-dt-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dsh-a6-dt-label {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-dt-desc {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1e293b);\n}\n\n.dsh-a6-dt-channel-name {\n font-size: 12px;\n font-weight: 500;\n color: #3b82f6;\n}\n\n.dsh-a6-dt-divider {\n height: 1px;\n background: var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.6));\n margin: 1px 0;\n}\n\n/* Price Comparison Table */\n.dsh-a6-dt-table-col {\n overflow-x: auto;\n}\n\n.dsh-a6-price-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n text-align: left;\n}\n\n.dsh-a6-price-table th {\n padding: 4px 8px;\n font-size: 11px;\n font-weight: 500;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n border-bottom: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.6));\n}\n\n.dsh-a6-th-blank {\n width: 50px;\n}\n\n.dsh-a6-price-table td {\n padding: 5px 8px;\n}\n\n.dsh-a6-td-label {\n color: var(--dsw-alias-label-secondary, #64748b);\n font-weight: 500;\n}\n\n.dsh-a6-tr-official td {\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-tr-merchant td {\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-td-bold {\n font-weight: 700;\n}\n\n/* ==========================================================================\n 5. Account Tab & Asset Panel Styles\n ========================================================================== */\n.dsh-a6-account-page {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.dsh-a6-balance-banner {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, rgba(226, 232, 240, 0.8));\n border-radius: 10px;\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);\n position: relative;\n}\n\n.dsh-a6-balance-banner::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n border-top-left-radius: 9px;\n border-top-right-radius: 9px;\n background: linear-gradient(90deg, #3b82f6 0%, #10b981 50%, #6366f1 100%);\n}\n\n.dsh-a6-balance-banner.low-balance::before {\n background: linear-gradient(90deg, #ef4444 0%, #f59e0b 100%);\n}\n\n.dsh-a6-balance-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-balance-left {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.dsh-a6-balance-main-title {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dsh-a6-balance-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-balance-num-row {\n display: flex;\n align-items: baseline;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-balance-amount {\n font-size: 26px;\n font-weight: 700;\n color: #10b981;\n letter-spacing: -0.5px;\n line-height: 1.1;\n}\n\n.dsh-a6-balance-amount.unauthed {\n font-size: 22px;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-balance-banner.low-balance .dsh-a6-balance-amount {\n color: #ef4444;\n}\n\n.dsh-a6-balance-cny {\n font-size: 14px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-status-pill {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 12px;\n display: inline-flex;\n align-items: center;\n}\n\n.dsh-a6-status-pill.success {\n background: rgba(16, 185, 129, 0.12);\n color: #10b981;\n border: 1px solid rgba(16, 185, 129, 0.25);\n}\n\n.dsh-a6-status-pill.warn {\n background: rgba(245, 158, 11, 0.12);\n color: #f59e0b;\n border: 1px solid rgba(245, 158, 11, 0.25);\n}\n\n.dsh-a6-low-alert {\n display: inline-flex;\n align-items: center;\n background: rgba(239, 68, 68, 0.12);\n color: #ef4444;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n width: fit-content;\n}\n\n.dsh-a6-balance-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n/* Stat KPI Cards Grid */\n.dsh-a6-stat-cards-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n}\n\n@media (max-width: 768px) {\n .dsh-a6-stat-cards-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n.dsh-a6-kpi-card {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));\n border: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.6));\n border-radius: 8px;\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dsh-a6-kpi-label {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-kpi-val {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* Auth Banner Box */\n.dsh-a6-auth-banner-box {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 14px;\n padding: 12px 16px;\n background: rgba(59, 130, 246, 0.06);\n border: 1px solid rgba(59, 130, 246, 0.2);\n border-radius: 8px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-auth-banner-title {\n font-size: 13px;\n font-weight: 600;\n color: #2563eb;\n margin-bottom: 2px;\n}\n\n.dsh-a6-auth-banner-desc {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #475569);\n line-height: 1.4;\n}\n\n/* Recent Logs Section */\n.dsh-a6-logs-section {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n padding: 14px 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.dsh-a6-logs-header {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.dsh-a6-logs-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-logs-subtitle {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-logs-table-wrapper {\n overflow-x: auto;\n}\n\n.dsh-a6-logs-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n text-align: left;\n}\n\n.dsh-a6-logs-table th {\n padding: 6px 8px;\n font-size: 11px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #64748b);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n}\n\n.dsh-a6-logs-table td {\n padding: 6px 8px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.5));\n}\n\n.dsh-a6-log-time {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 11px;\n}\n\n.dsh-a6-log-channel-badge {\n font-size: 11px;\n padding: 2px 6px;\n background: rgba(59, 130, 246, 0.08);\n color: #3b82f6;\n border-radius: 4px;\n}\n\n.dsh-a6-log-status {\n font-size: 11px;\n font-weight: 500;\n padding: 1px 6px;\n border-radius: 10px;\n}\n\n.dsh-a6-log-status.ok {\n background: rgba(16, 185, 129, 0.12);\n color: #10b981;\n}\n\n.dsh-a6-log-status.err {\n background: rgba(239, 68, 68, 0.12);\n color: #ef4444;\n}\n\n.dsh-a6-log-cost {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #475569);\n font-weight: 500;\n}\n\n.dsh-a6-btn-refresh-ok {\n color: #10b981 !important;\n border-color: rgba(16, 185, 129, 0.4) !important;\n background: rgba(16, 185, 129, 0.08) !important;\n}\n\n.dsh-a6-empty-logs {\n padding: 20px;\n text-align: center;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 12px;\n}\n\n/* ==========================================================================\n 6. Configuration Tab Styles\n ========================================================================== */\n.dsh-a6-config-page {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.dsh-a6-config-section {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n padding: 16px 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.dsh-a6-section-heading {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.dsh-a6-heading-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-heading-desc {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #64748b);\n line-height: 1.4;\n}\n\n.dsh-a6-node-picker {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-node-pill {\n padding: 5px 12px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #475569);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.dsh-a6-node-pill:hover {\n background: var(--dsw-alias-bg-layer-2, #f8fafc);\n border-color: #94a3b8;\n}\n\n.dsh-a6-node-pill.active {\n background: #3b82f6;\n color: #ffffff;\n border-color: #3b82f6;\n font-weight: 500;\n}\n\n.dsh-a6-config-fields-grid {\n display: flex;\n gap: 14px;\n}\n\n@media (max-width: 768px) {\n .dsh-a6-config-fields-grid {\n flex-direction: column;\n }\n}\n\n.dsh-a6-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n flex: 1;\n}\n\n.dsh-a6-field-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.dsh-a6-field-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dsh-a6-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #475569);\n}\n\n.dsh-a6-field-hint {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n line-height: 1.4;\n}\n\n.dsh-a6-field-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n margin-top: 1px;\n}\n\n.dsh-a6-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dsh-a6-input {\n width: 100%;\n height: 32px;\n padding: 0 10px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n color: var(--dsw-alias-label-primary, #1e293b);\n font-size: 12px;\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n\n.dsh-a6-input:focus {\n border-color: #3b82f6;\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15);\n}\n\n.dsh-a6-help-drawer {\n background: var(--dsw-alias-bg-layer-1, #f8fafc);\n border: 1px dashed var(--dsw-alias-border-l2, #cbd5e1);\n border-radius: 8px;\n padding: 10px 14px;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #475569);\n}\n\n.dsh-a6-help-title {\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n margin-bottom: 4px;\n}\n\n.dsh-a6-help-list {\n margin: 0;\n padding-left: 18px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.dsh-a6-help-list code {\n background: rgba(0, 0, 0, 0.06);\n padding: 1px 4px;\n border-radius: 3px;\n font-size: 10px;\n}\n\n.dsh-a6-integration-card {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));\n border: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.6));\n border-radius: 8px;\n padding: 10px 14px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.dsh-a6-int-row {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 12px;\n}\n\n.dsh-a6-int-key {\n width: 100px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-int-val {\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-int-tags {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-model-chip {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 7px;\n border-radius: 4px;\n background: rgba(16, 185, 129, 0.12);\n color: #059669;\n border: 1px solid rgba(16, 185, 129, 0.25);\n}\n\n.dsh-a6-empty-hint {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 12px;\n}\n\n.dsh-a6-save-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n}\n\n.dsh-a6-success-msg {\n color: #10b981;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* ==========================================================================\n 7. Buttons & Common State Styles\n ========================================================================== */\n.dsh-a6-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 30px;\n padding: 0 10px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s;\n white-space: nowrap;\n}\n\n.dsh-a6-btn-primary {\n background: #3b82f6;\n color: #ffffff;\n}\n\n.dsh-a6-btn-primary:hover {\n background: #2563eb;\n}\n\n.dsh-a6-btn-secondary {\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n border-color: var(--dsw-alias-border-l3, #cbd5e1);\n color: var(--dsw-alias-label-primary, #334155);\n}\n\n.dsh-a6-btn-secondary:hover {\n background: var(--dsw-alias-bg-layer-2, #f8fafc);\n border-color: #94a3b8;\n}\n\n.dsh-a6-btn-sm {\n height: 28px;\n padding: 0 9px;\n font-size: 12px;\n}\n\n.dsh-a6-btn-xs {\n height: 26px;\n padding: 0 8px;\n font-size: 11px;\n}\n\n.dsh-a6-btn-text {\n background: transparent;\n border: none;\n color: #3b82f6;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n padding: 1px 3px;\n}\n\n.dsh-a6-btn-text:hover {\n text-decoration: underline;\n}\n\n.dsh-a6-empty-state {\n text-align: center;\n padding: 36px 20px;\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px dashed var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary, #64748b);\n font-size: 13px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n}\n\n.dsh-a6-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid rgba(59, 130, 246, 0.2);\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: dsh-a6-spin 0.8s linear infinite;\n}\n\n@keyframes dsh-a6-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* ==========================================================================\n 8. Instant Custom Tooltip (Zero-Delay, High Contrast)\n ========================================================================== */\n[data-tooltip] {\n position: relative;\n}\n\n[data-tooltip]::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: calc(100% + 7px);\n left: 50%;\n transform: translateX(-50%);\n padding: 6px 10px;\n background: rgba(15, 23, 42, 0.96);\n color: #f8fafc;\n font-size: 11px;\n font-weight: 400;\n line-height: 1.4;\n white-space: normal;\n max-width: min(320px, 85vw);\n width: max-content;\n text-align: left;\n word-break: break-word;\n overflow-wrap: anywhere;\n border-radius: 6px;\n box-shadow: 0 6px 18px rgba(0, 0, 0, 0.28);\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.08s ease-out, visibility 0.08s ease-out;\n z-index: 99999;\n border: 1px solid rgba(255, 255, 255, 0.12);\n}\n\n[data-tooltip]::before {\n content: '';\n position: absolute;\n bottom: calc(100% + 2px);\n left: 50%;\n transform: translateX(-50%);\n border-width: 5px 5px 0 5px;\n border-style: solid;\n border-color: rgba(15, 23, 42, 0.94) transparent transparent transparent;\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.04s ease-out, visibility 0.04s ease-out;\n z-index: 99999;\n}\n\n[data-tooltip]:hover::after,\n[data-tooltip]:hover::before {\n opacity: 1;\n visibility: visible;\n}\n\n[data-tooltip-pos=\"left\"]::after {\n left: auto;\n right: 0;\n transform: none;\n}\n\n[data-tooltip-pos=\"left\"]::before {\n left: auto;\n right: 14px;\n transform: none;\n}\n\n[data-tooltip-pos=\"right\"]::after {\n left: 0;\n right: auto;\n transform: none;\n}\n\n[data-tooltip-pos=\"right\"]::before {\n left: 14px;\n right: auto;\n transform: none;\n}\n\n/* Down positions (for top toolbar and header buttons) */\n[data-tooltip-pos=\"down\"]::after {\n top: calc(100% + 7px);\n bottom: auto;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n}\n\n[data-tooltip-pos=\"down\"]::before {\n top: calc(100% + 2px);\n bottom: auto;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n border-width: 0 5px 5px 5px;\n border-color: transparent transparent rgba(15, 23, 42, 0.94) transparent;\n}\n\n[data-tooltip-pos=\"down-left\"]::after {\n top: calc(100% + 7px);\n bottom: auto;\n left: auto;\n right: 0;\n transform: none;\n}\n\n[data-tooltip-pos=\"down-left\"]::before {\n top: calc(100% + 2px);\n bottom: auto;\n left: auto;\n right: 14px;\n transform: none;\n border-width: 0 5px 5px 5px;\n border-color: transparent transparent rgba(15, 23, 42, 0.94) transparent;\n}\n\n[data-tooltip-pos=\"down-right\"]::after {\n top: calc(100% + 7px);\n bottom: auto;\n left: 0;\n right: auto;\n transform: none;\n}\n\n[data-tooltip-pos=\"down-right\"]::before {\n top: calc(100% + 2px);\n bottom: auto;\n left: 14px;\n right: auto;\n transform: none;\n border-width: 0 5px 5px 5px;\n border-color: transparent transparent rgba(15, 23, 42, 0.94) transparent;\n}\n\n/* Card actions tooltip: keep centered (avoid left:0 right-edge overflow) */\n.dsh-a6-bar-actions [data-tooltip]:not([data-tooltip-pos])::after {\n left: 50%;\n transform: translateX(-50%);\n right: auto;\n}\n\n.dsh-a6-bar-actions [data-tooltip]:not([data-tooltip-pos])::before {\n left: 50%;\n transform: translateX(-50%);\n right: auto;\n}\n\n/* When JS portal tooltip is active, hide pseudo to avoid double rendering */\nbody.dsh-a6api-tooltip-active [data-tooltip]::after,\nbody.dsh-a6api-tooltip-active [data-tooltip]::before {\n opacity: 0 !important;\n visibility: hidden !important;\n}\n\n/* ==========================================================================\n 8. \u56FA\u5B9A / \u7981\u7528 \u72B6\u6001\u5FBD\u6807\u3001\u64CD\u4F5C\u6309\u94AE\u4E0E\u56FA\u5B9A\u786E\u8BA4\u5F39\u7A97\n ========================================================================== */\n.dsh-a6-pin-badge {\n display: inline-flex;\n align-items: center;\n height: 18px;\n padding: 0 6px;\n margin-left: 6px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n.dsh-a6-pin-badge.here {\n background: rgba(16, 185, 129, 0.12);\n color: #059669;\n border: 1px solid rgba(16, 185, 129, 0.35);\n}\n\n.dsh-a6-pin-badge.elsewhere {\n background: rgba(245, 158, 11, 0.12);\n color: #d97706;\n border: 1px solid rgba(245, 158, 11, 0.35);\n}\n\n.dsh-a6-pin-badge.disabled {\n background: rgba(100, 116, 139, 0.14);\n color: #64748b;\n border: 1px solid rgba(100, 116, 139, 0.3);\n}\n\n.dsh-a6-btn-danger {\n background: #ffffff;\n border-color: #ef4444;\n color: #ef4444;\n}\n\n.dsh-a6-btn-danger:hover {\n background: #fef2f2;\n border-color: #dc2626;\n color: #dc2626;\n}\n\n.dsh-a6-btn:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.dsh-a6-action-error {\n /* footer \u5185\u72EC\u7ACB\u6574\u884C\u5C55\u793A\uFF08footer \u4E3A flex-wrap\uFF09\uFF0C\u4E0D\u4E0E\u6309\u94AE\u5E76\u6392\u6491\u5BBD */\n flex-basis: 100%;\n margin-top: 6px;\n padding: 4px 8px;\n border-radius: 6px;\n background: rgba(239, 68, 68, 0.08);\n border: 1px solid rgba(239, 68, 68, 0.25);\n color: #dc2626;\n font-size: 11px;\n line-height: 1.5;\n}\n\n/* \u56FA\u5B9A\u786E\u8BA4\u5F39\u7A97 */\n.dsh-a6-pin-modal-overlay {\n position: fixed;\n inset: 0;\n z-index: 2147483000;\n background: rgba(15, 23, 42, 0.45);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n}\n\n.dsh-a6-pin-modal {\n width: min(420px, 92vw);\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(15, 23, 42, 0.25);\n overflow: hidden;\n}\n\n.dsh-a6-pin-modal-title {\n padding: 12px 16px;\n font-size: 14px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #1e293b);\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e2e8f0);\n background: var(--dsw-alias-bg-layer-1, #f8fafc);\n}\n\n.dsh-a6-pin-modal-body {\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.dsh-a6-pin-modal-row {\n display: flex;\n align-items: baseline;\n gap: 10px;\n font-size: 12px;\n}\n\n.dsh-a6-pin-modal-label {\n flex: 0 0 48px;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-pin-modal-value {\n color: var(--dsw-alias-label-primary, #1e293b);\n font-weight: 500;\n word-break: break-all;\n}\n\n.dsh-a6-pin-modal-note {\n margin: 4px 0 0;\n font-size: 11px;\n line-height: 1.6;\n color: var(--dsw-alias-label-secondary, #64748b);\n background: rgba(59, 130, 246, 0.06);\n border: 1px solid rgba(59, 130, 246, 0.15);\n border-radius: 6px;\n padding: 6px 8px;\n}\n\n.dsh-a6-pin-modal-foot {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 10px 16px;\n border-top: 1px solid var(--dsw-alias-border-l3, #e2e8f0);\n background: var(--dsw-alias-bg-layer-1, #f8fafc);\n}\n\n/* ==========================================================================\n Sidebar Footer Action: \u5F53\u524D\u4F1A\u8BDD A6api \u6A21\u578B\u5361\u7247\u5165\u53E3(\u5DE6\u4E0B\u89D2\u8BBE\u7F6E\u6309\u94AE\u4E0A\u65B9)\n ========================================================================== */\n.dsh-a6-side-btn-wrap {\n display: flex;\n min-width: 0;\n /* footerActions \u662F\u884C\u5411 flex \u5BB9\u5668(width:100%)\uFF1A\u62C9\u4F38\u5360\u6EE1,\u4E0E\u4E0A\u65B9\u300C\u8BBE\u7F6E\u300D\u6309\u94AE\u540C\u5BBD\u7684\u4E00\u6A2A\u6761 */\n flex: 1;\n}\n\n/* rail(\u6298\u53E0)\u6001:footerActions \u6536\u7F29\u4E3A\u5C45\u4E2D\u5185\u5BB9\u5BBD,wrap \u4E0D\u53C2\u4E0E\u62C9\u4F38 */\n.dsh-a6-side-btn-wrap.rail {\n flex: none;\n width: auto;\n}\n\n/* \u539F\u751F\u98CE\u683C:\u5BF9\u9F50\u8BBE\u7F6E\u6309\u94AE(42px \u900F\u660E\u5E7D\u7075\u6309\u94AE,\u65E0\u8FB9\u6846\u65E0\u5E95\u8272,label-primary \u6587\u5B57,\n hover \u7528 shell \u4EA4\u4E92\u5E95\u8272;rail \u6298\u53E0\u6001 36px \u5706) */\n.dsh-a6-side-btn {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n width: calc(100% + 4px);\n min-width: 0;\n height: 42px;\n margin: 4px -2px;\n padding: 0 10px 0 8px;\n border: none;\n border-radius: 12px;\n background: transparent;\n color: var(--dsw-alias-label-primary, #0f172a);\n cursor: pointer;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n transition: background 0.15s;\n}\n\n.dsh-a6-side-btn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(148, 163, 184, 0.16));\n}\n\n.dsh-a6-side-btn:disabled {\n cursor: default;\n opacity: 0.4;\n}\n\n/* rail(\u4FA7\u8FB9\u680F\u6298\u53E0)\u6001:36px \u5706\u5F62\u5355\u8272\u56FE\u6807,\u4E0E\u8BBE\u7F6E\u6309\u94AE\u4E00\u81F4 */\n.dsh-a6-side-btn.rail {\n width: 36px;\n height: 36px;\n margin: 0;\n padding: 0;\n justify-content: center;\n gap: 0;\n border-radius: 50%;\n}\n\n.dsh-a6-side-btn.rail:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(148, 163, 184, 0.16));\n}\n\n/* \u9F7F\u8F6E\u56FE\u6807:\u4E0E\u8BBE\u7F6E\u6309\u94AE\u540C\u6B3E(currentColor \u8DDF\u968F\u6587\u5B57\u8272;rail \u6001 18px \u4E0E\u8BBE\u7F6E\u4E00\u81F4) */\n.dsh-a6-side-btn-badge {\n flex: none;\n width: 16px;\n height: 16px;\n}\n\n.dsh-a6-side-btn.rail .dsh-a6-side-btn-badge {\n width: 18px;\n height: 18px;\n}\n\n.dsh-a6-side-btn-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* \u5F39\u51FA\u5361\u7247\u6D6E\u5C42:\u951A\u5B9A\u6309\u94AE,\u5411\u4E0A\u5C55\u5F00 */\n.dsh-a6-side-popup {\n position: fixed;\n z-index: 2147483000;\n width: min(500px, calc(100vw - 16px));\n max-height: calc(100vh - 16px);\n overflow-y: auto;\n overscroll-behavior: contain;\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n border: 1px solid var(--dsw-alias-border-l1, #e2e8f0);\n border-radius: 12px;\n box-shadow: 0 12px 36px rgba(0, 0, 0, 0.16), 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 10px;\n animation: dsh-a6-popup-up 0.18s ease-out;\n}\n\n@keyframes dsh-a6-popup-up {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n\n.dsh-a6-side-popup-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 28px 16px;\n color: var(--dsw-alias-label-secondary, #64748b);\n font-size: 13px;\n}\n\n.dsh-a6-side-popup-hint {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n/* \u975E A6api \u4F1A\u8BDD:\u6A21\u578B\u5361\u7247\u533A\u57DF\u6574\u4F53\u7F6E\u7070(\u53BB\u8272 + \u964D\u900F\u660E\u5EA6 + \u7981\u4EA4\u4E92),\u9876\u90E8\u8D26\u6237\u80F6\u56CA\u4E0D\u53D7\u5F71\u54CD */\n.dsh-a6-side-card-dimmed {\n filter: grayscale(1);\n opacity: 0.45;\n pointer-events: none;\n user-select: none;\n}\n\n/* \u6D6E\u5C42\u5185\u7981\u7528 CSS \u4F2A\u5143\u7D20 tooltip:JS portal tooltip \u6709 30ms \u5EF6\u8FDF,\u907F\u514D\u53CC\u63D0\u793A\u4E14\u4F2A\u5143\u7D20\u4F1A\u88AB overflow \u88C1\u526A */\n.dsh-a6-side-popup [data-tooltip]::after,\n.dsh-a6-side-popup [data-tooltip]::before {\n display: none;\n}\n\n/* \u6D6E\u5C42\u9876\u90E8\u8D26\u6237\u901F\u89C8\u80F6\u56CA\u884C:\u4E0E\u8BBE\u7F6E\u9875\u5934\u90E8\u540C\u6B3E\u89C6\u89C9,\u7F29\u7A84\u7D27\u51D1\u7248(\u4F59\u989D\u7EAF\u5C55\u793A + \u4EF7\u683C\u6CE2\u52A8\u53EF\u8DF3 + \u6A21\u578B\u5E02\u573A\u76F4\u8FBE) */\n.dsh-a6-side-pills {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n padding: 2px 2px 10px;\n margin-bottom: 10px;\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n}\n\n.dsh-a6-side-pills .dsh-a6-header-balance-badge,\n.dsh-a6-side-pills .dsh-a6-price-pill,\n.dsh-a6-side-pills .dsh-a6-market-pill {\n padding: 3px 10px;\n min-height: 24px;\n font-size: 11px;\n /* \u4F59\u989D\u80F6\u56CA\u57FA\u7C7B\u65E0 border-box/line-height\uFF0C\u8865\u4E0A\u4E0E\u4EF7\u683C\u80F6\u56CA\u4E00\u81F4\uFF0C\u4FDD\u8BC1\u4E24\u679A\u80F6\u56CA\u7B49\u9AD8 */\n box-sizing: border-box;\n line-height: 1;\n}\n\n.dsh-a6-side-pills .dsh-a6-price-pill-count,\n.dsh-a6-side-pills .dsh-a6-price-pill-label,\n.dsh-a6-side-pills .dsh-a6-hb-amount,\n.dsh-a6-side-pills .dsh-a6-hb-label,\n.dsh-a6-side-pills .dsh-a6-market-pill-label {\n font-size: 12px;\n line-height: 1;\n}\n\n/* \u6D6E\u5C42\u5185\u4F59\u989D\u80F6\u56CA\u4E3A\u7EAF\u5C55\u793A:\u7981\u6389\u8BBE\u7F6E\u9875\u7684 hover \u53CD\u9988\u4E0E\u624B\u578B(\u9700\u5199\u5728\u901A\u7528 hover \u89C4\u5219\u4E4B\u540E) */\n.dsh-a6-side-balance-pill,\n.dsh-a6-side-balance-pill:hover {\n cursor: default;\n border-color: var(--dsw-alias-border-l2, #e2e8f0);\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n}\n\n\n/* ===== \u6A21\u578B\u76EE\u5F55\u9875 ===== */\n.dsh-a6-catalog-page {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.dsh-a6-catalog-toolbar {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-catalog-count {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n margin-left: 4px;\n}\n\n.dsh-a6-catalog-msg {\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 12px;\n line-height: 1.5;\n}\n.dsh-a6-catalog-msg.ok {\n background: rgba(16, 185, 129, 0.08);\n border: 1px solid rgba(16, 185, 129, 0.3);\n color: #047857;\n}\n.dsh-a6-catalog-msg.err {\n background: rgba(239, 68, 68, 0.08);\n border: 1px solid rgba(239, 68, 68, 0.3);\n color: #b91c1c;\n}\n\n.dsh-a6-catalog-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.dsh-a6-catalog-row {\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.dsh-a6-catalog-row.editing {\n border-color: #10b981;\n}\n\n/* \u7B2C\u4E00\u884C\uFF1A\u6A21\u578B ID + \u53EF\u7528\u5FBD\u7AE0 + \u540D\u79F0 + \u64CD\u4F5C\uFF08\u53C2\u6570\u7EDF\u4E00\u5728 ID \u4E0B\u65B9\uFF09 */\n.dsh-a6-catalog-row-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-catalog-badge {\n font-size: 10px;\n font-weight: 600;\n padding: 1px 7px;\n border-radius: 9px;\n vertical-align: middle;\n white-space: nowrap;\n}\n.dsh-a6-catalog-badge.avail {\n background: rgba(16, 185, 129, 0.12);\n border: 1px solid rgba(16, 185, 129, 0.35);\n color: #047857;\n}\n\n.dsh-a6-catalog-filters {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n margin-top: 4px;\n}\n\n.dsh-a6-catalog-id {\n display: inline-flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n}\n.dsh-a6-catalog-id code {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n.dsh-a6-catalog-name {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #64748b);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.dsh-a6-catalog-meta {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.dsh-a6-catalog-param {\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 10px;\n background: rgba(16, 185, 129, 0.08);\n border: 1px solid rgba(16, 185, 129, 0.25);\n color: #047857;\n white-space: nowrap;\n}\n.dsh-a6-catalog-param.empty {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.04));\n border-color: var(--dsw-alias-border-l3, #cbd5e1);\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-catalog-row-actions {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n margin-left: auto;\n}\n\n/* \u884C\u5185\u7F16\u8F91\u8868\u5355 */\n.dsh-a6-catalog-edit {\n border-top: 1px dashed var(--dsw-alias-border-l2, #e2e8f0);\n padding-top: 10px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.dsh-a6-edit-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: 10px;\n}\n\n.dsh-a6-edit-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n.dsh-a6-edit-wide {\n grid-column: 1 / -1;\n}\n\n.dsh-a6-checkbox-group {\n display: inline-flex;\n gap: 14px;\n align-items: center;\n padding: 6px 0;\n}\n.dsh-a6-checkbox {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n color: var(--dsw-alias-label-primary, #0f172a);\n cursor: pointer;\n user-select: none;\n}\n\n.dsh-a6-edit-actions {\n display: inline-flex;\n gap: 8px;\n justify-content: flex-end;\n}\n\n/* \u6E05\u7A7A\u76EE\u5F55\u786E\u8BA4\u6001\uFF1A\u7EA2\u8272\u9AD8\u4EAE\u63D0\u793A\u4E8C\u6B21\u70B9\u51FB\u751F\u6548 */\n.dsh-a6-btn-clear-confirm {\n background: #ef4444 !important;\n border-color: #ef4444 !important;\n color: #ffffff !important;\n}\n"],
5
- "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
4
+ "sourcesContent": ["import React from 'react';\nimport { A6ApiSettingsPanel } from './components/A6ApiSettings.js';\nimport { A6ApiSidebarCard } from './components/A6ApiSidebarCard.js';\nimport mainCss from './styles/main.css';\nimport { store } from './store.js';\n\nexport const name = '@lynn123411/dsh-a6api';\nexport const inject = ['slots'];\n\nfunction injectStyles() {\n if (typeof document === 'undefined') return;\n const styleId = 'dsh-a6api-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = mainCss;\n document.head.appendChild(style);\n }\n}\n\nfunction setupGlobalTooltip(): (() => void) | void {\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n if ((window as any).__dsh_a6api_tooltip_setup) return () => {};\n (window as any).__dsh_a6api_tooltip_setup = true;\n\n const portalId = 'dsh-a6api-tooltip';\n const arrowId = 'dsh-a6api-tooltip-arrow';\n let portal: HTMLElement | null = document.getElementById(portalId) as HTMLElement | null;\n let arrow: HTMLElement | null = document.getElementById(arrowId) as HTMLElement | null;\n if (!portal) {\n portal = document.createElement('div');\n portal.id = portalId;\n portal.setAttribute('role', 'tooltip');\n portal.style.cssText = 'position:fixed;left:0;top:0;transform:translate(-9999px,-9999px);padding:6px 10px;background:rgba(15,23,42,0.96);color:#f8fafc;font-size:11px;line-height:1.4;border-radius:6px;box-shadow:0 6px 18px rgba(0,0,0,0.28);border:1px solid rgba(255,255,255,0.12);max-width:min(320px,85vw);width:max-content;white-space:normal;word-break:break-word;overflow-wrap:anywhere;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transition:opacity 0.08s;z-index:2147483647;';\n document.body.appendChild(portal);\n }\n if (!arrow) {\n arrow = document.createElement('div');\n arrow.id = arrowId;\n arrow.style.cssText = 'position:fixed;left:0;top:0;width:8px;height:8px;background:rgba(15,23,42,0.96);transform:translate(-9999px,-9999px) rotate(45deg);border-left:1px solid rgba(255,255,255,0.12);border-top:1px solid rgba(255,255,255,0.12);pointer-events:none;opacity:0;visibility:hidden;z-index:2147483646;';\n document.body.appendChild(arrow);\n }\n\n let currentTarget: Element | null = null;\n\n function hide() {\n if (!portal || !arrow) return;\n portal.style.opacity = '0';\n (portal as HTMLElement).style.visibility = 'hidden';\n arrow.style.opacity = '0';\n (arrow as HTMLElement).style.visibility = 'hidden';\n document.body.classList.remove('dsh-a6api-tooltip-active');\n currentTarget = null;\n }\n\n function position(target: Element) {\n if (!portal || !arrow || !target) return;\n const text = target.getAttribute('data-tooltip');\n if (!text) return;\n (portal as HTMLElement).textContent = text;\n (portal as HTMLElement).style.visibility = 'hidden';\n (portal as HTMLElement).style.opacity = '0';\n (portal as HTMLElement).style.transform = 'translate(-9999px,-9999px)';\n (portal as HTMLElement).style.visibility = 'visible';\n const ttRect = (portal as HTMLElement).getBoundingClientRect();\n (portal as HTMLElement).style.visibility = 'hidden';\n const rect = target.getBoundingClientRect();\n const gap = 8;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const margin = 8;\n\n let pos = target.getAttribute('data-tooltip-pos') || '';\n if (!pos) {\n const spaceAbove = rect.top;\n const spaceBelow = vh - rect.bottom;\n if (spaceAbove < ttRect.height + gap + 12 && spaceBelow > spaceAbove) pos = 'down';\n else pos = 'top';\n }\n\n let top = 0;\n let left = 0;\n let arrowTop = 0;\n let arrowLeft = 0;\n const isDown = pos.startsWith('down');\n\n if (isDown) {\n top = rect.bottom + gap;\n arrowTop = rect.bottom + gap - 4;\n } else {\n top = rect.top - ttRect.height - gap;\n arrowTop = rect.top - gap - 4;\n }\n\n if (pos === 'left') {\n left = rect.right - ttRect.width;\n arrowLeft = rect.right - 14;\n } else if (pos === 'right') {\n left = rect.left;\n arrowLeft = rect.left + 14;\n } else if (pos === 'down-left') {\n left = rect.right - ttRect.width;\n arrowLeft = rect.right - 14;\n } else if (pos === 'down-right') {\n left = rect.left;\n arrowLeft = rect.left + 14;\n } else {\n left = rect.left + rect.width / 2 - ttRect.width / 2;\n arrowLeft = rect.left + rect.width / 2 - 4;\n }\n\n left = Math.max(margin, Math.min(left, vw - ttRect.width - margin));\n const minArrow = left + 8;\n const maxArrow = left + ttRect.width - 12;\n arrowLeft = Math.max(minArrow, Math.min(arrowLeft, maxArrow));\n\n if (top < margin) top = margin;\n if (top + ttRect.height > vh - margin) top = vh - ttRect.height - margin;\n\n (portal as HTMLElement).style.transform = 'translate(' + left + 'px,' + top + 'px)';\n (portal as HTMLElement).style.visibility = 'visible';\n (portal as HTMLElement).style.opacity = '1';\n (arrow as HTMLElement).style.transform = 'translate(' + arrowLeft + 'px,' + arrowTop + 'px) rotate(45deg)';\n (arrow as HTMLElement).style.visibility = 'visible';\n (arrow as HTMLElement).style.opacity = '1';\n document.body.classList.add('dsh-a6api-tooltip-active');\n }\n\n let hoverTimer: any = null;\n const onMouseOver = (e: any) => {\n const target = e.target && e.target.closest ? e.target.closest('[data-tooltip]') : null;\n if (!target) return;\n currentTarget = target;\n if (hoverTimer) clearTimeout(hoverTimer);\n hoverTimer = setTimeout(() => {\n if (currentTarget === target) position(target);\n }, 30);\n };\n const onMouseOut = (e: any) => {\n const target = e.target && e.target.closest ? e.target.closest('[data-tooltip]') : null;\n if (!target) return;\n const related = e.relatedTarget as Element | null;\n if (related && target.contains(related)) return;\n if (currentTarget === target) {\n if (hoverTimer) clearTimeout(hoverTimer);\n hide();\n }\n };\n const onFocusIn = (e: any) => {\n const target = e.target && e.target.closest ? e.target.closest('[data-tooltip]') : null;\n if (!target) return;\n currentTarget = target;\n position(target);\n };\n const onFocusOut = (e: any) => {\n const target = e.target && e.target.closest ? e.target.closest('[data-tooltip]') : null;\n if (!target) return;\n if (currentTarget === target) hide();\n };\n const onScrollOrResize = () => {\n if (currentTarget) {\n if (document.body.contains(currentTarget) && (currentTarget as any).matches && (currentTarget as HTMLElement).matches(':hover')) {\n position(currentTarget);\n } else if (document.activeElement === currentTarget) {\n position(currentTarget);\n } else {\n hide();\n }\n }\n };\n\n document.addEventListener('mouseover', onMouseOver, true);\n document.addEventListener('mouseout', onMouseOut, true);\n document.addEventListener('focusin', onFocusIn, true);\n document.addEventListener('focusout', onFocusOut, true);\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize);\n document.addEventListener('scroll', onScrollOrResize, true);\n\n return () => {\n document.removeEventListener('mouseover', onMouseOver, true);\n document.removeEventListener('mouseout', onMouseOut, true);\n document.removeEventListener('focusin', onFocusIn, true);\n document.removeEventListener('focusout', onFocusOut, true);\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize);\n document.removeEventListener('scroll', onScrollOrResize, true);\n if (hoverTimer) clearTimeout(hoverTimer);\n try { portal?.remove(); } catch {}\n try { arrow?.remove(); } catch {}\n document.body.classList.remove('dsh-a6api-tooltip-active');\n try { delete (window as any).__dsh_a6api_tooltip_setup; } catch { (window as any).__dsh_a6api_tooltip_setup = undefined; }\n currentTarget = null;\n };\n}\n\nexport function apply(ctx: any): void {\n injectStyles();\n if (typeof window !== 'undefined') {\n try {\n ctx.effect(() => {\n const dispose = setupGlobalTooltip();\n return () => {\n try { if (typeof dispose === 'function') (dispose as any)(); } catch {}\n };\n }, 'dsh-a6api: tooltip portal');\n } catch {}\n }\n if (typeof window === 'undefined') return;\n // \u542F\u52A8\u9884\u70ED + \u540E\u53F0\u8F6E\u8BE2\uFF1A\u63D2\u4EF6\u968F DSH \u542F\u52A8\u5373\u540E\u53F0\u62C9\u53D6\u4E00\u6B21\u5B8C\u6574\u72B6\u6001\uFF08\u670D\u52A1\u7AEF /state \u5DF2\u5E76\u884C\u5316\uFF09\uFF0C\n // \u4E4B\u540E\u6BCF 60s \u6574\u4F53\u5237\u65B0 \u2014\u2014 \u7528\u6237\u6253\u5F00\u4FA7\u8FB9\u680F\u6D6E\u5C42/\u8BBE\u7F6E\u9875\u65F6\u6570\u636E\u5DF2\u5C31\u7EEA\uFF0C\u79D2\u5F00\u65E0 spinner\n try {\n setTimeout(() => {\n try { store.warmUp(); } catch {}\n try { store.initPricePolling(); } catch {}\n }, 1500);\n } catch {}\n\n\n try {\n const slots = ctx?.slots || (ctx?.get ? ctx.get('slots') : null);\n if (!slots || typeof slots.inject !== 'function') return;\n\n slots.inject('settings.section', () => {\n return slots.register(\n {\n name: 'settings.section',\n id: 'dsh-a6api',\n // \u7EA6\u5B9A\uFF1A\u81EA\u6709\u63D2\u4EF6\u8BBE\u7F6E\u9879 order \u4ECE 110 \u8D77\u6B65\u8FDB 10\uFF08\u539F\u751F\u6700\u5927 100=\u684C\u9762\u8BBE\u7F6E\uFF09\uFF0C\u4FDD\u8BC1\u6392\u5728\u6240\u6709\u539F\u751F\u9879\u4E4B\u4E0B\n order: 120,\n label: () => 'A6api',\n },\n A6ApiSettingsPanel,\n );\n });\n\n // \u4FA7\u8FB9\u680F\u5DE6\u4E0B\u89D2\u300CA6api\u300D\u6309\u94AE:\u70B9\u51FB\u5411\u4E0A\u5F39\u51FA\u5F53\u524D\u4F1A\u8BDD A6api \u6A21\u578B\u7684 MerchantCard \u6D6E\u5C42\n // getter \u5728 apply \u95ED\u5305\u521B\u5EFA\u4E00\u6B21,\u5F15\u7528\u7A33\u5B9A,\u907F\u514D entry \u91CD\u6E32\u67D3\u89E6\u53D1\u7EC4\u4EF6 effect \u53CD\u590D\u91CD\u8BA2\u9605\n const getModelDirectories = () =>\n ctx && typeof ctx.get === 'function' ? ctx.get('modelDirectories') : undefined;\n slots.inject('sidebar.footer.action', () => {\n return slots.register(\n {\n name: 'sidebar.footer.action',\n id: 'dsh-a6api-current-model',\n order: -1,\n label: () => 'A6api',\n },\n (props: any) =>\n React.createElement(A6ApiSidebarCard, {\n ...(props || {}),\n getModelDirectories,\n }),\n );\n });\n } catch (err) {\n console.warn('[dsh-a6api] Failed to inject slots:', err);\n }\n}", "import React, { useState, useEffect } from 'react';\nimport { store, type StoreState } from '../store.js';\nimport { MerchantCard } from './MerchantCard.js';\nimport { AccountPanel } from './BalanceCard.js';\nimport { ConfigPanel } from './ConfigPanel.js';\nimport { PricePill } from './PricePill.js';\nimport { MarketPill } from './MarketPill.js';\nimport { ModelCatalogPanel } from './ModelCatalogPanel.js';\n\ntype TabKey = 'models' | 'catalog' | 'account' | 'config';\n\nexport const A6ApiSettingsPanel: React.FC = () => {\n const [state, setState] = useState<StoreState>(store.getState());\n const [activeTab, setActiveTab] = useState<TabKey>('models');\n const [filterMode, setFilterMode] = useState<'all' | 'enabled' | 'probed'>('all');\n const [searchQuery, setSearchQuery] = useState('');\n const [refreshing, setRefreshing] = useState(false);\n const [refreshSuccess, setRefreshSuccess] = useState(false);\n\n useEffect(() => {\n const unsub = store.subscribe(() => {\n setState({ ...store.getState() });\n });\n store.fetchState();\n return unsub;\n }, []);\n\n // \u5168\u91CF\u63A2\u6D4B\u7684\u8FD0\u884C\u6001\uFF08\u8FDB\u884C\u4E2D/\u8FDB\u5EA6/\u603B\u6570\uFF09\u7531 store \u9A71\u52A8\uFF0C\u7EC4\u4EF6\u53EA\u8BA2\u9605\uFF1B\n // \u53D6\u6D88/\u7ACB\u5373\u91CD\u5F00/\u9762\u677F\u91CD\u6302\u8F7D\u65F6\u6309\u94AE\u4E0E\u8BA1\u6570\u59CB\u7EC8\u4E0E\u961F\u5217\u771F\u5B9E\u72B6\u6001\u4E00\u81F4\n const handleProbeAll = () => {\n store.probeAll();\n };\n\n const handleCancelProbeAll = () => {\n store.cancelProbeAll();\n };\n\n const handleRefreshState = async () => {\n setRefreshing(true);\n await store.fetchState();\n setRefreshing(false);\n setRefreshSuccess(true);\n setTimeout(() => setRefreshSuccess(false), 2000);\n };\n\n const inDshCount = state.models.filter((m) => m.inDsh).length;\n const probedCount = state.models.filter((m) => Boolean(m.merchant)).length;\n\n const filteredModels = state.models.filter((m) => {\n if (filterMode === 'enabled' && !m.inDsh) return false;\n if (filterMode === 'probed' && !m.merchant) return false;\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase().trim();\n return (\n m.model_name.toLowerCase().includes(q) ||\n m.brand.toLowerCase().includes(q) ||\n (m.merchant?.supplier_name && m.merchant.supplier_name.toLowerCase().includes(q)) ||\n (m.merchant?.channel_name && m.merchant.channel_name.toLowerCase().includes(q)) ||\n (m.merchant?.description && m.merchant.description.toLowerCase().includes(q))\n );\n }\n return true;\n });\n\n // \u56FA\u5B9A\u6A21\u578B\u4F4D\u7F6E\uFF1A\u542F\u7528\u7684\u6392\u5728\u6700\u524D\u9762\uFF0C\u672A\u542F\u7528\u7684\u6392\u5728\u540E\u9762\uFF1B\u7EC4\u5185\u6309\u6A21\u578B\u540D\u79F0\u5B57\u6BCD\u7EDD\u5BF9\u7A33\u5B9A\u6392\u5E8F\n const sortedModels = [...filteredModels].sort((a, b) => {\n if (a.inDsh !== b.inDsh) {\n return a.inDsh ? -1 : 1;\n }\n return a.model_name.localeCompare(b.model_name);\n });\n\n return (\n <div className=\"dsh-a6-container\">\n {/* 1. Header Title & Description */}\n <div className=\"dsh-a6-main-header\">\n <div className=\"dsh-a6-header-text\">\n <h2 className=\"dsh-a6-main-title\">A6api</h2>\n <p className=\"dsh-a6-main-subtitle\">\n \u805A\u5408\u5168\u7403\u4E3B\u6D41\u4E0E\u9AD8\u6027\u4EF7\u6BD4\u6A21\u578B\uFF0C\u5B9E\u65F6\u76D1\u63A7\u5546\u6237\u6307\u6807\u3001\u4EF7\u683C\u500D\u7387\u4E0E\u8D26\u6237\u8D44\u4EA7\u3002\n </p>\n </div>\n\n <div className=\"dsh-a6-header-badges\">\n {state.balance?.hasAccountAuth && (\n <div\n className=\"dsh-a6-header-balance-badge\"\n onClick={() => setActiveTab('account')}\n title=\"\u70B9\u51FB\u5207\u6362\u81F3\u300C\u8D26\u6237\u8D44\u4EA7\u300D\u9875\u9762\"\n >\n <span className=\"dsh-a6-hb-label\">\u8D26\u6237\u4F59\u989D:</span>\n <span className=\"dsh-a6-hb-amount\">{state.balance.accountBalanceFormatted}</span>\n </div>\n )}\n <PricePill pf={state.priceFluctuation} hasToken={Boolean(state.config?.hasToken)} />\n <MarketPill />\n </div>\n </div>\n\n {/* 2. Top Navigation Tabs */}\n <div className=\"dsh-a6-nav-tabs\">\n <button\n type=\"button\"\n className={`dsh-a6-nav-tab ${activeTab === 'models' ? 'active' : ''}`}\n onClick={() => setActiveTab('models')}\n >\n <span>\u53EF\u7528\u6A21\u578B</span>\n <span className=\"dsh-a6-tab-badge\">{state.models.length}</span>\n </button>\n\n <button\n type=\"button\"\n className={`dsh-a6-nav-tab ${activeTab === 'catalog' ? 'active' : ''}`}\n onClick={() => setActiveTab('catalog')}\n >\n <span>\u6A21\u578B\u76EE\u5F55</span>\n {state.catalog.length > 0 && <span className=\"dsh-a6-tab-badge\">{state.catalog.length}</span>}\n </button>\n\n <button\n type=\"button\"\n className={`dsh-a6-nav-tab ${activeTab === 'account' ? 'active' : ''}`}\n onClick={() => setActiveTab('account')}\n >\n <span>\u8D26\u6237\u8D44\u4EA7</span>\n {state.balance?.hasAccountAuth && (\n <span className=\"dsh-a6-tab-badge success\">\n {state.balance.accountBalanceFormatted}\n </span>\n )}\n </button>\n\n <button\n type=\"button\"\n className={`dsh-a6-nav-tab ${activeTab === 'config' ? 'active' : ''}`}\n onClick={() => setActiveTab('config')}\n >\n <span>\u57FA\u7840\u914D\u7F6E</span>\n </button>\n </div>\n\n {/* 3. Tab Content Pages */}\n {activeTab === 'catalog' && (\n <div className=\"dsh-a6-tab-page catalog-page\">\n <ModelCatalogPanel />\n </div>\n )}\n\n {activeTab === 'models' && (\n <div className=\"dsh-a6-tab-page models-page\">\n {/* Models Section Toolbar */}\n <div className=\"dsh-a6-section-header\">\n <div className=\"dsh-a6-filter-group\">\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${filterMode === 'all' ? 'active' : ''}`}\n onClick={() => setFilterMode('all')}\n >\n \u5168\u90E8 ({state.models.length})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${filterMode === 'enabled' ? 'active' : ''}`}\n onClick={() => setFilterMode('enabled')}\n >\n \u5DF2\u542F\u7528 ({inDshCount})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${filterMode === 'probed' ? 'active' : ''}`}\n onClick={() => setFilterMode('probed')}\n >\n \u5DF2\u63A2\u6D4B ({probedCount})\n </button>\n </div>\n\n <div className=\"dsh-a6-toolbar-right\">\n <div className=\"dsh-a6-search-wrapper\">\n <input\n type=\"text\"\n className=\"dsh-a6-input dsh-a6-search-input\"\n placeholder=\"\u641C\u7D22\u6A21\u578B / \u4F9B\u5E94\u5546 / \u6E20\u9053...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n {searchQuery && (\n <button\n type=\"button\"\n className=\"dsh-a6-clear-btn\"\n onClick={() => setSearchQuery('')}\n title=\"\u6E05\u7A7A\u641C\u7D22\"\n >\n \u00D7\n </button>\n )}\n </div>\n\n <button\n type=\"button\"\n className={`dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm ${refreshSuccess ? 'dsh-a6-btn-refresh-ok' : ''}`}\n onClick={handleRefreshState}\n disabled={refreshing || state.probeAllActive}\n data-tooltip={\n state.probeAllActive\n ? '\u5168\u91CF\u63A2\u6D4B\u8FDB\u884C\u4E2D\uFF0C\u5B8C\u6210\u540E\u53EF\u5237\u65B0'\n : '\u91CD\u65B0\u5411 A6API \u63A5\u53E3\u62C9\u53D6\u5F53\u524D\u4EE4\u724C\u7684\u53EF\u7528\u6A21\u578B\u5217\u8868\u53CA\u5DF2\u7F13\u5B58\u5546\u6237\u6307\u6807\uFF08\u4E0D\u6D88\u8017 Token\uFF09'\n }\n data-tooltip-pos=\"down\"\n >\n {refreshing ? '\u5237\u65B0\u4E2D...' : refreshSuccess ? '\u5DF2\u5237\u65B0 \u2713' : '\u5237\u65B0\u5217\u8868'}\n </button>\n\n {state.probeAllActive ? (\n <>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n disabled\n data-tooltip=\"\u6B63\u5728\u5E76\u53D1\u63A2\u6D4B\u5168\u90E8\u6A21\u578B\uFF0C\u5361\u7247\u9010\u4E2A\u56DE\u586B\u7ED3\u679C\"\n data-tooltip-pos=\"down-left\"\n >\n \u5168\u91CF\u63A2\u6D4B\u4E2D {state.probeAllDoneCount}/{state.probeAllTotal}\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-danger dsh-a6-btn-sm\"\n onClick={handleCancelProbeAll}\n data-tooltip=\"\u505C\u6B62\u53D6\u65B0\u4EFB\u52A1\uFF0C\u5DF2\u5728\u63A2\u6D4B\u4E2D\u7684\u6A21\u578B\u4F1A\u6B63\u5E38\u5B8C\u6210\u5E76\u56DE\u586B\"\n data-tooltip-pos=\"down-left\"\n >\n \u53D6\u6D88\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={handleProbeAll}\n disabled={state.models.length === 0}\n data-tooltip=\"\u5BF9\u5F53\u524D\u4EE4\u724C\u652F\u6301\u7684\u6240\u6709\u6A21\u578B\u5E76\u53D1\u53D1\u9001\u8BF7\u6C42\uFF0C\u6279\u91CF\u6355\u83B7\u5546\u6237\u8DEF\u7531\u4E0E\u6700\u65B0\u884C\u60C5\uFF08\u6BCF\u4E2A\u6A21\u578B\u6D88\u8017\u5C11\u91CFToken\uFF0C\u9047\u9650\u6D41\u81EA\u52A8\u91CD\u8BD5\uFF09\"\n data-tooltip-pos=\"down-left\"\n >\n \u4E00\u952E\u5168\u91CF\u63A2\u6D4B\n </button>\n )}\n </div>\n </div>\n\n {/* Model Cards List */}\n <div className=\"dsh-a6-cards-list\">\n {state.loading && state.models.length === 0 ? (\n <div className=\"dsh-a6-empty-state\">\n <div className=\"dsh-a6-spinner\" />\n <span>\u6B63\u5728\u8FDE\u63A5 A6API \u805A\u5408\u7AD9\u5E76\u52A0\u8F7D\u6A21\u578B\u884C\u60C5...</span>\n </div>\n ) : sortedModels.length > 0 ? (\n sortedModels.map((m) => (\n <MerchantCard key={m.model_name} model={m} />\n ))\n ) : (\n <div className=\"dsh-a6-empty-state\">\n {searchQuery ? (\n <span>\u672A\u641C\u7D22\u5230\u5339\u914D\u300C{searchQuery}\u300D\u7684\u6A21\u578B</span>\n ) : filterMode === 'enabled' ? (\n <span>\n \u5F53\u524D\u5C1A\u672A\u5728 DSH \u4E2D\u542F\u7528\u4EFB\u4F55 A6API \u6A21\u578B\uFF0C\u70B9\u51FB\u6A21\u578B\u5361\u7247\u53F3\u4FA7\u300C\u6DFB\u52A0\u5230 DSH\u300D\u5373\u53EF\u542F\u7528\u3002\n </span>\n ) : filterMode === 'probed' ? (\n <span>\n \u5C1A\u672A\u63A2\u6D4B\u4EFB\u4F55\u6A21\u578B\u5546\u6237\u7EBF\u8DEF\uFF0C\u70B9\u51FB\u6A21\u578B\u5361\u7247\u4E0A\u7684\u300C\u63A2\u6D4B\u5546\u5BB6\u300D\u6216\u4E0A\u65B9\u300C\u4E00\u952E\u5168\u91CF\u63A2\u6D4B\u300D\u5373\u53EF\u5F00\u59CB\u3002\n </span>\n ) : !state.config.hasApiKey ? (\n <span>\n \u8BF7\u524D\u5F80\u300C\u57FA\u7840\u914D\u7F6E\u300D\u9875\u9762\u586B\u5165\u60A8\u7684 A6API \u4EE4\u724C (API Key) \u5E76\u4FDD\u5B58\uFF0C\u5373\u53EF\u81EA\u52A8\u52A0\u8F7D\u53EF\u7528\u6A21\u578B\u5217\u8868\u3002\n </span>\n ) : (\n <span>\u5F53\u524D\u4EE4\u724C\u6682\u65E0\u53EF\u7528\u6A21\u578B\uFF0C\u8BF7\u68C0\u67E5 A6API \u63A7\u5236\u53F0\u4E2D\u7684\u4EE4\u724C\u9650\u5236\u8BBE\u7F6E\u3002</span>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {activeTab === 'account' && (\n <div className=\"dsh-a6-tab-page account-page\">\n <AccountPanel\n balance={state.balance}\n config={state.config}\n recentLogs={state.recentLogs}\n onNavigateToConfig={() => setActiveTab('config')}\n />\n </div>\n )}\n\n {activeTab === 'config' && (\n <div className=\"dsh-a6-tab-page config-page\">\n <ConfigPanel\n config={state.config}\n dshConfiguredModels={state.dshConfiguredModels}\n />\n </div>\n )}\n </div>\n );\n};", "import type {\n A6ApiConfig,\n A6ApiStateResponse,\n BalanceInfo,\n CatalogModelEntry,\n ModelCardData,\n ApiRoutingLogItem,\n PriceFluctuationState,\n MarketplacePin,\n} from '../types.js';\n\nfunction formatRelativeNow(tsSec: number): string {\n const diff = Math.floor(Date.now() / 1000) - tsSec;\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\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/** \u9650\u6D41\u7279\u5F81\uFF1A\u7F51\u5173 429 / Too Many Requests / rate limit\uFF08Key \u7EA7\u5E76\u53D1\u9650\u5236\u65F6\u51FA\u73B0\uFF1B\\b429\\b \u907F\u514D\u8BEF\u4F24\u4E0A\u6E38\u9519\u8BEF\u7801\u5982 42901\uFF09 */\nconst RATE_LIMIT_RE = /\\b429\\b|Too Many Requests|rate\\s*limit/i;\n\nexport interface StoreState {\n loading: boolean;\n config: A6ApiConfig;\n balance: BalanceInfo | null;\n models: ModelCardData[];\n dshConfiguredModels: string[];\n recentLogs: ApiRoutingLogItem[];\n probingModelNames: Set<string>;\n /** \u6B63\u5728\u6267\u884C\u56FA\u5B9A/\u53D6\u6D88\u56FA\u5B9A/\u7981\u7528/\u6062\u590D\u64CD\u4F5C\u7684\u6A21\u578B */\n actionBusyModels: Set<string>;\n /** \u5168\u91CF\u63A2\u6D4B\u662F\u5426\u8FDB\u884C\u4E2D\uFF08store \u9A71\u52A8 UI\uFF1A\u8FDB\u5EA6\u3001\u53D6\u6D88\u6309\u94AE\u3001\u91CD\u5165\u9632\u62A4\uFF09 */\n probeAllActive: boolean;\n /** \u5168\u91CF\u63A2\u6D4B\u603B\u6A21\u578B\u6570\uFF08\u5165\u961F\u65F6\u5FEB\u7167\uFF09 */\n probeAllTotal: number;\n /** \u5168\u91CF\u63A2\u6D4B\u5DF2\u5B8C\u6210\u6570\uFF08\u4E0E state.models \u89E3\u8026\uFF0C/state \u5237\u65B0\u4E0D\u4E22\uFF09 */\n probeAllDoneCount: number;\n /** \u5E73\u53F0\u56FA\u5B9A\u8BB0\u5F55\uFF08\u5361\u7247\u72B6\u6001\u8DDF\u968F\u5B98\u7F51\uFF09 */\n pins: MarketplacePin[];\n /** \u6A21\u578B\u76EE\u5F55\uFF08\u8FD0\u884C\u65F6 JSON\uFF0C\u5B57\u6BB5 = settings.yaml \u539F\u751F\u6A21\u578B\u5B57\u6BB5 + brand\uFF09 */\n catalog: CatalogModelEntry[];\n /** \u76EE\u5F55\u64CD\u4F5C\u8FDB\u884C\u4E2D\uFF08\u83B7\u53D6\u5E02\u573A\u6A21\u578B / OpenRouter \u67E5\u8BE2\uFF09 */\n catalogBusy: 'fetch' | 'query' | null;\n error: string | null;\n priceFluctuation: PriceFluctuationState;\n}\n\ntype Listener = () => void;\n\nclass A6ApiStore {\n private state: StoreState = {\n loading: true,\n config: {\n baseURL: 'https://api.a6api.com',\n apiKey: '',\n userId: '',\n activeModels: [],\n },\n balance: null,\n models: [],\n dshConfiguredModels: [],\n recentLogs: [],\n probingModelNames: new Set(),\n actionBusyModels: new Set(),\n probeAllActive: false,\n probeAllTotal: 0,\n probeAllDoneCount: 0,\n pins: [],\n catalog: [],\n catalogBusy: null,\n error: null,\n priceFluctuation: { pendingCount: 0, unseenCount: 0, totalCount: 0, updatedAt: null } as any,\n };\n\n private listeners: Set<Listener> = new Set();\n private autoRefreshTimer: any = null;\n /** \u542F\u52A8\u9884\u70ED\u5DF2\u89E6\u53D1\uFF08\u5E42\u7B49\uFF09\uFF1A\u63D2\u4EF6\u968F DSH \u542F\u52A8\u5373\u540E\u53F0\u62C9\u4E00\u6B21\u5B8C\u6574\u72B6\u6001 */\n private warmedUp = false;\n /** \u5168\u91CF\u63A2\u6D4B\u53D6\u6D88\u6807\u5FD7\uFF1A\u7F6E\u4F4D\u540E\u4E0D\u518D\u4ECE\u961F\u5217\u53D6\u65B0\u4EFB\u52A1\uFF0C\u5728\u9014\u63A2\u6D4B\u6B63\u5E38\u5B8C\u6210 */\n private probeCancelled = false;\n /** \u672C\u8F6E\u5168\u91CF\u63A2\u6D4B\u7684\u6A21\u578B\u540D\u5FEB\u7167\uFF08null = \u672A\u5728\u8FD0\u884C\uFF09\uFF0C\u7528\u4E8E\u8FDB\u5EA6\u8BA1\u6570\u4E0E /state \u5237\u65B0\u540E\u91CD\u6302\u72B6\u6001 */\n private probeAllSnapshot: string[] | null = null;\n /** \u672C\u8F6E\u5DF2\u5B8C\u6210\u63A2\u6D4B\u7684\u6A21\u578B\uFF08\u5E42\u7B49\u96C6\u5408\uFF0C\u9A71\u52A8 probeAllDoneCount\uFF09 */\n private probeAllDone = new Set<string>();\n /** \u5165\u961F\u524D\u5404\u6A21\u578B\u7684 probeError \u6682\u5B58\uFF0C\u53D6\u6D88\u65F6\u6062\u590D\u5386\u53F2\u9519\u8BEF\u63D0\u793A */\n private probeQueuedPrevError = new Map<string, string | undefined>();\n\n constructor() {\n this.startAutoRefresh();\n }\n\n public subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify() {\n for (const l of this.listeners) {\n try {\n l();\n } catch (err) {\n console.error('[dsh-a6api] listener error:', err);\n }\n }\n }\n\n public getState(): StoreState {\n return this.state;\n }\n\n public async fetchState(): Promise<void> {\n this.state.loading = true;\n this.notify();\n try {\n const res = await fetch('/api/dsh-a6api/state');\n if (res.ok) {\n const json = await res.json();\n if (json?.data) {\n const data: A6ApiStateResponse = json.data;\n this.state.config = data.config;\n this.state.balance = data.balance;\n this.state.models = data.models;\n // \u5168\u91CF\u63A2\u6D4B\u8FDB\u884C\u4E2D\uFF1A/state \u53EA\u4EA7 idle/success\uFF0C\u91CD\u6302 queued/probing\uFF0C\n // \u907F\u514D\u300C\u5237\u65B0\u5217\u8868 / \u56FA\u5B9A\u64CD\u4F5C / \u8F6E\u8BE2\u53D1\u73B0 pins \u53D8\u5316\u300D\u7B49 fetchState \u6253\u65AD\u6392\u961F\u4E0E\u8FDB\u5EA6\u8BA1\u6570\n const snapshot = this.probeAllSnapshot;\n if (this.state.probeAllActive && snapshot) {\n this.state.models = this.state.models.map((m) => {\n if (this.state.probingModelNames.has(m.model_name)) {\n return { ...m, probeStatus: 'probing' as const };\n }\n if (snapshot.includes(m.model_name) && !this.probeAllDone.has(m.model_name)) {\n return { ...m, probeStatus: 'queued' as const, probeError: undefined };\n }\n return m;\n });\n }\n this.state.dshConfiguredModels = data.dshConfiguredModels;\n if (Array.isArray(data.pins)) {\n this.state.pins = data.pins;\n }\n if (data.recentLogs) {\n this.state.recentLogs = data.recentLogs;\n }\n this.state.error = null;\n // \u82E5\u5DF2\u914D token\uFF0C\u987A\u5E26\u5237\u65B0\u4EF7\u683C\u6CE2\u52A8\uFF08\u9632\u91CD\u590D\uFF1A10s \u5185\u5DF2\u62C9\u8FC7\u5219\u8DF3\u8FC7\uFF09\n if (this.state.config?.hasToken) {\n const last = (this.state.priceFluctuation as any)?.updatedAt;\n if (!last || Date.now() - last > 10000) {\n this.fetchPriceFluctuation().catch(() => {});\n }\n }\n }\n }\n } catch (err: any) {\n this.state.error = err?.message || String(err);\n } finally {\n this.state.loading = false;\n this.notify();\n }\n }\n\n public async saveConfig(config: Partial<A6ApiConfig>): Promise<boolean> {\n try {\n const res = await fetch('/api/dsh-a6api/config', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(config),\n });\n if (res.ok) {\n await this.fetchState();\n return true;\n }\n } catch (err: any) {\n this.state.error = err?.message || String(err);\n this.notify();\n }\n return false;\n }\n\n public async refreshBalance(): Promise<void> {\n try {\n const res = await fetch('/api/dsh-a6api/balance');\n if (res.ok) {\n const json = await res.json();\n if (json?.balance) {\n this.state.balance = json.balance;\n }\n if (json?.recentLogs) {\n this.state.recentLogs = json.recentLogs;\n }\n this.notify();\n }\n } catch {}\n }\n\n // ===== \u6A21\u578B\u76EE\u5F55 =====\n\n public async fetchCatalog(): Promise<void> {\n try {\n const res = await fetch('/api/dsh-a6api/catalog');\n if (res.ok) {\n const json = await res.json();\n if (Array.isArray(json?.catalog)) {\n this.state.catalog = json.catalog;\n this.notify();\n }\n }\n } catch {}\n }\n\n /** \u4ECE A6API \u5E02\u573A\u62C9\u53D6\u5168\u90E8\u6A21\u578B ID \u5E76\u5165\u76EE\u5F55\uFF08\u4EC5\u65B0\u589E/\u8865\u54C1\u724C\uFF0C\u4E0D\u52A8\u5DF2\u6709\u53C2\u6570\uFF09 */\n public async fetchMarketModels(): Promise<{ ok: boolean; total?: number; added?: number; failedPages?: number; error?: string }> {\n if (this.state.catalogBusy) return { ok: false, error: '\u76EE\u5F55\u64CD\u4F5C\u8FDB\u884C\u4E2D' };\n this.state.catalogBusy = 'fetch';\n this.notify();\n try {\n const res = await fetch('/api/dsh-a6api/catalog/fetch-models', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n await this.fetchCatalog();\n return { ok: true, total: json.total, added: json.added, failedPages: json.failedPages || 0 };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n return { ok: false, error: msg };\n } finally {\n this.state.catalogBusy = null;\n this.notify();\n }\n }\n\n /** \u5BF9\u5168\u90E8\uFF08\u6216\u6307\u5B9A\uFF09\u76EE\u5F55\u6A21\u578B\u67E5 OpenRouter \u5E76\u586B\u5145\u53C2\u6570 */\n public async queryOpenRouter(modelIds?: string[]): Promise<{ ok: boolean; updated?: number; notFound?: string[]; error?: string }> {\n if (this.state.catalogBusy) return { ok: false, error: '\u76EE\u5F55\u64CD\u4F5C\u8FDB\u884C\u4E2D' };\n this.state.catalogBusy = 'query';\n this.notify();\n try {\n const res = await fetch('/api/dsh-a6api/catalog/query-openrouter', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ modelIds }),\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n await this.fetchCatalog();\n return { ok: true, updated: json.updated, notFound: json.notFound || [] };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n return { ok: false, error: msg };\n } finally {\n this.state.catalogBusy = null;\n this.notify();\n }\n }\n\n /** \u4FEE\u6539\u76EE\u5F55\u6761\u76EE\u53C2\u6570\uFF1B\u5DF2\u542F\u7528\u6A21\u578B\u7531\u670D\u52A1\u7AEF\u5373\u65F6\u91CD\u5199 settings.yaml */\n public async updateCatalogEntry(\n id: string,\n patch: Partial<CatalogModelEntry>,\n ): Promise<{ ok: boolean; error?: string }> {\n try {\n const res = await fetch('/api/dsh-a6api/catalog/update', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id, ...patch }),\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n await this.fetchCatalog();\n return { ok: true };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n return { ok: false, error: msg };\n }\n }\n\n /** \u6E05\u7A7A\u6A21\u578B\u76EE\u5F55\uFF08\u968F\u540E\u53EF\u91CD\u65B0\u4ECE A6API \u62C9\u53D6 / OpenRouter \u586B\u5145\uFF09 */\n public async clearCatalog(): Promise<{ ok: boolean; error?: string }> {\n try {\n const res = await fetch('/api/dsh-a6api/catalog/clear', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n await this.fetchCatalog();\n return { ok: true };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n return { ok: false, error: msg };\n }\n }\n\n public async fetchPriceFluctuation(): Promise<void> {\n try {\n const res = await fetch('/api/dsh-a6api/price-fluctuation');\n if (res.ok) {\n const json = await res.json();\n if (json?.data) {\n const d = json.data;\n const hasAuth = d.hasAuth !== false && !d.authError;\n // \u670D\u52A1\u7AEF\u5DF2\u533A\u5206\u201C\u672A\u914D\u7F6E/\u5931\u6548\u201D\u4E0E\u201C\u6709\u5F85\u5904\u7406 0\u201D\uFF0C\u5BA2\u6237\u7AEF\u5C0A\u91CD hasAuth\n if (!hasAuth) {\n // \u5931\u6548\u6216\u672A\u914D\u7F6E\u65F6\uFF0C\u663E\u793A -- \u800C\u975E 0\uFF08\u7531 UI \u5C42\u5224\u65AD\uFF09\uFF0C\u4F46\u4ECD\u66F4\u65B0\u65F6\u95F4\u907F\u514D\u9891\u7E41\u91CD\u8BD5\n const next = { pendingCount: 0, unseenCount: 0, totalCount: 0, updatedAt: Date.now(), hasAuth: false, authError: Boolean(d.authError) } as any;\n if (JSON.stringify(next) !== JSON.stringify(this.state.priceFluctuation)) {\n this.state.priceFluctuation = next;\n this.notify();\n }\n return;\n }\n const pending = Number(d.pendingCount ?? 0);\n const unseen = Number(d.unseenCount ?? 0);\n const total = Number(d.totalCount ?? 0);\n const next = { pendingCount: pending, unseenCount: unseen, totalCount: total, updatedAt: Date.now(), hasAuth: true, authError: false } as any;\n if (pending !== (this.state.priceFluctuation as any).pendingCount || unseen !== (this.state.priceFluctuation as any).unseenCount || (this.state.priceFluctuation as any).hasAuth === false || (this.state.priceFluctuation as any).updatedAt === null) {\n this.state.priceFluctuation = next;\n this.notify();\n } else if ((this.state.priceFluctuation as any).updatedAt === null) {\n this.state.priceFluctuation = next;\n this.notify();\n }\n }\n }\n } catch {}\n }\n\n /** \u5355\u6B21\u63A2\u6D4B\u8BF7\u6C42\uFF08\u4E0D\u4FEE\u6539\u72B6\u6001\uFF0C\u4F9B\u9650\u6D41\u91CD\u8BD5\u5FAA\u73AF\u590D\u7528\uFF09 */\n private async probeOnce(\n modelName: string,\n ): Promise<{ kind: 'ok'; json: any } | { kind: 'http'; status: number } | { kind: 'network'; error: string }> {\n try {\n const res = await fetch('/api/dsh-a6api/probe', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ modelName }),\n });\n if (res.ok) {\n const json = await res.json();\n return { kind: 'ok', json };\n }\n return { kind: 'http', status: res.status };\n } catch (err: any) {\n return { kind: 'network', error: err?.message || String(err) };\n }\n }\n\n private isRateLimitedOutcome(\n o: { kind: 'ok'; json: any } | { kind: 'http'; status: number } | { kind: 'network'; error: string },\n ): boolean {\n return (\n (o.kind === 'ok' &&\n Boolean(o.json?.result?.error && RATE_LIMIT_RE.test(String(o.json.result.error)))) ||\n (o.kind === 'http' && o.status === 429)\n );\n }\n\n /** \u628A\u4E00\u6B21\u63A2\u6D4B\u7ED3\u679C\u5E94\u7528\u5230\u5361\u7247\uFF08\u6309\u7ED3\u679C\u7C7B\u578B\u8D70\u539F\u6709\u6620\u5C04\u903B\u8F91\uFF09 */\n private applyProbeResult(\n modelName: string,\n outcome: { kind: 'ok'; json: any } | { kind: 'http'; status: number } | { kind: 'network'; error: string },\n ): void {\n const patch = (p: Partial<ModelCardData>) => {\n this.state.models = this.state.models.map((m) => (m.model_name === modelName ? { ...m, ...p } : m));\n this.notify();\n };\n if (outcome.kind === 'ok') {\n const json = outcome.json;\n if (json?.result?.merchant) {\n patch({\n merchant: json.result.merchant,\n probeStatus: 'success',\n probeLatencyMs: json.result.durationMs,\n probeError: undefined,\n lastProbedAt: Date.now(),\n // \u63A2\u6D4B\u8BF7\u6C42\u672C\u8EAB\u4F1A\u5199\u8DEF\u7531\u65E5\u5FD7,\u4E50\u89C2\u66F4\u65B0\u8DEF\u7531\u5FEB\u7167\u65F6\u6548,\u4E0B\u6B21 /state \u4EE5\u65E5\u5FD7\u4E3A\u51C6\n lastRoutedAt: Math.floor(Date.now() / 1000),\n lastRoutedText: formatRelativeNow(Math.floor(Date.now() / 1000)),\n });\n } else if (json?.result?.error) {\n patch({\n merchant: undefined,\n probeStatus: 'error',\n probeError: json.result.error,\n lastProbedAt: Date.now(),\n });\n } else {\n patch({\n probeStatus: json?.result?.success ? 'success' : 'idle',\n probeLatencyMs: json?.result?.durationMs,\n probeError: json?.result?.success\n ? '\u63A2\u6D4B\u6210\u529F,\u4F46\u672A\u6355\u83B7\u5546\u6237\u4FE1\u606F(\u9700\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C)'\n : undefined,\n lastProbedAt: Date.now(),\n });\n }\n } else if (outcome.kind === 'http') {\n patch({\n merchant: undefined,\n probeStatus: 'error',\n probeError: `HTTP ${outcome.status}`,\n lastProbedAt: Date.now(),\n });\n } else {\n patch({\n merchant: undefined,\n probeStatus: 'error',\n probeError: outcome.error,\n lastProbedAt: Date.now(),\n });\n }\n }\n\n public async probeModel(modelName: string): Promise<void> {\n this.state.probingModelNames.add(modelName);\n this.state.models = this.state.models.map((m) =>\n m.model_name === modelName ? { ...m, probeStatus: 'probing' as const } : m,\n );\n this.notify();\n\n try {\n let outcome = await this.probeOnce(modelName);\n // Key \u7EA7\u9650\u6D41(429)\u81EA\u52A8\u91CD\u8BD5\uFF1A\u9000\u907F 0.8s / 2s\uFF0C\u5171 3 \u6B21\uFF1B\u91CD\u8BD5\u671F\u95F4\u5361\u7247\u4FDD\u6301\u300C\u63A2\u6D4B\u4E2D\u300D\n if (this.isRateLimitedOutcome(outcome)) {\n for (let attempt = 2; attempt <= 3; attempt++) {\n await sleep(attempt === 2 ? 800 : 2000);\n outcome = await this.probeOnce(modelName);\n if (!this.isRateLimitedOutcome(outcome)) break;\n }\n if (this.isRateLimitedOutcome(outcome)) {\n this.state.models = this.state.models.map((m) =>\n m.model_name === modelName\n ? {\n ...m,\n merchant: undefined,\n probeStatus: 'error' as const,\n probeError: '\u8BF7\u6C42\u88AB\u9650\u6D41(429),\u5DF2\u81EA\u52A8\u91CD\u8BD5 3 \u6B21\u4ECD\u5931\u8D25,\u8BF7\u7A0D\u540E\u518D\u8BD5',\n lastProbedAt: Date.now(),\n }\n : m,\n );\n return;\n }\n }\n this.applyProbeResult(modelName, outcome);\n } finally {\n this.state.probingModelNames.delete(modelName);\n // \u8BA1\u5165\u5168\u91CF\u63A2\u6D4B\u8FDB\u5EA6\uFF08\u4EC5\u9650\u672C\u8F6E\u5FEB\u7167\u5185\u7684\u6A21\u578B\uFF1B\u5E42\u7B49\u96C6\u5408\uFF0C\u91CD\u590D\u63A2\u6D4B\u4E0D\u91CD\u590D\u8BA1\u6570\uFF09\n if (this.probeAllSnapshot?.includes(modelName)) {\n this.probeAllDone.add(modelName);\n this.state.probeAllDoneCount = this.probeAllDone.size;\n }\n this.notify();\n this.refreshBalance().catch(() => {});\n }\n }\n\n public async probeAll(): Promise<void> {\n // \u91CD\u5165\u9632\u62A4\uFF1A\u8FD0\u884C\u4E2D\u76F4\u63A5\u5FFD\u7565\uFF08store \u72B6\u6001\u9A71\u52A8 UI\uFF0C\u6B63\u5E38\u5165\u53E3\u5DF2\u4E0D\u53EF\u70B9\uFF0C\u9632\u5FA1\u5176\u4ED6\u8C03\u7528\u8DEF\u5F84\uFF09\n if (this.state.probeAllActive) return;\n const names = this.state.models.map((m) => m.model_name);\n if (names.length === 0) return;\n this.probeCancelled = false;\n this.probeAllSnapshot = names;\n this.probeAllDone.clear();\n // \u6682\u5B58\u5165\u961F\u524D\u7684\u63A2\u6D4B\u9519\u8BEF\u6587\u6848\uFF0C\u53D6\u6D88\u65F6\u6062\u590D\uFF08\u907F\u514D\u6392\u961F\u671F\u95F4\u6E05\u7A7A\u5386\u53F2\u9519\u8BEF\u63D0\u793A\uFF09\n this.probeQueuedPrevError = new Map(this.state.models.map((m) => [m.model_name, m.probeError]));\n this.state.probeAllActive = true;\n this.state.probeAllTotal = names.length;\n this.state.probeAllDoneCount = 0;\n // \u5168\u91CF\u5165\u961F\uFF1A\u7B49\u5F85\u4E2D\u7684\u6A21\u578B\u6309\u94AE\u663E\u793A\u300C\u7B49\u5F85\u63A2\u6D4B\u300D\u5E76\u7981\u7528\n this.state.models = this.state.models.map((m) => ({\n ...m,\n probeStatus: 'queued' as const,\n probeError: undefined,\n }));\n this.notify();\n // \u6D4F\u89C8\u5668\u540C\u6E90 HTTP/1.1 \u8FDE\u63A5\u6C60\u7EA6 6 \u8DEF\uFF0C\u518D\u9AD8\u4E5F\u5230\u4E0D\u4E86\u4E0A\u6E38\uFF1B8 \u4EC5\u4FDD\u8BC1\u69FD\u4F4D\u4E0D\u88AB\u6D4F\u89C8\u5668\u6392\u961F\u997F\u6B7B\n const CONCURRENCY = Math.min(8, names.length);\n let idx = 0;\n const worker = async () => {\n while (idx < names.length && !this.probeCancelled) {\n const name = names[idx++];\n // \u53D6\u6D88\u540E\u7ACB\u5373\u91CD\u5F00\u65F6\uFF0C\u4E0A\u4E00\u6B21\u8FD0\u884C\u7684\u5728\u9014\u63A2\u6D4B\u4ECD\u5360\u7528\u8BE5\u6A21\u578B\uFF1A\u8DF3\u8FC7\u907F\u514D\u5E76\u53D1\u53CC\u63A2\uFF0C\n // \u5176\u7ED3\u679C\u4ECD\u4F1A\u56DE\u586B\u5361\u7247\u5E76\u8BA1\u5165\u672C\u8F6E\u8FDB\u5EA6\n if (this.state.probingModelNames.has(name)) continue;\n await this.probeModel(name);\n }\n };\n try {\n await Promise.all(Array.from({ length: CONCURRENCY }, () => worker()));\n } finally {\n this.state.probeAllActive = false;\n this.probeAllSnapshot = null;\n this.probeAllDone.clear();\n this.state.probeAllDoneCount = 0;\n // \u53D6\u6D88\u65F6\u5269\u4F59\u6392\u961F\u6A21\u578B\u590D\u4F4D\u4E3A\u53EF\u624B\u52A8\u63A2\u6D4B\uFF08\u5E76\u6062\u590D\u5386\u53F2\u9519\u8BEF\u6587\u6848\uFF09\uFF1B\u6B63\u5E38\u8DD1\u5B8C\u65F6\u961F\u5217\u5DF2\u7A7A\uFF0C\u4E3A no-op\n this.restoreQueuedModels();\n this.notify();\n }\n }\n\n /** \u628A\u4ECD\u5904\u4E8E queued \u7684\u6A21\u578B\u590D\u4F4D\u4E3A idle \u5E76\u6062\u590D\u5165\u961F\u524D\u7684\u9519\u8BEF\u6587\u6848 */\n private restoreQueuedModels(): void {\n const prev = this.probeQueuedPrevError;\n this.state.models = this.state.models.map((m) =>\n m.probeStatus === 'queued'\n ? { ...m, probeStatus: 'idle' as const, probeError: prev.get(m.model_name) }\n : m,\n );\n this.probeQueuedPrevError = new Map();\n }\n\n /** \u53D6\u6D88\u5168\u91CF\u63A2\u6D4B\uFF1A\u7ACB\u5373\u590D\u4F4D\u6392\u961F\u6A21\u578B\uFF0C\u4E0D\u518D\u53D6\u65B0\u4EFB\u52A1\uFF0C\u5DF2\u5728\u9014\u7684\u63A2\u6D4B\u6B63\u5E38\u5B8C\u6210\u5E76\u56DE\u586B\u5361\u7247 */\n public cancelProbeAll(): void {\n if (!this.state.probeAllActive) return;\n this.probeCancelled = true;\n this.state.probeAllActive = false;\n this.probeAllSnapshot = null;\n this.probeAllDone.clear();\n this.state.probeAllDoneCount = 0;\n this.restoreQueuedModels();\n this.notify();\n }\n\n public async toggleDshModel(modelName: string): Promise<void> {\n const currentSet = new Set(this.state.dshConfiguredModels);\n if (currentSet.has(modelName)) {\n currentSet.delete(modelName);\n } else {\n currentSet.add(modelName);\n }\n const newModels = [...currentSet];\n try {\n const res = await fetch('/api/dsh-a6api/sync-models', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ modelIds: newModels }),\n });\n if (res.ok) {\n const json = await res.json();\n this.state.dshConfiguredModels = json.dshConfiguredModels || newModels;\n const dshSet = new Set(this.state.dshConfiguredModels);\n this.state.models = this.state.models.map((m) => ({\n ...m,\n inDsh: dshSet.has(m.model_name),\n }));\n this.notify();\n }\n } catch (err: any) {\n this.state.error = err?.message || String(err);\n this.notify();\n }\n }\n\n /**\n * \u56FA\u5B9A / \u53D6\u6D88\u56FA\u5B9A / \u7981\u7528 / \u6062\u590D \u7684\u7EDF\u4E00\u6267\u884C\u5668\u3002\n * \u6210\u529F\u540E\u4F1A\u5237\u65B0 /state\uFF08\u670D\u52A1\u7AEF\u4F1A\u628A\u5E73\u53F0\u56FA\u5B9A\u8BB0\u5F55\u53E0\u52A0\u56DE\u5361\u7247\uFF0C\u8DDF\u968F\u5B98\u7F51\u72B6\u6001\uFF09\u3002\n */\n private async runMarketplaceAction(\n modelName: string,\n endpoint: string,\n busySet: Set<string>,\n ): Promise<{ ok: boolean; error?: string }> {\n if (busySet.has(modelName)) return { ok: false, error: '\u64CD\u4F5C\u8FDB\u884C\u4E2D' };\n busySet.add(modelName);\n this.notify();\n try {\n const res = await fetch(`/api/dsh-a6api/${endpoint}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ modelName }),\n });\n const json = await res.json().catch(() => null);\n if (res.ok && json?.ok) {\n if (Array.isArray(json.pins)) {\n this.state.pins = json.pins;\n }\n await this.fetchState();\n return { ok: true };\n }\n const errText = json?.error || `HTTP ${res.status}`;\n this.state.error = errText;\n this.notify();\n return { ok: false, error: errText };\n } catch (err: any) {\n const msg = err?.message || String(err);\n this.state.error = msg;\n this.notify();\n return { ok: false, error: msg };\n } finally {\n busySet.delete(modelName);\n this.notify();\n }\n }\n\n /** \u56FA\u5B9A\u5361\u7247\u5F53\u524D\u5546\u5BB6\u5230\u8BE5\u6A21\u578B */\n public pinModel(modelName: string): Promise<{ ok: boolean; error?: string }> {\n return this.runMarketplaceAction(modelName, 'pin', this.state.actionBusyModels);\n }\n\n /** \u53D6\u6D88\u8BE5\u6A21\u578B\u7684\u56FA\u5B9A */\n public unpinModel(modelName: string): Promise<{ ok: boolean; error?: string }> {\n return this.runMarketplaceAction(modelName, 'unpin', this.state.actionBusyModels);\n }\n\n /** \u7981\u7528\u5361\u7247\u5F53\u524D\u5546\u5BB6\u5BF9\u8BE5\u6A21\u578B\u7684\u670D\u52A1 */\n public disableModel(modelName: string): Promise<{ ok: boolean; error?: string }> {\n return this.runMarketplaceAction(modelName, 'disable', this.state.actionBusyModels);\n }\n\n /** \u6062\u590D\u88AB\u7981\u7528\u7684\u5546\u5BB6 */\n public restoreModel(modelName: string): Promise<{ ok: boolean; error?: string }> {\n return this.runMarketplaceAction(modelName, 'restore', this.state.actionBusyModels);\n }\n\n /**\n * \u542F\u52A8\u9884\u70ED\uFF1A\u63D2\u4EF6\u968F DSH \u542F\u52A8\u5373\u540E\u53F0\u62C9\u53D6\u4E00\u6B21\u5B8C\u6574\u72B6\u6001\u3002\n * \u4FA7\u8FB9\u680F\u6309\u94AE\u5728\u5E94\u7528\u542F\u52A8\u65F6\u5C31\u5DF2\u6302\u8F7D\uFF0C\u9884\u70ED\u8BA9\u7528\u6237\u6253\u5F00\u6D6E\u5C42/\u8BBE\u7F6E\u9875\u65F6\u6570\u636E\u65E9\u5DF2\u5C31\u7EEA \u2192 \u79D2\u5F00\u65E0 spinner\u3002\n * \u672A\u914D\u7F6E\u51ED\u636E\u65F6 /state \u8FD4\u56DE\u9ED8\u8BA4\u56DE\u9000\u6570\u636E\uFF0C\u65E0\u5BB3\uFF1B\u540E\u7EED\u4FDD\u5B58\u914D\u7F6E/\u8F6E\u8BE2\u4F1A\u6301\u7EED\u5237\u65B0\u3002\n * \u76EE\u5F55\u4E00\u5E76\u9884\u70ED\uFF08\u6A21\u578B\u76EE\u5F55 tab \u5FBD\u6807/\u9996\u5C4F\u4E0D\u7B49\u5F85\u9996\u6B21\u8FDB\u5165\uFF09\u3002\n */\n public warmUp(): void {\n if (this.warmedUp) return;\n this.warmedUp = true;\n this.fetchState().catch(() => {});\n this.fetchCatalog().catch(() => {});\n }\n\n private startAutoRefresh() {\n if (this.autoRefreshTimer) clearInterval(this.autoRefreshTimer);\n // 60s \u540E\u53F0\u6574\u4F53\u5237\u65B0\uFF1A/state \u5355\u6B21\u62C9\u53D6\u5373\u542B\u4F59\u989D/\u6A21\u578B/\u65E5\u5FD7/\u56FA\u5B9A\u8BB0\u5F55\uFF08\u670D\u52A1\u7AEF\u5DF2\u5E76\u884C\u5316\uFF09\uFF0C\n // \u53D6\u4EE3\u539F\u5148\u5206\u7ACB\u7684\u4F59\u989D/\u4EF7\u683C\u6CE2\u52A8/\u56FA\u5B9A\u8BB0\u5F55\u4E09\u4E2A\u8F6E\u8BE2\u3002\u4EF7\u683C\u6CE2\u52A8\u4E0E\u56FA\u5B9A\u8BB0\u5F55\u7531 fetchState\n // \u5185\u90E8\u7684\u53BB\u91CD\u903B\u8F91\u6309\u9700\u89E6\u53D1\uFF1B\u672A\u914D\u7F6E API Key \u65F6\u8DF3\u8FC7\uFF0C\u907F\u514D\u65E0\u610F\u4E49\u8BF7\u6C42\u3002\n this.autoRefreshTimer = setInterval(() => {\n if (this.state.config?.hasApiKey) {\n this.fetchState().catch(() => {});\n }\n }, 60000);\n }\n\n public stopAutoRefresh() {\n if (this.autoRefreshTimer) { clearInterval(this.autoRefreshTimer); this.autoRefreshTimer = null; }\n }\n\n public initPricePolling() {\n if (this.autoRefreshTimer) return;\n this.startAutoRefresh();\n if (this.state.config?.hasToken) {\n this.fetchPriceFluctuation().catch(() => {});\n }\n }\n}\n\nexport const store = new A6ApiStore();\n", "import React, { useState, useRef } from 'react';\nimport { store } from '../store.js';\nimport type { ModelCardData } from '../../types.js';\n\n// \u79D2\u7EA7\u65F6\u95F4\u6233 \u2192 \u7EDD\u5BF9\u65F6\u95F4\u6587\u6848 (MM-DD HH:mm:ss\uFF0C\u8DE8\u5E74\u65F6\u5E26\u5E74)\nconst formatAbsolute = (tsSec: number) => {\n const d = new Date(tsSec * 1000);\n const p = (n: number) => String(n).padStart(2, '0');\n const nowY = new Date().getFullYear();\n const y = d.getFullYear();\n const md = `${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;\n return y !== nowY ? `${y}-${md}` : md;\n};\n\n/** 3 \u4F4D\u6709\u6548\u6570\u5B57\uFF1B\u5343\u4F4D\u4EE5\u4E0A\u52A0\u5343\u5206\u7B26\uFF08\u4E0E\u5B98\u7F51\u6A21\u578B\u5E02\u573A\u6807\u6CE8\u811A\u672C fmtSig \u53E3\u5F84\u4E00\u81F4\uFF09 */\nconst fmtSig = (n: number) => {\n if (!Number.isFinite(n)) return '\u2014';\n const s = Number(n.toPrecision(3));\n if (Math.abs(s) >= 1000) return s.toLocaleString('en-US', { maximumFractionDigits: 0 });\n return String(s);\n};\n\nexport const MerchantCard: React.FC<{\n model: ModelCardData;\n}> = ({ model }) => {\n // \u8FDB\u5165\u540E\u9ED8\u8BA4\u4E0D\u5C55\u5F00\n const [expanded, setExpanded] = useState(false);\n const [pinConfirmOpen, setPinConfirmOpen] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n const errorTimerRef = useRef<any>(null);\n\n const isProbing = model.probeStatus === 'probing';\n const isQueued = model.probeStatus === 'queued';\n const merchant = model.merchant;\n const isBusy = store.getState().actionBusyModels.has(model.model_name);\n const canWebAction = Boolean(store.getState().config?.hasToken);\n const hasMerchant = Boolean(merchant?.channel_id);\n const isPinnedHere = model.pinStatus === 'pin_here';\n const isPinnedElsewhere = model.pinStatus === 'pin_elsewhere';\n const isChannelDisabled = Boolean(merchant?.user_channel_disabled);\n\n const flashActionError = (msg: string) => {\n // \u8FDE\u7EED\u5931\u8D25\u65F6\u5148\u6E05\u6389\u65E7\u5B9A\u65F6\u5668\uFF0C\u907F\u514D\u524D\u4E00\u6761\u9519\u8BEF\u63D0\u524D\u6E05\u6389\u540E\u4E00\u6761\n if (errorTimerRef.current) clearTimeout(errorTimerRef.current);\n setActionError(msg);\n errorTimerRef.current = setTimeout(() => setActionError(null), 6000);\n };\n\n const handleProbe = (e: React.MouseEvent) => {\n e.stopPropagation();\n store.probeModel(model.model_name);\n };\n\n const handleToggleDsh = (e: React.MouseEvent) => {\n e.stopPropagation();\n store.toggleDshModel(model.model_name);\n };\n\n const handleOpenPinConfirm = (e: React.MouseEvent) => {\n e.stopPropagation();\n setActionError(null);\n setPinConfirmOpen(true);\n };\n\n const handleConfirmPin = async () => {\n setActionError(null);\n const r = await store.pinModel(model.model_name);\n if (!r.ok) {\n flashActionError(r.error || '\u56FA\u5B9A\u5931\u8D25');\n } else {\n setPinConfirmOpen(false);\n }\n };\n\n const handleUnpin = async (e: React.MouseEvent) => {\n e.stopPropagation();\n setActionError(null);\n const r = await store.unpinModel(model.model_name);\n if (!r.ok) flashActionError(r.error || '\u53D6\u6D88\u56FA\u5B9A\u5931\u8D25');\n };\n\n const handleDisable = async (e: React.MouseEvent) => {\n e.stopPropagation();\n setActionError(null);\n const r = await store.disableModel(model.model_name);\n if (!r.ok) flashActionError(r.error || '\u7981\u7528\u5931\u8D25');\n };\n\n const handleRestore = async (e: React.MouseEvent) => {\n e.stopPropagation();\n setActionError(null);\n const r = await store.restoreModel(model.model_name);\n if (!r.ok) flashActionError(r.error || '\u6062\u590D\u5931\u8D25');\n };\n\n // Success Rate Dot Generators\n const renderRealtimeDots = () => {\n if (merchant?.success_buckets && merchant.success_buckets.length > 0) {\n return merchant.success_buckets.slice(0, 10).map((b, i) => {\n const rate = b.success_rate;\n let colorClass = 'green';\n if (rate < 8000) colorClass = 'red';\n else if (rate < 9500) colorClass = 'yellow';\n return <div key={i} className={`dsh-a6-rate-dot ${colorClass}`} />;\n });\n }\n const count = 10;\n const greenCount = merchant ? Math.round((merchant.recent_success_rate_pct / 100) * count) : 10;\n return Array.from({ length: count }).map((_, i) => (\n <div key={i} className={`dsh-a6-rate-dot ${i < greenCount ? 'green' : 'empty'}`} />\n ));\n };\n\n const render24hDots = () => {\n if (merchant?.b24 && merchant.b24.length > 0) {\n return merchant.b24.slice(0, 12).map((b, i) => {\n if (!b.s || b.s === 0) {\n return <div key={i} className=\"dsh-a6-rate-dot empty\" />;\n }\n let colorClass = 'green';\n if (b.r < 8000) colorClass = 'red';\n else if (b.r < 9500) colorClass = 'yellow';\n return <div key={i} className={`dsh-a6-rate-dot ${colorClass}`} />;\n });\n }\n const count = 12;\n const greenCount = merchant ? Math.round((merchant.success_rate_24h_pct / 100) * count) : 12;\n return Array.from({ length: count }).map((_, i) => (\n <div key={i} className={`dsh-a6-rate-dot ${i < greenCount ? 'green' : 'empty'}`} />\n ));\n };\n\n const render7dDots = () => {\n if (merchant?.b7d && merchant.b7d.length > 0) {\n return merchant.b7d.slice(0, 7).map((b, i) => {\n if (!b.s || b.s === 0) {\n return <div key={i} className=\"dsh-a6-rate-dot empty\" />;\n }\n let colorClass = 'green';\n if (b.r && b.r < 8000) colorClass = 'red';\n else if (b.r && b.r < 9500) colorClass = 'yellow';\n return <div key={i} className={`dsh-a6-rate-dot ${colorClass}`} />;\n });\n }\n return Array.from({ length: 7 }).map((_, i) => (\n <div key={i} className={`dsh-a6-rate-dot ${i >= 4 ? 'green' : 'empty'}`} />\n ));\n };\n\n // Smart tag styling\n const getTagClass = (tag: string) => {\n if (tag.includes('\u4FDD\u771F')) return 'tag-guarantee';\n if (tag.includes('\u7A33\u5B9A')) return 'tag-stable';\n if (tag.includes('\u4F4E\u4EF7')) return 'tag-cheap';\n if (tag.includes('\u9AD8\u901F')) return 'tag-fast';\n if (tag.includes('\u9AD8\u8D28')) return 'tag-quality';\n return '';\n };\n\n // Realtime ratio pill\n const ratioText = merchant?.realtime_ratio_formatted || '0.0341';\n\n // Latency & Cache hit\n const latencySec = merchant\n ? ((merchant.p50_ttft_ms || merchant.recent_p50_ms || 2340) / 1000).toFixed(2) + 's'\n : model.probeLatencyMs\n ? (model.probeLatencyMs / 1000).toFixed(2) + 's'\n : '2.34s';\n const cacheHitPct = merchant ? merchant.cache_hit_rate_pct : 72.0;\n\n // \u6DF7\u5408\u4EF7\u4F30\u7B97\uFF08\u00A5/1\u4EBF tokens\uFF09\uFF1A\u670D\u52A1\u7AEF\u6309 24h \u7F13\u5B58\u547D\u4E2D\u7387 + \u8F93\u51FA\u5360\u6BD4 0.35% \u9884\u8BA1\u7B97\uFF0C\u5BA2\u6237\u7AEF\u4EC5\u683C\u5F0F\u5316\u4E0E\u89E3\u91CA\n const blend100m = merchant?.blended_price_100m_cny;\n const blend100mValid = blend100m !== undefined && Number.isFinite(blend100m);\n const blendTitle = blend100mValid\n ? (() => {\n const h = Math.min(100, Math.max(0, merchant!.cache_hit_rate_pct)) / 100;\n const inShare = 99.65; // \u8F93\u5165\u7C7B token \u5360\u6BD4 %\uFF08\u8F93\u51FA\u56FA\u5B9A 0.35%\uFF09\n const hSharePct = Math.round(h * inShare * 10) / 10;\n const mSharePct = Math.round((1 - h) * inShare * 10) / 10;\n const per1m = blend100m! / 100;\n return (\n '\u6DF7\u5408\u4EF7\u4F30\u7B97\uFF08\u00A5 / 1\u4EBF tokens\uFF0C\u8F93\u51FA\u5360\u6BD4\u56FA\u5B9A 0.35%\uFF09\\n' +\n `\u547D\u4E2D ${hSharePct}% \u00D7 \u7F13\u5B58\u8BFB\u4EF7 + \u672A\u547D\u4E2D ${mSharePct}% \u00D7 \u8F93\u5165\u4EF7 + \u8F93\u51FA 0.35% \u00D7 \u8F93\u51FA\u4EF7\\n` +\n `= \u00A5${Number(per1m.toPrecision(4))} /1M \u2248 \u00A5${fmtSig(blend100m!)} /1\u4EBF tokens\\n` +\n '\u547D\u4E2D\u7387\u53D6\u5361\u7247 24h \u5B9E\u6D4B\u7F13\u5B58\u547D\u4E2D\u7387'\n );\n })()\n : undefined;\n\n return (\n <div className={`dsh-a6-official-card ${model.inDsh ? 'in-dsh' : ''}`}>\n {/* 1. Main Top Row */}\n <div className=\"dsh-a6-card-main-bar\" onClick={() => setExpanded(!expanded)}>\n {/* Col 1: Model Title & Subtitle */}\n <div className=\"dsh-a6-bar-identity\">\n <div className=\"dsh-a6-title-col\">\n <div className=\"dsh-a6-title-line\">\n <span className=\"dsh-a6-name-text\">{model.model_name}</span>\n {merchant?.channel_id && (\n <>\n <span className=\"dsh-a6-dot-sep\">\u00B7</span>\n <span className=\"dsh-a6-merchant-id-text\">\n \u5546\u6237ID {merchant.channel_id}\n </span>\n </>\n )}\n {isPinnedHere && !isChannelDisabled && (\n <span\n className=\"dsh-a6-pin-badge here\"\n data-tooltip={\n `\u8BE5\u6A21\u578B\u5DF2\u56FA\u5B9A\u5230\u5F53\u524D\u5546\u5BB6${model.pinnedFallback === false ? '\uFF08\u4E25\u683C\u56FA\u5B9A\uFF09' : '\uFF0C\u5F02\u5E38\u65F6\u81EA\u52A8\u5207\u6362\u667A\u80FD\u4F18\u9009'}${model.pinTokenMatched === false ? '\uFF1B\u8BE5\u56FA\u5B9A\u5C5E\u4E8E\u5176\u4ED6\u4EE4\u724C\uFF0C\u4EC5\u4F9B\u53C2\u8003' : ''}`\n }\n data-tooltip-pos=\"down\"\n >\n \u5DF2\u56FA\u5B9A\n </span>\n )}\n {isPinnedElsewhere && (\n <span\n className=\"dsh-a6-pin-badge elsewhere\"\n data-tooltip={\n `\u8BE5\u6A21\u578B\u5DF2\u56FA\u5B9A\u5230${model.pinnedChannelId ? `\u5546\u6237 #${model.pinnedChannelId}` : '\u5176\u4ED6\u5546\u5BB6'}${model.pinnedSupplierName ? `\uFF08${model.pinnedSupplierName}\uFF09` : ''}${model.pinTokenMatched === false ? '\uFF1B\u8BE5\u56FA\u5B9A\u5C5E\u4E8E\u5176\u4ED6\u4EE4\u724C\uFF0C\u4EC5\u4F9B\u53C2\u8003' : ''}`\n }\n data-tooltip-pos=\"down\"\n >\n \u5DF2\u56FA\u5B9A\u5230\u5176\u4ED6\u5546\u5BB6\n </span>\n )}\n {isChannelDisabled && (\n <span className=\"dsh-a6-pin-badge disabled\" data-tooltip=\"\u5F53\u524D\u5546\u5BB6\u5DF2\u5BF9\u8BE5\u6A21\u578B\u7981\u7528\uFF0C\u8DEF\u7531\u4E0D\u4F1A\u547D\u4E2D\u6B64\u6E20\u9053\" data-tooltip-pos=\"down\">\n \u5DF2\u7981\u7528\n </span>\n )}\n </div>\n {merchant?.description && (\n <div className=\"dsh-a6-sub-desc\">{merchant.description}</div>\n )}\n </div>\n </div>\n\n {/* Col 2: Pricing Summary + Ratio Tag */}\n {merchant ? (\n <div className=\"dsh-a6-bar-pricing\">\n <div className=\"dsh-a6-price-col\">\n <span className=\"dsh-a6-price-top\" title=\"\u8F93\u5165\u4EF7 (1M)\">\n {merchant.input_price_cny}\n </span>\n <span className=\"dsh-a6-price-btm\" title=\"\u7F13\u5B58\u8BFB (1M)\">\n {merchant.cache_read_price_cny}\n </span>\n </div>\n <div className=\"dsh-a6-price-col\">\n <span className=\"dsh-a6-price-top\" title=\"\u8F93\u51FA\u4EF7 (1M)\">\n {merchant.output_price_cny}\n </span>\n <span className=\"dsh-a6-price-btm\" title=\"\u7F13\u5B58\u5199 (1M)\">\n {merchant.cache_write_price_cny}\n </span>\n </div>\n {blend100mValid && (\n <div className=\"dsh-a6-blend-pill\" title={blendTitle}>\n \u2248 \u00A5{fmtSig(blend100m!)}/\u4EBF\n </div>\n )}\n <div className=\"dsh-a6-ratio-pill\" title=\"\u5B9E\u65F6\u500D\u7387\u6BD4\u5B98\u65B9\u4EF7\">\n {ratioText}\n </div>\n </div>\n ) : (\n <div className=\"dsh-a6-bar-pricing unprobed\">\n <div\n className={`dsh-a6-unprobed-hint ${model.probeError ? 'error' : ''}`}\n data-tooltip={model.probeError || undefined}\n data-tooltip-pos=\"down\"\n >\n {isProbing ? '\u5546\u5BB6\u63A2\u6D4B\u4E2D...' : isQueued ? '\u6392\u961F\u7B49\u5F85\u63A2\u6D4B...' : model.probeError ? '\u63A2\u6D4B\u5931\u8D25' : '\u5C1A\u672A\u63A2\u6D4B\u5546\u5BB6'}\n </div>\n </div>\n )}\n\n {/* Col 3: Status / Health Bars (\u5B9E\u65F6, 24h, 7d) */}\n <div className=\"dsh-a6-bar-uptime\">\n <div className=\"dsh-a6-uptime-row\">\n <span className=\"dsh-a6-uptime-label\">\u5B9E\u65F6</span>\n <div className=\"dsh-a6-dots-track\">{renderRealtimeDots()}</div>\n <span className=\"dsh-a6-uptime-val\">\n {merchant ? `${merchant.recent_success_rate_pct.toFixed(1)}%` : '100.0%'}\n </span>\n </div>\n <div className=\"dsh-a6-uptime-row\">\n <span className=\"dsh-a6-uptime-label\">24h</span>\n <div className=\"dsh-a6-dots-track\">{render24hDots()}</div>\n <span className=\"dsh-a6-uptime-val\">\n {merchant ? `${merchant.success_rate_24h_pct.toFixed(1)}%` : '99.3%'}\n </span>\n </div>\n <div className=\"dsh-a6-uptime-row\">\n <span className=\"dsh-a6-uptime-label\">7d</span>\n <div className=\"dsh-a6-dots-track\">{render7dDots()}</div>\n <span className=\"dsh-a6-uptime-val\">\n {merchant?.sr_7d_state === 'no_data'\n ? '-'\n : merchant?.success_rate_7d_pct\n ? `${merchant.success_rate_7d_pct.toFixed(1)}%`\n : '-'}\n </span>\n </div>\n </div>\n\n {/* Col 4: Speed / Latency & Cache Hit Bar */}\n <div className=\"dsh-a6-bar-perf\">\n <div className=\"dsh-a6-perf-row\">\n <span className=\"dsh-a6-latency-text\">{latencySec}</span>\n <span className=\"dsh-a6-cache-hit-text\">{cacheHitPct.toFixed(1)}%</span>\n <div className=\"dsh-a6-hit-track\">\n <div\n className=\"dsh-a6-hit-fill\"\n style={{ width: `${Math.min(100, Math.max(0, cacheHitPct))}%` }}\n />\n </div>\n </div>\n </div>\n\n {/* Col 5: Smart Tags */}\n <div className=\"dsh-a6-bar-tags\">\n {(merchant?.labels || ['\u7A33\u5B9A', '\u4F4E\u4EF7', '\u9AD8\u901F', '\u9AD8\u8D28']).map((lbl, idx) => (\n <span key={idx} className={`dsh-a6-smart-pill ${getTagClass(lbl)}`}>\n {lbl}\n </span>\n ))}\n </div>\n\n </div>\n\n {/* 2. Bottom Footer: \u65F6\u95F4\u6233\u5DE6\u4E0B\u89D2 + \u64CD\u4F5C\u6309\u94AE\u53F3\u4E0B\u89D2 */}\n <div className=\"dsh-a6-card-footer\">\n <div className=\"dsh-a6-time-stack\">\n <span\n className=\"dsh-a6-time-ago\"\n data-tooltip=\"\u8BE5\u5546\u6237\u8DEF\u7EBF\u5168\u7F51\u6700\u8FD1\u4E00\u6B21\u6210\u529F\u54CD\u5E94\u65F6\u95F4\"\n >\n \u5168\u7F51\u6700\u8FD1\uFF1A{merchant?.last_success_text || '\u521A\u521A'}\n </span>\n <span\n className={`dsh-a6-time-ago dsh-a6-route-snapshot${model.lastRoutedAt ? '' : ' never'}`}\n data-tooltip={\n model.lastRoutedAt\n ? `\u4E2A\u4EBA\u6700\u540E\u4E00\u6B21\u8BF7\u6C42\u8BE5\u5546\u5BB6\u7684\u8BE5\u6A21\u578B ${formatAbsolute(model.lastRoutedAt)}`\n : '\u65E5\u5FD7\u4E2D\u6682\u65E0\u8BE5\u5546\u5BB6\u7684\u8BE5\u6A21\u578B\u8DEF\u7531\u8BB0\u5F55'\n }\n >\n \u4E2A\u4EBA\u6700\u8FD1\uFF1A{model.lastRoutedText || '\u4ECE\u672A\u8DEF\u7531'}\n </span>\n </div>\n\n {/* Col 6: \u64CD\u4F5C\u6309\u94AE\u7EC4 \u2014 \u5361\u7247\u53F3\u4E0B\u89D2 */}\n <div className=\"dsh-a6-bar-actions\" onClick={(e) => e.stopPropagation()}>\n <div className=\"dsh-a6-bar-actions-btns\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleProbe}\n disabled={isProbing || isQueued}\n data-tooltip={\n isQueued\n ? '\u6B63\u5728\u5168\u91CF\u63A2\u6D4B\u961F\u5217\u4E2D\u7B49\u5F85\uFF0C\u8BF7\u52FF\u91CD\u590D\u70B9\u51FB'\n : '\u5411\u8BE5\u6A21\u578B\u53D1\u9001\u4E00\u6B21\u8BF7\u6C42\u4EE5\u63A2\u6D4B\u5E76\u6355\u83B7\u5176\u5B9E\u9645\u547D\u4E2D\u7684\u5546\u6237 ID\u3001\u4EF7\u683C\u53CA\u5065\u5EB7\u5EA6\u6307\u6807\uFF08\u6D88\u8017\u5C11\u91CFToken\uFF09'\n }\n >\n {isProbing ? '\u63A2\u6D4B\u4E2D...' : isQueued ? '\u7B49\u5F85\u63A2\u6D4B' : '\u63A2\u6D4B\u5546\u5BB6'}\n </button>\n\n {isPinnedHere ? (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-danger dsh-a6-btn-sm\"\n onClick={handleUnpin}\n disabled={isBusy || !canWebAction || model.pinTokenMatched === false || isProbing || isQueued}\n data-tooltip={\n isProbing || isQueued\n ? '\u63A2\u6D4B\u5B8C\u6210\u540E\u518D\u53D6\u6D88\u56FA\u5B9A'\n : model.pinTokenMatched === false\n ? '\u8BE5\u56FA\u5B9A\u5C5E\u4E8E\u5176\u4ED6\u4EE4\u724C\uFF0C\u65E0\u6CD5\u5728\u6B64\u53D6\u6D88\uFF1B\u5982\u9700\u53D6\u6D88\u8BF7\u5230\u5B98\u7F51\u6216\u5148\u4E3A\u5F53\u524D\u4EE4\u724C\u56FA\u5B9A\u6B64\u5546\u5BB6'\n : canWebAction\n ? '\u53D6\u6D88\u56FA\u5B9A\u540E\u6062\u590D\u667A\u80FD\u4F18\u9009\u8DEF\u7531\uFF0C\u53EF\u91CD\u65B0\u63A2\u6D4B\u540E\u518D\u51B3\u5B9A\u662F\u5426\u56FA\u5B9A'\n : '\u9700\u5148\u5728\u300C\u57FA\u7840\u914D\u7F6E\u300D\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C/\u4F1A\u8BDD'\n }\n >\n {isBusy ? '\u5904\u7406\u4E2D...' : '\u53D6\u6D88\u56FA\u5B9A'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={handleOpenPinConfirm}\n disabled={isBusy || !hasMerchant || !canWebAction || isProbing || isQueued}\n data-tooltip={\n isProbing || isQueued\n ? '\u63A2\u6D4B\u5B8C\u6210\u540E\u518D\u56FA\u5B9A\u5546\u5BB6'\n : !hasMerchant\n ? '\u8BE5\u6A21\u578B\u6682\u65E0\u5546\u5BB6\u6570\u636E\uFF0C\u8BF7\u5148\u300C\u63A2\u6D4B\u5546\u5BB6\u300D'\n : !canWebAction\n ? '\u9700\u5148\u5728\u300C\u57FA\u7840\u914D\u7F6E\u300D\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C/\u4F1A\u8BDD'\n : '\u628A\u5F53\u524D\u5546\u5BB6\u56FA\u5B9A\u4E3A\u8BE5\u6A21\u578B\u7684\u670D\u52A1\u6E20\u9053\uFF08\u4F18\u5148\u8DEF\u7531\uFF0C\u5F02\u5E38\u65F6\u81EA\u52A8\u5207\u6362\u667A\u80FD\u4F18\u9009\uFF09'\n }\n >\n {isBusy ? '\u5904\u7406\u4E2D...' : '\u56FA\u5B9A\u5546\u5BB6'}\n </button>\n )}\n\n {isChannelDisabled ? (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleRestore}\n disabled={isBusy || !canWebAction || isProbing || isQueued}\n data-tooltip={\n isProbing || isQueued\n ? '\u63A2\u6D4B\u5B8C\u6210\u540E\u518D\u6062\u590D'\n : canWebAction\n ? '\u6062\u590D\u8BE5\u5546\u5BB6\u5BF9\u6B64\u6A21\u578B\u7684\u670D\u52A1'\n : '\u9700\u5148\u5728\u300C\u57FA\u7840\u914D\u7F6E\u300D\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C/\u4F1A\u8BDD'\n }\n >\n {isBusy ? '\u5904\u7406\u4E2D...' : '\u6062\u590D'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleDisable}\n disabled={isBusy || !hasMerchant || !canWebAction || isProbing || isQueued}\n data-tooltip={\n isProbing || isQueued\n ? '\u63A2\u6D4B\u5B8C\u6210\u540E\u518D\u7981\u7528'\n : !hasMerchant\n ? '\u8BE5\u6A21\u578B\u6682\u65E0\u5546\u5BB6\u6570\u636E\uFF0C\u8BF7\u5148\u300C\u63A2\u6D4B\u5546\u5BB6\u300D'\n : !canWebAction\n ? '\u9700\u5148\u5728\u300C\u57FA\u7840\u914D\u7F6E\u300D\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C/\u4F1A\u8BDD'\n : '\u7981\u7528\u5F53\u524D\u5546\u5BB6\u5BF9\u8BE5\u6A21\u578B\u7684\u670D\u52A1\uFF0C\u8DEF\u7531\u5C06\u4E0D\u518D\u547D\u4E2D\u6B64\u6E20\u9053'\n }\n >\n {isBusy ? '\u5904\u7406\u4E2D...' : '\u7981\u7528'}\n </button>\n )}\n\n <button\n type=\"button\"\n className={`dsh-a6-btn dsh-a6-btn-sm ${model.inDsh ? 'dsh-a6-btn-in-dsh' : 'dsh-a6-btn-primary'}`}\n onClick={handleToggleDsh}\n data-tooltip={model.inDsh ? '\u5DF2\u52A0\u5165 DSH \u6A21\u578B\u9009\u62E9\u5668 (\u70B9\u51FB\u79FB\u9664)' : '\u6DFB\u52A0\u81F3 DSH \u6A21\u578B\u9009\u62E9\u5668'}\n >\n {model.inDsh ? '\u79FB\u9664\u6A21\u578B' : '\u6DFB\u52A0\u6A21\u578B'}\n </button>\n\n <button\n type=\"button\"\n className={`dsh-a6-expand-toggle-btn ${expanded ? 'open' : ''}`}\n onClick={() => setExpanded(!expanded)}\n data-tooltip={expanded ? '\u6536\u8D77\u4EF7\u683C\u8BE6\u60C5' : '\u5C55\u5F00\u5B98\u65B9\u57FA\u51C6\u4EF7\u4E0E\u5546\u6237\u5B9E\u65F6\u4EF7\u5BF9\u6BD4\u8868'}\n data-tooltip-pos=\"left\"\n >\n {expanded ? '\u6536\u8D77' : '\u8BE6\u60C5'}\n </button>\n </div>\n </div>\n\n {actionError && (\n <div className=\"dsh-a6-action-error\" role=\"alert\">\n {actionError}\n </div>\n )}\n </div>\n\n {/* 2. Bottom Detailed Price Comparison Table (Only when expanded) */}\n {expanded && (\n <div className=\"dsh-a6-detail-container\">\n <div className=\"dsh-a6-detail-top-row\">\n <div className=\"dsh-a6-dt-left\">\n <span className=\"dsh-a6-dt-label\">\u6E20\u9053\u8BF4\u660E</span>\n <span className=\"dsh-a6-dt-desc\">\n {merchant?.description || '\u9AD8\u5E76\u53D1 \u4E3B\u6253\u4FBF\u5B9C \u7A33\u5B9A'}\n </span>\n </div>\n {merchant?.channel_name && (\n <div className=\"dsh-a6-dt-right\">\n <span className=\"dsh-a6-dt-label\">\u547D\u4E2D\u7EBF\u8DEF</span>\n <span className=\"dsh-a6-dt-channel-name\">\n {merchant.channel_name} (ID: {merchant.channel_id})\n </span>\n </div>\n )}\n </div>\n\n <div className=\"dsh-a6-dt-divider\" />\n\n {/* Clean Price Comparison Table */}\n <div className=\"dsh-a6-dt-table-col\">\n <table className=\"dsh-a6-price-table\">\n <thead>\n <tr>\n <th className=\"dsh-a6-th-blank\"></th>\n <th>\u8F93\u5165\u4EF7 (1M)</th>\n <th>\u8F93\u51FA\u4EF7 (1M)</th>\n <th>\u7F13\u5B58\u8BFB (1M)</th>\n <th>\u7F13\u5B58\u5199 (1M)</th>\n </tr>\n </thead>\n <tbody>\n <tr className=\"dsh-a6-tr-official\">\n <td className=\"dsh-a6-td-label\">\u5B98\u65B9\u4EF7</td>\n <td>{merchant?.official_price?.input_cny || '\u00A526.884'}</td>\n <td>{merchant?.official_price?.output_cny || '\u00A5134.418'}</td>\n <td>{merchant?.official_price?.cache_read_cny || '\u00A52.688'}</td>\n <td>{merchant?.official_price?.cache_write_cny || '\u00A533.605'}</td>\n </tr>\n <tr className=\"dsh-a6-tr-merchant\">\n <td className=\"dsh-a6-td-label\">\u5546\u6237\u4EF7</td>\n <td className=\"dsh-a6-td-bold\">{merchant?.input_price_cny || '\u00A50.1364'}</td>\n <td className=\"dsh-a6-td-bold\">{merchant?.output_price_cny || '\u00A50.6822'}</td>\n <td className=\"dsh-a6-td-bold\">{merchant?.cache_read_price_cny || '\u00A50.0136'}</td>\n <td className=\"dsh-a6-td-bold\">{merchant?.cache_write_price_cny || '\u00A50.1705'}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* 3. \u56FA\u5B9A\u786E\u8BA4\u5F39\u7A97\uFF08\u8F7B\u91CF\uFF0C\u65E0\u5546\u5BB6\u9009\u62E9\u5668/\u515C\u5E95\u5F00\u5173\uFF09 */}\n {pinConfirmOpen && merchant && (\n <div\n className=\"dsh-a6-pin-modal-overlay\"\n onClick={(e) => {\n e.stopPropagation();\n setPinConfirmOpen(false);\n }}\n >\n <div\n className=\"dsh-a6-pin-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"\u56FA\u5B9A\u5546\u5BB6\u786E\u8BA4\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"dsh-a6-pin-modal-title\">\u56FA\u5B9A\u5546\u5BB6</div>\n <div className=\"dsh-a6-pin-modal-body\">\n <div className=\"dsh-a6-pin-modal-row\">\n <span className=\"dsh-a6-pin-modal-label\">\u6A21\u578B</span>\n <span className=\"dsh-a6-pin-modal-value\">{model.model_name}</span>\n </div>\n <div className=\"dsh-a6-pin-modal-row\">\n <span className=\"dsh-a6-pin-modal-label\">\u5546\u5BB6</span>\n <span className=\"dsh-a6-pin-modal-value\">\n {merchant.channel_name} (ID: {merchant.channel_id})\n </span>\n </div>\n <div className=\"dsh-a6-pin-modal-row\">\n <span className=\"dsh-a6-pin-modal-label\">\u5F53\u524D\u4EF7</span>\n <span className=\"dsh-a6-pin-modal-value\">\n \u8F93\u5165 {merchant.input_price_cny} \u00B7 \u8F93\u51FA {merchant.output_price_cny}\n </span>\n </div>\n <p className=\"dsh-a6-pin-modal-note\">\n \u56FA\u5B9A\u540E\u8BE5\u6A21\u578B\u7684\u6D41\u91CF\u4F18\u5148\u8D70\u6B64\u5546\u5BB6\uFF1B\u5546\u5BB6\u5F02\u5E38\u65F6\u81EA\u52A8\u5207\u6362\u667A\u80FD\u4F18\u9009\uFF08\u5E73\u53F0\u9ED8\u8BA4\uFF09\u3002\u56FA\u5B9A\u751F\u6548\u4E8E\u5F53\u524D API Key \u4EE4\u724C\uFF0C\u53EF\u968F\u65F6\u53D6\u6D88\u3002\n </p>\n {actionError && <div className=\"dsh-a6-action-error\">{actionError}</div>}\n </div>\n <div className=\"dsh-a6-pin-modal-foot\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={() => setPinConfirmOpen(false)}\n disabled={isBusy}\n >\n \u53D6\u6D88\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={handleConfirmPin}\n disabled={isBusy}\n >\n {isBusy ? '\u56FA\u5B9A\u4E2D...' : '\u786E\u8BA4\u56FA\u5B9A'}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n", "import React, { useState } from 'react';\nimport { store } from '../store.js';\nimport type { BalanceInfo, A6ApiConfig, ApiRoutingLogItem } from '../../types.js';\n\nexport const AccountPanel: React.FC<{\n balance: BalanceInfo | null;\n config: A6ApiConfig;\n recentLogs?: ApiRoutingLogItem[];\n onNavigateToConfig?: () => void;\n}> = ({ balance, config, recentLogs = [], onNavigateToConfig }) => {\n const [refreshing, setRefreshing] = useState(false);\n\n const handleRefreshBalance = async () => {\n setRefreshing(true);\n await store.refreshBalance();\n setRefreshing(false);\n };\n\n const hasAuth = balance?.hasAccountAuth ?? false;\n const isLow = balance ? balance.isLow : false;\n\n const formatLogTime = (ts: number) => {\n if (!ts) return '\u521A\u521A';\n const d = new Date(ts * 1000);\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}:${d.getSeconds().toString().padStart(2, '0')}`;\n };\n\n return (\n <div className=\"dsh-a6-account-page\">\n {/* 1. Real Balance Banner */}\n <div className={`dsh-a6-balance-banner ${isLow ? 'low-balance' : ''}`}>\n <div className=\"dsh-a6-balance-header\">\n <div className=\"dsh-a6-balance-left\">\n <div className=\"dsh-a6-balance-main-title\">\n <span className=\"dsh-a6-balance-label\">\u8D26\u6237\u771F\u5B9E\u4F59\u989D (\u5B9E\u65F6\u540C\u6B65)</span>\n <div className=\"dsh-a6-balance-num-row\">\n <span className={`dsh-a6-balance-amount ${!hasAuth ? 'unauthed' : ''}`}>\n {hasAuth ? (balance?.accountBalanceFormatted ?? '$0.00') : '\u672A\u8FDE\u63A5'}\n </span>\n {hasAuth && balance?.accountBalanceCnyFormatted && (\n <span className=\"dsh-a6-balance-cny\">{balance.accountBalanceCnyFormatted}</span>\n )}\n <span className={`dsh-a6-status-pill ${hasAuth ? 'success' : 'warn'}`}>\n {hasAuth ? '\u8D26\u6237\u5DF2\u540C\u6B65' : '\u672A\u8FDE\u63A5\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C'}\n </span>\n </div>\n </div>\n\n {isLow && (\n <span className=\"dsh-a6-low-alert\">\n \u4F59\u989D\u8F83\u4F4E (&lt; $0.50)\uFF0C\u5EFA\u8BAE\u53CA\u65F6\u5145\u503C\u4EE5\u4FDD\u969C\u6B63\u5E38\u8C03\u7528\n </span>\n )}\n </div>\n\n <div className=\"dsh-a6-balance-actions\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleRefreshBalance}\n disabled={refreshing}\n data-tooltip=\"\u4ECE A6API \u63A7\u5236\u53F0\u540C\u6B65\u83B7\u53D6\u6700\u65B0\u8D26\u6237\u771F\u5B9E\u53EF\u7528\u4F59\u989D\u4E0E\u6D88\u8017\u7EDF\u8BA1\uFF08\u4E0D\u6D88\u8017 Token\uFF09\"\n data-tooltip-pos=\"down\"\n >\n {refreshing ? '\u5237\u65B0\u4E2D...' : '\u5237\u65B0\u4F59\u989D'}\n </button>\n <a\n href=\"https://a6api.com/console\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n style={{ textDecoration: 'none' }}\n data-tooltip=\"\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00 A6API \u63A7\u5236\u53F0\u8FDB\u884C\u5728\u7EBF\u5145\u503C\u6216\u7BA1\u7406\u51ED\u636E\"\n data-tooltip-pos=\"down-left\"\n >\n \u524D\u5F80\u5145\u503C / \u63A7\u5236\u53F0\n </a>\n </div>\n </div>\n\n {/* 2. Statistical KPI Cards */}\n <div className=\"dsh-a6-stat-cards-grid\">\n <div className=\"dsh-a6-kpi-card\">\n <span className=\"dsh-a6-kpi-label\">\u5173\u8054\u8D26\u6237</span>\n <span className=\"dsh-a6-kpi-val\">\n {hasAuth ? `${balance?.username || '\u5DF2\u8BA4\u8BC1\u7528\u6237'} (#${balance?.userId || '\u2014'})` : '\u672A\u7ED1\u5B9A'}\n </span>\n </div>\n <div className=\"dsh-a6-kpi-card\">\n <span className=\"dsh-a6-kpi-label\">\u5386\u53F2\u603B\u6D88\u8017</span>\n <span className=\"dsh-a6-kpi-val\">\n {hasAuth ? `$${balance?.usedUsd?.toFixed(2) ?? '0.00'}` : '\u2014'}\n </span>\n </div>\n <div className=\"dsh-a6-kpi-card\">\n <span className=\"dsh-a6-kpi-label\">\u7D2F\u8BA1\u8BF7\u6C42\u6B21\u6570</span>\n <span className=\"dsh-a6-kpi-val\">\n {hasAuth ? `${balance?.requestCount ?? 0} \u6B21` : '\u2014'}\n </span>\n </div>\n <div className=\"dsh-a6-kpi-card\">\n <span className=\"dsh-a6-kpi-label\">\u5B9E\u65F6\u6C47\u7387\u53C2\u8003</span>\n <span className=\"dsh-a6-kpi-val\">1 USD \u2248 6.7209 CNY</span>\n </div>\n </div>\n </div>\n\n {/* 3. Auth Warning Banner if Not Connected */}\n {!hasAuth && (\n <div className=\"dsh-a6-auth-banner-box\">\n <div className=\"dsh-a6-auth-banner-content\">\n <div className=\"dsh-a6-auth-banner-title\">\u8FDE\u63A5\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u4EE5\u89E3\u9501\u5B8C\u6574\u8D44\u4EA7\u76D1\u63A7</div>\n <div className=\"dsh-a6-auth-banner-desc\">\n \u586B\u5165\u60A8\u7684 <strong>A6API \u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C</strong> \u540E\uFF0C\u5373\u53EF\u5728\u6B64\u5B9E\u65F6\u67E5\u770B\u8D26\u6237\u771F\u5B9E\u53EF\u7528\u4F59\u989D\u3001\u5386\u53F2\u6D88\u8017\u3001\u7D2F\u8BA1\u8BF7\u6C42\u4EE5\u53CA\u5546\u6237\u8DEF\u7531\u4EF7\u683C\u6307\u6807\u3002\n </div>\n </div>\n {onNavigateToConfig && (\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={onNavigateToConfig}\n >\n \u586B\u5199\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\n </button>\n )}\n </div>\n )}\n\n {/* 4. Recent Routing Requests Snapshot */}\n <div className=\"dsh-a6-logs-section\">\n <div className=\"dsh-a6-logs-header\">\n <span className=\"dsh-a6-logs-title\">\u6700\u8FD1\u8DEF\u7531\u8C03\u7528\u660E\u7EC6 (\u5B9E\u65F6\u5FEB\u7167)</span>\n <span className=\"dsh-a6-logs-subtitle\">\u5C55\u793A\u901A\u8FC7\u5F53\u524D A6API \u63A5\u5165\u7684\u8FD1\u671F\u8BF7\u6C42\u4E0E\u5546\u6237\u8DEF\u7531\u8017\u65F6</span>\n </div>\n\n {recentLogs && recentLogs.length > 0 ? (\n <div className=\"dsh-a6-logs-table-wrapper\">\n <table className=\"dsh-a6-logs-table\">\n <thead>\n <tr>\n <th>\u8C03\u7528\u65F6\u95F4</th>\n <th>\u72B6\u6001</th>\n <th>\u5546\u6237id</th>\n <th>\u8BF7\u6C42\u6A21\u578B</th>\n <th>\u8F93\u5165/\u8F93\u51FA</th>\n <th>\u82B1\u8D39</th>\n <th>\u8017\u65F6</th>\n </tr>\n </thead>\n <tbody>\n {recentLogs.map((log, idx) => {\n const isErr =\n log.status === 'error' ||\n (log.status as string) === 'failed' ||\n (log.raw && (\n log.raw.type !== 2 ||\n (log.raw.other && (\n log.raw.other.includes('\"request_final_status\":\"failed\"') ||\n log.raw.other.includes('\"request_final_status\":\"error\"') ||\n log.raw.other.includes('\"request_final_status\":\"upstream_error\"')\n )) ||\n Boolean(log.raw.content && log.raw.content.startsWith('status_code='))\n ));\n\n const channelNum = Number(log.channel || log.raw?.channel || 0);\n\n return (\n <tr key={log.id || idx}>\n <td className=\"dsh-a6-log-time\">{formatLogTime(log.created_at)}</td>\n <td>\n <span className={`dsh-a6-log-status ${isErr ? 'err' : 'ok'}`}>\n {isErr ? '\u5931\u8D25' : '\u6210\u529F'}\n </span>\n </td>\n <td className=\"dsh-a6-log-channel\">\n {channelNum > 0 ? (\n <span className=\"dsh-a6-log-channel-badge\">\n #{channelNum}\n </span>\n ) : (\n <span className=\"dsh-a6-log-channel-empty\">\n \u65E0\n </span>\n )}\n </td>\n <td className=\"dsh-a6-log-model\">\n <code>{log.model_name}</code>\n </td>\n <td className=\"dsh-a6-log-tokens\">\n {log.prompt_tokens || 0} / {log.completion_tokens || 0}\n </td>\n <td className=\"dsh-a6-log-cost\">\n {log.cost_formatted || '$0.00'}\n </td>\n <td className=\"dsh-a6-log-time-use\">\n {log.use_time ? `${log.use_time}s` : '\u2014'}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"dsh-a6-empty-logs\">\n <span>\u6682\u65E0\u8FD1\u671F\u8C03\u7528\u8BB0\u5F55\u3002\u5728 DSH \u4E2D\u53D1\u8D77\u6A21\u578B\u5BF9\u8BDD\u6216\u70B9\u51FB\u300C\u63A2\u6D4B\u5546\u5BB6\u300D\u540E\uFF0C\u8C03\u7528\u660E\u7EC6\u5C06\u5728\u6B64\u5B9E\u65F6\u5C55\u793A\u3002</span>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport { AccountPanel as BalanceCard };\n", "import React, { useState, useEffect } from 'react';\nimport { store } from '../store.js';\nimport type { A6ApiConfig } from '../../types.js';\n\n/** \u4E0E\u670D\u52A1\u7AEF maskConfig \u4E00\u81F4\u7684\u8131\u654F\u5360\u4F4D\u7B26\uFF1A\u4EE3\u8868\u300C\u5DF2\u914D\u7F6E\uFF0C\u4F46\u5BC6\u94A5\u53EA\u5B58\u4E8E\u672C\u673A\u300D */\nconst MASK = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022';\n\nexport const ConfigPanel: React.FC<{\n config: A6ApiConfig;\n dshConfiguredModels: string[];\n}> = ({ config, dshConfiguredModels }) => {\n const [apiKey, setApiKey] = useState(config.apiKey || '');\n const [accessToken, setAccessToken] = useState(config.accessToken || '');\n const [clearKey, setClearKey] = useState(false);\n const [clearToken, setClearToken] = useState(false);\n const [selectedNode, setSelectedNode] = useState(\n config.baseURL || 'https://api.a6api.com',\n );\n // \u81EA\u5B9A\u4E49\u8282\u70B9\u8F93\u5165\u6846\uFF1AbaseURL \u975E\u5B98\u65B9\u8282\u70B9\u65F6\u4EE5\u5176\u4E3A\u521D\u503C\uFF08customBaseURL \u6B7B\u5B57\u6BB5\u5DF2\u79FB\u9664\uFF09\n const [customNode, setCustomNode] = useState(\n config.baseURL && config.baseURL !== 'https://api.a6api.com' && config.baseURL !== 'https://a6.a6api.com'\n ? config.baseURL\n : '',\n );\n const [isCustom, setIsCustom] = useState(\n config.baseURL !== 'https://api.a6api.com' && config.baseURL !== 'https://a6.a6api.com',\n );\n const [showKey, setShowKey] = useState(false);\n const [showToken, setShowToken] = useState(false);\n const [showHelp, setShowHelp] = useState(false);\n\n const [saving, setSaving] = useState(false);\n const [saveSuccess, setSaveSuccess] = useState(false);\n\n // \u503C\u4E3A\u5360\u4F4D\u7B26\u5373\u8868\u793A\u300C\u5DF2\u4FDD\u5B58\u5BC6\u94A5\u300D\uFF0C\u6B64\u65F6\u8F93\u5165\u6846\u7559\u7A7A\u5C55\u793A\uFF0C\u4FDD\u5B58\u65F6\u4E0D\u56DE\u4F20\u5360\u4F4D\u7B26\n const apiKeySet = apiKey === MASK;\n const tokenSet = accessToken === MASK;\n\n useEffect(() => {\n setApiKey(config.apiKey || '');\n setAccessToken(config.accessToken || '');\n setClearKey(false);\n setClearToken(false);\n setSelectedNode(config.baseURL || 'https://api.a6api.com');\n setCustomNode(\n config.baseURL && config.baseURL !== 'https://api.a6api.com' && config.baseURL !== 'https://a6.a6api.com'\n ? config.baseURL\n : '',\n );\n setIsCustom(\n config.baseURL !== 'https://api.a6api.com' && config.baseURL !== 'https://a6.a6api.com',\n );\n }, [config]);\n\n const handleSave = async () => {\n setSaving(true);\n const finalBaseUrl = isCustom ? customNode.trim() || 'https://api.a6api.com' : selectedNode;\n // \u672A\u4FEE\u6539\uFF08\u5360\u4F4D\u7B26\u6001\uFF09\u2192 \u4E0D\u53D1\u9001\u8BE5\u5B57\u6BB5\uFF0C\u670D\u52A1\u7AEF\u4FDD\u7559\u539F\u503C\uFF1B\u70B9\u51FB\u300C\u6E05\u9664\u300D\u2192 \u53D1\u9001\u7A7A\u4E32\u5220\u9664\n const newApiKey = apiKeySet ? (clearKey ? '' : undefined) : apiKey.trim();\n const newToken = tokenSet ? (clearToken ? '' : undefined) : accessToken.trim();\n const ok = await store.saveConfig({\n ...(newApiKey !== undefined ? { apiKey: newApiKey } : {}),\n ...(newToken !== undefined ? { accessToken: newToken } : {}),\n baseURL: finalBaseUrl,\n });\n setSaving(false);\n if (ok) {\n setSaveSuccess(true);\n setTimeout(() => setSaveSuccess(false), 3500);\n }\n };\n\n return (\n <div className=\"dsh-a6-config-page\">\n {/* 1. API Gateway Node Selection */}\n <div className=\"dsh-a6-config-section\">\n <div className=\"dsh-a6-section-heading\">\n <span className=\"dsh-a6-heading-title\">API \u63A5\u5165\u8282\u70B9 (Base URL)</span>\n <span className=\"dsh-a6-heading-desc\">\n \u9009\u62E9\u79BB\u60A8\u6700\u8FD1\u7684 A6API \u805A\u5408\u7F51\u5173\u63A5\u5165\u70B9\uFF0C\u652F\u6301 CDN \u8282\u70B9\u4E0E\u76F4\u8FDE\u5907\u7528\u8282\u70B9\u3002\n </span>\n </div>\n\n <div className=\"dsh-a6-node-picker\">\n <button\n type=\"button\"\n className={`dsh-a6-node-pill ${!isCustom && selectedNode === 'https://api.a6api.com' ? 'active' : ''}`}\n onClick={() => {\n setIsCustom(false);\n setSelectedNode('https://api.a6api.com');\n }}\n >\n https://api.a6api.com (CDN \u63A8\u8350)\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-node-pill ${!isCustom && selectedNode === 'https://a6.a6api.com' ? 'active' : ''}`}\n onClick={() => {\n setIsCustom(false);\n setSelectedNode('https://a6.a6api.com');\n }}\n >\n https://a6.a6api.com (\u76F4\u8FDE\u5907\u7528)\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-node-pill ${isCustom ? 'active' : ''}`}\n onClick={() => setIsCustom(true)}\n >\n \u81EA\u5B9A\u4E49\u8282\u70B9\n </button>\n </div>\n\n {isCustom && (\n <input\n type=\"text\"\n className=\"dsh-a6-input\"\n placeholder=\"https://your-custom-gateway.com\"\n value={customNode}\n onChange={(e) => setCustomNode(e.target.value)}\n style={{ marginTop: '8px' }}\n />\n )}\n </div>\n\n {/* 2. Authentication Tokens */}\n <div className=\"dsh-a6-config-section\">\n <div className=\"dsh-a6-section-heading\">\n <span className=\"dsh-a6-heading-title\">\u8BBF\u95EE\u9274\u6743\u4E0E\u4EE4\u724C\u51ED\u636E</span>\n <span className=\"dsh-a6-heading-desc\">\n \u914D\u7F6E\u6A21\u578B\u8C03\u7528 API Key \u4EE5\u53CA\u7528\u4E8E\u540C\u6B65\u8D26\u6237\u4F59\u989D\u4E0E\u5546\u6237\u884C\u60C5\u7684\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u3002\n </span>\n </div>\n\n <div className=\"dsh-a6-config-fields-grid\">\n {/* API Key */}\n <div className=\"dsh-a6-field\">\n <div className=\"dsh-a6-field-header\">\n <label className=\"dsh-a6-label\">A6API \u4EE4\u724C (API Key)</label>\n <div className=\"dsh-a6-field-header-actions\">\n {apiKeySet && (\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => {\n setClearKey(true);\n setApiKey('');\n }}\n >\n \u6E05\u9664\n </button>\n )}\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => setShowKey(!showKey)}\n >\n {showKey ? '\u9690\u85CF' : '\u663E\u793A'}\n </button>\n </div>\n </div>\n <div className=\"dsh-a6-input-wrapper\">\n <input\n type={showKey ? 'text' : 'password'}\n className=\"dsh-a6-input\"\n placeholder={apiKeySet ? '\u5DF2\u4FDD\u5B58 \u00B7 \u8F93\u5165\u65B0 Key \u53EF\u66FF\u6362' : 'sk-xxxxxxxxxxxxxxxxxxxxxxxx'}\n value={apiKeySet ? '' : apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n />\n </div>\n <span className=\"dsh-a6-field-hint\">\n {apiKeySet\n ? '\u5DF2\u914D\u7F6E API Key\uFF08\u4EC5\u4FDD\u5B58\u5728\u672C\u673A ~/.dsh/.credentials.yaml\uFF0C\u4E0D\u56DE\u4F20\u754C\u9762\uFF09\u3002'\n : '\u7528\u4E8E\u5411 A6API \u53D1\u8D77\u6A21\u578B\u5BF9\u8BDD\u8BF7\u6C42\u4E0E\u62C9\u53D6\u767D\u540D\u5355\u6A21\u578B\u3002'}\n </span>\n </div>\n\n {/* System Access Token */}\n <div className=\"dsh-a6-field\">\n <div className=\"dsh-a6-field-header\">\n <label className=\"dsh-a6-label\">\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C (Access Token)</label>\n <div className=\"dsh-a6-field-header-actions\">\n {tokenSet && (\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => {\n setClearToken(true);\n setAccessToken('');\n }}\n >\n \u6E05\u9664\n </button>\n )}\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => setShowToken(!showToken)}\n >\n {showToken ? '\u9690\u85CF' : '\u663E\u793A'}\n </button>\n </div>\n </div>\n <div className=\"dsh-a6-input-wrapper\">\n <input\n type={showToken ? 'text' : 'password'}\n className=\"dsh-a6-input\"\n placeholder={\n tokenSet\n ? '\u5DF2\u4FDD\u5B58 \u00B7 \u8F93\u5165\u65B0\u4EE4\u724C\u53EF\u66FF\u6362'\n : '\u5728\u63A7\u5236\u53F0\u5B89\u5168\u8BBE\u7F6E\u4E2D\u590D\u5236\uFF0C\u4F8B\u5982 eyJhbGciOi...'\n }\n value={tokenSet ? '' : accessToken}\n onChange={(e) => setAccessToken(e.target.value)}\n />\n </div>\n <div className=\"dsh-a6-field-footer\">\n <span className=\"dsh-a6-field-hint\">\n {tokenSet\n ? '\u5DF2\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\uFF08\u4EC5\u4FDD\u5B58\u5728\u672C\u673A\uFF0C\u4E0D\u56DE\u4F20\u754C\u9762\uFF09\u3002'\n : '\u7528\u4E8E\u514D\u5931\u6548\u540C\u6B65\u8D26\u6237\u771F\u5B9E\u4F59\u989D\u4E0E\u5546\u6237\u6307\u6807\u3002'}\n </span>\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => setShowHelp(!showHelp)}\n style={{ fontSize: '11px', whiteSpace: 'nowrap' }}\n >\n {showHelp ? '\u6536\u8D77\u6559\u7A0B' : '\u83B7\u53D6\u6559\u7A0B'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Tutorial Drawer */}\n {showHelp && (\n <div className=\"dsh-a6-help-drawer\">\n <div className=\"dsh-a6-help-title\">\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u83B7\u53D6\u6B65\u9AA4\uFF08\u6C38\u4E45\u6709\u6548\uFF09\uFF1A</div>\n <ol className=\"dsh-a6-help-list\">\n <li>\n \u5728\u6D4F\u89C8\u5668\u6253\u5F00\u5E76\u767B\u5F55{' '}\n <a href=\"https://a6api.com/console/personal\" target=\"_blank\" rel=\"noreferrer\">\n a6api.com/console/personal\n </a>{' '}\n \uFF08\u4E2A\u4EBA\u8BBE\u7F6E - \u5B89\u5168\u8BBE\u7F6E\uFF09\n </li>\n <li>\u5728\u300C\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u300D\u680F\u76EE\u76F4\u63A5\u70B9\u51FB\u590D\u5236\u4EE4\u724C\u5B57\u7B26\u4E32\uFF08\u4F8B\u5982 <code>eyJhbGciOi...</code>\uFF09</li>\n <li>\u7C98\u8D34\u5230\u4E0A\u65B9\u7684\u300C\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u300D\u8F93\u5165\u6846\u4E2D\u5E76\u70B9\u51FB\u4E0B\u65B9\u300C\u4FDD\u5B58\u914D\u7F6E\u300D\u5373\u53EF\u81EA\u52A8\u540C\u6B65\u4F59\u989D\uFF01</li>\n </ol>\n </div>\n )}\n </div>\n\n {/* 3. DSH LLM Provider Integration Overview */}\n <div className=\"dsh-a6-config-section\">\n <div className=\"dsh-a6-section-heading\">\n <span className=\"dsh-a6-heading-title\">DSH \u539F\u751F LLM \u63D0\u4F9B\u5546\u96C6\u6210\u72B6\u6001</span>\n <span className=\"dsh-a6-heading-desc\">\n \u63D2\u4EF6\u5DF2\u5C06 A6API \u6CE8\u518C\u4E3A DSH \u539F\u751F\u6A21\u578B\u63D0\u4F9B\u5546 (<code>a6api</code>)\u3002\u5728\u300C\u53EF\u7528\u6A21\u578B\u300D\u4E2D\u542F\u7528\u7684\u6A21\u578B\u5C06\u81EA\u52A8\u5199\u5165 DSH \u914D\u7F6E\u6587\u4EF6\u3002\n </span>\n </div>\n\n <div className=\"dsh-a6-integration-card\">\n <div className=\"dsh-a6-int-row\">\n <span className=\"dsh-a6-int-key\">\u63D0\u4F9B\u5546\u6807\u8BC6</span>\n <span className=\"dsh-a6-int-val\"><code>a6api</code> (OpenAI-compatible)</span>\n </div>\n <div className=\"dsh-a6-int-row\">\n <span className=\"dsh-a6-int-key\">\u5F53\u524D\u5DF2\u542F\u7528\u6A21\u578B</span>\n <div className=\"dsh-a6-int-tags\">\n {dshConfiguredModels.length > 0 ? (\n dshConfiguredModels.map((m) => (\n <span key={m} className=\"dsh-a6-model-chip\">\n {m}\n </span>\n ))\n ) : (\n <span className=\"dsh-a6-empty-hint\">\u6682\u672A\u542F\u7528\u4EFB\u4F55\u6A21\u578B\uFF0C\u8BF7\u524D\u5F80\u300C\u53EF\u7528\u6A21\u578B\u300D\u9875\u9762\u70B9\u51FB\u300C\u6DFB\u52A0\u5230 DSH\u300D</span>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* 4. Save Action Bar */}\n <div className=\"dsh-a6-save-bar\">\n <div className=\"dsh-a6-save-status\">\n {saveSuccess && (\n <span className=\"dsh-a6-success-msg\">\n \u914D\u7F6E\u5DF2\u6210\u529F\u4FDD\u5B58\u5E76\u540C\u6B65\n </span>\n )}\n </div>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary\"\n onClick={handleSave}\n disabled={saving}\n style={{ minWidth: '100px' }}\n >\n {saving ? '\u6B63\u5728\u4FDD\u5B58...' : '\u4FDD\u5B58\u914D\u7F6E'}\n </button>\n </div>\n </div>\n );\n};\n", "import React from 'react';\nimport type { PriceFluctuationState } from '../../types.js';\n\n/**\n * \u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\uFF08\u8BBE\u7F6E\u9875\u5934\u90E8\u4E0E\u4FA7\u8FB9\u680F\u6D6E\u5C42\u5171\u7528\uFF09\uFF1A\n * \u672A\u914D\u7F6E\u4EE4\u724C\u663E\u793A `--`\uFF08\u7981\u7528\uFF09\uFF0C\u65E0\u53D8\u52A8\u7F6E\u7070\uFF08\u7981\u7528\uFF09\uFF0C\u6709\u5F85\u5904\u7406\u65F6\u70B9\u51FB\u8DF3\u5B98\u7F51\u5904\u7406\u3002\n * compact \u4E3A\u6D6E\u5C42\u5185\u7684\u7D27\u51D1\u7F29\u7A84\u7248\u3002\n */\nexport const PricePill: React.FC<{\n pf: PriceFluctuationState;\n hasToken: boolean;\n compact?: boolean;\n}> = ({ pf, hasToken, compact }) => {\n const n = Number(pf?.pendingCount ?? 0);\n const hasAuth = pf?.hasAuth !== false && !pf?.authError && Boolean(hasToken);\n const isAuthError = Boolean(pf?.authError);\n const isZero = n === 0;\n const isDisabled = !hasAuth || isZero;\n const compactCls = compact ? ' compact' : '';\n const cls = isDisabled\n ? !hasAuth\n ? `dsh-a6-price-pill disabled${compactCls}`\n : `dsh-a6-price-pill is-zero is-disabled-zero${compactCls}`\n : `dsh-a6-price-pill has-change${compactCls}`;\n const title = !hasAuth\n ? isAuthError\n ? '\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\u5DF2\u5931\u6548\uFF0C\u8BF7\u524D\u5F80\u57FA\u7840\u914D\u7F6E\u66F4\u65B0'\n : '\u672A\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C\uFF0C\u65E0\u6CD5\u83B7\u53D6\u4EF7\u683C\u53D8\u52A8'\n : isZero\n ? '\u6682\u65E0\u4EF7\u683C\u53D8\u52A8'\n : `\u6709 ${n} \u6761\u4EF7\u683C\u53D8\u52A8\u5F85\u5904\u7406\uFF0C\u70B9\u51FB\u524D\u5F80\u5B98\u7F51\u5904\u7406`;\n const onClick = () => {\n if (isDisabled) return;\n window.open('https://a6api.com/console/token', '_blank', 'noopener');\n };\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (isDisabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n };\n return (\n <div\n className={cls}\n onClick={isDisabled ? undefined : onClick}\n onKeyDown={onKeyDown}\n tabIndex={isDisabled ? -1 : 0}\n title={title}\n role=\"button\"\n aria-disabled={isDisabled}\n style={isDisabled ? { cursor: 'not-allowed' } : undefined}\n >\n <span className=\"dsh-a6-price-pill-label\">\u4EF7\u683C\u6CE2\u52A8\uFF1A</span>\n <span className=\"dsh-a6-price-pill-count\">{!hasAuth ? '--' : n}</span>\n </div>\n );\n};\n", "import React from 'react';\n\nconst MARKET_URL = 'https://a6api.com/models';\n\n/**\n * \u300C\u6A21\u578B\u5E02\u573A\u300D\u80F6\u56CA(\u4EC5\u4FA7\u8FB9\u680F\u6D6E\u5C42):\u4E0E\u8D26\u6237\u4F59\u989D / \u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\u540C\u6B3E\u5916\u89C2,\n * \u70B9\u51FB\u76F4\u8FBE A6api \u5B98\u7F51\u6A21\u578B\u5E02\u573A\u3002\n */\nexport const MarketPill: React.FC = () => {\n const onClick = () => {\n window.open(MARKET_URL, '_blank', 'noopener');\n };\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n };\n return (\n <div\n className=\"dsh-a6-market-pill\"\n onClick={onClick}\n onKeyDown={onKeyDown}\n tabIndex={0}\n role=\"button\"\n title=\"\u524D\u5F80 A6api \u6A21\u578B\u5E02\u573A\"\n >\n <span className=\"dsh-a6-market-pill-label\">\u6A21\u578B\u5E02\u573A</span>\n </div>\n );\n};\n", "import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { store } from '../store.js';\nimport { validateReasoningEfforts } from '../../types.js';\nimport type { CatalogModelEntry } from '../../types.js';\n\n/**\n * \u6A21\u578B\u76EE\u5F55\u9875\uFF08\u300C\u53EF\u7528\u6A21\u578B\u300D\u53F3\u4FA7 tab\uFF09\uFF1A\n * - \u300C\u4ECE A6API \u83B7\u53D6\u5E02\u573A\u6A21\u578B\u300D\uFF1A\u7FFB\u9875\u62C9\u53D6 A6API \u5E02\u573A\u5168\u90E8\u6A21\u578B ID \u5165\u76EE\u5F55\uFF08\u53C2\u6570\u521D\u59CB\u4E3A\u7A7A\uFF09\n * - \u300C\u4ECE OpenRouter \u4E00\u952E\u67E5\u8BE2\u300D\uFF1A\u5BF9\u5168\u90E8\u6A21\u578B\u67E5 OpenRouter \u5E76\u586B\u5145\u53C2\u6570\uFF08name \u4EC5\u7528\u6237\u624B\u52A8\u586B\u5199\uFF09\uFF1B\n * \u6BCF\u884C\u4E5F\u53EF\u5355\u72EC\u67E5\u8BE2\n * - \u7B5B\u9009\uFF1A\u53EF\u7528\u6A21\u578B\uFF08\u5F53\u524D\u4EE4\u724C\u767D\u540D\u5355\uFF0C\u4E0E\u300C\u53EF\u7528\u6A21\u578B\u300D\u9875\u540C\u6E90\uFF09/ \u53C2\u6570\u72B6\u6001\uFF08\u5DF2\u586B/\u672A\u586B\uFF09\n * - \u884C\u5185\u7F16\u8F91 settings.yaml \u539F\u751F\u6A21\u578B\u5B57\u6BB5\uFF1B\u4FDD\u5B58\u540E\u82E5\u8BE5\u6A21\u578B\u5DF2\u5728 DSH \u542F\u7528\uFF0C\n * \u670D\u52A1\u7AEF\u7ACB\u5373\u91CD\u5199 settings.yaml \u5BF9\u5E94\u6761\u76EE\uFF08\u53C2\u6570\u5373\u65F6\u751F\u6548\uFF09\n */\nexport const ModelCatalogPanel: React.FC = () => {\n const [catalog, setCatalog] = useState<CatalogModelEntry[]>(store.getState().catalog);\n const [models, setModels] = useState(store.getState().models);\n const [busy, setBusy] = useState<null | 'fetch' | 'query'>(store.getState().catalogBusy);\n const [search, setSearch] = useState('');\n const [availFilter, setAvailFilter] = useState<'all' | 'available' | 'unavailable'>('all');\n const [paramFilter, setParamFilter] = useState<'all' | 'filled' | 'empty'>('all');\n const [editingId, setEditingId] = useState<string | null>(null);\n const [queryingId, setQueryingId] = useState<string | null>(null);\n const [confirmClear, setConfirmClear] = useState(false);\n const confirmClearTimer = useRef<any>(null);\n const [msg, setMsg] = useState<{ kind: 'ok' | 'err'; text: string } | null>(null);\n const [draft, setDraft] = useState<{\n name: string;\n contextWindow: string;\n maxTokens: string;\n inputText: boolean;\n inputImage: boolean;\n reasoningText: string;\n reasoningFalse: boolean;\n }>({ name: '', contextWindow: '', maxTokens: '', inputText: false, inputImage: false, reasoningText: '', reasoningFalse: false });\n\n useEffect(() => {\n const unsub = store.subscribe(() => {\n const s = store.getState();\n setCatalog(s.catalog);\n setModels(s.models);\n setBusy(s.catalogBusy);\n });\n store.fetchCatalog();\n return unsub;\n }, []);\n\n // \u5F53\u524D\u4EE4\u724C\u767D\u540D\u5355\uFF08\u4E0E\u300C\u53EF\u7528\u6A21\u578B\u300D\u9875\u540C\u6E90\uFF09\uFF1B\u76EE\u5F55\u300C\u53EF\u7528\u300D\u7B5B\u9009\u57FA\u4E8E\u5B83\n const availableSet = useMemo(\n () => new Set(models.map((m) => m.model_name.toLowerCase())),\n [models],\n );\n\n const flash = (kind: 'ok' | 'err', text: string) => {\n setMsg({ kind, text });\n setTimeout(() => setMsg(null), 5000);\n };\n\n const handleFetchMarket = async () => {\n const r = await store.fetchMarketModels();\n if (r.ok) {\n if (r.failedPages && r.failedPages > 0) {\n flash('err', `\u5DF2\u83B7\u53D6 ${r.total} \u4E2A\u6A21\u578B\uFF08\u65B0\u589E ${r.added} \u4E2A\uFF09\uFF0C\u4F46\u6709 ${r.failedPages} \u9875\u62C9\u53D6\u5931\u8D25\uFF0C\u76EE\u5F55\u53EF\u80FD\u4E0D\u5B8C\u6574\uFF0C\u8BF7\u91CD\u8BD5`);\n } else {\n flash('ok', `\u5DF2\u83B7\u53D6 ${r.total} \u4E2A\u6A21\u578B\uFF08\u65B0\u589E ${r.added} \u4E2A\uFF09`);\n }\n } else flash('err', r.error || '\u83B7\u53D6\u5931\u8D25');\n };\n\n const handleQueryAll = async () => {\n const r = await store.queryOpenRouter();\n if (r.ok) {\n const nf = r.notFound?.length || 0;\n flash('ok', `\u5DF2\u66F4\u65B0 ${r.updated} \u4E2A\u6A21\u578B\u53C2\u6570${nf > 0 ? `\uFF0C${nf} \u4E2A\u672A\u5728 OpenRouter \u67E5\u5230\uFF08\u53C2\u6570\u7559\u7A7A\u53EF\u624B\u52A8\u586B\u5199\uFF09` : ''}`);\n } else flash('err', r.error || '\u67E5\u8BE2\u5931\u8D25');\n };\n\n const handleQueryOne = async (id: string) => {\n setQueryingId(id);\n const r = await store.queryOpenRouter([id]);\n setQueryingId(null);\n if (r.ok) {\n if ((r.updated || 0) > 0) flash('ok', `\u300C${id}\u300D\u5DF2\u4ECE OpenRouter \u586B\u5145\u53C2\u6570`);\n else flash('ok', `\u300C${id}\u300D\u5728 OpenRouter \u672A\u67E5\u5230\uFF0C\u53EF\u624B\u52A8\u586B\u5199\u53C2\u6570`);\n } else flash('err', r.error || '\u67E5\u8BE2\u5931\u8D25');\n };\n\n /** \u6E05\u7A7A\u76EE\u5F55\uFF1A\u9996\u6B21\u70B9\u51FB\u8FDB\u5165\u786E\u8BA4\u6001\uFF083s \u81EA\u52A8\u6062\u590D\uFF09\uFF0C\u518D\u6B21\u70B9\u51FB\u6267\u884C */\n const handleClear = async () => {\n if (!confirmClear) {\n setConfirmClear(true);\n if (confirmClearTimer.current) clearTimeout(confirmClearTimer.current);\n confirmClearTimer.current = setTimeout(() => setConfirmClear(false), 3000);\n return;\n }\n if (confirmClearTimer.current) clearTimeout(confirmClearTimer.current);\n setConfirmClear(false);\n setEditingId(null);\n const r = await store.clearCatalog();\n if (r.ok) flash('ok', '\u6A21\u578B\u76EE\u5F55\u5DF2\u6E05\u7A7A\uFF0C\u53EF\u91CD\u65B0\u300C\u4ECE A6API \u83B7\u53D6\u5E02\u573A\u6A21\u578B\u300D');\n else flash('err', r.error || '\u6E05\u7A7A\u5931\u8D25');\n };\n\n const startEdit = (entry: CatalogModelEntry) => {\n const re = entry.reasoningEfforts && typeof entry.reasoningEfforts === 'object' ? entry.reasoningEfforts : {};\n setDraft({\n name: entry.name || '',\n contextWindow: entry.contextWindow != null ? String(entry.contextWindow) : '',\n maxTokens: entry.maxTokens != null ? String(entry.maxTokens) : '',\n inputText: entry.input ? entry.input.includes('text') : false,\n inputImage: entry.input ? entry.input.includes('image') : false,\n // \u4FDD\u7559 off \u7B49 null \u503C\u9879\uFF08\u663E\u793A\u4E3A \"off: \"\uFF09\uFF0C\u907F\u514D\u7F16\u8F91\u4FDD\u5B58\u540E\u6863\u4F4D\u9759\u9ED8\u4E22\u5931\n reasoningText: Object.entries(re)\n .map(([k, v]) => `${k}: ${v === null ? '' : v}`)\n .join(', '),\n reasoningFalse: entry.reasoningEfforts === false,\n });\n setEditingId(entry.id);\n };\n\n const handleSave = async (id: string) => {\n const patch: Partial<CatalogModelEntry> = {};\n const name = draft.name.trim();\n // name \u4EC5\u7528\u6237\u624B\u52A8\u586B\u5199\uFF1A\u7A7A\u4E32 = \u6E05\u7A7A\uFF08\u53D1\u9001 null \u5220\u9664\u5DF2\u6709 name\uFF09\n patch.name = name || (null as any);\n const ctx = Number(draft.contextWindow);\n if (draft.contextWindow.trim() !== '') {\n if (!Number.isInteger(ctx) || ctx < 1) {\n flash('err', 'contextWindow \u5FC5\u987B\u662F\u6B63\u6574\u6570');\n return;\n }\n patch.contextWindow = ctx;\n } else {\n patch.contextWindow = null as any; // \u6E05\u7A7A = \u5220\u9664\u5B57\u6BB5\n }\n const maxT = Number(draft.maxTokens);\n if (draft.maxTokens.trim() !== '') {\n if (!Number.isInteger(maxT) || maxT < 1) {\n flash('err', 'maxTokens \u5FC5\u987B\u662F\u6B63\u6574\u6570');\n return;\n }\n patch.maxTokens = maxT;\n } else {\n patch.maxTokens = null as any;\n }\n const mods: ('text' | 'image')[] = [];\n if (draft.inputText) mods.push('text');\n if (draft.inputImage) mods.push('image');\n patch.input = mods.length > 0 ? mods : null as any;\n\n if (draft.reasoningFalse) {\n patch.reasoningEfforts = false;\n } else {\n const text = draft.reasoningText.trim();\n if (text) {\n const parsed: Record<string, string | null> = {};\n let bad = false;\n for (const seg of text.split(',')) {\n const idx = seg.indexOf(':');\n if (idx < 0) {\n bad = true;\n break;\n }\n const k = seg.slice(0, idx).trim();\n const v = seg.slice(idx + 1).trim();\n if (!k) {\n bad = true;\n break;\n }\n parsed[k] = v || null;\n }\n if (bad) {\n flash('err', 'reasoningEfforts \u683C\u5F0F\u5E94\u4E3A \"low: low, medium: medium\"');\n return;\n }\n // DSH \u8BED\u4E49\u9884\u68C0\uFF08\u4E0E\u670D\u52A1\u7AEF\u4E00\u81F4\uFF09\uFF1A\u952E \u2208 \u6863\u4F4D\u3001\u503C\u975E\u7A7A\uFF08\u4EC5 off \u53EF null\uFF09\u3001\u81F3\u5C11\u4E00\u4E2A\u975E off \u6863\u4F4D\n const checked = validateReasoningEfforts(parsed);\n if (!checked.ok) {\n flash('err', checked.error);\n return;\n }\n patch.reasoningEfforts = checked.value;\n } else {\n patch.reasoningEfforts = null as any; // \u5220\u9664\n }\n }\n\n const r = await store.updateCatalogEntry(id, patch);\n if (r.ok) {\n setEditingId(null);\n flash('ok', `\u300C${id}\u300D\u5DF2\u4FDD\u5B58${store.getState().dshConfiguredModels.some((m) => m.toLowerCase() === id.toLowerCase()) ? '\uFF0C\u5E76\u5DF2\u540C\u6B65\u5230 DSH \u914D\u7F6E' : ''}`);\n } else {\n flash('err', r.error || '\u4FDD\u5B58\u5931\u8D25');\n }\n };\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n return catalog\n .filter((e) => {\n if (q && !e.id.toLowerCase().includes(q) && !(e.name || '').toLowerCase().includes(q)) return false;\n const isAvail = availableSet.has(e.id.toLowerCase());\n if (availFilter === 'available' && !isAvail) return false;\n if (availFilter === 'unavailable' && isAvail) return false;\n const filled = e.contextWindow != null || e.maxTokens != null || (e.input && e.input.length > 0);\n if (paramFilter === 'filled' && !filled) return false;\n if (paramFilter === 'empty' && filled) return false;\n return true;\n })\n .sort((a, b) => a.id.localeCompare(b.id));\n }, [catalog, search, availFilter, paramFilter, availableSet]);\n\n const filledCount = catalog.filter((e) => e.contextWindow != null || e.maxTokens != null || (e.input && e.input.length > 0)).length;\n const availCount = catalog.filter((e) => availableSet.has(e.id.toLowerCase())).length;\n\n return (\n <div className=\"dsh-a6-catalog-page\">\n {/* \u5934\u90E8\u5DE5\u5177\u680F */}\n <div className=\"dsh-a6-section-header\">\n <div className=\"dsh-a6-catalog-toolbar\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={handleFetchMarket}\n disabled={busy !== null}\n data-tooltip=\"\u4ECE A6API \u5E02\u573A\u7FFB\u9875\u62C9\u53D6\u5168\u90E8\u652F\u6301\u6A21\u578B\u7684 ID\uFF08\u542B\u54C1\u724C\uFF09\uFF0C\u53C2\u6570\u521D\u59CB\u4E3A\u7A7A\uFF0C\u968F\u540E\u53EF\u7528 OpenRouter \u67E5\u8BE2\u586B\u5145\"\n data-tooltip-pos=\"down\"\n >\n {busy === 'fetch' ? '\u83B7\u53D6\u4E2D...' : '\u4ECE A6API \u83B7\u53D6\u5E02\u573A\u6A21\u578B'}\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={handleQueryAll}\n disabled={busy !== null || catalog.length === 0}\n data-tooltip=\"\u5BF9\u76EE\u5F55\u4E2D\u5168\u90E8\u6A21\u578B\u67E5\u8BE2 OpenRouter \u5E76\u586B\u5145 contextWindow / maxTokens / input\uFF1B\u67E5\u4E0D\u5230\u7684\u4FDD\u6301\u7559\u7A7A\u53EF\u624B\u52A8\u586B\u5199\"\n data-tooltip-pos=\"down\"\n >\n {busy === 'query' ? '\u67E5\u8BE2\u4E2D...' : '\u4ECE OpenRouter \u4E00\u952E\u67E5\u8BE2'}\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-btn dsh-a6-btn-danger dsh-a6-btn-sm${confirmClear ? ' dsh-a6-btn-clear-confirm' : ''}`}\n onClick={handleClear}\n disabled={busy !== null || catalog.length === 0}\n data-tooltip=\"\u6E05\u7A7A\u6A21\u578B\u76EE\u5F55\u5168\u90E8\u6761\u76EE\uFF0C\u53EF\u91CD\u65B0\u4ECE A6API \u83B7\u53D6\u5E76\u91CD\u65B0\u7528 OpenRouter \u586B\u5145\uFF08\u4E0D\u5F71\u54CD\u5DF2\u5199\u5165 DSH \u914D\u7F6E\u7684\u6A21\u578B\uFF09\"\n data-tooltip-pos=\"down\"\n >\n {confirmClear ? '\u786E\u8BA4\u6E05\u7A7A\uFF1F' : '\u6E05\u7A7A\u76EE\u5F55'}\n </button>\n <div className=\"dsh-a6-catalog-count\">\n \u5171 {catalog.length} \u4E2A \u00B7 \u53EF\u7528 {availCount} \u4E2A \u00B7 \u5DF2\u586B\u53C2\u6570 {filledCount} \u4E2A\n </div>\n </div>\n\n {/* \u7B5B\u9009\u533A */}\n <div className=\"dsh-a6-catalog-filters\">\n <div className=\"dsh-a6-filter-group\">\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${availFilter === 'all' ? 'active' : ''}`}\n onClick={() => setAvailFilter('all')}\n >\n \u5168\u90E8 ({catalog.length})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${availFilter === 'available' ? 'active' : ''}`}\n onClick={() => setAvailFilter('available')}\n >\n \u53EF\u7528 ({availCount})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${availFilter === 'unavailable' ? 'active' : ''}`}\n onClick={() => setAvailFilter('unavailable')}\n >\n \u4E0D\u53EF\u7528 ({catalog.length - availCount})\n </button>\n </div>\n <div className=\"dsh-a6-filter-group\">\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${paramFilter === 'all' ? 'active' : ''}`}\n onClick={() => setParamFilter('all')}\n >\n \u5168\u90E8\u53C2\u6570\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${paramFilter === 'filled' ? 'active' : ''}`}\n onClick={() => setParamFilter('filled')}\n >\n \u5DF2\u586B ({filledCount})\n </button>\n <button\n type=\"button\"\n className={`dsh-a6-filter-btn ${paramFilter === 'empty' ? 'active' : ''}`}\n onClick={() => setParamFilter('empty')}\n >\n \u672A\u586B ({catalog.length - filledCount})\n </button>\n </div>\n <div className=\"dsh-a6-search-wrapper\">\n <input\n type=\"text\"\n className=\"dsh-a6-input dsh-a6-search-input\"\n placeholder=\"\u641C\u7D22\u6A21\u578B ID / \u540D\u79F0...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n {search && (\n <button\n type=\"button\"\n className=\"dsh-a6-clear-btn\"\n onClick={() => setSearch('')}\n title=\"\u6E05\u7A7A\u641C\u7D22\"\n >\n \u00D7\n </button>\n )}\n </div>\n </div>\n </div>\n\n {msg && (\n <div className={`dsh-a6-catalog-msg ${msg.kind}`}>\n {msg.text}\n </div>\n )}\n\n {/* \u5185\u5BB9 */}\n {catalog.length === 0 ? (\n <div className=\"dsh-a6-empty-state\">\n <span>\u6A21\u578B\u76EE\u5F55\u4E3A\u7A7A\u3002</span>\n <span className=\"dsh-a6-side-popup-hint\">\n \u70B9\u51FB\u300C\u4ECE A6API \u83B7\u53D6\u5E02\u573A\u6A21\u578B\u300D\u62C9\u53D6\u5168\u90E8\u652F\u6301\u7684\u6A21\u578B ID\uFF0C\u518D\u7528\u300C\u4ECE OpenRouter \u4E00\u952E\u67E5\u8BE2\u300D\u81EA\u52A8\u586B\u5145\u53C2\u6570\u3002\n </span>\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"dsh-a6-empty-state\">\n <span>\u5F53\u524D\u7B5B\u9009\u6761\u4EF6\u4E0B\u6CA1\u6709\u5339\u914D\u7684\u6A21\u578B</span>\n </div>\n ) : (\n <div className=\"dsh-a6-catalog-list\">\n {filtered.map((entry) => {\n const editing = editingId === entry.id;\n const isAvail = availableSet.has(entry.id.toLowerCase());\n const re = entry.reasoningEfforts && typeof entry.reasoningEfforts === 'object' ? entry.reasoningEfforts : null;\n return (\n <div key={entry.id} className={`dsh-a6-catalog-row${editing ? ' editing' : ''}`}>\n {/* \u7B2C\u4E00\u884C\uFF1A\u6A21\u578B ID + \u53EF\u7528\u5FBD\u7AE0 + \u540D\u79F0 + \u64CD\u4F5C */}\n <div className=\"dsh-a6-catalog-row-head\">\n <div className=\"dsh-a6-catalog-id\">\n <code>{entry.id}</code>\n {isAvail && <span className=\"dsh-a6-catalog-badge avail\">\u53EF\u7528</span>}\n {entry.name && entry.name !== entry.id && (\n <span className=\"dsh-a6-catalog-name\">{entry.name}</span>\n )}\n </div>\n <div className=\"dsh-a6-catalog-row-actions\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => handleQueryOne(entry.id)}\n disabled={busy !== null}\n data-tooltip=\"\u4ECE OpenRouter \u67E5\u8BE2\u8BE5\u6A21\u578B\u53C2\u6570\u5E76\u586B\u5145\"\n >\n {queryingId === entry.id ? '\u67E5\u8BE2\u4E2D...' : '\u67E5\u8BE2\u53C2\u6570'}\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn-text\"\n onClick={() => (editing ? setEditingId(null) : startEdit(entry))}\n >\n {editing ? '\u53D6\u6D88' : '\u7F16\u8F91'}\n </button>\n </div>\n </div>\n\n {/* \u7B2C\u4E8C\u884C\uFF1A\u53C2\u6570\uFF08\u7EDF\u4E00\u5728\u6A21\u578B ID \u4E0B\u65B9\uFF09 */}\n <div className=\"dsh-a6-catalog-meta\">\n <span className={`dsh-a6-catalog-param${entry.contextWindow != null ? '' : ' empty'}`}>\n \u4E0A\u4E0B\u6587 {entry.contextWindow != null ? entry.contextWindow.toLocaleString() : '\u2014'}\n </span>\n <span className={`dsh-a6-catalog-param${entry.maxTokens != null ? '' : ' empty'}`}>\n \u8F93\u51FA {entry.maxTokens != null ? entry.maxTokens.toLocaleString() : '\u2014'}\n </span>\n <span className={`dsh-a6-catalog-param${entry.input && entry.input.length > 0 ? '' : ' empty'}`}>\n \u8F93\u5165 {entry.input && entry.input.length > 0 ? entry.input.join('+') : '\u2014'}\n </span>\n {re && Object.keys(re).length > 0 && (\n <span className=\"dsh-a6-catalog-param\">\n \u63A8\u7406 {Object.keys(re).length} \u6863\n </span>\n )}\n {entry.reasoningEfforts === false && (\n <span className=\"dsh-a6-catalog-param\">\u975E\u63A8\u7406</span>\n )}\n </div>\n\n {editing && (\n <div className=\"dsh-a6-catalog-edit\">\n <div className=\"dsh-a6-edit-grid\">\n <label className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u540D\u79F0 (name)</span>\n <input\n type=\"text\"\n className=\"dsh-a6-input\"\n value={draft.name}\n onChange={(e) => setDraft({ ...draft, name: e.target.value })}\n placeholder=\"\u4EC5\u7528\u6237\u586B\u5199\uFF0C\u7559\u7A7A\u5219\u4E0D\u5199\u5165 DSH \u914D\u7F6E\"\n />\n </label>\n <label className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u4E0A\u4E0B\u6587\u7A97\u53E3 (contextWindow)</span>\n <input\n type=\"number\"\n min={1}\n className=\"dsh-a6-input\"\n value={draft.contextWindow}\n onChange={(e) => setDraft({ ...draft, contextWindow: e.target.value })}\n placeholder=\"\u5982 1048576\uFF08\u7559\u7A7A = \u4E0D\u586B\uFF0CDSH \u7528\u9ED8\u8BA4\uFF09\"\n />\n </label>\n <label className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u6700\u5927\u8F93\u51FA (maxTokens)</span>\n <input\n type=\"number\"\n min={1}\n className=\"dsh-a6-input\"\n value={draft.maxTokens}\n onChange={(e) => setDraft({ ...draft, maxTokens: e.target.value })}\n placeholder=\"\u5982 65536\uFF08\u7559\u7A7A = \u4E0D\u586B\uFF0CDSH \u7528\u9ED8\u8BA4\uFF09\"\n />\n </label>\n <div className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u8F93\u5165\u6A21\u6001 (input)</span>\n <div className=\"dsh-a6-checkbox-group\">\n <label className=\"dsh-a6-checkbox\">\n <input\n type=\"checkbox\"\n checked={draft.inputText}\n onChange={(e) => setDraft({ ...draft, inputText: e.target.checked })}\n />\n <span>text</span>\n </label>\n <label className=\"dsh-a6-checkbox\">\n <input\n type=\"checkbox\"\n checked={draft.inputImage}\n onChange={(e) => setDraft({ ...draft, inputImage: e.target.checked })}\n />\n <span>image</span>\n </label>\n </div>\n </div>\n <label className=\"dsh-a6-edit-field dsh-a6-edit-wide\">\n <span className=\"dsh-a6-label\">\n \u63A8\u7406\u6863\u4F4D (reasoningEfforts)\n <span className=\"dsh-a6-field-hint\" style={{ marginLeft: 6 }}>\n \u683C\u5F0F\uFF1Alow: low, medium: medium\uFF1B\u503C\u4E3A\u7A7A\u8868\u793A\u8BE5\u6863\u4F4D\u65E0 wire \u503C\n </span>\n </span>\n <input\n type=\"text\"\n className=\"dsh-a6-input\"\n value={draft.reasoningText}\n disabled={draft.reasoningFalse}\n onChange={(e) => setDraft({ ...draft, reasoningText: e.target.value })}\n placeholder=\"\u9ED8\u8BA4\u5DF2\u542B DSH \u5168\u90E8 7 \u6863\uFF08off/minimal/low/medium/high/xhigh/max\uFF09\uFF0C\u53EF\u4FEE\u6539\u6216\u7559\u7A7A\u5220\u9664\u8BE5\u5B57\u6BB5\"\n />\n </label>\n <label className=\"dsh-a6-edit-field\">\n <span className=\"dsh-a6-label\">\u63A8\u7406\u80FD\u529B</span>\n <label className=\"dsh-a6-checkbox\">\n <input\n type=\"checkbox\"\n checked={draft.reasoningFalse}\n onChange={(e) => setDraft({ ...draft, reasoningFalse: e.target.checked })}\n />\n <span>\u975E\u63A8\u7406\u6A21\u578B (reasoningEfforts: false)</span>\n </label>\n </label>\n </div>\n <div className=\"dsh-a6-edit-actions\">\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-primary dsh-a6-btn-sm\"\n onClick={() => handleSave(entry.id)}\n >\n \u4FDD\u5B58\n </button>\n <button\n type=\"button\"\n className=\"dsh-a6-btn dsh-a6-btn-secondary dsh-a6-btn-sm\"\n onClick={() => setEditingId(null)}\n >\n \u53D6\u6D88\n </button>\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n", "export interface A6ApiConfig {\n baseURL: string;\n apiKey: string;\n accessToken?: string;\n userId?: string;\n activeModels: string[];\n /** \u670D\u52A1\u7AEF\u8131\u654F\u4E0B\u53D1\uFF1A\u662F\u5426\u5DF2\u914D\u7F6E API Key\uFF08\u771F\u5B9E\u5BC6\u94A5\u7EDD\u4E0D\u56DE\u4F20\u5BA2\u6237\u7AEF\uFF09 */\n hasApiKey?: boolean;\n /** \u670D\u52A1\u7AEF\u8131\u654F\u4E0B\u53D1\uFF1A\u662F\u5426\u5DF2\u914D\u7F6E\u7CFB\u7EDF\u8BBF\u95EE\u4EE4\u724C */\n hasToken?: boolean;\n}\n\n/**\n * \u6A21\u578B\u76EE\u5F55\u6761\u76EE\uFF08settings.yaml \u7684 llm-pi-ai \u539F\u751F\u6A21\u578B\u5B57\u6BB5 + \u5185\u90E8 brand\uFF09\u3002\n * \u53EF\u9009\u5B57\u6BB5\u7F3A\u7701 = \u53C2\u6570\u672A\u83B7\u53D6/\u672A\u586B\u5199\uFF0C\u5199 settings.yaml \u65F6\u7701\u7565\u8BE5\u5B57\u6BB5\uFF08llm-pi-ai \u9ED8\u8BA4\u503C\u515C\u5E95\uFF09\u3002\n */\nexport interface CatalogModelEntry {\n id: string;\n name?: string;\n contextWindow?: number;\n maxTokens?: number;\n input?: ('text' | 'image')[];\n /** false = \u660E\u786E\u975E\u63A8\u7406\u6A21\u578B\uFF1Bdict = \u6863\u4F4D \u2192 wire \u503C\uFF08\u503C\u53EF\u4E3A null\uFF0C\u540C llm-pi-ai \u8BED\u4E49\uFF09 */\n reasoningEfforts?: Record<string, string | null> | false;\n /** \u4EC5\u63D2\u4EF6\u5185\u90E8\u4F7F\u7528\uFF1A\u54C1\u724C\u6765\u81EA A6API \u5E02\u573A\u6E20\u9053\uFF0C\u4E0D\u5199\u5165 settings.yaml */\n brand?: string;\n /** \u6700\u8FD1\u4E00\u6B21 OpenRouter \u67E5\u8BE2/\u4EBA\u5DE5\u4FEE\u6539\u65F6\u95F4 */\n updatedAt?: number;\n}\n\n/** DSH llm-pi-ai \u652F\u6301\u7684\u5B8C\u6574\u601D\u8003\u6863\u4F4D\uFF08THINKING_LEVELS\uFF0C\u4E0E dsh-llm-pi-ai \u6E90\u7801\u4E00\u81F4\uFF09 */\nexport const THINKING_LEVEL_KEYS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'] as const;\n\nexport type ReasoningEffortsValue = Record<string, string | null> | false;\n\n/**\n * \u6821\u9A8C reasoningEfforts\uFF08DSH llm-pi-ai \u8BED\u4E49\uFF0C\u670D\u52A1\u7AEF\u4E0E\u5BA2\u6237\u7AEF\u5171\u7528\uFF09\uFF1A\n * - false = \u975E\u63A8\u7406\u6A21\u578B\uFF0C\u5408\u6CD5\n * - \u952E\u5FC5\u987B \u2208 THINKING_LEVEL_KEYS\uFF1B\u503C\u5FC5\u987B\u975E\u7A7A\u5B57\u7B26\u4E32\uFF0C\u4EC5 off \u5141\u8BB8 null\n * - \u7A7A\u5B57\u5178\u3001\u4EC5 off \u65E0\u5176\u4ED6\u6863\u4F4D\u5747\u975E\u6CD5\n */\nexport function validateReasoningEfforts(\n value: unknown,\n): { ok: true; value: ReasoningEffortsValue } | { ok: false; error: string } {\n if (value === false) return { ok: true, value: false };\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { ok: false, error: 'reasoningEfforts \u5FC5\u987B\u662F\u6863\u4F4D\u5B57\u5178\u6216 false' };\n }\n const dict = value as Record<string, unknown>;\n const keys = Object.keys(dict);\n if (keys.length === 0) return { ok: false, error: 'reasoningEfforts \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u5178' };\n const out: Record<string, string | null> = {};\n for (const k of keys) {\n if (!(THINKING_LEVEL_KEYS as readonly string[]).includes(k)) {\n return { ok: false, error: `reasoningEfforts \u952E \"${k}\" \u4E0D\u662F DSH \u652F\u6301\u7684\u6863\u4F4D\uFF08off/minimal/low/medium/high/xhigh/max\uFF09` };\n }\n const v = dict[k];\n if (v === null) {\n if (k !== 'off') {\n return { ok: false, error: `reasoningEfforts.${k} \u5FC5\u987B\u63D0\u4F9B wire \u503C\uFF0C\u4EC5 off \u5141\u8BB8\u7559\u7A7A` };\n }\n out[k] = null;\n } else if (typeof v === 'string' && v.length > 0) {\n out[k] = v;\n } else {\n return { ok: false, error: `reasoningEfforts.${k} \u7684\u503C\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32\u6216 null` };\n }\n }\n if (!keys.some((k) => k !== 'off')) {\n return { ok: false, error: 'reasoningEfforts \u9664 off \u5916\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u601D\u8003\u6863\u4F4D\uFF08\u975E\u63A8\u7406\u6A21\u578B\u8BF7\u7528 false\uFF09' };\n }\n return { ok: true, value: out };\n}\n\nexport interface A6ApiModelMeta {\n id: string;\n name: string;\n brand: string;\n contextWindow: number;\n maxTokens: number;\n modalities: ('text' | 'image')[];\n reasoningEfforts?: Record<string, string>;\n thinkingFormat?: string;\n officialPriceMicros?: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n };\n}\n\nexport interface OfficialPrices {\n input_cny: string;\n output_cny: string;\n cache_read_cny: string;\n cache_write_cny: string;\n input_price_micros?: number;\n output_price_micros?: number;\n cache_read_price_micros?: number;\n cache_write_price_micros?: number;\n}\n\nexport interface SuccessBucketItem {\n sample_count?: number;\n success_count?: number;\n success_rate: number;\n}\n\nexport interface Bucket24hItem {\n s?: number;\n k?: number;\n r: number;\n t?: number;\n d?: number;\n f?: number;\n c?: number;\n}\n\nexport interface Bucket7dItem {\n s?: number;\n k?: number;\n r?: number;\n t?: number;\n d?: number;\n f?: number;\n c?: number;\n}\n\nexport interface MerchantChannelInfo {\n listing_id?: number;\n channel_id: number;\n channel_name: string;\n supplier_name: string;\n supplier_id?: number;\n model_name: string;\n brand: string;\n description: string;\n charge_type?: string;\n charge_type_text?: string;\n sample_count?: number;\n sample_count_text?: string;\n input_price_micros: number;\n output_price_micros: number;\n cache_read_price_micros: number;\n cache_write_price_micros: number;\n input_price_cny: string;\n output_price_cny: string;\n cache_read_price_cny: string;\n cache_write_price_cny: string;\n official_price?: OfficialPrices;\n realtime_ratio_cny: number;\n realtime_ratio_formatted: string;\n recent_success_rate_pct: number;\n success_rate_24h_pct: number;\n success_rate_7d_pct?: number;\n success_buckets?: SuccessBucketItem[];\n b24?: Bucket24hItem[];\n b7d?: Bucket7dItem[];\n sr_24h_state?: string;\n sr_7d_state?: string;\n p50_ttft_ms?: number;\n recent_p50_ms: number;\n cache_hit_rate_pct: number;\n /** \u6DF7\u5408\u4EF7\u4F30\u7B97\uFF08\u00A5 / 1\u4EBF tokens\uFF09\uFF1A\u8F93\u5165\u7C7B 99.65% \u6309 24h \u7F13\u5B58\u547D\u4E2D\u7387\u5206\u4E3A\u547D\u4E2D\uFF08\u7F13\u5B58\u8BFB\u4EF7\uFF09/\u672A\u547D\u4E2D\uFF08\u8F93\u5165\u4EF7\uFF09\uFF0C\u8F93\u51FA\u56FA\u5B9A\u5360 0.35%\uFF1B\u65E0 token \u5355\u4EF7\u65F6\u7F3A\u7701\u4E0D\u5C55\u793A */\n blended_price_100m_cny?: number;\n labels: string[];\n last_success_at: number;\n last_success_text: string;\n authenticity_guaranteed: boolean;\n authenticity_badge?: string;\n is_pinned?: boolean;\n /** \u5B98\u65B9\u6E20\u9053\u641C\u7D22\u8FD4\u56DE\u7684\u56FA\u5B9A\u72B6\u6001\uFF1Apin_here / pin_elsewhere / undefined */\n pin_status?: string;\n user_channel_disabled?: boolean;\n supplier_channel_disabled?: boolean;\n raw?: any;\n}\n\n/** \u5E73\u53F0\u4FA7\u56FA\u5B9A\u8BB0\u5F55\uFF08GET /api/marketplace/pins\uFF09 */\nexport interface MarketplacePin {\n id?: number;\n token_id: number;\n token_name?: string;\n model_name: string;\n channel_id?: number;\n channel_name?: string;\n supplier_name?: string;\n supplier_nickname?: string;\n /** \u5F02\u5E38\u65F6\u662F\u5426\u81EA\u52A8\u5207\u6362\u667A\u80FD\u4F18\u9009\uFF08false = \u4E25\u683C\u56FA\u5B9A\uFF09 */\n fallback_to_smart_routing?: boolean;\n created_at?: number;\n raw?: any;\n}\n\n/** \u4EE4\u724C\u5217\u8868\u6761\u76EE\uFF08GET /api/token/\uFF0C\u7528\u4E8E\u628A API Key \u89E3\u6790\u4E3A token_id\uFF09 */\nexport interface A6ApiTokenItem {\n id: number;\n name?: string;\n key?: string;\n status?: number;\n raw?: any;\n}\n\nexport interface ModelCardData {\n model_name: string;\n brand: string;\n contextWindow: number;\n maxTokens: number;\n modalities: ('text' | 'image')[];\n hasReasoning: boolean;\n inDsh: boolean;\n merchant?: MerchantChannelInfo;\n probeStatus: 'idle' | 'queued' | 'probing' | 'success' | 'error';\n probeError?: string;\n probeLatencyMs?: number;\n lastProbedAt?: number;\n /** \u8DEF\u7531\u5FEB\u7167\u65F6\u6548\uFF1A\u8BE5\u6A21\u578B\u6700\u65B0\u4E00\u6761\u300C\u5E26 channel \u7684\u8C03\u7528\u65E5\u5FD7\u300D\u65F6\u95F4\uFF08\u79D2\uFF09\uFF0C\u5373\u5361\u7247\u5546\u6237\u6570\u636E\u6765\u6E90\u8BF7\u6C42\u7684\u65F6\u523B */\n lastRoutedAt?: number;\n /** \u670D\u52A1\u7AEF\u7B97\u597D\u7684\u76F8\u5BF9\u65F6\u95F4\u6587\u6848\uFF08\u5982\u300C3 \u5C0F\u65F6\u524D\u300D\uFF09\uFF0C\u65E0\u8BB0\u5F55\u65F6\u5BA2\u6237\u7AEF\u663E\u793A\u300C\u4ECE\u672A\u8DEF\u7531\u300D */\n lastRoutedText?: string;\n /** \u5E73\u53F0\u56FA\u5B9A\u72B6\u6001\uFF08\u6309\u5F53\u524D API Key \u4EE4\u724C\uFF09\uFF1A\u56FA\u5B9A\u5230\u5361\u7247\u5546\u5BB6 / \u56FA\u5B9A\u5230\u5176\u4ED6\u5546\u5BB6 / \u672A\u56FA\u5B9A */\n pinStatus?: 'pin_here' | 'pin_elsewhere';\n /** \u56FA\u5B9A\u7684\u6E20\u9053 ID\uFF08pin_elsewhere \u65F6\u7528\u4E8E\u5C55\u793A\u56FA\u5B9A\u5230\u4E86\u54EA\u5BB6\uFF09 */\n pinnedChannelId?: number;\n pinnedSupplierName?: string;\n pinnedFallback?: boolean;\n /** \u8BE5\u6A21\u578B\u5BF9\u5E94\u7684\u56FA\u5B9A\u8BB0\u5F55\u662F\u5426\u5C5E\u4E8E\u5F53\u524D API Key \u4EE4\u724C\uFF08false \u65F6\u4EC5\u4F5C\u53C2\u8003\u5C55\u793A\uFF09 */\n pinTokenMatched?: boolean;\n}\n\nexport interface BalanceInfo {\n hasAccountAuth: boolean;\n accountBalanceUsd: number;\n accountBalanceFormatted: string;\n accountBalanceCnyFormatted: string;\n usedUsd: number;\n usedFormatted: string;\n requestCount: number;\n username?: string;\n userId?: string | number;\n isLow: boolean;\n updatedAt: number;\n}\n\nexport interface ApiRoutingLogItem {\n id: number | string;\n created_at: number;\n model_name: string;\n channel?: number | string;\n channel_name?: string;\n /** \u53D1\u8D77\u8BE5\u8BF7\u6C42\u7684\u4EE4\u724C ID\uFF08\u7528\u4E8E\u628A API Key \u89E3\u6790\u4E3A\u56FA\u5B9A/\u7981\u7528\u6240\u9700\u7684 token_id\uFF09 */\n token_id?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n use_time?: number;\n quota?: number;\n cost_usd?: number;\n cost_formatted?: string;\n token_name?: string;\n status: 'success' | 'error';\n other?: string;\n raw?: any;\n}\n\nexport interface A6ApiStateResponse {\n config: A6ApiConfig;\n balance: BalanceInfo | null;\n models: ModelCardData[];\n dshConfiguredModels: string[];\n recentLogs?: ApiRoutingLogItem[];\n /** \u5E73\u53F0\u56FA\u5B9A\u8BB0\u5F55\u5217\u8868\uFF08\u7528\u4E8E\u5361\u7247\u72B6\u6001\u8DDF\u968F\u5B98\u7F51\uFF09 */\n pins?: MarketplacePin[];\n}\n// \u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\uFF08\u8F7B\u91CF\u76D1\u542C\uFF09\nexport interface PriceFluctuationState {\n pendingCount: number;\n unseenCount: number;\n totalCount: number;\n updatedAt: number | null;\n hasAuth?: boolean;\n authError?: boolean;\n}\n", "import React, { useEffect, useRef, useState } from 'react';\nimport { store } from '../store.js';\nimport { MerchantCard } from './MerchantCard.js';\nimport { PricePill } from './PricePill.js';\nimport { MarketPill } from './MarketPill.js';\n\nconst POPUP_MAX_WIDTH = 500;\n\n/** \u628A DSH \u6A21\u578B ID \u5F52\u4E00\u5316\u4E3A A6api \u6A21\u578B\u540D(\u5265\u79BB provider \u524D\u7F00,\u5982 a6api/gpt-4o \u2192 gpt-4o) */\nconst normalizeModelId = (id: string): string => id.replace(/^[^/]+\\//, '');\n\ninterface A6ApiSidebarCardProps {\n /** \u5BBF\u4E3B\u6CE8\u5165:\u4FA7\u8FB9\u680F\u662F\u5426\u5BBD\u5E03\u5C40(false = 56px rail) */\n wide: boolean;\n /** \u5BBF\u4E3B\u6CE8\u5165:\u4F1A\u8BDD\u5217\u8868\u5FEB\u7167\u94A9\u5B50(\u53D6 current \u5373\u5F53\u524D\u4F1A\u8BDD ID) */\n useSessions?: (selector: (s: any) => any) => any;\n /** apply \u6CE8\u5165:modelDirectories \u670D\u52A1\u8BBF\u95EE\u5668(\u4E0E composer \u6A21\u578B\u9009\u62E9\u5668\u540C\u6E90) */\n getModelDirectories?: () => any;\n}\n\n/**\n * \u4FA7\u8FB9\u680F\u5DE6\u4E0B\u89D2\u300CA6api\u300D\u6309\u94AE + \u5411\u4E0A\u5F39\u51FA\u6D6E\u5C42(\u4EFB\u4F55\u4F1A\u8BDD\u5747\u53EF\u5C55\u5F00):\u9876\u90E8\u4E3A\u8D26\u6237\u901F\u89C8\u80F6\u56CA\u884C,\n * \u4E0B\u65B9\u4E3A\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B\u5BF9\u5E94\u7684 MerchantCard;\u4F1A\u8BDD\u672A\u4F7F\u7528 A6api \u6A21\u578B\u65F6\u5361\u7247\u533A\u57DF\u6574\u4F53\u7F6E\u7070\u4E0D\u53EF\u4EA4\u4E92\u3002\n * \u4E0E\u8BBE\u7F6E\u9875\u5171\u4EAB A6ApiStore \u5355\u4F8B:\u63A2\u6D4B/\u8F6E\u8BE2/\u64CD\u4F5C\u7ED3\u679C\u5B9E\u65F6\u540C\u6B65\u3002\n *\n * useSessions \u662F React hook,\u4E0D\u80FD\u6761\u4EF6\u8C03\u7528:\u7531\u5916\u5C42\u6309\u300C\u58F3\u662F\u5426\u6CE8\u5165\u300D\u5206\u6D3E\u5230\u4E24\u4E2A\u56FA\u5B9A\n * \u5206\u652F(\u5185\u5C42\u6052\u8C03\u7528 / \u65E0\u94A9\u5B50\u5206\u652F\u6052\u4E0D\u8C03\u7528),\u89C4\u907F Rules of Hooks \u98CE\u9669\u3002\n */\nexport const A6ApiSidebarCard: React.FC<A6ApiSidebarCardProps> = ({\n wide,\n useSessions,\n getModelDirectories,\n}) => {\n if (useSessions) {\n return (\n <A6ApiSidebarCardInner\n wide={wide}\n useSessions={useSessions}\n getModelDirectories={getModelDirectories}\n />\n );\n }\n return <A6ApiSidebarCardBody wide={wide} getModelDirectories={getModelDirectories} />;\n};\n\nconst A6ApiSidebarCardInner: React.FC<{\n wide: boolean;\n useSessions: (selector: (s: any) => any) => any;\n getModelDirectories?: () => any;\n}> = ({ wide, useSessions, getModelDirectories }) => {\n // \u6052\u8C03\u7528 hook(\u5B58\u5728\u6027\u7531\u5916\u5C42\u5206\u6D3E\u4FDD\u8BC1)\n const currentId: string | undefined = useSessions((s: any) => s?.current);\n return (\n <A6ApiSidebarCardBody\n wide={wide}\n currentId={currentId}\n getModelDirectories={getModelDirectories}\n />\n );\n};\n\ninterface A6ApiSidebarCardBodyProps {\n wide: boolean;\n currentId?: string;\n getModelDirectories?: () => any;\n}\n\nconst A6ApiSidebarCardBody: React.FC<A6ApiSidebarCardBodyProps> = ({\n wide,\n currentId,\n getModelDirectories,\n}) => {\n const [open, setOpen] = useState(false);\n const [selection, setSelection] = useState<{ provider?: string; model?: string } | null>(null);\n const [state, setState] = useState(store.getState());\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number } | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const popupRef = useRef<HTMLDivElement | null>(null);\n const flippedRef = useRef(false);\n const fetchedRef = useRef(false);\n const lastPosRef = useRef<{ left: number; top?: number; bottom?: number } | null>(null);\n\n // \u8BA2\u9605 modelDirectories:\u5F53\u524D\u4F1A\u8BDD\u7684\u6A21\u578B\u9009\u62E9(provider/model),\u670D\u52A1\u53EF\u80FD\u665A\u4E8E\u63D2\u4EF6\u52A0\u8F7D,500ms \u91CD\u8BD5\n useEffect(() => {\n let disposed = false;\n let unsub: (() => void) | null = null;\n let tries = 0;\n const connect = () => {\n if (disposed) return;\n const md = getModelDirectories?.();\n if (!md || typeof md.directoryFor !== 'function') {\n if (tries++ < 6) setTimeout(connect, 500);\n return;\n }\n let dir: any;\n try {\n dir = md.directoryFor(currentId);\n } catch {\n dir = undefined; // \u5B50\u4EE3\u7406\u7B49\u65E0\u6A21\u578B\u9009\u62E9\u573A\u666F\n }\n if (!dir) {\n setSelection(null);\n return;\n }\n const update = () => {\n try {\n const snap = dir.store?.getSnapshot?.();\n setSelection(snap?.current ?? null);\n } catch {\n setSelection(null);\n }\n };\n update();\n try {\n unsub = dir.store?.subscribe?.(update) ?? null;\n } catch {\n unsub = null;\n }\n };\n connect();\n return () => {\n disposed = true;\n if (unsub) {\n try {\n unsub();\n } catch {}\n }\n };\n }, [currentId, getModelDirectories]);\n\n // \u8BA2\u9605 A6api store(\u4E0E\u8BBE\u7F6E\u9875\u540C\u4E00\u5355\u4F8B,\u63A2\u6D4B/\u8F6E\u8BE2/\u64CD\u4F5C\u5B9E\u65F6\u540C\u6B65)\n useEffect(() => {\n const unsub = store.subscribe(() => setState({ ...store.getState() }));\n return unsub;\n }, []);\n\n const isA6api = Boolean(selection && selection.provider === 'a6api');\n const modelName = normalizeModelId(selection?.model || '');\n // \u5F53\u524D\u4F1A\u8BDD\u662F\u5426\u6B63\u5728\u4F7F\u7528 A6api \u6A21\u578B:\u51B3\u5B9A\u5361\u7247\u533A\u57DF\u6B63\u5E38\u5C55\u793A\u8FD8\u662F\u6574\u4F53\u7F6E\u7070(\u6D6E\u5C42\u672C\u8EAB\u4EFB\u4F55\u4F1A\u8BDD\u90FD\u53EF\u5C55\u5F00)\n const hasA6apiModel = isA6api && Boolean(modelName);\n\n // \u6309\u6A21\u578B\u540D\u67E5\u5546\u6237\u5361\u7247:\u975E A6api \u4F1A\u8BDD\u540C\u6837\u67E5\u8BE2(\u540C\u540D\u6A21\u578B\u4EE5\u7F6E\u7070\u6001\u5C55\u793A,\u63D0\u793A\u5176\u5728 A6api \u53EF\u7528)\n const card = modelName\n ? state.models.find((m) => m.model_name.toLowerCase() === modelName.toLowerCase())\n : undefined;\n\n const toggle = () => setOpen((v) => !v);\n\n // \u6253\u5F00\u65F6:\u5B9A\u4F4D(\u951A\u5B9A\u6309\u94AE\u5411\u4E0A\u5C55\u5F00,\u7A7A\u95F4\u4E0D\u8DB3/\u6309\u94AE\u51FA\u89C6\u53E3\u5219\u7FFB\u8F6C)+ \u60F0\u6027\u52A0\u8F7D /state\n useEffect(() => {\n if (!open) {\n setPos(null);\n lastPosRef.current = null;\n flippedRef.current = false;\n return;\n }\n // fetchState \u53EF\u91CD\u5165:store \u521D\u59CB loading=true \u4E14\u4EC5\u8BBE\u7F6E\u9875/\u672C\u7EC4\u4EF6\u89E6\u53D1\u62C9\u53D6,\u4E0D\u80FD\u4EE5 loading \u4F5C\u5B88\u536B\n if (state.models.length === 0 && !fetchedRef.current) {\n fetchedRef.current = true;\n store.fetchState().catch(() => {});\n }\n const place = () => {\n const btn = buttonRef.current;\n if (!btn) return;\n const r = btn.getBoundingClientRect();\n const vw = window.innerWidth;\n const width = Math.min(POPUP_MAX_WIDTH, vw - 16);\n const left = Math.max(8, Math.min(r.left, vw - width - 8));\n // \u6309\u94AE\u88AB footer \u6EDA\u52A8\u63A8\u51FA\u89C6\u53E3(top<0)\u65F6\u540C\u6837\u7FFB\u8F6C,\u907F\u514D\u6D6E\u5C42 bottom \u951A\u51FA\u89C6\u53E3\n const flipped = flippedRef.current || r.top < 8;\n if (flipped) flippedRef.current = true;\n const next = flipped\n ? { left, top: r.bottom + 8 }\n : { left, bottom: window.innerHeight - r.top + 8 };\n // \u4F4D\u7F6E\u672A\u53D8\u5219\u8DF3\u8FC7 setPos:\u6D6E\u5C42\u5185\u90E8\u6EDA\u52A8(capture \u4E5F\u4F1A\u6536\u5230)\u4E0D\u5E94\u89E6\u53D1\u6574\u5361\u91CD\u6E32\u67D3\n const last = lastPosRef.current;\n if (\n last &&\n last.left === next.left &&\n (last.top ?? null) === (next.top ?? null) &&\n (last.bottom ?? null) === (next.bottom ?? null)\n ) {\n return;\n }\n lastPosRef.current = next;\n setPos(next);\n };\n place();\n window.addEventListener('resize', place);\n window.addEventListener('scroll', place, true);\n return () => {\n window.removeEventListener('resize', place);\n window.removeEventListener('scroll', place, true);\n };\n }, [open]);\n\n // \u7FFB\u8F6C\u91CD\u6D4B:\u6D6E\u5C42\u5185\u5BB9\u589E\u957F(\u5361\u7247\u5C55\u5F00\u300C\u8BE6\u60C5\u300D\u7B49\u5185\u90E8\u72B6\u6001\u3001\u6570\u636E\u52A0\u8F7D)\u65F6\u81EA\u52A8\u7FFB\u8F6C\n useEffect(() => {\n if (!open || !popupRef.current) return;\n const checkFlip = () => {\n if (flippedRef.current || !popupRef.current) return;\n const rect = popupRef.current.getBoundingClientRect();\n if (rect.top < 8) {\n flippedRef.current = true;\n const btn = buttonRef.current;\n if (btn) {\n const r = btn.getBoundingClientRect();\n setPos({ left: lastPosRef.current?.left ?? 8, top: r.bottom + 8 });\n }\n }\n };\n checkFlip();\n const ro = new ResizeObserver(checkFlip);\n ro.observe(popupRef.current);\n return () => ro.disconnect();\n }, [open, pos]);\n\n // Esc / \u5916\u90E8\u70B9\u51FB\u5173\u95ED\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n const onPointerDown = (e: PointerEvent) => {\n const t = e.target as Node;\n if (popupRef.current?.contains(t)) return;\n if (buttonRef.current?.contains(t)) return;\n setOpen(false);\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, true);\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n }, [open]);\n\n return (\n <>\n <span\n className={`dsh-a6-side-btn-wrap${wide ? '' : ' rail'}`}\n data-tooltip={!hasA6apiModel ? '\u5F53\u524D\u4F1A\u8BDD\u672A\u4F7F\u7528 A6api \u6A21\u578B\uFF0C\u5361\u7247\u5DF2\u7F6E\u7070' : undefined}\n >\n <button\n ref={buttonRef}\n type=\"button\"\n className={`dsh-a6-side-btn${wide ? '' : ' rail'}`}\n onClick={toggle}\n aria-expanded={open}\n aria-label={wide ? undefined : 'A6api'}\n data-tooltip={hasA6apiModel ? (open ? '\u6536\u8D77 A6api \u6A21\u578B\u5361\u7247' : '\u67E5\u770B\u5F53\u524D\u4F1A\u8BDD\u7684 A6api \u6A21\u578B\u5361\u7247') : undefined}\n >\n {/* \u4E0E\u8BBE\u7F6E\u6309\u94AE\u540C\u6B3E\u9F7F\u8F6E\u56FE\u6807(currentColor \u8DDF\u968F\u6587\u5B57\u8272) */}\n <svg\n className=\"dsh-a6-side-btn-badge\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M14.0861 5.51366C13.8717 5.0575 13.588 4.58542 13.2889 4.18108C13.208 4.07172 13.1596 4.04373 13.0243 4.03054C12.4277 3.97255 11.8245 4.05527 11.2269 3.9972C10.7224 3.94816 10.3133 3.71661 10.0115 3.30919C9.66986 2.84777 9.43973 2.31343 9.09824 1.85234C9.01771 1.74365 8.96805 1.71589 8.83354 1.70282C8.29432 1.65044 7.70402 1.65061 7.16656 1.70282C7.03205 1.71589 6.98239 1.74365 6.90186 1.85234C6.56067 2.31303 6.33025 2.84774 5.98855 3.30919C5.68681 3.71661 5.27774 3.94816 4.77317 3.9972C4.17564 4.05527 3.57239 3.97255 2.97585 4.03054C2.84046 4.04373 2.79208 4.07172 2.71115 4.18108C2.41212 4.58542 2.12835 5.0575 1.91403 5.51366C1.85299 5.64359 1.85286 5.7018 1.91403 5.8319C2.14865 6.33077 2.49748 6.76892 2.73237 7.26854C2.9594 7.7515 2.96041 8.24717 2.73338 8.73044C2.49837 9.23061 2.14891 9.66837 1.91403 10.1681C1.85291 10.2982 1.85299 10.3564 1.91403 10.4863C2.12856 10.9429 2.41185 11.4142 2.71115 11.8189C2.79208 11.9283 2.84046 11.9563 2.97585 11.9694C3.57239 12.0274 4.17564 11.9447 4.77317 12.0028C5.27774 12.0518 5.68681 12.2834 5.98855 12.6908C6.33024 13.1522 6.56037 13.6866 6.90186 14.1476C6.98239 14.2563 7.03205 14.2841 7.16656 14.2972C7.70402 14.3494 8.29432 14.3495 8.83354 14.2972C8.96805 14.2841 9.01771 14.2563 9.09824 14.1476C9.43944 13.687 9.66985 13.1522 10.0115 12.6908C10.3133 12.2834 10.7224 12.0518 11.2269 12.0028C11.8244 11.9447 12.4271 12.0275 13.0243 11.9694C13.1596 11.9563 13.208 11.9283 13.2889 11.8189C13.5891 11.4131 13.872 10.942 14.0861 10.4863C14.1471 10.3564 14.1472 10.2982 14.0861 10.1681C13.8513 9.66861 13.5017 9.23061 13.2667 8.73044C13.0397 8.24717 13.0407 7.7515 13.2677 7.26854C13.5026 6.7689 13.8513 6.33106 14.0861 5.8319C14.1472 5.7018 14.1471 5.64359 14.0861 5.51366ZM15.3035 6.40373C15.0685 6.90359 14.7188 7.34119 14.4841 7.84037C14.4231 7.97025 14.423 8.02855 14.4841 8.15861C14.7189 8.65833 15.0685 9.09611 15.3035 9.59626C15.5308 10.0801 15.5308 10.5744 15.3035 11.0582C15.052 11.5933 14.7225 12.1426 14.37 12.6191C14.0685 13.0265 13.6581 13.259 13.1536 13.3081C12.5566 13.366 11.9541 13.2835 11.3573 13.3414C11.2228 13.3545 11.1731 13.3823 11.0926 13.491C10.7511 13.9521 10.521 14.4864 10.1793 14.9478C9.87828 15.3542 9.46719 15.5869 8.96387 15.6358C8.34008 15.6964 7.66194 15.6966 7.03623 15.6358C6.53291 15.5869 6.12182 15.3542 5.82084 14.9478C5.47911 14.4863 5.24878 13.9517 4.90753 13.491C4.82701 13.3823 4.77734 13.3545 4.64284 13.3414C4.04647 13.2835 3.44373 13.366 2.84653 13.3081C2.34201 13.259 1.93164 13.0265 1.63013 12.6191C1.27867 12.144 0.948453 11.5941 0.696621 11.0582C0.469315 10.5744 0.469279 10.0801 0.696621 9.59626C0.931628 9.09613 1.2813 8.65807 1.51597 8.15861C1.57708 8.02855 1.57702 7.97025 1.51597 7.84037C1.28117 7.34095 0.931635 6.9036 0.696621 6.40373C0.469213 5.91992 0.469367 5.42562 0.696621 4.94183C0.948441 4.40587 1.27868 3.85598 1.63013 3.38092C1.93164 2.97349 2.34201 2.74095 2.84653 2.6919C3.44353 2.63397 4.04599 2.71649 4.64284 2.65856C4.77734 2.64549 4.82701 2.61774 4.90753 2.50904C5.24905 2.04792 5.47913 1.51362 5.82084 1.05219C6.12182 0.645806 6.53291 0.413119 7.03623 0.364178C7.66002 0.303556 8.33816 0.303369 8.96387 0.364178C9.46719 0.413119 9.87828 0.645806 10.1793 1.05219C10.521 1.51365 10.7513 2.04828 11.0926 2.50904C11.1731 2.61774 11.2228 2.64549 11.3573 2.65856C11.9541 2.71649 12.5566 2.63397 13.1536 2.6919C13.6581 2.74095 14.0685 2.97349 14.37 3.38092C14.7214 3.85598 15.0517 4.40587 15.3035 4.94183C15.5307 5.42562 15.5309 5.91992 15.3035 6.40373Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M9.13764 7.99999C9.13764 7.3715 8.62855 6.8624 8.00005 6.8624C7.37155 6.8624 6.86246 7.3715 6.86246 7.99999C6.86246 8.62849 7.37155 9.13759 8.00005 9.13759C8.62855 9.13759 9.13764 8.62849 9.13764 7.99999ZM10.4834 7.99999C10.4834 9.37126 9.37132 10.4833 8.00005 10.4833C6.62878 10.4833 5.51674 9.37126 5.51674 7.99999C5.51674 6.62873 6.62878 5.51669 8.00005 5.51669C9.37132 5.51669 10.4834 6.62873 10.4834 7.99999Z\"\n fill=\"currentColor\"\n />\n </svg>\n {wide && <span className=\"dsh-a6-side-btn-label\">A6api</span>}\n </button>\n </span>\n\n {open && pos && (\n <div\n ref={popupRef}\n className=\"dsh-a6-side-popup\"\n role=\"dialog\"\n aria-label=\"\u5F53\u524D\u4F1A\u8BDD A6api \u6A21\u578B\u5361\u7247\"\n style={{ left: pos.left, ...(pos.top !== undefined ? { top: pos.top } : { bottom: pos.bottom }) }}\n >\n {/* \u8D26\u6237\u901F\u89C8\u80F6\u56CA\u884C\uFF1A\u8D26\u53F7\u7EA7\u6570\u636E\uFF0C\u4E0E\u5F53\u524D\u6A21\u578B\u5361\u7247\u65E0\u5173\uFF0C\u52A0\u8F7D/\u7A7A\u6001\u6052\u663E\u793A\uFF1B\n \u4F59\u989D\u80F6\u56CA\u7EAF\u5C55\u793A\uFF08\u4E0D\u53EF\u70B9\u51FB\uFF09\uFF0C\u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\u53EF\u8DF3\u5B98\u7F51\u5904\u7406\uFF0C\u6A21\u578B\u5E02\u573A\u80F6\u56CA\u76F4\u8FBE\u5B98\u7F51\u6A21\u578B\u9875 */}\n <div className=\"dsh-a6-side-pills\">\n {state.balance?.hasAccountAuth && (\n <div\n className=\"dsh-a6-header-balance-badge dsh-a6-side-balance-pill\"\n title=\"\u8D26\u6237\u4F59\u989D\uFF08\u6BCF 60 \u79D2\u81EA\u52A8\u540C\u6B65\uFF09\"\n >\n <span className=\"dsh-a6-hb-label\">\u8D26\u6237\u4F59\u989D:</span>\n <span className=\"dsh-a6-hb-amount\">{state.balance.accountBalanceFormatted}</span>\n </div>\n )}\n <PricePill\n pf={state.priceFluctuation}\n hasToken={Boolean(state.config?.hasToken)}\n compact\n />\n <MarketPill />\n </div>\n {/* \u6A21\u578B\u5361\u7247\u533A\u57DF:\u975E A6api \u4F1A\u8BDD\u6574\u4F53\u7F6E\u7070\u4E14\u4E0D\u53EF\u4EA4\u4E92(\u9876\u90E8\u8D26\u6237\u80F6\u56CA\u4E0D\u53D7\u5F71\u54CD) */}\n <div className={hasA6apiModel ? undefined : 'dsh-a6-side-card-dimmed'}>\n {card ? (\n <MerchantCard model={card} />\n ) : state.loading && state.models.length === 0 ? (\n <div className=\"dsh-a6-side-popup-empty\">\n <div className=\"dsh-a6-spinner\" />\n <span>\u6B63\u5728\u52A0\u8F7D A6api \u6570\u636E...</span>\n </div>\n ) : hasA6apiModel ? (\n <div className=\"dsh-a6-side-popup-empty\">\n <span>\u672A\u627E\u5230\u300C{modelName}\u300D\u7684\u5546\u6237\u6570\u636E</span>\n <span className=\"dsh-a6-side-popup-hint\">\u53EF\u5728\u300C\u8BBE\u7F6E \u2192 A6api\u300D\u4E2D\u63A2\u6D4B\u8BE5\u6A21\u578B</span>\n </div>\n ) : (\n <div className=\"dsh-a6-side-popup-empty\">\n <span>\u5F53\u524D\u4F1A\u8BDD\u672A\u4F7F\u7528 A6api \u6A21\u578B</span>\n <span className=\"dsh-a6-side-popup-hint\">\n {modelName ? `\u300C${modelName}\u300D\u6682\u65E0\u5546\u6237\u6570\u636E` : '\u5207\u6362\u5230 A6api \u6A21\u578B\u540E\u81EA\u52A8\u5C55\u793A\u5546\u6237\u5361\u7247'}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n </>\n );\n};\n", "/* A6API Plugin Styles - Clean Professional DSH Native Theme Integration */\n\n.dsh-a6-container {\n display: flex;\n flex-direction: column;\n color: var(--dsw-alias-label-primary, var(--ds-text-primary, #1e293b));\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n padding-bottom: 28px;\n}\n\n/* ==========================================================================\n 1. Master Header & Navigation Tabs (Image 2 Style)\n ========================================================================== */\n.dsh-a6-main-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n margin-bottom: 12px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-header-text {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dsh-a6-main-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--dsw-alias-label-primary, #0f172a);\n margin: 0;\n line-height: 1.2;\n}\n\n.dsh-a6-main-subtitle {\n font-size: 13px;\n color: var(--dsw-alias-label-secondary, #64748b);\n margin: 0;\n line-height: 1.5;\n}\n\n.dsh-a6-header-balance-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 16px;\n cursor: pointer;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all 0.15s;\n}\n\n.dsh-a6-header-badges {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-header-balance-badge:hover {\n border-color: #10b981;\n background: rgba(16, 185, 129, 0.04);\n}\n\n.dsh-a6-hb-label {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-price-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border-radius: 16px;\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all 0.15s;\n user-select: none;\n /* \u4E0E\u8D26\u6237\u4F59\u989D\u80F6\u56CA\u7B49\u9AD8\uFF1A\u7EE7\u627F\u540C\u6837\u5185\u8FB9\u8DDD\u4E0E\u884C\u9AD8\uFF0C\u907F\u514D\u89C6\u89C9\u5927\u5C0F\u5DEE\u5F02 */\n min-height: 28px;\n box-sizing: border-box;\n}\n\n.dsh-a6-price-pill.is-zero {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border-color: var(--dsw-alias-border-l2, #e2e8f0);\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-price-pill.is-zero:hover {\n border-color: #10b981;\n background: rgba(16, 185, 129, 0.04);\n}\n\n.dsh-a6-price-pill.is-zero.is-disabled-zero:hover {\n border-color: var(--dsw-alias-border-l2, #e2e8f0);\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n}\n\n.dsh-a6-price-pill.has-change {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border-color: var(--dsw-alias-border-l2, #e2e8f0);\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-price-pill.has-change:hover {\n border-color: #ef4444;\n background: rgba(239, 68, 68, 0.03);\n}\n\n.dsh-a6-price-pill.is-disabled-zero {\n cursor: not-allowed;\n opacity: 0.9;\n}\n\n.dsh-a6-price-pill.disabled {\n background: var(--dsw-alias-bg-layer-1, rgba(0,0,0,0.04));\n border-color: var(--dsw-alias-border-l3, #cbd5e1);\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n cursor: not-allowed;\n opacity: 0.85;\n}\n\n.dsh-a6-price-pill-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-price-pill-count {\n font-size: 13px;\n font-weight: 700;\n min-width: 8px;\n text-align: center;\n line-height: 1;\n}\n\n.dsh-a6-price-pill.is-zero .dsh-a6-price-pill-count {\n color: #10b981;\n}\n\n.dsh-a6-price-pill.has-change .dsh-a6-price-pill-count {\n color: #ef4444;\n}\n\n.dsh-a6-price-pill.disabled .dsh-a6-price-pill-count {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n/* \u300C\u6A21\u578B\u5E02\u573A\u300D\u80F6\u56CA(\u4FA7\u8FB9\u680F\u6D6E\u5C42):\u4E0E\u4F59\u989D / \u4EF7\u683C\u6CE2\u52A8\u80F6\u56CA\u540C\u6B3E\u5916\u89C2,\u70B9\u51FB\u76F4\u8FBE\u5B98\u7F51\u6A21\u578B\u9875 */\n.dsh-a6-market-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border-radius: 16px;\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all 0.15s;\n user-select: none;\n min-height: 28px;\n box-sizing: border-box;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-market-pill:hover {\n border-color: #10b981;\n background: rgba(16, 185, 129, 0.04);\n}\n\n.dsh-a6-market-pill-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-market-pill:hover .dsh-a6-market-pill-label {\n color: #10b981;\n}\n\n.dsh-a6-hb-amount {\n font-size: 13px;\n font-weight: 700;\n color: #10b981;\n}\n\n/* Nav Tabs */\n.dsh-a6-nav-tabs {\n display: flex;\n gap: 28px;\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n margin-bottom: 18px;\n margin-top: 4px;\n}\n\n.dsh-a6-nav-tab {\n background: transparent;\n border: none;\n padding: 10px 2px 12px 2px;\n font-size: 14px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n cursor: pointer;\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: color 0.15s;\n margin-bottom: -1px;\n}\n\n.dsh-a6-nav-tab:hover {\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-nav-tab.active {\n color: var(--dsw-alias-label-primary, #0f172a);\n font-weight: 600;\n border-bottom: 2px solid var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-tab-badge {\n font-size: 11px;\n font-weight: 500;\n padding: 1px 6px;\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.06));\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-tab-badge.success {\n background: rgba(16, 185, 129, 0.12);\n color: #10b981;\n}\n\n/* Tab Page Wrapper */\n.dsh-a6-tab-page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n animation: dsh-a6-fadein 0.15s ease-out;\n}\n\n@keyframes dsh-a6-fadein {\n from {\n opacity: 0.8;\n transform: translateY(2px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* ==========================================================================\n 2. Models Tab Toolbar & Filters\n ========================================================================== */\n.dsh-a6-section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n position: relative;\n z-index: 100;\n}\n\n.dsh-a6-filter-group {\n display: flex;\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.04));\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n border-radius: 6px;\n padding: 2px;\n}\n\n.dsh-a6-filter-btn {\n background: transparent;\n border: none;\n padding: 4px 10px;\n font-size: 12px;\n font-weight: 500;\n border-radius: 4px;\n color: var(--dsw-alias-label-secondary, #64748b);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.dsh-a6-filter-btn:hover {\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-filter-btn.active {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n color: var(--dsw-alias-label-primary, #0f172a);\n font-weight: 600;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.dsh-a6-toolbar-right {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.dsh-a6-search-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dsh-a6-search-input {\n width: 200px;\n height: 30px;\n padding-right: 22px;\n font-size: 12px;\n}\n\n.dsh-a6-clear-btn {\n position: absolute;\n right: 6px;\n background: transparent;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n font-size: 14px;\n padding: 2px;\n line-height: 1;\n}\n\n/* ==========================================================================\n 3. Clean Model Card\n ========================================================================== */\n.dsh-a6-cards-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.dsh-a6-official-card {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n padding: 12px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transition: border-color 0.15s, box-shadow 0.15s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);\n}\n\n.dsh-a6-official-card:hover {\n border-color: var(--dsw-alias-border-l1, #cbd5e1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n\n.dsh-a6-official-card.in-dsh {\n border-left: 3px solid #10b981;\n}\n\n/* Main Top Bar */\n.dsh-a6-card-main-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 14px;\n cursor: pointer;\n user-select: none;\n flex-wrap: wrap;\n}\n\n/* Identity Col (Clean text without Brand Logos) */\n.dsh-a6-bar-identity {\n display: flex;\n align-items: center;\n min-width: 180px;\n flex: 1.2;\n}\n\n.dsh-a6-title-col {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.dsh-a6-title-line {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-name-text {\n font-size: 14px;\n font-weight: 700;\n color: var(--dsw-alias-label-primary, #0f172a);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, monospace;\n}\n\n.dsh-a6-dot-sep {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-merchant-id-text {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #475569);\n}\n\n.dsh-a6-probe-fail-chip {\n margin-left: 8px;\n font-size: 11px;\n font-weight: 600;\n color: #dc2626;\n background: rgba(220, 38, 38, 0.08);\n border: 1px solid rgba(220, 38, 38, 0.35);\n border-radius: 999px;\n padding: 1px 8px;\n white-space: nowrap;\n cursor: help;\n}\n\n.dsh-a6-sub-desc {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n/* Pricing Col */\n.dsh-a6-bar-pricing {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n}\n\n.dsh-a6-bar-pricing.unprobed {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 12px;\n}\n\n.dsh-a6-unprobed-hint.error {\n color: #dc2626;\n font-weight: 600;\n}\n\n.dsh-a6-price-col {\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.dsh-a6-price-top {\n font-size: 13px;\n font-weight: 700;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-price-btm {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-ratio-pill {\n font-size: 11px;\n font-weight: 600;\n padding: 2px 7px;\n border-radius: 10px;\n background: #f0fdfa;\n color: #0d9488;\n border: 1px solid #99f6e4;\n white-space: nowrap;\n}\n\n/* \u6DF7\u5408\u4EF7\u80F6\u56CA\uFF08\u2248\u00A5x/\u4EBF tokens\uFF0C\u6309 24h \u7F13\u5B58\u547D\u4E2D\u7387\u4F30\u7B97\uFF09 */\n.dsh-a6-blend-pill {\n font-size: 11px;\n font-weight: 600;\n padding: 2px 7px;\n border-radius: 10px;\n background: rgba(16, 185, 129, 0.12);\n color: #0a8f5b;\n border: 1px solid rgba(10, 143, 91, 0.35);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n cursor: help;\n}\n\n/* Uptime / Health Col (\u5B9E\u65F6 / 24h / 7d) */\n.dsh-a6-bar-uptime {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 130px;\n}\n\n.dsh-a6-uptime-row {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 11px;\n}\n\n.dsh-a6-uptime-label {\n width: 24px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 10px;\n}\n\n.dsh-a6-dots-track {\n display: flex;\n gap: 2px;\n align-items: center;\n}\n\n.dsh-a6-rate-dot {\n width: 4px;\n height: 8px;\n border-radius: 2px;\n background: #10b981;\n}\n\n.dsh-a6-rate-dot.green {\n background: #10b981;\n}\n\n.dsh-a6-rate-dot.yellow {\n background: #f59e0b;\n}\n\n.dsh-a6-rate-dot.red {\n background: #ef4444;\n}\n\n.dsh-a6-rate-dot.empty {\n background: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.1));\n}\n\n.dsh-a6-uptime-val {\n font-weight: 600;\n font-size: 10px;\n color: var(--dsw-alias-label-secondary, #475569);\n min-width: 38px;\n text-align: right;\n}\n\n/* Performance Col (Speed / Cache Hit Bar) */\n.dsh-a6-bar-perf {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dsh-a6-perf-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dsh-a6-latency-text {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-cache-hit-text {\n font-size: 11px;\n font-weight: 600;\n color: #d97706;\n}\n\n.dsh-a6-hit-track {\n width: 38px;\n height: 4px;\n border-radius: 2px;\n background: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.08));\n overflow: hidden;\n}\n\n.dsh-a6-hit-fill {\n height: 100%;\n border-radius: 2px;\n background: linear-gradient(90deg, #f59e0b, #eab308);\n}\n\n/* Smart Tags */\n.dsh-a6-bar-tags {\n display: flex;\n gap: 5px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.dsh-a6-smart-pill {\n font-size: 11px;\n font-weight: 500;\n padding: 1px 6px;\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.04));\n border: 1px solid var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.08));\n color: var(--dsw-alias-label-secondary, #475569);\n}\n\n.dsh-a6-smart-pill.tag-stable {\n background: rgba(16, 185, 129, 0.08);\n border-color: rgba(16, 185, 129, 0.25);\n color: #10b981;\n}\n\n.dsh-a6-smart-pill.tag-cheap {\n background: rgba(59, 130, 246, 0.08);\n border-color: rgba(59, 130, 246, 0.25);\n color: #3b82f6;\n}\n\n.dsh-a6-smart-pill.tag-fast {\n background: rgba(249, 115, 22, 0.08);\n border-color: rgba(249, 115, 22, 0.25);\n color: #ea580c;\n}\n\n.dsh-a6-smart-pill.tag-quality {\n background: rgba(234, 179, 8, 0.08);\n border-color: rgba(234, 179, 8, 0.25);\n color: #ca8a04;\n}\n\n.dsh-a6-smart-pill.tag-guarantee {\n background: rgba(16, 185, 129, 0.12);\n border-color: rgba(16, 185, 129, 0.35);\n color: #059669;\n}\n\n/* Right Actions Group \u2014 \u9ED8\u8BA4\u9760\u53F3\uFF0C\u7A84\u5C4F\u65F6\u5360\u6EE1\u884C\u5BBD\u4E24\u7AEF\u5BF9\u9F50 */\n.dsh-a6-bar-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 0 0 auto;\n margin-left: auto;\n}\n\n@media (max-width: 900px) {\n .dsh-a6-bar-actions {\n flex: 1 1 100%;\n width: 100%;\n margin-left: 0;\n justify-content: space-between;\n }\n}\n\n.dsh-a6-time-ago {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n/* \u4E24\u884C\u65F6\u95F4\u6233\u5782\u76F4\u53E0\u653E (\u5168\u7F51\u6700\u8FD1 / \u4E2A\u4EBA\u6700\u8FD1) \u2014 \u5DE6\u5BF9\u9F50 */\n.dsh-a6-time-stack {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n flex-shrink: 0;\n text-align: left;\n}\n\n/* \u5361\u7247\u5E95\u90E8\u884C\uFF1A\u65F6\u95F4\u6233\u5DE6\u4E0B\u89D2\u5DE6\u5BF9\u9F50\uFF0C\u64CD\u4F5C\u6309\u94AE\u53F3\u4E0B\u89D2\u53F3\u5BF9\u9F50 */\n.dsh-a6-card-footer {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n padding-top: 2px;\n flex-wrap: wrap;\n}\n\n/* \u53F3\u4FA7\u4E09\u6309\u94AE\u7EC4 */\n.dsh-a6-bar-actions-btns {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.dsh-a6-route-snapshot.never {\n color: var(--dsw-alias-label-quaternary, #cbd5e1);\n}\n\n.dsh-a6-btn-in-dsh {\n background: rgba(16, 185, 129, 0.12);\n border: 1px solid rgba(16, 185, 129, 0.35);\n color: #059669;\n}\n\n.dsh-a6-btn-in-dsh:hover {\n background: rgba(16, 185, 129, 0.2);\n}\n\n.dsh-a6-expand-toggle-btn {\n background: transparent;\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary, #64748b);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 8px;\n height: 28px;\n transition: all 0.15s;\n}\n\n.dsh-a6-expand-toggle-btn:hover {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.04));\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* ==========================================================================\n 4. Bottom Detailed Comparison Box\n ========================================================================== */\n.dsh-a6-detail-container {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));\n border: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.8));\n border-radius: 8px;\n padding: 10px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.dsh-a6-detail-top-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-dt-left,\n.dsh-a6-dt-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dsh-a6-dt-label {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-dt-desc {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1e293b);\n}\n\n.dsh-a6-dt-channel-name {\n font-size: 12px;\n font-weight: 500;\n color: #3b82f6;\n}\n\n.dsh-a6-dt-divider {\n height: 1px;\n background: var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.6));\n margin: 1px 0;\n}\n\n/* Price Comparison Table */\n.dsh-a6-dt-table-col {\n overflow-x: auto;\n}\n\n.dsh-a6-price-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n text-align: left;\n}\n\n.dsh-a6-price-table th {\n padding: 4px 8px;\n font-size: 11px;\n font-weight: 500;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n border-bottom: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.6));\n}\n\n.dsh-a6-th-blank {\n width: 50px;\n}\n\n.dsh-a6-price-table td {\n padding: 5px 8px;\n}\n\n.dsh-a6-td-label {\n color: var(--dsw-alias-label-secondary, #64748b);\n font-weight: 500;\n}\n\n.dsh-a6-tr-official td {\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-tr-merchant td {\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-td-bold {\n font-weight: 700;\n}\n\n/* ==========================================================================\n 5. Account Tab & Asset Panel Styles\n ========================================================================== */\n.dsh-a6-account-page {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.dsh-a6-balance-banner {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, rgba(226, 232, 240, 0.8));\n border-radius: 10px;\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);\n position: relative;\n}\n\n.dsh-a6-balance-banner::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n border-top-left-radius: 9px;\n border-top-right-radius: 9px;\n background: linear-gradient(90deg, #3b82f6 0%, #10b981 50%, #6366f1 100%);\n}\n\n.dsh-a6-balance-banner.low-balance::before {\n background: linear-gradient(90deg, #ef4444 0%, #f59e0b 100%);\n}\n\n.dsh-a6-balance-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-balance-left {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.dsh-a6-balance-main-title {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dsh-a6-balance-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-balance-num-row {\n display: flex;\n align-items: baseline;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-balance-amount {\n font-size: 26px;\n font-weight: 700;\n color: #10b981;\n letter-spacing: -0.5px;\n line-height: 1.1;\n}\n\n.dsh-a6-balance-amount.unauthed {\n font-size: 22px;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-balance-banner.low-balance .dsh-a6-balance-amount {\n color: #ef4444;\n}\n\n.dsh-a6-balance-cny {\n font-size: 14px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-status-pill {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 12px;\n display: inline-flex;\n align-items: center;\n}\n\n.dsh-a6-status-pill.success {\n background: rgba(16, 185, 129, 0.12);\n color: #10b981;\n border: 1px solid rgba(16, 185, 129, 0.25);\n}\n\n.dsh-a6-status-pill.warn {\n background: rgba(245, 158, 11, 0.12);\n color: #f59e0b;\n border: 1px solid rgba(245, 158, 11, 0.25);\n}\n\n.dsh-a6-low-alert {\n display: inline-flex;\n align-items: center;\n background: rgba(239, 68, 68, 0.12);\n color: #ef4444;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n width: fit-content;\n}\n\n.dsh-a6-balance-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n/* Stat KPI Cards Grid */\n.dsh-a6-stat-cards-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n}\n\n@media (max-width: 768px) {\n .dsh-a6-stat-cards-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n.dsh-a6-kpi-card {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));\n border: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.6));\n border-radius: 8px;\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.dsh-a6-kpi-label {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-kpi-val {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* Auth Banner Box */\n.dsh-a6-auth-banner-box {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 14px;\n padding: 12px 16px;\n background: rgba(59, 130, 246, 0.06);\n border: 1px solid rgba(59, 130, 246, 0.2);\n border-radius: 8px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-auth-banner-title {\n font-size: 13px;\n font-weight: 600;\n color: #2563eb;\n margin-bottom: 2px;\n}\n\n.dsh-a6-auth-banner-desc {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #475569);\n line-height: 1.4;\n}\n\n/* Recent Logs Section */\n.dsh-a6-logs-section {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n padding: 14px 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.dsh-a6-logs-header {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.dsh-a6-logs-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-logs-subtitle {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-logs-table-wrapper {\n overflow-x: auto;\n}\n\n.dsh-a6-logs-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n text-align: left;\n}\n\n.dsh-a6-logs-table th {\n padding: 6px 8px;\n font-size: 11px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #64748b);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n}\n\n.dsh-a6-logs-table td {\n padding: 6px 8px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.5));\n}\n\n.dsh-a6-log-time {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 11px;\n}\n\n.dsh-a6-log-channel-badge {\n font-size: 11px;\n padding: 2px 6px;\n background: rgba(59, 130, 246, 0.08);\n color: #3b82f6;\n border-radius: 4px;\n}\n\n.dsh-a6-log-status {\n font-size: 11px;\n font-weight: 500;\n padding: 1px 6px;\n border-radius: 10px;\n}\n\n.dsh-a6-log-status.ok {\n background: rgba(16, 185, 129, 0.12);\n color: #10b981;\n}\n\n.dsh-a6-log-status.err {\n background: rgba(239, 68, 68, 0.12);\n color: #ef4444;\n}\n\n.dsh-a6-log-cost {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #475569);\n font-weight: 500;\n}\n\n.dsh-a6-btn-refresh-ok {\n color: #10b981 !important;\n border-color: rgba(16, 185, 129, 0.4) !important;\n background: rgba(16, 185, 129, 0.08) !important;\n}\n\n.dsh-a6-empty-logs {\n padding: 20px;\n text-align: center;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 12px;\n}\n\n/* ==========================================================================\n 6. Configuration Tab Styles\n ========================================================================== */\n.dsh-a6-config-page {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.dsh-a6-config-section {\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n padding: 16px 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.dsh-a6-section-heading {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.dsh-a6-heading-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-heading-desc {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #64748b);\n line-height: 1.4;\n}\n\n.dsh-a6-node-picker {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-node-pill {\n padding: 5px 12px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #475569);\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.dsh-a6-node-pill:hover {\n background: var(--dsw-alias-bg-layer-2, #f8fafc);\n border-color: #94a3b8;\n}\n\n.dsh-a6-node-pill.active {\n background: #3b82f6;\n color: #ffffff;\n border-color: #3b82f6;\n font-weight: 500;\n}\n\n.dsh-a6-config-fields-grid {\n display: flex;\n gap: 14px;\n}\n\n@media (max-width: 768px) {\n .dsh-a6-config-fields-grid {\n flex-direction: column;\n }\n}\n\n.dsh-a6-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n flex: 1;\n}\n\n.dsh-a6-field-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.dsh-a6-field-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.dsh-a6-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #475569);\n}\n\n.dsh-a6-field-hint {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n line-height: 1.4;\n}\n\n.dsh-a6-field-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n margin-top: 1px;\n}\n\n.dsh-a6-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dsh-a6-input {\n width: 100%;\n height: 32px;\n padding: 0 10px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n color: var(--dsw-alias-label-primary, #1e293b);\n font-size: 12px;\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n\n.dsh-a6-input:focus {\n border-color: #3b82f6;\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15);\n}\n\n.dsh-a6-help-drawer {\n background: var(--dsw-alias-bg-layer-1, #f8fafc);\n border: 1px dashed var(--dsw-alias-border-l2, #cbd5e1);\n border-radius: 8px;\n padding: 10px 14px;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #475569);\n}\n\n.dsh-a6-help-title {\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n margin-bottom: 4px;\n}\n\n.dsh-a6-help-list {\n margin: 0;\n padding-left: 18px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.dsh-a6-help-list code {\n background: rgba(0, 0, 0, 0.06);\n padding: 1px 4px;\n border-radius: 3px;\n font-size: 10px;\n}\n\n.dsh-a6-integration-card {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));\n border: 1px solid var(--dsw-alias-border-l3, rgba(226, 232, 240, 0.6));\n border-radius: 8px;\n padding: 10px 14px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.dsh-a6-int-row {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 12px;\n}\n\n.dsh-a6-int-key {\n width: 100px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-int-val {\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n\n.dsh-a6-int-tags {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-model-chip {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 7px;\n border-radius: 4px;\n background: rgba(16, 185, 129, 0.12);\n color: #059669;\n border: 1px solid rgba(16, 185, 129, 0.25);\n}\n\n.dsh-a6-empty-hint {\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n font-size: 12px;\n}\n\n.dsh-a6-save-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n}\n\n.dsh-a6-success-msg {\n color: #10b981;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* ==========================================================================\n 7. Buttons & Common State Styles\n ========================================================================== */\n.dsh-a6-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 30px;\n padding: 0 10px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s;\n white-space: nowrap;\n}\n\n.dsh-a6-btn-primary {\n background: #3b82f6;\n color: #ffffff;\n}\n\n.dsh-a6-btn-primary:hover {\n background: #2563eb;\n}\n\n.dsh-a6-btn-secondary {\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n border-color: var(--dsw-alias-border-l3, #cbd5e1);\n color: var(--dsw-alias-label-primary, #334155);\n}\n\n.dsh-a6-btn-secondary:hover {\n background: var(--dsw-alias-bg-layer-2, #f8fafc);\n border-color: #94a3b8;\n}\n\n.dsh-a6-btn-sm {\n height: 28px;\n padding: 0 9px;\n font-size: 12px;\n}\n\n.dsh-a6-btn-xs {\n height: 26px;\n padding: 0 8px;\n font-size: 11px;\n}\n\n.dsh-a6-btn-text {\n background: transparent;\n border: none;\n color: #3b82f6;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n padding: 1px 3px;\n}\n\n.dsh-a6-btn-text:hover {\n text-decoration: underline;\n}\n\n.dsh-a6-empty-state {\n text-align: center;\n padding: 36px 20px;\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px dashed var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary, #64748b);\n font-size: 13px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n}\n\n.dsh-a6-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid rgba(59, 130, 246, 0.2);\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: dsh-a6-spin 0.8s linear infinite;\n}\n\n@keyframes dsh-a6-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* ==========================================================================\n 8. Instant Custom Tooltip (Zero-Delay, High Contrast)\n ========================================================================== */\n[data-tooltip] {\n position: relative;\n}\n\n[data-tooltip]::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: calc(100% + 7px);\n left: 50%;\n transform: translateX(-50%);\n padding: 6px 10px;\n background: rgba(15, 23, 42, 0.96);\n color: #f8fafc;\n font-size: 11px;\n font-weight: 400;\n line-height: 1.4;\n white-space: normal;\n max-width: min(320px, 85vw);\n width: max-content;\n text-align: left;\n word-break: break-word;\n overflow-wrap: anywhere;\n border-radius: 6px;\n box-shadow: 0 6px 18px rgba(0, 0, 0, 0.28);\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.08s ease-out, visibility 0.08s ease-out;\n z-index: 99999;\n border: 1px solid rgba(255, 255, 255, 0.12);\n}\n\n[data-tooltip]::before {\n content: '';\n position: absolute;\n bottom: calc(100% + 2px);\n left: 50%;\n transform: translateX(-50%);\n border-width: 5px 5px 0 5px;\n border-style: solid;\n border-color: rgba(15, 23, 42, 0.94) transparent transparent transparent;\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.04s ease-out, visibility 0.04s ease-out;\n z-index: 99999;\n}\n\n[data-tooltip]:hover::after,\n[data-tooltip]:hover::before {\n opacity: 1;\n visibility: visible;\n}\n\n[data-tooltip-pos=\"left\"]::after {\n left: auto;\n right: 0;\n transform: none;\n}\n\n[data-tooltip-pos=\"left\"]::before {\n left: auto;\n right: 14px;\n transform: none;\n}\n\n[data-tooltip-pos=\"right\"]::after {\n left: 0;\n right: auto;\n transform: none;\n}\n\n[data-tooltip-pos=\"right\"]::before {\n left: 14px;\n right: auto;\n transform: none;\n}\n\n/* Down positions (for top toolbar and header buttons) */\n[data-tooltip-pos=\"down\"]::after {\n top: calc(100% + 7px);\n bottom: auto;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n}\n\n[data-tooltip-pos=\"down\"]::before {\n top: calc(100% + 2px);\n bottom: auto;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n border-width: 0 5px 5px 5px;\n border-color: transparent transparent rgba(15, 23, 42, 0.94) transparent;\n}\n\n[data-tooltip-pos=\"down-left\"]::after {\n top: calc(100% + 7px);\n bottom: auto;\n left: auto;\n right: 0;\n transform: none;\n}\n\n[data-tooltip-pos=\"down-left\"]::before {\n top: calc(100% + 2px);\n bottom: auto;\n left: auto;\n right: 14px;\n transform: none;\n border-width: 0 5px 5px 5px;\n border-color: transparent transparent rgba(15, 23, 42, 0.94) transparent;\n}\n\n[data-tooltip-pos=\"down-right\"]::after {\n top: calc(100% + 7px);\n bottom: auto;\n left: 0;\n right: auto;\n transform: none;\n}\n\n[data-tooltip-pos=\"down-right\"]::before {\n top: calc(100% + 2px);\n bottom: auto;\n left: 14px;\n right: auto;\n transform: none;\n border-width: 0 5px 5px 5px;\n border-color: transparent transparent rgba(15, 23, 42, 0.94) transparent;\n}\n\n/* Card actions tooltip: keep centered (avoid left:0 right-edge overflow) */\n.dsh-a6-bar-actions [data-tooltip]:not([data-tooltip-pos])::after {\n left: 50%;\n transform: translateX(-50%);\n right: auto;\n}\n\n.dsh-a6-bar-actions [data-tooltip]:not([data-tooltip-pos])::before {\n left: 50%;\n transform: translateX(-50%);\n right: auto;\n}\n\n/* When JS portal tooltip is active, hide pseudo to avoid double rendering */\nbody.dsh-a6api-tooltip-active [data-tooltip]::after,\nbody.dsh-a6api-tooltip-active [data-tooltip]::before {\n opacity: 0 !important;\n visibility: hidden !important;\n}\n\n/* ==========================================================================\n 8. \u56FA\u5B9A / \u7981\u7528 \u72B6\u6001\u5FBD\u6807\u3001\u64CD\u4F5C\u6309\u94AE\u4E0E\u56FA\u5B9A\u786E\u8BA4\u5F39\u7A97\n ========================================================================== */\n.dsh-a6-pin-badge {\n display: inline-flex;\n align-items: center;\n height: 18px;\n padding: 0 6px;\n margin-left: 6px;\n border-radius: 9px;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n.dsh-a6-pin-badge.here {\n background: rgba(16, 185, 129, 0.12);\n color: #059669;\n border: 1px solid rgba(16, 185, 129, 0.35);\n}\n\n.dsh-a6-pin-badge.elsewhere {\n background: rgba(245, 158, 11, 0.12);\n color: #d97706;\n border: 1px solid rgba(245, 158, 11, 0.35);\n}\n\n.dsh-a6-pin-badge.disabled {\n background: rgba(100, 116, 139, 0.14);\n color: #64748b;\n border: 1px solid rgba(100, 116, 139, 0.3);\n}\n\n.dsh-a6-btn-danger {\n background: #ffffff;\n border-color: #ef4444;\n color: #ef4444;\n}\n\n.dsh-a6-btn-danger:hover {\n background: #fef2f2;\n border-color: #dc2626;\n color: #dc2626;\n}\n\n.dsh-a6-btn:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.dsh-a6-action-error {\n /* footer \u5185\u72EC\u7ACB\u6574\u884C\u5C55\u793A\uFF08footer \u4E3A flex-wrap\uFF09\uFF0C\u4E0D\u4E0E\u6309\u94AE\u5E76\u6392\u6491\u5BBD */\n flex-basis: 100%;\n margin-top: 6px;\n padding: 4px 8px;\n border-radius: 6px;\n background: rgba(239, 68, 68, 0.08);\n border: 1px solid rgba(239, 68, 68, 0.25);\n color: #dc2626;\n font-size: 11px;\n line-height: 1.5;\n}\n\n/* \u56FA\u5B9A\u786E\u8BA4\u5F39\u7A97 */\n.dsh-a6-pin-modal-overlay {\n position: fixed;\n inset: 0;\n z-index: 2147483000;\n background: rgba(15, 23, 42, 0.45);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n}\n\n.dsh-a6-pin-modal {\n width: min(420px, 92vw);\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n border: 1px solid var(--dsw-alias-border-l3, #cbd5e1);\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(15, 23, 42, 0.25);\n overflow: hidden;\n}\n\n.dsh-a6-pin-modal-title {\n padding: 12px 16px;\n font-size: 14px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #1e293b);\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e2e8f0);\n background: var(--dsw-alias-bg-layer-1, #f8fafc);\n}\n\n.dsh-a6-pin-modal-body {\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.dsh-a6-pin-modal-row {\n display: flex;\n align-items: baseline;\n gap: 10px;\n font-size: 12px;\n}\n\n.dsh-a6-pin-modal-label {\n flex: 0 0 48px;\n color: var(--dsw-alias-label-secondary, #64748b);\n}\n\n.dsh-a6-pin-modal-value {\n color: var(--dsw-alias-label-primary, #1e293b);\n font-weight: 500;\n word-break: break-all;\n}\n\n.dsh-a6-pin-modal-note {\n margin: 4px 0 0;\n font-size: 11px;\n line-height: 1.6;\n color: var(--dsw-alias-label-secondary, #64748b);\n background: rgba(59, 130, 246, 0.06);\n border: 1px solid rgba(59, 130, 246, 0.15);\n border-radius: 6px;\n padding: 6px 8px;\n}\n\n.dsh-a6-pin-modal-foot {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 10px 16px;\n border-top: 1px solid var(--dsw-alias-border-l3, #e2e8f0);\n background: var(--dsw-alias-bg-layer-1, #f8fafc);\n}\n\n/* ==========================================================================\n Sidebar Footer Action: \u5F53\u524D\u4F1A\u8BDD A6api \u6A21\u578B\u5361\u7247\u5165\u53E3(\u5DE6\u4E0B\u89D2\u8BBE\u7F6E\u6309\u94AE\u4E0A\u65B9)\n ========================================================================== */\n.dsh-a6-side-btn-wrap {\n display: flex;\n min-width: 0;\n /* footerActions \u662F\u884C\u5411 flex \u5BB9\u5668(width:100%)\uFF1A\u62C9\u4F38\u5360\u6EE1,\u4E0E\u4E0A\u65B9\u300C\u8BBE\u7F6E\u300D\u6309\u94AE\u540C\u5BBD\u7684\u4E00\u6A2A\u6761 */\n flex: 1;\n}\n\n/* rail(\u6298\u53E0)\u6001:footerActions \u6536\u7F29\u4E3A\u5C45\u4E2D\u5185\u5BB9\u5BBD,wrap \u4E0D\u53C2\u4E0E\u62C9\u4F38 */\n.dsh-a6-side-btn-wrap.rail {\n flex: none;\n width: auto;\n}\n\n/* \u539F\u751F\u98CE\u683C:\u5BF9\u9F50\u8BBE\u7F6E\u6309\u94AE(42px \u900F\u660E\u5E7D\u7075\u6309\u94AE,\u65E0\u8FB9\u6846\u65E0\u5E95\u8272,label-primary \u6587\u5B57,\n hover \u7528 shell \u4EA4\u4E92\u5E95\u8272;rail \u6298\u53E0\u6001 36px \u5706) */\n.dsh-a6-side-btn {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n width: calc(100% + 4px);\n min-width: 0;\n height: 42px;\n margin: 4px -2px;\n padding: 0 10px 0 8px;\n border: none;\n border-radius: 12px;\n background: transparent;\n color: var(--dsw-alias-label-primary, #0f172a);\n cursor: pointer;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n transition: background 0.15s;\n}\n\n.dsh-a6-side-btn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(148, 163, 184, 0.16));\n}\n\n.dsh-a6-side-btn:disabled {\n cursor: default;\n opacity: 0.4;\n}\n\n/* rail(\u4FA7\u8FB9\u680F\u6298\u53E0)\u6001:36px \u5706\u5F62\u5355\u8272\u56FE\u6807,\u4E0E\u8BBE\u7F6E\u6309\u94AE\u4E00\u81F4 */\n.dsh-a6-side-btn.rail {\n width: 36px;\n height: 36px;\n margin: 0;\n padding: 0;\n justify-content: center;\n gap: 0;\n border-radius: 50%;\n}\n\n.dsh-a6-side-btn.rail:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(148, 163, 184, 0.16));\n}\n\n/* \u9F7F\u8F6E\u56FE\u6807:\u4E0E\u8BBE\u7F6E\u6309\u94AE\u540C\u6B3E(currentColor \u8DDF\u968F\u6587\u5B57\u8272;rail \u6001 18px \u4E0E\u8BBE\u7F6E\u4E00\u81F4) */\n.dsh-a6-side-btn-badge {\n flex: none;\n width: 16px;\n height: 16px;\n}\n\n.dsh-a6-side-btn.rail .dsh-a6-side-btn-badge {\n width: 18px;\n height: 18px;\n}\n\n.dsh-a6-side-btn-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* \u5F39\u51FA\u5361\u7247\u6D6E\u5C42:\u951A\u5B9A\u6309\u94AE,\u5411\u4E0A\u5C55\u5F00 */\n.dsh-a6-side-popup {\n position: fixed;\n z-index: 2147483000;\n width: min(500px, calc(100vw - 16px));\n max-height: calc(100vh - 16px);\n overflow-y: auto;\n overscroll-behavior: contain;\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n border: 1px solid var(--dsw-alias-border-l1, #e2e8f0);\n border-radius: 12px;\n box-shadow: 0 12px 36px rgba(0, 0, 0, 0.16), 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 10px;\n animation: dsh-a6-popup-up 0.18s ease-out;\n}\n\n@keyframes dsh-a6-popup-up {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n\n.dsh-a6-side-popup-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 28px 16px;\n color: var(--dsw-alias-label-secondary, #64748b);\n font-size: 13px;\n}\n\n.dsh-a6-side-popup-hint {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n/* \u975E A6api \u4F1A\u8BDD:\u6A21\u578B\u5361\u7247\u533A\u57DF\u6574\u4F53\u7F6E\u7070(\u53BB\u8272 + \u964D\u900F\u660E\u5EA6 + \u7981\u4EA4\u4E92),\u9876\u90E8\u8D26\u6237\u80F6\u56CA\u4E0D\u53D7\u5F71\u54CD */\n.dsh-a6-side-card-dimmed {\n filter: grayscale(1);\n opacity: 0.45;\n pointer-events: none;\n user-select: none;\n}\n\n/* \u6D6E\u5C42\u5185\u7981\u7528 CSS \u4F2A\u5143\u7D20 tooltip:JS portal tooltip \u6709 30ms \u5EF6\u8FDF,\u907F\u514D\u53CC\u63D0\u793A\u4E14\u4F2A\u5143\u7D20\u4F1A\u88AB overflow \u88C1\u526A */\n.dsh-a6-side-popup [data-tooltip]::after,\n.dsh-a6-side-popup [data-tooltip]::before {\n display: none;\n}\n\n/* \u6D6E\u5C42\u9876\u90E8\u8D26\u6237\u901F\u89C8\u80F6\u56CA\u884C:\u4E0E\u8BBE\u7F6E\u9875\u5934\u90E8\u540C\u6B3E\u89C6\u89C9,\u7F29\u7A84\u7D27\u51D1\u7248(\u4F59\u989D\u7EAF\u5C55\u793A + \u4EF7\u683C\u6CE2\u52A8\u53EF\u8DF3 + \u6A21\u578B\u5E02\u573A\u76F4\u8FBE) */\n.dsh-a6-side-pills {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n padding: 2px 2px 10px;\n margin-bottom: 10px;\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n}\n\n.dsh-a6-side-pills .dsh-a6-header-balance-badge,\n.dsh-a6-side-pills .dsh-a6-price-pill,\n.dsh-a6-side-pills .dsh-a6-market-pill {\n padding: 3px 10px;\n min-height: 24px;\n font-size: 11px;\n /* \u4F59\u989D\u80F6\u56CA\u57FA\u7C7B\u65E0 border-box/line-height\uFF0C\u8865\u4E0A\u4E0E\u4EF7\u683C\u80F6\u56CA\u4E00\u81F4\uFF0C\u4FDD\u8BC1\u4E24\u679A\u80F6\u56CA\u7B49\u9AD8 */\n box-sizing: border-box;\n line-height: 1;\n}\n\n.dsh-a6-side-pills .dsh-a6-price-pill-count,\n.dsh-a6-side-pills .dsh-a6-price-pill-label,\n.dsh-a6-side-pills .dsh-a6-hb-amount,\n.dsh-a6-side-pills .dsh-a6-hb-label,\n.dsh-a6-side-pills .dsh-a6-market-pill-label {\n font-size: 12px;\n line-height: 1;\n}\n\n/* \u6D6E\u5C42\u5185\u4F59\u989D\u80F6\u56CA\u4E3A\u7EAF\u5C55\u793A:\u7981\u6389\u8BBE\u7F6E\u9875\u7684 hover \u53CD\u9988\u4E0E\u624B\u578B(\u9700\u5199\u5728\u901A\u7528 hover \u89C4\u5219\u4E4B\u540E) */\n.dsh-a6-side-balance-pill,\n.dsh-a6-side-balance-pill:hover {\n cursor: default;\n border-color: var(--dsw-alias-border-l2, #e2e8f0);\n background: var(--dsw-alias-bg-layer-2, #ffffff);\n}\n\n\n/* ===== \u6A21\u578B\u76EE\u5F55\u9875 ===== */\n.dsh-a6-catalog-page {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.dsh-a6-catalog-toolbar {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-catalog-count {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n margin-left: 4px;\n}\n\n.dsh-a6-catalog-msg {\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 12px;\n line-height: 1.5;\n}\n.dsh-a6-catalog-msg.ok {\n background: rgba(16, 185, 129, 0.08);\n border: 1px solid rgba(16, 185, 129, 0.3);\n color: #047857;\n}\n.dsh-a6-catalog-msg.err {\n background: rgba(239, 68, 68, 0.08);\n border: 1px solid rgba(239, 68, 68, 0.3);\n color: #b91c1c;\n}\n\n.dsh-a6-catalog-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.dsh-a6-catalog-row {\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n border: 1px solid var(--dsw-alias-border-l2, #e2e8f0);\n border-radius: 10px;\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.dsh-a6-catalog-row.editing {\n border-color: #10b981;\n}\n\n/* \u7B2C\u4E00\u884C\uFF1A\u6A21\u578B ID + \u53EF\u7528\u5FBD\u7AE0 + \u540D\u79F0 + \u64CD\u4F5C\uFF08\u53C2\u6570\u7EDF\u4E00\u5728 ID \u4E0B\u65B9\uFF09 */\n.dsh-a6-catalog-row-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.dsh-a6-catalog-badge {\n font-size: 10px;\n font-weight: 600;\n padding: 1px 7px;\n border-radius: 9px;\n vertical-align: middle;\n white-space: nowrap;\n}\n.dsh-a6-catalog-badge.avail {\n background: rgba(16, 185, 129, 0.12);\n border: 1px solid rgba(16, 185, 129, 0.35);\n color: #047857;\n}\n\n.dsh-a6-catalog-filters {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n margin-top: 4px;\n}\n\n.dsh-a6-catalog-id {\n display: inline-flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n}\n.dsh-a6-catalog-id code {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #0f172a);\n}\n.dsh-a6-catalog-name {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #64748b);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.dsh-a6-catalog-meta {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.dsh-a6-catalog-param {\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 10px;\n background: rgba(16, 185, 129, 0.08);\n border: 1px solid rgba(16, 185, 129, 0.25);\n color: #047857;\n white-space: nowrap;\n}\n.dsh-a6-catalog-param.empty {\n background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.04));\n border-color: var(--dsw-alias-border-l3, #cbd5e1);\n color: var(--dsw-alias-label-tertiary, #94a3b8);\n}\n\n.dsh-a6-catalog-row-actions {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n margin-left: auto;\n}\n\n/* \u884C\u5185\u7F16\u8F91\u8868\u5355 */\n.dsh-a6-catalog-edit {\n border-top: 1px dashed var(--dsw-alias-border-l2, #e2e8f0);\n padding-top: 10px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.dsh-a6-edit-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: 10px;\n}\n\n.dsh-a6-edit-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n.dsh-a6-edit-wide {\n grid-column: 1 / -1;\n}\n\n.dsh-a6-checkbox-group {\n display: inline-flex;\n gap: 14px;\n align-items: center;\n padding: 6px 0;\n}\n.dsh-a6-checkbox {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n color: var(--dsw-alias-label-primary, #0f172a);\n cursor: pointer;\n user-select: none;\n}\n\n.dsh-a6-edit-actions {\n display: inline-flex;\n gap: 8px;\n justify-content: flex-end;\n}\n\n/* \u6E05\u7A7A\u76EE\u5F55\u786E\u8BA4\u6001\uFF1A\u7EA2\u8272\u9AD8\u4EAE\u63D0\u793A\u4E8C\u6B21\u70B9\u51FB\u751F\u6548 */\n.dsh-a6-btn-clear-confirm {\n background: #ef4444 !important;\n border-color: #ef4444 !important;\n color: #ffffff !important;\n}\n"],
5
+ "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
6
6
  "names": ["import_react", "import_react", "next", "name", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "name", "import_jsx_runtime", "import_react", "import_jsx_runtime", "React"]
7
7
  }