@sqdr2/dsh-agent-studio-fusion 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/RELEASING.md +19 -4
- package/RELEASING.zh.md +19 -4
- package/lib/client.js +6569 -5867
- package/lib/client.js.map +1 -7
- package/lib/dsh-agent-studio-fusion.js +29190 -25628
- package/lib/types/host/acp/config.d.ts +11 -2
- package/lib/types/host/acp/types.d.ts +9 -1
- package/package.json +2 -1
- package/src/host/acp/agent-process.ts +1 -1
- package/src/host/acp/config.ts +15 -3
- package/src/host/acp/types.ts +9 -1
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/client/index.ts", "../src/client/acp-import.ts", "../src/client/FusionHistory.tsx", "../src/client/i18n.ts", "../src/identity.ts", "../src/client/FusionCache.tsx", "../src/client/agy/AgyConsole.tsx", "../src/client/agy/brand-icons.ts", "../src/client/agy/locale.ts", "../src/client/agy/locales.ts", "../src/client/AcpSettingsGuide.tsx", "../src/client/studio-brand.ts", "../src/client/FusionSettings.tsx", "../src/host/settings.ts", "../src/client/settings-events.ts", "../src/client/FusionPanelIcon.tsx", "../src/client/FusionHint.tsx", "../src/client/FusionRecovery.tsx", "../src/client/FusionStatus.tsx", "../src/client/status-polling.ts", "../src/client/FusionPermission.tsx", "../src/client/FusionTool.tsx", "../src/host/route-transport.ts", "../src/activity.ts", "../src/client/activity-model.ts", "../src/client/ActivityRows.tsx", "../src/client/agy-activity.ts", "../src/client/agy/toolview.ts", "../src/client/agy/decisions.ts", "../src/client/agy/images.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { ConfigForms } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport { bindAcpConfigForm } from './acp-import.js'\nimport { FusionSettings } from './FusionSettings.js'\nimport { FusionPanelIcon } from './FusionPanelIcon.js'\nimport { FusionHint } from './FusionHint.js'\nimport { FusionPermission } from './FusionPermission.js'\nimport { FusionTool, fusionControlTools } from './FusionTool.js'\nimport { AGY_TOOL_VIEWS, installAgyToolViewStyles } from './agy/toolview.js'\nimport { NS as AGY_LOCALE_NS } from './agy/locales.js'\nimport { bindAgyLocale, type AgyLocaleSource } from './agy/locale.js'\nimport { FUSION_SIDEBAR_LABEL } from './studio-brand.js'\nimport { bindLocale } from './i18n.js'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SlotMap {\n 'main': { kind: 'keyed'; scope: 'root' }\n 'sidebar.panellist': {\n kind: 'list'\n scope: 'root'\n owner: { size: number; active: boolean }\n }\n }\n}\n\nexport const name = 'dsh-agent-studio-fusion/client'\nexport const inject = ['slots']\nexport const FUSION_PANEL_ID = 'fusion'\n\nexport { FusionPanelIcon } from './FusionPanelIcon.js'\n\nexport function apply(ctx: Context): void {\n // Follow DSH's language setting (Chinese or English) when the locale service is present.\n ctx.inject(['locale'], scope => {\n const locale = (scope as unknown as { locale: Parameters<typeof bindLocale>[0] }).locale\n scope.effect(() => bindLocale(locale))\n // The ported Antigravity console carries its own dictionaries and follows the\n // same language setting; one service, two readers.\n scope.effect(() => bindAgyLocale(locale as unknown as AgyLocaleSource))\n })\n ctx.inject(['configForms'], scope => {\n const forms = (scope as unknown as { configForms: ConfigForms }).configForms\n scope.effect(() => bindAcpConfigForm(forms.get('dsh-agent-studio-fusion') ?? forms.get('dsh-agent-studio') ?? forms.get('dsh-fusion')))\n })\n for (const tool of fusionControlTools) ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview', key: tool,\n }, FusionTool))\n // The built-in Antigravity route's tool cards. Exactly two keyed views, as the\n // standalone plugin registered them: `agy_tool` (the bridge transport's mirror\n // step) and `run_code` (Code Mode's wrapper). A keyed entry takes over that\n // name, so the `run_code` view renders the generated AGY mirror wrapper as an\n // Antigravity card and every other program as the ordinary code card.\n // Fusion's own activity rows keep rendering through `FusionTool`/`ActivityCard`;\n // nothing here touches them.\n // `tool.call.toolview` is a keyed slot: `key` IS the wire tool name, and the\n // only other fields are `priority`, `locale` and `registrant`. The standalone\n // plugin also passed `id`/`label`; those belong to list slots and are rejected\n // here, so the key is the whole identity \u2014 which is what dispatch reads anyway.\n for (const view of AGY_TOOL_VIEWS) ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview', key: view.key, locale: AGY_LOCALE_NS,\n }, view.component))\n ctx.effect(() => installAgyToolViewStyles())\n ctx.slots.inject('main', () => ctx.slots.register({\n name: 'main', key: FUSION_PANEL_ID,\n }, FusionSettings))\n // The one sidebar entry. Its label is the short product name (the page header\n // carries the full `DSH Agent Studio With Fusion` title); the panel id stays\n // `fusion`, which is what the main-panel key and the route names use.\n ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({\n name: 'sidebar.panellist', id: FUSION_PANEL_ID, order: 40, label: () => FUSION_SIDEBAR_LABEL,\n }, FusionPanelIcon))\n ctx.inject(['modelDirectories'], scope => {\n const sessionProps = (sessionId: Parameters<typeof scope.modelDirectories.directoryFor>[0]) => {\n const directory = scope.modelDirectories.directoryFor(sessionId)\n return { sessionId, directory: directory.store, load: () => { void directory.load().catch(() => undefined) } }\n }\n scope.slots.inject('conversation.input.dock', () => scope.slots.register({\n name: 'conversation.input.dock', id: 'fusion-configuration', order: 20, inject: sessionProps,\n }, FusionHint))\n // Additive: the native permission control keeps its slot and its selection state.\n scope.slots.inject('conversation.input.left', () => scope.slots.register({\n name: 'conversation.input.left', id: 'fusion-permission', order: 10, inject: sessionProps,\n }, FusionPermission))\n })\n}\n", "import { useSyncExternalStore } from 'react'\nimport type { ConfigForm, ConfigFormSnapshot } from '@deepseek-ai/dsh-client-ui-settings/client'\n\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue }\nexport type JsonObject = Record<string, JsonValue>\n\n/** Fields an import owns; anything else on an existing route (permission, models, \u2026) is kept. */\nexport const IMPORTED_KEYS = ['displayName', 'command', 'args', 'env'] as const\n\nexport const LIST_KEYS = ['agent_servers', 'agentServers', 'agents'] as const\n\nexport const ROUTE_PATTERN = /^[a-z0-9][\\w.-]*$/i\n\nexport interface AgentImportEntry {\n /** Name as written in the source configuration. */\n name: string\n route: string\n /** Whether a configured route of the same id is overwritten (its other fields are kept). */\n replaces: boolean\n profile: JsonObject\n}\n\nexport interface AgentImportIssue {\n name: string\n reason: 'importMissingCommand' | 'importBadArgs' | 'importBadEnv'\n}\n\nexport type AgentImport =\n | { ok: true; entries: AgentImportEntry[]; skipped: AgentImportIssue[] }\n | { ok: false; error: string }\n\nexport type SettingsPathOpView =\n | { op: 'set'; path: string[]; value: JsonValue }\n | { op: 'unset'; path: string[] }\n\nfunction objectOf(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n}\n\n/** Turn a client-side display name into a route id; empty for names with no ASCII letters or digits. */\nexport function routeOf(name: string): string {\n return name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/-{2,}/g, '-')\n .replace(/^[-._]+|[-._]+$/g, '')\n}\n\n/** The server map and whether its keys are already route ids (this plugin's own `agents`). */\nfunction serversOf(document: Record<string, unknown>): { servers: Record<string, unknown>; routed: boolean } {\n for (const key of LIST_KEYS) {\n const list = objectOf(document[key])\n if (list !== undefined) {\n return { servers: list, routed: key === 'agents' }\n }\n }\n return { servers: document, routed: false }\n}\n\nfunction entryOf(name: string, value: unknown):\n | { ok: true; command: string; args: string[]; env: Record<string, string>; displayName?: string }\n | { ok: false; reason: AgentImportIssue['reason'] } {\n const server = objectOf(value)\n const command = server?.command\n if (server === undefined || typeof command !== 'string' || command.trim().length === 0) {\n return { ok: false, reason: 'importMissingCommand' }\n }\n const args = server.args ?? []\n if (!Array.isArray(args) || !args.every(arg => typeof arg === 'string')) {\n return { ok: false, reason: 'importBadArgs' }\n }\n const env = server.env ?? {}\n const envObject = objectOf(env)\n if (envObject === undefined || !Object.values(envObject).every(item => typeof item === 'string')) {\n return { ok: false, reason: 'importBadEnv' }\n }\n const displayName = typeof server.displayName === 'string' ? server.displayName : name\n return {\n ok: true,\n command: command.trim(),\n args: args as string[],\n env: envObject as Record<string, string>,\n displayName,\n }\n}\n\nexport interface ExistingAgentInfo {\n raw?: Record<string, unknown>\n resolved?: Record<string, unknown>\n}\n\nexport function existingRoutesOf(\n existing?:\n | readonly { route: string; user?: unknown; profile?: unknown }[]\n | Record<string, unknown>\n | ReadonlyMap<string, unknown>\n | { value?: unknown; user?: unknown }\n): Map<string, ExistingAgentInfo> {\n const map = new Map<string, ExistingAgentInfo>()\n if (!existing) return map\n\n if (Array.isArray(existing)) {\n for (const item of existing) {\n if (item && typeof item === 'object' && 'route' in item && typeof item.route === 'string') {\n const raw = objectOf((item as any).user)\n const resolved = objectOf((item as any).profile) ?? (raw ? undefined : objectOf(item))\n map.set(item.route, { raw, resolved })\n }\n }\n return map\n }\n\n if (existing instanceof Map) {\n for (const [route, item] of existing.entries()) {\n if (typeof route === 'string') {\n const raw = objectOf((item as any)?.user)\n const resolved = objectOf((item as any)?.profile) ?? (raw ? undefined : objectOf(item))\n map.set(route, { raw, resolved })\n }\n }\n return map\n }\n\n if (typeof existing === 'object' && ('value' in existing || 'user' in existing)) {\n const valObj = objectOf((existing as any).value)\n const userObj = objectOf((existing as any).user)\n const valAgents = objectOf((valObj as any)?.acp?.agents) ?? objectOf((valObj as any)?.agents) ?? {}\n const userAgents = objectOf((userObj as any)?.acp?.agents) ?? objectOf((userObj as any)?.agents) ?? {}\n const routes = new Set([...Object.keys(valAgents), ...Object.keys(userAgents)])\n for (const route of routes) {\n const raw = objectOf((userAgents as any)[route])\n const resolved = objectOf((valAgents as any)[route])\n map.set(route, { raw, resolved })\n }\n return map\n }\n\n if (typeof existing === 'object') {\n for (const [route, item] of Object.entries(existing)) {\n const raw = objectOf((item as any)?.user)\n const resolved = objectOf((item as any)?.profile) ?? (raw ? undefined : objectOf(item))\n map.set(route, { raw, resolved })\n }\n }\n\n return map\n}\n\n/**\n * Parse pasted JSON into importable agents. Routes are derived from the entry names and\n * de-duplicated within the import; a route that already exists is marked as a replacement.\n */\nexport function parseAgentImport(\n text: string,\n existingInput?:\n | readonly { route: string; user?: unknown; profile?: unknown }[]\n | Record<string, unknown>\n | ReadonlyMap<string, unknown>\n | { value?: unknown; user?: unknown }\n): AgentImport {\n let document: unknown\n try {\n document = JSON.parse(text)\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) }\n }\n const root = objectOf(document)\n if (root === undefined) {\n return { ok: false, error: 'expected a JSON object' }\n }\n\n const existing = existingRoutesOf(existingInput)\n const taken = new Set<string>()\n const entries: AgentImportEntry[] = []\n const skipped: AgentImportIssue[] = []\n const { servers, routed } = serversOf(root)\n\n for (const [name, value] of Object.entries(servers)) {\n const parsed = entryOf(name, value)\n if (!parsed.ok) {\n skipped.push({ name, reason: parsed.reason })\n continue\n }\n\n const stem = routed && ROUTE_PATTERN.test(name) ? name : routeOf(name) || 'agent'\n let route = stem\n for (let suffix = 2; taken.has(route); suffix++) {\n route = `${stem}-${suffix}`\n }\n taken.add(route)\n\n const previous = existing.get(route)\n const replaces = previous !== undefined\n const merged = { ...(previous?.resolved ?? {}), ...(previous?.raw ?? {}) }\n const carried = Object.fromEntries(\n Object.entries(merged).filter(\n ([key]) => !(IMPORTED_KEYS as readonly string[]).includes(key)\n )\n )\n\n const serverObj = objectOf(value)\n const hasExplicitDisplayName = typeof serverObj?.displayName === 'string'\n const profile: JsonObject = {\n ...(replaces ? carried : { permission: 'ask' }),\n ...(parsed.displayName === undefined || (parsed.displayName === route && !hasExplicitDisplayName)\n ? {}\n : { displayName: parsed.displayName }),\n command: parsed.command,\n ...(parsed.args.length > 0 ? { args: parsed.args } : {}),\n ...(Object.keys(parsed.env).length > 0 ? { env: parsed.env } : {}),\n }\n\n entries.push({ name, route, replaces, profile })\n }\n\n return { ok: true, entries, skipped }\n}\n\n/** One atomic write storing every imported agent under `acp.agents`. */\nexport function importOpsOf(entries: readonly AgentImportEntry[]): SettingsPathOpView[] {\n return entries.map(entry => ({\n op: 'set',\n path: ['acp', 'agents', entry.route],\n value: entry.profile,\n }))\n}\n\nexport interface AcpFormSnapshot<T = any> {\n status: 'loading' | 'ready' | 'unavailable'\n value: T | undefined\n base: unknown\n user: unknown\n revision: number | undefined\n writable: boolean\n mode?: 'host' | 'memory'\n}\n\nconst DEFAULT_UNAVAILABLE_SNAPSHOT: AcpFormSnapshot = Object.freeze({\n status: 'unavailable',\n value: undefined,\n base: undefined,\n user: undefined,\n revision: undefined,\n writable: false,\n})\n\nlet boundForm: ConfigForm<any> | undefined\nconst formListeners = new Set<() => void>()\nconst notifyFormListeners = () => {\n for (const listener of formListeners) {\n listener()\n }\n}\n\n/** Bind the dsh-fusion ConfigForm instance to an external store readable by React. */\nexport function bindAcpConfigForm(form: ConfigForm<any>): () => void {\n boundForm = form\n notifyFormListeners()\n const unsubscribe = form.subscribe(notifyFormListeners)\n return () => {\n unsubscribe()\n if (boundForm === form) {\n boundForm = undefined\n notifyFormListeners()\n }\n }\n}\n\nexport function subscribeAcpConfigForm(listener: () => void): () => void {\n formListeners.add(listener)\n return () => {\n formListeners.delete(listener)\n }\n}\n\nexport function getAcpConfigFormSnapshot(): AcpFormSnapshot {\n return boundForm ? boundForm.getSnapshot() : DEFAULT_UNAVAILABLE_SNAPSHOT\n}\n\nexport function getAcpConfigForm(): ConfigForm<any> | undefined {\n return boundForm\n}\n\nexport function useAcpConfigForm(): AcpFormSnapshot & { form: ConfigForm<any> | undefined } {\n const snapshot = useSyncExternalStore(\n subscribeAcpConfigForm,\n getAcpConfigFormSnapshot,\n () => DEFAULT_UNAVAILABLE_SNAPSHOT\n )\n return {\n status: snapshot.status,\n value: snapshot.value,\n base: snapshot.base,\n user: snapshot.user,\n revision: snapshot.revision,\n writable: snapshot.writable,\n mode: snapshot.mode,\n form: boundForm,\n }\n}\n", "import { useEffect, useState } from 'react'\nimport type { HistoryView, HistoryTotals } from '../host/history.js'\nimport { tr, useLang, type Lang } from './i18n.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\nexport function formatCompact(tokens: number): string {\n if (tokens < 1000) return `${tokens}`\n if (tokens < 1_000_000) {\n const k = tokens / 1000\n return `${k >= 100 ? Math.round(k) : Number(k.toFixed(1))}K`\n }\n const m = tokens / 1_000_000\n return `${m >= 100 ? Math.round(m) : Number(m.toFixed(m >= 10 ? 1 : 2))}M`\n}\n\nexport function outputTokens(lang: Lang, usage: HistoryTotals, calls: number): string {\n if (!calls) return '\u2014'\n const total = usage.totalOutput\n const hasTotal = Boolean(total && total.reported > 0)\n const hasVisible = Boolean(usage.output && usage.output.reported > 0)\n const hasReasoning = Boolean(usage.reasoning && usage.reasoning.reported > 0)\n\n if (!hasTotal) {\n if (hasVisible) {\n const vis = formatCompact(usage.output.known)\n const cov = usage.output.reported < calls ? tr(lang, `\uFF08${usage.output.reported}/${calls} \u6B21\u6709\u62A5\u544A\uFF09`, ` (${usage.output.reported}/${calls} reported)`) : ''\n return `${tr(lang, `\u81F3\u5C11 ${vis}\uFF0C\u63A8\u7406\u672A\u63D0\u4F9B`, `at least ${vis}, reasoning unavailable`)}${cov}`\n }\n return tr(lang, '\u672A\u63D0\u4F9B', 'not reported')\n }\n\n const totalStr = formatCompact(total!.known)\n const visibleStr = hasVisible ? formatCompact(usage.output.known) : tr(lang, '\u672A\u63D0\u4F9B', 'not reported')\n const reasoningStr = hasReasoning ? formatCompact(usage.reasoning!.known) : tr(lang, '\u672A\u63D0\u4F9B', 'not reported')\n const coverageStr = total!.reported < calls ? tr(lang, `\uFF08${total!.reported}/${calls} \u6B21\u6709\u62A5\u544A\uFF09`, ` (${total!.reported}/${calls} reported)`) : ''\n const splitStr = tr(lang, `\uFF08\u53EF\u89C1 ${visibleStr} + \u63A8\u7406 ${reasoningStr}\uFF09`, ` (visible ${visibleStr} + reasoning ${reasoningStr})`)\n return `${totalStr} ${splitStr}${coverageStr}`\n}\n\nconst takeoverReason = (lang: Lang, reason: string) => ({\n 'checks-still-failing': tr(lang, '\u8FD4\u5DE5\u540E\u68C0\u67E5\u4ECD\u5931\u8D25', 'checks still failing after rework'),\n 'worker-step-limit': tr(lang, 'Sidekick \u6B65\u6570\u7528\u5C3D', 'Sidekick step limit'),\n 'worker-stalled': tr(lang, 'Sidekick \u53CD\u590D\u505C\u6EDE', 'Sidekick stalled repeatedly'),\n} as Record<string, string>)[reason] ?? reason\nconst tokens = (lang: Lang, field: HistoryTotals['input'], calls: number) => !calls ? '\u2014' : !field.reported ? tr(lang, '\u672A\u63D0\u4F9B', 'not reported')\n : `${formatCompact(field.known)} (${field.known.toLocaleString()})${field.reported < calls ? tr(lang, `\uFF08${field.reported}/${calls} \u6B21\u6709\u62A5\u544A\uFF09`, ` (${field.reported}/${calls} reported)`) : ''}`\nconst purpose = (lang: Lang, value: string) => ({ conversation: tr(lang, '\u4EFB\u52A1', 'task'), compaction: tr(lang, '\u538B\u7F29', 'compaction'),\n 'cache-keepalive': tr(lang, '\u4FDD\u6D3B', 'keepalive'), 'session-title': tr(lang, '\u6807\u9898', 'title') } as Record<string, string>)[value] ?? value\n/** A dollar figure, or a dash when it could not be computed. */\nexport const money = (value: string | null): string => value === null ? '\u2014' : `$${Number(value).toFixed(2)}`\n/** What still holds the task, so a refusal says why instead of only that it refused. */\nconst blockerText = (lang: Lang, blocker?: string) => ({\n agent: tr(lang, 'Lead \u6216 Sidekick \u4ECD\u5728\u8FD0\u884C', 'its Lead or Sidekick is still running'),\n tool: tr(lang, '\u6709\u539F\u751F\u5DE5\u5177\u8C03\u7528\u5C1A\u672A\u8FD4\u56DE', 'a native tool call has not returned'),\n job: tr(lang, '\u6709\u540E\u53F0\u4EFB\u52A1\u5C1A\u672A\u505C\u6B62', 'a background job has not stopped'),\n lease: tr(lang, '\u4ECD\u6301\u6709\u5DE5\u4F5C\u533A\u5199\u5165\u79DF\u7EA6', 'it still holds the workspace write lease'),\n 'foreign-process': tr(lang, '\u53E6\u4E00\u4E2A Host \u8FDB\u7A0B\u4ECD\u5728\u5904\u7406\u5B83', 'another Host process is still working on it'),\n} as Record<string, string>)[blocker ?? ''] ?? tr(lang, '\u4ECD\u6709\u6D3B\u52A8\u5199\u5165\u65B9', 'something is still writing to it')\n\nexport function FusionHistory() {\n const lang = useLang()\n const [page, setPage] = useState<HistoryView>()\n const [cursor, setCursor] = useState('')\n const [error, setError] = useState('')\n const [refresh, setRefresh] = useState(0)\n const [loading, setLoading] = useState(false)\n const [confirmingId, setConfirmingId] = useState<string | null>(null)\n const [deletingId, setDeletingId] = useState<string | null>(null)\n const [rowError, setRowError] = useState<{ id: string; message: string } | null>(null)\n const [open, setOpen] = useState(false)\n const [tasksOpen, setTasksOpen] = useState(false)\n\n useEffect(() => {\n const abort = new AbortController()\n setLoading(true); setError('')\n void fetch(`${FUSION_API_PATH}?view=history&cursor=${encodeURIComponent(cursor)}`, { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n .then(async response => {\n if (!response.ok) {\n const body = await response.json().catch(() => null) as { error?: string } | null\n if (cursor && (response.status === 409 || body?.error?.includes('cursor') || body?.error?.includes('Cursor'))) {\n setCursor('')\n return\n }\n throw new Error(body?.error || tr(lang, '\u5386\u53F2\u8BB0\u5F55\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6', 'History is unavailable right now'))\n }\n return response.json() as Promise<HistoryView>\n })\n .then(data => { if (data) setPage(data) })\n .catch(error => { if (!abort.signal.aborted) setError(String(error)) })\n .finally(() => { if (!abort.signal.aborted) setLoading(false) })\n return () => abort.abort()\n }, [cursor, refresh, lang])\n\n const handleDelete = async (taskId: string) => {\n setDeletingId(taskId)\n setRowError(null)\n setError('')\n try {\n const res = await fetch(`${FUSION_API_PATH}?taskId=${encodeURIComponent(taskId)}`, {\n method: 'DELETE',\n credentials: 'same-origin',\n })\n if (!res.ok) {\n const data = await res.json().catch(() => null) as { error?: string; blocker?: string } | null\n const raw = data?.error || ''\n const msg = raw === 'Cannot delete a running task'\n ? tr(lang, `\u5F53\u524D\u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\u6216\u5C1A\u672A\u5B89\u5168\u7EC8\u6B62\uFF0C\u65E0\u6CD5\u6E05\u9664\uFF1A${blockerText(lang, data?.blocker)}`,\n `Cannot delete while it still runs: ${blockerText(lang, data?.blocker)}`)\n : (raw || tr(lang, '\u6E05\u9664\u4EFB\u52A1\u5931\u8D25', 'Failed to delete task'))\n throw new Error(msg)\n }\n setPage(prev => prev ? {\n ...prev,\n totalTasks: Math.max(0, prev.totalTasks - 1),\n tasks: prev.tasks.filter(task => task.id !== taskId),\n } : prev)\n setConfirmingId(null)\n setRowError(null)\n if (cursor === taskId) setCursor('')\n setRefresh(v => v + 1)\n } catch (err) {\n setRowError({ id: taskId, message: err instanceof Error ? err.message : String(err) })\n } finally {\n setDeletingId(null)\n }\n }\n\n return <details\n className=\"fusion-history\"\n aria-label={tr(lang, 'Fusion \u5386\u53F2\u4E0E\u7EDF\u8BA1', 'Fusion history and statistics')}\n data-ud-check=\"fusion-history\"\n {...(open ? { open: true } : {})}\n onToggle={event => {\n if (!event.target || event.target === event.currentTarget) {\n setOpen(event.currentTarget.open)\n }\n }}\n >\n <summary className=\"fusion-history-summary\">\n <span className=\"fusion-history-title\">\n <h3>{tr(lang, '\u5386\u53F2\u4E0E\u7EDF\u8BA1', 'History and statistics')}</h3>\n </span>\n <span className=\"fusion-history-indicator\">\n <small>{open ? tr(lang, '\u70B9\u51FB\u6536\u8D77', 'Collapse') : tr(lang, '\u70B9\u51FB\u5C55\u5F00', 'Expand')}</small>\n <span className=\"fusion-history-chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div className=\"fusion-history-content\">\n <div className=\"fusion-history-header\">\n <p>{tr(lang, '\u6309\u5B9E\u9645\u6A21\u578B\u8BF7\u6C42\u6C47\u603B\uFF0C\u5305\u542B\u4EFB\u52A1\u3001\u538B\u7F29\u3001\u4FDD\u6D3B\u53CA\u5DF2\u6709\u6807\u9898\u8BF7\u6C42\u3002\u672A\u62A5\u544A\u7684\u7528\u91CF\u4E0D\u7B97\u4F5C 0\uFF1B\u91D1\u989D\u662F\u6309\u516C\u5F00\u5355\u4EF7\u6362\u7B97\u7684\u4F30\u7B97\uFF0C\u4E0D\u662F\u8D26\u5355\u3002',\n 'Totals of actual model requests: tasks, compaction, keepalive and title requests. Unreported usage is not counted as 0; amounts are estimates converted at published rates, not bills.')}</p>\n <button disabled={loading} onClick={() => setRefresh(value => value + 1)}>{tr(lang, '\u5237\u65B0\u8BB0\u5F55', 'Refresh')}</button>\n </div>\n {error && <p role=\"alert\">{error}</p>}{loading && !page && <p role=\"status\">{tr(lang, '\u6B63\u5728\u8BFB\u53D6\u8BB0\u5F55\u2026', 'Loading\u2026')}</p>}\n {page && <>\n <div className=\"fusion-history-panel fusion-history-usage\" aria-label={tr(lang, '\u7528\u91CF\u7EDF\u8BA1', 'Usage statistics')}>\n <h3>{tr(lang, '\u7528\u91CF\u7EDF\u8BA1', 'Usage statistics')}</h3>\n <p>{tr(lang, `${page.totalTasks} \u9879\u4EFB\u52A1 \u00B7 ${page.totals.calls} \u6B21\u539F\u751F\u8BF7\u6C42 \u00B7 ${page.totals.final} \u6B21\u7528\u91CF\u5B9A\u7A3F \u00B7 ${page.totals.provisional} \u6B21\u6682\u62A5 \u00B7 ${page.totals.unreported} \u6B21\u672A\u63D0\u4F9B`,\n `${page.totalTasks} tasks \u00B7 ${page.totals.calls} native requests \u00B7 ${page.totals.final} final usage \u00B7 ${page.totals.provisional} provisional \u00B7 ${page.totals.unreported} unreported`)}</p>\n <p>{tr(lang, '\u672A\u7F13\u5B58\u8F93\u5165', 'Uncached input')} {tokens(lang, page.totals.input, page.totals.calls)} \u00B7 {tr(lang, '\u7F13\u5B58\u8BFB\u53D6', 'cache read')} {tokens(lang, page.totals.cacheRead, page.totals.calls)} \u00B7 {tr(lang, '\u603B\u8F93\u51FA', 'Total output')} {outputTokens(lang, page.totals, page.totals.calls)} Token</p>\n {page.cost && <p>{tr(lang, `\u672C\u9875\u6309\u4EF7\u76EE\u8868\u4F30\u7B97 ${money(page.cost.apiEquivalentUsd)}\uFF0C\u8986\u76D6 ${page.cost.priced} \u6B21\u8BF7\u6C42`,\n `This page estimates ${money(page.cost.apiEquivalentUsd)} at list prices, covering ${page.cost.priced} requests`)}\n {page.cost.savedUsd !== null ? tr(lang, `\uFF1B\u6BD4\u540C\u6837\u7684 token \u5168\u4EA4\u7ED9 Lead \u7701\u4E0B ${money(page.cost.savedUsd)}\uFF08${page.cost.basis} \u6B21\u8BF7\u6C42\u53EF\u6BD4\uFF09`,\n `; that is ${money(page.cost.savedUsd)} less than sending the same tokens to the Lead (${page.cost.basis} requests comparable)`) : ''}\n {tr(lang, '\u3002\u5B9E\u9645\u8D26\u5355\u4ECD\u672A\u77E5\uFF1ADSH \u4E0D\u63D0\u4F9B\u6BCF\u6B21\u8BF7\u6C42\u7684\u8BA1\u8D39\u91D1\u989D\u3002', '. The actual bill is still unknown: DSH reports no per-request billed amount.')}</p>}\n {page.cost && (page.cost.unpriced + page.cost.incomplete + page.cost.unknown) > 0 && <p role=\"status\">\n {tr(lang, `\u53E6\u6709 ${page.cost.unpriced + page.cost.incomplete + page.cost.unknown} \u6B21\u8BF7\u6C42\u672A\u8BA1\u5165\u91D1\u989D\uFF1A${page.cost.unpriced} \u6B21\u6CA1\u6709\u4EF7\u76EE\u3001${page.cost.incomplete} \u6B21\u7528\u91CF\u4E0D\u5168\u3001${page.cost.unknown} \u6B21\u65E0\u6CD5\u8BFB\u53D6\u3002`,\n `${page.cost.unpriced + page.cost.incomplete + page.cost.unknown} further requests are not priced: ${page.cost.unpriced} with no rate, ${page.cost.incomplete} with incomplete usage, ${page.cost.unknown} unreadable.`)}\n </p>}\n <p>{tr(lang, `Lead \u63A5\u624B\u6539\u4EE3\u7801 ${page.takeovers?.total ?? 0} \u6B21\uFF08${page.takeovers?.tasks ?? 0} \u9879\u4EFB\u52A1\uFF09`, `Lead takeovers: ${page.takeovers?.total ?? 0} (${page.takeovers?.tasks ?? 0} tasks)`)}\n {page.takeovers?.total ? `: ${Object.entries(page.takeovers.reasons).map(([reason, count]) => `${takeoverReason(lang, reason)} ${count}`).join(', ')}` : ''}\n {tr(lang, '\u3002\u53EA\u6709 Sidekick \u786E\u5B9E\u5B8C\u6210\u4E0D\u4E86\u65F6\uFF0C\u7A0B\u5E8F\u624D\u4F1A\u89E3\u9501\u63A5\u624B\u3002', '. The Host unlocks a takeover only when the Sidekick demonstrably cannot finish.')}</p>\n <div style={{ overflowX: 'auto' }} tabIndex={0} aria-label={tr(lang, '\u6309\u5B9E\u9645\u6A21\u578B\u7EDF\u8BA1', 'By actual model')}>\n <table><caption>{tr(lang, '\u6309\u89D2\u8272\u3001\u5B9E\u9645\u6A21\u578B\u548C\u8BF7\u6C42\u7528\u9014', 'By role, actual model and purpose')}</caption><thead><tr>\n <th scope=\"col\">{tr(lang, '\u89D2\u8272 / \u6A21\u578B', 'Role / model')}</th><th scope=\"col\">{tr(lang, '\u7528\u9014', 'Purpose')}</th><th scope=\"col\">{tr(lang, '\u8BF7\u6C42', 'Requests')}</th><th scope=\"col\">{tr(lang, '\u603B\u8F93\u51FA Token\uFF08\u53EF\u89C1 / \u63A8\u7406\uFF09', 'Total output tokens (visible / reasoning)')}</th></tr></thead>\n <tbody>{page.groups.map(group => <tr key={JSON.stringify([group.role, group.provider, group.model, group.purpose])}>\n <th scope=\"row\">{group.role === 'lead' ? 'Lead' : 'Sidekick'} \u00B7 {group.model}<small>{group.provider}</small></th>\n <td>{purpose(lang, group.purpose)}</td><td>{group.calls}</td><td>{outputTokens(lang, group, group.calls)}</td>\n </tr>)}</tbody>\n </table>\n </div>\n <p><small>{tr(lang, `\u66F4\u65B0\u4E8E ${new Date(page.observedAt).toLocaleString()}\u3002\u4F9B\u5E94\u5546\u5185\u90E8\u91CD\u8BD5\u6B21\u6570\u672A\u77E5\u3002`, `Updated ${new Date(page.observedAt).toLocaleString()}. Provider-internal retries are unknown.`)}</small></p>\n </div>\n <details\n className=\"fusion-history-panel fusion-history-tasks\"\n {...(tasksOpen ? { open: true } : {})}\n onToggle={event => setTasksOpen(event.currentTarget.open)}\n >\n <summary className=\"fusion-history-tasks-summary\">\n <span className=\"fusion-history-tasks-title\">\n <strong>{tr(lang, '\u4EFB\u52A1\u8BB0\u5F55', 'Tasks')}</strong>{' '}\n <span className=\"fusion-history-count\">({page.totalTasks})</span>\n </span>\n <span className=\"fusion-history-tasks-indicator\">\n <small>{tasksOpen ? tr(lang, '\u70B9\u51FB\u6536\u8D77', 'Collapse') : tr(lang, '\u70B9\u51FB\u5C55\u5F00', 'Expand')}</small>\n <span className=\"fusion-history-tasks-chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div className=\"fusion-history-tasks-content\">\n {!page.tasks.length && <p>{tr(lang, '\u8FD8\u6CA1\u6709 Fusion \u4EFB\u52A1\u3002', 'No Fusion tasks yet.')}</p>}\n <ol>{page.tasks.map(task => <li key={task.id}>\n <div className=\"fusion-history-item-header\">\n <div>\n <strong>{task.title}</strong>\n <small>\n {new Date(task.createdAt).toLocaleString()} \u00B7 {task.mode === 'completed' ? tr(lang, '\u5DF2\u7ED3\u675F', 'finished') : task.phase} \u00B7 {tr(lang, `${task.usage.calls} \u6B21\u8BF7\u6C42`, `${task.usage.calls} requests`)}{task.takeovers ? tr(lang, ` \u00B7 Lead \u63A5\u624B ${task.takeovers} \u6B21`, ` \u00B7 ${task.takeovers} Lead takeovers`) : ''}\n {task.cost?.priced ? tr(lang, ` \u00B7 \u7EA6 ${money(task.cost.apiEquivalentUsd)}`, ` \u00B7 about ${money(task.cost.apiEquivalentUsd)}`) : ''}\n {task.cost?.savedUsd !== null && task.cost?.savedUsd !== undefined ? tr(lang, `\uFF08\u7701 ${money(task.cost.savedUsd)}\uFF09`, ` (saved ${money(task.cost.savedUsd)})`) : ''}\n </small>\n </div>\n <div className=\"fusion-history-actions\">\n {confirmingId === task.id ? (\n <>\n <span className=\"fusion-history-confirm-text\">{tr(lang, '\u786E\u5B9A\u6E05\u9664\uFF1F', 'Delete?')}</span>\n <button\n type=\"button\"\n disabled={Boolean(deletingId)}\n onClick={() => void handleDelete(task.id)}\n >\n {deletingId === task.id ? tr(lang, '\u6B63\u5728\u6E05\u9664\u2026', 'Deleting\u2026') : tr(lang, '\u786E\u8BA4', 'Confirm')}\n </button>\n <button\n type=\"button\"\n className=\"fusion-btn-subtle\"\n disabled={Boolean(deletingId)}\n onClick={() => { setConfirmingId(null); setRowError(null) }}\n >\n {tr(lang, '\u53D6\u6D88', 'Cancel')}\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n disabled={Boolean(deletingId)}\n onClick={() => { setError(''); setRowError(null); setConfirmingId(task.id) }}\n aria-label={tr(lang, `\u6E05\u9664\u4EFB\u52A1 ${task.title}`, `Delete task ${task.title}`)}\n >\n {tr(lang, '\u6E05\u9664\u8BB0\u5F55', 'Clear')}\n </button>\n )}\n </div>\n </div>\n {rowError?.id === task.id && (\n <p role=\"alert\" className=\"fusion-history-row-error\" style={{ color: 'var(--dsw-alias-state-error-primary, #e5484d)', margin: '6px 0 0', fontSize: '12px' }}>\n {rowError.message}\n </p>\n )}\n <details><summary>{tr(lang, '\u8BB0\u5F55\u8BE6\u60C5', 'Details')}</summary><p>{tr(lang, '\u4EFB\u52A1', 'Task')}: {task.id}</p><p>{tr(lang, '\u4F1A\u8BDD', 'Session')}: {task.sessionId}</p>\n <p>{tr(lang, `\u9A8C\u8BC1\u72B6\u6001\uFF1A${task.verification}\u3002\u5386\u53F2\u8FD0\u884C\u72B6\u6001\u4E0D\u4EE3\u8868\u5F53\u524D\u4ECD\u5728\u6267\u884C\u3002`, `Verification: ${task.verification}. A recorded state does not mean it is still running.`)}</p>\n <p>{tr(lang, '\u8F93\u5165', 'Input')} {tokens(lang, task.usage.input, task.usage.calls)} \u00B7 {tr(lang, '\u7F13\u5B58\u8BFB\u53D6', 'cache read')} {tokens(lang, task.usage.cacheRead, task.usage.calls)} \u00B7 {tr(lang, '\u603B\u8F93\u51FA', 'Total output')} {outputTokens(lang, task.usage, task.usage.calls)} Token</p>\n </details>\n </li>)}</ol>\n <div className=\"fusion-actions\"><button disabled={loading || !cursor} onClick={() => setCursor('')}>{tr(lang, '\u6700\u65B0\u8BB0\u5F55', 'Newest')}</button>\n <button disabled={loading || !page.nextCursor} onClick={() => setCursor(page.nextCursor!)}>{tr(lang, '\u66F4\u65E9\u8BB0\u5F55', 'Older')}</button></div>\n </div>\n </details>\n </>}\n </div>\n </details>\n}\n", "import { useSyncExternalStore } from 'react'\n\n/** The DSH client locale service (`ctx.locale`), used by structure only. */\ninterface LocaleSource { getSnapshot(): { active: string }; subscribe(listener: () => void): () => void }\n\nlet source: LocaleSource | undefined\nconst listeners = new Set<() => void>()\nconst notify = () => { for (const listener of listeners) listener() }\n\n/** Called from the client entry when DSH's locale service is available; follows the user's language setting. */\nexport function bindLocale(next: LocaleSource): () => void {\n source = next\n notify()\n const unsubscribe = next.subscribe(notify)\n return () => { unsubscribe(); if (source === next) { source = undefined; notify() } }\n}\n\nexport type Lang = 'zh' | 'en'\nconst current = (): Lang => {\n const id = source?.getSnapshot().active ?? (typeof navigator === 'undefined' ? 'en' : navigator.language)\n return id.toLowerCase().startsWith('zh') ? 'zh' : 'en'\n}\n\n/** The UI language: Chinese for any zh locale, English otherwise (DSH's own fallback). */\nexport function useLang(): Lang {\n return useSyncExternalStore(listener => { listeners.add(listener); return () => { listeners.delete(listener) } }, current, () => 'en')\n}\n\n/** Pick the text for the active language. */\nexport const tr = (lang: Lang, zh: string, en: string) => lang === 'zh' ? zh : en\n", "/**\n * The identity this plugin registers under.\n *\n * Both halves import this module, so the provider route, the model entry and\n * the durable producers keep one spelling. It deliberately has no imports: the\n * browser bundle inlines it and must not pull a Host module in.\n */\n\n/** The HTTP path the panel's own views and actions are served from. */\nexport const FUSION_API_PATH = '/api/fusion'\n\n/**\n * The path this plugin served before the rename. The host keeps answering it\n * so a browser tab holding the previous client bundle keeps working until its\n * next reload; nothing in the current bundle requests it.\n */\nexport const LEGACY_FUSION_API_PATH = '/api/model-fusion'\n\n/**\n * The npm package this project publishes under.\n *\n * Distinct from {@link PLUGIN_NAME}: the package name is the registry identity\n * and the module specifier a profile's patch resolves, while the plugin id is\n * the runtime identity that names the state directory, the bundle patch row and\n * the log marker. Keeping them apart is what lets the package move into a scope\n * without moving anyone's data.\n */\nexport const PACKAGE_NAME = '@sqdr2/dsh-agent-studio-fusion'\n\n/** The plugin id this project registers under, and the name of its state directory. */\nexport const PLUGIN_NAME = 'dsh-agent-studio-fusion'\n\n/** The plugin ids this project used before the renames. */\nexport const LEGACY_PLUGIN_NAME = 'dsh-fusion'\nexport const LEGACY_PLUGIN_NAMES = ['dsh-fusion', 'dsh-model-fusion', 'dsh-agent-studio'] as const\n\n/** Registered provider route for the Fusion model entries. */\nexport const FUSION_PROVIDER = 'dsh-fusion'\n\n/**\n * The model id of the combo every installation starts with.\n *\n * It is a pair id like any other; keeping this exact spelling for the first\n * combo means a durable `model/selection` written before combos existed still\n * names a combo that exists.\n */\nexport const FUSION_MODEL = 'auto'\n\n/**\n * The model ids this provider advertises: `auto` plus one generated\n * `pair-xxxxxxxx` per additional combo. The browser bundle inlines this module,\n * so the namespace shape is fixed here rather than read from a settings\n * document at import time.\n */\nconst FUSION_MODEL_PATTERN = /^(?:auto|pair-[a-z0-9]{6,12})$/\n\n/** Whether a model id names a Fusion combo on this provider. */\nexport const isFusionModel = (model: string | undefined): boolean =>\n typeof model === 'string' && FUSION_MODEL_PATTERN.test(model)\n\n/**\n * The provider route this plugin registered before it was renamed from\n * `dsh-model-fusion`. Sessions created then still name it in their durable\n * `model/selection` event, so reading it as Fusion is what keeps those\n * sessions working; writing it is never correct.\n */\nexport const LEGACY_FUSION_PROVIDER = 'dsh-model-fusion'\n\n/** Whether a provider route belongs to this plugin, under any historical name. */\nexport const isFusionProvider = (provider: string | undefined): boolean =>\n provider === FUSION_PROVIDER || provider === LEGACY_FUSION_PROVIDER || provider === 'dsh-agent-studio-fusion' || provider === 'dsh-agent-studio'\n\n/** Whether a route names a Fusion combo, under either provider spelling. */\nexport const isFusionSelection = (route: { provider?: string; model?: string } | undefined): boolean =>\n isFusionProvider(route?.provider) && isFusionModel(route?.model)\n\n/**\n * How a native model-switch notice names a combo: `provider/model`, or the bare\n * model when both sides share this provider (switching from one combo to\n * another).\n *\n * The notice is a pseudo-change: it compares the virtual menu route with the\n * physical Lead route that actually dispatches, so it would otherwise repeat on\n * every Fusion step. Both provider spellings are accepted because a session\n * that switched to Fusion before the rename carries the old one in its durable\n * log; any combo id matches, since combos are not physical models.\n */\nconst FUSION_SELECTION_LABEL_PATTERN = /(?:(?:dsh-agent-studio-fusion|dsh-agent-studio|dsh-fusion|dsh-model-fusion)\\/|\u2192 )(?:auto|pair-[a-z0-9]{6,12})$/\n\n/** Whether a switch-notice summary describes a Fusion combo as either side. */\nexport const isFusionSelectionLabel = (summary: string | undefined): boolean =>\n typeof summary === 'string' && FUSION_SELECTION_LABEL_PATTERN.test(summary)\n\n/**\n * Whether a route already names a combo under its current provider spelling. A\n * durable intent that fails this is rewritten before the next request is\n * assembled; the legacy spelling is a read-side alias, not a dispatching route.\n */\nexport const isCurrentFusionSelection = (route: { provider?: string; model?: string } | undefined): boolean =>\n route?.provider === FUSION_PROVIDER && isFusionModel(route.model)\n\n/**\n * The provider route of the built-in Antigravity (agy CLI) side.\n *\n * Ported from dsh-agy-worker, MIT License, Copyright (c) 2026 dsh-agy-worker\n * contributors; see docs/ATTRIBUTION-AGY.md. The spelling is load-bearing:\n * durable `model/selection` events, `workerTools` ceilings and the route\n * transport table all name `antigravity` / `agy_tool`, so the port keeps it.\n */\nexport const AGY_PROVIDER = 'antigravity'\n\n/**\n * The HTTP prefix the Antigravity console polls. Unchanged from the standalone\n * plugin, so no route rename is involved and a tab still running the previous\n * bundle keeps answering until it reloads.\n */\nexport const AGY_API_PATH = '/plugins/agy-worker'\n", "import { useEffect, useState } from 'react'\nimport { tr, useLang, type Lang } from './i18n.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\ntype Mode = 'auto' | 'on' | 'off'\ninterface Totals { waits: number; waitHits: number; pings: number; pingHits: number; pingTokens: number; pingOutputTokens?: number; keptWarmTokens: number; resentTokens: number }\ninterface CacheModel {\n provider: string; model: string; role?: 'lead' | 'worker'\n mode: Mode; intervalSeconds: number\n modeSource: 'user' | 'pair' | 'role' | 'route' | 'family' | 'generic'\n intervalSource: 'user' | 'learned' | 'route' | 'family' | 'generic'\n setting: { mode?: Mode; intervalSeconds?: number }\n defaults: { mode: Mode; intervalSeconds: number; source: string\n family?: { label: string; lifetime: { zh: string; en: string }; discount: string; docs: string }\n route?: { label: string; reason: { zh: string; en: string } } }\n totals: Totals | null; learnedIntervalSeconds: number | null; suggestion: number | null\n recent: { gapSeconds: number; ping: boolean; hit: boolean }[]\n}\n\nconst tokens = (value: number) => value >= 1e6 ? `${(value / 1e6).toFixed(1)}M` : value >= 1e3 ? `${Math.round(value / 1e3)}k` : String(value)\nconst minutes = (seconds: number) => seconds % 60 ? `${(seconds / 60).toFixed(1)} min` : `${seconds / 60} min`\nconst modeName = (lang: Lang, mode: Mode) => ({ auto: tr(lang, '\u81EA\u52A8', 'Auto'), on: tr(lang, '\u5F00\u542F', 'On'), off: tr(lang, '\u5173\u95ED', 'Off') })[mode]\n\nfunction modeSource(lang: Lang, row: CacheModel): string {\n switch (row.modeSource) {\n case 'user': return tr(lang, '\u4F60\u7684\u8BBE\u7F6E', 'your setting')\n case 'pair': return tr(lang, '\u65E7\u7248\u7EC4\u5408\u8BBE\u7F6E', 'older pair setting')\n case 'role': return tr(lang, 'Sidekick \u9ED8\u8BA4\u5173\u95ED\uFF08\u5B83\u5F88\u5C11\u957F\u65F6\u95F4\u7B49\u5F85\uFF09', 'Sidekick default off (it rarely waits long)')\n case 'route': return `${row.defaults.route!.label}: ${lang === 'zh' ? row.defaults.route!.reason.zh : row.defaults.route!.reason.en}`\n case 'family': return tr(lang, `${row.defaults.family!.label} \u5B98\u65B9\u9ED8\u8BA4`, `${row.defaults.family!.label} documented default`)\n default: return tr(lang, '\u901A\u7528\u9ED8\u8BA4', 'generic default')\n }\n}\nfunction intervalSource(lang: Lang, row: CacheModel): string {\n if (row.intervalSource === 'user') return tr(lang, '\u4F60\u7684\u8BBE\u7F6E', 'your setting')\n if (row.intervalSource === 'learned') return tr(lang, '\u81EA\u52A8\u5B66\u4E60\uFF1A\u4FDD\u6D3B\u591A\u6B21\u672A\u547D\u4E2D\uFF0C\u5DF2\u7F29\u77ED', 'learned: pings kept missing, shortened')\n return tr(lang, '\u9ED8\u8BA4', 'default')\n}\n\nfunction ModelCard({ row, onSaved }: { row: CacheModel; onSaved(): void }) {\n const lang = useLang()\n const [interval, setInterval] = useState(String(row.setting.intervalSeconds ? row.setting.intervalSeconds / 60 : ''))\n const [busy, setBusy] = useState(false), [error, setError] = useState<string>()\n const save = async (body: Record<string, unknown>) => {\n setBusy(true); setError(undefined)\n try {\n const response = await fetch(FUSION_API_PATH, { method: 'POST', credentials: 'same-origin', headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ action: 'cache-setting', provider: row.provider, model: row.model, ...body }) })\n const result = await response.json() as { error?: string }\n if (!response.ok) throw new Error(result.error ?? tr(lang, '\u4FDD\u5B58\u5931\u8D25', 'Save failed'))\n onSaved()\n } catch (reason) { setError(reason instanceof Error ? reason.message : String(reason)) }\n finally { setBusy(false) }\n }\n const t = row.totals\n const family = row.defaults.family\n return <div className=\"fusion-cache-model\">\n <strong>{row.model}<small>{row.provider}{row.role ? ` \u00B7 ${row.role === 'lead' ? 'Lead' : 'Sidekick'}` : ''}</small></strong>\n <p>{tr(lang, '\u73B0\u5728', 'Now')}: <b>{modeName(lang, row.mode)}</b>{row.mode !== 'off' && <>{tr(lang, '\uFF0C\u6BCF ', ', every ')}<b>{minutes(row.intervalSeconds)}</b>{tr(lang, ' \u7EED\u4E00\u6B21', '')}</>}\n <small>{tr(lang, '\u5F00\u5173\u6765\u6E90', 'Mode')}: {modeSource(lang, row)} \u00B7 {tr(lang, '\u95F4\u9694\u6765\u6E90', 'Interval')}: {intervalSource(lang, row)}</small></p>\n {family && <p><small>{tr(lang, '\u5B98\u65B9\u6587\u6863', 'Documented')}: {lang === 'zh' ? family.lifetime.zh : family.lifetime.en}\uFF1B{tr(lang, '\u7F13\u5B58\u4EF7\u7EA6\u4E3A\u5168\u4EF7', 'cached price \u2248')} {family.discount} \u00B7 <a href={family.docs} target=\"_blank\" rel=\"noreferrer\">{tr(lang, '\u6765\u6E90', 'source')}</a></small></p>}\n <div className=\"fusion-cache-controls\">\n <label>{tr(lang, '\u4FDD\u6D3B', 'Keepalive')}<select aria-label={`${row.model} keepalive`} disabled={busy} value={row.setting.mode ?? ''}\n onChange={event => { void save({ mode: event.target.value || null, intervalSeconds: row.setting.intervalSeconds ?? null }) }}>\n <option value=\"\">{tr(lang, `\u9ED8\u8BA4\uFF08${modeName(lang, row.defaults.mode)}\uFF09`, `Default (${modeName(lang, row.defaults.mode)})`)}</option>\n <option value=\"auto\">{tr(lang, '\u81EA\u52A8\uFF1A\u8BE5\u6A21\u578B\u8FD4\u56DE\u8FC7\u7F13\u5B58\u547D\u4E2D\u540E\u624D\u5F00\u542F', 'Auto: only after this model reports cache hits')}</option>\n <option value=\"on\">{tr(lang, '\u5F00\u542F', 'On')}</option>\n <option value=\"off\">{tr(lang, '\u5173\u95ED\uFF08\u6309\u8BF7\u6C42\u6B21\u6570\u8BA1\u8D39\u7684\u5957\u9910\u9009\u8FD9\u4E2A\uFF09', 'Off (choose for plans billed per request)')}</option>\n </select></label>\n <label>{tr(lang, '\u95F4\u9694\uFF08\u5206\u949F\uFF09', 'Interval (min)')}<input type=\"number\" min=\"1\" max=\"59\" step=\"0.5\" disabled={busy} value={interval}\n placeholder={String(+(row.intervalSeconds / 60).toFixed(2))} onChange={event => setInterval(event.target.value)}\n onBlur={() => { if (interval !== String(row.setting.intervalSeconds ? row.setting.intervalSeconds / 60 : ''))\n void save({ mode: row.setting.mode ?? null, intervalSeconds: interval ? Math.round(Number(interval) * 60) : null }) }} /></label>\n <button type=\"button\" disabled={busy || (!row.setting.mode && !row.setting.intervalSeconds)} onClick={() => { setInterval(''); void save({ reset: true }) }}>{tr(lang, '\u6062\u590D\u9ED8\u8BA4', 'Reset')}</button>\n </div>\n {row.suggestion && <p role=\"status\">{tr(lang, `\u89C2\u5BDF\u5230\u7B49\u5F85 ${minutes(row.suggestion)} \u4EE5\u4E0A\u7F13\u5B58\u4ECD\u7136\u547D\u4E2D\uFF0C\u53EF\u4EE5\u628A\u95F4\u9694\u653E\u5BBD\u5230 ${minutes(row.suggestion)}\uFF08\u4E0D\u4F1A\u81EA\u52A8\u4FEE\u6539\uFF09\u3002`,\n `Cache still hit after waits over ${minutes(row.suggestion)}; you can lengthen the interval to ${minutes(row.suggestion)} (not changed automatically).`)}</p>}\n {t ? <p>{tr(lang, '\u6548\u679C', 'Effect')}: {tr(lang, `\u7B49\u5F85\u540E\u547D\u4E2D ${t.waitHits}/${t.waits} \u6B21`, `hit after ${t.waitHits}/${t.waits} waits`)}{t.waits ? ` (${Math.round(100 * t.waitHits / t.waits)}%)` : ''}\uFF1B\n {tr(lang, ` \u4FDD\u6D3B ${t.pings} \u6B21\uFF08${t.pingHits} \u6B21\u547D\u4E2D\uFF0C\u8BFB\u53D6 ${tokens(t.pingTokens)} token\uFF0C\u591A\u4E3A\u7F13\u5B58\u4EF7${t.pingOutputTokens != null ? `\uFF0C\u8F93\u51FA ${tokens(t.pingOutputTokens)} token` : ''}\uFF09\uFF1B`, ` ${t.pings} pings (${t.pingHits} hit, ${tokens(t.pingTokens)} tokens read, mostly at cache price${t.pingOutputTokens != null ? `, ${tokens(t.pingOutputTokens)} output` : ''}); `)}\n {tr(lang, ` \u7B49\u5F85\u540E\u4ECD\u4ECE\u7F13\u5B58\u8BFB\u53D6 ${tokens(t.keptWarmTokens)} token\uFF0C\u6309\u5168\u4EF7\u91CD\u53D1 ${tokens(t.resentTokens)} token\u3002`, ` after waits ${tokens(t.keptWarmTokens)} tokens served from cache, ${tokens(t.resentTokens)} resent at full price.`)}\n {t.pings >= 5 && t.pingHits / t.pings < 0.5 && <b>{tr(lang, ' \u4FDD\u6D3B\u5927\u591A\u6CA1\u547D\u4E2D\uFF0C\u5EFA\u8BAE\u5173\u95ED\u6216\u7F29\u77ED\u95F4\u9694\u3002', ' Most pings missed: turn it off or shorten the interval.')}</b>}</p>\n : <p>{tr(lang, '\u8FD8\u6CA1\u6709\u6570\u636E\uFF1ALead \u7B49\u5F85 Sidekick \u4E4B\u540E\u624D\u4F1A\u4EA7\u751F\u8BB0\u5F55\u3002', 'No data yet: records appear after the Lead waits for the Sidekick.')}</p>}\n {!!row.recent.length && <p><small>{tr(lang, '\u6700\u8FD1', 'Recent')}: {row.recent.map((item, i) => <span key={i}>{item.ping ? '\u21BB' : ''}{minutes(item.gapSeconds)}{item.hit ? ' \u2713' : ' \u2717'}{i < row.recent.length - 1 ? ' \u00B7 ' : ''}</span>)}</small></p>}\n {error && <p role=\"alert\">{error}</p>}\n </div>\n}\n\n/** Per-model cache keepalive: what applies and why, the documented default, and what was observed. */\nexport function FusionCache({ refresh }: { refresh: number }) {\n const lang = useLang()\n const [rows, setRows] = useState<CacheModel[]>(), [checked, setChecked] = useState<string>(), [error, setError] = useState<string>()\n const [reload, setReload] = useState(0)\n const [open, setOpen] = useState(false)\n useEffect(() => {\n const abort = new AbortController()\n void fetch(`${FUSION_API_PATH}?view=cache`, { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n .then(async response => { if (!response.ok) throw new Error(tr(lang, '\u65E0\u6CD5\u8BFB\u53D6\u7F13\u5B58\u8BBE\u7F6E', 'Cannot read cache settings')); return response.json() as Promise<{ checked: string; models: CacheModel[] }> })\n .then(value => { setRows(value.models); setChecked(value.checked) })\n .catch(reason => { if (!abort.signal.aborted) setError(String(reason)) })\n return () => abort.abort()\n }, [refresh, reload, lang])\n return <details\n className=\"fusion-cache\"\n aria-label={tr(lang, '\u7F13\u5B58\u4FDD\u6D3B', 'Cache keepalive')}\n data-ud-check=\"fusion-cache\"\n {...(open ? { open: true } : {})}\n onToggle={event => {\n if (!event.target || event.target === event.currentTarget) {\n setOpen(event.currentTarget.open)\n }\n }}\n >\n <summary className=\"fusion-cache-summary\">\n <span className=\"fusion-cache-title\">\n <h3>{tr(lang, '\u7F13\u5B58\u4FDD\u6D3B', 'Cache keepalive')}</h3>\n </span>\n <span className=\"fusion-cache-indicator\">\n <small>{open ? tr(lang, '\u70B9\u51FB\u6536\u8D77', 'Collapse') : tr(lang, '\u70B9\u51FB\u5C55\u5F00', 'Expand')}</small>\n <span className=\"fusion-cache-chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div className=\"fusion-cache-content\">\n <p>{tr(lang, 'Lead \u7B49 Sidekick \u5E72\u6D3B\u65F6\u53EF\u80FD\u8981\u7B49\u51E0\u5206\u949F\uFF0C\u6A21\u578B\u7684\u8F93\u5165\u7F13\u5B58\u8FC7\u671F\u540E\uFF0C\u4E0B\u4E00\u6B21\u8BF7\u6C42\u4F1A\u6309\u5168\u4EF7\u91CD\u8BFB\u6574\u6BB5\u5BF9\u8BDD\u3002\u4FDD\u6D3B\u5728\u7B49\u5F85\u671F\u95F4\u5B9A\u65F6\u628A Lead \u4E0A\u4E00\u6B21\u7684\u8BF7\u6C42\u539F\u6837\u518D\u53D1\u4E00\u904D\uFF0C\u672B\u5C3E\u53EA\u52A0\u4E00\u53E5\u201CReply OK\u201D\uFF0C\u6A21\u578B\u53EA\u56DE\u4E00\u4E2A OK\uFF0C\u7F13\u5B58\u5C31\u4E0D\u4F1A\u8FC7\u671F\u3002\u9ED8\u8BA4\u503C\u6765\u81EA\u5404\u5BB6\u5B98\u65B9\u6587\u6863\uFF0C\u6BCF\u4E2A\u6A21\u578B\u90FD\u53EF\u4EE5\u5355\u72EC\u8C03\u6574\u3002',\n 'While the Lead waits for the Sidekick, the model\\'s prompt cache can expire and the next request re-reads the whole conversation at full price. Keepalive resends the Lead\\'s previous request at intervals with only \u201CReply OK\u201D appended; the model answers OK and the cache stays warm. Defaults come from each provider\\'s documentation; every model can be adjusted.')}</p>\n {checked && <p><small>{tr(lang, `\u5B98\u65B9\u9ED8\u8BA4\u503C\u6838\u5BF9\u65E5\u671F\uFF1A${checked}\u3002`, `Documented defaults checked on ${checked}.`)}</small></p>}\n {error && <p role=\"alert\">{error}</p>}\n {rows?.map(row => <ModelCard key={`${row.provider}/${row.model}/${row.setting.mode ?? ''}/${row.setting.intervalSeconds ?? ''}`} row={row} onSaved={() => setReload(value => value + 1)} />)}\n </div>\n </details>\n}\n", "/**\n * The Antigravity (agy) management console, rendered inside FusionSettings.\n *\n * Ported from dsh-agy-worker (`src/client/index.ts`), MIT License,\n * Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n * dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n * docs/ATTRIBUTION-AGY.md.\n *\n * What changed in the port: Fusion is the single plugin identity, so this is a\n * plain module rather than a client entry. It keeps the console component, the\n * shared status poll and the quota/progress presentation it renders. The\n * standalone plugin's own `main`, `sidebar.panellist`, `plugins.*` and\n * header-badge registrations are deliberately absent \u2014 FusionSettings is the\n * only entry \u2014 and so are its page-level DOM scanners (settings-nav icon,\n * mermaid, reasoning, images, decisions, scroll guard). The route surface it\n * talks to is unchanged: `/plugins/agy-worker/*`.\n */\nimport { createElement, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { AccountPoolData, ModelQuotaInfo, ManagedAccount } from '../../host/agy/pool-types.js'\nimport { BRAND_COLORS, BRAND_PATHS, UI_PATHS } from './brand-icons.js'\nimport type { AgyLocaleSource } from './locale.js'\nimport { useAgyTranslation } from './locale.js'\nimport { NS, en, es, ptBR, zh, type AgyLocaleKey } from './locales.js'\nimport { setOverlaySuspended } from './scroll-guard.js'\n\n/**\n * The console builds its tree with a permissive `createElement`.\n *\n * Upstream compiled against a loose `require('react')` shim; this file is typed\n * against the real React types, where every helper that returns `unknown` is a\n * `ReactNode` mismatch. The shim keeps the ported call sites verbatim (one\n * function, same argument shape) instead of rewriting several hundred nodes.\n */\nconst h = createElement as unknown as (\n\t(type: unknown, props?: Record<string, unknown> | null, ...children: unknown[]) => unknown\n)\n\nconst win = globalThis as unknown as {\n\tlocation?: { origin?: string };\n\tfetch?: (url: string, init?: Record<string, unknown>) => Promise<{ ok: boolean; status: number; json(): Promise<unknown> }>;\n\topen?: (url: string, target?: string) => void;\n\tdocument?: { body?: unknown } | null;\n\tlocalStorage?: {\n\t\tgetItem(key: string): string | null;\n\t\tsetItem(key: string, value: string): void;\n\t\tremoveItem(key: string): void;\n\t};\n\taddEventListener?: (type: string, listener: (ev: Event) => void, useCapture?: boolean) => void;\n\tremoveEventListener?: (type: string, listener: (ev: Event) => void, useCapture?: boolean) => void;\n};\n\ninterface StatusPayload {\n\tbin?: string | null;\n\tversion?: string | null;\n\tdormantReason?: string | null;\n\tenabled?: boolean;\n\tpermissionMode?: string;\n\tworkspaceRoot?: string;\n\tdefaultModel?: string;\n\tdefaultEffort?: string;\n\tauth?: {\n\t\tphase: string;\n\t\taccountId?: string;\n\t\turl?: string;\n\t\tqrDataUrl?: string;\n\t\tstartedAt?: number;\n\t\texpiresAt?: number;\n\t\tmessage?: string;\n\t};\n\tpool?: AccountPoolData;\n\tpoolAuth?: {\n\t\tphase: 'idle' | 'waiting' | 'exchanging' | 'done' | 'failed';\n\t\tstagingId?: string;\n\t\talias?: string;\n\t\turl?: string;\n\t\tmode?: 'auto' | 'manual';\n\t\tbrowserOpened?: boolean;\n\t\tcode?: string;\n\t};\n\tcatalog?: { source: string; count: number; lastError: string | null };\n\tcatalogModels?: ReadonlyArray<{ id: string; name: string }>;\n\thiddenModels?: readonly string[];\n\tautoWarmup?: boolean;\n\twarmupModels?: readonly string[];\n\tbindings?: number;\n\tlastRun?: { ok: boolean; code: string; durationMs: number; model: string } | null;\n}\n\ninterface ToastNotice {\n\ttext: string;\n\ttype: 'success' | 'info' | 'warn' | 'error';\n\tid: number;\n}\n\nconst base = win.location?.origin ?? '';\n\nconst STATUS_CACHE_KEY = 'dsh_agy_status_cache';\n\nfunction loadInitialStatusCache(): StatusPayload | null {\n\ttry {\n\t\tconst raw = win.localStorage?.getItem(STATUS_CACHE_KEY);\n\t\tif (raw) {\n\t\t\tconst parsed = JSON.parse(raw);\n\t\t\tif (parsed && typeof parsed === 'object') return parsed as StatusPayload;\n\t\t}\n\t} catch {\n\t\t// Ignore storage quota / parsing errors\n\t}\n\treturn null;\n}\n\n// Module-level cache for instant remount rendering (preloaded from localStorage for zero-flicker startup)\nlet statusCache: StatusPayload | null = loadInitialStatusCache();\n\nasync function getStatus(): Promise<StatusPayload | null> {\n\ttry {\n\t\t// A bounded fetch: the poll loop must never stack behind a hung request\n\t\t// (undici/browser defaults can park far longer than one poll period).\n\t\tconst init: Record<string, unknown> = {};\n\t\tif (typeof AbortSignal !== 'undefined' && typeof (AbortSignal as { timeout?: unknown }).timeout === 'function') {\n\t\t\tinit.signal = (AbortSignal as { timeout: (ms: number) => unknown }).timeout(5000);\n\t\t}\n\t\tconst res = await win.fetch?.(base + '/plugins/agy-worker/status', init);\n\t\tif (!res || !res.ok) return null;\n\t\treturn (await res.json()) as StatusPayload;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function postJson(path: string, body: Record<string, unknown>): Promise<any> {\n\ttry {\n\t\tconst res = await win.fetch?.(base + path, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(body),\n\t\t});\n\t\tif (!res) return null;\n\t\ttry {\n\t\t\tconst payload = await res.json();\n\t\t\t// Surface HTTP failure as ok:false so callers can distinguish\n\t\t\t// \"saved\" from \"server refused\" instead of always toasting success.\n\t\t\tif (!res.ok && payload !== null && typeof payload === 'object') {\n\t\t\t\treturn { ok: false, ...(payload as Record<string, unknown>) };\n\t\t\t}\n\t\t\treturn payload;\n\t\t} catch {\n\t\t\treturn { ok: res.ok };\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function getJson<T = any>(path: string): Promise<T | null> {\n\ttry {\n\t\tconst res = await win.fetch?.(base + path);\n\t\tif (!res || !res.ok) return null;\n\t\treturn (await res.json()) as T;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n// ---- shared status polling ----\n// ONE module-level fetch loop serves every mounted consumer (settings panel,\n// header badge, modal). Per-component 3s loops used to stack (three full\n// payload fetches per interval with the modal open), had no overlap guard,\n// and let a slow stale response overwrite a newer one.\nconst statusListeners = new Set<(s: StatusPayload) => void>();\nlet statusPollTimer: ReturnType<typeof setInterval> | null = null;\nlet statusPollInterval = 3000;\nlet statusFetchSeq = 0;\n\nfunction isStatusEqual(a: StatusPayload | null, b: StatusPayload | null): boolean {\n\tif (a === b) return true;\n\tif (a === null || b === null) return false;\n\ttry {\n\t\treturn JSON.stringify(a) === JSON.stringify(b);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction notifyStatus(st: StatusPayload): void {\n\tstatusCache = st;\n\ttry {\n\t\twin.localStorage?.setItem(STATUS_CACHE_KEY, JSON.stringify(st));\n\t} catch {\n\t\t// Ignore storage quota / parsing errors\n\t}\n\tfor (const fn of [...statusListeners]) {\n\t\ttry { fn(st); } catch { /* a dead consumer must not kill the loop */ }\n\t}\n}\n\nasync function statusPollTick(): Promise<void> {\n\tconst seq = ++statusFetchSeq;\n\tconst st = await getStatus();\n\t// A slow response from an older tick must never overwrite newer data.\n\t// Only notify when payload actually changed to prevent needless re-renders.\n\tif (st !== null && seq === statusFetchSeq) {\n\t\tif (!isStatusEqual(statusCache, st)) {\n\t\t\tnotifyStatus(st);\n\t\t}\n\t}\n}\n\nfunction ensureStatusPolling(): void {\n\tif (statusPollTimer !== null) {\n\t\tif (statusPollInterval !== 3000) {\n\t\t\tclearInterval(statusPollTimer);\n\t\t\tstatusPollTimer = null;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n\tstatusPollInterval = 3000;\n\tvoid statusPollTick();\n\tstatusPollTimer = setInterval(() => { void statusPollTick(); }, 3000);\n}\n\nfunction stopStatusPollingIfIdle(): void {\n\t// Keep statusCache warm so opening a session never faces an empty or stale snapshot.\n\t// When idle (no active mounted viewers), relax the polling interval to 15s.\n\tif (statusListeners.size === 0 && statusPollTimer !== null && statusPollInterval === 3000) {\n\t\tclearInterval(statusPollTimer);\n\t\tstatusPollInterval = 15000;\n\t\tstatusPollTimer = setInterval(() => { void statusPollTick(); }, 15000);\n\t}\n}\n\n/**\n * Subscribe a component to the shared status poll. Returns the latest\n * snapshot plus a manual refresh that keeps the last good snapshot on a\n * transient failure (a failed refresh used to flip the whole panel back to\n * its loading state).\n */\nfunction useAgyStatus(): { status: StatusPayload | null; refresh: () => Promise<void> } {\n\tconst [status, setStatus] = useState<StatusPayload | null>(statusCache);\n\tuseEffect(() => {\n\t\tstatusListeners.add(setStatus);\n\t\tensureStatusPolling();\n\t\treturn () => {\n\t\t\tstatusListeners.delete(setStatus);\n\t\t\tstopStatusPollingIfIdle();\n\t\t};\n\t}, []);\n\tconst refresh = async (): Promise<void> => {\n\t\tconst st = await getStatus();\n\t\tif (st !== null && !isStatusEqual(statusCache, st)) notifyStatus(st);\n\t};\n\treturn { status, refresh };\n}\n\n\nconst agyModalStore = {\n\topen: false,\n\tlisteners: new Set<() => void>(),\n\tsetOpen(v: boolean) {\n\t\tif (agyModalStore.open === v) return;\n\t\tagyModalStore.open = v;\n\t\t// OVERLAY ISOLATION CONTRACT (2026-10-28 \u2014 \"\u6253\u5F00\u63A7\u5236\u53F0\u540E\u6EDA\u52A8\u95EA\u5C4F\"):\n\t\t// an open console must FREEZE the page behind it, not merely draw on top.\n\t\t// * suspend the plugin's global DOM scanners so nothing is injected into\n\t\t// the conversation while it composites under the overlay;\n\t\t// * toggle `agy-console-modal-open` on <html> so CSS locks the\n\t\t// conversation scroller (scrollbar-gutter:stable keeps the width from\n\t\t// jumping). The class is namespaced because FusionSettings renders this\n\t\t// console inline, so the marker must not collide with another panel.\n\t\t// Without this, wheel/inertia and the modal's 3s polling keep reflowing\n\t\t// and repainting the page behind the fixed overlay -> visible flashing.\n\t\tsetOverlaySuspended(v);\n\t\tif (typeof document !== 'undefined' && document.documentElement) {\n\t\t\tdocument.documentElement.classList.toggle('agy-console-modal-open', v);\n\t\t}\n\t\tagyModalStore.listeners.forEach((fn) => fn());\n\t},\n\tsubscribe(fn: () => void) {\n\t\tagyModalStore.listeners.add(fn);\n\t\treturn () => {\n\t\t\tagyModalStore.listeners.delete(fn);\n\t\t};\n\t},\n};\n\n/**\n * Global modal host manager: ensures exactly one mounted session header\n * hosts the modal dialog portal reactively. The most recently focused or mounted\n * header is prioritized immediately to prevent host handoff flicker when opened.\n * If the primary header unmounts, the next available header is seamlessly notified.\n */\nconst modalHostManager = {\n\tlisteners: new Map<string, (isPrimary: boolean) => void>(),\n\tactiveId: null as string | null,\n\n\tregister(id: string, onChange: (isPrimary: boolean) => void) {\n\t\tmodalHostManager.listeners.set(id, onChange);\n\t\t// The first mounted session header takes priority as the active host.\n\t\t// Never steal activeId if a host is already assigned (prevents unmount/remount\n\t\t// thrashing during multi-header updates or quota sync).\n\t\tif (modalHostManager.activeId === null) {\n\t\t\tmodalHostManager.activeId = id;\n\t\t}\n\t\tonChange(modalHostManager.activeId === id);\n\n\t\treturn () => {\n\t\t\tmodalHostManager.listeners.delete(id);\n\t\t\tif (modalHostManager.activeId === id) {\n\t\t\t\tconst next = modalHostManager.listeners.keys().next().value ?? null;\n\t\t\t\tmodalHostManager.activeId = next;\n\t\t\t\tif (next) {\n\t\t\t\t\ttry { modalHostManager.listeners.get(next)?.(true); } catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t},\n\n\tclaim(id: string) {\n\t\tif (modalHostManager.activeId !== id) {\n\t\t\tconst prev = modalHostManager.activeId;\n\t\t\tmodalHostManager.activeId = id;\n\t\t\tif (prev && prev !== id) {\n\t\t\t\ttry { modalHostManager.listeners.get(prev)?.(false); } catch {}\n\t\t\t}\n\t\t\ttry { modalHostManager.listeners.get(id)?.(true); } catch {}\n\t\t}\n\t},\n};\n\n/**\n * Format reset timestamp into readable date/time + relative countdown.\n */\nfunction formatQuotaWindow(t: (key: AgyLocaleKey) => string, resetTimeStr?: string): {\n\tresetText: string;\n\t/** resetTime exists but is already in the past (window has rolled over). */\n\texpired: boolean;\n} {\n\tif (!resetTimeStr) return { resetText: '', expired: false };\n\ttry {\n\t\tconst d = new Date(resetTimeStr);\n\t\tconst diffMs = d.getTime() - Date.now();\n\t\t// A stale (already passed) resetTime means the window has ROLLED OVER \u2014\n\t\t// the backend keeps reporting the previous boundary once the quota is\n\t\t// back at 100%, and a countdown into the past would be nonsense. Hide\n\t\t// the time but tell the caller so it can say \"\u5DF2\u91CD\u7F6E\" instead of a\n\t\t// mysterious blank (2026-10-16: every full 5h row lost its \u21BB note).\n\t\tif (Number.isNaN(d.getTime()) || diffMs <= 0) return { resetText: '', expired: true };\n\n\t\tconst totalMins = Math.ceil(diffMs / 60000);\n\t\tconst days = Math.floor(totalMins / 1440);\n\t\tconst hours = Math.floor((totalMins % 1440) / 60);\n\t\tconst mins = totalMins % 60;\n\t\tconst isWeekly = days >= 1;\n\n\t\tconst countdown = days > 0\n\t\t\t? `${days}${t('duration.day')} ${hours}${t('duration.hour')}`\n\t\t\t: hours > 0 ? `${hours}${t('duration.hour')} ${mins}${t('duration.minute')}` : `${mins}${t('duration.minute')}`;\n\t\tconst hh = d.getHours().toString().padStart(2, '0');\n\t\tconst mm = d.getMinutes().toString().padStart(2, '0');\n\t\tconst resetText = isWeekly\n\t\t\t? `${d.getMonth() + 1}/${d.getDate()} ${hh}:${mm} (${countdown})`\n\t\t\t: `${hh}:${mm} (${countdown})`;\n\n\t\treturn { resetText, expired: false };\n\t} catch {\n\t\treturn { resetText: '', expired: true };\n\t}\n}\n\ntype BrandKey = keyof typeof BRAND_PATHS;\ntype UiIconKey = keyof typeof UI_PATHS;\n\n/** Inline brand logo (Gemini / Claude / OpenAI) as a crisp SVG mark. */\nfunction brandIcon(key: BrandKey, size = 13): unknown {\n\treturn h('svg', {\n\t\tviewBox: '0 0 24 24',\n\t\twidth: size,\n\t\theight: size,\n\t\t'aria-hidden': true,\n\t\tstyle: { display: 'inline-block', verticalAlign: '-2px', flexShrink: 0 },\n\t}, h('path', { d: BRAND_PATHS[key], fill: BRAND_COLORS[key] }));\n}\n\n/** Clean outline/filled SVG icon (Lucide-style), zero emoji dependency. */\nfunction uiIcon(key: UiIconKey, size = 12, color = 'currentColor'): unknown {\n\tconst p = UI_PATHS[key];\n\tconst isFilled = key === 'star';\n\treturn h('svg', {\n\t\tviewBox: '0 0 24 24',\n\t\twidth: size,\n\t\theight: size,\n\t\t'aria-hidden': true,\n\t\tstyle: { display: 'inline-block', verticalAlign: '-1.5px', flexShrink: 0 },\n\t}, h('path', {\n\t\td: p,\n\t\tfill: isFilled ? color : 'none',\n\t\tstroke: isFilled ? 'none' : color,\n\t\t'stroke-width': isFilled ? undefined : 2,\n\t\t'stroke-linecap': isFilled ? undefined : 'round',\n\t\t'stroke-linejoin': isFilled ? undefined : 'round',\n\t}));\n}\n\nconst FAMILY_BRAND: Record<'google' | 'argon' | 'anthropic' | 'openai', BrandKey> = {\n\tgoogle: 'gemini',\n\t// Gemini 4 Argon is a Google model \u2014 it keeps the Gemini mark.\n\targon: 'gemini',\n\tanthropic: 'claude',\n\topenai: 'openai',\n};\n\n/**\n * Antigravity logo mark: 3D orbit sphere with specular highlight, luminous front/back rings\n * and twin satellite nodes matching the official assets/icon.svg.\n */\nfunction agyIcon(size = 16): unknown {\n\tconst uid = 'agy-logo';\n\treturn h('svg', {\n\t\tviewBox: '0 0 36 36',\n\t\twidth: size,\n\t\theight: size,\n\t\tfill: 'none',\n\t\t'aria-hidden': true,\n\t\tstyle: { display: 'inline-block', verticalAlign: '-2.5px', flexShrink: 0 },\n\t},\n\t\th('defs', null,\n\t\t\th('linearGradient', { id: `${uid}-orb`, x1: '12', y1: '11', x2: '25', y2: '25', gradientUnits: 'userSpaceOnUse' },\n\t\t\t\th('stop', { offset: '0%', 'stop-color': '#38BDF8' }),\n\t\t\t\th('stop', { offset: '45%', 'stop-color': '#6366F1' }),\n\t\t\t\th('stop', { offset: '85%', 'stop-color': '#9333EA' }),\n\t\t\t\th('stop', { offset: '100%', 'stop-color': '#C026D3' }),\n\t\t\t),\n\t\t\th('linearGradient', { id: `${uid}-rf`, x1: '6', y1: '24', x2: '31', y2: '12', gradientUnits: 'userSpaceOnUse' },\n\t\t\t\th('stop', { offset: '0%', 'stop-color': '#00D2FF' }),\n\t\t\t\th('stop', { offset: '40%', 'stop-color': '#38BDF8' }),\n\t\t\t\th('stop', { offset: '70%', 'stop-color': '#818CF8' }),\n\t\t\t\th('stop', { offset: '100%', 'stop-color': '#F43F5E' }),\n\t\t\t),\n\t\t\th('linearGradient', { id: `${uid}-rb`, x1: '7', y1: '12', x2: '29', y2: '24', gradientUnits: 'userSpaceOnUse' },\n\t\t\t\th('stop', { offset: '0%', 'stop-color': '#38BDF8', 'stop-opacity': '0.4' }),\n\t\t\t\th('stop', { offset: '100%', 'stop-color': '#A855F7', 'stop-opacity': '0.4' }),\n\t\t\t),\n\t\t\th('linearGradient', { id: `${uid}-hl`, x1: '14', y1: '12', x2: '19', y2: '18', gradientUnits: 'userSpaceOnUse' },\n\t\t\t\th('stop', { offset: '0%', 'stop-color': '#FFFFFF', 'stop-opacity': '0.65' }),\n\t\t\t\th('stop', { offset: '100%', 'stop-color': '#FFFFFF', 'stop-opacity': '0.05' }),\n\t\t\t),\n\t\t),\n\t\th('path', {\n\t\t\td: 'M 6.8 14.2 C 8.2 9.6 17.8 7.2 26.2 10.8 C 28.0 11.6 29.3 12.6 30.2 13.8',\n\t\t\tstroke: `url(#${uid}-rb)`,\n\t\t\t'stroke-width': '2.4',\n\t\t\t'stroke-linecap': 'round',\n\t\t}),\n\t\th('circle', { cx: 18, cy: 18, r: 7.5, fill: `url(#${uid}-orb)` }),\n\t\th('path', {\n\t\t\td: 'M 13.2 15.2 A 5.5 5.5 0 0 1 21.0 13.0 A 6.2 6.2 0 0 0 14.0 18.0 Z',\n\t\t\tfill: `url(#${uid}-hl)`,\n\t\t}),\n\t\th('path', {\n\t\t\td: 'M 30.2 13.8 C 31.4 18.2 21.8 26.2 12.8 24.2 C 9.4 23.4 7.4 21.8 6.6 19.6',\n\t\t\tstroke: `url(#${uid}-rf)`,\n\t\t\t'stroke-width': '2.6',\n\t\t\t'stroke-linecap': 'round',\n\t\t}),\n\t\th('circle', { cx: 8.2, cy: 18.2, r: 2.2, fill: '#00D2FF' }),\n\t\th('circle', { cx: 8.2, cy: 18.2, r: 1.0, fill: '#FFFFFF' }),\n\t\th('circle', { cx: 28.4, cy: 20.4, r: 1.8, fill: '#F43F5E' }),\n\t\th('circle', { cx: 28.4, cy: 20.4, r: 0.8, fill: '#FFFFFF' }),\n\t);\n}\n\n/**\n * Settings dialog navigation icon replacement for Antigravity.\n * DSH settings shell projects nav glyphs from a closed list and falls back to a generic gear\n * for third-party sections. We dynamically inject a stylesheet matching Antigravity's section\n * row to display the custom Antigravity brand logo.\n\n */\nfunction renderFamilyQuotaBar(\n\tt: (key: AgyLocaleKey) => string,\n\tlabel: string,\n\tfamilyKey: 'google' | 'argon' | 'anthropic' | 'openai',\n\tacc: ManagedAccount,\n\tisRefreshing = false,\n): unknown {\n\tconst info = acc.quotas[familyKey];\n\tconst cd = acc.cooldowns[familyKey];\n\tconst inCooldown = cd && cd.cooldownUntil > Date.now();\n\n\t// 5-Hour limit\n\tconst has5h = typeof info?.remainingFraction === 'number' && Number.isFinite(info.remainingFraction);\n\tconst pct5h = has5h ? Math.max(0, Math.min(100, Math.round(info!.remainingFraction! * 100))) : -1;\n\t// Cooldown is a LOCAL heuristic \u2014 never overwrite the server-reported\n\t// fraction with 0% (a ghost cooldown used to show a 98%-full account as\n\t// empty). Surface it as a note next to the reset time instead.\n\tconst cdNote = inCooldown ? t('account.localCooldown') : '';\n\tconst w5h = formatQuotaWindow(t, info?.resetTime);\n\t// Full-quota rows: the backend keeps the LAST window's resetTime, so\n\t// the row would go silently blank. When the time has expired but the\n\t// fraction is full, say \"\u5DF2\u91CD\u7F6E\" instead \u2014 the quota is usable now.\n\tconst expiredFull5h = w5h.expired && has5h && pct5h >= 100;\n\n\t// Weekly limit\n\tconst hasWeekly = typeof info?.weeklyFraction === 'number' && Number.isFinite(info.weeklyFraction);\n\tconst pctWeekly = hasWeekly ? Math.max(0, Math.min(100, Math.round(info!.weeklyFraction! * 100))) : -1;\n\tconst wWeekly = formatQuotaWindow(t, info?.weeklyResetTime);\n\tconst expiredFullWeekly = wWeekly.expired && hasWeekly && pctWeekly >= 100;\n\n\tconst getColors = (pct: number) => {\n\t\tif (pct < 0) {\n\t\t\treturn {\n\t\t\t\tbar: 'var(--agy-quota-none-border)',\n\t\t\t\ttext: 'var(--agy-quota-none-text)',\n\t\t\t\tbg: 'var(--agy-quota-none-bg)',\n\t\t\t\tborder: 'var(--agy-quota-none-border)',\n\t\t\t};\n\t\t}\n\t\tif (pct <= 20) {\n\t\t\treturn {\n\t\t\t\tbar: 'linear-gradient(90deg, #dc2626, #ef4444)',\n\t\t\t\ttext: 'var(--agy-quota-low-text)',\n\t\t\t\tbg: 'var(--agy-quota-low-bg)',\n\t\t\t\tborder: 'var(--agy-quota-low-border)',\n\t\t\t};\n\t\t}\n\t\tif (pct <= 50) {\n\t\t\treturn {\n\t\t\t\tbar: 'linear-gradient(90deg, #d97706, #f59e0b)',\n\t\t\t\ttext: 'var(--agy-quota-med-text)',\n\t\t\t\tbg: 'var(--agy-quota-med-bg)',\n\t\t\t\tborder: 'var(--agy-quota-med-border)',\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tbar: 'linear-gradient(90deg, #059669, #10b981)',\n\t\t\ttext: 'var(--agy-quota-high-text)',\n\t\t\tbg: 'var(--agy-quota-high-bg)',\n\t\t\tborder: 'var(--agy-quota-high-border)',\n\t\t};\n\t};\n\n\tconst c5h = getColors(pct5h);\n\tconst cWeekly = getColors(pctWeekly);\n\n\tconst renderLine = (windowName: string, percent: number, c: { bar: string; text: string; bg: string; border: string }, resetStr: string, rawFraction?: number, rawReset?: string) => {\n\t\tconst isShimmer = percent < 0 || isRefreshing;\n\t\tconst tooltipText = typeof rawFraction === 'number'\n\t\t\t? `${(rawFraction * 100).toFixed(1)}% (raw: ${rawFraction})${rawReset ? ` \u00B7 reset: ${rawReset}` : ''}`\n\t\t\t: resetStr ? `\u21BB ${resetStr}` : undefined;\n\t\treturn h('div', { style: { display: 'flex', alignItems: 'center', fontSize: '11.5px', margin: '4px 0' } },\n\t\t\th('span', { style: { width: '52px', color: 'var(--agy-text-window-label)', fontSize: '11px', fontWeight: 700, flexShrink: 0 } }, windowName),\n\t\t\th('div', {\n\t\t\t\tclassName: isShimmer ? 'agy-shimmer-track' : '',\n\t\t\t\tstyle: S.progressBarBg,\n\t\t\t},\n\t\t\t\th('div', {\n\t\t\t\t\tclassName: 'agy-progress-fill',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\twidth: `${percent < 0 ? 100 : percent}%`,\n\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\tbackground: c.bar,\n\t\t\t\t\t\tborderRadius: '3px',\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t\t\th('div', { style: { display: 'inline-flex', alignItems: 'center', gap: '8px', minWidth: '140px', justifyContent: 'flex-end', flexShrink: 0 } },\n\t\t\t\th('span', {\n\t\t\t\t\ttitle: tooltipText,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '2px 7px',\n\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\tbackground: c.bg,\n\t\t\t\t\t\tcolor: c.text,\n\t\t\t\t\t\tborder: `1px solid ${c.border}`,\n\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\tfontSize: '11.5px',\n\t\t\t\t\t\tlineHeight: 1.2,\n\t\t\t\t\t\tcursor: tooltipText ? 'help' : 'default',\n\t\t\t\t\t},\n\t\t\t\t}, percent < 0 ? '\u2014' : `${percent}%`),\n\t\t\t\tresetStr ? h('span', { style: { color: 'var(--agy-text-secondary)', fontSize: '11px', fontWeight: 500 } }, `\u21BB ${resetStr}`) : null,\n\t\t\t),\n\t\t);\n\t};\n\n\treturn h('div', { style: { margin: '6px 0', padding: '8px 10px', background: 'var(--agy-bg-subbox)', borderRadius: '7px', border: '1px solid var(--agy-border-box)' } },\n\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '6px', fontWeight: 700, fontSize: '12.5px', marginBottom: '5px', color: 'var(--agy-text-primary)' } },\n\t\t\tbrandIcon(FAMILY_BRAND[familyKey], 14),\n\t\t\th('span', null, label),\n\t\t),\n\t\t// Argon is a WEEKLY-only counter today: render the 5h row only when\n\t\t// the backend actually reports one, never as a permanent \"\u2014\" ghost.\n\t\t(familyKey !== 'argon' || has5h) ? renderLine(t('quota.fiveHour'), pct5h, c5h, w5h.resetText ? w5h.resetText + cdNote : expiredFull5h ? t('quota.windowReset') + cdNote : cdNote.replace(/^ \u00B7 /, ''), info?.remainingFraction, info?.resetTime) : null,\n\t\trenderLine(t('quota.weekly'), pctWeekly, cWeekly, wWeekly.resetText ? wWeekly.resetText : expiredFullWeekly ? t('quota.windowReset') : '', info?.weeklyFraction, info?.weeklyResetTime),\n\t);\n}\n\n/**\n * The console's own stylesheet.\n *\n * Ported keys and rules are unchanged, but every custom property is declared on\n * `.agy-console` instead of `:root`/`body`: the standalone plugin owned the whole\n * document, while here the console is one section of FusionSettings and must not\n * repaint Fusion's pages or DSH's theme. The component renders this text inline,\n * which is the same pattern FusionSettings uses for its own CSS.\n */\nexport const AGY_CONSOLE_CSS = `\n@keyframes agy-spin {\n\t0% { transform: rotate(0deg); }\n\t100% { transform: rotate(360deg); }\n}\n\n.agy-console {\n\t--agy-font-family: var(--dsw-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"PingFang SC\", \"Microsoft YaHei\", sans-serif);\n\t--agy-bg-panel: var(--dsw-alias-bg-layer-2, #ffffff);\n\t--agy-bg-card: var(--dsw-alias-bg-layer-2, #ffffff);\n\t--agy-bg-card-primary: #f0f7ff;\n\t--agy-bg-header: var(--dsw-alias-bg-layer-1, #f8fafc);\n\t--agy-bg-box: var(--dsw-alias-bg-layer-1, #f8fafc);\n\t--agy-bg-subbox: var(--dsw-alias-bg-layer-3, #f1f5f9);\n\t--agy-bg-input: var(--dsw-alias-bg-layer-1, #ffffff);\n\t--agy-bg-btn: var(--dsw-alias-bg-layer-3, #f1f5f9);\n\t--agy-bg-btn-hover: var(--dsw-alias-interactive-bg-hover, #e2e8f0);\n\t--agy-bg-btn-primary: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-bg-progress-track: #e2e8f0;\n\n\t--agy-border-card: var(--dsw-alias-border-l2, #e2e8f0);\n\t--agy-border-card-primary: #3b82f6;\n\t--agy-border-box: var(--dsw-alias-border-l1, #e2e8f0);\n\t--agy-border-subbox: var(--dsw-alias-border-l2, #cbd5e1);\n\t--agy-border-input: var(--dsw-alias-border-l2, #cbd5e1);\n\t--agy-border-input-focus: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-border-btn: var(--dsw-alias-border-l2, #cbd5e1);\n\t--agy-border-btn-primary: #2563eb;\n\t--agy-border-divider: var(--dsw-alias-border-l2, #e2e8f0);\n\n\t--agy-text-primary: var(--dsw-alias-label-primary, #0f172a);\n\t--agy-text-secondary: var(--dsw-alias-label-secondary, #334155);\n\t--agy-text-tertiary: var(--dsw-alias-label-tertiary, #64748b);\n\t--agy-text-muted: var(--dsw-alias-label-caption, #94a3b8);\n\t--agy-text-btn: var(--dsw-alias-label-primary, #0f172a);\n\t--agy-text-btn-primary: #ffffff;\n\t--agy-text-window-label: #2563eb;\n\n\t--agy-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.05);\n\t--agy-shadow-card-hover: 0 4px 12px rgba(0, 0, 0, 0.08);\n\t--agy-shadow-card-primary: 0 0 0 1px #3b82f6, 0 4px 14px rgba(37, 99, 235, 0.12);\n\t--agy-shadow-modal: 0 20px 50px rgba(0, 0, 0, 0.18);\n\t--agy-modal-backdrop: rgba(15, 23, 42, 0.5);\n\n\t/* Badges */\n\t--agy-badge-primary-bg: #dbeafe;\n\t--agy-badge-primary-text: #1e40af;\n\t--agy-badge-primary-border: #60a5fa;\n\n\t--agy-badge-tag-bg: #f1f5f9;\n\t--agy-badge-tag-text: #334155;\n\t--agy-badge-tag-border: #cbd5e1;\n\n\t--agy-badge-email-bg: #eff6ff;\n\t--agy-badge-email-text: #1d4ed8;\n\t--agy-badge-email-border: #bfdbfe;\n\n\t--agy-badge-proxy-bg: #ecfdf5;\n\t--agy-badge-proxy-text: #047857;\n\t--agy-badge-proxy-border: #a7f3d0;\n\n\t--agy-badge-ready-bg: #ecfdf5;\n\t--agy-badge-ready-text: #047857;\n\t--agy-badge-ready-border: #a7f3d0;\n\n\t--agy-badge-unready-bg: #eff6ff;\n\t--agy-badge-unready-text: #1d4ed8;\n\t--agy-badge-unready-border: #bfdbfe;\n\n\t/* Quota status pills */\n\t--agy-quota-high-bg: #ecfdf5;\n\t--agy-quota-high-text: #047857;\n\t--agy-quota-high-border: #a7f3d0;\n\t--agy-quota-med-bg: #fffbeb;\n\t--agy-quota-med-text: #b45309;\n\t--agy-quota-med-border: #fde68a;\n\t--agy-quota-low-bg: #fef2f2;\n\t--agy-quota-low-text: #b91c1c;\n\t--agy-quota-low-border: #fecaca;\n\t--agy-quota-none-bg: #f1f5f9;\n\t--agy-quota-none-text: #64748b;\n\t--agy-quota-none-border: #cbd5e1;\n\n\t/* Danger button */\n\t--agy-danger-bg: #fef2f2;\n\t--agy-danger-text: #b91c1c;\n\t--agy-danger-border: #fecaca;\n\t--agy-danger-hover-bg: #fee2e2;\n\n\t/* Warning banner */\n\t--agy-warn-bg: #fffbeb;\n\t--agy-warn-text: #92400e;\n\t--agy-warn-border: #fcd34d;\n\t--agy-warn-btn-bg: #fef3c7;\n\t--agy-warn-btn-text: #92400e;\n\t--agy-warn-btn-border: #f59e0b;\n\n\t/* Toast notices */\n\t--agy-toast-success-bg: #ecfdf5;\n\t--agy-toast-success-text: #065f46;\n\t--agy-toast-success-border: #6ee7b7;\n\t--agy-toast-info-bg: #eff6ff;\n\t--agy-toast-info-text: #1e40af;\n\t--agy-toast-info-border: #93c5fd;\n\t--agy-toast-warn-bg: #fffbeb;\n\t--agy-toast-warn-text: #92400e;\n\t--agy-toast-warn-border: #fcd34d;\n\t--agy-toast-error-bg: #fef2f2;\n\t--agy-toast-error-text: #991b1b;\n\t--agy-toast-error-border: #fca5a5;\n\n\t/* Auth Modal / Box */\n\t--agy-auth-box-bg: #f0f7ff;\n\t--agy-auth-box-border: #3b82f6;\n\n\t/* Segment control */\n\t--agy-seg-group-bg: #e2e8f0;\n\t--agy-seg-group-border: #cbd5e1;\n\t--agy-seg-btn-text: #475569;\n\t--agy-seg-btn-active-bg: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-seg-btn-active-text: #ffffff;\n\t--agy-seg-danger-bg: #dc2626;\n\t--agy-seg-danger-text: #ffffff;\n\t--agy-seg-danger-border: #b91c1c;\n}\n\n:where(body[data-ds-dark-theme], body.dark, [data-theme=\"dark\"]) .agy-console {\n\t--agy-bg-panel: var(--dsw-alias-bg-layer-2, #0f172a);\n\t--agy-bg-card: var(--dsw-alias-bg-layer-2, #1e293b);\n\t--agy-bg-card-primary: #111d33;\n\t--agy-bg-header: var(--dsw-alias-bg-layer-1, #1e293b);\n\t--agy-bg-box: var(--dsw-alias-bg-layer-1, #0f172a);\n\t--agy-bg-subbox: var(--dsw-alias-bg-layer-3, #090d16);\n\t--agy-bg-input: var(--dsw-alias-bg-layer-3, #090d16);\n\t--agy-bg-btn: var(--dsw-alias-bg-layer-3, #334155);\n\t--agy-bg-btn-hover: var(--dsw-alias-interactive-bg-hover, #475569);\n\t--agy-bg-btn-primary: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-bg-progress-track: #1e293b;\n\n\t--agy-border-card: var(--dsw-alias-border-l2, #334155);\n\t--agy-border-card-primary: #3b82f6;\n\t--agy-border-box: var(--dsw-alias-border-l1, #1e293b);\n\t--agy-border-subbox: var(--dsw-alias-border-l2, #334155);\n\t--agy-border-input: var(--dsw-alias-border-l2, #334155);\n\t--agy-border-input-focus: #3b82f6;\n\t--agy-border-btn: var(--dsw-alias-border-l2, #475569);\n\t--agy-border-btn-primary: #3b82f6;\n\t--agy-border-divider: var(--dsw-alias-border-l2, #334155);\n\n\t--agy-text-primary: var(--dsw-alias-label-primary, #f8fafc);\n\t--agy-text-secondary: var(--dsw-alias-label-secondary, #cbd5e1);\n\t--agy-text-tertiary: var(--dsw-alias-label-tertiary, #94a3b8);\n\t--agy-text-muted: var(--dsw-alias-label-caption, #64748b);\n\t--agy-text-btn: var(--dsw-alias-label-primary, #ffffff);\n\t--agy-text-btn-primary: #ffffff;\n\t--agy-text-window-label: #93c5fd;\n\n\t--agy-shadow-card: 0 2px 8px rgba(0, 0, 0, 0.3);\n\t--agy-shadow-card-hover: 0 6px 16px rgba(0, 0, 0, 0.4);\n\t--agy-shadow-card-primary: 0 0 16px rgba(59, 130, 246, 0.25);\n\t--agy-shadow-modal: 0 25px 60px rgba(0, 0, 0, 0.8);\n\t--agy-modal-backdrop: rgba(0, 0, 0, 0.75);\n\n\t/* Badges */\n\t--agy-badge-primary-bg: #1e3a8a;\n\t--agy-badge-primary-text: #93c5fd;\n\t--agy-badge-primary-border: #3b82f6;\n\n\t--agy-badge-tag-bg: #0f172a;\n\t--agy-badge-tag-text: #cbd5e1;\n\t--agy-badge-tag-border: #334155;\n\n\t--agy-badge-email-bg: #1e293b;\n\t--agy-badge-email-text: #93c5fd;\n\t--agy-badge-email-border: #3b82f6;\n\n\t--agy-badge-proxy-bg: #064e3b;\n\t--agy-badge-proxy-text: #6ee7b7;\n\t--agy-badge-proxy-border: #059669;\n\n\t--agy-badge-ready-bg: rgba(16, 185, 129, 0.15);\n\t--agy-badge-ready-text: #34d399;\n\t--agy-badge-ready-border: rgba(16, 185, 129, 0.35);\n\n\t--agy-badge-unready-bg: rgba(59, 130, 246, 0.15);\n\t--agy-badge-unready-text: #93c5fd;\n\t--agy-badge-unready-border: rgba(59, 130, 246, 0.35);\n\n\t/* Quota status pills */\n\t--agy-quota-high-bg: #064e3b;\n\t--agy-quota-high-text: #6ee7b7;\n\t--agy-quota-high-border: #059669;\n\t--agy-quota-med-bg: #451a03;\n\t--agy-quota-med-text: #fde68a;\n\t--agy-quota-med-border: #d97706;\n\t--agy-quota-low-bg: #450a0a;\n\t--agy-quota-low-text: #fca5a5;\n\t--agy-quota-low-border: #dc2626;\n\t--agy-quota-none-bg: #1e293b;\n\t--agy-quota-none-text: #94a3b8;\n\t--agy-quota-none-border: #475569;\n\n\t/* Danger button */\n\t--agy-danger-bg: #450a0a;\n\t--agy-danger-text: #fca5a5;\n\t--agy-danger-border: #ef4444;\n\t--agy-danger-hover-bg: #5f1313;\n\n\t/* Warning banner */\n\t--agy-warn-bg: #451a03;\n\t--agy-warn-text: #fde68a;\n\t--agy-warn-border: #d97706;\n\t--agy-warn-btn-bg: #78350f;\n\t--agy-warn-btn-text: #fde68a;\n\t--agy-warn-btn-border: #d97706;\n\n\t/* Toast notices */\n\t--agy-toast-success-bg: #064e3b;\n\t--agy-toast-success-text: #6ee7b7;\n\t--agy-toast-success-border: #059669;\n\t--agy-toast-info-bg: #1e3a8a;\n\t--agy-toast-info-text: #93c5fd;\n\t--agy-toast-info-border: #3b82f6;\n\t--agy-toast-warn-bg: #451a03;\n\t--agy-toast-warn-text: #fde68a;\n\t--agy-toast-warn-border: #d97706;\n\t--agy-toast-error-bg: #450a0a;\n\t--agy-toast-error-text: #fca5a5;\n\t--agy-toast-error-border: #dc2626;\n\n\t/* Auth Modal / Box */\n\t--agy-auth-box-bg: #0f223a;\n\t--agy-auth-box-border: #3b82f6;\n\n\t/* Segment control */\n\t--agy-seg-group-bg: #090d16;\n\t--agy-seg-group-border: #334155;\n\t--agy-seg-btn-text: #94a3b8;\n\t--agy-seg-btn-active-bg: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-seg-btn-active-text: #ffffff;\n\t--agy-seg-danger-bg: #7f1d1d;\n\t--agy-seg-danger-text: #fca5a5;\n\t--agy-seg-danger-border: #ef4444;\n}\n\n.agy-spinner {\n\tdisplay: inline-block;\n\twidth: 12px;\n\theight: 12px;\n\tborder: 2px solid currentColor;\n\tborder-top-color: transparent;\n\tborder-radius: 50%;\n\tanimation: agy-spin 0.75s linear infinite;\n\tvertical-align: -2px;\n\tmargin-right: 5px;\n}\n.agy-pulse-dot {\n\tdisplay: inline-block;\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n}\n.agy-card-hover {\n\ttransition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.18s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s ease;\n}\n.agy-card-hover:hover {\n\tborder-color: var(--agy-border-card-primary, #3b82f6) !important;\n\tbox-shadow: var(--agy-shadow-card-hover) !important;\n}\n\n.agy-btn {\n\ttransition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, filter 0.15s ease, transform 0.15s ease;\n\tuser-select: none;\n}\n.agy-btn:hover:not(:disabled) {\n\tfilter: brightness(1.08);\n\ttransform: translateY(-0.5px);\n}\n.agy-btn:active:not(:disabled) {\n\ttransform: translateY(0.5px);\n}\n.agy-progress-fill {\n\ttransition: width 0.4s cubic-bezier(0.16, 1, 0.3, 1);\n}\n@keyframes agy-shimmer {\n\t0% { transform: translateX(-100%); }\n\t100% { transform: translateX(100%); }\n}\n.agy-shimmer-track {\n\tposition: relative;\n\toverflow: hidden;\n\tcontain: paint;\n\ttransform: translateZ(0);\n\tisolation: isolate;\n}\n.agy-shimmer-track::after {\n\tcontent: '';\n\tposition: absolute;\n\ttop: 0; left: 0; right: 0; bottom: 0;\n\tbackground: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.22) 50%, transparent 100%);\n\ttransform: translateX(-100%) translateZ(0);\n\twill-change: transform;\n\tanimation: agy-shimmer 1.8s infinite ease-in-out;\n\tpointer-events: none;\n}\n.agy-modal-backdrop {\n\tposition: fixed;\n\tinset: 0;\n\tz-index: 9999;\n\tbackground: var(--agy-modal-backdrop);\n\t/* NO full-screen backdrop blur here. Filtering the whole viewport forces\n\t Chromium/Electron to re-sample the page every frame while anything behind\n\t it moves (scroll, streaming, animations) \u2014 the recurring \"\u6253\u5F00\u63A7\u5236\u53F0\u540E\u6EDA\u52A8\n\t \u95EA\u5C4F\" root cause. The rgba dim below is stable and flicker-free. */\n\toverscroll-behavior: contain;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 16px;\n\tbox-sizing: border-box;\n}\n/* While the console is open, freeze the conversation scroller behind it so\n nothing moves/reflows under the fixed overlay. scrollbar-gutter:stable on the\n host scroller keeps the width from jumping when overflow flips to hidden. */\nhtml.agy-console-modal-open [data-conversation-scroll] {\n\toverflow: hidden !important;\n\toverscroll-behavior: contain;\n}\n.agy-modal-panel {\n\tposition: relative;\n\twidth: 100%;\n\tmax-width: 640px;\n\tmax-height: min(820px, calc(100vh - 48px));\n\tbackground: var(--agy-bg-panel);\n\tborder: 1px solid var(--agy-border-card);\n\tborder-radius: 14px;\n\tbox-shadow: var(--agy-shadow-modal);\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n\tcolor: var(--agy-text-primary);\n\tfont-family: var(--agy-font-family);\n\ttransform: translateZ(0);\n\tcontain: content;\n}\n.agy-submodel-row {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 7px 10px;\n\tfont-size: 11.5px;\n\tborder-radius: 6px;\n\tbackground: var(--agy-bg-subbox);\n\tborder: 1px solid var(--agy-border-box);\n\tmargin: 4px 0;\n\tcolor: var(--agy-text-primary);\n}\n`;\n\nconst S: Record<string, Record<string, unknown>> = {\n\tcontainer: {\n\t\tlineHeight: 1.5,\n\t\tfontSize: '13px',\n\t\tfontFamily: 'var(--agy-font-family)',\n\t\tcolor: 'var(--agy-text-primary)',\n\t},\n\theaderCard: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'space-between',\n\t\tpadding: '12px 16px',\n\t\tbackground: 'var(--agy-bg-header)',\n\t\tborder: '1px solid var(--agy-border-card)',\n\t\tborderRadius: '10px',\n\t\tmarginBottom: '12px',\n\t\tcolor: 'var(--agy-text-primary)',\n\t\tboxShadow: 'var(--agy-shadow-card)',\n\t},\n\tbadgePrimary: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: '4px',\n\t\tbackground: 'var(--agy-badge-primary-bg)',\n\t\tcolor: 'var(--agy-badge-primary-text)',\n\t\tborder: '1px solid var(--agy-badge-primary-border)',\n\t\tpadding: '2px 8px',\n\t\tborderRadius: '5px',\n\t\tfontSize: '11px',\n\t\tfontWeight: 700,\n\t},\n\tbadgeTag: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: '4px',\n\t\tbackground: 'var(--agy-badge-tag-bg)',\n\t\tcolor: 'var(--agy-badge-tag-text)',\n\t\tborder: '1px solid var(--agy-badge-tag-border)',\n\t\tpadding: '2px 7px',\n\t\tborderRadius: '5px',\n\t\tfontSize: '11px',\n\t\tfontWeight: 600,\n\t},\n\tbadgeReady: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: '4px',\n\t\tbackground: 'var(--agy-badge-ready-bg)',\n\t\tcolor: 'var(--agy-badge-ready-text)',\n\t\tborder: '1px solid var(--agy-badge-ready-border)',\n\t\tpadding: '2px 8px',\n\t\tborderRadius: '5px',\n\t\tfontSize: '11px',\n\t\tfontWeight: 700,\n\t},\n\tbadgeUnready: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: '4px',\n\t\tbackground: 'var(--agy-badge-unready-bg)',\n\t\tcolor: 'var(--agy-badge-unready-text)',\n\t\tborder: '1px solid var(--agy-badge-unready-border)',\n\t\tpadding: '2px 8px',\n\t\tborderRadius: '5px',\n\t\tfontSize: '11px',\n\t\tfontWeight: 700,\n\t},\n\tcard: {\n\t\tbackground: 'var(--agy-bg-card)',\n\t\tborder: '1px solid var(--agy-border-card)',\n\t\tborderRadius: '8px',\n\t\tpadding: '10px 14px',\n\t\tmarginBottom: '8px',\n\t\tcolor: 'var(--agy-text-primary)',\n\t\tboxShadow: 'var(--agy-shadow-card)',\n\t\ttransition: 'border-color 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease',\n\t},\n\tcardPrimary: {\n\t\tbackground: 'var(--agy-bg-card)',\n\t\tborder: '1px solid var(--agy-border-card)',\n\t\tborderRadius: '8px',\n\t\tpadding: '10px 14px',\n\t\tmarginBottom: '8px',\n\t\tcolor: 'var(--agy-text-primary)',\n\t\tboxShadow: 'var(--agy-shadow-card)',\n\t\ttransition: 'border-color 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease',\n\t},\n\tquotaBox: {\n\t\tbackground: 'var(--agy-bg-box)',\n\t\tborder: '1px solid var(--agy-border-box)',\n\t\tborderRadius: '8px',\n\t\tpadding: '8px 10px',\n\t\tmarginTop: '8px',\n\t},\n\tprogressBarBg: {\n\t\tflex: '1',\n\t\theight: '8px',\n\t\tborderRadius: '4px',\n\t\tbackground: 'var(--agy-bg-progress-track)',\n\t\tborder: '1px solid var(--agy-border-box)',\n\t\toverflow: 'hidden',\n\t\tmargin: '0 10px',\n\t},\n\tbtn: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '5px 12px',\n\t\tborderRadius: '6px',\n\t\tborder: '1px solid var(--agy-border-btn)',\n\t\tbackground: 'var(--agy-bg-btn)',\n\t\tcolor: 'var(--agy-text-btn)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '12px',\n\t\tfontWeight: 600,\n\t},\n\tbtnPrimary: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '5px 13px',\n\t\tborderRadius: '6px',\n\t\tborder: '1px solid var(--agy-border-btn-primary)',\n\t\tbackground: 'var(--agy-bg-btn-primary)',\n\t\tcolor: 'var(--agy-text-btn-primary)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '12px',\n\t\tfontWeight: 700,\n\t\tboxShadow: '0 2px 6px rgba(37, 99, 235, 0.35)',\n\t},\n\tbtnDanger: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '4px 9px',\n\t\tborderRadius: '6px',\n\t\tborder: '1px solid var(--agy-danger-border)',\n\t\tbackground: 'var(--agy-danger-bg)',\n\t\tcolor: 'var(--agy-danger-text)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11px',\n\t\tfontWeight: 600,\n\t},\n\tbtnSm: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '4px 9px',\n\t\tborderRadius: '5px',\n\t\tborder: '1px solid var(--agy-border-btn)',\n\t\tbackground: 'var(--agy-bg-btn)',\n\t\tcolor: 'var(--agy-text-btn)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11.5px',\n\t\tfontWeight: 600,\n\t},\n\tbtnSmPrimary: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '4px 9px',\n\t\tborderRadius: '5px',\n\t\tborder: '1px solid var(--agy-border-btn-primary)',\n\t\tbackground: 'var(--agy-bg-btn-primary)',\n\t\tcolor: 'var(--agy-text-btn-primary)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11.5px',\n\t\tfontWeight: 700,\n\t},\n\tsegGroup: {\n\t\tdisplay: 'inline-flex',\n\t\tbackground: 'var(--agy-seg-group-bg)',\n\t\tborderRadius: '7px',\n\t\tpadding: '3px',\n\t\tborder: '1px solid var(--agy-seg-group-border)',\n\t},\n\tsegBtn: {\n\t\tpadding: '4px 10px',\n\t\tborderRadius: '4px',\n\t\tborder: 'none',\n\t\tbackground: 'transparent',\n\t\tcolor: 'var(--agy-seg-btn-text)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11.5px',\n\t\tfontWeight: 600,\n\t},\n\tsegBtnActive: {\n\t\tpadding: '4px 10px',\n\t\tborderRadius: '4px',\n\t\tborder: 'none',\n\t\tbackground: 'var(--agy-seg-btn-active-bg)',\n\t\tcolor: 'var(--agy-seg-btn-active-text)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11.5px',\n\t\tfontWeight: 700,\n\t\tboxShadow: '0 2px 4px rgba(37, 99, 235, 0.4)',\n\t},\n\tinput: {\n\t\tflex: '1',\n\t\tpadding: '7px 12px',\n\t\tborderRadius: '6px',\n\t\tborder: '1.5px solid var(--agy-border-input)',\n\t\tbackground: 'var(--agy-bg-input)',\n\t\tcolor: 'var(--agy-text-primary)',\n\t\tfontSize: '12.5px',\n\t\toutline: 'none',\n\t},\n\tmuted: { color: 'var(--agy-text-tertiary)', fontSize: '11.5px' },\n\tnoticeBanner: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'space-between',\n\t\tpadding: '10px 14px',\n\t\tborderRadius: '8px',\n\t\tmarginBottom: '12px',\n\t\tfontSize: '12.5px',\n\t\tfontWeight: 500,\n\t},\n\tauthModal: {\n\t\tbackground: 'var(--agy-auth-box-bg)',\n\t\tborder: '1.5px solid var(--agy-auth-box-border)',\n\t\tborderRadius: '10px',\n\t\tpadding: '14px 16px',\n\t\tmarginBottom: '14px',\n\t\tcolor: 'var(--agy-text-primary)',\n\t},\n};\n\n/**\n * Register the `agy-worker` dictionaries and the two languages DSH does not ship.\n * Idempotent: an existing dictionary is kept (equivalent content), and a\n * language the Host already owns is never added twice.\n */\nexport function registerAgyLocale(locale: AgyLocaleSource): () => void {\n\tconst addLanguageIfMissing = (language: { id: string; label: string; fallback: string }): (() => void) => {\n\t\ttry {\n\t\t\tconst wanted = language.id.toLowerCase();\n\t\t\tconst snapshot = locale.getSnapshot?.();\n\t\t\tconst existing = snapshot?.locales?.some((entry) => entry.id.toLowerCase() === wanted) ?? false;\n\t\t\tif (existing) return () => {};\n\t\t\treturn locale.addLanguage(language);\n\t\t} catch {\n\t\t\treturn () => {};\n\t\t}\n\t};\n\tconst registerDictionary = (language: string, dictionary: Record<string, string>): (() => void) => {\n\t\ttry {\n\t\t\treturn locale.register(NS, language, dictionary);\n\t\t} catch {\n\t\t\treturn () => {};\n\t\t}\n\t};\n\tconst disposePtBR = addLanguageIfMissing({ id: 'pt-BR', label: 'Portugu\u00EAs (Brasil)', fallback: 'en' });\n\tconst disposeEs = addLanguageIfMissing({ id: 'es', label: 'Espa\u00F1ol', fallback: 'en' });\n\tconst disposeZh = registerDictionary('zh', zh);\n\tconst disposeEn = registerDictionary('en', en);\n\tconst disposePtBRDictionary = registerDictionary('pt-BR', ptBR);\n\tconst disposeEsDictionary = registerDictionary('es', es);\n\treturn () => { disposeEsDictionary(); disposePtBRDictionary(); disposeEn(); disposeZh(); disposeEs(); disposePtBR(); };\n}\n\n/**\n * The Antigravity console. FusionSettings renders it inline (`isModal: false`);\n * the modal presentation is kept for reuse, e.g. a future dialog opener.\n */\nexport function AgyConsole(props?: { isModal?: boolean }): ReactNode {\n\t\tconst t = useAgyTranslation();\n\t\tconst { status, refresh } = useAgyStatus();\n\t\tconst [aliasInput, setAliasInput] = useState('');\n\t\tconst [proxyInputs, setProxyInputs] = useState<Record<string, string>>({});\n\t\tconst [editingProxyId, setEditingProxyId] = useState<string | null>(null);\n\t\tconst [addingAccount, setAddingAccount] = useState(false);\n\t\tconst [authCodeInput, setAuthCodeInput] = useState('');\n\t\tconst [loadingAction, setLoadingAction] = useState<string | null>(null);\n\t\tconst [toast, setToast] = useState<ToastNotice | null>(null);\n\t\tconst [expandedModels, setExpandedModels] = useState<Record<string, boolean>>({});\n\t\tconst [addProxyInput, setAddProxyInput] = useState('');\n\t\tconst [optimisticActiveId, setOptimisticActiveId] = useState<string | null>(null);\n\n\n\t\t// Cooldown expiry and quota countdowns are Date.now()-derived while the\n\t\t// payload itself does NOT change when they lapse \u2014 without a wall-clock\n\t\t// tick the \"cooldown\" banner and the minutes-left froze forever.\n\t\tconst [, setTimeTick] = useState(0);\n\t\tuseEffect(() => {\n\t\t\tconst timer = setInterval(() => setTimeTick((n) => n + 1), 30_000);\n\t\t\treturn () => clearInterval(timer);\n\t\t}, []);\n\n\t\tconst flowStartedRef = useRef(false);\n\t\tconst safeMessage = (code?: string): string => {\n\t\t\tconst key = `auth.code.${code ?? ''}` as AgyLocaleKey;\n\t\t\treturn code && key in en ? t(key) : t('api.genericError');\n\t\t};\n\t\tuseEffect(() => {\n\t\t\tif (!addingAccount || !flowStartedRef.current) return;\n\t\t\tconst pa = status?.poolAuth;\n\t\t\tif (!pa) return;\n\t\t\tif (pa.phase === 'done') {\n\t\t\t\tflowStartedRef.current = false;\n\t\t\t\tsetAddingAccount(false);\n\t\t\t\tsetAuthCodeInput('');\n\t\t\t\tsetAliasInput('');\n\t\t\t\tsetAddProxyInput('');\n\t\t\t\tshowToast(safeMessage(pa.code), 'success');\n\t\t\t} else if (pa.phase === 'failed') {\n\t\t\t\tflowStartedRef.current = false;\n\t\t\t\tshowToast(safeMessage(pa.code), 'error');\n\t\t\t}\n\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, [addingAccount, status?.poolAuth?.phase, status?.poolAuth?.code]);\n\n\t\tconst toastTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\tuseEffect(() => () => {\n\t\t\t// Unmount must not leave a pending timer writing state into a dead\n\t\t\t// component; a second same-text toast also used to be cleared early\n\t\t\t// by the FIRST toast's leftover timer.\n\t\t\tif (toastTimerRef.current !== null) clearTimeout(toastTimerRef.current);\n\t\t}, []);\n\t\tconst showToast = (text: string, type: ToastNotice['type'] = 'info') => {\n\t\t\tsetToast({ text, type, id: Date.now() });\n\t\t\tif (toastTimerRef.current !== null) clearTimeout(toastTimerRef.current);\n\t\t\ttoastTimerRef.current = setTimeout(() => {\n\t\t\t\ttoastTimerRef.current = null;\n\t\t\t\tsetToast((prev) => (prev !== null && prev.text === text ? null : prev));\n\t\t\t}, 6000);\n\t\t};\n\n\t\tconst actionFailed = (): void => {\n\t\t\tshowToast(t('api.genericError'), 'error');\n\t\t};\n\n\t\tconst handleBeginAddAccount = async (): Promise<void> => {\n\t\t\tsetLoadingAction('pool:beginAdd');\n\t\t\tconst alias = aliasInput.trim();\n\t\t\tconst proxyUrl = addProxyInput.trim();\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/begin-add', {\n\t\t\t\t...(alias ? { alias } : {}),\n\t\t\t\t...(proxyUrl ? { proxyUrl } : {}),\n\t\t\t});\n\t\t\tsetLoadingAction(null);\n\t\t\tif (res && res.ok) {\n\t\t\t\tflowStartedRef.current = true;\n\t\t\t\tawait refresh();\n\t\t\t\tif (res.browserOpened) {\n\t\t\t\t\tshowToast(t('auth.browserOpened'), 'info');\n\t\t\t\t} else {\n\t\t\t\t\tshowToast(t('auth.browserManual'), 'warn');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tshowToast(res?.code ? safeMessage(res.code) : t('auth.startFailed'), 'error');\n\t\t\t}\n\t\t};\n\n\t\tconst handleCompleteAddAccount = async (): Promise<void> => {\n\t\t\tif (!authCodeInput.trim()) return;\n\t\t\tsetLoadingAction('pool:completeAdd');\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/complete-add', { code: authCodeInput.trim() });\n\t\t\tsetLoadingAction(null);\n\t\t\tif (res && res.ok) {\n\t\t\t\tflowStartedRef.current = false;\n\t\t\t\tsetAuthCodeInput('');\n\t\t\t\tsetAliasInput('');\n\t\t\t\tsetAddProxyInput('');\n\t\t\t\tsetAddingAccount(false);\n\t\t\t\tawait refresh();\n\t\t\t\tshowToast(safeMessage(res.code), 'success');\n\t\t\t} else {\n\t\t\t\tshowToast(safeMessage(res?.code), 'error');\n\t\t\t}\n\t\t};\n\n\t\tconst handleCancelAddAccount = async (): Promise<void> => {\n\t\t\tflowStartedRef.current = false;\n\t\t\tawait postJson('/plugins/agy-worker/pool/cancel-add', {});\n\t\t\tsetAuthCodeInput('');\n\t\t\tsetAliasInput('');\n\t\t\tsetAddProxyInput('');\n\t\t\tsetAddingAccount(false);\n\t\t\tawait refresh();\n\t\t};\n\n\t\tconst reorderAccounts = async (newIds: string[]): Promise<void> => {\n\t\t\tsetLoadingAction('pool:reorder');\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/reorder', { ids: newIds });\n\t\t\tsetLoadingAction(null);\n\t\t\tif (res && res.ok) {\n\t\t\t\tawait refresh();\n\t\t\t\tshowToast(t('account.reordered'), 'success');\n\t\t\t} else {\n\t\t\t\tactionFailed();\n\t\t\t}\n\t\t};\n\n\t\tconst moveAccount = async (accId: string, delta: number): Promise<void> => {\n\t\t\tconst ids = (status?.pool?.accounts ?? []).map((a) => a.id);\n\t\t\tconst idx = ids.indexOf(accId);\n\t\t\tif (idx === -1) return;\n\t\t\tconst newIdx = idx + delta;\n\t\t\tif (newIdx < 0 || newIdx >= ids.length) return;\n\t\t\tconst [moved] = ids.splice(idx, 1);\n\t\t\tif (moved) ids.splice(newIdx, 0, moved);\n\t\t\tawait reorderAccounts(ids);\n\t\t};\n\n\t\tconst setCfg = async (key: string, value: unknown): Promise<void> => {\n\t\t\tsetLoadingAction(`config:${key}`);\n\t\t\tconst res = await postJson('/plugins/agy-worker/config', { key, value });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t};\n\n\t\tconst hiddenPendingRef = useRef<Set<string> | null>(null);\n\t\tconst toggleModelHidden = async (id: string, hide: boolean): Promise<void> => {\n\t\t\t// Merge against the PENDING set, not the last-rendered snapshot:\n\t\t\t// two rapid clicks used to read the same stale status and the\n\t\t\t// second silently overwrote the first (lost update).\n\t\t\tconst next = new Set(hiddenPendingRef.current ?? status?.hiddenModels ?? []);\n\t\t\tif (hide) next.add(id); else next.delete(id);\n\t\t\thiddenPendingRef.current = next;\n\t\t\ttry {\n\t\t\t\tawait setCfg('hiddenModels', Array.from(next));\n\t\t\t} finally {\n\t\t\t\tif (hiddenPendingRef.current === next) hiddenPendingRef.current = null;\n\t\t\t}\n\t\t};\n\n\t\tconst setActiveAccount = async (id: string): Promise<void> => {\n\t\t\tsetOptimisticActiveId(id);\n\t\t\tsetLoadingAction(`active:${id}`);\n\t\t\ttry {\n\t\t\t\tconst res = await postJson('/plugins/agy-worker/pool/set-active', { id });\n\t\t\t\tif (res && res.ok) {\n\t\t\t\t\tawait refresh();\n\t\t\t\t\tshowToast(t('account.activeSet'), 'success');\n\t\t\t\t} else {\n\t\t\t\t\tsetOptimisticActiveId(null);\n\t\t\t\t\tshowToast(res?.error || t('account.activeSetFailed'), 'error');\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetOptimisticActiveId(null);\n\t\t\t\tshowToast(t('account.activeSetFailed'), 'error');\n\t\t\t} finally {\n\t\t\t\tsetOptimisticActiveId(null);\n\t\t\t\tsetLoadingAction(null);\n\t\t\t}\n\t\t};\n\n\t\tconst removeAccount = async (id: string, alias: string): Promise<void> => {\n\t\t\tsetLoadingAction(`remove:${id}`);\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/remove', { id });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t\tshowToast(t('account.removed', { alias }), 'info');\n\t\t};\n\n\t\tconst toggleAccountEnabled = async (acc: ManagedAccount): Promise<void> => {\n\t\t\tconst nextState = !acc.enabled;\n\t\t\tsetLoadingAction(`enable:${acc.id}`);\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/enable', { id: acc.id, enabled: nextState });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t\tconst legacyDefault = acc.defaultAlias === undefined && acc.systemHome && acc.alias === '\u4E3B\u8D26\u53F7 (\u7CFB\u7EDF\u767B\u5F55)';\n\t\t\tconst displayAlias = acc.defaultAlias || legacyDefault\n\t\t\t\t? acc.systemHome ? t('account.defaultAlias') : acc.alias\n\t\t\t\t: acc.alias;\n\t\t\tshowToast(t(nextState ? 'account.enabledToast' : 'account.disabledToast', { alias: displayAlias }), 'success');\n\t\t};\n\n\t\tconst refreshQuota = async (id?: string): Promise<void> => {\n\t\t\tsetLoadingAction(id ? `refresh:${id}` : 'refresh:all');\n\t\t\ttry {\n\t\t\t\tconst res = await postJson('/plugins/agy-worker/pool/refresh-quota', { id });\n\t\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\t\tactionFailed();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait refresh();\n\t\t\t\tshowToast(t('quota.refreshed'), 'success');\n\t\t\t} finally {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t}\n\t\t};\n\n\t\tconst warmupAccount = async (id?: string): Promise<void> => {\n\t\t\tsetLoadingAction(id ? `warmup:${id}` : 'warmup:all');\n\t\t\ttry {\n\t\t\t\tconst res = await postJson('/plugins/agy-worker/pool/warmup', {\n\t\t\t\t\tid,\n\t\t\t\t\tforce: true,\n\t\t\t\t\t...(id ? {} : { all: true }),\n\t\t\t\t});\n\t\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\t\tactionFailed();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait refresh();\n\t\t\t\tconst results: any[] = Array.isArray(res.results) ? res.results : [];\n\t\t\t\tconst skippedCount = results.filter((r) => r.skipped).length;\n\t\t\t\t// `success: true, skipped: true` means \"nothing was due\"; it must\n\t\t\t\t// not count as a successful probe (all-failed used to toast success).\n\t\t\t\tconst successCount = results.filter((r) => r.success && !r.skipped).length;\n\t\t\t\tconst failedCount = results.length - skippedCount - successCount;\n\t\t\t\tif (successCount > 0) {\n\t\t\t\t\tshowToast(id ? t('warmup.success') : t('warmup.allSuccess'), 'success');\n\t\t\t\t} else if (skippedCount > 0 && failedCount === 0) {\n\t\t\t\t\tshowToast(t('warmup.skipped'), 'info');\n\t\t\t\t} else {\n\t\t\t\t\tactionFailed();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t}\n\t\t};\n\n\t\tconst saveProxy = async (id: string): Promise<void> => {\n\t\t\tsetLoadingAction(`proxy:${id}`);\n\t\t\tconst proxyUrl = proxyInputs[id];\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/proxy', { id, proxyUrl });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetEditingProxyId(null);\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t\tshowToast(t('proxy.saved'), 'success');\n\t\t};\n\n\t\tconst setMode = async (mode: string): Promise<void> => {\n\t\t\tsetLoadingAction(`mode:${mode}`);\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/mode', { mode });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t};\n\n\t\tconst clearCooldown = async (id?: string): Promise<void> => {\n\t\t\tsetLoadingAction(id ? `clearCooldown:${id}` : 'clearCooldown:all');\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/clear-cooldown', { id });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t\tshowToast(t('account.clearCooldown'), 'success');\n\t\t};\n\n\t\tconst toggleExpand = (accId: string) => {\n\t\t\tsetExpandedModels((prev) => ({ ...prev, [accId]: !prev[accId] }));\n\t\t};\n\n\t\tconst authPhase = status?.auth?.phase ?? 'unknown';\n\t\tconst pool = status?.pool;\n\t\tconst catalogModels = status?.catalogModels ?? [];\n\t\tconst hiddenModelSet = new Set(status?.hiddenModels ?? []);\n\t\tconst accounts = pool?.accounts ?? [];\n\t\tconst isAuthed = authPhase === 'ok' || accounts.length > 0;\n\t\t// Per-action busy scoping (2026-10-23): `isBusy` used to be\n\t\t// `loadingAction !== null` and was applied to EVERY account button, so\n\t\t// one refresh flipped 40 `disabled` attributes at once (measured: 40\n\t\t// attribute mutations for 2 added nodes) and repainted the whole panel.\n\t\t// Each control now derives its own busy state from the action that\n\t\t// concerns it, so an unrelated action leaves its DOM untouched.\n\t\tconst isBusy = loadingAction !== null;\n\t\t/** Busy for a per-account action; also blocks while a global action runs. */\n\t\tconst accountActionBusy = (acc: ManagedAccount, action: string): boolean =>\n\t\t\tloadingAction === `${action}:${acc.id}`;\n\t\t/** Global actions (add/sync-all/save) genuinely conflict with everything. */\n\t\tconst globalBusy = isBusy && !loadingAction?.includes(':');\n\n\t\tconst renderSpinner = () => h('span', { className: 'agy-spinner' });\n\n\t\tconst renderToastBanner = () => {\n\t\t\tif (!toast) return null;\n\t\t\tconst typeStyles = {\n\t\t\t\tsuccess: { background: 'var(--agy-toast-success-bg)', border: '1px solid var(--agy-toast-success-border)', color: 'var(--agy-toast-success-text)' },\n\t\t\t\tinfo: { background: 'var(--agy-toast-info-bg)', border: '1px solid var(--agy-toast-info-border)', color: 'var(--agy-toast-info-text)' },\n\t\t\t\twarn: { background: 'var(--agy-toast-warn-bg)', border: '1px solid var(--agy-toast-warn-border)', color: 'var(--agy-toast-warn-text)' },\n\t\t\t\terror: { background: 'var(--agy-toast-error-bg)', border: '1px solid var(--agy-toast-error-border)', color: 'var(--agy-toast-error-text)' },\n\t\t\t};\n\t\t\tconst style = typeStyles[toast.type];\n\t\t\treturn h('div', { style: { ...S.noticeBanner, ...style } },\n\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '8px', fontWeight: 600 } },\n\t\t\t\t\tuiIcon(toast.type === 'success' ? 'check' : toast.type === 'error' || toast.type === 'warn' ? 'alert' : 'globe', 14, style.color),\n\t\t\t\t\th('span', null, toast.text),\n\t\t\t\t),\n\t\t\t\th('button', {\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\tstyle: { background: 'transparent', border: 'none', color: 'inherit', cursor: 'pointer', padding: '0 4px', opacity: 0.8, display: 'inline-flex', alignItems: 'center' },\n\t\t\t\t\tonClick: () => setToast(null),\n\t\t\t\t\t'aria-label': t('aria.closeToast'),\n\t\t\t\t}, uiIcon('x', 12)),\n\t\t\t);\n\t\t};\n\n\t\t// Scoped shimmer (2026-10-23): the global 'refresh-quota' flag used to be\n\t\t// passed to EVERY account's quota bars, so refreshing one account started\n\t\t// the infinite shimmer animation on all of them \u2014 extra compositing and\n\t\t// repaints across the whole panel while the user scrolls.\n\t\tconst renderQuotaBar = (label: string, familyKey: 'google' | 'argon' | 'anthropic' | 'openai', acc: ManagedAccount): unknown =>\n\t\t\trenderFamilyQuotaBar(\n\t\t\t\tt,\n\t\t\t\tlabel,\n\t\t\t\tfamilyKey,\n\t\t\t\tacc,\n\t\t\t\tloadingAction === 'refresh:all' || loadingAction === `refresh:${acc.id}`,\n\t\t\t);\n\n\t\t// Authoritative active account: trust pool.activeAccountId computed by\n\t\t// the scheduler, falling back to lastActiveAccountId, activeAccountIds.google, or primaryAccountId.\n\t\t// Optimistic selection takes priority for instant zero-flicker feedback.\n\t\tconst authoritativeActiveId = pool?.activeAccountId ?? pool?.lastActiveAccountId ?? pool?.activeAccountIds?.google ?? pool?.primaryAccountId;\n\t\tconst activeAccountId = optimisticActiveId ?? authoritativeActiveId;\n\t\tconst renderedAccountCards = accounts.map((acc: ManagedAccount) => {\n\t\t\tconst isPrimary = acc.id === pool?.primaryAccountId;\n\t\t\tconst hasCooldown = Object.entries(acc.cooldowns).some(([, cd]) => cd && cd.cooldownUntil > Date.now());\n\t\t\tconst isAuthRequired = acc.authRequired;\n\t\t\tconst isInUse = acc.enabled && !isAuthRequired && activeAccountId !== undefined && activeAccountId === acc.id;\n\t\t\tconst dotColor = !acc.enabled ? '#64748b' : isAuthRequired ? '#ef4444' : hasCooldown ? '#f59e0b' : '#10b981';\n\t\t\tconst isEditingProxy = editingProxyId === acc.id;\n\t\t\tconst isExpanded = expandedModels[acc.id] ?? false;\n\t\t\tconst accIndex = accounts.indexOf(acc);\n\n\t\t\tconst cardStyle = {\n\t\t\t\t...S.card,\n\t\t\t\tcursor: 'default',\n\t\t\t\tpadding: '10px 14px',\n\t\t\t\tmarginBottom: '8px',\n\t\t\t\t...(!acc.enabled ? { opacity: 0.72 } : {}),\n\t\t\t};\n\t\t\t// Built-in aliases are canonical server data; translate display only.\n\t\t\tconst legacyDefault = acc.defaultAlias === undefined && acc.systemHome && acc.alias === '\u4E3B\u8D26\u53F7 (\u7CFB\u7EDF\u767B\u5F55)';\n\t\t\tconst displayAlias = acc.defaultAlias || legacyDefault\n\t\t\t\t? acc.systemHome ? t('account.defaultAlias') : t('account.aliasDefault', { number: accIndex + 1 })\n\t\t\t\t: acc.alias;\n\n\t\t\tconst googleModels = acc.quotas.google?.models ?? [];\n\t\t\tconst argonModels = acc.quotas.argon?.models ?? [];\n\t\t\tconst anthropicModels = acc.quotas.anthropic?.models ?? [];\n\t\t\tconst openaiModels = acc.quotas.openai?.models ?? [];\n\t\t\tconst allChildModels: { family: string; model: ModelQuotaInfo }[] = [\n\t\t\t\t...googleModels.map((m) => ({ family: 'Google', model: m })),\n\t\t\t\t...argonModels.map((m) => ({ family: 'Argon', model: m })),\n\t\t\t\t...anthropicModels.map((m) => ({ family: 'Anthropic', model: m })),\n\t\t\t\t...openaiModels.map((m) => ({ family: 'OpenAI', model: m })),\n\t\t\t];\n\n\t\t\treturn h('div', {\n\t\t\t\tkey: acc.id,\n\t\t\t\tclassName: 'agy-card-hover',\n\t\t\t\tstyle: cardStyle,\n\t\t\t},\n\t\t\t\t// Header row\n\t\t\t\th('div', {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\tuserSelect: 'none',\n\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\tmarginBottom: '8px',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '6px', flexWrap: 'wrap', flex: '1', minWidth: 0 } },\n\t\t\t\t\t\th('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tfontSize: '10.5px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tbackground: isPrimary ? 'var(--agy-badge-primary-bg)' : 'var(--agy-badge-tag-bg)',\n\t\t\t\t\t\t\t\tcolor: isPrimary ? 'var(--agy-badge-primary-text)' : 'var(--agy-badge-tag-text)',\n\t\t\t\t\t\t\t\tborderColor: isPrimary ? 'var(--agy-badge-primary-border)' : 'var(--agy-badge-tag-border)',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: `\u4F18\u5148\u7EA7 #${accIndex + 1}`,\n\t\t\t\t\t\t}, `#${accIndex + 1}`),\n\t\t\t\t\t\taccounts.length > 1 ? h('div', {\n\t\t\t\t\t\t\tstyle: { display: 'inline-flex', gap: '2px', alignItems: 'center' },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\taccIndex > 0 ? h('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\tstyle: { ...S.btnSm, padding: '1px 4px', fontSize: '10px', lineHeight: 1, height: '18px' },\n\t\t\t\t\t\t\t\ttitle: t('account.moveUp'),\n\t\t\t\t\t\t\t\tonClick: () => void moveAccount(acc.id, -1),\n\t\t\t\t\t\t\t}, uiIcon('arrowUp', 10)) : null,\n\t\t\t\t\t\t\taccIndex < accounts.length - 1 ? h('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\tstyle: { ...S.btnSm, padding: '1px 4px', fontSize: '10px', lineHeight: 1, height: '18px' },\n\t\t\t\t\t\t\t\ttitle: t('account.moveDown'),\n\t\t\t\t\t\t\t\tonClick: () => void moveAccount(acc.id, 1),\n\t\t\t\t\t\t\t}, uiIcon('arrowDown', 10)) : null,\n\t\t\t\t\t\t) : null,\n\t\t\t\t\t\th('span', {\n\t\t\t\t\t\t\tclassName: 'agy-pulse-dot',\n\t\t\t\t\t\t\tstyle: { background: dotColor, boxShadow: `0 0 6px ${dotColor}aa`, marginLeft: '1px' },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\t\t\tcolor: 'var(--agy-text-primary)',\n\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: displayAlias,\n\t\t\t\t\t\t}, displayAlias),\n\t\t\t\t\t\th('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'rgba(59, 130, 246, 0.12)',\n\t\t\t\t\t\t\t\tcolor: '#3b82f6',\n\t\t\t\t\t\t\t\tborderColor: 'rgba(59, 130, 246, 0.35)',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}, 'AGY'),\n\t\t\t\t\t\tisAuthRequired ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'var(--agy-badge-email-bg)',\n\t\t\t\t\t\t\t\tcolor: '#ef4444',\n\t\t\t\t\t\t\t\tborderColor: '#fca5a5',\n\t\t\t\t\t\t\t\tgap: '3px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}, uiIcon('alert', 10, '#ef4444'), t('status.authRequired')) : null,\n\t\t\t\t\t\thasCooldown ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'rgba(245, 158, 11, 0.15)',\n\t\t\t\t\t\t\t\tcolor: '#f59e0b',\n\t\t\t\t\t\t\t\tborderColor: 'rgba(245, 158, 11, 0.4)',\n\t\t\t\t\t\t\t\tgap: '3px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}, uiIcon('alert', 10, '#f59e0b'), '\u51B7\u5374\u4E2D') : null,\n\t\t\t\t\t\tacc.email ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'var(--agy-badge-email-bg)',\n\t\t\t\t\t\t\t\tcolor: 'var(--agy-badge-email-text)',\n\t\t\t\t\t\t\t\tborderColor: 'var(--agy-badge-email-border)',\n\t\t\t\t\t\t\t\tgap: '4px',\n\t\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\t\tpadding: '1px 6px',\n\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: acc.email,\n\t\t\t\t\t\t}, uiIcon('mail', 10, 'var(--agy-badge-email-text)'), acc.email) : null,\n\t\t\t\t\t\tisInUse ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'rgba(16, 185, 129, 0.12)',\n\t\t\t\t\t\t\t\tcolor: '#10b981',\n\t\t\t\t\t\t\t\tborderColor: 'rgba(16, 185, 129, 0.45)',\n\t\t\t\t\t\t\t\tgap: '3px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: t('status.inUse'),\n\t\t\t\t\t\t}, uiIcon('zap', 10, '#10b981'), t('status.inUse')) : null,\n\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\tconst effectiveProxy = acc.proxyUrl || pool?.systemProxy;\n\t\t\t\t\t\t\treturn effectiveProxy ? h('span', {\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\t\tbackground: 'var(--agy-badge-proxy-bg)',\n\t\t\t\t\t\t\t\t\tcolor: 'var(--agy-badge-proxy-text)',\n\t\t\t\t\t\t\t\t\tborderColor: 'var(--agy-badge-proxy-border)',\n\t\t\t\t\t\t\t\t\tgap: '4px',\n\t\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttitle: effectiveProxy,\n\t\t\t\t\t\t\t}, uiIcon('globe', 10, 'var(--agy-badge-proxy-text)'), t('status.proxy')) : null;\n\t\t\t\t\t\t})(),\n\t\t\t\t\t\t!acc.enabled ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'var(--agy-bg-subbox)',\n\t\t\t\t\t\t\t\tcolor: 'var(--agy-text-secondary)',\n\t\t\t\t\t\t\t\tborderColor: 'var(--agy-border-subbox)',\n\t\t\t\t\t\t\t\tgap: '3px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: t('status.disabled'),\n\t\t\t\t\t\t}, uiIcon('power', 10, '#64748b'), t('status.disabled')) : null,\n\t\t\t\t\t),\n\t\t\t\t\th('div', {\n\t\t\t\t\t\tstyle: { display: 'flex', gap: '4px', alignItems: 'center', flexShrink: 0 },\n\t\t\t\t\t},\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: acc.enabled\n\t\t\t\t\t\t\t\t? { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px' }\n\t\t\t\t\t\t\t\t: { ...S.btnSmPrimary, gap: '3px', fontSize: '11px', padding: '2px 6px' },\n\t\t\t\t\t\t\ttitle: acc.enabled ? t('account.disableTitle') : t('account.enableTitle'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'enable'),\n\t\t\t\t\t\t\tonClick: () => void toggleAccountEnabled(acc),\n\t\t\t\t\t\t}, loadingAction === `enable:${acc.id}`\n\t\t\t\t\t\t\t? [renderSpinner(), acc.enabled ? t('account.disable') : t('account.enable')]\n\t\t\t\t\t\t\t: [uiIcon('power', 10, acc.enabled ? 'var(--agy-text-secondary)' : '#ffffff'), ` ${acc.enabled ? t('account.disable') : t('account.enable')}`]),\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px', minWidth: '58px', justifyContent: 'center' },\n\t\t\t\t\t\t\ttitle: t('account.syncTitle'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'refresh'),\n\t\t\t\t\t\t\tonClick: () => void refreshQuota(acc.id),\n\t\t\t\t\t\t}, loadingAction === `refresh:${acc.id}` ? [renderSpinner(), t('account.syncing')] : [uiIcon('refresh', 10), ` ${t('account.sync')}`]),\n\t\t\t\t\t\tacc.enabled && !acc.authRequired ? h('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px', minWidth: '58px', justifyContent: 'center' },\n\t\t\t\t\t\t\ttitle: t('account.warmupTitle'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'warmup'),\n\t\t\t\t\t\t\tonClick: () => void warmupAccount(acc.id),\n\t\t\t\t\t\t}, loadingAction === `warmup:${acc.id}` ? [renderSpinner(), t('account.warmingUp')] : [uiIcon('flame', 10, '#f97316'), ` ${t('account.warmup')}`]) : null,\n\t\t\t\t\t\tacc.enabled && !isInUse ? h('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px' },\n\t\t\t\t\t\t\ttitle: t('account.setActive'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'active'),\n\t\t\t\t\t\t\tonClick: () => void setActiveAccount(acc.id),\n\t\t\t\t\t\t}, loadingAction === `active:${acc.id}` ? [renderSpinner(), t('account.settingActive')] : [uiIcon('zap', 10), ` ${t('account.setActive')}`]) : null,\n\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: isEditingProxy ? { ...S.btnSmPrimary, gap: '3px', fontSize: '11px', padding: '2px 6px' } : { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px' },\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'proxy'),\n\t\t\t\t\t\t\tonClick: () => setEditingProxyId(isEditingProxy ? null : acc.id),\n\t\t\t\t\t\t}, [uiIcon('globe', 10), ` ${t('proxy.button')}`]),\n\t\t\t\t\t\taccounts.length > 1 ? h('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: { ...S.btnDanger, padding: '2px 6px', fontSize: '11px' },\n\t\t\t\t\t\t\ttitle: t('account.removeTitle'),\n\t\t\t\t\t\t\t'aria-label': t('account.removeTitle'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'remove'),\n\t\t\t\t\t\t\tonClick: () => void removeAccount(acc.id, displayAlias),\n\t\t\t\t\t\t}, loadingAction === `remove:${acc.id}` ? renderSpinner() : uiIcon('trash', 11, 'var(--agy-danger-text)')) : null,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t// Body: Always directly visible, showing quota\nh('div', { key: 'agy-body', style: S.quotaBox },\n\t\t\t\t\t\trenderQuotaBar('Gemini', 'google', acc),\n\t\t\t\t\t\t// Gemini 4 Argon (Pro/Ultra only): the backend reports its own\n\t\t\t\t\t\t// quota group/weekly bucket ONLY for accounts that have the\n\t\t\t\t\t\t// permission, so gate the row on the data itself \u2014 free and\n\t\t\t\t\t\t// legacy plans never see an empty Argon panel.\n\t\t\t\t\t\tacc.quotas.argon ? renderQuotaBar('Argon', 'argon', acc) : null,\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t\tgap: '5px',\n\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\tpadding: '5px 10px',\n\t\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\tcolor: isExpanded ? 'var(--dsw-alias-state-business-primary, #3b82f6)' : 'var(--agy-text-secondary)',\n\t\t\t\t\t\t\t\tbackground: 'var(--agy-bg-subbox)',\n\t\t\t\t\t\t\t\tborder: '1px dashed var(--agy-border-box)',\n\t\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tonClick: () => toggleExpand(acc.id),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\tuiIcon(isExpanded ? 'chevronUp' : 'chevronDown', 10),\n\t\t\t\t\t\t\th('span', null, isExpanded ? t('account.collapseOthers') : t('account.expandOthers')),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tisExpanded ? [\n\t\t\t\t\t\t\trenderQuotaBar('Claude', 'anthropic', acc),\n\t\t\t\t\t\t\trenderQuotaBar('GPT-OSS', 'openai', acc),\n\t\t\t\t\t\t\tallChildModels.length > 0 ? h('div', {\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tmarginTop: '8px',\n\t\t\t\t\t\t\t\t\tpaddingTop: '8px',\n\t\t\t\t\t\t\t\t\tborderTop: '1px solid var(--agy-border-box)',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\th('div', { style: { color: 'var(--agy-text-secondary)', marginBottom: '6px', fontWeight: 600, fontSize: '11px' } }, t('account.models')),\n\t\t\t\t\t\t\t\tallChildModels.map(({ family, model }) => {\n\t\t\t\t\t\t\t\t\tconst frac = model.remainingFraction ?? 1;\n\t\t\t\t\t\t\t\t\tconst pct = Math.round(frac * 100);\n\t\t\t\t\t\t\t\t\tconst w = formatQuotaWindow(t, model.resetTime);\n\t\t\t\t\t\t\t\t\tconst pColor = pct <= 20 ? 'var(--agy-quota-low-text)' : pct <= 50 ? 'var(--agy-quota-med-text)' : 'var(--agy-quota-high-text)';\n\t\t\t\t\t\t\t\t\treturn h('div', { key: `${family}-${model.modelId}`, className: 'agy-submodel-row' },\n\t\t\t\t\t\t\t\t\t\th('span', { style: { fontWeight: 500, color: 'var(--agy-text-primary)' } }, `[${family}] ${model.displayName || model.modelId}`),\n\t\t\t\t\t\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '8px' } },\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: { color: pColor, fontWeight: 700 } }, `${pct}%`),\n\t\t\t\t\t\t\t\t\t\t\tw.resetText ? h('span', { style: { color: 'var(--agy-text-tertiary)', fontSize: '10.5px' } }, `\u21BB ${w.resetText}`) : null,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t] : null,\n\t\t\t\t\t),\n\t\t\t\thasCooldown ? h('div', {\n\t\t\t\t\tkey: 'cd-body',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tbackground: 'var(--agy-warn-bg)',\n\t\t\t\t\t\tborder: '1px solid var(--agy-warn-border)',\n\t\t\t\t\t\tborderRadius: '7px',\n\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\tcolor: 'var(--agy-warn-text)',\n\t\t\t\t\t\tfontSize: '11.5px',\n\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\tmarginTop: '8px',\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '6px' } },\n\t\t\t\t\t\tuiIcon('alert', 13, 'var(--agy-warn-text)'),\n\t\t\t\t\t\th('span', null, t('account.cooldown')),\n\t\t\t\t\t),\n\t\t\t\t\th('button', {\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\tstyle: { ...S.btnSm, color: 'var(--agy-warn-btn-text)', borderColor: 'var(--agy-warn-btn-border)', background: 'var(--agy-warn-btn-bg)', gap: '4px' },\n\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'clearCooldown'),\n\t\t\t\t\t\tonClick: () => void clearCooldown(acc.id),\n\t\t\t\t\t}, loadingAction === `clearCooldown:${acc.id}` ? [renderSpinner(), ''] : [uiIcon('zap', 11, 'var(--agy-warn-btn-text)'), ` ${t('account.clearCooldown')}`]),\n\t\t\t\t) : null,\n\t\t\t\tisEditingProxy ? h('div', {\n\t\t\t\t\tkey: 'proxy-body',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmarginTop: '8px',\n\t\t\t\t\t\tpadding: '10px 12px',\n\t\t\t\t\t\tbackground: 'var(--agy-bg-subbox)',\n\t\t\t\t\t\tborderRadius: '7px',\n\t\t\t\t\t\tborder: '1px solid var(--agy-border-subbox)',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\th('div', { style: { display: 'flex', gap: '8px' } },\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\tstyle: S.input,\n\t\t\t\t\t\t\tvalue: proxyInputs[acc.id] !== undefined ? proxyInputs[acc.id] : (acc.proxyUrl ?? ''),\n\t\t\t\t\t\t\tplaceholder: pool?.systemProxy ? `${t('proxy.placeholder')} (${pool.systemProxy})` : t('proxy.placeholder'),\n\t\t\t\t\t\t\t'aria-label': t('aria.proxyInput'),\n\t\t\t\t\t\t\tonChange: (e: { target: { value: string } }) => setProxyInputs({ ...proxyInputs, [acc.id]: e.target.value }),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: S.btnPrimary,\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'proxy'),\n\t\t\t\t\t\t\tonClick: () => void saveProxy(acc.id),\n\t\t\t\t\t\t}, loadingAction === `proxy:${acc.id}` ? [renderSpinner(), t('proxy.save')] : t('proxy.save')),\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: S.btn,\n\t\t\t\t\t\t\tonClick: () => setEditingProxyId(null),\n\t\t\t\t\t\t}, t('cancel')),\n\t\t\t\t\t),\n\t\t\t\t) : null,\n\t\t\t);\n\t\t});\n\n\t\tconst poolAuth = status?.poolAuth;\n\t\tconst flowPhase = poolAuth?.phase ?? 'idle';\n\t\tconst flowActive = flowPhase === 'waiting' || flowPhase === 'exchanging';\n\n\t\tconst addAccountSection = addingAccount\n\t\t\t? h('div', { style: S.authModal, role: 'group', 'aria-label': t('account.add') },\n\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '12px', flexWrap: 'wrap', gap: '8px' } },\n\t\t\t\t\th('div', { style: { fontWeight: 700, fontSize: '13.5px', display: 'flex', alignItems: 'center', gap: '6px', color: 'var(--agy-text-primary)' } },\n\t\t\t\t\t\tuiIcon('plus', 13, 'var(--agy-btn-primary-bg)'),\n\t\t\t\t\t\tt('account.add'),\n\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t(!flowActive\n\t\t\t\t\t\t? h('div', null,\n\t\t\t\t\t\t\th('div', { style: { display: 'flex', flexDirection: 'column', gap: '8px', marginBottom: '12px' } },\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tstyle: S.input,\n\t\t\t\t\t\t\t\t\tvalue: aliasInput,\n\t\t\t\t\t\t\t\t\tplaceholder: t('account.aliasPlaceholder'),\n\t\t\t\t\t\t\t\t\t'aria-label': t('aria.aliasInput'),\n\t\t\t\t\t\t\t\t\tonChange: (e: { target: { value: string } }) => setAliasInput(e.target.value),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tstyle: S.input,\n\t\t\t\t\t\t\t\t\tvalue: addProxyInput,\n\t\t\t\t\t\t\t\t\tplaceholder: pool?.systemProxy ? `${t('account.proxyPlaceholder')} (${pool.systemProxy})` : t('account.proxyPlaceholder'),\n\t\t\t\t\t\t\t\t\t'aria-label': t('aria.proxyInput'),\n\t\t\t\t\t\t\t\t\tonChange: (e: { target: { value: string } }) => setAddProxyInput(e.target.value),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('div', { style: { display: 'flex', gap: '8px' } },\n\t\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\t\tstyle: { ...S.btnPrimary, gap: '4px' },\n\t\t\t\t\t\t\t\t\tdisabled: isBusy,\n\t\t\t\t\t\t\t\t\tonClick: () => void handleBeginAddAccount(),\n\t\t\t\t\t\t\t\t}, loadingAction === 'pool:beginAdd' ? [renderSpinner(), t('auth.openingBrowser')] : [uiIcon('externalLink', 12, '#ffffff'), ` ${t('auth.openBrowser')}`]),\n\t\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\t\tstyle: S.btn,\n\t\t\t\t\t\t\t\t\tonClick: () => handleCancelAddAccount(),\n\t\t\t\t\t\t\t\t}, t('cancel')),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tflowPhase === 'failed' ? h('div', {\n\t\t\t\t\t\t\t\tstyle: { ...S.muted, color: 'var(--agy-danger-text)', marginTop: '8px', display: 'flex', alignItems: 'center', gap: '5px', fontWeight: 600 },\n\t\t\t\t\t\t\t}, uiIcon('alert', 12, 'var(--agy-danger-text)'), safeMessage(poolAuth?.code)) : null,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t: h('div', null,\n\t\t\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', color: 'var(--agy-text-secondary)', marginBottom: '8px', lineHeight: 1.5, fontSize: '12px' } },\n\t\t\t\t\t\t\t\trenderSpinner(),\n\t\t\t\t\t\t\t\tflowPhase === 'exchanging'\n\t\t\t\t\t\t\t\t\t? t('auth.exchanging')\n\t\t\t\t\t\t\t\t\t: t('auth.waiting'),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tpoolAuth?.url ? h('div', { style: { marginBottom: '8px' } },\n\t\t\t\t\t\t\t\th('a', {\n\t\t\t\t\t\t\t\t\thref: poolAuth.url,\n\t\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t\t\tstyle: { color: 'var(--dsw-alias-state-business-primary, #2563eb)', textDecoration: 'underline', fontSize: '12px', fontWeight: 600, display: 'inline-flex', alignItems: 'center', gap: '4px' },\n\t\t\t\t\t\t\t\t}, uiIcon('externalLink', 12, 'currentColor'), t('auth.openManual')),\n\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t\th('div', { style: { color: 'var(--agy-text-tertiary)', marginBottom: '6px', fontSize: '11px', fontWeight: 500 } },\n\t\t\t\t\t\t\t\tt('auth.pasteHint'),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('div', { style: { display: 'flex', gap: '8px' } },\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tstyle: S.input,\n\t\t\t\t\t\t\t\t\tvalue: authCodeInput,\n\t\t\t\t\t\t\t\t\tplaceholder: t('auth.codePlaceholder'),\n\t\t\t\t\t\t\t\t\t'aria-label': t('aria.authCodeInput'),\n\t\t\t\t\t\t\t\t\tonChange: (e: { target: { value: string } }) => setAuthCodeInput(e.target.value),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\t\tstyle: { ...S.btnPrimary, gap: '4px' },\n\t\t\t\t\t\t\t\t\tdisabled: isBusy || !authCodeInput.trim(),\n\t\t\t\t\t\t\t\t\tonClick: () => void handleCompleteAddAccount(),\n\t\t\t\t\t\t\t\t}, loadingAction === 'pool:completeAdd' ? [renderSpinner(), t('auth.activating')] : [uiIcon('check', 12, '#ffffff'), ` ${t('auth.activate')}`]),\n\t\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\t\tstyle: S.btn,\n\t\t\t\t\t\t\t\t\tonClick: () => handleCancelAddAccount(),\n\t\t\t\t\t\t\t\t}, t('cancel')),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t))\n)\n\t\t\t: null;\n\n\t\t// FusionSettings is the only placement: the console is an inline section of\n\t\t// that page, never its own panel or dialog.\n\t\tconst containerStyle = props?.isModal\n\t\t\t? S.container\n\t\t\t: {\n\t\t\t\t...S.container,\n\t\t\t\tboxSizing: 'border-box' as const,\n\t\t\t\twidth: '100%',\n\t\t\t\tmaxWidth: '920px',\n\t\t\t};\n\n\t\tif (status === null) {\n\t\t\treturn h('div', { className: 'agy-console', style: { ...containerStyle, minHeight: '120px', display: 'flex', alignItems: 'center', justifyContent: 'center' } },\n\t\t\t\th('style', { key: 'css' }, AGY_CONSOLE_CSS),\n\t\t\t\th('span', { style: S.muted }, [renderSpinner(), t('status.loading')]),\n\t\t\t) as ReactNode;\n\t\t}\n\n\t\treturn h('div', { className: 'agy-console', style: containerStyle },\n\t\t\th('style', { key: 'css' }, AGY_CONSOLE_CSS),\n\t\t\th('div', { style: S.headerCard },\n\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '8px' } },\n\t\t\t\t\tagyIcon(18),\n\t\t\t\t\th('span', { style: { fontWeight: 700, fontSize: '14px', color: 'var(--agy-text-primary)' } }, 'Antigravity'),\n\t\t\t\t\th('span', { style: isAuthed ? S.badgeReady : S.badgeUnready }, isAuthed ? t('status.ready') : t('status.needsAuth')),\n\t\t\t\t),\n\t\t\t\th('div', { style: { display: 'flex', gap: '6px', alignItems: 'center' } },\n\t\t\t\t\t!addingAccount ? h('button', {\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\tstyle: { ...S.btnPrimary, gap: '4px' },\n\t\t\t\t\t\tonClick: () => setAddingAccount(true),\n\t\t\t\t\t}, [uiIcon('plus', 12, '#ffffff'), ` ${t('account.add')}`]) : null,\n\t\t\t\t\th('button', {\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\tstyle: { ...S.btn, gap: '4px' },\n\t\t\t\t\t\tdisabled: isBusy,\n\t\t\t\t\t\tonClick: () => void warmupAccount(),\n\t\t\t\t\t}, loadingAction === 'warmup:all' ? [renderSpinner(), t('header.warmingUp')] : [uiIcon('flame', 12, '#f97316'), ` ${t('header.warmup')}`]),\n\t\t\t\t\th('button', {\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\tstyle: { ...S.btn, gap: '4px' },\n\t\t\t\t\t\tdisabled: isBusy,\n\t\t\t\t\t\tonClick: () => void refreshQuota(),\n\t\t\t\t\t}, loadingAction === 'refresh:all' ? [renderSpinner(), t('header.refreshing')] : [uiIcon('refresh', 12, 'var(--agy-text-btn)'), ` ${t('header.refreshQuota')}`]),\n\t\t\t\t),\n\t\t\t),\n\t\t\trenderToastBanner(),\n\t\t\taddAccountSection,\n\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '8px', padding: '0 2px' } },\n\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '6px' } },\n\t\t\t\t\th('span', { style: { fontWeight: 700, fontSize: '12.5px', color: 'var(--agy-text-primary)' } }, `\u8D26\u53F7\u6C60 (${accounts.length})`),\n\t\t\t\t),\n\t\t\t),\n\t\t\trenderedAccountCards,\n\t\t\th('div', { style: { marginTop: '16px', paddingTop: '12px', borderTop: '1px solid var(--agy-border-divider)' } },\n\t\t\t\th('div', { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },\n\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('permission.label')),\n\t\t\t\t\t\th('div', { style: S.segGroup },\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.permissionMode === 'plan' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('permissionMode', 'plan'),\n\t\t\t\t\t\t\t}, t('permission.plan')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.permissionMode === 'accept-edits' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('permissionMode', 'accept-edits'),\n\t\t\t\t\t\t\t}, t('permission.acceptEdits')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.permissionMode === 'skip' ? { ...S.segBtnActive, color: 'var(--agy-seg-danger-text)', background: 'var(--agy-seg-danger-bg)', border: '1px solid var(--agy-seg-danger-border)' } : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('permissionMode', 'skip'),\n\t\t\t\t\t\t\t}, t('permission.skip')),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },\n\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('effort.label')),\n\t\t\t\t\t\th('div', { style: S.segGroup },\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.defaultEffort === '' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('defaultEffort', ''),\n\t\t\t\t\t\t\t}, t('effort.auto')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.defaultEffort === 'low' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('defaultEffort', 'low'),\n\t\t\t\t\t\t\t}, t('effort.low')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.defaultEffort === 'medium' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('defaultEffort', 'medium'),\n\t\t\t\t\t\t\t}, t('effort.medium')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.defaultEffort === 'high' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('defaultEffort', 'high'),\n\t\t\t\t\t\t\t}, t('effort.high')),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },\n\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('pool.label')),\n\t\t\t\t\t\th('div', { style: S.segGroup },\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: pool?.mode === 'sequential' || !pool?.mode ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setMode('sequential'),\n\t\t\t\t\t\t\t}, t('pool.sequential')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: pool?.mode === 'round-robin' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setMode('round-robin'),\n\t\t\t\t\t\t\t}, t('pool.roundRobin')),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },\n\t\t\t\t\t\th('div', { style: { display: 'flex', flexDirection: 'column' } },\n\t\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('config.autoWarmup')),\n\t\t\t\t\t\t\th('span', { style: S.muted }, t('config.autoWarmupDesc')),\n\t\t\t\t\t\t),\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tstyle: status?.autoWarmup !== false ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\tdisabled: loadingAction === 'config:autoWarmup',\n\t\t\t\t\t\t\tonClick: () => void setCfg('autoWarmup', status?.autoWarmup === false),\n\t\t\t\t\t\t}, status?.autoWarmup !== false ? t('account.disable') : t('account.enable')),\n\t\t\t\t\t),\n\t\t\t\t\th('div', { style: { display: 'flex', flexDirection: 'column', gap: '6px' } },\n\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('models.label')),\n\t\t\t\t\t\tcatalogModels.length === 0\n\t\t\t\t\t\t\t? h('span', { style: S.muted }, t('models.empty'))\n\t\t\t\t\t\t\t: h('div', { style: { display: 'flex', flexWrap: 'wrap', gap: '6px' } },\n\t\t\t\t\t\t\t\tcatalogModels.map((m) => {\n\t\t\t\t\t\t\t\t\tconst isHidden = hiddenModelSet.has(m.id);\n\t\t\t\t\t\t\t\t\treturn h('button', {\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tkey: m.id,\n\t\t\t\t\t\t\t\t\t\ttitle: m.id,\n\t\t\t\t\t\t\t\t\t\tdisabled: loadingAction === 'config:hiddenModels',\n\t\t\t\t\t\t\t\t\t\tstyle: isHidden ? { ...S.segBtn, opacity: 0.45, textDecoration: 'line-through' } : S.segBtnActive,\n\t\t\t\t\t\t\t\t\t\tonClick: () => void toggleModelHidden(m.id, !isHidden),\n\t\t\t\t\t\t\t\t\t}, m.name);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\th('span', { style: S.muted }, t('models.hint')),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t) as ReactNode;\n}\n", "// Brand and UI icon paths used by the Antigravity console.\n//\n// Ported from dsh-agy-worker (`src/client/brand-icons.ts`), MIT License,\n// Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n// dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n// docs/ATTRIBUTION-AGY.md.\nexport const BRAND_PATHS = {\n gemini: \"M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81\",\n claude: \"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z\",\n openai: \"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\",\n chrome: \"M12 0C8.21 0 4.831 1.757 2.632 4.501l3.953 6.848A5.454 5.454 0 0 1 12 6.545h10.73c-.911-3.794-4.321-6.545-8.384-6.545zM1.986 6.368A11.95 11.95 0 0 0 0 12c0 6.096 4.542 11.134 10.428 11.89l3.953-6.848a5.454 5.454 0 0 1-5.836-2.585L1.986 6.368zm14.569 5.632a5.454 5.454 0 0 1-1.127 3.327l-5.365 9.293C10.784 24.873 11.385 25 12 25c6.627 0 12-5.373 12-12 0-.341-.014-.679-.042-1.013H12v.013h4.555z\",\n edge: \"M23.95 13.91c-.13-1.68-.78-3.23-1.83-4.47-.98-1.16-2.29-1.99-3.76-2.4-.64-.18-1.3-.28-1.97-.29-2.09-.03-4.08.74-5.63 2.16-1.57 1.44-2.48 3.44-2.55 5.56.08 1.47.66 2.87 1.66 3.96.99 1.09 2.37 1.76 3.86 1.88 1.34.1 2.69-.26 3.82-1.02.44-.3.84-.66 1.18-1.07l2.87 2.87c-1.35 1.44-3.04 2.51-4.92 3.12-1.89.6-3.9.7-5.84.28-2.67-.58-5.06-2.06-6.75-4.17-1.68-2.12-2.59-4.78-2.57-7.51.02-2.85 1.04-5.6 2.89-7.77C6.88 4.31 9.53 2.85 12.44 2.38c2.19-.35 4.43-.2 6.55.45 2.13.65 4.04 1.83 5.58 3.44l-2.9 2.9c-1.12-1.19-2.52-2.06-4.07-2.54-1.55-.47-3.19-.57-4.78-.3-2.14.36-4.08 1.45-5.46 3.06-1.38 1.62-2.13 3.69-2.13 5.84 0 2.05.69 4.04 1.98 5.62 1.28 1.58 3.1 2.64 5.12 3.01 1.47.27 2.99.17 4.42-.31 1.43-.48 2.7-1.33 3.69-2.46l-4.13-4.13c-.37.28-.8.48-1.26.58-.46.1-.94.09-1.4-.02-.57-.14-1.08-.47-1.46-.93-.38-.46-.59-1.04-.59-1.64.03-.84.4-1.63 1.03-2.2.63-.57 1.45-.88 2.3-.87.87.01 1.7.35 2.32.95.62.61.98 1.43 1 2.3h4.67z\",\n} as const\n\nexport const BRAND_COLORS = {\n gemini: '#8E75B2',\n claude: '#D97757',\n openai: '#10a37f',\n chrome: '#4285F4',\n edge: '#0078D7',\n} as const\n\nexport const UI_PATHS = {\n trash: 'M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M10 11v6M14 11v6',\n plus: 'M12 5v14M5 12h14',\n refresh: 'M21.5 2v6h-6M2.5 22v-6h6M2.5 11.5a10 10 0 0 1 17.5-4.5l1.5 2M21.5 12.5a10 10 0 0 1-17.5 4.5l-1.5-2',\n star: 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z',\n mail: 'M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2zM22 6l-10 7L2 6',\n globe: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zM2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z',\n zap: 'M13 2L3 14h9l-1 8 10-12h-9l1-8z',\n chevronDown: 'M6 9l6 6 6-6',\n chevronUp: 'M18 15l-6-6-6 6',\n check: 'M20 6L9 17l-5-5',\n x: 'M18 6L6 18M6 6l12 12',\n externalLink: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3',\n alert: 'M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0zM12 9v4M12 17h.01',\n move: 'M9 5h.01M9 12h.01M9 19h.01M15 5h.01M15 12h.01M15 19h.01',\n arrowUp: 'M12 19V5M5 12l7-7 7 7',\n arrowDown: 'M12 5v14M19 12l-7 7-7-7',\n power: 'M18.36 6.64a9 9 0 1 1-12.73 0M12 2v10',\n flame: 'M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z',\n} as const\n\n", "/**\n * Locale plumbing for the built-in AGY console.\n *\n * Ported from dsh-agy-worker (`src/client/index.ts`), MIT License,\n * Copyright (c) 2026 dsh-agy-worker contributors. See docs/ATTRIBUTION-AGY.md.\n *\n * Fusion's client entry already follows DSH's `ctx.locale` for its own copy. This\n * module gives the ported console the same service without making it a hard\n * dependency: when no locale service was bound, the console falls back to the\n * browser language over its own dictionaries \u2014 which is what the standalone\n * plugin did on a host without `dsh-client-locale`.\n */\nimport { useEffect, useState } from 'react'\nimport { NS, en, zh, type AgyLocaleKey } from './locales.js'\n\n/** The slice of DSH's client locale service this console uses. */\nexport interface AgyLocaleSource {\n /** Bind the `agy-worker` namespace to a `(key, params) => string` translator. */\n bind(namespace: string): (key: string, params?: Record<string, unknown>) => string\n /** Contribute one language's dictionary under a namespace. */\n register(namespace: string, language: string, dictionary: Record<string, string>): () => void\n /** Add a language the Host catalog does not own yet. */\n addLanguage(language: { id: string; label: string; fallback: string }): () => void\n /** Subscribe to language/dictionary changes. */\n subscribe(listener: () => void): () => void\n /** Current catalog snapshot, when the service exposes one. */\n getSnapshot?(): { locales?: readonly { id: string }[] }\n}\n\nlet bound: AgyLocaleSource | undefined\nconst listeners = new Set<() => void>()\nconst notify = (): void => { for (const listener of [...listeners]) listener() }\n\n/** Bind the Host locale service; returns the disposer the client entry owns. */\nexport function bindAgyLocale(source: AgyLocaleSource): () => void {\n bound = source\n notify()\n return () => {\n if (bound !== source) return\n bound = undefined\n notify()\n }\n}\n\nconst activeLanguage = (): 'zh' | 'en' =>\n (typeof navigator === 'undefined' ? 'en' : navigator.language).toLowerCase().startsWith('zh') ? 'zh' : 'en'\n\n/** The fallback translator: the console's own dictionaries, no Host service. */\nfunction fallbackTranslate(key: AgyLocaleKey, params?: Record<string, unknown>): string {\n const dictionary = (activeLanguage() === 'zh' ? zh : en) as Record<string, string>\n const template = dictionary[key] ?? (en as Record<string, string>)[key] ?? key\n if (params === undefined) return template\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) =>\n params[name] === undefined ? match : String(params[name]))\n}\n\n/** The console's translator: Host locale when bound, browser language otherwise. */\nexport function useAgyTranslation(): (key: AgyLocaleKey, params?: Record<string, unknown>) => string {\n const [, rerender] = useState(0)\n useEffect(() => {\n const listener = () => rerender(revision => revision + 1)\n listeners.add(listener)\n const unsubscribe = bound?.subscribe(listener)\n return () => {\n listeners.delete(listener)\n unsubscribe?.()\n }\n }, [])\n if (bound === undefined) return fallbackTranslate\n const translate = bound.bind(NS)\n return (key: AgyLocaleKey, params?: Record<string, unknown>) => {\n const text = translate(key, params)\n return text === key ? fallbackTranslate(key, params) : text\n }\n}\n", "/**\n * Native DSH locale dictionaries for the Antigravity console.\n *\n * Ported from dsh-agy-worker (`src/client/locales.ts`), MIT License,\n * Copyright (c) 2026 dsh-agy-worker contributors; see docs/ATTRIBUTION-AGY.md.\n * The namespace id and every key are unchanged, so translated copy and the\n * Host-facing registrations that name the namespace keep working.\n */\nexport const NS = 'agy-worker'\n\n/** Simplified Chinese is preserved as the original UI language and key source. */\nexport const zh = {\n 'section.label': 'Antigravity',\n 'code.title': '\u4EE3\u7801', 'code.inspect': '\u68C0\u67E5',\n 'tv.command': '\u547D\u4EE4', 'tv.write': '\u5199\u5165', 'tv.edit': '\u7F16\u8F91', 'tv.read': '\u8BFB\u53D6', 'tv.search': '\u641C\u7D22', 'tv.webSearch': '\u7F51\u9875\u641C\u7D22', 'tv.list': '\u5217\u8868', 'tv.delete': '\u5220\u9664', 'tv.tool': '\u5DE5\u5177',\n 'tv.noOutput': '(\u65E0\u8F93\u51FA)', 'tv.noMatches': '(\u65E0\u5339\u914D)', 'tv.noChanges': '(\u65E0\u6587\u672C\u53D8\u66F4)', 'tv.emptyDir': '(\u7A7A\u76EE\u5F55)', 'tv.noDetail': '(\u65E0\u8BE6\u60C5)',\n 'tv.hint.expandInspect': '\u70B9\u51FB\u5C55\u5F00 \u00B7 \u53F3\u952E\u68C0\u67E5', 'tv.hint.collapseInspect': '\u70B9\u51FB\u6536\u8D77 \u00B7 \u53F3\u952E\u68C0\u67E5', 'tv.hint.expand': '\u70B9\u51FB\u5C55\u5F00', 'tv.hint.collapse': '\u70B9\u51FB\u6536\u8D77',\n 'tv.diffMore': '\u2026 \u5176\u4F59 {count} \u884C\u672A\u6E32\u67D3',\n 'code.copy': '\u590D\u5236', 'code.copied': '\u5DF2\u590D\u5236',\n 'console.title': 'Antigravity \u7BA1\u7406\u63A7\u5236\u53F0',\n 'status.ready': '\u5C31\u7EEA', 'status.needsAuth': '\u5F85\u8BA4\u8BC1', 'status.loading': '\u6B63\u5728\u52A0\u8F7D Antigravity \u72B6\u6001...',\n 'status.authRequired': '\u9700\u91CD\u65B0\u767B\u5F55', 'account.setActive': '\u8BBE\u4E3A\u5F53\u524D\u4F7F\u7528', 'account.settingActive': '\u5207\u6362\u4E2D', 'account.activeSet': '\u5DF2\u5207\u6362\u5F53\u524D\u4F7F\u7528\u8D26\u53F7', 'account.activeSetFailed': '\u8BE5\u8D26\u53F7\u5F53\u524D\u4E0D\u53EF\u7528\uFF08\u51B7\u5374\u6216\u9700\u91CD\u65B0\u767B\u5F55\uFF09', 'status.proxy': '\u4EE3\u7406', 'status.inUse': '\u5F53\u524D\u4F7F\u7528',\n 'account.add': '\u6DFB\u52A0 Google \u8D26\u53F7', 'account.aliasDefault': '\u5907\u7528 Google \u8D26\u53F7 {number}', 'account.defaultAlias': '\u4E3B\u8D26\u53F7\uFF08\u7CFB\u7EDF\u767B\u5F55\uFF09',\n 'account.proxyPlaceholder': '\u4E13\u5C5E\u4EE3\u7406 URL\uFF08\u5982 http://127.0.0.1:7890\uFF0C\u7559\u7A7A\u5219\u7EE7\u627F\u5168\u5C40\uFF09', 'account.aliasPlaceholder': '\u8D26\u53F7\u522B\u540D\uFF08\u4F8B\u5982\uFF1A\u5907\u7528\u8D26\u53F7 2\uFF09', 'account.removeTitle': '\u79FB\u9664\u6B64\u8D26\u53F7',\n 'aria.aliasInput': '\u8D26\u53F7\u522B\u540D', 'aria.proxyInput': '\u4E13\u5C5E\u4EE3\u7406 URL', 'aria.authCodeInput': '\u6388\u6743\u7801\u6216\u56DE\u8C03 URL', 'aria.closeToast': '\u5173\u95ED\u63D0\u793A',\n 'account.details': '\u660E\u7EC6', 'account.collapse': '\u6536\u8D77',\n 'account.expandOthers': '\u5C55\u5F00\u67E5\u770B Claude & GPT-OSS \u6A21\u578B\u989D\u5EA6', 'account.collapseOthers': '\u6536\u8D77 Claude & GPT-OSS \u6A21\u578B\u989D\u5EA6', 'account.otherModels': 'Claude / GPT \u989D\u5EA6',\n 'account.sync': '\u540C\u6B65', 'account.syncing': '\u540C\u6B65\u4E2D', 'account.syncTitle': '\u5237\u65B0\u6B64\u8D26\u53F7\uFF08\u6362\u53F7\u540E\u7ACB\u5373\u540C\u6B65 email / \u989D\u5EA6 / \u6A21\u578B\uFF09',\n 'account.models': '\u5355\u6A21\u578B\u660E\u7EC6\uFF1A', 'account.cooldown': '\u90E8\u5206\u6A21\u578B\u9650\u6D41\u4E2D\uFF0C\u5DF2\u81EA\u52A8\u5207\u6362\u8D26\u53F7', 'account.clearCooldown': '\u6E05\u9664\u51B7\u5374',\n 'account.localCooldown': ' \u00B7 \u672C\u5730\u51B7\u5374\u4E2D', 'account.removed': '\u5DF2\u79FB\u9664\u8D26\u53F7\uFF1A{alias}',\n 'quota.fiveHour': '5 \u5C0F\u65F6\u989D\u5EA6', 'quota.weekly': '\u5468\u989D\u5EA6', 'quota.refreshed': '\u989D\u5EA6\u5DF2\u5237\u65B0', 'quota.windowReset': '\u5DF2\u91CD\u7F6E \u00B7 \u53EF\u7528',\n 'proxy.button': '\u4EE3\u7406', 'proxy.placeholder': '\u4E13\u5C5E\u4EE3\u7406 URL\uFF08\u5982\uFF1Ahttp://127.0.0.1:7890\uFF1B\u7559\u7A7A\u5219\u4F7F\u7528\u5168\u5C40\uFF09',\n 'proxy.save': '\u4FDD\u5B58', 'proxy.saved': '\u4EE3\u7406\u5DF2\u4FDD\u5B58', 'cancel': '\u53D6\u6D88',\n 'auth.openBrowser': '\u6253\u5F00\u6D4F\u89C8\u5668\u767B\u5F55', 'auth.openingBrowser': '\u6B63\u5728\u6253\u5F00\u6D4F\u89C8\u5668...',\n 'auth.browserOpened': '\u6D4F\u89C8\u5668\u5DF2\u6253\u5F00 Google \u6388\u6743\u9875\uFF0C\u5B8C\u6210\u6388\u6743\u540E\u5C06\u81EA\u52A8\u540C\u6B65',\n 'auth.browserManual': '\u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u70B9\u51FB\u4E0B\u65B9\u94FE\u63A5\u624B\u52A8\u5B8C\u6210\u6388\u6743',\n 'auth.startFailed': '\u65E0\u6CD5\u542F\u52A8 Google \u6388\u6743\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u4EE3\u7406\u914D\u7F6E\u3002', 'auth.networkHint': '\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u4EE3\u7406\u914D\u7F6E',\n 'auth.activated': '\u8D26\u53F7\u5DF2\u6FC0\u6D3B\u5165\u6C60', 'auth.failed': '\u6388\u6743\u5931\u8D25', 'auth.added': '\u6210\u529F\u6DFB\u52A0\u5E76\u6FC0\u6D3B Google \u8D26\u53F7',\n 'auth.codeFailed': '\u6388\u6743\u7801\u9A8C\u8BC1\u5931\u8D25', 'auth.exchanging': '\u6B63\u5728\u9A8C\u8BC1\u6388\u6743\u5E76\u6FC0\u6D3B\u8D26\u53F7\uFF0C\u8BF7\u7A0D\u5019...',\n 'auth.waiting': '\u7B49\u5F85\u6D4F\u89C8\u5668\u4E2D\u5B8C\u6210 Google \u6388\u6743\uFF0C\u6210\u529F\u540E\u5C06\u81EA\u52A8\u6FC0\u6D3B\u3002',\n 'auth.openManual': '\u82E5\u6D4F\u89C8\u5668\u672A\u6253\u5F00\uFF0C\u8BF7\u70B9\u51FB\u6B64\u5904\u624B\u52A8\u6253\u5F00 Google \u767B\u5F55\u9875',\n 'auth.pasteHint': '\u672A\u5B8C\u6210\u81EA\u52A8\u56DE\u8C03\u65F6\uFF0C\u53EF\u7C98\u8D34\u6388\u6743\u7801\u6216\u56DE\u8C03 URL\uFF1A',\n 'auth.codePlaceholder': '\u6388\u6743\u7801\u6216 http://localhost:51121/oauth-callback?code=... \u5B8C\u6574\u94FE\u63A5',\n 'auth.activate': '\u624B\u52A8\u6FC0\u6D3B', 'auth.activating': '\u9A8C\u8BC1\u6FC0\u6D3B\u4E2D...',\n 'auth.code.browser_manual': '\u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u4F7F\u7528\u4E0B\u65B9\u94FE\u63A5\u624B\u52A8\u6388\u6743\u3002', 'auth.code.callback_failed': '\u6388\u6743\u56DE\u8C03\u5931\u8D25\u3002\u8BF7\u91CD\u65B0\u5F00\u59CB\u6388\u6743\u3002',\n 'auth.code.no_active_flow': '\u5F53\u524D\u6CA1\u6709\u8FDB\u884C\u4E2D\u7684\u6388\u6743\u6D41\u7A0B\u3002', 'auth.code.invalid_code': '\u65E0\u6CD5\u8BC6\u522B\u6388\u6743\u7801\u3002\u8BF7\u7C98\u8D34\u6388\u6743\u7801\u6216\u5B8C\u6574\u56DE\u8C03 URL\u3002',\n 'auth.code.invalid_state': '\u6388\u6743\u94FE\u63A5\u4E0D\u5C5E\u4E8E\u5F53\u524D\u6D41\u7A0B\u6216\u5DF2\u8FC7\u671F\u3002\u8BF7\u91CD\u65B0\u5F00\u59CB\u6388\u6743\u3002', 'auth.code.exchange_failed': '\u6388\u6743\u9A8C\u8BC1\u5931\u8D25\u3002\u8BF7\u91CD\u65B0\u5F00\u59CB\u6388\u6743\u3002',\n 'auth.code.primary_activated': '\u4E3B\u8D26\u53F7\u5DF2\u767B\u5F55\u3002', 'auth.code.account_activated': '\u8D26\u53F7\u5DF2\u6DFB\u52A0\u5E76\u6FC0\u6D3B\u3002', 'auth.code.missing_code': '\u8BF7\u8F93\u5165\u6388\u6743\u7801\u3002',\n 'auth.code.request_failed': '\u8BF7\u6C42\u672A\u5B8C\u6210\u3002\u8BF7\u91CD\u8BD5\u3002', 'api.genericError': '\u64CD\u4F5C\u672A\u5B8C\u6210\u3002\u8BF7\u91CD\u8BD5\u3002',\n 'duration.day': '\u5929', 'duration.hour': '\u5C0F\u65F6', 'duration.minute': '\u5206\u949F',\n 'permission.label': '\u6743\u9650\u6A21\u5F0F\uFF1A', 'permission.plan': 'plan\uFF08\u53EA\u8BFB\uFF09', 'permission.acceptEdits': 'accept-edits\uFF08\u6539\u4EE3\u7801\uFF09', 'permission.skip': 'skip\uFF08\u81EA\u52A8\u6279\u51C6\uFF1BAGY \u5185\u90E8\u4FDD\u62A4\u4ECD\u751F\u6548\uFF09',\n 'effort.label': '\u601D\u8003\u5F3A\u5EA6\uFF1A', 'effort.auto': 'auto', 'effort.low': 'low', 'effort.medium': 'medium', 'effort.high': 'high',\n 'pool.label': '\u53F7\u6C60\u8C03\u5EA6\uFF1A', 'pool.sequential': '\u987A\u6B21\u8017\u5C3D', 'pool.roundRobin': '\u8F6E\u8BE2\u5747\u8861',\n 'models.label': '\u6A21\u578B\u663E\u793A\uFF1A', 'models.empty': '\u6A21\u578B\u76EE\u5F55\u8FD8\u6CA1\u6709\u53EF\u7528\u6A21\u578B\uFF0C\u53D1\u4E00\u6B21\u5BF9\u8BDD\u6216\u70B9\u201C\u5237\u65B0\u989D\u5EA6\u201D\u540E\u518D\u6765\u7BA1\u7406',\n 'models.hint': '\u70B9\u51FB\u5207\u6362\u663E\u793A/\u9690\u85CF\uFF1B\u5173\u95ED\u7684\u6A21\u578B\u4E0D\u5728\u6A21\u578B\u9009\u62E9\u5668\u4E2D\u5217\u51FA\uFF0C\u8FDB\u884C\u4E2D\u7684\u4F1A\u8BDD\u4E0D\u53D7\u5F71\u54CD\u3002',\n 'header.refreshQuota': '\u5237\u65B0\u989D\u5EA6', 'header.refreshing': '\u5237\u65B0\u4E2D',\n 'console.close': '\u5173\u95ED\uFF08Esc\uFF09', 'header.badgeTitle': 'Antigravity\uFF1A{count} \u4E2A\u8D26\u53F7\u5DF2\u5C31\u7EEA \u00B7 \u70B9\u51FB\u6253\u5F00\u63A7\u5236\u53F0', 'header.badgeLoading': 'Antigravity \u00B7 \u70B9\u51FB\u6253\u5F00\u63A7\u5236\u53F0',\n 'account.type.agy': 'Google Antigravity (CLI / OAuth)',\n 'account.loginType': '\u767B\u5F55\u65B9\u5F0F\uFF1A',\n 'account.dragHandle': '\u62D6\u62FD\u8C03\u6574\u4F18\u5148\u7EA7',\n 'account.moveUp': '\u4E0A\u79FB\u4F18\u5148\u7EA7',\n 'account.moveDown': '\u4E0B\u79FB\u4F18\u5148\u7EA7',\n 'account.reordered': '\u8D26\u53F7\u4F18\u5148\u7EA7\u987A\u5E8F\u5DF2\u66F4\u65B0',\n 'account.collapseAll': '\u5168\u90E8\u6298\u53E0',\n 'account.expandAll': '\u5168\u90E8\u5C55\u5F00',\n 'account.cardCollapse': '\u6536\u8D77\u8BE6\u60C5',\n 'account.cardExpand': '\u5C55\u5F00\u8BE6\u60C5',\n 'account.draggingTarget': '\u653E\u7F6E\u81F3\u6B64\u6210\u4E3A\u4F18\u5148\u7EA7 #{num}',\n 'account.dragBanner': '\u6B63\u5728\u8C03\u6574\u4F18\u5148\u7EA7\uFF1A\u5C06\u3010{alias}\u3011\u79FB\u52A8\u81F3 #{num}',\n 'account.dragHint': '\u62D6\u62FD\u5361\u7247\u53EF\u5B9E\u65F6\u8C03\u6574\u8C03\u5EA6\u4F18\u5148\u7EA7',\n 'account.enable': '\u542F\u7528',\n 'account.disable': '\u505C\u7528',\n 'account.enableTitle': '\u542F\u7528\u6B64\u8D26\u53F7\uFF08\u52A0\u5165\u81EA\u52A8\u5207\u53F7\u4E0E\u8C03\u5EA6\uFF09',\n 'account.disableTitle': '\u505C\u7528\u6B64\u8D26\u53F7\uFF08\u5207\u53F7\u4E0E\u8C03\u5EA6\u65F6\u8DF3\u8FC7\uFF09',\n 'account.enabledToast': '\u5DF2\u542F\u7528\u8D26\u53F7\uFF1A{alias}',\n 'account.disabledToast': '\u5DF2\u505C\u7528\u8D26\u53F7\uFF1A{alias}',\n 'status.disabled': '\u5DF2\u505C\u7528',\n 'header.warmup': '\u4E00\u952E\u9884\u70ED',\n 'header.warmingUp': '\u9884\u70ED\u4E2D',\n 'account.warmup': '\u9884\u70ED',\n 'account.warmingUp': '\u9884\u70ED\u4E2D',\n 'account.warmupTitle': '\u9884\u70ED\u8BE5\u8D26\u53F7\uFF08\u5411 Google \u53D1\u9001\u6781\u5C0F\u63A2\u6D3B\u8BF7\u6C42\uFF0C\u63D0\u524D\u6FC0\u6D3B 7 \u5929\u5468\u914D\u989D\u8BA1\u65F6\u5668\uFF09',\n 'warmup.success': '\u8D26\u53F7\u9884\u70ED\u6210\u529F',\n 'warmup.allSuccess': '\u4E00\u952E\u9884\u70ED\u4EFB\u52A1\u5DF2\u5B8C\u6210',\n 'warmup.skipped': '\u5F53\u524D\u8D26\u53F7\u6216\u6A21\u578B\u5904\u4E8E\u51B7\u5374\u4E2D\uFF0C\u65E0\u9700\u9884\u70ED',\n 'config.autoWarmup': '7\u5929\u5468\u914D\u989D\u81EA\u52A8\u9884\u70ED',\n 'config.autoWarmupDesc': '\u5468\u914D\u989D\u5230\u8FBE\u91CD\u7F6E\u65F6\u95F4\u6216\u51B7\u542F\u52A8\u65F6\u81EA\u52A8\u5524\u9192 1 \u6B21\u542F\u52A8\u65B0\u5468\u671F',\n} as const\n\nexport type AgyLocaleKey = keyof typeof zh\nexport type AgyDictionary = Record<AgyLocaleKey, string>\n\nexport const en: AgyDictionary = {\n 'section.label': 'Antigravity', 'console.title': 'Antigravity Management Console',\n 'code.title': 'Code', 'code.inspect': 'Inspect',\n 'tv.command': 'Command', 'tv.write': 'Write', 'tv.edit': 'Edit', 'tv.read': 'Read', 'tv.search': 'Search', 'tv.webSearch': 'Web Search', 'tv.list': 'List', 'tv.delete': 'Delete', 'tv.tool': 'Tool',\n 'tv.noOutput': '(no output)', 'tv.noMatches': '(no matches)', 'tv.noChanges': '(no textual changes)', 'tv.emptyDir': '(empty directory)', 'tv.noDetail': '(no detail)',\n 'tv.hint.expandInspect': 'Click to expand \u00B7 right-click to inspect', 'tv.hint.collapseInspect': 'Click to collapse \u00B7 right-click to inspect', 'tv.hint.expand': 'Click to expand', 'tv.hint.collapse': 'Click to collapse',\n 'tv.diffMore': '\u2026 {count} more lines not rendered',\n 'code.copy': 'Copy', 'code.copied': 'Copied',\n 'status.ready': 'Ready', 'status.needsAuth': 'Authentication required', 'status.loading': 'Loading Antigravity status...',\n 'status.authRequired': 'Sign in again required', 'account.setActive': 'Set as in use', 'account.settingActive': 'Switching...', 'account.activeSet': 'Active account switched', 'account.activeSetFailed': 'Account not currently eligible (cooldown or auth required)', 'status.proxy': 'Proxy', 'status.inUse': 'In use',\n 'account.add': 'Add Google account', 'account.aliasDefault': 'Backup Google account {number}', 'account.defaultAlias': 'Primary account (system sign-in)',\n 'account.proxyPlaceholder': 'Dedicated proxy URL (e.g. http://127.0.0.1:7890; leave blank to inherit global)', 'account.aliasPlaceholder': 'Account alias (for example: Backup account 2)', 'account.removeTitle': 'Remove this account',\n 'aria.aliasInput': 'Account alias', 'aria.proxyInput': 'Dedicated proxy URL', 'aria.authCodeInput': 'Authorization code or callback URL', 'aria.closeToast': 'Dismiss notification',\n 'account.details': 'Details', 'account.collapse': 'Collapse',\n 'account.expandOthers': 'Expand Claude & GPT-OSS quotas', 'account.collapseOthers': 'Collapse Claude & GPT-OSS quotas', 'account.otherModels': 'Claude / GPT quotas',\n 'account.sync': 'Sync', 'account.syncing': 'Syncing...', 'account.syncTitle': 'Refresh this account (sync email, quota, and models after switching accounts)',\n 'account.models': 'Per-model details:', 'account.cooldown': 'Some models are rate-limited; the account was switched automatically', 'account.clearCooldown': 'Clear cooldown',\n 'account.localCooldown': ' \u00B7 local cooldown active', 'account.removed': 'Account removed: {alias}',\n 'quota.fiveHour': '5-hour quota', 'quota.weekly': 'Weekly quota', 'quota.refreshed': 'Quota refreshed', 'quota.windowReset': 'Reset \u00B7 available',\n 'proxy.button': 'Proxy', 'proxy.placeholder': 'Dedicated proxy URL (for example: http://127.0.0.1:7890; leave blank to use the global proxy)',\n 'proxy.save': 'Save', 'proxy.saved': 'Proxy saved', 'cancel': 'Cancel',\n 'auth.openBrowser': 'Open browser to sign in', 'auth.openingBrowser': 'Opening browser...',\n 'auth.browserOpened': 'The Google authorization page opened in your browser and will sync automatically after authorization',\n 'auth.browserManual': 'The browser could not be opened automatically; use the link below to authorize manually',\n 'auth.startFailed': 'Could not start Google authorization. Check your network or proxy configuration.', 'auth.networkHint': 'Check your network or proxy configuration',\n 'auth.activated': 'Account activated in the pool', 'auth.failed': 'Authorization failed', 'auth.added': 'Google account added and activated',\n 'auth.codeFailed': 'Authorization code validation failed', 'auth.exchanging': 'Verifying authorization and activating the account; please wait...',\n 'auth.waiting': 'Complete Google authorization in the browser. The account will activate automatically.',\n 'auth.openManual': 'If the browser did not open, click here to open the Google sign-in page manually',\n 'auth.pasteHint': 'If the automatic callback did not complete, paste the authorization code or callback URL:',\n 'auth.codePlaceholder': 'Authorization code or full http://localhost:51121/oauth-callback?code=... URL',\n 'auth.activate': 'Activate manually', 'auth.activating': 'Verifying and activating...',\n 'auth.code.browser_manual': 'The browser could not be opened automatically; use the link below to authorize manually.', 'auth.code.callback_failed': 'The authorization callback failed. Start authorization again.',\n 'auth.code.no_active_flow': 'There is no active authorization flow.', 'auth.code.invalid_code': 'The authorization code was not recognized. Paste the code or full callback URL.',\n 'auth.code.invalid_state': 'The authorization link does not belong to this flow or has expired. Start authorization again.', 'auth.code.exchange_failed': 'Authorization verification failed. Start authorization again.',\n 'auth.code.primary_activated': 'Primary account signed in.', 'auth.code.account_activated': 'Account added and activated.', 'auth.code.missing_code': 'Enter an authorization code.',\n 'auth.code.request_failed': 'The request did not complete. Try again.', 'api.genericError': 'The operation did not complete. Try again.',\n 'duration.day': 'd', 'duration.hour': 'h', 'duration.minute': 'm',\n 'permission.label': 'Permission mode:', 'permission.plan': 'plan (read-only)', 'permission.acceptEdits': 'accept-edits (edit code)', 'permission.skip': 'skip (auto-approve; AGY internal protections remain)',\n 'effort.label': 'Thinking effort:', 'effort.auto': 'auto', 'effort.low': 'low', 'effort.medium': 'medium', 'effort.high': 'high',\n 'pool.label': 'Account-pool scheduling:', 'pool.sequential': 'Use sequentially', 'pool.roundRobin': 'Round-robin',\n 'models.label': 'Model visibility:', 'models.empty': 'No models in the catalog yet \u2014 send a message or click \"Refresh quota\", then come back to manage them',\n 'models.hint': 'Click to show/hide. Hidden models are not listed in the model picker; ongoing sessions are unaffected.',\n 'header.refreshQuota': 'Refresh quota', 'header.refreshing': 'Refreshing...',\n 'console.close': 'Close (Esc)', 'header.badgeTitle': 'Antigravity: {count} accounts ready \u00B7 click to open the console', 'header.badgeLoading': 'Antigravity \u00B7 click to open the console',\n 'account.type.agy': 'Google Antigravity (CLI / OAuth)',\n 'account.loginType': 'Login Method:',\n 'account.dragHandle': 'Drag to reorder priority',\n 'account.moveUp': 'Move up priority',\n 'account.moveDown': 'Move down priority',\n 'account.reordered': 'Account priorities reordered successfully',\n 'account.collapseAll': 'Collapse all',\n 'account.expandAll': 'Expand all',\n 'account.cardCollapse': 'Collapse',\n 'account.cardExpand': 'Expand details',\n 'account.draggingTarget': 'Drop here to set priority #{num}',\n 'account.dragBanner': 'Reordering: moving [{alias}] to priority #{num}',\n 'account.dragHint': 'Drag cards to reorder scheduling priority in real time',\n 'account.enable': 'Enable',\n 'account.disable': 'Disable',\n 'account.enableTitle': 'Enable this account (include in rotation)',\n 'account.disableTitle': 'Disable this account (skip in rotation)',\n 'account.enabledToast': 'Account enabled: {alias}',\n 'account.disabledToast': 'Account disabled: {alias}',\n 'status.disabled': 'Disabled',\n 'header.warmup': 'Auto Warmup',\n 'header.warmingUp': 'Warming up...',\n 'account.warmup': 'Warmup',\n 'account.warmingUp': 'Warming up...',\n 'account.warmupTitle': 'Warm up this account (trigger 7-day weekly reset timer)',\n 'warmup.success': 'Account warmed up successfully',\n 'warmup.allSuccess': 'Warmup completed for all accounts',\n 'warmup.skipped': 'Account or model is in cooldown, no warmup needed',\n 'config.autoWarmup': '7-Day Quota Auto-Warmup',\n 'config.autoWarmupDesc': 'Automatically trigger a 1-token probe when weekly reset time is reached',\n}\n\nexport const ptBR: AgyDictionary = {\n 'section.label': 'Antigravity', 'console.title': 'Console de gerenciamento do Antigravity',\n 'code.title': 'C\u00F3digo', 'code.inspect': 'Inspecionar',\n 'tv.command': 'Comando', 'tv.write': 'Escrever', 'tv.edit': 'Editar', 'tv.read': 'Ler', 'tv.search': 'Buscar', 'tv.webSearch': 'Busca na web', 'tv.list': 'Listar', 'tv.delete': 'Excluir', 'tv.tool': 'Ferramenta',\n 'tv.noOutput': '(sem sa\u00EDda)', 'tv.noMatches': '(nenhuma correspond\u00EAncia)', 'tv.noChanges': '(sem altera\u00E7\u00F5es de texto)', 'tv.emptyDir': '(diret\u00F3rio vazio)', 'tv.noDetail': '(sem detalhes)',\n 'tv.hint.expandInspect': 'Clique para expandir \u00B7 clique direito para inspecionar', 'tv.hint.collapseInspect': 'Clique para recolher \u00B7 clique direito para inspecionar', 'tv.hint.expand': 'Clique para expandir', 'tv.hint.collapse': 'Clique para recolher',\n 'tv.diffMore': '\u2026 {count} linhas restantes n\u00E3o renderizadas',\n 'code.copy': 'Copiar', 'code.copied': 'Copiado',\n 'status.ready': 'Pronto', 'status.needsAuth': 'Autentica\u00E7\u00E3o necess\u00E1ria', 'status.loading': 'Carregando o status do Antigravity...',\n 'status.authRequired': '\u00C9 necess\u00E1rio entrar novamente', 'account.setActive': 'Definir como em uso', 'account.settingActive': 'Alternando...', 'account.activeSet': 'Conta em uso alterada', 'account.activeSetFailed': 'Conta n\u00E3o eleg\u00EDvel no momento (cooldown ou login necess\u00E1rio)', 'status.proxy': 'Proxy', 'status.inUse': 'Em uso',\n 'account.add': 'Adicionar conta Google', 'account.aliasDefault': 'Conta Google reserva {number}', 'account.defaultAlias': 'Conta principal (login do sistema)',\n 'account.proxyPlaceholder': 'URL de proxy dedicada (ex.: http://127.0.0.1:7890; deixe vazio para herdar a global)', 'account.aliasPlaceholder': 'Apelido da conta (por exemplo: Conta reserva 2)', 'account.removeTitle': 'Remover esta conta',\n 'aria.aliasInput': 'Apelido da conta', 'aria.proxyInput': 'URL do proxy exclusivo', 'aria.authCodeInput': 'C\u00F3digo de autoriza\u00E7\u00E3o ou URL de retorno', 'aria.closeToast': 'Fechar notifica\u00E7\u00E3o',\n 'account.details': 'Detalhes', 'account.collapse': 'Recolher',\n 'account.expandOthers': 'Expandir cotas Claude e GPT-OSS', 'account.collapseOthers': 'Recolher cotas Claude e GPT-OSS', 'account.otherModels': 'Cotas Claude / GPT',\n 'account.sync': 'Sincronizar', 'account.syncing': 'Sincronizando...', 'account.syncTitle': 'Atualizar esta conta (sincroniza e-mail, cota e modelos depois de trocar de conta)',\n 'account.models': 'Detalhes por modelo:', 'account.cooldown': 'Alguns modelos est\u00E3o limitados; a conta foi alternada automaticamente', 'account.clearCooldown': 'Limpar espera',\n 'account.localCooldown': ' \u00B7 espera local ativa', 'account.removed': 'Conta removida: {alias}',\n 'quota.fiveHour': 'Cota de 5 horas', 'quota.weekly': 'Cota semanal', 'quota.refreshed': 'Cota atualizada', 'quota.windowReset': 'Redefinida \u00B7 dispon\u00EDvel',\n 'proxy.button': 'Proxy', 'proxy.placeholder': 'URL do proxy exclusivo (por exemplo: http://127.0.0.1:7890; deixe vazio para usar o proxy global)',\n 'proxy.save': 'Salvar', 'proxy.saved': 'Proxy salvo', 'cancel': 'Cancelar',\n 'auth.openBrowser': 'Abrir navegador para entrar', 'auth.openingBrowser': 'Abrindo navegador...',\n 'auth.browserOpened': 'A p\u00E1gina de autoriza\u00E7\u00E3o do Google foi aberta no navegador e ser\u00E1 sincronizada ap\u00F3s a autoriza\u00E7\u00E3o',\n 'auth.browserManual': 'N\u00E3o foi poss\u00EDvel abrir o navegador automaticamente; use o link abaixo para autorizar manualmente',\n 'auth.startFailed': 'N\u00E3o foi poss\u00EDvel iniciar a autoriza\u00E7\u00E3o do Google. Verifique a configura\u00E7\u00E3o de rede ou proxy.', 'auth.networkHint': 'Verifique a configura\u00E7\u00E3o de rede ou proxy',\n 'auth.activated': 'Conta ativada no pool', 'auth.failed': 'Falha na autoriza\u00E7\u00E3o', 'auth.added': 'Conta Google adicionada e ativada',\n 'auth.codeFailed': 'Falha ao validar o c\u00F3digo de autoriza\u00E7\u00E3o', 'auth.exchanging': 'Verificando a autoriza\u00E7\u00E3o e ativando a conta; aguarde...',\n 'auth.waiting': 'Conclua a autoriza\u00E7\u00E3o do Google no navegador. A conta ser\u00E1 ativada automaticamente.',\n 'auth.openManual': 'Se o navegador n\u00E3o abriu, clique aqui para abrir manualmente a p\u00E1gina de login do Google',\n 'auth.pasteHint': 'Se o retorno autom\u00E1tico n\u00E3o foi conclu\u00EDdo, cole o c\u00F3digo de autoriza\u00E7\u00E3o ou a URL de retorno:',\n 'auth.codePlaceholder': 'C\u00F3digo de autoriza\u00E7\u00E3o ou URL completa http://localhost:51121/oauth-callback?code=...',\n 'auth.activate': 'Ativar manualmente', 'auth.activating': 'Verificando e ativando...',\n 'auth.code.browser_manual': 'N\u00E3o foi poss\u00EDvel abrir o navegador automaticamente; use o link abaixo para autorizar manualmente.', 'auth.code.callback_failed': 'O retorno da autoriza\u00E7\u00E3o falhou. Inicie a autoriza\u00E7\u00E3o novamente.',\n 'auth.code.no_active_flow': 'N\u00E3o h\u00E1 um fluxo de autoriza\u00E7\u00E3o em andamento.', 'auth.code.invalid_code': 'O c\u00F3digo de autoriza\u00E7\u00E3o n\u00E3o foi reconhecido. Cole o c\u00F3digo ou a URL completa de retorno.',\n 'auth.code.invalid_state': 'O link de autoriza\u00E7\u00E3o n\u00E3o pertence a este fluxo ou expirou. Inicie a autoriza\u00E7\u00E3o novamente.', 'auth.code.exchange_failed': 'A valida\u00E7\u00E3o da autoriza\u00E7\u00E3o falhou. Inicie a autoriza\u00E7\u00E3o novamente.',\n 'auth.code.primary_activated': 'Conta principal conectada.', 'auth.code.account_activated': 'Conta adicionada e ativada.', 'auth.code.missing_code': 'Informe um c\u00F3digo de autoriza\u00E7\u00E3o.',\n 'auth.code.request_failed': 'A solicita\u00E7\u00E3o n\u00E3o foi conclu\u00EDda. Tente novamente.', 'api.genericError': 'A opera\u00E7\u00E3o n\u00E3o foi conclu\u00EDda. Tente novamente.',\n 'duration.day': 'd', 'duration.hour': 'h', 'duration.minute': 'min',\n 'permission.label': 'Modo de permiss\u00E3o:', 'permission.plan': 'plan (somente leitura)', 'permission.acceptEdits': 'accept-edits (editar c\u00F3digo)', 'permission.skip': 'skip (aprova\u00E7\u00E3o autom\u00E1tica; prote\u00E7\u00F5es internas do AGY permanecem)',\n 'effort.label': 'Intensidade de racioc\u00EDnio:', 'effort.auto': 'auto', 'effort.low': 'low', 'effort.medium': 'medium', 'effort.high': 'high',\n 'pool.label': 'Agendamento do pool de contas:', 'pool.sequential': 'Usar em sequ\u00EAncia', 'pool.roundRobin': 'Rod\u00EDzio',\n 'models.label': 'Visibilidade dos modelos:', 'models.empty': 'Ainda n\u00E3o h\u00E1 modelos no cat\u00E1logo \u2014 envie uma mensagem ou clique em \"Atualizar cota\" e volte para gerenci\u00E1-los',\n 'models.hint': 'Clique para mostrar/ocultar. Modelos ocultos n\u00E3o aparecem no seletor de modelos; as sess\u00F5es em andamento n\u00E3o s\u00E3o afetadas.',\n 'header.refreshQuota': 'Atualizar cota', 'header.refreshing': 'Atualizando...',\n 'console.close': 'Fechar (Esc)', 'header.badgeTitle': 'Antigravity: {count} contas prontas \u00B7 clique para abrir o console', 'header.badgeLoading': 'Antigravity \u00B7 clique para abrir o console',\n 'account.type.agy': 'Google Antigravity (CLI / OAuth)',\n 'account.loginType': 'Tipo de login:',\n 'account.dragHandle': 'Arrastar para reordenar prioridade',\n 'account.moveUp': 'Subir prioridade',\n 'account.moveDown': 'Descer prioridade',\n 'account.reordered': 'Prioridade das contas reordenada com sucesso',\n 'account.collapseAll': 'Recolher todos',\n 'account.expandAll': 'Expandir todos',\n 'account.cardCollapse': 'Recolher',\n 'account.cardExpand': 'Expandir detalhes',\n 'account.draggingTarget': 'Soltar aqui para prioridade #{num}',\n 'account.dragBanner': 'Reordenando: movendo [{alias}] para #{num}',\n 'account.dragHint': 'Arraste os cart\u00F5es para reordenar a prioridade em tempo real',\n 'account.enable': 'Ativar',\n 'account.disable': 'Desativar',\n 'account.enableTitle': 'Ativar esta conta (incluir na rota\u00E7\u00E3o)',\n 'account.disableTitle': 'Desativar esta conta (ignorar na rota\u00E7\u00E3o)',\n 'account.enabledToast': 'Conta ativada: {alias}',\n 'account.disabledToast': 'Conta desativada: {alias}',\n 'status.disabled': 'Desativado',\n 'header.warmup': 'Pr\u00E9-aquecimento',\n 'header.warmingUp': 'Aquecendo...',\n 'account.warmup': 'Aquecer',\n 'account.warmingUp': 'Aquecendo...',\n 'account.warmupTitle': 'Aquecer esta conta (ativar cron\u00F4metro semanal de 7 dias)',\n 'warmup.success': 'Conta aquecida com sucesso',\n 'warmup.allSuccess': 'Pr\u00E9-aquecimento conclu\u00EDdo',\n 'warmup.skipped': 'Conta em espera, sem necessidade de aquecimento',\n 'config.autoWarmup': 'Pr\u00E9-aquecimento autom\u00E1tico de 7 dias',\n 'config.autoWarmupDesc': 'Ativa automaticamente um ciclo quando o tempo de redefini\u00E7\u00E3o semanal \u00E9 atingido',\n}\n\nexport const es: AgyDictionary = {\n 'section.label': 'Antigravity', 'console.title': 'Consola de administraci\u00F3n de Antigravity',\n 'code.title': 'C\u00F3digo', 'code.inspect': 'Inspeccionar',\n 'tv.command': 'Comando', 'tv.write': 'Escribir', 'tv.edit': 'Editar', 'tv.read': 'Leer', 'tv.search': 'Buscar', 'tv.webSearch': 'B\u00FAsqueda web', 'tv.list': 'Listar', 'tv.delete': 'Eliminar', 'tv.tool': 'Herramienta',\n 'tv.noOutput': '(sin salida)', 'tv.noMatches': '(sin coincidencias)', 'tv.noChanges': '(sin cambios de texto)', 'tv.emptyDir': '(directorio vac\u00EDo)', 'tv.noDetail': '(sin detalles)',\n 'tv.hint.expandInspect': 'Clic para expandir \u00B7 clic derecho para inspeccionar', 'tv.hint.collapseInspect': 'Clic para contraer \u00B7 clic derecho para inspeccionar', 'tv.hint.expand': 'Clic para expandir', 'tv.hint.collapse': 'Clic para contraer',\n 'tv.diffMore': '\u2026 {count} l\u00EDneas restantes no renderizadas',\n 'code.copy': 'Copiar', 'code.copied': 'Copiado',\n 'status.ready': 'Listo', 'status.needsAuth': 'Se requiere autenticaci\u00F3n', 'status.loading': 'Cargando el estado de Antigravity...',\n 'status.authRequired': 'Debe iniciar sesi\u00F3n de nuevo', 'account.setActive': 'Establecer como en uso', 'account.settingActive': 'Cambiando...', 'account.activeSet': 'Cuenta en uso cambiada', 'account.activeSetFailed': 'Cuenta no elegible ahora (enfriamiento o requiere login)', 'status.proxy': 'Proxy', 'status.inUse': 'En uso',\n 'account.add': 'A\u00F1adir cuenta de Google', 'account.aliasDefault': 'Cuenta de Google de respaldo {number}', 'account.defaultAlias': 'Cuenta principal (inicio de sesi\u00F3n del sistema)',\n 'account.proxyPlaceholder': 'URL de proxy dedicada (p. ej., http://127.0.0.1:7890; d\u00E9jalo vac\u00EDo para heredar la global)', 'account.aliasPlaceholder': 'Alias de la cuenta (por ejemplo: Cuenta de respaldo 2)', 'account.removeTitle': 'Eliminar esta cuenta',\n 'aria.aliasInput': 'Alias de la cuenta', 'aria.proxyInput': 'URL de proxy exclusivo', 'aria.authCodeInput': 'C\u00F3digo de autorizaci\u00F3n o URL de devoluci\u00F3n', 'aria.closeToast': 'Cerrar notificaci\u00F3n',\n 'account.details': 'Detalles', 'account.collapse': 'Contraer',\n 'account.expandOthers': 'Expandir cuotas Claude y GPT-OSS', 'account.collapseOthers': 'Contraer cuotas Claude y GPT-OSS', 'account.otherModels': 'Cuotas Claude / GPT',\n 'account.sync': 'Sincronizar', 'account.syncing': 'Sincronizando...', 'account.syncTitle': 'Actualizar esta cuenta (sincroniza correo, cuota y modelos tras cambiar de cuenta)',\n 'account.models': 'Detalles por modelo:', 'account.cooldown': 'Algunos modelos tienen l\u00EDmite de uso; la cuenta se cambi\u00F3 autom\u00E1ticamente', 'account.clearCooldown': 'Borrar espera',\n 'account.localCooldown': ' \u00B7 espera local activa', 'account.removed': 'Cuenta eliminada: {alias}',\n 'quota.fiveHour': 'Cuota de 5 horas', 'quota.weekly': 'Cuota semanal', 'quota.refreshed': 'Cuota actualizada', 'quota.windowReset': 'Reiniciada \u00B7 disponible',\n 'proxy.button': 'Proxy', 'proxy.placeholder': 'URL de proxy exclusivo (por ejemplo: http://127.0.0.1:7890; d\u00E9jelo vac\u00EDo para usar el proxy global)',\n 'proxy.save': 'Guardar', 'proxy.saved': 'Proxy guardado', 'cancel': 'Cancelar',\n 'auth.openBrowser': 'Abrir navegador para iniciar sesi\u00F3n', 'auth.openingBrowser': 'Abriendo navegador...',\n 'auth.browserOpened': 'La p\u00E1gina de autorizaci\u00F3n de Google se abri\u00F3 en el navegador y se sincronizar\u00E1 despu\u00E9s de autorizar',\n 'auth.browserManual': 'No se pudo abrir el navegador autom\u00E1ticamente; use el enlace de abajo para autorizar manualmente',\n 'auth.startFailed': 'No se pudo iniciar la autorizaci\u00F3n de Google. Revise la configuraci\u00F3n de red o proxy.', 'auth.networkHint': 'Revise la configuraci\u00F3n de red o proxy',\n 'auth.activated': 'Cuenta activada en el pool', 'auth.failed': 'Fall\u00F3 la autorizaci\u00F3n', 'auth.added': 'Cuenta de Google a\u00F1adida y activada',\n 'auth.codeFailed': 'Fall\u00F3 la validaci\u00F3n del c\u00F3digo de autorizaci\u00F3n', 'auth.exchanging': 'Verificando la autorizaci\u00F3n y activando la cuenta; espere...',\n 'auth.waiting': 'Complete la autorizaci\u00F3n de Google en el navegador. La cuenta se activar\u00E1 autom\u00E1ticamente.',\n 'auth.openManual': 'Si el navegador no se abri\u00F3, haga clic aqu\u00ED para abrir manualmente la p\u00E1gina de inicio de sesi\u00F3n de Google',\n 'auth.pasteHint': 'Si la devoluci\u00F3n autom\u00E1tica no se complet\u00F3, pegue el c\u00F3digo de autorizaci\u00F3n o la URL de devoluci\u00F3n:',\n 'auth.codePlaceholder': 'C\u00F3digo de autorizaci\u00F3n o URL completa http://localhost:51121/oauth-callback?code=...',\n 'auth.activate': 'Activar manualmente', 'auth.activating': 'Verificando y activando...',\n 'auth.code.browser_manual': 'No se pudo abrir el navegador autom\u00E1ticamente; use el enlace de abajo para autorizar manualmente.', 'auth.code.callback_failed': 'La devoluci\u00F3n de la autorizaci\u00F3n fall\u00F3. Inicie la autorizaci\u00F3n de nuevo.',\n 'auth.code.no_active_flow': 'No hay un flujo de autorizaci\u00F3n en curso.', 'auth.code.invalid_code': 'No se reconoci\u00F3 el c\u00F3digo de autorizaci\u00F3n. Pegue el c\u00F3digo o la URL completa de devoluci\u00F3n.',\n 'auth.code.invalid_state': 'El enlace de autorizaci\u00F3n no pertenece a este flujo o caduc\u00F3. Inicie la autorizaci\u00F3n de nuevo.', 'auth.code.exchange_failed': 'Fall\u00F3 la validaci\u00F3n de la autorizaci\u00F3n. Inicie la autorizaci\u00F3n de nuevo.',\n 'auth.code.primary_activated': 'Cuenta principal conectada.', 'auth.code.account_activated': 'Cuenta a\u00F1adida y activada.', 'auth.code.missing_code': 'Introduzca un c\u00F3digo de autorizaci\u00F3n.',\n 'auth.code.request_failed': 'La solicitud no se complet\u00F3. Int\u00E9ntelo de nuevo.', 'api.genericError': 'La operaci\u00F3n no se complet\u00F3. Int\u00E9ntelo de nuevo.',\n 'duration.day': 'd', 'duration.hour': 'h', 'duration.minute': 'min',\n 'permission.label': 'Modo de permisos:', 'permission.plan': 'plan (solo lectura)', 'permission.acceptEdits': 'accept-edits (editar c\u00F3digo)', 'permission.skip': 'skip (aprobaci\u00F3n autom\u00E1tica; se mantienen las protecciones internas de AGY)',\n 'effort.label': 'Intensidad de razonamiento:', 'effort.auto': 'auto', 'effort.low': 'low', 'effort.medium': 'medium', 'effort.high': 'high',\n 'pool.label': 'Programaci\u00F3n del pool de cuentas:', 'pool.sequential': 'Usar en secuencia', 'pool.roundRobin': 'Turno rotativo',\n 'models.label': 'Visibilidad de modelos:', 'models.empty': 'A\u00FAn no hay modelos en el cat\u00E1logo: env\u00EDa un mensaje o haz clic en \"Actualizar cuota\" y vuelve para gestionarlos',\n 'models.hint': 'Haz clic para mostrar/ocultar. Los modelos ocultos no aparecen en el selector de modelos; las sesiones en curso no se ven afectadas.',\n 'header.refreshQuota': 'Actualizar cuota', 'header.refreshing': 'Actualizando...',\n 'console.close': 'Cerrar (Esc)', 'header.badgeTitle': 'Antigravity: {count} cuentas listas \u00B7 haga clic para abrir la consola', 'header.badgeLoading': 'Antigravity \u00B7 haga clic para abrir la consola',\n 'account.type.agy': 'Google Antigravity (CLI / OAuth)',\n 'account.loginType': 'Tipo de inicio de sesi\u00F3n:',\n 'account.dragHandle': 'Arrastrar para reordenar prioridad',\n 'account.moveUp': 'Subir prioridad',\n 'account.moveDown': 'Bajar prioridad',\n 'account.reordered': 'Prioridad de cuentas reordenada con \u00E9xito',\n 'account.collapseAll': 'Contraer todo',\n 'account.expandAll': 'Expandir todo',\n 'account.cardCollapse': 'Contraer',\n 'account.cardExpand': 'Expandir detalles',\n 'account.draggingTarget': 'Soltar aqu\u00ED para prioridad #{num}',\n 'account.dragBanner': 'Reordenando: moviendo [{alias}] a #{num}',\n 'account.dragHint': 'Arrastre las tarjetas para reordenar la prioridad en tiempo real',\n 'account.enable': 'Habilitar',\n 'account.disable': 'Deshabilitar',\n 'account.enableTitle': 'Habilitar esta cuenta (incluir en rotaci\u00F3n)',\n 'account.disableTitle': 'Deshabilitar esta cuenta (ignorar en rotaci\u00F3n)',\n 'account.enabledToast': 'Cuenta habilitada: {alias}',\n 'account.disabledToast': 'Cuenta deshabilitada: {alias}',\n 'status.disabled': 'Deshabilitado',\n 'header.warmup': 'Precalentamiento',\n 'header.warmingUp': 'Calentando...',\n 'account.warmup': 'Calentar',\n 'account.warmingUp': 'Calentando...',\n 'account.warmupTitle': 'Calentar esta cuenta (activar temporizador semanal de 7 d\u00EDas)',\n 'warmup.success': 'Cuenta calentada con \u00E9xito',\n 'warmup.allSuccess': 'Precalentamiento completado',\n 'warmup.skipped': 'Cuenta en espera, sin necesidad de calentar',\n 'config.autoWarmup': 'Precalentamiento autom\u00E1tico de 7 d\u00EDas',\n 'config.autoWarmupDesc': 'Activa autom\u00E1ticamente un ciclo cuando se alcanza el tiempo de reinicio semanal',\n}\n\n/**\n * The namespace this dictionary owns, merged into the Host's locale map so the\n * keyed tool views can seat `t` and so a missing/extra key is a type error.\n */\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'agy-worker': AgyLocaleKey\n }\n}\n", "import { useState } from 'react'\nimport { tr, useLang } from './i18n.js'\nimport {\n parseAgentImport,\n importOpsOf,\n useAcpConfigForm,\n existingRoutesOf,\n type AgentImport,\n} from './acp-import.js'\n\nexport interface ConfiguredRouteItem {\n route: string\n displayName: string\n command: string\n args: string[]\n}\n\n/**\n * Pure helper deriving sorted configured ACP routes from the current ConfigForm snapshot.\n * Merges resolved configuration with user overrides and falls back displayName to route id.\n */\nexport function configuredRoutesOf(\n snapshot?: { value?: unknown; user?: unknown } | null\n): ConfiguredRouteItem[] {\n if (!snapshot) return []\n const map = existingRoutesOf(snapshot)\n const items: ConfiguredRouteItem[] = []\n for (const [route, info] of map.entries()) {\n const merged = { ...(info.resolved ?? {}), ...(info.raw ?? {}) }\n const rawDisplay = typeof merged.displayName === 'string' ? merged.displayName.trim() : ''\n const displayName = rawDisplay.length > 0 ? rawDisplay : route\n const command = typeof merged.command === 'string' ? merged.command.trim() : ''\n const args =\n Array.isArray(merged.args) && merged.args.every(arg => typeof arg === 'string')\n ? (merged.args as string[])\n : []\n items.push({ route, displayName, command, args })\n }\n return items.sort((a, b) => a.route.localeCompare(b.route))\n}\n\n/**\n * The ACP section of the Fusion page.\n *\n * This section provides both setup guidance and a configuration importer:\n * it accepts JSON from other ACP clients (or previous dsh-tauri-acp installations)\n * and writes selected routes into `dsh-fusion \u2192 acp.agents` via DSH ConfigForms.\n * A Host restart is required after saving or importing.\n */\nconst styles = `\n.acp-guide{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.acp-guide h3{margin:0;font-size:15px;font-weight:600}\n.acp-guide h4{margin:0;font-size:13px;font-weight:600}\n.acp-guide p{margin:0;font-size:13px;line-height:21px;color:var(--dsw-alias-label-secondary)}\n.acp-guide ol,.acp-guide ul{margin:0;padding-left:20px;font-size:13px;line-height:21px;color:var(--dsw-alias-label-secondary);display:flex;flex-direction:column;gap:6px}\n.acp-guide code{font-size:12px;overflow-wrap:anywhere}\n.acp-guide pre{box-sizing:border-box;width:100%;margin:0;padding:12px;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font-size:12px;line-height:18px}\n.acp-guide .acp-note{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-1)}\n.acp-guide [data-kind=warning]{color:var(--dsw-alias-label-primary)}\n.acp-import-label{display:flex;flex-direction:column;gap:6px;width:100%}\n.acp-field-hint{font-size:12px;color:var(--dsw-alias-label-secondary)}\n.acp-import-textarea{box-sizing:border-box;width:100%;min-height:120px;padding:10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font-family:monospace;font-size:12px;line-height:18px;resize:vertical}\n.acp-import-textarea::placeholder{color:var(--dsw-alias-label-tertiary,#888)}\n.acp-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.acp-btn-primary{border:1px solid var(--dsw-alias-border-l2);border-radius:18px;background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary,#1677ff));color:var(--dsw-alias-label-primary-foreground,#fff);padding:7px 18px;font:inherit;font-size:13px;cursor:pointer}\n.acp-btn-secondary{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-primary);padding:6px 14px;font:inherit;font-size:13px;cursor:pointer}\n.acp-btn-ghost{border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:6px 12px;font:inherit;font-size:13px;cursor:pointer}\n.acp-guide button:disabled{opacity:.5;cursor:default}\n.acp-guide button:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\n.acp-banner{box-sizing:border-box;width:100%;padding:10px 12px;border-radius:6px;font-size:13px;line-height:19px;display:flex;flex-direction:column;gap:4px}\n.acp-banner-error{background:rgba(248,81,73,0.1);border:1px solid rgba(248,81,73,0.4);color:var(--dsw-alias-state-error-primary,#cf222e)}\n.acp-banner-warning{background:rgba(210,153,34,0.1);border:1px solid rgba(210,153,34,0.4);color:#d29922}\n.acp-banner-success{background:rgba(46,160,67,0.1);border:1px solid rgba(46,160,67,0.4);color:#2ea043}\n.acp-entries-list{display:flex;flex-direction:column;gap:8px}\n.acp-entry-row{padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:var(--dsw-alias-bg-module-platform)}\n.acp-entry-checkbox-label{display:flex;align-items:flex-start;gap:10px;cursor:pointer;font-size:13px}\n.acp-entry-details{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1 1 auto}\n.acp-entry-header{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.acp-entry-name{font-weight:600}\n.acp-entry-cmd{font-size:12px;color:var(--dsw-alias-label-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}\n.acp-tag{display:inline-flex;align-items:center;padding:1px 6px;border-radius:4px;font-size:11px;font-weight:500}\n.acp-tag-neutral{background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-secondary)}\n.acp-tag-success{background:rgba(46,160,67,0.15);color:#2ea043;border:1px solid rgba(46,160,67,0.3)}\n.acp-tag-warning{background:rgba(210,153,34,0.15);color:#d29922;border:1px solid rgba(210,153,34,0.3)}\n.acp-tag-info{background:rgba(22,119,255,0.12);color:var(--dsw-alias-brand-primary,#1677ff);border:1px solid rgba(22,119,255,0.25)}\n.acp-empty-hint{font-size:13px;line-height:21px;color:var(--dsw-alias-label-secondary);font-style:italic}\n.acp-hint-skipped{font-size:12px;color:var(--dsw-alias-label-secondary);padding-left:4px}\n.acp-import-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding-top:4px}\n.acp-restart-notice{font-size:13px;font-weight:500;margin-top:2px}\n.acp-status-hint{font-size:12px;color:var(--dsw-alias-label-secondary)}\n`\n\nconst PLACEHOLDER = `{\n \"agent_servers\": {\n \"devin\": {\n \"command\": \"/home/zlw/.local/share/devin/cli/_versions/current/bin/devin\",\n \"args\": [\"acp\"],\n \"env\": {}\n }\n }\n}`\n\nconst CONFIG_EXAMPLE = `- id: dsh-fusion\n name: '@sqdr2/dsh-fusion'\n config:\n acp:\n agents:\n my-agent:\n command: /absolute/path/to/acp-agent\n args: []\n models:\n - id: default`\n\nfunction translateIssue(reason: string, lang: 'zh' | 'en'): string {\n switch (reason) {\n case 'importMissingCommand':\n return tr(lang, '\u7F3A\u5C11\u542F\u52A8\u547D\u4EE4', 'missing command')\n case 'importBadArgs':\n return tr(lang, 'args \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4', 'args must be an array of strings')\n case 'importBadEnv':\n return tr(lang, 'env \u5FC5\u987B\u662F\u952E\u503C\u5747\u4E3A\u5B57\u7B26\u4E32\u7684\u5BF9\u8C61', 'env must be an object of strings')\n default:\n return reason\n }\n}\n\nexport function AcpSettingsGuide() {\n const lang = useLang()\n const { status, value, user, revision, writable, form } = useAcpConfigForm()\n\n const [text, setText] = useState('')\n const [parsed, setParsed] = useState<AgentImport | null>(null)\n const [excluded, setExcluded] = useState<ReadonlySet<string>>(new Set())\n const [busy, setBusy] = useState(false)\n const [feedback, setFeedback] = useState<{ tone: 'success' | 'error' | 'warning'; message: string } | null>(null)\n\n const configuredRoutes = configuredRoutesOf({ value, user })\n const entries = parsed?.ok === true ? parsed.entries : []\n const selected = entries.filter(entry => !excluded.has(entry.route))\n\n const toggle = (route: string, include: boolean): void => {\n setExcluded(current => {\n const next = new Set(current)\n if (include) next.delete(route)\n else next.add(route)\n return next\n })\n }\n\n const canImport =\n status === 'ready' &&\n writable &&\n revision !== undefined &&\n selected.length > 0 &&\n !busy &&\n form !== undefined\n\n const handleImport = async () => {\n if (!canImport || !form || revision === undefined) return\n setBusy(true)\n setFeedback(null)\n try {\n const ops = importOpsOf(selected)\n const accepted = await form.mutate(ops, revision)\n if (accepted) {\n setFeedback({\n tone: 'success',\n message: tr(\n lang,\n `\u6210\u529F\u5BFC\u5165 ${selected.length} \u6761 ACP \u7EBF\u8DEF\u5230 dsh-fusion \u2192 acp.agents\u3002`,\n `Successfully imported ${selected.length} ACP route${selected.length > 1 ? 's' : ''} to dsh-fusion \u2192 acp.agents.`\n ),\n })\n } else {\n setFeedback({\n tone: 'error',\n message: tr(\n lang,\n 'Host \u62D2\u7EDD\u4E86\u914D\u7F6E\u5199\u5165\uFF08\u914D\u7F6E\u7248\u672C\u53EF\u80FD\u5DF2\u8FC7\u671F\u6216\u88AB\u5916\u90E8\u4FEE\u6539\uFF09\uFF0C\u672A\u5E94\u7528\u66F4\u6539\u3002\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5\u3002',\n 'Host rejected the configuration write (configuration may be stale or modified concurrently). No changes applied; refresh and try again.'\n ),\n })\n }\n } catch (error) {\n setFeedback({\n tone: 'error',\n message: tr(\n lang,\n `\u5BFC\u5165\u5931\u8D25\uFF1A${error instanceof Error ? error.message : String(error)}`,\n `Import failed: ${error instanceof Error ? error.message : String(error)}`\n ),\n })\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <section className=\"acp-guide\" aria-labelledby=\"acp-guide-title\">\n <style>{styles}</style>\n <h3 id=\"acp-guide-title\">{tr(lang, 'ACP \u63A5\u5165\u8BF4\u660E', 'ACP setup guide')}</h3>\n <p>\n {tr(\n lang,\n 'ACP\uFF08Agent Client Protocol\uFF09\u4EE3\u7406\u4F5C\u4E3A\u72EC\u7ACB\u6A21\u578B\u7EBF\u8DEF\u63A5\u8FDB\u6765\uFF0C\u53EF\u4EE5\u76F4\u63A5\u88AB\u9009\u4E3A Lead \u6216 Sidekick\u3002\u672C\u533A\u57DF\u63D0\u4F9B\u63A5\u5165\u8BF4\u660E\u4E0E\u65E7\u7248\u914D\u7F6E\u5BFC\u5165\u80FD\u529B\u3002\u8DEF\u7531\u5B9A\u4E49\u5728\u63D2\u4EF6\u914D\u7F6E\u91CC\uFF0C\u4FEE\u6539\u6216\u5BFC\u5165\u540E\u9700\u8981\u91CD\u542F Host \u624D\u4F1A\u751F\u6548\uFF1B\u8FD9\u91CC\u4E0D\u63D0\u4F9B\u5728\u7EBF\u72B6\u6001\u6216\u6A21\u578B\u53D1\u73B0\u3002',\n 'ACP (Agent Client Protocol) agents join as their own model routes, so one can be the Lead or the Sidekick directly. This section provides setup guidance and configuration import. Routes live in plugin configuration and require a Host restart after changes or imports; no live status or model discovery is offered here.'\n )}\n </p>\n\n {/* Configured routes card */}\n <div className=\"acp-note\" role=\"region\" aria-label={tr(lang, '\u5DF2\u914D\u7F6E\u7684 ACP \u7EBF\u8DEF', 'Configured ACP routes')}>\n <h4>{tr(lang, '\u5DF2\u914D\u7F6E\u7684 ACP \u7EBF\u8DEF', 'Configured ACP routes')}</h4>\n <p>\n {tr(\n lang,\n '\u4EE5\u4E0B\u5C55\u793A\u5F53\u524D\u5728\u914D\u7F6E\uFF08dsh-fusion \u2192 acp.agents\uFF09\u4E2D\u5DF2\u4FDD\u5B58\u7684\u7EBF\u8DEF\u3002\u6B64\u5904\u4EC5\u4E3A\u914D\u7F6E\u6E05\u5355\uFF0C\u4E0D\u63A2\u6D4B\u540E\u53F0\u8FDB\u7A0B\uFF0C\u6807\u660E\u201C\u5DF2\u914D\u7F6E\u201D\u4E0D\u4EE3\u8868\u5F53\u524D agent \u8FDB\u7A0B\u6B63\u5728\u8FD0\u884C\u3002\u4FEE\u6539\u6216\u5BFC\u5165\u540E\u9700\u8981\u91CD\u542F Host \u624D\u4F1A\u751F\u6548\u3002',\n 'Lists routes currently saved in configuration (dsh-fusion \u2192 acp.agents). This shows configured entries only and does not probe background processes; \"configured\" does not mean the agent process is actively running. Restart the Host after changes or imports for new routes to take effect.'\n )}\n </p>\n\n {status === 'loading' && (\n <p role=\"status\" className=\"acp-status-hint\">\n {tr(lang, '\u6B63\u5728\u8BFB\u53D6\u5DF2\u914D\u7F6E\u7EBF\u8DEF\u2026', 'Loading configured routes\u2026')}\n </p>\n )}\n\n {status !== 'loading' && configuredRoutes.length === 0 && (\n <p className=\"acp-empty-hint\">\n {tr(lang, '\u5F53\u524D\u672A\u914D\u7F6E\u4EFB\u4F55 ACP \u7EBF\u8DEF\u3002', 'No ACP routes are currently configured.')}\n </p>\n )}\n\n {configuredRoutes.length > 0 && (\n <div className=\"acp-entries-list\" role=\"list\" aria-label={tr(lang, '\u5DF2\u914D\u7F6E\u7EBF\u8DEF\u6E05\u5355', 'Configured routes list')}>\n {configuredRoutes.map(item => {\n const cmdLine = [item.command, ...item.args].filter(Boolean).join(' ')\n return (\n <div key={item.route} className=\"acp-entry-row\" role=\"listitem\">\n <div className=\"acp-entry-details\">\n <div className=\"acp-entry-header\">\n <strong className=\"acp-entry-name\">{item.displayName}</strong>\n <span className=\"acp-tag acp-tag-neutral\">{item.route}</span>\n <span className=\"acp-tag acp-tag-info\">\n {tr(lang, '\u5DF2\u914D\u7F6E', 'Configured')}\n </span>\n </div>\n {cmdLine ? (\n <code className=\"acp-entry-cmd\" title={cmdLine}>{cmdLine}</code>\n ) : (\n <span className=\"acp-field-hint\">{tr(lang, '\uFF08\u672A\u6307\u5B9A\u547D\u4EE4\uFF09', '(No command specified)')}</span>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Import card */}\n <div className=\"acp-note\" role=\"region\" aria-label={tr(lang, '\u5BFC\u5165 ACP \u7EBF\u8DEF\u914D\u7F6E', 'Import ACP route configuration')}>\n <h4>{tr(lang, '\u5BFC\u5165 ACP \u7EBF\u8DEF\u914D\u7F6E', 'Import ACP route configuration')}</h4>\n <p>\n {tr(\n lang,\n '\u652F\u6301\u7C98\u8D34 Zed \u914D\u7F6E\u4E2D\u7684 agent_servers\u3001\u672C\u63D2\u4EF6\u7684 agents \u6216\u88F8 server \u6620\u5C04 JSON\u3002\u89E3\u6790\u540E\u53EF\u9009\u62E9\u8981\u5BFC\u5165\u7684\u7EBF\u8DEF\u5E76\u6279\u91CF\u5199\u5165 dsh-fusion \u2192 acp.agents\u3002',\n 'Paste JSON from Zed\\'s agent_servers, this plugin\\'s agents, or a bare server map. Parse to preview, select routes, and import directly into dsh-fusion \u2192 acp.agents.'\n )}\n </p>\n\n {status === 'loading' && (\n <p role=\"status\" className=\"acp-status-hint\">\n {tr(lang, '\u6B63\u5728\u8BFB\u53D6\u914D\u7F6E\u8868\u5355\u2026', 'Loading configuration form\u2026')}\n </p>\n )}\n {status === 'unavailable' && (\n <p role=\"status\" className=\"acp-status-hint\">\n {tr(lang, '\u914D\u7F6E\u8868\u5355\u5F53\u524D\u4E0D\u53EF\u7528\uFF08\u5904\u4E8E\u5185\u5B58\u6A21\u5F0F\u6216\u5C1A\u672A\u8FDE\u63A5 Host\uFF09', 'Configuration form is currently unavailable (memory mode or disconnected from Host)')}\n </p>\n )}\n {status === 'ready' && !writable && (\n <p role=\"status\" className=\"acp-status-hint\">\n {tr(lang, '\u5F53\u524D\u914D\u7F6E\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u5BFC\u5165', 'Configuration is read-only; importing is disabled')}\n </p>\n )}\n\n <label className=\"acp-import-label\">\n <span className=\"acp-field-hint\">{tr(lang, '\u914D\u7F6E JSON', 'Configuration JSON')}</span>\n <textarea\n className=\"acp-import-textarea\"\n value={text}\n placeholder={PLACEHOLDER}\n disabled={busy}\n aria-label={tr(lang, '\u7C98\u8D34 ACP \u914D\u7F6E JSON', 'Paste ACP configuration JSON')}\n onChange={event => {\n setText(event.target.value)\n setParsed(null)\n setExcluded(new Set())\n setFeedback(null)\n }}\n />\n </label>\n\n <div className=\"acp-actions\">\n <button\n type=\"button\"\n className=\"acp-btn-secondary\"\n disabled={busy || text.trim().length === 0}\n onClick={() => {\n setFeedback(null)\n setParsed(parseAgentImport(text, { value, user }))\n setExcluded(new Set())\n }}\n >\n {tr(lang, '\u89E3\u6790\u914D\u7F6E', 'Parse configuration')}\n </button>\n <button\n type=\"button\"\n className=\"acp-btn-ghost\"\n disabled={busy}\n onClick={() => {\n setText(PLACEHOLDER)\n setParsed(null)\n setExcluded(new Set())\n setFeedback(null)\n }}\n >\n {tr(lang, '\u586B\u5165 Devin \u793A\u4F8B', 'Insert Devin example')}\n </button>\n {entries.length > 1 && (\n <button\n type=\"button\"\n className=\"acp-btn-ghost\"\n disabled={busy}\n onClick={() =>\n setExcluded(selected.length === entries.length ? new Set(entries.map(e => e.route)) : new Set())\n }\n >\n {tr(\n lang,\n selected.length === entries.length ? '\u5168\u4E0D\u9009' : '\u5168\u9009',\n selected.length === entries.length ? 'Deselect all' : 'Select all'\n )}\n </button>\n )}\n </div>\n\n {parsed?.ok === false && (\n <div role=\"alert\" className=\"acp-banner acp-banner-error\">\n {tr(lang, `\u89E3\u6790\u5931\u8D25\uFF1A${parsed.error}`, `Parse failed: ${parsed.error}`)}\n </div>\n )}\n\n {parsed?.ok === true && entries.length === 0 && (\n <div role=\"status\" className=\"acp-banner acp-banner-warning\">\n {tr(lang, '\u672A\u627E\u5230\u6709\u6548\u7684 Agent \u914D\u7F6E', 'No valid agent configuration found')}\n </div>\n )}\n\n {entries.length > 0 && (\n <div className=\"acp-entries-list\" role=\"group\" aria-label={tr(lang, '\u89E3\u6790\u5F97\u5230\u7684\u7EBF\u8DEF\u5217\u8868', 'Parsed routes list')}>\n {entries.map(entry => {\n const isChecked = !excluded.has(entry.route)\n const args = Array.isArray(entry.profile.args) ? entry.profile.args : []\n const cmdLine = [entry.profile.command, ...args].join(' ')\n return (\n <div key={entry.route} className=\"acp-entry-row\">\n <label className=\"acp-entry-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={isChecked}\n disabled={busy}\n aria-label={tr(lang, `\u9009\u62E9\u5BFC\u5165 ${entry.name}`, `Select import ${entry.name}`)}\n onChange={event => toggle(entry.route, event.target.checked)}\n />\n <span className=\"acp-entry-details\">\n <span className=\"acp-entry-header\">\n <strong className=\"acp-entry-name\">{entry.name}</strong>\n <span className=\"acp-tag acp-tag-neutral\">{entry.route}</span>\n <span className={`acp-tag acp-tag-${entry.replaces ? 'warning' : 'success'}`}>\n {tr(lang, entry.replaces ? '\u66FF\u6362\u73B0\u6709' : '\u65B0\u5EFA\u7EBF\u8DEF', entry.replaces ? 'Replace' : 'New')}\n </span>\n </span>\n <code className=\"acp-entry-cmd\" title={cmdLine}>{cmdLine}</code>\n </span>\n </label>\n </div>\n )\n })}\n </div>\n )}\n\n {parsed?.ok === true && parsed.skipped.map(issue => (\n <div key={issue.name} className=\"acp-hint-skipped\">\n {tr(\n lang,\n `\u5DF2\u8DF3\u8FC7\u300C${issue.name}\u300D\uFF1A${translateIssue(issue.reason, 'zh')}`,\n `Skipped \"${issue.name}\": ${translateIssue(issue.reason, 'en')}`\n )}\n </div>\n ))}\n\n <div className=\"acp-import-footer\">\n <button\n type=\"button\"\n className=\"acp-btn-primary\"\n disabled={!canImport}\n onClick={() => { void handleImport() }}\n >\n {tr(\n lang,\n busy ? '\u6B63\u5728\u5BFC\u5165\u2026' : `\u5BFC\u5165 ${selected.length} \u4E2A Agent`,\n busy ? 'Importing\u2026' : `Import ${selected.length} Agent${selected.length === 1 ? '' : 's'}`\n )}\n </button>\n </div>\n\n {feedback && (\n <div\n role={feedback.tone === 'error' ? 'alert' : 'status'}\n className={`acp-banner acp-banner-${feedback.tone}`}\n >\n <div>{feedback.message}</div>\n {feedback.tone === 'success' && (\n <div className=\"acp-restart-notice\">\n <strong>{tr(lang, '\u91CD\u8981\u63D0\u793A\uFF1A', 'Important: ')}</strong>\n {tr(\n lang,\n '\u7EBF\u8DEF\u5DF2\u5199\u5165 acp.agents \u914D\u7F6E\uFF0C\u5FC5\u987B\u91CD\u542F Host \u624D\u80FD\u4F7F\u65B0\u7EBF\u8DEF\u751F\u6548\u3002',\n 'Routes written to acp.agents configuration; you must restart the Host for new routes to take effect.'\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n <div className=\"acp-note\">\n <h4>{tr(lang, '\u914D\u7F6E\u4F4D\u7F6E', 'Where the routes are configured')}</h4>\n <p>\n {tr(\n lang,\n '\u6BCF\u6761 ACP \u7EBF\u8DEF\u5199\u5728\u672C\u63D2\u4EF6\u7684 acp.agents \u91CC\uFF0C\u952E\u5C31\u662F\u6A21\u578B\u9009\u62E9\u5668\u91CC\u663E\u793A\u7684 provider \u8DEF\u7531\u540D\u3002\u6539\u5B8C\u6216\u5BFC\u5165\u540E\u9700\u8981\u91CD\u542F Host \u624D\u4F1A\u751F\u6548\uFF1A\u914D\u7F6E\u5728\u63D2\u4EF6\u5B89\u88C5\u65F6\u8BFB\u53D6\u4E00\u6B21\u3002',\n 'Each ACP route lives in this plugin\\'s acp.agents block; the key is the provider route name shown in the model menu. A Host restart is required after a change or import, because the routes are read once when the plugin installs.'\n )}\n </p>\n <pre><code>{CONFIG_EXAMPLE}</code></pre>\n <p>\n {tr(\n lang,\n 'command \u5FC5\u586B\uFF0C\u662F agent \u7684\u53EF\u6267\u884C\u547D\u4EE4\uFF1B\u5199\u6210\u7EDD\u5BF9\u8DEF\u5F84\u66F4\u7A33\uFF08\u4ECE\u684C\u9762\u7AEF\u542F\u52A8\u65F6 GUI \u8FDB\u7A0B\u7684 PATH \u5F80\u5F80\u6BD4\u7EC8\u7AEF\u77ED\uFF09\uFF0C\u4F46 PATH \u4E0A\u7684\u547D\u4EE4\u540C\u6837\u53EF\u7528\uFF0C\u56E0\u4E3A Host \u76F4\u63A5 spawn \u8FD9\u4E2A\u547D\u4EE4\u3002args \u53EF\u7559\u7A7A\u3002models \u53EF\u4EE5\u6574\u6BB5\u7701\u7565\uFF1A\u7701\u7565\u6216\u7559\u7A7A\u65F6\u6309 discoverModels\uFF08\u9ED8\u8BA4 true\uFF09\u5411 agent \u8BE2\u95EE\u6A21\u578B\uFF0C\u95EE\u4E0D\u5230\u5C31\u7528\u56DE\u9000\u7684 default \u6A21\u578B\uFF1B\u5199\u4E86 models \u5219\u6BCF\u4E00\u9879\u90FD\u8981\u6709 id\u3002\u5176\u4F59\u53EF\u9009\u5B57\u6BB5\uFF08permission\u3001contextWindow\u3001startupTimeoutMs \u7B49\uFF09\u89C1 docs/COMPATIBILITY.md\u3002',\n 'command is required: it is the agent executable. An absolute path is more reliable (a GUI-launched Host often has a shorter PATH than a terminal), but a command on PATH works too, because the Host spawns it directly. args may be empty. models may be omitted entirely: absent or empty means the route asks the agent via discoverModels (default true) and falls back to a default model when nothing is advertised; if you do list models, every entry needs an id. The remaining optional fields (permission, contextWindow, startupTimeoutMs, \u2026) are listed in docs/COMPATIBILITY.md.'\n )}\n </p>\n </div>\n\n <div className=\"acp-note\">\n <h4>{tr(lang, '\u914D\u7F6E\u4E4B\u540E', 'After configuring')}</h4>\n <p>\n {tr(\n lang,\n '\u91CD\u542F Host \u540E\uFF0C\u8FD9\u4E9B ACP \u7EBF\u8DEF\u4F1A\u51FA\u73B0\u5728\u539F\u751F\u6A21\u578B\u9009\u62E9\u548C Fusion \u7684\u7EC4\u5408\u91CC\uFF0C\u53EF\u4EE5\u50CF\u5176\u4ED6\u6A21\u578B\u4E00\u6837\u9009\u4E3A Lead \u6216 Sidekick\u3002\u5B83\u4EEC\u662F\u5426\u5217\u51FA\u5DE5\u5177\u3001\u5982\u4F55\u5E94\u7B54\u6743\u9650\u8BF7\u6C42\uFF0C\u7531\u6BCF\u4E2A agent \u81EA\u5DF1\u7684\u5B9E\u73B0\u548C\u8FD9\u91CC\u7684 permission \u8BBE\u7F6E\u51B3\u5B9A\u3002Fusion \u53EA\u5728\u672C\u63D2\u4EF6\u81EA\u5DF1\u6D3E\u53D1 Sidekick \u4EFB\u52A1\u65F6\uFF0C\u624D\u5728\u8BE5\u4F1A\u8BDD\u7684 ACP session/new \u91CC\u58F0\u660E Host \u5DE5\u5177\u6865\uFF1B\u5176\u4F59 ACP \u4F1A\u8BDD\u4E0D\u5E26\u4EFB\u4F55 MCP server\u3002',\n 'Once the Host restarts, those ACP routes appear in the native model picker and in Fusion combos, and can be chosen as Lead or Sidekick like any other model. Whether they expose tools and how they answer permission requests is decided by each agent\\'s own implementation and by the permission setting you gave it. Fusion declares Host tools in an ACP session/new only while it is dispatching a Sidekick on that exact session; every other ACP session opens with no MCP server.'\n )}\n </p>\n </div>\n </section>\n )\n}\n", "/**\n * The product identity this plugin presents.\n *\n * One plugin, one entry: `@sqdr2/dsh-fusion` (plugin id `dsh-fusion`) now hosts\n * the Fusion pair, the Antigravity (agy CLI) route and the ACP agent routes\n * together, so the page introduces the combined workspace while the sidebar row\n * keeps its short name. The package name, the plugin id, the state directory and\n * the model-menu provider are all still `dsh-fusion`; nothing here renames them.\n */\nexport const STUDIO_TITLE = 'DSH Agent Studio With Fusion'\n\n/** Sidebar row text. Short on purpose: the rail is narrow and the id is `fusion`. */\nexport const FUSION_SIDEBAR_LABEL = 'Fusion'\n", "import { FusionHistory } from './FusionHistory.js'\nimport { FusionCache } from './FusionCache.js'\nimport { AgyConsole } from './agy/AgyConsole.js'\nimport { AcpSettingsGuide } from './AcpSettingsGuide.js'\nimport { STUDIO_TITLE } from './studio-brand.js'\nimport { useEffect, useState } from 'react'\nimport type { PhysicalRoute } from '../contracts.js'\nimport type { PairChoice, SettingsCatalog } from '../host/settings.js'\nimport { missingRoutes } from '../host/settings.js'\nimport { settingsChanged } from './settings-events.js'\nimport { tr, useLang } from './i18n.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\n/** One saved combo as the page shows it: its id, its label and its pair. */\nexport interface SavedPairView { id: string; name: string; pair: PairChoice; authorized: boolean; reason?: string }\ninterface SettingsState {\n revision: number\n catalog: SettingsCatalog\n pairs: SavedPairView[]\n maxPairs: number\n authorized: boolean\n managedAuthorization?: boolean\n reason?: string\n}\n/** A row being edited. `id` is absent until the list is saved for the first time. */\ninterface DraftCombo { key: string; id?: string; name: string; pair: Partial<PairChoice> }\nconst styles = `\n.fusion-page{box-sizing:border-box;width:100%;height:100%;min-width:0;min-height:0;flex:1 1 auto;overflow:auto;display:flex;flex-direction:column;align-items:center;scrollbar-gutter:stable;padding:0 clamp(24px,4vw,48px) 48px;--dsh-scrollbar-width:9px;--dsh-scrollbar-thumb-border:2px}\n.fusion-settings{box-sizing:border-box;width:100%;max-width:680px;margin:0 auto;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:18px}\n.fusion-settings h2{margin:0;font-size:22px;line-height:30px;font-weight:600}\n.fusion-settings p{margin:0;font-size:13px;line-height:21px;color:var(--dsw-alias-label-secondary)}\n.fusion-settings header{display:flex;flex-direction:column;gap:8px;padding-top:28px}\n[data-platform='darwin'] .fusion-settings header{padding-top:calc(28px + var(--dsh-frame-top-clearance,0px))}\n.fusion-settings .fusion-card{padding:20px;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;display:flex;flex-direction:column;gap:20px;background:var(--dsw-alias-bg-module-platform)}\n.fusion-settings fieldset{padding:0;margin:0;border:0;min-inline-size:0;display:flex;flex-direction:column;gap:10px}\n.fusion-settings legend{font-size:15px;font-weight:600;padding:0 0 4px}\n.fusion-settings label{display:grid;grid-template-columns:85px minmax(0,1fr);align-items:center;gap:12px;font-size:13px}\n.fusion-settings :is(select,option,optgroup){background-color:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);color-scheme:inherit}\n.fusion-settings select{box-sizing:border-box;min-width:0;width:100%;min-height:36px;border:1px solid var(--dsw-alias-border-l2);border-radius:7px;padding:5px 9px;font:inherit}\n.fusion-settings .fusion-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}\n.fusion-settings button{border:1px solid var(--dsw-alias-border-l2);border-radius:18px;background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary));color:var(--dsw-alias-label-primary-foreground,#fff);padding:7px 18px;font:inherit;font-size:13px;cursor:pointer}\n.fusion-settings button:disabled{opacity:.5;cursor:default}\n.fusion-settings :is(button,select):focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\n.fusion-settings [role=alert]{color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere}\n.fusion-settings details{font-size:13px;line-height:21px}\n.fusion-settings summary{cursor:pointer;font-weight:500}\n.fusion-settings .fusion-limits{display:flex;flex-direction:column;gap:12px;padding-top:14px}\n.fusion-settings :is(input[type=number],input[type=text]){min-width:0;width:100%;box-sizing:border-box;background-color:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;padding:8px;font:inherit}\n.fusion-settings .fusion-consent{display:flex;align-items:flex-start;gap:8px;font-size:12px;line-height:18px}\n.fusion-combos{display:flex;flex-direction:column;gap:8px}\n.fusion-settings .fusion-combo{display:flex;align-items:stretch;padding:0;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;background-color:var(--dsw-alias-bg-layer-1);font-size:13px;overflow:hidden;transition:border-color .15s ease,background-color .15s ease}\n.fusion-settings .fusion-combo:hover{background-color:var(--dsw-alias-interactive-bg-hover)}\n.fusion-settings .fusion-combo[data-active=true]{border-color:var(--dsw-alias-brand-primary);background-color:var(--dsw-alias-interactive-bg-hover-accent)}\n.fusion-settings .fusion-combo-main{flex:1 1 auto;display:flex;align-items:center;gap:10px;min-width:0;padding:11px 12px;background:none;border:0;border-radius:0;color:inherit;font:inherit;text-align:left;cursor:pointer}\n.fusion-settings .fusion-combo-main:hover{background:none}\n.fusion-settings .fusion-combo :is(.fusion-combo-main,.fusion-combo-actions):focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}\n.fusion-settings .fusion-combo-check{position:relative;flex:none;width:14px;height:14px;border:1.5px solid var(--dsw-alias-border-l2);border-radius:50%;transition:border-color .15s ease}\n.fusion-settings .fusion-combo:hover .fusion-combo-check{border-color:var(--dsw-alias-label-tertiary)}\n.fusion-settings .fusion-combo[data-active=true] .fusion-combo-check{border-color:var(--dsw-alias-brand-primary)}\n.fusion-settings .fusion-combo[data-active=true] .fusion-combo-check::after{content:'';position:absolute;inset:2.5px;border-radius:50%;background:var(--dsw-alias-brand-primary)}\n.fusion-settings .fusion-combo-text{display:flex;flex-direction:column;gap:2px;min-width:0}\n.fusion-settings .fusion-combo-name{font-weight:600;overflow-wrap:anywhere}\n.fusion-settings .fusion-combo-routes{color:var(--dsw-alias-label-secondary);font-size:12px;overflow-wrap:anywhere}\n.fusion-settings .fusion-combo-stale{color:var(--dsw-alias-state-error-primary);font-size:12px;overflow-wrap:anywhere}\n.fusion-settings .fusion-combo-actions{flex:none;align-self:stretch;display:flex;align-items:center;padding:0 14px;border:0;border-left:1px solid var(--dsw-alias-border-l1);border-radius:0;background:none;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;cursor:pointer;transition:color .15s ease,background-color .15s ease}\n.fusion-settings .fusion-combo-actions:hover:not(:disabled){color:var(--dsw-alias-state-error-primary);background-color:var(--dsw-alias-interactive-bg-hover-danger)}\n.fusion-settings .fusion-combo-actions:disabled{opacity:.4;cursor:default}\n.fusion-settings .fusion-combo-add{align-self:flex-start;padding:8px 16px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:none;color:var(--dsw-alias-label-secondary);font-size:13px}\n.fusion-settings .fusion-combo-add:hover:not(:disabled){background-color:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.fusion-cache{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.fusion-cache h3{margin:0}\n.fusion-cache-summary{cursor:pointer;font-weight:600;font-size:14px;display:flex;align-items:center;justify-content:space-between;list-style:none;user-select:none;padding:2px 0}\n.fusion-cache-summary::-webkit-details-marker{display:none}\n.fusion-cache-summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}\n.fusion-cache-title{display:inline-flex;align-items:center;gap:6px}\n.fusion-cache-title h3{margin:0;font-size:15px;font-weight:600}\n.fusion-cache-indicator{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:400;color:var(--dsw-alias-label-secondary)}\n.fusion-cache-chevron{display:inline-block;width:7px;height:7px;border-right:2px solid var(--dsw-alias-label-secondary);border-bottom:2px solid var(--dsw-alias-label-secondary);transform:rotate(-45deg);transition:transform .15s ease;margin-left:2px}\n.fusion-cache[open] .fusion-cache-chevron{transform:rotate(45deg)}\n.fusion-cache-content{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);margin-top:4px}\n.fusion-cache-model{display:flex;flex-direction:column;gap:8px;padding:14px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px}\n.fusion-cache-model small{display:block;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere}\n.fusion-cache-controls{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr) auto;gap:10px;align-items:end}\n.fusion-cache-controls label{grid-template-columns:1fr;gap:4px}\n.fusion-cache a{color:var(--dsw-alias-brand-primary)}\n@media(max-width:560px){.fusion-cache-controls{grid-template-columns:1fr}}\n.fusion-history{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.fusion-history-summary{cursor:pointer;font-weight:600;font-size:14px;display:flex;align-items:center;justify-content:space-between;list-style:none;user-select:none;padding:2px 0}\n.fusion-history-summary::-webkit-details-marker{display:none}\n.fusion-history-summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}\n.fusion-history-title{display:inline-flex;align-items:center;gap:6px}\n.fusion-history-title h3{margin:0;font-size:15px;font-weight:600}\n.fusion-history-indicator{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:400;color:var(--dsw-alias-label-secondary)}\n.fusion-history-chevron{display:inline-block;width:7px;height:7px;border-right:2px solid var(--dsw-alias-label-secondary);border-bottom:2px solid var(--dsw-alias-label-secondary);transform:rotate(-45deg);transition:transform .15s ease;margin-left:2px}\n.fusion-history[open] .fusion-history-chevron{transform:rotate(45deg)}\n.fusion-history-content{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);margin-top:4px}\n.fusion-history-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}\n.fusion-history-panel{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.fusion-history-usage h3{margin:0;font-size:14px;font-weight:600}\n.fusion-history table{width:100%;border-collapse:collapse;font-size:12px;text-align:left}\n.fusion-history :is(th,td){padding:8px;border-bottom:1px solid var(--dsw-alias-border-l2);font-weight:400;vertical-align:top}\n.fusion-history caption{text-align:left;font-size:13px;margin-bottom:8px}\n.fusion-history small{display:block;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere}\n.fusion-history ol{padding-left:20px;margin:0}\n.fusion-history li{padding:10px 0;border-bottom:1px solid var(--dsw-alias-border-l2)}\n.fusion-history li:last-child{border-bottom:0}\n.fusion-history h3{margin:0;font-size:14px;font-weight:600}\n.fusion-history p{overflow-wrap:anywhere}\n.fusion-history-tasks-summary{cursor:pointer;font-weight:600;font-size:14px;display:flex;align-items:center;justify-content:space-between;list-style:none;user-select:none;padding:2px 0}\n.fusion-history-tasks-summary::-webkit-details-marker{display:none}\n.fusion-history-tasks-summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}\n.fusion-history-tasks-title{display:inline-flex;align-items:center;gap:6px}\n.fusion-history-count{font-size:13px;font-weight:400;color:var(--dsw-alias-label-secondary)}\n.fusion-history-tasks-indicator{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:400;color:var(--dsw-alias-label-secondary)}\n.fusion-history-tasks-chevron{display:inline-block;width:7px;height:7px;border-right:2px solid var(--dsw-alias-label-secondary);border-bottom:2px solid var(--dsw-alias-label-secondary);transform:rotate(-45deg);transition:transform .15s ease;margin-left:2px}\n.fusion-history-tasks[open] .fusion-history-tasks-chevron{transform:rotate(45deg)}\n.fusion-history-tasks-content{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);margin-top:4px}\n.fusion-history-item-header{display:flex;align-items:center;justify-content:space-between;gap:12px}\n.fusion-history-item-header h3{margin:0;font-size:14px;font-weight:600}\n.fusion-history-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}\n.fusion-history-actions button{padding:3px 12px;font-size:12px;border-radius:14px}\n.fusion-history-actions button.fusion-btn-subtle{background:transparent;color:var(--dsw-alias-label-primary)}\n.fusion-history-confirm-text{font-size:12px;color:var(--dsw-alias-label-secondary)}\n@media(max-width:480px){.fusion-page{padding:0 16px 32px}.fusion-settings label{grid-template-columns:1fr;gap:6px}.fusion-settings .fusion-card{padding:16px}}\n.fusion-agy{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.fusion-agy-summary{cursor:pointer;font-weight:600;font-size:14px;display:flex;align-items:center;justify-content:space-between;gap:12px;list-style:none;user-select:none;padding:2px 0}\n.fusion-agy-summary::-webkit-details-marker{display:none}\n.fusion-agy-summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}\n.fusion-agy-title h3{margin:0;font-size:15px;font-weight:600}\n.fusion-agy-summary small{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:400}\n.fusion-agy-content{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);margin-top:4px;min-width:0}\n.fusion-nav{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0;padding:0}\n.fusion-nav button{padding:6px 14px;border-radius:14px;background:none;color:var(--dsw-alias-label-secondary);font-size:13px;border:1px solid var(--dsw-alias-border-l2)}\n.fusion-nav button[aria-pressed=true]{background:var(--dsw-alias-interactive-bg-hover-accent);border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary);font-weight:600}\n.fusion-nav button:hover:not([aria-pressed=true]){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.fusion-section{display:flex;flex-direction:column;gap:18px;min-width:0}\n/* An author rule beats the UA [hidden] style, so hiding a section needs its own rule. */\n.fusion-section[hidden]{display:none}\n`\n\nconst key = (route: PhysicalRoute | undefined) => route ? JSON.stringify([route.provider, route.model]) : ''\n\nexport function ModelChoice({ role, route, catalog, onChange }: {\n role: 'Lead' | 'Sidekick' | 'compactor'; route?: PhysicalRoute; catalog: SettingsCatalog; onChange(route: PhysicalRoute | undefined): void\n}) {\n const lang = useLang()\n const name = role === 'compactor' ? tr(lang, '\u538B\u7F29', 'Compaction') : role\n const model = catalog.groups.find(group => group.id === route?.provider)?.models.find(model => model.id === route?.model)\n // A saved route the catalog no longer offers would otherwise fall back to the\n // placeholder, silently reading as \"nothing chosen\" \u2014 and hiding which model\n // went away. Keep it listed, disabled and labelled, until it is replaced.\n const stale = route !== undefined && model === undefined\n return <fieldset>\n <legend>{name}</legend>\n <p>{role === 'Lead' ? tr(lang, '\u56DE\u7B54\u95EE\u9898\u3001\u5236\u5B9A\u65B9\u6848\u5E76\u5BA1\u67E5\u7ED3\u679C\u3002', 'Answers, plans and reviews.') : role === 'Sidekick' ? tr(lang, '\u6267\u884C\u547D\u4EE4\u548C\u4FEE\u6539\uFF0C\u63A5\u6536\u53CD\u9988\u540E\u7EE7\u7EED\u3002', 'Runs commands and makes changes, then continues with feedback.') : tr(lang, '\u6574\u7406\u8F83\u65E9\u7684\u4E0A\u4E0B\u6587\uFF0C\u4F9B Lead \u6216 Worker \u7EE7\u7EED\u5DE5\u4F5C\u3002', 'Summarises older context so the Lead or Sidekick can continue.')}</p>\n <label>{tr(lang, '\u6A21\u578B', 'Model')}<select aria-label={tr(lang, `${name} \u6A21\u578B`, `${name} model`)} value={key(route)} onChange={event => {\n if (!event.target.value) { onChange(undefined); return }\n const [provider, model] = JSON.parse(event.target.value) as [string, string]\n onChange({ provider, model })\n }}>\n <option value=\"\" disabled={role !== 'compactor'}>{role === 'compactor' ? tr(lang, '\u4F7F\u7528\u5F53\u524D\u89D2\u8272\u6A21\u578B', 'Use the role\\'s own model') : tr(lang, '\u9009\u62E9\u5DF2\u8FDE\u63A5\u7684\u6A21\u578B', 'Choose a connected model')}</option>\n {stale && route && <option value={key(route)} disabled>{tr(lang, `\u5DF2\u4E0D\u53EF\u7528\uFF1A${route.provider}/${route.model}`, `No longer available: ${route.provider}/${route.model}`)}</option>}\n {catalog.groups.map(group => <optgroup key={group.id} label={group.name}>\n {group.models.map(model => <option key={model.id} value={key({ provider: group.id, model: model.id })}>{model.name}</option>)}\n </optgroup>)}\n </select></label>\n {stale && route && <p role=\"alert\">{tr(lang, `\u8FD9\u4E2A\u89D2\u8272\u4FDD\u5B58\u7684\u6A21\u578B ${route.provider}/${route.model} \u5DF2\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u3002`,\n `This role's saved model ${route.provider}/${route.model} is no longer available; choose another.`)}</p>}\n {model?.reasoning && route && <label>{tr(lang, '\u63A8\u7406\u5F3A\u5EA6', 'Reasoning')}<select aria-label={tr(lang, `${name} \u63A8\u7406\u5F3A\u5EA6`, `${name} reasoning`)} value={route.reasoningEffort ?? ''} onChange={event => {\n const { reasoningEffort: _old, ...physical } = route\n onChange({ ...physical, ...(event.target.value ? { reasoningEffort: event.target.value } : {}) })\n }}>\n <option value=\"\">{tr(lang, '\u6A21\u578B\u9ED8\u8BA4', 'Model default')}{model.reasoning.defaultEffort ? ` \u00B7 ${model.reasoning.defaultEffort}` : ''}</option>\n {model.reasoning.efforts.map(effort => <option key={effort.id} value={effort.id}>{effort.name}</option>)}\n </select></label>}\n </fieldset>\n}\n\nlet draftKeys = 0\nconst toDraft = (pairs: readonly SavedPairView[]): DraftCombo[] => pairs.map(({ id, name, pair }) => ({ key: id, id, name, pair }))\n\n/** The three regions of this one page. Fusion is the default and the plugin's core. */\ntype StudioSection = 'fusion' | 'antigravity' | 'acp'\nconst STUDIO_SECTIONS: readonly StudioSection[] = ['fusion', 'antigravity', 'acp']\nconst SECTION_ID = (section: StudioSection) => `fusion-section-${section}`\n\nexport function FusionSettings() {\n const lang = useLang()\n const [section, setSection] = useState<StudioSection>('fusion')\n const [state, setState] = useState<SettingsState>()\n const [draft, setDraft] = useState<DraftCombo[]>([])\n const [active, setActive] = useState(0)\n const [error, setError] = useState<string>()\n const [notice, setNotice] = useState<string>()\n const [saving, setSaving] = useState(false)\n const current = draft[Math.min(active, draft.length - 1)]\n const routeName = (route?: PhysicalRoute) => route\n ? state?.catalog.groups.find(group => group.id === route.provider)?.models.find(model => model.id === route.model)?.name\n ?? `${route.provider}/${route.model}` : '\u2014'\n const roleLabel = (role: 'lead' | 'worker' | 'compactor') => role === 'lead' ? tr(lang, 'Lead', 'Lead')\n : role === 'worker' ? tr(lang, 'Sidekick', 'Sidekick') : tr(lang, '\u538B\u7F29\u6A21\u578B', 'Compaction model')\n const update = (change: (combo: DraftCombo) => DraftCombo) => setDraft(value => value.map((combo, index) =>\n combo.key === current?.key ? change(combo) : combo))\n const chooseModel = (role: 'lead' | 'worker', route: PhysicalRoute) => update(combo => ({ ...combo, pair: { ...combo.pair, [role]: route,\n ...(combo.pair.cacheKeepalive ? { cacheKeepalive: { ...combo.pair.cacheKeepalive, [role]: role === 'lead' ? 'auto' : false } } : {}) } }))\n useEffect(() => {\n const abort = new AbortController()\n void fetch(`${FUSION_API_PATH}?view=settings`, { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n .then(async response => { if (!response.ok) throw new Error(tr(lang, '\u65E0\u6CD5\u8BFB\u53D6 Fusion \u8BBE\u7F6E', 'Cannot read Fusion settings')); return response.json() as Promise<SettingsState> })\n .then(value => { setState(value); setDraft(toDraft(value.pairs)); setActive(0) })\n .catch(error => { if (!abort.signal.aborted) setError(String(error)) })\n return () => abort.abort()\n }, [])\n const addCombo = () => {\n draftKeys += 1\n setDraft(value => [...value, { key: `new-${draftKeys}`, name: tr(lang, `\u7EC4\u5408 ${value.length + 1}`, `Combo ${value.length + 1}`), pair: {} }])\n setActive(draft.length)\n }\n const removeCombo = (index: number) => {\n setDraft(value => value.filter((_, position) => position !== index))\n setActive(Math.max(0, Math.min(active > index ? active - 1 : active, draft.length - 2)))\n }\n const save = async () => {\n if (!state) return\n const invalid = draft.findIndex(combo => !combo.pair.lead || !combo.pair.worker || !combo.name.trim())\n if (invalid >= 0) { setError(tr(lang, `\u7B2C ${invalid + 1} \u4E2A\u7EC4\u5408\u8FD8\u4E0D\u5B8C\u6574\uFF1A\u9700\u8981\u540D\u79F0\u3001Lead \u548C Sidekick\u3002`, `Combo ${invalid + 1} is incomplete: it needs a name, a Lead and a Sidekick.`)); return }\n // A route that no longer exists cannot be saved, and the Host's own refusal\n // names only the role. Checked here so the message can name the combo too:\n // with several rows, \"the Lead model is gone\" does not say which row to open.\n const stale = draft.flatMap((combo, index) => missingRoutes(combo.pair, state.catalog).map(({ role, route }) =>\n tr(lang, `\u7B2C ${index + 1} \u4E2A\u7EC4\u5408\u300C${combo.name.trim() || tr(lang, '\u672A\u547D\u540D\u7EC4\u5408', 'Untitled combo')}\u300D\u7684 ${roleLabel(role)} \u6A21\u578B\u5DF2\u4E0D\u53EF\u7528\uFF1A${route.provider}/${route.model}\u3002\u8BF7\u4E3A\u8BE5\u89D2\u8272\u91CD\u65B0\u9009\u62E9\u6A21\u578B\u3002`,\n `Combo ${index + 1} \"${combo.name.trim() || 'Untitled combo'}\" still names a ${roleLabel(role)} model that is no longer available: ${route.provider}/${route.model}. Choose a model for that role again.`)))\n if (stale.length) { setError(stale.join(tr(lang, ' ', ' '))); return }\n setSaving(true); setError(undefined); setNotice(undefined)\n try {\n const pairs = draft.map(({ id, name, pair }) => {\n const { outputTokens, ...rest } = pair\n const limits = Object.fromEntries(Object.entries(outputTokens ?? {}).filter(([, tokens]) => Number.isSafeInteger(tokens) && Number(tokens) > 0))\n return { ...(id ? { id } : {}), name: name.trim(), pair: { ...rest, ...(Object.keys(limits).length ? { outputTokens: limits } : {}) } }\n })\n const response = await fetch(FUSION_API_PATH, { method: 'POST', credentials: 'same-origin',\n headers: { 'content-type': 'application/json' }, body: JSON.stringify({ action: 'configure', revision: state.revision, pairs }) })\n const result = await response.json() as { revision: number; error?: string }\n if (!response.ok) throw new Error(result.error ?? tr(lang, '\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5', 'Save failed; refresh and try again'))\n const confirmed = await fetch(`${FUSION_API_PATH}?view=settings`, { credentials: 'same-origin', cache: 'no-store' })\n if (!confirmed.ok) throw new Error(tr(lang, '\u914D\u7F6E\u5DF2\u63D0\u4EA4\uFF0C\u4F46\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\uFF0C\u8BF7\u5237\u65B0', 'Saved, but not confirmed yet; refresh'))\n const next = await confirmed.json() as SettingsState\n setState(next); setDraft(toDraft(next.pairs)); setActive(0)\n settingsChanged()\n setNotice(tr(lang, '\u7EC4\u5408\u5DF2\u4FDD\u5B58\u3002\u6A21\u578B\u83DC\u5355\u4E2D\u6BCF\u4E2A\u7EC4\u5408\u5404\u5360\u4E00\u9879\uFF0C\u4E0D\u540C\u4F1A\u8BDD\u53EF\u4EE5\u540C\u65F6\u4F7F\u7528\u4E0D\u540C\u7EC4\u5408\u3002', 'Combos saved. Each one is its own model-menu entry, so different conversations can use different combos at the same time.'))\n } catch (error) { setError(error instanceof Error ? error.message : String(error)) }\n finally { setSaving(false) }\n }\n const dirty = state ? JSON.stringify(draft.map(({ id, name, pair }) => ({ id, name, pair })))\n !== JSON.stringify(state.pairs.map(({ id, name, pair }) => ({ id, name, pair }))) : false\n const blocked = state?.pairs.filter(pair => !pair.authorized) ?? []\n return <div className=\"fusion-page\">\n <style>{styles}</style>\n <div className=\"fusion-settings\">\n <header data-window-drag><h2>{STUDIO_TITLE}</h2>\n <p>{tr(lang, '\u4E00\u4E2A\u63D2\u4EF6\u6574\u5408\u4E09\u79CD\u80FD\u529B\uFF1AFusion \u7EC4\u5408\uFF08\u5728\u8FD9\u91CC\u914D\u7F6E\uFF0CLead \u4E0E Sidekick \u5206\u644A\u5DE5\u4F5C\u4E0E\u6210\u672C\uFF09\u3001Antigravity\uFF08agy CLI \u6A21\u578B\u7EBF\u8DEF\uFF0C\u8D26\u53F7\u4E0E\u989D\u5EA6\u7BA1\u7406\uFF09\u4E0E ACP \u4EE3\u7406\u7EBF\u8DEF\uFF08\u63A5\u5165\u8BF4\u660E\uFF09\u3002\u5DE6\u4FA7\u8FB9\u680F\u53EA\u6709 Fusion \u4E00\u4E2A\u5165\u53E3\uFF0C\u4E09\u4E2A\u533A\u57DF\u5728\u672C\u9875\u5185\u5207\u6362\u3002',\n 'One plugin for three capabilities: Fusion combos (configured here \u2014 a Lead and a Sidekick sharing the work and the cost), Antigravity (the agy CLI model route, with account and quota management) and ACP agent routes (setup guidance). The sidebar has one entry \u2014 Fusion \u2014 and the three are sections of this page.')}</p>\n </header>\n {/* A button group, not a tablist: no roving tabindex, no arrow-key focus\n management, so it must not claim role=\"tab\". The sections stay plain\n accessible regions the buttons point at. */}\n <nav className=\"fusion-nav\" aria-label={tr(lang, '\u672C\u9875\u533A\u57DF', 'Page sections')}>\n {STUDIO_SECTIONS.map(name => <button key={name} type=\"button\"\n aria-pressed={section === name}\n aria-controls={SECTION_ID(name)}\n onClick={() => setSection(name)}>{name === 'fusion' ? tr(lang, 'Fusion \u7EC4\u5408', 'Fusion combos')\n : name === 'antigravity' ? tr(lang, 'Antigravity', 'Antigravity') : tr(lang, 'ACP \u7EBF\u8DEF', 'ACP routes')}</button>)}\n </nav>\n {error && <p role=\"alert\">{error}</p>}\n {notice && <p role=\"status\">{notice}</p>}\n {/* The Fusion region stays mounted while another section is shown: unsaved\n combo edits and the selected row live in this component's state, and a\n hidden section keeps them. `hidden` (not unmounting) is what preserves them. */}\n <div className=\"fusion-section\" id={SECTION_ID('fusion')} hidden={section !== 'fusion'}\n role=\"region\" aria-label={tr(lang, 'Fusion \u7EC4\u5408', 'Fusion combos')}>\n <h3>{tr(lang, 'Fusion \u7EC4\u5408', 'Fusion combos')}</h3>\n <p>{tr(lang, '\u6BCF\u4E2A\u7EC4\u5408\u662F\u4E00\u5BF9 Lead \u548C Sidekick\uFF0C\u4F1A\u4F5C\u4E3A\u5355\u72EC\u7684\u4E00\u9879\u51FA\u73B0\u5728\u6A21\u578B\u83DC\u5355\u91CC\u3002\u5F00\u542F\u591A\u4E2A\u4F1A\u8BDD\u65F6\uFF0C\u53EF\u4EE5\u4E3A\u6BCF\u4E2A\u4F1A\u8BDD\u9009\u62E9\u4E0D\u540C\u7684\u7EC4\u5408\u3002', 'Each combo is a Lead and a Sidekick pair, listed as its own entry in the model menu. With several conversations open, each one can use a different combo.')}</p>\n <p>{tr(lang, 'Lead \u5904\u7406\u65E5\u5E38\u8BF7\u6C42\u3001\u5B89\u6392\u5DE5\u4F5C\u5E76\u5BA1\u67E5\u7ED3\u679C\uFF1BSidekick \u6267\u884C\u59D4\u6D3E\u7684\u4EFB\u52A1\u3002', 'The Lead handles requests, plans and reviews; the Sidekick does the delegated work.')}</p>\n <p><b>{tr(lang, '\u642D\u914D\u5EFA\u8BAE', 'Pairing tip')}</b>: {tr(lang, 'Fusion \u7701\u94B1\u9760\u7684\u662F Sidekick \u6BD4 Lead \u4FBF\u5B9C\u5F97\u591A\u3002\u9009\u4E00\u4E2A\u5F3A\u7684\u524D\u6CBF\u6A21\u578B\u5F53 Lead\uFF0C\u518D\u9009\u4E00\u4E2A\u4EF7\u683C\u4F4E\u5F88\u591A\uFF08\u6700\u597D 5 \u500D\u4EE5\u4E0A\uFF09\u7684\u6A21\u578B\u5F53 Sidekick\uFF1B\u4E24\u8005\u4EF7\u683C\u8D8A\u63A5\u8FD1\uFF0C\u8D8A\u7701\u4E0D\u4E86\u94B1\u3002',\n 'Fusion saves money because the Sidekick is much cheaper than the Lead. Pick a strong frontier Lead and a Sidekick that costs far less (ideally 5\u00D7 or more); the closer their prices, the smaller the saving.')}</p>\n {!state && !error && <p role=\"status\">{tr(lang, '\u6B63\u5728\u8BFB\u53D6\u6A21\u578B\u2026', 'Loading models\u2026')}</p>}\n {state && <>\n <section className=\"fusion-card\" aria-label={tr(lang, '\u7EC4\u5408\u5217\u8868', 'Combo list')}>\n <div className=\"fusion-combos\">\n {draft.map((combo, index) => {\n const selected = combo.key === current?.key\n const label = combo.name.trim() || tr(lang, '\u672A\u547D\u540D\u7EC4\u5408', 'Untitled combo')\n // The whole row is the selection target: the button spans the row up to the Delete\n // button, so the padding and the empty space beside the text select the combo too.\n return <div className=\"fusion-combo\" key={combo.key} data-active={selected}>\n <button type=\"button\" className=\"fusion-combo-main\" aria-pressed={selected}\n onClick={() => setActive(index)}>\n <span className=\"fusion-combo-check\" aria-hidden=\"true\" />\n <span className=\"fusion-combo-text\">\n <span className=\"fusion-combo-name\">{label}</span>\n <span className=\"fusion-combo-routes\">{`${routeName(combo.pair.lead)} \u2192 ${routeName(combo.pair.worker)}`}</span>\n {missingRoutes(combo.pair, state.catalog).length > 0 && <span className=\"fusion-combo-stale\">\n {tr(lang, '\u6709\u6A21\u578B\u5DF2\u4E0D\u53EF\u7528\uFF0C\u9700\u8981\u91CD\u65B0\u9009\u62E9', 'A model is no longer available; choose it again')}</span>}\n </span>\n </button>\n <button type=\"button\" className=\"fusion-combo-actions\" disabled={saving || draft.length <= 1}\n aria-label={tr(lang, `\u5220\u9664\u7EC4\u5408 ${label}`, `Delete combo ${label}`)}\n onClick={event => { event.stopPropagation(); removeCombo(index) }}>{tr(lang, '\u5220\u9664', 'Delete')}</button>\n </div>\n })}\n {!draft.length && <p>{tr(lang, '\u8FD8\u6CA1\u6709\u7EC4\u5408\u3002\u65B0\u589E\u4E00\u4E2A\uFF0C\u9009\u62E9 Lead \u548C Sidekick \u540E\u4FDD\u5B58\u3002', 'No combos yet. Add one, choose a Lead and a Sidekick, then save.')}</p>}\n </div>\n <button type=\"button\" className=\"fusion-combo-add\" disabled={saving || draft.length >= state.maxPairs} onClick={addCombo}>{tr(lang, '\uFF0B \u65B0\u589E\u7EC4\u5408', '+ Add combo')}</button>\n <p>{tr(lang, `\u6700\u591A\u4FDD\u5B58 ${state.maxPairs} \u4E2A\u7EC4\u5408\uFF1B\u6A21\u578B\u83DC\u5355\u4E2D\u7684\u540D\u79F0\u662F\u300CFusion \u00B7 \u7EC4\u5408\u540D\u79F0\u300D\u3002`, `Up to ${state.maxPairs} combos; the model menu shows them as \u201CFusion \u00B7 name\u201D.`)}</p>\n </section>\n {current && <fieldset className=\"fusion-card\" disabled={saving}>\n <label>{tr(lang, '\u540D\u79F0', 'Name')}<input type=\"text\" maxLength={40} aria-label={tr(lang, '\u7EC4\u5408\u540D\u79F0', 'Combo name')}\n value={current.name} onChange={event => update(combo => ({ ...combo, name: event.target.value }))} /></label>\n <ModelChoice role=\"Lead\" route={current.pair.lead} catalog={state.catalog} onChange={route => { if (route) chooseModel('lead', route) }} />\n <ModelChoice role=\"Sidekick\" route={current.pair.worker} catalog={state.catalog} onChange={route => { if (route) chooseModel('worker', route) }} />\n <details><summary>{tr(lang, '\u4E0A\u4E0B\u6587\u538B\u7F29\u6A21\u578B \u00B7 \u53EF\u9009', 'Compaction model \u00B7 optional')}</summary>\n <div className=\"fusion-limits\">\n <p>{tr(lang, '\u9ED8\u8BA4\u7531\u5F53\u524D\u89D2\u8272\u6A21\u578B\u538B\u7F29\u3002\u4E5F\u53EF\u4EE5\u5355\u72EC\u9009\u62E9\u5DF2\u8FDE\u63A5\u7684\u6A21\u578B\uFF1B\u8BF7\u6C42\u7531\u6240\u9009\u8D26\u53F7\u8BA1\u8D39\u3002', 'By default each role compacts with its own model. You can pick another connected model; its account is billed.')}</p>\n <ModelChoice role=\"compactor\" route={current.pair.compactor?.route} catalog={state.catalog} onChange={route => update(combo => {\n const { compactor, ...rest } = combo.pair\n return { ...combo, pair: route ? { ...rest, compactor: { route, maxOutputTokens: compactor?.maxOutputTokens ?? 8192 } } : rest }\n })} />\n {current.pair.compactor && <label>{tr(lang, '\u8F93\u51FA Token \u4E0A\u9650', 'Output token limit')}<input aria-label={tr(lang, '\u538B\u7F29\u8F93\u51FA Token \u4E0A\u9650', 'Compaction output token limit')} type=\"number\" min=\"1\" max=\"128000\"\n value={current.pair.compactor.maxOutputTokens} onChange={event => { const maxOutputTokens = Number(event.target.value)\n update(combo => combo.pair.compactor ? { ...combo, pair: { ...combo.pair, compactor: { ...combo.pair.compactor, maxOutputTokens } } } : combo) }} /></label>}\n </div>\n </details>\n </fieldset>}\n <div className=\"fusion-actions\"><p>{tr(lang, '\u5DF2\u9009\u4E2D\u7684\u4F1A\u8BDD\u4FDD\u7559\u539F\u7EC4\u5408\uFF1B\u65B0\u9009\u62E9\u4F7F\u7528\u65B0\u7EC4\u5408\u3002\u989D\u5EA6\u8017\u5C3D\u540E\u8981\u6362\u5F53\u524D\u4EFB\u52A1\u7684 Sidekick\uFF0C\u7528\u8BE5\u4F1A\u8BDD\u7684 Fusion \u6062\u590D\u9762\u677F\uFF0C\u800C\u4E0D\u662F\u53EA\u6539\u8FD9\u91CC\u3002', 'Conversations already using Fusion keep their pair; new selections use the new one. After a quota stop, switch this conversation\\'s Sidekick from its Fusion recovery panel, not only here.')}</p>\n <button disabled={saving || !dirty || !draft.length} onClick={() => { void save() }}>{saving ? tr(lang, '\u6B63\u5728\u4FDD\u5B58\u2026', 'Saving\u2026') : tr(lang, '\u4FDD\u5B58\u7EC4\u5408', 'Save combos')}</button>\n </div>\n <p>{tr(lang, '\u8F93\u51FA\u53C2\u6570\u8DDF\u968F\u539F\u751F\u6A21\u578B\u8BBE\u7F6E\uFF0CFusion \u4E0D\u989D\u5916\u9650\u5236\u8BF7\u6C42\u6B21\u6570\u6216\u4EFB\u52A1\u8F6E\u6570\u3002', 'Output settings follow the native model settings; Fusion adds no request or round limits.')}</p>\n <p>{tr(lang, '\u4FDD\u5B58\u5373\u8868\u793A\u5141\u8BB8 Fusion \u4F7F\u7528\u6240\u9009\u6A21\u578B\u7684\u73B0\u6709\u8D26\u53F7\uFF1B\u8D39\u7528\u7531\u8FD9\u4E9B\u8D26\u53F7\u8BA1\u5165\uFF0C\u5F53\u524D\u672A\u63D0\u4F9B\u53EF\u9760\u7684\u5B9E\u9645\u8D26\u5355\u91D1\u989D\u3002', 'Saving lets Fusion use the chosen models\\' existing accounts; they are billed there, and no reliable billed amount is available here.')}</p>\n {blocked.map(pair => <p key={pair.id} role=\"status\">{`${pair.name}: ${tr(lang, '\u5C1A\u672A\u5C31\u7EEA\uFF0C\u9700\u8981\u91CD\u65B0\u4FDD\u5B58\u8FD9\u4E2A\u7EC4\u5408', 'not ready yet; save this combo again')}${pair.reason ? `: ${pair.reason}` : ''}`}</p>)}\n {state.managedAuthorization && <p>{tr(lang, '\u8FD0\u884C\u989D\u5EA6\u7531\u5916\u90E8\u6388\u6743\u914D\u7F6E\u7BA1\u7406\u3002', 'Run limits are managed by an external authorization file.')}</p>}\n </>}\n <FusionCache refresh={state?.revision ?? 0} />\n <FusionHistory />\n </div>\n {/* Both regions stay in the document so every `aria-controls` resolves, and\n both are `hidden` while unselected. Only their CONTENTS mount on demand:\n the console starts a 3s status poll and reads the account pool on mount,\n so an unvisited section must not pay for it. */}\n <div className=\"fusion-section\" id={SECTION_ID('antigravity')} hidden={section !== 'antigravity'}\n role=\"region\" aria-label={tr(lang, 'Antigravity\uFF08agy CLI\uFF09', 'Antigravity (agy CLI)')}>\n <h3>{tr(lang, 'Antigravity', 'Antigravity')}</h3>\n <p>{tr(lang, '\u628A Google Antigravity\uFF08agy CLI\uFF09\u4F5C\u4E3A\u6A21\u578B\u8DEF\u7EBF\u4E0E Sidekick \u4F7F\u7528\u3002\u8FD9\u91CC\u7BA1\u7406\u5B83\u7684\u8D26\u53F7\u3001\u989D\u5EA6\u3001\u6A21\u578B\u53EF\u89C1\u6027\u4E0E\u6743\u9650\u6A21\u5F0F\uFF1B\u8DEF\u7EBF\u540D\u4E3A antigravity\uFF0C\u547D\u4EE4\u4E3A /agy\u3002',\n 'Use Google Antigravity (agy CLI) as a model route and as a Sidekick. This section manages its accounts, quota, model visibility and permission mode; the route is antigravity and the command is /agy.')}</p>\n {section === 'antigravity' && <AgyConsole isModal={false} />}\n </div>\n <div className=\"fusion-section\" id={SECTION_ID('acp')} hidden={section !== 'acp'}\n role=\"region\" aria-label={tr(lang, 'ACP \u7EBF\u8DEF', 'ACP routes')}>\n {section === 'acp' && <AcpSettingsGuide />}\n </div>\n </div>\n </div>\n}\n", "import { bi } from '../bilingual.js'\nimport type { PairProfile, PhysicalRoute } from '../contracts.js'\nimport { keepaliveChoice } from '../profile/keepalive.js'\nimport { compactorChoice } from '../profile/compactor.js'\nimport { isFusionProvider } from '../identity.js'\n\nexport interface PairChoice {\n lead: PhysicalRoute\n worker: PhysicalRoute\n outputTokens?: Partial<Record<'lead' | 'worker', number>>\n cacheKeepalive?: PairProfile['cacheKeepalive']\n compactor?: PairProfile['compactor']\n}\nexport interface SettingsCatalog {\n groups: readonly { id: string; name: string; models: readonly {\n id: string; name: string; reasoning?: { efforts: readonly { id: string; name: string }[]; defaultEffort?: string }\n }[] }[]\n}\n\n/** Saved Lead route from a raw settings or profile document, or undefined when unconfigured or pointed at Fusion itself. */\nexport function savedLeadRoute(value: unknown): { provider: string; model: string } | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined\n const route = (value as Record<string, unknown>).lead\n if (!route || typeof route !== 'object' || Array.isArray(route)) return undefined\n const provider = (route as Record<string, unknown>).provider, model = (route as Record<string, unknown>).model\n if (typeof provider !== 'string' || typeof model !== 'string' || isFusionProvider(provider)) return undefined\n return { provider, model }\n}\n\n/** The roles a saved pair names, in the order the settings page shows them. */\nexport type PairRole = 'lead' | 'worker' | 'compactor'\n\n/**\n * The routes a saved choice still names that the current catalog no longer\n * offers: a provider that was renamed or removed, or a model that was retired.\n *\n * Reading a saved combo tolerates a stale route so the row stays visible and\n * editable, but saving one does not. Without this, the page can only say that\n * *some* model is gone, which is unusable when the stale route is not the one\n * being edited \u2014 the user then cannot tell which combo to fix.\n */\nexport function missingRoutes(value: Partial<PairChoice> | undefined, catalog: SettingsCatalog): { role: PairRole; route: PhysicalRoute }[] {\n if (!value) return []\n const stale = (role: PairRole, route: PhysicalRoute | undefined) => route !== undefined\n && !catalog.groups.find(group => group.id === route.provider)?.models.find(model => model.id === route.model)\n ? [{ role, route }] : []\n return [...stale('lead', value.lead), ...stale('worker', value.worker), ...stale('compactor', value.compactor?.route)]\n}\n\n/** Configuration chooses registered physical models; it cannot create adapters. */\nexport function validatePairChoice(value: unknown, catalog: SettingsCatalog, combo?: string): PairChoice {\n // A list is validated row by row, so the failure has to say which row it came\n // from; `bi` carries both languages, so the label joins the message here\n // instead of being glued onto an already-bilingual string.\n const say = (zh: string, en: string) => combo\n ? bi(`\u7EC4\u5408\u300C${combo}\u300D\uFF1A${zh}`, `Combo \"${combo}\": ${en}`) : bi(zh, en)\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(say('\u8BF7\u9009\u62E9 Lead \u548C Worker', 'Choose a Lead and a Sidekick'))\n const raw = value as Record<string, unknown>\n const route = (role: string, candidate: unknown): PhysicalRoute => {\n const item = candidate as Record<string, unknown> | undefined\n if (!item || typeof item.provider !== 'string' || typeof item.model !== 'string') throw new Error(say(`\u8BF7\u9009\u62E9 ${role} \u6A21\u578B`, `Choose the ${role} model`))\n if (isFusionProvider(item.provider)) throw new Error(say('Fusion \u5FC5\u987B\u9009\u62E9\u771F\u5B9E\u6A21\u578B', 'Fusion needs real models, not Fusion itself'))\n const group = catalog.groups.find(group => group.id === item.provider)\n const model = group?.models.find(model => model.id === item.model)\n // Name the exact route: after a provider rename the model usually still\n // exists elsewhere, so \"refresh and choose again\" alone leaves the user\n // guessing which of the two roles went stale.\n if (!model) throw new Error(say(`${role} \u6A21\u578B\u5DF2\u4E0D\u53EF\u7528\uFF1A${item.provider}/${item.model}\u3002\u8BF7\u4E3A\u8BE5\u89D2\u8272\u91CD\u65B0\u9009\u62E9\u6A21\u578B`,\n `The ${role} model is no longer available: ${item.provider}/${item.model}. Choose a model for that role again`))\n if (item.reasoningEffort !== undefined && (typeof item.reasoningEffort !== 'string'\n || !model.reasoning?.efforts.some(effort => effort.id === item.reasoningEffort))) {\n throw new Error(say(`${role} \u4E0D\u652F\u6301\u6240\u9009\u63A8\u7406\u5F3A\u5EA6`, `${role} does not support the selected reasoning level`))\n }\n return { provider: item.provider, model: item.model,\n ...(item.reasoningEffort === undefined ? {} : { reasoningEffort: item.reasoningEffort as string }) }\n }\n const cacheKeepalive = keepaliveChoice(raw.cacheKeepalive)\n const compactor = compactorChoice(raw.compactor)\n let outputTokens: PairChoice['outputTokens']\n if (raw.outputTokens !== undefined) {\n const value = raw.outputTokens\n if (!value || typeof value !== 'object' || Array.isArray(value)\n || Object.entries(value).some(([role, tokens]) => !['lead', 'worker'].includes(role)\n || !Number.isSafeInteger(tokens) || Number(tokens) < 1 || Number(tokens) > 128_000)) {\n throw new Error(say('\u6BCF\u6B21\u54CD\u5E94\u4E0A\u9650\u5FC5\u987B\u662F 1\u2013128000 \u7684\u6574\u6570 Token \u6570', 'The per-response limit must be an integer of 1\u2013128000 tokens'))\n }\n outputTokens = { ...value } as PairChoice['outputTokens']\n }\n return { lead: route('lead', raw.lead), worker: route('worker', raw.worker),\n ...(outputTokens === undefined ? {} : { outputTokens }),\n ...(cacheKeepalive === undefined ? {} : { cacheKeepalive }),\n ...(compactor === undefined ? {} : { compactor: { ...compactor, route: route('\u538B\u7F29 \u00B7 Compaction', compactor.route) } }) }\n}\n\n/** New sessions can opt into this Worker cap. Frozen sessions keep their saved profile. */\nexport const WORKER_IMPLEMENTATION_OUTPUT_TOKENS = 128_000\n\nexport function profileFromChoice(pair: PairChoice, id = 'fusion-auto'): Record<string, unknown> {\n const { outputTokens, ...routes } = pair\n const version = outputTokens?.worker === WORKER_IMPLEMENTATION_OUTPUT_TOKENS ? '0.1.0-worker-128k' : '0.1.0-faithful'\n return { schemaVersion: 1, id, version, enabled: true, quality: 'experimental',\n ...routes, workerUpgradePath: [], dataPolicyId: 'native-host-workspace-policy', evidenceCampaignIds: [],\n ...(outputTokens === undefined ? {} : { context: Object.fromEntries(Object.entries(outputTokens)\n .map(([role, reserveOutputTokens]) => [role, { reserveOutputTokens }])) }) }\n}\n\n/**\n * Product defaults; explicit legacy/benchmark profiles retain their old contract.\n * `id` names the combo; the first one keeps the historical `fusion-auto` so a\n * profile frozen before combos existed keeps its identity.\n */\nexport function modelProfileFromChoice(pair: PairChoice, id = 'fusion-auto'): Record<string, unknown> {\n const { outputTokens: _output, ...native } = pair\n return { ...profileFromChoice(native, id), version: '0.2.0-enforced-v3', interactionMode: 'model-like', workflowPolicy: 'enforced-v3' }\n}\n\n/** Keep existing default settings stable; expose explicit larger/smaller limits on reload. */\nexport function choiceFromProfile(profile: PairProfile): PairChoice {\n const outputTokens = Object.fromEntries((['lead', 'worker'] as const)\n .filter(role => profile.context[role].reserveOutputTokens !== 8_000)\n .map(role => [role, profile.context[role].reserveOutputTokens]))\n return { lead: profile.lead, worker: profile.worker,\n ...(profile.interactionMode !== 'model-like' && Object.keys(outputTokens).length ? { outputTokens } : {}),\n ...(profile.compactor === undefined ? {} : { compactor: profile.compactor }),\n ...(profile.cacheKeepalive === undefined ? {} : { cacheKeepalive: profile.cacheKeepalive }) }\n}\n", "const listeners = new Set<() => void>()\nexport const onSettingsChanged = (listener: () => void): (() => void) => { listeners.add(listener); return () => { listeners.delete(listener) } }\nexport const settingsChanged = (): void => { for (const listener of listeners) listener() }\n", "import type { ReactNode } from 'react'\n\nexport interface FusionPanelIconProps {\n /** Square size in pixels requested by the host sidebar (defaults to 16). */\n size?: number\n /** Whether the panel is currently active/selected in the main column. */\n active?: boolean\n className?: string\n}\n\n/**\n * Compact, accessible icon for the Fusion sidebar entry.\n * Renders a dual-node convergence (Lead + Sidekick models fusing into one) SVG glyph.\n */\nexport function FusionPanelIcon({ size = 16, active = false, className }: FusionPanelIconProps): ReactNode {\n return (\n <svg\n role=\"img\"\n aria-label=\"Fusion\"\n aria-hidden=\"true\"\n focusable=\"false\"\n viewBox=\"0 0 16 16\"\n width={size}\n height={size}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={active ? 1.5 : 1.2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"4\" cy=\"4.5\" r=\"2\" />\n <circle cx=\"4\" cy=\"11.5\" r=\"2\" />\n <circle cx=\"12\" cy=\"8\" r=\"2\" />\n <path d=\"M6 4.5h1.5a3 3 0 0 1 2.7 1.7L10.5 6.8\" />\n <path d=\"M6 11.5h1.5a3 3 0 0 0 2.7-1.7l.3-.6\" />\n </svg>\n )\n}\n", "import { tr, useLang } from './i18n.js'\nimport { useEffect, useState, useSyncExternalStore } from 'react'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store'\nimport { onSettingsChanged } from './settings-events.js'\nimport { FusionStatus } from './FusionStatus.js'\nimport { FUSION_API_PATH, isFusionSelection } from '../identity.js'\n\nexport interface FusionHintProps { sessionId: string; directory: ObservableSnapshot<ModelDirectoryState>; load(): void }\n\n/** Additive composer hint. The original selector and its selection state stay native. */\nexport function FusionHint({ sessionId, directory, load }: FusionHintProps) {\n const selected = useSyncExternalStore(directory.subscribe, directory.getSnapshot).current\n // A session that selected Fusion before the rename stored the old route.\n const fusion = isFusionSelection(selected ?? undefined)\n const lang = useLang()\n const [message, setMessage] = useState<string>()\n useEffect(() => { load() }, [load])\n useEffect(() => {\n if (!fusion) { setMessage(undefined); return }\n let active = true\n const abort = new AbortController()\n const refresh = () => {\n void fetch(`${FUSION_API_PATH}?view=settings`, { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n .then(async response => { if (!response.ok) throw new Error('unavailable'); return response.json() as Promise<{ pairs: { id: string; authorized: boolean; reason?: string }[] }> })\n .then(state => {\n if (!active) return\n // The hint speaks for this conversation's combo, not for the first one.\n const combo = state.pairs.find(pair => pair.id === selected?.model)\n if (!state.pairs.length) setMessage(tr(lang, 'Fusion \u5C1A\u672A\u914D\u7F6E\u6A21\u578B\uFF0C\u8BF7\u6253\u5F00\u5DE6\u4FA7\u8FB9\u680F\u7684 Fusion \u9762\u677F\u9009\u62E9 Lead \u548C Sidekick\u3002', 'Fusion has no models yet: open the Fusion panel in the left sidebar and choose a Lead and a Sidekick.'))\n else if (!combo) setMessage(tr(lang, '\u5F53\u524D\u7EC4\u5408\u5DF2\u88AB\u5220\u9664\uFF0C\u8BF7\u5728\u6A21\u578B\u83DC\u5355\u4E2D\u9009\u62E9\u5176\u4ED6\u7EC4\u5408\u3002', 'This combo was removed; pick another one in the model menu.'))\n else if (!combo.authorized) setMessage(tr(lang, 'Fusion \u5F53\u524D\u914D\u7F6E\u672A\u5C31\u7EEA\uFF0C\u8BF7\u5728\u5DE6\u4FA7\u8FB9\u680F\u7684 Fusion \u9762\u677F\u67E5\u770B\u3002', 'The Fusion setup is not ready: see the Fusion panel in the left sidebar.'))\n else setMessage(undefined)\n })\n .catch(() => { if (active) setMessage(tr(lang, '\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4 Fusion \u914D\u7F6E\uFF0C\u8BF7\u5728\u5DE6\u4FA7\u8FB9\u680F\u7684 Fusion \u9762\u677F\u67E5\u770B\u3002', 'Cannot confirm the Fusion setup right now: see the Fusion panel in the left sidebar.')) })\n }\n refresh()\n const off = onSettingsChanged(refresh)\n return () => { active = false; abort.abort(); off() }\n }, [fusion, lang, selected?.model])\n if (!fusion) return null\n return <>\n {message && <p role=\"status\" style={{ margin: '8px 12px', color: 'var(--dsw-alias-label-secondary)', fontSize: 12, lineHeight: '18px' }}>{message}</p>}\n <FusionStatus sessionId={sessionId} attentionOnly />\n </>\n}\n", "import { useState } from 'react'\nimport { tr, useLang } from './i18n.js'\nimport type { FusionStatus } from '../status.js'\nimport type { PhysicalRoute } from '../contracts.js'\nimport type { SettingsCatalog } from '../host/settings.js'\nimport { ModelChoice } from './FusionSettings.js'\nimport { FUSION_API_PATH, isFusionProvider } from '../identity.js'\n\nexport function FusionRecovery({ sessionId, task }: { sessionId: string; task: NonNullable<FusionStatus['task']> }) {\n const lang = useLang()\n const control = task.modelControl!\n const [role, setRole] = useState<'lead' | 'worker'>('lead')\n const [route, setRoute] = useState<PhysicalRoute>()\n const [catalog, setCatalog] = useState<SettingsCatalog>()\n const [dueAt, setDueAt] = useState('')\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState('')\n const [error, setError] = useState('')\n const action = async (name: string) => {\n setBusy(true); setError(''); setNotice('')\n try {\n const response = await fetch(FUSION_API_PATH, { method: 'POST', credentials: 'same-origin',\n headers: { 'content-type': 'application/json' }, body: JSON.stringify({ action: name, sessionId, taskId: task.id,\n revision: control.revision, role, route, ...(dueAt ? { dueAt: new Date(dueAt).toISOString() } : {}) }) })\n const result = await response.json() as { error?: string }\n if (!response.ok) throw new Error(result.error ?? tr(lang, '\u64CD\u4F5C\u672A\u5B8C\u6210\uFF0C\u8BF7\u5237\u65B0\u72B6\u6001', 'Not completed; refresh the status'))\n setNotice(name === 'schedule' ? tr(lang, '\u5DF2\u8BBE\u7F6E\u4E00\u6B21\u5B9A\u65F6\u7EE7\u7EED\u3002Host \u9700\u8981\u8FD0\u884C\uFF1B\u65B0\u6D88\u606F\u4F1A\u53D6\u6D88\u5B89\u6392\u3002', 'One scheduled continuation is set. The Host must be running; a new message cancels it.') : name === 'cancel-schedule' ? tr(lang, '\u5DF2\u53D6\u6D88\u5B9A\u65F6\u7EE7\u7EED\u3002', 'Scheduled continuation cancelled.') : tr(lang, '\u5DF2\u63D0\u4EA4\u7EE7\u7EED\u64CD\u4F5C\uFF0C\u72B6\u6001\u5C06\u81EA\u52A8\u66F4\u65B0\u3002', 'Continuation submitted; the status updates automatically.'))\n } catch (error) { setError(error instanceof Error ? error.message : String(error)) }\n finally { setBusy(false) }\n }\n const loadCatalog = async () => {\n setError('')\n try {\n const response = await fetch(`${FUSION_API_PATH}?view=catalog`, { credentials: 'same-origin', cache: 'no-store' })\n if (!response.ok) throw new Error(tr(lang, '\u65E0\u6CD5\u8BFB\u53D6\u6A21\u578B\u5217\u8868', 'Cannot read the model list'))\n const value = await response.json() as SettingsCatalog\n setCatalog({ ...value, groups: value.groups.filter(group => !isFusionProvider(group.id)) })\n } catch (error) { setError(String(error)) }\n }\n return <section className=\"fusion-recovery\" aria-label={tr(lang, 'Fusion \u6062\u590D\u64CD\u4F5C', 'Fusion recovery')}>\n <h3>{tr(lang, '\u7EE7\u7EED\u5F53\u524D\u4EFB\u52A1', 'Continue this task')}</h3>\n {Object.entries(control.waits).filter(([, wait]) => wait?.taskId === task.id).map(([key, wait]) => <p key={key}>\n {key === 'lead' ? 'Lead' : 'Sidekick'} \u00B7 {wait!.code} \u00B7 {wait!.code === 'NO_PROGRESS' ? tr(lang, '\u91CD\u590D\u64CD\u4F5C\u6CA1\u6709\u8FDB\u5C55\uFF0C\u8BF7\u8C03\u6574\u505A\u6CD5', 'Repeated steps made no progress; change the approach') : wait!.code === 'WORKFLOW_INCOMPLETE' ? tr(lang, '\u62A5\u544A\u3001\u59D4\u6D3E\u6216\u5BA1\u67E5\u5C1A\u672A\u5B8C\u6210\uFF0C\u8BF7\u68C0\u67E5\u4EFB\u52A1\u540E\u7EE7\u7EED', 'A report, handoff or review is unfinished; check the task, then continue') : wait!.code.includes('QUOTA') ? tr(lang, '\u989D\u5EA6\u91CD\u7F6E\u65F6\u95F4\u672A\u77E5', 'Quota reset time unknown') : tr(lang, '\u9700\u8981\u5904\u7406\u6A21\u578B\u9519\u8BEF', 'A model error needs attention')}\n {wait!.retryNotBefore && <small>{tr(lang, '\u670D\u52A1\u5546\u5EFA\u8BAE\u91CD\u8BD5\u65F6\u95F4', 'Provider retry hint')}: {new Date(wait!.retryNotBefore).toLocaleString()} {tr(lang, '\uFF08\u4E0D\u4EE3\u8868\u989D\u5EA6\u91CD\u7F6E\uFF09', '(not a quota reset)')}</small>}\n </p>)}\n {control.schedule && <p role=\"status\">{tr(lang, '\u5B9A\u65F6\u7EE7\u7EED', 'Scheduled continuation')}: {new Date(control.schedule.dueAt).toLocaleString()} \u00B7 {\n ({ scheduled: tr(lang, '\u5DF2\u5B89\u6392', 'scheduled'), cancelled: tr(lang, '\u5DF2\u53D6\u6D88', 'cancelled'), fired: tr(lang, '\u5DF2\u6267\u884C\u4E00\u6B21', 'ran once'), failed: tr(lang, '\u672A\u80FD\u6267\u884C', 'failed') })[control.schedule.state]}{control.schedule.reason ? ` \u00B7 ${control.schedule.reason}` : ''}</p>}\n {control.operation && ['prepared', 'dispatching'].includes(control.operation.state) && <p role=\"alert\">{tr(lang, '\u4E0A\u6B21\u7EE7\u7EED\u64CD\u4F5C\u7684\u6295\u9012\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\u3002\u8BF7\u68C0\u67E5\u4F1A\u8BDD\uFF1B\u7CFB\u7EDF\u4E0D\u4F1A\u81EA\u52A8\u91CD\u53D1\u3002', 'Delivery of the last continuation is unconfirmed. Check the conversation; nothing is resent automatically.')}</p>}\n {(task.recovering || task.outcomeUnknown) && <p role=\"alert\">{tr(lang, '\u4E2D\u65AD\u7684\u64CD\u4F5C\u5C1A\u672A\u6838\u5BF9\u3002\u7EE7\u7EED\u548C\u66F4\u6362\u6A21\u578B\u90FD\u4E0D\u4F1A\u751F\u6548\uFF0C\u672C\u6B21\u4E5F\u4E0D\u4F1A\u5207\u6362\u6A21\u578B\u3002\u8BF7\u5148\u7528 /fusion recover <\u68C0\u67E5\u8BB0\u5F55> \u63D0\u4EA4\u6838\u5BF9\uFF0C\u518D\u7EE7\u7EED\u6216\u66F4\u6362 Sidekick\u3002Fusion \u9762\u677F\u91CC\u4FDD\u5B58\u7684\u65B0\u7EC4\u5408\u4E0D\u4F1A\u6539\u5199\u8FD9\u4E2A\u4F1A\u8BDD\u3002', 'Interrupted operations are not inspected yet. Continue and model switching do nothing, and this attempt does not change the model. Record the inspection with /fusion recover <note>, then continue or switch the Sidekick. A new pair saved in the Fusion panel does not rewrite this conversation.')}</p>}\n {error && <p role=\"alert\">{error}</p>}{notice && <p role=\"status\">{notice}</p>}\n <fieldset disabled={busy || task.unsettledTools > 0 || task.pendingApprovals > 0 || task.recovering || task.outcomeUnknown}>\n <button onClick={() => { void action('continue') }}>{tr(lang, '\u7EE7\u7EED\u4E00\u6B21', 'Continue once')}</button>\n <details><summary onClick={() => { if (!catalog) void loadCatalog() }}>{tr(lang, '\u66F4\u6362\u89D2\u8272\u6A21\u578B\u5E76\u7EE7\u7EED', 'Switch a role model and continue')}</summary>\n <label>{tr(lang, '\u89D2\u8272', 'Role')} <select value={role} onChange={event => { setRole(event.target.value as 'lead' | 'worker'); setRoute(undefined) }}>\n <option value=\"lead\">Lead</option><option value=\"worker\">Sidekick</option>\n </select></label>\n {catalog && <ModelChoice role={role === 'lead' ? 'Lead' : 'Sidekick'} route={route} catalog={catalog} onChange={setRoute} />}\n <p>{tr(lang, '\u4EC5\u66F4\u6362\u5F53\u524D\u4F1A\u8BDD\u7684\u89D2\u8272\u6A21\u578B\uFF0C\u4FDD\u7559\u4EFB\u52A1\u4E0E Sidekick \u4F1A\u8BDD\u3002\u540E\u7EED\u8BF7\u6C42\u4F7F\u7528\u65B0\u6A21\u578B\u7684\u8D26\u53F7\u3002', 'Changes this conversation\\'s role model only; the task and the Sidekick session are kept. Later requests use the new model\\'s account.')}</p>\n <button disabled={!route} onClick={() => { void action('switch-role') }}>{tr(lang, '\u66F4\u6362\u5E76\u7EE7\u7EED\u4E00\u6B21', 'Switch and continue once')}</button>\n </details>\n <details><summary>{tr(lang, '\u5B9A\u65F6\u7EE7\u7EED\u4E00\u6B21', 'Continue once at a time')}</summary>\n <label>{tr(lang, '\u672C\u5730\u65F6\u95F4', 'Local time')} <input aria-label={tr(lang, '\u5B9A\u65F6\u7EE7\u7EED\u65F6\u95F4', 'Continuation time')} type=\"datetime-local\" value={dueAt} onChange={event => setDueAt(event.target.value)} /></label>\n <p>{tr(lang, '\u6309\u4F60\u9009\u62E9\u7684\u65F6\u95F4\u5C1D\u8BD5\u4E00\u6B21\uFF1B\u518D\u6B21\u9047\u5230\u989D\u5EA6\u9519\u8BEF\u4F1A\u505C\u6B62\u3002\u6B64\u65F6\u95F4\u4E0D\u4EE3\u8868\u670D\u52A1\u5546\u627F\u8BFA\u7684\u6062\u590D\u65F6\u95F4\u3002', 'Tries once at the time you choose and stops on another quota error. It is not a provider-promised reset time.')}</p>\n <button disabled={!dueAt} onClick={() => { void action('schedule') }}>{tr(lang, '\u8BBE\u7F6E\u65F6\u95F4', 'Set time')}</button>\n {control.schedule?.state === 'scheduled' && <button onClick={() => { void action('cancel-schedule') }}>{tr(lang, '\u53D6\u6D88\u5B89\u6392', 'Cancel')}</button>}\n </details>\n </fieldset>\n </section>\n}\n", "import { FusionRecovery } from './FusionRecovery.js'\nimport { Fragment, useState } from 'react'\nimport { useFusionStatus } from './status-polling.js'\nimport type { TaskCost, UsageSubtotal } from '../status.js'\nimport { tr, useLang, type Lang } from './i18n.js'\n\nconst styles = `\n.fusion-status{margin:8px 12px;color:var(--dsw-alias-label-primary);font-size:13px;line-height:1.5;overflow-wrap:anywhere}\n.fusion-status>summary{cursor:pointer;min-height:44px;display:flex;align-items:center;gap:12px;list-style:none;border-top:1px solid var(--dsw-alias-border-l2);outline-offset:2px}\n.fusion-status>summary::before{content:'\u203A';font-size:18px;flex:none}.fusion-status[open]>summary::before{content:'\u2304'}\n.fusion-status>summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary)}\n.fusion-status .fusion-status-label{font-weight:600}.fusion-status .fusion-status-count{margin-left:auto;color:var(--dsw-alias-label-secondary);white-space:nowrap}\n.fusion-status .fusion-status-detail{max-height:320px;overflow:auto;padding:4px 4px 12px 0;scrollbar-gutter:stable}\n.fusion-status .fusion-recovery fieldset{border:0;padding:0;display:flex;flex-direction:column;gap:10px}.fusion-recovery :is(button,select,input){font:inherit;color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;padding:7px;max-width:100%}.fusion-recovery :is(select,input,option,optgroup){background-color:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);color-scheme:inherit}.fusion-recovery button{cursor:pointer;background-color:var(--dsw-alias-button-elevated-fill)}.fusion-recovery :is(button,input,select):focus-visible{outline:2px solid var(--dsw-alias-brand-primary)}.fusion-recovery [role=alert]{color:var(--dsw-alias-state-error-primary)}\n.fusion-status:has(.fusion-recovery) .fusion-status-detail{max-height:min(65vh,640px)}.fusion-recovery details>summary{padding:8px 0;cursor:pointer}\n.fusion-status p{margin:4px 0 12px}.fusion-status h3{font-size:13px;margin:16px 0 4px;font-weight:600}\n.fusion-status dl{margin:0;display:grid;grid-template-columns:minmax(72px,auto) minmax(0,1fr);gap:4px 12px}\n.fusion-status dt{color:var(--dsw-alias-label-secondary)}.fusion-status dd{margin:0;min-width:0}\n.fusion-status ul{list-style:none;margin:0;padding:0}.fusion-status li{padding:6px 0;border-bottom:1px solid var(--dsw-alias-border-l2)}\n.fusion-status small{display:block;color:var(--dsw-alias-label-secondary);font-size:12px}\n@media(max-width:400px){.fusion-status>summary{gap:8px}.fusion-status .fusion-status-detail{max-height:280px}}\n`\n\nconst role = (value: string) => value === 'lead' ? 'Lead' : 'Sidekick'\nconst purposeOf = (lang: Lang, value: string) => ({ conversation: tr(lang, '\u4EFB\u52A1', 'task'), compaction: tr(lang, '\u538B\u7F29', 'compaction'),\n 'cache-keepalive': tr(lang, '\u4FDD\u6D3B', 'keepalive'), 'session-title': tr(lang, '\u6807\u9898', 'title') } as Record<string, string>)[value] ?? value\nconst outcomeOf = (lang: Lang, value: string) => ({ entered: tr(lang, '\u8BF7\u6C42\u4E2D', 'in progress'), stop: tr(lang, '\u5DF2\u8FD4\u56DE', 'returned'), 'tool-calls': tr(lang, '\u8C03\u7528\u5DE5\u5177', 'tool calls'),\n 'max-tokens': tr(lang, '\u8F93\u51FA\u622A\u65AD', 'output truncated'), aborted: tr(lang, '\u5DF2\u4E2D\u65AD', 'aborted'), error: tr(lang, '\u8BF7\u6C42\u5931\u8D25', 'failed'), unknown: tr(lang, '\u7ED3\u675F\u72B6\u6001\u672A\u77E5', 'unknown end') } as Record<string, string>)[value] ?? value\nconst toolStateOf = (lang: Lang, value: string) => ({ 'dispatch-started': tr(lang, '\u6267\u884C\u672A\u6536\u5C3E', 'unfinished'), returned: tr(lang, '\u5DF2\u8FD4\u56DE', 'returned'),\n 'outcome-unknown': tr(lang, '\u7ED3\u679C\u672A\u77E5', 'outcome unknown'), inspected: tr(lang, '\u5DF2\u4EBA\u5DE5\u68C0\u67E5', 'inspected') } as Record<string, string>)[value] ?? value\nconst countOf = (lang: Lang, value: UsageSubtotal) => value.totalRequests === 0 ? '\u2014' : value.reportedRequests === 0 ? tr(lang, '\u672A\u63D0\u4F9B', 'not reported')\n : `${value.knownTokens.toLocaleString()}${value.reportedRequests < value.totalRequests ? tr(lang, `\uFF08${value.reportedRequests}/${value.totalRequests} \u6B21\u6709\u62A5\u544A\uFF09`, ` (${value.reportedRequests}/${value.totalRequests} reported)`) : ''}`\nconst noteStyle = { margin: '8px 12px', color: 'var(--dsw-alias-label-secondary)', fontSize: 12, lineHeight: 1.5 }\n\n/** Visible-session polling reads the plugin ledger; it never sends a chat message. */\nexport function FusionStatus({ sessionId, attentionOnly = false }: { sessionId: string; attentionOnly?: boolean }) {\n const lang = useLang()\n const purpose = (value: string) => purposeOf(lang, value), outcome = (value: string) => outcomeOf(lang, value)\n const toolState = (value: string) => toolStateOf(lang, value), count = (value: UsageSubtotal) => countOf(lang, value)\n const [expandedTask, setExpandedTask] = useState<string>()\n const snapshot = useFusionStatus(sessionId, expandedTask, attentionOnly)\n if (!snapshot || snapshot.sessionId !== sessionId) return attentionOnly ? null : <p style={noteStyle} role=\"status\">{tr(lang, '\u6B63\u5728\u8BFB\u53D6 Fusion \u72B6\u6001\u2026', 'Loading Fusion status\u2026')}</p>\n if (snapshot.failed) return attentionOnly ? null : <p style={noteStyle} role=\"status\">{tr(lang, 'Fusion \u72B6\u6001\u6682\u65F6\u65E0\u6CD5\u66F4\u65B0\uFF0C\u6062\u590D\u8FDE\u63A5\u540E\u4F1A\u91CD\u8BD5\u3002\u53EF\u7528 /fusion status \u67E5\u770B\u3002', 'Fusion status cannot update right now; it retries when reconnected. Use /fusion status.')}</p>\n const task = snapshot.status?.task\n if (!snapshot.status?.selected || !task) return null\n if (attentionOnly && !task.attention) return null\n const { usage } = task\n const verification = task.automatedChecks === 0 && task.verification === 'verified' ? tr(lang, '\u4EC5\u7ECF Lead \u5BA1\u67E5\uFF08\u672A\u8FD0\u884C\u81EA\u52A8\u68C0\u67E5\uFF09', 'Lead review only (no automated checks ran)')\n : ({ verified: tr(lang, '\u9A8C\u8BC1\u901A\u8FC7', 'verified'), partial: tr(lang, '\u90E8\u5206\u9A8C\u8BC1', 'partly verified'), unverified: tr(lang, '\u5C1A\u672A\u9A8C\u8BC1', 'unverified') })[task.verification]\n const stage = lang === 'en' ? task.stageEn ?? task.stage : task.stage, detail = lang === 'en' && task.detailEn !== undefined ? task.detailEn : task.detail\n const share = (role: 'lead' | 'worker') => {\n const total = usage.byRole.lead.output.knownTokens + usage.byRole.worker.output.knownTokens\n return total ? tr(lang, ` \u00B7 \u8F93\u51FA\u5360 ${Math.round(usage.byRole[role].output.knownTokens / total * 100)}%`, ` \u00B7 ${Math.round(usage.byRole[role].output.knownTokens / total * 100)}% of output`) : ''\n }\n return <details className=\"fusion-status\" key={task.id} onToggle={event => setExpandedTask(event.currentTarget.open ? task.id : undefined)}>\n <style>{styles}</style>\n <summary aria-label={tr(lang, `Fusion \u00B7 ${stage}\uFF0C\u4EFB\u52A1\u8BE6\u60C5`, `Fusion \u00B7 ${stage}, task details`)} data-ud-check=\"fusion-status-summary\">\n <span className=\"fusion-status-label\" role=\"status\">Fusion \u00B7 {stage}</span>\n <span className=\"fusion-status-count\">{tr(lang, `${usage.calls} \u6B21\u8BF7\u6C42`, `${usage.calls} requests`)}</span><span>{tr(lang, '\u8BE6\u60C5', 'Details')}</span>\n </summary>\n <div className=\"fusion-status-detail\" tabIndex={0} aria-label={tr(lang, 'Fusion \u4EFB\u52A1\u8BE6\u60C5', 'Fusion task details')} data-ud-check=\"fusion-status-detail\">\n <p>{detail ?? (task.stage === '\u5B8C\u6210' ? tr(lang, `\u672C\u8F6E\u4EFB\u52A1\u5DF2\u7ED3\u675F \u00B7 ${verification}`, `This task has finished \u00B7 ${verification}`) : tr(lang, `\u672C\u8F6E\u4EFB\u52A1 \u00B7 ${verification}`, `This task \u00B7 ${verification}`))}</p>\n {task.modelControl && task.stage !== '\u5B8C\u6210' && <FusionRecovery sessionId={sessionId} task={task} />}\n <dl>\n <dt>Lead</dt><dd>{task.models.lead.model}<small>{task.models.lead.provider}</small></dd>\n <dt>Sidekick</dt><dd>{task.models.worker.model}<small>{task.models.worker.provider}{task.workerId ? tr(lang, ' \u00B7 \u5DF2\u5EFA\u7ACB\u6301\u7EED\u4F1A\u8BDD', ' \u00B7 persistent session') : tr(lang, ' \u00B7 \u5C1A\u672A\u59D4\u6D3E', ' \u00B7 not delegated yet')}</small></dd>\n {task.models.compactor && <><dt>{tr(lang, '\u538B\u7F29\u6A21\u578B', 'Compaction')}</dt><dd>{task.models.compactor.model}<small>{task.models.compactor.provider}</small></dd></>}\n <dt>{tr(lang, '\u5F85\u786E\u8BA4', 'Pending approvals')}</dt><dd>{task.pendingApprovals}</dd>\n <dt>{tr(lang, '\u672A\u6536\u5C3E\u5DE5\u5177', 'Unsettled tools')}</dt><dd>{task.unsettledTools}</dd>\n </dl>\n <h3>{tr(lang, '\u672C\u8F6E\u7528\u91CF', 'Usage this task')}</h3>\n <dl>\n <dt>{tr(lang, '\u6A21\u578B\u8BF7\u6C42', 'Model requests')}</dt><dd>{usage.calls}<small>{tr(lang, `\u542B\u538B\u7F29 ${usage.compactionCalls} \u6B21\u3001\u4FDD\u6D3B ${usage.keepaliveCalls} \u6B21`, `incl. ${usage.compactionCalls} compaction, ${usage.keepaliveCalls} keepalive`)}</small></dd>\n <dt>{tr(lang, '\u7528\u91CF\u62A5\u544A', 'Usage reports')}</dt><dd>{tr(lang, `${usage.finalCalls} \u6B21\u5DF2\u5B9A\u7A3F \u00B7 ${usage.provisionalCalls} \u6B21\u6682\u62A5 \u00B7 ${usage.unreportedCalls} \u6B21\u672A\u63D0\u4F9B`, `${usage.finalCalls} final \u00B7 ${usage.provisionalCalls} provisional \u00B7 ${usage.unreportedCalls} unreported`)}</dd>\n <dt>{tr(lang, '\u8F93\u5165 Token', 'Input tokens')}</dt><dd>{count(usage.input)}<small>{tr(lang, '\u5DF2\u62A5\u544A\u7684\u672A\u7F13\u5B58\u8F93\u5165', 'reported uncached input')}</small></dd>\n <dt>{tr(lang, '\u7F13\u5B58\u8BFB\u53D6', 'Cache read')}</dt><dd>{count(usage.cacheRead)}</dd>\n <dt>{tr(lang, '\u8F93\u51FA Token', 'Output tokens')}</dt><dd>{count(usage.output)}</dd>\n </dl>\n {task.cost && <CostBlock lang={lang} cost={task.cost} />}\n <h3>{tr(lang, '\u6309\u89D2\u8272', 'By role')}</h3>\n <dl>\n {(['lead', 'worker'] as const).map(role => <Fragment key={role}>\n <dt>{role === 'lead' ? 'Lead' : 'Sidekick'}</dt>\n <dd>{tr(lang, `${usage.byRole[role].calls} \u6B21`, `${usage.byRole[role].calls} requests`)} \u00B7 {tr(lang, '\u8F93\u51FA', 'output')} {count(usage.byRole[role].output)}\n <small>{tr(lang, '\u8F93\u5165', 'input')} {count(usage.byRole[role].input)} \u00B7 {tr(lang, '\u7F13\u5B58\u8BFB\u53D6', 'cache read')} {count(usage.byRole[role].cacheRead)}{share(role)}</small></dd>\n </Fragment>)}\n </dl>\n <small>{tr(lang, 'Token \u6570\u5305\u542B\u6682\u62A5\u6570\u636E\uFF1B\u7F3A\u5931\u5B57\u6BB5\u4E0D\u8BA1\u4E3A 0\u3002\u8BF7\u6C42\u6570\u6765\u81EA DSH\uFF0C\u4F9B\u5E94\u5546\u5185\u90E8\u91CD\u8BD5\u6B21\u6570\u672A\u77E5\u3002', 'Token counts include provisional data; missing fields are not counted as 0. Request counts come from DSH; provider-internal retries are unknown.')}</small>\n <h3>{tr(lang, '\u6700\u8FD1\u4E0A\u4E0B\u6587\u68C0\u67E5', 'Recent context checks')}</h3>\n {task.contexts.length ? <ul>{task.contexts.map(context => <li key={context.role}>{role(context.role)} \u00B7 {purpose(context.purpose)} \u00B7 {context.admitted ? tr(lang, '\u53EF\u53D1\u9001', 'admitted') : tr(lang, '\u8D85\u51FA\u9884\u7B97', 'over budget')}\n <small>{context.inputTokens.toLocaleString()} / {context.budget.toLocaleString()} Token \u00B7 {context.quality === 'exact' ? tr(lang, '\u7CBE\u786E\u8BA1\u6570', 'exact') : tr(lang, '\u4F30\u7B97', 'estimated')}</small>\n </li>)}</ul> : <small>{tr(lang, '\u5C1A\u65E0\u4E0A\u4E0B\u6587\u68C0\u67E5\u8BB0\u5F55\u3002', 'No context checks yet.')}</small>}\n <h3>{tr(lang, '\u6700\u8FD1\u6A21\u578B\u8BF7\u6C42', 'Recent model requests')}</h3>\n {task.requests.length ? <ul>{task.requests.map(request => <li key={request.id}>{role(request.role)} \u00B7 {purpose(request.purpose)} \u00B7 {outcome(request.outcome)}\n <small>{request.model} \u00B7 {request.provider} \u00B7 {request.authority === 'final' ? tr(lang, '\u7528\u91CF\u5DF2\u5B9A\u7A3F', 'usage final') : request.authority === 'provisional' ? tr(lang, '\u7528\u91CF\u6682\u62A5', 'usage provisional') : tr(lang, '\u7528\u91CF\u672A\u63D0\u4F9B', 'usage not reported')}</small>\n </li>)}</ul> : <small>{tr(lang, '\u5C1A\u672A\u53D1\u51FA\u6A21\u578B\u8BF7\u6C42\u3002', 'No model requests yet.')}</small>}\n <h3>{tr(lang, '\u6700\u8FD1\u547D\u4EE4\u4E0E\u5199\u5165', 'Recent commands and writes')}</h3>\n {task.tools.length ? <ul>{task.tools.map(tool => <li key={tool.id}>{role(tool.role)} \u00B7 {tool.name} \u00B7 {tool.failed ? tr(lang, '\u8FD4\u56DE\u9519\u8BEF', 'error') : toolState(tool.state)}</li>)}</ul>\n : <small>{tr(lang, '\u5C1A\u65E0\u5DE5\u5177\u6267\u884C\u8BB0\u5F55\u3002', 'No tool runs yet.')}</small>}\n <small>{tr(lang, '\u663E\u793A\u6700\u8FD1 12 \u6B21\u8BF7\u6C42\u30018 \u9879\u547D\u4EE4\u6216\u5199\u5165\u64CD\u4F5C\uFF1B\u7528\u91CF\u6C47\u603B\u8986\u76D6\u672C\u8F6E\u5168\u90E8\u8BF7\u6C42\u3002\u8BFB\u53D6\u64CD\u4F5C\u4ECD\u53EF\u5728\u4F1A\u8BDD\u4E2D\u67E5\u770B\u3002', 'Shows the last 12 requests and 8 commands or writes; usage totals cover all requests of this task. Reads remain visible in the conversation.')}</small>\n </div>\n </details>\n}\n\n/** Money for the current task, with its coverage and what it is not. */\nexport function CostBlock({ lang, cost }: { lang: Lang; cost: TaskCost }) {\n const usd = (value: string | null) => value === null ? null : `$${Number(value).toFixed(2)}`\n const saved = cost.savedUsd === null ? null : Number(cost.savedUsd)\n const omitted = cost.unpriced + cost.incomplete + cost.unknown\n const reasons = [\n cost.unpriced ? tr(lang, `${cost.unpriced} \u6B21\u6CA1\u6709\u4EF7\u76EE`, `${cost.unpriced} with no price`) : '',\n cost.incomplete ? tr(lang, `${cost.incomplete} \u6B21\u7528\u91CF\u4E0D\u5168`, `${cost.incomplete} with incomplete usage`) : '',\n cost.unknown ? tr(lang, `${cost.unknown} \u6B21\u65E0\u6CD5\u8BFB\u53D6`, `${cost.unknown} unreadable`) : '',\n ].filter(Boolean).join(tr(lang, '\u3001', ', '))\n return <>\n <h3>{tr(lang, '\u8D39\u7528\u4F30\u7B97', 'Cost estimate')}</h3>\n <dl>\n <dt>{tr(lang, '\u6309\u4EF7\u76EE\u8868', 'At list prices')}</dt>\n <dd>{usd(cost.apiEquivalentUsd) ?? tr(lang, '\u65E0\u6CD5\u4F30\u7B97', 'cannot estimate')}\n <small>{tr(lang, `\u8986\u76D6 ${cost.priced} \u6B21\u8BF7\u6C42\uFF1B\u6309\u5404\u6A21\u578B\u516C\u5F00\u5355\u4EF7\u6362\u7B97\uFF0C\u4E0D\u662F\u8D26\u5355`,\n `${cost.priced} requests priced; converted at published rates, not a bill`)}</small></dd>\n {cost.savedUsd !== null && cost.savedPercent !== null && <Fragment>\n <dt>{tr(lang, '\u7701\u4E0B', 'Saved')}</dt>\n <dd>{usd(cost.savedUsd)}<small>{tr(lang, `\u6BD4\u540C\u6837\u7684 token \u5168\u4EA4\u7ED9 Lead \u4FBF\u5B9C ${cost.savedPercent}%\uFF08\u8986\u76D6 ${cost.basis} \u6B21\u8BF7\u6C42\uFF09`,\n `${cost.savedPercent}% cheaper than sending the same tokens to the Lead (${cost.basis} requests)`)}</small></dd>\n </Fragment>}\n {saved !== null && saved < 0 && <dd role=\"status\">{tr(lang, '\u8FD9\u4E2A Sidekick \u6BD4 Lead \u66F4\u8D35\uFF0C\u7701\u94B1\u4E0D\u6210\u7ACB\u3002', 'This Sidekick costs more than the Lead, so there is no saving.')}</dd>}\n <dt>{tr(lang, '\u5B9E\u9645\u8D26\u5355', 'Actual bill')}</dt>\n <dd>{tr(lang, '\u672A\u77E5', 'unknown')}<small>{tr(lang, 'DSH \u4E0D\u63D0\u4F9B\u6BCF\u6B21\u8BF7\u6C42\u7684\u8BA1\u8D39\u91D1\u989D\uFF1B\u8BA2\u9605\u7EBF\u8DEF\u4E5F\u4E0D\u6309 token \u8BA1\u8D39',\n 'DSH reports no per-request billed amount, and subscription routes are not billed per token')}</small></dd>\n </dl>\n {omitted > 0 && <small role=\"status\">\n {tr(lang, `\u6709 ${omitted} \u6B21\u8BF7\u6C42\u672A\u8BA1\u5165\uFF1A${reasons}\u3002`, `${omitted} requests are not included: ${reasons}.`)}\n {cost.unpricedModels.length ? tr(lang, `\u53EF\u5728\u9762\u677F\u8865\u5145\u8FD9\u4E9B\u6A21\u578B\u7684\u5355\u4EF7\uFF1A${cost.unpricedModels.join('\u3001')}\u3002`,\n ` Add rates for these models in the panel: ${cost.unpricedModels.join(', ')}.`) : ''}\n </small>}\n </>\n}\n", "import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react'\nimport type { FusionStatus } from '../status.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\ninterface Snapshot { sessionId: string; status?: FusionStatus; failed: boolean }\ninterface Entry {\n snapshot?: Snapshot\n listeners: Map<() => void, () => boolean>\n busy: boolean\n timer?: ReturnType<typeof setTimeout>\n abort?: AbortController\n visibility: () => void\n}\nconst entries = new Map<string, Entry>()\nconst visible = () => document.visibilityState !== 'hidden'\nconst running = new Set(['\u5206\u6790', '\u6267\u884C', '\u4FEE\u6539', '\u5BA1\u67E5', '\u9A8C\u8BC1', '\u6B63\u5728\u505C\u6B62'])\n\nfunction subscribe(sessionId: string, listener: () => void, expanded: () => boolean): () => void {\n let entry = entries.get(sessionId)\n if (!entry) {\n entry = { listeners: new Map(), busy: false, visibility: () => {} }\n entries.set(sessionId, entry)\n const own = entry\n const active = () => entries.get(sessionId) === own && own.listeners.size > 0\n const publish = (snapshot: Snapshot) => {\n if (!active()) return\n own.snapshot = snapshot\n for (const notify of own.listeners.keys()) notify()\n }\n const refresh = async () => {\n if (!active() || own.busy || !visible()) return\n clearTimeout(own.timer)\n own.busy = true\n const abort = new AbortController(); own.abort = abort\n const deadline = setTimeout(() => {\n if (active() && visible()) publish({ sessionId, failed: true })\n abort.abort()\n }, 10000)\n try {\n const response = await fetch(`${FUSION_API_PATH}?view=status&sessionId=${encodeURIComponent(sessionId)}`,\n { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n if (!response.ok) throw new Error('unavailable')\n const status = await response.json() as FusionStatus\n if (status.schemaVersion !== 1 || status.sessionId !== sessionId) throw new Error('mismatched status')\n if (!abort.signal.aborted) publish({ sessionId, status, failed: false })\n } catch {\n if (!abort.signal.aborted) publish({ sessionId, failed: true })\n } finally {\n clearTimeout(deadline); own.busy = false\n if (active() && visible()) {\n const fast = [...own.listeners.values()].some(value => value()) && running.has(own.snapshot?.status?.task?.stage ?? '')\n own.timer = setTimeout(() => { void refresh() }, fast ? 2000 : 15000)\n }\n }\n }\n own.visibility = () => {\n clearTimeout(own.timer)\n if (!visible()) own.abort?.abort()\n else void refresh()\n }\n document.addEventListener('visibilitychange', own.visibility)\n }\n entry.listeners.set(listener, expanded)\n if (entry.listeners.size === 1 || expanded()) entry.visibility()\n const own = entry\n return () => {\n own.listeners.delete(listener)\n if (own.listeners.size) return\n entries.delete(sessionId)\n clearTimeout(own.timer); own.abort?.abort()\n document.removeEventListener('visibilitychange', own.visibility)\n }\n}\n\n/**\n * One in-flight read per mounted session; collapsed hints still discover new attention states.\n * `live` asks for the fast cadence whenever the task is running, for a view whose whole\n * purpose is the current stage (the role and permission of the model working now).\n */\nexport function useFusionStatus(sessionId: string, expandedTask: string | undefined, attentionOnly = false, live = false): Snapshot | undefined {\n const expandedRef = useRef(expandedTask), attentionRef = useRef(attentionOnly), liveRef = useRef(live)\n expandedRef.current = expandedTask; attentionRef.current = attentionOnly; liveRef.current = live\n useEffect(() => { if (expandedTask) entries.get(sessionId)?.visibility() }, [sessionId, expandedTask])\n return useSyncExternalStore(\n useCallback(listener => subscribe(sessionId, listener, () => {\n if (liveRef.current) return true\n const task = entries.get(sessionId)?.snapshot?.status?.task\n return expandedRef.current !== undefined && task?.id === expandedRef.current && (!attentionRef.current || task.attention)\n }), [sessionId]),\n useCallback(() => entries.get(sessionId)?.snapshot, [sessionId]),\n () => undefined,\n )\n}\n", "import { useEffect, useSyncExternalStore } from 'react'\nimport type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport { PermissionIconFullAccessRegular, PermissionIconReadOnlyRegular,\n PermissionIconWorkspaceWriteRegular } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SandboxMode } from '../contracts.js'\nimport { isFusionSelection } from '../identity.js'\nimport { tr, useLang, type Lang } from './i18n.js'\nimport { useFusionStatus } from './status-polling.js'\n\nconst styles = `\n.fusion-permission{display:inline-flex;align-items:center;gap:4px;height:28px;min-width:0;max-width:220px;padding:0 6px;border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px;font-weight:500}\n.fusion-permission svg{width:14px;height:14px;flex:none}\n.fusion-permission .fusion-permission-role{flex:none;color:var(--dsw-alias-label-caption)}\n.fusion-permission .fusion-permission-mode{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n`\n\nconst modeOf = (lang: Lang, mode: SandboxMode) => mode === 'read-only' ? tr(lang, '\u4EC5\u53EF\u67E5\u770B', 'Read Only')\n : mode === 'workspace-write' ? tr(lang, '\u5DE5\u4F5C\u533A\u5185\u4FEE\u6539', 'Workspace Write') : tr(lang, '\u5B8C\u5168\u6743\u9650', 'Full access')\nconst iconOf = (mode: SandboxMode) => mode === 'read-only' ? <PermissionIconReadOnlyRegular />\n : mode === 'workspace-write' ? <PermissionIconWorkspaceWriteRegular /> : <PermissionIconFullAccessRegular />\n\nexport interface FusionPermissionProps { sessionId: string; directory: ObservableSnapshot<ModelDirectoryState>; load(): void }\n\n/**\n * The permission of the model working now. The composer's native permission control\n * belongs to the conversation (Lead) session, which Fusion confines to read-only, and\n * that confinement matches no configured preset \u2014 so the control reads Custom while a\n * task runs. This additive chip names the role and its mode, so the tool row never\n * shows an unexplained Custom alone.\n */\nexport function FusionPermission({ sessionId, directory, load }: FusionPermissionProps) {\n const selected = useSyncExternalStore(directory.subscribe, directory.getSnapshot).current\n const fusion = isFusionSelection(selected ?? undefined)\n const lang = useLang()\n // The acting role is the whole point of this chip, so it always wants fresh polls.\n const snapshot = useFusionStatus(sessionId, undefined, false, true)\n useEffect(() => { load() }, [load])\n const permissions = fusion ? snapshot?.status?.task?.permissions : undefined\n if (!permissions) return null\n const role = permissions.active === 'worker' ? 'Sidekick' : 'Lead'\n const mode = permissions.active === 'worker' ? permissions.worker : permissions.lead\n const hint = tr(lang,\n `Fusion \u6309\u89D2\u8272\u5206\u79BB\u6743\u9650\uFF1ALead ${modeOf(lang, permissions.lead)}\uFF0CSidekick ${modeOf(lang, permissions.worker)}\u3002\u8F93\u5165\u6846\u7684\u6743\u9650\u63A7\u4EF6\u5C5E\u4E8E\u5BF9\u8BDD\u4F1A\u8BDD\uFF08Lead\uFF09\uFF0C\u8FD0\u884C\u671F\u95F4\u53EF\u80FD\u663E\u793A Custom\u3002`,\n `Fusion separates permissions by role: Lead ${modeOf(lang, permissions.lead)}, Sidekick ${modeOf(lang, permissions.worker)}. The permission control belongs to the conversation (Lead) session, so it may read Custom while a task runs.`)\n return <span className=\"fusion-permission\" title={hint} aria-label={`${role} \u00B7 ${modeOf(lang, mode)}`} data-ud-check=\"fusion-permission\">\n <style>{styles}</style>\n {iconOf(mode)}\n <span className=\"fusion-permission-role\">{role}</span>\n <span className=\"fusion-permission-mode\">{modeOf(lang, mode)}</span>\n </span>\n}\n", "import type { ToolCallViewProps } from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { useEffect, useMemo, useState } from 'react'\nimport type { FusionActivity, FusionActivityPage } from '../activity.js'\nimport { activityRows } from './activity-model.js'\nimport { tr, useLang } from './i18n.js'\nimport { ActivityCard, activityStyles } from './ActivityRows.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\nexport const fusionControlTools = ['fusion_read_state', 'fusion_delegate_text', 'fusion_explore', 'fusion_delegate', 'fusion_rework', 'fusion_wait', 'fusion_review_result',\n 'fusion_submit_result', 'fusion_takeover', 'fusion_finish_direct', 'fusion_read_evidence'] as const\n\n/** Keep internal coordination out of the normal conversation. Errors remain visible. */\nexport function FusionTool({ block, sessionId, callId, toolName, cwd, openFile }: ToolCallViewProps) {\n const lang = useLang()\n const settled = 'kind' in block\n const tracksActivity = toolName === 'fusion_delegate_text' || toolName === 'fusion_explore' || toolName === 'fusion_delegate' || toolName === 'fusion_rework'\n const [snapshot, setSnapshot] = useState<{ key: string; events: FusionActivity[]; done: boolean; failed?: boolean }>()\n const key = `${sessionId}:${callId}`\n useEffect(() => {\n if (!tracksActivity) return\n let active = true, busy = false, cursor = -1, timer: ReturnType<typeof setTimeout> | undefined\n const events = new Map<number, FusionActivity>()\n let abort: AbortController | undefined\n const visible = () => document.visibilityState !== 'hidden'\n const refresh = async () => {\n if (!active || busy || !visible()) return\n busy = true; abort = new AbortController()\n const deadline = setTimeout(() => abort?.abort(), 10000)\n let again = true, delay = 2000\n try {\n const response = await fetch(`${FUSION_API_PATH}?view=activity&sessionId=${encodeURIComponent(sessionId)}&callId=${encodeURIComponent(callId)}&after=${cursor}`,\n { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n if (!response.ok) throw new Error('Activity unavailable')\n const page = await response.json() as FusionActivityPage\n if (!Array.isArray(page.events) || !Number.isSafeInteger(page.cursor) || page.cursor < cursor) throw new Error('Invalid activity page')\n for (const event of page.events) if (event.parentCallId === callId) events.set(event.source.seq, event)\n cursor = page.cursor; again = page.more || !page.done || !settled; delay = page.more ? 0 : 2000\n if (active) setSnapshot({ key, events: [...events.values()].sort((a, b) => a.source.seq - b.source.seq), done: page.done })\n } catch {\n if (active) setSnapshot(previous => ({ key, events: previous?.key === key ? previous.events : [], done: false, failed: true }))\n } finally {\n clearTimeout(deadline); busy = false\n if (active && again && visible()) timer = setTimeout(() => { void refresh() }, delay)\n }\n }\n const visibility = () => { if (timer) clearTimeout(timer); if (document.visibilityState === 'hidden') abort?.abort(); else void refresh() }\n void refresh(); document.addEventListener('visibilitychange', visibility)\n return () => { active = false; abort?.abort(); if (timer) clearTimeout(timer); document.removeEventListener('visibilitychange', visibility) }\n }, [sessionId, callId, key, tracksActivity, settled])\n const current = tracksActivity && snapshot?.key === key ? snapshot : undefined\n const rows = useMemo(() => activityRows(current?.events ?? []), [current?.events])\n const text = settled ? block.content.flatMap(part => part.type === 'text' ? [part.text] : []).join('\\n') : ''\n let problem = settled && block.isError ? text : ''\n if (!problem) {\n try {\n const result = JSON.parse(text) as { status?: string; reason?: string }\n if (result.status === 'needs-decision') problem = result.reason ?? tr(lang, '\u4EFB\u52A1\u9700\u8981\u8FDB\u4E00\u6B65\u5904\u7406\u3002', 'The task needs attention.')\n } catch { /* Non-JSON successful evidence carries no user action. */ }\n }\n return <>\n {rows.length > 0 && <style>{activityStyles}</style>}\n {rows.map(row => <ActivityCard key={row.id} row={row} done={current?.done ?? false} cwd={cwd} openFile={openFile} />)}\n {current?.failed && <p role=\"status\">{tr(lang, '\u6267\u884C\u8BB0\u5F55\u6682\u65F6\u65E0\u6CD5\u52A0\u8F7D\uFF0C\u6B63\u5728\u91CD\u8BD5\u3002', 'Activity is unavailable; retrying.')}</p>}\n {problem && <p role=\"status\" style={{ fontSize: 13, whiteSpace: 'pre-wrap' }}>{problem}</p>}\n </>\n}\n", "import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-tools'\n\n/**\n * Provider routes that run their OWN agent loop instead of answering one model\n * call. Their adapter can only hand a tool call back to this Host under its own\n * transport name, so a caller-driven tool ceiling that lists only the caller's\n * own tools advertises names the route can never emit.\n *\n * `antigravity` is dsh-agy-link: `agy` executes the bridged call inside its own\n * loop, and the adapter reports that step as `agy_tool`, which this Host replays\n * as a native card. Fusion's Worker is exactly such a caller \u2014 its ceiling was\n * `workerTools` + `fusion_*`, so the delegation ran as prose and the Host\n * (correctly) diagnosed `WORKER_TOOLS_UNREACHABLE`.\n */\nconst ROUTE_TRANSPORT: Readonly<Record<string, string>> = { antigravity: 'agy_tool' }\n\n/** Every transport a bridge route may report a step through. */\nconst ROUTE_TRANSPORT_NAMES: ReadonlySet<string> = new Set(Object.values(ROUTE_TRANSPORT))\n\n/** The transport name this provider route needs, registered or not. */\nexport function routeTransportName(provider: string): string | undefined {\n return ROUTE_TRANSPORT[provider]\n}\n\n/**\n * Whether `name` is a bridge-route transport. Such a tool only replays a step\n * the route already executed in its own loop: it is presentation, not an effect\n * this Host authorizes, bills or holds a write lease for.\n */\nexport function isRouteTransportName(name: string): boolean {\n return ROUTE_TRANSPORT_NAMES.has(name)\n}\n\n/**\n * The transport this route needs AND this Host can actually accept. An\n * unregistered name is skipped, because a call naming it is rejected as\n * `unknown tool` \u2014 the adapter must never invent one either.\n *\n * The lookup is the GLOBAL view on purpose. A bridge registers its transport at\n * the host layer, while an agent scope's own restriction hides inherited tools:\n * reading through the Worker's restricted scope would report \"absent\" on the\n * very next refresh and shrink the ceiling that had just been widened.\n */\nexport function registeredRouteTransport(ctx: Context, provider: string): string | undefined {\n const name = routeTransportName(provider)\n if (name === undefined) return undefined\n return ctx.tools.get(name) === undefined ? undefined : name\n}\n\n/** Add the route's transport to a capability ceiling without duplicating a configured entry. */\nexport function withRouteTransport(ceiling: readonly string[], transport: string | undefined): readonly string[] {\n return transport === undefined || ceiling.includes(transport) ? ceiling : [...ceiling, transport]\n}\n", "import type { SessionEvent } from '@deepseek-ai/dsh-session/types'\nimport type {} from '@deepseek-ai/dsh-tools/types'\nimport { isRouteTransportName } from './host/route-transport.js'\n\n/** Plugin-owned presentation record; never appended to a native Session. */\nexport interface FusionActivity {\n schemaVersion: 1\n taskId: string\n childSessionId: string\n parentCallId: string\n turn: number\n step: number\n anchorSeq: number\n source: SessionEvent<'tool/call'> | SessionEvent<'tool/result'>\n}\n\n/** Namespaced display identity; the unchanged native identity remains in source. */\nexport function activityCallId(activity: FusionActivity): string {\n const event = activity.source\n const id = event.type === 'tool/call' ? event.data.callId : event.data.message.source.callId\n return `fusion:${activity.childSessionId}:${id}`\n}\n\nexport interface FusionActivityPage { events: FusionActivity[]; cursor: number; more: boolean; done: boolean }\n\n/** Tools whose call/result pair a Worker's own loop appends to its session. */\nconst NATIVE_VISIBLE_TOOLS: ReadonlySet<string> = new Set([\n 'bash', 'pwsh', 'read', 'write', 'edit', 'glob', 'grep', 'job_output', 'job_kill', 'str_replace_editor',\n])\n\n/** The Code Mode wrapper dsh-agy-worker uses when the route has no transport tool. */\nconst MIRROR_CODE_WRAPPER = 'run_code'\n\n/** A recorded agy step replayed through a bridge route's transport. */\nexport interface MirrorStep { run: string; step: number; tool: string }\n\n/**\n * The exact wrapper dsh-agy-worker generates for a recorded step\n * (`buildMirrorRunCode`): one comment naming the step and its real tool, then one\n * call of the transport. Parsed as data \u2014 the code is never evaluated, and any\n * other `run_code` body stays out of the presentation path.\n */\nconst MIRROR_COMMENT = /^\\/\\/ dsh-agy-worker mirror: replay recorded agy tool step (\\d+) \\(([^()]*)\\)$/\nconst MIRROR_CALL = /^return await tools\\['([^']+)'\\]\\((\\{.*\\})\\)$/\n\n/** Recover the recorded step cursor and real tool from a generated mirror wrapper. */\nexport function mirrorStepInvocation(code: string): MirrorStep | undefined {\n const lines = code.split('\\n').map(line => line.trim()).filter(line => line !== '')\n if (lines.length !== 2) return undefined\n const comment = MIRROR_COMMENT.exec(lines[0]!)\n const call = MIRROR_CALL.exec(lines[1]!)\n if (!comment || !call || !isRouteTransportName(call[1]!)) return undefined\n let args: unknown\n try { args = JSON.parse(call[2]!) } catch { return undefined }\n if (typeof args !== 'object' || args === null || Array.isArray(args)) return undefined\n const cursor = args as { run?: unknown; step?: unknown }\n if (typeof cursor.run !== 'string' || cursor.run === '') return undefined\n if (!Number.isSafeInteger(cursor.step) || (cursor.step as number) < 0) return undefined\n if (Number(comment[1]) !== cursor.step) return undefined\n const tool = comment[2]!.trim()\n return { run: cursor.run, step: cursor.step as number, tool: tool === '' ? 'agy tool' : tool }\n}\n\n/**\n * Whether one child tool event is real Worker activity this plugin presents in\n * the parent conversation. Answering this needs the recorded arguments only to\n * recognize the bounded Code Mode wrapper; nothing is executed or replayed.\n */\nexport function presentsActivity(name: string, rawArguments: string): boolean {\n if (NATIVE_VISIBLE_TOOLS.has(name)) return true\n if (isRouteTransportName(name)) return true\n if (name !== MIRROR_CODE_WRAPPER) return false\n let args: unknown\n try { args = JSON.parse(rawArguments) } catch { return false }\n if (typeof args !== 'object' || args === null || Array.isArray(args)) return false\n const code = (args as { code?: unknown }).code\n return typeof code === 'string' && mirrorStepInvocation(code) !== undefined\n}\n", "import type { DiffHunk } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { FusionActivity } from '../activity.js'\nimport { activityCallId } from '../activity.js'\n\nexport interface ActivityRow {\n id: string\n call: Extract<FusionActivity['source'], { type: 'tool/call' }>\n result?: Extract<FusionActivity['source'], { type: 'tool/result' }>\n}\n\nexport function activityRows(events: readonly FusionActivity[]): ActivityRow[] {\n const rows = new Map<string, ActivityRow>()\n for (const event of events) {\n const id = activityCallId(event)\n if (event.source.type === 'tool/call') rows.set(id, { id, call: event.source })\n else {\n const row = rows.get(id)\n if (row) rows.set(id, { ...row, result: event.source })\n }\n }\n return [...rows.values()]\n}\n\n/** Only actual result-time metadata is labelled an applied diff. */\nexport function activityDiffs(row: ActivityRow): DiffHunk[] {\n if (!row.result || row.result.data.message.isError) return []\n const meta = row.result.data.meta as { diffs?: unknown } | undefined\n if (!Array.isArray(meta?.diffs)) return []\n return meta.diffs.filter((hunk): hunk is DiffHunk => hunk && typeof hunk === 'object'\n && typeof hunk.path === 'string' && (typeof hunk.oldText === 'string' || hunk.oldText === null) && typeof hunk.newText === 'string')\n}\n", "import { useState } from 'react'\nimport { DiffBlock, TerminalBlock } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { activityDiffs } from './activity-model.js'\nimport { presentedCall, presentedCommand, presentedCwd, presentedDescription, presentedExitCode,\n presentedPath, presentedQuery, presentsTerminal } from './agy-activity.js'\nimport { tr, useLang, type Lang } from './i18n.js'\nimport type { ActivityRow } from './activity-model.js'\n\nconst labelsFor = (lang: Lang) => ({ codeLabel: tr(lang, '\u4EE3\u7801', 'Code'), wrapLabel: tr(lang, '\u81EA\u52A8\u6362\u884C', 'Wrap'), unwrapLabel: tr(lang, '\u53D6\u6D88\u81EA\u52A8\u6362\u884C', 'No wrap'),\n copy: tr(lang, '\u590D\u5236', 'Copy'), copied: tr(lang, '\u5DF2\u590D\u5236', 'Copied'), collapseAria: tr(lang, '\u6536\u8D77\u5185\u5BB9', 'Collapse'), collapse: tr(lang, '\u6536\u8D77', 'Collapse'),\n expandAria: (n: number) => tr(lang, `\u5C55\u5F00\u5176\u4F59 ${n} \u884C`, `Show ${n} more lines`), expand: (n: number) => tr(lang, `\u5C55\u5F00\u5176\u4F59 ${n} \u884C`, `Show ${n} more lines`) })\n// `commandLine` is required by TerminalBlockLabels on DSH 0.2.1 and ignored on 0.2.0.\nconst terminalLabelsFor = (lang: Lang) => ({ ...labelsFor(lang), commandLine: (n: number) => tr(lang, `\u547D\u4EE4\u884C\u7B2C ${n} \u884C`, `command line ${n}`),\n signal: (s: string) => tr(lang, `\u4FE1\u53F7 ${s}`, `signal ${s}`), exitCode: (n: number) => tr(lang, `\u9000\u51FA\u7801 ${n}`, `exit code ${n}`),\n running: tr(lang, '\u6267\u884C\u4E2D', 'Running'), failed: tr(lang, '\u6267\u884C\u5931\u8D25', 'Failed'), done: tr(lang, '\u5DF2\u8FD4\u56DE', 'Done'), noOutput: tr(lang, '\u65E0\u8F93\u51FA', 'No output'), noExitCode: tr(lang, '\u672A\u8BB0\u5F55\u9000\u51FA\u7801', 'No exit code') })\n\n// Native Host tools plus the agy operations a bridge route reports under its transport.\nconst titleFor = (lang: Lang): Record<string, string> => ({\n bash: tr(lang, '\u7EC8\u7AEF', 'Terminal'), pwsh: tr(lang, '\u7EC8\u7AEF', 'Terminal'),\n run_command: tr(lang, '\u7EC8\u7AEF', 'Terminal'), execute_command: tr(lang, '\u7EC8\u7AEF', 'Terminal'), ops_bash: tr(lang, '\u7EC8\u7AEF', 'Terminal'), sh: tr(lang, '\u7EC8\u7AEF', 'Terminal'), shell: tr(lang, '\u7EC8\u7AEF', 'Terminal'),\n read: tr(lang, '\u8BFB\u53D6', 'Read'), view_file: tr(lang, '\u8BFB\u53D6', 'Read'), read_file: tr(lang, '\u8BFB\u53D6', 'Read'), open_file: tr(lang, '\u8BFB\u53D6', 'Read'),\n write: tr(lang, '\u5199\u5165', 'Write'), write_to_file: tr(lang, '\u5199\u5165', 'Write'), write_file: tr(lang, '\u5199\u5165', 'Write'), create_file: tr(lang, '\u5199\u5165', 'Write'),\n edit: tr(lang, '\u7F16\u8F91', 'Edit'), str_replace_editor: tr(lang, '\u7F16\u8F91', 'Edit'), replace_file_content: tr(lang, '\u7F16\u8F91', 'Edit'), edit_file: tr(lang, '\u7F16\u8F91', 'Edit'), replace_in_file: tr(lang, '\u7F16\u8F91', 'Edit'),\n glob: tr(lang, '\u67E5\u627E\u6587\u4EF6', 'Find files'), find_by_name: tr(lang, '\u67E5\u627E\u6587\u4EF6', 'Find files'), search_files: tr(lang, '\u67E5\u627E\u6587\u4EF6', 'Find files'), ops_glob: tr(lang, '\u67E5\u627E\u6587\u4EF6', 'Find files'),\n grep: tr(lang, '\u641C\u7D22', 'Search'), grep_search: tr(lang, '\u641C\u7D22', 'Search'), search_file_content: tr(lang, '\u641C\u7D22', 'Search'), ops_grep: tr(lang, '\u641C\u7D22', 'Search'), search: tr(lang, '\u641C\u7D22', 'Search'),\n job_output: tr(lang, '\u547D\u4EE4\u8F93\u51FA', 'Command output'), job_kill: tr(lang, '\u505C\u6B62\u547D\u4EE4', 'Stop command'),\n})\n\nexport function ActivityCard({ row, done, cwd, openFile }: {\n row: ActivityRow; done: boolean; cwd?: string; openFile(path: string): void\n}) {\n const lang = useLang()\n const [open, setOpen] = useState(false)\n const presented = presentedCall(row.call.data.name, row.call.data.arguments)\n const result = row.result?.data.message\n const output = result?.content.flatMap(part => part.type === 'text' ? [part.text] : []).join('\\n') ?? ''\n const path = presentedPath(presented)\n const command = presentedCommand(presented)\n const terminal = presentsTerminal(presented)\n const exit = presentedExitCode(presented, output)\n const failed = result?.isError || (exit !== undefined && exit !== 0)\n const diffs = activityDiffs(row)\n const label = titleFor(lang)[presented.tool] ?? presented.tool\n const summary = path ?? presentedDescription(presented) ?? command ?? presentedQuery(presented)\n ?? (presented.server === undefined ? label : `${presented.server}: ${label}`)\n const status = failed ? tr(lang, '\u5931\u8D25', 'Failed') : !row.result ? (done ? tr(lang, '\u7ED3\u679C\u672A\u8BB0\u5F55', 'No result recorded') : tr(lang, '\u6267\u884C\u4E2D', 'Running')) : ''\n return <div className=\"fusion-activity-row\" data-fusion-tool={row.call.data.name}\n data-fusion-inner={presented.tool} data-fusion-call={row.id}>\n <button type=\"button\" aria-expanded={open} onClick={() => setOpen(!open)} className=\"fusion-activity-toggle\">\n <span aria-hidden>{open ? '\u2304' : '\u203A'}</span><span>{label}</span>\n <span className=\"fusion-activity-summary\">{summary}</span>\n {status && <small role=\"status\" data-failed={Boolean(failed)}>{status}</small>}\n </button>\n {open && <div className=\"fusion-activity-body\">\n {path && <button type=\"button\" className=\"fusion-activity-file\" onClick={() => openFile(path)}>{tr(lang, '\u6253\u5F00', 'Open')} {path}</button>}\n {diffs.length ? <DiffBlock diffs={diffs} labels={labelsFor(lang)} maxLines={16} />\n : terminal && command ? <TerminalBlock command={command} cwd={presentedCwd(presented) ?? cwd} output={output}\n running={!row.result && !done} exitCode={exit} labels={terminalLabelsFor(lang)} />\n : <pre>{output || (presented.malformed ? presented.raw\n : row.result ? tr(lang, '\u5DF2\u8FD4\u56DE\uFF0C\u65E0\u6587\u672C\u8F93\u51FA\u3002', 'Returned without text output.') : presented.raw)}</pre>}\n </div>}\n </div>\n}\n\nexport const activityStyles = `\n.fusion-activity-row{font-size:13px;line-height:1.5;margin:4px 0;min-width:0;color:var(--dsw-alias-label-secondary)}\n.fusion-activity-toggle{display:flex;align-items:center;gap:8px;width:100%;padding:6px 0;background:none;border:0;color:inherit;text-align:left;cursor:pointer;font:inherit}\n.fusion-activity-toggle:focus-visible,.fusion-activity-file:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\n.fusion-activity-summary{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary)}\n.fusion-activity-toggle small{white-space:nowrap}.fusion-activity-toggle small[data-failed=true]{color:var(--dsw-alias-state-error-primary)}\n.fusion-activity-body{padding:4px 0 10px;overflow:hidden}.fusion-activity-body pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:360px;overflow:auto;font-size:12px}\n.fusion-activity-file{font:inherit;border:0;background:none;color:var(--dsw-alias-brand-primary);padding:0 0 6px;cursor:pointer}\n`\n", "import { isRouteTransportName } from '../host/route-transport.js'\nimport { mirrorStepInvocation } from '../activity.js'\n\n/**\n * One activity row as the parent conversation can honestly present it.\n *\n * A bridge route reports a step it already executed through its own transport;\n * the recorded payload only carries the inner tool name and its input, so the\n * row is unwrapped here. Nothing is replayed, executed or inferred: `tool` is the\n * recorded operation, `arguments` are the recorded arguments, and an unreadable\n * payload falls back to the raw call arguments shown by the renderer.\n */\nexport interface PresentedCall {\n /** The operation to name in the row: the unwrapped inner tool, or the recorded name. */\n tool: string\n /** Set when the row is a bridge transport replay rather than a direct Worker tool. */\n transport?: string\n /** Arguments describing the presented operation; `{}` when the payload is unreadable. */\n arguments: Record<string, unknown>\n /** MCP server the inner tool belonged to, when the route reported one. */\n server?: string\n /** True when the recorded arguments were not a JSON object and must stay raw. */\n malformed: boolean\n /** The recorded call arguments, unchanged. */\n raw: string\n}\n\nconst CODE_WRAPPER = 'run_code'\nconst META_MCP = /^(call_mcp_tool|callMcpTool|call_mcp|mcp_call)$/i\n\n/** The agy tools that run a shell command and therefore get a terminal card. */\nconst AGY_TERMINAL_TOOLS: ReadonlySet<string> = new Set([\n 'run_command', 'bash', 'execute_command', 'ops_bash', 'sh', 'shell',\n])\n\n/** The Host's own shell tools; their output ends with the exit marker this Host writes. */\nconst HOST_TERMINAL_TOOLS: ReadonlySet<string> = new Set(['bash', 'pwsh'])\n\nfunction pickString(input: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = input[key]\n if (typeof value === 'string' && value !== '') return value\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n }\n return undefined\n}\n\nfunction parseObject(raw: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(raw)\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) return parsed as Record<string, unknown>\n } catch { /* Raw call arguments remain inspectable in the renderer. */ }\n return undefined\n}\n\n/** agy serializes some tool args as a JSON string; presenters get an object. */\nfunction innerArguments(value: unknown): Record<string, unknown> {\n if (value === undefined || value === null) return {}\n if (typeof value === 'object' && !Array.isArray(value)) return value as Record<string, unknown>\n if (typeof value === 'string') {\n let text = value.trim()\n if ((text.startsWith('\"') && text.endsWith('\"')) || (text.startsWith(\"'\") && text.endsWith(\"'\"))) {\n try {\n const unquoted: unknown = JSON.parse(text)\n if (typeof unquoted === 'string') text = unquoted.trim()\n } catch { /* keep the quoted text */ }\n }\n try {\n const parsed: unknown = JSON.parse(text)\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) return parsed as Record<string, unknown>\n return { value: parsed }\n } catch { return { value: value } }\n }\n return { value }\n}\n\nfunction unwrapMcp(tool: string, input: Record<string, unknown>): { tool: string; server?: string; input: Record<string, unknown> } {\n if (META_MCP.test(tool)) {\n const server = pickString(input, ['ServerName', 'server_name', 'serverName', 'server'])\n const inner = pickString(input, ['ToolName', 'tool_name', 'toolName', 'name', 'tool'])\n if (inner !== undefined) {\n const raw = input.Arguments ?? input.arguments ?? input.args ?? input.parameters ?? input.params ?? input.input\n return { tool: inner, ...(server === undefined ? {} : { server }), input: innerArguments(raw) }\n }\n }\n if (tool.startsWith('mcp__')) {\n const parts = tool.slice(5).split('__')\n if (parts.length >= 2) return { tool: parts.slice(1).join('__'), server: parts[0]!, input }\n }\n return { tool, input }\n}\n\n/**\n * Describe one recorded call without inventing anything. Only a registered route\n * transport or the exact generated Code Mode wrapper is unwrapped, matching the\n * host-side projection predicate in `presentsActivity`.\n */\nexport function presentedCall(name: string, rawArguments: string): PresentedCall {\n const parsed = parseObject(rawArguments)\n const raw = parsed ?? {}\n if (isRouteTransportName(name)) {\n const reported = typeof raw.tool === 'string' ? raw.tool.trim() : ''\n if (reported === '') return { tool: name, transport: name, arguments: raw, malformed: parsed === undefined, raw: rawArguments }\n const server = typeof raw.server === 'string' && raw.server !== '' ? raw.server : undefined\n const unwrapped = unwrapMcp(reported, innerArguments(raw.input))\n const owner = unwrapped.server ?? server\n return { tool: unwrapped.tool, transport: name, arguments: unwrapped.input,\n ...(owner === undefined ? {} : { server: owner }), malformed: parsed === undefined, raw: rawArguments }\n }\n if (name === CODE_WRAPPER && parsed !== undefined && typeof parsed.code === 'string') {\n const step = mirrorStepInvocation(parsed.code)\n if (step !== undefined) {\n const description = typeof parsed.description === 'string' ? parsed.description : undefined\n return { tool: step.tool, transport: name, arguments: description === undefined ? {} : { Description: description }, malformed: false, raw: rawArguments }\n }\n }\n return { tool: name, arguments: raw, malformed: parsed === undefined, raw: rawArguments }\n}\n\n/** The command line this call ran, when it reported one. agy also uses `Command`. */\nexport function presentedCommand(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['CommandLine', 'command_line', 'Command', 'command', 'Cmd', 'cmd'])\n}\n\n/** The file path this call addressed, when it reported one. */\nexport function presentedPath(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['AbsolutePath', 'absolute_path', 'TargetFile', 'target_file', 'path', 'file_path',\n 'filename', 'Path', 'FilePath', 'FileName', 'targetFile'])\n}\n\n/** A human preview the route attached (agy's `Description`/`toolAction`). */\nexport function presentedDescription(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['Description', 'description', 'toolAction', 'toolSummary', 'Instruction', 'instruction'])\n}\n\n/** A search pattern or directory this call reported. */\nexport function presentedQuery(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['pattern', 'Pattern', 'query', 'Query', 'regex', 'Regex', 'QueryString', 'SearchDirectory', 'directory'])\n}\n\n/** The working directory the route reported, when it was not the session's own. */\nexport function presentedCwd(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['Cwd', 'cwd', 'WorkingDirectory', 'working_directory', 'workdir', 'WorkDir'])\n}\n\n/** Whether this call is a shell command, so the renderer uses a terminal card. */\nexport function presentsTerminal(call: PresentedCall): boolean {\n return AGY_TERMINAL_TOOLS.has(call.tool) || HOST_TERMINAL_TOOLS.has(call.tool)\n}\n\n/**\n * The exit code a terminal step really reported, in that producer's own format:\n * agy writes `The command exited with code N` / `[exit code N]` inside the\n * recorded output; this Host's shell tools end the output with `[exit code: N]`.\n * Anything else \u2014 a read/view/search result quoting such a line \u2014 has no terminal\n * status, so the card falls back to `isError` and never invents a failure.\n */\nexport function presentedExitCode(call: PresentedCall, output: string): number | undefined {\n // A bridge route reports steps from its own agent, so its inner shell tool keeps\n // agy's format even when it is named like a Host tool; the adapter reads exactly\n // these two shapes.\n if (call.transport !== undefined) {\n if (!AGY_TERMINAL_TOOLS.has(call.tool)) return undefined\n const match = /The command exited with code (\\d+)/i.exec(output) ?? /\\[exit code (\\d+)\\]/i.exec(output)\n return match?.[1] === undefined ? undefined : Number(match[1])\n }\n // Host tools keep their original rule: this Host appends the marker as the last\n // line, so a quoted marker inside command output is not mistaken for the status.\n if (HOST_TERMINAL_TOOLS.has(call.tool)) {\n const match = /\\n\\[exit code: (\\d+)\\]\\s*$/.exec(output)\n return match?.[1] === undefined ? undefined : Number(match[1])\n }\n return undefined\n}\n", "/**\n * Native tool-card toolviews for the built-in Antigravity route.\n *\n * Ported from dsh-agy-worker (`src/client/toolview.ts`), MIT License,\n * Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n * dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n * docs/ATTRIBUTION-AGY.md.\n *\n * Two keyed `tool.call.toolview` views, exactly as upstream registered them:\n * - `agy_tool` \u2014 the mirror step a bridge route reports under its transport;\n * - `run_code` \u2014 Code Mode's wrapper. A keyed entry REPLACES the Host's\n * generic code row, so the wrapper case is recognized with the\n * same strict parser Fusion uses for its own activity\n * (`mirrorStepInvocation`) and everything else renders as an\n * ordinary code card through {@link AgyCodeToolView}.\n * Every other registration the standalone plugin made is absent: Fusion keeps\n * its own `main` / `sidebar.panellist` entries and its own activity cards.\n *\n * Presentation matches the official DSH tool row and card:\n * - Collapsed state: clean, borderless 24px row with official tool SVG icon,\n * tool title, separator dot, and summary/preview.\n * - Mouse hover on small icon: smoothly transitions to the chevron down arrow.\n * - Expanded state: leading icon is the chevron down arrow.\n * - Expanded card: rounded 12px card with header (prompt/cwd/path + Copy button)\n * and scrollable content (max-height with custom scrollbars) for long outputs.\n */\nimport * as React from 'react';\nimport { mirrorStepInvocation } from '../../activity.js';\nimport { insertTextIntoChatComposer } from './decisions.js';\nimport { openLightbox, isImageFile, buildMediaUrl } from './images.js';\n\ntype ReactApi = {\n\tcreateElement: (type: unknown, props?: Record<string, unknown> | null, ...children: unknown[]) => unknown;\n\tuseState: <S>(initial: S) => [S, (next: S | ((prev: S) => S)) => void];\n};\n\n/**\n * The React surface these cards use. Upstream read it through the module\n * loader's `require` shim; the Fusion bundle imports React directly, so the\n * shim is the same object \u2014 the call sites stay verbatim.\n */\nfunction react(): ReactApi {\n\treturn React as unknown as ReactApi;\n}\n\nexport function makeToggle(setValue: (next: boolean | ((prev: boolean) => boolean)) => void): () => void {\n\treturn () => setValue((prev: boolean) => !prev);\n}\n\n/** Cache user-expanded tool cards across TanStack Virtualizer remount cycles */\nconst expandedToolBlockKeys = new Set<string>();\n\nexport function clearExpandedToolBlockKeysForTest(): void {\n\texpandedToolBlockKeys.clear();\n}\n\nexport function useToggle(initial: boolean = false, key?: string): [boolean, () => void] {\n\tconst R2 = react();\n\tconst init = key ? expandedToolBlockKeys.has(key) : initial;\n\tconst [value, setValue] = R2.useState<boolean>(init) as [boolean, (next: boolean | ((prev: boolean) => boolean)) => void];\n\tconst toggle = () => {\n\t\tsetValue((prev: boolean) => {\n\t\t\tconst next = !prev;\n\t\t\tif (key) {\n\t\t\t\tif (next) expandedToolBlockKeys.add(key);\n\t\t\t\telse expandedToolBlockKeys.delete(key);\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t};\n\treturn [value, toggle];\n}\n\nfunction hx(type: unknown, props?: Record<string, unknown> | null, ...children: unknown[]): unknown {\n\treturn react().createElement(type, props, ...children);\n}\n\n// ---- Official DSH SVGs (100% faithful to native DSH client-ui) ----------\n\nexport function IconChevronDownOutline14(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 14 14',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M11.8486 5.5L11.4238 5.92383L8.69727 8.65137C8.44157 8.90706 8.21562 9.13382 8.01172 9.29785C7.79912 9.46883 7.55595 9.61756 7.25 9.66602C7.08435 9.69222 6.91565 9.69222 6.75 9.66602C6.44405 9.61756 6.20088 9.46883 5.98828 9.29785C5.78438 9.13382 5.55843 8.90706 5.30273 8.65137L2.57617 5.92383L2.15137 5.5L3 4.65137L3.42383 5.07617L6.15137 7.80273C6.42595 8.07732 6.59876 8.24849 6.74023 8.3623C6.87291 8.46904 6.92272 8.47813 6.9375 8.48047C6.97895 8.48703 7.02105 8.48703 7.0625 8.48047C7.07728 8.47813 7.12709 8.46904 7.25977 8.3623C7.40124 8.24849 7.57405 8.07732 7.84863 7.80273L10.5762 5.07617L11 4.65137L11.8486 5.5Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconApiOutline14(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 14 14',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t},\n\t\thx('path', {\n\t\t\ttransform: 'translate(0.6689 1.073)',\n\t\t\td: 'M11.4818 5.57813C11.4818 4.45301 11.4807 3.66237 11.4075 3.05908C11.3359 2.46953 11.2024 2.13852 10.9939 1.89441C10.9247 1.81341 10.8493 1.73801 10.7683 1.66882C10.5242 1.46033 10.1932 1.32686 9.60364 1.25525C9.00034 1.18198 8.20974 1.18091 7.0846 1.18091L5.57813 1.18091C4.45301 1.18091 3.66238 1.18198 3.05908 1.25525C2.46953 1.32686 2.13852 1.46033 1.89441 1.66882C1.81341 1.73801 1.73801 1.81341 1.66882 1.89441C1.46033 2.13852 1.32686 2.46953 1.25525 3.05908C1.18198 3.66238 1.18091 4.45301 1.18091 5.57813L1.18091 6.2771C1.18091 7.40218 1.18197 8.19288 1.25525 8.79614C1.32687 9.38553 1.46036 9.71674 1.66882 9.96082C1.73797 10.0417 1.81347 10.1173 1.89441 10.1864C2.13851 10.3948 2.46965 10.5275 3.05908 10.5991C3.66238 10.6724 4.45298 10.6735 5.57813 10.6735L7.0846 10.6735C8.20977 10.6735 9.00033 10.6724 9.60364 10.5991C10.1931 10.5275 10.5242 10.3948 10.7683 10.1864C10.8493 10.1173 10.9247 10.0417 10.9939 9.96082C11.2024 9.71674 11.3358 9.38553 11.4075 8.79614C11.4808 8.19288 11.4818 7.40218 11.4818 6.2771L11.4818 5.57813ZM12.6627 6.2771C12.6627 7.37222 12.6637 8.247 12.5798 8.93799C12.4942 9.64284 12.3133 10.2359 11.8928 10.7282C11.7834 10.8562 11.6637 10.9751 11.5356 11.0845C11.0434 11.5049 10.4511 11.6867 9.74634 11.7723C9.05525 11.8563 8.17999 11.8552 7.0846 11.8552L5.57813 11.8552C4.48273 11.8552 3.60747 11.8563 2.91638 11.7723C2.21157 11.6867 1.61933 11.5049 1.12708 11.0845C0.99901 10.9751 0.879281 10.8562 0.769898 10.7282C0.349454 10.2359 0.168506 9.64284 0.0828864 8.93799C-0.00101964 8.247 4.88512e-07 7.37222 6.47206e-07 6.2771L6.47206e-07 5.57813C6.47206e-07 4.48273 -0.00106163 3.60747 0.0828864 2.91638C0.168502 2.21168 0.349594 1.61928 0.769898 1.12708C0.879302 0.998981 0.998981 0.879302 1.12708 0.769898C1.61928 0.349594 2.21168 0.168502 2.91638 0.0828864C3.60747 -0.00106163 4.48273 6.47206e-07 5.57813 6.47206e-07L7.0846 6.47206e-07C8.17999 6.47206e-07 9.05525 -0.00106163 9.74634 0.0828864C10.451 0.168505 11.0434 0.349587 11.5356 0.769898C11.6637 0.879302 11.7834 0.998981 11.8928 1.12708C12.3131 1.61928 12.4942 2.21169 12.5798 2.91638C12.6638 3.60747 12.6627 4.48273 12.6627 5.57813L12.6627 6.2771Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t\thx('path', {\n\t\t\ttransform: 'translate(0.6689 1.073)',\n\t\t\td: 'M6.02607 5.50955L6.44306 5.9274L3.84284 8.52762L3.425 8.11063L3.00715 7.69278L4.77253 5.9274L3.00715 4.16202L3.84284 3.32633L6.02607 5.50955Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t\thx('path', {\n\t\t\ttransform: 'translate(0.6689 1.073)',\n\t\t\td: 'M9.23789 7.35397L9.23789 8.53488L6.96238 8.53488L6.96238 7.35397L9.23789 7.35397Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t);\n}\n\nexport function IconEditOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M9.94076 1.34942C10.7047 0.90231 11.6503 0.902415 12.4143 1.34942C12.7061 1.52015 12.9688 1.79118 13.3104 2.13284C13.6521 2.47448 13.9231 2.73721 14.0939 3.02894C14.5408 3.79294 14.5409 4.73856 14.0939 5.50251C13.9231 5.79415 13.652 6.05704 13.3104 6.39861L6.65932 13.0497C6.28068 13.4284 6.00695 13.7108 5.66543 13.9097C5.32391 14.1085 4.94315 14.2074 4.42705 14.3498L3.24394 14.6761C2.77527 14.8054 2.34538 14.9262 2.00131 14.9684C1.65196 15.0112 1.17964 15.0013 0.810764 14.6325C0.441921 14.2637 0.432107 13.7913 0.47486 13.442C0.517035 13.0979 0.6379 12.668 0.767181 12.1993L1.09352 11.0162C1.23588 10.5001 1.33481 10.1193 1.5336 9.77784C1.7325 9.43632 2.0149 9.1626 2.39355 8.78395L9.04466 2.13284C9.38625 1.79126 9.64911 1.52016 9.94076 1.34942ZM15.5427 14.8398H7.55223L8.96707 13.425H15.5427V14.8398ZM3.39382 9.78422C2.965 10.213 2.84244 10.3436 2.75709 10.49C2.67183 10.6366 2.61862 10.8079 2.45733 11.3925L2.13099 12.5756C2.00183 13.0439 1.92194 13.3419 1.88863 13.5536C2.10041 13.5204 2.39872 13.4416 2.86764 13.3123L4.05075 12.9859C4.63544 12.8246 4.80669 12.7715 4.95323 12.6862C5.09968 12.6008 5.23022 12.4783 5.65905 12.0494L10.721 6.98644L8.45577 4.72121L3.39382 9.78422ZM11.7 2.57079C11.3774 2.38198 10.9777 2.38198 10.6551 2.57079C10.5602 2.62647 10.4487 2.72931 10.0449 3.13311L9.45604 3.72094L11.7213 5.98617L12.3102 5.39833C12.7139 4.99457 12.8168 4.88307 12.8725 4.78818C13.0613 4.46561 13.0612 4.06585 12.8725 3.74326C12.8169 3.64827 12.7146 3.53752 12.3102 3.13311C11.9057 2.72863 11.795 2.6264 11.7 2.57079Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconBrowseOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t},\n\t\thx('path', { d: 'M11.2426 4.80473V6.10551H4.75819V4.80473H11.2426Z', fill: 'currentColor' }),\n\t\thx('path', { d: 'M9.40858 7.84478V9.14557H4.75819V7.84478H9.40858Z', fill: 'currentColor' }),\n\t\thx('path', {\n\t\t\td: 'M9.23438 0.546389C10.1941 0.546389 10.9683 0.544914 11.5859 0.611819C12.2161 0.680096 12.7634 0.825745 13.2393 1.17139C13.5172 1.3733 13.7619 1.61812 13.9639 1.896C14.3096 2.37183 14.4551 2.91922 14.5234 3.54932C14.5903 4.16686 14.5889 4.94133 14.5889 5.90088V10.0981C14.5889 11.0576 14.5903 11.8321 14.5234 12.4497C14.4552 13.0798 14.3094 13.6272 13.9639 14.103C13.7619 14.381 13.5172 14.6257 13.2393 14.8276C12.7633 15.1734 12.2163 15.3189 11.5859 15.3872C10.9683 15.4541 10.1942 15.4536 9.23438 15.4536H6.76563C5.80591 15.4536 5.03168 15.4541 4.41407 15.3872C3.78385 15.3189 3.23665 15.1734 2.76074 14.8276C2.48291 14.6257 2.23802 14.3809 2.03614 14.103C1.69066 13.6272 1.54483 13.0798 1.47657 12.4497C1.40973 11.8321 1.41114 11.0576 1.41114 10.0981V5.90088C1.41113 4.94132 1.40966 4.16686 1.47657 3.54932C1.54488 2.91921 1.69042 2.37184 2.03614 1.896C2.2381 1.61807 2.4828 1.37333 2.76074 1.17139C3.23665 0.825682 3.78386 0.680109 4.41407 0.611819C5.03168 0.544905 5.80591 0.546389 6.76563 0.546389H9.23438ZM6.76563 1.896C5.77586 1.896 5.0876 1.89738 4.55957 1.95459C4.0443 2.01043 3.76214 2.11349 3.55469 2.26416C3.39135 2.38284 3.24761 2.52662 3.12891 2.68994C2.97821 2.89736 2.8752 3.17967 2.81934 3.69483C2.76214 4.22279 2.76075 4.91131 2.76074 5.90088V10.0981C2.76074 11.0876 2.76221 11.7762 2.81934 12.3042C2.87516 12.8194 2.97829 13.1026 3.12891 13.3101C3.24754 13.4733 3.39147 13.6172 3.55469 13.7358C3.76213 13.8865 4.04438 13.9896 4.55957 14.0454C5.0876 14.1026 5.77586 14.103 6.76563 14.103H9.23438C10.2242 14.103 10.9124 14.1026 11.4404 14.0454C11.9556 13.9896 12.2379 13.8865 12.4453 13.7358C12.6086 13.6172 12.7525 13.4733 12.8711 13.3101C13.0217 13.1026 13.1248 12.8195 13.1807 12.3042C13.2378 11.7762 13.2393 11.0876 13.2393 10.0981V5.90088C13.2393 4.91131 13.2379 4.22279 13.1807 3.69483C13.1248 3.17969 13.0218 2.89736 12.8711 2.68994C12.7524 2.52667 12.6086 2.38281 12.4453 2.26416C12.2379 2.11355 11.9556 2.01041 11.4404 1.95459C10.9124 1.8974 10.2241 1.896 9.23438 1.896H6.76563Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t);\n}\n\nexport function IconSearchOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t},\n\t\thx('path', {\n\t\t\td: 'M11.894845 6.647401C11.894845 3.725463 9.534486 1.356779 6.623219 1.35657C3.711786 1.35657 1.351635 3.725338 1.351635 6.647401C1.351843 9.569296 3.711911 11.938273 6.623219 11.938273C9.534361 11.938064 11.894637 9.569171 11.894845 6.647401ZM13.245462 6.647401C13.245254 10.317935 10.280401 13.293613 6.623219 13.293821C2.965871 13.293821 0.000204 10.31806 0 6.647401C0 2.976574 2.965746 0 6.623219 0C10.280526 0.000205 13.245462 2.9767 13.245462 6.647401Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t\thx('path', {\n\t\t\td: 'M16.000417 15.041079L15.044449 16.000433L11.530434 12.473588L12.486298 11.514234L16.000417 15.041079Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t);\n}\n\nexport function IconCodeOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\tfillRule: 'evenodd',\n\t\tclipRule: 'evenodd',\n\t\td: 'M12.3368 1.53569L11.931 4.43172H14.8086V5.79673H11.7404L11.1962 9.67859H14.2839V11.0436H11.0056L10.4994 14.6529L9.14873 14.4643L9.62731 11.0436H5.75876L5.25252 14.6529L3.90186 14.4643L4.38043 11.0436H1.69141V9.67859H4.57104L5.11417 5.79673H2.21609V4.43172H5.30581L5.73724 1.34713L7.08995 1.53569L6.68414 4.43172H10.5527L10.9841 1.34713L12.3368 1.53569ZM5.94937 9.67859H9.81791L10.361 5.79673H6.49353L5.94937 9.67859Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconInspectOutline12(size = 12, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'inline-block', verticalAlign: '-1.5px', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M16 8L10.8571 12V10.552L14.1383 8L10.8571 5.448V4L16 8ZM5.14286 10.552L1.86171 8L5.14286 5.448V4L0 8L5.14286 12V10.552ZM9.02514 4L5.59657 12H6.84057L10.2691 4H9.02514Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconCopyOutline16(size = 12, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'inline-block', verticalAlign: '-1.5px', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M6.14929 4.02032C7.11197 4.02032 7.87983 4.02016 8.49597 4.07598C9.12128 4.13269 9.65792 4.25188 10.1415 4.53106C10.7202 4.8653 11.2008 5.3459 11.535 5.92462C11.8142 6.40818 11.9334 6.94481 11.9901 7.57012C12.0459 8.18625 12.0458 8.95419 12.0458 9.9168C12.0458 10.8795 12.0459 11.6473 11.9901 12.2635C11.9334 12.8888 11.8142 13.4254 11.535 13.909C11.2008 14.4877 10.7202 14.9683 10.1415 15.3025C9.65792 15.5817 9.12128 15.7009 8.49597 15.7576C7.87984 15.8134 7.11196 15.8133 6.14929 15.8133C5.18667 15.8133 4.41874 15.8134 3.80261 15.7576C3.1773 15.7009 2.64067 15.5817 2.1571 15.3025C1.5784 14.9683 1.09778 14.4877 0.76355 13.909',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconCheckOutline14(size = 12, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 14 14',\n\t\tfill: 'none',\n\t\tstyle: { display: 'inline-block', verticalAlign: '-1.5px', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M11.5635 4.58984L7.61426 9.07715C7.35154 9.37561 7.11346 9.64812 6.89453 9.84668C6.66593 10.054 6.38519 10.2506 6.01465 10.3164C5.82079 10.3508 5.62207 10.3529 5.42773 10.3213C5.0561 10.2609 4.77266 10.0674 4.54102 9.86328C4.31926 9.66791 4.07752 9.39911 3.81055 9.10449L2.44531 7.59863L3.55664 6.59082L4.92188 8.09766C5.21256 8.41844 5.38878 8.61191 5.53223 8.73828C5.61022 8.80699 5.65253 8.83192 5.66895 8.83984C5.69648 8.84429 5.72449 8.84467 5.75195 8.83984C5.72657 8.84451 5.75564 8.85422 5.88672 8.73535C6.02833 8.60692 6.20225 8.41088 6.48828 8.08594L10.4385 3.59961L11.5635 4.58984Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconQuestionOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M8 1C4.134 1 1 3.91 1 7.5c0 1.547.575 2.973 1.559 4.093L1.13 14.54a.5.5 0 00.627.63l3.238-1.079C5.875 14.316 6.91 14.5 8 14.5c3.866 0 7-2.91 7-6.5S11.866 1 8 1zm0 10.5a.75.75 0 110-1.5.75.75 0 010 1.5zm1.09-3.41c-.42.34-.59.54-.59.91H7.5v-.5c0-.66.36-1.12.82-1.48.44-.35.68-.61.68-1.02 0-.55-.45-1-1-1s-1 .45-1 1H6c0-1.1.9-2 2-2s2 .9 2 2c0 .73-.39 1.25-.91 1.67z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconImageOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M14 3H2a1 1 0 00-1 1v8a1 1 0 001 1h12a1 1 0 001-1V4a1 1 0 00-1-1zm-1 8H3l2.5-3.2 1.8 2.3 2.7-3.5L13 11zM5.5 6a1.5 1.5 0 110-3 1.5 1.5 0 010 3z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nfunction toolIconFor(kind: CardKind, size = 14): unknown {\n\tswitch (kind) {\n\t\tcase 'terminal':\n\t\t\treturn IconApiOutline14(size);\n\t\tcase 'diff':\n\t\tcase 'delete':\n\t\t\treturn IconEditOutline16(size);\n\t\tcase 'read':\n\t\t\treturn IconBrowseOutline16(size);\n\t\tcase 'search':\n\t\tcase 'list':\n\t\t\treturn IconSearchOutline16(size);\n\t\tcase 'question':\n\t\t\treturn IconQuestionOutline16(size);\n\t\tcase 'image':\n\t\t\treturn IconImageOutline16(size);\n\t\tdefault:\n\t\t\treturn IconCodeOutline16(size);\n\t}\n}\n\n// ---- Structural types -----------------------------------------------------\n\ntype ToolResultBlock = {\n\tcall: { name: string; argsRaw: string } | null;\n\tcontent: readonly { type?: string; text?: string }[];\n\tisError: boolean;\n\terror?: { name?: string; code?: string };\n\tparentCallId?: string;\n\tsubCalls?: readonly unknown[];\n};\n\ntype RunningCallBlock = {\n\tname: string;\n\targsRaw: string;\n\tparentCallId?: string;\n\tsubCalls?: readonly unknown[];\n\tcall?: { name: string; argsRaw: string };\n};\n\nexport type ToolBlock = (ToolResultBlock | RunningCallBlock) & { kind?: string };\n\nexport interface AgyToolViewProps {\n\tcallId: string;\n\ttoolName: string;\n\tblock: ToolBlock;\n\tcwd?: string;\n\thome?: string;\n\topenFile?: (path: string, opts?: unknown) => void;\n\tinspect?: () => void;\n\tloadImage?: unknown;\n\t/** Standard locale seat, supplied when the registration declares a namespace. */\n\tt?: (key: string, params?: Record<string, unknown>) => string;\n}\n\n// ---- argument parsing -----------------------------------------------------\n\nfunction parsedArgsRaw(block: ToolBlock): string {\n\tconst settled = block as ToolResultBlock;\n\tif ('call' in settled && settled.call !== null && typeof settled.call.argsRaw === 'string') {\n\t\treturn settled.call.argsRaw;\n\t}\n\tconst running = block as RunningCallBlock;\n\tif (typeof running.argsRaw === 'string') return running.argsRaw;\n\treturn '';\n}\n\nfunction parseArgs(block: ToolBlock): Record<string, unknown> | null {\n\tconst raw = parsedArgsRaw(block);\n\tif (raw === '') return null;\n\ttry {\n\t\tconst v = JSON.parse(raw) as unknown;\n\t\treturn typeof v === 'object' && v !== null && !Array.isArray(v) ? (v as Record<string, unknown>) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction cleanString(val: unknown): string {\n\tif (typeof val !== 'string') return '';\n\tlet s = val.trim();\n\tif ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n\t\ts = s.slice(1, -1).trim();\n\t}\n\treturn s;\n}\n\nfunction parseInnerArgs(raw: unknown): Record<string, unknown> {\n\tif (raw === undefined || raw === null) return {};\n\tif (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>;\n\tif (typeof raw === 'string') {\n\t\tlet s = raw.trim();\n\t\tif ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n\t\t\ttry {\n\t\t\t\tconst unquoted = JSON.parse(s) as unknown;\n\t\t\t\tif (typeof unquoted === 'string') s = unquoted.trim();\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(s) as unknown;\n\t\t\tif (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n\t\t\t\treturn parsed as Record<string, unknown>;\n\t\t\t}\n\t\t\treturn { value: parsed };\n\t\t} catch {\n\t\t\treturn { value: raw };\n\t\t}\n\t}\n\treturn { value: raw };\n}\n\nfunction cleanResultText(text: string): string {\n\tconst trimmed = text.trim();\n\tif (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n\t\ttry {\n\t\t\tconst obj = JSON.parse(trimmed) as { content?: unknown };\n\t\t\tif (Array.isArray(obj?.content)) {\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tfor (const item of obj.content) {\n\t\t\t\t\tconst blk = item as { type?: string; text?: unknown };\n\t\t\t\t\tif (blk?.type === 'text' && typeof blk.text === 'string') {\n\t\t\t\t\t\tparts.push(blk.text);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (parts.length > 0) return parts.join('\\n');\n\t\t\t}\n\t\t} catch {\n\t\t\t// not JSON\n\t\t}\n\t}\n\treturn text;\n}\n\nfunction mirrorInfo(block: ToolBlock): { tool: string; input: Record<string, unknown>; server?: string } | null {\n\tconst a = parseArgs(block);\n\tif (a === null) return null;\n\tlet tool = typeof a.tool === 'string' ? a.tool : '';\n\tif (tool === '') return null;\n\tlet input: Record<string, unknown> = {};\n\tconst raw = a.input;\n\tif (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) input = raw as Record<string, unknown>;\n\telse if (typeof raw === 'string') {\n\t\ttry {\n\t\t\tconst p = JSON.parse(raw) as unknown;\n\t\t\tif (typeof p === 'object' && p !== null && !Array.isArray(p)) input = p as Record<string, unknown>;\n\t\t\telse input = { value: raw };\n\t\t} catch {\n\t\t\tinput = { value: raw };\n\t\t}\n\t}\n\tlet server = typeof a.server === 'string' && a.server !== '' ? cleanString(a.server) : undefined;\n\n\t// Unwrap MCP meta-tools: call_mcp_tool, callMcpTool, call_mcp, mcp_call\n\tif (/^(call_mcp_tool|callMcpTool|call_mcp|mcp_call)$/i.test(tool)) {\n\t\tconst s = pick(input, 'ServerName', 'server_name', 'serverName', 'server');\n\t\tif (s) server = cleanString(s);\n\t\tconst innerTool = pick(input, 'ToolName', 'tool_name', 'toolName', 'name', 'tool');\n\t\tconst rawInner = input.Arguments ?? input.arguments ?? input.args ?? input.parameters ?? input.params ?? input.input;\n\t\tif (innerTool) {\n\t\t\ttool = cleanString(innerTool);\n\t\t\tinput = parseInnerArgs(rawInner);\n\t\t}\n\t} else if (tool.startsWith('mcp__')) {\n\t\tconst parts = tool.slice(5).split('__');\n\t\tif (parts.length >= 2) {\n\t\t\tserver = parts[0];\n\t\t\ttool = parts.slice(1).join('__');\n\t\t}\n\t}\n\n\treturn { tool, input, ...(server ? { server } : {}) };\n}\n\nfunction pick(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const k of keys) {\n\t\tconst v = input[k];\n\t\tif (typeof v === 'string' && v !== '') return v;\n\t}\n\treturn undefined;\n}\n\nfunction num(input: Record<string, unknown>, ...keys: string[]): number | undefined {\n\tfor (const k of keys) {\n\t\tconst v = input[k];\n\t\tif (typeof v === 'number' && Number.isFinite(v)) return v;\n\t}\n\treturn undefined;\n}\n\nfunction resultText(block: ToolBlock): string {\n\tconst settled = block as ToolResultBlock;\n\tif (!Array.isArray(settled.content)) return '';\n\tconst parts: string[] = [];\n\tfor (const b of settled.content) {\n\t\tif (b && typeof b === 'object' && (b as { type?: string }).type === 'text' && typeof (b as { text?: unknown }).text === 'string') {\n\t\t\tparts.push((b as { text: string }).text);\n\t\t}\n\t}\n\tconst text = parts.join('\\n');\n\treturn cleanResultText(text);\n}\n\nfunction isSettled(block: ToolBlock): boolean {\n\treturn block.kind === 'tool-result' || 'content' in block;\n}\n\nfunction isError(block: ToolBlock): boolean {\n\tconst settled = block as ToolResultBlock;\n\treturn settled.isError === true || (settled.error !== undefined && settled.error !== null);\n}\n\n// ---- Card classification --------------------------------------------------\n\nconst TERMINAL_TOOLS = new Set(['run_command', 'bash', 'execute_command', 'ops_bash', 'sh', 'shell']);\nconst DIFF_TOOLS = new Set(['replace_file_content', 'edit_file', 'replace_in_file', 'edit', 'write_to_file', 'write_file', 'create_file']);\nconst READ_TOOLS = new Set(['read_file', 'view_file', 'read', 'open_file']);\nconst SEARCH_TOOLS = new Set(['find_by_name', 'glob', 'ops_glob', 'search_files', 'grep_search', 'search', 'ops_grep', 'search_file_content', 'grep', 'search_web', 'web_search']);\nconst LIST_TOOLS = new Set(['list_dir', 'ls']);\nconst DELETE_TOOLS = new Set(['delete_file', 'remove_file', 'rm']);\nconst QUESTION_TOOLS = new Set(['ask_question', 'ask', 'question']);\nconst IMAGE_TOOLS = new Set(['generate_image', 'create_image', 'render_image']);\n\nexport type CardKind = 'terminal' | 'diff' | 'read' | 'search' | 'list' | 'delete' | 'question' | 'image' | 'generic';\n\nexport interface MirrorCardModel {\n\tkind: CardKind;\n\ttool?: string;\n\tserver?: string;\n\ttitle: string;\n\tcommand?: string;\n\tcwd?: string;\n\toutput?: string;\n\tpath?: string;\n\toldText?: string | null;\n\tnewText?: string;\n\tlocation?: { path: string; line?: number };\n\traw?: string;\n\tquestions?: Array<{ question?: string; options?: string[]; is_multi_select?: boolean }>;\n\tprompt?: string;\n\timageName?: string;\n\taspectRatio?: string;\n\tisImage?: boolean;\n\timagePath?: string;\n}\n\nexport function mirrorCardModel(block: ToolBlock, cwd?: string, home?: string): MirrorCardModel {\n\tconst info = mirrorInfo(block);\n\tconst out = resultText(block);\n\tif (info === null) {\n\t\treturn { kind: 'generic', title: 'agy_tool', output: out, raw: parsedArgsRaw(block) };\n\t}\n\tconst { tool, input } = info;\n\tconst desc = pick(input, 'Description', 'description', 'toolAction', 'toolSummary', 'Instruction', 'instruction');\n\n\tif (QUESTION_TOOLS.has(tool)) {\n\t\tconst questionsRaw = (input as Record<string, unknown>).questions ?? (input as Record<string, unknown>).Questions;\n\t\tconst questions = Array.isArray(questionsRaw) ? (questionsRaw as Array<{ question?: string; options?: string[]; is_multi_select?: boolean }>) : [];\n\t\tconst firstQ = questions[0];\n\t\tconst qTitle = firstQ?.question ?? desc ?? 'Ask Question';\n\t\treturn {\n\t\t\tkind: 'question',\n\t\t\ttool,\n\t\t\tserver: info.server,\n\t\t\ttitle: qTitle,\n\t\t\toutput: out,\n\t\t\tquestions,\n\t\t\traw: parsedArgsRaw(block),\n\t\t};\n\t}\n\tif (IMAGE_TOOLS.has(tool)) {\n\t\tconst prompt = pick(input, 'Prompt', 'prompt') ?? '';\n\t\tconst name = pick(input, 'ImageName', 'image_name', 'name') ?? 'image';\n\t\tconst ratio = pick(input, 'AspectRatio', 'aspect_ratio') ?? '1:1';\n\t\treturn {\n\t\t\tkind: 'image',\n\t\t\ttool,\n\t\t\tserver: info.server,\n\t\t\ttitle: desc ?? `Generate Image \u00B7 ${name}`,\n\t\t\tprompt,\n\t\t\timageName: name,\n\t\t\taspectRatio: ratio,\n\t\t\toutput: out,\n\t\t\traw: parsedArgsRaw(block),\n\t\t};\n\t}\n\tif (TERMINAL_TOOLS.has(tool)) {\n\t\tconst command = pick(input, 'CommandLine', 'command_line', 'command', 'cmd', 'Cmd')\n\t\t\t?? (desc && desc.startsWith('$ ') ? desc.replace(/\\s*\u00B7\\s*.*$/, '').replace(/^\\$\\s*/, '') : undefined)\n\t\t\t?? JSON.stringify(input);\n\t\tconst cwdVal = pick(input, 'Cwd', 'cwd', 'WorkingDirectory', 'working_directory', 'workdir', 'WorkDir') ?? cwd;\n\t\tconst rowTitle = desc !== undefined && !desc.startsWith('$ ') && desc !== command ? desc + ' \u00B7 ' + command : command;\n\t\treturn {\n\t\t\tkind: 'terminal',\n\t\t\ttool,\n\t\t\tserver: info.server,\n\t\t\ttitle: rowTitle,\n\t\t\tcommand,\n\t\t\t...(cwdVal !== undefined ? { cwd: cwdVal } : {}),\n\t\t\toutput: out,\n\t\t};\n\t}\n\tif (DIFF_TOOLS.has(tool)) {\n\t\tconst rawPath = pick(input, 'TargetFile', 'target_file', 'path', 'file_path', 'Path', 'FilePath', 'AbsolutePath', 'targetFile', 'filename', 'FileName') ?? 'file';\n\t\tconst path = relativize(rawPath, cwd, home);\n\t\tconst oldText = pick(input, 'TargetContent', 'target_content', 'old_string', 'oldText', 'OldString', 'OldText', 'targetContent') ?? null;\n\t\tconst newText = pick(input, 'ReplacementContent', 'replacement_content', 'new_string', 'newText', 'content', 'NewString', 'NewText', 'Content', 'replacementContent', 'CodeContent', 'code_content', 'contents', 'FileContents', 'codeContent') ?? '';\n\t\tconst action = (tool === 'write_to_file' || tool === 'write_file' || tool === 'create_file') ? 'Write' : 'Edit';\n\t\tconst isGenericDesc = desc !== undefined && /^(file edit|editing file|write file|writing file|file write|edit file|editing|writing|file create|creating file)$/i.test(desc.trim());\n\t\tconst title = desc !== undefined && !isGenericDesc && !desc.includes(path)\n\t\t\t? `${action} ${path} \u00B7 ${desc}`\n\t\t\t: `${action} ${path}`;\n\t\treturn { kind: 'diff', tool, server: info.server, title, path: rawPath, oldText, newText, output: out };\n\t}\n\tif (READ_TOOLS.has(tool)) {\n\t\tconst path = pick(input, 'AbsolutePath', 'absolute_path', 'TargetFile', 'target_file', 'path', 'file_path', 'filename', 'Path', 'FilePath', 'FileName', 'targetFile') ?? '';\n\t\tconst offset = num(input, 'offset', 'Offset') ?? num(input, 'StartLine', 'start_line');\n\t\tconst line = offset !== undefined ? (offset > 0 && (tool === 'view_file' || tool === 'read_file') ? offset : offset + 1) : undefined;\n\t\tconst isImg = isImageFile(path);\n\t\treturn {\n\t\t\tkind: isImg ? 'image' : 'read',\n\t\t\ttool,\n\t\t\tserver: info.server,\n\t\t\ttitle: desc ? `${desc} \u00B7 ${path}` : path !== '' ? 'Read ' + path : 'Read',\n\t\t\tpath,\n\t\t\toutput: out,\n\t\t\tisImage: isImg,\n\t\t\timagePath: isImg ? path : undefined,\n\t\t\tprompt: desc,\n\t\t\timageName: path.split(/[/\\\\]/).pop() || 'image',\n\t\t\t...(path !== '' ? { location: { path, ...(line !== undefined ? { line } : {}) } } : {}),\n\t\t};\n\t}\n\tif (SEARCH_TOOLS.has(tool)) {\n\t\tconst rawPat = input.query ?? input.Query ?? input.pattern ?? input.Pattern ?? input.regex ?? input.Regex ?? input.QueryString;\n\t\tconst q = Array.isArray(rawPat) ? rawPat.join(', ') : (typeof rawPat === 'string' ? rawPat : (pick(input, 'query', 'Query', 'pattern', 'Pattern', 'regex', 'Regex', 'QueryString') ?? ''));\n\t\treturn { kind: 'search', tool, server: info.server, title: desc ?? (q !== '' ? 'Search ' + q : 'Search'), output: out };\n\t}\n\tif (LIST_TOOLS.has(tool)) {\n\t\tconst path = pick(input, 'DirectoryPath', 'directory_path', 'path', 'directory', 'Path', 'Directory', 'SearchDirectory', 'search_directory', 'AbsolutePath') ?? '';\n\t\treturn { kind: 'list', tool, server: info.server, title: desc ?? (path !== '' ? 'List ' + path : 'List directory'), output: out };\n\t}\n\tif (DELETE_TOOLS.has(tool)) {\n\t\tconst path = pick(input, 'TargetFile', 'target_file', 'path', 'file_path', 'Path', 'FilePath', 'AbsolutePath') ?? '';\n\t\treturn { kind: 'delete', tool, server: info.server, title: desc ?? 'Delete ' + path, output: out };\n\t}\n\tconst defaultTitle = info.server ? `${info.server}: ${tool}` : (tool !== '' ? tool : 'agy_tool');\n\tconst title = desc ?? defaultTitle;\n\treturn { kind: 'generic', tool, server: info.server, title, output: out, raw: parsedArgsRaw(block) };\n}\n\n// ---- Helpers --------------------------------------------------------------\n\nfunction relativize(p: string, cwd?: string, home?: string): string {\n\tif (cwd && p.startsWith(cwd)) {\n\t\tconst rel = p.slice(cwd.length).replace(/^[/\\\\]+/, '');\n\t\treturn rel !== '' ? rel : p;\n\t}\n\tif (home && p.startsWith(home)) return '~' + p.slice(home.length);\n\treturn p;\n}\n\nfunction clip(s: string, max: number): string {\n\treturn s.length > max ? s.slice(0, max) + '\\n\u2026 (+' + (s.length - max) + ' chars)' : s;\n}\n\nexport function trimTrailingBlankLines(s: string): string {\n\treturn s.replace(/[\\t ]*\\r?\\n[\\t ]*(\\r?\\n[\\t ]*)*$/, '\\n');\n}\n\nexport function previewLine(model: MirrorCardModel, cwd?: string, home?: string): string | undefined {\n\tif (model.kind === 'diff') {\n\t\tconst raw = model.path ?? 'file';\n\t\tconst rel = relativize(raw, cwd, home);\n\t\tconst display = rel.length > 40 ? '\u2026' + rel.slice(-40) : rel;\n\t\treturn model.oldText != null ? `\u00B1 ${display}` : `+ ${display}`;\n\t}\n\tconst out = model.output;\n\tif (out !== undefined && out !== '') {\n\t\tconst first = out.split('\\n').find((l) => l.trim() !== '');\n\t\tif (first !== undefined && first.trim() !== '') return first.trim().slice(0, 80);\n\t}\n\treturn undefined;\n}\n\nfunction cls(...names: Array<string | false | null | undefined>): string {\n\treturn names.filter((n): n is string => typeof n === 'string' && n !== '').join(' ');\n}\n\ntype Translate = (key: string, params?: Record<string, unknown>) => string;\n\n/**\n * Locale lookup with an English fallback: the mirror card renders through\n * host-provided `t` when the registration declares the namespace, but tests\n * and hosts without the seat call it bare. The old literals were mixed\n * \u4E2D\u6587 and English as BOTH fallback and primary, so non-Chinese users saw\n * Chinese buttons on mirror cards.\n */\nfunction tr(t: Translate | undefined, key: string, fallback: string, params?: Record<string, unknown>): string {\n\tif (typeof t === 'function') {\n\t\ttry {\n\t\t\tconst v = t(key, params);\n\t\t\tif (typeof v === 'string' && v !== '' && v !== key) return v;\n\t\t} catch {\n\t\t\t// unbound namespace \u2014 fall through\n\t\t}\n\t}\n\tif (params !== undefined && params.count !== undefined && fallback.includes('{count}')) {\n\t\treturn fallback.replace('{count}', String(params.count));\n\t}\n\treturn fallback;\n}\n\nfunction displayTitle(model: MirrorCardModel, t?: Translate): string {\n\tswitch (model.kind) {\n\t\tcase 'terminal':\n\t\t\treturn tr(t, 'tv.command', 'Command');\n\t\tcase 'diff':\n\t\t\treturn (model.tool === 'write_to_file' || model.tool === 'write_file' || model.tool === 'create_file') ? tr(t, 'tv.write', 'Write') : tr(t, 'tv.edit', 'Edit');\n\t\tcase 'read':\n\t\t\treturn tr(t, 'tv.read', 'Read');\n\t\tcase 'search':\n\t\t\treturn (model.tool === 'search_web' || model.tool === 'web_search') ? tr(t, 'tv.webSearch', 'Web Search') : tr(t, 'tv.search', 'Search');\n\t\tcase 'list':\n\t\t\treturn tr(t, 'tv.list', 'List');\n\t\tcase 'delete':\n\t\t\treturn tr(t, 'tv.delete', 'Delete');\n\t\tcase 'question':\n\t\t\treturn tr(t, 'tv.question', 'Question');\n\t\tcase 'image':\n\t\t\treturn tr(t, 'tv.image', 'Image');\n\t\tdefault:\n\t\t\tif (model.tool && model.tool !== 'agy_tool') {\n\t\t\t\treturn model.server ? `${model.server}: ${model.tool}` : model.tool.replace(/_/g, ' ');\n\t\t\t}\n\t\t\treturn tr(t, 'tv.tool', 'Tool');\n\t}\n}\n\nfunction displaySummary(model: MirrorCardModel, cwd?: string, home?: string): string {\n\tif (model.kind === 'terminal') {\n\t\treturn model.command ?? model.title;\n\t}\n\tif (model.kind === 'diff') {\n\t\tconst rawPath = model.path ?? 'file';\n\t\treturn relativize(rawPath, cwd, home);\n\t}\n\tif (model.kind === 'read') {\n\t\tconst rawPath = model.path ?? '';\n\t\treturn rawPath !== '' ? relativize(rawPath, cwd, home) : model.title;\n\t}\n\tif (model.kind === 'search') {\n\t\treturn model.title.replace(/^(Web search|Search)\\s*/i, '') || model.title;\n\t}\n\tif (model.kind === 'list') {\n\t\treturn model.title.replace(/^List\\s*(directory\\s*)?/i, '') || model.title;\n\t}\n\tif (model.kind === 'question') {\n\t\treturn model.title;\n\t}\n\tif (model.kind === 'image') {\n\t\treturn model.prompt || model.title;\n\t}\n\tif (model.server && model.title.startsWith(`${model.server}: `)) {\n\t\treturn model.title.slice(model.server.length + 2);\n\t}\n\treturn model.title;\n}\n\nfunction diffStat(model: MirrorCardModel): string | null {\n\tif (model.kind !== 'diff') return null;\n\tconst oldText = model.oldText ?? '';\n\tconst newText = model.newText ?? '';\n\tconst oldLines = oldText === '' ? 0 : oldText.split('\\n').length;\n\tconst newLines = newText === '' ? 0 : newText.split('\\n').length;\n\tif (oldLines === 0 && newLines === 0) return null;\n\tif (oldLines === 0) return `+${newLines}`;\n\treturn `+${newLines} -${oldLines}`;\n}\n\n// ---- Copy button component ------------------------------------------------\n\nfunction CopyButton({ text, labels, t }: { text: string; labels?: readonly [string, string]; t?: Translate }): unknown {\n\tconst [copied, setCopied] = react().useState(false);\n\tconst copyLabel = labels?.[0] ?? tr(t, 'code.copy', 'Copy');\n\tconst copiedLabel = labels?.[1] ?? tr(t, 'code.copied', 'Copied');\n\tconst onCopy = (e: { stopPropagation: () => void }) => {\n\t\te.stopPropagation();\n\t\tif (typeof navigator !== 'undefined' && navigator.clipboard) {\n\t\t\tnavigator.clipboard.writeText(text).then(() => {\n\t\t\t\tsetCopied(true);\n\t\t\t\tsetTimeout(() => setCopied(false), 1500);\n\t\t\t}).catch(() => {\n\t\t\t\t// Clipboard unavailable (insecure context): show the failure on\n\t\t\t\t// the button instead of silently doing nothing.\n\t\t\t\tsetCopied(false);\n\t\t\t});\n\t\t}\n\t};\n\treturn hx('button', {\n\t\ttype: 'button',\n\t\tclassName: 'agy-tv-copy-btn',\n\t\tonClick: onCopy,\n\t\ttitle: copied ? copiedLabel : copyLabel,\n\t},\n\t\tcopied ? IconCheckOutline14(11) : IconCopyOutline16(11),\n\t\thx('span', null, copied ? copiedLabel : copyLabel)\n\t);\n}\n\n// ---- Diff body renderer ---------------------------------------------------\n\n/** Per-side render cap: a 5000-line write_to_file used to build 10k DOM rows\n * inside a max-height:280px pane (99% of them invisible). */\nconst DIFF_MAX_LINES = 400;\n\nfunction DiffBody({ model, t }: { model: MirrorCardModel; openFile?: (p: string, o?: unknown) => void; cwd?: string; home?: string; t?: Translate }): unknown {\n\tconst h = hx;\n\tconst oldText = model.oldText ?? '';\n\tconst newText = model.newText ?? '';\n\tconst rows: unknown[] = [];\n\tconst moreRow = (count: number, key: string): unknown =>\n\t\th('div', { key, className: 'agy-tv-diff-line', style: { color: 'var(--dsw-alias-label-tertiary)' } },\n\t\t\ttr(t, 'tv.diffMore', '\u2026 {count} more lines not rendered', { count }));\n\tif (oldText !== '') {\n\t\tconst lines = oldText.split('\\n');\n\t\tconst shown = Math.min(lines.length, DIFF_MAX_LINES);\n\t\tfor (let i = 0; i < shown; i++) {\n\t\t\tconst line = lines[i];\n\t\t\trows.push(h('div', { key: 'del-' + i, className: 'agy-tv-diff-line agy-tv-diff-del' },\n\t\t\t\th('span', { className: 'agy-tv-diff-marker' }, '-'),\n\t\t\t\th('span', { style: { flex: 1 } }, line === '' ? ' ' : line)\n\t\t\t));\n\t\t}\n\t\tif (lines.length > shown) rows.push(moreRow(lines.length - shown, 'del-more'));\n\t}\n\tif (newText !== '') {\n\t\tconst lines = newText.split('\\n');\n\t\tconst shown = Math.min(lines.length, DIFF_MAX_LINES);\n\t\tfor (let i = 0; i < shown; i++) {\n\t\t\tconst line = lines[i];\n\t\t\trows.push(h('div', { key: 'add-' + i, className: 'agy-tv-diff-line agy-tv-diff-add' },\n\t\t\t\th('span', { className: 'agy-tv-diff-marker' }, '+'),\n\t\t\t\th('span', { style: { flex: 1 } }, line === '' ? ' ' : line)\n\t\t\t));\n\t\t}\n\t\tif (lines.length > shown) rows.push(moreRow(lines.length - shown, 'add-more'));\n\t}\n\tif (rows.length === 0) {\n\t\trows.push(h('div', { key: 'empty', className: 'agy-tv-diff-line', style: { color: 'var(--dsw-alias-label-tertiary)' } }, tr(t, 'tv.noChanges', '(no textual changes)')));\n\t}\n\treturn h('div', { className: 'agy-tv-diff-list' }, ...rows);\n}\n\n// ---- Question card renderer -----------------------------------------------\n\nfunction QuestionCardBody({ model }: { model: MirrorCardModel }): unknown {\n\tconst h = hx;\n\tconst questions = model.questions ?? [];\n\tconst [selectedMap, setSelectedMap] = react().useState<Record<number, Set<string>>>({});\n\tconst [inserted, setInserted] = react().useState(false);\n\n\tconst toggleOption = (qIdx: number, opt: string, isMulti?: boolean) => {\n\t\tsetSelectedMap((prev) => {\n\t\t\tconst next = { ...prev };\n\t\t\tconst current = new Set(next[qIdx] ?? []);\n\t\t\tif (isMulti) {\n\t\t\t\tif (current.has(opt)) current.delete(opt);\n\t\t\t\telse current.add(opt);\n\t\t\t} else {\n\t\t\t\tcurrent.clear();\n\t\t\t\tcurrent.add(opt);\n\t\t\t}\n\t\t\tnext[qIdx] = current;\n\t\t\treturn next;\n\t\t});\n\t};\n\n\tconst onInsert = () => {\n\t\tconst parts: string[] = [];\n\t\tfor (let i = 0; i < questions.length; i++) {\n\t\t\tconst sel = Array.from(selectedMap[i] ?? []);\n\t\t\tif (sel.length > 0) {\n\t\t\t\tparts.push(sel.join('; '));\n\t\t\t}\n\t\t}\n\t\tif (parts.length > 0) {\n\t\t\tconst text = parts.join('\\n');\n\t\t\tinsertTextIntoChatComposer(text);\n\t\t\tsetInserted(true);\n\t\t\tsetTimeout(() => setInserted(false), 1500);\n\t\t}\n\t};\n\n\tconst qNodes: unknown[] = [];\n\tfor (let i = 0; i < questions.length; i++) {\n\t\tconst q = questions[i];\n\t\tif (!q) continue;\n\t\tconst options = q.options ?? [];\n\t\tconst isMulti = q.is_multi_select === true;\n\t\tconst sel = selectedMap[i] ?? new Set();\n\n\t\tconst optNodes = options.map((opt, oIdx) => {\n\t\t\tconst isChecked = sel.has(opt);\n\t\t\treturn h('button', {\n\t\t\t\tkey: 'opt-' + oIdx,\n\t\t\t\ttype: 'button',\n\t\t\t\tclassName: cls('agy-tv-q-opt', isChecked && 'selected'),\n\t\t\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\ttoggleOption(i, opt, isMulti);\n\t\t\t\t},\n\t\t\t},\n\t\t\t\th('span', { className: cls('agy-tv-q-check', isMulti ? 'checkbox' : 'radio', isChecked && 'checked') }),\n\t\t\t\th('span', { className: 'agy-tv-q-opt-text' }, opt)\n\t\t\t);\n\t\t});\n\n\t\tqNodes.push(h('div', { key: 'q-' + i, className: 'agy-tv-q-item' },\n\t\t\th('div', { className: 'agy-tv-q-prompt' }, q.question || 'Please select:'),\n\t\t\th('div', { className: 'agy-tv-q-opts' }, ...optNodes)\n\t\t));\n\t}\n\n\tconst hasSelection = Object.values(selectedMap).some((s) => s.size > 0);\n\n\treturn h('div', { className: 'agy-tv-question-wrap' },\n\t\t...qNodes,\n\t\th('div', { className: 'agy-tv-q-footer' },\n\t\t\th('button', {\n\t\t\t\ttype: 'button',\n\t\t\t\tclassName: cls('agy-tv-q-insert-btn', hasSelection && 'active'),\n\t\t\t\tdisabled: !hasSelection,\n\t\t\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonInsert();\n\t\t\t\t},\n\t\t\t},\n\t\t\t\tinserted ? '\u2713 \u5DF2\u586B\u5165\u5BF9\u8BDD\u6846' : '\uD83D\uDCAC \u586B\u5165\u5BF9\u8BDD\u6846 / Insert into Chat'\n\t\t\t),\n\t\t\tmodel.output ? h('div', { className: 'agy-tv-q-answered' }, `\u5DF2\u8BB0\u5F55: ${model.output}`) : null\n\t\t)\n\t);\n}\n\n// ---- Image card renderer --------------------------------------------------\n\nfunction ImageCardBody({ model }: { model: MirrorCardModel }): unknown {\n\tconst h = hx;\n\tconst prompt = model.prompt || '';\n\tconst name = model.imageName || 'image';\n\tconst ratio = model.aspectRatio || '1:1';\n\tconst path = model.imagePath || model.path || '';\n\tconst mediaUrl = path ? buildMediaUrl(path) : null;\n\n\treturn h('div', { className: 'agy-tv-img-wrap' },\n\t\th('div', { className: 'agy-tv-img-meta' },\n\t\t\th('div', { className: 'agy-tv-img-prompt', title: prompt || name }, prompt ? `\"${prompt}\"` : name),\n\t\t\th('div', { className: 'agy-tv-img-badges' },\n\t\t\t\th('span', { className: 'agy-tv-img-badge' }, ratio),\n\t\t\t\t...(path ? [h('span', { key: 'path', className: 'agy-tv-img-badge', title: path }, path.split(/[/\\\\]/).pop())] : [])\n\t\t\t)\n\t\t),\n\t\tmediaUrl ? h('div', {\n\t\t\tclassName: 'agy-tv-img-preview-box',\n\t\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\topenLightbox(mediaUrl, prompt || name, path);\n\t\t\t},\n\t\t\ttitle: '\u70B9\u51FB\u653E\u5927\u9884\u89C8 / Click to open lightbox'\n\t\t},\n\t\t\th('img', {\n\t\t\t\tclassName: 'agy-tv-img-thumb',\n\t\t\t\tsrc: mediaUrl,\n\t\t\t\talt: prompt || name,\n\t\t\t\tloading: 'lazy',\n\t\t\t})\n\t\t) : null\n\t);\n}\n\n// ---- Card body renderer ---------------------------------------------------\n\nfunction CardBody({ model, openFile, cwd, home, inspect, t }: {\n\tmodel: MirrorCardModel;\n\topenFile?: (p: string, o?: unknown) => void;\n\tcwd?: string;\n\thome?: string;\n\tinspect?: () => void;\n\tt?: Translate;\n}): unknown {\n\tconst h = hx;\n\tconst inspectNode = inspect !== undefined\n\t\t? h('div', { key: 'ins', style: { padding: '4px 8px 6px' } },\n\t\t\th('button', {\n\t\t\t\ttype: 'button',\n\t\t\t\tclassName: 'agy-tv-inspect-btn',\n\t\t\t\tonClick: inspect,\n\t\t\t}, IconInspectOutline12(12), tr(t, 'code.inspect', 'Inspect'))\n\t\t)\n\t\t: null;\n\n\tswitch (model.kind) {\n\t\tcase 'terminal': {\n\t\t\tconst rawBody = model.output !== undefined && model.output !== '' ? trimTrailingBlankLines(model.output) : tr(t, 'tv.noOutput', '(no output)');\n\t\t\tconst copyText = model.output !== undefined && model.output !== '' ? model.output : (model.command ?? '');\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\th('span', { className: 'agy-tv-prompt-glyph' }, '\u276F'),\n\t\t\t\t\t\t...(model.cwd ? [h('span', { key: 'cwd', className: 'agy-tv-card-cwd' }, model.cwd)] : []),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-cmd', title: model.command }, model.command ?? '')\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: copyText, t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'diff': {\n\t\t\tconst path = model.path ?? 'file';\n\t\t\tconst pathLabel = relativize(path, cwd, home);\n\t\t\tconst stat = diffStat(model);\n\t\t\tconst copyText = model.newText ?? '';\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconEditOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, pathLabel),\n\t\t\t\t\t\t...(stat ? [h('span', { key: 's', className: 'agy-tv-diff-stat' }, stat)] : [])\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: copyText })\n\t\t\t\t),\n\t\t\t\th(DiffBody, { model, openFile, cwd, home, t }),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'read': {\n\t\t\tconst path = model.path ?? 'file';\n\t\t\tconst pathLabel = relativize(path, cwd, home);\n\t\t\tconst rawBody = model.output !== undefined && model.output !== '' ? trimTrailingBlankLines(model.output) : tr(t, 'tv.noOutput', '(no output)');\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconBrowseOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, pathLabel)\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.output ?? '', t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'search': {\n\t\t\tconst rawBody = model.output !== undefined && model.output !== '' ? trimTrailingBlankLines(model.output) : tr(t, 'tv.noMatches', '(no matches)');\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconSearchOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.title)\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.output ?? '', t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'list': {\n\t\t\tconst rawBody = model.output !== undefined && model.output !== '' ? trimTrailingBlankLines(model.output) : tr(t, 'tv.emptyDir', '(empty directory)');\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconBrowseOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.title)\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.output ?? '', t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'question': {\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconQuestionOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.title)\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.output ?? (model.raw ?? '') })\n\t\t\t\t),\n\t\t\t\th(QuestionCardBody, { model }),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'image': {\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconImageOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.imageName || 'Image')\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.prompt || (model.raw ?? '') })\n\t\t\t\t),\n\t\t\t\th(ImageCardBody, { model }),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tdefault: {\n\t\t\tconst copyText = model.output !== undefined && model.output !== '' ? model.output : (model.raw ?? '');\n\t\t\tconst rawBody = model.output !== undefined && model.output !== ''\n\t\t\t\t? trimTrailingBlankLines(model.output)\n\t\t\t\t: (model.raw !== undefined && model.raw !== '' ? clip(model.raw, 4000) : tr(t, 'tv.noDetail', '(no detail)'));\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconCodeOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.server ? `${model.server}: ${model.tool}` : (model.title || model.tool || 'Tool'))\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: copyText, t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t}\n}\n\n// ---- Main ToolView Component ----------------------------------------------\n\nexport function AgyMirrorToolView(props: AgyToolViewProps): unknown {\n\tconst h = hx;\n\tconst { block, cwd, home, openFile, inspect, t, callId } = props;\n\tconst settle = isSettled(block);\n\tconst err = isError(block);\n\tconst model = mirrorCardModel(block, cwd, home);\n\tconst cardKey = callId ? `call:${callId}` : `${model.kind}:${model.tool ?? ''}:${model.title}:${model.path ?? model.command ?? ''}`;\n\tconst [open, setOpen] = useToggle(false, cardKey);\n\tconst state: 'ok' | 'err' | 'run' = !settle ? 'run' : err ? 'err' : 'ok';\n\tconst title = displayTitle(model, t);\n\tconst summary = displaySummary(model, cwd, home);\n\tconst stat = diffStat(model);\n\tconst preview = !open && model.kind !== 'diff' ? previewLine(model, cwd, home) : undefined;\n\tconst hasFileLink = (model.kind === 'diff' || model.kind === 'read') && model.path && openFile !== undefined;\n\n\tconst onFileClick = (e: { stopPropagation: () => void }) => {\n\t\te.stopPropagation();\n\t\tif (model.path && openFile) {\n\t\t\tif (model.location?.line !== undefined) openFile(model.path, { line: model.location.line });\n\t\t\telse openFile(model.path);\n\t\t}\n\t};\n\n\tconst leading = open\n\t\t? h('span', { className: 'agy-tv-chevron-open' }, IconChevronDownOutline14(14))\n\t\t: h('span', { className: 'agy-tv-leading' },\n\t\t\th('span', { className: 'agy-tv-icon-idle' }, toolIconFor(model.kind, 14)),\n\t\t\th('span', { className: 'agy-tv-chevron-hover' }, IconChevronDownOutline14(14)),\n\t\t);\n\n\tconst summaryNode = hasFileLink\n\t\t? h('button', {\n\t\t\ttype: 'button',\n\t\t\tclassName: 'agy-tv-file-link',\n\t\t\tonClick: onFileClick,\n\t\t\ttitle: model.path,\n\t\t}, summary)\n\t\t: h('span', {\n\t\t\tclassName: cls('agy-tv-summary', err && 'agy-tv-summary-err'),\n\t\t\ttitle: summary,\n\t\t}, summary);\n\n\tconst header = h('div', {\n\t\tclassName: 'agy-tv-row',\n\t\trole: 'button',\n\t\ttabIndex: 0,\n\t\t'aria-expanded': open,\n\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\te.stopPropagation();\n\t\t\tsetOpen();\n\t\t},\n\t\tonKeyDown: (e: { key: string; preventDefault: () => void }) => {\n\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen();\n\t\t\t}\n\t\t},\n\t\ttitle: inspect !== undefined\n\t\t\t? (open ? tr(t, 'tv.hint.collapseInspect', 'Click to collapse \u00B7 right-click to inspect') : tr(t, 'tv.hint.expandInspect', 'Click to expand \u00B7 right-click to inspect'))\n\t\t\t: (open ? tr(t, 'tv.hint.collapse', 'Click to collapse') : tr(t, 'tv.hint.expand', 'Click to expand')),\n\t\tonContextMenu: inspect !== undefined ? (e: { preventDefault: () => void }) => { e.preventDefault(); inspect(); } : undefined,\n\t},\n\t\tleading,\n\t\th('span', { className: 'agy-tv-title' }, title),\n\t\th('span', { className: 'agy-tv-sep', 'aria-hidden': true }),\n\t\tsummaryNode,\n\t\t...(stat !== null ? [h('span', { key: 'stat', className: 'agy-tv-diff-stat' }, stat)] : []),\n\t\t...(preview !== undefined ? [h('span', { key: 'prev', className: 'agy-tv-preview', title: preview }, preview)] : []),\n\t);\n\n\treturn h('div', {\n\t\tclassName: cls('agy-tv-root', open && 'agy-tv-open'),\n\t\t'data-state': state,\n\t\t'data-kind': model.kind,\n\t},\n\t\theader,\n\t\t...(open ? [h('div', { key: 'wrap', className: 'agy-tv-body-wrap' },\n\t\t\th(CardBody, { model, openFile, cwd, home, inspect, t })\n\t\t)] : [])\n\t);\n}\n\n// ---- Register into DSH slots ----------------------------------------------\n\n/**\n * Extract the agy mirror cursor (and tool name) from a run_code program.\n *\n * Only the wrapper this bridge actually generates counts: `mirrorStepInvocation`\n * (src/activity.ts) requires the exact two-line shape \u2014 one comment naming the\n * recorded step and one `tools['agy_tool']({run, step})` call \u2014 and rejects any\n * other program. Anything it rejects is ordinary Code Mode and renders as code.\n */\nexport function parseAgyMirrorFromCode(argsRaw: string): { run: string; step: number; tool?: string } | null {\n\ttry {\n\t\tconst parsed = JSON.parse(argsRaw) as { code?: unknown };\n\t\tconst code = typeof parsed?.code === 'string' ? parsed.code : '';\n\t\tconst step = mirrorStepInvocation(code);\n\t\tif (step === undefined) return null;\n\t\treturn { run: step.run, step: step.step, tool: step.tool };\n\t} catch { /* not a mirror program */ }\n\treturn null;\n}\n\n/** Project a run_code program into the fields the code card renders. */\nexport function runCodeModel(block?: ToolBlock): { code: string; title: string } {\n\tconst raw = block !== undefined ? parsedArgsRaw(block) : '{}';\n\tlet code = raw;\n\tlet description: string | undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as { code?: unknown; description?: unknown };\n\t\tif (typeof parsed?.code === 'string') code = parsed.code;\n\t\tif (typeof parsed?.description === 'string' && parsed.description !== '') description = parsed.description;\n\t} catch { /* raw args are not JSON \u2014 show them verbatim */ }\n\tconst firstLine = code.split('\\n').find((line) => line.trim() !== '');\n\tconst title = description\n\t\t?? (firstLine !== undefined && firstLine.trim() !== '' ? firstLine.trim().slice(0, 120) : 'run_code');\n\treturn { code, title };\n}\n\n/**\n * Ordinary run_code toolview.\n *\n * The keyed `tool.call.toolview` registration for `run_code` REPLACES the\n * host's built-in code row rather than adding to it, so this branch owns the\n * icon, title, summary and expandable body for every non-mirror program. It\n * reuses the same styled vocabulary as the mirror card (`agy-tv-row` and\n * friends) so an ordinary Code Mode call reads exactly like a native tool row.\n */\nexport function AgyCodeToolView(props?: AgyToolViewProps): unknown {\n\tconst h = hx;\n\tconst { block, inspect, t, callId } = props ?? ({} as AgyToolViewProps);\n\tconst model = runCodeModel(block);\n\tconst cardKey = callId ? `call:${callId}` : `code:${model.title}`;\n\tconst [open, setOpen] = useToggle(false, cardKey);\n\tconst settle = block !== undefined && isSettled(block);\n\tconst err = block !== undefined && isError(block);\n\tconst state: 'ok' | 'err' | 'run' = !settle ? 'run' : err ? 'err' : 'ok';\n\tconst translate = (key: string): string => (typeof t === 'function' ? t(key) : key);\n\n\tconst leading = open\n\t\t? h('span', { className: 'agy-tv-chevron-open' }, IconChevronDownOutline14(14))\n\t\t: h('span', { className: 'agy-tv-leading' },\n\t\t\th('span', { className: 'agy-tv-icon-idle' }, IconCodeOutline16(14)),\n\t\t\th('span', { className: 'agy-tv-chevron-hover' }, IconChevronDownOutline14(14)),\n\t\t);\n\n\tconst header = h('div', {\n\t\tclassName: 'agy-tv-row',\n\t\trole: 'button',\n\t\ttabIndex: 0,\n\t\t'aria-expanded': open,\n\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\te.stopPropagation();\n\t\t\tsetOpen();\n\t\t},\n\t\tonKeyDown: (e: { key: string; preventDefault: () => void }) => {\n\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen();\n\t\t\t}\n\t\t},\n\t\ttitle: inspect !== undefined\n\t\t\t? (open ? tr(t, 'tv.hint.collapseInspect', 'Click to collapse \u00B7 right-click to inspect') : tr(t, 'tv.hint.expandInspect', 'Click to expand \u00B7 right-click to inspect'))\n\t\t\t: (open ? tr(t, 'tv.hint.collapse', 'Click to collapse') : tr(t, 'tv.hint.expand', 'Click to expand')),\n\t\tonContextMenu: inspect !== undefined ? (e: { preventDefault: () => void }) => { e.preventDefault(); inspect(); } : undefined,\n\t},\n\t\tleading,\n\t\th('span', { className: 'agy-tv-title' }, translate('code.title')),\n\t\th('span', { className: 'agy-tv-sep', 'aria-hidden': true }),\n\t\th('span', { className: cls('agy-tv-summary', err && 'agy-tv-summary-err'), title: model.title }, model.title),\n\t);\n\n\tconst inspectNode = inspect !== undefined\n\t\t? h('div', { key: 'ins', style: { padding: '4px 8px 6px' } },\n\t\t\th('button', { type: 'button', className: 'agy-tv-inspect-btn', onClick: inspect },\n\t\t\t\tIconInspectOutline12(12), translate('code.inspect')))\n\t\t: null;\n\n\tconst body = h('div', { className: 'agy-tv-card' },\n\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\tIconCodeOutline16(13),\n\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.title),\n\t\t\t),\n\t\t\th(CopyButton, { text: model.code, labels: [translate('code.copy'), translate('code.copied')] }),\n\t\t),\n\t\th('pre', { className: 'agy-tv-card-content' }, clip(model.code, 16_000)),\n\t\tinspectNode,\n\t);\n\n\treturn h('div', {\n\t\tclassName: cls('agy-tv-root', open && 'agy-tv-open'),\n\t\t'data-state': state,\n\t\t'data-kind': 'code',\n\t},\n\t\theader,\n\t\t...(open ? [h('div', { key: 'wrap', className: 'agy-tv-body-wrap' }, body)] : [])\n\t);\n}\n\n/**\n * run_code toolview: when the program is an agy mirror wrapper, render the\n * native Antigravity card instead of a raw code row; every other run_code\n * program renders through {@link AgyCodeToolView}.\n */\nexport function AgyRunCodeToolView(props?: unknown): unknown {\n\tconst typed = props as AgyToolViewProps | undefined;\n\tconst block = typed?.block;\n\tconst raw = block !== undefined ? parsedArgsRaw(block) : '{}';\n\tconst mirror = parseAgyMirrorFromCode(raw);\n\tif (mirror === null) return AgyCodeToolView(typed);\n\tlet description: string | undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as { description?: unknown };\n\t\tif (typeof parsed?.description === 'string' && parsed.description !== '') description = parsed.description;\n\t} catch { /* ignore */ }\n\tconst synthetic = {\n\t\t...block,\n\t\tcall: {\n\t\t\t...((block as { call?: { name?: string; argsRaw?: string } } | undefined)?.call ?? {}),\n\t\t\tname: 'agy_tool',\n\t\t\targsRaw: JSON.stringify({\n\t\t\t\trun: mirror.run,\n\t\t\t\tstep: mirror.step,\n\t\t\t\t...(mirror.tool !== undefined ? { tool: mirror.tool } : {}),\n\t\t\t\t...(description !== undefined ? { input: { description } } : {}),\n\t\t\t}),\n\t\t},\n\t} as unknown as ToolBlock;\n\treturn AgyMirrorToolView({ block: synthetic, t: typed?.t } as never);\n}\n\n/**\n * The two keyed views this integration contributes, in registration order.\n *\n * Fusion's own client entry performs the registration (it owns the single\n * `slots` dependency); this module only names what to register.\n */\nexport const AGY_TOOL_VIEWS: ReadonlyArray<{\n\tkey: string;\n\tlabel: string;\n\tcomponent: (props?: unknown) => React.ReactNode;\n}> = [\n\t{ key: 'agy_tool', label: 'Antigravity tool', component: AgyMirrorToolView as (props?: unknown) => React.ReactNode },\n\t// Code Mode wraps the mirror in `run_code`. A keyed slot entry is a takeover,\n\t// not an addition, so this view also owns ordinary programs \u2014 hence the\n\t// fallback to the code card inside AgyRunCodeToolView.\n\t{ key: 'run_code', label: 'Antigravity (code mode)', component: AgyRunCodeToolView as (props?: unknown) => React.ReactNode },\n];\n\n// ---- Official CSS Styles --------------------------------------------------\n\nconst ROW_CSS = `\n/* Container */\n.agy-tv-root {\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 100%;\n\tmin-width: 0;\n\tposition: relative;\n\tfont-family: var(--dsw-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"PingFang SC\", \"Microsoft YaHei\", sans-serif);\n\tmargin: 2px 0;\n}\n\n/* Collapsed Header Row */\n.agy-tv-row {\n\tdisplay: flex;\n\talign-items: center;\n\theight: calc(24px + var(--dsh-content-font-delta, 0px));\n\tmin-width: 0;\n\tposition: relative;\n\toverflow: hidden;\n\tcursor: pointer;\n\tuser-select: none;\n\tbackground: transparent;\n\tborder: none;\n\tpadding: 0;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* Running sweep shimmer animation */\n.agy-tv-root[data-state=\"run\"] .agy-tv-row:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 300px;\n\tbackground: linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--dsw-alias-bg-base, #ffffff) 60%, transparent) 55%, transparent 100%);\n\tpointer-events: none;\n\tanimation: 2.6s ease-out infinite agy-tv-sweep;\n}\n@keyframes agy-tv-sweep {\n\t0% { left: -300px; }\n\t90%, 100% { left: 100%; }\n}\n\n/* Leading Icon with Hover-to-Arrow transition */\n.agy-tv-leading {\n\tposition: relative;\n\tflex: none;\n\twidth: calc(16px + var(--dsh-content-font-delta, 0px));\n\theight: calc(16px + var(--dsh-content-font-delta, 0px));\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-right: 6px;\n\tcolor: var(--dsw-alias-label-tertiary, #64748b);\n}\n.agy-tv-leading svg {\n\twidth: calc(14px + var(--dsh-content-font-delta, 0px));\n\theight: calc(14px + var(--dsh-content-font-delta, 0px));\n}\n.agy-tv-icon-idle {\n\tdisplay: inline-flex;\n\topacity: 1;\n\ttransition: opacity 0.1s ease;\n}\n.agy-tv-chevron-hover {\n\tposition: absolute;\n\tinset: 0;\n\tmargin: auto;\n\topacity: 0;\n\ttransition: opacity 0.1s ease;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n}\n.agy-tv-row:hover .agy-tv-icon-idle {\n\topacity: 0;\n}\n.agy-tv-row:hover .agy-tv-chevron-hover {\n\topacity: 1;\n}\n.agy-tv-chevron-open {\n\tposition: relative;\n\tflex: none;\n\twidth: calc(16px + var(--dsh-content-font-delta, 0px));\n\theight: calc(16px + var(--dsh-content-font-delta, 0px));\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-right: 6px;\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n}\n.agy-tv-chevron-open svg {\n\twidth: calc(14px + var(--dsh-content-font-delta, 0px));\n\theight: calc(14px + var(--dsh-content-font-delta, 0px));\n}\n\n/* Title */\n.agy-tv-title {\n\tflex: none;\n\tfont-size: var(--dsh-content-font-size-secondary, 13px);\n\tline-height: calc(24px + var(--dsh-content-font-delta, 0px));\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\tfont-weight: 400;\n}\n\n/* Dot separator */\n.agy-tv-sep {\n\tbackground: var(--dsw-alias-label-caption, #94a3b8);\n\tborder-radius: 1px;\n\tflex: none;\n\twidth: 2px;\n\theight: 2px;\n\tmargin: 0 8px;\n}\n\n/* Summary */\n.agy-tv-summary {\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmin-width: 0;\n\tfont-size: var(--dsh-content-font-size-secondary, 13px);\n\tline-height: calc(24px + var(--dsh-content-font-delta, 0px));\n\tcolor: var(--dsw-alias-label-tertiary, #64748b);\n\tflex: auto;\n\toverflow: hidden;\n}\n.agy-tv-summary-err {\n\tcolor: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n/* File link button */\n.agy-tv-file-link {\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmin-width: 0;\n\tfont: inherit;\n\ttext-align: left;\n\tfont-size: var(--dsh-content-font-size-secondary, 13px);\n\tline-height: calc(24px + var(--dsh-content-font-delta, 0px));\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\ttext-decoration: underline dotted;\n\ttext-decoration-color: var(--dsw-alias-label-tertiary, #64748b);\n\ttext-underline-offset: 3px;\n\tcursor: pointer;\n\tbackground: none;\n\tborder: none;\n\tflex: 0 auto;\n\tmargin: 0;\n\tpadding: 0;\n\ttext-decoration-thickness: 1px;\n\toverflow: hidden;\n}\n.agy-tv-file-link:hover {\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n\ttext-decoration-color: currentColor;\n}\n\n/* Diff stat badge (+10 -2) */\n.agy-tv-diff-stat {\n\tfont-family: var(--ds-font-family-code, ui-monospace, monospace);\n\tfont-size: calc(var(--dsh-content-font-size-secondary, 13px) - 2px);\n\tcolor: var(--dsw-alias-label-caption, #94a3b8);\n\tmargin-left: 10px;\n\tflex: none;\n}\n\n/* Preview text */\n.agy-tv-preview {\n\tfont-family: var(--ds-font-family-code, ui-monospace, monospace);\n\tfont-size: 11px;\n\tcolor: var(--dsw-alias-label-caption, #94a3b8);\n\tmargin-left: 8px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmax-width: 35%;\n\tflex: none;\n}\n\n/* Body wrap */\n.agy-tv-body-wrap {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n/* Card container */\n.agy-tv-card {\n\tborder: 0.5px solid var(--dsw-alias-border-l1, #e2e8f0);\n\tbackground: var(--dsw-alias-markdown-code-block, #f8fafc);\n\tfont-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);\n\tfont-size: 12px;\n\tline-height: 1.55;\n\tborder-radius: 12px;\n\tmargin: 4px 0 4px 4px;\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n}\n\n/* Card Header */\n.agy-tv-card-header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n\tpadding: 8px 12px;\n\tbackground: var(--dsw-alias-markdown-code-block-banner, rgba(0, 0, 0, 0.02));\n\tborder-bottom: 0.5px solid var(--dsw-alias-border-l2, #e2e8f0);\n}\n.agy-tv-card-header-left {\n\tdisplay: flex;\n\talign-items: baseline;\n\tgap: 8px;\n\tmin-width: 0;\n\tflex: 1;\n\toverflow: hidden;\n}\n.agy-tv-prompt-glyph {\n\tcolor: var(--dsw-alias-label-caption, #94a3b8);\n\tflex: none;\n\tfont-weight: 700;\n}\n.agy-tv-card-cwd {\n\tcolor: var(--dsw-alias-label-tertiary, #64748b);\n\tflex: none;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.agy-tv-card-cmd {\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: pre;\n\tfont-weight: 600;\n}\n.agy-tv-card-path {\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n\tfont-weight: 600;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n/* Copy button */\n.agy-tv-copy-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n\tbackground: transparent;\n\tborder: none;\n\tpadding: 2px 6px;\n\tmargin: 0;\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\tcursor: pointer;\n\tfont-size: 11px;\n\tline-height: 16px;\n\tborder-radius: 4px;\n\ttransition: background-color 0.1s ease, color 0.1s ease;\n\tflex: none;\n}\n.agy-tv-copy-btn:hover {\n\tbackground: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.05));\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* Card scrollable content */\n.agy-tv-card-content {\n\tmax-height: 260px;\n\toverflow-y: auto;\n\toverflow-x: auto;\n\tpadding: 10px 14px;\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\tscrollbar-width: thin;\n\tscrollbar-color: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.2)) transparent;\n}\n.agy-tv-card-content::-webkit-scrollbar {\n\twidth: 6px;\n\theight: 6px;\n}\n.agy-tv-card-content::-webkit-scrollbar-thumb {\n\tbackground: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.18));\n\tborder-radius: 6px;\n\tbackground-clip: padding-box;\n}\n.agy-tv-card-content::-webkit-scrollbar-track {\n\tbackground: transparent;\n\tmargin: 6px 0;\n}\n\n/* Diff lines */\n.agy-tv-diff-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: 6px 0;\n\tmax-height: 280px;\n\toverflow-y: auto;\n\toverflow-x: auto;\n\tscrollbar-width: thin;\n\tscrollbar-color: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.2)) transparent;\n}\n.agy-tv-diff-list::-webkit-scrollbar {\n\twidth: 6px;\n\theight: 6px;\n}\n.agy-tv-diff-list::-webkit-scrollbar-thumb {\n\tbackground: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.18));\n\tborder-radius: 6px;\n}\n.agy-tv-diff-list::-webkit-scrollbar-track {\n\tbackground: transparent;\n\tmargin: 4px 0;\n}\n.agy-tv-diff-line {\n\tdisplay: flex;\n\tgap: 8px;\n\tpadding: 0 12px;\n\tmin-height: 20px;\n\tline-height: 20px;\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n}\n.agy-tv-diff-del {\n\tbackground: color-mix(in srgb, var(--dsw-alias-state-error-primary, #dc2626) 10%, transparent);\n\tcolor: var(--dsw-alias-state-error-primary, #dc2626);\n}\n.agy-tv-diff-add {\n\tbackground: color-mix(in srgb, var(--dsw-alias-state-success-primary, #059669) 10%, transparent);\n\tcolor: var(--dsw-alias-state-success-primary, #059669);\n}\n.agy-tv-diff-marker {\n\tflex: none;\n\twidth: 14px;\n\tfont-weight: 700;\n\tuser-select: none;\n}\n\n/* Inspect button */\n.agy-tv-inspect-btn {\n\tborder: 0.5px solid var(--dsw-alias-border-l3, #cbd5e1);\n\tbackground: var(--dsw-alias-bg-base, #ffffff);\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\tcursor: pointer;\n\topacity: 0;\n\tborder-radius: 999px;\n\talign-self: flex-start;\n\talign-items: center;\n\tgap: 4px;\n\tmargin: 4px 0 2px 4px;\n\tpadding: 2px 8px;\n\tfont-size: 11px;\n\tline-height: 16px;\n\ttransition: opacity 0.1s;\n\tdisplay: inline-flex;\n}\n.agy-tv-root:hover .agy-tv-inspect-btn,\n.agy-tv-inspect-btn:focus-visible {\n\topacity: 1;\n}\n.agy-tv-inspect-btn:hover {\n\tbackground: var(--dsw-alias-interactive-bg-hover-solid, #f1f5f9);\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* Question Card Styles */\n.agy-tv-question-wrap {\n\tpadding: 10px 14px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tfont-family: inherit;\n}\n.agy-tv-q-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n.agy-tv-q-prompt {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n}\n.agy-tv-q-opts {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n.agy-tv-q-opt {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 6px 10px;\n\tborder-radius: 6px;\n\tbackground: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.08));\n\tborder: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.2));\n\tcolor: var(--dsw-alias-label-primary, #334155);\n\tcursor: pointer;\n\ttext-align: left;\n\tfont-size: 12.5px;\n\ttransition: all 0.15s ease;\n}\n.agy-tv-q-opt:hover {\n\tbackground: var(--dsw-alias-bg-hover, rgba(127, 127, 127, 0.15));\n\tborder-color: var(--dsw-alias-border-l3, rgba(127, 127, 127, 0.35));\n}\n.agy-tv-q-opt.selected {\n\tbackground: rgba(16, 185, 129, 0.12);\n\tborder-color: #10b981;\n\tcolor: #10b981;\n}\n.agy-tv-q-check {\n\twidth: 14px;\n\theight: 14px;\n\tborder: 1.5px solid currentColor;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n}\n.agy-tv-q-check.radio {\n\tborder-radius: 50%;\n}\n.agy-tv-q-check.checkbox {\n\tborder-radius: 3px;\n}\n.agy-tv-q-check.checked:after {\n\tcontent: \"\";\n\twidth: 6px;\n\theight: 6px;\n\tbackground: currentColor;\n\tborder-radius: inherit;\n}\n.agy-tv-q-footer {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding-top: 6px;\n\tborder-top: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.15));\n}\n.agy-tv-q-insert-btn {\n\tpadding: 5px 12px;\n\tborder-radius: 6px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tbackground: rgba(16, 185, 129, 0.15);\n\tborder: 1px solid #10b981;\n\tcolor: #10b981;\n\tcursor: pointer;\n\ttransition: all 0.15s ease;\n}\n.agy-tv-q-insert-btn:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n.agy-tv-q-insert-btn:not(:disabled):hover {\n\tbackground: #10b981;\n\tcolor: #fff;\n}\n.agy-tv-q-answered {\n\tfont-size: 11px;\n\tcolor: var(--dsw-alias-label-tertiary, #888);\n}\n\n/* Image Card Styles */\n.agy-tv-img-wrap {\n\tpadding: 10px 14px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n.agy-tv-img-meta {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 8px;\n}\n.agy-tv-img-prompt {\n\tfont-size: 12.5px;\n\tcolor: var(--dsw-alias-label-primary, #334155);\n\tfont-style: italic;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.agy-tv-img-badges {\n\tdisplay: flex;\n\tgap: 4px;\n\tflex-shrink: 0;\n}\n.agy-tv-img-badge {\n\tfont-size: 11px;\n\tpadding: 1px 6px;\n\tborder-radius: 4px;\n\tbackground: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.1));\n\tborder: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.2));\n\tcolor: var(--dsw-alias-label-secondary, #888);\n}\n.agy-tv-img-preview-box {\n\tmax-height: 320px;\n\toverflow: hidden;\n\tborder-radius: 6px;\n\tborder: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.2));\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: repeating-conic-gradient(rgba(127,127,127,0.08) 0% 25%, transparent 0% 50%) 50% / 16px 16px;\n\tcursor: zoom-in;\n}\n.agy-tv-img-thumb {\n\tmax-width: 100%;\n\tmax-height: 320px;\n\tobject-fit: contain;\n}\n`;\n\n/**\n * Install the tool-card stylesheet once and hand back its remover.\n *\n * Upstream injected it at module load; a Fusion client entry must be able to\n * unwind what it added, so the work moved behind this function. The style id is\n * namespaced to this plugin.\n */\nexport function installAgyToolViewStyles(): () => void {\n\tconst gDoc = (globalThis as unknown as {\n\t\tdocument?: {\n\t\t\tgetElementById(id: string): unknown;\n\t\t\tcreateElement(tag: string): { id?: string; textContent?: string };\n\t\t\thead?: unknown;\n\t\t\tdocumentElement?: { appendChild(n: unknown): void };\n\t\t};\n\t}).document;\n\tif (gDoc === undefined || gDoc === null) return () => {};\n\tconst styleId = 'dsh-fusion-agy-toolview-css';\n\tlet st = gDoc.getElementById(styleId) as { id?: string; textContent?: string; remove?(): void } | null;\n\tif (st === null) {\n\t\tst = gDoc.createElement('style');\n\t\tst.id = styleId;\n\t\tst.textContent = ROW_CSS;\n\t\tconst host = (gDoc.head ?? gDoc.documentElement) as unknown as { appendChild(n: unknown): void };\n\t\tif (host !== undefined) host.appendChild(st);\n\t}\n\treturn () => {\n\t\tst?.remove?.();\n\t};\n}", "// User-decision quick-action helper for the Antigravity console.\n//\n// Ported from dsh-agy-worker (`src/client/decisions.ts`), MIT License,\n// Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n// dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n// docs/ATTRIBUTION-AGY.md.\n//\n// Only the composer helper the tool cards use is installed by Fusion; the\n// page-wide decision scanner of the standalone plugin is not, because it would\n// inject nodes into conversations Fusion already renders.\n\nimport { isInteractionLocked, onScrollSettle } from './scroll-guard.js';\n\nconst DECISION_CSS = `\n.agy-decision-container {\n margin: 10px 0 6px 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.07));\n border: 1px dashed var(--dsw-alias-border-l3, rgba(127, 127, 127, 0.3));\n}\n\n.agy-decision-header {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #aaa);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.agy-decision-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.agy-decision-chip {\n background: var(--dsw-alias-bg-l1, rgba(255, 255, 255, 0.05));\n border: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.25));\n color: var(--dsw-alias-label-primary, #eee);\n padding: 5px 12px;\n border-radius: 999px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n user-select: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n text-align: left;\n max-width: 100%;\n}\n\n.agy-decision-chip:hover {\n background: var(--dsw-alias-bg-hover, rgba(127, 127, 127, 0.18));\n border-color: var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.5));\n transform: translateY(-1px);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);\n}\n\n.agy-decision-chip:active {\n transform: translateY(0);\n}\n\n.agy-decision-chip.selected {\n background: rgba(16, 185, 129, 0.15);\n border-color: #10b981;\n color: #10b981;\n}\n\n.agy-decision-chip-num {\n font-weight: 700;\n opacity: 0.8;\n}\n\n.agy-decision-chip-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n`;\n\nfunction injectStyles(): void {\n if (typeof document === 'undefined') return;\n const styleId = 'dsh-fusion-agy-decisions-css';\n if (document.getElementById(styleId) === null) {\n const st = document.createElement('style');\n st.id = styleId;\n st.textContent = DECISION_CSS;\n const host = document.head ?? document.documentElement;\n if (host) host.appendChild(st);\n }\n}\n\n/**\n * Insert text directly into DSH's chat composer\n */\nexport function insertTextIntoChatComposer(text: string): boolean {\n if (typeof document === 'undefined' || !text) return false;\n const inputEl =\n document.querySelector<HTMLElement>('[data-composer-input]') ??\n document.querySelector<HTMLElement>('[role=\"textbox\"][contenteditable=\"true\"]') ??\n document.querySelector<HTMLTextAreaElement>('textarea');\n\n if (!inputEl) return false;\n inputEl.focus();\n\n if (inputEl instanceof HTMLTextAreaElement || inputEl instanceof HTMLInputElement) {\n const start = inputEl.selectionStart ?? inputEl.value.length;\n const end = inputEl.selectionEnd ?? inputEl.value.length;\n inputEl.setRangeText(text, start, end, 'end');\n inputEl.dispatchEvent(new Event('input', { bubbles: true }));\n inputEl.dispatchEvent(new Event('change', { bubbles: true }));\n return true;\n }\n\n // Lexical / ContentEditable\n try {\n const ok = document.execCommand('insertText', false, text);\n if (ok) return true;\n } catch {\n // ignore\n }\n\n // Fallback direct text update\n const existing = inputEl.textContent?.trim() ?? '';\n inputEl.textContent = existing ? `${existing} ${text}` : text;\n inputEl.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: text }));\n return true;\n}\n\n/** Check if text header suggests an actionable decision or choice prompt */\nconst DECISION_HEADER_REGEX = /(?:\u8BF7(?:\u60A8)?(?:\u62CD\u677F|\u6307\u793A|\u51B3\u5B9A|\u9009\u62E9|\u51B3\u7B56)|decision|next\\s+step|choose|\u62CD\u677F|\u9009\u62E9\u65B9\u6848)/i;\n\ninterface ExtractedOption {\n num?: string;\n title: string;\n fullText: string;\n}\n\n/** Extract numbered options or choice items from a decision list */\nfunction extractOptionsFromList(container: HTMLElement): ExtractedOption[] {\n const options: ExtractedOption[] = [];\n const listItems = container.querySelectorAll('li');\n\n if (listItems.length > 0) {\n for (let i = 0; i < listItems.length; i++) {\n const li = listItems[i];\n if (!li) continue;\n const text = (li.textContent ?? '').trim();\n if (!text) continue;\n\n // Extract title: up to first colon, dash, or 60 chars\n const m = text.match(/^([0-9]+[\u3001.\uFF0E:]\\s*)?(.*?)(?:[\uFF1A:\u2014\\-\u00B7]|\\n|$)/);\n const num = m?.[1]?.trim() ?? `${i + 1}.`;\n let title = m?.[2]?.trim() || text.slice(0, 50);\n if (title.length > 40) title = title.slice(0, 40) + '\u2026';\n\n options.push({\n num,\n title,\n fullText: text,\n });\n }\n }\n\n return options;\n}\n\n/**\n * Scan DOM for decision prompts and mount interactive choice chips.\n *\n * IDEMPOTENCE (incident 2026-10-23 \u2014 \"scroll back and forth = insane flashing\"):\n * DSH renders these containers inside a TanStack-Virtual list with dynamic\n * measurement (`measureElement` + `anchorTo:\"start\"`). Injecting a toolbar\n * changes the measured item height, which makes the virtualizer rewrite\n * scrollTop; the resulting re-render rebuilds the markdown/heading nodes\n * (dropping the per-HEADING guard) and this scanner injected the toolbar\n * again \u2014 growth on every scroll pass, i.e. a flashing flywheel.\n *\n * Two independent guards now make injection strictly once-per-container:\n * 1. `data-agy-decisions-scanned` on the container, written on EVERY pass\n * (it used to be read here but never assigned anywhere in the codebase),\n * 2. \"a toolbar already exists in this container\" \u2014 survives React\n * rebuilding the heading nodes during a virtualizer remount.\n */\nexport function scanAndEnhanceDecisions(): void {\n if (typeof document === 'undefined') return;\n if (isInteractionLocked()) return;\n\n const markdownContainers = document.querySelectorAll<HTMLElement>('div[class*=\"_markdown_\"], [data-markdown-variant]');\n for (let i = 0; i < markdownContainers.length; i++) {\n const container = markdownContainers[i];\n if (!container || container.dataset.agyDecisionsScanned === 'true') continue;\n\n // A previous pass (or the host's own snapshot) already injected a toolbar\n // into this container. Mark and skip: never inject a duplicate.\n if (container.querySelector('.agy-decision-container')) {\n container.dataset.agyDecisionsScanned = 'true';\n continue;\n }\n\n // Mark BEFORE mutating so a self-triggered re-scan (this function inserts\n // nodes, which fires the observer that called it) short-circuits above.\n container.dataset.agyDecisionsScanned = 'true';\n\n // Check headings (h2, h3, h4, or strong paragraphs)\n const headings = container.querySelectorAll<HTMLElement>('h2, h3, h4, p > strong');\n for (let j = 0; j < headings.length; j++) {\n const heading = headings[j];\n if (!heading || heading.dataset.agyDecisionAttached === 'true') continue;\n\n const headingText = (heading.textContent ?? '').trim();\n if (!DECISION_HEADER_REGEX.test(headingText)) continue;\n\n // Find the list immediately following this heading\n let sibling = heading.nextElementSibling;\n let targetList: HTMLElement | null = null;\n while (sibling) {\n if (sibling.tagName === 'OL' || sibling.tagName === 'UL') {\n targetList = sibling as HTMLElement;\n break;\n }\n if (/^H[1-4]$/.test(sibling.tagName)) break; // hit another heading\n sibling = sibling.nextElementSibling;\n }\n\n if (!targetList) continue;\n\n const options = extractOptionsFromList(targetList);\n if (options.length === 0) continue;\n\n heading.dataset.agyDecisionAttached = 'true';\n\n // Build decision chip toolbar\n const box = document.createElement('div');\n box.className = 'agy-decision-container';\n\n const header = document.createElement('div');\n header.className = 'agy-decision-header';\n header.innerHTML = '<span>\uD83D\uDCAC \u70B9\u51FB\u9009\u9879\u5FEB\u901F\u586B\u5165\uFF1A</span>';\n box.appendChild(header);\n\n const chips = document.createElement('div');\n chips.className = 'agy-decision-chips';\n\n for (const opt of options) {\n const chip = document.createElement('button');\n chip.type = 'button';\n chip.className = 'agy-decision-chip';\n chip.title = `\u70B9\u51FB\u586B\u5165: ${opt.fullText}`;\n\n const numSpan = document.createElement('span');\n numSpan.className = 'agy-decision-chip-num';\n numSpan.textContent = opt.num ?? '\uD83D\uDC49';\n\n const textSpan = document.createElement('span');\n textSpan.className = 'agy-decision-chip-text';\n textSpan.textContent = opt.title;\n\n chip.appendChild(numSpan);\n chip.appendChild(textSpan);\n\n chip.onclick = (e) => {\n e.stopPropagation();\n const cleanText = opt.fullText.replace(/^[0-9]+[\u3001.\uFF0E:]\\s*/, '').trim();\n const insertPayload = `\u6211\u9009\u62E9 ${opt.num ? opt.num + ' ' : ''}${cleanText}`;\n insertTextIntoChatComposer(insertPayload);\n\n chip.classList.add('selected');\n setTimeout(() => chip.classList.remove('selected'), 1200);\n };\n\n chips.appendChild(chip);\n }\n\n box.appendChild(chips);\n targetList.parentNode?.insertBefore(box, targetList.nextSibling);\n }\n }\n}\n\nlet decisionChipsDispose: (() => void) | null = null;\nlet decisionScanTimer: ReturnType<typeof setTimeout> | null = null;\nlet unbindDecisionSettle: (() => void) | null = null;\n\nfunction scheduleDecisionScan(): void {\n if (isInteractionLocked()) return;\n if (decisionScanTimer !== null) return;\n decisionScanTimer = setTimeout(() => {\n decisionScanTimer = null;\n if (isInteractionLocked()) return;\n scanAndEnhanceDecisions();\n }, 100);\n}\n\nexport function installDecisionChips(): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {};\n // Same lifecycle contract as installImageEnhancer: a reload replaces the\n // observer instead of accumulating one per plugin load.\n decisionChipsDispose?.();\n injectStyles();\n\n const observer = new MutationObserver(() => {\n scheduleDecisionScan();\n });\n\n unbindDecisionSettle = onScrollSettle(() => {\n scheduleDecisionScan();\n });\n\n const setup = () => {\n if (document.body) {\n observer.observe(document.body, { childList: true, subtree: true });\n scanAndEnhanceDecisions();\n }\n };\n\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', setup, { once: true });\n } else {\n setup();\n }\n\n const dispose = (): void => {\n observer.disconnect();\n if (unbindDecisionSettle !== null) {\n unbindDecisionSettle();\n unbindDecisionSettle = null;\n }\n if (decisionScanTimer !== null) {\n clearTimeout(decisionScanTimer);\n decisionScanTimer = null;\n }\n window.removeEventListener('DOMContentLoaded', setup);\n if (decisionChipsDispose === dispose) decisionChipsDispose = null;\n };\n decisionChipsDispose = dispose;\n return dispose;\n}\n", "// Client-side local image display & lightbox helper for the Antigravity console.\n//\n// Ported from dsh-agy-worker (`src/client/images.ts`), MIT License,\n// Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n// dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n// docs/ATTRIBUTION-AGY.md.\n//\n// The standalone plugin also installed this as a page-wide DOM scanner over the\n// conversation. Fusion does not: the scanners belong to the old plugin identity,\n// so only the pure helpers the console and its tool cards call are kept\n// (`buildMediaUrl`, `openLightbox`, `isImageFile`).\n\nimport { isInteractionLocked, onScrollSettle } from './scroll-guard.js';\n\nlet lightboxOverlay: HTMLElement | null = null;\nlet currentLightboxImg: HTMLImageElement | null = null;\nlet lightboxScale = 1.0;\nlet lightboxTranslateX = 0;\nlet lightboxTranslateY = 0;\nlet isDraggingLightbox = false;\nlet dragStartX = 0;\nlet dragStartY = 0;\n\nconst IMAGE_CSS = `\n.agy-image-card {\n display: inline-flex;\n flex-direction: column;\n margin: 6px 0;\n max-width: 100%;\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.25));\n background: var(--dsw-alias-bg-l1, rgba(255, 255, 255, 0.03));\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n vertical-align: middle;\n}\n\n.agy-image-card:hover {\n border-color: var(--dsw-alias-border-l3, rgba(127, 127, 127, 0.45));\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.25);\n}\n\n.agy-image-thumb-wrap {\n position: relative;\n overflow: hidden;\n max-height: 480px;\n cursor: zoom-in;\n display: flex;\n align-items: center;\n justify-content: center;\n background: repeating-conic-gradient(rgba(127,127,127,0.08) 0% 25%, transparent 0% 50%) 50% / 16px 16px;\n}\n\n.agy-image-thumb {\n display: block;\n max-width: 100%;\n max-height: 480px;\n height: auto;\n object-fit: contain;\n transition: transform 0.2s ease;\n}\n\n.agy-image-card:hover .agy-image-thumb {\n transform: scale(1.015);\n}\n\n.agy-image-caption {\n padding: 6px 10px;\n font-size: 11.5px;\n color: var(--dsw-alias-label-secondary, #aaa);\n background: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.08));\n border-top: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.15));\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.agy-image-link-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n margin: 0 2px;\n border-radius: 4px;\n font-size: 12px;\n background: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.1));\n border: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.2));\n color: var(--dsw-alias-label-primary, #ddd);\n cursor: pointer;\n text-decoration: none;\n transition: all 0.15s ease;\n}\n\n.agy-image-link-chip:hover {\n background: var(--dsw-alias-bg-hover, rgba(127, 127, 127, 0.2));\n border-color: var(--dsw-alias-border-l3, rgba(127, 127, 127, 0.35));\n}\n\n/* Lightbox Modal */\n.agy-lightbox-backdrop {\n position: fixed;\n inset: 0;\n z-index: 999999;\n background: rgba(0, 0, 0, 0.9);\n /* No full-viewport backdrop blur: same flicker class as the console overlay.\n The image viewer is already near-opaque; a solid alpha is stable. */\n overscroll-behavior: contain;\n display: flex;\n flex-direction: column;\n user-select: none;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.agy-lightbox-backdrop.open {\n opacity: 1;\n}\n\n.agy-lightbox-header {\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n background: rgba(20, 20, 20, 0.65);\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n color: #fff;\n font-size: 13px;\n}\n\n.agy-lightbox-title {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 60%;\n}\n\n.agy-lightbox-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.agy-lightbox-btn {\n background: rgba(255, 255, 255, 0.1);\n border: 1px solid rgba(255, 255, 255, 0.15);\n color: #fff;\n border-radius: 6px;\n padding: 4px 10px;\n cursor: pointer;\n font-size: 12px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.15s ease;\n}\n\n.agy-lightbox-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n.agy-lightbox-btn-close {\n background: rgba(239, 68, 68, 0.25);\n border-color: rgba(239, 68, 68, 0.4);\n}\n\n.agy-lightbox-btn-close:hover {\n background: rgba(239, 68, 68, 0.45);\n}\n\n.agy-lightbox-body {\n flex: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: grab;\n}\n\n.agy-lightbox-body.grabbing {\n cursor: grabbing;\n}\n\n.agy-lightbox-img-wrap {\n transform-origin: center center;\n transition: transform 0.05s ease-out;\n display: inline-block;\n}\n\n.agy-lightbox-img {\n max-width: 90vw;\n max-height: 85vh;\n object-fit: contain;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n border-radius: 4px;\n pointer-events: none;\n}\n`;\n\nfunction injectStyles(): void {\n if (typeof document === 'undefined') return;\n const styleId = 'dsh-fusion-agy-images-css';\n if (document.getElementById(styleId) === null) {\n const st = document.createElement('style');\n st.id = styleId;\n st.textContent = IMAGE_CSS;\n const host = document.head ?? document.documentElement;\n if (host) host.appendChild(st);\n }\n}\n\nfunction getOrigin(): string {\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n return '';\n}\n\n/** Build media URL from path */\nexport function buildMediaUrl(rawPath: string): string {\n const origin = getOrigin();\n return `${origin}/plugins/agy-worker/media?path=${encodeURIComponent(rawPath.trim())}`;\n}\n\n/**\n * Open fullscreen Lightbox modal\n */\nexport function openLightbox(src: string, title = 'Image Preview', rawPath?: string): void {\n if (typeof document === 'undefined') return;\n injectStyles();\n\n if (lightboxOverlay) {\n lightboxOverlay.remove();\n lightboxOverlay = null;\n }\n\n lightboxScale = 1.0;\n lightboxTranslateX = 0;\n lightboxTranslateY = 0;\n\n const overlay = document.createElement('div');\n overlay.className = 'agy-lightbox-backdrop';\n\n const header = document.createElement('div');\n header.className = 'agy-lightbox-header';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'agy-lightbox-title';\n titleEl.textContent = title;\n header.appendChild(titleEl);\n\n const actions = document.createElement('div');\n actions.className = 'agy-lightbox-actions';\n\n const btnZoomIn = document.createElement('button');\n btnZoomIn.className = 'agy-lightbox-btn';\n btnZoomIn.textContent = '\uD83D\uDD0D+';\n btnZoomIn.title = '\u653E\u5927 / Zoom In';\n\n const btnZoomOut = document.createElement('button');\n btnZoomOut.className = 'agy-lightbox-btn';\n btnZoomOut.textContent = '\uD83D\uDD0D-';\n btnZoomOut.title = '\u7F29\u5C0F / Zoom Out';\n\n const btnReset = document.createElement('button');\n btnReset.className = 'agy-lightbox-btn';\n btnReset.textContent = '1:1';\n btnReset.title = '\u5B9E\u9645\u5927\u5C0F / Reset';\n\n actions.appendChild(btnZoomIn);\n actions.appendChild(btnZoomOut);\n actions.appendChild(btnReset);\n\n if (rawPath) {\n const btnCopyPath = document.createElement('button');\n btnCopyPath.className = 'agy-lightbox-btn';\n btnCopyPath.textContent = '\uD83D\uDCCB \u590D\u5236\u8DEF\u5F84';\n btnCopyPath.onclick = (e) => {\n e.stopPropagation();\n if (navigator.clipboard) {\n navigator.clipboard.writeText(rawPath).then(() => {\n btnCopyPath.textContent = '\u2713 \u5DF2\u590D\u5236';\n setTimeout(() => { btnCopyPath.textContent = '\uD83D\uDCCB \u590D\u5236\u8DEF\u5F84'; }, 1500);\n }).catch(() => {});\n }\n };\n actions.appendChild(btnCopyPath);\n }\n\n const btnClose = document.createElement('button');\n btnClose.className = 'agy-lightbox-btn agy-lightbox-btn-close';\n btnClose.textContent = '\u2715 \u5173\u95ED';\n actions.appendChild(btnClose);\n\n header.appendChild(actions);\n overlay.appendChild(header);\n\n const body = document.createElement('div');\n body.className = 'agy-lightbox-body';\n\n const imgWrap = document.createElement('div');\n imgWrap.className = 'agy-lightbox-img-wrap';\n\n const img = document.createElement('img');\n img.className = 'agy-lightbox-img';\n img.src = src;\n img.alt = title;\n currentLightboxImg = img;\n\n imgWrap.appendChild(img);\n body.appendChild(imgWrap);\n overlay.appendChild(body);\n\n const updateTransform = () => {\n imgWrap.style.transform = `translate(${lightboxTranslateX}px, ${lightboxTranslateY}px) scale(${lightboxScale})`;\n };\n\n btnZoomIn.onclick = (e) => {\n e.stopPropagation();\n lightboxScale = Math.min(lightboxScale * 1.3, 5.0);\n updateTransform();\n };\n\n btnZoomOut.onclick = (e) => {\n e.stopPropagation();\n lightboxScale = Math.max(lightboxScale / 1.3, 0.2);\n updateTransform();\n };\n\n btnReset.onclick = (e) => {\n e.stopPropagation();\n lightboxScale = 1.0;\n lightboxTranslateX = 0;\n lightboxTranslateY = 0;\n updateTransform();\n };\n\n const closeLightbox = () => {\n window.removeEventListener('keydown', onKeyDown);\n overlay.classList.remove('open');\n setTimeout(() => {\n overlay.remove();\n if (lightboxOverlay === overlay) lightboxOverlay = null;\n }, 200);\n };\n\n btnClose.onclick = (e) => {\n e.stopPropagation();\n closeLightbox();\n };\n\n overlay.onclick = (e) => {\n if (e.target === overlay || e.target === body) {\n closeLightbox();\n }\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeLightbox();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n\n // Drag and pan\n body.onmousedown = (e) => {\n isDraggingLightbox = true;\n dragStartX = e.clientX - lightboxTranslateX;\n dragStartY = e.clientY - lightboxTranslateY;\n body.classList.add('grabbing');\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!isDraggingLightbox) return;\n lightboxTranslateX = e.clientX - dragStartX;\n lightboxTranslateY = e.clientY - dragStartY;\n updateTransform();\n };\n\n const onMouseUp = () => {\n if (isDraggingLightbox) {\n isDraggingLightbox = false;\n body.classList.remove('grabbing');\n }\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n // Wheel zoom\n body.onwheel = (e) => {\n e.preventDefault();\n const factor = e.deltaY < 0 ? 1.15 : 0.87;\n lightboxScale = Math.max(0.2, Math.min(lightboxScale * factor, 5.0));\n updateTransform();\n };\n\n document.body.appendChild(overlay);\n lightboxOverlay = overlay;\n requestAnimationFrame(() => overlay.classList.add('open'));\n}\n\n/** Check if a URL or path is an image */\nexport function isImageFile(pathOrUrl: string): boolean {\n if (!pathOrUrl || typeof pathOrUrl !== 'string') return false;\n const clean = pathOrUrl.split(/[?#]/)[0] ?? '';\n return /\\.(png|jpe?g|webp|gif|svg|bmp|ico|avif)$/i.test(clean);\n}\n\n/** Get React props of a DOM element */\nfunction getReactProps(el: HTMLElement): Record<string, unknown> | null {\n const key = Object.keys(el).find((k) => k.startsWith('__reactProps'));\n if (!key) return null;\n return (el as unknown as Record<string, unknown>)[key] as Record<string, unknown> | null;\n}\n\n/**\n * Scan DOM for imageAlt spans and enhance them with live rendered images\n */\nexport function scanAndEnhanceImages(): void {\n if (typeof document === 'undefined') return;\n if (isInteractionLocked()) return;\n const origin = getOrigin();\n\n // 1. Rewrite any existing <img> src pointing to 127.0.0.1 to current origin if remote\n if (origin && !origin.includes('127.0.0.1') && !origin.includes('localhost')) {\n const images = document.querySelectorAll<HTMLImageElement>('img[src*=\"/plugins/agy-worker/media\"]');\n for (let i = 0; i < images.length; i++) {\n const img = images[i];\n if (img && img.src.includes('127.0.0.1')) {\n const u = new URL(img.src);\n img.src = `${origin}${u.pathname}${u.search}`;\n }\n }\n }\n\n // 2. Scan markdown containers for imageAlt spans and replace with real images\n const markdownContainers = document.querySelectorAll<HTMLElement>('div[class*=\"_markdown_\"], [data-markdown-variant]');\n for (let i = 0; i < markdownContainers.length; i++) {\n const container = markdownContainers[i];\n if (!container) continue;\n\n const altSpans = container.querySelectorAll<HTMLElement>('span[class*=\"imageAlt\"], span[class*=\"_imageAlt_\"]');\n if (altSpans.length === 0) continue;\n\n // Check React props for original markdown text\n const props = getReactProps(container);\n const mdText = typeof props?.text === 'string' ? props.text : '';\n if (!mdText) continue;\n\n // Extract all image markdown definitions: \n const imgMatches: Array<{ alt: string; target: string }> = [];\n const re = /!\\[(.*?)\\]\\((file:\\/\\/\\/[^\\s)]+|file:\\/\\/[^\\s)]+|[A-Za-z]:[\\\\/][^\\s)]+|\\/home\\/[^\\s)]+|\\/mnt\\/[a-zA-Z]\\/[^\\s)]+|\\\\\\\\wsl\\.localhost\\\\[^\\s)]+)\\)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(mdText)) !== null) {\n imgMatches.push({ alt: m[1] ?? '', target: m[2] ?? '' });\n }\n\n if (imgMatches.length === 0) continue;\n\n for (let j = 0; j < altSpans.length; j++) {\n const span = altSpans[j];\n if (!span || span.dataset.agyEnhanced === 'true') continue;\n\n const altText = (span.textContent ?? '').trim();\n const match = imgMatches.find((im) => im.alt.trim() === altText) ?? imgMatches[j];\n if (!match) continue;\n\n span.dataset.agyEnhanced = 'true';\n const mediaUrl = buildMediaUrl(match.target);\n\n // Create card\n const card = document.createElement('div');\n card.className = 'agy-image-card';\n\n const thumbWrap = document.createElement('div');\n thumbWrap.className = 'agy-image-thumb-wrap';\n thumbWrap.title = `${altText || 'Image'} (\u70B9\u51FB\u5168\u5C4F\u653E\u5927)`;\n\n const img = document.createElement('img');\n img.className = 'agy-image-thumb';\n img.src = mediaUrl;\n img.alt = altText || 'Preview';\n img.loading = 'lazy';\n\n img.onerror = () => {\n // Fall back to original alt text if media loading fails\n card.style.display = 'none';\n span.style.display = '';\n };\n\n thumbWrap.appendChild(img);\n card.appendChild(thumbWrap);\n\n if (altText) {\n const caption = document.createElement('div');\n caption.className = 'agy-image-caption';\n caption.textContent = altText;\n card.appendChild(caption);\n }\n\n thumbWrap.onclick = (e) => {\n e.stopPropagation();\n openLightbox(mediaUrl, altText || 'Image Preview', match.target);\n };\n\n span.style.display = 'none';\n span.parentNode?.insertBefore(card, span);\n }\n }\n\n // 3. Scan for <a> links to file:// images\n const links = document.querySelectorAll<HTMLAnchorElement>('a[href^=\"file://\"]');\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n if (!link || link.dataset.agyLinkEnhanced === 'true') continue;\n\n const href = link.href ?? '';\n if (!isImageFile(href)) continue;\n\n link.dataset.agyLinkEnhanced = 'true';\n const mediaUrl = buildMediaUrl(href);\n const linkText = link.textContent ?? 'Image';\n\n link.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n openLightbox(mediaUrl, linkText, href);\n };\n\n // Add a visual preview indicator\n if (!link.querySelector('.agy-image-link-icon')) {\n const badge = document.createElement('span');\n badge.className = 'agy-image-link-chip agy-image-link-icon';\n badge.textContent = '\uD83D\uDDBC\uFE0F \u9884\u89C8';\n link.appendChild(badge);\n }\n }\n}\n\nlet imageEnhancerDispose: (() => void) | null = null;\nlet imageScanTimer: ReturnType<typeof setTimeout> | null = null;\nlet unbindImageSettle: (() => void) | null = null;\n\nfunction scheduleImageScan(): void {\n if (isInteractionLocked()) return;\n if (imageScanTimer !== null) return;\n imageScanTimer = setTimeout(() => {\n imageScanTimer = null;\n if (isInteractionLocked()) return;\n scanAndEnhanceImages();\n }, 100);\n}\n\nexport function installImageEnhancer(): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {};\n // A plugin reload must DISCONNECT the previous observer instead of stacking\n // one more per reload (the ctx.effect contract main's installers follow).\n imageEnhancerDispose?.();\n injectStyles();\n\n const observer = new MutationObserver(() => {\n scheduleImageScan();\n });\n\n unbindImageSettle = onScrollSettle(() => {\n scheduleImageScan();\n });\n\n const setup = () => {\n if (document.body) {\n observer.observe(document.body, { childList: true, subtree: true });\n scanAndEnhanceImages();\n }\n };\n\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', setup, { once: true });\n } else {\n setup();\n }\n\n const dispose = (): void => {\n observer.disconnect();\n if (unbindImageSettle !== null) {\n unbindImageSettle();\n unbindImageSettle = null;\n }\n if (imageScanTimer !== null) {\n clearTimeout(imageScanTimer);\n imageScanTimer = null;\n }\n window.removeEventListener('DOMContentLoaded', setup);\n if (imageEnhancerDispose === dispose) imageEnhancerDispose = null;\n };\n imageEnhancerDispose = dispose;\n return dispose;\n}\n"],
|
|
5
|
-
"mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAihBT,SAAS,2BAAuC;AACtD,QAAM,OAAQ,WAOX;AACH,MAAI,SAAS,UAAa,SAAS,KAAM,QAAO,MAAM;AAAA,EAAC;AACvD,QAAM,UAAU;AAChB,MAAI,KAAK,KAAK,eAAe,OAAO;AACpC,MAAI,OAAO,MAAM;AAChB,SAAK,KAAK,cAAc,OAAO;AAC/B,OAAG,KAAK;AACR,OAAG,cAAc;AACjB,UAAM,OAAQ,KAAK,QAAQ,KAAK;AAChC,QAAI,SAAS,OAAW,MAAK,YAAY,EAAE;AAAA,EAC5C;AACA,SAAO,MAAM;AACZ,QAAI,SAAS;AAAA,EACd;AACD;;;A3Bj1DO,IAAM,OAAO;AACb,IAAM,SAAS,CAAC,OAAO;AACvB,IAAM,kBAAkB;AAIxB,SAAS,MAAM,KAAoB;AAExC,MAAI,OAAO,CAAC,QAAQ,GAAG,WAAS;AAC9B,UAAM,SAAU,MAAkE;AAClF,UAAM,OAAO,MAAM,WAAW,MAAM,CAAC;AAGrC,UAAM,OAAO,MAAM,cAAc,MAAoC,CAAC;AAAA,EACxE,CAAC;AACD,MAAI,OAAO,CAAC,aAAa,GAAG,WAAS;AACnC,UAAM,QAAS,MAAkD;AACjE,UAAM,OAAO,MAAM,kBAAkB,MAAM,IAAI,yBAAyB,KAAK,MAAM,IAAI,kBAAkB,KAAK,MAAM,IAAI,YAAY,CAAC,CAAC;AAAA,EACxI,CAAC;AACD,aAAW,QAAQ,mBAAoB,KAAI,MAAM,OAAO,sBAAsB,MAAM,IAAI,MAAM,SAAS;AAAA,IACrG,MAAM;AAAA,IAAsB,KAAK;AAAA,EACnC,GAAG,UAAU,CAAC;AAYd,aAAW,QAAQ,eAAgB,KAAI,MAAM,OAAO,sBAAsB,MAAM,IAAI,MAAM,SAAS;AAAA,IACjG,MAAM;AAAA,IAAsB,KAAK,KAAK;AAAA,IAAK,QAAQ;AAAA,EACrD,GAAG,KAAK,SAAS,CAAC;AAClB,MAAI,OAAO,MAAM,yBAAyB,CAAC;AAC3C,MAAI,MAAM,OAAO,QAAQ,MAAM,IAAI,MAAM,SAAS;AAAA,IAChD,MAAM;AAAA,IAAQ,KAAK;AAAA,EACrB,GAAG,cAAc,CAAC;AAIlB,MAAI,MAAM,OAAO,qBAAqB,MAAM,IAAI,MAAM,SAAS;AAAA,IAC7D,MAAM;AAAA,IAAqB,IAAI;AAAA,IAAiB,OAAO;AAAA,IAAI,OAAO,MAAM;AAAA,EAC1E,GAAG,eAAe,CAAC;AACnB,MAAI,OAAO,CAAC,kBAAkB,GAAG,WAAS;AACxC,UAAM,eAAe,CAAC,cAAyE;AAC7F,YAAM,YAAY,MAAM,iBAAiB,aAAa,SAAS;AAC/D,aAAO,EAAE,WAAW,WAAW,UAAU,OAAO,MAAM,MAAM;AAAE,aAAK,UAAU,KAAK,EAAE,MAAM,MAAM,MAAS;AAAA,MAAE,EAAE;AAAA,IAC/G;AACA,UAAM,MAAM,OAAO,2BAA2B,MAAM,MAAM,MAAM,SAAS;AAAA,MACvE,MAAM;AAAA,MAA2B,IAAI;AAAA,MAAwB,OAAO;AAAA,MAAI,QAAQ;AAAA,IAClF,GAAG,UAAU,CAAC;AAEd,UAAM,MAAM,OAAO,2BAA2B,MAAM,MAAM,MAAM,SAAS;AAAA,MACvE,MAAM;AAAA,MAA2B,IAAI;AAAA,MAAqB,OAAO;AAAA,MAAI,QAAQ;AAAA,IAC/E,GAAG,gBAAgB,CAAC;AAAA,EACtB,CAAC;AACH;",
|
|
6
|
-
"names": ["name", "document", "key", "entries", "import_react", "import_react", "zh", "en", "tokens", "error", "import_react", "import_jsx_runtime", "tokens", "setInterval", "import_react", "import_react", "listeners", "notify", "source", "key", "name", "key", "key", "import_react", "import_jsx_runtime", "entries", "current", "import_react", "role", "listeners", "import_jsx_runtime", "styles", "role", "name", "model", "current", "error", "outputTokens", "tokens", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "role", "name", "error", "key", "import_react", "import_react", "own", "notify", "import_jsx_runtime", "styles", "purpose", "role", "import_jsx_runtime", "import_react", "import_jsx_runtime", "styles", "role", "import_react", "name", "import_react", "import_dsh_client_ui_primitives", "key", "name", "import_jsx_runtime", "import_jsx_runtime", "key", "visible", "current", "key", "running", "name", "title", "tr", "h", "current"]
|
|
7
|
-
}
|
|
1
|
+
{"version":3,"file":"client.js","names":["listeners","notify","tr","tr","tokens","tr","listeners","createElement","styles","tr","styles","tr","tr","styles","tr","Fragment","tr","tr","PermissionIconReadOnlyRegular","PermissionIconWorkspaceWriteRegular","PermissionIconFullAccessRegular","tr","DiffBlock","TerminalBlock","tr","react","React","AGY_LOCALE_NS"],"sources":["../src/client/acp-import.ts","../src/client/i18n.ts","../src/identity.ts","../src/client/FusionHistory.tsx","../src/client/FusionCache.tsx","../src/client/agy/brand-icons.ts","../src/client/agy/locales.ts","../src/client/agy/locale.ts","../src/client/agy/AgyConsole.tsx","../src/client/AcpSettingsGuide.tsx","../src/client/studio-brand.ts","../src/host/settings.ts","../src/client/settings-events.ts","../src/client/FusionSettings.tsx","../src/client/FusionPanelIcon.tsx","../src/client/FusionRecovery.tsx","../src/client/status-polling.ts","../src/client/FusionStatus.tsx","../src/client/FusionHint.tsx","../src/client/FusionPermission.tsx","../src/host/route-transport.ts","../src/activity.ts","../src/client/activity-model.ts","../src/client/agy-activity.ts","../src/client/ActivityRows.tsx","../src/client/FusionTool.tsx","../src/client/agy/decisions.ts","../src/client/agy/images.ts","../src/client/agy/toolview.ts","../src/client/index.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react'\nimport type { ConfigForm, ConfigFormSnapshot } from '@deepseek-ai/dsh-client-ui-settings/client'\n\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue }\nexport type JsonObject = Record<string, JsonValue>\n\n/** Fields an import owns; anything else on an existing route (permission, models, …) is kept. */\nexport const IMPORTED_KEYS = ['displayName', 'command', 'args', 'env'] as const\n\nexport const LIST_KEYS = ['agent_servers', 'agentServers', 'agents'] as const\n\nexport const ROUTE_PATTERN = /^[a-z0-9][\\w.-]*$/i\n\nexport interface AgentImportEntry {\n /** Name as written in the source configuration. */\n name: string\n route: string\n /** Whether a configured route of the same id is overwritten (its other fields are kept). */\n replaces: boolean\n profile: JsonObject\n}\n\nexport interface AgentImportIssue {\n name: string\n reason: 'importMissingCommand' | 'importBadArgs' | 'importBadEnv'\n}\n\nexport type AgentImport =\n | { ok: true; entries: AgentImportEntry[]; skipped: AgentImportIssue[] }\n | { ok: false; error: string }\n\nexport type SettingsPathOpView =\n | { op: 'set'; path: string[]; value: JsonValue }\n | { op: 'unset'; path: string[] }\n\nfunction objectOf(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n}\n\n/** Turn a client-side display name into a route id; empty for names with no ASCII letters or digits. */\nexport function routeOf(name: string): string {\n return name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/-{2,}/g, '-')\n .replace(/^[-._]+|[-._]+$/g, '')\n}\n\n/** The server map and whether its keys are already route ids (this plugin's own `agents`). */\nfunction serversOf(document: Record<string, unknown>): { servers: Record<string, unknown>; routed: boolean } {\n for (const key of LIST_KEYS) {\n const list = objectOf(document[key])\n if (list !== undefined) {\n return { servers: list, routed: key === 'agents' }\n }\n }\n return { servers: document, routed: false }\n}\n\nfunction entryOf(name: string, value: unknown):\n | { ok: true; command: string; args: string[]; env: Record<string, string>; displayName?: string }\n | { ok: false; reason: AgentImportIssue['reason'] } {\n const server = objectOf(value)\n const command = server?.command\n if (server === undefined || typeof command !== 'string' || command.trim().length === 0) {\n return { ok: false, reason: 'importMissingCommand' }\n }\n const args = server.args ?? []\n if (!Array.isArray(args) || !args.every(arg => typeof arg === 'string')) {\n return { ok: false, reason: 'importBadArgs' }\n }\n const env = server.env ?? {}\n const envObject = objectOf(env)\n if (envObject === undefined || !Object.values(envObject).every(item => typeof item === 'string')) {\n return { ok: false, reason: 'importBadEnv' }\n }\n const displayName = typeof server.displayName === 'string' ? server.displayName : name\n return {\n ok: true,\n command: command.trim(),\n args: args as string[],\n env: envObject as Record<string, string>,\n displayName,\n }\n}\n\nexport interface ExistingAgentInfo {\n raw?: Record<string, unknown>\n resolved?: Record<string, unknown>\n}\n\nexport function existingRoutesOf(\n existing?:\n | readonly { route: string; user?: unknown; profile?: unknown }[]\n | Record<string, unknown>\n | ReadonlyMap<string, unknown>\n | { value?: unknown; user?: unknown }\n): Map<string, ExistingAgentInfo> {\n const map = new Map<string, ExistingAgentInfo>()\n if (!existing) return map\n\n if (Array.isArray(existing)) {\n for (const item of existing) {\n if (item && typeof item === 'object' && 'route' in item && typeof item.route === 'string') {\n const raw = objectOf((item as any).user)\n const resolved = objectOf((item as any).profile) ?? (raw ? undefined : objectOf(item))\n map.set(item.route, { raw, resolved })\n }\n }\n return map\n }\n\n if (existing instanceof Map) {\n for (const [route, item] of existing.entries()) {\n if (typeof route === 'string') {\n const raw = objectOf((item as any)?.user)\n const resolved = objectOf((item as any)?.profile) ?? (raw ? undefined : objectOf(item))\n map.set(route, { raw, resolved })\n }\n }\n return map\n }\n\n if (typeof existing === 'object' && ('value' in existing || 'user' in existing)) {\n const valObj = objectOf((existing as any).value)\n const userObj = objectOf((existing as any).user)\n const valAgents = objectOf((valObj as any)?.acp?.agents) ?? objectOf((valObj as any)?.agents) ?? {}\n const userAgents = objectOf((userObj as any)?.acp?.agents) ?? objectOf((userObj as any)?.agents) ?? {}\n const routes = new Set([...Object.keys(valAgents), ...Object.keys(userAgents)])\n for (const route of routes) {\n const raw = objectOf((userAgents as any)[route])\n const resolved = objectOf((valAgents as any)[route])\n map.set(route, { raw, resolved })\n }\n return map\n }\n\n if (typeof existing === 'object') {\n for (const [route, item] of Object.entries(existing)) {\n const raw = objectOf((item as any)?.user)\n const resolved = objectOf((item as any)?.profile) ?? (raw ? undefined : objectOf(item))\n map.set(route, { raw, resolved })\n }\n }\n\n return map\n}\n\n/**\n * Parse pasted JSON into importable agents. Routes are derived from the entry names and\n * de-duplicated within the import; a route that already exists is marked as a replacement.\n */\nexport function parseAgentImport(\n text: string,\n existingInput?:\n | readonly { route: string; user?: unknown; profile?: unknown }[]\n | Record<string, unknown>\n | ReadonlyMap<string, unknown>\n | { value?: unknown; user?: unknown }\n): AgentImport {\n let document: unknown\n try {\n document = JSON.parse(text)\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) }\n }\n const root = objectOf(document)\n if (root === undefined) {\n return { ok: false, error: 'expected a JSON object' }\n }\n\n const existing = existingRoutesOf(existingInput)\n const taken = new Set<string>()\n const entries: AgentImportEntry[] = []\n const skipped: AgentImportIssue[] = []\n const { servers, routed } = serversOf(root)\n\n for (const [name, value] of Object.entries(servers)) {\n const parsed = entryOf(name, value)\n if (!parsed.ok) {\n skipped.push({ name, reason: parsed.reason })\n continue\n }\n\n const stem = routed && ROUTE_PATTERN.test(name) ? name : routeOf(name) || 'agent'\n let route = stem\n for (let suffix = 2; taken.has(route); suffix++) {\n route = `${stem}-${suffix}`\n }\n taken.add(route)\n\n const previous = existing.get(route)\n const replaces = previous !== undefined\n const merged = { ...(previous?.resolved ?? {}), ...(previous?.raw ?? {}) }\n const carried = Object.fromEntries(\n Object.entries(merged).filter(\n ([key]) => !(IMPORTED_KEYS as readonly string[]).includes(key)\n )\n )\n\n const serverObj = objectOf(value)\n const hasExplicitDisplayName = typeof serverObj?.displayName === 'string'\n const profile: JsonObject = {\n ...(replaces ? carried : { permission: 'ask' }),\n ...(parsed.displayName === undefined || (parsed.displayName === route && !hasExplicitDisplayName)\n ? {}\n : { displayName: parsed.displayName }),\n command: parsed.command,\n ...(parsed.args.length > 0 ? { args: parsed.args } : {}),\n ...(Object.keys(parsed.env).length > 0 ? { env: parsed.env } : {}),\n }\n\n entries.push({ name, route, replaces, profile })\n }\n\n return { ok: true, entries, skipped }\n}\n\n/** One atomic write storing every imported agent under `acp.agents`. */\nexport function importOpsOf(entries: readonly AgentImportEntry[]): SettingsPathOpView[] {\n return entries.map(entry => ({\n op: 'set',\n path: ['acp', 'agents', entry.route],\n value: entry.profile,\n }))\n}\n\nexport interface AcpFormSnapshot<T = any> {\n status: 'loading' | 'ready' | 'unavailable'\n value: T | undefined\n base: unknown\n user: unknown\n revision: number | undefined\n writable: boolean\n mode?: 'host' | 'memory'\n}\n\nconst DEFAULT_UNAVAILABLE_SNAPSHOT: AcpFormSnapshot = Object.freeze({\n status: 'unavailable',\n value: undefined,\n base: undefined,\n user: undefined,\n revision: undefined,\n writable: false,\n})\n\nlet boundForm: ConfigForm<any> | undefined\nconst formListeners = new Set<() => void>()\nconst notifyFormListeners = () => {\n for (const listener of formListeners) {\n listener()\n }\n}\n\n/** Bind the dsh-fusion ConfigForm instance to an external store readable by React. */\nexport function bindAcpConfigForm(form: ConfigForm<any>): () => void {\n boundForm = form\n notifyFormListeners()\n const unsubscribe = form.subscribe(notifyFormListeners)\n return () => {\n unsubscribe()\n if (boundForm === form) {\n boundForm = undefined\n notifyFormListeners()\n }\n }\n}\n\nexport function subscribeAcpConfigForm(listener: () => void): () => void {\n formListeners.add(listener)\n return () => {\n formListeners.delete(listener)\n }\n}\n\nexport function getAcpConfigFormSnapshot(): AcpFormSnapshot {\n return boundForm ? boundForm.getSnapshot() : DEFAULT_UNAVAILABLE_SNAPSHOT\n}\n\nexport function getAcpConfigForm(): ConfigForm<any> | undefined {\n return boundForm\n}\n\nexport function useAcpConfigForm(): AcpFormSnapshot & { form: ConfigForm<any> | undefined } {\n const snapshot = useSyncExternalStore(\n subscribeAcpConfigForm,\n getAcpConfigFormSnapshot,\n () => DEFAULT_UNAVAILABLE_SNAPSHOT\n )\n return {\n status: snapshot.status,\n value: snapshot.value,\n base: snapshot.base,\n user: snapshot.user,\n revision: snapshot.revision,\n writable: snapshot.writable,\n mode: snapshot.mode,\n form: boundForm,\n }\n}\n","import { useSyncExternalStore } from 'react'\n\n/** The DSH client locale service (`ctx.locale`), used by structure only. */\ninterface LocaleSource { getSnapshot(): { active: string }; subscribe(listener: () => void): () => void }\n\nlet source: LocaleSource | undefined\nconst listeners = new Set<() => void>()\nconst notify = () => { for (const listener of listeners) listener() }\n\n/** Called from the client entry when DSH's locale service is available; follows the user's language setting. */\nexport function bindLocale(next: LocaleSource): () => void {\n source = next\n notify()\n const unsubscribe = next.subscribe(notify)\n return () => { unsubscribe(); if (source === next) { source = undefined; notify() } }\n}\n\nexport type Lang = 'zh' | 'en'\nconst current = (): Lang => {\n const id = source?.getSnapshot().active ?? (typeof navigator === 'undefined' ? 'en' : navigator.language)\n return id.toLowerCase().startsWith('zh') ? 'zh' : 'en'\n}\n\n/** The UI language: Chinese for any zh locale, English otherwise (DSH's own fallback). */\nexport function useLang(): Lang {\n return useSyncExternalStore(listener => { listeners.add(listener); return () => { listeners.delete(listener) } }, current, () => 'en')\n}\n\n/** Pick the text for the active language. */\nexport const tr = (lang: Lang, zh: string, en: string) => lang === 'zh' ? zh : en\n","/**\n * The identity this plugin registers under.\n *\n * Both halves import this module, so the provider route, the model entry and\n * the durable producers keep one spelling. It deliberately has no imports: the\n * browser bundle inlines it and must not pull a Host module in.\n */\n\n/** The HTTP path the panel's own views and actions are served from. */\nexport const FUSION_API_PATH = '/api/fusion'\n\n/**\n * The path this plugin served before the rename. The host keeps answering it\n * so a browser tab holding the previous client bundle keeps working until its\n * next reload; nothing in the current bundle requests it.\n */\nexport const LEGACY_FUSION_API_PATH = '/api/model-fusion'\n\n/**\n * The npm package this project publishes under.\n *\n * Distinct from {@link PLUGIN_NAME}: the package name is the registry identity\n * and the module specifier a profile's patch resolves, while the plugin id is\n * the runtime identity that names the state directory, the bundle patch row and\n * the log marker. Keeping them apart is what lets the package move into a scope\n * without moving anyone's data.\n */\nexport const PACKAGE_NAME = '@sqdr2/dsh-agent-studio-fusion'\n\n/** The plugin id this project registers under, and the name of its state directory. */\nexport const PLUGIN_NAME = 'dsh-agent-studio-fusion'\n\n/** The plugin ids this project used before the renames. */\nexport const LEGACY_PLUGIN_NAME = 'dsh-fusion'\nexport const LEGACY_PLUGIN_NAMES = ['dsh-fusion', 'dsh-model-fusion', 'dsh-agent-studio'] as const\n\n/** Registered provider route for the Fusion model entries. */\nexport const FUSION_PROVIDER = 'dsh-fusion'\n\n/**\n * The model id of the combo every installation starts with.\n *\n * It is a pair id like any other; keeping this exact spelling for the first\n * combo means a durable `model/selection` written before combos existed still\n * names a combo that exists.\n */\nexport const FUSION_MODEL = 'auto'\n\n/**\n * The model ids this provider advertises: `auto` plus one generated\n * `pair-xxxxxxxx` per additional combo. The browser bundle inlines this module,\n * so the namespace shape is fixed here rather than read from a settings\n * document at import time.\n */\nconst FUSION_MODEL_PATTERN = /^(?:auto|pair-[a-z0-9]{6,12})$/\n\n/** Whether a model id names a Fusion combo on this provider. */\nexport const isFusionModel = (model: string | undefined): boolean =>\n typeof model === 'string' && FUSION_MODEL_PATTERN.test(model)\n\n/**\n * The provider route this plugin registered before it was renamed from\n * `dsh-model-fusion`. Sessions created then still name it in their durable\n * `model/selection` event, so reading it as Fusion is what keeps those\n * sessions working; writing it is never correct.\n */\nexport const LEGACY_FUSION_PROVIDER = 'dsh-model-fusion'\n\n/** Whether a provider route belongs to this plugin, under any historical name. */\nexport const isFusionProvider = (provider: string | undefined): boolean =>\n provider === FUSION_PROVIDER || provider === LEGACY_FUSION_PROVIDER || provider === 'dsh-agent-studio-fusion' || provider === 'dsh-agent-studio'\n\n/** Whether a route names a Fusion combo, under either provider spelling. */\nexport const isFusionSelection = (route: { provider?: string; model?: string } | undefined): boolean =>\n isFusionProvider(route?.provider) && isFusionModel(route?.model)\n\n/**\n * How a native model-switch notice names a combo: `provider/model`, or the bare\n * model when both sides share this provider (switching from one combo to\n * another).\n *\n * The notice is a pseudo-change: it compares the virtual menu route with the\n * physical Lead route that actually dispatches, so it would otherwise repeat on\n * every Fusion step. Both provider spellings are accepted because a session\n * that switched to Fusion before the rename carries the old one in its durable\n * log; any combo id matches, since combos are not physical models.\n */\nconst FUSION_SELECTION_LABEL_PATTERN = /(?:(?:dsh-agent-studio-fusion|dsh-agent-studio|dsh-fusion|dsh-model-fusion)\\/|→ )(?:auto|pair-[a-z0-9]{6,12})$/\n\n/** Whether a switch-notice summary describes a Fusion combo as either side. */\nexport const isFusionSelectionLabel = (summary: string | undefined): boolean =>\n typeof summary === 'string' && FUSION_SELECTION_LABEL_PATTERN.test(summary)\n\n/**\n * Whether a route already names a combo under its current provider spelling. A\n * durable intent that fails this is rewritten before the next request is\n * assembled; the legacy spelling is a read-side alias, not a dispatching route.\n */\nexport const isCurrentFusionSelection = (route: { provider?: string; model?: string } | undefined): boolean =>\n route?.provider === FUSION_PROVIDER && isFusionModel(route.model)\n\n/**\n * The provider route of the built-in Antigravity (agy CLI) side.\n *\n * Ported from dsh-agy-worker, MIT License, Copyright (c) 2026 dsh-agy-worker\n * contributors; see docs/ATTRIBUTION-AGY.md. The spelling is load-bearing:\n * durable `model/selection` events, `workerTools` ceilings and the route\n * transport table all name `antigravity` / `agy_tool`, so the port keeps it.\n */\nexport const AGY_PROVIDER = 'antigravity'\n\n/**\n * The HTTP prefix the Antigravity console polls. Unchanged from the standalone\n * plugin, so no route rename is involved and a tab still running the previous\n * bundle keeps answering until it reloads.\n */\nexport const AGY_API_PATH = '/plugins/agy-worker'\n","import { useEffect, useState } from 'react'\nimport type { HistoryView, HistoryTotals } from '../host/history.js'\nimport { tr, useLang, type Lang } from './i18n.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\nexport function formatCompact(tokens: number): string {\n if (tokens < 1000) return `${tokens}`\n if (tokens < 1_000_000) {\n const k = tokens / 1000\n return `${k >= 100 ? Math.round(k) : Number(k.toFixed(1))}K`\n }\n const m = tokens / 1_000_000\n return `${m >= 100 ? Math.round(m) : Number(m.toFixed(m >= 10 ? 1 : 2))}M`\n}\n\nexport function outputTokens(lang: Lang, usage: HistoryTotals, calls: number): string {\n if (!calls) return '—'\n const total = usage.totalOutput\n const hasTotal = Boolean(total && total.reported > 0)\n const hasVisible = Boolean(usage.output && usage.output.reported > 0)\n const hasReasoning = Boolean(usage.reasoning && usage.reasoning.reported > 0)\n\n if (!hasTotal) {\n if (hasVisible) {\n const vis = formatCompact(usage.output.known)\n const cov = usage.output.reported < calls ? tr(lang, `(${usage.output.reported}/${calls} 次有报告)`, ` (${usage.output.reported}/${calls} reported)`) : ''\n return `${tr(lang, `至少 ${vis},推理未提供`, `at least ${vis}, reasoning unavailable`)}${cov}`\n }\n return tr(lang, '未提供', 'not reported')\n }\n\n const totalStr = formatCompact(total!.known)\n const visibleStr = hasVisible ? formatCompact(usage.output.known) : tr(lang, '未提供', 'not reported')\n const reasoningStr = hasReasoning ? formatCompact(usage.reasoning!.known) : tr(lang, '未提供', 'not reported')\n const coverageStr = total!.reported < calls ? tr(lang, `(${total!.reported}/${calls} 次有报告)`, ` (${total!.reported}/${calls} reported)`) : ''\n const splitStr = tr(lang, `(可见 ${visibleStr} + 推理 ${reasoningStr})`, ` (visible ${visibleStr} + reasoning ${reasoningStr})`)\n return `${totalStr} ${splitStr}${coverageStr}`\n}\n\nconst takeoverReason = (lang: Lang, reason: string) => ({\n 'checks-still-failing': tr(lang, '返工后检查仍失败', 'checks still failing after rework'),\n 'worker-step-limit': tr(lang, 'Sidekick 步数用尽', 'Sidekick step limit'),\n 'worker-stalled': tr(lang, 'Sidekick 反复停滞', 'Sidekick stalled repeatedly'),\n} as Record<string, string>)[reason] ?? reason\nconst tokens = (lang: Lang, field: HistoryTotals['input'], calls: number) => !calls ? '—' : !field.reported ? tr(lang, '未提供', 'not reported')\n : `${formatCompact(field.known)} (${field.known.toLocaleString()})${field.reported < calls ? tr(lang, `(${field.reported}/${calls} 次有报告)`, ` (${field.reported}/${calls} reported)`) : ''}`\nconst purpose = (lang: Lang, value: string) => ({ conversation: tr(lang, '任务', 'task'), compaction: tr(lang, '压缩', 'compaction'),\n 'cache-keepalive': tr(lang, '保活', 'keepalive'), 'session-title': tr(lang, '标题', 'title') } as Record<string, string>)[value] ?? value\n/** A dollar figure, or a dash when it could not be computed. */\nexport const money = (value: string | null): string => value === null ? '—' : `$${Number(value).toFixed(2)}`\n/** What still holds the task, so a refusal says why instead of only that it refused. */\nconst blockerText = (lang: Lang, blocker?: string) => ({\n agent: tr(lang, 'Lead 或 Sidekick 仍在运行', 'its Lead or Sidekick is still running'),\n tool: tr(lang, '有原生工具调用尚未返回', 'a native tool call has not returned'),\n job: tr(lang, '有后台任务尚未停止', 'a background job has not stopped'),\n lease: tr(lang, '仍持有工作区写入租约', 'it still holds the workspace write lease'),\n 'foreign-process': tr(lang, '另一个 Host 进程仍在处理它', 'another Host process is still working on it'),\n} as Record<string, string>)[blocker ?? ''] ?? tr(lang, '仍有活动写入方', 'something is still writing to it')\n\nexport function FusionHistory() {\n const lang = useLang()\n const [page, setPage] = useState<HistoryView>()\n const [cursor, setCursor] = useState('')\n const [error, setError] = useState('')\n const [refresh, setRefresh] = useState(0)\n const [loading, setLoading] = useState(false)\n const [confirmingId, setConfirmingId] = useState<string | null>(null)\n const [deletingId, setDeletingId] = useState<string | null>(null)\n const [rowError, setRowError] = useState<{ id: string; message: string } | null>(null)\n const [open, setOpen] = useState(false)\n const [tasksOpen, setTasksOpen] = useState(false)\n\n useEffect(() => {\n const abort = new AbortController()\n setLoading(true); setError('')\n void fetch(`${FUSION_API_PATH}?view=history&cursor=${encodeURIComponent(cursor)}`, { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n .then(async response => {\n if (!response.ok) {\n const body = await response.json().catch(() => null) as { error?: string } | null\n if (cursor && (response.status === 409 || body?.error?.includes('cursor') || body?.error?.includes('Cursor'))) {\n setCursor('')\n return\n }\n throw new Error(body?.error || tr(lang, '历史记录暂时无法读取', 'History is unavailable right now'))\n }\n return response.json() as Promise<HistoryView>\n })\n .then(data => { if (data) setPage(data) })\n .catch(error => { if (!abort.signal.aborted) setError(String(error)) })\n .finally(() => { if (!abort.signal.aborted) setLoading(false) })\n return () => abort.abort()\n }, [cursor, refresh, lang])\n\n const handleDelete = async (taskId: string) => {\n setDeletingId(taskId)\n setRowError(null)\n setError('')\n try {\n const res = await fetch(`${FUSION_API_PATH}?taskId=${encodeURIComponent(taskId)}`, {\n method: 'DELETE',\n credentials: 'same-origin',\n })\n if (!res.ok) {\n const data = await res.json().catch(() => null) as { error?: string; blocker?: string } | null\n const raw = data?.error || ''\n const msg = raw === 'Cannot delete a running task'\n ? tr(lang, `当前任务仍在运行或尚未安全终止,无法清除:${blockerText(lang, data?.blocker)}`,\n `Cannot delete while it still runs: ${blockerText(lang, data?.blocker)}`)\n : (raw || tr(lang, '清除任务失败', 'Failed to delete task'))\n throw new Error(msg)\n }\n setPage(prev => prev ? {\n ...prev,\n totalTasks: Math.max(0, prev.totalTasks - 1),\n tasks: prev.tasks.filter(task => task.id !== taskId),\n } : prev)\n setConfirmingId(null)\n setRowError(null)\n if (cursor === taskId) setCursor('')\n setRefresh(v => v + 1)\n } catch (err) {\n setRowError({ id: taskId, message: err instanceof Error ? err.message : String(err) })\n } finally {\n setDeletingId(null)\n }\n }\n\n return <details\n className=\"fusion-history\"\n aria-label={tr(lang, 'Fusion 历史与统计', 'Fusion history and statistics')}\n data-ud-check=\"fusion-history\"\n {...(open ? { open: true } : {})}\n onToggle={event => {\n if (!event.target || event.target === event.currentTarget) {\n setOpen(event.currentTarget.open)\n }\n }}\n >\n <summary className=\"fusion-history-summary\">\n <span className=\"fusion-history-title\">\n <h3>{tr(lang, '历史与统计', 'History and statistics')}</h3>\n </span>\n <span className=\"fusion-history-indicator\">\n <small>{open ? tr(lang, '点击收起', 'Collapse') : tr(lang, '点击展开', 'Expand')}</small>\n <span className=\"fusion-history-chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div className=\"fusion-history-content\">\n <div className=\"fusion-history-header\">\n <p>{tr(lang, '按实际模型请求汇总,包含任务、压缩、保活及已有标题请求。未报告的用量不算作 0;金额是按公开单价换算的估算,不是账单。',\n 'Totals of actual model requests: tasks, compaction, keepalive and title requests. Unreported usage is not counted as 0; amounts are estimates converted at published rates, not bills.')}</p>\n <button disabled={loading} onClick={() => setRefresh(value => value + 1)}>{tr(lang, '刷新记录', 'Refresh')}</button>\n </div>\n {error && <p role=\"alert\">{error}</p>}{loading && !page && <p role=\"status\">{tr(lang, '正在读取记录…', 'Loading…')}</p>}\n {page && <>\n <div className=\"fusion-history-panel fusion-history-usage\" aria-label={tr(lang, '用量统计', 'Usage statistics')}>\n <h3>{tr(lang, '用量统计', 'Usage statistics')}</h3>\n <p>{tr(lang, `${page.totalTasks} 项任务 · ${page.totals.calls} 次原生请求 · ${page.totals.final} 次用量定稿 · ${page.totals.provisional} 次暂报 · ${page.totals.unreported} 次未提供`,\n `${page.totalTasks} tasks · ${page.totals.calls} native requests · ${page.totals.final} final usage · ${page.totals.provisional} provisional · ${page.totals.unreported} unreported`)}</p>\n <p>{tr(lang, '未缓存输入', 'Uncached input')} {tokens(lang, page.totals.input, page.totals.calls)} · {tr(lang, '缓存读取', 'cache read')} {tokens(lang, page.totals.cacheRead, page.totals.calls)} · {tr(lang, '总输出', 'Total output')} {outputTokens(lang, page.totals, page.totals.calls)} Token</p>\n {page.cost && <p>{tr(lang, `本页按价目表估算 ${money(page.cost.apiEquivalentUsd)},覆盖 ${page.cost.priced} 次请求`,\n `This page estimates ${money(page.cost.apiEquivalentUsd)} at list prices, covering ${page.cost.priced} requests`)}\n {page.cost.savedUsd !== null ? tr(lang, `;比同样的 token 全交给 Lead 省下 ${money(page.cost.savedUsd)}(${page.cost.basis} 次请求可比)`,\n `; that is ${money(page.cost.savedUsd)} less than sending the same tokens to the Lead (${page.cost.basis} requests comparable)`) : ''}\n {tr(lang, '。实际账单仍未知:DSH 不提供每次请求的计费金额。', '. The actual bill is still unknown: DSH reports no per-request billed amount.')}</p>}\n {page.cost && (page.cost.unpriced + page.cost.incomplete + page.cost.unknown) > 0 && <p role=\"status\">\n {tr(lang, `另有 ${page.cost.unpriced + page.cost.incomplete + page.cost.unknown} 次请求未计入金额:${page.cost.unpriced} 次没有价目、${page.cost.incomplete} 次用量不全、${page.cost.unknown} 次无法读取。`,\n `${page.cost.unpriced + page.cost.incomplete + page.cost.unknown} further requests are not priced: ${page.cost.unpriced} with no rate, ${page.cost.incomplete} with incomplete usage, ${page.cost.unknown} unreadable.`)}\n </p>}\n <p>{tr(lang, `Lead 接手改代码 ${page.takeovers?.total ?? 0} 次(${page.takeovers?.tasks ?? 0} 项任务)`, `Lead takeovers: ${page.takeovers?.total ?? 0} (${page.takeovers?.tasks ?? 0} tasks)`)}\n {page.takeovers?.total ? `: ${Object.entries(page.takeovers.reasons).map(([reason, count]) => `${takeoverReason(lang, reason)} ${count}`).join(', ')}` : ''}\n {tr(lang, '。只有 Sidekick 确实完成不了时,程序才会解锁接手。', '. The Host unlocks a takeover only when the Sidekick demonstrably cannot finish.')}</p>\n <div style={{ overflowX: 'auto' }} tabIndex={0} aria-label={tr(lang, '按实际模型统计', 'By actual model')}>\n <table><caption>{tr(lang, '按角色、实际模型和请求用途', 'By role, actual model and purpose')}</caption><thead><tr>\n <th scope=\"col\">{tr(lang, '角色 / 模型', 'Role / model')}</th><th scope=\"col\">{tr(lang, '用途', 'Purpose')}</th><th scope=\"col\">{tr(lang, '请求', 'Requests')}</th><th scope=\"col\">{tr(lang, '总输出 Token(可见 / 推理)', 'Total output tokens (visible / reasoning)')}</th></tr></thead>\n <tbody>{page.groups.map(group => <tr key={JSON.stringify([group.role, group.provider, group.model, group.purpose])}>\n <th scope=\"row\">{group.role === 'lead' ? 'Lead' : 'Sidekick'} · {group.model}<small>{group.provider}</small></th>\n <td>{purpose(lang, group.purpose)}</td><td>{group.calls}</td><td>{outputTokens(lang, group, group.calls)}</td>\n </tr>)}</tbody>\n </table>\n </div>\n <p><small>{tr(lang, `更新于 ${new Date(page.observedAt).toLocaleString()}。供应商内部重试次数未知。`, `Updated ${new Date(page.observedAt).toLocaleString()}. Provider-internal retries are unknown.`)}</small></p>\n </div>\n <details\n className=\"fusion-history-panel fusion-history-tasks\"\n {...(tasksOpen ? { open: true } : {})}\n onToggle={event => setTasksOpen(event.currentTarget.open)}\n >\n <summary className=\"fusion-history-tasks-summary\">\n <span className=\"fusion-history-tasks-title\">\n <strong>{tr(lang, '任务记录', 'Tasks')}</strong>{' '}\n <span className=\"fusion-history-count\">({page.totalTasks})</span>\n </span>\n <span className=\"fusion-history-tasks-indicator\">\n <small>{tasksOpen ? tr(lang, '点击收起', 'Collapse') : tr(lang, '点击展开', 'Expand')}</small>\n <span className=\"fusion-history-tasks-chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div className=\"fusion-history-tasks-content\">\n {!page.tasks.length && <p>{tr(lang, '还没有 Fusion 任务。', 'No Fusion tasks yet.')}</p>}\n <ol>{page.tasks.map(task => <li key={task.id}>\n <div className=\"fusion-history-item-header\">\n <div>\n <strong>{task.title}</strong>\n <small>\n {new Date(task.createdAt).toLocaleString()} · {task.mode === 'completed' ? tr(lang, '已结束', 'finished') : task.phase} · {tr(lang, `${task.usage.calls} 次请求`, `${task.usage.calls} requests`)}{task.takeovers ? tr(lang, ` · Lead 接手 ${task.takeovers} 次`, ` · ${task.takeovers} Lead takeovers`) : ''}\n {task.cost?.priced ? tr(lang, ` · 约 ${money(task.cost.apiEquivalentUsd)}`, ` · about ${money(task.cost.apiEquivalentUsd)}`) : ''}\n {task.cost?.savedUsd !== null && task.cost?.savedUsd !== undefined ? tr(lang, `(省 ${money(task.cost.savedUsd)})`, ` (saved ${money(task.cost.savedUsd)})`) : ''}\n </small>\n </div>\n <div className=\"fusion-history-actions\">\n {confirmingId === task.id ? (\n <>\n <span className=\"fusion-history-confirm-text\">{tr(lang, '确定清除?', 'Delete?')}</span>\n <button\n type=\"button\"\n disabled={Boolean(deletingId)}\n onClick={() => void handleDelete(task.id)}\n >\n {deletingId === task.id ? tr(lang, '正在清除…', 'Deleting…') : tr(lang, '确认', 'Confirm')}\n </button>\n <button\n type=\"button\"\n className=\"fusion-btn-subtle\"\n disabled={Boolean(deletingId)}\n onClick={() => { setConfirmingId(null); setRowError(null) }}\n >\n {tr(lang, '取消', 'Cancel')}\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n disabled={Boolean(deletingId)}\n onClick={() => { setError(''); setRowError(null); setConfirmingId(task.id) }}\n aria-label={tr(lang, `清除任务 ${task.title}`, `Delete task ${task.title}`)}\n >\n {tr(lang, '清除记录', 'Clear')}\n </button>\n )}\n </div>\n </div>\n {rowError?.id === task.id && (\n <p role=\"alert\" className=\"fusion-history-row-error\" style={{ color: 'var(--dsw-alias-state-error-primary, #e5484d)', margin: '6px 0 0', fontSize: '12px' }}>\n {rowError.message}\n </p>\n )}\n <details><summary>{tr(lang, '记录详情', 'Details')}</summary><p>{tr(lang, '任务', 'Task')}: {task.id}</p><p>{tr(lang, '会话', 'Session')}: {task.sessionId}</p>\n <p>{tr(lang, `验证状态:${task.verification}。历史运行状态不代表当前仍在执行。`, `Verification: ${task.verification}. A recorded state does not mean it is still running.`)}</p>\n <p>{tr(lang, '输入', 'Input')} {tokens(lang, task.usage.input, task.usage.calls)} · {tr(lang, '缓存读取', 'cache read')} {tokens(lang, task.usage.cacheRead, task.usage.calls)} · {tr(lang, '总输出', 'Total output')} {outputTokens(lang, task.usage, task.usage.calls)} Token</p>\n </details>\n </li>)}</ol>\n <div className=\"fusion-actions\"><button disabled={loading || !cursor} onClick={() => setCursor('')}>{tr(lang, '最新记录', 'Newest')}</button>\n <button disabled={loading || !page.nextCursor} onClick={() => setCursor(page.nextCursor!)}>{tr(lang, '更早记录', 'Older')}</button></div>\n </div>\n </details>\n </>}\n </div>\n </details>\n}\n","import { useEffect, useState } from 'react'\nimport { tr, useLang, type Lang } from './i18n.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\ntype Mode = 'auto' | 'on' | 'off'\ninterface Totals { waits: number; waitHits: number; pings: number; pingHits: number; pingTokens: number; pingOutputTokens?: number; keptWarmTokens: number; resentTokens: number }\ninterface CacheModel {\n provider: string; model: string; role?: 'lead' | 'worker'\n mode: Mode; intervalSeconds: number\n modeSource: 'user' | 'pair' | 'role' | 'route' | 'family' | 'generic'\n intervalSource: 'user' | 'learned' | 'route' | 'family' | 'generic'\n setting: { mode?: Mode; intervalSeconds?: number }\n defaults: { mode: Mode; intervalSeconds: number; source: string\n family?: { label: string; lifetime: { zh: string; en: string }; discount: string; docs: string }\n route?: { label: string; reason: { zh: string; en: string } } }\n totals: Totals | null; learnedIntervalSeconds: number | null; suggestion: number | null\n recent: { gapSeconds: number; ping: boolean; hit: boolean }[]\n}\n\nconst tokens = (value: number) => value >= 1e6 ? `${(value / 1e6).toFixed(1)}M` : value >= 1e3 ? `${Math.round(value / 1e3)}k` : String(value)\nconst minutes = (seconds: number) => seconds % 60 ? `${(seconds / 60).toFixed(1)} min` : `${seconds / 60} min`\nconst modeName = (lang: Lang, mode: Mode) => ({ auto: tr(lang, '自动', 'Auto'), on: tr(lang, '开启', 'On'), off: tr(lang, '关闭', 'Off') })[mode]\n\nfunction modeSource(lang: Lang, row: CacheModel): string {\n switch (row.modeSource) {\n case 'user': return tr(lang, '你的设置', 'your setting')\n case 'pair': return tr(lang, '旧版组合设置', 'older pair setting')\n case 'role': return tr(lang, 'Sidekick 默认关闭(它很少长时间等待)', 'Sidekick default off (it rarely waits long)')\n case 'route': return `${row.defaults.route!.label}: ${lang === 'zh' ? row.defaults.route!.reason.zh : row.defaults.route!.reason.en}`\n case 'family': return tr(lang, `${row.defaults.family!.label} 官方默认`, `${row.defaults.family!.label} documented default`)\n default: return tr(lang, '通用默认', 'generic default')\n }\n}\nfunction intervalSource(lang: Lang, row: CacheModel): string {\n if (row.intervalSource === 'user') return tr(lang, '你的设置', 'your setting')\n if (row.intervalSource === 'learned') return tr(lang, '自动学习:保活多次未命中,已缩短', 'learned: pings kept missing, shortened')\n return tr(lang, '默认', 'default')\n}\n\nfunction ModelCard({ row, onSaved }: { row: CacheModel; onSaved(): void }) {\n const lang = useLang()\n const [interval, setInterval] = useState(String(row.setting.intervalSeconds ? row.setting.intervalSeconds / 60 : ''))\n const [busy, setBusy] = useState(false), [error, setError] = useState<string>()\n const save = async (body: Record<string, unknown>) => {\n setBusy(true); setError(undefined)\n try {\n const response = await fetch(FUSION_API_PATH, { method: 'POST', credentials: 'same-origin', headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ action: 'cache-setting', provider: row.provider, model: row.model, ...body }) })\n const result = await response.json() as { error?: string }\n if (!response.ok) throw new Error(result.error ?? tr(lang, '保存失败', 'Save failed'))\n onSaved()\n } catch (reason) { setError(reason instanceof Error ? reason.message : String(reason)) }\n finally { setBusy(false) }\n }\n const t = row.totals\n const family = row.defaults.family\n return <div className=\"fusion-cache-model\">\n <strong>{row.model}<small>{row.provider}{row.role ? ` · ${row.role === 'lead' ? 'Lead' : 'Sidekick'}` : ''}</small></strong>\n <p>{tr(lang, '现在', 'Now')}: <b>{modeName(lang, row.mode)}</b>{row.mode !== 'off' && <>{tr(lang, ',每 ', ', every ')}<b>{minutes(row.intervalSeconds)}</b>{tr(lang, ' 续一次', '')}</>}\n <small>{tr(lang, '开关来源', 'Mode')}: {modeSource(lang, row)} · {tr(lang, '间隔来源', 'Interval')}: {intervalSource(lang, row)}</small></p>\n {family && <p><small>{tr(lang, '官方文档', 'Documented')}: {lang === 'zh' ? family.lifetime.zh : family.lifetime.en};{tr(lang, '缓存价约为全价', 'cached price ≈')} {family.discount} · <a href={family.docs} target=\"_blank\" rel=\"noreferrer\">{tr(lang, '来源', 'source')}</a></small></p>}\n <div className=\"fusion-cache-controls\">\n <label>{tr(lang, '保活', 'Keepalive')}<select aria-label={`${row.model} keepalive`} disabled={busy} value={row.setting.mode ?? ''}\n onChange={event => { void save({ mode: event.target.value || null, intervalSeconds: row.setting.intervalSeconds ?? null }) }}>\n <option value=\"\">{tr(lang, `默认(${modeName(lang, row.defaults.mode)})`, `Default (${modeName(lang, row.defaults.mode)})`)}</option>\n <option value=\"auto\">{tr(lang, '自动:该模型返回过缓存命中后才开启', 'Auto: only after this model reports cache hits')}</option>\n <option value=\"on\">{tr(lang, '开启', 'On')}</option>\n <option value=\"off\">{tr(lang, '关闭(按请求次数计费的套餐选这个)', 'Off (choose for plans billed per request)')}</option>\n </select></label>\n <label>{tr(lang, '间隔(分钟)', 'Interval (min)')}<input type=\"number\" min=\"1\" max=\"59\" step=\"0.5\" disabled={busy} value={interval}\n placeholder={String(+(row.intervalSeconds / 60).toFixed(2))} onChange={event => setInterval(event.target.value)}\n onBlur={() => { if (interval !== String(row.setting.intervalSeconds ? row.setting.intervalSeconds / 60 : ''))\n void save({ mode: row.setting.mode ?? null, intervalSeconds: interval ? Math.round(Number(interval) * 60) : null }) }} /></label>\n <button type=\"button\" disabled={busy || (!row.setting.mode && !row.setting.intervalSeconds)} onClick={() => { setInterval(''); void save({ reset: true }) }}>{tr(lang, '恢复默认', 'Reset')}</button>\n </div>\n {row.suggestion && <p role=\"status\">{tr(lang, `观察到等待 ${minutes(row.suggestion)} 以上缓存仍然命中,可以把间隔放宽到 ${minutes(row.suggestion)}(不会自动修改)。`,\n `Cache still hit after waits over ${minutes(row.suggestion)}; you can lengthen the interval to ${minutes(row.suggestion)} (not changed automatically).`)}</p>}\n {t ? <p>{tr(lang, '效果', 'Effect')}: {tr(lang, `等待后命中 ${t.waitHits}/${t.waits} 次`, `hit after ${t.waitHits}/${t.waits} waits`)}{t.waits ? ` (${Math.round(100 * t.waitHits / t.waits)}%)` : ''};\n {tr(lang, ` 保活 ${t.pings} 次(${t.pingHits} 次命中,读取 ${tokens(t.pingTokens)} token,多为缓存价${t.pingOutputTokens != null ? `,输出 ${tokens(t.pingOutputTokens)} token` : ''});`, ` ${t.pings} pings (${t.pingHits} hit, ${tokens(t.pingTokens)} tokens read, mostly at cache price${t.pingOutputTokens != null ? `, ${tokens(t.pingOutputTokens)} output` : ''}); `)}\n {tr(lang, ` 等待后仍从缓存读取 ${tokens(t.keptWarmTokens)} token,按全价重发 ${tokens(t.resentTokens)} token。`, ` after waits ${tokens(t.keptWarmTokens)} tokens served from cache, ${tokens(t.resentTokens)} resent at full price.`)}\n {t.pings >= 5 && t.pingHits / t.pings < 0.5 && <b>{tr(lang, ' 保活大多没命中,建议关闭或缩短间隔。', ' Most pings missed: turn it off or shorten the interval.')}</b>}</p>\n : <p>{tr(lang, '还没有数据:Lead 等待 Sidekick 之后才会产生记录。', 'No data yet: records appear after the Lead waits for the Sidekick.')}</p>}\n {!!row.recent.length && <p><small>{tr(lang, '最近', 'Recent')}: {row.recent.map((item, i) => <span key={i}>{item.ping ? '↻' : ''}{minutes(item.gapSeconds)}{item.hit ? ' ✓' : ' ✗'}{i < row.recent.length - 1 ? ' · ' : ''}</span>)}</small></p>}\n {error && <p role=\"alert\">{error}</p>}\n </div>\n}\n\n/** Per-model cache keepalive: what applies and why, the documented default, and what was observed. */\nexport function FusionCache({ refresh }: { refresh: number }) {\n const lang = useLang()\n const [rows, setRows] = useState<CacheModel[]>(), [checked, setChecked] = useState<string>(), [error, setError] = useState<string>()\n const [reload, setReload] = useState(0)\n const [open, setOpen] = useState(false)\n useEffect(() => {\n const abort = new AbortController()\n void fetch(`${FUSION_API_PATH}?view=cache`, { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n .then(async response => { if (!response.ok) throw new Error(tr(lang, '无法读取缓存设置', 'Cannot read cache settings')); return response.json() as Promise<{ checked: string; models: CacheModel[] }> })\n .then(value => { setRows(value.models); setChecked(value.checked) })\n .catch(reason => { if (!abort.signal.aborted) setError(String(reason)) })\n return () => abort.abort()\n }, [refresh, reload, lang])\n return <details\n className=\"fusion-cache\"\n aria-label={tr(lang, '缓存保活', 'Cache keepalive')}\n data-ud-check=\"fusion-cache\"\n {...(open ? { open: true } : {})}\n onToggle={event => {\n if (!event.target || event.target === event.currentTarget) {\n setOpen(event.currentTarget.open)\n }\n }}\n >\n <summary className=\"fusion-cache-summary\">\n <span className=\"fusion-cache-title\">\n <h3>{tr(lang, '缓存保活', 'Cache keepalive')}</h3>\n </span>\n <span className=\"fusion-cache-indicator\">\n <small>{open ? tr(lang, '点击收起', 'Collapse') : tr(lang, '点击展开', 'Expand')}</small>\n <span className=\"fusion-cache-chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div className=\"fusion-cache-content\">\n <p>{tr(lang, 'Lead 等 Sidekick 干活时可能要等几分钟,模型的输入缓存过期后,下一次请求会按全价重读整段对话。保活在等待期间定时把 Lead 上一次的请求原样再发一遍,末尾只加一句“Reply OK”,模型只回一个 OK,缓存就不会过期。默认值来自各家官方文档,每个模型都可以单独调整。',\n 'While the Lead waits for the Sidekick, the model\\'s prompt cache can expire and the next request re-reads the whole conversation at full price. Keepalive resends the Lead\\'s previous request at intervals with only “Reply OK” appended; the model answers OK and the cache stays warm. Defaults come from each provider\\'s documentation; every model can be adjusted.')}</p>\n {checked && <p><small>{tr(lang, `官方默认值核对日期:${checked}。`, `Documented defaults checked on ${checked}.`)}</small></p>}\n {error && <p role=\"alert\">{error}</p>}\n {rows?.map(row => <ModelCard key={`${row.provider}/${row.model}/${row.setting.mode ?? ''}/${row.setting.intervalSeconds ?? ''}`} row={row} onSaved={() => setReload(value => value + 1)} />)}\n </div>\n </details>\n}\n","// Brand and UI icon paths used by the Antigravity console.\n//\n// Ported from dsh-agy-worker (`src/client/brand-icons.ts`), MIT License,\n// Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n// dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n// docs/ATTRIBUTION-AGY.md.\nexport const BRAND_PATHS = {\n gemini: \"M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81\",\n claude: \"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z\",\n openai: \"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\",\n chrome: \"M12 0C8.21 0 4.831 1.757 2.632 4.501l3.953 6.848A5.454 5.454 0 0 1 12 6.545h10.73c-.911-3.794-4.321-6.545-8.384-6.545zM1.986 6.368A11.95 11.95 0 0 0 0 12c0 6.096 4.542 11.134 10.428 11.89l3.953-6.848a5.454 5.454 0 0 1-5.836-2.585L1.986 6.368zm14.569 5.632a5.454 5.454 0 0 1-1.127 3.327l-5.365 9.293C10.784 24.873 11.385 25 12 25c6.627 0 12-5.373 12-12 0-.341-.014-.679-.042-1.013H12v.013h4.555z\",\n edge: \"M23.95 13.91c-.13-1.68-.78-3.23-1.83-4.47-.98-1.16-2.29-1.99-3.76-2.4-.64-.18-1.3-.28-1.97-.29-2.09-.03-4.08.74-5.63 2.16-1.57 1.44-2.48 3.44-2.55 5.56.08 1.47.66 2.87 1.66 3.96.99 1.09 2.37 1.76 3.86 1.88 1.34.1 2.69-.26 3.82-1.02.44-.3.84-.66 1.18-1.07l2.87 2.87c-1.35 1.44-3.04 2.51-4.92 3.12-1.89.6-3.9.7-5.84.28-2.67-.58-5.06-2.06-6.75-4.17-1.68-2.12-2.59-4.78-2.57-7.51.02-2.85 1.04-5.6 2.89-7.77C6.88 4.31 9.53 2.85 12.44 2.38c2.19-.35 4.43-.2 6.55.45 2.13.65 4.04 1.83 5.58 3.44l-2.9 2.9c-1.12-1.19-2.52-2.06-4.07-2.54-1.55-.47-3.19-.57-4.78-.3-2.14.36-4.08 1.45-5.46 3.06-1.38 1.62-2.13 3.69-2.13 5.84 0 2.05.69 4.04 1.98 5.62 1.28 1.58 3.1 2.64 5.12 3.01 1.47.27 2.99.17 4.42-.31 1.43-.48 2.7-1.33 3.69-2.46l-4.13-4.13c-.37.28-.8.48-1.26.58-.46.1-.94.09-1.4-.02-.57-.14-1.08-.47-1.46-.93-.38-.46-.59-1.04-.59-1.64.03-.84.4-1.63 1.03-2.2.63-.57 1.45-.88 2.3-.87.87.01 1.7.35 2.32.95.62.61.98 1.43 1 2.3h4.67z\",\n} as const\n\nexport const BRAND_COLORS = {\n gemini: '#8E75B2',\n claude: '#D97757',\n openai: '#10a37f',\n chrome: '#4285F4',\n edge: '#0078D7',\n} as const\n\nexport const UI_PATHS = {\n trash: 'M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M10 11v6M14 11v6',\n plus: 'M12 5v14M5 12h14',\n refresh: 'M21.5 2v6h-6M2.5 22v-6h6M2.5 11.5a10 10 0 0 1 17.5-4.5l1.5 2M21.5 12.5a10 10 0 0 1-17.5 4.5l-1.5-2',\n star: 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z',\n mail: 'M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2zM22 6l-10 7L2 6',\n globe: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zM2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z',\n zap: 'M13 2L3 14h9l-1 8 10-12h-9l1-8z',\n chevronDown: 'M6 9l6 6 6-6',\n chevronUp: 'M18 15l-6-6-6 6',\n check: 'M20 6L9 17l-5-5',\n x: 'M18 6L6 18M6 6l12 12',\n externalLink: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3',\n alert: 'M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0zM12 9v4M12 17h.01',\n move: 'M9 5h.01M9 12h.01M9 19h.01M15 5h.01M15 12h.01M15 19h.01',\n arrowUp: 'M12 19V5M5 12l7-7 7 7',\n arrowDown: 'M12 5v14M19 12l-7 7-7-7',\n power: 'M18.36 6.64a9 9 0 1 1-12.73 0M12 2v10',\n flame: 'M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z',\n} as const\n\n","/**\n * Native DSH locale dictionaries for the Antigravity console.\n *\n * Ported from dsh-agy-worker (`src/client/locales.ts`), MIT License,\n * Copyright (c) 2026 dsh-agy-worker contributors; see docs/ATTRIBUTION-AGY.md.\n * The namespace id and every key are unchanged, so translated copy and the\n * Host-facing registrations that name the namespace keep working.\n */\nexport const NS = 'agy-worker'\n\n/** Simplified Chinese is preserved as the original UI language and key source. */\nexport const zh = {\n 'section.label': 'Antigravity',\n 'code.title': '代码', 'code.inspect': '检查',\n 'tv.command': '命令', 'tv.write': '写入', 'tv.edit': '编辑', 'tv.read': '读取', 'tv.search': '搜索', 'tv.webSearch': '网页搜索', 'tv.list': '列表', 'tv.delete': '删除', 'tv.tool': '工具',\n 'tv.noOutput': '(无输出)', 'tv.noMatches': '(无匹配)', 'tv.noChanges': '(无文本变更)', 'tv.emptyDir': '(空目录)', 'tv.noDetail': '(无详情)',\n 'tv.hint.expandInspect': '点击展开 · 右键检查', 'tv.hint.collapseInspect': '点击收起 · 右键检查', 'tv.hint.expand': '点击展开', 'tv.hint.collapse': '点击收起',\n 'tv.diffMore': '… 其余 {count} 行未渲染',\n 'code.copy': '复制', 'code.copied': '已复制',\n 'console.title': 'Antigravity 管理控制台',\n 'status.ready': '就绪', 'status.needsAuth': '待认证', 'status.loading': '正在加载 Antigravity 状态...',\n 'status.authRequired': '需重新登录', 'account.setActive': '设为当前使用', 'account.settingActive': '切换中', 'account.activeSet': '已切换当前使用账号', 'account.activeSetFailed': '该账号当前不可用(冷却或需重新登录)', 'status.proxy': '代理', 'status.inUse': '当前使用',\n 'account.add': '添加 Google 账号', 'account.aliasDefault': '备用 Google 账号 {number}', 'account.defaultAlias': '主账号(系统登录)',\n 'account.proxyPlaceholder': '专属代理 URL(如 http://127.0.0.1:7890,留空则继承全局)', 'account.aliasPlaceholder': '账号别名(例如:备用账号 2)', 'account.removeTitle': '移除此账号',\n 'aria.aliasInput': '账号别名', 'aria.proxyInput': '专属代理 URL', 'aria.authCodeInput': '授权码或回调 URL', 'aria.closeToast': '关闭提示',\n 'account.details': '明细', 'account.collapse': '收起',\n 'account.expandOthers': '展开查看 Claude & GPT-OSS 模型额度', 'account.collapseOthers': '收起 Claude & GPT-OSS 模型额度', 'account.otherModels': 'Claude / GPT 额度',\n 'account.sync': '同步', 'account.syncing': '同步中', 'account.syncTitle': '刷新此账号(换号后立即同步 email / 额度 / 模型)',\n 'account.models': '单模型明细:', 'account.cooldown': '部分模型限流中,已自动切换账号', 'account.clearCooldown': '清除冷却',\n 'account.localCooldown': ' · 本地冷却中', 'account.removed': '已移除账号:{alias}',\n 'quota.fiveHour': '5 小时额度', 'quota.weekly': '周额度', 'quota.refreshed': '额度已刷新', 'quota.windowReset': '已重置 · 可用',\n 'proxy.button': '代理', 'proxy.placeholder': '专属代理 URL(如:http://127.0.0.1:7890;留空则使用全局)',\n 'proxy.save': '保存', 'proxy.saved': '代理已保存', 'cancel': '取消',\n 'auth.openBrowser': '打开浏览器登录', 'auth.openingBrowser': '正在打开浏览器...',\n 'auth.browserOpened': '浏览器已打开 Google 授权页,完成授权后将自动同步',\n 'auth.browserManual': '无法自动打开浏览器,请点击下方链接手动完成授权',\n 'auth.startFailed': '无法启动 Google 授权。请检查网络或代理配置。', 'auth.networkHint': '请检查网络或代理配置',\n 'auth.activated': '账号已激活入池', 'auth.failed': '授权失败', 'auth.added': '成功添加并激活 Google 账号',\n 'auth.codeFailed': '授权码验证失败', 'auth.exchanging': '正在验证授权并激活账号,请稍候...',\n 'auth.waiting': '等待浏览器中完成 Google 授权,成功后将自动激活。',\n 'auth.openManual': '若浏览器未打开,请点击此处手动打开 Google 登录页',\n 'auth.pasteHint': '未完成自动回调时,可粘贴授权码或回调 URL:',\n 'auth.codePlaceholder': '授权码或 http://localhost:51121/oauth-callback?code=... 完整链接',\n 'auth.activate': '手动激活', 'auth.activating': '验证激活中...',\n 'auth.code.browser_manual': '无法自动打开浏览器,请使用下方链接手动授权。', 'auth.code.callback_failed': '授权回调失败。请重新开始授权。',\n 'auth.code.no_active_flow': '当前没有进行中的授权流程。', 'auth.code.invalid_code': '无法识别授权码。请粘贴授权码或完整回调 URL。',\n 'auth.code.invalid_state': '授权链接不属于当前流程或已过期。请重新开始授权。', 'auth.code.exchange_failed': '授权验证失败。请重新开始授权。',\n 'auth.code.primary_activated': '主账号已登录。', 'auth.code.account_activated': '账号已添加并激活。', 'auth.code.missing_code': '请输入授权码。',\n 'auth.code.request_failed': '请求未完成。请重试。', 'api.genericError': '操作未完成。请重试。',\n 'duration.day': '天', 'duration.hour': '小时', 'duration.minute': '分钟',\n 'permission.label': '权限模式:', 'permission.plan': 'plan(只读)', 'permission.acceptEdits': 'accept-edits(改代码)', 'permission.skip': 'skip(自动批准;AGY 内部保护仍生效)',\n 'effort.label': '思考强度:', 'effort.auto': 'auto', 'effort.low': 'low', 'effort.medium': 'medium', 'effort.high': 'high',\n 'pool.label': '号池调度:', 'pool.sequential': '顺次耗尽', 'pool.roundRobin': '轮询均衡',\n 'models.label': '模型显示:', 'models.empty': '模型目录还没有可用模型,发一次对话或点“刷新额度”后再来管理',\n 'models.hint': '点击切换显示/隐藏;关闭的模型不在模型选择器中列出,进行中的会话不受影响。',\n 'header.refreshQuota': '刷新额度', 'header.refreshing': '刷新中',\n 'console.close': '关闭(Esc)', 'header.badgeTitle': 'Antigravity:{count} 个账号已就绪 · 点击打开控制台', 'header.badgeLoading': 'Antigravity · 点击打开控制台',\n 'account.type.agy': 'Google Antigravity (CLI / OAuth)',\n 'account.loginType': '登录方式:',\n 'account.dragHandle': '拖拽调整优先级',\n 'account.moveUp': '上移优先级',\n 'account.moveDown': '下移优先级',\n 'account.reordered': '账号优先级顺序已更新',\n 'account.collapseAll': '全部折叠',\n 'account.expandAll': '全部展开',\n 'account.cardCollapse': '收起详情',\n 'account.cardExpand': '展开详情',\n 'account.draggingTarget': '放置至此成为优先级 #{num}',\n 'account.dragBanner': '正在调整优先级:将【{alias}】移动至 #{num}',\n 'account.dragHint': '拖拽卡片可实时调整调度优先级',\n 'account.enable': '启用',\n 'account.disable': '停用',\n 'account.enableTitle': '启用此账号(加入自动切号与调度)',\n 'account.disableTitle': '停用此账号(切号与调度时跳过)',\n 'account.enabledToast': '已启用账号:{alias}',\n 'account.disabledToast': '已停用账号:{alias}',\n 'status.disabled': '已停用',\n 'header.warmup': '一键预热',\n 'header.warmingUp': '预热中',\n 'account.warmup': '预热',\n 'account.warmingUp': '预热中',\n 'account.warmupTitle': '预热该账号(向 Google 发送极小探活请求,提前激活 7 天周配额计时器)',\n 'warmup.success': '账号预热成功',\n 'warmup.allSuccess': '一键预热任务已完成',\n 'warmup.skipped': '当前账号或模型处于冷却中,无需预热',\n 'config.autoWarmup': '7天周配额自动预热',\n 'config.autoWarmupDesc': '周配额到达重置时间或冷启动时自动唤醒 1 次启动新周期',\n} as const\n\nexport type AgyLocaleKey = keyof typeof zh\nexport type AgyDictionary = Record<AgyLocaleKey, string>\n\nexport const en: AgyDictionary = {\n 'section.label': 'Antigravity', 'console.title': 'Antigravity Management Console',\n 'code.title': 'Code', 'code.inspect': 'Inspect',\n 'tv.command': 'Command', 'tv.write': 'Write', 'tv.edit': 'Edit', 'tv.read': 'Read', 'tv.search': 'Search', 'tv.webSearch': 'Web Search', 'tv.list': 'List', 'tv.delete': 'Delete', 'tv.tool': 'Tool',\n 'tv.noOutput': '(no output)', 'tv.noMatches': '(no matches)', 'tv.noChanges': '(no textual changes)', 'tv.emptyDir': '(empty directory)', 'tv.noDetail': '(no detail)',\n 'tv.hint.expandInspect': 'Click to expand · right-click to inspect', 'tv.hint.collapseInspect': 'Click to collapse · right-click to inspect', 'tv.hint.expand': 'Click to expand', 'tv.hint.collapse': 'Click to collapse',\n 'tv.diffMore': '… {count} more lines not rendered',\n 'code.copy': 'Copy', 'code.copied': 'Copied',\n 'status.ready': 'Ready', 'status.needsAuth': 'Authentication required', 'status.loading': 'Loading Antigravity status...',\n 'status.authRequired': 'Sign in again required', 'account.setActive': 'Set as in use', 'account.settingActive': 'Switching...', 'account.activeSet': 'Active account switched', 'account.activeSetFailed': 'Account not currently eligible (cooldown or auth required)', 'status.proxy': 'Proxy', 'status.inUse': 'In use',\n 'account.add': 'Add Google account', 'account.aliasDefault': 'Backup Google account {number}', 'account.defaultAlias': 'Primary account (system sign-in)',\n 'account.proxyPlaceholder': 'Dedicated proxy URL (e.g. http://127.0.0.1:7890; leave blank to inherit global)', 'account.aliasPlaceholder': 'Account alias (for example: Backup account 2)', 'account.removeTitle': 'Remove this account',\n 'aria.aliasInput': 'Account alias', 'aria.proxyInput': 'Dedicated proxy URL', 'aria.authCodeInput': 'Authorization code or callback URL', 'aria.closeToast': 'Dismiss notification',\n 'account.details': 'Details', 'account.collapse': 'Collapse',\n 'account.expandOthers': 'Expand Claude & GPT-OSS quotas', 'account.collapseOthers': 'Collapse Claude & GPT-OSS quotas', 'account.otherModels': 'Claude / GPT quotas',\n 'account.sync': 'Sync', 'account.syncing': 'Syncing...', 'account.syncTitle': 'Refresh this account (sync email, quota, and models after switching accounts)',\n 'account.models': 'Per-model details:', 'account.cooldown': 'Some models are rate-limited; the account was switched automatically', 'account.clearCooldown': 'Clear cooldown',\n 'account.localCooldown': ' · local cooldown active', 'account.removed': 'Account removed: {alias}',\n 'quota.fiveHour': '5-hour quota', 'quota.weekly': 'Weekly quota', 'quota.refreshed': 'Quota refreshed', 'quota.windowReset': 'Reset · available',\n 'proxy.button': 'Proxy', 'proxy.placeholder': 'Dedicated proxy URL (for example: http://127.0.0.1:7890; leave blank to use the global proxy)',\n 'proxy.save': 'Save', 'proxy.saved': 'Proxy saved', 'cancel': 'Cancel',\n 'auth.openBrowser': 'Open browser to sign in', 'auth.openingBrowser': 'Opening browser...',\n 'auth.browserOpened': 'The Google authorization page opened in your browser and will sync automatically after authorization',\n 'auth.browserManual': 'The browser could not be opened automatically; use the link below to authorize manually',\n 'auth.startFailed': 'Could not start Google authorization. Check your network or proxy configuration.', 'auth.networkHint': 'Check your network or proxy configuration',\n 'auth.activated': 'Account activated in the pool', 'auth.failed': 'Authorization failed', 'auth.added': 'Google account added and activated',\n 'auth.codeFailed': 'Authorization code validation failed', 'auth.exchanging': 'Verifying authorization and activating the account; please wait...',\n 'auth.waiting': 'Complete Google authorization in the browser. The account will activate automatically.',\n 'auth.openManual': 'If the browser did not open, click here to open the Google sign-in page manually',\n 'auth.pasteHint': 'If the automatic callback did not complete, paste the authorization code or callback URL:',\n 'auth.codePlaceholder': 'Authorization code or full http://localhost:51121/oauth-callback?code=... URL',\n 'auth.activate': 'Activate manually', 'auth.activating': 'Verifying and activating...',\n 'auth.code.browser_manual': 'The browser could not be opened automatically; use the link below to authorize manually.', 'auth.code.callback_failed': 'The authorization callback failed. Start authorization again.',\n 'auth.code.no_active_flow': 'There is no active authorization flow.', 'auth.code.invalid_code': 'The authorization code was not recognized. Paste the code or full callback URL.',\n 'auth.code.invalid_state': 'The authorization link does not belong to this flow or has expired. Start authorization again.', 'auth.code.exchange_failed': 'Authorization verification failed. Start authorization again.',\n 'auth.code.primary_activated': 'Primary account signed in.', 'auth.code.account_activated': 'Account added and activated.', 'auth.code.missing_code': 'Enter an authorization code.',\n 'auth.code.request_failed': 'The request did not complete. Try again.', 'api.genericError': 'The operation did not complete. Try again.',\n 'duration.day': 'd', 'duration.hour': 'h', 'duration.minute': 'm',\n 'permission.label': 'Permission mode:', 'permission.plan': 'plan (read-only)', 'permission.acceptEdits': 'accept-edits (edit code)', 'permission.skip': 'skip (auto-approve; AGY internal protections remain)',\n 'effort.label': 'Thinking effort:', 'effort.auto': 'auto', 'effort.low': 'low', 'effort.medium': 'medium', 'effort.high': 'high',\n 'pool.label': 'Account-pool scheduling:', 'pool.sequential': 'Use sequentially', 'pool.roundRobin': 'Round-robin',\n 'models.label': 'Model visibility:', 'models.empty': 'No models in the catalog yet — send a message or click \"Refresh quota\", then come back to manage them',\n 'models.hint': 'Click to show/hide. Hidden models are not listed in the model picker; ongoing sessions are unaffected.',\n 'header.refreshQuota': 'Refresh quota', 'header.refreshing': 'Refreshing...',\n 'console.close': 'Close (Esc)', 'header.badgeTitle': 'Antigravity: {count} accounts ready · click to open the console', 'header.badgeLoading': 'Antigravity · click to open the console',\n 'account.type.agy': 'Google Antigravity (CLI / OAuth)',\n 'account.loginType': 'Login Method:',\n 'account.dragHandle': 'Drag to reorder priority',\n 'account.moveUp': 'Move up priority',\n 'account.moveDown': 'Move down priority',\n 'account.reordered': 'Account priorities reordered successfully',\n 'account.collapseAll': 'Collapse all',\n 'account.expandAll': 'Expand all',\n 'account.cardCollapse': 'Collapse',\n 'account.cardExpand': 'Expand details',\n 'account.draggingTarget': 'Drop here to set priority #{num}',\n 'account.dragBanner': 'Reordering: moving [{alias}] to priority #{num}',\n 'account.dragHint': 'Drag cards to reorder scheduling priority in real time',\n 'account.enable': 'Enable',\n 'account.disable': 'Disable',\n 'account.enableTitle': 'Enable this account (include in rotation)',\n 'account.disableTitle': 'Disable this account (skip in rotation)',\n 'account.enabledToast': 'Account enabled: {alias}',\n 'account.disabledToast': 'Account disabled: {alias}',\n 'status.disabled': 'Disabled',\n 'header.warmup': 'Auto Warmup',\n 'header.warmingUp': 'Warming up...',\n 'account.warmup': 'Warmup',\n 'account.warmingUp': 'Warming up...',\n 'account.warmupTitle': 'Warm up this account (trigger 7-day weekly reset timer)',\n 'warmup.success': 'Account warmed up successfully',\n 'warmup.allSuccess': 'Warmup completed for all accounts',\n 'warmup.skipped': 'Account or model is in cooldown, no warmup needed',\n 'config.autoWarmup': '7-Day Quota Auto-Warmup',\n 'config.autoWarmupDesc': 'Automatically trigger a 1-token probe when weekly reset time is reached',\n}\n\nexport const ptBR: AgyDictionary = {\n 'section.label': 'Antigravity', 'console.title': 'Console de gerenciamento do Antigravity',\n 'code.title': 'Código', 'code.inspect': 'Inspecionar',\n 'tv.command': 'Comando', 'tv.write': 'Escrever', 'tv.edit': 'Editar', 'tv.read': 'Ler', 'tv.search': 'Buscar', 'tv.webSearch': 'Busca na web', 'tv.list': 'Listar', 'tv.delete': 'Excluir', 'tv.tool': 'Ferramenta',\n 'tv.noOutput': '(sem saída)', 'tv.noMatches': '(nenhuma correspondência)', 'tv.noChanges': '(sem alterações de texto)', 'tv.emptyDir': '(diretório vazio)', 'tv.noDetail': '(sem detalhes)',\n 'tv.hint.expandInspect': 'Clique para expandir · clique direito para inspecionar', 'tv.hint.collapseInspect': 'Clique para recolher · clique direito para inspecionar', 'tv.hint.expand': 'Clique para expandir', 'tv.hint.collapse': 'Clique para recolher',\n 'tv.diffMore': '… {count} linhas restantes não renderizadas',\n 'code.copy': 'Copiar', 'code.copied': 'Copiado',\n 'status.ready': 'Pronto', 'status.needsAuth': 'Autenticação necessária', 'status.loading': 'Carregando o status do Antigravity...',\n 'status.authRequired': 'É necessário entrar novamente', 'account.setActive': 'Definir como em uso', 'account.settingActive': 'Alternando...', 'account.activeSet': 'Conta em uso alterada', 'account.activeSetFailed': 'Conta não elegível no momento (cooldown ou login necessário)', 'status.proxy': 'Proxy', 'status.inUse': 'Em uso',\n 'account.add': 'Adicionar conta Google', 'account.aliasDefault': 'Conta Google reserva {number}', 'account.defaultAlias': 'Conta principal (login do sistema)',\n 'account.proxyPlaceholder': 'URL de proxy dedicada (ex.: http://127.0.0.1:7890; deixe vazio para herdar a global)', 'account.aliasPlaceholder': 'Apelido da conta (por exemplo: Conta reserva 2)', 'account.removeTitle': 'Remover esta conta',\n 'aria.aliasInput': 'Apelido da conta', 'aria.proxyInput': 'URL do proxy exclusivo', 'aria.authCodeInput': 'Código de autorização ou URL de retorno', 'aria.closeToast': 'Fechar notificação',\n 'account.details': 'Detalhes', 'account.collapse': 'Recolher',\n 'account.expandOthers': 'Expandir cotas Claude e GPT-OSS', 'account.collapseOthers': 'Recolher cotas Claude e GPT-OSS', 'account.otherModels': 'Cotas Claude / GPT',\n 'account.sync': 'Sincronizar', 'account.syncing': 'Sincronizando...', 'account.syncTitle': 'Atualizar esta conta (sincroniza e-mail, cota e modelos depois de trocar de conta)',\n 'account.models': 'Detalhes por modelo:', 'account.cooldown': 'Alguns modelos estão limitados; a conta foi alternada automaticamente', 'account.clearCooldown': 'Limpar espera',\n 'account.localCooldown': ' · espera local ativa', 'account.removed': 'Conta removida: {alias}',\n 'quota.fiveHour': 'Cota de 5 horas', 'quota.weekly': 'Cota semanal', 'quota.refreshed': 'Cota atualizada', 'quota.windowReset': 'Redefinida · disponível',\n 'proxy.button': 'Proxy', 'proxy.placeholder': 'URL do proxy exclusivo (por exemplo: http://127.0.0.1:7890; deixe vazio para usar o proxy global)',\n 'proxy.save': 'Salvar', 'proxy.saved': 'Proxy salvo', 'cancel': 'Cancelar',\n 'auth.openBrowser': 'Abrir navegador para entrar', 'auth.openingBrowser': 'Abrindo navegador...',\n 'auth.browserOpened': 'A página de autorização do Google foi aberta no navegador e será sincronizada após a autorização',\n 'auth.browserManual': 'Não foi possível abrir o navegador automaticamente; use o link abaixo para autorizar manualmente',\n 'auth.startFailed': 'Não foi possível iniciar a autorização do Google. Verifique a configuração de rede ou proxy.', 'auth.networkHint': 'Verifique a configuração de rede ou proxy',\n 'auth.activated': 'Conta ativada no pool', 'auth.failed': 'Falha na autorização', 'auth.added': 'Conta Google adicionada e ativada',\n 'auth.codeFailed': 'Falha ao validar o código de autorização', 'auth.exchanging': 'Verificando a autorização e ativando a conta; aguarde...',\n 'auth.waiting': 'Conclua a autorização do Google no navegador. A conta será ativada automaticamente.',\n 'auth.openManual': 'Se o navegador não abriu, clique aqui para abrir manualmente a página de login do Google',\n 'auth.pasteHint': 'Se o retorno automático não foi concluído, cole o código de autorização ou a URL de retorno:',\n 'auth.codePlaceholder': 'Código de autorização ou URL completa http://localhost:51121/oauth-callback?code=...',\n 'auth.activate': 'Ativar manualmente', 'auth.activating': 'Verificando e ativando...',\n 'auth.code.browser_manual': 'Não foi possível abrir o navegador automaticamente; use o link abaixo para autorizar manualmente.', 'auth.code.callback_failed': 'O retorno da autorização falhou. Inicie a autorização novamente.',\n 'auth.code.no_active_flow': 'Não há um fluxo de autorização em andamento.', 'auth.code.invalid_code': 'O código de autorização não foi reconhecido. Cole o código ou a URL completa de retorno.',\n 'auth.code.invalid_state': 'O link de autorização não pertence a este fluxo ou expirou. Inicie a autorização novamente.', 'auth.code.exchange_failed': 'A validação da autorização falhou. Inicie a autorização novamente.',\n 'auth.code.primary_activated': 'Conta principal conectada.', 'auth.code.account_activated': 'Conta adicionada e ativada.', 'auth.code.missing_code': 'Informe um código de autorização.',\n 'auth.code.request_failed': 'A solicitação não foi concluída. Tente novamente.', 'api.genericError': 'A operação não foi concluída. Tente novamente.',\n 'duration.day': 'd', 'duration.hour': 'h', 'duration.minute': 'min',\n 'permission.label': 'Modo de permissão:', 'permission.plan': 'plan (somente leitura)', 'permission.acceptEdits': 'accept-edits (editar código)', 'permission.skip': 'skip (aprovação automática; proteções internas do AGY permanecem)',\n 'effort.label': 'Intensidade de raciocínio:', 'effort.auto': 'auto', 'effort.low': 'low', 'effort.medium': 'medium', 'effort.high': 'high',\n 'pool.label': 'Agendamento do pool de contas:', 'pool.sequential': 'Usar em sequência', 'pool.roundRobin': 'Rodízio',\n 'models.label': 'Visibilidade dos modelos:', 'models.empty': 'Ainda não há modelos no catálogo — envie uma mensagem ou clique em \"Atualizar cota\" e volte para gerenciá-los',\n 'models.hint': 'Clique para mostrar/ocultar. Modelos ocultos não aparecem no seletor de modelos; as sessões em andamento não são afetadas.',\n 'header.refreshQuota': 'Atualizar cota', 'header.refreshing': 'Atualizando...',\n 'console.close': 'Fechar (Esc)', 'header.badgeTitle': 'Antigravity: {count} contas prontas · clique para abrir o console', 'header.badgeLoading': 'Antigravity · clique para abrir o console',\n 'account.type.agy': 'Google Antigravity (CLI / OAuth)',\n 'account.loginType': 'Tipo de login:',\n 'account.dragHandle': 'Arrastar para reordenar prioridade',\n 'account.moveUp': 'Subir prioridade',\n 'account.moveDown': 'Descer prioridade',\n 'account.reordered': 'Prioridade das contas reordenada com sucesso',\n 'account.collapseAll': 'Recolher todos',\n 'account.expandAll': 'Expandir todos',\n 'account.cardCollapse': 'Recolher',\n 'account.cardExpand': 'Expandir detalhes',\n 'account.draggingTarget': 'Soltar aqui para prioridade #{num}',\n 'account.dragBanner': 'Reordenando: movendo [{alias}] para #{num}',\n 'account.dragHint': 'Arraste os cartões para reordenar a prioridade em tempo real',\n 'account.enable': 'Ativar',\n 'account.disable': 'Desativar',\n 'account.enableTitle': 'Ativar esta conta (incluir na rotação)',\n 'account.disableTitle': 'Desativar esta conta (ignorar na rotação)',\n 'account.enabledToast': 'Conta ativada: {alias}',\n 'account.disabledToast': 'Conta desativada: {alias}',\n 'status.disabled': 'Desativado',\n 'header.warmup': 'Pré-aquecimento',\n 'header.warmingUp': 'Aquecendo...',\n 'account.warmup': 'Aquecer',\n 'account.warmingUp': 'Aquecendo...',\n 'account.warmupTitle': 'Aquecer esta conta (ativar cronômetro semanal de 7 dias)',\n 'warmup.success': 'Conta aquecida com sucesso',\n 'warmup.allSuccess': 'Pré-aquecimento concluído',\n 'warmup.skipped': 'Conta em espera, sem necessidade de aquecimento',\n 'config.autoWarmup': 'Pré-aquecimento automático de 7 dias',\n 'config.autoWarmupDesc': 'Ativa automaticamente um ciclo quando o tempo de redefinição semanal é atingido',\n}\n\nexport const es: AgyDictionary = {\n 'section.label': 'Antigravity', 'console.title': 'Consola de administración de Antigravity',\n 'code.title': 'Código', 'code.inspect': 'Inspeccionar',\n 'tv.command': 'Comando', 'tv.write': 'Escribir', 'tv.edit': 'Editar', 'tv.read': 'Leer', 'tv.search': 'Buscar', 'tv.webSearch': 'Búsqueda web', 'tv.list': 'Listar', 'tv.delete': 'Eliminar', 'tv.tool': 'Herramienta',\n 'tv.noOutput': '(sin salida)', 'tv.noMatches': '(sin coincidencias)', 'tv.noChanges': '(sin cambios de texto)', 'tv.emptyDir': '(directorio vacío)', 'tv.noDetail': '(sin detalles)',\n 'tv.hint.expandInspect': 'Clic para expandir · clic derecho para inspeccionar', 'tv.hint.collapseInspect': 'Clic para contraer · clic derecho para inspeccionar', 'tv.hint.expand': 'Clic para expandir', 'tv.hint.collapse': 'Clic para contraer',\n 'tv.diffMore': '… {count} líneas restantes no renderizadas',\n 'code.copy': 'Copiar', 'code.copied': 'Copiado',\n 'status.ready': 'Listo', 'status.needsAuth': 'Se requiere autenticación', 'status.loading': 'Cargando el estado de Antigravity...',\n 'status.authRequired': 'Debe iniciar sesión de nuevo', 'account.setActive': 'Establecer como en uso', 'account.settingActive': 'Cambiando...', 'account.activeSet': 'Cuenta en uso cambiada', 'account.activeSetFailed': 'Cuenta no elegible ahora (enfriamiento o requiere login)', 'status.proxy': 'Proxy', 'status.inUse': 'En uso',\n 'account.add': 'Añadir cuenta de Google', 'account.aliasDefault': 'Cuenta de Google de respaldo {number}', 'account.defaultAlias': 'Cuenta principal (inicio de sesión del sistema)',\n 'account.proxyPlaceholder': 'URL de proxy dedicada (p. ej., http://127.0.0.1:7890; déjalo vacío para heredar la global)', 'account.aliasPlaceholder': 'Alias de la cuenta (por ejemplo: Cuenta de respaldo 2)', 'account.removeTitle': 'Eliminar esta cuenta',\n 'aria.aliasInput': 'Alias de la cuenta', 'aria.proxyInput': 'URL de proxy exclusivo', 'aria.authCodeInput': 'Código de autorización o URL de devolución', 'aria.closeToast': 'Cerrar notificación',\n 'account.details': 'Detalles', 'account.collapse': 'Contraer',\n 'account.expandOthers': 'Expandir cuotas Claude y GPT-OSS', 'account.collapseOthers': 'Contraer cuotas Claude y GPT-OSS', 'account.otherModels': 'Cuotas Claude / GPT',\n 'account.sync': 'Sincronizar', 'account.syncing': 'Sincronizando...', 'account.syncTitle': 'Actualizar esta cuenta (sincroniza correo, cuota y modelos tras cambiar de cuenta)',\n 'account.models': 'Detalles por modelo:', 'account.cooldown': 'Algunos modelos tienen límite de uso; la cuenta se cambió automáticamente', 'account.clearCooldown': 'Borrar espera',\n 'account.localCooldown': ' · espera local activa', 'account.removed': 'Cuenta eliminada: {alias}',\n 'quota.fiveHour': 'Cuota de 5 horas', 'quota.weekly': 'Cuota semanal', 'quota.refreshed': 'Cuota actualizada', 'quota.windowReset': 'Reiniciada · disponible',\n 'proxy.button': 'Proxy', 'proxy.placeholder': 'URL de proxy exclusivo (por ejemplo: http://127.0.0.1:7890; déjelo vacío para usar el proxy global)',\n 'proxy.save': 'Guardar', 'proxy.saved': 'Proxy guardado', 'cancel': 'Cancelar',\n 'auth.openBrowser': 'Abrir navegador para iniciar sesión', 'auth.openingBrowser': 'Abriendo navegador...',\n 'auth.browserOpened': 'La página de autorización de Google se abrió en el navegador y se sincronizará después de autorizar',\n 'auth.browserManual': 'No se pudo abrir el navegador automáticamente; use el enlace de abajo para autorizar manualmente',\n 'auth.startFailed': 'No se pudo iniciar la autorización de Google. Revise la configuración de red o proxy.', 'auth.networkHint': 'Revise la configuración de red o proxy',\n 'auth.activated': 'Cuenta activada en el pool', 'auth.failed': 'Falló la autorización', 'auth.added': 'Cuenta de Google añadida y activada',\n 'auth.codeFailed': 'Falló la validación del código de autorización', 'auth.exchanging': 'Verificando la autorización y activando la cuenta; espere...',\n 'auth.waiting': 'Complete la autorización de Google en el navegador. La cuenta se activará automáticamente.',\n 'auth.openManual': 'Si el navegador no se abrió, haga clic aquí para abrir manualmente la página de inicio de sesión de Google',\n 'auth.pasteHint': 'Si la devolución automática no se completó, pegue el código de autorización o la URL de devolución:',\n 'auth.codePlaceholder': 'Código de autorización o URL completa http://localhost:51121/oauth-callback?code=...',\n 'auth.activate': 'Activar manualmente', 'auth.activating': 'Verificando y activando...',\n 'auth.code.browser_manual': 'No se pudo abrir el navegador automáticamente; use el enlace de abajo para autorizar manualmente.', 'auth.code.callback_failed': 'La devolución de la autorización falló. Inicie la autorización de nuevo.',\n 'auth.code.no_active_flow': 'No hay un flujo de autorización en curso.', 'auth.code.invalid_code': 'No se reconoció el código de autorización. Pegue el código o la URL completa de devolución.',\n 'auth.code.invalid_state': 'El enlace de autorización no pertenece a este flujo o caducó. Inicie la autorización de nuevo.', 'auth.code.exchange_failed': 'Falló la validación de la autorización. Inicie la autorización de nuevo.',\n 'auth.code.primary_activated': 'Cuenta principal conectada.', 'auth.code.account_activated': 'Cuenta añadida y activada.', 'auth.code.missing_code': 'Introduzca un código de autorización.',\n 'auth.code.request_failed': 'La solicitud no se completó. Inténtelo de nuevo.', 'api.genericError': 'La operación no se completó. Inténtelo de nuevo.',\n 'duration.day': 'd', 'duration.hour': 'h', 'duration.minute': 'min',\n 'permission.label': 'Modo de permisos:', 'permission.plan': 'plan (solo lectura)', 'permission.acceptEdits': 'accept-edits (editar código)', 'permission.skip': 'skip (aprobación automática; se mantienen las protecciones internas de AGY)',\n 'effort.label': 'Intensidad de razonamiento:', 'effort.auto': 'auto', 'effort.low': 'low', 'effort.medium': 'medium', 'effort.high': 'high',\n 'pool.label': 'Programación del pool de cuentas:', 'pool.sequential': 'Usar en secuencia', 'pool.roundRobin': 'Turno rotativo',\n 'models.label': 'Visibilidad de modelos:', 'models.empty': 'Aún no hay modelos en el catálogo: envía un mensaje o haz clic en \"Actualizar cuota\" y vuelve para gestionarlos',\n 'models.hint': 'Haz clic para mostrar/ocultar. Los modelos ocultos no aparecen en el selector de modelos; las sesiones en curso no se ven afectadas.',\n 'header.refreshQuota': 'Actualizar cuota', 'header.refreshing': 'Actualizando...',\n 'console.close': 'Cerrar (Esc)', 'header.badgeTitle': 'Antigravity: {count} cuentas listas · haga clic para abrir la consola', 'header.badgeLoading': 'Antigravity · haga clic para abrir la consola',\n 'account.type.agy': 'Google Antigravity (CLI / OAuth)',\n 'account.loginType': 'Tipo de inicio de sesión:',\n 'account.dragHandle': 'Arrastrar para reordenar prioridad',\n 'account.moveUp': 'Subir prioridad',\n 'account.moveDown': 'Bajar prioridad',\n 'account.reordered': 'Prioridad de cuentas reordenada con éxito',\n 'account.collapseAll': 'Contraer todo',\n 'account.expandAll': 'Expandir todo',\n 'account.cardCollapse': 'Contraer',\n 'account.cardExpand': 'Expandir detalles',\n 'account.draggingTarget': 'Soltar aquí para prioridad #{num}',\n 'account.dragBanner': 'Reordenando: moviendo [{alias}] a #{num}',\n 'account.dragHint': 'Arrastre las tarjetas para reordenar la prioridad en tiempo real',\n 'account.enable': 'Habilitar',\n 'account.disable': 'Deshabilitar',\n 'account.enableTitle': 'Habilitar esta cuenta (incluir en rotación)',\n 'account.disableTitle': 'Deshabilitar esta cuenta (ignorar en rotación)',\n 'account.enabledToast': 'Cuenta habilitada: {alias}',\n 'account.disabledToast': 'Cuenta deshabilitada: {alias}',\n 'status.disabled': 'Deshabilitado',\n 'header.warmup': 'Precalentamiento',\n 'header.warmingUp': 'Calentando...',\n 'account.warmup': 'Calentar',\n 'account.warmingUp': 'Calentando...',\n 'account.warmupTitle': 'Calentar esta cuenta (activar temporizador semanal de 7 días)',\n 'warmup.success': 'Cuenta calentada con éxito',\n 'warmup.allSuccess': 'Precalentamiento completado',\n 'warmup.skipped': 'Cuenta en espera, sin necesidad de calentar',\n 'config.autoWarmup': 'Precalentamiento automático de 7 días',\n 'config.autoWarmupDesc': 'Activa automáticamente un ciclo cuando se alcanza el tiempo de reinicio semanal',\n}\n\n/**\n * The namespace this dictionary owns, merged into the Host's locale map so the\n * keyed tool views can seat `t` and so a missing/extra key is a type error.\n */\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'agy-worker': AgyLocaleKey\n }\n}\n","/**\n * Locale plumbing for the built-in AGY console.\n *\n * Ported from dsh-agy-worker (`src/client/index.ts`), MIT License,\n * Copyright (c) 2026 dsh-agy-worker contributors. See docs/ATTRIBUTION-AGY.md.\n *\n * Fusion's client entry already follows DSH's `ctx.locale` for its own copy. This\n * module gives the ported console the same service without making it a hard\n * dependency: when no locale service was bound, the console falls back to the\n * browser language over its own dictionaries — which is what the standalone\n * plugin did on a host without `dsh-client-locale`.\n */\nimport { useEffect, useState } from 'react'\nimport { NS, en, zh, type AgyLocaleKey } from './locales.js'\n\n/** The slice of DSH's client locale service this console uses. */\nexport interface AgyLocaleSource {\n /** Bind the `agy-worker` namespace to a `(key, params) => string` translator. */\n bind(namespace: string): (key: string, params?: Record<string, unknown>) => string\n /** Contribute one language's dictionary under a namespace. */\n register(namespace: string, language: string, dictionary: Record<string, string>): () => void\n /** Add a language the Host catalog does not own yet. */\n addLanguage(language: { id: string; label: string; fallback: string }): () => void\n /** Subscribe to language/dictionary changes. */\n subscribe(listener: () => void): () => void\n /** Current catalog snapshot, when the service exposes one. */\n getSnapshot?(): { locales?: readonly { id: string }[] }\n}\n\nlet bound: AgyLocaleSource | undefined\nconst listeners = new Set<() => void>()\nconst notify = (): void => { for (const listener of [...listeners]) listener() }\n\n/** Bind the Host locale service; returns the disposer the client entry owns. */\nexport function bindAgyLocale(source: AgyLocaleSource): () => void {\n bound = source\n notify()\n return () => {\n if (bound !== source) return\n bound = undefined\n notify()\n }\n}\n\nconst activeLanguage = (): 'zh' | 'en' =>\n (typeof navigator === 'undefined' ? 'en' : navigator.language).toLowerCase().startsWith('zh') ? 'zh' : 'en'\n\n/** The fallback translator: the console's own dictionaries, no Host service. */\nfunction fallbackTranslate(key: AgyLocaleKey, params?: Record<string, unknown>): string {\n const dictionary = (activeLanguage() === 'zh' ? zh : en) as Record<string, string>\n const template = dictionary[key] ?? (en as Record<string, string>)[key] ?? key\n if (params === undefined) return template\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) =>\n params[name] === undefined ? match : String(params[name]))\n}\n\n/** The console's translator: Host locale when bound, browser language otherwise. */\nexport function useAgyTranslation(): (key: AgyLocaleKey, params?: Record<string, unknown>) => string {\n const [, rerender] = useState(0)\n useEffect(() => {\n const listener = () => rerender(revision => revision + 1)\n listeners.add(listener)\n const unsubscribe = bound?.subscribe(listener)\n return () => {\n listeners.delete(listener)\n unsubscribe?.()\n }\n }, [])\n if (bound === undefined) return fallbackTranslate\n const translate = bound.bind(NS)\n return (key: AgyLocaleKey, params?: Record<string, unknown>) => {\n const text = translate(key, params)\n return text === key ? fallbackTranslate(key, params) : text\n }\n}\n","/**\n * The Antigravity (agy) management console, rendered inside FusionSettings.\n *\n * Ported from dsh-agy-worker (`src/client/index.ts`), MIT License,\n * Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n * dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n * docs/ATTRIBUTION-AGY.md.\n *\n * What changed in the port: Fusion is the single plugin identity, so this is a\n * plain module rather than a client entry. It keeps the console component, the\n * shared status poll and the quota/progress presentation it renders. The\n * standalone plugin's own `main`, `sidebar.panellist`, `plugins.*` and\n * header-badge registrations are deliberately absent — FusionSettings is the\n * only entry — and so are its page-level DOM scanners (settings-nav icon,\n * mermaid, reasoning, images, decisions, scroll guard). The route surface it\n * talks to is unchanged: `/plugins/agy-worker/*`.\n */\nimport { createElement, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { AccountPoolData, ModelQuotaInfo, ManagedAccount } from '../../host/agy/pool-types.js'\nimport { BRAND_COLORS, BRAND_PATHS, UI_PATHS } from './brand-icons.js'\nimport type { AgyLocaleSource } from './locale.js'\nimport { useAgyTranslation } from './locale.js'\nimport { NS, en, es, ptBR, zh, type AgyLocaleKey } from './locales.js'\nimport { setOverlaySuspended } from './scroll-guard.js'\n\n/**\n * The console builds its tree with a permissive `createElement`.\n *\n * Upstream compiled against a loose `require('react')` shim; this file is typed\n * against the real React types, where every helper that returns `unknown` is a\n * `ReactNode` mismatch. The shim keeps the ported call sites verbatim (one\n * function, same argument shape) instead of rewriting several hundred nodes.\n */\nconst h = createElement as unknown as (\n\t(type: unknown, props?: Record<string, unknown> | null, ...children: unknown[]) => unknown\n)\n\nconst win = globalThis as unknown as {\n\tlocation?: { origin?: string };\n\tfetch?: (url: string, init?: Record<string, unknown>) => Promise<{ ok: boolean; status: number; json(): Promise<unknown> }>;\n\topen?: (url: string, target?: string) => void;\n\tdocument?: { body?: unknown } | null;\n\tlocalStorage?: {\n\t\tgetItem(key: string): string | null;\n\t\tsetItem(key: string, value: string): void;\n\t\tremoveItem(key: string): void;\n\t};\n\taddEventListener?: (type: string, listener: (ev: Event) => void, useCapture?: boolean) => void;\n\tremoveEventListener?: (type: string, listener: (ev: Event) => void, useCapture?: boolean) => void;\n};\n\ninterface StatusPayload {\n\tbin?: string | null;\n\tversion?: string | null;\n\tdormantReason?: string | null;\n\tenabled?: boolean;\n\tpermissionMode?: string;\n\tworkspaceRoot?: string;\n\tdefaultModel?: string;\n\tdefaultEffort?: string;\n\tauth?: {\n\t\tphase: string;\n\t\taccountId?: string;\n\t\turl?: string;\n\t\tqrDataUrl?: string;\n\t\tstartedAt?: number;\n\t\texpiresAt?: number;\n\t\tmessage?: string;\n\t};\n\tpool?: AccountPoolData;\n\tpoolAuth?: {\n\t\tphase: 'idle' | 'waiting' | 'exchanging' | 'done' | 'failed';\n\t\tstagingId?: string;\n\t\talias?: string;\n\t\turl?: string;\n\t\tmode?: 'auto' | 'manual';\n\t\tbrowserOpened?: boolean;\n\t\tcode?: string;\n\t};\n\tcatalog?: { source: string; count: number; lastError: string | null };\n\tcatalogModels?: ReadonlyArray<{ id: string; name: string }>;\n\thiddenModels?: readonly string[];\n\tautoWarmup?: boolean;\n\twarmupModels?: readonly string[];\n\tbindings?: number;\n\tlastRun?: { ok: boolean; code: string; durationMs: number; model: string } | null;\n}\n\ninterface ToastNotice {\n\ttext: string;\n\ttype: 'success' | 'info' | 'warn' | 'error';\n\tid: number;\n}\n\nconst base = win.location?.origin ?? '';\n\nconst STATUS_CACHE_KEY = 'dsh_agy_status_cache';\n\nfunction loadInitialStatusCache(): StatusPayload | null {\n\ttry {\n\t\tconst raw = win.localStorage?.getItem(STATUS_CACHE_KEY);\n\t\tif (raw) {\n\t\t\tconst parsed = JSON.parse(raw);\n\t\t\tif (parsed && typeof parsed === 'object') return parsed as StatusPayload;\n\t\t}\n\t} catch {\n\t\t// Ignore storage quota / parsing errors\n\t}\n\treturn null;\n}\n\n// Module-level cache for instant remount rendering (preloaded from localStorage for zero-flicker startup)\nlet statusCache: StatusPayload | null = loadInitialStatusCache();\n\nasync function getStatus(): Promise<StatusPayload | null> {\n\ttry {\n\t\t// A bounded fetch: the poll loop must never stack behind a hung request\n\t\t// (undici/browser defaults can park far longer than one poll period).\n\t\tconst init: Record<string, unknown> = {};\n\t\tif (typeof AbortSignal !== 'undefined' && typeof (AbortSignal as { timeout?: unknown }).timeout === 'function') {\n\t\t\tinit.signal = (AbortSignal as { timeout: (ms: number) => unknown }).timeout(5000);\n\t\t}\n\t\tconst res = await win.fetch?.(base + '/plugins/agy-worker/status', init);\n\t\tif (!res || !res.ok) return null;\n\t\treturn (await res.json()) as StatusPayload;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function postJson(path: string, body: Record<string, unknown>): Promise<any> {\n\ttry {\n\t\tconst res = await win.fetch?.(base + path, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(body),\n\t\t});\n\t\tif (!res) return null;\n\t\ttry {\n\t\t\tconst payload = await res.json();\n\t\t\t// Surface HTTP failure as ok:false so callers can distinguish\n\t\t\t// \"saved\" from \"server refused\" instead of always toasting success.\n\t\t\tif (!res.ok && payload !== null && typeof payload === 'object') {\n\t\t\t\treturn { ok: false, ...(payload as Record<string, unknown>) };\n\t\t\t}\n\t\t\treturn payload;\n\t\t} catch {\n\t\t\treturn { ok: res.ok };\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function getJson<T = any>(path: string): Promise<T | null> {\n\ttry {\n\t\tconst res = await win.fetch?.(base + path);\n\t\tif (!res || !res.ok) return null;\n\t\treturn (await res.json()) as T;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n// ---- shared status polling ----\n// ONE module-level fetch loop serves every mounted consumer (settings panel,\n// header badge, modal). Per-component 3s loops used to stack (three full\n// payload fetches per interval with the modal open), had no overlap guard,\n// and let a slow stale response overwrite a newer one.\nconst statusListeners = new Set<(s: StatusPayload) => void>();\nlet statusPollTimer: ReturnType<typeof setInterval> | null = null;\nlet statusPollInterval = 3000;\nlet statusFetchSeq = 0;\n\nfunction isStatusEqual(a: StatusPayload | null, b: StatusPayload | null): boolean {\n\tif (a === b) return true;\n\tif (a === null || b === null) return false;\n\ttry {\n\t\treturn JSON.stringify(a) === JSON.stringify(b);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction notifyStatus(st: StatusPayload): void {\n\tstatusCache = st;\n\ttry {\n\t\twin.localStorage?.setItem(STATUS_CACHE_KEY, JSON.stringify(st));\n\t} catch {\n\t\t// Ignore storage quota / parsing errors\n\t}\n\tfor (const fn of [...statusListeners]) {\n\t\ttry { fn(st); } catch { /* a dead consumer must not kill the loop */ }\n\t}\n}\n\nasync function statusPollTick(): Promise<void> {\n\tconst seq = ++statusFetchSeq;\n\tconst st = await getStatus();\n\t// A slow response from an older tick must never overwrite newer data.\n\t// Only notify when payload actually changed to prevent needless re-renders.\n\tif (st !== null && seq === statusFetchSeq) {\n\t\tif (!isStatusEqual(statusCache, st)) {\n\t\t\tnotifyStatus(st);\n\t\t}\n\t}\n}\n\nfunction ensureStatusPolling(): void {\n\tif (statusPollTimer !== null) {\n\t\tif (statusPollInterval !== 3000) {\n\t\t\tclearInterval(statusPollTimer);\n\t\t\tstatusPollTimer = null;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n\tstatusPollInterval = 3000;\n\tvoid statusPollTick();\n\tstatusPollTimer = setInterval(() => { void statusPollTick(); }, 3000);\n}\n\nfunction stopStatusPollingIfIdle(): void {\n\t// Keep statusCache warm so opening a session never faces an empty or stale snapshot.\n\t// When idle (no active mounted viewers), relax the polling interval to 15s.\n\tif (statusListeners.size === 0 && statusPollTimer !== null && statusPollInterval === 3000) {\n\t\tclearInterval(statusPollTimer);\n\t\tstatusPollInterval = 15000;\n\t\tstatusPollTimer = setInterval(() => { void statusPollTick(); }, 15000);\n\t}\n}\n\n/**\n * Subscribe a component to the shared status poll. Returns the latest\n * snapshot plus a manual refresh that keeps the last good snapshot on a\n * transient failure (a failed refresh used to flip the whole panel back to\n * its loading state).\n */\nfunction useAgyStatus(): { status: StatusPayload | null; refresh: () => Promise<void> } {\n\tconst [status, setStatus] = useState<StatusPayload | null>(statusCache);\n\tuseEffect(() => {\n\t\tstatusListeners.add(setStatus);\n\t\tensureStatusPolling();\n\t\treturn () => {\n\t\t\tstatusListeners.delete(setStatus);\n\t\t\tstopStatusPollingIfIdle();\n\t\t};\n\t}, []);\n\tconst refresh = async (): Promise<void> => {\n\t\tconst st = await getStatus();\n\t\tif (st !== null && !isStatusEqual(statusCache, st)) notifyStatus(st);\n\t};\n\treturn { status, refresh };\n}\n\n\nconst agyModalStore = {\n\topen: false,\n\tlisteners: new Set<() => void>(),\n\tsetOpen(v: boolean) {\n\t\tif (agyModalStore.open === v) return;\n\t\tagyModalStore.open = v;\n\t\t// OVERLAY ISOLATION CONTRACT (2026-10-28 — \"打开控制台后滚动闪屏\"):\n\t\t// an open console must FREEZE the page behind it, not merely draw on top.\n\t\t// * suspend the plugin's global DOM scanners so nothing is injected into\n\t\t// the conversation while it composites under the overlay;\n\t\t// * toggle `agy-console-modal-open` on <html> so CSS locks the\n\t\t// conversation scroller (scrollbar-gutter:stable keeps the width from\n\t\t// jumping). The class is namespaced because FusionSettings renders this\n\t\t// console inline, so the marker must not collide with another panel.\n\t\t// Without this, wheel/inertia and the modal's 3s polling keep reflowing\n\t\t// and repainting the page behind the fixed overlay -> visible flashing.\n\t\tsetOverlaySuspended(v);\n\t\tif (typeof document !== 'undefined' && document.documentElement) {\n\t\t\tdocument.documentElement.classList.toggle('agy-console-modal-open', v);\n\t\t}\n\t\tagyModalStore.listeners.forEach((fn) => fn());\n\t},\n\tsubscribe(fn: () => void) {\n\t\tagyModalStore.listeners.add(fn);\n\t\treturn () => {\n\t\t\tagyModalStore.listeners.delete(fn);\n\t\t};\n\t},\n};\n\n/**\n * Global modal host manager: ensures exactly one mounted session header\n * hosts the modal dialog portal reactively. The most recently focused or mounted\n * header is prioritized immediately to prevent host handoff flicker when opened.\n * If the primary header unmounts, the next available header is seamlessly notified.\n */\nconst modalHostManager = {\n\tlisteners: new Map<string, (isPrimary: boolean) => void>(),\n\tactiveId: null as string | null,\n\n\tregister(id: string, onChange: (isPrimary: boolean) => void) {\n\t\tmodalHostManager.listeners.set(id, onChange);\n\t\t// The first mounted session header takes priority as the active host.\n\t\t// Never steal activeId if a host is already assigned (prevents unmount/remount\n\t\t// thrashing during multi-header updates or quota sync).\n\t\tif (modalHostManager.activeId === null) {\n\t\t\tmodalHostManager.activeId = id;\n\t\t}\n\t\tonChange(modalHostManager.activeId === id);\n\n\t\treturn () => {\n\t\t\tmodalHostManager.listeners.delete(id);\n\t\t\tif (modalHostManager.activeId === id) {\n\t\t\t\tconst next = modalHostManager.listeners.keys().next().value ?? null;\n\t\t\t\tmodalHostManager.activeId = next;\n\t\t\t\tif (next) {\n\t\t\t\t\ttry { modalHostManager.listeners.get(next)?.(true); } catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t},\n\n\tclaim(id: string) {\n\t\tif (modalHostManager.activeId !== id) {\n\t\t\tconst prev = modalHostManager.activeId;\n\t\t\tmodalHostManager.activeId = id;\n\t\t\tif (prev && prev !== id) {\n\t\t\t\ttry { modalHostManager.listeners.get(prev)?.(false); } catch {}\n\t\t\t}\n\t\t\ttry { modalHostManager.listeners.get(id)?.(true); } catch {}\n\t\t}\n\t},\n};\n\n/**\n * Format reset timestamp into readable date/time + relative countdown.\n */\nfunction formatQuotaWindow(t: (key: AgyLocaleKey) => string, resetTimeStr?: string): {\n\tresetText: string;\n\t/** resetTime exists but is already in the past (window has rolled over). */\n\texpired: boolean;\n} {\n\tif (!resetTimeStr) return { resetText: '', expired: false };\n\ttry {\n\t\tconst d = new Date(resetTimeStr);\n\t\tconst diffMs = d.getTime() - Date.now();\n\t\t// A stale (already passed) resetTime means the window has ROLLED OVER —\n\t\t// the backend keeps reporting the previous boundary once the quota is\n\t\t// back at 100%, and a countdown into the past would be nonsense. Hide\n\t\t// the time but tell the caller so it can say \"已重置\" instead of a\n\t\t// mysterious blank (2026-10-16: every full 5h row lost its ↻ note).\n\t\tif (Number.isNaN(d.getTime()) || diffMs <= 0) return { resetText: '', expired: true };\n\n\t\tconst totalMins = Math.ceil(diffMs / 60000);\n\t\tconst days = Math.floor(totalMins / 1440);\n\t\tconst hours = Math.floor((totalMins % 1440) / 60);\n\t\tconst mins = totalMins % 60;\n\t\tconst isWeekly = days >= 1;\n\n\t\tconst countdown = days > 0\n\t\t\t? `${days}${t('duration.day')} ${hours}${t('duration.hour')}`\n\t\t\t: hours > 0 ? `${hours}${t('duration.hour')} ${mins}${t('duration.minute')}` : `${mins}${t('duration.minute')}`;\n\t\tconst hh = d.getHours().toString().padStart(2, '0');\n\t\tconst mm = d.getMinutes().toString().padStart(2, '0');\n\t\tconst resetText = isWeekly\n\t\t\t? `${d.getMonth() + 1}/${d.getDate()} ${hh}:${mm} (${countdown})`\n\t\t\t: `${hh}:${mm} (${countdown})`;\n\n\t\treturn { resetText, expired: false };\n\t} catch {\n\t\treturn { resetText: '', expired: true };\n\t}\n}\n\ntype BrandKey = keyof typeof BRAND_PATHS;\ntype UiIconKey = keyof typeof UI_PATHS;\n\n/** Inline brand logo (Gemini / Claude / OpenAI) as a crisp SVG mark. */\nfunction brandIcon(key: BrandKey, size = 13): unknown {\n\treturn h('svg', {\n\t\tviewBox: '0 0 24 24',\n\t\twidth: size,\n\t\theight: size,\n\t\t'aria-hidden': true,\n\t\tstyle: { display: 'inline-block', verticalAlign: '-2px', flexShrink: 0 },\n\t}, h('path', { d: BRAND_PATHS[key], fill: BRAND_COLORS[key] }));\n}\n\n/** Clean outline/filled SVG icon (Lucide-style), zero emoji dependency. */\nfunction uiIcon(key: UiIconKey, size = 12, color = 'currentColor'): unknown {\n\tconst p = UI_PATHS[key];\n\tconst isFilled = key === 'star';\n\treturn h('svg', {\n\t\tviewBox: '0 0 24 24',\n\t\twidth: size,\n\t\theight: size,\n\t\t'aria-hidden': true,\n\t\tstyle: { display: 'inline-block', verticalAlign: '-1.5px', flexShrink: 0 },\n\t}, h('path', {\n\t\td: p,\n\t\tfill: isFilled ? color : 'none',\n\t\tstroke: isFilled ? 'none' : color,\n\t\t'stroke-width': isFilled ? undefined : 2,\n\t\t'stroke-linecap': isFilled ? undefined : 'round',\n\t\t'stroke-linejoin': isFilled ? undefined : 'round',\n\t}));\n}\n\nconst FAMILY_BRAND: Record<'google' | 'argon' | 'anthropic' | 'openai', BrandKey> = {\n\tgoogle: 'gemini',\n\t// Gemini 4 Argon is a Google model — it keeps the Gemini mark.\n\targon: 'gemini',\n\tanthropic: 'claude',\n\topenai: 'openai',\n};\n\n/**\n * Antigravity logo mark: 3D orbit sphere with specular highlight, luminous front/back rings\n * and twin satellite nodes matching the official assets/icon.svg.\n */\nfunction agyIcon(size = 16): unknown {\n\tconst uid = 'agy-logo';\n\treturn h('svg', {\n\t\tviewBox: '0 0 36 36',\n\t\twidth: size,\n\t\theight: size,\n\t\tfill: 'none',\n\t\t'aria-hidden': true,\n\t\tstyle: { display: 'inline-block', verticalAlign: '-2.5px', flexShrink: 0 },\n\t},\n\t\th('defs', null,\n\t\t\th('linearGradient', { id: `${uid}-orb`, x1: '12', y1: '11', x2: '25', y2: '25', gradientUnits: 'userSpaceOnUse' },\n\t\t\t\th('stop', { offset: '0%', 'stop-color': '#38BDF8' }),\n\t\t\t\th('stop', { offset: '45%', 'stop-color': '#6366F1' }),\n\t\t\t\th('stop', { offset: '85%', 'stop-color': '#9333EA' }),\n\t\t\t\th('stop', { offset: '100%', 'stop-color': '#C026D3' }),\n\t\t\t),\n\t\t\th('linearGradient', { id: `${uid}-rf`, x1: '6', y1: '24', x2: '31', y2: '12', gradientUnits: 'userSpaceOnUse' },\n\t\t\t\th('stop', { offset: '0%', 'stop-color': '#00D2FF' }),\n\t\t\t\th('stop', { offset: '40%', 'stop-color': '#38BDF8' }),\n\t\t\t\th('stop', { offset: '70%', 'stop-color': '#818CF8' }),\n\t\t\t\th('stop', { offset: '100%', 'stop-color': '#F43F5E' }),\n\t\t\t),\n\t\t\th('linearGradient', { id: `${uid}-rb`, x1: '7', y1: '12', x2: '29', y2: '24', gradientUnits: 'userSpaceOnUse' },\n\t\t\t\th('stop', { offset: '0%', 'stop-color': '#38BDF8', 'stop-opacity': '0.4' }),\n\t\t\t\th('stop', { offset: '100%', 'stop-color': '#A855F7', 'stop-opacity': '0.4' }),\n\t\t\t),\n\t\t\th('linearGradient', { id: `${uid}-hl`, x1: '14', y1: '12', x2: '19', y2: '18', gradientUnits: 'userSpaceOnUse' },\n\t\t\t\th('stop', { offset: '0%', 'stop-color': '#FFFFFF', 'stop-opacity': '0.65' }),\n\t\t\t\th('stop', { offset: '100%', 'stop-color': '#FFFFFF', 'stop-opacity': '0.05' }),\n\t\t\t),\n\t\t),\n\t\th('path', {\n\t\t\td: 'M 6.8 14.2 C 8.2 9.6 17.8 7.2 26.2 10.8 C 28.0 11.6 29.3 12.6 30.2 13.8',\n\t\t\tstroke: `url(#${uid}-rb)`,\n\t\t\t'stroke-width': '2.4',\n\t\t\t'stroke-linecap': 'round',\n\t\t}),\n\t\th('circle', { cx: 18, cy: 18, r: 7.5, fill: `url(#${uid}-orb)` }),\n\t\th('path', {\n\t\t\td: 'M 13.2 15.2 A 5.5 5.5 0 0 1 21.0 13.0 A 6.2 6.2 0 0 0 14.0 18.0 Z',\n\t\t\tfill: `url(#${uid}-hl)`,\n\t\t}),\n\t\th('path', {\n\t\t\td: 'M 30.2 13.8 C 31.4 18.2 21.8 26.2 12.8 24.2 C 9.4 23.4 7.4 21.8 6.6 19.6',\n\t\t\tstroke: `url(#${uid}-rf)`,\n\t\t\t'stroke-width': '2.6',\n\t\t\t'stroke-linecap': 'round',\n\t\t}),\n\t\th('circle', { cx: 8.2, cy: 18.2, r: 2.2, fill: '#00D2FF' }),\n\t\th('circle', { cx: 8.2, cy: 18.2, r: 1.0, fill: '#FFFFFF' }),\n\t\th('circle', { cx: 28.4, cy: 20.4, r: 1.8, fill: '#F43F5E' }),\n\t\th('circle', { cx: 28.4, cy: 20.4, r: 0.8, fill: '#FFFFFF' }),\n\t);\n}\n\n/**\n * Settings dialog navigation icon replacement for Antigravity.\n * DSH settings shell projects nav glyphs from a closed list and falls back to a generic gear\n * for third-party sections. We dynamically inject a stylesheet matching Antigravity's section\n * row to display the custom Antigravity brand logo.\n\n */\nfunction renderFamilyQuotaBar(\n\tt: (key: AgyLocaleKey) => string,\n\tlabel: string,\n\tfamilyKey: 'google' | 'argon' | 'anthropic' | 'openai',\n\tacc: ManagedAccount,\n\tisRefreshing = false,\n): unknown {\n\tconst info = acc.quotas[familyKey];\n\tconst cd = acc.cooldowns[familyKey];\n\tconst inCooldown = cd && cd.cooldownUntil > Date.now();\n\n\t// 5-Hour limit\n\tconst has5h = typeof info?.remainingFraction === 'number' && Number.isFinite(info.remainingFraction);\n\tconst pct5h = has5h ? Math.max(0, Math.min(100, Math.round(info!.remainingFraction! * 100))) : -1;\n\t// Cooldown is a LOCAL heuristic — never overwrite the server-reported\n\t// fraction with 0% (a ghost cooldown used to show a 98%-full account as\n\t// empty). Surface it as a note next to the reset time instead.\n\tconst cdNote = inCooldown ? t('account.localCooldown') : '';\n\tconst w5h = formatQuotaWindow(t, info?.resetTime);\n\t// Full-quota rows: the backend keeps the LAST window's resetTime, so\n\t// the row would go silently blank. When the time has expired but the\n\t// fraction is full, say \"已重置\" instead — the quota is usable now.\n\tconst expiredFull5h = w5h.expired && has5h && pct5h >= 100;\n\n\t// Weekly limit\n\tconst hasWeekly = typeof info?.weeklyFraction === 'number' && Number.isFinite(info.weeklyFraction);\n\tconst pctWeekly = hasWeekly ? Math.max(0, Math.min(100, Math.round(info!.weeklyFraction! * 100))) : -1;\n\tconst wWeekly = formatQuotaWindow(t, info?.weeklyResetTime);\n\tconst expiredFullWeekly = wWeekly.expired && hasWeekly && pctWeekly >= 100;\n\n\tconst getColors = (pct: number) => {\n\t\tif (pct < 0) {\n\t\t\treturn {\n\t\t\t\tbar: 'var(--agy-quota-none-border)',\n\t\t\t\ttext: 'var(--agy-quota-none-text)',\n\t\t\t\tbg: 'var(--agy-quota-none-bg)',\n\t\t\t\tborder: 'var(--agy-quota-none-border)',\n\t\t\t};\n\t\t}\n\t\tif (pct <= 20) {\n\t\t\treturn {\n\t\t\t\tbar: 'linear-gradient(90deg, #dc2626, #ef4444)',\n\t\t\t\ttext: 'var(--agy-quota-low-text)',\n\t\t\t\tbg: 'var(--agy-quota-low-bg)',\n\t\t\t\tborder: 'var(--agy-quota-low-border)',\n\t\t\t};\n\t\t}\n\t\tif (pct <= 50) {\n\t\t\treturn {\n\t\t\t\tbar: 'linear-gradient(90deg, #d97706, #f59e0b)',\n\t\t\t\ttext: 'var(--agy-quota-med-text)',\n\t\t\t\tbg: 'var(--agy-quota-med-bg)',\n\t\t\t\tborder: 'var(--agy-quota-med-border)',\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tbar: 'linear-gradient(90deg, #059669, #10b981)',\n\t\t\ttext: 'var(--agy-quota-high-text)',\n\t\t\tbg: 'var(--agy-quota-high-bg)',\n\t\t\tborder: 'var(--agy-quota-high-border)',\n\t\t};\n\t};\n\n\tconst c5h = getColors(pct5h);\n\tconst cWeekly = getColors(pctWeekly);\n\n\tconst renderLine = (windowName: string, percent: number, c: { bar: string; text: string; bg: string; border: string }, resetStr: string, rawFraction?: number, rawReset?: string) => {\n\t\tconst isShimmer = percent < 0 || isRefreshing;\n\t\tconst tooltipText = typeof rawFraction === 'number'\n\t\t\t? `${(rawFraction * 100).toFixed(1)}% (raw: ${rawFraction})${rawReset ? ` · reset: ${rawReset}` : ''}`\n\t\t\t: resetStr ? `↻ ${resetStr}` : undefined;\n\t\treturn h('div', { style: { display: 'flex', alignItems: 'center', fontSize: '11.5px', margin: '4px 0' } },\n\t\t\th('span', { style: { width: '52px', color: 'var(--agy-text-window-label)', fontSize: '11px', fontWeight: 700, flexShrink: 0 } }, windowName),\n\t\t\th('div', {\n\t\t\t\tclassName: isShimmer ? 'agy-shimmer-track' : '',\n\t\t\t\tstyle: S.progressBarBg,\n\t\t\t},\n\t\t\t\th('div', {\n\t\t\t\t\tclassName: 'agy-progress-fill',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\twidth: `${percent < 0 ? 100 : percent}%`,\n\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\tbackground: c.bar,\n\t\t\t\t\t\tborderRadius: '3px',\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t\t\th('div', { style: { display: 'inline-flex', alignItems: 'center', gap: '8px', minWidth: '140px', justifyContent: 'flex-end', flexShrink: 0 } },\n\t\t\t\th('span', {\n\t\t\t\t\ttitle: tooltipText,\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '2px 7px',\n\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\tbackground: c.bg,\n\t\t\t\t\t\tcolor: c.text,\n\t\t\t\t\t\tborder: `1px solid ${c.border}`,\n\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\tfontSize: '11.5px',\n\t\t\t\t\t\tlineHeight: 1.2,\n\t\t\t\t\t\tcursor: tooltipText ? 'help' : 'default',\n\t\t\t\t\t},\n\t\t\t\t}, percent < 0 ? '—' : `${percent}%`),\n\t\t\t\tresetStr ? h('span', { style: { color: 'var(--agy-text-secondary)', fontSize: '11px', fontWeight: 500 } }, `↻ ${resetStr}`) : null,\n\t\t\t),\n\t\t);\n\t};\n\n\treturn h('div', { style: { margin: '6px 0', padding: '8px 10px', background: 'var(--agy-bg-subbox)', borderRadius: '7px', border: '1px solid var(--agy-border-box)' } },\n\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '6px', fontWeight: 700, fontSize: '12.5px', marginBottom: '5px', color: 'var(--agy-text-primary)' } },\n\t\t\tbrandIcon(FAMILY_BRAND[familyKey], 14),\n\t\t\th('span', null, label),\n\t\t),\n\t\t// Argon is a WEEKLY-only counter today: render the 5h row only when\n\t\t// the backend actually reports one, never as a permanent \"—\" ghost.\n\t\t(familyKey !== 'argon' || has5h) ? renderLine(t('quota.fiveHour'), pct5h, c5h, w5h.resetText ? w5h.resetText + cdNote : expiredFull5h ? t('quota.windowReset') + cdNote : cdNote.replace(/^ · /, ''), info?.remainingFraction, info?.resetTime) : null,\n\t\trenderLine(t('quota.weekly'), pctWeekly, cWeekly, wWeekly.resetText ? wWeekly.resetText : expiredFullWeekly ? t('quota.windowReset') : '', info?.weeklyFraction, info?.weeklyResetTime),\n\t);\n}\n\n/**\n * The console's own stylesheet.\n *\n * Ported keys and rules are unchanged, but every custom property is declared on\n * `.agy-console` instead of `:root`/`body`: the standalone plugin owned the whole\n * document, while here the console is one section of FusionSettings and must not\n * repaint Fusion's pages or DSH's theme. The component renders this text inline,\n * which is the same pattern FusionSettings uses for its own CSS.\n */\nexport const AGY_CONSOLE_CSS = `\n@keyframes agy-spin {\n\t0% { transform: rotate(0deg); }\n\t100% { transform: rotate(360deg); }\n}\n\n.agy-console {\n\t--agy-font-family: var(--dsw-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"PingFang SC\", \"Microsoft YaHei\", sans-serif);\n\t--agy-bg-panel: var(--dsw-alias-bg-layer-2, #ffffff);\n\t--agy-bg-card: var(--dsw-alias-bg-layer-2, #ffffff);\n\t--agy-bg-card-primary: #f0f7ff;\n\t--agy-bg-header: var(--dsw-alias-bg-layer-1, #f8fafc);\n\t--agy-bg-box: var(--dsw-alias-bg-layer-1, #f8fafc);\n\t--agy-bg-subbox: var(--dsw-alias-bg-layer-3, #f1f5f9);\n\t--agy-bg-input: var(--dsw-alias-bg-layer-1, #ffffff);\n\t--agy-bg-btn: var(--dsw-alias-bg-layer-3, #f1f5f9);\n\t--agy-bg-btn-hover: var(--dsw-alias-interactive-bg-hover, #e2e8f0);\n\t--agy-bg-btn-primary: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-bg-progress-track: #e2e8f0;\n\n\t--agy-border-card: var(--dsw-alias-border-l2, #e2e8f0);\n\t--agy-border-card-primary: #3b82f6;\n\t--agy-border-box: var(--dsw-alias-border-l1, #e2e8f0);\n\t--agy-border-subbox: var(--dsw-alias-border-l2, #cbd5e1);\n\t--agy-border-input: var(--dsw-alias-border-l2, #cbd5e1);\n\t--agy-border-input-focus: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-border-btn: var(--dsw-alias-border-l2, #cbd5e1);\n\t--agy-border-btn-primary: #2563eb;\n\t--agy-border-divider: var(--dsw-alias-border-l2, #e2e8f0);\n\n\t--agy-text-primary: var(--dsw-alias-label-primary, #0f172a);\n\t--agy-text-secondary: var(--dsw-alias-label-secondary, #334155);\n\t--agy-text-tertiary: var(--dsw-alias-label-tertiary, #64748b);\n\t--agy-text-muted: var(--dsw-alias-label-caption, #94a3b8);\n\t--agy-text-btn: var(--dsw-alias-label-primary, #0f172a);\n\t--agy-text-btn-primary: #ffffff;\n\t--agy-text-window-label: #2563eb;\n\n\t--agy-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.05);\n\t--agy-shadow-card-hover: 0 4px 12px rgba(0, 0, 0, 0.08);\n\t--agy-shadow-card-primary: 0 0 0 1px #3b82f6, 0 4px 14px rgba(37, 99, 235, 0.12);\n\t--agy-shadow-modal: 0 20px 50px rgba(0, 0, 0, 0.18);\n\t--agy-modal-backdrop: rgba(15, 23, 42, 0.5);\n\n\t/* Badges */\n\t--agy-badge-primary-bg: #dbeafe;\n\t--agy-badge-primary-text: #1e40af;\n\t--agy-badge-primary-border: #60a5fa;\n\n\t--agy-badge-tag-bg: #f1f5f9;\n\t--agy-badge-tag-text: #334155;\n\t--agy-badge-tag-border: #cbd5e1;\n\n\t--agy-badge-email-bg: #eff6ff;\n\t--agy-badge-email-text: #1d4ed8;\n\t--agy-badge-email-border: #bfdbfe;\n\n\t--agy-badge-proxy-bg: #ecfdf5;\n\t--agy-badge-proxy-text: #047857;\n\t--agy-badge-proxy-border: #a7f3d0;\n\n\t--agy-badge-ready-bg: #ecfdf5;\n\t--agy-badge-ready-text: #047857;\n\t--agy-badge-ready-border: #a7f3d0;\n\n\t--agy-badge-unready-bg: #eff6ff;\n\t--agy-badge-unready-text: #1d4ed8;\n\t--agy-badge-unready-border: #bfdbfe;\n\n\t/* Quota status pills */\n\t--agy-quota-high-bg: #ecfdf5;\n\t--agy-quota-high-text: #047857;\n\t--agy-quota-high-border: #a7f3d0;\n\t--agy-quota-med-bg: #fffbeb;\n\t--agy-quota-med-text: #b45309;\n\t--agy-quota-med-border: #fde68a;\n\t--agy-quota-low-bg: #fef2f2;\n\t--agy-quota-low-text: #b91c1c;\n\t--agy-quota-low-border: #fecaca;\n\t--agy-quota-none-bg: #f1f5f9;\n\t--agy-quota-none-text: #64748b;\n\t--agy-quota-none-border: #cbd5e1;\n\n\t/* Danger button */\n\t--agy-danger-bg: #fef2f2;\n\t--agy-danger-text: #b91c1c;\n\t--agy-danger-border: #fecaca;\n\t--agy-danger-hover-bg: #fee2e2;\n\n\t/* Warning banner */\n\t--agy-warn-bg: #fffbeb;\n\t--agy-warn-text: #92400e;\n\t--agy-warn-border: #fcd34d;\n\t--agy-warn-btn-bg: #fef3c7;\n\t--agy-warn-btn-text: #92400e;\n\t--agy-warn-btn-border: #f59e0b;\n\n\t/* Toast notices */\n\t--agy-toast-success-bg: #ecfdf5;\n\t--agy-toast-success-text: #065f46;\n\t--agy-toast-success-border: #6ee7b7;\n\t--agy-toast-info-bg: #eff6ff;\n\t--agy-toast-info-text: #1e40af;\n\t--agy-toast-info-border: #93c5fd;\n\t--agy-toast-warn-bg: #fffbeb;\n\t--agy-toast-warn-text: #92400e;\n\t--agy-toast-warn-border: #fcd34d;\n\t--agy-toast-error-bg: #fef2f2;\n\t--agy-toast-error-text: #991b1b;\n\t--agy-toast-error-border: #fca5a5;\n\n\t/* Auth Modal / Box */\n\t--agy-auth-box-bg: #f0f7ff;\n\t--agy-auth-box-border: #3b82f6;\n\n\t/* Segment control */\n\t--agy-seg-group-bg: #e2e8f0;\n\t--agy-seg-group-border: #cbd5e1;\n\t--agy-seg-btn-text: #475569;\n\t--agy-seg-btn-active-bg: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-seg-btn-active-text: #ffffff;\n\t--agy-seg-danger-bg: #dc2626;\n\t--agy-seg-danger-text: #ffffff;\n\t--agy-seg-danger-border: #b91c1c;\n}\n\n:where(body[data-ds-dark-theme], body.dark, [data-theme=\"dark\"]) .agy-console {\n\t--agy-bg-panel: var(--dsw-alias-bg-layer-2, #0f172a);\n\t--agy-bg-card: var(--dsw-alias-bg-layer-2, #1e293b);\n\t--agy-bg-card-primary: #111d33;\n\t--agy-bg-header: var(--dsw-alias-bg-layer-1, #1e293b);\n\t--agy-bg-box: var(--dsw-alias-bg-layer-1, #0f172a);\n\t--agy-bg-subbox: var(--dsw-alias-bg-layer-3, #090d16);\n\t--agy-bg-input: var(--dsw-alias-bg-layer-3, #090d16);\n\t--agy-bg-btn: var(--dsw-alias-bg-layer-3, #334155);\n\t--agy-bg-btn-hover: var(--dsw-alias-interactive-bg-hover, #475569);\n\t--agy-bg-btn-primary: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-bg-progress-track: #1e293b;\n\n\t--agy-border-card: var(--dsw-alias-border-l2, #334155);\n\t--agy-border-card-primary: #3b82f6;\n\t--agy-border-box: var(--dsw-alias-border-l1, #1e293b);\n\t--agy-border-subbox: var(--dsw-alias-border-l2, #334155);\n\t--agy-border-input: var(--dsw-alias-border-l2, #334155);\n\t--agy-border-input-focus: #3b82f6;\n\t--agy-border-btn: var(--dsw-alias-border-l2, #475569);\n\t--agy-border-btn-primary: #3b82f6;\n\t--agy-border-divider: var(--dsw-alias-border-l2, #334155);\n\n\t--agy-text-primary: var(--dsw-alias-label-primary, #f8fafc);\n\t--agy-text-secondary: var(--dsw-alias-label-secondary, #cbd5e1);\n\t--agy-text-tertiary: var(--dsw-alias-label-tertiary, #94a3b8);\n\t--agy-text-muted: var(--dsw-alias-label-caption, #64748b);\n\t--agy-text-btn: var(--dsw-alias-label-primary, #ffffff);\n\t--agy-text-btn-primary: #ffffff;\n\t--agy-text-window-label: #93c5fd;\n\n\t--agy-shadow-card: 0 2px 8px rgba(0, 0, 0, 0.3);\n\t--agy-shadow-card-hover: 0 6px 16px rgba(0, 0, 0, 0.4);\n\t--agy-shadow-card-primary: 0 0 16px rgba(59, 130, 246, 0.25);\n\t--agy-shadow-modal: 0 25px 60px rgba(0, 0, 0, 0.8);\n\t--agy-modal-backdrop: rgba(0, 0, 0, 0.75);\n\n\t/* Badges */\n\t--agy-badge-primary-bg: #1e3a8a;\n\t--agy-badge-primary-text: #93c5fd;\n\t--agy-badge-primary-border: #3b82f6;\n\n\t--agy-badge-tag-bg: #0f172a;\n\t--agy-badge-tag-text: #cbd5e1;\n\t--agy-badge-tag-border: #334155;\n\n\t--agy-badge-email-bg: #1e293b;\n\t--agy-badge-email-text: #93c5fd;\n\t--agy-badge-email-border: #3b82f6;\n\n\t--agy-badge-proxy-bg: #064e3b;\n\t--agy-badge-proxy-text: #6ee7b7;\n\t--agy-badge-proxy-border: #059669;\n\n\t--agy-badge-ready-bg: rgba(16, 185, 129, 0.15);\n\t--agy-badge-ready-text: #34d399;\n\t--agy-badge-ready-border: rgba(16, 185, 129, 0.35);\n\n\t--agy-badge-unready-bg: rgba(59, 130, 246, 0.15);\n\t--agy-badge-unready-text: #93c5fd;\n\t--agy-badge-unready-border: rgba(59, 130, 246, 0.35);\n\n\t/* Quota status pills */\n\t--agy-quota-high-bg: #064e3b;\n\t--agy-quota-high-text: #6ee7b7;\n\t--agy-quota-high-border: #059669;\n\t--agy-quota-med-bg: #451a03;\n\t--agy-quota-med-text: #fde68a;\n\t--agy-quota-med-border: #d97706;\n\t--agy-quota-low-bg: #450a0a;\n\t--agy-quota-low-text: #fca5a5;\n\t--agy-quota-low-border: #dc2626;\n\t--agy-quota-none-bg: #1e293b;\n\t--agy-quota-none-text: #94a3b8;\n\t--agy-quota-none-border: #475569;\n\n\t/* Danger button */\n\t--agy-danger-bg: #450a0a;\n\t--agy-danger-text: #fca5a5;\n\t--agy-danger-border: #ef4444;\n\t--agy-danger-hover-bg: #5f1313;\n\n\t/* Warning banner */\n\t--agy-warn-bg: #451a03;\n\t--agy-warn-text: #fde68a;\n\t--agy-warn-border: #d97706;\n\t--agy-warn-btn-bg: #78350f;\n\t--agy-warn-btn-text: #fde68a;\n\t--agy-warn-btn-border: #d97706;\n\n\t/* Toast notices */\n\t--agy-toast-success-bg: #064e3b;\n\t--agy-toast-success-text: #6ee7b7;\n\t--agy-toast-success-border: #059669;\n\t--agy-toast-info-bg: #1e3a8a;\n\t--agy-toast-info-text: #93c5fd;\n\t--agy-toast-info-border: #3b82f6;\n\t--agy-toast-warn-bg: #451a03;\n\t--agy-toast-warn-text: #fde68a;\n\t--agy-toast-warn-border: #d97706;\n\t--agy-toast-error-bg: #450a0a;\n\t--agy-toast-error-text: #fca5a5;\n\t--agy-toast-error-border: #dc2626;\n\n\t/* Auth Modal / Box */\n\t--agy-auth-box-bg: #0f223a;\n\t--agy-auth-box-border: #3b82f6;\n\n\t/* Segment control */\n\t--agy-seg-group-bg: #090d16;\n\t--agy-seg-group-border: #334155;\n\t--agy-seg-btn-text: #94a3b8;\n\t--agy-seg-btn-active-bg: var(--dsw-alias-state-business-primary, #2563eb);\n\t--agy-seg-btn-active-text: #ffffff;\n\t--agy-seg-danger-bg: #7f1d1d;\n\t--agy-seg-danger-text: #fca5a5;\n\t--agy-seg-danger-border: #ef4444;\n}\n\n.agy-spinner {\n\tdisplay: inline-block;\n\twidth: 12px;\n\theight: 12px;\n\tborder: 2px solid currentColor;\n\tborder-top-color: transparent;\n\tborder-radius: 50%;\n\tanimation: agy-spin 0.75s linear infinite;\n\tvertical-align: -2px;\n\tmargin-right: 5px;\n}\n.agy-pulse-dot {\n\tdisplay: inline-block;\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n}\n.agy-card-hover {\n\ttransition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.18s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s ease;\n}\n.agy-card-hover:hover {\n\tborder-color: var(--agy-border-card-primary, #3b82f6) !important;\n\tbox-shadow: var(--agy-shadow-card-hover) !important;\n}\n\n.agy-btn {\n\ttransition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, filter 0.15s ease, transform 0.15s ease;\n\tuser-select: none;\n}\n.agy-btn:hover:not(:disabled) {\n\tfilter: brightness(1.08);\n\ttransform: translateY(-0.5px);\n}\n.agy-btn:active:not(:disabled) {\n\ttransform: translateY(0.5px);\n}\n.agy-progress-fill {\n\ttransition: width 0.4s cubic-bezier(0.16, 1, 0.3, 1);\n}\n@keyframes agy-shimmer {\n\t0% { transform: translateX(-100%); }\n\t100% { transform: translateX(100%); }\n}\n.agy-shimmer-track {\n\tposition: relative;\n\toverflow: hidden;\n\tcontain: paint;\n\ttransform: translateZ(0);\n\tisolation: isolate;\n}\n.agy-shimmer-track::after {\n\tcontent: '';\n\tposition: absolute;\n\ttop: 0; left: 0; right: 0; bottom: 0;\n\tbackground: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.22) 50%, transparent 100%);\n\ttransform: translateX(-100%) translateZ(0);\n\twill-change: transform;\n\tanimation: agy-shimmer 1.8s infinite ease-in-out;\n\tpointer-events: none;\n}\n.agy-modal-backdrop {\n\tposition: fixed;\n\tinset: 0;\n\tz-index: 9999;\n\tbackground: var(--agy-modal-backdrop);\n\t/* NO full-screen backdrop blur here. Filtering the whole viewport forces\n\t Chromium/Electron to re-sample the page every frame while anything behind\n\t it moves (scroll, streaming, animations) — the recurring \"打开控制台后滚动\n\t 闪屏\" root cause. The rgba dim below is stable and flicker-free. */\n\toverscroll-behavior: contain;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 16px;\n\tbox-sizing: border-box;\n}\n/* While the console is open, freeze the conversation scroller behind it so\n nothing moves/reflows under the fixed overlay. scrollbar-gutter:stable on the\n host scroller keeps the width from jumping when overflow flips to hidden. */\nhtml.agy-console-modal-open [data-conversation-scroll] {\n\toverflow: hidden !important;\n\toverscroll-behavior: contain;\n}\n.agy-modal-panel {\n\tposition: relative;\n\twidth: 100%;\n\tmax-width: 640px;\n\tmax-height: min(820px, calc(100vh - 48px));\n\tbackground: var(--agy-bg-panel);\n\tborder: 1px solid var(--agy-border-card);\n\tborder-radius: 14px;\n\tbox-shadow: var(--agy-shadow-modal);\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n\tcolor: var(--agy-text-primary);\n\tfont-family: var(--agy-font-family);\n\ttransform: translateZ(0);\n\tcontain: content;\n}\n.agy-submodel-row {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 7px 10px;\n\tfont-size: 11.5px;\n\tborder-radius: 6px;\n\tbackground: var(--agy-bg-subbox);\n\tborder: 1px solid var(--agy-border-box);\n\tmargin: 4px 0;\n\tcolor: var(--agy-text-primary);\n}\n`;\n\nconst S: Record<string, Record<string, unknown>> = {\n\tcontainer: {\n\t\tlineHeight: 1.5,\n\t\tfontSize: '13px',\n\t\tfontFamily: 'var(--agy-font-family)',\n\t\tcolor: 'var(--agy-text-primary)',\n\t},\n\theaderCard: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'space-between',\n\t\tpadding: '12px 16px',\n\t\tbackground: 'var(--agy-bg-header)',\n\t\tborder: '1px solid var(--agy-border-card)',\n\t\tborderRadius: '10px',\n\t\tmarginBottom: '12px',\n\t\tcolor: 'var(--agy-text-primary)',\n\t\tboxShadow: 'var(--agy-shadow-card)',\n\t},\n\tbadgePrimary: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: '4px',\n\t\tbackground: 'var(--agy-badge-primary-bg)',\n\t\tcolor: 'var(--agy-badge-primary-text)',\n\t\tborder: '1px solid var(--agy-badge-primary-border)',\n\t\tpadding: '2px 8px',\n\t\tborderRadius: '5px',\n\t\tfontSize: '11px',\n\t\tfontWeight: 700,\n\t},\n\tbadgeTag: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: '4px',\n\t\tbackground: 'var(--agy-badge-tag-bg)',\n\t\tcolor: 'var(--agy-badge-tag-text)',\n\t\tborder: '1px solid var(--agy-badge-tag-border)',\n\t\tpadding: '2px 7px',\n\t\tborderRadius: '5px',\n\t\tfontSize: '11px',\n\t\tfontWeight: 600,\n\t},\n\tbadgeReady: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: '4px',\n\t\tbackground: 'var(--agy-badge-ready-bg)',\n\t\tcolor: 'var(--agy-badge-ready-text)',\n\t\tborder: '1px solid var(--agy-badge-ready-border)',\n\t\tpadding: '2px 8px',\n\t\tborderRadius: '5px',\n\t\tfontSize: '11px',\n\t\tfontWeight: 700,\n\t},\n\tbadgeUnready: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tgap: '4px',\n\t\tbackground: 'var(--agy-badge-unready-bg)',\n\t\tcolor: 'var(--agy-badge-unready-text)',\n\t\tborder: '1px solid var(--agy-badge-unready-border)',\n\t\tpadding: '2px 8px',\n\t\tborderRadius: '5px',\n\t\tfontSize: '11px',\n\t\tfontWeight: 700,\n\t},\n\tcard: {\n\t\tbackground: 'var(--agy-bg-card)',\n\t\tborder: '1px solid var(--agy-border-card)',\n\t\tborderRadius: '8px',\n\t\tpadding: '10px 14px',\n\t\tmarginBottom: '8px',\n\t\tcolor: 'var(--agy-text-primary)',\n\t\tboxShadow: 'var(--agy-shadow-card)',\n\t\ttransition: 'border-color 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease',\n\t},\n\tcardPrimary: {\n\t\tbackground: 'var(--agy-bg-card)',\n\t\tborder: '1px solid var(--agy-border-card)',\n\t\tborderRadius: '8px',\n\t\tpadding: '10px 14px',\n\t\tmarginBottom: '8px',\n\t\tcolor: 'var(--agy-text-primary)',\n\t\tboxShadow: 'var(--agy-shadow-card)',\n\t\ttransition: 'border-color 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease',\n\t},\n\tquotaBox: {\n\t\tbackground: 'var(--agy-bg-box)',\n\t\tborder: '1px solid var(--agy-border-box)',\n\t\tborderRadius: '8px',\n\t\tpadding: '8px 10px',\n\t\tmarginTop: '8px',\n\t},\n\tprogressBarBg: {\n\t\tflex: '1',\n\t\theight: '8px',\n\t\tborderRadius: '4px',\n\t\tbackground: 'var(--agy-bg-progress-track)',\n\t\tborder: '1px solid var(--agy-border-box)',\n\t\toverflow: 'hidden',\n\t\tmargin: '0 10px',\n\t},\n\tbtn: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '5px 12px',\n\t\tborderRadius: '6px',\n\t\tborder: '1px solid var(--agy-border-btn)',\n\t\tbackground: 'var(--agy-bg-btn)',\n\t\tcolor: 'var(--agy-text-btn)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '12px',\n\t\tfontWeight: 600,\n\t},\n\tbtnPrimary: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '5px 13px',\n\t\tborderRadius: '6px',\n\t\tborder: '1px solid var(--agy-border-btn-primary)',\n\t\tbackground: 'var(--agy-bg-btn-primary)',\n\t\tcolor: 'var(--agy-text-btn-primary)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '12px',\n\t\tfontWeight: 700,\n\t\tboxShadow: '0 2px 6px rgba(37, 99, 235, 0.35)',\n\t},\n\tbtnDanger: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '4px 9px',\n\t\tborderRadius: '6px',\n\t\tborder: '1px solid var(--agy-danger-border)',\n\t\tbackground: 'var(--agy-danger-bg)',\n\t\tcolor: 'var(--agy-danger-text)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11px',\n\t\tfontWeight: 600,\n\t},\n\tbtnSm: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '4px 9px',\n\t\tborderRadius: '5px',\n\t\tborder: '1px solid var(--agy-border-btn)',\n\t\tbackground: 'var(--agy-bg-btn)',\n\t\tcolor: 'var(--agy-text-btn)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11.5px',\n\t\tfontWeight: 600,\n\t},\n\tbtnSmPrimary: {\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tpadding: '4px 9px',\n\t\tborderRadius: '5px',\n\t\tborder: '1px solid var(--agy-border-btn-primary)',\n\t\tbackground: 'var(--agy-bg-btn-primary)',\n\t\tcolor: 'var(--agy-text-btn-primary)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11.5px',\n\t\tfontWeight: 700,\n\t},\n\tsegGroup: {\n\t\tdisplay: 'inline-flex',\n\t\tbackground: 'var(--agy-seg-group-bg)',\n\t\tborderRadius: '7px',\n\t\tpadding: '3px',\n\t\tborder: '1px solid var(--agy-seg-group-border)',\n\t},\n\tsegBtn: {\n\t\tpadding: '4px 10px',\n\t\tborderRadius: '4px',\n\t\tborder: 'none',\n\t\tbackground: 'transparent',\n\t\tcolor: 'var(--agy-seg-btn-text)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11.5px',\n\t\tfontWeight: 600,\n\t},\n\tsegBtnActive: {\n\t\tpadding: '4px 10px',\n\t\tborderRadius: '4px',\n\t\tborder: 'none',\n\t\tbackground: 'var(--agy-seg-btn-active-bg)',\n\t\tcolor: 'var(--agy-seg-btn-active-text)',\n\t\tcursor: 'pointer',\n\t\tfontSize: '11.5px',\n\t\tfontWeight: 700,\n\t\tboxShadow: '0 2px 4px rgba(37, 99, 235, 0.4)',\n\t},\n\tinput: {\n\t\tflex: '1',\n\t\tpadding: '7px 12px',\n\t\tborderRadius: '6px',\n\t\tborder: '1.5px solid var(--agy-border-input)',\n\t\tbackground: 'var(--agy-bg-input)',\n\t\tcolor: 'var(--agy-text-primary)',\n\t\tfontSize: '12.5px',\n\t\toutline: 'none',\n\t},\n\tmuted: { color: 'var(--agy-text-tertiary)', fontSize: '11.5px' },\n\tnoticeBanner: {\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'space-between',\n\t\tpadding: '10px 14px',\n\t\tborderRadius: '8px',\n\t\tmarginBottom: '12px',\n\t\tfontSize: '12.5px',\n\t\tfontWeight: 500,\n\t},\n\tauthModal: {\n\t\tbackground: 'var(--agy-auth-box-bg)',\n\t\tborder: '1.5px solid var(--agy-auth-box-border)',\n\t\tborderRadius: '10px',\n\t\tpadding: '14px 16px',\n\t\tmarginBottom: '14px',\n\t\tcolor: 'var(--agy-text-primary)',\n\t},\n};\n\n/**\n * Register the `agy-worker` dictionaries and the two languages DSH does not ship.\n * Idempotent: an existing dictionary is kept (equivalent content), and a\n * language the Host already owns is never added twice.\n */\nexport function registerAgyLocale(locale: AgyLocaleSource): () => void {\n\tconst addLanguageIfMissing = (language: { id: string; label: string; fallback: string }): (() => void) => {\n\t\ttry {\n\t\t\tconst wanted = language.id.toLowerCase();\n\t\t\tconst snapshot = locale.getSnapshot?.();\n\t\t\tconst existing = snapshot?.locales?.some((entry) => entry.id.toLowerCase() === wanted) ?? false;\n\t\t\tif (existing) return () => {};\n\t\t\treturn locale.addLanguage(language);\n\t\t} catch {\n\t\t\treturn () => {};\n\t\t}\n\t};\n\tconst registerDictionary = (language: string, dictionary: Record<string, string>): (() => void) => {\n\t\ttry {\n\t\t\treturn locale.register(NS, language, dictionary);\n\t\t} catch {\n\t\t\treturn () => {};\n\t\t}\n\t};\n\tconst disposePtBR = addLanguageIfMissing({ id: 'pt-BR', label: 'Português (Brasil)', fallback: 'en' });\n\tconst disposeEs = addLanguageIfMissing({ id: 'es', label: 'Español', fallback: 'en' });\n\tconst disposeZh = registerDictionary('zh', zh);\n\tconst disposeEn = registerDictionary('en', en);\n\tconst disposePtBRDictionary = registerDictionary('pt-BR', ptBR);\n\tconst disposeEsDictionary = registerDictionary('es', es);\n\treturn () => { disposeEsDictionary(); disposePtBRDictionary(); disposeEn(); disposeZh(); disposeEs(); disposePtBR(); };\n}\n\n/**\n * The Antigravity console. FusionSettings renders it inline (`isModal: false`);\n * the modal presentation is kept for reuse, e.g. a future dialog opener.\n */\nexport function AgyConsole(props?: { isModal?: boolean }): ReactNode {\n\t\tconst t = useAgyTranslation();\n\t\tconst { status, refresh } = useAgyStatus();\n\t\tconst [aliasInput, setAliasInput] = useState('');\n\t\tconst [proxyInputs, setProxyInputs] = useState<Record<string, string>>({});\n\t\tconst [editingProxyId, setEditingProxyId] = useState<string | null>(null);\n\t\tconst [addingAccount, setAddingAccount] = useState(false);\n\t\tconst [authCodeInput, setAuthCodeInput] = useState('');\n\t\tconst [loadingAction, setLoadingAction] = useState<string | null>(null);\n\t\tconst [toast, setToast] = useState<ToastNotice | null>(null);\n\t\tconst [expandedModels, setExpandedModels] = useState<Record<string, boolean>>({});\n\t\tconst [addProxyInput, setAddProxyInput] = useState('');\n\t\tconst [optimisticActiveId, setOptimisticActiveId] = useState<string | null>(null);\n\n\n\t\t// Cooldown expiry and quota countdowns are Date.now()-derived while the\n\t\t// payload itself does NOT change when they lapse — without a wall-clock\n\t\t// tick the \"cooldown\" banner and the minutes-left froze forever.\n\t\tconst [, setTimeTick] = useState(0);\n\t\tuseEffect(() => {\n\t\t\tconst timer = setInterval(() => setTimeTick((n) => n + 1), 30_000);\n\t\t\treturn () => clearInterval(timer);\n\t\t}, []);\n\n\t\tconst flowStartedRef = useRef(false);\n\t\tconst safeMessage = (code?: string): string => {\n\t\t\tconst key = `auth.code.${code ?? ''}` as AgyLocaleKey;\n\t\t\treturn code && key in en ? t(key) : t('api.genericError');\n\t\t};\n\t\tuseEffect(() => {\n\t\t\tif (!addingAccount || !flowStartedRef.current) return;\n\t\t\tconst pa = status?.poolAuth;\n\t\t\tif (!pa) return;\n\t\t\tif (pa.phase === 'done') {\n\t\t\t\tflowStartedRef.current = false;\n\t\t\t\tsetAddingAccount(false);\n\t\t\t\tsetAuthCodeInput('');\n\t\t\t\tsetAliasInput('');\n\t\t\t\tsetAddProxyInput('');\n\t\t\t\tshowToast(safeMessage(pa.code), 'success');\n\t\t\t} else if (pa.phase === 'failed') {\n\t\t\t\tflowStartedRef.current = false;\n\t\t\t\tshowToast(safeMessage(pa.code), 'error');\n\t\t\t}\n\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, [addingAccount, status?.poolAuth?.phase, status?.poolAuth?.code]);\n\n\t\tconst toastTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\tuseEffect(() => () => {\n\t\t\t// Unmount must not leave a pending timer writing state into a dead\n\t\t\t// component; a second same-text toast also used to be cleared early\n\t\t\t// by the FIRST toast's leftover timer.\n\t\t\tif (toastTimerRef.current !== null) clearTimeout(toastTimerRef.current);\n\t\t}, []);\n\t\tconst showToast = (text: string, type: ToastNotice['type'] = 'info') => {\n\t\t\tsetToast({ text, type, id: Date.now() });\n\t\t\tif (toastTimerRef.current !== null) clearTimeout(toastTimerRef.current);\n\t\t\ttoastTimerRef.current = setTimeout(() => {\n\t\t\t\ttoastTimerRef.current = null;\n\t\t\t\tsetToast((prev) => (prev !== null && prev.text === text ? null : prev));\n\t\t\t}, 6000);\n\t\t};\n\n\t\tconst actionFailed = (): void => {\n\t\t\tshowToast(t('api.genericError'), 'error');\n\t\t};\n\n\t\tconst handleBeginAddAccount = async (): Promise<void> => {\n\t\t\tsetLoadingAction('pool:beginAdd');\n\t\t\tconst alias = aliasInput.trim();\n\t\t\tconst proxyUrl = addProxyInput.trim();\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/begin-add', {\n\t\t\t\t...(alias ? { alias } : {}),\n\t\t\t\t...(proxyUrl ? { proxyUrl } : {}),\n\t\t\t});\n\t\t\tsetLoadingAction(null);\n\t\t\tif (res && res.ok) {\n\t\t\t\tflowStartedRef.current = true;\n\t\t\t\tawait refresh();\n\t\t\t\tif (res.browserOpened) {\n\t\t\t\t\tshowToast(t('auth.browserOpened'), 'info');\n\t\t\t\t} else {\n\t\t\t\t\tshowToast(t('auth.browserManual'), 'warn');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tshowToast(res?.code ? safeMessage(res.code) : t('auth.startFailed'), 'error');\n\t\t\t}\n\t\t};\n\n\t\tconst handleCompleteAddAccount = async (): Promise<void> => {\n\t\t\tif (!authCodeInput.trim()) return;\n\t\t\tsetLoadingAction('pool:completeAdd');\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/complete-add', { code: authCodeInput.trim() });\n\t\t\tsetLoadingAction(null);\n\t\t\tif (res && res.ok) {\n\t\t\t\tflowStartedRef.current = false;\n\t\t\t\tsetAuthCodeInput('');\n\t\t\t\tsetAliasInput('');\n\t\t\t\tsetAddProxyInput('');\n\t\t\t\tsetAddingAccount(false);\n\t\t\t\tawait refresh();\n\t\t\t\tshowToast(safeMessage(res.code), 'success');\n\t\t\t} else {\n\t\t\t\tshowToast(safeMessage(res?.code), 'error');\n\t\t\t}\n\t\t};\n\n\t\tconst handleCancelAddAccount = async (): Promise<void> => {\n\t\t\tflowStartedRef.current = false;\n\t\t\tawait postJson('/plugins/agy-worker/pool/cancel-add', {});\n\t\t\tsetAuthCodeInput('');\n\t\t\tsetAliasInput('');\n\t\t\tsetAddProxyInput('');\n\t\t\tsetAddingAccount(false);\n\t\t\tawait refresh();\n\t\t};\n\n\t\tconst reorderAccounts = async (newIds: string[]): Promise<void> => {\n\t\t\tsetLoadingAction('pool:reorder');\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/reorder', { ids: newIds });\n\t\t\tsetLoadingAction(null);\n\t\t\tif (res && res.ok) {\n\t\t\t\tawait refresh();\n\t\t\t\tshowToast(t('account.reordered'), 'success');\n\t\t\t} else {\n\t\t\t\tactionFailed();\n\t\t\t}\n\t\t};\n\n\t\tconst moveAccount = async (accId: string, delta: number): Promise<void> => {\n\t\t\tconst ids = (status?.pool?.accounts ?? []).map((a) => a.id);\n\t\t\tconst idx = ids.indexOf(accId);\n\t\t\tif (idx === -1) return;\n\t\t\tconst newIdx = idx + delta;\n\t\t\tif (newIdx < 0 || newIdx >= ids.length) return;\n\t\t\tconst [moved] = ids.splice(idx, 1);\n\t\t\tif (moved) ids.splice(newIdx, 0, moved);\n\t\t\tawait reorderAccounts(ids);\n\t\t};\n\n\t\tconst setCfg = async (key: string, value: unknown): Promise<void> => {\n\t\t\tsetLoadingAction(`config:${key}`);\n\t\t\tconst res = await postJson('/plugins/agy-worker/config', { key, value });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t};\n\n\t\tconst hiddenPendingRef = useRef<Set<string> | null>(null);\n\t\tconst toggleModelHidden = async (id: string, hide: boolean): Promise<void> => {\n\t\t\t// Merge against the PENDING set, not the last-rendered snapshot:\n\t\t\t// two rapid clicks used to read the same stale status and the\n\t\t\t// second silently overwrote the first (lost update).\n\t\t\tconst next = new Set(hiddenPendingRef.current ?? status?.hiddenModels ?? []);\n\t\t\tif (hide) next.add(id); else next.delete(id);\n\t\t\thiddenPendingRef.current = next;\n\t\t\ttry {\n\t\t\t\tawait setCfg('hiddenModels', Array.from(next));\n\t\t\t} finally {\n\t\t\t\tif (hiddenPendingRef.current === next) hiddenPendingRef.current = null;\n\t\t\t}\n\t\t};\n\n\t\tconst setActiveAccount = async (id: string): Promise<void> => {\n\t\t\tsetOptimisticActiveId(id);\n\t\t\tsetLoadingAction(`active:${id}`);\n\t\t\ttry {\n\t\t\t\tconst res = await postJson('/plugins/agy-worker/pool/set-active', { id });\n\t\t\t\tif (res && res.ok) {\n\t\t\t\t\tawait refresh();\n\t\t\t\t\tshowToast(t('account.activeSet'), 'success');\n\t\t\t\t} else {\n\t\t\t\t\tsetOptimisticActiveId(null);\n\t\t\t\t\tshowToast(res?.error || t('account.activeSetFailed'), 'error');\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetOptimisticActiveId(null);\n\t\t\t\tshowToast(t('account.activeSetFailed'), 'error');\n\t\t\t} finally {\n\t\t\t\tsetOptimisticActiveId(null);\n\t\t\t\tsetLoadingAction(null);\n\t\t\t}\n\t\t};\n\n\t\tconst removeAccount = async (id: string, alias: string): Promise<void> => {\n\t\t\tsetLoadingAction(`remove:${id}`);\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/remove', { id });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t\tshowToast(t('account.removed', { alias }), 'info');\n\t\t};\n\n\t\tconst toggleAccountEnabled = async (acc: ManagedAccount): Promise<void> => {\n\t\t\tconst nextState = !acc.enabled;\n\t\t\tsetLoadingAction(`enable:${acc.id}`);\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/enable', { id: acc.id, enabled: nextState });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t\tconst legacyDefault = acc.defaultAlias === undefined && acc.systemHome && acc.alias === '主账号 (系统登录)';\n\t\t\tconst displayAlias = acc.defaultAlias || legacyDefault\n\t\t\t\t? acc.systemHome ? t('account.defaultAlias') : acc.alias\n\t\t\t\t: acc.alias;\n\t\t\tshowToast(t(nextState ? 'account.enabledToast' : 'account.disabledToast', { alias: displayAlias }), 'success');\n\t\t};\n\n\t\tconst refreshQuota = async (id?: string): Promise<void> => {\n\t\t\tsetLoadingAction(id ? `refresh:${id}` : 'refresh:all');\n\t\t\ttry {\n\t\t\t\tconst res = await postJson('/plugins/agy-worker/pool/refresh-quota', { id });\n\t\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\t\tactionFailed();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait refresh();\n\t\t\t\tshowToast(t('quota.refreshed'), 'success');\n\t\t\t} finally {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t}\n\t\t};\n\n\t\tconst warmupAccount = async (id?: string): Promise<void> => {\n\t\t\tsetLoadingAction(id ? `warmup:${id}` : 'warmup:all');\n\t\t\ttry {\n\t\t\t\tconst res = await postJson('/plugins/agy-worker/pool/warmup', {\n\t\t\t\t\tid,\n\t\t\t\t\tforce: true,\n\t\t\t\t\t...(id ? {} : { all: true }),\n\t\t\t\t});\n\t\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\t\tactionFailed();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait refresh();\n\t\t\t\tconst results: any[] = Array.isArray(res.results) ? res.results : [];\n\t\t\t\tconst skippedCount = results.filter((r) => r.skipped).length;\n\t\t\t\t// `success: true, skipped: true` means \"nothing was due\"; it must\n\t\t\t\t// not count as a successful probe (all-failed used to toast success).\n\t\t\t\tconst successCount = results.filter((r) => r.success && !r.skipped).length;\n\t\t\t\tconst failedCount = results.length - skippedCount - successCount;\n\t\t\t\tif (successCount > 0) {\n\t\t\t\t\tshowToast(id ? t('warmup.success') : t('warmup.allSuccess'), 'success');\n\t\t\t\t} else if (skippedCount > 0 && failedCount === 0) {\n\t\t\t\t\tshowToast(t('warmup.skipped'), 'info');\n\t\t\t\t} else {\n\t\t\t\t\tactionFailed();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t}\n\t\t};\n\n\t\tconst saveProxy = async (id: string): Promise<void> => {\n\t\t\tsetLoadingAction(`proxy:${id}`);\n\t\t\tconst proxyUrl = proxyInputs[id];\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/proxy', { id, proxyUrl });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetEditingProxyId(null);\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t\tshowToast(t('proxy.saved'), 'success');\n\t\t};\n\n\t\tconst setMode = async (mode: string): Promise<void> => {\n\t\t\tsetLoadingAction(`mode:${mode}`);\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/mode', { mode });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t};\n\n\t\tconst clearCooldown = async (id?: string): Promise<void> => {\n\t\t\tsetLoadingAction(id ? `clearCooldown:${id}` : 'clearCooldown:all');\n\t\t\tconst res = await postJson('/plugins/agy-worker/pool/clear-cooldown', { id });\n\t\t\tif (res === null || res?.ok === false) {\n\t\t\t\tsetLoadingAction(null);\n\t\t\t\tactionFailed();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait refresh();\n\t\t\tsetLoadingAction(null);\n\t\t\tshowToast(t('account.clearCooldown'), 'success');\n\t\t};\n\n\t\tconst toggleExpand = (accId: string) => {\n\t\t\tsetExpandedModels((prev) => ({ ...prev, [accId]: !prev[accId] }));\n\t\t};\n\n\t\tconst authPhase = status?.auth?.phase ?? 'unknown';\n\t\tconst pool = status?.pool;\n\t\tconst catalogModels = status?.catalogModels ?? [];\n\t\tconst hiddenModelSet = new Set(status?.hiddenModels ?? []);\n\t\tconst accounts = pool?.accounts ?? [];\n\t\tconst isAuthed = authPhase === 'ok' || accounts.length > 0;\n\t\t// Per-action busy scoping (2026-10-23): `isBusy` used to be\n\t\t// `loadingAction !== null` and was applied to EVERY account button, so\n\t\t// one refresh flipped 40 `disabled` attributes at once (measured: 40\n\t\t// attribute mutations for 2 added nodes) and repainted the whole panel.\n\t\t// Each control now derives its own busy state from the action that\n\t\t// concerns it, so an unrelated action leaves its DOM untouched.\n\t\tconst isBusy = loadingAction !== null;\n\t\t/** Busy for a per-account action; also blocks while a global action runs. */\n\t\tconst accountActionBusy = (acc: ManagedAccount, action: string): boolean =>\n\t\t\tloadingAction === `${action}:${acc.id}`;\n\t\t/** Global actions (add/sync-all/save) genuinely conflict with everything. */\n\t\tconst globalBusy = isBusy && !loadingAction?.includes(':');\n\n\t\tconst renderSpinner = () => h('span', { className: 'agy-spinner' });\n\n\t\tconst renderToastBanner = () => {\n\t\t\tif (!toast) return null;\n\t\t\tconst typeStyles = {\n\t\t\t\tsuccess: { background: 'var(--agy-toast-success-bg)', border: '1px solid var(--agy-toast-success-border)', color: 'var(--agy-toast-success-text)' },\n\t\t\t\tinfo: { background: 'var(--agy-toast-info-bg)', border: '1px solid var(--agy-toast-info-border)', color: 'var(--agy-toast-info-text)' },\n\t\t\t\twarn: { background: 'var(--agy-toast-warn-bg)', border: '1px solid var(--agy-toast-warn-border)', color: 'var(--agy-toast-warn-text)' },\n\t\t\t\terror: { background: 'var(--agy-toast-error-bg)', border: '1px solid var(--agy-toast-error-border)', color: 'var(--agy-toast-error-text)' },\n\t\t\t};\n\t\t\tconst style = typeStyles[toast.type];\n\t\t\treturn h('div', { style: { ...S.noticeBanner, ...style } },\n\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '8px', fontWeight: 600 } },\n\t\t\t\t\tuiIcon(toast.type === 'success' ? 'check' : toast.type === 'error' || toast.type === 'warn' ? 'alert' : 'globe', 14, style.color),\n\t\t\t\t\th('span', null, toast.text),\n\t\t\t\t),\n\t\t\t\th('button', {\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\tstyle: { background: 'transparent', border: 'none', color: 'inherit', cursor: 'pointer', padding: '0 4px', opacity: 0.8, display: 'inline-flex', alignItems: 'center' },\n\t\t\t\t\tonClick: () => setToast(null),\n\t\t\t\t\t'aria-label': t('aria.closeToast'),\n\t\t\t\t}, uiIcon('x', 12)),\n\t\t\t);\n\t\t};\n\n\t\t// Scoped shimmer (2026-10-23): the global 'refresh-quota' flag used to be\n\t\t// passed to EVERY account's quota bars, so refreshing one account started\n\t\t// the infinite shimmer animation on all of them — extra compositing and\n\t\t// repaints across the whole panel while the user scrolls.\n\t\tconst renderQuotaBar = (label: string, familyKey: 'google' | 'argon' | 'anthropic' | 'openai', acc: ManagedAccount): unknown =>\n\t\t\trenderFamilyQuotaBar(\n\t\t\t\tt,\n\t\t\t\tlabel,\n\t\t\t\tfamilyKey,\n\t\t\t\tacc,\n\t\t\t\tloadingAction === 'refresh:all' || loadingAction === `refresh:${acc.id}`,\n\t\t\t);\n\n\t\t// Authoritative active account: trust pool.activeAccountId computed by\n\t\t// the scheduler, falling back to lastActiveAccountId, activeAccountIds.google, or primaryAccountId.\n\t\t// Optimistic selection takes priority for instant zero-flicker feedback.\n\t\tconst authoritativeActiveId = pool?.activeAccountId ?? pool?.lastActiveAccountId ?? pool?.activeAccountIds?.google ?? pool?.primaryAccountId;\n\t\tconst activeAccountId = optimisticActiveId ?? authoritativeActiveId;\n\t\tconst renderedAccountCards = accounts.map((acc: ManagedAccount) => {\n\t\t\tconst isPrimary = acc.id === pool?.primaryAccountId;\n\t\t\tconst hasCooldown = Object.entries(acc.cooldowns).some(([, cd]) => cd && cd.cooldownUntil > Date.now());\n\t\t\tconst isAuthRequired = acc.authRequired;\n\t\t\tconst isInUse = acc.enabled && !isAuthRequired && activeAccountId !== undefined && activeAccountId === acc.id;\n\t\t\tconst dotColor = !acc.enabled ? '#64748b' : isAuthRequired ? '#ef4444' : hasCooldown ? '#f59e0b' : '#10b981';\n\t\t\tconst isEditingProxy = editingProxyId === acc.id;\n\t\t\tconst isExpanded = expandedModels[acc.id] ?? false;\n\t\t\tconst accIndex = accounts.indexOf(acc);\n\n\t\t\tconst cardStyle = {\n\t\t\t\t...S.card,\n\t\t\t\tcursor: 'default',\n\t\t\t\tpadding: '10px 14px',\n\t\t\t\tmarginBottom: '8px',\n\t\t\t\t...(!acc.enabled ? { opacity: 0.72 } : {}),\n\t\t\t};\n\t\t\t// Built-in aliases are canonical server data; translate display only.\n\t\t\tconst legacyDefault = acc.defaultAlias === undefined && acc.systemHome && acc.alias === '主账号 (系统登录)';\n\t\t\tconst displayAlias = acc.defaultAlias || legacyDefault\n\t\t\t\t? acc.systemHome ? t('account.defaultAlias') : t('account.aliasDefault', { number: accIndex + 1 })\n\t\t\t\t: acc.alias;\n\n\t\t\tconst googleModels = acc.quotas.google?.models ?? [];\n\t\t\tconst argonModels = acc.quotas.argon?.models ?? [];\n\t\t\tconst anthropicModels = acc.quotas.anthropic?.models ?? [];\n\t\t\tconst openaiModels = acc.quotas.openai?.models ?? [];\n\t\t\tconst allChildModels: { family: string; model: ModelQuotaInfo }[] = [\n\t\t\t\t...googleModels.map((m) => ({ family: 'Google', model: m })),\n\t\t\t\t...argonModels.map((m) => ({ family: 'Argon', model: m })),\n\t\t\t\t...anthropicModels.map((m) => ({ family: 'Anthropic', model: m })),\n\t\t\t\t...openaiModels.map((m) => ({ family: 'OpenAI', model: m })),\n\t\t\t];\n\n\t\t\treturn h('div', {\n\t\t\t\tkey: acc.id,\n\t\t\t\tclassName: 'agy-card-hover',\n\t\t\t\tstyle: cardStyle,\n\t\t\t},\n\t\t\t\t// Header row\n\t\t\t\th('div', {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\tuserSelect: 'none',\n\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\tmarginBottom: '8px',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '6px', flexWrap: 'wrap', flex: '1', minWidth: 0 } },\n\t\t\t\t\t\th('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tfontSize: '10.5px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tbackground: isPrimary ? 'var(--agy-badge-primary-bg)' : 'var(--agy-badge-tag-bg)',\n\t\t\t\t\t\t\t\tcolor: isPrimary ? 'var(--agy-badge-primary-text)' : 'var(--agy-badge-tag-text)',\n\t\t\t\t\t\t\t\tborderColor: isPrimary ? 'var(--agy-badge-primary-border)' : 'var(--agy-badge-tag-border)',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: `优先级 #${accIndex + 1}`,\n\t\t\t\t\t\t}, `#${accIndex + 1}`),\n\t\t\t\t\t\taccounts.length > 1 ? h('div', {\n\t\t\t\t\t\t\tstyle: { display: 'inline-flex', gap: '2px', alignItems: 'center' },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\taccIndex > 0 ? h('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\tstyle: { ...S.btnSm, padding: '1px 4px', fontSize: '10px', lineHeight: 1, height: '18px' },\n\t\t\t\t\t\t\t\ttitle: t('account.moveUp'),\n\t\t\t\t\t\t\t\tonClick: () => void moveAccount(acc.id, -1),\n\t\t\t\t\t\t\t}, uiIcon('arrowUp', 10)) : null,\n\t\t\t\t\t\t\taccIndex < accounts.length - 1 ? h('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\tstyle: { ...S.btnSm, padding: '1px 4px', fontSize: '10px', lineHeight: 1, height: '18px' },\n\t\t\t\t\t\t\t\ttitle: t('account.moveDown'),\n\t\t\t\t\t\t\t\tonClick: () => void moveAccount(acc.id, 1),\n\t\t\t\t\t\t\t}, uiIcon('arrowDown', 10)) : null,\n\t\t\t\t\t\t) : null,\n\t\t\t\t\t\th('span', {\n\t\t\t\t\t\t\tclassName: 'agy-pulse-dot',\n\t\t\t\t\t\t\tstyle: { background: dotColor, boxShadow: `0 0 6px ${dotColor}aa`, marginLeft: '1px' },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tfontSize: '13px',\n\t\t\t\t\t\t\t\tcolor: 'var(--agy-text-primary)',\n\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: displayAlias,\n\t\t\t\t\t\t}, displayAlias),\n\t\t\t\t\t\th('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'rgba(59, 130, 246, 0.12)',\n\t\t\t\t\t\t\t\tcolor: '#3b82f6',\n\t\t\t\t\t\t\t\tborderColor: 'rgba(59, 130, 246, 0.35)',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}, 'AGY'),\n\t\t\t\t\t\tisAuthRequired ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'var(--agy-badge-email-bg)',\n\t\t\t\t\t\t\t\tcolor: '#ef4444',\n\t\t\t\t\t\t\t\tborderColor: '#fca5a5',\n\t\t\t\t\t\t\t\tgap: '3px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}, uiIcon('alert', 10, '#ef4444'), t('status.authRequired')) : null,\n\t\t\t\t\t\thasCooldown ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'rgba(245, 158, 11, 0.15)',\n\t\t\t\t\t\t\t\tcolor: '#f59e0b',\n\t\t\t\t\t\t\t\tborderColor: 'rgba(245, 158, 11, 0.4)',\n\t\t\t\t\t\t\t\tgap: '3px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}, uiIcon('alert', 10, '#f59e0b'), '冷却中') : null,\n\t\t\t\t\t\tacc.email ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'var(--agy-badge-email-bg)',\n\t\t\t\t\t\t\t\tcolor: 'var(--agy-badge-email-text)',\n\t\t\t\t\t\t\t\tborderColor: 'var(--agy-badge-email-border)',\n\t\t\t\t\t\t\t\tgap: '4px',\n\t\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\t\tpadding: '1px 6px',\n\t\t\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: acc.email,\n\t\t\t\t\t\t}, uiIcon('mail', 10, 'var(--agy-badge-email-text)'), acc.email) : null,\n\t\t\t\t\t\tisInUse ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'rgba(16, 185, 129, 0.12)',\n\t\t\t\t\t\t\t\tcolor: '#10b981',\n\t\t\t\t\t\t\t\tborderColor: 'rgba(16, 185, 129, 0.45)',\n\t\t\t\t\t\t\t\tgap: '3px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: t('status.inUse'),\n\t\t\t\t\t\t}, uiIcon('zap', 10, '#10b981'), t('status.inUse')) : null,\n\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\tconst effectiveProxy = acc.proxyUrl || pool?.systemProxy;\n\t\t\t\t\t\t\treturn effectiveProxy ? h('span', {\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\t\tbackground: 'var(--agy-badge-proxy-bg)',\n\t\t\t\t\t\t\t\t\tcolor: 'var(--agy-badge-proxy-text)',\n\t\t\t\t\t\t\t\t\tborderColor: 'var(--agy-badge-proxy-border)',\n\t\t\t\t\t\t\t\t\tgap: '4px',\n\t\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttitle: effectiveProxy,\n\t\t\t\t\t\t\t}, uiIcon('globe', 10, 'var(--agy-badge-proxy-text)'), t('status.proxy')) : null;\n\t\t\t\t\t\t})(),\n\t\t\t\t\t\t!acc.enabled ? h('span', {\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t...S.badgeTag,\n\t\t\t\t\t\t\t\tbackground: 'var(--agy-bg-subbox)',\n\t\t\t\t\t\t\t\tcolor: 'var(--agy-text-secondary)',\n\t\t\t\t\t\t\t\tborderColor: 'var(--agy-border-subbox)',\n\t\t\t\t\t\t\t\tgap: '3px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tpadding: '1px 5px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitle: t('status.disabled'),\n\t\t\t\t\t\t}, uiIcon('power', 10, '#64748b'), t('status.disabled')) : null,\n\t\t\t\t\t),\n\t\t\t\t\th('div', {\n\t\t\t\t\t\tstyle: { display: 'flex', gap: '4px', alignItems: 'center', flexShrink: 0 },\n\t\t\t\t\t},\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: acc.enabled\n\t\t\t\t\t\t\t\t? { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px' }\n\t\t\t\t\t\t\t\t: { ...S.btnSmPrimary, gap: '3px', fontSize: '11px', padding: '2px 6px' },\n\t\t\t\t\t\t\ttitle: acc.enabled ? t('account.disableTitle') : t('account.enableTitle'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'enable'),\n\t\t\t\t\t\t\tonClick: () => void toggleAccountEnabled(acc),\n\t\t\t\t\t\t}, loadingAction === `enable:${acc.id}`\n\t\t\t\t\t\t\t? [renderSpinner(), acc.enabled ? t('account.disable') : t('account.enable')]\n\t\t\t\t\t\t\t: [uiIcon('power', 10, acc.enabled ? 'var(--agy-text-secondary)' : '#ffffff'), ` ${acc.enabled ? t('account.disable') : t('account.enable')}`]),\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px', minWidth: '58px', justifyContent: 'center' },\n\t\t\t\t\t\t\ttitle: t('account.syncTitle'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'refresh'),\n\t\t\t\t\t\t\tonClick: () => void refreshQuota(acc.id),\n\t\t\t\t\t\t}, loadingAction === `refresh:${acc.id}` ? [renderSpinner(), t('account.syncing')] : [uiIcon('refresh', 10), ` ${t('account.sync')}`]),\n\t\t\t\t\t\tacc.enabled && !acc.authRequired ? h('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px', minWidth: '58px', justifyContent: 'center' },\n\t\t\t\t\t\t\ttitle: t('account.warmupTitle'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'warmup'),\n\t\t\t\t\t\t\tonClick: () => void warmupAccount(acc.id),\n\t\t\t\t\t\t}, loadingAction === `warmup:${acc.id}` ? [renderSpinner(), t('account.warmingUp')] : [uiIcon('flame', 10, '#f97316'), ` ${t('account.warmup')}`]) : null,\n\t\t\t\t\t\tacc.enabled && !isInUse ? h('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px' },\n\t\t\t\t\t\t\ttitle: t('account.setActive'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'active'),\n\t\t\t\t\t\t\tonClick: () => void setActiveAccount(acc.id),\n\t\t\t\t\t\t}, loadingAction === `active:${acc.id}` ? [renderSpinner(), t('account.settingActive')] : [uiIcon('zap', 10), ` ${t('account.setActive')}`]) : null,\n\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: isEditingProxy ? { ...S.btnSmPrimary, gap: '3px', fontSize: '11px', padding: '2px 6px' } : { ...S.btnSm, gap: '3px', fontSize: '11px', padding: '2px 6px' },\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'proxy'),\n\t\t\t\t\t\t\tonClick: () => setEditingProxyId(isEditingProxy ? null : acc.id),\n\t\t\t\t\t\t}, [uiIcon('globe', 10), ` ${t('proxy.button')}`]),\n\t\t\t\t\t\taccounts.length > 1 ? h('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: { ...S.btnDanger, padding: '2px 6px', fontSize: '11px' },\n\t\t\t\t\t\t\ttitle: t('account.removeTitle'),\n\t\t\t\t\t\t\t'aria-label': t('account.removeTitle'),\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'remove'),\n\t\t\t\t\t\t\tonClick: () => void removeAccount(acc.id, displayAlias),\n\t\t\t\t\t\t}, loadingAction === `remove:${acc.id}` ? renderSpinner() : uiIcon('trash', 11, 'var(--agy-danger-text)')) : null,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t// Body: Always directly visible, showing quota\nh('div', { key: 'agy-body', style: S.quotaBox },\n\t\t\t\t\t\trenderQuotaBar('Gemini', 'google', acc),\n\t\t\t\t\t\t// Gemini 4 Argon (Pro/Ultra only): the backend reports its own\n\t\t\t\t\t\t// quota group/weekly bucket ONLY for accounts that have the\n\t\t\t\t\t\t// permission, so gate the row on the data itself — free and\n\t\t\t\t\t\t// legacy plans never see an empty Argon panel.\n\t\t\t\t\t\tacc.quotas.argon ? renderQuotaBar('Argon', 'argon', acc) : null,\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t\tgap: '5px',\n\t\t\t\t\t\t\t\tmarginTop: '6px',\n\t\t\t\t\t\t\t\tpadding: '5px 10px',\n\t\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\tcolor: isExpanded ? 'var(--dsw-alias-state-business-primary, #3b82f6)' : 'var(--agy-text-secondary)',\n\t\t\t\t\t\t\t\tbackground: 'var(--agy-bg-subbox)',\n\t\t\t\t\t\t\t\tborder: '1px dashed var(--agy-border-box)',\n\t\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tonClick: () => toggleExpand(acc.id),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\tuiIcon(isExpanded ? 'chevronUp' : 'chevronDown', 10),\n\t\t\t\t\t\t\th('span', null, isExpanded ? t('account.collapseOthers') : t('account.expandOthers')),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tisExpanded ? [\n\t\t\t\t\t\t\trenderQuotaBar('Claude', 'anthropic', acc),\n\t\t\t\t\t\t\trenderQuotaBar('GPT-OSS', 'openai', acc),\n\t\t\t\t\t\t\tallChildModels.length > 0 ? h('div', {\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tmarginTop: '8px',\n\t\t\t\t\t\t\t\t\tpaddingTop: '8px',\n\t\t\t\t\t\t\t\t\tborderTop: '1px solid var(--agy-border-box)',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\th('div', { style: { color: 'var(--agy-text-secondary)', marginBottom: '6px', fontWeight: 600, fontSize: '11px' } }, t('account.models')),\n\t\t\t\t\t\t\t\tallChildModels.map(({ family, model }) => {\n\t\t\t\t\t\t\t\t\tconst frac = model.remainingFraction ?? 1;\n\t\t\t\t\t\t\t\t\tconst pct = Math.round(frac * 100);\n\t\t\t\t\t\t\t\t\tconst w = formatQuotaWindow(t, model.resetTime);\n\t\t\t\t\t\t\t\t\tconst pColor = pct <= 20 ? 'var(--agy-quota-low-text)' : pct <= 50 ? 'var(--agy-quota-med-text)' : 'var(--agy-quota-high-text)';\n\t\t\t\t\t\t\t\t\treturn h('div', { key: `${family}-${model.modelId}`, className: 'agy-submodel-row' },\n\t\t\t\t\t\t\t\t\t\th('span', { style: { fontWeight: 500, color: 'var(--agy-text-primary)' } }, `[${family}] ${model.displayName || model.modelId}`),\n\t\t\t\t\t\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '8px' } },\n\t\t\t\t\t\t\t\t\t\t\th('span', { style: { color: pColor, fontWeight: 700 } }, `${pct}%`),\n\t\t\t\t\t\t\t\t\t\t\tw.resetText ? h('span', { style: { color: 'var(--agy-text-tertiary)', fontSize: '10.5px' } }, `↻ ${w.resetText}`) : null,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t] : null,\n\t\t\t\t\t),\n\t\t\t\thasCooldown ? h('div', {\n\t\t\t\t\tkey: 'cd-body',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tbackground: 'var(--agy-warn-bg)',\n\t\t\t\t\t\tborder: '1px solid var(--agy-warn-border)',\n\t\t\t\t\t\tborderRadius: '7px',\n\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\tcolor: 'var(--agy-warn-text)',\n\t\t\t\t\t\tfontSize: '11.5px',\n\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\tmarginTop: '8px',\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '6px' } },\n\t\t\t\t\t\tuiIcon('alert', 13, 'var(--agy-warn-text)'),\n\t\t\t\t\t\th('span', null, t('account.cooldown')),\n\t\t\t\t\t),\n\t\t\t\t\th('button', {\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\tstyle: { ...S.btnSm, color: 'var(--agy-warn-btn-text)', borderColor: 'var(--agy-warn-btn-border)', background: 'var(--agy-warn-btn-bg)', gap: '4px' },\n\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'clearCooldown'),\n\t\t\t\t\t\tonClick: () => void clearCooldown(acc.id),\n\t\t\t\t\t}, loadingAction === `clearCooldown:${acc.id}` ? [renderSpinner(), ''] : [uiIcon('zap', 11, 'var(--agy-warn-btn-text)'), ` ${t('account.clearCooldown')}`]),\n\t\t\t\t) : null,\n\t\t\t\tisEditingProxy ? h('div', {\n\t\t\t\t\tkey: 'proxy-body',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmarginTop: '8px',\n\t\t\t\t\t\tpadding: '10px 12px',\n\t\t\t\t\t\tbackground: 'var(--agy-bg-subbox)',\n\t\t\t\t\t\tborderRadius: '7px',\n\t\t\t\t\t\tborder: '1px solid var(--agy-border-subbox)',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\th('div', { style: { display: 'flex', gap: '8px' } },\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\tstyle: S.input,\n\t\t\t\t\t\t\tvalue: proxyInputs[acc.id] !== undefined ? proxyInputs[acc.id] : (acc.proxyUrl ?? ''),\n\t\t\t\t\t\t\tplaceholder: pool?.systemProxy ? `${t('proxy.placeholder')} (${pool.systemProxy})` : t('proxy.placeholder'),\n\t\t\t\t\t\t\t'aria-label': t('aria.proxyInput'),\n\t\t\t\t\t\t\tonChange: (e: { target: { value: string } }) => setProxyInputs({ ...proxyInputs, [acc.id]: e.target.value }),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: S.btnPrimary,\n\t\t\t\t\t\t\tdisabled: accountActionBusy(acc, 'proxy'),\n\t\t\t\t\t\t\tonClick: () => void saveProxy(acc.id),\n\t\t\t\t\t\t}, loadingAction === `proxy:${acc.id}` ? [renderSpinner(), t('proxy.save')] : t('proxy.save')),\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\tstyle: S.btn,\n\t\t\t\t\t\t\tonClick: () => setEditingProxyId(null),\n\t\t\t\t\t\t}, t('cancel')),\n\t\t\t\t\t),\n\t\t\t\t) : null,\n\t\t\t);\n\t\t});\n\n\t\tconst poolAuth = status?.poolAuth;\n\t\tconst flowPhase = poolAuth?.phase ?? 'idle';\n\t\tconst flowActive = flowPhase === 'waiting' || flowPhase === 'exchanging';\n\n\t\tconst addAccountSection = addingAccount\n\t\t\t? h('div', { style: S.authModal, role: 'group', 'aria-label': t('account.add') },\n\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '12px', flexWrap: 'wrap', gap: '8px' } },\n\t\t\t\t\th('div', { style: { fontWeight: 700, fontSize: '13.5px', display: 'flex', alignItems: 'center', gap: '6px', color: 'var(--agy-text-primary)' } },\n\t\t\t\t\t\tuiIcon('plus', 13, 'var(--agy-btn-primary-bg)'),\n\t\t\t\t\t\tt('account.add'),\n\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t(!flowActive\n\t\t\t\t\t\t? h('div', null,\n\t\t\t\t\t\t\th('div', { style: { display: 'flex', flexDirection: 'column', gap: '8px', marginBottom: '12px' } },\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tstyle: S.input,\n\t\t\t\t\t\t\t\t\tvalue: aliasInput,\n\t\t\t\t\t\t\t\t\tplaceholder: t('account.aliasPlaceholder'),\n\t\t\t\t\t\t\t\t\t'aria-label': t('aria.aliasInput'),\n\t\t\t\t\t\t\t\t\tonChange: (e: { target: { value: string } }) => setAliasInput(e.target.value),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tstyle: S.input,\n\t\t\t\t\t\t\t\t\tvalue: addProxyInput,\n\t\t\t\t\t\t\t\t\tplaceholder: pool?.systemProxy ? `${t('account.proxyPlaceholder')} (${pool.systemProxy})` : t('account.proxyPlaceholder'),\n\t\t\t\t\t\t\t\t\t'aria-label': t('aria.proxyInput'),\n\t\t\t\t\t\t\t\t\tonChange: (e: { target: { value: string } }) => setAddProxyInput(e.target.value),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('div', { style: { display: 'flex', gap: '8px' } },\n\t\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\t\tstyle: { ...S.btnPrimary, gap: '4px' },\n\t\t\t\t\t\t\t\t\tdisabled: isBusy,\n\t\t\t\t\t\t\t\t\tonClick: () => void handleBeginAddAccount(),\n\t\t\t\t\t\t\t\t}, loadingAction === 'pool:beginAdd' ? [renderSpinner(), t('auth.openingBrowser')] : [uiIcon('externalLink', 12, '#ffffff'), ` ${t('auth.openBrowser')}`]),\n\t\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\t\tstyle: S.btn,\n\t\t\t\t\t\t\t\t\tonClick: () => handleCancelAddAccount(),\n\t\t\t\t\t\t\t\t}, t('cancel')),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tflowPhase === 'failed' ? h('div', {\n\t\t\t\t\t\t\t\tstyle: { ...S.muted, color: 'var(--agy-danger-text)', marginTop: '8px', display: 'flex', alignItems: 'center', gap: '5px', fontWeight: 600 },\n\t\t\t\t\t\t\t}, uiIcon('alert', 12, 'var(--agy-danger-text)'), safeMessage(poolAuth?.code)) : null,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t: h('div', null,\n\t\t\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', color: 'var(--agy-text-secondary)', marginBottom: '8px', lineHeight: 1.5, fontSize: '12px' } },\n\t\t\t\t\t\t\t\trenderSpinner(),\n\t\t\t\t\t\t\t\tflowPhase === 'exchanging'\n\t\t\t\t\t\t\t\t\t? t('auth.exchanging')\n\t\t\t\t\t\t\t\t\t: t('auth.waiting'),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tpoolAuth?.url ? h('div', { style: { marginBottom: '8px' } },\n\t\t\t\t\t\t\t\th('a', {\n\t\t\t\t\t\t\t\t\thref: poolAuth.url,\n\t\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t\t\tstyle: { color: 'var(--dsw-alias-state-business-primary, #2563eb)', textDecoration: 'underline', fontSize: '12px', fontWeight: 600, display: 'inline-flex', alignItems: 'center', gap: '4px' },\n\t\t\t\t\t\t\t\t}, uiIcon('externalLink', 12, 'currentColor'), t('auth.openManual')),\n\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t\th('div', { style: { color: 'var(--agy-text-tertiary)', marginBottom: '6px', fontSize: '11px', fontWeight: 500 } },\n\t\t\t\t\t\t\t\tt('auth.pasteHint'),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\th('div', { style: { display: 'flex', gap: '8px' } },\n\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\tstyle: S.input,\n\t\t\t\t\t\t\t\t\tvalue: authCodeInput,\n\t\t\t\t\t\t\t\t\tplaceholder: t('auth.codePlaceholder'),\n\t\t\t\t\t\t\t\t\t'aria-label': t('aria.authCodeInput'),\n\t\t\t\t\t\t\t\t\tonChange: (e: { target: { value: string } }) => setAuthCodeInput(e.target.value),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\t\tstyle: { ...S.btnPrimary, gap: '4px' },\n\t\t\t\t\t\t\t\t\tdisabled: isBusy || !authCodeInput.trim(),\n\t\t\t\t\t\t\t\t\tonClick: () => void handleCompleteAddAccount(),\n\t\t\t\t\t\t\t\t}, loadingAction === 'pool:completeAdd' ? [renderSpinner(), t('auth.activating')] : [uiIcon('check', 12, '#ffffff'), ` ${t('auth.activate')}`]),\n\t\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\t\t\t\tstyle: S.btn,\n\t\t\t\t\t\t\t\t\tonClick: () => handleCancelAddAccount(),\n\t\t\t\t\t\t\t\t}, t('cancel')),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t))\n)\n\t\t\t: null;\n\n\t\t// FusionSettings is the only placement: the console is an inline section of\n\t\t// that page, never its own panel or dialog.\n\t\tconst containerStyle = props?.isModal\n\t\t\t? S.container\n\t\t\t: {\n\t\t\t\t...S.container,\n\t\t\t\tboxSizing: 'border-box' as const,\n\t\t\t\twidth: '100%',\n\t\t\t\tmaxWidth: '920px',\n\t\t\t};\n\n\t\tif (status === null) {\n\t\t\treturn h('div', { className: 'agy-console', style: { ...containerStyle, minHeight: '120px', display: 'flex', alignItems: 'center', justifyContent: 'center' } },\n\t\t\t\th('style', { key: 'css' }, AGY_CONSOLE_CSS),\n\t\t\t\th('span', { style: S.muted }, [renderSpinner(), t('status.loading')]),\n\t\t\t) as ReactNode;\n\t\t}\n\n\t\treturn h('div', { className: 'agy-console', style: containerStyle },\n\t\t\th('style', { key: 'css' }, AGY_CONSOLE_CSS),\n\t\t\th('div', { style: S.headerCard },\n\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '8px' } },\n\t\t\t\t\tagyIcon(18),\n\t\t\t\t\th('span', { style: { fontWeight: 700, fontSize: '14px', color: 'var(--agy-text-primary)' } }, 'Antigravity'),\n\t\t\t\t\th('span', { style: isAuthed ? S.badgeReady : S.badgeUnready }, isAuthed ? t('status.ready') : t('status.needsAuth')),\n\t\t\t\t),\n\t\t\t\th('div', { style: { display: 'flex', gap: '6px', alignItems: 'center' } },\n\t\t\t\t\t!addingAccount ? h('button', {\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\tstyle: { ...S.btnPrimary, gap: '4px' },\n\t\t\t\t\t\tonClick: () => setAddingAccount(true),\n\t\t\t\t\t}, [uiIcon('plus', 12, '#ffffff'), ` ${t('account.add')}`]) : null,\n\t\t\t\t\th('button', {\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\tstyle: { ...S.btn, gap: '4px' },\n\t\t\t\t\t\tdisabled: isBusy,\n\t\t\t\t\t\tonClick: () => void warmupAccount(),\n\t\t\t\t\t}, loadingAction === 'warmup:all' ? [renderSpinner(), t('header.warmingUp')] : [uiIcon('flame', 12, '#f97316'), ` ${t('header.warmup')}`]),\n\t\t\t\t\th('button', {\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\tclassName: 'agy-btn',\n\t\t\t\t\t\tstyle: { ...S.btn, gap: '4px' },\n\t\t\t\t\t\tdisabled: isBusy,\n\t\t\t\t\t\tonClick: () => void refreshQuota(),\n\t\t\t\t\t}, loadingAction === 'refresh:all' ? [renderSpinner(), t('header.refreshing')] : [uiIcon('refresh', 12, 'var(--agy-text-btn)'), ` ${t('header.refreshQuota')}`]),\n\t\t\t\t),\n\t\t\t),\n\t\t\trenderToastBanner(),\n\t\t\taddAccountSection,\n\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '8px', padding: '0 2px' } },\n\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', gap: '6px' } },\n\t\t\t\t\th('span', { style: { fontWeight: 700, fontSize: '12.5px', color: 'var(--agy-text-primary)' } }, `账号池 (${accounts.length})`),\n\t\t\t\t),\n\t\t\t),\n\t\t\trenderedAccountCards,\n\t\t\th('div', { style: { marginTop: '16px', paddingTop: '12px', borderTop: '1px solid var(--agy-border-divider)' } },\n\t\t\t\th('div', { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },\n\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('permission.label')),\n\t\t\t\t\t\th('div', { style: S.segGroup },\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.permissionMode === 'plan' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('permissionMode', 'plan'),\n\t\t\t\t\t\t\t}, t('permission.plan')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.permissionMode === 'accept-edits' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('permissionMode', 'accept-edits'),\n\t\t\t\t\t\t\t}, t('permission.acceptEdits')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.permissionMode === 'skip' ? { ...S.segBtnActive, color: 'var(--agy-seg-danger-text)', background: 'var(--agy-seg-danger-bg)', border: '1px solid var(--agy-seg-danger-border)' } : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('permissionMode', 'skip'),\n\t\t\t\t\t\t\t}, t('permission.skip')),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },\n\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('effort.label')),\n\t\t\t\t\t\th('div', { style: S.segGroup },\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.defaultEffort === '' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('defaultEffort', ''),\n\t\t\t\t\t\t\t}, t('effort.auto')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.defaultEffort === 'low' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('defaultEffort', 'low'),\n\t\t\t\t\t\t\t}, t('effort.low')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.defaultEffort === 'medium' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('defaultEffort', 'medium'),\n\t\t\t\t\t\t\t}, t('effort.medium')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: status?.defaultEffort === 'high' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setCfg('defaultEffort', 'high'),\n\t\t\t\t\t\t\t}, t('effort.high')),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },\n\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('pool.label')),\n\t\t\t\t\t\th('div', { style: S.segGroup },\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: pool?.mode === 'sequential' || !pool?.mode ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setMode('sequential'),\n\t\t\t\t\t\t\t}, t('pool.sequential')),\n\t\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\tstyle: pool?.mode === 'round-robin' ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\t\tonClick: () => void setMode('round-robin'),\n\t\t\t\t\t\t\t}, t('pool.roundRobin')),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\th('div', { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },\n\t\t\t\t\t\th('div', { style: { display: 'flex', flexDirection: 'column' } },\n\t\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('config.autoWarmup')),\n\t\t\t\t\t\t\th('span', { style: S.muted }, t('config.autoWarmupDesc')),\n\t\t\t\t\t\t),\n\t\t\t\t\t\th('button', {\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\tstyle: status?.autoWarmup !== false ? S.segBtnActive : S.segBtn,\n\t\t\t\t\t\t\tdisabled: loadingAction === 'config:autoWarmup',\n\t\t\t\t\t\t\tonClick: () => void setCfg('autoWarmup', status?.autoWarmup === false),\n\t\t\t\t\t\t}, status?.autoWarmup !== false ? t('account.disable') : t('account.enable')),\n\t\t\t\t\t),\n\t\t\t\t\th('div', { style: { display: 'flex', flexDirection: 'column', gap: '6px' } },\n\t\t\t\t\t\th('span', { style: { color: 'var(--agy-text-primary)', fontWeight: 600, fontSize: '12.5px' } }, t('models.label')),\n\t\t\t\t\t\tcatalogModels.length === 0\n\t\t\t\t\t\t\t? h('span', { style: S.muted }, t('models.empty'))\n\t\t\t\t\t\t\t: h('div', { style: { display: 'flex', flexWrap: 'wrap', gap: '6px' } },\n\t\t\t\t\t\t\t\tcatalogModels.map((m) => {\n\t\t\t\t\t\t\t\t\tconst isHidden = hiddenModelSet.has(m.id);\n\t\t\t\t\t\t\t\t\treturn h('button', {\n\t\t\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t\t\tkey: m.id,\n\t\t\t\t\t\t\t\t\t\ttitle: m.id,\n\t\t\t\t\t\t\t\t\t\tdisabled: loadingAction === 'config:hiddenModels',\n\t\t\t\t\t\t\t\t\t\tstyle: isHidden ? { ...S.segBtn, opacity: 0.45, textDecoration: 'line-through' } : S.segBtnActive,\n\t\t\t\t\t\t\t\t\t\tonClick: () => void toggleModelHidden(m.id, !isHidden),\n\t\t\t\t\t\t\t\t\t}, m.name);\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\th('span', { style: S.muted }, t('models.hint')),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t) as ReactNode;\n}\n","import { useState } from 'react'\nimport { tr, useLang } from './i18n.js'\nimport {\n parseAgentImport,\n importOpsOf,\n useAcpConfigForm,\n existingRoutesOf,\n type AgentImport,\n} from './acp-import.js'\n\nexport interface ConfiguredRouteItem {\n route: string\n displayName: string\n command: string\n args: string[]\n}\n\n/**\n * Pure helper deriving sorted configured ACP routes from the current ConfigForm snapshot.\n * Merges resolved configuration with user overrides and falls back displayName to route id.\n */\nexport function configuredRoutesOf(\n snapshot?: { value?: unknown; user?: unknown } | null\n): ConfiguredRouteItem[] {\n if (!snapshot) return []\n const map = existingRoutesOf(snapshot)\n const items: ConfiguredRouteItem[] = []\n for (const [route, info] of map.entries()) {\n const merged = { ...(info.resolved ?? {}), ...(info.raw ?? {}) }\n const rawDisplay = typeof merged.displayName === 'string' ? merged.displayName.trim() : ''\n const displayName = rawDisplay.length > 0 ? rawDisplay : route\n const command = typeof merged.command === 'string' ? merged.command.trim() : ''\n const args =\n Array.isArray(merged.args) && merged.args.every(arg => typeof arg === 'string')\n ? (merged.args as string[])\n : []\n items.push({ route, displayName, command, args })\n }\n return items.sort((a, b) => a.route.localeCompare(b.route))\n}\n\n/**\n * The ACP section of the Fusion page.\n *\n * This section provides both setup guidance and a configuration importer:\n * it accepts JSON from other ACP clients (or previous dsh-tauri-acp installations)\n * and writes selected routes into `dsh-fusion → acp.agents` via DSH ConfigForms.\n * A Host restart is required after saving or importing.\n */\nconst styles = `\n.acp-guide{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.acp-guide h3{margin:0;font-size:15px;font-weight:600}\n.acp-guide h4{margin:0;font-size:13px;font-weight:600}\n.acp-guide p{margin:0;font-size:13px;line-height:21px;color:var(--dsw-alias-label-secondary)}\n.acp-guide ol,.acp-guide ul{margin:0;padding-left:20px;font-size:13px;line-height:21px;color:var(--dsw-alias-label-secondary);display:flex;flex-direction:column;gap:6px}\n.acp-guide code{font-size:12px;overflow-wrap:anywhere}\n.acp-guide pre{box-sizing:border-box;width:100%;margin:0;padding:12px;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font-size:12px;line-height:18px}\n.acp-guide .acp-note{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-1)}\n.acp-guide [data-kind=warning]{color:var(--dsw-alias-label-primary)}\n.acp-import-label{display:flex;flex-direction:column;gap:6px;width:100%}\n.acp-field-hint{font-size:12px;color:var(--dsw-alias-label-secondary)}\n.acp-import-textarea{box-sizing:border-box;width:100%;min-height:120px;padding:10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font-family:monospace;font-size:12px;line-height:18px;resize:vertical}\n.acp-import-textarea::placeholder{color:var(--dsw-alias-label-tertiary,#888)}\n.acp-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.acp-btn-primary{border:1px solid var(--dsw-alias-border-l2);border-radius:18px;background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary,#1677ff));color:var(--dsw-alias-label-primary-foreground,#fff);padding:7px 18px;font:inherit;font-size:13px;cursor:pointer}\n.acp-btn-secondary{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-primary);padding:6px 14px;font:inherit;font-size:13px;cursor:pointer}\n.acp-btn-ghost{border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:6px 12px;font:inherit;font-size:13px;cursor:pointer}\n.acp-guide button:disabled{opacity:.5;cursor:default}\n.acp-guide button:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\n.acp-banner{box-sizing:border-box;width:100%;padding:10px 12px;border-radius:6px;font-size:13px;line-height:19px;display:flex;flex-direction:column;gap:4px}\n.acp-banner-error{background:rgba(248,81,73,0.1);border:1px solid rgba(248,81,73,0.4);color:var(--dsw-alias-state-error-primary,#cf222e)}\n.acp-banner-warning{background:rgba(210,153,34,0.1);border:1px solid rgba(210,153,34,0.4);color:#d29922}\n.acp-banner-success{background:rgba(46,160,67,0.1);border:1px solid rgba(46,160,67,0.4);color:#2ea043}\n.acp-entries-list{display:flex;flex-direction:column;gap:8px}\n.acp-entry-row{padding:8px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;background:var(--dsw-alias-bg-module-platform)}\n.acp-entry-checkbox-label{display:flex;align-items:flex-start;gap:10px;cursor:pointer;font-size:13px}\n.acp-entry-details{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1 1 auto}\n.acp-entry-header{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.acp-entry-name{font-weight:600}\n.acp-entry-cmd{font-size:12px;color:var(--dsw-alias-label-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}\n.acp-tag{display:inline-flex;align-items:center;padding:1px 6px;border-radius:4px;font-size:11px;font-weight:500}\n.acp-tag-neutral{background:var(--dsw-alias-interactive-bg-hover,#eee);color:var(--dsw-alias-label-secondary)}\n.acp-tag-success{background:rgba(46,160,67,0.15);color:#2ea043;border:1px solid rgba(46,160,67,0.3)}\n.acp-tag-warning{background:rgba(210,153,34,0.15);color:#d29922;border:1px solid rgba(210,153,34,0.3)}\n.acp-tag-info{background:rgba(22,119,255,0.12);color:var(--dsw-alias-brand-primary,#1677ff);border:1px solid rgba(22,119,255,0.25)}\n.acp-empty-hint{font-size:13px;line-height:21px;color:var(--dsw-alias-label-secondary);font-style:italic}\n.acp-hint-skipped{font-size:12px;color:var(--dsw-alias-label-secondary);padding-left:4px}\n.acp-import-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding-top:4px}\n.acp-restart-notice{font-size:13px;font-weight:500;margin-top:2px}\n.acp-status-hint{font-size:12px;color:var(--dsw-alias-label-secondary)}\n`\n\nconst PLACEHOLDER = `{\n \"agent_servers\": {\n \"devin\": {\n \"command\": \"/home/zlw/.local/share/devin/cli/_versions/current/bin/devin\",\n \"args\": [\"acp\"],\n \"env\": {}\n }\n }\n}`\n\nconst CONFIG_EXAMPLE = `- id: dsh-fusion\n name: '@sqdr2/dsh-fusion'\n config:\n acp:\n agents:\n my-agent:\n command: /absolute/path/to/acp-agent\n args: []\n models:\n - id: default`\n\nfunction translateIssue(reason: string, lang: 'zh' | 'en'): string {\n switch (reason) {\n case 'importMissingCommand':\n return tr(lang, '缺少启动命令', 'missing command')\n case 'importBadArgs':\n return tr(lang, 'args 必须是字符串数组', 'args must be an array of strings')\n case 'importBadEnv':\n return tr(lang, 'env 必须是键值均为字符串的对象', 'env must be an object of strings')\n default:\n return reason\n }\n}\n\nexport function AcpSettingsGuide() {\n const lang = useLang()\n const { status, value, user, revision, writable, form } = useAcpConfigForm()\n\n const [text, setText] = useState('')\n const [parsed, setParsed] = useState<AgentImport | null>(null)\n const [excluded, setExcluded] = useState<ReadonlySet<string>>(new Set())\n const [busy, setBusy] = useState(false)\n const [feedback, setFeedback] = useState<{ tone: 'success' | 'error' | 'warning'; message: string } | null>(null)\n\n const configuredRoutes = configuredRoutesOf({ value, user })\n const entries = parsed?.ok === true ? parsed.entries : []\n const selected = entries.filter(entry => !excluded.has(entry.route))\n\n const toggle = (route: string, include: boolean): void => {\n setExcluded(current => {\n const next = new Set(current)\n if (include) next.delete(route)\n else next.add(route)\n return next\n })\n }\n\n const canImport =\n status === 'ready' &&\n writable &&\n revision !== undefined &&\n selected.length > 0 &&\n !busy &&\n form !== undefined\n\n const handleImport = async () => {\n if (!canImport || !form || revision === undefined) return\n setBusy(true)\n setFeedback(null)\n try {\n const ops = importOpsOf(selected)\n const accepted = await form.mutate(ops, revision)\n if (accepted) {\n setFeedback({\n tone: 'success',\n message: tr(\n lang,\n `成功导入 ${selected.length} 条 ACP 线路到 dsh-fusion → acp.agents。`,\n `Successfully imported ${selected.length} ACP route${selected.length > 1 ? 's' : ''} to dsh-fusion → acp.agents.`\n ),\n })\n } else {\n setFeedback({\n tone: 'error',\n message: tr(\n lang,\n 'Host 拒绝了配置写入(配置版本可能已过期或被外部修改),未应用更改。请刷新后重试。',\n 'Host rejected the configuration write (configuration may be stale or modified concurrently). No changes applied; refresh and try again.'\n ),\n })\n }\n } catch (error) {\n setFeedback({\n tone: 'error',\n message: tr(\n lang,\n `导入失败:${error instanceof Error ? error.message : String(error)}`,\n `Import failed: ${error instanceof Error ? error.message : String(error)}`\n ),\n })\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <section className=\"acp-guide\" aria-labelledby=\"acp-guide-title\">\n <style>{styles}</style>\n <h3 id=\"acp-guide-title\">{tr(lang, 'ACP 接入说明', 'ACP setup guide')}</h3>\n <p>\n {tr(\n lang,\n 'ACP(Agent Client Protocol)代理作为独立模型线路接进来,可以直接被选为 Lead 或 Sidekick。本区域提供接入说明与旧版配置导入能力。路由定义在插件配置里,修改或导入后需要重启 Host 才会生效;这里不提供在线状态或模型发现。',\n 'ACP (Agent Client Protocol) agents join as their own model routes, so one can be the Lead or the Sidekick directly. This section provides setup guidance and configuration import. Routes live in plugin configuration and require a Host restart after changes or imports; no live status or model discovery is offered here.'\n )}\n </p>\n\n {/* Configured routes card */}\n <div className=\"acp-note\" role=\"region\" aria-label={tr(lang, '已配置的 ACP 线路', 'Configured ACP routes')}>\n <h4>{tr(lang, '已配置的 ACP 线路', 'Configured ACP routes')}</h4>\n <p>\n {tr(\n lang,\n '以下展示当前在配置(dsh-fusion → acp.agents)中已保存的线路。此处仅为配置清单,不探测后台进程,标明“已配置”不代表当前 agent 进程正在运行。修改或导入后需要重启 Host 才会生效。',\n 'Lists routes currently saved in configuration (dsh-fusion → acp.agents). This shows configured entries only and does not probe background processes; \"configured\" does not mean the agent process is actively running. Restart the Host after changes or imports for new routes to take effect.'\n )}\n </p>\n\n {status === 'loading' && (\n <p role=\"status\" className=\"acp-status-hint\">\n {tr(lang, '正在读取已配置线路…', 'Loading configured routes…')}\n </p>\n )}\n\n {status !== 'loading' && configuredRoutes.length === 0 && (\n <p className=\"acp-empty-hint\">\n {tr(lang, '当前未配置任何 ACP 线路。', 'No ACP routes are currently configured.')}\n </p>\n )}\n\n {configuredRoutes.length > 0 && (\n <div className=\"acp-entries-list\" role=\"list\" aria-label={tr(lang, '已配置线路清单', 'Configured routes list')}>\n {configuredRoutes.map(item => {\n const cmdLine = [item.command, ...item.args].filter(Boolean).join(' ')\n return (\n <div key={item.route} className=\"acp-entry-row\" role=\"listitem\">\n <div className=\"acp-entry-details\">\n <div className=\"acp-entry-header\">\n <strong className=\"acp-entry-name\">{item.displayName}</strong>\n <span className=\"acp-tag acp-tag-neutral\">{item.route}</span>\n <span className=\"acp-tag acp-tag-info\">\n {tr(lang, '已配置', 'Configured')}\n </span>\n </div>\n {cmdLine ? (\n <code className=\"acp-entry-cmd\" title={cmdLine}>{cmdLine}</code>\n ) : (\n <span className=\"acp-field-hint\">{tr(lang, '(未指定命令)', '(No command specified)')}</span>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Import card */}\n <div className=\"acp-note\" role=\"region\" aria-label={tr(lang, '导入 ACP 线路配置', 'Import ACP route configuration')}>\n <h4>{tr(lang, '导入 ACP 线路配置', 'Import ACP route configuration')}</h4>\n <p>\n {tr(\n lang,\n '支持粘贴 Zed 配置中的 agent_servers、本插件的 agents 或裸 server 映射 JSON。解析后可选择要导入的线路并批量写入 dsh-fusion → acp.agents。',\n 'Paste JSON from Zed\\'s agent_servers, this plugin\\'s agents, or a bare server map. Parse to preview, select routes, and import directly into dsh-fusion → acp.agents.'\n )}\n </p>\n\n {status === 'loading' && (\n <p role=\"status\" className=\"acp-status-hint\">\n {tr(lang, '正在读取配置表单…', 'Loading configuration form…')}\n </p>\n )}\n {status === 'unavailable' && (\n <p role=\"status\" className=\"acp-status-hint\">\n {tr(lang, '配置表单当前不可用(处于内存模式或尚未连接 Host)', 'Configuration form is currently unavailable (memory mode or disconnected from Host)')}\n </p>\n )}\n {status === 'ready' && !writable && (\n <p role=\"status\" className=\"acp-status-hint\">\n {tr(lang, '当前配置只读,无法导入', 'Configuration is read-only; importing is disabled')}\n </p>\n )}\n\n <label className=\"acp-import-label\">\n <span className=\"acp-field-hint\">{tr(lang, '配置 JSON', 'Configuration JSON')}</span>\n <textarea\n className=\"acp-import-textarea\"\n value={text}\n placeholder={PLACEHOLDER}\n disabled={busy}\n aria-label={tr(lang, '粘贴 ACP 配置 JSON', 'Paste ACP configuration JSON')}\n onChange={event => {\n setText(event.target.value)\n setParsed(null)\n setExcluded(new Set())\n setFeedback(null)\n }}\n />\n </label>\n\n <div className=\"acp-actions\">\n <button\n type=\"button\"\n className=\"acp-btn-secondary\"\n disabled={busy || text.trim().length === 0}\n onClick={() => {\n setFeedback(null)\n setParsed(parseAgentImport(text, { value, user }))\n setExcluded(new Set())\n }}\n >\n {tr(lang, '解析配置', 'Parse configuration')}\n </button>\n <button\n type=\"button\"\n className=\"acp-btn-ghost\"\n disabled={busy}\n onClick={() => {\n setText(PLACEHOLDER)\n setParsed(null)\n setExcluded(new Set())\n setFeedback(null)\n }}\n >\n {tr(lang, '填入 Devin 示例', 'Insert Devin example')}\n </button>\n {entries.length > 1 && (\n <button\n type=\"button\"\n className=\"acp-btn-ghost\"\n disabled={busy}\n onClick={() =>\n setExcluded(selected.length === entries.length ? new Set(entries.map(e => e.route)) : new Set())\n }\n >\n {tr(\n lang,\n selected.length === entries.length ? '全不选' : '全选',\n selected.length === entries.length ? 'Deselect all' : 'Select all'\n )}\n </button>\n )}\n </div>\n\n {parsed?.ok === false && (\n <div role=\"alert\" className=\"acp-banner acp-banner-error\">\n {tr(lang, `解析失败:${parsed.error}`, `Parse failed: ${parsed.error}`)}\n </div>\n )}\n\n {parsed?.ok === true && entries.length === 0 && (\n <div role=\"status\" className=\"acp-banner acp-banner-warning\">\n {tr(lang, '未找到有效的 Agent 配置', 'No valid agent configuration found')}\n </div>\n )}\n\n {entries.length > 0 && (\n <div className=\"acp-entries-list\" role=\"group\" aria-label={tr(lang, '解析得到的线路列表', 'Parsed routes list')}>\n {entries.map(entry => {\n const isChecked = !excluded.has(entry.route)\n const args = Array.isArray(entry.profile.args) ? entry.profile.args : []\n const cmdLine = [entry.profile.command, ...args].join(' ')\n return (\n <div key={entry.route} className=\"acp-entry-row\">\n <label className=\"acp-entry-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={isChecked}\n disabled={busy}\n aria-label={tr(lang, `选择导入 ${entry.name}`, `Select import ${entry.name}`)}\n onChange={event => toggle(entry.route, event.target.checked)}\n />\n <span className=\"acp-entry-details\">\n <span className=\"acp-entry-header\">\n <strong className=\"acp-entry-name\">{entry.name}</strong>\n <span className=\"acp-tag acp-tag-neutral\">{entry.route}</span>\n <span className={`acp-tag acp-tag-${entry.replaces ? 'warning' : 'success'}`}>\n {tr(lang, entry.replaces ? '替换现有' : '新建线路', entry.replaces ? 'Replace' : 'New')}\n </span>\n </span>\n <code className=\"acp-entry-cmd\" title={cmdLine}>{cmdLine}</code>\n </span>\n </label>\n </div>\n )\n })}\n </div>\n )}\n\n {parsed?.ok === true && parsed.skipped.map(issue => (\n <div key={issue.name} className=\"acp-hint-skipped\">\n {tr(\n lang,\n `已跳过「${issue.name}」:${translateIssue(issue.reason, 'zh')}`,\n `Skipped \"${issue.name}\": ${translateIssue(issue.reason, 'en')}`\n )}\n </div>\n ))}\n\n <div className=\"acp-import-footer\">\n <button\n type=\"button\"\n className=\"acp-btn-primary\"\n disabled={!canImport}\n onClick={() => { void handleImport() }}\n >\n {tr(\n lang,\n busy ? '正在导入…' : `导入 ${selected.length} 个 Agent`,\n busy ? 'Importing…' : `Import ${selected.length} Agent${selected.length === 1 ? '' : 's'}`\n )}\n </button>\n </div>\n\n {feedback && (\n <div\n role={feedback.tone === 'error' ? 'alert' : 'status'}\n className={`acp-banner acp-banner-${feedback.tone}`}\n >\n <div>{feedback.message}</div>\n {feedback.tone === 'success' && (\n <div className=\"acp-restart-notice\">\n <strong>{tr(lang, '重要提示:', 'Important: ')}</strong>\n {tr(\n lang,\n '线路已写入 acp.agents 配置,必须重启 Host 才能使新线路生效。',\n 'Routes written to acp.agents configuration; you must restart the Host for new routes to take effect.'\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n <div className=\"acp-note\">\n <h4>{tr(lang, '配置位置', 'Where the routes are configured')}</h4>\n <p>\n {tr(\n lang,\n '每条 ACP 线路写在本插件的 acp.agents 里,键就是模型选择器里显示的 provider 路由名。改完或导入后需要重启 Host 才会生效:配置在插件安装时读取一次。',\n 'Each ACP route lives in this plugin\\'s acp.agents block; the key is the provider route name shown in the model menu. A Host restart is required after a change or import, because the routes are read once when the plugin installs.'\n )}\n </p>\n <pre><code>{CONFIG_EXAMPLE}</code></pre>\n <p>\n {tr(\n lang,\n 'command 必填,是 agent 的可执行命令;写成绝对路径更稳(从桌面端启动时 GUI 进程的 PATH 往往比终端短),但 PATH 上的命令同样可用,因为 Host 直接 spawn 这个命令。args 可留空。models 可以整段省略:省略或留空时按 discoverModels(默认 true)向 agent 询问模型,问不到就用回退的 default 模型;写了 models 则每一项都要有 id。其余可选字段(permission、contextWindow、startupTimeoutMs 等)见 docs/COMPATIBILITY.md。',\n 'command is required: it is the agent executable. An absolute path is more reliable (a GUI-launched Host often has a shorter PATH than a terminal), but a command on PATH works too, because the Host spawns it directly. args may be empty. models may be omitted entirely: absent or empty means the route asks the agent via discoverModels (default true) and falls back to a default model when nothing is advertised; if you do list models, every entry needs an id. The remaining optional fields (permission, contextWindow, startupTimeoutMs, …) are listed in docs/COMPATIBILITY.md.'\n )}\n </p>\n </div>\n\n <div className=\"acp-note\">\n <h4>{tr(lang, '配置之后', 'After configuring')}</h4>\n <p>\n {tr(\n lang,\n '重启 Host 后,这些 ACP 线路会出现在原生模型选择和 Fusion 的组合里,可以像其他模型一样选为 Lead 或 Sidekick。它们是否列出工具、如何应答权限请求,由每个 agent 自己的实现和这里的 permission 设置决定。Fusion 只在本插件自己派发 Sidekick 任务时,才在该会话的 ACP session/new 里声明 Host 工具桥;其余 ACP 会话不带任何 MCP server。',\n 'Once the Host restarts, those ACP routes appear in the native model picker and in Fusion combos, and can be chosen as Lead or Sidekick like any other model. Whether they expose tools and how they answer permission requests is decided by each agent\\'s own implementation and by the permission setting you gave it. Fusion declares Host tools in an ACP session/new only while it is dispatching a Sidekick on that exact session; every other ACP session opens with no MCP server.'\n )}\n </p>\n </div>\n </section>\n )\n}\n","/**\n * The product identity this plugin presents.\n *\n * One plugin, one entry: `@sqdr2/dsh-fusion` (plugin id `dsh-fusion`) now hosts\n * the Fusion pair, the Antigravity (agy CLI) route and the ACP agent routes\n * together, so the page introduces the combined workspace while the sidebar row\n * keeps its short name. The package name, the plugin id, the state directory and\n * the model-menu provider are all still `dsh-fusion`; nothing here renames them.\n */\nexport const STUDIO_TITLE = 'DSH Agent Studio With Fusion'\n\n/** Sidebar row text. Short on purpose: the rail is narrow and the id is `fusion`. */\nexport const FUSION_SIDEBAR_LABEL = 'Fusion'\n","import { bi } from '../bilingual.js'\nimport type { PairProfile, PhysicalRoute } from '../contracts.js'\nimport { keepaliveChoice } from '../profile/keepalive.js'\nimport { compactorChoice } from '../profile/compactor.js'\nimport { isFusionProvider } from '../identity.js'\n\nexport interface PairChoice {\n lead: PhysicalRoute\n worker: PhysicalRoute\n outputTokens?: Partial<Record<'lead' | 'worker', number>>\n cacheKeepalive?: PairProfile['cacheKeepalive']\n compactor?: PairProfile['compactor']\n}\nexport interface SettingsCatalog {\n groups: readonly { id: string; name: string; models: readonly {\n id: string; name: string; reasoning?: { efforts: readonly { id: string; name: string }[]; defaultEffort?: string }\n }[] }[]\n}\n\n/** Saved Lead route from a raw settings or profile document, or undefined when unconfigured or pointed at Fusion itself. */\nexport function savedLeadRoute(value: unknown): { provider: string; model: string } | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined\n const route = (value as Record<string, unknown>).lead\n if (!route || typeof route !== 'object' || Array.isArray(route)) return undefined\n const provider = (route as Record<string, unknown>).provider, model = (route as Record<string, unknown>).model\n if (typeof provider !== 'string' || typeof model !== 'string' || isFusionProvider(provider)) return undefined\n return { provider, model }\n}\n\n/** The roles a saved pair names, in the order the settings page shows them. */\nexport type PairRole = 'lead' | 'worker' | 'compactor'\n\n/**\n * The routes a saved choice still names that the current catalog no longer\n * offers: a provider that was renamed or removed, or a model that was retired.\n *\n * Reading a saved combo tolerates a stale route so the row stays visible and\n * editable, but saving one does not. Without this, the page can only say that\n * *some* model is gone, which is unusable when the stale route is not the one\n * being edited — the user then cannot tell which combo to fix.\n */\nexport function missingRoutes(value: Partial<PairChoice> | undefined, catalog: SettingsCatalog): { role: PairRole; route: PhysicalRoute }[] {\n if (!value) return []\n const stale = (role: PairRole, route: PhysicalRoute | undefined) => route !== undefined\n && !catalog.groups.find(group => group.id === route.provider)?.models.find(model => model.id === route.model)\n ? [{ role, route }] : []\n return [...stale('lead', value.lead), ...stale('worker', value.worker), ...stale('compactor', value.compactor?.route)]\n}\n\n/** Configuration chooses registered physical models; it cannot create adapters. */\nexport function validatePairChoice(value: unknown, catalog: SettingsCatalog, combo?: string): PairChoice {\n // A list is validated row by row, so the failure has to say which row it came\n // from; `bi` carries both languages, so the label joins the message here\n // instead of being glued onto an already-bilingual string.\n const say = (zh: string, en: string) => combo\n ? bi(`组合「${combo}」:${zh}`, `Combo \"${combo}\": ${en}`) : bi(zh, en)\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(say('请选择 Lead 和 Worker', 'Choose a Lead and a Sidekick'))\n const raw = value as Record<string, unknown>\n const route = (role: string, candidate: unknown): PhysicalRoute => {\n const item = candidate as Record<string, unknown> | undefined\n if (!item || typeof item.provider !== 'string' || typeof item.model !== 'string') throw new Error(say(`请选择 ${role} 模型`, `Choose the ${role} model`))\n if (isFusionProvider(item.provider)) throw new Error(say('Fusion 必须选择真实模型', 'Fusion needs real models, not Fusion itself'))\n const group = catalog.groups.find(group => group.id === item.provider)\n const model = group?.models.find(model => model.id === item.model)\n // Name the exact route: after a provider rename the model usually still\n // exists elsewhere, so \"refresh and choose again\" alone leaves the user\n // guessing which of the two roles went stale.\n if (!model) throw new Error(say(`${role} 模型已不可用:${item.provider}/${item.model}。请为该角色重新选择模型`,\n `The ${role} model is no longer available: ${item.provider}/${item.model}. Choose a model for that role again`))\n if (item.reasoningEffort !== undefined && (typeof item.reasoningEffort !== 'string'\n || !model.reasoning?.efforts.some(effort => effort.id === item.reasoningEffort))) {\n throw new Error(say(`${role} 不支持所选推理强度`, `${role} does not support the selected reasoning level`))\n }\n return { provider: item.provider, model: item.model,\n ...(item.reasoningEffort === undefined ? {} : { reasoningEffort: item.reasoningEffort as string }) }\n }\n const cacheKeepalive = keepaliveChoice(raw.cacheKeepalive)\n const compactor = compactorChoice(raw.compactor)\n let outputTokens: PairChoice['outputTokens']\n if (raw.outputTokens !== undefined) {\n const value = raw.outputTokens\n if (!value || typeof value !== 'object' || Array.isArray(value)\n || Object.entries(value).some(([role, tokens]) => !['lead', 'worker'].includes(role)\n || !Number.isSafeInteger(tokens) || Number(tokens) < 1 || Number(tokens) > 128_000)) {\n throw new Error(say('每次响应上限必须是 1–128000 的整数 Token 数', 'The per-response limit must be an integer of 1–128000 tokens'))\n }\n outputTokens = { ...value } as PairChoice['outputTokens']\n }\n return { lead: route('lead', raw.lead), worker: route('worker', raw.worker),\n ...(outputTokens === undefined ? {} : { outputTokens }),\n ...(cacheKeepalive === undefined ? {} : { cacheKeepalive }),\n ...(compactor === undefined ? {} : { compactor: { ...compactor, route: route('压缩 · Compaction', compactor.route) } }) }\n}\n\n/** New sessions can opt into this Worker cap. Frozen sessions keep their saved profile. */\nexport const WORKER_IMPLEMENTATION_OUTPUT_TOKENS = 128_000\n\nexport function profileFromChoice(pair: PairChoice, id = 'fusion-auto'): Record<string, unknown> {\n const { outputTokens, ...routes } = pair\n const version = outputTokens?.worker === WORKER_IMPLEMENTATION_OUTPUT_TOKENS ? '0.1.0-worker-128k' : '0.1.0-faithful'\n return { schemaVersion: 1, id, version, enabled: true, quality: 'experimental',\n ...routes, workerUpgradePath: [], dataPolicyId: 'native-host-workspace-policy', evidenceCampaignIds: [],\n ...(outputTokens === undefined ? {} : { context: Object.fromEntries(Object.entries(outputTokens)\n .map(([role, reserveOutputTokens]) => [role, { reserveOutputTokens }])) }) }\n}\n\n/**\n * Product defaults; explicit legacy/benchmark profiles retain their old contract.\n * `id` names the combo; the first one keeps the historical `fusion-auto` so a\n * profile frozen before combos existed keeps its identity.\n */\nexport function modelProfileFromChoice(pair: PairChoice, id = 'fusion-auto'): Record<string, unknown> {\n const { outputTokens: _output, ...native } = pair\n return { ...profileFromChoice(native, id), version: '0.2.0-enforced-v3', interactionMode: 'model-like', workflowPolicy: 'enforced-v3' }\n}\n\n/** Keep existing default settings stable; expose explicit larger/smaller limits on reload. */\nexport function choiceFromProfile(profile: PairProfile): PairChoice {\n const outputTokens = Object.fromEntries((['lead', 'worker'] as const)\n .filter(role => profile.context[role].reserveOutputTokens !== 8_000)\n .map(role => [role, profile.context[role].reserveOutputTokens]))\n return { lead: profile.lead, worker: profile.worker,\n ...(profile.interactionMode !== 'model-like' && Object.keys(outputTokens).length ? { outputTokens } : {}),\n ...(profile.compactor === undefined ? {} : { compactor: profile.compactor }),\n ...(profile.cacheKeepalive === undefined ? {} : { cacheKeepalive: profile.cacheKeepalive }) }\n}\n","const listeners = new Set<() => void>()\nexport const onSettingsChanged = (listener: () => void): (() => void) => { listeners.add(listener); return () => { listeners.delete(listener) } }\nexport const settingsChanged = (): void => { for (const listener of listeners) listener() }\n","import { FusionHistory } from './FusionHistory.js'\nimport { FusionCache } from './FusionCache.js'\nimport { AgyConsole } from './agy/AgyConsole.js'\nimport { AcpSettingsGuide } from './AcpSettingsGuide.js'\nimport { STUDIO_TITLE } from './studio-brand.js'\nimport { useEffect, useState } from 'react'\nimport type { PhysicalRoute } from '../contracts.js'\nimport type { PairChoice, SettingsCatalog } from '../host/settings.js'\nimport { missingRoutes } from '../host/settings.js'\nimport { settingsChanged } from './settings-events.js'\nimport { tr, useLang } from './i18n.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\n/** One saved combo as the page shows it: its id, its label and its pair. */\nexport interface SavedPairView { id: string; name: string; pair: PairChoice; authorized: boolean; reason?: string }\ninterface SettingsState {\n revision: number\n catalog: SettingsCatalog\n pairs: SavedPairView[]\n maxPairs: number\n authorized: boolean\n managedAuthorization?: boolean\n reason?: string\n}\n/** A row being edited. `id` is absent until the list is saved for the first time. */\ninterface DraftCombo { key: string; id?: string; name: string; pair: Partial<PairChoice> }\nconst styles = `\n.fusion-page{box-sizing:border-box;width:100%;height:100%;min-width:0;min-height:0;flex:1 1 auto;overflow:auto;display:flex;flex-direction:column;align-items:center;scrollbar-gutter:stable;padding:0 clamp(24px,4vw,48px) 48px;--dsh-scrollbar-width:9px;--dsh-scrollbar-thumb-border:2px}\n.fusion-settings{box-sizing:border-box;width:100%;max-width:680px;margin:0 auto;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column;gap:18px}\n.fusion-settings h2{margin:0;font-size:22px;line-height:30px;font-weight:600}\n.fusion-settings p{margin:0;font-size:13px;line-height:21px;color:var(--dsw-alias-label-secondary)}\n.fusion-settings header{display:flex;flex-direction:column;gap:8px;padding-top:28px}\n[data-platform='darwin'] .fusion-settings header{padding-top:calc(28px + var(--dsh-frame-top-clearance,0px))}\n.fusion-settings .fusion-card{padding:20px;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;display:flex;flex-direction:column;gap:20px;background:var(--dsw-alias-bg-module-platform)}\n.fusion-settings fieldset{padding:0;margin:0;border:0;min-inline-size:0;display:flex;flex-direction:column;gap:10px}\n.fusion-settings legend{font-size:15px;font-weight:600;padding:0 0 4px}\n.fusion-settings label{display:grid;grid-template-columns:85px minmax(0,1fr);align-items:center;gap:12px;font-size:13px}\n.fusion-settings :is(select,option,optgroup){background-color:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);color-scheme:inherit}\n.fusion-settings select{box-sizing:border-box;min-width:0;width:100%;min-height:36px;border:1px solid var(--dsw-alias-border-l2);border-radius:7px;padding:5px 9px;font:inherit}\n.fusion-settings .fusion-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}\n.fusion-settings button{border:1px solid var(--dsw-alias-border-l2);border-radius:18px;background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary));color:var(--dsw-alias-label-primary-foreground,#fff);padding:7px 18px;font:inherit;font-size:13px;cursor:pointer}\n.fusion-settings button:disabled{opacity:.5;cursor:default}\n.fusion-settings :is(button,select):focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\n.fusion-settings [role=alert]{color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere}\n.fusion-settings details{font-size:13px;line-height:21px}\n.fusion-settings summary{cursor:pointer;font-weight:500}\n.fusion-settings .fusion-limits{display:flex;flex-direction:column;gap:12px;padding-top:14px}\n.fusion-settings :is(input[type=number],input[type=text]){min-width:0;width:100%;box-sizing:border-box;background-color:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);border-radius:7px;padding:8px;font:inherit}\n.fusion-settings .fusion-consent{display:flex;align-items:flex-start;gap:8px;font-size:12px;line-height:18px}\n.fusion-combos{display:flex;flex-direction:column;gap:8px}\n.fusion-settings .fusion-combo{display:flex;align-items:stretch;padding:0;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;background-color:var(--dsw-alias-bg-layer-1);font-size:13px;overflow:hidden;transition:border-color .15s ease,background-color .15s ease}\n.fusion-settings .fusion-combo:hover{background-color:var(--dsw-alias-interactive-bg-hover)}\n.fusion-settings .fusion-combo[data-active=true]{border-color:var(--dsw-alias-brand-primary);background-color:var(--dsw-alias-interactive-bg-hover-accent)}\n.fusion-settings .fusion-combo-main{flex:1 1 auto;display:flex;align-items:center;gap:10px;min-width:0;padding:11px 12px;background:none;border:0;border-radius:0;color:inherit;font:inherit;text-align:left;cursor:pointer}\n.fusion-settings .fusion-combo-main:hover{background:none}\n.fusion-settings .fusion-combo :is(.fusion-combo-main,.fusion-combo-actions):focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}\n.fusion-settings .fusion-combo-check{position:relative;flex:none;width:14px;height:14px;border:1.5px solid var(--dsw-alias-border-l2);border-radius:50%;transition:border-color .15s ease}\n.fusion-settings .fusion-combo:hover .fusion-combo-check{border-color:var(--dsw-alias-label-tertiary)}\n.fusion-settings .fusion-combo[data-active=true] .fusion-combo-check{border-color:var(--dsw-alias-brand-primary)}\n.fusion-settings .fusion-combo[data-active=true] .fusion-combo-check::after{content:'';position:absolute;inset:2.5px;border-radius:50%;background:var(--dsw-alias-brand-primary)}\n.fusion-settings .fusion-combo-text{display:flex;flex-direction:column;gap:2px;min-width:0}\n.fusion-settings .fusion-combo-name{font-weight:600;overflow-wrap:anywhere}\n.fusion-settings .fusion-combo-routes{color:var(--dsw-alias-label-secondary);font-size:12px;overflow-wrap:anywhere}\n.fusion-settings .fusion-combo-stale{color:var(--dsw-alias-state-error-primary);font-size:12px;overflow-wrap:anywhere}\n.fusion-settings .fusion-combo-actions{flex:none;align-self:stretch;display:flex;align-items:center;padding:0 14px;border:0;border-left:1px solid var(--dsw-alias-border-l1);border-radius:0;background:none;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;cursor:pointer;transition:color .15s ease,background-color .15s ease}\n.fusion-settings .fusion-combo-actions:hover:not(:disabled){color:var(--dsw-alias-state-error-primary);background-color:var(--dsw-alias-interactive-bg-hover-danger)}\n.fusion-settings .fusion-combo-actions:disabled{opacity:.4;cursor:default}\n.fusion-settings .fusion-combo-add{align-self:flex-start;padding:8px 16px;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:none;color:var(--dsw-alias-label-secondary);font-size:13px}\n.fusion-settings .fusion-combo-add:hover:not(:disabled){background-color:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.fusion-cache{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.fusion-cache h3{margin:0}\n.fusion-cache-summary{cursor:pointer;font-weight:600;font-size:14px;display:flex;align-items:center;justify-content:space-between;list-style:none;user-select:none;padding:2px 0}\n.fusion-cache-summary::-webkit-details-marker{display:none}\n.fusion-cache-summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}\n.fusion-cache-title{display:inline-flex;align-items:center;gap:6px}\n.fusion-cache-title h3{margin:0;font-size:15px;font-weight:600}\n.fusion-cache-indicator{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:400;color:var(--dsw-alias-label-secondary)}\n.fusion-cache-chevron{display:inline-block;width:7px;height:7px;border-right:2px solid var(--dsw-alias-label-secondary);border-bottom:2px solid var(--dsw-alias-label-secondary);transform:rotate(-45deg);transition:transform .15s ease;margin-left:2px}\n.fusion-cache[open] .fusion-cache-chevron{transform:rotate(45deg)}\n.fusion-cache-content{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);margin-top:4px}\n.fusion-cache-model{display:flex;flex-direction:column;gap:8px;padding:14px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px}\n.fusion-cache-model small{display:block;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere}\n.fusion-cache-controls{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr) auto;gap:10px;align-items:end}\n.fusion-cache-controls label{grid-template-columns:1fr;gap:4px}\n.fusion-cache a{color:var(--dsw-alias-brand-primary)}\n@media(max-width:560px){.fusion-cache-controls{grid-template-columns:1fr}}\n.fusion-history{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.fusion-history-summary{cursor:pointer;font-weight:600;font-size:14px;display:flex;align-items:center;justify-content:space-between;list-style:none;user-select:none;padding:2px 0}\n.fusion-history-summary::-webkit-details-marker{display:none}\n.fusion-history-summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}\n.fusion-history-title{display:inline-flex;align-items:center;gap:6px}\n.fusion-history-title h3{margin:0;font-size:15px;font-weight:600}\n.fusion-history-indicator{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:400;color:var(--dsw-alias-label-secondary)}\n.fusion-history-chevron{display:inline-block;width:7px;height:7px;border-right:2px solid var(--dsw-alias-label-secondary);border-bottom:2px solid var(--dsw-alias-label-secondary);transform:rotate(-45deg);transition:transform .15s ease;margin-left:2px}\n.fusion-history[open] .fusion-history-chevron{transform:rotate(45deg)}\n.fusion-history-content{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);margin-top:4px}\n.fusion-history-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}\n.fusion-history-panel{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.fusion-history-usage h3{margin:0;font-size:14px;font-weight:600}\n.fusion-history table{width:100%;border-collapse:collapse;font-size:12px;text-align:left}\n.fusion-history :is(th,td){padding:8px;border-bottom:1px solid var(--dsw-alias-border-l2);font-weight:400;vertical-align:top}\n.fusion-history caption{text-align:left;font-size:13px;margin-bottom:8px}\n.fusion-history small{display:block;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere}\n.fusion-history ol{padding-left:20px;margin:0}\n.fusion-history li{padding:10px 0;border-bottom:1px solid var(--dsw-alias-border-l2)}\n.fusion-history li:last-child{border-bottom:0}\n.fusion-history h3{margin:0;font-size:14px;font-weight:600}\n.fusion-history p{overflow-wrap:anywhere}\n.fusion-history-tasks-summary{cursor:pointer;font-weight:600;font-size:14px;display:flex;align-items:center;justify-content:space-between;list-style:none;user-select:none;padding:2px 0}\n.fusion-history-tasks-summary::-webkit-details-marker{display:none}\n.fusion-history-tasks-summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}\n.fusion-history-tasks-title{display:inline-flex;align-items:center;gap:6px}\n.fusion-history-count{font-size:13px;font-weight:400;color:var(--dsw-alias-label-secondary)}\n.fusion-history-tasks-indicator{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:400;color:var(--dsw-alias-label-secondary)}\n.fusion-history-tasks-chevron{display:inline-block;width:7px;height:7px;border-right:2px solid var(--dsw-alias-label-secondary);border-bottom:2px solid var(--dsw-alias-label-secondary);transform:rotate(-45deg);transition:transform .15s ease;margin-left:2px}\n.fusion-history-tasks[open] .fusion-history-tasks-chevron{transform:rotate(45deg)}\n.fusion-history-tasks-content{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);margin-top:4px}\n.fusion-history-item-header{display:flex;align-items:center;justify-content:space-between;gap:12px}\n.fusion-history-item-header h3{margin:0;font-size:14px;font-weight:600}\n.fusion-history-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}\n.fusion-history-actions button{padding:3px 12px;font-size:12px;border-radius:14px}\n.fusion-history-actions button.fusion-btn-subtle{background:transparent;color:var(--dsw-alias-label-primary)}\n.fusion-history-confirm-text{font-size:12px;color:var(--dsw-alias-label-secondary)}\n@media(max-width:480px){.fusion-page{padding:0 16px 32px}.fusion-settings label{grid-template-columns:1fr;gap:6px}.fusion-settings .fusion-card{padding:16px}}\n.fusion-agy{box-sizing:border-box;width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-module-platform);padding:16px;display:flex;flex-direction:column;gap:12px}\n.fusion-agy-summary{cursor:pointer;font-weight:600;font-size:14px;display:flex;align-items:center;justify-content:space-between;gap:12px;list-style:none;user-select:none;padding:2px 0}\n.fusion-agy-summary::-webkit-details-marker{display:none}\n.fusion-agy-summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:4px}\n.fusion-agy-title h3{margin:0;font-size:15px;font-weight:600}\n.fusion-agy-summary small{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:400}\n.fusion-agy-content{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);margin-top:4px;min-width:0}\n.fusion-nav{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0;padding:0}\n.fusion-nav button{padding:6px 14px;border-radius:14px;background:none;color:var(--dsw-alias-label-secondary);font-size:13px;border:1px solid var(--dsw-alias-border-l2)}\n.fusion-nav button[aria-pressed=true]{background:var(--dsw-alias-interactive-bg-hover-accent);border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary);font-weight:600}\n.fusion-nav button:hover:not([aria-pressed=true]){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.fusion-section{display:flex;flex-direction:column;gap:18px;min-width:0}\n/* An author rule beats the UA [hidden] style, so hiding a section needs its own rule. */\n.fusion-section[hidden]{display:none}\n`\n\nconst key = (route: PhysicalRoute | undefined) => route ? JSON.stringify([route.provider, route.model]) : ''\n\nexport function ModelChoice({ role, route, catalog, onChange }: {\n role: 'Lead' | 'Sidekick' | 'compactor'; route?: PhysicalRoute; catalog: SettingsCatalog; onChange(route: PhysicalRoute | undefined): void\n}) {\n const lang = useLang()\n const name = role === 'compactor' ? tr(lang, '压缩', 'Compaction') : role\n const model = catalog.groups.find(group => group.id === route?.provider)?.models.find(model => model.id === route?.model)\n // A saved route the catalog no longer offers would otherwise fall back to the\n // placeholder, silently reading as \"nothing chosen\" — and hiding which model\n // went away. Keep it listed, disabled and labelled, until it is replaced.\n const stale = route !== undefined && model === undefined\n return <fieldset>\n <legend>{name}</legend>\n <p>{role === 'Lead' ? tr(lang, '回答问题、制定方案并审查结果。', 'Answers, plans and reviews.') : role === 'Sidekick' ? tr(lang, '执行命令和修改,接收反馈后继续。', 'Runs commands and makes changes, then continues with feedback.') : tr(lang, '整理较早的上下文,供 Lead 或 Worker 继续工作。', 'Summarises older context so the Lead or Sidekick can continue.')}</p>\n <label>{tr(lang, '模型', 'Model')}<select aria-label={tr(lang, `${name} 模型`, `${name} model`)} value={key(route)} onChange={event => {\n if (!event.target.value) { onChange(undefined); return }\n const [provider, model] = JSON.parse(event.target.value) as [string, string]\n onChange({ provider, model })\n }}>\n <option value=\"\" disabled={role !== 'compactor'}>{role === 'compactor' ? tr(lang, '使用当前角色模型', 'Use the role\\'s own model') : tr(lang, '选择已连接的模型', 'Choose a connected model')}</option>\n {stale && route && <option value={key(route)} disabled>{tr(lang, `已不可用:${route.provider}/${route.model}`, `No longer available: ${route.provider}/${route.model}`)}</option>}\n {catalog.groups.map(group => <optgroup key={group.id} label={group.name}>\n {group.models.map(model => <option key={model.id} value={key({ provider: group.id, model: model.id })}>{model.name}</option>)}\n </optgroup>)}\n </select></label>\n {stale && route && <p role=\"alert\">{tr(lang, `这个角色保存的模型 ${route.provider}/${route.model} 已不可用,请重新选择。`,\n `This role's saved model ${route.provider}/${route.model} is no longer available; choose another.`)}</p>}\n {model?.reasoning && route && <label>{tr(lang, '推理强度', 'Reasoning')}<select aria-label={tr(lang, `${name} 推理强度`, `${name} reasoning`)} value={route.reasoningEffort ?? ''} onChange={event => {\n const { reasoningEffort: _old, ...physical } = route\n onChange({ ...physical, ...(event.target.value ? { reasoningEffort: event.target.value } : {}) })\n }}>\n <option value=\"\">{tr(lang, '模型默认', 'Model default')}{model.reasoning.defaultEffort ? ` · ${model.reasoning.defaultEffort}` : ''}</option>\n {model.reasoning.efforts.map(effort => <option key={effort.id} value={effort.id}>{effort.name}</option>)}\n </select></label>}\n </fieldset>\n}\n\nlet draftKeys = 0\nconst toDraft = (pairs: readonly SavedPairView[]): DraftCombo[] => pairs.map(({ id, name, pair }) => ({ key: id, id, name, pair }))\n\n/** The three regions of this one page. Fusion is the default and the plugin's core. */\ntype StudioSection = 'fusion' | 'antigravity' | 'acp'\nconst STUDIO_SECTIONS: readonly StudioSection[] = ['fusion', 'antigravity', 'acp']\nconst SECTION_ID = (section: StudioSection) => `fusion-section-${section}`\n\nexport function FusionSettings() {\n const lang = useLang()\n const [section, setSection] = useState<StudioSection>('fusion')\n const [state, setState] = useState<SettingsState>()\n const [draft, setDraft] = useState<DraftCombo[]>([])\n const [active, setActive] = useState(0)\n const [error, setError] = useState<string>()\n const [notice, setNotice] = useState<string>()\n const [saving, setSaving] = useState(false)\n const current = draft[Math.min(active, draft.length - 1)]\n const routeName = (route?: PhysicalRoute) => route\n ? state?.catalog.groups.find(group => group.id === route.provider)?.models.find(model => model.id === route.model)?.name\n ?? `${route.provider}/${route.model}` : '—'\n const roleLabel = (role: 'lead' | 'worker' | 'compactor') => role === 'lead' ? tr(lang, 'Lead', 'Lead')\n : role === 'worker' ? tr(lang, 'Sidekick', 'Sidekick') : tr(lang, '压缩模型', 'Compaction model')\n const update = (change: (combo: DraftCombo) => DraftCombo) => setDraft(value => value.map((combo, index) =>\n combo.key === current?.key ? change(combo) : combo))\n const chooseModel = (role: 'lead' | 'worker', route: PhysicalRoute) => update(combo => ({ ...combo, pair: { ...combo.pair, [role]: route,\n ...(combo.pair.cacheKeepalive ? { cacheKeepalive: { ...combo.pair.cacheKeepalive, [role]: role === 'lead' ? 'auto' : false } } : {}) } }))\n useEffect(() => {\n const abort = new AbortController()\n void fetch(`${FUSION_API_PATH}?view=settings`, { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n .then(async response => { if (!response.ok) throw new Error(tr(lang, '无法读取 Fusion 设置', 'Cannot read Fusion settings')); return response.json() as Promise<SettingsState> })\n .then(value => { setState(value); setDraft(toDraft(value.pairs)); setActive(0) })\n .catch(error => { if (!abort.signal.aborted) setError(String(error)) })\n return () => abort.abort()\n }, [])\n const addCombo = () => {\n draftKeys += 1\n setDraft(value => [...value, { key: `new-${draftKeys}`, name: tr(lang, `组合 ${value.length + 1}`, `Combo ${value.length + 1}`), pair: {} }])\n setActive(draft.length)\n }\n const removeCombo = (index: number) => {\n setDraft(value => value.filter((_, position) => position !== index))\n setActive(Math.max(0, Math.min(active > index ? active - 1 : active, draft.length - 2)))\n }\n const save = async () => {\n if (!state) return\n const invalid = draft.findIndex(combo => !combo.pair.lead || !combo.pair.worker || !combo.name.trim())\n if (invalid >= 0) { setError(tr(lang, `第 ${invalid + 1} 个组合还不完整:需要名称、Lead 和 Sidekick。`, `Combo ${invalid + 1} is incomplete: it needs a name, a Lead and a Sidekick.`)); return }\n // A route that no longer exists cannot be saved, and the Host's own refusal\n // names only the role. Checked here so the message can name the combo too:\n // with several rows, \"the Lead model is gone\" does not say which row to open.\n const stale = draft.flatMap((combo, index) => missingRoutes(combo.pair, state.catalog).map(({ role, route }) =>\n tr(lang, `第 ${index + 1} 个组合「${combo.name.trim() || tr(lang, '未命名组合', 'Untitled combo')}」的 ${roleLabel(role)} 模型已不可用:${route.provider}/${route.model}。请为该角色重新选择模型。`,\n `Combo ${index + 1} \"${combo.name.trim() || 'Untitled combo'}\" still names a ${roleLabel(role)} model that is no longer available: ${route.provider}/${route.model}. Choose a model for that role again.`)))\n if (stale.length) { setError(stale.join(tr(lang, ' ', ' '))); return }\n setSaving(true); setError(undefined); setNotice(undefined)\n try {\n const pairs = draft.map(({ id, name, pair }) => {\n const { outputTokens, ...rest } = pair\n const limits = Object.fromEntries(Object.entries(outputTokens ?? {}).filter(([, tokens]) => Number.isSafeInteger(tokens) && Number(tokens) > 0))\n return { ...(id ? { id } : {}), name: name.trim(), pair: { ...rest, ...(Object.keys(limits).length ? { outputTokens: limits } : {}) } }\n })\n const response = await fetch(FUSION_API_PATH, { method: 'POST', credentials: 'same-origin',\n headers: { 'content-type': 'application/json' }, body: JSON.stringify({ action: 'configure', revision: state.revision, pairs }) })\n const result = await response.json() as { revision: number; error?: string }\n if (!response.ok) throw new Error(result.error ?? tr(lang, '保存失败,请刷新后重试', 'Save failed; refresh and try again'))\n const confirmed = await fetch(`${FUSION_API_PATH}?view=settings`, { credentials: 'same-origin', cache: 'no-store' })\n if (!confirmed.ok) throw new Error(tr(lang, '配置已提交,但暂时无法确认,请刷新', 'Saved, but not confirmed yet; refresh'))\n const next = await confirmed.json() as SettingsState\n setState(next); setDraft(toDraft(next.pairs)); setActive(0)\n settingsChanged()\n setNotice(tr(lang, '组合已保存。模型菜单中每个组合各占一项,不同会话可以同时使用不同组合。', 'Combos saved. Each one is its own model-menu entry, so different conversations can use different combos at the same time.'))\n } catch (error) { setError(error instanceof Error ? error.message : String(error)) }\n finally { setSaving(false) }\n }\n const dirty = state ? JSON.stringify(draft.map(({ id, name, pair }) => ({ id, name, pair })))\n !== JSON.stringify(state.pairs.map(({ id, name, pair }) => ({ id, name, pair }))) : false\n const blocked = state?.pairs.filter(pair => !pair.authorized) ?? []\n return <div className=\"fusion-page\">\n <style>{styles}</style>\n <div className=\"fusion-settings\">\n <header data-window-drag><h2>{STUDIO_TITLE}</h2>\n <p>{tr(lang, '一个插件整合三种能力:Fusion 组合(在这里配置,Lead 与 Sidekick 分摊工作与成本)、Antigravity(agy CLI 模型线路,账号与额度管理)与 ACP 代理线路(接入说明)。左侧边栏只有 Fusion 一个入口,三个区域在本页内切换。',\n 'One plugin for three capabilities: Fusion combos (configured here — a Lead and a Sidekick sharing the work and the cost), Antigravity (the agy CLI model route, with account and quota management) and ACP agent routes (setup guidance). The sidebar has one entry — Fusion — and the three are sections of this page.')}</p>\n </header>\n {/* A button group, not a tablist: no roving tabindex, no arrow-key focus\n management, so it must not claim role=\"tab\". The sections stay plain\n accessible regions the buttons point at. */}\n <nav className=\"fusion-nav\" aria-label={tr(lang, '本页区域', 'Page sections')}>\n {STUDIO_SECTIONS.map(name => <button key={name} type=\"button\"\n aria-pressed={section === name}\n aria-controls={SECTION_ID(name)}\n onClick={() => setSection(name)}>{name === 'fusion' ? tr(lang, 'Fusion 组合', 'Fusion combos')\n : name === 'antigravity' ? tr(lang, 'Antigravity', 'Antigravity') : tr(lang, 'ACP 线路', 'ACP routes')}</button>)}\n </nav>\n {error && <p role=\"alert\">{error}</p>}\n {notice && <p role=\"status\">{notice}</p>}\n {/* The Fusion region stays mounted while another section is shown: unsaved\n combo edits and the selected row live in this component's state, and a\n hidden section keeps them. `hidden` (not unmounting) is what preserves them. */}\n <div className=\"fusion-section\" id={SECTION_ID('fusion')} hidden={section !== 'fusion'}\n role=\"region\" aria-label={tr(lang, 'Fusion 组合', 'Fusion combos')}>\n <h3>{tr(lang, 'Fusion 组合', 'Fusion combos')}</h3>\n <p>{tr(lang, '每个组合是一对 Lead 和 Sidekick,会作为单独的一项出现在模型菜单里。开启多个会话时,可以为每个会话选择不同的组合。', 'Each combo is a Lead and a Sidekick pair, listed as its own entry in the model menu. With several conversations open, each one can use a different combo.')}</p>\n <p>{tr(lang, 'Lead 处理日常请求、安排工作并审查结果;Sidekick 执行委派的任务。', 'The Lead handles requests, plans and reviews; the Sidekick does the delegated work.')}</p>\n <p><b>{tr(lang, '搭配建议', 'Pairing tip')}</b>: {tr(lang, 'Fusion 省钱靠的是 Sidekick 比 Lead 便宜得多。选一个强的前沿模型当 Lead,再选一个价格低很多(最好 5 倍以上)的模型当 Sidekick;两者价格越接近,越省不了钱。',\n 'Fusion saves money because the Sidekick is much cheaper than the Lead. Pick a strong frontier Lead and a Sidekick that costs far less (ideally 5× or more); the closer their prices, the smaller the saving.')}</p>\n {!state && !error && <p role=\"status\">{tr(lang, '正在读取模型…', 'Loading models…')}</p>}\n {state && <>\n <section className=\"fusion-card\" aria-label={tr(lang, '组合列表', 'Combo list')}>\n <div className=\"fusion-combos\">\n {draft.map((combo, index) => {\n const selected = combo.key === current?.key\n const label = combo.name.trim() || tr(lang, '未命名组合', 'Untitled combo')\n // The whole row is the selection target: the button spans the row up to the Delete\n // button, so the padding and the empty space beside the text select the combo too.\n return <div className=\"fusion-combo\" key={combo.key} data-active={selected}>\n <button type=\"button\" className=\"fusion-combo-main\" aria-pressed={selected}\n onClick={() => setActive(index)}>\n <span className=\"fusion-combo-check\" aria-hidden=\"true\" />\n <span className=\"fusion-combo-text\">\n <span className=\"fusion-combo-name\">{label}</span>\n <span className=\"fusion-combo-routes\">{`${routeName(combo.pair.lead)} → ${routeName(combo.pair.worker)}`}</span>\n {missingRoutes(combo.pair, state.catalog).length > 0 && <span className=\"fusion-combo-stale\">\n {tr(lang, '有模型已不可用,需要重新选择', 'A model is no longer available; choose it again')}</span>}\n </span>\n </button>\n <button type=\"button\" className=\"fusion-combo-actions\" disabled={saving || draft.length <= 1}\n aria-label={tr(lang, `删除组合 ${label}`, `Delete combo ${label}`)}\n onClick={event => { event.stopPropagation(); removeCombo(index) }}>{tr(lang, '删除', 'Delete')}</button>\n </div>\n })}\n {!draft.length && <p>{tr(lang, '还没有组合。新增一个,选择 Lead 和 Sidekick 后保存。', 'No combos yet. Add one, choose a Lead and a Sidekick, then save.')}</p>}\n </div>\n <button type=\"button\" className=\"fusion-combo-add\" disabled={saving || draft.length >= state.maxPairs} onClick={addCombo}>{tr(lang, '+ 新增组合', '+ Add combo')}</button>\n <p>{tr(lang, `最多保存 ${state.maxPairs} 个组合;模型菜单中的名称是「Fusion · 组合名称」。`, `Up to ${state.maxPairs} combos; the model menu shows them as “Fusion · name”.`)}</p>\n </section>\n {current && <fieldset className=\"fusion-card\" disabled={saving}>\n <label>{tr(lang, '名称', 'Name')}<input type=\"text\" maxLength={40} aria-label={tr(lang, '组合名称', 'Combo name')}\n value={current.name} onChange={event => update(combo => ({ ...combo, name: event.target.value }))} /></label>\n <ModelChoice role=\"Lead\" route={current.pair.lead} catalog={state.catalog} onChange={route => { if (route) chooseModel('lead', route) }} />\n <ModelChoice role=\"Sidekick\" route={current.pair.worker} catalog={state.catalog} onChange={route => { if (route) chooseModel('worker', route) }} />\n <details><summary>{tr(lang, '上下文压缩模型 · 可选', 'Compaction model · optional')}</summary>\n <div className=\"fusion-limits\">\n <p>{tr(lang, '默认由当前角色模型压缩。也可以单独选择已连接的模型;请求由所选账号计费。', 'By default each role compacts with its own model. You can pick another connected model; its account is billed.')}</p>\n <ModelChoice role=\"compactor\" route={current.pair.compactor?.route} catalog={state.catalog} onChange={route => update(combo => {\n const { compactor, ...rest } = combo.pair\n return { ...combo, pair: route ? { ...rest, compactor: { route, maxOutputTokens: compactor?.maxOutputTokens ?? 8192 } } : rest }\n })} />\n {current.pair.compactor && <label>{tr(lang, '输出 Token 上限', 'Output token limit')}<input aria-label={tr(lang, '压缩输出 Token 上限', 'Compaction output token limit')} type=\"number\" min=\"1\" max=\"128000\"\n value={current.pair.compactor.maxOutputTokens} onChange={event => { const maxOutputTokens = Number(event.target.value)\n update(combo => combo.pair.compactor ? { ...combo, pair: { ...combo.pair, compactor: { ...combo.pair.compactor, maxOutputTokens } } } : combo) }} /></label>}\n </div>\n </details>\n </fieldset>}\n <div className=\"fusion-actions\"><p>{tr(lang, '已选中的会话保留原组合;新选择使用新组合。额度耗尽后要换当前任务的 Sidekick,用该会话的 Fusion 恢复面板,而不是只改这里。', 'Conversations already using Fusion keep their pair; new selections use the new one. After a quota stop, switch this conversation\\'s Sidekick from its Fusion recovery panel, not only here.')}</p>\n <button disabled={saving || !dirty || !draft.length} onClick={() => { void save() }}>{saving ? tr(lang, '正在保存…', 'Saving…') : tr(lang, '保存组合', 'Save combos')}</button>\n </div>\n <p>{tr(lang, '输出参数跟随原生模型设置,Fusion 不额外限制请求次数或任务轮数。', 'Output settings follow the native model settings; Fusion adds no request or round limits.')}</p>\n <p>{tr(lang, '保存即表示允许 Fusion 使用所选模型的现有账号;费用由这些账号计入,当前未提供可靠的实际账单金额。', 'Saving lets Fusion use the chosen models\\' existing accounts; they are billed there, and no reliable billed amount is available here.')}</p>\n {blocked.map(pair => <p key={pair.id} role=\"status\">{`${pair.name}: ${tr(lang, '尚未就绪,需要重新保存这个组合', 'not ready yet; save this combo again')}${pair.reason ? `: ${pair.reason}` : ''}`}</p>)}\n {state.managedAuthorization && <p>{tr(lang, '运行额度由外部授权配置管理。', 'Run limits are managed by an external authorization file.')}</p>}\n </>}\n <FusionCache refresh={state?.revision ?? 0} />\n <FusionHistory />\n </div>\n {/* Both regions stay in the document so every `aria-controls` resolves, and\n both are `hidden` while unselected. Only their CONTENTS mount on demand:\n the console starts a 3s status poll and reads the account pool on mount,\n so an unvisited section must not pay for it. */}\n <div className=\"fusion-section\" id={SECTION_ID('antigravity')} hidden={section !== 'antigravity'}\n role=\"region\" aria-label={tr(lang, 'Antigravity(agy CLI)', 'Antigravity (agy CLI)')}>\n <h3>{tr(lang, 'Antigravity', 'Antigravity')}</h3>\n <p>{tr(lang, '把 Google Antigravity(agy CLI)作为模型路线与 Sidekick 使用。这里管理它的账号、额度、模型可见性与权限模式;路线名为 antigravity,命令为 /agy。',\n 'Use Google Antigravity (agy CLI) as a model route and as a Sidekick. This section manages its accounts, quota, model visibility and permission mode; the route is antigravity and the command is /agy.')}</p>\n {section === 'antigravity' && <AgyConsole isModal={false} />}\n </div>\n <div className=\"fusion-section\" id={SECTION_ID('acp')} hidden={section !== 'acp'}\n role=\"region\" aria-label={tr(lang, 'ACP 线路', 'ACP routes')}>\n {section === 'acp' && <AcpSettingsGuide />}\n </div>\n </div>\n </div>\n}\n","import type { ReactNode } from 'react'\n\nexport interface FusionPanelIconProps {\n /** Square size in pixels requested by the host sidebar (defaults to 16). */\n size?: number\n /** Whether the panel is currently active/selected in the main column. */\n active?: boolean\n className?: string\n}\n\n/**\n * Compact, accessible icon for the Fusion sidebar entry.\n * Renders a dual-node convergence (Lead + Sidekick models fusing into one) SVG glyph.\n */\nexport function FusionPanelIcon({ size = 16, active = false, className }: FusionPanelIconProps): ReactNode {\n return (\n <svg\n role=\"img\"\n aria-label=\"Fusion\"\n aria-hidden=\"true\"\n focusable=\"false\"\n viewBox=\"0 0 16 16\"\n width={size}\n height={size}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={active ? 1.5 : 1.2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"4\" cy=\"4.5\" r=\"2\" />\n <circle cx=\"4\" cy=\"11.5\" r=\"2\" />\n <circle cx=\"12\" cy=\"8\" r=\"2\" />\n <path d=\"M6 4.5h1.5a3 3 0 0 1 2.7 1.7L10.5 6.8\" />\n <path d=\"M6 11.5h1.5a3 3 0 0 0 2.7-1.7l.3-.6\" />\n </svg>\n )\n}\n","import { useState } from 'react'\nimport { tr, useLang } from './i18n.js'\nimport type { FusionStatus } from '../status.js'\nimport type { PhysicalRoute } from '../contracts.js'\nimport type { SettingsCatalog } from '../host/settings.js'\nimport { ModelChoice } from './FusionSettings.js'\nimport { FUSION_API_PATH, isFusionProvider } from '../identity.js'\n\nexport function FusionRecovery({ sessionId, task }: { sessionId: string; task: NonNullable<FusionStatus['task']> }) {\n const lang = useLang()\n const control = task.modelControl!\n const [role, setRole] = useState<'lead' | 'worker'>('lead')\n const [route, setRoute] = useState<PhysicalRoute>()\n const [catalog, setCatalog] = useState<SettingsCatalog>()\n const [dueAt, setDueAt] = useState('')\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState('')\n const [error, setError] = useState('')\n const action = async (name: string) => {\n setBusy(true); setError(''); setNotice('')\n try {\n const response = await fetch(FUSION_API_PATH, { method: 'POST', credentials: 'same-origin',\n headers: { 'content-type': 'application/json' }, body: JSON.stringify({ action: name, sessionId, taskId: task.id,\n revision: control.revision, role, route, ...(dueAt ? { dueAt: new Date(dueAt).toISOString() } : {}) }) })\n const result = await response.json() as { error?: string }\n if (!response.ok) throw new Error(result.error ?? tr(lang, '操作未完成,请刷新状态', 'Not completed; refresh the status'))\n setNotice(name === 'schedule' ? tr(lang, '已设置一次定时继续。Host 需要运行;新消息会取消安排。', 'One scheduled continuation is set. The Host must be running; a new message cancels it.') : name === 'cancel-schedule' ? tr(lang, '已取消定时继续。', 'Scheduled continuation cancelled.') : tr(lang, '已提交继续操作,状态将自动更新。', 'Continuation submitted; the status updates automatically.'))\n } catch (error) { setError(error instanceof Error ? error.message : String(error)) }\n finally { setBusy(false) }\n }\n const loadCatalog = async () => {\n setError('')\n try {\n const response = await fetch(`${FUSION_API_PATH}?view=catalog`, { credentials: 'same-origin', cache: 'no-store' })\n if (!response.ok) throw new Error(tr(lang, '无法读取模型列表', 'Cannot read the model list'))\n const value = await response.json() as SettingsCatalog\n setCatalog({ ...value, groups: value.groups.filter(group => !isFusionProvider(group.id)) })\n } catch (error) { setError(String(error)) }\n }\n return <section className=\"fusion-recovery\" aria-label={tr(lang, 'Fusion 恢复操作', 'Fusion recovery')}>\n <h3>{tr(lang, '继续当前任务', 'Continue this task')}</h3>\n {Object.entries(control.waits).filter(([, wait]) => wait?.taskId === task.id).map(([key, wait]) => <p key={key}>\n {key === 'lead' ? 'Lead' : 'Sidekick'} · {wait!.code} · {wait!.code === 'NO_PROGRESS' ? tr(lang, '重复操作没有进展,请调整做法', 'Repeated steps made no progress; change the approach') : wait!.code === 'WORKFLOW_INCOMPLETE' ? tr(lang, '报告、委派或审查尚未完成,请检查任务后继续', 'A report, handoff or review is unfinished; check the task, then continue') : wait!.code.includes('QUOTA') ? tr(lang, '额度重置时间未知', 'Quota reset time unknown') : tr(lang, '需要处理模型错误', 'A model error needs attention')}\n {wait!.retryNotBefore && <small>{tr(lang, '服务商建议重试时间', 'Provider retry hint')}: {new Date(wait!.retryNotBefore).toLocaleString()} {tr(lang, '(不代表额度重置)', '(not a quota reset)')}</small>}\n </p>)}\n {control.schedule && <p role=\"status\">{tr(lang, '定时继续', 'Scheduled continuation')}: {new Date(control.schedule.dueAt).toLocaleString()} · {\n ({ scheduled: tr(lang, '已安排', 'scheduled'), cancelled: tr(lang, '已取消', 'cancelled'), fired: tr(lang, '已执行一次', 'ran once'), failed: tr(lang, '未能执行', 'failed') })[control.schedule.state]}{control.schedule.reason ? ` · ${control.schedule.reason}` : ''}</p>}\n {control.operation && ['prepared', 'dispatching'].includes(control.operation.state) && <p role=\"alert\">{tr(lang, '上次继续操作的投递结果尚未确认。请检查会话;系统不会自动重发。', 'Delivery of the last continuation is unconfirmed. Check the conversation; nothing is resent automatically.')}</p>}\n {(task.recovering || task.outcomeUnknown) && <p role=\"alert\">{tr(lang, '中断的操作尚未核对。继续和更换模型都不会生效,本次也不会切换模型。请先用 /fusion recover <检查记录> 提交核对,再继续或更换 Sidekick。Fusion 面板里保存的新组合不会改写这个会话。', 'Interrupted operations are not inspected yet. Continue and model switching do nothing, and this attempt does not change the model. Record the inspection with /fusion recover <note>, then continue or switch the Sidekick. A new pair saved in the Fusion panel does not rewrite this conversation.')}</p>}\n {error && <p role=\"alert\">{error}</p>}{notice && <p role=\"status\">{notice}</p>}\n <fieldset disabled={busy || task.unsettledTools > 0 || task.pendingApprovals > 0 || task.recovering || task.outcomeUnknown}>\n <button onClick={() => { void action('continue') }}>{tr(lang, '继续一次', 'Continue once')}</button>\n <details><summary onClick={() => { if (!catalog) void loadCatalog() }}>{tr(lang, '更换角色模型并继续', 'Switch a role model and continue')}</summary>\n <label>{tr(lang, '角色', 'Role')} <select value={role} onChange={event => { setRole(event.target.value as 'lead' | 'worker'); setRoute(undefined) }}>\n <option value=\"lead\">Lead</option><option value=\"worker\">Sidekick</option>\n </select></label>\n {catalog && <ModelChoice role={role === 'lead' ? 'Lead' : 'Sidekick'} route={route} catalog={catalog} onChange={setRoute} />}\n <p>{tr(lang, '仅更换当前会话的角色模型,保留任务与 Sidekick 会话。后续请求使用新模型的账号。', 'Changes this conversation\\'s role model only; the task and the Sidekick session are kept. Later requests use the new model\\'s account.')}</p>\n <button disabled={!route} onClick={() => { void action('switch-role') }}>{tr(lang, '更换并继续一次', 'Switch and continue once')}</button>\n </details>\n <details><summary>{tr(lang, '定时继续一次', 'Continue once at a time')}</summary>\n <label>{tr(lang, '本地时间', 'Local time')} <input aria-label={tr(lang, '定时继续时间', 'Continuation time')} type=\"datetime-local\" value={dueAt} onChange={event => setDueAt(event.target.value)} /></label>\n <p>{tr(lang, '按你选择的时间尝试一次;再次遇到额度错误会停止。此时间不代表服务商承诺的恢复时间。', 'Tries once at the time you choose and stops on another quota error. It is not a provider-promised reset time.')}</p>\n <button disabled={!dueAt} onClick={() => { void action('schedule') }}>{tr(lang, '设置时间', 'Set time')}</button>\n {control.schedule?.state === 'scheduled' && <button onClick={() => { void action('cancel-schedule') }}>{tr(lang, '取消安排', 'Cancel')}</button>}\n </details>\n </fieldset>\n </section>\n}\n","import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react'\nimport type { FusionStatus } from '../status.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\ninterface Snapshot { sessionId: string; status?: FusionStatus; failed: boolean }\ninterface Entry {\n snapshot?: Snapshot\n listeners: Map<() => void, () => boolean>\n busy: boolean\n timer?: ReturnType<typeof setTimeout>\n abort?: AbortController\n visibility: () => void\n}\nconst entries = new Map<string, Entry>()\nconst visible = () => document.visibilityState !== 'hidden'\nconst running = new Set(['分析', '执行', '修改', '审查', '验证', '正在停止'])\n\nfunction subscribe(sessionId: string, listener: () => void, expanded: () => boolean): () => void {\n let entry = entries.get(sessionId)\n if (!entry) {\n entry = { listeners: new Map(), busy: false, visibility: () => {} }\n entries.set(sessionId, entry)\n const own = entry\n const active = () => entries.get(sessionId) === own && own.listeners.size > 0\n const publish = (snapshot: Snapshot) => {\n if (!active()) return\n own.snapshot = snapshot\n for (const notify of own.listeners.keys()) notify()\n }\n const refresh = async () => {\n if (!active() || own.busy || !visible()) return\n clearTimeout(own.timer)\n own.busy = true\n const abort = new AbortController(); own.abort = abort\n const deadline = setTimeout(() => {\n if (active() && visible()) publish({ sessionId, failed: true })\n abort.abort()\n }, 10000)\n try {\n const response = await fetch(`${FUSION_API_PATH}?view=status&sessionId=${encodeURIComponent(sessionId)}`,\n { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n if (!response.ok) throw new Error('unavailable')\n const status = await response.json() as FusionStatus\n if (status.schemaVersion !== 1 || status.sessionId !== sessionId) throw new Error('mismatched status')\n if (!abort.signal.aborted) publish({ sessionId, status, failed: false })\n } catch {\n if (!abort.signal.aborted) publish({ sessionId, failed: true })\n } finally {\n clearTimeout(deadline); own.busy = false\n if (active() && visible()) {\n const fast = [...own.listeners.values()].some(value => value()) && running.has(own.snapshot?.status?.task?.stage ?? '')\n own.timer = setTimeout(() => { void refresh() }, fast ? 2000 : 15000)\n }\n }\n }\n own.visibility = () => {\n clearTimeout(own.timer)\n if (!visible()) own.abort?.abort()\n else void refresh()\n }\n document.addEventListener('visibilitychange', own.visibility)\n }\n entry.listeners.set(listener, expanded)\n if (entry.listeners.size === 1 || expanded()) entry.visibility()\n const own = entry\n return () => {\n own.listeners.delete(listener)\n if (own.listeners.size) return\n entries.delete(sessionId)\n clearTimeout(own.timer); own.abort?.abort()\n document.removeEventListener('visibilitychange', own.visibility)\n }\n}\n\n/**\n * One in-flight read per mounted session; collapsed hints still discover new attention states.\n * `live` asks for the fast cadence whenever the task is running, for a view whose whole\n * purpose is the current stage (the role and permission of the model working now).\n */\nexport function useFusionStatus(sessionId: string, expandedTask: string | undefined, attentionOnly = false, live = false): Snapshot | undefined {\n const expandedRef = useRef(expandedTask), attentionRef = useRef(attentionOnly), liveRef = useRef(live)\n expandedRef.current = expandedTask; attentionRef.current = attentionOnly; liveRef.current = live\n useEffect(() => { if (expandedTask) entries.get(sessionId)?.visibility() }, [sessionId, expandedTask])\n return useSyncExternalStore(\n useCallback(listener => subscribe(sessionId, listener, () => {\n if (liveRef.current) return true\n const task = entries.get(sessionId)?.snapshot?.status?.task\n return expandedRef.current !== undefined && task?.id === expandedRef.current && (!attentionRef.current || task.attention)\n }), [sessionId]),\n useCallback(() => entries.get(sessionId)?.snapshot, [sessionId]),\n () => undefined,\n )\n}\n","import { FusionRecovery } from './FusionRecovery.js'\nimport { Fragment, useState } from 'react'\nimport { useFusionStatus } from './status-polling.js'\nimport type { TaskCost, UsageSubtotal } from '../status.js'\nimport { tr, useLang, type Lang } from './i18n.js'\n\nconst styles = `\n.fusion-status{margin:8px 12px;color:var(--dsw-alias-label-primary);font-size:13px;line-height:1.5;overflow-wrap:anywhere}\n.fusion-status>summary{cursor:pointer;min-height:44px;display:flex;align-items:center;gap:12px;list-style:none;border-top:1px solid var(--dsw-alias-border-l2);outline-offset:2px}\n.fusion-status>summary::before{content:'›';font-size:18px;flex:none}.fusion-status[open]>summary::before{content:'⌄'}\n.fusion-status>summary:focus-visible{outline:2px solid var(--dsw-alias-brand-primary)}\n.fusion-status .fusion-status-label{font-weight:600}.fusion-status .fusion-status-count{margin-left:auto;color:var(--dsw-alias-label-secondary);white-space:nowrap}\n.fusion-status .fusion-status-detail{max-height:320px;overflow:auto;padding:4px 4px 12px 0;scrollbar-gutter:stable}\n.fusion-status .fusion-recovery fieldset{border:0;padding:0;display:flex;flex-direction:column;gap:10px}.fusion-recovery :is(button,select,input){font:inherit;color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;padding:7px;max-width:100%}.fusion-recovery :is(select,input,option,optgroup){background-color:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);color-scheme:inherit}.fusion-recovery button{cursor:pointer;background-color:var(--dsw-alias-button-elevated-fill)}.fusion-recovery :is(button,input,select):focus-visible{outline:2px solid var(--dsw-alias-brand-primary)}.fusion-recovery [role=alert]{color:var(--dsw-alias-state-error-primary)}\n.fusion-status:has(.fusion-recovery) .fusion-status-detail{max-height:min(65vh,640px)}.fusion-recovery details>summary{padding:8px 0;cursor:pointer}\n.fusion-status p{margin:4px 0 12px}.fusion-status h3{font-size:13px;margin:16px 0 4px;font-weight:600}\n.fusion-status dl{margin:0;display:grid;grid-template-columns:minmax(72px,auto) minmax(0,1fr);gap:4px 12px}\n.fusion-status dt{color:var(--dsw-alias-label-secondary)}.fusion-status dd{margin:0;min-width:0}\n.fusion-status ul{list-style:none;margin:0;padding:0}.fusion-status li{padding:6px 0;border-bottom:1px solid var(--dsw-alias-border-l2)}\n.fusion-status small{display:block;color:var(--dsw-alias-label-secondary);font-size:12px}\n@media(max-width:400px){.fusion-status>summary{gap:8px}.fusion-status .fusion-status-detail{max-height:280px}}\n`\n\nconst role = (value: string) => value === 'lead' ? 'Lead' : 'Sidekick'\nconst purposeOf = (lang: Lang, value: string) => ({ conversation: tr(lang, '任务', 'task'), compaction: tr(lang, '压缩', 'compaction'),\n 'cache-keepalive': tr(lang, '保活', 'keepalive'), 'session-title': tr(lang, '标题', 'title') } as Record<string, string>)[value] ?? value\nconst outcomeOf = (lang: Lang, value: string) => ({ entered: tr(lang, '请求中', 'in progress'), stop: tr(lang, '已返回', 'returned'), 'tool-calls': tr(lang, '调用工具', 'tool calls'),\n 'max-tokens': tr(lang, '输出截断', 'output truncated'), aborted: tr(lang, '已中断', 'aborted'), error: tr(lang, '请求失败', 'failed'), unknown: tr(lang, '结束状态未知', 'unknown end') } as Record<string, string>)[value] ?? value\nconst toolStateOf = (lang: Lang, value: string) => ({ 'dispatch-started': tr(lang, '执行未收尾', 'unfinished'), returned: tr(lang, '已返回', 'returned'),\n 'outcome-unknown': tr(lang, '结果未知', 'outcome unknown'), inspected: tr(lang, '已人工检查', 'inspected') } as Record<string, string>)[value] ?? value\nconst countOf = (lang: Lang, value: UsageSubtotal) => value.totalRequests === 0 ? '—' : value.reportedRequests === 0 ? tr(lang, '未提供', 'not reported')\n : `${value.knownTokens.toLocaleString()}${value.reportedRequests < value.totalRequests ? tr(lang, `(${value.reportedRequests}/${value.totalRequests} 次有报告)`, ` (${value.reportedRequests}/${value.totalRequests} reported)`) : ''}`\nconst noteStyle = { margin: '8px 12px', color: 'var(--dsw-alias-label-secondary)', fontSize: 12, lineHeight: 1.5 }\n\n/** Visible-session polling reads the plugin ledger; it never sends a chat message. */\nexport function FusionStatus({ sessionId, attentionOnly = false }: { sessionId: string; attentionOnly?: boolean }) {\n const lang = useLang()\n const purpose = (value: string) => purposeOf(lang, value), outcome = (value: string) => outcomeOf(lang, value)\n const toolState = (value: string) => toolStateOf(lang, value), count = (value: UsageSubtotal) => countOf(lang, value)\n const [expandedTask, setExpandedTask] = useState<string>()\n const snapshot = useFusionStatus(sessionId, expandedTask, attentionOnly)\n if (!snapshot || snapshot.sessionId !== sessionId) return attentionOnly ? null : <p style={noteStyle} role=\"status\">{tr(lang, '正在读取 Fusion 状态…', 'Loading Fusion status…')}</p>\n if (snapshot.failed) return attentionOnly ? null : <p style={noteStyle} role=\"status\">{tr(lang, 'Fusion 状态暂时无法更新,恢复连接后会重试。可用 /fusion status 查看。', 'Fusion status cannot update right now; it retries when reconnected. Use /fusion status.')}</p>\n const task = snapshot.status?.task\n if (!snapshot.status?.selected || !task) return null\n if (attentionOnly && !task.attention) return null\n const { usage } = task\n const verification = task.automatedChecks === 0 && task.verification === 'verified' ? tr(lang, '仅经 Lead 审查(未运行自动检查)', 'Lead review only (no automated checks ran)')\n : ({ verified: tr(lang, '验证通过', 'verified'), partial: tr(lang, '部分验证', 'partly verified'), unverified: tr(lang, '尚未验证', 'unverified') })[task.verification]\n const stage = lang === 'en' ? task.stageEn ?? task.stage : task.stage, detail = lang === 'en' && task.detailEn !== undefined ? task.detailEn : task.detail\n const share = (role: 'lead' | 'worker') => {\n const total = usage.byRole.lead.output.knownTokens + usage.byRole.worker.output.knownTokens\n return total ? tr(lang, ` · 输出占 ${Math.round(usage.byRole[role].output.knownTokens / total * 100)}%`, ` · ${Math.round(usage.byRole[role].output.knownTokens / total * 100)}% of output`) : ''\n }\n return <details className=\"fusion-status\" key={task.id} onToggle={event => setExpandedTask(event.currentTarget.open ? task.id : undefined)}>\n <style>{styles}</style>\n <summary aria-label={tr(lang, `Fusion · ${stage},任务详情`, `Fusion · ${stage}, task details`)} data-ud-check=\"fusion-status-summary\">\n <span className=\"fusion-status-label\" role=\"status\">Fusion · {stage}</span>\n <span className=\"fusion-status-count\">{tr(lang, `${usage.calls} 次请求`, `${usage.calls} requests`)}</span><span>{tr(lang, '详情', 'Details')}</span>\n </summary>\n <div className=\"fusion-status-detail\" tabIndex={0} aria-label={tr(lang, 'Fusion 任务详情', 'Fusion task details')} data-ud-check=\"fusion-status-detail\">\n <p>{detail ?? (task.stage === '完成' ? tr(lang, `本轮任务已结束 · ${verification}`, `This task has finished · ${verification}`) : tr(lang, `本轮任务 · ${verification}`, `This task · ${verification}`))}</p>\n {task.modelControl && task.stage !== '完成' && <FusionRecovery sessionId={sessionId} task={task} />}\n <dl>\n <dt>Lead</dt><dd>{task.models.lead.model}<small>{task.models.lead.provider}</small></dd>\n <dt>Sidekick</dt><dd>{task.models.worker.model}<small>{task.models.worker.provider}{task.workerId ? tr(lang, ' · 已建立持续会话', ' · persistent session') : tr(lang, ' · 尚未委派', ' · not delegated yet')}</small></dd>\n {task.models.compactor && <><dt>{tr(lang, '压缩模型', 'Compaction')}</dt><dd>{task.models.compactor.model}<small>{task.models.compactor.provider}</small></dd></>}\n <dt>{tr(lang, '待确认', 'Pending approvals')}</dt><dd>{task.pendingApprovals}</dd>\n <dt>{tr(lang, '未收尾工具', 'Unsettled tools')}</dt><dd>{task.unsettledTools}</dd>\n </dl>\n <h3>{tr(lang, '本轮用量', 'Usage this task')}</h3>\n <dl>\n <dt>{tr(lang, '模型请求', 'Model requests')}</dt><dd>{usage.calls}<small>{tr(lang, `含压缩 ${usage.compactionCalls} 次、保活 ${usage.keepaliveCalls} 次`, `incl. ${usage.compactionCalls} compaction, ${usage.keepaliveCalls} keepalive`)}</small></dd>\n <dt>{tr(lang, '用量报告', 'Usage reports')}</dt><dd>{tr(lang, `${usage.finalCalls} 次已定稿 · ${usage.provisionalCalls} 次暂报 · ${usage.unreportedCalls} 次未提供`, `${usage.finalCalls} final · ${usage.provisionalCalls} provisional · ${usage.unreportedCalls} unreported`)}</dd>\n <dt>{tr(lang, '输入 Token', 'Input tokens')}</dt><dd>{count(usage.input)}<small>{tr(lang, '已报告的未缓存输入', 'reported uncached input')}</small></dd>\n <dt>{tr(lang, '缓存读取', 'Cache read')}</dt><dd>{count(usage.cacheRead)}</dd>\n <dt>{tr(lang, '输出 Token', 'Output tokens')}</dt><dd>{count(usage.output)}</dd>\n </dl>\n {task.cost && <CostBlock lang={lang} cost={task.cost} />}\n <h3>{tr(lang, '按角色', 'By role')}</h3>\n <dl>\n {(['lead', 'worker'] as const).map(role => <Fragment key={role}>\n <dt>{role === 'lead' ? 'Lead' : 'Sidekick'}</dt>\n <dd>{tr(lang, `${usage.byRole[role].calls} 次`, `${usage.byRole[role].calls} requests`)} · {tr(lang, '输出', 'output')} {count(usage.byRole[role].output)}\n <small>{tr(lang, '输入', 'input')} {count(usage.byRole[role].input)} · {tr(lang, '缓存读取', 'cache read')} {count(usage.byRole[role].cacheRead)}{share(role)}</small></dd>\n </Fragment>)}\n </dl>\n <small>{tr(lang, 'Token 数包含暂报数据;缺失字段不计为 0。请求数来自 DSH,供应商内部重试次数未知。', 'Token counts include provisional data; missing fields are not counted as 0. Request counts come from DSH; provider-internal retries are unknown.')}</small>\n <h3>{tr(lang, '最近上下文检查', 'Recent context checks')}</h3>\n {task.contexts.length ? <ul>{task.contexts.map(context => <li key={context.role}>{role(context.role)} · {purpose(context.purpose)} · {context.admitted ? tr(lang, '可发送', 'admitted') : tr(lang, '超出预算', 'over budget')}\n <small>{context.inputTokens.toLocaleString()} / {context.budget.toLocaleString()} Token · {context.quality === 'exact' ? tr(lang, '精确计数', 'exact') : tr(lang, '估算', 'estimated')}</small>\n </li>)}</ul> : <small>{tr(lang, '尚无上下文检查记录。', 'No context checks yet.')}</small>}\n <h3>{tr(lang, '最近模型请求', 'Recent model requests')}</h3>\n {task.requests.length ? <ul>{task.requests.map(request => <li key={request.id}>{role(request.role)} · {purpose(request.purpose)} · {outcome(request.outcome)}\n <small>{request.model} · {request.provider} · {request.authority === 'final' ? tr(lang, '用量已定稿', 'usage final') : request.authority === 'provisional' ? tr(lang, '用量暂报', 'usage provisional') : tr(lang, '用量未提供', 'usage not reported')}</small>\n </li>)}</ul> : <small>{tr(lang, '尚未发出模型请求。', 'No model requests yet.')}</small>}\n <h3>{tr(lang, '最近命令与写入', 'Recent commands and writes')}</h3>\n {task.tools.length ? <ul>{task.tools.map(tool => <li key={tool.id}>{role(tool.role)} · {tool.name} · {tool.failed ? tr(lang, '返回错误', 'error') : toolState(tool.state)}</li>)}</ul>\n : <small>{tr(lang, '尚无工具执行记录。', 'No tool runs yet.')}</small>}\n <small>{tr(lang, '显示最近 12 次请求、8 项命令或写入操作;用量汇总覆盖本轮全部请求。读取操作仍可在会话中查看。', 'Shows the last 12 requests and 8 commands or writes; usage totals cover all requests of this task. Reads remain visible in the conversation.')}</small>\n </div>\n </details>\n}\n\n/** Money for the current task, with its coverage and what it is not. */\nexport function CostBlock({ lang, cost }: { lang: Lang; cost: TaskCost }) {\n const usd = (value: string | null) => value === null ? null : `$${Number(value).toFixed(2)}`\n const saved = cost.savedUsd === null ? null : Number(cost.savedUsd)\n const omitted = cost.unpriced + cost.incomplete + cost.unknown\n const reasons = [\n cost.unpriced ? tr(lang, `${cost.unpriced} 次没有价目`, `${cost.unpriced} with no price`) : '',\n cost.incomplete ? tr(lang, `${cost.incomplete} 次用量不全`, `${cost.incomplete} with incomplete usage`) : '',\n cost.unknown ? tr(lang, `${cost.unknown} 次无法读取`, `${cost.unknown} unreadable`) : '',\n ].filter(Boolean).join(tr(lang, '、', ', '))\n return <>\n <h3>{tr(lang, '费用估算', 'Cost estimate')}</h3>\n <dl>\n <dt>{tr(lang, '按价目表', 'At list prices')}</dt>\n <dd>{usd(cost.apiEquivalentUsd) ?? tr(lang, '无法估算', 'cannot estimate')}\n <small>{tr(lang, `覆盖 ${cost.priced} 次请求;按各模型公开单价换算,不是账单`,\n `${cost.priced} requests priced; converted at published rates, not a bill`)}</small></dd>\n {cost.savedUsd !== null && cost.savedPercent !== null && <Fragment>\n <dt>{tr(lang, '省下', 'Saved')}</dt>\n <dd>{usd(cost.savedUsd)}<small>{tr(lang, `比同样的 token 全交给 Lead 便宜 ${cost.savedPercent}%(覆盖 ${cost.basis} 次请求)`,\n `${cost.savedPercent}% cheaper than sending the same tokens to the Lead (${cost.basis} requests)`)}</small></dd>\n </Fragment>}\n {saved !== null && saved < 0 && <dd role=\"status\">{tr(lang, '这个 Sidekick 比 Lead 更贵,省钱不成立。', 'This Sidekick costs more than the Lead, so there is no saving.')}</dd>}\n <dt>{tr(lang, '实际账单', 'Actual bill')}</dt>\n <dd>{tr(lang, '未知', 'unknown')}<small>{tr(lang, 'DSH 不提供每次请求的计费金额;订阅线路也不按 token 计费',\n 'DSH reports no per-request billed amount, and subscription routes are not billed per token')}</small></dd>\n </dl>\n {omitted > 0 && <small role=\"status\">\n {tr(lang, `有 ${omitted} 次请求未计入:${reasons}。`, `${omitted} requests are not included: ${reasons}.`)}\n {cost.unpricedModels.length ? tr(lang, `可在面板补充这些模型的单价:${cost.unpricedModels.join('、')}。`,\n ` Add rates for these models in the panel: ${cost.unpricedModels.join(', ')}.`) : ''}\n </small>}\n </>\n}\n","import { tr, useLang } from './i18n.js'\nimport { useEffect, useState, useSyncExternalStore } from 'react'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store'\nimport { onSettingsChanged } from './settings-events.js'\nimport { FusionStatus } from './FusionStatus.js'\nimport { FUSION_API_PATH, isFusionSelection } from '../identity.js'\n\nexport interface FusionHintProps { sessionId: string; directory: ObservableSnapshot<ModelDirectoryState>; load(): void }\n\n/** Additive composer hint. The original selector and its selection state stay native. */\nexport function FusionHint({ sessionId, directory, load }: FusionHintProps) {\n const selected = useSyncExternalStore(directory.subscribe, directory.getSnapshot).current\n // A session that selected Fusion before the rename stored the old route.\n const fusion = isFusionSelection(selected ?? undefined)\n const lang = useLang()\n const [message, setMessage] = useState<string>()\n useEffect(() => { load() }, [load])\n useEffect(() => {\n if (!fusion) { setMessage(undefined); return }\n let active = true\n const abort = new AbortController()\n const refresh = () => {\n void fetch(`${FUSION_API_PATH}?view=settings`, { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n .then(async response => { if (!response.ok) throw new Error('unavailable'); return response.json() as Promise<{ pairs: { id: string; authorized: boolean; reason?: string }[] }> })\n .then(state => {\n if (!active) return\n // The hint speaks for this conversation's combo, not for the first one.\n const combo = state.pairs.find(pair => pair.id === selected?.model)\n if (!state.pairs.length) setMessage(tr(lang, 'Fusion 尚未配置模型,请打开左侧边栏的 Fusion 面板选择 Lead 和 Sidekick。', 'Fusion has no models yet: open the Fusion panel in the left sidebar and choose a Lead and a Sidekick.'))\n else if (!combo) setMessage(tr(lang, '当前组合已被删除,请在模型菜单中选择其他组合。', 'This combo was removed; pick another one in the model menu.'))\n else if (!combo.authorized) setMessage(tr(lang, 'Fusion 当前配置未就绪,请在左侧边栏的 Fusion 面板查看。', 'The Fusion setup is not ready: see the Fusion panel in the left sidebar.'))\n else setMessage(undefined)\n })\n .catch(() => { if (active) setMessage(tr(lang, '暂时无法确认 Fusion 配置,请在左侧边栏的 Fusion 面板查看。', 'Cannot confirm the Fusion setup right now: see the Fusion panel in the left sidebar.')) })\n }\n refresh()\n const off = onSettingsChanged(refresh)\n return () => { active = false; abort.abort(); off() }\n }, [fusion, lang, selected?.model])\n if (!fusion) return null\n return <>\n {message && <p role=\"status\" style={{ margin: '8px 12px', color: 'var(--dsw-alias-label-secondary)', fontSize: 12, lineHeight: '18px' }}>{message}</p>}\n <FusionStatus sessionId={sessionId} attentionOnly />\n </>\n}\n","import { useEffect, useSyncExternalStore } from 'react'\nimport type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store'\nimport type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport { PermissionIconFullAccessRegular, PermissionIconReadOnlyRegular,\n PermissionIconWorkspaceWriteRegular } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SandboxMode } from '../contracts.js'\nimport { isFusionSelection } from '../identity.js'\nimport { tr, useLang, type Lang } from './i18n.js'\nimport { useFusionStatus } from './status-polling.js'\n\nconst styles = `\n.fusion-permission{display:inline-flex;align-items:center;gap:4px;height:28px;min-width:0;max-width:220px;padding:0 6px;border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px;font-weight:500}\n.fusion-permission svg{width:14px;height:14px;flex:none}\n.fusion-permission .fusion-permission-role{flex:none;color:var(--dsw-alias-label-caption)}\n.fusion-permission .fusion-permission-mode{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n`\n\nconst modeOf = (lang: Lang, mode: SandboxMode) => mode === 'read-only' ? tr(lang, '仅可查看', 'Read Only')\n : mode === 'workspace-write' ? tr(lang, '工作区内修改', 'Workspace Write') : tr(lang, '完全权限', 'Full access')\nconst iconOf = (mode: SandboxMode) => mode === 'read-only' ? <PermissionIconReadOnlyRegular />\n : mode === 'workspace-write' ? <PermissionIconWorkspaceWriteRegular /> : <PermissionIconFullAccessRegular />\n\nexport interface FusionPermissionProps { sessionId: string; directory: ObservableSnapshot<ModelDirectoryState>; load(): void }\n\n/**\n * The permission of the model working now. The composer's native permission control\n * belongs to the conversation (Lead) session, which Fusion confines to read-only, and\n * that confinement matches no configured preset — so the control reads Custom while a\n * task runs. This additive chip names the role and its mode, so the tool row never\n * shows an unexplained Custom alone.\n */\nexport function FusionPermission({ sessionId, directory, load }: FusionPermissionProps) {\n const selected = useSyncExternalStore(directory.subscribe, directory.getSnapshot).current\n const fusion = isFusionSelection(selected ?? undefined)\n const lang = useLang()\n // The acting role is the whole point of this chip, so it always wants fresh polls.\n const snapshot = useFusionStatus(sessionId, undefined, false, true)\n useEffect(() => { load() }, [load])\n const permissions = fusion ? snapshot?.status?.task?.permissions : undefined\n if (!permissions) return null\n const role = permissions.active === 'worker' ? 'Sidekick' : 'Lead'\n const mode = permissions.active === 'worker' ? permissions.worker : permissions.lead\n const hint = tr(lang,\n `Fusion 按角色分离权限:Lead ${modeOf(lang, permissions.lead)},Sidekick ${modeOf(lang, permissions.worker)}。输入框的权限控件属于对话会话(Lead),运行期间可能显示 Custom。`,\n `Fusion separates permissions by role: Lead ${modeOf(lang, permissions.lead)}, Sidekick ${modeOf(lang, permissions.worker)}. The permission control belongs to the conversation (Lead) session, so it may read Custom while a task runs.`)\n return <span className=\"fusion-permission\" title={hint} aria-label={`${role} · ${modeOf(lang, mode)}`} data-ud-check=\"fusion-permission\">\n <style>{styles}</style>\n {iconOf(mode)}\n <span className=\"fusion-permission-role\">{role}</span>\n <span className=\"fusion-permission-mode\">{modeOf(lang, mode)}</span>\n </span>\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-tools'\n\n/**\n * Provider routes that run their OWN agent loop instead of answering one model\n * call. Their adapter can only hand a tool call back to this Host under its own\n * transport name, so a caller-driven tool ceiling that lists only the caller's\n * own tools advertises names the route can never emit.\n *\n * `antigravity` is dsh-agy-link: `agy` executes the bridged call inside its own\n * loop, and the adapter reports that step as `agy_tool`, which this Host replays\n * as a native card. Fusion's Worker is exactly such a caller — its ceiling was\n * `workerTools` + `fusion_*`, so the delegation ran as prose and the Host\n * (correctly) diagnosed `WORKER_TOOLS_UNREACHABLE`.\n */\nconst ROUTE_TRANSPORT: Readonly<Record<string, string>> = { antigravity: 'agy_tool' }\n\n/** Every transport a bridge route may report a step through. */\nconst ROUTE_TRANSPORT_NAMES: ReadonlySet<string> = new Set(Object.values(ROUTE_TRANSPORT))\n\n/** The transport name this provider route needs, registered or not. */\nexport function routeTransportName(provider: string): string | undefined {\n return ROUTE_TRANSPORT[provider]\n}\n\n/**\n * Whether `name` is a bridge-route transport. Such a tool only replays a step\n * the route already executed in its own loop: it is presentation, not an effect\n * this Host authorizes, bills or holds a write lease for.\n */\nexport function isRouteTransportName(name: string): boolean {\n return ROUTE_TRANSPORT_NAMES.has(name)\n}\n\n/**\n * The transport this route needs AND this Host can actually accept. An\n * unregistered name is skipped, because a call naming it is rejected as\n * `unknown tool` — the adapter must never invent one either.\n *\n * The lookup is the GLOBAL view on purpose. A bridge registers its transport at\n * the host layer, while an agent scope's own restriction hides inherited tools:\n * reading through the Worker's restricted scope would report \"absent\" on the\n * very next refresh and shrink the ceiling that had just been widened.\n */\nexport function registeredRouteTransport(ctx: Context, provider: string): string | undefined {\n const name = routeTransportName(provider)\n if (name === undefined) return undefined\n return ctx.tools.get(name) === undefined ? undefined : name\n}\n\n/** Add the route's transport to a capability ceiling without duplicating a configured entry. */\nexport function withRouteTransport(ceiling: readonly string[], transport: string | undefined): readonly string[] {\n return transport === undefined || ceiling.includes(transport) ? ceiling : [...ceiling, transport]\n}\n","import type { SessionEvent } from '@deepseek-ai/dsh-session/types'\nimport type {} from '@deepseek-ai/dsh-tools/types'\nimport { isRouteTransportName } from './host/route-transport.js'\n\n/** Plugin-owned presentation record; never appended to a native Session. */\nexport interface FusionActivity {\n schemaVersion: 1\n taskId: string\n childSessionId: string\n parentCallId: string\n turn: number\n step: number\n anchorSeq: number\n source: SessionEvent<'tool/call'> | SessionEvent<'tool/result'>\n}\n\n/** Namespaced display identity; the unchanged native identity remains in source. */\nexport function activityCallId(activity: FusionActivity): string {\n const event = activity.source\n const id = event.type === 'tool/call' ? event.data.callId : event.data.message.source.callId\n return `fusion:${activity.childSessionId}:${id}`\n}\n\nexport interface FusionActivityPage { events: FusionActivity[]; cursor: number; more: boolean; done: boolean }\n\n/** Tools whose call/result pair a Worker's own loop appends to its session. */\nconst NATIVE_VISIBLE_TOOLS: ReadonlySet<string> = new Set([\n 'bash', 'pwsh', 'read', 'write', 'edit', 'glob', 'grep', 'job_output', 'job_kill', 'str_replace_editor',\n])\n\n/** The Code Mode wrapper dsh-agy-worker uses when the route has no transport tool. */\nconst MIRROR_CODE_WRAPPER = 'run_code'\n\n/** A recorded agy step replayed through a bridge route's transport. */\nexport interface MirrorStep { run: string; step: number; tool: string }\n\n/**\n * The exact wrapper dsh-agy-worker generates for a recorded step\n * (`buildMirrorRunCode`): one comment naming the step and its real tool, then one\n * call of the transport. Parsed as data — the code is never evaluated, and any\n * other `run_code` body stays out of the presentation path.\n */\nconst MIRROR_COMMENT = /^\\/\\/ dsh-agy-worker mirror: replay recorded agy tool step (\\d+) \\(([^()]*)\\)$/\nconst MIRROR_CALL = /^return await tools\\['([^']+)'\\]\\((\\{.*\\})\\)$/\n\n/** Recover the recorded step cursor and real tool from a generated mirror wrapper. */\nexport function mirrorStepInvocation(code: string): MirrorStep | undefined {\n const lines = code.split('\\n').map(line => line.trim()).filter(line => line !== '')\n if (lines.length !== 2) return undefined\n const comment = MIRROR_COMMENT.exec(lines[0]!)\n const call = MIRROR_CALL.exec(lines[1]!)\n if (!comment || !call || !isRouteTransportName(call[1]!)) return undefined\n let args: unknown\n try { args = JSON.parse(call[2]!) } catch { return undefined }\n if (typeof args !== 'object' || args === null || Array.isArray(args)) return undefined\n const cursor = args as { run?: unknown; step?: unknown }\n if (typeof cursor.run !== 'string' || cursor.run === '') return undefined\n if (!Number.isSafeInteger(cursor.step) || (cursor.step as number) < 0) return undefined\n if (Number(comment[1]) !== cursor.step) return undefined\n const tool = comment[2]!.trim()\n return { run: cursor.run, step: cursor.step as number, tool: tool === '' ? 'agy tool' : tool }\n}\n\n/**\n * Whether one child tool event is real Worker activity this plugin presents in\n * the parent conversation. Answering this needs the recorded arguments only to\n * recognize the bounded Code Mode wrapper; nothing is executed or replayed.\n */\nexport function presentsActivity(name: string, rawArguments: string): boolean {\n if (NATIVE_VISIBLE_TOOLS.has(name)) return true\n if (isRouteTransportName(name)) return true\n if (name !== MIRROR_CODE_WRAPPER) return false\n let args: unknown\n try { args = JSON.parse(rawArguments) } catch { return false }\n if (typeof args !== 'object' || args === null || Array.isArray(args)) return false\n const code = (args as { code?: unknown }).code\n return typeof code === 'string' && mirrorStepInvocation(code) !== undefined\n}\n","import type { DiffHunk } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { FusionActivity } from '../activity.js'\nimport { activityCallId } from '../activity.js'\n\nexport interface ActivityRow {\n id: string\n call: Extract<FusionActivity['source'], { type: 'tool/call' }>\n result?: Extract<FusionActivity['source'], { type: 'tool/result' }>\n}\n\nexport function activityRows(events: readonly FusionActivity[]): ActivityRow[] {\n const rows = new Map<string, ActivityRow>()\n for (const event of events) {\n const id = activityCallId(event)\n if (event.source.type === 'tool/call') rows.set(id, { id, call: event.source })\n else {\n const row = rows.get(id)\n if (row) rows.set(id, { ...row, result: event.source })\n }\n }\n return [...rows.values()]\n}\n\n/** Only actual result-time metadata is labelled an applied diff. */\nexport function activityDiffs(row: ActivityRow): DiffHunk[] {\n if (!row.result || row.result.data.message.isError) return []\n const meta = row.result.data.meta as { diffs?: unknown } | undefined\n if (!Array.isArray(meta?.diffs)) return []\n return meta.diffs.filter((hunk): hunk is DiffHunk => hunk && typeof hunk === 'object'\n && typeof hunk.path === 'string' && (typeof hunk.oldText === 'string' || hunk.oldText === null) && typeof hunk.newText === 'string')\n}\n","import { isRouteTransportName } from '../host/route-transport.js'\nimport { mirrorStepInvocation } from '../activity.js'\n\n/**\n * One activity row as the parent conversation can honestly present it.\n *\n * A bridge route reports a step it already executed through its own transport;\n * the recorded payload only carries the inner tool name and its input, so the\n * row is unwrapped here. Nothing is replayed, executed or inferred: `tool` is the\n * recorded operation, `arguments` are the recorded arguments, and an unreadable\n * payload falls back to the raw call arguments shown by the renderer.\n */\nexport interface PresentedCall {\n /** The operation to name in the row: the unwrapped inner tool, or the recorded name. */\n tool: string\n /** Set when the row is a bridge transport replay rather than a direct Worker tool. */\n transport?: string\n /** Arguments describing the presented operation; `{}` when the payload is unreadable. */\n arguments: Record<string, unknown>\n /** MCP server the inner tool belonged to, when the route reported one. */\n server?: string\n /** True when the recorded arguments were not a JSON object and must stay raw. */\n malformed: boolean\n /** The recorded call arguments, unchanged. */\n raw: string\n}\n\nconst CODE_WRAPPER = 'run_code'\nconst META_MCP = /^(call_mcp_tool|callMcpTool|call_mcp|mcp_call)$/i\n\n/** The agy tools that run a shell command and therefore get a terminal card. */\nconst AGY_TERMINAL_TOOLS: ReadonlySet<string> = new Set([\n 'run_command', 'bash', 'execute_command', 'ops_bash', 'sh', 'shell',\n])\n\n/** The Host's own shell tools; their output ends with the exit marker this Host writes. */\nconst HOST_TERMINAL_TOOLS: ReadonlySet<string> = new Set(['bash', 'pwsh'])\n\nfunction pickString(input: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = input[key]\n if (typeof value === 'string' && value !== '') return value\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n }\n return undefined\n}\n\nfunction parseObject(raw: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(raw)\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) return parsed as Record<string, unknown>\n } catch { /* Raw call arguments remain inspectable in the renderer. */ }\n return undefined\n}\n\n/** agy serializes some tool args as a JSON string; presenters get an object. */\nfunction innerArguments(value: unknown): Record<string, unknown> {\n if (value === undefined || value === null) return {}\n if (typeof value === 'object' && !Array.isArray(value)) return value as Record<string, unknown>\n if (typeof value === 'string') {\n let text = value.trim()\n if ((text.startsWith('\"') && text.endsWith('\"')) || (text.startsWith(\"'\") && text.endsWith(\"'\"))) {\n try {\n const unquoted: unknown = JSON.parse(text)\n if (typeof unquoted === 'string') text = unquoted.trim()\n } catch { /* keep the quoted text */ }\n }\n try {\n const parsed: unknown = JSON.parse(text)\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) return parsed as Record<string, unknown>\n return { value: parsed }\n } catch { return { value: value } }\n }\n return { value }\n}\n\nfunction unwrapMcp(tool: string, input: Record<string, unknown>): { tool: string; server?: string; input: Record<string, unknown> } {\n if (META_MCP.test(tool)) {\n const server = pickString(input, ['ServerName', 'server_name', 'serverName', 'server'])\n const inner = pickString(input, ['ToolName', 'tool_name', 'toolName', 'name', 'tool'])\n if (inner !== undefined) {\n const raw = input.Arguments ?? input.arguments ?? input.args ?? input.parameters ?? input.params ?? input.input\n return { tool: inner, ...(server === undefined ? {} : { server }), input: innerArguments(raw) }\n }\n }\n if (tool.startsWith('mcp__')) {\n const parts = tool.slice(5).split('__')\n if (parts.length >= 2) return { tool: parts.slice(1).join('__'), server: parts[0]!, input }\n }\n return { tool, input }\n}\n\n/**\n * Describe one recorded call without inventing anything. Only a registered route\n * transport or the exact generated Code Mode wrapper is unwrapped, matching the\n * host-side projection predicate in `presentsActivity`.\n */\nexport function presentedCall(name: string, rawArguments: string): PresentedCall {\n const parsed = parseObject(rawArguments)\n const raw = parsed ?? {}\n if (isRouteTransportName(name)) {\n const reported = typeof raw.tool === 'string' ? raw.tool.trim() : ''\n if (reported === '') return { tool: name, transport: name, arguments: raw, malformed: parsed === undefined, raw: rawArguments }\n const server = typeof raw.server === 'string' && raw.server !== '' ? raw.server : undefined\n const unwrapped = unwrapMcp(reported, innerArguments(raw.input))\n const owner = unwrapped.server ?? server\n return { tool: unwrapped.tool, transport: name, arguments: unwrapped.input,\n ...(owner === undefined ? {} : { server: owner }), malformed: parsed === undefined, raw: rawArguments }\n }\n if (name === CODE_WRAPPER && parsed !== undefined && typeof parsed.code === 'string') {\n const step = mirrorStepInvocation(parsed.code)\n if (step !== undefined) {\n const description = typeof parsed.description === 'string' ? parsed.description : undefined\n return { tool: step.tool, transport: name, arguments: description === undefined ? {} : { Description: description }, malformed: false, raw: rawArguments }\n }\n }\n return { tool: name, arguments: raw, malformed: parsed === undefined, raw: rawArguments }\n}\n\n/** The command line this call ran, when it reported one. agy also uses `Command`. */\nexport function presentedCommand(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['CommandLine', 'command_line', 'Command', 'command', 'Cmd', 'cmd'])\n}\n\n/** The file path this call addressed, when it reported one. */\nexport function presentedPath(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['AbsolutePath', 'absolute_path', 'TargetFile', 'target_file', 'path', 'file_path',\n 'filename', 'Path', 'FilePath', 'FileName', 'targetFile'])\n}\n\n/** A human preview the route attached (agy's `Description`/`toolAction`). */\nexport function presentedDescription(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['Description', 'description', 'toolAction', 'toolSummary', 'Instruction', 'instruction'])\n}\n\n/** A search pattern or directory this call reported. */\nexport function presentedQuery(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['pattern', 'Pattern', 'query', 'Query', 'regex', 'Regex', 'QueryString', 'SearchDirectory', 'directory'])\n}\n\n/** The working directory the route reported, when it was not the session's own. */\nexport function presentedCwd(call: PresentedCall): string | undefined {\n return pickString(call.arguments, ['Cwd', 'cwd', 'WorkingDirectory', 'working_directory', 'workdir', 'WorkDir'])\n}\n\n/** Whether this call is a shell command, so the renderer uses a terminal card. */\nexport function presentsTerminal(call: PresentedCall): boolean {\n return AGY_TERMINAL_TOOLS.has(call.tool) || HOST_TERMINAL_TOOLS.has(call.tool)\n}\n\n/**\n * The exit code a terminal step really reported, in that producer's own format:\n * agy writes `The command exited with code N` / `[exit code N]` inside the\n * recorded output; this Host's shell tools end the output with `[exit code: N]`.\n * Anything else — a read/view/search result quoting such a line — has no terminal\n * status, so the card falls back to `isError` and never invents a failure.\n */\nexport function presentedExitCode(call: PresentedCall, output: string): number | undefined {\n // A bridge route reports steps from its own agent, so its inner shell tool keeps\n // agy's format even when it is named like a Host tool; the adapter reads exactly\n // these two shapes.\n if (call.transport !== undefined) {\n if (!AGY_TERMINAL_TOOLS.has(call.tool)) return undefined\n const match = /The command exited with code (\\d+)/i.exec(output) ?? /\\[exit code (\\d+)\\]/i.exec(output)\n return match?.[1] === undefined ? undefined : Number(match[1])\n }\n // Host tools keep their original rule: this Host appends the marker as the last\n // line, so a quoted marker inside command output is not mistaken for the status.\n if (HOST_TERMINAL_TOOLS.has(call.tool)) {\n const match = /\\n\\[exit code: (\\d+)\\]\\s*$/.exec(output)\n return match?.[1] === undefined ? undefined : Number(match[1])\n }\n return undefined\n}\n","import { useState } from 'react'\nimport { DiffBlock, TerminalBlock } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { activityDiffs } from './activity-model.js'\nimport { presentedCall, presentedCommand, presentedCwd, presentedDescription, presentedExitCode,\n presentedPath, presentedQuery, presentsTerminal } from './agy-activity.js'\nimport { tr, useLang, type Lang } from './i18n.js'\nimport type { ActivityRow } from './activity-model.js'\n\nconst labelsFor = (lang: Lang) => ({ codeLabel: tr(lang, '代码', 'Code'), wrapLabel: tr(lang, '自动换行', 'Wrap'), unwrapLabel: tr(lang, '取消自动换行', 'No wrap'),\n copy: tr(lang, '复制', 'Copy'), copied: tr(lang, '已复制', 'Copied'), collapseAria: tr(lang, '收起内容', 'Collapse'), collapse: tr(lang, '收起', 'Collapse'),\n expandAria: (n: number) => tr(lang, `展开其余 ${n} 行`, `Show ${n} more lines`), expand: (n: number) => tr(lang, `展开其余 ${n} 行`, `Show ${n} more lines`) })\n// `commandLine` is required by TerminalBlockLabels on DSH 0.2.1 and ignored on 0.2.0.\nconst terminalLabelsFor = (lang: Lang) => ({ ...labelsFor(lang), commandLine: (n: number) => tr(lang, `命令行第 ${n} 行`, `command line ${n}`),\n signal: (s: string) => tr(lang, `信号 ${s}`, `signal ${s}`), exitCode: (n: number) => tr(lang, `退出码 ${n}`, `exit code ${n}`),\n running: tr(lang, '执行中', 'Running'), failed: tr(lang, '执行失败', 'Failed'), done: tr(lang, '已返回', 'Done'), noOutput: tr(lang, '无输出', 'No output'), noExitCode: tr(lang, '未记录退出码', 'No exit code') })\n\n// Native Host tools plus the agy operations a bridge route reports under its transport.\nconst titleFor = (lang: Lang): Record<string, string> => ({\n bash: tr(lang, '终端', 'Terminal'), pwsh: tr(lang, '终端', 'Terminal'),\n run_command: tr(lang, '终端', 'Terminal'), execute_command: tr(lang, '终端', 'Terminal'), ops_bash: tr(lang, '终端', 'Terminal'), sh: tr(lang, '终端', 'Terminal'), shell: tr(lang, '终端', 'Terminal'),\n read: tr(lang, '读取', 'Read'), view_file: tr(lang, '读取', 'Read'), read_file: tr(lang, '读取', 'Read'), open_file: tr(lang, '读取', 'Read'),\n write: tr(lang, '写入', 'Write'), write_to_file: tr(lang, '写入', 'Write'), write_file: tr(lang, '写入', 'Write'), create_file: tr(lang, '写入', 'Write'),\n edit: tr(lang, '编辑', 'Edit'), str_replace_editor: tr(lang, '编辑', 'Edit'), replace_file_content: tr(lang, '编辑', 'Edit'), edit_file: tr(lang, '编辑', 'Edit'), replace_in_file: tr(lang, '编辑', 'Edit'),\n glob: tr(lang, '查找文件', 'Find files'), find_by_name: tr(lang, '查找文件', 'Find files'), search_files: tr(lang, '查找文件', 'Find files'), ops_glob: tr(lang, '查找文件', 'Find files'),\n grep: tr(lang, '搜索', 'Search'), grep_search: tr(lang, '搜索', 'Search'), search_file_content: tr(lang, '搜索', 'Search'), ops_grep: tr(lang, '搜索', 'Search'), search: tr(lang, '搜索', 'Search'),\n job_output: tr(lang, '命令输出', 'Command output'), job_kill: tr(lang, '停止命令', 'Stop command'),\n})\n\nexport function ActivityCard({ row, done, cwd, openFile }: {\n row: ActivityRow; done: boolean; cwd?: string; openFile(path: string): void\n}) {\n const lang = useLang()\n const [open, setOpen] = useState(false)\n const presented = presentedCall(row.call.data.name, row.call.data.arguments)\n const result = row.result?.data.message\n const output = result?.content.flatMap(part => part.type === 'text' ? [part.text] : []).join('\\n') ?? ''\n const path = presentedPath(presented)\n const command = presentedCommand(presented)\n const terminal = presentsTerminal(presented)\n const exit = presentedExitCode(presented, output)\n const failed = result?.isError || (exit !== undefined && exit !== 0)\n const diffs = activityDiffs(row)\n const label = titleFor(lang)[presented.tool] ?? presented.tool\n const summary = path ?? presentedDescription(presented) ?? command ?? presentedQuery(presented)\n ?? (presented.server === undefined ? label : `${presented.server}: ${label}`)\n const status = failed ? tr(lang, '失败', 'Failed') : !row.result ? (done ? tr(lang, '结果未记录', 'No result recorded') : tr(lang, '执行中', 'Running')) : ''\n return <div className=\"fusion-activity-row\" data-fusion-tool={row.call.data.name}\n data-fusion-inner={presented.tool} data-fusion-call={row.id}>\n <button type=\"button\" aria-expanded={open} onClick={() => setOpen(!open)} className=\"fusion-activity-toggle\">\n <span aria-hidden>{open ? '⌄' : '›'}</span><span>{label}</span>\n <span className=\"fusion-activity-summary\">{summary}</span>\n {status && <small role=\"status\" data-failed={Boolean(failed)}>{status}</small>}\n </button>\n {open && <div className=\"fusion-activity-body\">\n {path && <button type=\"button\" className=\"fusion-activity-file\" onClick={() => openFile(path)}>{tr(lang, '打开', 'Open')} {path}</button>}\n {diffs.length ? <DiffBlock diffs={diffs} labels={labelsFor(lang)} maxLines={16} />\n : terminal && command ? <TerminalBlock command={command} cwd={presentedCwd(presented) ?? cwd} output={output}\n running={!row.result && !done} exitCode={exit} labels={terminalLabelsFor(lang)} />\n : <pre>{output || (presented.malformed ? presented.raw\n : row.result ? tr(lang, '已返回,无文本输出。', 'Returned without text output.') : presented.raw)}</pre>}\n </div>}\n </div>\n}\n\nexport const activityStyles = `\n.fusion-activity-row{font-size:13px;line-height:1.5;margin:4px 0;min-width:0;color:var(--dsw-alias-label-secondary)}\n.fusion-activity-toggle{display:flex;align-items:center;gap:8px;width:100%;padding:6px 0;background:none;border:0;color:inherit;text-align:left;cursor:pointer;font:inherit}\n.fusion-activity-toggle:focus-visible,.fusion-activity-file:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\n.fusion-activity-summary{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary)}\n.fusion-activity-toggle small{white-space:nowrap}.fusion-activity-toggle small[data-failed=true]{color:var(--dsw-alias-state-error-primary)}\n.fusion-activity-body{padding:4px 0 10px;overflow:hidden}.fusion-activity-body pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:360px;overflow:auto;font-size:12px}\n.fusion-activity-file{font:inherit;border:0;background:none;color:var(--dsw-alias-brand-primary);padding:0 0 6px;cursor:pointer}\n`\n","import type { ToolCallViewProps } from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { useEffect, useMemo, useState } from 'react'\nimport type { FusionActivity, FusionActivityPage } from '../activity.js'\nimport { activityRows } from './activity-model.js'\nimport { tr, useLang } from './i18n.js'\nimport { ActivityCard, activityStyles } from './ActivityRows.js'\nimport { FUSION_API_PATH } from '../identity.js'\n\nexport const fusionControlTools = ['fusion_read_state', 'fusion_delegate_text', 'fusion_explore', 'fusion_delegate', 'fusion_rework', 'fusion_wait', 'fusion_review_result',\n 'fusion_submit_result', 'fusion_takeover', 'fusion_finish_direct', 'fusion_read_evidence'] as const\n\n/** Keep internal coordination out of the normal conversation. Errors remain visible. */\nexport function FusionTool({ block, sessionId, callId, toolName, cwd, openFile }: ToolCallViewProps) {\n const lang = useLang()\n const settled = 'kind' in block\n const tracksActivity = toolName === 'fusion_delegate_text' || toolName === 'fusion_explore' || toolName === 'fusion_delegate' || toolName === 'fusion_rework'\n const [snapshot, setSnapshot] = useState<{ key: string; events: FusionActivity[]; done: boolean; failed?: boolean }>()\n const key = `${sessionId}:${callId}`\n useEffect(() => {\n if (!tracksActivity) return\n let active = true, busy = false, cursor = -1, timer: ReturnType<typeof setTimeout> | undefined\n const events = new Map<number, FusionActivity>()\n let abort: AbortController | undefined\n const visible = () => document.visibilityState !== 'hidden'\n const refresh = async () => {\n if (!active || busy || !visible()) return\n busy = true; abort = new AbortController()\n const deadline = setTimeout(() => abort?.abort(), 10000)\n let again = true, delay = 2000\n try {\n const response = await fetch(`${FUSION_API_PATH}?view=activity&sessionId=${encodeURIComponent(sessionId)}&callId=${encodeURIComponent(callId)}&after=${cursor}`,\n { credentials: 'same-origin', cache: 'no-store', signal: abort.signal })\n if (!response.ok) throw new Error('Activity unavailable')\n const page = await response.json() as FusionActivityPage\n if (!Array.isArray(page.events) || !Number.isSafeInteger(page.cursor) || page.cursor < cursor) throw new Error('Invalid activity page')\n for (const event of page.events) if (event.parentCallId === callId) events.set(event.source.seq, event)\n cursor = page.cursor; again = page.more || !page.done || !settled; delay = page.more ? 0 : 2000\n if (active) setSnapshot({ key, events: [...events.values()].sort((a, b) => a.source.seq - b.source.seq), done: page.done })\n } catch {\n if (active) setSnapshot(previous => ({ key, events: previous?.key === key ? previous.events : [], done: false, failed: true }))\n } finally {\n clearTimeout(deadline); busy = false\n if (active && again && visible()) timer = setTimeout(() => { void refresh() }, delay)\n }\n }\n const visibility = () => { if (timer) clearTimeout(timer); if (document.visibilityState === 'hidden') abort?.abort(); else void refresh() }\n void refresh(); document.addEventListener('visibilitychange', visibility)\n return () => { active = false; abort?.abort(); if (timer) clearTimeout(timer); document.removeEventListener('visibilitychange', visibility) }\n }, [sessionId, callId, key, tracksActivity, settled])\n const current = tracksActivity && snapshot?.key === key ? snapshot : undefined\n const rows = useMemo(() => activityRows(current?.events ?? []), [current?.events])\n const text = settled ? block.content.flatMap(part => part.type === 'text' ? [part.text] : []).join('\\n') : ''\n let problem = settled && block.isError ? text : ''\n if (!problem) {\n try {\n const result = JSON.parse(text) as { status?: string; reason?: string }\n if (result.status === 'needs-decision') problem = result.reason ?? tr(lang, '任务需要进一步处理。', 'The task needs attention.')\n } catch { /* Non-JSON successful evidence carries no user action. */ }\n }\n return <>\n {rows.length > 0 && <style>{activityStyles}</style>}\n {rows.map(row => <ActivityCard key={row.id} row={row} done={current?.done ?? false} cwd={cwd} openFile={openFile} />)}\n {current?.failed && <p role=\"status\">{tr(lang, '执行记录暂时无法加载,正在重试。', 'Activity is unavailable; retrying.')}</p>}\n {problem && <p role=\"status\" style={{ fontSize: 13, whiteSpace: 'pre-wrap' }}>{problem}</p>}\n </>\n}\n","// User-decision quick-action helper for the Antigravity console.\n//\n// Ported from dsh-agy-worker (`src/client/decisions.ts`), MIT License,\n// Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n// dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n// docs/ATTRIBUTION-AGY.md.\n//\n// Only the composer helper the tool cards use is installed by Fusion; the\n// page-wide decision scanner of the standalone plugin is not, because it would\n// inject nodes into conversations Fusion already renders.\n\nimport { isInteractionLocked, onScrollSettle } from './scroll-guard.js';\n\nconst DECISION_CSS = `\n.agy-decision-container {\n margin: 10px 0 6px 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.07));\n border: 1px dashed var(--dsw-alias-border-l3, rgba(127, 127, 127, 0.3));\n}\n\n.agy-decision-header {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #aaa);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.agy-decision-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.agy-decision-chip {\n background: var(--dsw-alias-bg-l1, rgba(255, 255, 255, 0.05));\n border: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.25));\n color: var(--dsw-alias-label-primary, #eee);\n padding: 5px 12px;\n border-radius: 999px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s ease;\n user-select: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n text-align: left;\n max-width: 100%;\n}\n\n.agy-decision-chip:hover {\n background: var(--dsw-alias-bg-hover, rgba(127, 127, 127, 0.18));\n border-color: var(--dsw-alias-border-l4, rgba(127, 127, 127, 0.5));\n transform: translateY(-1px);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);\n}\n\n.agy-decision-chip:active {\n transform: translateY(0);\n}\n\n.agy-decision-chip.selected {\n background: rgba(16, 185, 129, 0.15);\n border-color: #10b981;\n color: #10b981;\n}\n\n.agy-decision-chip-num {\n font-weight: 700;\n opacity: 0.8;\n}\n\n.agy-decision-chip-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n`;\n\nfunction injectStyles(): void {\n if (typeof document === 'undefined') return;\n const styleId = 'dsh-fusion-agy-decisions-css';\n if (document.getElementById(styleId) === null) {\n const st = document.createElement('style');\n st.id = styleId;\n st.textContent = DECISION_CSS;\n const host = document.head ?? document.documentElement;\n if (host) host.appendChild(st);\n }\n}\n\n/**\n * Insert text directly into DSH's chat composer\n */\nexport function insertTextIntoChatComposer(text: string): boolean {\n if (typeof document === 'undefined' || !text) return false;\n const inputEl =\n document.querySelector<HTMLElement>('[data-composer-input]') ??\n document.querySelector<HTMLElement>('[role=\"textbox\"][contenteditable=\"true\"]') ??\n document.querySelector<HTMLTextAreaElement>('textarea');\n\n if (!inputEl) return false;\n inputEl.focus();\n\n if (inputEl instanceof HTMLTextAreaElement || inputEl instanceof HTMLInputElement) {\n const start = inputEl.selectionStart ?? inputEl.value.length;\n const end = inputEl.selectionEnd ?? inputEl.value.length;\n inputEl.setRangeText(text, start, end, 'end');\n inputEl.dispatchEvent(new Event('input', { bubbles: true }));\n inputEl.dispatchEvent(new Event('change', { bubbles: true }));\n return true;\n }\n\n // Lexical / ContentEditable\n try {\n const ok = document.execCommand('insertText', false, text);\n if (ok) return true;\n } catch {\n // ignore\n }\n\n // Fallback direct text update\n const existing = inputEl.textContent?.trim() ?? '';\n inputEl.textContent = existing ? `${existing} ${text}` : text;\n inputEl.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: text }));\n return true;\n}\n\n/** Check if text header suggests an actionable decision or choice prompt */\nconst DECISION_HEADER_REGEX = /(?:请(?:您)?(?:拍板|指示|决定|选择|决策)|decision|next\\s+step|choose|拍板|选择方案)/i;\n\ninterface ExtractedOption {\n num?: string;\n title: string;\n fullText: string;\n}\n\n/** Extract numbered options or choice items from a decision list */\nfunction extractOptionsFromList(container: HTMLElement): ExtractedOption[] {\n const options: ExtractedOption[] = [];\n const listItems = container.querySelectorAll('li');\n\n if (listItems.length > 0) {\n for (let i = 0; i < listItems.length; i++) {\n const li = listItems[i];\n if (!li) continue;\n const text = (li.textContent ?? '').trim();\n if (!text) continue;\n\n // Extract title: up to first colon, dash, or 60 chars\n const m = text.match(/^([0-9]+[、..:]\\s*)?(.*?)(?:[::—\\-·]|\\n|$)/);\n const num = m?.[1]?.trim() ?? `${i + 1}.`;\n let title = m?.[2]?.trim() || text.slice(0, 50);\n if (title.length > 40) title = title.slice(0, 40) + '…';\n\n options.push({\n num,\n title,\n fullText: text,\n });\n }\n }\n\n return options;\n}\n\n/**\n * Scan DOM for decision prompts and mount interactive choice chips.\n *\n * IDEMPOTENCE (incident 2026-10-23 — \"scroll back and forth = insane flashing\"):\n * DSH renders these containers inside a TanStack-Virtual list with dynamic\n * measurement (`measureElement` + `anchorTo:\"start\"`). Injecting a toolbar\n * changes the measured item height, which makes the virtualizer rewrite\n * scrollTop; the resulting re-render rebuilds the markdown/heading nodes\n * (dropping the per-HEADING guard) and this scanner injected the toolbar\n * again — growth on every scroll pass, i.e. a flashing flywheel.\n *\n * Two independent guards now make injection strictly once-per-container:\n * 1. `data-agy-decisions-scanned` on the container, written on EVERY pass\n * (it used to be read here but never assigned anywhere in the codebase),\n * 2. \"a toolbar already exists in this container\" — survives React\n * rebuilding the heading nodes during a virtualizer remount.\n */\nexport function scanAndEnhanceDecisions(): void {\n if (typeof document === 'undefined') return;\n if (isInteractionLocked()) return;\n\n const markdownContainers = document.querySelectorAll<HTMLElement>('div[class*=\"_markdown_\"], [data-markdown-variant]');\n for (let i = 0; i < markdownContainers.length; i++) {\n const container = markdownContainers[i];\n if (!container || container.dataset.agyDecisionsScanned === 'true') continue;\n\n // A previous pass (or the host's own snapshot) already injected a toolbar\n // into this container. Mark and skip: never inject a duplicate.\n if (container.querySelector('.agy-decision-container')) {\n container.dataset.agyDecisionsScanned = 'true';\n continue;\n }\n\n // Mark BEFORE mutating so a self-triggered re-scan (this function inserts\n // nodes, which fires the observer that called it) short-circuits above.\n container.dataset.agyDecisionsScanned = 'true';\n\n // Check headings (h2, h3, h4, or strong paragraphs)\n const headings = container.querySelectorAll<HTMLElement>('h2, h3, h4, p > strong');\n for (let j = 0; j < headings.length; j++) {\n const heading = headings[j];\n if (!heading || heading.dataset.agyDecisionAttached === 'true') continue;\n\n const headingText = (heading.textContent ?? '').trim();\n if (!DECISION_HEADER_REGEX.test(headingText)) continue;\n\n // Find the list immediately following this heading\n let sibling = heading.nextElementSibling;\n let targetList: HTMLElement | null = null;\n while (sibling) {\n if (sibling.tagName === 'OL' || sibling.tagName === 'UL') {\n targetList = sibling as HTMLElement;\n break;\n }\n if (/^H[1-4]$/.test(sibling.tagName)) break; // hit another heading\n sibling = sibling.nextElementSibling;\n }\n\n if (!targetList) continue;\n\n const options = extractOptionsFromList(targetList);\n if (options.length === 0) continue;\n\n heading.dataset.agyDecisionAttached = 'true';\n\n // Build decision chip toolbar\n const box = document.createElement('div');\n box.className = 'agy-decision-container';\n\n const header = document.createElement('div');\n header.className = 'agy-decision-header';\n header.innerHTML = '<span>💬 点击选项快速填入:</span>';\n box.appendChild(header);\n\n const chips = document.createElement('div');\n chips.className = 'agy-decision-chips';\n\n for (const opt of options) {\n const chip = document.createElement('button');\n chip.type = 'button';\n chip.className = 'agy-decision-chip';\n chip.title = `点击填入: ${opt.fullText}`;\n\n const numSpan = document.createElement('span');\n numSpan.className = 'agy-decision-chip-num';\n numSpan.textContent = opt.num ?? '👉';\n\n const textSpan = document.createElement('span');\n textSpan.className = 'agy-decision-chip-text';\n textSpan.textContent = opt.title;\n\n chip.appendChild(numSpan);\n chip.appendChild(textSpan);\n\n chip.onclick = (e) => {\n e.stopPropagation();\n const cleanText = opt.fullText.replace(/^[0-9]+[、..:]\\s*/, '').trim();\n const insertPayload = `我选择 ${opt.num ? opt.num + ' ' : ''}${cleanText}`;\n insertTextIntoChatComposer(insertPayload);\n\n chip.classList.add('selected');\n setTimeout(() => chip.classList.remove('selected'), 1200);\n };\n\n chips.appendChild(chip);\n }\n\n box.appendChild(chips);\n targetList.parentNode?.insertBefore(box, targetList.nextSibling);\n }\n }\n}\n\nlet decisionChipsDispose: (() => void) | null = null;\nlet decisionScanTimer: ReturnType<typeof setTimeout> | null = null;\nlet unbindDecisionSettle: (() => void) | null = null;\n\nfunction scheduleDecisionScan(): void {\n if (isInteractionLocked()) return;\n if (decisionScanTimer !== null) return;\n decisionScanTimer = setTimeout(() => {\n decisionScanTimer = null;\n if (isInteractionLocked()) return;\n scanAndEnhanceDecisions();\n }, 100);\n}\n\nexport function installDecisionChips(): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {};\n // Same lifecycle contract as installImageEnhancer: a reload replaces the\n // observer instead of accumulating one per plugin load.\n decisionChipsDispose?.();\n injectStyles();\n\n const observer = new MutationObserver(() => {\n scheduleDecisionScan();\n });\n\n unbindDecisionSettle = onScrollSettle(() => {\n scheduleDecisionScan();\n });\n\n const setup = () => {\n if (document.body) {\n observer.observe(document.body, { childList: true, subtree: true });\n scanAndEnhanceDecisions();\n }\n };\n\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', setup, { once: true });\n } else {\n setup();\n }\n\n const dispose = (): void => {\n observer.disconnect();\n if (unbindDecisionSettle !== null) {\n unbindDecisionSettle();\n unbindDecisionSettle = null;\n }\n if (decisionScanTimer !== null) {\n clearTimeout(decisionScanTimer);\n decisionScanTimer = null;\n }\n window.removeEventListener('DOMContentLoaded', setup);\n if (decisionChipsDispose === dispose) decisionChipsDispose = null;\n };\n decisionChipsDispose = dispose;\n return dispose;\n}\n","// Client-side local image display & lightbox helper for the Antigravity console.\n//\n// Ported from dsh-agy-worker (`src/client/images.ts`), MIT License,\n// Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n// dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n// docs/ATTRIBUTION-AGY.md.\n//\n// The standalone plugin also installed this as a page-wide DOM scanner over the\n// conversation. Fusion does not: the scanners belong to the old plugin identity,\n// so only the pure helpers the console and its tool cards call are kept\n// (`buildMediaUrl`, `openLightbox`, `isImageFile`).\n\nimport { isInteractionLocked, onScrollSettle } from './scroll-guard.js';\n\nlet lightboxOverlay: HTMLElement | null = null;\nlet currentLightboxImg: HTMLImageElement | null = null;\nlet lightboxScale = 1.0;\nlet lightboxTranslateX = 0;\nlet lightboxTranslateY = 0;\nlet isDraggingLightbox = false;\nlet dragStartX = 0;\nlet dragStartY = 0;\n\nconst IMAGE_CSS = `\n.agy-image-card {\n display: inline-flex;\n flex-direction: column;\n margin: 6px 0;\n max-width: 100%;\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.25));\n background: var(--dsw-alias-bg-l1, rgba(255, 255, 255, 0.03));\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n vertical-align: middle;\n}\n\n.agy-image-card:hover {\n border-color: var(--dsw-alias-border-l3, rgba(127, 127, 127, 0.45));\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.25);\n}\n\n.agy-image-thumb-wrap {\n position: relative;\n overflow: hidden;\n max-height: 480px;\n cursor: zoom-in;\n display: flex;\n align-items: center;\n justify-content: center;\n background: repeating-conic-gradient(rgba(127,127,127,0.08) 0% 25%, transparent 0% 50%) 50% / 16px 16px;\n}\n\n.agy-image-thumb {\n display: block;\n max-width: 100%;\n max-height: 480px;\n height: auto;\n object-fit: contain;\n transition: transform 0.2s ease;\n}\n\n.agy-image-card:hover .agy-image-thumb {\n transform: scale(1.015);\n}\n\n.agy-image-caption {\n padding: 6px 10px;\n font-size: 11.5px;\n color: var(--dsw-alias-label-secondary, #aaa);\n background: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.08));\n border-top: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.15));\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.agy-image-link-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n margin: 0 2px;\n border-radius: 4px;\n font-size: 12px;\n background: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.1));\n border: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.2));\n color: var(--dsw-alias-label-primary, #ddd);\n cursor: pointer;\n text-decoration: none;\n transition: all 0.15s ease;\n}\n\n.agy-image-link-chip:hover {\n background: var(--dsw-alias-bg-hover, rgba(127, 127, 127, 0.2));\n border-color: var(--dsw-alias-border-l3, rgba(127, 127, 127, 0.35));\n}\n\n/* Lightbox Modal */\n.agy-lightbox-backdrop {\n position: fixed;\n inset: 0;\n z-index: 999999;\n background: rgba(0, 0, 0, 0.9);\n /* No full-viewport backdrop blur: same flicker class as the console overlay.\n The image viewer is already near-opaque; a solid alpha is stable. */\n overscroll-behavior: contain;\n display: flex;\n flex-direction: column;\n user-select: none;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.agy-lightbox-backdrop.open {\n opacity: 1;\n}\n\n.agy-lightbox-header {\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n background: rgba(20, 20, 20, 0.65);\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n color: #fff;\n font-size: 13px;\n}\n\n.agy-lightbox-title {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 60%;\n}\n\n.agy-lightbox-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.agy-lightbox-btn {\n background: rgba(255, 255, 255, 0.1);\n border: 1px solid rgba(255, 255, 255, 0.15);\n color: #fff;\n border-radius: 6px;\n padding: 4px 10px;\n cursor: pointer;\n font-size: 12px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.15s ease;\n}\n\n.agy-lightbox-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n.agy-lightbox-btn-close {\n background: rgba(239, 68, 68, 0.25);\n border-color: rgba(239, 68, 68, 0.4);\n}\n\n.agy-lightbox-btn-close:hover {\n background: rgba(239, 68, 68, 0.45);\n}\n\n.agy-lightbox-body {\n flex: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: grab;\n}\n\n.agy-lightbox-body.grabbing {\n cursor: grabbing;\n}\n\n.agy-lightbox-img-wrap {\n transform-origin: center center;\n transition: transform 0.05s ease-out;\n display: inline-block;\n}\n\n.agy-lightbox-img {\n max-width: 90vw;\n max-height: 85vh;\n object-fit: contain;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n border-radius: 4px;\n pointer-events: none;\n}\n`;\n\nfunction injectStyles(): void {\n if (typeof document === 'undefined') return;\n const styleId = 'dsh-fusion-agy-images-css';\n if (document.getElementById(styleId) === null) {\n const st = document.createElement('style');\n st.id = styleId;\n st.textContent = IMAGE_CSS;\n const host = document.head ?? document.documentElement;\n if (host) host.appendChild(st);\n }\n}\n\nfunction getOrigin(): string {\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n return '';\n}\n\n/** Build media URL from path */\nexport function buildMediaUrl(rawPath: string): string {\n const origin = getOrigin();\n return `${origin}/plugins/agy-worker/media?path=${encodeURIComponent(rawPath.trim())}`;\n}\n\n/**\n * Open fullscreen Lightbox modal\n */\nexport function openLightbox(src: string, title = 'Image Preview', rawPath?: string): void {\n if (typeof document === 'undefined') return;\n injectStyles();\n\n if (lightboxOverlay) {\n lightboxOverlay.remove();\n lightboxOverlay = null;\n }\n\n lightboxScale = 1.0;\n lightboxTranslateX = 0;\n lightboxTranslateY = 0;\n\n const overlay = document.createElement('div');\n overlay.className = 'agy-lightbox-backdrop';\n\n const header = document.createElement('div');\n header.className = 'agy-lightbox-header';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'agy-lightbox-title';\n titleEl.textContent = title;\n header.appendChild(titleEl);\n\n const actions = document.createElement('div');\n actions.className = 'agy-lightbox-actions';\n\n const btnZoomIn = document.createElement('button');\n btnZoomIn.className = 'agy-lightbox-btn';\n btnZoomIn.textContent = '🔍+';\n btnZoomIn.title = '放大 / Zoom In';\n\n const btnZoomOut = document.createElement('button');\n btnZoomOut.className = 'agy-lightbox-btn';\n btnZoomOut.textContent = '🔍-';\n btnZoomOut.title = '缩小 / Zoom Out';\n\n const btnReset = document.createElement('button');\n btnReset.className = 'agy-lightbox-btn';\n btnReset.textContent = '1:1';\n btnReset.title = '实际大小 / Reset';\n\n actions.appendChild(btnZoomIn);\n actions.appendChild(btnZoomOut);\n actions.appendChild(btnReset);\n\n if (rawPath) {\n const btnCopyPath = document.createElement('button');\n btnCopyPath.className = 'agy-lightbox-btn';\n btnCopyPath.textContent = '📋 复制路径';\n btnCopyPath.onclick = (e) => {\n e.stopPropagation();\n if (navigator.clipboard) {\n navigator.clipboard.writeText(rawPath).then(() => {\n btnCopyPath.textContent = '✓ 已复制';\n setTimeout(() => { btnCopyPath.textContent = '📋 复制路径'; }, 1500);\n }).catch(() => {});\n }\n };\n actions.appendChild(btnCopyPath);\n }\n\n const btnClose = document.createElement('button');\n btnClose.className = 'agy-lightbox-btn agy-lightbox-btn-close';\n btnClose.textContent = '✕ 关闭';\n actions.appendChild(btnClose);\n\n header.appendChild(actions);\n overlay.appendChild(header);\n\n const body = document.createElement('div');\n body.className = 'agy-lightbox-body';\n\n const imgWrap = document.createElement('div');\n imgWrap.className = 'agy-lightbox-img-wrap';\n\n const img = document.createElement('img');\n img.className = 'agy-lightbox-img';\n img.src = src;\n img.alt = title;\n currentLightboxImg = img;\n\n imgWrap.appendChild(img);\n body.appendChild(imgWrap);\n overlay.appendChild(body);\n\n const updateTransform = () => {\n imgWrap.style.transform = `translate(${lightboxTranslateX}px, ${lightboxTranslateY}px) scale(${lightboxScale})`;\n };\n\n btnZoomIn.onclick = (e) => {\n e.stopPropagation();\n lightboxScale = Math.min(lightboxScale * 1.3, 5.0);\n updateTransform();\n };\n\n btnZoomOut.onclick = (e) => {\n e.stopPropagation();\n lightboxScale = Math.max(lightboxScale / 1.3, 0.2);\n updateTransform();\n };\n\n btnReset.onclick = (e) => {\n e.stopPropagation();\n lightboxScale = 1.0;\n lightboxTranslateX = 0;\n lightboxTranslateY = 0;\n updateTransform();\n };\n\n const closeLightbox = () => {\n window.removeEventListener('keydown', onKeyDown);\n overlay.classList.remove('open');\n setTimeout(() => {\n overlay.remove();\n if (lightboxOverlay === overlay) lightboxOverlay = null;\n }, 200);\n };\n\n btnClose.onclick = (e) => {\n e.stopPropagation();\n closeLightbox();\n };\n\n overlay.onclick = (e) => {\n if (e.target === overlay || e.target === body) {\n closeLightbox();\n }\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeLightbox();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n\n // Drag and pan\n body.onmousedown = (e) => {\n isDraggingLightbox = true;\n dragStartX = e.clientX - lightboxTranslateX;\n dragStartY = e.clientY - lightboxTranslateY;\n body.classList.add('grabbing');\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!isDraggingLightbox) return;\n lightboxTranslateX = e.clientX - dragStartX;\n lightboxTranslateY = e.clientY - dragStartY;\n updateTransform();\n };\n\n const onMouseUp = () => {\n if (isDraggingLightbox) {\n isDraggingLightbox = false;\n body.classList.remove('grabbing');\n }\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n // Wheel zoom\n body.onwheel = (e) => {\n e.preventDefault();\n const factor = e.deltaY < 0 ? 1.15 : 0.87;\n lightboxScale = Math.max(0.2, Math.min(lightboxScale * factor, 5.0));\n updateTransform();\n };\n\n document.body.appendChild(overlay);\n lightboxOverlay = overlay;\n requestAnimationFrame(() => overlay.classList.add('open'));\n}\n\n/** Check if a URL or path is an image */\nexport function isImageFile(pathOrUrl: string): boolean {\n if (!pathOrUrl || typeof pathOrUrl !== 'string') return false;\n const clean = pathOrUrl.split(/[?#]/)[0] ?? '';\n return /\\.(png|jpe?g|webp|gif|svg|bmp|ico|avif)$/i.test(clean);\n}\n\n/** Get React props of a DOM element */\nfunction getReactProps(el: HTMLElement): Record<string, unknown> | null {\n const key = Object.keys(el).find((k) => k.startsWith('__reactProps'));\n if (!key) return null;\n return (el as unknown as Record<string, unknown>)[key] as Record<string, unknown> | null;\n}\n\n/**\n * Scan DOM for imageAlt spans and enhance them with live rendered images\n */\nexport function scanAndEnhanceImages(): void {\n if (typeof document === 'undefined') return;\n if (isInteractionLocked()) return;\n const origin = getOrigin();\n\n // 1. Rewrite any existing <img> src pointing to 127.0.0.1 to current origin if remote\n if (origin && !origin.includes('127.0.0.1') && !origin.includes('localhost')) {\n const images = document.querySelectorAll<HTMLImageElement>('img[src*=\"/plugins/agy-worker/media\"]');\n for (let i = 0; i < images.length; i++) {\n const img = images[i];\n if (img && img.src.includes('127.0.0.1')) {\n const u = new URL(img.src);\n img.src = `${origin}${u.pathname}${u.search}`;\n }\n }\n }\n\n // 2. Scan markdown containers for imageAlt spans and replace with real images\n const markdownContainers = document.querySelectorAll<HTMLElement>('div[class*=\"_markdown_\"], [data-markdown-variant]');\n for (let i = 0; i < markdownContainers.length; i++) {\n const container = markdownContainers[i];\n if (!container) continue;\n\n const altSpans = container.querySelectorAll<HTMLElement>('span[class*=\"imageAlt\"], span[class*=\"_imageAlt_\"]');\n if (altSpans.length === 0) continue;\n\n // Check React props for original markdown text\n const props = getReactProps(container);\n const mdText = typeof props?.text === 'string' ? props.text : '';\n if (!mdText) continue;\n\n // Extract all image markdown definitions: \n const imgMatches: Array<{ alt: string; target: string }> = [];\n const re = /!\\[(.*?)\\]\\((file:\\/\\/\\/[^\\s)]+|file:\\/\\/[^\\s)]+|[A-Za-z]:[\\\\/][^\\s)]+|\\/home\\/[^\\s)]+|\\/mnt\\/[a-zA-Z]\\/[^\\s)]+|\\\\\\\\wsl\\.localhost\\\\[^\\s)]+)\\)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(mdText)) !== null) {\n imgMatches.push({ alt: m[1] ?? '', target: m[2] ?? '' });\n }\n\n if (imgMatches.length === 0) continue;\n\n for (let j = 0; j < altSpans.length; j++) {\n const span = altSpans[j];\n if (!span || span.dataset.agyEnhanced === 'true') continue;\n\n const altText = (span.textContent ?? '').trim();\n const match = imgMatches.find((im) => im.alt.trim() === altText) ?? imgMatches[j];\n if (!match) continue;\n\n span.dataset.agyEnhanced = 'true';\n const mediaUrl = buildMediaUrl(match.target);\n\n // Create card\n const card = document.createElement('div');\n card.className = 'agy-image-card';\n\n const thumbWrap = document.createElement('div');\n thumbWrap.className = 'agy-image-thumb-wrap';\n thumbWrap.title = `${altText || 'Image'} (点击全屏放大)`;\n\n const img = document.createElement('img');\n img.className = 'agy-image-thumb';\n img.src = mediaUrl;\n img.alt = altText || 'Preview';\n img.loading = 'lazy';\n\n img.onerror = () => {\n // Fall back to original alt text if media loading fails\n card.style.display = 'none';\n span.style.display = '';\n };\n\n thumbWrap.appendChild(img);\n card.appendChild(thumbWrap);\n\n if (altText) {\n const caption = document.createElement('div');\n caption.className = 'agy-image-caption';\n caption.textContent = altText;\n card.appendChild(caption);\n }\n\n thumbWrap.onclick = (e) => {\n e.stopPropagation();\n openLightbox(mediaUrl, altText || 'Image Preview', match.target);\n };\n\n span.style.display = 'none';\n span.parentNode?.insertBefore(card, span);\n }\n }\n\n // 3. Scan for <a> links to file:// images\n const links = document.querySelectorAll<HTMLAnchorElement>('a[href^=\"file://\"]');\n for (let i = 0; i < links.length; i++) {\n const link = links[i];\n if (!link || link.dataset.agyLinkEnhanced === 'true') continue;\n\n const href = link.href ?? '';\n if (!isImageFile(href)) continue;\n\n link.dataset.agyLinkEnhanced = 'true';\n const mediaUrl = buildMediaUrl(href);\n const linkText = link.textContent ?? 'Image';\n\n link.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n openLightbox(mediaUrl, linkText, href);\n };\n\n // Add a visual preview indicator\n if (!link.querySelector('.agy-image-link-icon')) {\n const badge = document.createElement('span');\n badge.className = 'agy-image-link-chip agy-image-link-icon';\n badge.textContent = '🖼️ 预览';\n link.appendChild(badge);\n }\n }\n}\n\nlet imageEnhancerDispose: (() => void) | null = null;\nlet imageScanTimer: ReturnType<typeof setTimeout> | null = null;\nlet unbindImageSettle: (() => void) | null = null;\n\nfunction scheduleImageScan(): void {\n if (isInteractionLocked()) return;\n if (imageScanTimer !== null) return;\n imageScanTimer = setTimeout(() => {\n imageScanTimer = null;\n if (isInteractionLocked()) return;\n scanAndEnhanceImages();\n }, 100);\n}\n\nexport function installImageEnhancer(): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {};\n // A plugin reload must DISCONNECT the previous observer instead of stacking\n // one more per reload (the ctx.effect contract main's installers follow).\n imageEnhancerDispose?.();\n injectStyles();\n\n const observer = new MutationObserver(() => {\n scheduleImageScan();\n });\n\n unbindImageSettle = onScrollSettle(() => {\n scheduleImageScan();\n });\n\n const setup = () => {\n if (document.body) {\n observer.observe(document.body, { childList: true, subtree: true });\n scanAndEnhanceImages();\n }\n };\n\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', setup, { once: true });\n } else {\n setup();\n }\n\n const dispose = (): void => {\n observer.disconnect();\n if (unbindImageSettle !== null) {\n unbindImageSettle();\n unbindImageSettle = null;\n }\n if (imageScanTimer !== null) {\n clearTimeout(imageScanTimer);\n imageScanTimer = null;\n }\n window.removeEventListener('DOMContentLoaded', setup);\n if (imageEnhancerDispose === dispose) imageEnhancerDispose = null;\n };\n imageEnhancerDispose = dispose;\n return dispose;\n}\n","/**\n * Native tool-card toolviews for the built-in Antigravity route.\n *\n * Ported from dsh-agy-worker (`src/client/toolview.ts`), MIT License,\n * Copyright (c) 2026 dsh-agy-worker contributors; dsh-agy-worker is a fork of\n * dsh-agy-link (https://github.com/amlyczz/dsh-agy-link). See\n * docs/ATTRIBUTION-AGY.md.\n *\n * Two keyed `tool.call.toolview` views, exactly as upstream registered them:\n * - `agy_tool` — the mirror step a bridge route reports under its transport;\n * - `run_code` — Code Mode's wrapper. A keyed entry REPLACES the Host's\n * generic code row, so the wrapper case is recognized with the\n * same strict parser Fusion uses for its own activity\n * (`mirrorStepInvocation`) and everything else renders as an\n * ordinary code card through {@link AgyCodeToolView}.\n * Every other registration the standalone plugin made is absent: Fusion keeps\n * its own `main` / `sidebar.panellist` entries and its own activity cards.\n *\n * Presentation matches the official DSH tool row and card:\n * - Collapsed state: clean, borderless 24px row with official tool SVG icon,\n * tool title, separator dot, and summary/preview.\n * - Mouse hover on small icon: smoothly transitions to the chevron down arrow.\n * - Expanded state: leading icon is the chevron down arrow.\n * - Expanded card: rounded 12px card with header (prompt/cwd/path + Copy button)\n * and scrollable content (max-height with custom scrollbars) for long outputs.\n */\nimport * as React from 'react';\nimport { mirrorStepInvocation } from '../../activity.js';\nimport { insertTextIntoChatComposer } from './decisions.js';\nimport { openLightbox, isImageFile, buildMediaUrl } from './images.js';\n\ntype ReactApi = {\n\tcreateElement: (type: unknown, props?: Record<string, unknown> | null, ...children: unknown[]) => unknown;\n\tuseState: <S>(initial: S) => [S, (next: S | ((prev: S) => S)) => void];\n};\n\n/**\n * The React surface these cards use. Upstream read it through the module\n * loader's `require` shim; the Fusion bundle imports React directly, so the\n * shim is the same object — the call sites stay verbatim.\n */\nfunction react(): ReactApi {\n\treturn React as unknown as ReactApi;\n}\n\nexport function makeToggle(setValue: (next: boolean | ((prev: boolean) => boolean)) => void): () => void {\n\treturn () => setValue((prev: boolean) => !prev);\n}\n\n/** Cache user-expanded tool cards across TanStack Virtualizer remount cycles */\nconst expandedToolBlockKeys = new Set<string>();\n\nexport function clearExpandedToolBlockKeysForTest(): void {\n\texpandedToolBlockKeys.clear();\n}\n\nexport function useToggle(initial: boolean = false, key?: string): [boolean, () => void] {\n\tconst R2 = react();\n\tconst init = key ? expandedToolBlockKeys.has(key) : initial;\n\tconst [value, setValue] = R2.useState<boolean>(init) as [boolean, (next: boolean | ((prev: boolean) => boolean)) => void];\n\tconst toggle = () => {\n\t\tsetValue((prev: boolean) => {\n\t\t\tconst next = !prev;\n\t\t\tif (key) {\n\t\t\t\tif (next) expandedToolBlockKeys.add(key);\n\t\t\t\telse expandedToolBlockKeys.delete(key);\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t};\n\treturn [value, toggle];\n}\n\nfunction hx(type: unknown, props?: Record<string, unknown> | null, ...children: unknown[]): unknown {\n\treturn react().createElement(type, props, ...children);\n}\n\n// ---- Official DSH SVGs (100% faithful to native DSH client-ui) ----------\n\nexport function IconChevronDownOutline14(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 14 14',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M11.8486 5.5L11.4238 5.92383L8.69727 8.65137C8.44157 8.90706 8.21562 9.13382 8.01172 9.29785C7.79912 9.46883 7.55595 9.61756 7.25 9.66602C7.08435 9.69222 6.91565 9.69222 6.75 9.66602C6.44405 9.61756 6.20088 9.46883 5.98828 9.29785C5.78438 9.13382 5.55843 8.90706 5.30273 8.65137L2.57617 5.92383L2.15137 5.5L3 4.65137L3.42383 5.07617L6.15137 7.80273C6.42595 8.07732 6.59876 8.24849 6.74023 8.3623C6.87291 8.46904 6.92272 8.47813 6.9375 8.48047C6.97895 8.48703 7.02105 8.48703 7.0625 8.48047C7.07728 8.47813 7.12709 8.46904 7.25977 8.3623C7.40124 8.24849 7.57405 8.07732 7.84863 7.80273L10.5762 5.07617L11 4.65137L11.8486 5.5Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconApiOutline14(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 14 14',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t},\n\t\thx('path', {\n\t\t\ttransform: 'translate(0.6689 1.073)',\n\t\t\td: 'M11.4818 5.57813C11.4818 4.45301 11.4807 3.66237 11.4075 3.05908C11.3359 2.46953 11.2024 2.13852 10.9939 1.89441C10.9247 1.81341 10.8493 1.73801 10.7683 1.66882C10.5242 1.46033 10.1932 1.32686 9.60364 1.25525C9.00034 1.18198 8.20974 1.18091 7.0846 1.18091L5.57813 1.18091C4.45301 1.18091 3.66238 1.18198 3.05908 1.25525C2.46953 1.32686 2.13852 1.46033 1.89441 1.66882C1.81341 1.73801 1.73801 1.81341 1.66882 1.89441C1.46033 2.13852 1.32686 2.46953 1.25525 3.05908C1.18198 3.66238 1.18091 4.45301 1.18091 5.57813L1.18091 6.2771C1.18091 7.40218 1.18197 8.19288 1.25525 8.79614C1.32687 9.38553 1.46036 9.71674 1.66882 9.96082C1.73797 10.0417 1.81347 10.1173 1.89441 10.1864C2.13851 10.3948 2.46965 10.5275 3.05908 10.5991C3.66238 10.6724 4.45298 10.6735 5.57813 10.6735L7.0846 10.6735C8.20977 10.6735 9.00033 10.6724 9.60364 10.5991C10.1931 10.5275 10.5242 10.3948 10.7683 10.1864C10.8493 10.1173 10.9247 10.0417 10.9939 9.96082C11.2024 9.71674 11.3358 9.38553 11.4075 8.79614C11.4808 8.19288 11.4818 7.40218 11.4818 6.2771L11.4818 5.57813ZM12.6627 6.2771C12.6627 7.37222 12.6637 8.247 12.5798 8.93799C12.4942 9.64284 12.3133 10.2359 11.8928 10.7282C11.7834 10.8562 11.6637 10.9751 11.5356 11.0845C11.0434 11.5049 10.4511 11.6867 9.74634 11.7723C9.05525 11.8563 8.17999 11.8552 7.0846 11.8552L5.57813 11.8552C4.48273 11.8552 3.60747 11.8563 2.91638 11.7723C2.21157 11.6867 1.61933 11.5049 1.12708 11.0845C0.99901 10.9751 0.879281 10.8562 0.769898 10.7282C0.349454 10.2359 0.168506 9.64284 0.0828864 8.93799C-0.00101964 8.247 4.88512e-07 7.37222 6.47206e-07 6.2771L6.47206e-07 5.57813C6.47206e-07 4.48273 -0.00106163 3.60747 0.0828864 2.91638C0.168502 2.21168 0.349594 1.61928 0.769898 1.12708C0.879302 0.998981 0.998981 0.879302 1.12708 0.769898C1.61928 0.349594 2.21168 0.168502 2.91638 0.0828864C3.60747 -0.00106163 4.48273 6.47206e-07 5.57813 6.47206e-07L7.0846 6.47206e-07C8.17999 6.47206e-07 9.05525 -0.00106163 9.74634 0.0828864C10.451 0.168505 11.0434 0.349587 11.5356 0.769898C11.6637 0.879302 11.7834 0.998981 11.8928 1.12708C12.3131 1.61928 12.4942 2.21169 12.5798 2.91638C12.6638 3.60747 12.6627 4.48273 12.6627 5.57813L12.6627 6.2771Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t\thx('path', {\n\t\t\ttransform: 'translate(0.6689 1.073)',\n\t\t\td: 'M6.02607 5.50955L6.44306 5.9274L3.84284 8.52762L3.425 8.11063L3.00715 7.69278L4.77253 5.9274L3.00715 4.16202L3.84284 3.32633L6.02607 5.50955Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t\thx('path', {\n\t\t\ttransform: 'translate(0.6689 1.073)',\n\t\t\td: 'M9.23789 7.35397L9.23789 8.53488L6.96238 8.53488L6.96238 7.35397L9.23789 7.35397Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t);\n}\n\nexport function IconEditOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M9.94076 1.34942C10.7047 0.90231 11.6503 0.902415 12.4143 1.34942C12.7061 1.52015 12.9688 1.79118 13.3104 2.13284C13.6521 2.47448 13.9231 2.73721 14.0939 3.02894C14.5408 3.79294 14.5409 4.73856 14.0939 5.50251C13.9231 5.79415 13.652 6.05704 13.3104 6.39861L6.65932 13.0497C6.28068 13.4284 6.00695 13.7108 5.66543 13.9097C5.32391 14.1085 4.94315 14.2074 4.42705 14.3498L3.24394 14.6761C2.77527 14.8054 2.34538 14.9262 2.00131 14.9684C1.65196 15.0112 1.17964 15.0013 0.810764 14.6325C0.441921 14.2637 0.432107 13.7913 0.47486 13.442C0.517035 13.0979 0.6379 12.668 0.767181 12.1993L1.09352 11.0162C1.23588 10.5001 1.33481 10.1193 1.5336 9.77784C1.7325 9.43632 2.0149 9.1626 2.39355 8.78395L9.04466 2.13284C9.38625 1.79126 9.64911 1.52016 9.94076 1.34942ZM15.5427 14.8398H7.55223L8.96707 13.425H15.5427V14.8398ZM3.39382 9.78422C2.965 10.213 2.84244 10.3436 2.75709 10.49C2.67183 10.6366 2.61862 10.8079 2.45733 11.3925L2.13099 12.5756C2.00183 13.0439 1.92194 13.3419 1.88863 13.5536C2.10041 13.5204 2.39872 13.4416 2.86764 13.3123L4.05075 12.9859C4.63544 12.8246 4.80669 12.7715 4.95323 12.6862C5.09968 12.6008 5.23022 12.4783 5.65905 12.0494L10.721 6.98644L8.45577 4.72121L3.39382 9.78422ZM11.7 2.57079C11.3774 2.38198 10.9777 2.38198 10.6551 2.57079C10.5602 2.62647 10.4487 2.72931 10.0449 3.13311L9.45604 3.72094L11.7213 5.98617L12.3102 5.39833C12.7139 4.99457 12.8168 4.88307 12.8725 4.78818C13.0613 4.46561 13.0612 4.06585 12.8725 3.74326C12.8169 3.64827 12.7146 3.53752 12.3102 3.13311C11.9057 2.72863 11.795 2.6264 11.7 2.57079Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconBrowseOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t},\n\t\thx('path', { d: 'M11.2426 4.80473V6.10551H4.75819V4.80473H11.2426Z', fill: 'currentColor' }),\n\t\thx('path', { d: 'M9.40858 7.84478V9.14557H4.75819V7.84478H9.40858Z', fill: 'currentColor' }),\n\t\thx('path', {\n\t\t\td: 'M9.23438 0.546389C10.1941 0.546389 10.9683 0.544914 11.5859 0.611819C12.2161 0.680096 12.7634 0.825745 13.2393 1.17139C13.5172 1.3733 13.7619 1.61812 13.9639 1.896C14.3096 2.37183 14.4551 2.91922 14.5234 3.54932C14.5903 4.16686 14.5889 4.94133 14.5889 5.90088V10.0981C14.5889 11.0576 14.5903 11.8321 14.5234 12.4497C14.4552 13.0798 14.3094 13.6272 13.9639 14.103C13.7619 14.381 13.5172 14.6257 13.2393 14.8276C12.7633 15.1734 12.2163 15.3189 11.5859 15.3872C10.9683 15.4541 10.1942 15.4536 9.23438 15.4536H6.76563C5.80591 15.4536 5.03168 15.4541 4.41407 15.3872C3.78385 15.3189 3.23665 15.1734 2.76074 14.8276C2.48291 14.6257 2.23802 14.3809 2.03614 14.103C1.69066 13.6272 1.54483 13.0798 1.47657 12.4497C1.40973 11.8321 1.41114 11.0576 1.41114 10.0981V5.90088C1.41113 4.94132 1.40966 4.16686 1.47657 3.54932C1.54488 2.91921 1.69042 2.37184 2.03614 1.896C2.2381 1.61807 2.4828 1.37333 2.76074 1.17139C3.23665 0.825682 3.78386 0.680109 4.41407 0.611819C5.03168 0.544905 5.80591 0.546389 6.76563 0.546389H9.23438ZM6.76563 1.896C5.77586 1.896 5.0876 1.89738 4.55957 1.95459C4.0443 2.01043 3.76214 2.11349 3.55469 2.26416C3.39135 2.38284 3.24761 2.52662 3.12891 2.68994C2.97821 2.89736 2.8752 3.17967 2.81934 3.69483C2.76214 4.22279 2.76075 4.91131 2.76074 5.90088V10.0981C2.76074 11.0876 2.76221 11.7762 2.81934 12.3042C2.87516 12.8194 2.97829 13.1026 3.12891 13.3101C3.24754 13.4733 3.39147 13.6172 3.55469 13.7358C3.76213 13.8865 4.04438 13.9896 4.55957 14.0454C5.0876 14.1026 5.77586 14.103 6.76563 14.103H9.23438C10.2242 14.103 10.9124 14.1026 11.4404 14.0454C11.9556 13.9896 12.2379 13.8865 12.4453 13.7358C12.6086 13.6172 12.7525 13.4733 12.8711 13.3101C13.0217 13.1026 13.1248 12.8195 13.1807 12.3042C13.2378 11.7762 13.2393 11.0876 13.2393 10.0981V5.90088C13.2393 4.91131 13.2379 4.22279 13.1807 3.69483C13.1248 3.17969 13.0218 2.89736 12.8711 2.68994C12.7524 2.52667 12.6086 2.38281 12.4453 2.26416C12.2379 2.11355 11.9556 2.01041 11.4404 1.95459C10.9124 1.8974 10.2241 1.896 9.23438 1.896H6.76563Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t);\n}\n\nexport function IconSearchOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t},\n\t\thx('path', {\n\t\t\td: 'M11.894845 6.647401C11.894845 3.725463 9.534486 1.356779 6.623219 1.35657C3.711786 1.35657 1.351635 3.725338 1.351635 6.647401C1.351843 9.569296 3.711911 11.938273 6.623219 11.938273C9.534361 11.938064 11.894637 9.569171 11.894845 6.647401ZM13.245462 6.647401C13.245254 10.317935 10.280401 13.293613 6.623219 13.293821C2.965871 13.293821 0.000204 10.31806 0 6.647401C0 2.976574 2.965746 0 6.623219 0C10.280526 0.000205 13.245462 2.9767 13.245462 6.647401Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t\thx('path', {\n\t\t\td: 'M16.000417 15.041079L15.044449 16.000433L11.530434 12.473588L12.486298 11.514234L16.000417 15.041079Z',\n\t\t\tfill: 'currentColor',\n\t\t}),\n\t);\n}\n\nexport function IconCodeOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\tfillRule: 'evenodd',\n\t\tclipRule: 'evenodd',\n\t\td: 'M12.3368 1.53569L11.931 4.43172H14.8086V5.79673H11.7404L11.1962 9.67859H14.2839V11.0436H11.0056L10.4994 14.6529L9.14873 14.4643L9.62731 11.0436H5.75876L5.25252 14.6529L3.90186 14.4643L4.38043 11.0436H1.69141V9.67859H4.57104L5.11417 5.79673H2.21609V4.43172H5.30581L5.73724 1.34713L7.08995 1.53569L6.68414 4.43172H10.5527L10.9841 1.34713L12.3368 1.53569ZM5.94937 9.67859H9.81791L10.361 5.79673H6.49353L5.94937 9.67859Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconInspectOutline12(size = 12, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'inline-block', verticalAlign: '-1.5px', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M16 8L10.8571 12V10.552L14.1383 8L10.8571 5.448V4L16 8ZM5.14286 10.552L1.86171 8L5.14286 5.448V4L0 8L5.14286 12V10.552ZM9.02514 4L5.59657 12H6.84057L10.2691 4H9.02514Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconCopyOutline16(size = 12, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'inline-block', verticalAlign: '-1.5px', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M6.14929 4.02032C7.11197 4.02032 7.87983 4.02016 8.49597 4.07598C9.12128 4.13269 9.65792 4.25188 10.1415 4.53106C10.7202 4.8653 11.2008 5.3459 11.535 5.92462C11.8142 6.40818 11.9334 6.94481 11.9901 7.57012C12.0459 8.18625 12.0458 8.95419 12.0458 9.9168C12.0458 10.8795 12.0459 11.6473 11.9901 12.2635C11.9334 12.8888 11.8142 13.4254 11.535 13.909C11.2008 14.4877 10.7202 14.9683 10.1415 15.3025C9.65792 15.5817 9.12128 15.7009 8.49597 15.7576C7.87984 15.8134 7.11196 15.8133 6.14929 15.8133C5.18667 15.8133 4.41874 15.8134 3.80261 15.7576C3.1773 15.7009 2.64067 15.5817 2.1571 15.3025C1.5784 14.9683 1.09778 14.4877 0.76355 13.909',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconCheckOutline14(size = 12, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 14 14',\n\t\tfill: 'none',\n\t\tstyle: { display: 'inline-block', verticalAlign: '-1.5px', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M11.5635 4.58984L7.61426 9.07715C7.35154 9.37561 7.11346 9.64812 6.89453 9.84668C6.66593 10.054 6.38519 10.2506 6.01465 10.3164C5.82079 10.3508 5.62207 10.3529 5.42773 10.3213C5.0561 10.2609 4.77266 10.0674 4.54102 9.86328C4.31926 9.66791 4.07752 9.39911 3.81055 9.10449L2.44531 7.59863L3.55664 6.59082L4.92188 8.09766C5.21256 8.41844 5.38878 8.61191 5.53223 8.73828C5.61022 8.80699 5.65253 8.83192 5.66895 8.83984C5.69648 8.84429 5.72449 8.84467 5.75195 8.83984C5.72657 8.84451 5.75564 8.85422 5.88672 8.73535C6.02833 8.60692 6.20225 8.41088 6.48828 8.08594L10.4385 3.59961L11.5635 4.58984Z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconQuestionOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M8 1C4.134 1 1 3.91 1 7.5c0 1.547.575 2.973 1.559 4.093L1.13 14.54a.5.5 0 00.627.63l3.238-1.079C5.875 14.316 6.91 14.5 8 14.5c3.866 0 7-2.91 7-6.5S11.866 1 8 1zm0 10.5a.75.75 0 110-1.5.75.75 0 010 1.5zm1.09-3.41c-.42.34-.59.54-.59.91H7.5v-.5c0-.66.36-1.12.82-1.48.44-.35.68-.61.68-1.02 0-.55-.45-1-1-1s-1 .45-1 1H6c0-1.1.9-2 2-2s2 .9 2 2c0 .73-.39 1.25-.91 1.67z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nexport function IconImageOutline16(size = 14, className = ''): unknown {\n\treturn hx('svg', {\n\t\twidth: size,\n\t\theight: size,\n\t\tclassName: className || undefined,\n\t\tviewBox: '0 0 16 16',\n\t\tfill: 'none',\n\t\tstyle: { display: 'block', flexShrink: 0 },\n\t\t'aria-hidden': true,\n\t}, hx('path', {\n\t\td: 'M14 3H2a1 1 0 00-1 1v8a1 1 0 001 1h12a1 1 0 001-1V4a1 1 0 00-1-1zm-1 8H3l2.5-3.2 1.8 2.3 2.7-3.5L13 11zM5.5 6a1.5 1.5 0 110-3 1.5 1.5 0 010 3z',\n\t\tfill: 'currentColor',\n\t}));\n}\n\nfunction toolIconFor(kind: CardKind, size = 14): unknown {\n\tswitch (kind) {\n\t\tcase 'terminal':\n\t\t\treturn IconApiOutline14(size);\n\t\tcase 'diff':\n\t\tcase 'delete':\n\t\t\treturn IconEditOutline16(size);\n\t\tcase 'read':\n\t\t\treturn IconBrowseOutline16(size);\n\t\tcase 'search':\n\t\tcase 'list':\n\t\t\treturn IconSearchOutline16(size);\n\t\tcase 'question':\n\t\t\treturn IconQuestionOutline16(size);\n\t\tcase 'image':\n\t\t\treturn IconImageOutline16(size);\n\t\tdefault:\n\t\t\treturn IconCodeOutline16(size);\n\t}\n}\n\n// ---- Structural types -----------------------------------------------------\n\ntype ToolResultBlock = {\n\tcall: { name: string; argsRaw: string } | null;\n\tcontent: readonly { type?: string; text?: string }[];\n\tisError: boolean;\n\terror?: { name?: string; code?: string };\n\tparentCallId?: string;\n\tsubCalls?: readonly unknown[];\n};\n\ntype RunningCallBlock = {\n\tname: string;\n\targsRaw: string;\n\tparentCallId?: string;\n\tsubCalls?: readonly unknown[];\n\tcall?: { name: string; argsRaw: string };\n};\n\nexport type ToolBlock = (ToolResultBlock | RunningCallBlock) & { kind?: string };\n\nexport interface AgyToolViewProps {\n\tcallId: string;\n\ttoolName: string;\n\tblock: ToolBlock;\n\tcwd?: string;\n\thome?: string;\n\topenFile?: (path: string, opts?: unknown) => void;\n\tinspect?: () => void;\n\tloadImage?: unknown;\n\t/** Standard locale seat, supplied when the registration declares a namespace. */\n\tt?: (key: string, params?: Record<string, unknown>) => string;\n}\n\n// ---- argument parsing -----------------------------------------------------\n\nfunction parsedArgsRaw(block: ToolBlock): string {\n\tconst settled = block as ToolResultBlock;\n\tif ('call' in settled && settled.call !== null && typeof settled.call.argsRaw === 'string') {\n\t\treturn settled.call.argsRaw;\n\t}\n\tconst running = block as RunningCallBlock;\n\tif (typeof running.argsRaw === 'string') return running.argsRaw;\n\treturn '';\n}\n\nfunction parseArgs(block: ToolBlock): Record<string, unknown> | null {\n\tconst raw = parsedArgsRaw(block);\n\tif (raw === '') return null;\n\ttry {\n\t\tconst v = JSON.parse(raw) as unknown;\n\t\treturn typeof v === 'object' && v !== null && !Array.isArray(v) ? (v as Record<string, unknown>) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction cleanString(val: unknown): string {\n\tif (typeof val !== 'string') return '';\n\tlet s = val.trim();\n\tif ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n\t\ts = s.slice(1, -1).trim();\n\t}\n\treturn s;\n}\n\nfunction parseInnerArgs(raw: unknown): Record<string, unknown> {\n\tif (raw === undefined || raw === null) return {};\n\tif (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>;\n\tif (typeof raw === 'string') {\n\t\tlet s = raw.trim();\n\t\tif ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n\t\t\ttry {\n\t\t\t\tconst unquoted = JSON.parse(s) as unknown;\n\t\t\t\tif (typeof unquoted === 'string') s = unquoted.trim();\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(s) as unknown;\n\t\t\tif (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n\t\t\t\treturn parsed as Record<string, unknown>;\n\t\t\t}\n\t\t\treturn { value: parsed };\n\t\t} catch {\n\t\t\treturn { value: raw };\n\t\t}\n\t}\n\treturn { value: raw };\n}\n\nfunction cleanResultText(text: string): string {\n\tconst trimmed = text.trim();\n\tif (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n\t\ttry {\n\t\t\tconst obj = JSON.parse(trimmed) as { content?: unknown };\n\t\t\tif (Array.isArray(obj?.content)) {\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tfor (const item of obj.content) {\n\t\t\t\t\tconst blk = item as { type?: string; text?: unknown };\n\t\t\t\t\tif (blk?.type === 'text' && typeof blk.text === 'string') {\n\t\t\t\t\t\tparts.push(blk.text);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (parts.length > 0) return parts.join('\\n');\n\t\t\t}\n\t\t} catch {\n\t\t\t// not JSON\n\t\t}\n\t}\n\treturn text;\n}\n\nfunction mirrorInfo(block: ToolBlock): { tool: string; input: Record<string, unknown>; server?: string } | null {\n\tconst a = parseArgs(block);\n\tif (a === null) return null;\n\tlet tool = typeof a.tool === 'string' ? a.tool : '';\n\tif (tool === '') return null;\n\tlet input: Record<string, unknown> = {};\n\tconst raw = a.input;\n\tif (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) input = raw as Record<string, unknown>;\n\telse if (typeof raw === 'string') {\n\t\ttry {\n\t\t\tconst p = JSON.parse(raw) as unknown;\n\t\t\tif (typeof p === 'object' && p !== null && !Array.isArray(p)) input = p as Record<string, unknown>;\n\t\t\telse input = { value: raw };\n\t\t} catch {\n\t\t\tinput = { value: raw };\n\t\t}\n\t}\n\tlet server = typeof a.server === 'string' && a.server !== '' ? cleanString(a.server) : undefined;\n\n\t// Unwrap MCP meta-tools: call_mcp_tool, callMcpTool, call_mcp, mcp_call\n\tif (/^(call_mcp_tool|callMcpTool|call_mcp|mcp_call)$/i.test(tool)) {\n\t\tconst s = pick(input, 'ServerName', 'server_name', 'serverName', 'server');\n\t\tif (s) server = cleanString(s);\n\t\tconst innerTool = pick(input, 'ToolName', 'tool_name', 'toolName', 'name', 'tool');\n\t\tconst rawInner = input.Arguments ?? input.arguments ?? input.args ?? input.parameters ?? input.params ?? input.input;\n\t\tif (innerTool) {\n\t\t\ttool = cleanString(innerTool);\n\t\t\tinput = parseInnerArgs(rawInner);\n\t\t}\n\t} else if (tool.startsWith('mcp__')) {\n\t\tconst parts = tool.slice(5).split('__');\n\t\tif (parts.length >= 2) {\n\t\t\tserver = parts[0];\n\t\t\ttool = parts.slice(1).join('__');\n\t\t}\n\t}\n\n\treturn { tool, input, ...(server ? { server } : {}) };\n}\n\nfunction pick(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const k of keys) {\n\t\tconst v = input[k];\n\t\tif (typeof v === 'string' && v !== '') return v;\n\t}\n\treturn undefined;\n}\n\nfunction num(input: Record<string, unknown>, ...keys: string[]): number | undefined {\n\tfor (const k of keys) {\n\t\tconst v = input[k];\n\t\tif (typeof v === 'number' && Number.isFinite(v)) return v;\n\t}\n\treturn undefined;\n}\n\nfunction resultText(block: ToolBlock): string {\n\tconst settled = block as ToolResultBlock;\n\tif (!Array.isArray(settled.content)) return '';\n\tconst parts: string[] = [];\n\tfor (const b of settled.content) {\n\t\tif (b && typeof b === 'object' && (b as { type?: string }).type === 'text' && typeof (b as { text?: unknown }).text === 'string') {\n\t\t\tparts.push((b as { text: string }).text);\n\t\t}\n\t}\n\tconst text = parts.join('\\n');\n\treturn cleanResultText(text);\n}\n\nfunction isSettled(block: ToolBlock): boolean {\n\treturn block.kind === 'tool-result' || 'content' in block;\n}\n\nfunction isError(block: ToolBlock): boolean {\n\tconst settled = block as ToolResultBlock;\n\treturn settled.isError === true || (settled.error !== undefined && settled.error !== null);\n}\n\n// ---- Card classification --------------------------------------------------\n\nconst TERMINAL_TOOLS = new Set(['run_command', 'bash', 'execute_command', 'ops_bash', 'sh', 'shell']);\nconst DIFF_TOOLS = new Set(['replace_file_content', 'edit_file', 'replace_in_file', 'edit', 'write_to_file', 'write_file', 'create_file']);\nconst READ_TOOLS = new Set(['read_file', 'view_file', 'read', 'open_file']);\nconst SEARCH_TOOLS = new Set(['find_by_name', 'glob', 'ops_glob', 'search_files', 'grep_search', 'search', 'ops_grep', 'search_file_content', 'grep', 'search_web', 'web_search']);\nconst LIST_TOOLS = new Set(['list_dir', 'ls']);\nconst DELETE_TOOLS = new Set(['delete_file', 'remove_file', 'rm']);\nconst QUESTION_TOOLS = new Set(['ask_question', 'ask', 'question']);\nconst IMAGE_TOOLS = new Set(['generate_image', 'create_image', 'render_image']);\n\nexport type CardKind = 'terminal' | 'diff' | 'read' | 'search' | 'list' | 'delete' | 'question' | 'image' | 'generic';\n\nexport interface MirrorCardModel {\n\tkind: CardKind;\n\ttool?: string;\n\tserver?: string;\n\ttitle: string;\n\tcommand?: string;\n\tcwd?: string;\n\toutput?: string;\n\tpath?: string;\n\toldText?: string | null;\n\tnewText?: string;\n\tlocation?: { path: string; line?: number };\n\traw?: string;\n\tquestions?: Array<{ question?: string; options?: string[]; is_multi_select?: boolean }>;\n\tprompt?: string;\n\timageName?: string;\n\taspectRatio?: string;\n\tisImage?: boolean;\n\timagePath?: string;\n}\n\nexport function mirrorCardModel(block: ToolBlock, cwd?: string, home?: string): MirrorCardModel {\n\tconst info = mirrorInfo(block);\n\tconst out = resultText(block);\n\tif (info === null) {\n\t\treturn { kind: 'generic', title: 'agy_tool', output: out, raw: parsedArgsRaw(block) };\n\t}\n\tconst { tool, input } = info;\n\tconst desc = pick(input, 'Description', 'description', 'toolAction', 'toolSummary', 'Instruction', 'instruction');\n\n\tif (QUESTION_TOOLS.has(tool)) {\n\t\tconst questionsRaw = (input as Record<string, unknown>).questions ?? (input as Record<string, unknown>).Questions;\n\t\tconst questions = Array.isArray(questionsRaw) ? (questionsRaw as Array<{ question?: string; options?: string[]; is_multi_select?: boolean }>) : [];\n\t\tconst firstQ = questions[0];\n\t\tconst qTitle = firstQ?.question ?? desc ?? 'Ask Question';\n\t\treturn {\n\t\t\tkind: 'question',\n\t\t\ttool,\n\t\t\tserver: info.server,\n\t\t\ttitle: qTitle,\n\t\t\toutput: out,\n\t\t\tquestions,\n\t\t\traw: parsedArgsRaw(block),\n\t\t};\n\t}\n\tif (IMAGE_TOOLS.has(tool)) {\n\t\tconst prompt = pick(input, 'Prompt', 'prompt') ?? '';\n\t\tconst name = pick(input, 'ImageName', 'image_name', 'name') ?? 'image';\n\t\tconst ratio = pick(input, 'AspectRatio', 'aspect_ratio') ?? '1:1';\n\t\treturn {\n\t\t\tkind: 'image',\n\t\t\ttool,\n\t\t\tserver: info.server,\n\t\t\ttitle: desc ?? `Generate Image · ${name}`,\n\t\t\tprompt,\n\t\t\timageName: name,\n\t\t\taspectRatio: ratio,\n\t\t\toutput: out,\n\t\t\traw: parsedArgsRaw(block),\n\t\t};\n\t}\n\tif (TERMINAL_TOOLS.has(tool)) {\n\t\tconst command = pick(input, 'CommandLine', 'command_line', 'command', 'cmd', 'Cmd')\n\t\t\t?? (desc && desc.startsWith('$ ') ? desc.replace(/\\s*·\\s*.*$/, '').replace(/^\\$\\s*/, '') : undefined)\n\t\t\t?? JSON.stringify(input);\n\t\tconst cwdVal = pick(input, 'Cwd', 'cwd', 'WorkingDirectory', 'working_directory', 'workdir', 'WorkDir') ?? cwd;\n\t\tconst rowTitle = desc !== undefined && !desc.startsWith('$ ') && desc !== command ? desc + ' · ' + command : command;\n\t\treturn {\n\t\t\tkind: 'terminal',\n\t\t\ttool,\n\t\t\tserver: info.server,\n\t\t\ttitle: rowTitle,\n\t\t\tcommand,\n\t\t\t...(cwdVal !== undefined ? { cwd: cwdVal } : {}),\n\t\t\toutput: out,\n\t\t};\n\t}\n\tif (DIFF_TOOLS.has(tool)) {\n\t\tconst rawPath = pick(input, 'TargetFile', 'target_file', 'path', 'file_path', 'Path', 'FilePath', 'AbsolutePath', 'targetFile', 'filename', 'FileName') ?? 'file';\n\t\tconst path = relativize(rawPath, cwd, home);\n\t\tconst oldText = pick(input, 'TargetContent', 'target_content', 'old_string', 'oldText', 'OldString', 'OldText', 'targetContent') ?? null;\n\t\tconst newText = pick(input, 'ReplacementContent', 'replacement_content', 'new_string', 'newText', 'content', 'NewString', 'NewText', 'Content', 'replacementContent', 'CodeContent', 'code_content', 'contents', 'FileContents', 'codeContent') ?? '';\n\t\tconst action = (tool === 'write_to_file' || tool === 'write_file' || tool === 'create_file') ? 'Write' : 'Edit';\n\t\tconst isGenericDesc = desc !== undefined && /^(file edit|editing file|write file|writing file|file write|edit file|editing|writing|file create|creating file)$/i.test(desc.trim());\n\t\tconst title = desc !== undefined && !isGenericDesc && !desc.includes(path)\n\t\t\t? `${action} ${path} · ${desc}`\n\t\t\t: `${action} ${path}`;\n\t\treturn { kind: 'diff', tool, server: info.server, title, path: rawPath, oldText, newText, output: out };\n\t}\n\tif (READ_TOOLS.has(tool)) {\n\t\tconst path = pick(input, 'AbsolutePath', 'absolute_path', 'TargetFile', 'target_file', 'path', 'file_path', 'filename', 'Path', 'FilePath', 'FileName', 'targetFile') ?? '';\n\t\tconst offset = num(input, 'offset', 'Offset') ?? num(input, 'StartLine', 'start_line');\n\t\tconst line = offset !== undefined ? (offset > 0 && (tool === 'view_file' || tool === 'read_file') ? offset : offset + 1) : undefined;\n\t\tconst isImg = isImageFile(path);\n\t\treturn {\n\t\t\tkind: isImg ? 'image' : 'read',\n\t\t\ttool,\n\t\t\tserver: info.server,\n\t\t\ttitle: desc ? `${desc} · ${path}` : path !== '' ? 'Read ' + path : 'Read',\n\t\t\tpath,\n\t\t\toutput: out,\n\t\t\tisImage: isImg,\n\t\t\timagePath: isImg ? path : undefined,\n\t\t\tprompt: desc,\n\t\t\timageName: path.split(/[/\\\\]/).pop() || 'image',\n\t\t\t...(path !== '' ? { location: { path, ...(line !== undefined ? { line } : {}) } } : {}),\n\t\t};\n\t}\n\tif (SEARCH_TOOLS.has(tool)) {\n\t\tconst rawPat = input.query ?? input.Query ?? input.pattern ?? input.Pattern ?? input.regex ?? input.Regex ?? input.QueryString;\n\t\tconst q = Array.isArray(rawPat) ? rawPat.join(', ') : (typeof rawPat === 'string' ? rawPat : (pick(input, 'query', 'Query', 'pattern', 'Pattern', 'regex', 'Regex', 'QueryString') ?? ''));\n\t\treturn { kind: 'search', tool, server: info.server, title: desc ?? (q !== '' ? 'Search ' + q : 'Search'), output: out };\n\t}\n\tif (LIST_TOOLS.has(tool)) {\n\t\tconst path = pick(input, 'DirectoryPath', 'directory_path', 'path', 'directory', 'Path', 'Directory', 'SearchDirectory', 'search_directory', 'AbsolutePath') ?? '';\n\t\treturn { kind: 'list', tool, server: info.server, title: desc ?? (path !== '' ? 'List ' + path : 'List directory'), output: out };\n\t}\n\tif (DELETE_TOOLS.has(tool)) {\n\t\tconst path = pick(input, 'TargetFile', 'target_file', 'path', 'file_path', 'Path', 'FilePath', 'AbsolutePath') ?? '';\n\t\treturn { kind: 'delete', tool, server: info.server, title: desc ?? 'Delete ' + path, output: out };\n\t}\n\tconst defaultTitle = info.server ? `${info.server}: ${tool}` : (tool !== '' ? tool : 'agy_tool');\n\tconst title = desc ?? defaultTitle;\n\treturn { kind: 'generic', tool, server: info.server, title, output: out, raw: parsedArgsRaw(block) };\n}\n\n// ---- Helpers --------------------------------------------------------------\n\nfunction relativize(p: string, cwd?: string, home?: string): string {\n\tif (cwd && p.startsWith(cwd)) {\n\t\tconst rel = p.slice(cwd.length).replace(/^[/\\\\]+/, '');\n\t\treturn rel !== '' ? rel : p;\n\t}\n\tif (home && p.startsWith(home)) return '~' + p.slice(home.length);\n\treturn p;\n}\n\nfunction clip(s: string, max: number): string {\n\treturn s.length > max ? s.slice(0, max) + '\\n… (+' + (s.length - max) + ' chars)' : s;\n}\n\nexport function trimTrailingBlankLines(s: string): string {\n\treturn s.replace(/[\\t ]*\\r?\\n[\\t ]*(\\r?\\n[\\t ]*)*$/, '\\n');\n}\n\nexport function previewLine(model: MirrorCardModel, cwd?: string, home?: string): string | undefined {\n\tif (model.kind === 'diff') {\n\t\tconst raw = model.path ?? 'file';\n\t\tconst rel = relativize(raw, cwd, home);\n\t\tconst display = rel.length > 40 ? '…' + rel.slice(-40) : rel;\n\t\treturn model.oldText != null ? `± ${display}` : `+ ${display}`;\n\t}\n\tconst out = model.output;\n\tif (out !== undefined && out !== '') {\n\t\tconst first = out.split('\\n').find((l) => l.trim() !== '');\n\t\tif (first !== undefined && first.trim() !== '') return first.trim().slice(0, 80);\n\t}\n\treturn undefined;\n}\n\nfunction cls(...names: Array<string | false | null | undefined>): string {\n\treturn names.filter((n): n is string => typeof n === 'string' && n !== '').join(' ');\n}\n\ntype Translate = (key: string, params?: Record<string, unknown>) => string;\n\n/**\n * Locale lookup with an English fallback: the mirror card renders through\n * host-provided `t` when the registration declares the namespace, but tests\n * and hosts without the seat call it bare. The old literals were mixed\n * 中文 and English as BOTH fallback and primary, so non-Chinese users saw\n * Chinese buttons on mirror cards.\n */\nfunction tr(t: Translate | undefined, key: string, fallback: string, params?: Record<string, unknown>): string {\n\tif (typeof t === 'function') {\n\t\ttry {\n\t\t\tconst v = t(key, params);\n\t\t\tif (typeof v === 'string' && v !== '' && v !== key) return v;\n\t\t} catch {\n\t\t\t// unbound namespace — fall through\n\t\t}\n\t}\n\tif (params !== undefined && params.count !== undefined && fallback.includes('{count}')) {\n\t\treturn fallback.replace('{count}', String(params.count));\n\t}\n\treturn fallback;\n}\n\nfunction displayTitle(model: MirrorCardModel, t?: Translate): string {\n\tswitch (model.kind) {\n\t\tcase 'terminal':\n\t\t\treturn tr(t, 'tv.command', 'Command');\n\t\tcase 'diff':\n\t\t\treturn (model.tool === 'write_to_file' || model.tool === 'write_file' || model.tool === 'create_file') ? tr(t, 'tv.write', 'Write') : tr(t, 'tv.edit', 'Edit');\n\t\tcase 'read':\n\t\t\treturn tr(t, 'tv.read', 'Read');\n\t\tcase 'search':\n\t\t\treturn (model.tool === 'search_web' || model.tool === 'web_search') ? tr(t, 'tv.webSearch', 'Web Search') : tr(t, 'tv.search', 'Search');\n\t\tcase 'list':\n\t\t\treturn tr(t, 'tv.list', 'List');\n\t\tcase 'delete':\n\t\t\treturn tr(t, 'tv.delete', 'Delete');\n\t\tcase 'question':\n\t\t\treturn tr(t, 'tv.question', 'Question');\n\t\tcase 'image':\n\t\t\treturn tr(t, 'tv.image', 'Image');\n\t\tdefault:\n\t\t\tif (model.tool && model.tool !== 'agy_tool') {\n\t\t\t\treturn model.server ? `${model.server}: ${model.tool}` : model.tool.replace(/_/g, ' ');\n\t\t\t}\n\t\t\treturn tr(t, 'tv.tool', 'Tool');\n\t}\n}\n\nfunction displaySummary(model: MirrorCardModel, cwd?: string, home?: string): string {\n\tif (model.kind === 'terminal') {\n\t\treturn model.command ?? model.title;\n\t}\n\tif (model.kind === 'diff') {\n\t\tconst rawPath = model.path ?? 'file';\n\t\treturn relativize(rawPath, cwd, home);\n\t}\n\tif (model.kind === 'read') {\n\t\tconst rawPath = model.path ?? '';\n\t\treturn rawPath !== '' ? relativize(rawPath, cwd, home) : model.title;\n\t}\n\tif (model.kind === 'search') {\n\t\treturn model.title.replace(/^(Web search|Search)\\s*/i, '') || model.title;\n\t}\n\tif (model.kind === 'list') {\n\t\treturn model.title.replace(/^List\\s*(directory\\s*)?/i, '') || model.title;\n\t}\n\tif (model.kind === 'question') {\n\t\treturn model.title;\n\t}\n\tif (model.kind === 'image') {\n\t\treturn model.prompt || model.title;\n\t}\n\tif (model.server && model.title.startsWith(`${model.server}: `)) {\n\t\treturn model.title.slice(model.server.length + 2);\n\t}\n\treturn model.title;\n}\n\nfunction diffStat(model: MirrorCardModel): string | null {\n\tif (model.kind !== 'diff') return null;\n\tconst oldText = model.oldText ?? '';\n\tconst newText = model.newText ?? '';\n\tconst oldLines = oldText === '' ? 0 : oldText.split('\\n').length;\n\tconst newLines = newText === '' ? 0 : newText.split('\\n').length;\n\tif (oldLines === 0 && newLines === 0) return null;\n\tif (oldLines === 0) return `+${newLines}`;\n\treturn `+${newLines} -${oldLines}`;\n}\n\n// ---- Copy button component ------------------------------------------------\n\nfunction CopyButton({ text, labels, t }: { text: string; labels?: readonly [string, string]; t?: Translate }): unknown {\n\tconst [copied, setCopied] = react().useState(false);\n\tconst copyLabel = labels?.[0] ?? tr(t, 'code.copy', 'Copy');\n\tconst copiedLabel = labels?.[1] ?? tr(t, 'code.copied', 'Copied');\n\tconst onCopy = (e: { stopPropagation: () => void }) => {\n\t\te.stopPropagation();\n\t\tif (typeof navigator !== 'undefined' && navigator.clipboard) {\n\t\t\tnavigator.clipboard.writeText(text).then(() => {\n\t\t\t\tsetCopied(true);\n\t\t\t\tsetTimeout(() => setCopied(false), 1500);\n\t\t\t}).catch(() => {\n\t\t\t\t// Clipboard unavailable (insecure context): show the failure on\n\t\t\t\t// the button instead of silently doing nothing.\n\t\t\t\tsetCopied(false);\n\t\t\t});\n\t\t}\n\t};\n\treturn hx('button', {\n\t\ttype: 'button',\n\t\tclassName: 'agy-tv-copy-btn',\n\t\tonClick: onCopy,\n\t\ttitle: copied ? copiedLabel : copyLabel,\n\t},\n\t\tcopied ? IconCheckOutline14(11) : IconCopyOutline16(11),\n\t\thx('span', null, copied ? copiedLabel : copyLabel)\n\t);\n}\n\n// ---- Diff body renderer ---------------------------------------------------\n\n/** Per-side render cap: a 5000-line write_to_file used to build 10k DOM rows\n * inside a max-height:280px pane (99% of them invisible). */\nconst DIFF_MAX_LINES = 400;\n\nfunction DiffBody({ model, t }: { model: MirrorCardModel; openFile?: (p: string, o?: unknown) => void; cwd?: string; home?: string; t?: Translate }): unknown {\n\tconst h = hx;\n\tconst oldText = model.oldText ?? '';\n\tconst newText = model.newText ?? '';\n\tconst rows: unknown[] = [];\n\tconst moreRow = (count: number, key: string): unknown =>\n\t\th('div', { key, className: 'agy-tv-diff-line', style: { color: 'var(--dsw-alias-label-tertiary)' } },\n\t\t\ttr(t, 'tv.diffMore', '… {count} more lines not rendered', { count }));\n\tif (oldText !== '') {\n\t\tconst lines = oldText.split('\\n');\n\t\tconst shown = Math.min(lines.length, DIFF_MAX_LINES);\n\t\tfor (let i = 0; i < shown; i++) {\n\t\t\tconst line = lines[i];\n\t\t\trows.push(h('div', { key: 'del-' + i, className: 'agy-tv-diff-line agy-tv-diff-del' },\n\t\t\t\th('span', { className: 'agy-tv-diff-marker' }, '-'),\n\t\t\t\th('span', { style: { flex: 1 } }, line === '' ? ' ' : line)\n\t\t\t));\n\t\t}\n\t\tif (lines.length > shown) rows.push(moreRow(lines.length - shown, 'del-more'));\n\t}\n\tif (newText !== '') {\n\t\tconst lines = newText.split('\\n');\n\t\tconst shown = Math.min(lines.length, DIFF_MAX_LINES);\n\t\tfor (let i = 0; i < shown; i++) {\n\t\t\tconst line = lines[i];\n\t\t\trows.push(h('div', { key: 'add-' + i, className: 'agy-tv-diff-line agy-tv-diff-add' },\n\t\t\t\th('span', { className: 'agy-tv-diff-marker' }, '+'),\n\t\t\t\th('span', { style: { flex: 1 } }, line === '' ? ' ' : line)\n\t\t\t));\n\t\t}\n\t\tif (lines.length > shown) rows.push(moreRow(lines.length - shown, 'add-more'));\n\t}\n\tif (rows.length === 0) {\n\t\trows.push(h('div', { key: 'empty', className: 'agy-tv-diff-line', style: { color: 'var(--dsw-alias-label-tertiary)' } }, tr(t, 'tv.noChanges', '(no textual changes)')));\n\t}\n\treturn h('div', { className: 'agy-tv-diff-list' }, ...rows);\n}\n\n// ---- Question card renderer -----------------------------------------------\n\nfunction QuestionCardBody({ model }: { model: MirrorCardModel }): unknown {\n\tconst h = hx;\n\tconst questions = model.questions ?? [];\n\tconst [selectedMap, setSelectedMap] = react().useState<Record<number, Set<string>>>({});\n\tconst [inserted, setInserted] = react().useState(false);\n\n\tconst toggleOption = (qIdx: number, opt: string, isMulti?: boolean) => {\n\t\tsetSelectedMap((prev) => {\n\t\t\tconst next = { ...prev };\n\t\t\tconst current = new Set(next[qIdx] ?? []);\n\t\t\tif (isMulti) {\n\t\t\t\tif (current.has(opt)) current.delete(opt);\n\t\t\t\telse current.add(opt);\n\t\t\t} else {\n\t\t\t\tcurrent.clear();\n\t\t\t\tcurrent.add(opt);\n\t\t\t}\n\t\t\tnext[qIdx] = current;\n\t\t\treturn next;\n\t\t});\n\t};\n\n\tconst onInsert = () => {\n\t\tconst parts: string[] = [];\n\t\tfor (let i = 0; i < questions.length; i++) {\n\t\t\tconst sel = Array.from(selectedMap[i] ?? []);\n\t\t\tif (sel.length > 0) {\n\t\t\t\tparts.push(sel.join('; '));\n\t\t\t}\n\t\t}\n\t\tif (parts.length > 0) {\n\t\t\tconst text = parts.join('\\n');\n\t\t\tinsertTextIntoChatComposer(text);\n\t\t\tsetInserted(true);\n\t\t\tsetTimeout(() => setInserted(false), 1500);\n\t\t}\n\t};\n\n\tconst qNodes: unknown[] = [];\n\tfor (let i = 0; i < questions.length; i++) {\n\t\tconst q = questions[i];\n\t\tif (!q) continue;\n\t\tconst options = q.options ?? [];\n\t\tconst isMulti = q.is_multi_select === true;\n\t\tconst sel = selectedMap[i] ?? new Set();\n\n\t\tconst optNodes = options.map((opt, oIdx) => {\n\t\t\tconst isChecked = sel.has(opt);\n\t\t\treturn h('button', {\n\t\t\t\tkey: 'opt-' + oIdx,\n\t\t\t\ttype: 'button',\n\t\t\t\tclassName: cls('agy-tv-q-opt', isChecked && 'selected'),\n\t\t\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\ttoggleOption(i, opt, isMulti);\n\t\t\t\t},\n\t\t\t},\n\t\t\t\th('span', { className: cls('agy-tv-q-check', isMulti ? 'checkbox' : 'radio', isChecked && 'checked') }),\n\t\t\t\th('span', { className: 'agy-tv-q-opt-text' }, opt)\n\t\t\t);\n\t\t});\n\n\t\tqNodes.push(h('div', { key: 'q-' + i, className: 'agy-tv-q-item' },\n\t\t\th('div', { className: 'agy-tv-q-prompt' }, q.question || 'Please select:'),\n\t\t\th('div', { className: 'agy-tv-q-opts' }, ...optNodes)\n\t\t));\n\t}\n\n\tconst hasSelection = Object.values(selectedMap).some((s) => s.size > 0);\n\n\treturn h('div', { className: 'agy-tv-question-wrap' },\n\t\t...qNodes,\n\t\th('div', { className: 'agy-tv-q-footer' },\n\t\t\th('button', {\n\t\t\t\ttype: 'button',\n\t\t\t\tclassName: cls('agy-tv-q-insert-btn', hasSelection && 'active'),\n\t\t\t\tdisabled: !hasSelection,\n\t\t\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonInsert();\n\t\t\t\t},\n\t\t\t},\n\t\t\t\tinserted ? '✓ 已填入对话框' : '💬 填入对话框 / Insert into Chat'\n\t\t\t),\n\t\t\tmodel.output ? h('div', { className: 'agy-tv-q-answered' }, `已记录: ${model.output}`) : null\n\t\t)\n\t);\n}\n\n// ---- Image card renderer --------------------------------------------------\n\nfunction ImageCardBody({ model }: { model: MirrorCardModel }): unknown {\n\tconst h = hx;\n\tconst prompt = model.prompt || '';\n\tconst name = model.imageName || 'image';\n\tconst ratio = model.aspectRatio || '1:1';\n\tconst path = model.imagePath || model.path || '';\n\tconst mediaUrl = path ? buildMediaUrl(path) : null;\n\n\treturn h('div', { className: 'agy-tv-img-wrap' },\n\t\th('div', { className: 'agy-tv-img-meta' },\n\t\t\th('div', { className: 'agy-tv-img-prompt', title: prompt || name }, prompt ? `\"${prompt}\"` : name),\n\t\t\th('div', { className: 'agy-tv-img-badges' },\n\t\t\t\th('span', { className: 'agy-tv-img-badge' }, ratio),\n\t\t\t\t...(path ? [h('span', { key: 'path', className: 'agy-tv-img-badge', title: path }, path.split(/[/\\\\]/).pop())] : [])\n\t\t\t)\n\t\t),\n\t\tmediaUrl ? h('div', {\n\t\t\tclassName: 'agy-tv-img-preview-box',\n\t\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\topenLightbox(mediaUrl, prompt || name, path);\n\t\t\t},\n\t\t\ttitle: '点击放大预览 / Click to open lightbox'\n\t\t},\n\t\t\th('img', {\n\t\t\t\tclassName: 'agy-tv-img-thumb',\n\t\t\t\tsrc: mediaUrl,\n\t\t\t\talt: prompt || name,\n\t\t\t\tloading: 'lazy',\n\t\t\t})\n\t\t) : null\n\t);\n}\n\n// ---- Card body renderer ---------------------------------------------------\n\nfunction CardBody({ model, openFile, cwd, home, inspect, t }: {\n\tmodel: MirrorCardModel;\n\topenFile?: (p: string, o?: unknown) => void;\n\tcwd?: string;\n\thome?: string;\n\tinspect?: () => void;\n\tt?: Translate;\n}): unknown {\n\tconst h = hx;\n\tconst inspectNode = inspect !== undefined\n\t\t? h('div', { key: 'ins', style: { padding: '4px 8px 6px' } },\n\t\t\th('button', {\n\t\t\t\ttype: 'button',\n\t\t\t\tclassName: 'agy-tv-inspect-btn',\n\t\t\t\tonClick: inspect,\n\t\t\t}, IconInspectOutline12(12), tr(t, 'code.inspect', 'Inspect'))\n\t\t)\n\t\t: null;\n\n\tswitch (model.kind) {\n\t\tcase 'terminal': {\n\t\t\tconst rawBody = model.output !== undefined && model.output !== '' ? trimTrailingBlankLines(model.output) : tr(t, 'tv.noOutput', '(no output)');\n\t\t\tconst copyText = model.output !== undefined && model.output !== '' ? model.output : (model.command ?? '');\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\th('span', { className: 'agy-tv-prompt-glyph' }, '❯'),\n\t\t\t\t\t\t...(model.cwd ? [h('span', { key: 'cwd', className: 'agy-tv-card-cwd' }, model.cwd)] : []),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-cmd', title: model.command }, model.command ?? '')\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: copyText, t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'diff': {\n\t\t\tconst path = model.path ?? 'file';\n\t\t\tconst pathLabel = relativize(path, cwd, home);\n\t\t\tconst stat = diffStat(model);\n\t\t\tconst copyText = model.newText ?? '';\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconEditOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, pathLabel),\n\t\t\t\t\t\t...(stat ? [h('span', { key: 's', className: 'agy-tv-diff-stat' }, stat)] : [])\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: copyText })\n\t\t\t\t),\n\t\t\t\th(DiffBody, { model, openFile, cwd, home, t }),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'read': {\n\t\t\tconst path = model.path ?? 'file';\n\t\t\tconst pathLabel = relativize(path, cwd, home);\n\t\t\tconst rawBody = model.output !== undefined && model.output !== '' ? trimTrailingBlankLines(model.output) : tr(t, 'tv.noOutput', '(no output)');\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconBrowseOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, pathLabel)\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.output ?? '', t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'search': {\n\t\t\tconst rawBody = model.output !== undefined && model.output !== '' ? trimTrailingBlankLines(model.output) : tr(t, 'tv.noMatches', '(no matches)');\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconSearchOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.title)\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.output ?? '', t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'list': {\n\t\t\tconst rawBody = model.output !== undefined && model.output !== '' ? trimTrailingBlankLines(model.output) : tr(t, 'tv.emptyDir', '(empty directory)');\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconBrowseOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.title)\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.output ?? '', t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'question': {\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconQuestionOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.title)\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.output ?? (model.raw ?? '') })\n\t\t\t\t),\n\t\t\t\th(QuestionCardBody, { model }),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tcase 'image': {\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconImageOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.imageName || 'Image')\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: model.prompt || (model.raw ?? '') })\n\t\t\t\t),\n\t\t\t\th(ImageCardBody, { model }),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t\tdefault: {\n\t\t\tconst copyText = model.output !== undefined && model.output !== '' ? model.output : (model.raw ?? '');\n\t\t\tconst rawBody = model.output !== undefined && model.output !== ''\n\t\t\t\t? trimTrailingBlankLines(model.output)\n\t\t\t\t: (model.raw !== undefined && model.raw !== '' ? clip(model.raw, 4000) : tr(t, 'tv.noDetail', '(no detail)'));\n\t\t\treturn h('div', { className: 'agy-tv-card' },\n\t\t\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\t\t\tIconCodeOutline16(13),\n\t\t\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.server ? `${model.server}: ${model.tool}` : (model.title || model.tool || 'Tool'))\n\t\t\t\t\t),\n\t\t\t\t\th(CopyButton, { text: copyText, t })\n\t\t\t\t),\n\t\t\t\th('pre', { className: 'agy-tv-card-content' }, clip(rawBody, 16000)),\n\t\t\t\tinspectNode\n\t\t\t);\n\t\t}\n\t}\n}\n\n// ---- Main ToolView Component ----------------------------------------------\n\nexport function AgyMirrorToolView(props: AgyToolViewProps): unknown {\n\tconst h = hx;\n\tconst { block, cwd, home, openFile, inspect, t, callId } = props;\n\tconst settle = isSettled(block);\n\tconst err = isError(block);\n\tconst model = mirrorCardModel(block, cwd, home);\n\tconst cardKey = callId ? `call:${callId}` : `${model.kind}:${model.tool ?? ''}:${model.title}:${model.path ?? model.command ?? ''}`;\n\tconst [open, setOpen] = useToggle(false, cardKey);\n\tconst state: 'ok' | 'err' | 'run' = !settle ? 'run' : err ? 'err' : 'ok';\n\tconst title = displayTitle(model, t);\n\tconst summary = displaySummary(model, cwd, home);\n\tconst stat = diffStat(model);\n\tconst preview = !open && model.kind !== 'diff' ? previewLine(model, cwd, home) : undefined;\n\tconst hasFileLink = (model.kind === 'diff' || model.kind === 'read') && model.path && openFile !== undefined;\n\n\tconst onFileClick = (e: { stopPropagation: () => void }) => {\n\t\te.stopPropagation();\n\t\tif (model.path && openFile) {\n\t\t\tif (model.location?.line !== undefined) openFile(model.path, { line: model.location.line });\n\t\t\telse openFile(model.path);\n\t\t}\n\t};\n\n\tconst leading = open\n\t\t? h('span', { className: 'agy-tv-chevron-open' }, IconChevronDownOutline14(14))\n\t\t: h('span', { className: 'agy-tv-leading' },\n\t\t\th('span', { className: 'agy-tv-icon-idle' }, toolIconFor(model.kind, 14)),\n\t\t\th('span', { className: 'agy-tv-chevron-hover' }, IconChevronDownOutline14(14)),\n\t\t);\n\n\tconst summaryNode = hasFileLink\n\t\t? h('button', {\n\t\t\ttype: 'button',\n\t\t\tclassName: 'agy-tv-file-link',\n\t\t\tonClick: onFileClick,\n\t\t\ttitle: model.path,\n\t\t}, summary)\n\t\t: h('span', {\n\t\t\tclassName: cls('agy-tv-summary', err && 'agy-tv-summary-err'),\n\t\t\ttitle: summary,\n\t\t}, summary);\n\n\tconst header = h('div', {\n\t\tclassName: 'agy-tv-row',\n\t\trole: 'button',\n\t\ttabIndex: 0,\n\t\t'aria-expanded': open,\n\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\te.stopPropagation();\n\t\t\tsetOpen();\n\t\t},\n\t\tonKeyDown: (e: { key: string; preventDefault: () => void }) => {\n\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen();\n\t\t\t}\n\t\t},\n\t\ttitle: inspect !== undefined\n\t\t\t? (open ? tr(t, 'tv.hint.collapseInspect', 'Click to collapse · right-click to inspect') : tr(t, 'tv.hint.expandInspect', 'Click to expand · right-click to inspect'))\n\t\t\t: (open ? tr(t, 'tv.hint.collapse', 'Click to collapse') : tr(t, 'tv.hint.expand', 'Click to expand')),\n\t\tonContextMenu: inspect !== undefined ? (e: { preventDefault: () => void }) => { e.preventDefault(); inspect(); } : undefined,\n\t},\n\t\tleading,\n\t\th('span', { className: 'agy-tv-title' }, title),\n\t\th('span', { className: 'agy-tv-sep', 'aria-hidden': true }),\n\t\tsummaryNode,\n\t\t...(stat !== null ? [h('span', { key: 'stat', className: 'agy-tv-diff-stat' }, stat)] : []),\n\t\t...(preview !== undefined ? [h('span', { key: 'prev', className: 'agy-tv-preview', title: preview }, preview)] : []),\n\t);\n\n\treturn h('div', {\n\t\tclassName: cls('agy-tv-root', open && 'agy-tv-open'),\n\t\t'data-state': state,\n\t\t'data-kind': model.kind,\n\t},\n\t\theader,\n\t\t...(open ? [h('div', { key: 'wrap', className: 'agy-tv-body-wrap' },\n\t\t\th(CardBody, { model, openFile, cwd, home, inspect, t })\n\t\t)] : [])\n\t);\n}\n\n// ---- Register into DSH slots ----------------------------------------------\n\n/**\n * Extract the agy mirror cursor (and tool name) from a run_code program.\n *\n * Only the wrapper this bridge actually generates counts: `mirrorStepInvocation`\n * (src/activity.ts) requires the exact two-line shape — one comment naming the\n * recorded step and one `tools['agy_tool']({run, step})` call — and rejects any\n * other program. Anything it rejects is ordinary Code Mode and renders as code.\n */\nexport function parseAgyMirrorFromCode(argsRaw: string): { run: string; step: number; tool?: string } | null {\n\ttry {\n\t\tconst parsed = JSON.parse(argsRaw) as { code?: unknown };\n\t\tconst code = typeof parsed?.code === 'string' ? parsed.code : '';\n\t\tconst step = mirrorStepInvocation(code);\n\t\tif (step === undefined) return null;\n\t\treturn { run: step.run, step: step.step, tool: step.tool };\n\t} catch { /* not a mirror program */ }\n\treturn null;\n}\n\n/** Project a run_code program into the fields the code card renders. */\nexport function runCodeModel(block?: ToolBlock): { code: string; title: string } {\n\tconst raw = block !== undefined ? parsedArgsRaw(block) : '{}';\n\tlet code = raw;\n\tlet description: string | undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as { code?: unknown; description?: unknown };\n\t\tif (typeof parsed?.code === 'string') code = parsed.code;\n\t\tif (typeof parsed?.description === 'string' && parsed.description !== '') description = parsed.description;\n\t} catch { /* raw args are not JSON — show them verbatim */ }\n\tconst firstLine = code.split('\\n').find((line) => line.trim() !== '');\n\tconst title = description\n\t\t?? (firstLine !== undefined && firstLine.trim() !== '' ? firstLine.trim().slice(0, 120) : 'run_code');\n\treturn { code, title };\n}\n\n/**\n * Ordinary run_code toolview.\n *\n * The keyed `tool.call.toolview` registration for `run_code` REPLACES the\n * host's built-in code row rather than adding to it, so this branch owns the\n * icon, title, summary and expandable body for every non-mirror program. It\n * reuses the same styled vocabulary as the mirror card (`agy-tv-row` and\n * friends) so an ordinary Code Mode call reads exactly like a native tool row.\n */\nexport function AgyCodeToolView(props?: AgyToolViewProps): unknown {\n\tconst h = hx;\n\tconst { block, inspect, t, callId } = props ?? ({} as AgyToolViewProps);\n\tconst model = runCodeModel(block);\n\tconst cardKey = callId ? `call:${callId}` : `code:${model.title}`;\n\tconst [open, setOpen] = useToggle(false, cardKey);\n\tconst settle = block !== undefined && isSettled(block);\n\tconst err = block !== undefined && isError(block);\n\tconst state: 'ok' | 'err' | 'run' = !settle ? 'run' : err ? 'err' : 'ok';\n\tconst translate = (key: string): string => (typeof t === 'function' ? t(key) : key);\n\n\tconst leading = open\n\t\t? h('span', { className: 'agy-tv-chevron-open' }, IconChevronDownOutline14(14))\n\t\t: h('span', { className: 'agy-tv-leading' },\n\t\t\th('span', { className: 'agy-tv-icon-idle' }, IconCodeOutline16(14)),\n\t\t\th('span', { className: 'agy-tv-chevron-hover' }, IconChevronDownOutline14(14)),\n\t\t);\n\n\tconst header = h('div', {\n\t\tclassName: 'agy-tv-row',\n\t\trole: 'button',\n\t\ttabIndex: 0,\n\t\t'aria-expanded': open,\n\t\tonClick: (e: { stopPropagation: () => void }) => {\n\t\t\te.stopPropagation();\n\t\t\tsetOpen();\n\t\t},\n\t\tonKeyDown: (e: { key: string; preventDefault: () => void }) => {\n\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetOpen();\n\t\t\t}\n\t\t},\n\t\ttitle: inspect !== undefined\n\t\t\t? (open ? tr(t, 'tv.hint.collapseInspect', 'Click to collapse · right-click to inspect') : tr(t, 'tv.hint.expandInspect', 'Click to expand · right-click to inspect'))\n\t\t\t: (open ? tr(t, 'tv.hint.collapse', 'Click to collapse') : tr(t, 'tv.hint.expand', 'Click to expand')),\n\t\tonContextMenu: inspect !== undefined ? (e: { preventDefault: () => void }) => { e.preventDefault(); inspect(); } : undefined,\n\t},\n\t\tleading,\n\t\th('span', { className: 'agy-tv-title' }, translate('code.title')),\n\t\th('span', { className: 'agy-tv-sep', 'aria-hidden': true }),\n\t\th('span', { className: cls('agy-tv-summary', err && 'agy-tv-summary-err'), title: model.title }, model.title),\n\t);\n\n\tconst inspectNode = inspect !== undefined\n\t\t? h('div', { key: 'ins', style: { padding: '4px 8px 6px' } },\n\t\t\th('button', { type: 'button', className: 'agy-tv-inspect-btn', onClick: inspect },\n\t\t\t\tIconInspectOutline12(12), translate('code.inspect')))\n\t\t: null;\n\n\tconst body = h('div', { className: 'agy-tv-card' },\n\t\th('div', { className: 'agy-tv-card-header' },\n\t\t\th('div', { className: 'agy-tv-card-header-left' },\n\t\t\t\tIconCodeOutline16(13),\n\t\t\t\th('span', { className: 'agy-tv-card-path' }, model.title),\n\t\t\t),\n\t\t\th(CopyButton, { text: model.code, labels: [translate('code.copy'), translate('code.copied')] }),\n\t\t),\n\t\th('pre', { className: 'agy-tv-card-content' }, clip(model.code, 16_000)),\n\t\tinspectNode,\n\t);\n\n\treturn h('div', {\n\t\tclassName: cls('agy-tv-root', open && 'agy-tv-open'),\n\t\t'data-state': state,\n\t\t'data-kind': 'code',\n\t},\n\t\theader,\n\t\t...(open ? [h('div', { key: 'wrap', className: 'agy-tv-body-wrap' }, body)] : [])\n\t);\n}\n\n/**\n * run_code toolview: when the program is an agy mirror wrapper, render the\n * native Antigravity card instead of a raw code row; every other run_code\n * program renders through {@link AgyCodeToolView}.\n */\nexport function AgyRunCodeToolView(props?: unknown): unknown {\n\tconst typed = props as AgyToolViewProps | undefined;\n\tconst block = typed?.block;\n\tconst raw = block !== undefined ? parsedArgsRaw(block) : '{}';\n\tconst mirror = parseAgyMirrorFromCode(raw);\n\tif (mirror === null) return AgyCodeToolView(typed);\n\tlet description: string | undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as { description?: unknown };\n\t\tif (typeof parsed?.description === 'string' && parsed.description !== '') description = parsed.description;\n\t} catch { /* ignore */ }\n\tconst synthetic = {\n\t\t...block,\n\t\tcall: {\n\t\t\t...((block as { call?: { name?: string; argsRaw?: string } } | undefined)?.call ?? {}),\n\t\t\tname: 'agy_tool',\n\t\t\targsRaw: JSON.stringify({\n\t\t\t\trun: mirror.run,\n\t\t\t\tstep: mirror.step,\n\t\t\t\t...(mirror.tool !== undefined ? { tool: mirror.tool } : {}),\n\t\t\t\t...(description !== undefined ? { input: { description } } : {}),\n\t\t\t}),\n\t\t},\n\t} as unknown as ToolBlock;\n\treturn AgyMirrorToolView({ block: synthetic, t: typed?.t } as never);\n}\n\n/**\n * The two keyed views this integration contributes, in registration order.\n *\n * Fusion's own client entry performs the registration (it owns the single\n * `slots` dependency); this module only names what to register.\n */\nexport const AGY_TOOL_VIEWS: ReadonlyArray<{\n\tkey: string;\n\tlabel: string;\n\tcomponent: (props?: unknown) => React.ReactNode;\n}> = [\n\t{ key: 'agy_tool', label: 'Antigravity tool', component: AgyMirrorToolView as (props?: unknown) => React.ReactNode },\n\t// Code Mode wraps the mirror in `run_code`. A keyed slot entry is a takeover,\n\t// not an addition, so this view also owns ordinary programs — hence the\n\t// fallback to the code card inside AgyRunCodeToolView.\n\t{ key: 'run_code', label: 'Antigravity (code mode)', component: AgyRunCodeToolView as (props?: unknown) => React.ReactNode },\n];\n\n// ---- Official CSS Styles --------------------------------------------------\n\nconst ROW_CSS = `\n/* Container */\n.agy-tv-root {\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 100%;\n\tmin-width: 0;\n\tposition: relative;\n\tfont-family: var(--dsw-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"PingFang SC\", \"Microsoft YaHei\", sans-serif);\n\tmargin: 2px 0;\n}\n\n/* Collapsed Header Row */\n.agy-tv-row {\n\tdisplay: flex;\n\talign-items: center;\n\theight: calc(24px + var(--dsh-content-font-delta, 0px));\n\tmin-width: 0;\n\tposition: relative;\n\toverflow: hidden;\n\tcursor: pointer;\n\tuser-select: none;\n\tbackground: transparent;\n\tborder: none;\n\tpadding: 0;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* Running sweep shimmer animation */\n.agy-tv-root[data-state=\"run\"] .agy-tv-row:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 300px;\n\tbackground: linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--dsw-alias-bg-base, #ffffff) 60%, transparent) 55%, transparent 100%);\n\tpointer-events: none;\n\tanimation: 2.6s ease-out infinite agy-tv-sweep;\n}\n@keyframes agy-tv-sweep {\n\t0% { left: -300px; }\n\t90%, 100% { left: 100%; }\n}\n\n/* Leading Icon with Hover-to-Arrow transition */\n.agy-tv-leading {\n\tposition: relative;\n\tflex: none;\n\twidth: calc(16px + var(--dsh-content-font-delta, 0px));\n\theight: calc(16px + var(--dsh-content-font-delta, 0px));\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-right: 6px;\n\tcolor: var(--dsw-alias-label-tertiary, #64748b);\n}\n.agy-tv-leading svg {\n\twidth: calc(14px + var(--dsh-content-font-delta, 0px));\n\theight: calc(14px + var(--dsh-content-font-delta, 0px));\n}\n.agy-tv-icon-idle {\n\tdisplay: inline-flex;\n\topacity: 1;\n\ttransition: opacity 0.1s ease;\n}\n.agy-tv-chevron-hover {\n\tposition: absolute;\n\tinset: 0;\n\tmargin: auto;\n\topacity: 0;\n\ttransition: opacity 0.1s ease;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n}\n.agy-tv-row:hover .agy-tv-icon-idle {\n\topacity: 0;\n}\n.agy-tv-row:hover .agy-tv-chevron-hover {\n\topacity: 1;\n}\n.agy-tv-chevron-open {\n\tposition: relative;\n\tflex: none;\n\twidth: calc(16px + var(--dsh-content-font-delta, 0px));\n\theight: calc(16px + var(--dsh-content-font-delta, 0px));\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-right: 6px;\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n}\n.agy-tv-chevron-open svg {\n\twidth: calc(14px + var(--dsh-content-font-delta, 0px));\n\theight: calc(14px + var(--dsh-content-font-delta, 0px));\n}\n\n/* Title */\n.agy-tv-title {\n\tflex: none;\n\tfont-size: var(--dsh-content-font-size-secondary, 13px);\n\tline-height: calc(24px + var(--dsh-content-font-delta, 0px));\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\tfont-weight: 400;\n}\n\n/* Dot separator */\n.agy-tv-sep {\n\tbackground: var(--dsw-alias-label-caption, #94a3b8);\n\tborder-radius: 1px;\n\tflex: none;\n\twidth: 2px;\n\theight: 2px;\n\tmargin: 0 8px;\n}\n\n/* Summary */\n.agy-tv-summary {\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmin-width: 0;\n\tfont-size: var(--dsh-content-font-size-secondary, 13px);\n\tline-height: calc(24px + var(--dsh-content-font-delta, 0px));\n\tcolor: var(--dsw-alias-label-tertiary, #64748b);\n\tflex: auto;\n\toverflow: hidden;\n}\n.agy-tv-summary-err {\n\tcolor: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n/* File link button */\n.agy-tv-file-link {\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmin-width: 0;\n\tfont: inherit;\n\ttext-align: left;\n\tfont-size: var(--dsh-content-font-size-secondary, 13px);\n\tline-height: calc(24px + var(--dsh-content-font-delta, 0px));\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\ttext-decoration: underline dotted;\n\ttext-decoration-color: var(--dsw-alias-label-tertiary, #64748b);\n\ttext-underline-offset: 3px;\n\tcursor: pointer;\n\tbackground: none;\n\tborder: none;\n\tflex: 0 auto;\n\tmargin: 0;\n\tpadding: 0;\n\ttext-decoration-thickness: 1px;\n\toverflow: hidden;\n}\n.agy-tv-file-link:hover {\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n\ttext-decoration-color: currentColor;\n}\n\n/* Diff stat badge (+10 -2) */\n.agy-tv-diff-stat {\n\tfont-family: var(--ds-font-family-code, ui-monospace, monospace);\n\tfont-size: calc(var(--dsh-content-font-size-secondary, 13px) - 2px);\n\tcolor: var(--dsw-alias-label-caption, #94a3b8);\n\tmargin-left: 10px;\n\tflex: none;\n}\n\n/* Preview text */\n.agy-tv-preview {\n\tfont-family: var(--ds-font-family-code, ui-monospace, monospace);\n\tfont-size: 11px;\n\tcolor: var(--dsw-alias-label-caption, #94a3b8);\n\tmargin-left: 8px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmax-width: 35%;\n\tflex: none;\n}\n\n/* Body wrap */\n.agy-tv-body-wrap {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n/* Card container */\n.agy-tv-card {\n\tborder: 0.5px solid var(--dsw-alias-border-l1, #e2e8f0);\n\tbackground: var(--dsw-alias-markdown-code-block, #f8fafc);\n\tfont-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);\n\tfont-size: 12px;\n\tline-height: 1.55;\n\tborder-radius: 12px;\n\tmargin: 4px 0 4px 4px;\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n}\n\n/* Card Header */\n.agy-tv-card-header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n\tpadding: 8px 12px;\n\tbackground: var(--dsw-alias-markdown-code-block-banner, rgba(0, 0, 0, 0.02));\n\tborder-bottom: 0.5px solid var(--dsw-alias-border-l2, #e2e8f0);\n}\n.agy-tv-card-header-left {\n\tdisplay: flex;\n\talign-items: baseline;\n\tgap: 8px;\n\tmin-width: 0;\n\tflex: 1;\n\toverflow: hidden;\n}\n.agy-tv-prompt-glyph {\n\tcolor: var(--dsw-alias-label-caption, #94a3b8);\n\tflex: none;\n\tfont-weight: 700;\n}\n.agy-tv-card-cwd {\n\tcolor: var(--dsw-alias-label-tertiary, #64748b);\n\tflex: none;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.agy-tv-card-cmd {\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: pre;\n\tfont-weight: 600;\n}\n.agy-tv-card-path {\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n\tfont-weight: 600;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n/* Copy button */\n.agy-tv-copy-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n\tbackground: transparent;\n\tborder: none;\n\tpadding: 2px 6px;\n\tmargin: 0;\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\tcursor: pointer;\n\tfont-size: 11px;\n\tline-height: 16px;\n\tborder-radius: 4px;\n\ttransition: background-color 0.1s ease, color 0.1s ease;\n\tflex: none;\n}\n.agy-tv-copy-btn:hover {\n\tbackground: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.05));\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* Card scrollable content */\n.agy-tv-card-content {\n\tmax-height: 260px;\n\toverflow-y: auto;\n\toverflow-x: auto;\n\tpadding: 10px 14px;\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\tscrollbar-width: thin;\n\tscrollbar-color: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.2)) transparent;\n}\n.agy-tv-card-content::-webkit-scrollbar {\n\twidth: 6px;\n\theight: 6px;\n}\n.agy-tv-card-content::-webkit-scrollbar-thumb {\n\tbackground: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.18));\n\tborder-radius: 6px;\n\tbackground-clip: padding-box;\n}\n.agy-tv-card-content::-webkit-scrollbar-track {\n\tbackground: transparent;\n\tmargin: 6px 0;\n}\n\n/* Diff lines */\n.agy-tv-diff-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: 6px 0;\n\tmax-height: 280px;\n\toverflow-y: auto;\n\toverflow-x: auto;\n\tscrollbar-width: thin;\n\tscrollbar-color: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.2)) transparent;\n}\n.agy-tv-diff-list::-webkit-scrollbar {\n\twidth: 6px;\n\theight: 6px;\n}\n.agy-tv-diff-list::-webkit-scrollbar-thumb {\n\tbackground: var(--dsw-alias-border-l3, rgba(0, 0, 0, 0.18));\n\tborder-radius: 6px;\n}\n.agy-tv-diff-list::-webkit-scrollbar-track {\n\tbackground: transparent;\n\tmargin: 4px 0;\n}\n.agy-tv-diff-line {\n\tdisplay: flex;\n\tgap: 8px;\n\tpadding: 0 12px;\n\tmin-height: 20px;\n\tline-height: 20px;\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n}\n.agy-tv-diff-del {\n\tbackground: color-mix(in srgb, var(--dsw-alias-state-error-primary, #dc2626) 10%, transparent);\n\tcolor: var(--dsw-alias-state-error-primary, #dc2626);\n}\n.agy-tv-diff-add {\n\tbackground: color-mix(in srgb, var(--dsw-alias-state-success-primary, #059669) 10%, transparent);\n\tcolor: var(--dsw-alias-state-success-primary, #059669);\n}\n.agy-tv-diff-marker {\n\tflex: none;\n\twidth: 14px;\n\tfont-weight: 700;\n\tuser-select: none;\n}\n\n/* Inspect button */\n.agy-tv-inspect-btn {\n\tborder: 0.5px solid var(--dsw-alias-border-l3, #cbd5e1);\n\tbackground: var(--dsw-alias-bg-base, #ffffff);\n\tcolor: var(--dsw-alias-label-secondary, #334155);\n\tcursor: pointer;\n\topacity: 0;\n\tborder-radius: 999px;\n\talign-self: flex-start;\n\talign-items: center;\n\tgap: 4px;\n\tmargin: 4px 0 2px 4px;\n\tpadding: 2px 8px;\n\tfont-size: 11px;\n\tline-height: 16px;\n\ttransition: opacity 0.1s;\n\tdisplay: inline-flex;\n}\n.agy-tv-root:hover .agy-tv-inspect-btn,\n.agy-tv-inspect-btn:focus-visible {\n\topacity: 1;\n}\n.agy-tv-inspect-btn:hover {\n\tbackground: var(--dsw-alias-interactive-bg-hover-solid, #f1f5f9);\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n}\n\n/* Question Card Styles */\n.agy-tv-question-wrap {\n\tpadding: 10px 14px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tfont-family: inherit;\n}\n.agy-tv-q-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n.agy-tv-q-prompt {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--dsw-alias-label-primary, #0f172a);\n}\n.agy-tv-q-opts {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n.agy-tv-q-opt {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 6px 10px;\n\tborder-radius: 6px;\n\tbackground: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.08));\n\tborder: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.2));\n\tcolor: var(--dsw-alias-label-primary, #334155);\n\tcursor: pointer;\n\ttext-align: left;\n\tfont-size: 12.5px;\n\ttransition: all 0.15s ease;\n}\n.agy-tv-q-opt:hover {\n\tbackground: var(--dsw-alias-bg-hover, rgba(127, 127, 127, 0.15));\n\tborder-color: var(--dsw-alias-border-l3, rgba(127, 127, 127, 0.35));\n}\n.agy-tv-q-opt.selected {\n\tbackground: rgba(16, 185, 129, 0.12);\n\tborder-color: #10b981;\n\tcolor: #10b981;\n}\n.agy-tv-q-check {\n\twidth: 14px;\n\theight: 14px;\n\tborder: 1.5px solid currentColor;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n}\n.agy-tv-q-check.radio {\n\tborder-radius: 50%;\n}\n.agy-tv-q-check.checkbox {\n\tborder-radius: 3px;\n}\n.agy-tv-q-check.checked:after {\n\tcontent: \"\";\n\twidth: 6px;\n\theight: 6px;\n\tbackground: currentColor;\n\tborder-radius: inherit;\n}\n.agy-tv-q-footer {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding-top: 6px;\n\tborder-top: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.15));\n}\n.agy-tv-q-insert-btn {\n\tpadding: 5px 12px;\n\tborder-radius: 6px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tbackground: rgba(16, 185, 129, 0.15);\n\tborder: 1px solid #10b981;\n\tcolor: #10b981;\n\tcursor: pointer;\n\ttransition: all 0.15s ease;\n}\n.agy-tv-q-insert-btn:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n.agy-tv-q-insert-btn:not(:disabled):hover {\n\tbackground: #10b981;\n\tcolor: #fff;\n}\n.agy-tv-q-answered {\n\tfont-size: 11px;\n\tcolor: var(--dsw-alias-label-tertiary, #888);\n}\n\n/* Image Card Styles */\n.agy-tv-img-wrap {\n\tpadding: 10px 14px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n.agy-tv-img-meta {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 8px;\n}\n.agy-tv-img-prompt {\n\tfont-size: 12.5px;\n\tcolor: var(--dsw-alias-label-primary, #334155);\n\tfont-style: italic;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.agy-tv-img-badges {\n\tdisplay: flex;\n\tgap: 4px;\n\tflex-shrink: 0;\n}\n.agy-tv-img-badge {\n\tfont-size: 11px;\n\tpadding: 1px 6px;\n\tborder-radius: 4px;\n\tbackground: var(--dsw-alias-bg-l2, rgba(127, 127, 127, 0.1));\n\tborder: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.2));\n\tcolor: var(--dsw-alias-label-secondary, #888);\n}\n.agy-tv-img-preview-box {\n\tmax-height: 320px;\n\toverflow: hidden;\n\tborder-radius: 6px;\n\tborder: 1px solid var(--dsw-alias-border-l2, rgba(127, 127, 127, 0.2));\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: repeating-conic-gradient(rgba(127,127,127,0.08) 0% 25%, transparent 0% 50%) 50% / 16px 16px;\n\tcursor: zoom-in;\n}\n.agy-tv-img-thumb {\n\tmax-width: 100%;\n\tmax-height: 320px;\n\tobject-fit: contain;\n}\n`;\n\n/**\n * Install the tool-card stylesheet once and hand back its remover.\n *\n * Upstream injected it at module load; a Fusion client entry must be able to\n * unwind what it added, so the work moved behind this function. The style id is\n * namespaced to this plugin.\n */\nexport function installAgyToolViewStyles(): () => void {\n\tconst gDoc = (globalThis as unknown as {\n\t\tdocument?: {\n\t\t\tgetElementById(id: string): unknown;\n\t\t\tcreateElement(tag: string): { id?: string; textContent?: string };\n\t\t\thead?: unknown;\n\t\t\tdocumentElement?: { appendChild(n: unknown): void };\n\t\t};\n\t}).document;\n\tif (gDoc === undefined || gDoc === null) return () => {};\n\tconst styleId = 'dsh-fusion-agy-toolview-css';\n\tlet st = gDoc.getElementById(styleId) as { id?: string; textContent?: string; remove?(): void } | null;\n\tif (st === null) {\n\t\tst = gDoc.createElement('style');\n\t\tst.id = styleId;\n\t\tst.textContent = ROW_CSS;\n\t\tconst host = (gDoc.head ?? gDoc.documentElement) as unknown as { appendChild(n: unknown): void };\n\t\tif (host !== undefined) host.appendChild(st);\n\t}\n\treturn () => {\n\t\tst?.remove?.();\n\t};\n}","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-model-selection/client'\nimport type { ConfigForms } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport { bindAcpConfigForm } from './acp-import.js'\nimport { FusionSettings } from './FusionSettings.js'\nimport { FusionPanelIcon } from './FusionPanelIcon.js'\nimport { FusionHint } from './FusionHint.js'\nimport { FusionPermission } from './FusionPermission.js'\nimport { FusionTool, fusionControlTools } from './FusionTool.js'\nimport { AGY_TOOL_VIEWS, installAgyToolViewStyles } from './agy/toolview.js'\nimport { NS as AGY_LOCALE_NS } from './agy/locales.js'\nimport { bindAgyLocale, type AgyLocaleSource } from './agy/locale.js'\nimport { FUSION_SIDEBAR_LABEL } from './studio-brand.js'\nimport { bindLocale } from './i18n.js'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SlotMap {\n 'main': { kind: 'keyed'; scope: 'root' }\n 'sidebar.panellist': {\n kind: 'list'\n scope: 'root'\n owner: { size: number; active: boolean }\n }\n }\n}\n\nexport const name = 'dsh-agent-studio-fusion/client'\nexport const inject = ['slots']\nexport const FUSION_PANEL_ID = 'fusion'\n\nexport { FusionPanelIcon } from './FusionPanelIcon.js'\n\nexport function apply(ctx: Context): void {\n // Follow DSH's language setting (Chinese or English) when the locale service is present.\n ctx.inject(['locale'], scope => {\n const locale = (scope as unknown as { locale: Parameters<typeof bindLocale>[0] }).locale\n scope.effect(() => bindLocale(locale))\n // The ported Antigravity console carries its own dictionaries and follows the\n // same language setting; one service, two readers.\n scope.effect(() => bindAgyLocale(locale as unknown as AgyLocaleSource))\n })\n ctx.inject(['configForms'], scope => {\n const forms = (scope as unknown as { configForms: ConfigForms }).configForms\n scope.effect(() => bindAcpConfigForm(forms.get('dsh-agent-studio-fusion') ?? forms.get('dsh-agent-studio') ?? forms.get('dsh-fusion')))\n })\n for (const tool of fusionControlTools) ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview', key: tool,\n }, FusionTool))\n // The built-in Antigravity route's tool cards. Exactly two keyed views, as the\n // standalone plugin registered them: `agy_tool` (the bridge transport's mirror\n // step) and `run_code` (Code Mode's wrapper). A keyed entry takes over that\n // name, so the `run_code` view renders the generated AGY mirror wrapper as an\n // Antigravity card and every other program as the ordinary code card.\n // Fusion's own activity rows keep rendering through `FusionTool`/`ActivityCard`;\n // nothing here touches them.\n // `tool.call.toolview` is a keyed slot: `key` IS the wire tool name, and the\n // only other fields are `priority`, `locale` and `registrant`. The standalone\n // plugin also passed `id`/`label`; those belong to list slots and are rejected\n // here, so the key is the whole identity — which is what dispatch reads anyway.\n for (const view of AGY_TOOL_VIEWS) ctx.slots.inject('tool.call.toolview', () => ctx.slots.register({\n name: 'tool.call.toolview', key: view.key, locale: AGY_LOCALE_NS,\n }, view.component))\n ctx.effect(() => installAgyToolViewStyles())\n ctx.slots.inject('main', () => ctx.slots.register({\n name: 'main', key: FUSION_PANEL_ID,\n }, FusionSettings))\n // The one sidebar entry. Its label is the short product name (the page header\n // carries the full `DSH Agent Studio With Fusion` title); the panel id stays\n // `fusion`, which is what the main-panel key and the route names use.\n ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({\n name: 'sidebar.panellist', id: FUSION_PANEL_ID, order: 40, label: () => FUSION_SIDEBAR_LABEL,\n }, FusionPanelIcon))\n ctx.inject(['modelDirectories'], scope => {\n const sessionProps = (sessionId: Parameters<typeof scope.modelDirectories.directoryFor>[0]) => {\n const directory = scope.modelDirectories.directoryFor(sessionId)\n return { sessionId, directory: directory.store, load: () => { void directory.load().catch(() => undefined) } }\n }\n scope.slots.inject('conversation.input.dock', () => scope.slots.register({\n name: 'conversation.input.dock', id: 'fusion-configuration', order: 20, inject: sessionProps,\n }, FusionHint))\n // Additive: the native permission control keeps its slot and its selection state.\n scope.slots.inject('conversation.input.left', () => scope.slots.register({\n name: 'conversation.input.left', id: 'fusion-permission', order: 10, inject: sessionProps,\n }, FusionPermission))\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOA,MAAa,gBAAgB;GAAC;GAAe;GAAW;GAAQ;EAAK;EAErE,MAAa,YAAY;GAAC;GAAiB;GAAgB;EAAQ;EAEnE,MAAa,gBAAgB;EAwB7B,SAAS,SAAS,OAAqD;GACrE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD,KAAA;EACN;;EAGA,SAAgB,QAAQ,MAAsB;GAC5C,OAAO,KACJ,KAAK,CAAC,CACN,YAAY,CAAC,CACb,QAAQ,kBAAkB,GAAG,CAAC,CAC9B,QAAQ,UAAU,GAAG,CAAC,CACtB,QAAQ,oBAAoB,EAAE;EACnC;;EAGA,SAAS,UAAU,UAA0F;GAC3G,KAAK,MAAM,OAAO,WAAW;IAC3B,MAAM,OAAO,SAAS,SAAS,IAAI;IACnC,IAAI,SAAS,KAAA,GACX,OAAO;KAAE,SAAS;KAAM,QAAQ,QAAQ;IAAS;GAErD;GACA,OAAO;IAAE,SAAS;IAAU,QAAQ;GAAM;EAC5C;EAEA,SAAS,QAAQ,MAAc,OAEuB;GACpD,MAAM,SAAS,SAAS,KAAK;GAC7B,MAAM,UAAU,QAAQ;GACxB,IAAI,WAAW,KAAA,KAAa,OAAO,YAAY,YAAY,QAAQ,KAAK,CAAC,CAAC,WAAW,GACnF,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAuB;GAErD,MAAM,OAAO,OAAO,QAAQ,CAAC;GAC7B,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC,KAAK,OAAM,QAAO,OAAO,QAAQ,QAAQ,GACpE,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAgB;GAG9C,MAAM,YAAY,SADN,OAAO,OAAO,CAAC,CACG;GAC9B,IAAI,cAAc,KAAA,KAAa,CAAC,OAAO,OAAO,SAAS,CAAC,CAAC,OAAM,SAAQ,OAAO,SAAS,QAAQ,GAC7F,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAe;GAE7C,MAAM,cAAc,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;GAClF,OAAO;IACL,IAAI;IACJ,SAAS,QAAQ,KAAK;IAChB;IACN,KAAK;IACL;GACF;EACF;EAOA,SAAgB,iBACd,UAKgC;GAChC,MAAM,sBAAM,IAAI,IAA+B;GAC/C,IAAI,CAAC,UAAU,OAAO;GAEtB,IAAI,MAAM,QAAQ,QAAQ,GAAG;IAC3B,KAAK,MAAM,QAAQ,UACjB,IAAI,QAAQ,OAAO,SAAS,YAAY,WAAW,QAAQ,OAAO,KAAK,UAAU,UAAU;KACzF,MAAM,MAAM,SAAU,KAAa,IAAI;KACvC,MAAM,WAAW,SAAU,KAAa,OAAO,MAAM,MAAM,KAAA,IAAY,SAAS,IAAI;KACpF,IAAI,IAAI,KAAK,OAAO;MAAE;MAAK;KAAS,CAAC;IACvC;IAEF,OAAO;GACT;GAEA,IAAI,oBAAoB,KAAK;IAC3B,KAAK,MAAM,CAAC,OAAO,SAAS,SAAS,QAAQ,GAC3C,IAAI,OAAO,UAAU,UAAU;KAC7B,MAAM,MAAM,SAAU,MAAc,IAAI;KACxC,MAAM,WAAW,SAAU,MAAc,OAAO,MAAM,MAAM,KAAA,IAAY,SAAS,IAAI;KACrF,IAAI,IAAI,OAAO;MAAE;MAAK;KAAS,CAAC;IAClC;IAEF,OAAO;GACT;GAEA,IAAI,OAAO,aAAa,aAAa,WAAW,YAAY,UAAU,WAAW;IAC/E,MAAM,SAAS,SAAU,SAAiB,KAAK;IAC/C,MAAM,UAAU,SAAU,SAAiB,IAAI;IAC/C,MAAM,YAAY,SAAU,QAAgB,KAAK,MAAM,KAAK,SAAU,QAAgB,MAAM,KAAK,CAAC;IAClG,MAAM,aAAa,SAAU,SAAiB,KAAK,MAAM,KAAK,SAAU,SAAiB,MAAM,KAAK,CAAC;IACrG,MAAM,yBAAS,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,SAAS,GAAG,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC;IAC9E,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,MAAM,SAAU,WAAmB,MAAM;KAC/C,MAAM,WAAW,SAAU,UAAkB,MAAM;KACnD,IAAI,IAAI,OAAO;MAAE;MAAK;KAAS,CAAC;IAClC;IACA,OAAO;GACT;GAEA,IAAI,OAAO,aAAa,UACtB,KAAK,MAAM,CAAC,OAAO,SAAS,OAAO,QAAQ,QAAQ,GAAG;IACpD,MAAM,MAAM,SAAU,MAAc,IAAI;IACxC,MAAM,WAAW,SAAU,MAAc,OAAO,MAAM,MAAM,KAAA,IAAY,SAAS,IAAI;IACrF,IAAI,IAAI,OAAO;KAAE;KAAK;IAAS,CAAC;GAClC;GAGF,OAAO;EACT;;;;;EAMA,SAAgB,iBACd,MACA,eAKa;GACb,IAAI;GACJ,IAAI;IACF,WAAW,KAAK,MAAM,IAAI;GAC5B,SAAS,OAAO;IACd,OAAO;KAAE,IAAI;KAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;IAAE;GACpF;GACA,MAAM,OAAO,SAAS,QAAQ;GAC9B,IAAI,SAAS,KAAA,GACX,OAAO;IAAE,IAAI;IAAO,OAAO;GAAyB;GAGtD,MAAM,WAAW,iBAAiB,aAAa;GAC/C,MAAM,wBAAQ,IAAI,IAAY;GAC9B,MAAM,UAA8B,CAAC;GACrC,MAAM,UAA8B,CAAC;GACrC,MAAM,EAAE,SAAS,WAAW,UAAU,IAAI;GAE1C,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,OAAO,GAAG;IACnD,MAAM,SAAS,QAAQ,MAAM,KAAK;IAClC,IAAI,CAAC,OAAO,IAAI;KACd,QAAQ,KAAK;MAAE;MAAM,QAAQ,OAAO;KAAO,CAAC;KAC5C;IACF;IAEA,MAAM,OAAO,UAAU,cAAc,KAAK,IAAI,IAAI,OAAO,QAAQ,IAAI,KAAK;IAC1E,IAAI,QAAQ;IACZ,KAAK,IAAI,SAAS,GAAG,MAAM,IAAI,KAAK,GAAG,UACrC,QAAQ,GAAG,KAAK,GAAG;IAErB,MAAM,IAAI,KAAK;IAEf,MAAM,WAAW,SAAS,IAAI,KAAK;IACnC,MAAM,WAAW,aAAa,KAAA;IAC9B,MAAM,SAAS;KAAE,GAAI,UAAU,YAAY,CAAC;KAAI,GAAI,UAAU,OAAO,CAAC;IAAG;IACzE,MAAM,UAAU,OAAO,YACrB,OAAO,QAAQ,MAAM,CAAC,CAAC,QACpB,CAAC,SAAS,CAAE,cAAoC,SAAS,GAAG,CAC/D,CACF;IAGA,MAAM,yBAAyB,OADb,SAAS,KACmB,CAAC,EAAE,gBAAgB;IACjE,MAAM,UAAsB;KAC1B,GAAI,WAAW,UAAU,EAAE,YAAY,MAAM;KAC7C,GAAI,OAAO,gBAAgB,KAAA,KAAc,OAAO,gBAAgB,SAAS,CAAC,yBACtE,CAAC,IACD,EAAE,aAAa,OAAO,YAAY;KACtC,SAAS,OAAO;KAChB,GAAI,OAAO,KAAK,SAAS,IAAI,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;KACtD,GAAI,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;IAClE;IAEA,QAAQ,KAAK;KAAE;KAAM;KAAO;KAAU;IAAQ,CAAC;GACjD;GAEA,OAAO;IAAE,IAAI;IAAM;IAAS;GAAQ;EACtC;;EAGA,SAAgB,YAAY,SAA4D;GACtF,OAAO,QAAQ,KAAI,WAAU;IAC3B,IAAI;IACJ,MAAM;KAAC;KAAO;KAAU,MAAM;IAAK;IACnC,OAAO,MAAM;GACf,EAAE;EACJ;EAYA,MAAM,+BAAgD,OAAO,OAAO;GAClE,QAAQ;GACR,OAAO,KAAA;GACP,MAAM,KAAA;GACN,MAAM,KAAA;GACN,UAAU,KAAA;GACV,UAAU;EACZ,CAAC;EAED,IAAI;EACJ,MAAM,gCAAgB,IAAI,IAAgB;EAC1C,MAAM,4BAA4B;GAChC,KAAK,MAAM,YAAY,eACrB,SAAS;EAEb;;EAGA,SAAgB,kBAAkB,MAAmC;GACnE,YAAY;GACZ,oBAAoB;GACpB,MAAM,cAAc,KAAK,UAAU,mBAAmB;GACtD,aAAa;IACX,YAAY;IACZ,IAAI,cAAc,MAAM;KACtB,YAAY,KAAA;KACZ,oBAAoB;IACtB;GACF;EACF;EAEA,SAAgB,uBAAuB,UAAkC;GACvE,cAAc,IAAI,QAAQ;GAC1B,aAAa;IACX,cAAc,OAAO,QAAQ;GAC/B;EACF;EAEA,SAAgB,2BAA4C;GAC1D,OAAO,YAAY,UAAU,YAAY,IAAI;EAC/C;EAMA,SAAgB,mBAA4E;GAC1F,MAAM,YAAA,GAAA,MAAA,qBAAA,CACJ,wBACA,gCACM,4BACR;GACA,OAAO;IACL,QAAQ,SAAS;IACjB,OAAO,SAAS;IAChB,MAAM,SAAS;IACf,MAAM,SAAS;IACf,UAAU,SAAS;IACnB,UAAU,SAAS;IACnB,MAAM,SAAS;IACf,MAAM;GACR;EACF;;;ECzSA,IAAI;EACJ,MAAMA,8BAAY,IAAI,IAAgB;EACtC,MAAMC,iBAAe;GAAE,KAAK,MAAM,YAAYD,aAAW,SAAS;EAAE;;EAGpE,SAAgB,WAAW,MAAgC;GACzD,SAAS;GACT,SAAO;GACP,MAAM,cAAc,KAAK,UAAUC,QAAM;GACzC,aAAa;IAAE,YAAY;IAAG,IAAI,WAAW,MAAM;KAAE,SAAS,KAAA;KAAW,SAAO;IAAE;GAAE;EACtF;EAGA,MAAM,gBAAsB;GAE1B,QADW,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,cAAc,cAAc,OAAO,UAAU,UAAA,CACtF,YAAY,CAAC,CAAC,WAAW,IAAI,IAAI,OAAO;EACpD;;EAGA,SAAgB,UAAgB;GAC9B,QAAA,GAAA,MAAA,qBAAA,EAA4B,aAAY;IAAE,YAAU,IAAI,QAAQ;IAAG,aAAa;KAAE,YAAU,OAAO,QAAQ;IAAE;GAAE,GAAG,eAAe,IAAI;EACvI;;EAGA,MAAaC,QAAM,MAAY,IAAY,OAAe,SAAS,OAAO,KAAK;;;;;;;;;;;ECpB/E,MAAa,kBAAkB;;;;;;;EA6C/B,MAAM,uBAAuB;;EAG7B,MAAa,iBAAiB,UAC5B,OAAO,UAAU,YAAY,qBAAqB,KAAK,KAAK;;EAW9D,MAAa,oBAAoB,aAC/B,aAAA,gBAAgC,aAAA,sBAAuC,aAAa,6BAA6B,aAAa;;EAGhI,MAAa,qBAAqB,UAChC,iBAAiB,OAAO,QAAQ,KAAK,cAAc,OAAO,KAAK;;;ECrEjE,SAAgB,cAAc,QAAwB;GACpD,IAAI,SAAS,KAAM,OAAO,GAAG;GAC7B,IAAI,SAAS,KAAW;IACtB,MAAM,IAAI,SAAS;IACnB,OAAO,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE;GAC5D;GACA,MAAM,IAAI,SAAS;GACnB,OAAO,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE;EAC1E;EAEA,SAAgB,aAAa,MAAY,OAAsB,OAAuB;GACpF,IAAI,CAAC,OAAO,OAAO;GACnB,MAAM,QAAQ,MAAM;GACpB,MAAM,WAAW,QAAQ,SAAS,MAAM,WAAW,CAAC;GACpD,MAAM,aAAa,QAAQ,MAAM,UAAU,MAAM,OAAO,WAAW,CAAC;GACpE,MAAM,eAAe,QAAQ,MAAM,aAAa,MAAM,UAAU,WAAW,CAAC;GAE5E,IAAI,CAAC,UAAU;IACb,IAAI,YAAY;KACd,MAAM,MAAM,cAAc,MAAM,OAAO,KAAK;KAC5C,MAAM,MAAM,MAAM,OAAO,WAAW,QAAQC,KAAG,MAAM,IAAI,MAAM,OAAO,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,OAAO,SAAS,GAAG,MAAM,WAAW,IAAI;KACpJ,OAAO,GAAGA,KAAG,MAAM,MAAM,IAAI,SAAS,YAAY,IAAI,wBAAwB,IAAI;IACpF;IACA,OAAOA,KAAG,MAAM,OAAO,cAAc;GACvC;GAEA,MAAM,WAAW,cAAc,MAAO,KAAK;GAC3C,MAAM,aAAa,aAAa,cAAc,MAAM,OAAO,KAAK,IAAIA,KAAG,MAAM,OAAO,cAAc;GAClG,MAAM,eAAe,eAAe,cAAc,MAAM,UAAW,KAAK,IAAIA,KAAG,MAAM,OAAO,cAAc;GAC1G,MAAM,cAAc,MAAO,WAAW,QAAQA,KAAG,MAAM,IAAI,MAAO,SAAS,GAAG,MAAM,SAAS,KAAK,MAAO,SAAS,GAAG,MAAM,WAAW,IAAI;GAE1I,OAAO,GAAG,SAAS,GADFA,KAAG,MAAM,OAAO,WAAW,QAAQ,aAAa,IAAI,aAAa,WAAW,eAAe,aAAa,EAC5F,IAAI;EACnC;EAEA,MAAM,kBAAkB,MAAY,YAAoB;GACtD,wBAAwBA,KAAG,MAAM,YAAY,mCAAmC;GAChF,qBAAqBA,KAAG,MAAM,iBAAiB,qBAAqB;GACpE,kBAAkBA,KAAG,MAAM,iBAAiB,6BAA6B;EAC3E,EAAA,CAA6B,WAAW;EACxC,MAAMC,YAAU,MAAY,OAA+B,UAAkB,CAAC,QAAQ,MAAM,CAAC,MAAM,WAAWD,KAAG,MAAM,OAAO,cAAc,IACxI,GAAG,cAAc,MAAM,KAAK,EAAE,IAAI,MAAM,MAAM,eAAe,EAAE,GAAG,MAAM,WAAW,QAAQA,KAAG,MAAM,IAAI,MAAM,SAAS,GAAG,MAAM,SAAS,KAAK,MAAM,SAAS,GAAG,MAAM,WAAW,IAAI;EACzL,MAAM,WAAW,MAAY,WAAmB;GAAE,cAAcA,KAAG,MAAM,MAAM,MAAM;GAAG,YAAYA,KAAG,MAAM,MAAM,YAAY;GAC7H,mBAAmBA,KAAG,MAAM,MAAM,WAAW;GAAG,iBAAiBA,KAAG,MAAM,MAAM,OAAO;EAAE,EAAA,CAA6B,UAAU;;EAElI,MAAa,SAAS,UAAiC,UAAU,OAAO,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC;;EAEzG,MAAM,eAAe,MAAY,aAAsB;GACrD,OAAOA,KAAG,MAAM,wBAAwB,uCAAuC;GAC/E,MAAMA,KAAG,MAAM,eAAe,qCAAqC;GACnE,KAAKA,KAAG,MAAM,aAAa,kCAAkC;GAC7D,OAAOA,KAAG,MAAM,cAAc,0CAA0C;GACxE,mBAAmBA,KAAG,MAAM,oBAAoB,6CAA6C;EAC/F,EAAA,CAA6B,WAAW,OAAOA,KAAG,MAAM,WAAW,kCAAkC;EAErG,SAAgB,gBAAgB;GAC9B,MAAM,OAAO,QAAQ;GACrB,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAiC;GAC9C,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,EAAE;GACvC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GACrC,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,CAAC;GACxC,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,KAAK;GAC5C,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,SAAA,CAA2C,IAAI;GACpE,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,CAAyC,IAAI;GAChE,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAgE,IAAI;GACrF,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,SAAA,CAAyB,KAAK;GAEhD,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,QAAQ,IAAI,gBAAgB;IAClC,WAAW,IAAI;IAAG,SAAS,EAAE;IAC7B,MAAW,GAAG,gBAAgB,uBAAuB,mBAAmB,MAAM,KAAK;KAAE,aAAa;KAAe,OAAO;KAAY,QAAQ,MAAM;IAAO,CAAC,CAAC,CACxJ,KAAK,OAAM,aAAY;KACtB,IAAI,CAAC,SAAS,IAAI;MAChB,MAAM,OAAO,MAAM,SAAS,KAAK,CAAC,CAAC,YAAY,IAAI;MACnD,IAAI,WAAW,SAAS,WAAW,OAAO,MAAM,OAAO,SAAS,QAAQ,KAAK,MAAM,OAAO,SAAS,QAAQ,IAAI;OAC7G,UAAU,EAAE;OACZ;MACF;MACA,MAAM,IAAI,MAAM,MAAM,SAASA,KAAG,MAAM,cAAc,kCAAkC,CAAC;KAC3F;KACA,OAAO,SAAS,KAAK;IACvB,CAAC,CAAC,CACD,MAAK,SAAQ;KAAE,IAAI,MAAM,QAAQ,IAAI;IAAE,CAAC,CAAC,CACzC,OAAM,UAAS;KAAE,IAAI,CAAC,MAAM,OAAO,SAAS,SAAS,OAAO,KAAK,CAAC;IAAE,CAAC,CAAC,CACtE,cAAc;KAAE,IAAI,CAAC,MAAM,OAAO,SAAS,WAAW,KAAK;IAAE,CAAC;IACjE,aAAa,MAAM,MAAM;GAC3B,GAAG;IAAC;IAAQ;IAAS;GAAI,CAAC;GAE1B,MAAM,eAAe,OAAO,WAAmB;IAC7C,cAAc,MAAM;IACpB,YAAY,IAAI;IAChB,SAAS,EAAE;IACX,IAAI;KACF,MAAM,MAAM,MAAM,MAAM,GAAG,gBAAgB,UAAU,mBAAmB,MAAM,KAAK;MACjF,QAAQ;MACR,aAAa;KACf,CAAC;KACD,IAAI,CAAC,IAAI,IAAI;MACX,MAAM,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,YAAY,IAAI;MAC9C,MAAM,MAAM,MAAM,SAAS;MAC3B,MAAM,MAAM,QAAQ,iCAChBA,KAAG,MAAM,wBAAwB,YAAY,MAAM,MAAM,OAAO,KAC9D,sCAAsC,YAAY,MAAM,MAAM,OAAO,GAAG,IACzE,OAAOA,KAAG,MAAM,UAAU,uBAAuB;MACtD,MAAM,IAAI,MAAM,GAAG;KACrB;KACA,SAAQ,SAAQ,OAAO;MACrB,GAAG;MACH,YAAY,KAAK,IAAI,GAAG,KAAK,aAAa,CAAC;MAC3C,OAAO,KAAK,MAAM,QAAO,SAAQ,KAAK,OAAO,MAAM;KACrD,IAAI,IAAI;KACR,gBAAgB,IAAI;KACpB,YAAY,IAAI;KAChB,IAAI,WAAW,QAAQ,UAAU,EAAE;KACnC,YAAW,MAAK,IAAI,CAAC;IACvB,SAAS,KAAK;KACZ,YAAY;MAAE,IAAI;MAAQ,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;KAAE,CAAC;IACvF,UAAU;KACR,cAAc,IAAI;IACpB;GACF;GAEA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IACL,WAAU;IACV,cAAYA,KAAG,MAAM,gBAAgB,+BAA+B;IACpE,iBAAc;IACd,GAAK,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,WAAU,UAAS;KACjB,IAAI,CAAC,MAAM,UAAU,MAAM,WAAW,MAAM,eAC1C,QAAQ,MAAM,cAAc,IAAI;IAEpC;cATK,CAWL,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAU;eAAnB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;gBACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,SAAS,wBAAwB,EAAM,CAAA;KACjD,CAAA,GACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,OAAOA,KAAG,MAAM,QAAQ,UAAU,IAAIA,KAAG,MAAM,QAAQ,QAAQ,EAAS,CAAA,GAChF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAyB,eAAY;MAAQ,CAAA,CACzD;OACC;QACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;eAAf;MACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,+DACX,wLAAwL,EAAK,CAAA,GAC/L,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,UAAU;QAAS,eAAe,YAAW,UAAS,QAAQ,CAAC;kBAAIA,KAAG,MAAM,QAAQ,SAAS;OAAU,CAAA,CAC5G;;MACN,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAK;iBAAS;MAAS,CAAA;MAAG,WAAW,CAAC,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAK;iBAAUA,KAAG,MAAM,WAAW,UAAU;MAAK,CAAA;MAC/G,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAA4C,cAAYA,KAAG,MAAM,QAAQ,kBAAkB;iBAA1G;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,kBAAkB,EAAM,CAAA;QAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,GAAG,KAAK,WAAW,SAAS,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,YAAY,SAAS,KAAK,OAAO,WAAW,QACzJ,GAAG,KAAK,WAAW,WAAW,KAAK,OAAO,MAAM,qBAAqB,KAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO,YAAY,iBAAiB,KAAK,OAAO,WAAW,YAAY,EAAK,CAAA;QAC3L,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;SAAIA,KAAG,MAAM,SAAS,gBAAgB;SAAE;SAAEC,SAAO,MAAM,KAAK,OAAO,OAAO,KAAK,OAAO,KAAK;SAAE;SAAID,KAAG,MAAM,QAAQ,YAAY;SAAE;SAAEC,SAAO,MAAM,KAAK,OAAO,WAAW,KAAK,OAAO,KAAK;SAAE;SAAID,KAAG,MAAM,OAAO,cAAc;SAAE;SAAE,aAAa,MAAM,KAAK,QAAQ,KAAK,OAAO,KAAK;SAAE;QAAS,EAAA,CAAA;QAC1R,KAAK,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;SAAIA,KAAG,MAAM,YAAY,MAAM,KAAK,KAAK,gBAAgB,EAAE,MAAM,KAAK,KAAK,OAAO,OAC9F,uBAAuB,MAAM,KAAK,KAAK,gBAAgB,EAAE,4BAA4B,KAAK,KAAK,OAAO,UAAU;SAC/G,KAAK,KAAK,aAAa,OAAOA,KAAG,MAAM,2BAA2B,MAAM,KAAK,KAAK,QAAQ,EAAE,GAAG,KAAK,KAAK,MAAM,UAC9G,aAAa,MAAM,KAAK,KAAK,QAAQ,EAAE,kDAAkD,KAAK,KAAK,MAAM,sBAAsB,IAAI;SACpIA,KAAG,MAAM,8BAA8B,+EAA+E;QAAK,EAAA,CAAA;QAC7H,KAAK,QAAS,KAAK,KAAK,WAAW,KAAK,KAAK,aAAa,KAAK,KAAK,UAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,MAAK;mBAC1FA,KAAG,MAAM,MAAM,KAAK,KAAK,WAAW,KAAK,KAAK,aAAa,KAAK,KAAK,QAAQ,YAAY,KAAK,KAAK,SAAS,SAAS,KAAK,KAAK,WAAW,SAAS,KAAK,KAAK,QAAQ,UACpK,GAAG,KAAK,KAAK,WAAW,KAAK,KAAK,aAAa,KAAK,KAAK,QAAQ,oCAAoC,KAAK,KAAK,SAAS,iBAAiB,KAAK,KAAK,WAAW,0BAA0B,KAAK,KAAK,QAAQ,aAAa;QACxN,CAAA;QACH,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;SAAIA,KAAG,MAAM,cAAc,KAAK,WAAW,SAAS,EAAE,KAAK,KAAK,WAAW,SAAS,EAAE,QAAQ,mBAAmB,KAAK,WAAW,SAAS,EAAE,IAAI,KAAK,WAAW,SAAS,EAAE,QAAQ;SAChL,KAAK,WAAW,QAAQ,KAAK,OAAO,QAAQ,KAAK,UAAU,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ,WAAW,GAAG,eAAe,MAAM,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,KAAK,IAAI,MAAM;SACxJA,KAAG,MAAM,kCAAkC,kFAAkF;QAAK,EAAA,CAAA;QACrI,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,OAAO,EAAE,WAAW,OAAO;SAAG,UAAU;SAAG,cAAYA,KAAG,MAAM,WAAW,iBAAiB;mBAC/F,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;UAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAUA,KAAG,MAAM,iBAAiB,mCAAmC,EAAW,CAAA;UAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;WAC/F,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;YAAI,OAAM;sBAAOA,KAAG,MAAM,WAAW,cAAc;WAAM,CAAA;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;YAAI,OAAM;sBAAOA,KAAG,MAAM,MAAM,SAAS;WAAM,CAAA;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;YAAI,OAAM;sBAAOA,KAAG,MAAM,MAAM,UAAU;WAAM,CAAA;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;YAAI,OAAM;sBAAOA,KAAG,MAAM,sBAAsB,2CAA2C;WAAM,CAAA;UAAK,EAAA,CAAA,EAAQ,CAAA;UACzQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,KAAK,OAAO,KAAI,UAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;WAC/B,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;YAAI,OAAM;sBAAV;aAAiB,MAAM,SAAS,SAAS,SAAS;aAAW;aAAI,MAAM;aAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,MAAM,SAAgB,CAAA;YAAK;;WAChH,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,QAAQ,MAAM,MAAM,OAAO,EAAM,CAAA;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,MAAM,MAAU,CAAA;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,aAAa,MAAM,OAAO,MAAM,KAAK,EAAM,CAAA;UAC3G,EAAA,GAHsC,KAAK,UAAU;WAAC,MAAM;WAAM,MAAM;WAAU,MAAM;WAAO,MAAM;UAAO,CAAC,CAG7G,CAAC,EAAS,CAAA;SACT,EAAA,CAAA;QACJ,CAAA;QACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,OAAO,IAAI,KAAK,KAAK,UAAU,CAAC,CAAC,eAAe,EAAE,gBAAgB,WAAW,IAAI,KAAK,KAAK,UAAU,CAAC,CAAC,eAAe,EAAE,yCAAyC,EAAS,CAAA,EAAI,CAAA;OAC/L;UACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;OACE,WAAU;OACV,GAAK,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;OACnC,WAAU,UAAS,aAAa,MAAM,cAAc,IAAI;iBAH1D,CAKE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;QAAS,WAAU;kBAAnB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAU;mBAAhB;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAASA,KAAG,MAAM,QAAQ,OAAO,EAAU,CAAA;UAAE;UAC7C,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAU;qBAAhB;YAAuC;YAAE,KAAK;YAAW;WAAO;;SAC5D;YACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAU;mBAAhB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,YAAYA,KAAG,MAAM,QAAQ,UAAU,IAAIA,KAAG,MAAM,QAAQ,QAAQ,EAAS,CAAA,GACrF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;UAA+B,eAAY;SAAQ,CAAA,CAC/D;UACC;WACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf;SACG,CAAC,KAAK,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,kBAAkB,sBAAsB,EAAK,CAAA;SACjF,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;UAC1B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAU;qBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,KAAK,MAAc,CAAA,GAC5B,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;YACG,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,eAAe;YAAE;YAAI,KAAK,SAAS,cAAcA,KAAG,MAAM,OAAO,UAAU,IAAI,KAAK;YAAM;YAAIA,KAAG,MAAM,GAAG,KAAK,MAAM,MAAM,OAAO,GAAG,KAAK,MAAM,MAAM,UAAU;YAAG,KAAK,YAAYA,KAAG,MAAM,cAAc,KAAK,UAAU,KAAK,MAAM,KAAK,UAAU,gBAAgB,IAAI;YACjS,KAAK,MAAM,SAASA,KAAG,MAAM,QAAQ,MAAM,KAAK,KAAK,gBAAgB,KAAK,YAAY,MAAM,KAAK,KAAK,gBAAgB,GAAG,IAAI;YAC7H,KAAK,MAAM,aAAa,QAAQ,KAAK,MAAM,aAAa,KAAA,IAAYA,KAAG,MAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,EAAE,IAAI,WAAW,MAAM,KAAK,KAAK,QAAQ,EAAE,EAAE,IAAI;WACxJ,EAAA,CAAA,CACJ,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;YAAK,WAAU;sBACZ,iBAAiB,KAAK,KACrB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;aACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAU;wBAA+BA,KAAG,MAAM,SAAS,SAAS;aAAQ,CAAA;aAClF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cACE,MAAK;cACL,UAAU,QAAQ,UAAU;cAC5B,eAAe,KAAK,aAAa,KAAK,EAAE;wBAEvC,eAAe,KAAK,KAAKA,KAAG,MAAM,SAAS,WAAW,IAAIA,KAAG,MAAM,MAAM,SAAS;aAC7E,CAAA;aACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cACE,MAAK;cACL,WAAU;cACV,UAAU,QAAQ,UAAU;cAC5B,eAAe;eAAE,gBAAgB,IAAI;eAAG,YAAY,IAAI;cAAE;wBAEzDA,KAAG,MAAM,MAAM,QAAQ;aAClB,CAAA;YACR,EAAA,CAAA,IAEF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aACE,MAAK;aACL,UAAU,QAAQ,UAAU;aAC5B,eAAe;cAAE,SAAS,EAAE;cAAG,YAAY,IAAI;cAAG,gBAAgB,KAAK,EAAE;aAAE;aAC3E,cAAYA,KAAG,MAAM,QAAQ,KAAK,SAAS,eAAe,KAAK,OAAO;uBAErEA,KAAG,MAAM,QAAQ,OAAO;YACnB,CAAA;WAEP,CAAA,CACF;;UACJ,UAAU,OAAO,KAAK,MACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,MAAK;WAAQ,WAAU;WAA2B,OAAO;YAAE,OAAO;YAAiD,QAAQ;YAAW,UAAU;WAAO;qBACvJ,SAAS;UACT,CAAA;UAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA;WAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAUA,KAAG,MAAM,QAAQ,SAAS,EAAW,CAAA;WAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;YAAIA,KAAG,MAAM,MAAM,MAAM;YAAE;YAAG,KAAK;WAAM,EAAA,CAAA;WAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;YAAIA,KAAG,MAAM,MAAM,SAAS;YAAE;YAAG,KAAK;WAAa,EAAA,CAAA;WACpJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,QAAQ,KAAK,aAAa,oBAAoB,iBAAiB,KAAK,aAAa,sDAAsD,EAAK,CAAA;WACzJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;YAAIA,KAAG,MAAM,MAAM,OAAO;YAAE;YAAEC,SAAO,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK;YAAE;YAAID,KAAG,MAAM,QAAQ,YAAY;YAAE;YAAEC,SAAO,MAAM,KAAK,MAAM,WAAW,KAAK,MAAM,KAAK;YAAE;YAAID,KAAG,MAAM,OAAO,cAAc;YAAE;YAAE,aAAa,MAAM,KAAK,OAAO,KAAK,MAAM,KAAK;YAAE;WAAS,EAAA,CAAA;UAClQ,EAAA,CAAA;SACP,EAAA,GAnDiC,KAAK,EAmDtC,CAAC,EAAM,CAAA;SACX,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAU;oBAAf,CAAgC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,UAAU,WAAW,CAAC;WAAQ,eAAe,UAAU,EAAE;qBAAIA,KAAG,MAAM,QAAQ,QAAQ;UAAU,CAAA,GACtI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,UAAU,WAAW,CAAC,KAAK;WAAY,eAAe,UAAU,KAAK,UAAW;qBAAIA,KAAG,MAAM,QAAQ,OAAO;UAAU,CAAA,CAAM;;QACnI;SACE;QACT,EAAA,CAAA;KACG;MACE;;EACX;;;EChPA,MAAM,UAAU,UAAkB,SAAS,MAAM,IAAI,QAAQ,IAAA,CAAK,QAAQ,CAAC,EAAE,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,QAAQ,GAAG,EAAE,KAAK,OAAO,KAAK;EAC7I,MAAM,WAAW,YAAoB,UAAU,KAAK,IAAI,UAAU,GAAA,CAAI,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG;EACzG,MAAM,YAAY,MAAY,UAAgB;GAAE,MAAME,KAAG,MAAM,MAAM,MAAM;GAAG,IAAIA,KAAG,MAAM,MAAM,IAAI;GAAG,KAAKA,KAAG,MAAM,MAAM,KAAK;EAAE,EAAA,CAAG;EAEtI,SAAS,WAAW,MAAY,KAAyB;GACvD,QAAQ,IAAI,YAAZ;IACE,KAAK,QAAQ,OAAOA,KAAG,MAAM,QAAQ,cAAc;IACnD,KAAK,QAAQ,OAAOA,KAAG,MAAM,UAAU,oBAAoB;IAC3D,KAAK,QAAQ,OAAOA,KAAG,MAAM,2BAA2B,6CAA6C;IACrG,KAAK,SAAS,OAAO,GAAG,IAAI,SAAS,MAAO,MAAM,IAAI,SAAS,OAAO,IAAI,SAAS,MAAO,OAAO,KAAK,IAAI,SAAS,MAAO,OAAO;IACjI,KAAK,UAAU,OAAOA,KAAG,MAAM,GAAG,IAAI,SAAS,OAAQ,MAAM,QAAQ,GAAG,IAAI,SAAS,OAAQ,MAAM,oBAAoB;IACvH,SAAS,OAAOA,KAAG,MAAM,QAAQ,iBAAiB;GACpD;EACF;EACA,SAAS,eAAe,MAAY,KAAyB;GAC3D,IAAI,IAAI,mBAAmB,QAAQ,OAAOA,KAAG,MAAM,QAAQ,cAAc;GACzE,IAAI,IAAI,mBAAmB,WAAW,OAAOA,KAAG,MAAM,oBAAoB,wCAAwC;GAClH,OAAOA,KAAG,MAAM,MAAM,SAAS;EACjC;EAEA,SAAS,UAAU,EAAE,KAAK,WAAiD;GACzE,MAAM,OAAO,QAAQ;GACrB,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAwB,OAAO,IAAI,QAAQ,kBAAkB,IAAI,QAAQ,kBAAkB,KAAK,EAAE,CAAC;GACpH,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK,GAAG,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAA6B;GAC9E,MAAM,OAAO,OAAO,SAAkC;IACpD,QAAQ,IAAI;IAAG,SAAS,KAAA,CAAS;IACjC,IAAI;KACF,MAAM,WAAW,MAAM,MAAM,iBAAiB;MAAE,QAAQ;MAAQ,aAAa;MAAe,SAAS,EAAE,gBAAgB,mBAAmB;MACxI,MAAM,KAAK,UAAU;OAAE,QAAQ;OAAiB,UAAU,IAAI;OAAU,OAAO,IAAI;OAAO,GAAG;MAAK,CAAC;KAAE,CAAC;KACxG,MAAM,SAAS,MAAM,SAAS,KAAK;KACnC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,OAAO,SAASA,KAAG,MAAM,QAAQ,aAAa,CAAC;KACjF,QAAQ;IACV,SAAS,QAAQ;KAAE,SAAS,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM,CAAC;IAAE,UAC/E;KAAE,QAAQ,KAAK;IAAE;GAC3B;GACA,MAAM,IAAI,IAAI;GACd,MAAM,SAAS,IAAI,SAAS;GAC5B,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;cAAf;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD,EAAA,UAAA,CAAS,IAAI,OAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,IAAI,UAAU,IAAI,OAAO,MAAM,IAAI,SAAS,SAAS,SAAS,eAAe,EAAU,EAAA,CAAA,CAAS,EAAA,CAAA;KAC3H,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;MAAIA,KAAG,MAAM,MAAM,KAAK;MAAE;MAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,SAAS,MAAM,IAAI,IAAI,EAAK,CAAA;MAAE,IAAI,SAAS,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;OAAGA,KAAG,MAAM,OAAO,UAAU;OAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,QAAQ,IAAI,eAAe,EAAK,CAAA;OAAEA,KAAG,MAAM,QAAQ,EAAE;MAAI,EAAA,CAAA;MAC9K,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;OAAQA,KAAG,MAAM,QAAQ,MAAM;OAAE;OAAG,WAAW,MAAM,GAAG;OAAE;OAAIA,KAAG,MAAM,QAAQ,UAAU;OAAE;OAAG,eAAe,MAAM,GAAG;MAAS,EAAA,CAAA;KAAI,EAAA,CAAA;KACpI,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAG,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;MAAQA,KAAG,MAAM,QAAQ,YAAY;MAAE;MAAG,SAAS,OAAO,OAAO,SAAS,KAAK,OAAO,SAAS;MAAG;MAAEA,KAAG,MAAM,WAAW,gBAAgB;MAAE;MAAE,OAAO;MAAS;MAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAM,OAAO;OAAM,QAAO;OAAS,KAAI;iBAAcA,KAAG,MAAM,MAAM,QAAQ;MAAK,CAAA;KAAQ,EAAA,CAAA,EAAI,CAAA;KAC7Q,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;gBAAf;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQA,KAAG,MAAM,MAAM,WAAW,GAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,cAAY,GAAG,IAAI,MAAM;QAAa,UAAU;QAAM,OAAO,IAAI,QAAQ,QAAQ;QAC3H,WAAU,UAAS;SAAE,KAAU;UAAE,MAAM,MAAM,OAAO,SAAS;UAAM,iBAAiB,IAAI,QAAQ,mBAAmB;SAAK,CAAC;QAAE;kBADzF;SAElC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;oBAAIA,KAAG,MAAM,MAAM,SAAS,MAAM,IAAI,SAAS,IAAI,EAAE,IAAI,YAAY,SAAS,MAAM,IAAI,SAAS,IAAI,EAAE,EAAE;SAAU,CAAA;SACjI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;oBAAQA,KAAG,MAAM,qBAAqB,gDAAgD;SAAU,CAAA;SAC9G,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;oBAAMA,KAAG,MAAM,MAAM,IAAI;SAAU,CAAA;SACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;oBAAOA,KAAG,MAAM,qBAAqB,2CAA2C;SAAU,CAAA;QAClG;SAAQ,EAAA,CAAA;OAChB,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQA,KAAG,MAAM,UAAU,gBAAgB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,MAAK;QAAS,KAAI;QAAI,KAAI;QAAK,MAAK;QAAM,UAAU;QAAM,OAAO;QACnH,aAAa,OAAO,EAAE,IAAI,kBAAkB,GAAA,CAAI,QAAQ,CAAC,CAAC;QAAG,WAAU,UAAS,YAAY,MAAM,OAAO,KAAK;QAC9G,cAAc;SAAE,IAAI,aAAa,OAAO,IAAI,QAAQ,kBAAkB,IAAI,QAAQ,kBAAkB,KAAK,EAAE,GACzG,KAAU;UAAE,MAAM,IAAI,QAAQ,QAAQ;UAAM,iBAAiB,WAAW,KAAK,MAAM,OAAO,QAAQ,IAAI,EAAE,IAAI;SAAK,CAAC;QAAE;OAAI,CAAA,CAAQ,EAAA,CAAA;OACpI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,QAAS,CAAC,IAAI,QAAQ,QAAQ,CAAC,IAAI,QAAQ;QAAkB,eAAe;SAAE,YAAY,EAAE;SAAG,KAAU,EAAE,OAAO,KAAK,CAAC;QAAE;kBAAIA,KAAG,MAAM,QAAQ,OAAO;OAAU,CAAA;MAC7L;;KACJ,IAAI,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;gBAAUA,KAAG,MAAM,SAAS,QAAQ,IAAI,UAAU,EAAE,qBAAqB,QAAQ,IAAI,UAAU,EAAE,YAC1H,oCAAoC,QAAQ,IAAI,UAAU,EAAE,qCAAqC,QAAQ,IAAI,UAAU,EAAE,8BAA8B;KAAK,CAAA;KAC7J,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;MAAIA,KAAG,MAAM,MAAM,QAAQ;MAAE;MAAGA,KAAG,MAAM,SAAS,EAAE,SAAS,GAAG,EAAE,MAAM,KAAK,aAAa,EAAE,SAAS,GAAG,EAAE,MAAM,OAAO;MAAG,EAAE,QAAQ,KAAK,KAAK,MAAM,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM;MAAG;MAC3LA,KAAG,MAAM,OAAO,EAAE,MAAM,KAAK,EAAE,SAAS,UAAU,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,oBAAoB,OAAO,OAAO,OAAO,EAAE,gBAAgB,EAAE,UAAU,GAAG,KAAK,IAAI,EAAE,MAAM,UAAU,EAAE,SAAS,QAAQ,OAAO,EAAE,UAAU,EAAE,qCAAqC,EAAE,oBAAoB,OAAO,KAAK,OAAO,EAAE,gBAAgB,EAAE,WAAW,GAAG,IAAI;MACxVA,KAAG,MAAM,cAAc,OAAO,EAAE,cAAc,EAAE,eAAe,OAAO,EAAE,YAAY,EAAE,UAAU,gBAAgB,OAAO,EAAE,cAAc,EAAE,6BAA6B,OAAO,EAAE,YAAY,EAAE,uBAAuB;MACpN,EAAE,SAAS,KAAK,EAAE,WAAW,EAAE,QAAQ,MAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,uBAAuB,0DAA0D,EAAK,CAAA;KAAK,EAAA,CAAA,IACrJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,oCAAoC,oEAAoE,EAAK,CAAA;KAC7H,CAAC,CAAC,IAAI,OAAO,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAG,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;MAAQA,KAAG,MAAM,MAAM,QAAQ;MAAE;MAAG,IAAI,OAAO,KAAK,MAAM,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;OAAe,KAAK,OAAO,MAAM;OAAI,QAAQ,KAAK,UAAU;OAAG,KAAK,MAAM,OAAO;OAAM,IAAI,IAAI,OAAO,SAAS,IAAI,QAAQ;MAAS,EAAA,GAAzH,CAAyH,CAAC;KAAS,EAAA,CAAA,EAAI,CAAA;KAC5O,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;gBAAS;KAAS,CAAA;IACjC;;EACP;;EAGA,SAAgB,YAAY,EAAE,WAAgC;GAC5D,MAAM,OAAO,QAAQ;GACrB,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAkC,GAAG,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAA+B,GAAG,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAA6B;GACnI,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,CAAC;GACtC,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,QAAQ,IAAI,gBAAgB;IAClC,MAAW,GAAG,gBAAgB,cAAc;KAAE,aAAa;KAAe,OAAO;KAAY,QAAQ,MAAM;IAAO,CAAC,CAAC,CACjH,KAAK,OAAM,aAAY;KAAE,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAMA,KAAG,MAAM,YAAY,4BAA4B,CAAC;KAAG,OAAO,SAAS,KAAK;IAAwD,CAAC,CAAC,CAC/L,MAAK,UAAS;KAAE,QAAQ,MAAM,MAAM;KAAG,WAAW,MAAM,OAAO;IAAE,CAAC,CAAC,CACnE,OAAM,WAAU;KAAE,IAAI,CAAC,MAAM,OAAO,SAAS,SAAS,OAAO,MAAM,CAAC;IAAE,CAAC;IAC1E,aAAa,MAAM,MAAM;GAC3B,GAAG;IAAC;IAAS;IAAQ;GAAI,CAAC;GAC1B,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IACL,WAAU;IACV,cAAYA,KAAG,MAAM,QAAQ,iBAAiB;IAC9C,iBAAc;IACd,GAAK,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,WAAU,UAAS;KACjB,IAAI,CAAC,MAAM,UAAU,MAAM,WAAW,MAAM,eAC1C,QAAQ,MAAM,cAAc,IAAI;IAEpC;cATK,CAWL,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAU;eAAnB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;gBACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,iBAAiB,EAAM,CAAA;KACzC,CAAA,GACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,OAAOA,KAAG,MAAM,QAAQ,UAAU,IAAIA,KAAG,MAAM,QAAQ,QAAQ,EAAS,CAAA,GAChF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAuB,eAAY;MAAQ,CAAA,CACvD;OACC;QACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;eAAf;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,kJACX,wWAA2W,EAAK,CAAA;MACjX,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,aAAa,QAAQ,IAAI,kCAAkC,QAAQ,EAAE,EAAS,CAAA,EAAI,CAAA;MACjH,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAK;iBAAS;MAAS,CAAA;MACnC,MAAM,KAAI,QAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;OAAoH;OAAK,eAAe,WAAU,UAAS,QAAQ,CAAC;MAAI,GAAxJ,GAAG,IAAI,SAAS,GAAG,IAAI,MAAM,GAAG,IAAI,QAAQ,QAAQ,GAAG,GAAG,IAAI,QAAQ,mBAAmB,IAA+D,CAAC;KACxL;MACE;;EACX;;;EC3HA,MAAa,cAAc;GACzB,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,MAAM;EACR;EAEA,MAAa,eAAe;GAC1B,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,MAAM;EACR;EAEA,MAAa,WAAW;GACtB,OAAO;GACP,MAAM;GACN,SAAS;GACT,MAAM;GACN,MAAM;GACN,OAAO;GACP,KAAK;GACL,aAAa;GACb,WAAW;GACX,OAAO;GACP,GAAG;GACH,cAAc;GACd,OAAO;GACP,MAAM;GACN,SAAS;GACT,WAAW;GACX,OAAO;GACP,OAAO;EACT;;;;;;;;;;;ECjCA,MAAa,KAAK;;EAGlB,MAAa,KAAK;GAChB,iBAAiB;GACjB,cAAc;GAAM,gBAAgB;GACpC,cAAc;GAAM,YAAY;GAAM,WAAW;GAAM,WAAW;GAAM,aAAa;GAAM,gBAAgB;GAAQ,WAAW;GAAM,aAAa;GAAM,WAAW;GAClK,eAAe;GAAS,gBAAgB;GAAS,gBAAgB;GAAW,eAAe;GAAS,eAAe;GACnH,yBAAyB;GAAe,2BAA2B;GAAe,kBAAkB;GAAQ,oBAAoB;GAChI,eAAe;GACf,aAAa;GAAM,eAAe;GAClC,iBAAiB;GACjB,gBAAgB;GAAM,oBAAoB;GAAO,kBAAkB;GACnE,uBAAuB;GAAS,qBAAqB;GAAU,yBAAyB;GAAO,qBAAqB;GAAa,2BAA2B;GAAsB,gBAAgB;GAAM,gBAAgB;GACxN,eAAe;GAAgB,wBAAwB;GAAyB,wBAAwB;GACxG,4BAA4B;GAA6C,4BAA4B;GAAmB,uBAAuB;GAC/I,mBAAmB;GAAQ,mBAAmB;GAAY,sBAAsB;GAAc,mBAAmB;GACjH,mBAAmB;GAAM,oBAAoB;GAC7C,wBAAwB;GAA8B,0BAA0B;GAA4B,uBAAuB;GACnI,gBAAgB;GAAM,mBAAmB;GAAO,qBAAqB;GACrE,kBAAkB;GAAU,oBAAoB;GAAmB,yBAAyB;GAC5F,yBAAyB;GAAY,mBAAmB;GACxD,kBAAkB;GAAU,gBAAgB;GAAO,mBAAmB;GAAS,qBAAqB;GACpG,gBAAgB;GAAM,qBAAqB;GAC3C,cAAc;GAAM,eAAe;GAAS,UAAU;GACtD,oBAAoB;GAAW,uBAAuB;GACtD,sBAAsB;GACtB,sBAAsB;GACtB,oBAAoB;GAA8B,oBAAoB;GACtE,kBAAkB;GAAW,eAAe;GAAQ,cAAc;GAClE,mBAAmB;GAAW,mBAAmB;GACjD,gBAAgB;GAChB,mBAAmB;GACnB,kBAAkB;GAClB,wBAAwB;GACxB,iBAAiB;GAAQ,mBAAmB;GAC5C,4BAA4B;GAA0B,6BAA6B;GACnF,4BAA4B;GAAiB,0BAA0B;GACvE,2BAA2B;GAA4B,6BAA6B;GACpF,+BAA+B;GAAW,+BAA+B;GAAa,0BAA0B;GAChH,4BAA4B;GAAc,oBAAoB;GAC9D,gBAAgB;GAAK,iBAAiB;GAAM,mBAAmB;GAC/D,oBAAoB;GAAS,mBAAmB;GAAY,0BAA0B;GAAqB,mBAAmB;GAC9H,gBAAgB;GAAS,eAAe;GAAQ,cAAc;GAAO,iBAAiB;GAAU,eAAe;GAC/G,cAAc;GAAS,mBAAmB;GAAQ,mBAAmB;GACrE,gBAAgB;GAAS,gBAAgB;GACzC,eAAe;GACf,uBAAuB;GAAQ,qBAAqB;GACpD,iBAAiB;GAAW,qBAAqB;GAAwC,uBAAuB;GAChH,oBAAoB;GAClB,qBAAqB;GACL,sBAAsB;GACxC,kBAAkB;GAClB,oBAAoB;GACpB,qBAAqB;GACrB,uBAAuB;GACvB,qBAAqB;GACrB,wBAAwB;GACxB,sBAAsB;GACtB,0BAA0B;GAC1B,sBAAsB;GACtB,oBAAoB;GACpB,kBAAkB;GAClB,mBAAmB;GACnB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,yBAAyB;GACzB,mBAAmB;GACnB,iBAAiB;GACjB,oBAAoB;GACpB,kBAAkB;GAClB,qBAAqB;GACrB,uBAAuB;GACvB,kBAAkB;GAClB,qBAAqB;GACrB,kBAAkB;GAClB,qBAAqB;GACrB,yBAAyB;EAC3B;EAKA,MAAa,KAAoB;GAC/B,iBAAiB;GAAe,iBAAiB;GACjD,cAAc;GAAQ,gBAAgB;GACtC,cAAc;GAAW,YAAY;GAAS,WAAW;GAAQ,WAAW;GAAQ,aAAa;GAAU,gBAAgB;GAAc,WAAW;GAAQ,aAAa;GAAU,WAAW;GAC9L,eAAe;GAAe,gBAAgB;GAAgB,gBAAgB;GAAwB,eAAe;GAAqB,eAAe;GACzJ,yBAAyB;GAA4C,2BAA2B;GAA8C,kBAAkB;GAAmB,oBAAoB;GACvM,eAAe;GACf,aAAa;GAAQ,eAAe;GACpC,gBAAgB;GAAS,oBAAoB;GAA2B,kBAAkB;GAC1F,uBAAuB;GAA0B,qBAAqB;GAAiB,yBAAyB;GAAgB,qBAAqB;GAA2B,2BAA2B;GAA8D,gBAAgB;GAAS,gBAAgB;GAClT,eAAe;GAAsB,wBAAwB;GAAkC,wBAAwB;GACvH,4BAA4B;GAAmF,4BAA4B;GAAiD,uBAAuB;GACnN,mBAAmB;GAAiB,mBAAmB;GAAuB,sBAAsB;GAAsC,mBAAmB;GAC7J,mBAAmB;GAAW,oBAAoB;GAClD,wBAAwB;GAAkC,0BAA0B;GAAoC,uBAAuB;GAC/I,gBAAgB;GAAQ,mBAAmB;GAAc,qBAAqB;GAC9E,kBAAkB;GAAsB,oBAAoB;GAAwE,yBAAyB;GAC7J,yBAAyB;GAA4B,mBAAmB;GACxE,kBAAkB;GAAgB,gBAAgB;GAAgB,mBAAmB;GAAmB,qBAAqB;GAC7H,gBAAgB;GAAS,qBAAqB;GAC9C,cAAc;GAAQ,eAAe;GAAe,UAAU;GAC9D,oBAAoB;GAA2B,uBAAuB;GACtE,sBAAsB;GACtB,sBAAsB;GACtB,oBAAoB;GAAoF,oBAAoB;GAC5H,kBAAkB;GAAiC,eAAe;GAAwB,cAAc;GACxG,mBAAmB;GAAwC,mBAAmB;GAC9E,gBAAgB;GAChB,mBAAmB;GACnB,kBAAkB;GAClB,wBAAwB;GACxB,iBAAiB;GAAqB,mBAAmB;GACzD,4BAA4B;GAA4F,6BAA6B;GACrJ,4BAA4B;GAA0C,0BAA0B;GAChG,2BAA2B;GAAkG,6BAA6B;GAC1J,+BAA+B;GAA8B,+BAA+B;GAAgC,0BAA0B;GACtJ,4BAA4B;GAA4C,oBAAoB;GAC5F,gBAAgB;GAAK,iBAAiB;GAAK,mBAAmB;GAC9D,oBAAoB;GAAoB,mBAAmB;GAAoB,0BAA0B;GAA4B,mBAAmB;GACxJ,gBAAgB;GAAoB,eAAe;GAAQ,cAAc;GAAO,iBAAiB;GAAU,eAAe;GAC1H,cAAc;GAA4B,mBAAmB;GAAoB,mBAAmB;GACpG,gBAAgB;GAAqB,gBAAgB;GACrD,eAAe;GACf,uBAAuB;GAAiB,qBAAqB;GAC7D,iBAAiB;GAAe,qBAAqB;GAAmE,uBAAuB;GAC/I,oBAAoB;GAClB,qBAAqB;GACL,sBAAsB;GACxC,kBAAkB;GAClB,oBAAoB;GACpB,qBAAqB;GACrB,uBAAuB;GACvB,qBAAqB;GACrB,wBAAwB;GACxB,sBAAsB;GACtB,0BAA0B;GAC1B,sBAAsB;GACtB,oBAAoB;GACpB,kBAAkB;GAClB,mBAAmB;GACnB,uBAAuB;GACvB,wBAAwB;GACxB,wBAAwB;GACxB,yBAAyB;GACzB,mBAAmB;GACnB,iBAAiB;GACjB,oBAAoB;GACpB,kBAAkB;GAClB,qBAAqB;GACrB,uBAAuB;GACvB,kBAAkB;GAClB,qBAAqB;GACrB,kBAAkB;GAClB,qBAAqB;GACrB,yBAAyB;EAC3B;;;;;;;;;;;;;;;EC1IA,IAAI;EACJ,MAAMC,8BAAY,IAAI,IAAgB;EACtC,MAAM,eAAqB;GAAE,KAAK,MAAM,YAAY,CAAC,GAAGA,WAAS,GAAG,SAAS;EAAE;;EAG/E,SAAgB,cAAc,QAAqC;GACjE,QAAQ;GACR,OAAO;GACP,aAAa;IACX,IAAI,UAAU,QAAQ;IACtB,QAAQ,KAAA;IACR,OAAO;GACT;EACF;EAEA,MAAM,wBACH,OAAO,cAAc,cAAc,OAAO,UAAU,SAAA,CAAU,YAAY,CAAC,CAAC,WAAW,IAAI,IAAI,OAAO;;EAGzG,SAAS,kBAAkB,KAAmB,QAA0C;GAEtF,MAAM,YADc,eAAe,MAAM,OAAO,KAAK,GAAA,CACzB,QAAS,GAA8B,QAAQ;GAC3E,IAAI,WAAW,KAAA,GAAW,OAAO;GACjC,OAAO,SAAS,QAAQ,eAAe,OAAO,SAC5C,OAAO,UAAU,KAAA,IAAY,QAAQ,OAAO,OAAO,KAAK,CAAC;EAC7D;;EAGA,SAAgB,oBAAqF;GACnG,MAAM,GAAG,aAAA,GAAA,MAAA,SAAA,CAAqB,CAAC;GAC/B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,iBAAiB,UAAS,aAAY,WAAW,CAAC;IACxD,YAAU,IAAI,QAAQ;IACtB,MAAM,cAAc,OAAO,UAAU,QAAQ;IAC7C,aAAa;KACX,YAAU,OAAO,QAAQ;KACzB,cAAc;IAChB;GACF,GAAG,CAAC,CAAC;GACL,IAAI,UAAU,KAAA,GAAW,OAAO;GAChC,MAAM,YAAY,MAAM,KAAK,EAAE;GAC/B,QAAQ,KAAmB,WAAqC;IAC9D,MAAM,OAAO,UAAU,KAAK,MAAM;IAClC,OAAO,SAAS,MAAM,kBAAkB,KAAK,MAAM,IAAI;GACzD;EACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECzCA,MAAM,IAAIC,MAAAA;EAIV,MAAM,MAAM;EAyDZ,MAAM,OAAO,IAAI,UAAU,UAAU;EAErC,MAAM,mBAAmB;EAEzB,SAAS,yBAA+C;GACvD,IAAI;IACH,MAAM,MAAM,IAAI,cAAc,QAAQ,gBAAgB;IACtD,IAAI,KAAK;KACR,MAAM,SAAS,KAAK,MAAM,GAAG;KAC7B,IAAI,UAAU,OAAO,WAAW,UAAU,OAAO;IAClD;GACD,QAAQ,CAER;GACA,OAAO;EACR;EAGA,IAAI,cAAoC,uBAAuB;EAE/D,eAAe,YAA2C;GACzD,IAAI;IAGH,MAAM,OAAgC,CAAC;IACvC,IAAI,OAAO,gBAAgB,eAAe,OAAQ,YAAsC,YAAY,YACnG,KAAK,SAAU,YAAqD,QAAQ,GAAI;IAEjF,MAAM,MAAM,MAAM,IAAI,QAAQ,OAAO,8BAA8B,IAAI;IACvE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO;IAC5B,OAAQ,MAAM,IAAI,KAAK;GACxB,QAAQ;IACP,OAAO;GACR;EACD;EAEA,eAAe,SAAS,MAAc,MAA6C;GAClF,IAAI;IACH,MAAM,MAAM,MAAM,IAAI,QAAQ,OAAO,MAAM;KAC1C,QAAQ;KACR,SAAS,EAAE,gBAAgB,mBAAmB;KAC9C,MAAM,KAAK,UAAU,IAAI;IAC1B,CAAC;IACD,IAAI,CAAC,KAAK,OAAO;IACjB,IAAI;KACH,MAAM,UAAU,MAAM,IAAI,KAAK;KAG/B,IAAI,CAAC,IAAI,MAAM,YAAY,QAAQ,OAAO,YAAY,UACrD,OAAO;MAAE,IAAI;MAAO,GAAI;KAAoC;KAE7D,OAAO;IACR,QAAQ;KACP,OAAO,EAAE,IAAI,IAAI,GAAG;IACrB;GACD,QAAQ;IACP,OAAO;GACR;EACD;EAiBA,MAAM,kCAAkB,IAAI,IAAgC;EAC5D,IAAI,kBAAyD;EAC7D,IAAI,qBAAqB;EACzB,IAAI,iBAAiB;EAErB,SAAS,cAAc,GAAyB,GAAkC;GACjF,IAAI,MAAM,GAAG,OAAO;GACpB,IAAI,MAAM,QAAQ,MAAM,MAAM,OAAO;GACrC,IAAI;IACH,OAAO,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;GAC9C,QAAQ;IACP,OAAO;GACR;EACD;EAEA,SAAS,aAAa,IAAyB;GAC9C,cAAc;GACd,IAAI;IACH,IAAI,cAAc,QAAQ,kBAAkB,KAAK,UAAU,EAAE,CAAC;GAC/D,QAAQ,CAER;GACA,KAAK,MAAM,MAAM,CAAC,GAAG,eAAe,GACnC,IAAI;IAAE,GAAG,EAAE;GAAG,QAAQ,CAA+C;EAEvE;EAEA,eAAe,iBAAgC;GAC9C,MAAM,MAAM,EAAE;GACd,MAAM,KAAK,MAAM,UAAU;GAG3B,IAAI,OAAO,QAAQ,QAAQ;QACtB,CAAC,cAAc,aAAa,EAAE,GACjC,aAAa,EAAE;GAAA;EAGlB;EAEA,SAAS,sBAA4B;GACpC,IAAI,oBAAoB,MACvB,IAAI,uBAAuB,KAAM;IAChC,cAAc,eAAe;IAC7B,kBAAkB;GACnB,OACC;GAGF,qBAAqB;GACrB,eAAoB;GACpB,kBAAkB,kBAAkB;IAAE,eAAoB;GAAG,GAAG,GAAI;EACrE;EAEA,SAAS,0BAAgC;GAGxC,IAAI,gBAAgB,SAAS,KAAK,oBAAoB,QAAQ,uBAAuB,KAAM;IAC1F,cAAc,eAAe;IAC7B,qBAAqB;IACrB,kBAAkB,kBAAkB;KAAE,eAAoB;IAAG,GAAG,IAAK;GACtE;EACD;;;;;;;EAQA,SAAS,eAA+E;GACvF,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAA4C,WAAW;GACtE,CAAA,GAAA,MAAA,UAAA,OAAgB;IACf,gBAAgB,IAAI,SAAS;IAC7B,oBAAoB;IACpB,aAAa;KACZ,gBAAgB,OAAO,SAAS;KAChC,wBAAwB;IACzB;GACD,GAAG,CAAC,CAAC;GACL,MAAM,UAAU,YAA2B;IAC1C,MAAM,KAAK,MAAM,UAAU;IAC3B,IAAI,OAAO,QAAQ,CAAC,cAAc,aAAa,EAAE,GAAG,aAAa,EAAE;GACpE;GACA,OAAO;IAAE;IAAQ;GAAQ;EAC1B;;;;EAgFA,SAAS,kBAAkB,GAAkC,cAI3D;GACD,IAAI,CAAC,cAAc,OAAO;IAAE,WAAW;IAAI,SAAS;GAAM;GAC1D,IAAI;IACH,MAAM,IAAI,IAAI,KAAK,YAAY;IAC/B,MAAM,SAAS,EAAE,QAAQ,IAAI,KAAK,IAAI;IAMtC,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,KAAK,UAAU,GAAG,OAAO;KAAE,WAAW;KAAI,SAAS;IAAK;IAEpF,MAAM,YAAY,KAAK,KAAK,SAAS,GAAK;IAC1C,MAAM,OAAO,KAAK,MAAM,YAAY,IAAI;IACxC,MAAM,QAAQ,KAAK,MAAO,YAAY,OAAQ,EAAE;IAChD,MAAM,OAAO,YAAY;IACzB,MAAM,WAAW,QAAQ;IAEzB,MAAM,YAAY,OAAO,IACtB,GAAG,OAAO,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,eAAe,MACxD,QAAQ,IAAI,GAAG,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,iBAAiB,MAAM,GAAG,OAAO,EAAE,iBAAiB;IAC7G,MAAM,KAAK,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG;IAClD,MAAM,KAAK,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG;IAKpD,OAAO;KAAE,WAJS,WACf,GAAG,EAAE,SAAS,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,UAAU,KAC7D,GAAG,GAAG,GAAG,GAAG,IAAI,UAAU;KAET,SAAS;IAAM;GACpC,QAAQ;IACP,OAAO;KAAE,WAAW;KAAI,SAAS;IAAK;GACvC;EACD;;EAMA,SAAS,UAAU,KAAe,OAAO,IAAa;GACrD,OAAO,EAAE,OAAO;IACf,SAAS;IACT,OAAO;IACP,QAAQ;IACR,eAAe;IACf,OAAO;KAAE,SAAS;KAAgB,eAAe;KAAQ,YAAY;IAAE;GACxE,GAAG,EAAE,QAAQ;IAAE,GAAG,YAAY;IAAM,MAAM,aAAa;GAAK,CAAC,CAAC;EAC/D;;EAGA,SAAS,OAAO,KAAgB,OAAO,IAAI,QAAQ,gBAAyB;GAC3E,MAAM,IAAI,SAAS;GACnB,MAAM,WAAW,QAAQ;GACzB,OAAO,EAAE,OAAO;IACf,SAAS;IACT,OAAO;IACP,QAAQ;IACR,eAAe;IACf,OAAO;KAAE,SAAS;KAAgB,eAAe;KAAU,YAAY;IAAE;GAC1E,GAAG,EAAE,QAAQ;IACZ,GAAG;IACH,MAAM,WAAW,QAAQ;IACzB,QAAQ,WAAW,SAAS;IAC5B,gBAAgB,WAAW,KAAA,IAAY;IACvC,kBAAkB,WAAW,KAAA,IAAY;IACzC,mBAAmB,WAAW,KAAA,IAAY;GAC3C,CAAC,CAAC;EACH;EAEA,MAAM,eAA8E;GACnF,QAAQ;GAER,OAAO;GACP,WAAW;GACX,QAAQ;EACT;;;;;EAMA,SAAS,QAAQ,OAAO,IAAa;GACpC,MAAM,MAAM;GACZ,OAAO,EAAE,OAAO;IACf,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,eAAe;IACf,OAAO;KAAE,SAAS;KAAgB,eAAe;KAAU,YAAY;IAAE;GAC1E,GACC,EAAE,QAAQ,MACT,EAAE,kBAAkB;IAAE,IAAI,GAAG,IAAI;IAAO,IAAI;IAAM,IAAI;IAAM,IAAI;IAAM,IAAI;IAAM,eAAe;GAAiB,GAC/G,EAAE,QAAQ;IAAE,QAAQ;IAAM,cAAc;GAAU,CAAC,GACnD,EAAE,QAAQ;IAAE,QAAQ;IAAO,cAAc;GAAU,CAAC,GACpD,EAAE,QAAQ;IAAE,QAAQ;IAAO,cAAc;GAAU,CAAC,GACpD,EAAE,QAAQ;IAAE,QAAQ;IAAQ,cAAc;GAAU,CAAC,CACtD,GACA,EAAE,kBAAkB;IAAE,IAAI,GAAG,IAAI;IAAM,IAAI;IAAK,IAAI;IAAM,IAAI;IAAM,IAAI;IAAM,eAAe;GAAiB,GAC7G,EAAE,QAAQ;IAAE,QAAQ;IAAM,cAAc;GAAU,CAAC,GACnD,EAAE,QAAQ;IAAE,QAAQ;IAAO,cAAc;GAAU,CAAC,GACpD,EAAE,QAAQ;IAAE,QAAQ;IAAO,cAAc;GAAU,CAAC,GACpD,EAAE,QAAQ;IAAE,QAAQ;IAAQ,cAAc;GAAU,CAAC,CACtD,GACA,EAAE,kBAAkB;IAAE,IAAI,GAAG,IAAI;IAAM,IAAI;IAAK,IAAI;IAAM,IAAI;IAAM,IAAI;IAAM,eAAe;GAAiB,GAC7G,EAAE,QAAQ;IAAE,QAAQ;IAAM,cAAc;IAAW,gBAAgB;GAAM,CAAC,GAC1E,EAAE,QAAQ;IAAE,QAAQ;IAAQ,cAAc;IAAW,gBAAgB;GAAM,CAAC,CAC7E,GACA,EAAE,kBAAkB;IAAE,IAAI,GAAG,IAAI;IAAM,IAAI;IAAM,IAAI;IAAM,IAAI;IAAM,IAAI;IAAM,eAAe;GAAiB,GAC9G,EAAE,QAAQ;IAAE,QAAQ;IAAM,cAAc;IAAW,gBAAgB;GAAO,CAAC,GAC3E,EAAE,QAAQ;IAAE,QAAQ;IAAQ,cAAc;IAAW,gBAAgB;GAAO,CAAC,CAC9E,CACD,GACA,EAAE,QAAQ;IACT,GAAG;IACH,QAAQ,QAAQ,IAAI;IACpB,gBAAgB;IAChB,kBAAkB;GACnB,CAAC,GACD,EAAE,UAAU;IAAE,IAAI;IAAI,IAAI;IAAI,GAAG;IAAK,MAAM,QAAQ,IAAI;GAAO,CAAC,GAChE,EAAE,QAAQ;IACT,GAAG;IACH,MAAM,QAAQ,IAAI;GACnB,CAAC,GACD,EAAE,QAAQ;IACT,GAAG;IACH,QAAQ,QAAQ,IAAI;IACpB,gBAAgB;IAChB,kBAAkB;GACnB,CAAC,GACD,EAAE,UAAU;IAAE,IAAI;IAAK,IAAI;IAAM,GAAG;IAAK,MAAM;GAAU,CAAC,GAC1D,EAAE,UAAU;IAAE,IAAI;IAAK,IAAI;IAAM,GAAG;IAAK,MAAM;GAAU,CAAC,GAC1D,EAAE,UAAU;IAAE,IAAI;IAAM,IAAI;IAAM,GAAG;IAAK,MAAM;GAAU,CAAC,GAC3D,EAAE,UAAU;IAAE,IAAI;IAAM,IAAI;IAAM,GAAG;IAAK,MAAM;GAAU,CAAC,CAC5D;EACD;;;;;;;;EASA,SAAS,qBACR,GACA,OACA,WACA,KACA,eAAe,OACL;GACV,MAAM,OAAO,IAAI,OAAO;GACxB,MAAM,KAAK,IAAI,UAAU;GACzB,MAAM,aAAa,MAAM,GAAG,gBAAgB,KAAK,IAAI;GAGrD,MAAM,QAAQ,OAAO,MAAM,sBAAsB,YAAY,OAAO,SAAS,KAAK,iBAAiB;GACnG,MAAM,QAAQ,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,KAAM,oBAAqB,GAAG,CAAC,CAAC,IAAI;GAI/F,MAAM,SAAS,aAAa,EAAE,uBAAuB,IAAI;GACzD,MAAM,MAAM,kBAAkB,GAAG,MAAM,SAAS;GAIhD,MAAM,gBAAgB,IAAI,WAAW,SAAS,SAAS;GAGvD,MAAM,YAAY,OAAO,MAAM,mBAAmB,YAAY,OAAO,SAAS,KAAK,cAAc;GACjG,MAAM,YAAY,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,KAAM,iBAAkB,GAAG,CAAC,CAAC,IAAI;GACpG,MAAM,UAAU,kBAAkB,GAAG,MAAM,eAAe;GAC1D,MAAM,oBAAoB,QAAQ,WAAW,aAAa,aAAa;GAEvE,MAAM,aAAa,QAAgB;IAClC,IAAI,MAAM,GACT,OAAO;KACN,KAAK;KACL,MAAM;KACN,IAAI;KACJ,QAAQ;IACT;IAED,IAAI,OAAO,IACV,OAAO;KACN,KAAK;KACL,MAAM;KACN,IAAI;KACJ,QAAQ;IACT;IAED,IAAI,OAAO,IACV,OAAO;KACN,KAAK;KACL,MAAM;KACN,IAAI;KACJ,QAAQ;IACT;IAED,OAAO;KACN,KAAK;KACL,MAAM;KACN,IAAI;KACJ,QAAQ;IACT;GACD;GAEA,MAAM,MAAM,UAAU,KAAK;GAC3B,MAAM,UAAU,UAAU,SAAS;GAEnC,MAAM,cAAc,YAAoB,SAAiB,GAA8D,UAAkB,aAAsB,aAAsB;IACpL,MAAM,YAAY,UAAU,KAAK;IACjC,MAAM,cAAc,OAAO,gBAAgB,WACxC,IAAI,cAAc,IAAA,CAAK,QAAQ,CAAC,EAAE,UAAU,YAAY,GAAG,WAAW,aAAa,aAAa,OAChG,WAAW,KAAK,aAAa,KAAA;IAChC,OAAO,EAAE,OAAO,EAAE,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,UAAU;KAAU,QAAQ;IAAQ,EAAE,GACvG,EAAE,QAAQ,EAAE,OAAO;KAAE,OAAO;KAAQ,OAAO;KAAgC,UAAU;KAAQ,YAAY;KAAK,YAAY;IAAE,EAAE,GAAG,UAAU,GAC3I,EAAE,OAAO;KACR,WAAW,YAAY,sBAAsB;KAC7C,OAAO,EAAE;IACV,GACC,EAAE,OAAO;KACR,WAAW;KACX,OAAO;MACN,OAAO,GAAG,UAAU,IAAI,MAAM,QAAQ;MACtC,QAAQ;MACR,YAAY,EAAE;MACd,cAAc;KACf;IACD,CAAC,CACF,GACA,EAAE,OAAO,EAAE,OAAO;KAAE,SAAS;KAAe,YAAY;KAAU,KAAK;KAAO,UAAU;KAAS,gBAAgB;KAAY,YAAY;IAAE,EAAE,GAC5I,EAAE,QAAQ;KACT,OAAO;KACP,OAAO;MACN,SAAS;MACT,cAAc;MACd,YAAY,EAAE;MACd,OAAO,EAAE;MACT,QAAQ,aAAa,EAAE;MACvB,YAAY;MACZ,UAAU;MACV,YAAY;MACZ,QAAQ,cAAc,SAAS;KAChC;IACD,GAAG,UAAU,IAAI,MAAM,GAAG,QAAQ,EAAE,GACpC,WAAW,EAAE,QAAQ,EAAE,OAAO;KAAE,OAAO;KAA6B,UAAU;KAAQ,YAAY;IAAI,EAAE,GAAG,KAAK,UAAU,IAAI,IAC/H,CACD;GACD;GAEA,OAAO,EAAE,OAAO,EAAE,OAAO;IAAE,QAAQ;IAAS,SAAS;IAAY,YAAY;IAAwB,cAAc;IAAO,QAAQ;GAAkC,EAAE,GACrK,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,KAAK;IAAO,YAAY;IAAK,UAAU;IAAU,cAAc;IAAO,OAAO;GAA0B,EAAE,GACnK,UAAU,aAAa,YAAY,EAAE,GACrC,EAAE,QAAQ,MAAM,KAAK,CACtB,GAGC,cAAc,WAAW,QAAS,WAAW,EAAE,gBAAgB,GAAG,OAAO,KAAK,IAAI,YAAY,IAAI,YAAY,SAAS,gBAAgB,EAAE,mBAAmB,IAAI,SAAS,OAAO,QAAQ,QAAQ,EAAE,GAAG,MAAM,mBAAmB,MAAM,SAAS,IAAI,MAClP,WAAW,EAAE,cAAc,GAAG,WAAW,SAAS,QAAQ,YAAY,QAAQ,YAAY,oBAAoB,EAAE,mBAAmB,IAAI,IAAI,MAAM,gBAAgB,MAAM,eAAe,CACvL;EACD;;;;;;;;;;EAWA,MAAa,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuW/B,MAAM,IAA6C;GAClD,WAAW;IACV,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,OAAO;GACR;GACA,YAAY;IACX,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,cAAc;IACd,OAAO;IACP,WAAW;GACZ;GACA,cAAc;IACb,SAAS;IACT,YAAY;IACZ,KAAK;IACL,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,SAAS;IACT,cAAc;IACd,UAAU;IACV,YAAY;GACb;GACA,UAAU;IACT,SAAS;IACT,YAAY;IACZ,KAAK;IACL,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,SAAS;IACT,cAAc;IACd,UAAU;IACV,YAAY;GACb;GACA,YAAY;IACX,SAAS;IACT,YAAY;IACZ,KAAK;IACL,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,SAAS;IACT,cAAc;IACd,UAAU;IACV,YAAY;GACb;GACA,cAAc;IACb,SAAS;IACT,YAAY;IACZ,KAAK;IACL,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,SAAS;IACT,cAAc;IACd,UAAU;IACV,YAAY;GACb;GACA,MAAM;IACL,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,SAAS;IACT,cAAc;IACd,OAAO;IACP,WAAW;IACX,YAAY;GACb;GACA,aAAa;IACZ,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,SAAS;IACT,cAAc;IACd,OAAO;IACP,WAAW;IACX,YAAY;GACb;GACA,UAAU;IACT,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,SAAS;IACT,WAAW;GACZ;GACA,eAAe;IACd,MAAM;IACN,QAAQ;IACR,cAAc;IACd,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,QAAQ;GACT;GACA,KAAK;IACJ,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;GACb;GACA,YAAY;IACX,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,WAAW;GACZ;GACA,WAAW;IACV,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;GACb;GACA,OAAO;IACN,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;GACb;GACA,cAAc;IACb,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;GACb;GACA,UAAU;IACT,SAAS;IACT,YAAY;IACZ,cAAc;IACd,SAAS;IACT,QAAQ;GACT;GACA,QAAQ;IACP,SAAS;IACT,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;GACb;GACA,cAAc;IACb,SAAS;IACT,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,WAAW;GACZ;GACA,OAAO;IACN,MAAM;IACN,SAAS;IACT,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,UAAU;IACV,SAAS;GACV;GACA,OAAO;IAAE,OAAO;IAA4B,UAAU;GAAS;GAC/D,cAAc;IACb,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,SAAS;IACT,cAAc;IACd,cAAc;IACd,UAAU;IACV,YAAY;GACb;GACA,WAAW;IACV,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,SAAS;IACT,cAAc;IACd,OAAO;GACR;EACD;;;;;EAuCA,SAAgB,WAAW,OAA0C;GACnE,MAAM,IAAI,kBAAkB;GAC5B,MAAM,EAAE,QAAQ,YAAY,aAAa;GACzC,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,CAA0B,EAAE;GAC/C,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAAmD,CAAC,CAAC;GACzE,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,SAAA,CAA6C,IAAI;GACxE,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAA6B,KAAK;GACxD,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAA6B,EAAE;GACrD,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAA4C,IAAI;GACtE,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAyC,IAAI;GAC3D,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,SAAA,CAAuD,CAAC,CAAC;GAChF,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAA6B,EAAE;GACrD,MAAM,CAAC,oBAAoB,0BAAA,GAAA,MAAA,SAAA,CAAiD,IAAI;GAMhF,MAAM,GAAG,gBAAA,GAAA,MAAA,SAAA,CAAwB,CAAC;GAClC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACf,MAAM,QAAQ,kBAAkB,aAAa,MAAM,IAAI,CAAC,GAAG,GAAM;IACjE,aAAa,cAAc,KAAK;GACjC,GAAG,CAAC,CAAC;GAEL,MAAM,kBAAA,GAAA,MAAA,OAAA,CAAwB,KAAK;GACnC,MAAM,eAAe,SAA0B;IAC9C,MAAM,MAAM,aAAa,QAAQ;IACjC,OAAO,QAAQ,OAAO,KAAK,EAAE,GAAG,IAAI,EAAE,kBAAkB;GACzD;GACA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACf,IAAI,CAAC,iBAAiB,CAAC,eAAe,SAAS;IAC/C,MAAM,KAAK,QAAQ;IACnB,IAAI,CAAC,IAAI;IACT,IAAI,GAAG,UAAU,QAAQ;KACxB,eAAe,UAAU;KACzB,iBAAiB,KAAK;KACtB,iBAAiB,EAAE;KACnB,cAAc,EAAE;KAChB,iBAAiB,EAAE;KACnB,UAAU,YAAY,GAAG,IAAI,GAAG,SAAS;IAC1C,OAAO,IAAI,GAAG,UAAU,UAAU;KACjC,eAAe,UAAU;KACzB,UAAU,YAAY,GAAG,IAAI,GAAG,OAAO;IACxC;GAED,GAAG;IAAC;IAAe,QAAQ,UAAU;IAAO,QAAQ,UAAU;GAAI,CAAC;GAEnE,MAAM,iBAAA,GAAA,MAAA,OAAA,CAA6D,IAAI;GACvE,CAAA,GAAA,MAAA,UAAA,aAAsB;IAIrB,IAAI,cAAc,YAAY,MAAM,aAAa,cAAc,OAAO;GACvE,GAAG,CAAC,CAAC;GACL,MAAM,aAAa,MAAc,OAA4B,WAAW;IACvE,SAAS;KAAE;KAAM;KAAM,IAAI,KAAK,IAAI;IAAE,CAAC;IACvC,IAAI,cAAc,YAAY,MAAM,aAAa,cAAc,OAAO;IACtE,cAAc,UAAU,iBAAiB;KACxC,cAAc,UAAU;KACxB,UAAU,SAAU,SAAS,QAAQ,KAAK,SAAS,OAAO,OAAO,IAAK;IACvE,GAAG,GAAI;GACR;GAEA,MAAM,qBAA2B;IAChC,UAAU,EAAE,kBAAkB,GAAG,OAAO;GACzC;GAEA,MAAM,wBAAwB,YAA2B;IACxD,iBAAiB,eAAe;IAChC,MAAM,QAAQ,WAAW,KAAK;IAC9B,MAAM,WAAW,cAAc,KAAK;IACpC,MAAM,MAAM,MAAM,SAAS,sCAAsC;KAChE,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;KACzB,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;IAChC,CAAC;IACD,iBAAiB,IAAI;IACrB,IAAI,OAAO,IAAI,IAAI;KAClB,eAAe,UAAU;KACzB,MAAM,QAAQ;KACd,IAAI,IAAI,eACP,UAAU,EAAE,oBAAoB,GAAG,MAAM;UAEzC,UAAU,EAAE,oBAAoB,GAAG,MAAM;IAE3C,OACC,UAAU,KAAK,OAAO,YAAY,IAAI,IAAI,IAAI,EAAE,kBAAkB,GAAG,OAAO;GAE9E;GAEA,MAAM,2BAA2B,YAA2B;IAC3D,IAAI,CAAC,cAAc,KAAK,GAAG;IAC3B,iBAAiB,kBAAkB;IACnC,MAAM,MAAM,MAAM,SAAS,yCAAyC,EAAE,MAAM,cAAc,KAAK,EAAE,CAAC;IAClG,iBAAiB,IAAI;IACrB,IAAI,OAAO,IAAI,IAAI;KAClB,eAAe,UAAU;KACzB,iBAAiB,EAAE;KACnB,cAAc,EAAE;KAChB,iBAAiB,EAAE;KACnB,iBAAiB,KAAK;KACtB,MAAM,QAAQ;KACd,UAAU,YAAY,IAAI,IAAI,GAAG,SAAS;IAC3C,OACC,UAAU,YAAY,KAAK,IAAI,GAAG,OAAO;GAE3C;GAEA,MAAM,yBAAyB,YAA2B;IACzD,eAAe,UAAU;IACzB,MAAM,SAAS,uCAAuC,CAAC,CAAC;IACxD,iBAAiB,EAAE;IACnB,cAAc,EAAE;IAChB,iBAAiB,EAAE;IACnB,iBAAiB,KAAK;IACtB,MAAM,QAAQ;GACf;GAEA,MAAM,kBAAkB,OAAO,WAAoC;IAClE,iBAAiB,cAAc;IAC/B,MAAM,MAAM,MAAM,SAAS,oCAAoC,EAAE,KAAK,OAAO,CAAC;IAC9E,iBAAiB,IAAI;IACrB,IAAI,OAAO,IAAI,IAAI;KAClB,MAAM,QAAQ;KACd,UAAU,EAAE,mBAAmB,GAAG,SAAS;IAC5C,OACC,aAAa;GAEf;GAEA,MAAM,cAAc,OAAO,OAAe,UAAiC;IAC1E,MAAM,OAAO,QAAQ,MAAM,YAAY,CAAC,EAAA,CAAG,KAAK,MAAM,EAAE,EAAE;IAC1D,MAAM,MAAM,IAAI,QAAQ,KAAK;IAC7B,IAAI,QAAQ,IAAI;IAChB,MAAM,SAAS,MAAM;IACrB,IAAI,SAAS,KAAK,UAAU,IAAI,QAAQ;IACxC,MAAM,CAAC,SAAS,IAAI,OAAO,KAAK,CAAC;IACjC,IAAI,OAAO,IAAI,OAAO,QAAQ,GAAG,KAAK;IACtC,MAAM,gBAAgB,GAAG;GAC1B;GAEA,MAAM,SAAS,OAAO,KAAa,UAAkC;IACpE,iBAAiB,UAAU,KAAK;IAChC,MAAM,MAAM,MAAM,SAAS,8BAA8B;KAAE;KAAK;IAAM,CAAC;IACvE,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO;KACtC,iBAAiB,IAAI;KACrB,aAAa;KACb;IACD;IACA,MAAM,QAAQ;IACd,iBAAiB,IAAI;GACtB;GAEA,MAAM,oBAAA,GAAA,MAAA,OAAA,CAA8C,IAAI;GACxD,MAAM,oBAAoB,OAAO,IAAY,SAAiC;IAI7E,MAAM,OAAO,IAAI,IAAI,iBAAiB,WAAW,QAAQ,gBAAgB,CAAC,CAAC;IAC3E,IAAI,MAAM,KAAK,IAAI,EAAE;SAAQ,KAAK,OAAO,EAAE;IAC3C,iBAAiB,UAAU;IAC3B,IAAI;KACH,MAAM,OAAO,gBAAgB,MAAM,KAAK,IAAI,CAAC;IAC9C,UAAU;KACT,IAAI,iBAAiB,YAAY,MAAM,iBAAiB,UAAU;IACnE;GACD;GAEA,MAAM,mBAAmB,OAAO,OAA8B;IAC7D,sBAAsB,EAAE;IACxB,iBAAiB,UAAU,IAAI;IAC/B,IAAI;KACH,MAAM,MAAM,MAAM,SAAS,uCAAuC,EAAE,GAAG,CAAC;KACxE,IAAI,OAAO,IAAI,IAAI;MAClB,MAAM,QAAQ;MACd,UAAU,EAAE,mBAAmB,GAAG,SAAS;KAC5C,OAAO;MACN,sBAAsB,IAAI;MAC1B,UAAU,KAAK,SAAS,EAAE,yBAAyB,GAAG,OAAO;KAC9D;IACD,QAAQ;KACP,sBAAsB,IAAI;KAC1B,UAAU,EAAE,yBAAyB,GAAG,OAAO;IAChD,UAAU;KACT,sBAAsB,IAAI;KAC1B,iBAAiB,IAAI;IACtB;GACD;GAEA,MAAM,gBAAgB,OAAO,IAAY,UAAiC;IACzE,iBAAiB,UAAU,IAAI;IAC/B,MAAM,MAAM,MAAM,SAAS,mCAAmC,EAAE,GAAG,CAAC;IACpE,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO;KACtC,iBAAiB,IAAI;KACrB,aAAa;KACb;IACD;IACA,MAAM,QAAQ;IACd,iBAAiB,IAAI;IACrB,UAAU,EAAE,mBAAmB,EAAE,MAAM,CAAC,GAAG,MAAM;GAClD;GAEA,MAAM,uBAAuB,OAAO,QAAuC;IAC1E,MAAM,YAAY,CAAC,IAAI;IACvB,iBAAiB,UAAU,IAAI,IAAI;IACnC,MAAM,MAAM,MAAM,SAAS,mCAAmC;KAAE,IAAI,IAAI;KAAI,SAAS;IAAU,CAAC;IAChG,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO;KACtC,iBAAiB,IAAI;KACrB,aAAa;KACb;IACD;IACA,MAAM,QAAQ;IACd,iBAAiB,IAAI;IACrB,MAAM,gBAAgB,IAAI,iBAAiB,KAAA,KAAa,IAAI,cAAc,IAAI,UAAU;IACxF,MAAM,eAAe,IAAI,gBAAgB,gBACtC,IAAI,aAAa,EAAE,sBAAsB,IAAI,IAAI,QACjD,IAAI;IACP,UAAU,EAAE,YAAY,yBAAyB,yBAAyB,EAAE,OAAO,aAAa,CAAC,GAAG,SAAS;GAC9G;GAEA,MAAM,eAAe,OAAO,OAA+B;IAC1D,iBAAiB,KAAK,WAAW,OAAO,aAAa;IACrD,IAAI;KACH,MAAM,MAAM,MAAM,SAAS,0CAA0C,EAAE,GAAG,CAAC;KAC3E,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO;MACtC,aAAa;MACb;KACD;KACA,MAAM,QAAQ;KACd,UAAU,EAAE,iBAAiB,GAAG,SAAS;IAC1C,UAAU;KACT,iBAAiB,IAAI;IACtB;GACD;GAEA,MAAM,gBAAgB,OAAO,OAA+B;IAC3D,iBAAiB,KAAK,UAAU,OAAO,YAAY;IACnD,IAAI;KACH,MAAM,MAAM,MAAM,SAAS,mCAAmC;MAC7D;MACA,OAAO;MACP,GAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK;KAC3B,CAAC;KACD,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO;MACtC,aAAa;MACb;KACD;KACA,MAAM,QAAQ;KACd,MAAM,UAAiB,MAAM,QAAQ,IAAI,OAAO,IAAI,IAAI,UAAU,CAAC;KACnE,MAAM,eAAe,QAAQ,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC;KAGtD,MAAM,eAAe,QAAQ,QAAQ,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;KACpE,MAAM,cAAc,QAAQ,SAAS,eAAe;KACpD,IAAI,eAAe,GAClB,UAAU,KAAK,EAAE,gBAAgB,IAAI,EAAE,mBAAmB,GAAG,SAAS;UAChE,IAAI,eAAe,KAAK,gBAAgB,GAC9C,UAAU,EAAE,gBAAgB,GAAG,MAAM;UAErC,aAAa;IAEf,UAAU;KACT,iBAAiB,IAAI;IACtB;GACD;GAEA,MAAM,YAAY,OAAO,OAA8B;IACtD,iBAAiB,SAAS,IAAI;IAC9B,MAAM,WAAW,YAAY;IAC7B,MAAM,MAAM,MAAM,SAAS,kCAAkC;KAAE;KAAI;IAAS,CAAC;IAC7E,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO;KACtC,iBAAiB,IAAI;KACrB,aAAa;KACb;IACD;IACA,kBAAkB,IAAI;IACtB,MAAM,QAAQ;IACd,iBAAiB,IAAI;IACrB,UAAU,EAAE,aAAa,GAAG,SAAS;GACtC;GAEA,MAAM,UAAU,OAAO,SAAgC;IACtD,iBAAiB,QAAQ,MAAM;IAC/B,MAAM,MAAM,MAAM,SAAS,iCAAiC,EAAE,KAAK,CAAC;IACpE,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO;KACtC,iBAAiB,IAAI;KACrB,aAAa;KACb;IACD;IACA,MAAM,QAAQ;IACd,iBAAiB,IAAI;GACtB;GAEA,MAAM,gBAAgB,OAAO,OAA+B;IAC3D,iBAAiB,KAAK,iBAAiB,OAAO,mBAAmB;IACjE,MAAM,MAAM,MAAM,SAAS,2CAA2C,EAAE,GAAG,CAAC;IAC5E,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO;KACtC,iBAAiB,IAAI;KACrB,aAAa;KACb;IACD;IACA,MAAM,QAAQ;IACd,iBAAiB,IAAI;IACrB,UAAU,EAAE,uBAAuB,GAAG,SAAS;GAChD;GAEA,MAAM,gBAAgB,UAAkB;IACvC,mBAAmB,UAAU;KAAE,GAAG;MAAO,QAAQ,CAAC,KAAK;IAAO,EAAE;GACjE;GAEA,MAAM,YAAY,QAAQ,MAAM,SAAS;GACzC,MAAM,OAAO,QAAQ;GACrB,MAAM,gBAAgB,QAAQ,iBAAiB,CAAC;GAChD,MAAM,iBAAiB,IAAI,IAAI,QAAQ,gBAAgB,CAAC,CAAC;GACzD,MAAM,WAAW,MAAM,YAAY,CAAC;GACpC,MAAM,WAAW,cAAc,QAAQ,SAAS,SAAS;GAOzD,MAAM,SAAS,kBAAkB;;GAEjC,MAAM,qBAAqB,KAAqB,WAC/C,kBAAkB,GAAG,OAAO,GAAG,IAAI;GAEjB,UAAW,eAAe,SAAS,GAAG;GAEzD,MAAM,sBAAsB,EAAE,QAAQ,EAAE,WAAW,cAAc,CAAC;GAElE,MAAM,0BAA0B;IAC/B,IAAI,CAAC,OAAO,OAAO;IAOnB,MAAM,QAAQ;KALb,SAAS;MAAE,YAAY;MAA+B,QAAQ;MAA6C,OAAO;KAAgC;KAClJ,MAAM;MAAE,YAAY;MAA4B,QAAQ;MAA0C,OAAO;KAA6B;KACtI,MAAM;MAAE,YAAY;MAA4B,QAAQ;MAA0C,OAAO;KAA6B;KACtI,OAAO;MAAE,YAAY;MAA6B,QAAQ;MAA2C,OAAO;KAA8B;IAEpH,EAAE,MAAM;IAC/B,OAAO,EAAE,OAAO,EAAE,OAAO;KAAE,GAAG,EAAE;KAAc,GAAG;IAAM,EAAE,GACxD,EAAE,OAAO,EAAE,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,YAAY;IAAI,EAAE,GACxF,OAAO,MAAM,SAAS,YAAY,UAAU,MAAM,SAAS,WAAW,MAAM,SAAS,SAAS,UAAU,SAAS,IAAI,MAAM,KAAK,GAChI,EAAE,QAAQ,MAAM,MAAM,IAAI,CAC3B,GACA,EAAE,UAAU;KACX,MAAM;KACN,OAAO;MAAE,YAAY;MAAe,QAAQ;MAAQ,OAAO;MAAW,QAAQ;MAAW,SAAS;MAAS,SAAS;MAAK,SAAS;MAAe,YAAY;KAAS;KACtK,eAAe,SAAS,IAAI;KAC5B,cAAc,EAAE,iBAAiB;IAClC,GAAG,OAAO,KAAK,EAAE,CAAC,CACnB;GACD;GAMA,MAAM,kBAAkB,OAAe,WAAwD,QAC9F,qBACC,GACA,OACA,WACA,KACA,kBAAkB,iBAAiB,kBAAkB,WAAW,IAAI,IACrE;GAKD,MAAM,wBAAwB,MAAM,mBAAmB,MAAM,uBAAuB,MAAM,kBAAkB,UAAU,MAAM;GAC5H,MAAM,kBAAkB,sBAAsB;GAC9C,MAAM,uBAAuB,SAAS,KAAK,QAAwB;IAClE,MAAM,YAAY,IAAI,OAAO,MAAM;IACnC,MAAM,cAAc,OAAO,QAAQ,IAAI,SAAS,CAAC,CAAC,MAAM,GAAG,QAAQ,MAAM,GAAG,gBAAgB,KAAK,IAAI,CAAC;IACtG,MAAM,iBAAiB,IAAI;IAC3B,MAAM,UAAU,IAAI,WAAW,CAAC,kBAAkB,oBAAoB,KAAA,KAAa,oBAAoB,IAAI;IAC3G,MAAM,WAAW,CAAC,IAAI,UAAU,YAAY,iBAAiB,YAAY,cAAc,YAAY;IACnG,MAAM,iBAAiB,mBAAmB,IAAI;IAC9C,MAAM,aAAa,eAAe,IAAI,OAAO;IAC7C,MAAM,WAAW,SAAS,QAAQ,GAAG;IAErC,MAAM,YAAY;KACjB,GAAG,EAAE;KACL,QAAQ;KACR,SAAS;KACT,cAAc;KACd,GAAI,CAAC,IAAI,UAAU,EAAE,SAAS,IAAK,IAAI,CAAC;IACzC;IAEA,MAAM,gBAAgB,IAAI,iBAAiB,KAAA,KAAa,IAAI,cAAc,IAAI,UAAU;IACxF,MAAM,eAAe,IAAI,gBAAgB,gBACtC,IAAI,aAAa,EAAE,sBAAsB,IAAI,EAAE,wBAAwB,EAAE,QAAQ,WAAW,EAAE,CAAC,IAC/F,IAAI;IAEP,MAAM,eAAe,IAAI,OAAO,QAAQ,UAAU,CAAC;IACnD,MAAM,cAAc,IAAI,OAAO,OAAO,UAAU,CAAC;IACjD,MAAM,kBAAkB,IAAI,OAAO,WAAW,UAAU,CAAC;IACzD,MAAM,eAAe,IAAI,OAAO,QAAQ,UAAU,CAAC;IACnD,MAAM,iBAA8D;KACnE,GAAG,aAAa,KAAK,OAAO;MAAE,QAAQ;MAAU,OAAO;KAAE,EAAE;KAC3D,GAAG,YAAY,KAAK,OAAO;MAAE,QAAQ;MAAS,OAAO;KAAE,EAAE;KACzD,GAAG,gBAAgB,KAAK,OAAO;MAAE,QAAQ;MAAa,OAAO;KAAE,EAAE;KACjE,GAAG,aAAa,KAAK,OAAO;MAAE,QAAQ;MAAU,OAAO;KAAE,EAAE;IAC5D;IAEA,OAAO,EAAE,OAAO;KACf,KAAK,IAAI;KACT,WAAW;KACX,OAAO;IACR,GAEC,EAAE,OAAO,EACR,OAAO;KACN,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,YAAY;KACZ,KAAK;KACL,cAAc;IACf,EACD,GACC,EAAE,OAAO,EAAE,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,UAAU;KAAQ,MAAM;KAAK,UAAU;IAAE,EAAE,GACjH,EAAE,QAAQ;KACT,OAAO;MACN,GAAG,EAAE;MACL,YAAY;MACZ,UAAU;MACV,SAAS;MACT,YAAY,YAAY,gCAAgC;MACxD,OAAO,YAAY,kCAAkC;MACrD,aAAa,YAAY,oCAAoC;KAC9D;KACA,OAAO,QAAQ,WAAW;IAC3B,GAAG,IAAI,WAAW,GAAG,GACrB,SAAS,SAAS,IAAI,EAAE,OAAO,EAC9B,OAAO;KAAE,SAAS;KAAe,KAAK;KAAO,YAAY;IAAS,EACnE,GACC,WAAW,IAAI,EAAE,UAAU;KAC1B,MAAM;KACN,WAAW;KACX,OAAO;MAAE,GAAG,EAAE;MAAO,SAAS;MAAW,UAAU;MAAQ,YAAY;MAAG,QAAQ;KAAO;KACzF,OAAO,EAAE,gBAAgB;KACzB,eAAe,KAAK,YAAY,IAAI,IAAI,EAAE;IAC3C,GAAG,OAAO,WAAW,EAAE,CAAC,IAAI,MAC5B,WAAW,SAAS,SAAS,IAAI,EAAE,UAAU;KAC5C,MAAM;KACN,WAAW;KACX,OAAO;MAAE,GAAG,EAAE;MAAO,SAAS;MAAW,UAAU;MAAQ,YAAY;MAAG,QAAQ;KAAO;KACzF,OAAO,EAAE,kBAAkB;KAC3B,eAAe,KAAK,YAAY,IAAI,IAAI,CAAC;IAC1C,GAAG,OAAO,aAAa,EAAE,CAAC,IAAI,IAC/B,IAAI,MACJ,EAAE,QAAQ;KACT,WAAW;KACX,OAAO;MAAE,YAAY;MAAU,WAAW,WAAW,SAAS;MAAK,YAAY;KAAM;IACtF,CAAC,GACD,EAAE,QAAQ;KACT,OAAO;MACN,YAAY;MACZ,UAAU;MACV,OAAO;MACP,YAAY;KACb;KACA,OAAO;IACR,GAAG,YAAY,GACf,EAAE,QAAQ,EACT,OAAO;KACN,GAAG,EAAE;KACL,YAAY;KACZ,OAAO;KACP,aAAa;KACb,UAAU;KACV,SAAS;KACT,YAAY;IACb,EACD,GAAG,KAAK,GACR,iBAAiB,EAAE,QAAQ,EAC1B,OAAO;KACN,GAAG,EAAE;KACL,YAAY;KACZ,OAAO;KACP,aAAa;KACb,KAAK;KACL,UAAU;KACV,SAAS;KACT,YAAY;IACb,EACD,GAAG,OAAO,SAAS,IAAI,SAAS,GAAG,EAAE,qBAAqB,CAAC,IAAI,MAC/D,cAAc,EAAE,QAAQ,EACvB,OAAO;KACN,GAAG,EAAE;KACL,YAAY;KACZ,OAAO;KACP,aAAa;KACb,KAAK;KACL,UAAU;KACV,SAAS;KACT,YAAY;IACb,EACD,GAAG,OAAO,SAAS,IAAI,SAAS,GAAG,KAAK,IAAI,MAC5C,IAAI,QAAQ,EAAE,QAAQ;KACrB,OAAO;MACN,GAAG,EAAE;MACL,YAAY;MACZ,OAAO;MACP,aAAa;MACb,KAAK;MACL,UAAU;MACV,SAAS;MACT,YAAY;KACb;KACA,OAAO,IAAI;IACZ,GAAG,OAAO,QAAQ,IAAI,6BAA6B,GAAG,IAAI,KAAK,IAAI,MACnE,UAAU,EAAE,QAAQ;KACnB,OAAO;MACN,GAAG,EAAE;MACL,YAAY;MACZ,OAAO;MACP,aAAa;MACb,KAAK;MACL,UAAU;MACV,SAAS;MACT,YAAY;KACb;KACA,OAAO,EAAE,cAAc;IACxB,GAAG,OAAO,OAAO,IAAI,SAAS,GAAG,EAAE,cAAc,CAAC,IAAI,aAC/C;KACN,MAAM,iBAAiB,IAAI,YAAY,MAAM;KAC7C,OAAO,iBAAiB,EAAE,QAAQ;MACjC,OAAO;OACN,GAAG,EAAE;OACL,YAAY;OACZ,OAAO;OACP,aAAa;OACb,KAAK;OACL,UAAU;OACV,SAAS;MACV;MACA,OAAO;KACR,GAAG,OAAO,SAAS,IAAI,6BAA6B,GAAG,EAAE,cAAc,CAAC,IAAI;IAC7E,EAAA,CAAG,GACH,CAAC,IAAI,UAAU,EAAE,QAAQ;KACxB,OAAO;MACN,GAAG,EAAE;MACL,YAAY;MACZ,OAAO;MACP,aAAa;MACb,KAAK;MACL,UAAU;MACV,SAAS;MACT,YAAY;KACb;KACA,OAAO,EAAE,iBAAiB;IAC3B,GAAG,OAAO,SAAS,IAAI,SAAS,GAAG,EAAE,iBAAiB,CAAC,IAAI,IAC5D,GACA,EAAE,OAAO,EACR,OAAO;KAAE,SAAS;KAAQ,KAAK;KAAO,YAAY;KAAU,YAAY;IAAE,EAC3E,GACC,EAAE,UAAU;KACX,MAAM;KACN,WAAW;KACX,OAAO,IAAI,UACR;MAAE,GAAG,EAAE;MAAO,KAAK;MAAO,UAAU;MAAQ,SAAS;KAAU,IAC/D;MAAE,GAAG,EAAE;MAAc,KAAK;MAAO,UAAU;MAAQ,SAAS;KAAU;KACzE,OAAO,IAAI,UAAU,EAAE,sBAAsB,IAAI,EAAE,qBAAqB;KACxE,UAAU,kBAAkB,KAAK,QAAQ;KACzC,eAAe,KAAK,qBAAqB,GAAG;IAC7C,GAAG,kBAAkB,UAAU,IAAI,OAChC,CAAC,cAAc,GAAG,IAAI,UAAU,EAAE,iBAAiB,IAAI,EAAE,gBAAgB,CAAC,IAC1E,CAAC,OAAO,SAAS,IAAI,IAAI,UAAU,8BAA8B,SAAS,GAAG,IAAI,IAAI,UAAU,EAAE,iBAAiB,IAAI,EAAE,gBAAgB,GAAG,CAAC,GAC/I,EAAE,UAAU;KACX,MAAM;KACN,WAAW;KACX,OAAO;MAAE,GAAG,EAAE;MAAO,KAAK;MAAO,UAAU;MAAQ,SAAS;MAAW,UAAU;MAAQ,gBAAgB;KAAS;KAClH,OAAO,EAAE,mBAAmB;KAC5B,UAAU,kBAAkB,KAAK,SAAS;KAC1C,eAAe,KAAK,aAAa,IAAI,EAAE;IACxC,GAAG,kBAAkB,WAAW,IAAI,OAAO,CAAC,cAAc,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,WAAW,EAAE,GAAG,IAAI,EAAE,cAAc,GAAG,CAAC,GACrI,IAAI,WAAW,CAAC,IAAI,eAAe,EAAE,UAAU;KAC9C,MAAM;KACN,WAAW;KACX,OAAO;MAAE,GAAG,EAAE;MAAO,KAAK;MAAO,UAAU;MAAQ,SAAS;MAAW,UAAU;MAAQ,gBAAgB;KAAS;KAClH,OAAO,EAAE,qBAAqB;KAC9B,UAAU,kBAAkB,KAAK,QAAQ;KACzC,eAAe,KAAK,cAAc,IAAI,EAAE;IACzC,GAAG,kBAAkB,UAAU,IAAI,OAAO,CAAC,cAAc,GAAG,EAAE,mBAAmB,CAAC,IAAI,CAAC,OAAO,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,gBAAgB,GAAG,CAAC,IAAI,MACrJ,IAAI,WAAW,CAAC,UAAU,EAAE,UAAU;KACrC,MAAM;KACN,WAAW;KACX,OAAO;MAAE,GAAG,EAAE;MAAO,KAAK;MAAO,UAAU;MAAQ,SAAS;KAAU;KACtE,OAAO,EAAE,mBAAmB;KAC5B,UAAU,kBAAkB,KAAK,QAAQ;KACzC,eAAe,KAAK,iBAAiB,IAAI,EAAE;IAC5C,GAAG,kBAAkB,UAAU,IAAI,OAAO,CAAC,cAAc,GAAG,EAAE,uBAAuB,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,GAAG,IAAI,EAAE,mBAAmB,GAAG,CAAC,IAAI,MAE/I,EAAE,UAAU;KACX,MAAM;KACN,WAAW;KACX,OAAO,iBAAiB;MAAE,GAAG,EAAE;MAAc,KAAK;MAAO,UAAU;MAAQ,SAAS;KAAU,IAAI;MAAE,GAAG,EAAE;MAAO,KAAK;MAAO,UAAU;MAAQ,SAAS;KAAU;KACjK,UAAU,kBAAkB,KAAK,OAAO;KACxC,eAAe,kBAAkB,iBAAiB,OAAO,IAAI,EAAE;IAChE,GAAG,CAAC,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,cAAc,GAAG,CAAC,GACjD,SAAS,SAAS,IAAI,EAAE,UAAU;KACjC,MAAM;KACN,WAAW;KACX,OAAO;MAAE,GAAG,EAAE;MAAW,SAAS;MAAW,UAAU;KAAO;KAC9D,OAAO,EAAE,qBAAqB;KAC9B,cAAc,EAAE,qBAAqB;KACrC,UAAU,kBAAkB,KAAK,QAAQ;KACzC,eAAe,KAAK,cAAc,IAAI,IAAI,YAAY;IACvD,GAAG,kBAAkB,UAAU,IAAI,OAAO,cAAc,IAAI,OAAO,SAAS,IAAI,wBAAwB,CAAC,IAAI,IAC9G,CACD,GAEJ,EAAE,OAAO;KAAE,KAAK;KAAY,OAAO,EAAE;IAAS,GACxC,eAAe,UAAU,UAAU,GAAG,GAKtC,IAAI,OAAO,QAAQ,eAAe,SAAS,SAAS,GAAG,IAAI,MAC3D,EAAE,UAAU;KACX,MAAM;KACN,WAAW;KACX,OAAO;MACN,OAAO;MACP,SAAS;MACT,YAAY;MACZ,gBAAgB;MAChB,KAAK;MACL,WAAW;MACX,SAAS;MACT,UAAU;MACV,YAAY;MACZ,QAAQ;MACR,OAAO,aAAa,qDAAqD;MACzE,YAAY;MACZ,QAAQ;MACR,cAAc;KACf;KACA,eAAe,aAAa,IAAI,EAAE;IACnC,GACC,OAAO,aAAa,cAAc,eAAe,EAAE,GACnD,EAAE,QAAQ,MAAM,aAAa,EAAE,wBAAwB,IAAI,EAAE,sBAAsB,CAAC,CACrF,GACA,aAAa;KACZ,eAAe,UAAU,aAAa,GAAG;KACzC,eAAe,WAAW,UAAU,GAAG;KACvC,eAAe,SAAS,IAAI,EAAE,OAAO,EACpC,OAAO;MACN,WAAW;MACX,YAAY;MACZ,WAAW;KACZ,EACD,GACC,EAAE,OAAO,EAAE,OAAO;MAAE,OAAO;MAA6B,cAAc;MAAO,YAAY;MAAK,UAAU;KAAO,EAAE,GAAG,EAAE,gBAAgB,CAAC,GACvI,eAAe,KAAK,EAAE,QAAQ,YAAY;MACzC,MAAM,OAAO,MAAM,qBAAqB;MACxC,MAAM,MAAM,KAAK,MAAM,OAAO,GAAG;MACjC,MAAM,IAAI,kBAAkB,GAAG,MAAM,SAAS;MAC9C,MAAM,SAAS,OAAO,KAAK,8BAA8B,OAAO,KAAK,8BAA8B;MACnG,OAAO,EAAE,OAAO;OAAE,KAAK,GAAG,OAAO,GAAG,MAAM;OAAW,WAAW;MAAmB,GAClF,EAAE,QAAQ,EAAE,OAAO;OAAE,YAAY;OAAK,OAAO;MAA0B,EAAE,GAAG,IAAI,OAAO,IAAI,MAAM,eAAe,MAAM,SAAS,GAC/H,EAAE,OAAO,EAAE,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM,EAAE,GACvE,EAAE,QAAQ,EAAE,OAAO;OAAE,OAAO;OAAQ,YAAY;MAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAClE,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO;OAAE,OAAO;OAA4B,UAAU;MAAS,EAAE,GAAG,KAAK,EAAE,WAAW,IAAI,IACrH,CACD;KACD,CAAC,CACF,IAAI;IACL,IAAI,IACL,GACD,cAAc,EAAE,OAAO;KACtB,KAAK;KACL,OAAO;MACN,YAAY;MACZ,QAAQ;MACR,cAAc;MACd,SAAS;MACT,OAAO;MACP,UAAU;MACV,YAAY;MACZ,WAAW;MACX,SAAS;MACT,YAAY;MACZ,gBAAgB;KACjB;IACD,GACC,EAAE,OAAO,EAAE,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;IAAM,EAAE,GACvE,OAAO,SAAS,IAAI,sBAAsB,GAC1C,EAAE,QAAQ,MAAM,EAAE,kBAAkB,CAAC,CACtC,GACA,EAAE,UAAU;KACX,MAAM;KACN,WAAW;KACX,OAAO;MAAE,GAAG,EAAE;MAAO,OAAO;MAA4B,aAAa;MAA8B,YAAY;MAA0B,KAAK;KAAM;KACpJ,UAAU,kBAAkB,KAAK,eAAe;KAChD,eAAe,KAAK,cAAc,IAAI,EAAE;IACzC,GAAG,kBAAkB,iBAAiB,IAAI,OAAO,CAAC,cAAc,GAAG,EAAE,IAAI,CAAC,OAAO,OAAO,IAAI,0BAA0B,GAAG,IAAI,EAAE,uBAAuB,GAAG,CAAC,CAC3J,IAAI,MACJ,iBAAiB,EAAE,OAAO;KACzB,KAAK;KACL,OAAO;MACN,WAAW;MACX,SAAS;MACT,YAAY;MACZ,cAAc;MACd,QAAQ;KACT;IACD,GACC,EAAE,OAAO,EAAE,OAAO;KAAE,SAAS;KAAQ,KAAK;IAAM,EAAE,GACjD,EAAE,SAAS;KACV,OAAO,EAAE;KACT,OAAO,YAAY,IAAI,QAAQ,KAAA,IAAY,YAAY,IAAI,MAAO,IAAI,YAAY;KAClF,aAAa,MAAM,cAAc,GAAG,EAAE,mBAAmB,EAAE,IAAI,KAAK,YAAY,KAAK,EAAE,mBAAmB;KAC1G,cAAc,EAAE,iBAAiB;KACjC,WAAW,MAAqC,eAAe;MAAE,GAAG;OAAc,IAAI,KAAK,EAAE,OAAO;KAAM,CAAC;IAC5G,CAAC,GACD,EAAE,UAAU;KACX,MAAM;KACN,WAAW;KACX,OAAO,EAAE;KACT,UAAU,kBAAkB,KAAK,OAAO;KACxC,eAAe,KAAK,UAAU,IAAI,EAAE;IACrC,GAAG,kBAAkB,SAAS,IAAI,OAAO,CAAC,cAAc,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,GAC7F,EAAE,UAAU;KACX,MAAM;KACN,WAAW;KACX,OAAO,EAAE;KACT,eAAe,kBAAkB,IAAI;IACtC,GAAG,EAAE,QAAQ,CAAC,CACf,CACD,IAAI,IACL;GACD,CAAC;GAED,MAAM,WAAW,QAAQ;GACzB,MAAM,YAAY,UAAU,SAAS;GACrC,MAAM,aAAa,cAAc,aAAa,cAAc;GAE5D,MAAM,oBAAoB,gBACvB,EAAE,OAAO;IAAE,OAAO,EAAE;IAAW,MAAM;IAAS,cAAc,EAAE,aAAa;GAAE,GAC9E,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,gBAAgB;IAAiB,cAAc;IAAQ,UAAU;IAAQ,KAAK;GAAM,EAAE,GAChJ,EAAE,OAAO,EAAE,OAAO;IAAE,YAAY;IAAK,UAAU;IAAU,SAAS;IAAQ,YAAY;IAAU,KAAK;IAAO,OAAO;GAA0B,EAAE,GAC9I,OAAO,QAAQ,IAAI,2BAA2B,GAC9C,EAAE,aAAa,CAChB,CACA,GACA,CAAC,aACE,EAAE,OAAO,MACV,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,eAAe;IAAU,KAAK;IAAO,cAAc;GAAO,EAAE,GAChG,EAAE,SAAS;IACV,OAAO,EAAE;IACT,OAAO;IACP,aAAa,EAAE,0BAA0B;IACzC,cAAc,EAAE,iBAAiB;IACjC,WAAW,MAAqC,cAAc,EAAE,OAAO,KAAK;GAC7E,CAAC,GACD,EAAE,SAAS;IACV,OAAO,EAAE;IACT,OAAO;IACP,aAAa,MAAM,cAAc,GAAG,EAAE,0BAA0B,EAAE,IAAI,KAAK,YAAY,KAAK,EAAE,0BAA0B;IACxH,cAAc,EAAE,iBAAiB;IACjC,WAAW,MAAqC,iBAAiB,EAAE,OAAO,KAAK;GAChF,CAAC,CACF,GACA,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,KAAK;GAAM,EAAE,GACjD,EAAE,UAAU;IACX,MAAM;IACN,WAAW;IACX,OAAO;KAAE,GAAG,EAAE;KAAY,KAAK;IAAM;IACrC,UAAU;IACV,eAAe,KAAK,sBAAsB;GAC3C,GAAG,kBAAkB,kBAAkB,CAAC,cAAc,GAAG,EAAE,qBAAqB,CAAC,IAAI,CAAC,OAAO,gBAAgB,IAAI,SAAS,GAAG,IAAI,EAAE,kBAAkB,GAAG,CAAC,GACzJ,EAAE,UAAU;IACX,MAAM;IACN,WAAW;IACX,OAAO,EAAE;IACT,eAAe,uBAAuB;GACvC,GAAG,EAAE,QAAQ,CAAC,CACf,GACA,cAAc,WAAW,EAAE,OAAO,EACjC,OAAO;IAAE,GAAG,EAAE;IAAO,OAAO;IAA0B,WAAW;IAAO,SAAS;IAAQ,YAAY;IAAU,KAAK;IAAO,YAAY;GAAI,EAC5I,GAAG,OAAO,SAAS,IAAI,wBAAwB,GAAG,YAAY,UAAU,IAAI,CAAC,IAAI,IAClF,IACE,EAAE,OAAO,MACV,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,OAAO;IAA6B,cAAc;IAAO,YAAY;IAAK,UAAU;GAAO,EAAE,GACvJ,cAAc,GACd,cAAc,eACX,EAAE,iBAAiB,IACnB,EAAE,cAAc,CACpB,GACA,UAAU,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,MAAM,EAAE,GACzD,EAAE,KAAK;IACN,MAAM,SAAS;IACf,QAAQ;IACR,OAAO;KAAE,OAAO;KAAoD,gBAAgB;KAAa,UAAU;KAAQ,YAAY;KAAK,SAAS;KAAe,YAAY;KAAU,KAAK;IAAM;GAC9L,GAAG,OAAO,gBAAgB,IAAI,cAAc,GAAG,EAAE,iBAAiB,CAAC,CACpE,IAAI,MACJ,EAAE,OAAO,EAAE,OAAO;IAAE,OAAO;IAA4B,cAAc;IAAO,UAAU;IAAQ,YAAY;GAAI,EAAE,GAC/G,EAAE,gBAAgB,CACnB,GACA,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,KAAK;GAAM,EAAE,GACjD,EAAE,SAAS;IACV,OAAO,EAAE;IACT,OAAO;IACP,aAAa,EAAE,sBAAsB;IACrC,cAAc,EAAE,oBAAoB;IACpC,WAAW,MAAqC,iBAAiB,EAAE,OAAO,KAAK;GAChF,CAAC,GACD,EAAE,UAAU;IACX,MAAM;IACN,WAAW;IACX,OAAO;KAAE,GAAG,EAAE;KAAY,KAAK;IAAM;IACrC,UAAU,UAAU,CAAC,cAAc,KAAK;IACxC,eAAe,KAAK,yBAAyB;GAC9C,GAAG,kBAAkB,qBAAqB,CAAC,cAAc,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,eAAe,GAAG,CAAC,GAC9I,EAAE,UAAU;IACX,MAAM;IACN,WAAW;IACX,OAAO,EAAE;IACT,eAAe,uBAAuB;GACvC,GAAG,EAAE,QAAQ,CAAC,CACf,CACD,CACN,IACK;GAIH,MAAM,iBAAiB,OAAO,UAC3B,EAAE,YACF;IACD,GAAG,EAAE;IACL,WAAW;IACX,OAAO;IACP,UAAU;GACX;GAED,IAAI,WAAW,MACd,OAAO,EAAE,OAAO;IAAE,WAAW;IAAe,OAAO;KAAE,GAAG;KAAgB,WAAW;KAAS,SAAS;KAAQ,YAAY;KAAU,gBAAgB;IAAS;GAAE,GAC7J,EAAE,SAAS,EAAE,KAAK,MAAM,GAAG,eAAe,GAC1C,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,cAAc,GAAG,EAAE,gBAAgB,CAAC,CAAC,CACrE;GAGD,OAAO,EAAE,OAAO;IAAE,WAAW;IAAe,OAAO;GAAe,GACjE,EAAE,SAAS,EAAE,KAAK,MAAM,GAAG,eAAe,GAC1C,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAC9B,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,KAAK;GAAM,EAAE,GACvE,QAAQ,EAAE,GACV,EAAE,QAAQ,EAAE,OAAO;IAAE,YAAY;IAAK,UAAU;IAAQ,OAAO;GAA0B,EAAE,GAAG,aAAa,GAC3G,EAAE,QAAQ,EAAE,OAAO,WAAW,EAAE,aAAa,EAAE,aAAa,GAAG,WAAW,EAAE,cAAc,IAAI,EAAE,kBAAkB,CAAC,CACpH,GACA,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,KAAK;IAAO,YAAY;GAAS,EAAE,GACvE,CAAC,gBAAgB,EAAE,UAAU;IAC5B,MAAM;IACN,WAAW;IACX,OAAO;KAAE,GAAG,EAAE;KAAY,KAAK;IAAM;IACrC,eAAe,iBAAiB,IAAI;GACrC,GAAG,CAAC,OAAO,QAAQ,IAAI,SAAS,GAAG,IAAI,EAAE,aAAa,GAAG,CAAC,IAAI,MAC9D,EAAE,UAAU;IACX,MAAM;IACN,WAAW;IACX,OAAO;KAAE,GAAG,EAAE;KAAK,KAAK;IAAM;IAC9B,UAAU;IACV,eAAe,KAAK,cAAc;GACnC,GAAG,kBAAkB,eAAe,CAAC,cAAc,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,OAAO,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,eAAe,GAAG,CAAC,GACzI,EAAE,UAAU;IACX,MAAM;IACN,WAAW;IACX,OAAO;KAAE,GAAG,EAAE;KAAK,KAAK;IAAM;IAC9B,UAAU;IACV,eAAe,KAAK,aAAa;GAClC,GAAG,kBAAkB,gBAAgB,CAAC,cAAc,GAAG,EAAE,mBAAmB,CAAC,IAAI,CAAC,OAAO,WAAW,IAAI,qBAAqB,GAAG,IAAI,EAAE,qBAAqB,GAAG,CAAC,CAChK,CACD,GACA,kBAAkB,GAClB,mBACA,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,gBAAgB;IAAiB,cAAc;IAAO,SAAS;GAAQ,EAAE,GACnI,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,KAAK;GAAM,EAAE,GACvE,EAAE,QAAQ,EAAE,OAAO;IAAE,YAAY;IAAK,UAAU;IAAU,OAAO;GAA0B,EAAE,GAAG,QAAQ,SAAS,OAAO,EAAE,CAC3H,CACD,GACA,sBACA,EAAE,OAAO,EAAE,OAAO;IAAE,WAAW;IAAQ,YAAY;IAAQ,WAAW;GAAsC,EAAE,GAC7G,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,eAAe;IAAU,KAAK;GAAO,EAAE,GAC3E,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,gBAAgB;GAAgB,EAAE,GAC5F,EAAE,QAAQ,EAAE,OAAO;IAAE,OAAO;IAA2B,YAAY;IAAK,UAAU;GAAS,EAAE,GAAG,EAAE,kBAAkB,CAAC,GACrH,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAC5B,EAAE,UAAU;IACX,MAAM;IACN,OAAO,QAAQ,mBAAmB,SAAS,EAAE,eAAe,EAAE;IAC9D,eAAe,KAAK,OAAO,kBAAkB,MAAM;GACpD,GAAG,EAAE,iBAAiB,CAAC,GACvB,EAAE,UAAU;IACX,MAAM;IACN,OAAO,QAAQ,mBAAmB,iBAAiB,EAAE,eAAe,EAAE;IACtE,eAAe,KAAK,OAAO,kBAAkB,cAAc;GAC5D,GAAG,EAAE,wBAAwB,CAAC,GAC9B,EAAE,UAAU;IACX,MAAM;IACN,OAAO,QAAQ,mBAAmB,SAAS;KAAE,GAAG,EAAE;KAAc,OAAO;KAA8B,YAAY;KAA4B,QAAQ;IAAyC,IAAI,EAAE;IACpM,eAAe,KAAK,OAAO,kBAAkB,MAAM;GACpD,GAAG,EAAE,iBAAiB,CAAC,CACxB,CACD,GACA,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,gBAAgB;GAAgB,EAAE,GAC5F,EAAE,QAAQ,EAAE,OAAO;IAAE,OAAO;IAA2B,YAAY;IAAK,UAAU;GAAS,EAAE,GAAG,EAAE,cAAc,CAAC,GACjH,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAC5B,EAAE,UAAU;IACX,MAAM;IACN,OAAO,QAAQ,kBAAkB,KAAK,EAAE,eAAe,EAAE;IACzD,eAAe,KAAK,OAAO,iBAAiB,EAAE;GAC/C,GAAG,EAAE,aAAa,CAAC,GACnB,EAAE,UAAU;IACX,MAAM;IACN,OAAO,QAAQ,kBAAkB,QAAQ,EAAE,eAAe,EAAE;IAC5D,eAAe,KAAK,OAAO,iBAAiB,KAAK;GAClD,GAAG,EAAE,YAAY,CAAC,GAClB,EAAE,UAAU;IACX,MAAM;IACN,OAAO,QAAQ,kBAAkB,WAAW,EAAE,eAAe,EAAE;IAC/D,eAAe,KAAK,OAAO,iBAAiB,QAAQ;GACrD,GAAG,EAAE,eAAe,CAAC,GACrB,EAAE,UAAU;IACX,MAAM;IACN,OAAO,QAAQ,kBAAkB,SAAS,EAAE,eAAe,EAAE;IAC7D,eAAe,KAAK,OAAO,iBAAiB,MAAM;GACnD,GAAG,EAAE,aAAa,CAAC,CACpB,CACD,GACA,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,gBAAgB;GAAgB,EAAE,GAC5F,EAAE,QAAQ,EAAE,OAAO;IAAE,OAAO;IAA2B,YAAY;IAAK,UAAU;GAAS,EAAE,GAAG,EAAE,YAAY,CAAC,GAC/G,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAC5B,EAAE,UAAU;IACX,MAAM;IACN,OAAO,MAAM,SAAS,gBAAgB,CAAC,MAAM,OAAO,EAAE,eAAe,EAAE;IACvE,eAAe,KAAK,QAAQ,YAAY;GACzC,GAAG,EAAE,iBAAiB,CAAC,GACvB,EAAE,UAAU;IACX,MAAM;IACN,OAAO,MAAM,SAAS,gBAAgB,EAAE,eAAe,EAAE;IACzD,eAAe,KAAK,QAAQ,aAAa;GAC1C,GAAG,EAAE,iBAAiB,CAAC,CACxB,CACD,GACA,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,gBAAgB;GAAgB,EAAE,GAC5F,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,eAAe;GAAS,EAAE,GAC9D,EAAE,QAAQ,EAAE,OAAO;IAAE,OAAO;IAA2B,YAAY;IAAK,UAAU;GAAS,EAAE,GAAG,EAAE,mBAAmB,CAAC,GACtH,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,uBAAuB,CAAC,CACzD,GACA,EAAE,UAAU;IACX,MAAM;IACN,OAAO,QAAQ,eAAe,QAAQ,EAAE,eAAe,EAAE;IACzD,UAAU,kBAAkB;IAC5B,eAAe,KAAK,OAAO,cAAc,QAAQ,eAAe,KAAK;GACtE,GAAG,QAAQ,eAAe,QAAQ,EAAE,iBAAiB,IAAI,EAAE,gBAAgB,CAAC,CAC7E,GACA,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,eAAe;IAAU,KAAK;GAAM,EAAE,GAC1E,EAAE,QAAQ,EAAE,OAAO;IAAE,OAAO;IAA2B,YAAY;IAAK,UAAU;GAAS,EAAE,GAAG,EAAE,cAAc,CAAC,GACjH,cAAc,WAAW,IACtB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,cAAc,CAAC,IAC/C,EAAE,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,UAAU;IAAQ,KAAK;GAAM,EAAE,GACrE,cAAc,KAAK,MAAM;IACxB,MAAM,WAAW,eAAe,IAAI,EAAE,EAAE;IACxC,OAAO,EAAE,UAAU;KAClB,MAAM;KACN,KAAK,EAAE;KACP,OAAO,EAAE;KACT,UAAU,kBAAkB;KAC5B,OAAO,WAAW;MAAE,GAAG,EAAE;MAAQ,SAAS;MAAM,gBAAgB;KAAe,IAAI,EAAE;KACrF,eAAe,KAAK,kBAAkB,EAAE,IAAI,CAAC,QAAQ;IACtD,GAAG,EAAE,IAAI;GACV,CAAC,CACF,GACD,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,aAAa,CAAC,CAC/C,CACD,CACD,CACD;EACF;;;;;;;EC/oEA,SAAgB,mBACd,UACuB;GACvB,IAAI,CAAC,UAAU,OAAO,CAAC;GACvB,MAAM,MAAM,iBAAiB,QAAQ;GACrC,MAAM,QAA+B,CAAC;GACtC,KAAK,MAAM,CAAC,OAAO,SAAS,IAAI,QAAQ,GAAG;IACzC,MAAM,SAAS;KAAE,GAAI,KAAK,YAAY,CAAC;KAAI,GAAI,KAAK,OAAO,CAAC;IAAG;IAC/D,MAAM,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,YAAY,KAAK,IAAI;IACxF,MAAM,cAAc,WAAW,SAAS,IAAI,aAAa;IACzD,MAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,QAAQ,KAAK,IAAI;IAC7E,MAAM,OACJ,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,OAAM,QAAO,OAAO,QAAQ,QAAQ,IACzE,OAAO,OACR,CAAC;IACP,MAAM,KAAK;KAAE;KAAO;KAAa;KAAS;IAAK,CAAC;GAClD;GACA,OAAO,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;EAC5D;;;;;;;;;EAUA,MAAMC,WAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2Cf,MAAM,cAAc;;;;;;;;;EAUpB,MAAM,iBAAiB;;;;;;;;;;EAWvB,SAAS,eAAe,QAAgB,MAA2B;GACjE,QAAQ,QAAR;IACE,KAAK,wBACH,OAAOC,KAAG,MAAM,UAAU,iBAAiB;IAC7C,KAAK,iBACH,OAAOA,KAAG,MAAM,iBAAiB,kCAAkC;IACrE,KAAK,gBACH,OAAOA,KAAG,MAAM,qBAAqB,kCAAkC;IACzE,SACE,OAAO;GACX;EACF;EAEA,SAAgB,mBAAmB;GACjC,MAAM,OAAO,QAAQ;GACrB,MAAM,EAAE,QAAQ,OAAO,MAAM,UAAU,UAAU,SAAS,iBAAiB;GAE3E,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,EAAE;GACnC,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAA0C,IAAI;GAC7D,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,iBAA6C,IAAI,IAAI,CAAC;GACvE,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAA2F,IAAI;GAEhH,MAAM,mBAAmB,mBAAmB;IAAE;IAAO;GAAK,CAAC;GAC3D,MAAM,UAAU,QAAQ,OAAO,OAAO,OAAO,UAAU,CAAC;GACxD,MAAM,WAAW,QAAQ,QAAO,UAAS,CAAC,SAAS,IAAI,MAAM,KAAK,CAAC;GAEnE,MAAM,UAAU,OAAe,YAA2B;IACxD,aAAY,YAAW;KACrB,MAAM,OAAO,IAAI,IAAI,OAAO;KAC5B,IAAI,SAAS,KAAK,OAAO,KAAK;UACzB,KAAK,IAAI,KAAK;KACnB,OAAO;IACT,CAAC;GACH;GAEA,MAAM,YACJ,WAAW,WACX,YACA,aAAa,KAAA,KACb,SAAS,SAAS,KAClB,CAAC,QACD,SAAS,KAAA;GAEX,MAAM,eAAe,YAAY;IAC/B,IAAI,CAAC,aAAa,CAAC,QAAQ,aAAa,KAAA,GAAW;IACnD,QAAQ,IAAI;IACZ,YAAY,IAAI;IAChB,IAAI;KACF,MAAM,MAAM,YAAY,QAAQ;KAEhC,IAAI,MADmB,KAAK,OAAO,KAAK,QAAQ,GAE9C,YAAY;MACV,MAAM;MACN,SAASA,KACP,MACA,QAAQ,SAAS,OAAO,sCACxB,yBAAyB,SAAS,OAAO,YAAY,SAAS,SAAS,IAAI,MAAM,GAAG,6BACtF;KACF,CAAC;UAED,YAAY;MACV,MAAM;MACN,SAASA,KACP,MACA,+CACA,yIACF;KACF,CAAC;IAEL,SAAS,OAAO;KACd,YAAY;MACV,MAAM;MACN,SAASA,KACP,MACA,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,KAC7D,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACzE;KACF,CAAC;IACH,UAAU;KACR,QAAQ,KAAK;IACf;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAY,mBAAgB;cAA/C;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQD,SAAc,CAAA;KACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,IAAG;gBAAmBC,KAAG,MAAM,YAAY,iBAAiB;KAAM,CAAA;KACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACGA,KACC,MACA,sIACA,gUACF,EACC,CAAA;KAGH,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAW,MAAK;MAAS,cAAYA,KAAG,MAAM,eAAe,uBAAuB;gBAAnG;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,eAAe,uBAAuB,EAAM,CAAA;OAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACGA,KACC,MACA,8GACA,mSACF,EACC,CAAA;OAEF,WAAW,aACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAS,WAAU;kBACxBA,KAAG,MAAM,cAAc,4BAA4B;OACnD,CAAA;OAGJ,WAAW,aAAa,iBAAiB,WAAW,KACnD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;kBACVA,KAAG,MAAM,mBAAmB,yCAAyC;OACrE,CAAA;OAGJ,iBAAiB,SAAS,KACzB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;QAAmB,MAAK;QAAO,cAAYA,KAAG,MAAM,WAAW,wBAAwB;kBACnG,iBAAiB,KAAI,SAAQ;SAC5B,MAAM,UAAU,CAAC,KAAK,SAAS,GAAG,KAAK,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;SACrE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAsB,WAAU;UAAgB,MAAK;oBACnD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAU;qBAAf,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAU;sBAAf;aACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,WAAU;wBAAkB,KAAK;aAAoB,CAAA;aAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAU;wBAA2B,KAAK;aAAY,CAAA;aAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAU;wBACbA,KAAG,MAAM,OAAO,YAAY;aACzB,CAAA;YACH;eACJ,UACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAU;YAAgB,OAAO;sBAAU;WAAc,CAAA,IAE/D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAU;sBAAkBA,KAAG,MAAM,WAAW,wBAAwB;WAAQ,CAAA,CAErF;;SACF,GAfK,KAAK,KAeV;QAET,CAAC;OACE,CAAA;MAEJ;;KAGL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAW,MAAK;MAAS,cAAYA,KAAG,MAAM,eAAe,gCAAgC;gBAA5G;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,eAAe,gCAAgC,EAAM,CAAA;OACnE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACGA,KACC,MACA,wGACA,qKACF,EACC,CAAA;OAEF,WAAW,aACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAS,WAAU;kBACxBA,KAAG,MAAM,aAAa,6BAA6B;OACnD,CAAA;OAEJ,WAAW,iBACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAS,WAAU;kBACxBA,KAAG,MAAM,+BAA+B,qFAAqF;OAC7H,CAAA;OAEJ,WAAW,WAAW,CAAC,YACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAS,WAAU;kBACxBA,KAAG,MAAM,eAAe,mDAAmD;OAC3E,CAAA;OAGL,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;mBAAkBA,KAAG,MAAM,WAAW,oBAAoB;QAAQ,CAAA,GAClF,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;SACE,WAAU;SACV,OAAO;SACP,aAAa;SACb,UAAU;SACV,cAAYA,KAAG,MAAM,kBAAkB,8BAA8B;SACrE,WAAU,UAAS;UACjB,QAAQ,MAAM,OAAO,KAAK;UAC1B,UAAU,IAAI;UACd,4BAAY,IAAI,IAAI,CAAC;UACrB,YAAY,IAAI;SAClB;QACD,CAAA,CACI;;OAEP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;kBAAf;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UACE,MAAK;UACL,WAAU;UACV,UAAU,QAAQ,KAAK,KAAK,CAAC,CAAC,WAAW;UACzC,eAAe;WACb,YAAY,IAAI;WAChB,UAAU,iBAAiB,MAAM;YAAE;YAAO;WAAK,CAAC,CAAC;WACjD,4BAAY,IAAI,IAAI,CAAC;UACvB;oBAECA,KAAG,MAAM,QAAQ,qBAAqB;SACjC,CAAA;SACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UACE,MAAK;UACL,WAAU;UACV,UAAU;UACV,eAAe;WACb,QAAQ,WAAW;WACnB,UAAU,IAAI;WACd,4BAAY,IAAI,IAAI,CAAC;WACrB,YAAY,IAAI;UAClB;oBAECA,KAAG,MAAM,eAAe,sBAAsB;SACzC,CAAA;SACP,QAAQ,SAAS,KAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UACE,MAAK;UACL,WAAU;UACV,UAAU;UACV,eACE,YAAY,SAAS,WAAW,QAAQ,SAAS,IAAI,IAAI,QAAQ,KAAI,MAAK,EAAE,KAAK,CAAC,oBAAI,IAAI,IAAI,CAAC;oBAGhGA,KACC,MACA,SAAS,WAAW,QAAQ,SAAS,QAAQ,MAC7C,SAAS,WAAW,QAAQ,SAAS,iBAAiB,YACxD;SACM,CAAA;QAEP;;OAEJ,QAAQ,OAAO,SACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,MAAK;QAAQ,WAAU;kBACzBA,KAAG,MAAM,QAAQ,OAAO,SAAS,iBAAiB,OAAO,OAAO;OAC9D,CAAA;OAGN,QAAQ,OAAO,QAAQ,QAAQ,WAAW,KACzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,MAAK;QAAS,WAAU;kBAC1BA,KAAG,MAAM,mBAAmB,oCAAoC;OAC9D,CAAA;OAGN,QAAQ,SAAS,KAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;QAAmB,MAAK;QAAQ,cAAYA,KAAG,MAAM,aAAa,oBAAoB;kBAClG,QAAQ,KAAI,UAAS;SACpB,MAAM,YAAY,CAAC,SAAS,IAAI,MAAM,KAAK;SAC3C,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,MAAM,QAAQ,OAAO,CAAC;SACvE,MAAM,UAAU,CAAC,MAAM,QAAQ,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG;SACzD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAuB,WAAU;oBAC/B,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;WAAO,WAAU;qBAAjB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YACE,MAAK;YACL,SAAS;YACT,UAAU;YACV,cAAYA,KAAG,MAAM,QAAQ,MAAM,QAAQ,iBAAiB,MAAM,MAAM;YACxE,WAAU,UAAS,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO;WAC5D,CAAA,GACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,WAAU;sBAAhB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;aAAM,WAAU;uBAAhB;cACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;eAAQ,WAAU;yBAAkB,MAAM;cAAa,CAAA;cACvD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;eAAM,WAAU;yBAA2B,MAAM;cAAY,CAAA;cAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;eAAM,WAAW,mBAAmB,MAAM,WAAW,YAAY;yBAC9DA,KAAG,MAAM,MAAM,WAAW,SAAS,QAAQ,MAAM,WAAW,YAAY,KAAK;cAC1E,CAAA;aACF;gBACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAU;aAAgB,OAAO;uBAAU;YAAc,CAAA,CAC3D;aACD;;SACJ,GApBK,MAAM,KAoBX;QAET,CAAC;OACE,CAAA;OAGN,QAAQ,OAAO,QAAQ,OAAO,QAAQ,KAAI,UACzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAsB,WAAU;kBAC7BA,KACC,MACA,OAAO,MAAM,KAAK,IAAI,eAAe,MAAM,QAAQ,IAAI,KACvD,YAAY,MAAM,KAAK,KAAK,eAAe,MAAM,QAAQ,IAAI,GAC/D;OACG,GANK,MAAM,IAMX,CACN;OAED,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;kBACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,MAAK;SACL,WAAU;SACV,UAAU,CAAC;SACX,eAAe;UAAE,aAAkB;SAAE;mBAEpCA,KACC,MACA,OAAO,UAAU,MAAM,SAAS,OAAO,WACvC,OAAO,eAAe,UAAU,SAAS,OAAO,QAAQ,SAAS,WAAW,IAAI,KAAK,KACvF;QACM,CAAA;OACL,CAAA;OAEJ,YACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QACE,MAAM,SAAS,SAAS,UAAU,UAAU;QAC5C,WAAW,yBAAyB,SAAS;kBAF/C,CAIE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAM,SAAS,QAAa,CAAA,GAC3B,SAAS,SAAS,aACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAASA,KAAG,MAAM,SAAS,aAAa,EAAU,CAAA,GACjDA,KACC,MACA,2CACA,sGACF,CACG;UAEJ;;MAEJ;;KAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;gBAAf;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,iCAAiC,EAAM,CAAA;OAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACGA,KACC,MACA,6FACA,qOACF,EACC,CAAA;OACH,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,eAAqB,CAAA,EAAM,CAAA;OACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACGA,KACC,MACA,iSACA,gkBACF,EACC,CAAA;MACA;;KAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,mBAAmB,EAAM,CAAA,GAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACGA,KACC,MACA,4NACA,2dACF,EACC,CAAA,CACA;;IACE;;EAEb;;;;;;;;;;;;EC3cA,MAAa,eAAe;;EAG5B,MAAa,uBAAuB;;;;;;;;;;;;EC6BpC,SAAgB,cAAc,OAAwC,SAAsE;GAC1I,IAAI,CAAC,OAAO,OAAO,CAAC;GACpB,MAAM,SAAS,MAAgB,UAAqC,UAAU,KAAA,KACzE,CAAC,QAAQ,OAAO,MAAK,UAAS,MAAM,OAAO,MAAM,QAAQ,CAAC,EAAE,OAAO,MAAK,UAAS,MAAM,OAAO,MAAM,KAAK,IAC1G,CAAC;IAAE;IAAM;GAAM,CAAC,IAAI,CAAC;GACzB,OAAO;IAAC,GAAG,MAAM,QAAQ,MAAM,IAAI;IAAG,GAAG,MAAM,UAAU,MAAM,MAAM;IAAG,GAAG,MAAM,aAAa,MAAM,WAAW,KAAK;GAAC;EACvH;;;EC/CA,MAAM,4BAAY,IAAI,IAAgB;EACtC,MAAa,qBAAqB,aAAuC;GAAE,UAAU,IAAI,QAAQ;GAAG,aAAa;IAAE,UAAU,OAAO,QAAQ;GAAE;EAAE;EAChJ,MAAa,wBAA8B;GAAE,KAAK,MAAM,YAAY,WAAW,SAAS;EAAE;;;ECwB1F,MAAMC,WAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkHf,MAAM,OAAO,UAAqC,QAAQ,KAAK,UAAU,CAAC,MAAM,UAAU,MAAM,KAAK,CAAC,IAAI;EAE1G,SAAgB,YAAY,EAAE,MAAM,OAAO,SAAS,YAEjD;GACD,MAAM,OAAO,QAAQ;GACrB,MAAM,OAAO,SAAS,cAAcC,KAAG,MAAM,MAAM,YAAY,IAAI;GACnE,MAAM,QAAQ,QAAQ,OAAO,MAAK,UAAS,MAAM,OAAO,OAAO,QAAQ,CAAC,EAAE,OAAO,MAAK,UAAS,MAAM,OAAO,OAAO,KAAK;GAIxH,MAAM,QAAQ,UAAU,KAAA,KAAa,UAAU,KAAA;GAC/C,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD,EAAA,UAAA;IACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,KAAa,CAAA;IACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,SAAS,SAASA,KAAG,MAAM,mBAAmB,6BAA6B,IAAI,SAAS,aAAaA,KAAG,MAAM,oBAAoB,gEAAgE,IAAIA,KAAG,MAAM,kCAAkC,gEAAgE,EAAK,CAAA;IAC1T,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQA,KAAG,MAAM,MAAM,OAAO,GAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;KAAQ,cAAYA,KAAG,MAAM,GAAG,KAAK,MAAM,GAAG,KAAK,OAAO;KAAG,OAAO,IAAI,KAAK;KAAG,WAAU,UAAS;MACjI,IAAI,CAAC,MAAM,OAAO,OAAO;OAAE,SAAS,KAAA,CAAS;OAAG;MAAO;MACvD,MAAM,CAAC,UAAU,SAAS,KAAK,MAAM,MAAM,OAAO,KAAK;MACvD,SAAS;OAAE;OAAU;MAAM,CAAC;KAC9B;eAJgC;MAK9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,OAAM;OAAG,UAAU,SAAS;iBAAc,SAAS,cAAcA,KAAG,MAAM,YAAY,0BAA2B,IAAIA,KAAG,MAAM,YAAY,0BAA0B;MAAU,CAAA;MACrL,SAAS,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,OAAO,IAAI,KAAK;OAAG,UAAA;iBAAUA,KAAG,MAAM,QAAQ,MAAM,SAAS,GAAG,MAAM,SAAS,wBAAwB,MAAM,SAAS,GAAG,MAAM,OAAO;MAAU,CAAA;MAC1K,QAAQ,OAAO,KAAI,UAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;OAAyB,OAAO,MAAM;iBAChE,MAAM,OAAO,KAAI,UAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAuB,OAAO,IAAI;SAAE,UAAU,MAAM;SAAI,OAAO,MAAM;QAAG,CAAC;kBAAI,MAAM;OAAa,GAAnF,MAAM,EAA6E,CAAC;MACpH,GAFkC,MAAM,EAExC,CAAC;KACL;MAAQ,EAAA,CAAA;IACf,SAAS,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,MAAK;eAASA,KAAG,MAAM,aAAa,MAAM,SAAS,GAAG,MAAM,MAAM,eACtF,2BAA2B,MAAM,SAAS,GAAG,MAAM,MAAM,yCAAyC;IAAK,CAAA;IACxG,OAAO,aAAa,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQA,KAAG,MAAM,QAAQ,WAAW,GAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;KAAQ,cAAYA,KAAG,MAAM,GAAG,KAAK,QAAQ,GAAG,KAAK,WAAW;KAAG,OAAO,MAAM,mBAAmB;KAAI,WAAU,UAAS;MAC5L,MAAM,EAAE,iBAAiB,MAAM,GAAG,aAAa;MAC/C,SAAS;OAAE,GAAG;OAAU,GAAI,MAAM,OAAO,QAAQ,EAAE,iBAAiB,MAAM,OAAO,MAAM,IAAI,CAAC;MAAG,CAAC;KAClG;eAHoE,CAIlE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,OAAM;gBAAd,CAAkBA,KAAG,MAAM,QAAQ,eAAe,GAAG,MAAM,UAAU,gBAAgB,MAAM,MAAM,UAAU,kBAAkB,EAAW;SACvI,MAAM,UAAU,QAAQ,KAAI,WAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAwB,OAAO,OAAO;gBAAK,OAAO;KAAa,GAAlD,OAAO,EAA2C,CAAC,CACjG;MAAQ,EAAA,CAAA;GACR,EAAA,CAAA;EACZ;EAEA,IAAI,YAAY;EAChB,MAAM,WAAW,UAAkD,MAAM,KAAK,EAAE,IAAI,MAAM,YAAY;GAAE,KAAK;GAAI;GAAI;GAAM;EAAK,EAAE;EAIlI,MAAM,kBAA4C;GAAC;GAAU;GAAe;EAAK;EACjF,MAAM,cAAc,YAA2B,kBAAkB;EAEjE,SAAgB,iBAAiB;GAC/B,MAAM,OAAO,QAAQ;GACrB,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAsC,QAAQ;GAC9D,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAoC;GAClD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAmC,CAAC,CAAC;GACnD,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,CAAC;GACtC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAA6B;GAC3C,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAA8B;GAC7C,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,KAAK;GAC1C,MAAM,UAAU,MAAM,KAAK,IAAI,QAAQ,MAAM,SAAS,CAAC;GACvD,MAAM,aAAa,UAA0B,QACzC,OAAO,QAAQ,OAAO,MAAK,UAAS,MAAM,OAAO,MAAM,QAAQ,CAAC,EAAE,OAAO,MAAK,UAAS,MAAM,OAAO,MAAM,KAAK,CAAC,EAAE,QAC/G,GAAG,MAAM,SAAS,GAAG,MAAM,UAAU;GAC5C,MAAM,aAAa,SAA0C,SAAS,SAASA,KAAG,MAAM,QAAQ,MAAM,IAClG,SAAS,WAAWA,KAAG,MAAM,YAAY,UAAU,IAAIA,KAAG,MAAM,QAAQ,kBAAkB;GAC9F,MAAM,UAAU,WAA8C,UAAS,UAAS,MAAM,KAAK,OAAO,UAChG,MAAM,QAAQ,SAAS,MAAM,OAAO,KAAK,IAAI,KAAK,CAAC;GACrD,MAAM,eAAe,MAAyB,UAAyB,QAAO,WAAU;IAAE,GAAG;IAAO,MAAM;KAAE,GAAG,MAAM;MAAO,OAAO;KACjI,GAAI,MAAM,KAAK,iBAAiB,EAAE,gBAAgB;MAAE,GAAG,MAAM,KAAK;OAAiB,OAAO,SAAS,SAAS,SAAS;KAAM,EAAE,IAAI,CAAC;IAAG;GAAE,EAAE;GAC3I,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,QAAQ,IAAI,gBAAgB;IAClC,MAAW,GAAG,gBAAgB,iBAAiB;KAAE,aAAa;KAAe,OAAO;KAAY,QAAQ,MAAM;IAAO,CAAC,CAAC,CACpH,KAAK,OAAM,aAAY;KAAE,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAMA,KAAG,MAAM,kBAAkB,6BAA6B,CAAC;KAAG,OAAO,SAAS,KAAK;IAA4B,CAAC,CAAC,CAC1K,MAAK,UAAS;KAAE,SAAS,KAAK;KAAG,SAAS,QAAQ,MAAM,KAAK,CAAC;KAAG,UAAU,CAAC;IAAE,CAAC,CAAC,CAChF,OAAM,UAAS;KAAE,IAAI,CAAC,MAAM,OAAO,SAAS,SAAS,OAAO,KAAK,CAAC;IAAE,CAAC;IACxE,aAAa,MAAM,MAAM;GAC3B,GAAG,CAAC,CAAC;GACL,MAAM,iBAAiB;IACrB,aAAa;IACb,UAAS,UAAS,CAAC,GAAG,OAAO;KAAE,KAAK,OAAO;KAAa,MAAMA,KAAG,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,MAAM,SAAS,GAAG;KAAG,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1I,UAAU,MAAM,MAAM;GACxB;GACA,MAAM,eAAe,UAAkB;IACrC,UAAS,UAAS,MAAM,QAAQ,GAAG,aAAa,aAAa,KAAK,CAAC;IACnE,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,QAAQ,SAAS,IAAI,QAAQ,MAAM,SAAS,CAAC,CAAC,CAAC;GACzF;GACA,MAAM,OAAO,YAAY;IACvB,IAAI,CAAC,OAAO;IACZ,MAAM,UAAU,MAAM,WAAU,UAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC;IACrG,IAAI,WAAW,GAAG;KAAE,SAASA,KAAG,MAAM,KAAK,UAAU,EAAE,iCAAiC,SAAS,UAAU,EAAE,wDAAwD,CAAC;KAAG;IAAO;IAIhL,MAAM,QAAQ,MAAM,SAAS,OAAO,UAAU,cAAc,MAAM,MAAM,MAAM,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,YAClGA,KAAG,MAAM,KAAK,QAAQ,EAAE,OAAO,MAAM,KAAK,KAAK,KAAKA,KAAG,MAAM,SAAS,gBAAgB,EAAE,KAAK,UAAU,IAAI,EAAE,UAAU,MAAM,SAAS,GAAG,MAAM,MAAM,gBACnJ,SAAS,QAAQ,EAAE,IAAI,MAAM,KAAK,KAAK,KAAK,iBAAiB,kBAAkB,UAAU,IAAI,EAAE,sCAAsC,MAAM,SAAS,GAAG,MAAM,MAAM,sCAAsC,CAAC,CAAC;IAC/M,IAAI,MAAM,QAAQ;KAAE,SAAS,MAAM,KAAKA,KAAG,MAAM,KAAK,GAAG,CAAC,CAAC;KAAG;IAAO;IACrE,UAAU,IAAI;IAAG,SAAS,KAAA,CAAS;IAAG,UAAU,KAAA,CAAS;IACzD,IAAI;KACF,MAAM,QAAQ,MAAM,KAAK,EAAE,IAAI,MAAM,WAAW;MAC9C,MAAM,EAAE,cAAc,GAAG,SAAS;MAClC,MAAM,SAAS,OAAO,YAAY,OAAO,QAAQ,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,YAAY,OAAO,cAAc,MAAM,KAAK,OAAO,MAAM,IAAI,CAAC,CAAC;MAC/I,OAAO;OAAE,GAAI,KAAK,EAAE,GAAG,IAAI,CAAC;OAAI,MAAM,KAAK,KAAK;OAAG,MAAM;QAAE,GAAG;QAAM,GAAI,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,EAAE,cAAc,OAAO,IAAI,CAAC;OAAG;MAAE;KACxI,CAAC;KACD,MAAM,WAAW,MAAM,MAAM,iBAAiB;MAAE,QAAQ;MAAQ,aAAa;MAC3E,SAAS,EAAE,gBAAgB,mBAAmB;MAAG,MAAM,KAAK,UAAU;OAAE,QAAQ;OAAa,UAAU,MAAM;OAAU;MAAM,CAAC;KAAE,CAAC;KACnI,MAAM,SAAS,MAAM,SAAS,KAAK;KACnC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,OAAO,SAASA,KAAG,MAAM,eAAe,oCAAoC,CAAC;KAC/G,MAAM,YAAY,MAAM,MAAM,GAAG,gBAAgB,iBAAiB;MAAE,aAAa;MAAe,OAAO;KAAW,CAAC;KACnH,IAAI,CAAC,UAAU,IAAI,MAAM,IAAI,MAAMA,KAAG,MAAM,qBAAqB,uCAAuC,CAAC;KACzG,MAAM,OAAO,MAAM,UAAU,KAAK;KAClC,SAAS,IAAI;KAAG,SAAS,QAAQ,KAAK,KAAK,CAAC;KAAG,UAAU,CAAC;KAC1D,gBAAgB;KAChB,UAAUA,KAAG,MAAM,uCAAuC,2HAA2H,CAAC;IACxL,SAAS,OAAO;KAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;IAAE,UAC3E;KAAE,UAAU,KAAK;IAAE;GAC7B;GACA,MAAM,QAAQ,QAAQ,KAAK,UAAU,MAAM,KAAK,EAAE,IAAI,MAAM,YAAY;IAAE;IAAI;IAAM;GAAK,EAAE,CAAC,MACtF,KAAK,UAAU,MAAM,MAAM,KAAK,EAAE,IAAI,MAAM,YAAY;IAAE;IAAI;IAAM;GAAK,EAAE,CAAC,IAAI;GACtF,MAAM,UAAU,OAAO,MAAM,QAAO,SAAQ,CAAC,KAAK,UAAU,KAAK,CAAC;GAClE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;cAAf,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQD,SAAc,CAAA,GACtB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;eAAf;MACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,oBAAA;iBAAR,CAAyB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,aAAiB,CAAA,GAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIC,KAAG,MAAM,wIACX,yTAAyT,EAAK,CAAA,CAC1T;;MAIR,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAa,cAAYA,KAAG,MAAM,QAAQ,eAAe;iBACrE,gBAAgB,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAmB,MAAK;QACnD,gBAAc,YAAY;QAC1B,iBAAe,WAAW,IAAI;QAC9B,eAAe,WAAW,IAAI;kBAAI,SAAS,WAAWA,KAAG,MAAM,aAAa,eAAe,IACvF,SAAS,gBAAgBA,KAAG,MAAM,eAAe,aAAa,IAAIA,KAAG,MAAM,UAAU,YAAY;OAAU,GAJvE,IAIuE,CAAC;MAC/G,CAAA;MACJ,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAK;iBAAS;MAAS,CAAA;MACnC,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAK;iBAAU;MAAU,CAAA;MAIvC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAiB,IAAI,WAAW,QAAQ;OAAG,QAAQ,YAAY;OAC5E,MAAK;OAAS,cAAYA,KAAG,MAAM,aAAa,eAAe;iBADjE;QAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,aAAa,eAAe,EAAM,CAAA;QAChD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,oEAAoE,2JAA2J,EAAK,CAAA;QACjP,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,2CAA2C,qFAAqF,EAAK,CAAA;QAClJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;SAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,QAAQ,aAAa,EAAK,CAAA;SAAC;SAAGA,KAAG,MAAM,qGACrD,8MAA8M;QAAK,EAAA,CAAA;QACpN,CAAC,SAAS,CAAC,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,MAAK;mBAAUA,KAAG,MAAM,WAAW,iBAAiB;QAAK,CAAA;QAChF,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;SACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;UAAS,WAAU;UAAc,cAAYA,KAAG,MAAM,QAAQ,YAAY;oBAA1E;WACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAU;sBAAf,CACG,MAAM,KAAK,OAAO,UAAU;aAC3B,MAAM,WAAW,MAAM,QAAQ,SAAS;aACxC,MAAM,QAAQ,MAAM,KAAK,KAAK,KAAKA,KAAG,MAAM,SAAS,gBAAgB;aAGrE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;cAAK,WAAU;cAA+B,eAAa;wBAA3D,CACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;eAAQ,MAAK;eAAS,WAAU;eAAoB,gBAAc;eAChE,eAAe,UAAU,KAAK;yBADhC,CAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;gBAAM,WAAU;gBAAqB,eAAY;eAAQ,CAAA,GACzD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;gBAAM,WAAU;0BAAhB;iBACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;kBAAM,WAAU;4BAAqB;iBAAY,CAAA;iBACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;kBAAM,WAAU;4BAAuB,GAAG,UAAU,MAAM,KAAK,IAAI,EAAE,KAAK,UAAU,MAAM,KAAK,MAAM;iBAAU,CAAA;iBAC9G,cAAc,MAAM,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;kBAAM,WAAU;4BACrEA,KAAG,MAAM,kBAAkB,iDAAiD;iBAAQ,CAAA;gBACnF;iBACA;kBACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;eAAQ,MAAK;eAAS,WAAU;eAAuB,UAAU,UAAU,MAAM,UAAU;eACzF,cAAYA,KAAG,MAAM,QAAQ,SAAS,gBAAgB,OAAO;eAC7D,UAAS,UAAS;gBAAE,MAAM,gBAAgB;gBAAG,YAAY,KAAK;eAAE;yBAAIA,KAAG,MAAM,MAAM,QAAQ;cAAU,CAAA,CACpG;gBAdqC,MAAM,GAc3C;YACP,CAAC,GACA,CAAC,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,sCAAsC,kEAAkE,EAAK,CAAA,CACzI;;WACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,WAAU;YAAmB,UAAU,UAAU,MAAM,UAAU,MAAM;YAAU,SAAS;sBAAWA,KAAG,MAAM,UAAU,aAAa;WAAU,CAAA;WACrK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,QAAQ,MAAM,SAAS,iCAAiC,SAAS,MAAM,SAAS,uDAAuD,EAAK,CAAA;UAClJ;;SACR,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;UAAU,WAAU;UAAc,UAAU;oBAA5C;WACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQA,KAAG,MAAM,MAAM,MAAM,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,MAAK;YAAO,WAAW;YAAI,cAAYA,KAAG,MAAM,QAAQ,YAAY;YACxG,OAAO,QAAQ;YAAM,WAAU,UAAS,QAAO,WAAU;aAAE,GAAG;aAAO,MAAM,MAAM,OAAO;YAAM,EAAE;WAAI,CAAA,CAAQ,EAAA,CAAA;WAC9G,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;YAAa,MAAK;YAAO,OAAO,QAAQ,KAAK;YAAM,SAAS,MAAM;YAAS,WAAU,UAAS;aAAE,IAAI,OAAO,YAAY,QAAQ,KAAK;YAAE;WAAI,CAAA;WAC1I,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;YAAa,MAAK;YAAW,OAAO,QAAQ,KAAK;YAAQ,SAAS,MAAM;YAAS,WAAU,UAAS;aAAE,IAAI,OAAO,YAAY,UAAU,KAAK;YAAE;WAAI,CAAA;WAClJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAUA,KAAG,MAAM,gBAAgB,6BAA6B,EAAW,CAAA,GAClF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAU;sBAAf;aACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,wCAAwC,gHAAgH,EAAK,CAAA;aAC1K,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;cAAa,MAAK;cAAY,OAAO,QAAQ,KAAK,WAAW;cAAO,SAAS,MAAM;cAAS,WAAU,UAAS,QAAO,UAAS;eAC7H,MAAM,EAAE,WAAW,GAAG,SAAS,MAAM;eACrC,OAAO;gBAAE,GAAG;gBAAO,MAAM,QAAQ;iBAAE,GAAG;iBAAM,WAAW;kBAAE;kBAAO,iBAAiB,WAAW,mBAAmB;iBAAK;gBAAE,IAAI;eAAK;cACjI,CAAC;aAAI,CAAA;aACJ,QAAQ,KAAK,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQA,KAAG,MAAM,eAAe,oBAAoB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;cAAO,cAAYA,KAAG,MAAM,iBAAiB,+BAA+B;cAAG,MAAK;cAAS,KAAI;cAAI,KAAI;cACxL,OAAO,QAAQ,KAAK,UAAU;cAAiB,WAAU,UAAS;eAAE,MAAM,kBAAkB,OAAO,MAAM,OAAO,KAAK;eACnH,QAAO,UAAS,MAAM,KAAK,YAAY;gBAAE,GAAG;gBAAO,MAAM;iBAAE,GAAG,MAAM;iBAAM,WAAW;kBAAE,GAAG,MAAM,KAAK;kBAAW;iBAAgB;gBAAE;eAAE,IAAI,KAAK;cAAE;aAAI,CAAA,CAAQ,EAAA,CAAA;YAC5J;aACE,EAAA,CAAA;UACD;;SACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAU;oBAAf,CAAgC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,yEAAyE,4LAA6L,EAAK,CAAA,GACtT,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,UAAU,UAAU,CAAC,SAAS,CAAC,MAAM;WAAQ,eAAe;YAAE,KAAU;WAAE;qBAAI,SAASA,KAAG,MAAM,SAAS,SAAS,IAAIA,KAAG,MAAM,QAAQ,aAAa;UAAU,CAAA,CACnK;;SACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,uCAAuC,2FAA2F,EAAK,CAAA;SACpJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,wDAAwD,sIAAuI,EAAK,CAAA;SAChN,QAAQ,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAiB,MAAK;oBAAU,GAAG,KAAK,KAAK,IAAIA,KAAG,MAAM,mBAAmB,sCAAsC,IAAI,KAAK,SAAS,KAAK,KAAK,WAAW;SAAQ,GAA1J,KAAK,EAAqJ,CAAC;SACvL,MAAM,wBAAwB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,kBAAkB,2DAA2D,EAAK,CAAA;QAC9H,EAAA,CAAA;QACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD,EAAa,SAAS,OAAO,YAAY,EAAI,CAAA;QAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD,CAAgB,CAAA;OACb;;MAKL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAiB,IAAI,WAAW,aAAa;OAAG,QAAQ,YAAY;OACjF,MAAK;OAAS,cAAYA,KAAG,MAAM,wBAAwB,uBAAuB;iBADpF;QAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,eAAe,aAAa,EAAM,CAAA;QAChD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,sGACX,wMAAwM,EAAK,CAAA;QAC9M,YAAY,iBAAiB,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD,EAAY,SAAS,MAAQ,CAAA;OACxD;;MACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAiB,IAAI,WAAW,KAAK;OAAG,QAAQ,YAAY;OACzE,MAAK;OAAS,cAAYA,KAAG,MAAM,UAAU,YAAY;iBACxD,YAAY,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD,CAAmB,CAAA;MACtC,CAAA;KACF;MACF;;EACP;;;;;;;EC3VA,SAAgB,gBAAgB,EAAE,OAAO,IAAI,SAAS,OAAO,aAA8C;GACzG,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,MAAK;IACL,cAAW;IACX,eAAY;IACZ,WAAU;IACV,SAAQ;IACR,OAAO;IACP,QAAQ;IACR,MAAK;IACL,QAAO;IACP,aAAa,SAAS,MAAM;IAC5B,eAAc;IACd,gBAAe;IACJ;cAbb;KAeE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,IAAG;MAAI,IAAG;MAAM,GAAE;KAAK,CAAA;KAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,IAAG;MAAI,IAAG;MAAO,GAAE;KAAK,CAAA;KAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,IAAG;MAAK,IAAG;MAAI,GAAE;KAAK,CAAA;KAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,GAAE,wCAAyC,CAAA;KACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,GAAE,sCAAuC,CAAA;IAC5C;;EAET;;;EC9BA,SAAgB,eAAe,EAAE,WAAW,QAAwE;GAClH,MAAM,OAAO,QAAQ;GACrB,MAAM,UAAU,KAAK;GACrB,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAuC,MAAM;GAC1D,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAoC;GAClD,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAwC;GACxD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GACrC,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,EAAE;GACvC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GACrC,MAAM,SAAS,OAAO,SAAiB;IACrC,QAAQ,IAAI;IAAG,SAAS,EAAE;IAAG,UAAU,EAAE;IACzC,IAAI;KACF,MAAM,WAAW,MAAM,MAAM,iBAAiB;MAAE,QAAQ;MAAQ,aAAa;MAC3E,SAAS,EAAE,gBAAgB,mBAAmB;MAAG,MAAM,KAAK,UAAU;OAAE,QAAQ;OAAM;OAAW,QAAQ,KAAK;OAC5G,UAAU,QAAQ;OAAU;OAAM;OAAO,GAAI,QAAQ,EAAE,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC;MAAG,CAAC;KAAE,CAAC;KAC5G,MAAM,SAAS,MAAM,SAAS,KAAK;KACnC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,OAAO,SAASC,KAAG,MAAM,eAAe,mCAAmC,CAAC;KAC9G,UAAU,SAAS,aAAaA,KAAG,MAAM,iCAAiC,wFAAwF,IAAI,SAAS,oBAAoBA,KAAG,MAAM,YAAY,mCAAmC,IAAIA,KAAG,MAAM,oBAAoB,2DAA2D,CAAC;IAC1V,SAAS,OAAO;KAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;IAAE,UAC3E;KAAE,QAAQ,KAAK;IAAE;GAC3B;GACA,MAAM,cAAc,YAAY;IAC9B,SAAS,EAAE;IACX,IAAI;KACF,MAAM,WAAW,MAAM,MAAM,GAAG,gBAAgB,gBAAgB;MAAE,aAAa;MAAe,OAAO;KAAW,CAAC;KACjH,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAMA,KAAG,MAAM,YAAY,4BAA4B,CAAC;KACpF,MAAM,QAAQ,MAAM,SAAS,KAAK;KAClC,WAAW;MAAE,GAAG;MAAO,QAAQ,MAAM,OAAO,QAAO,UAAS,CAAC,iBAAiB,MAAM,EAAE,CAAC;KAAE,CAAC;IAC5F,SAAS,OAAO;KAAE,SAAS,OAAO,KAAK,CAAC;IAAE;GAC5C;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAkB,cAAYA,KAAG,MAAM,eAAe,iBAAiB;cAA1F;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,UAAU,oBAAoB,EAAM,CAAA;KACjD,OAAO,QAAQ,QAAQ,KAAK,CAAC,CAAC,QAAQ,GAAG,UAAU,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;MAChG,QAAQ,SAAS,SAAS;MAAW;MAAI,KAAM;MAAK;MAAI,KAAM,SAAS,gBAAgBA,KAAG,MAAM,kBAAkB,sDAAsD,IAAI,KAAM,SAAS,wBAAwBA,KAAG,MAAM,yBAAyB,0EAA0E,IAAI,KAAM,KAAK,SAAS,OAAO,IAAIA,KAAG,MAAM,YAAY,0BAA0B,IAAIA,KAAG,MAAM,YAAY,+BAA+B;MACzc,KAAM,kBAAkB,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;OAAQA,KAAG,MAAM,aAAa,qBAAqB;OAAE;OAAG,IAAI,KAAK,KAAM,cAAc,CAAC,CAAC,eAAe;OAAE;OAAEA,KAAG,MAAM,aAAa,qBAAqB;MAAS,EAAA,CAAA;KACtL,EAAA,GAHwG,GAGxG,CAAC;KACH,QAAQ,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,MAAK;gBAAR;OAAkBA,KAAG,MAAM,QAAQ,wBAAwB;OAAE;OAAG,IAAI,KAAK,QAAQ,SAAS,KAAK,CAAC,CAAC,eAAe;OAAE;OACpI;QAAE,WAAWA,KAAG,MAAM,OAAO,WAAW;QAAG,WAAWA,KAAG,MAAM,OAAO,WAAW;QAAG,OAAOA,KAAG,MAAM,SAAS,UAAU;QAAG,QAAQA,KAAG,MAAM,QAAQ,QAAQ;OAAE,EAAG,QAAQ,SAAS;OAAQ,QAAQ,SAAS,SAAS,MAAM,QAAQ,SAAS,WAAW;MAAM;;KAC7P,QAAQ,aAAa,CAAC,YAAY,aAAa,CAAC,CAAC,SAAS,QAAQ,UAAU,KAAK,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;gBAASA,KAAG,MAAM,mCAAmC,4GAA4G;KAAK,CAAA;MACnQ,KAAK,cAAc,KAAK,mBAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;gBAASA,KAAG,MAAM,8GAA8G,sSAAsS;KAAK,CAAA;KAC/d,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;gBAAS;KAAS,CAAA;KAAG,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;gBAAU;KAAU,CAAA;KAC7E,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;MAAU,UAAU,QAAQ,KAAK,iBAAiB,KAAK,KAAK,mBAAmB,KAAK,KAAK,cAAc,KAAK;gBAA5G;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,eAAe;SAAE,OAAY,UAAU;QAAE;kBAAIA,KAAG,MAAM,QAAQ,eAAe;OAAU,CAAA;OAC/F,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA;QAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAS,eAAe;UAAE,IAAI,CAAC,SAAS,YAAiB;SAAE;mBAAIA,KAAG,MAAM,aAAa,kCAAkC;QAAW,CAAA;QACzI,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;SAAQA,KAAG,MAAM,MAAM,MAAM;SAAE;SAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UAAQ,OAAO;UAAM,WAAU,UAAS;WAAE,QAAQ,MAAM,OAAO,KAA0B;WAAG,SAAS,KAAA,CAAS;UAAE;oBAAhH,CAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,OAAM;qBAAO;UAAY,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,OAAM;qBAAS;UAAgB,CAAA,CACnE;;QAAQ,EAAA,CAAA;QACf,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;SAAa,MAAM,SAAS,SAAS,SAAS;SAAmB;SAAgB;SAAS,UAAU;QAAW,CAAA;QAC3H,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,gDAAgD,sIAAwI,EAAK,CAAA;QAC1M,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,UAAU,CAAC;SAAO,eAAe;UAAE,OAAY,aAAa;SAAE;mBAAIA,KAAG,MAAM,WAAW,0BAA0B;QAAU,CAAA;OAC3H,EAAA,CAAA;OACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA;QAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAUA,KAAG,MAAM,UAAU,yBAAyB,EAAW,CAAA;QACxE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;SAAQA,KAAG,MAAM,QAAQ,YAAY;SAAE;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,cAAYA,KAAG,MAAM,UAAU,mBAAmB;UAAG,MAAK;UAAiB,OAAO;UAAO,WAAU,UAAS,SAAS,MAAM,OAAO,KAAK;SAAI,CAAA;QAAQ,EAAA,CAAA;QAClM,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAIA,KAAG,MAAM,6CAA6C,+GAA+G,EAAK,CAAA;QAC9K,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,UAAU,CAAC;SAAO,eAAe;UAAE,OAAY,UAAU;SAAE;mBAAIA,KAAG,MAAM,QAAQ,UAAU;QAAU,CAAA;QAC3G,QAAQ,UAAU,UAAU,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,eAAe;UAAE,OAAY,iBAAiB;SAAE;mBAAIA,KAAG,MAAM,QAAQ,QAAQ;QAAU,CAAA;OACpI,EAAA,CAAA;MACD;;IACH;;EACX;;;ECvDA,MAAM,0BAAU,IAAI,IAAmB;EACvC,MAAM,gBAAgB,SAAS,oBAAoB;EACnD,MAAM,0BAAU,IAAI,IAAI;GAAC;GAAM;GAAM;GAAM;GAAM;GAAM;EAAM,CAAC;EAE9D,SAAS,UAAU,WAAmB,UAAsB,UAAqC;GAC/F,IAAI,QAAQ,QAAQ,IAAI,SAAS;GACjC,IAAI,CAAC,OAAO;IACV,QAAQ;KAAE,2BAAW,IAAI,IAAI;KAAG,MAAM;KAAO,kBAAkB,CAAC;IAAE;IAClE,QAAQ,IAAI,WAAW,KAAK;IAC5B,MAAM,MAAM;IACZ,MAAM,eAAe,QAAQ,IAAI,SAAS,MAAM,OAAO,IAAI,UAAU,OAAO;IAC5E,MAAM,WAAW,aAAuB;KACtC,IAAI,CAAC,OAAO,GAAG;KACf,IAAI,WAAW;KACf,KAAK,MAAM,UAAU,IAAI,UAAU,KAAK,GAAG,OAAO;IACpD;IACA,MAAM,UAAU,YAAY;KAC1B,IAAI,CAAC,OAAO,KAAK,IAAI,QAAQ,CAAC,QAAQ,GAAG;KACzC,aAAa,IAAI,KAAK;KACtB,IAAI,OAAO;KACX,MAAM,QAAQ,IAAI,gBAAgB;KAAG,IAAI,QAAQ;KACjD,MAAM,WAAW,iBAAiB;MAChC,IAAI,OAAO,KAAK,QAAQ,GAAG,QAAQ;OAAE;OAAW,QAAQ;MAAK,CAAC;MAC9D,MAAM,MAAM;KACd,GAAG,GAAK;KACR,IAAI;MACF,MAAM,WAAW,MAAM,MAAM,GAAG,gBAAgB,yBAAyB,mBAAmB,SAAS,KACnG;OAAE,aAAa;OAAe,OAAO;OAAY,QAAQ,MAAM;MAAO,CAAC;MACzE,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,aAAa;MAC/C,MAAM,SAAS,MAAM,SAAS,KAAK;MACnC,IAAI,OAAO,kBAAkB,KAAK,OAAO,cAAc,WAAW,MAAM,IAAI,MAAM,mBAAmB;MACrG,IAAI,CAAC,MAAM,OAAO,SAAS,QAAQ;OAAE;OAAW;OAAQ,QAAQ;MAAM,CAAC;KACzE,QAAQ;MACN,IAAI,CAAC,MAAM,OAAO,SAAS,QAAQ;OAAE;OAAW,QAAQ;MAAK,CAAC;KAChE,UAAU;MACR,aAAa,QAAQ;MAAG,IAAI,OAAO;MACnC,IAAI,OAAO,KAAK,QAAQ,GAAG;OACzB,MAAM,OAAO,CAAC,GAAG,IAAI,UAAU,OAAO,CAAC,CAAC,CAAC,MAAK,UAAS,MAAM,CAAC,KAAK,QAAQ,IAAI,IAAI,UAAU,QAAQ,MAAM,SAAS,EAAE;OACtH,IAAI,QAAQ,iBAAiB;QAAE,QAAa;OAAE,GAAG,OAAO,MAAO,IAAK;MACtE;KACF;IACF;IACA,IAAI,mBAAmB;KACrB,aAAa,IAAI,KAAK;KACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,MAAM;UAC5B,QAAa;IACpB;IACA,SAAS,iBAAiB,oBAAoB,IAAI,UAAU;GAC9D;GACA,MAAM,UAAU,IAAI,UAAU,QAAQ;GACtC,IAAI,MAAM,UAAU,SAAS,KAAK,SAAS,GAAG,MAAM,WAAW;GAC/D,MAAM,MAAM;GACZ,aAAa;IACX,IAAI,UAAU,OAAO,QAAQ;IAC7B,IAAI,IAAI,UAAU,MAAM;IACxB,QAAQ,OAAO,SAAS;IACxB,aAAa,IAAI,KAAK;IAAG,IAAI,OAAO,MAAM;IAC1C,SAAS,oBAAoB,oBAAoB,IAAI,UAAU;GACjE;EACF;;;;;;EAOA,SAAgB,gBAAgB,WAAmB,cAAkC,gBAAgB,OAAO,OAAO,OAA6B;GAC9I,MAAM,eAAA,GAAA,MAAA,OAAA,CAAqB,YAAY,GAAG,gBAAA,GAAA,MAAA,OAAA,CAAsB,aAAa,GAAG,WAAA,GAAA,MAAA,OAAA,CAAiB,IAAI;GACrG,YAAY,UAAU;GAAc,aAAa,UAAU;GAAe,QAAQ,UAAU;GAC5F,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,cAAc,QAAQ,IAAI,SAAS,CAAC,EAAE,WAAW;GAAE,GAAG,CAAC,WAAW,YAAY,CAAC;GACrG,QAAA,GAAA,MAAA,qBAAA,EAAA,GAAA,MAAA,YAAA,EACc,aAAY,UAAU,WAAW,gBAAgB;IAC3D,IAAI,QAAQ,SAAS,OAAO;IAC5B,MAAM,OAAO,QAAQ,IAAI,SAAS,CAAC,EAAE,UAAU,QAAQ;IACvD,OAAO,YAAY,YAAY,KAAA,KAAa,MAAM,OAAO,YAAY,YAAY,CAAC,aAAa,WAAW,KAAK;GACjH,CAAC,GAAG,CAAC,SAAS,CAAC,IAAA,GAAA,MAAA,YAAA,OACG,QAAQ,IAAI,SAAS,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,SACzD,KAAA,CACR;EACF;;;ECtFA,MAAMC,WAAS;;;;;;;;;;;;;;;;EAiBf,MAAM,QAAQ,UAAkB,UAAU,SAAS,SAAS;EAC5D,MAAM,aAAa,MAAY,WAAmB;GAAE,cAAcC,KAAG,MAAM,MAAM,MAAM;GAAG,YAAYA,KAAG,MAAM,MAAM,YAAY;GAC/H,mBAAmBA,KAAG,MAAM,MAAM,WAAW;GAAG,iBAAiBA,KAAG,MAAM,MAAM,OAAO;EAAE,EAAA,CAA6B,UAAU;EAClI,MAAM,aAAa,MAAY,WAAmB;GAAE,SAASA,KAAG,MAAM,OAAO,aAAa;GAAG,MAAMA,KAAG,MAAM,OAAO,UAAU;GAAG,cAAcA,KAAG,MAAM,QAAQ,YAAY;GACzK,cAAcA,KAAG,MAAM,QAAQ,kBAAkB;GAAG,SAASA,KAAG,MAAM,OAAO,SAAS;GAAG,OAAOA,KAAG,MAAM,QAAQ,QAAQ;GAAG,SAASA,KAAG,MAAM,UAAU,aAAa;EAAE,EAAA,CAA6B,UAAU;EAChN,MAAM,eAAe,MAAY,WAAmB;GAAE,oBAAoBA,KAAG,MAAM,SAAS,YAAY;GAAG,UAAUA,KAAG,MAAM,OAAO,UAAU;GAC7I,mBAAmBA,KAAG,MAAM,QAAQ,iBAAiB;GAAG,WAAWA,KAAG,MAAM,SAAS,WAAW;EAAE,EAAA,CAA6B,UAAU;EAC3I,MAAM,WAAW,MAAY,UAAyB,MAAM,kBAAkB,IAAI,MAAM,MAAM,qBAAqB,IAAIA,KAAG,MAAM,OAAO,cAAc,IACjJ,GAAG,MAAM,YAAY,eAAe,IAAI,MAAM,mBAAmB,MAAM,gBAAgBA,KAAG,MAAM,IAAI,MAAM,iBAAiB,GAAG,MAAM,cAAc,SAAS,KAAK,MAAM,iBAAiB,GAAG,MAAM,cAAc,WAAW,IAAI;EACjO,MAAM,YAAY;GAAE,QAAQ;GAAY,OAAO;GAAoC,UAAU;GAAI,YAAY;EAAI;;EAGjH,SAAgB,aAAa,EAAE,WAAW,gBAAgB,SAAyD;GACjH,MAAM,OAAO,QAAQ;GACrB,MAAM,WAAW,UAAkB,UAAU,MAAM,KAAK,GAAG,WAAW,UAAkB,UAAU,MAAM,KAAK;GAC7G,MAAM,aAAa,UAAkB,YAAY,MAAM,KAAK,GAAG,SAAS,UAAyB,QAAQ,MAAM,KAAK;GACpH,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,SAAA,CAAoC;GACzD,MAAM,WAAW,gBAAgB,WAAW,cAAc,aAAa;GACvE,IAAI,CAAC,YAAY,SAAS,cAAc,WAAW,OAAO,gBAAgB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,OAAO;IAAW,MAAK;cAAUA,KAAG,MAAM,mBAAmB,wBAAwB;GAAK,CAAA;GAC9K,IAAI,SAAS,QAAQ,OAAO,gBAAgB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,OAAO;IAAW,MAAK;cAAUA,KAAG,MAAM,kDAAkD,yFAAyF;GAAK,CAAA;GAChP,MAAM,OAAO,SAAS,QAAQ;GAC9B,IAAI,CAAC,SAAS,QAAQ,YAAY,CAAC,MAAM,OAAO;GAChD,IAAI,iBAAiB,CAAC,KAAK,WAAW,OAAO;GAC7C,MAAM,EAAE,UAAU;GAClB,MAAM,eAAe,KAAK,oBAAoB,KAAK,KAAK,iBAAiB,aAAaA,KAAG,MAAM,uBAAuB,4CAA4C,IAC7J;IAAE,UAAUA,KAAG,MAAM,QAAQ,UAAU;IAAG,SAASA,KAAG,MAAM,QAAQ,iBAAiB;IAAG,YAAYA,KAAG,MAAM,QAAQ,YAAY;GAAE,EAAG,KAAK;GAChJ,MAAM,QAAQ,SAAS,OAAO,KAAK,WAAW,KAAK,QAAQ,KAAK,OAAO,SAAS,SAAS,QAAQ,KAAK,aAAa,KAAA,IAAY,KAAK,WAAW,KAAK;GACpJ,MAAM,SAAS,SAA4B;IACzC,MAAM,QAAQ,MAAM,OAAO,KAAK,OAAO,cAAc,MAAM,OAAO,OAAO,OAAO;IAChF,OAAO,QAAQA,KAAG,MAAM,UAAU,KAAK,MAAM,MAAM,OAAO,KAAK,CAAC,OAAO,cAAc,QAAQ,GAAG,EAAE,IAAI,MAAM,KAAK,MAAM,MAAM,OAAO,KAAK,CAAC,OAAO,cAAc,QAAQ,GAAG,EAAE,YAAY,IAAI;GAC9L;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAA8B,WAAU,UAAS,gBAAgB,MAAM,cAAc,OAAO,KAAK,KAAK,KAAA,CAAS;cAAlI;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQD,SAAc,CAAA;KACtB,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,cAAYC,KAAG,MAAM,YAAY,MAAM,QAAQ,YAAY,MAAM,eAAe;MAAG,iBAAc;gBAA1G;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAU;QAAsB,MAAK;kBAA3C,CAAoD,aAAU,KAAY;;OAC1E,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAU;kBAAuBA,KAAG,MAAM,GAAG,MAAM,MAAM,OAAO,GAAG,MAAM,MAAM,UAAU;OAAQ,CAAA;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAOA,KAAG,MAAM,MAAM,SAAS,EAAQ,CAAA;MACxI;;KACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAuB,UAAU;MAAG,cAAYA,KAAG,MAAM,eAAe,qBAAqB;MAAG,iBAAc;gBAA7H;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,WAAW,KAAK,UAAU,OAAOA,KAAG,MAAM,aAAa,gBAAgB,4BAA4B,cAAc,IAAIA,KAAG,MAAM,UAAU,gBAAgB,eAAe,cAAc,GAAM,CAAA;OAC9L,KAAK,gBAAgB,KAAK,UAAU,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;QAA2B;QAAiB;OAAO,CAAA;OAChG,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,OAAQ,CAAA;QAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAK,KAAK,OAAO,KAAK,OAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,KAAK,OAAO,KAAK,SAAgB,CAAA,CAAK,EAAA,CAAA;QACvF,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,WAAY,CAAA;QAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAK,KAAK,OAAO,OAAO,OAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,KAAK,OAAO,OAAO,UAAU,KAAK,WAAWA,KAAG,MAAM,cAAc,uBAAuB,IAAIA,KAAG,MAAM,WAAW,sBAAsB,CAAS,EAAA,CAAA,CAAK,EAAA,CAAA;QAC7M,KAAK,OAAO,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,YAAY,EAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAK,KAAK,OAAO,UAAU,OAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,KAAK,OAAO,UAAU,SAAgB,CAAA,CAAK,EAAA,CAAA,CAAG,EAAA,CAAA;QAC5J,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,OAAO,mBAAmB,EAAM,CAAA;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,iBAAqB,CAAA;QAC9E,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,SAAS,iBAAiB,EAAM,CAAA;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,eAAmB,CAAA;OAC1E,EAAA,CAAA;OACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,iBAAiB,EAAM,CAAA;OAC7C,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,gBAAgB,EAAM,CAAA;QAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAK,MAAM,OAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,OAAO,MAAM,gBAAgB,QAAQ,MAAM,eAAe,KAAK,SAAS,MAAM,gBAAgB,eAAe,MAAM,eAAe,WAAW,EAAS,CAAA,CAAK,EAAA,CAAA;QAC1O,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,eAAe,EAAM,CAAA;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,GAAG,MAAM,WAAW,UAAU,MAAM,iBAAiB,SAAS,MAAM,gBAAgB,QAAQ,GAAG,MAAM,WAAW,WAAW,MAAM,iBAAiB,iBAAiB,MAAM,gBAAgB,YAAY,EAAM,CAAA;QACrQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,YAAY,cAAc,EAAM,CAAA;QAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAK,MAAM,MAAM,KAAK,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,aAAa,yBAAyB,EAAS,CAAA,CAAK,EAAA,CAAA;QAC5I,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,YAAY,EAAM,CAAA;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,MAAM,MAAM,SAAS,EAAM,CAAA;QACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,YAAY,eAAe,EAAM,CAAA;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,MAAM,MAAM,MAAM,EAAM,CAAA;OAC3E,EAAA,CAAA;OACH,KAAK,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;QAAiB;QAAM,MAAM,KAAK;OAAO,CAAA;OACvD,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,OAAO,SAAS,EAAM,CAAA;OACpC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACI,CAAC,QAAQ,QAAQ,CAAC,CAAW,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAACC,MAAAA,UAAD,EAAA,UAAA,CACzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,SAAS,SAAS,SAAS,WAAe,CAAA,GAC/C,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;QAAKD,KAAG,MAAM,GAAG,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,GAAG,MAAM,OAAO,KAAK,CAAC,MAAM,UAAU;QAAE;QAAIA,KAAG,MAAM,MAAM,QAAQ;QAAE;QAAE,MAAM,MAAM,OAAO,KAAK,CAAC,MAAM;QACnJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;SAAQA,KAAG,MAAM,MAAM,OAAO;SAAE;SAAE,MAAM,MAAM,OAAO,KAAK,CAAC,KAAK;SAAE;SAAIA,KAAG,MAAM,QAAQ,YAAY;SAAE;SAAE,MAAM,MAAM,OAAO,KAAK,CAAC,SAAS;SAAG,MAAM,IAAI;QAAS,EAAA,CAAA;OAAK,EAAA,CAAA,CAC9J,EAAA,GAJgD,IAIhD,CAAC,EACT,CAAA;OACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,kDAAkD,kJAAkJ,EAAS,CAAA;OAC9N,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,WAAW,uBAAuB,EAAM,CAAA;OACrD,KAAK,SAAS,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,SAAS,KAAI,YAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;QAAwB,KAAK,QAAQ,IAAI;QAAE;QAAI,QAAQ,QAAQ,OAAO;QAAE;QAAI,QAAQ,WAAWA,KAAG,MAAM,OAAO,UAAU,IAAIA,KAAG,MAAM,QAAQ,aAAa;QACnN,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;SAAQ,QAAQ,YAAY,eAAe;SAAE;SAAI,QAAQ,OAAO,eAAe;SAAE;SAAU,QAAQ,YAAY,UAAUA,KAAG,MAAM,QAAQ,OAAO,IAAIA,KAAG,MAAM,MAAM,WAAW;QAAS,EAAA,CAAA;OACtL,EAAA,GAF+D,QAAQ,IAEvE,CAAC,EAAM,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,cAAc,wBAAwB,EAAS,CAAA;OAC/E,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,UAAU,uBAAuB,EAAM,CAAA;OACpD,KAAK,SAAS,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,SAAS,KAAI,YAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;QAAsB,KAAK,QAAQ,IAAI;QAAE;QAAI,QAAQ,QAAQ,OAAO;QAAE;QAAI,QAAQ,QAAQ,OAAO;QACzJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;SAAQ,QAAQ;SAAM;SAAI,QAAQ;SAAS;SAAI,QAAQ,cAAc,UAAUA,KAAG,MAAM,SAAS,aAAa,IAAI,QAAQ,cAAc,gBAAgBA,KAAG,MAAM,QAAQ,mBAAmB,IAAIA,KAAG,MAAM,SAAS,oBAAoB;QAAS,EAAA,CAAA;OAC7O,EAAA,GAF+D,QAAQ,EAEvE,CAAC,EAAM,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,aAAa,wBAAwB,EAAS,CAAA;OAC9E,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,WAAW,4BAA4B,EAAM,CAAA;OAC1D,KAAK,MAAM,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;QAAmB,KAAK,KAAK,IAAI;QAAE;QAAI,KAAK;QAAK;QAAI,KAAK,SAASA,KAAG,MAAM,QAAQ,OAAO,IAAI,UAAU,KAAK,KAAK;OAAM,EAAA,GAAhH,KAAK,EAA2G,CAAC,EAAM,CAAA,IAC7K,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,aAAa,mBAAmB,EAAS,CAAA;OAC9D,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,qDAAqD,8IAA8I,EAAS,CAAA;MAC1N;;IACE;MA/CsC,KAAK,EA+C3C;EACX;;EAGA,SAAgB,UAAU,EAAE,MAAM,QAAwC;GACxE,MAAM,OAAO,UAAyB,UAAU,OAAO,OAAO,IAAI,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC;GACzF,MAAM,QAAQ,KAAK,aAAa,OAAO,OAAO,OAAO,KAAK,QAAQ;GAClE,MAAM,UAAU,KAAK,WAAW,KAAK,aAAa,KAAK;GACvD,MAAM,UAAU;IACd,KAAK,WAAWA,KAAG,MAAM,GAAG,KAAK,SAAS,SAAS,GAAG,KAAK,SAAS,eAAe,IAAI;IACvF,KAAK,aAAaA,KAAG,MAAM,GAAG,KAAK,WAAW,SAAS,GAAG,KAAK,WAAW,uBAAuB,IAAI;IACrG,KAAK,UAAUA,KAAG,MAAM,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,YAAY,IAAI;GACnF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAKA,KAAG,MAAM,KAAK,IAAI,CAAC;GAC1C,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,eAAe,EAAM,CAAA;IAC3C,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,gBAAgB,EAAM,CAAA;KAC5C,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAK,IAAI,KAAK,gBAAgB,KAAKA,KAAG,MAAM,QAAQ,iBAAiB,GACnE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,MAAM,KAAK,OAAO,uBACjC,GAAG,KAAK,OAAO,2DAA2D,EAAS,CAAA,CAAK,EAAA,CAAA;KAC3F,KAAK,aAAa,QAAQ,KAAK,iBAAiB,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAACC,MAAAA,UAAD,EAAA,UAAA,CACvD,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKD,KAAG,MAAM,MAAM,OAAO,EAAM,CAAA,GACjC,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAK,IAAI,KAAK,QAAQ,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,0BAA0B,KAAK,aAAa,OAAO,KAAK,MAAM,QACrG,GAAG,KAAK,aAAa,sDAAsD,KAAK,MAAM,WAAW,EAAS,CAAA,CAAK,EAAA,CAAA,CACzG,EAAA,CAAA;KACT,UAAU,QAAQ,QAAQ,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,MAAK;gBAAUA,KAAG,MAAM,gCAAgC,gEAAgE;KAAM,CAAA;KAClK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,KAAG,MAAM,QAAQ,aAAa,EAAM,CAAA;KACzC,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAKA,KAAG,MAAM,MAAM,SAAS,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQA,KAAG,MAAM,qCAC9C,4FAA4F,EAAS,CAAA,CAAK,EAAA,CAAA;IAC1G,EAAA,CAAA;IACH,UAAU,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;KAAO,MAAK;eAAZ,CACbA,KAAG,MAAM,KAAK,QAAQ,UAAU,QAAQ,IAAI,GAAG,QAAQ,8BAA8B,QAAQ,EAAE,GAC/F,KAAK,eAAe,SAASA,KAAG,MAAM,iBAAiB,KAAK,eAAe,KAAK,GAAG,EAAE,IACpF,6CAA6C,KAAK,eAAe,KAAK,IAAI,EAAE,EAAE,IAAI,EAC/E;;GACP,EAAA,CAAA;EACJ;;;;EC9HA,SAAgB,WAAW,EAAE,WAAW,WAAW,QAAyB;GAC1E,MAAM,YAAA,GAAA,MAAA,qBAAA,CAAgC,UAAU,WAAW,UAAU,WAAW,CAAC,CAAC;GAElF,MAAM,SAAS,kBAAkB,YAAY,KAAA,CAAS;GACtD,MAAM,OAAO,QAAQ;GACrB,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAA+B;GAC/C,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,KAAK;GAAE,GAAG,CAAC,IAAI,CAAC;GAClC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,QAAQ;KAAE,WAAW,KAAA,CAAS;KAAG;IAAO;IAC7C,IAAI,SAAS;IACb,MAAM,QAAQ,IAAI,gBAAgB;IAClC,MAAM,gBAAgB;KACpB,MAAW,GAAG,gBAAgB,iBAAiB;MAAE,aAAa;MAAe,OAAO;MAAY,QAAQ,MAAM;KAAO,CAAC,CAAC,CACpH,KAAK,OAAM,aAAY;MAAE,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,aAAa;MAAG,OAAO,SAAS,KAAK;KAAgF,CAAC,CAAC,CAClL,MAAK,UAAS;MACb,IAAI,CAAC,QAAQ;MAEb,MAAM,QAAQ,MAAM,MAAM,MAAK,SAAQ,KAAK,OAAO,UAAU,KAAK;MAClE,IAAI,CAAC,MAAM,MAAM,QAAQ,WAAWE,KAAG,MAAM,uDAAuD,uGAAuG,CAAC;WACvM,IAAI,CAAC,OAAO,WAAWA,KAAG,MAAM,2BAA2B,6DAA6D,CAAC;WACzH,IAAI,CAAC,MAAM,YAAY,WAAWA,KAAG,MAAM,uCAAuC,0EAA0E,CAAC;WAC7J,WAAW,KAAA,CAAS;KAC3B,CAAC,CAAC,CACD,YAAY;MAAE,IAAI,QAAQ,WAAWA,KAAG,MAAM,yCAAyC,sFAAsF,CAAC;KAAE,CAAC;IACtL;IACA,QAAQ;IACR,MAAM,MAAM,kBAAkB,OAAO;IACrC,aAAa;KAAE,SAAS;KAAO,MAAM,MAAM;KAAG,IAAI;IAAE;GACtD,GAAG;IAAC;IAAQ;IAAM,UAAU;GAAK,CAAC;GAClC,IAAI,CAAC,QAAQ,OAAO;GACpB,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACJ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IAAS,OAAO;KAAE,QAAQ;KAAY,OAAO;KAAoC,UAAU;KAAI,YAAY;IAAO;cAAI;GAAW,CAAA,GACrJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IAAyB;IAAW,eAAA;GAAe,CAAA,CACnD,EAAA,CAAA;EACJ;;;ECnCA,MAAM,SAAS;;;;;;EAOf,MAAM,UAAU,MAAY,SAAsB,SAAS,cAAcC,KAAG,MAAM,QAAQ,WAAW,IACjG,SAAS,oBAAoBA,KAAG,MAAM,UAAU,iBAAiB,IAAIA,KAAG,MAAM,QAAQ,aAAa;EACvG,MAAM,UAAU,SAAsB,SAAS,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,+BAAD,CAAgC,CAAA,IACzF,SAAS,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,qCAAD,CAAsC,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,iCAAD,CAAkC,CAAA;;;;;;;;EAW7G,SAAgB,iBAAiB,EAAE,WAAW,WAAW,QAA+B;GACtF,MAAM,YAAA,GAAA,MAAA,qBAAA,CAAgC,UAAU,WAAW,UAAU,WAAW,CAAC,CAAC;GAClF,MAAM,SAAS,kBAAkB,YAAY,KAAA,CAAS;GACtD,MAAM,OAAO,QAAQ;GAErB,MAAM,WAAW,gBAAgB,WAAW,KAAA,GAAW,OAAO,IAAI;GAClE,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,KAAK;GAAE,GAAG,CAAC,IAAI,CAAC;GAClC,MAAM,cAAc,SAAS,UAAU,QAAQ,MAAM,cAAc,KAAA;GACnE,IAAI,CAAC,aAAa,OAAO;GACzB,MAAM,OAAO,YAAY,WAAW,WAAW,aAAa;GAC5D,MAAM,OAAO,YAAY,WAAW,WAAW,YAAY,SAAS,YAAY;GAIhF,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAU;IAAoB,OAH9BH,KAAG,MACd,uBAAuB,OAAO,MAAM,YAAY,IAAI,EAAE,YAAY,OAAO,MAAM,YAAY,MAAM,EAAE,yCACnG,8CAA8C,OAAO,MAAM,YAAY,IAAI,EAAE,aAAa,OAAO,MAAM,YAAY,MAAM,EAAE,8GACxE;IAAG,cAAY,GAAG,KAAK,KAAK,OAAO,MAAM,IAAI;IAAK,iBAAc;cAA9G;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,OAAc,CAAA;KACrB,OAAO,IAAI;KACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;gBAA0B;KAAW,CAAA;KACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;gBAA0B,OAAO,MAAM,IAAI;KAAQ,CAAA;IAC/D;;EACR;;ECjCA,MAAM,wBAA6C,IAAI,IAAI,OAAO,OAAO,EAHb,aAAa,WAGA,CAAe,CAAC;;;;;;EAYzF,SAAgB,qBAAqB,MAAuB;GAC1D,OAAO,sBAAsB,IAAI,IAAI;EACvC;;;;ECfA,SAAgB,eAAe,UAAkC;GAC/D,MAAM,QAAQ,SAAS;GACvB,MAAM,KAAK,MAAM,SAAS,cAAc,MAAM,KAAK,SAAS,MAAM,KAAK,QAAQ,OAAO;GACtF,OAAO,UAAU,SAAS,eAAe,GAAG;EAC9C;;;;;;;EAqBA,MAAM,iBAAiB;EACvB,MAAM,cAAc;;EAGpB,SAAgB,qBAAqB,MAAsC;GACzE,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,KAAI,SAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,QAAO,SAAQ,SAAS,EAAE;GAClF,IAAI,MAAM,WAAW,GAAG,OAAO,KAAA;GAC/B,MAAM,UAAU,eAAe,KAAK,MAAM,EAAG;GAC7C,MAAM,OAAO,YAAY,KAAK,MAAM,EAAG;GACvC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,qBAAqB,KAAK,EAAG,GAAG,OAAO,KAAA;GACjE,IAAI;GACJ,IAAI;IAAE,OAAO,KAAK,MAAM,KAAK,EAAG;GAAE,QAAQ;IAAE;GAAiB;GAC7D,IAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG,OAAO,KAAA;GAC7E,MAAM,SAAS;GACf,IAAI,OAAO,OAAO,QAAQ,YAAY,OAAO,QAAQ,IAAI,OAAO,KAAA;GAChE,IAAI,CAAC,OAAO,cAAc,OAAO,IAAI,KAAM,OAAO,OAAkB,GAAG,OAAO,KAAA;GAC9E,IAAI,OAAO,QAAQ,EAAE,MAAM,OAAO,MAAM,OAAO,KAAA;GAC/C,MAAM,OAAO,QAAQ,EAAE,CAAE,KAAK;GAC9B,OAAO;IAAE,KAAK,OAAO;IAAK,MAAM,OAAO;IAAgB,MAAM,SAAS,KAAK,aAAa;GAAK;EAC/F;;;ECnDA,SAAgB,aAAa,QAAkD;GAC7E,MAAM,uBAAO,IAAI,IAAyB;GAC1C,KAAK,MAAM,SAAS,QAAQ;IAC1B,MAAM,KAAK,eAAe,KAAK;IAC/B,IAAI,MAAM,OAAO,SAAS,aAAa,KAAK,IAAI,IAAI;KAAE;KAAI,MAAM,MAAM;IAAO,CAAC;SACzE;KACH,MAAM,MAAM,KAAK,IAAI,EAAE;KACvB,IAAI,KAAK,KAAK,IAAI,IAAI;MAAE,GAAG;MAAK,QAAQ,MAAM;KAAO,CAAC;IACxD;GACF;GACA,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC;EAC1B;;EAGA,SAAgB,cAAc,KAA8B;GAC1D,IAAI,CAAC,IAAI,UAAU,IAAI,OAAO,KAAK,QAAQ,SAAS,OAAO,CAAC;GAC5D,MAAM,OAAO,IAAI,OAAO,KAAK;GAC7B,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,GAAG,OAAO,CAAC;GACzC,OAAO,KAAK,MAAM,QAAQ,SAA2B,QAAQ,OAAO,SAAS,YACxE,OAAO,KAAK,SAAS,aAAa,OAAO,KAAK,YAAY,YAAY,KAAK,YAAY,SAAS,OAAO,KAAK,YAAY,QAAQ;EACvI;;;ECHA,MAAM,eAAe;EACrB,MAAM,WAAW;;EAGjB,MAAM,qCAA0C,IAAI,IAAI;GACtD;GAAe;GAAQ;GAAmB;GAAY;GAAM;EAC9D,CAAC;;EAGD,MAAM,sCAA2C,IAAI,IAAI,CAAC,QAAQ,MAAM,CAAC;EAEzE,SAAS,WAAW,OAAgC,MAA6C;GAC/F,KAAK,MAAM,OAAO,MAAM;IACtB,MAAM,QAAQ,MAAM;IACpB,IAAI,OAAO,UAAU,YAAY,UAAU,IAAI,OAAO;IACtD,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG,OAAO,OAAO,KAAK;GAC9E;EAEF;EAEA,SAAS,YAAY,KAAkD;GACrE,IAAI;IACF,MAAM,SAAkB,KAAK,MAAM,GAAG;IACtC,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG,OAAO;GACtF,QAAQ,CAA+D;EAEzE;;EAGA,SAAS,eAAe,OAAyC;GAC/D,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO,CAAC;GACnD,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO;GAC/D,IAAI,OAAO,UAAU,UAAU;IAC7B,IAAI,OAAO,MAAM,KAAK;IACtB,IAAK,KAAK,WAAW,IAAG,KAAK,KAAK,SAAS,IAAG,KAAO,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAC5F,IAAI;KACF,MAAM,WAAoB,KAAK,MAAM,IAAI;KACzC,IAAI,OAAO,aAAa,UAAU,OAAO,SAAS,KAAK;IACzD,QAAQ,CAA6B;IAEvC,IAAI;KACF,MAAM,SAAkB,KAAK,MAAM,IAAI;KACvC,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG,OAAO;KACpF,OAAO,EAAE,OAAO,OAAO;IACzB,QAAQ;KAAE,OAAO,EAAS,MAAM;IAAE;GACpC;GACA,OAAO,EAAE,MAAM;EACjB;EAEA,SAAS,UAAU,MAAc,OAAmG;GAClI,IAAI,SAAS,KAAK,IAAI,GAAG;IACvB,MAAM,SAAS,WAAW,OAAO;KAAC;KAAc;KAAe;KAAc;IAAQ,CAAC;IACtF,MAAM,QAAQ,WAAW,OAAO;KAAC;KAAY;KAAa;KAAY;KAAQ;IAAM,CAAC;IACrF,IAAI,UAAU,KAAA,GAAW;KACvB,MAAM,MAAM,MAAM,aAAa,MAAM,aAAa,MAAM,QAAQ,MAAM,cAAc,MAAM,UAAU,MAAM;KAC1G,OAAO;MAAE,MAAM;MAAO,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;MAAI,OAAO,eAAe,GAAG;KAAE;IAChG;GACF;GACA,IAAI,KAAK,WAAW,OAAO,GAAG;IAC5B,MAAM,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI;IACtC,IAAI,MAAM,UAAU,GAAG,OAAO;KAAE,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;KAAG,QAAQ,MAAM;KAAK;IAAM;GAC5F;GACA,OAAO;IAAE;IAAM;GAAM;EACvB;;;;;;EAOA,SAAgB,cAAc,MAAc,cAAqC;GAC/E,MAAM,SAAS,YAAY,YAAY;GACvC,MAAM,MAAM,UAAU,CAAC;GACvB,IAAI,qBAAqB,IAAI,GAAG;IAC9B,MAAM,WAAW,OAAO,IAAI,SAAS,WAAW,IAAI,KAAK,KAAK,IAAI;IAClE,IAAI,aAAa,IAAI,OAAO;KAAE,MAAM;KAAM,WAAW;KAAM,WAAW;KAAK,WAAW,WAAW,KAAA;KAAW,KAAK;IAAa;IAC9H,MAAM,SAAS,OAAO,IAAI,WAAW,YAAY,IAAI,WAAW,KAAK,IAAI,SAAS,KAAA;IAClF,MAAM,YAAY,UAAU,UAAU,eAAe,IAAI,KAAK,CAAC;IAC/D,MAAM,QAAQ,UAAU,UAAU;IAClC,OAAO;KAAE,MAAM,UAAU;KAAM,WAAW;KAAM,WAAW,UAAU;KACnE,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,MAAM;KAAI,WAAW,WAAW,KAAA;KAAW,KAAK;IAAa;GAC1G;GACA,IAAI,SAAS,gBAAgB,WAAW,KAAA,KAAa,OAAO,OAAO,SAAS,UAAU;IACpF,MAAM,OAAO,qBAAqB,OAAO,IAAI;IAC7C,IAAI,SAAS,KAAA,GAAW;KACtB,MAAM,cAAc,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc,KAAA;KAClF,OAAO;MAAE,MAAM,KAAK;MAAM,WAAW;MAAM,WAAW,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,YAAY;MAAG,WAAW;MAAO,KAAK;KAAa;IAC3J;GACF;GACA,OAAO;IAAE,MAAM;IAAM,WAAW;IAAK,WAAW,WAAW,KAAA;IAAW,KAAK;GAAa;EAC1F;;EAGA,SAAgB,iBAAiB,MAAyC;GACxE,OAAO,WAAW,KAAK,WAAW;IAAC;IAAe;IAAgB;IAAW;IAAW;IAAO;GAAK,CAAC;EACvG;;EAGA,SAAgB,cAAc,MAAyC;GACrE,OAAO,WAAW,KAAK,WAAW;IAAC;IAAgB;IAAiB;IAAc;IAAe;IAAQ;IACvG;IAAY;IAAQ;IAAY;IAAY;GAAY,CAAC;EAC7D;;EAGA,SAAgB,qBAAqB,MAAyC;GAC5E,OAAO,WAAW,KAAK,WAAW;IAAC;IAAe;IAAe;IAAc;IAAe;IAAe;GAAa,CAAC;EAC7H;;EAGA,SAAgB,eAAe,MAAyC;GACtE,OAAO,WAAW,KAAK,WAAW;IAAC;IAAW;IAAW;IAAS;IAAS;IAAS;IAAS;IAAe;IAAmB;GAAW,CAAC;EAC7I;;EAGA,SAAgB,aAAa,MAAyC;GACpE,OAAO,WAAW,KAAK,WAAW;IAAC;IAAO;IAAO;IAAoB;IAAqB;IAAW;GAAS,CAAC;EACjH;;EAGA,SAAgB,iBAAiB,MAA8B;GAC7D,OAAO,mBAAmB,IAAI,KAAK,IAAI,KAAK,oBAAoB,IAAI,KAAK,IAAI;EAC/E;;;;;;;;EASA,SAAgB,kBAAkB,MAAqB,QAAoC;GAIzF,IAAI,KAAK,cAAc,KAAA,GAAW;IAChC,IAAI,CAAC,mBAAmB,IAAI,KAAK,IAAI,GAAG,OAAO,KAAA;IAC/C,MAAM,QAAQ,sCAAsC,KAAK,MAAM,KAAK,uBAAuB,KAAK,MAAM;IACtG,OAAO,QAAQ,OAAO,KAAA,IAAY,KAAA,IAAY,OAAO,MAAM,EAAE;GAC/D;GAGA,IAAI,oBAAoB,IAAI,KAAK,IAAI,GAAG;IACtC,MAAM,QAAQ,6BAA6B,KAAK,MAAM;IACtD,OAAO,QAAQ,OAAO,KAAA,IAAY,KAAA,IAAY,OAAO,MAAM,EAAE;GAC/D;EAEF;;;ECrKA,MAAM,aAAa,UAAgB;GAAE,WAAWI,KAAG,MAAM,MAAM,MAAM;GAAG,WAAWA,KAAG,MAAM,QAAQ,MAAM;GAAG,aAAaA,KAAG,MAAM,UAAU,SAAS;GACpJ,MAAMA,KAAG,MAAM,MAAM,MAAM;GAAG,QAAQA,KAAG,MAAM,OAAO,QAAQ;GAAG,cAAcA,KAAG,MAAM,QAAQ,UAAU;GAAG,UAAUA,KAAG,MAAM,MAAM,UAAU;GAChJ,aAAa,MAAcA,KAAG,MAAM,QAAQ,EAAE,KAAK,QAAQ,EAAE,YAAY;GAAG,SAAS,MAAcA,KAAG,MAAM,QAAQ,EAAE,KAAK,QAAQ,EAAE,YAAY;EAAE;EAErJ,MAAM,qBAAqB,UAAgB;GAAE,GAAG,UAAU,IAAI;GAAG,cAAc,MAAcA,KAAG,MAAM,QAAQ,EAAE,KAAK,gBAAgB,GAAG;GACtI,SAAS,MAAcA,KAAG,MAAM,MAAM,KAAK,UAAU,GAAG;GAAG,WAAW,MAAcA,KAAG,MAAM,OAAO,KAAK,aAAa,GAAG;GACzH,SAASA,KAAG,MAAM,OAAO,SAAS;GAAG,QAAQA,KAAG,MAAM,QAAQ,QAAQ;GAAG,MAAMA,KAAG,MAAM,OAAO,MAAM;GAAG,UAAUA,KAAG,MAAM,OAAO,WAAW;GAAG,YAAYA,KAAG,MAAM,UAAU,cAAc;EAAE;EAGjM,MAAM,YAAY,UAAwC;GACxD,MAAMA,KAAG,MAAM,MAAM,UAAU;GAAG,MAAMA,KAAG,MAAM,MAAM,UAAU;GACjE,aAAaA,KAAG,MAAM,MAAM,UAAU;GAAG,iBAAiBA,KAAG,MAAM,MAAM,UAAU;GAAG,UAAUA,KAAG,MAAM,MAAM,UAAU;GAAG,IAAIA,KAAG,MAAM,MAAM,UAAU;GAAG,OAAOA,KAAG,MAAM,MAAM,UAAU;GAC5L,MAAMA,KAAG,MAAM,MAAM,MAAM;GAAG,WAAWA,KAAG,MAAM,MAAM,MAAM;GAAG,WAAWA,KAAG,MAAM,MAAM,MAAM;GAAG,WAAWA,KAAG,MAAM,MAAM,MAAM;GACpI,OAAOA,KAAG,MAAM,MAAM,OAAO;GAAG,eAAeA,KAAG,MAAM,MAAM,OAAO;GAAG,YAAYA,KAAG,MAAM,MAAM,OAAO;GAAG,aAAaA,KAAG,MAAM,MAAM,OAAO;GAChJ,MAAMA,KAAG,MAAM,MAAM,MAAM;GAAG,oBAAoBA,KAAG,MAAM,MAAM,MAAM;GAAG,sBAAsBA,KAAG,MAAM,MAAM,MAAM;GAAG,WAAWA,KAAG,MAAM,MAAM,MAAM;GAAG,iBAAiBA,KAAG,MAAM,MAAM,MAAM;GACjM,MAAMA,KAAG,MAAM,QAAQ,YAAY;GAAG,cAAcA,KAAG,MAAM,QAAQ,YAAY;GAAG,cAAcA,KAAG,MAAM,QAAQ,YAAY;GAAG,UAAUA,KAAG,MAAM,QAAQ,YAAY;GACzK,MAAMA,KAAG,MAAM,MAAM,QAAQ;GAAG,aAAaA,KAAG,MAAM,MAAM,QAAQ;GAAG,qBAAqBA,KAAG,MAAM,MAAM,QAAQ;GAAG,UAAUA,KAAG,MAAM,MAAM,QAAQ;GAAG,QAAQA,KAAG,MAAM,MAAM,QAAQ;GACzL,YAAYA,KAAG,MAAM,QAAQ,gBAAgB;GAAG,UAAUA,KAAG,MAAM,QAAQ,cAAc;EAC3F;EAEA,SAAgB,aAAa,EAAE,KAAK,MAAM,KAAK,YAE5C;GACD,MAAM,OAAO,QAAQ;GACrB,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,YAAY,cAAc,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS;GAC3E,MAAM,SAAS,IAAI,QAAQ,KAAK;GAChC,MAAM,SAAS,QAAQ,QAAQ,SAAQ,SAAQ,KAAK,SAAS,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK;GACtG,MAAM,OAAO,cAAc,SAAS;GACpC,MAAM,UAAU,iBAAiB,SAAS;GAC1C,MAAM,WAAW,iBAAiB,SAAS;GAC3C,MAAM,OAAO,kBAAkB,WAAW,MAAM;GAChD,MAAM,SAAS,QAAQ,WAAY,SAAS,KAAA,KAAa,SAAS;GAClE,MAAM,QAAQ,cAAc,GAAG;GAC/B,MAAM,QAAQ,SAAS,IAAI,CAAC,CAAC,UAAU,SAAS,UAAU;GAC1D,MAAM,UAAU,QAAQ,qBAAqB,SAAS,KAAK,WAAW,eAAe,SAAS,MACxF,UAAU,WAAW,KAAA,IAAY,QAAQ,GAAG,UAAU,OAAO,IAAI;GACvE,MAAM,SAAS,SAASA,KAAG,MAAM,MAAM,QAAQ,IAAI,CAAC,IAAI,SAAU,OAAOA,KAAG,MAAM,SAAS,oBAAoB,IAAIA,KAAG,MAAM,OAAO,SAAS,IAAK;GACjJ,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAsB,oBAAkB,IAAI,KAAK,KAAK;IAC1E,qBAAmB,UAAU;IAAM,oBAAkB,IAAI;cADpD,CAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,iBAAe;KAAM,eAAe,QAAQ,CAAC,IAAI;KAAG,WAAU;eAApF;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,eAAA;iBAAa,OAAO,MAAM;MAAU,CAAA;MAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA;MAC9D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;iBAA2B;MAAc,CAAA;MACxD,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,MAAK;OAAS,eAAa,QAAQ,MAAM;iBAAI;MAAc,CAAA;KACvE;QACP,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;eAAf,CACN,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAuB,eAAe,SAAS,IAAI;gBAAnF;OAAuFA,KAAG,MAAM,MAAM,MAAM;OAAE;OAAE;MAAa;SACrI,MAAM,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,WAAD;MAAkB;MAAO,QAAQ,UAAU,IAAI;MAAG,UAAU;KAAK,CAAA,IAC7E,YAAY,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,eAAD;MAAwB;MAAS,KAAK,aAAa,SAAS,KAAK;MAAa;MACpG,SAAS,CAAC,IAAI,UAAU,CAAC;MAAM,UAAU;MAAM,QAAQ,kBAAkB,IAAI;KAAI,CAAA,IAC/E,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAM,WAAW,UAAU,YAAY,UAAU,MAC/C,IAAI,SAASF,KAAG,MAAM,cAAc,+BAA+B,IAAI,UAAU,KAAU,CAAA,CAChG;MACF;;EACP;EAEA,MAAa,iBAAiB;;;;;;;;;;;ECxD9B,MAAa,qBAAqB;GAAC;GAAqB;GAAwB;GAAkB;GAAmB;GAAiB;GAAe;GACnJ;GAAwB;GAAmB;GAAwB;EAAsB;;EAG3F,SAAgB,WAAW,EAAE,OAAO,WAAW,QAAQ,UAAU,KAAK,YAA+B;GACnG,MAAM,OAAO,QAAQ;GACrB,MAAM,UAAU,UAAU;GAC1B,MAAM,iBAAiB,aAAa,0BAA0B,aAAa,oBAAoB,aAAa,qBAAqB,aAAa;GAC9I,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAoG;GACrH,MAAM,MAAM,GAAG,UAAU,GAAG;GAC5B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,gBAAgB;IACrB,IAAI,SAAS,MAAM,OAAO,OAAO,SAAS,IAAI;IAC9C,MAAM,yBAAS,IAAI,IAA4B;IAC/C,IAAI;IACJ,MAAM,gBAAgB,SAAS,oBAAoB;IACnD,MAAM,UAAU,YAAY;KAC1B,IAAI,CAAC,UAAU,QAAQ,CAAC,QAAQ,GAAG;KACnC,OAAO;KAAM,QAAQ,IAAI,gBAAgB;KACzC,MAAM,WAAW,iBAAiB,OAAO,MAAM,GAAG,GAAK;KACvD,IAAI,QAAQ,MAAM,QAAQ;KAC1B,IAAI;MACF,MAAM,WAAW,MAAM,MAAM,GAAG,gBAAgB,2BAA2B,mBAAmB,SAAS,EAAE,UAAU,mBAAmB,MAAM,EAAE,SAAS,UACrJ;OAAE,aAAa;OAAe,OAAO;OAAY,QAAQ,MAAM;MAAO,CAAC;MACzE,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,sBAAsB;MACxD,MAAM,OAAO,MAAM,SAAS,KAAK;MACjC,IAAI,CAAC,MAAM,QAAQ,KAAK,MAAM,KAAK,CAAC,OAAO,cAAc,KAAK,MAAM,KAAK,KAAK,SAAS,QAAQ,MAAM,IAAI,MAAM,uBAAuB;MACtI,KAAK,MAAM,SAAS,KAAK,QAAQ,IAAI,MAAM,iBAAiB,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,KAAK;MACtG,SAAS,KAAK;MAAQ,QAAQ,KAAK,QAAQ,CAAC,KAAK,QAAQ,CAAC;MAAS,QAAQ,KAAK,OAAO,IAAI;MAC3F,IAAI,QAAQ,YAAY;OAAE;OAAK,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,MAAM,EAAE,OAAO,GAAG;OAAG,MAAM,KAAK;MAAK,CAAC;KAC5H,QAAQ;MACN,IAAI,QAAQ,aAAY,cAAa;OAAE;OAAK,QAAQ,UAAU,QAAQ,MAAM,SAAS,SAAS,CAAC;OAAG,MAAM;OAAO,QAAQ;MAAK,EAAE;KAChI,UAAU;MACR,aAAa,QAAQ;MAAG,OAAO;MAC/B,IAAI,UAAU,SAAS,QAAQ,GAAG,QAAQ,iBAAiB;OAAE,QAAa;MAAE,GAAG,KAAK;KACtF;IACF;IACA,MAAM,mBAAmB;KAAE,IAAI,OAAO,aAAa,KAAK;KAAG,IAAI,SAAS,oBAAoB,UAAU,OAAO,MAAM;UAAQ,QAAa;IAAE;IAC1I,QAAa;IAAG,SAAS,iBAAiB,oBAAoB,UAAU;IACxE,aAAa;KAAE,SAAS;KAAO,OAAO,MAAM;KAAG,IAAI,OAAO,aAAa,KAAK;KAAG,SAAS,oBAAoB,oBAAoB,UAAU;IAAE;GAC9I,GAAG;IAAC;IAAW;IAAQ;IAAK;IAAgB;GAAO,CAAC;GACpD,MAAM,UAAU,kBAAkB,UAAU,QAAQ,MAAM,WAAW,KAAA;GACrE,MAAM,QAAA,GAAA,MAAA,QAAA,OAAqB,aAAa,SAAS,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC;GACjF,MAAM,OAAO,UAAU,MAAM,QAAQ,SAAQ,SAAQ,KAAK,SAAS,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI;GAC3G,IAAI,UAAU,WAAW,MAAM,UAAU,OAAO;GAChD,IAAI,CAAC,SACH,IAAI;IACF,MAAM,SAAS,KAAK,MAAM,IAAI;IAC9B,IAAI,OAAO,WAAW,kBAAkB,UAAU,OAAO,UAAUG,KAAG,MAAM,cAAc,2BAA2B;GACvH,QAAQ,CAA6D;GAEvE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IACJ,KAAK,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,eAAsB,CAAA;IACjD,KAAK,KAAI,QAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;KAAgC;KAAK,MAAM,SAAS,QAAQ;KAAY;KAAe;IAAW,GAA/E,IAAI,EAA2E,CAAC;IACnH,SAAS,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,MAAK;eAAUA,KAAG,MAAM,oBAAoB,oCAAoC;IAAK,CAAA;IAC3G,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,MAAK;KAAS,OAAO;MAAE,UAAU;MAAI,YAAY;KAAW;eAAI;IAAW,CAAA;GAC1F,EAAA,CAAA;EACJ;;;;;;ECoCA,SAAgB,2BAA2B,MAAuB;GAChE,IAAI,OAAO,aAAa,eAAe,CAAC,MAAM,OAAO;GACrD,MAAM,UACJ,SAAS,cAA2B,uBAAuB,KAC3D,SAAS,cAA2B,8CAA0C,KAC9E,SAAS,cAAmC,UAAU;GAExD,IAAI,CAAC,SAAS,OAAO;GACrB,QAAQ,MAAM;GAEd,IAAI,mBAAmB,uBAAuB,mBAAmB,kBAAkB;IACjF,MAAM,QAAQ,QAAQ,kBAAkB,QAAQ,MAAM;IACtD,MAAM,MAAM,QAAQ,gBAAgB,QAAQ,MAAM;IAClD,QAAQ,aAAa,MAAM,OAAO,KAAK,KAAK;IAC5C,QAAQ,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;IAC3D,QAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;IAC5D,OAAO;GACT;GAGA,IAAI;IAEF,IADW,SAAS,YAAY,cAAc,OAAO,IAChD,GAAG,OAAO;GACjB,QAAQ,CAER;GAGA,MAAM,WAAW,QAAQ,aAAa,KAAK,KAAK;GAChD,QAAQ,cAAc,WAAW,GAAG,SAAS,GAAG,SAAS;GACzD,QAAQ,cAAc,IAAI,WAAW,SAAS;IAAE,SAAS;IAAM,WAAW;IAAc,MAAM;GAAK,CAAC,CAAC;GACrG,OAAO;EACT;;;ECvHA,IAAI,kBAAsC;EAE1C,IAAI,gBAAgB;EACpB,IAAI,qBAAqB;EACzB,IAAI,qBAAqB;EACzB,IAAI,qBAAqB;EACzB,IAAI,aAAa;EACjB,IAAI,aAAa;EAEjB,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuLlB,SAAS,eAAqB;GAC5B,IAAI,OAAO,aAAa,aAAa;GACrC,MAAM,UAAU;GAChB,IAAI,SAAS,eAAe,OAAO,MAAM,MAAM;IAC7C,MAAM,KAAK,SAAS,cAAc,OAAO;IACzC,GAAG,KAAK;IACR,GAAG,cAAc;IACjB,MAAM,OAAO,SAAS,QAAQ,SAAS;IACvC,IAAI,MAAM,KAAK,YAAY,EAAE;GAC/B;EACF;EAEA,SAAS,YAAoB;GAC3B,IAAI,OAAO,WAAW,eAAe,OAAO,UAAU,QACpD,OAAO,OAAO,SAAS;GAEzB,OAAO;EACT;;EAGA,SAAgB,cAAc,SAAyB;GAErD,OAAO,GADQ,UACA,EAAE,iCAAiC,mBAAmB,QAAQ,KAAK,CAAC;EACrF;;;;EAKA,SAAgB,aAAa,KAAa,QAAQ,iBAAiB,SAAwB;GACzF,IAAI,OAAO,aAAa,aAAa;GACrC,aAAa;GAEb,IAAI,iBAAiB;IACnB,gBAAgB,OAAO;IACvB,kBAAkB;GACpB;GAEA,gBAAgB;GAChB,qBAAqB;GACrB,qBAAqB;GAErB,MAAM,UAAU,SAAS,cAAc,KAAK;GAC5C,QAAQ,YAAY;GAEpB,MAAM,SAAS,SAAS,cAAc,KAAK;GAC3C,OAAO,YAAY;GAEnB,MAAM,UAAU,SAAS,cAAc,KAAK;GAC5C,QAAQ,YAAY;GACpB,QAAQ,cAAc;GACtB,OAAO,YAAY,OAAO;GAE1B,MAAM,UAAU,SAAS,cAAc,KAAK;GAC5C,QAAQ,YAAY;GAEpB,MAAM,YAAY,SAAS,cAAc,QAAQ;GACjD,UAAU,YAAY;GACtB,UAAU,cAAc;GACxB,UAAU,QAAQ;GAElB,MAAM,aAAa,SAAS,cAAc,QAAQ;GAClD,WAAW,YAAY;GACvB,WAAW,cAAc;GACzB,WAAW,QAAQ;GAEnB,MAAM,WAAW,SAAS,cAAc,QAAQ;GAChD,SAAS,YAAY;GACrB,SAAS,cAAc;GACvB,SAAS,QAAQ;GAEjB,QAAQ,YAAY,SAAS;GAC7B,QAAQ,YAAY,UAAU;GAC9B,QAAQ,YAAY,QAAQ;GAE5B,IAAI,SAAS;IACX,MAAM,cAAc,SAAS,cAAc,QAAQ;IACnD,YAAY,YAAY;IACxB,YAAY,cAAc;IAC1B,YAAY,WAAW,MAAM;KAC3B,EAAE,gBAAgB;KAClB,IAAI,UAAU,WACZ,UAAU,UAAU,UAAU,OAAO,CAAC,CAAC,WAAW;MAChD,YAAY,cAAc;MAC1B,iBAAiB;OAAE,YAAY,cAAc;MAAW,GAAG,IAAI;KACjE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAErB;IACA,QAAQ,YAAY,WAAW;GACjC;GAEA,MAAM,WAAW,SAAS,cAAc,QAAQ;GAChD,SAAS,YAAY;GACrB,SAAS,cAAc;GACvB,QAAQ,YAAY,QAAQ;GAE5B,OAAO,YAAY,OAAO;GAC1B,QAAQ,YAAY,MAAM;GAE1B,MAAM,OAAO,SAAS,cAAc,KAAK;GACzC,KAAK,YAAY;GAEjB,MAAM,UAAU,SAAS,cAAc,KAAK;GAC5C,QAAQ,YAAY;GAEpB,MAAM,MAAM,SAAS,cAAc,KAAK;GACxC,IAAI,YAAY;GAChB,IAAI,MAAM;GACV,IAAI,MAAM;GAGV,QAAQ,YAAY,GAAG;GACvB,KAAK,YAAY,OAAO;GACxB,QAAQ,YAAY,IAAI;GAExB,MAAM,wBAAwB;IAC5B,QAAQ,MAAM,YAAY,aAAa,mBAAmB,MAAM,mBAAmB,YAAY,cAAc;GAC/G;GAEA,UAAU,WAAW,MAAM;IACzB,EAAE,gBAAgB;IAClB,gBAAgB,KAAK,IAAI,gBAAgB,KAAK,CAAG;IACjD,gBAAgB;GAClB;GAEA,WAAW,WAAW,MAAM;IAC1B,EAAE,gBAAgB;IAClB,gBAAgB,KAAK,IAAI,gBAAgB,KAAK,EAAG;IACjD,gBAAgB;GAClB;GAEA,SAAS,WAAW,MAAM;IACxB,EAAE,gBAAgB;IAClB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,gBAAgB;GAClB;GAEA,MAAM,sBAAsB;IAC1B,OAAO,oBAAoB,WAAW,SAAS;IAC/C,QAAQ,UAAU,OAAO,MAAM;IAC/B,iBAAiB;KACf,QAAQ,OAAO;KACf,IAAI,oBAAoB,SAAS,kBAAkB;IACrD,GAAG,GAAG;GACR;GAEA,SAAS,WAAW,MAAM;IACxB,EAAE,gBAAgB;IAClB,cAAc;GAChB;GAEA,QAAQ,WAAW,MAAM;IACvB,IAAI,EAAE,WAAW,WAAW,EAAE,WAAW,MACvC,cAAc;GAElB;GAEA,MAAM,aAAa,MAAqB;IACtC,IAAI,EAAE,QAAQ,UACZ,cAAc;GAElB;GACA,OAAO,iBAAiB,WAAW,SAAS;GAG5C,KAAK,eAAe,MAAM;IACxB,qBAAqB;IACrB,aAAa,EAAE,UAAU;IACzB,aAAa,EAAE,UAAU;IACzB,KAAK,UAAU,IAAI,UAAU;GAC/B;GAEA,MAAM,eAAe,MAAkB;IACrC,IAAI,CAAC,oBAAoB;IACzB,qBAAqB,EAAE,UAAU;IACjC,qBAAqB,EAAE,UAAU;IACjC,gBAAgB;GAClB;GAEA,MAAM,kBAAkB;IACtB,IAAI,oBAAoB;KACtB,qBAAqB;KACrB,KAAK,UAAU,OAAO,UAAU;IAClC;GACF;GAEA,OAAO,iBAAiB,aAAa,WAAW;GAChD,OAAO,iBAAiB,WAAW,SAAS;GAG5C,KAAK,WAAW,MAAM;IACpB,EAAE,eAAe;IACjB,MAAM,SAAS,EAAE,SAAS,IAAI,OAAO;IACrC,gBAAgB,KAAK,IAAI,IAAK,KAAK,IAAI,gBAAgB,QAAQ,CAAG,CAAC;IACnE,gBAAgB;GAClB;GAEA,SAAS,KAAK,YAAY,OAAO;GACjC,kBAAkB;GAClB,4BAA4B,QAAQ,UAAU,IAAI,MAAM,CAAC;EAC3D;;EAGA,SAAgB,YAAY,WAA4B;GACtD,IAAI,CAAC,aAAa,OAAO,cAAc,UAAU,OAAO;GACxD,MAAM,QAAQ,UAAU,MAAM,MAAM,CAAC,CAAC,MAAM;GAC5C,OAAO,4CAA4C,KAAK,KAAK;EAC/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECrXA,SAASC,UAAkB;GAC1B,OAAOC;EACR;;EAOA,MAAM,wCAAwB,IAAI,IAAY;EAM9C,SAAgB,UAAU,UAAmB,OAAO,KAAqC;GACxF,MAAM,KAAKD,QAAM;GACjB,MAAM,OAAO,MAAM,sBAAsB,IAAI,GAAG,IAAI;GACpD,MAAM,CAAC,OAAO,YAAY,GAAG,SAAkB,IAAI;GACnD,MAAM,eAAe;IACpB,UAAU,SAAkB;KAC3B,MAAM,OAAO,CAAC;KACd,IAAI,KACH,IAAI,MAAM,sBAAsB,IAAI,GAAG;UAClC,sBAAsB,OAAO,GAAG;KAEtC,OAAO;IACR,CAAC;GACF;GACA,OAAO,CAAC,OAAO,MAAM;EACtB;EAEA,SAAS,GAAG,MAAe,OAAwC,GAAG,UAA8B;GACnG,OAAOA,QAAM,CAAC,CAAC,cAAc,MAAM,OAAO,GAAG,QAAQ;EACtD;EAIA,SAAgB,yBAAyB,OAAO,IAAI,YAAY,IAAa;GAC5E,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAS,YAAY;IAAE;IACzC,eAAe;GAChB,GAAG,GAAG,QAAQ;IACb,GAAG;IACH,MAAM;GACP,CAAC,CAAC;EACH;EAEA,SAAgB,iBAAiB,OAAO,IAAI,YAAY,IAAa;GACpE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAS,YAAY;IAAE;IACzC,eAAe;GAChB,GACC,GAAG,QAAQ;IACV,WAAW;IACX,GAAG;IACH,MAAM;GACP,CAAC,GACD,GAAG,QAAQ;IACV,WAAW;IACX,GAAG;IACH,MAAM;GACP,CAAC,GACD,GAAG,QAAQ;IACV,WAAW;IACX,GAAG;IACH,MAAM;GACP,CAAC,CACF;EACD;EAEA,SAAgB,kBAAkB,OAAO,IAAI,YAAY,IAAa;GACrE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAS,YAAY;IAAE;IACzC,eAAe;GAChB,GAAG,GAAG,QAAQ;IACb,GAAG;IACH,MAAM;GACP,CAAC,CAAC;EACH;EAEA,SAAgB,oBAAoB,OAAO,IAAI,YAAY,IAAa;GACvE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAS,YAAY;IAAE;IACzC,eAAe;GAChB,GACC,GAAG,QAAQ;IAAE,GAAG;IAAqD,MAAM;GAAe,CAAC,GAC3F,GAAG,QAAQ;IAAE,GAAG;IAAqD,MAAM;GAAe,CAAC,GAC3F,GAAG,QAAQ;IACV,GAAG;IACH,MAAM;GACP,CAAC,CACF;EACD;EAEA,SAAgB,oBAAoB,OAAO,IAAI,YAAY,IAAa;GACvE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAS,YAAY;IAAE;IACzC,eAAe;GAChB,GACC,GAAG,QAAQ;IACV,GAAG;IACH,MAAM;GACP,CAAC,GACD,GAAG,QAAQ;IACV,GAAG;IACH,MAAM;GACP,CAAC,CACF;EACD;EAEA,SAAgB,kBAAkB,OAAO,IAAI,YAAY,IAAa;GACrE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAS,YAAY;IAAE;IACzC,eAAe;GAChB,GAAG,GAAG,QAAQ;IACb,UAAU;IACV,UAAU;IACV,GAAG;IACH,MAAM;GACP,CAAC,CAAC;EACH;EAEA,SAAgB,qBAAqB,OAAO,IAAI,YAAY,IAAa;GACxE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAgB,eAAe;KAAU,YAAY;IAAE;IACzE,eAAe;GAChB,GAAG,GAAG,QAAQ;IACb,GAAG;IACH,MAAM;GACP,CAAC,CAAC;EACH;EAEA,SAAgB,kBAAkB,OAAO,IAAI,YAAY,IAAa;GACrE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAgB,eAAe;KAAU,YAAY;IAAE;IACzE,eAAe;GAChB,GAAG,GAAG,QAAQ;IACb,GAAG;IACH,MAAM;GACP,CAAC,CAAC;EACH;EAEA,SAAgB,mBAAmB,OAAO,IAAI,YAAY,IAAa;GACtE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAgB,eAAe;KAAU,YAAY;IAAE;IACzE,eAAe;GAChB,GAAG,GAAG,QAAQ;IACb,GAAG;IACH,MAAM;GACP,CAAC,CAAC;EACH;EAEA,SAAgB,sBAAsB,OAAO,IAAI,YAAY,IAAa;GACzE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAS,YAAY;IAAE;IACzC,eAAe;GAChB,GAAG,GAAG,QAAQ;IACb,GAAG;IACH,MAAM;GACP,CAAC,CAAC;EACH;EAEA,SAAgB,mBAAmB,OAAO,IAAI,YAAY,IAAa;GACtE,OAAO,GAAG,OAAO;IAChB,OAAO;IACP,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,SAAS;IACT,MAAM;IACN,OAAO;KAAE,SAAS;KAAS,YAAY;IAAE;IACzC,eAAe;GAChB,GAAG,GAAG,QAAQ;IACb,GAAG;IACH,MAAM;GACP,CAAC,CAAC;EACH;EAEA,SAAS,YAAY,MAAgB,OAAO,IAAa;GACxD,QAAQ,MAAR;IACC,KAAK,YACJ,OAAO,iBAAiB,IAAI;IAC7B,KAAK;IACL,KAAK,UACJ,OAAO,kBAAkB,IAAI;IAC9B,KAAK,QACJ,OAAO,oBAAoB,IAAI;IAChC,KAAK;IACL,KAAK,QACJ,OAAO,oBAAoB,IAAI;IAChC,KAAK,YACJ,OAAO,sBAAsB,IAAI;IAClC,KAAK,SACJ,OAAO,mBAAmB,IAAI;IAC/B,SACC,OAAO,kBAAkB,IAAI;GAC/B;EACD;EAsCA,SAAS,cAAc,OAA0B;GAChD,MAAM,UAAU;GAChB,IAAI,UAAU,WAAW,QAAQ,SAAS,QAAQ,OAAO,QAAQ,KAAK,YAAY,UACjF,OAAO,QAAQ,KAAK;GAErB,MAAM,UAAU;GAChB,IAAI,OAAO,QAAQ,YAAY,UAAU,OAAO,QAAQ;GACxD,OAAO;EACR;EAEA,SAAS,UAAU,OAAkD;GACpE,MAAM,MAAM,cAAc,KAAK;GAC/B,IAAI,QAAQ,IAAI,OAAO;GACvB,IAAI;IACH,MAAM,IAAI,KAAK,MAAM,GAAG;IACxB,OAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAK,IAAgC;GACpG,QAAQ;IACP,OAAO;GACR;EACD;EAEA,SAAS,YAAY,KAAsB;GAC1C,IAAI,OAAO,QAAQ,UAAU,OAAO;GACpC,IAAI,IAAI,IAAI,KAAK;GACjB,IAAK,EAAE,WAAW,IAAG,KAAK,EAAE,SAAS,IAAG,KAAO,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,GACjF,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK;GAEzB,OAAO;EACR;EAEA,SAAS,eAAe,KAAuC;GAC9D,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO,CAAC;GAC/C,IAAI,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG,OAAO;GAC3D,IAAI,OAAO,QAAQ,UAAU;IAC5B,IAAI,IAAI,IAAI,KAAK;IACjB,IAAK,EAAE,WAAW,IAAG,KAAK,EAAE,SAAS,IAAG,KAAO,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,GACjF,IAAI;KACH,MAAM,WAAW,KAAK,MAAM,CAAC;KAC7B,IAAI,OAAO,aAAa,UAAU,IAAI,SAAS,KAAK;IACrD,QAAQ,CAER;IAED,IAAI;KACH,MAAM,SAAS,KAAK,MAAM,CAAC;KAC3B,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GACzE,OAAO;KAER,OAAO,EAAE,OAAO,OAAO;IACxB,QAAQ;KACP,OAAO,EAAE,OAAO,IAAI;IACrB;GACD;GACA,OAAO,EAAE,OAAO,IAAI;EACrB;EAEA,SAAS,gBAAgB,MAAsB;GAC9C,MAAM,UAAU,KAAK,KAAK;GAC1B,IAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAClD,IAAI;IACH,MAAM,MAAM,KAAK,MAAM,OAAO;IAC9B,IAAI,MAAM,QAAQ,KAAK,OAAO,GAAG;KAChC,MAAM,QAAkB,CAAC;KACzB,KAAK,MAAM,QAAQ,IAAI,SAAS;MAC/B,MAAM,MAAM;MACZ,IAAI,KAAK,SAAS,UAAU,OAAO,IAAI,SAAS,UAC/C,MAAM,KAAK,IAAI,IAAI;KAErB;KACA,IAAI,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,IAAI;IAC7C;GACD,QAAQ,CAER;GAED,OAAO;EACR;EAEA,SAAS,WAAW,OAA4F;GAC/G,MAAM,IAAI,UAAU,KAAK;GACzB,IAAI,MAAM,MAAM,OAAO;GACvB,IAAI,OAAO,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO;GACjD,IAAI,SAAS,IAAI,OAAO;GACxB,IAAI,QAAiC,CAAC;GACtC,MAAM,MAAM,EAAE;GACd,IAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,GAAG,QAAQ;QACvE,IAAI,OAAO,QAAQ,UACvB,IAAI;IACH,MAAM,IAAI,KAAK,MAAM,GAAG;IACxB,IAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC,GAAG,QAAQ;SACjE,QAAQ,EAAE,OAAO,IAAI;GAC3B,QAAQ;IACP,QAAQ,EAAE,OAAO,IAAI;GACtB;GAED,IAAI,SAAS,OAAO,EAAE,WAAW,YAAY,EAAE,WAAW,KAAK,YAAY,EAAE,MAAM,IAAI,KAAA;GAGvF,IAAI,mDAAmD,KAAK,IAAI,GAAG;IAClE,MAAM,IAAI,KAAK,OAAO,cAAc,eAAe,cAAc,QAAQ;IACzE,IAAI,GAAG,SAAS,YAAY,CAAC;IAC7B,MAAM,YAAY,KAAK,OAAO,YAAY,aAAa,YAAY,QAAQ,MAAM;IACjF,MAAM,WAAW,MAAM,aAAa,MAAM,aAAa,MAAM,QAAQ,MAAM,cAAc,MAAM,UAAU,MAAM;IAC/G,IAAI,WAAW;KACd,OAAO,YAAY,SAAS;KAC5B,QAAQ,eAAe,QAAQ;IAChC;GACD,OAAO,IAAI,KAAK,WAAW,OAAO,GAAG;IACpC,MAAM,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI;IACtC,IAAI,MAAM,UAAU,GAAG;KACtB,SAAS,MAAM;KACf,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;IAChC;GACD;GAEA,OAAO;IAAE;IAAM;IAAO,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;GAAG;EACrD;EAEA,SAAS,KAAK,OAAgC,GAAG,MAAoC;GACpF,KAAK,MAAM,KAAK,MAAM;IACrB,MAAM,IAAI,MAAM;IAChB,IAAI,OAAO,MAAM,YAAY,MAAM,IAAI,OAAO;GAC/C;EAED;EAEA,SAAS,IAAI,OAAgC,GAAG,MAAoC;GACnF,KAAK,MAAM,KAAK,MAAM;IACrB,MAAM,IAAI,MAAM;IAChB,IAAI,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,GAAG,OAAO;GACzD;EAED;EAEA,SAAS,WAAW,OAA0B;GAC7C,MAAM,UAAU;GAChB,IAAI,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG,OAAO;GAC5C,MAAM,QAAkB,CAAC;GACzB,KAAK,MAAM,KAAK,QAAQ,SACvB,IAAI,KAAK,OAAO,MAAM,YAAa,EAAwB,SAAS,UAAU,OAAQ,EAAyB,SAAS,UACvH,MAAM,KAAM,EAAuB,IAAI;GAIzC,OAAO,gBADM,MAAM,KAAK,IACE,CAAC;EAC5B;EAEA,SAAS,UAAU,OAA2B;GAC7C,OAAO,MAAM,SAAS,iBAAiB,aAAa;EACrD;EAEA,SAAS,QAAQ,OAA2B;GAC3C,MAAM,UAAU;GAChB,OAAO,QAAQ,YAAY,QAAS,QAAQ,UAAU,KAAA,KAAa,QAAQ,UAAU;EACtF;EAIA,MAAM,iCAAiB,IAAI,IAAI;GAAC;GAAe;GAAQ;GAAmB;GAAY;GAAM;EAAO,CAAC;EACpG,MAAM,6BAAa,IAAI,IAAI;GAAC;GAAwB;GAAa;GAAmB;GAAQ;GAAiB;GAAc;EAAa,CAAC;EACzI,MAAM,6BAAa,IAAI,IAAI;GAAC;GAAa;GAAa;GAAQ;EAAW,CAAC;EAC1E,MAAM,+BAAe,IAAI,IAAI;GAAC;GAAgB;GAAQ;GAAY;GAAgB;GAAe;GAAU;GAAY;GAAuB;GAAQ;GAAc;EAAY,CAAC;EACjL,MAAM,6BAAa,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC;EAC7C,MAAM,+BAAe,IAAI,IAAI;GAAC;GAAe;GAAe;EAAI,CAAC;EACjE,MAAM,iCAAiB,IAAI,IAAI;GAAC;GAAgB;GAAO;EAAU,CAAC;EAClE,MAAM,8BAAc,IAAI,IAAI;GAAC;GAAkB;GAAgB;EAAc,CAAC;EAyB9E,SAAgB,gBAAgB,OAAkB,KAAc,MAAgC;GAC/F,MAAM,OAAO,WAAW,KAAK;GAC7B,MAAM,MAAM,WAAW,KAAK;GAC5B,IAAI,SAAS,MACZ,OAAO;IAAE,MAAM;IAAW,OAAO;IAAY,QAAQ;IAAK,KAAK,cAAc,KAAK;GAAE;GAErF,MAAM,EAAE,MAAM,UAAU;GACxB,MAAM,OAAO,KAAK,OAAO,eAAe,eAAe,cAAc,eAAe,eAAe,aAAa;GAEhH,IAAI,eAAe,IAAI,IAAI,GAAG;IAC7B,MAAM,eAAgB,MAAkC,aAAc,MAAkC;IACxG,MAAM,YAAY,MAAM,QAAQ,YAAY,IAAK,eAA+F,CAAC;IAEjJ,MAAM,SADS,UAAU,EACJ,EAAE,YAAY,QAAQ;IAC3C,OAAO;KACN,MAAM;KACN;KACA,QAAQ,KAAK;KACb,OAAO;KACP,QAAQ;KACR;KACA,KAAK,cAAc,KAAK;IACzB;GACD;GACA,IAAI,YAAY,IAAI,IAAI,GAAG;IAC1B,MAAM,SAAS,KAAK,OAAO,UAAU,QAAQ,KAAK;IAClD,MAAM,OAAO,KAAK,OAAO,aAAa,cAAc,MAAM,KAAK;IAC/D,MAAM,QAAQ,KAAK,OAAO,eAAe,cAAc,KAAK;IAC5D,OAAO;KACN,MAAM;KACN;KACA,QAAQ,KAAK;KACb,OAAO,QAAQ,oBAAoB;KACnC;KACA,WAAW;KACX,aAAa;KACb,QAAQ;KACR,KAAK,cAAc,KAAK;IACzB;GACD;GACA,IAAI,eAAe,IAAI,IAAI,GAAG;IAC7B,MAAM,UAAU,KAAK,OAAO,eAAe,gBAAgB,WAAW,OAAO,KAAK,MAC7E,QAAQ,KAAK,WAAW,IAAI,IAAI,KAAK,QAAQ,cAAc,EAAE,CAAC,CAAC,QAAQ,UAAU,EAAE,IAAI,KAAA,MACxF,KAAK,UAAU,KAAK;IACxB,MAAM,SAAS,KAAK,OAAO,OAAO,OAAO,oBAAoB,qBAAqB,WAAW,SAAS,KAAK;IAC3G,MAAM,WAAW,SAAS,KAAA,KAAa,CAAC,KAAK,WAAW,IAAI,KAAK,SAAS,UAAU,OAAO,QAAQ,UAAU;IAC7G,OAAO;KACN,MAAM;KACN;KACA,QAAQ,KAAK;KACb,OAAO;KACP;KACA,GAAI,WAAW,KAAA,IAAY,EAAE,KAAK,OAAO,IAAI,CAAC;KAC9C,QAAQ;IACT;GACD;GACA,IAAI,WAAW,IAAI,IAAI,GAAG;IACzB,MAAM,UAAU,KAAK,OAAO,cAAc,eAAe,QAAQ,aAAa,QAAQ,YAAY,gBAAgB,cAAc,YAAY,UAAU,KAAK;IAC3J,MAAM,OAAO,WAAW,SAAS,KAAK,IAAI;IAC1C,MAAM,UAAU,KAAK,OAAO,iBAAiB,kBAAkB,cAAc,WAAW,aAAa,WAAW,eAAe,KAAK;IACpI,MAAM,UAAU,KAAK,OAAO,sBAAsB,uBAAuB,cAAc,WAAW,WAAW,aAAa,WAAW,WAAW,sBAAsB,eAAe,gBAAgB,YAAY,gBAAgB,aAAa,KAAK;IACnP,MAAM,SAAU,SAAS,mBAAmB,SAAS,gBAAgB,SAAS,gBAAiB,UAAU;IACzG,MAAM,gBAAgB,SAAS,KAAA,KAAa,qHAAqH,KAAK,KAAK,KAAK,CAAC;IACjL,MAAM,QAAQ,SAAS,KAAA,KAAa,CAAC,iBAAiB,CAAC,KAAK,SAAS,IAAI,IACtE,GAAG,OAAO,GAAG,KAAK,KAAK,SACvB,GAAG,OAAO,GAAG;IAChB,OAAO;KAAE,MAAM;KAAQ;KAAM,QAAQ,KAAK;KAAQ;KAAO,MAAM;KAAS;KAAS;KAAS,QAAQ;IAAI;GACvG;GACA,IAAI,WAAW,IAAI,IAAI,GAAG;IACzB,MAAM,OAAO,KAAK,OAAO,gBAAgB,iBAAiB,cAAc,eAAe,QAAQ,aAAa,YAAY,QAAQ,YAAY,YAAY,YAAY,KAAK;IACzK,MAAM,SAAS,IAAI,OAAO,UAAU,QAAQ,KAAK,IAAI,OAAO,aAAa,YAAY;IACrF,MAAM,OAAO,WAAW,KAAA,IAAa,SAAS,MAAM,SAAS,eAAe,SAAS,eAAe,SAAS,SAAS,IAAK,KAAA;IAC3H,MAAM,QAAQ,YAAY,IAAI;IAC9B,OAAO;KACN,MAAM,QAAQ,UAAU;KACxB;KACA,QAAQ,KAAK;KACb,OAAO,OAAO,GAAG,KAAK,KAAK,SAAS,SAAS,KAAK,UAAU,OAAO;KACnE;KACA,QAAQ;KACR,SAAS;KACT,WAAW,QAAQ,OAAO,KAAA;KAC1B,QAAQ;KACR,WAAW,KAAK,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK;KACxC,GAAI,SAAS,KAAK,EAAE,UAAU;MAAE;MAAM,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;KAAG,EAAE,IAAI,CAAC;IACtF;GACD;GACA,IAAI,aAAa,IAAI,IAAI,GAAG;IAC3B,MAAM,SAAS,MAAM,SAAS,MAAM,SAAS,MAAM,WAAW,MAAM,WAAW,MAAM,SAAS,MAAM,SAAS,MAAM;IACnH,MAAM,IAAI,MAAM,QAAQ,MAAM,IAAI,OAAO,KAAK,IAAI,IAAK,OAAO,WAAW,WAAW,SAAU,KAAK,OAAO,SAAS,SAAS,WAAW,WAAW,SAAS,SAAS,aAAa,KAAK;IACtL,OAAO;KAAE,MAAM;KAAU;KAAM,QAAQ,KAAK;KAAQ,OAAO,SAAS,MAAM,KAAK,YAAY,IAAI;KAAW,QAAQ;IAAI;GACvH;GACA,IAAI,WAAW,IAAI,IAAI,GAAG;IACzB,MAAM,OAAO,KAAK,OAAO,iBAAiB,kBAAkB,QAAQ,aAAa,QAAQ,aAAa,mBAAmB,oBAAoB,cAAc,KAAK;IAChK,OAAO;KAAE,MAAM;KAAQ;KAAM,QAAQ,KAAK;KAAQ,OAAO,SAAS,SAAS,KAAK,UAAU,OAAO;KAAmB,QAAQ;IAAI;GACjI;GACA,IAAI,aAAa,IAAI,IAAI,GAAG;IAC3B,MAAM,OAAO,KAAK,OAAO,cAAc,eAAe,QAAQ,aAAa,QAAQ,YAAY,cAAc,KAAK;IAClH,OAAO;KAAE,MAAM;KAAU;KAAM,QAAQ,KAAK;KAAQ,OAAO,QAAQ,YAAY;KAAM,QAAQ;IAAI;GAClG;GACA,MAAM,eAAe,KAAK,SAAS,GAAG,KAAK,OAAO,IAAI,SAAU,SAAS,KAAK,OAAO;GACrF,MAAM,QAAQ,QAAQ;GACtB,OAAO;IAAE,MAAM;IAAW;IAAM,QAAQ,KAAK;IAAQ;IAAO,QAAQ;IAAK,KAAK,cAAc,KAAK;GAAE;EACpG;EAIA,SAAS,WAAW,GAAW,KAAc,MAAuB;GACnE,IAAI,OAAO,EAAE,WAAW,GAAG,GAAG;IAC7B,MAAM,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,CAAC,QAAQ,WAAW,EAAE;IACrD,OAAO,QAAQ,KAAK,MAAM;GAC3B;GACA,IAAI,QAAQ,EAAE,WAAW,IAAI,GAAG,OAAO,MAAM,EAAE,MAAM,KAAK,MAAM;GAChE,OAAO;EACR;EAEA,SAAS,KAAK,GAAW,KAAqB;GAC7C,OAAO,EAAE,SAAS,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,SAAS,OAAO,YAAY;EACrF;EAEA,SAAgB,uBAAuB,GAAmB;GACzD,OAAO,EAAE,QAAQ,oCAAoC,IAAI;EAC1D;EAEA,SAAgB,YAAY,OAAwB,KAAc,MAAmC;GACpG,IAAI,MAAM,SAAS,QAAQ;IAE1B,MAAM,MAAM,WADA,MAAM,QAAQ,QACE,KAAK,IAAI;IACrC,MAAM,UAAU,IAAI,SAAS,KAAK,MAAM,IAAI,MAAM,GAAG,IAAI;IACzD,OAAO,MAAM,WAAW,OAAO,KAAK,YAAY,KAAK;GACtD;GACA,MAAM,MAAM,MAAM;GAClB,IAAI,QAAQ,KAAA,KAAa,QAAQ,IAAI;IACpC,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,MAAM,EAAE,KAAK,MAAM,EAAE;IACzD,IAAI,UAAU,KAAA,KAAa,MAAM,KAAK,MAAM,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;GAChF;EAED;EAEA,SAAS,IAAI,GAAG,OAAyD;GACxE,OAAO,MAAM,QAAQ,MAAmB,OAAO,MAAM,YAAY,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG;EACpF;;;;;;;;EAWA,SAAS,GAAG,GAA0B,KAAa,UAAkB,QAA0C;GAC9G,IAAI,OAAO,MAAM,YAChB,IAAI;IACH,MAAM,IAAI,EAAE,KAAK,MAAM;IACvB,IAAI,OAAO,MAAM,YAAY,MAAM,MAAM,MAAM,KAAK,OAAO;GAC5D,QAAQ,CAER;GAED,IAAI,WAAW,KAAA,KAAa,OAAO,UAAU,KAAA,KAAa,SAAS,SAAS,SAAS,GACpF,OAAO,SAAS,QAAQ,WAAW,OAAO,OAAO,KAAK,CAAC;GAExD,OAAO;EACR;EAEA,SAAS,aAAa,OAAwB,GAAuB;GACpE,QAAQ,MAAM,MAAd;IACC,KAAK,YACJ,OAAO,GAAG,GAAG,cAAc,SAAS;IACrC,KAAK,QACJ,OAAQ,MAAM,SAAS,mBAAmB,MAAM,SAAS,gBAAgB,MAAM,SAAS,gBAAiB,GAAG,GAAG,YAAY,OAAO,IAAI,GAAG,GAAG,WAAW,MAAM;IAC9J,KAAK,QACJ,OAAO,GAAG,GAAG,WAAW,MAAM;IAC/B,KAAK,UACJ,OAAQ,MAAM,SAAS,gBAAgB,MAAM,SAAS,eAAgB,GAAG,GAAG,gBAAgB,YAAY,IAAI,GAAG,GAAG,aAAa,QAAQ;IACxI,KAAK,QACJ,OAAO,GAAG,GAAG,WAAW,MAAM;IAC/B,KAAK,UACJ,OAAO,GAAG,GAAG,aAAa,QAAQ;IACnC,KAAK,YACJ,OAAO,GAAG,GAAG,eAAe,UAAU;IACvC,KAAK,SACJ,OAAO,GAAG,GAAG,YAAY,OAAO;IACjC;KACC,IAAI,MAAM,QAAQ,MAAM,SAAS,YAChC,OAAO,MAAM,SAAS,GAAG,MAAM,OAAO,IAAI,MAAM,SAAS,MAAM,KAAK,QAAQ,MAAM,GAAG;KAEtF,OAAO,GAAG,GAAG,WAAW,MAAM;GAChC;EACD;EAEA,SAAS,eAAe,OAAwB,KAAc,MAAuB;GACpF,IAAI,MAAM,SAAS,YAClB,OAAO,MAAM,WAAW,MAAM;GAE/B,IAAI,MAAM,SAAS,QAElB,OAAO,WADS,MAAM,QAAQ,QACH,KAAK,IAAI;GAErC,IAAI,MAAM,SAAS,QAAQ;IAC1B,MAAM,UAAU,MAAM,QAAQ;IAC9B,OAAO,YAAY,KAAK,WAAW,SAAS,KAAK,IAAI,IAAI,MAAM;GAChE;GACA,IAAI,MAAM,SAAS,UAClB,OAAO,MAAM,MAAM,QAAQ,4BAA4B,EAAE,KAAK,MAAM;GAErE,IAAI,MAAM,SAAS,QAClB,OAAO,MAAM,MAAM,QAAQ,4BAA4B,EAAE,KAAK,MAAM;GAErE,IAAI,MAAM,SAAS,YAClB,OAAO,MAAM;GAEd,IAAI,MAAM,SAAS,SAClB,OAAO,MAAM,UAAU,MAAM;GAE9B,IAAI,MAAM,UAAU,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,GAAG,GAC7D,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,SAAS,CAAC;GAEjD,OAAO,MAAM;EACd;EAEA,SAAS,SAAS,OAAuC;GACxD,IAAI,MAAM,SAAS,QAAQ,OAAO;GAClC,MAAM,UAAU,MAAM,WAAW;GACjC,MAAM,UAAU,MAAM,WAAW;GACjC,MAAM,WAAW,YAAY,KAAK,IAAI,QAAQ,MAAM,IAAI,CAAC,CAAC;GAC1D,MAAM,WAAW,YAAY,KAAK,IAAI,QAAQ,MAAM,IAAI,CAAC,CAAC;GAC1D,IAAI,aAAa,KAAK,aAAa,GAAG,OAAO;GAC7C,IAAI,aAAa,GAAG,OAAO,IAAI;GAC/B,OAAO,IAAI,SAAS,IAAI;EACzB;EAIA,SAAS,WAAW,EAAE,MAAM,QAAQ,KAAmF;GACtH,MAAM,CAAC,QAAQ,aAAaA,QAAM,CAAC,CAAC,SAAS,KAAK;GAClD,MAAM,YAAY,SAAS,MAAM,GAAG,GAAG,aAAa,MAAM;GAC1D,MAAM,cAAc,SAAS,MAAM,GAAG,GAAG,eAAe,QAAQ;GAChE,MAAM,UAAU,MAAuC;IACtD,EAAE,gBAAgB;IAClB,IAAI,OAAO,cAAc,eAAe,UAAU,WACjD,UAAU,UAAU,UAAU,IAAI,CAAC,CAAC,WAAW;KAC9C,UAAU,IAAI;KACd,iBAAiB,UAAU,KAAK,GAAG,IAAI;IACxC,CAAC,CAAC,CAAC,YAAY;KAGd,UAAU,KAAK;IAChB,CAAC;GAEH;GACA,OAAO,GAAG,UAAU;IACnB,MAAM;IACN,WAAW;IACX,SAAS;IACT,OAAO,SAAS,cAAc;GAC/B,GACC,SAAS,mBAAmB,EAAE,IAAI,kBAAkB,EAAE,GACtD,GAAG,QAAQ,MAAM,SAAS,cAAc,SAAS,CAClD;EACD;;;EAMA,MAAM,iBAAiB;EAEvB,SAAS,SAAS,EAAE,OAAO,KAAmI;GAC7J,MAAM,IAAI;GACV,MAAM,UAAU,MAAM,WAAW;GACjC,MAAM,UAAU,MAAM,WAAW;GACjC,MAAM,OAAkB,CAAC;GACzB,MAAM,WAAW,OAAe,QAC/B,EAAE,OAAO;IAAE;IAAK,WAAW;IAAoB,OAAO,EAAE,OAAO,kCAAkC;GAAE,GAClG,GAAG,GAAG,eAAe,qCAAqC,EAAE,MAAM,CAAC,CAAC;GACtE,IAAI,YAAY,IAAI;IACnB,MAAM,QAAQ,QAAQ,MAAM,IAAI;IAChC,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,cAAc;IACnD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;KAC/B,MAAM,OAAO,MAAM;KACnB,KAAK,KAAK,EAAE,OAAO;MAAE,KAAK,SAAS;MAAG,WAAW;KAAmC,GACnF,EAAE,QAAQ,EAAE,WAAW,qBAAqB,GAAG,GAAG,GAClD,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,KAAK,MAAM,IAAI,CAC3D,CAAC;IACF;IACA,IAAI,MAAM,SAAS,OAAO,KAAK,KAAK,QAAQ,MAAM,SAAS,OAAO,UAAU,CAAC;GAC9E;GACA,IAAI,YAAY,IAAI;IACnB,MAAM,QAAQ,QAAQ,MAAM,IAAI;IAChC,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,cAAc;IACnD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;KAC/B,MAAM,OAAO,MAAM;KACnB,KAAK,KAAK,EAAE,OAAO;MAAE,KAAK,SAAS;MAAG,WAAW;KAAmC,GACnF,EAAE,QAAQ,EAAE,WAAW,qBAAqB,GAAG,GAAG,GAClD,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,KAAK,MAAM,IAAI,CAC3D,CAAC;IACF;IACA,IAAI,MAAM,SAAS,OAAO,KAAK,KAAK,QAAQ,MAAM,SAAS,OAAO,UAAU,CAAC;GAC9E;GACA,IAAI,KAAK,WAAW,GACnB,KAAK,KAAK,EAAE,OAAO;IAAE,KAAK;IAAS,WAAW;IAAoB,OAAO,EAAE,OAAO,kCAAkC;GAAE,GAAG,GAAG,GAAG,gBAAgB,sBAAsB,CAAC,CAAC;GAExK,OAAO,EAAE,OAAO,EAAE,WAAW,mBAAmB,GAAG,GAAG,IAAI;EAC3D;EAIA,SAAS,iBAAiB,EAAE,SAA8C;GACzE,MAAM,IAAI;GACV,MAAM,YAAY,MAAM,aAAa,CAAC;GACtC,MAAM,CAAC,aAAa,kBAAkBA,QAAM,CAAC,CAAC,SAAsC,CAAC,CAAC;GACtF,MAAM,CAAC,UAAU,eAAeA,QAAM,CAAC,CAAC,SAAS,KAAK;GAEtD,MAAM,gBAAgB,MAAc,KAAa,YAAsB;IACtE,gBAAgB,SAAS;KACxB,MAAM,OAAO,EAAE,GAAG,KAAK;KACvB,MAAM,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;KACxC,IAAI,SACH,IAAI,QAAQ,IAAI,GAAG,GAAG,QAAQ,OAAO,GAAG;UACnC,QAAQ,IAAI,GAAG;UACd;MACN,QAAQ,MAAM;MACd,QAAQ,IAAI,GAAG;KAChB;KACA,KAAK,QAAQ;KACb,OAAO;IACR,CAAC;GACF;GAEA,MAAM,iBAAiB;IACtB,MAAM,QAAkB,CAAC;IACzB,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;KAC1C,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,CAAC,CAAC;KAC3C,IAAI,IAAI,SAAS,GAChB,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IAE3B;IACA,IAAI,MAAM,SAAS,GAAG;KAErB,2BADa,MAAM,KAAK,IACM,CAAC;KAC/B,YAAY,IAAI;KAChB,iBAAiB,YAAY,KAAK,GAAG,IAAI;IAC1C;GACD;GAEA,MAAM,SAAoB,CAAC;GAC3B,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;IAC1C,MAAM,IAAI,UAAU;IACpB,IAAI,CAAC,GAAG;IACR,MAAM,UAAU,EAAE,WAAW,CAAC;IAC9B,MAAM,UAAU,EAAE,oBAAoB;IACtC,MAAM,MAAM,YAAY,sBAAM,IAAI,IAAI;IAEtC,MAAM,WAAW,QAAQ,KAAK,KAAK,SAAS;KAC3C,MAAM,YAAY,IAAI,IAAI,GAAG;KAC7B,OAAO,EAAE,UAAU;MAClB,KAAK,SAAS;MACd,MAAM;MACN,WAAW,IAAI,gBAAgB,aAAa,UAAU;MACtD,UAAU,MAAuC;OAChD,EAAE,gBAAgB;OAClB,aAAa,GAAG,KAAK,OAAO;MAC7B;KACD,GACC,EAAE,QAAQ,EAAE,WAAW,IAAI,kBAAkB,UAAU,aAAa,SAAS,aAAa,SAAS,EAAE,CAAC,GACtG,EAAE,QAAQ,EAAE,WAAW,oBAAoB,GAAG,GAAG,CAClD;IACD,CAAC;IAED,OAAO,KAAK,EAAE,OAAO;KAAE,KAAK,OAAO;KAAG,WAAW;IAAgB,GAChE,EAAE,OAAO,EAAE,WAAW,kBAAkB,GAAG,EAAE,YAAY,gBAAgB,GACzE,EAAE,OAAO,EAAE,WAAW,gBAAgB,GAAG,GAAG,QAAQ,CACrD,CAAC;GACF;GAEA,MAAM,eAAe,OAAO,OAAO,WAAW,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO,CAAC;GAEtE,OAAO,EAAE,OAAO,EAAE,WAAW,uBAAuB,GACnD,GAAG,QACH,EAAE,OAAO,EAAE,WAAW,kBAAkB,GACvC,EAAE,UAAU;IACX,MAAM;IACN,WAAW,IAAI,uBAAuB,gBAAgB,QAAQ;IAC9D,UAAU,CAAC;IACX,UAAU,MAAuC;KAChD,EAAE,gBAAgB;KAClB,SAAS;IACV;GACD,GACC,WAAW,aAAa,6BACzB,GACA,MAAM,SAAS,EAAE,OAAO,EAAE,WAAW,oBAAoB,GAAG,QAAQ,MAAM,QAAQ,IAAI,IACvF,CACD;EACD;EAIA,SAAS,cAAc,EAAE,SAA8C;GACtE,MAAM,IAAI;GACV,MAAM,SAAS,MAAM,UAAU;GAC/B,MAAM,OAAO,MAAM,aAAa;GAChC,MAAM,QAAQ,MAAM,eAAe;GACnC,MAAM,OAAO,MAAM,aAAa,MAAM,QAAQ;GAC9C,MAAM,WAAW,OAAO,cAAc,IAAI,IAAI;GAE9C,OAAO,EAAE,OAAO,EAAE,WAAW,kBAAkB,GAC9C,EAAE,OAAO,EAAE,WAAW,kBAAkB,GACvC,EAAE,OAAO;IAAE,WAAW;IAAqB,OAAO,UAAU;GAAK,GAAG,SAAS,IAAI,OAAO,KAAK,IAAI,GACjG,EAAE,OAAO,EAAE,WAAW,oBAAoB,GACzC,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,KAAK,GAClD,GAAI,OAAO,CAAC,EAAE,QAAQ;IAAE,KAAK;IAAQ,WAAW;IAAoB,OAAO;GAAK,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CACnH,CACD,GACA,WAAW,EAAE,OAAO;IACnB,WAAW;IACX,UAAU,MAAuC;KAChD,EAAE,gBAAgB;KAClB,aAAa,UAAU,UAAU,MAAM,IAAI;IAC5C;IACA,OAAO;GACR,GACC,EAAE,OAAO;IACR,WAAW;IACX,KAAK;IACL,KAAK,UAAU;IACf,SAAS;GACV,CAAC,CACF,IAAI,IACL;EACD;EAIA,SAAS,SAAS,EAAE,OAAO,UAAU,KAAK,MAAM,SAAS,KAO7C;GACX,MAAM,IAAI;GACV,MAAM,cAAc,YAAY,KAAA,IAC7B,EAAE,OAAO;IAAE,KAAK;IAAO,OAAO,EAAE,SAAS,cAAc;GAAE,GAC1D,EAAE,UAAU;IACX,MAAM;IACN,WAAW;IACX,SAAS;GACV,GAAG,qBAAqB,EAAE,GAAG,GAAG,GAAG,gBAAgB,SAAS,CAAC,CAC9D,IACE;GAEH,QAAQ,MAAM,MAAd;IACC,KAAK,YAAY;KAChB,MAAM,UAAU,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,KAAK,uBAAuB,MAAM,MAAM,IAAI,GAAG,GAAG,eAAe,aAAa;KAC7I,MAAM,WAAW,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,KAAK,MAAM,SAAU,MAAM,WAAW;KACtG,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAC1C,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,EAAE,QAAQ,EAAE,WAAW,sBAAsB,GAAG,GAAG,GACnD,GAAI,MAAM,MAAM,CAAC,EAAE,QAAQ;MAAE,KAAK;MAAO,WAAW;KAAkB,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GACxF,EAAE,QAAQ;MAAE,WAAW;MAAmB,OAAO,MAAM;KAAQ,GAAG,MAAM,WAAW,EAAE,CACtF,GACA,EAAE,YAAY;MAAE,MAAM;MAAU;KAAE,CAAC,CACpC,GACA,EAAE,OAAO,EAAE,WAAW,sBAAsB,GAAG,KAAK,SAAS,IAAK,CAAC,GACnE,WACD;IACD;IACA,KAAK,QAAQ;KAEZ,MAAM,YAAY,WADL,MAAM,QAAQ,QACQ,KAAK,IAAI;KAC5C,MAAM,OAAO,SAAS,KAAK;KAC3B,MAAM,WAAW,MAAM,WAAW;KAClC,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAC1C,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,kBAAkB,EAAE,GACpB,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,SAAS,GACtD,GAAI,OAAO,CAAC,EAAE,QAAQ;MAAE,KAAK;MAAK,WAAW;KAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,CAC9E,GACA,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC,CACjC,GACA,EAAE,UAAU;MAAE;MAAO;MAAU;MAAK;MAAM;KAAE,CAAC,GAC7C,WACD;IACD;IACA,KAAK,QAAQ;KAEZ,MAAM,YAAY,WADL,MAAM,QAAQ,QACQ,KAAK,IAAI;KAC5C,MAAM,UAAU,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,KAAK,uBAAuB,MAAM,MAAM,IAAI,GAAG,GAAG,eAAe,aAAa;KAC7I,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAC1C,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,oBAAoB,EAAE,GACtB,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,SAAS,CACvD,GACA,EAAE,YAAY;MAAE,MAAM,MAAM,UAAU;MAAI;KAAE,CAAC,CAC9C,GACA,EAAE,OAAO,EAAE,WAAW,sBAAsB,GAAG,KAAK,SAAS,IAAK,CAAC,GACnE,WACD;IACD;IACA,KAAK,UAAU;KACd,MAAM,UAAU,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,KAAK,uBAAuB,MAAM,MAAM,IAAI,GAAG,GAAG,gBAAgB,cAAc;KAC/I,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAC1C,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,oBAAoB,EAAE,GACtB,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,MAAM,KAAK,CACzD,GACA,EAAE,YAAY;MAAE,MAAM,MAAM,UAAU;MAAI;KAAE,CAAC,CAC9C,GACA,EAAE,OAAO,EAAE,WAAW,sBAAsB,GAAG,KAAK,SAAS,IAAK,CAAC,GACnE,WACD;IACD;IACA,KAAK,QAAQ;KACZ,MAAM,UAAU,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,KAAK,uBAAuB,MAAM,MAAM,IAAI,GAAG,GAAG,eAAe,mBAAmB;KACnJ,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAC1C,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,oBAAoB,EAAE,GACtB,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,MAAM,KAAK,CACzD,GACA,EAAE,YAAY;MAAE,MAAM,MAAM,UAAU;MAAI;KAAE,CAAC,CAC9C,GACA,EAAE,OAAO,EAAE,WAAW,sBAAsB,GAAG,KAAK,SAAS,IAAK,CAAC,GACnE,WACD;IACD;IACA,KAAK,YACJ,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAC1C,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,sBAAsB,EAAE,GACxB,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,MAAM,KAAK,CACzD,GACA,EAAE,YAAY,EAAE,MAAM,MAAM,UAAW,MAAM,OAAO,GAAI,CAAC,CAC1D,GACA,EAAE,kBAAkB,EAAE,MAAM,CAAC,GAC7B,WACD;IAED,KAAK,SACJ,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAC1C,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,mBAAmB,EAAE,GACrB,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,MAAM,aAAa,OAAO,CACxE,GACA,EAAE,YAAY,EAAE,MAAM,MAAM,WAAW,MAAM,OAAO,IAAI,CAAC,CAC1D,GACA,EAAE,eAAe,EAAE,MAAM,CAAC,GAC1B,WACD;IAED,SAAS;KACR,MAAM,WAAW,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,KAAK,MAAM,SAAU,MAAM,OAAO;KAClG,MAAM,UAAU,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,KAC5D,uBAAuB,MAAM,MAAM,IAClC,MAAM,QAAQ,KAAA,KAAa,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,GAAI,IAAI,GAAG,GAAG,eAAe,aAAa;KAC5G,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAC1C,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,kBAAkB,EAAE,GACpB,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,MAAM,SAAS,GAAG,MAAM,OAAO,IAAI,MAAM,SAAU,MAAM,SAAS,MAAM,QAAQ,MAAO,CACrI,GACA,EAAE,YAAY;MAAE,MAAM;MAAU;KAAE,CAAC,CACpC,GACA,EAAE,OAAO,EAAE,WAAW,sBAAsB,GAAG,KAAK,SAAS,IAAK,CAAC,GACnE,WACD;IACD;GACD;EACD;EAIA,SAAgB,kBAAkB,OAAkC;GACnE,MAAM,IAAI;GACV,MAAM,EAAE,OAAO,KAAK,MAAM,UAAU,SAAS,GAAG,WAAW;GAC3D,MAAM,SAAS,UAAU,KAAK;GAC9B,MAAM,MAAM,QAAQ,KAAK;GACzB,MAAM,QAAQ,gBAAgB,OAAO,KAAK,IAAI;GAE9C,MAAM,CAAC,MAAM,WAAW,UAAU,OADlB,SAAS,QAAQ,WAAW,GAAG,MAAM,KAAK,GAAG,MAAM,QAAQ,GAAG,GAAG,MAAM,MAAM,GAAG,MAAM,QAAQ,MAAM,WAAW,IAC/E;GAChD,MAAM,QAA8B,CAAC,SAAS,QAAQ,MAAM,QAAQ;GACpE,MAAM,QAAQ,aAAa,OAAO,CAAC;GACnC,MAAM,UAAU,eAAe,OAAO,KAAK,IAAI;GAC/C,MAAM,OAAO,SAAS,KAAK;GAC3B,MAAM,UAAU,CAAC,QAAQ,MAAM,SAAS,SAAS,YAAY,OAAO,KAAK,IAAI,IAAI,KAAA;GACjF,MAAM,eAAe,MAAM,SAAS,UAAU,MAAM,SAAS,WAAW,MAAM,QAAQ,aAAa,KAAA;GAEnG,MAAM,eAAe,MAAuC;IAC3D,EAAE,gBAAgB;IAClB,IAAI,MAAM,QAAQ,UACjB,IAAI,MAAM,UAAU,SAAS,KAAA,GAAW,SAAS,MAAM,MAAM,EAAE,MAAM,MAAM,SAAS,KAAK,CAAC;SACrF,SAAS,MAAM,IAAI;GAE1B;GAEA,MAAM,UAAU,OACb,EAAE,QAAQ,EAAE,WAAW,sBAAsB,GAAG,yBAAyB,EAAE,CAAC,IAC5E,EAAE,QAAQ,EAAE,WAAW,iBAAiB,GACzC,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,YAAY,MAAM,MAAM,EAAE,CAAC,GACxE,EAAE,QAAQ,EAAE,WAAW,uBAAuB,GAAG,yBAAyB,EAAE,CAAC,CAC9E;GAED,MAAM,cAAc,cACjB,EAAE,UAAU;IACb,MAAM;IACN,WAAW;IACX,SAAS;IACT,OAAO,MAAM;GACd,GAAG,OAAO,IACR,EAAE,QAAQ;IACX,WAAW,IAAI,kBAAkB,OAAO,oBAAoB;IAC5D,OAAO;GACR,GAAG,OAAO;GAEX,MAAM,SAAS,EAAE,OAAO;IACvB,WAAW;IACX,MAAM;IACN,UAAU;IACV,iBAAiB;IACjB,UAAU,MAAuC;KAChD,EAAE,gBAAgB;KAClB,QAAQ;IACT;IACA,YAAY,MAAmD;KAC9D,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;MACvC,EAAE,eAAe;MACjB,QAAQ;KACT;IACD;IACA,OAAO,YAAY,KAAA,IACf,OAAO,GAAG,GAAG,2BAA2B,4CAA4C,IAAI,GAAG,GAAG,yBAAyB,0CAA0C,IACjK,OAAO,GAAG,GAAG,oBAAoB,mBAAmB,IAAI,GAAG,GAAG,kBAAkB,iBAAiB;IACrG,eAAe,YAAY,KAAA,KAAa,MAAsC;KAAE,EAAE,eAAe;KAAG,QAAQ;IAAG,IAAI,KAAA;GACpH,GACC,SACA,EAAE,QAAQ,EAAE,WAAW,eAAe,GAAG,KAAK,GAC9C,EAAE,QAAQ;IAAE,WAAW;IAAc,eAAe;GAAK,CAAC,GAC1D,aACA,GAAI,SAAS,OAAO,CAAC,EAAE,QAAQ;IAAE,KAAK;IAAQ,WAAW;GAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,GACzF,GAAI,YAAY,KAAA,IAAY,CAAC,EAAE,QAAQ;IAAE,KAAK;IAAQ,WAAW;IAAkB,OAAO;GAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CACnH;GAEA,OAAO,EAAE,OAAO;IACf,WAAW,IAAI,eAAe,QAAQ,aAAa;IACnD,cAAc;IACd,aAAa,MAAM;GACpB,GACC,QACA,GAAI,OAAO,CAAC,EAAE,OAAO;IAAE,KAAK;IAAQ,WAAW;GAAmB,GACjE,EAAE,UAAU;IAAE;IAAO;IAAU;IAAK;IAAM;IAAS;GAAE,CAAC,CACvD,CAAC,IAAI,CAAC,CACP;EACD;;;;;;;;;EAYA,SAAgB,uBAAuB,SAAsE;GAC5G,IAAI;IACH,MAAM,SAAS,KAAK,MAAM,OAAO;IAEjC,MAAM,OAAO,qBADA,OAAO,QAAQ,SAAS,WAAW,OAAO,OAAO,EACxB;IACtC,IAAI,SAAS,KAAA,GAAW,OAAO;IAC/B,OAAO;KAAE,KAAK,KAAK;KAAK,MAAM,KAAK;KAAM,MAAM,KAAK;IAAK;GAC1D,QAAQ,CAA6B;GACrC,OAAO;EACR;;EAGA,SAAgB,aAAa,OAAoD;GAChF,MAAM,MAAM,UAAU,KAAA,IAAY,cAAc,KAAK,IAAI;GACzD,IAAI,OAAO;GACX,IAAI;GACJ,IAAI;IACH,MAAM,SAAS,KAAK,MAAM,GAAG;IAC7B,IAAI,OAAO,QAAQ,SAAS,UAAU,OAAO,OAAO;IACpD,IAAI,OAAO,QAAQ,gBAAgB,YAAY,OAAO,gBAAgB,IAAI,cAAc,OAAO;GAChG,QAAQ,CAAmD;GAC3D,MAAM,YAAY,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,SAAS,KAAK,KAAK,MAAM,EAAE;GACpE,MAAM,QAAQ,gBACT,cAAc,KAAA,KAAa,UAAU,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG,IAAI;GAC3F,OAAO;IAAE;IAAM;GAAM;EACtB;;;;;;;;;;EAWA,SAAgB,gBAAgB,OAAmC;GAClE,MAAM,IAAI;GACV,MAAM,EAAE,OAAO,SAAS,GAAG,WAAW,SAAU,CAAC;GACjD,MAAM,QAAQ,aAAa,KAAK;GAEhC,MAAM,CAAC,MAAM,WAAW,UAAU,OADlB,SAAS,QAAQ,WAAW,QAAQ,MAAM,OACV;GAChD,MAAM,SAAS,UAAU,KAAA,KAAa,UAAU,KAAK;GACrD,MAAM,MAAM,UAAU,KAAA,KAAa,QAAQ,KAAK;GAChD,MAAM,QAA8B,CAAC,SAAS,QAAQ,MAAM,QAAQ;GACpE,MAAM,aAAa,QAAyB,OAAO,MAAM,aAAa,EAAE,GAAG,IAAI;GAE/E,MAAM,UAAU,OACb,EAAE,QAAQ,EAAE,WAAW,sBAAsB,GAAG,yBAAyB,EAAE,CAAC,IAC5E,EAAE,QAAQ,EAAE,WAAW,iBAAiB,GACzC,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,kBAAkB,EAAE,CAAC,GAClE,EAAE,QAAQ,EAAE,WAAW,uBAAuB,GAAG,yBAAyB,EAAE,CAAC,CAC9E;GAED,MAAM,SAAS,EAAE,OAAO;IACvB,WAAW;IACX,MAAM;IACN,UAAU;IACV,iBAAiB;IACjB,UAAU,MAAuC;KAChD,EAAE,gBAAgB;KAClB,QAAQ;IACT;IACA,YAAY,MAAmD;KAC9D,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;MACvC,EAAE,eAAe;MACjB,QAAQ;KACT;IACD;IACA,OAAO,YAAY,KAAA,IACf,OAAO,GAAG,GAAG,2BAA2B,4CAA4C,IAAI,GAAG,GAAG,yBAAyB,0CAA0C,IACjK,OAAO,GAAG,GAAG,oBAAoB,mBAAmB,IAAI,GAAG,GAAG,kBAAkB,iBAAiB;IACrG,eAAe,YAAY,KAAA,KAAa,MAAsC;KAAE,EAAE,eAAe;KAAG,QAAQ;IAAG,IAAI,KAAA;GACpH,GACC,SACA,EAAE,QAAQ,EAAE,WAAW,eAAe,GAAG,UAAU,YAAY,CAAC,GAChE,EAAE,QAAQ;IAAE,WAAW;IAAc,eAAe;GAAK,CAAC,GAC1D,EAAE,QAAQ;IAAE,WAAW,IAAI,kBAAkB,OAAO,oBAAoB;IAAG,OAAO,MAAM;GAAM,GAAG,MAAM,KAAK,CAC7G;GAEA,MAAM,cAAc,YAAY,KAAA,IAC7B,EAAE,OAAO;IAAE,KAAK;IAAO,OAAO,EAAE,SAAS,cAAc;GAAE,GAC1D,EAAE,UAAU;IAAE,MAAM;IAAU,WAAW;IAAsB,SAAS;GAAQ,GAC/E,qBAAqB,EAAE,GAAG,UAAU,cAAc,CAAC,CAAC,IACpD;GAEH,MAAM,OAAO,EAAE,OAAO,EAAE,WAAW,cAAc,GAChD,EAAE,OAAO,EAAE,WAAW,qBAAqB,GAC1C,EAAE,OAAO,EAAE,WAAW,0BAA0B,GAC/C,kBAAkB,EAAE,GACpB,EAAE,QAAQ,EAAE,WAAW,mBAAmB,GAAG,MAAM,KAAK,CACzD,GACA,EAAE,YAAY;IAAE,MAAM,MAAM;IAAM,QAAQ,CAAC,UAAU,WAAW,GAAG,UAAU,aAAa,CAAC;GAAE,CAAC,CAC/F,GACA,EAAE,OAAO,EAAE,WAAW,sBAAsB,GAAG,KAAK,MAAM,MAAM,IAAM,CAAC,GACvE,WACD;GAEA,OAAO,EAAE,OAAO;IACf,WAAW,IAAI,eAAe,QAAQ,aAAa;IACnD,cAAc;IACd,aAAa;GACd,GACC,QACA,GAAI,OAAO,CAAC,EAAE,OAAO;IAAE,KAAK;IAAQ,WAAW;GAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,CAChF;EACD;;;;;;EAOA,SAAgB,mBAAmB,OAA0B;GAC5D,MAAM,QAAQ;GACd,MAAM,QAAQ,OAAO;GACrB,MAAM,MAAM,UAAU,KAAA,IAAY,cAAc,KAAK,IAAI;GACzD,MAAM,SAAS,uBAAuB,GAAG;GACzC,IAAI,WAAW,MAAM,OAAO,gBAAgB,KAAK;GACjD,IAAI;GACJ,IAAI;IACH,MAAM,SAAS,KAAK,MAAM,GAAG;IAC7B,IAAI,OAAO,QAAQ,gBAAgB,YAAY,OAAO,gBAAgB,IAAI,cAAc,OAAO;GAChG,QAAQ,CAAe;GAcvB,OAAO,kBAAkB;IAAE,OAAO;KAZjC,GAAG;KACH,MAAM;MACL,GAAK,OAAsE,QAAQ,CAAC;MACpF,MAAM;MACN,SAAS,KAAK,UAAU;OACvB,KAAK,OAAO;OACZ,MAAM,OAAO;OACb,GAAI,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;OACzD,GAAI,gBAAgB,KAAA,IAAY,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC;MAC/D,CAAC;KACF;IAEyC;IAAG,GAAG,OAAO;GAAE,CAAU;EACpE;;;;;;;EAQA,MAAa,iBAIR,CACJ;GAAE,KAAK;GAAY,OAAO;GAAoB,WAAW;EAA0D,GAInH;GAAE,KAAK;GAAY,OAAO;GAA2B,WAAW;EAA2D,CAC5H;EAIA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAihBhB,SAAgB,2BAAuC;GACtD,MAAM,OAAQ,WAOX;GACH,IAAI,SAAS,KAAA,KAAa,SAAS,MAAM,aAAa,CAAC;GACvD,MAAM,UAAU;GAChB,IAAI,KAAK,KAAK,eAAe,OAAO;GACpC,IAAI,OAAO,MAAM;IAChB,KAAK,KAAK,cAAc,OAAO;IAC/B,GAAG,KAAK;IACR,GAAG,cAAc;IACjB,MAAM,OAAQ,KAAK,QAAQ,KAAK;IAChC,IAAI,SAAS,KAAA,GAAW,KAAK,YAAY,EAAE;GAC5C;GACA,aAAa;IACZ,IAAI,SAAS;GACd;EACD;;;ECj1DA,MAAa,OAAO;EACpB,MAAa,SAAS,CAAC,OAAO;EAC9B,MAAa,kBAAkB;EAI/B,SAAgB,MAAM,KAAoB;GAExC,IAAI,OAAO,CAAC,QAAQ,IAAG,UAAS;IAC9B,MAAM,SAAU,MAAkE;IAClF,MAAM,aAAa,WAAW,MAAM,CAAC;IAGrC,MAAM,aAAa,cAAc,MAAoC,CAAC;GACxE,CAAC;GACD,IAAI,OAAO,CAAC,aAAa,IAAG,UAAS;IACnC,MAAM,QAAS,MAAkD;IACjE,MAAM,aAAa,kBAAkB,MAAM,IAAI,yBAAyB,KAAK,MAAM,IAAI,kBAAkB,KAAK,MAAM,IAAI,YAAY,CAAC,CAAC;GACxI,CAAC;GACD,KAAK,MAAM,QAAQ,oBAAoB,IAAI,MAAM,OAAO,4BAA4B,IAAI,MAAM,SAAS;IACrG,MAAM;IAAsB,KAAK;GACnC,GAAG,UAAU,CAAC;GAYd,KAAK,MAAM,QAAQ,gBAAgB,IAAI,MAAM,OAAO,4BAA4B,IAAI,MAAM,SAAS;IACjG,MAAM;IAAsB,KAAK,KAAK;IAAK,QAAQE;GACrD,GAAG,KAAK,SAAS,CAAC;GAClB,IAAI,aAAa,yBAAyB,CAAC;GAC3C,IAAI,MAAM,OAAO,cAAc,IAAI,MAAM,SAAS;IAChD,MAAM;IAAQ,KAAK;GACrB,GAAG,cAAc,CAAC;GAIlB,IAAI,MAAM,OAAO,2BAA2B,IAAI,MAAM,SAAS;IAC7D,MAAM;IAAqB,IAAI;IAAiB,OAAO;IAAI,aAAa;GAC1E,GAAG,eAAe,CAAC;GACnB,IAAI,OAAO,CAAC,kBAAkB,IAAG,UAAS;IACxC,MAAM,gBAAgB,cAAyE;KAC7F,MAAM,YAAY,MAAM,iBAAiB,aAAa,SAAS;KAC/D,OAAO;MAAE;MAAW,WAAW,UAAU;MAAO,YAAY;OAAE,UAAe,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;MAAE;KAAE;IAC/G;IACA,MAAM,MAAM,OAAO,iCAAiC,MAAM,MAAM,SAAS;KACvE,MAAM;KAA2B,IAAI;KAAwB,OAAO;KAAI,QAAQ;IAClF,GAAG,UAAU,CAAC;IAEd,MAAM,MAAM,OAAO,iCAAiC,MAAM,MAAM,SAAS;KACvE,MAAM;KAA2B,IAAI;KAAqB,OAAO;KAAI,QAAQ;IAC/E,GAAG,gBAAgB,CAAC;GACtB,CAAC;EACH"}
|