dsh-multi-router 0.5.8 → 0.5.9
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/CHANGELOG.md +10 -0
- package/README.md +24 -8
- package/cordis.patch.yml +2 -2
- package/lib/accounts.js +3 -1
- package/lib/{chunk-ILRW3ELD.js → chunk-I4EW5TI7.js} +250 -66
- package/lib/chunk-I4EW5TI7.js.map +7 -0
- package/lib/{chunk-OFFVP6YN.js → chunk-S6ZQ45SS.js} +20 -3
- package/lib/chunk-S6ZQ45SS.js.map +7 -0
- package/lib/cli.js +1 -1
- package/lib/client.js +404 -309
- package/lib/client.js.map +2 -2
- package/lib/{host-v0.5.8.js → host-v0.5.9.js} +6 -112
- package/lib/host.js +6 -112
- package/lib/index.js +6 -112
- package/lib/index.js.map +4 -4
- package/lib/manager.js +2 -2
- package/package.json +1 -1
- package/lib/chunk-ILRW3ELD.js.map +0 -7
- package/lib/chunk-OFFVP6YN.js.map +0 -7
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/client.jsx", "../package.json"],
|
|
4
|
-
"sourcesContent": ["import { useEffect, useRef, useState } from 'react';\nimport { version as pluginVersion } from '../package.json';\nexport const name = 'dsh-multi-router-client';\nexport const inject = ['slots'];\nconst ENDPOINT = '/.well-known/dsh-multi-router';\nlet reloadFromHost;\nexport async function requestPluginReload(remote) {\n if (!remote?.pluginManager?.setBundleEnabled) throw Error('\u5F53\u524D DSH \u672A\u63D0\u4F9B\u91CD\u65B0\u52A0\u8F7D\u63A5\u53E3\uFF0C\u8BF7\u5347\u7EA7 DSH \u6216\u5728\u63D2\u4EF6\u9875\u5173\u95ED\u540E\u91CD\u65B0\u542F\u7528\u672C\u63D2\u4EF6\u3002');\n const answer = await remote.pluginManager.setBundleEnabled('dsh-multi-router', true);\n const result = answer?.ok === true ? answer.value : answer;\n if (answer?.ok === false || result?.application !== 'applied') throw Error('DSH \u672A\u80FD\u5373\u65F6\u91CD\u8F7D\uFF0C\u8BF7\u68C0\u67E5\u7EC4\u4EF6\u9519\u8BEF\uFF1B\u4E0D\u652F\u6301\u70ED\u52A0\u8F7D\u7684\u65E7\u7248 DSH \u4ECD\u9700\u91CD\u542F\u3002');\n}\nexport const backendNeedsRestart = data => !!data && data.pluginVersion !== pluginVersion;\nexport function RestartGuidance({ data, retry, reload, busy }) {\n return <section className=\"box stack\" role=\"alert\"><h3>\u63D2\u4EF6\u6B63\u5728\u8FDE\u63A5\u6216\u540C\u6B65\u7248\u672C</h3>\n <p>{data ? `\u9762\u677F v${pluginVersion}\uFF0C\u8FD0\u884C\u4E2D\u7684\u540E\u53F0 v${data.pluginVersion || '\u65E7\u7248'}\u3002\u6B63\u5728\u7B49\u5F85 DSH \u540C\u6B65\u65B0\u7248\u672C\u3002` : '\u6682\u65F6\u65E0\u6CD5\u8FDE\u63A5\u63D2\u4EF6\u540E\u53F0\u3002\u5B89\u88C5\u6216\u66F4\u65B0\u540E\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF0C\u4E5F\u53EF\u4EE5\u53EA\u91CD\u65B0\u52A0\u8F7D\u672C\u63D2\u4EF6\u3002'}</p>\n <div className=\"row\"><button disabled={busy} onClick={reload}>\u91CD\u65B0\u52A0\u8F7D\u63D2\u4EF6</button><button disabled={busy} onClick={retry}>\u91CD\u65B0\u8FDE\u63A5</button></div>\n <details><summary>\u4ECD\u65E0\u6CD5\u8FDE\u63A5\uFF1F</summary><p className=\"notice\">\u5148\u68C0\u67E5\u4E0B\u65B9\u7EC4\u4EF6\u7684\u542F\u7528\u9519\u8BEF\u3002\u65E7\u7248 DSH \u82E5\u4E0D\u652F\u6301\u8FD0\u884C\u4E2D\u91CD\u8F7D\uFF0C\u53EF\u5347\u7EA7 DSH\uFF0C\u6216\u901A\u8FC7\u300C\u9000\u51FA DeepSeek Harness\u300D\u5B8C\u5168\u9000\u51FA\u540E\u91CD\u65B0\u6253\u5F00\u3002\u5173\u95ED\u7A97\u53E3\u4E0D\u7B49\u4E8E\u9000\u51FA\uFF0C\u8D26\u53F7\u3001\u8DEF\u7531\u4E0E\u7528\u91CF\u4F1A\u4FDD\u7559\u3002</p></details></section>;\n}\nexport async function readManagementResponse(res) {\n let next;\n try { next = JSON.parse(await res.text()); } catch {\n throw Error(`\u63D2\u4EF6\u540E\u53F0\u672A\u5C31\u7EEA\uFF08HTTP ${res.status}\uFF09\u3002\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\uFF1B\u82E5\u6301\u7EED\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u52A0\u8F7D\u63D2\u4EF6\u5E76\u68C0\u67E5\u7EC4\u4EF6\u9519\u8BEF\u3002`);\n }\n if (!next || typeof next !== 'object' || Array.isArray(next)) throw Error('\u63D2\u4EF6\u540E\u53F0\u8FD4\u56DE\u4E86\u65E0\u6548\u6570\u636E\uFF0C\u8BF7\u5237\u65B0\u9762\u677F\u6216\u91CD\u542F DSH\u3002');\n if (!res.ok) throw Error(next.error || `\u64CD\u4F5C\u5931\u8D25\uFF08HTTP ${res.status}\uFF09`);\n return next;\n}\nconst fmt = n => typeof n === 'number' ? new Intl.NumberFormat('zh-CN', { maximumFractionDigits: 2 }).format(n) : '\u2014';\nconst when = n => n ? new Date(n).toLocaleString('zh-CN', { hour12: false }) : '\u5C1A\u672A\u83B7\u53D6';\nconst strategies = { failover: '\u6545\u969C\u5207\u6362', weighted: '\u6309\u6743\u91CD\u5206\u914D', tokens: '\u6309 Token \u989D\u5EA6\u8F6E\u6362', credits: '\u6309\u79EF\u5206\u6D88\u8017\u8F6E\u6362' };\nconst loginNames = { valid: '\u767B\u5F55\u6709\u6548', configured: '\u5DF2\u4FDD\u5B58 PAT', 'refresh-needed': '\u7B49\u5F85\u5237\u65B0', expired: '\u767B\u5F55\u5DF2\u8FC7\u671F', missing: '\u672A\u83B7\u53D6\u767B\u5F55\u4FE1\u606F' };\nconst effortNames = { off: '\u5173\u95ED\u601D\u8003 \u00B7 Off', minimal: '\u6700\u4F4E \u00B7 Minimal', low: '\u4F4E \u00B7 Low', medium: '\u4E2D \u00B7 Medium', high: '\u9AD8 \u00B7 High', xhigh: '\u8D85\u9AD8 \u00B7 XHigh', max: '\u6700\u9AD8 \u00B7 Max' };\nfunction downloadJson(exported) {\n const url = URL.createObjectURL(new Blob([JSON.stringify(exported.document, null, 2)], { type: 'application/json' }));\n const a = document.createElement('a'); a.href = url; a.download = exported.filename; document.body.append(a); a.click(); a.remove(); setTimeout(() => URL.revokeObjectURL(url), 10000);\n}\nconst styles = `\n.mr{--mr-accent:var(--dsw-alias-state-active-primary,#3a71db);--mr-border:var(--dsw-alias-border-l2,#444);--mr-bg:var(--dsw-alias-bg-layer-1,#202020);--mr-card:var(--dsw-alias-bg-module-platform,#282828);--mr-text:var(--dsw-alias-label-primary,#f4f4f4);--mr-muted:var(--dsw-alias-label-secondary,#b0b0b0);color:var(--mr-text);font:inherit;font-size:14px;line-height:1.6;max-width:1120px}\n.mr *{box-sizing:border-box}.mr h2,.mr h3,.mr p{margin:0}.mr h2{font-size:22px}.mr h3{font-size:16px}.mr small,.mr .muted,.mr .notice{color:var(--mr-muted)}.mr .notice{font-size:13px}.mr .mono{font:12px ui-monospace,monospace;overflow-wrap:anywhere}\n.mr .bar,.mr .row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.mr .bar{justify-content:space-between}.mr .stack{display:flex;flex-direction:column;gap:16px}.mr .grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.mr .metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}.mr .providers{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.mr .full{grid-column:1/-1}\n.mr .box{border:1px solid var(--mr-border);border-radius:12px;padding:20px;background:var(--mr-card)}.mr .metric strong{font-size:26px;line-height:1.3;display:block;margin:8px 0}.mr .metric small{font-size:12px}.mr .item{padding:16px 0;border-top:1px solid var(--mr-border)}.mr .item:first-child{border-top:0}.mr .item:last-child{padding-bottom:0}.mr .badge{border:1px solid var(--mr-border);border-radius:6px;padding:3px 8px;font-size:12px;white-space:nowrap}.mr .empty{padding:24px 0;text-align:center;color:var(--mr-muted)}\n.mr nav{display:flex;flex-wrap:wrap;gap:8px;border-bottom:1px solid var(--mr-border);padding:18px 0;margin-bottom:20px}.mr button,.mr input,.mr select,.mr textarea,.mr .link{font:inherit;color:inherit;border:1px solid var(--mr-border);border-radius:8px;background:var(--mr-bg);min-height:44px;padding:9px 12px}.mr button,.mr .link{cursor:pointer;transition:background .15s}.mr button:hover,.mr .link:hover{background:var(--mr-card)}.mr button:disabled{opacity:.45;cursor:default}.mr button.primary,.mr button[aria-pressed=true]{background:var(--mr-accent);color:#fff;border-color:transparent}.mr button.quiet{border-color:transparent;background:transparent}.mr :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--mr-accent);outline-offset:3px}.mr input:not([type=checkbox]),.mr select,.mr textarea{width:100%;min-width:0}.mr input[type=checkbox]{width:18px;height:18px;min-height:0;accent-color:var(--mr-accent)}.mr label{display:flex;flex-direction:column;gap:6px;font-size:13px}.mr label.check{flex-direction:row;align-items:center;gap:8px;min-height:44px}.mr .filter{min-width:170px;max-width:240px}.mr .feedback{padding:12px 16px;border-radius:8px;border:1px solid var(--mr-border)}.mr .error{color:var(--dsw-alias-state-error-primary,#ef9393)}.mr .good{color:var(--dsw-alias-state-success-primary,#77ca9d)}.mr .route-path{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.mr .route-path span{padding:4px 9px;border:1px solid var(--mr-border);border-radius:6px}.mr details{border-top:1px solid var(--mr-border);padding-top:14px}.mr summary{cursor:pointer;color:var(--mr-muted)}.mr progress{width:100%;height:7px;accent-color:var(--mr-accent)}.mr .trend{height:100px;display:flex;align-items:flex-end;gap:8px;margin:16px 0}.mr .trend>div{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;min-width:0}.mr .trend i{display:block;width:100%;min-height:3px;border-radius:4px 4px 0 0;background:var(--mr-accent)}.mr .trend small{font-size:11px;white-space:nowrap}.mr .table{width:100%;border-collapse:collapse;font-size:13px}.mr th,.mr td{text-align:left;border-bottom:1px solid var(--mr-border);padding:10px 8px}.mr th{font-weight:500;color:var(--mr-muted)}.mr .scroll{overflow:auto}.mr .steps{padding:14px 16px;border-left:3px solid var(--mr-accent);background:var(--mr-bg);border-radius:8px}.mr .link{text-decoration:none;display:inline-flex;align-items:center}\n.mr dialog{color:var(--mr-text);background:var(--mr-bg);border:1px solid var(--mr-border);border-radius:16px;width:min(900px,calc(100vw - 32px));max-height:calc(100vh - 40px);padding:0;box-shadow:0 24px 80px #0008}.mr dialog::backdrop{background:#000a}.mr .modal-head,.mr .modal-foot{padding:18px 24px;background:var(--mr-bg);position:sticky;z-index:1}.mr .modal-head{top:0;border-bottom:1px solid var(--mr-border)}.mr .modal-foot{bottom:0;border-top:1px solid var(--mr-border)}.mr .modal-body{padding:24px}.mr .target-head strong{font-size:14px}.mr .subtle{background:var(--mr-bg)}\n@media(max-width:850px){.mr .providers{grid-template-columns:1fr}.mr .metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){.mr .grid{grid-template-columns:1fr}.mr .box{padding:16px}.mr nav{flex-wrap:wrap}.mr .modal-body,.mr .modal-head,.mr .modal-foot{padding:16px}.mr .metrics{gap:8px}.mr .metric strong{font-size:22px}}\n.mr{--mr-soft:color-mix(in srgb,var(--mr-text) 3%,var(--mr-card));--mr-selected:color-mix(in srgb,var(--mr-accent) 7%,var(--mr-card));max-width:1280px;min-width:0;line-height:1.55}\n.mr h2{font-size:24px;letter-spacing:-.5px;font-weight:650}.mr h3{font-weight:600}.mr .stack{gap:20px}.mr .row{gap:8px}.mr .box{border-radius:14px;background:var(--mr-card)}.mr .box.stack{gap:16px}\n.mr nav{gap:4px;padding:16px 0 0;margin-bottom:24px}.mr nav button{border:0;border-radius:0;background:transparent;padding:12px 14px;border-bottom:2px solid transparent;color:var(--mr-muted)}.mr nav button[aria-pressed=true]{background:transparent;color:var(--mr-text);border-bottom-color:var(--mr-text);font-weight:600}.mr nav button:hover{background:var(--mr-soft)}\n.mr button.primary{background:var(--mr-text);color:var(--mr-card);border-color:var(--mr-text)}.mr button.primary:hover{opacity:.85}.mr button:active:not(:disabled){filter:brightness(.9)}.mr button.quiet{color:var(--mr-muted)}.mr .badge{border-radius:100px;background:var(--mr-soft);padding:4px 10px}.mr .metric{background:var(--mr-soft)}.mr .metric strong{font-size:28px;font-variant-numeric:tabular-nums;letter-spacing:-.5px;margin:10px 0 4px}.mr .metrics{gap:16px}\n.mr .status{display:inline-flex;align-items:center;gap:7px;font-size:13px;white-space:nowrap}.mr .status i{width:8px;height:8px;border-radius:50%;background:var(--mr-muted);display:inline-block;flex-shrink:0}.mr .status i.good{background:var(--dsw-alias-state-success-primary,#38a16a)}.mr .status i.warn{background:var(--dsw-alias-state-warning-primary,#c48b28)}.mr .warn{color:var(--dsw-alias-state-warning-primary,#c48b28)}\n.mr .table-shell{padding:0;overflow:hidden}.mr .scroll>.table{min-width:760px}.mr .table{font-size:14px}.mr .table th{background:var(--mr-soft);font-size:12px;letter-spacing:.02em;font-weight:500;white-space:nowrap}.mr .table th,.mr .table td{padding:16px 20px;vertical-align:middle}.mr .table td:last-child{white-space:nowrap}.mr .table tbody tr:last-child td{border-bottom:0}.mr .table td small{display:block;font-size:12px;margin-top:3px}.mr .table td>strong{font-weight:600}.mr .table tr.selected{background:var(--mr-selected)}.mr .table tbody tr:hover{background:var(--mr-soft)}.mr .table .account-name{max-width:230px;overflow-wrap:anywhere}.mr .table .amount{font-size:20px;line-height:1.35;font-variant-numeric:tabular-nums;font-weight:600;white-space:nowrap}.mr .table .cell-actions{white-space:nowrap;text-align:right}.mr .table .account-check{min-width:44px;min-height:44px;justify-content:center;flex-shrink:0}.mr .table .account-cell{display:flex;gap:10px;align-items:center}.mr .table .account-cell .check{margin-left:-12px}.mr .table .account-cell input{accent-color:var(--mr-text)}.mr .table .row{flex-wrap:nowrap}.mr .section-title{margin-bottom:4px}.mr .toolbar{align-items:flex-end;gap:16px}.mr .search{max-width:280px;flex:1;min-width:160px}.mr .table-footer{padding:14px 20px;background:var(--mr-soft)}.mr .hint{font-size:13px;color:var(--mr-muted)}.mr details.help{border:0;padding:0}.mr details.help>div{padding:12px 0;max-width:76ch}.mr .plan-form{align-items:flex-end;padding:16px 0 0;border-top:1px solid var(--mr-border)}.mr .plan-form .filter{min-width:180px}.mr .steps{border:1px solid var(--mr-border);border-radius:10px;background:var(--mr-soft);padding:14px 16px}.mr .route-path span{background:var(--mr-soft);border-color:transparent;font-size:12px}.mr .route-card details{padding-top:10px}.mr .feedback{margin-bottom:16px}.mr .box .feedback{margin-bottom:0}.mr .scroll{max-width:100%}.mr .scroll:focus-visible{outline:2px solid var(--mr-accent);outline-offset:-3px}\n@media(max-width:850px){.mr .metrics{gap:10px}.mr nav{gap:0}.mr nav button{padding:12px 10px}}@media(max-width:600px){.mr h2{font-size:22px}.mr nav{display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}.mr nav button{padding:10px 4px;font-size:12px;white-space:nowrap}.mr .toolbar>.row{width:100%}.mr .toolbar .search{max-width:none}.mr .metric strong{font-size:24px}.mr .table th,.mr .table td{padding:14px 16px}.mr .filter{max-width:none}.mr .plan-form label{flex:1}.mr .box.table-shell{padding:0}}\n\n@media(prefers-reduced-motion:reduce){.mr *{transition:none!important}}\n`;\nexport function apply(ctx) { reloadFromHost = () => requestPluginReload(ctx.get?.('remote')); ctx.slots.inject('plugins.bundle.config', () => ctx.slots.register({ name: 'plugins.bundle.config', key: 'dsh-multi-router' }, RouterPage)); ctx.slots.inject('shell.overlay', () => ctx.slots.register({ name: 'shell.overlay', id: 'dsh-multi-router-updates' }, UpdateReminder)); }\nfunction Modal({ title, close, children, busy }) {\n const ref = useRef(null);\n useEffect(() => { const dialog = ref.current; dialog.showModal(); return () => dialog.close(); }, []);\n return <dialog ref={ref} aria-label={title} onCancel={e => { e.preventDefault(); if (!busy) close(); }}>\n <div className=\"modal-head bar\"><h2>{title}</h2><button type=\"button\" disabled={busy} onClick={close}>\u5173\u95ED</button></div>{children}\n </dialog>;\n}\nexport function UpdateReminder() {\n const [data, setData] = useState(null), [opened, setOpened] = useState(null), [manage, setManage] = useState(false), [busy, setBusy] = useState(false), [error, setError] = useState('');\n useEffect(() => {\n let live = true, pending = false;\n async function poll() { if (document.hidden || pending) return; pending = true; try { const next = await readManagementResponse(await fetch(ENDPOINT, { cache: 'no-store' })); if (live && !backendNeedsRestart(next)) { setData(next); setOpened(current => current ?? (next.pluginUpdates?.reminders?.length && !document.querySelector('dialog[open]') ? next.pluginUpdates.reminders : null)); } } catch { /* Settings page owns backend recovery guidance. */ } finally { pending = false; } }\n void poll(); const timer = setInterval(() => { void poll(); }, 60000);\n return () => { live = false; clearInterval(timer); };\n }, []);\n useEffect(() => { if (data?.pluginUpdates?.job?.state !== 'running') return; let live = true; const timer = setInterval(() => { void fetch(ENDPOINT, { cache: 'no-store' }).then(readManagementResponse).then(next => { if (live) setData(next); }).catch(() => {}); }, 2000); return () => { live = false; clearInterval(timer); }; }, [data?.pluginUpdates?.job?.state]);\n async function act(action) {\n if (busy) return false; setBusy(true); setError('');\n try { const next = await readManagementResponse(await fetch(ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Multi-Router-Key': data.key }, body: JSON.stringify({ revision: data.revision, ...action }) })); setData(next); return next; }\n catch (e) { setError(e.message); return false; } finally { setBusy(false); }\n }\n async function dismiss() { if (await act({ action: 'plugins.dismiss', keys: opened.map(r => r.key) })) { setOpened(null); setManage(false); } }\n if (!opened || !data) return null;\n return <div className=\"mr\"><style>{styles}</style><Modal title=\"\u53D1\u73B0\u63D2\u4EF6\u66F4\u65B0\" busy={busy || data.pluginUpdates?.job?.state === 'running'} close={() => { void dismiss(); }}><div className=\"modal-body stack\"><Feedback error={error} />\n {manage ? <PluginUpdatesPanel data={data.pluginUpdates} busy={busy} act={act} /> : <><p>{opened.length} \u4E2A\u7528\u6237\u5B89\u88C5\u7684\u63D2\u4EF6\u6709\u66F4\u65B0\u3002\u8BF7\u9009\u62E9\u67E5\u770B\u66F4\u65B0\uFF0C\u6216\u7A0D\u540E\u5904\u7406\u3002</p><ul>{opened.map(r => <li key={r.key}><strong>{r.name}</strong> \u00B7 {r.version || '\u672A\u77E5\u7248\u672C'} \u2192 {r.latestVersion || `Git ${r.latestCommit?.slice(0, 8)}`}</li>)}</ul><p className=\"notice\">\u6BCF 24 \u5C0F\u65F6\u81EA\u52A8\u68C0\u67E5 GitHub / npm \u5B89\u88C5\u6765\u6E90\uFF1B\u540C\u4E00\u7248\u672C\u53EA\u63D0\u9192\u4E00\u6B21\u3002DSH \u5185\u7F6E\u63D2\u4EF6\u4E0D\u53C2\u4E0E\u68C0\u67E5\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5B89\u88C5\u66F4\u65B0\u3002</p></>}\n <div className=\"row\"><button disabled={busy || data.pluginUpdates?.job?.state === 'running'} onClick={() => { void dismiss(); }}>\u7A0D\u540E\u5904\u7406</button>{!manage && <button className=\"primary\" disabled={busy} onClick={() => setManage(true)}>\u67E5\u770B\u5E76\u66F4\u65B0</button>}</div>\n </div></Modal></div>;\n}\nfunction Feedback({ error, notice }) { return error ? <div className=\"feedback error\" role=\"alert\">{error}</div> : notice ? <div className=\"feedback\" role=\"status\">{notice}</div> : null; }\nconst metric = (label, value, detail) => <div className=\"box metric\"><small>{label}</small><strong>{value}</strong><small>{detail}</small></div>;\nexport function RouterPage({ view = 'page' }) {\n const [data, setData] = useState(null), [tab, setTab] = useState('overview');\n const [accountProvider, setAccountProvider] = useState(''), [provider, setProvider] = useState('workbuddy'), [busy, setBusy] = useState(false), [live, setLive] = useState(true);\n const [error, setError] = useState(''), [notice, setNotice] = useState(''), [draft, setDraft] = useState(null), [accountModal, setAccountModal] = useState(null), [presetModal, setPresetModal] = useState(false), [search, setSearch] = useState('');\n const polling = useRef(false);\n async function load(signal = AbortSignal.timeout(8000)) { const next = await readManagementResponse(await fetch(ENDPOINT, { cache: 'no-store', signal })); setData(next); setError(''); }\n useEffect(() => {\n if (view === 'summary') return;\n let stopped = false, retry, attempts = 0;\n const abort = new AbortController();\n async function connect() {\n try { await load(AbortSignal.any([abort.signal, AbortSignal.timeout(4000)])); }\n catch (e) { if (stopped) return; if (++attempts < 8) retry = setTimeout(connect, 750); else setError(e.message); }\n }\n void connect();\n const timer = live && setInterval(() => { if (document.hidden || polling.current) return; polling.current = true; void load(abort.signal).catch(e => { if (!stopped) setError(e.message); }).finally(() => { polling.current = false; }); }, 15000);\n return () => { stopped = true; abort.abort(); clearTimeout(retry); clearInterval(timer); };\n }, [view, live]);\n useEffect(() => {\n if (data?.startup?.phase !== 'discovering' && !['waiting', 'reloading'].includes(data?.runtime?.phase) && data?.pluginUpdates?.job?.state !== 'running' && !data?.checkins?.running) return;\n const timer = setInterval(() => { if (polling.current) return; polling.current = true; void load().catch(e => setError(e.message)).finally(() => { polling.current = false; }); }, 2000);\n return () => clearInterval(timer);\n }, [data?.startup?.phase, data?.runtime?.phase, data?.pluginUpdates?.job?.state, data?.checkins?.running]);\n async function reload() { setBusy(true); setError(''); try { if (!reloadFromHost) throw Error('\u8BF7\u5728 DSH \u63D2\u4EF6\u9875\u91CD\u65B0\u542F\u7528\u672C\u63D2\u4EF6\u3002'); await reloadFromHost(); await load(); } catch (e) { setError(e.message); } finally { setBusy(false); } }\n async function act(action) {\n if (busy || backendNeedsRestart(data)) return false;\n setBusy(true); setError(''); setNotice('');\n try { const res = await fetch(ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Multi-Router-Key': data.key }, body: JSON.stringify({ revision: data.revision, ...action }) });\n const next = await readManagementResponse(res); const { exported, workbuddyLogin, loginResult, ...state } = next; setData(state); setNotice(action.action === 'workbuddy.sms' ? '' : action.action === 'workbuddy.login' ? loginResult?.warning || '\u767B\u5F55\u51ED\u8BC1\u5DF2\u4FDD\u5B58\uFF0C\u81EA\u52A8\u7B7E\u5230\u5F00\u5173\u4FDD\u6301\u539F\u8BBE\u7F6E\u3002' : action.action === 'checkins.verify' ? '\u767B\u5F55\u9A8C\u8BC1\u901A\u8FC7\uFF0C\u65E7\u7684\u4EE4\u724C\u5931\u6548\u63D0\u793A\u5DF2\u89E3\u9664\uFF1B\u672A\u63D0\u4EA4\u7B7E\u5230\u3002' : action.action === 'checkins.settings' ? '\u7B7E\u5230\u8BA1\u5212\u5DF2\u4FDD\u5B58\uFF1B\u4ECA\u65E5\u5DF2\u5904\u7406\u8BB0\u5F55\u4FDD\u6301\u4E0D\u53D8\u3002' : action.action.startsWith('checkins.') || action.action.startsWith('plugins.') || action.action === 'setup.dismiss' ? '' : action.action === 'accounts.discover' || action.action === 'monitor.refresh' ? '\u5DF2\u91CD\u65B0\u68C0\u6D4B\u672C\u673A\u767B\u5F55\u5E76\u5237\u65B0\u7528\u91CF\uFF1B\u68C0\u6D4B\u7ED3\u679C\u89C1\u4E0B\u65B9\u3002' : action.action.includes('refresh') ? '\u5DF2\u5237\u65B0\u3002\u65E0\u6CD5\u83B7\u53D6\u7684\u8D26\u53F7\u4F1A\u4FDD\u7559\u4E0A\u6B21\u6570\u636E\u5E76\u6807\u8BB0\u3002' : action.action === 'config.import' ? '\u914D\u7F6E\u5DF2\u5BFC\u5165\u5E76\u751F\u6548\uFF0C\u539F\u914D\u7F6E\u5DF2\u5907\u4EFD\uFF1B\u6A21\u578B\u548C\u7528\u91CF\u6B63\u5728\u540E\u53F0\u66F4\u65B0\u3002' : action.action.startsWith('config.') || action.action === 'account.export' ? '' : '\u5DF2\u4FDD\u5B58\u5E76\u751F\u6548\u3002'); return next;\n } catch (e) { setError(e.message); return false; } finally { setBusy(false); }\n }\n function openAccount(mode, account) { setError(''); setNotice(''); setAccountModal({ mode, account, revision: data.revision }); }\n const newTarget = (target = { provider: 'workbuddy' }) => ({ ...target, key: crypto.randomUUID(), weight: target.weight ?? 1, tokenBudget: target.tokenBudget ?? 100000, creditBudget: target.creditBudget ?? 100, modelText: (target.models ?? [target.model ?? '']).join(', ') });\n function editRoute(route) { setError(''); setNotice(''); setDraft({ ...structuredClone(route), revision: data.revision, previousId: route.id, strategy: route.strategy ?? 'failover', targets: route.targets.map(newTarget) }); }\n const p = data?.providers.find(p => p.id === provider);\n const providerSelect = <label className=\"filter\">\u4F9B\u5E94\u5546 / \u533A\u57DF<select value={provider} onChange={e => { setProvider(e.target.value); setSearch(''); }}>{data?.providers.map(p => <option key={p.id} value={p.id}>{p.name}</option>)}</select></label>;\n const accountProviderSelect = <label className=\"filter\">\u4F9B\u5E94\u5546 / \u533A\u57DF<select value={accountProvider} onChange={e => setAccountProvider(e.target.value)}><option value=\"\">\u5168\u90E8\u4F9B\u5E94\u5546</option>{data?.providers.map(p => <option key={p.id} value={p.id}>{p.name}</option>)}</select></label>;\n if (view === 'summary') return '\u4E09\u5BB6\u8D26\u53F7\u4E0E\u767B\u5F55\u4FE1\u606F\u3001\u7528\u91CF\u76D1\u63A7\u3001\u6A21\u578B\u7BA1\u7406\uFF0C\u4EE5\u53CA\u6743\u91CD\u548C\u989D\u5EA6\u8DEF\u7531\u3002';\n return <div className=\"mr\"><style>{styles}</style><div className=\"bar\"><div><h2>\u8D26\u53F7\u4E0E\u8DEF\u7531</h2><p className=\"muted\">\u7BA1\u7406\u4E09\u5BB6\u8D26\u53F7\u3001\u6A21\u578B\u4E0E\u7528\u91CF</p></div><div className=\"row\"><span className=\"badge\">v{data?.pluginVersion ?? pluginVersion}</span><span className=\"status\"><i className={busy || !data ? 'warn' : 'good'} aria-hidden=\"true\" />{busy ? '\u6B63\u5728\u5904\u7406\u2026' : !data ? '\u6B63\u5728\u8FDE\u63A5\u2026' : '\u672C\u673A\u8FD0\u884C'}</span><button disabled={busy} onClick={() => { void load().catch(e => setError(e.message)); }}>\u5237\u65B0\u9762\u677F</button></div></div>\n <nav aria-label=\"\u8DEF\u7531\u63D2\u4EF6\u914D\u7F6E\u9875\u7B7E\">{[['overview', '\u603B\u89C8\u4E0E\u7528\u91CF'], ['usage', 'Token \u660E\u7EC6'], ['accounts', '\u8D26\u53F7\u4E0E\u767B\u5F55'], ['checkins', '\u79EF\u5206\u7B7E\u5230'], ['models', '\u6A21\u578B\u7BA1\u7406'], ['routes', '\u8DEF\u7531\u89C4\u5219'], ['plugins', '\u63D2\u4EF6\u66F4\u65B0'], ['migration', '\u914D\u7F6E\u8FC1\u79FB']].map(([key, label]) => <button key={key} aria-pressed={tab === key} onClick={() => { setTab(key); setError(''); setNotice(''); }}>{label}</button>)}</nav>\n {!draft && !accountModal && !presetModal && <Feedback error={error} notice={notice} />}\n {(backendNeedsRestart(data) || (!data && error)) && <RestartGuidance data={data} busy={busy} reload={() => { void reload(); }} retry={() => { void load().catch(e => setError(e.message)); }} />}\n {!data ? <section className=\"box stack\" role=\"status\" aria-live=\"polite\"><h3>{error ? '\u7B49\u5F85\u540E\u53F0\u8FDE\u63A5' : '\u6B63\u5728\u8FDE\u63A5\u672C\u673A\u63D2\u4EF6\u2026'}</h3><p className=\"notice\">\u9875\u9762\u4F1A\u81EA\u52A8\u91CD\u65B0\u8FDE\u63A5\u3002\u8D26\u53F7\u53D1\u73B0\u3001\u7528\u91CF\u548C\u6A21\u578B\u76EE\u5F55\u5C06\u5728\u540E\u53F0\u66F4\u65B0\u3002</p><progress aria-label=\"\u6B63\u5728\u8FDE\u63A5\u63D2\u4EF6\u540E\u53F0\" /></section> : <fieldset className=\"stack\" style={{ border: 0, padding: 0, margin: 0, minWidth: 0 }} disabled={backendNeedsRestart(data)} aria-busy={busy}>\n {data.startup?.phase === 'discovering' && <p className=\"steps\" role=\"status\">\u6B63\u5728\u540E\u53F0\u83B7\u53D6\u672C\u673A\u8D26\u53F7\uFF0C\u5DF2\u6709\u8D26\u53F7\u548C\u8DEF\u7531\u73B0\u5728\u5373\u53EF\u4F7F\u7528\u3002</p>}\n {data.runtime?.phase && data.runtime.phase !== 'current' && <section className=\"steps\"><p>{data.runtime.message}\uFF08\u8FD0\u884C v{data.runtime.runningVersion} / \u5DF2\u5B89\u88C5 v{data.runtime.installedVersion}\uFF09</p>{['failed', 'restart-required'].includes(data.runtime.phase) && <button disabled={busy} onClick={() => { void reload(); }}>\u91CD\u65B0\u52A0\u8F7D\u63D2\u4EF6</button>}</section>}\n {['overview', 'accounts'].includes(tab) && data.setup?.dismissed !== true && <InitialSetup data={data} busy={busy} act={act} go={key => setTab(key)} />}\n {tab === 'overview' && <Overview data={data} live={live} setLive={setLive} busy={busy} act={act} go={key => setTab(key)} />}\n {tab === 'plugins' && <PluginUpdatesPanel data={data.pluginUpdates} busy={busy} act={act} />}\n {tab === 'checkins' && <CheckinPanel data={data} busy={busy} act={act} />}\n {tab === 'usage' && <UsageDetails data={data} busy={busy} act={act} />}\n {tab === 'accounts' && <AccountPool key={accountProvider} data={data} provider={accountProvider} providerSelect={accountProviderSelect} busy={busy} act={act} manage={a => openAccount('edit', a)} add={() => openAccount('add')} />}\n {tab === 'models' && <div className=\"stack\"><section className=\"box stack\"><div className=\"bar\"><div><h3>\u539F\u59CB\u6A21\u578B\u5C55\u793A</h3><p className=\"notice\">\u5168\u90E8\u6E20\u9053\u5DF2\u5C55\u793A {data.providers.reduce((n, p) => n + p.models.filter(m => m.visible).length, 0)} / {data.providers.reduce((n, p) => n + p.models.length, 0)} \u4E2A\u6A21\u578B</p></div><div className=\"row\"><button disabled={busy} onClick={() => { void act({ action: 'models.visibility', visible: true }); }}>\u5168\u90E8\u5C55\u793A</button><button disabled={busy} onClick={() => { void act({ action: 'models.visibility', visible: false }); }}>\u5168\u90E8\u9690\u85CF\uFF08\u4EC5\u8DEF\u7531\uFF09</button></div></div><p className=\"notice\">\u4E09\u5BB6\u6240\u6709\u533A\u57DF\u7684\u539F\u59CB\u6A21\u578B\u9ED8\u8BA4\u9690\u85CF\uFF0C\u53EA\u5C55\u793A\u7EDF\u4E00\u8DEF\u7531\u3002\u6279\u91CF\u64CD\u4F5C\u4F5C\u7528\u4E8E\u5168\u90E8\u6E20\u9053\uFF0C\u5E76\u9002\u7528\u4E8E\u540E\u7EED\u53D1\u73B0\u7684\u65B0\u6A21\u578B\uFF1B\u5355\u4E2A\u6A21\u578B\u4ECD\u53EF\u5355\u72EC\u8C03\u6574\u3002\u9690\u85CF\u4E0D\u5F71\u54CD\u8DEF\u7531\u76EE\u6807\u6216\u5DF2\u6709\u4F1A\u8BDD\u3002</p></section><div className=\"bar\">{providerSelect}<button disabled={busy} onClick={() => { void act({ action: 'refresh', provider }); }}>\u83B7\u53D6\u6A21\u578B\u76EE\u5F55</button></div><label>\u641C\u7D22\u6A21\u578B<input type=\"search\" placeholder=\"\u8F93\u5165\u540D\u79F0\u6216\u6A21\u578B ID\" value={search} onChange={e => setSearch(e.target.value)} /></label>\n <p className=\"notice\">\u5C55\u793A\u5F00\u5173\u51B3\u5B9A\u539F\u59CB\u6A21\u578B\u662F\u5426\u51FA\u73B0\u5728 DSH \u9009\u62E9\u5668\uFF1B\u8DEF\u7531\u5C55\u793A\u5728\u300C\u8DEF\u7531\u89C4\u5219\u300D\u4E2D\u72EC\u7ACB\u8BBE\u7F6E\u3002</p><section className=\"box\">\n {!p?.models.length && <p className=\"empty\">\u5148\u6DFB\u52A0\u5E76\u542F\u7528\u8D26\u53F7\uFF0C\u518D\u83B7\u53D6\u6A21\u578B\u76EE\u5F55\u3002</p>}\n {p?.models.filter(m => `${m.id} ${m.name}`.toLowerCase().includes(search.toLowerCase())).map(m => <form key={`${provider}:${m.id}`} className=\"item grid\" onSubmit={e => { e.preventDefault(); void act({ action: 'model.update', provider, id: m.id, name: new FormData(e.currentTarget).get('name') }); }}>\n <label>\u6A21\u578B\u540D\u79F0<input key={m.name} name=\"name\" defaultValue={m.name} required maxLength={200} disabled={busy} /><span className=\"mono muted\">{m.id}</span></label><div className=\"bar\"><label className=\"check\"><input type=\"checkbox\" disabled={busy} checked={m.visible} onChange={e => { void act({ action: 'model.update', provider, id: m.id, visible: e.target.checked }); }} />\u5C55\u793A</label><button disabled={busy} type=\"submit\">\u4FDD\u5B58\u540D\u79F0</button><span className=\"notice\">\u4E0A\u4E0B\u6587 {fmt(m.contextWindow / 1000)}K</span></div>\n </form>)}</section></div>}\n {tab === 'routes' && <div className=\"stack\"><div className=\"bar\"><p className=\"muted\">\u4E00\u4E2A\u8C03\u7528\u540D\u79F0\uFF0C\u8FDE\u63A5\u591A\u4E2A\u8D26\u53F7\u4E0E\u6A21\u578B\u3002</p><div className=\"row\"><button disabled={busy} onClick={() => { setError(''); setNotice(''); setPresetModal(true); }}>\u6DFB\u52A0\u6A21\u578B\u9884\u914D\u7F6E</button><button className=\"primary\" disabled={busy} onClick={() => { setError(''); setNotice(''); setDraft({ id: '', name: '', revision: data.revision, contextWindow: 200000, maxTokens: 32000, strategy: 'failover', preferExpiringCredits: true, expiringWithinDays: 7, visible: true, targets: [newTarget()] }); }}>\u65B0\u5EFA\u8DEF\u7531</button></div></div>\n {data.routes.length === 0 && <div className=\"box empty\">\u5148\u6DFB\u52A0\u4E09\u5BB6\u5171\u6709\u6A21\u578B\u9884\u914D\u7F6E\uFF0C\u6216\u521B\u5EFA\u4F60\u81EA\u5DF1\u7684\u8DEF\u7531\u3002</div>}\n {data.routes.map(r => <section className=\"box stack route-card\" key={r.id}><div className=\"bar\"><div><h3>{r.name}</h3></div><div className=\"row\"><span className=\"badge\">{r.freeOnly ? '\u4EC5\u514D\u8D39 \u00B7 \u81EA\u52A8\u53D1\u73B0' : strategies[r.strategy || 'failover']}{r.preferExpiringCredits ? ' \u00B7 \u4E34\u671F\u4F18\u5148' : ''}</span><button disabled={busy} onClick={() => editRoute(r)}>\u7F16\u8F91\u8DEF\u7531</button></div></div>\n <div className=\"route-path\">{r.targets.map((t, i) => <span key={i}>{data.providers.find(p => p.id === t.provider)?.name} \u00B7 {t.account ? data.accounts.find(a => a.id === t.account)?.name : '\u5168\u90E8\u542F\u7528\u8D26\u53F7'}{r.strategy === 'weighted' ? ` \u00B7 \u6743\u91CD ${t.weight || 1}` : r.strategy === 'tokens' ? ` \u00B7 ${fmt(t.tokenBudget)} Token` : r.strategy === 'credits' ? ` \u00B7 ${fmt(t.creditBudget)} \u79EF\u5206` : ''}</span>)}</div>\n <div className=\"bar\"><p className=\"notice\">{r.targets.length} \u4E2A\u76EE\u6807 \u00B7 {data.telemetry?.rounds[r.id] ? `\u7B2C ${data.telemetry.rounds[r.id].number} \u8F6E \u00B7 ` : ''}4xx \u81EA\u52A8\u5207\u6362</p><label className=\"check\"><input type=\"checkbox\" disabled={busy} checked={r.visible !== false} onChange={e => { const { id, reasoning, supportsImages, expiringStatus, freeStatus, ...route } = r; void act({ action: 'route.save', id, previousId: id, route: { ...route, visible: e.target.checked } }); }} />{r.freeOnly ? '\u5C55\u793A\u52FE\u9009\u7684\u514D\u8D39\u6A21\u578B' : '\u5728\u6A21\u578B\u9009\u62E9\u5668\u5C55\u793A'}</label></div>\n {r.freeOnly && <FreeStatus route={r} busy={busy} act={act} />}\n {!r.freeOnly && <details><summary>\u63A8\u7406\u6A21\u5F0F\u4E0E\u517C\u5BB9\u6027</summary><p className=\"notice\">\u63A8\u7406\u6A21\u5F0F\uFF1A\u5E73\u53F0\u9ED8\u8BA4{r.reasoning?.supportedEfforts?.length ? `\u3001${r.reasoning.supportedEfforts.map(e => effortNames[e] || e).join('\u3001')}` : '\uFF08\u5E73\u53F0\u672A\u58F0\u660E\u53EF\u8C03\u6863\u4F4D\uFF09'}\u3002\u9009\u62E9\u6863\u4F4D\u540E\uFF0C\u53EA\u5728\u652F\u6301\u8BE5\u6863\u4F4D\u7684\u76EE\u6807\u95F4\u5207\u6362\u3002</p></details>}\n {r.preferExpiringCredits && <ExpiryStatus route={r} act={act} busy={busy} revision={data.revision} />}\n </section>)}\n <details><summary>\u5168\u5C40\u5207\u6362\u8BBE\u7F6E</summary><form className=\"box stack\" style={{ marginTop: 16 }} onSubmit={e => { e.preventDefault(); const f = new FormData(e.currentTarget); void act({ action: 'options.save', cooldownMs: Number(f.get('cooldown')) * 1000, requestTimeoutMs: Number(f.get('timeout')) * 1000, retryServerErrors: f.has('server') }); }}><div className=\"grid\"><label>\u5931\u8D25\u8D26\u53F7\u51B7\u5374\uFF08\u79D2\uFF09<input disabled={busy} name=\"cooldown\" type=\"number\" min=\"1\" required defaultValue={data.options.cooldownMs / 1000} /></label><label>\u8BF7\u6C42\u8D85\u65F6\uFF08\u79D2\uFF09<input disabled={busy} name=\"timeout\" type=\"number\" min=\"1\" required defaultValue={data.options.requestTimeoutMs / 1000} /></label></div><label className=\"check\"><input disabled={busy} name=\"server\" type=\"checkbox\" defaultChecked={data.options.retryServerErrors} />5xx \u548C\u7F51\u7EDC\u9519\u8BEF\u4E5F\u5207\u6362\u8D26\u53F7</label><div><button disabled={busy} type=\"submit\">\u4FDD\u5B58\u8BBE\u7F6E</button></div></form></details>\n </div>}\n {tab === 'migration' && <MigrationForm data={data} act={act} busy={busy} />}\n </fieldset>}\n {draft && <Modal title={draft.previousId ? '\u7F16\u8F91\u8DEF\u7531' : '\u65B0\u5EFA\u8DEF\u7531'} busy={busy} close={() => setDraft(null)}><RouteForm draft={draft} setDraft={setDraft} data={data} act={act} busy={busy} error={error} notice={notice} /></Modal>}\n {presetModal && <Modal title=\"\u6A21\u578B\u8DEF\u7531\u9884\u914D\u7F6E\" busy={busy} close={() => setPresetModal(false)}><div className=\"modal-body stack\"><Feedback error={error} notice={notice} /><p className=\"steps\">Free \u81EA\u52A8\u53D1\u73B0\u5404\u8D26\u53F7\u7684\u514D\u8D39\u6A21\u578B\uFF1B\u5176\u4ED6\u9884\u914D\u7F6E\u7ED1\u5B9A\u4E09\u5BB6\u5171\u6709\u6A21\u578B\u3002\u5DF2\u6709\u8DEF\u7531\u4E0D\u4F1A\u88AB\u8986\u76D6\u3002</p><div className=\"grid\">{(data.presets || []).map(preset => <section key={preset.id} className=\"box stack\"><div><h3>{preset.name}</h3></div><p className=\"notice\">{preset.freeOnly ? '\u6BCF\u5929\u81EA\u52A8\u68C0\u67E5\u514D\u8D39\u6A21\u578B\uFF0C\u8C03\u7528\u524D\u590D\u6838\u96F6\u500D\u7387\uFF1B\u4EC5\u5728\u514D\u8D39\u6A21\u578B\u95F4\u5207\u6362\u3002' : `\u5DF2\u53D1\u73B0\u53EF\u7528\u6E20\u9053\uFF1A${preset.availableProviders.length} / 3${preset.availableProviders.length < 3 ? ' \u00B7 \u53EF\u6DFB\u52A0\u8D26\u53F7\u6216\u5237\u65B0\u6A21\u578B\u76EE\u5F55\u540E\u4F7F\u7528' : ''}`}</p><button disabled={busy || preset.added} onClick={() => { void act({ action: 'preset.add', id: preset.id }); }}>{preset.added ? '\u5DF2\u6DFB\u52A0' : '\u6DFB\u52A0\u6B64\u8DEF\u7531'}</button></section>)}</div></div><div className=\"modal-foot bar\"><p className=\"notice\">\u65B0\u589E\u8DEF\u7531\u53EF\u7EE7\u7EED\u7F16\u8F91\u540D\u79F0\u3001\u8D26\u53F7\u548C\u5207\u6362\u89C4\u5219\u3002</p><button className=\"primary\" disabled={busy || !(data.presets || []).some(p => !p.added)} onClick={() => { void act({ action: 'preset.add-all' }); }}>\u8865\u9F50\u5168\u90E8\u9884\u914D\u7F6E</button></div></Modal>}\n {accountModal && <Modal title={accountModal.mode === 'edit' ? '\u8D26\u53F7\u767B\u5F55\u8BE6\u60C5' : accountModal.mode === 'credentials' ? '\u8865\u5145 / \u66F4\u65B0\u8D26\u53F7\u51ED\u8BC1' : '\u6DFB\u52A0\u8D26\u53F7\u4E0E\u83B7\u53D6\u767B\u5F55'} busy={busy} close={() => setAccountModal(null)}><AccountForm modal={accountModal} provider={accountProvider || 'workbuddy'} data={data} busy={busy} act={act} replace={() => openAccount('credentials', accountModal.account)} close={selected => { if (typeof selected === 'string' && accountProvider) setAccountProvider(selected); setAccountModal(null); }} error={error} notice={notice} /></Modal>}\n </div>;\n}\nconst displayName = a => (a?.name || a?.id || '\u672A\u77E5\u8D26\u53F7').replace(/(?<!\\d)(\\+?\\d{2,3})\\d{3,8}(\\d{4})(?!\\d)/g, '$1****$2');\nconst resultLabels = { claimed: '\u7B7E\u5230\u6210\u529F', 'already-claimed': '\u5DF2\u9886\u53D6', 'no-campaign': '\u65E0\u6D3B\u52A8', retryable: '\u67E5\u8BE2\u5931\u8D25', 'before-window': '\u7A97\u53E3\u672A\u5F00', 'auth-invalid': '\u4EE4\u724C\u5931\u6548', paused: '\u5E73\u53F0\u6682\u505C', uncertain: '\u5F85\u6838\u5BF9', 'device-used': '\u8BBE\u5907\u5DF2\u53C2\u4E0E' };\nfunction Balance({ account }) {\n const b = account.usage?.balance, now = Date.now();\n const expiring = b?.unit === 'credits' && !b.error ? (b.packages || []).filter(p => Number.isFinite(p.remaining) && p.remaining > 0 && p.expiresAt > now && p.expiresAt <= now + 3 * 86400000).reduce((n, p) => n + p.remaining, 0) : 0;\n return <><div className=\"amount\">{b?.unlimited ? '\u4E0D\u9650\u91CF' : fmt(b?.remaining)}{b?.unit === 'credits' && <small className=\"muted\" style={{ display: 'inline', marginLeft: 5 }}>\u79EF\u5206</small>}</div>\n <small className={b?.error ? 'error' : expiring ? 'warn' : 'muted'}>{b?.error ? '\u67E5\u8BE2\u5931\u8D25 \u00B7 \u4FDD\u7559\u4E0A\u6B21\u4F59\u989D' : expiring ? `${fmt(expiring)} \u79EF\u5206 3 \u5929\u5185\u5230\u671F` : b?.fetchedAt ? `\u66F4\u65B0\u4E8E ${when(b.fetchedAt)}` : '\u7B49\u5F85\u5237\u65B0\u5E73\u53F0\u7528\u91CF'}</small></>;\n}\nfunction CheckinResult({ row, compact = false }) {\n const last = row?.last, today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' });\n const current = last?.day === today;\n return <><span className={current && ['claimed', 'already-claimed'].includes(last.status) ? 'good' : last && ['auth-invalid', 'paused', 'uncertain', 'retryable'].includes(last.status) ? 'warn' : 'muted'}>{!row?.supported ? '\u6682\u4E0D\u652F\u6301' : current || last?.status === 'auth-invalid' ? resultLabels[last.status] || '\u5DF2\u5904\u7406' : '\u4ECA\u65E5\u672A\u7B7E\u5230'}</span>\n {(!compact || current && last.amount !== undefined) && <small className=\"muted\">{current && last.amount !== undefined ? `\u672C\u6B21 ${fmt(last.amount)} \u79EF\u5206` : row?.auto ? '\u81EA\u52A8\u7B7E\u5230\u5DF2\u5F00\u542F' : '\u81EA\u52A8\u7B7E\u5230\u672A\u5F00\u542F'}</small>}</>;\n}\nexport function AccountPool({ data, provider, providerSelect, busy, act, manage, add }) {\n const [search, setSearch] = useState('');\n const accounts = data.accounts.filter(a => !provider || a.provider === provider), chosen = accounts.filter(a => a.enabled !== false).length;\n const visible = accounts.filter(a => `${a.name} ${a.id}`.toLowerCase().includes(search.toLowerCase()));\n const rows = data.checkins?.accounts || [], eligible = rows.filter(r => accounts.some(a => a.id === r.id && a.enabled !== false) && r.ready);\n const setAll = enabled => { void act({ action: 'accounts.enabled', ...(provider ? { provider } : {}), enabled }); };\n return <div className=\"stack\"><div className=\"bar\"><div><h3 className=\"section-title\">\u8D26\u53F7\u6C60</h3><p className=\"muted\">{accounts.length} \u4E2A\u8D26\u53F7 \u00B7 {chosen} \u4E2A\u53C2\u4E0E\u8DEF\u7531</p></div><button className=\"primary\" disabled={busy} onClick={add}>\u6DFB\u52A0\u8D26\u53F7</button></div>\n <div className=\"bar toolbar\"><div className=\"row\">{providerSelect}<label className=\"search\">\u641C\u7D22\u8D26\u53F7<input type=\"search\" value={search} placeholder=\"\u540D\u79F0\u6216\u8D26\u53F7 ID\" onChange={e => setSearch(e.target.value)} /></label></div><div className=\"row\">{!provider?.startsWith('qoder') && <button disabled={busy} onClick={() => { void act({ action: 'accounts.discover', ...(provider ? { provider } : {}) }); }}>\u83B7\u53D6\u672C\u673A\u767B\u5F55</button>}<button disabled={busy} onClick={() => { void act({ action: 'monitor.refresh', ...(provider ? { provider } : {}) }); }}>\u5237\u65B0\u72B6\u6001\u4E0E\u7528\u91CF</button></div></div>\n <div className=\"bar\"><p className=\"hint\">\u52FE\u9009\u7684\u8D26\u53F7\u53C2\u4E0E\u8DEF\u7531\uFF1B\u81EA\u52A8\u7B7E\u5230\u5728\u300C\u79EF\u5206\u7B7E\u5230\u300D\u4E2D\u5355\u72EC\u8BBE\u7F6E\u3002</p><div className=\"row\"><span className=\"notice\">\u5DF2\u9009 {chosen} / {accounts.length}</span><button disabled={busy || !accounts.length || chosen === accounts.length} onClick={() => setAll(true)}>\u5168\u9009</button><button disabled={busy || !chosen} onClick={() => setAll(false)}>\u5168\u4E0D\u9009</button><button disabled={busy || data.checkins?.running || data.checkins?.error || !eligible.length} onClick={() => { void act({ action: 'checkins.run', ids: eligible.map(r => r.id) }); }}>\u7B7E\u5230\u53EF\u7528\u8D26\u53F7\uFF08{eligible.length}\uFF09</button></div></div>\n <section className=\"box table-shell\"><div className=\"scroll\" role=\"region\" aria-label=\"\u8D26\u53F7\u6C60\u5217\u8868\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u8D26\u53F7 / \u8DEF\u7531\u53C2\u4E0E</th><th scope=\"col\">\u5E73\u53F0\u79EF\u5206</th><th scope=\"col\">\u6A21\u578B\u4E0E\u8C03\u7528</th><th scope=\"col\">\u4ECA\u65E5\u7B7E\u5230</th><th scope=\"col\" className=\"cell-actions\">\u7BA1\u7406</th></tr></thead><tbody>{visible.map(a => { const cooldown = a.status?.cooldowns || [], active = a.status?.activeFor?.length, enabled = a.enabled !== false;\n return <tr key={a.id} className={enabled ? 'selected' : ''}><td><div className=\"account-cell\"><label className=\"check account-check\"><input aria-label={`${displayName(a)} \u53C2\u4E0E\u8DEF\u7531`} type=\"checkbox\" disabled={busy} checked={enabled} onChange={e => { void act({ action: 'account.update', id: a.id, enabled: e.target.checked }); }} /></label><div className=\"account-name\"><strong>{displayName(a)}</strong>{!provider && <small className=\"muted\">{data.providers?.find(p => p.id === a.provider)?.name || a.provider}</small>}<small><span className=\"status\"><i className={!enabled ? '' : cooldown.length ? 'warn' : 'good'} aria-hidden=\"true\" />{!enabled ? '\u672A\u5165\u6C60' : active ? '\u6B63\u5728\u8C03\u7528' : cooldown.length ? '\u90E8\u5206\u8DEF\u7531\u51B7\u5374\u4E2D' : '\u5DF2\u5728\u6C60\u4E2D'}</span></small><small className=\"muted\">{loginNames[a.login?.state] || '\u5C1A\u672A\u67E5\u8BE2\u767B\u5F55'}</small></div></div></td>\n <td><Balance account={a} /></td><td><span>{fmt(a.modelCount || 0)} \u4E2A\u76EE\u5F55\u6A21\u578B</span><small className=\"muted\">{fmt(a.usage?.requests || 0)} \u6B21\u8C03\u7528 \u00B7 {fmt(a.usage?.tokens || 0)} Token</small>{cooldown.length > 0 && <small className=\"warn\">\u6700\u957F\u7EA6 {Math.ceil(Math.max(...cooldown.map(c => c.remainingMs)) / 60000)} \u5206\u949F\u540E\u6062\u590D</small>}</td><td><CheckinResult row={rows.find(r => r.id === a.id)} /></td><td className=\"cell-actions\"><button disabled={busy} onClick={() => manage(a)}>\u7BA1\u7406\u8D26\u53F7</button></td></tr>;\n })}</tbody></table>{!visible.length && <p className=\"empty\">{accounts.length ? '\u6CA1\u6709\u5339\u914D\u7684\u8D26\u53F7\uFF0C\u8BF7\u8C03\u6574\u641C\u7D22\u3002' : '\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF0C\u70B9\u51FB\u300C\u6DFB\u52A0\u8D26\u53F7\u300D\u83B7\u53D6\u767B\u5F55\u6216\u586B\u5199\u51ED\u8BC1\u3002'}</p>}</div></section>\n <details className=\"help\"><summary>\u672C\u673A\u8D26\u53F7\u83B7\u53D6\u4E0E\u51ED\u8BC1\u8BF4\u660E</summary><div className=\"stack\"><p className=\"notice\">WorkBuddy \u4E0E Trae \u542F\u52A8\u65F6\u81EA\u52A8\u8BFB\u53D6\u672C\u673A\u5DF2\u767B\u5F55\u8D26\u53F7\uFF0C\u6BCF\u5206\u949F\u91CD\u65B0\u68C0\u6D4B\uFF1BTrae \u81EA\u52A8\u8BC6\u522B CN\u3001Global \u4E0E SOLO\u3002\u4E5F\u53EF\u6DFB\u52A0\u624B\u52A8\u51ED\u8BC1\u6216\u5BFC\u5165\u5176\u5B83\u8BBE\u5907\u8D26\u53F7\uFF0C\u5404\u8D26\u53F7\u72EC\u7ACB\u4FDD\u5B58\u3002Qoder \u9700\u6DFB\u52A0 PAT\u3002</p>{data.localDiscovery?.filter(s => !provider || s.provider === provider).map(s => <p className=\"notice\" key={s.provider}>{data.providers?.find(p => p.id === s.provider)?.name || s.provider} \u00B7 {s.state === 'found' ? '\u5DF2\u53D1\u73B0\u672C\u673A\u5BA2\u6237\u7AEF\u767B\u5F55\u3002' : s.state === 'unreadable' ? '\u65E0\u6CD5\u8BFB\u53D6\u672C\u673A\u767B\u5F55\u6587\u4EF6\uFF0C\u8BF7\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u91CD\u65B0\u767B\u5F55\uFF0C\u6216\u624B\u52A8\u586B\u5199\u51ED\u8BC1\u3002' : '\u672A\u627E\u5230\u672C\u673A\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55\u5BF9\u5E94\u533A\u57DF\u7684\u5B98\u65B9\u5BA2\u6237\u7AEF\u3002'} \u00B7 {when(s.checkedAt)}</p>)}</div></details>\n </div>;\n}\nexport function CheckinPanel({ data, busy, act }) {\n const info = data.checkins || {}, rows = info.accounts || [], today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' });\n const saved = info.settings ?? { mode: 'scheduled', time: '10:05' };\n const [schedule, setSchedule] = useState(saved);\n useEffect(() => { setSchedule(saved); }, [saved.mode, saved.time]);\n const changed = schedule.mode !== saved.mode || schedule.time !== saved.time;\n const blocked = busy || info.running || !!info.error;\n const eligible = rows.filter(r => r.supported && !r.paused && data.accounts.find(a => a.id === r.id)?.enabled && r.ready === true);\n const ready = r => eligible.includes(r);\n return <div className=\"stack\"><section className=\"box stack\"><div className=\"bar\"><div><h3>\u6BCF\u65E5\u79EF\u5206\u7B7E\u5230</h3><p className=\"notice\">{info.schedule}</p><p className=\"notice\">\u81EA\u52A8\u7B7E\u5230\u9ED8\u8BA4\u5173\u95ED\uFF0C\u8BF7\u5728\u4E0B\u65B9\u9010\u4E2A\u5F00\u542F\u3002</p></div><button className=\"primary\" disabled={blocked || !eligible.length} onClick={() => { void act({ action: 'checkins.run', ids: eligible.map(r => r.id) }); }}>\u7B7E\u5230\u5168\u90E8\u53EF\u7528\u8D26\u53F7\uFF08{eligible.length}\uFF09</button></div>\n <form className=\"row plan-form\" onSubmit={e => { e.preventDefault(); void act({ action: 'checkins.settings', schedule }); }}><label className=\"filter\">\u81EA\u52A8\u7B7E\u5230\u65B9\u5F0F<select aria-label=\"\u81EA\u52A8\u7B7E\u5230\u65B9\u5F0F\" value={schedule.mode} disabled={blocked} onChange={e => setSchedule({ ...schedule, mode: e.target.value })}><option value=\"startup\">\u6BCF\u65E5\u542F\u52A8\u65F6\u7B7E\u5230</option><option value=\"scheduled\">\u6BCF\u5929\u5B9A\u65F6\u7B7E\u5230</option></select></label>{schedule.mode === 'scheduled' && <label className=\"filter\">\u7B7E\u5230\u65F6\u95F4\uFF08\u5317\u4EAC\u65F6\u95F4\uFF09<input aria-label=\"\u7B7E\u5230\u65F6\u95F4\uFF08\u5317\u4EAC\u65F6\u95F4\uFF09\" type=\"time\" required value={schedule.time} disabled={blocked} onChange={e => setSchedule({ ...schedule, time: e.target.value })} /></label>}<button disabled={blocked || !changed}>\u4FDD\u5B58\u7B7E\u5230\u8BA1\u5212</button></form>\n <details className=\"help\"><summary>\u6267\u884C\u89C4\u5219\u3001\u8865\u67E5\u4E0E\u8BBE\u5907\u9650\u5236</summary><div className=\"stack\"> <p className=\"notice\">\u81EA\u52A8\u7B7E\u5230\u9ED8\u8BA4\u5173\u95ED\uFF0C\u6309\u8D26\u53F7\u5F00\u542F\u3002\u5148\u67E5\u9886\u53D6\u72B6\u6001\u3001\u4E32\u884C\u63D0\u4EA4\uFF0C\u8D26\u53F7\u95F4\u9694\u81F3\u5C11 10 \u79D2\uFF1B\u6BCF\u4E2A\u8D26\u53F7\u6BCF\u5929\u6700\u591A\u63D0\u4EA4\u4E00\u6B21\u9886\u53D6\u3002\u786E\u8BA4\u5C1A\u672A\u63D0\u4EA4\u7684\u67E5\u8BE2\u5931\u8D25\uFF0C20:05 \u540E\u6700\u591A\u8865\u67E5\u4E00\u6B21\uFF1B\u5DF2\u9886\u53D6\u3001\u65E0\u6D3B\u52A8\u548C\u7ED3\u679C\u4E0D\u660E\u7684\u8D26\u53F7\u8DF3\u8FC7\u3002\u9047\u5230\u9A8C\u8BC1\u3001\u9650\u6D41\u6216\u8BBE\u5907\u9650\u5236\u5C31\u505C\u6B62\uFF0C\u4E0D\u4F1A\u4FEE\u6539\u8BBE\u5907\u8EAB\u4EFD\u6216\u5207\u6362\u8D26\u53F7\u91CD\u8BD5\u3002</p>\n <p className=\"notice\">\u542F\u52A8\u6A21\u5F0F\u5728\u5F53\u5929\u9996\u6B21\u8FD0\u884C\u65F6\u6267\u884C\uFF0C\u6301\u7EED\u8FD0\u884C\u5219\u65B0\u4E00\u5929\u81EA\u52A8\u6267\u884C\uFF1B\u5B9A\u65F6\u6A21\u5F0F\u5728\u8BBE\u5B9A\u65F6\u95F4\u540E\u6267\u884C\uFF0C\u9519\u8FC7\u65F6\u4E0B\u6B21\u542F\u52A8\u8865\u67E5\u3002Qoder \u6700\u65E9\u5317\u4EAC\u65F6\u95F4 10:05 \u67E5\u8BE2\u5F53\u65E5\u6D3B\u52A8\u3002DSH \u5173\u95ED\u671F\u95F4\u4E0D\u6267\u884C\uFF0C\u8FD0\u884C\u65F6\u7EA6\u4E00\u5206\u949F\u5185\u89E6\u53D1\u3002\u4FEE\u6539\u8BA1\u5212\u3001\u5237\u65B0\u9762\u677F\u6216\u91CD\u542F\u4E0D\u4F1A\u6E05\u9664\u5DF2\u5904\u7406\u8BB0\u5F55\uFF1B\u4EE4\u724C\u5931\u6548\u540E\u8BF7\u66F4\u65B0\u51ED\u8BC1\u518D\u6062\u590D\u3002</p>\n</div></details>\n {info.error && <p role=\"alert\" className=\"error\">{info.error}</p>}\n <p role=\"status\">{info.running ? `\u6B63\u5728\u5904\u7406 ${displayName(data.accounts.find(a => a.id === info.current)) || '\u7B7E\u5230\u961F\u5217'}\u2026` : '\u7B7E\u5230\u7ED3\u679C\u548C\u9886\u53D6\u79EF\u5206\u4EE5\u4E0B\u65B9\u5E73\u53F0\u54CD\u5E94\u4E3A\u51C6\u3002'}</p>\n {info.report && <p className=\"notice\">\u6700\u8FD1\u4E00\u8F6E \u00B7 {when(info.report.at)} \u00B7 {Object.entries(info.report.counts || {}).map(([key, n]) => `${resultLabels[key] || '\u672A\u5B8C\u6210'} ${n}`).join(' \u00B7 ')}\u3002\u6CA1\u6709\u5F85\u8865\u67E5\u8D26\u53F7\u65F6\u4E0D\u91CD\u590D\u6C47\u62A5\u3002</p>}\n </section>\n {data.providers.map(p => {\n const accounts = data.accounts.filter(a => a.provider === p.id);\n if (!accounts.length) return null;\n const supported = rows.some(r => r.id === accounts[0].id && r.supported), paused = rows.some(r => accounts.some(a => a.id === r.id) && r.paused);\n return <section className=\"box stack\" key={p.id}><div className=\"bar\"><h3>{p.name}</h3><span className=\"badge\">{supported ? paused ? '\u5DF2\u6682\u505C' : '\u652F\u6301\u7B7E\u5230' : '\u5B98\u65B9\u5BA2\u6237\u7AEF\u9886\u53D6'}</span></div>\n {!supported ? <p className=\"notice\">{p.id.startsWith('workbuddy') ? 'WorkBuddy AI \u6682\u672A\u63A5\u5165\u53EF\u6838\u9A8C\u7684\u7B7E\u5230\u63A5\u53E3\uFF0C\u8BF7\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u67E5\u770B\u6D3B\u52A8\u4E0E\u9886\u53D6\u5165\u53E3\u3002' : 'Trae Global \u6682\u65E0\u5DF2\u6838\u9A8C\u7684\u79EF\u5206\u7B7E\u5230\u63A5\u53E3\uFF0C\u8BF7\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u67E5\u770B\u6743\u76CA\u3002'}</p> : <>\n {paused && <div className=\"steps\"><p>\u5E73\u53F0\u9650\u5236\u6216\u9700\u8981\u9A8C\u8BC1\uFF0C\u5DF2\u6682\u505C\u8BE5\u5E73\u53F0\u7B7E\u5230\u3002\u8BF7\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u5904\u7406\u540E\u518D\u6062\u590D\uFF1B\u6062\u590D\u4ECD\u4FDD\u7559\u4ECA\u65E5\u5C1D\u8BD5\u8BB0\u5F55\u548C\u8BBE\u5907\u9650\u5236\u3002</p><button disabled={blocked} onClick={() => { void act({ action: 'checkins.resume', provider: p.id }); }}>\u6211\u5DF2\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u6062\u590D\u540E\u7EED\u7B7E\u5230</button></div>}\n <div className=\"scroll\" role=\"region\" aria-label={`${p.name} \u7B7E\u5230\u8BB0\u5F55`} tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u8D26\u53F7</th><th scope=\"col\">\u81EA\u52A8\u7B7E\u5230</th><th scope=\"col\">\u4ECA\u65E5\u7ED3\u679C</th><th scope=\"col\">\u6700\u8FD1\u8BB0\u5F55</th><th scope=\"col\" className=\"cell-actions\">\u64CD\u4F5C</th></tr></thead><tbody>{accounts.map(a => { const r = rows.find(r => r.id === a.id) || {}, last = r.last?.day === today ? r.last : undefined; return <tr key={a.id} className={info.current === a.id ? 'selected' : ''}><td><strong>{displayName(a)}</strong><small className=\"muted\">{a.enabled === false ? '\u8D26\u53F7\u5DF2\u505C\u7528' : '\u5DF2\u5728\u8D26\u53F7\u6C60\u4E2D'}</small></td><td><label className=\"check\"><input aria-label={`${displayName(a)} \u6BCF\u65E5\u81EA\u52A8\u7B7E\u5230`} type=\"checkbox\" disabled={blocked} checked={r.auto === true} onChange={e => { void act({ action: 'account.update', id: a.id, autoCheckin: e.target.checked }); }} />\u6BCF\u65E5\u81EA\u52A8\u7B7E\u5230</label></td><td><CheckinResult row={r} compact /></td><td><small className=\"muted\">{r.last ? when(r.last.at) : '\u5C1A\u65E0\u8BB0\u5F55'}</small><small className=\"muted\">{r.last?.message || '\u7B49\u5F85\u9996\u6B21\u7B7E\u5230'}</small>{last?.retryAt && <small className=\"warn\">\u8865\u67E5\u65F6\u95F4 {when(last.retryAt)}</small>}{r.last?.activity && <details><summary>\u6D3B\u52A8\u8BE6\u60C5</summary><small className=\"muted\">{[r.last.activity.streakDays !== undefined && `\u8FDE\u7B7E ${fmt(r.last.activity.streakDays)} \u5929`, r.last.activity.totalCredits !== undefined && `\u6D3B\u52A8\u7D2F\u8BA1 ${fmt(r.last.activity.totalCredits)} \u79EF\u5206`, r.last.activity.nextStreakDay !== undefined && `\u4E0B\u4E00\u8FDE\u7B7E\u6863\u4F4D ${fmt(r.last.activity.nextStreakDay)} \u5929`, r.last.activity.endsAt !== undefined && `\u6D3B\u52A8\u622A\u6B62 ${when(r.last.activity.endsAt)}`].filter(Boolean).join(' \u00B7 ')}</small></details>}</td><td className=\"cell-actions\">{p.id === 'workbuddy' && r.last?.status === 'auth-invalid' ? <button disabled={blocked} onClick={() => { void act({ action: 'checkins.verify', id: a.id }); }}>\u91CD\u65B0\u9A8C\u8BC1\u767B\u5F55</button> : <button disabled={blocked || !ready(r)} onClick={() => { void act({ action: 'checkins.run', ids: [a.id] }); }}>{r.last?.status === 'auth-invalid' ? '\u8BF7\u66F4\u65B0\u51ED\u8BC1' : last?.retryReady ? '\u8865\u67E5\u7B7E\u5230' : last?.retryAt ? '\u7B49\u5F85\u665A\u95F4\u8865\u67E5' : last ? '\u4ECA\u65E5\u5DF2\u5904\u7406' : '\u7ACB\u5373\u7B7E\u5230'}</button>}</td></tr>; })}</tbody></table></div>\n </>}\n </section>;\n })}\n {!data.accounts.length && <p className=\"box empty\">\u5148\u5230\u300C\u8D26\u53F7\u4E0E\u767B\u5F55\u300D\u6DFB\u52A0\u8D26\u53F7\uFF0C\u518D\u5F00\u542F\u6BCF\u65E5\u81EA\u52A8\u7B7E\u5230\u3002</p>}\n <p className=\"notice\">\u591A\u53F0\u8BBE\u5907\u7684\u672C\u5730\u8BB0\u5F55\u4E0D\u4F1A\u4E92\u76F8\u540C\u6B65\uFF0C\u6BCF\u6B21\u90FD\u4F1A\u67E5\u8BE2\u5E73\u53F0\u9886\u53D6\u72B6\u6001\uFF1B\u5EFA\u8BAE\u4EC5\u5728\u4E00\u53F0\u5E38\u7528\u8BBE\u5907\u5F00\u542F\u81EA\u52A8\u7B7E\u5230\u3002\u540C\u4E00 Trae \u8BBE\u5907\u6BCF\u5929\u6700\u591A\u5904\u7406\u4E00\u4E2A\u9886\u53D6\u8BF7\u6C42\uFF0C\u91CD\u590D\u8D26\u53F7\u526F\u672C\u4F1A\u53BB\u91CD\uFF1B\u4E0D\u4FDD\u8BC1\u5E73\u53F0\u4E00\u5B9A\u53D1\u653E\u5956\u52B1\u3002</p>\n </div>;\n}\nfunction Overview({ data, live, setLive, busy, act, go }) {\n const t = data.telemetry || {}, today = t.days?.[t.today] || {}, totals = data.accounts.reduce((s, a) => ({ requests: s.requests + (a.usage?.requests || 0), tokens: s.tokens + (a.usage?.tokens || 0) }), { requests: 0, tokens: 0 });\n const dates = Array.from({ length: 7 }, (_, i) => { const d = new Date(); d.setDate(d.getDate() - 6 + i); const key = d.toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' }); return { key, tokens: t.days?.[key]?.tokens || 0 }; });\n const max = Math.max(1, ...dates.map(d => d.tokens));\n return <div className=\"stack\"><div className=\"metrics\">{metric('\u4ECA\u65E5 Token', fmt(today.tokens || 0), '\u8F93\u5165 + \u8F93\u51FA \u00B7 \u5317\u4EAC\u65F6\u95F4')}{metric('\u4ECA\u65E5\u8BF7\u6C42', fmt(today.requests || 0), `\u5931\u8D25 ${fmt(today.failures || 0)} \u6B21`)}{metric('\u8D26\u53F7\u6C60', `${data.accounts.filter(a => a.enabled).length} / ${data.accounts.length}`, '\u542F\u7528 / \u5168\u90E8\u8D26\u53F7')}{metric('\u7D2F\u8BA1 Token', fmt(totals.tokens), `${fmt(totals.requests)} \u6B21\u8BF7\u6C42`)}</div>\n <PerformanceMetrics events={(t.events || []).filter(e => e.at >= usageDateBounds('1')[0])} />\n <div className=\"bar\"><h3>\u5E73\u53F0\u989D\u5EA6</h3><div className=\"row\"><label className=\"check\"><input type=\"checkbox\" checked={live} onChange={e => setLive(e.target.checked)} />15 \u79D2\u5237\u65B0\u9762\u677F</label><button disabled={busy} onClick={() => { void act({ action: 'monitor.refresh' }); }}>\u5237\u65B0\u5E73\u53F0\u7528\u91CF</button></div></div>\n <section className=\"box table-shell\"><div className=\"scroll\" role=\"region\" aria-label=\"\u5404\u5E73\u53F0\u8D26\u53F7\u989D\u5EA6\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u8D26\u53F7</th><th scope=\"col\">\u4F9B\u5E94\u5546 / \u533A\u57DF</th><th scope=\"col\">\u5E73\u53F0\u79EF\u5206</th><th scope=\"col\">\u4ECA\u65E5\u7B7E\u5230</th><th scope=\"col\" className=\"cell-actions\">\u8DEF\u7531\u72B6\u6001</th></tr></thead><tbody>{data.accounts.map(a => <tr key={a.id}><td><strong>{displayName(a)}</strong><small className=\"muted\">{loginNames[a.login?.state] || '\u5C1A\u672A\u67E5\u8BE2\u767B\u5F55'}</small></td><td>{data.providers.find(p => p.id === a.provider)?.name || a.provider}</td><td><Balance account={a} /></td><td><CheckinResult row={data.checkins?.accounts.find(r => r.id === a.id)} /></td><td className=\"cell-actions\"><span className=\"status\"><i className={a.enabled === false ? '' : a.status?.cooldowns?.length ? 'warn' : 'good'} aria-hidden=\"true\" />{a.enabled === false ? '\u672A\u5165\u6C60' : a.status?.cooldowns?.length ? '\u90E8\u5206\u8DEF\u7531\u51B7\u5374' : '\u5DF2\u5728\u6C60\u4E2D'}</span></td></tr>)}</tbody></table>{!data.accounts.length && <p className=\"empty\">\u5C1A\u672A\u8FDE\u63A5\u8D26\u53F7\uFF0C\u8BF7\u5148\u83B7\u53D6\u672C\u673A\u767B\u5F55\u6216\u6DFB\u52A0\u51ED\u8BC1\u3002</p>}</div><div className=\"table-footer bar\"><p className=\"notice\">\u5404\u5E73\u53F0\u79EF\u5206\u72EC\u7ACB\u5C55\u793A\uFF0C\u4E34\u671F\u63D0\u9192\u4EC5\u663E\u793A\u5DF2\u786E\u8BA4\u7684\u4F59\u989D\u3002</p><button disabled={busy} onClick={() => go('accounts')}>\u7BA1\u7406\u8D26\u53F7\u6C60</button></div></section>\n <p className=\"notice\">\u5E73\u53F0\u4F59\u989D\u6BCF\u5206\u949F\u67E5\u8BE2\uFF1BToken \u4EC5\u7EDF\u8BA1\u672C\u63D2\u4EF6\u8BF7\u6C42\uFF0C\u4ECE\u5347\u7EA7\u5F00\u59CB\u8BB0\u5F55\u3002\u79EF\u5206\u4E0B\u964D\u53EF\u80FD\u5305\u542B\u5BA2\u6237\u7AEF\u6216\u5176\u4ED6\u5E94\u7528\u7684\u6D88\u8017\uFF0C\u4E09\u5BB6\u79EF\u5206\u5206\u522B\u5C55\u793A\u3002</p>\n <div className=\"grid\"><section className=\"box\"><h3>\u8FD1 7 \u65E5 Token</h3><div className=\"trend\" role=\"img\" aria-label={dates.map(d => `${d.key} ${d.tokens} Token`).join('\uFF0C')}>{dates.map(d => <div key={d.key} title={`${d.key} \u00B7 ${fmt(d.tokens)} Token`}><i style={{ height: `${Math.max(3, d.tokens / max * 78)}%` }} /><small>{d.key.slice(5)}</small></div>)}</div><p className=\"notice\">\u672A\u8FD4\u56DE Token \u7528\u91CF\u7684\u8BF7\u6C42\uFF1A{fmt(data.accounts.reduce((n, a) => n + (a.usage?.unmetered || 0), 0))} \u6B21</p></section>\n <section className=\"box stack\"><h3>\u5FEB\u901F\u5F00\u59CB</h3><p className=\"notice\">1. \u786E\u8BA4\u81EA\u52A8\u83B7\u53D6\u7684\u8D26\u53F7\uFF0C\u6216\u624B\u52A8\u6DFB\u52A0\u51ED\u8BC1<br />2. \u4F7F\u7528\u9884\u5236\u8DEF\u7531\uFF0C\u6309\u9700\u7F16\u8F91\u8D26\u53F7\u5207\u6362\u89C4\u5219<br />3. \u5230 DSH \u6A21\u578B\u9009\u62E9\u5668\u9009\u62E9\u300C\u7EDF\u4E00\u8DEF\u7531\u300D\u4E2D\u7684\u6A21\u578B</p><div className=\"row\"><button onClick={() => go('accounts')}>\u67E5\u770B\u8D26\u53F7</button><button onClick={() => go('routes')}>\u914D\u7F6E\u8DEF\u7531</button><button onClick={() => go('checkins')}>\u79EF\u5206\u7B7E\u5230</button><button onClick={() => go('plugins')}>\u68C0\u67E5\u6240\u6709\u63D2\u4EF6\u66F4\u65B0</button></div></section></div>\n <section className=\"box\"><div className=\"bar\"><h3>\u6700\u8FD1\u8BF7\u6C42</h3><button onClick={() => go('usage')}>\u67E5\u770B Token \u660E\u7EC6</button></div><div className=\"scroll\"><table className=\"table\"><thead><tr><th>\u65F6\u95F4</th><th>\u8D26\u53F7</th><th>\u8DEF\u7531 / \u6A21\u578B</th><th>Token</th><th>\u6027\u80FD</th><th>\u7ED3\u679C</th></tr></thead><tbody>{(t.events || []).slice(0, 15).map((e, i) => <tr key={`${e.at}:${i}`}><td>{when(e.at)}</td><td>{data.accounts.find(a => a.id === e.account)?.name || e.account}</td><td className=\"mono\">{e.alias}</td><td>{fmt(e.tokens)}</td><td><RequestPerformance event={e} /></td><td>{e.outcome === 'completed' ? '\u6210\u529F' : e.outcome === 'cancelled' ? '\u5DF2\u53D6\u6D88' : `\u5931\u8D25 ${e.status}`}</td></tr>)}</tbody></table>{!t.events?.length && <p className=\"empty\">\u5C1A\u65E0\u8BF7\u6C42\u8BB0\u5F55\u3002\u901A\u8FC7\u672C\u63D2\u4EF6\u8C03\u7528\u6A21\u578B\u540E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002</p>}</div></section>\n </div>;\n}\nexport function usageDateBounds(period, start, end, now = Date.now()) {\n const today = new Date(now).toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' });\n const midnight = day => Date.parse(`${day}T00:00:00+08:00`);\n if (period === 'custom') return [midnight(start), midnight(end) + 86400000];\n if (period === 'all') return [-Infinity, Infinity];\n return [midnight(today) - (Number(period) - 1) * 86400000, midnight(today) + 86400000];\n}\nexport const duration = ms => typeof ms !== 'number' || !Number.isFinite(ms) ? '\u2014' : ms < 60000 ? `${fmt(ms / 1000)} \u79D2` : `${Math.floor(ms / 60000)} \u5206 ${fmt(ms % 60000 / 1000)} \u79D2`;\nexport function performanceSummary(events) {\n const rows = events.filter(e => e.outcome === 'completed' && e.timing);\n const sum = (key, source = rows) => source.some(e => e.timing[key] != null) ? source.reduce((n, e) => n + (e.timing[key] ?? 0), 0) : null;\n const first = rows.filter(e => e.timing.ttftMs != null), decode = rows.filter(e => e.timing.decodeMs > 0 && e.timing.decodeTokens != null), tools = rows.filter(e => e.timingSource === 'dsh-step');\n return { modelMs: sum('modelMs'), toolMs: sum('toolMs', tools), ttftMs: first.length ? sum('ttftMs', first) / first.length : null,\n tps: decode.length ? sum('decodeTokens', decode) / (sum('decodeMs', decode) / 1000) : null,\n samples: rows.length, firstSamples: first.length, decodeSamples: decode.length, toolSamples: tools.length,\n pendingTools: tools.reduce((n, e) => n + (e.timing.toolCount ?? 0) - (e.timing.toolsCompleted ?? 0), 0) };\n}\nfunction PerformanceMetrics({ events }) {\n const stats = performanceSummary(events);\n return <section className=\"stack\" aria-label=\"\u8C03\u7528\u6027\u80FD\u7EDF\u8BA1\"><div className=\"bar\"><h3>\u8C03\u7528\u6027\u80FD</h3><p className=\"notice\">\u6210\u529F\u8C03\u7528 \u00B7 {fmt(stats.samples)} \u6761\u6027\u80FD\u8BB0\u5F55</p></div><div className=\"metrics\">\n {metric('\u6A21\u578B\u7528\u65F6', duration(stats.modelMs), '\u6210\u529F\u8C03\u7528\u7528\u65F6\u5408\u8BA1')}{metric('\u5DE5\u5177\u8C03\u7528\u7528\u65F6', duration(stats.toolMs), `${stats.toolSamples} \u6761 DSH \u6B65\u9AA4${stats.pendingTools ? ` \u00B7 ${stats.pendingTools} \u4E2A\u5DE5\u5177\u672A\u5B8C\u6210` : ''}`)}\n {metric('\u9996 Token \u5E73\u5747\uFF08TTFT\uFF09', duration(stats.ttftMs), `${stats.firstSamples} \u6761\u9996 Token \u8BB0\u5F55`)}{metric('\u8F93\u51FA\u901F\u5EA6\uFF08TPS\uFF09', stats.tps === null ? '\u2014' : `${fmt(stats.tps)} tok/s`, `${stats.decodeSamples} \u6761\u89E3\u7801\u8BB0\u5F55 \u00B7 \u52A0\u6743\u901F\u5EA6`)}</div>\n <details className=\"help\"><summary>\u7EDF\u8BA1\u53E3\u5F84\u4E0E\u7F3A\u5931\u6570\u636E</summary><div><p className=\"notice\">\u968F\u5F53\u524D\u65F6\u95F4\u3001\u8D26\u53F7\u3001\u8DEF\u7531\u548C\u7ED3\u679C\u7B5B\u9009\u6C47\u603B\uFF0C\u4ECE\u672C\u7248\u5F00\u59CB\u8BB0\u5F55\uFF1B\u65E7\u6570\u636E\u4E0D\u8865\u7B97\u3002DSH \u6B65\u9AA4\u53E3\u5F84\u4E0E\u4F1A\u8BDD\u7EDF\u8BA1\u4E00\u81F4\uFF1A\u6A21\u578B\u7528\u65F6\u4ECE\u6B65\u9AA4\u5F00\u59CB\u5230\u56DE\u590D\u5B8C\u6210\uFF0C\u9996 Token \u5305\u62EC\u975E\u7A7A\u6587\u672C\u3001\u63A8\u7406\u6216\u5DE5\u5177\u8C03\u7528\uFF0C\u5DE5\u5177\u7528\u65F6\u6309\u8C03\u7528\u4E0E\u7ED3\u679C\u914D\u5BF9\u76F8\u52A0\uFF08\u5E76\u884C\u5DE5\u5177\u53EF\u80FD\u91CD\u53E0\uFF09\u3002TPS = \u6709\u6548\u8F93\u51FA Token \u5408\u8BA1 \u00F7 \u9996 Token \u540E\u7684\u89E3\u7801\u79D2\u6570\u5408\u8BA1\uFF0C\u4E0D\u5BF9\u5404\u6B21\u901F\u5EA6\u7B80\u5355\u5E73\u5747\u3002\u672A\u7ECF\u8FC7 DSH \u6B65\u9AA4\u7684\u8BF7\u6C42\u4F7F\u7528\u4E0A\u6E38\u8BA1\u65F6\uFF0C\u65E0\u6CD5\u8BB0\u5F55\u5DE5\u5177\u6267\u884C\u7528\u65F6\u3002\u8FD9\u91CC\u53EA\u6C47\u603B\u672C\u63D2\u4EF6\u4FDD\u7559\u4E14\u7B5B\u9009\u5185\u7684\u8C03\u7528\uFF0C\u5E76\u975E\u67D0\u4E2A\u4F1A\u8BDD\u7684\u5B8C\u6574\u5386\u53F2\u3002\u5931\u8D25\u4E0E\u53D6\u6D88\u4FDD\u7559\u9010\u6B21\u8017\u65F6\uFF0C\u4E0D\u8BA1\u5165\u4EE5\u4E0A\u6210\u529F\u8C03\u7528\u6307\u6807\u3002</p></div></details></section>;\n}\nexport function UsageDetails({ data, busy, act }) {\n const [account, setAccount] = useState(''), [route, setRoute] = useState(''), [outcome, setOutcome] = useState(''), [page, setPage] = useState(0);\n const [period, setPeriod] = useState('30'), [start, setStart] = useState(() => new Date(Date.now() - 29 * 86400000).toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' })), [end, setEnd] = useState(() => new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' }));\n const all = data.telemetry?.events || [], retention = data.options.usageRetentionDays;\n const [from, until] = usageDateBounds(period, start, end), invalidRange = !(from < until);\n const events = all.filter(e => e.at >= from && e.at < until && (!account || e.account === account) && (!route || e.alias === route) && (!outcome || e.outcome === outcome));\n const pages = Math.max(1, Math.ceil(events.length / 50)), current = Math.min(page, pages - 1);\n const accountName = id => data.accounts.find(a => a.id === id)?.name || id;\n const routeName = id => data.routes.find(r => r.id === id)?.name || id;\n const total = key => events.some(e => e[key] != null) ? events.reduce((n, e) => n + (e[key] ?? 0), 0) : null;\n const missing = events.filter(e => e.input == null || e.output == null).length;\n return <div className=\"stack\"><section className=\"box stack\"><div className=\"bar\"><div><h3>\u9010\u6B21\u8BF7\u6C42\u7528\u91CF</h3><p className=\"notice\">\u8BB0\u5F55\u6BCF\u6B21\u4E0A\u6E38\u8C03\u7528\uFF0C\u5305\u62EC\u6545\u969C\u5207\u6362\u4E2D\u5931\u8D25\u7684\u5C1D\u8BD5\u3002</p></div><span className=\"badge\">\u6700\u8FD1 {retention} \u5929 \u00B7 {fmt(all.length)} \u6761</span></div>\n <details className=\"help\"><summary>\u8C03\u6574\u660E\u7EC6\u4FDD\u7559\u5929\u6570\uFF08\u5F53\u524D {retention} \u5929\uFF09</summary><div className=\"stack\"><form key={retention} className=\"row\" onSubmit={e => { e.preventDefault(); void act({ action: 'options.save', usageRetentionDays: Number(new FormData(e.currentTarget).get('days')) }); }}><label className=\"filter\">\u660E\u7EC6\u4FDD\u7559\u5929\u6570<input name=\"days\" type=\"number\" min=\"1\" max=\"365\" step=\"1\" required disabled={busy} defaultValue={retention} /></label><button type=\"submit\" disabled={busy}>\u4FDD\u5B58\u4FDD\u7559\u671F\u9650</button></form><p className=\"notice\">\u9ED8\u8BA4\u6EDA\u52A8\u4FDD\u7559\u6700\u8FD1 30 \u5929\uFF0C\u53EF\u8BBE\u7F6E 1\u2013365 \u5929\u3002\u7F29\u77ED\u671F\u9650\u4F1A\u5220\u9664\u8D85\u671F\u660E\u7EC6\uFF0C\u5EF6\u957F\u4E0D\u80FD\u6062\u590D\u5DF2\u5220\u9664\u8BB0\u5F55\uFF1B\u7D2F\u8BA1\u7EDF\u8BA1\u3001\u989D\u5EA6\u8F6E\u6362\u548C\u4E34\u671F\u51B7\u5374\u4E0D\u53D7\u5F71\u54CD\u3002</p></div></details></section>\n <div className=\"bar\"><div className=\"row\" role=\"group\" aria-label=\"\u660E\u7EC6\u65F6\u95F4\u8303\u56F4\">{[['1', '\u4ECA\u65E5'], ['3', '\u8FD1 3 \u65E5'], ['7', '\u8FD1 7 \u65E5'], ['30', '\u8FD1 30 \u65E5'], ['all', '\u5168\u90E8\u5DF2\u4FDD\u7559'], ['custom', '\u81EA\u5B9A\u4E49']].map(([value, label]) => <button key={value} aria-pressed={period === value} onClick={() => { setPeriod(value); setPage(0); }}>{label}</button>)}</div><p className=\"notice\">\u6309\u5317\u4EAC\u65F6\u95F4\u81EA\u7136\u65E5\u7B5B\u9009</p></div>\n {period === 'custom' && <div className=\"row\"><label className=\"filter\">\u5F00\u59CB\u65E5\u671F\uFF08\u5317\u4EAC\u65F6\u95F4\uFF09<input type=\"date\" value={start} max={end || undefined} required onChange={e => { setStart(e.target.value); setPage(0); }} /></label><label className=\"filter\">\u7ED3\u675F\u65E5\u671F\uFF08\u5317\u4EAC\u65F6\u95F4\uFF09<input type=\"date\" value={end} min={start || undefined} required onChange={e => { setEnd(e.target.value); setPage(0); }} /></label>{invalidRange && <p role=\"alert\" className=\"error\">\u8BF7\u9009\u62E9\u6709\u6548\u7684\u8D77\u6B62\u65E5\u671F\uFF0C\u7ED3\u675F\u65E5\u671F\u4E0D\u80FD\u65E9\u4E8E\u5F00\u59CB\u65E5\u671F\u3002</p>}</div>}\n <div className=\"row\"><label className=\"filter\">\u8D26\u53F7<select value={account} onChange={e => { setAccount(e.target.value); setPage(0); }}><option value=\"\">\u5168\u90E8\u8D26\u53F7</option>{[...new Set(all.map(e => e.account))].map(id => <option key={id} value={id}>{accountName(id)}</option>)}</select></label><label className=\"filter\">\u8DEF\u7531 / \u6A21\u578B<select value={route} onChange={e => { setRoute(e.target.value); setPage(0); }}><option value=\"\">\u5168\u90E8\u8DEF\u7531 / \u6A21\u578B</option>{[...new Set(all.map(e => e.alias))].map(id => <option key={id} value={id}>{routeName(id)}</option>)}</select></label><label className=\"filter\">\u7ED3\u679C<select value={outcome} onChange={e => { setOutcome(e.target.value); setPage(0); }}><option value=\"\">\u5168\u90E8\u7ED3\u679C</option><option value=\"completed\">\u6210\u529F</option><option value=\"failed\">\u5931\u8D25</option><option value=\"cancelled\">\u5DF2\u53D6\u6D88</option></select></label></div>\n <div className=\"metrics\">{metric('\u7B5B\u9009\u5185\u8C03\u7528', fmt(events.length), '\u4E0A\u6E38\u5C1D\u8BD5\u6B21\u6570')}{metric('\u8F93\u5165 Token', fmt(total('input')), '\u5DF2\u8FD4\u56DE\u7684\u8F93\u5165\u5206\u9879')}{metric('\u8F93\u51FA Token', fmt(total('output')), '\u5DF2\u8FD4\u56DE\u7684\u8F93\u51FA\u5206\u9879')}{metric('\u603B Token', fmt(total('tokens')), '\u5DF2\u8FD4\u56DE\u7684\u603B\u91CF')}</div><p className=\"notice\">\u6570\u636E\u6765\u81EA\u5E73\u53F0\u8FD4\u56DE\u7684 usage\u3002{missing ? fmt(missing) + ' \u6761\u7F3A\u5C11\u8F93\u5165\u6216\u8F93\u51FA\u5206\u9879\uFF1B\u65E7\u8BB0\u5F55\u4E0D\u8865\u7B97\u3002' : '\u8F93\u5165\u3001\u8F93\u51FA\u4E3A\u5B9E\u9645\u8FD4\u56DE\u503C\u3002'}\u7F13\u5B58\u8F93\u5165\u5305\u542B\u5728\u8F93\u5165\u4E2D\uFF0C\u63A8\u7406\u8F93\u51FA\u5305\u542B\u5728\u8F93\u51FA\u4E2D\uFF0C\u5747\u4E0D\u91CD\u590D\u76F8\u52A0\u3002\u672A\u8FD4\u56DE\u7684\u6570\u636E\u4EE5\u300C\u2014\u300D\u663E\u793A\u3002</p>\n <PerformanceMetrics events={events} />\n <section className=\"box\"><div className=\"scroll\" role=\"region\" aria-label=\"\u8BF7\u6C42\u7528\u91CF\u4E0E\u6027\u80FD\u660E\u7EC6\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th>\u65F6\u95F4</th><th>\u6E20\u9053 / \u8D26\u53F7</th><th>\u8DEF\u7531 / \u5B9E\u9645\u6A21\u578B</th><th>\u8F93\u5165</th><th>\u8F93\u51FA</th><th>\u603B Token</th><th>\u6027\u80FD</th><th>\u7ED3\u679C</th></tr></thead><tbody>{events.slice(current * 50, (current + 1) * 50).map((e, i) => <tr key={e.at + ':' + current + ':' + i}><td>{when(e.at)}</td><td>{data.providers.find(p => p.id === e.provider)?.name || e.provider}<br /><small>{accountName(e.account)}</small></td><td>{routeName(e.alias)}<br /><small className=\"mono\">{e.model || '\u672A\u8BB0\u5F55\u5B9E\u9645\u6A21\u578B'}</small></td><td>{fmt(e.input)}{e.cachedInput != null && <><br /><small>\u7F13\u5B58 {fmt(e.cachedInput)}</small></>}</td><td>{fmt(e.output)}{e.reasoningOutput != null && <><br /><small>\u63A8\u7406 {fmt(e.reasoningOutput)}</small></>}</td><td>{fmt(e.tokens)}</td><td><RequestPerformance event={e} /></td><td>{e.outcome === 'completed' ? '\u6210\u529F' : e.outcome === 'cancelled' ? '\u5DF2\u53D6\u6D88' : '\u5931\u8D25'}<br /><small>{e.status}</small></td></tr>)}</tbody></table>{!events.length && <p className=\"empty\">\u5F53\u524D\u7B5B\u9009\u548C\u4FDD\u7559\u671F\u9650\u5185\u6CA1\u6709\u8BF7\u6C42\u660E\u7EC6\u3002</p>}</div><div className=\"bar\"><p className=\"notice\">\u7B2C {current + 1} / {pages} \u9875 \u00B7 \u6BCF\u9875 50 \u6761</p><div className=\"row\"><button disabled={current === 0} onClick={() => setPage(current - 1)}>\u4E0A\u4E00\u9875</button><button disabled={current >= pages - 1} onClick={() => setPage(current + 1)}>\u4E0B\u4E00\u9875</button></div></div></section>\n </div>;\n}\nfunction RequestPerformance({ event: e }) {\n const t = e.timing;\n if (!t) return <small>\u672A\u8BB0\u5F55</small>;\n return <details className=\"help\"><summary>{duration(t.modelMs)}</summary><div style={{ minWidth: 170 }}><small>\u6A21\u578B\uFF1A{duration(t.modelMs)}</small><small>\u9996 Token\uFF1A{duration(t.ttftMs)}</small><small>TPS\uFF1A{t.decodeMs > 0 && t.decodeTokens != null ? `${fmt(t.decodeTokens / (t.decodeMs / 1000))} tok/s` : '\u2014'}</small><small>\u5DE5\u5177\uFF1A{duration(t.toolMs)}{t.toolCount != null ? ` \u00B7 ${t.toolsCompleted} / ${t.toolCount} \u5B8C\u6210` : ''}</small><small>{e.timingSource === 'dsh-step' ? 'DSH \u6B65\u9AA4\u8BA1\u65F6' : '\u4E0A\u6E38\u8BF7\u6C42\u8BA1\u65F6'}</small></div></details>;\n}\nfunction AccountForm({ modal, provider, data, busy, act, close, replace, error, notice }) {\n const [revision, setRevision] = useState(modal.revision);\n const edit = modal.mode === 'edit', account = edit ? data.accounts.find(a => a.id === modal.account.id) : null;\n return edit ? <div className=\"modal-body stack\"><Feedback error={error} notice={notice} /><div className=\"box stack\"><h3>{account.name}</h3><p>{loginNames[account.login?.state] || '\u5C1A\u672A\u67E5\u8BE2'}</p><p className=\"notice\">\u8D26\u53F7\u8EAB\u4EFD\uFF1A{account.login?.name || '\u5C1A\u672A\u83B7\u53D6'}<br />\u8BA4\u8BC1\u65B9\u5F0F\uFF1A{account.login?.kind || '\u672A\u77E5'}<br />\u767B\u5F55\u6709\u6548\u81F3\uFF1A{account.login?.kind === 'PAT' ? '\u5E73\u53F0\u672A\u8FD4\u56DE\u6709\u6548\u671F' : when(account.login?.expiresAt)}<br />\u81EA\u52A8\u5237\u65B0\uFF1A{account.login?.refreshable ? '\u652F\u6301' : '\u65E0\u5237\u65B0\u51ED\u8BC1'}<br />\u4E0A\u6B21\u7528\u91CF\u66F4\u65B0\uFF1A{when(account.usage?.balance?.fetchedAt)}</p><button disabled={busy} onClick={() => { void act({ action: 'account.refresh', id: account.id }); }}>\u5237\u65B0\u767B\u5F55\u4E0E\u7528\u91CF</button><button disabled={busy} onClick={replace}>\u8865\u5145 / \u66F4\u65B0\u51ED\u8BC1</button></div>\n <div className=\"bar\"><div><h3>\u8DEF\u7531\u8D26\u53F7\u987A\u5E8F</h3><p className=\"notice\">\u6545\u969C\u5207\u6362\u6309\u6B64\u987A\u5E8F\u5C1D\u8BD5\uFF1B\u6743\u91CD\u6216\u989D\u5EA6\u7B56\u7565\u4EE5\u8DEF\u7531\u914D\u7F6E\u4E3A\u51C6\u3002</p></div><div className=\"row\">{[-1, 1].map(direction => { const group = data.accounts.filter(a => a.provider === account.provider), i = group.findIndex(a => a.id === account.id); return <button type=\"button\" key={direction} disabled={busy || (direction < 0 ? i === 0 : i === group.length - 1)} onClick={async () => { const next = await act({ action: 'account.move', id: account.id, direction }); if (next) setRevision(next.revision); }}>{direction < 0 ? '\u524D\u79FB' : '\u540E\u79FB'}</button>; })}</div></div>\n <CredentialTransfer account={account} busy={busy} act={act} />\n <section className=\"box\"><h3>\u5E73\u53F0\u5957\u9910\u4E0E\u989D\u5EA6</h3>{account.usage?.balance?.plan && <p>{account.usage.balance.plan}</p>}{(account.usage?.balance?.packages || []).map((p, i) => <div className=\"item\" key={i}><div className=\"bar\"><span>{p.name || '\u989D\u5EA6\u5305'}</span><strong>{p.unlimited ? '\u4E0D\u9650\u91CF' : `${fmt(p.remaining)} / ${fmt(p.total)}`}</strong></div>{p.expiresAt && <p className=\"notice\">\u6709\u6548\u81F3 {when(p.expiresAt)}</p>}</div>)}{!account.usage?.balance?.packages?.length && <p className=\"notice\">\u5C1A\u65E0\u53EF\u5C55\u793A\u989D\u5EA6\u5305\uFF0C\u70B9\u51FB\u5237\u65B0\u83B7\u53D6\u3002</p>}</section>\n <form className=\"stack\" onSubmit={async e => { e.preventDefault(); if (await act({ action: 'account.update', revision, id: account.id, name: new FormData(e.currentTarget).get('name') })) close(); }}><label>\u8D26\u53F7\u663E\u793A\u540D\u79F0<input name=\"name\" required defaultValue={account.name} maxLength={100} disabled={busy} /></label><div className=\"bar\"><button type=\"button\" disabled={busy} onClick={async () => { if (await act({ action: 'account.remove', id: account.id })) close(); }}>\u79FB\u51FA\u8D26\u53F7\u6C60</button><button className=\"primary\" type=\"submit\" disabled={busy}>\u4FDD\u5B58\u540D\u79F0</button></div><p className=\"notice\">\u79FB\u51FA\u8D26\u53F7\u6C60\u540E\u4FDD\u7559\u51ED\u8BC1\u6587\u4EF6\uFF0C\u53EF\u4ECE\u6587\u4EF6\u91CD\u65B0\u5BFC\u5165\u3002</p></form></div>\n : <CredentialForm key={modal.mode} modal={modal} provider={provider} data={data} busy={busy} act={act} close={close} error={error} notice={notice} />;\n}\n\nfunction CredentialTransfer({ account, busy, act }) {\n const container = useRef(null), [pending, setPending] = useState(false), [notice, setNotice] = useState(''), [error, setError] = useState(''), [manual, setManual] = useState('');\n async function extract(copy) {\n if (pending || busy) return;\n setPending(true); setNotice(''); setError(''); setManual('');\n try {\n const result = await act({ action: 'account.export', id: account.id }); if (!result) return;\n if (!copy) { downloadJson(result.exported); setNotice('\u5DF2\u53D1\u8D77\u51ED\u8BC1 JSON \u4E0B\u8F7D\uFF0C\u5728\u5176\u4ED6\u8BBE\u5907\u6DFB\u52A0\u8D26\u53F7\u65F6\u9009\u62E9\u8BE5\u6587\u4EF6\u5373\u53EF\u3002'); return; }\n const text = JSON.stringify(result.exported.document, null, 2);\n try { await navigator.clipboard.writeText(text); }\n catch {\n // The desktop WebView may not expose Clipboard API; keep copying inside the active dialog.\n const focus = document.activeElement, area = document.createElement('textarea');\n area.value = text; area.style.cssText = 'position:fixed;opacity:0;pointer-events:none'; container.current.append(area); area.select();\n let copied = false;\n try { copied = document.execCommand('copy'); } catch { /* Offer explicit manual copying below. */ }\n finally { area.remove(); focus?.focus(); }\n if (!copied) { setManual(text); setNotice('\u5F53\u524D\u73AF\u5883\u4E0D\u5141\u8BB8\u81EA\u52A8\u590D\u5236\uFF0C\u8BF7\u70B9\u51FB\u4E0B\u65B9\u6587\u672C\u6846\u5168\u9009\u5E76\u590D\u5236\u3002'); return; }\n }\n setNotice('\u51ED\u8BC1 JSON \u5DF2\u590D\u5236\uFF0C\u53EF\u5728\u5176\u4ED6\u8BBE\u5907\u6DFB\u52A0\u8D26\u53F7\u65F6\u76F4\u63A5\u7C98\u8D34\u3002');\n } catch { setError('\u51ED\u8BC1\u63D0\u53D6\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u3002'); } finally { setPending(false); }\n }\n return <section ref={container} className=\"box stack\"><h3>\u51ED\u8BC1\u63D0\u53D6\u4E0E\u8DE8\u8BBE\u5907\u4F7F\u7528</h3><p className=\"notice\">\u5355\u8D26\u53F7 JSON \u5305\u542B\u767B\u5F55 Token / PAT\uFF0CTrae \u540C\u65F6\u5305\u542B\u5FC5\u8981\u8BBE\u5907\u8EAB\u4EFD\u3002\u590D\u5236\u53CA\u6B64\u5904\u5BFC\u51FA\u4E3A\u660E\u6587\uFF0C\u8BF7\u4EC5\u5728\u81EA\u5DF1\u7684\u8BBE\u5907\u95F4\u4F20\u9012\uFF1B\u9700\u8981\u52A0\u5BC6\u65F6\u4F7F\u7528\u300C\u914D\u7F6E\u8FC1\u79FB\u300D\u3002</p><div className=\"row\"><button type=\"button\" disabled={busy || pending} onClick={() => { void extract(true); }}>\u590D\u5236\u51ED\u8BC1 JSON</button><button type=\"button\" disabled={busy || pending} onClick={() => { void extract(false); }}>\u5BFC\u51FA\u51ED\u8BC1 JSON</button></div><Feedback error={error} notice={notice} />{manual && <label>\u624B\u52A8\u590D\u5236\u51ED\u8BC1 JSON<textarea readOnly rows=\"5\" autoComplete=\"off\" spellCheck=\"false\" value={manual} onFocus={e => e.currentTarget.select()} /></label>}<p className=\"notice\">\u65B0\u8BBE\u5907\uFF1A\u6DFB\u52A0\u8D26\u53F7 \u2192 \u7C98\u8D34 / \u9009\u62E9\u51ED\u8BC1 JSON \u2192 \u4FDD\u5B58\u3002\u5E73\u53F0\u8981\u6C42\u91CD\u65B0\u767B\u5F55\u65F6\uFF0C\u9700\u66F4\u65B0\u51ED\u8BC1\u3002</p></section>;\n}\n\nfunction CredentialForm({ modal, provider, data, busy, act, close, error, notice }) {\n const replacing = modal.mode === 'credentials';\n const [selected, setSelected] = useState(modal.account?.provider || provider), [mode, setMode] = useState('client'), [localError, setLocalError] = useState(''), [json, setJson] = useState('');\n const [edition, setEdition] = useState(modal.account?.login?.edition || 'auto');\n const [phone, setPhone] = useState(''), [smsCode, setSmsCode] = useState(''), [sms, setSms] = useState(null), [verify, setVerify] = useState(true), [clock, setClock] = useState(Date.now());\n useEffect(() => { if (mode !== 'sms') return; const timer = setInterval(() => setClock(Date.now()), 1000); return () => clearInterval(timer); }, [mode]);\n const resend = Math.max(0, Math.ceil(((sms?.resendAt || 0) - clock) / 1000));\n const isTrae = selected.startsWith('trae'), isQoder = selected.startsWith('qoder'), global = selected === 'trae-global' || selected === 'workbuddy-ai' || selected === 'qoder-global';\n const field = (label, name, type = 'text', required = true, value) => <label>{label}<input name={name} type={type} autoComplete=\"off\" required={required} defaultValue={value} disabled={busy} /></label>;\n function receiveJson(text) {\n setJson(text); setLocalError('');\n try { const parsed = JSON.parse(text); if (!replacing && parsed.format === 'dsh-multi-router-account' && data.providers.some(p => p.id === parsed.provider)) {\n setSelected(parsed.provider); setEdition(parsed.credential?.edition || (parsed.provider === 'trae-global' ? 'sg' : 'cn'));\n } } catch { /* Allow unfinished JSON while typing. */ }\n }\n async function submit(e) {\n e.preventDefault(); setLocalError(''); const f = Object.fromEntries(new FormData(e.currentTarget));\n if (mode === 'sms') {\n const result = await act({ action: 'workbuddy.login', revision: data.revision, challenge: sms?.challenge, code: smsCode, verify, id: replacing ? modal.account.id : undefined, name: f.name || undefined });\n if (result) { setPhone(''); setSmsCode(''); setSms(null); close(selected); } return;\n }\n let document, identityDocument;\n try {\n if (mode === 'json') { document = JSON.parse(json); if (f.identityJSON?.trim()) identityDocument = JSON.parse(f.identityJSON); }\n if (mode === 'manual') {\n if (isQoder) document = { version: 2, pat: f.pat.trim(), region: global ? 'global' : 'china' };\n else {\n const credential = { accessToken: f.accessToken.trim(), ...(f.refreshToken?.trim() ? { refreshToken: f.refreshToken.trim() } : {}), expiresAtMs: new Date(f.expiresAt).getTime(),\n ...(f.refreshExpiresAt ? { refreshExpiresAtMs: new Date(f.refreshExpiresAt).getTime() } : {}),\n ...(isTrae ? { userId: f.identityId.trim(), edition, host: global ? 'https://growsg-normal.trae.ai' : 'https://api.trae.cn' } : { uid: f.identityId.trim(), domain: f.domain.trim() }) };\n document = { version: 1, credential };\n if (isTrae) identityDocument = { edition, machineId: f.machineId.trim(), deviceId: f.deviceId.trim() };\n }\n }\n } catch { setLocalError('JSON \u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5\u51ED\u8BC1\u53CA\u8BBE\u5907\u8EAB\u4EFD JSON\u3002'); return; }\n const action = replacing ? 'account.credentials' : 'account.capture';\n if (await act({ action, revision: modal.revision, id: modal.account?.id, provider: selected, edition, name: f.name || (document?.format === 'dsh-multi-router-account' ? document.name : undefined),\n ...(document ? { document, identityDocument } : { source: f.source || undefined, identity: f.identity || undefined }) })) { setJson(''); close(selected); }\n }\n return <form onSubmit={submit}><div className=\"modal-body stack\"><Feedback error={localError || error} notice={notice} />\n <div className=\"grid\"><label>\u4F9B\u5E94\u5546 / \u533A\u57DF<select disabled={busy || replacing} value={selected} onChange={e => { setSelected(e.target.value); setEdition('auto'); setMode('client'); setJson(''); setLocalError(''); setSms(null); setSmsCode(''); setPhone(''); }}>{data.providers.map(p => <option key={p.id} value={p.id}>{p.name}</option>)}</select></label>{field('\u8D26\u53F7\u540D\u79F0\uFF08\u53EF\u9009\uFF09', 'name', 'text', false, modal.account?.name)}\n {isTrae && <label>\u767B\u5F55\u7684\u5BA2\u6237\u7AEF<select value={edition} disabled={busy} onChange={e => setEdition(e.target.value)}>{(mode === 'client' ? [['auto', '\u81EA\u52A8\u8BC6\u522B\uFF08\u63A8\u8350\uFF09'], ...(global ? [['sg', 'Trae Global'], ['solo-sg', 'TRAE SOLO Global']] : [['cn', 'Trae CN'], ['solo', 'TRAE SOLO CN']])] : global ? [['sg', 'Trae Global'], ['solo-sg', 'TRAE SOLO Global']] : [['cn', 'Trae CN'], ['solo', 'TRAE SOLO CN']]).map(([id, label]) => <option key={id} value={id}>{label}</option>)}</select></label>}</div>\n <label>\u51ED\u8BC1\u6DFB\u52A0\u65B9\u5F0F<select disabled={busy} value={mode} onChange={e => { setMode(e.target.value); if (e.target.value !== 'client' && edition === 'auto') setEdition(global ? 'sg' : 'cn'); setJson(''); setLocalError(''); }}><option value=\"client\">\u4E00\u952E\u8BFB\u53D6\u672C\u673A\u767B\u5F55</option>{selected === 'workbuddy' && <option value=\"sms\">\u77ED\u4FE1\u767B\u5F55\u5E76\u4FDD\u5B58\u51ED\u8BC1</option>}<option value=\"manual\">\u624B\u52A8\u586B\u5199{isQoder ? ' PAT' : '\u51ED\u8BC1'}</option><option value=\"json\">\u7C98\u8D34 / \u9009\u62E9\u51ED\u8BC1 JSON</option></select></label>\n {mode === 'sms' ? <section className=\"steps stack\"><h3>WorkBuddy \u624B\u673A\u53F7\u767B\u5F55</h3><p className=\"notice\">\u4EC5\u7528\u4E8E\u5DF2\u6709\u4E2D\u56FD\u7248\u8D26\u53F7\u3002\u624B\u673A\u53F7\u548C\u9A8C\u8BC1\u7801\u63D0\u4EA4\u81F3 WorkBuddy \u5B98\u65B9\uFF0C\u51ED\u8BC1\u4EC5\u4FDD\u5B58\u5728\u672C\u673A\uFF0C\u65E0\u9700\u5B89\u88C5 Python\u3002</p><label>\u624B\u673A\u53F7<input type=\"tel\" inputMode=\"tel\" autoComplete=\"tel\" required pattern=\"1[3-9][0-9]{9}\" maxLength=\"11\" value={phone} disabled={busy || resend > 0} onChange={e => { setPhone(e.target.value); setSms(null); setSmsCode(''); }} /></label><div className=\"row\"><button type=\"button\" disabled={busy || resend > 0 || !/^1[3-9]\\d{9}$/.test(phone)} onClick={async () => { const next = await act({ action: 'workbuddy.sms', phone }); if (next) { setSms(next.workbuddyLogin); setClock(Date.now()); setSmsCode(''); } }}>{resend ? `${resend} \u79D2\u540E\u53EF\u91CD\u53D1` : sms ? '\u91CD\u65B0\u53D1\u9001\u9A8C\u8BC1\u7801' : '\u53D1\u9001\u9A8C\u8BC1\u7801'}</button><span className=\"notice\" role=\"status\">{sms ? clock >= sms.expiresAt ? '\u9A8C\u8BC1\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6' : '\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\uFF0C\u8BF7\u67E5\u770B\u77ED\u4FE1' : '\u70B9\u51FB\u53D1\u9001\u624D\u4F1A\u8BF7\u6C42\u77ED\u4FE1\uFF0C\u4E0D\u81EA\u52A8\u91CD\u8BD5'}</span></div><label>\u77ED\u4FE1\u9A8C\u8BC1\u7801<input type=\"text\" inputMode=\"numeric\" autoComplete=\"one-time-code\" required pattern=\"[0-9]{4,8}\" maxLength=\"8\" value={smsCode} disabled={busy || !sms} onChange={e => setSmsCode(e.target.value)} /></label><label className=\"check\"><input type=\"checkbox\" checked={verify} disabled={busy} onChange={e => setVerify(e.target.checked)} />\u767B\u5F55\u540E\u9A8C\u8BC1\u5237\u65B0\u4EE4\u724C\uFF08\u63A8\u8350\uFF09</label><p className=\"notice\">\u540C\u4E00\u8D26\u53F7\u66F4\u65B0\u51ED\u8BC1\uFF0C\u65B0\u8D26\u53F7\u72EC\u7ACB\u4FDD\u5B58\uFF1B\u4E0D\u4F1A\u5F00\u542F\u81EA\u52A8\u7B7E\u5230\u3002\u9047\u5E73\u53F0\u9A8C\u8BC1\u6216\u9650\u5236\uFF0C\u8BF7\u6539\u7528\u672C\u673A\u5BA2\u6237\u7AEF\u8BFB\u53D6\u3002</p></section> : <section className=\"steps stack\"><h3>\u83B7\u53D6\u51ED\u8BC1\u5F15\u5BFC</h3>{isQoder ? <p>\u5728\u5BF9\u5E94\u56FD\u5185 / \u56FD\u9645\u7AD9\u7684\u8D26\u53F7\u8BBE\u7F6E\u4E2D\u521B\u5EFA PAT\uFF0C\u7136\u540E\u9009\u62E9\u300C\u624B\u52A8\u586B\u5199 PAT\u300D\u7C98\u8D34\u3002\u5DF2\u6709\u65E7\u8FDE\u63A5\u5668\u767B\u5F55\u65F6\uFF0C\u53EF\u4E00\u952E\u8BFB\u53D6\u672C\u673A\u4FDD\u5B58\u7684 PAT\u3002\u7F51\u9875\u767B\u5F55 Cookie \u4E0D\u4F5C\u4E3A PAT \u4F7F\u7528\u3002</p> : <p>1. \u5728\u6240\u9009\u533A\u57DF\u7684\u5B98\u65B9\u5BA2\u6237\u7AEF\u767B\u5F55\u8D26\u53F7\u3002<br />2. \u56DE\u5230\u672C\u9762\u677F\uFF0C\u9009\u62E9\u300C\u4E00\u952E\u8BFB\u53D6\u672C\u673A\u767B\u5F55\u300D\u5E76\u70B9\u51FB\u5E95\u90E8\u6309\u94AE\u3002<br />3. \u6DFB\u52A0\u53E6\u4E00\u4E2A\u8D26\u53F7\u65F6\uFF0C\u5148\u5728\u5BA2\u6237\u7AEF\u5207\u6362\u767B\u5F55\uFF0C\u518D\u91CD\u590D\u8BFB\u53D6\uFF1B\u5DF2\u6DFB\u52A0\u7684\u8D26\u53F7\u4F1A\u4FDD\u7559\u72EC\u7ACB\u526F\u672C\u3002</p>}\n <div className=\"row\">{isQoder ? <><a className=\"link\" href=\"https://docs.qoder.com/cli/authentication\" target=\"_blank\" rel=\"noreferrer\">\u5B98\u65B9 PAT \u83B7\u53D6\u8BF4\u660E</a>{global && <a className=\"link\" href=\"https://qoder.com/account/integrations\" target=\"_blank\" rel=\"noreferrer\">\u6253\u5F00 PAT \u7BA1\u7406\u9875</a>}</> : <a className=\"link\" href={isTrae ? (global ? 'https://www.trae.ai/' : 'https://www.trae.cn/') : (global ? 'https://www.codebuddy.ai/' : 'https://www.codebuddy.cn/')} target=\"_blank\" rel=\"noreferrer\">\u6253\u5F00\u5B98\u65B9\u5BA2\u6237\u7AEF\u7F51\u7AD9</a>}</div>\n <p className=\"notice\">\u8DE8\u8BBE\u5907\u5DF2\u6709\u51ED\u8BC1\u6587\u4EF6\u65F6\u53EF\u9009\u62E9 JSON\uFF1BWorkBuddy \u9700\u8981 accessToken\u3001uid\u3001domain\u3001expiresAtMs\uFF1BTrae \u8FD8\u9700\u8981 userId\u3001edition\uFF0C\u4EE5\u53CA\u540C\u8D26\u53F7\u7684 machineId / deviceId\u3002\u63A8\u8350\u8BFB\u53D6\u5BA2\u6237\u7AEF\u6216\u4F7F\u7528\u52A0\u5BC6\u914D\u7F6E\u8FC1\u79FB\uFF0C\u4E0D\u9700\u8981\u731C\u6D4B\u5B57\u6BB5\u3002</p></section>}\n <div key={`${selected}:${mode}`} className=\"stack\">{mode === 'manual' && (isQoder ? field('Qoder PAT', 'pat', 'password') : <div className=\"grid\">{field('Access Token', 'accessToken', 'password')}{field('Refresh Token\uFF08\u53EF\u9009\uFF09', 'refreshToken', 'password', false)}{field(isTrae ? 'User ID' : 'UID', 'identityId')}{field('Access Token \u6709\u6548\u81F3', 'expiresAt', 'datetime-local')}{field('Refresh Token \u6709\u6548\u81F3\uFF08\u53EF\u9009\uFF09', 'refreshExpiresAt', 'datetime-local', false)}{!isTrae && field('\u767B\u5F55 Domain', 'domain', 'text', false, global ? 'www.codebuddy.ai' : 'www.codebuddy.cn')}{isTrae && <>{field('Machine ID', 'machineId')}{field('Device ID', 'deviceId')}</>}</div>)}\n {mode === 'json' && <><p className=\"notice\">\u672C\u63D2\u4EF6\u590D\u5236 / \u5BFC\u51FA\u7684\u5355\u8D26\u53F7 JSON \u4F1A\u81EA\u52A8\u8BC6\u522B\u4F9B\u5E94\u5546\u3001\u533A\u57DF\u53CA\u8D26\u53F7\u540D\u79F0\uFF1BTrae \u8BBE\u5907\u8EAB\u4EFD\u968F\u6587\u4EF6\u5BFC\u5165\u3002</p><label>\u9009\u62E9\u51ED\u8BC1 JSON \u6587\u4EF6<input type=\"file\" accept=\".json,application/json\" disabled={busy} onChange={async e => { const file = e.target.files?.[0]; if (!file) return; if (file.size > 256 * 1024) { setLocalError('\u51ED\u8BC1\u6587\u4EF6\u4E0D\u80FD\u8D85\u8FC7 256 KB'); return; } try { receiveJson(await file.text()); } catch { setLocalError('\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6'); } }} /></label><label>\u51ED\u8BC1 JSON<textarea rows=\"7\" required autoComplete=\"off\" spellCheck=\"false\" disabled={busy} value={json} onChange={e => receiveJson(e.target.value)} placeholder={isQoder ? '{\"pat\":\"\u2026\",\"region\":\"china\"}' : '{\"version\":1,\"credential\":{\"accessToken\":\"\u2026\", \"expiresAtMs\":\u2026}}'} /></label>{isTrae && <label>Trae \u8BBE\u5907\u8EAB\u4EFD JSON\uFF08\u51ED\u8BC1\u4E2D\u5DF2\u6709 identity \u65F6\u53EF\u7559\u7A7A\uFF09<textarea name=\"identityJSON\" rows=\"3\" disabled={busy} autoComplete=\"off\" placeholder='{\"edition\":\"cn\",\"machineId\":\"\u2026\",\"deviceId\":\"\u2026\"}' /></label>}</>}\n {mode === 'client' && <details><summary>\u9AD8\u7EA7\uFF1A\u6307\u5B9A\u767B\u5F55\u6587\u4EF6\u4F4D\u7F6E</summary><div className=\"stack\" style={{ marginTop: 12 }}>{field('\u767B\u5F55 / PAT \u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u81EA\u52A8\u67E5\u627E\uFF09', 'source', 'text', false)}{isTrae && field('Trae \u8BBE\u5907\u8EAB\u4EFD\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09', 'identity', 'text', false)}</div></details>}</div>\n {mode !== 'sms' && <p className=\"notice\">\u51ED\u8BC1\u4EC5\u4FDD\u5B58\u5230\u672C\u673A\u63D2\u4EF6\u8D26\u53F7\u6C60\u3002\u4E0D\u4F1A\u5728\u8D26\u53F7\u5217\u8868\u663E\u793A Token\uFF1B\u6BCF\u4E2A\u8D26\u53F7\u72EC\u7ACB\u5237\u65B0\u3002{replacing ? '\u4FDD\u5B58\u540E\u542F\u7528\u6B64\u8D26\u53F7\uFF0C\u539F\u51ED\u8BC1\u526F\u672C\u4FDD\u7559\u3002' : '\u91CD\u590D\u8BFB\u53D6\u540C\u4E00\u8D26\u53F7\u4F1A\u63D0\u793A\u3002'}</p>}\n </div><div className=\"modal-foot bar\"><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button className=\"primary\" type=\"submit\" disabled={busy || mode === 'sms' && (!sms || clock >= sms.expiresAt)}>{busy ? '\u6B63\u5728\u5904\u7406\u2026' : mode === 'sms' ? '\u767B\u5F55\u5E76\u4FDD\u5B58\u5230\u8D26\u53F7\u6C60' : mode === 'client' ? '\u4E00\u952E\u83B7\u53D6\u5E76\u4FDD\u5B58\u767B\u5F55' : '\u4FDD\u5B58\u51ED\u8BC1\u5E76\u83B7\u53D6\u6A21\u578B'}</button></div></form>;\n}\nfunction MigrationForm({ data, act, busy }) {\n const [include, setInclude] = useState(false), [exportPassword, setExportPassword] = useState(''), [confirmPassword, setConfirmPassword] = useState(''), [exportError, setExportError] = useState('');\n const [document, setDocument] = useState(''), [fileName, setFileName] = useState(''), [password, setPassword] = useState(''), [mode, setMode] = useState('merge'), [preview, setPreview] = useState(null), [error, setError] = useState('');\n const resetPreview = () => { setPreview(null); setError(''); };\n return <div className=\"grid\"><form className=\"box stack\" onSubmit={async e => { e.preventDefault(); setExportError(''); if (include && exportPassword !== confirmPassword) { setExportError('\u4E24\u6B21\u8FC1\u79FB\u5BC6\u7801\u4E0D\u4E00\u81F4'); return; }\n const result = await act({ action: 'config.export', includeCredentials: include, password: include ? exportPassword : undefined }); if (!result) return;\n downloadJson(result.exported); setExportPassword(''); setConfirmPassword('');\n }}><h3>\u5BFC\u51FA\u5230\u5176\u4ED6\u8BBE\u5907</h3><p className=\"notice\">\u5305\u542B\u8D26\u53F7\u540D\u79F0\u548C\u987A\u5E8F\u3001\u6A21\u578B\u5C55\u793A\u8BBE\u7F6E\u3001\u8DEF\u7531\u4E0E\u5207\u6362\u89C4\u5219\u3002\u4E0D\u4F1A\u5BFC\u51FA\u4F1A\u8BDD\u3001\u7EDF\u8BA1\u3001\u6587\u4EF6\u8DEF\u5F84\u6216\u7BA1\u7406\u5BC6\u94A5\u3002</p><label className=\"check\"><input type=\"checkbox\" checked={include} disabled={busy} onChange={e => { setInclude(e.target.checked); setExportPassword(''); setConfirmPassword(''); }} />\u540C\u65F6\u8FC1\u79FB\u8D26\u53F7\u767B\u5F55\u51ED\u8BC1\uFF08\u5BC6\u7801\u52A0\u5BC6\uFF09</label>\n {include ? <><p className=\"steps\">\u52A0\u5BC6\u6587\u4EF6\u5305\u542B\u767B\u5F55 Token / PAT \u548C\u5FC5\u8981\u8BBE\u5907\u8EAB\u4EFD\uFF0C\u8BF7\u81EA\u884C\u4FDD\u7BA1\u3002\u65B0\u8BBE\u5907\u9700\u8981\u540C\u4E00\u5BC6\u7801\uFF1B\u51ED\u8BC1\u53EF\u80FD\u56E0\u5E73\u53F0\u8BBE\u5907\u9650\u5236\u800C\u9700\u8981\u91CD\u65B0\u767B\u5F55\u3002</p><label>\u8BBE\u7F6E\u8FC1\u79FB\u5BC6\u7801<input type=\"password\" autoComplete=\"new-password\" required minLength=\"10\" maxLength=\"1024\" value={exportPassword} disabled={busy} onChange={e => setExportPassword(e.target.value)} /></label><label>\u518D\u6B21\u8F93\u5165\u5BC6\u7801<input type=\"password\" autoComplete=\"new-password\" required value={confirmPassword} disabled={busy} onChange={e => setConfirmPassword(e.target.value)} /></label></> : <p className=\"steps\">\u4EC5\u914D\u7F6E\u6587\u4EF6\u4E0D\u542B\u767B\u5F55\u51ED\u8BC1\u3002\u65B0\u8BBE\u5907\u4E0A\u7684\u8D26\u53F7\u4F1A\u5148\u505C\u7528\uFF0C\u8865\u5145\u51ED\u8BC1\u540E\u5373\u53EF\u542F\u7528\uFF1B\u5408\u5E76\u5BFC\u5165\u4F1A\u4FDD\u7559\u672C\u673A\u5DF2\u6709\u8D26\u53F7\u51ED\u8BC1\u3002</p>}\n <Feedback error={exportError} /><button className=\"primary\" type=\"submit\" disabled={busy}>{include ? '\u5BFC\u51FA\u52A0\u5BC6\u8FC1\u79FB\u6587\u4EF6' : '\u5BFC\u51FA\u914D\u7F6E JSON'}</button></form>\n <form className=\"box stack\" onSubmit={async e => { e.preventDefault(); setError(''); const result = await act({ action: 'config.preview', document, password, mode }); if (result) setPreview({ ...result.importPreview, revision: result.revision }); }}><h3>\u5BFC\u5165\u63D2\u4EF6\u914D\u7F6E</h3><label>\u9009\u62E9\u8FC1\u79FB JSON \u6587\u4EF6<input type=\"file\" accept=\".json,application/json\" required disabled={busy} onChange={async e => { resetPreview(); setPassword(''); setDocument(''); const file = e.target.files?.[0]; if (!file) return; if (file.size > 900 * 1024) { setError('\u8FC1\u79FB\u6587\u4EF6\u4E0D\u80FD\u8D85\u8FC7 900 KB'); return; } try { setDocument(await file.text()); setFileName(file.name); } catch { setError('\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6'); } }} /></label>{fileName && <p className=\"mono muted\">{fileName}</p>}\n <label>\u8FC1\u79FB\u5BC6\u7801\uFF08\u4EC5\u52A0\u5BC6\u6587\u4EF6\u9700\u8981\uFF09<input type=\"password\" autoComplete=\"off\" maxLength=\"1024\" disabled={busy} value={password} onChange={e => { setPassword(e.target.value); resetPreview(); }} /></label><label>\u5BFC\u5165\u65B9\u5F0F<select disabled={busy} value={mode} onChange={e => { setMode(e.target.value); resetPreview(); }}><option value=\"merge\">\u5408\u5E76\uFF1A\u4FDD\u7559\u672C\u673A\u989D\u5916\u8D26\u53F7\u548C\u8DEF\u7531</option><option value=\"replace\">\u66FF\u6362\uFF1A\u4F7F\u7528\u5BFC\u5165\u6587\u4EF6\u7684\u5B8C\u6574\u914D\u7F6E</option></select></label>\n <p className=\"notice\">\u5408\u5E76\u65F6\u540C ID \u7684\u914D\u7F6E\u4F1A\u66F4\u65B0\uFF1B\u5E26\u51ED\u8BC1\u7684\u8D26\u53F7\u4F1A\u66F4\u65B0\u767B\u5F55\u526F\u672C\u3002\u66FF\u6362\u4F1A\u79FB\u51FA\u73B0\u6709\u914D\u7F6E\u4E2D\u7684\u989D\u5916\u8D26\u53F7 / \u8DEF\u7531\uFF0C\u4F46\u4FDD\u7559\u539F\u51ED\u8BC1\u6587\u4EF6\u3002\u4E24\u79CD\u65B9\u5F0F\u90FD\u4F1A\u5148\u5907\u4EFD\u672C\u673A\u914D\u7F6E\u3002</p><Feedback error={error} /><button type=\"submit\" disabled={busy || !document}>\u68C0\u67E5\u6587\u4EF6\u5E76\u9884\u89C8\u53D8\u66F4</button>\n {preview && <section className=\"steps stack\"><h3>\u5BFC\u5165\u9884\u89C8</h3><p>{preview.accounts} \u4E2A\u8D26\u53F7\uFF08\u65B0\u589E {preview.newAccounts}\uFF09 \u00B7 {preview.credentials} \u4EFD\u51ED\u8BC1<br />{preview.routes} \u6761\u8DEF\u7531 \u00B7 \u66F4\u65B0\u540C\u540D\u8DEF\u7531 {preview.overwrittenRoutes} \u6761<br />{preview.needsLogin} \u4E2A\u65B0\u8D26\u53F7\u9700\u8865\u5145\u767B\u5F55\uFF0C\u5C06\u5148\u505C\u7528</p><button className=\"primary\" type=\"button\" disabled={busy} onClick={async () => { if (await act({ action: 'config.import', revision: preview.revision, document, password, mode })) { setDocument(''); setPassword(''); setPreview(null); } }}>\u786E\u8BA4{mode === 'merge' ? '\u5408\u5E76' : '\u66FF\u6362'}\u5E76\u5BFC\u5165</button></section>}\n </form>\n </div>;\n}\nfunction ExpiryStatus({ route, act, busy, revision, onForce }) {\n const status = route.expiringStatus || {}, cooling = status.cooldownUntil > Date.now();\n return <div className=\"steps stack\"><p>{cooling ? `\u4E34\u671F\u4F18\u5148\u51B7\u5374\u4E2D \u00B7 \u5269\u4F59\u7EA6 ${Math.ceil((status.cooldownUntil - Date.now()) / 3600000)} \u5C0F\u65F6\uFF0C${when(status.cooldownUntil)} \u540E\u6062\u590D` : `\u4E34\u671F\u4F18\u5148\u5DF2\u5C31\u7EEA \u00B7 \u7B2C ${status.number || 1} \u8F6E${status.accounts?.length ? ` \u00B7 \u5DF2\u5B8C\u6210 ${status.completed?.length || 0} / ${status.accounts.length} \u4E2A\u8D26\u53F7` : ''}`}</p><p className=\"notice\">\u6240\u6709\u4E34\u671F\u8D26\u53F7\u7684\u79EF\u5206\u8017\u5C3D\u6216\u8FBE\u5230\u6BCF\u8F6E\u989D\u5EA6\u540E\uFF0C\u4E34\u671F\u4F18\u5148\u6682\u505C 3 \u5929\uFF1B\u671F\u95F4\u6309\u666E\u901A\u8DEF\u7531\u89C4\u5219\u8FD0\u884C\uFF0C\u91CD\u542F\u540E\u51B7\u5374\u4ECD\u4FDD\u7559\u3002</p>{cooling && <button type=\"button\" disabled={busy} onClick={async () => { const result = await act({ action: 'route.force-expiring', id: route.id, revision }); if (result) onForce?.(result); }}>\u5F3A\u5236\u5F00\u542F\u5E76\u5F00\u59CB\u65B0\u4E00\u8F6E</button>}{cooling && <p className=\"notice\">\u5F3A\u5236\u5F00\u542F\u4F1A\u6E05\u9664\u4E34\u671F\u51B7\u5374\uFF0C\u5E76\u91CD\u7F6E\u672C\u8DEF\u7531\u7684\u672C\u8F6E\u989D\u5EA6\u8BA1\u6570\uFF1B\u7D2F\u8BA1\u7528\u91CF\u4FDD\u7559\u3002</p>}</div>;\n}\nfunction FreeStatus({ route, busy, act, onUpdate }) {\n const status = route.freeStatus, accounts = status?.accounts || [], count = accounts.reduce((n, a) => n + a.models.length, 0);\n const models = status?.modelRoutes || [];\n const update = async (model, patch) => { const next = await act({ action: 'free.model.update', parentId: route.id, id: model.id, ...patch }); if (next) onUpdate?.(next); };\n return <section className=\"steps stack\"><div className=\"bar\"><h3>\u514D\u8D39\u6A21\u578B \u00B7 {models.length} \u79CD \u00B7 {count} \u4E2A\u8D26\u53F7 / \u6A21\u578B\u7EC4\u5408</h3><button type=\"button\" disabled={busy || status?.checking} onClick={() => { void act({ action: 'free.refresh' }); }}>{status?.checking ? '\u6B63\u5728\u68C0\u67E5\u2026' : '\u7ACB\u5373\u68C0\u67E5\u514D\u8D39\u6A21\u578B'}</button></div><p className=\"notice\">\u6309\u6A21\u578B\u81EA\u52A8\u521B\u5EFA\u8DEF\u7531\uFF0C\u52FE\u9009\u540E\u5206\u522B\u51FA\u73B0\u5728 DSH \u6A21\u578B\u5217\u8868\u4E2D\u3002\u540C\u4E00\u6A21\u578B\u53EA\u5728\u6709\u514D\u8D39\u8D44\u683C\u4E14\u652F\u6301\u6240\u9009\u63A8\u7406\u7B49\u7EA7\u7684\u8D26\u53F7\u95F4\u5207\u6362\uFF0C\u4E0D\u6DF7\u7528\u5176\u4ED6\u6A21\u578B\u3002\u6BCF\u5929\u68C0\u67E5\uFF0C\u8C03\u7528\u524D\u590D\u6838\uFF1B\u6062\u590D\u6536\u8D39\u6216\u68C0\u67E5\u5931\u8D25\u65F6\u81EA\u52A8\u79FB\u51FA\uFF0C\u514D\u8D39\u6062\u590D\u540E\u4FDD\u7559\u4F60\u7684\u52FE\u9009\u548C\u6863\u4F4D\u8BBE\u7F6E\u3002</p>\n <div className=\"grid\">{models.map(m => <div className=\"box stack\" key={m.id}><div className=\"bar\"><h3>{m.modelName}</h3><label className=\"check\"><input type=\"checkbox\" aria-label={`\u5C55\u793A ${m.modelName}`} disabled={busy} checked={m.selected} onChange={e => { void update(m, { visible: e.target.checked }); }} />\u5C55\u793A</label></div><p className=\"notice\">{m.name.split(' \u00B7 ').at(-1)} \u00B7 {m.accountNames.join('\u3001')}<br />\u4E0A\u4E0B\u6587 {fmt(m.contextWindow / 1000)}K \u00B7 \u8F93\u51FA {fmt(m.maxTokens / 1000)}K</p><label>\u9ED8\u8BA4\u63A8\u7406\u7B49\u7EA7 \u00B7 {m.modelName}<select disabled={busy || !m.reasoning?.supportedEfforts?.length} value={m.effortUnavailable ? '' : m.configuredEffort || ''} onChange={e => { void update(m, { reasoningEffort: e.target.value || null }); }}><option value=\"\">\u5E73\u53F0\u9ED8\u8BA4</option>{m.reasoning?.supportedEfforts?.map(e => <option key={e} value={e}>{effortNames[e] || e}</option>)}</select></label>{!m.reasoning?.supportedEfforts?.length && <p className=\"notice\">\u5E73\u53F0\u672A\u58F0\u660E\u53EF\u8C03\u6863\u4F4D\uFF0C\u4F7F\u7528\u5E73\u53F0\u9ED8\u8BA4\u3002</p>}{m.effortUnavailable && <p className=\"notice\">\u4E4B\u524D\u9009\u62E9\u7684\u6863\u4F4D\u6682\u4E0D\u53EF\u7528\uFF0C\u5F53\u524D\u4F7F\u7528\u5E73\u53F0\u9ED8\u8BA4\u3002</p>}</div>)}</div>\n {!models.length && <p className=\"notice\">\u6682\u65E0\u786E\u8BA4\u514D\u8D39\u7684\u6A21\u578B\u3002\u6DFB\u52A0\u5E76\u542F\u7528\u8D26\u53F7\uFF0C\u6216\u7ACB\u5373\u68C0\u67E5\u76EE\u5F55\u3002</p>}\n <details><summary>\u5404\u8D26\u53F7\u68C0\u67E5\u72B6\u6001</summary><div className=\"stack\" style={{ marginTop: 12 }}>{accounts.map(a => <div key={a.id}><p>{a.name} \u00B7 {a.models.length ? a.models.map(m => m.name).join('\u3001') : a.error ? '\u68C0\u67E5\u5931\u8D25\uFF0C\u6682\u4E0D\u53C2\u4E0E' : '\u6682\u65E0\u786E\u8BA4\u514D\u8D39\u7684\u6A21\u578B'}</p><p className=\"notice\">{a.provider} \u00B7 \u4E0A\u6B21\u76EE\u5F55\u68C0\u67E5 {when(a.checkedAt)}</p></div>)}</div></details>\n </section>;\n}\nfunction FreeRouteForm({ draft, setDraft, data, act, busy, error, notice }) {\n return <form onSubmit={async e => { e.preventDefault(); const { id, previousId, revision, reasoning, supportsImages, expiringStatus, freeStatus, ...route } = draft;\n route.targets = route.targets.map(t => ({ provider: t.provider, ...(t.account ? { account: t.account } : {}), ...(t.model ? { model: t.model } : {}), ...(t.models ? { models: t.models } : {}) }));\n if (await act({ action: 'route.save', id, previousId, revision, route })) setDraft(null);\n }}><div className=\"modal-body stack\"><Feedback error={error} notice={notice} /><label>\u7BA1\u7406\u7EC4\u540D\u79F0<input required maxLength={200} disabled={busy} value={draft.name} onChange={e => setDraft(d => ({ ...d, name: e.target.value }))} /></label><p className=\"notice\">Free \u7684\u6A21\u578B\u8DEF\u7531\u7531\u76EE\u5F55\u81EA\u52A8\u7EF4\u62A4\uFF0C\u65E0\u9700\u586B\u5199\u6A21\u578B ID\u3002\u8D26\u53F7\u542F\u505C\u5728\u300C\u8D26\u53F7\u4E0E\u767B\u5F55\u300D\u8C03\u6574\u3002</p><FreeStatus route={data.routes.find(r => r.id === draft.id) || draft} act={act} busy={busy} onUpdate={next => setDraft(d => ({ ...d, revision: next.revision, freeModels: next.routes.find(r => r.id === d.id)?.freeModels }))} /><label className=\"check\"><input type=\"checkbox\" checked={draft.visible !== false} disabled={busy} onChange={e => setDraft(d => ({ ...d, visible: e.target.checked }))} />\u5C55\u793A\u52FE\u9009\u7684\u514D\u8D39\u6A21\u578B</label></div><div className=\"modal-foot bar\"><button type=\"button\" disabled={busy} onClick={async () => { if (await act({ action: 'route.remove', id: draft.id, revision: draft.revision })) setDraft(null); }}>\u79FB\u9664\u514D\u8D39\u7BA1\u7406\u7EC4</button><button className=\"primary\" disabled={busy} type=\"submit\">\u4FDD\u5B58\u8BBE\u7F6E</button></div></form>;\n}\nfunction RouteForm({ draft, setDraft, data, act, busy, error, notice }) {\n if (draft.freeOnly) return <FreeRouteForm draft={draft} setDraft={setDraft} data={data} act={act} busy={busy} error={error} notice={notice} />;\n const set = (key, value) => setDraft(d => ({ ...d, [key]: value }));\n const target = (i, patch) => setDraft(d => ({ ...d, targets: d.targets.map((t, index) => i === index ? { ...t, ...patch } : t) }));\n const move = (i, delta) => { const targets = [...draft.targets]; [targets[i], targets[i + delta]] = [targets[i + delta], targets[i]]; set('targets', targets); };\n const strategyHelp = { failover: '\u4F18\u5148\u4F7F\u7528\u524D\u9762\u7684\u8D26\u53F7\uFF1B\u9047\u5230 4xx \u540E\u6362\u4E0B\u4E00\u4E2A\uFF0C\u6210\u529F\u8D26\u53F7\u7EE7\u7EED\u627F\u63A5\u8BF7\u6C42\u3002', weighted: '\u6309\u6BCF\u4E2A\u8D26\u53F7\u7684\u6743\u91CD\u5206\u914D\u8BF7\u6C42\u3002\u4F8B\u5982 3:1\uFF0C\u957F\u671F\u7EA6 75%:25%\uFF1B\u77ED\u671F\u6BD4\u4F8B\u4E0E\u8BF7\u6C42\u957F\u5EA6\u53EF\u80FD\u4E0D\u540C\u3002', tokens: '\u6BCF\u4E2A\u8D26\u53F7\u7D2F\u8BA1\u8FBE\u5230\u672C\u8F6E Token \u989D\u5EA6\u540E\uFF0C\u4E0B\u4E00\u6B21\u8BF7\u6C42\u6362\u8D26\u53F7\u3002\u6240\u6709\u76EE\u6807\u7528\u5B8C\u989D\u5EA6\u540E\u5F00\u59CB\u65B0\u4E00\u8F6E\u3002', credits: '\u6309\u5E73\u53F0\u4F59\u989D\u4E0B\u964D\u8BA1\u7B97\u672C\u8F6E\u6D88\u8017\uFF0C\u8FBE\u5230\u9608\u503C\u540E\u6362\u8D26\u53F7\u3002\u4F59\u989D\u53EF\u80FD\u5305\u542B\u5176\u4ED6\u5E94\u7528\u7684\u6D88\u8D39\uFF1B\u79EF\u5206\u67E5\u8BE2\u5931\u8D25\u65F6\u6682\u4E0D\u4F7F\u7528\u8BE5\u8D26\u53F7\u3002' };\n return <form onSubmit={async e => { e.preventDefault(); if (draft.id !== 'ds4.1f' && draft.targets.some(t => !t.modelText.trim())) { e.currentTarget.querySelector('details')?.setAttribute('open', ''); return; } const { id, previousId, revision, reasoning, supportsImages, expiringStatus, ...route } = draft;\n route.targets = route.targets.map(t => { const models = t.modelText.split(',').map(x => x.trim()).filter(Boolean); return { provider: t.provider, ...(t.account ? { account: t.account } : {}), ...(models.length ? { models } : {}), ...(route.strategy === 'weighted' ? { weight: Number(t.weight) } : {}), ...(route.strategy === 'tokens' ? { tokenBudget: Number(t.tokenBudget) } : {}), ...(route.strategy === 'credits' ? { creditBudget: Number(t.creditBudget) } : {}) }; });\n if (await act({ action: 'route.save', id, previousId, revision, route })) setDraft(null);\n }}><div className=\"modal-body stack\"><Feedback error={error} notice={notice} /><label>\u8DEF\u7531\u540D\u79F0<input required maxLength={200} value={draft.name} disabled={busy} onChange={e => set('name', e.target.value)} placeholder=\"\u4F8B\u5982 \u6211\u7684 Flash \u81EA\u52A8\u5207\u6362\" /></label><p className=\"notice\">\u540D\u79F0\u663E\u793A\u5728 DSH \u6A21\u578B\u5217\u8868\u4E2D\uFF0C\u53EF\u968F\u65F6\u4FEE\u6539\uFF0C\u4E0D\u5F71\u54CD\u5DF2\u6709\u4F1A\u8BDD\u7684\u8DEF\u7531\u9009\u62E9\u3002</p>\n <label>\u8D26\u53F7\u5207\u6362\u89C4\u5219<select disabled={busy} value={draft.strategy} onChange={e => set('strategy', e.target.value)}>{Object.entries(strategies).map(([id, label]) => <option key={id} value={id}>{label}</option>)}</select></label><p className=\"steps\">{strategyHelp[draft.strategy]}{['tokens', 'credits'].includes(draft.strategy) && ' \u6B63\u5728\u8F93\u51FA\u7684\u56DE\u7B54\u4F1A\u5B8C\u6210\uFF0C\u989D\u5EA6\u5141\u8BB8\u8D85\u8FC7\u6700\u540E\u4E00\u6B21\u8BF7\u6C42\u7684\u7528\u91CF\u3002'}</p>\n <div className=\"box stack\"><label className=\"check\"><input type=\"checkbox\" disabled={busy} checked={draft.preferExpiringCredits !== false} onChange={e => set('preferExpiringCredits', e.target.checked)} />\u4F18\u5148\u4F7F\u7528\u4E34\u671F\u79EF\u5206\uFF08\u9ED8\u8BA4\u5F00\u542F\uFF09</label><p className=\"notice\">\u4F18\u5148\u4F7F\u7528\u4ECD\u6709\u4F59\u989D\u4E14\u66F4\u65E9\u5230\u671F\u7684\u79EF\u5206\u5305\uFF1B\u4F18\u5148\u7EA7\u9AD8\u4E8E\u987A\u5E8F\u548C\u6743\u91CD\uFF0C\u4ECD\u9075\u5B88\u6BCF\u8F6E\u989D\u5EA6\u4E0E\u6545\u969C\u5207\u6362\u3002\u5E73\u53F0\u672A\u63D0\u4F9B\u6709\u6548\u671F\u6216\u7528\u91CF\u6570\u636E\u8FC7\u671F\u65F6\uFF0C\u6309\u666E\u901A\u89C4\u5219\u6267\u884C\u3002</p>{draft.preferExpiringCredits !== false && <label>\u4E34\u671F\u8303\u56F4\uFF08\u5929\uFF09<input type=\"number\" disabled={busy} min=\"1\" max=\"365\" required value={draft.expiringWithinDays ?? 7} onChange={e => set('expiringWithinDays', Number(e.target.value))} /></label>}</div>\n {draft.preferExpiringCredits !== false && <ExpiryStatus route={data.routes.find(r => r.id === draft.previousId) || draft} busy={busy} act={act} revision={draft.revision} onForce={result => setDraft(d => ({ ...d, revision: result.revision, expiringStatus: result.routes.find(r => r.id === draft.previousId)?.expiringStatus }))} />}\n <div className=\"bar\"><h3>\u6A21\u578B\u4E0E\u8D26\u53F7\u76EE\u6807</h3><span className=\"notice\">\u6309\u4E0B\u65B9\u987A\u5E8F\u5207\u6362</span></div>\n {draft.targets.map((t, i) => { const models = data.providers.find(p => p.id === t.provider)?.models || []; return <section className=\"box stack\" key={t.key}><div className=\"bar target-head\"><strong>\u76EE\u6807 {i + 1}</strong><div className=\"row\"><button type=\"button\" disabled={busy || i === 0} onClick={() => move(i, -1)}>\u524D\u79FB</button><button type=\"button\" disabled={busy || i === draft.targets.length - 1} onClick={() => move(i, 1)}>\u540E\u79FB</button><button type=\"button\" disabled={busy || draft.targets.length === 1} onClick={() => set('targets', draft.targets.filter((_, index) => index !== i))}>\u79FB\u9664</button></div></div>\n <div className=\"grid\"><label>\u4F9B\u5E94\u5546<select disabled={busy} value={t.provider} onChange={e => target(i, { provider: e.target.value, account: '', modelText: '' })}>{data.providers.map(p => <option key={p.id} value={p.id}>{p.name}</option>)}</select></label><label>\u4F7F\u7528\u8D26\u53F7<select disabled={busy} value={t.account || ''} onChange={e => target(i, { account: e.target.value })}><option value=\"\">\u6B64\u4F9B\u5E94\u5546\u5168\u90E8\u542F\u7528\u8D26\u53F7</option>{data.accounts.filter(a => a.provider === t.provider).map(a => <option key={a.id} value={a.id}>{a.name}</option>)}</select></label>\n <label className=\"full\">\u76EE\u6807\u6A21\u578B<select disabled={busy} required={draft.id !== 'ds4.1f'} value={t.modelText} onChange={e => { if (e.target.value) target(i, { modelText: e.target.value }); }}><option value=\"\">\u4ECE\u5DF2\u53D1\u73B0\u6A21\u578B\u4E2D\u9009\u62E9</option>{t.modelText && !models.some(m => m.id === t.modelText) && <option value={t.modelText}>{t.modelText}</option>}{models.map(m => <option key={m.id} value={m.id}>{m.name} \u00B7 {m.id}</option>)}</select></label>\n {draft.strategy === 'weighted' && <label>\u6BCF\u4E2A\u8D26\u53F7\u7684\u6743\u91CD<input type=\"number\" disabled={busy} min=\"1\" max=\"1000\" required value={t.weight} onChange={e => target(i, { weight: e.target.value })} /></label>}\n {draft.strategy === 'tokens' && <label>\u6BCF\u4E2A\u8D26\u53F7\u6BCF\u8F6E Token \u989D\u5EA6<input type=\"number\" disabled={busy} min=\"1\" step=\"1\" required value={t.tokenBudget} onChange={e => target(i, { tokenBudget: e.target.value })} /></label>}\n {draft.strategy === 'credits' && <label>\u6BCF\u4E2A\u8D26\u53F7\u6BCF\u8F6E\u79EF\u5206\u6D88\u8017<input type=\"number\" disabled={busy} min=\"0.01\" step=\"any\" required value={t.creditBudget} onChange={e => target(i, { creditBudget: e.target.value })} /></label>}\n </div><details><summary>\u9AD8\u7EA7\uFF1A\u624B\u52A8\u586B\u5199\u5019\u9009\u6A21\u578B ID</summary><label style={{ marginTop: 10 }}>\u5019\u9009\u6A21\u578B ID\uFF08\u9017\u53F7\u5206\u9694\uFF09<input disabled={busy} value={t.modelText} onChange={e => target(i, { modelText: e.target.value })} placeholder=\"\u6309\u987A\u5E8F\u5339\u914D\u771F\u5B9E\u6A21\u578B\u76EE\u5F55\" /></label></details>\n </section>; })}\n <button type=\"button\" disabled={busy} onClick={() => set('targets', [...draft.targets, { provider: 'workbuddy', account: '', key: crypto.randomUUID(), weight: 1, tokenBudget: 100000, creditBudget: 100, modelText: '' }])}>\u6DFB\u52A0\u5207\u6362\u76EE\u6807</button>\n <details><summary>\u9AD8\u7EA7\uFF1A\u4E0A\u4E0B\u6587\u4E0E\u8F93\u51FA\u957F\u5EA6</summary><div className=\"grid\" style={{ marginTop: 12 }}><label>\u4E0A\u4E0B\u6587\u957F\u5EA6<input type=\"number\" disabled={busy} min=\"1\" required value={draft.contextWindow} onChange={e => set('contextWindow', Number(e.target.value))} /></label><label>\u6700\u5927\u8F93\u51FA\u957F\u5EA6<input type=\"number\" disabled={busy} min=\"1\" max={draft.contextWindow} required value={draft.maxTokens} onChange={e => set('maxTokens', Number(e.target.value))} /></label></div></details>\n </div><div className=\"modal-foot bar\">{draft.previousId ? <button type=\"button\" disabled={busy} onClick={async () => { if (await act({ action: 'route.remove', revision: draft.revision, id: draft.previousId })) setDraft(null); }}>\u79FB\u9664\u8DEF\u7531</button> : <button disabled={busy} type=\"button\" onClick={() => setDraft(null)}>\u53D6\u6D88</button>}<button className=\"primary\" type=\"submit\" disabled={busy}>{busy ? '\u6B63\u5728\u4FDD\u5B58\u2026' : '\u4FDD\u5B58\u8DEF\u7531'}</button></div>\n </form>;\n}\n\nexport function InitialSetup({ data, busy, act, go }) {\n const discovery = data.localDiscovery ?? [];\n const discovering = data.startup?.phase === 'discovering';\n const saved = discovery.reduce((n, s) => n + (s.savedCount ?? 0), 0);\n return <section className=\"box stack\" aria-label=\"\u9996\u6B21\u8D26\u53F7\u8BBE\u7F6E\"><div className=\"bar\"><div><h3>\u672C\u673A\u8D26\u53F7\u81EA\u52A8\u83B7\u53D6{discovering ? '\u8FDB\u884C\u4E2D' : discovery.length ? '\u5DF2\u5B8C\u6210' : '\u5F85\u91CD\u8BD5'}</h3><p className=\"notice\">{discovering ? '\u6B63\u5728\u540E\u53F0\u8BFB\u53D6 WorkBuddy / Trae \u672C\u673A\u767B\u5F55\uFF0C\u65E0\u9700\u624B\u52A8\u91CD\u590D\u83B7\u53D6\uFF0C\u5DF2\u6709\u8D26\u53F7\u53EF\u4EE5\u7EE7\u7EED\u4F7F\u7528\u3002' : saved ? `\u5DF2\u4FDD\u5B58 ${saved} \u4E2A WorkBuddy / Trae \u672C\u673A\u767B\u5F55\uFF0C\u65E0\u9700\u518D\u6B21\u624B\u52A8\u6DFB\u52A0\u3002` : '\u6682\u672A\u4FDD\u5B58\u672C\u673A\u767B\u5F55\u3002\u5148\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u767B\u5F55\uFF0C\u518D\u70B9\u51FB\u300C\u4E00\u952E\u83B7\u53D6\u5E76\u4FDD\u5B58\u300D\u3002'}</p></div><button disabled={busy} onClick={() => { void act({ action: 'setup.dismiss' }); }}>\u77E5\u9053\u4E86</button></div>\n <div className=\"providers\">{discovery.map(s => <div className=\"steps\" key={s.provider}><strong>{data.providers.find(p => p.id === s.provider)?.name ?? s.provider}</strong><p className={(s.savedCount ?? 0) > 0 ? 'good' : 'notice'}>{s.savedCount ? `\u5DF2\u4FDD\u5B58 ${s.savedCount} \u4E2A\u767B\u5F55` : s.state === 'found' ? '\u68C0\u6D4B\u5230\u767B\u5F55\uFF1B\u5DF2\u5FFD\u7565\u6216\u5C1A\u672A\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6' : s.state === 'unreadable' ? '\u767B\u5F55\u6587\u4EF6\u65E0\u6CD5\u8BFB\u53D6\uFF0C\u8BF7\u5728\u5BA2\u6237\u7AEF\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u8BD5' : '\u672A\u68C0\u6D4B\u5230\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55\u5B98\u65B9\u5BA2\u6237\u7AEF'}</p></div>)}</div>\n <div className=\"row\"><button className=\"primary\" disabled={busy || discovering} onClick={() => { void act({ action: 'accounts.discover' }); }}>\u4E00\u952E\u83B7\u53D6\u5E76\u4FDD\u5B58 WorkBuddy / Trae</button><button disabled={busy} onClick={() => go('accounts')}>\u67E5\u770B\u8D26\u53F7 / \u624B\u52A8\u6DFB\u52A0</button><button disabled={busy} onClick={() => go('routes')}>\u9009\u62E9\u8DEF\u7531\u6A21\u578B</button></div><p className=\"notice\">\u9996\u6B21\u542F\u52A8\u81EA\u52A8\u6267\u884C\u4E00\u6B21\uFF0C\u4E4B\u540E\u6BCF\u5206\u949F\u68C0\u6D4B\u65B0\u589E\u767B\u5F55\u3002Qoder \u4F7F\u7528 PAT\uFF0C\u8BF7\u5230\u300C\u8D26\u53F7\u4E0E\u767B\u5F55\u300D\u6DFB\u52A0\uFF1B\u672A\u5B89\u88C5\u5BA2\u6237\u7AEF\u4E5F\u53EF\u4EE5\u624B\u52A8\u586B\u5199\u51ED\u8BC1\u3002</p>\n </section>;\n}\nconst updateNames = { unchecked: '\u5F85\u68C0\u67E5', available: '\u53EF\u66F4\u65B0', current: '\u5DF2\u540C\u6B65', pinned: '\u56FA\u5B9A\u63D0\u4EA4', unsupported: '\u672C\u5730\u6765\u6E90', failed: '\u68C0\u67E5 / \u5B89\u88C5\u5931\u8D25', installed: '\u5DF2\u5B89\u88C5' };\nexport function PluginUpdatesPanel({ data, busy, act }) {\n const [query, setQuery] = useState(''), [selected, setSelected] = useState([]), [plan, setPlan] = useState(null), [registry, setRegistry] = useState(''), [filter, setFilter] = useState('all'), [pluginSearch, setPluginSearch] = useState('');\n const running = data?.job?.state === 'running', blocked = busy || running;\n const rows = (data?.rows ?? []).filter(r => r.source.kind !== 'builtin'), available = rows.filter(r => r.status === 'available' || r.status === 'failed' && r.target);\n useEffect(() => { if (data?.available && !running) void act({ action: !data.checkedAt || Date.now() - data.checkedAt > 86400000 ? 'plugins.check' : 'plugins.list' }); }, []);\n const chosen = available.filter(r => selected.includes(r.name));\n const visibleRows = rows.filter(r => r.name.toLowerCase().includes(pluginSearch.toLowerCase()) && (filter === 'all' || (filter === 'updates' ? available.includes(r) : r.source.kind === filter)));\n async function submitPlan() {\n if (await act(plan.kind === 'install' ? { action: 'plugins.install', spec: plan.spec, registry: registry || undefined } : { action: 'plugins.update', names: plan.rows.map(r => r.name), registry: registry || undefined })) { setPlan(null); setSelected([]); }\n }\n if (!data?.available) return <section className=\"box stack\"><h3>\u5F53\u524D DSH \u672A\u63D0\u4F9B\u63D2\u4EF6\u7BA1\u7406\u63A5\u53E3</h3><p>\u8BF7\u5347\u7EA7 DeepSeek Harness \u540E\u91CD\u8BD5\u3002\u672C\u9875\u7BA1\u7406\u5F53\u524D DSH \u914D\u7F6E\u4E2D\u7531\u7528\u6237\u5B89\u88C5\u7684\u63D2\u4EF6\u3002</p></section>;\n return <div className=\"stack\"><section className=\"box stack\"><div className=\"bar\"><div><h3>\u7528\u6237\u5B89\u88C5\u7684\u63D2\u4EF6\u4E0E\u66F4\u65B0</h3><p className=\"notice\">npm \u6309\u7248\u672C / \u53D1\u5E03\u9891\u9053\u68C0\u67E5\uFF1BGitHub \u6309\u5206\u652F\u63D0\u4EA4\u68C0\u67E5\uFF0C\u7248\u672C\u53F7\u4E0D\u53D8\u4E5F\u80FD\u53D1\u73B0\u66F4\u65B0\u3002</p></div><button className=\"primary\" disabled={blocked} onClick={() => { void act({ action: 'plugins.check' }); }}>\u68C0\u67E5\u5168\u90E8\u66F4\u65B0</button></div>\n <div className=\"bar\"><p className=\"notice\">{rows.length} \u4E2A\u7528\u6237\u5B89\u88C5\u63D2\u4EF6 \u00B7 {available.length} \u4E2A\u53EF\u66F4\u65B0 \u00B7 \u4E0A\u6B21\u68C0\u67E5 {when(data.checkedAt)}</p><label className=\"filter\">npm \u5B89\u88C5\u6E90<select value={registry} disabled={blocked} onChange={e => setRegistry(e.target.value)}><option value=\"\">DSH \u8BBE\u7F6E\uFF08\u542B\u56DE\u9000\u6765\u6E90\uFF09</option><option value=\"https://registry.npmjs.org/\">npm \u5B98\u65B9</option><option value=\"https://registry.npmmirror.com/\">npmmirror</option></select></label></div>\n <p className=\"notice\">\u66F4\u65B0\u6CBF\u7528\u539F npm / GitHub \u6765\u6E90\uFF0C\u5E76\u4FDD\u7559\u542F\u7528\u72B6\u6001\uFF1Bnpm \u56FA\u5B9A\u7248\u672C\u548C\u8303\u56F4\u5347\u7EA7\u5230\u6240\u5728\u9891\u9053\u7684\u6700\u65B0\u7248\u672C\uFF0CGit \u56FA\u5B9A\u63D0\u4EA4\u4FDD\u6301\u4E0D\u52A8\u3002</p>\n </section>\n {data.job && !(data.job.kind === 'check' && data.job.state === 'done') && <section className=\"box stack\" aria-live=\"polite\"><div className=\"bar\"><h3>{running ? data.job.kind === 'check' ? '\u6B63\u5728\u68C0\u67E5\u66F4\u65B0\u2026' : '\u6B63\u5728\u5B89\u88C5\u63D2\u4EF6\u2026' : data.job.state === 'cancelled' ? '\u64CD\u4F5C\u5DF2\u53D6\u6D88' : data.job.state === 'failed' ? '\u64CD\u4F5C\u672A\u5B8C\u6210' : '\u64CD\u4F5C\u5DF2\u5B8C\u6210'}</h3>{running && <button disabled={busy} onClick={() => { void act({ action: 'plugins.cancel' }); }}>\u53D6\u6D88</button>}</div><progress max={Math.max(1, data.job.total)} value={data.job.results.length} aria-label=\"\u63D2\u4EF6\u64CD\u4F5C\u8FDB\u5EA6\" /><p className=\"notice\">{data.job.results.length} / {data.job.total}{data.job.current ? ` \u00B7 ${data.job.current}` : ''}</p>\n {data.job.message && <p className=\"error\">{data.job.message}</p>}{data.job.results.map((r, i) => <div key={r.name + i} className=\"item\"><strong>{r.name}</strong><p className={r.status === 'failed' ? 'error' : 'notice'}>{r.message || updateNames[r.status] || r.status}</p>{r.pendingBuilds?.length > 0 && <p className=\"notice\">\u5F85\u6388\u6743\u811A\u672C\uFF1A{r.pendingBuilds.join('\u3001')}\u3002\u8BF7\u5728 DSH \u539F\u63D2\u4EF6\u5B89\u88C5\u9875\u6388\u6743\u540E\u91CD\u8BD5\u3002</p>}</div>)}\n {data.job.results.some(r => r.restartRequired) && <p className=\"steps\">\u66F4\u65B0\u6587\u4EF6\u5DF2\u5B89\u88C5\u3002macOS \u4F7F\u7528 \u2318Q \u5B8C\u5168\u9000\u51FA DSH \u540E\u91CD\u5F00\uFF1BWindows \u9000\u51FA\u6258\u76D8\u5E94\u7528\u540E\u91CD\u5F00\uFF1B\u7F51\u9875\u7248\u91CD\u542F\u670D\u52A1\u3002\u5173\u95ED\u7A97\u53E3\u548C\u300C\u5237\u65B0\u9762\u677F\u300D\u4E0D\u4F1A\u91CD\u8F7D\u540E\u53F0\u3002</p>}\n </section>}\n <section className=\"box stack\"><div className=\"bar\"><div className=\"row\"><button disabled={blocked || !available.length} onClick={() => setSelected(available.map(r => r.name))}>\u9009\u62E9\u5168\u90E8\u53EF\u66F4\u65B0</button><button disabled={blocked || !selected.length} onClick={() => setSelected([])}>\u6E05\u7A7A\u9009\u62E9</button></div><button className=\"primary\" disabled={blocked || !chosen.length} onClick={() => setPlan({ kind: 'update', rows: chosen })}>\u66F4\u65B0\u6240\u9009\uFF08{chosen.length}\uFF09</button></div>\n <div className=\"row\"><label style={{ flex: 1 }}>\u641C\u7D22\u5DF2\u5B89\u88C5\u63D2\u4EF6<input value={pluginSearch} onChange={e => setPluginSearch(e.target.value)} placeholder=\"\u6309\u63D2\u4EF6\u540D\u79F0\u7B5B\u9009\" /></label><label className=\"filter\">\u663E\u793A\u8303\u56F4<select value={filter} onChange={e => setFilter(e.target.value)}><option value=\"all\">\u5168\u90E8\u7528\u6237\u5B89\u88C5\u63D2\u4EF6</option><option value=\"updates\">\u53EF\u66F4\u65B0 / \u91CD\u8BD5</option><option value=\"npm\">npm \u6765\u6E90</option><option value=\"github\">GitHub \u6765\u6E90</option></select></label></div>\n <div className=\"scroll\" role=\"region\" aria-label=\"\u7528\u6237\u5B89\u88C5\u63D2\u4EF6\u5217\u8868\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u63D2\u4EF6 / \u9009\u62E9</th><th scope=\"col\">\u6765\u6E90\u4E0E\u7248\u672C</th><th scope=\"col\">\u72B6\u6001</th><th scope=\"col\" className=\"cell-actions\">\u64CD\u4F5C</th></tr></thead><tbody>{visibleRows.map(r => <tr key={r.name} className={selected.includes(r.name) ? 'selected' : ''}><td><label className=\"check\"><input aria-label={`\u9009\u62E9\u66F4\u65B0 ${r.name}`} type=\"checkbox\" disabled={blocked || !available.includes(r)} checked={selected.includes(r.name)} onChange={e => setSelected(e.target.checked ? [...selected, r.name] : selected.filter(n => n !== r.name))} /><strong className=\"mono\">{r.name}</strong></label><small className=\"muted\">{r.enabled ? '\u542F\u7528' : '\u505C\u7528'}</small></td><td>{r.source.kind === 'npm' ? `npm \u00B7 ${r.version || '\u672A\u77E5'}${r.latestVersion ? ' \u2192 ' + r.latestVersion : ''}` : r.source.kind === 'github' ? `GitHub \u00B7 ${r.version || '\u672A\u77E5\u7248\u672C'}` : '\u672C\u5730\u6587\u4EF6 / \u5F00\u53D1\u94FE\u63A5'}<small className=\"muted mono\">{r.source.kind === 'npm' ? r.source.tag : r.source.kind === 'github' ? `${r.commit?.slice(0, 8) || '\u672A\u77E5\u63D0\u4EA4'}${r.latestCommit ? ' \u2192 ' + r.latestCommit.slice(0, 8) : ''}` : ''}</small></td><td><span className={r.status === 'failed' ? 'error' : r.status === 'available' ? 'good' : 'muted'}>{updateNames[r.status]}</span>{r.message && <small className={r.status === 'failed' ? 'error' : 'muted'}>{r.message}</small>}</td><td className=\"cell-actions\">{available.includes(r) ? <button disabled={blocked} onClick={() => setPlan({ kind: 'update', rows: [r] })}>\u67E5\u770B\u5E76\u66F4\u65B0</button> : '\u2014'}</td></tr>)}</tbody></table>{!visibleRows.length && <p className=\"empty\">{running ? '\u6B63\u5728\u8BFB\u53D6\u63D2\u4EF6\u6E05\u5355\u2026' : rows.length ? '\u6CA1\u6709\u5339\u914D\u7684\u5DF2\u5B89\u88C5\u63D2\u4EF6\uFF0C\u8BF7\u8C03\u6574\u7B5B\u9009\u3002' : '\u5F53\u524D\u914D\u7F6E\u5C1A\u672A\u8BFB\u53D6\u63D2\u4EF6\uFF0C\u8BF7\u68C0\u67E5\u66F4\u65B0\u3002'}</p>}</div>\n </section>\n <section className=\"box stack\"><h3>\u5B89\u88C5 npm / GitHub \u63D2\u4EF6</h3><form className=\"row\" onSubmit={e => { e.preventDefault(); const spec = new FormData(e.currentTarget).get('spec').trim(); if (spec) setPlan({ kind: 'install', spec }); }}><label style={{ flex: 1 }}>\u5B89\u88C5\u5730\u5740<input name=\"spec\" value={query} onChange={e => setQuery(e.target.value)} disabled={blocked} required placeholder=\"\u5305\u540D\u3001\u5305\u540D@\u7248\u672C \u6216 github:\u7528\u6237/\u4ED3\u5E93\" autoComplete=\"off\" /></label><button disabled={blocked || !query.trim()}>\u67E5\u770B\u5E76\u5B89\u88C5</button></form><p className=\"notice\">\u4F7F\u7528 DSH \u81EA\u5E26\u5B89\u88C5\u5668\u6267\u884C\u517C\u5BB9\u68C0\u67E5\u3001\u955C\u50CF\u91CD\u8BD5\u548C\u5931\u8D25\u56DE\u6EDA\u3002npm \u955C\u50CF\u53EA\u4F5C\u7528\u4E8E npm \u5305\uFF0CGitHub \u4E0B\u8F7D\u5931\u8D25\u9700\u68C0\u67E5 GitHub \u7F51\u7EDC\u3002\u7F51\u7EDC\u5931\u8D25\u540E\u53EF\u91CD\u65B0\u68C0\u67E5\u6216\u66F4\u6362 npm \u5B89\u88C5\u6E90\u518D\u91CD\u8BD5\u3002</p></section>\n {plan && <Modal title={plan.kind === 'install' ? '\u786E\u8BA4\u5B89\u88C5\u63D2\u4EF6' : '\u786E\u8BA4\u66F4\u65B0\u63D2\u4EF6'} close={() => setPlan(null)} busy={blocked}><div className=\"modal-body stack\"><p>\u8FD9\u4E9B\u64CD\u4F5C\u4F5C\u7528\u4E8E\u5F53\u524D DSH \u914D\u7F6E\u7684\u6240\u6709\u4F1A\u8BDD\u3002\u5B89\u88C5\u540E\u662F\u5426\u9700\u8981\u91CD\u542F\uFF0C\u4F1A\u5728\u7ED3\u679C\u4E2D\u8BF4\u660E\u3002</p>{plan.kind === 'install' ? <p className=\"mono\">{plan.spec}</p> : plan.rows.map(r => <div className=\"steps\" key={r.name}><strong>{r.name}</strong><p className=\"mono\">{r.target}</p><p>{r.source.kind === 'npm' ? `${r.version || '\u672A\u77E5'} \u2192 ${r.latestVersion}` : `${r.commit?.slice(0, 8) || '\u672A\u77E5\u63D0\u4EA4'} \u2192 ${r.latestCommit?.slice(0, 8) || '\u672A\u77E5\u63D0\u4EA4'}`}</p><p className=\"notice\">\u4FDD\u7559\u4E3A{r.enabled ? '\u542F\u7528' : '\u505C\u7528'}\uFF1B{r.source.kind === 'github' ? '\u7EE7\u7EED\u8DDF\u968F\u539F\u5206\u652F / \u6807\u7B7E' : '\u66F4\u65B0\u5230\u6240\u793A npm \u7248\u672C'}\u3002</p></div>)}<p className=\"notice\">npm \u5B89\u88C5\u6E90\uFF1A{registry || '\u6CBF\u7528 DSH \u8BBE\u7F6E'}</p></div><div className=\"modal-foot row\"><button className=\"primary\" disabled={blocked} onClick={() => { void submitPlan(); }}>\u786E\u8BA4{plan.kind === 'install' ? '\u5B89\u88C5' : '\u66F4\u65B0'}</button><button disabled={blocked} onClick={() => setPlan(null)}>\u53D6\u6D88</button></div></Modal>}\n </div>;\n}\n", "{\n \"name\": \"dsh-multi-router\",\n \"version\": \"0.5.8\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AndroidSix/dsh-multi-router.git\"\n },\n \"description\": \"Multi-account WorkBuddy, Trae and Qoder routing for DeepSeek Harness\",\n \"type\": \"module\",\n \"main\": \"lib/index.js\",\n \"bin\": {\n \"dsh-multi-router\": \"lib/cli.js\"\n },\n \"exports\": {\n \".\": \"./lib/index.js\",\n \"./host\": \"./lib/host.js\",\n \"./client\": \"./lib/client.js\",\n \"./cordis.patch.yml\": \"./cordis.patch.yml\",\n \"./package.json\": \"./package.json\"\n },\n \"engines\": {\n \"node\": \"^22.19.0 || >=24.0.0\"\n },\n \"files\": [\n \"lib\",\n \"cordis.patch.yml\",\n \"README.md\",\n \"LICENSE\",\n \"THIRD_PARTY_NOTICES.md\",\n \"upstream-lock.json\",\n \"router.example.json\",\n \"CHANGELOG.md\"\n ],\n \"dsh\": {\n \"bundle\": {\n \"patch\": \"./cordis.patch.yml\"\n },\n \"client\": {\n \"inject\": [\n \"@deepseek-ai/dsh-client-ui-renderer\"\n ],\n \"platform\": \"web\"\n }\n },\n \"scripts\": {\n \"build\": \"node scripts/build.mjs\",\n \"test\": \"node --test tests/*.test.mjs\",\n \"check\": \"npm run build && npm test\",\n \"pack:release\": \"npm run build && npm pack --ignore-scripts\",\n \"fetch-upstream\": \"node scripts/fetch-upstream.mjs\"\n },\n \"dependencies\": {\n \"@earendil-works/pi-ai\": \"0.87.1\",\n \"yaml\": \"2.9.1\"\n },\n \"peerDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-attachment\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-home-paths\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-llm\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-llm-pi-ai\": \"0.2.0-rc.2\",\n \"@deepseek-ai/schemastery\": \"^3.18.4\",\n \"react\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-attachment\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-home-paths\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-llm\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-llm-pi-ai\": \"0.2.0-rc.2\",\n \"@deepseek-ai/schemastery\": \"^3.18.4\",\n \"esbuild\": \"^0.25.0\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"license\": \"MIT\",\n \"keywords\": [\n \"dsh-plugin\",\n \"deepseek-harness\",\n \"multi-account\",\n \"model-router\",\n \"plugin-updater\"\n ]\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { useEffect, useRef, useState } from 'react';\nimport { version as pluginVersion } from '../package.json';\nexport const name = 'dsh-multi-router-client';\nexport const inject = ['slots'];\nconst ENDPOINT = '/.well-known/dsh-multi-router';\nlet reloadFromHost;\nexport async function requestPluginReload(remote) {\n if (!remote?.pluginManager?.setBundleEnabled) throw Error('\u5F53\u524D DSH \u672A\u63D0\u4F9B\u91CD\u65B0\u52A0\u8F7D\u63A5\u53E3\uFF0C\u8BF7\u5347\u7EA7 DSH \u6216\u5728\u63D2\u4EF6\u9875\u5173\u95ED\u540E\u91CD\u65B0\u542F\u7528\u672C\u63D2\u4EF6\u3002');\n const answer = await remote.pluginManager.setBundleEnabled('dsh-multi-router', true);\n const result = answer?.ok === true ? answer.value : answer;\n if (answer?.ok === false || result?.application !== 'applied') throw Error('DSH \u672A\u80FD\u5373\u65F6\u91CD\u8F7D\uFF0C\u8BF7\u68C0\u67E5\u7EC4\u4EF6\u9519\u8BEF\uFF1B\u4E0D\u652F\u6301\u70ED\u52A0\u8F7D\u7684\u65E7\u7248 DSH \u4ECD\u9700\u91CD\u542F\u3002');\n}\nexport const backendNeedsRestart = data => !!data && data.pluginVersion !== pluginVersion;\nexport function RestartGuidance({ data, retry, reload, busy }) {\n return <section className=\"box stack\" role=\"alert\"><h3>\u63D2\u4EF6\u6B63\u5728\u8FDE\u63A5\u6216\u540C\u6B65\u7248\u672C</h3>\n <p>{data ? `\u9762\u677F v${pluginVersion}\uFF0C\u8FD0\u884C\u4E2D\u7684\u540E\u53F0 v${data.pluginVersion || '\u65E7\u7248'}\u3002\u6B63\u5728\u7B49\u5F85 DSH \u540C\u6B65\u65B0\u7248\u672C\u3002` : '\u6682\u65F6\u65E0\u6CD5\u8FDE\u63A5\u63D2\u4EF6\u540E\u53F0\u3002\u5B89\u88C5\u6216\u66F4\u65B0\u540E\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF0C\u4E5F\u53EF\u4EE5\u53EA\u91CD\u65B0\u52A0\u8F7D\u672C\u63D2\u4EF6\u3002'}</p>\n <div className=\"row\"><button disabled={busy} onClick={reload}>\u91CD\u65B0\u52A0\u8F7D\u63D2\u4EF6</button><button disabled={busy} onClick={retry}>\u91CD\u65B0\u8FDE\u63A5</button></div>\n <details><summary>\u4ECD\u65E0\u6CD5\u8FDE\u63A5\uFF1F</summary><p className=\"notice\">\u5148\u68C0\u67E5\u4E0B\u65B9\u7EC4\u4EF6\u7684\u542F\u7528\u9519\u8BEF\u3002\u65E7\u7248 DSH \u82E5\u4E0D\u652F\u6301\u8FD0\u884C\u4E2D\u91CD\u8F7D\uFF0C\u53EF\u5347\u7EA7 DSH\uFF0C\u6216\u901A\u8FC7\u300C\u9000\u51FA DeepSeek Harness\u300D\u5B8C\u5168\u9000\u51FA\u540E\u91CD\u65B0\u6253\u5F00\u3002\u5173\u95ED\u7A97\u53E3\u4E0D\u7B49\u4E8E\u9000\u51FA\uFF0C\u8D26\u53F7\u3001\u8DEF\u7531\u4E0E\u7528\u91CF\u4F1A\u4FDD\u7559\u3002</p></details></section>;\n}\nexport async function readManagementResponse(res) {\n let next;\n try { next = JSON.parse(await res.text()); } catch {\n throw Error(`\u63D2\u4EF6\u540E\u53F0\u672A\u5C31\u7EEA\uFF08HTTP ${res.status}\uFF09\u3002\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\uFF1B\u82E5\u6301\u7EED\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u52A0\u8F7D\u63D2\u4EF6\u5E76\u68C0\u67E5\u7EC4\u4EF6\u9519\u8BEF\u3002`);\n }\n if (!next || typeof next !== 'object' || Array.isArray(next)) throw Error('\u63D2\u4EF6\u540E\u53F0\u8FD4\u56DE\u4E86\u65E0\u6548\u6570\u636E\uFF0C\u8BF7\u5237\u65B0\u9762\u677F\u6216\u91CD\u542F DSH\u3002');\n if (!res.ok) throw Error(next.error || `\u64CD\u4F5C\u5931\u8D25\uFF08HTTP ${res.status}\uFF09`);\n return next;\n}\nconst fmt = n => typeof n === 'number' ? new Intl.NumberFormat('zh-CN', { maximumFractionDigits: 2 }).format(n) : '\u2014';\nconst when = n => n ? new Date(n).toLocaleString('zh-CN', { hour12: false }) : '\u5C1A\u672A\u83B7\u53D6';\nconst strategies = { failover: '\u6545\u969C\u5207\u6362', weighted: '\u6309\u6743\u91CD\u5206\u914D', tokens: '\u6309 Token \u989D\u5EA6\u8F6E\u6362', credits: '\u6309\u79EF\u5206\u6D88\u8017\u8F6E\u6362' };\nconst loginNames = { valid: '\u767B\u5F55\u6709\u6548', configured: '\u5DF2\u4FDD\u5B58 PAT', 'refresh-needed': '\u7B49\u5F85\u5237\u65B0', expired: '\u767B\u5F55\u5DF2\u8FC7\u671F', missing: '\u672A\u83B7\u53D6\u767B\u5F55\u4FE1\u606F' };\nconst effortNames = { off: '\u5173\u95ED\u601D\u8003 \u00B7 Off', minimal: '\u6700\u4F4E \u00B7 Minimal', low: '\u4F4E \u00B7 Low', medium: '\u4E2D \u00B7 Medium', high: '\u9AD8 \u00B7 High', xhigh: '\u8D85\u9AD8 \u00B7 XHigh', max: '\u6700\u9AD8 \u00B7 Max' };\nfunction downloadJson(exported) {\n const url = URL.createObjectURL(new Blob([JSON.stringify(exported.document, null, 2)], { type: 'application/json' }));\n const a = document.createElement('a'); a.href = url; a.download = exported.filename; document.body.append(a); a.click(); a.remove(); setTimeout(() => URL.revokeObjectURL(url), 10000);\n}\nconst styles = `\n.mr{--mr-accent:var(--dsw-alias-state-active-primary,#3a71db);--mr-border:var(--dsw-alias-border-l2,#444);--mr-bg:var(--dsw-alias-bg-layer-1,#202020);--mr-card:var(--dsw-alias-bg-module-platform,#282828);--mr-text:var(--dsw-alias-label-primary,#f4f4f4);--mr-muted:var(--dsw-alias-label-secondary,#b0b0b0);color:var(--mr-text);font:inherit;font-size:14px;line-height:1.6;max-width:1120px}\n.mr *{box-sizing:border-box}.mr h2,.mr h3,.mr p{margin:0}.mr h2{font-size:22px}.mr h3{font-size:16px}.mr small,.mr .muted,.mr .notice{color:var(--mr-muted)}.mr .notice{font-size:13px}.mr .mono{font:12px ui-monospace,monospace;overflow-wrap:anywhere}\n.mr .bar,.mr .row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.mr .bar{justify-content:space-between}.mr .stack{display:flex;flex-direction:column;gap:16px}.mr .grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.mr .metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}.mr .providers{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.mr .full{grid-column:1/-1}\n.mr .box{border:1px solid var(--mr-border);border-radius:12px;padding:20px;background:var(--mr-card)}.mr .metric strong{font-size:26px;line-height:1.3;display:block;margin:8px 0}.mr .metric small{font-size:12px}.mr .item{padding:16px 0;border-top:1px solid var(--mr-border)}.mr .item:first-child{border-top:0}.mr .item:last-child{padding-bottom:0}.mr .badge{border:1px solid var(--mr-border);border-radius:6px;padding:3px 8px;font-size:12px;white-space:nowrap}.mr .empty{padding:24px 0;text-align:center;color:var(--mr-muted)}\n.mr nav{display:flex;flex-wrap:wrap;gap:8px;border-bottom:1px solid var(--mr-border);padding:18px 0;margin-bottom:20px}.mr button,.mr input,.mr select,.mr textarea,.mr .link{font:inherit;color:inherit;border:1px solid var(--mr-border);border-radius:8px;background:var(--mr-bg);min-height:44px;padding:9px 12px}.mr button,.mr .link{cursor:pointer;transition:background .15s}.mr button:hover,.mr .link:hover{background:var(--mr-card)}.mr button:disabled{opacity:.45;cursor:default}.mr button.primary,.mr button[aria-pressed=true]{background:var(--mr-accent);color:#fff;border-color:transparent}.mr button.quiet{border-color:transparent;background:transparent}.mr :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--mr-accent);outline-offset:3px}.mr input:not([type=checkbox]),.mr select,.mr textarea{width:100%;min-width:0}.mr input[type=checkbox]{width:18px;height:18px;min-height:0;accent-color:var(--mr-accent)}.mr label{display:flex;flex-direction:column;gap:6px;font-size:13px}.mr label.check{flex-direction:row;align-items:center;gap:8px;min-height:44px}.mr .filter{min-width:170px;max-width:240px}.mr .feedback{padding:12px 16px;border-radius:8px;border:1px solid var(--mr-border)}.mr .error{color:var(--dsw-alias-state-error-primary,#ef9393)}.mr .good{color:var(--dsw-alias-state-success-primary,#77ca9d)}.mr .route-path{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.mr .route-path span{padding:4px 9px;border:1px solid var(--mr-border);border-radius:6px}.mr details{border-top:1px solid var(--mr-border);padding-top:14px}.mr summary{cursor:pointer;color:var(--mr-muted)}.mr progress{width:100%;height:7px;accent-color:var(--mr-accent)}.mr .trend{height:100px;display:flex;align-items:flex-end;gap:8px;margin:16px 0}.mr .trend>div{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;min-width:0}.mr .trend i{display:block;width:100%;min-height:3px;border-radius:4px 4px 0 0;background:var(--mr-accent)}.mr .trend small{font-size:11px;white-space:nowrap}.mr .table{width:100%;border-collapse:collapse;font-size:13px}.mr th,.mr td{text-align:left;border-bottom:1px solid var(--mr-border);padding:10px 8px}.mr th{font-weight:500;color:var(--mr-muted)}.mr .scroll{overflow:auto}.mr .steps{padding:14px 16px;border-left:3px solid var(--mr-accent);background:var(--mr-bg);border-radius:8px}.mr .link{text-decoration:none;display:inline-flex;align-items:center}\n.mr dialog{color:var(--mr-text);background:var(--mr-bg);border:1px solid var(--mr-border);border-radius:16px;width:min(900px,calc(100vw - 32px));max-height:calc(100vh - 40px);padding:0;box-shadow:0 24px 80px #0008}.mr dialog::backdrop{background:#000a}.mr .modal-head,.mr .modal-foot{padding:18px 24px;background:var(--mr-bg);position:sticky;z-index:1}.mr .modal-head{top:0;border-bottom:1px solid var(--mr-border)}.mr .modal-foot{bottom:0;border-top:1px solid var(--mr-border)}.mr .modal-body{padding:24px}.mr .target-head strong{font-size:14px}.mr .subtle{background:var(--mr-bg)}\n@media(max-width:850px){.mr .providers{grid-template-columns:1fr}.mr .metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){.mr .grid{grid-template-columns:1fr}.mr .box{padding:16px}.mr nav{flex-wrap:wrap}.mr .modal-body,.mr .modal-head,.mr .modal-foot{padding:16px}.mr .metrics{gap:8px}.mr .metric strong{font-size:22px}}\n.mr{--mr-soft:color-mix(in srgb,var(--mr-text) 3%,var(--mr-card));--mr-selected:color-mix(in srgb,var(--mr-accent) 7%,var(--mr-card));max-width:1280px;min-width:0;line-height:1.55}\n.mr h2{font-size:24px;letter-spacing:-.5px;font-weight:650}.mr h3{font-weight:600}.mr .stack{gap:20px}.mr .row{gap:8px}.mr .box{border-radius:14px;background:var(--mr-card)}.mr .box.stack{gap:16px}\n.mr nav{gap:4px;padding:16px 0 0;margin-bottom:24px}.mr nav button{border:0;border-radius:0;background:transparent;padding:12px 14px;border-bottom:2px solid transparent;color:var(--mr-muted)}.mr nav button[aria-pressed=true]{background:transparent;color:var(--mr-text);border-bottom-color:var(--mr-text);font-weight:600}.mr nav button:hover{background:var(--mr-soft)}\n.mr button.primary{background:var(--mr-text);color:var(--mr-card);border-color:var(--mr-text)}.mr button.primary:hover{opacity:.85}.mr button:active:not(:disabled){filter:brightness(.9)}.mr button.quiet{color:var(--mr-muted)}.mr .badge{border-radius:100px;background:var(--mr-soft);padding:4px 10px}.mr .metric{background:var(--mr-soft)}.mr .metric strong{font-size:28px;font-variant-numeric:tabular-nums;letter-spacing:-.5px;margin:10px 0 4px}.mr .metrics{gap:16px}\n.mr .status{display:inline-flex;align-items:center;gap:7px;font-size:13px;white-space:nowrap}.mr .status i{width:8px;height:8px;border-radius:50%;background:var(--mr-muted);display:inline-block;flex-shrink:0}.mr .status i.good{background:var(--dsw-alias-state-success-primary,#38a16a)}.mr .status i.warn{background:var(--dsw-alias-state-warning-primary,#c48b28)}.mr .warn{color:var(--dsw-alias-state-warning-primary,#c48b28)}\n.mr .table-shell{padding:0;overflow:hidden}.mr .scroll>.table{min-width:760px}.mr .table{font-size:14px}.mr .table th{background:var(--mr-soft);font-size:12px;letter-spacing:.02em;font-weight:500;white-space:nowrap}.mr .table th,.mr .table td{padding:16px 20px;vertical-align:middle}.mr .table td:last-child{white-space:nowrap}.mr .table tbody tr:last-child td{border-bottom:0}.mr .table td small{display:block;font-size:12px;margin-top:3px}.mr .table td>strong{font-weight:600}.mr .table tr.selected{background:var(--mr-selected)}.mr .table tbody tr:hover{background:var(--mr-soft)}.mr .table .account-name{max-width:230px;overflow-wrap:anywhere}.mr .table .amount{font-size:20px;line-height:1.35;font-variant-numeric:tabular-nums;font-weight:600;white-space:nowrap}.mr .table .cell-actions{white-space:nowrap;text-align:right}.mr .table .account-check{min-width:44px;min-height:44px;justify-content:center;flex-shrink:0}.mr .table .account-cell{display:flex;gap:10px;align-items:center}.mr .table .account-cell .check{margin-left:-12px}.mr .table .account-cell input{accent-color:var(--mr-text)}.mr .table .row{flex-wrap:nowrap}.mr .section-title{margin-bottom:4px}.mr .toolbar{align-items:flex-end;gap:16px}.mr .search{max-width:280px;flex:1;min-width:160px}.mr .table-footer{padding:14px 20px;background:var(--mr-soft)}.mr .hint{font-size:13px;color:var(--mr-muted)}.mr details.help{border:0;padding:0}.mr details.help>div{padding:12px 0;max-width:76ch}.mr .plan-form{align-items:flex-end;padding:16px 0 0;border-top:1px solid var(--mr-border)}.mr .plan-form .filter{min-width:180px}.mr .steps{border:1px solid var(--mr-border);border-radius:10px;background:var(--mr-soft);padding:14px 16px}.mr .route-path span{background:var(--mr-soft);border-color:transparent;font-size:12px}.mr .route-card details{padding-top:10px}.mr .feedback{margin-bottom:16px}.mr .box .feedback{margin-bottom:0}.mr .scroll{max-width:100%}.mr .scroll:focus-visible{outline:2px solid var(--mr-accent);outline-offset:-3px}\n@media(max-width:850px){.mr .metrics{gap:10px}.mr nav{gap:0}.mr nav button{padding:12px 10px}}@media(max-width:600px){.mr h2{font-size:22px}.mr nav{display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}.mr nav button{padding:10px 4px;font-size:12px;white-space:nowrap}.mr .toolbar>.row{width:100%}.mr .toolbar .search{max-width:none}.mr .metric strong{font-size:24px}.mr .table th,.mr .table td{padding:14px 16px}.mr .filter{max-width:none}.mr .plan-form label{flex:1}.mr .box.table-shell{padding:0}}\n\n\n.mr .metrics{gap:0;border:1px solid var(--mr-border);border-radius:12px;overflow:hidden;background:var(--mr-card)}\n.mr .metrics .metric{border:0;border-radius:0;background:transparent;border-right:1px solid var(--mr-border);padding:16px 20px}.mr .metrics .metric:last-child{border-right:0}.mr .metric strong{font-size:25px;margin:6px 0}.mr .performance{gap:10px}.mr .performance .metrics{background:var(--mr-soft);border-color:transparent}.mr .performance .metric strong{font-size:21px}.mr .performance .metric{padding:12px 20px}.mr .performance h3{font-size:14px}.mr .refresh-control{font-size:12px;color:var(--mr-muted)}\n.mr .section-pad{padding:16px 20px}.mr .table-shell>.section-pad+.section-pad{padding-top:0}.mr .route-table td{max-width:300px}.mr .route-table .route-targets{max-width:300px;white-space:normal;overflow-wrap:anywhere}.mr .route-table small{max-width:320px}.mr .model-table td:first-child{width:38%}.mr .table .cell-actions{width:1%}.mr .install-plugin>div{padding-top:16px}.mr details.help.box{padding:18px 20px}.mr .sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}\n@media(max-width:600px){.mr .metrics .metric{padding:12px 14px}.mr .metrics .metric:nth-child(2){border-right:0}.mr .metrics .metric:nth-child(-n+2){border-bottom:1px solid var(--mr-border)}.mr .section-pad{padding:14px 16px}}\n\n@media(prefers-reduced-motion:reduce){.mr *{transition:none!important}}\n`;\nexport function apply(ctx) { reloadFromHost = () => requestPluginReload(ctx.get?.('remote')); ctx.slots.inject('plugins.bundle.config', () => ctx.slots.register({ name: 'plugins.bundle.config', key: 'dsh-multi-router' }, RouterPage)); ctx.slots.inject('shell.overlay', () => ctx.slots.register({ name: 'shell.overlay', id: 'dsh-multi-router-updates' }, UpdateReminder)); }\nfunction Modal({ title, close, children, busy }) {\n const ref = useRef(null);\n useEffect(() => { const dialog = ref.current; dialog.showModal(); return () => dialog.close(); }, []);\n return <dialog ref={ref} aria-label={title} onCancel={e => { e.preventDefault(); if (!busy) close(); }}>\n <div className=\"modal-head bar\"><h2>{title}</h2><button type=\"button\" disabled={busy} onClick={close}>\u5173\u95ED</button></div>{children}\n </dialog>;\n}\nexport function UpdateReminder() {\n const [data, setData] = useState(null), [opened, setOpened] = useState(null), [manage, setManage] = useState(false), [busy, setBusy] = useState(false), [error, setError] = useState('');\n useEffect(() => {\n let live = true, pending = false;\n async function poll() { if (document.hidden || pending) return; pending = true; try { const next = await readManagementResponse(await fetch(ENDPOINT, { cache: 'no-store' })); if (live && !backendNeedsRestart(next)) { setData(next); setOpened(current => current ?? (next.pluginUpdates?.reminders?.length && !document.querySelector('dialog[open]') ? next.pluginUpdates.reminders : null)); } } catch { /* Settings page owns backend recovery guidance. */ } finally { pending = false; } }\n void poll(); const timer = setInterval(() => { void poll(); }, 60000);\n return () => { live = false; clearInterval(timer); };\n }, []);\n useEffect(() => { if (data?.pluginUpdates?.job?.state !== 'running') return; let live = true; const timer = setInterval(() => { void fetch(ENDPOINT, { cache: 'no-store' }).then(readManagementResponse).then(next => { if (live) setData(next); }).catch(() => {}); }, 2000); return () => { live = false; clearInterval(timer); }; }, [data?.pluginUpdates?.job?.state]);\n async function act(action) {\n if (busy) return false; setBusy(true); setError('');\n try { const next = await readManagementResponse(await fetch(ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Multi-Router-Key': data.key }, body: JSON.stringify({ revision: data.revision, ...action }) })); setData(next); return next; }\n catch (e) { setError(e.message); return false; } finally { setBusy(false); }\n }\n async function dismiss() { if (await act({ action: 'plugins.dismiss', keys: opened.map(r => r.key) })) { setOpened(null); setManage(false); } }\n if (!opened || !data) return null;\n return <div className=\"mr\"><style>{styles}</style><Modal title=\"\u53D1\u73B0\u63D2\u4EF6\u66F4\u65B0\" busy={busy || data.pluginUpdates?.job?.state === 'running'} close={() => { void dismiss(); }}><div className=\"modal-body stack\"><Feedback error={error} />\n {manage ? <PluginUpdatesPanel data={data.pluginUpdates} busy={busy} act={act} /> : <><p>{opened.length} \u4E2A\u7528\u6237\u5B89\u88C5\u7684\u63D2\u4EF6\u6709\u66F4\u65B0\u3002\u8BF7\u9009\u62E9\u67E5\u770B\u66F4\u65B0\uFF0C\u6216\u7A0D\u540E\u5904\u7406\u3002</p><ul>{opened.map(r => <li key={r.key}><strong>{r.name}</strong> \u00B7 {r.version || '\u672A\u77E5\u7248\u672C'} \u2192 {r.latestVersion || `Git ${r.latestCommit?.slice(0, 8)}`}</li>)}</ul><p className=\"notice\">\u6BCF 24 \u5C0F\u65F6\u81EA\u52A8\u68C0\u67E5 GitHub / npm \u5B89\u88C5\u6765\u6E90\uFF1B\u540C\u4E00\u7248\u672C\u53EA\u63D0\u9192\u4E00\u6B21\u3002DSH \u5185\u7F6E\u63D2\u4EF6\u4E0D\u53C2\u4E0E\u68C0\u67E5\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5B89\u88C5\u66F4\u65B0\u3002</p></>}\n <div className=\"row\"><button disabled={busy || data.pluginUpdates?.job?.state === 'running'} onClick={() => { void dismiss(); }}>\u7A0D\u540E\u5904\u7406</button>{!manage && <button className=\"primary\" disabled={busy} onClick={() => setManage(true)}>\u67E5\u770B\u5E76\u66F4\u65B0</button>}</div>\n </div></Modal></div>;\n}\nfunction Feedback({ error, notice }) { return error ? <div className=\"feedback error\" role=\"alert\">{error}</div> : notice ? <div className=\"feedback\" role=\"status\">{notice}</div> : null; }\nconst metric = (label, value, detail) => <div className=\"box metric\"><small>{label}</small><strong>{value}</strong><small>{detail}</small></div>;\nexport function RouterPage({ view = 'page' }) {\n const [data, setData] = useState(null), [tab, setTab] = useState('overview');\n const [accountProvider, setAccountProvider] = useState(''), [provider, setProvider] = useState('workbuddy'), [busy, setBusy] = useState(false), [live, setLive] = useState(true);\n const [error, setError] = useState(''), [notice, setNotice] = useState(''), [draft, setDraft] = useState(null), [accountModal, setAccountModal] = useState(null), [presetModal, setPresetModal] = useState(false), [search, setSearch] = useState('');\n const polling = useRef(false);\n async function load(signal = AbortSignal.timeout(8000)) { const next = await readManagementResponse(await fetch(ENDPOINT, { cache: 'no-store', signal })); setData(next); setError(''); }\n useEffect(() => {\n if (view === 'summary') return;\n let stopped = false, retry, attempts = 0;\n const abort = new AbortController();\n async function connect() {\n try { await load(AbortSignal.any([abort.signal, AbortSignal.timeout(4000)])); }\n catch (e) { if (stopped) return; if (++attempts < 8) retry = setTimeout(connect, 750); else setError(e.message); }\n }\n void connect();\n const timer = live && setInterval(() => { if (document.hidden || polling.current) return; polling.current = true; void load(abort.signal).catch(e => { if (!stopped) setError(e.message); }).finally(() => { polling.current = false; }); }, 60000);\n return () => { stopped = true; abort.abort(); clearTimeout(retry); clearInterval(timer); };\n }, [view, live]);\n useEffect(() => {\n if (data?.startup?.phase !== 'discovering' && !['waiting', 'reloading'].includes(data?.runtime?.phase) && data?.pluginUpdates?.job?.state !== 'running' && !data?.checkins?.running) return;\n const timer = setInterval(() => { if (document.hidden || polling.current) return; polling.current = true; void load().catch(e => setError(e.message)).finally(() => { polling.current = false; }); }, 2000);\n return () => clearInterval(timer);\n }, [data?.startup?.phase, data?.runtime?.phase, data?.pluginUpdates?.job?.state, data?.checkins?.running]);\n async function reload() { setBusy(true); setError(''); try { if (!reloadFromHost) throw Error('\u8BF7\u5728 DSH \u63D2\u4EF6\u9875\u91CD\u65B0\u542F\u7528\u672C\u63D2\u4EF6\u3002'); await reloadFromHost(); await load(); } catch (e) { setError(e.message); } finally { setBusy(false); } }\n async function act(action) {\n if (busy || backendNeedsRestart(data)) return false;\n setBusy(true); setError(''); setNotice('');\n try { const res = await fetch(ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Multi-Router-Key': data.key }, body: JSON.stringify({ revision: data.revision, ...action }) });\n const next = await readManagementResponse(res); const { exported, workbuddyLogin, loginResult, ...state } = next; setData(state); setNotice(action.action === 'workbuddy.sms' ? '' : action.action === 'workbuddy.login' ? loginResult?.warning || '\u767B\u5F55\u51ED\u8BC1\u5DF2\u4FDD\u5B58\uFF0C\u81EA\u52A8\u7B7E\u5230\u5F00\u5173\u4FDD\u6301\u539F\u8BBE\u7F6E\u3002' : action.action === 'checkins.verify' ? '\u767B\u5F55\u9A8C\u8BC1\u901A\u8FC7\uFF0C\u65E7\u7684\u4EE4\u724C\u5931\u6548\u63D0\u793A\u5DF2\u89E3\u9664\uFF1B\u672A\u63D0\u4EA4\u7B7E\u5230\u3002' : action.action === 'checkins.settings' ? '\u7B7E\u5230\u8BA1\u5212\u5DF2\u4FDD\u5B58\uFF1B\u4ECA\u65E5\u5DF2\u5904\u7406\u8BB0\u5F55\u4FDD\u6301\u4E0D\u53D8\u3002' : action.action.startsWith('checkins.') || action.action.startsWith('plugins.') || action.action === 'setup.dismiss' ? '' : action.action === 'accounts.discover' || action.action === 'monitor.refresh' ? '\u5DF2\u91CD\u65B0\u68C0\u6D4B\u672C\u673A\u767B\u5F55\u5E76\u5237\u65B0\u7528\u91CF\uFF1B\u68C0\u6D4B\u7ED3\u679C\u89C1\u4E0B\u65B9\u3002' : action.action.includes('refresh') ? '\u5DF2\u5237\u65B0\u3002\u65E0\u6CD5\u83B7\u53D6\u7684\u8D26\u53F7\u4F1A\u4FDD\u7559\u4E0A\u6B21\u6570\u636E\u5E76\u6807\u8BB0\u3002' : action.action === 'config.import' ? '\u914D\u7F6E\u5DF2\u5BFC\u5165\u5E76\u751F\u6548\uFF0C\u539F\u914D\u7F6E\u5DF2\u5907\u4EFD\uFF1B\u6A21\u578B\u548C\u7528\u91CF\u6B63\u5728\u540E\u53F0\u66F4\u65B0\u3002' : action.action.startsWith('config.') || action.action === 'account.export' ? '' : '\u5DF2\u4FDD\u5B58\u5E76\u751F\u6548\u3002'); return next;\n } catch (e) { setError(e.message); return false; } finally { setBusy(false); }\n }\n function openAccount(mode, account) { setError(''); setNotice(''); setAccountModal({ mode, account, revision: data.revision }); }\n const newTarget = (target = { provider: 'workbuddy' }) => ({ ...target, key: crypto.randomUUID(), weight: target.weight ?? 1, tokenBudget: target.tokenBudget ?? 100000, creditBudget: target.creditBudget ?? 100, modelText: (target.models ?? [target.model ?? '']).join(', ') });\n function editRoute(route) { setError(''); setNotice(''); setDraft({ ...structuredClone(route), revision: data.revision, previousId: route.id, strategy: route.strategy ?? 'failover', targets: route.targets.map(newTarget) }); }\n const p = data?.providers.find(p => p.id === provider);\n const providerSelect = <label className=\"filter\">\u4F9B\u5E94\u5546 / \u533A\u57DF<select value={provider} onChange={e => { setProvider(e.target.value); setSearch(''); }}>{data?.providers.map(p => <option key={p.id} value={p.id}>{p.name}</option>)}</select></label>;\n const accountProviderSelect = <label className=\"filter\">\u4F9B\u5E94\u5546 / \u533A\u57DF<select value={accountProvider} onChange={e => setAccountProvider(e.target.value)}><option value=\"\">\u5168\u90E8\u4F9B\u5E94\u5546</option>{data?.providers.map(p => <option key={p.id} value={p.id}>{p.name}</option>)}</select></label>;\n if (view === 'summary') return '\u4E09\u5BB6\u8D26\u53F7\u4E0E\u767B\u5F55\u4FE1\u606F\u3001\u7528\u91CF\u76D1\u63A7\u3001\u6A21\u578B\u7BA1\u7406\uFF0C\u4EE5\u53CA\u6743\u91CD\u548C\u989D\u5EA6\u8DEF\u7531\u3002';\n return <div className=\"mr\"><style>{styles}</style><div className=\"bar\"><div><h2>\u8D26\u53F7\u4E0E\u8DEF\u7531</h2><p className=\"muted\">\u7BA1\u7406\u4E09\u5BB6\u8D26\u53F7\u3001\u6A21\u578B\u4E0E\u7528\u91CF</p></div><div className=\"row\"><span className=\"badge\">v{data?.pluginVersion ?? pluginVersion}</span><span className=\"status\"><i className={busy || !data ? 'warn' : 'good'} aria-hidden=\"true\" />{busy ? '\u6B63\u5728\u5904\u7406\u2026' : !data ? '\u6B63\u5728\u8FDE\u63A5\u2026' : '\u672C\u673A\u8FD0\u884C'}</span><label className=\"check refresh-control\"><input type=\"checkbox\" checked={live} onChange={e => setLive(e.target.checked)} />\u6BCF\u5206\u949F\u5237\u65B0</label><button disabled={busy} onClick={() => { void load().catch(e => setError(e.message)); }}>\u5237\u65B0\u9762\u677F</button></div></div>\n <nav aria-label=\"\u8DEF\u7531\u63D2\u4EF6\u914D\u7F6E\u9875\u7B7E\">{[['overview', '\u603B\u89C8\u4E0E\u7528\u91CF'], ['usage', 'Token \u660E\u7EC6'], ['accounts', '\u8D26\u53F7\u4E0E\u767B\u5F55'], ['checkins', '\u79EF\u5206\u7B7E\u5230'], ['models', '\u6A21\u578B\u7BA1\u7406'], ['routes', '\u8DEF\u7531\u89C4\u5219'], ['plugins', '\u63D2\u4EF6\u66F4\u65B0'], ['migration', '\u914D\u7F6E\u8FC1\u79FB']].map(([key, label]) => <button key={key} aria-pressed={tab === key} onClick={() => { setTab(key); setError(''); setNotice(''); }}>{label}</button>)}</nav>\n {!draft && !accountModal && !presetModal && <Feedback error={error} notice={notice} />}\n {(backendNeedsRestart(data) || (!data && error)) && <RestartGuidance data={data} busy={busy} reload={() => { void reload(); }} retry={() => { void load().catch(e => setError(e.message)); }} />}\n {!data ? <section className=\"box stack\" role=\"status\" aria-live=\"polite\"><h3>{error ? '\u7B49\u5F85\u540E\u53F0\u8FDE\u63A5' : '\u6B63\u5728\u8FDE\u63A5\u672C\u673A\u63D2\u4EF6\u2026'}</h3><p className=\"notice\">\u9875\u9762\u4F1A\u81EA\u52A8\u91CD\u65B0\u8FDE\u63A5\u3002\u8D26\u53F7\u53D1\u73B0\u3001\u7528\u91CF\u548C\u6A21\u578B\u76EE\u5F55\u5C06\u5728\u540E\u53F0\u66F4\u65B0\u3002</p><progress aria-label=\"\u6B63\u5728\u8FDE\u63A5\u63D2\u4EF6\u540E\u53F0\" /></section> : <fieldset className=\"stack\" style={{ border: 0, padding: 0, margin: 0, minWidth: 0 }} disabled={backendNeedsRestart(data)} aria-busy={busy}>\n {data.startup?.phase === 'discovering' && <p className=\"steps\" role=\"status\">\u6B63\u5728\u540E\u53F0\u83B7\u53D6\u672C\u673A\u8D26\u53F7\uFF0C\u5DF2\u6709\u8D26\u53F7\u548C\u8DEF\u7531\u73B0\u5728\u5373\u53EF\u4F7F\u7528\u3002</p>}\n {data.runtime?.phase && data.runtime.phase !== 'current' && <section className=\"steps\"><p>{data.runtime.message}\uFF08\u8FD0\u884C v{data.runtime.runningVersion} / \u5DF2\u5B89\u88C5 v{data.runtime.installedVersion}\uFF09</p>{['failed', 'restart-required'].includes(data.runtime.phase) && <button disabled={busy} onClick={() => { void reload(); }}>\u91CD\u65B0\u52A0\u8F7D\u63D2\u4EF6</button>}</section>}\n {['overview', 'accounts'].includes(tab) && data.setup?.dismissed !== true && <InitialSetup data={data} busy={busy} act={act} go={key => setTab(key)} />}\n {tab === 'overview' && <Overview data={data} busy={busy} act={act} go={key => setTab(key)} />}\n {tab === 'plugins' && <PluginUpdatesPanel data={data.pluginUpdates} busy={busy} act={act} />}\n {tab === 'checkins' && <CheckinPanel data={data} busy={busy} act={act} />}\n {tab === 'usage' && <UsageDetails data={data} busy={busy} act={act} />}\n {tab === 'accounts' && <AccountPool key={accountProvider} data={data} provider={accountProvider} providerSelect={accountProviderSelect} busy={busy} act={act} manage={a => openAccount('edit', a)} add={() => openAccount('add')} />}\n {tab === 'models' && <ModelsPanel data={data} provider={provider} providerSelect={providerSelect} search={search} setSearch={setSearch} busy={busy} act={act} />}\n {tab === 'routes' && <div className=\"stack\"><div className=\"bar\"><div><h3>\u6A21\u578B\u8DEF\u7531</h3><p className=\"notice\">{data.routes.length} \u6761\u8DEF\u7531 \u00B7 \u89C4\u5219\u4E0E\u8D26\u53F7\u5728\u7F16\u8F91\u4E2D\u8C03\u6574</p></div><div className=\"row\"><button disabled={busy} onClick={() => { setError(''); setNotice(''); setPresetModal(true); }}>\u6DFB\u52A0\u9884\u914D\u7F6E</button><button className=\"primary\" disabled={busy} onClick={() => { setError(''); setNotice(''); setDraft({ id: '', name: '', revision: data.revision, contextWindow: 200000, maxTokens: 32000, strategy: 'failover', preferExpiringCredits: true, expiringWithinDays: 7, visible: true, targets: [newTarget()] }); }}>\u65B0\u5EFA\u8DEF\u7531</button></div></div>\n <RoutesTable data={data} busy={busy} act={act} edit={editRoute} />\n <details><summary>\u5168\u5C40\u5207\u6362\u8BBE\u7F6E</summary><form className=\"box stack\" style={{ marginTop: 16 }} onSubmit={e => { e.preventDefault(); const f = new FormData(e.currentTarget); void act({ action: 'options.save', cooldownMs: Number(f.get('cooldown')) * 1000, requestTimeoutMs: Number(f.get('timeout')) * 1000, retryServerErrors: f.has('server') }); }}><div className=\"grid\"><label>\u5931\u8D25\u8D26\u53F7\u51B7\u5374\uFF08\u79D2\uFF09<input disabled={busy} name=\"cooldown\" type=\"number\" min=\"1\" required defaultValue={data.options.cooldownMs / 1000} /></label><label>\u8BF7\u6C42\u8D85\u65F6\uFF08\u79D2\uFF09<input disabled={busy} name=\"timeout\" type=\"number\" min=\"1\" required defaultValue={data.options.requestTimeoutMs / 1000} /></label></div><label className=\"check\"><input disabled={busy} name=\"server\" type=\"checkbox\" defaultChecked={data.options.retryServerErrors} />5xx \u548C\u7F51\u7EDC\u9519\u8BEF\u4E5F\u5207\u6362\u8D26\u53F7</label><div><button disabled={busy} type=\"submit\">\u4FDD\u5B58\u8BBE\u7F6E</button></div></form></details>\n </div>}\n {tab === 'migration' && <MigrationForm data={data} act={act} busy={busy} />}\n </fieldset>}\n {draft && <Modal title={draft.previousId ? '\u7F16\u8F91\u8DEF\u7531' : '\u65B0\u5EFA\u8DEF\u7531'} busy={busy} close={() => setDraft(null)}><RouteForm draft={draft} setDraft={setDraft} data={data} act={act} busy={busy} error={error} notice={notice} /></Modal>}\n {presetModal && <Modal title=\"\u6A21\u578B\u8DEF\u7531\u9884\u914D\u7F6E\" busy={busy} close={() => setPresetModal(false)}><div className=\"modal-body stack\"><Feedback error={error} notice={notice} /><p className=\"steps\">Free \u81EA\u52A8\u53D1\u73B0\u5404\u8D26\u53F7\u7684\u514D\u8D39\u6A21\u578B\uFF1B\u5176\u4ED6\u9884\u914D\u7F6E\u7ED1\u5B9A\u4E09\u5BB6\u5171\u6709\u6A21\u578B\u3002\u5DF2\u6709\u8DEF\u7531\u4E0D\u4F1A\u88AB\u8986\u76D6\u3002</p><div className=\"grid\">{(data.presets || []).map(preset => <section key={preset.id} className=\"box stack\"><div><h3>{preset.name}</h3></div><p className=\"notice\">{preset.freeOnly ? '\u6BCF\u5929\u81EA\u52A8\u68C0\u67E5\u514D\u8D39\u6A21\u578B\uFF0C\u8C03\u7528\u524D\u590D\u6838\u96F6\u500D\u7387\uFF1B\u4EC5\u5728\u514D\u8D39\u6A21\u578B\u95F4\u5207\u6362\u3002' : `\u5DF2\u53D1\u73B0\u53EF\u7528\u6E20\u9053\uFF1A${preset.availableProviders.length} / 3${preset.availableProviders.length < 3 ? ' \u00B7 \u53EF\u6DFB\u52A0\u8D26\u53F7\u6216\u5237\u65B0\u6A21\u578B\u76EE\u5F55\u540E\u4F7F\u7528' : ''}`}</p><button disabled={busy || preset.added} onClick={() => { void act({ action: 'preset.add', id: preset.id }); }}>{preset.added ? '\u5DF2\u6DFB\u52A0' : '\u6DFB\u52A0\u6B64\u8DEF\u7531'}</button></section>)}</div></div><div className=\"modal-foot bar\"><p className=\"notice\">\u65B0\u589E\u8DEF\u7531\u53EF\u7EE7\u7EED\u7F16\u8F91\u540D\u79F0\u3001\u8D26\u53F7\u548C\u5207\u6362\u89C4\u5219\u3002</p><button className=\"primary\" disabled={busy || !(data.presets || []).some(p => !p.added)} onClick={() => { void act({ action: 'preset.add-all' }); }}>\u8865\u9F50\u5168\u90E8\u9884\u914D\u7F6E</button></div></Modal>}\n {accountModal && <Modal title={accountModal.mode === 'edit' ? '\u8D26\u53F7\u767B\u5F55\u8BE6\u60C5' : accountModal.mode === 'credentials' ? '\u8865\u5145 / \u66F4\u65B0\u8D26\u53F7\u51ED\u8BC1' : '\u6DFB\u52A0\u8D26\u53F7\u4E0E\u83B7\u53D6\u767B\u5F55'} busy={busy} close={() => setAccountModal(null)}><AccountForm modal={accountModal} provider={accountProvider || 'workbuddy'} data={data} busy={busy} act={act} replace={() => openAccount('credentials', accountModal.account)} close={selected => { if (typeof selected === 'string' && accountProvider) setAccountProvider(selected); setAccountModal(null); }} error={error} notice={notice} /></Modal>}\n </div>;\n}\nexport function ModelsPanel({ data, provider, providerSelect, search, setSearch, busy, act }) {\n const [editing, setEditing] = useState(null);\n const models = data.providers.find(p => p.id === provider)?.models ?? [];\n const all = data.providers.flatMap(p => p.models), shown = models.filter(m => `${m.id} ${m.name}`.toLowerCase().includes(search.toLowerCase()));\n return <div className=\"stack\"><div className=\"bar\"><div><h3>\u539F\u59CB\u6A21\u578B\u5C55\u793A</h3><p className=\"notice\">\u5DF2\u5C55\u793A {all.filter(m => m.visible).length} / {all.length} \u4E2A \u00B7 \u9ED8\u8BA4\u4EC5\u5C55\u793A\u7EDF\u4E00\u8DEF\u7531</p></div><div className=\"row\"><button disabled={busy} onClick={() => { void act({ action: 'models.visibility', visible: true }); }}>\u5168\u90E8\u5C55\u793A</button><button disabled={busy} onClick={() => { void act({ action: 'models.visibility', visible: false }); }}>\u5168\u90E8\u9690\u85CF\uFF08\u4EC5\u8DEF\u7531\uFF09</button></div></div>\n <div className=\"bar toolbar\"><div className=\"row\">{providerSelect}<label className=\"search\">\u641C\u7D22\u6A21\u578B<input type=\"search\" placeholder=\"\u540D\u79F0\u6216\u6A21\u578B ID\" value={search} onChange={e => setSearch(e.target.value)} /></label></div><button disabled={busy} onClick={() => { void act({ action: 'refresh', provider }); }}>\u83B7\u53D6\u6A21\u578B\u76EE\u5F55</button></div>\n <section className=\"box table-shell\"><div className=\"scroll\" role=\"region\" aria-label=\"\u6A21\u578B\u5C55\u793A\u7BA1\u7406\" tabIndex=\"0\"><table className=\"table model-table\"><thead><tr><th scope=\"col\">\u6A21\u578B</th><th scope=\"col\">\u4E0A\u4E0B\u6587 / \u63A8\u7406</th><th scope=\"col\">\u9009\u62E9\u5668\u5C55\u793A</th><th scope=\"col\" className=\"cell-actions\">\u7BA1\u7406</th></tr></thead><tbody>{shown.map(m => <tr key={m.id} className={m.visible ? 'selected' : ''}><td><strong>{m.name}</strong><small className=\"mono muted\">{m.id}</small></td><td>{fmt(m.contextWindow / 1000)}K<small className=\"muted\">{m.reasoning?.supportedEfforts?.length ? m.reasoning.supportedEfforts.map(e => effortNames[e] || e).join(' / ') : '\u5E73\u53F0\u9ED8\u8BA4'}</small></td><td><label className=\"check\"><input type=\"checkbox\" aria-label={`\u5C55\u793A ${m.name}`} disabled={busy} checked={m.visible} onChange={e => { void act({ action: 'model.update', provider, id: m.id, visible: e.target.checked }); }} />{m.visible ? '\u5DF2\u5C55\u793A' : '\u5DF2\u9690\u85CF'}</label></td><td className=\"cell-actions\"><button disabled={busy} onClick={() => setEditing({ id: m.id, name: m.name, provider })}>\u4FEE\u6539\u540D\u79F0</button></td></tr>)}</tbody></table>{!shown.length && <p className=\"empty\">{models.length ? '\u6CA1\u6709\u5339\u914D\u7684\u6A21\u578B\u3002' : '\u6DFB\u52A0\u5E76\u542F\u7528\u8D26\u53F7\u540E\uFF0C\u83B7\u53D6\u6A21\u578B\u76EE\u5F55\u3002'}</p>}</div><div className=\"table-footer\"><p className=\"notice\">\u9690\u85CF\u4E0D\u5F71\u54CD\u8DEF\u7531\u6216\u5DF2\u6709\u4F1A\u8BDD\u3002\u6279\u91CF\u8BBE\u7F6E\u4F5C\u7528\u4E8E\u5168\u90E8\u4F9B\u5E94\u5546\u53CA\u540E\u7EED\u53D1\u73B0\u7684\u6A21\u578B\u3002</p></div></section>\n {editing && <Modal title=\"\u4FEE\u6539\u6A21\u578B\u540D\u79F0\" busy={busy} close={() => setEditing(null)}><form onSubmit={async e => { e.preventDefault(); if (await act({ action: 'model.update', ...editing })) setEditing(null); }}><div className=\"modal-body stack\"><label>\u6A21\u578B\u540D\u79F0<input autoFocus required maxLength={200} disabled={busy} value={editing.name} onChange={e => setEditing({ ...editing, name: e.target.value })} /></label><p className=\"mono muted\">{editing.id}</p></div><div className=\"modal-foot row\"><button type=\"button\" disabled={busy} onClick={() => setEditing(null)}>\u53D6\u6D88</button><button className=\"primary\" disabled={busy}>\u4FDD\u5B58\u540D\u79F0</button></div></form></Modal>}\n </div>;\n}\nexport function RoutesTable({ data, busy, act, edit }) {\n return <section className=\"box table-shell\"><div className=\"scroll\" role=\"region\" aria-label=\"\u6A21\u578B\u8DEF\u7531\u89C4\u5219\" tabIndex=\"0\"><table className=\"table route-table\"><thead><tr><th scope=\"col\">\u8DEF\u7531 / \u6A21\u578B</th><th scope=\"col\">\u8D26\u53F7\u4E0E\u6E20\u9053</th><th scope=\"col\">\u5207\u6362\u89C4\u5219</th><th scope=\"col\">\u5C55\u793A</th><th scope=\"col\" className=\"cell-actions\">\u7BA1\u7406</th></tr></thead><tbody>{data.routes.map(r => {\n const accounts = data.accounts.filter(a => a.enabled !== false && r.targets.some(t => t.provider === a.provider && (!t.account || t.account === a.id)));\n const providers = [...new Set(r.targets.map(t => data.providers.find(p => p.id === t.provider)?.name || t.provider))];\n const cooling = r.expiringStatus?.cooldownUntil > Date.now(), modes = r.reasoning?.supportedEfforts ?? [];\n return <tr key={r.id} className={r.visible !== false ? 'selected' : ''}><td><strong>{r.name}</strong><small className=\"muted\">{r.freeOnly ? `${r.freeStatus?.modelRoutes?.filter(m => m.selected).length || 0} \u4E2A\u514D\u8D39\u6A21\u578B\u5DF2\u5C55\u793A` : modes.length ? `\u63A8\u7406\uFF1A${modes.map(e => effortNames[e] || e).join(' / ')}` : '\u63A8\u7406\uFF1A\u5E73\u53F0\u9ED8\u8BA4'}</small></td><td className=\"route-targets\">{accounts.length} \u4E2A\u53C2\u4E0E\u8D26\u53F7<small className=\"muted\">{providers.join('\u3001')}</small></td><td>{r.freeOnly ? '\u4EC5\u514D\u8D39 \u00B7 \u81EA\u52A8\u53D1\u73B0' : strategies[r.strategy || 'failover']}<small className={cooling ? 'warn' : 'muted'}>{cooling ? '\u4E34\u671F\u4F18\u5148\u51B7\u5374\u4E2D' : r.preferExpiringCredits ? '\u4E34\u671F\u79EF\u5206\u4F18\u5148' : `${r.targets.length} \u4E2A\u76EE\u6807 \u00B7 4xx \u5207\u6362`}</small></td><td><label className=\"check\"><input type=\"checkbox\" aria-label={`\u5C55\u793A\u8DEF\u7531 ${r.name}`} disabled={busy} checked={r.visible !== false} onChange={e => { const { id, reasoning, supportsImages, expiringStatus, freeStatus, ...route } = r; void act({ action: 'route.save', id, previousId: id, route: { ...route, visible: e.target.checked } }); }} />{r.visible !== false ? '\u5F00\u542F' : '\u5173\u95ED'}</label></td><td className=\"cell-actions\"><button disabled={busy} onClick={() => edit(r)}>{r.freeOnly ? '\u7BA1\u7406\u514D\u8D39\u6A21\u578B' : '\u7F16\u8F91\u8DEF\u7531'}</button></td></tr>;\n })}</tbody></table>{!data.routes.length && <p className=\"empty\">\u6DFB\u52A0\u6A21\u578B\u9884\u914D\u7F6E\uFF0C\u6216\u521B\u5EFA\u81EA\u5B9A\u4E49\u8DEF\u7531\u3002</p>}</div></section>;\n}\n\nconst displayName = a => (a?.name || a?.id || '\u672A\u77E5\u8D26\u53F7').replace(/(?<!\\d)(\\+?\\d{2,3})\\d{3,8}(\\d{4})(?!\\d)/g, '$1****$2');\nconst resultLabels = { claimed: '\u7B7E\u5230\u6210\u529F', 'already-claimed': '\u5DF2\u9886\u53D6', 'no-campaign': '\u65E0\u6D3B\u52A8', retryable: '\u67E5\u8BE2\u5931\u8D25', 'before-window': '\u7A97\u53E3\u672A\u5F00', 'auth-invalid': '\u4EE4\u724C\u5931\u6548', paused: '\u5E73\u53F0\u6682\u505C', uncertain: '\u5F85\u6838\u5BF9', 'device-used': '\u8BBE\u5907\u5DF2\u53C2\u4E0E' };\nfunction Balance({ account }) {\n const b = account.usage?.balance, now = Date.now();\n const expiring = b?.unit === 'credits' && !b.error ? (b.packages || []).filter(p => Number.isFinite(p.remaining) && p.remaining > 0 && p.expiresAt > now && p.expiresAt <= now + 3 * 86400000).reduce((n, p) => n + p.remaining, 0) : 0;\n return <><div className=\"amount\">{b?.unlimited ? '\u4E0D\u9650\u91CF' : fmt(b?.remaining)}{b?.unit === 'credits' && <small className=\"muted\" style={{ display: 'inline', marginLeft: 5 }}>\u79EF\u5206</small>}</div>\n <small className={b?.error ? 'error' : expiring ? 'warn' : 'muted'}>{b?.error ? '\u67E5\u8BE2\u5931\u8D25 \u00B7 \u4FDD\u7559\u4E0A\u6B21\u4F59\u989D' : expiring ? `${fmt(expiring)} \u79EF\u5206 3 \u5929\u5185\u5230\u671F` : b?.fetchedAt ? `\u66F4\u65B0\u4E8E ${when(b.fetchedAt)}` : '\u7B49\u5F85\u5237\u65B0\u5E73\u53F0\u7528\u91CF'}</small></>;\n}\nfunction CheckinResult({ row, compact = false }) {\n const last = row?.last, today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' });\n const current = last?.day === today;\n return <><span className={current && ['claimed', 'already-claimed'].includes(last.status) ? 'good' : last && ['auth-invalid', 'paused', 'uncertain', 'retryable'].includes(last.status) ? 'warn' : 'muted'}>{!row?.supported ? '\u6682\u4E0D\u652F\u6301' : current || last?.status === 'auth-invalid' ? resultLabels[last.status] || '\u5DF2\u5904\u7406' : '\u4ECA\u65E5\u672A\u7B7E\u5230'}</span>\n {(!compact || current && last.amount !== undefined) && <small className=\"muted\">{current && last.amount !== undefined ? `\u672C\u6B21 ${fmt(last.amount)} \u79EF\u5206` : row?.auto ? '\u81EA\u52A8\u7B7E\u5230\u5DF2\u5F00\u542F' : '\u81EA\u52A8\u7B7E\u5230\u672A\u5F00\u542F'}</small>}</>;\n}\nexport function AccountPool({ data, provider, providerSelect, busy, act, manage, add }) {\n const [search, setSearch] = useState('');\n const accounts = data.accounts.filter(a => !provider || a.provider === provider), chosen = accounts.filter(a => a.enabled !== false).length;\n const visible = accounts.filter(a => `${a.name} ${a.id}`.toLowerCase().includes(search.toLowerCase()));\n const rows = data.checkins?.accounts || [], eligible = rows.filter(r => accounts.some(a => a.id === r.id && a.enabled !== false) && r.ready);\n const setAll = enabled => { void act({ action: 'accounts.enabled', ...(provider ? { provider } : {}), enabled }); };\n return <div className=\"stack\"><div className=\"bar\"><div><h3 className=\"section-title\">\u8D26\u53F7\u6C60</h3><p className=\"muted\">{accounts.length} \u4E2A\u8D26\u53F7 \u00B7 {chosen} \u4E2A\u53C2\u4E0E\u8DEF\u7531</p></div><button className=\"primary\" disabled={busy} onClick={add}>\u6DFB\u52A0\u8D26\u53F7</button></div>\n <div className=\"bar toolbar\"><div className=\"row\">{providerSelect}<label className=\"search\">\u641C\u7D22\u8D26\u53F7<input type=\"search\" value={search} placeholder=\"\u540D\u79F0\u6216\u8D26\u53F7 ID\" onChange={e => setSearch(e.target.value)} /></label></div><div className=\"row\">{!provider?.startsWith('qoder') && <button disabled={busy} onClick={() => { void act({ action: 'accounts.discover', ...(provider ? { provider } : {}) }); }}>\u83B7\u53D6\u672C\u673A\u767B\u5F55</button>}<button disabled={busy} onClick={() => { void act({ action: 'monitor.refresh', ...(provider ? { provider } : {}) }); }}>\u5237\u65B0\u72B6\u6001\u4E0E\u7528\u91CF</button></div></div>\n <div className=\"bar\"><p className=\"hint\">\u52FE\u9009\u7684\u8D26\u53F7\u53C2\u4E0E\u8DEF\u7531\uFF1B\u81EA\u52A8\u7B7E\u5230\u5728\u300C\u79EF\u5206\u7B7E\u5230\u300D\u4E2D\u5355\u72EC\u8BBE\u7F6E\u3002</p><div className=\"row\"><span className=\"notice\">\u5DF2\u9009 {chosen} / {accounts.length}</span><button disabled={busy || !accounts.length || chosen === accounts.length} onClick={() => setAll(true)}>\u5168\u9009</button><button disabled={busy || !chosen} onClick={() => setAll(false)}>\u5168\u4E0D\u9009</button><button disabled={busy || data.checkins?.running || data.checkins?.error || !eligible.length} onClick={() => { void act({ action: 'checkins.run', ids: eligible.map(r => r.id) }); }}>\u7B7E\u5230\u53EF\u7528\u8D26\u53F7\uFF08{eligible.length}\uFF09</button></div></div>\n <section className=\"box table-shell\"><div className=\"scroll\" role=\"region\" aria-label=\"\u8D26\u53F7\u6C60\u5217\u8868\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u8D26\u53F7 / \u8DEF\u7531\u53C2\u4E0E</th><th scope=\"col\">\u5E73\u53F0\u79EF\u5206</th><th scope=\"col\">\u6A21\u578B\u4E0E\u8C03\u7528</th><th scope=\"col\">\u4ECA\u65E5\u7B7E\u5230</th><th scope=\"col\" className=\"cell-actions\">\u7BA1\u7406</th></tr></thead><tbody>{visible.map(a => { const cooldown = a.status?.cooldowns || [], active = a.status?.activeFor?.length, enabled = a.enabled !== false;\n return <tr key={a.id} className={enabled ? 'selected' : ''}><td><div className=\"account-cell\"><label className=\"check account-check\"><input aria-label={`${displayName(a)} \u53C2\u4E0E\u8DEF\u7531`} type=\"checkbox\" disabled={busy} checked={enabled} onChange={e => { void act({ action: 'account.update', id: a.id, enabled: e.target.checked }); }} /></label><div className=\"account-name\"><strong>{displayName(a)}</strong>{!provider && <small className=\"muted\">{data.providers?.find(p => p.id === a.provider)?.name || a.provider}</small>}<small><span className=\"status\"><i className={!enabled ? '' : cooldown.length ? 'warn' : 'good'} aria-hidden=\"true\" />{!enabled ? '\u672A\u5165\u6C60' : active ? '\u6B63\u5728\u8C03\u7528' : cooldown.length ? '\u90E8\u5206\u8DEF\u7531\u51B7\u5374\u4E2D' : '\u5DF2\u5728\u6C60\u4E2D'}</span></small><small className=\"muted\">{loginNames[a.login?.state] || '\u5C1A\u672A\u67E5\u8BE2\u767B\u5F55'}</small></div></div></td>\n <td><Balance account={a} /></td><td><span>{fmt(a.modelCount || 0)} \u4E2A\u76EE\u5F55\u6A21\u578B</span><small className=\"muted\">{fmt(a.usage?.requests || 0)} \u6B21\u8C03\u7528 \u00B7 {fmt(a.usage?.tokens || 0)} Token</small>{cooldown.length > 0 && <small className=\"warn\">\u6700\u957F\u7EA6 {Math.ceil(Math.max(...cooldown.map(c => c.remainingMs)) / 60000)} \u5206\u949F\u540E\u6062\u590D</small>}</td><td><CheckinResult row={rows.find(r => r.id === a.id)} /></td><td className=\"cell-actions\"><button disabled={busy} onClick={() => manage(a)}>\u7BA1\u7406\u8D26\u53F7</button></td></tr>;\n })}</tbody></table>{!visible.length && <p className=\"empty\">{accounts.length ? '\u6CA1\u6709\u5339\u914D\u7684\u8D26\u53F7\uFF0C\u8BF7\u8C03\u6574\u641C\u7D22\u3002' : '\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF0C\u70B9\u51FB\u300C\u6DFB\u52A0\u8D26\u53F7\u300D\u83B7\u53D6\u767B\u5F55\u6216\u586B\u5199\u51ED\u8BC1\u3002'}</p>}</div></section>\n <details className=\"help\"><summary>\u672C\u673A\u8D26\u53F7\u83B7\u53D6\u4E0E\u51ED\u8BC1\u8BF4\u660E</summary><div className=\"stack\"><p className=\"notice\">WorkBuddy \u4E0E Trae \u542F\u52A8\u65F6\u81EA\u52A8\u8BFB\u53D6\u672C\u673A\u5DF2\u767B\u5F55\u8D26\u53F7\uFF0C\u6BCF\u5206\u949F\u91CD\u65B0\u68C0\u6D4B\uFF1BTrae \u81EA\u52A8\u8BC6\u522B CN\u3001Global \u4E0E SOLO\u3002\u4E5F\u53EF\u6DFB\u52A0\u624B\u52A8\u51ED\u8BC1\u6216\u5BFC\u5165\u5176\u5B83\u8BBE\u5907\u8D26\u53F7\uFF0C\u5404\u8D26\u53F7\u72EC\u7ACB\u4FDD\u5B58\u3002Qoder \u9700\u6DFB\u52A0 PAT\u3002</p>{data.localDiscovery?.filter(s => !provider || s.provider === provider).map(s => <p className=\"notice\" key={s.provider}>{data.providers?.find(p => p.id === s.provider)?.name || s.provider} \u00B7 {s.state === 'found' ? '\u5DF2\u53D1\u73B0\u672C\u673A\u5BA2\u6237\u7AEF\u767B\u5F55\u3002' : s.state === 'unreadable' ? '\u65E0\u6CD5\u8BFB\u53D6\u672C\u673A\u767B\u5F55\u6587\u4EF6\uFF0C\u8BF7\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u91CD\u65B0\u767B\u5F55\uFF0C\u6216\u624B\u52A8\u586B\u5199\u51ED\u8BC1\u3002' : '\u672A\u627E\u5230\u672C\u673A\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55\u5BF9\u5E94\u533A\u57DF\u7684\u5B98\u65B9\u5BA2\u6237\u7AEF\u3002'} \u00B7 {when(s.checkedAt)}</p>)}</div></details>\n </div>;\n}\nexport function CheckinPanel({ data, busy, act }) {\n const info = data.checkins || {}, rows = info.accounts || [], today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' });\n const saved = info.settings ?? { mode: 'scheduled', time: '10:05' };\n const [schedule, setSchedule] = useState(saved);\n useEffect(() => { setSchedule(saved); }, [saved.mode, saved.time]);\n const changed = schedule.mode !== saved.mode || schedule.time !== saved.time;\n const blocked = busy || info.running || !!info.error;\n const eligible = rows.filter(r => r.supported && !r.paused && data.accounts.find(a => a.id === r.id)?.enabled && r.ready === true);\n const ready = r => eligible.includes(r);\n return <div className=\"stack\"><section className=\"box stack\"><div className=\"bar\"><div><h3>\u6BCF\u65E5\u79EF\u5206\u7B7E\u5230</h3><p className=\"notice\">{info.schedule}</p><p className=\"notice\">\u81EA\u52A8\u7B7E\u5230\u9ED8\u8BA4\u5173\u95ED\uFF0C\u8BF7\u5728\u4E0B\u65B9\u9010\u4E2A\u5F00\u542F\u3002</p></div><button className=\"primary\" disabled={blocked || !eligible.length} onClick={() => { void act({ action: 'checkins.run', ids: eligible.map(r => r.id) }); }}>\u7B7E\u5230\u5168\u90E8\u53EF\u7528\u8D26\u53F7\uFF08{eligible.length}\uFF09</button></div>\n <form className=\"row plan-form\" onSubmit={e => { e.preventDefault(); void act({ action: 'checkins.settings', schedule }); }}><label className=\"filter\">\u81EA\u52A8\u7B7E\u5230\u65B9\u5F0F<select aria-label=\"\u81EA\u52A8\u7B7E\u5230\u65B9\u5F0F\" value={schedule.mode} disabled={blocked} onChange={e => setSchedule({ ...schedule, mode: e.target.value })}><option value=\"startup\">\u6BCF\u65E5\u542F\u52A8\u65F6\u7B7E\u5230</option><option value=\"scheduled\">\u6BCF\u5929\u5B9A\u65F6\u7B7E\u5230</option></select></label>{schedule.mode === 'scheduled' && <label className=\"filter\">\u7B7E\u5230\u65F6\u95F4\uFF08\u5317\u4EAC\u65F6\u95F4\uFF09<input aria-label=\"\u7B7E\u5230\u65F6\u95F4\uFF08\u5317\u4EAC\u65F6\u95F4\uFF09\" type=\"time\" required value={schedule.time} disabled={blocked} onChange={e => setSchedule({ ...schedule, time: e.target.value })} /></label>}<button disabled={blocked || !changed}>\u4FDD\u5B58\u7B7E\u5230\u8BA1\u5212</button></form>\n <details className=\"help\"><summary>\u6267\u884C\u89C4\u5219\u3001\u8865\u67E5\u4E0E\u8BBE\u5907\u9650\u5236</summary><div className=\"stack\"> <p className=\"notice\">\u81EA\u52A8\u7B7E\u5230\u9ED8\u8BA4\u5173\u95ED\uFF0C\u6309\u8D26\u53F7\u5F00\u542F\u3002\u5148\u67E5\u9886\u53D6\u72B6\u6001\u3001\u4E32\u884C\u63D0\u4EA4\uFF0C\u8D26\u53F7\u95F4\u9694\u81F3\u5C11 10 \u79D2\uFF1B\u6BCF\u4E2A\u8D26\u53F7\u6BCF\u5929\u6700\u591A\u63D0\u4EA4\u4E00\u6B21\u9886\u53D6\u3002\u786E\u8BA4\u5C1A\u672A\u63D0\u4EA4\u7684\u67E5\u8BE2\u5931\u8D25\uFF0C20:05 \u540E\u6700\u591A\u8865\u67E5\u4E00\u6B21\uFF1B\u5DF2\u9886\u53D6\u3001\u65E0\u6D3B\u52A8\u548C\u7ED3\u679C\u4E0D\u660E\u7684\u8D26\u53F7\u8DF3\u8FC7\u3002\u9047\u5230\u9A8C\u8BC1\u3001\u9650\u6D41\u6216\u8BBE\u5907\u9650\u5236\u5C31\u505C\u6B62\uFF0C\u4E0D\u4F1A\u4FEE\u6539\u8BBE\u5907\u8EAB\u4EFD\u6216\u5207\u6362\u8D26\u53F7\u91CD\u8BD5\u3002</p>\n <p className=\"notice\">\u542F\u52A8\u6A21\u5F0F\u5728\u5F53\u5929\u9996\u6B21\u8FD0\u884C\u65F6\u6267\u884C\uFF0C\u6301\u7EED\u8FD0\u884C\u5219\u65B0\u4E00\u5929\u81EA\u52A8\u6267\u884C\uFF1B\u5B9A\u65F6\u6A21\u5F0F\u5728\u8BBE\u5B9A\u65F6\u95F4\u540E\u6267\u884C\uFF0C\u9519\u8FC7\u65F6\u4E0B\u6B21\u542F\u52A8\u8865\u67E5\u3002Qoder \u6700\u65E9\u5317\u4EAC\u65F6\u95F4 10:05 \u67E5\u8BE2\u5F53\u65E5\u6D3B\u52A8\u3002DSH \u5173\u95ED\u671F\u95F4\u4E0D\u6267\u884C\uFF0C\u8FD0\u884C\u65F6\u7EA6\u4E00\u5206\u949F\u5185\u89E6\u53D1\u3002\u4FEE\u6539\u8BA1\u5212\u3001\u5237\u65B0\u9762\u677F\u6216\u91CD\u542F\u4E0D\u4F1A\u6E05\u9664\u5DF2\u5904\u7406\u8BB0\u5F55\uFF1B\u4EE4\u724C\u5931\u6548\u540E\u8BF7\u66F4\u65B0\u51ED\u8BC1\u518D\u6062\u590D\u3002</p>\n</div></details>\n {info.error && <p role=\"alert\" className=\"error\">{info.error}</p>}\n <p role=\"status\">{info.running ? `\u6B63\u5728\u5904\u7406 ${displayName(data.accounts.find(a => a.id === info.current)) || '\u7B7E\u5230\u961F\u5217'}\u2026` : '\u7B7E\u5230\u7ED3\u679C\u548C\u9886\u53D6\u79EF\u5206\u4EE5\u4E0B\u65B9\u5E73\u53F0\u54CD\u5E94\u4E3A\u51C6\u3002'}</p>\n {info.report && <p className=\"notice\">\u6700\u8FD1\u4E00\u8F6E \u00B7 {when(info.report.at)} \u00B7 {Object.entries(info.report.counts || {}).map(([key, n]) => `${resultLabels[key] || '\u672A\u5B8C\u6210'} ${n}`).join(' \u00B7 ')}\u3002\u6CA1\u6709\u5F85\u8865\u67E5\u8D26\u53F7\u65F6\u4E0D\u91CD\u590D\u6C47\u62A5\u3002</p>}\n </section>\n {data.providers.map(p => {\n const accounts = data.accounts.filter(a => a.provider === p.id);\n if (!accounts.length) return null;\n const supported = rows.some(r => r.id === accounts[0].id && r.supported), paused = rows.some(r => accounts.some(a => a.id === r.id) && r.paused);\n return <section className=\"box stack\" key={p.id}><div className=\"bar\"><h3>{p.name}</h3><span className=\"badge\">{supported ? paused ? '\u5DF2\u6682\u505C' : '\u652F\u6301\u7B7E\u5230' : '\u5B98\u65B9\u5BA2\u6237\u7AEF\u9886\u53D6'}</span></div>\n {!supported ? <p className=\"notice\">{p.id.startsWith('workbuddy') ? 'WorkBuddy AI \u6682\u672A\u63A5\u5165\u53EF\u6838\u9A8C\u7684\u7B7E\u5230\u63A5\u53E3\uFF0C\u8BF7\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u67E5\u770B\u6D3B\u52A8\u4E0E\u9886\u53D6\u5165\u53E3\u3002' : 'Trae Global \u6682\u65E0\u5DF2\u6838\u9A8C\u7684\u79EF\u5206\u7B7E\u5230\u63A5\u53E3\uFF0C\u8BF7\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u67E5\u770B\u6743\u76CA\u3002'}</p> : <>\n {paused && <div className=\"steps\"><p>\u5E73\u53F0\u9650\u5236\u6216\u9700\u8981\u9A8C\u8BC1\uFF0C\u5DF2\u6682\u505C\u8BE5\u5E73\u53F0\u7B7E\u5230\u3002\u8BF7\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u5904\u7406\u540E\u518D\u6062\u590D\uFF1B\u6062\u590D\u4ECD\u4FDD\u7559\u4ECA\u65E5\u5C1D\u8BD5\u8BB0\u5F55\u548C\u8BBE\u5907\u9650\u5236\u3002</p><button disabled={blocked} onClick={() => { void act({ action: 'checkins.resume', provider: p.id }); }}>\u6211\u5DF2\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u6062\u590D\u540E\u7EED\u7B7E\u5230</button></div>}\n <div className=\"scroll\" role=\"region\" aria-label={`${p.name} \u7B7E\u5230\u8BB0\u5F55`} tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u8D26\u53F7</th><th scope=\"col\">\u81EA\u52A8\u7B7E\u5230</th><th scope=\"col\">\u4ECA\u65E5\u7ED3\u679C</th><th scope=\"col\">\u6700\u8FD1\u8BB0\u5F55</th><th scope=\"col\" className=\"cell-actions\">\u64CD\u4F5C</th></tr></thead><tbody>{accounts.map(a => { const r = rows.find(r => r.id === a.id) || {}, last = r.last?.day === today ? r.last : undefined; return <tr key={a.id} className={info.current === a.id ? 'selected' : ''}><td><strong>{displayName(a)}</strong><small className=\"muted\">{a.enabled === false ? '\u8D26\u53F7\u5DF2\u505C\u7528' : '\u5DF2\u5728\u8D26\u53F7\u6C60\u4E2D'}</small></td><td><label className=\"check\"><input aria-label={`${displayName(a)} \u6BCF\u65E5\u81EA\u52A8\u7B7E\u5230`} type=\"checkbox\" disabled={blocked} checked={r.auto === true} onChange={e => { void act({ action: 'account.update', id: a.id, autoCheckin: e.target.checked }); }} />\u6BCF\u65E5\u81EA\u52A8\u7B7E\u5230</label></td><td><CheckinResult row={r} compact /></td><td><small className=\"muted\">{r.last ? when(r.last.at) : '\u5C1A\u65E0\u8BB0\u5F55'}</small><small className=\"muted\">{r.last?.message || '\u7B49\u5F85\u9996\u6B21\u7B7E\u5230'}</small>{last?.retryAt && <small className=\"warn\">\u8865\u67E5\u65F6\u95F4 {when(last.retryAt)}</small>}{r.last?.activity && <details><summary>\u6D3B\u52A8\u8BE6\u60C5</summary><small className=\"muted\">{[r.last.activity.streakDays !== undefined && `\u8FDE\u7B7E ${fmt(r.last.activity.streakDays)} \u5929`, r.last.activity.totalCredits !== undefined && `\u6D3B\u52A8\u7D2F\u8BA1 ${fmt(r.last.activity.totalCredits)} \u79EF\u5206`, r.last.activity.nextStreakDay !== undefined && `\u4E0B\u4E00\u8FDE\u7B7E\u6863\u4F4D ${fmt(r.last.activity.nextStreakDay)} \u5929`, r.last.activity.endsAt !== undefined && `\u6D3B\u52A8\u622A\u6B62 ${when(r.last.activity.endsAt)}`].filter(Boolean).join(' \u00B7 ')}</small></details>}</td><td className=\"cell-actions\">{p.id === 'workbuddy' && r.last?.status === 'auth-invalid' ? <button disabled={blocked} onClick={() => { void act({ action: 'checkins.verify', id: a.id }); }}>\u91CD\u65B0\u9A8C\u8BC1\u767B\u5F55</button> : <button disabled={blocked || !ready(r)} onClick={() => { void act({ action: 'checkins.run', ids: [a.id] }); }}>{r.last?.status === 'auth-invalid' ? '\u8BF7\u66F4\u65B0\u51ED\u8BC1' : last?.retryReady ? '\u8865\u67E5\u7B7E\u5230' : last?.retryAt ? '\u7B49\u5F85\u665A\u95F4\u8865\u67E5' : last ? '\u4ECA\u65E5\u5DF2\u5904\u7406' : '\u7ACB\u5373\u7B7E\u5230'}</button>}</td></tr>; })}</tbody></table></div>\n </>}\n </section>;\n })}\n {!data.accounts.length && <p className=\"box empty\">\u5148\u5230\u300C\u8D26\u53F7\u4E0E\u767B\u5F55\u300D\u6DFB\u52A0\u8D26\u53F7\uFF0C\u518D\u5F00\u542F\u6BCF\u65E5\u81EA\u52A8\u7B7E\u5230\u3002</p>}\n <p className=\"notice\">\u591A\u53F0\u8BBE\u5907\u7684\u672C\u5730\u8BB0\u5F55\u4E0D\u4F1A\u4E92\u76F8\u540C\u6B65\uFF0C\u6BCF\u6B21\u90FD\u4F1A\u67E5\u8BE2\u5E73\u53F0\u9886\u53D6\u72B6\u6001\uFF1B\u5EFA\u8BAE\u4EC5\u5728\u4E00\u53F0\u5E38\u7528\u8BBE\u5907\u5F00\u542F\u81EA\u52A8\u7B7E\u5230\u3002\u540C\u4E00 Trae \u8BBE\u5907\u6BCF\u5929\u6700\u591A\u5904\u7406\u4E00\u4E2A\u9886\u53D6\u8BF7\u6C42\uFF0C\u91CD\u590D\u8D26\u53F7\u526F\u672C\u4F1A\u53BB\u91CD\uFF1B\u4E0D\u4FDD\u8BC1\u5E73\u53F0\u4E00\u5B9A\u53D1\u653E\u5956\u52B1\u3002</p>\n </div>;\n}\nfunction Overview({ data, busy, act, go }) {\n const t = data.telemetry || {}, today = t.days?.[t.today] || {}, totals = data.accounts.reduce((s, a) => ({ requests: s.requests + (a.usage?.requests || 0), tokens: s.tokens + (a.usage?.tokens || 0) }), { requests: 0, tokens: 0 });\n const dates = Array.from({ length: 7 }, (_, i) => { const d = new Date(); d.setDate(d.getDate() - 6 + i); const key = d.toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' }); return { key, tokens: t.days?.[key]?.tokens || 0 }; });\n const max = Math.max(1, ...dates.map(d => d.tokens));\n return <div className=\"stack\"><div className=\"metrics\">{metric('\u4ECA\u65E5 Token', fmt(today.tokens || 0), '\u8F93\u5165 + \u8F93\u51FA \u00B7 \u5317\u4EAC\u65F6\u95F4')}{metric('\u4ECA\u65E5\u8BF7\u6C42', fmt(today.requests || 0), `\u5931\u8D25 ${fmt(today.failures || 0)} \u6B21`)}{metric('\u8D26\u53F7\u6C60', `${data.accounts.filter(a => a.enabled).length} / ${data.accounts.length}`, '\u542F\u7528 / \u5168\u90E8\u8D26\u53F7')}{metric('\u7D2F\u8BA1 Token', fmt(totals.tokens), `${fmt(totals.requests)} \u6B21\u8BF7\u6C42`)}</div>\n <PerformanceMetrics events={(t.events || []).filter(e => e.at >= usageDateBounds('1')[0])} />\n <div className=\"bar\"><h3>\u5E73\u53F0\u989D\u5EA6</h3><div className=\"row\"><span className=\"notice\">\u5E73\u53F0\u7528\u91CF \u00B7 \u6BCF 5 \u5206\u949F\u66F4\u65B0</span><button disabled={busy} onClick={() => { void act({ action: 'monitor.refresh' }); }}>\u5237\u65B0\u5E73\u53F0\u7528\u91CF</button></div></div>\n <section className=\"box table-shell\"><div className=\"scroll\" role=\"region\" aria-label=\"\u5404\u5E73\u53F0\u8D26\u53F7\u989D\u5EA6\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u8D26\u53F7</th><th scope=\"col\">\u4F9B\u5E94\u5546 / \u533A\u57DF</th><th scope=\"col\">\u5E73\u53F0\u79EF\u5206</th><th scope=\"col\">\u4ECA\u65E5\u7B7E\u5230</th><th scope=\"col\" className=\"cell-actions\">\u8DEF\u7531\u72B6\u6001</th></tr></thead><tbody>{data.accounts.map(a => <tr key={a.id}><td><strong>{displayName(a)}</strong><small className=\"muted\">{loginNames[a.login?.state] || '\u5C1A\u672A\u67E5\u8BE2\u767B\u5F55'}</small></td><td>{data.providers.find(p => p.id === a.provider)?.name || a.provider}</td><td><Balance account={a} /></td><td><CheckinResult row={data.checkins?.accounts.find(r => r.id === a.id)} /></td><td className=\"cell-actions\"><span className=\"status\"><i className={a.enabled === false ? '' : a.status?.cooldowns?.length ? 'warn' : 'good'} aria-hidden=\"true\" />{a.enabled === false ? '\u672A\u5165\u6C60' : a.status?.cooldowns?.length ? '\u90E8\u5206\u8DEF\u7531\u51B7\u5374' : '\u5DF2\u5728\u6C60\u4E2D'}</span></td></tr>)}</tbody></table>{!data.accounts.length && <p className=\"empty\">\u5C1A\u672A\u8FDE\u63A5\u8D26\u53F7\uFF0C\u8BF7\u5148\u83B7\u53D6\u672C\u673A\u767B\u5F55\u6216\u6DFB\u52A0\u51ED\u8BC1\u3002</p>}</div><div className=\"table-footer bar\"><p className=\"notice\">\u5404\u5E73\u53F0\u79EF\u5206\u72EC\u7ACB\u5C55\u793A\uFF0C\u4E34\u671F\u63D0\u9192\u4EC5\u663E\u793A\u5DF2\u786E\u8BA4\u7684\u4F59\u989D\u3002</p><button disabled={busy} onClick={() => go('accounts')}>\u7BA1\u7406\u8D26\u53F7\u6C60</button></div></section>\n <p className=\"notice\">\u9762\u677F\u8BFB\u53D6\u672C\u673A\u7F13\u5B58\uFF0C\u4E0D\u4F1A\u89E6\u53D1\u5E73\u53F0\u67E5\u8BE2\u3002\u5E73\u53F0\u4F59\u989D\u6BCF 5 \u5206\u949F\u66F4\u65B0\uFF0C\u624B\u52A8\u5237\u65B0\u7ACB\u5373\u67E5\u8BE2\uFF1B\u79EF\u5206\u8F6E\u6362\u4E0E\u4E34\u671F\u4F18\u5148\u6309\u9700\u590D\u6838\u3002Token \u4EC5\u7EDF\u8BA1\u672C\u63D2\u4EF6\u8BF7\u6C42\u3002</p>\n <div className=\"grid\"><section className=\"box\"><h3>\u8FD1 7 \u65E5 Token</h3><div className=\"trend\" role=\"img\" aria-label={dates.map(d => `${d.key} ${d.tokens} Token`).join('\uFF0C')}>{dates.map(d => <div key={d.key} title={`${d.key} \u00B7 ${fmt(d.tokens)} Token`}><i style={{ height: `${Math.max(3, d.tokens / max * 78)}%` }} /><small>{d.key.slice(5)}</small></div>)}</div><p className=\"notice\">\u672A\u8FD4\u56DE Token \u7528\u91CF\u7684\u8BF7\u6C42\uFF1A{fmt(data.accounts.reduce((n, a) => n + (a.usage?.unmetered || 0), 0))} \u6B21</p></section>\n <section className=\"box stack\"><h3>\u5E38\u7528\u5165\u53E3</h3><p className=\"notice\">\u8FDE\u63A5\u8D26\u53F7\u540E\uFF0C\u5728 DSH \u6A21\u578B\u9009\u62E9\u5668\u4E2D\u4F7F\u7528\u300C\u7EDF\u4E00\u8DEF\u7531\u300D\u3002</p><div className=\"row\"><button onClick={() => go('accounts')}>\u67E5\u770B\u8D26\u53F7</button><button onClick={() => go('routes')}>\u914D\u7F6E\u8DEF\u7531</button><button onClick={() => go('checkins')}>\u79EF\u5206\u7B7E\u5230</button><button onClick={() => go('plugins')}>\u68C0\u67E5\u6240\u6709\u63D2\u4EF6\u66F4\u65B0</button></div></section></div>\n <section className=\"box\"><div className=\"bar\"><h3>\u6700\u8FD1\u8BF7\u6C42</h3><button onClick={() => go('usage')}>\u67E5\u770B Token \u660E\u7EC6</button></div><div className=\"scroll\"><table className=\"table\"><thead><tr><th>\u65F6\u95F4</th><th>\u8D26\u53F7</th><th>\u8DEF\u7531 / \u6A21\u578B</th><th>Token</th><th>\u6027\u80FD</th><th>\u7ED3\u679C</th></tr></thead><tbody>{(t.events || []).slice(0, 15).map((e, i) => <tr key={`${e.at}:${i}`}><td>{when(e.at)}</td><td>{data.accounts.find(a => a.id === e.account)?.name || e.account}</td><td className=\"mono\">{e.alias}</td><td>{fmt(e.tokens)}</td><td><RequestPerformance event={e} /></td><td>{e.outcome === 'completed' ? '\u6210\u529F' : e.outcome === 'cancelled' ? '\u5DF2\u53D6\u6D88' : `\u5931\u8D25 ${e.status}`}</td></tr>)}</tbody></table>{!t.events?.length && <p className=\"empty\">\u5C1A\u65E0\u8BF7\u6C42\u8BB0\u5F55\u3002\u901A\u8FC7\u672C\u63D2\u4EF6\u8C03\u7528\u6A21\u578B\u540E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002</p>}</div></section>\n </div>;\n}\nexport function usageDateBounds(period, start, end, now = Date.now()) {\n const today = new Date(now).toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' });\n const midnight = day => Date.parse(`${day}T00:00:00+08:00`);\n if (period === 'custom') return [midnight(start), midnight(end) + 86400000];\n if (period === 'all') return [-Infinity, Infinity];\n return [midnight(today) - (Number(period) - 1) * 86400000, midnight(today) + 86400000];\n}\nexport const duration = ms => typeof ms !== 'number' || !Number.isFinite(ms) ? '\u2014' : ms < 60000 ? `${fmt(ms / 1000)} \u79D2` : `${Math.floor(ms / 60000)} \u5206 ${fmt(ms % 60000 / 1000)} \u79D2`;\nexport function performanceSummary(events) {\n const rows = events.filter(e => e.outcome === 'completed' && e.timing);\n const sum = (key, source = rows) => source.some(e => e.timing[key] != null) ? source.reduce((n, e) => n + (e.timing[key] ?? 0), 0) : null;\n const first = rows.filter(e => e.timing.ttftMs != null), decode = rows.filter(e => e.timing.decodeMs > 0 && e.timing.decodeTokens != null), tools = rows.filter(e => e.timingSource === 'dsh-step');\n return { modelMs: sum('modelMs'), toolMs: sum('toolMs', tools), ttftMs: first.length ? sum('ttftMs', first) / first.length : null,\n tps: decode.length ? sum('decodeTokens', decode) / (sum('decodeMs', decode) / 1000) : null,\n samples: rows.length, firstSamples: first.length, decodeSamples: decode.length, toolSamples: tools.length,\n pendingTools: tools.reduce((n, e) => n + (e.timing.toolCount ?? 0) - (e.timing.toolsCompleted ?? 0), 0) };\n}\nfunction PerformanceMetrics({ events }) {\n const stats = performanceSummary(events);\n return <section className=\"stack performance\" aria-label=\"\u8C03\u7528\u6027\u80FD\u7EDF\u8BA1\"><div className=\"bar\"><h3>\u8C03\u7528\u6027\u80FD</h3><p className=\"notice\">\u6210\u529F\u8C03\u7528 \u00B7 {fmt(stats.samples)} \u6761\u6027\u80FD\u8BB0\u5F55</p></div><div className=\"metrics\">\n {metric('\u6A21\u578B\u7528\u65F6', duration(stats.modelMs), '\u6210\u529F\u8C03\u7528\u7528\u65F6\u5408\u8BA1')}{metric('\u5DE5\u5177\u8C03\u7528\u7528\u65F6', duration(stats.toolMs), `${stats.toolSamples} \u6761 DSH \u6B65\u9AA4${stats.pendingTools ? ` \u00B7 ${stats.pendingTools} \u4E2A\u5DE5\u5177\u672A\u5B8C\u6210` : ''}`)}\n {metric('\u9996 Token \u5E73\u5747\uFF08TTFT\uFF09', duration(stats.ttftMs), `${stats.firstSamples} \u6761\u9996 Token \u8BB0\u5F55`)}{metric('\u8F93\u51FA\u901F\u5EA6\uFF08TPS\uFF09', stats.tps === null ? '\u2014' : `${fmt(stats.tps)} tok/s`, `${stats.decodeSamples} \u6761\u89E3\u7801\u8BB0\u5F55 \u00B7 \u52A0\u6743\u901F\u5EA6`)}</div>\n <details className=\"help\"><summary>\u7EDF\u8BA1\u53E3\u5F84\u4E0E\u7F3A\u5931\u6570\u636E</summary><div><p className=\"notice\">\u968F\u5F53\u524D\u65F6\u95F4\u3001\u8D26\u53F7\u3001\u8DEF\u7531\u548C\u7ED3\u679C\u7B5B\u9009\u6C47\u603B\uFF0C\u4ECE\u672C\u7248\u5F00\u59CB\u8BB0\u5F55\uFF1B\u65E7\u6570\u636E\u4E0D\u8865\u7B97\u3002DSH \u6B65\u9AA4\u53E3\u5F84\u4E0E\u4F1A\u8BDD\u7EDF\u8BA1\u4E00\u81F4\uFF1A\u6A21\u578B\u7528\u65F6\u4ECE\u6B65\u9AA4\u5F00\u59CB\u5230\u56DE\u590D\u5B8C\u6210\uFF0C\u9996 Token \u5305\u62EC\u975E\u7A7A\u6587\u672C\u3001\u63A8\u7406\u6216\u5DE5\u5177\u8C03\u7528\uFF0C\u5DE5\u5177\u7528\u65F6\u6309\u8C03\u7528\u4E0E\u7ED3\u679C\u914D\u5BF9\u76F8\u52A0\uFF08\u5E76\u884C\u5DE5\u5177\u53EF\u80FD\u91CD\u53E0\uFF09\u3002TPS = \u6709\u6548\u8F93\u51FA Token \u5408\u8BA1 \u00F7 \u9996 Token \u540E\u7684\u89E3\u7801\u79D2\u6570\u5408\u8BA1\uFF0C\u4E0D\u5BF9\u5404\u6B21\u901F\u5EA6\u7B80\u5355\u5E73\u5747\u3002\u672A\u7ECF\u8FC7 DSH \u6B65\u9AA4\u7684\u8BF7\u6C42\u4F7F\u7528\u4E0A\u6E38\u8BA1\u65F6\uFF0C\u65E0\u6CD5\u8BB0\u5F55\u5DE5\u5177\u6267\u884C\u7528\u65F6\u3002\u8FD9\u91CC\u53EA\u6C47\u603B\u672C\u63D2\u4EF6\u4FDD\u7559\u4E14\u7B5B\u9009\u5185\u7684\u8C03\u7528\uFF0C\u5E76\u975E\u67D0\u4E2A\u4F1A\u8BDD\u7684\u5B8C\u6574\u5386\u53F2\u3002\u5931\u8D25\u4E0E\u53D6\u6D88\u4FDD\u7559\u9010\u6B21\u8017\u65F6\uFF0C\u4E0D\u8BA1\u5165\u4EE5\u4E0A\u6210\u529F\u8C03\u7528\u6307\u6807\u3002</p></div></details></section>;\n}\nexport function UsageDetails({ data, busy, act }) {\n const [account, setAccount] = useState(''), [route, setRoute] = useState(''), [outcome, setOutcome] = useState(''), [page, setPage] = useState(0);\n const [period, setPeriod] = useState('30'), [start, setStart] = useState(() => new Date(Date.now() - 29 * 86400000).toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' })), [end, setEnd] = useState(() => new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Shanghai' }));\n const all = data.telemetry?.events || [], retention = data.options.usageRetentionDays;\n const [from, until] = usageDateBounds(period, start, end), invalidRange = !(from < until);\n const events = all.filter(e => e.at >= from && e.at < until && (!account || e.account === account) && (!route || e.alias === route) && (!outcome || e.outcome === outcome));\n const pages = Math.max(1, Math.ceil(events.length / 50)), current = Math.min(page, pages - 1);\n const accountName = id => data.accounts.find(a => a.id === id)?.name || id;\n const routeName = id => data.routes.find(r => r.id === id)?.name || id;\n const total = key => events.some(e => e[key] != null) ? events.reduce((n, e) => n + (e[key] ?? 0), 0) : null;\n const missing = events.filter(e => e.input == null || e.output == null).length;\n return <div className=\"stack\"><section className=\"box stack\"><div className=\"bar\"><div><h3>\u9010\u6B21\u8BF7\u6C42\u7528\u91CF</h3><p className=\"notice\">\u8BB0\u5F55\u6BCF\u6B21\u4E0A\u6E38\u8C03\u7528\uFF0C\u5305\u62EC\u6545\u969C\u5207\u6362\u4E2D\u5931\u8D25\u7684\u5C1D\u8BD5\u3002</p></div><span className=\"badge\">\u6700\u8FD1 {retention} \u5929 \u00B7 {fmt(all.length)} \u6761</span></div>\n <details className=\"help\"><summary>\u8C03\u6574\u660E\u7EC6\u4FDD\u7559\u5929\u6570\uFF08\u5F53\u524D {retention} \u5929\uFF09</summary><div className=\"stack\"><form key={retention} className=\"row\" onSubmit={e => { e.preventDefault(); void act({ action: 'options.save', usageRetentionDays: Number(new FormData(e.currentTarget).get('days')) }); }}><label className=\"filter\">\u660E\u7EC6\u4FDD\u7559\u5929\u6570<input name=\"days\" type=\"number\" min=\"1\" max=\"365\" step=\"1\" required disabled={busy} defaultValue={retention} /></label><button type=\"submit\" disabled={busy}>\u4FDD\u5B58\u4FDD\u7559\u671F\u9650</button></form><p className=\"notice\">\u9ED8\u8BA4\u6EDA\u52A8\u4FDD\u7559\u6700\u8FD1 30 \u5929\uFF0C\u53EF\u8BBE\u7F6E 1\u2013365 \u5929\u3002\u7F29\u77ED\u671F\u9650\u4F1A\u5220\u9664\u8D85\u671F\u660E\u7EC6\uFF0C\u5EF6\u957F\u4E0D\u80FD\u6062\u590D\u5DF2\u5220\u9664\u8BB0\u5F55\uFF1B\u7D2F\u8BA1\u7EDF\u8BA1\u3001\u989D\u5EA6\u8F6E\u6362\u548C\u4E34\u671F\u51B7\u5374\u4E0D\u53D7\u5F71\u54CD\u3002</p></div></details></section>\n <div className=\"bar\"><div className=\"row\" role=\"group\" aria-label=\"\u660E\u7EC6\u65F6\u95F4\u8303\u56F4\">{[['1', '\u4ECA\u65E5'], ['3', '\u8FD1 3 \u65E5'], ['7', '\u8FD1 7 \u65E5'], ['30', '\u8FD1 30 \u65E5'], ['all', '\u5168\u90E8\u5DF2\u4FDD\u7559'], ['custom', '\u81EA\u5B9A\u4E49']].map(([value, label]) => <button key={value} aria-pressed={period === value} onClick={() => { setPeriod(value); setPage(0); }}>{label}</button>)}</div><p className=\"notice\">\u6309\u5317\u4EAC\u65F6\u95F4\u81EA\u7136\u65E5\u7B5B\u9009</p></div>\n {period === 'custom' && <div className=\"row\"><label className=\"filter\">\u5F00\u59CB\u65E5\u671F\uFF08\u5317\u4EAC\u65F6\u95F4\uFF09<input type=\"date\" value={start} max={end || undefined} required onChange={e => { setStart(e.target.value); setPage(0); }} /></label><label className=\"filter\">\u7ED3\u675F\u65E5\u671F\uFF08\u5317\u4EAC\u65F6\u95F4\uFF09<input type=\"date\" value={end} min={start || undefined} required onChange={e => { setEnd(e.target.value); setPage(0); }} /></label>{invalidRange && <p role=\"alert\" className=\"error\">\u8BF7\u9009\u62E9\u6709\u6548\u7684\u8D77\u6B62\u65E5\u671F\uFF0C\u7ED3\u675F\u65E5\u671F\u4E0D\u80FD\u65E9\u4E8E\u5F00\u59CB\u65E5\u671F\u3002</p>}</div>}\n <div className=\"row\"><label className=\"filter\">\u8D26\u53F7<select value={account} onChange={e => { setAccount(e.target.value); setPage(0); }}><option value=\"\">\u5168\u90E8\u8D26\u53F7</option>{[...new Set(all.map(e => e.account))].map(id => <option key={id} value={id}>{accountName(id)}</option>)}</select></label><label className=\"filter\">\u8DEF\u7531 / \u6A21\u578B<select value={route} onChange={e => { setRoute(e.target.value); setPage(0); }}><option value=\"\">\u5168\u90E8\u8DEF\u7531 / \u6A21\u578B</option>{[...new Set(all.map(e => e.alias))].map(id => <option key={id} value={id}>{routeName(id)}</option>)}</select></label><label className=\"filter\">\u7ED3\u679C<select value={outcome} onChange={e => { setOutcome(e.target.value); setPage(0); }}><option value=\"\">\u5168\u90E8\u7ED3\u679C</option><option value=\"completed\">\u6210\u529F</option><option value=\"failed\">\u5931\u8D25</option><option value=\"cancelled\">\u5DF2\u53D6\u6D88</option></select></label></div>\n <div className=\"metrics\">{metric('\u7B5B\u9009\u5185\u8C03\u7528', fmt(events.length), '\u4E0A\u6E38\u5C1D\u8BD5\u6B21\u6570')}{metric('\u8F93\u5165 Token', fmt(total('input')), '\u5DF2\u8FD4\u56DE\u7684\u8F93\u5165\u5206\u9879')}{metric('\u8F93\u51FA Token', fmt(total('output')), '\u5DF2\u8FD4\u56DE\u7684\u8F93\u51FA\u5206\u9879')}{metric('\u603B Token', fmt(total('tokens')), '\u5DF2\u8FD4\u56DE\u7684\u603B\u91CF')}</div><p className=\"notice\">\u6570\u636E\u6765\u81EA\u5E73\u53F0\u8FD4\u56DE\u7684 usage\u3002{missing ? fmt(missing) + ' \u6761\u7F3A\u5C11\u8F93\u5165\u6216\u8F93\u51FA\u5206\u9879\uFF1B\u65E7\u8BB0\u5F55\u4E0D\u8865\u7B97\u3002' : '\u8F93\u5165\u3001\u8F93\u51FA\u4E3A\u5B9E\u9645\u8FD4\u56DE\u503C\u3002'}\u7F13\u5B58\u8F93\u5165\u5305\u542B\u5728\u8F93\u5165\u4E2D\uFF0C\u63A8\u7406\u8F93\u51FA\u5305\u542B\u5728\u8F93\u51FA\u4E2D\uFF0C\u5747\u4E0D\u91CD\u590D\u76F8\u52A0\u3002\u672A\u8FD4\u56DE\u7684\u6570\u636E\u4EE5\u300C\u2014\u300D\u663E\u793A\u3002</p>\n <PerformanceMetrics events={events} />\n <section className=\"box table-shell\"><div className=\"scroll\" role=\"region\" aria-label=\"\u8BF7\u6C42\u7528\u91CF\u4E0E\u6027\u80FD\u660E\u7EC6\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th>\u65F6\u95F4</th><th>\u6E20\u9053 / \u8D26\u53F7</th><th>\u8DEF\u7531 / \u5B9E\u9645\u6A21\u578B</th><th>\u8F93\u5165</th><th>\u8F93\u51FA</th><th>\u603B Token</th><th>\u6027\u80FD</th><th>\u7ED3\u679C</th></tr></thead><tbody>{events.slice(current * 50, (current + 1) * 50).map((e, i) => <tr key={e.at + ':' + current + ':' + i}><td>{when(e.at)}</td><td>{data.providers.find(p => p.id === e.provider)?.name || e.provider}<br /><small>{accountName(e.account)}</small></td><td>{routeName(e.alias)}<br /><small className=\"mono\">{e.model || '\u672A\u8BB0\u5F55\u5B9E\u9645\u6A21\u578B'}</small></td><td>{fmt(e.input)}{e.cachedInput != null && <><br /><small>\u7F13\u5B58 {fmt(e.cachedInput)}</small></>}</td><td>{fmt(e.output)}{e.reasoningOutput != null && <><br /><small>\u63A8\u7406 {fmt(e.reasoningOutput)}</small></>}</td><td>{fmt(e.tokens)}</td><td><RequestPerformance event={e} /></td><td>{e.outcome === 'completed' ? '\u6210\u529F' : e.outcome === 'cancelled' ? '\u5DF2\u53D6\u6D88' : '\u5931\u8D25'}<br /><small>{e.status}</small></td></tr>)}</tbody></table>{!events.length && <p className=\"empty\">\u5F53\u524D\u7B5B\u9009\u548C\u4FDD\u7559\u671F\u9650\u5185\u6CA1\u6709\u8BF7\u6C42\u660E\u7EC6\u3002</p>}</div><div className=\"bar table-footer\"><p className=\"notice\">\u7B2C {current + 1} / {pages} \u9875 \u00B7 \u6BCF\u9875 50 \u6761</p><div className=\"row\"><button disabled={current === 0} onClick={() => setPage(current - 1)}>\u4E0A\u4E00\u9875</button><button disabled={current >= pages - 1} onClick={() => setPage(current + 1)}>\u4E0B\u4E00\u9875</button></div></div></section>\n </div>;\n}\nfunction RequestPerformance({ event: e }) {\n const t = e.timing;\n if (!t) return <small>\u672A\u8BB0\u5F55</small>;\n return <details className=\"help\"><summary>{duration(t.modelMs)}</summary><div style={{ minWidth: 170 }}><small>\u6A21\u578B\uFF1A{duration(t.modelMs)}</small><small>\u9996 Token\uFF1A{duration(t.ttftMs)}</small><small>TPS\uFF1A{t.decodeMs > 0 && t.decodeTokens != null ? `${fmt(t.decodeTokens / (t.decodeMs / 1000))} tok/s` : '\u2014'}</small><small>\u5DE5\u5177\uFF1A{duration(t.toolMs)}{t.toolCount != null ? ` \u00B7 ${t.toolsCompleted} / ${t.toolCount} \u5B8C\u6210` : ''}</small><small>{e.timingSource === 'dsh-step' ? 'DSH \u6B65\u9AA4\u8BA1\u65F6' : '\u4E0A\u6E38\u8BF7\u6C42\u8BA1\u65F6'}</small></div></details>;\n}\nfunction AccountForm({ modal, provider, data, busy, act, close, replace, error, notice }) {\n const [revision, setRevision] = useState(modal.revision);\n const edit = modal.mode === 'edit', account = edit ? data.accounts.find(a => a.id === modal.account.id) : null;\n return edit ? <div className=\"modal-body stack\"><Feedback error={error} notice={notice} /><div className=\"box stack\"><h3>{account.name}</h3><p>{loginNames[account.login?.state] || '\u5C1A\u672A\u67E5\u8BE2'}</p><p className=\"notice\">\u8D26\u53F7\u8EAB\u4EFD\uFF1A{account.login?.name || '\u5C1A\u672A\u83B7\u53D6'}<br />\u8BA4\u8BC1\u65B9\u5F0F\uFF1A{account.login?.kind || '\u672A\u77E5'}<br />\u767B\u5F55\u6709\u6548\u81F3\uFF1A{account.login?.kind === 'PAT' ? '\u5E73\u53F0\u672A\u8FD4\u56DE\u6709\u6548\u671F' : when(account.login?.expiresAt)}<br />\u81EA\u52A8\u5237\u65B0\uFF1A{account.login?.refreshable ? '\u652F\u6301' : '\u65E0\u5237\u65B0\u51ED\u8BC1'}<br />\u4E0A\u6B21\u7528\u91CF\u66F4\u65B0\uFF1A{when(account.usage?.balance?.fetchedAt)}</p><button disabled={busy} onClick={() => { void act({ action: 'account.refresh', id: account.id }); }}>\u5237\u65B0\u767B\u5F55\u4E0E\u7528\u91CF</button><button disabled={busy} onClick={replace}>\u8865\u5145 / \u66F4\u65B0\u51ED\u8BC1</button></div>\n <div className=\"bar\"><div><h3>\u8DEF\u7531\u8D26\u53F7\u987A\u5E8F</h3><p className=\"notice\">\u6545\u969C\u5207\u6362\u6309\u6B64\u987A\u5E8F\u5C1D\u8BD5\uFF1B\u6743\u91CD\u6216\u989D\u5EA6\u7B56\u7565\u4EE5\u8DEF\u7531\u914D\u7F6E\u4E3A\u51C6\u3002</p></div><div className=\"row\">{[-1, 1].map(direction => { const group = data.accounts.filter(a => a.provider === account.provider), i = group.findIndex(a => a.id === account.id); return <button type=\"button\" key={direction} disabled={busy || (direction < 0 ? i === 0 : i === group.length - 1)} onClick={async () => { const next = await act({ action: 'account.move', id: account.id, direction }); if (next) setRevision(next.revision); }}>{direction < 0 ? '\u524D\u79FB' : '\u540E\u79FB'}</button>; })}</div></div>\n <CredentialTransfer account={account} busy={busy} act={act} />\n <section className=\"box\"><h3>\u5E73\u53F0\u5957\u9910\u4E0E\u989D\u5EA6</h3>{account.usage?.balance?.plan && <p>{account.usage.balance.plan}</p>}{(account.usage?.balance?.packages || []).map((p, i) => <div className=\"item\" key={i}><div className=\"bar\"><span>{p.name || '\u989D\u5EA6\u5305'}</span><strong>{p.unlimited ? '\u4E0D\u9650\u91CF' : `${fmt(p.remaining)} / ${fmt(p.total)}`}</strong></div>{p.expiresAt && <p className=\"notice\">\u6709\u6548\u81F3 {when(p.expiresAt)}</p>}</div>)}{!account.usage?.balance?.packages?.length && <p className=\"notice\">\u5C1A\u65E0\u53EF\u5C55\u793A\u989D\u5EA6\u5305\uFF0C\u70B9\u51FB\u5237\u65B0\u83B7\u53D6\u3002</p>}</section>\n <form className=\"stack\" onSubmit={async e => { e.preventDefault(); if (await act({ action: 'account.update', revision, id: account.id, name: new FormData(e.currentTarget).get('name') })) close(); }}><label>\u8D26\u53F7\u663E\u793A\u540D\u79F0<input name=\"name\" required defaultValue={account.name} maxLength={100} disabled={busy} /></label><div className=\"bar\"><button type=\"button\" disabled={busy} onClick={async () => { if (await act({ action: 'account.remove', id: account.id })) close(); }}>\u79FB\u51FA\u8D26\u53F7\u6C60</button><button className=\"primary\" type=\"submit\" disabled={busy}>\u4FDD\u5B58\u540D\u79F0</button></div><p className=\"notice\">\u79FB\u51FA\u8D26\u53F7\u6C60\u540E\u4FDD\u7559\u51ED\u8BC1\u6587\u4EF6\uFF0C\u53EF\u4ECE\u6587\u4EF6\u91CD\u65B0\u5BFC\u5165\u3002</p></form></div>\n : <CredentialForm key={modal.mode} modal={modal} provider={provider} data={data} busy={busy} act={act} close={close} error={error} notice={notice} />;\n}\n\nfunction CredentialTransfer({ account, busy, act }) {\n const container = useRef(null), [pending, setPending] = useState(false), [notice, setNotice] = useState(''), [error, setError] = useState(''), [manual, setManual] = useState('');\n async function extract(copy) {\n if (pending || busy) return;\n setPending(true); setNotice(''); setError(''); setManual('');\n try {\n const result = await act({ action: 'account.export', id: account.id }); if (!result) return;\n if (!copy) { downloadJson(result.exported); setNotice('\u5DF2\u53D1\u8D77\u51ED\u8BC1 JSON \u4E0B\u8F7D\uFF0C\u5728\u5176\u4ED6\u8BBE\u5907\u6DFB\u52A0\u8D26\u53F7\u65F6\u9009\u62E9\u8BE5\u6587\u4EF6\u5373\u53EF\u3002'); return; }\n const text = JSON.stringify(result.exported.document, null, 2);\n try { await navigator.clipboard.writeText(text); }\n catch {\n // The desktop WebView may not expose Clipboard API; keep copying inside the active dialog.\n const focus = document.activeElement, area = document.createElement('textarea');\n area.value = text; area.style.cssText = 'position:fixed;opacity:0;pointer-events:none'; container.current.append(area); area.select();\n let copied = false;\n try { copied = document.execCommand('copy'); } catch { /* Offer explicit manual copying below. */ }\n finally { area.remove(); focus?.focus(); }\n if (!copied) { setManual(text); setNotice('\u5F53\u524D\u73AF\u5883\u4E0D\u5141\u8BB8\u81EA\u52A8\u590D\u5236\uFF0C\u8BF7\u70B9\u51FB\u4E0B\u65B9\u6587\u672C\u6846\u5168\u9009\u5E76\u590D\u5236\u3002'); return; }\n }\n setNotice('\u51ED\u8BC1 JSON \u5DF2\u590D\u5236\uFF0C\u53EF\u5728\u5176\u4ED6\u8BBE\u5907\u6DFB\u52A0\u8D26\u53F7\u65F6\u76F4\u63A5\u7C98\u8D34\u3002');\n } catch { setError('\u51ED\u8BC1\u63D0\u53D6\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u3002'); } finally { setPending(false); }\n }\n return <section ref={container} className=\"box stack\"><h3>\u51ED\u8BC1\u63D0\u53D6\u4E0E\u8DE8\u8BBE\u5907\u4F7F\u7528</h3><p className=\"notice\">\u5355\u8D26\u53F7 JSON \u5305\u542B\u767B\u5F55 Token / PAT\uFF0CTrae \u540C\u65F6\u5305\u542B\u5FC5\u8981\u8BBE\u5907\u8EAB\u4EFD\u3002\u590D\u5236\u53CA\u6B64\u5904\u5BFC\u51FA\u4E3A\u660E\u6587\uFF0C\u8BF7\u4EC5\u5728\u81EA\u5DF1\u7684\u8BBE\u5907\u95F4\u4F20\u9012\uFF1B\u9700\u8981\u52A0\u5BC6\u65F6\u4F7F\u7528\u300C\u914D\u7F6E\u8FC1\u79FB\u300D\u3002</p><div className=\"row\"><button type=\"button\" disabled={busy || pending} onClick={() => { void extract(true); }}>\u590D\u5236\u51ED\u8BC1 JSON</button><button type=\"button\" disabled={busy || pending} onClick={() => { void extract(false); }}>\u5BFC\u51FA\u51ED\u8BC1 JSON</button></div><Feedback error={error} notice={notice} />{manual && <label>\u624B\u52A8\u590D\u5236\u51ED\u8BC1 JSON<textarea readOnly rows=\"5\" autoComplete=\"off\" spellCheck=\"false\" value={manual} onFocus={e => e.currentTarget.select()} /></label>}<p className=\"notice\">\u65B0\u8BBE\u5907\uFF1A\u6DFB\u52A0\u8D26\u53F7 \u2192 \u7C98\u8D34 / \u9009\u62E9\u51ED\u8BC1 JSON \u2192 \u4FDD\u5B58\u3002\u5E73\u53F0\u8981\u6C42\u91CD\u65B0\u767B\u5F55\u65F6\uFF0C\u9700\u66F4\u65B0\u51ED\u8BC1\u3002</p></section>;\n}\n\nfunction CredentialForm({ modal, provider, data, busy, act, close, error, notice }) {\n const replacing = modal.mode === 'credentials';\n const [selected, setSelected] = useState(modal.account?.provider || provider), [mode, setMode] = useState('client'), [localError, setLocalError] = useState(''), [json, setJson] = useState('');\n const [edition, setEdition] = useState(modal.account?.login?.edition || 'auto');\n const [phone, setPhone] = useState(''), [smsCode, setSmsCode] = useState(''), [sms, setSms] = useState(null), [verify, setVerify] = useState(true), [clock, setClock] = useState(Date.now());\n useEffect(() => { if (mode !== 'sms') return; const timer = setInterval(() => setClock(Date.now()), 1000); return () => clearInterval(timer); }, [mode]);\n const resend = Math.max(0, Math.ceil(((sms?.resendAt || 0) - clock) / 1000));\n const isTrae = selected.startsWith('trae'), isQoder = selected.startsWith('qoder'), global = selected === 'trae-global' || selected === 'workbuddy-ai' || selected === 'qoder-global';\n const field = (label, name, type = 'text', required = true, value) => <label>{label}<input name={name} type={type} autoComplete=\"off\" required={required} defaultValue={value} disabled={busy} /></label>;\n function receiveJson(text) {\n setJson(text); setLocalError('');\n try { const parsed = JSON.parse(text); if (!replacing && parsed.format === 'dsh-multi-router-account' && data.providers.some(p => p.id === parsed.provider)) {\n setSelected(parsed.provider); setEdition(parsed.credential?.edition || (parsed.provider === 'trae-global' ? 'sg' : 'cn'));\n } } catch { /* Allow unfinished JSON while typing. */ }\n }\n async function submit(e) {\n e.preventDefault(); setLocalError(''); const f = Object.fromEntries(new FormData(e.currentTarget));\n if (mode === 'sms') {\n const result = await act({ action: 'workbuddy.login', revision: data.revision, challenge: sms?.challenge, code: smsCode, verify, id: replacing ? modal.account.id : undefined, name: f.name || undefined });\n if (result) { setPhone(''); setSmsCode(''); setSms(null); close(selected); } return;\n }\n let document, identityDocument;\n try {\n if (mode === 'json') { document = JSON.parse(json); if (f.identityJSON?.trim()) identityDocument = JSON.parse(f.identityJSON); }\n if (mode === 'manual') {\n if (isQoder) document = { version: 2, pat: f.pat.trim(), region: global ? 'global' : 'china' };\n else {\n const credential = { accessToken: f.accessToken.trim(), ...(f.refreshToken?.trim() ? { refreshToken: f.refreshToken.trim() } : {}), expiresAtMs: new Date(f.expiresAt).getTime(),\n ...(f.refreshExpiresAt ? { refreshExpiresAtMs: new Date(f.refreshExpiresAt).getTime() } : {}),\n ...(isTrae ? { userId: f.identityId.trim(), edition, host: global ? 'https://growsg-normal.trae.ai' : 'https://api.trae.cn' } : { uid: f.identityId.trim(), domain: f.domain.trim() }) };\n document = { version: 1, credential };\n if (isTrae) identityDocument = { edition, machineId: f.machineId.trim(), deviceId: f.deviceId.trim() };\n }\n }\n } catch { setLocalError('JSON \u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5\u51ED\u8BC1\u53CA\u8BBE\u5907\u8EAB\u4EFD JSON\u3002'); return; }\n const action = replacing ? 'account.credentials' : 'account.capture';\n if (await act({ action, revision: modal.revision, id: modal.account?.id, provider: selected, edition, name: f.name || (document?.format === 'dsh-multi-router-account' ? document.name : undefined),\n ...(document ? { document, identityDocument } : { source: f.source || undefined, identity: f.identity || undefined }) })) { setJson(''); close(selected); }\n }\n return <form onSubmit={submit}><div className=\"modal-body stack\"><Feedback error={localError || error} notice={notice} />\n <div className=\"grid\"><label>\u4F9B\u5E94\u5546 / \u533A\u57DF<select disabled={busy || replacing} value={selected} onChange={e => { setSelected(e.target.value); setEdition('auto'); setMode('client'); setJson(''); setLocalError(''); setSms(null); setSmsCode(''); setPhone(''); }}>{data.providers.map(p => <option key={p.id} value={p.id}>{p.name}</option>)}</select></label>{field('\u8D26\u53F7\u540D\u79F0\uFF08\u53EF\u9009\uFF09', 'name', 'text', false, modal.account?.name)}\n {isTrae && <label>\u767B\u5F55\u7684\u5BA2\u6237\u7AEF<select value={edition} disabled={busy} onChange={e => setEdition(e.target.value)}>{(mode === 'client' ? [['auto', '\u81EA\u52A8\u8BC6\u522B\uFF08\u63A8\u8350\uFF09'], ...(global ? [['sg', 'Trae Global'], ['solo-sg', 'TRAE SOLO Global']] : [['cn', 'Trae CN'], ['solo', 'TRAE SOLO CN']])] : global ? [['sg', 'Trae Global'], ['solo-sg', 'TRAE SOLO Global']] : [['cn', 'Trae CN'], ['solo', 'TRAE SOLO CN']]).map(([id, label]) => <option key={id} value={id}>{label}</option>)}</select></label>}</div>\n <label>\u51ED\u8BC1\u6DFB\u52A0\u65B9\u5F0F<select disabled={busy} value={mode} onChange={e => { setMode(e.target.value); if (e.target.value !== 'client' && edition === 'auto') setEdition(global ? 'sg' : 'cn'); setJson(''); setLocalError(''); }}><option value=\"client\">\u4E00\u952E\u8BFB\u53D6\u672C\u673A\u767B\u5F55</option>{selected === 'workbuddy' && <option value=\"sms\">\u77ED\u4FE1\u767B\u5F55\u5E76\u4FDD\u5B58\u51ED\u8BC1</option>}<option value=\"manual\">\u624B\u52A8\u586B\u5199{isQoder ? ' PAT' : '\u51ED\u8BC1'}</option><option value=\"json\">\u7C98\u8D34 / \u9009\u62E9\u51ED\u8BC1 JSON</option></select></label>\n {mode === 'sms' ? <section className=\"steps stack\"><h3>WorkBuddy \u624B\u673A\u53F7\u767B\u5F55</h3><p className=\"notice\">\u4EC5\u7528\u4E8E\u5DF2\u6709\u4E2D\u56FD\u7248\u8D26\u53F7\u3002\u624B\u673A\u53F7\u548C\u9A8C\u8BC1\u7801\u63D0\u4EA4\u81F3 WorkBuddy \u5B98\u65B9\uFF0C\u51ED\u8BC1\u4EC5\u4FDD\u5B58\u5728\u672C\u673A\uFF0C\u65E0\u9700\u5B89\u88C5 Python\u3002</p><label>\u624B\u673A\u53F7<input type=\"tel\" inputMode=\"tel\" autoComplete=\"tel\" required pattern=\"1[3-9][0-9]{9}\" maxLength=\"11\" value={phone} disabled={busy || resend > 0} onChange={e => { setPhone(e.target.value); setSms(null); setSmsCode(''); }} /></label><div className=\"row\"><button type=\"button\" disabled={busy || resend > 0 || !/^1[3-9]\\d{9}$/.test(phone)} onClick={async () => { const next = await act({ action: 'workbuddy.sms', phone }); if (next) { setSms(next.workbuddyLogin); setClock(Date.now()); setSmsCode(''); } }}>{resend ? `${resend} \u79D2\u540E\u53EF\u91CD\u53D1` : sms ? '\u91CD\u65B0\u53D1\u9001\u9A8C\u8BC1\u7801' : '\u53D1\u9001\u9A8C\u8BC1\u7801'}</button><span className=\"notice\" role=\"status\">{sms ? clock >= sms.expiresAt ? '\u9A8C\u8BC1\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6' : '\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\uFF0C\u8BF7\u67E5\u770B\u77ED\u4FE1' : '\u70B9\u51FB\u53D1\u9001\u624D\u4F1A\u8BF7\u6C42\u77ED\u4FE1\uFF0C\u4E0D\u81EA\u52A8\u91CD\u8BD5'}</span></div><label>\u77ED\u4FE1\u9A8C\u8BC1\u7801<input type=\"text\" inputMode=\"numeric\" autoComplete=\"one-time-code\" required pattern=\"[0-9]{4,8}\" maxLength=\"8\" value={smsCode} disabled={busy || !sms} onChange={e => setSmsCode(e.target.value)} /></label><label className=\"check\"><input type=\"checkbox\" checked={verify} disabled={busy} onChange={e => setVerify(e.target.checked)} />\u767B\u5F55\u540E\u9A8C\u8BC1\u5237\u65B0\u4EE4\u724C\uFF08\u63A8\u8350\uFF09</label><p className=\"notice\">\u540C\u4E00\u8D26\u53F7\u66F4\u65B0\u51ED\u8BC1\uFF0C\u65B0\u8D26\u53F7\u72EC\u7ACB\u4FDD\u5B58\uFF1B\u4E0D\u4F1A\u5F00\u542F\u81EA\u52A8\u7B7E\u5230\u3002\u9047\u5E73\u53F0\u9A8C\u8BC1\u6216\u9650\u5236\uFF0C\u8BF7\u6539\u7528\u672C\u673A\u5BA2\u6237\u7AEF\u8BFB\u53D6\u3002</p></section> : <section className=\"steps stack\"><h3>\u83B7\u53D6\u51ED\u8BC1\u5F15\u5BFC</h3>{isQoder ? <p>\u5728\u5BF9\u5E94\u56FD\u5185 / \u56FD\u9645\u7AD9\u7684\u8D26\u53F7\u8BBE\u7F6E\u4E2D\u521B\u5EFA PAT\uFF0C\u7136\u540E\u9009\u62E9\u300C\u624B\u52A8\u586B\u5199 PAT\u300D\u7C98\u8D34\u3002\u5DF2\u6709\u65E7\u8FDE\u63A5\u5668\u767B\u5F55\u65F6\uFF0C\u53EF\u4E00\u952E\u8BFB\u53D6\u672C\u673A\u4FDD\u5B58\u7684 PAT\u3002\u7F51\u9875\u767B\u5F55 Cookie \u4E0D\u4F5C\u4E3A PAT \u4F7F\u7528\u3002</p> : <p>1. \u5728\u6240\u9009\u533A\u57DF\u7684\u5B98\u65B9\u5BA2\u6237\u7AEF\u767B\u5F55\u8D26\u53F7\u3002<br />2. \u56DE\u5230\u672C\u9762\u677F\uFF0C\u9009\u62E9\u300C\u4E00\u952E\u8BFB\u53D6\u672C\u673A\u767B\u5F55\u300D\u5E76\u70B9\u51FB\u5E95\u90E8\u6309\u94AE\u3002<br />3. \u6DFB\u52A0\u53E6\u4E00\u4E2A\u8D26\u53F7\u65F6\uFF0C\u5148\u5728\u5BA2\u6237\u7AEF\u5207\u6362\u767B\u5F55\uFF0C\u518D\u91CD\u590D\u8BFB\u53D6\uFF1B\u5DF2\u6DFB\u52A0\u7684\u8D26\u53F7\u4F1A\u4FDD\u7559\u72EC\u7ACB\u526F\u672C\u3002</p>}\n <div className=\"row\">{isQoder ? <><a className=\"link\" href=\"https://docs.qoder.com/cli/authentication\" target=\"_blank\" rel=\"noreferrer\">\u5B98\u65B9 PAT \u83B7\u53D6\u8BF4\u660E</a>{global && <a className=\"link\" href=\"https://qoder.com/account/integrations\" target=\"_blank\" rel=\"noreferrer\">\u6253\u5F00 PAT \u7BA1\u7406\u9875</a>}</> : <a className=\"link\" href={isTrae ? (global ? 'https://www.trae.ai/' : 'https://www.trae.cn/') : (global ? 'https://www.codebuddy.ai/' : 'https://www.codebuddy.cn/')} target=\"_blank\" rel=\"noreferrer\">\u6253\u5F00\u5B98\u65B9\u5BA2\u6237\u7AEF\u7F51\u7AD9</a>}</div>\n <p className=\"notice\">\u8DE8\u8BBE\u5907\u5DF2\u6709\u51ED\u8BC1\u6587\u4EF6\u65F6\u53EF\u9009\u62E9 JSON\uFF1BWorkBuddy \u9700\u8981 accessToken\u3001uid\u3001domain\u3001expiresAtMs\uFF1BTrae \u8FD8\u9700\u8981 userId\u3001edition\uFF0C\u4EE5\u53CA\u540C\u8D26\u53F7\u7684 machineId / deviceId\u3002\u63A8\u8350\u8BFB\u53D6\u5BA2\u6237\u7AEF\u6216\u4F7F\u7528\u52A0\u5BC6\u914D\u7F6E\u8FC1\u79FB\uFF0C\u4E0D\u9700\u8981\u731C\u6D4B\u5B57\u6BB5\u3002</p></section>}\n <div key={`${selected}:${mode}`} className=\"stack\">{mode === 'manual' && (isQoder ? field('Qoder PAT', 'pat', 'password') : <div className=\"grid\">{field('Access Token', 'accessToken', 'password')}{field('Refresh Token\uFF08\u53EF\u9009\uFF09', 'refreshToken', 'password', false)}{field(isTrae ? 'User ID' : 'UID', 'identityId')}{field('Access Token \u6709\u6548\u81F3', 'expiresAt', 'datetime-local')}{field('Refresh Token \u6709\u6548\u81F3\uFF08\u53EF\u9009\uFF09', 'refreshExpiresAt', 'datetime-local', false)}{!isTrae && field('\u767B\u5F55 Domain', 'domain', 'text', false, global ? 'www.codebuddy.ai' : 'www.codebuddy.cn')}{isTrae && <>{field('Machine ID', 'machineId')}{field('Device ID', 'deviceId')}</>}</div>)}\n {mode === 'json' && <><p className=\"notice\">\u672C\u63D2\u4EF6\u590D\u5236 / \u5BFC\u51FA\u7684\u5355\u8D26\u53F7 JSON \u4F1A\u81EA\u52A8\u8BC6\u522B\u4F9B\u5E94\u5546\u3001\u533A\u57DF\u53CA\u8D26\u53F7\u540D\u79F0\uFF1BTrae \u8BBE\u5907\u8EAB\u4EFD\u968F\u6587\u4EF6\u5BFC\u5165\u3002</p><label>\u9009\u62E9\u51ED\u8BC1 JSON \u6587\u4EF6<input type=\"file\" accept=\".json,application/json\" disabled={busy} onChange={async e => { const file = e.target.files?.[0]; if (!file) return; if (file.size > 256 * 1024) { setLocalError('\u51ED\u8BC1\u6587\u4EF6\u4E0D\u80FD\u8D85\u8FC7 256 KB'); return; } try { receiveJson(await file.text()); } catch { setLocalError('\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6'); } }} /></label><label>\u51ED\u8BC1 JSON<textarea rows=\"7\" required autoComplete=\"off\" spellCheck=\"false\" disabled={busy} value={json} onChange={e => receiveJson(e.target.value)} placeholder={isQoder ? '{\"pat\":\"\u2026\",\"region\":\"china\"}' : '{\"version\":1,\"credential\":{\"accessToken\":\"\u2026\", \"expiresAtMs\":\u2026}}'} /></label>{isTrae && <label>Trae \u8BBE\u5907\u8EAB\u4EFD JSON\uFF08\u51ED\u8BC1\u4E2D\u5DF2\u6709 identity \u65F6\u53EF\u7559\u7A7A\uFF09<textarea name=\"identityJSON\" rows=\"3\" disabled={busy} autoComplete=\"off\" placeholder='{\"edition\":\"cn\",\"machineId\":\"\u2026\",\"deviceId\":\"\u2026\"}' /></label>}</>}\n {mode === 'client' && <details><summary>\u9AD8\u7EA7\uFF1A\u6307\u5B9A\u767B\u5F55\u6587\u4EF6\u4F4D\u7F6E</summary><div className=\"stack\" style={{ marginTop: 12 }}>{field('\u767B\u5F55 / PAT \u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u81EA\u52A8\u67E5\u627E\uFF09', 'source', 'text', false)}{isTrae && field('Trae \u8BBE\u5907\u8EAB\u4EFD\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09', 'identity', 'text', false)}</div></details>}</div>\n {mode !== 'sms' && <p className=\"notice\">\u51ED\u8BC1\u4EC5\u4FDD\u5B58\u5230\u672C\u673A\u63D2\u4EF6\u8D26\u53F7\u6C60\u3002\u4E0D\u4F1A\u5728\u8D26\u53F7\u5217\u8868\u663E\u793A Token\uFF1B\u6BCF\u4E2A\u8D26\u53F7\u72EC\u7ACB\u5237\u65B0\u3002{replacing ? '\u4FDD\u5B58\u540E\u542F\u7528\u6B64\u8D26\u53F7\uFF0C\u539F\u51ED\u8BC1\u526F\u672C\u4FDD\u7559\u3002' : '\u91CD\u590D\u8BFB\u53D6\u540C\u4E00\u8D26\u53F7\u4F1A\u63D0\u793A\u3002'}</p>}\n </div><div className=\"modal-foot bar\"><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button className=\"primary\" type=\"submit\" disabled={busy || mode === 'sms' && (!sms || clock >= sms.expiresAt)}>{busy ? '\u6B63\u5728\u5904\u7406\u2026' : mode === 'sms' ? '\u767B\u5F55\u5E76\u4FDD\u5B58\u5230\u8D26\u53F7\u6C60' : mode === 'client' ? '\u4E00\u952E\u83B7\u53D6\u5E76\u4FDD\u5B58\u767B\u5F55' : '\u4FDD\u5B58\u51ED\u8BC1\u5E76\u83B7\u53D6\u6A21\u578B'}</button></div></form>;\n}\nfunction MigrationForm({ data, act, busy }) {\n const [panel, setPanel] = useState(null);\n const [include, setInclude] = useState(false), [exportPassword, setExportPassword] = useState(''), [confirmPassword, setConfirmPassword] = useState(''), [exportError, setExportError] = useState('');\n const [document, setDocument] = useState(''), [fileName, setFileName] = useState(''), [password, setPassword] = useState(''), [mode, setMode] = useState('merge'), [preview, setPreview] = useState(null), [error, setError] = useState('');\n const resetPreview = () => { setPreview(null); setError(''); };\n return <div className=\"stack\"><div><h3>\u914D\u7F6E\u8FC1\u79FB</h3><p className=\"notice\">\u5728\u8BBE\u5907\u95F4\u8FC1\u79FB\u8D26\u53F7\u3001\u6A21\u578B\u548C\u8DEF\u7531\u8BBE\u7F6E\u3002</p></div><section className=\"box table-shell\"><table className=\"table\"><thead><tr><th scope=\"col\">\u64CD\u4F5C</th><th scope=\"col\">\u5185\u5BB9</th><th scope=\"col\" className=\"cell-actions\">\u5F00\u59CB</th></tr></thead><tbody><tr><td><strong>\u5BFC\u51FA\u5230\u5176\u4ED6\u8BBE\u5907</strong></td><td>\u8D26\u53F7\u4E0E\u8DEF\u7531\u8BBE\u7F6E<small className=\"muted\">\u53EF\u9009\u5BC6\u7801\u52A0\u5BC6\u643A\u5E26\u767B\u5F55\u51ED\u8BC1</small></td><td className=\"cell-actions\"><button disabled={busy} onClick={() => setPanel('export')}>\u5BFC\u51FA\u914D\u7F6E</button></td></tr><tr><td><strong>\u5BFC\u5165\u5DF2\u6709\u914D\u7F6E</strong></td><td>\u5148\u9884\u89C8\uFF0C\u518D\u786E\u8BA4\u5408\u5E76\u6216\u66FF\u6362<small className=\"muted\">\u5BFC\u5165\u524D\u81EA\u52A8\u5907\u4EFD\u672C\u673A\u914D\u7F6E</small></td><td className=\"cell-actions\"><button disabled={busy} onClick={() => setPanel('import')}>\u5BFC\u5165\u914D\u7F6E</button></td></tr></tbody></table></section>\n {panel && <Modal title={panel === 'export' ? '\u5BFC\u51FA\u914D\u7F6E' : '\u5BFC\u5165\u914D\u7F6E'} busy={busy} close={() => setPanel(null)}><div className=\"modal-body stack\">\n {panel === 'export' && <form className=\"box stack\" onSubmit={async e => { e.preventDefault(); setExportError(''); if (include && exportPassword !== confirmPassword) { setExportError('\u4E24\u6B21\u8FC1\u79FB\u5BC6\u7801\u4E0D\u4E00\u81F4'); return; }\n const result = await act({ action: 'config.export', includeCredentials: include, password: include ? exportPassword : undefined }); if (!result) return;\n downloadJson(result.exported); setExportPassword(''); setConfirmPassword('');\n }}><h3>\u5BFC\u51FA\u5230\u5176\u4ED6\u8BBE\u5907</h3><p className=\"notice\">\u5305\u542B\u8D26\u53F7\u540D\u79F0\u548C\u987A\u5E8F\u3001\u6A21\u578B\u5C55\u793A\u8BBE\u7F6E\u3001\u8DEF\u7531\u4E0E\u5207\u6362\u89C4\u5219\u3002\u4E0D\u4F1A\u5BFC\u51FA\u4F1A\u8BDD\u3001\u7EDF\u8BA1\u3001\u6587\u4EF6\u8DEF\u5F84\u6216\u7BA1\u7406\u5BC6\u94A5\u3002</p><label className=\"check\"><input type=\"checkbox\" checked={include} disabled={busy} onChange={e => { setInclude(e.target.checked); setExportPassword(''); setConfirmPassword(''); }} />\u540C\u65F6\u8FC1\u79FB\u8D26\u53F7\u767B\u5F55\u51ED\u8BC1\uFF08\u5BC6\u7801\u52A0\u5BC6\uFF09</label>\n {include ? <><p className=\"steps\">\u52A0\u5BC6\u6587\u4EF6\u5305\u542B\u767B\u5F55 Token / PAT \u548C\u5FC5\u8981\u8BBE\u5907\u8EAB\u4EFD\uFF0C\u8BF7\u81EA\u884C\u4FDD\u7BA1\u3002\u65B0\u8BBE\u5907\u9700\u8981\u540C\u4E00\u5BC6\u7801\uFF1B\u51ED\u8BC1\u53EF\u80FD\u56E0\u5E73\u53F0\u8BBE\u5907\u9650\u5236\u800C\u9700\u8981\u91CD\u65B0\u767B\u5F55\u3002</p><label>\u8BBE\u7F6E\u8FC1\u79FB\u5BC6\u7801<input type=\"password\" autoComplete=\"new-password\" required minLength=\"10\" maxLength=\"1024\" value={exportPassword} disabled={busy} onChange={e => setExportPassword(e.target.value)} /></label><label>\u518D\u6B21\u8F93\u5165\u5BC6\u7801<input type=\"password\" autoComplete=\"new-password\" required value={confirmPassword} disabled={busy} onChange={e => setConfirmPassword(e.target.value)} /></label></> : <p className=\"steps\">\u4EC5\u914D\u7F6E\u6587\u4EF6\u4E0D\u542B\u767B\u5F55\u51ED\u8BC1\u3002\u65B0\u8BBE\u5907\u4E0A\u7684\u8D26\u53F7\u4F1A\u5148\u505C\u7528\uFF0C\u8865\u5145\u51ED\u8BC1\u540E\u5373\u53EF\u542F\u7528\uFF1B\u5408\u5E76\u5BFC\u5165\u4F1A\u4FDD\u7559\u672C\u673A\u5DF2\u6709\u8D26\u53F7\u51ED\u8BC1\u3002</p>}\n <Feedback error={exportError} /><button className=\"primary\" type=\"submit\" disabled={busy}>{include ? '\u5BFC\u51FA\u52A0\u5BC6\u8FC1\u79FB\u6587\u4EF6' : '\u5BFC\u51FA\u914D\u7F6E JSON'}</button></form>}\n {panel === 'import' && <form className=\"box stack\" onSubmit={async e => { e.preventDefault(); setError(''); const result = await act({ action: 'config.preview', document, password, mode }); if (result) setPreview({ ...result.importPreview, revision: result.revision }); }}><h3>\u5BFC\u5165\u63D2\u4EF6\u914D\u7F6E</h3><label>\u9009\u62E9\u8FC1\u79FB JSON \u6587\u4EF6<input type=\"file\" accept=\".json,application/json\" required disabled={busy} onChange={async e => { resetPreview(); setPassword(''); setDocument(''); const file = e.target.files?.[0]; if (!file) return; if (file.size > 900 * 1024) { setError('\u8FC1\u79FB\u6587\u4EF6\u4E0D\u80FD\u8D85\u8FC7 900 KB'); return; } try { setDocument(await file.text()); setFileName(file.name); } catch { setError('\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6'); } }} /></label>{fileName && <p className=\"mono muted\">{fileName}</p>}\n <label>\u8FC1\u79FB\u5BC6\u7801\uFF08\u4EC5\u52A0\u5BC6\u6587\u4EF6\u9700\u8981\uFF09<input type=\"password\" autoComplete=\"off\" maxLength=\"1024\" disabled={busy} value={password} onChange={e => { setPassword(e.target.value); resetPreview(); }} /></label><label>\u5BFC\u5165\u65B9\u5F0F<select disabled={busy} value={mode} onChange={e => { setMode(e.target.value); resetPreview(); }}><option value=\"merge\">\u5408\u5E76\uFF1A\u4FDD\u7559\u672C\u673A\u989D\u5916\u8D26\u53F7\u548C\u8DEF\u7531</option><option value=\"replace\">\u66FF\u6362\uFF1A\u4F7F\u7528\u5BFC\u5165\u6587\u4EF6\u7684\u5B8C\u6574\u914D\u7F6E</option></select></label>\n <p className=\"notice\">\u5408\u5E76\u65F6\u540C ID \u7684\u914D\u7F6E\u4F1A\u66F4\u65B0\uFF1B\u5E26\u51ED\u8BC1\u7684\u8D26\u53F7\u4F1A\u66F4\u65B0\u767B\u5F55\u526F\u672C\u3002\u66FF\u6362\u4F1A\u79FB\u51FA\u73B0\u6709\u914D\u7F6E\u4E2D\u7684\u989D\u5916\u8D26\u53F7 / \u8DEF\u7531\uFF0C\u4F46\u4FDD\u7559\u539F\u51ED\u8BC1\u6587\u4EF6\u3002\u4E24\u79CD\u65B9\u5F0F\u90FD\u4F1A\u5148\u5907\u4EFD\u672C\u673A\u914D\u7F6E\u3002</p><Feedback error={error} /><button type=\"submit\" disabled={busy || !document}>\u68C0\u67E5\u6587\u4EF6\u5E76\u9884\u89C8\u53D8\u66F4</button>\n {preview && <section className=\"steps stack\"><h3>\u5BFC\u5165\u9884\u89C8</h3><p>{preview.accounts} \u4E2A\u8D26\u53F7\uFF08\u65B0\u589E {preview.newAccounts}\uFF09 \u00B7 {preview.credentials} \u4EFD\u51ED\u8BC1<br />{preview.routes} \u6761\u8DEF\u7531 \u00B7 \u66F4\u65B0\u540C\u540D\u8DEF\u7531 {preview.overwrittenRoutes} \u6761<br />{preview.needsLogin} \u4E2A\u65B0\u8D26\u53F7\u9700\u8865\u5145\u767B\u5F55\uFF0C\u5C06\u5148\u505C\u7528</p><button className=\"primary\" type=\"button\" disabled={busy} onClick={async () => { if (await act({ action: 'config.import', revision: preview.revision, document, password, mode })) { setDocument(''); setPassword(''); setPreview(null); } }}>\u786E\u8BA4{mode === 'merge' ? '\u5408\u5E76' : '\u66FF\u6362'}\u5E76\u5BFC\u5165</button></section>}\n </form>}\n </div></Modal>}\n </div>;\n}\nfunction ExpiryStatus({ route, act, busy, revision, onForce }) {\n const status = route.expiringStatus || {}, cooling = status.cooldownUntil > Date.now();\n return <div className=\"steps stack\"><p>{cooling ? `\u4E34\u671F\u4F18\u5148\u51B7\u5374\u4E2D \u00B7 \u5269\u4F59\u7EA6 ${Math.ceil((status.cooldownUntil - Date.now()) / 3600000)} \u5C0F\u65F6\uFF0C${when(status.cooldownUntil)} \u540E\u6062\u590D` : `\u4E34\u671F\u4F18\u5148\u5DF2\u5C31\u7EEA \u00B7 \u7B2C ${status.number || 1} \u8F6E${status.accounts?.length ? ` \u00B7 \u5DF2\u5B8C\u6210 ${status.completed?.length || 0} / ${status.accounts.length} \u4E2A\u8D26\u53F7` : ''}`}</p><p className=\"notice\">\u6240\u6709\u4E34\u671F\u8D26\u53F7\u7684\u79EF\u5206\u8017\u5C3D\u6216\u8FBE\u5230\u6BCF\u8F6E\u989D\u5EA6\u540E\uFF0C\u4E34\u671F\u4F18\u5148\u6682\u505C 3 \u5929\uFF1B\u671F\u95F4\u6309\u666E\u901A\u8DEF\u7531\u89C4\u5219\u8FD0\u884C\uFF0C\u91CD\u542F\u540E\u51B7\u5374\u4ECD\u4FDD\u7559\u3002</p>{cooling && <button type=\"button\" disabled={busy} onClick={async () => { const result = await act({ action: 'route.force-expiring', id: route.id, revision }); if (result) onForce?.(result); }}>\u5F3A\u5236\u5F00\u542F\u5E76\u5F00\u59CB\u65B0\u4E00\u8F6E</button>}{cooling && <p className=\"notice\">\u5F3A\u5236\u5F00\u542F\u4F1A\u6E05\u9664\u4E34\u671F\u51B7\u5374\uFF0C\u5E76\u91CD\u7F6E\u672C\u8DEF\u7531\u7684\u672C\u8F6E\u989D\u5EA6\u8BA1\u6570\uFF1B\u7D2F\u8BA1\u7528\u91CF\u4FDD\u7559\u3002</p>}</div>;\n}\nfunction FreeStatus({ route, busy, act, onUpdate }) {\n const status = route.freeStatus, accounts = status?.accounts || [], count = accounts.reduce((n, a) => n + a.models.length, 0);\n const models = status?.modelRoutes || [];\n const update = async (model, patch) => { const next = await act({ action: 'free.model.update', parentId: route.id, id: model.id, ...patch }); if (next) onUpdate?.(next); };\n return <section className=\"steps stack\"><div className=\"bar\"><h3>\u514D\u8D39\u6A21\u578B \u00B7 {models.length} \u79CD \u00B7 {count} \u4E2A\u8D26\u53F7 / \u6A21\u578B\u7EC4\u5408</h3><button type=\"button\" disabled={busy || status?.checking} onClick={() => { void act({ action: 'free.refresh' }); }}>{status?.checking ? '\u6B63\u5728\u68C0\u67E5\u2026' : '\u7ACB\u5373\u68C0\u67E5\u514D\u8D39\u6A21\u578B'}</button></div><p className=\"notice\">\u6309\u6A21\u578B\u81EA\u52A8\u521B\u5EFA\u8DEF\u7531\uFF0C\u52FE\u9009\u540E\u5206\u522B\u51FA\u73B0\u5728 DSH \u6A21\u578B\u5217\u8868\u4E2D\u3002\u540C\u4E00\u6A21\u578B\u53EA\u5728\u6709\u514D\u8D39\u8D44\u683C\u4E14\u652F\u6301\u6240\u9009\u63A8\u7406\u7B49\u7EA7\u7684\u8D26\u53F7\u95F4\u5207\u6362\uFF0C\u4E0D\u6DF7\u7528\u5176\u4ED6\u6A21\u578B\u3002\u6BCF\u5929\u68C0\u67E5\uFF0C\u8C03\u7528\u524D\u590D\u6838\uFF1B\u6062\u590D\u6536\u8D39\u6216\u68C0\u67E5\u5931\u8D25\u65F6\u81EA\u52A8\u79FB\u51FA\uFF0C\u514D\u8D39\u6062\u590D\u540E\u4FDD\u7559\u4F60\u7684\u52FE\u9009\u548C\u6863\u4F4D\u8BBE\u7F6E\u3002</p>\n <div className=\"box table-shell\"><div className=\"scroll\" role=\"region\" aria-label=\"\u514D\u8D39\u6A21\u578B\u5C55\u793A\u4E0E\u63A8\u7406\u7B49\u7EA7\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u6A21\u578B / \u5C55\u793A</th><th scope=\"col\">\u53EF\u7528\u8D26\u53F7</th><th scope=\"col\">\u63A8\u7406\u7B49\u7EA7</th></tr></thead><tbody>{models.map(m => <tr key={m.id} className={m.selected ? 'selected' : ''}><td><label className=\"check\"><input type=\"checkbox\" aria-label={`\u5C55\u793A ${m.modelName}`} disabled={busy} checked={m.selected} onChange={e => { void update(m, { visible: e.target.checked }); }} /><strong>{m.modelName}</strong></label><small className=\"muted\">{m.name.split(' \u00B7 ').at(-1)} \u00B7 {fmt(m.contextWindow / 1000)}K \u4E0A\u4E0B\u6587</small></td><td>{m.accountNames.join('\u3001') || '\u6682\u65E0\u8D26\u53F7'}</td><td><label><span className=\"sr-only\">{m.modelName} \u63A8\u7406\u7B49\u7EA7</span><select aria-label={`${m.modelName} \u63A8\u7406\u7B49\u7EA7`} disabled={busy} value={m.reasoningEffort || ''} onChange={e => { void update(m, { reasoningEffort: e.target.value || null }); }}><option value=\"\">\u5E73\u53F0\u9ED8\u8BA4</option>{m.reasoning?.supportedEfforts?.map(e => <option key={e} value={e}>{effortNames[e] || e}</option>)}</select></label>{m.effortUnavailable && <small className=\"warn\">\u539F\u6863\u4F4D\u6682\u4E0D\u53EF\u7528\uFF0C\u4F7F\u7528\u5E73\u53F0\u9ED8\u8BA4</small>}</td></tr>)}</tbody></table></div></div>\n {!models.length && <p className=\"notice\">\u6682\u65E0\u786E\u8BA4\u514D\u8D39\u7684\u6A21\u578B\u3002\u6DFB\u52A0\u5E76\u542F\u7528\u8D26\u53F7\uFF0C\u6216\u7ACB\u5373\u68C0\u67E5\u76EE\u5F55\u3002</p>}\n <details><summary>\u5404\u8D26\u53F7\u68C0\u67E5\u72B6\u6001</summary><div className=\"stack\" style={{ marginTop: 12 }}>{accounts.map(a => <div key={a.id}><p>{a.name} \u00B7 {a.models.length ? a.models.map(m => m.name).join('\u3001') : a.error ? '\u68C0\u67E5\u5931\u8D25\uFF0C\u6682\u4E0D\u53C2\u4E0E' : '\u6682\u65E0\u786E\u8BA4\u514D\u8D39\u7684\u6A21\u578B'}</p><p className=\"notice\">{a.provider} \u00B7 \u4E0A\u6B21\u76EE\u5F55\u68C0\u67E5 {when(a.checkedAt)}</p></div>)}</div></details>\n </section>;\n}\nfunction FreeRouteForm({ draft, setDraft, data, act, busy, error, notice }) {\n return <form onSubmit={async e => { e.preventDefault(); const { id, previousId, revision, reasoning, supportsImages, expiringStatus, freeStatus, ...route } = draft;\n route.targets = route.targets.map(t => ({ provider: t.provider, ...(t.account ? { account: t.account } : {}), ...(t.model ? { model: t.model } : {}), ...(t.models ? { models: t.models } : {}) }));\n if (await act({ action: 'route.save', id, previousId, revision, route })) setDraft(null);\n }}><div className=\"modal-body stack\"><Feedback error={error} notice={notice} /><label>\u7BA1\u7406\u7EC4\u540D\u79F0<input required maxLength={200} disabled={busy} value={draft.name} onChange={e => setDraft(d => ({ ...d, name: e.target.value }))} /></label><p className=\"notice\">Free \u7684\u6A21\u578B\u8DEF\u7531\u7531\u76EE\u5F55\u81EA\u52A8\u7EF4\u62A4\uFF0C\u65E0\u9700\u586B\u5199\u6A21\u578B ID\u3002\u8D26\u53F7\u542F\u505C\u5728\u300C\u8D26\u53F7\u4E0E\u767B\u5F55\u300D\u8C03\u6574\u3002</p><FreeStatus route={data.routes.find(r => r.id === draft.id) || draft} act={act} busy={busy} onUpdate={next => setDraft(d => ({ ...d, revision: next.revision, freeModels: next.routes.find(r => r.id === d.id)?.freeModels }))} /><label className=\"check\"><input type=\"checkbox\" checked={draft.visible !== false} disabled={busy} onChange={e => setDraft(d => ({ ...d, visible: e.target.checked }))} />\u5C55\u793A\u52FE\u9009\u7684\u514D\u8D39\u6A21\u578B</label></div><div className=\"modal-foot bar\"><button type=\"button\" disabled={busy} onClick={async () => { if (await act({ action: 'route.remove', id: draft.id, revision: draft.revision })) setDraft(null); }}>\u79FB\u9664\u514D\u8D39\u7BA1\u7406\u7EC4</button><button className=\"primary\" disabled={busy} type=\"submit\">\u4FDD\u5B58\u8BBE\u7F6E</button></div></form>;\n}\nfunction RouteForm({ draft, setDraft, data, act, busy, error, notice }) {\n if (draft.freeOnly) return <FreeRouteForm draft={draft} setDraft={setDraft} data={data} act={act} busy={busy} error={error} notice={notice} />;\n const set = (key, value) => setDraft(d => ({ ...d, [key]: value }));\n const target = (i, patch) => setDraft(d => ({ ...d, targets: d.targets.map((t, index) => i === index ? { ...t, ...patch } : t) }));\n const move = (i, delta) => { const targets = [...draft.targets]; [targets[i], targets[i + delta]] = [targets[i + delta], targets[i]]; set('targets', targets); };\n const strategyHelp = { failover: '\u4F18\u5148\u4F7F\u7528\u524D\u9762\u7684\u8D26\u53F7\uFF1B\u9047\u5230 4xx \u540E\u6362\u4E0B\u4E00\u4E2A\uFF0C\u6210\u529F\u8D26\u53F7\u7EE7\u7EED\u627F\u63A5\u8BF7\u6C42\u3002', weighted: '\u6309\u6BCF\u4E2A\u8D26\u53F7\u7684\u6743\u91CD\u5206\u914D\u8BF7\u6C42\u3002\u4F8B\u5982 3:1\uFF0C\u957F\u671F\u7EA6 75%:25%\uFF1B\u77ED\u671F\u6BD4\u4F8B\u4E0E\u8BF7\u6C42\u957F\u5EA6\u53EF\u80FD\u4E0D\u540C\u3002', tokens: '\u6BCF\u4E2A\u8D26\u53F7\u7D2F\u8BA1\u8FBE\u5230\u672C\u8F6E Token \u989D\u5EA6\u540E\uFF0C\u4E0B\u4E00\u6B21\u8BF7\u6C42\u6362\u8D26\u53F7\u3002\u6240\u6709\u76EE\u6807\u7528\u5B8C\u989D\u5EA6\u540E\u5F00\u59CB\u65B0\u4E00\u8F6E\u3002', credits: '\u6309\u5E73\u53F0\u4F59\u989D\u4E0B\u964D\u8BA1\u7B97\u672C\u8F6E\u6D88\u8017\uFF0C\u8FBE\u5230\u9608\u503C\u540E\u6362\u8D26\u53F7\u3002\u4F59\u989D\u53EF\u80FD\u5305\u542B\u5176\u4ED6\u5E94\u7528\u7684\u6D88\u8D39\uFF1B\u79EF\u5206\u67E5\u8BE2\u5931\u8D25\u65F6\u6682\u4E0D\u4F7F\u7528\u8BE5\u8D26\u53F7\u3002' };\n return <form onSubmit={async e => { e.preventDefault(); if (draft.id !== 'ds4.1f' && draft.targets.some(t => !t.modelText.trim())) { e.currentTarget.querySelector('details')?.setAttribute('open', ''); return; } const { id, previousId, revision, reasoning, supportsImages, expiringStatus, ...route } = draft;\n route.targets = route.targets.map(t => { const models = t.modelText.split(',').map(x => x.trim()).filter(Boolean); return { provider: t.provider, ...(t.account ? { account: t.account } : {}), ...(models.length ? { models } : {}), ...(route.strategy === 'weighted' ? { weight: Number(t.weight) } : {}), ...(route.strategy === 'tokens' ? { tokenBudget: Number(t.tokenBudget) } : {}), ...(route.strategy === 'credits' ? { creditBudget: Number(t.creditBudget) } : {}) }; });\n if (await act({ action: 'route.save', id, previousId, revision, route })) setDraft(null);\n }}><div className=\"modal-body stack\"><Feedback error={error} notice={notice} /><label>\u8DEF\u7531\u540D\u79F0<input required maxLength={200} value={draft.name} disabled={busy} onChange={e => set('name', e.target.value)} placeholder=\"\u4F8B\u5982 \u6211\u7684 Flash \u81EA\u52A8\u5207\u6362\" /></label><p className=\"notice\">\u540D\u79F0\u663E\u793A\u5728 DSH \u6A21\u578B\u5217\u8868\u4E2D\uFF0C\u53EF\u968F\u65F6\u4FEE\u6539\uFF0C\u4E0D\u5F71\u54CD\u5DF2\u6709\u4F1A\u8BDD\u7684\u8DEF\u7531\u9009\u62E9\u3002</p>\n <label>\u8D26\u53F7\u5207\u6362\u89C4\u5219<select disabled={busy} value={draft.strategy} onChange={e => set('strategy', e.target.value)}>{Object.entries(strategies).map(([id, label]) => <option key={id} value={id}>{label}</option>)}</select></label><p className=\"steps\">{strategyHelp[draft.strategy]}{['tokens', 'credits'].includes(draft.strategy) && ' \u6B63\u5728\u8F93\u51FA\u7684\u56DE\u7B54\u4F1A\u5B8C\u6210\uFF0C\u989D\u5EA6\u5141\u8BB8\u8D85\u8FC7\u6700\u540E\u4E00\u6B21\u8BF7\u6C42\u7684\u7528\u91CF\u3002'}</p>\n <div className=\"box stack\"><label className=\"check\"><input type=\"checkbox\" disabled={busy} checked={draft.preferExpiringCredits !== false} onChange={e => set('preferExpiringCredits', e.target.checked)} />\u4F18\u5148\u4F7F\u7528\u4E34\u671F\u79EF\u5206\uFF08\u9ED8\u8BA4\u5F00\u542F\uFF09</label><p className=\"notice\">\u4F18\u5148\u4F7F\u7528\u4ECD\u6709\u4F59\u989D\u4E14\u66F4\u65E9\u5230\u671F\u7684\u79EF\u5206\u5305\uFF1B\u4F18\u5148\u7EA7\u9AD8\u4E8E\u987A\u5E8F\u548C\u6743\u91CD\uFF0C\u4ECD\u9075\u5B88\u6BCF\u8F6E\u989D\u5EA6\u4E0E\u6545\u969C\u5207\u6362\u3002\u5E73\u53F0\u672A\u63D0\u4F9B\u6709\u6548\u671F\u6216\u7528\u91CF\u6570\u636E\u8FC7\u671F\u65F6\uFF0C\u6309\u666E\u901A\u89C4\u5219\u6267\u884C\u3002</p>{draft.preferExpiringCredits !== false && <label>\u4E34\u671F\u8303\u56F4\uFF08\u5929\uFF09<input type=\"number\" disabled={busy} min=\"1\" max=\"365\" required value={draft.expiringWithinDays ?? 7} onChange={e => set('expiringWithinDays', Number(e.target.value))} /></label>}</div>\n {draft.preferExpiringCredits !== false && <ExpiryStatus route={data.routes.find(r => r.id === draft.previousId) || draft} busy={busy} act={act} revision={draft.revision} onForce={result => setDraft(d => ({ ...d, revision: result.revision, expiringStatus: result.routes.find(r => r.id === draft.previousId)?.expiringStatus }))} />}\n <div className=\"bar\"><h3>\u6A21\u578B\u4E0E\u8D26\u53F7\u76EE\u6807</h3><span className=\"notice\">\u6309\u4E0B\u65B9\u987A\u5E8F\u5207\u6362</span></div>\n {draft.targets.map((t, i) => { const models = data.providers.find(p => p.id === t.provider)?.models || []; return <section className=\"box stack\" key={t.key}><div className=\"bar target-head\"><strong>\u76EE\u6807 {i + 1}</strong><div className=\"row\"><button type=\"button\" disabled={busy || i === 0} onClick={() => move(i, -1)}>\u524D\u79FB</button><button type=\"button\" disabled={busy || i === draft.targets.length - 1} onClick={() => move(i, 1)}>\u540E\u79FB</button><button type=\"button\" disabled={busy || draft.targets.length === 1} onClick={() => set('targets', draft.targets.filter((_, index) => index !== i))}>\u79FB\u9664</button></div></div>\n <div className=\"grid\"><label>\u4F9B\u5E94\u5546<select disabled={busy} value={t.provider} onChange={e => target(i, { provider: e.target.value, account: '', modelText: '' })}>{data.providers.map(p => <option key={p.id} value={p.id}>{p.name}</option>)}</select></label><label>\u4F7F\u7528\u8D26\u53F7<select disabled={busy} value={t.account || ''} onChange={e => target(i, { account: e.target.value })}><option value=\"\">\u6B64\u4F9B\u5E94\u5546\u5168\u90E8\u542F\u7528\u8D26\u53F7</option>{data.accounts.filter(a => a.provider === t.provider).map(a => <option key={a.id} value={a.id}>{a.name}</option>)}</select></label>\n <label className=\"full\">\u76EE\u6807\u6A21\u578B<select disabled={busy} required={draft.id !== 'ds4.1f'} value={t.modelText} onChange={e => { if (e.target.value) target(i, { modelText: e.target.value }); }}><option value=\"\">\u4ECE\u5DF2\u53D1\u73B0\u6A21\u578B\u4E2D\u9009\u62E9</option>{t.modelText && !models.some(m => m.id === t.modelText) && <option value={t.modelText}>{t.modelText}</option>}{models.map(m => <option key={m.id} value={m.id}>{m.name} \u00B7 {m.id}</option>)}</select></label>\n {draft.strategy === 'weighted' && <label>\u6BCF\u4E2A\u8D26\u53F7\u7684\u6743\u91CD<input type=\"number\" disabled={busy} min=\"1\" max=\"1000\" required value={t.weight} onChange={e => target(i, { weight: e.target.value })} /></label>}\n {draft.strategy === 'tokens' && <label>\u6BCF\u4E2A\u8D26\u53F7\u6BCF\u8F6E Token \u989D\u5EA6<input type=\"number\" disabled={busy} min=\"1\" step=\"1\" required value={t.tokenBudget} onChange={e => target(i, { tokenBudget: e.target.value })} /></label>}\n {draft.strategy === 'credits' && <label>\u6BCF\u4E2A\u8D26\u53F7\u6BCF\u8F6E\u79EF\u5206\u6D88\u8017<input type=\"number\" disabled={busy} min=\"0.01\" step=\"any\" required value={t.creditBudget} onChange={e => target(i, { creditBudget: e.target.value })} /></label>}\n </div><details><summary>\u9AD8\u7EA7\uFF1A\u624B\u52A8\u586B\u5199\u5019\u9009\u6A21\u578B ID</summary><label style={{ marginTop: 10 }}>\u5019\u9009\u6A21\u578B ID\uFF08\u9017\u53F7\u5206\u9694\uFF09<input disabled={busy} value={t.modelText} onChange={e => target(i, { modelText: e.target.value })} placeholder=\"\u6309\u987A\u5E8F\u5339\u914D\u771F\u5B9E\u6A21\u578B\u76EE\u5F55\" /></label></details>\n </section>; })}\n <button type=\"button\" disabled={busy} onClick={() => set('targets', [...draft.targets, { provider: 'workbuddy', account: '', key: crypto.randomUUID(), weight: 1, tokenBudget: 100000, creditBudget: 100, modelText: '' }])}>\u6DFB\u52A0\u5207\u6362\u76EE\u6807</button>\n <details><summary>\u9AD8\u7EA7\uFF1A\u4E0A\u4E0B\u6587\u4E0E\u8F93\u51FA\u957F\u5EA6</summary><div className=\"grid\" style={{ marginTop: 12 }}><label>\u4E0A\u4E0B\u6587\u957F\u5EA6<input type=\"number\" disabled={busy} min=\"1\" required value={draft.contextWindow} onChange={e => set('contextWindow', Number(e.target.value))} /></label><label>\u6700\u5927\u8F93\u51FA\u957F\u5EA6<input type=\"number\" disabled={busy} min=\"1\" max={draft.contextWindow} required value={draft.maxTokens} onChange={e => set('maxTokens', Number(e.target.value))} /></label></div></details>\n </div><div className=\"modal-foot bar\">{draft.previousId ? <button type=\"button\" disabled={busy} onClick={async () => { if (await act({ action: 'route.remove', revision: draft.revision, id: draft.previousId })) setDraft(null); }}>\u79FB\u9664\u8DEF\u7531</button> : <button disabled={busy} type=\"button\" onClick={() => setDraft(null)}>\u53D6\u6D88</button>}<button className=\"primary\" type=\"submit\" disabled={busy}>{busy ? '\u6B63\u5728\u4FDD\u5B58\u2026' : '\u4FDD\u5B58\u8DEF\u7531'}</button></div>\n </form>;\n}\n\nexport function InitialSetup({ data, busy, act, go }) {\n const discovery = data.localDiscovery ?? [];\n const discovering = data.startup?.phase === 'discovering';\n const saved = discovery.reduce((n, s) => n + (s.savedCount ?? 0), 0);\n return <section className=\"box stack\" aria-label=\"\u9996\u6B21\u8D26\u53F7\u8BBE\u7F6E\"><div className=\"bar\"><div><h3>\u672C\u673A\u8D26\u53F7\u81EA\u52A8\u83B7\u53D6{discovering ? '\u8FDB\u884C\u4E2D' : discovery.length ? '\u5DF2\u5B8C\u6210' : '\u5F85\u91CD\u8BD5'}</h3><p className=\"notice\">{discovering ? '\u6B63\u5728\u540E\u53F0\u8BFB\u53D6 WorkBuddy / Trae \u672C\u673A\u767B\u5F55\uFF0C\u65E0\u9700\u624B\u52A8\u91CD\u590D\u83B7\u53D6\uFF0C\u5DF2\u6709\u8D26\u53F7\u53EF\u4EE5\u7EE7\u7EED\u4F7F\u7528\u3002' : saved ? `\u5DF2\u4FDD\u5B58 ${saved} \u4E2A WorkBuddy / Trae \u672C\u673A\u767B\u5F55\uFF0C\u65E0\u9700\u518D\u6B21\u624B\u52A8\u6DFB\u52A0\u3002` : '\u6682\u672A\u4FDD\u5B58\u672C\u673A\u767B\u5F55\u3002\u5148\u5728\u5B98\u65B9\u5BA2\u6237\u7AEF\u767B\u5F55\uFF0C\u518D\u70B9\u51FB\u300C\u4E00\u952E\u83B7\u53D6\u5E76\u4FDD\u5B58\u300D\u3002'}</p></div><button disabled={busy} onClick={() => { void act({ action: 'setup.dismiss' }); }}>\u77E5\u9053\u4E86</button></div>\n <div className=\"providers\">{discovery.map(s => <div className=\"steps\" key={s.provider}><strong>{data.providers.find(p => p.id === s.provider)?.name ?? s.provider}</strong><p className={(s.savedCount ?? 0) > 0 ? 'good' : 'notice'}>{s.savedCount ? `\u5DF2\u4FDD\u5B58 ${s.savedCount} \u4E2A\u767B\u5F55` : s.state === 'found' ? '\u68C0\u6D4B\u5230\u767B\u5F55\uFF1B\u5DF2\u5FFD\u7565\u6216\u5C1A\u672A\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u65B0\u83B7\u53D6' : s.state === 'unreadable' ? '\u767B\u5F55\u6587\u4EF6\u65E0\u6CD5\u8BFB\u53D6\uFF0C\u8BF7\u5728\u5BA2\u6237\u7AEF\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u8BD5' : '\u672A\u68C0\u6D4B\u5230\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55\u5B98\u65B9\u5BA2\u6237\u7AEF'}</p></div>)}</div>\n <div className=\"row\"><button className=\"primary\" disabled={busy || discovering} onClick={() => { void act({ action: 'accounts.discover' }); }}>\u4E00\u952E\u83B7\u53D6\u5E76\u4FDD\u5B58 WorkBuddy / Trae</button><button disabled={busy} onClick={() => go('accounts')}>\u67E5\u770B\u8D26\u53F7 / \u624B\u52A8\u6DFB\u52A0</button><button disabled={busy} onClick={() => go('routes')}>\u9009\u62E9\u8DEF\u7531\u6A21\u578B</button></div><p className=\"notice\">\u9996\u6B21\u542F\u52A8\u81EA\u52A8\u6267\u884C\u4E00\u6B21\uFF0C\u4E4B\u540E\u6BCF\u5206\u949F\u68C0\u6D4B\u65B0\u589E\u767B\u5F55\u3002Qoder \u4F7F\u7528 PAT\uFF0C\u8BF7\u5230\u300C\u8D26\u53F7\u4E0E\u767B\u5F55\u300D\u6DFB\u52A0\uFF1B\u672A\u5B89\u88C5\u5BA2\u6237\u7AEF\u4E5F\u53EF\u4EE5\u624B\u52A8\u586B\u5199\u51ED\u8BC1\u3002</p>\n </section>;\n}\nconst updateNames = { unchecked: '\u5F85\u68C0\u67E5', available: '\u53EF\u66F4\u65B0', current: '\u5DF2\u540C\u6B65', pinned: '\u56FA\u5B9A\u63D0\u4EA4', unsupported: '\u672C\u5730\u6765\u6E90', failed: '\u68C0\u67E5 / \u5B89\u88C5\u5931\u8D25', installed: '\u5DF2\u5B89\u88C5' };\nexport function PluginUpdatesPanel({ data, busy, act }) {\n const [query, setQuery] = useState(''), [selected, setSelected] = useState([]), [plan, setPlan] = useState(null), [registry, setRegistry] = useState(''), [filter, setFilter] = useState('all'), [pluginSearch, setPluginSearch] = useState('');\n const [diagnostic, setDiagnostic] = useState(null), [copied, setCopied] = useState(false);\n const running = data?.job?.state === 'running', blocked = busy || running;\n const rows = (data?.rows ?? []).filter(r => r.source.kind !== 'builtin'), available = rows.filter(r => r.status === 'available' || r.status === 'failed' && r.target);\n useEffect(() => { if (data?.available && !running) void act({ action: !data.checkedAt || Date.now() - data.checkedAt > 86400000 ? 'plugins.check' : 'plugins.list' }); }, []);\n const chosen = available.filter(r => selected.includes(r.name));\n const visibleRows = rows.filter(r => r.name.toLowerCase().includes(pluginSearch.toLowerCase()) && (filter === 'all' || (filter === 'updates' ? available.includes(r) : r.source.kind === filter)));\n async function submitPlan() {\n if (await act(plan.kind === 'install' ? { action: 'plugins.install', spec: plan.spec, registry: registry || undefined } : { action: 'plugins.update', names: plan.rows.map(r => r.name), registry: registry || undefined })) { setPlan(null); setSelected([]); }\n }\n if (!data?.available) return <section className=\"box stack\"><h3>\u5F53\u524D DSH \u672A\u63D0\u4F9B\u63D2\u4EF6\u7BA1\u7406\u63A5\u53E3</h3><p>\u8BF7\u5347\u7EA7 DeepSeek Harness \u540E\u91CD\u8BD5\u3002\u672C\u9875\u7BA1\u7406\u5F53\u524D DSH \u914D\u7F6E\u4E2D\u7531\u7528\u6237\u5B89\u88C5\u7684\u63D2\u4EF6\u3002</p></section>;\n return <div className=\"stack\"><section className=\"box stack\"><div className=\"bar\"><div><h3>\u7528\u6237\u5B89\u88C5\u7684\u63D2\u4EF6\u4E0E\u66F4\u65B0</h3><p className=\"notice\">{rows.length} \u4E2A\u7528\u6237\u5B89\u88C5\u63D2\u4EF6 \u00B7 {available.length} \u4E2A\u53EF\u66F4\u65B0</p></div><button className=\"primary\" disabled={blocked} onClick={() => { void act({ action: 'plugins.check' }); }}>\u68C0\u67E5\u5168\u90E8\u66F4\u65B0</button></div>\n <p className=\"notice\">\u4E0A\u6B21\u68C0\u67E5 {when(data.checkedAt)} \u00B7 \u6BCF\u5929\u81EA\u52A8\u68C0\u67E5\u5E76\u63D0\u9192</p>\n <details className=\"help\"><summary>\u5B89\u88C5\u6E90\u4E0E\u68C0\u67E5\u89C4\u5219</summary><div className=\"stack\"><label className=\"filter\">npm \u5B89\u88C5\u6E90<select value={registry} disabled={blocked} onChange={e => setRegistry(e.target.value)}><option value=\"\">DSH \u8BBE\u7F6E\uFF08\u542B\u56DE\u9000\u6765\u6E90\uFF09</option><option value=\"https://registry.npmjs.org/\">npm \u5B98\u65B9</option><option value=\"https://registry.npmmirror.com/\">npmmirror</option></select></label><p className=\"notice\">npm \u6309\u7248\u672C / \u53D1\u5E03\u9891\u9053\u68C0\u67E5\uFF0CGitHub \u6309\u5206\u652F\u63D0\u4EA4\u68C0\u67E5\uFF1B\u4FDD\u7559\u542F\u7528\u72B6\u6001\uFF0C\u56FA\u5B9A Git \u63D0\u4EA4\u4FDD\u6301\u4E0D\u52A8\u3002</p></div></details>\n </section>\n {data.job && !(data.job.kind === 'check' && data.job.state === 'done') && <section className=\"box stack\" aria-live=\"polite\"><div className=\"bar\"><h3>{running ? data.job.kind === 'check' ? '\u6B63\u5728\u68C0\u67E5\u66F4\u65B0\u2026' : '\u6B63\u5728\u5B89\u88C5\u63D2\u4EF6\u2026' : data.job.state === 'cancelled' ? '\u64CD\u4F5C\u5DF2\u53D6\u6D88' : data.job.state === 'failed' || data.job.results.some(r => r.status === 'failed') ? '\u6709\u63D2\u4EF6\u672A\u5B8C\u6210\u5B89\u88C5' : '\u64CD\u4F5C\u5DF2\u5B8C\u6210'}</h3>{running && <button disabled={busy} onClick={() => { void act({ action: 'plugins.cancel' }); }}>\u53D6\u6D88</button>}</div><progress max={Math.max(1, data.job.total)} value={data.job.results.length} aria-label=\"\u63D2\u4EF6\u64CD\u4F5C\u8FDB\u5EA6\" /><p className=\"notice\">{data.job.results.length} / {data.job.total}{data.job.current ? ` \u00B7 ${data.job.current}` : ''}</p>\n {data.job.message && <p className=\"error\">{data.job.message}</p>}{data.job.results.map((r, i) => <div key={r.name + i} className=\"item\"><strong>{r.name}</strong><p className={r.status === 'failed' ? 'error' : 'notice'}>{r.message || updateNames[r.status] || r.status}</p>{r.diagnostic && <button type=\"button\" onClick={() => { setCopied(false); setDiagnostic(JSON.stringify({ plugin: r.name, targetVersion: r.expectedVersion, ...r.diagnostic }, null, 2)); }}>\u67E5\u770B\u8131\u654F\u8BCA\u65AD</button>}{r.pendingBuilds?.length > 0 && <p className=\"notice\">\u5F85\u6388\u6743\u811A\u672C\uFF1A{r.pendingBuilds.join('\u3001')}\u3002\u8BF7\u5728 DSH \u539F\u63D2\u4EF6\u5B89\u88C5\u9875\u6388\u6743\u540E\u91CD\u8BD5\u3002</p>}</div>)}\n {data.job.results.some(r => r.restartRequired) && <p className=\"steps\">\u66F4\u65B0\u6587\u4EF6\u5DF2\u5B89\u88C5\u3002macOS \u4F7F\u7528 \u2318Q \u5B8C\u5168\u9000\u51FA DSH \u540E\u91CD\u5F00\uFF1BWindows \u9000\u51FA\u6258\u76D8\u5E94\u7528\u540E\u91CD\u5F00\uFF1B\u7F51\u9875\u7248\u91CD\u542F\u670D\u52A1\u3002\u5173\u95ED\u7A97\u53E3\u548C\u300C\u5237\u65B0\u9762\u677F\u300D\u4E0D\u4F1A\u91CD\u8F7D\u540E\u53F0\u3002</p>}\n </section>}\n <section className=\"box table-shell\"><div className=\"bar section-pad\"><div className=\"row\"><button disabled={blocked || !available.length} onClick={() => setSelected(available.map(r => r.name))}>\u9009\u62E9\u5168\u90E8\u53EF\u66F4\u65B0</button><button disabled={blocked || !selected.length} onClick={() => setSelected([])}>\u6E05\u7A7A\u9009\u62E9</button></div><button className=\"primary\" disabled={blocked || !chosen.length} onClick={() => setPlan({ kind: 'update', rows: chosen })}>\u66F4\u65B0\u6240\u9009\uFF08{chosen.length}\uFF09</button></div>\n <div className=\"row section-pad\"><label style={{ flex: 1 }}>\u641C\u7D22\u5DF2\u5B89\u88C5\u63D2\u4EF6<input value={pluginSearch} onChange={e => setPluginSearch(e.target.value)} placeholder=\"\u6309\u63D2\u4EF6\u540D\u79F0\u7B5B\u9009\" /></label><label className=\"filter\">\u663E\u793A\u8303\u56F4<select value={filter} onChange={e => setFilter(e.target.value)}><option value=\"all\">\u5168\u90E8\u7528\u6237\u5B89\u88C5\u63D2\u4EF6</option><option value=\"updates\">\u53EF\u66F4\u65B0 / \u91CD\u8BD5</option><option value=\"npm\">npm \u6765\u6E90</option><option value=\"github\">GitHub \u6765\u6E90</option></select></label></div>\n <div className=\"scroll\" role=\"region\" aria-label=\"\u7528\u6237\u5B89\u88C5\u63D2\u4EF6\u5217\u8868\" tabIndex=\"0\"><table className=\"table\"><thead><tr><th scope=\"col\">\u63D2\u4EF6 / \u9009\u62E9</th><th scope=\"col\">\u6765\u6E90\u4E0E\u7248\u672C</th><th scope=\"col\">\u72B6\u6001</th><th scope=\"col\" className=\"cell-actions\">\u64CD\u4F5C</th></tr></thead><tbody>{visibleRows.map(r => <tr key={r.name} className={selected.includes(r.name) ? 'selected' : ''}><td><label className=\"check\"><input aria-label={`\u9009\u62E9\u66F4\u65B0 ${r.name}`} type=\"checkbox\" disabled={blocked || !available.includes(r)} checked={selected.includes(r.name)} onChange={e => setSelected(e.target.checked ? [...selected, r.name] : selected.filter(n => n !== r.name))} /><strong className=\"mono\">{r.name}</strong></label><small className=\"muted\">{r.enabled ? '\u542F\u7528' : '\u505C\u7528'}</small></td><td>{r.source.kind === 'npm' ? `npm \u00B7 ${r.version || '\u672A\u77E5'}${r.latestVersion ? ' \u2192 ' + r.latestVersion : ''}` : r.source.kind === 'github' ? `GitHub \u00B7 ${r.version || '\u672A\u77E5\u7248\u672C'}` : '\u672C\u5730\u6587\u4EF6 / \u5F00\u53D1\u94FE\u63A5'}<small className=\"muted mono\">{r.source.kind === 'npm' ? `\u5B89\u88C5\u58F0\u660E ${r.source.source} \u00B7 \u68C0\u67E5 ${r.source.tag}` : r.source.kind === 'github' ? `${r.commit?.slice(0, 8) || '\u672A\u77E5\u63D0\u4EA4'}${r.latestCommit ? ' \u2192 ' + r.latestCommit.slice(0, 8) : ''}` : ''}</small></td><td><span className={r.status === 'failed' ? 'error' : r.status === 'available' ? 'good' : 'muted'}>{updateNames[r.status]}</span>{r.message && <small className={r.status === 'failed' ? 'error' : 'muted'}>{r.message}</small>}</td><td className=\"cell-actions\">{available.includes(r) ? <button disabled={blocked} onClick={() => setPlan({ kind: 'update', rows: [r] })}>\u67E5\u770B\u5E76\u66F4\u65B0</button> : '\u2014'}</td></tr>)}</tbody></table>{!visibleRows.length && <p className=\"empty\">{running ? '\u6B63\u5728\u8BFB\u53D6\u63D2\u4EF6\u6E05\u5355\u2026' : rows.length ? '\u6CA1\u6709\u5339\u914D\u7684\u5DF2\u5B89\u88C5\u63D2\u4EF6\uFF0C\u8BF7\u8C03\u6574\u7B5B\u9009\u3002' : '\u5F53\u524D\u914D\u7F6E\u5C1A\u672A\u8BFB\u53D6\u63D2\u4EF6\uFF0C\u8BF7\u68C0\u67E5\u66F4\u65B0\u3002'}</p>}</div>\n </section>\n <details className=\"box help install-plugin\"><summary>\u5B89\u88C5 npm / GitHub \u63D2\u4EF6</summary><div className=\"stack\"><form className=\"row\" onSubmit={e => { e.preventDefault(); const spec = new FormData(e.currentTarget).get('spec').trim(); if (spec) setPlan({ kind: 'install', spec }); }}><label style={{ flex: 1 }}>\u5B89\u88C5\u5730\u5740<input name=\"spec\" value={query} onChange={e => setQuery(e.target.value)} disabled={blocked} required placeholder=\"\u5305\u540D\u3001\u5305\u540D@\u7248\u672C \u6216 github:\u7528\u6237/\u4ED3\u5E93\" autoComplete=\"off\" /></label><button disabled={blocked || !query.trim()}>\u67E5\u770B\u5E76\u5B89\u88C5</button></form><p className=\"notice\">\u4F7F\u7528 DSH \u81EA\u5E26\u5B89\u88C5\u5668\u6267\u884C\u517C\u5BB9\u68C0\u67E5\u3001\u955C\u50CF\u91CD\u8BD5\u548C\u5931\u8D25\u56DE\u6EDA\u3002npm \u955C\u50CF\u53EA\u4F5C\u7528\u4E8E npm \u5305\uFF0CGitHub \u4E0B\u8F7D\u5931\u8D25\u9700\u68C0\u67E5 GitHub \u7F51\u7EDC\u3002\u7F51\u7EDC\u5931\u8D25\u540E\u53EF\u91CD\u65B0\u68C0\u67E5\u6216\u66F4\u6362 npm \u5B89\u88C5\u6E90\u518D\u91CD\u8BD5\u3002</p></div></details>\n {diagnostic && <Modal title=\"\u63D2\u4EF6\u5B89\u88C5\u8BCA\u65AD\" close={() => setDiagnostic(null)}><div className=\"modal-body stack\"><p className=\"notice\">\u4EE5\u4E0B\u4FE1\u606F\u53EA\u542B\u63D2\u4EF6\u540D\u3001\u7248\u672C\u3001\u7CFB\u7EDF\u548C\u9519\u8BEF\u5206\u7C7B\uFF0C\u53EF\u590D\u5236\u7528\u4E8E\u6392\u67E5\uFF1B\u672A\u5305\u542B\u539F\u59CB\u65E5\u5FD7\u3001\u7528\u6237\u540D\u8DEF\u5F84\u6216\u51ED\u8BC1\u3002\u82E5\u539F\u56E0\u672A\u77E5\uFF0C\u8BF7\u5728 DSH \u539F\u751F\u63D2\u4EF6\u9875\u83B7\u53D6\u5B89\u88C5\u65E5\u5FD7\u3002</p><textarea aria-label=\"\u8131\u654F\u5B89\u88C5\u8BCA\u65AD\" readOnly rows=\"9\" value={diagnostic} onFocus={e => e.currentTarget.select()} /><button onClick={async () => { try { await navigator.clipboard.writeText(diagnostic); setCopied(true); } catch { setCopied(false); } }}>{copied ? '\u5DF2\u590D\u5236' : '\u590D\u5236\u8BCA\u65AD'}</button></div></Modal>}\n {plan && <Modal title={plan.kind === 'install' ? '\u786E\u8BA4\u5B89\u88C5\u63D2\u4EF6' : '\u786E\u8BA4\u66F4\u65B0\u63D2\u4EF6'} close={() => setPlan(null)} busy={blocked}><div className=\"modal-body stack\"><p>\u8FD9\u4E9B\u64CD\u4F5C\u4F5C\u7528\u4E8E\u5F53\u524D DSH \u914D\u7F6E\u7684\u6240\u6709\u4F1A\u8BDD\u3002\u5B89\u88C5\u540E\u662F\u5426\u9700\u8981\u91CD\u542F\uFF0C\u4F1A\u5728\u7ED3\u679C\u4E2D\u8BF4\u660E\u3002</p>{plan.kind === 'install' ? <p className=\"mono\">{plan.spec}</p> : plan.rows.map(r => <div className=\"steps\" key={r.name}><strong>{r.name}</strong><p className=\"mono\">{r.target}</p><p>{r.source.kind === 'npm' ? `${r.version || '\u672A\u77E5'} \u2192 ${r.latestVersion}` : `${r.commit?.slice(0, 8) || '\u672A\u77E5\u63D0\u4EA4'} \u2192 ${r.latestCommit?.slice(0, 8) || '\u672A\u77E5\u63D0\u4EA4'}`}</p><p className=\"notice\">\u4FDD\u7559\u4E3A{r.enabled ? '\u542F\u7528' : '\u505C\u7528'}\uFF1B{r.source.kind === 'github' ? '\u7EE7\u7EED\u8DDF\u968F\u539F\u5206\u652F / \u6807\u7B7E' : '\u66F4\u65B0\u5230\u6240\u793A npm \u7248\u672C'}\u3002</p></div>)}<p className=\"notice\">npm \u5B89\u88C5\u6E90\uFF1A{registry || '\u6CBF\u7528 DSH \u8BBE\u7F6E'}</p></div><div className=\"modal-foot row\"><button className=\"primary\" disabled={blocked} onClick={() => { void submitPlan(); }}>\u786E\u8BA4{plan.kind === 'install' ? '\u5B89\u88C5' : '\u66F4\u65B0'}</button><button disabled={blocked} onClick={() => setPlan(null)}>\u53D6\u6D88</button></div></Modal>}\n </div>;\n}\n", "{\n \"name\": \"dsh-multi-router\",\n \"version\": \"0.5.9\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AndroidSix/dsh-multi-router.git\"\n },\n \"description\": \"Multi-account WorkBuddy, Trae and Qoder routing for DeepSeek Harness\",\n \"type\": \"module\",\n \"main\": \"lib/index.js\",\n \"bin\": {\n \"dsh-multi-router\": \"lib/cli.js\"\n },\n \"exports\": {\n \".\": \"./lib/index.js\",\n \"./host\": \"./lib/host.js\",\n \"./client\": \"./lib/client.js\",\n \"./cordis.patch.yml\": \"./cordis.patch.yml\",\n \"./package.json\": \"./package.json\"\n },\n \"engines\": {\n \"node\": \"^22.19.0 || >=24.0.0\"\n },\n \"files\": [\n \"lib\",\n \"cordis.patch.yml\",\n \"README.md\",\n \"LICENSE\",\n \"THIRD_PARTY_NOTICES.md\",\n \"upstream-lock.json\",\n \"router.example.json\",\n \"CHANGELOG.md\"\n ],\n \"dsh\": {\n \"bundle\": {\n \"patch\": \"./cordis.patch.yml\"\n },\n \"client\": {\n \"inject\": [\n \"@deepseek-ai/dsh-client-ui-renderer\"\n ],\n \"platform\": \"web\"\n }\n },\n \"scripts\": {\n \"build\": \"node scripts/build.mjs\",\n \"test\": \"node --test tests/*.test.mjs\",\n \"check\": \"npm run build && npm test\",\n \"pack:release\": \"npm run build && npm pack --ignore-scripts\",\n \"fetch-upstream\": \"node scripts/fetch-upstream.mjs\"\n },\n \"dependencies\": {\n \"@earendil-works/pi-ai\": \"0.87.1\",\n \"yaml\": \"2.9.1\"\n },\n \"peerDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-attachment\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-home-paths\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-llm\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-llm-pi-ai\": \"0.2.0-rc.2\",\n \"@deepseek-ai/schemastery\": \"^3.18.4\",\n \"react\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-attachment\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-home-paths\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-llm\": \"0.2.0-rc.2\",\n \"@deepseek-ai/dsh-llm-pi-ai\": \"0.2.0-rc.2\",\n \"@deepseek-ai/schemastery\": \"^3.18.4\",\n \"esbuild\": \"^0.25.0\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"license\": \"MIT\",\n \"keywords\": [\n \"dsh-plugin\",\n \"deepseek-harness\",\n \"multi-account\",\n \"model-router\",\n \"plugin-updater\"\n ]\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["p", "r", "name", "document"]
|
|
7
7
|
}
|