dsh-prompt-customizer 0.9.2 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +49 -234
- package/README.md +45 -310
- package/build.mjs +27 -10
- package/client/client.js +2446 -1364
- package/client/client.js.map +4 -4
- package/docs/adr/0001-remove-catalog-pool.md +27 -0
- package/docs/adr/0002-hide-identity-name-source.md +23 -0
- package/docs/adr/0003-destructive-updates-allowed.md +18 -0
- package/docs/adr/0004-generalized-filter-model.md +17 -0
- package/docs/adr/0005-universal-prompt-takeover.md +109 -0
- package/docs/design/prompt-control-consensus.md +103 -0
- package/docs/guide.md +280 -0
- package/docs/images/prompt.png +0 -0
- package/docs/images/tool.png +0 -0
- package/docs/testing/feature-matrix.md +142 -0
- package/docs/upgrades/1.0.0-sqlite-breaking.md +26 -0
- package/docs/upgrades/1.4.0-generalized-model.md +23 -0
- package/docs/upgrades/1.4.1-web-preview-fixes.md +15 -0
- package/docs/upgrades/2.0.0-remove-workspace-level.md +16 -0
- package/docs/upgrades/2.0.1-context-fixes.md +6 -0
- package/docs/upgrades/2.0.10-import-and-skill.md +6 -0
- package/docs/upgrades/2.0.11-regression-fixes.md +7 -0
- package/docs/upgrades/2.0.12-generative-tool-tests.md +5 -0
- package/docs/upgrades/2.0.13-runtime-contract.md +8 -0
- package/docs/upgrades/2.0.14-tool-execution-guard.md +5 -0
- package/docs/upgrades/2.0.15-mask-pool-regression.md +5 -0
- package/docs/upgrades/2.0.16-regression-cleanup.md +6 -0
- package/docs/upgrades/2.0.17-unhide-source.md +5 -0
- package/docs/upgrades/2.0.18-unhide-cleanup.md +4 -0
- package/docs/upgrades/2.0.19-mcp-json-edit.md +4 -0
- package/docs/upgrades/2.0.2-generic-context-filter.md +6 -0
- package/docs/upgrades/2.0.20-preset-isolation.md +4 -0
- package/docs/upgrades/2.0.21-isolation-restore-test.md +4 -0
- package/docs/upgrades/2.0.22-source-immutability.md +3 -0
- package/docs/upgrades/2.0.3-skill-summary.md +6 -0
- package/docs/upgrades/2.0.4-tool-draft.md +5 -0
- package/docs/upgrades/2.0.5-tool-catalog-robustness.md +13 -0
- package/docs/upgrades/2.0.6-tool-restrict.md +6 -0
- package/docs/upgrades/2.0.7-tool-stability.md +5 -0
- package/docs/upgrades/2.0.8-catalog-row-stability.md +4 -0
- package/docs/upgrades/2.0.9-tool-and-write.md +8 -0
- package/docs/upgrades/2.1.0-universal-prompt-takeover.md +41 -0
- package/docs/upgrades/2.1.1-tool-shadow-detection.md +48 -0
- package/docs/upgrades/2.1.2-tool-catalog-scope.md +55 -0
- package/docs/upgrades/README.md +298 -0
- package/docs/upgrades/dsh-0.2.2-rc1.md +49 -0
- package/docs/upgrades/rc2-migration.md +70 -0
- package/lib/index.js +4697 -1701
- package/lib/index.js.map +4 -4
- package/package.json +7 -5
- package/scripts/e2e-report.json +221 -0
- package/scripts/e2e-terminal.mjs +210 -0
- package/scripts/simulate-rescan.mjs +184 -0
- package/scripts/smoke-host.mjs +1 -1
- package/scripts/verify-apply-all.mjs +64 -0
- package/scripts/verify-effect.mjs +153 -0
- package/scripts/verify-mcp-edit-ext.mjs +48 -0
- package/scripts/verify-mcp-edit.mjs +45 -0
- package/scripts/verify-panel-browser.mjs +298 -0
- package/scripts/verify-workspace-mcp.mjs +62 -0
- package/scripts/test-mcp-layering.mjs +0 -441
- package/scripts/test-mcp-tool-disable.mjs +0 -420
- package/scripts/test-rc2-runtime.mjs +0 -42
- package/scripts/test-skill-toggles.mjs +0 -100
package/client/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/client/index.ts", "../src/client/skills/entry.tsx", "../src/client/skills/SkillsPanel.tsx", "../src/client/popover-shell.tsx", "../src/client/modal-animation.ts", "../src/client/prompt/Panel.tsx", "../src/client/skills/styles.ts", "../src/client/prompt/dnd.ts", "../src/client/prompt/styles.ts", "../src/client/prompt/
|
|
4
|
-
"sourcesContent": ["/**\n * dsh-prompt-customizer \u2014 browser half entry.\n *\n * Mounts the capability module (skills + MCP + prompt management), each piece\n * isolated so a failure in one cannot take down the others:\n *\n * - skills panel \u2192 sidebar nav row + panel (SKILL / MCP / \u63D0\u793A\u8BCD top-level tabs)\n * - prompt \u2192 locale registration for the \u63D0\u793A\u8BCD tab (panel body lives in\n * `./prompt`, ported from dsh-prompt-customizer)\n *\n * \u4E0D\u518D\u6CE8\u518C\u5185\u6838\u5DF2\u7ECF\u63D0\u4F9B\u7684\u90A3\u4E09\u6837\uFF08`skill` locale \u547D\u540D\u7A7A\u95F4\u3001`tool.call.toolview`\n * \u7684 `skill` \u5DE5\u5177\u884C\u3001`/` \u659C\u6760\u6E90\uFF09\uFF1A\u5B83\u4EEC\u5C5E\u4E8E `@deepseek-ai/dsh-client-ui-skill`\uFF0C\n * \u800C locale / slots / inputTriggers \u4E09\u4E2A\u6CE8\u518C\u8868\u5BF9\u540C\u540D/\u540C\u952E**\u76F4\u63A5\u629B\u9519**\uFF0C\u4E14\u8C01\u5148\n * \u6CE8\u518C\u8C01\u8BA9\u540E\u6765\u8005\u629B \u2014\u2014 \u91CD\u590D\u6CE8\u518C\u4F1A\u628A\u5185\u6838\u63D2\u4EF6\u7684 apply \u6253\u6302\uFF0C\u6574\u6761\u5BA2\u6237\u7AEF\u63D2\u4EF6\u52A0\u8F7D\n * \u94FE\u4E00\u8D77\u5931\u8D25\uFF080.6.0 \u5B9E\u6D4B\u8E29\u8FC7\uFF09\u3002\u6280\u80FD\u6570\u636E\u672C\u8EAB\u4ECD\u7531\u672C\u63D2\u4EF6\u7684\u9762\u677F\u4E0E\u8DEF\u7531\u63D0\u4F9B\u3002\n *\n * All data comes from the host half's loopback-only HTTP routes via\n * same-origin fetch. No DSH source is modified.\n */\n\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport { apply as applySkillsEntry } from './skills/entry.js'\nimport { applyPrompt } from './prompt/index.js'\n\n/** Client services required before the browser half activates. */\nexport const inject = ['slots', 'locale', 'inputTriggers', 'sessions']\n\n/** Run one module's apply, logging and swallowing any failure. */\nfunction safe(label: string, run: (ctx: ClientContext) => void, ctx: ClientContext): void {\n try {\n run(ctx)\n } catch (error) {\n console.error(`[dsh-prompt-customizer] ${label} failed:`, error)\n }\n}\n\nexport function apply(ctx: ClientContext): void {\n safe('skills panel', applySkillsEntry, ctx)\n safe('prompt locale', applyPrompt, ctx)\n}\n", "/**\r\n * \u80FD\u529B\uFF08\u6280\u80FD + MCP \u7BA1\u7406\uFF09\u5165\u53E3\uFF1A\u4FA7\u8FB9\u680F\u5BFC\u822A\u884C\u3002\r\n *\r\n * \u70B9\u51FB\u6253\u5F00\u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u7684\u9762\u677F\uFF08\u8DDF\u70B9\u4F1A\u8BDD\u4E00\u6837\u5360\u4F4F\u4E3B\u533A\uFF0C\u79FB\u52A8\u7AEF\u56DE\u9000\u5E95\u90E8 sheet\uFF09\uFF0C\r\n * \u9762\u677F\u9876\u90E8 SKILL / MCP \u53CC\u5C42\u9876\u5C42 tab\u3002\r\n */\r\nimport { useState } from 'react'\r\nimport { createRoot } from 'react-dom/client'\r\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\r\nimport { SkillsPanel } from './SkillsPanel'\r\nimport { ensureModalAnimStyles, useModalClose } from '../modal-animation'\r\nimport { ErrorBoundary } from '../error-boundary'\r\nimport { NavButton, NavPortal, ensureNavMount, ensureNavStyles, navAnchorFrom, usePanelAutoClose, useRail } from '../sidebar-nav'\r\nimport { ensureShellStyles, type PopoverAnchor } from '../popover-shell'\r\n\r\n/** \u4ECE\u70B9\u51FB\u4E8B\u4EF6\u53D6\u951A\u70B9\uFF1A\u6240\u5728\u5BFC\u822A\u884C\u53F3\u7F18 +8\u3001\u6309\u94AE\u9876\u7F18 -6\u3002 */\r\nfunction anchorFromEvent(e: React.MouseEvent<HTMLButtonElement>): PopoverAnchor | null {\r\n return navAnchorFrom(e.currentTarget)\r\n}\r\n\r\n/** \u6280\u80FD\u5165\u53E3\uFF1A\u5BFC\u822A\u884C + \u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u7684\u9762\u677F\u3002 */\r\nfunction SkillsEntry(): JSX.Element {\r\n ensureModalAnimStyles()\r\n ensureShellStyles()\r\n const [open, setOpen] = useState(false)\r\n const [anchor, setAnchor] = useState<PopoverAnchor | null>(null)\r\n const { closing, requestClose } = useModalClose(open, () => { setOpen(false) })\r\n const rail = useRail()\r\n usePanelAutoClose('skills', open, requestClose)\r\n return (\r\n <>\r\n {/* \u80FD\u529B\uFF08\u95EA\u7535\uFF0CFeather zap \u7EBF\u6027\u98CE\uFF0C\u81EA\u7ED8\u56FE\u6807\uFF09 */}\r\n <NavButton\r\n icon={(\r\n <svg width={rail ? 18 : 16} height={rail ? 18 : 16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M13 2 3 14h7l-1 8 10-12h-7l1-8z\" />\r\n </svg>\r\n )}\r\n label=\"\u80FD\u529B\"\r\n rail={rail}\r\n expanded={open}\r\n onClick={e => {\r\n e.stopPropagation()\r\n setAnchor(anchorFromEvent(e))\r\n setOpen(true)\r\n }}\r\n />\r\n {open && (\r\n <ErrorBoundary label=\"\u6280\u80FD\u9762\u677F\" fallback={null} onError={requestClose}>\r\n <SkillsPanel closing={closing} onClose={requestClose} anchor={anchor} />\r\n </ErrorBoundary>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\n/** \u5BFC\u822A\u884C\u5E94\u7528\uFF1A\u80FD\u529B\u5165\u53E3 portal \u5230 nav host \u7684 skills \u69FD\u3002 */\r\nfunction SkillsNavApp(): JSX.Element | null {\r\n ensureNavStyles()\r\n return (\r\n <NavPortal name=\"skills\">\r\n <SkillsEntry />\r\n </NavPortal>\r\n )\r\n}\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n ctx.effect(() => {\r\n ensureNavMount()\r\n // React \u6839\u6302\u5728\u6E38\u79BB\u5BB9\u5668\u4E0A\uFF08React 18 \u652F\u6301\u5BB9\u5668\u540E\u5165\u6811\uFF09\uFF1B\u5B9E\u9645 UI \u7ECF portal\r\n // \u843D\u5230 sidebar-nav \u7684\u69FD\u4F4D div\u3002\r\n const holder = document.createElement('div')\r\n const root = createRoot(holder)\r\n root.render(<SkillsNavApp />)\r\n return () => { root.unmount() }\r\n }, 'triad: skills nav entry')\r\n}\r\n", "/**\n * SkillsPanel \u2014 \u80FD\u529B\u7BA1\u7406\u9762\u677F\uFF08SKILL / MCP \u53CC\u9876\u5C42 tab\uFF09\u3002\n *\n * \u62C6\u5206\u540E\u7684\u7F16\u6392\u5C42\uFF1A\u6301\u6709\u5168\u90E8\u72B6\u6001\u4E0E\u64CD\u4F5C\uFF0C\u6309\u9875\u7B7E\u6E32\u67D3\u9876\u680F\uFF08TopBar\uFF09\u4E0E\u4E3B\u533A\n * \uFF08SkillsView / McpView\uFF09\uFF0C\u5E76\u7EDF\u7BA1\u4E8C\u7EA7\u5F39\u7A97\uFF08\u6DFB\u52A0\u6280\u80FD\u3001\u65B0\u5EFA\u6280\u80FD\u5305\u3001\u8BBE\u7F6E\u5206\u7C7B\u3001\n * \u5220\u9664\u786E\u8BA4\u3001\u6587\u4EF6\u67E5\u770B\u5668\u3001\u5F52\u5165\u6280\u80FD\u5305\uFF09\u4E0E\u53F3\u4E0B\u89D2\u64CD\u4F5C\u56DE\u6267\u3002\n *\n * \u6570\u636E\u5168\u90E8\u8D70 /api/skill-manager\u3001/api/skill-toggles\u3001/api/skill-health\u3001\n * /api/triad/mcp-* \u3002\u62C6\u5206\u53EA\u79FB\u52A8\u4EE3\u7801\uFF0C\u672A\u6539\u52A8 DOM \u7ED3\u6784\u4E0E\u7C7B\u540D\u3002\n */\nimport { useEffect, useRef, useState, type CSSProperties, type DragEvent, type FormEvent } from 'react'\nimport {\n Button, IconChevronDownOutlineRegular, IconFolderOpenOutlineRegular, Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { PshBody, PopoverShell, type PopoverAnchor } from '../popover-shell'\nimport { PromptView } from '../prompt/PromptView'\nimport { skillApi } from './api.js'\nimport { collectEntry, fileToBase64 } from './files.js'\nimport { GuidePanel } from './GuidePanel.js'\nimport { CloudUpIcon } from './icons.js'\nimport { skillT } from './locales.js'\nimport { McpAddModal } from './McpAddModal.js'\nimport { McpView } from './McpView.js'\nimport {\n MCP_TOOL_WATCH_INTERVAL_MS, MCP_TOOL_WATCH_TIMEOUT_MS, mcpRegisteredToolCountOf, useMcpLiveState,\n} from './mcp-live.js'\nimport { CategoryEditor } from './SkillCard.js'\nimport { SkillViewer, VIEWER_FONT_SIZES, readViewerPrefs, writeViewerPrefs } from './SkillViewer.js'\nimport { SkillsView } from './SkillsView.js'\nimport { css, ensureStyles } from './styles.js'\nimport { McpTopBar, PanelHead, SkillTopBar } from './TopBar.js'\nimport { ALL_PRESETS, UNCATEGORIZED, sortCategories } from './types.js'\nimport type {\n BundleInfo, CollectedFile, ConfirmState, HealthView, InstallState, PanelState, PresetRow, SkillInfo, ViewerState,\n} from './types.js'\nconst SKILL_NAME_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/\n\n/** \u4ECE SKILL.md \u6587\u672C\u91CC\u53D6 frontmatter \u7684 name\uFF08\u5B89\u88C5\u5F39\u7A97\u9884\u89C8\u771F\u5B9E\u6280\u80FD\u540D\u7528\uFF09\u3002 */\nfunction frontmatterName(text: string): string | null {\n const lines = text.split(/\\r?\\n/).slice(0, 80)\n if ((lines[0] ?? '').trim() !== '---') return null\n for (const line of lines.slice(1)) {\n if (line.trim() === '---') break\n const pair = /^\\s*name\\s*:\\s*(.+?)\\s*$/.exec(line)\n if (pair !== null) return (pair[1] ?? '').replace(/^[\"']|[\"']$/g, '')\n }\n return null\n}\nexport function SkillsPanel({ onClose, closing = false, anchor = null, onCardMouseEnter, onCardMouseLeave }: { onClose: () => void; closing?: boolean; anchor?: PopoverAnchor | null; onCardMouseEnter?: () => void; onCardMouseLeave?: () => void }): JSX.Element {\n ensureStyles()\n const [state, setState] = useState<PanelState>({ status: 'loading' })\n const [reload, setReload] = useState(0)\n // \u5206\u533A\u5C55\u5F00\u96C6\u5408\uFF1A\u9ED8\u8BA4\u7A7A = \u5168\u90E8\u6536\u8D77\uFF08\u9762\u677F\u6253\u5F00\u65F6\u53EA\u663E\u793A\u6280\u80FD\u5305\u6807\u9898\u884C\uFF09\u3002\n const [expanded, setExpanded] = useState<Set<string>>(new Set())\n // \u6563\u88C5\u6280\u80FD\u533A\u5C55\u5F00\u3002\n const [looseOpen, setLooseExpanded] = useState(false)\n const [viewer, setViewer] = useState<ViewerState | null>(null)\n /** \u67E5\u770B\u5668\u504F\u597D\uFF1A\u5B57\u53F7\u6863\u4F4D + \u662F\u5426\u5168\u5C4F\uFF08localStorage \u6301\u4E45\u5316\uFF0C\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\uFF09\u3002 */\n const [viewerFont, setViewerFont] = useState<number>(() => readViewerPrefs().font)\n const [viewerFull, setViewerFull] = useState<boolean>(() => readViewerPrefs().full)\n const [assignTarget, setAssignTarget] = useState<SkillInfo | null>(null)\n const [newBundleOpen, setNewBundleOpen] = useState(false)\n const [newBundleName, setNewBundleName] = useState('')\n /** \u65B0\u5EFA\u6280\u80FD\u5305\u5F39\u7A97\u91CC\u540C\u65F6\u6302\u7684\u5206\u7C7B\u3002 */\n const [newBundleCats, setNewBundleCats] = useState<string[]>([])\n const [creatingBundle, setCreatingBundle] = useState(false)\n const [renameTarget, setRenameTarget] = useState<{ bundleId: string; name: string } | null>(null)\n const [renaming, setRenaming] = useState(false)\n // \u6539\u540D\u6210\u529F\u7684\u5361\u7247 id\uFF1A\u89E6\u53D1\u4E00\u6B21\u9AD8\u4EAE\u8109\u51B2\uFF0C\u968F\u540E\u81EA\u52A8\u6E05\u9664\u3002\n const [renamedFlash, setRenamedFlash] = useState<string | null>(null)\n const renamedTimer = useRef<number | null>(null)\n const [confirm, setConfirm] = useState<ConfirmState | null>(null)\n const [confirming, setConfirming] = useState(false)\n const [install, setInstall] = useState<InstallState | null>(null)\n /** \u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\u5F00\u5173\uFF08\u9009\u5B8C\u6587\u4EF6\u540E\u540C\u4E00\u5F39\u7A97\u5185\u586B\u8868\u5355\uFF09\u3002 */\n const [addOpen, setAddOpen] = useState(false)\n const [installName, setInstallName] = useState('')\n const [installDescription, setInstallDescription] = useState('')\n const [installBundleId, setInstallBundleId] = useState<string | undefined>(undefined)\n const [installing, setInstalling] = useState(false)\n const [installError, setInstallError] = useState<string | null>(null)\n /**\n * \u9762\u677F\u7EA7\u63D0\u793A\u6761\u3002\u65E7\u5B9E\u73B0\u628A\u6240\u6709\u5931\u8D25\u90FD\u585E\u8FDB installError\uFF0C\u800C\u5B83\u53EA\u5728\u300C\u6DFB\u52A0\u6280\u80FD\u300D\u5F39\u7A97\u91CC\n * \u6E32\u67D3 \u2014\u2014 \u4E8E\u662F\u5220\u9664\u6280\u80FD\u3001\u5F52\u7EC4\u3001\u6539\u540D\u3001\u5F00\u5173\u5931\u8D25\u65F6\u9762\u677F\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u663E\u793A\uFF0C\u7528\u6237\u53EA\u770B\u5230\n * \u300C\u70B9\u4E86\u6CA1\u53CD\u5E94\u300D\u3002\u6210\u8D25\u53CD\u9988\u7EDF\u4E00\u8D70\u8FD9\u91CC\u3002\n */\n const [toasts, setToasts] = useState<Array<{ id: number; tone: 'ok' | 'err'; text: string }>>([])\n const toastTimers = useRef<number[]>([])\n const pushToast = (tone: 'ok' | 'err', text: string): void => {\n const id = Date.now() + Math.random()\n setToasts((current) => [...current.slice(-2), { id, tone, text }])\n const timer = window.setTimeout(() => {\n setToasts((current) => current.filter((item) => item.id !== id))\n }, tone === 'err' ? 6400 : 2800)\n toastTimers.current.push(timer)\n }\n /** \u7EDF\u4E00\u5931\u8D25\u63D0\u793A\uFF1Alabel \u8BF4\u6E05\u662F\u54EA\u4E00\u6B65\uFF0Cmessage \u7528 host \u539F\u6587\u3002 */\n const failToast = (label: string, error: unknown): void => {\n pushToast('err', skillT('opFailed', { label, message: error instanceof Error ? error.message : String(error) }))\n }\n /** \u6587\u4EF6\u5939\u5BFC\u5165\u65F6 SKILL.md \u91CC\u5199\u7684\u6280\u80FD\u540D\uFF1A\u4E0E\u7528\u6237\u586B\u7684\u540D\u5B57\u4E0D\u4E00\u81F4\u65F6\u63D0\u524D\u8BF4\u660E\u4F1A\u6539\u5199\u3002 */\n const [installMetaName, setInstallMetaName] = useState<string | null>(null)\n useEffect(() => {\n if (install === null || install.archive === true) { setInstallMetaName(null); return undefined }\n const entry = install.files.find((item) => item.path === 'SKILL.md')\n if (entry === undefined) { setInstallMetaName(null); return undefined }\n let current = true\n void entry.file.text().then((text) => {\n if (!current) return\n setInstallMetaName(frontmatterName(text))\n }, () => { if (current) setInstallMetaName(null) })\n return () => { current = false }\n }, [install])\n const [dropActive, setDropActive] = useState(false)\n const fileInput = useRef<HTMLInputElement>(null)\n // \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\u72B6\u6001\uFF08skillName \u2192 enabled\uFF1BbundleId \u2192 enabled\uFF09\n const [toggles, setToggles] = useState<{ skills: Record<string, boolean>; bundles: Record<string, boolean> }>({ skills: {}, bundles: {} })\n // \u5207\u6362\u8FDB\u884C\u4E2D\u7684 key\uFF08\u907F\u514D\u91CD\u590D\u70B9\u51FB\uFF09\n const [toggling, setToggling] = useState<Set<string>>(new Set())\n // Agent \u9884\u8BBE\u5206\u7C7B\uFF1A\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5F53\u524D\u9009\u4E2D\u7684\u9884\u8BBE\uFF08'*' = \u5168\u90E8 Agent\uFF09\n const [presets, setPresets] = useState<PresetRow[]>([])\n const [overrides, setOverrides] = useState<Record<string, Record<string, boolean>>>({})\n const [activePreset, setActivePreset] = useState<string>(ALL_PRESETS)\n // Skills Hub \u5DE5\u5177\u680F\uFF1A\u641C\u7D22\u8BCD / \u6765\u6E90\u7B5B\u9009(\u5168\u90E8=all|bundles|loose) / \u540D\u79F0\u6392\u5E8F / \u89C6\u56FE\u5207\u6362\n const [query, setQuery] = useState('')\n const [sourceFilter, setSourceFilter] = useState<'all' | 'bundles' | 'loose'>('all')\n const [sortAsc, setSortAsc] = useState(true)\n const [viewMode] = useState<'grid' | 'list'>('grid')\n /** \u5DE6\u680F\u5206\u7C7B / \u7B5B\u9009\uFF1A\u542F\u7528\u72B6\u6001 + Agent \u9884\u8BBE\uFF08\u5206\u7C7B\u5207\u6362\u7531\u5DE6\u680F\u300CAgent \u9884\u8BBE\u5206\u7C7B\u300D\u9A71\u52A8\uFF09\u3002 */\n const [statusFilter, setStatusFilter] = useState<'all' | 'on' | 'off'>('all')\n /** \u6280\u80FD\u5305\u5206\u7C7B\u7B5B\u9009\uFF1Anull = \u4E0D\u7B5B\uFF1B\u5206\u7C7B\u540D\u6216 UNCATEGORIZED = \u53EA\u770B\u8BE5\u7C7B\u3002 */\n const [catFilter, setCatFilter] = useState<string | null>(null)\n /** \u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u5F39\u7A97\u7684\u76EE\u6807\u5305\uFF08null = \u5173\uFF09\uFF1BcatDraft \u662F\u5F39\u7A97\u5185\u7684\u7F16\u8F91\u526F\u672C\u3002 */\n const [catTarget, setCatTarget] = useState<{ bundleId: string; name: string } | null>(null)\n const [catDraft, setCatDraft] = useState<string[]>([])\n const [savingCats, setSavingCats] = useState(false)\n /** \u81EA\u5B9A\u4E49\u4E0B\u62C9/\u83DC\u5355\uFF1A\u6765\u6E90\u7B5B\u9009 / Agent \u9884\u8BBE / \u540D\u79F0\u6392\u5E8F / \u5FEB\u6377\u7B5B\u9009 / \u884C\u5185\u66F4\u591A\u83DC\u5355\uFF08\u54EA\u4E2A\u5F00\u7740\uFF0Cnull = \u90FD\u5173\uFF09\u3002 */\n const [openMenu, setOpenMenu] = useState<string | null>(null)\n /** \u540C\u6B65\u72B6\u6001\uFF1A/api/skill-health \u53EA\u8BFB\u626B\u63CF\u7ED3\u679C\uFF08\u7F3A SKILL.md \u7B49\uFF09\u3002 */\n const [health, setHealth] = useState<HealthView>({ state: 'loading' })\n /** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5F39\u7A97\u5F00\u5173\u3002 */\n const [guideOpen, setGuideOpen] = useState(false)\n /** \u5DE6\u4FA7\u9876\u5C42 tab\uFF1ASKILL\uFF08\u6280\u80FD\u7BA1\u7406\uFF09/ MCP\uFF08MCP Server\uFF09\u3002 */\n const [kind, setKind] = useState<'skill' | 'mcp' | 'prompt'>('skill')\n /** MCP \u9875\u8303\u56F4\uFF08'' = \u5168\u90E8 Agent\uFF09\u3002 */\n const [mcpScope, setMcpScope] = useState('')\n /** MCP Server \u641C\u7D22\u8BCD\u3002 */\n const [mcpQuery, setMcpQuery] = useState('')\n /** MCP \u542F\u7528\u72B6\u6001\u7B5B\u9009\uFF08\u4F5C\u7528\u4E8E\u5168\u5C40\u6761\u76EE\uFF09\u3002 */\n const [mcpStatusFilter, setMcpStatusFilter] = useState<'all' | 'on' | 'off'>('all')\n /** \u771F\u5B9E MCP \u6CE8\u518C\u72B6\u6001\uFF08/api/triad/mcp-status\uFF09\uFF1AMCP \u9875\u552F\u4E00\u6570\u636E\u6E90\u3002 */\n const [mcpLive, mcpRefreshLive] = useMcpLiveState()\n /** \u6DFB\u52A0 MCP Server\uFF08\u7C98\u8D34 JSON / YAML\uFF09\u5F39\u7A97\u5F00\u5173\u3002 */\n const [mcpAddOpen, setMcpAddOpen] = useState(false)\n /** \u6DFB\u52A0\u300C\u9884\u8BBE\u4E13\u5C5E Server\u300D\u5F39\u7A97\u5F00\u5173\uFF08\u6309\u94AE\u5728 MCP \u9876\u680F\uFF0C\u5F39\u7A97\u7531 McpView \u6E32\u67D3\uFF09\u3002 */\n const [mcpAddOwnOpen, setMcpAddOwnOpen] = useState(false)\n /* \u2500\u2500 \u6DFB\u52A0/\u542F\u7528\u540E\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * \u5199\u914D\u7F6E\u53EA\u662F\u8BA9 DSH \u70ED\u91CD\u8F7D\u90A3\u4E00\u884C\uFF1BMCP \u8FDB\u7A0B\u8981\u665A\u51E0\u79D2\u624D\u8FDE\u4E0A\u5E76\u6CE8\u518C\u5DE5\u5177\u3002\n * \u4E4B\u524D\u53EA\u5237\u65B0\u4E00\u6B21 \u2192 \u9762\u677F\u4E0A Server \u6709\u4E86\u4F46\u5DE5\u5177\u662F\u7A7A\u7684\uFF0C\u7528\u6237\u8FD8\u5F97\u81EA\u5DF1\u70B9\u300C\u5237\u65B0\u300D\u3002\n * \u8FD9\u91CC\u6309 2s \u8F6E\u8BE2\uFF0C\u76EE\u6807\u90FD\u62A5\u51FA\u5DE5\u5177\uFF08\u6216 90s \u8D85\u65F6\uFF09\u5C31\u6536\u5DE5\u3002 */\n const mcpWatchTimer = useRef<number | null>(null)\n const [mcpWaitingTools, setMcpWaitingTools] = useState<string[]>([])\n /** \u6700\u65B0\u72B6\u6001\u5FEB\u7167\uFF1A\u5B9A\u65F6\u5668\u56DE\u8C03\u91CC\u8BFB\u4E0D\u5230\u65B0\u7684\u95ED\u5305\u503C\u3002 */\n const mcpLiveRef = useRef(mcpLive)\n useEffect(() => { mcpLiveRef.current = mcpLive }, [mcpLive])\n const stopMcpWatch = (): void => {\n if (mcpWatchTimer.current !== null) {\n window.clearInterval(mcpWatchTimer.current)\n mcpWatchTimer.current = null\n }\n setMcpWaitingTools([])\n }\n /** \u7ACB\u5373\u5237\u65B0\u4E00\u6B21\uFF0C\u7136\u540E\u8F6E\u8BE2\u5230\u8FD9\u4E9B Server \u6CE8\u518C\u51FA\u5DE5\u5177\u4E3A\u6B62\uFF08\u8D85\u65F6/\u5168\u90E8\u5C31\u7EEA\u5373\u505C\uFF09\u3002 */\n const watchMcpTools = (names: string[]): void => {\n if (mcpWatchTimer.current !== null) {\n window.clearInterval(mcpWatchTimer.current)\n mcpWatchTimer.current = null\n }\n mcpRefreshLive()\n const pending = new Set(names.filter(name => name !== ''))\n if (pending.size === 0) { setMcpWaitingTools([]); return }\n setMcpWaitingTools([...pending])\n const startedAt = Date.now()\n mcpWatchTimer.current = window.setInterval(() => {\n const snapshot = mcpLiveRef.current\n if (snapshot.state === 'ready') {\n for (const name of [...pending]) {\n if (mcpRegisteredToolCountOf(snapshot.data, name) > 0) pending.delete(name)\n }\n setMcpWaitingTools([...pending])\n }\n if (pending.size === 0 || Date.now() - startedAt > MCP_TOOL_WATCH_TIMEOUT_MS) stopMcpWatch()\n else mcpRefreshLive()\n }, MCP_TOOL_WATCH_INTERVAL_MS)\n }\n\n const refresh = (): void => {\n setReload((value) => value + 1)\n }\n\n /** \u9759\u9ED8\u540C\u6B65\uFF1A\u4E0D\u7F6E loading\uFF0C\u76F4\u63A5\u66FF\u6362\u6570\u636E\uFF08\u81EA\u52A8\u540C\u6B65\u673A\u5236\u7528\uFF09\u3002 */\n const silentSync = (): void => {\n void skillApi.list().then((snapshot) => {\n setState((current) => current.status === 'error'\n ? current\n : { status: 'ready', snapshot })\n }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n void skillApi.presetStatus().then(\n (status) => {\n setToggles({ skills: status.skills, bundles: status.bundles })\n setOverrides(status.overrides)\n setPresets(status.presets)\n },\n () => {\n void skillApi.toggleStatus().then((status) => { setToggles(status) }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n },\n )\n void skillApi.health().then(\n (report) => { setHealth(report.ok ? { state: 'ok', report } : { state: 'issue', report }) },\n () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ },\n )\n }\n\n /** \u81EA\u52A8\u540C\u6B65\u673A\u5236\uFF1A\u9762\u677F\u6253\u5F00\u671F\u95F4 30s \u8F6E\u8BE2 + \u9875\u9762\u91CD\u65B0\u53EF\u89C1/\u805A\u7126\u7ACB\u5373\u5237\u65B0\uFF08\u4E0D\u95EA\u70C1\uFF09\u3002 */\n useEffect(() => {\n const timer = window.setInterval(silentSync, 30_000)\n const onVis = (): void => { if (document.visibilityState === 'visible') silentSync() }\n const onFocus = (): void => { silentSync() }\n document.addEventListener('visibilitychange', onVis)\n window.addEventListener('focus', onFocus)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', onVis)\n window.removeEventListener('focus', onFocus)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n /** \u5F00\u5173\u5207\u6362\u540E\u9759\u9ED8\u540C\u6B65:\u53EA\u91CD\u62C9\u5F00\u5173\u72B6\u6001,\u4E0D\u91CD\u8F7D\u6574\u4E2A\u9762\u677F(\u907F\u514D\u95EA\u70C1)\u3002 */\n const refreshTogglesOnly = (): void => {\n void skillApi.presetStatus().then(\n (status) => {\n setToggles({ skills: status.skills, bundles: status.bundles })\n setOverrides(status.overrides)\n setPresets(status.presets)\n },\n () => {\n // \u9884\u8BBE\u63A5\u53E3\u4E0D\u53EF\u7528\uFF08\u8001 host\uFF09\u65F6\u9000\u56DE\u53EA\u8BFB\u5168\u5C40\u5C42\u72B6\u6001\u3002\n void skillApi.toggleStatus().then((status) => { setToggles(status) }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n },\n )\n }\n\n const t = skillT\n\n useEffect(() => {\n let current = true\n setState({ status: 'loading' })\n void skillApi.list().then(\n (snapshot) => {\n if (current) setState({ status: 'ready', snapshot })\n },\n () => {\n if (current) setState({ status: 'error' })\n },\n )\n void skillApi.presetStatus().then(\n (status) => {\n if (!current) return\n setToggles({ skills: status.skills, bundles: status.bundles })\n setOverrides(status.overrides)\n setPresets(status.presets)\n },\n () => {\n // \u9884\u8BBE\u63A5\u53E3\u4E0D\u53EF\u7528\u65F6\u9000\u5316\u4E3A\u300C\u53EA\u6709\u5168\u5C40\u5C42\u300D\uFF1A\u5706\u7403\u6761\u53EA\u5269\u300C\u5168\u90E8 Agent\u300D\u3002\n void skillApi.toggleStatus().then(\n (status) => { if (current) setToggles(status) },\n () => { /* \u5F00\u5173\u63A5\u53E3\u4E5F\u4E0D\u53EF\u7528\u65F6\u4FDD\u6301\u7A7A\u72B6\u6001\uFF08\u5F00\u5173\u4ECD\u53EF\u64CD\u4F5C,\u5931\u8D25\u4F1A\u63D0\u793A\uFF09\u3002 */ },\n )\n },\n )\n // \u540C\u6B65\u72B6\u6001\uFF1A\u53EA\u8BFB\u5065\u5EB7\u626B\u63CF\uFF08\u76EE\u5F55\u5B8C\u6574\u6027 + \u8D26\u672C\u60AC\u6302\u5F15\u7528\uFF09\u3002\n setHealth({ state: 'loading' })\n void skillApi.health().then(\n (report) => { if (current) setHealth(report.ok ? { state: 'ok', report } : { state: 'issue', report }) },\n () => { if (current) setHealth({ state: 'unavailable' }) },\n )\n return () => { current = false }\n // reload \u62C6\u5206\u4E3A\u53D8\u5316\u952E\uFF1Bopen \u6052 true\uFF08\u672C\u7EC4\u4EF6\u5728\u6253\u5F00\u65F6\u624D\u6E32\u67D3\uFF09\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [reload])\n\n // \u5378\u8F7D\u65F6\u6E05\u6389\u6539\u540D\u9AD8\u4EAE\u4E0E\u63D0\u793A\u6761\u5B9A\u65F6\u5668\uFF0C\u907F\u514D\u5378\u8F7D\u540E setState\u3002\n useEffect(() => () => {\n if (renamedTimer.current !== null) window.clearTimeout(renamedTimer.current)\n if (mcpWatchTimer.current !== null) window.clearInterval(mcpWatchTimer.current)\n for (const timer of toastTimers.current) window.clearTimeout(timer)\n }, [])\n\n /** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u6D6E\u5C42\u7684\u4F4D\u7F6E\uFF1A\u8D34\u7740\u9762\u677F\u5361\u7247\u53F3\u7F18\u5185\u4FA7\uFF08\u9762\u677F\u94FA\u6EE1\u4E3B\u533A\uFF0C\u5916\u4FA7\u5DF2\u65E0\u7A7A\u95F4\uFF09\u3002 */\n const [guidePos, setGuidePos] = useState<{ left: number; top: number; height: number } | null>(null)\n useEffect(() => {\n if (!guideOpen) return\n const marker = document.querySelector('[data-skm-panel-marker]')\n const card = marker?.closest('.psh-card')\n if (!(card instanceof HTMLElement)) return\n const rect = card.getBoundingClientRect()\n const vh = window.innerHeight\n const top = Math.max(8, rect.top)\n const overlayW = 300\n setGuidePos({\n left: Math.max(rect.left + 12, rect.right - overlayW - 12),\n top,\n height: Math.min(rect.height, vh - top - 12),\n })\n }, [guideOpen])\n\n const runToggle = async (key: string, action: () => Promise<unknown>): Promise<void> => {\n if (toggling.has(key)) return\n setToggling((current) => new Set(current).add(key))\n setInstallError(null)\n try {\n await action()\n // \u5F00\u5173\u53EA\u6539 frontmatter,\u6280\u80FD\u5217\u8868\u7ED3\u6784\u4E0D\u53D8:\u9759\u9ED8\u540C\u6B65\u5373\u53EF,\u4E0D\u91CD\u8F7D\u9762\u677F\u3002\n refreshTogglesOnly()\n } catch (error) {\n pushToast('err', skillT('toggleFailed', { message: error instanceof Error ? error.message : String(error) }))\n } finally {\n setToggling((current) => {\n const next = new Set(current)\n next.delete(key)\n return next\n })\n }\n }\n\n const toggleSkill = (skill: SkillInfo, enabled: boolean): void => {\n if (activePreset === ALL_PRESETS) {\n void runToggle(`skill:${skill.name}`, () => skillApi.setSkillEnabled(skill.name, enabled))\n return\n }\n void runToggle(\n `skill:${skill.name}`,\n () => skillApi.setPresetSkillEnabled(activePreset, skill.name, enabled),\n )\n }\n\n const toggleBundle = (bundle: BundleInfo, enabled: boolean): void => {\n if (activePreset === ALL_PRESETS) {\n void runToggle(`bundle:${bundle.id}`, () => skillApi.setBundleEnabled(bundle.id, enabled))\n return\n }\n void runToggle(\n `bundle:${bundle.id}`,\n () => skillApi.setPresetBundleEnabled(activePreset, bundle.id, enabled),\n )\n }\n\n /** \u8BE5\u9884\u8BBE\u4E0B\u88AB\u5355\u72EC\u5173\u6389\u7684\u6280\u80FD\uFF08'*' \u89C6\u56FE\u4E0B\u4E3A\u7A7A\u8868\uFF09\u3002 */\n const presetOverride = activePreset === ALL_PRESETS ? {} : (overrides[activePreset] ?? {})\n\n /**\n * \u4EFB\u4E00\u9884\u8BBE\u4E0B\u6280\u80FD\u7684\u5F00\u5173\u503C\uFF08\u4E0E skillEnabledIn \u540C\u89C4\u5219\uFF0C\u4F9B\u5DE6\u680F\u5206\u7C7B\u8BA1\u6570\uFF09\u3002\n * - \u300C\u5168\u90E8 Agent\u300D\uFF1A\u76F4\u63A5\u8BFB\u5168\u5C40\u5C42\uFF08SKILL.md frontmatter\uFF09\uFF1B\n * - \u67D0\u4E2A\u9884\u8BBE\uFF1A\u5168\u5C40\u5C42\u5173\u6389\u7684\u4ECD\u663E\u793A\u4E3A\u5173\uFF08\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00\u5168\u5C40\u5173\u6389\u7684\u6280\u80FD\uFF09\uFF0C\n * \u5426\u5219\u770B\u8BE5\u9884\u8BBE\u662F\u5426\u6709 false \u8986\u76D6\u3002\n */\n const skillEnabledAt = (presetId: string, name: string): boolean => {\n if (toggles.skills[name] === false) return false\n if (presetId === ALL_PRESETS) return true\n return (overrides[presetId] ?? {})[name] !== false\n }\n\n /** \u67D0\u9884\u8BBE\u4E0B\u5DF2\u542F\u7528\u7684\u6280\u80FD\u6570\uFF08\u5DE6\u680F\u300CAgent \u9884\u8BBE\u5206\u7C7B\u300D\u8BA1\u6570\uFF09\u3002 */\n const enabledCountFor = (presetId: string): number => {\n let n = 0\n for (const bundle of bundles) for (const skill of bundle.skills) if (skillEnabledAt(presetId, skill.name)) n += 1\n for (const skill of loose) if (skillEnabledAt(presetId, skill.name)) n += 1\n return n\n }\n\n /**\n * \u5F53\u524D\u89C6\u56FE\u91CC\u4E00\u4E2A\u6280\u80FD\u7684\u5F00\u5173\u503C\u3002\n * - \u300C\u5168\u90E8 Agent\u300D\uFF1A\u76F4\u63A5\u8BFB\u5168\u5C40\u5C42\uFF08SKILL.md frontmatter\uFF09\uFF1B\n * - \u67D0\u4E2A\u9884\u8BBE\uFF1A\u5168\u5C40\u5C42\u5173\u6389\u7684\u4ECD\u663E\u793A\u4E3A\u5173\uFF08\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00\u5168\u5C40\u5173\u6389\u7684\u6280\u80FD\uFF09\uFF0C\n * \u5426\u5219\u770B\u8BE5\u9884\u8BBE\u662F\u5426\u6709 false \u8986\u76D6\u3002\n */\n const skillEnabledIn = (name: string): boolean => skillEnabledAt(activePreset, name)\n\n /** \u6280\u80FD\u5305\u5728\u5F53\u524D\u89C6\u56FE\u4E0B\u7684\u5F00\u5173\u503C\uFF1A\u5185\u90E8\u6280\u80FD\u5168\u5F00\u624D\u7B97\u5F00\u3002 */\n const bundleEnabledIn = (bundle: BundleInfo): boolean => {\n if (activePreset === ALL_PRESETS) return toggles.bundles[bundle.id] !== false\n return bundle.skills.every((skill) => skillEnabledIn(skill.name))\n }\n\n /** \u9884\u8BBE\u89C6\u56FE\u4E0B\uFF0C\u88AB\u5168\u5C40\u5C42\u7981\u7528\u7684\u6280\u80FD\u884C\u9501\u4F4F\u5F00\u5173\uFF08\u9884\u8BBE\u5C42\u53EA\u80FD\u6536\u7A84\uFF0C\u65E0\u6CD5\u6253\u5F00\uFF09\u3002 */\n const skillLockedReason = (name: string): string | undefined =>\n activePreset !== ALL_PRESETS && toggles.skills[name] === false ? t('presetLockedByGlobal') : undefined\n\n /** \u6E05\u7A7A\u5F53\u524D\u9884\u8BBE\u7684\u5168\u90E8\u5355\u72EC\u8BBE\u7F6E\u3002 */\n const resetActivePreset = (): void => {\n if (activePreset === ALL_PRESETS) return\n void runToggle(`reset:${activePreset}`, () => skillApi.resetPreset(activePreset))\n }\n\n const toggleExpanded = (bundleId: string): void => {\n setExpanded((current) => {\n const next = new Set(current)\n if (next.has(bundleId)) next.delete(bundleId)\n else next.add(bundleId)\n return next\n })\n }\n\n // Skills Hub \u9ED8\u8BA4\u5168\u5C55\u5F00\uFF08\u53C2\u8003\u56FE\u6574\u9875\u53EF\u89C1\uFF09\uFF1B\u7528\u6237\u624B\u52A8\u6536\u8D77\u540E\u4FDD\u6301\u5404\u81EA\u72B6\u6001\u3002\n\n const loadViewerContent = async (skillName: string, filePath: string): Promise<void> => {\n try {\n const res = await fetch(`/api/skill-manager/skills/${encodeURIComponent(skillName)}/files/${encodeURIComponent(filePath)}`)\n const body = await res.json() as { error?: unknown; content?: unknown }\n if (body.error !== undefined) throw new Error(String(body.error))\n setViewer((v) => v === null ? v : { ...v, loading: false, content: (body.content ?? '') as string })\n } catch (error) {\n setViewer((v) => v === null ? v : { ...v, loading: false, error: error instanceof Error ? error.message : String(error) })\n }\n }\n\n const openViewer = (skill: SkillInfo): void => {\n setViewer({ skill, file: 'SKILL.md', loading: true })\n void loadViewerContent(skill.name, 'SKILL.md')\n }\n\n /** \u5207\u5B57\u53F7\u6863\u4F4D\uFF08\u5939\u5230\u5408\u6CD5\u533A\u95F4\uFF09\u3002 */\n const setViewerFontLevel = (level: number): void => {\n setViewerFont(Math.min(Math.max(level, 0), VIEWER_FONT_SIZES.length - 1))\n }\n\n /** \u5168\u5C4F / \u8FD8\u539F\uFF1A\u5F39\u7A97\u5BBD\u9AD8\u8D70 CSS \u8FC7\u6E21\uFF0C\u4E0D\u91CD\u6302\u5185\u5BB9\uFF0C\u6EDA\u52A8\u4F4D\u7F6E\u4FDD\u6301\u3002 */\n const toggleViewerFull = (): void => {\n setViewerFull((current) => !current)\n }\n\n // \u504F\u597D\u7EDF\u4E00\u5728\u8FD9\u91CC\u843D\u76D8\uFF1A\u8FDE\u70B9\u4E24\u4E2A\u63A7\u4EF6\u65F6\uFF0C\u4E8B\u4EF6\u56DE\u8C03\u8BFB\u5230\u7684\u662F\u540C\u4E00\u5E27\u7684\u65E7\u95ED\u5305\u503C\uFF0C\n // \u5206\u5F00\u5199\u4F1A\u628A\u5176\u4E2D\u4E00\u9879\u5B58\u6210\u65E7\u503C\u3002\n useEffect(() => { writeViewerPrefs({ font: viewerFont, full: viewerFull }) }, [viewerFont, viewerFull])\n\n const selectViewerFile = (filePath: string): void => {\n if (viewer === null) return\n setViewer({ ...viewer, file: filePath, loading: true, error: undefined })\n void loadViewerContent(viewer.skill.name, filePath)\n }\n\n const doAssign = async (skill: SkillInfo, bundleId: string): Promise<void> => {\n try {\n if (state.status !== 'ready') return\n const bundle = state.snapshot.bundles.find((candidate) => candidate.id === bundleId)\n if (bundle === undefined) throw new Error('bundle not found')\n await skillApi.setBundleSkills(bundleId, [...bundle.skills.map((s) => s.name), skill.name])\n setAssignTarget(null)\n pushToast('ok', skillT('assignOk', { name: skill.name }))\n refresh()\n } catch (error) {\n failToast('\u5F52\u5165\u6280\u80FD\u5305', error)\n }\n }\n\n const acceptFiles = (files: File[] | null): void => {\n if (files === null || files.length === 0) return\n const collected: CollectedFile[] = []\n for (const file of files) {\n const relative = file.webkitRelativePath\n if (relative === '') continue\n const parts = relative.split('/')\n if (parts.length < 2) continue\n collected.push({ path: parts.slice(1).join('/'), file })\n }\n if (collected.length === 0) return\n const zipCandidate = collected.length === 1 && collected[0].path.toLowerCase().endsWith('.zip') ? collected[0] : undefined\n if (zipCandidate !== undefined) {\n const reader = new FileReader()\n reader.onload = () => {\n const data = String(reader.result ?? '').split(',')[1] ?? ''\n setInstall({ archive: true, name: zipCandidate.path, data, folderName: zipCandidate.path })\n setInstallError(null)\n setAddOpen(true)\n }\n reader.readAsDataURL(zipCandidate.file)\n return\n }\n const rootName = collected[0]?.path.split('/')[0] ?? ''\n setInstallName(rootName)\n setInstallError(null)\n setInstall({ files: collected, folderName: rootName })\n setAddOpen(true)\n }\n\n const onDrop = async (event: DragEvent<HTMLDivElement>): Promise<void> => {\n event.preventDefault()\n setDropActive(false)\n const collected: CollectedFile[] = []\n const items = event.dataTransfer.items\n if (items === undefined) return\n const pending: Array<Promise<void>> = []\n for (const item of Array.from(items)) {\n const entry = item.webkitGetAsEntry?.()\n if (entry !== undefined && entry !== null) pending.push(collectEntry(entry, '', collected))\n }\n await Promise.all(pending)\n if (collected.length === 0) return\n const zipCandidate = collected.length === 1 && collected[0].path.toLowerCase().endsWith('.zip') ? collected[0] : undefined\n if (zipCandidate !== undefined) {\n setInstall({ archive: true, name: zipCandidate.path, data: await fileToBase64(zipCandidate.file), folderName: zipCandidate.path })\n setInstallError(null)\n setAddOpen(true)\n return\n }\n const rootName = collected[0]?.path.split('/')[0] ?? ''\n setInstallName(rootName)\n setInstallError(null)\n setInstall({ files: collected, folderName: rootName })\n setAddOpen(true)\n }\n\n const confirmInstall = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n if (install === null || installing) return\n if (install.archive !== true && installName.trim() === '') return\n setInstalling(true)\n setInstallError(null)\n try {\n let installed: { name?: string } = {}\n if (install.archive === true) {\n installed = await skillApi.installSkill({\n archive: install.data,\n description: installDescription.trim(),\n ...installBundleId === undefined ? {} : { bundleId: installBundleId },\n })\n } else {\n const files = await Promise.all(install.files.map(async ({ path, file }) => ({\n path,\n data: await fileToBase64(file),\n })))\n installed = await skillApi.installSkill({\n skillName: installName.trim(),\n description: installDescription.trim(),\n ...installBundleId === undefined ? {} : { bundleId: installBundleId },\n files,\n })\n }\n // \u540D\u5B57\u4EE5 host \u843D\u5730\u7684\u89C4\u8303\u540D\u4E3A\u51C6\uFF1A\u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4E0D\u4E00\u81F4\u65F6\uFF0C\u7528\u6237\u770B\u5F97\u5230\u88C5\u6210\u4E86\u4EC0\u4E48\u3002\n pushToast('ok', skillT('installedOk', { name: installed.name ?? installName.trim() }))\n setInstall(null)\n setInstallName('')\n setInstallDescription('')\n setInstallBundleId(undefined)\n setAddOpen(false)\n refresh()\n } catch (error) {\n setInstallError(error instanceof Error ? error.message : String(error))\n } finally {\n setInstalling(false)\n }\n }\n\n const submitNewBundle = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n if (creatingBundle || newBundleName.trim() === '') return\n setCreatingBundle(true)\n try {\n const created = newBundleName.trim()\n await skillApi.createBundle(created, newBundleCats)\n setNewBundleName('')\n setNewBundleCats([])\n setNewBundleOpen(false)\n pushToast('ok', skillT('bundleCreated', { name: created }))\n refresh()\n } catch (error) {\n failToast('\u65B0\u5EFA\u6280\u80FD\u5305', error)\n } finally {\n setCreatingBundle(false)\n }\n }\n\n /** \u6253\u5F00\u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u5F39\u7A97\uFF1A\u8349\u7A3F\u4ECE\u5FEB\u7167\u91CC\u7684\u5F53\u524D\u503C\u8D77\u6B65\u3002 */\n const openCatEditor = (bundle: BundleInfo): void => {\n setCatTarget({ bundleId: bundle.id, name: bundle.name })\n setCatDraft([...(bundle.categories ?? [])])\n }\n\n /** \u4FDD\u5B58\u5206\u7C7B\uFF1APATCH \u53EA\u5E26 categories\uFF1B\u987A\u624B\u628A\u7B5B\u9009\u8DDF\u5230\u65B0\u503C\uFF0C\u907F\u514D\u6539\u5B8C\u5305\u300C\u6D88\u5931\u300D\u3002 */\n const submitCategories = async (): Promise<void> => {\n if (catTarget === null || savingCats) return\n setSavingCats(true)\n try {\n await skillApi.setBundleCategories(catTarget.bundleId, catDraft)\n if (activeCat !== null && !catDraft.includes(activeCat) && activeCat !== UNCATEGORIZED) setCatFilter(null)\n pushToast('ok', skillT('bundleCatSaved', { name: catTarget.name }))\n setCatTarget(null)\n refresh()\n } catch (error) {\n failToast('\u8BBE\u7F6E\u5206\u7C7B', error)\n } finally {\n setSavingCats(false)\n }\n }\n\n const submitRename = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n\n event.preventDefault()\n if (renaming || renameTarget === null || renameTarget.name.trim() === '') return\n setRenaming(true)\n try {\n await skillApi.renameBundle(renameTarget.bundleId, renameTarget.name.trim())\n // \u6539\u540D\u6210\u529F\u540E\u8BA9\u5361\u7247\u95EA\u4E00\u4E0B\u9AD8\u4EAE\uFF081600ms \u540E\u81EA\u52A8\u6E05\u9664\uFF09\u3002\n const renamedId = renameTarget.bundleId\n if (renamedTimer.current !== null) window.clearTimeout(renamedTimer.current)\n setRenamedFlash(renamedId)\n renamedTimer.current = window.setTimeout(() => { setRenamedFlash(null) }, 1600)\n setRenameTarget(null)\n refresh()\n } catch (error) {\n failToast('\u91CD\u547D\u540D\u6280\u80FD\u5305', error)\n } finally {\n setRenaming(false)\n }\n }\n\n const confirmDelete = async (): Promise<void> => {\n if (confirm === null || confirming) return\n setConfirming(true)\n const label = confirm.kind === 'bundle' ? confirm.bundle.name : confirm.name\n try {\n if (confirm.kind === 'bundle') await skillApi.deleteBundle(confirm.bundle.id)\n else await skillApi.deleteSkill(confirm.name)\n setConfirm(null)\n pushToast('ok', confirm.kind === 'bundle'\n ? skillT('bundleDeleted', { name: label })\n : skillT('deletedOk', { name: label }))\n refresh()\n } catch (error) {\n // \u65E7\u5B9E\u73B0\u628A\u5931\u8D25\u5199\u8FDB\u53EA\u5728\u5B89\u88C5\u5F39\u7A97\u91CC\u6E32\u67D3\u7684 installError\uFF1A\u5220\u9664\u5931\u8D25\u65F6\u9762\u677F\u4E0A\u6BEB\u65E0\u53CD\u5E94\u3002\n failToast(confirm.kind === 'bundle' ? '\u5220\u9664\u6280\u80FD\u5305' : '\u5220\u9664\u6280\u80FD', error)\n } finally {\n setConfirming(false)\n }\n }\n\n const removeFromBundle = async (bundleId: string, name: string): Promise<void> => {\n try {\n if (state.status !== 'ready') return\n const bundle = state.snapshot.bundles.find((candidate) => candidate.id === bundleId)\n if (bundle === undefined) return\n await skillApi.setBundleSkills(bundleId, bundle.skills.map((skill) => skill.name).filter((skillName) => skillName !== name))\n pushToast('ok', skillT('removedOk', { name }))\n refresh()\n } catch (error) {\n failToast('\u79FB\u51FA\u6280\u80FD\u5305', error)\n }\n }\n\n /** \u6E05\u7406\u8D26\u672C\u91CC\u6307\u5411\u5DF2\u5220\u9664\u6280\u80FD\u7684\u6761\u76EE\uFF08\u6280\u80FD\u5305\u663E\u793A\u300CN \u4E2A\u5931\u6548\u5F15\u7528\u300D\u65F6\u7528\uFF09\u3002 */\n const pruneBundle = async (bundle: BundleInfo): Promise<void> => {\n try {\n // \u5FC5\u987B\u56DE\u5230\u672A\u8FC7\u6EE4\u7684\u5FEB\u7167\u53D6\u6210\u5458\uFF1A\u89C6\u56FE\u91CC\u7684 bundle \u53EF\u80FD\u5DF2\u88AB\u641C\u7D22/\u72B6\u6001\u7B5B\u9009\u88C1\u6389\u8FC7\u3002\n const full = state.status === 'ready'\n ? (state.snapshot.bundles.find((candidate) => candidate.id === bundle.id) ?? bundle)\n : bundle\n await skillApi.setBundleSkills(bundle.id, full.skills.map((skill) => skill.name))\n pushToast('ok', skillT('pruned'))\n refresh()\n } catch (error) {\n failToast('\u6E05\u7406\u5931\u6548\u5F15\u7528', error)\n }\n }\n\n /** \u4ECE\u7A7A\u6280\u80FD\u5305\u7684\u5F15\u5BFC\u6309\u94AE\u76F4\u63A5\u8FDB\u5165\u300C\u6DFB\u52A0\u6280\u80FD\u300D\uFF0C\u5E76\u628A\u5F52\u7EC4\u9884\u9009\u6210\u5B83\u3002 */\n const openInstallFor = (bundleId: string): void => {\n setInstall(null)\n setInstallError(null)\n setInstallBundleId(bundleId)\n setAddOpen(true)\n }\n\n const bundles = state.status === 'ready' ? state.snapshot.bundles : []\n const loose = state.status === 'ready' ? state.snapshot.loose : []\n /** \u5F53\u524D\u4F5C\u7528\u57DF pill \u6587\u6848\uFF1A\u300C\u5168\u90E8 Agent\u300D\u89C6\u56FE = \u5168\u5C40\uFF08Global\uFF09\uFF0C\u9884\u8BBE\u89C6\u56FE = \u9884\u8BBE\u540D\u3002 */\n const scopeLabel = activePreset === ALL_PRESETS\n ? t('scopeAll')\n : (presets.find((preset) => preset.id === activePreset)?.name ?? activePreset)\n\n /* \u2500\u2500 Skills Hub \u6D3E\u751F\u6570\u636E\uFF1A\u641C\u7D22 / Agent \u9884\u8BBE / \u72B6\u6001 / \u6392\u5E8F \u2500\u2500 */\n const q = query.trim().toLowerCase()\n const qMatch = (skill: SkillInfo): boolean => {\n if (q === '') return true\n if (skill.name.toLowerCase().includes(q)) return true\n return (skill.description ?? '').toLowerCase().includes(q)\n }\n const statusMatch = (skill: SkillInfo): boolean => {\n // \u300C\u5168\u90E8\u300D= \u4E0D\u5206\u542F\u7528\u72B6\u6001\u4E00\u5F8B\u663E\u793A\u3002\u65E7\u5B9E\u73B0\u5728\u8FD9\u91CC\u4E5F return on\uFF0C\u4E8E\u662F\u6280\u80FD\u4E00\u5173\u5361\u7247\u5C31\n // \u5F53\u573A\u4ECE\u5217\u8868\u91CC\u6D88\u5931\uFF0C\u60F3\u518D\u6253\u5F00\u53EA\u80FD\u5207\u5230\u300C\u5DF2\u505C\u7528\u300D\u6863\u53BB\u635E \u2014\u2014 \u5173\u6389\u5373\u9690\u8EAB\u3002\n if (statusFilter === 'all') return true\n // \u542F\u7528\u6001\u6309\u5F53\u524D\u89C6\u56FE\u8BA1\u7B97\uFF1A\u5168\u90E8 Agent = \u5168\u5C40\u5C42\uFF0C\u9884\u8BBE\u89C6\u56FE = \u9884\u8BBE\u5C42\uFF08\u542B\u5168\u5C40\u9501\u5B9A\uFF09\u3002\n const on = activePreset === ALL_PRESETS\n ? toggles.skills[skill.name] !== false\n : skillEnabledAt(activePreset, skill.name)\n return statusFilter === 'on' ? on : !on\n }\n const sortedSkills = (list: SkillInfo[]): SkillInfo[] => [...list].sort((a, b) => {\n const order = a.name.localeCompare(b.name)\n return sortAsc ? order : -order\n })\n const filteredSkills = (list: SkillInfo[]): SkillInfo[] =>\n sortedSkills(list.filter((skill) =>\n qMatch(skill)\n && statusMatch(skill)))\n /**\n * \u5168\u91CF\u7B5B\u9009\u7ED3\u679C\uFF08\u6279\u91CF\u64CD\u4F5C\u4F5C\u7528\u4E8E\u5168\u90E8\uFF09\u3002\n * \u7A7A\u6280\u80FD\u5305\u5FC5\u987B\u7559\u5728\u5217\u8868\u91CC\uFF1A\u65E7\u5B9E\u73B0\u4E00\u5F8B filter(skills.length > 0)\uFF0C\u4E8E\u662F\u65B0\u5EFA\u7684\u5305\u3001\n * \u4EE5\u53CA\u8D26\u672C\u6309\u76EE\u5F55\u540D\u8BB0\u8D26\u5BFC\u81F4\u6210\u5458\u89E3\u6790\u4E0D\u5230\u7684\u5305\uFF0C\u90FD\u4F1A\u4ECE\u9762\u677F\u4E0A\u51ED\u7A7A\u6D88\u5931 \u2014\u2014 \u65E2\u770B\u4E0D\u5230\n * \u4E5F\u70B9\u4E0D\u5230\uFF0C\u6CA1\u6CD5\u518D\u5F80\u91CC\u5F52\u6280\u80FD\u3002\u53EA\u6709\u771F\u6B63\u5E26\u7B5B\u9009\u6761\u4EF6\u65F6\u624D\u6309\u547D\u4E2D\u60C5\u51B5\u9690\u85CF\u3002\n */\n const filtering = q !== '' || statusFilter !== 'all'\n /**\n * \u5206\u7C7B\u7D22\u5F15\uFF1A\u5206\u7C7B\u540D \u2192 \u6302\u4E86\u5B83\u7684\u6280\u80FD\u5305\u6570\uFF1B\u6CA1\u6302\u4EFB\u4F55\u5206\u7C7B\u7684\u5305\u5F52\u5230 UNCATEGORIZED \u6876\u3002\n * \u9876\u680F\u80F6\u56CA\u4E0E\u5305\u540D\u65C1\u7684\u6807\u7B7E\u90FD\u4ECE\u8FD9\u91CC\u53D6\u6570\uFF0C\u6240\u4EE5\u4E24\u8FB9\u53E3\u5F84\u5929\u7136\u4E00\u81F4\u3002\n */\n const categoryCounts = (() => {\n const counts = new Map<string, number>()\n for (const bundle of bundles) {\n const cats = bundle.categories ?? []\n if (cats.length === 0) {\n counts.set(UNCATEGORIZED, (counts.get(UNCATEGORIZED) ?? 0) + 1)\n continue\n }\n for (const cat of cats) counts.set(cat, (counts.get(cat) ?? 0) + 1)\n }\n return counts\n })()\n const categoryList = sortCategories(categoryCounts)\n /** \u81F3\u5C11\u8981\u6709\u4E00\u4E2A\u771F\u5206\u7C7B\uFF08\u672A\u5206\u7C7B\u6876\u4E0D\u7B97\uFF09\u624D\u503C\u5F97\u5360\u4E00\u884C\u9876\u680F\u7A7A\u95F4\u3002 */\n const hasCategories = categoryList.some((cat) => cat !== UNCATEGORIZED)\n /** \u9009\u4E2D\u7684\u5206\u7C7B\u88AB\u6700\u540E\u4E00\u4E2A\u5305\u6458\u6389\u65F6\u81EA\u52A8\u56DE\u843D\u300C\u5168\u90E8\u300D\uFF0C\u4E0D\u7559\u4E00\u4E2A\u7B5B\u4E0D\u51FA\u4E1C\u897F\u7684\u6B7B\u72B6\u6001\u3002 */\n const activeCat = catFilter !== null && categoryCounts.has(catFilter) ? catFilter : null\n const catMatch = (bundle: BundleInfo): boolean => {\n if (activeCat === null) return true\n const cats = bundle.categories ?? []\n return activeCat === UNCATEGORIZED ? cats.length === 0 : cats.includes(activeCat)\n }\n const visibleBundleAll = (sourceFilter === 'loose' ? [] : bundles)\n .filter((bundle) => catMatch(bundle))\n .map((bundle) => ({ ...bundle, skills: filteredSkills(bundle.skills) }))\n .filter((bundle) => bundle.skills.length > 0 || (bundle.skillCount === 0 && !filtering))\n const visibleLooseAll = sourceFilter === 'bundles' || activeCat !== null ? [] : filteredSkills(loose)\n const totalSkills = bundles.reduce((n, bundle) => n + bundle.skillCount, 0) + loose.length\n const bundleCount = bundles.length\n /** \u540C\u6B65\u72B6\u6001\u5361\u5C55\u793A\u6A21\u578B\uFF1Aok=\u7EFF\u70B9\u5168\u5065\u5EB7\uFF1Bissue=\u6A59\u70B9\u5E26\u6570\u91CF\uFF1Bunavailable=\u7070\u70B9\u5F85\u68C0\u6D4B\uFF08\u65E7 host \u672A\u52A0\u8F7D\u65B0\u8DEF\u7531\uFF09\uFF1Bloading=\u68C0\u6D4B\u4E2D\u3002 */\n const healthView = health.state === 'ok'\n ? { tone: 'ok', label: t('statHealthy'), title: t('statHealthy') }\n : health.state === 'issue'\n ? { tone: 'warn', label: t('statIssues', { n: health.report.issues.length }), title: health.report.issues.map((issue) => issue.message).join('\\n') }\n : health.state === 'unavailable'\n ? { tone: 'pending', label: t('statPending'), title: t('statPending') }\n : { tone: 'idle', label: t('statChecking'), title: '' }\n const enabledCount = (() => {\n let n = 0\n for (const bundle of bundles) for (const skill of bundle.skills) if (toggles.skills[skill.name] !== false) n += 1\n for (const skill of loose) if (toggles.skills[skill.name] !== false) n += 1\n return n\n })()\n /** \u5F53\u524D\u88AB\u5168\u5C40\u5C42\u5173\u6389\u7684\u6280\u80FD\u6570\uFF08\u9876\u680F\u300C\u5DF2\u505C\u7528\u300D\u8BA1\u6570\uFF1B\u4E0E\u300C\u5DF2\u542F\u7528\u300D\u540C\u4E00\u53E3\u5F84\uFF09\u3002 */\n const disabledCount = (() => {\n let n = 0\n for (const bundle of bundles) for (const skill of bundle.skills) if (toggles.skills[skill.name] === false) n += 1\n for (const skill of loose) if (toggles.skills[skill.name] === false) n += 1\n return n\n })()\n const noResults = visibleBundleAll.length === 0 && visibleLooseAll.length === 0\n\n const trimmedName = installName.trim()\n const nameInvalid = trimmedName !== '' && !SKILL_NAME_PATTERN.test(trimmedName)\n\n const confirmTitle = confirm === null\n ? t('deleteSkillConfirm', { name: '' })\n : confirm.kind === 'bundle'\n ? t('deleteBundleConfirm', { name: confirm.bundle.name })\n : t('deleteSkillConfirm', { name: confirm.name })\n // \u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4E0D\u4E00\u81F4\u65F6\u8BF4\u660E\u767D\uFF1A\u5220\u7684\u662F\u90A3\u4E2A\u76EE\u5F55\uFF0C\u907F\u514D\u7528\u6237\u4EE5\u4E3A\u5220\u9519\u4E1C\u897F\u3002\n + (confirm.kind === 'skill' && confirm.dir !== undefined && confirm.dir !== confirm.name\n ? t('deleteSkillDirNote', { dir: confirm.dir }) : '')\n\n return (\n <PopoverShell\n solid\n closing={closing}\n onClose={() => {\n // \u5B89\u88C5/\u786E\u8BA4\u8FDB\u884C\u4E2D\u7981\u6B62\u5173\u95ED\uFF1B\u4E8C\u7EA7\u5F39\u7A97\uFF08\u65B0\u5EFA/\u6DFB\u52A0/\u786E\u8BA4/\u67E5\u770B\u5668/\u5F52\u7EC4\uFF09\u6253\u5F00\u65F6 Esc \u5F52\u4E8C\u7EA7\u5F39\u7A97\u3002\n if (installing || confirming) return\n if (newBundleOpen || addOpen || confirm !== null || viewer !== null || assignTarget !== null || catTarget !== null) return\n onClose()\n }}\n anchor={anchor}\n onCardMouseEnter={onCardMouseEnter}\n onCardMouseLeave={onCardMouseLeave}\n size={{ width: 1150, height: 860 }}\n ariaLabel={t('panelTitle')}\n >\n {/* \u5934\u90E8\uFF1A\u6807\u9898\uFF08\u80FD\u529B\u7BA1\u7406\uFF09+ \u7D27\u8D34\u6587\u5B57\u53F3\u4FA7\u7684 SKILL/MCP \u9876\u5C42 tab + \u5173\u95ED */}\n <PanelHead t={t} kind={kind} onKind={setKind} />\n <PshBody className={css.modalBody}>\n <span data-skm-panel-marker aria-hidden=\"true\" style={{ display: 'none' }} />\n <div className={css.hub} aria-busy={state.status === 'loading'}>\n {/* \u2500\u2500 \u9876\u680F\uFF08\u4EC5 SKILL \u89C6\u56FE\uFF09\uFF1A\u9884\u8BBE chips + \u5FEB\u6377\u7B5B\u9009 + \u65B0\u5EFA/\u6DFB\u52A0/\u6307\u5357 \u2500\u2500 */}\n {kind === 'skill' && (\n <SkillTopBar\n t={t}\n dropActive={dropActive}\n setDropActive={setDropActive}\n onDrop={onDrop}\n activePreset={activePreset}\n setActivePreset={setActivePreset}\n presets={presets}\n overrides={overrides}\n enabledCountFor={enabledCountFor}\n totalSkills={totalSkills}\n enabledCount={enabledCount}\n disabledCount={disabledCount}\n healthView={healthView}\n hasCategories={hasCategories}\n activeCat={activeCat}\n setCatFilter={setCatFilter}\n categoryList={categoryList}\n categoryCounts={categoryCounts}\n bundleCount={bundleCount}\n statusFilter={statusFilter}\n setStatusFilter={setStatusFilter}\n query={query}\n setQuery={setQuery}\n openMenu={openMenu}\n setOpenMenu={setOpenMenu}\n sortAsc={sortAsc}\n setSortAsc={setSortAsc}\n newBundleOpen={newBundleOpen}\n onNewBundle={() => { setNewBundleOpen(true) }}\n onAdd={() => { setInstall(null); setInstallError(null); setAddOpen(true) }}\n onRefresh={refresh}\n fileInput={fileInput}\n acceptFiles={acceptFiles}\n />\n )}\n {/* \u2500\u2500 \u9876\u680F\uFF08MCP \u89C6\u56FE\uFF09\uFF1A\u4E0E\u6280\u80FD\u9875\u540C\u6784\u7684\u9884\u8BBE chips + \u72B6\u6001\u5206\u6BB5 \u2500\u2500 */}\n {kind === 'mcp' && (\n <McpTopBar\n t={t}\n live={mcpLive}\n scope={mcpScope}\n onScope={setMcpScope}\n status={mcpStatusFilter}\n onStatus={setMcpStatusFilter}\n query={mcpQuery}\n onQuery={setMcpQuery}\n onRefresh={() => { mcpRefreshLive() }}\n onAddOwn={() => { setMcpAddOwnOpen(true) }}\n onAddCustom={() => { setMcpAddOpen(true) }}\n />\n )}\n\n {/* \u2500\u2500 \u4E3B\u533A \u2500\u2500 */}\n <div className={css.hubMain}>\n {kind === 'prompt' ? (\n <PromptView />\n ) : kind === 'mcp' ? (\n <McpView\n t={t}\n live={mcpLive}\n scope={mcpScope}\n query={mcpQuery}\n status={mcpStatusFilter}\n onRefresh={() => { mcpRefreshLive() }}\n waitingTools={mcpWaitingTools}\n onWatchTools={(names) => { watchMcpTools(names) }}\n addOwnOpen={mcpAddOwnOpen}\n onCloseAddOwn={() => { setMcpAddOwnOpen(false) }}\n />\n ) : (\n <SkillsView\n t={t}\n state={state}\n health={health}\n activePreset={activePreset}\n presets={presets}\n presetOverride={presetOverride}\n resetActivePreset={resetActivePreset}\n openMenu={openMenu}\n setOpenMenu={setOpenMenu}\n refresh={refresh}\n noResults={noResults}\n visibleBundleAll={visibleBundleAll}\n expanded={expanded}\n renameTarget={renameTarget}\n setRenameTarget={setRenameTarget}\n renaming={renaming}\n submitRename={submitRename}\n bundleEnabledIn={bundleEnabledIn}\n toggling={toggling}\n viewMode={viewMode}\n setCatFilter={setCatFilter}\n activeCat={activeCat}\n toggleExpanded={toggleExpanded}\n renamedFlash={renamedFlash}\n openInstallFor={openInstallFor}\n skillEnabledIn={skillEnabledIn}\n skillLockedReason={skillLockedReason}\n scopeLabel={scopeLabel}\n toggleSkill={toggleSkill}\n toggleBundle={toggleBundle}\n openViewer={openViewer}\n removeFromBundle={removeFromBundle}\n pruneBundle={pruneBundle}\n openCatEditor={openCatEditor}\n setConfirm={setConfirm}\n setAssignTarget={setAssignTarget}\n looseOpen={looseOpen}\n setLooseExpanded={setLooseExpanded}\n visibleLooseAll={visibleLooseAll}\n />\n )}\n </div>\n </div>\n </PshBody>\n {/* \u64CD\u4F5C\u56DE\u6267\uFF1A\u5B89\u88C5/\u5220\u9664/\u5F52\u7EC4/\u5F00\u5173\u7684\u6210\u8D25\u90FD\u4ECE\u8FD9\u91CC\u5192\u51FA\u6765\uFF08\u9762\u677F\u53F3\u4E0B\u89D2\uFF0C\u81EA\u52A8\u6536\u8D77\uFF09 */}\n {toasts.length > 0 && (\n <div className={css.toastStack} role=\"status\" aria-live=\"polite\">\n {toasts.map((item) => (\n <span key={item.id} className={`${css.toast} ${item.tone === 'err' ? css.toastErr : css.toastOk}`} data-tone={item.tone}>\n <i className={css.toastDot} aria-hidden=\"true\" />\n {item.text}\n </span>\n ))}\n </div>\n )}\n {/* \u5FEB\u901F\u4E0A\u624B\u6307\u5357 / MCP \u89E3\u91CA\uFF1A\u9762\u677F\u53F3\u4FA7\u60AC\u6D6E\u5361\uFF08portal \u5230 body\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09 */}\n {guideOpen && guidePos !== null && (\n <GuidePanel t={t} onClose={() => { setGuideOpen(false) }} left={guidePos.left} top={guidePos.top} height={guidePos.height} />\n )}\n\n <McpAddModal\n t={t}\n open={mcpAddOpen}\n onClose={() => { setMcpAddOpen(false) }}\n onAdded={(added) => { watchMcpTools(added) }}\n />\n\n {/* \u65B0\u5EFA\u6280\u80FD\u5305\u5F39\u7A97\uFF1A\u540D\u5B57\u4E0E\u5206\u7C7B\u4E00\u8D77\u7ED9\uFF0C\u7701\u5F97\u5EFA\u5B8C\u518D\u8FDB\u53BB\u8BBE\u7F6E\u4E00\u6B21\u3002 */}\n <Modal\n open={newBundleOpen}\n onClose={() => { if (!creatingBundle) { setNewBundleOpen(false); setNewBundleCats([]) } }}\n closeLabel={t('close')}\n title={t('newBundle')}\n >\n <form className={css.stackForm} onSubmit={(event) => { void submitNewBundle(event) }}>\n <input className={css.inlineInput} value={newBundleName} placeholder={t('newBundlePlaceholder')}\n aria-label={t('newBundlePlaceholder')} autoFocus disabled={creatingBundle}\n onChange={(event) => { setNewBundleName(event.currentTarget.value) }} />\n <CategoryEditor value={newBundleCats} onChange={setNewBundleCats} label={t('newBundle')} />\n <div className={css.inlineForm}>\n <Button variant=\"primary\" type=\"submit\" disabled={creatingBundle || newBundleName.trim() === ''}>{t('create')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={creatingBundle} onClick={() => { setNewBundleOpen(false); setNewBundleCats([]) }}>{t('cancel')}</Button>\n </div>\n </form>\n </Modal>\n\n {/* \u8BBE\u7F6E\u5206\u7C7B\u5F39\u7A97\uFF1A\u4E0E\u65B0\u5EFA\u5305\u5171\u7528\u540C\u4E00\u4E2A CategoryEditor\uFF0C\u503C\u8D70\u8349\u7A3F\u6001\uFF0C\u4FDD\u5B58\u624D\u843D\u76D8\u3002 */}\n <Modal\n open={catTarget !== null}\n onClose={() => { if (!savingCats) setCatTarget(null) }}\n closeLabel={t('close')}\n title={t('bundleCatEditTitle', { name: catTarget?.name ?? '' })}\n >\n <div className={css.stackForm}>\n <CategoryEditor value={catDraft} onChange={setCatDraft} label={t('bundleCatEdit')} />\n <div className={css.inlineForm}>\n <Button variant=\"primary\" type=\"button\" disabled={savingCats} onClick={() => { void submitCategories() }}>{t('bundleCatDone')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={savingCats} onClick={() => { setCatTarget(null) }}>{t('cancel')}</Button>\n </div>\n </div>\n </Modal>\n\n {/* \u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\uFF1A\u5148\u62D6\u653E/\u6D4F\u89C8\u9009\u6587\u4EF6\uFF0C\u518D\u586B\u8868\u5355\u5B89\u88C5 */}\n <Modal\n open={addOpen}\n onClose={() => {\n if (installing) return\n setAddOpen(false)\n setInstall(null)\n setDropActive(false)\n }}\n closeLabel={t('close')}\n title={t('addSkillsTitle')}\n >\n {install === null ? (\n <div\n className={`${css.addCard} ${dropActive ? css.addCardActive : ''}`}\n role=\"button\"\n tabIndex={0}\n aria-label={t('addSkillsTitle')}\n onClick={() => { fileInput.current?.click() }}\n onDragOver={(event) => { event.preventDefault(); setDropActive(true) }}\n onDragLeave={() => { setDropActive(false) }}\n onDrop={(event) => { void onDrop(event) }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n fileInput.current?.click()\n }\n }}\n >\n <span className={css.addCardHead}>\n <span className={css.addCardIcon}><CloudUpIcon size={22} /></span>\n <span className={css.addCardTitle}>{t('bannerTitle')}</span>\n </span>\n <span className={css.addCardSub}>{t('bannerSub')}</span>\n <span className={css.addDrop}>\n <CloudUpIcon size={18} />\n <span className={css.addDropText}>{t('dropHere')}</span>\n <span className={css.addDropHint}>{t('dropFormat')}</span>\n </span>\n <button type=\"button\" className={css.addBtn} onClick={(event) => { event.stopPropagation(); fileInput.current?.click() }}>\n {t('browseImport')}\n </button>\n <input\n ref={fileInput}\n type=\"file\"\n className={css.hiddenInput}\n multiple\n {...{ webkitdirectory: '' }}\n onChange={(event) => {\n acceptFiles(event.currentTarget.files === null ? null : Array.from(event.currentTarget.files))\n }}\n />\n </div>\n ) : (\n <form className={css.installForm} onSubmit={(event) => { void confirmInstall(event) }}>\n <div className={css.installRow}>\n <input className={css.inlineInput} value={installName}\n placeholder={install.archive === true ? t('installNameFromArchive') : t('installNamePlaceholder')}\n aria-label={t('installName')}\n disabled={installing || install.archive === true}\n onChange={(event) => { setInstallName(event.currentTarget.value) }} />\n <input className={css.inlineInput} value={installDescription} placeholder={t('installDescription')}\n aria-label={t('installDescription')} disabled={installing}\n onChange={(event) => { setInstallDescription(event.currentTarget.value) }} />\n <label className={css.bundleSelect}>\n <span className={css.visuallyHidden}>{t('installBundle')}</span>\n <select value={installBundleId ?? ''} disabled={installing}\n onChange={(event) => { setInstallBundleId(event.currentTarget.value === '' ? undefined : event.currentTarget.value) }}>\n <option value=\"\">{t('installLoose')}</option>\n {bundles.map((bundle) => <option key={bundle.id} value={bundle.id}>{bundle.name}</option>)}\n </select>\n </label>\n <span className={css.installMeta}>\n {install.archive === true\n ? t('uploadMeta', { n: 1, folder: install.folderName })\n : t('uploadMeta', { n: install.files.length, folder: install.folderName })}\n </span>\n </div>\n {install.archive !== true && nameInvalid && <p className={css.error} role=\"alert\">{t('installNameInvalid')}</p>}\n {install.archive !== true && !nameInvalid && trimmedName !== '' && installMetaName !== null && installMetaName !== trimmedName && (\n <p className={css.installHint}>{t('installNameRewrite', { meta: installMetaName, name: trimmedName })}</p>\n )}\n <div className={css.installActions}>\n <Button variant=\"primary\" type=\"submit\" disabled={installing || (install.archive !== true && (trimmedName === '' || nameInvalid))}>{t('installConfirm')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={installing} onClick={() => { setInstall(null); setAddOpen(false) }}>{t('installCancel')}</Button>\n </div>\n {installError !== null && <p className={css.error} role=\"alert\">{installError}</p>}\n </form>\n )}\n </Modal>\n\n <Modal\n open={confirm !== null}\n onClose={() => {\n if (!confirming) setConfirm(null)\n }}\n closeLabel={t('close')}\n title={confirmTitle}\n footer={\n <>\n <Button variant=\"outline\" disabled={confirming} onClick={() => { setConfirm(null) }}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={confirming} onClick={() => { void confirmDelete() }}>{t('delete')}</Button>\n </>\n }\n />\n\n <SkillViewer\n t={t}\n viewer={viewer}\n viewerFont={viewerFont}\n viewerFull={viewerFull}\n onFontLevel={setViewerFontLevel}\n onToggleFull={toggleViewerFull}\n onSelectFile={selectViewerFile}\n onClose={() => { setViewer(null) }}\n />\n {assignTarget !== null && (\n <Modal\n open\n onClose={() => { setAssignTarget(null) }}\n closeLabel={t('close')}\n title={t('assignTitle', { name: assignTarget.name })}\n className={css.assignModal}\n contentClassName={css.assignModalBody}\n >\n {bundles.length === 0 ? (\n <p className={css.looseEmpty}>{t('assignEmpty')}</p>\n ) : (\n <ul className={css.assignList}>\n {bundles.map((bundle, index) => (\n <li key={bundle.id} style={{ listStyle: 'none' }}>\n <button\n type=\"button\"\n className={css.assignCard}\n style={{ '--skm-i': index } as CSSProperties}\n onClick={() => { void doAssign(assignTarget, bundle.id) }}\n >\n <span className={css.assignCardIcon} aria-hidden=\"true\"><IconFolderOpenOutlineRegular size={16} /></span>\n <span className={css.assignCardBody}>\n <span className={css.assignCardName}>{bundle.name}</span>\n <span className={css.assignCardDesc}>{t('skillsCount', { n: bundle.skillCount })}</span>\n </span>\n <span className={css.assignGo} aria-hidden=\"true\"><IconChevronDownOutlineRegular size={14} /></span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </Modal>\n )}\n </PopoverShell>\n )\n}\n", "/**\n * popover-shell \u2014 \u300C\u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u300D\u9762\u677F\u5916\u58F3\uFF08\u6280\u80FD\u9762\u677F\u7528\uFF09\u3002\n *\n * \u8DDF\u70B9\u4F1A\u8BDD\u4E00\u81F4\u7684\u884C\u4E3A\uFF1A\n * - drawer \u6A21\u5F0F\uFF1A\u76F4\u63A5\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\uFF08\u4FA7\u680F\u53F3\u7F18 \u2192 \u89C6\u53E3\u53F3\u7F18\uFF0C\u5168\u9AD8\uFF0C\u65E0\u906E\u7F69\uFF09\uFF0C\n * \u81EA\u53F3\u5411\u5DE6\u6ED1\u5165\uFF08translateX(56px)\u21920\uFF09\uFF0C\u5173\u95ED\u53CD\u5411\u6536\u56DE\uFF1B\u4FA7\u680F\u4FDD\u6301\u53EF\u70B9\uFF0C\n * \u968F\u65F6\u5207\u4F1A\u8BDD\uFF08\u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\u9762\u677F\uFF09\uFF1B\n * - \u79FB\u52A8\u7AEF\u56DE\u9000\u5168\u5C4F sheet\uFF08translateY(24px) \u4E0A\u6ED1\uFF0C\u540C auto-sheet-in\uFF0C\u5E26\u906E\u7F69\uFF09\uFF1B\n * - Esc \u5173\u95ED\u8D70 props.onClose\uFF08\u9762\u677F\u53EF\u81EA\u884C\u62E6\u622A\uFF09\u3002\n *\n * z \u5C42\u7EA7\uFF1Amask 999 / card 1000\u2014\u2014\u4E0E ui-primitives Modal \u7684 root(1000) \u540C\u5C42\uFF0C\n * \u9762\u677F\u5185\u90E8\u7684 primitives \u4E8C\u7EA7\u5F39\u7A97\uFF08\u5982\u6280\u80FD\u6587\u4EF6\u67E5\u770B\u5668\uFF09portal \u5230 body \u66F4\u9760\u540E\uFF0C\n * DOM \u987A\u5E8F\u53D6\u80DC\u6D6E\u4E8E\u672C\u58F3\u4E4B\u4E0A\u3002\n */\n\nimport { useEffect, useState, type CSSProperties, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { MODAL_ANIM_MS, modalDrawerAnimClass } from './modal-animation.js'\n\nconst STYLE_ID = 'dsh-popover-shell-styles'\n\n/** \u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18\u56DE\u9000\u503C\uFF08px\uFF09\uFF1A\u4FA7\u680F\u5B9E\u6D4B\u5931\u8D25\u65F6\u76D6\u4F4F 280px \u53F3\u4FA7\u5168\u90E8\u533A\u57DF\u3002 */\nconst FALLBACK_MAIN_LEFT = 280\n/** \u7A84\u5C4F\u9608\u503C\uFF08px\uFF09\uFF1A\u4F4E\u4E8E\u8BE5\u5BBD\u5EA6\u56DE\u9000\u5168\u5C4F sheet\uFF08\u4E0E\u79FB\u52A8\u7AEF\u5168\u5C4F\u5A92\u4F53\u67E5\u8BE2\u540C\u503C\uFF09\u3002 */\nconst NARROW_VP = 768\n\n/** \u8BFB\u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18 = \u4FA7\u680F\u5217\u53F3\u7F18\uFF08\u8DDF\u968F\u4FA7\u680F\u6298\u53E0\u53D8\u5316\uFF1B\u5931\u8D25\u56DE\u9000 280\uFF09\u3002 */\nfunction readMainLeft(): number {\n try {\n const host = document.getElementById('dsh-prompt-customizer-nav-host')\n if (host !== null) {\n const hostRight = host.getBoundingClientRect().right\n let node = host.parentElement\n while (node !== null && node !== document.body) {\n const rect = node.getBoundingClientRect()\n if (rect.height >= window.innerHeight * 0.7 && rect.left <= 8 && rect.right >= hostRight - 4) {\n return Math.round(rect.right)\n }\n node = node.parentElement\n }\n }\n } catch { /* \u91CF\u4E0D\u5230\u5C31\u56DE\u9000\u56FA\u5B9A\u503C */ }\n return FALLBACK_MAIN_LEFT\n}\n\nconst SHEET = `\n/* \u2500\u2500 \u906E\u7F69\uFF1A\u6DE1\u5165\u6DE1\u51FA \u2500\u2500 */\n.psh-mask{position:fixed;inset:0;z-index:999;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.45))}\n.psh-mask[data-anim='in']{animation:dsh-modal-mask-in ${MODAL_ANIM_MS}ms ease both}\n.psh-mask[data-anim='out']{animation:dsh-modal-mask-out ${MODAL_ANIM_MS}ms ease both}\n/* \u2500\u2500 \u5361\u7247\uFF1A\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u62BD\u5C49 / \u5E95\u90E8 sheet \u56DE\u9000 \u2500\u2500 */\n.psh-card{position:fixed;z-index:1000;display:flex;flex-direction:column;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));border-radius:14px;background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,#16181d));box-shadow:var(--dsw-shadow-lv3,0 8px 40px rgba(0,0,0,.5));overflow:hidden;transition:width ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1),height ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n/* \u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\uFF1A\u4FA7\u680F\u53F3\u7F18 \u2192 \u89C6\u53E3\u53F3\u7F18\u5168\u9AD8\u5E73\u94FA\uFF0C\u65E0\u5706\u89D2\u65E0\u9634\u5F71\uFF0C\u50CF\u5207\u4E86\u4E2A\u89C6\u56FE */\n.psh-card[data-mode='drawer']{top:0;right:0;bottom:0;height:100vh;height:100dvh;max-height:100vh;max-height:100dvh;border-radius:0;border:none;border-left:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.06));box-shadow:none;transition:left ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n/* in \u52A8\u753B\u4E0D\u5F97\u5E26 fill-mode\uFF08both/forwards \u4F1A\u6B8B\u7559 to \u5E27 transform\uFF0C\u4F7F\u5361\u7247\u6210\u4E3A\n \u540E\u4EE3 position:fixed \u5143\u7D20\uFF08\u56FE\u8868 tooltip\uFF09\u7684\u5305\u542B\u5757\uFF0C\u6D6E\u5C42\u6574\u4F53\u504F\u79FB\uFF09\uFF1Bout \u9700\u8981\n forwards \u4FDD\u6301\u9690\u85CF\u6001\u76F4\u5230\u5378\u8F7D\uFF0C\u6B64\u65F6\u65E0\u4EA4\u4E92\u3001\u65E0\u526F\u4F5C\u7528\u3002 */\n.psh-card[data-mode='drawer'][data-anim='in']{animation:dsh-modal-drawer-in ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n.psh-card[data-mode='drawer'][data-anim='out']{animation:dsh-modal-drawer-out ${MODAL_ANIM_MS}ms cubic-bezier(.4,0,.2,1) both}\n.psh-card[data-mode='sheet']{left:12px !important;right:12px;bottom:12px;top:auto !important}\n/* \u5B9E\u5E95\u5361\u7247\uFF08solid \u6A21\u5F0F\uFF09\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4FDD\u6301\u4E0D\u900F\u660E\u8868\u9762\u3002\n \u4E24\u6761\u5FC5\u8981\u6761\u4EF6\u2014\u2014\n 1) \u5E95\u8272\u5FC5\u987B\u7528 static token\uFF08bg-layer-* \u7B49 alias \u5728\u73BB\u7483\u6A21\u5F0F\u4E0B\u88AB\n overrideTokens \u6362\u6210 rgba\uFF0C\u7528\u5B83\u4EEC\u4ECD\u7136\u900F\uFF09\uFF1B\n 2) \u9009\u62E9\u5668\u9700\u5E26 html[data-dsh-glass] \u524D\u7F00\u4EE5\u538B\u8FC7 glass.ts \u91CC\n \u300C\u63D2\u4EF6\u81EA\u7ED8\u9762\u677F\u4E00\u5F8B transparent\u300D\u90A3\u6761\u89C4\u5219\uFF08\u540C\u7279\u5F02\u6027\u9760\u987A\u5E8F\u53D6\u80DC\u4E0D\u53EF\u9760\uFF09\u3002 */\n.psh-card[data-solid],html[data-dsh-glass] .psh-card[data-solid]{\n background:var(--dsw-static-neutral-bluish-00,#fff);\n backdrop-filter:none;-webkit-backdrop-filter:none}\nbody[data-ds-dark-theme] .psh-card[data-solid],\nhtml[data-dsh-glass] body[data-ds-dark-theme] .psh-card[data-solid]{\n background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\n.psh-card[data-mode='sheet'][data-anim='in']{animation:dsh-modal-slide-in ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n.psh-card[data-mode='sheet'][data-anim='out']{animation:dsh-modal-slide-out ${MODAL_ANIM_MS}ms cubic-bezier(.4,0,.2,1) both}\n/* \u2500\u2500 \u901A\u7528\u5361\u7247\u5934\u90E8\uFF1A\u6807\u9898 + \u5173\u95ED\uFF08\u5BF9\u9F50 auto-card-head \u89C4\u683C\uFF09\u2500\u2500 */\n.psh-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 16px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08))}\n.psh-title{flex:1;min-width:0;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#eee)}\n.psh-close{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-secondary,#bbb)}\n.psh-close:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n/* \u5361\u7247\u4E3B\u4F53\u6EDA\u52A8\u533A */\n.psh-body{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}\n/* \u2500\u2500 \u79FB\u52A8\u7AEF\uFF1A\u4EFB\u4F55\u6A21\u5F0F\u5F3A\u5236\u5168\u5C4F sheet\uFF08100vw / 100dvh\uFF0Cradius 0\uFF09\u3002\n \u53C2\u8003 tool-summary .dts__modal \u7684 767.98px \u5199\u6CD5\uFF1B!important \u538B\u8FC7\u7EC4\u4EF6\u5185\u8054\n left/top/width/height\uFF08drawer \u6A21\u5F0F\u7528\u5185\u8054\u5BBD\u5EA6\uFF0C\u5FC5\u987B\u8986\u76D6\u5230 0/\u5168\u5C4F\uFF09\u3002\n transform:none \u4EC5\u4F5C\u9759\u6001\u515C\u5E95\uFF0C\u6ED1\u5165/\u6ED1\u51FA\u52A8\u753B\u7684 keyframe transform \u4ECD\u4F18\u5148\u64AD\u653E\uFF1B\n \u672C\u5757\u6CE8\u91CA\u5185\u5BB9\u672A\u5199\u51FA\u300C\u661F\u53F7\u7D27\u8DDF\u6B63\u659C\u6760\u300D\u4E24\u5B57\u7B26\u5E8F\u5217\u3002 \u2500\u2500 */\n@media (max-width: 767.98px){\n .psh-card{\n left:0 !important;\n top:0 !important;\n right:auto !important;\n bottom:auto !important;\n width:100vw !important;\n max-width:100vw !important;\n height:100vh !important;\n height:100dvh !important;\n max-height:100vh !important;\n max-height:100dvh !important;\n border-radius:0 !important;\n transform:none !important;\n }\n}\n@media (prefers-reduced-motion:reduce){\n .psh-mask,.psh-card{animation:none!important}\n .psh-card{transition:none!important}\n}\n`\n\n/** \u6CE8\u5165\u5916\u58F3\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureShellStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** \u951A\u70B9\uFF1A\u5165\u53E3\u6309\u94AE\u53F3\u7F18 + \u9876\u7F18\u7684\u89C6\u53E3\u5750\u6807\uFF08getBoundingClientRect \u7CFB\uFF09\u3002 */\nexport interface PopoverAnchor {\n left: number\n top: number\n}\n\n/** \u7406\u60F3\u5C3A\u5BF8\uFF08px\uFF09\uFF1A\u62BD\u5C49\u5BBD\u5EA6\u968F tab \u5207\u6362\u4EE5 240ms \u5E73\u6ED1\u8FC7\u6E21\uFF08automation \u5361\u7247\u540C\u6B3E\u66F2\u7EBF\uFF09\u3002 */\nexport interface PopoverSize {\n width: number\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E00\u5F8B\u5168\u9AD8\uFF0Cheight/fill \u4E0D\u518D\u751F\u6548\u3002 */\n height?: number\n fill?: boolean\n}\n\n/** PopoverShell \u5C5E\u6027\u3002 */\nexport interface PopoverShellProps {\n /** \u6B63\u5728\u64AD\u653E\u6536\u56DE\u52A8\u753B\uFF08\u6B64\u65F6\u4ECD\u6302\u8F7D\uFF0C\u64AD out \u52A8\u753B\uFF09\u3002 */\n closing: boolean\n /** \u8BF7\u6C42\u5173\u95ED\uFF08\u906E\u7F69\u70B9\u51FB / Esc / \u5173\u95ED\u94AE\u7EDF\u4E00\u8D70\u8FD9\u91CC\uFF09\u3002 */\n onClose: () => void\n /** \u5165\u53E3\u951A\u70B9\uFF08\u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E0D\u518D\u8DDF\u968F\u6309\u94AE\u5B9A\u4F4D\uFF0C\u4F20\u4E0D\u4F20\u90FD\u4E0D\u5F71\u54CD\u5E03\u5C40\uFF09\u3002 */\n anchor?: PopoverAnchor | null\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u9762\u677F\u76F4\u63A5\u94FA\u6EE1\u4F1A\u8BDD\u4E3B\u533A\uFF0C\u7406\u60F3\u5BBD\u5EA6\u4E0D\u518D\u751F\u6548\u3002 */\n width?: number\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u94FA\u6EE1\u4E3B\u533A\uFF0C\u52A8\u6001\u5C3A\u5BF8\u4E0D\u518D\u751F\u6548\u3002 */\n size?: PopoverSize\n /** \u9F20\u6807\u8FDB\u5165\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF1A\u53D6\u6D88\u81EA\u52A8\u6536\u56DE\uFF09\u3002 */\n onCardMouseEnter?: () => void\n /** \u9F20\u6807\u79BB\u5F00\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF1A\u542F\u52A8\u81EA\u52A8\u6536\u56DE\u8BA1\u65F6\uFF09\u3002 */\n onCardMouseLeave?: () => void\n /** \u65E0\u969C\u788D\u540D\uFF08role=dialog \u7684 aria-label\uFF09\u3002 */\n ariaLabel: string\n /** \u5B9E\u5E95\u5361\u7247\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4E0D\u900F\u660E\uFF08\u5185\u5BB9\u5BC6\u96C6\u7684\u6570\u636E\u9762\u677F\u7528\uFF0C\u907F\u514D\u80CC\u666F\u7A7F\u900F\u5E72\u6270\u9605\u8BFB\uFF09\u3002 */\n solid?: boolean\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E00\u5F8B\u5168\u9AD8\uFF0C\u8BE5\u503C\u4E0D\u518D\u751F\u6548\u3002 */\n bottomInset?: number\n children: ReactNode\n}\n\n/** \u6E32\u67D3\u300C\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u9762\u677F\u300D\uFF08\u542B\u906E\u7F69\uFF09\u3002\u5185\u5BB9\u81EA\u5E26\u5934\u90E8\u65F6\u65E0\u9700\u518D\u7528 PshHead\u3002 */\nexport function PopoverShell({\n closing, onClose, width = 560, size, onCardMouseEnter, onCardMouseLeave, ariaLabel, solid = false, children,\n}: PopoverShellProps): JSX.Element {\n // \u89C6\u53E3\u5BBD\u5EA6 + \u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18\u8D70 state\uFF1A\u7A97\u53E3\u7F29\u653E/\u4FA7\u680F\u6298\u53E0\u65F6\u5B9E\u65F6\u8DDF\u968F\u3002\n const [vw, setVw] = useState(window.innerWidth)\n const [mainLeft, setMainLeft] = useState(readMainLeft)\n useEffect(() => {\n const reread = (): void => {\n setVw(window.innerWidth)\n setMainLeft(readMainLeft())\n }\n reread()\n window.addEventListener('resize', reread)\n const observer = new MutationObserver(reread)\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-sidebar-collapsed'], subtree: true })\n const timer = window.setInterval(reread, 1500)\n return () => {\n window.removeEventListener('resize', reread)\n observer.disconnect()\n window.clearInterval(timer)\n }\n }, [])\n void (size?.width ?? width)\n const anim = closing ? 'out' : 'in'\n // \u7A84\u5C4F\u56DE\u9000\u5168\u5C4F sheet\uFF1B\u684C\u9762\u7AEF\u76F4\u63A5\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\uFF08left=\u4FA7\u680F\u53F3\u7F18\uFF0C\u53F3\u62C9\u6EE1\uFF09\u3002\n const narrow = vw < NARROW_VP\n const mode = narrow ? 'sheet' : 'drawer'\n const style: CSSProperties | undefined = narrow ? undefined : { left: mainLeft }\n\n useEffect(() => {\n if (closing) return undefined\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [closing, onClose])\n\n // portal \u5230 body\uFF1A\u5361\u7247\u4E0D\u80FD\u7559\u5728\u5165\u53E3\u6240\u5728\u7684 DOM \u5B50\u6811\u91CC\u3002\n // \u5165\u53E3\u662F portal \u8FDB\u4FA7\u8FB9\u680F\u5BFC\u822A\u69FD\u7684\uFF0C\u800C\u69FD\u4F4D\u5BBF\u4E3B\u662F\u6211\u4EEC\u624B\u5DE5\u63D2\u8FDB DSH \u81EA\u6709\n // React \u6811\u7684\u88F8\u8282\u70B9\u2014\u2014\u5F39\u5C42\u4E00\u65E6\u7559\u5728\u91CC\u9762\uFF0C\u4FA7\u8FB9\u680F\u4EFB\u4F55\u4E00\u6B21\u91CD\u6E32\u67D3\u90FD\u53EF\u80FD\u8FDE\u5E26\n // \u56DE\u6536\u5B83\uFF0C\u4E14 position:fixed \u4F1A\u88AB\u4FA7\u8FB9\u680F\u7684 transform \u7956\u5148\u53D8\u6210\u5C40\u90E8\u5B9A\u4F4D\u3002\n // \u632A\u5230 body \u540E\uFF1A\u4E0D\u53D7\u4FA7\u8FB9\u680F\u6E32\u67D3\u5F71\u54CD\u3001fixed \u951A\u5B9A\u89C6\u53E3\u3001\u5C42\u7EA7\u4E0E DOM \u987A\u5E8F\u53EF\u63A7\u3002\n return createPortal(\n <>\n {narrow && (\n <div className=\"psh-mask\" data-anim={anim} aria-hidden=\"true\" onClick={onClose} />\n )}\n <div\n className={`psh-card ${modalDrawerAnimClass(closing)}`}\n data-anim={anim}\n data-mode={mode}\n data-solid={solid ? '' : undefined}\n style={style}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n onMouseEnter={onCardMouseEnter}\n onMouseLeave={onCardMouseLeave}\n >\n {children}\n </div>\n </>,\n document.body,\n )\n}\n\n/** \u5361\u7247\u5934\u90E8\u5C5E\u6027\u3002 */\nexport interface PshHeadProps {\n title: string\n closeLabel: string\n onClose: () => void\n}\n\n/** \u901A\u7528\u5361\u7247\u5934\u90E8\uFF08\u6807\u9898 + \u5173\u95ED\u94AE\uFF09\u3002 */\nexport function PshHead({ title, closeLabel, onClose }: PshHeadProps): JSX.Element {\n return (\n <div className=\"psh-head\">\n <span className=\"psh-title\">{title}</span>\n <button type=\"button\" className=\"psh-close\" aria-label={closeLabel} onClick={onClose}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 4l8 8M12 4l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n )\n}\n\n/** \u5361\u7247\u4E3B\u4F53\u6EDA\u52A8\u5BB9\u5668\uFF08flex:1 + overflow hidden\uFF0C\u5185\u90E8\u9762\u677F\u81EA\u884C\u6EDA\u52A8\uFF09\u3002 */\nexport function PshBody({ children, className }: { children: ReactNode; className?: string }): JSX.Element {\n return <div className={className !== undefined && className !== '' ? `psh-body ${className}` : 'psh-body'}>{children}</div>\n}\n", "/**\n * \u5F39\u7A97\u5F00\u5408\u52A8\u753B\uFF08\u7528\u91CF\u5DE5\u4F5C\u53F0 / \u6280\u80FD\u9762\u677F / \u8BB0\u5FC6\u9762\u677F\u5171\u7528\uFF09\u2014\u2014\u5BF9\u9F50\u300C\u81EA\u52A8\u5316\u300D\u5361\u7247\u7684\u6ED1\u5165\u6ED1\u51FA\u624B\u611F\uFF1A\n * - \u5F39\u51FA\uFF1Afade + \u81EA\u5E95\u90E8 24px \u4E0A\u6ED1\u8FDB\u5165\uFF08\u65E0\u7F29\u653E\uFF1Bautomation sheet-in \u540C\u6B3E\u4F4D\u79FB\u4E0E\u66F2\u7EBF\uFF09\uFF0Cmount \u65F6\u64AD\u653E\u3002\n * - \u6536\u56DE\uFF1Afade + \u4E0B\u6ED1 24px \u9000\u51FA\uFF08automation sheet-out \u540C\u6B3E\u53CD\u5411\u66F2\u7EBF\uFF09\uFF0Cclosing \u9636\u6BB5\u64AD\u653E\uFF0C\u7ED3\u675F\u540E\u518D\u5378\u8F7D\u3002\n * - \u5185\u5BB9\uFF1A`.dsh-modal-stagger` \u5BB9\u5668\u5728\u5361\u7247\u6ED1\u5165\u540E 60ms \u8F7B\u5FAE\u4E0A\u6D6E\u8DDF\u8FDB\uFF08automation \u5185\u90E8\u533A\u5757\u540C\u6B3E\n * rise-in\uFF09\uFF0C\u5173\u95ED\u65F6\u52A8\u753B\u81EA\u52A8\u89E3\u9664\u3001\u968F\u5361\u7247\u6574\u4F53\u6536\u56DE\u6E10\u9690\u3002\n *\n * \u7528\u6CD5\uFF1A\u5165\u53E3\u7EC4\u4EF6\u7528 useModalClose \u6301\u6709 closing \u6001\uFF0C\u628A closing \u4F20\u7ED9\u5F39\u7A97\uFF0C\n * \u5F39\u7A97\u628A closing \u6620\u5C04\u6210 slide-out class\uFF08\u5361\u7247\uFF09\u4E0E mask \u7684\u6DE1\u51FA class\uFF1B\n * \u9700\u8981\u5185\u5BB9\u9519\u843D\u611F\u7684\u9762\u677F\u5728\u5185\u5BB9\u6839\u5BB9\u5668\u4E0A\u52A0 `dsh-modal-stagger` \u5373\u53EF\u3002\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\n/** \u52A8\u753B\u65F6\u957F\uFF08ms\uFF09\uFF0CCSS \u4E0E hook \u8BA1\u65F6\u4FDD\u6301\u4E00\u81F4\uFF08\u4E0E automation \u7684 AUTO_ANIM_MS \u540C\u503C\uFF09\u3002 */\nexport const MODAL_ANIM_MS = 240\n\n/** \u6837\u5F0F\u6807\u7B7E id\uFF08\u5E26 triad \u524D\u7F00\uFF1Adsh-chat-flow \u6CE8\u5165\u540C\u540D\u65E7\u8868\uFF0C\u5148\u5230\u5148\u5F97\u4F1A\u541E\u6389\u672C\u8868\u7684 keyframes\uFF09\u3002 */\nconst STYLE_ID = 'dsh-prompt-customizer-modal-animation-styles'\n\nconst SHEET = `\n@keyframes dsh-modal-slide-in {\n from { opacity: 0; transform: translateY(24px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes dsh-modal-slide-out {\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(24px); }\n}\n@keyframes dsh-modal-side-in {\n from { opacity: 0; transform: translateX(-14px); }\n to { opacity: 1; transform: translateX(0); }\n}\n@keyframes dsh-modal-side-out {\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(-10px); }\n}\n@keyframes dsh-modal-drawer-in {\n from { opacity: 0; transform: translateX(56px); }\n to { opacity: 1; transform: translateX(0); }\n}\n@keyframes dsh-modal-drawer-out {\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(40px); }\n}\n@keyframes dsh-modal-rise-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes dsh-modal-mask-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes dsh-modal-mask-out {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n.dsh-modal-slide-in { animation: dsh-modal-slide-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-slide-out { animation: dsh-modal-slide-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n.dsh-modal-side-in { animation: dsh-modal-side-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-side-out { animation: dsh-modal-side-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n.dsh-modal-drawer-in { animation: dsh-modal-drawer-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-drawer-out { animation: dsh-modal-drawer-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n/* \u5185\u5BB9\u9519\u843D\uFF1A\u5361\u7247\u64AD\u653E\u6ED1\u5165\uFF08\u5E95\u90E8\u4E0A\u6ED1 / \u53F3\u4FA7\u6ED1\u5165\u5747\u53EF\uFF09\u65F6\u751F\u6548\uFF0C\u5173\u95ED\u65F6\u968F\u5361\u7247\u6574\u4F53\u6536\u56DE\u3002\n fill-mode \u5FC5\u987B\u7528 backwards\uFF08\u5EF6\u8FDF\u671F\u5E94\u7528 from \u5E27\u9690\u85CF\uFF09\u800C\u975E both\u2014\u2014both \u4F1A\u5728\u52A8\u753B\n \u7ED3\u675F\u540E\u6B8B\u7559 to \u5E27 transform\uFF08\u5373\u4F7F translateY(0)\uFF09\uFF0C\u4F7F\u8BE5\u5BB9\u5668\u6210\u4E3A\u540E\u4EE3 position:fixed\n \u5143\u7D20\uFF08\u56FE\u8868 tooltip\uFF09\u7684\u5305\u542B\u5757\uFF0C\u6D6E\u5C42\u6574\u4F53\u504F\u79FB\u3002 */\n.dsh-modal-slide-in .dsh-modal-stagger,\n.dsh-modal-side-in .dsh-modal-stagger,\n.dsh-modal-drawer-in .dsh-modal-stagger {\n animation: dsh-modal-rise-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1) backwards;\n animation-delay: 60ms;\n}\n.dsh-modal-mask-in { animation: dsh-modal-mask-in ${MODAL_ANIM_MS}ms ease; }\n.dsh-modal-mask-out { animation: dsh-modal-mask-out ${MODAL_ANIM_MS}ms ease forwards; }\n@media (prefers-reduced-motion: reduce) {\n .dsh-modal-slide-in, .dsh-modal-slide-out, .dsh-modal-side-in, .dsh-modal-side-out,\n .dsh-modal-drawer-in, .dsh-modal-drawer-out,\n .dsh-modal-mask-in, .dsh-modal-mask-out { animation: none; }\n .dsh-modal-slide-in .dsh-modal-stagger, .dsh-modal-side-in .dsh-modal-stagger, .dsh-modal-drawer-in .dsh-modal-stagger { animation: none; }\n}\n`\n\n/** \u6CE8\u5165\u5F39\u7A97\u52A8\u753B\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureModalAnimStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** \u5361\u7247\u52A8\u753B class\uFF08open \u9636\u6BB5\u6ED1\u5165\uFF0Cclosing \u9636\u6BB5\u6ED1\u51FA\uFF09\u3002 */\nexport function modalAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-slide-out' : 'dsh-modal-slide-in'\n}\n\n/** \u5361\u7247\u52A8\u753B class\u2014\u2014\u53F3\u4FA7\u6ED1\u5165\u53D8\u4F53\uFF08\u8D34\u5165\u53E3\u5F39\u51FA\u7684 popover \u5361\u7247\u7528\uFF0C\u73B0\u4EC5\u517C\u5BB9\u4FDD\u7559\uFF09\u3002 */\nexport function modalSideAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-side-out' : 'dsh-modal-side-in'\n}\n\n/** \u5361\u7247\u52A8\u753B class\u2014\u2014\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u62BD\u5C49\u53D8\u4F53\uFF08\u7528\u91CF/\u6280\u80FD/\u8BB0\u5FC6\u9762\u677F\u7528\uFF1A\u81EA\u53F3\u5411\u5DE6\u6ED1\u5165\uFF09\u3002 */\nexport function modalDrawerAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-drawer-out' : 'dsh-modal-drawer-in'\n}\n\n/** \u906E\u7F69\u52A8\u753B class\uFF08\u81EA\u5B9A\u4E49\u5F39\u7A97\u624D\u6709\u906E\u7F69\uFF0C\u5982\u7528\u91CF\u5DE5\u4F5C\u53F0\uFF09\u3002 */\nexport function modalMaskAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-mask-out' : 'dsh-modal-mask-in'\n}\n\n/** \u5185\u5BB9\u5BB9\u5668 class\uFF1A\u5361\u7247\u6ED1\u5165\u540E\u9519\u843D\u8DDF\u8FDB\uFF08\u914D\u5408 modalAnimClass \u4F7F\u7528\uFF09\u3002 */\nexport const modalStaggerClass = 'dsh-modal-stagger'\n\n/**\n * \u5F39\u7A97\u5173\u95ED\u52A8\u753B\u72B6\u6001\u673A\uFF1A\u5148\u7F6E closing \u64AD\u653E\u6536\u56DE\u52A8\u753B\uFF0C\u7ED3\u675F\u540E\u518D\u771F\u6B63 onClose\u3002\n * `open` \u7531\u5165\u53E3\u4F20\u5165\uFF1A\u5F39\u7A97\u518D\u6B21\u6253\u5F00\u65F6\u91CD\u7F6E closing\uFF08\u5426\u5219\u4E0A\u4E00\u6B21\u6536\u56DE\u52A8\u753B\u4F1A\u628A\n * closing \u5361\u5728 true\uFF0C\u91CD\u5F00\u540E\u5F39\u7A97\u900F\u660E\u4E14\u906E\u7F69\u6321\u4F4F\u6574\u9875\uFF09\u3002\n */\nexport function useModalClose(open: boolean, onClose: () => void, durationMs = MODAL_ANIM_MS): { closing: boolean; requestClose: () => void } {\n const [closing, setClosing] = useState(false)\n const timerRef = useRef<number | null>(null)\n const closingRef = useRef(false)\n\n // \u6253\u5F00\uFF08\u542B\u91CD\u65B0\u6253\u5F00\uFF09\u65F6\u91CD\u7F6E\u5173\u95ED\u6001\uFF1A\u5728\u7ED8\u5236\u524D\u540C\u6B65\u590D\u4F4D\uFF0C\u907F\u514D\u4E00\u5E27\u900F\u660E\u95EA\u73B0\u3002\n useLayoutEffect(() => {\n if (open) {\n closingRef.current = false\n setClosing(false)\n }\n }, [open])\n\n const requestClose = useCallback(() => {\n if (closingRef.current) return\n closingRef.current = true\n setClosing(true)\n timerRef.current = window.setTimeout(() => {\n onClose()\n }, durationMs)\n }, [onClose, durationMs])\n\n useEffect(() => () => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current)\n }, [])\n\n return { closing, requestClose }\n}\n", "/**\n * Panel \u2014 \u63D0\u793A\u8BCD\u7BA1\u7406\u9762\u677F\uFF08\u72EC\u7ACB\u62BD\u5C49\u7684\u6839\u7EC4\u4EF6\uFF09\u3002\n *\n * \u62C9\u53D6\u914D\u7F6E\u4E0E\u6E05\u5355\u3001\u7EF4\u62A4\u6A21\u5F0F\u4E0E\u7F16\u8F91\u76EE\u6807\u72B6\u6001\uFF0C\u628A\u5DE6\u53F3\u4E24\u680F\u88C5\u914D\u8D77\u6765\uFF1A\n * - \u5934\u90E8\uFF1A\u6807\u9898 + \u6A21\u5F0F\u5207\u6362\uFF08\u63D0\u793A\u8BCD / \u5DE5\u5177 / \u9884\u8BBE\uFF09+ \u4FDD\u5B58 / \u5237\u65B0 / \u5173\u95ED\uFF1B\n * - \u7B2C\u4E8C\u884C\uFF1Aagent \u9884\u8BBE Tab\uFF08\u5168\u90E8 Agent + \u5404\u9884\u8BBE\uFF0C\u70B9\u51FB\u5373\u5207\u6362\u7F16\u8F91\u76EE\u6807\uFF0C\n * \u50CF\u5BBF\u4E3B\u80FD\u529B\u7BA1\u7406\u9875\u7684\u9884\u8BBE\u5207\u6362\uFF09+ \u4E09\u6001\u540C\u6B65 / \u4E2D\u6587\u63D0\u793A\u8BCD\u5F00\u5173\uFF1B\n * - \u4E3B\u4F53\u5206\u680F\uFF1A\u5DE6\u680F = \u52FE\u9009\u5217\u8868\uFF08\u63D0\u793A\u8BCD\u6216\u5DE5\u5177\uFF0C\u5E95\u90E8\u4E09\u6001\u8FC7\u6EE4\uFF09\uFF0C\u53F3\u680F =\n * \u6700\u7EC8\u88C5\u914D\u9884\u89C8\uFF1B\u9884\u8BBE\u6A21\u5F0F\u4E0B\u5DE6\u680F\u662F\u5FEB\u7167\u5E93\u3001\u53F3\u680F\u662F\u5168\u5C40\u8BBE\u7F6E\u3002\n *\n * \u914D\u7F6E\u6765\u81EA\u63D2\u4EF6\u81EA\u6709 /config \u8DEF\u7531\uFF1B\u6E05\u5355\u4E0E\u4E09\u9636\u6BB5\u9884\u89C8\u6765\u81EA /inventory \u4E0E\n * /preview?phase=\u2026\u3002\u7F16\u8F91\u53EA\u6539\u5185\u5B58\u8349\u7A3F\uFF0C\u7531\u300C\u4FDD\u5B58\u300D\u6309\u94AE\u7ECF /config/apply \u4E00\u6B21\n * \u5199\u76D8\uFF08\u5199\u9519\u7684\u914D\u7F6E\u4E0D\u70B9\u4FDD\u5B58\u5C31\u4E0D\u4F1A\u8FDB\u6587\u4EF6\uFF09\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport { IconAgentPresetOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\n// \u9884\u8BBE chips \u884C\u76F4\u63A5\u590D\u7528\u80FD\u529B\u9762\u677F\uFF08SKILL / MCP\uFF09\u7684\u7C7B\u540D\uFF1A\u4E09\u5904\u300CAgent \u9884\u8BBE\u300D\u51E0\u4F55\u4E00\u81F4\u3002\nimport { css } from '../skills/styles.js'\nimport { payloadOf, dropOnPhase } from './dnd.ts'\nimport { DICT, type Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport type { AgentPresetInfo, Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport { editView, type ConfigPatch } from './presets.ts'\nimport { zhMergedInjectEntries, zhRevertInjectEntries, zhApplied, mirroredRows, mirrorPhaseInjectEntries, mirroredDeniedLists, mirrorSkippedNames } from '../../../vendor/prompt-customizer/sectionOps.mjs'\nimport { ZH_SECTIONS } from '../../../vendor/prompt-customizer/zh/index.mjs'\nimport { SectionsPane } from './SectionsPane.tsx'\nimport { ToolsPane } from './ToolsPane.tsx'\nimport { PresetsPane, SettingsPane } from './PresetsPane.tsx'\nimport { PreviewPane } from './PreviewPane.tsx'\n\nconst INVENTORY_URL = '/api/prompt-customizer/inventory'\nconst AGENT_PRESETS_URL = '/api/prompt-customizer/agent-presets'\nconst CONFIG_URL = '/api/prompt-customizer/config'\nconst CONFIG_SET_URL = '/api/prompt-customizer/config/set'\nconst CONFIG_UNSET_URL = '/api/prompt-customizer/config/unset'\nconst CONFIG_APPLY_URL = '/api/prompt-customizer/config/apply'\nconst CONFIG_RESET_URL = '/api/prompt-customizer/config/reset'\nconst PRESETS_CREATE_URL = '/api/prompt-customizer/presets'\nconst PREVIEW_URL = '/api/prompt-customizer/preview'\n\n/** \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\uFF08\u6A21\u578B\u89C6\u89D2\uFF09\uFF1A\u5DE6\u680F\u5217\u8868\u4E0E\u53F3\u680F\u9884\u89C8\u7684\u7EDF\u4E00\u6570\u636E\u6E90\u3002 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** \u4E09\u5957\u540D\u4E49\u88C5\u914D\u7684\u5171\u4EAB\u5E03\u5C40\uFF1A\u987A\u5E8F\u56FA\u5B9A\uFF0Crefresh \u6309\u6B64\u5E76\u884C\u62C9\u53D6\u3002 */\nconst VIEW_KEYS: PhaseViewKey[] = ['bootstrap', 'compaction', 'active']\n\n/** \u7F16\u8F91\u8349\u7A3F\u91CC\u53EF\u80FD\u51FA\u73B0\u7684\u5B57\u6BB5\uFF08\u4E0E\u670D\u52A1\u7AEF /config/apply \u7684 APPLY_FIELDS \u4E00\u81F4\uFF09\u3002 */\nconst DRAFT_FIELDS = ['sections', 'sectionsBootstrap', 'sectionsCompaction', 'replace', 'inject', 'tools'] as const\n\n/** \u9762\u677F\u9876\u5C42\u6A21\u5F0F\uFF1A\u63D0\u793A\u8BCD / \u5DE5\u5177 / \u9884\u8BBE\uFF08\u9884\u89C8\u5E38\u9A7B\u53F3\u680F\uFF0C\u4E0D\u518D\u662F\u72EC\u7ACB\u6A21\u5F0F\uFF09\u3002 */\ntype PanelMode = 'sections' | 'tools' | 'presets'\n\n/** \u53EF\u7F16\u8F91\u7684\u914D\u7F6E\u5B57\u6BB5\uFF08\u542B\u6BCF\u9636\u6BB5\u72EC\u7ACB\u6BB5\u5C4F\u853D\u540D\u5355\uFF09\u3002 */\ntype EditField = 'sections' | 'sectionsBootstrap' | 'sectionsCompaction' | 'replace' | 'inject' | 'tools'\n\n/** \u7F16\u8F91\u57DF\u8349\u7A3F\uFF1A\u63D0\u793A\u8BCD/\u5DE5\u5177\u4E24\u680F\u5171\u4EAB\u7684\u672A\u4FDD\u5B58\u5B57\u6BB5 + \u810F\u6807\u8BB0\u3002\n * \u53EA\u8BB0\u5F55\u7528\u6237\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\uFF08\u9996\u6B21\u7F16\u8F91\u53EA\u5199\u90A3\u4E00\u9879\uFF09\uFF0C\u4FDD\u5B58\u65F6\u4E5F\u53EA\u63D0\u4EA4\u8FD9\u4E9B\n * \u5B57\u6BB5 \u2014\u2014 \u672A\u7F16\u8F91\u7684\u5B57\u6BB5\u7EE7\u7EED\u56DE\u843D\u5168\u5C40 / \u7EE7\u627F\uFF0C\u907F\u514D\u4E00\u6B21\u4FDD\u5B58\u51BB\u7ED3\u5168\u90E8\u7EE7\u627F\u503C\u3002 */\ninterface EditDraft {\n sections?: Config['sections']\n sectionsBootstrap?: Config['sectionsBootstrap']\n sectionsCompaction?: Config['sectionsCompaction']\n replace?: Config['replace']\n inject?: Config['inject']\n tools?: Config['tools']\n dirty: boolean\n}\n\nexport function Panel({ t, onClose }: { t: Translate; onClose?: () => void }): ReactElement {\n const [cfg, setCfg] = useState<Config | null>(null)\n const [inv, setInv] = useState<Inventory | null>(null)\n // \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\uFF1A\u6A21\u578B\u89C6\u89D2\u7684\u552F\u4E00\u6570\u636E\u6E90\uFF08\u52A0\u8F7D\u4E2D\u4E3A null\uFF09\u3002\n const [phases, setPhases] = useState<PhaseViews | null>(null)\n const [agentPresets, setAgentPresets] = useState<AgentPresetInfo[]>([])\n const [mode, setMode] = useState<PanelMode>('sections')\n const [error, setError] = useState<string | null>(null)\n // \u914D\u7F6E\u5199\u5165\u8BA1\u6570\uFF1A\u6BCF\u6B21\u6210\u529F\u5199\u914D\u7F6E\u540E +1\uFF0C\u9A71\u52A8\u9884\u89C8\u91CD\u8F7D\u3002\n const [version, setVersion] = useState(0)\n // \u4E09\u9636\u6BB5\u89C6\u56FE\uFF1A\u5DE6\u680F\u5217\u8868\u4E0E\u53F3\u680F\u9884\u89C8\u5171\u7528\uFF1B\u5DE6\u53F3\u4E24\u680F\u7684\u9636\u6BB5 Tab \u8054\u52A8\u5207\u6362\u540C\u4E00\u4EFD\u3002\n const [phase, setPhase] = useState<PhaseViewKey>('bootstrap')\n // \u62D6\u62FD\u60AC\u505C\u4E2D\u7684\u9636\u6BB5 Tab\uFF1A\u9AD8\u4EAE\u63D0\u793A\u300C\u677E\u624B = \u590D\u5236\u5230\u8BE5\u9636\u6BB5\u300D\uFF08\u5904\u7406\u7531\u6302\u8F7D\u4E2D\u7684\u5217\u8868\u8D1F\u8D23\uFF09\u3002\n const [dropPhase, setDropPhase] = useState<PhaseViewKey | null>(null)\n // \u8349\u7A3F\u9884\u89C8\u7684\u540C\u6B65\u5E8F\u53F7\uFF1A\u6BCF\u6B21\u53D1\u8D77\u540C\u6B65 +1\uFF0C\u8FC7\u671F\u54CD\u5E94\uFF08\u5DF2\u4FDD\u5B58 / \u518D\u6B21\u7F16\u8F91\u540E\uFF09\n // \u76F4\u63A5\u4E22\u5F03\uFF0C\u7EDD\u4E0D\u8986\u76D6\u65B0\u6570\u636E\u3002\n const syncSeq = useRef(0)\n const refreshSeq = useRef(0)\n // \u7F16\u8F91\u76EE\u6807\uFF1Aagent \u9884\u8BBE id\u30020.9.0 \u8D77\u300C\u5168\u90E8 Agent\u300D\u5165\u53E3\u5DF2\u79FB\u9664 \u2014\u2014 \u63D0\u793A\u8BCD\u5FC5\u987B\n // \u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF1B\u5217\u8868\u5230\u8FBE\u540E\u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E00\u4E2A\u53EF\u7528\u9884\u8BBE\uFF08\u89C1\u4E0B\u65B9 effect\uFF09\u3002\n const [target, setTarget] = useState<string | undefined>(undefined)\n // \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u52FE\u9009\u540E\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u680F\u7684\u4E09\u6001\u4E00\u8D77\u751F\u6548 \u2014\u2014 \u63D0\u793A\u8BCD\u680F\u6309\n // \u5E38\u9A7B\u671F\u7684\u5E76\u96C6\u884C\u96C6\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF08\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u4E00\u6B21\u5199\u5168\u4E09\u6001\uFF09\uFF0C\n // \u5DE5\u5177\u680F\u7684\u5C4F\u853D\u4E0E\u52A0\u56DE\u5BF9\u4E09\u4E2A\u9636\u6BB5\u540C\u65F6\u751F\u6548\u3002\u4EC5\u5728\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u4E2A\u6A21\u5F0F\u663E\u793A\u3002\n const [syncAll, setSyncAll] = useState(false)\n // \u53F3\u680F\u9884\u89C8\u7684\u5B50\u89C6\u56FE\uFF1A\u63D0\u793A\u8BCD\u6A21\u5F0F\u9ED8\u8BA4\u770B\u63D0\u793A\u8BCD\u3001\u5DE5\u5177\u6A21\u5F0F\u9ED8\u8BA4\u770B\u5DE5\u5177\u3002\n const [previewSub, setPreviewSub] = useState<'prompt' | 'tools'>('prompt')\n // \u7F16\u8F91\u57DF\u8349\u7A3F\uFF1Anull = \u65E0\u8349\u7A3F\uFF08\u663E\u793A\u78C1\u76D8\u503C\uFF09\u3002\u63D0\u793A\u8BCD \u2194 \u5DE5\u5177\u5207\u6362\u4FDD\u7559\uFF1B\n // \u5207\u5230\u9884\u8BBE\u6A21\u5F0F\u6216\u5207\u6362\u7F16\u8F91\u76EE\u6807\u65F6\u4E22\u5F03\uFF08\u810F\u8349\u7A3F\u5148\u7ECF\u786E\u8BA4\uFF09\u3002\n const [draft, setDraft] = useState<EditDraft | null>(null)\n const [saving, setSaving] = useState(false)\n const [flash, setFlash] = useState<string | null>(null)\n const [flashKind, setFlashKind] = useState<'ok' | 'err'>('ok')\n const flashTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const load = (): void => {\n fetch(CONFIG_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'config failed')\n setCfg(body.config as Config)\n setError(null)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n useEffect(load, [])\n\n // \u8FD4\u56DE Promise\uFF1A\u624B\u52A8\u5237\u65B0\u540E\u53EF\u4EE5\u94FE\u4E0A\u8349\u7A3F\u8865\u540C\u6B65\uFF08\u89C1\u300C\u5237\u65B0\u300D\u6309\u94AE\uFF09\u3002\n const refresh = (): Promise<void> => {\n const seq = ++refreshSeq.current\n const qs = target ? `?scope=${encodeURIComponent(target)}` : ''\n // \u4E09\u9636\u6BB5\u4E0E\u6E05\u5355\u90FD\u8BFB\u53D6\u5F53\u524D\u6A21\u5F0F\uFF1B\u7D2F\u8BA1\u6C60\u4EC5\u4F9B\u6DFB\u52A0\u53C2\u8003\uFF0C\u4E0D\u66FF\u4EE3\u9884\u8BBE\u88C5\u914D\u3002\n const params = (phase: string): string =>\n `${qs}${qs ? '&' : '?'}phase=${phase}&t=${Date.now()}`\n const failures: string[] = []\n const grab = (phase: string): Promise<Preview | null> =>\n fetch(PREVIEW_URL + params(phase))\n .then((r) => r.json())\n .then((body: Preview) => {\n if (body.ok === false) throw new Error(body.error ?? t('previewFail'))\n return body\n })\n .catch((error: unknown) => {\n failures.push(`${phase}: ${String(error instanceof Error ? error.message : error)}`)\n return null\n })\n // \u6E05\u5355\u5E26 scope\uFF1A\u5F53\u524D\u6A21\u5F0F\u7684\u540C\u540D\u6B63\u6587\u4F18\u5148\uFF0C\u5176\u5B83\u5386\u53F2\u6761\u76EE\u53EA\u4F5C\u4E3A\u6C60\u5B50\u53C2\u8003\u3002\n return Promise.all([...VIEW_KEYS.map(grab), fetch(INVENTORY_URL + qs).then((r) => r.json()).then(body => {\n if (body.ok === false) throw new Error(body.error ?? 'inventory failed')\n return body\n }).catch((error: unknown) => {\n failures.push(String(error instanceof Error ? error.message : error))\n return null\n })])\n .then(([boot, comp, act, inventoryData]) => {\n if (seq !== refreshSeq.current) return\n setPhases({ bootstrap: boot, compaction: comp, active: act })\n setInv(inventoryData as Inventory)\n setError(failures.length ? failures.join('\\n') : null)\n })\n .catch((e: unknown) => {\n if (seq !== refreshSeq.current) return\n setPhases({ bootstrap: null, compaction: null, active: null })\n setError(String(e instanceof Error ? e.message : e))\n })\n }\n // \u6302\u8F7D\u65F6\u4E0E\u5207\u6362\u7F16\u8F91\u76EE\u6807\u540E\uFF1A\u6E05\u5355\u4E0E\u4E09\u9636\u6BB5\u9884\u89C8\u5207\u5230\u5BF9\u5E94 scope\u3002\n // version \u5165\u4F9D\u8D56\uFF1A\u4FDD\u5B58/\u5199\u914D\u7F6E\u6210\u529F\u540E +1\uFF0C\u9A71\u52A8\u91CD\u65B0\u62C9\u53D6\uFF08\u5426\u5219\u4E00\u76F4\u663E\u793A\u4FDD\u5B58\u524D\u7684\u88C5\u914D\uFF09\u3002\n useEffect(() => { void refresh() }, [target, version])\n\n // \u8349\u7A3F\u5B9E\u65F6\u9884\u89C8\uFF1A\u628A\u672A\u4FDD\u5B58\u7684\u7F16\u8F91\u8349\u7A3F\u8865\u4E01 POST \u7ED9 /preview\uFF08\u670D\u52A1\u7AEF\u53EA\u5728\u5185\u5B58\u91CC\n // \u53E0\u52A0\uFF0C\u78C1\u76D8\u4E0D\u52A8\uFF09\uFF0C\u53EA\u5237\u65B0\u5F53\u524D\u9636\u6BB5\u89C6\u56FE \u2014\u2014 \u9884\u89C8\u968F\u6539\u968F\u52A8\uFF1B\u4FDD\u5B58\u540E\u7684 GET \u5168\u91CF\n // \u62C9\u53D6\u4F1A\u8986\u76D6\u56DE\u6743\u5A01\u72B6\u6001\u3002syncSeq \u8BA9\u8FC7\u671F\u54CD\u5E94\uFF08\u53C8\u7F16\u8F91\u4E86 / \u5DF2\u4FDD\u5B58\uFF09\u76F4\u63A5\u4E22\u5F03\u3002\n const syncDraftPreview = (): void => {\n if (draft === null || !draft.dirty) return\n const patch: Record<string, unknown> = {}\n const source = draft as unknown as Record<string, unknown>\n for (const field of DRAFT_FIELDS) {\n if (Object.hasOwn(source, field)) patch[field] = source[field]\n }\n if (Object.keys(patch).length === 0) return\n const seq = ++syncSeq.current\n // scope \u8D70\u67E5\u8BE2\u4E32\uFF08\u670D\u52A1\u7AEF previewTarget \u53EA\u8BA4 query\uFF09\uFF1A\u8349\u7A3F\u8865\u4E01\u5FC5\u987B\u843D\u5728\n // \u5F53\u524D\u7F16\u8F91\u7684\u9884\u8BBE\u4E0A\uFF0C\u5426\u5219\u751F\u6548\u89C6\u56FE\u4E3A\u7A7A\u3001\u9884\u89C8\u9000\u56DE\u5B98\u65B9\u539F\u6837\u3002\n const scopeQs = target !== undefined ? `?scope=${encodeURIComponent(target)}` : ''\n fetch(PREVIEW_URL + scopeQs, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch, phase }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok === false) throw new Error(body?.error ?? 'preview failed')\n if (seq !== syncSeq.current) return // \u8FC7\u671F\u54CD\u5E94\uFF1A\u8349\u7A3F\u53C8\u53D8\u4E86\u6216\u5DF2\u4FDD\u5B58\uFF0C\u4E22\u5F03\n setPhases((prev) => (prev === null ? prev : { ...prev, [phase]: body as Preview }))\n setError(null)\n })\n .catch((e: unknown) => {\n // \u5B9E\u65F6\u9884\u89C8\u5931\u8D25\u4E0D\u518D\u9759\u9ED8\uFF1A\u6D88\u606F\u6761\u63D0\u793A\uFF08\u4E0B\u4E00\u6B21\u6210\u529F\u4F1A\u81EA\u52A8\u6E05\u9664\uFF09\u3002\u4FDD\u5B58\u540E\n // \u7684\u5168\u91CF\u5237\u65B0\u4ECD\u4F1A\u8986\u76D6\u56DE\u6743\u5A01\u72B6\u6001\uFF0C\u4E0D\u5F71\u54CD\u7F16\u8F91\u3002\n setError(`${t('previewSyncFail')}\uFF1A${e instanceof Error ? e.message : String(e)}`)\n })\n }\n // \u7F16\u8F91\uFF08draft \u8EAB\u4EFD\u53D8\u5316\uFF09\u3001\u5207\u6362\u9636\u6BB5 / \u7F16\u8F91\u76EE\u6807\u540E\uFF1A\u9632\u6296 600ms \u540C\u6B65\u4E00\u6B21\u3002\n useEffect(() => {\n if (draft === null || !draft.dirty) return undefined\n const timer = setTimeout(syncDraftPreview, 600)\n return () => { clearTimeout(timer) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [draft, phase, target])\n\n // \u679A\u4E3E\u5DF2\u5B89\u88C5\u7684 agent \u9884\u8BBE\uFF08roster \u5B9E\u65F6\u8BFB\u53D6\uFF09\uFF0C\u7ED9\u9876\u90E8\u9884\u8BBE Tab \u4F9B\u8D27\u3002\n // \u62BD\u6210\u51FD\u6570\uFF1A\u4FDD\u5B58\u9884\u8BBE\u6210\u529F\u540E\u4E5F\u8981\u7ACB\u5373\u5237\u65B0 Tab \u884C\u3002\n const fetchPresets = (): void => {\n fetch(AGENT_PRESETS_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => setAgentPresets(Array.isArray(body?.presets) ? body.presets as AgentPresetInfo[] : []))\n .catch(() => setAgentPresets([]))\n }\n useEffect(() => { fetchPresets() }, [])\n\n // \u9ED8\u8BA4\u7F16\u8F91\u76EE\u6807\uFF1A\u9884\u8BBE\u540D\u5355\u5F02\u6B65\u5230\u8FBE\u540E\u8865\u9009\u4E00\u6B21\uFF08\u9996\u4E2A\u53EF\u7528\u9884\u8BBE\uFF0C\u5168\u5931\u6548\u5219\u9996\u4E2A\uFF09\u3002\n // \u53EA\u5728\u5C1A\u672A\u9009\u62E9\u65F6\u751F\u6548 \u2014\u2014 \u7528\u6237\u6B64\u540E\u5207\u6362 / \u540D\u5355\u5237\u65B0\u90FD\u4E0D\u8986\u76D6\u5F53\u524D\u9009\u62E9\u3002\n useEffect(() => {\n setTarget((current) => {\n if (current !== undefined) return current\n const first = agentPresets.find((p) => !p.broken) ?? agentPresets[0]\n return first?.id\n })\n }, [agentPresets])\n\n // \u4FDD\u5B58\u6210\u529F/\u5931\u8D25\u540E\u7684\u77ED\u4FC3\u95EA\u793A\u6D88\u606F\uFF083 \u79D2\u81EA\u52A8\u6D88\u5931\uFF1Berr \u7528\u7EA2\u8272\u6837\u5F0F\uFF09\u3002\n const showFlash = (text: string, kind: 'ok' | 'err' = 'ok'): void => {\n if (flashTimer.current !== null) clearTimeout(flashTimer.current)\n setFlash(text)\n setFlashKind(kind)\n flashTimer.current = setTimeout(() => setFlash(null), 3200)\n }\n\n // \u4E22\u5F03\u8349\u7A3F\uFF1A\u9012\u589E\u540C\u6B65\u5E8F\u53F7\uFF0C\u4F5C\u5E9F\u5728\u9014\u7684\u8349\u7A3F\u9884\u89C8\u54CD\u5E94\uFF08\u4FDD\u5B58\u540E GET \u4F1A\u6574\u4F53\u8986\u76D6\uFF0C\n // \u8FC7\u671F\u54CD\u5E94\u7EDD\u4E0D\u80FD\u53CD\u8FC7\u6765\u76D6\u6389\u6743\u5A01\u6570\u636E\uFF09\u3002\n const clearDraft = (): void => {\n syncSeq.current += 1\n setDraft(null)\n }\n\n if (cfg === null) {\n return h('div', { style: { ...s.pRoot, padding: 16 } }, t('loading'))\n }\n\n // \u7F16\u8F91\u89C6\u56FE\uFF1A\u8349\u7A3F\u5B58\u5728\u65F6\u4EE5\u8349\u7A3F\u8986\u76D6\u5BF9\u5E94\u5B57\u6BB5\uFF08\u4E24\u680F\u5171\u4EAB\u7F16\u8F91\u57DF\uFF09\u3002\n // \u8349\u7A3F\u53EA\u542B\u7528\u6237\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\uFF0C\u672A\u7F16\u8F91\u5B57\u6BB5\u56DE\u843D\u57FA\u7EBF \u2014\u2014 \u7EDD\u4E0D\u628A\u7EE7\u627F\u503C\n // \u51BB\u7ED3\u8FDB override\u3002\n const base = editView(cfg, target)\n const view: Config = draft\n ? {\n ...base,\n sections: draft.sections ?? base.sections,\n sectionsBootstrap: draft.sectionsBootstrap ?? base.sectionsBootstrap,\n sectionsCompaction: draft.sectionsCompaction ?? base.sectionsCompaction,\n replace: draft.replace ?? base.replace,\n inject: draft.inject ?? base.inject,\n tools: draft.tools ?? base.tools,\n }\n : base\n\n const writeField = (field: string, value: unknown): void => {\n const url = value === undefined ? CONFIG_UNSET_URL : CONFIG_SET_URL\n fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ field, value }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'write failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n\n // \u4E24\u680F\u7684\u5199\u5165\uFF1A\u53EA\u6539\u5185\u5B58\u8349\u7A3F\uFF0C\u4E0D\u843D\u76D8\u3002\u8349\u7A3F\u53EA\u8BB0\u5F55\u88AB\u7F16\u8F91\u7684\u8FD9\u4E00\u5B57\u6BB5 \u2014\u2014 \u4FDD\u5B58\u65F6\n // \u4E5F\u53EA\u4F1A\u63D0\u4EA4\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\u3002/config/apply \u5FC5\u5E26 target\uFF08agent \u9884\u8BBE id\uFF0C0.9.0\n // \u8D77\u670D\u52A1\u7AEF\u62D2\u7EDD\u65E0\u76EE\u6807\u5199\u76D8\uFF09\uFF0C\u5199 overrides[id]\uFF08\u5B57\u6BB5\u7EA7\u63A5\u7BA1\u8BED\u4E49\u5728\u4FDD\u5B58\u65F6\u751F\u6548\uFF09\u3002\n const edit = (field: EditField, value: unknown): void => {\n setDraft((d) => ({\n ...(d ?? { dirty: false }),\n [field]: value,\n dirty: true,\n }))\n }\n\n // \u7EDF\u4E00\u4FDD\u5B58\uFF1A\u8349\u7A3F\u91CC\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\u4E00\u6B21 POST \u5230 /config/apply\uFF0C\u6210\u529F\u540E\u6E05\n // \u8349\u7A3F\u5E76\u91C7\u7EB3\u6700\u65B0\u914D\u7F6E\u3002\u5931\u8D25\u65F6\u4FDD\u7559\u8349\u7A3F\uFF08\u6539\u5B8C\u53EF\u4EE5\u518D\u8BD5\uFF0C\u4E0D\u4F1A\u4E22\uFF09\u3002\n const save = (): void => {\n if (draft === null || saving) return\n const EDITED_FIELDS = ['sections', 'sectionsBootstrap', 'sectionsCompaction', 'replace', 'inject', 'tools'] as const\n const patch: Record<string, unknown> = {}\n for (const field of EDITED_FIELDS) {\n if (Object.hasOwn(draft, field)) patch[field] = draft[field]\n }\n setSaving(true)\n fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'save failed')\n setCfg(body.config as Config)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('saveOk'))\n })\n .catch((e: unknown) => setError(`${t('saveFail')}: ${e instanceof Error ? e.message : String(e)}`))\n .finally(() => setSaving(false))\n }\n\n // \u9884\u8BBE\u6A21\u5F0F\u7684\u300C\u5E94\u7528\u300D\uFF1A\u663E\u5F0F\u610F\u56FE\u76F4\u63A5\u843D\u76D8\uFF08\u4E0D\u7ECF\u8349\u7A3F\uFF09\uFF0C\u5B8C\u6574\u8865\u4E01\u4E00\u6B21\u5199\u5165\u5F53\u524D\n // \u7F16\u8F91\u76EE\u6807\u3002\u8C03\u7528\u70B9\u5DF2\u5728\u79BB\u5F00\u7F16\u8F91\u57DF\u65F6\u6E05\u7A7A\u8349\u7A3F\uFF0C\u4E0D\u4F1A\u6709\u5E76\u53D1\u8349\u7A3F\u5199\u76D8\u3002\n const writePatch = (patch: ConfigPatch): void => {\n fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'apply failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n // \u9884\u8BBE\u5E93\uFF08presets / activePreset\uFF09\u6C38\u8FDC\u4FDD\u6301\u5728\u5168\u5C40\u5B57\u6BB5\uFF0C\u4E0D\u5206\u4F5C\u7528\u57DF\u3002\n const writeGlobal = writeField\n\n // \u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u5173\uFF08\u5934\u90E8\u5DE5\u5177\u680F\uFF09\uFF1A\u5F00 = \u628A\u540D\u5B57\u5BF9\u5F97\u4E0A\u8BD1\u672C\uFF08lib/zh/\uFF09\u7684\u6BB5\n // \u4E00\u6B21\u6027\u8986\u76D6\u4E3A\u4E2D\u6587\uFF0C\u5173 = \u6E05\u6389\u8FD9\u4E9B\u6BB5\u7684\u66FF\u6362\u6587\u672C\u56DE\u5F52\u82F1\u6587 \u2014\u2014 \u4E24\u4E2A\u65B9\u5411\u90FD\u8D70\u7F16\u8F91\n // \u8349\u7A3F\uFF08edit\uFF09\uFF0C\u4E0E\u624B\u52A8\u7F16\u8F91\u540C\u4E00\u6761\u4FDD\u5B58\u8DEF\u5F84\u3002\u72B6\u6001\u4ECE\u914D\u7F6E\u63A2\u6D4B\uFF08zhApplied\uFF09\u3002\n // \u4E09\u9636\u6BB5\u88C5\u914D\u672A\u5C31\u7EEA\u65F6\u62D2\u7EDD\u6267\u884C\uFF08\u5426\u5219\u4F1A\u628A\u5BF9\u5E94\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\u5F53\u4F5C\u7A7A\u96C6\u5199\u6389\uFF09\u3002\n const zhOn = zhApplied(view, ZH_SECTIONS)\n // \u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u542F\u65F6\uFF0C\u4ECE\u6C60\u91CC\u52A0\u5165\u7684\u6BB5\u4F18\u5148\u7528\u8BD1\u672C\u6587\u672C\uFF1A\u6CA1\u8FDB\u8FC7\u9762\u677F\u7684\u6BB5\uFF08\u5982\n // agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684 tool:subagent / context:file-reference\uFF09\u4E5F\u80FD\u4E00\u952E\u63A5\u7BA1\n // \u6210\u4E2D\u6587\u3002\u8BD1\u672C\u7F3A\u5E2D\u6216\u51FD\u6570\u8BD1\u672C\u8FD4\u56DE\u7A7A = \u4FDD\u6301\u6C60\u91CC\u539F\u6587\u3002\n const poolText = (name: string, fallback: string): string => {\n if (!zhOn) return fallback\n const entry = (ZH_SECTIONS as Record<string, unknown>)[name]\n const zh = typeof entry === 'function' ? (entry as (source: string) => unknown)(fallback) : entry\n return typeof zh === 'string' && zh !== '' ? zh : fallback\n }\n const toggleZh = (): void => {\n if (phases === null || phases.bootstrap === null || phases.active === null || phases.compaction === null) {\n showFlash(t('zhNotReady'), 'err')\n return\n }\n edit('inject', zhOn ? zhRevertInjectEntries(view, phases, ZH_SECTIONS) : zhMergedInjectEntries(view, phases, ZH_SECTIONS))\n showFlash(zhOn ? t('zhReverted') : t('zhApplied'))\n }\n\n /** \u8BE5\u6BB5\u662F\u5426\u5728\u76EE\u6807\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\uFF08base \u89C6\u56FE\uFF09\u91CC\uFF1A\u955C\u50CF\u65F6\u636E\u6B64\u51B3\u5B9A\u300C\u53EA\u5199 order\u300D\u8FD8\u662F\u300C\u5FC5\u987B\u5E26\u6B63\u6587\u300D\u3002 */\n const nativeIn = (key: PhaseViewKey, name: string): boolean | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n return (view.baseSections ?? []).some((sec) => sec.name === name)\n }\n\n // \u300C\u4E09\u6001\u540C\u6B65\u300D\u5F00\u5173\uFF08\u5934\u90E8\u5DE5\u5177\u680F\uFF09\uFF1A\u52FE\u9009\u77AC\u95F4\u5373\u6309\u5E38\u9A7B\u671F\u7684\u5E76\u96C6\u884C\u96C6\u8986\u5199\u53E6\u5916\u4E24\u6001\n // \uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\uFF1B\u4E4B\u540E\u63D0\u793A\u8BCD\u680F\u7684\u4EFB\u4F55\n // \u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u90FD\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08\u89C1 SectionsPane \u7684 persistMirror\uFF09\u3002\n // \u4E09\u9636\u6BB5\u88C5\u914D\u672A\u5C31\u7EEA\uFF08\u6216\u4E3A\u7A7A\uFF09\u65F6\u62D2\u7EDD\u6267\u884C \u2014\u2014 \u7F3A\u4E00\u6001\u4F1A\u628A\u8BE5\u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\u3002\n const toggleSyncAll = (on: boolean): void => {\n setSyncAll(on)\n if (!on) return\n if (phases === null || VIEW_KEYS.some((key) => phases[key] === null)) {\n showFlash(t('syncNotReady'), 'err')\n return\n }\n const rows = mirroredRows(view, phases, nativeIn)\n if (rows.length === 0) {\n showFlash(t('syncNotReady'), 'err')\n return\n }\n edit('inject', mirrorPhaseInjectEntries(view, rows, nativeIn))\n const denied = mirroredDeniedLists(rows)\n edit('sections', denied.sections)\n edit('sectionsBootstrap', denied.sectionsBootstrap)\n edit('sectionsCompaction', denied.sectionsCompaction)\n const skipped = mirrorSkippedNames(rows, nativeIn)\n showFlash(skipped.length > 0\n ? `${t('syncApplied')} ${t('syncSkippedDynamic', { names: skipped.join('\u3001') })}`\n : t('syncApplied'))\n }\n\n // \u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u670D\u52A1\u7AEF\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u5173\u95ED forceSections\uFF08\u4E0E\u4E0D\u88C5\u63D2\u4EF6\u7B49\u6548\uFF09\u3002\n // \u4E8C\u6B21\u786E\u8BA4\u7531\u8BBE\u7F6E\u680F\u7684\u8C03\u7528\u70B9\u8D1F\u8D23\uFF1B\u6210\u529F\u540E\u6E05\u8349\u7A3F\u3001\u91CD\u62C9\u5168\u90E8\u89C6\u56FE\u3002\n const resetAll = (): void => {\n fetch(CONFIG_RESET_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'reset failed')\n setCfg(body.config as Config)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('resetOk'))\n })\n .catch((e: unknown) => setError(`${t('resetFail')}: ${e instanceof Error ? e.message : String(e)}`))\n }\n\n // \u5207\u6362\u6A21\u5F0F\uFF1A\u63D0\u793A\u8BCD \u2194 \u5DE5\u5177\u662F\u540C\u4E00\u7F16\u8F91\u57DF\uFF0C\u8349\u7A3F\u4FDD\u7559\uFF1B\u5207\u5230\u9884\u8BBE\u5373\u79BB\u5F00\u7F16\u8F91\u57DF\uFF0C\n // \u810F\u8349\u7A3F\u7ECF\u786E\u8BA4\u540E\u4E22\u5F03\u3002\u53F3\u680F\u9884\u89C8\u5B50\u89C6\u56FE\u8DDF\u968F\u6A21\u5F0F\u3002\n const switchMode = (next: PanelMode): void => {\n const leaving = (mode === 'sections' || mode === 'tools') && next === 'presets'\n if (leaving) {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n clearDraft()\n }\n setMode(next)\n setPreviewSub(next === 'tools' ? 'tools' : 'prompt')\n }\n\n // \u5207\u6362\u7F16\u8F91\u76EE\u6807\uFF08\u9876\u90E8\u9884\u8BBE Tab\uFF09\uFF1A\u8349\u7A3F\u57FA\u7EBF\u968F\u76EE\u6807\u53D8\u5316\uFF0C\u810F\u8349\u7A3F\u5148\u7ECF\u786E\u8BA4\u518D\u4E22\u5F03\u3002\n const switchTarget = (next: string | undefined): void => {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n clearDraft()\n setTarget(next)\n }\n\n // \u300C\u5B58\u4E3A\u9884\u8BBE\u300D\uFF1A\u628A\u5F53\u524D\u7F16\u8F91\u5185\u5BB9\uFF08\u542B\u672A\u4FDD\u5B58\u8349\u7A3F\uFF09fork \u6210\u4E00\u4E2A\u65B0\u7684 agent \u9884\u8BBE \u2014\u2014\n // \u5BBF\u4E3B authoring API \u6574\u4F53\u590D\u5236\u6765\u6E90\u9884\u8BBE\u76EE\u5F55\uFF08\u7EC4\u6210\u6587\u4EF6 / \u4F34\u751F .mjs / \u6280\u80FD\u76EE\u5F55\uFF09\uFF0C\n // \u540C\u65F6\u628A\u5F53\u524D\u914D\u7F6E\u5199\u8FDB overrides[name]\u3002\u6765\u6E90 = \u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1B\u5168\u5C40\u76EE\u6807\u7531\u670D\u52A1\u7AEF\n // \u56DE\u843D\u5230 roster \u9ED8\u8BA4\u9884\u8BBE\u3002\u540D\u5B57\u975E\u6CD5 / \u540C\u540D\u7531\u670D\u52A1\u7AEF\u62A5\u9519\u3002\n const saveAsPreset = (presetName: string): Promise<boolean> => {\n const name = presetName.trim()\n if (name.length === 0) return Promise.resolve(false)\n return fetch(PRESETS_CREATE_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n name,\n from: target,\n config: {\n sections: view.sections ?? [],\n sectionsBootstrap: view.sectionsBootstrap ?? [],\n sectionsCompaction: view.sectionsCompaction ?? [],\n replace: view.replace ?? {},\n inject: view.inject ?? [],\n tools: view.tools ?? {},\n },\n }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? t('saveAsPresetFail'))\n load()\n fetchPresets()\n showFlash(t('saveAsPresetOk'), 'ok')\n return true\n })\n .catch((e: unknown) => {\n showFlash(`${t('saveAsPresetFail')}\uFF1A${String(e instanceof Error ? e.message : e)}`, 'err')\n return false\n })\n }\n\n const modeBtn = (key: PanelMode, label: string): ReactElement =>\n h('button', { key, style: mode === key ? s.segBtnActive : s.segBtn, onClick: () => switchMode(key) }, label)\n\n // \u9636\u6BB5\u6309\u94AE\u547D\u540D\uFF08\u5934\u90E8\u5408\u5E76\u63A7\u5236\uFF1A\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n const draftDirty = draft?.dirty === true\n\n /**\n * \u7F16\u8F91\u76EE\u6807 chip\uFF1A\u4E0E SKILL / MCP \u9876\u680F\u7684\u9884\u8BBE chips \u7528\u540C\u4E00\u5957\u7C7B\u540D\uFF08\u51E0\u4F55\u3001\u914D\u8272\u3001\n * \u60AC\u505C\u4E0E\u9009\u4E2D\u6001\u5B8C\u5168\u5BF9\u9F50\uFF09\u3002\u5C3E\u90E8\u6570\u5B57 = \u8BE5\u9884\u8BBE\u5DF2\u5B9A\u5236\u7684\u5B57\u6BB5\u6570\uFF08\u6709\u5219\u6A59\u8272\uFF09\uFF0C\n * \u4E0E MCP \u7684\u300C\u6570\u5B57 + \u6A59\u8272 = \u6709\u5355\u72EC\u8BBE\u7F6E\u300D\u540C\u4E00\u8BFB\u6CD5\uFF1B\u5931\u6548\u9884\u8BBE\u7F6E\u6362\u6210\u300C\u5931\u6548\u300D\u6807\u8BB0\u3002\n */\n const targetChip = (id: string, label: string, icon: ReactElement, broken?: string): ReactElement => {\n const active = target === id\n const bad = broken !== undefined && broken !== ''\n const customized = Object.keys(cfg?.overrides?.[id] ?? {}).length\n return h('button', {\n key: id,\n type: 'button',\n className: css.catItem,\n 'data-active': active || undefined,\n onClick: () => switchTarget(id),\n title: bad\n ? `${label} \u2014 ${t('broken')}`\n : customized > 0 ? `${label} \u00B7 ${t('targetCustomized', { n: customized })}` : label,\n }, [\n h('span', { className: css.catIcon, 'data-active': active || undefined }, icon),\n h('span', { className: css.catLabel }, label),\n bad ? h('span', { className: css.catCount, 'data-warn': true }, t('broken')) : null,\n !bad && customized > 0 ? h('span', { className: css.catCount, 'data-warn': true }, String(customized)) : null,\n ])\n }\n\n return h('div', { style: s.pRoot }, [\n // \u2500\u2500 \u7B2C\u4E00\u884C\uFF1Aagent \u9884\u8BBE\uFF08\u7F16\u8F91\u76EE\u6807\uFF09\u2500\u2500\n // \u4E0E SKILL / MCP \u9876\u680F\u540C\u6B3E chips \u884C\uFF08\u540C\u4E00\u5957\u7C7B\u540D + \u56FE\u6807 + \u8BA1\u6570\uFF09\uFF0C\u4E14\u6392\u5728\n // \u5B9A\u5236\u9762\u677F\u81EA\u5DF1\u7684\u5934\u90E8\u4E4B\u4E0A\uFF1A\u4E09\u4E2A tab \u7684\u300C\u9884\u8BBE\u5728\u4E0A\u300D\u8282\u594F\u4E00\u81F4\u3002\n // 0.9.0 \u8D77\u300C\u5168\u90E8 Agent\u300D\u5165\u53E3\u79FB\u9664\uFF1A\u63D0\u793A\u8BCD\u5FC5\u987B\u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF0C\u65E0\u5168\u5C40\u76EE\u6807\u3002\n h('div', { key: 'targets', className: css.topbar }, [\n h('div', { className: css.chipRow, role: 'group', 'aria-label': t('targetLabel') }, [\n ...agentPresets.map((p) => targetChip(p.id, p.name, h(IconAgentPresetOutlineRegular, { size: 15 }), p.broken)),\n ]),\n ]),\n // \u2500\u2500 \u7B2C\u4E8C\u884C\uFF1A\u6807\u9898 + \u6A21\u5F0F\u5207\u6362 + \uFF08\u9636\u6BB5\u5207\u6362 + \u5F00\u5173\uFF09 + \u5DE5\u5177\u680F \u2500\u2500\n // \u9636\u6BB5\u6309\u94AE\u5408\u5E76\u653E\u5728\u4E09\u6001\u540C\u6B65\u9009\u62E9\u6846\u5DE6\u4FA7\uFF1A\u5DE6\u680F\u5217\u8868\u4E0E\u53F3\u680F\u9884\u89C8\u8DDF\u7740\u540C\u4E00\u4E2A\n // \u9636\u6BB5\u72B6\u6001\u8D70\uFF0C\u4E00\u5904\u5207\u6362\u4E24\u8FB9\u8054\u52A8\u3002\u4EC5\u5728\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u4E2A\u6A21\u5F0F\u663E\u793A\u3002\n h('div', { style: s.head }, [\n h('span', { style: s.headTitle }, [\n h('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': 'true', style: { flex: 'none' } }, [\n h('path', { d: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z' }),\n h('path', { d: 'M14 2v6h6' }),\n h('path', { d: 'M16 13H8' }),\n h('path', { d: 'M16 17H8' }),\n h('path', { d: 'M10 9H8' }),\n ]),\n t('nav'),\n ]),\n h('div', { style: s.seg }, [\n modeBtn('sections', t('tabsSections')),\n modeBtn('tools', t('tabsTools')),\n modeBtn('presets', t('tabsPresets')),\n ]),\n h('div', { style: s.headActions }, [\n mode === 'sections' || mode === 'tools'\n ? h('div', { style: s.seg }, VIEW_KEYS.map((key) => h('button', {\n key,\n style: dropPhase === key\n ? (phase === key ? s.segBtnDropActive : s.segBtnDrop)\n : phase === key ? s.segBtnActive : s.segBtn,\n onClick: () => setPhase(key),\n // \u62D6\u5230\u9636\u6BB5 Tab = \u628A\u884C\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u6BB5 / \u5DE5\u5177\u5404\u6309\u81EA\u5DF1\u7684\u8BED\u4E49\u843D\u5730\uFF09\u3002\n onDragOver: (event: ReactDragEvent) => {\n if (payloadOf(event) === null) return\n event.preventDefault()\n setDropPhase(key)\n },\n onDragLeave: () => setDropPhase((current) => (current === key ? null : current)),\n onDrop: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n setDropPhase(null)\n if (payload === null) return\n event.preventDefault()\n dropOnPhase(key, payload)\n },\n }, stageLabel(key))))\n : null,\n draftDirty && (mode === 'sections' || mode === 'tools')\n ? h('span', { style: s.badgeReplaced, title: t('draftBadge') }, t('draftBadge'))\n : null,\n mode === 'sections' || mode === 'tools'\n ? h('label', {\n style: { ...s.muted, display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer', whiteSpace: 'nowrap' },\n title: t('syncAllPhasesHint'),\n }, [\n h('input', {\n type: 'checkbox',\n checked: syncAll,\n onChange: (e: { target: { checked: boolean } }) => toggleSyncAll(e.target.checked),\n style: { margin: 0, cursor: 'pointer' },\n }),\n t('syncAllPhases'),\n ])\n : null,\n mode === 'sections'\n ? h('label', {\n style: { ...s.muted, display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer', whiteSpace: 'nowrap' },\n title: t('zhHint'),\n }, [\n h('input', {\n type: 'checkbox',\n checked: zhOn,\n onChange: toggleZh,\n style: { margin: 0, cursor: 'pointer' },\n }),\n t('zhSwitch'),\n ])\n : null,\n h('button', {\n style: draft?.dirty ? s.saveBtnDirty : s.saveBtn,\n disabled: !draft?.dirty || saving,\n onClick: save,\n }, t('save')),\n // \u5237\u65B0 = GET \u78C1\u76D8\u6743\u5A01\u72B6\u6001\uFF1B\u6709\u810F\u8349\u7A3F\u65F6\u518D\u8865\u4E00\u6B21\u5F53\u524D\u9636\u6BB5\u7684\u8349\u7A3F\u53E0\u52A0\u9884\u89C8\uFF0C\n // \u907F\u514D\u9884\u89C8\u77ED\u6682\u56DE\u9000\u5230\u300C\u4E0A\u6B21\u4FDD\u5B58\u300D\u7684\u72B6\u6001\u3002\n h('button', { style: s.saveBtn, onClick: () => { void refresh().then(() => syncDraftPreview()) } }, t('refresh')),\n // \u5173\u95ED\u6309\u94AE\u53EA\u5728\u72EC\u7ACB\u5F00\u7A97\u65F6\u7ED9\u51FA\uFF08onClose \u7F3A\u7701 = \u7531\u5916\u5C42 tab \u627F\u8F7D\uFF0C\u4E0D\u9700\u8981\u5B83\uFF09\u3002\n onClose === undefined ? null : h('button', { style: s.iconBtn, onClick: onClose, 'aria-label': t('close'), title: t('close') },\n h('svg', { width: 15, height: 15, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': 'true' }, [\n h('path', { d: 'M4 4l8 8M12 4l-8 8', stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round' }),\n ])),\n ]),\n ]),\n // \u2500\u2500 \u6D88\u606F\u6761\uFF08\u9519\u8BEF / \u95EA\u793A / \u76EE\u6807\u5F02\u5E38\u8B66\u793A\uFF09 \u2500\u2500\n h('div', { style: { padding: '0 14px' } }, [\n error ? h('div', { style: s.error }, String(error)) : null,\n flash ? h('div', { style: flashKind === 'err' ? s.error : s.noticeOk }, flash) : null,\n target && agentPresets.find((p) => p.id === target)?.broken\n ? h('div', { style: s.error }, t('brokenPreset'))\n : null,\n inv?.scopeResolved === false && mode !== 'presets'\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n ]),\n // \u2500\u2500 \u4E3B\u4F53\u5206\u680F\uFF08flex row\uFF1A\u5DE6\u680F\u5217\u8868 / \u53F3\u680F\u9884\u89C8\uFF09\u2500\u2500\n // \u9876\u90E8\u9009\u300C\u63D0\u793A\u8BCD\u300D= \u63D0\u793A\u8BCD\u7F16\u8F91 + \u63D0\u793A\u8BCD\u9884\u89C8\uFF1B\u9009\u300C\u5DE5\u5177\u300D= \u5DE5\u5177\u7F16\u8F91 +\n // \u5DE5\u5177\u9884\u89C8\uFF08previewSub \u8DDF\u968F\u6A21\u5F0F\uFF0C\u65E0\u624B\u52A8\u5207\u6362\uFF09\u3002\u9636\u6BB5\u7531\u5934\u90E8\u7EDF\u4E00\u63A7\u5236\u3002\n h('div', { key: 'body', style: s.body },\n mode === 'sections'\n ? [\n h(SectionsPane, { key: 'sections', cfg: view, inv, phases, phase, syncAll, t, poolText, write: edit }),\n h(PreviewPane, { key: 'preview', t, phases, phase, sub: previewSub }),\n ]\n : mode === 'tools'\n ? [\n h(ToolsPane, { key: 'tools', cfg: view, inv, phases, phase, syncAll, t, write: edit }),\n h(PreviewPane, { key: 'preview', t, phases, phase, sub: previewSub }),\n ]\n : [\n h(PresetsPane, {\n key: 'presets',\n cfg: view,\n inv,\n phases,\n t,\n writePatch,\n writeGlobal,\n // \u9ED1\u540D\u5355\u6C38\u8FDC\u662F\u5168\u5C40\u5B57\u6BB5\uFF1A\u53D6\u539F\u59CB\u914D\u7F6E\uFF08\u4E0D\u7ECF editView \u7684\u76EE\u6807\u53E0\u52A0\uFF09\u3002\n envBlocklist: cfg.envBlocklist ?? [],\n }),\n h(SettingsPane, {\n key: 'settings',\n cfg: view,\n inv,\n t,\n writeGlobal,\n saveAsPreset,\n forkSource: target ? (agentPresets.find((p) => p.id === target)?.name ?? target) : undefined,\n onReset: resetAll,\n envBlocklist: cfg.envBlocklist ?? [],\n }),\n ]),\n ])\n}\n", "/**\n * skills/styles \u2014 \u9762\u677F\u5168\u5957\u6837\u5F0F\uFF1Acss \u7C7B\u540D\u8868 + \u6CE8\u5165\u7528\u7684 SHEET + ensureStyles()\u3002\n */\n\n/** ---------------------------------------------------------------- \u6837\u5F0F */\n\nexport const css = {\n entry: 'skm-entry',\n label: 'skm-label',\n // SKILL / MCP \u9876\u5C42 tab + MCP \u5360\u4F4D\n kindTabs: 'skm-kind-tabs',\n kindTab: 'skm-kind-tab',\n kindTabActive: 'skm-kind-tab-active',\n mcpEmpty: 'skm-mcp-empty',\n mcpEmptyIcon: 'skm-mcp-empty-icon',\n mcpEmptyTitle: 'skm-mcp-empty-title',\n mcpEmptyDesc: 'skm-mcp-empty-desc',\n mcpPage: 'skm-mcp-view-root',\n mcpViewRoot: 'skm-mcp-view-root',\n mcpSide: 'skm-mcp-side',\n mcpMain: 'skm-mcp-main',\n mcpServerLayout: 'skm-mcp-server-layout',\n mcpServerMain: 'skm-mcp-server-main',\n mcpHeader: 'skm-mcp-header',\n mcpHeaderText: 'skm-mcp-header-text',\n mcpHeaderTitleRow: 'skm-mcp-header-title-row',\n mcpHeaderTitle: 'skm-mcp-header-title',\n mcpHeaderBadge: 'skm-mcp-header-badge',\n mcpHeaderSub: 'skm-mcp-header-sub',\n mcpHeaderActions: 'skm-mcp-header-actions',\n mcpMarketBtn: 'skm-mcp-market-btn',\n mcpAddBtn: 'skm-mcp-add-btn',\n mcpBellBtn: 'skm-mcp-bell-btn',\n mcpEmptyList: 'skm-mcp-empty-list',\n mcpCopyHint: 'skm-mcp-copy-hint',\n mcpIntroCard: 'skm-mcp-intro-card',\n mcpIntroBody: 'skm-mcp-intro-body',\n mcpIntroTitle: 'skm-mcp-intro-title',\n mcpIntroDesc: 'skm-mcp-intro-desc',\n mcpIntroBtn: 'skm-mcp-intro-btn',\n mcpInfoOverlay: 'skm-mcp-info-overlay',\n mcpInfoOverlayHead: 'skm-mcp-info-overlay-head',\n mcpInfoOverlayIcon: 'skm-mcp-info-overlay-icon',\n mcpInfoOverlayTitle: 'skm-mcp-info-overlay-title',\n mcpInfoOverlayBody: 'skm-mcp-info-overlay-body',\n mcpRow: 'skm-mcp-row',\n mcpRowLogo: 'skm-mcp-row-logo',\n mcpRowBody: 'skm-mcp-row-body',\n mcpRowNameRow: 'skm-mcp-row-name-row',\n mcpRowName: 'skm-mcp-row-name',\n mcpRowTag: 'skm-mcp-row-tag',\n mcpRowExt: 'skm-mcp-row-ext',\n mcpRowDesc: 'skm-mcp-row-desc',\n mcpRowStatus: 'skm-mcp-row-status',\n mcpViewAll: 'skm-mcp-view-all',\n mcpAddSmallBtn: 'skm-mcp-add-small-btn',\n mcpRecommendTitle: 'skm-mcp-recommend-title',\n mcpRecHead: 'skm-mcp-rec-head',\n mcpRecCatsRow: 'skm-mcp-rec-cats-row',\n mcpRecResultsTitle: 'skm-mcp-rec-results-title',\n mcpRecStars: 'skm-mcp-rec-stars',\n mcpOpenLink: 'skm-mcp-open-link',\n mcpRecCardExternal: 'skm-mcp-rec-card-external',\n mcpResolveErr: 'skm-mcp-resolve-err',\n mcpExtActions: 'skm-mcp-ext-actions',\n mcpCardFoot: 'skm-mcp-card-foot',\n mcpCardItem: 'skm-mcp-card-item',\n mcpCardItemLabel: 'skm-mcp-card-item-label',\n mcpCardItemMeta: 'skm-mcp-card-item-meta',\n mcpCardDelete: 'skm-mcp-card-delete',\n mcpToolChips: 'skm-mcp-tool-chips',\n mcpToolChip: 'skm-mcp-tool-chip',\n mcpRecCats: 'skm-mcp-rec-cats',\n mcpRecCat: 'skm-mcp-rec-cat',\n mcpRecCatActive: 'skm-mcp-rec-cat-active',\n mcpRecGrid: 'skm-mcp-rec-grid',\n mcpRecCard: 'skm-mcp-rec-card',\n mcpRecCardHead: 'skm-mcp-rec-card-head',\n mcpRecCardTitleRow: 'skm-mcp-rec-card-title-row',\n mcpRecCardName: 'skm-mcp-rec-card-name',\n mcpRecCardTags: 'skm-mcp-rec-card-tags',\n mcpRecCatTag: 'skm-mcp-rec-cat-tag',\n mcpRecCardDesc: 'skm-mcp-rec-card-desc',\n mcpRecCardFoot: 'skm-mcp-rec-card-foot',\n mcpRecCardMeta: 'skm-mcp-rec-card-meta',\n mcpAddedTag: 'skm-mcp-added-tag',\n mcpAddForm: 'skm-mcp-add-form',\n mcpAddTypeRow: 'skm-mcp-add-type-row',\n mcpAddTypeBtn: 'skm-mcp-add-type-btn',\n mcpAddTypeActive: 'skm-mcp-add-type-active',\n mcpToolSearch: 'skm-mcp-tool-search',\n mcpToolSearchInput: 'skm-mcp-tool-search-input',\n mcpLogRow: 'skm-mcp-log-row',\n mcpLogDot: 'skm-mcp-log-dot',\n mcpLogBody: 'skm-mcp-log-body',\n mcpLogText: 'skm-mcp-log-text',\n mcpLogClear: 'skm-mcp-log-clear',\n mcpConfigGrid: 'skm-mcp-config-grid',\n mcpConfigCard: 'skm-mcp-config-card',\n mcpConfigHead: 'skm-mcp-config-head',\n mcpConfigTitle: 'skm-mcp-config-title',\n mcpConfigCopy: 'skm-mcp-config-copy',\n mcpConfigCode: 'skm-mcp-config-code',\n mcpInfoCol: 'skm-mcp-info-col',\n mcpInfoCard: 'skm-mcp-info-card',\n mcpInfoCardTitle: 'skm-mcp-info-card-title',\n mcpInfoDesc: 'skm-mcp-info-desc',\n mcpInfoPoints: 'skm-mcp-info-points',\n mcpPoint: 'skm-mcp-point',\n mcpPointIcon: 'skm-mcp-point-icon',\n mcpPointBody: 'skm-mcp-point-body',\n mcpPointTitle: 'skm-mcp-point-title',\n mcpPointDesc: 'skm-mcp-point-desc',\n mcpFlow: 'skm-mcp-flow',\n mcpFlowNode: 'skm-mcp-flow-node',\n mcpFlowIcon: 'skm-mcp-flow-icon',\n mcpFlowLabel: 'skm-mcp-flow-label',\n mcpFlowArrow: 'skm-mcp-flow-arrow',\n mcpFlowArrowText: 'skm-mcp-flow-arrow-text',\n mcpFlowExt: 'skm-mcp-flow-ext',\n mcpFlowExtLabel: 'skm-mcp-flow-ext-label',\n mcpFlowExtIcons: 'skm-mcp-flow-ext-icons',\n mcpFlowExtIcon: 'skm-mcp-flow-ext-icon',\n mcpApiText: 'skm-mcp-api-text',\n mcpSteps: 'skm-mcp-steps',\n mcpStep: 'skm-mcp-step',\n mcpStepNum: 'skm-mcp-step-num',\n mcpStepBody: 'skm-mcp-step-body',\n mcpStepTitle: 'skm-mcp-step-title',\n mcpStepDesc: 'skm-mcp-step-desc',\n modal: 'skm-modal',\n modalBody: 'skm-modal-body',\n panel: 'skm-panel',\n topRow: 'skm-top-row',\n newBundleButton: 'skm-new-bundle',\n upload: 'skm-upload',\n uploadActive: 'skm-upload-active',\n hiddenInput: 'skm-hidden-input',\n installForm: 'skm-install-form',\n installRow: 'skm-install-row',\n inlineForm: 'skm-inline-form',\n // \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u9876\u680F\u80F6\u56CA\u884C / \u5305\u540D\u65C1\u6807\u7B7E / \u5206\u7C7B\u7F16\u8F91\u5668\n stackForm: 'skm-stack-form',\n catChipRow: 'skm-cat-chip-row',\n catChipLabel: 'skm-cat-chip-label',\n catChip: 'skm-cat-chip',\n catChipCount: 'skm-cat-chip-count',\n bundleCats: 'skm-bundle-cats',\n bundleCatTag: 'skm-bundle-cat-tag',\n catEditor: 'skm-cat-editor',\n catEmpty: 'skm-cat-empty',\n catSelected: 'skm-cat-selected',\n catSelectedTag: 'skm-cat-selected-tag',\n catSelectedName: 'skm-cat-selected-name',\n catRemove: 'skm-cat-remove',\n catSuggest: 'skm-cat-suggest',\n catPreset: 'skm-cat-preset',\n catPresetPlus: 'skm-cat-preset-plus',\n catInput: 'skm-cat-input',\n catLimit: 'skm-cat-limit',\n // \u5757\u7EA7\u53D8\u4F53\uFF1A\u6539\u540D\u8F93\u5165\u884C\u72EC\u5360\u4E00\u6574\u884C\uFF08\u6574\u884C\u5185\u5BB9\u4FDD\u7559\uFF0C\u8868\u5355\u8FFD\u52A0\u5728\u5176\u4E0B\u65B9\uFF09\u3002\n inlineFormBlock: 'skm-inline-form-block',\n inlineInput: 'skm-inline-input',\n bundleSelect: 'skm-bundle-select',\n installMeta: 'skm-install-meta',\n installActions: 'skm-install-actions',\n sectionTitle: 'skm-section-title',\n status: 'skm-status',\n failure: 'skm-failure',\n error: 'skm-error',\n bundleList: 'skm-bundle-list',\n bundle: 'skm-bundle',\n bundleRow: 'skm-bundle-row',\n bundleName: 'skm-bundle-name',\n bundleCount: 'skm-bundle-count',\n chevron: 'skm-chevron',\n bundleActions: 'skm-bundle-actions',\n iconAction: 'skm-icon-action',\n skillList: 'skm-skill-list',\n skillItem: 'skm-skill-item',\n skillRow: 'skm-skill-row',\n skillLabel: 'skm-skill-label',\n skillName: 'skm-skill-name',\n skillDescription: 'skm-skill-desc',\n skillExpand: 'skm-skill-expand',\n skillCount: 'skm-skill-count',\n skillCompat: 'skm-skill-compat',\n // \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\n skillGrid: 'skm-skill-grid',\n skillCard: 'skm-skill-card',\n skillCardHead: 'skm-skill-card-head',\n skillIcon: 'skm-skill-icon',\n skillBadge: 'skm-skill-badge',\n skillTitleWrap: 'skm-skill-title-wrap',\n skillTitle: 'skm-skill-title',\n skillCopy: 'skm-skill-copy',\n skillCardToggle: 'skm-skill-card-toggle',\n skillDesc: 'skm-skill-card-desc',\n skillTags: 'skm-skill-tags',\n tag: 'skm-tag',\n tagSource: 'skm-tag-source',\n tagScope: 'skm-tag-scope',\n skillMeta: 'skm-skill-meta',\n skillCardFoot: 'skm-skill-card-foot',\n skillFootLabel: 'skm-skill-foot-label',\n skillFootIcon: 'skm-skill-foot-icon',\n skillCardActions: 'skm-skill-card-actions',\n // Skills Hub \u9875\u9762\u7ED3\u6784\n hub: 'skm-hub',\n hubRow: 'skm-hub-row',\n hubSide: 'skm-hub-side',\n topbar: 'skm-topbar',\n chipRow: 'skm-chip-row',\n hubBrand: 'skm-hub-brand',\n hubLogo: 'skm-hub-logo',\n hubBrandText: 'skm-hub-brand-text',\n hubBrandTitle: 'skm-hub-brand-title',\n hubBrandSub: 'skm-hub-brand-sub',\n hubGroup: 'skm-hub-group',\n hubItem: 'skm-hub-item',\n hubItemActive: 'skm-hub-item-active',\n hubItemIcon: 'skm-hub-item-icon',\n hubItemLabel: 'skm-hub-item-label',\n hubItemCount: 'skm-hub-item-count',\n // \u5DE6\u680F\uFF1A\u6280\u80FD\u5206\u7C7B / \u5FEB\u6377\u7B5B\u9009 / \u6DFB\u52A0\u6280\u80FD\u5361\n catTitle: 'skm-cat-title',\n catItem: 'skm-cat-item',\n catItemActive: 'skm-cat-item-active',\n catIcon: 'skm-cat-icon',\n catLabel: 'skm-cat-label',\n catCount: 'skm-cat-count',\n filterBlock: 'skm-filter-block',\n filterRow: 'skm-filter-row',\n filterRowLabel: 'skm-filter-row-label',\n filterRowLabelStrong: 'skm-filter-row-label-strong',\n filterRowChevron: 'skm-filter-row-chevron',\n filterRowWrap: 'skm-filter-row-wrap',\n filterMenu: 'skm-filter-menu',\n filterOption: 'skm-filter-option',\n presetDot: 'skm-preset-dot',\n filtersTitle: 'skm-filters-title',\n statusSeg: 'skm-status-seg',\n statusSegBtn: 'skm-status-seg-btn',\n statusSegActive: 'skm-status-seg-active',\n statusSegCount: 'skm-status-seg-count',\n topbarActions: 'skm-topbar-actions',\n healthInline: 'skm-health-inline',\n addCard: 'skm-add-card',\n addCardHead: 'skm-add-card-head',\n addCardIcon: 'skm-add-card-icon',\n addCardTitle: 'skm-add-card-title',\n addCardSub: 'skm-add-card-sub',\n addDrop: 'skm-add-drop',\n addDropIcon: 'skm-add-drop-icon',\n addDropText: 'skm-add-drop-text',\n addDropHint: 'skm-add-drop-hint',\n addBtn: 'skm-add-btn',\n // \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\n guideCard: 'skm-guide-card',\n guideTitle: 'skm-guide-title',\n guideDesc: 'skm-guide-desc',\n guideBtn: 'skm-guide-btn',\n guideArt: 'skm-guide-art',\n // \u53F3\u4FA7\u6307\u5357\u680F\n guidePanel: 'skm-guide-panel',\n guidePanelHead: 'skm-guide-panel-head',\n guidePanelLogo: 'skm-guide-panel-logo',\n guidePanelTitle: 'skm-guide-panel-title',\n guidePanelClose: 'skm-guide-panel-close',\n guidePanelBody: 'skm-guide-panel-body',\n guideSec: 'skm-guide-sec',\n guideSecHead: 'skm-guide-sec-head',\n guideSecIcon: 'skm-guide-sec-icon',\n guideSecTitle: 'skm-guide-sec-title',\n guideWhatDesc: 'skm-guide-what-desc',\n guideCaps: 'skm-guide-caps',\n guideCap: 'skm-guide-cap',\n guideCapIcon: 'skm-guide-cap-icon',\n guideCapLabel: 'skm-guide-cap-label',\n guideStep: 'skm-guide-step',\n guideStepNum: 'skm-guide-step-num',\n guideStepBody: 'skm-guide-step-body',\n guideStepTitleRow: 'skm-guide-step-title-row',\n guideStepTitle: 'skm-guide-step-title',\n guideStepArrow: 'skm-guide-step-arrow',\n guideStepDesc: 'skm-guide-step-desc',\n guideFullBtn: 'skm-guide-full-btn',\n guideBest: 'skm-guide-best',\n guideBestTitle: 'skm-guide-best-title',\n guideBestList: 'skm-guide-best-list',\n guideBestItem: 'skm-guide-best-item',\n guideMoreBtn: 'skm-guide-more-btn',\n guideBestArt: 'skm-guide-best-art',\n hubMain: 'skm-hub-main',\n // \u5206\u7EC4\u884C\n bundleRowOuter: 'skm-bundle-row-outer',\n bundleIcon: 'skm-bundle-icon',\n bundleMore: 'skm-bundle-more',\n bundleMoreBtn: 'skm-bundle-more-btn',\n // \u5206\u9875\n pagination: 'skm-pagination',\n pageInfo: 'skm-page-info',\n pageBtns: 'skm-page-btns',\n pageBtn: 'skm-page-btn',\n pageBtnActive: 'skm-page-btn-active',\n pageSizeSel: 'skm-page-size-sel',\n newBundleBtn: 'skm-new-bundle-btn',\n newBundleBtnOpen: 'skm-new-bundle-btn-open',\n toolbar: 'skm-toolbar',\n searchBox: 'skm-search-box',\n searchInput: 'skm-search-input',\n toolSelectWrap: 'skm-tool-select-wrap',\n toolSelect: 'skm-tool-select',\n toolSelectChevron: 'skm-tool-select-chevron',\n dropWrap: 'skm-drop-wrap',\n dropMenu: 'skm-drop-menu',\n dropItem: 'skm-drop-item',\n dropCheck: 'skm-drop-check',\n dropBadge: 'skm-drop-badge',\n toolButton: 'skm-tool-button',\n toolbarSpacer: 'skm-toolbar-spacer',\n bulkOverlay: 'skm-bulk-overlay',\n presetPill: 'skm-preset-pill',\n presetSelect: 'skm-preset-select',\n presetPillChevron: 'skm-preset-pill-chevron',\n presetPillLabel: 'skm-preset-pill-label',\n viewToggle: 'skm-view-toggle',\n viewBtn: 'skm-view-btn',\n hintRow: 'skm-hint-row',\n hintRowText: 'skm-hint-row-text',\n banner: 'skm-banner',\n bannerActive: 'skm-banner-active',\n bannerIcon: 'skm-banner-icon',\n bannerText: 'skm-banner-text',\n bannerTitle: 'skm-banner-title',\n bannerSub: 'skm-banner-sub',\n bannerBtn: 'skm-banner-btn',\n mainScroll: 'skm-main-scroll',\n hubSection: 'skm-hub-section',\n hubSectionHead: 'skm-hub-section-head',\n skillGridList: 'skm-skill-grid-list',\n noResult: 'skm-no-result',\n // \u5F52\u5165\u6280\u80FD\u5305\u5F39\u7A97\uFF08\u5361\u7247\u5316\uFF09\n assignModal: 'skm-assign-modal',\n assignModalBody: 'skm-assign-modal-body',\n assignList: 'skm-assign-list',\n assignCard: 'skm-assign-card',\n assignCardIcon: 'skm-assign-card-icon',\n assignCardBody: 'skm-assign-card-body',\n assignCardName: 'skm-assign-card-name',\n assignCardDesc: 'skm-assign-card-desc',\n assignGo: 'skm-assign-go',\n // \u540C\u6B65\u72B6\u6001\u5065\u5EB7\u68C0\u67E5\n healthNotice: 'skm-health-notice',\n healthNoticeTitle: 'skm-health-notice-title',\n skillFiles: 'skm-skill-files',\n skillFile: 'skm-skill-file',\n skillPreview: 'skm-skill-preview',\n viewerModal: 'skm-viewer-modal',\n viewerBody: 'skm-viewer-body',\n viewerLayout: 'skm-viewer-layout',\n viewerNav: 'skm-viewer-nav',\n viewerNavItem: 'skm-viewer-nav-item',\n viewerNavDir: 'skm-viewer-nav-dir',\n viewerContent: 'skm-viewer-content',\n viewerModalFull: 'skm-viewer-modal-full',\n viewerToolbar: 'skm-viewer-toolbar',\n viewerPath: 'skm-viewer-path',\n viewerToolGroup: 'skm-viewer-tool-group',\n viewerToolBtn: 'skm-viewer-tool-btn',\n viewerToolBtnA1: 'skm-viewer-tool-btn-a1',\n viewerToolBtnA3: 'skm-viewer-tool-btn-a3',\n viewerToolBtnFrame: 'skm-viewer-tool-btn-frame',\n looseEmpty: 'skm-loose-empty',\n visuallyHidden: 'skm-visually-hidden',\n // \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\n toggle: 'skm-toggle',\n toggleOn: 'skm-toggle-on',\n toggleOff: 'skm-toggle-off',\n toggleKnob: 'skm-toggle-knob',\n bundleToggle: 'skm-bundle-toggle',\n // Agent \u9884\u8BBE\u5206\u7C7B\uFF08\u5706\u7403\uFF09\n presetStrip: 'skm-preset-strip',\n presetBallWrap: 'skm-preset-ball-wrap',\n presetBall: 'skm-preset-ball',\n presetBallLabel: 'skm-preset-ball-label',\n presetHint: 'skm-preset-hint',\n presetHintText: 'skm-preset-hint-text',\n presetReset: 'skm-preset-reset',\n // \u7A7A\u6280\u80FD\u5305 / \u5931\u6548\u5F15\u7528 / \u9762\u677F\u7EA7\u63D0\u793A\u6761\n toastStack: 'skm-toast-stack',\n toast: 'skm-toast',\n toastOk: 'skm-toast-ok',\n toastErr: 'skm-toast-err',\n toastDot: 'skm-toast-dot',\n bundleEmpty: 'skm-bundle-empty',\n bundleEmptyTitle: 'skm-bundle-empty-title',\n bundleEmptyHint: 'skm-bundle-empty-hint',\n bundleEmptyBtn: 'skm-bundle-empty-btn',\n bundleMissing: 'skm-bundle-missing',\n bundleMissingBtn: 'skm-bundle-missing-btn',\n installHint: 'skm-install-hint',\n tagStatus: 'skm-tag-status',\n}\n\nexport const STYLE_ID = 'dsh-skill-manager-styles'\nexport const SHEET = `\n.skm-entry{flex:1 1 50%;min-width:0;display:inline-flex;align-items:center;gap:8px;height:32px;box-sizing:border-box;border:none;border-radius:10px;padding:0 8px;background:transparent;cursor:pointer;color:var(--dsw-alias-label-primary,#eee);font-family:inherit;font-size:14px;line-height:20px;overflow:hidden}\n.skm-entry:hover{background:transparent}\n.skm-entry[aria-expanded='true']{background:transparent;color:var(--dsw-alias-label-primary,#eee)}\n.skm-entry:focus,.skm-entry:focus-visible{outline:none;border:none}\n.skm-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-modal-body{overflow:hidden;display:flex;flex-direction:column}\n.skm-panel{flex:1;min-height:0;display:flex;flex-direction:column;gap:8px;overflow-y:auto;padding:2px 2px 6px;box-sizing:border-box}\n.skm-top-row{flex:none;display:flex;align-items:center;justify-content:flex-end;gap:8px}\n.skm-new-bundle{flex:none;display:inline-flex;align-items:center;gap:4px;appearance:none;border:none;border-radius:12px;padding:4px 10px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#999);background:transparent;cursor:pointer}\n.skm-new-bundle:hover,.skm-new-bundle[aria-expanded='true']{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n.skm-upload{flex:none;display:flex;align-items:center;justify-content:center;gap:8px;min-height:56px;padding:10px 12px;box-sizing:border-box;border:1px dashed var(--dsw-alias-border-l3,#444);border-radius:12px;color:var(--dsw-alias-label-tertiary,#888);font-size:12px;line-height:18px;text-align:center;cursor:pointer;user-select:none}\n.skm-upload:hover{border-color:var(--dsw-alias-state-business-primary,#4a9eff);color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-upload-active{border-color:var(--dsw-alias-state-business-primary,#4a9eff);background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-hidden-input{display:none}\n.skm-install-form{flex:none;display:flex;flex-direction:column;gap:8px;padding:10px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:12px;background:var(--dsw-alias-bg-layer-1,#1c1f26)}\n.skm-install-row{display:flex;flex-direction:column;gap:6px}\n.skm-inline-form{flex:none;display:flex;align-items:center;gap:6px}\n/* \u5757\u7EA7\u53D8\u4F53\uFF1Awidth:100% \u8BA9\u5B83\u5728 .skm-bundle\uFF08flex-wrap\uFF09\u91CC\u81EA\u52A8\u6362\u884C\u72EC\u5360\u4E00\u884C\uFF0C\n \u8F93\u5165\u6846\u56E0\u6B64\u80FD\u5403\u6EE1\u6574\u884C\u5BBD\u5EA6\uFF0C\u4E0D\u5FC5\u88AB\u4E24\u4E2A\u6309\u94AE\u6324\u5230\u53EA\u5269\u9ED8\u8BA4 20 \u5B57\u7B26\u3002 */\n.skm-inline-form-block{width:100%;box-sizing:border-box;padding:0 8px 8px;animation:skm-form-in 160ms ease-out}\n@keyframes skm-form-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n/* \u6539\u540D\u6210\u529F\uFF1A\u5361\u7247\u8FB9\u6846\u9AD8\u4EAE\u8109\u51B2\uFF081 \u79D2\u540E\u56DE\u843D\uFF09\uFF0C\u4E0E\u6574\u4F53\u6DF1\u8272\u5361\u7247\u8282\u594F\u4E00\u81F4 */\n.skm-bundle[data-renamed='true']{animation:skm-card-pop 900ms ease-out}\n@keyframes skm-card-pop{0%{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}55%{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}100%{border-color:var(--dsw-alias-border-l1,rgba(255,255,255,.08));box-shadow:none}}\n.skm-inline-input{flex:1;min-width:0;height:32px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:8px;padding:0 10px;font-size:13px;color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-bg-base,#0e1116)}\n.skm-inline-input::placeholder{color:var(--dsw-alias-label-tertiary,#888)}\n.skm-bundle-select{display:flex;align-items:center}\n.skm-bundle-select select{flex:1;height:32px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:8px;padding:0 8px;font-size:13px;color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-bg-base,#0e1116)}\n.skm-install-meta{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-install-actions{display:flex;align-items:center;gap:6px}\n.skm-section-title{margin:6px 2px 0;font-size:12px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-status{margin:2px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-failure{display:flex;align-items:center;gap:8px}\n.skm-failure p{margin:2px;font-size:13px;line-height:20px;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-error{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-bundle-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}\n/* \u5206\u7EC4\u884C\uFF08\u53C2\u8003\u8BBE\u8BA1\u7A3F\uFF09\uFF1A\u767D\u5E95\u5706\u89D2\u884C\uFF0C\u84DD\u6587\u4EF6\u5939\u56FE\u6807 + \u540D\u79F0 + \u8BA1\u6570 pill + chevron + \u66F4\u591A */\n.skm-bundle-row-outer{flex:none;display:flex;align-items:center;gap:6px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:11px;background:var(--dsw-alias-bg-base,#fff);padding:2px 6px 2px 10px;min-height:40px;transition:border-color 160ms ease,box-shadow 160ms ease,background 160ms ease}\n.skm-bundle-row-outer:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14));box-shadow:0 2px 8px rgba(16,24,40,.06)}\n.skm-bundle-row{flex:1;min-width:0;display:inline-flex;align-items:center;gap:10px;appearance:none;border:none;background:transparent;padding:6px 2px;font-size:14px;cursor:pointer;color:var(--dsw-alias-label-primary,#1f2430);font-family:inherit;border-radius:8px;text-align:left;transition:background 140ms ease}\n.skm-bundle-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.02))}\n.skm-bundle-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-bundle-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;display:inline-flex;align-items:center;gap:6px}\n.skm-bundle-count{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-bg-module-platform,#f1f3f5);border-radius:999px;padding:0 8px;white-space:nowrap}\n/* \u2500\u2500 \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u9876\u680F\u80F6\u56CA\u7B5B\u9009 / \u5305\u540D\u65C1\u6807\u7B7E / \u5206\u7C7B\u7F16\u8F91\u5668 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/* \u914D\u8272\u53EA\u8D70\u4E3B\u9898\u84DD\u4E00\u628A\u5237\u5B50\uFF08\u4E0E .skm-tag \u540C\u8BED\u8A00\uFF09\uFF1B\u5206\u7C7B\u540D\u4E0D\u53C2\u4E0E\u914D\u8272\u2014\u2014\n \u5F69\u8679\u8272\u677F\u5B9E\u6D4B\u89C6\u89C9\u592A\u5435\uFF0C\u4E0E\u9762\u677F\u5176\u4F59\u90E8\u5206\u6253\u67B6\uFF0C\u5DF2\u5426\u3002 */\n.skm-stack-form{display:flex;flex-direction:column;gap:10px}\n.skm-cat-chip-row{flex:1 1 100%;order:3;display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding-top:2px;animation:skm-cat-row-in 220ms cubic-bezier(.2,.8,.2,1) both}\n@keyframes skm-cat-row-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}\n.skm-cat-chip-label{flex:none;font-size:11.5px;line-height:18px;letter-spacing:.02em;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-cat-chip{flex:none;display:inline-flex;align-items:center;gap:5px;height:26px;box-sizing:border-box;padding:0 9px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-size:12px;line-height:18px;cursor:pointer;transition:color 150ms ease,border-color 150ms ease,background 150ms ease,box-shadow 200ms ease,transform 120ms ease}\n.skm-cat-chip:hover{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 52%,transparent);color:var(--dsw-alias-label-primary,#1f2430);transform:translateY(-1px)}\n.skm-cat-chip:active{transform:translateY(0) scale(.97)}\n.skm-cat-chip[data-active]{border-color:transparent;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 15%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-weight:600;box-shadow:0 0 0 1px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 36%,transparent),0 2px 10px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 20%,transparent)}\n.skm-cat-chip-count{flex:none;min-width:16px;padding:0 5px;box-sizing:border-box;border-radius:999px;background:var(--dsw-alias-bg-module-platform,rgba(0,0,0,.05));color:var(--dsw-alias-label-tertiary,#81858c);font-size:10.5px;line-height:16px;font-variant-numeric:tabular-nums;transition:background 160ms ease,color 160ms ease}\n.skm-cat-chip[data-active] .skm-cat-chip-count{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u5305\u540D\u65C1\u6807\u7B7E\uFF1A\u6574\u9897\u53EF\u70B9\uFF08\u70B9\u5728\u6807\u9898\u884C\u91CC\uFF0C\u7531 JS \u5206\u6D41\u6210\u7B5B\u9009\u800C\u975E\u5C55\u5F00\uFF09\uFF0C\u5E26\u5165\u573A\u5F39\u5165\u3002 */\n.skm-bundle-cats{flex:none;display:inline-flex;align-items:center;gap:4px;flex-wrap:wrap;min-width:0}\n.skm-bundle-cat-tag{display:inline-flex;align-items:center;gap:4px;height:19px;box-sizing:border-box;padding:0 7px;border-radius:999px;font-size:11px;line-height:17px;white-space:nowrap;cursor:pointer;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 11%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent);animation:skm-cat-tag-in 200ms cubic-bezier(.2,.9,.3,1.1) both;transition:background 150ms ease,border-color 150ms ease,transform 120ms ease,box-shadow 180ms ease}\n.skm-bundle-cat-tag:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 20%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 45%,transparent);transform:translateY(-1px);box-shadow:0 2px 7px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent)}\n.skm-bundle-cat-tag[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:transparent;color:#fff;box-shadow:0 2px 9px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 40%,transparent)}\n@keyframes skm-cat-tag-in{from{opacity:0;transform:translateY(3px) scale(.94)}to{opacity:1;transform:none}}\n/* \u5206\u7C7B\u7F16\u8F91\u5668 */\n.skm-cat-editor{display:flex;flex-direction:column;gap:8px;box-sizing:border-box;width:100%}\n.skm-cat-empty{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-cat-selected{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:5px}\n.skm-cat-selected-tag{display:inline-flex;align-items:center;gap:5px;height:24px;box-sizing:border-box;padding:0 4px 0 9px;border-radius:999px;font-size:12px;line-height:20px;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 26%,transparent);animation:skm-cat-tag-in 200ms cubic-bezier(.2,.9,.3,1.1) both}\n.skm-cat-selected-name{white-space:nowrap}\n.skm-cat-remove{flex:none;display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;padding:0;border:none;border-radius:50%;background:transparent;color:inherit;cursor:pointer;opacity:.6;transition:opacity 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-cat-remove:hover{opacity:1;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent)}\n.skm-cat-remove:active{transform:scale(.9)}\n.skm-cat-suggest{display:flex;flex-wrap:wrap;gap:4px}\n.skm-cat-preset{display:inline-flex;align-items:center;gap:3px;height:23px;box-sizing:border-box;padding:0 8px;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.16));border-radius:999px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-size:11.5px;line-height:19px;cursor:pointer;transition:color 140ms ease,border-color 140ms ease,background 140ms ease,transform 120ms ease}\n.skm-cat-preset:hover:not(:disabled){color:var(--dsw-alias-state-business-primary,#3d6be5);border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 55%,transparent);border-style:solid;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 9%,transparent);transform:translateY(-1px)}\n.skm-cat-preset:active:not(:disabled){transform:translateY(0) scale(.96)}\n.skm-cat-preset:disabled{opacity:.4;cursor:default}\n.skm-cat-preset-plus{font-size:13px;line-height:16px;opacity:.7}\n.skm-cat-input{box-sizing:border-box;width:100%;height:32px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:9px;padding:0 10px;font-family:inherit;font-size:12.5px;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430);background:var(--dsw-alias-bg-base,#fff);transition:border-color 150ms ease,box-shadow 150ms ease}\n.skm-cat-input:focus,.skm-cat-input:focus-visible{outline:none;border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 3px rgba(61,107,229,.12)}\n.skm-cat-limit{margin:0;font-size:11.5px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n\n.skm-chevron{flex:none;margin-left:auto;color:var(--dsw-alias-label-caption,#adb2b8);transition:transform 120ms}\n.skm-bundle-row-outer[data-open='true'] .skm-chevron{transform:rotate(180deg)}\n.skm-bundle-more{flex:none;display:flex;align-items:center}\n.skm-bundle-more-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-caption,#adb2b8);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-bundle-more-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-bundle-more-btn:active{transform:scale(.9)}\n.skm-bundle-actions{margin-left:auto;display:flex;align-items:center;gap:2px;padding-right:2px}\n.skm-icon-action{flex:none;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;border-radius:50%;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-tertiary,#888);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-icon-action:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-icon-action:active{transform:scale(.9)}\n\n/* \u2500\u2500 \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\uFF1A\u53CC\u5217\u7F51\u683C\uFF1B\u5217\u8868\u89C6\u56FE\u5207\u5355\u5217\u5BBD\u5361 \u2500\u2500 */\n.skm-skill-grid{list-style:none;margin:8px 0 0;padding:0;width:100%;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;box-sizing:border-box}\n.skm-skill-grid-list{grid-template-columns:minmax(0,1fr)}\n.skm-skill-grid > .skm-status{grid-column:1/-1;padding-top:4px}\n.skm-skill-card{position:relative;min-width:0;display:flex;flex-direction:column;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);padding:14px 16px 0;overflow:hidden;opacity:0;animation:skm-card-in 260ms cubic-bezier(.2,.7,.3,1.06) forwards;animation-delay:calc(var(--skm-i,0)*40ms);transition:border-color 160ms ease,box-shadow 160ms ease,transform 160ms ease}\n.skm-skill-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));box-shadow:0 3px 14px rgba(16,24,40,.08);transform:translateY(-1px)}\n@keyframes skm-card-in{from{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}\n.skm-skill-card-head{display:flex;align-items:center;gap:10px;min-width:0}\n.skm-skill-icon{flex:none;width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:12px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);transition:color 160ms ease,border-color 160ms ease,transform 160ms ease}\n.skm-skill-badge{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:7px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10.5px;font-weight:700;letter-spacing:.2px}\n.skm-skill-title-wrap{flex:1;min-width:0;display:flex;align-items:center;gap:6px}\n.skm-skill-title{flex:1;min-width:0;appearance:none;border:none;background:transparent;padding:0;text-align:left;font-family:inherit;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#0f1115);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border-radius:6px;transition:color 140ms ease}\n.skm-skill-title:hover{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-skill-title:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:1px}\n.skm-skill-copy{flex:none;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;border-radius:6px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-caption,#adb2b8);opacity:.55;transition:opacity 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-skill-copy:hover{opacity:1;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));transform:scale(1.08)}\n.skm-skill-copy:active{transform:scale(.9)}\n.skm-skill-copy[data-copied='true']{opacity:1;color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-skill-card-toggle{flex:none;display:inline-flex;align-items:center}\n.skm-skill-card-desc{margin:8px 0 0;appearance:none;border:none;background:transparent;padding:0;text-align:left;font-family:inherit;font-size:13px;line-height:19px;color:var(--dsw-alias-label-tertiary,#81858c);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;min-height:38px;cursor:pointer;transition:color 140ms ease}\n.skm-skill-card-desc:hover{color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-skill-tags{display:flex;align-items:center;gap:8px;margin-top:12px;min-width:0}\n.skm-tag{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 10px;border-radius:999px;font-size:12px;line-height:20px;box-sizing:border-box;white-space:nowrap;transition:color 160ms ease,border-color 160ms ease,background 160ms ease}\n.skm-tag-source{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-tag-scope{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-tag-scope[data-off='true']{border-color:var(--dsw-alias-border-l2,rgba(0,0,0,.12));color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u5173\u6389\u7684\u6280\u80FD\u7559\u5728\u5217\u8868\u91CC\uFF0C\u4F46\u8981\u4E00\u773C\u770B\u51FA\u662F\u5173\u7684\uFF1A\u5DE6\u4FA7\u72B6\u6001\u6761 + \u6807\u9898\u964D\u9971\u548C\uFF08\u5E26\u8FC7\u6E21\uFF09 */\n.skm-skill-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:transparent;transition:background 220ms ease}\n.skm-skill-card[data-off='true']{background:var(--dsw-alias-bg-layer-1,rgba(0,0,0,.02))}\n.skm-skill-card[data-off='true']::before{background:var(--dsw-alias-border-l3,rgba(0,0,0,.2))}\n.skm-skill-card[data-off='true'] .skm-skill-badge,.skm-skill-card[data-off='true'] .skm-skill-title{color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-skill-card[data-off='true'] .skm-skill-card-desc{color:var(--dsw-alias-label-quaternary,#a5aab2)}\n.skm-skill-badge,.skm-skill-title{transition:color 220ms ease}\n.skm-tag-status{background:transparent;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.18));color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-skill-meta{margin-left:auto;flex:none;font-size:12px;line-height:17px;color:var(--dsw-alias-label-caption,#adb2b8);white-space:nowrap}\n.skm-skill-card-foot{display:flex;align-items:center;gap:6px;margin:12px -16px 0;padding:8px 14px 8px 16px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.06))}\n.skm-skill-foot-label{flex:none;font-size:12px;line-height:17px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-skill-foot-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-secondary,#61666b);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-skill-foot-icon:hover{background:var(--dsw-alias-interactive-bg-hover-solid,#f1f3f5);color:var(--dsw-alias-label-primary,#0f1115);transform:scale(1.05)}\n.skm-skill-foot-icon:active{transform:scale(.92)}\n.skm-skill-foot-icon:disabled{opacity:.38;cursor:default}\n.skm-skill-foot-icon:disabled:hover{background:transparent;color:var(--dsw-alias-label-secondary,#61666b);transform:none}\n.skm-skill-foot-icon-danger:hover{background:#fdebeb;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-skill-card-actions{margin-left:auto;display:flex;align-items:center;gap:4px}\n\n/* \u2500\u2500 Skills Hub \u9875\u9762\u9AA8\u67B6\uFF1A\u5DE6\u680F\uFF08\u5206\u7C7B/\u7B5B\u9009/\u6DFB\u52A0\uFF09 / \u7EDF\u8BA1\u884C / \u5DE5\u5177\u680F / tabs / \u5206\u7EC4 / \u5361\u7247 \u2500\u2500 */\n.skm-hub{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;min-width:0;background:var(--dsw-alias-bg-base,#fff)}\n.skm-topbar{flex:none;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));background:var(--dsw-alias-bg-base,#fff)}\n.skm-topbar[data-drop]{outline:2px dashed var(--dsw-alias-state-business-primary,#3d6be5);outline-offset:-2px}\n.skm-chip-row{flex:1 1 auto;min-width:200px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.skm-topbar .skm-cat-item{flex:none;width:auto}\n.skm-topbar .skm-new-bundle-btn{flex:none;width:auto;margin-top:0;height:32px;font-size:12px}\n/* SKILL / MCP \u9876\u5C42 tab\uFF08\u7D27\u8D34\u6807\u9898\u6587\u5B57\u53F3\u4FA7\uFF09 */\n.skm-kind-tabs{flex:none;display:inline-flex;align-items:center;gap:4px;padding:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:999px;background:var(--dsw-alias-bg-module-platform,#f2f4f7)}\n.skm-kind-tab{flex:none;display:inline-flex;align-items:center;justify-content:center;height:24px;box-sizing:border-box;border:none;border-radius:999px;background:transparent;padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-kind-tab:hover{color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-kind-tab:active{transform:scale(.96)}\n.skm-kind-tab[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 1px 5px rgba(61,107,229,.3)}\n/* MCP \u89C6\u56FE\u6839\uFF1A\u5DE6\u4FA7\u7AD6\u6392\u83DC\u5355\uFF08\u540C\u6280\u80FD\u5DE6\u680F\u98CE\u683C\uFF09+ \u5185\u5BB9\u533A */\n.skm-mcp-view-root{flex:1;min-height:0;display:flex;min-width:0;overflow-y:auto;padding:14px 20px 22px 0}\n.skm-mcp-side{flex:none;width:216px;box-sizing:border-box;padding:4px 12px 0 20px;border-right:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));display:flex;flex-direction:column;gap:2px}\n.skm-mcp-main{flex:1;min-width:0;padding:0 4px 0 18px;display:flex;flex-direction:column}\n.skm-mcp-tabs{flex:none;display:flex;align-items:center;gap:10px}\n.skm-mcp-tab{flex:none;display:inline-flex;align-items:center;justify-content:center;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 18px;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-tab:hover{color:var(--dsw-alias-label-primary,#1f2430);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-mcp-tab:active{transform:scale(.97)}\n.skm-mcp-tab[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 8px rgba(61,107,229,.3)}\n/* MCP Server \u9875\uFF1A\u5DE6\u4E3B\u5217 + \u53F3\u4FE1\u606F\u5217 */\n.skm-mcp-server-layout{flex:none;display:flex;align-items:flex-start;gap:18px;min-width:0}\n/* MCP \u9875\u4E3B\u5BB9\u5668 = \u6EDA\u52A8\u5BB9\u5668\uFF1A\u5361\u7247\u591A\u4E86/\u5DE5\u5177\u591A\u4E86\u90FD\u80FD\u6EDA\u5230\u5E95\uFF08\u7236\u5C42 .skm-hub-main \u662F overflow:hidden\uFF09\u3002 */\n.skm-mcp-server-main{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:column;gap:16px;overflow-y:auto;overflow-x:hidden;padding-right:6px;scrollbar-gutter:stable}\n/* \u56FE\u4E00\uFF1A\u5934\u90E8 */\n.skm-mcp-header{flex:none;display:flex;align-items:flex-start;justify-content:space-between;gap:14px}\n.skm-mcp-header-text{min-width:0;display:flex;flex-direction:column;gap:5px}\n.skm-mcp-header-title-row{display:flex;align-items:center;gap:10px}\n.skm-mcp-header-title{font-size:20px;font-weight:700;line-height:26px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-header-badge{flex:none;display:inline-flex;align-items:center;height:20px;padding:0 9px;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10.5px;font-weight:600;line-height:14px}\n.skm-mcp-header-sub{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-header-actions{flex:none;display:inline-flex;align-items:center;gap:8px}\n.skm-mcp-market-btn{flex:none;display:inline-flex;align-items:center;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:13px;line-height:18px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:border-color 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-mcp-market-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18));color:var(--dsw-alias-label-primary,#1f2430);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.02))}\n.skm-mcp-market-btn:active{transform:scale(.98)}\n.skm-mcp-add-btn{flex:none;display:inline-flex;align-items:center;height:34px;box-sizing:border-box;border:none;border-radius:10px;background:var(--dsw-alias-state-business-primary,#3d6be5);padding:0 14px;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;color:#fff;cursor:pointer;box-shadow:0 2px 8px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-add-btn:hover{background:#3059cf;box-shadow:0 3px 12px rgba(61,107,229,.4);transform:translateY(-1px)}\n.skm-mcp-add-btn:active{transform:translateY(0) scale(.98)}\n.skm-mcp-bell-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;border-radius:10px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-mcp-bell-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-bell-btn:active{transform:scale(.94)}\n.skm-mcp-copy-hint{flex:none;margin:0;padding:8px 12px;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2fb344) 10%,transparent);color:var(--dsw-alias-state-success-primary,#2fb344);font-size:12px;line-height:17px}\n/* \u7EDF\u8BA1\u5361\uFF08\u590D\u7528\u6280\u80FD\u7EDF\u8BA1\u5361\u6837\u5F0F\uFF0C\u53BB\u6389\u5217\u8868\u9875\u5185\u8FB9\u8DDD\uFF09 */\n/* \u56FE\u4E8C\uFF1A\u5217\u8868\u5361 */\n/* MCP \u5FEB\u901F\u4E86\u89E3\u5F15\u5BFC\u5361\uFF08\u5DE6\u680F\u5E95\u90E8\uFF0C\u70B9\u51FB\u53F3\u4FA7\u60AC\u6D6E\uFF1B\u540C\u6280\u80FD\u6307\u5357\u5361\u6837\u5F0F\uFF09 */\n.skm-mcp-intro-card{flex:none;display:flex;flex-direction:column;gap:5px;margin-top:auto;box-sizing:border-box;border:1px solid #e4e9f8;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f3f7ff);padding:14px;cursor:pointer;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-intro-card:hover{border-color:#cdd9f7;box-shadow:0 4px 14px rgba(61,107,229,.08)}\n.skm-mcp-intro-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-intro-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-intro-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;margin-top:4px;height:28px;box-sizing:border-box;border:none;border-radius:999px;background:var(--dsw-alias-state-business-primary,#3d6be5);padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:#fff;cursor:pointer;box-shadow:0 2px 6px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-intro-btn:hover{background:#3059cf;box-shadow:0 3px 10px rgba(61,107,229,.38);transform:translateY(-1px)}\n.skm-mcp-intro-btn:active{transform:translateY(0) scale(.97)}\n/* MCP \u89E3\u91CA\u60AC\u6D6E\u5C42\uFF08\u540C\u6280\u80FD\u6307\u5357\u6D6E\u5C42\uFF09 */\n.skm-mcp-info-overlay{position:fixed;z-index:1001;width:330px;max-height:calc(100vh - 24px);box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);box-shadow:0 12px 40px rgba(16,24,40,.16);display:flex;flex-direction:column;overflow:hidden;animation:skm-guide-in 240ms cubic-bezier(.2,.7,.3,1.06) both}\n.skm-mcp-info-overlay-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 12px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-info-overlay-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-info-overlay-title{flex:1;min-width:0;font-size:15px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-info-overlay-body{flex:1;min-height:0;overflow-y:auto;padding:12px 14px 20px;display:flex;flex-direction:column;gap:12px}\n.skm-mcp-row{display:flex;align-items:center;gap:10px;padding:10px 4px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-row:first-child{border-top:none}\n.skm-mcp-row-logo{flex:none;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-row-logo[data-kind='slack']{background:#fff}\n.skm-mcp-row-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-mcp-row-name-row{display:flex;align-items:center;gap:7px;min-width:0}\n.skm-mcp-row-name{font-size:13px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-row-tag{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;font-size:10px;line-height:14px;background:#f1f3f5;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-row-tag[data-official]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-row-ext{flex:none;display:inline-flex;border:none;background:transparent;padding:2px;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:color 140ms ease}\n.skm-mcp-row-ext:hover{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-row-desc{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-row-status{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:999px;font-size:11px;line-height:16px;background:#f0f4ee;color:#2f9e44}\n.skm-mcp-row-status[data-on]{background:#e7f6ec}\n.skm-mcp-row-status:not([data-on]){background:#f2f3f5;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-view-all{flex:none;align-self:center;display:inline-flex;align-items:center;gap:5px;margin-top:8px;border:none;background:transparent;padding:6px 10px;font-size:12px;line-height:17px;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;font-family:inherit;transition:color 140ms ease}\n.skm-mcp-view-all:hover{color:#3059cf}\n/* \u63A8\u8350\u884C\u300C\u6DFB\u52A0\u300D\u5C0F\u6309\u94AE */\n.skm-mcp-add-small-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:26px;box-sizing:border-box;border:1px solid #bccff5;border-radius:999px;background:#f4f8ff;padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;transition:background 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-add-small-btn:hover{border-color:#9db6ef;background:#e9f1ff}\n.skm-mcp-add-small-btn:active{transform:scale(.96)}\n/* \u63A8\u8350 MCP Server \u6807\u9898 */\n.skm-mcp-recommend-title{flex:none;font-size:15px;font-weight:700;line-height:21px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u63A8\u8350\u533A\uFF1A\u6807\u9898\u884C + \u5206\u7C7B pills + \u5361\u7247\u7F51\u683C */\n.skm-mcp-rec-head{flex:none;display:flex;align-items:center;justify-content:space-between;gap:12px}\n.skm-mcp-rec-cats-row{flex:none;display:flex;align-items:center}\n.skm-mcp-rec-results-title{flex:none;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-rec-stars{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-secondary,#61666b);font-size:10.5px;line-height:16px}\n.skm-mcp-open-link{flex:none;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 30%,transparent);border-radius:999px;background:transparent;padding:0 11px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);text-decoration:none;cursor:pointer;transition:background 140ms ease,transform 140ms ease}\n.skm-mcp-open-link:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent)}\n.skm-mcp-open-link:active{transform:scale(.96)}\n.skm-mcp-rec-card-external{border-style:dashed}\n.skm-mcp-resolve-err{flex:none;margin:0;font-size:11px;line-height:16px;color:var(--dsw-alias-state-warn-primary,#e0851c)}\n.skm-mcp-ext-actions{flex:none;display:inline-flex;align-items:center;gap:6px}\n/* MCP Server \u5361\uFF1A\u81EA\u542F\u52A8/\u542F\u7528 \u8BBE\u7F6E\u884C */\n.skm-mcp-card-foot{flex:none;display:flex;align-items:center;gap:12px;margin-top:auto;padding-top:8px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-card-item{flex:none;display:inline-flex;align-items:center;gap:6px}\n.skm-mcp-card-item-label{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-card-item-meta{flex:none;margin-left:auto;font-size:11px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-card-item-meta[data-on]{color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-mcp-card-delete{flex:none;margin-left:auto;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid transparent;border-radius:8px;background:transparent;padding:0 8px;font:inherit;font-size:11.5px;font-weight:600;line-height:1;font-family:inherit;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-card-delete:hover{background:#fdebeb;border-color:#f3c4c4;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-mcp-card-delete:active{transform:scale(.94)}\n.skm-mcp-card-delete:disabled{opacity:.5;cursor:default;transform:none}\n.skm-mcp-rec-cats{flex:none;display:inline-flex;align-items:center;gap:6px}\n.skm-mcp-rec-cat{flex:none;display:inline-flex;align-items:center;justify-content:center;height:28px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:12px;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-rec-cat:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-rec-cat:active{transform:scale(.96)}\n.skm-mcp-rec-cat[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n.skm-mcp-rec-grid{flex:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\n.skm-mcp-rec-card{flex:none;min-width:0;display:flex;flex-direction:column;gap:9px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:14px 16px;box-shadow:0 1px 2px rgba(16,24,40,.03);opacity:0;animation:skm-card-in 260ms cubic-bezier(.2,.7,.3,1.06) forwards;transition:border-color 160ms ease,box-shadow 160ms ease,transform 160ms ease}\n.skm-mcp-rec-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.13));box-shadow:0 4px 14px rgba(16,24,40,.08);transform:translateY(-1px)}\n.skm-mcp-rec-card-head{display:flex;align-items:center;gap:10px;min-width:0}\n.skm-mcp-rec-card-title-row{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.skm-mcp-rec-card-name{font-size:14px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-rec-card-tags{display:flex;align-items:center;gap:6px}\n.skm-mcp-rec-cat-tag{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10px;line-height:14px}\n.skm-mcp-rec-cat-tag[data-off]{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#f5a524) 16%,transparent);color:var(--dsw-alias-state-warn-label,#b26b00)}\n.skm-mcp-rec-cat-tag[data-shadow]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);border:1px dashed color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 40%,transparent)}\n.skm-mcp-rec-cat-tag[data-locked]{background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-tertiary,#81858c);border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08))}\n.skm-mcp-tool-chip[data-locked]{text-decoration:line-through}\n.skm-mcp-tool-chips{display:flex;flex-wrap:wrap;gap:4px;margin:6px 0 8px;max-height:132px;overflow-y:auto}\n.skm-mcp-tool-chip[data-locked]{opacity:.5;cursor:not-allowed;text-decoration:line-through}\n.skm-mcp-tool-chip{font:inherit;font-size:11px;line-height:16px;padding:1px 7px;border-radius:999px;cursor:pointer;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-tertiary,#81858c);transition:background .12s,color .12s,border-color .12s}\n.skm-mcp-tool-chip[data-on]{background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2ba471) 12%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2ba471) 34%,transparent);color:var(--dsw-alias-state-success-primary,#2ba471)}\n.skm-mcp-tool-chip:hover:not(:disabled){border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 50%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-tool-chip:disabled{opacity:.55;cursor:default}\n.skm-mcp-tool-chip[data-busy]{opacity:.35}\n.skm-mcp-rec-card-desc{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;min-height:36px}\n.skm-mcp-rec-card-foot{display:flex;align-items:center;gap:8px;margin-top:auto;padding-top:6px}\n.skm-mcp-rec-card-meta{flex:1;min-width:0;font-size:11px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-added-tag{flex:none;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid #b7e0c3;border-radius:999px;background:#e7f6ec;padding:0 10px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:#2f9e44;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-added-tag:hover{border-color:#93cfa6;background:#d9f0e1}\n.skm-mcp-added-tag:active{transform:scale(.96)}\n/* \u6DFB\u52A0 MCP Server \u8868\u5355 */\n.skm-mcp-add-form{display:flex;flex-direction:column;gap:8px}\n.skm-mcp-add-type-row{display:flex;align-items:center;gap:6px}\n.skm-mcp-add-type-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:28px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-add-type-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-add-type-btn:active{transform:scale(.96)}\n.skm-mcp-add-type-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n/* \u5DE5\u5177\u5217\u8868\u641C\u7D22\u6846 */\n.skm-mcp-tool-search{flex:none;display:flex;align-items:center;gap:8px;height:32px;width:260px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;color:var(--dsw-alias-label-caption,#adb2b8);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-mcp-tool-search:focus-within{border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 14%,transparent)}\n.skm-mcp-tool-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:12.5px;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430);font-family:inherit}\n.skm-mcp-tool-search-input::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}\n/* \u8FDE\u63A5\u65E5\u5FD7\u884C */\n.skm-mcp-log-row{display:flex;align-items:center;gap:10px;padding:9px 4px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-log-row:first-child{border-top:none}\n.skm-mcp-log-dot{flex:none;width:9px;height:9px;border-radius:50%;background:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-log-dot[data-kind='enable']{background:#2fb26b}\n.skm-mcp-log-dot[data-kind='disable']{background:var(--dsw-alias-state-warn-primary,#e8a33d)}\n.skm-mcp-log-dot[data-kind='remove']{background:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-mcp-log-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}\n.skm-mcp-log-text{font-size:12.5px;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-log-text strong{font-weight:600}\n.skm-mcp-log-clear{flex:none;display:inline-flex;align-items:center;height:28px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:999px;background:transparent;padding:0 12px;font-size:12px;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:border-color 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-mcp-log-clear:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-log-clear:active{transform:scale(.96)}\n/* \u914D\u7F6E\u6A21\u677F\u5361 */\n.skm-mcp-config-grid{flex:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}\n.skm-mcp-config-card{flex:none;min-width:0;display:flex;flex-direction:column;gap:10px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:12px 14px;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 160ms ease,box-shadow 160ms ease}\n.skm-mcp-config-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.13));box-shadow:0 3px 10px rgba(16,24,40,.07)}\n.skm-mcp-config-head{display:flex;align-items:center;justify-content:space-between;gap:8px}\n.skm-mcp-config-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-config-copy{flex:none;display:inline-flex;align-items:center;height:24px;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 30%,transparent);border-radius:999px;background:transparent;padding:0 10px;font-size:11px;line-height:16px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-mcp-config-copy:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent)}\n.skm-mcp-config-copy:active{transform:scale(.96)}\n.skm-mcp-config-code{flex:none;margin:0;padding:10px 12px;border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:17px;overflow:auto}\n/* \u56FE\u4E09\uFF1A\u53F3\u4FA7\u4FE1\u606F\u680F */\n.skm-mcp-info-col{flex:none;width:322px;display:flex;flex-direction:column;gap:12px}\n.skm-mcp-info-card{flex:none;display:flex;flex-direction:column;gap:9px;box-sizing:border-box;border:1px solid #dfe8fa;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f1f5ff);padding:14px}\n.skm-mcp-info-card-title{font-size:14px;font-weight:700;line-height:20px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-info-desc{margin:0;font-size:12px;line-height:19px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-info-points{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.skm-mcp-point{display:flex;gap:8px;align-items:flex-start}\n.skm-mcp-point-icon{flex:none;width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-point-body{min-width:0;display:flex;flex-direction:column;gap:1px}\n.skm-mcp-point-title{font-size:12px;font-weight:600;line-height:17px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-point-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u5DE5\u4F5C\u539F\u7406\u6D41\u7A0B */\n.skm-mcp-flow{flex:none;display:flex;align-items:center;gap:4px}\n.skm-mcp-flow-node{flex:none;width:64px;display:inline-flex;flex-direction:column;align-items:center;gap:4px}\n.skm-mcp-flow-icon{flex:none;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-flow-icon[data-client]{background:#dbebfd;color:#2276d2}\n.skm-mcp-flow-icon[data-server]{background:#eae8fa;color:#6b46e5}\n.skm-mcp-flow-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-secondary,#61666b);white-space:nowrap}\n.skm-mcp-flow-arrow{flex:1;min-width:0;display:inline-flex;flex-direction:column;align-items:center;gap:2px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-arrow-text{font-size:9px;line-height:12px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-ext{flex:none;display:flex;flex-direction:column;gap:6px;padding-top:6px;border-top:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.1))}\n.skm-mcp-flow-ext-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-ext-icons{display:flex;gap:8px}\n.skm-mcp-flow-ext-icon{flex:none;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.07));border-radius:8px;background:#fff;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-api-text{font-size:9px;font-weight:700;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u5FEB\u901F\u4E0A\u624B */\n.skm-mcp-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.skm-mcp-step{display:flex;gap:8px;align-items:flex-start}\n.skm-mcp-step-num{flex:none;width:22px;height:22px;border-radius:50%;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:12px;font-weight:700;line-height:22px;text-align:center}\n.skm-mcp-step-body{min-width:0;display:flex;flex-direction:column;gap:1px}\n.skm-mcp-step-title{font-size:12px;font-weight:600;line-height:17px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-step-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* MCP \u7A7A\u6001\uFF08\u5DE5\u5177\u5217\u8868/\u8FDE\u63A5\u65E5\u5FD7/\u914D\u7F6E\u6A21\u677F\u5360\u4F4D\uFF09 */\n.skm-mcp-empty{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:40px}\n.skm-mcp-empty-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:64px;height:64px;border-radius:18px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 4px 12px rgba(61,107,229,.1)}\n.skm-mcp-empty-title{font-size:16px;font-weight:700;line-height:22px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-empty-desc{font-size:13px;line-height:19px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-hub-row{flex:1;min-height:0;min-width:0;display:flex}\n/* \u53F3\u4FA7\u6307\u5357\u6D6E\u5C42\u5361\uFF08\u70B9\u51FB\u300C\u5F00\u59CB\u5B66\u4E60\u300D\u51FA\u73B0\uFF0C\u8D34\u9762\u677F\u53F3\u7F18\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09 */\n.skm-guide-panel{position:fixed;z-index:1001;width:300px;max-height:calc(100vh - 24px);box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);box-shadow:0 12px 40px rgba(16,24,40,.16);display:flex;flex-direction:column;overflow:hidden;animation:skm-guide-in 240ms cubic-bezier(.2,.7,.3,1.06) both}\n@keyframes skm-guide-in{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:translateX(0)}}\n.skm-guide-panel-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 12px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-guide-panel-logo{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-guide-panel-title{flex:1;min-width:0;font-size:15px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-panel-close{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-guide-panel-close:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-panel-close:active{transform:scale(.9)}\n.skm-guide-panel-body{flex:1;min-height:0;overflow-y:auto;padding:12px 14px 20px;display:flex;flex-direction:column;gap:14px}\n.skm-guide-sec{flex:none;display:flex;flex-direction:column;gap:8px}\n.skm-guide-sec-head{display:flex;align-items:center;gap:7px}\n.skm-guide-sec-icon{flex:none;display:inline-flex;width:22px;height:22px;align-items:center;justify-content:center;border-radius:7px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-guide-sec-title{font-size:14px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-what-desc{margin:0;font-size:12px;line-height:19px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-guide-caps{display:flex;flex-wrap:wrap;gap:6px 10px}\n.skm-guide-cap{flex:none;display:inline-flex;align-items:center;gap:4px}\n.skm-guide-cap-icon{flex:none;display:inline-flex;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-guide-cap-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-tertiary,#81858c);white-space:nowrap}\n.skm-guide-step{display:flex;gap:8px;padding:2px 0}\n.skm-guide-step-num{flex:none;width:22px;height:22px;border-radius:50%;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:12px;font-weight:700;line-height:22px;text-align:center}\n.skm-guide-step-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}\n.skm-guide-step-title-row{display:flex;align-items:center;gap:6px}\n.skm-guide-step-title{font-size:13px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-step-arrow{margin-left:auto;flex:none;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-guide-step-desc{margin:0;font-size:11px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-guide-full-btn{flex:none;align-self:stretch;display:inline-flex;align-items:center;justify-content:center;gap:6px;margin-top:6px;height:32px;box-sizing:border-box;border:1px solid #bccff5;border-radius:999px;background:#f4f8ff;color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:12px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-guide-full-btn:hover{border-color:#9db6ef;background:#e9f1ff;box-shadow:0 2px 8px rgba(61,107,229,.1)}\n.skm-guide-full-btn:active{transform:scale(.98)}\n.skm-guide-best{flex:none;display:flex;flex-direction:column;gap:8px;box-sizing:border-box;border:1px solid #dbe6fb;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#eef4ff);padding:12px 12px 0;overflow:hidden;position:relative}\n.skm-guide-best-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-best-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}\n.skm-guide-best-item{display:flex;align-items:center;gap:7px;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-guide-best-item svg{flex:none;color:#2fb26b}\n.skm-guide-more-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;border:none;background:transparent;padding:2px 0;font-size:11px;line-height:16px;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;font-family:inherit;transition:color 140ms ease}\n.skm-guide-more-btn:hover{color:#3059cf}\n.skm-guide-best-art{flex:none;display:inline-flex;align-items:flex-end;justify-content:center;margin:2px -12px 0;transform:scale(.8);transform-origin:bottom right;pointer-events:none}\n.skm-hub-side{flex:none;width:216px;box-sizing:border-box;padding:16px 14px 16px 16px;border-right:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));background:var(--dsw-alias-bg-base,#fff);overflow-y:auto;display:flex;flex-direction:column;gap:2px}\n.skm-cat-title{flex:none;margin:0 6px 10px;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-cat-list{flex:none;display:flex;flex-direction:column;gap:4px;max-height:190px;overflow-y:auto;padding-right:2px;box-sizing:border-box;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.18));--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,rgba(0,0,0,.3))}\n.skm-cat-item{flex:none;display:flex;align-items:center;gap:10px;width:100%;box-sizing:border-box;border:1px solid transparent;border-radius:10px;padding:8px 10px;background:transparent;cursor:pointer;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);transition:background 140ms ease,border-color 140ms ease,color 140ms ease,box-shadow 140ms ease}\n.skm-cat-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.03));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-cat-item[data-active]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);border-color:rgba(61,107,229,.10);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-cat-icon{flex:none;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;color:var(--dsw-alias-label-caption,#adb2b8);transition:color 140ms ease}\n.skm-cat-icon[data-active]{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-cat-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;font-size:13px;font-weight:500;line-height:18px}\n.skm-cat-item[data-active] .skm-cat-label{font-weight:600}\n.skm-cat-count{flex:none;font-size:12px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-cat-item[data-active] .skm-cat-count{color:var(--dsw-alias-state-business-primary,#5b82e5)}\n.skm-cat-count[data-warn]{color:#e0851c;font-weight:600}\n.skm-filters-title{flex:none;margin:18px 6px 8px;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-filter-block{flex:none;display:flex;flex-direction:column;gap:8px}\n/* \u542F\u7528\u72B6\u6001\uFF1A\u5E73\u94FA\u4E09\u6863\u5206\u6BB5\u6309\u94AE */\n.skm-status-seg{flex:none;display:flex;align-items:center;gap:6px;padding:0 2px}\n.skm-status-seg-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:30px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;font-size:12px;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;white-space:nowrap;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-status-seg-btn:hover{color:var(--dsw-alias-label-primary,#1f2430);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-status-seg-btn:active{transform:scale(.96)}\n.skm-status-seg-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 6px rgba(61,107,229,.28)}\n.skm-filter-row-wrap{position:relative;flex:none}\n.skm-filter-row{flex:none;display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:9px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;font-family:inherit;cursor:pointer;transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-filter-row:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-filter-row[aria-expanded='true']{border-color:var(--dsw-alias-state-business-primary,var(--dsw-alias-state-business-primary,#3d6be5));box-shadow:0 0 0 2px rgba(61,107,229,.12)}\n.skm-filter-row-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;font-size:12px;line-height:17px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-filter-row-label-strong{font-weight:600;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-filter-row-chevron{flex:none;color:var(--dsw-alias-label-caption,#adb2b8);transition:transform 140ms ease}\n.skm-filter-row-chevron[data-open]{transform:rotate(180deg)}\n.skm-filter-menu{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:60;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:0 8px 22px rgba(16,24,40,.12);padding:4px;display:flex;flex-direction:column;gap:2px;animation:skm-form-in 140ms ease-out}\n.skm-filter-option{display:flex;align-items:center;gap:8px;width:100%;border:none;border-radius:8px;padding:7px 10px;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;font-family:inherit;text-align:left;white-space:nowrap;transition:background 120ms ease,color 120ms ease}\n.skm-filter-option:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-preset-dot{flex:none;justify-content:center;width:8px;height:8px;border-radius:50%;background:transparent;margin-left:auto}\n.skm-preset-dot[data-on]{background:var(--dsw-alias-state-business-primary,#e0851c)}\n/* \u65B0\u5EFA\u6280\u80FD\u5305\u6309\u94AE\uFF08\u5DE6\u680F\uFF0C\u6DFB\u52A0\u6280\u80FD\u5361\u4E0A\u65B9\uFF09 */\n.skm-new-bundle-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;height:34px;width:100%;box-sizing:border-box;margin-top:18px;border:1px solid #c7d6f7;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-new-bundle-btn:hover{border-color:#9db6ef;background:#e3ecff;box-shadow:0 2px 8px rgba(61,107,229,.12)}\n.skm-new-bundle-btn:active{transform:scale(.98)}\n.skm-new-bundle-btn-open{border-color:var(--dsw-alias-state-business-primary,#3d6be5);background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 8px rgba(61,107,229,.3)}\n.skm-new-bundle-btn-open:hover{background:#3059cf;border-color:#3059cf;color:#fff}\n/* \u6DFB\u52A0\u6280\u80FD\u5361 */\n.skm-add-card{flex:none;display:flex;flex-direction:column;gap:8px;margin-top:18px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:12px;cursor:pointer;box-shadow:0 1px 2px rgba(16,24,40,.04);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-add-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14));box-shadow:0 4px 14px rgba(16,24,40,.08)}\n.skm-add-card-active{border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 2px rgba(61,107,229,.14)}\n.skm-add-card-head{display:flex;align-items:center;gap:8px}\n.skm-add-card-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent)}\n.skm-add-card-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-add-card-sub{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-add-drop{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;border:1px dashed var(--dsw-alias-border-l3,rgba(0,0,0,.18));border-radius:10px;padding:12px 8px;color:var(--dsw-alias-label-tertiary,#81858c);background:var(--dsw-alias-bg-module-platform,#fafbfc);transition:border-color 140ms ease,background 140ms ease}\n.skm-add-card:hover .skm-add-drop{border-color:rgba(61,107,229,.4);background:#f5f8ff}\n.skm-add-drop-icon{flex:none;display:inline-flex}\n.skm-add-drop-text{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-add-drop-hint{font-size:10px;line-height:14px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-add-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:32px;box-sizing:border-box;border:none;border-radius:9px;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;box-shadow:0 1px 3px rgba(61,107,229,.35);transition:background 140ms ease,transform 140ms ease,box-shadow 140ms ease}\n.skm-add-btn:hover{background:#3059cf;box-shadow:0 2px 8px rgba(61,107,229,.4);transform:translateY(-1px)}\n.skm-add-btn:active{transform:translateY(0) scale(.98)}\n/* \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\uFF08\u6DFB\u52A0\u6280\u80FD\u5361\u4E0B\u65B9\uFF09 */\n.skm-guide-card{flex:none;display:flex;flex-direction:column;gap:5px;margin-top:18px;box-sizing:border-box;border:1px solid #e4e9f8;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f3f7ff);padding:14px;overflow:hidden;position:relative;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-guide-card:hover{border-color:#cdd9f7;box-shadow:0 4px 14px rgba(61,107,229,.08)}\n.skm-guide-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-guide-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;margin-top:4px;height:28px;box-sizing:border-box;border:none;border-radius:999px;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:12px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;box-shadow:0 2px 6px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-guide-btn:hover{background:#3059cf;box-shadow:0 3px 10px rgba(61,107,229,.38);transform:translateY(-1px)}\n.skm-guide-btn:active{transform:translateY(0) scale(.97)}\n.skm-guide-art{flex:none;display:inline-flex;align-items:flex-end;justify-content:center;margin:8px -14px 0;padding-top:6px;background:linear-gradient(180deg,rgba(61,107,229,.06),rgba(61,107,229,.14))}\n.skm-guide-modal-text{margin:0;font-size:13px;line-height:22px;color:var(--dsw-alias-label-secondary,#4a4f5a)}\n.skm-hub-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}\n.skm-health-notice{flex:none;margin:8px 16px 0;box-sizing:border-box;border:1px solid #f0cf9e;border-radius:10px;background:#fdf6e3;padding:8px 12px;display:flex;flex-direction:column;gap:4px;animation:skm-form-in 180ms ease-out}\n.skm-health-notice-title{font-size:12px;font-weight:700;line-height:17px;color:#b45309}\n.skm-health-notice ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}\n.skm-health-notice li{font-size:12px;line-height:17px;color:#8a5a17}\n.skm-toolbar{flex:none;display:flex;align-items:center;gap:8px;padding:12px 16px 4px;flex-wrap:wrap}\n.skm-search-box{flex:1;min-width:170px;display:flex;align-items:center;gap:8px;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;color:var(--dsw-alias-label-caption,#adb2b8);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-search-box:focus-within{border-color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 0 0 3px rgba(65,118,230,.14)}\n.skm-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary,#0f1115);font-family:inherit}\n.skm-search-input::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-tool-select-wrap{position:relative;flex:none;display:inline-flex;align-items:center}\n.skm-tool-select{appearance:none;-webkit-appearance:none;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:13px;line-height:18px;font-family:inherit;padding:0 26px 0 12px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease}\n.skm-tool-select:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18))}\n.skm-tool-select:focus-visible{outline:none;border-color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-tool-select-chevron{position:absolute;right:9px;pointer-events:none;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-tool-button{flex:none;display:inline-flex;align-items:center;gap:6px;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:13px;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-tool-button:hover{background:var(--dsw-alias-interactive-bg-hover-solid,#f7f8f9);color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-tool-button:active{transform:scale(.97)}\n.skm-tool-button:disabled{opacity:.5;cursor:default}\n.skm-toolbar-spacer{flex:1 1 12px}\n.skm-bulk-overlay{position:fixed;inset:0;z-index:995;border:none;background:transparent;cursor:default;padding:0}\n.skm-preset-pill{position:relative;flex:none;display:inline-flex;align-items:center;gap:6px;height:36px;box-sizing:border-box;border:1px solid #c9d6f5;border-radius:10px;background:#eef3fd;color:#3b62d6;padding:0 10px;font-family:inherit;font-size:13px;line-height:18px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-preset-pill:active{transform:scale(.97)}\n.skm-preset-pill-label{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-preset-select{appearance:none;-webkit-appearance:none;border:none;outline:none;background:transparent;color:inherit;font-size:13px;line-height:18px;font-family:inherit;padding:0 18px 0 0;cursor:pointer;max-width:150px}\n.skm-preset-pill-chevron{pointer-events:none;color:#6f8cd6;transition:transform 140ms ease}\n.skm-preset-pill[aria-expanded='true'] .skm-preset-pill-chevron{transform:rotate(180deg)}\n.skm-drop-wrap{position:relative;flex:none}\n.skm-drop-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:996;min-width:180px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:0 6px 20px rgba(16,24,40,.12);padding:4px;display:flex;flex-direction:column;gap:2px;animation:skm-form-in 140ms ease-out;max-height:320px;overflow-y:auto}\n.skm-drop-item{display:flex;align-items:center;gap:8px;border:none;border-radius:8px;padding:7px 10px;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;font-family:inherit;text-align:left;white-space:nowrap;transition:background 120ms ease,color 120ms ease}\n.skm-drop-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-drop-item[aria-checked='true']{color:var(--dsw-alias-label-primary,#0f1115);font-weight:600}\n.skm-drop-check{flex:none;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:var(--dsw-alias-state-business-primary,#4176e6);opacity:0;transform:scale(.6);transition:opacity 140ms ease,transform 140ms ease}\n.skm-drop-check[data-on]{opacity:1;transform:scale(1)}\n.skm-drop-badge{margin-left:auto;flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-bg-module-platform,#f1f3f5);border-radius:999px;padding:0 8px}\n.skm-view-toggle{flex:none;display:inline-flex;align-items:center;gap:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:3px;transition:border-color 140ms ease}\n.skm-view-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:30px;height:28px;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-view-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-view-btn[data-active]{background:var(--dsw-alias-bg-module-platform,#eef0f2);color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-view-btn:active{transform:scale(.94)}\n.skm-hint-row{flex:none;display:flex;align-items:center;gap:10px;padding:6px 16px 0}\n.skm-hint-row-text{flex:1;min-width:0;font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-banner{flex:none;display:flex;align-items:center;gap:12px;margin:10px 16px 0;box-sizing:border-box;border:1px solid #f2df9e;border-radius:14px;background:#fdf8e3;padding:10px 12px;cursor:pointer;transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-banner:hover{border-color:#ecd58a;box-shadow:0 2px 8px rgba(232,163,61,.12)}\n.skm-banner:active{transform:scale(.995)}\n.skm-banner-active{border-color:#e8a33d;box-shadow:0 0 0 3px rgba(232,163,61,.18)}\n.skm-banner-icon{flex:none;width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;border:1.5px solid #e8a33d;color:#e8a33d;background:transparent}\n.skm-banner-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-banner-title{font-size:14px;font-weight:700;line-height:20px;color:#1f2937}\n.skm-banner-sub{font-size:12px;line-height:17px;color:#6b7280;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-banner-btn{flex:none;display:inline-flex;align-items:center;height:32px;box-sizing:border-box;border:none;border-radius:10px;background:#e8850c;color:#fff;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 14px;cursor:pointer;box-shadow:0 1px 3px rgba(232,133,12,.35);transition:background 140ms ease,transform 140ms ease,box-shadow 140ms ease}\n.skm-banner-btn:hover{background:#d67906;box-shadow:0 2px 8px rgba(232,133,12,.4);transform:translateY(-1px)}\n.skm-banner-btn:active{transform:translateY(0) scale(.98)}\n.skm-main-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;padding:12px 16px 20px;display:flex;flex-direction:column;gap:12px;scrollbar-gutter:stable}\n.skm-hub-section{min-width:0;width:100%;box-sizing:border-box}\n/* \u5C55\u5F00/\u6298\u53E0\u6052\u4E3A\u6574\u884C\u5BBD\uFF1A\u65E7\u89C4\u5219\u53EA\u8BA9 data-open \u7684 section \u8DE8\u4E24\u5217\uFF0C\u6536\u8D77\u65F6\u4F1A\u7F29\u6210\u534A\u5BBD\u3002 */\n.skm-hub-section{display:flex;flex-direction:column;min-width:0}\n.skm-hub-section-head{display:flex;align-items:center;gap:8px;min-width:0;padding:2px 4px 0}\n.skm-no-result{padding:18px 4px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u65B0\u5EFA\u6280\u80FD\u5305\u5165\u53E3\uFF08\u7070\u5B57\u6309\u94AE\u884C\uFF09 */\n.skm-new-bundle-line{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:4px;border:none;border-radius:8px;padding:6px 10px;margin:2px 0 0 4px;background:transparent;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c);cursor:pointer;font-family:inherit;transition:background 140ms ease,color 140ms ease}\n.skm-new-bundle-line:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-secondary,#61666b)}\n/* \u5206\u9875\u884C */\n.skm-pagination{flex:none;display:flex;align-items:center;gap:10px;padding:4px 4px 0}\n.skm-page-info{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-page-btns{flex:1;display:flex;align-items:center;gap:4px}\n.skm-page-btn{flex:none;min-width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:8px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:12px;line-height:18px;font-family:inherit;cursor:pointer;transition:border-color 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-page-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-page-btn:active{transform:scale(.94)}\n.skm-page-btn:disabled{opacity:.45;cursor:default}\n.skm-page-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n.skm-page-size-sel{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b)}\n\n/* \u2500\u2500 \u5F52\u5165\u6280\u80FD\u5305\u5F39\u7A97\uFF08\u5361\u7247\u5316\uFF0C\u4E0E\u6280\u80FD\u5361\u7247\u540C\u8BED\u8A00\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.skm-assign-modal{width:min(560px,calc(100vw - 48px))}\n.skm-assign-modal-body{overflow:hidden;display:flex;flex-direction:column;max-height:min(560px,calc(100vh - 180px))}\n.skm-assign-list{list-style:none;margin:0;padding:4px 2px 2px;display:flex;flex-direction:column;gap:8px;overflow-y:auto}\n.skm-assign-card{display:flex;align-items:center;gap:10px;width:100%;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.08));border-radius:12px;background:var(--dsw-alias-bg-base,#fff);padding:10px 12px;cursor:pointer;font-family:inherit;text-align:left;opacity:0;animation:skm-card-in 240ms cubic-bezier(.2,.7,.3,1.06) forwards;animation-delay:calc(var(--skm-i,0)*45ms);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-assign-card:hover{border-color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 2px 8px rgba(16,24,40,.07);transform:translateY(-1px)}\n.skm-assign-card:active{transform:translateY(0) scale(.99)}\n.skm-assign-card-icon{flex:none;width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);transition:color 140ms ease,border-color 140ms ease}\n.skm-assign-card:hover .skm-assign-card-icon{color:var(--dsw-alias-label-primary,#0f1115);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14))}\n.skm-assign-card-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-assign-card-name{font-size:14px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary,#0f1115);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-assign-card-desc{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-assign-go{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;color:var(--dsw-alias-label-caption,#adb2b8);transform:rotate(-90deg);transition:transform 160ms ease,background 140ms ease,color 140ms ease}\n.skm-assign-card:hover .skm-assign-go{transform:rotate(-90deg) translateX(2px);color:var(--dsw-alias-state-business-primary,#4176e6);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.03))}\n.skm-skill-list{list-style:none;margin:0;padding:2px 6px 6px;width:100%;display:flex;flex-direction:column;gap:2px}\n.skm-skill-item{display:flex;flex-direction:column;gap:2px;padding:2px 0;border-radius:8px}\n.skm-skill-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-row{display:flex;align-items:center;gap:6px;padding:2px 6px;border-radius:8px}\n.skm-skill-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-label{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}\n.skm-skill-name{font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary,#eee);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-skill-desc{font-size:12px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-skill-expand{flex:none;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;border-radius:6px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-tertiary,#888);transition:transform 120ms}\n.skm-skill-expand:hover{color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-expand[data-open='true']{transform:rotate(180deg)}\n.skm-skill-count{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:8px;padding:0 6px;white-space:nowrap}\n.skm-skill-compat{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:170px}\n.skm-skill-files{list-style:none;margin:0 0 2px 10px;padding:2px 0 2px 10px;border-left:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));display:flex;flex-direction:column;gap:0}\n.skm-skill-file{display:flex;align-items:center;gap:6px;padding:2px 6px;border-radius:6px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#bbb);font-family:ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.skm-skill-file:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-file[data-main='true']{color:var(--dsw-alias-label-primary,#eee);font-weight:500}\n.skm-skill-dir{color:var(--dsw-alias-label-tertiary,#888)}\n.skm-skill-preview{border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:10px;background:var(--dsw-alias-bg-base,#0e1116);padding:8px 12px;margin:0 0 2px 10px;font-size:12px;line-height:20px;color:var(--dsw-alias-label-primary,#eee);overflow:auto;max-height:280px;box-sizing:border-box}\n.skm-skill-preview h3,.skm-skill-preview h4,.skm-skill-preview h5{margin:10px 0 4px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#eee)}\n.skm-skill-preview p{margin:4px 0}\n.skm-skill-preview pre{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:8px;padding:8px 10px;overflow:auto;font-family:ui-monospace,monospace;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#bbb);margin:6px 0}\n.skm-skill-preview code{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:4px;padding:0 4px;font-family:ui-monospace,monospace;font-size:11px}\n.skm-skill-preview a{color:var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-skill-preview ul{margin:4px 0;padding-left:18px}\n.skm-skill-preview li{margin:2px 0}\n/* \u67E5\u770B\u5668\u9ED8\u8BA4\u5C31\u662F\u5927\u753B\u5E45\uFF081280\u00D7880 \u4E0A\u9650\uFF0C\u968F\u89C6\u53E3\u6536\u7F29\uFF09\uFF0C\u53EF\u4E00\u952E\u5168\u5C4F\uFF1B\u5BBD/\u9AD8\u5E26\u7F13\u52A8\u8FC7\u6E21\u3002 */\n.skm-viewer-modal{width:min(1280px,calc(100vw - 64px));animation:skm-viewer-in 260ms cubic-bezier(.2,.7,.3,1.06);transition:width 320ms cubic-bezier(.22,.72,.24,1)}\n.skm-viewer-modal-full{width:calc(100vw - 48px)}\n@keyframes skm-viewer-in{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:none}}\n.skm-viewer-body{overflow:hidden;display:flex;flex-direction:column;height:min(880px,calc(100vh - 96px));transition:height 320ms cubic-bezier(.22,.72,.24,1);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2)}\n/* \u5B98\u65B9 Modal \u7684 root \u81EA\u5E26 24px \u5185\u8FB9\u8DDD\u3001dialog \u81EA\u5E26 24px \u4E0B\u5185\u8FB9\u8DDD\uFF1A\n \u5168\u5C4F\u6863\u6309\u8FD9\u4E24\u5904\u7559\u767D\u6536\uFF0C\u514D\u5F97\u88AB flex-shrink \u622A\u65AD\u6216\u4E0A\u4E0B\u6EA2\u51FA\u3002 */\n.skm-viewer-modal-full .skm-viewer-body{height:calc(100vh - 76px)}\n/* \u5F39\u7A97\u5934\u90E8\uFF08\u5B98\u65B9 Modal \u7684 header \u662F\u672C\u5BB9\u5668\u7B2C\u4E00\u4E2A div\uFF09\uFF1A\u968F\u5927\u753B\u5E45\u653E\u5927\u4E00\u6863\u3002 */\n.skm-viewer-body > div:first-child{padding:20px 18px 0 26px}\n.skm-viewer-body > div:first-child h2{font-size:17px;line-height:26px;font-weight:600}\n.skm-viewer-body > div:nth-of-type(2){flex:1;min-height:0;display:flex;flex-direction:column;margin-top:2px;padding:0 20px 20px}\n.skm-viewer-toolbar{flex:none;display:flex;align-items:center;gap:10px;padding:0 2px 12px}\n.skm-viewer-path{flex:1;min-width:0;display:flex;align-items:center;gap:8px;font-size:12.5px;line-height:18px;font-family:ui-monospace,monospace;color:var(--dsw-alias-label-tertiary,#888);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.skm-viewer-path b{font-weight:600;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-viewer-tool-group{flex:none;display:inline-flex;align-items:center;gap:2px;padding:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7)}\n.skm-viewer-tool-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:26px;padding:0 7px;box-sizing:border-box;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-weight:600;line-height:16px;cursor:pointer;transition:background 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-viewer-tool-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-viewer-tool-btn:active{transform:scale(.93)}\n.skm-viewer-tool-btn[data-active='true']{background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 1px 3px rgba(16,24,40,.12)}\n.skm-viewer-tool-btn-a1{font-size:11px}\n.skm-viewer-tool-btn-a3{font-size:15px}\n.skm-viewer-tool-btn-frame{border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.1));border-radius:10px;background:var(--dsw-alias-bg-base,#fff)}\n.skm-viewer-tool-btn-frame[data-active='true']{border-color:var(--dsw-alias-state-business-primary,#4176e6);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4176e6) 10%,transparent);color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:none}\n.skm-viewer-layout{flex:1;min-height:0;display:flex;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:14px;overflow:hidden}\n.skm-viewer-nav{flex:none;width:252px;border-right:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));overflow-y:auto;padding:8px;box-sizing:border-box;background:var(--dsw-alias-bg-module-platform,#f5f6f7)}\n.skm-viewer-nav-item{display:flex;align-items:center;gap:6px;padding:5px 9px;border-radius:8px;font-size:12.5px;line-height:20px;color:var(--dsw-alias-label-secondary,#bbb);font-family:ui-monospace,monospace;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background 140ms ease,color 140ms ease,box-shadow 160ms ease}\n.skm-viewer-nav-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-viewer-nav-item[data-active='true']{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4a9eff) 14%,transparent);color:var(--dsw-alias-label-primary,#eee);box-shadow:inset 2px 0 0 var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-viewer-nav-dir{cursor:default;color:var(--dsw-alias-label-tertiary,#888)}\n/* \u6B63\u6587\u5168\u90E8\u8D70 em\uFF1A--skm-vfs \u4E00\u4E2A\u53D8\u91CF\u9A71\u52A8\u5B57\u53F7\u4E09\u6863\uFF0C\u5207\u6362\u65F6\u53EA\u8FC7\u6E21 font-size\u3002 */\n.skm-viewer-content{flex:1;min-width:0;overflow:auto;padding:26px 34px 48px;box-sizing:border-box;font-size:var(--skm-vfs,15px);line-height:1.75;color:var(--dsw-alias-label-primary,#eee);transition:font-size 180ms ease}\n.skm-viewer-content > :first-child{margin-top:0}\n.skm-viewer-content h1,.skm-viewer-content h2,.skm-viewer-content h3,.skm-viewer-content h4,.skm-viewer-content h5{margin:1.15em 0 .5em;line-height:1.35;font-weight:600;color:var(--dsw-alias-label-primary,#eee);max-width:84ch}\n.skm-viewer-content h1{font-size:1.72em;letter-spacing:-.012em}\n.skm-viewer-content h2{font-size:1.38em}\n.skm-viewer-content h3{font-size:1.16em}\n.skm-viewer-content h4,.skm-viewer-content h5{font-size:1.04em}\n.skm-viewer-content p{margin:.62em 0;max-width:92ch}\n.skm-viewer-content pre{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:10px;padding:14px 16px;overflow:auto;font-family:ui-monospace,monospace;font-size:.86em;line-height:1.7;color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-viewer-content code{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:5px;padding:1px 5px;font-family:ui-monospace,monospace;font-size:.86em}\n.skm-viewer-content pre code{background:transparent;padding:0}\n.skm-viewer-content a{color:var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-viewer-content ul,.skm-viewer-content ol{margin:.62em 0;padding-left:1.6em}\n.skm-viewer-content li{margin:.32em 0;max-width:92ch}\n.skm-viewer-content blockquote{margin:.9em 0;padding:.25em 1em;border-left:3px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));color:var(--dsw-alias-label-secondary,#bbb);max-width:82ch}\n.skm-viewer-content hr{border:none;border-top:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));margin:1.5em 0}\n.skm-loose-empty{margin:2px;padding:4px 0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n\n/* \u2500\u2500 \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\uFF08Skills Hub \u98CE\u683C\uFF1A\u7EFF\u8272\u80F6\u56CA + \u767D\u8272\u5706\u94AE\uFF0C\u56DE\u5F39\u8FC7\u6E21\uFF09 \u2500\u2500 */\n.skm-toggle{flex:none;display:inline-flex;align-items:center;width:34px;height:20px;box-sizing:border-box;border-radius:10px;padding:2px;appearance:none;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-alias-bg-module-platform,#e9ebee);cursor:pointer;transition:background 160ms ease,border-color 160ms ease,filter 160ms ease}\n.skm-toggle:hover{filter:brightness(1.03)}\n.skm-toggle:disabled{opacity:.55;cursor:not-allowed;filter:none}\n.skm-toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:1px}\n.skm-toggle-on{border-color:transparent;background:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-toggle-off{background:var(--dsw-alias-bg-module-platform,#e9ebee);border-color:var(--dsw-alias-border-l2,rgba(0,0,0,.1))}\n.skm-toggle-knob{display:block;width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform 180ms cubic-bezier(.3,1.4,.5,1)}\n.skm-toggle-on .skm-toggle-knob{transform:translateX(14px)}\n.skm-toggle-off .skm-toggle-knob{transform:translateX(0)}\n.skm-bundle-toggle{flex:none;display:inline-flex;align-items:center;gap:4px;margin-left:0}\n\n/* \u2500\u2500 Agent \u9884\u8BBE\u5206\u7C7B\u5706\u7403\u6761\uFF08\u5F27\u5F62\u6062\u590D\uFF0C\u6574\u5217\u4F4D\u4E8E\u7EDF\u8BA1\u884C\u4E0E\u5DE5\u5177\u680F\u4E4B\u95F4\uFF09 \u2500\u2500 */\n.skm-preset-strip{flex:none;display:flex;align-items:flex-start;gap:10px;padding:12px 16px 0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}\n.skm-preset-strip::-webkit-scrollbar{display:none}\n.skm-preset-ball-wrap{flex:none;display:flex;flex-direction:column;align-items:center;gap:6px;width:56px;border:none;background:transparent;padding:0;cursor:pointer;font-family:inherit}\n.skm-preset-ball{position:relative;display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:50%;box-sizing:border-box;font-size:17px;font-weight:600;line-height:1;color:var(--dsw-alias-label-primary,#eee);text-transform:uppercase;background:var(--dsw-alias-bg-layer-2,#262b36);border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));transition:border-color 140ms,filter 140ms}\n.skm-preset-ball-wrap:hover .skm-preset-ball{filter:brightness(1.15)}\n.skm-preset-ball-wrap[data-active='true'] .skm-preset-ball{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-preset-ball[data-dot='true']::after{content:'';position:absolute;right:-1px;bottom:-1px;width:12px;height:12px;border-radius:50%;background:var(--dsw-alias-state-business-primary,#4a9eff);border:2px solid var(--dsw-alias-bg-layer-1,#1c1f26);box-sizing:border-box}\n.skm-preset-ball-label{max-width:56px;font-size:11px;line-height:15px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}\n.skm-preset-ball-wrap[data-active='true'] .skm-preset-ball-label{color:var(--dsw-alias-label-primary,#eee)}\n.skm-preset-hint{flex:none;display:flex;align-items:center;gap:8px;padding:0 2px 2px}\n.skm-preset-hint-text{flex:1;min-width:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-preset-reset{flex:none;appearance:none;border:none;border-radius:12px;padding:2px 10px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#999);background:transparent;cursor:pointer;font-family:inherit}\n.skm-preset-reset:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n\n/* \u2500\u2500 \u9762\u677F\u7EA7\u63D0\u793A\u6761\uFF1A\u5220\u9664/\u5F52\u7EC4/\u6539\u540D/\u5B89\u88C5\u7684\u6210\u8D25\u90FD\u8981\u8BA9\u7528\u6237\u770B\u89C1 \u2500\u2500 */\n.skm-toast-stack{position:absolute;right:18px;bottom:18px;z-index:6;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}\n.skm-toast{display:inline-flex;align-items:center;gap:8px;max-width:min(460px,72vw);box-sizing:border-box;padding:8px 14px;border-radius:10px;font-size:12.5px;line-height:18px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-static-neutral-bluish-00,#fff);color:var(--dsw-alias-label-primary,#222);box-shadow:var(--dsw-shadow-lv2,0 6px 22px rgba(0,0,0,.16));animation:skm-toast-in 260ms cubic-bezier(.2,.9,.25,1) both}\n.skm-toast-ok{border-color:rgba(35,160,90,.38);color:#1c7a45}\n.skm-toast-err{border-color:rgba(226,80,64,.42);color:#b3271c}\n.skm-toast-dot{flex:none;width:6px;height:6px;border-radius:50%;background:currentColor;animation:skm-toast-ping 1.7s ease-out infinite}\n@keyframes skm-toast-in{from{opacity:0;transform:translateY(10px) scale(.97)}to{opacity:1;transform:none}}\n@keyframes skm-toast-ping{0%{box-shadow:0 0 0 0 currentColor;opacity:.9}70%{box-shadow:0 0 0 7px rgba(0,0,0,0);opacity:.35}100%{box-shadow:0 0 0 0 rgba(0,0,0,0);opacity:1}}\nbody[data-ds-dark-theme] .skm-toast{background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\nbody[data-ds-dark-theme] .skm-toast-ok{color:#6ee7a8}\nbody[data-ds-dark-theme] .skm-toast-err{color:#ff8a7a}\n\n/* \u2500\u2500 \u7A7A\u6280\u80FD\u5305\uFF1A\u53EF\u89C1 + \u53EF\u64CD\u4F5C\uFF08\u65E7\u5B9E\u73B0\u628A 0 \u6210\u5458\u7684\u5305\u6574\u6BB5\u8FC7\u6EE4\u6389\uFF0C\u5EFA\u5B8C\u5305\u5C31\u300C\u6D88\u5931\u300D\uFF09 \u2500\u2500 */\n.skm-bundle-empty{grid-column:1/-1;display:flex;align-items:center;gap:12px;flex-wrap:wrap;box-sizing:border-box;margin:2px 0 6px;padding:14px 16px;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.18));border-radius:12px;background:var(--dsw-alias-bg-layer-1,rgba(0,0,0,.02));animation:skm-fade-up 260ms ease both}\n.skm-bundle-empty-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary,#333)}\n.skm-bundle-empty-hint{flex:1 1 200px;min-width:160px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#8b9099)}\n.skm-bundle-empty-btn{flex:none;display:inline-flex;align-items:center;gap:6px;appearance:none;border:1px solid var(--dsw-alias-state-business-primary,#4176e6);border-radius:9px;padding:5px 12px;font-size:12px;line-height:18px;font-family:inherit;cursor:pointer;color:var(--dsw-alias-state-business-primary,#4176e6);background:transparent;transition:background 160ms ease,color 160ms ease,transform 160ms ease,box-shadow 160ms ease}\n.skm-bundle-empty-btn:hover{background:var(--dsw-alias-state-business-primary,#4176e6);color:#fff;transform:translateY(-1px);box-shadow:0 4px 14px rgba(65,118,230,.28)}\n.skm-bundle-empty-btn:active{transform:translateY(0)}\n@keyframes skm-fade-up{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}\n\n/* \u2500\u2500 \u8D26\u672C\u5931\u6548\u5F15\u7528\uFF1A\u660E\u8BF4\u300C\u5305\u91CC\u6709\u6307\u5411\u5DF2\u5220\u9664\u6280\u80FD\u7684\u6761\u76EE\u300D\u5E76\u4E00\u952E\u6E05\u7406 \u2500\u2500 */\n.skm-bundle-missing{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:2px 0 6px;padding:8px 12px;border-radius:10px;border:1px solid rgba(240,150,40,.38);background:rgba(240,150,40,.09);font-size:12px;line-height:18px;color:#8a5a12;animation:skm-fade-up 260ms ease both}\n.skm-bundle-missing code{padding:1px 6px;border-radius:5px;background:rgba(240,150,40,.16);font-size:11.5px}\n.skm-bundle-missing-btn{appearance:none;border:1px solid rgba(240,150,40,.55);background:transparent;border-radius:8px;padding:2px 9px;font-size:11.5px;line-height:18px;font-family:inherit;cursor:pointer;color:inherit;transition:background 140ms ease,transform 140ms ease}\n.skm-bundle-missing-btn:hover{background:rgba(240,150,40,.2);transform:translateY(-1px)}\nbody[data-ds-dark-theme] .skm-bundle-missing{color:#f0c48a}\n.skm-install-hint{margin:2px 0 0;font-size:11.5px;line-height:17px;color:var(--dsw-alias-label-tertiary,#8b9099)}\n\n/* \u2500\u2500 SKILL \u9876\u680F\u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 + \u72B6\u6001\u5206\u6BB5\uFF08\u5E26\u8BA1\u6570\uFF09+ \u5065\u5EB7\u6307\u793A + \u5237\u65B0/\u65B0\u5EFA/\u6DFB\u52A0 \u2500\u2500 */\n.skm-topbar-actions{flex:1 1 100%;order:4;min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.skm-status-seg-count{margin-left:6px;font-size:11px;line-height:15px;font-variant-numeric:tabular-nums;opacity:.72}\n.skm-health-inline{flex:none;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:17px;white-space:nowrap;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-health-inline::before{content:'';flex:none;width:7px;height:7px;border-radius:50%;background:currentColor}\n.skm-health-inline[data-tone='ok']{color:#12805c}\n.skm-health-inline[data-tone='warn']{color:#c2410c}\n.skm-health-inline[data-tone='pending'],.skm-health-inline[data-tone='idle']{color:var(--dsw-alias-label-caption,#adb2b8)}\n\n/* \u2500\u2500 \u79FB\u52A8\u7AEF\uFF1A\u4FA7\u680F\u6536\u7A84/\u9690\u85CF\u3001\u67E5\u770B\u5668\u4E0A\u4E0B\u5806\u53E0\u3001\u5361\u7247\u7F51\u683C\u5355\u5217 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 767.98px) {\n .skm-viewer-modal,.skm-viewer-modal-full{width:calc(100vw - 48px)}\n .skm-viewer-body,.skm-viewer-modal-full .skm-viewer-body{height:calc(100vh - 76px)}\n .skm-viewer-body > div:nth-of-type(2){padding:0 10px 10px}\n .skm-viewer-toolbar{flex-wrap:wrap;gap:6px;padding-bottom:8px}\n .skm-viewer-layout{flex-direction:column}\n .skm-viewer-nav{width:100%;border-right:none;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));flex:none;max-height:38%}\n .skm-viewer-content{flex:1;min-height:0;padding:16px 14px 28px}\n .skm-hub-side{display:none}\n .skm-skill-grid{grid-template-columns:minmax(0,1fr)}\n .skm-toolbar{padding:12px 12px 4px}\n .skm-banner{margin:10px 12px 0}\n .skm-main-scroll{padding:12px 12px 20px}\n}\n\n/* \u2500\u2500 \u51CF\u5F31\u52A8\u6548\uFF1A\u5361\u7247\u5165\u573A/\u60AC\u505C\u4F4D\u79FB\u4E0E\u5F00\u5173\u56DE\u5F39\u5168\u90E8\u6536\u655B \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (prefers-reduced-motion: reduce) {\n .skm-skill-card{animation:none;opacity:1;transition:none}\n .skm-assign-card{animation:none;opacity:1;transition:none}\n .skm-drop-menu{animation:none}\n .skm-viewer-modal{animation:none}\n .skm-viewer-modal,.skm-viewer-body,.skm-viewer-content,.skm-viewer-nav-item,.skm-viewer-tool-btn{transition:none}\n .skm-toggle-knob{transition:none}\n .skm-toggle{transition:none}\n .skm-tag{transition:none}\n .skm-skill-copy,.skm-skill-icon,.skm-skill-foot-icon,.skm-icon-action,.skm-bundle,.skm-hub-item,.skm-tool-button,.skm-banner,.skm-banner-btn,.skm-view-btn,.skm-drop-item,.skm-assign-card{transition:none}\n .skm-toast{animation:none}\n .skm-toast-dot{animation:none}\n .skm-bundle-empty,.skm-bundle-missing{animation:none}\n .skm-bundle-empty-btn,.skm-bundle-missing-btn{transition:none}\n .skm-skill-card::before,.skm-skill-badge,.skm-skill-title,.skm-tag-status{transition:none}\n .skm-cat-chip-row{animation:none}\n .skm-bundle-cat-tag,.skm-cat-selected-tag{animation:none}\n .skm-cat-chip,.skm-bundle-cat-tag,.skm-cat-preset,.skm-cat-remove,.skm-cat-input,.skm-cat-chip-count{transition:none}\n}\n`\n\nexport function ensureStyles() {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n", "/**\r\n * dnd \u2014 \u63D0\u793A\u8BCD\u9762\u677F\u7684\u62D6\u62FD\u8F7D\u8377 + \u300C\u62D6\u5230\u9636\u6BB5 Tab\u300D\u6295\u9012\u70B9\u3002\r\n *\r\n * \u4E09\u4E2A Tab \u7684\u62D6\u62FD\u624B\u52BF\uFF08\u4E0E locales \u91CC\u7684\u63D0\u793A\u6587\u6848\u4E00\u4E00\u5BF9\u5E94\uFF09\uFF1A\r\n * - \u5217\u8868\u5185\u4E0A\u4E0B\u62D6 = \u6392\u5E8F\uFF08\u6BB5\u884C\uFF1B\u5DE5\u5177\u5217\u8868\u6309\u6CE8\u518C\u8868\u987A\u5E8F\uFF0C\u4E0D\u652F\u6301\u6392\u5E8F\uFF09\uFF1B\r\n * - \u300C\u5168\u90E8\u300D\u6C60 \u21C4 \u9636\u6BB5\u5217\u8868 = \u52A0\u5165\u8BE5\u9636\u6BB5 / \u4ECE\u8BE5\u9636\u6BB5\u62FF\u6389\uFF1B\r\n * - \u884C\u62D6\u5230\u5934\u90E8\u9636\u6BB5 Tab = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u5DE5\u5177\u7684\u9690\u85CF\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF09\u3002\r\n *\r\n * \u8F7D\u8377\u8D70\u4E24\u6761\u8DEF\uFF1A`dataTransfer`\uFF08\u6807\u51C6\u8DEF\u5F84\uFF09\u4E0E\u6A21\u5757\u5185\u5B58\uFF08dragover \u9636\u6BB5\u591A\u6570\u6D4F\u89C8\u5668\r\n * \u4E0D\u7ED9\u8BFB dataTransfer\uFF0C\u540C\u9875\u9762\u62D6\u62FD\u672C\u6765\u4E5F\u4E0D\u9700\u8981\u5E8F\u5217\u5316\uFF09\u3002\u9636\u6BB5 Tab \u5728 Panel \u5934\u90E8\u3001\r\n * \u4E0E\u5217\u8868\u4E0D\u5728\u540C\u4E00\u68F5\u5B50\u6811\uFF0C\u6240\u4EE5\u6295\u9012\u70B9\u7528\u300C\u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\u6CE8\u518C\u4E00\u4E2A\u56DE\u8C03\u300D\u6765\u63A5\uFF1A\r\n * \u6362 Tab / \u6362\u6A21\u5F0F\u65F6\u65E7\u5217\u8868\u5378\u8F7D\u3001\u65B0\u5217\u8868\u6CE8\u518C\uFF0C\u4EFB\u4F55\u65F6\u523B\u53EA\u6709\u4E00\u4E2A\u5904\u7406\u8005\u3002\r\n */\r\nimport type { DragEvent as ReactDragEvent } from 'react'\r\nimport type { PhaseViewKey } from './types.ts'\r\n\r\n/** \u8F7D\u8377\u79CD\u7C7B\uFF1A\u6BB5\u884C / \u5DE5\u5177\u884C\u3002 */\r\nexport type DragKind = 'section' | 'tool'\r\n/** \u6765\u6E90\uFF1A\u67D0\u4E2A\u9636\u6BB5\u5217\u8868\uFF0C\u6216\u300C\u5168\u90E8\u300D\u53EA\u8BFB\u6C60\u3002 */\r\nexport type DragFrom = PhaseViewKey | 'pool'\r\n\r\nexport interface DragPayload {\r\n kind: DragKind\r\n name: string\r\n from: DragFrom\r\n /** \u6BB5\u884C\u5F53\u524D\u6587\u672C\uFF08\u62D6\u5230\u522B\u7684\u9636\u6BB5\u65F6\u4F5C\u4E3A\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165\u6587\u672C\uFF09\uFF1B\u5DE5\u5177\u4E0D\u7528\u3002 */\r\n text?: string\r\n /** \u5DE5\u5177\u884C\u5F53\u524D\u662F\u5426\u5728\u8BE5\u9636\u6BB5\u9690\u85CF\uFF1A\u9636\u6BB5\u95F4\u590D\u5236\u65F6\u4E00\u8D77\u5E26\u8FC7\u53BB\u3002 */\r\n hidden?: boolean\r\n}\r\n\r\n/** \u81EA\u5B9A\u4E49 MIME\uFF1A\u540C\u9875\u9762\u5185\u7528\u5B83\u533A\u5206\u300C\u672C\u9762\u677F\u7684\u62D6\u62FD\u300D\u4E0E\u5916\u90E8\u62D6\u5165\uFF08\u5982\u5BFC\u5165\u6280\u80FD\uFF09\u3002 */\r\nconst MIME = 'application/x-dsh-prompt-part'\r\n\r\n/**\r\n * \u662F\u4E0D\u662F\u672C\u9762\u677F\u53D1\u8D77\u7684\u62D6\u62FD \u2014\u2014 \u539F\u751F\u4E8B\u4EF6\u7248\uFF08drag-scroll \u7528\uFF09\u3002\r\n *\r\n * \u62D6\u62FD\u8FDB\u884C\u4E2D `dataTransfer.types` \u53EF\u8BFB\uFF08\u6570\u636E\u672C\u8EAB\u88AB\u4FDD\u62A4\uFF0C\u7C7B\u578B\u6E05\u5355\u4E0D\u4FDD\u62A4\uFF09\uFF0C\r\n * \u6240\u4EE5\u6355\u83B7\u9636\u6BB5\u7684\u76D1\u542C\u80FD\u9760\u5B83\u8FC7\u6EE4\uFF1A\u53EA\u7ED9\u81EA\u5DF1\u4EBA\u7684\u62D6\u62FD\u505A\u8D34\u8FB9\u6EDA\u52A8\uFF0C\u5916\u6765\u62D6\u5165\u4E0D\u6EDA\u3002\r\n */\r\nexport function isPanelDrag(event: DragEvent): boolean {\r\n const types = event.dataTransfer?.types\r\n if (types === undefined) return false\r\n return Array.from(types).includes(MIME)\r\n}\r\n\r\nlet current: DragPayload | null = null\r\nlet phaseDrop: ((key: PhaseViewKey, payload: DragPayload) => void) | null = null\r\n\r\n/** \u62D6\u8D77\uFF1A\u767B\u8BB0\u8F7D\u8377 + \u5199 dataTransfer\uFF08\u5199\u4E0D\u8FDB\u53BB\u4E5F\u80FD\u9760\u5185\u5B58\u8F7D\u8377\u7EE7\u7EED\uFF09\u3002 */\r\nexport function beginDrag(event: ReactDragEvent, payload: DragPayload): void {\r\n current = payload\r\n try {\r\n event.dataTransfer.setData(MIME, JSON.stringify(payload))\r\n event.dataTransfer.setData('text/plain', payload.name)\r\n event.dataTransfer.effectAllowed = 'copyMove'\r\n } catch { /* \u81EA\u5B9A\u4E49 MIME \u88AB\u62D2\uFF1A\u8BFB\u4FA7\u56DE\u843D\u5185\u5B58\u8F7D\u8377 */ }\r\n}\r\n\r\n/** \u62D6\u5B8C\uFF1A\u6E05\u6389\u8F7D\u8377\uFF08drop \u4E4B\u540E\u6D4F\u89C8\u5668\u8FD8\u4F1A\u8865\u4E00\u6B21 dragend\uFF09\u3002 */\r\nexport function finishDrag(): void {\r\n current = null\r\n}\r\n\r\n/** \u8BFB\u8F7D\u8377\uFF1A\u4F18\u5148 dataTransfer\uFF0C\u56DE\u843D\u5185\u5B58\uFF08dragover \u9636\u6BB5\u53EA\u53EF\u80FD\u662F\u540E\u8005\uFF09\u3002 */\r\nexport function payloadOf(event: ReactDragEvent): DragPayload | null {\r\n try {\r\n const raw = event.dataTransfer.getData(MIME)\r\n if (raw !== '') return JSON.parse(raw) as DragPayload\r\n } catch { /* \u8BFB\u4E0D\u5230\u5C31\u7528\u5185\u5B58\u8F7D\u8377 */ }\r\n return current\r\n}\r\n\r\n/** \u662F\u4E0D\u662F\u672C\u9762\u677F\u8BA4\u53EF\u7684\u53EF\u6295\u653E\u8F7D\u8377\uFF08dragover \u9760\u5B83\u51B3\u5B9A\u8981\u4E0D\u8981 preventDefault\uFF09\u3002 */\r\nexport function acceptsDrop(event: ReactDragEvent, kind: DragKind): boolean {\r\n const payload = payloadOf(event)\r\n return payload !== null && payload.kind === kind\r\n}\r\n\r\n/** \u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\uFF08\u6BB5 / \u5DE5\u5177\uFF09\u628A\u300C\u62D6\u5230\u9636\u6BB5 Tab\u300D\u7684\u5904\u7406\u51FD\u6570\u6CE8\u518C\u8FDB\u6765\u3002 */\r\nexport function setPhaseDropHandler(next: ((key: PhaseViewKey, payload: DragPayload) => void) | null): void {\r\n phaseDrop = next\r\n}\r\n\r\n/** \u9636\u6BB5 Tab \u88AB\u6295\u653E\uFF1A\u4EA4\u7ED9\u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\u5904\u7406\uFF08\u6CA1\u6709\u5217\u8868\u5C31\u4EC0\u4E48\u90FD\u4E0D\u505A\uFF09\u3002 */\r\nexport function dropOnPhase(key: PhaseViewKey, payload: DragPayload | null): void {\r\n if (payload === null) return\r\n phaseDrop?.(key, payload)\r\n}\r\n", "/** \u63D0\u793A\u8BCD\u5B9A\u5236\u9762\u677F\u5404\u7EC4\u4EF6\u5171\u4EAB\u7684\u5185\u8054\u6837\u5F0F\uFF08\u989C\u8272\u8D70\u534A\u900F\u660E\u7070\uFF0C\u968F\u5BBF\u4E3B\u4E3B\u9898\u81EA\u7136\u9002\u914D\uFF09\u3002 */\nexport const s = (() => {\n const flex = { display: 'flex', alignItems: 'center' }\n return {\n // \u2500\u2500 \u9762\u677F\u9AA8\u67B6\uFF08\u62BD\u5C49\u5185\u90E8\u5206\u680F\u5E03\u5C40\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n pRoot: { height: '100%', display: 'flex', flexDirection: 'column', fontFamily: 'inherit', fontSize: 13, lineHeight: 1.5, minHeight: 0 },\n head: { ...flex, gap: 10, padding: '10px 14px 8px', flexWrap: 'wrap', borderBottom: '1px solid rgba(128,128,128,.18)' },\n headTitle: { ...flex, gap: 8, fontSize: 15, fontWeight: 600, whiteSpace: 'nowrap' },\n seg: { ...flex, gap: 2, padding: 2, border: '1px solid rgba(128,128,128,.28)', borderRadius: 8 },\n segBtn: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.72, fontSize: 13, whiteSpace: 'nowrap' },\n segBtnActive: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.22)', cursor: 'pointer', color: 'inherit', fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap' },\n // \u62D6\u62FD\u60AC\u505C\u5728\u9636\u6BB5\u6309\u94AE\u4E0A\uFF08\u677E\u624B = \u590D\u5236\u5230\u8BE5\u9636\u6BB5\uFF09\u3002\n segBtnDrop: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.16)', outline: '2px dashed rgba(88,166,255,.85)', outlineOffset: 1, cursor: 'pointer', color: 'inherit', fontSize: 13, whiteSpace: 'nowrap' },\n segBtnDropActive: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.3)', outline: '2px dashed rgba(88,166,255,.9)', outlineOffset: 1, cursor: 'pointer', color: 'inherit', fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap' },\n grow: { flex: 1, minWidth: 0 },\n headActions: { ...flex, gap: 6, marginLeft: 'auto' },\n iconBtn: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 28, height: 28, border: 'none', borderRadius: 8, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.75 },\n // \u9884\u8BBE\uFF08\u7F16\u8F91\u76EE\u6807\uFF09\u884C\u6539\u7528\u80FD\u529B\u9762\u677F\u9876\u680F\u7684 chips \u7C7B\u540D\uFF08\u89C1 Panel.tsx \u7684 css.topbar / css.catItem\uFF09\uFF0C\n // \u8FD9\u91CC\u4E0D\u518D\u4FDD\u7559\u81EA\u7ED8\u7684 subhead / targetRow / targetTab \u6837\u5F0F\u3002\n body: { flex: 1, minHeight: 0, display: 'flex', alignItems: 'stretch' },\n colLeft: { width: 420, flex: 'none', display: 'flex', flexDirection: 'column', minHeight: 0, borderRight: '1px solid rgba(128,128,128,.18)', boxSizing: 'border-box' },\n colScroll: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '10px 12px' },\n colFoot: { flex: 'none', ...flex, gap: 8, padding: '8px 12px', borderTop: '1px solid rgba(128,128,128,.18)', flexWrap: 'wrap' },\n colRight: { flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', minHeight: 0 },\n colRightScroll: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '10px 14px' },\n groupHead: { ...flex, gap: 8, marginBottom: 6, color: 'rgba(128,128,128,.95)', fontSize: 12, fontWeight: 600 },\n // \u2500\u2500 \u901A\u7528\u63A7\u4EF6\uFF08\u6CBF\u7528\u65E7\u9762\u677F\u7684\u89C2\u611F\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n list: { display: 'flex', flexDirection: 'column', gap: 6 },\n row: { ...flex, gap: 8, padding: '6px 8px', border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(128,128,128,.06)' },\n switchWrap: { ...flex, gap: 6, minWidth: 90 },\n rowBody: { flex: 1, minWidth: 0 },\n rowTitle: { ...flex, gap: 6, alignItems: 'baseline', flexWrap: 'wrap' },\n code: { fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' },\n orderTag: { color: 'rgba(128,128,128,.8)', fontSize: 11 },\n preview: { color: 'rgba(128,128,128,.85)', fontSize: 12, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },\n previewText: { fontFamily: 'monospace', fontSize: 12, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', flex: 1, minHeight: 0, overflowY: 'auto', padding: 10, border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(0,0,0,.18)', margin: 0 },\n toolWrap: { display: 'flex', flexWrap: 'wrap', gap: 6 },\n toolChip: { fontFamily: 'monospace', fontSize: 12, color: 'rgba(128,128,128,.95)', border: '1px solid rgba(128,128,128,.3)', borderRadius: 6, padding: '2px 6px', cursor: 'help' },\n badgeOk: { color: '#3fb950', fontSize: 11, border: '1px solid rgba(63,185,80,.5)', borderRadius: 999, padding: '0 6px' },\n badgeBlocked: { color: '#f85149', fontSize: 11, border: '1px solid rgba(248,81,73,.5)', borderRadius: 999, padding: '0 6px' },\n badgeReplaced: { color: '#d29922', fontSize: 11, border: '1px solid rgba(210,153,34,.5)', borderRadius: 999, padding: '0 6px' },\n badgeCustom: { color: '#58a6ff', fontSize: 11, border: '1px solid rgba(88,166,255,.5)', borderRadius: 999, padding: '0 6px' },\n badgeSystem: { color: 'rgba(128,128,128,.85)', fontSize: 11, border: '1px solid rgba(128,128,128,.4)', borderRadius: 999, padding: '0 6px' },\n mini: { padding: '3px 8px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', whiteSpace: 'nowrap' },\n arrowCol: { display: 'flex', flexDirection: 'column', gap: 2 },\n arrow: { padding: '0 6px', border: '1px solid rgba(128,128,128,.3)', borderRadius: 4, background: 'transparent', cursor: 'pointer', color: 'inherit', fontSize: 11, lineHeight: 1.4, opacity: 0.8 },\n rowBlocked: { opacity: 0.55 },\n // \u2500\u2500 \u62D6\u62FD\uFF08\u89C1 dnd.ts\uFF09\uFF1A\u6293\u624B / \u62D6\u52A8\u4E2D\u7684\u884C / \u884C\u4E0A\u7684\u63D2\u5165\u4F4D\u7F6E / \u6574\u5757\u6295\u653E\u533A \u2500\u2500\n dragHandle: { flex: 'none', cursor: 'grab', color: 'rgba(128,128,128,.85)', fontSize: 13, lineHeight: 1, userSelect: 'none', padding: '0 2px' },\n dragging: { opacity: 0.5 },\n dropAbove: { boxShadow: 'inset 0 2px 0 0 #58a6ff' },\n dropBelow: { boxShadow: 'inset 0 -2px 0 0 #58a6ff' },\n dropZone: { outline: '2px dashed rgba(88,166,255,.55)', outlineOffset: -3, borderRadius: 8 },\n dropZoneActive: { outline: '2px dashed rgba(88,166,255,.9)', outlineOffset: -3, borderRadius: 8, background: 'rgba(88,166,255,.06)' },\n injectBox: { marginTop: 10, padding: '8px', border: '1px dashed rgba(128,128,128,.4)', borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6 },\n injectRow: { ...flex, gap: 6 },\n editBox: { display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4 },\n editInput: { padding: '6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit', fontFamily: 'inherit', fontSize: 12, resize: 'vertical', width: '100%', boxSizing: 'border-box' },\n input: { padding: '4px 6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit' },\n muted: { color: 'rgba(128,128,128,.75)', fontSize: 12 },\n error: { color: '#f85149', fontSize: 12, marginBottom: 6 },\n noticeOk: { color: '#3fb950', fontSize: 12, marginBottom: 6 },\n noticeWarn: { color: '#d29922', fontSize: 12, marginBottom: 6 },\n saveBtn: { padding: '4px 12px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },\n saveBtnDirty: { padding: '4px 12px', border: '1px solid #d29922', borderRadius: 6, background: 'rgba(210,153,34,.15)', cursor: 'pointer', color: 'inherit' },\n }\n})()\n", "/** \u7EAF\u51FD\u6570\u7684\u9884\u8BBE / \u6BB5\u64CD\u4F5C\u52A9\u624B\uFF0C\u540C\u65F6\u88AB\u5BA2\u6237\u7AEF UI \u4E0E Node \u6D4B\u8BD5\u590D\u7528\uFF08\u4E0D\u89E6\u78B0 IO \u4E0E React\uFF09\u3002 */\nimport type { Config, Inventory, OverrideData, Phase, PhaseViewKey, Preset, PresetData, ToolsConfig } from './types.ts'\n\nexport interface Section {\n name: string\n order: number\n text?: string\n active: boolean\n replaced: boolean\n /** `system` = \u8BFB\u81EA\u5BBF\u4E3B\u63D0\u793A\u8BCD\u6E05\u5355\uFF08\u4E0D\u53EF\u5220\u9664\uFF09\uFF1B`custom` = \u672C\u63D2\u4EF6\u6CE8\u5165\uFF08\u53EF\u5220\u9664\uFF09\u3002 */\n source?: 'system' | 'custom'\n}\n\n/** \u5E94\u7528\u9884\u8BBE\u540E\u9700\u8981\u56DE\u5199\u5230\u8BBE\u7F6E\u4F5C\u7528\u57DF\u7684\u90A3\u90E8\u5206\u914D\u7F6E\u5B57\u6BB5\u3002\n * \u9636\u6BB5\u540D\u5355\u4E3A\u53EF\u9009\uFF1A\u65E7\u5FEB\u7167\u4E0D\u5E26 \u2192 \u5E94\u7528\u65F6\u4FDD\u7559\u5F53\u524D\u503C\uFF0C\u7EDD\u4E0D\u62B9\u6389\u3002 */\nexport interface ConfigPatch {\n sections: string[]\n sectionsBootstrap?: string[]\n sectionsCompaction?: string[]\n replace: Record<string, string>\n inject: ResolvedInject[]\n tools: ToolsConfig\n}\n\n/** \u5FEB\u7167\u6355\u83B7\u7684\u9636\u6BB5 order \u7A7A\u95F4\uFF08always \u4E4B\u5916\u7684\u4E09\u4E2A\u9636\u6BB5\uFF09\u3002 */\nconst CAPTURE_PHASES: Array<'bootstrap' | 'active' | 'compaction'> = ['bootstrap', 'active', 'compaction']\n\n/** \u628A\u4E00\u6761\u6709\u5E8F\u540D\u5B57\u8F6C\u6210\u76F8\u5BF9\u94FE\uFF08\u6BCF\u6BB5\u8BB0\u4F4F\u5B83\u7684\u524D\u4E00\u6BB5\uFF09\uFF0Ctext / custom \u53EA\u7ED9 custom \u6BB5\u3002 */\nfunction toChain(names: string[], textOf: (name: string) => string, customOf: (name: string) => boolean, phase?: Phase): NonNullable<PresetData['order']> {\n return names.map((name, i) => ({\n name,\n after: i > 0 ? names[i - 1] : undefined,\n text: customOf(name) ? (textOf(name) ?? '') : '',\n custom: customOf(name),\n ...(phase !== undefined ? { phase } : {}),\n }))\n}\n\n/**\n * \u4ECE\u5F53\u524D\u914D\u7F6E\u6784\u5EFA\u9884\u8BBE\u5FEB\u7167\uFF08\u5B8C\u6574\u6355\u83B7\uFF0C\u542B\u6BCF\u9636\u6BB5\u72EC\u7ACB\u8BBE\u5B9A\uFF09\u3002\n *\n * \u5168\u5C40\u76F8\u5BF9\u94FE\u6D3E\u751F\u81EA\u5408\u5E76\u540E\u7684\u5B8C\u6574\u6BB5\u5217\u8868\uFF08\u800C\u4E0D\u4EC5\u662F `cfg.inject`\uFF09\uFF0C\u8FD9\u6837\u5373\u4F7F\u4FDD\u5B58\u524D\n * \u53EA\u662F\u5C4F\u853D\u4E86\u51E0\u4E2A\u6BB5\uFF08\u6CA1\u6709\u91CD\u6392\uFF09\uFF0C\u9884\u8BBE\u4ECD\u4F1A\u643A\u5E26\u5B8C\u6574\u7684\u6709\u5E8F\u96C6\u5408\uFF0C\u5E94\u7528\u65F6\u624D\u80FD\u5F97\u5230\u4E00\u4E2A\n * \u6709\u610F\u4E49\u7684\u300C\u6FC0\u6D3B\u5217\u8868\u300D\u3002\u5728\u6B64\u4E4B\u4E0A\uFF0Cbootstrap / active / compaction \u5404\u518D\u5E26\u4E00\u6761\u81EA\u5DF1\n * \u7684\u76F8\u5BF9\u94FE \u2014\u2014 \u6570\u636E\u6E90\u5C31\u662F UI \u9010\u9636\u6BB5\u6301\u4E45\u5316\u7684\u6CE8\u5165\u6761\u76EE\uFF08\u6BCF\u9636\u6BB5\u72EC\u7ACB\u7684 order \u7A7A\u95F4\uFF09\uFF0C\n * \u5426\u5219\u9636\u6BB5\u5316\u7684\u540D\u5355\u4E0E\u6392\u5E8F\u5728\u300C\u5BFC\u51FA \u2192 \u5BFC\u5165 \u2192 \u5E94\u7528\u300D\u540E\u5C31\u4E22\u4E86\u3002\n */\nexport function buildPresetData(cfg: Config, merged: Section[]): PresetData {\n const globalNames = merged.map((sec) => sec.name)\n const textOf = new Map(merged.map((sec) => [sec.name, sec.text ?? ''] as const))\n const customOf = new Map(merged.map((sec) => [sec.name, sec.source === 'custom'] as const))\n const order = toChain(globalNames, (n) => textOf.get(n) ?? '', (n) => customOf.get(n) === true)\n for (const phase of CAPTURE_PHASES) {\n const items = (cfg.inject ?? [])\n .filter((item) => item.phase === phase)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n if (items.length === 0) continue\n order.push(...toChain(\n items.map((item) => item.name),\n (n) => items.find((item) => item.name === n)?.text ?? '',\n (n) => items.find((item) => item.name === n)?.custom === true,\n phase,\n ))\n }\n const data: PresetData = {\n sections: cfg.sections,\n replace: cfg.replace,\n order,\n tools: cfg.tools,\n }\n // \u975E\u7A7A\u624D\u6355\u83B7\uFF1A\u6CA1\u6709\u9636\u6BB5\u540D\u5355\u7684\u914D\u7F6E\u5BFC\u51FA\u7684\u5FEB\u7167\u4E0E\u6539\u52A8\u524D\u9010\u952E\u4E00\u81F4\u3002\n if ((cfg.sectionsBootstrap ?? []).length > 0) data.sectionsBootstrap = cfg.sectionsBootstrap\n if ((cfg.sectionsCompaction ?? []).length > 0) data.sectionsCompaction = cfg.sectionsCompaction\n return data\n}\n\n/**\n * \u628A\u5BBF\u4E3B\u6E05\u5355\u6BB5\u4E0E\u7528\u6237\u6CE8\u5165\u5217\u8868\u6309 order \u5408\u5E76\u3001\u6392\u5E8F\u3002\n * \u8BFB\u81EA\u6E05\u5355\uFF08\u5176\u4ED6\u63D2\u4EF6\u4EA7\u51FA\uFF09\u7684\u6BB5\u6807\u8BB0\u4E3A `system`\uFF1B\u672C\u63D2\u4EF6\u751F\u6210\u7684\u6BB5\u5E26\u9690\u85CF\u7684\n * `custom` \u6807\u8BB0\uFF0C\u6807\u8BB0\u4E3A `custom`\u3002\u6765\u6E90\u53EA\u7531\u9690\u85CF\u6807\u8BB0\u51B3\u5B9A\u2014\u2014\u7EDD\u4E0D\u9760\u540D\u5B57\u78B0\u649E\n * \u5224\u65AD\u2014\u2014\u56E0\u6B64\u5373\u4F7F\u81EA\u5B9A\u4E49\u6BB5\u6070\u597D\u4E0E\u67D0\u4E2A\u6E05\u5355\u6BB5\u91CD\u540D\uFF0C\u5B83\u4E5F\u80FD\u4FDD\u4F4F\u81EA\u5DF1\u7684\u8EAB\u4EFD\n * \uFF08\u4EE5\u53CA\u53EF\u5220\u9664\u6027\uFF09\uFF0C\u5E76\u5728\u5207\u6362\u9884\u8BBE\u540E\u4F9D\u7136\u6210\u7ACB\u3002\u81EA\u5B9A\u4E49\u6BB5\u59CB\u7EC8\u6E32\u67D3\u81EA\u5DF1\u7684\u6587\u672C\uFF0C\n * \u6C38\u8FDC\u4E0D\u4F1A\u663E\u793A\u4E3A\u300C<\u52A8\u6001\u751F\u6210>\u300D\u3002\n */\nexport function mergeSections(inv: Inventory | null, cfg: Config, blockedNames: ReadonlySet<string>): Section[] {\n const map = new Map<string, Section>()\n for (const sec of inv?.sections ?? []) map.set(sec.name, { ...sec, source: 'system' })\n for (const item of cfg.inject ?? []) {\n const isCustom = item.custom === true\n const existing = map.get(item.name)\n if (existing) {\n map.set(item.name, isCustom\n ? { ...existing, order: item.order, text: item.text ?? '', source: 'custom' }\n : { ...existing, order: item.order, source: 'system' })\n } else {\n map.set(item.name, {\n name: item.name,\n order: item.order,\n text: item.text ?? '',\n active: !blockedNames.has(item.name),\n replaced: false,\n source: isCustom ? 'custom' : 'system',\n })\n }\n }\n return [...map.values()].sort((a, b) => a.order - b.order).map((sec, i) => ({ ...sec, order: i }))\n}\n\n/** ConfigPatch \u91CC\u5BF9\u5916\u7684\u6CE8\u5165\u6761\u76EE\uFF08always \u7EC4\u523B\u610F\u4E0D\u5E26 phase \u952E\uFF09\u3002 */\nexport interface ResolvedInject {\n name: string\n order: number\n text: string\n custom?: boolean\n phase?: Phase\n}\n\n/**\n * \u628A\u4E00\u6761\u76F8\u5BF9\u94FE\u89E3\u6790\u4E3A\u7EDD\u5BF9\u6709\u5E8F\u540D\u5B57\uFF080..n-1\uFF09\u3002\n * \u6CA1\u6709\u951A\u70B9\uFF08\u6216\u951A\u70B9\u4E0D\u5728\u672C\u7EC4\u5185\uFF09\u7684\u540D\u5B57\u6309\u539F\u59CB\u987A\u5E8F\u6392\u5728\u6700\u524D\uFF1B\u6BCF\u4E2A\u5E26\u951A\u70B9\u7684\u540D\u5B57\n * \u63D2\u5230\u5176\u951A\u70B9\u4E4B\u540E\uFF1B\u5269\u4F59\u7684\u540D\u5B57\uFF08\u5B58\u5728\u73AF\uFF09\u8FFD\u52A0\u5230\u672B\u5C3E\u3002\n */\nfunction resolveChain(list: Array<{ name: string; after?: string }>): string[] {\n const afterMap = new Map<string, string | undefined>()\n for (const sec of list) afterMap.set(sec.name, sec.after)\n\n const result: string[] = []\n const placed = new Set<string>()\n\n for (const sec of list) {\n const anchor = afterMap.get(sec.name)\n if (!anchor || !afterMap.has(anchor)) { result.push(sec.name); placed.add(sec.name) }\n }\n\n let changed = true\n while (changed) {\n changed = false\n for (const sec of list) {\n if (placed.has(sec.name)) continue\n const anchor = afterMap.get(sec.name)\n if (anchor && placed.has(anchor)) {\n result.splice(result.indexOf(anchor) + 1, 0, sec.name)\n placed.add(sec.name)\n changed = true\n }\n }\n }\n\n for (const sec of list) {\n if (!placed.has(sec.name)) { result.push(sec.name); placed.add(sec.name) }\n }\n return result\n}\n\n/**\n * \u628A\u5FEB\u7167\u91CC\u7684\u76F8\u5BF9\u987A\u5E8F\u89E3\u6790\u4E3A\u6CE8\u5165\u6761\u76EE\u5217\u8868\u3002\n *\n * order \u6761\u76EE\u53EF\u4EE5\u5E26 `phase`\uFF1A\u540C\u540D\u800C\u4E0D\u540C phase \u7684\u591A\u6761 = \u8BE5\u6BB5\u5728\u591A\u4E2A\u9636\u6BB5\u5404\u6709\u81EA\u5DF1\u7684\n * \u4F4D\u7F6E\uFF08\u6BCF\u9636\u6BB5\u6709\u72EC\u7ACB\u7684 order \u7A7A\u95F4\uFF0C\u4E0E UI \u7684 phaseInjectEntries \u4E00\u81F4\uFF09\u3002\u65E0 phase\n * \u7684\u6761\u76EE\u5C5E\u4E8E always \u7EC4 \u2014\u2014 \u4E5F\u5C31\u662F\u65E7\u5FEB\u7167\u7684\u5355\u4E00\u5168\u5C40\u5E8F\uFF0C\u8F93\u51FA\u5F62\u72B6\u4E0E\u65E7\u5B9E\u73B0\u9010\u952E\u4E00\u81F4\n * \uFF08\u523B\u610F\u4E0D\u5199 phase \u952E\uFF0C\u300C\u4FDD\u5B58 \u2192 \u5E94\u7528 = \u4E0D\u52A8\u70B9\u300D\u7684\u4E0D\u53D8\u91CF\u4F9D\u8D56\u952E\u5F62\u72B6\u5B8C\u5168\u76F8\u540C\uFF09\u3002\n */\nexport function resolveOrder(presetOrder: PresetData['order']): ResolvedInject[] {\n const list = presetOrder ?? []\n const groups = new Map<Phase, NonNullable<PresetData['order']>>([['always', []]])\n for (const sec of list) {\n const phase = sec.phase ?? 'always'\n const group = groups.get(phase)\n if (group) group.push(sec)\n else groups.set(phase, [sec])\n }\n const out: ResolvedInject[] = []\n for (const [phase, members] of groups) {\n const textMap = new Map(members.map((x) => [x.name, x.text ?? '']))\n const customMap = new Map(members.map((x) => [x.name, x.custom === true]))\n const names = resolveChain(members)\n out.push(...names.map((name, i) => (phase === 'always'\n ? { name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name) }\n : { name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name), phase })))\n }\n return out\n}\n\n/**\n * \u8BA1\u7B97\u5E94\u7528\u9884\u8BBE\u65F6\u7684\u914D\u7F6E\u8865\u4E01\uFF1A\n * - \u540C\u540D\u6BB5\u88AB\u8986\u76D6\uFF08\u987A\u5E8F\u5217\u8868\u5728\u8FD0\u884C\u65F6\u9A71\u52A8\u8FD9\u4E00\u884C\u4E3A\uFF09\n * - \u9884\u8BBE\u4E2D\u6709\u3001\u5F53\u524D\u7CFB\u7EDF\u91CC\u5339\u914D\u4E0D\u4E0A\u7684\u6BB5\u9ED8\u8BA4\u8DF3\u8FC7\uFF08\u8DE8\u7CFB\u7EDF\u5BFC\u5165\u4E0D\u51ED\u7A7A\u5EFA\u6BB5\uFF09\n * - \u5F53\u524D\u6709\u3001\u4F46\u4E0D\u5728\u9884\u8BBE\u6709\u5E8F\u5217\u8868\u4E2D\u7684\u6BB5\u9ED8\u8BA4\u88AB\u5C4F\u853D\n * - \u53EA\u6709\u9884\u8BBE\u7684\u300C\u6FC0\u6D3B\u6BB5\u300D\uFF08\u5728 order \u5217\u8868\u4E14\u4E0D\u5728\u5176\u5C4F\u853D\u540D\u5355\u4E2D\uFF09\u88AB\u89E3\u9664\u5C4F\u853D\uFF1B\n * \u9884\u8BBE\u81EA\u5DF1\u5C4F\u853D\u7684\u6BB5\u4FDD\u6301\u5C4F\u853D\u3002\n *\n * \u5F53\u524D\u914D\u7F6E\u91CC\u5B58\u5728\u3001\u4F46\u4E0D\u5728\u9884\u8BBE\u6709\u5E8F\u5217\u8868\u4E2D\u7684\u81EA\u5B9A\u4E49\u6CE8\u5165\u6BB5\u4F1A\u88AB\u4FDD\u7559\u5230\u7ED3\u679C\u7684\n * inject \u5217\u8868\u4E2D\uFF08\u56E0\u6B64\u4ECD\u7136\u53EF\u89C1\uFF09\u5E76\u7F6E\u4E3A\u7981\u7528\uFF08\u52A0\u5165\u5C4F\u853D\u96C6\u5408\uFF09\uFF0C\u800C\u4E0D\u662F\u88AB\u9759\u9ED8\n * \u4E22\u5F03\u2014\u2014\u9884\u8BBE\u4E0D\u80FD\u8BA9\u7528\u6237\u81EA\u5DF1\u6CE8\u5165\u7684\u51ED\u7A7A\u6D88\u5931\u3002\n */\nexport function applyPresetData(data: PresetData, cfg: Config, currentNames: ReadonlySet<string>): ConfigPatch {\n const presetOrder = data.order ?? []\n const presetNames = new Set(presetOrder.map((x) => x.name))\n // \u9ED1\u540D\u5355\u540C\u6837\u6309\u5F53\u524D\u7CFB\u7EDF\u8FC7\u6EE4\uFF1A\u5339\u914D\u4E0D\u4E0A\u7684\u540D\u5B57\u8DF3\u8FC7\uFF08\u5C4F\u853D\u4E0D\u5B58\u5728\u7684\u6BB5\u6CA1\u6709\u610F\u4E49\uFF0C\n // \u8FD8\u4F1A\u6C61\u67D3\u914D\u7F6E\uFF0C\u8BA9\u4E0B\u4E00\u6B21\u5FEB\u7167\u51FA\u73B0\u300Csections \u2286 order\u300D\u88AB\u7834\u574F\u7684\u5B64\u513F\u540D\u5355\uFF09\u3002\n const blocked = new Set((data.sections ?? []).filter((n) => currentNames.has(n)))\n\n // \u6CE8\u5165\u5217\u8868 = \u9884\u8BBE\u89E3\u6790\u51FA\u7684\u987A\u5E8F\uFF0C\u518D\u8FFD\u52A0\u5F53\u524D\u914D\u7F6E\u4E2D\u5B58\u5728\u3001\u4F46\u9884\u8BBE\u5217\u8868\u6CA1\u6709\u7684\n // \u81EA\u5B9A\u4E49\u6CE8\u5165\u6BB5\u3002\u8BA9\u5B83\u4EEC\u7559\u5728 `inject` \u91CC\u624D\u80FD\u4FDD\u6301\u53EF\u89C1\uFF1B\u968F\u540E\u7EDF\u4E00\u7F6E\u4E3A\u7981\u7528\u3002\n // \u88AB\u4FDD\u7559\u7684\u81EA\u5B9A\u4E49\u6BB5\u63A5\u5728\u9884\u8BBE\u81EA\u8EAB\u7684\u4E0B\u6807\u4E4B\u540E\uFF1B\u82E5\u9884\u8BBE\u53EA\u8986\u76D6\u4E00\u5C0F\u90E8\u5206\u6BB5\uFF0C\u5B83\u4EEC\n // \u53EF\u80FD\u4E0E\u6E05\u5355\u539F\u751F order \u5E76\u5217\u2014\u2014\u5408\u5E76\u89C6\u56FE\u6309\u7A33\u5B9A\u6392\u5E8F\uFF08\u6E05\u5355\u5728\u524D\uFF09\uFF0C\u987A\u5E8F\u4ECD\u662F\n // \u786E\u5B9A\u6027\u7684\uFF0C\u4E14\u4E0B\u4E00\u6B21\u91CD\u6392/\u6301\u4E45\u5316\u4F1A\u628A\u6240\u6709\u4E0B\u6807\u91CD\u65B0\u8FDE\u7EED\u5316\u3002\n // \u9884\u8BBE order \u5148\u6309\u5F53\u524D\u7CFB\u7EDF\u7684\u6BB5\u540D\u8FC7\u6EE4\uFF08\u5339\u914D\u4E0D\u4E0A\u5C31\u8DF3\u8FC7\uFF0C\u7EDD\u4E0D\u51ED\u7A7A\u5EFA\u6BB5\uFF09\u2014\u2014\n // \u5728\u89E3\u6790\u524D\u8FC7\u6EE4\u8BA9\u4FDD\u7559\u6761\u76EE\u7684 order \u4FDD\u6301\u6309\u7EC4\u8FDE\u7EED\uFF1B\u951A\u70B9\u88AB\u8FC7\u6EE4\u6389\u65F6\n // resolveChain \u4F1A\u628A\u8BE5\u6761\u76EE\u56DE\u9000\u5230\u7EC4\u5C3E\uFF0C\u987A\u5E8F\u4ECD\u7136\u786E\u5B9A\u3002\n const inject = resolveOrder(presetOrder.filter((x) => currentNames.has(x.name)))\n const kept = new Set(inject.map((x) => x.name))\n let order = inject.length\n for (const item of cfg.inject ?? []) {\n if (!item || !item.name || presetNames.has(item.name) || kept.has(item.name)) continue\n kept.add(item.name)\n inject.push({ name: item.name, order: order++, text: item.text ?? '', custom: item.custom === true })\n }\n\n // \u4EC5\u5F53\u9884\u8BBE\u786E\u5B9E\u5B9A\u4E49\u4E86 order \u5217\u8868\u65F6\u624D\u5F3A\u5236\u6267\u884C\u300C\u6FC0\u6D3B\u96C6\u5408\u300D\u3002\n // \u7A7A\u7684 order\uFF08\u4F8B\u5982\u624B\u5DE5\u7F16\u5199 / \u53EA\u5C4F\u853D\u4E86\u51E0\u4E2A\u6BB5\u7684\u5BFC\u5165\u9884\u8BBE\uFF09\u7EDD\u4E0D\u80FD\u628A\u5F53\u524D\u6240\u6709\n // \u6BB5\u9ED8\u8BA4\u7981\u7528\u3002\n if (presetOrder.length > 0) {\n const activeNames = new Set([...presetNames].filter((n) => !blocked.has(n)))\n for (const name of currentNames) if (!presetNames.has(name)) blocked.add(name)\n for (const name of activeNames) blocked.delete(name)\n }\n\n // \u9636\u6BB5\u5316\u5B57\u6BB5\u4E00\u5F8B\u300C\u5FEB\u7167\u6709\u5219\u8986\u76D6\uFF0C\u7F3A\u7701\u5219\u4FDD\u7559\u5F53\u524D\u503C\u300D\uFF1A\u65E7\u5FEB\u7167\uFF08\u6CA1\u6709\u8FD9\u4E9B\u952E\uFF09\n // \u5E94\u7528\u540E\u4ECD\u53EA\u6362\u9759\u6001\u8FC7\u6EE4\uFF0C\u7EDD\u4E0D\u628A\u7528\u6237\u5DF2\u6709\u7684\u9636\u6BB5\u76EE\u5F55\u4E0E\u9636\u6BB5\u540D\u5355\u62B9\u5E73\u3002\n // \u7F3A\u5E2D\u65F6\u4E0D\u7559\u4E0B\u663E\u5F0F undefined \u952E \u2014\u2014 \u300C\u4FDD\u5B58\u2192\u5E94\u7528 = \u4E0D\u52A8\u70B9\u300D\u7684\u4E0D\u53D8\u91CF\u4F9D\u8D56\u952E\u5F62\u72B6\u3002\n const keptCatalogs: ToolsConfig = {}\n const bootstrap = data.tools?.bootstrap !== undefined ? data.tools.bootstrap : cfg.tools?.bootstrap\n const compaction = data.tools?.compaction !== undefined ? data.tools.compaction : cfg.tools?.compaction\n if (bootstrap !== undefined) keptCatalogs.bootstrap = bootstrap\n if (compaction !== undefined) keptCatalogs.compaction = compaction\n const patch: ConfigPatch = {\n sections: [...blocked],\n replace: { ...(cfg.replace ?? {}), ...(data.replace ?? {}) },\n inject,\n tools: {\n exclude: data.tools?.exclude ?? [],\n ...keptCatalogs,\n },\n }\n if (Array.isArray(data.sectionsBootstrap)) patch.sectionsBootstrap = data.sectionsBootstrap\n if (Array.isArray(data.sectionsCompaction)) patch.sectionsCompaction = data.sectionsCompaction\n return patch\n}\n\n/**\n * \u4ECE\u914D\u7F6E\u4E2D\u79FB\u9664\u4E00\u4E2A custom\uFF08\u672C\u63D2\u4EF6\u6CE8\u5165\uFF09\u6BB5\uFF1A\u5B83\u4ECE inject \u5217\u8868\u6D88\u5931\uFF0C\u4E0D\u518D\u88AB\n * \u5F3A\u5236\u52A0\u5165\u5C4F\u853D\u96C6\u5408\uFF0C\u76F8\u5173\u7684\u66FF\u6362\u6587\u672C\u4E5F\u88AB\u6E05\u9664\u3002\u5269\u4F59\u7684 inject \u6761\u76EE\u4F1A\u88AB\u91CD\u65B0\n * \u7F16\u53F7\u4E3A\u8FDE\u7EED\u7684 0..n-1\uFF08\u865A\u62DF\u4E0B\u6807\u6A21\u578B\uFF09\uFF0C\u5220\u9664\u4E0D\u4F1A\u7559\u4E0B\u7A7A\u6D1E\u3002\u8BFB\u81EA\u5BBF\u4E3B\u6E05\u5355\u7684\n * system \u6BB5\u65E0\u6CD5\u8FD9\u6837\u79FB\u9664\uFF08\u4E0B\u6B21\u8BFB\u53D6\u6E05\u5355\u65F6\u5B83\u4EEC\u53C8\u4F1A\u56DE\u6765\uFF09\u3002\n */\nexport function removeSection(name: string, cfg: Config): Pick<Config, 'sections' | 'inject' | 'replace'> {\n const sections = (cfg.sections ?? []).filter((n) => n !== name)\n const inject = (cfg.inject ?? [])\n .filter((item) => item.name !== name)\n .map((item, i) => ({ ...item, order: i }))\n const replace = { ...(cfg.replace ?? {}) }\n delete replace[name]\n return { sections, inject, replace }\n}\n\n// \u2500\u2500 \u5DE5\u5177\u8FC7\u6EE4 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ToolsCfg = { exclude?: string[] }\n\n/** \u4E09\u4E2A\u9636\u6BB5\u90E8\u5206\u7684\u56FA\u5B9A\u5C55\u793A\u987A\u5E8F\uFF1A\u5F15\u5BFC\u671F \u2192 \u5E38\u9A7B\u671F \u2192 \u538B\u7F29\u53D7\u63A7\u671F\u3002\n * \u6052\u5B9A\u5168\u90E8\u6E32\u67D3 \u2014\u2014 \u9884\u8BBE\u6CA1\u6709\u67D0\u4E2A\u9636\u6BB5\u65F6\u8BE5\u90E8\u5206\u53EA\u662F\u7A7A\u7684\uFF0C\u7EDD\u4E0D\u9690\u85CF\u3002 */\nexport const PART_ORDER: PhaseViewKey[] = ['bootstrap', 'active', 'compaction']\n\n/**\n * \u4E00\u4E2A\u9636\u6BB5\u90E8\u5206\u5199\u56DE\u54EA\u4E00\u4EFD\u8FC7\u6EE4\u914D\u7F6E\uFF1A\u5F15\u5BFC\u671F \u2192 `tools.bootstrap`\u3001\u538B\u7F29\u53D7\u63A7\u671F \u2192\n * `tools.compaction`\u3001\u5E38\u9A7B\u671F \u2192 \u9759\u6001 `tools.exclude`\u3002\u4E09\u4EFD\u540D\u5355\u4E92\u4E0D\u7EE7\u627F\u3002\n */\nexport function phaseConfigKey(key: PhaseViewKey): 'bootstrap' | 'compaction' | 'static' {\n return key === 'active' ? 'static' : key\n}\n\n/**\n * \u628A\u4E00\u4E2A\u9636\u6BB5\u7684 exclude \u540D\u5355\u5199\u56DE\u6574\u4EFD\u5DE5\u5177\u914D\u7F6E\uFF0C\u8FD4\u56DE\u65B0\u5BF9\u8C61\uFF08\u5176\u4F59\u9636\u6BB5\u539F\u6837\u4FDD\u7559\uFF09\u3002\n * \u4E00\u6B21\u62D6\u653E\u53EF\u80FD\u8981\u540C\u65F6\u6539\u4E24\u4E2A\u9636\u6BB5\u7684\u540D\u5355\uFF08\u642C\u79FB = \u6E90\u9636\u6BB5\u9690\u85CF + \u76EE\u6807\u9636\u6BB5\u663E\u793A\uFF09\uFF0C\u5FC5\u987B\n * \u5728\u540C\u4E00\u4E2A\u5BF9\u8C61\u4E0A\u8FDE\u7EED\u5957\u5B8C\u518D\u843D\u4E00\u6B21\u5199\u5165 \u2014\u2014 \u5206\u4E24\u6B21\u5199\u4F1A\u5404\u81EA\u57FA\u4E8E\u65E7 cfg \u8BA1\u7B97\u800C\u4E92\u76F8\u8986\u76D6\u3002\n */\nexport function withPhaseExclude(tools: ToolsConfig | undefined, key: PhaseViewKey, exclude: string[]): ToolsConfig {\n const base = tools ?? {}\n const target = phaseConfigKey(key)\n if (target === 'bootstrap') return { ...base, bootstrap: { ...(base.bootstrap ?? {}), exclude } }\n if (target === 'compaction') return { ...base, compaction: { ...(base.compaction ?? {}), exclude } }\n return { ...base, exclude }\n}\n\n/**\n * \u628A\u4E00\u4E2A\u9636\u6BB5\u7684 add \u540D\u5355\uFF08\u8981\u52A0\u56DE\u8BE5\u9636\u6BB5\u7684\u5DE5\u5177\uFF09\u5199\u56DE\u6574\u4EFD\u5DE5\u5177\u914D\u7F6E\uFF0C\u8FD4\u56DE\u65B0\u5BF9\u8C61\u3002\n * \u4E0E withPhaseExclude \u5BF9\u79F0\uFF1A\u5E38\u9A7B\u671F\u5199\u9759\u6001 `tools.add`\uFF0C\u5F15\u5BFC\u671F\u5199 `tools.bootstrap.add`\uFF0C\n * \u538B\u7F29\u53D7\u63A7\u671F\u5199 `tools.compaction.add`\uFF0C\u5176\u4F59\u9636\u6BB5\u539F\u6837\u4FDD\u7559\u3002\n */\nexport function withPhaseAdd(tools: ToolsConfig | undefined, key: PhaseViewKey, add: string[]): ToolsConfig {\n const base = tools ?? {}\n const target = phaseConfigKey(key)\n if (target === 'bootstrap') return { ...base, bootstrap: { ...(base.bootstrap ?? {}), add } }\n if (target === 'compaction') return { ...base, compaction: { ...(base.compaction ?? {}), add } }\n return { ...base, add }\n}\n\n/** \u67D0\u4E2A\u5DE5\u5177\u5728\u5F53\u524D\u9ED1\u540D\u5355\u914D\u7F6E\u4E0B\u662F\u5426\u88AB\u9690\u85CF\u3002 */\nexport function isToolHidden(name: string, toolsCfg: ToolsCfg | undefined): boolean {\n return (toolsCfg?.exclude ?? []).includes(name)\n}\n\n/** \u5207\u6362\u67D0\u4E2A\u5DE5\u5177\u7684\u9690\u85CF\u72B6\u6001\uFF0C\u8FD4\u56DE\u65B0\u7684\u5DE5\u5177\u914D\u7F6E\uFF08\u4E0D\u6539\u539F\u5BF9\u8C61\uFF09\u3002 */\nexport function toggleTool(name: string, currentlyHidden: boolean, toolsCfg: ToolsCfg | undefined): ToolsCfg {\n const exclude = (toolsCfg?.exclude ?? []).slice()\n if (currentlyHidden) { const i = exclude.indexOf(name); if (i >= 0) exclude.splice(i, 1) }\n else if (!exclude.includes(name)) exclude.push(name)\n return { exclude }\n}\n\n// \u2500\u2500 \u6309 agent \u9884\u8BBE\u7684\u8986\u76D6\u7F16\u8F91 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * \u7F16\u8F91\u76EE\u6807\u7684\u300C\u663E\u793A\u89C6\u56FE\u300D\uFF1A0.9.0 \u8D77\u5168\u5C40\u5C42\u505C\u7528\uFF08\u63D0\u793A\u8BCD\u5FC5\u987B\u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF09\uFF0C\n * \u9884\u8BBE\u89C6\u56FE\u53EA\u663E\u793A\u8BE5\u9884\u8BBE override \u81EA\u5DF1\u7684\u5B57\u6BB5 \u2014\u2014 \u7A7A\u7F3A\u5B57\u6BB5 = \u65E0\u5B9A\u5236 = \u5B98\u65B9\u9ED8\u8BA4\uFF0C\n * **\u4E0D\u518D\u53E0\u663E\u793A\u5168\u5C40\u7EE7\u627F\u503C**\uFF08\u8FD0\u884C\u65F6\u5DF2\u4E0D\u8BFB\u5B83\uFF0C\u663E\u793A\u4E86\u4F1A\u8BEF\u5BFC\uFF09\u3002`presets` \u4E0E\n * `activePreset` \u6C38\u8FDC\u6765\u81EA\u5168\u5C40 \u2014\u2014 \u9884\u8BBE\u5FEB\u7167\u5E93\u672C\u8EAB\u4E0D\u5206\u4F5C\u7528\u57DF\u3002\n */\nexport function editView(cfg: Config, target: string | undefined): Config {\n if (!target) return cfg\n const ovr = cfg.overrides?.[target] ?? {}\n return {\n sections: ovr.sections ?? [],\n sectionsBootstrap: ovr.sectionsBootstrap ?? [],\n sectionsCompaction: ovr.sectionsCompaction ?? [],\n replace: ovr.replace ?? {},\n inject: ovr.inject ?? [],\n tools: {\n exclude: ovr.tools?.exclude ?? [],\n add: ovr.tools?.add ?? [],\n bootstrap: ovr.tools?.bootstrap,\n compaction: ovr.tools?.compaction,\n },\n presets: cfg.presets,\n activePreset: cfg.activePreset,\n }\n}\n\n/**\n * \u5F80\u67D0\u4E2A agent \u9884\u8BBE\u7684 override \u91CC\u5199\u5165\u4E00\u4E2A\u5B57\u6BB5\uFF0C\u8FD4\u56DE\u65B0\u7684 overrides \u8BB0\u5F55\n * \uFF08\u4E0D\u6539\u539F\u5BF9\u8C61\uFF09\u3002\u4E0E editView \u914D\u5BF9\uFF1A\u7F16\u8F91\u89C6\u56FE\u91CC\u770B\u5230\u7684\u7EE7\u627F\u503C\u4E00\u65E6\u88AB\u4FEE\u6539\uFF0C\n * \u5C31\u6574\u4F53\u843D\u6210\u8BE5\u9884\u8BBE\u81EA\u5DF1\u7684\u5B57\u6BB5\uFF08\u5B57\u6BB5\u7EA7\u63A5\u7BA1\u8BED\u4E49\uFF09\u3002\n */\nexport function setOverrideField(\n cfg: Config,\n target: string,\n field: 'sections' | 'replace' | 'inject' | 'tools',\n value: unknown,\n): Record<string, OverrideData> {\n return {\n ...(cfg.overrides ?? {}),\n [target]: { ...(cfg.overrides?.[target] ?? {}), [field]: value },\n }\n}\n\n// \u2500\u2500 \u9884\u8BBE\u5217\u8868\u64CD\u4F5C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u5E8F\u5217\u5316\u9884\u8BBE\u7528\u4E8E\u5BFC\u51FA\uFF08JSON \u5B89\u5168\u7684\u5B8C\u6574\u5FEB\u7167\uFF09\u3002 */\nexport function serializePreset(preset: Preset): { name: string; data: PresetData } {\n return { name: preset.name, data: preset.data }\n}\n\n/**\n * Derive a safe default filename for a preset export. User-entered preset\n * names may contain characters that are illegal in filenames (`/\\:*?\"<>|`,\n * control chars) \u2014 those are replaced; a trailing dot/space is trimmed\n * (invalid on Windows); an empty or all-illegal result falls back to\n * `preset`.\n */\nexport function presetExportFilename(name: string): string {\n const sanitized = String(name)\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]/g, '_')\n .trim()\n .replace(/[. ]+$/, '')\n const base = sanitized === '' ? 'preset' : sanitized\n return `${base}.json`\n}\n\n/**\n * \u5BFC\u5165\u9884\u8BBE\uFF1A\u540C\u540D\u7684\u4F1A\u88AB\u8DF3\u8FC7\uFF0C\u53EA\u8FFD\u52A0\u540D\u5B57\u4E0D\u540C\u7684\u9884\u8BBE\u3002\u8FD4\u56DE\u65B0\u7684\u9884\u8BBE\u5217\u8868\n * \uFF08\u82E5\u6CA1\u6709\u4EFB\u4F55\u53D8\u66F4\u5219\u8FD4\u56DE\u539F\u5217\u8868\uFF09\u3002\n */\nexport function addImportedPresets(existing: Preset[], parsed: unknown, makeId: () => string): Preset[] {\n const incoming = Array.isArray(parsed) ? parsed : [parsed]\n const existingNames = new Set(existing.map((p) => p.name))\n const added = incoming\n .filter((p) => p && typeof (p as { name?: unknown }).name === 'string' && !existingNames.has((p as Preset).name))\n .map((p) => ({ id: makeId(), name: (p as Preset).name, data: ((p as Preset).data ?? {}) as PresetData }))\n return added.length > 0 ? [...existing, ...added] : existing\n}\n\n/** \u5220\u9664\u67D0\u4E2A\u9884\u8BBE\uFF1B\u82E5\u5B83\u6B63\u662F\u5F53\u524D\u6FC0\u6D3B\u7684\u9884\u8BBE\uFF0C\u5219\u540C\u65F6\u6E05\u9664 activeId\u3002 */\nexport function removePreset(presets: Preset[], id: string, activeId?: string): { presets: Preset[]; activeId?: string } {\n return {\n presets: presets.filter((p) => p.id !== id),\n activeId: activeId === id ? undefined : activeId,\n }\n}\n\n/** \u751F\u6210\u9884\u8BBE id\uFF1A\u65F6\u95F4\u6233 + \u968F\u673A\u6BB5\uFF08base36\uFF09\uFF0C\u591F\u7528\u4E14\u65E0\u9700\u989D\u5916\u4F9D\u8D56\u3002 */\nexport function genId(): string {\n return 'p_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 7)\n}\n", "/**\n * \u63D0\u793A\u8BCD\u6BB5\u9762\u677F\u7684\u7EAF\u72B6\u6001\u903B\u8F91\uFF08\u65E0 React / \u65E0 IO\uFF09\u3002\n * \u4E0E src/client/SectionsTab.tsx \u5171\u4EAB\u540C\u4E00\u4EFD\u5B9E\u73B0\uFF08\u6D4F\u89C8\u5668\u91CC\u968F client bundle\n * \u6253\u5305\uFF1Bnode --test \u76F4\u63A5 import \u672C\u6587\u4EF6\u8DD1\u5355\u6D4B\uFF09\uFF0C\u4FDD\u8BC1\u300C\u6D4B\u8BD5\u5373\u4E0A\u7EBF\u4EE3\u7801\u300D\u3002\n *\n * \u9636\u6BB5\u6A21\u578B\uFF1A\u5F15\u5BFC\u671F\uFF08bootstrap\uFF09/ \u5E38\u9A7B\u671F\uFF08active\uFF09/ \u538B\u7F29\u53D7\u63A7\u671F\uFF08compaction\uFF09\n * \u6052\u5B9A\u5168\u90E8\u663E\u793A\uFF08\u9884\u8BBE\u6CA1\u6709\u67D0\u4E2A\u9636\u6BB5\u65F6\u8BE5\u90E8\u5206\u5C31\u662F\u7A7A\u7684\uFF09\uFF0C\u5404\u81EA\u62E5\u6709\u72EC\u7ACB\u7684\u6CE8\u5165\n * \u540D\u5355\u4E0E order \u7A7A\u95F4\uFF1B\u5C4F\u853D\u6309\u300C\u6BCF\u9636\u6BB5\u72EC\u7ACB\u540D\u5355\u300D\u5199\u56DE\uFF08\u5F15\u5BFC\u671F \u2192\n * sectionsBootstrap\uFF0C\u538B\u7F29\u53D7\u63A7\u671F \u2192 sectionsCompaction\uFF0C\u5E38\u9A7B\u671F \u2192 \u5168\u5C40 sections\uFF09\u3002\n * \u5165\u53C2\u7EDF\u4E00\u662F\u540D\u4E49\u9636\u6BB5\u952E\uFF0C\u4E0D\u518D\u6709\u300C\u540C\u5F62\u6298\u53E0\u7EC4\u300D\u8FD9\u79CD\u628A\u5F15\u5BFC\u671F\u5F53\u5E38\u9A7B\u671F\u7528\u7684\u5F62\u6001\u3002\n */\n\n/** \u540D\u4E49\u9636\u6BB5\u952E \u2192 \u5C4F\u853D\u540D\u5355\u5199\u56DE\u76EE\u6807\uFF08\u5E38\u9A7B\u671F\u7528\u5168\u5C40 sections\uFF09\u3002 */\nexport function sectionListOf(key) {\n return key === 'bootstrap' ? 'bootstrap' : key === 'compaction' ? 'compaction' : 'global'\n}\n\n/** \u540D\u4E49\u9636\u6BB5\u952E \u2192 \u6CE8\u5165\u9636\u6BB5\uFF1A\u538B\u7F29\u53D7\u63A7\u671F\u662F\u72EC\u7ACB\u6CE8\u5165\u9636\u6BB5\uFF08compaction\uFF09\u3002 */\nexport function injectPhaseOf(key) {\n return key === 'bootstrap' ? 'bootstrap' : key === 'active' ? 'active' : 'compaction'\n}\n\n/** \u67D0\u6CE8\u5165\u6BB5\u51FA\u73B0\u5728\u54EA\u4E9B\u9636\u6BB5\u90E8\u5206\uFF1Aalways \u5168\u9636\u6BB5\uFF1Bbootstrap/compaction/active\n * \u4EC5\u5404\u81EA\u5BF9\u5E94\u7684\u9636\u6BB5\uFF08\u4E0E\u670D\u52A1\u7AEF filterInjectByPhase \u7684\u4E09\u6001\u4E92\u76F8\u72EC\u7ACB\u4E00\u81F4\uFF09\u3002 */\nexport function acceptsInjectFor(key, phase) {\n if (phase === 'always') return true\n return phase === key\n}\n\n/** \u8BE5\u9636\u6BB5\u81EA\u5DF1\u7684\u5C4F\u853D\u540D\u5355\uFF08\u4E09\u6001\u4E92\u76F8\u72EC\u7ACB\uFF1A\u5F15\u5BFC\u671F sectionsBootstrap /\n * \u538B\u7F29\u53D7\u63A7\u671F sectionsCompaction / \u5E38\u9A7B\u671F sections\uFF0C\u4E92\u4E0D\u7EE7\u627F\u3001\u4E92\u4E0D\u5F71\u54CD\uFF09\u3002 */\nexport function deniedNames(cfg, key) {\n const list = sectionListOf(key)\n return list === 'bootstrap' ? (cfg.sectionsBootstrap ?? [])\n : list === 'compaction' ? (cfg.sectionsCompaction ?? [])\n : (cfg.sections ?? [])\n}\n\n/**\n * \u67D0\u4E2A\u9636\u6BB5\u90E8\u5206\u5F53\u524D\u7684\u6CE8\u5165\u8EAB\u4EFD\uFF08\u542B\u672A\u4FDD\u5B58\u8349\u7A3F\uFF09\u3002\n *\n * `names` = \u672C\u90E8\u5206\u53EF\u89C1\u7684\u6CE8\u5165\u6BB5\u540D\uFF08\u672C\u9636\u6BB5\u4E13\u5C5E + \u8DE8\u9636\u6BB5\u7684 always\uFF09\u3002post \u89C6\u56FE\u6765\u81EA\n * \u300C\u4E0A\u6B21\u4FDD\u5B58\u300D\u7684\u670D\u52A1\u7AEF\u7ED3\u679C\uFF0C\u5220\u9664\u53EA\u6539\u8349\u7A3F\uFF0C\u6240\u4EE5 post \u72EC\u6709\u6BB5\u5FC5\u987B\u6709 names \u80CC\u4E66\u624D\n * \u80FD\u663E\u793A \u2014\u2014 \u5426\u5219\u521A\u5220\u6389\u7684\u81EA\u5B9A\u4E49\u6BB5\u4F1A\u4EE5\u300C\u7CFB\u7EDF\u6BB5\u300D\u590D\u6D3B\uFF08\u8EAB\u4EFD\u53EA\u8BA4 custom \u6807\u8BB0\uFF0C\u6761\u76EE\n * \u6CA1\u4E86\u5C31\u88AB\u5224\u6210\u7CFB\u7EDF\uFF09\uFF0C\u518D\u7ECF\u4E00\u6B21\u91CD\u6392\u5C31\u88AB\u5199\u6210 custom:false \u7A7A\u6587\u672C\uFF0C\u7528\u6237\u586B\u7684\u5185\u5BB9\u88AB\n * \u62B9\u5E73\u3002`custom` \u53EA\u6536\u771F\u6B63\u7684\u81EA\u5B9A\u4E49\u6BB5\uFF0C`order` \u53EA\u6536\u672C\u9636\u6BB5\u7684\u8349\u7A3F\u5E8F\u3002\n *\n * `text` = \u672C\u9636\u6BB5\u751F\u6548\u7684\u7528\u6237\u6587\u672C\uFF1A\u81EA\u5B9A\u4E49\u6BB5\u81EA\u5E26\u7684\u6587\u672C\uFF0C\u4EE5\u53CA**\u7CFB\u7EDF\u6BB5\u5728\u672C\u9636\u6BB5\u88AB\n * \u66FF\u6362\u540E\u7684\u6587\u672C**\uFF08\u975E\u7A7A\u5373\u66FF\u6362\uFF09\u3002\u7CFB\u7EDF\u6BB5\u7684\u6587\u672C\u5FC5\u987B\u6309\u9636\u6BB5\u5B58 \u2014\u2014 \u6CE8\u5165\u6761\u76EE\u672C\u6765\u5C31\u5E26\n * `phase`\uFF0C\u670D\u52A1\u7AEF\u6309\u9636\u6BB5\u7B5B\u9009\uFF0C\u6240\u4EE5\u4E09\u4E2A\u9636\u6BB5\u5404\u6539\u5404\u7684\u6587\u672C\u4E92\u4E0D\u5F71\u54CD\uFF1B\u65E7\u7684\u5168\u5C40\n * `replace` \u5B57\u5178\u4E00\u4EFD\u6587\u672C\u5BF9\u4E09\u4E2A\u9636\u6BB5\u540C\u65F6\u751F\u6548\uFF0C\u5DF2\u4E0D\u627F\u62C5\u754C\u9762\u7F16\u8F91\u3002\n */\nexport function injectedAt(cfg, key) {\n const phase = injectPhaseOf(key)\n const names = new Set()\n const custom = new Set()\n const text = new Map()\n const order = new Map()\n for (const item of cfg.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n const itemPhase = item.phase ?? 'always'\n if (itemPhase === phase) order.set(item.name, item.order ?? 0)\n if (!acceptsInjectFor(key, itemPhase)) continue\n names.add(item.name)\n if (item.text && !text.has(item.name)) text.set(item.name, item.text)\n if (item.custom === true) custom.add(item.name)\n }\n return { phase, names, custom, text, order }\n}\n\n/**\n * \u5C4F\u853D/\u6062\u590D\u4E00\u4E2A\u6BB5\uFF08\u5F53\u524D\u9636\u6BB5\u8BED\u4E49\uFF09\uFF1A\u8FD4\u56DE\u9700\u8981\u5199\u76D8\u7684\u5B57\u6BB5\u8865\u4E01\u3002\n * \u4E09\u6001\u540D\u5355\u4E92\u76F8\u72EC\u7ACB\uFF1A\u53EA\u8BFB\u5199\u672C\u9636\u6BB5\u81EA\u5DF1\u7684\u540D\u5355\uFF08\u5F15\u5BFC\u671F \u2192 sectionsBootstrap\uFF0C\n * \u538B\u7F29\u53D7\u63A7\u671F \u2192 sectionsCompaction\uFF0C\u5E38\u9A7B\u671F \u2192 sections\uFF09\uFF0C\u5C4F\u853D / \u6062\u590D\u90FD\u7EDD\u4E0D\n * \u6CE2\u53CA\u5176\u5B83\u9636\u6BB5\u7684\u540D\u5355 \u2014\u2014 \u4E00\u4E2A\u9636\u6BB5\u7684\u5C4F\u853D\u4E0D\u518D\u8FDE\u5E26\u5C4F\u853D\u53E6\u4E00\u4E2A\u9636\u6BB5\u3002\n * \u540D\u5355\u65E0\u53D8\u5316\u65F6\u4E0D\u4EA7\u51FA\u5B57\u6BB5\uFF08\u7A7A\u8865\u4E01 = \u4E0D\u5199\u76D8\uFF09\uFF0C\u907F\u514D\u628A\u7EE7\u627F\u503C\u51BB\u7ED3\u6210\u65E0\u610F\u4E49\u7684\n * \u7A7A\u6570\u7EC4\u8986\u76D6\u3002\n */\nexport function blockPatch(cfg, key, name, blocked) {\n const list = sectionListOf(key)\n const field = list === 'bootstrap' ? 'sectionsBootstrap' : list === 'compaction' ? 'sectionsCompaction' : 'sections'\n const cur = (cfg[field] ?? []).slice()\n const i = cur.indexOf(name)\n if (blocked) {\n if (i >= 0) return {}\n cur.push(name)\n } else {\n if (i < 0) return {}\n cur.splice(i, 1)\n }\n return { [field]: cur }\n}\n\n/**\n * \u91CD\u6392/\u63D2\u5165\u4E00\u4E2A\u9636\u6BB5\u7684\u6709\u5E8F\u884C\u5217\u8868\uFF1A\u628A dragName \u4ECE\u5217\u8868\u4E2D\u79FB\u9664\u540E\uFF0C\u63D2\u5165\u5230\n * targetName \u884C\u4E4B\u4E0A\uFF08pos='above'\uFF09\u6216\u4E4B\u4E0B\uFF08pos='below'\uFF09\uFF1B\u8FD4\u56DE\u65B0\u5217\u8868\u3002\n * \u62D6\u5165\u7684\u65B0\u6BB5\u7531\u8C03\u7528\u65B9\u4EE5 newRow \u63D0\u4F9B\uFF0C\u63D2\u5165\u540E\u4FDD\u7559\u5728\u5217\u8868\u4E2D\uFF08\u5176\u4F59\u884C\u4FDD\u6301\u539F\u6837\uFF09\u3002\n */\nexport function reorderInsert(rows, dragName, targetName, pos, newRow = null) {\n const base = rows.filter((row) => row.name !== dragName)\n const idx = base.findIndex((row) => row.name === targetName)\n if (idx < 0) return null\n const insertAt = Math.max(0, Math.min(pos === 'above' ? idx : idx + 1, base.length))\n const entry = newRow ?? rows.find((row) => row.name === dragName)\n if (!entry) return null\n base.splice(insertAt, 0, entry)\n return base\n}\n\n/**\n * \u6301\u4E45\u5316\u4E00\u4E2A\u9636\u6BB5\u7684\u6709\u5E8F\u5217\u8868\uFF08v1 persistOrder \u7684\u9010\u9636\u6BB5\u7248\uFF09\uFF1A\u628A rows\uFF08\u6709\u5E8F\u884C\uFF09\n * \u5199\u6210\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF0Corder = \u8FDE\u7EED\u6574\u6570\uFF080,1,2,\u2026\uFF09\u2014\u2014\u300C\u865A\u62DF order \u51B3\u5B9A\u6CE8\u5165\n * \u987A\u5E8F\u300D\uFF1B\u6587\u672C\u4F18\u5148\u7EA7 = \u672C\u9636\u6BB5\u7684\u7528\u6237\u66FF\u6362\u6587\u672C\uFF08row.override\uFF09\u2192 \u81EA\u5B9A\u4E49\u6BB5\u81EA\u5E26\u7684\n * \u6587\u672C\uFF08row.text\uFF09\u2192 \u7A7A\u6587\u672C\uFF08= \u4EC5 order \u8986\u76D6\uFF0C\u670D\u52A1\u7AEF\u4FDD\u7559\u539F\u6587\uFF09\u3002\u4E09\u8005\u7F3A\u4E00\u4E0D\u53EF\uFF1A\n * \u91CD\u6392\u8D70\u7684\u5C31\u662F\u8FD9\u4E2A\u51FD\u6570\uFF0C\u6F0F\u6389 override \u4F1A\u8BA9\u4E00\u6B21\u62D6\u52A8\u628A\u7528\u6237\u5728\u8BE5\u9636\u6BB5\u6539\u7684\u6587\u672C\u62B9\u5E73\u3002\n * \u5176\u5B83\u9636\u6BB5\uFF08\u542B always\uFF09\u7684\u6CE8\u5165\u6761\u76EE\u539F\u6837\u4FDD\u7559\u3002\n */\nexport function phaseInjectEntries(cfg, key, rows) {\n const phase = injectPhaseOf(key)\n const others = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') !== phase)\n const entries = rows.map((row, i) => ({\n name: row.name,\n order: i,\n text: row.override || (row.custom ? (row.text ?? '') : ''),\n phase,\n custom: row.custom,\n }))\n return [...others, ...entries]\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\u6301\u4E45\u5316\uFF1ArowsByKey \u7ED9\u51FA\u4E09\u4E2A\u9636\u6BB5\u5404\u81EA\u7684\u6709\u5E8F\u884C\u96C6\u5408\uFF08bootstrap /\n * active / compaction\uFF09\uFF0C\u751F\u6210\u5B8C\u6574 inject \u5217\u8868 \u2014\u2014 always \u6761\u76EE\u539F\u6837\u4FDD\u7559\uFF0C\u4E09\u4E2A\n * \u9636\u6BB5\u5404\u81EA\u5199\u6210\u8FDE\u7EED\u865A\u62DF order \u7684\u6CE8\u5165\u6761\u76EE\uFF08\u6761\u76EE\u5F62\u72B6\u4E0E phaseInjectEntries \u5B8C\u5168\n * \u4E00\u81F4\uFF09\u3002\u7528\u4E8E\u300C\u4E09\u6001\u540C\u6B65\u300D\u7684\u4E00\u6B21\u5199\u5165\uFF1Aedit \u5BF9 inject \u662F\u6574\u4F53\u66FF\u6362\uFF0C\u9010\u9636\u6BB5\u5404\u5199\n * \u4E00\u6B21\u4F1A\u4E92\u76F8\u8986\u76D6\u53EA\u7559\u4E0B\u6700\u540E\u4E00\u6B21\u3002\n */\nexport function mergedPhaseInjectEntries(cfg, rowsByKey) {\n const always = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') === 'always')\n const entries = ['bootstrap', 'active', 'compaction'].flatMap((key) => {\n const phase = injectPhaseOf(key)\n return (rowsByKey[key] ?? []).map((row, i) => ({\n name: row.name,\n order: i,\n text: row.override || (row.custom ? (row.text ?? '') : ''),\n phase,\n custom: row.custom,\n }))\n })\n return [...always, ...entries]\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\uFF08\u5E76\u96C6\u955C\u50CF\uFF09\u7684\u9AA8\u67B6\u987A\u5E8F\uFF1A\u5E38\u9A7B\u671F\u5728\u524D \u2014\u2014 \u5E76\u96C6\u884C\u5E8F\u4EE5\u5E38\u9A7B\u671F\u4E3A\u51C6\uFF0C\u5176\u4F59\n * \u4E24\u6001\u72EC\u6709\u7684\u6BB5\u6309\u5404\u81EA\u987A\u5E8F\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF08\u4E0E PART_ORDER \u7684\u5C55\u793A\u5E8F\u4E0D\u540C\uFF0C\u8FD9\u91CC\u662F\u6570\u636E\u5E8F\uFF09\u3002\n */\nconst MIRROR_KEYS = ['active', 'bootstrap', 'compaction']\n\n/** \u955C\u50CF\u5230\u67D0\u9636\u6BB5\u65F6\u8BE5\u884C\u8981\u5199\u7684\u6B63\u6587\uFF08'' = \u53EA\u8986\u76D6 order\uFF0C\u6CE8\u518C\u8868\u539F\u6587\u4E0D\u52A8\uFF09\u3002\n * \u81EA\u5B9A\u4E49\u6BB5\u4E0E\u5E26\u66FF\u6362\u6587\u672C\u7684\u884C\u5FC5\u987B\u5199\u6B63\u6587\uFF08\u5426\u5219\u66FF\u6362\u5728\u8BE5\u9636\u6BB5\u4E0D\u751F\u6548\uFF09\uFF1B\u975E\u539F\u751F\u6BB5\n * \u5FC5\u987B\u5199\u6B63\u6587\uFF08\u5426\u5219\u670D\u52A1\u7AEF\u5EFA\u4E0D\u51FA\u6765\uFF0C\u89C1 applySectionPolicy \u7684\u5E7D\u7075\u6BB5\u5B88\u536B\uFF09\u2014\u2014\n * \u52A8\u6001\u6BB5\uFF08\u7A7A\u6587\u672C / \u5BBF\u4E3B\u56DE\u663E\u7684 `<\u52A8\u6001\u751F\u6210>`\uFF09\u53D6\u4E0D\u5230\u6B63\u6587\uFF0C\u8FD4\u56DE '' \u8BA9\u8C03\u7528\u65B9\u8DF3\u8FC7\u3002 */\nfunction mirrorText(row, native) {\n if (row.custom === true) return row.override || (row.text ?? '')\n if (row.override !== '') return row.override\n if (native === true) return ''\n const text = row.text ?? ''\n return text === '' || text.startsWith('<') ? '' : text\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\u7684\u5E76\u96C6\u884C\u96C6\uFF1A\u5E38\u9A7B\u671F\u7684\u884C\u5E8F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8 \u2014\u2014\n * \u4E09\u6001\u6700\u7EC8\u6536\u655B\u5230\u540C\u4E00\u4EFD\u540D\u5355\uFF0C\u4E0D\u5C4F\u853D\u4EFB\u4F55\u6BB5\u3002\u540C\u540D\u6BB5\u53EA\u4FDD\u7559\u4E00\u884C\uFF1A\u4F18\u5148\u53D6\u300C\u8BE5\u6BB5\u539F\u751F\n * \u5B58\u5728\u300D\u7684\u90A3\u4E2A\u9636\u6BB5\u7684\u884C\uFF08\u6587\u672C / \u8EAB\u4EFD / \u52FE\u9009\u4EE5\u5B83\u4E3A\u51C6\uFF09\uFF0C\u90FD\u975E\u539F\u751F\u65F6\u53D6\u9AA8\u67B6\u5E8F\u91CC\n * \u9996\u6B21\u51FA\u73B0\u7684\u90A3\u884C \u2014\u2014 \u8FD9\u6837\u539F\u751F\u9636\u6BB5\u7684\u6587\u672C\u4E0D\u4F1A\u88AB\u955C\u50CF\u5199\u56DE\u51BB\u7ED3\u8FDB\u914D\u7F6E\u3002\n * `views` \u91CC\u67D0\u9636\u6BB5\u4E3A null\uFF08\u88C5\u914D\u672A\u5C31\u7EEA\uFF09\u65F6\u8BE5\u9636\u6BB5\u4E0D\u53C2\u4E0E\u5E76\u96C6\uFF0C\u7EDD\u4E0D\u81C6\u9020\u884C\u3002\n * `nativeOf(key, name)` \u53EF\u9009\uFF1A\u5224\u5B9A\u8BE5\u6BB5\u662F\u5426\u5728\u76EE\u6807\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\u91CC\u3002\n */\nexport function mirroredRows(cfg, views, nativeOf) {\n const picked = new Map()\n const order = []\n for (const key of MIRROR_KEYS) {\n for (const row of phaseRows(cfg, views?.[key] ?? null, key)) {\n const native = nativeOf?.(key, row.name) === true\n const cur = picked.get(row.name)\n if (cur === undefined) {\n picked.set(row.name, { row, native })\n order.push(row.name)\n } else if (cur.native !== true && native) {\n picked.set(row.name, { row, native })\n }\n }\n }\n return order.map((name) => picked.get(name).row)\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\u6301\u4E45\u5316\uFF1A\u628A\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6\u955C\u50CF\u5199\u5165\u4E09\u4E2A\u9636\u6BB5\uFF08\u5404\u9636\u6BB5\u8FDE\u7EED order\uFF0C\u6761\u76EE\n * \u5F62\u72B6\u4E0E phaseInjectEntries \u5B8C\u5168\u4E00\u81F4\uFF09\u3002\n *\n * `nativeOf(key, name)` \u5224\u5B9A\u8BE5\u6BB5\u662F\u5426\u5DF2\u5728\u76EE\u6807\u9636\u6BB5\u7684**\u88C5\u914D\u8F93\u5165**\uFF08base \u89C6\u56FE\uFF09\u91CC\uFF1A\n * - \u539F\u751F\u7CFB\u7EDF\u6BB5\u4E14\u65E0\u66FF\u6362\u6587\u672C \u2192 \u53EA\u5199 order \u8986\u76D6\uFF0C\u7EDD\u4E0D\u628A\u6CE8\u518C\u8868\u539F\u6587\u51BB\u7ED3\u8FDB\u914D\u7F6E\uFF1B\n * - \u81EA\u5B9A\u4E49\u6BB5 / \u5E26\u66FF\u6362\u6587\u672C\u7684\u884C \u2192 \u6B63\u6587\u7167\u5199\uFF08\u4E09\u6001\u540C\u65F6\u751F\u6548\uFF09\uFF1B\n * - \u975E\u539F\u751F\u6BB5 \u2192 \u5FC5\u987B\u5E26\u6B63\u6587\u624D\u80FD\u88AB\u670D\u52A1\u7AEF\u5EFA\u51FA\u6765\uFF1B\u52A8\u6001\u6BB5\uFF08`<\u52A8\u6001\u751F\u6210>`\uFF0C\u53D6\u4E0D\u5230\n * \u6B63\u6587\uFF09\u5EFA\u4E0D\u51FA\u6765\uFF0C\u53EA\u80FD\u8DF3\u8FC7 \u2014\u2014 \u5B83\u7559\u5728\u81EA\u5DF1\u539F\u6709\u7684\u9636\u6BB5\u91CC\uFF08mirrorSkippedNames\n * \u4F9B\u754C\u9762\u63D0\u793A\uFF09\u3002\n * \u8FD4\u56DE null/undefined = \u8BE5\u9636\u6BB5\u89C6\u56FE\u672A\u5C31\u7EEA\uFF0C\u6574\u6BB5\u8DF3\u8FC7\uFF08\u7EDD\u4E0D\u628A\u7F3A\u5931\u7684\u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\uFF09\u3002\n * always \u6761\u76EE\u53EA\u4FDD\u7559\u540D\u5B57\u4ECD\u5728\u884C\u96C6\u91CC\u7684\uFF1A\u5220\u9664\u4E00\u4E2A\u81EA\u5B9A\u4E49\u6BB5 = \u4E09\u6001\u4E00\u8D77\u6D88\u5931\uFF08always\n * \u6761\u76EE\u4F1A\u8BA9\u5B83\u5728\u4E09\u4E2A\u9636\u6BB5\u590D\u6D3B\uFF09\u3002\n */\nexport function mirrorPhaseInjectEntries(cfg, rows, nativeOf) {\n const names = new Set(rows.map((row) => row.name))\n const always = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') === 'always' && names.has(item.name))\n const entries = []\n for (const key of MIRROR_KEYS) {\n const phase = injectPhaseOf(key)\n let order = 0\n for (const row of rows) {\n const native = nativeOf === undefined ? false : nativeOf(key, row.name)\n if (native === null || native === undefined) continue\n const text = mirrorText(row, native)\n if (native !== true && text === '') continue\n entries.push({ name: row.name, order: order++, text, phase, custom: row.custom === true })\n }\n }\n return [...always, ...entries]\n}\n\n/**\n * \u955C\u50CF\u65F6\u5728\u76EE\u6807\u9636\u6BB5\u5EFA\u4E0D\u51FA\u6765\u7684\u6BB5\u540D\uFF08\u52A8\u6001\u6BB5\u65E0\u6B63\u6587\uFF09\uFF1A\u754C\u9762\u636E\u6B64\u7ED9\u51FA\u8BF4\u660E \u2014\u2014\n * \u884C\u96C6\u91CC\u4ECD\u663E\u793A\u5B83\uFF0C\u4F46\u53E6\u5916\u4E24\u6001\u7684\u88C5\u914D\u91CC\u4E0D\u4F1A\u6709\u5B83\u3002\n */\nexport function mirrorSkippedNames(rows, nativeOf) {\n const skipped = new Set()\n for (const key of MIRROR_KEYS) {\n for (const row of rows) {\n const native = nativeOf?.(key, row.name)\n if (native === null || native === undefined || native === true) continue\n if (mirrorText(row, false) === '') skipped.add(row.name)\n }\n }\n return [...skipped]\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\u7684\u5C4F\u853D\u540D\u5355\uFF1A\u4E09\u4EFD\u540D\u5355\u7EDF\u4E00\u4E3A\u5E76\u96C6\u884C\u96C6\u91CC\u7684\u5C4F\u853D\u540D\u96C6\u5408\uFF08\u884C\u96C6\u5305\u542B\u4E09\u6001\u5168\u90E8\n * \u7684\u884C\uFF0C\u542B\u88AB\u5C4F\u853D\u9879\uFF0C\u6240\u4EE5\u7528\u6237\u7684\u5C4F\u853D\u610F\u56FE\u4E0D\u4F1A\u4E22\uFF09\u3002\u540D\u5B57\u987A\u5E8F\u6309\u884C\u96C6\u987A\u5E8F\uFF0C\u7A33\u5B9A\u53EF\u8BFB\u3002\n */\nexport function mirroredDeniedLists(rows) {\n const blocked = rows.filter((row) => row.blocked === true).map((row) => row.name)\n return { sections: blocked, sectionsBootstrap: [...blocked], sectionsCompaction: [...blocked] }\n}\n\n/**\n * \u4E00\u4E2A\u9636\u6BB5\u90E8\u5206\u7684\u5168\u90E8\u884C\uFF08\u63D0\u793A\u8BCD Tab \u6BCF\u884C\uFF09\uFF1A\u884C\u96C6\u5408 = \u300C\u771F\u5B9E\u8FDB\u5165\u8BE5\u9636\u6BB5\u88C5\u914D\u7684\u6BB5\u300D\n *\uFF08post \u89C6\u56FE\uFF0C\u4E0E\u9884\u89C8\u4E00\u81F4 \u2014\u2014 \u9884\u8BBE\u539F\u751F\u9636\u6BB5\u63D2\u4EF6\u88C1\u526A\u6389\u7684\u6BB5\u4E0D\u663E\u793A\uFF09\u222A\u300C\u88AB\u5C4F\u853D\u7684\u6BB5\u300D\n *\uFF08\u5C4F\u853D\u540D\u5355\u542B\u672A\u4FDD\u5B58\u8349\u7A3F\uFF0C\u968F\u65F6\u53EF\u53CD\u9009\uFF09\u222A\u300C\u914D\u7F6E\u91CC\u5C5E\u4E8E\u8BE5\u9636\u6BB5\u7684\u81EA\u5B9A\u4E49\u6CE8\u5165\u6BB5\u300D\u3002\n * \u987A\u5E8F\u4EE5 base\uFF08\u9884\u8FC7\u6EE4\uFF09\u89C6\u56FE\u7684\u9AA8\u67B6\u4E3A\u5E95\uFF0C\u518D\u53E0\u52A0\u300C\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165 order\u300D\u8349\u7A3F\u5E8F\n * \u2014\u2014 \u672A\u4FDD\u5B58\u7684\u91CD\u6392\u7ACB\u5373\u53CD\u6620\u5230\u754C\u9762\u3002\u6587\u672C post \u4F18\u5148\uFF08\u66FF\u6362 / \u6CE8\u5165\u7ED3\u679C\uFF09\uFF0C\u56DE\u9000\n * base \u539F\u6587\u4E0E\u6CE8\u5165\u6587\u672C\u3002\u8EAB\u4EFD\u53EA\u8BA4\u6CE8\u5165\u6761\u76EE\u7684 custom \u9690\u85CF\u6807\u8BB0\uFF0C\u7EDD\u4E0D\u4E92\u76F8\u8F6C\u6362\u3002\n * `view` = \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\u91CC\u7684\u5BF9\u5E94\u9636\u6BB5\uFF08\u53EF\u4E3A null = \u89C6\u4E3A\u7A7A\uFF09\u3002\u4ECE SectionsTab\n * \u7684 rowsOf \u539F\u6837\u8FC1\u51FA \u2014\u2014 \u7EAF\u51FD\u6570\uFF0CUI \u4E0E node --test \u5355\u6D4B\u5171\u7528\u540C\u4E00\u4EFD\u5B9E\u73B0\u3002\n */\nexport function phaseRows(cfg, view, key) {\n const replace = cfg.replace ?? {}\n const denied = new Set(deniedNames(cfg, key))\n const postByName = new Map((view?.sections ?? []).map((sec) => [sec.name, sec]))\n const baseByName = new Map((view?.baseSections ?? []).map((sec) => [sec.name, sec]))\n const { phase, names: injectedHere, custom: customNames, text, order: phaseOrder } = injectedAt(cfg, key)\n const names = []\n const seen = new Set()\n const push = (name) => { if (!seen.has(name)) { seen.add(name); names.push(name) } }\n // base \u9AA8\u67B6\u987A\u5E8F\u91CC\u53D6 post \u6BB5\u4E0E\u88AB\u5C4F\u853D\u6BB5\uFF08\u4FDD\u6301\u81EA\u7136\u4F4D\u7F6E\uFF09\u3002\u88AB\u5C4F\u853D\u53D6\u5E76\u96C6\uFF1A\n // \u5F53\u524D\u8349\u7A3F\u540D\u5355\uFF08\u5207\u6362\u7ACB\u5373\u53CD\u9988\uFF09\u222A \u4E0A\u6B21\u4FDD\u5B58\u7684\u540D\u5355\uFF08base \u7684 blocked \u6807\u8BB0 \u2014\u2014\n // \u521A\u89E3\u9664\u5C4F\u853D\u7684\u884C\u4E0D\u4F1A\u7ACB\u5373\u6D88\u5931\uFF0C\u4ECD\u53EF\u518D\u52FE\u56DE\u53BB\uFF09\u3002\n for (const sec of view?.baseSections ?? []) {\n if (postByName.has(sec.name) || denied.has(sec.name) || sec.blocked === true) push(sec.name)\n }\n // post \u72EC\u6709\u6BB5 = \u672C\u63D2\u4EF6\u6CE8\u5165\u8FDB\u53BB\u7684\u6BB5\uFF08post \u6052\u4E3A base \u51CF\u53BB\u5C4F\u853D\u518D\u52A0\u4E0A\u6CE8\u5165\uFF09\uFF0C\n // \u8FFD\u52A0\u5728\u5C3E\u90E8\u3002\u4F46\u5B83\u6765\u81EA\u300C\u4E0A\u6B21\u4FDD\u5B58\u300D\u7684\u670D\u52A1\u7AEF\u7ED3\u679C\uFF0C\u5220\u9664\u53EA\u6539\u8349\u7A3F\uFF0C\u6240\u4EE5\u5FC5\u987B\n // \u6709\u5F53\u524D inject \u6761\u76EE\u80CC\u4E66 \u2014\u2014 \u5426\u5219\u521A\u5220\u6389\u7684\u81EA\u5B9A\u4E49\u6BB5\u4F1A\u4EE5\u300C\u7CFB\u7EDF\u6BB5\u300D\u590D\u6D3B\uFF08\u8EAB\u4EFD\n // \u53EA\u8BA4 inject \u7684 custom \u6807\u8BB0\uFF0C\u6761\u76EE\u6CA1\u4E86\u5C31\u88AB\u5224\u6210\u7CFB\u7EDF\uFF09\uFF0C\u518D\u7ECF\u4E00\u6B21\u91CD\u6392\u5C31\u88AB\u5199\u6210\n // custom:false \u7A7A\u6587\u672C\uFF0C\u7528\u6237\u586B\u7684\u5185\u5BB9\u88AB\u62B9\u5E73\u3002\n for (const name of postByName.keys()) {\n if (baseByName.has(name) || injectedHere.has(name)) push(name)\n }\n // \u7CBE\u786E\u5C5E\u4E8E\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF1A\u81EA\u5B9A\u4E49\u6BB5\u59CB\u7EC8\u663E\u793A\uFF1B\u7CFB\u7EDF\u6BB5\u5728\u88C5\u914D\u8F93\u5165\u91CC\u89C1\u8FC7\n //\uFF08base/post\uFF09**\u6216**\u5E26\u7740\u7528\u6237\u4E3A\u8BE5\u9636\u6BB5\u586B\u7684\u6587\u672C\uFF08= \u4ECE\u5168\u90E8\u6C60\u663E\u5F0F\u52A0\u8FDB\u6765\u7684\uFF09\u624D\n // \u663E\u793A \u2014\u2014 \u65E2\u8BA9\u62D6\u5165\u7ACB\u5373\u51FA\u73B0\uFF0C\u53C8\u4E0D\u8BA9\u5386\u53F2\u9057\u7559\u7684\u9648\u65E7\u6761\u76EE\u628A\u88C5\u914D\u91CC\u6839\u672C\u6CA1\u6709\u7684\u6BB5\u5E26\u56DE\u6765\u3002\n for (const item of cfg.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n if ((item.phase ?? 'always') !== phase) continue\n if (item.custom === true || text.get(item.name) || baseByName.has(item.name) || postByName.has(item.name)) push(item.name)\n }\n // \u8DE8\u9636\u6BB5\u751F\u6548\u7684\u81EA\u5B9A\u4E49\u6BB5\uFF08\u5982 always\uFF09\u3002\n for (const name of customNames) push(name)\n const rows = names.map((name) => {\n // \u672C\u9636\u6BB5\u7684\u7528\u6237\u66FF\u6362\u6587\u672C\uFF1A\u53EA\u8BA4\u5C5E\u4E8E\u672C\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF08injectedAt \u5DF2\u6309\u9636\u6BB5\u7B5B\uFF09\u3002\n const override = text.get(name) ?? ''\n return {\n name,\n text: postByName.get(name)?.text ?? baseByName.get(name)?.text ?? '',\n replaced: override !== '' || Object.hasOwn(replace, name),\n custom: customNames.has(name),\n override,\n blocked: denied.has(name),\n }\n })\n // \u8349\u7A3F\u5E8F\u53E0\u52A0\uFF1A\u8BE5\u9636\u6BB5\u6709\u6CE8\u5165 order \u5C31\u6309\u5B83\u91CD\u6392\u5F53\u524D\u884C\uFF08\u672A\u4FDD\u5B58\u7684\u62D6\u52A8/\u7BAD\u5934\n // \u7ACB\u5373\u751F\u6548\uFF09\uFF1B\u65E0 order \u7684\u884C\u8D70 base \u9AA8\u67B6\u76F8\u5BF9\u5E8F\uFF08\u7A33\u5B9A\u6392\u5E8F\uFF09\u3002\n if (phaseOrder.size > 0) {\n const fallback = new Map(rows.map((row, i) => [row.name, i]))\n rows.sort((a, b) => (phaseOrder.get(a.name) ?? fallback.get(a.name) ?? 0) - (phaseOrder.get(b.name) ?? fallback.get(b.name) ?? 0))\n }\n return rows\n}\n\n/**\n * \u300C\u5E94\u7528\u4E2D\u6587\u300D\uFF08\u5F00\u5173\u5F00\u542F\u65B9\u5411\uFF0C\u7B49\u6548\u624B\u52A8\u7F16\u8F91\uFF09\uFF1A\u628A\u4E09\u4E2A\u9636\u6BB5\u5404\u81EA\u7684\u884C\u91CC\u540D\u5B57\u547D\u4E2D\n * zhMap \u7684**\u975E\u81EA\u5B9A\u4E49**\u884C\u6253\u4E0A\u4E2D\u6587\u6587\u672C\u8865\u4E01\uFF0C\u518D\u7ECF mergedPhaseInjectEntries \u751F\u6210\n * \u5B8C\u6574 inject \u5217\u8868\uFF08\u8C03\u7528\u65B9\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u4FDD\u5B58\u540E\u751F\u6548\uFF09\u3002zhMap \u6761\u76EE\u4E3A\u5B57\u7B26\u4E32\n *\uFF08\u6574\u6BB5\u66FF\u6362\uFF09\u6216\u51FD\u6570\uFF08\u5165\u53C2\u8BE5\u884C\u539F\u6587\uFF0C\u8FD4\u56DE\u7A7A\u503C = \u653E\u5F03\u66FF\u6362\uFF0C\u5982 tools:sdk \u7684\u56F4\u680F\n * \u5B88\u536B\uFF09\uFF1B\u672A\u547D\u4E2D\u7684\u884C\u4E0E\u9636\u6BB5\u539F\u6837\u4FDD\u7559\uFF0C\u6BB5\u6570\u4E0E\u6CE8\u5165\u4E0D\u589E\u4E0D\u51CF\u3002\u81EA\u5B9A\u4E49\u6BB5\u662F\u7528\u6237\u81EA\u64B0\n * \u5185\u5BB9\uFF0C\u7EDD\u4E0D\u8986\u76D6\u3002`views` = \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\uFF08\u952E\u53EF\u4E3A null \u2014\u2014 \u8BE5\u9636\u6BB5\u884C\u96C6\u89C6\u4E3A\u7A7A\uFF09\u3002\n */\nexport function zhMergedInjectEntries(cfg, views, zhMap) {\n const patched = {}\n for (const key of ['bootstrap', 'active', 'compaction']) {\n patched[key] = phaseRows(cfg, views?.[key] ?? null, key).map((row) => {\n if (row.custom) return row\n const entry = zhMap?.[row.name]\n if (entry === undefined) return row\n const zh = typeof entry === 'function' ? entry(row.text) : entry\n return zh ? { ...row, override: zh, text: zh } : row\n })\n }\n return mergedPhaseInjectEntries(cfg, patched)\n}\n\n/**\n * \u300C\u56DE\u5F52\u82F1\u6587\u300D\uFF08\u5F00\u5173\u5173\u95ED\u65B9\u5411\uFF09\uFF1A\u628A\u4E09\u4E2A\u9636\u6BB5\u884C\u91CC\u547D\u4E2D\u8BD1\u672C\u7684\u975E\u81EA\u5B9A\u4E49\u884C\u7684\u66FF\u6362\n * \u6587\u672C\u6E05\u7A7A \u2014\u2014 \u7CFB\u7EDF\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\u56DE\u843D\u4E3A\u4EC5 order \u8986\u76D6\uFF0C\u670D\u52A1\u7AEF\u6062\u590D\u6CE8\u518C\u8868\u82F1\u6587\n * \u539F\u6587\u3002\u4E0E zhMergedInjectEntries \u4E25\u683C\u5BF9\u79F0\uFF1A\u5F00\u5173\u72EC\u5360\u8FD9\u4E9B\u6BB5\u7684\u6587\u672C\u6240\u6709\u6743\uFF0C\n * \u5173\u95ED\u5373\u6574\u4F53\u56DE\u82F1\u6587\uFF08\u7528\u6237\u5728\u5F00\u542F\u671F\u95F4\u7684\u624B\u5DE5\u5FAE\u8C03\u4E00\u5E76\u6E05\u9664\uFF09\u3002\u81EA\u5B9A\u4E49\u6BB5\u4E0D\u78B0\u3002\n */\nexport function zhRevertInjectEntries(cfg, views, zhMap) {\n const patched = {}\n for (const key of ['bootstrap', 'active', 'compaction']) {\n patched[key] = phaseRows(cfg, views?.[key] ?? null, key).map((row) => {\n if (row.custom || row.override === '' || zhMap?.[row.name] === undefined) return row\n return { ...row, override: '', text: '' }\n })\n }\n return mergedPhaseInjectEntries(cfg, patched)\n}\n\n/**\n * \u5F00\u5173\u72B6\u6001\u63A2\u6D4B\uFF1A\u4EFB\u4E00\u6CE8\u5165\u6761\u76EE\u7684\u6587\u672C\u4E0E**\u5B57\u7B26\u4E32\u8BD1\u672C**\u9010\u5B57\u76F8\u7B49\u5373\u89C6\u4E3A\u5DF2\u5E94\u7528\u3002\n * \u53EA\u63A2\u6D4B\u5B57\u7B26\u4E32\u8BD1\u672C\uFF08\u51FD\u6570\u8BD1\u672C\u65E0\u6CD5\u4ECE\u8BD1\u6587\u53CD\u63A8\uFF09\uFF0C\u800C\u5E94\u7528\u65F6\u6240\u6709\u547D\u4E2D\u884C\u90FD\u4F1A\u5199\u5165\u3001\n * \u5B57\u7B26\u4E32\u8BD1\u672C\u5FC5\u7136\u5B58\u5728 \u2014\u2014 \u8DB3\u4EE5\u4F5C\u4E3A\u63A2\u9488\u3002\u6DF7\u5408\u72B6\u6001\uFF08\u7528\u6237\u624B\u52A8\u8FD8\u539F\u4E86\u4E2A\u522B\u6BB5\uFF09\u4ECD\u7B97\n * \u5F00\u542F\uFF0C\u5173\u95ED\u65B9\u5411\u4F1A\u6574\u4F53\u56DE\u5F52\u82F1\u6587\u3002\n */\nexport function zhApplied(cfg, zhMap) {\n for (const item of cfg?.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n const zh = zhMap?.[item.name]\n if (typeof zh === 'string' && zh !== '' && item.text === zh) return true\n }\n return false\n}", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 \u5C0F\u6BB5\u96C6\u5408\u3002\n * \u89C4\u5219\uFF1A`{{...}}` \u63D0\u793A\u8BCD\u53D8\u91CF\u3001\u5DE5\u5177\u540D\u3001\u53C2\u6570\u540D\u3001\u8DEF\u5F84\u3001URL\u3001\u4EE3\u7801\u4E00\u5F8B\u539F\u6837\u4FDD\u7559\uFF0C\n * \u53EA\u8BD1\u6563\u6587\u3002plan:policy \u662F\u52A8\u6001\u6BB5\uFF08\u6E05\u5355\u91CC\u62FF\u4E0D\u5230\u7A33\u5B9A\u6587\u672C\uFF09\uFF0C\u4E0D\u8BBE\u8BD1\u672C\u6761\u76EE\uFF0C\n * \u6309\u300C\u540D\u5B57\u5BF9\u4E0D\u4E0A\u5C31\u8DF3\u8FC7\u300D\u89C4\u5219\u81EA\u7136\u8C41\u514D\u3002\n */\nexport const CORE = {\n 'harness:identity': `\u4F60\u662F\u4E00\u4E2A\u7531 DeepSeek Harness \u9A71\u52A8\u7684 AI \u667A\u80FD\u4F53\u3002`,\n\n 'harness:source': `DeepSeek Harness \u7684\u5B9E\u73B0\u4EE3\u7801\u68C0\u51FA\u4F4D\u4E8E C:\\\\nvm\\\\v22.22.0\\\\node_modules\\\\@deepseek-ai\\\\dsh\\\\\u3002\u68C0\u51FA\u4F4D\u7F6E\u4E0E\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u662F\u4E24\u4E2A\u72EC\u7ACB\u7684\u503C\uFF0C\u53EF\u80FD\u4E0D\u540C\uFF1B\u7EDD\u4E0D\u8981\u6839\u636E\u8BE5\u8DEF\u5F84\u63A8\u65AD\u5DE5\u4F5C\u76EE\u5F55\u3002\u8BF7\u7528 pwd \u786E\u5B9A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002\u8BE5\u68C0\u51FA\u53EA\u7528\u4E8E\u67E5\u770B\u6216\u6269\u5C55 DSH \u672C\u8EAB\u3002`,\n\n 'app:web-surface': `\u4F60\u6B63\u5728\u901A\u8FC7 DeepSeek Harness \u7684 Web \u56FE\u5F62\u754C\u9762\uFF08http://127.0.0.1:3080\uFF09\u4E0E\u7528\u6237\u4EA4\u4E92\u3002\u5F53\u7528\u6237\u63D0\u5230\u300C\u8FD9\u4E2A\u9875\u9762\u300D\u300C\u8FD9\u4E2A GUI\u300D\u300C\u8FD9\u4E2A\u5E94\u7528\u300D\u800C\u6CA1\u6709\u6307\u540D\u5176\u4ED6\u76EE\u6807\u65F6\uFF0C\u6307\u7684\u5C31\u662F\u8FD9\u4E2A GUI\u3002\u6D4F\u89C8\u5668\u4E0D\u63D0\u4F9B\u4EFB\u4F55\u9690\u5F0F\u7684 DOM\u3001\u8DEF\u7531\u6216\u622A\u56FE\u4E0A\u4E0B\u6587\u3002\u5BA2\u6237\u7AEF\u63D2\u4EF6\u7684 HMR \u63A5\u6536\u5668\u5904\u4E8E\u6FC0\u6D3B\u72B6\u6001\uFF0C\u4F46\u53EA\u6709\u5F53 \\`pnpm run dev:web\\` \u4E5F\u5728\u540C\u4E00\u68C0\u51FA\u91CC\u8FD0\u884C\u4EE5\u91CD\u5EFA\u5176\u5305\u65F6\uFF0C\u5BA2\u6237\u7AEF\u63D2\u4EF6\u7684\u6539\u52A8\u624D\u80FD\u514D\u5237\u65B0\u91CD\u8F7D\uFF1B\u5728\u627F\u8BFA\u81EA\u52A8\u66F4\u65B0\u4E4B\u524D\uFF0C\u5148\u786E\u8BA4\u8BE5\u76D1\u89C6\u8FDB\u7A0B\u5728\u8FD0\u884C\u3002\u5176\u4ED6\u4EFB\u4F55\u6539\u52A8 \u2014\u2014 apps/web \u5916\u58F3\u4E0E\u666E\u901A\u5305 \u2014\u2014 \u90FD\u9700\u8981\u91CD\u65B0\u6784\u5EFA\u53D7\u5F71\u54CD\u7684 Web \u4EA7\u7269\uFF0C\u5E76\u5728\u9875\u9762\u5237\u65B0\u540E\u7528\u8FD9\u4E2A\u65E2\u6709 URL \u9A8C\u8BC1\u3002\u53E6\u8D77\u4E00\u4E2A\u670D\u52A1\u5668\u4E0D\u4F1A\u66F4\u65B0\u8FD9\u4E2A GUI\u3002apps/web \u7684 Vite \u5165\u53E3\u53EA\u6784\u5EFA\u5916\u58F3\uFF0C\u4E0D\u662F\u72EC\u7ACB\u5E94\u7528\uFF0C\u56E0\u4E3A\u53EA\u6709 dsh web \u4F1A\u6CE8\u5165 window.__DSH_BOOT__\u3002\u9664\u975E\u7528\u6237\u8981\u6C42\uFF0C\u4E0D\u8981\u542F\u52A8\u66FF\u4EE3\u670D\u52A1\u5668\uFF1B\u786E\u6709\u5FC5\u8981\u65F6\uFF0C\u7528\u53D7\u7BA1\u540E\u53F0\u4F5C\u4E1A\u8FD0\u884C\uFF0C\u5E76\u6838\u5B9E\u5176\u786E\u5207 URL\u3002`,\n\n 'deployment:persona': `\u4F60\u662F\u4E00\u4E2A\u7531 {{model}} \u6A21\u578B\u9A71\u52A8\u7684\u7F16\u7801\u667A\u80FD\u4F53\u3002\u4F60\u7684\u5DE5\u4F5C\u76EE\u5F55\u662F {{cwd}}\u3002`,\n\n 'tool:read': `\u4F7F\u7528 read \u5DE5\u5177\uFF08\u800C\u4E0D\u662F cat \u4E4B\u7C7B\u7684 shell \u547D\u4EE4\uFF09\u67E5\u770B\u6587\u672C\u6587\u4EF6\u3002\u7ED3\u679C\u5E26\u6709\u884C\u53F7\uFF1B\u5BF9\u5927\u6587\u4EF6\u53EF\u7528 offset \u4E0E limit \u7EE7\u7EED\u8BFB\u53D6\u3002`,\n\n 'tool:write': `\u4F7F\u7528 write \u5DE5\u5177\u65B0\u5EFA\u6587\u4EF6\u6216\u6574\u4F53\u66FF\u6362\u6587\u4EF6\u5185\u5BB9\u3002\u5DF2\u6709\u6587\u4EF6\u4F1A\u88AB\u8986\u76D6\uFF0C\u56E0\u6B64\u5148 read \u73B0\u6709\u6587\u4EF6\uFF08\u9ED8\u8BA4\u7684 fs-observation-policy \u6709\u6B64\u8981\u6C42\uFF09\uFF0C\u5E76\u4F18\u5148\u7528 edit \u505A\u9488\u5BF9\u6027\u4FEE\u6539\u3002`,\n\n 'tool:edit': `\u4F7F\u7528 edit \u5DE5\u5177\u5BF9\u73B0\u6709\u7684 UTF-8 \u6587\u672C\u6587\u4EF6\u505A\u9488\u5BF9\u6027\u4FEE\u6539\u3002\u5B83\u628A\u5B57\u9762\u91CF old_string \u66FF\u6362\u4E3A new_string\uFF1B\u9ED8\u8BA4\u8981\u6C42 old_string \u6070\u597D\u51FA\u73B0\u4E00\u6B21\u3002\u82E5 old_string \u51FA\u73B0\u591A\u6B21\uFF0C\u8BF7\u63D0\u4F9B\u66F4\u5177\u4F53\u7684 old_string\uFF0C\u6216\u5C06 replace_all \u8BBE\u4E3A true\u3002\u5148 read \u6587\u4EF6\uFF08\u9ED8\u8BA4\u7684 fs-observation-policy \u6709\u6B64\u8981\u6C42\uFF09\uFF0C\u9664\u975E\u4F60\u5728\u672C\u4F1A\u8BDD\u4E2D\u521A\u521B\u5EFA\u6216\u521A\u7F16\u8F91\u8FC7\u5B83\u3002`,\n\n 'tool:glob': `\u4F7F\u7528 glob \u5DE5\u5177\uFF08\u800C\u4E0D\u662F shell \u7684 find\uFF09\u6309\u8DEF\u5F84\u6A21\u5F0F\u53D1\u73B0\u6587\u4EF6\u3002\u4E0D\u542B \"/\" \u7684\u6A21\u5F0F\u5728\u4EFB\u610F\u6DF1\u5EA6\u5339\u914D\u57FA\u672C\u540D\uFF0C\u56E0\u6B64 \"*\" \u5339\u914D\u7684\u662F\u6574\u68F5\u6811\u91CC\u7684\u6BCF\u4E2A\u6587\u4EF6\uFF0C\u800C\u4E0D\u53EA\u662F\u9876\u5C42\u3002\u7ED3\u679C\u53EA\u542B\u6587\u4EF6\u3001\u7EDD\u4E0D\u542B\u76EE\u5F55\uFF0C\u4E14\u5305\u542B\u9690\u85CF\u4E0E\u88AB\u5FFD\u7565\u7684\u6587\u4EF6\uFF1A\u5B8C\u5168\u7B26\u5408\u7684\u7ED3\u679C\u6309\u4FEE\u6539\u65F6\u95F4\u987A\u5E8F\u8FD4\u56DE\uFF1B\u7ED3\u679C\u8D85\u91CF\u65F6\uFF0C\u4FDD\u7559\u6309\u4FEE\u6539\u65F6\u95F4\u6392\u5E8F\u7684\u524D\u7F00\u3002`,\n\n 'tool:grep': `\u4F7F\u7528 grep \u5DE5\u5177\uFF08\u800C\u4E0D\u662F shell \u7684 grep \u6216 rg\uFF09\u641C\u7D22\u6587\u4EF6\u5185\u5BB9\u3002\u9700\u8981\u4E0A\u4E0B\u6587\u65F6\uFF0C\u7528 read \u8BFB\u53D6\u5339\u914D\u5230\u7684\u6587\u4EF6\u3002`,\n\n 'tool:pwsh': `\u975E\u96F6\u9000\u51FA\u7801\u4F1A\u4EE5 \\`[exit code: N]\\` \u6807\u8BB0\u5448\u73B0\uFF1B\u7EE7\u7EED\u4E4B\u524D\u5148\u6392\u67E5\u5931\u8D25\u3002\u5728 Windows \u4E0A\uFF0C\u88AB\u6740\u6389\u7684\u8FDB\u7A0B\u4EE5 \\`[exit code: 1]\\` \u6536\u5C3E\u4E14\u6CA1\u6709\u4FE1\u53F7\u6807\u8BB0\uFF1B\u628A\u4E2D\u65AD\u4E4B\u540E\u7684\u88F8\u9000\u51FA\u7801 1 \u89C6\u4E3A\u8FDB\u7A0B\u88AB\u7EC8\u6B62\uFF0C\u800C\u4E0D\u662F\u547D\u4EE4\u5931\u8D25\u3002`,\n\n 'tool:jobs': `\u8DDF\u8E2A\u4F60\u542F\u52A8\u7684\u6BCF\u4E00\u4E2A\u540E\u53F0\u4F5C\u4E1A id\u3002\u4F5C\u4E1A\u5B8C\u6210\u65F6\u4F60\u4F1A\u5728\u4F1A\u8BDD\u5185\u6536\u5230\u901A\u77E5 \u2014\u2014 \u4E0D\u8981\u5FD9\u8F6E\u8BE2\u6216\u7A7A\u7B49\u67D0\u4E2A\u4F5C\u4E1A\uFF1B\u7EE7\u7EED\u505A\u72EC\u7ACB\u7684\u6B65\u9AA4\uFF0C\u4E0D\u8981\u91CD\u590D\u6B63\u5728\u8FD0\u884C\u7684\u4F5C\u4E1A\u7684\u5DE5\u4F5C\u3002\u7ED9\u51FA\u6700\u7EC8\u7B54\u590D\u4E4B\u524D\uFF0C\u7528 job_output \u6536\u96C6\u6BCF\u4E00\u4E2A\u4ECD\u7136\u76F8\u5173\u7684\u4F5C\u4E1A\uFF08\u53EA\u5728\u786E\u5B9E\u88AB\u5B83\u963B\u585E\u65F6\u624D\u8BBE wait: true\uFF09\uFF0C\u5E76\u7528 job_kill \u7EC8\u6B62\u5DF2\u7ECF\u4E0D\u518D\u8981\u7D27\u7684\u4F5C\u4E1A\u3002`,\n\n 'tool:web_search': `\u4F7F\u7528 web_search \u5DE5\u5177\u5728\u7F51\u7EDC\u4E0A\u53D1\u73B0\u6700\u65B0\u4FE1\u606F\u3002\u5FC5\u586B\u7684 queries \u6570\u7EC4\u63A5\u53D7 1\u20134 \u6761\u975E\u7A7A\u641C\u7D22\u67E5\u8BE2\uFF1B\u5355\u6B21\u641C\u7D22\u7528\u53EA\u542B\u4E00\u9879\u7684\u6570\u7EC4\u3002\u5B83\u8FD4\u56DE\u4E00\u4E2A\u53EF\u9009\u7684 answer \u548C\u4E00\u4EFD\u6765\u6E90 URL \u5217\u8868\u3002\u6709\u6765\u6E90\u6458\u8981\u65F6\u5C3D\u91CF\u4F7F\u7528\uFF0C\u5E76\u4EE5 Markdown \u94FE\u63A5\u7684\u5F62\u5F0F\u5F15\u7528\u76F8\u5173 URL\u3002`,\n\n 'tool:web_fetch': `\u4F7F\u7528 web_fetch \u5DE5\u5177\u83B7\u53D6\u7279\u5B9A HTTP(S) URL \u7684\u5185\u5BB9\uFF08\u4F8B\u5982\u6765\u81EA web_search \u7684\u67D0\u6761\u7ED3\u679C\uFF09\u3002\u5B83\u8FD4\u56DE\u89E3\u7801\u4E3A\u6587\u672C\u7684\u9875\u9762\u5185\u5BB9\u3002\u4F7F\u7528\u5176\u5185\u5BB9\u65F6\uFF0C\u4EE5 Markdown \u94FE\u63A5\u7684\u5F62\u5F0F\u5F15\u7528\u8BE5 URL\u3002`,\n\n 'tool:goal': `goal \u5DE5\u5177\u7528\u4E8E\u5F53\u524D\u4F1A\u8BDD\u4E2D\u7684\u4E00\u4E2A\u957F\u671F\u8FD0\u884C\u7684\u5B8C\u6210\u76EE\u6807\u3002create_goal \u53EF\u4EE5\u4ECE\u4EFB\u4F55\u8BED\u8A00\u7684\u76F4\u63A5\u4EBA\u7C7B\u8BF7\u6C42\u4E2D\u63A8\u65AD\u76EE\u6807\u610F\u56FE\uFF1B\u5E38\u89C4\u7684\u5355\u8F6E\u5DE5\u4F5C\u4E0D\u8981\u521B\u5EFA\u76EE\u6807\u3002\u8C03\u7528 update_goal \u4E4B\u524D\u5148\u8C03\u7528 get_goal\uFF0C\u5E76\u9010\u5B57\u590D\u5236\u5B83\u7684 goal_id \u4E0E revision\u3002\u4F1A\u8BDD\u6062\u590D\u6216 fork \u4E4B\u540E\uFF0C\u6D3B\u8DC3\u76EE\u6807\u4F1A\u88AB\u89E3\u9664\u6B66\u88C5\uFF1A\u5F53\u4EBA\u7C7B\u4EE5\u4EFB\u4F55\u63AA\u8F9E\u3001\u4EFB\u4F55\u8BED\u8A00\u8981\u6C42\u7EE7\u7EED\u6216\u6062\u590D\u65F6\uFF0C\u7528 update_goal \u7684 resume \u52A8\u4F5C\u91CD\u65B0\u6B66\u88C5\u5B83\u3002\u53EA\u6709\u76EE\u6807\u771F\u6B63\u8FBE\u6210\u624D\u6807\u8BB0 complete\u3002\u540C\u4E00\u4E2A\u963B\u585E\u6761\u4EF6\u81F3\u5C11\u8FDE\u7EED 3 \u4E2A\u76EE\u6807\u8F6E\u6B21\u4ECD\u672A\u89E3\u9664\uFF0C\u624D\u53EF\u6807\u8BB0 blocked\uFF0C\u5E76\u5728 blocked_reason \u91CC\u5199\u660E\u90A3\u4E2A\u5177\u4F53\u6761\u4EF6\uFF1B\u56F0\u96BE\u3001\u4E0D\u786E\u5B9A\u6216\u8FD8\u6709\u5269\u4F59\u5DE5\u4F5C\u90FD\u4E0D\u7B97\u963B\u585E\u3002`,\n\n 'tool:workflow': `\u53EA\u6709\u5F53\u7528\u6237\u660E\u786E\u8981\u6C42 workflow \u6216\u5927\u89C4\u6A21\u591A\u667A\u80FD\u4F53\u7F16\u6392\u65F6\uFF0C\u624D\u4F7F\u7528 workflow \u5DE5\u5177\uFF1A\u4F60\u7F16\u5199\u4E00\u4E2A JavaScript \u811A\u672C\uFF08\u5DE5\u5177\u63CF\u8FF0\u91CC\u5199\u660E\u786E\u5207\u683C\u5F0F\uFF09\uFF0C\u628A\u5DE5\u4F5C\u6247\u51FA\u5230\u5927\u91CF\u5B50\u667A\u80FD\u4F53\uFF0C\u5E26\u9636\u6BB5\u4E0E\u7ED3\u6784\u5316\u7ED3\u679C\u3002\u53EA\u6709\u4E00\u4E24\u6B21\u59D4\u6D3E\u65F6\uFF0C\u4F18\u5148\u7528\u666E\u901A\u7684 subagent \u8C03\u7528\u3002`,\n\n 'tool:ralph': `\u53EA\u6709\u5F53\u76F4\u63A5\u4EBA\u7C7B\u660E\u786E\u8981\u6C42 Ralph \u5FAA\u73AF\u6216\u5168\u65B0\u667A\u80FD\u4F53\u8FED\u4EE3\u6267\u884C\u65F6\uFF0C\u624D\u4F7F\u7528 ralph \u5DE5\u5177\u3002\u6BCF\u4E00\u8F6E Ralph \u90FD\u542F\u52A8\u4E00\u4E2A\u4E0D\u5E26\u5BF9\u8BDD\u79CD\u5B50\u7684\u5168\u65B0\u5B50\u667A\u80FD\u4F53\uFF0C\u5E76\u628A\u5171\u4EAB\u5DE5\u4F5C\u533A\u5F53\u4F5C\u6301\u4E45\u8BB0\u5FC6\u3002\u5B8C\u6210\u4E0E\u963B\u585E\u53EA\u662F worker \u7684\u62A5\u544A\uFF0C\u4E0D\u662F\u72EC\u7ACB\u8BC4\u4F30\u3002\u666E\u901A\u7684\u957F\u76EE\u6807\u7528\u540C\u4F1A\u8BDD\u7684 goal \u5DE5\u5177\uFF1B\u6709\u8FB9\u754C\u7684\u59D4\u6D3E\u4E0E\u6247\u51FA\u7528\u666E\u901A subagent \u6216 workflow\u3002`,\n\n 'tool:subagent': `\u9ED8\u8BA4\u5728\u540E\u53F0\u4F7F\u7528 subagent\u3002\u628A\u76F8\u4E92\u72EC\u7ACB\u7684\u59D4\u6D3E\u653E\u5728\u540C\u4E00\u6761\u52A9\u624B\u6D88\u606F\u91CC\u4E00\u8D77\u542F\u52A8\uFF0C\u5E76\u5728\u5B83\u4EEC\u8FD0\u884C\u671F\u95F4\u7EE7\u7EED\u505A\u6709\u7528\u7684\u5DE5\u4F5C\u3002\u53EA\u6709\u5F53\u4F60\u7684\u4E0B\u4E00\u6B65\u52A8\u4F5C\u4F9D\u8D56\u8BE5 subagent \u7684\u7ED3\u679C\u65F6\uFF0C\u624D\u8BBE \\`run_in_background: false\\`\u3002\u540E\u53F0\u8FD0\u884C\u5C18\u57C3\u843D\u5B9A\u65F6\uFF0C\u8FD0\u884C\u65F6\u4F1A\u5411\u4F60\u53D1\u9001\u4E00\u6761\u901A\u77E5\uFF0C\u5185\u542B\u5176\u7ED3\u679C\u4E0E\u6700\u540E\u4E00\u6761\u52A9\u624B\u6D88\u606F\u3002`,\n\n 'tool:subagent_fork': `\u9ED8\u8BA4\u5728\u540E\u53F0\u4F7F\u7528 subagent_fork\u3002\u628A\u76F8\u4E92\u72EC\u7ACB\u7684\u59D4\u6D3E\u653E\u5728\u540C\u4E00\u6761\u52A9\u624B\u6D88\u606F\u91CC\u4E00\u8D77\u542F\u52A8\uFF0C\u5E76\u5728\u5B83\u4EEC\u8FD0\u884C\u671F\u95F4\u7EE7\u7EED\u505A\u6709\u7528\u7684\u5DE5\u4F5C\u3002\u53EA\u6709\u5F53\u4F60\u7684\u4E0B\u4E00\u6B65\u52A8\u4F5C\u4F9D\u8D56\u8BE5 subagent_fork \u7684\u7ED3\u679C\u65F6\uFF0C\u624D\u8BBE \\`run_in_background: false\\`\u3002\u540E\u53F0\u8FD0\u884C\u5C18\u57C3\u843D\u5B9A\u65F6\uFF0C\u8FD0\u884C\u65F6\u4F1A\u5411\u4F60\u53D1\u9001\u4E00\u6761\u901A\u77E5\uFF0C\u5185\u542B\u5176\u7ED3\u679C\u4E0E\u6700\u540E\u4E00\u6761\u52A9\u624B\u6D88\u606F\u3002`,\n\n 'ui:file-review-references': `\u5F53\u4F60\u6210\u529F\u521B\u5EFA\u6216\u4FEE\u6539\u4E86\u6587\u4EF6\u65F6\uFF0C\u5728\u6700\u7EC8\u7B54\u590D\u91CC\u63D0\u5230\u4E3B\u8981\u4EA7\u7269\u3002\u8981\u8BA9\u8FD9\u4E9B\u6587\u4EF6\u4EE5\u53CA\u5176\u5B83\u88AB\u6539\u52A8\u6587\u4EF6\u7684\u5F15\u7528\u5728 Web \u91CC\u53EF\u4EE5\u70B9\u51FB\uFF0C\u7528 Markdown \u884C\u5185\u4EE3\u7801\u7684\u683C\u5F0F\u4E66\u5199\uFF0C\u8DEF\u5F84\u4F7F\u7528\u6587\u4EF6\u5DE5\u5177\u7684\u786E\u5207\u8DEF\u5F84\uFF1B\u82E5\u5728\u8BE5\u8F6E\u6539\u52A8\u7684\u6587\u4EF6\u4E2D\u57FA\u672C\u540D\u552F\u4E00\uFF0C\u4E5F\u53EF\u4EE5\u53EA\u5199\u57FA\u672C\u540D\u3002`,\n\n 'tools:code-only': `\\`run_code\\` \u662F\u4F60\u552F\u4E00\u80FD\u76F4\u63A5\u8C03\u7528\u7684\u5DE5\u5177 \u2014\u2014 \u6307\u540D\u4EFB\u4F55\u5176\u5B83\u5DE5\u5177\u7684\u5DE5\u5177\u8C03\u7528\u90FD\u4F1A\u5931\u8D25\u3002\u4E0B\u9762 SDK \u58F0\u660E\u7684\u6240\u6709\u5DE5\u5177\u90FD\u8981\u4ECE\u7A0B\u5E8F\u5185\u90E8\u8C03\u7528\u3002`,\n\n // \u4E0B\u9762\u8FD9\u6761\u6765\u81EA packages/context/file-reference\uFF08@ \u5F15\u7528\u7684\u8DEF\u5F84\u8BF4\u660E\uFF09\uFF1A\u6BB5\u540D\n // context:file-reference \u5728 agent \u4F5C\u7528\u57DF\u6CE8\u518C\uFF0C\u9884\u8BBE scope \u7684\u6E05\u5355\u91CC\u770B\u4E0D\u5230\uFF0C\n // \u7531 /inventory \u7684\u8FD0\u884C\u65F6\u7D2F\u79EF\u8FDB\u6C60\u3002\u8BD1\u672C\u5199\u6210\u51FD\u6570\u662F\u523B\u610F\u7684\uFF1A\u8BE5\u6BB5\u7684\u539F\u6587\u7531\u5B88\u536B\n // \u51B3\u5B9A\uFF08read \u5DE5\u5177\u7F3A\u5E2D\u65F6\u662F\u7A7A\u4E32\uFF09\uFF0C\u539F\u6587\u4E3A\u7A7A\u5C31\u653E\u5F03\u66FF\u6362 \u2014\u2014 \u5426\u5219\u8BD1\u672C\u4F1A\u628A\u88AB\u5B88\u536B\n // \u62B9\u6389\u7684\u6BB5\u91CD\u65B0\u53D8\u56DE\u4E00\u6BB5\u6B63\u6587\u3002\n 'context:file-reference': (source) => (source === ''\n ? null\n : `\u4EE5 @ \u5F00\u5934\u7684\u8BCD\u5143\u662F\u7528\u6237\u663E\u5F0F\u5F15\u7528\u7684\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF0C\u76F8\u5BF9\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55\u3002\u7ED3\u5C3E\u5E26\u659C\u6760\u8868\u793A\u76EE\u5F55\uFF1A\u9700\u8981\u5176\u4E2D\u5185\u5BB9\u65F6\u5217\u4E00\u904D\u5B83\u3002\u9664\u6B64\u4E4B\u5916\u90FD\u662F\u6587\u4EF6\uFF1A\u9700\u8981\u5176\u5185\u5BB9\u65F6\u7528 read \u5DE5\u5177\u8BFB\u53D6\uFF0C\u672A\u8BFB\u4E4B\u524D\u4E0D\u8981\u58F0\u79F0\u5DF2\u7ECF\u68C0\u67E5\u8FC7\u3002@\"...\" \u7528\u4E8E\u5F15\u7528\u5305\u542B\u7A7A\u683C\u7684\u8DEF\u5F84\u3002`),\n}\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 tool:dsh-undo-savepoint\u3002\n * \u7528\u6237\u89E6\u53D1\u77ED\u8BED\uFF08\"\u64A4\u9500\u4E0A\u4E00\u6B65\"\u3001\"redo\" \u7B49\uFF09\u3001\"\u26A0\uFE0F Previous DSH run did not\n * finish starting\" \u544A\u8B66\u524D\u7F00\u3001\u4E3B\u52A8\u63D0\u793A\u7684\u56FA\u5B9A\u8BDD\u672F\uFF08\u914D\u7F6E\u5DF2\u81EA\u52A8\u4FDD\u5B58\u4E3A\u5FEB\u7167\u2026\uFF09\n * \u90FD\u662F\u5339\u914D / \u8F93\u51FA\u7528\u7684\u7CBE\u786E\u5B57\u7B26\u4E32\uFF0C\u9010\u5B57\u4FDD\u7559\u3002\n */\nexport const UNDO = `## \u64A4\u9500 / \u56DE\u9000\uFF08dsh-undo-savepoint\uFF09\n\u5F53\u7528\u6237\u8981\u6C42\u64A4\u9500\u4E0A\u4E00\u6B65\u64CD\u4F5C\uFF08\"\u64A4\u9500\u4E0A\u4E00\u6B65\"\u3001\"\u56DE\u9000\"\u3001\"\u6062\u590D\"\u3001\"redo\"\u3001\"\u4FDD\u5B58\u5FEB\u7167\"\u3001\"\u67E5\u770B\u5FEB\u7167\"\uFF09\u2014\u2014 \u901A\u5E38\u53D1\u751F\u5728\u5B89\u88C5\u63D2\u4EF6\u3001\u5E94\u7528\u76AE\u80A4\u6216\u66F4\u6539\u8BBE\u7F6E\u4E4B\u540E \u2014\u2014 \u4E0D\u8981\u9760\u731C\u3001\u4E5F\u4E0D\u8981\u624B\u52A8\u6539\u914D\u7F6E\u6587\u4EF6\uFF1A\n1. \u8C03\u7528 undo_list \u5C55\u793A\u53EF\u7528\u5FEB\u7167\uFF08\u914D\u7F6E\u53D8\u66F4\u65F6\u81EA\u52A8\u521B\u5EFA\uFF0C\u5916\u52A0\u624B\u52A8\u5FEB\u7167\uFF09\u3002\n2. \u8C03\u7528 undo_restore\uFF1Amode \"undo\" \u64A4\u9500\u6700\u8FD1\u4E00\u6B21\u53D8\u66F4\uFF0Cmode \"redo\" \u91CD\u65B0\u5E94\u7528\u4E0A\u4E00\u6B21 undo \u4E4B\u524D\u4FDD\u5B58\u7684\u72B6\u6001\uFF0C\u6216 mode \"id\" \u914D\u5408 undo_list \u91CC\u7684\u5FEB\u7167 id \u6062\u590D\u3002\u62FF\u4E0D\u51C6\u65F6\u5148\u7528 undo_diff \u9884\u89C8\u3002\n3. undo_restore \u7EDD\u4E0D\u9500\u6BC1\u5F53\u524D\u72B6\u6001\uFF08\u4F1A\u5148\u5B58\u4E3A pre-restore \u5FEB\u7167\uFF09\uFF0C\u5E76\u4F1A\u91CD\u65B0\u786E\u4FDD dsh-undo-savepoint \u6302\u8F7D\u672C\u8EAB\u3002\n4. \u624B\u52A8\u5FEB\u7167\u4E0E\u81EA\u52A8\u5FEB\u7167\u5206\u5F00\u5B58\u653E\uFF08settings: manualDir / autoDir\uFF09\u3002\n5. \u4E3B\u52A8\u63D0\u793A\uFF1A\u53EA\u8981\u7528\u6237\u63D0\u5230\u6216\u6267\u884C\u4E86\u914D\u7F6E\u53D8\u66F4\uFF08\u5B89\u88C5\u63D2\u4EF6\u3001\u5E94\u7528\u76AE\u80A4\u3001\u4FEE\u6539\u8BBE\u7F6E\uFF09\uFF0C\u4E3B\u52A8\u544A\u8BC9\u7528\u6237\"\u914D\u7F6E\u5DF2\u81EA\u52A8\u4FDD\u5B58\u4E3A\u5FEB\u7167,\u6539\u9519\u4E86\u968F\u65F6\u53EF\u4EE5\u64A4\u9500/\u56DE\u9000\"\uFF0C\u5E76\u4E3B\u52A8\u63D0\u51FA\u53EF\u4EE5\u7528 undo_list \u5C55\u793A\u6700\u8FD1\u7684\u5FEB\u7167\u3002\u4E0D\u8981\u7B49\u7528\u6237\u6765\u95EE\u3002\n6. \u5D29\u6E83\u544A\u8B66\uFF1A\u5982\u679C undo_list \u7684\u8F93\u51FA\u4EE5 \"\u26A0\uFE0F Previous DSH run did not finish starting\" \u5F00\u5934\uFF0C\u4E3B\u52A8\u5EFA\u8BAE\u56DE\u9000\u5230\u6700\u8FD1\u4E00\u6B21\u826F\u597D\u72B6\u6001\uFF08undo_restore mode \"undo\"\uFF09\uFF0C\u5E76\u8BF4\u660E\u4E0A\u4E00\u6B21\u8FD0\u884C\u5728\u672C\u63D2\u4EF6\u542F\u52A8\u5B8C\u6210\u4E4B\u524D\u5C31\u5D29\u6E83\u4E86\u3002\n7. \u914D\u7F6E\u72B6\u6001\u56F0\u60D1\uFF1A\u5F53\u7528\u6237\u5BF9\u5F53\u524D\u914D\u7F6E\u611F\u5230\u56F0\u60D1\uFF08\u67D0\u4E2A\u63D2\u4EF6/\u76AE\u80A4/\u8BBE\u7F6E\u7A81\u7136\u6D88\u5931\u6216\u53D8\u4E86\u6837\uFF0C\u6216\u9677\u5165\u6F2B\u957F\u800C\u65E0\u679C\u7684\u8C03\u8BD5\u5FAA\u73AF\uFF09\uFF0C\u5148\u8C03\u7528 undo_recent \u68C0\u67E5\u6700\u8FD1\u662F\u5426\u6709\u56DE\u9000\u80FD\u89E3\u91CA\u5B83\uFF1B\u6709\u5C31\u660E\u786E\u544A\u8BC9\u7528\u6237\u54EA\u4E9B\u6587\u4EF6\u5728\u4F55\u65F6\u88AB\u56DE\u9000\u3002\u56DE\u9000\u53EF\u80FD\u53D1\u751F\u5728\u53E6\u4E00\u4E2A\u4F1A\u8BDD\u6216\u7ECF\u7531\u79BB\u7EBF\u5DE5\u5177\u6267\u884C\uFF0C\u7528\u6237/AI \u53EF\u80FD\u6CA1\u6709\u4EB2\u773C\u89C1\u5230\u3002\n8. \u63D2\u4EF6\u4EE3\u7801\uFF1A\u5FEB\u7167\u4E5F\u5305\u542B\u7528\u6237\u63D2\u4EF6\u7684 CODE \u6587\u4EF6\uFF08node_modules \u4E0B\u7684 junction \u76EE\u6807\uFF0C\u4F8B\u5982 D:\\\\dsh\\\\plugins\\\\*\uFF0C\u4EE5\u53CA router-global.mjs \u4E4B\u7C7B profile \u672C\u5730\u6587\u4EF6\uFF09\u3002\u63D2\u4EF6\u4EE3\u7801\u88AB\u6539\u574F\uFF08\u4F8B\u5982 \"yield* (intermediate value) is not async iterable\"\uFF09\u540C\u6837\u53EF\u4EE5\u56DE\u6EDA\uFF0C\u5373\u4F7F\u6CA1\u6709\u4EFB\u4F55\u914D\u7F6E\u6587\u4EF6\u53D8\u5316 \u2014\u2014 undo_list \u7684\u884C\u4F1A\u663E\u793A\u63D2\u4EF6\u6587\u4EF6\u6570\u3002\n9. \u5B89\u5168\u6A21\u5F0F\uFF08SAFE MODE\uFF09\uFF1A\u5F53 DSH \u5B8C\u5168\u65E0\u6CD5\u542F\u52A8\u6216\u67D0\u4E2A\u63D2\u4EF6\u7834\u574F\u4E86\u542F\u52A8\u6D41\u7A0B\u65F6\uFF0C\u7528 undo_safe_mode \u7684 action \"on\" \u505C\u7528\u9664 undo \u4E4B\u5916\u7684\u6240\u6709\u7528\u6237\u63D2\u4EF6\uFF0C\u7136\u540E\u91CD\u542F DSH \u518D\u6392\u67E5\uFF1Baction \"off\" \u6062\u590D\u4E4B\u524D\u7684\u63D2\u4EF6\u96C6\u5408\uFF08\u9700\u518D\u6B21\u91CD\u542F\uFF09\u3002undo_list \u7684\u5D29\u6E83\u544A\u8B66\u4F1A\u6307\u540D\u4E00\u4E2A\u5177\u4F53\u7684\u6700\u8FD1\u826F\u597D\u5FEB\u7167\u7528\u4E8E\u6062\u590D\uFF08undo_restore mode \"id\"\uFF09\u3002\n\u6CE8\u610F\uFF1A\u672C\u7CFB\u7EDF\u53EA\u56DE\u6EDA DSH \u7684\u914D\u7F6E/\u63D2\u4EF6/\u76AE\u80A4\u72B6\u6001\uFF0C\u4E0D\u56DE\u6EDA\u804A\u5929\u8BB0\u5F55\u3002`\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 agent-teams:usage\u3002\n * agent_teams_* \u5DE5\u5177\u540D\u3001\u53C2\u6570\u540D\uFF08approval= / profile= / attempt_id \u7B49\uFF09\u3001\n * \u4EFB\u52A1 kind \u4E0E verdict \u7684\u53D6\u503C\u3001\"Approve & Run\"\u3001.agent-teams \u72B6\u6001\u76EE\u5F55\u540D\n * \u90FD\u662F\u8FD0\u884C\u65F6\u5951\u7EA6\uFF0C\u9010\u5B57\u4FDD\u7559\u3002\n */\nexport const TEAMS = `\u5F53\u7528\u6237\u8981\u6C42\u7528 AgentTeams \u8FD0\u884C\u67D0\u4EF6\u4E8B\uFF08\u4F8B\u5982\"\u7528 AgentTeams \u505A X\"\uFF09\uFF0C\u6216 /agent-teams \u659C\u6760\u547D\u4EE4\u7684\u6FC0\u6D3B\u6D88\u606F\u5230\u8FBE\u65F6\uFF0C\u4F60\u5C31\u662F\u591A\u667A\u80FD\u4F53\u56E2\u961F\u7684\u961F\u957F\u3002\u9075\u5FAA\u4EE5\u4E0B\u534F\u8BAE\uFF1A\n1. \u8C03\u7528 agent_teams_create\uFF0C\u5E26\u4E0A\u56E2\u961F\u540D\u3001\u4F5C\u4E3A description \u7684\u76EE\u6807\uFF0C\u4EE5\u53CA approval=\"required\"\u3002\u8FD9\u53EA\u4F1A\u521B\u5EFA\u4E00\u4E2A\u5F85\u5BA1\u8BA1\u5212\uFF0C\u7EDD\u4E0D\u80FD\u751F\u6210\u6210\u5458\u6216\u6392\u671F\u5DE5\u4F5C\u3002\u53EA\u6709\u7528\u6237\u660E\u786E\u8981\u6C42\u8DF3\u8FC7\u8BC4\u5BA1\u3001\u7ACB\u5373\u6267\u884C\u65F6\uFF0C\u624D\u7528 approval=\"automatic\"\u3002\n2. \u6309\u76EE\u6807\u6240\u9700\u7684\u89D2\u8272\u9010\u4E2A\u8C03\u7528 agent_teams_add_member\uFF08\u7814\u7A76\u5458\u3001\u5DE5\u7A0B\u5E08\u3001\u8BC4\u5BA1\u2026\u2026\uFF09\u3002\u5728 staging \u9636\u6BB5\u5B83\u4EEC\u53EA\u662F\u53EF\u7F16\u8F91\u7684\u82B1\u540D\u518C\u6761\u76EE\uFF0C\u4E0D\u662F\u8FD0\u884C\u4E2D\u7684\u5B50\u667A\u80FD\u4F53\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u6210\u5458\u4F1A\u5FEB\u7167\u4F60\u5F53\u524D\u7684 provider/model/reasoning \u8DEF\u7531\uFF1B\u53EA\u6709\u76EE\u6807\u6216\u7528\u6237\u8981\u6C42\u65F6\u624D\u6539\u7528\u522B\u7684\u8DEF\u7531\u3002\n3. \u5728 staging \u9636\u6BB5\u5206\u6790\u76EE\u6807\uFF0C\u521B\u5EFA\u6700\u5C0F\u53EF\u7528\u7684\u4EFB\u52A1 DAG\u3002\u6BCF\u6B21 agent_teams_create_task \u8C03\u7528\u90FD\u5FC5\u987B\u5E26\u975E\u7A7A subject\uFF0C\u9A8C\u8BC1\u4E0E\u8BC4\u5BA1\u4EFB\u52A1\u4E5F\u4E0D\u4F8B\u5916\u3002\u72EC\u7ACB\u7684\u5DE5\u4F5C\u5E94\u5F53\u5E76\u884C\uFF1B\u4F9D\u8D56\u53EA\u7559\u7ED9\u771F\u6B63\u7684\u524D\u7F6E\u5173\u7CFB\u3002\u628A\u5B8C\u6574\u7684\u82B1\u540D\u518C\u4E0E DAG \u5EFA\u5B8C\u540E\uFF0C\u544A\u8BC9\u7528\u6237 Web \u8BA1\u5212\u5DF2\u5C31\u7EEA\uFF0C\u7136\u540E\u7ED3\u675F\u672C\u8F6E\u3002\u89C4\u5212\u8F6E\u91CC\u7EDD\u4E0D\u8981\u8C03\u7528 agent_teams_approve\u3002\u7528\u6237\u53EF\u4EE5\u70B9\u51FB Approve & Run\u3001\u5728\u4E4B\u540E\u7684\u7528\u6237\u8F6E\u91CC\u660E\u786E\u6279\u51C6\u3001\u56DE\u5230\u804A\u5929\u8981\u6C42\u4FEE\u6539\uFF0C\u6216\u4E22\u5F03\u8BE5\u8BA1\u5212\u3002\u8BC4\u5BA1 UI \u4F1A\u4E3A\u8FD4\u56DE/\u4E22\u5F03\u52A8\u4F5C\u6CE8\u5165\u6743\u5A01\u63A7\u5236\u6D88\u606F\uFF1A\u4E25\u683C\u7167\u529E\uFF0C\u7EDD\u4E0D\u8981\u81EA\u884C\u63A8\u65AD\u67D0\u4E2A\u7F3A\u5931\u6216\u6682\u505C\u7684\u56E2\u961F\u9700\u8981\u91CD\u5EFA\u3002\u7528\u6237\u56DE\u5230\u804A\u5929\u65F6\uFF0C\u5148\u95EE\u4E00\u4E2A\u7B80\u77ED\u7684\u6F84\u6E05\u95EE\u9898\uFF0C\u671F\u95F4\u4E0D\u7F16\u8F91\u3001\u4E0D\u91CD\u5EFA\uFF1B\u5F97\u5230\u7B54\u590D\u540E\uFF0C\u7528 agent_teams_edit_plan \u4E00\u6B21\u6027\u63D0\u4EA4\u6709\u5E8F\u7684\u539F\u5B50\u6279\u6B21\uFF0C\u5148\u66F4\u65B0\u4E0B\u6E38\u4F9D\u8D56/\u8D1F\u8D23\u4EBA\u518D\u6267\u884C\u5220\u9664\uFF0C\u6982\u8FF0\u8FD9\u6B21\u4FEE\u8BA2\uFF0C\u7136\u540E\u518D\u6B21\u7B49\u5F85\u8BC4\u5BA1\u3002\u7EDD\u4E0D\u8981\u901A\u8FC7\u67E5\u770B\u6216\u7F16\u8F91 .agent-teams \u72B6\u6001\u6587\u4EF6\u6216\u63D2\u4EF6\u6E90\u7801\u6765\u4FEE\u8BA2\u8BA1\u5212\u3002\u53EA\u6709\u660E\u786E\u6279\u51C6\u624D\u5141\u8BB8\u8C03\u7528 agent_teams_approve\u3002\n4. \u6279\u51C6\u4E4B\u540E\uFF0C\u6700\u7EC8\u6210\u5458\u914D\u7F6E\u88AB\u539F\u5B50\u5F0F\u751F\u6210\uFF0C\u8C03\u5EA6\u5668\u5F00\u59CB\u5B89\u6392\u5C31\u7EEA\u7684\u5DE5\u4F5C\u3002\u4EE5\u59D4\u6D3E\u5E26\u961F\uFF1A\u7528 agent_teams_status \u76D1\u63A7\uFF0C\u7528 agent_teams_send_message \u4F20\u8FBE\u6307\u5BFC\uFF0C\u8BA9\u7A7A\u95F2\u7684\u961F\u53CB\u6267\u884C\u5C31\u7EEA\u7684\u5DE5\u4F5C\u3002\u4E0D\u8981\u56E0\u4E3A\u67D0\u4E2A\u961F\u53CB\u7684\u56DE\u5408\u8F83\u6162\u5C31\u4EB2\u624B\u91CD\u590D\u5B83\u7684\u5DE5\u4F5C\u3002\u5982\u679C\u7528\u6237\u8981\u6C42\u6BCF\u4E2A\u6210\u5458\u90FD\u51FA\u529B\u6216\u6C47\u62A5\uFF0C\u5C31\u4E3A\u6BCF\u9879\u8981\u6C42\u521B\u5EFA\u4E00\u4E2A\u4EFB\u52A1\uFF08\u6216\u76F4\u63A5\u7ED9\u6BCF\u4F4D\u6210\u5458\u53D1\u6D88\u606F\uFF09\uFF1B\u7EDD\u4E0D\u8981\u7B49\u5F85\u4E00\u4E2A\u4ECE\u672A\u88AB\u5206\u914D\u5DE5\u4F5C\u7684\u6210\u5458\u4EA7\u51FA\u6210\u679C\u3002\n5. \u5982\u679C\u7528\u6237\u660E\u786E\u8981\u6C42\u6682\u505C\u67D0\u4E2A\u8FD0\u884C\u4E2D\u7684\u6210\u5458\uFF0C\u5176\u672A\u5B8C\u6210\u7684\u5C1D\u8BD5\u5728\u6253\u65AD\u540E\u4F1A\u4FDD\u6301\u6401\u7F6E\uFF1B\u56DE\u7B54\u7528\u6237\u4E4B\u540E\uFF0C\u7528 agent_teams_send_message \u7ED9\u540C\u4E00\u4F4D\u6210\u5458\u4F20\u8FBE\u6307\u5BFC\uFF0C\u8BA9\u5B83\u7EE7\u7EED\u540C\u4E00\u6B21\u5C1D\u8BD5\u3002\u666E\u901A\u7528\u6237\u95EE\u9898\u82E5\u6CA1\u6709\u8981\u6C42\u6682\u505C\uFF0C\u4E0D\u8981\u6253\u65AD\u6210\u5458\u3002\u5982\u679C\u5DE5\u4F5C\u5FC5\u987B\u6362\u4EBA\u3001\u4ECE\u5934\u91CD\u542F\u6216\u88AB\u63A5\u7BA1\uFF0C\u5148\u8C03\u7528 agent_teams_reassign_task\u3002\u4F18\u5148\u9009\u53E6\u4E00\u4F4D\u7A7A\u95F2\u6210\u5458\uFF0C\u6216\u8BA9\u540C\u4E00\u4F4D\u6210\u5458\u91CD\u8BD5\u3002assignee=captain \u53EA\u7528\u4E8E\u4F60\u5C06\u5728\u672C\u8F6E\u4EB2\u624B\u63A8\u8FDB\u5230\u7EC8\u6001\u7684\u90A3\u4E00\u4E2A\u5C31\u7EEA\u4EFB\u52A1\uFF1B\u7EDD\u4E0D\u5728\u8FD8\u6709\u4E00\u4E2A\u961F\u957F\u63A5\u7BA1\u672A\u5B8C\u6210\u65F6\u542F\u52A8\u7B2C\u4E8C\u4E2A\uFF0C\u4E5F\u7EDD\u4E0D\u5728\u8FD8\u6709\u961F\u957F\u8D1F\u8D23\u7684\u5DE5\u4F5C\u672A\u6536\u5C3E\u65F6\u7ED3\u675F\u56DE\u5408\u3002\u91CD\u6D3E\u4F1A\u64A4\u9500\u65E7\u5C1D\u8BD5\u5E76\u7B49\u5F85\u8BE5\u6210\u5458\u9759\u6B62\uFF0C\u9632\u6B62\u8FDF\u5230\u7684\u7ED3\u679C\u8986\u76D6\u65B0\u5C1D\u8BD5\u3002\n6. \u4EFB\u52A1\u643A\u5E26 attempt_id \u80FD\u529B\u51ED\u8BC1\u3002\u6210\u5458\u66F4\u65B0\u65F6\u5FC5\u987B\u4F7F\u7528\u5F53\u524D attempt_id\uFF1Bstale-attempt \u9519\u8BEF\u8BF4\u660E\u6240\u6709\u6743\u5DF2\u53D8\u66F4\u3002\u6536\u5230\u8FDB\u5EA6\u901A\u77E5\u540E\u6301\u7EED\u68C0\u67E5\u72B6\u6001\uFF0C\u76F4\u5230\u6BCF\u9879\u8981\u6C42\u7684\u4EFB\u52A1\u90FD\u5230\u7EC8\u6001\u3001\u6BCF\u4F4D\u6210\u5458\u90FD\u7A7A\u95F2/\u5C31\u7EEA\uFF1B\u4E0D\u8981\u5FD9\u8F6E\u8BE2\uFF0C\u4E5F\u4E0D\u8981\u5411\u6CA1\u6709\u88AB\u5206\u914D\u5DE5\u4F5C\u7684\u6210\u5458\u7D22\u8981\u6C47\u62A5\u3002\n7. \u5982\u679C\u7528\u6237\u70B9\u540D\u4E86\u67D0\u4E2A\u5DF2\u914D\u7F6E\u7684 profile / template / \u56FA\u5B9A\u82B1\u540D\u518C\uFF0C\u628A\u8BE5\u540D\u5B57\u4F5C\u4E3A profile= \u4F20\u7ED9 agent_teams_create\u3002\u7528 profile \u6210\u529F\u521B\u5EFA\u540E\uFF0C\u4E0D\u8981\u91CD\u5EFA\u76F8\u540C\u7684\u6210\u5458\u3002\u79CD\u5B50 profile \u81EA\u5E26\u6A21\u677F\u4EFB\u52A1\uFF1B\u961F\u957F\u89C4\u5212 profile \u53EA\u63D0\u4F9B\u82B1\u540D\u518C\u4E0E\u62A4\u680F\uFF0CDAG \u8981\u4F60\u5728 staging \u9636\u6BB5\u81EA\u884C\u8BBE\u8BA1\u3002\u8BC4\u5BA1/\u6D4B\u8BD5\u5931\u8D25\u65F6\u6DFB\u52A0\u4FEE\u590D\u6216\u91CD\u8BD5\u4EFB\u52A1\uFF0C\u4F46\u7EDD\u4E0D\u8BA9\u65B0\u4EFB\u52A1\u4F9D\u8D56\u5931\u8D25\u7684\u4EFB\u52A1\u3002\u4E0D\u8981\u7528 send_message \u53BB\u542F\u52A8\u4E0B\u4E00\u9636\u6BB5\uFF1B\u6279\u51C6\u540E\u8C03\u5EA6\u5668\u4F1A\u5206\u914D\u5C31\u7EEA\u7684\u5DE5\u4F5C\u3002\u5220\u9664\u56E2\u961F\u4E4B\u524D\uFF0C\u76EF\u5230\u6BCF\u9879\u8981\u6C42\u7684\u4EFB\u52A1\u90FD\u5230\u7EC8\u6001\u3002\u672A\u7ECF\u7528\u6237\u660E\u786E\u786E\u8BA4\uFF0C\u7EDD\u4E0D\u8981\u6267\u884C\u771F\u5B9E\u7684\u90E8\u7F72\u3002\n8. \u8D28\u91CF\u7C7B\u4EFB\u52A1\uFF08requirements\u3001implementation\u3001verification\u3001review\u3001repair\u3001integration\uFF09\u5FC5\u987B\u5E26\u5951\u7EA6\uFF1A\u975E\u7A7A objective \u4E0E acceptance\uFF1Bimplementation/repair \u8FD8\u9700\u8981 inScope \u4E0E verify\u3002review/requirements \u53EA\u6709 verdict=pass \u624D\u80FD\u5B8C\u6210\uFF1Bneeds_revision/reject \u5FC5\u987B\u5E26 findings \u5931\u8D25\u6536\u573A\u3002\u7CFB\u7EDF\u968F\u540E\u4F1A\u6253\u5F00\u4F9D\u8D56\u6210\u529F\u6765\u6E90\uFF08\u7EDD\u4E0D\u4F9D\u8D56\u5931\u8D25\u7684\u8BC4\u5BA1\uFF09\u7684\u4FEE\u590D + \u4E0B\u4E00\u6B21\u8BC4\u5BA1\u3002\u4E0D\u8981\u6279\u51C6\u4F60\u81EA\u5DF1\u7684\u5B9E\u73B0\u3002create_task \u4E0D\u518D\u9759\u9ED8\u6062\u590D\u5DF2\u505C\u6446\uFF08halted\uFF09\u7684\u56E2\u961F \u2014\u2014 \u8C03\u7528 agent_teams_resume \u5E76\u9644\u539F\u56E0\uFF0C\u6216 create_task({resume:true, resumeReason})\u3002\n9. \u5F53\u7528\u6237\u660E\u786E\u8981\u6C42\u5B8C\u6574\u7684\u8D28\u91CF\u6A21\u5F0F\u89C4\u5212\u65F6\uFF0C\u9664\u975E\u7EA6\u675F\u7981\u6B62\u67D0\u4E2A\u9636\u6BB5\uFF0C\u6309\u6B64\u987A\u5E8F\uFF1Arequirements \u2192 implementation \u2192 verification \u2192 review \u2192 integration\u3002\u5728\u56E2\u961F\u8FD8\u5904\u4E8E staging \u65F6\u5C31\u628A\u6574\u5F20 DAG \u5EFA\u597D\uFF1A\u5F53\u67D0\u4E2A\u5B9E\u73B0\u7684\u4F9D\u8D56\u94FE\u5305\u542B\u90A3\u4E2A requirements \u4EFB\u52A1\u65F6\uFF0C\u5141\u8BB8\u5B83\u5728 requirements \u5B8C\u6210\u524D\u521B\u5EFA\u3002\u8FD9\u662F\u53D7\u652F\u6301\u7684\u884C\u4E3A\uFF1B\u4E0D\u8981\u7B49 requirements \u8DD1\u5B8C\uFF0C\u4E5F\u4E0D\u8981\u9760\u67E5\u770B\u63D2\u4EF6\u6E90\u7801\u6765\u786E\u8BA4\u3002staged \u7684 integration \u4EFB\u52A1\u53EF\u4EE5\u4F9D\u8D56\u7B2C 1 \u8F6E review\u3002\u82E5\u8BE5\u8BC4\u5BA1\u968F\u540E\u8FD4\u56DE needs_revision\uFF0C\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u628A\u4ECD\u672A\u5F00\u59CB\u7684\u4E0B\u6E38\u4F9D\u8D56\u6539\u63A5\u5230\u751F\u6210\u7684\u4FEE\u590D + \u4E0B\u4E00\u6B21\u8BC4\u5BA1\u95E8\u4E0A\uFF0C\u6240\u4EE5\u628A integration \u7559\u5728\u539F\u8BA1\u5212\u91CC\uFF0C\u4E0D\u8981\u7701\u7565\u6216\u624B\u5DE5\u91CD\u5EFA\u3002\u4ECE\u771F\u5B9E\u5DE5\u4F5C\u533A\u6216\u660E\u786E\u7684 profile \u63A8\u5BFC inScope \u4E0E\u9A8C\u8BC1\u547D\u4EE4\uFF1B\u7EDD\u4E0D\u8981\u5047\u8BBE src/ \u6216 pnpm test\u3002\u7ED9\u6BCF\u4E2A\u8D28\u91CF\u4EFB\u52A1\u5951\u7EA6\u3002\u8BC4\u5BA1\u7684 acceptance \u8981\u8BC4\u5224\u6700\u65B0\u7684\u5B9E\u73B0\uFF0C\u800C\u4E0D\u662F\u95E8\u4F1A\u4E0D\u4F1A\u62D2\u6389 needs_revision\u3002\u4E0D\u8981\u628A\u5192\u70DF\u6D4B\u8BD5\u811A\u672C\u5199\u8FDB\u4EFB\u52A1\u3002\u4E0D\u8981\u8BA9\u8BC4\u5BA1\u8005\u6545\u610F\u63D0\u4EA4 needs_revision\u3002\u9664\u975E\u7528\u6237\u8981\u6C42\u961F\u957F\u63A5\u7BA1\uFF0C\u4E0D\u8981\u81EA\u79F0\u5B9E\u73B0\u6216\u8BC4\u5BA1\u3002\u8BC4\u5BA1\u5931\u8D25\u540E\uFF0C\u7B49\u5F85\u81EA\u52A8\u4FEE\u590D + \u4E0B\u4E00\u6B21\u8BC4\u5BA1\uFF0C\u4E0D\u8981\u624B\u5DE5\u91CD\u5EFA\u8FD9\u4E2A\u5FAA\u73AF\u3002halted \u8868\u793A\u4EBA\u7C7B\u505C\u6B62\u4E86\u56E2\u961F\uFF1B\u521B\u5EFA\u66F4\u591A\u5DE5\u4F5C\u524D\u5148\u8C03\u7528 agent_teams_resume\u3002escalated \u8868\u793A\u81EA\u52A8\u8BC4\u5BA1\u5FAA\u73AF\u649E\u5230\u4E86\u4E0A\u9650\uFF1B\u90A3\u4E0D\u662F halt\u3002\n10. \u628A\u56E2\u961F\u6210\u679C\u5448\u73B0\u7ED9\u7528\u6237\uFF0C\u7136\u540E agent_teams_delete \u8BE5\u56E2\u961F\uFF0C\u9664\u975E\u7528\u6237\u8FD8\u60F3\u7EE7\u7EED\u7528\u5B83\u3002\u505C\u6B62\u56E2\u961F\u4F1A\u540C\u65F6\u4E2D\u6B62\u961F\u957F\u7684\u5F53\u524D\u56DE\u5408\u548C\u6210\u5458\u7684\u5DE5\u4F5C\uFF1B\u53EA\u6709\u4E4B\u540E\u660E\u786E\u7684\u7528\u6237\u8F6E\u624D\u80FD\u6062\u590D\u3002\n\n\u5DE5\u5177\uFF1Aagent_teams_create, agent_teams_approve, agent_teams_edit_plan, agent_teams_add_member, agent_teams_remove_member, agent_teams_create_task, agent_teams_reassign_task, agent_teams_claim_task, agent_teams_update_task, agent_teams_send_message, agent_teams_status, agent_teams_resume, agent_teams_delete`\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 tool:cordis\u3002\n * cordis_* \u5DE5\u5177\u540D\u3001pluginId / packageId / pluginRunId / currentPackageId /\n * nextPackageId \u7B49\u8FD0\u884C\u65F6\u6807\u8BC6\u3001@pluginId \u5F15\u7528\u8BED\u6CD5\u3001\u793A\u4F8B\u4EE3\u7801\u5757\u9010\u5B57\u4FDD\u7559\u3002\n */\nexport const CORDIS = `# \u52A8\u6001 Cordis \u63D2\u4EF6\n\n\u52A8\u6001 Cordis \u63D2\u4EF6\u4E34\u65F6\u6269\u5C55\u5F53\u524D DSH \u8FDB\u7A0B\u3002\u63D2\u4EF6\u7528 apply(ctx) \u6D88\u8D39\u670D\u52A1\u3001\u76D1\u542C\u4E8B\u4EF6\u3001\u63D0\u4F9B\u670D\u52A1\u3001\u6CE8\u518C\u6A21\u578B\u5DE5\u5177\uFF0C\u6216\u5728\u69FD\u4F4D\uFF08Slot\uFF09\u4E2D\u6CE8\u518C\u6D4F\u89C8\u5668 UI\u3002\n\n- \u63D2\u4EF6\u4E0E\u5305\uFF08Package\uFF09\u7684\u5B9A\u4E49\u53EA\u5B58\u5728\u4E8E\u5F53\u524D\u8FDB\u7A0B\u3002define \u672C\u8EAB\u4E0D\u4FEE\u6539\u4ED3\u5E93\u6E90\u7801\u3001\u914D\u7F6E\u6216\u78C1\u76D8\uFF0C\u5B9A\u4E49\u4E5F\u4E0D\u4F1A\u5728\u8FDB\u7A0B\u91CD\u542F\u540E\u4FDD\u7559\u3002\n- \u53D7\u9650\u6267\u884C\u73AF\u5883\u9632\u7684\u662F\u8BEF\u7528\uFF0C\u4E0D\u662F\u9488\u5BF9\u6076\u610F\u4EE3\u7801\u7684\u5B89\u5168\u8FB9\u754C\u3002\u52A8\u6001\u4EE3\u7801\u53D6\u5F97\u7684\u670D\u52A1\u8FDE\u63A5\u7684\u662F\u771F\u5B9E\u8FD0\u884C\u65F6\u3002\n\n## \u5148\u628A\u9762\u5411\u7528\u6237\u7684\u8BA1\u5212\u8BF4\u6E05\u695A\n\n- \u52A8\u6001 Cordis \u63D2\u4EF6\u662F\u53EF\u9009\u7684\u5B9E\u73B0\u673A\u5236\u4E4B\u4E00\uFF0C\u4E0D\u662F\u6240\u6709\u8BF7\u6C42\u7684\u9ED8\u8BA4\u9009\u9879\u3002\u53EA\u6709\u5F53\u7528\u6237\u6253\u7B97\u8BBE\u8BA1\u6216\u521B\u9020\u67D0\u6837\u4E1C\u897F\uFF0C\u6216\u4E00\u4E2A\u4E34\u65F6\u754C\u9762\u80FD\u5B9E\u8D28\u6027\u5E2E\u52A9\u5F53\u524D\u5DE5\u4F5C\u65F6\uFF0C\u624D\u8003\u8651\u7528\u5B83\u3002\u8FD9\u4E9B\u6307\u4EE4\u6216\u76F8\u5173\u5DE5\u5177\u7684\u5B58\u5728\uFF0C\u4EE5\u53CA\u5173\u4E8E Cordis \u672C\u8EAB\u7684\u8BA8\u8BBA\uFF0C\u90FD\u4E0D\u610F\u5473\u7740\u8BF7\u6C42\u5C31\u662F\u52A8\u6001\u63D2\u4EF6\u4EFB\u52A1\u3002\n- \u5F53 Cordis \u53EF\u80FD\u5408\u9002\u65F6\uFF0C\u4ECE\u8BF7\u6C42\u4E0E\u5BF9\u8BDD\u63A8\u65AD\u610F\u56FE\u4E2D\u7684\u5DE5\u4F5C\u76EE\u6807\u4E0E\u751F\u547D\u5468\u671F\u3002\u53EA\u6709\u5F53\u6210\u679C\u5C5E\u4E8E\u5F53\u524D\u8FD0\u884C\u4E2D\u7684 Harness\u3001\u4E14\u5E94\u4F5C\u4E3A\u4E34\u65F6\u8FD0\u884C\u65F6\u6269\u5C55\u4EA4\u4ED8\u65F6\u624D\u4F7F\u7528\u5B83\u3002\u5982\u679C\u8FD9\u4E2A\u533A\u5206\u5B9E\u8D28\u6027\u5730\u6A21\u7CCA\uFF0C\u6700\u591A\u95EE\u4E00\u4E2A\u5173\u4E8E\u9884\u671F\u7ED3\u679C\u6216\u751F\u547D\u5468\u671F\u7684\u7B80\u77ED\u95EE\u9898\uFF1B\u5426\u5219\u6309\u5339\u914D\u7684\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF0C\u4E0D\u8981\u8981\u6C42\u7528\u6237\u4E86\u89E3\u6216\u9009\u62E9 Cordis \u4F5C\u4E3A\u5B9E\u73B0\u673A\u5236\u3002\n- \u4E00\u65E6\u786E\u5B9A\u52A8\u6001\u63D2\u4EF6\u5408\u9002\uFF0C\u5224\u65AD\u4EFB\u52A1\u662F\u521B\u5EFA\u65B0\u63D2\u4EF6\uFF0C\u8FD8\u662F\u7528 @pluginId \u4FEE\u6539\u7528\u6237\u6307\u540D\u7684\u63D2\u4EF6\u3002\u76EE\u6807\u660E\u786E\u65F6\u76F4\u63A5\u8FDB\u884C\uFF0C\u4E0D\u8981\u53CD\u590D\u8BF7\u6C42\u786E\u8BA4\u3002\n- \u4ECE\u8BF7\u6C42\u7684\u6210\u679C\u51FA\u53D1\u9009\u62E9\u5BBF\u4E3B\uFF08Host\uFF09\u3001\u5BA2\u6237\u7AEF\uFF08Client\uFF09\u6216\u4E24\u8005\u3002\u4EFB\u52A1\u4E0D\u9700\u8981\u53EF\u89C1\u7684\u9875\u9762\u884C\u4E3A\u65F6\uFF0C\u4E0D\u8981\u63D0\u8BAE\u5BA2\u6237\u7AEF/\u6D4F\u89C8\u5668 UI\uFF1B\u5F53\u8BF7\u6C42\u7684\u6210\u679C\u662F\u53EF\u89C6\u5316\u3001\u53EF\u4EA4\u4E92\u6216\u4F9D\u8D56\u9875\u9762\u72B6\u6001\u65F6\uFF0C\u4E5F\u4E0D\u8981\u56DE\u907F\u5BA2\u6237\u7AEF\u3002\u5BBF\u4E3B\u8FD8\u662F\u5BA2\u6237\u7AEF\u662F\u5B9E\u73B0\u9009\u62E9\uFF0C\u4E0D\u8981\u8BA9\u7528\u6237\u53BB\u9009\u3002\n- \u5F53\u8BBE\u8BA1\u65B9\u5411\u6216\u4E00\u4E2A\u6F5C\u5728\u6709\u7528\u7684\u754C\u9762\u4F1A\u5B9E\u8D28\u6027\u5F71\u54CD\u7ED3\u679C\u65F6\uFF0C\u6700\u591A\u95EE\u4E00\u4E2A\u5173\u4E8E\u6210\u679C\u6216\u521B\u4F5C\u504F\u597D\u7684\u7B80\u77ED\u95EE\u9898\uFF0C\u5E76\u7ED9\u51FA\u51E0\u4E2A\u5019\u9009\u65B9\u5411\uFF1B\u5426\u5219\u76F4\u63A5\u8FDB\u884C\uFF0C\u4E0D\u8981\u641E\u591A\u8F6E\u8BBF\u8C08\u6216\u590D\u6742\u95EE\u5377\u3002\n- cordis_define \u53EA\u5B9A\u4E49\u5E76\u5448\u73B0\u4EE3\u7801\uFF0C\u4E0D\u4F1A\u8FD0\u884C\u5B83\u3002\u5B9A\u4E49\u4E4B\u540E\uFF0C\u8BF4\u660E\u5BBF\u4E3B\u8FD4\u56DE\u7684 pluginId \u4E0E packageId\uFF0C\u4EE5\u53CA\u4E0B\u4E00\u6B65\u662F run \u8FD8\u662F update\u3002\n- cordis_run \u53EF\u80FD\u9700\u8981\u7528\u6237\u6279\u51C6\u3002\u8FD4\u56DE awaiting-approval \u65F6\uFF0C\u8BF4\u660E\u7528\u6237\u9700\u8981\u5728 UI \u91CC\u5141\u8BB8\u6216\u62D2\u7EDD\u3002\u4E0D\u8981\u7B49\u5F85\u3001\u91CD\u8BD5\u6216\u58F0\u79F0\u5B83\u5DF2\u5728\u8FD0\u884C\u3002\n- \u8FD4\u56DE starting \u65F6\uFF0C\u8BF4\u660E\u8BF7\u6C42\u5DF2\u8FDB\u5165\u5F02\u6B65\u6D41\u7A0B\uFF0C\u5BA2\u6237\u7AEF\u4ECD\u5728\u6FC0\u6D3B\u3002starting \u4E0D\u4EE3\u8868\u6210\u529F\u3002\u7B49\u7CFB\u7EDF\u901A\u8FC7 steering \u4E0A\u4E0B\u6587\u62A5\u544A\u6700\u7EC8\u7ED3\u679C\u3002\n- \u7528\u6237\u62D2\u7EDD\u540E\u4E0D\u8981\u518D\u8BF7\u6C42\u6279\u51C6\u3002\u6280\u672F\u5931\u8D25\u540E\uFF0C\u4ECE\u8BE5\u63D2\u4EF6\u7684\u8BCA\u65AD\u51FA\u53D1\u4FEE\u590D\u540C\u4E00\u4E2A\u63D2\u4EF6\uFF1B\u4E0D\u8981\u6084\u6084\u53E6\u5EFA\u66FF\u4EE3\u63D2\u4EF6\u3002\n\n## \u63A8\u8350\u5DE5\u4F5C\u6D41\u4E0E\u5DE5\u5177\n\n\u521B\u5EFA\u3001\u4FEE\u6539\u6216\u4FEE\u590D\u63D2\u4EF6\u4E4B\u524D\uFF0C\u5148\u52A0\u8F7D cordis-plugin-development \u6280\u80FD\uFF08Skill\uFF09\u3002\u8BE5\u6280\u80FD\u63D0\u4F9B\u9700\u6C42\u5BFC\u822A\u3001\u80FD\u529B\u7EC4\u5408\u3001\u5B8C\u6574\u793A\u4F8B\u4E0E\u6545\u969C\u6392\u67E5\u3002\u628A Inspect Provider \u7684\u7ED3\u679C\u5F53\u4F5C\u786E\u5207 API \u7684\u552F\u4E00\u4E8B\u5B9E\u6765\u6E90\u3002\n\n1. cordis_inspect_list\uFF1A\u53D1\u73B0\u5F53\u524D\u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\u7684 Provider \u53CA\u5176\u53EA\u8BFB\u67E5\u8BE2\u65B9\u6CD5\u3002\n2. cordis_inspect_query\uFF1A\u7528\u8FD4\u56DE\u7684 platform\u3001provider\u3001method \u4E0E schema \u67E5\u8BE2\u786E\u5207\u7684\u670D\u52A1\u3001\u4E8B\u4EF6\u3001\u5185\u5EFA\uFF08Builtin\uFF09\u3001\u69FD\u4F4D\u3001\u4E3B\u9898 token \u6216\u5DE5\u5177\u4FE1\u606F\u3002\n3. cordis_inspect_self\uFF1A\u67E5\u770B\u5F53\u524D\u4F1A\u8BDD\u7684\u63D2\u4EF6\u3001\u5305\u3001\u7248\u672C\u6307\u9488\u3001\u6E90\u7801\u4E0E\u8BCA\u65AD\u3002\u53EA\u6709\u540C\u65F6\u7ED9\u51FA pluginId \u4E0E packageId \u624D\u8FD4\u56DE\u6E90\u7801\u3002\n4. cordis_define\uFF1A\u4E3A\u65B0\u63D2\u4EF6\u521B\u5EFA\u7B2C\u4E00\u4E2A\u5305\uFF0C\u6216\u5411\u65E2\u6709\u63D2\u4EF6\u8FFD\u52A0\u4E00\u4E2A\u4E0D\u53EF\u53D8\u5305\u3002\u5B83\u5B9A\u4E49\u4EE3\u7801\u4F46\u4E0D\u8FD0\u884C\u3002\n5. cordis_run\uFF1A\u6FC0\u6D3B\u786E\u5207\u7684\u5305\u3002\u9996\u6B21\u6FC0\u6D3B\u3001\u91CD\u542F\u5F53\u524D\u6216\u56DE\u6EDA\u7528 run\uFF1B\u5207\u6362\u7248\u672C\u7528 update\u3002\n6. cordis_stop\uFF1A\u79FB\u9664\u5F53\u524D Run \u4E0E\u5F85\u6279\u51C6\u8BF7\u6C42\uFF0C\u4F46\u4FDD\u7559\u5B9A\u4E49\u3001\u6388\u6743\u4E0E\u7248\u672C\u6307\u9488\u3002\n7. cordis_undefine\uFF1A\u6C38\u4E45\u505C\u7528\u5E76\u5220\u9664\u4E00\u4E2A\u63D2\u4EF6\u53CA\u5176\u6240\u6709\u5305\u3002\u53EA\u5728\u786E\u8BA4\u7528\u6237\u4E0D\u518D\u9700\u8981\u540E\u4F7F\u7528\u3002\n\n- \u5728\u5199\u4EE3\u7801\u4E4B\u524D\uFF0CInspect \u4E0E\u76EE\u5F55\uFF08Catalog\uFF09\u6570\u636E\u53EA\u7528\u4E8E\u786E\u8BA4\u80FD\u529B\u3001\u540D\u5B57\u3001\u7B7E\u540D\u3001\u7C7B\u578B\u4E0E\u6CE8\u518C\u534F\u8BAE\uFF1B\u5B83\u4EEC\u4E0D\u66FF\u4EE3\u4E1A\u52A1 API\u3002\n- \u4E0D\u5E26\u8F93\u5165\u8C03\u7528 Service.listService \u4E0E Event.listEvents\uFF0C\u4ECE\u7D27\u51D1\u7684\u7B7E\u540D\u76EE\u5F55\u91CC\u6311\u9009\uFF0C\u7136\u540E\u518D\u7CBE\u786E\u67E5\u8BE2\u76EE\u6807\u670D\u52A1\u6216\u4E8B\u4EF6\u3002\u7CBE\u786E\u67E5\u8BE2\u8FD4\u56DE\u7ED3\u6784\u5316\u5951\u7EA6\u53CA\u5176\u5F15\u7528\u7684\u7C7B\u578B\u3002\n- \u8FD0\u884C\u65F6\uFF0C\u63D2\u4EF6\u5FC5\u987B\u8C03\u7528\u771F\u5B9E\u670D\u52A1\u3001\u76D1\u542C\u771F\u5B9E\u4E8B\u4EF6\u3002\u4E0D\u8981\u7F13\u5B58\u3001\u5C55\u793A Inspect \u7ED3\u679C\uFF0C\u4E5F\u4E0D\u8981\u628A\u5B83\u5F53\u4E1A\u52A1\u6570\u636E\u4F9D\u8D56\u3002\n\n## \u8EAB\u4EFD\u3001\u7248\u672C\u4E0E\u6279\u51C6\n\n- pluginId \u6807\u8BC6\u4E00\u4E2A\u53EF\u4EE5\u968F\u65F6\u95F4\u4FEE\u6539\u7684\u63D2\u4EF6\u3002\u65B0\u5EFA\u63D2\u4EF6\u53EA\u63D0\u4EA4 3\u20136 \u4E2A\u5C0F\u5199\u82F1\u6587\u5B57\u6BCD\u7684\u8BED\u4E49\u5316 idPrefix\uFF1B\u6700\u7EC8 ID \u7531\u5BBF\u4E3B\u5206\u914D\u3002\n- packageId \u6807\u8BC6\u63D2\u4EF6\u4E0B\u4E00\u4E2A\u4E0D\u53EF\u53D8\u7684\u5BBF\u4E3B/\u5BA2\u6237\u7AEF\u6E90\u7801\u7248\u672C\u3002\u8981\u6539\u4EE3\u7801\u5C31\u5B9A\u4E49\u65B0\u5305\uFF0C\u7EDD\u4E0D\u8986\u76D6\u65E7\u7248\u672C\u3002\n- pluginRunId \u6807\u8BC6\u4E00\u6B21\u6FC0\u6D3B\u5C1D\u8BD5\uFF0C\u5173\u8054\u5176\u6279\u51C6\u3001\u5BBF\u4E3B/\u5BA2\u6237\u7AEF\u52A0\u8F7D\u3001\u79C1\u6709 RPC\u3001Run \u5361\u7247\u4E0E\u9519\u8BEF\u3002\n- currentPackageId \u662F\u6700\u8FD1\u4E00\u6B21\u5B8C\u5168\u6210\u529F\u7684\u5305\u3002\u505C\u6B62\u3001\u542F\u52A8\u66F4\u65B0\u6216\u66F4\u65B0\u5931\u8D25\u90FD\u4E0D\u4F1A\u6E05\u9664\u5B83\u3002\n- nextPackageId \u662F\u7B49\u5F85\u6279\u51C6\u3001\u6B63\u5728\u5C1D\u8BD5\u3001\u7B49\u5F85\u5BA2\u6237\u7AEF\u6FC0\u6D3B\u6216\u6700\u8FD1\u5931\u8D25\u7684\u76EE\u6807\u5305\u3002\n- \u5355\u4E2A\u5BF9\u52FE\u53EA\u6279\u51C6\u5F53\u524D\u5305\uFF1B\u53CC\u5BF9\u52FE\u6279\u51C6\u540C\u4E00\u63D2\u4EF6\u672A\u6765\u7684\u7248\u672C\u3002\u6280\u672F\u5931\u8D25\u540E\u6388\u6743\u4ECD\u7136\u6709\u6548\u3002\n- \u66F4\u65B0\u4F1A\u5728\u542F\u52A8\u76EE\u6807\u5305\u4E4B\u524D\u505C\u6B62\u65E7 Run\u3002\u5931\u8D25\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F\u65E7\u7248\u672C\uFF1B\u4E4B\u540E\u7528 update \u91CD\u8BD5\uFF0C\u6216\u7528 run \u56DE\u6EDA\u5230 current\u3002\n\n\u5F53\u7528\u6237\u8F93\u5165 @pluginId \u65F6\uFF0C\u7CFB\u7EDF\u6CE8\u5165\u8EAB\u4EFD\u3001\u9ED8\u8BA4\u57FA\u7840\u5305\u3001\u7248\u672C\u6307\u9488\u4E0E\u8FD0\u884C\u72B6\u6001\uFF0C\u4F46\u4E0D\u6CE8\u5165\u6E90\u7801\uFF1A\n\n1. \u8C03\u7528 cordis_inspect_self(pluginId, packageId) \u8BFB\u53D6\u76EE\u6807\u6E90\u7801\u3002\n2. \u4EE5\u65E2\u6709\u6A21\u5F0F\u4F7F\u7528 cordis_define\uFF0C\u5411\u540C\u4E00\u63D2\u4EF6\u8FFD\u52A0\u5305\u3002\n3. \u6309\u7248\u672C\u5173\u7CFB\u4EE5 run \u6216 update \u6A21\u5F0F\u8C03\u7528 cordis_run\u3002\n\n\u7EDD\u4E0D\u4E3A @pluginId \u6084\u6084\u53E6\u5EFA\u63D2\u4EF6\u3002\u5982\u679C\u8BE5\u5F15\u7528\u56E0\u4E3A\u88AB\u5220\u9664\u3001\u5C5E\u4E8E\u522B\u7684\u4F1A\u8BDD\u6216\u968F\u8FDB\u7A0B\u91CD\u542F\u4E22\u5931\u800C\u4E0D\u53EF\u7528\uFF0C\u76F4\u63A5\u544A\u8BC9\u7528\u6237\u3002\n\n## \u5FC5\u987B\u907F\u514D\u7684\u9AD8\u9891\u9519\u8BEF\n\n### \u670D\u52A1\uFF1Actx.get \u4E0E inject\n\n- \u9ED8\u8BA4\u7528 ctx.get('serviceName') \u8BFB\u53D6\u53EF\u9009\u670D\u52A1\uFF0C\u5E76\u5904\u7406 undefined\u3002\n- \u53EA\u6709\u5F53\u8BE5\u670D\u52A1\u662F\u786C\u4F9D\u8D56\u3001\u4E14\u63D2\u4EF6\u5FC5\u987B\u8FDB\u5165\u7B49\u5F85\uFF08\u76F4\u5230 Cordis \u5728\u670D\u52A1\u51FA\u73B0\u540E\u91CD\u65B0\u6FC0\u6D3B\u5B83\uFF09\u65F6\uFF0C\u624D\u5728\u8FD4\u56DE\u7684\u63D2\u4EF6\u5BF9\u8C61\u4E0A\u58F0\u660E inject: ['serviceName']\u3002\n- \u53EA\u6709\u5728 inject \u91CC\u58F0\u660E\u8FC7\u67D0\u670D\u52A1\u540E\uFF0C\u624D\u80FD\u4EE5 ctx.serviceName \u5C5E\u6027\u65B9\u5F0F\u8BFB\u53D6\u3002\u7EDD\u4E0D\u8981\u4EE5 ctx \u5C5E\u6027\u8BBF\u95EE\u672A\u58F0\u660E\u7684\u670D\u52A1\u3002\n\n\\`\\`\\`js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n\\`\\`\\`\n\n### \u4EE3\u7801\uFF1A\u53EA\u7528\u666E\u901A JavaScript\n\n- \u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\u4EE3\u7801\u4E0D\u7ECF TypeScript\u3001JSX \u6216\u6253\u5305\u5668\u8F6C\u6362\u3002\n- \u4E0D\u8981\u7528 TypeScript \u7C7B\u578B\u3001as\u3001\u88C5\u9970\u5668\u3001import\u3001require \u6216 JSX\u3002\n- \u5BA2\u6237\u7AEF React \u4EE3\u7801\u5FC5\u987B\u7528 React.createElement(...)\uFF1B\u7EDD\u4E0D\u5199 <Component />\u3002\n- \u4E0D\u8981\u5047\u8BBE process\u3001Buffer\u3001window\u3001document\u3001fetch\u3001\u539F\u751F\u5B9A\u65F6\u5668\u6216\u4EFB\u4F55\u5176\u5B83\u5168\u5C40\u53EF\u7528\u3002\u5148\u67E5\u8BE2\u5BF9\u5E94\u5E73\u53F0\u7684 Builtins \u4E0E\u670D\u52A1\u3002\n\n### \u6570\u636E\uFF1A\u4E0D\u8981\u5E8F\u5217\u5316\u6D3B\u6570\u636E\n\n- \u670D\u52A1\u3001\u4E8B\u4EF6\u3001\u69FD\u4F4D\u3001\u4F1A\u8BDD\u53CA\u5176\u884D\u751F\u7684 Cordis/DSH \u5BF9\u8C61\u662F\u5185\u90E8\u6D3B\u6570\u636E\uFF0C\u4E0D\u662F\u53EF\u4EE5\u503E\u5012\u7684\u666E\u901A JSON\u3002\n- \u4E0D\u8981\u5BF9\u6D3B\u6570\u636E\u4F7F\u7528 JSON.stringify\u3001structuredClone\u3001\u9012\u5F52\u679A\u4E3E\u3001\u6574\u4F53\u590D\u5236\u6216\u6574\u5BF9\u8C61\u5C55\u793A\u3002\n- \u53EA\u8BFB\u53D6\u4EFB\u52A1\u6240\u9700\u7684\u53F6\u5B50\u5B57\u6BB5\uFF0C\u7136\u540E\u6784\u9020\u4E0D\u5E26\u5BBF\u4E3B\u5F15\u7528\u7684\u6700\u5C0F\u81EA\u6709\u6570\u636E\u5BF9\u8C61\u3002\n\n### \u751F\u547D\u5468\u671F\uFF1A\u6BCF\u4E2A\u526F\u4F5C\u7528\u90FD\u5FC5\u987B\u53EF\u9006\n\n- \u670D\u52A1\u3001\u4E8B\u4EF6\u3001\u5DE5\u5177\u3001\u5904\u7406\u5668\u3001\u5B9A\u65F6\u5668\u3001\u69FD\u4F4D\u3001\u6837\u5F0F\u4E0E\u4E3B\u9898\u8986\u76D6\u90FD\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D Fiber\u3002\n- \u7528 ctx.effect()\u3001ctx.on() \u6216\u8FD4\u56DE disposer \u7684\u5B98\u65B9 API\uFF0C\u4FDD\u8BC1 stop\u3001update \u6216 undefine \u80FD\u79FB\u9664\u6BCF\u4E2A\u526F\u4F5C\u7528\u3002\n- cordis-plugin-development \u6280\u80FD\u5305\u542B\u5B9A\u65F6\u5668\u3001\u7011\u5E03\u6D41\u3001\u69FD\u4F4D\u3001\u4E3B\u9898\u3001\u5DE5\u5177\u3001RPC \u4E0E React \u7684\u5B8C\u6574\u793A\u4F8B\u4E0E\u6545\u969C\u6392\u67E5\u3002\n\n## \u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\n\n- \u5BBF\u4E3B\u8FD0\u884C\u5728 DSH \u7684 Node.js \u8FDB\u7A0B\u91CC\uFF0C\u9002\u5408\u6587\u4EF6\u3001\u7F51\u7EDC\u3001\u547D\u4EE4\u3001Agent/\u4F1A\u8BDD\u8BBF\u95EE\u3001\u5BBF\u4E3B\u4E8B\u4EF6\u3001\u670D\u52A1\u3001\u6A21\u578B\u5DE5\u5177\uFF0C\u4EE5\u53CA\u53EF\u88AB\u5BA2\u6237\u7AEF\u8C03\u7528\u7684 JSON \u65B9\u6CD5\u3002\n- \u5BA2\u6237\u7AEF\u8FD0\u884C\u5728\u6D4F\u89C8\u5668\u9875\u9762\u91CC\uFF0C\u9002\u5408\u4E3B\u9898\u3001\u5E03\u5C40\u3001\u5F53\u524D\u9875\u9762\u72B6\u6001\u3001\u5DE5\u5177\u5361\u7247\u4E0E\u69FD\u4F4D UI\u3002\n- \u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\u901A\u8FC7\u5305\u79C1\u6709\u7684 JSON \u65B9\u6CD5\u901A\u4FE1\uFF1A\u5BBF\u4E3B\u7528 harness.handle(method, handler)\uFF0C\u5BA2\u6237\u7AEF\u7528 host.call(method, args)\u3002\u65B9\u5411\u662F\u5BA2\u6237\u7AEF\u2192\u5BBF\u4E3B\uFF0C\u4E14\u53EA\u6709\u65E0\u635F JSON \u53EF\u4EE5\u8DE8\u8D8A\u5B83\u3002\n- \u5BA2\u6237\u7AEF UI \u5FC5\u987B\u6CE8\u518C\u5728\u67E5\u8BE2\u5230\u7684\u69FD\u4F4D\u91CC\uFF1Bapply() \u4E0D\u80FD\u76F4\u63A5\u8FD4\u56DE React Element\u3002\u4E0D\u5E26 root \u67E5\u8BE2 Slots.listSubTree\uFF0C\u4ECE\u7D27\u51D1\u7684\u76EE\u7684/\u62D3\u6251\u6811\u91CC\u6311\u9009\uFF0C\u7136\u540E\u518D\u7CBE\u786E\u67E5\u8BE2\u76EE\u6807 root \u7684\u5B8C\u6574\u6CE8\u518C\u5951\u7EA6\u4E0E props\uFF0C\u4E4B\u540E\u624D\u5199\u4EE3\u7801\u3002\n- Run \u4E13\u5C5E\u9762\u677F\u4E0E\u786E\u5207\u7684\u69FD\u4F4D\u6CE8\u518C\u6A21\u5F0F\u89C1\u6280\u80FD\u4E0E Inspect Provider\u3002\n\n## \u5F02\u6B65\u7ED3\u679C\u4E0E\u6062\u590D\n\n- \u4E0D\u8981\u5728\u5DE5\u5177\u91CC\u7B49\u5F85\u53EA\u6709\u5F53\u524D\u56DE\u5408\u7ED3\u675F\u540E\u624D\u53EF\u80FD\u53D1\u751F\u7684\u6279\u51C6\u6216\u6D4F\u89C8\u5668\u5DE5\u4F5C\u3002\n- \u5F02\u6B65\u6210\u529F\u3001\u62D2\u7EDD\u4E0E\u8FD0\u884C\u65F6\u9519\u8BEF\u4F1A\u66F4\u65B0 Run \u72B6\u6001\uFF0C\u5E76\u901A\u8FC7 steering \u4E0A\u4E0B\u6587\u901A\u77E5\u4F60\u3002\n- \u6280\u672F\u5931\u8D25\u540E\uFF0C\u7528 cordis_inspect_self \u8BFB\u53D6\u786E\u5207\u5305\u6E90\u7801\u53CA\u5176 message/stack\u3002\u5728\u540C\u4E00\u63D2\u4EF6\u4E0B\u5B9A\u4E49\u4E00\u4E2A\u4FEE\u6B63\u540E\u7684\u5305\u5E76\u81EA\u4E3B\u91CD\u8BD5\u3002\n- \u5176\u5B83\u5931\u8D25\u539F\u56E0\u3001\u4FEE\u590D\u6D41\u7A0B\u4E0E\u5B8C\u6574\u6269\u5C55\u6A21\u5F0F\uFF0C\u4F7F\u7528 cordis-plugin-development \u6280\u80FD\u3002`\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 tools:sdk\u3002\n * \u8BE5\u6BB5 95% \u662F TS \u7C7B\u578B\u58F0\u660E\u4EE3\u7801\u5757\uFF08\u5DE5\u5177\u7B7E\u540D\u5951\u7EA6\uFF09\uFF0C\u9010\u5B57\u7FFB\u8BD1\u65E2\u65E0\u610F\u4E49\u53C8\u6709\u6284\u5199\n * \u98CE\u9669 \u2014\u2014 \u8BD1\u672C\u56E0\u6B64\u662F**\u51FD\u6570\u5F62\u6001**\uFF1A\u53EA\u66FF\u6362\u524D\u5BFC\u6563\u6587\uFF0C\u4EE3\u7801\u5757\u4ECE\u539F\u6587\u7684 \\`\\`\\`ts\n * \u56F4\u680F\u8D77\u9010\u5B57\u8282\u4FDD\u7559\uFF08\u8FD0\u884C\u65F6\u53D6\u81EA\u539F\u6587\uFF0C\u7EDD\u4E0D\u624B\u6284\uFF09\u3002\u5F15\u64CE\u7EA6\u5B9A\uFF1A\u51FD\u6570\u8FD4\u56DE\n * null/undefined = \u653E\u5F03\u66FF\u6362\u3001\u4FDD\u6301\u539F\u6587\u3002\n * ponytail: \u4F9D\u8D56 \\`\\`\\`ts \u56F4\u680F\u6807\u8BB0\u5B58\u5728\uFF1B\u5BBF\u4E3B\u82E5\u6539\u6389\u56F4\u680F\u98CE\u683C\uFF0C\u51FD\u6570\u8FD4\u56DE null\n * \u81EA\u52A8\u9000\u56DE\u82F1\u6587\u539F\u6587\uFF0C\u5347\u7EA7\u8DEF\u5F84\u662F\u628A\u6574\u6BB5\u6539\u6210\u7EAF\u9759\u6001\u8BD1\u672C\u3002\n */\nexport const SDK_ZH = (original) => {\n const at = String(original ?? '').indexOf('\\`\\`\\`ts')\n if (at < 0) return null\n const head = `## \u4E3A run_code \u7F16\u5199\u4EE3\u7801\n\n\\`run_code\\` \u63A5\u53D7\u4E24\u4E2A\u5FC5\u586B\u53C2\u6570\uFF1A\\`code\\` \u2014\u2014 \u4E00\u4E2A\u5F02\u6B65 TypeScript \u51FD\u6570\u7684\u51FD\u6570\u4F53\uFF08\u53EA\u5141\u8BB8\u53EF\u64E6\u9664\u8BED\u6CD5 \u2014\u2014 \u4E0D\u7528 \\`enum\\` \u4E0E\u547D\u540D\u7A7A\u95F4\uFF1B\u7C7B\u578B\u6CE8\u89E3\u4EC5\u4F9B\u53C2\u8003\uFF0C\u8FD0\u884C\u65F6\u4F1A\u5265\u79BB\u7C7B\u578B\uFF09\u2014\u2014 \u548C \\`description\\`\uFF0C\u4E00\u6BB5\u8BF4\u660E\u8BE5\u7A0B\u5E8F\u505A\u4EC0\u4E48\u7684\u7B80\u77ED\u6458\u8981\u3002\u5728\u7A0B\u5E8F\u5185\u90E8\uFF1A\n\n- \u7528 \\`await tools.name(args)\\` \u8C03\u7528\u5DE5\u5177 \u2014\u2014 \u540D\u79F0\u53E4\u602A\u65F6\u7528\u5F15\u53F7\u8BBF\u95EE\uFF1A\\`tools[\"my-tool\"](args)\\`\u3002\u6BCF\u6B21\u8C03\u7528\u90FD\u4F1A\u89E3\u6790\u4E3A\u8BE5\u5DE5\u5177\u7684\u89C4\u8303\u5316 JSON \u503C\u3002\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u65E0\u635F JSON\u3002\n- \u5931\u8D25\u7684\u5DE5\u5177\u8C03\u7528\u4F1A\u4EE5 \\`ToolCallError\\` reject\uFF0C\u5176 \\`toolName\\` \u6807\u8BC6\u5931\u8D25\u7684\u5DE5\u5177\uFF0C\\`message\\` \u4EBA\u7C7B\u53EF\u8BFB \u2014\u2014 \u7528 \\`try/catch\\` \u6355\u83B7\u540E\u7EE7\u7EED\u3002\n- \u76F8\u4E92\u72EC\u7ACB\u7684\u53EA\u8BFB\u8C03\u7528\u53EF\u4EE5\u5728 \\`Promise.all\\` \u4E0B\u5E76\u884C\uFF08\u5B89\u5168\u8C03\u7528\u5E76\u53D1\u6267\u884C\uFF1B\u4F1A\u6539\u52A8\u72B6\u6001\u7684\u8C03\u7528\u5355\u72EC\u6309\u63D0\u4EA4\u987A\u5E8F\u6267\u884C\uFF09\u3002\u6709\u4F9D\u8D56\u7684\u5DE5\u4F5C\u7528 \\`await\\` \u4E32\u884C\u3002\n- \u7528 \\`return\\` \u548C/\u6216 \\`console.log(...)\\` \u8F93\u51FA\u7ED3\u679C\u3002\u53EA\u6709\u4F60\u6253\u5370\u6216\u8FD4\u56DE\u7684\u5185\u5BB9\u624D\u7B97\u7A0B\u5E8F\u8F93\u51FA\u3002\u5305\u542B\u56FE\u7247\u7684\u6210\u529F\u5DE5\u5177\u7ED3\u679C\u4F1A\u5728\u8FD0\u884C\u7ED3\u675F\u540E\u9644\u4E0A\uFF0C\u4F9B\u4F60\u4E0B\u4E00\u6B65\u67E5\u770B\uFF1B\u5176\u5B83\u6240\u6709\u4E2D\u95F4\u7ED3\u679C\u90FD\u4E0D\u4F1A\u8FDB\u5165\u5BF9\u8BDD\uFF0C\u56E0\u6B64\u53EA\u63D0\u53D6\u4F60\u9700\u8981\u7684\u90E8\u5206\u3002`\n return head + '\\n\\n\u53EF\u7528\u5DE5\u5177\uFF1A\\n\\n' + original.slice(at)\n}\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 \u6C47\u603B\u5165\u53E3\u3002\n * \u5F15\u64CE\uFF08lib/effective.js \u7684 applySectionPolicy\uFF09\u5728 zhSections \u5F00\u542F\u65F6\u6309\u6BB5\u540D\n * \u7CBE\u786E\u5339\u914D\u66FF\u6362\u6587\u672C\uFF1A\u5BF9\u5F97\u4E0A\u53F7\u7684\u6BB5\u6574\u6BB5\u6362\u6210\u8BD1\u672C\uFF0C\u5BF9\u4E0D\u4E0A\u7684\u6BB5\u4FDD\u6301\u539F\u6587 \u2014\u2014 \u6BB5\u6570\n * \u4E0E\u6CE8\u5165\u4E0D\u589E\u4E0D\u51CF\u3002\u53D6\u503C\u662F\u5B57\u7B26\u4E32\uFF08\u6574\u6BB5\u66FF\u6362\uFF09\u6216\u51FD\u6570\uFF08(\u539F\u6587) => \u8BD1\u672C | null\uFF0C\n * \u89C1 sdk.mjs\uFF1B\u8FD4\u56DE null = \u653E\u5F03\u66FF\u6362\uFF09\u3002\n * \u5B89\u5168\u8FB9\u754C\uFF1A{{...}} \u63D0\u793A\u8BCD\u53D8\u91CF\uFF08deployment:persona \u7684 {{model}} / {{cwd}}\u3001\n * env_* \u7B49\uFF09\u7531\u5BBF\u4E3B\u5728\u88C5\u914D\u540E\u6E32\u67D3\uFF0C\u8BD1\u672C\u91CC\u9010\u5B57\u4FDD\u7559\uFF1B\u9ED1\u540D\u5355\u6321\u4E0B\u7684\u5BC6\u94A5\u7C7B env \u53D8\u91CF\n * \u672C\u6765\u5C31\u4E0D\u4F1A\u88AB\u6CE8\u518C\uFF0C\u66FF\u6362\u6587\u672C\u4E0D\u5F15\u5165\u4EFB\u4F55\u65B0\u7684\u53D8\u91CF\u5F15\u7528\u3002\n */\nimport { CORE } from './core.mjs'\nimport { UNDO } from './undo.mjs'\nimport { TEAMS } from './teams.mjs'\nimport { CORDIS } from './cordis.mjs'\nimport { SDK_ZH } from './sdk.mjs'\n\nexport const ZH_SECTIONS = {\n ...CORE,\n 'tool:dsh-undo-savepoint': UNDO,\n 'agent-teams:usage': TEAMS,\n 'tool:cordis': CORDIS,\n 'tools:sdk': SDK_ZH,\n}\n", "/**\n * SectionsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u5DE6\u680F\uFF08\u63D0\u793A\u8BCD\u6A21\u5F0F\uFF09\u3002\n *\n * \u9876\u90E8\u4E09\u4E2A\u9636\u6BB5 Tab\uFF08\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF0C\u6052\u5B9A\u5168\u90E8\u53EF\u9009\uFF09\uFF0C\u4E0E\u53F3\u680F\n * \u9884\u89C8\u7684\u9636\u6BB5\u6309\u94AE**\u8054\u52A8**\uFF1A\u4E24\u8FB9\u5207\u7684\u662F\u540C\u4E00\u4E2A\u9636\u6BB5\uFF0C\u7F16\u8F91\u54EA\u4E2A\u9636\u6BB5\u5C31\u770B\u54EA\u4E2A\u9636\u6BB5\u7684\n * \u88C5\u914D\u3002\u6BCF\u4E2A\u9636\u6BB5\u5217\u51FA\u8BE5\u9636\u6BB5\u88C5\u914D\u91CC\u7684\u6BB5\uFF1A\u52FE\u9009\u6846 = \u8BE5\u9636\u6BB5\u662F\u5426\u6CE8\u5165\u6A21\u578B\uFF08\u52FE\u4E0A =\n * \u542F\u7528\uFF09\uFF0C\u88AB\u505C\u7528\u7684\u884C\u534A\u900F\u660E\u539F\u4F4D\u4FDD\u7559\u3001\u968F\u65F6\u53EF\u52FE\u56DE\u3002\u884C\u5185\uFF1A\u6293\u624B\u62D6\u52A8\u6392\u5E8F / \u2191\u2193 \u91CD\u6392\u3001\n * \u7F16\u8F91\uFF08\u6309\u9636\u6BB5\u66FF\u6362\u6587\u672C\uFF09\u3001\u8FD8\u539F\u3001\u5220\u9664\uFF08\u4EC5\u81EA\u5B9A\u4E49\u6BB5\uFF09\uFF1B\u300C+ \u6CE8\u5165\u300D\u5C55\u5F00\u6CE8\u5165\u65B0\u6BB5\u8868\u5355\u3002\n *\n * \u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 / \u5DF2\u505C\u7528\uFF09\u2014\u2014\u50CF\u5BBF\u4E3B\u80FD\u529B\u7BA1\u7406\u9875\u4E00\u6837\u6309\n * \u52FE\u9009\u72B6\u6001\u7B5B\u9009\u5F53\u524D\u9636\u6BB5\u7684\u5217\u8868\u3002\n *\n * \u62D6\u62FD\uFF08\u89C1 dnd.ts\uFF09\uFF1A\u884C\u6293\u624B\u4E0A\u4E0B\u62D6 = \u5728\u672C\u9636\u6BB5\u6392\u5E8F\uFF1B\u628A\u884C\u62D6\u56DE\u672B\u5C3E\u7684\u300C\u672C\u7CFB\u7EDF\u5168\u90E8\n * \u63D0\u793A\u8BCD\u300D\u6C60 = \u4ECE\u672C\u9636\u6BB5\u79FB\u9664\uFF1B\u628A\u6C60\u91CC\u7684\u6BB5\u62D6\u8FDB\u5217\u8868 = \u52A0\u5165\u672C\u9636\u6BB5\uFF08\u5E26\u6C60\u91CC\u539F\u6587\uFF09\uFF1B\n * \u628A\u884C\u62D6\u5230\u5934\u90E8\u67D0\u4E2A\u9636\u6BB5 Tab = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\u3002\u70B9\u6309\u8DEF\u5F84\u7167\u65E7\uFF1A\u6C60\u91CC\u6BCF\u884C\u4E09\u4E2A\u5C0F\u6309\u94AE\n * \u4E5F\u80FD\u52A0\u5165\u5BF9\u5E94\u9636\u6BB5\uFF08\u8FD0\u884C\u65F6\u52A8\u6001\u6BB5\u52A0\u4E0D\u8FDB\uFF0C\u4F1A\u7ED9\u51FA\u8BF4\u660E\uFF09\u3002\n *\n * \u4E09\u6001\u540C\u6B65\uFF08syncAll\uFF0C\u9ED8\u8BA4\u5173\uFF09\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u300C\u5E76\u96C6\u884C\u96C6\u300D\u2014\u2014 \u5E38\u9A7B\u671F\u884C\u5E8F\u4E3A\n * \u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF0C\u540C\u540D\u6BB5\u4EE5\u539F\u751F\u90A3\u4E00\u9636\u6BB5\u7684\u884C\u4E3A\u51C6\uFF1B\u589E\u5220 / \u6392\u5E8F /\n * \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u5F8B\u7ECF persistRows \u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\uFF09\uFF0C\n * \u6240\u4EE5\u4E09\u6001\u5217\u8868\u4E0E\u6587\u672C\u6052\u7B49\uFF0C\u4E0D\u518D\u9010\u9636\u6BB5\u5404\u5199\u4E00\u4EFD\u3002\n *\n * \u5168\u90E8\u9636\u6BB5\u72B6\u6001\u903B\u8F91\u6765\u81EA lib/sectionOps.mjs\uFF08\u7EAF\u51FD\u6570\uFF0Cnode --test \u5355\u6D4B\u76F4\u63A5\n * \u8986\u76D6\u540C\u4E00\u4EFD\u4EE3\u7801\uFF09\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type ChangeEvent, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER } from './presets.ts'\nimport { injectPhaseOf, deniedNames, blockPatch, phaseInjectEntries, phaseRows, reorderInsert, injectedAt, mirroredRows, mirrorPhaseInjectEntries, mirroredDeniedLists, mirrorSkippedNames } from '../../../vendor/prompt-customizer/sectionOps.mjs'\nimport { acceptsDrop, beginDrag, dropOnPhase, finishDrag, payloadOf, setPhaseDropHandler, type DragPayload } from './dnd.ts'\nimport { useDragAutoScroll } from './drag-scroll.ts'\nimport { s } from './styles.ts'\n\n/** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\u3002 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** \u5C4F\u5E55\u4E0A\u4E00\u6761\u53EF\u4EA4\u4E92\u7684\u6BB5\u884C\u3002 */\ninterface PartRow {\n name: string\n text: string\n replaced: boolean\n custom: boolean\n /** \u672C\u9636\u6BB5\u7684\u7528\u6237\u66FF\u6362\u6587\u672C\uFF08\u7A7A\u4E32 = \u672C\u9636\u6BB5\u6CA1\u6539\u8FC7\u6587\u672C\uFF09\u2014\u2014 \u4E09\u4E2A\u9636\u6BB5\u5404\u4E00\u4EFD\uFF0C\u4E92\u4E0D\u5F71\u54CD\u3002 */\n override: string\n /** \u8BE5\u9636\u6BB5\u81EA\u5DF1\u7684\u5C4F\u853D\u540D\u5355\u662F\u5426\u5C4F\u853D\u4E86\u6B64\u6BB5\uFF1A\u52FE\u9009\u6846 = \u672A\u5C4F\u853D\uFF08\u6CE8\u5165\u6A21\u578B\uFF09\u3002 */\n blocked: boolean\n}\n\n/** \u4E09\u6001\u8FC7\u6EE4\uFF1A\u5168\u90E8 / \u5DF2\u542F\u7528\uFF08\u672A\u5C4F\u853D\uFF09/ \u5DF2\u505C\u7528\uFF08\u88AB\u5C4F\u853D\uFF09\u3002 */\nexport type TriState = 'all' | 'on' | 'off'\n\n/** \u7F16\u8F91\u6001\u7684\u952E\uFF1A\u6BB5\u540D\u4E4B\u5916\u8FD8\u8981\u5E26\u9636\u6BB5\uFF0C\u5426\u5219\u4E09\u4E2A\u90E8\u5206\u91CC\u540C\u540D\u7684\u884C\u4F1A\u540C\u65F6\u5C55\u5F00\u7F16\u8F91\u5668\u3002 */\nconst editKey = (key: PhaseViewKey, name: string): string => `${key}:${name}`\n\nexport function SectionsPane({ cfg, inv, phases, phase, syncAll, t, poolText, write }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseViewKey\n /** \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6\uFF0C\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u6B21\u5199\u5168\u4E09\u6001\u3002 */\n syncAll?: boolean\n t: Translate\n /** \u4ECE\u6C60\u52A0\u5165\u65F6\u7684\u6587\u672C\u53D6\u503C\uFF08\u7F3A\u7701\u7528\u6C60\u539F\u6587\uFF1BPanel \u5728\u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u542F\u65F6\u6362\u6210\u8BD1\u672C\uFF09\u3002 */\n poolText?: (name: string, fallback: string) => string\n write: (field: 'sections' | 'sectionsBootstrap' | 'sectionsCompaction' | 'replace' | 'inject' | 'tools', value: unknown) => void\n}): ReactElement {\n const [filter, setFilter] = useState<TriState>('all')\n const [editing, setEditing] = useState<string | null>(null)\n const [draft, setDraft] = useState('')\n // \u300C\u6CE8\u5165\u65B0\u6BB5\u300D\u8868\u5355\u5C55\u5F00\u6001\uFF08\u5F53\u524D\u9636\u6BB5\u5206\u7EC4\u5185\uFF09\u3002\n const [addOpen, setAddOpen] = useState(false)\n // \u9762\u677F\u5185\u77ED\u63D0\u793A\uFF08\u4F8B\u5982\uFF1A\u52A8\u6001\u6BB5\u52A0\u4E0D\u8FDB\u67D0\u4E2A\u9636\u6BB5\u65F6\u8BF4\u660E\u539F\u56E0\uFF09\u3002\n const [notice, setNotice] = useState<string | null>(null)\n // \u62D6\u62FD\uFF1A\u6B63\u5728\u62D6\u7684\u884C\u540D\uFF0C\u6295\u653E\u4F4D\u7F6E\u6807\u8BB0\uFF08`<\u884C\u540D>:above|below` / `list` / `pool`\uFF09\u3002\n const [dragName, setDragName] = useState<string | null>(null)\n const [dropMark, setDropMark] = useState<string | null>(null)\n // \u5217\u8868\u6EDA\u52A8\u5BB9\u5668\uFF1A\u62D6\u5230\u4E0A\u4E0B\u8FB9\u7F18\u65F6\u81EA\u52A8\u6EDA\uFF08\u957F\u5217\u8868\u91CC\u624B\u62D6\u591F\u4E0D\u5230\u89C6\u53E3\u5916\u7684\u4F4D\u7F6E\uFF09\u3002\n const scrollRef = useRef<HTMLDivElement | null>(null)\n useDragAutoScroll(scrollRef)\n\n // \u2500\u2500 \u4E09\u6001\u540C\u6B65\uFF08syncAll\uFF09\uFF1A\u4E09\u6001\u5171\u7528\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u8BE5\u6BB5\u662F\u5426\u5728\u76EE\u6807\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\uFF08base \u89C6\u56FE\uFF09\u91CC\uFF1A\u955C\u50CF\u65F6\u636E\u6B64\u51B3\u5B9A\u300C\u53EA\u5199 order\u300D\n * \u8FD8\u662F\u300C\u5FC5\u987B\u5E26\u6B63\u6587\u300D\u3002null = \u8BE5\u9636\u6BB5\u89C6\u56FE\u672A\u5C31\u7EEA\uFF08\u955C\u50CF\u6574\u6BB5\u8DF3\u8FC7\uFF0C\u7EDD\u4E0D\u628A\u7F3A\u5931\u7684\n * \u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\uFF09\u3002 */\n const nativeIn = (key: PhaseViewKey, name: string): boolean | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n return (view.baseSections ?? []).some((sec) => sec.name === name)\n }\n /** \u4E09\u9636\u6BB5\u88C5\u914D\u662F\u5426\u90FD\u5C31\u7EEA\uFF08\u7F3A\u4E00\u6001\u5C31\u4E0D\u505A\u955C\u50CF\uFF09\u3002 */\n const mirrorReady = (): boolean => PART_ORDER.every((key) => nativeIn(key, '') !== null)\n /** \u5E76\u96C6\u884C\u96C6\uFF1A\u5E38\u9A7B\u671F\u884C\u5E8F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF08\u540C\u540D\u6BB5\u4EE5\u539F\u751F\u90A3\u9636\u6BB5\u4E3A\u51C6\uFF09\u3002 */\n const mirrorRows = (): PartRow[] => mirroredRows(cfg, phases, nativeIn)\n const rowsOf = (key: PhaseViewKey): PartRow[] =>\n syncAll === true ? mirrorRows() : phaseRows(cfg, phases?.[key] ?? null, key)\n\n // \u5C4F\u853D / \u6062\u590D\u4E00\u4E2A\u6BB5\uFF08blockPatch \u53EA\u52A8\u672C\u9636\u6BB5\u81EA\u5DF1\u7684\u540D\u5355\uFF09\u3002\u5199\u5165\u4E25\u683C\u843D\u5728\u5F53\u524D\n // \u7F16\u8F91\u76EE\u6807\u7684\u8349\u7A3F\u91CC \u2014\u2014 \u9884\u8BBE\u4E4B\u95F4\u4E92\u76F8\u72EC\u7ACB\uFF1A\u5728 A \u9884\u8BBE\u91CC\u7684\u4EFB\u4F55\u6539\u52A8\u5BF9 B \u9884\u8BBE\u4E0E\n // \u5168\u5C40\u9ED8\u8BA4\u96F6\u5F71\u54CD\u3002\n const applyBlock = (key: PhaseViewKey, name: string, blocked: boolean): void => {\n const patch = blockPatch(cfg, key, name, blocked)\n for (const [field, value] of Object.entries(patch)) {\n write(field as 'sections' | 'sectionsBootstrap' | 'sectionsCompaction', value)\n }\n }\n\n /** \u4E09\u6001\u540C\u6B65\u843D\u76D8\uFF1A\u5E76\u96C6\u884C\u96C6\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\uFF09\u2014\u2014 \u9010\u9636\u6BB5\n * \u5404\u5199\u4E00\u6B21\u4F1A\u4E92\u76F8\u8986\u76D6\uFF08edit \u5BF9 inject \u662F\u6574\u4F53\u66FF\u6362\uFF09\uFF0C\u5FC5\u987B\u4E00\u6B21\u5199\u5168\u3002 */\n const persistMirror = (rows: PartRow[]): void => {\n if (!mirrorReady()) {\n setNotice(t('syncNotReady'))\n return\n }\n write('inject', mirrorPhaseInjectEntries(cfg, rows, nativeIn))\n const denied = mirroredDeniedLists(rows)\n write('sections', denied.sections)\n write('sectionsBootstrap', denied.sectionsBootstrap)\n write('sectionsCompaction', denied.sectionsCompaction)\n }\n\n // \u8BE5\u9636\u6BB5\u4E2D\u67D0\u540D\u5B57\u662F\u5426\u5728\u8BE5\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\u91CC\uFF08\u5224\u65AD\u52A0\u5165\u662F\u300C\u89E3\u9664\u5C4F\u853D\u300D\u8FD8\u662F\u300C\u51ED\u7A7A\u6CE8\u5165\u300D\uFF09\u3002\n const inBaseOf = (key: PhaseViewKey, name: string): boolean => nativeIn(key, name) === true\n\n // \u6301\u4E45\u5316\u4E00\u4E2A\u9636\u6BB5\u7684\u6709\u5E8F\u5217\u8868\uFF08\u5199\u56DE inject\uFF09\uFF1A\u6BCF\u884C\u4E00\u6761\u6CE8\u5165\u9879\u3001order \u4E3A\u8FDE\u7EED\u6574\u6570\uFF1B\n // \u7CFB\u7EDF\u884C\u7A7A\u6587\u672C\uFF08\u4EC5 order \u8986\u76D6\uFF09\uFF0Ccustom \u884C\u4FDD\u7559\u6587\u672C\uFF1B\u5176\u5B83\u9636\u6BB5\u7684\u6CE8\u5165\u9879\u539F\u6837\u4FDD\u7559\u3002\n const persistPhase = (key: PhaseViewKey, rows: PartRow[]): void => {\n write('inject', phaseInjectEntries(cfg, key, rows))\n }\n\n /** \u6301\u4E45\u5316\u4E00\u4EFD\u6709\u5E8F\u884C\u96C6\uFF1A\u4E09\u6001\u540C\u6B65 = \u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF0C\u5426\u5219\u53EA\u5199\u5F53\u524D\u9636\u6BB5\u3002 */\n const persistRows = (key: PhaseViewKey, rows: PartRow[]): void => {\n if (syncAll === true) persistMirror(rows)\n else persistPhase(key, rows)\n }\n\n const toggleBlocked = (key: PhaseViewKey, name: string): void => {\n if (syncAll === true) {\n const rows = rowsOf(key)\n const row = rows.find((item) => item.name === name)\n if (row === undefined) return\n persistMirror(rows.map((item) => (item.name === name ? { ...item, blocked: !item.blocked } : item)))\n return\n }\n applyBlock(key, name, !deniedNames(cfg, key).includes(name))\n }\n\n // \u4E0A\u79FB/\u4E0B\u79FB\u4E00\u683C\uFF08\u6570\u7EC4\u4EA4\u6362\u540E\u91CD\u6392\u6574\u4E2A\u9636\u6BB5\uFF09\u3002\n const moveRow = (key: PhaseViewKey, index: number, dir: -1 | 1): void => {\n const rows = rowsOf(key)\n const target = index + dir\n if (target < 0 || target >= rows.length) return\n const next = rows.slice()\n const [item] = next.splice(index, 1)\n next.splice(target, 0, item)\n persistRows(key, next)\n }\n\n // \u4ECE\u8BE5\u9636\u6BB5\u79FB\u9664\u4E00\u4E2A\u6BB5\uFF1A\u5220\u6389\u5B83\u5728\u672C\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF0C\u4EE5\u53CA\u8DE8\u9636\u6BB5\u751F\u6548\uFF08always\uFF09\u7684\n // \u6761\u76EE \u2014\u2014 \u9884\u8BBE\u5E94\u7528 / \u5BFC\u5165\u4EA7\u751F\u7684\u81EA\u5B9A\u4E49\u6BB5\u5C31\u662F always\u3002\u968F\u540E\u89E3\u9664\u8BE5\u9636\u6BB5\u5C4F\u853D\u3002\n const removeFromPart = (key: PhaseViewKey, name: string): void => {\n if (syncAll === true) {\n persistMirror(rowsOf(key).filter((row) => row.name !== name))\n return\n }\n const phaseOfItem = injectPhaseOf(key)\n const inject = (cfg.inject ?? []).filter((x) => {\n if (x.name !== name) return true\n const itemPhase = x.phase ?? 'always'\n return !(itemPhase === phaseOfItem || itemPhase === 'always')\n })\n write('inject', inject)\n applyBlock(key, name, false)\n }\n\n // \u6587\u672C\u7F16\u8F91\u6309\u9636\u6BB5\u751F\u6548\uFF1A\u7F16\u8F91\u6001\u7684\u952E\u662F\u300C\u9636\u6BB5 + \u6BB5\u540D\u300D\u3002\u5199\u5165\u8D70 persistPhase\n //\uFF08\u672C\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\u5E26 text\uFF09\uFF0C\u7EDD\u4E0D\u78B0\u5168\u5C40 replace \u5B57\u5178\u3002\n const startReplace = (key: PhaseViewKey, row: PartRow): void => {\n setEditing(editKey(key, row.name))\n setDraft(row.override || row.text)\n }\n const commitReplace = (key: PhaseViewKey, row: PartRow): void => {\n const patchRow = (r: PartRow): PartRow => (r.name !== row.name ? r : { ...r, override: draft, text: draft })\n // \u4E09\u6001\u540C\u6B65\uFF1A\u66FF\u6362\u6587\u672C\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08\u540C\u540D\u884C = \u540C\u4E00\u4EFD\u6587\u672C\uFF09\u3002\n persistRows(key, rowsOf(key).map(patchRow))\n setEditing(null)\n }\n const restoreReplace = (key: PhaseViewKey, row: PartRow): void => {\n const next = rowsOf(key).map((r) =>\n r.name !== row.name ? r : { ...r, override: '', text: r.custom ? r.text : '' },\n )\n persistRows(key, next)\n // \u9057\u7559\u7684\u5168\u5C40\u66FF\u6362\u6761\u76EE\uFF08\u65E7\u7248 UI \u7684\u4EA7\u7269\uFF09\uFF1A\u53EA\u5728\u672C\u90E8\u5206\u8FD8\u539F\u65F6\u4E00\u5E76\u6E05\u9664\u3002\n if (!row.custom && Object.hasOwn(cfg.replace ?? {}, row.name)) {\n const rest = { ...(cfg.replace ?? {}) }\n delete rest[row.name]\n write('replace', rest)\n }\n }\n\n const addSection = (name: string, text: string, phase: PhaseViewKey): void => {\n if (syncAll === true) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u65B0\u6BB5\u4E00\u6B21\u5EFA\u8FDB\u4E09\u4E2A\u9636\u6BB5\uFF08\u5E76\u96C6\u884C\u96C6\u5C3E\u90E8\uFF0C\u5E26\u81EA\u64B0\u6B63\u6587\uFF09\u3002\n persistMirror([...rowsOf(phase), { name, text, replaced: false, custom: true, override: text, blocked: false }])\n return\n }\n const inject = (cfg.inject ?? []).slice()\n inject.push({ name, order: 120 + inject.length, text, phase, custom: true })\n write('inject', inject)\n }\n\n // \u4ECE\u300C\u5168\u90E8\u300D\u6C60\u628A\u4E00\u4E2A\u6BB5\u52A0\u5165\u67D0\u9636\u6BB5\uFF08\u62D6\u52A8\u6216\u70B9\u6309\u6C60\u91CC\u7684\u5C0F\u6309\u94AE\uFF09\u3002\u8BE5\u9636\u6BB5\u5DF2\u6709\u7684\n // \u6BB5\u53EA\u662F\u79FB\u5230\u672B\u5C3E\uFF1B\u65B0\u6BB5\u5E26\u4E0A\u6C60\u91CC\u7684\u539F\u6587\uFF08\u6CE8\u5165\u6761\u76EE\u5E26\u6587\u672C\uFF0C\u670D\u52A1\u7AEF\u624D\u4F1A\u628A\u5B83\u771F\u6B63\n // \u5EFA\u51FA\u6765\uFF09\u3002\u52A8\u6001\u6BB5\u6CA1\u6709\u53EF\u5E26\u7684\u539F\u6587\uFF0C\u7ED9\u51FA\u8BF4\u660E\u3002`copiedFrom` \u975E\u7A7A = \u4ECE\u522B\u7684\u9636\u6BB5\n // \u590D\u5236\u8FC7\u6765\u7684\uFF0C\u7ED9\u4E00\u6761\u300C\u5DF2\u590D\u5236\u300D\u53CD\u9988\u3002\n const addFromPool = (key: PhaseViewKey, name: string, text: string, copiedFrom?: string): void => {\n if (text === '' || text.startsWith('<')) {\n setNotice(t('sectionDynamicNoAdd', { name }))\n return\n }\n // \u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u542F\u65F6\uFF0C\u6C60\u91CC\u7684\u6BB5\u4F18\u5148\u7528\u8BD1\u672C\u6587\u672C \u2014\u2014 \u4E00\u952E\u628A\u6CA1\u8FDB\u8FC7\u5B9A\u5236\u9762\u677F\u7684\n // \u6BB5\uFF08\u5982 agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684 tool:subagent\uFF09\u63A5\u7BA1\u6210\u4E2D\u6587\u3002\n const body = poolText === undefined ? text : poolText(name, text)\n setNotice(null)\n const rows = rowsOf(key)\n const existing = rows.find((row) => row.name === name)\n // \u4E09\u6001\u540C\u6B65\u4E0B\u300C\u52A0\u5165\u300D= \u4E09\u6001\u90FD\u51FA\u73B0\u4E14\u90FD\u5F00\u542F\uFF08\u5E76\u96C6\u884C\u96C6\u91CC\u91CD\u6392\u5230\u5C3E\u90E8 / \u8FFD\u52A0\u65B0\u884C\uFF09\u3002\n const next = existing !== undefined\n ? [...rows.filter((row) => row.name !== name), syncAll === true ? { ...existing, blocked: false } : existing]\n : [...rows, {\n name,\n text: '',\n replaced: Object.hasOwn(cfg.replace ?? {}, name),\n custom: false,\n override: body,\n blocked: false,\n }]\n if (syncAll !== true && existing === undefined && inBaseOf(key, name) && deniedNames(cfg, key).includes(name)) {\n applyBlock(key, name, false)\n }\n persistRows(key, next)\n if (copiedFrom !== undefined) setNotice(t('sectionCopied', { name, to: stageLabel(key), from: copiedFrom }))\n }\n\n // \u2500\u2500 \u62D6\u62FD\u843D\u5730\uFF08\u624B\u52BF\u5B9A\u4E49\u89C1 dnd.ts\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u4ECE\u672C\u9636\u6BB5\u62FF\u6389\u4E00\u6BB5\uFF1A\u6CE8\u5165\u8FDB\u6765\u7684\u64A4\u9500\u6CE8\u5165\uFF0C\u539F\u751F\u6BB5\u5219\u5C4F\u853D\u6389\uFF08\u7B49\u4EF7\u4E8E\u53D6\u6D88\u52FE\u9009\uFF09\u3002 */\n const removeFromPhase = (name: string): void => {\n const rows = rowsOf(phase)\n const row = rows.find((item) => item.name === name)\n if (row === undefined) return\n if (syncAll === true) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u539F\u751F\u6BB5\u4E09\u6001\u4E00\u8D77\u5C4F\u853D\uFF1B\u53EA\u9760\u6CE8\u5165\u5B58\u5728\u7684\u6BB5\u4E09\u6001\u4E00\u8D77\u64A4\u9500\u6CE8\u5165\u3002\n const native = PART_ORDER.some((key) => nativeIn(key, name) === true)\n persistMirror(row.custom || !native\n ? rows.filter((item) => item.name !== name)\n : rows.map((item) => (item.name === name ? { ...item, blocked: true } : item)))\n } else if (row.custom || row.override !== '' || injectedNames.has(name)) {\n removeFromPart(phase, name)\n } else {\n applyBlock(phase, name, true)\n }\n setNotice(t('sectionRemoved', { name, from: stageLabel(phase) }))\n }\n\n /** \u884C\u4E0A\u6295\u653E\uFF1A\u540C\u9636\u6BB5 = \u6392\u5E8F\uFF1B\u522B\u7684\u9636\u6BB5 / \u6C60\u91CC\u6765\u7684 = \u590D\u5236\u8FDB\u672C\u9636\u6BB5\uFF08\u6E90\u4E0D\u52A8\uFF09\u3002 */\n const dropOnRow = (event: ReactDragEvent, target: PartRow): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n if (payload.name === target.name) return\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\n const pos = event.clientY < rect.top + rect.height / 2 ? 'above' : 'below'\n if (payload.from === phase) {\n const next = reorderInsert(rowsOf(phase), payload.name, target.name, pos)\n if (next !== null) { persistRows(phase, next); setNotice(null) }\n return\n }\n addFromPool(phase, payload.name, payload.text ?? '', payload.from === 'pool' ? undefined : stageLabel(payload.from))\n }\n\n /** \u5217\u8868\u7A7A\u767D\u5904\u6295\u653E\uFF1A\u8FFD\u52A0\u5230\u672C\u9636\u6BB5\u672B\u5C3E\uFF1B\u6C60\u91CC\u62D6\u6765\u7684 = \u52A0\u5165\u672C\u9636\u6BB5\u3002 */\n const dropOnList = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n setDropMark(null)\n if (payload.from !== phase) {\n addFromPool(phase, payload.name, payload.text ?? '', payload.from === 'pool' ? undefined : stageLabel(payload.from))\n return\n }\n const list = rowsOf(phase)\n const last = list[list.length - 1]\n if (last === undefined || last.name === payload.name) return\n const next = reorderInsert(list, payload.name, last.name, 'below')\n if (next !== null) persistRows(phase, next)\n }\n\n /** \u6C60\u4E0A\u6295\u653E\uFF1A\u628A\u884C\u4ECE\u672C\u9636\u6BB5\u62FF\u6389\uFF08\u62D6\u56DE\u300C\u5168\u90E8\u300D\u7684\u624B\u52BF\uFF09\u3002 */\n const dropOnPool = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n if (payload.from !== phase) return\n removeFromPhase(payload.name)\n }\n\n // \u5934\u90E8\u9636\u6BB5 Tab \u4E0A\u7684\u6295\u653E\uFF1A\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u6362 Tab / \u6362\u6A21\u5F0F\u65F6\u65E7\u5217\u8868\u5378\u8F7D\u3001\n // \u65B0\u5217\u8868\u6CE8\u518C \u2014\u2014 \u4EFB\u4F55\u65F6\u523B\u53EA\u6709\u4E00\u4E2A\u5904\u7406\u8005\uFF09\u3002\n useEffect(() => {\n setPhaseDropHandler((key, payload) => {\n if (payload.kind !== 'section' || key === phase) return\n // \u4E09\u6001\u540C\u6B65\uFF1A\u6BB5\u5DF2\u7ECF\u5728\u4E09\u4E2A\u9636\u6BB5\u91CC\u4E86\uFF0C\u62D6\u5230\u522B\u7684\u9636\u6BB5 Tab \u4E0D\u518D\u590D\u5236\uFF08\u53EA\u6709\u6C60\u91CC\u6765\u7684\u8981\u52A0\u5165\uFF09\u3002\n if (syncAll === true && payload.from !== 'pool') return\n addFromPool(key, payload.name, payload.text ?? '', stageLabel(phase))\n })\n return () => setPhaseDropHandler(null)\n })\n\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n\n // \u8BE5\u9636\u6BB5\u7684\u300C\u6BB5\u7EA7\u5B9A\u5236\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\u300D\u8B66\u793A\uFF08forceSections \u5173\u95ED\u6216\u5931\u6548\u65F6\uFF09\u3002\n const partNote = (key: PhaseViewKey): ReactElement | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n if (cfg.forceSections !== false) return null\n if (view.takenOverBy !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsTakenOver', { name: view.takenOverBy }))\n }\n const lost = view.lostSections\n if (lost !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsLost', { emitted: lost.emitted, survived: lost.survived }))\n }\n return null\n }\n\n const isEditing = (key: PhaseViewKey, row: PartRow): boolean => editing === editKey(key, row.name)\n\n const renderRow = (key: PhaseViewKey, row: PartRow, index: number, total: number): ReactElement | null => {\n if (!rowVisible(row)) return null\n const mark = dropMark !== null && dropMark.startsWith(`${row.name}:`) ? dropMark.slice(row.name.length + 1) : null\n return h('div', {\n key: row.name,\n style: {\n ...s.row,\n ...(row.blocked ? s.rowBlocked : {}),\n ...(mark === 'above' ? s.dropAbove : {}),\n ...(mark === 'below' ? s.dropBelow : {}),\n ...(dragName === row.name ? s.dragging : {}),\n },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'section')) return\n event.preventDefault()\n event.stopPropagation()\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\n setDropMark(`${row.name}:${event.clientY < rect.top + rect.height / 2 ? 'above' : 'below'}`)\n },\n onDrop: (event: ReactDragEvent) => dropOnRow(event, row),\n }, [\n // \u62D6\u62FD\u6293\u624B\uFF1A\u6574\u884C draggable \u4F1A\u628A\u52FE\u9009\u6846 / \u6587\u672C\u57DF\u7684\u9009\u62E9\u624B\u52BF\u4E00\u8D77\u5403\u6389\u3002\n h('span', {\n draggable: true,\n title: t('drag'),\n style: s.dragHandle,\n onDragStart: (event: ReactDragEvent) => {\n setDragName(row.name)\n beginDrag(event, { kind: 'section', name: row.name, from: key, text: row.override || row.text })\n },\n onDragEnd: () => { setDragName(null); setDropMark(null); finishDrag() },\n }, '\u283F'),\n h('input', {\n type: 'checkbox',\n checked: !row.blocked,\n onChange: () => toggleBlocked(key, row.name),\n title: row.blocked ? t('blockedOn') : t('blockedOff'),\n style: { margin: 0, cursor: 'pointer', flex: 'none' },\n }),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n h('span', { style: s.orderTag }, '#' + index),\n h('span', { style: row.custom ? s.badgeCustom : s.badgeSystem }, row.custom ? t('manual') : t('system')),\n // \u4F1A\u8BDD\u7EA7\uFF1A\u53EA\u5728 agent \u81EA\u5DF1\u7684\u4F5C\u7528\u57DF\u91CC\u6CE8\u518C\uFF08\u9884\u8BBE scope \u7684\u6CE8\u518C\u8868\u6CA1\u6709\u5B83\uFF0C\n // \u4F46\u771F\u5B9E\u4F1A\u8BDD\u88C5\u914D\u4E00\u5B9A\u6709\uFF09\u2014\u2014 \u9884\u89C8\u5DF2\u628A\u5B83\u5E76\u8FDB\u5217\u8868\uFF0C\u8FD9\u91CC\u6807\u51FA\u6765\u514D\u5F97\u8BEF\u4F1A\u3002\n agentScoped.has(row.name) ? h('span', { style: s.badgeSystem, title: t('agentScopedHint') }, t('agentScoped')) : null,\n row.replaced ? h('span', { style: s.badgeReplaced }, t('replaced')) : null,\n row.blocked ? h('span', { style: s.badgeBlocked }, t('blockedOn')) : null,\n ]),\n isEditing(key, row)\n ? h('div', { style: s.editBox }, [\n h('textarea', { style: s.editInput, value: draft, onChange: (e: ChangeEvent<HTMLTextAreaElement>) => setDraft(e.target.value), rows: 3 }),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => commitReplace(key, row) }, t('save')),\n h('button', { style: s.mini, onClick: () => setDraft('') }, t('clearInput')),\n !row.custom && (row.override || Object.hasOwn(cfg.replace ?? {}, row.name))\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n ]),\n ])\n : h('div', { style: s.preview }, String(row.override || row.text || '').slice(0, 140) || (row.custom ? t('empty') : t('dynamic'))),\n ]),\n h('div', { style: s.arrowCol }, [\n h('button', { style: s.arrow, disabled: index === 0, onClick: () => moveRow(key, index, -1), title: t('moveUp') }, '\u2191'),\n h('button', { style: s.arrow, disabled: index === total - 1, onClick: () => moveRow(key, index, 1), title: t('moveDown') }, '\u2193'),\n ]),\n isEditing(key, row) ? null : h('button', { style: s.mini, onClick: () => startReplace(key, row) }, t('replace')),\n !isEditing(key, row) && !row.custom && (row.override || Object.hasOwn(cfg.replace ?? {}, row.name))\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n row.custom ? h('button', { style: s.mini, onClick: () => removeFromPart(key, row.name), title: t('delete') }, t('delete')) : null,\n ])\n }\n\n // \u5F53\u524D\u9636\u6BB5\u7684\u884C + \u4E09\u6001\u8FC7\u6EE4\u3002\n const rows = rowsOf(phase)\n /** \u4E09\u6001\u540C\u6B65\u4E0B\u5EFA\u4E0D\u5230\u5176\u5B83\u9636\u6BB5\u7684\u52A8\u6001\u6BB5\uFF08\u884C\u96C6\u91CC\u663E\u793A\u3001\u88C5\u914D\u91CC\u6CA1\u6709\uFF09\uFF1A\u7ED9\u51FA\u8BF4\u660E\u3002 */\n const mirrorSkipped = syncAll === true && mirrorReady() ? mirrorSkippedNames(rows, nativeIn) : []\n /** \u672C\u9636\u6BB5\u6709\u6CE8\u5165\u6761\u76EE\uFF08= \u88AB\u663E\u5F0F\u52A0\u8FDB\u6765\u8FC7\uFF09\u7684\u6BB5\u540D\uFF1A\u62D6\u56DE\u6C60\u65F6\u7528\u6765\u81EA\u52A8\u9009\u300C\u64A4\u9500\u6CE8\u5165\u300D\u8FD8\u662F\u300C\u5C4F\u853D\u300D\u3002 */\n const injectedNames = injectedAt(cfg, phase).names\n /** \u53EA\u5728 agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684\u6BB5\u540D\uFF08\u9884\u89C8\u628A\u5B83\u4EEC\u5E76\u8FDB\u6765\u4E86\uFF0C\u5E26 scope \u6807\u8BB0\uFF09\uFF1A\u884C\u4E0A\u6807\u300C\u4F1A\u8BDD\u7EA7\u300D\u3002 */\n const agentScoped = new Set<string>()\n for (const view of Object.values(phases ?? {})) {\n for (const section of view?.baseSections ?? []) {\n if (section.scope === 'agent') agentScoped.add(section.name)\n }\n }\n const onCount = rows.filter((row) => !row.blocked).length\n const offCount = rows.length - onCount\n const rowVisible = (row: PartRow): boolean =>\n filter === 'all' || (filter === 'on' ? !row.blocked : row.blocked)\n\n const poolSections = inv?.sections ?? []\n\n return h('div', { style: s.colLeft }, [\n h('div', {\n ref: scrollRef,\n style: { ...s.colScroll, ...(dropMark === 'list' ? s.dropZone : {}) },\n // \u5217\u8868\u7A7A\u767D\u5904 = \u300C\u672C\u9636\u6BB5\u672B\u5C3E\u300D\u7684\u6295\u653E\u70B9\uFF08\u6C60\u91CC\u62D6\u8FDB\u6765\u7684\u6BB5\u4E5F\u4ECE\u8FD9\u91CC\u8FDB\uFF09\u3002\n onDragOver: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section' || payload.from === phase) return\n event.preventDefault()\n setDropMark('list')\n },\n onDrop: dropOnList,\n }, [\n notice ? h('div', { style: s.noticeWarn }, notice) : null,\n mirrorSkipped.length > 0\n ? h('div', { style: s.noticeWarn }, t('syncSkippedDynamic', { names: mirrorSkipped.join('\u3001') }))\n : null,\n partNote(phase),\n rows.map((row, i) => renderRow(phase, row, i, rows.length)),\n rows.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n addOpen\n ? h(InjectForm, {\n onAdd: (name, text) => { addSection(name, text, injectPhaseOf(phase)); setAddOpen(false) },\n phaseLabel: stageLabel(phase),\n t,\n })\n : null,\n // \u672C\u7CFB\u7EDF\u5168\u90E8\u63D0\u793A\u8BCD\uFF1A\u8DE8\u9884\u8BBE\u7D2F\u79EF\u7684\u53EA\u8BFB\u6C60\uFF08\u6298\u53E0\u533A\uFF09\u3002\u52A0\u5165\u67D0\u4E2A\u9636\u6BB5\u9760\u62D6\u62FD\uFF1A\n // \u628A\u884C\u62D6\u8FDB\u4E0A\u9762\u7684\u9636\u6BB5\u5217\u8868 = \u52A0\u5165\u672C\u9636\u6BB5\uFF0C\u62D6\u5230\u5934\u90E8\u9636\u6BB5 Tab = \u52A0\u5165\u90A3\u4E2A\u9636\u6BB5\n // \uFF08\u884C\u4E0A\u4E0D\u518D\u653E\u4E09\u4E2A\u6309\u94AE \u2014\u2014 \u62D6\u62FD\u662F\u552F\u4E00\u8DEF\u5F84\uFF0C\u6C60\u540C\u65F6\u662F\u300C\u4ECE\u9636\u6BB5\u62FF\u6389\u300D\u7684\u6295\u653E\u70B9\uFF09\u3002\n h('details', {\n style: { ...s.injectBox, ...(dropMark === 'pool' ? s.dropZoneActive : {}) },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'section')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark('pool')\n },\n onDrop: dropOnPool,\n }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } },\n `${t('allSectionsTitle')} (${poolSections.length})`),\n h('div', { style: { ...s.muted, marginBottom: 4 } }, t('sectionsFourHint')),\n poolSections.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n poolSections.map((sec) => h('div', {\n key: sec.name,\n style: { ...s.row, opacity: 0.92 },\n draggable: true,\n title: t('drag'),\n onDragStart: (event: ReactDragEvent) => beginDrag(event, { kind: 'section', name: sec.name, from: 'pool', text: sec.text ?? '' }),\n onDragEnd: finishDrag,\n }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, sec.name)),\n h('div', { style: s.preview }, String(sec.text ?? '').slice(0, 140) || t('dynamic')),\n ]),\n ])),\n ]),\n // \u300C+ \u6CE8\u5165\u300D\u5165\u53E3\u653E\u5728\u6EDA\u52A8\u533A\u672B\u5C3E\uFF1A\u65B0\u6BB5\u901A\u5E38\u8FFD\u52A0\u5728\u5F53\u524D\u9636\u6BB5\u5217\u8868\u5C3E\u90E8\u3002\n h('div', { style: { ...s.injectRow, marginTop: 8 } }, [\n h('button', { style: s.mini, onClick: () => setAddOpen(!addOpen), title: t('injectNew') },\n addOpen ? `\u00D7 ${t('clearInput')}` : `+ ${t('injectNew')}`),\n ]),\n ]),\n // \u5DE6\u680F\u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 / \u5DF2\u505C\u7528\uFF09\uFF0C\u53EA\u7EDF\u8BA1\u5F53\u524D\u9636\u6BB5\u3002\n h('div', { style: s.colFoot }, [\n h('div', { style: s.seg }, [\n h('button', { style: filter === 'all' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('all') },\n `${t('filterAll')} ${rows.length}`),\n h('button', { style: filter === 'on' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('on') },\n `${t('filterOn')} ${onCount}`),\n h('button', { style: filter === 'off' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('off') },\n `${t('filterOff')} ${offCount}`),\n ]),\n ]),\n ])\n}\n\n/** \u6CE8\u5165\u65B0\u6BB5\u8868\u5355\uFF1A\u300C+ \u6CE8\u5165\u300D\u5C55\u5F00\uFF0C\u9636\u6BB5\u9501\u5B9A\u4E3A\u5F53\u524D Tab \u7684\u9636\u6BB5\u3002 */\nfunction InjectForm({ onAdd, phaseLabel, t }: {\n onAdd: (name: string, text: string) => void\n phaseLabel: string\n t: Translate\n}): ReactElement {\n const [name, setName] = useState('')\n const [text, setText] = useState('')\n const submit = (): void => {\n if (!name.trim()) return\n onAdd(name.trim(), text)\n setName(''); setText('')\n }\n return h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, width: '30%' }, placeholder: t('name'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('input', { style: { ...s.input, flex: 1 }, placeholder: `${t('text')}\uFF08${phaseLabel}\uFF09`, value: text, onChange: (e: ChangeEvent<HTMLInputElement>) => setText(e.target.value) }),\n h('button', { style: s.mini, onClick: submit }, t('add')),\n ])\n}\n", "/**\r\n * drag-scroll \u2014\u2014 \u62D6\u62FD\u65F6\u8D34\u8FB9\u81EA\u52A8\u6EDA\u52A8\u3002\r\n *\r\n * \u5217\u8868\u6BD4\u89C6\u53E3\u957F\u7684\u65F6\u5019\uFF0C\u9760\u624B\u62D6\u6839\u672C\u5230\u4E0D\u4E86\u89C6\u53E3\u5916\u7684\u6295\u653E\u4F4D\u7F6E\uFF08\u628A\u884C\u62D6\u5230\u4E0A\u9762\u7684\u7B2C\r\n * 3 \u4E2A\u4F4D\u7F6E\u3001\u6216\u4ECE\u5E95\u90E8\u300C\u5168\u90E8\u300D\u6C60\u62D6\u5230\u9876\u90E8\uFF0C\u90FD\u8981\u5148\u505C\u4E0B\u6765\u6EDA\u4E00\u6EDA \u2014\u2014 \u800C\u62D6\u62FD\u4E2D\r\n * \u662F\u6EDA\u4E0D\u4E86\u7684\uFF09\u3002\u8FD9\u91CC\u5728\u6307\u9488\u8FDB\u5165\u5BB9\u5668\u4E0A/\u4E0B\u8FB9\u7F18\u5E26\u65F6\u6301\u7EED\u6EDA\u52A8\uFF1A\u8D8A\u9760\u8FB9\u8D8A\u5FEB\uFF0C\u6307\u9488\r\n * \u56DE\u5230\u4E2D\u95F4\u5C31\u505C\u3002\r\n *\r\n * \u4E24\u4E2A\u5B9E\u73B0\u8981\u70B9\uFF1A\r\n * - HTML5 \u62D6\u62FD\u53EA\u5728\u6307\u9488\u79FB\u52A8\u65F6\u7ED9 `dragover`\uFF0C\u9760\u5B83\u4E00\u6B21\u6EDA\u4E00\u5C4F\u4F1A\u4E00\u987F\u4E00\u987F\uFF0C\u6240\u4EE5\r\n * \u8FB9\u7F18\u5185\u6539\u7528 requestAnimationFrame \u9010\u5E27\u6EDA\uFF08\u6BCF\u5E27\u6700\u591A MAX_STEP \u50CF\u7D20\uFF09\uFF1B\r\n * - \u884C\u4E0A\u7684\u6295\u653E\u5904\u7406\u4F1A\u5728\u5192\u6CE1\u9636\u6BB5 `stopPropagation`\uFF0C\u6240\u4EE5\u8FD9\u91CC\u7528**\u6355\u83B7**\u9636\u6BB5\r\n * \u7684\u539F\u751F\u76D1\u542C\u6302\u5728\u6EDA\u52A8\u5BB9\u5668\u4E0A \u2014\u2014 \u6355\u83B7\u5148\u4E8E\u5192\u6CE1\u6267\u884C\uFF0C\u4E0D\u53D7\u884C\u5904\u7406\u5F71\u54CD\u3002\r\n */\r\nimport { useEffect, type RefObject } from 'react'\r\nimport { isPanelDrag } from './dnd.ts'\r\n\r\n/** \u8FDB\u5165\u8FD9\u4E2A\u50CF\u7D20\u5E26\u5F00\u59CB\u6EDA\u3002 */\r\nconst EDGE = 56\r\n/** \u6BCF\u5E27\u6700\u5927\u6EDA\u52A8\u50CF\u7D20\uFF08\u8D8A\u9760\u8FB9\u8D8A\u63A5\u8FD1\u5B83\uFF09\u3002 */\r\nconst MAX_STEP = 18\r\n\r\n/**\r\n * \u7ED9\u6EDA\u52A8\u5BB9\u5668\u6302\u4E0A\u300C\u62D6\u62FD\u8D34\u8FB9\u81EA\u52A8\u6EDA\u300D\u3002\r\n *\r\n * \u4F20\u5165\u7684 ref \u6307\u5411\u771F\u6B63 overflow-y:auto \u7684\u90A3\u4E00\u5C42\uFF08\u5217\u8868 + \u6C60\u90FD\u5728\u91CC\u9762\uFF0C\u6240\u4EE5\u6EDA\u52A8\r\n * \u5B83\u5C31\u80FD\u628A\u4EFB\u4E00\u6295\u653E\u4F4D\u7F6E\u5E26\u8FDB\u89C6\u53E3\uFF09\u3002\u53EA\u5728\u6307\u9488\u5904\u4E8E\u5BB9\u5668\u5782\u76F4\u8303\u56F4\u5185\u4E14\u8D34\u7740\u4E0A/\u4E0B\u8FB9\r\n * \u7F18\u65F6\u6EDA\uFF0C\u6A2A\u5411\u4E0D\u53C2\u4E0E\u3002\r\n */\r\nexport function useDragAutoScroll(ref: RefObject<HTMLElement | null>): void {\r\n useEffect(() => {\r\n const el = ref.current\r\n if (el === null) return undefined\r\n\r\n let frame = 0\r\n let step = 0\r\n let pendingY: number | null = null\r\n\r\n const stopScroll = (): void => {\r\n step = 0\r\n pendingY = null\r\n if (frame !== 0) {\r\n cancelAnimationFrame(frame)\r\n frame = 0\r\n }\r\n }\r\n\r\n const stepFrame = (): void => {\r\n frame = 0\r\n if (step === 0) return\r\n const before = el.scrollTop\r\n el.scrollTop += step\r\n // \u6EDA\u5230\u5934\uFF08\u6D4F\u89C8\u5668\u628A scrollTop \u5939\u4F4F\uFF09\u5C31\u505C\uFF0C\u522B\u7A7A\u8F6C rAF\u3002\r\n if (el.scrollTop === before) {\r\n step = 0\r\n return\r\n }\r\n frame = requestAnimationFrame(stepFrame)\r\n }\r\n\r\n const measure = (clientY: number): void => {\r\n const rect = el.getBoundingClientRect()\r\n const fromTop = clientY - rect.top\r\n const fromBottom = rect.bottom - clientY\r\n step = fromTop < EDGE\r\n ? -Math.ceil(((EDGE - fromTop) / EDGE) * MAX_STEP)\r\n : fromBottom < EDGE\r\n ? Math.ceil(((EDGE - fromBottom) / EDGE) * MAX_STEP)\r\n : 0\r\n if (step === 0) {\r\n stopScroll()\r\n return\r\n }\r\n if (frame === 0) frame = requestAnimationFrame(stepFrame)\r\n }\r\n\r\n const onDragOver = (event: DragEvent): void => {\r\n // \u53EA\u8BA4\u672C\u9762\u677F\u81EA\u5DF1\u7684\u62D6\u62FD\uFF1A\u5916\u90E8\u62D6\u5165\uFF08\u6BD4\u5982\u5F80\u6280\u80FD\u9762\u677F\u4E22\u6587\u4EF6\uFF09\u4E0D\u6EDA\u3002\r\n if (!isPanelDrag(event)) {\r\n stopScroll()\r\n return\r\n }\r\n pendingY = event.clientY\r\n measure(event.clientY)\r\n }\r\n\r\n // \u6307\u9488\u53EA\u662F\u4ECE\u5BB9\u5668\u632A\u8FDB\u5B50\u5143\u7D20\u65F6\u4E5F\u4F1A\u6765\u4E00\u6761 dragleave\uFF0C\u522B\u628A\u5B83\u5F53\u6210\u300C\u79BB\u5F00\u300D\u3002\r\n const onDragLeave = (event: DragEvent): void => {\r\n const to = event.relatedTarget as Node | null\r\n if (to !== null && el.contains(to)) return\r\n stopScroll()\r\n }\r\n\r\n const onEnd = (): void => stopScroll()\r\n\r\n el.addEventListener('dragover', onDragOver, true)\r\n el.addEventListener('dragleave', onDragLeave, true)\r\n el.addEventListener('drop', onEnd, true)\r\n // dragend \u53EA\u53D1\u7ED9\u62D6\u8D77\u5143\u7D20\uFF08\u53EF\u80FD\u5728\u522B\u7684\u5BB9\u5668\u91CC\uFF09\uFF0C\u6302 window \u6700\u7A33\u3002\r\n window.addEventListener('dragend', onEnd)\r\n // \u6307\u9488\u5728\u8FB9\u7F18\u5E26\u91CC\u9759\u6B62\u65F6\u6D4F\u89C8\u5668\u4ECD\u4F1A\u7ED9\u96F6\u661F\u7684 dragover\uFF1B\u82E5\u4E00\u6B21\u90FD\u6CA1\u6709\uFF08\u79BB\u5F00\r\n // \u5BB9\u5668\u524D\u7684\u6700\u540E\u4E00\u6B21\uFF09\uFF0C\u4E0B\u4E00\u6B21\u62D6\u62FD\u5F00\u59CB\u524D\u628A\u72B6\u6001\u6E05\u5E72\u51C0\u3002\r\n window.addEventListener('dragstart', onEnd)\r\n\r\n return () => {\r\n stopScroll()\r\n el.removeEventListener('dragover', onDragOver, true)\r\n el.removeEventListener('dragleave', onDragLeave, true)\r\n el.removeEventListener('drop', onEnd, true)\r\n window.removeEventListener('dragend', onEnd)\r\n window.removeEventListener('dragstart', onEnd)\r\n // pendingY \u53EA\u5728\u62D6\u62FD\u671F\u95F4\u6709\u610F\u4E49\uFF1B\u9000\u51FA\u65F6\u6E05\u6389\uFF0C\u907F\u514D\u9648\u65E7\u5F15\u7528\u3002\r\n pendingY = null\r\n }\r\n }, [ref])\r\n}\r\n", "/**\n * ToolsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u5DE6\u680F\uFF08\u5DE5\u5177\u6A21\u5F0F\uFF09\u3002\n *\n * \u9876\u90E8\u4E09\u4E2A\u9636\u6BB5 Tab\uFF08\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF09\uFF0C\u4E0E\u53F3\u680F\u9884\u89C8\u7684\u9636\u6BB5\u6309\u94AE\n * **\u8054\u52A8**\u3002\u6BCF\u4E2A\u9636\u6BB5\u5217\u51FA\u8BE5\u9636\u6BB5\u8FDB\u5165\u8FC7\u6EE4\u7684\u76EE\u5F55 \u222A \u7528\u6237\u52A0\u56DE\u7684\u5DE5\u5177\uFF1A\u52FE\u9009\u6846 =\n * \u8BE5\u9636\u6BB5\u5BF9\u6A21\u578B\u53EF\u89C1\uFF1B\u9690\u85CF\u540E\u4ECD\u5728\u5217\u8868\u53EF\u53CD\u9009\u3002\u4E09\u4EFD\u540D\u5355\u4E92\u4E0D\u7EE7\u627F\u3002\n *\n * \u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 = \u53EF\u89C1 / \u5DF2\u505C\u7528 = \u9690\u85CF\uFF09\uFF0C\u53EA\u7EDF\u8BA1\u5F53\u524D\n * \u9636\u6BB5\u3002\n *\n * \u62D6\u62FD\uFF08\u89C1 dnd.ts\uFF09\uFF1A\u628A\u300C\u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177\u300D\u91CC\u7684\u884C\u62D6\u8FDB\u4E0A\u9762\u7684\u5217\u8868 = \u8BA9\u8BE5\u5DE5\u5177\u5728\u672C\n * \u9636\u6BB5\u51FA\u73B0\uFF08\u5199\u8FDB add \u540D\u5355\u52A0\u56DE\uFF0C\u6216\u4ECE\u9ED1\u540D\u5355\u91CC\u653E\u51FA\u6765\uFF09\uFF1B\u628A\u884C\u62D6\u56DE\u6C60 = \u4ECE\u672C\u9636\u6BB5\u62FF\n * \u6389\uFF08\u64A4\u9500\u52A0\u56DE / \u8FDB\u9ED1\u540D\u5355\uFF09\uFF1B\u628A\u884C\u62D6\u5230\u5934\u90E8\u67D0\u4E2A\u9636\u6BB5 Tab = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u9690\u85CF\n * \u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF0C\u6E90\u9636\u6BB5\u4E0D\u52A8\uFF09\u3002\u70B9\u6309\u8DEF\u5F84\u7167\u65E7\uFF1A\u6C60\u91CC\u6BCF\u884C\u4E09\u4E2A\u5C0F\u6309\u94AE\u4E5F\u80FD\u52A0\u5165\u5BF9\u5E94\n * \u9636\u6BB5 \u2014\u2014 \u6CE8\u518C\u8868\u91CC\u6839\u672C\u6CA1\u6709\u7684\uFF08\u522B\u7684\u9884\u8BBE\u72EC\u6709\uFF09\u52A0\u4E0D\u8FDB\u6765\uFF0C\u754C\u9762\u660E\u786E\u8BF4\u660E\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER, withPhaseAdd, withPhaseExclude } from './presets.ts'\nimport { acceptsDrop, beginDrag, finishDrag, payloadOf, setPhaseDropHandler, type DragPayload } from './dnd.ts'\nimport { useDragAutoScroll } from './drag-scroll.ts'\nimport { s } from './styles.ts'\nimport type { TriState } from './SectionsPane.tsx'\n\n/** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\u3002 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** \u4E00\u6B21\u52A0\u56DE\u64CD\u4F5C\u7684\u53CD\u9988\uFF08ok = \u5DF2\u5199\u5165\uFF0Cwarn = \u4EC0\u4E48\u90FD\u6CA1\u6539\u5E76\u8BF4\u660E\u539F\u56E0\uFF09\u3002 */\ntype Notice = { kind: 'ok' | 'warn'; text: string }\n\nexport function ToolsPane({ cfg, inv, phases, phase, syncAll, t, write }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseViewKey\n /** \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u52FE\u9009\u540E\u9690\u85CF / \u663E\u793A\u4E0E\u52A0\u56DE\u5BF9\u4E09\u4E2A\u9636\u6BB5\u4E00\u8D77\u751F\u6548\uFF08\u53EA\u4F5C\u7528\u4E8E\u540C\u540D\u5DE5\u5177\uFF09\u3002 */\n syncAll?: boolean\n t: Translate\n write: (field: 'sections' | 'replace' | 'inject' | 'tools', value: unknown) => void\n}): ReactElement {\n const [filter, setFilter] = useState<TriState>('all')\n const [notice, setNotice] = useState<Notice | null>(null)\n // \u62D6\u62FD\uFF1A\u6B63\u5728\u62D6\u7684\u5DE5\u5177\u540D\uFF0C\u6295\u653E\u4F4D\u7F6E\u6807\u8BB0\uFF08\u884C\u540D / `list` / `pool`\uFF09\u3002\n const [dragName, setDragName] = useState<string | null>(null)\n const [dropMark, setDropMark] = useState<string | null>(null)\n // \u5217\u8868\u6EDA\u52A8\u5BB9\u5668\uFF1A\u62D6\u5230\u4E0A\u4E0B\u8FB9\u7F18\u65F6\u81EA\u52A8\u6EDA\uFF08\u957F\u5217\u8868\u91CC\u624B\u62D6\u591F\u4E0D\u5230\u89C6\u53E3\u5916\u7684\u4F4D\u7F6E\uFF09\u3002\n const scrollRef = useRef<HTMLDivElement | null>(null)\n useDragAutoScroll(scrollRef)\n\n // \u67D0\u9636\u6BB5\u81EA\u5DF1\u7684\u9ED1\u540D\u5355 / \u52A0\u56DE\u540D\u5355\uFF08\u4E09\u4EFD\u4E92\u4E0D\u7EE7\u627F\uFF09\u3002\n const excludeOf = (key: PhaseViewKey): string[] => {\n const tools = cfg.tools ?? {}\n const list = key === 'bootstrap' ? tools.bootstrap?.exclude : key === 'compaction' ? tools.compaction?.exclude : tools.exclude\n return list ?? []\n }\n const addOf = (key: PhaseViewKey): string[] => {\n const tools = cfg.tools ?? {}\n const list = key === 'bootstrap' ? tools.bootstrap?.add : key === 'compaction' ? tools.compaction?.add : tools.add\n return list ?? []\n }\n // \u4E00\u6B21\u5199\u5165\u540C\u65F6\u843D\u8BE5\u9636\u6BB5\u7684 exclude \u4E0E add\uFF08\u5728\u540C\u4E00\u4EFD tools \u4E0A\u53E0\u5B8C\u518D\u5199\u4E00\u6B21\uFF09\u3002\n const writeLists = (key: PhaseViewKey, exclude: string[], add: string[]): void => {\n write('tools', withPhaseAdd(withPhaseExclude(cfg.tools ?? {}, key, exclude), key, add))\n }\n\n // \u4E09\u6001\u540C\u6B65\u5199\u5165\uFF08syncAll \u5F00\u542F\u65F6\uFF09\uFF1A\u5BF9\u4E09\u4E2A\u9636\u6BB5\u5404\u81EA\u7684 exclude / add \u540D\u5355\u505A\u540C\u4E00\n // \u53D8\u6362\uFF0C\u53E0\u8FDB\u4E00\u4EFD tools \u540E\u4E00\u6B21\u5199\u5165\u3002\u53D8\u6362\u8FD4\u56DE null = \u8BE5\u9636\u6BB5\u65E0\u53EF\u505A\u7684\u6539\u52A8\uFF0C\u8DF3\u8FC7\u3002\n const writeSynced = (\n apply: (key: PhaseViewKey, exclude: string[], add: string[]) => { exclude: string[]; add: string[] } | null,\n ): void => {\n let tools = cfg.tools\n for (const k of PART_ORDER) {\n const next = apply(k, excludeOf(k), addOf(k))\n if (next === null) continue\n tools = withPhaseExclude(withPhaseAdd(tools, k, next.add), k, next.exclude)\n }\n write('tools', tools)\n }\n\n // \u8BE5\u9636\u6BB5\u7684\u88C5\u914D\u76EE\u5F55\uFF08\u8FDB\u5165\u672C\u63D2\u4EF6\u8FC7\u6EE4\u7684\u5DE5\u5177\u539F\u6587\uFF09\u4E0E\u8BE5\u9884\u8BBE\u6CE8\u518C\u8868\uFF08\u80FD\u52A0\u56DE\u7684\u6765\u6E90\uFF09\u3002\n const catalogOf = (key: PhaseViewKey): string[] => (phases?.[key]?.baseTools ?? []).map((tool) => tool.name)\n const isInCatalog = (key: PhaseViewKey, name: string): boolean => catalogOf(key).includes(name)\n // \u6CE8\u518C\u8868\u4E09\u4E2A\u9636\u6BB5\u5171\u4EAB\u540C\u4E00 scope\uFF0C\u53D6\u7B2C\u4E00\u4E2A\u975E\u7A7A\u7684\u5373\u53EF\u3002\n const registry: Set<string> = (() => {\n const list = PART_ORDER.map((key) => phases?.[key]?.registryTools).find((x) => Array.isArray(x) && x.length > 0) ?? []\n return new Set(list)\n })()\n\n // \u628A\u4E00\u4E2A\u5DE5\u5177\u653E\u8FDB\u67D0\u9636\u6BB5\uFF08\u590D\u5236\u8BED\u4E49\uFF0C\u7EDD\u4E0D\u6539\u52A8\u5176\u5B83\u9636\u6BB5\uFF09\uFF1A\u4E0D\u5728\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u5C31\n // \u52A0\u8FDB add \u540D\u5355\uFF1Bhidden \u51B3\u5B9A\u5B83\u5728\u76EE\u6807\u9636\u6BB5\u662F\u53EF\u89C1\u8FD8\u662F\u9690\u85CF\u3002\n const addToPhase = (key: PhaseViewKey, name: string, hidden: boolean): void => {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (!isInCatalog(key, name) && !add.includes(name)) add = [...add, name]\n exclude = hidden\n ? (exclude.includes(name) ? exclude : [...exclude, name])\n : exclude.filter((x) => x !== name)\n writeLists(key, exclude, add)\n }\n\n // \u9636\u6BB5\u5206\u7EC4\u91CC\u7684\u884C = \u8BE5\u9636\u6BB5\u8FDB\u5165\u8FC7\u6EE4\u7684\u76EE\u5F55 \u222A \u5DF2\u52A0\u56DE\uFF08\u4F46\u5C1A\u672A\u51FA\u73B0\u5728\u88C5\u914D\u91CC\uFF09\u7684\u5DE5\u5177\u3002\n const rowsOf = (key: PhaseViewKey): Array<{ name: string; description: string; hidden: boolean; added: boolean }> => {\n const exclude = excludeOf(key)\n const catalog = (phases?.[key]?.baseTools ?? []).map((tool) => ({\n name: tool.name,\n description: tool.description ?? '',\n hidden: exclude.includes(tool.name),\n added: false,\n }))\n const names = new Set(catalog.map((row) => row.name))\n const added = addOf(key)\n .filter((name) => !names.has(name))\n .map((name) => ({ name, description: '', hidden: false, added: true }))\n return [...catalog, ...added]\n }\n\n // \u52FE\u9009 / \u53D6\u6D88\u52FE\u9009\uFF1A\u53EA\u52A8\u8FD9\u4E00\u4E2A\u5DE5\u5177\u5728\u672C\u9636\u6BB5\u7684\u53EF\u89C1\u6027\u3002\n const toggleHide = (key: PhaseViewKey, name: string, currentlyHidden: boolean): void => {\n if (syncAll) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u663E\u793A = \u5404\u9636\u6BB5 exclude \u79FB\u9664\uFF08\u7EDD\u4E0D\u987A\u624B\u628A\u6CA1\u52A0\u56DE\u7684\u5DE5\u5177\u52A0\u8FDB add\uFF09\uFF1B\n // \u9690\u85CF = \u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\u3001\u539F\u751F\u7684\u8FDB\u8BE5\u9636\u6BB5 exclude\u3002\n writeSynced((_k, exclude, add) => {\n if (currentlyHidden) return { exclude: exclude.filter((x) => x !== name), add }\n if (add.includes(name)) return { exclude, add: add.filter((x) => x !== name) }\n return exclude.includes(name) ? null : { exclude: [...exclude, name], add }\n })\n setNotice(null)\n return\n }\n if (currentlyHidden) {\n addToPhase(key, name, false)\n } else {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (add.includes(name)) add = add.filter((x) => x !== name)\n else if (!exclude.includes(name)) exclude = [...exclude, name]\n writeLists(key, exclude, add)\n }\n setNotice(null)\n }\n\n // \u4ECE\u6C60\u52A0\u5165\u67D0\u9636\u6BB5\uFF08\u66FF\u4EE3\u65E7\u7248\u62D6\u62FD\uFF1A\u6C60 \u2192 \u9636\u6BB5\uFF09\u3002\u6CE8\u518C\u8868\u91CC\u6CA1\u6709\u7684\u52A0\u4E0D\u8FDB\u6765\u3002\n const addFromPool = (key: PhaseViewKey, name: string): void => {\n if (!isInCatalog(key, name) && !registry.has(name)) {\n setNotice({ kind: 'warn', text: t('toolNotInRegistry', { name }) })\n return\n }\n if (syncAll) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u4E09\u4E2A\u9636\u6BB5\u90FD\u8BA9\u5B83\u51FA\u73B0\uFF08\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u6CA1\u6709\u7684\u5C31\u5199\u8FDB\u5404\u81EA\u7684 add \u540D\u5355\uFF09\u3002\n writeSynced((k, exclude, add) => ({\n exclude: exclude.filter((x) => x !== name),\n add: !isInCatalog(k, name) && !add.includes(name) ? [...add, name] : add,\n }))\n setNotice({ kind: 'ok', text: t('toolSyncShown', { name }) })\n return\n }\n addToPhase(key, name, false)\n setNotice({ kind: 'ok', text: isInCatalog(key, name) ? t('toolShown', { name, to: stageLabel(key) }) : t('toolAdded', { name, phase: stageLabel(key) }) })\n }\n\n // \u2500\u2500 \u62D6\u62FD\u843D\u5730\uFF08\u624B\u52BF\u5B9A\u4E49\u89C1 dnd.ts\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u4ECE\u67D0\u9636\u6BB5\u62FF\u6389\u4E00\u4E2A\u5DE5\u5177\uFF08\u62D6\u56DE\u300C\u5168\u90E8\u300D\u7684\u624B\u52BF\uFF09\uFF1A\u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\uFF08\u56DE\u5230\u8BE5\u9636\u6BB5\n * \u539F\u751F\u72B6\u6001\uFF09\uFF0C\u539F\u751F\u5DE5\u5177\u5219\u8FDB\u8BE5\u9636\u6BB5\u9ED1\u540D\u5355\uFF08= \u8BE5\u9636\u6BB5\u9690\u85CF\uFF09\u3002 */\n const removeFromPhase = (key: PhaseViewKey, name: string): void => {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (add.includes(name)) add = add.filter((item) => item !== name)\n else if (!exclude.includes(name)) exclude = [...exclude, name]\n writeLists(key, exclude, add)\n setNotice({ kind: 'ok', text: t('toolRemovedFromPhase', { name, from: stageLabel(key) }) })\n }\n\n /** \u4E00\u6B21\u300C\u653E\u8FDB\u76EE\u6807\u9636\u6BB5\u300D\u7684\u843D\u5730\uFF1A\u6C60\u91CC\u6765\u7684 = \u52A0\u56DE / \u663E\u793A\uFF1B\u522B\u7684\u9636\u6BB5\u6765\u7684 = \u590D\u5236\n * \uFF08\u9690\u85CF\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF0C\u6E90\u9636\u6BB5\u4E0D\u52A8\uFF09\uFF1B\u540C\u9636\u6BB5 = \u4EC0\u4E48\u90FD\u4E0D\u505A\u3002 */\n const dropToolInto = (key: PhaseViewKey, payload: DragPayload): void => {\n if (payload.kind !== 'tool' || payload.from === key) return\n if (payload.from === 'pool') { addFromPool(key, payload.name); return }\n addToPhase(key, payload.name, payload.hidden === true)\n setNotice({ kind: 'ok', text: t('toolCopied', { name: payload.name, to: stageLabel(key), from: stageLabel(payload.from) }) })\n }\n\n /** \u884C / \u5217\u8868\u4E0A\u7684\u6295\u653E\uFF1A\u628A\u624B\u91CC\u7684\u5DE5\u5177\u653E\u8FDB\u672C\u9636\u6BB5\uFF08\u6C60\u6765\u7684\u52A0\u56DE\u3001\u522B\u7684\u9636\u6BB5\u6765\u7684\u590D\u5236\uFF09\u3002 */\n const dropOnPane = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n dropToolInto(phase, payload)\n }\n\n /** \u6C60\u4E0A\u7684\u6295\u653E\uFF1A\u628A\u884C\u4ECE\u672C\u9636\u6BB5\u62FF\u6389\u3002 */\n const dropOnPool = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n if (payload.from === phase) removeFromPhase(phase, payload.name)\n }\n\n // \u5934\u90E8\u9636\u6BB5 Tab \u4E0A\u7684\u6295\u653E\uFF1A\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u6362 Tab / \u6362\u6A21\u5F0F\u65F6\u65E7\u5217\u8868\u5378\u8F7D\u3001\u65B0\n // \u5217\u8868\u6CE8\u518C \u2014\u2014 \u4EFB\u4F55\u65F6\u523B\u53EA\u6709\u4E00\u4E2A\u5904\u7406\u8005\uFF09\u3002\n useEffect(() => {\n setPhaseDropHandler((key, payload) => dropToolInto(key, payload))\n return () => setPhaseDropHandler(null)\n })\n\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n\n // \u5F53\u524D\u9636\u6BB5\u7684\u884C + \u4E09\u6001\u8FC7\u6EE4\uFF08\u5DF2\u542F\u7528 = \u5BF9\u6A21\u578B\u53EF\u89C1\uFF09\u3002\n const rows = rowsOf(phase)\n const onCount = rows.filter((row) => !row.hidden).length\n const offCount = rows.length - onCount\n const rowVisible = (row: { hidden: boolean }): boolean =>\n filter === 'all' || (filter === 'on' ? !row.hidden : row.hidden)\n\n const renderRow = (row: { name: string; description: string; hidden: boolean; added: boolean }): ReactElement | null => {\n if (!rowVisible(row)) return null\n return h('div', {\n key: row.name,\n style: {\n ...s.row,\n ...(row.hidden ? s.rowBlocked : {}),\n ...(dropMark === row.name ? s.dropZoneActive : {}),\n ...(dragName === row.name ? s.dragging : {}),\n },\n title: row.description.slice(0, 120),\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'tool')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(row.name)\n },\n onDrop: dropOnPane,\n }, [\n // \u62D6\u62FD\u6293\u624B\uFF1A\u6574\u884C draggable \u4F1A\u628A\u52FE\u9009\u6846\u7684\u624B\u52BF\u4E00\u8D77\u5403\u6389\u3002\n h('span', {\n draggable: true,\n title: t('drag'),\n style: s.dragHandle,\n onDragStart: (event: ReactDragEvent) => {\n setDragName(row.name)\n beginDrag(event, { kind: 'tool', name: row.name, from: phase, hidden: row.hidden })\n },\n onDragEnd: () => { setDragName(null); setDropMark(null); finishDrag() },\n }, '\u283F'),\n h('input', {\n type: 'checkbox',\n checked: !row.hidden,\n onChange: () => toggleHide(phase, row.name, row.hidden),\n title: row.hidden ? t('hiddenOn') : t('hiddenOff'),\n style: { margin: 0, cursor: 'pointer', flex: 'none' },\n }),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n row.added ? h('span', { style: s.badgeCustom }, t('toolAddedTag')) : null,\n row.hidden ? h('span', { style: s.badgeBlocked }, t('hiddenOn')) : null,\n ]),\n row.description !== '' ? h('div', { style: s.preview }, row.description.slice(0, 120)) : null,\n ]),\n ])\n }\n\n const allTools = (inv?.tools ?? []).map((tool) => ({\n name: tool.name,\n description: typeof tool === 'string' ? '' : (tool.description ?? ''),\n }))\n\n return h('div', { style: s.colLeft }, [\n h('div', {\n ref: scrollRef,\n style: { ...s.colScroll, ...(dropMark === 'list' ? s.dropZone : {}) },\n // \u5217\u8868\u7A7A\u767D\u5904\u6295\u653E\uFF1A\u6C60\u91CC / \u522B\u7684\u9636\u6BB5\u62D6\u6765\u7684\u5DE5\u5177\u653E\u8FDB\u672C\u9636\u6BB5\u3002\n onDragOver: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool' || payload.from === phase) return\n event.preventDefault()\n setDropMark('list')\n },\n onDrop: dropOnPane,\n }, [\n h('div', { style: s.muted }, t('toolsFourHint')),\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.noticeWarn }, notice.text) : null,\n rows.map(renderRow),\n rows.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n // \u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177\uFF1A\u6CE8\u518C\u8868\u7684\u5B8C\u6574\u76EE\u5F55\uFF0C\u53EA\u8BFB\u6C60\u3002\u52A0\u5165\u67D0\u4E2A\u9636\u6BB5\u9760\u62D6\u62FD\uFF1A\u628A\u884C\u62D6\u8FDB\n // \u4E0A\u9762\u7684\u9636\u6BB5\u5217\u8868 = \u52A0\u5165\u672C\u9636\u6BB5\uFF0C\u62D6\u5230\u5934\u90E8\u9636\u6BB5 Tab = \u52A0\u5165\u90A3\u4E2A\u9636\u6BB5\uFF08\u884C\u4E0A\u4E0D\u518D\n // \u653E\u4E09\u4E2A\u6309\u94AE \u2014\u2014 \u62D6\u62FD\u662F\u552F\u4E00\u8DEF\u5F84\uFF0C\u6C60\u540C\u65F6\u662F\u300C\u4ECE\u9636\u6BB5\u62FF\u6389\u300D\u7684\u6295\u653E\u70B9\uFF09\u3002\n h('details', {\n style: { ...s.injectBox, ...(dropMark === 'pool' ? s.dropZoneActive : {}) },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'tool')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark('pool')\n },\n onDrop: dropOnPool,\n }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } },\n `${t('allToolsTitle')} (${allTools.length})`),\n allTools.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n allTools.map((tool) => h('div', {\n key: tool.name,\n style: { ...s.row, opacity: 0.92 },\n draggable: true,\n title: t('dragHint'),\n onDragStart: (event: ReactDragEvent) => beginDrag(event, { kind: 'tool', name: tool.name, from: 'pool' }),\n onDragEnd: finishDrag,\n }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, tool.name)),\n h('div', { style: s.preview }, tool.description.slice(0, 120)),\n ]),\n ])),\n ]),\n ]),\n // \u5DE6\u680F\u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 = \u53EF\u89C1 / \u5DF2\u505C\u7528 = \u9690\u85CF\uFF09\u3002\n h('div', { style: s.colFoot }, [\n h('div', { style: s.seg }, [\n h('button', { style: filter === 'all' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('all') },\n `${t('filterAll')} ${rows.length}`),\n h('button', { style: filter === 'on' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('on') },\n `${t('filterOn')} ${onCount}`),\n h('button', { style: filter === 'off' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('off') },\n `${t('filterOff')} ${offCount}`),\n ]),\n ]),\n ])\n}\n", "/**\n * PresetsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u9884\u8BBE\u6A21\u5F0F\uFF08\u5DE6\u53F3\u53CC\u680F\uFF09\u3002\n *\n * \u4E24\u79CD\u300C\u9884\u8BBE\u300D\u5206\u5F00\uFF0C\u5404\u5360\u4E00\u680F\uFF1A\n * - \u5DE6\u680F\uFF08PresetsPane\uFF09\uFF1A\u914D\u7F6E\u5FEB\u7167\u5E93 \u2014\u2014 \u4FDD\u5B58\u5F53\u524D\u914D\u7F6E / \u5BFC\u5165 / \u5E94\u7528 / \u5BFC\u51FA /\n * \u5220\u9664\u3002\u5FEB\u7167\u53EA\u6539\u672C\u63D2\u4EF6\u5185\u7684 presets \u5E93\uFF0C\u4E0D\u4F1A\u53D8\u6210\u53EF\u9009\u7684 agent \u9884\u8BBE\uFF1B\n * - \u53F3\u680F\uFF08SettingsPane\uFF09\uFF1A\u5B58\u4E3A agent \u9884\u8BBE\uFF08\u6574\u4F53 fork \u5F53\u524D\u7F16\u8F91\u76EE\u6807\u7684\u9884\u8BBE\u76EE\u5F55\uFF0C\n * \u5E76\u628A\u5F53\u524D\u5B9A\u5236\u5199\u8FDB\u5B83\u7684\u8986\u76D6\u9879\uFF09+ \u5168\u5C40\u8BBE\u7F6E\uFF08\u5F3A\u5236\u8986\u76D6\u5F00\u5173\u3001\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u3001\n * \u63D0\u793A\u8BCD\u53D8\u91CF\u53C2\u8003\u3001\u6062\u590D\u521D\u59CB\u72B6\u6001\uFF09\u3002\n *\n * \u5BFC\u5165\u5BFC\u51FA\u7ECF preset-io \u53CC\u7AEF\u9002\u914D\uFF1ATauri 2 \u684C\u9762\u8D70\u539F\u751F\u5BF9\u8BDD\u6846\uFF0CWeb \u8D70\u4E0B\u8F7D /\n * \u6587\u4EF6\u9009\u62E9\uFF1B\u6210\u529F / \u5931\u8D25 / \u53D6\u6D88\u90FD\u6709\u9762\u677F\u5185\u6D88\u606F\u6761\u63D0\u793A\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type ReactElement, type ChangeEvent } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview, Preset } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { addImportedPresets, applyPresetData, buildPresetData, genId, mergeSections, PART_ORDER, removePreset, type ConfigPatch } from './presets.ts'\nimport { decodePresetExport, exportPresetFile, importPresetFile } from './preset-io.ts'\nimport { s } from './styles.ts'\n\n/** \u4E00\u6B21\u6027\u64CD\u4F5C\u63D0\u793A\uFF1Akind \u51B3\u5B9A\u914D\u8272\uFF0C\u51E0\u79D2\u540E\u81EA\u52A8\u6D88\u5931\u3002 */\ninterface Notice {\n kind: 'ok' | 'error'\n text: string\n}\n\n/** 4 \u79D2\u81EA\u52A8\u6D88\u5931\u7684\u9762\u677F\u5185\u6D88\u606F\u6761\uFF08\u5DE6\u53F3\u4E24\u680F\u5171\u7528\u884C\u4E3A\uFF09\u3002 */\nfunction useNotice(): { notice: Notice | null; show: (kind: Notice['kind'], text: string) => void } {\n const [notice, setNotice] = useState<Notice | null>(null)\n const noticeTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n useEffect(() => () => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n }, [])\n const show = (kind: Notice['kind'], text: string): void => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n setNotice({ kind, text })\n noticeTimer.current = setTimeout(() => setNotice(null), 4000)\n }\n return { notice, show }\n}\n\nexport function PresetsPane({ cfg, inv, phases, t, writePatch, writeGlobal, envBlocklist }: {\n cfg: Config\n inv: Inventory | null\n /** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\uFF1A\u5FEB\u7167\u53EA\u6355\u83B7\u5F53\u524D\u88C5\u914D\u91CC\u771F\u5B9E\u5B58\u5728\u7684\u6BB5\u3002 */\n phases: Record<PhaseViewKey, Preview | null> | null\n t: Translate\n /** \u5E94\u7528\u9884\u8BBE\uFF1A\u5B8C\u6574\u8865\u4E01\u4E00\u6B21\u843D\u76D8\uFF08\u663E\u5F0F\u610F\u56FE\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002 */\n writePatch: (patch: ConfigPatch) => void\n /** \u9884\u8BBE\u5E93\u4E13\u7528\uFF1A\u6C38\u8FDC\u5199\u5728\u5168\u5C40\u5B57\u6BB5\uFF08presets / activePreset \u4E0D\u5206\u4F5C\u7528\u57DF\uFF09\u3002 */\n writeGlobal: (field: string, value: unknown) => void\n /** \u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF08\u6C38\u8FDC\u9876\u5C42\u5B57\u6BB5\uFF0C\u4E0D\u5206\u4F5C\u7528\u57DF\uFF09\uFF1B\u5BFC\u51FA\u968F\u884C\u3001\u5BFC\u5165\u5E76\u96C6\u3002 */\n envBlocklist: string[]\n}): ReactElement {\n const presets = cfg.presets ?? []\n const [name, setName] = useState('')\n const { notice, show } = useNotice()\n // Web \u56DE\u9000\u7528\u7684\u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF08tauri \u4E0D\u53EF\u7528\u65F6\u624D\u70B9\u5B83\uFF09\u3002\n const fileRef = useRef<HTMLInputElement | null>(null)\n\n const blockedNames = new Set(cfg.sections ?? [])\n // \u5FEB\u7167\u7684\u6355\u83B7\u5B87\u5B99 = \u5F53\u524D\u9884\u8BBE\u4E09\u4E2A\u9636\u6BB5\u88C5\u914D\u91CC\u771F\u5B9E\u5B58\u5728\u7684\u6BB5\u540D\u3002\u300C\u672C\u7CFB\u7EDF\u5168\u90E8\u63D0\u793A\u8BCD\u300D\n // \u662F\u8DE8\u9884\u8BBE\u53EA\u589E\u4E0D\u51CF\u7684\u5E76\u96C6\u6C60\uFF0C\u76F4\u63A5\u62FF\u5B83\u5F53\u6355\u83B7\u96C6\u5408\u4F1A\u628A\u522B\u7684\u9884\u8BBE\u72EC\u6709\u6BB5\u540D\u704C\u8FDB\u5FEB\u7167\uFF0C\n // \u5E94\u7528\u56DE\u6765\u5C31\u662F\u4E00\u6761\u6761\u7A7A\u767D\u5E7D\u7075\u6BB5\u3002\u88C5\u914D\u6570\u636E\u672A\u5C31\u7EEA\uFF08\u5B87\u5B99\u4E3A\u7A7A\uFF09\u65F6\u4E0D\u8FC7\u6EE4\uFF0C\u907F\u514D\u6355\u83B7\u6210\u7A7A\u3002\n const assemblyNames = new Set<string>()\n for (const key of PART_ORDER) {\n for (const sec of phases?.[key]?.baseSections ?? []) assemblyNames.add(sec.name)\n }\n const mergedAll = mergeSections(inv, cfg, blockedNames)\n const merged = assemblyNames.size === 0\n ? mergedAll\n : mergedAll.filter((sec) => sec.source === 'custom' || assemblyNames.has(sec.name))\n const currentNames = new Set(merged.map((sec) => sec.name))\n\n // \u628A\u5F53\u524D\u5B9A\u5236\u6355\u83B7\u4E3A\u65B0\u9884\u8BBE\uFF08\u5B8C\u6574\u5FEB\u7167\uFF09\u3002\u7EDD\u5BF9\u987A\u5E8F\u4F1A\u88AB\u8F6C\u6210\u76F8\u5BF9\u5F62\u5F0F\n //\uFF08\u6BCF\u6BB5\u8BB0\u5F55\u5B83\u5E94\u8DDF\u968F\u7684\u524D\u4E00\u6BB5\uFF09\uFF0C\u56E0\u6B64\u9884\u8BBE\u53EF\u4EE5\u8DE8\u4E0D\u540C\u63D0\u793A\u8BCD\u79FB\u690D\u3002\n const saveCurrent = (): void => {\n const presetName = name.trim() || `${t('preset')} ${presets.length + 1}`\n const data = buildPresetData(cfg, merged)\n writeGlobal('presets', [...presets, { id: genId(), name: presetName, data }])\n setName('')\n }\n\n // \u5E94\u7528\u9884\u8BBE\u3002\u8865\u4E01\u7531\u7EAF\u51FD\u6570\u52A9\u624B\u8BA1\u7B97\uFF08\u540C\u540D\u6BB5\u8986\u76D6\u3001\u5339\u914D\u4E0D\u4E0A\u7684\u8DF3\u8FC7\u3001\u4E0D\u5728\u9884\u8BBE\n // \u5217\u8868\u4E2D\u7684\u5F53\u524D\u6BB5\u88AB\u5C4F\u853D\u3001\u53EA\u6709\u9884\u8BBE\u7684\u300C\u6FC0\u6D3B\u6BB5\u300D\u88AB\u89E3\u9664\u5C4F\u853D\uFF09\u3002\u56DB\u4E2A\u5B9A\u5236\u5B57\u6BB5\u4EE5\n // \u4E00\u4E2A\u8865\u4E01\u5199\u5165\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1B\u5FEB\u7167\u5E93\uFF08presets / activePreset\uFF09\u6C38\u8FDC\u4FDD\u6301\u5728\u5168\u5C40\u3002\n const applyPreset = (preset: Preset): void => {\n writePatch(applyPresetData(preset.data, cfg, currentNames))\n writeGlobal('activePreset', preset.id)\n }\n\n const deletePreset = (id: string): void => {\n const next = removePreset(presets, id, cfg.activePreset)\n writeGlobal('presets', next.presets)\n if (next.activeId === undefined && cfg.activePreset === id) writeGlobal('activePreset', undefined)\n }\n\n // \u5BFC\u51FA\u4E00\u4E2A\u9884\u8BBE\uFF1ATauri \u684C\u9762\u8D70\u539F\u751F\u4FDD\u5B58\u5BF9\u8BDD\u6846\uFF0CWeb\uFF08\u6216 tauri \u63D2\u4EF6\u4E0D\u53EF\u7528\n // \u65F6\uFF09\u56DE\u9000\u4E3A\u4E0B\u8F7D\u3002saved/downloaded = \u6210\u529F\uFF1B\u7528\u6237\u53D6\u6D88\u5355\u72EC\u63D0\u793A\uFF0C\u4E0D\u7B97\u5931\u8D25\u3002\n const exportPreset = async (preset: Preset): Promise<void> => {\n try {\n const res = await exportPresetFile(preset, undefined, envBlocklist)\n if (res.ok) show('ok', t('exportOk'))\n else if (res.cancelled) show('ok', t('exportCancel'))\n else show('error', `${t('exportFail')}${res.message ? ': ' + res.message : ''}`)\n } catch (e) {\n show('error', `${t('exportFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // \u89E3\u6790\u5BFC\u5165\u6587\u672C \u2192 \u53BB\u91CD\u8FFD\u52A0 \u2192 \u63D0\u793A\u65B0\u589E\u6570\u91CF\u3002\u89E3\u6790\u5931\u8D25\u63D0\u793A\u9519\u8BEF\u3002\n // \u5355\u5BF9\u8C61\u683C\u5F0F\u7684\u6587\u4EF6\u8FD8\u53EF\u80FD\u968F\u884C\u643A\u5E26\u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF1A\u4E0E\u5F53\u524D\u540D\u5355\u5E76\u96C6\u5408\u5E76\u3002\n const importParsed = (text: string): void => {\n try {\n const parsed = decodePresetExport(text)\n const next = addImportedPresets(presets, parsed, genId)\n const added = next.length - presets.length\n const fileBlock = parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)\n && Array.isArray((parsed as { envBlocklist?: unknown }).envBlocklist)\n ? ((parsed as { envBlocklist?: unknown[] }).envBlocklist ?? []).filter((e): e is string => typeof e === 'string')\n : []\n const fresh = fileBlock.filter((e) => !envBlocklist.includes(e))\n if (fresh.length > 0) writeGlobal('envBlocklist', [...envBlocklist, ...fresh])\n const mergedNote = fresh.length > 0 ? t('importBlockMerge', { count: fresh.length }) : ''\n if (added <= 0) show('ok', t('importNone') + mergedNote)\n else {\n writeGlobal('presets', next)\n show('ok', `${t('importOk')} (+${added})${mergedNote}`)\n }\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // \u5BFC\u5165\u9884\u8BBE\uFF1A\u4F18\u5148 Tauri \u539F\u751F\u6253\u5F00\u5BF9\u8BDD\u6846\uFF1Bunavailable\uFF08Web \u6216\u684C\u9762\u7AEF\u7F3A\n // dialog/fs \u63D2\u4EF6\uFF09\u65F6\u70B9\u9690\u85CF file input \u56DE\u9000\u5230\u6587\u4EF6\u9009\u62E9\u5668\u3002\u53D6\u6D88\u5355\u72EC\u63D0\u793A\u3002\n const importPreset = async (): Promise<void> => {\n try {\n const res = await importPresetFile()\n if (res.kind === 'text') { importParsed(res.text); return }\n if (res.kind === 'cancelled') { show('ok', t('importCancel')); return }\n fileRef.current?.click()\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // Web \u56DE\u9000\u8DEF\u5F84\uFF1A\u6587\u4EF6\u9009\u62E9\u5668\u7684 onChange\u3002\u7528\u6237\u53D6\u6D88\uFF08\u65E0\u6587\u4EF6\uFF09\u9759\u9ED8\u8FD4\u56DE\u3002\n const onImportFile = (e: ChangeEvent<HTMLInputElement>): void => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => importParsed(String(reader.result))\n reader.onerror = () => show('error', t('importFail'))\n reader.readAsText(file)\n }\n\n return h('div', { style: s.colLeft }, [\n h('div', { style: s.colScroll }, [\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.error }, notice.text) : null,\n h('div', { style: s.groupHead }, t('libraryTitle')),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('presetName'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('button', { style: s.mini, onClick: saveCurrent }, t('save')),\n ]),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => { void importPreset() } }, t('import')),\n h('input', { ref: fileRef, type: 'file', accept: '.json,application/json', style: { display: 'none' }, onChange: onImportFile }),\n ]),\n ]),\n presets.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n presets.map((preset) => {\n const active = cfg.activePreset === preset.id\n return h('div', { key: preset.id, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, preset.name),\n active ? h('span', { style: s.badgeOk }, t('active')) : null,\n ]),\n ]),\n h('button', { style: s.mini, onClick: () => applyPreset(preset) }, t('apply')),\n h('button', { style: s.mini, onClick: () => { void exportPreset(preset) } }, t('export')),\n h('button', { style: s.mini, onClick: () => deletePreset(preset.id) }, t('delete')),\n ])\n }),\n ]),\n ])\n}\n\nexport function SettingsPane({ cfg, inv, t, writeGlobal, saveAsPreset, forkSource, onReset, envBlocklist }: {\n cfg: Config\n inv: Inventory | null\n t: Translate\n /** \u5168\u5C40\u5B57\u6BB5\u4E13\u7528\u5199\u901A\u9053\uFF08forceSections / envBlocklist\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002 */\n writeGlobal: (field: string, value: unknown) => void\n /** \u5B58\u4E3A agent \u9884\u8BBE\uFF1Afork \u5F53\u524D\u7F16\u8F91\u76EE\u6807\u7684\u9884\u8BBE\u76EE\u5F55\u5E76\u5199\u5165 overrides[\u65B0\u540D]\u3002 */\n saveAsPreset: (name: string) => Promise<boolean>\n /** fork \u6765\u6E90\u7684\u663E\u793A\u540D\uFF08\u5F53\u524D\u7F16\u8F91\u76EE\u6807\u9884\u8BBE\uFF09\uFF1Bundefined = \u5168\u5C40\u76EE\u6807\uFF0C\u7531\u670D\u52A1\u7AEF\u56DE\u843D\u9ED8\u8BA4\u9884\u8BBE\u3002 */\n forkSource: string | undefined\n /** \u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u5173\u95ED forceSections\uFF08\u4E0E\u4E0D\u88C5\u63D2\u4EF6\u7B49\u6548\uFF09\u3002 */\n onReset: () => void\n envBlocklist: string[]\n}): ReactElement {\n // \u300C\u5B58\u4E3A agent \u9884\u8BBE\u300D\u7684\u540D\u5B57\u4E0E\u5728\u9014\u6807\u8BB0\uFF08\u4E0E\u670D\u52A1\u7AEF\u5F80\u8FD4\u671F\u95F4\u7981\u7528\u6309\u94AE\uFF09\u3002\n const [agentName, setAgentName] = useState('')\n const [creating, setCreating] = useState(false)\n // \u9ED1\u540D\u5355\u300C\u6DFB\u52A0\u300D\u8F93\u5165\u6846\u7684\u6682\u5B58\u503C\u3002\n const [blockInput, setBlockInput] = useState('')\n\n // \u5B58\u4E3A agent \u9884\u8BBE\uFF1A\u6210\u8D25\u7531\u670D\u52A1\u7AEF\u8FD4\u56DE\uFF0C\u63D0\u793A\u7EDF\u4E00\u8D70\u9762\u677F\u9876\u90E8\u7684\u6D88\u606F\u6761\uFF08Panel\n // \u7684 flash\uFF09\uFF0C\u8FD9\u91CC\u53EA\u5728\u6210\u529F\u65F6\u6E05\u7A7A\u8F93\u5165\u6846\uFF0C\u907F\u514D\u540C\u4E00\u6761\u6D88\u606F\u663E\u793A\u4E24\u904D\u3002\n const createAgentPreset = async (): Promise<void> => {\n const trimmed = agentName.trim()\n if (trimmed.length === 0 || creating) return\n setCreating(true)\n if (await saveAsPreset(trimmed)) setAgentName('')\n setCreating(false)\n }\n\n // \u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF1A\u5168\u5C40\u5B57\u6BB5\uFF0C\u6539\u52A8\u5373\u5199\uFF08\u4E0E forceSections \u540C\u4E00\u901A\u9053\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002\n const removeBlockEntry = (entry: string): void => {\n writeGlobal('envBlocklist', envBlocklist.filter((e) => e !== entry))\n }\n const addBlockEntry = (): void => {\n const entry = blockInput.trim()\n setBlockInput('')\n if (entry === '' || envBlocklist.includes(entry)) return\n writeGlobal('envBlocklist', [...envBlocklist, entry])\n }\n\n return h('div', { style: s.colRight }, [\n h('div', { style: s.colRightScroll }, [\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('saveAsPresetCard')),\n h('div', { style: s.muted }, t('saveAsPresetHint', { name: forkSource ?? t('forkSourceDefault') })),\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('agentPresetName'), value: agentName, onChange: (e: ChangeEvent<HTMLInputElement>) => setAgentName(e.target.value) }),\n h('button', { style: s.mini, disabled: creating || agentName.trim().length === 0, onClick: () => { void createAgentPreset() } }, t('saveAsPreset')),\n ]),\n ]),\n h('div', { style: s.groupHead }, t('settingsTitle')),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('forceTitle')),\n h('div', { style: s.muted }, t('forceHint')),\n h('div', { style: s.injectRow }, [\n h('label', { style: s.switchWrap }, [\n h('input', {\n type: 'checkbox',\n checked: cfg.forceSections !== false,\n // forceSections \u662F\u5168\u5C40\u5B57\u6BB5\uFF0C\u4E0E presets/activePreset \u4E00\u6837\u6C38\u8FDC\u5199\u9876\u5C42\u3002\n onChange: (e: ChangeEvent<HTMLInputElement>) => writeGlobal('forceSections', e.target.checked),\n }),\n h('span', { style: cfg.forceSections !== false ? s.badgeOk : s.badgeBlocked },\n cfg.forceSections !== false ? t('forceOn') : t('forceOff')),\n ]),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('envBlockTitle')),\n h('div', { style: s.muted }, t('envBlockHint')),\n h('div', { style: { ...s.toolWrap, marginTop: 6 } }, envBlocklist.map((entry) => h('span', {\n key: entry,\n style: { ...s.toolChip, display: 'inline-flex', alignItems: 'center', gap: 4 },\n }, [\n entry,\n h('span', { style: { cursor: 'pointer' }, title: t('delete'), onClick: () => removeBlockEntry(entry) }, '\u00D7'),\n ]))),\n envBlocklist.length === 0 ? h('div', { style: s.muted }, t('envBlockEmpty')) : null,\n h('div', { style: { ...s.injectRow, marginTop: 6 } }, [\n h('input', {\n style: { ...s.input, flex: 1 },\n placeholder: t('envBlockAdd'),\n value: blockInput,\n onChange: (e: ChangeEvent<HTMLInputElement>) => setBlockInput(e.target.value),\n }),\n h('button', { style: s.mini, disabled: blockInput.trim() === '', onClick: addBlockEntry }, t('envBlockAddAction')),\n ]),\n h('details', { style: { marginTop: 6 } }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } }, `${t('envVarsTitle')} (${inv?.variables?.length ?? 0})`),\n h('div', { style: { ...s.muted, marginTop: 4 } }, t('envVarsHint')),\n h('div', { style: { ...s.toolWrap, marginTop: 4 } }, (inv?.variables ?? []).map((varName) => h('span', { key: varName, style: s.toolChip }, `{{${varName}}}`))),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('resetTitle')),\n h('div', { style: s.muted }, t('resetHint')),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => {\n // \u4E8C\u6B21\u786E\u8BA4\uFF1A\u6E05\u7A7A\u4E0D\u53EF\u64A4\u9500\uFF0C\u5FC5\u987B\u660E\u786E\u70B9\u5934\u624D\u52A8\u624B\u3002\n if (window.confirm(t('resetConfirm'))) onReset()\n } }, t('resetAction')),\n ]),\n ]),\n ]),\n ])\n}\n", "/**\n * preset-io.ts \u2014\u2014 \u8DE8\u73AF\u5883\uFF08Tauri 2 \u684C\u9762 / Web\uFF09\u7684\u9884\u8BBE\u5BFC\u5165\u5BFC\u51FA\u9002\u914D\u5C42\u3002\n *\n * \u6D4F\u89C8\u5668\u7AEF\u6700\u521D\u8DD1\u5728\u666E\u901A\u7F51\u9875\u91CC\uFF1A\u5BFC\u51FA\u7528 Blob + <a download>\uFF0C\u5BFC\u5165\u7528\u9690\u85CF\u7684\n * <input type=\"file\"> + FileReader\u3002\u5BBF\u4E3B\u73B0\u5728\u53EF\u80FD\u5305\u5728 Tauri \u684C\u9762 WebView\n * \u91CC\uFF0C\u684C\u9762\u7AEF\u7684\u9884\u671F\u4EA4\u4E92\u662F\u300C\u539F\u751F\u4FDD\u5B58 / \u6253\u5F00\u5BF9\u8BDD\u6846 + \u771F\u5B9E\u6587\u4EF6\u8BFB\u5199\u300D\u3002\n *\n * \u672C\u6A21\u5757\u4FDD\u6301\u6587\u4EF6\u683C\u5F0F\u7EAF\u51C0\uFF08encode/decode \u4E3A\u7EAF\u51FD\u6570\uFF09\uFF0C\u628A\u771F\u6B63\u7684 I/O \u8DEF\u7531\u5230\n * \u4E00\u4E2A\u5C0F\u578B\u7684\u53EF\u6CE8\u5165 `PresetIoEnv`\uFF1A\n *\n * - Tauri v2\uFF1A\u901A\u8FC7 window.__TAURI_INTERNALS__.invoke \u8C03\u7528\u539F\u751F\u7684\n * `plugin:dialog|save` / `plugin:dialog|open` \u4E0E\n * `plugin:fs|write_text_file` / `plugin:fs|read_text_file` \u547D\u4EE4 \u2014\u2014 \u4F46\n * \u4EC5\u5F53\u5BBF\u4E3B\u5E94\u7528\u6CE8\u518C\u4E86 dialog / fs \u63D2\u4EF6\u3001\u4E14\u5176 capability ACL \u653E\u884C\u8FD9\u4E9B\n * \u547D\u4EE4\u65F6\u624D\u53EF\u7528\u3002\u4EFB\u4F55\u62D2\u7EDD\uFF08\u63D2\u4EF6\u672A\u6CE8\u518C\u3001ACL \"not allowed\"\uFF09\u90FD\u5F52\u4E3A\n * `unavailable`\uFF0C\u7531\u8C03\u7528\u65B9\u56DE\u9000\u5230 Web \u8DEF\u5F84 \u2014\u2014 \u6240\u4EE5\u5373\u4F7F Tauri \u5BBF\u4E3B\u5C1A\u672A\n * \u5E26 dialog/fs \u63D2\u4EF6\uFF0C\u672C\u63D2\u4EF6\u4E5F\u7167\u5E38\u5DE5\u4F5C\u3002\n * - Web\uFF08\u4EE5\u53CA tauri \u56DE\u9000\uFF09\uFF1ABlob + \u951A\u70B9\u4E0B\u8F7D / \u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF0C\u4E0E\u65E7\u884C\u4E3A\n * \u5B8C\u5168\u4E00\u81F4\u3002\u5728 WebView2 \u91CC\u951A\u70B9\u4E0B\u8F7D\u4F1A\u9000\u5316\u4E3A WebView \u9ED8\u8BA4\u7684\u4E0B\u8F7D\u5904\u7406\uFF0C\n * \u6587\u4EF6\u8F93\u5165\u4ECD\u4F1A\u6253\u5F00\u7CFB\u7EDF\u9009\u62E9\u5668\u3002\n *\n * \u672C\u6A21\u5757\u5728\u6A21\u5757\u4F5C\u7528\u57DF\u4E0D\u89E6\u78B0 DOM \u2014\u2014 \u6BCF\u4E2A\u5206\u652F\u90FD\u63A5\u53D7\u6CE8\u5165\u7684\u5047\u5B9E\u73B0 \u2014\u2014 \u56E0\u6B64\n * \u53EF\u4EE5\u5728 Node \u4E0B\u52A0\u8F7D\uFF0Cweb / tauri \u5DF2\u4FDD\u5B58 / tauri \u5DF2\u53D6\u6D88 / tauri \u4E0D\u53EF\u7528\n * \u7684\u6574\u4E2A\u77E9\u9635\u90FD\u80FD\u5355\u6D4B\u8986\u76D6\u3002\n */\nimport type { Preset } from './types.ts'\nimport { presetExportFilename } from './presets.ts'\n\n// \u2500\u2500 \u73AF\u5883\u68C0\u6D4B \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Tauri v2 \u539F\u59CB IPC \u6865\uFF08window.__TAURI_INTERNALS__\uFF09\u3002 */\nexport interface TauriInvoke {\n (cmd: string, args?: Record<string, unknown>, options?: unknown): Promise<unknown>\n}\n\n/** \u9875\u9762\u662F\u5426\u8FD0\u884C\u5728 Tauri\uFF08v1 \u6807\u8BB0\u6216 v2 \u6865\uFF09webview \u5185\u3002 */\nexport function isTauriEnv(win: unknown): boolean {\n if (win === null || win === undefined) return false\n const w = win as { __TAURI_INTERNALS__?: unknown; __TAURI__?: unknown }\n return w.__TAURI_INTERNALS__ !== undefined || w.__TAURI__ !== undefined\n}\n\n/** \u53D6\u53EF\u7528\u7684 Tauri v2 invoke \u6865\uFF1B\u4E0D\u53EF\u7528\u65F6\u8FD4\u56DE null\u3002 */\nfunction invokeOf(win: unknown): TauriInvoke | null {\n if (!isTauriEnv(win)) return null\n const internals = (win as { __TAURI_INTERNALS__?: { invoke?: unknown } }).__TAURI_INTERNALS__\n return internals && typeof internals.invoke === 'function' ? (internals.invoke as TauriInvoke) : null\n}\n\n// \u2500\u2500 \u539F\u751F\uFF08tauri\uFF09\u539F\u8BED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SaveOutcome = { kind: 'saved' } | { kind: 'cancelled' } | { kind: 'unavailable' }\nexport type OpenOutcome = { kind: 'text'; text: string } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\nconst JSON_FILTERS = [{ name: 'JSON', extensions: ['json'] }]\n\n/**\n * \u539F\u751F\u4FDD\u5B58\u5BF9\u8BDD\u6846 + \u5199\u6587\u4EF6\u3002`cancelled` = \u7528\u6237\u5173\u95ED\u4E86\u5BF9\u8BDD\u6846\uFF08\u8C03\u7528\u65B9\u7EDD\u4E0D\n * \u5F97\u518D\u56DE\u9000\u5230\u4E0B\u8F7D\uFF09\uFF1B`unavailable` = \u5BBF\u4E3B\u65E0\u6CD5\u63D0\u4F9B dialog/fs \u63D2\u4EF6\uFF08\u63D2\u4EF6\n * \u7F3A\u5931\u6216\u88AB ACL \u62E6\u622A\uFF09\uFF0C\u8C03\u7528\u65B9\u5E94\u5F53\u56DE\u9000\u3002\n */\nexport async function tauriSaveText(invoke: TauriInvoke, defaultName: string, text: string): Promise<SaveOutcome> {\n try {\n const path = await invoke('plugin:dialog|save', { defaultPath: defaultName, filters: JSON_FILTERS })\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n await invoke('plugin:fs|write_text_file', { path, contents: text })\n return { kind: 'saved' }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n/** \u539F\u751F\u6253\u5F00\u5BF9\u8BDD\u6846 + \u8BFB\u6587\u4EF6\u3002`cancelled` = \u7528\u6237\u5173\u95ED\u4E86\u5BF9\u8BDD\u6846\u3002 */\nexport async function tauriOpenText(invoke: TauriInvoke): Promise<OpenOutcome> {\n try {\n const picked = await invoke('plugin:dialog|open', { multiple: false, directory: false, filters: JSON_FILTERS })\n const path = Array.isArray(picked) ? picked[0] : picked\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n const text = await invoke('plugin:fs|read_text_file', { path })\n if (typeof text !== 'string') return { kind: 'unavailable' }\n return { kind: 'text', text }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n// \u2500\u2500 Web \u56DE\u9000\u539F\u8BED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u951A\u70B9\u4E0B\u8F7D\u7684\u76EE\u6807\u63A5\u53E3\uFF1B\u4F9D\u8D56\u5168\u90E8\u6CE8\u5165\u4EE5\u4FBF Node \u91CC\u4F2A\u9020\u3002 */\nexport interface BrowserDownloadTarget {\n makeAnchor(): { href: string; download: string; click(): void }\n makeBlob(text: string): unknown\n objectUrl(blob: unknown): string\n revoke(url: string): void\n}\n\n/** Web \u56DE\u9000\u5BFC\u51FA\uFF1ABlob + object URL + <a download> + revoke\u3002 */\nexport function webDownload(target: BrowserDownloadTarget, filename: string, text: string): void {\n const blob = target.makeBlob(text)\n const url = target.objectUrl(blob)\n const anchor = target.makeAnchor()\n anchor.href = url\n anchor.download = filename\n anchor.click()\n target.revoke(url)\n}\n\n/** FileReader \u5F62\u72B6\u7684\u8BFB\u53D6\u5668\uFF08\u6D4F\u89C8\u5668\u6CE8\u5165\u771F FileReader\uFF0C\u6D4B\u8BD5\u6CE8\u5165\u5047\u5B9E\u73B0\uFF09\u3002\n * \u56DE\u8C03\u7C7B\u578B\u5E26\u53EF\u9009\u7684\u4E8B\u4EF6\u53C2\u6570\uFF0C\u8BA9 DOM FileReader \u7684\n * `(this: FileReader, ev: ProgressEvent) => any` \u5904\u7406\u5668\u80FD\u5E72\u51C0\u8D4B\u503C\u3002 */\nexport interface FileReaderLike {\n readAsText(file: unknown): void\n onload: ((ev?: unknown) => void) | null\n onerror: ((ev?: unknown) => void) | null\n result: string | ArrayBuffer | null\n}\n\n/** Web \u56DE\u9000\u5BFC\u5165\uFF1A\u7ECF FileReader \u5F62\u72B6\u7684\u8BFB\u53D6\u5668\u89E3\u6790\u6240\u9009\u6587\u4EF6\u7684\u6587\u672C\u3002 */\nexport function readPickedFile(reader: FileReaderLike, file: unknown): Promise<string> {\n return new Promise((resolve, reject) => {\n reader.onload = () => {\n const r = reader.result\n resolve(typeof r === 'string' ? r : String(r ?? ''))\n }\n reader.onerror = () => reject(new Error('FREAD'))\n reader.readAsText(file)\n })\n}\n\n// \u2500\u2500 \u7EAF\u6587\u4EF6\u683C\u5F0F \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u628A\u5355\u4E2A\u9884\u8BBE\u7F16\u7801\u4E3A\u5BFC\u51FA\u6587\u4EF6\u7684 JSON \u683C\u5F0F\uFF08\u5355\u5BF9\u8C61\u683C\u5F0F\uFF09\u3002`envBlocklist`\n * \u662F\u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u7684\u968F\u884C\u5FEB\u7167\uFF1A\u5BFC\u5165\u7AEF\u6309\u5E76\u96C6\u5E76\u5165\uFF08\u89C1 PresetsTab\uFF09\u3002 */\nexport function encodePresetExport(preset: Preset, envBlocklist?: string[]): string {\n return JSON.stringify({ name: preset.name, data: preset.data, ...(Array.isArray(envBlocklist) ? { envBlocklist } : {}) }, null, 2)\n}\n\n/**\n * \u89E3\u6790\u5BFC\u51FA\u7684\u9884\u8BBE\u6587\u4EF6\uFF1A\u5355\u4E2A { name, data } \u5BF9\u8C61\u6216\u5BF9\u8C61\u6570\u7EC4\u3002\u7A7A\u5185\u5BB9 /\n * \u975E\u6CD5 JSON \u629B\u666E\u901A Error\uFF0C\u7531\u8C03\u7528\u65B9\u7ED9\u51FA\u53CB\u597D\u63D0\u793A\uFF1B\u6761\u76EE\u7EA7\u7684\u8FC7\u6EE4\u5728\n * addImportedPresets \u91CC\u8FDB\u884C\u3002\n */\nexport function decodePresetExport(text: string): unknown {\n const trimmed = String(text).trim()\n if (trimmed === '') throw new Error('EMPTY_EXPORT')\n return JSON.parse(trimmed)\n}\n\n// \u2500\u2500 \u73AF\u5883\u95E8\u9762 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u8C03\u7528\u65B9\uFF08UI \u6216\u6D4B\u8BD5\uFF09\u9A71\u52A8\u7684 I/O \u9762\u3002 */\nexport interface PresetIoEnv {\n readonly tauri: boolean\n saveText(defaultName: string, text: string): Promise<SaveOutcome>\n openText(): Promise<OpenOutcome>\n download(name: string, text: string): void\n}\n\nfunction browserDownloadTarget(): BrowserDownloadTarget {\n const g = globalThis as { document?: Document; URL?: { createObjectURL(b: Blob): string; revokeObjectURL(u: string): void } }\n const doc = g.document!\n const url = g.URL!\n return {\n makeAnchor: () => doc.createElement('a'),\n makeBlob: (text) => new Blob([text], { type: 'application/json' }),\n objectUrl: (blob) => url.createObjectURL(blob as Blob),\n revoke: (u) => url.revokeObjectURL(u),\n }\n}\n\n/** \u4E3A\u5F53\u524D window \u6784\u5EFA\u771F\u5B9E\u73AF\u5883\uFF08\u5728 Node \u91CC\u8C03\u7528\u4E5F\u5B89\u5168\uFF09\u3002 */\nexport function makeIoEnv(win?: unknown): PresetIoEnv {\n const w = win !== undefined ? win : typeof window !== 'undefined' ? window : undefined\n const invoke = invokeOf(w)\n const tauri = invoke !== null\n return {\n tauri,\n saveText: (name, text) => (tauri ? tauriSaveText(invoke!, name, text) : Promise.resolve({ kind: 'unavailable' })),\n openText: () => (tauri ? tauriOpenText(invoke!) : Promise.resolve({ kind: 'unavailable' })),\n download: (name, text) => webDownload(browserDownloadTarget(), name, text),\n }\n}\n\nexport type ExportResult = { ok: boolean; via: 'tauri' | 'browser'; cancelled?: boolean; message?: string }\n\n/**\n * \u5BFC\u51FA\u4E00\u4E2A\u9884\u8BBE\uFF1A\u5BBF\u4E3B\u80FD\u63D0\u4F9B\u539F\u751F\u5BF9\u8BDD\u6846\u65F6\u8D70 tauri \u4FDD\u5B58\uFF08cancelled = \u7528\u6237\n * \u62D2\u7EDD\uFF0C\u7EDD\u4E0D\u56DE\u9000\u4E0B\u8F7D\uFF09\uFF1B\u5426\u5219\u8D70 Web \u4E0B\u8F7D\u3002\n */\nexport async function exportPresetFile(preset: Preset, io?: PresetIoEnv, envBlocklist?: string[]): Promise<ExportResult> {\n const env = io ?? makeIoEnv()\n try {\n const text = encodePresetExport(preset, envBlocklist)\n const filename = presetExportFilename(preset.name)\n if (env.tauri) {\n const out = await env.saveText(filename, text)\n if (out.kind === 'saved') return { ok: true, via: 'tauri' }\n if (out.kind === 'cancelled') return { ok: false, via: 'tauri', cancelled: true }\n // unavailable -> \u7EE7\u7EED\u8D70 Web \u4E0B\u8F7D\n }\n env.download(filename, text)\n return { ok: true, via: 'browser' }\n } catch (e) {\n return { ok: false, via: 'browser', message: e instanceof Error ? e.message : String(e) }\n }\n}\n\nexport type ImportResult = { kind: 'text'; text: string; via: 'tauri' } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\n/**\n * \u7ECF\u539F\u751F tauri \u6253\u5F00\u5BF9\u8BDD\u6846\u5BFC\u5165\u4E00\u4E2A\u9884\u8BBE\uFF1B\u8FD4\u56DE `unavailable` \u65F6\u7531\u8C03\u7528\u65B9\n * \u70B9\u51FB\u81EA\u5DF1\u7684\u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF08Web \u56DE\u9000\uFF09\u3002\n */\nexport async function importPresetFile(io?: PresetIoEnv): Promise<ImportResult> {\n const env = io ?? makeIoEnv()\n try {\n if (env.tauri) {\n const out = await env.openText()\n if (out.kind === 'text') return { kind: 'text', text: out.text, via: 'tauri' }\n if (out.kind === 'cancelled') return { kind: 'cancelled' }\n }\n } catch {\n /* \u843D\u5230\u4E0B\u9762\u7684\u9009\u62E9\u5668\u56DE\u9000 */\n }\n return { kind: 'unavailable' }\n}\n", "/**\n * PreviewPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u53F3\u680F\uFF08\u63D0\u793A\u8BCD / \u5DE5\u5177\u6A21\u5F0F\u5E38\u9A7B\uFF09\u3002\n *\n * \u53EA\u8BFB\u9884\u89C8\uFF0C\u6CA1\u6709\u4EFB\u4F55\u5207\u6362\u63A7\u4EF6\uFF1A\u770B\u63D0\u793A\u8BCD\u8FD8\u662F\u5DE5\u5177\u7531\u9876\u90E8\u6A21\u5F0F\u51B3\u5B9A\uFF08\u9009\u300C\u63D0\u793A\u8BCD\u300D\n * = \u63D0\u793A\u8BCD\u7F16\u8F91 + \u63D0\u793A\u8BCD\u9884\u89C8\uFF1B\u9009\u300C\u5DE5\u5177\u300D= \u5DE5\u5177\u7F16\u8F91 + \u5DE5\u5177\u9884\u89C8\uFF09\uFF0C\u9636\u6BB5\u7531\u5934\u90E8\n * \u7684\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u63A7\u5236\uFF08\u4E0E\u5DE6\u680F\u8054\u52A8\uFF09\u3002\u6570\u636E\u6765\u81EA Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\uFF0C\n * \u7F16\u8F91\u8349\u7A3F\u540E\u7531 Panel \u9632\u6296\u53E0\u52A0\u540C\u6B65 \u2014\u2014 \u6240\u89C1\u5373\u6A21\u578B\u6240\u89C1\u3002\u672C\u89C6\u56FE\u7EDD\u4E0D\u4FEE\u6539\u914D\u7F6E\u3002\n */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport { PreviewTools } from './PreviewTools.tsx'\n\n/** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\u3002 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\nexport function PreviewPane({ t, phases, phase, sub }: {\n t: Translate\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseViewKey\n /** \u63D0\u793A\u8BCD / \u5DE5\u5177\u5B50\u89C6\u56FE\uFF1A\u8DDF\u968F\u9876\u90E8\u6A21\u5F0F\uFF08\u65E0\u624B\u52A8\u5207\u6362\uFF09\u3002 */\n sub: 'prompt' | 'tools'\n}): ReactElement {\n const data = phases?.[phase] ?? null\n // \u6309\u5F53\u524D\u6240\u9009\u9636\u6BB5\u5224\u5B9A\u300C\u6BB5\u7EA7\u5B9A\u5236\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\u300D\uFF1A\u6709 complete \u6BB5\u6574\u6BB5\u63A5\u7BA1\u5C31\u8BF4\n // \u63A5\u7BA1\uFF0C\u5426\u5219\u63A2\u6D4B\u672C\u63D2\u4EF6\u4EA7\u51FA\u7684\u6BB5\u662F\u5426\u88AB\u4E0B\u6E38\u4E22\u5F03\uFF08\u4E22\u5F03\u89C4\u5219\u4E0D\u6B62\u4E00\u79CD\uFF09\u3002\n const lossNote = data === null || data === undefined ? null\n : data.takenOverBy !== undefined\n ? t('sectionsTakenOver', { name: data.takenOverBy })\n : data.lostSections !== undefined\n ? t('sectionsLost', { emitted: data.lostSections.emitted, survived: data.lostSections.survived })\n : null\n\n return h('div', { style: s.colRight }, [\n h('div', { style: s.colRightScroll }, [\n // \u8BE5\u9636\u6BB5\u7684\u672C\u63D2\u4EF6\u6BB5\u7EA7\u4EA7\u51FA\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\uFF08\u6574\u6BB5\u63A5\u7BA1\u6216\u88AB\u4E0B\u6E38\u4E22\u5F03\uFF09\u3002\n lossNote !== null ? h('div', { style: s.noticeWarn }, lossNote) : null,\n // scope \u6302\u8F7D\u5931\u8D25\u56DE\u9000\u5168\u5C40\u5C42\u65F6\u660E\u786E\u8B66\u793A\uFF1A\u8FD9\u4E0D\u662F\u8BE5\u9884\u8BBE\u7684\u539F\u751F\u88C5\u914D\u3002\n data !== null && data.scopeResolved === false\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n phases === null ? h('div', { style: s.muted }, t('loading')) : null,\n phases !== null && data === null\n ? h('div', { style: s.error }, t('previewFail'))\n : null,\n data ? h('div', { style: s.muted }, t('previewPreset')) : null,\n data?.diagnostics?.length ? h('div', { style: s.noticeWarn }, t('previewUnresolved', {\n names: [...new Set(data.diagnostics.map(item => `{{${item.variable}}}`))].join(', '),\n })) : null,\n sub === 'prompt'\n ? data\n ? [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewHint')),\n h('span', { style: s.orderTag }, `${data.sections.length} ${t('previewSections')}`),\n ]),\n h('pre', { style: s.previewText }, data.text || t('empty')),\n h('div', { style: s.rowTitle }, t('runtimeContexts')),\n ...(data.contexts ?? []).map(context => h('div', { key: context.name }, [\n h('div', { style: s.muted }, context.name),\n h('pre', { style: s.previewText }, context.text || t('empty')),\n ])),\n ]\n : null\n : data\n ? [\n // \u6A21\u578B\u89C6\u89D2 vs \u6CE8\u518C\u8868\u89C6\u89D2\u7684\u5BF9\u7167\uFF1A\u9884\u89C8\u6309\u6240\u9009\u9636\u6BB5\u8FD0\u884C\u5168\u90E8\u88C5\u914D\u89C4\u5219\n //\uFF08\u542B\u9884\u8BBE\u539F\u751F\u7684\u9636\u6BB5\u88C1\u526A\uFF09\uFF0C\u67D0\u4E9B\u9884\u8BBE\uFF08\u5982 PTC / Code Mode\uFF09\u4F1A\u628A\n // \u5B8C\u6574\u76EE\u5F55\u5305\u88C5\u6210\u5355\u4E00\u5DE5\u5177\uFF0C\u6CE8\u518C\u8868\u539F\u59CB\u76EE\u5F55\u4ECD\u5217\u5728\u5DE5\u5177\u5B50\u89C6\u56FE\u3002\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewToolsHint')),\n h('span', { style: s.orderTag },\n `${data.tools.length} / ${data.registryTotal ?? '?'} ${t('previewToolsCount')}`),\n ]),\n h(PreviewTools, { tools: data.tools, t }),\n ]\n : null,\n ]),\n ])\n}\n", "/** \u5DE5\u5177\u9884\u89C8\uFF1A\u5F53\u524D\u5B9A\u5236\uFF08\u9ED1\u540D\u5355\u8FC7\u6EE4\u4E4B\u540E\uFF09\u6700\u7EC8\u5BF9\u6A21\u578B\u53EF\u89C1\u7684\u5DE5\u5177\u76EE\u5F55\uFF0C\n * \u53EA\u8BFB\u3001\u6E05\u5355\u5F0F\u5448\u73B0\uFF1A\u5217\u51FA\u5373\u4EE3\u8868\u6A21\u578B\u770B\u5F97\u89C1 \u2014\u2014 \u8FD9\u91CC\u6CA1\u6709\u300C\u5DF2\u5C4F\u853D\u300D\u72B6\u6001\u3002\n * \u672C\u89C6\u56FE\u7EDD\u4E0D\u4FEE\u6539\u9ED1\u540D\u5355\u914D\u7F6E\u3002 */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\n\n/** \u9884\u89C8\u5DE5\u5177\u6761\u76EE\uFF1A\u5BF9\u8C61\u5F62\u6001\u6216\u7EAF\u5B57\u7B26\u4E32\u5DE5\u5177\u540D\uFF08\u7EDF\u4E00\u5F52\u4E00\u5316\u4E3A\u5BF9\u8C61\uFF09\u3002 */\nexport type PreviewTool = { name: string; description: string } | string\n\n/** \u628A\u5B57\u7B26\u4E32\u5F62\u6001\u7684\u6761\u76EE\u8865\u5168\u4E3A { name, description: '' }\u3002 */\n\nfunction norm(tool: PreviewTool): { name: string; description: string } {\n return typeof tool === 'string' ? { name: tool, description: '' } : tool\n}\n\nexport function PreviewTools({ tools, t }: { tools: PreviewTool[]; t: Translate }): ReactElement {\n if (tools.length === 0) return h('div', { style: s.muted }, t('empty'))\n return h('div', { style: s.list }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.orderTag }, `${tools.length} ${t('previewToolCount')}`),\n ]),\n tools.map((tool) => {\n const { name, description } = norm(tool)\n return h('div', { key: name, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, name)),\n h('div', { style: s.preview }, String(description ?? '').slice(0, 140)),\n ]),\n ])\n }),\n ])\n}\n", "/** Locale dictionaries for the prompt-customizer panel. */\nexport const DICT = {\n zh: {\n nav: '\u63D0\u793A\u8BCD\u5B9A\u5236',\n previewPreset: '\u6765\u6E90\uFF1A\u5F53\u524D\u6A21\u5F0F\u9884\u8BBE\u3002\u63D0\u793A\u8BCD\u3001\u5DE5\u5177\u53CA\u987A\u5E8F\u6309\u6B64\u9884\u8BBE\u72EC\u7ACB\u88C5\u914D\uFF0C\u4E0D\u5339\u914D\u6216\u66F4\u6539\u5DF2\u6709\u5BF9\u8BDD\u3002',\n previewUnresolved: '\u4F1A\u8BDD\u53D8\u91CF {names} \u5C1A\u672A\u7ED1\u5B9A\uFF0C\u4FDD\u7559\u6A21\u677F\u5F15\u7528\uFF1B\u63D0\u793A\u8BCD\u4E0E\u5DE5\u5177\u76EE\u5F55\u4ECD\u53EF\u67E5\u770B\u548C\u7F16\u8F91\u3002',\n runtimeContexts: '\u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\uFF08user-role \u5FEB\u7167\uFF0C\u53EA\u8BFB\uFF0C\u4E0D\u5C5E\u4E8E system \u63D0\u793A\u8BCD\u6BB5\uFF09',\n loading: '\u52A0\u8F7D\u4E2D\u2026',\n unavailable: '\u5F53\u524D\u73AF\u5883\u672A\u542F\u7528\u672C\u547D\u540D\u7A7A\u95F4\u3002',\n tabsSections: '\u63D0\u793A\u8BCD',\n tabsTools: '\u5DE5\u5177',\n tabsPresets: '\u914D\u7F6E',\n tabsPreview: '\u9884\u89C8',\n refresh: '\u5237\u65B0',\n blockedOff: '\u672A\u5C4F\u853D',\n blockedOn: '\u5DF2\u5C4F\u853D',\n replaced: '\u5DF2\u66FF\u6362',\n manual: '\u624B\u52A8',\n system: '\u7CFB\u7EDF',\n replace: '\u7F16\u8F91',\n clearReplace: '\u6E05\u9664',\n clearInput: '\u6E05\u7A7A',\n injectNew: '\u6CE8\u5165\u65B0\u6BB5',\n name: '\u540D\u79F0',\n order: '\u987A\u5E8F',\n text: '\u6587\u672C',\n add: '\u6DFB\u52A0',\n hiddenOff: '\u53EF\u89C1',\n hiddenOn: '\u5DF2\u9690\u85CF',\n selectAll: '\u5168\u9009',\n selectNone: '\u5168\u4E0D\u9009',\n empty: '\uFF08\u7A7A\uFF09',\n dynamic: '<\u52A8\u6001\u751F\u6210>',\n drag: '\u62D6\u52A8\u6392\u5E8F',\n moveUp: '\u4E0A\u79FB',\n moveDown: '\u4E0B\u79FB',\n previewHint: '\u4EE5\u4E0B\u4E3A\u5C4F\u853D/\u66FF\u6362/\u6CE8\u5165\u540E\u7684\u6700\u7EC8\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF1A',\n previewPrompt: '\u63D0\u793A\u8BCD\u9884\u89C8',\n previewSections: '\u6BB5',\n previewTools: '\u5DE5\u5177\u9884\u89C8',\n previewToolCount: '\u4E2A\u5DE5\u5177',\n savePreset: '\u4FDD\u5B58\u5F53\u524D\u914D\u7F6E',\n presetName: '\u914D\u7F6E\u540D\u79F0',\n saveAsPresetCard: '\u5B58\u4E3A agent \u9884\u8BBE',\n saveAsPresetHint: '\u6574\u4F53\u590D\u5236\u300C{name}\u300D\u8FD9\u4E2A\u9884\u8BBE\u7684\u7EC4\u6210\u4E3A\u65B0\u9884\u8BBE\uFF08\u7EC4\u6210\u6587\u4EF6\u4E0E\u4F34\u751F\u811A\u672C\u4E00\u5E76\u5E26\u8D70\uFF09\uFF0C\u518D\u628A\u5F53\u524D\u5B9A\u5236\u5199\u8FDB\u5B83\u7684\u8986\u76D6\u9879 \u2014\u2014 \u65B0\u9884\u8BBE\u51FA\u73B0\u5728\u9876\u90E8\u7F16\u8F91\u76EE\u6807\u91CC\u3002',\n agentPresetName: '\u65B0\u9884\u8BBE\u540D',\n forkSourceDefault: '\u9ED8\u8BA4\u9884\u8BBE',\n saveAsPresetOk: '\u9884\u8BBE\u5DF2\u521B\u5EFA\uFF0C\u53EF\u5728\u9876\u90E8\u7684\u7F16\u8F91\u76EE\u6807\u9009\u62E9\u5668\u91CC\u9009\u5230\u5B83',\n saveAsPresetFail: '\u4FDD\u5B58\u9884\u8BBE\u5931\u8D25',\n save: '\u4FDD\u5B58',\n importPreset: '\u5BFC\u5165\u914D\u7F6E',\n import: '\u5BFC\u5165',\n apply: '\u5E94\u7528',\n export: '\u5BFC\u51FA',\n delete: '\u5220\u9664',\n restore: '\u8FD8\u539F',\n active: '\u4F7F\u7528\u4E2D',\n preset: '\u9884\u8BBE',\n ioFailed: '\u5BFC\u5165/\u5BFC\u51FA\u5931\u8D25',\n importInvalid: '\u65E0\u6548\u7684\u914D\u7F6E\u6587\u4EF6',\n targetGlobal: '\u76EE\u6807\uFF1A\u5168\u5C40\u9ED8\u8BA4',\n targetHint: '\u9009\u62E9\u8981\u5B9A\u5236\u7684 agent \u9884\u8BBE \u2014\u2014 \u63D0\u793A\u8BCD\u5FC5\u987B\u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF1A\u672A\u5B9A\u5236\u7684\u5B57\u6BB5 = \u5B98\u65B9\u9ED8\u8BA4\uFF0C\u6539\u52A8\u53EA\u5BF9\u8BE5\u9884\u8BBE\u751F\u6548\uFF080.9.0 \u8D77\u300C\u5168\u90E8 Agent\u300D\u5168\u5C40\u5C42\u5DF2\u505C\u7528\uFF09\u3002',\n syncAllPhases: '\u4E09\u6001\u540C\u6B65',\n syncAllPhasesHint: '\u52FE\u9009\u540E\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u6BB5\u5217\u8868\uFF08\u5E38\u9A7B\u671F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF0C\u540C\u540D\u6BB5\u4EE5\u539F\u751F\u90A3\u9636\u6BB5\u4E3A\u51C6\uFF09\uFF0C\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF1B\u52FE\u9009\u77AC\u95F4\u5373\u6309\u5E38\u9A7B\u671F\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF08\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\u3002\u5DE5\u5177\u680F\u7684\u9690\u85CF / \u663E\u793A\u4E0E\u52A0\u56DE\u540C\u6837\u5BF9\u4E09\u6001\u4E00\u8D77\u751F\u6548\u3002\u9ED8\u8BA4\u5173\u95ED\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5404\u7BA1\u5404\u7684\u3002',\n syncApplied: '\u5DF2\u6309\u5E38\u9A7B\u671F\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF1A\u4E09\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u6BB5\u5217\u8868\u4E0E\u6587\u672C\uFF08\u5199\u5165\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\u3002',\n syncNotReady: '\u4E09\u9636\u6BB5\u88C5\u914D\u672A\u5C31\u7EEA\uFF08\u6216\u4E3A\u7A7A\uFF09\uFF0C\u65E0\u6CD5\u6267\u884C\u4E09\u6001\u540C\u6B65 \u2014\u2014 \u8BF7\u70B9\u300C\u5237\u65B0\u300D\u91CD\u8BD5\u3002',\n syncSkippedDynamic: '\u300C{names}\u300D\u662F\u8FD0\u884C\u65F6\u52A8\u6001\u6BB5\uFF0C\u65E0\u6CD5\u52A0\u5165\u5176\u5B83\u9636\u6BB5\uFF08\u5B83\u7684\u5185\u5BB9\u53EA\u6709\u88C5\u914D\u65F6\u624D\u77E5\u9053\uFF09\u3002',\n broken: '\u635F\u574F',\n brokenPreset: '\u8BE5 agent \u9884\u8BBE\u5F53\u524D\u65E0\u6CD5\u6302\u8F7D\uFF0C\u4ECD\u53EF\u7F16\u8F91\u5176\u5B9A\u5236\uFF08\u4FEE\u590D\u9884\u8BBE\u540E\u81EA\u52A8\u751F\u6548\uFF09\u3002',\n phaseBootstrap: '\u4EC5\u5F15\u5BFC\u9636\u6BB5',\n phaseActive: '\u664B\u7EA7\u540E',\n phaseCompaction: '\u538B\u7F29\u540E',\n // agent \u5468\u671F\u4E09\u9636\u6BB5\u7684\u5C55\u793A\u547D\u540D\uFF08\u5F15\u5BFC\u671F \u2192 \u5E38\u9A7B\u671F \u2192 \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002\n phaseStageGuide: '\u5F15\u5BFC\u671F',\n phaseStageResident: '\u5E38\u9A7B\u671F',\n phaseStageControlled: '\u538B\u7F29\u53D7\u63A7\u671F',\n toolsPartGuide: '\u5F15\u5BFC\u671F\u5DE5\u5177',\n toolsPartResident: '\u5E38\u9A7B\u671F\u5DE5\u5177',\n toolsPartControlled: '\u538B\u7F29\u53D7\u63A7\u671F\u5DE5\u5177',\n allToolsTitle: '\u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177',\n sectionsPartGuide: '\u5F15\u5BFC\u671F\u63D0\u793A\u8BCD',\n sectionsPartResident: '\u5E38\u9A7B\u671F\u63D0\u793A\u8BCD',\n sectionsPartControlled: '\u538B\u7F29\u53D7\u63A7\u671F\u63D0\u793A\u8BCD',\n allSectionsTitle: '\u672C\u7CFB\u7EDF\u5168\u90E8\u63D0\u793A\u8BCD',\n toolsFourHint: '\u4E09\u4E2A\u9636\u6BB5\u5404\u4E00\u4EFD\u540D\u5355\uFF0C\u4E92\u4E0D\u7EE7\u627F\uFF1A\u52FE\u9009 = \u8BE5\u9636\u6BB5\u662F\u5426\u5BF9\u6A21\u578B\u53EF\u89C1\uFF1B\u4ECE\u300C\u5168\u90E8\u300D\u62D6\u5165\u67D0\u9636\u6BB5 = \u8BA9\u8FD9\u4E00\u4E2A\u5DE5\u5177\u5728\u8BE5\u9636\u6BB5\u51FA\u73B0\uFF08\u82E5\u8BE5\u9636\u6BB5\u9ED8\u8BA4\u88C1\u6389\u4E86\u5B83\uFF0C\u5C31\u52A0\u56DE\u53BB\uFF09\uFF1B\u5728\u4E24\u4E2A\u9636\u6BB5\u4E4B\u95F4\u62D6\u52A8\uFF08\u62D6\u5230\u4E0A\u65B9\u9636\u6BB5\u6309\u94AE\uFF09= \u590D\u5236\uFF08\u6E90\u9636\u6BB5\u4E0D\u52A8\uFF0C\u76EE\u6807\u9636\u6BB5\u591A\u4E00\u4EFD\uFF0C\u9690\u85CF/\u542F\u7528\u72B6\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF09\uFF1B\u62D6\u56DE\u300C\u5168\u90E8\u300D= \u4ECE\u8BE5\u9636\u6BB5\u62FF\u6389\u5B83\u3002\u6BCF\u4E2A\u52A8\u4F5C\u53EA\u5F71\u54CD\u88AB\u62D6\u7684\u90A3\u4E00\u4E2A\u5DE5\u5177\u3002',\n sectionsFourHint: '\u62D6\u62FD\u53CC\u5411\uFF1A\u628A\u300C\u5168\u90E8\u300D\u91CC\u7684\u6BB5\u62D6\u8FDB\u4E0A\u65B9\u5217\u8868 = \u52A0\u5165\u8BE5\u9636\u6BB5\u5E76\u9ED8\u8BA4\u5F00\u542F\uFF1B\u4ECE\u9636\u6BB5\u62D6\u56DE\u300C\u5168\u90E8\u300D= \u4ECE\u8BE5\u9636\u6BB5\u79FB\u9664\uFF08\u539F\u751F\u6BB5\u8F6C\u4E3A\u5C4F\u853D\uFF09\u3002\u540C\u4E00\u4E2A\u9636\u6BB5\u91CC\u62D6\u52A8\u884C\u6293\u624B = \u6392\u5E8F\uFF1B\u62D6\u5230\u4E0A\u65B9\u7684\u9636\u6BB5\u6309\u94AE = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\u3002\u5C4F\u853D\u6BB5\u4E0E\u666E\u901A\u6BB5\u5B8C\u5168\u4E00\u6837\u53EF\u62D6\u62FD / \u7F16\u8F91\uFF0C\u53EA\u662F\u4E0D\u6CE8\u5165\u6A21\u578B\u3002',\n dragHint: '\u62D6\u5165 = \u8BA9\u8BE5\u5DE5\u5177\u5728\u8FD9\u4E2A\u9636\u6BB5\u51FA\u73B0',\n poolMarksHint: '\u6BCF\u4E2A\u540D\u5B57\u540E\u7684\u4E09\u4E2A\u6807\u8BB0 = \u8BE5\u5DE5\u5177\u5728\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\u7684\u72B6\u6001\uFF1A\u7EFF=\u8BE5\u9636\u6BB5\u53EF\u89C1\uFF08\u6216\u5DF2\u52A0\u56DE\uFF09\uFF0C\u7070=\u8BE5\u9636\u6BB5\u5DF2\u9690\u85CF\uFF0C\u6697=\u4E0D\u5728\u8BE5\u9636\u6BB5\u3001\u4E5F\u6CA1\u52A0\u56DE\u3002',\n toolAddedTag: '\u52A0\u56DE',\n toolAdded: '\u5DF2\u628A\u300C{name}\u300D\u52A0\u56DE{phase}\uFF1A\u8BE5\u9636\u6BB5\u9ED8\u8BA4\u88C1\u6389\u4E86\u5B83\uFF0C\u4FDD\u5B58\u540E\u5B83\u4F1A\u91CD\u65B0\u51FA\u73B0\u5728\u8BE5\u9636\u6BB5\uFF08\u5F53\u524D\u9884\u8BBE\u6CE8\u518C\u8868\u91CC\u6709\u5B83\uFF09\u3002',\n toolNotInRegistry: '\u300C{name}\u300D\u4E0D\u5728\u672C\u9884\u8BBE\u7684\u6CE8\u518C\u8868\u91CC\uFF08\u5B83\u662F\u522B\u7684\u9884\u8BBE\u72EC\u6709\u7684\u5DE5\u5177\uFF09\uFF0C\u5F53\u524D\u9884\u8BBE\u6CA1\u6709\u5B83\u7684\u5B9A\u4E49\uFF0C\u52A0\u4E0D\u8FDB\u6765\u3002',\n toolCopied: '\u5DF2\u628A\u300C{name}\u300D\u590D\u5236\u5230{to}\uFF1A{from}\u90A3\u4EFD\u4FDD\u6301\u4E0D\u52A8\uFF0C\u9690\u85CF/\u542F\u7528\u72B6\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\u3002',\n toolRemovedFromPhase: '\u5DF2\u628A\u300C{name}\u300D\u4ECE{from}\u62FF\u6389\uFF1A\u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\uFF0C\u539F\u751F\u5DE5\u5177\u5219\u5728\u8BE5\u9636\u6BB5\u9690\u85CF\uFF08\u4ECD\u53EF\u5728\u8FD9\u91CC\u53CD\u9009\u56DE\u6765\uFF09\u3002',\n sectionCopied: '\u5DF2\u628A\u300C{name}\u300D\u590D\u5236\u5230{to}\uFF08\u6E90{from}\u4FDD\u6301\u4E0D\u52A8\uFF09\uFF1A\u65B0\u9636\u6BB5\u91CC\u5B83\u662F\u5F00\u542F\u7684\uFF0C\u53EF\u7EE7\u7EED\u7F16\u8F91\u6587\u672C\u6216\u62D6\u52A8\u6392\u5E8F\u3002',\n sectionRemoved: '\u5DF2\u628A\u300C{name}\u300D\u4ECE{from}\u62FF\u6389\uFF1A\u65B0\u52A0\u5165\u7684\u64A4\u9500\u52A0\u5165\uFF0C\u539F\u751F\u6BB5\u5219\u8F6C\u4E3A\u5C4F\u853D\uFF08\u53EF\u52FE\u9009\u56DE\u6765\uFF09\u3002',\n toolShown: '\u300C{name}\u300D\u5DF2\u5728{to}\u663E\u793A\u3002',\n toolHiddenIn: '\u300C{name}\u300D\u5DF2\u5728{to}\u9690\u85CF\u3002',\n toolSyncShown: '\u300C{name}\u300D\u5DF2\u5728\u4E09\u4E2A\u9636\u6BB5\u663E\u793A\uFF08\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u6CA1\u6709\u7684\u5DF2\u5199\u8FDB\u5404\u81EA\u7684\u52A0\u56DE\u540D\u5355\uFF09\u3002',\n toolSyncHidden: '\u300C{name}\u300D\u5DF2\u5728\u4E09\u4E2A\u9636\u6BB5\u9690\u85CF / \u79FB\u9664\u3002',\n sectionsTakenOver: '\u300C{name}\u300D\u6BB5\u58F0\u660E\u4E86 complete \u6574\u6BB5\u63A5\u7BA1\uFF08\u5BBF\u4E3B\u5728\u88C5\u914D\u7011\u5E03\u6D41\u4E4B\u540E\u5F3A\u5236\u8FD8\u539F\u4E3A\u90A3\u4E00\u6761\u6BB5\uFF09\u3002\u672C\u63D2\u4EF6\u9ED8\u8BA4\u7684 forceSections \u5DF2\u7ED5\u5F00\u8BE5\u673A\u5236\uFF0C\u6BB5\u7EA7\u5C4F\u853D / \u66FF\u6362 / \u6CE8\u5165 / \u6392\u5E8F\u7167\u5E38\u751F\u6548\uFF1B\u6B64\u63D0\u793A\u53EA\u4F1A\u5728 forceSections \u5173\u95ED\u6216\u5F3A\u5236\u8986\u76D6\u5931\u6548\u65F6\u51FA\u73B0\uFF0C\u5F00\u542F forceSections \u5373\u53EF\u6062\u590D\u3002',\n sectionsLost: '\u672C\u63D2\u4EF6\u5728\u8BE5\u9636\u6BB5\u4EA7\u51FA\u7684 {emitted} \u4E2A\u6BB5\u91CC\uFF0C\u53EA\u6709 {survived} \u4E2A\u8FDB\u5165\u6700\u7EC8\u63D0\u793A\u8BCD\uFF1A\u5176\u4F59\u88AB\u4E0B\u6E38\u88C5\u914D\u89C4\u5219\u4E22\u5F03\uFF0C\u6BB5\u7EA7\u5B9A\u5236\u4E0D\u4F1A\u5B8C\u5168\u751F\u6548\uFF08\u5DE5\u5177\u8FC7\u6EE4\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002',\n sectionBlockedStrip: '\uFF08\u672C\u9636\u6BB5\u5DF2\u5C4F\u853D\uFF0C\u6A21\u578B\u4E0D\u53EF\u89C1\uFF09',\n phaseSuppressed: '\u88AB\u6291\u5236\uFF08\u4E0D\u5728\u4EFB\u4F55\u9636\u6BB5\u7684\u88C5\u914D\u4E2D\uFF09',\n sectionDynamicNoAdd: '\u300C{name}\u300D\u662F\u8FD0\u884C\u65F6\u624D\u751F\u6210\u7684\u52A8\u6001\u6BB5\uFF0C\u6CA1\u6CD5\u9884\u5148\u52A0\u8FDB\u67D0\u4E2A\u9636\u6BB5\uFF08\u5B83\u7684\u5185\u5BB9\u53EA\u6709\u88C5\u914D\u65F6\u624D\u77E5\u9053\uFF09\u3002',\n exportOk: '\u5BFC\u51FA\u6210\u529F',\n exportCancel: '\u5DF2\u53D6\u6D88\u5BFC\u51FA',\n exportFail: '\u5BFC\u51FA\u5931\u8D25',\n importOk: '\u5BFC\u5165\u5B8C\u6210',\n importNone: '\u6CA1\u6709\u65B0\u589E\u9884\u8BBE\uFF08\u540C\u540D\u5DF2\u5B58\u5728\u6216\u6587\u4EF6\u4E3A\u7A7A\uFF09',\n importCancel: '\u5DF2\u53D6\u6D88\u5BFC\u5165',\n importFail: '\u5BFC\u5165\u5931\u8D25',\n saveOk: '\u5DF2\u4FDD\u5B58',\n saveFail: '\u4FDD\u5B58\u5931\u8D25',\n discardConfirm: '\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539\uFF0C\u79BB\u5F00\u5C06\u4E22\u5F03\u3002\u786E\u5B9A\u79BB\u5F00\u5417\uFF1F',\n forceTitle: '\u5F3A\u5236\u8986\u76D6\uFF08forceSections\uFF09',\n forceHint: '\u5F00\u542F\u540E\u6240\u6709\u9884\u8BBE\u7684\u63D0\u793A\u8BCD\u6BB5\u4E00\u5F8B\u4EE5\u672C\u63D2\u4EF6\u4E3A\u51C6\uFF08\u7ED5\u8FC7 complete \u6574\u6BB5\u63A5\u7BA1\u4E0E\u9884\u8BBE\u9636\u6BB5\u88C1\u6BB5\uFF09\uFF1B\u5173\u95ED\u540E\u9000\u56DE\u7011\u5E03\u6D41\u5185\u8FC7\u6EE4\uFF0C\u9884\u8BBE\u53EF\u80FD\u538B\u8FC7\u5B9A\u5236\u3002\u300C\u6062\u590D\u521D\u59CB\u72B6\u6001\u300D\u4F1A\u81EA\u52A8\u5173\u95ED\u5B83\u3002',\n forceOn: '\u5DF2\u5F00\u542F',\n forceOff: '\u5DF2\u5173\u95ED',\n zhSwitch: '\u4E2D\u6587\u63D0\u793A\u8BCD',\n zhHint: '\u5F00\u5173\u3002\u5F00\u542F\uFF1A\u628A\u540D\u5B57\u5BF9\u5F97\u4E0A\u8BD1\u672C\u7684\u6BB5\u4E00\u6B21\u6027\u8986\u76D6\u4E3A\u4E2D\u6587\uFF08\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u4FDD\u5B58\u540E\u751F\u6548\uFF09\uFF1B\u5173\u95ED\uFF1A\u6E05\u9664\u8FD9\u4E9B\u6BB5\u7684\u66FF\u6362\u6587\u672C\uFF0C\u56DE\u5F52\u82F1\u6587\u539F\u6587\u3002\u81EA\u5B9A\u4E49\u6BB5\u4E0E\u5BF9\u4E0D\u4E0A\u540D\u5B57\u7684\u6BB5\u4E0D\u53D7\u5F71\u54CD\u3002',\n zhApplied: '\u5DF2\u628A\u4E2D\u6587\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF1A\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF1B\u5BF9\u4E0D\u4E0A\u540D\u5B57\u7684\u6BB5\u4FDD\u6301\u539F\u6837\u3002',\n zhReverted: '\u5DF2\u628A\u82F1\u6587\u539F\u6587\u5199\u56DE\u7F16\u8F91\u8349\u7A3F\uFF08\u6E05\u9664\u4E2D\u6587\u66FF\u6362\uFF09\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\u3002',\n zhNotReady: '\u4E09\u9636\u6BB5\u88C5\u914D\u5C1A\u672A\u52A0\u8F7D\u5B8C\u6210\uFF0C\u8BF7\u5148\u70B9\u300C\u5237\u65B0\u300D\u6216\u7A0D\u540E\u518D\u8BD5\u3002',\n envBlockTitle: '\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF08envBlocklist\uFF09',\n envBlockHint: '\u7CFB\u7EDF\u73AF\u5883\u53D8\u91CF\uFF08process.env\uFF09\u5DF2\u5168\u91CF\u6CE8\u518C\u4E3A\u63D0\u793A\u8BCD\u53D8\u91CF\uFF1A\u6BB5\u6587\u672C\u91CC\u5199 {{env_\u952E\u540D\u5C0F\u5199}} \u5F15\u7528\uFF08\u5982 {{env_path}}\uFF09\uFF1B\u547D\u4E2D\u9ED1\u540D\u5355\u7684\u952E\u4E0D\u6CE8\u518C\u2014\u2014env \u91CC\u5E38\u6709\u5BC6\u94A5\uFF0C\u8FDB\u4E86\u63D0\u793A\u8BCD\u5C31\u4F1A\u968F\u8BF7\u6C42\u53D1\u7ED9\u6A21\u578B\u3002\u6761\u76EE\u652F\u6301 * \u901A\u914D\u3001\u5927\u5C0F\u5199\u4E0D\u654F\u611F\u3002\u5185\u7F6E\u53D8\u91CF {{date}} {{time}} {{datetime}} {{weekday}} {{hostname}} {{platform}} {{arch}} {{username}} {{home}} {{shell}} {{locale}} {{node_version}} \u6052\u53EF\u7528\u3002',\n envBlockAdd: '\u952E\u540D\u6216\u901A\u914D\uFF0C\u5982 GITHUB_TOKEN \u6216 *_KEY*',\n envBlockAddAction: '\u6DFB\u52A0',\n envBlockEmpty: '\u9ED1\u540D\u5355\u4E3A\u7A7A\uFF1A\u6240\u6709\u73AF\u5883\u53D8\u91CF\u90FD\u4F1A\u88AB\u6CE8\u518C',\n envVarsTitle: '\u5DF2\u6CE8\u518C\u7684\u63D0\u793A\u8BCD\u53D8\u91CF',\n envVarsHint: '\u6BB5\u6587\u672C\u91CC\u5F15\u7528 {{\u53D8\u91CF\u540D}}\uFF1B\u5F15\u7528\u672A\u6CE8\u518C\u7684\u540D\u5B57\u4F1A\u8BA9\u6574\u6B21\u6E32\u67D3\u62A5\u9519\uFF08\u5BBF\u4E3B\u4E25\u683C\u6A21\u5F0F\uFF09\u3002',\n importBlockMerge: '\uFF0C\u6587\u4EF6\u4E2D\u7684\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u5DF2\u5E76\u5165\uFF08+{count} \u6761\uFF09',\n resetTitle: '\u6062\u590D\u521D\u59CB\u72B6\u6001',\n resetHint: '\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\uFF08\u5C4F\u853D / \u66FF\u6362 / \u6CE8\u5165 / \u6392\u5E8F\u3001\u9636\u6BB5\u5DE5\u5177\u76EE\u5F55\u3001\u914D\u7F6E\u5FEB\u7167\u3001agent \u9884\u8BBE\u8986\u76D6\uFF09\uFF0C\u5E76\u5173\u95ED forceSections \u2014\u2014 \u4E4B\u540E\u6240\u6709 AI \u5BF9\u8BDD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD\uFF0C\u4E0E\u5378\u8F7D\u63D2\u4EF6\u7B49\u6548\uFF0C\u65E0\u9700\u5378\u8F7D\u6216\u91CD\u542F\u3002\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\uFF1B\u8981\u91CD\u65B0\u542F\u7528\u5B9A\u5236\uFF0C\u5728\u4E0A\u65B9\u6253\u5F00\u300C\u5F3A\u5236\u8986\u76D6\u300D\u5F00\u5173\u5373\u53EF\u3002',\n resetConfirm: '\u786E\u5B9A\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u6062\u590D\u521D\u59CB\u72B6\u6001\u5417\uFF1F\\n\\n\u5C06\u5220\u9664\uFF1A\u5C4F\u853D\u540D\u5355\u3001\u6BB5\u66FF\u6362\u3001\u6CE8\u5165\u6BB5\u3001\u9636\u6BB5\u5DE5\u5177\u76EE\u5F55\u3001\u914D\u7F6E\u5FEB\u7167\u3001agent \u9884\u8BBE\u8986\u76D6\uFF1B\u5E76\u5173\u95ED forceSections\u3002\\n\u4E4B\u540E\u6240\u6709 AI \u5BF9\u8BDD\u90FD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD\uFF08\u4E0E\u5378\u8F7D\u63D2\u4EF6\u7B49\u6548\uFF09\u3002\\n\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\u3002',\n resetAction: '\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236',\n resetOk: '\u5DF2\u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u6240\u6709 AI \u5BF9\u8BDD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD',\n resetFail: '\u6062\u590D\u521D\u59CB\u72B6\u6001\u5931\u8D25',\n scopeFallback: '\u8BE5 agent \u9884\u8BBE\u7684\u5E38\u9A7B scope \u672A\u80FD\u6302\u8F7D\uFF0C\u4EE5\u4E0B\u663E\u793A\u7684\u662F\u5168\u5C40\u5C42\u5185\u5BB9\uFF08\u5E76\u975E\u8BE5\u9884\u8BBE\u7684\u539F\u751F\u6BB5\u4E0E\u5DE5\u5177\uFF09\u3002',\n previewFail: '\u8BE5\u9636\u6BB5\u88C5\u914D\u5931\u8D25\uFF08scope \u6302\u8F7D\u5931\u8D25\u6216\u9884\u8BBE\u63D2\u4EF6\u5F02\u5E38\uFF09\uFF0C\u8BF7\u5207\u6362\u76EE\u6807\u6216\u67E5\u770B\u670D\u52A1\u65E5\u5FD7\u3002',\n phaseVisible: '\u9636\u6BB5\u53EF\u89C1',\n previewToolsHint: '\u6A21\u578B\u5B9E\u9645\u53EF\u89C1\u7684\u5DE5\u5177\u76EE\u5F55\uFF08\u6309\u6240\u9009\u9636\u6BB5\u8FD0\u884C\u9884\u8BBE\u7684\u5168\u90E8\u88C5\u914D\u89C4\u5219\uFF0C\u542B\u539F\u751F\u9636\u6BB5\u88C1\u526A\uFF09\uFF1A',\n previewToolsCount: '\u6CE8\u518C\u8868',\n saveAsPreset: '\u5B58\u4E3A\u9884\u8BBE',\n // \u72EC\u7ACB\u9762\u677F\uFF08\u4FA7\u8FB9\u680F\u5165\u53E3 + \u62BD\u5C49\u5206\u680F\uFF09\u65B0\u589E\u3002\n navShort: '\u63D0\u793A\u8BCD',\n close: '\u5173\u95ED',\n filterAll: '\u5168\u90E8',\n filterOn: '\u5DF2\u542F\u7528',\n filterOff: '\u5DF2\u505C\u7528',\n targetLabel: '\u7F16\u8F91\u76EE\u6807\uFF08Agent \u9884\u8BBE\uFF09',\n targetCustomized: '\u8BE5\u9884\u8BBE {n} \u9879\u5B9A\u5236',\n agentScoped: '\u4F1A\u8BDD\u7EA7',\n agentScopedHint: '\u8FD9\u4E00\u6BB5\u7531\u63D2\u4EF6\u5728 agent \u81EA\u5DF1\u7684\u4F5C\u7528\u57DF\u91CC\u6CE8\u518C\uFF08\u4E0D\u662F\u672C\u9884\u8BBE scope \u7684\u6CE8\u518C\u8868\u9879\uFF09\uFF1A\u9762\u677F\u7684\u9884\u89C8\u88C5\u914D\u770B\u4E0D\u5230\u5B83\uFF0C\u4F46\u6BCF\u4E2A\u771F\u5B9E\u4F1A\u8BDD\u7684\u63D0\u793A\u8BCD\u91CC\u90FD\u6709\u5B83\u3002\u5B83\u9ED8\u8BA4\u5C31\u5728\u63D0\u793A\u8BCD\u91CC\uFF0C\u6240\u4EE5\u53EF\u4EE5\u50CF\u666E\u901A\u6BB5\u4E00\u6837\u5C4F\u853D / \u66FF\u6362 / \u6392\u5E8F \u2014\u2014 \u60F3\u8BA9\u5B83\u53D8\u4E2D\u6587\uFF0C\u7528\u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u5173\u6216\u624B\u52A8\u66FF\u6362\u90FD\u884C\u3002',\n settingsTitle: '\u5168\u5C40\u8BBE\u7F6E',\n libraryTitle: '\u914D\u7F6E\u5FEB\u7167\u5E93',\n draftBadge: '\u9884\u89C8\u542B\u672A\u4FDD\u5B58\u8349\u7A3F',\n previewSyncFail: '\u5B9E\u65F6\u9884\u89C8\u540C\u6B65\u5931\u8D25\uFF08\u4E0B\u6B21\u7F16\u8F91\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF0C\u6216\u70B9\u300C\u5237\u65B0\u300D\uFF09',\n },\n en: {\n nav: 'Prompt Customizer',\n previewPreset: 'Source: selected mode preset. Sections, tools and ordering are assembled independently; existing conversations are neither matched nor changed.',\n previewUnresolved: 'Session variables {names} are not bound and remain template references. Sections and tools are still available for editing.',\n runtimeContexts: 'Runtime context (read-only user-role snapshot, separate from system sections)',\n loading: 'Loading\u2026',\n unavailable: 'Namespace unavailable in this environment.',\n tabsSections: 'Sections',\n tabsTools: 'Tools',\n tabsPresets: 'Presets',\n tabsPreview: 'Preview',\n refresh: 'Refresh',\n blockedOff: 'Active',\n blockedOn: 'Blocked',\n replaced: 'Replaced',\n manual: 'Manual',\n system: 'System',\n replace: 'Replace',\n clearReplace: 'Clear',\n clearInput: 'Clear',\n injectNew: 'Inject section',\n name: 'Name',\n order: 'Order',\n text: 'Text',\n add: 'Add',\n hiddenOff: 'Visible',\n hiddenOn: 'Hidden',\n selectAll: 'Select all',\n selectNone: 'Select none',\n empty: '(empty)',\n dynamic: '<dynamic>',\n drag: 'Drag to reorder',\n moveUp: 'Move up',\n moveDown: 'Move down',\n previewHint: 'Final system prompt after block/replace/inject:',\n previewPrompt: 'Prompt preview',\n previewSections: 'sections',\n previewTools: 'Tools preview',\n previewToolCount: 'tools',\n savePreset: 'Save current config',\n presetName: 'Config name',\n saveAsPresetCard: 'Save as agent preset',\n saveAsPresetHint: 'Copy the whole \"{name}\" preset into a new one (composition plus its companion scripts), then write the current customization into its override \u2014 the new preset shows up in the target selector above.',\n agentPresetName: 'New preset name',\n forkSourceDefault: 'the default preset',\n saveAsPresetOk: 'Preset created \u2014 pick it in the target selector above',\n saveAsPresetFail: 'Failed to save preset',\n save: 'Save',\n importPreset: 'Import preset',\n import: 'Import',\n apply: 'Apply',\n export: 'Export',\n delete: 'Delete',\n restore: 'Restore',\n active: 'Active',\n preset: 'Preset',\n ioFailed: 'Import/export failed',\n importInvalid: 'Invalid preset file',\n targetGlobal: 'Target: global default',\n targetHint: 'Pick an agent preset to customize \u2014 prompts are edited per preset: untouched fields stay official defaults, and changes apply only to that preset (the \u201CAll agents\u201D global layer is retired since 0.9.0).',\n syncAllPhases: 'Sync phases',\n syncAllPhasesHint: 'When checked, the three phases share one section list (the resident period is the backbone; sections only the other two phases have are appended at the end, and a same-named row follows the phase where it natively exists), and add / remove / reorder / check / text edits are written to all three phases at once. Ticking the box immediately overwrites the other two phases with the resident-period content (written to the edit draft; press Save to apply). Tool hiding / showing and adding back also apply to all three phases. Unchecked (default): handle each phase separately.',\n syncApplied: 'The other two phases were overwritten from the resident period: all three phases now share one section list and text (written to the draft; press Save to apply).',\n syncNotReady: 'The three phase assemblies are not ready (or are empty); cannot sync phases \u2014 press Refresh and retry.',\n syncSkippedDynamic: '\"{names}\" is a runtime-generated dynamic section and cannot be added to the other phases (its content is only known during assembly).',\n broken: 'broken',\n brokenPreset: 'This agent preset cannot mount right now; its customization is still editable and applies once fixed.',\n phaseBootstrap: 'Bootstrap only',\n phaseActive: 'After promotion',\n phaseCompaction: 'Post-compaction',\n // agent \u5468\u671F\u4E09\u9636\u6BB5\u7684\u5C55\u793A\u547D\u540D\uFF08\u5F15\u5BFC\u671F \u2192 \u5E38\u9A7B\u671F \u2192 \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002\n phaseStageGuide: 'Guide period',\n phaseStageResident: 'Resident period',\n phaseStageControlled: 'Compaction-controlled period',\n toolsPartGuide: 'Guide-period tools',\n toolsPartResident: 'Resident-period tools',\n toolsPartControlled: 'Compaction-controlled tools',\n allToolsTitle: 'All system tools',\n sectionsPartGuide: 'Guide-period sections',\n sectionsPartResident: 'Resident-period sections',\n sectionsPartControlled: 'Compaction-controlled sections',\n allSectionsTitle: 'All system sections',\n toolsFourHint: 'Each of the three periods keeps its own list, with no inheritance: the checkbox = visible to the model in that period; dragging a tool from \"All\" into a period makes it appear there (if the period trims it by default, it is added back); dragging between two periods copies it (the source is untouched, the target gains one, and the hidden/enabled state carries over); dragging it back to \"All\" removes it from that period. Every action touches only the tool you dragged.',\n sectionsFourHint: 'Drag both ways: drop a section from \"All\" onto a period part to enable it there; drag from a part back to \"All\" to remove it from that period. Blocked sections stay fully operable \u2014 they are just not injected.',\n dragHint: 'Drag in to make this tool appear in this period',\n poolMarksHint: 'The three marks after each name = this tool\u2019s state in the guide / resident / compaction-controlled periods: green = visible there (or added back), grey = hidden there, dim = not present and not added.',\n toolAddedTag: 'added',\n toolAdded: 'Added \"{name}\" back to {phase}: the period trims it by default, so it will reappear there once saved (it exists in this preset\u2019s registry).',\n toolNotInRegistry: '\"{name}\" is not in this preset\u2019s registry (it belongs to another preset). There is no definition for it here, so it cannot be added.',\n toolCopied: 'Copied \"{name}\" to {to}: the copy in {from} is left untouched, and its hidden/enabled state carries over.',\n toolRemovedFromPhase: 'Removed \"{name}\" from {from}: an add-back is reverted, a native tool is hidden in that period (still selectable back here).',\n sectionCopied: 'Copied \"{name}\" to {to} (the source {from} is untouched): it is enabled there and can be edited or dragged to reorder.',\n sectionRemoved: 'Removed \"{name}\" from {from}: an added-in section is reverted, a native section becomes blocked (tick it to restore).',\n toolShown: '\"{name}\" is now visible in {to}.',\n toolHiddenIn: '\"{name}\" is now hidden in {to}.',\n toolSyncShown: '\"{name}\" is now visible in all three phases (periods without it in their catalog got it added back).',\n toolSyncHidden: '\"{name}\" is now hidden / removed in all three phases.',\n sectionsTakenOver: 'The \"{name}\" section declares a complete takeover (the host restores that single section after the assembly waterfall). This plugin\u2019s forceSections (default on) bypasses that mechanism, so section-level blocking / replacement / injection / ordering still applies; this notice only appears when forceSections is off or the override fails \u2014 enable it to restore.',\n sectionsLost: 'Only {survived} of the {emitted} sections this plugin emitted for this phase reach the final prompt \u2014 the rest are dropped by downstream assembly rules, so section-level customization cannot fully apply (tool filtering is unaffected).',\n sectionBlockedStrip: ' (blocked in this period; invisible to the model)',\n phaseSuppressed: 'Suppressed (absent from every phase assembly)',\n sectionDynamicNoAdd: '\"{name}\" is generated at runtime \u2014 it cannot be added to a phase ahead of time (its content is only known during assembly).',\n exportOk: 'Exported',\n exportCancel: 'Export cancelled',\n exportFail: 'Export failed',\n importOk: 'Import complete',\n importNone: 'Nothing imported (duplicate names or empty file)',\n importCancel: 'Import cancelled',\n importFail: 'Import failed',\n saveOk: 'Saved',\n saveFail: 'Save failed',\n discardConfirm: 'You have unsaved changes; leaving will discard them. Leave anyway?',\n forceTitle: 'Force override (forceSections)',\n forceHint: 'When on, every preset\u2019s prompt sections always follow this plugin (bypassing complete takeover and preset phase pruning); when off, filtering falls back to the waterfall, where presets may override your customization. \"Restore initial state\" turns this off automatically.',\n forceOn: 'On',\n forceOff: 'Off',\n zhSwitch: 'Chinese sections',\n zhHint: 'Toggle. On: overwrite sections matching the bundled translation with Chinese (written to the edit draft, applies on save). Off: clear those replacements, restoring the English originals. Custom sections and unmatched names are untouched.',\n zhApplied: 'Chinese written to the edit draft \u2014 press Save to apply; unmatched sections stay as-is.',\n zhReverted: 'English originals written back to the edit draft (Chinese replacements cleared) \u2014 press Save to apply.',\n zhNotReady: 'Phase assemblies are not loaded yet \u2014 press Refresh or try again shortly.',\n envBlockTitle: 'Environment variable blocklist (envBlocklist)',\n envBlockHint: 'All system environment variables (process.env) are registered as prompt variables: reference them in section text as {{env_lowercase_key}} (e.g. {{env_path}}); keys hit by the blocklist are not registered \u2014 env often carries secrets, and anything in the prompt is sent to the model. Entries support * wildcards, case-insensitive. Built-ins {{date}} {{time}} {{datetime}} {{weekday}} {{hostname}} {{platform}} {{arch}} {{username}} {{home}} {{shell}} {{locale}} {{node_version}} are always available.',\n envBlockAdd: 'Key or wildcard, e.g. GITHUB_TOKEN or *_KEY*',\n envBlockAddAction: 'Add',\n envBlockEmpty: 'Blocklist is empty: every environment variable gets registered',\n envVarsTitle: 'Registered prompt variables',\n envVarsHint: 'Reference {{name}} in section text; an unregistered name fails the whole render (host strict mode).',\n importBlockMerge: ', the file\u2019s env-variable blocklist was merged in (+{count} entries)',\n resetTitle: 'Restore initial state',\n resetHint: 'Clears all customization (blocking / replacement / injection / ordering, per-phase tool catalogs, config snapshots, agent-preset overrides) and turns forceSections off \u2014 every AI conversation goes back to being unaffected by this plugin, equivalent to uninstalling it, without uninstalling or restarting. This cannot be undone; to re-enable customization, turn the \"Force override\" switch above back on.',\n resetConfirm: 'Clear all customization and restore the initial state?\\n\\nThis will delete: block lists, section replacements, injected sections, per-phase tool catalogs, config snapshots, and agent-preset overrides; forceSections will be turned off.\\nAfterwards no AI conversation is affected by this plugin (equivalent to uninstalling).\\nThis cannot be undone.',\n resetAction: 'Clear all customization',\n resetOk: 'Initial state restored: no AI conversation is affected by this plugin anymore',\n resetFail: 'Failed to restore initial state',\n scopeFallback: \"This agent preset's standing scope could not be mounted; what you see is the global layer (not the preset's native sections/tools).\",\n previewFail: 'Assembly for this phase failed (scope mount error or a preset plugin threw); switch target or check the server log.',\n phaseVisible: 'visible in phase',\n previewToolsHint: 'Tool catalog as the model actually sees it (all assembly rules run for the selected phase, including native phase narrowing):',\n previewToolsCount: 'of registry',\n saveAsPreset: 'Save as preset',\n // \u72EC\u7ACB\u9762\u677F\uFF08\u4FA7\u8FB9\u680F\u5165\u53E3 + \u62BD\u5C49\u5206\u680F\uFF09\u65B0\u589E\u3002\n navShort: 'Prompts',\n close: 'Close',\n filterAll: 'All',\n filterOn: 'Enabled',\n filterOff: 'Disabled',\n targetLabel: 'Edit target (agent preset)',\n targetCustomized: '{n} overridden field(s)',\n agentScoped: 'session-level',\n agentScopedHint: 'This section is registered by a plugin in the agent\u2019s own scope (it is not in this preset scope\u2019s registry): the panel\u2019s preview assembly cannot see it, but every real session\u2019s prompt has it. It is in the prompt by default, and it can be blocked / replaced / reordered like any other row \u2014 use the \u201CChinese prompt\u201D toggle or a manual replacement to translate it.',\n settingsTitle: 'Global settings',\n libraryTitle: 'Config snapshots',\n draftBadge: 'Preview includes unsaved draft',\n previewSyncFail: 'Live preview sync failed (retries on next edit, or press Refresh)',\n },\n} as const\n\nexport type Translate = (key: string, params?: Record<string, string | number>) => string\n", "/**\n * prompt \u2014 \u63D0\u793A\u8BCD\u7BA1\u7406\uFF08\u4E0A\u6E38 dsh-prompt-customizer v0.5.1 \u7684\u6D4F\u89C8\u5668\u534A\u8EAB\uFF09\u3002\n *\n * \u8FC1\u79FB\u8303\u56F4\uFF1A\u53EA\u4FDD\u7559\u9762\u677F\u672C\u4F53\uFF08Panel \u4E0E\u5B83\u7684\u5206\u680F / \u9884\u89C8 / \u5FEB\u7167\u5E93\uFF09\u3002\u4E0A\u6E38\u7684\n * \u4FA7\u8FB9\u680F\u5165\u53E3\u4E0E\u62BD\u5C49\u5916\u58F3\uFF08nav.tsx / shell.tsx\uFF09\u7531 triad \u7684\u300C\u63D0\u793A\u8BCD\u300D\u9876\u5C42 tab\n * \u53D6\u4EE3\uFF1B\u5BBF\u4E3B\u8DEF\u7531\u4ECD\u662F /api/prompt-customizer/*\uFF08\u89C1 vendor/prompt-customizer\uFF09\u3002\n *\n * \u4E0E\u4E0A\u6E38\u7684\u552F\u4E00\u5DEE\u5F02\uFF1A\u9762\u677F\u4E0D\u518D\u81EA\u5DF1\u5F00\u7A97\uFF08\u65E0\u5173\u95ED\u6309\u94AE\u3001\u65E0\u906E\u7F69\u4E0E\u4FA7\u680F\u51E0\u4F55\u63A8\u7B97\uFF09\u3002\n */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport { DICT, type Translate } from './locales.ts'\n\n/** \u6587\u6848\u547D\u540D\u7A7A\u95F4\uFF08\u4E0E\u4E0A\u6E38\u4E00\u81F4\uFF0C\u907F\u514D\u4E24\u4EFD\u5B57\u5178\uFF09\u3002 */\nconst NS = 'prompt-customizer'\n\n/** triad \u5BA2\u6237\u7AEF\u4E0A\u4E0B\u6587\u91CC\u672C\u6A21\u5757\u7528\u5230\u7684\u90E8\u5206\u3002 */\ninterface PromptLocaleHost {\n register(namespace: string, dicts: { zh: Record<string, string>; en: Record<string, string> }): unknown\n bind(namespace: string): Translate\n}\n\n/** apply \u65F6\u7ED1\u5B9A\u7684\u7FFB\u8BD1\u51FD\u6570\uFF08\u8DDF\u968F DSH \u5F53\u524D\u8BED\u8A00\uFF09\u3002 */\nlet bound: Translate | undefined\n\n/** \u9762\u677F\u6587\u6848\u51FD\u6570\uFF1AapplyPrompt \u4E4B\u524D\u56DE\u843D\u5230\u4E2D\u6587\u8868\uFF08\u9762\u677F\u4E0D\u4F1A\u56E0\u7F3A\u5C11 locale \u670D\u52A1\u53D8\u7A7A\u767D\uFF09\u3002 */\nexport function promptT(): Translate {\n if (bound !== undefined) return bound\n return (key, params) => {\n let text = (DICT.zh as Record<string, string>)[key] ?? key\n if (params !== undefined) {\n for (const name of Object.keys(params)) text = text.split(`{${name}}`).join(String(params[name]))\n }\n return text\n }\n}\n\n/** \u6CE8\u518C\u6587\u6848\u547D\u540D\u7A7A\u95F4\uFF1B\u9762\u677F\u672C\u4F53\u7531\u300C\u63D0\u793A\u8BCD\u300Dtab \u6E32\u67D3\uFF08\u8FD9\u91CC\u4E0D\u5EFA\u4EFB\u4F55\u5165\u53E3\uFF09\u3002 */\nexport function applyPrompt(ctx: ClientContext): void {\n const locale = (ctx as unknown as { locale?: PromptLocaleHost }).locale\n if (locale === undefined || typeof locale.bind !== 'function') {\n console.warn('[dsh-prompt-customizer] prompt locale unavailable: \u63D0\u793A\u8BCD\u9762\u677F\u56DE\u843D\u4E2D\u6587\u6587\u6848')\n return\n }\n // \u547D\u540D\u7A7A\u95F4\u662F\u63D2\u4EF6\u81EA\u5DF1\u7684\uFF08'prompt-customizer'\uFF09\u3002\u6CE8\u518C\u5931\u8D25\u7EDD\u4E0D\u80FD\u62D6\u57AE\u6574\u6761\u5BA2\u6237\u7AEF\n // \u63D2\u4EF6\u52A0\u8F7D\u94FE\uFF08\u540C\u540D\u6CE8\u518C\u4F1A\u629B\u9519\uFF0C\u4E14\u8C01\u5148\u6CE8\u518C\u8C01\u8BA9\u540E\u6765\u8005\u629B\uFF09\u2014\u2014\u5931\u8D25\u5C31\u56DE\u843D\u63D2\u4EF6\u5185\n // \u81EA\u5E26\u7684 zh \u6587\u6848\uFF0C\u9762\u677F\u7167\u5E38\u80FD\u7528\u3002\n ctx.effect(() => {\n try {\n return locale.register(NS, DICT)\n } catch (error) {\n console.error('[dsh-prompt-customizer] prompt locale register failed:', error)\n return () => {}\n }\n }, 'prompt-customizer: prompt locale')\n try {\n bound = locale.bind(NS)\n } catch (error) {\n console.warn('[dsh-prompt-customizer] prompt locale bind failed, \u56DE\u843D\u4E2D\u6587\u6587\u6848:', error)\n }\n}\n", "/**\r\n * PromptView \u2014 \u300C\u63D0\u793A\u8BCD\u300D\u9876\u5C42 tab \u7684\u5185\u5BB9\u3002\r\n *\r\n * \u76F4\u63A5\u590D\u7528\u4E0A\u6E38\u9762\u677F\u672C\u4F53\uFF08Panel\uFF09\uFF1A\u5934\u90E8\u6A21\u5F0F\u5207\u6362 / \u4FDD\u5B58 / \u5237\u65B0\u3001agent \u9884\u8BBE\u7F16\u8F91\u76EE\u6807\u3001\r\n * \u5DE6\u680F\u52FE\u9009 + \u53F3\u680F\u88C5\u914D\u9884\u89C8\uFF0C\u5168\u90E8\u4FDD\u6301\u539F\u6837\uFF1B\u8FD9\u91CC\u53EA\u63D0\u4F9B\u6491\u6EE1 tab \u7684\u5BB9\u5668\u4E0E\u6587\u6848\u51FD\u6570\u3002\r\n */\r\nimport { Panel } from './Panel.tsx'\r\nimport { promptT } from './index.ts'\r\n\r\nexport function PromptView(): JSX.Element {\r\n return (\r\n <div style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\r\n <Panel t={promptT()} />\r\n </div>\r\n )\r\n}\r\n", "/**\n * skills/api \u2014 /api/skill-manager \u4E0E /api/skill-toggles \u7684\u7C7B\u578B\u5316\u8BF7\u6C42\u5C01\u88C5\u3002\n */\nimport type {\n HealthReport, HealthView, InstallInput, PresetStatus, SkillSnapshot, ToggleStatus,\n} from './types.js'\n/** ---------------------------------------------------------------- API */\n\nexport const SKILL_API_BASE = '/api/skill-manager'\n\nexport async function skillRequest<T>(path: string, options?: RequestInit): Promise<T> {\n const response = await fetch(SKILL_API_BASE + path, options)\n const body = (await response.json().catch(() => ({}))) as T & { error?: string }\n if (!response.ok) throw new Error(body.error || 'request failed (' + String(response.status) + ')')\n return body\n}\n\nexport const skillApi = {\n list: (): Promise<SkillSnapshot> => skillRequest<SkillSnapshot>('/list', { headers: { accept: 'application/json' } }),\n toggleStatus: (): Promise<ToggleStatus> =>\n fetch('/api/skill-toggles/status', { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<ToggleStatus & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || body.skills === undefined) {\n throw new Error('toggle status unavailable')\n }\n return body as ToggleStatus\n }),\n setSkillEnabled: (name: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/skills/${encodeURIComponent(name)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n setBundleEnabled: (bundleId: string, enabled: boolean): Promise<{ ok: boolean; handled?: number }> =>\n fetch(`/api/skill-toggles/bundles/${encodeURIComponent(bundleId)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string; handled?: number }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n /** \u9884\u8BBE\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5168\u5C40\u5C42\u72B6\u6001(\u4E00\u6B21\u62C9\u9F50)\u3002 */\n presetStatus: (): Promise<PresetStatus> =>\n fetch('/api/skill-toggles/presets', { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<PresetStatus & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray(body.presets)) {\n throw new Error('preset status unavailable')\n }\n return body as PresetStatus\n }),\n setPresetSkillEnabled: (presetId: string, name: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/skills/${encodeURIComponent(name)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n setPresetBundleEnabled: (presetId: string, bundleId: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/bundles/${encodeURIComponent(bundleId)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n resetPreset: (presetId: string): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/reset`, {\n method: 'POST',\n headers: { accept: 'application/json' },\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'reset failed')\n return body\n }),\n createBundle: (name: string, categories: string[] = []): Promise<Record<string, never>> =>\n skillRequest('/bundles', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ name, categories }) }),\n renameBundle: (bundleId: string, name: string): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'PATCH', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ name }) }),\n /** \u53EA\u6539\u5206\u7C7B\u7684 PATCH\uFF1Ahost \u4FA7 name \u7F3A\u7701\u5373\u4FDD\u6301\u539F\u503C\uFF0C\u4E0D\u5FC5\u56DE\u4F20\u5305\u540D\u3002 */\n setBundleCategories: (bundleId: string, categories: string[]): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'PATCH', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ categories }) }),\n deleteBundle: (bundleId: string): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'DELETE', headers: { accept: 'application/json' } }),\n setBundleSkills: (bundleId: string, skillNames: string[]): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}/skills`, { method: 'PUT', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ skillNames }) }),\n deleteSkill: (name: string): Promise<Record<string, never>> =>\n skillRequest(`/skills/${encodeURIComponent(name)}`, { method: 'DELETE', headers: { accept: 'application/json' } }),\n installSkill: (input: InstallInput): Promise<{ name?: string; dir?: string; renamed?: boolean }> =>\n skillRequest('/skills', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify(input) }),\n /** \u6280\u80FD\u76EE\u5F55\u5065\u5EB7\u68C0\u67E5\uFF1A\u53EA\u8BFB\u626B\u63CF\uFF08\u7F3A SKILL.md / frontmatter \u65E0\u6548 / \u540D\u79F0\u4E0D\u4E00\u81F4 / \u8D26\u672C\u60AC\u6302\u5F15\u7528\uFF09\u3002 */\n health: (): Promise<HealthReport> =>\n fetch('/api/skill-health', { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<HealthReport & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray(body.issues)) {\n throw new Error('health unavailable')\n }\n return body as HealthReport\n }),\n}\n", "/**\n * skills/files \u2014 \u6280\u80FD\u6587\u4EF6\u5939/\u538B\u7F29\u5305\u6536\u96C6\uFF08webkitGetAsEntry \u9012\u5F52\u76EE\u5F55 + base64 \u7F16\u7801\uFF09\u3002\n */\nimport type { CollectedFile } from './types.js'\n/** ---------------------------------------------------------------- \u6587\u4EF6\u6536\u96C6 */\n\nexport function readEntryFile(entry: FileSystemFileEntry): Promise<File> {\n return new Promise((resolve, reject) => {\n entry.file(resolve, reject)\n })\n}\n\nexport async function collectEntry(entry: FileSystemEntry, prefix: string, out: CollectedFile[]): Promise<void> {\n if (entry.isFile) {\n const fileEntry = entry as FileSystemFileEntry\n const file = await readEntryFile(fileEntry)\n const path = prefix === '' ? entry.name : `${prefix}/${entry.name}`\n out.push({ path, file })\n return\n }\n if (entry.isDirectory) {\n const dirEntry = entry as FileSystemDirectoryEntry\n const reader = dirEntry.createReader()\n const all: FileSystemEntry[] = []\n while (true) {\n const batch = await new Promise<FileSystemEntry[]>((resolve, reject) => {\n reader.readEntries(resolve, reject)\n })\n if (batch.length === 0) break\n all.push(...batch)\n }\n const nextPrefix = prefix === '' ? entry.name : `${prefix}/${entry.name}`\n for (const child of all) await collectEntry(child, nextPrefix, out)\n }\n}\n\nexport function fileToBase64(file: File): Promise<string> {\n return file.arrayBuffer().then((buffer) => {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n const chunkSize = 32768\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize))\n }\n return btoa(binary)\n })\n}\n", "/**\n * skills/GuidePanel \u2014 \u53F3\u4FA7\u300C\u5FEB\u901F\u4E0A\u624B\u300D\u6D6E\u5C42\u5361\uFF08portal \u5230 body\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09\u3002\n */\nimport { createPortal } from 'react-dom'\nimport {\n IconChevronRightOutlineRegular, IconCloseOutlineRegular, IconSkillOutlineRegular,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ArrowRightIcon, CheckIcon, GuideArtIcon, GuideArtIconSmall } from './icons.js'\nimport { css } from './styles.js'\n/** ---------------------------------------------------------------- \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u9762\u677F\uFF08\u53F3\u4FA7\u680F\uFF09 */\n\n/** \u80FD\u529B\u5C0F\u5361\u56FE\u6807\uFF08stroke currentColor\uFF09\u3002 */\nexport function CapIcon({ kind, size = 17 }: { kind: 'ui' | 'code' | 'doc' | 'data' | 'tool'; size?: number }): JSX.Element {\n const common = { width: size, height: size, viewBox: '0 0 24 24', 'aria-hidden': true } as const\n const s = { fill: 'none', stroke: 'currentColor', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round' } as const\n if (kind === 'ui') {\n return (\n <svg {...common} {...s}><rect x=\"4\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"13.5\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"4\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"13.5\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /></svg>\n )\n }\n if (kind === 'code') {\n return (\n <svg {...common} {...s}><path d=\"M9 7.5 5.5 12 9 16.5M15 7.5 18.5 12 15 16.5\" /></svg>\n )\n }\n if (kind === 'doc') {\n return (\n <svg {...common} {...s}><path d=\"M6.5 4.5h7l4 4v11h-11Z\" /><path d=\"M13.5 4.5v4h4M9 13h6M9 16h4.5\" /></svg>\n )\n }\n if (kind === 'data') {\n return (\n <svg {...common} {...s}><path d=\"M5 19h14M7 16v-5M12 16V8M17 16v-8.5\" /></svg>\n )\n }\n return (\n <svg {...common} {...s}><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" /></svg>\n )\n}\n\n/** \u53F3\u4FA7\u6307\u5357\u6D6E\u5C42\u5361\uFF08\u70B9\u51FB\u300C\u5F00\u59CB\u5B66\u4E60\u300D\u51FA\u73B0\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF1B\u53C2\u8003\u8BBE\u8BA1\u7A3F\u7A84\u680F\u5185\u5BB9\uFF09\u3002 */\nexport function GuidePanel({ t, onClose, left, top, height }: {\n t: (key: string) => string\n onClose: () => void\n left: number\n top: number\n height: number\n}): JSX.Element {\n const caps: Array<[string, 'ui' | 'code' | 'doc' | 'data' | 'tool']> = [\n [t('guideCapUi'), 'ui'], [t('guideCapCode'), 'code'], [t('guideCapDoc'), 'doc'],\n [t('guideCapData'), 'data'], [t('guideCapTool'), 'tool'],\n ]\n const steps: Array<[number, string, string]> = [\n [1, t('guideStep1'), t('guideStep1Desc')],\n [2, t('guideStep2'), t('guideStep2Desc')],\n [3, t('guideStep3'), t('guideStep3Desc')],\n [4, t('guideStep4'), t('guideStep4Desc')],\n ]\n const bests = [t('guideBest1'), t('guideBest2'), t('guideBest3'), t('guideBest4')]\n return createPortal(\n <aside\n className={css.guidePanel}\n role=\"complementary\"\n aria-label={t('guidePanelTitle')}\n style={{ left, top, height }}\n >\n <div className={css.guidePanelHead}>\n <span className={css.guidePanelLogo}><GuideArtIconSmall /></span>\n <span className={css.guidePanelTitle}>{t('guidePanelTitle')}</span>\n <button type=\"button\" className={css.guidePanelClose} aria-label={t('guideClose')} onClick={onClose}>\n <IconCloseOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div className={css.guidePanelBody}>\n {/* \u4EC0\u4E48\u662F Skill */}\n <section className={css.guideSec}>\n <div className={css.guideSecHead}>\n <span className={css.guideSecIcon}><IconSkillOutlineRegular size={14} aria-hidden=\"true\" /></span>\n <span className={css.guideSecTitle}>{t('guideWhat')}</span>\n </div>\n <p className={css.guideWhatDesc}>{t('guideWhatDesc')}</p>\n <div className={css.guideCaps}>\n {caps.map(([label, kind]) => (\n <span key={label} className={css.guideCap}>\n <span className={css.guideCapIcon}><CapIcon kind={kind} /></span>\n <span className={css.guideCapLabel}>{label}</span>\n </span>\n ))}\n </div>\n </section>\n\n {/* \u56DB\u6B65\u6D41\u7A0B */}\n <section className={css.guideSec}>\n {steps.map(([num, title, desc]) => (\n <div key={num} className={css.guideStep}>\n <span className={css.guideStepNum}>{num}</span>\n <div className={css.guideStepBody}>\n <div className={css.guideStepTitleRow}>\n <span className={css.guideStepTitle}>{title}</span>\n <IconChevronRightOutlineRegular className={css.guideStepArrow} size={12} aria-hidden=\"true\" />\n </div>\n <p className={css.guideStepDesc}>{desc}</p>\n </div>\n </div>\n ))}\n </section>\n\n {/* \u6700\u4F73\u5B9E\u8DF5 */}\n <section className={css.guideBest}>\n <div className={css.guideBestTitle}>{t('guideBest')}</div>\n <ul className={css.guideBestList}>\n {bests.map((item) => (\n <li key={item} className={css.guideBestItem}>\n <CheckIcon />\n {item}\n </li>\n ))}\n </ul>\n <button type=\"button\" className={css.guideMoreBtn} onClick={onClose}>\n <span>{t('guideMoreBest')}</span>\n <ArrowRightIcon size={12} />\n </button>\n <span className={css.guideBestArt} aria-hidden=\"true\"><GuideArtIcon /></span>\n </section>\n </div>\n </aside>,\n document.body,\n )\n}\n", "/**\n * skills/icons \u2014 \u9762\u677F\u81EA\u7ED8\u56FE\u6807\uFF1A\u7EDF\u8BA1\u5361\u5B9E\u5FC3\u56FE\u6807 + Skills Hub \u7EBF\u6027\u56FE\u6807\uFF08Feather \u98CE\uFF09\u3002\n */\n/** ---------------------------------------------------------------- \u7EDF\u8BA1\u5361\u56FE\u6807\uFF08\u5B9E\u5FC3\u6E10\u53D8\uFF0C\u4E0E\u8BBE\u8BA1\u7A3F\u4E00\u81F4\uFF09 */\n\n/** \u84DD\u8272\u5B9E\u5FC3\u7ACB\u65B9\u4F53\uFF08\u7BA1\u7406\u7684\u6280\u80FD\uFF09\u3002 */\nexport function StatCubeIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M12 3 20.4 7.4 12 11.8 3.6 7.4Z\" fill=\"#6C92FF\" />\n <path d=\"M12 11.8 20.4 7.4v9.2L12 21Z\" fill=\"#2A55F2\" />\n <path d=\"M12 11.8 3.6 7.4v9.2L12 21Z\" fill=\"#174BFC\" />\n <path d=\"M12 3 20.4 7.4 12 11.8 3.6 7.4Z\" fill=\"none\" stroke=\"#FFFFFF\" strokeWidth=\"0.9\" strokeLinejoin=\"round\" opacity=\".9\" />\n </svg>\n )\n}\n\n/** \u7EFF\u8272\u5B9E\u5FC3\u5706 + \u767D\u8272\u5BF9\u52FE\uFF08\u5168\u5C40\u542F\u7528\uFF09\u3002 */\nexport function StatCheckCircleIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9.4\" fill=\"#0FC566\" />\n <path d=\"M7.9 12.3 10.7 15.1 16.2 9.2\" fill=\"none\" stroke=\"#FFFFFF\" strokeWidth=\"2.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/** \u7D2B\u8272\u5B9E\u5FC3\u5706\u89D2\u65B9\u5757 + \u767D\u8272\u5185\u683C\uFF08\u6563\u88C5\u6280\u80FD\uFF09\u3002 */\nexport function StatSquareIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <rect x=\"4.2\" y=\"4.2\" width=\"15.6\" height=\"15.6\" rx=\"3.2\" fill=\"#6C33F2\" />\n <path d=\"M7.8 7.8h8.4v8.4H7.8Z\" fill=\"#FFFFFF\" opacity=\".92\" />\n <path d=\"M7.8 7.8h4.2v4.2H7.8ZM12 12h4.2v4.2H12Z\" fill=\"#6C33F2\" />\n </svg>\n )\n}\n\n/** \u6A59\u8272\u5B9E\u5FC3\u5FC3\u5F62 + \u767D\u8272\u9AD8\u5149\u70B9\uFF08\u6280\u80FD\u5065\u5EB7\uFF09\u3002 */\nexport function StatHeartIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M12 20.6C7.2 17.2 3.9 14 3.9 10.2 3.9 7.3 6.2 5.2 8.8 5.2c1.4 0 2.6.6 3.2 1.6.6-1 1.8-1.6 3.2-1.6 2.6 0 4.9 2.1 4.9 5 0 3.8-3.3 7-8.1 10.4z\" fill=\"#F4502A\" />\n <circle cx=\"8.9\" cy=\"9.3\" r=\"1.6\" fill=\"#FFFFFF\" opacity=\".95\" />\n </svg>\n )\n}\n\n/** ---------------------------------------------------------------- \u5DE6\u680F/\u5DE5\u5177\u680F\u5C0F\u56FE\u6807\uFF08\u7EBF\u6846\u98CE\u683C currentColor\uFF09 */\n\nexport function catStroke(): { fill: 'none'; stroke: 'currentColor'; strokeWidth: number; strokeLinecap: 'round'; strokeLinejoin: 'round' } {\n return { fill: 'none', stroke: 'currentColor', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round' }\n}\n\n/** \u5168\u90E8\uFF1A\u84DD\u65B9\u5185\u767D\u56DB\u683C\uFF08active \u4E3B\u5BFC\u8272\uFF09\u3002 */\nexport function CatAllIcon({ size = 16 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"4.5\" fill=\"currentColor\" />\n <path d=\"M9.2 9.2h5.6v5.6H9.2Z\" fill=\"#FFFFFF\" opacity=\".92\" />\n </svg>\n )\n}\n\n/** \u5C0F\u9501\uFF1A\u8BE5\u5DE5\u5177\u5728\u300C\u5168\u90E8 Agent\u300D\u5C42\u88AB\u505C\u7528\uFF08\u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF0C\u9884\u8BBE\u5C42\u4E0D\u53EF\u62E8\u52A8\uFF09\u3002 */\nexport function LockGlyph({ size = 10 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()} strokeWidth={2}>\n <rect x=\"5\" y=\"10.5\" width=\"14\" height=\"9\" rx=\"2.4\" />\n <path d=\"M8.2 10.5V8.4a3.8 3.8 0 0 1 7.6 0v2.1\" />\n </svg>\n )\n}\n\n/** \u62D6\u653E\u4E91\u56FE\u6807\u3002 */\nexport function CloudUpIcon({ size = 18 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n <path d=\"M17.7 9.5A5.2 5.2 0 0 0 7.6 8.2 4 4 0 0 0 6.5 16h10.9a3.8 3.8 0 0 0 .5-7.6Z\" />\n <path d=\"M12 17.5v-5M9.6 14.6 12 12.2l2.4 2.4\" />\n </svg>\n )\n}\n\n/** \u540D\u79F0\u6392\u5E8F\u7BAD\u5934\uFF08\u2191/\u2193\uFF09\u3002 */\nexport function SortDirIcon({ dir, size = 12 }: { dir: 'asc' | 'desc'; size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n {dir === 'asc' ? <path d=\"M12 19V5M5.8 10.8 12 4.6l6.2 6.2\" /> : <path d=\"M12 5v14M5.8 13.2 12 19.4l6.2-6.2\" />}\n </svg>\n )\n}\n\n/** \u5206\u7EC4\u884C\u84DD\u8272\u6587\u4EF6\u5939\uFF08\u5B9E\u5FC3\uFF09\u3002 */\nexport function FolderBlueIcon({ size = 17 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M3.5 7.2a2.2 2.2 0 0 1 2.2-2.2h4l2 2.1h6.6a2.2 2.2 0 0 1 2.2 2.2v7.5a2.2 2.2 0 0 1-2.2 2.2H5.7a2.2 2.2 0 0 1-2.2-2.2Z\" fill=\"var(--dsw-alias-state-business-primary,#3d6be5)\" />\n <path d=\"M3.5 9.5h17v1.6a2.2 2.2 0 0 0-2.2-2.2H5.7a2.2 2.2 0 0 0-2.2 2Z\" fill=\"#FFFFFF\" opacity=\".25\" />\n </svg>\n )\n}\n\n/** \u53F3\u7BAD\u5934\uFF08\u6307\u5357\u6309\u94AE\uFF09\u3002 */\nexport function ArrowRightIcon({ size = 13 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n <path d=\"M5 12h14M13 6l6 6-6 6\" />\n </svg>\n )\n}\n\n\n/** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\uFF1A\u5E95\u90E8 3D \u4E66\u672C\u63D2\u56FE + \u661F\u70B9\u88C5\u9970\u3002 */\nexport function GuideArtIcon(): JSX.Element {\n return (\n <svg width=\"150\" height=\"86\" viewBox=\"0 0 150 86\" aria-hidden=\"true\">\n <defs>\n <linearGradient id=\"skm-guide-book\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" stopColor=\"#9DB7F7\" />\n <stop offset=\"1\" stopColor=\"#6E8FF0\" />\n </linearGradient>\n <linearGradient id=\"skm-guide-page\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0\" stopColor=\"#FFFFFF\" />\n <stop offset=\"1\" stopColor=\"#D9E4FF\" />\n </linearGradient>\n </defs>\n {/* \u80CC\u9762\u4E66\u9875 (\u53F3) */}\n <path d=\"M96 34 L141 52 L120 66 L78 50 Z\" fill=\"url(#skm-guide-page)\" stroke=\"#C7D6F7\" strokeWidth=\"1\" />\n {/* \u80CC\u9762\u4E66\u9875 (\u5DE6) */}\n <path d=\"M84 32 L50 52 L28 44 L64 26 Z\" fill=\"url(#skm-guide-page)\" stroke=\"#C7D6F7\" strokeWidth=\"1\" />\n {/* \u4E66\u5C01\u9762\u5E95\u5EA7 */}\n <path d=\"M64 26 L96 34 L78 50 L50 52 Z\" fill=\"url(#skm-guide-book)\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n <path d=\"M50 52 L28 44 L30 56 L52 66 Z\" fill=\"#B7C9F5\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n <path d=\"M78 50 L120 66 L118 78 L76 62 Z\" fill=\"#A9BEF1\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n {/* \u5C01\u9762\u4E0A\u7684\u5706\u5F62\u5FBD\u7AE0 */}\n <circle cx=\"73\" cy=\"44\" r=\"9\" fill=\"#FFFFFF\" opacity=\".85\" />\n <circle cx=\"73\" cy=\"44\" r=\"5.5\" fill=\"#6E8FF0\" />\n {/* \u661F\u70B9\u88C5\u9970 */}\n <path d=\"M118 10c.6 2.6 1.6 3.6 4.2 4.2-2.6.6-3.6 1.6-4.2 4.2-.6-2.6-1.6-3.6-4.2-4.2 2.6-.6 3.6-1.6 4.2-4.2Z\" fill=\"#BCCFFF\" />\n <path d=\"M126 26c.4 1.7 1 2.3 2.7 2.7-1.7.4-2.3 1-2.7 2.7-.4-1.7-1-2.3-2.7-2.7 1.7-.4 2.3-1 2.7-2.7Z\" fill=\"#C9D9FF\" />\n <circle cx=\"111\" cy=\"24\" r=\"2\" fill=\"#C9D9FF\" />\n </svg>\n )\n}\n\n/** \u6307\u5357\u9762\u677F logo\uFF1A\u5C0F\u4E66\u5757\u3002 */\nexport function GuideArtIconSmall(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2.5\" fill=\"var(--dsw-alias-state-business-primary,#3d6be5)\" />\n <path d=\"M4.5 5h7M4.5 8h7M4.5 11h4.5\" stroke=\"#FFFFFF\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\n/** \u590D\u5236\u56FE\u6807\uFF08Feather copy\uFF0C\u7EBF\u6027\u63CF\u8FB9\uFF0C\u4E0E\u5BFC\u822A\u624B\u7ED8\u56FE\u6807\u540C\u98CE\uFF09\u3002 */\nexport function CopyIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\n/** \u5B8C\u6210\u52FE\u56FE\u6807\uFF08Feather check\uFF09\u3002 */\nexport function CheckIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n/* \u2500\u2500 Skills Hub \u9875\u9762\u56FE\u6807\uFF08Feather \u7EBF\u6027\u98CE\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport function SearchIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n )\n}\n\nexport function TagIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\" />\n <line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\" />\n </svg>\n )\n}\n\nexport function BulbIcon(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18h6\" />\n <path d=\"M10 22h4\" />\n <path d=\"M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.3h6c0-1 .4-1.8 1-2.3A7 7 0 0 0 12 2z\" />\n </svg>\n )\n}\n\n/** \u54C1\u724C\u5B57\u6807\uFF1A\u4FA7\u680F Logo \u533A\u52A0\u7C97\u300Cskill\u300D\u6587\u5B57 SVG\uFF08\u65E0\u5E95\u8272\uFF0CcurrentColor = \u54C1\u724C\u84DD\uFF09\u3002 */\nexport function HubWordmarkIcon(): JSX.Element {\n return (\n <svg width=\"26\" height=\"12\" viewBox=\"0 0 26 12\" aria-hidden=\"true\">\n <text\n x=\"13\"\n y=\"10\"\n textAnchor=\"middle\"\n fontSize=\"10.5\"\n fontWeight=\"800\"\n letterSpacing=\"-0.15\"\n fontFamily=\"ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif\"\n fill=\"currentColor\"\n >skill</text>\n </svg>\n )\n}\n\n/** \u6280\u80FD\u5B57\u6807\uFF1A\u74F7\u7247\u5185\u7684\u300Cskill\u300D\u6587\u5B57 SVG\uFF08\u66FF\u6362\u539F\u56FE\u6807\uFF0C\u968F\u74F7\u7247 currentColor \u7740\u8272\uFF09\u3002 */\nexport function SkillWordmarkIcon(): JSX.Element {\n return (\n <svg width=\"34\" height=\"15\" viewBox=\"0 0 34 15\" aria-hidden=\"true\">\n <text\n x=\"17\"\n y=\"12\"\n textAnchor=\"middle\"\n fontSize=\"12\"\n fontWeight=\"800\"\n letterSpacing=\"-0.2\"\n fontFamily=\"ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif\"\n fill=\"currentColor\"\n >skill</text>\n </svg>\n )\n}\n", "/**\n * skills/locales \u2014 \u9762\u677F\u6587\u6848\u8868\uFF08SKILL \u4E0E MCP \u5171\u7528\uFF09\u4E0E\u63D2\u503C\u51FD\u6570 skillT\u3002\n */\n/** ---------------------------------------------------------------- \u6587\u6848\u4E0E\u53C2\u6570 */\n\nexport const SKILL_ZH: Record<string, string> = {\n entry: '\u80FD\u529B', panelTitle: '\u80FD\u529B\u7BA1\u7406', close: '\u5173\u95ED', loading: '\u6B63\u5728\u8BFB\u53D6\u6280\u80FD\u2026',\n error: '\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u6280\u80FD\u3002', retry: '\u91CD\u8BD5', refresh: '\u5237\u65B0',\n uploadHint: '\u62D6\u5165\u6280\u80FD\u6587\u4EF6\u5939\u5B89\u88C5\uFF0C\u6216\u70B9\u51FB\u9009\u62E9', uploadMeta: '{n} \u4E2A\u6587\u4EF6 \u00B7 {folder}',\n fileCount: '{n} \u6587\u4EF6', expandSkillFiles: '\u5C55\u5F00\u6280\u80FD\u6587\u4EF6', previewLoading: '\u6B63\u5728\u52A0\u8F7D\u5185\u5BB9\u2026', viewSkillFiles: '\u67E5\u770B\u6280\u80FD\u6587\u4EF6', viewerNav: '\u6280\u80FD\u6587\u4EF6', viewerFont: '\u5B57\u53F7', viewerSmall: '\u5C0F\u5B57\u53F7', viewerNormal: '\u6807\u51C6\u5B57\u53F7', viewerLarge: '\u5927\u5B57\u53F7', viewerFull: '\u5168\u5C4F\u67E5\u770B', viewerExitFull: '\u9000\u51FA\u5168\u5C4F', viewerFilesCount: '{n} \u4E2A\u6587\u4EF6', assignToBundle: '\u5F52\u5165 Bundle', assignTitle: '\u5C06\u300C{name}\u300D\u5F52\u5165', assignEmpty: '\u8FD8\u6CA1\u6709\u6280\u80FD\u5305,\u5148\u70B9\u300C\u65B0\u5EFA Bundle\u300D\u521B\u5EFA\u4E00\u4E2A\u3002', deleteSkillBtn: '\u5220\u9664\u6280\u80FD',\n installName: '\u6280\u80FD\u540D\u79F0', installNamePlaceholder: '\u4F8B\u5982 my-skill', installDescription: '\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09',\n installNameFromArchive: '\u6280\u80FD\u540D\u53D6\u81EA\u538B\u7F29\u5305\u5185\u7684 SKILL.md',\n installNameInvalid: '\u6280\u80FD\u540D\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26\uFF08a-z 0-9 -\uFF09',\n installBundle: '\u5F52\u5165 Bundle', installLoose: '\u4E0D\u5F52\u7EC4\uFF08\u6563\u88C5\uFF09', installConfirm: '\u5B89\u88C5', installCancel: '\u53D6\u6D88',\n bundlesTitle: '\u6280\u80FD\u5305', bundlesEmpty: '\u8FD8\u6CA1\u6709\u6280\u80FD\u5305\uFF0C\u70B9\u300C\u65B0\u5EFA Bundle\u300D\u521B\u5EFA\u4E00\u4E2A\u3002',\n // \u6280\u80FD\u5305\u5206\u7C7B\n bundleCatTitle: '\u5206\u7C7B', bundleCatAll: '\u5168\u90E8\u5206\u7C7B', bundleCatNone: '\u672A\u5206\u7C7B', bundleCatFilterAria: '\u6309\u5206\u7C7B\u7B5B\u9009\u6280\u80FD\u5305',\n bundleCatEdit: '\u8BBE\u7F6E\u5206\u7C7B', bundleCatEditTitle: '\u300C{name}\u300D\u7684\u5206\u7C7B', bundleCatPlaceholder: '\u81EA\u5B9A\u4E49\u5206\u7C7B\uFF0C\u56DE\u8F66\u6DFB\u52A0',\n bundleCatSaved: '\u5DF2\u66F4\u65B0\u300C{name}\u300D\u7684\u5206\u7C7B', bundleCatTip: '\u53EA\u770B\u300C{name}\u300D\u5206\u7C7B \u00B7 \u518D\u70B9\u4E00\u6B21\u53D6\u6D88\u7B5B\u9009',\n bundleCatLimit: '\u4E00\u4E2A\u6280\u80FD\u5305\u6700\u591A {n} \u4E2A\u5206\u7C7B', bundleCatDone: '\u4FDD\u5B58', bundleCatAddPreset: '\u52A0\u5165\u300C{name}\u300D',\n bundleCatEmptyHint: '\u8FD8\u6CA1\u5206\u7C7B\u3002\u70B9\u4E0B\u9762\u7684\u5EFA\u8BAE\u5206\u7C7B\uFF0C\u6216\u81EA\u5DF1\u5199\u4E00\u4E2A \u2014\u2014 \u5206\u7C7B\u53EA\u5F71\u54CD\u8FD9\u91CC\u7684\u67E5\u627E\uFF0C\u4E0D\u6539\u53D8\u6280\u80FD\u672C\u8EAB\u3002',\n bundleCatRemove: '\u79FB\u9664\u5206\u7C7B\u300C{name}\u300D', bundleCatCustom: '\u81EA\u5B9A\u4E49\u5206\u7C7B',\n bundleNoSkills: '\u8FD8\u6CA1\u6709\u6280\u80FD\uFF0C\u53EF\u4E0A\u4F20\u6216\u4ECE\u6563\u88C5\u6280\u80FD\u4E2D\u5F52\u5165\u3002',\n newBundle: '\u65B0\u5EFA\u6280\u80FD\u5305', newBundlePlaceholder: '\u6280\u80FD\u5305\u540D\u79F0', create: '\u521B\u5EFA', cancel: '\u53D6\u6D88',\n renameBundlePlaceholder: '\u65B0\u7684 Bundle \u540D\u79F0', rename: '\u91CD\u547D\u540D', delete: '\u5220\u9664',\n skillsCount: '{n} \u4E2A\u6280\u80FD', removeSkill: '\u79FB\u51FA',\n looseTitle: '\u6563\u88C5\u6280\u80FD', looseEmpty: '\u6CA1\u6709\u6563\u88C5 Skill',\n deleteBundleConfirm: '\u5220\u9664 Bundle\u300C{name}\u300D\uFF1F\u5176\u4E2D\u7684\u6280\u80FD\u5C06\u53D8\u4E3A\u6563\u88C5\u3002',\n deleteSkillConfirm: '\u5220\u9664\u6280\u80FD\u300C{name}\u300D\uFF1F\u6B64\u64CD\u4F5C\u4F1A\u5220\u9664\u5B83\u7684\u6587\u4EF6\u3002',\n enableSkill: '\u542F\u7528', disableSkill: '\u7981\u7528',\n enableBundle: '\u542F\u7528\u5168\u90E8', disableBundle: '\u7981\u7528\u5168\u90E8',\n toggleFailed: '\u5207\u6362\u5931\u8D25\uFF1A{message}',\n presetAll: '\u5168\u90E8',\n presetAllName: '\u5168\u90E8 Agent',\n presetStripLabel: 'Agent \u9884\u8BBE',\n presetHintAll: '\u5F53\u524D\u7F16\u8F91\u300C\u5168\u90E8 Agent\u300D\uFF1A\u5F00\u5173\u76F4\u63A5\u6539\u6280\u80FD\u6587\u4EF6\uFF0C\u5BF9\u6240\u6709\u9884\u8BBE\u751F\u6548\u3002',\n presetHintScoped: '\u5F53\u524D\u7F16\u8F91\u300C{name}\u300D\uFF1A\u53EA\u5BF9\u8BE5 Agent \u9884\u8BBE\u751F\u6548\uFF0C\u5176\u5B83\u9884\u8BBE\u4E0D\u53D7\u5F71\u54CD\u3002',\n presetReset: '\u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u5355\u72EC\u8BBE\u7F6E',\n presetDefaultTag: '\u9ED8\u8BA4',\n presetOverrideCount: '{n} \u9879\u5355\u72EC\u8BBE\u7F6E',\n presetLockedByGlobal: '\u300C\u5168\u90E8 Agent\u300D\u5C42\u5DF2\u7981\u7528\uFF0C\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00',\n // \u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\u6587\u6848\n copySkillName: '\u590D\u5236\u6280\u80FD\u540D', copiedSkillName: '\u5DF2\u590D\u5236', toolsLabel: '\u5DE5\u5177', scopeAll: '\u5168\u5C40', tagLoose: '\u6563\u88C5',\n // Skills Hub \u9875\u9762\u6587\u6848\n hubSubtitle: 'Skill \u7BA1\u7406\u5DE5\u4F5C\u533A', hubWorkspace: '\u5DE5\u4F5C\u533A', hubManage: '\u7BA1\u7406',\n hubMySkills: '\u6211\u7684\u6280\u80FD', hubAddSkills: '\u6DFB\u52A0\u6280\u80FD', hubBundles: '\u6280\u80FD\u5305', hubPresets: 'Agent \u9884\u8BBE', hubLoose: '\u6563\u88C5\u6280\u80FD',\n statManaged: '\u7BA1\u7406\u7684\u6280\u80FD', statEnabled: '\u5168\u5C40\u542F\u7528', statLoose: '\u6563\u88C5\u6280\u80FD', statSync: '\u6280\u80FD\u5065\u5EB7', statHealthy: '\u5168\u90E8\u5065\u5EB7',\n statManagedDesc: '\u60A8\u521B\u5EFA\u548C\u7BA1\u7406\u7684\u6280\u80FD\u603B\u6570', statEnabledDesc: '\u5728\u6240\u6709 Agent \u4E2D\u542F\u7528\u7684\u6280\u80FD',\n statLooseDesc: '\u672A\u5206\u7C7B\u7684\u6563\u88C5\u6280\u80FD', statSyncDesc: '\u6240\u6709\u6280\u80FD\u8FD0\u884C\u6B63\u5E38',\n statChecking: '\u68C0\u6D4B\u4E2D\u2026', statIssues: '{n} \u4E2A\u95EE\u9898', statUnknown: '\u68C0\u6D4B\u5931\u8D25', statPending: '\u5F85\u68C0\u6D4B',\n searchPlaceholder: '\u641C\u7D22\u6280\u80FD\u540D\u79F0\u3001\u63CF\u8FF0\u6216\u6807\u7B7E\u2026', filterAll: '\u5168\u90E8', filterBundles: '\u6280\u80FD\u5305', filterLoose: '\u6563\u88C5\u6280\u80FD', sortLabel: '\u540D\u79F0',\n presetSelect: 'Agent \u9884\u8BBE', viewList: '\u5217\u8868', viewGrid: '\u7F51\u683C',\n bannerTitle: '\u6DFB\u52A0\u6280\u80FD', bannerSub: '\u62D6\u5165\u6280\u80FD\u6587\u4EF6\u5939\u5B89\u88C5\uFF0C\u6216\u70B9\u51FB\u6D4F\u89C8\u9009\u62E9',\n bannerDiscovered: '\u53D1\u73B0\u5F85\u5BFC\u5165\u6280\u80FD', bannerFound: '\u53D1\u73B0 {n} \u4E2A\u6587\u4EF6\uFF08{folder}\uFF09\u5F85\u5BFC\u5165', bannerBtnBrowse: '\u6D4F\u89C8\u5E76\u5BFC\u5165', bannerBtnReview: '\u5BA1\u67E5\u5E76\u5BFC\u5165',\n noMatch: '\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684\u6280\u80FD',\n // \u5DE6\u680F\uFF1AAgent \u9884\u8BBE\u5206\u7C7B / \u5FEB\u6377\u7B5B\u9009 / \u6DFB\u52A0\u6280\u80FD\u5361\n presetCatTitle: 'Agent \u9884\u8BBE\u5206\u7C7B', quickFilter: '\u5FEB\u6377\u7B5B\u9009',\n catAll: '\u5168\u90E8', catStandard: '\u6807\u51C6\u6A21\u5F0F', catPtc: 'PTC \u6A21\u5F0F', catExtreme: '\u6781\u9650\u6A21\u5F0F', catCreative: '\u521B\u610F\u6A21\u5F0F',\n statusAll: '\u5168\u90E8', statusOn: '\u5DF2\u542F\u7528', statusOff: '\u5DF2\u505C\u7528',\n toolAll: '\u5168\u90E8\u5DE5\u5177', updatedAll: '\u6700\u8FD1\u66F4\u65B0', filterUpdated: '\u6700\u8FD1\u66F4\u65B0',\n addSkillsTitle: '\u6DFB\u52A0\u6280\u80FD', addSkillsSub: '\u62D6\u5165\u6280\u80FD\u6587\u4EF6\u5B89\u88C5\uFF0C\u6216\u70B9\u51FB\u6D4F\u89C8\u9009\u62E9',\n dropHere: '\u62D6\u62FD\u6587\u4EF6\u5230\u6B64\u5904', dropFormat: '\u652F\u6301 .zip .skill \u7B49\u683C\u5F0F', browseImport: '\u6D4F\u89C8\u5E76\u5BFC\u5165',\n // \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\n guideTitle: '\u5FEB\u901F\u4E0A\u624B\u6307\u5357',\n guideDesc1: '\u4E86\u89E3 Skill \u7684\u4F5C\u7528\u548C\u4F7F\u7528\u65B9\u6CD5',\n guideDesc2: '\u5FEB\u901F\u521B\u5EFA\u4F60\u7684\u7B2C\u4E00\u4E2A Skill',\n guideStart: '\u5F00\u59CB\u5B66\u4E60',\n guidePanelTitle: '\u5FEB\u901F\u4E0A\u624B',\n guideWhat: '\u4EC0\u4E48\u662F Skill?',\n guideWhatDesc: 'Skill \u662F Agent \u7684\u80FD\u529B\u6A21\u5757\uFF0C\u53EF\u4EE5\u8BA9 Agent \u5B66\u4F1A\u7279\u5B9A\u4EFB\u52A1\u3001\u6269\u5C55\u66F4\u591A\u80FD\u529B\u3002',\n guideCapUi: 'UI \u8BBE\u8BA1', guideCapCode: '\u4EE3\u7801\u751F\u6210', guideCapDoc: '\u6587\u6863\u5904\u7406', guideCapData: '\u6570\u636E\u5206\u6790', guideCapTool: '\u5DE5\u5177\u8C03\u7528',\n guideStep1: '\u521B\u5EFA Skill', guideStep1Desc: '\u901A\u8FC7\u4E0A\u4F20\u6587\u4EF6\u6216\u914D\u7F6E\u89C4\u5219\uFF0C\u521B\u5EFA\u65B0\u7684 Skill\uFF0C\u8BA9 Agent \u5B66\u4F1A\u65B0\u80FD\u529B\u3002',\n guideStep2: '\u914D\u7F6E Skill', guideStep2Desc: '\u8BBE\u7F6E\u8F93\u5165\u8F93\u51FA\u3001\u53C2\u6570\u548C\u6743\u9650\uFF0C\u786E\u4FDD Skill \u80FD\u6B63\u786E\u88AB Agent \u8C03\u7528\u3002',\n guideStep3: '\u542F\u7528\u7ED9 Agent', guideStep3Desc: '\u5C06 Skill \u542F\u7528\u5230 Agent \u4E2D\uFF0C\u8BA9 Agent \u5728\u5BF9\u8BDD\u4E2D\u81EA\u52A8\u4F7F\u7528\u3002',\n guideStep4: '\u67E5\u770B\u6548\u679C', guideStep4Desc: '\u5728\u5BF9\u8BDD\u4E2D\u6D4B\u8BD5 Skill \u7684\u6548\u679C\uFF0C\u6301\u7EED\u4F18\u5316\u6280\u80FD\u8868\u73B0\u3002',\n guideFull: '\u67E5\u770B\u5B8C\u6574\u6307\u5357',\n guideBest: '\u6700\u4F73\u5B9E\u8DF5',\n guideBest1: '\u4E00\u4E2A Skill \u4E13\u6CE8\u4E00\u4E2A\u80FD\u529B', guideBest2: '\u63CF\u8FF0\u6E05\u695A\u8F93\u5165\u548C\u8F93\u51FA',\n guideBest3: '\u5B9A\u671F\u66F4\u65B0\u6280\u80FD\u6587\u4EF6', guideBest4: '\u4E0D\u8981\u521B\u5EFA\u91CD\u590D\u80FD\u529B',\n guideMoreBest: '\u4E86\u89E3\u66F4\u591A\u6700\u4F73\u5B9E\u8DF5',\n guideClose: '\u6536\u8D77\u6307\u5357',\n // SKILL / MCP \u9876\u5C42 tab\n kindSkill: 'SKILL', kindPrompt: '\u63D0\u793A\u8BCD', kindMcp: 'MCP',\n // MCP \u89C6\u56FE\n mcpServer: 'MCP Server', mcpTools: '\u5DE5\u5177\u5217\u8868', mcpLog: '\u8FDE\u63A5\u65E5\u5FD7', mcpConfig: '\u914D\u7F6E\u6A21\u677F',\n mcpRecommendMenu: '\u63A8\u8350 MCP Server', mcpRecommendTitle: '\u63A8\u8350 MCP Server', mcpAdd: '\u6DFB\u52A0',\n // MCP Server \u9875\uFF08\u56FE\u4E00\u5934\u90E8 + \u7EDF\u8BA1\u5361\uFF09\n mcpTitle: 'MCP \u7BA1\u7406', mcpProtocol: 'Model Contest Protocol',\n mcpSubtitle: '\u7BA1\u7406 MCP Server\uFF0C\u6269\u5C55 Agent \u80FD\u529B\u8FB9\u754C',\n mcpMarketplace: 'MCP Marketplace', mcpAddServer: '\u6DFB\u52A0 MCP Server',\n mcpStatTotal: 'MCP Server \u603B\u6570', mcpStatTotalDesc: '\u5DF2\u6DFB\u52A0\u7684 MCP Server',\n mcpStatEnabled: '\u5DF2\u542F\u7528', mcpStatEnabledDesc: 'Agent \u53EF\u4F7F\u7528',\n mcpStatTools: '\u53EF\u7528\u5DE5\u5177', mcpStatToolsDesc: '\u901A\u8FC7 MCP \u63D0\u4F9B\u7684\u5DE5\u5177',\n mcpStatRunning: '\u8FD0\u884C\u4E2D', mcpStatRunningDesc: '\u5F53\u524D\u8FDE\u63A5\u6B63\u5E38',\n // \u63A8\u8350 Skill\n skillRecommendTitle: '\u63A8\u8350 Skill',\n // MCP Server \u5217\u8868\uFF08\u56FE\u4E8C\uFF09\n mcpListTitle: 'MCP Server \u5217\u8868', mcpEmptyList: '\u6682\u65E0 MCP Server\uFF0C\u70B9\u51FB\u53F3\u4E0A\u89D2\u300C\u6DFB\u52A0 MCP Server\u300D\u5F00\u59CB\u63A5\u5165\u3002',\n mcpViewAll: '\u67E5\u770B\u5168\u90E8 {n} \u4E2A MCP Server',\n mcpAdded: '\u5DF2\u6DFB\u52A0', mcpRemove: '\u79FB\u9664',\n mcpAddModalTitle: '\u6DFB\u52A0 MCP Server',\n mcpAddName: '\u540D\u79F0', mcpAddNamePlaceholder: '\u4F8B\u5982 My MCP',\n mcpAddDesc: '\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09', mcpAddDescPlaceholder: '\u7B80\u5355\u63CF\u8FF0\u8FD9\u4E2A MCP \u7684\u7528\u9014',\n mcpAddType: '\u8FDE\u63A5\u7C7B\u578B', mcpAddTypeStdio: 'stdio', mcpAddTypeHttp: 'http', mcpAddTypeSse: 'sse',\n mcpAddCommand: '\u542F\u52A8\u547D\u4EE4', mcpAddCommandPlaceholder: '\u4F8B\u5982 npx -y @modelcontextprotocol/server-filesystem',\n mcpAddUrl: '\u63A5\u53E3\u5730\u5740', mcpAddUrlPlaceholder: '\u4F8B\u5982 https://example.com/mcp',\n mcpAddConfirm: '\u6DFB\u52A0', mcpAddCat: '\u81EA\u5B9A\u4E49',\n // \u5DE5\u5177\u5217\u8868\u9875\n mcpToolsTitle: '\u53EF\u7528\u5DE5\u5177 \u00B7 {n}',\n mcpToolsSearch: '\u641C\u7D22\u5DE5\u5177\u2026',\n mcpToolsEmpty: '\u6682\u65E0\u53EF\u7528\u5DE5\u5177\uFF1A\u5148\u6DFB\u52A0\u5E76\u542F\u7528 MCP Server',\n // \u63A8\u8350\u9875\u8054\u7F51\u641C\u7D22\n mcpSearchPlaceholder: '\u641C\u7D22 MCP Server\uFF0C\u5982 google / \u9489\u9489 / \u98DE\u4E66\u2026',\n mcpSearching: '\u6B63\u5728\u641C\u7D22\u5916\u90E8 MCP \u76EE\u5F55\u2026',\n mcpSearchResults: '\u641C\u7D22\u7ED3\u679C \u00B7 {n}',\n mcpSearchEmpty: '\u6CA1\u6709\u627E\u5230\u300C{q}\u300D\u76F8\u5173\u7684 MCP\uFF0C\u6362\u4E2A\u5173\u952E\u8BCD\u8BD5\u8BD5',\n mcpOpen: '\u6253\u5F00',\n mcpOpenGitHub: 'GitHub \u4ED3\u5E93',\n mcpOpenRegistry: 'MCP Registry',\n mcpResolving: '\u89E3\u6790\u4E2D\u2026',\n mcpResolveFailed: '\u672A\u80FD\u8BC6\u522B\u5B89\u88C5\u65B9\u5F0F\uFF0C\u8BF7\u6253\u5F00\u4ED3\u5E93\u67E5\u770B\u914D\u7F6E',\n // \u8FDE\u63A5\u65E5\u5FD7\u9875\n mcpLogTitle: '\u8FDE\u63A5\u65E5\u5FD7',\n mcpLogEmpty: '\u6682\u65E0\u8FDE\u63A5\u65E5\u5FD7\uFF0C\u63A5\u5165 MCP Server \u540E\u81EA\u52A8\u8BB0\u5F55',\n mcpLogClear: '\u6E05\u7A7A\u65E5\u5FD7',\n mcpLogAdd: '\u5DF2\u6DFB\u52A0', mcpLogEnable: '\u5DF2\u542F\u7528', mcpLogDisable: '\u5DF2\u7981\u7528', mcpLogRemove: '\u5DF2\u79FB\u9664',\n // \u914D\u7F6E\u6A21\u677F\u9875\n mcpConfigTitle: '\u914D\u7F6E\u6A21\u677F',\n mcpConfigCopy: '\u590D\u5236', copied: '\u5DF2\u590D\u5236',\n mcpTagOfficial: '\u5B98\u65B9', mcpTagCommunity: '\u793E\u533A',\n mcpStatusEnabled: '\u5DF2\u542F\u7528', mcpStatusDisabled: '\u5DF2\u7981\u7528',\n mcpAutostart: '\u81EA\u542F\u52A8',\n mcpAutostartTitle: '\u4F1A\u8BDD\u542F\u52A8\u65F6\u81EA\u52A8\u62C9\u8D77\u8BE5 MCP \u8FDB\u7A0B\uFF08\u5173\u95ED\u53EF\u8282\u7701\u5185\u5B58\uFF09',\n // \u771F\u5B9E\u6CE8\u518C\u72B6\u6001\uFF08mcp-client \u6865\u63A5\uFF09\n mcpLiveNote: '\u4EE5\u4E0B\u4E3A DSH \u5B9E\u9645\u6CE8\u518C\u7684 MCP Server\u00B7\u53F3\u4E0A\u5F00\u5173 = \u542F\u7528/\u7981\u7528\uFF08\u5B9E\u65F6\u751F\u6548\uFF09\u00B7\u62A5 Session not found \u65F6\u5F00\u5173\u5207\u4E00\u6B21\uFF08\u7981\u2192\u542F\uFF09\u5373\u91CD\u8FDE\uFF0C\u65E0\u9700\u91CD\u542F DSH',\n mcpLiveDisabled: '\u5DF2\u7981\u7528',\n mcpLiveToggleFailed: '\u5207\u6362\u5931\u8D25\uFF08\u914D\u7F6E\u5199\u4FDD\u62A4\u6216\u6761\u76EE\u7F3A\u5931\uFF09',\n mcpLiveEmpty: '\u672A\u68C0\u6D4B\u5230\u5DF2\u6CE8\u518C\u7684 MCP Server\uFF1A\u5728 cordis.patch.yml \u6DFB\u52A0 mcp-client \u6761\u76EE\u5E76\u91CD\u542F DSH \u540E\u5373\u53EF',\n mcpLiveUnavailable: '\u72B6\u6001\u63A5\u53E3\u672A\u5C31\u7EEA\uFF08host \u6539\u52A8\u9700\u91CD\u542F DSH \u670D\u52A1\uFF09\uFF1A\u6865\u63A5\u5DE5\u5177\u4ECD\u53EF\u7528\uFF0C\u6B64\u9875\u6682\u65E0\u6CD5\u8BFB\u53D6\u6CE8\u518C\u8868',\n mcpLiveRegistered: '\u5DF2\u6CE8\u518C',\n mcpLiveRegisteredTitle: '\u5DF2\u6865\u63A5',\n mcpLiveToolsOf: '\u5DE5\u5177',\n mcpLiveRefresh: '\u5237\u65B0',\n mcpConnStatus: '\u8FDE\u63A5\u72B6\u6001', mcpConnOk: '\u5DF2\u8FDE\u63A5', mcpConnDown: '\u4E0D\u53EF\u7528', mcpConnTip: '\u5B9E\u65F6\u8BFB\u53D6\u5230 {n} \u4E2A\u5168\u5C40 MCP Server',\n mcpLiveConfigHint: '\u6DFB\u52A0\uFF1A\u7F16\u8F91 cordis.patch.yml\uFF08\u6216\u4F7F\u7528\u300C\u6DFB\u52A0 MCP Server\u300D\u751F\u6210\u914D\u7F6E\u7247\u6BB5\uFF09',\n // \u9884\u8BBE\u7EF4\u5EA6\uFF080.1.6\uFF09\uFF1A\u5168\u5C40 / \u9884\u8BBE\u4E13\u5C5E / \u906E\u853D\n mcpScopeTitle: 'Agent \u9884\u8BBE\u8303\u56F4',\n mcpScopeHintAll: '\u5F53\u524D\u67E5\u770B\u5168\u5C40 Server\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF09\u3002\u9009\u62E9\u67D0\u4E2A\u9884\u8BBE\uFF0C\u53EF\u7BA1\u7406\u5B83\u4E13\u5C5E\u7684 Server \u4E0E\u906E\u853D\u3002',\n mcpPresetGlobalSection: '\u7EE7\u627F\u7684\u5168\u5C40 Server',\n mcpPresetOwnSection: '\u8BE5\u9884\u8BBE\u4E13\u5C5E Server',\n mcpPresetMasked: '\u5DF2\u906E\u853D',\n mcpPresetMaskState: '\u7EE7\u627F\u5168\u5C40\uFF08\u672A\u906E\u853D\uFF09',\n mcpPresetMaskHint: '\u5173\u6389\u5F00\u5173 = \u5BF9\u8BE5\u9884\u8BBE\u906E\u853D\uFF1A\u5DE5\u5177\u3001\u670D\u52A1\u5668\u6307\u4EE4\u4E0E\u8D44\u6E90\u8BFB\u53D6\u90FD\u9690\u85CF\uFF1B\u5168\u5C40\u8FDE\u63A5\u4FDD\u7559\uFF08\u8981\u300C\u4E0D\u8FDE\u63A5\u300D\u8BF7\u6539\u7528\u300C\u4E13\u5C5E Server\u300D\uFF09\u3002',\n mcpPresetCovered: '\u5DF2\u88AB\u672C\u9884\u8BBE\u540C\u540D Server \u8986\u76D6',\n mcpPresetOwnHint: '\u4E13\u5C5E Server \u5199\u8FDB\u8BE5\u9884\u8BBE\u58F0\u660E\u884C\u7684 plugins\uFF1A\u72EC\u7ACB\u8FDE\u63A5\uFF0C\u4EC5\u8BE5\u9884\u8BBE\u4E0E\u5176\u5B50\u4EE3\u7406\u53EF\u89C1\u3002',\n mcpAddServerGlobal: '\u6DFB\u52A0 MCP Server\uFF08\u5168\u5C40\uFF09',\n mcpAddGlobalHint: '\u5168\u5C40 Server \u5BF9\u6240\u6709\u9884\u8BBE\u751F\u6548\uFF1B\u53EA\u60F3\u7ED9\u5F53\u524D\u9884\u8BBE\u7528\uFF0C\u8BF7\u70B9\u5DE6\u4FA7\u7684\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u3002',\n mcpOwnRemoveConfirmTitle: '\u79FB\u9664\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\uFF1F',\n mcpOwnRemoveConfirmMsg: '\u5C06\u4ECE\u300C{name}\u300D\u7684\u58F0\u660E\u884C\u91CC\u5220\u6389\u8FD9\u4E00\u6761 mcp-client \u6761\u76EE\uFF08\u7531 DSH \u539F\u5B50\u5199\u56DE profile \u914D\u7F6E\uFF09\uFF0C\u5BF9\u8BE5\u9884\u8BBE\u7684\u65B0\u4F1A\u8BDD\u751F\u6548\uFF1B\u5168\u5C40\u7684\u540C\u540D Server \u4E0D\u53D7\u5F71\u54CD\u3002',\n // \u540C\u540D\u8986\u76D6\uFF1A\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server \u65F6\u7684\u906E\u853D\u5F00\u5173\u4E0E\u63D0\u793A\n mcpPresetCoveredSwitchHint: '\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761\u3002\u8BE5\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server\uFF0C\u5DE5\u5177\u4ECD\u7531\u5B83\u63D0\u4F9B \u2014\u2014 \u8981\u4E00\u8D77\u5173\u6389\u8BF7\u79FB\u9664\u4E0B\u65B9\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\u3002',\n mcpPresetCoveredMasked: '\u5DF2\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761 \u00B7 \u5DE5\u5177\u4ECD\u7531\u8BE5\u9884\u8BBE\u540C\u540D Server \u63D0\u4F9B',\n mcpPresetShadowGlobalTag: '\u540C\u540D\u5168\u5C40',\n mcpPresetShadowGlobalTip: '\u5168\u5C40\u4E5F\u6709\u4E00\u53F0\u540C\u540D Server\u3002\u672C\u9884\u8BBE\u7528\u81EA\u5E26\u7684\u8FD9\u53F0\uFF0C\u4E24\u8FB9\u7684\u5DE5\u5177\u5F00\u5173\u5404\u8BB0\u5404\u7684\u8D26\uFF08\u4E92\u4E0D\u5F71\u54CD\uFF09\u3002',\n mcpPresetOwnEmpty: '\u8BE5\u9884\u8BBE\u8FD8\u6CA1\u6709\u4E13\u5C5E Server',\n mcpPresetStorageHint: '\u8BE5\u9884\u8BBE\u7531\u968F\u5B89\u88C5\u7684 bundle \u58F0\u660E\uFF1A\u5199\u5165\u4F1A\u5728 profile \u5C42\u6574\u4EFD\u8986\u76D6\u5B83\u7684 plugins\uFF0C\u6B64\u540E\u8BE5\u9884\u8BBE\u4E0D\u518D\u8DDF\u968F DSH \u5347\u7EA7\u53D8\u5316\u3002',\n mcpPresetAddOwn: '\u6DFB\u52A0\u4E13\u5C5E Server',\n mcpPresetNewSession: '\u9884\u8BBE\u6539\u52A8\uFF08\u70ED\u91CD\u8F7D\uFF09\u5BF9\u65B0\u4F1A\u8BDD\u751F\u6548',\n mcpPresetFailed: '\u64CD\u4F5C\u5931\u8D25\uFF1A{message}',\n // MCP \u9875\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09\uFF1A\u7EDF\u8BA1\u5361 / \u63D0\u793A\u884C / \u5DE5\u5177\u6761\n mcpStatManaged: '\u7BA1\u7406\u7684 Server', mcpStatManagedDesc: '\u60A8\u63A5\u5165\u7684 MCP Server \u603B\u6570',\n mcpStatGlobal: '\u5168\u5C40 Server', mcpStatGlobalDesc: '\u6240\u6709 Agent \u9884\u8BBE\u5171\u7528',\n mcpStatOwn: '\u9884\u8BBE\u4E13\u5C5E', mcpStatOwnDesc: '\u53EA\u5728\u67D0\u4E2A\u9884\u8BBE\u5185\u751F\u6548',\n mcpStatHealth: '\u8FDE\u63A5\u72B6\u6001', mcpStatHealthDesc: '\u5DF2\u505C\u7528\u7684\u6761\u76EE\u4E0D\u8BA1\u5165\u5DE5\u5177',\n mcpHealthOk: '\u5168\u90E8\u8FD0\u884C\u4E2D', mcpHealthWarn: '{n} \u4E2A\u5DF2\u505C\u7528',\n mcpScopeAllTip: '\u5168\u90E8 Agent\uFF1A{n} \u4E2A\u5168\u5C40 Server\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF09',\n mcpScopePresetTip: '\u8BE5\u9884\u8BBE\u53EF\u89C1 {n} \u4E2A Server',\n mcpScopeOverrideCount: '{n} \u9879\u5355\u72EC\u8BBE\u7F6E',\n mcpScopeHintScoped: '\u5F53\u524D\u7F16\u8F91\u300C{name}\u300D\uFF1A\u4E13\u5C5E Server \u53EA\u5BF9\u8FD9\u4E2A\u9884\u8BBE\u751F\u6548\uFF1B\u5F00\u5173 = \u906E\u853D\u5B83\u7EE7\u627F\u7684\u5168\u5C40 Server\uFF0C\u5176\u5B83\u9884\u8BBE\u4E0D\u53D7\u5F71\u54CD\u3002',\n mcpWaitingTools: '\u6B63\u5728\u7B49\u5F85\u300C{names}\u300D\u8FDE\u63A5\u5E76\u6CE8\u518C\u5DE5\u5177\u2026\uFF08\u81EA\u52A8\u5237\u65B0\u4E2D\uFF0C\u65E0\u9700\u624B\u52A8\u70B9\u5237\u65B0\uFF09',\n mcpToolsPendingReg: '\u7B49\u5F85\u6CE8\u518C',\n mcpToolsPendingRegTip: '\u5DE5\u5177\u540D\u6765\u81EA\u5386\u53F2\u7F13\u5B58\uFF1A\u8FDB\u7A0B\u8FD8\u5728\u8FDE\u63A5\uFF0C\u6CE8\u518C\u5B8C\u6210\u540E\u6570\u91CF\u4F1A\u81EA\u52A8\u66F4\u65B0\u4E3A\u5B9E\u9645\u503C\u3002',\n // \u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF08\u5DE5\u5177\u7EA7\uFF09\n mcpToolGlobalOff: '\u5168\u5C40\u5DF2\u505C\u7528',\n mcpToolGlobalOffTip: '\u5168\u5C40\u5DF2\u505C\u7528\uFF1A\u8BE5\u5DE5\u5177\u5728\u300C\u5168\u90E8 Agent\u300D\u5C42\u88AB\u5173\u95ED \u2014\u2014 \u4E00\u7968\u5426\u51B3\uFF0C\u6240\u6709\u9884\u8BBE\u90FD\u4E0D\u53EF\u89C1\u3001\u4E0D\u53EF\u8C03\u7528\uFF08\u9884\u8BBE\u5C42\u4E0D\u53EF\u62E8\u52A8\uFF09\u3002\u5404\u9884\u8BBE\u539F\u6709\u7684\u4E2A\u6027\u5316\u8BBE\u7F6E\u5DF2\u4FDD\u7559\uFF0C\u5168\u5C40\u6062\u590D\u540E\u81EA\u52A8\u8FD8\u539F\u3002',\n // \u4E00\u952E\u5168\u7981 / \u5168\u5F00\n mcpToolAllAria: '\u300C{name}\u300D\u7684\u5168\u90E8\u5DE5\u5177',\n mcpToolAllEnable: '\u5F00\u542F\u8BE5 MCP \u7684\u5168\u90E8\u5DE5\u5177',\n mcpToolAllDisable: '\u4E00\u952E\u7981\u7528\u8BE5 MCP \u7684\u5168\u90E8\u5DE5\u5177\uFF08\u53EA\u5173\u5DE5\u5177\uFF0C\u4FDD\u7559\u8FDE\u63A5\uFF09',\n mcpToolAllPartial: '\u90E8\u5206\u5DE5\u5177\u5DF2\u7981\u7528',\n // \u906E\u853D\u5B89\u88C5\u8BCA\u65AD\n mcpMaskInstallFailed: '\u906E\u853D\u672A\u5728\u8FD0\u884C\u671F\u751F\u6548\uFF1A{message}',\n mcpMaskNoAgent: '\u906E\u853D\u5DF2\u5199\u5165\uFF0C\u4F46\u8BE5\u9884\u8BBE\u5F53\u524D\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD \u2014\u2014 \u65B0\u4F1A\u8BDD\u8D77\u751F\u6548\u3002',\n mcpMaskNoDeny: '\u906E\u853D\u5DF2\u5199\u5165\uFF0C\u4F46\u8FD0\u884C\u671F\u8FD8\u6CA1\u62D2\u5230\u4EFB\u4F55\u5DE5\u5177\uFF08\u8BE5 MCP \u53EF\u80FD\u5C1A\u672A\u6CE8\u518C\u5DE5\u5177\uFF09\u3002\u82E5\u5BF9\u8BDD\u91CC\u4ECD\u80FD\u770B\u5230\u5B83\u7684\u5DE5\u5177\uFF0C\u8BF7\u91CD\u5F00\u4F1A\u8BDD\u6216\u91CD\u542F DSH\u3002',\n mcpSearchServers: '\u641C\u7D22 Server \u540D\u79F0\u6216\u5DE5\u5177\u2026',\n mcpListFilteredEmpty: '\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684 Server',\n mcpToolsUnavailable: '\u5DE5\u5177\u4E0D\u53EF\u7528',\n // \u5DE5\u5177\u7EA7\u542F\u505C\uFF08\u5361\u7247\u4E0A\u7684\u5DE5\u5177 chips\uFF09\n mcpToolsHint: '\u70B9\u51FB\u5DE5\u5177\u540D\u53EF\u5355\u72EC\u542F\u505C\uFF1A\u7EFF = \u542F\u7528\uFF0C\u7070 = \u7981\u7528\u3002',\n mcpToolChipsAria: '\u300C{name}\u300D\u63D0\u4F9B\u7684\u5DE5\u5177',\n mcpToolClickEnable: '\u70B9\u51FB\u542F\u7528\u8BE5\u5DE5\u5177',\n mcpToolClickDisable: '\u70B9\u51FB\u7981\u7528\u8BE5\u5DE5\u5177',\n mcpToolDisabledCount: '{n} \u4E2A\u5DE5\u5177\u5DF2\u7981\u7528',\n // \u7C98\u8D34\u6DFB\u52A0\uFF08JSON / DSH \u539F\u751F YAML\uFF09\n mcpPasteHint: '\u7C98\u8D34\u5176\u5B83 harness \u7684 JSON\uFF08.mcp.json \u7684 mcpServers \u6620\u5C04\uFF09\u6216 DSH \u539F\u751F YAML\uFF08\u4E5F\u63A5\u53D7 mcp-client \u884C\u7247\u6BB5\uFF09\uFF1B\u5199\u5165 {scope}\u3002',\n mcpPasteScopeGlobal: '\u5168\u5C40 profile patch\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF0C\u70ED\u91CD\u8F7D\u5373\u65F6\u751F\u6548\uFF09',\n mcpPasteScopePreset: '\u9884\u8BBE\u4E13\u5C5E',\n mcpPasteFormat: '\u7C98\u8D34\u683C\u5F0F',\n mcpPasteNative: '\u539F\u751F',\n mcpPasteParsed: '\u89E3\u6790\u51FA {n} \u4E2A server\uFF1A{names}',\n mcpPasteCheck: '\u6821\u9A8C\u5E76\u9884\u89C8',\n mcpPasteChecking: '\u6821\u9A8C\u4E2D\u2026',\n mcpPasteAdding: '\u5199\u5165\u4E2D\u2026',\n mcpPasteAdded: '\u5DF2\u6DFB\u52A0 {added} \u4E2A\uFF0C\u8DF3\u8FC7 {skipped} \u4E2A\u5DF2\u5B58\u5728',\n mcpPasteFailed: '\u6DFB\u52A0\u5931\u8D25',\n mcpRemoveConfirmTitle: '\u79FB\u9664 MCP Server',\n mcpRemoveConfirmMsg: '\u5C06\u4ECE cordis.patch.yml \u4E2D\u5220\u9664\u300C{name}\u300D\u6761\u76EE\uFF0C\u5176\u5DE5\u5177\u968F\u5373\u6CE8\u9500\u4E14\u4E0D\u53EF\u6062\u590D\uFF1B\u5982\u9700\u6062\u590D\u8BF7\u91CD\u65B0\u6DFB\u52A0\u3002',\n mcpLiveRemoveFailed: '\u79FB\u9664\u5931\u8D25\uFF08\u914D\u7F6E\u5199\u4FDD\u62A4\u6216\u6761\u76EE\u7F3A\u5931\uFF09',\n mcpCopyDone: '\u5DF2\u590D\u5236 \u2713',\n mcpCopyHint: '\u5DF2\u590D\u5236\u914D\u7F6E\u7247\u6BB5\uFF0C\u8BF7\u7C98\u8D34\u5230 cordis.patch.yml \u540E\u91CD\u542F DSH \u751F\u6548',\n mcpLogNewNote: '\u6865\u63A5\u5F0F MCP\uFF08cordis.patch.yml \u914D\u7F6E\uFF09\u65E0\u672C\u5730\u8FDE\u63A5\u65E5\u5FD7\uFF1A\u8FDE\u63A5\u72B6\u6001\u4EE5\u300CMCP Server\u300D\u9875\u771F\u5B9E\u6CE8\u518C\u4E3A\u51C6\uFF1B\u6B64\u9875\u4EC5\u5C55\u793A\u65E7\u7248\u9762\u677F\u7684\u672C\u5730\u8BB0\u5F55\u3002',\n // \u53F3\u4FA7\u4FE1\u606F\u680F\uFF08\u56FE\u4E09\uFF09\n mcpWhatTitle: '\u4EC0\u4E48\u662F MCP?',\n mcpWhatDesc: 'MCP (Model Contest Protocol) \u662F\u4E00\u4E2A\u5F00\u653E\u534F\u8BAE\uFF0C\u5B83\u6807\u51C6\u5316\u4E86\u5E94\u7528\u7A0B\u5E8F\u5411 LLM \u63D0\u4F9B\u4E0A\u4E0B\u6587\u548C\u5DE5\u5177\u7684\u65B9\u5F0F\u3002',\n mcpPoint1: '\u6807\u51C6\u5316', mcpPoint1Desc: '\u7EDF\u4E00\u7684\u534F\u8BAE\u89C4\u8303',\n mcpPoint2: '\u5B89\u5168\u53EF\u63A7', mcpPoint2Desc: '\u6743\u9650\u7BA1\u7406\uFF0C\u5B89\u5168\u8BBF\u95EE',\n mcpPoint3: '\u53EF\u6269\u5C55', mcpPoint3Desc: '\u8F7B\u677E\u96C6\u6210\u65B0\u7684\u5DE5\u5177\u548C\u670D\u52A1',\n mcpPoint4: '\u4E92\u64CD\u4F5C', mcpPoint4Desc: '\u8DE8\u5E73\u53F0\u3001\u8DE8\u670D\u52A1\u517C\u5BB9',\n mcpHowTitle: 'MCP \u5DE5\u4F5C\u539F\u7406',\n mcpAgent: 'Agent', mcpClient: 'MCP Client', mcpServerNode: 'MCP Server',\n mcpReq: '\u8BF7\u6C42', mcpResp: '\u54CD\u5E94', mcpCall: '\u8C03\u7528', mcpExt: '\u5916\u90E8\u5DE5\u5177 / \u6570\u636E\u5E93 / \u51FD\u6570',\n mcpStartTitle: '\u5FEB\u901F\u4E0A\u624B',\n mcpStep1: '\u6DFB\u52A0 MCP Server', mcpStep1Desc: '\u914D\u7F6E\u6216\u5BFC\u5165 MCP Server \u8FDE\u63A5\u4FE1\u606F',\n mcpStep2: '\u6388\u6743\u4E0E\u914D\u7F6E', mcpStep2Desc: '\u8BBE\u7F6E\u8BBF\u95EE\u6743\u9650\u548C\u5FC5\u8981\u7684\u914D\u7F6E',\n mcpStep3: '\u4F7F\u7528\u4E0E\u4F18\u5316', mcpStep3Desc: '\u5728\u5BF9\u8BDD\u4E2D\u8C03\u7528 MCP \u5DE5\u5177\uFF0C\u6301\u7EED\u4F18\u5316\u914D\u7F6E',\n mcpIntroTitle: 'MCP \u5FEB\u901F\u4E86\u89E3', mcpIntroDesc: '\u4E86\u89E3 MCP \u7684\u4F5C\u7528\u3001\u5DE5\u4F5C\u539F\u7406\u4E0E\u5FEB\u901F\u4E0A\u624B',\n mcpIntroBtn: '\u4E86\u89E3 MCP', mcpOverlayTitle: '\u4E86\u89E3 MCP',\n mcpNavTitle: 'MCP',\n mcpComingDesc: '\u529F\u80FD\u5F00\u53D1\u4E2D\uFF0C\u656C\u8BF7\u671F\u5F85',\n // \u5206\u7EC4\u884C / \u66F4\u591A\u83DC\u5355 / \u5206\u9875\n nameAsc: '\u5347\u5E8F', nameDesc: '\u964D\u5E8F', moreActions: '\u66F4\u591A\u64CD\u4F5C',\n totalItems: '\u5171 {n} \u6761', pageSize: '{n} \u6761/\u9875', pagePrev: '\u4E0A\u4E00\u9875', pageNext: '\u4E0B\u4E00\u9875',\n // \u7A7A\u6280\u80FD\u5305 / \u5931\u6548\u5F15\u7528 / \u64CD\u4F5C\u53CD\u9988\n bundleEmptyTitle: '\u8FD9\u4E2A\u6280\u80FD\u5305\u8FD8\u662F\u7A7A\u7684',\n bundleEmptyHint: '\u4E0A\u4F20\u6280\u80FD\u65F6\u5728\u8FD9\u91CC\u9009\u5B83\u5F52\u7EC4\uFF0C\u6216\u4ECE\u6563\u88C5\u6280\u80FD\u5361\u7247\u70B9\u300C+\u300D\u5F52\u5165\u3002',\n bundleUploadHere: '\u4E0A\u4F20\u6280\u80FD\u5230\u6B64\u5305',\n bundleMissingN: '\u8D26\u672C\u91CC\u6709 {n} \u4E2A\u6280\u80FD\u5DF2\u4E0D\u5B58\u5728',\n bundlePrune: '\u6E05\u7406\u5931\u6548\u5F15\u7528',\n pruned: '\u5DF2\u6E05\u7406\u5931\u6548\u5F15\u7528',\n installedOk: '\u5DF2\u5B89\u88C5\u6280\u80FD\u300C{name}\u300D',\n deletedOk: '\u5DF2\u5220\u9664\u6280\u80FD\u300C{name}\u300D',\n removedOk: '\u5DF2\u4ECE\u6280\u80FD\u5305\u79FB\u51FA\u300C{name}\u300D',\n assignOk: '\u5DF2\u628A\u300C{name}\u300D\u5F52\u5165\u6280\u80FD\u5305',\n bundleCreated: '\u5DF2\u521B\u5EFA\u6280\u80FD\u5305\u300C{name}\u300D\uFF0C\u4E0A\u4F20\u6280\u80FD\u65F6\u53EF\u76F4\u63A5\u5F52\u5165\u5B83',\n bundleDeleted: '\u5DF2\u5220\u9664\u6280\u80FD\u5305\u300C{name}\u300D\uFF0C\u5176\u4E2D\u7684\u6280\u80FD\u53D8\u4E3A\u6563\u88C5',\n opFailed: '\u64CD\u4F5C\u5931\u8D25\uFF1A{label} \u2014 {message}',\n installNameRewrite: 'SKILL.md \u91CC\u5199\u7684\u662F\u300C{meta}\u300D\uFF0C\u5B89\u88C5\u65F6\u4F1A\u7EDF\u4E00\u6539\u6210\u300C{name}\u300D\uFF08\u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4FDD\u6301\u4E00\u81F4\uFF09\u3002',\n deleteSkillDirNote: '\uFF08\u6280\u80FD\u76EE\u5F55\u300C{dir}\u300D\u4E0E\u6280\u80FD\u540D\u4E0D\u540C\uFF0C\u4F1A\u4E00\u5E76\u5220\u9664\uFF09',\n skillOffTag: '\u5DF2\u505C\u7528',\n presetCountTip: '\u8BE5\u9884\u8BBE\u4E0B\u5DF2\u542F\u7528 {n} \u4E2A / \u5171 {total} \u4E2A\u6280\u80FD',\n}\n\nexport function skillT(key: string, params?: Record<string, string | number>): string {\n let text = SKILL_ZH[key] ?? key\n if (params) {\n for (const k of Object.keys(params)) text = text.split(`{${k}}`).join(String(params[k]))\n }\n return text\n}\n", "/**\n * skills/McpAddModal \u2014 \u7C98\u8D34\u6DFB\u52A0 MCP Server\uFF08JSON / DSH \u539F\u751F YAML\uFF1A\u6821\u9A8C\u9884\u89C8 \u2192 \u843D\u76D8\uFF09\u3002\n */\nimport { useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { GuideArtIconSmall } from './icons.js'\nimport { css } from './styles.js'\n\n/**\n * \u7C98\u8D34\u6DFB\u52A0 MCP\uFF1AJSON\uFF08\u5176\u5B83 harness \u7684 `.mcp.json` \u5F62\u6001\uFF09\u6216 DSH \u539F\u751F YAML\uFF0C\n * \u5148\u300C\u6821\u9A8C\u5E76\u9884\u89C8\u300D\uFF08\u5BBF\u4E3B\u89E3\u6790\uFF0C\u5E26\u884C\u53F7\u62A5\u9519\uFF09\uFF0C\u786E\u8BA4\u540E\u5199\u5165\u76EE\u6807\uFF08\u5168\u5C40 patch / \u9884\u8BBE\uFF09\u3002\n * \u4E00\u6B21\u7C98\u8D34\u53EF\u542B\u591A\u4E2A server\uFF1B\u5DF2\u5B58\u5728\u7684 serverName \u81EA\u52A8\u8DF3\u8FC7\u3002\n */\nexport function McpPasteAdd({ t, presetId, onAdded, onCancel }: {\n t: (key: string, params?: Record<string, string | number>) => string\n /** \u76EE\u6807\u9884\u8BBE\uFF1Bundefined = \u5168\u5C40 profile patch\u3002 */\n presetId?: string\n /** \u6DFB\u52A0\u6210\u529F\u56DE\u8C03\uFF1A\u5E26\u4E0A\u672C\u6B21\u65B0\u589E\u7684 serverName\uFF08\u9762\u677F\u636E\u6B64\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C\uFF09\u3002 */\n onAdded: (added: string[]) => void\n onCancel: () => void\n}): JSX.Element {\n const [format, setFormat] = useState<'json' | 'yaml'>('json')\n const [text, setText] = useState('')\n const [busy, setBusy] = useState<'preview' | 'add' | null>(null)\n const [preview, setPreview] = useState<{ names: string[]; yaml: string } | null>(null)\n const [errors, setErrors] = useState<string[]>([])\n const [warnings, setWarnings] = useState<string[]>([])\n const [notice, setNotice] = useState<string | null>(null)\n const target = presetId === undefined ? 'global' : 'preset'\n const placeholder = format === 'json'\n ? '{ \"mcpServers\": { \"my-server\": { \"command\": \"npx\", \"args\": [\"-y\", \"@scope/mcp-server\"] } } }'\n : 'mcpServers:\\n my-server:\\n command: npx\\n args: [\"-y\", \"@scope/mcp-server\"]'\n const empty = text.trim() === ''\n\n const call = (path: string, payload: Record<string, unknown>): Promise<Record<string, unknown>> =>\n fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(payload),\n }).then(async (response) => {\n const body = await response.json().catch(() => null) as Record<string, unknown> | null\n return body ?? { ok: false, error: `HTTP ${response.status}` }\n })\n\n const reset = (): void => { setErrors([]); setWarnings([]); setNotice(null); setPreview(null) }\n\n const previewNow = (): void => {\n if (busy !== null || empty) return\n setBusy('preview'); reset()\n void call('/api/triad/mcp-preview', { format, text, target })\n .then((body) => {\n const list = Array.isArray(body.errors) ? (body.errors as string[]) : []\n setErrors(list)\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n if (typeof body.yaml === 'string') {\n const servers = Array.isArray(body.servers) ? (body.servers as Array<{ name?: unknown }>) : []\n setPreview({ names: servers.map(item => String(item.name ?? '')), yaml: body.yaml })\n }\n if (list.length === 0 && typeof body.error === 'string') setErrors([body.error])\n })\n .catch((error: unknown) => { setErrors([error instanceof Error ? error.message : String(error)]) })\n .finally(() => { setBusy(null) })\n }\n\n const addNow = (): void => {\n if (busy !== null || empty) return\n setBusy('add'); reset()\n const path = presetId === undefined\n ? '/api/triad/mcp-config'\n : `/api/triad/mcp-presets/${encodeURIComponent(presetId)}/servers`\n const payload = presetId === undefined ? { action: 'add', format, text } : { format, text }\n void call(path, payload)\n .then((body) => {\n const list = Array.isArray(body.errors) ? (body.errors as string[]) : []\n if (list.length > 0) {\n setErrors(list)\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n return\n }\n if (body.ok !== true) { setErrors([String(body.error ?? t('mcpPasteFailed'))]); return }\n const added = Array.isArray(body.added) ? (body.added as string[]) : []\n const skipped = Array.isArray(body.skipped) ? (body.skipped as number | string[]) : []\n setNotice(t('mcpPasteAdded', { added: added.length, skipped: Array.isArray(skipped) ? skipped.length : Number(skipped) }))\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n onAdded(added)\n })\n .catch((error: unknown) => { setErrors([error instanceof Error ? error.message : String(error)]) })\n .finally(() => { setBusy(null) })\n }\n\n return (\n <div className={css.mcpAddForm}>\n <p className={css.installHint}>\n {t('mcpPasteHint', { scope: presetId === undefined ? t('mcpPasteScopeGlobal') : `${t('mcpPasteScopePreset')} \u201C${presetId}\u201D` })}\n </p>\n <div className={css.installRow}>\n <div className={css.mcpAddTypeRow} role=\"group\" aria-label={t('mcpPasteFormat')}>\n {(['json', 'yaml'] as const).map(value => (\n <button\n key={value}\n type=\"button\"\n className={`${css.mcpAddTypeBtn} ${format === value ? css.mcpAddTypeActive : ''}`}\n data-active={format === value || undefined}\n aria-pressed={format === value}\n onClick={() => { setFormat(value); reset() }}\n >\n {value.toUpperCase()}{value === 'yaml' ? ` \u00B7 ${t('mcpPasteNative')}` : ''}\n </button>\n ))}\n </div>\n </div>\n <textarea\n className={css.inlineInput}\n value={text}\n placeholder={placeholder}\n aria-label={t('mcpPasteFormat')}\n rows={8}\n spellCheck={false}\n autoFocus\n style={{\n fontFamily: 'ui-monospace, SFMono-Regular, Consolas, monospace',\n fontSize: 12,\n lineHeight: '18px',\n minHeight: 120,\n resize: 'vertical',\n whiteSpace: 'pre',\n }}\n onChange={(event) => { setText(event.currentTarget.value); reset() }}\n />\n {errors.length > 0 && (\n <div className={css.error} role=\"alert\">\n {errors.map(item => <div key={item}>{item}</div>)}\n </div>\n )}\n {warnings.length > 0 && (\n <div className={css.installHint} role=\"status\">\n {warnings.map(item => <div key={item}>\u00B7 {item}</div>)}\n </div>\n )}\n {preview !== null && (\n <div>\n <p className={css.installHint}>{t('mcpPasteParsed', { n: preview.names.length, names: preview.names.join(', ') })}</p>\n <pre style={{\n margin: 0,\n maxHeight: 200,\n overflow: 'auto',\n fontFamily: 'ui-monospace, SFMono-Regular, Consolas, monospace',\n fontSize: 11,\n lineHeight: '16px',\n whiteSpace: 'pre-wrap',\n }}>{preview.yaml}</pre>\n </div>\n )}\n {notice !== null && <p className={css.mcpCopyHint} role=\"status\">{notice}</p>}\n <div className={css.inlineForm}>\n <Button variant=\"outline\" type=\"button\" disabled={busy !== null || empty} onClick={previewNow}>\n {busy === 'preview' ? t('mcpPasteChecking') : t('mcpPasteCheck')}\n </Button>\n <Button variant=\"primary\" type=\"button\" disabled={busy !== null || empty} onClick={addNow}>\n {busy === 'add' ? t('mcpPasteAdding') : t('mcpAddConfirm')}\n </Button>\n <Button variant=\"outline\" type=\"button\" onClick={onCancel}>{t('cancel')}</Button>\n </div>\n </div>\n )\n}\n\n/** \u6DFB\u52A0\u5168\u5C40 MCP Server \u5F39\u7A97\uFF1A\u7C98\u8D34 JSON / DSH \u539F\u751F YAML\uFF0C\u76F4\u63A5\u5199\u5165 profile patch\u3002 */\nexport function McpAddModal({ t, open, onClose, onAdded }: {\n t: (key: string) => string\n open: boolean\n onClose: () => void\n onAdded: (added: string[]) => void\n}): JSX.Element {\n return (\n <Modal open={open} onClose={onClose} closeLabel={t('close')} title={t('mcpAddModalTitle')}>\n <McpPasteAdd t={t} onAdded={onAdded} onCancel={onClose} />\n </Modal>\n )\n}\n\n/** \u6307\u5357\u9762\u677F logo\uFF1A\u5C0F\u4E66\u5757\u3002 */\nexport function GuideArtIconSmall(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2.5\" fill=\"var(--dsw-alias-state-business-primary,#3d6be5)\" />\n <path d=\"M4.5 5h7M4.5 8h7M4.5 11h4.5\" stroke=\"#FFFFFF\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\n", "/**\n * skills/McpView \u2014 MCP \u9875\u4E3B\u533A\uFF1A\u7F16\u8F91\u5C42\u63D0\u793A\u884C + Server \u5217\u8868\u3002\n *\n * \u641C\u7D22\u3001\u8BA1\u6570\u5206\u6BB5\u3001\u8FDE\u63A5\u72B6\u6001\u4E0E\u5237\u65B0/\u6DFB\u52A0\u6309\u94AE\u90FD\u5728\u9876\u680F\uFF08McpTopBar\uFF09\uFF1B\u8FD9\u91CC\u53EA\u8D1F\u8D23\n * \u4E24\u4E2A\u5217\u8868\u5757\uFF1A\u300C\u7EE7\u627F\u7684\u5168\u5C40 Server\u300D\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\u4E0E\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\uFF0C\n * \u6BCF\u5F20\u5361\u7247\u5E26\u5DE5\u5177\u7EA7 chips\uFF08\u7EFF = \u542F\u7528\u3001\u7070 = \u7981\u7528\uFF0C\u70B9\u4E00\u4E0B\u5373\u5207\u6362\uFF09\u3002\n */\nimport { useState } from 'react'\nimport {\n IconAgentPresetOutlineRegular, IconArchiveOutlineRegular, IconChevronDownOutlineRegular, IconTrashOutlineRegular, Modal, Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ConfirmDialog } from '../confirm-dialog'\nimport { LockGlyph } from './icons.js'\nimport { McpPasteAdd } from './McpAddModal.js'\nimport { isToolRegistrationPending, type LiveMcpState, type LiveMcpStatus, type LiveMcpTool } from './mcp-live.js'\nimport { css } from './styles.js'\n/**\n * \u5DE5\u5177 chips\uFF1A\u5361\u7247\u4E0A\u5217\u51FA\u8BE5 MCP \u63D0\u4F9B\u7684**\u5168\u90E8**\u5DE5\u5177\u540D\uFF0C\u7EFF = \u542F\u7528\u3001\u7070 = \u7981\u7528\uFF0C\n * \u70B9\u51FB\u5373\u5207\u6362\uFF08\u5355\u4E2A\u5DE5\u5177\u7EA7 disabled\uFF0C\u89C1 host \u7684 mcp-tool-disable\uFF09\u3002\n *\n * \u540D\u5355 = \u6CE8\u518C\u5DE5\u5177 \u222A \u8D26\u672C\u7981\u7528\u540D\uFF1A\u88AB\u7981\u7528\u7684\u5DE5\u5177\u5728 agent \u4F5C\u7528\u57DF\u91CC\u5DF2\u88AB\u9690\u85CF\n * \uFF08restrict\uFF09\uFF0C\u4F46\u8D26\u672C\u4ECD\u7559\u7740\u540D\u5B57\uFF0C\u6240\u4EE5\u8FD8\u80FD\u70B9\u56DE\u6765\u3002\n */\n/** \u5361\u7247\u8981\u5217\u51FA\u7684\u5DE5\u5177\u5168\u540D\uFF1A\u6CE8\u518C\u5217\u8868 \u222A \u8D26\u672C\u7981\u7528\u540D\uFF08\u88AB\u9690\u85CF\u7684\u4E5F\u8981\u80FD\u70B9\u56DE\u6765\uFF09\u3002 */\nexport function mcpToolNames(tools: LiveMcpTool[], disabledTools: string[]): string[] {\n const known = new Set(tools.map(tool => tool.name))\n return [...tools.map(tool => tool.name), ...disabledTools.filter(name => !known.has(name))]\n}\n\nexport function McpToolChips({ t, serverName, tools, disabledTools, locked, busy, onToggle }: {\n t: (key: string, params?: Record<string, string | number>) => string\n serverName: string\n tools: LiveMcpTool[]\n disabledTools: string[]\n /** \u9884\u8BBE\u8303\u56F4\u4E0B\u300C\u5168\u5C40\u5C42\u5DF2\u7981\u7528\u300D\u7684\u540D\u5B57\uFF1A\u9884\u8BBE\u5C42\u53EA\u80FD\u52A0\u7981\uFF0C\u4E0D\u80FD\u6253\u5F00\u5B83\u4EEC\u3002 */\n locked?: ReadonlySet<string>\n busy: string | null\n onToggle: (fullName: string, enabled: boolean) => void\n}): JSX.Element | null {\n const prefix = `mcp__${serverName}__`\n const names = mcpToolNames(tools, disabledTools)\n if (names.length === 0) return null\n const off = new Set(disabledTools)\n return (\n <div className={css.mcpToolChips} role=\"group\" aria-label={t('mcpToolChipsAria', { name: serverName })}>\n {names.map((name) => {\n const disabled = off.has(name)\n const isLocked = locked?.has(name) === true\n const short = name.startsWith(prefix) ? name.slice(prefix.length) : name\n const description = tools.find(tool => tool.name === name)?.description ?? ''\n return (\n <button\n key={name}\n type=\"button\"\n className={css.mcpToolChip}\n data-on={disabled ? undefined : 'true'}\n data-locked={isLocked || undefined}\n data-busy={busy === name || undefined}\n disabled={busy !== null || isLocked}\n aria-pressed={!disabled}\n title={isLocked\n ? `${t('mcpToolGlobalOffTip')}\\n${name}`\n : `${disabled ? t('mcpToolClickEnable') : t('mcpToolClickDisable')}\\n${name}${description === '' ? '' : `\\n${description}`}`}\n onClick={() => { onToggle(name, disabled) }}\n >\n {isLocked && <LockGlyph size={9} />}\n {short}\n </button>\n )\n })}\n </div>\n )\n}\n\n/**\n * MCP \u9875\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09\uFF1A\u56DB\u5F20\u7EDF\u8BA1\u5361 + \u5F53\u524D\u7F16\u8F91\u5C42\u63D0\u793A\u884C + \u5DE5\u5177\u6761\uFF08\u641C\u7D22 / \u5237\u65B0 /\n * \u6DFB\u52A0\uFF09+ Server \u5217\u8868\u3002\u5217\u8868\u56FA\u5B9A\u4E24\u5757\u2014\u2014\u300C\u7EE7\u627F\u7684\u5168\u5C40 Server\u300D\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\n * \u4E0E\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\uFF08\u5199\u8FDB\u8BE5\u9884\u8BBE\u7EC4\u5408\u6587\u4EF6\uFF09\uFF1B\u300C\u5168\u90E8 Agent\u300D\u5C42\u53EA\u6709\u524D\u8005\uFF0C\n * \u5F00\u5173\u76F4\u63A5\u542F\u7528/\u7981\u7528\u5168\u5C40\u6761\u76EE\u3002\n */\nexport function McpView({ t, live, scope, query, status, onRefresh, waitingTools, onWatchTools, addOwnOpen, onCloseAddOwn }: {\n t: (key: string, params?: Record<string, string | number>) => string\n live: LiveMcpStatus\n scope: string\n query: string\n status: 'all' | 'on' | 'off'\n onRefresh: () => void\n /** \u6B63\u5728\u7B49\u5F85\u6CE8\u518C\u5DE5\u5177\u7684 Server\uFF08\u9762\u677F\u5728\u8F6E\u8BE2\uFF0C\u65E0\u9700\u7528\u6237\u624B\u52A8\u5237\u65B0\uFF09\u3002 */\n waitingTools: string[]\n /** \u8BA9\u9762\u677F\u5F00\u59CB\u8F6E\u8BE2\u8FD9\u4E9B Server \u7684\u5DE5\u5177\u6CE8\u518C\uFF08\u542F\u7528\u540E\u81EA\u52A8\u7B49\uFF09\u3002 */\n onWatchTools: (names: string[]) => void\n /** \u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u5F39\u7A97\u5F00\u5173\uFF1A\u6309\u94AE\u5728\u9876\u680F\uFF0C\u72B6\u6001\u7531\u9762\u677F\u6301\u6709\u3002 */\n addOwnOpen: boolean\n onCloseAddOwn: () => void\n}): JSX.Element {\n const [busy, setBusy] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n /** \u4E24\u4E2A\u5217\u8868\u5757\u7684\u6298\u53E0\u6001\uFF08\u9ED8\u8BA4\u5C55\u5F00\uFF0C\u70B9\u6807\u9898\u884C\u6536\u8D77\uFF09\u3002 */\n const [globalOpen, setGlobalOpen] = useState(true)\n const [ownOpen, setOwnOpen] = useState(true)\n /** \u6B63\u5728\u5207\u6362\u7684\u5DE5\u5177\u5168\u540D\uFF08\u9632\u8FDE\u70B9\uFF09\u3002 */\n const [toolBusy, setToolBusy] = useState<string | null>(null)\n /** \u5168\u5C40\u6761\u76EE\u5220\u9664\u786E\u8BA4\uFF08null=\u5173\u95ED\uFF09\u3002 */\n const [removeReq, setRemoveReq] = useState<string | null>(null)\n /** \u9884\u8BBE\u4E13\u5C5E\u884C\u79FB\u9664\u786E\u8BA4\uFF08null=\u5173\u95ED\uFF09\u3002 */\n const [removeOwnReq, setRemoveOwnReq] = useState<string | null>(null)\n\n const ready = live.state === 'ready' ? live.data : null\n const globals = ready?.servers ?? []\n const presets = ready?.presets ?? []\n const scoped = scope === '' ? undefined : presets.find(preset => preset.id === scope)\n const masked = new Set(Object.entries(ready?.masks?.[scope] ?? {})\n .filter(([, on]) => on === false).map(([name]) => name))\n const ownRows = scope === '' ? [] : (ready?.presetServers?.[scope] ?? [])\n const ownNames = new Set(ownRows.map(row => row.serverName))\n /* \u5DE5\u5177\u7EA7\u7981\u7528\u4E24\u5C42\u8D26\u672C\uFF1A\u6709\u6548\u7981\u7528 = \u5168\u5C40\u5C42 \u222A \u5F53\u524D\u9884\u8BBE\u5C42\uFF08\u9884\u8BBE\u5C42\u53EA\u52A0\u7981\uFF0C\u4E0D\u6253\u5F00\uFF09\u3002\n * \u9884\u8BBE\u81EA\u5E26\u7684\u5361\u53EA\u770B\u9884\u8BBE\u5C42 \u2014\u2014 \u4E0E\u7EE7\u627F\u6765\u7684\u5168\u5C40 Server \u5F7B\u5E95\u5206\u79BB\uFF08\u4E0D\u540C\u540D\u524D\u7F00\u4E5F\u4E0D\u4F1A\u4E92\u76F8\u7275\u8FDE\uFF09\u3002 */\n const globalOff = ready?.toolDisabled ?? {}\n const presetTables = ready?.toolDisabledByPreset ?? {}\n /**\n * \u67D0\u6761\u300C\u884C\u300D\u7684\u6709\u6548\u7981\u7528\u96C6\u5408\uFF08\u540C\u540D\u4E5F\u5F7B\u5E95\u72EC\u7ACB\uFF09\uFF1A\n * inherit\uFF08\u7EE7\u627F\u7684\u5168\u5C40\u884C\uFF09= \u5168\u5C40\u5C42 \u222A inherit \u6761\u76EE\uFF1Bown\uFF08\u9884\u8BBE\u81EA\u5E26\u884C\uFF09= \u4EC5 own \u6761\u76EE\u3002\n * \u4E24\u6761\u884C\u5404\u8BB0\u4E00\u4EFD\u8D26\uFF0C\u4E92\u4E0D\u7275\u8FDE \u2014\u2014 \u64A4\u6389\u5176\u4E2D\u4E00\u6761\u65F6\u53E6\u4E00\u6761\u7684\u8BBE\u7F6E\u5404\u81EA\u751F\u6548\u3002\n */\n const offOf = (serverName: string, owner: 'own' | 'inherit'): string[] => {\n const entry = presetTables[scope]?.[serverName]\n if (owner === 'own') return entry?.own ?? []\n if (scope === '') return globalOff[serverName] ?? []\n return [...new Set([...(globalOff[serverName] ?? []), ...(entry?.inherit ?? [])])]\n }\n /** \u5168\u5C40\u5C42\u5DF2\u7981\u7528\u7684\u540D\u5B57\uFF1A\u7EE7\u627F\u884C\u65E0\u6CD5\u5728\u9884\u8BBE\u5C42\u6253\u5F00\u5B83\uFF08\u4E0E\u6280\u80FD\u9762\u677F\u540C\u6A21\u578B\uFF09\u3002 */\n const lockedOf = (serverName: string): Set<string> => new Set(scope === '' ? [] : globalOff[serverName] ?? [])\n /**\n * \u906E\u853D\u8BCA\u65AD\uFF1A\u8D26\u672C\u91CC\u6807\u4E86\u300C\u5DF2\u906E\u853D\u300D\u4F46\u8FD0\u884C\u671F\u4E00\u4E2A\u5DE5\u5177\u90FD\u6CA1\u62D2\u5230\uFF08\u6216\u5B89\u88C5\u62A5\u9519\uFF09\u65F6\n * \u7ED9\u51FA\u8BF4\u660E \u2014\u2014 \u4EE5\u524D\u8FD9\u79CD\u60C5\u51B5\u662F\u9759\u9ED8\u7684\uFF0C\u9762\u677F\u770B\u7740\u300C\u5DF2\u906E\u853D\u300D\u4F46\u6A21\u578B\u7AEF\u5DE5\u5177\u7167\u65E7\u53EF\u89C1\u3002\n */\n const maskInstall = ready?.maskInstall?.[scope]\n const maskWarn: string | null = (() => {\n if (scope === '' || masked.size === 0 || maskInstall === undefined) return null\n if (maskInstall.errors.length > 0) return t('mcpMaskInstallFailed', { message: maskInstall.errors[0]! })\n if (maskInstall.agents === 0) return t('mcpMaskNoAgent')\n if (maskInstall.deniedAgents === 0) return t('mcpMaskNoDeny')\n return null\n })()\n\n /** \u7EDF\u4E00\u5199\u8BF7\u6C42\uFF1A\u6210\u529F\u5237\u65B0\u6570\u636E\uFF0C\u5931\u8D25\u6536\u96C6\u9519\u8BEF\u6587\u6848\u3002 */\n const write = (token: string, url: string, payload: Record<string, unknown>): void => {\n if (busy !== null) return\n setBusy(token)\n setError(null)\n void fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(payload),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n const toggleGlobal = (serverName: string, disabled: boolean): void => {\n write(`toggle:${serverName}`, '/api/triad/mcp-config', { serverName, disabled })\n }\n const removeGlobal = (serverName: string): void => {\n write(`remove:${serverName}`, '/api/triad/mcp-config', { serverName, action: 'remove' })\n }\n const setMasked = (serverName: string, enabled: boolean): void => {\n if (busy !== null) return\n setBusy(`mask:${serverName}`)\n setError(null)\n void fetch(`/api/triad/mcp-masks/${encodeURIComponent(scope)}/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled }),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n /**\n * \u5DE5\u5177\u7EA7\u542F\u505C\uFF08\u5355\u6761\u6216\u591A\u6761\u4E00\u6279\uFF09\uFF1A`PUT /api/triad/mcp-tools/<server>`\n * `{ enabled, tools, preset?, source? }`\u3002\u8303\u56F4\u51B3\u5B9A\u5199\u54EA\u6761\u300C\u884C\u300D\uFF1A\n * \u300C\u5168\u90E8 Agent\u300D\u2192 \u5168\u5C40\u884C\uFF1B\u67D0\u4E2A\u9884\u8BBE \u2192 \u8BE5\u9884\u8BBE\u5C42\uFF08`source` \u6307\u5B9A\u54EA\u6761\u884C\uFF09\u3002\n */\n const putTools = (serverName: string, names: string[], enabled: boolean, source: 'own' | 'inherit'): void => {\n if (names.length === 0 || toolBusy !== null || busy !== null) return\n setToolBusy(names[0]!)\n setError(null)\n void fetch(`/api/triad/mcp-tools/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled, tools: names, ...(scope === '' ? {} : { preset: scope, source }) }),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setToolBusy(null) })\n }\n const toggleTool = (serverName: string, fullName: string, enabled: boolean, source: 'own' | 'inherit'): void => {\n putTools(serverName, [fullName], enabled, source)\n }\n const removeOwn = (serverName: string): void => {\n if (busy !== null) return\n setBusy(`own:${serverName}`)\n setError(null)\n void fetch(`/api/triad/mcp-presets/${encodeURIComponent(scope)}/servers/${encodeURIComponent(serverName)}`, {\n method: 'DELETE', headers: { accept: 'application/json' },\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n /** \u4E00\u952E\u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u906E\u853D\uFF08\u987A\u5E8F\u9010\u4E2A\u53D6\u6D88\uFF0C\u907F\u514D\u5E76\u53D1\u5199\u8D26\u672C\u4E92\u76F8\u8986\u76D6\uFF09\u3002 */\n const clearMasks = (): void => {\n if (busy !== null || masked.size === 0) return\n setBusy('mask:__all__')\n setError(null)\n const names = [...masked]\n void (async () => {\n for (const serverName of names) {\n const response = await fetch(`/api/triad/mcp-masks/${encodeURIComponent(scope)}/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled: true }),\n })\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (!(response.ok && body?.ok === true)) throw new Error(body?.error ?? String(response.status))\n }\n onRefresh()\n })()\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n\n /* \u8FC7\u6EE4\uFF1A\u641C\u7D22\u547D\u4E2D serverName \u6216\u5DE5\u5177\u540D\uFF1B\u72B6\u6001\u6863\u5728\u5168\u5C40\u5C42\u770B\u542F\u7528\u72B6\u6001\u3001\u9884\u8BBE\u5C42\u770B\u906E\u853D\u3002 */\n const needle = query.trim().toLowerCase()\n const shownGlobals = globals.filter(server => (needle === ''\n || server.serverName.toLowerCase().includes(needle)\n || server.tools.some(tool => tool.name.toLowerCase().includes(needle)))\n && (status === 'all'\n || (scope === '' ? (status === 'off' ? server.config.disabled : !server.config.disabled)\n : (status === 'off' ? masked.has(server.serverName) : !masked.has(server.serverName)))))\n const shownOwn = ownRows.filter(row => needle === ''\n || row.serverName.toLowerCase().includes(needle)\n || row.summary.toLowerCase().includes(needle))\n\n return (\n <div className={css.mcpServerMain}>\n {/* \u5F53\u524D\u7F16\u8F91\u5C42\u63D0\u793A\u884C\uFF08\u4E0E\u6280\u80FD\u9875 hintRow \u540C\u6784\uFF09 */}\n <div className={css.hintRow}>\n <span className={css.hintRowText}>\n {scope === ''\n ? t('mcpScopeHintAll')\n : t('mcpScopeHintScoped', { name: scoped?.name ?? scope })}\n </span>\n {scope !== '' && masked.size > 0 && (\n <button type=\"button\" className={css.presetReset} disabled={busy !== null} onClick={clearMasks}>\n {t('presetReset')}\n </button>\n )}\n </div>\n\n {error !== null && <p className={css.error} role=\"alert\">{t('mcpPresetFailed', { message: error })}</p>}\n\n {/* \u906E\u853D\u8BCA\u65AD\uFF1A\u8D26\u672C\u5199\u4E86\u4F46\u8FD0\u884C\u671F\u6CA1\u62D2\u5230\u5DE5\u5177/\u5B89\u88C5\u62A5\u9519\u65F6\uFF0C\u660E\u786E\u8BF4\u51FA\u6765 */}\n {maskWarn !== null && <p className={css.error} role=\"alert\">{maskWarn}</p>}\n\n {/* \u6DFB\u52A0/\u542F\u7528\u540E\u7684\u81EA\u52A8\u7B49\u5F85\uFF1A\u9762\u677F\u5728\u8F6E\u8BE2\uFF0C\u7528\u6237\u4E0D\u7528\u518D\u624B\u52A8\u70B9\u300C\u5237\u65B0\u300D */}\n {waitingTools.length > 0 && (\n <p className={css.mcpEmptyList} role=\"status\">{t('mcpWaitingTools', { names: waitingTools.join('\u3001') })}</p>\n )}\n\n {live.state === 'unavailable' ? (\n <p className={css.mcpEmptyList}>{t('mcpLiveUnavailable')}</p>\n ) : (\n <>\n {/* \u2460 \u7EE7\u627F\u7684\u5168\u5C40 Server\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\uFF1B\u6807\u9898\u884C\u53EF\u6298\u53E0\uFF0C\u4E0E\u6280\u80FD\u9875\u6280\u80FD\u5305\u540C\u6784 */}\n <section className={css.hubSection} data-open={globalOpen ? 'true' : undefined}>\n <header className={css.bundleRowOuter} data-open={globalOpen ? 'true' : undefined}>\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={globalOpen}\n onClick={() => { setGlobalOpen((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconArchiveOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{scope === '' ? t('mcpListTitle') : t('mcpPresetGlobalSection')}</span>\n <span className={css.bundleCount}>{shownGlobals.length}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {globalOpen && (<>\n {scope !== '' && <p className={css.mcpEmptyList}>{t('mcpPresetMaskHint')}</p>}\n {shownGlobals.length === 0 ? (\n <p className={css.mcpEmptyList}>{globals.length === 0 ? t('mcpLiveEmpty') : t('mcpListFilteredEmpty')}</p>\n ) : (\n <div className={css.mcpRecGrid}>\n {shownGlobals.map((server) => {\n const isMasked = masked.has(server.serverName)\n const covered = ownNames.has(server.serverName)\n const offTools = offOf(server.serverName, 'inherit')\n const lockedTools = lockedOf(server.serverName)\n const listed = server.tools.length\n const pendingReg = isToolRegistrationPending(server.toolCount, listed)\n /** \u88AB\u300C\u5168\u90E8 Agent\u300D\u5C42\u4E00\u7968\u5426\u51B3\u7684\u5DE5\u5177\u6570\uFF08\u9884\u8BBE\u89C6\u56FE\u91CC\u624D\u53EF\u80FD > 0\uFF09\u3002 */\n const lockedCount = mcpToolNames(server.tools, offTools).filter(name => lockedTools.has(name)).length\n return (\n <section key={`global-${server.serverName}`} className={css.mcpRecCard}>\n <div className={css.mcpRecCardHead}>\n <span className={css.mcpRecCardTitleRow}>\n <span className={css.mcpRecCardName}>{server.serverName}</span>\n <span className={css.mcpRecCardTags}>\n {/* \u6570\u91CF\u8DDF\u968F\u5361\u7247\u5B9E\u9645\u5217\u51FA\u7684\u5DE5\u5177\uFF1A\u8FDB\u7A0B\u8FD8\u5728\u8FDE\u65F6\u5148\u6309\u540D\u5355\u7F13\u5B58\u663E\u793A\uFF0C\u5E76\u6807\u51FA\u300C\u7B49\u5F85\u6CE8\u518C\u300D */}\n <span className={css.mcpRecCatTag}>\n {server.toolCount > 0 ? server.toolCount : listed} {t('mcpLiveToolsOf')}\n </span>\n {pendingReg && (\n <span className={css.mcpRecCatTag} data-off=\"true\" title={t('mcpToolsPendingRegTip')}>\n {t('mcpToolsPendingReg')}\n </span>\n )}\n {/* \u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF1A\u9884\u8BBE\u5C42\u8FD9\u4E9B\u5DE5\u5177\u88AB\u5F3A\u5236\u7F6E\u7070\u3001\u4E0D\u53EF\u62E8\u52A8 */}\n {lockedCount > 0 && (\n <span className={css.mcpRecCatTag} data-locked=\"true\" title={t('mcpToolGlobalOffTip')}>\n {t('mcpToolGlobalOff')}{lockedCount > 1 ? ` ${lockedCount}` : ''}\n </span>\n )}\n {offTools.length > 0 && (\n <span className={css.mcpRecCatTag} data-off=\"true\">{t('mcpToolDisabledCount', { n: offTools.length })}</span>\n )}\n {scope === ''\n ? (server.config.disabled ? <span className={css.mcpRecCatTag}>{t('mcpLiveDisabled')}</span> : null)\n : (isMasked ? <span className={css.mcpRecCatTag}>{t('mcpPresetMasked')}</span> : null)}\n </span>\n </span>\n <Tooltip\n label={scope === ''\n ? (server.config.disabled ? t('enableSkill') : t('mcpLiveDisabled'))\n : covered\n ? t('mcpPresetCoveredSwitchHint')\n : isMasked ? t('enableSkill') : t('mcpPresetMasked')}\n side=\"bottom\"\n delayMs={500}\n >\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={scope === '' ? !server.config.disabled : !isMasked}\n aria-label={scope === '' ? t('mcpLiveDisabled') : t('mcpPresetMasked')}\n className={`${css.toggle} ${(scope === '' ? server.config.disabled : isMasked) ? css.toggleOff : css.toggleOn}`}\n /* \u9884\u8BBE\u5C42\uFF1A\u5373\u4F7F\u8BE5\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server\uFF0C\u4E5F\u5141\u8BB8\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761 \u2014\u2014\n * \u906E\u853D\u662F\u300C\u672C\u9884\u8BBE\u4E0D\u8981\u5168\u5C40\u90A3\u4EFD\u300D\u7684\u6301\u4E45\u8868\u8FBE\uFF0C\u7B49\u81EA\u5E26\u7684\u88AB\u79FB\u9664\u540E\u5373\u523B\u751F\u6548\u3002 */\n disabled={busy !== null || (scope === '' && !server.config.editable)}\n onClick={() => {\n if (scope === '') {\n const nextDisabled = !server.config.disabled\n toggleGlobal(server.serverName, nextDisabled)\n // \u542F\u7528 = \u91CD\u65B0\u62C9\u8D77\u8FDB\u7A0B\u5E76\u6CE8\u518C\u5DE5\u5177\uFF1A\u5F00\u59CB\u8F6E\u8BE2\uFF0C\u522B\u8BA9\u7528\u6237\u7B49 / \u624B\u70B9\u5237\u65B0\u3002\n if (!nextDisabled) onWatchTools([server.serverName])\n } else setMasked(server.serverName, isMasked)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n <p className={css.mcpRecCardDesc}>\n {server.config.disabled && scope === '' && server.tools.length === 0\n ? `${t('mcpLiveDisabled')} \u00B7 ${t('mcpToolsUnavailable')}`\n : t('mcpToolsHint')}\n </p>\n <McpToolChips\n t={t}\n serverName={server.serverName}\n tools={server.tools}\n disabledTools={offTools}\n locked={lockedTools}\n busy={toolBusy}\n onToggle={(fullName, enabled) => { toggleTool(server.serverName, fullName, enabled, 'inherit') }}\n />\n <div className={css.mcpCardFoot}>\n <span className={css.mcpCardItem}>\n <span className={css.mcpCardItemLabel}>\n {scope === '' ? t('mcpLiveConfigHint')\n : covered\n ? (isMasked ? t('mcpPresetCoveredMasked') : t('mcpPresetCovered'))\n : isMasked ? t('mcpPresetMasked') : t('mcpPresetMaskState')}\n </span>\n </span>\n {scope === '' && server.config.editable ? (\n <button\n type=\"button\"\n className={css.mcpCardDelete}\n title={t('mcpRemove')}\n disabled={busy !== null}\n onClick={() => { setRemoveReq(server.serverName) }}\n >\n <IconTrashOutlineRegular size={13} aria-hidden=\"true\" />{t('mcpRemove')}\n </button>\n ) : null}\n </div>\n </section>\n )\n })}\n </div>\n )}\n </>)}\n </section>\n\n {/* \u2461 \u8BE5\u9884\u8BBE\u4E13\u5C5E Server\uFF08\u5199\u8FDB\u8BE5\u9884\u8BBE\u7EC4\u5408\u6587\u4EF6\uFF09\uFF1B\u6807\u9898\u884C\u540C\u6837\u53EF\u6298\u53E0 */}\n {scope !== '' && (\n <section className={css.hubSection} data-open={ownOpen ? 'true' : undefined}>\n <header className={css.bundleRowOuter} data-open={ownOpen ? 'true' : undefined}>\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={ownOpen}\n onClick={() => { setOwnOpen((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconAgentPresetOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{t('mcpPresetOwnSection')}</span>\n <span className={css.bundleCount}>{shownOwn.length}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {ownOpen && (<>\n <p className={css.mcpEmptyList}>{t('mcpPresetOwnHint')}</p>\n {scoped?.trust === 'system' && <p className={css.mcpEmptyList}>{t('mcpPresetStorageHint')}</p>}\n {shownOwn.length === 0 ? (\n <p className={css.mcpEmptyList}>{ownRows.length === 0 ? t('mcpPresetOwnEmpty') : t('mcpListFilteredEmpty')}</p>\n ) : (\n <div className={css.mcpRecGrid}>\n {shownOwn.map(row => {\n /* \u9884\u8BBE\u81EA\u5E26\u7684\u8FD9\u6761\u884C\u53EA\u8BA4 own \u6761\u76EE\uFF1A\u5168\u5C40\u884C/\u7EE7\u627F\u884C\u7684\u8BBE\u7F6E\u4E0E\u5B83\u4E92\u4E0D\u5F71\u54CD\u3002 */\n const offOwn = offOf(row.serverName, 'own')\n /** \u4E00\u952E\u5168\u7981/\u5168\u5F00\uFF1A\u4E00\u6B21\u8BF7\u6C42\u5E26\u4E0A\u8BE5\u884C\u7684\u5168\u90E8\u5DE5\u5177\u540D\u3002 */\n const ownToolNames = (row.tools ?? []).map(tool => tool.name)\n const allDisabled = ownToolNames.length > 0 && ownToolNames.every(name => offOwn.includes(name))\n return (\n <section key={`own-${row.serverName}`} className={css.mcpRecCard}>\n <div className={css.mcpRecCardHead}>\n <span className={css.mcpRecCardTitleRow}>\n <span className={css.mcpRecCardName}>{row.serverName}</span>\n <span className={css.mcpRecCardTags}>\n <span className={css.mcpRecCatTag}>{row.transport}</span>\n <span className={css.mcpRecCatTag}>\n {(row.registeredCount ?? 0) > 0 ? row.registeredCount : (row.tools?.length ?? 0)} {t('mcpLiveToolsOf')}\n </span>\n {isToolRegistrationPending(row.registeredCount ?? 0, row.tools?.length ?? 0) && (\n <span className={css.mcpRecCatTag} data-off=\"true\" title={t('mcpToolsPendingRegTip')}>\n {t('mcpToolsPendingReg')}\n </span>\n )}\n {globals.some(item => item.serverName === row.serverName) && (\n <span className={css.mcpRecCatTag} data-shadow=\"true\" title={t('mcpPresetShadowGlobalTip')}>\n {t('mcpPresetShadowGlobalTag')}\n </span>\n )}\n {offOwn.length > 0 && (\n <span className={css.mcpRecCatTag} data-off=\"true\">{t('mcpToolDisabledCount', { n: offOwn.length })}</span>\n )}\n </span>\n </span>\n {/* \u4E00\u952E\u5168\u7981/\u5168\u5F00\uFF1A\u9884\u8BBE\u81EA\u5E26\u8FD9\u53F0\u7684\u300C\u5FEB\u901F\u7981\u7528\u5168\u90E8\u5DE5\u5177\u300D\u6ED1\u5757 */}\n <Tooltip\n label={ownToolNames.length === 0\n ? t('mcpToolsPendingRegTip')\n : allDisabled\n ? t('mcpToolAllEnable')\n : offOwn.length > 0\n ? `${t('mcpToolAllPartial')} \u00B7 ${t('mcpToolAllDisable')}`\n : t('mcpToolAllDisable')}\n side=\"bottom\"\n delayMs={400}\n >\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!allDisabled}\n aria-label={t('mcpToolAllAria', { name: row.serverName })}\n className={`${css.toggle} ${allDisabled ? css.toggleOff : css.toggleOn}`}\n disabled={busy !== null || toolBusy !== null || ownToolNames.length === 0}\n onClick={() => { putTools(row.serverName, ownToolNames, allDisabled, 'own') }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n <p className={css.mcpRecCardDesc}>{row.summary}</p>\n <McpToolChips\n t={t}\n serverName={row.serverName}\n tools={row.tools ?? []}\n disabledTools={offOwn}\n busy={toolBusy}\n onToggle={(fullName, enabled) => { toggleTool(row.serverName, fullName, enabled, 'own') }}\n />\n <div className={css.mcpCardFoot}>\n <span className={css.mcpCardItem}>\n <span className={css.mcpCardItemLabel}>{t('mcpPresetNewSession')}</span>\n </span>\n <button\n type=\"button\"\n className={css.mcpCardDelete}\n disabled={busy !== null}\n onClick={() => { setRemoveOwnReq(row.serverName) }}\n >\n <IconTrashOutlineRegular size={13} aria-hidden=\"true\" />{t('mcpRemove')}\n </button>\n </div>\n </section>\n )\n })}\n </div>\n )}\n </>)}\n </section>\n )}\n </>\n )}\n\n {/* \u9884\u8BBE\u4E13\u5C5E\u6DFB\u52A0\uFF1A\u7C98\u8D34 JSON / DSH \u539F\u751F YAML\uFF08\u6309\u94AE\u5728\u9876\u680F\uFF09 */}\n <Modal\n open={addOwnOpen}\n onClose={onCloseAddOwn}\n closeLabel={t('close')}\n title={`${t('mcpPresetAddOwn')} \u00B7 ${scoped?.name ?? scope}`}\n >\n <McpPasteAdd\n t={t}\n presetId={scope}\n onAdded={(added) => { onRefresh(); onWatchTools(added) }}\n onCancel={onCloseAddOwn}\n />\n </Modal>\n\n {/* \u5168\u5C40\u6761\u76EE\u5220\u9664\u786E\u8BA4 */}\n {removeReq !== null && (\n <ConfirmDialog\n open\n title={t('mcpRemoveConfirmTitle')}\n message={t('mcpRemoveConfirmMsg', { name: removeReq })}\n confirmLabel={t('mcpRemove')}\n cancelLabel={t('cancel')}\n danger\n onConfirm={() => { const name = removeReq; setRemoveReq(null); removeGlobal(name) }}\n onClose={() => { setRemoveReq(null) }}\n />\n )}\n\n {/* \u9884\u8BBE\u4E13\u5C5E\u884C\u79FB\u9664\u786E\u8BA4\uFF08\u540C\u540D\u5168\u5C40\u6761\u76EE\u4E0D\u53D7\u5F71\u54CD\uFF09 */}\n {removeOwnReq !== null && (\n <ConfirmDialog\n open\n title={t('mcpOwnRemoveConfirmTitle')}\n message={t('mcpOwnRemoveConfirmMsg', { name: removeOwnReq })}\n confirmLabel={t('mcpRemove')}\n cancelLabel={t('cancel')}\n danger\n onConfirm={() => { const name = removeOwnReq; setRemoveOwnReq(null); removeOwn(name) }}\n onClose={() => { setRemoveOwnReq(null) }}\n />\n )}\n </div>\n )\n}\n", "/**\n * ConfirmDialog \u2014 \u66FF\u4EE3 window.confirm \u7684\u4E3B\u9898\u5316\u786E\u8BA4\u5F39\u7A97\uFF08\u6280\u80FD\u9762\u677F\u7834\u574F\u6027\u64CD\u4F5C\u4E13\u7528\uFF09\u3002\n *\n * \u80CC\u666F\uFF1Awindow.confirm \u5728 Electron \u91CC\u662F\u7CFB\u7EDF\u6837\u5F0F\u7684\u7070\u5E95\u5F39\u7A97\uFF08\u6807\u9898\u8FD8\u662F\u7A97\u53E3\u540D\n * dsh-shell\uFF09\uFF0C\u8DDF DSH/\u63D2\u4EF6\u4E3B\u9898\u5B8C\u5168\u8131\u79BB\uFF0C\u4E14\u65E0\u6CD5\u5B9A\u5236\u3002\u672C\u7EC4\u4EF6\u63D0\u4F9B\u540C\u8BED\u4E49\u66FF\u4EE3\uFF1A\n *\n * - createPortal \u5230 body\uFF1A\u7956\u5148\u5BB9\u5668\uFF08\u73BB\u7483\u8D28\u611F backdrop-filter / transform\uFF09\n * \u4F1A\u628A position:fixed \u9489\u8FDB\u5C40\u90E8\u5750\u6807\u7CFB\uFF0C\u906E\u7F69\u5FC5\u987B\u6302\u5230 document.body\uFF1B\n * - z-index 1200\uFF1A\u5168\u5C4F\u5F39\u5C42\u60EF\u4F8B\uFF08\u9AD8\u4E8E popover-shell \u7684 mask 999 / card 1000\uFF09\uFF1B\n * - \u5F00\u5408\u52A8\u753B\u590D\u7528 modal-animation\uFF1Amask \u6DE1\u5165\u6DE1\u51FA + \u5361\u7247\u81EA\u5E95\u90E8 24px \u4E0A\u6ED1\u5F39\u51FA\u3001\n * \u53CD\u5411\u6536\u56DE\uFF0C\u5185\u5BB9\u65E0\u9519\u843D\uFF08\u786E\u8BA4\u5F39\u7A97\u5185\u5BB9\u77ED\uFF0C\u4E0D\u9700\u8981 stagger\uFF09\uFF0C\n * \u5E76\u9075\u5B88 prefers-reduced-motion\uFF1B\n * - \u4EA4\u4E92\uFF1AEsc / \u70B9\u906E\u7F69 = \u53D6\u6D88\uFF1B\u786E\u8BA4\u94AE autoFocus\uFF08\u56DE\u8F66\u5373\u786E\u8BA4\uFF09\uFF1B\u70B9\u786E\u8BA4\u540E\u5148\n * \u64AD\u6536\u56DE\u52A8\u753B\u3001240ms \u540E\u518D\u5378\u8F7D\uFF08onClose\uFF09\uFF0C\u6267\u884C\u52A8\u4F5C\u4E0E\u52A8\u753B\u5E76\u884C\u4E0D\u963B\u585E\uFF1B\n * - danger \u53D8\u4F53\uFF1A\u7834\u574F\u6027\u64CD\u4F5C\uFF08\u5220\u9664/\u6E05\u7A7A/\u56DE\u6EDA\uFF09\u786E\u8BA4\u6309\u94AE\u7528\u8B66\u793A\u7EA2\n * \uFF08--dsw-alias-state-error-primary\uFF09\uFF0C\u4E0E\u9762\u677F iconActionDanger \u540C\u6B3E\u8272\u3002\n *\n * \u6837\u5F0F\u72EC\u7ACB\u6CE8\u5165\uFF08STYLE_ID \u5E42\u7B49\uFF09\uFF0C\u7C7B\u540D\u524D\u7F00 mcd-\uFF0C\u4E0D\u4F9D\u8D56 popover-shell \u5185\u90E8\u7C7B\u3002\n */\n\nimport { useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport {\n ensureModalAnimStyles,\n modalAnimClass,\n modalMaskAnimClass,\n useModalClose,\n} from './modal-animation.js'\nconst STYLE_ID = 'dsh-prompt-customizer-confirm-dialog-styles'\n\nconst SHEET = `\n/* \u2500\u2500 \u906E\u7F69\uFF1A\u56FA\u5B9A\u5168\u5C4F\uFF0C\u70B9\u51FB=\u53D6\u6D88 \u2500\u2500 */\n.mcd-mask{position:fixed;inset:0;z-index:1200;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.45))}\n/* \u5C45\u4E2D\u5BB9\u5668\uFF1Aflex \u5B9A\u4F4D\uFF0C\u5361\u7247\u52A8\u753B\u7684 transform \u4E0D\u4E0E\u5176\u51B2\u7A81 */\n.mcd-wrap{position:fixed;inset:0;z-index:1201;display:flex;align-items:center;justify-content:center;pointer-events:none}\n/* \u2500\u2500 \u5361\u7247\uFF1A\u5B9E\u5E95\uFF08\u73BB\u7483\u6A21\u5F0F\u4E5F\u4E0D\u900F\uFF09\u3001\u5706\u89D2 14\u3001l3 \u6295\u5F71 \u2500\u2500 */\n.mcd-card{\n pointer-events:auto;display:flex;flex-direction:column;\n width:min(420px,calc(100vw - 48px));max-height:calc(100vh - 96px);\n box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));\n border-radius:14px;\n box-shadow:var(--dsw-shadow-lv3,0 8px 40px rgba(0,0,0,.5));\n overflow:hidden}\n/* \u5B9E\u5E95\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4FDD\u6301\u4E0D\u900F\u660E\u8868\u9762\uFF08\u540C popover-shell \u7684 data-solid \u89C4\u5219\uFF1A\n \u9759\u6001 token + html[data-dsh-glass] \u524D\u7F00\u538B\u8FC7 glass.ts \u7684 transparent \u89C4\u5219\uFF09 */\n.mcd-card,html[data-dsh-glass] .mcd-card{\n background:var(--dsw-static-neutral-bluish-00,#fff);\n backdrop-filter:none;-webkit-backdrop-filter:none}\nbody[data-ds-dark-theme] .mcd-card,html[data-dsh-glass] body[data-ds-dark-theme] .mcd-card{\n background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\n/* \u2500\u2500 \u5185\u5BB9 \u2500\u2500 */\n.mcd-title{flex:none;padding:14px 18px 8px;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#eee)}\n.mcd-body{flex:none;min-height:0;padding:0 18px 16px;overflow-y:auto;font-size:13px;line-height:20px;color:var(--dsw-alias-label-secondary,#bbb);word-break:break-word}\n.mcd-actions{flex:none;display:flex;justify-content:flex-end;gap:8px;padding:12px 14px;border-top:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.06))}\n/* danger \u53D8\u4F53\uFF1A\u8B66\u793A\u7EA2\u786E\u8BA4\u6309\u94AE\uFF08outline \u5E95 + \u7EA2\u5B57\u7EA2\u6846\uFF0Chover \u52A0\u6DF1\uFF09 */\n.mcd-btn-danger{\n border-color:var(--dsw-alias-state-error-primary,#e0434b)!important;\n color:var(--dsw-alias-state-error-primary,#e0434b)!important}\n.mcd-btn-danger:hover{\n background:var(--dsw-alias-interactive-bg-hover-danger,rgba(224,67,75,.12))!important;\n border-color:var(--dsw-alias-state-error-primary,#e0434b)!important;\n color:var(--dsw-alias-state-error-primary,#e0434b)!important}\n@media (prefers-reduced-motion:reduce){\n .mcd-mask,.mcd-card{animation:none!important}\n}\n`\n\n/** \u6CE8\u5165\u786E\u8BA4\u5F39\u7A97\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nfunction ensureDialogStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** ConfirmDialog \u5C5E\u6027\u3002 */\nexport interface ConfirmDialogProps {\n open: boolean\n /** \u6807\u9898\uFF08\u77ED\u540D\u8BCD\uFF0C\u5982\u300C\u8BF7\u786E\u8BA4\u300D\uFF09\u3002 */\n title: string\n /** \u8BF4\u660E\u6587\u6848\uFF08\u5DF2\u6E32\u67D3\u597D\u7684\u5B57\u7B26\u4E32\uFF0C\u542B\u53C2\u6570\u65F6\u7531\u8C03\u7528\u65B9 t() \u5C55\u5F00\uFF09\u3002 */\n message: string\n confirmLabel: string\n cancelLabel: string\n /** \u7834\u574F\u6027\u64CD\u4F5C\uFF1A\u786E\u8BA4\u6309\u94AE\u8B66\u793A\u7EA2\u3002 */\n danger?: boolean\n /** \u70B9\u786E\u8BA4\uFF1A\u7ACB\u5373\u6267\u884C\uFF08\u4E0E\u6536\u56DE\u52A8\u753B\u5E76\u884C\uFF09\u3002 */\n onConfirm: () => void\n /** \u771F\u6B63\u5173\u95ED\uFF08\u6536\u56DE\u52A8\u753B\u64AD\u5B8C\u540E\u89E6\u53D1\uFF1B\u8C03\u7528\u65B9\u5728\u6B64\u6E05 state\uFF09\u3002 */\n onClose: () => void\n}\n\n/**\n * \u4E3B\u9898\u5316\u786E\u8BA4\u5F39\u7A97\u3002\u8C03\u7528\u65B9\u4EE5 `open` \u63A7\u5236\u663E\u793A\uFF1A\n * \u6761\u4EF6\u6E32\u67D3 `{req !== null && <ConfirmDialog open ... />}` \u65F6\uFF0C\n * open \u6052\u4E3A true\uFF0C\u6302\u8F7D\u5373\u5F39\u5165\uFF1BonClose \u91CC\u628A req \u7F6E null \u5373\u5378\u8F7D\u3002\n */\nexport function ConfirmDialog({\n open, title, message, confirmLabel, cancelLabel, danger = false, onConfirm, onClose,\n}: ConfirmDialogProps): JSX.Element | null {\n ensureModalAnimStyles()\n ensureDialogStyles()\n const { closing, requestClose } = useModalClose(open, onClose)\n\n // Esc = \u53D6\u6D88\uFF08\u4E0E\u906E\u7F69\u70B9\u51FB\u7B49\u4EF7\uFF09\u3002\n useEffect(() => {\n if (!open) return undefined\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') requestClose()\n }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [open, requestClose])\n\n if (!open) return null\n\n const handleConfirm = (): void => {\n onConfirm()\n requestClose()\n }\n const handleCancel = (): void => {\n requestClose()\n }\n\n return createPortal(\n <>\n <div className={`mcd-mask ${modalMaskAnimClass(closing)}`} aria-hidden=\"true\" onClick={handleCancel} />\n <div className=\"mcd-wrap\">\n <div className={`mcd-card ${modalAnimClass(closing)}`} role=\"dialog\" aria-modal=\"true\" aria-label={title}>\n <div className=\"mcd-title\">{title}</div>\n <div className=\"mcd-body\">{message}</div>\n <div className=\"mcd-actions\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleCancel}>{cancelLabel}</Button>\n <Button\n variant={danger ? 'outline' : 'primary'}\n size=\"sm\"\n autoFocus\n className={danger ? 'mcd-btn-danger' : undefined}\n onClick={handleConfirm}\n >\n {confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n", "/**\n * skills/mcp-live \u2014 /api/triad/mcp-status \u7684\u771F\u5B9E MCP \u72B6\u6001\u3002\n *\n * \u7C7B\u578B\uFF08\u5DE5\u5177/Server/\u9884\u8BBE\u884C/\u6574\u4EFD\u5FEB\u7167\uFF09+ \u62C9\u53D6 hook + \u300C\u5DE5\u5177\u662F\u5426\u5DF2\u6CE8\u518C\u300D\u5224\u5B9A\uFF1B\n * \u9762\u677F\u4E0E MCP \u89C6\u56FE\u5171\u7528\u3002\n */\nimport { useEffect, useState } from 'react'\nimport type { PresetRow } from './types.js'\n\n\n/** \u771F\u5B9E MCP \u72B6\u6001\uFF08host /api/triad/mcp-status\uFF1Actx.tools \u4E2D mcp__* \u5DE5\u5177\u5206\u7EC4\uFF09\u3002 */\nexport interface LiveMcpTool {\n name: string\n description: string\n}\nexport interface LiveMcpServer {\n serverName: string\n toolCount: number\n tools: LiveMcpTool[]\n /** \u914D\u7F6E\u6587\u4EF6\u6761\u76EE\u4FE1\u606F\uFF08\u542F\u7528/\u7981\u7528\u5F00\u5173\u7528\uFF09\u3002 */\n config: { entryId: string | null; disabled: boolean; editable: boolean }\n /** 0.1.6\uFF1A\u4F5C\u7528\u57DF\uFF08\u5F53\u524D\u6052\u4E3A global\uFF09\u3002 */\n scope?: string\n /** 0.1.6\uFF1A\u54EA\u4E9B Agent \u9884\u8BBE\u906E\u853D\u4E86\u5B83\uFF08\u8D26\u672C\u955C\u50CF\uFF09\u3002 */\n maskedBy?: string[]\n}\n/** \u9884\u8BBE\u81EA\u5E26\u7684 mcp-client \u884C\uFF08host \u4ECE\u9884\u8BBE\u7EC4\u5408\u6587\u672C\u89E3\u6790\uFF09\u3002 */\nexport interface PresetMcpRowWire {\n entryId: string\n serverName: string\n transport: string\n summary: string\n /** \u8BE5 server \u7684\u5DE5\u5177\uFF08\u6D3B\u52A8 agent \u4F5C\u7528\u57DF \u222A \u540D\u5355\u7F13\u5B58\uFF1B\u65E0\u6570\u636E\u65F6\u7F3A\u7701\uFF09\u3002 */\n tools?: LiveMcpTool[]\n}\nexport interface LiveMcpState {\n at: string\n serverCount: number\n toolCount: number\n servers: LiveMcpServer[]\n /** 0.1.6\uFF1AAgent \u9884\u8BBE\u540D\u5355\u3002 */\n presets?: PresetRow[]\n /** 0.1.6\uFF1ApresetId \u2192 { serverName: false }\uFF08\u663E\u5F0F\u906E\u853D\uFF1B\u7F3A\u7701 = \u7EE7\u627F\u5168\u5C40\uFF09\u3002 */\n masks?: Record<string, Record<string, boolean>>\n /** 0.1.6\uFF1ApresetId \u2192 \u8BE5\u9884\u8BBE\u81EA\u5E26\u7684 mcp-client \u884C\u3002 */\n presetServers?: Record<string, PresetMcpRowWire[]>\n /** \u5DE5\u5177\u7EA7\u7981\u7528\u00B7\u5168\u5C40\u5C42\u955C\u50CF\uFF1AserverName \u2192 \u7981\u7528\u5DE5\u5177\u5168\u540D\uFF08\u6240\u6709\u9884\u8BBE\u751F\u6548\uFF09\u3002 */\n toolDisabled?: Record<string, string[]>\n /** \u5DE5\u5177\u7EA7\u7981\u7528\u00B7\u9884\u8BBE\u5C42\u955C\u50CF\uFF08\u6309\u300C\u884C\u300D\u5206\u8D26\uFF09\uFF1ApresetId \u2192 serverName \u2192 { own, inherit }\u3002 */\n toolDisabledByPreset?: Record<string, Record<string, { own: string[]; inherit: string[] }>>\n /** \u906E\u853D\u8865\u4E01\u8FD0\u884C\u671F\u5B89\u88C5\u8BCA\u65AD\uFF1ApresetId \u2192 \u6D3B\u52A8 agent \u6570\u4E0E deny \u6570\u3001\u5931\u8D25\u539F\u56E0\u3002 */\n maskInstall?: Record<string, { agents: number; deniedAgents: number; denyTotal: number; errors: string[] }>\n}\nexport type LiveMcpStatus =\n | { state: 'loading'; data: null }\n | { state: 'ready'; data: LiveMcpState }\n | { state: 'unavailable'; data: null }\n\n/** \u6DFB\u52A0/\u542F\u7528\u540E\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C\u7684\u8F6E\u8BE2\u95F4\u9694\u4E0E\u603B\u65F6\u957F\u3002 */\nexport const MCP_TOOL_WATCH_INTERVAL_MS = 2000\n// npx \u9996\u6B21\u62C9\u5305\u53EF\u80FD\u8981\u4E00\u4E24\u5206\u949F\uFF0C\u7B49\u5F85\u7A97\u53E3\u7ED9\u8DB3\uFF1B\u671F\u95F4\u5361\u7247\u663E\u793A\u300C\u7B49\u5F85\u6CE8\u518C\u300D\uFF0C\u8D85\u65F6\u540E\n// \u7528\u6237\u4ECD\u53EF\u624B\u52A8\u5237\u65B0\uFF08\u4E0B\u4E00\u6B21\u6DFB\u52A0/\u542F\u7528\u4F1A\u91CD\u65B0\u5F00\u59CB\u7B49\u5F85\uFF09\u3002\nexport const MCP_TOOL_WATCH_TIMEOUT_MS = 150_000\n\n/**\n * \u72B6\u6001\u91CC\u67D0 Server **\u5B9E\u9645\u6CE8\u518C**\u7684\u5DE5\u5177\u6570\uFF08\u5168\u5C40\u6761\u76EE \u222A \u5404\u9884\u8BBE\u81EA\u5E26\u884C\uFF0C\u53D6\u6700\u5927\uFF09\u3002\n *\n * \u4E00\u5B9A\u8981\u7528\u6CE8\u518C\u6570\uFF08`toolCount` / `registeredCount`\uFF09\uFF0C\u4E0D\u80FD\u7528\u5361\u7247\u4E0A\u90A3\u4EFD\n * \u300C\u6CE8\u518C \u222A \u540D\u5355\u7F13\u5B58\u300D\u7684\u5217\u8868\u957F\u5EA6 \u2014\u2014 \u7F13\u5B58\u4F1A\u8BA9\u8FD8\u6CA1\u8FDE\u4E0A\u7684 Server \u770B\u8D77\u6765\u5DF2\u5C31\u7EEA\uFF0C\n * \u81EA\u52A8\u7B49\u5F85\u5C31\u4F1A\u63D0\u524D\u6536\u5DE5\uFF08\u8868\u73B0\u5C31\u662F\u5361\u5728\u300C0 \u5DE5\u5177\u300D\u8FD8\u5F97\u624B\u52A8\u5237\u65B0\uFF09\u3002\n */\nexport function mcpRegisteredToolCountOf(data: LiveMcpState, serverName: string): number {\n let count = data.servers.find(server => server.serverName === serverName)?.toolCount ?? 0\n for (const rows of Object.values(data.presetServers ?? {})) {\n const row = rows.find(item => item.serverName === serverName)\n if (row !== undefined) count = Math.max(count, row.registeredCount ?? 0)\n }\n return count\n}\n\n/** \u8BE5 Server \u662F\u5426\u8FD8\u6CA1\u6CE8\u518C\u51FA\u5DE5\u5177\uFF08\u5361\u7247\u7ED9\u300C\u7B49\u5F85\u6CE8\u518C\u300D\u6807\u8BB0\u7528\uFF09\u3002 */\nexport function isToolRegistrationPending(registered: number, listed: number): boolean {\n return registered === 0 && listed > 0\n}\n\n/** \u62C9\u53D6\u771F\u5B9E MCP \u6CE8\u518C\u72B6\u6001\uFF1B\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u91CD\u542F\u7B49\uFF09\u2192 unavailable\uFF08\u754C\u9762\u5F15\u5BFC\u91CD\u542F\uFF09\u3002 */\nexport function useMcpLiveState(): [LiveMcpStatus, () => void] {\n const [status, setStatus] = useState<LiveMcpStatus>({ state: 'loading', data: null })\n const load = (): void => {\n setStatus((current) => (current.state === 'ready' ? current : { state: 'loading', data: null }))\n void fetch('/api/triad/mcp-status', { headers: { accept: 'application/json' } })\n .then((response) => { if (!response.ok) throw new Error(String(response.status)); return response.json() })\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray((body as { servers?: unknown }).servers)) throw new Error('bad shape')\n const data = body as LiveMcpState\n setStatus({ state: 'ready', data })\n })\n .catch(() => { setStatus({ state: 'unavailable', data: null }) })\n }\n useEffect(() => { load() /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, [])\n return [status, load]\n}\n", "/**\n * skills/SkillCard \u2014 \u6280\u80FD\u5361\uFF08\u7F51\u683C\u5355\u5143\uFF09\u4E0E\u6280\u80FD\u5305\u5206\u7C7B\u7F16\u8F91\u5668\u3002\n */\nimport { useEffect, useRef, useState, type CSSProperties } from 'react'\nimport {\n IconCloseOutlineRegular, IconPlusOutlineRegular, IconTrashOutlineRegular, Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CheckIcon, CopyIcon } from './icons.js'\nimport { skillT } from './locales.js'\nimport { css } from './styles.js'\nimport { MAX_BUNDLE_CATEGORIES, PRESET_BUNDLE_CATEGORIES, type SkillInfo } from './types.js'\n/**\n * \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\uFF1A\n * [\u56FE\u6807\u74F7\u7247] \u6807\u9898(\u7C97) [\u590D\u5236\u94AE] [\u7EFF\u8272\u5F00\u5173]\n * \u63CF\u8FF0\u4E00\u884C\uFF08\u7701\u7565\u53F7\uFF09\n * [\u6765\u6E90 pill][\u4F5C\u7528\u57DF pill] N \u6587\u4EF6\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * \u5DE5\u5177 [\u67E5\u770B] [\u67E5\u770B\u6587\u4EF6\u6309\u94AE] [\u5F52\u5165/\u79FB\u51FA] [\u5220\u9664]\n */\n/**\n * \u5206\u7C7B\u7F16\u8F91\u5668\uFF1A\u5DF2\u9009\u6807\u7B7E\uFF08\u53EF\u6458\uFF09+ \u5EFA\u8BAE\u5206\u7C7B\uFF08\u70B9\u52A0\uFF09+ \u81EA\u5B9A\u4E49\u8F93\u5165\uFF08\u56DE\u8F66\u52A0\uFF09\u3002\n * \u300C\u65B0\u5EFA\u6280\u80FD\u5305\u300D\u4E0E\u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u4E24\u5904\u5171\u7528\uFF0C\u503C\u7531\u7236\u7EA7\u6301\u6709\u3002\n */\nexport function CategoryEditor({ value, onChange, label }: {\n value: string[]\n onChange: (next: string[]) => void\n label: string\n}): JSX.Element {\n const [draft, setDraft] = useState('')\n const full = value.length >= MAX_BUNDLE_CATEGORIES\n const add = (raw: string): void => {\n const name = raw.trim().slice(0, 24)\n setDraft('')\n if (name === '' || value.includes(name) || full) return\n onChange([...value, name])\n }\n return (\n <div className={css.catEditor}>\n {value.length === 0 ? (\n <p className={css.catEmpty}>{skillT('bundleCatEmptyHint')}</p>\n ) : (\n <ul className={css.catSelected} aria-label={label}>\n {value.map((name) => (\n <li key={name} className={css.catSelectedTag}>\n <span className={css.catSelectedName}>{name}</span>\n <button\n type=\"button\"\n className={css.catRemove}\n aria-label={skillT('bundleCatRemove', { name })}\n onClick={() => { onChange(value.filter((item) => item !== name)) }}\n >\n <IconCloseOutlineRegular size={11} aria-hidden=\"true\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n <div className={css.catSuggest} role=\"group\" aria-label={skillT('bundleCatTitle')}>\n {PRESET_BUNDLE_CATEGORIES.filter((preset) => !value.includes(preset)).map((preset) => (\n <button\n type=\"button\"\n key={preset}\n className={css.catPreset}\n disabled={full}\n title={skillT('bundleCatAddPreset', { name: preset })}\n onClick={() => { add(preset) }}\n >\n <span className={css.catPresetPlus} aria-hidden=\"true\">+</span>{preset}\n </button>\n ))}\n </div>\n <input\n className={css.catInput}\n value={draft}\n placeholder={skillT('bundleCatPlaceholder')}\n aria-label={skillT('bundleCatCustom')}\n disabled={full}\n onChange={(event) => { setDraft(event.currentTarget.value) }}\n onKeyDown={(event) => { if (event.key === 'Enter') { event.preventDefault(); add(draft) } }}\n />\n {full && <p className={css.catLimit}>{skillT('bundleCatLimit', { n: MAX_BUNDLE_CATEGORIES })}</p>}\n </div>\n )\n}\n\nexport function SkillCard({ skill, bundleId, bundleName, enabled, lockedReason, scopeLabel, index, onToggle, onView, onAssign, onRemove, onDelete }: {\n skill: SkillInfo\n bundleId: string | null\n bundleName: string | null\n enabled: boolean\n /** \u975E\u7A7A\u65F6\u5F00\u5173\u88AB\u9501\u4F4F\uFF08\u5982\uFF1A\u5168\u5C40\u5C42\u5DF2\u7981\u7528\uFF0C\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00\uFF09\uFF0C\u5E76\u663E\u793A\u539F\u56E0\u3002 */\n lockedReason?: string\n /** \u5F53\u524D\u4F5C\u7528\u57DF pill \u6587\u6848\uFF08\u300C\u5168\u90E8 Agent\u300D= \u5168\u5C40\uFF09\u3002 */\n scopeLabel: string\n /** \u7F51\u683C\u5E8F\u53F7\uFF1A\u5165\u573A\u9519\u5CF0\u52A8\u753B\u5EF6\u65F6\u3002 */\n index: number\n onToggle: (skill: SkillInfo, enabled: boolean) => void\n onView: (skill: SkillInfo) => void\n onAssign?: (skill: SkillInfo) => void\n onRemove?: (skill: SkillInfo) => void\n onDelete?: (skill: SkillInfo) => void\n}): JSX.Element {\n const files = Array.isArray(skill.files) ? skill.files : []\n const description = skill.description ?? ''\n const [copied, setCopied] = useState(false)\n const copiedTimer = useRef<number | null>(null)\n useEffect(() => () => {\n if (copiedTimer.current !== null) window.clearTimeout(copiedTimer.current)\n }, [])\n\n const flashCopied = (): void => {\n setCopied(true)\n if (copiedTimer.current !== null) window.clearTimeout(copiedTimer.current)\n copiedTimer.current = window.setTimeout(() => { setCopied(false) }, 1200)\n }\n /** \u590D\u5236\u6280\u80FD\u540D\uFF1A\u4E3B\u7528 clipboard API\uFF0C\u56DE\u9000\u4E00\u4E2A\u9690\u85CF textarea + execCommand\u3002 */\n const copyName = (): void => {\n const fallback = (): void => {\n try {\n const textarea = document.createElement('textarea')\n textarea.value = skill.name\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n document.execCommand('copy')\n document.body.removeChild(textarea)\n } catch {\n /* \u590D\u5236\u5931\u8D25\u9759\u9ED8\uFF1A\u6309\u94AE\u4ECD\u7ED9\u51FA\u5DF2\u590D\u5236\u53CD\u9988\uFF0C\u65E0\u526F\u4F5C\u7528\u3002 */\n }\n }\n try {\n if (navigator.clipboard !== undefined) {\n void navigator.clipboard.writeText(skill.name).then(flashCopied, () => { fallback(); flashCopied() })\n } else {\n fallback()\n flashCopied()\n }\n } catch {\n fallback()\n flashCopied()\n }\n }\n\n const toggleLabel = lockedReason ?? (enabled ? skillT('disableSkill') : skillT('enableSkill'))\n const fileMeta = typeof skill.fileCount === 'number' ? skill.fileCount : files.length\n return (\n <li\n className={css.skillCard}\n data-off={enabled ? undefined : 'true'}\n style={{ '--skm-i': index } as CSSProperties}\n >\n <div className={css.skillCardHead}>\n <span className={css.skillBadge} aria-hidden=\"true\">skill</span>\n <button\n type=\"button\"\n className={css.skillTitle}\n title={skill.name}\n onClick={() => { onView(skill) }}\n >\n {skill.name}\n </button>\n <span className={css.skillCardToggle}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={toggleLabel}\n title={toggleLabel}\n className={`${css.toggle} ${enabled ? css.toggleOn : css.toggleOff}`}\n disabled={lockedReason !== undefined}\n onClick={(event) => {\n event.stopPropagation()\n onToggle(skill, !enabled)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </span>\n </div>\n {description !== '' && (\n <button type=\"button\" className={css.skillDesc} title={description} onClick={() => { onView(skill) }}>{description}</button>\n )}\n <div className={css.skillTags}>\n <span className={`${css.tag} ${css.tagSource}`}>{bundleName ?? skillT('tagLoose')}</span>\n <span className={`${css.tag} ${css.tagScope}`} data-off={enabled ? undefined : 'true'}>{scopeLabel}</span>\n {!enabled && <span className={`${css.tag} ${css.tagStatus}`}>{skillT('skillOffTag')}</span>}\n <span className={css.skillMeta}>{skillT('fileCount', { n: fileMeta })}</span>\n </div>\n <div className={css.skillCardFoot}>\n <span className={css.skillFootLabel}>{skillT('toolsLabel')}</span>\n <div className={css.skillCardActions}>\n <Tooltip label={skillT('copySkillName')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.skillFootIcon}\n data-copied={copied ? 'true' : undefined}\n aria-label={copied ? skillT('copiedSkillName') : skillT('copySkillName')}\n title={copied ? skillT('copiedSkillName') : skillT('copySkillName')}\n onClick={copyName}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n </Tooltip>\n {bundleId !== null ? (\n <Tooltip label={skillT('removeSkill')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={css.skillFootIcon} aria-label={skillT('removeSkill')}\n title={skillT('removeSkill')} onClick={() => { onRemove?.(skill) }}>\n <IconCloseOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n ) : (\n <Tooltip label={skillT('assignToBundle')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={css.skillFootIcon} aria-label={skillT('assignToBundle')}\n title={skillT('assignToBundle')} onClick={() => { onAssign?.(skill) }}>\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n )}\n <Tooltip label={skillT('deleteSkillBtn')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={`${css.skillFootIcon} ${css.skillFootIconDanger}`}\n aria-label={skillT('deleteSkillBtn')} title={skillT('deleteSkillBtn')}\n onClick={() => { onDelete?.(skill) }}>\n <IconTrashOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n </div>\n </li>\n )\n}\n", "/**\n * skills/types \u2014 \u9762\u677F\u62C6\u5206\u540E\u7684\u5171\u4EAB\u6570\u636E\u6A21\u578B\u4E0E\u5E38\u91CF\u3002\n *\n * \u542B\u5404\u9762\u677F\u5171\u7528\u7684\u89C6\u56FE\u72B6\u6001\u7C7B\u578B\u3001\u6280\u80FD/MCP \u7EBF\u534F\u8BAE\u5F62\u72B6\u3001\u6280\u80FD\u5305\u5206\u7C7B\u5E38\u91CF\uFF1B\n * \u53EA\u653E\u7C7B\u578B\u4E0E\u7EAF\u51FD\u6570\uFF0C\u4E0D\u5F15\u5165\u4EFB\u4F55\u8FD0\u884C\u65F6\u4F9D\u8D56\u3002\n */\n/** ---------------------------------------------------------------- \u6570\u636E\u6A21\u578B */\n\nexport interface SkillInfo {\n name: string\n description?: string\n files?: string[]\n fileCount?: number\n compatibility?: string\n /** \u6280\u80FD\u76EE\u5F55\u540D\uFF1A\u4E0E name \u53EF\u4EE5\u4E0D\u4E00\u81F4\uFF08\u624B\u5DE5\u62F7\u76EE\u5F55\u3001\u6539\u540D\u5BFC\u5165\uFF09\uFF0C\u5220\u9664/\u67E5\u770B\u8D70\u5B83\u3002 */\n dir?: string\n}\n\nexport interface BundleInfo {\n id: string\n name: string\n skillCount: number\n skills: SkillInfo[]\n /** \u8D26\u672C\u91CC\u6307\u5411\u5DF2\u6D88\u5931\u6280\u80FD\u7684\u6761\u76EE\uFF08\u9762\u677F\u7ED9\u300C\u6E05\u7406\u5931\u6548\u5F15\u7528\u300D\u5165\u53E3\uFF09\u3002 */\n missingSkills?: string[]\n /** \u6280\u80FD\u5305\u5206\u7C7B\uFF08\u4E00\u4E2A\u5305\u53EF\u6302\u591A\u4E2A\uFF09\uFF1B\u8001\u8D26\u672C\u6CA1\u6709\u8BE5\u5B57\u6BB5\u65F6\u6309\u672A\u5206\u7C7B\u5904\u7406\u3002 */\n categories?: string[]\n}\n\nexport interface SkillSnapshot {\n bundles: BundleInfo[]\n loose: SkillInfo[]\n}\n\nexport type PanelState =\n | { status: 'loading' }\n | { status: 'error' }\n | { status: 'ready'; snapshot: SkillSnapshot }\n/** ---------------------------------------------------------------- \u6280\u80FD\u5305\u5206\u7C7B */\n\n/** \u5EFA\u8BAE\u5206\u7C7B\uFF1A\u70B9\u4E00\u4E0B\u5C31\u6302\u4E0A\uFF1B\u4E5F\u5141\u8BB8\u81EA\u5DF1\u5199\uFF0C\u8D26\u672C\u91CC\u5B58\u7684\u5C31\u662F\u5B57\u7B26\u4E32\u672C\u8EAB\u3002 */\nexport const PRESET_BUNDLE_CATEGORIES = ['\u5F00\u53D1', '\u8BBE\u8BA1', '\u529E\u516C\u534F\u540C', '\u6587\u6863\u77E5\u8BC6', '\u6570\u636E', '\u81EA\u52A8\u5316', '\u8FD0\u7EF4', '\u5176\u4ED6']\n\n/** \u5206\u7C7B\u7B5B\u9009\u91CC\u4EE3\u8868\u300C\u6CA1\u6302\u4EFB\u4F55\u5206\u7C7B\u7684\u5305\u300D\u7684\u54E8\u5175\u503C\uFF08\u4E0D\u4F1A\u662F\u5408\u6CD5\u5206\u7C7B\u540D\uFF09\u3002 */\nexport const UNCATEGORIZED = '\\u0000none'\n\n/** \u4E00\u4E2A\u6280\u80FD\u5305\u6700\u591A\u6302\u51E0\u4E2A\u5206\u7C7B\uFF08\u4E0E host \u7684 CATEGORY_MAX_PER_BUNDLE \u5BF9\u9F50\uFF09\u3002 */\nexport const MAX_BUNDLE_CATEGORIES = 8\n\n/** \u5206\u7C7B\u4E0D\u505A\u9010\u7C7B\u914D\u8272\uFF1A\u4E00\u4E2A\u9762\u677F\u53EA\u6709\u4E3B\u9898\u84DD\u4E00\u628A\u5237\u5B50\uFF08\u5F69\u8679\u8272\u677F\u5B9E\u6D4B\u592A\u5435\uFF0C\u5DF2\u5426\uFF09\u3002 */\n\n/** \u5206\u7C7B\u540D\u5355\u6392\u5E8F\uFF1A\u6309\u6302\u8F7D\u7684\u5305\u6570\u4ECE\u591A\u5230\u5C11\uFF0C\u540C\u6570\u6309\u540D\u5B57\u3002 */\nexport function sortCategories(counts: Map<string, number>): string[] {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0], 'zh'))\n .map((entry) => entry[0])\n}\n/** \u300C\u5168\u90E8 Agent\u300D\u865A\u62DF\u9884\u8BBE\u7684\u54E8\u5175 id\uFF08\u4E0D\u4F1A\u4E0E\u771F\u5B9E preset id \u51B2\u7A81\uFF1A\u771F\u5B9E id \u4E0D\u542B *\uFF09\u3002 */\nexport const ALL_PRESETS = '*'\nexport type ConfirmState =\n | { kind: 'bundle'; bundle: BundleInfo }\n | { kind: 'skill'; name: string; dir?: string }\nexport type InstallState =\n | { archive: true; name: string; data: string; folderName: string }\n | { archive?: false; files: CollectedFile[]; folderName: string }\nexport type ViewerState = { skill: SkillInfo; file: string; loading: boolean; error?: string; content?: string }\n/** \u6536\u96C6\u5230\u7684\u4E00\u4E2A\u5F85\u5B89\u88C5\u6587\u4EF6\uFF1A\u76F8\u5BF9\u6280\u80FD\u6839\u7684\u8DEF\u5F84 + \u6D4F\u89C8\u5668 File \u53E5\u67C4\u3002 */\nexport interface CollectedFile { path: string; file: File }\nexport type InstallInput =\n | { archive: string; description: string; bundleId?: string }\n | { skillName: string; description: string; bundleId?: string; files: Array<{ path: string; data: string }> }\n\n/** \u5065\u5EB7\u626B\u63CF\u7684\u5C55\u793A\u6A21\u578B\uFF08\u9876\u680F\u5065\u5EB7\u6307\u793A\u7684 tone / \u6587\u6848 / \u60AC\u505C\u8BE6\u60C5\uFF09\u3002 */\nexport interface HealthViewModel {\n tone: string\n label: string\n title: string\n}\n\n/** \u6280\u80FD\u76EE\u5F55\u5065\u5EB7\u68C0\u67E5\uFF08/api/skill-health \u54CD\u5E94\uFF0Chost \u53EA\u8BFB\u626B\u63CF\uFF09\u3002 */\nexport interface HealthIssue {\n level: 'error' | 'warn'\n code: string\n skill?: string\n bundle?: string\n message: string\n}\n\nexport interface HealthReport {\n ok: boolean\n healthy: number\n issues: HealthIssue[]\n}\n\n/** \u540C\u6B65\u72B6\u6001\u5361\u7684\u5C55\u793A\u6001\u3002 */\nexport type HealthView =\n | { state: 'loading' }\n | { state: 'ok'; report: HealthReport }\n | { state: 'issue'; report: HealthReport }\n | { state: 'unavailable' }\n\n/** \u6280\u80FD\u5F00\u5173\u72B6\u6001(/api/skill-toggles/status \u54CD\u5E94)\u3002 */\nexport interface ToggleStatus {\n skills: Record<string, boolean>\n bundles: Record<string, boolean>\n}\n\n/** \u4E00\u4E2A Agent \u9884\u8BBE(host \u4ECE ctx.agentPresets.list() \u6295\u5F71\u800C\u6765)\u3002 */\nexport interface PresetRow {\n id: string\n trust: 'system' | 'user'\n isDefault?: boolean\n name?: string\n description?: string\n order?: number\n}\n\n/** /api/skill-toggles/presets \u54CD\u5E94:\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5168\u5C40\u5C42\u72B6\u6001\u3002 */\nexport interface PresetStatus extends ToggleStatus {\n presets: PresetRow[]\n /** presetId \u2192 { skillName: false } \u2014\u2014 \u53EA\u6709\u663E\u5F0F false \u624D\u662F\u300C\u8BE5\u9884\u8BBE\u4E0B\u5173\u95ED\u300D\u3002 */\n overrides: Record<string, Record<string, boolean>>\n}\n\n", "/**\n * skills/SkillViewer \u2014 \u6280\u80FD\u6587\u4EF6\u67E5\u770B\u5668\uFF08\u5927\u753B\u5E45 + \u4E09\u6863\u5B57\u53F7 + \u5168\u5C4F\uFF09\u53CA\u5176\u504F\u597D\u8BFB\u5199\u3002\n */\nimport { type CSSProperties } from 'react'\nimport { Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { renderSkillMarkdown } from './markdown.js'\nimport { css } from './styles.js'\nimport type { ViewerState } from './types.js'\n/** ---------------------------------------------------------------- \u67E5\u770B\u5668\u504F\u597D */\n\n/** \u5B57\u53F7\u4E09\u6863\uFF08px\uFF09\uFF1A\u5C0F / \u6807\u51C6 / \u5927\u3002\u9ED8\u8BA4\u53D6\u4E2D\u95F4\u4E00\u6863\u3002 */\nexport const VIEWER_FONT_SIZES = [13.5, 15, 17]\nexport const VIEWER_PREF_KEY = 'dsh.triad.skillViewer'\n/** \u4E09\u6863\u5B57\u53F7\u7684\u60AC\u6D6E\u6587\u6848\uFF08\u4E0E VIEWER_FONT_SIZES \u4E00\u4E00\u5BF9\u5E94\uFF09\u3002 */\nexport const VIEWER_FONT_LABELS = ['\u5C0F\u5B57\u53F7', '\u6807\u51C6\u5B57\u53F7', '\u5927\u5B57\u53F7']\n\nexport interface ViewerPrefs { font: number; full: boolean }\n\n/** \u8BFB\u67E5\u770B\u5668\u504F\u597D\uFF08\u5B57\u53F7 + \u5168\u5C4F\uFF09\uFF1BlocalStorage \u4E0D\u53EF\u7528\u65F6\u56DE\u843D\u5230\u9ED8\u8BA4\u503C\u3002 */\nexport function readViewerPrefs(): ViewerPrefs {\n try {\n const raw = localStorage.getItem(VIEWER_PREF_KEY)\n if (typeof raw !== 'string' || raw === '') return { font: 1, full: false }\n const parsed = JSON.parse(raw) as Partial<ViewerPrefs>\n const font = typeof parsed.font === 'number' && parsed.font >= 0 && parsed.font < VIEWER_FONT_SIZES.length\n ? Math.trunc(parsed.font)\n : 1\n return { font, full: parsed.full === true }\n } catch {\n return { font: 1, full: false }\n }\n}\n\n/** \u5199\u67E5\u770B\u5668\u504F\u597D\uFF1B\u9690\u79C1\u6A21\u5F0F\u7B49\u5199\u5165\u5931\u8D25\u65F6\u9759\u9ED8\u964D\u7EA7\u4E3A\u300C\u53EA\u6D3B\u5230\u672C\u6B21\u5237\u65B0\u300D\u3002 */\nexport function writeViewerPrefs(prefs: ViewerPrefs): void {\n try { localStorage.setItem(VIEWER_PREF_KEY, JSON.stringify(prefs)) } catch { /* \u5FFD\u7565 */ }\n}\n\n/** \u5168\u5C4F / \u8FD8\u539F\uFF1A\u5BF9\u89D2\u7BAD\u5934\uFF0C\u72B6\u6001\u5207\u6362\u65F6\u9760 CSS \u8FC7\u6E21\u7FFB\u8F6C\u3002 */\nexport function ViewerExpandIcon({ full }: { full: boolean }): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {full\n ? <path d=\"M6.2 2.2v4h-4M9.8 2.2v4h4M6.2 13.8v-4h-4M9.8 13.8v-4h4\" />\n : <path d=\"M2.2 6.2v-4h4M13.8 6.2v-4h-4M2.2 9.8v4h4M13.8 9.8v4h-4\" />}\n </svg>\n )\n}\n\nexport interface ViewRow { kind: 'dir' | 'file'; path: string; depth: number; main: boolean }\n\nexport function skillFileRows(files: string[]): ViewRow[] {\n const rows: ViewRow[] = []\n const seenDirs = new Set<string>()\n for (const path of files) {\n const parts = path.split('/')\n let dirPath = ''\n for (let i = 0; i < parts.length - 1; i += 1) {\n dirPath = dirPath === '' ? parts[i] : dirPath + '/' + parts[i]\n if (!seenDirs.has(dirPath)) {\n seenDirs.add(dirPath)\n rows.push({ kind: 'dir', path: dirPath + '/', depth: i, main: false })\n }\n }\n rows.push({ kind: 'file', path, depth: parts.length - 1, main: path === 'SKILL.md' })\n }\n return rows\n}\n\n/**\n * \u67E5\u770B\u5668\u5F39\u7A97\uFF1A\u5DE6\u4FA7\u6587\u4EF6\u6811 + \u53F3\u4FA7\u6E32\u67D3\u5185\u5BB9\uFF1B\u5DE5\u5177\u6761\u5207\u4E09\u6863\u5B57\u53F7\u4E0E\u5168\u5C4F\u3002\n * viewer \u4E3A null \u65F6\u4E0D\u6E32\u67D3\uFF08\u8C03\u7528\u65B9\u6761\u4EF6\u6302\u8F7D\uFF09\u3002\n */\nexport function SkillViewer({\n t, viewer, viewerFont, viewerFull, onFontLevel, onToggleFull, onSelectFile, onClose,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n viewer: ViewerState | null\n viewerFont: number\n viewerFull: boolean\n onFontLevel: (level: number) => void\n onToggleFull: () => void\n onSelectFile: (filePath: string) => void\n onClose: () => void\n}): JSX.Element | null {\n if (viewer === null) return null\n return (\n <Modal\n open\n onClose={() => { onClose() }}\n closeLabel={t('close')}\n title={viewer.skill.name + (viewer.file === 'SKILL.md' ? '' : ' \u00B7 ' + viewer.file)}\n className={css.viewerModal + (viewerFull ? ' ' + css.viewerModalFull : '')}\n contentClassName={css.viewerBody}\n >\n {/* \u5DE5\u5177\u6761\uFF1A\u5F53\u524D\u6587\u4EF6 + \u5B57\u53F7\u4E09\u6863 + \u5168\u5C4F\u5207\u6362\uFF08\u504F\u597D\u6301\u4E45\u5316\uFF09 */}\n <div className={css.viewerToolbar}>\n <span className={css.viewerPath}>\n <b>{viewer.file}</b>\n <span>{t('viewerFilesCount', { n: Array.isArray(viewer.skill.files) ? viewer.skill.files.length : 0 })}</span>\n </span>\n <span className={css.viewerToolGroup} role=\"group\" aria-label={t('viewerFont')}>\n {VIEWER_FONT_SIZES.map((size, level) => (\n <button\n key={size}\n type=\"button\"\n className={css.viewerToolBtn + (level === 0 ? ' ' + css.viewerToolBtnA1 : level === 2 ? ' ' + css.viewerToolBtnA3 : '')}\n data-active={viewerFont === level ? 'true' : undefined}\n title={VIEWER_FONT_LABELS[level]}\n aria-label={VIEWER_FONT_LABELS[level]}\n aria-pressed={viewerFont === level}\n onClick={() => { onFontLevel(level) }}\n >A</button>\n ))}\n </span>\n <button\n type=\"button\"\n className={css.viewerToolBtn + ' ' + css.viewerToolBtnFrame}\n data-active={viewerFull ? 'true' : undefined}\n title={viewerFull ? t('viewerExitFull') : t('viewerFull')}\n aria-label={viewerFull ? t('viewerExitFull') : t('viewerFull')}\n aria-pressed={viewerFull}\n onClick={onToggleFull}\n >\n <ViewerExpandIcon full={viewerFull} />\n </button>\n </div>\n <div className={css.viewerLayout}>\n <nav className={css.viewerNav} aria-label={t('viewerNav')}>\n {skillFileRows(Array.isArray(viewer.skill.files) ? viewer.skill.files : []).map((row, index) => (\n <div\n key={row.path + '-' + String(index)}\n className={css.viewerNavItem + (row.kind === 'dir' ? ' ' + css.viewerNavDir : '')}\n data-active={row.kind === 'file' && row.path === viewer.file ? 'true' : undefined}\n data-dir={row.kind === 'dir' ? 'true' : undefined}\n style={{ paddingLeft: 8 + row.depth * 14 }}\n title={row.path}\n onClick={row.kind === 'file' ? () => { onSelectFile(row.path) } : undefined}\n >\n {row.kind === 'dir' ? '\uD83D\uDCC1 ' : '\uD83D\uDCC4 '}\n {row.path}\n </div>\n ))}\n </nav>\n <div className={css.viewerContent} style={{ '--skm-vfs': `${String(VIEWER_FONT_SIZES[viewerFont])}px` } as CSSProperties}>\n {viewer.loading === true\n ? t('previewLoading')\n : viewer.error !== undefined\n ? viewer.error\n : <div dangerouslySetInnerHTML={{ __html: renderSkillMarkdown(viewer.content ?? '') }} />}\n </div>\n </div>\n </Modal>\n )\n}\n", "/**\n * skills/markdown \u2014 \u6280\u80FD\u5185\u5BB9\u9884\u89C8\u7684\u6781\u7B80 markdown \u6E32\u67D3\uFF08\u96F6\u5916\u90E8\u4F9D\u8D56\uFF0C\u53EA\u62FC HTML \u5B57\u7B26\u4E32\uFF09\u3002\n */\n/** ---------------------------------------------------------------- markdown \u9884\u89C8 */\n\n// \u6280\u80FD\u5185\u5BB9\u9884\u89C8\uFF1A\u6781\u7B80 markdown \u6E32\u67D3\uFF08frontmatter \u9690\u85CF\uFF0C\u6807\u9898/\u5217\u8868/\u4EE3\u7801\u5757/\u7C97\u4F53/\u884C\u5185\u4EE3\u7801/\u94FE\u63A5\uFF09\u3002\nexport function escapeHtml(s: string): string {\n return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\nexport function inlineMd(s: string): string {\n return escapeHtml(s)\n .replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n .replace(/`([^`]+)`/g, '<code>$1</code>')\n .replace(/\\[([^\\]]+)\\]\\((https?:[^)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noreferrer\">$1</a>')\n}\n\nexport function renderSkillMarkdown(text: string): string {\n const body = String(text).replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, '')\n const lines = body.split('\\n')\n let html = ''\n let inCode = false\n let codeBuf: string[] = []\n let inList = false\n let inQuote = false\n const closeList = (): void => {\n if (inList) { html += '</ul>'; inList = false }\n }\n const closeQuote = (): void => {\n if (inQuote) { html += '</blockquote>'; inQuote = false }\n }\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.startsWith('```')) {\n if (inCode) {\n html += '<pre>' + escapeHtml(codeBuf.join('\\n')) + '</pre>'\n codeBuf = []\n inCode = false\n } else {\n closeList(); closeQuote()\n inCode = true\n }\n continue\n }\n if (inCode) { codeBuf.push(line); continue }\n if (trimmed === '---' || trimmed === '***') {\n closeList(); closeQuote()\n html += '<hr>'\n continue\n }\n if (trimmed.startsWith('>')) {\n if (!inQuote) { closeList(); html += '<blockquote>'; inQuote = true }\n html += '<p>' + inlineMd(trimmed.replace(/^>\\s?/, '')) + '</p>'\n continue\n }\n const heading = /^(#{1,4})\\s+(.*)$/.exec(trimmed)\n if (heading !== null) {\n closeList(); closeQuote()\n // \u76F4\u63A5\u7528\u771F\u5B9E\u5C42\u7EA7\uFF08# \u2192 h1 \u2026\u2026 ###### \u2192 h6\uFF09\uFF1A\u67E5\u770B\u5668\u5B57\u53F7\u4E00\u6863\u4E00\u6863\u62C9\u5F97\u5F00\uFF0C\n // \u65E7\u5199\u6CD5\u628A # \u538B\u6210 h3\uFF0C\u4E00\u7EA7\u6807\u9898\u53EA\u6709 15px\uFF0C\u6574\u7BC7\u6587\u6863\u770B\u8D77\u6765\u50CF\u6CA1\u653E\u5927\u3002\n const level = Math.min(heading[1].length, 6)\n html += `<h${String(level)}>` + inlineMd(heading[2]) + `</h${String(level)}>`\n continue\n }\n const item = /^[-*]\\s+(.*)$/.exec(trimmed)\n if (item !== null) {\n if (!inList) { closeQuote(); html += '<ul>'; inList = true }\n html += '<li>' + inlineMd(item[1]) + '</li>'\n continue\n }\n closeList(); closeQuote()\n if (trimmed === '') { html += '<p></p>'; continue }\n html += '<p>' + inlineMd(trimmed) + '</p>'\n }\n closeList(); closeQuote()\n if (inCode) html += '<pre>' + escapeHtml(codeBuf.join('\\n')) + '</pre>'\n return html\n}\n", "/**\n * skills/SkillsView \u2014 SKILL \u9875\u4E3B\u533A\uFF1A\u540C\u6B65\u63D0\u793A\u3001\u9884\u8BBE\u63D0\u793A\u884C\u4E0E\u6280\u80FD\u5217\u8868\uFF08\u6280\u80FD\u5305 + \u6563\u88C5\u6280\u80FD\uFF09\u3002\n *\n * \u7EAF\u5C55\u793A\uFF1A\u72B6\u6001\u4E0E\u64CD\u4F5C\u5168\u90E8\u7531 SkillsPanel \u6301\u6709\uFF0Cprops \u6CE8\u5165\u3002\u641C\u7D22\u3001\u8BA1\u6570\u3001\u5237\u65B0\u4E0E\u6DFB\u52A0\n * \u5DF2\u4E0A\u79FB\u5230\u9876\u680F SkillTopBar\uFF0C\u8FD9\u91CC\u53EA\u8D1F\u8D23\u5217\u8868\u672C\u4F53\u3002\n */\nimport type { Dispatch, FormEvent, SetStateAction } from 'react'\nimport {\n Button, IconArchiveOutlineRegular, IconCheckOutlineRegular, IconChevronDownOutlineRegular, IconCloseOutlineRegular,\n IconEditOutlineRegular, IconEllipsisOutlineRegular, IconRefreshOutlineRegular, IconTrashOutlineRegular, Menu,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { modalStaggerClass } from '../modal-animation'\nimport { CloudUpIcon, FolderBlueIcon, TagIcon } from './icons.js'\nimport { SkillCard } from './SkillCard.js'\nimport { css } from './styles.js'\nimport { ALL_PRESETS } from './types.js'\nimport type { BundleInfo, ConfirmState, HealthView, PanelState, PresetRow, SkillInfo } from './types.js'\n\nexport function SkillsView({\n t, state, health, activePreset, presets, presetOverride, resetActivePreset, openMenu, setOpenMenu,\n refresh, noResults, visibleBundleAll, expanded, renameTarget, setRenameTarget, renaming, submitRename,\n bundleEnabledIn, toggling, viewMode, setCatFilter, activeCat, toggleExpanded, renamedFlash, openInstallFor,\n skillEnabledIn, skillLockedReason, scopeLabel, toggleSkill, toggleBundle, openViewer, removeFromBundle,\n pruneBundle, openCatEditor, setConfirm, setAssignTarget, looseOpen, setLooseExpanded, visibleLooseAll,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n state: PanelState\n health: HealthView\n activePreset: string\n presets: PresetRow[]\n presetOverride: Record<string, boolean>\n resetActivePreset: () => void\n openMenu: string | null\n setOpenMenu: Dispatch<SetStateAction<string | null>>\n refresh: () => void\n noResults: boolean\n visibleBundleAll: BundleInfo[]\n expanded: Set<string>\n renameTarget: { bundleId: string; name: string } | null\n setRenameTarget: Dispatch<SetStateAction<{ bundleId: string; name: string } | null>>\n renaming: boolean\n submitRename: (event: FormEvent<HTMLFormElement>) => Promise<void>\n bundleEnabledIn: (bundle: BundleInfo) => boolean\n toggling: Set<string>\n viewMode: 'grid' | 'list'\n setCatFilter: Dispatch<SetStateAction<string | null>>\n activeCat: string | null\n toggleExpanded: (bundleId: string) => void\n renamedFlash: string | null\n openInstallFor: (bundleId: string) => void\n skillEnabledIn: (name: string) => boolean\n skillLockedReason: (name: string) => string | undefined\n scopeLabel: string\n toggleSkill: (skill: SkillInfo, enabled: boolean) => void\n toggleBundle: (bundle: BundleInfo, enabled: boolean) => void\n openViewer: (skill: SkillInfo) => void\n removeFromBundle: (bundleId: string, name: string) => Promise<void>\n pruneBundle: (bundle: BundleInfo) => Promise<void>\n openCatEditor: (bundle: BundleInfo) => void\n setConfirm: Dispatch<SetStateAction<ConfirmState | null>>\n setAssignTarget: Dispatch<SetStateAction<SkillInfo | null>>\n looseOpen: boolean\n setLooseExpanded: Dispatch<SetStateAction<boolean>>\n visibleLooseAll: SkillInfo[]\n}): JSX.Element {\n return (\n <>\n {/* \u540C\u6B65\u95EE\u9898\u660E\u7EC6\uFF1A\u53EA\u8BFB\u5065\u5EB7\u626B\u63CF\u53D1\u73B0 error \u7EA7\u95EE\u9898\u65F6\u5C55\u793A\uFF08\u9876\u680F\u5065\u5EB7\u6307\u793A\u60AC\u505C\u770B\u5168\u91CF\uFF09 */}\n {health.state === 'issue' && (\n <div className={css.healthNotice} role=\"status\">\n <span className={css.healthNoticeTitle}>{t('statIssues', { n: health.report.issues.length })}</span>\n <ul>\n {health.report.issues.slice(0, 4).map((issue, index) => (\n <li key={`${issue.code}-${String(index)}`}>{issue.message}</li>\n ))}\n </ul>\n </div>\n )}\n\n {/* \u9884\u8BBE\u63D0\u793A\u884C\uFF1A\u5F53\u524D\u7F16\u8F91\u5C42\u8BF4\u660E + \u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u5355\u72EC\u8BBE\u7F6E */}\n <div className={css.hintRow}>\n <span className={css.hintRowText}>\n {activePreset === ALL_PRESETS\n ? t('presetHintAll')\n : t('presetHintScoped', { name: presets.find((preset) => preset.id === activePreset)?.name ?? activePreset })}\n </span>\n {activePreset !== ALL_PRESETS && Object.keys(presetOverride).length > 0 && (\n <button type=\"button\" className={css.presetReset} onClick={resetActivePreset}>\n {t('presetReset')}\n </button>\n )}\n </div>\n\n {/* \u5206\u7C7B tabs \u5DF2\u79FB\u9664\uFF1A\u4E0E\u5DE6\u680F\u300CAgent \u9884\u8BBE\u5206\u7C7B\u300D\u91CD\u590D\uFF08\u5DE6\u680F\u63A7\u5236\u9884\u8BBE\u5207\u6362\uFF09 */}\n\n {/* \u5185\u5BB9\u533A\uFF1A\u6280\u80FD\u5305 sections + \u6563\u88C5\u6280\u80FD */}\n <div className={`${css.mainScroll} ${modalStaggerClass}`}>\n {state.status === 'loading' ? <p className={css.status}>{t('loading')}</p> : null}\n {state.status === 'error' ? (\n <div className={css.failure}>\n <p role=\"alert\">{t('error')}</p>\n <Button variant=\"outline\" onClick={refresh}><IconRefreshOutlineRegular size={14} /> {t('retry')}</Button>\n </div>\n ) : null}\n\n {state.status === 'ready' && (\n noResults ? (\n <p className={css.noResult}>{t('noMatch')}</p>\n ) : (\n <>\n {visibleBundleAll.map((bundle) => {\n const open2 = expanded.has(bundle.id)\n const renamingThis = renameTarget?.bundleId === bundle.id\n const bundleEnabled = bundleEnabledIn(bundle)\n const bundleToggling = toggling.has(`bundle:${bundle.id}`)\n const gridClass = viewMode === 'list' ? `${css.skillGrid} ${css.skillGridList}` : css.skillGrid\n const missing = bundle.missingSkills ?? []\n const bundleCats = bundle.categories ?? []\n const emptyBundle = bundle.skillCount === 0\n // \u7A7A\u5305\u9ED8\u8BA4\u5C55\u5F00\u663E\u793A\u5F15\u5BFC\uFF1A\u6298\u53E0\u7740\u53EA\u5269\u4E00\u884C\u6807\u9898\uFF0C\u7528\u6237\u4F1A\u4EE5\u4E3A\u5305\u4E22\u4E86\u3002\n const openView = open2 || emptyBundle\n return (\n <section key={bundle.id} className={css.hubSection} data-open={openView ? 'true' : undefined} data-empty={emptyBundle ? 'true' : undefined}>\n <header\n className={css.bundleRowOuter}\n data-open={openView ? 'true' : undefined}\n >\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={openView}\n onClick={(event) => {\n // \u6807\u9898\u884C\u91CC\u5D4C\u7740\u5206\u7C7B\u6807\u7B7E\uFF1A\u70B9\u5230\u6807\u7B7E\u5C31\u662F\u7B5B\u9009\uFF0C\u4E0D\u8BE5\u987A\u624B\u628A\u5305\u5C55\u5F00/\u6536\u8D77\u3002\n // \u6807\u7B7E\u672C\u8EAB\u662F span\uFF08\u6309\u94AE\u91CC\u4E0D\u80FD\u518D\u5957\u6309\u94AE\uFF09\uFF0C\u952E\u76D8\u8DEF\u5F84\u8D70\u9876\u680F\u5206\u7C7B\u80F6\u56CA\u3002\n const hit = (event.target as HTMLElement).closest('[data-skm-cat]') as HTMLElement | null\n if (hit !== null) {\n const cat = hit.dataset.skmCat ?? ''\n setCatFilter(activeCat === cat ? null : cat)\n return\n }\n toggleExpanded(bundle.id)\n }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><FolderBlueIcon size={17} /></span>\n <span className={css.bundleName} title={bundle.name}>{bundle.name}</span>\n <span className={css.bundleCount}>{t('skillsCount', { n: bundle.skillCount })}</span>\n {bundleCats.length > 0 && (\n <span className={css.bundleCats}>\n {bundleCats.map((cat) => (\n <span\n key={cat}\n className={css.bundleCatTag}\n data-skm-cat={cat}\n data-active={activeCat === cat || undefined}\n title={t('bundleCatTip', { name: cat })}\n >\n {cat}\n </span>\n ))}\n </span>\n )}\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n {/* \u6280\u80FD\u5305\u4E00\u952E\u5F00\u5173\uFF1A\u6574\u5305\u542F\u7528/\u7981\u7528 */}\n <span className={css.bundleToggle}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={bundleEnabled}\n aria-label={bundleEnabled ? t('disableBundle') : t('enableBundle')}\n title={bundleEnabled ? t('disableBundle') : t('enableBundle')}\n className={`${css.toggle} ${bundleEnabled ? css.toggleOn : css.toggleOff}`}\n disabled={bundleToggling || bundle.skillCount === 0}\n onClick={(event) => {\n event.stopPropagation()\n toggleBundle(bundle, !bundleEnabled)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </span>\n <div className={css.bundleMore}>\n <Menu\n open={openMenu === `bundle:${bundle.id}`}\n onClose={() => { setOpenMenu(null) }}\n onSelect={(id) => {\n setOpenMenu(null)\n if (id === 'enable') toggleBundle(bundle, true)\n else if (id === 'disable') toggleBundle(bundle, false)\n else if (id === 'rename') setRenameTarget({ bundleId: bundle.id, name: bundle.name })\n else if (id === 'cat') openCatEditor(bundle)\n else if (id === 'delete') setConfirm({ kind: 'bundle', bundle })\n }}\n portal\n items={[\n { id: 'enable', label: t('enableBundle'), icon: <IconCheckOutlineRegular size={14} /> },\n { id: 'disable', label: t('disableBundle'), icon: <IconCloseOutlineRegular size={14} /> },\n { type: 'separator', id: 'gap' },\n { id: 'rename', label: t('rename'), icon: <IconEditOutlineRegular size={14} /> },\n { id: 'cat', label: t('bundleCatEdit'), icon: <TagIcon /> },\n { id: 'delete', label: t('delete'), icon: <IconTrashOutlineRegular size={14} />, danger: true },\n ]}\n anchor={(\n <button\n type=\"button\"\n className={css.bundleMoreBtn}\n aria-label={t('moreActions')}\n aria-haspopup=\"menu\"\n aria-expanded={openMenu === `bundle:${bundle.id}` || undefined}\n onClick={(event) => {\n event.stopPropagation()\n setOpenMenu(openMenu === `bundle:${bundle.id}` ? null : `bundle:${bundle.id}`)\n }}\n >\n <IconEllipsisOutlineRegular size={15} aria-hidden=\"true\" />\n </button>\n )}\n />\n </div>\n </header>\n {renamingThis && renameTarget !== null && (\n <form className={`${css.inlineForm} ${css.inlineFormBlock}`} onSubmit={(event) => { void submitRename(event) }}>\n <input className={css.inlineInput} value={renameTarget.name} placeholder={t('renameBundlePlaceholder')}\n aria-label={t('renameBundlePlaceholder')} autoFocus disabled={renaming}\n onChange={(event) => {\n // \u5148\u628A\u503C\u53D6\u51FA\u518D\u8FDB setState \u56DE\u8C03\uFF1AReact \u5408\u6210\u4E8B\u4EF6\u5728\n // \u56DE\u8C03\u6267\u884C\u5B8C\u6BD5\u540E\u4F1A\u628A currentTarget \u7F6E\u7A7A\uFF0C\u82E5\u5728\u51FD\u6570\u5F0F\n // updater \u91CC\u624D\u8BFB event.currentTarget.value\uFF0C\u6E32\u67D3\u9636\u6BB5\n // \u4F1A\u629B Cannot read properties of null\uFF0C\u6574\u4E2A\u6280\u80FD\u9762\u677F\n // \u88AB ErrorBoundary \u6458\u6389\u2014\u2014\u8868\u73B0\u5C31\u662F\u300C\u6539\u540D\u65F6\u5361\u7247\u6D88\u5931\u300D\u3002\n const next = event.currentTarget.value\n setRenameTarget((current) => current === null ? current : { ...current, name: next })\n }} />\n <Button variant=\"primary\" type=\"submit\" disabled={renaming || renameTarget.name.trim() === ''}>{t('rename')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={renaming} onClick={() => { setRenameTarget(null) }}>{t('cancel')}</Button>\n </form>\n )}\n {missing.length > 0 && (\n <div className={css.bundleMissing} role=\"status\">\n <span>{t('bundleMissingN', { n: missing.length })}</span>\n <code>{missing.join('\u3001')}</code>\n <button type=\"button\" className={css.bundleMissingBtn} onClick={() => { void pruneBundle(bundle) }}>\n {t('bundlePrune')}\n </button>\n </div>\n )}\n {openView && (\n <ul className={gridClass} data-renamed={renamedFlash === bundle.id ? 'true' : undefined}>\n {bundle.skills.length === 0 ? (\n <li className={css.bundleEmpty}>\n <span className={css.bundleEmptyTitle}>{t('bundleEmptyTitle')}</span>\n <span className={css.bundleEmptyHint}>{t('bundleEmptyHint')}</span>\n <button type=\"button\" className={css.bundleEmptyBtn} onClick={() => { openInstallFor(bundle.id) }}>\n <CloudUpIcon size={14} />\n {t('bundleUploadHere')}\n </button>\n </li>\n ) : bundle.skills.map((skill, index) => (\n <SkillCard key={skill.name} skill={skill} bundleId={bundle.id} bundleName={bundle.name}\n enabled={skillEnabledIn(skill.name)}\n lockedReason={skillLockedReason(skill.name)}\n scopeLabel={scopeLabel}\n index={index}\n onToggle={toggleSkill}\n onView={openViewer}\n onRemove={(s) => { void removeFromBundle(bundle.id, s.name) }}\n onDelete={(s) => { setConfirm({ kind: 'skill', name: s.name, dir: s.dir }) }} />\n ))}\n </ul>\n )}\n </section>\n )\n })}\n\n {visibleLooseAll.length > 0 && (\n <section className={css.hubSection} data-open={looseOpen ? 'true' : undefined}>\n <header\n className={css.bundleRowOuter}\n data-open={looseOpen ? 'true' : undefined}\n >\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={looseOpen}\n onClick={() => { setLooseExpanded((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconArchiveOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{t('looseTitle')}</span>\n <span className={css.bundleCount}>{t('skillsCount', { n: visibleLooseAll.length })}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {looseOpen && (\n <ul className={viewMode === 'list' ? `${css.skillGrid} ${css.skillGridList}` : css.skillGrid}>\n {visibleLooseAll.map((skill, index) => (\n <SkillCard key={skill.name} skill={skill} bundleId={null} bundleName={null}\n enabled={skillEnabledIn(skill.name)}\n lockedReason={skillLockedReason(skill.name)}\n scopeLabel={scopeLabel}\n index={index}\n onToggle={toggleSkill}\n onView={openViewer}\n onAssign={(s) => { setAssignTarget(s) }}\n onDelete={(s) => { setConfirm({ kind: 'skill', name: s.name, dir: s.dir }) }} />\n ))}\n </ul>\n )}\n </section>\n )}\n\n {/* \u65B0\u5EFA\u6280\u80FD\u5305\u5165\u53E3\u5DF2\u79FB\u81F3\u5DE6\u680F\uFF08newBundleBtn\uFF09 */}\n </>\n )\n )}\n </div>\n </>\n )\n}\n", "/**\n * skills/TopBar \u2014 \u9762\u677F\u9876\u680F\u3002\n *\n * \u300C\u80FD\u529B\u7BA1\u7406\u300D\u6807\u9898 + SKILL/MCP \u9876\u5C42 tab\uFF08PanelHead\uFF09\uFF0C\u4EE5\u53CA\u4E24\u4E2A\u9875\u7B7E\u5404\u81EA\u7684\n * Agent \u9884\u8BBE chips \u4E0E\u542F\u7528\u72B6\u6001\u5206\u6BB5\uFF08SkillTopBar / McpTopBar\uFF09\u3002\n */\nimport type { Dispatch, DragEvent, RefObject, SetStateAction } from 'react'\nimport {\n IconAgentPresetOutlineRegular, IconChevronDownOutlineRegular, IconPlusOutlineRegular, IconRefreshOutlineRegular,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CatAllIcon, CloudUpIcon, SearchIcon, SortDirIcon } from './icons.js'\nimport type { LiveMcpStatus } from './mcp-live.js'\nimport { css } from './styles.js'\nimport { ALL_PRESETS, UNCATEGORIZED, type HealthViewModel, type PresetRow } from './types.js'\n\n/** \u9762\u677F\u5934\u90E8\uFF1A\u6807\u9898\uFF08\u80FD\u529B\u7BA1\u7406\uFF09+ \u7D27\u8D34\u6587\u5B57\u53F3\u4FA7\u7684 SKILL / MCP / \u63D0\u793A\u8BCD \u9876\u5C42 tab\u3002 */\nexport function PanelHead({ t, kind, onKind }: {\n t: (key: string, params?: Record<string, string | number>) => string\n kind: 'skill' | 'mcp' | 'prompt'\n onKind: (value: 'skill' | 'mcp' | 'prompt') => void\n}): JSX.Element {\n return (\n <div className=\"psh-head\">\n <span className=\"psh-title\" style={{ flex: 'none' }}>{t('panelTitle')}</span>\n <div className={css.kindTabs} role=\"tablist\" aria-label=\"SKILL / MCP / \u63D0\u793A\u8BCD\">\n {([\n ['skill', t('kindSkill')],\n ['mcp', t('kindMcp')],\n ['prompt', t('kindPrompt')],\n ] as const).map(([value, label]) => (\n <button\n key={value}\n type=\"button\"\n role=\"tab\"\n aria-selected={kind === value}\n className={`${css.kindTab} ${kind === value ? css.kindTabActive : ''}`}\n data-active={kind === value || undefined}\n onClick={() => { onKind(value) }}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n )\n}\n\n/**\n * SKILL \u9876\u680F\uFF1AAgent \u9884\u8BBE chips\uFF08\u6570\u5B57 = \u8BE5\u5C42\u542F\u7528\u6280\u80FD\u6570\uFF09+ \u6280\u80FD\u5305\u5206\u7C7B\u80F6\u56CA\uFF0C\n * \u4E0B\u4E00\u884C\u662F\u64CD\u4F5C\u884C\u2014\u2014\u641C\u7D22 / \u540D\u79F0\u6392\u5E8F / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u6280\u80FD\u5065\u5EB7 / \u5237\u65B0 \u00B7 \u65B0\u5EFA \u00B7 \u6DFB\u52A0\u3002\n * \u6574\u5757\u540C\u65F6\u662F\u6280\u80FD\u6587\u4EF6\u5939\u62D6\u653E\u533A\u3002\n */\nexport function SkillTopBar({\n t, dropActive, setDropActive, onDrop, activePreset, setActivePreset, presets, overrides,\n enabledCountFor, totalSkills, enabledCount, disabledCount, healthView, hasCategories, activeCat, setCatFilter,\n categoryList, categoryCounts, bundleCount, statusFilter, setStatusFilter, query, setQuery, openMenu,\n setOpenMenu, sortAsc, setSortAsc, newBundleOpen, onNewBundle, onAdd, onRefresh, fileInput, acceptFiles,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n dropActive: boolean\n setDropActive: Dispatch<SetStateAction<boolean>>\n onDrop: (event: DragEvent<HTMLDivElement>) => Promise<void>\n activePreset: string\n setActivePreset: Dispatch<SetStateAction<string>>\n presets: PresetRow[]\n overrides: Record<string, Record<string, boolean>>\n enabledCountFor: (presetId: string) => number\n totalSkills: number\n enabledCount: number\n disabledCount: number\n /** \u5065\u5EB7\u626B\u63CF\u5C55\u793A\u6A21\u578B\uFF08tone \u51B3\u5B9A\u5706\u70B9\u989C\u8272\uFF09\u3002 */\n healthView: HealthViewModel\n hasCategories: boolean\n activeCat: string | null\n setCatFilter: Dispatch<SetStateAction<string | null>>\n categoryList: string[]\n categoryCounts: Map<string, number>\n bundleCount: number\n statusFilter: 'all' | 'on' | 'off'\n setStatusFilter: Dispatch<SetStateAction<'all' | 'on' | 'off'>>\n query: string\n setQuery: Dispatch<SetStateAction<string>>\n openMenu: string | null\n setOpenMenu: Dispatch<SetStateAction<string | null>>\n sortAsc: boolean\n setSortAsc: Dispatch<SetStateAction<boolean>>\n newBundleOpen: boolean\n onNewBundle: () => void\n onAdd: () => void\n onRefresh: () => void\n /** \u9690\u85CF\u7684\u76EE\u5F55\u9009\u62E9\u6846\uFF1A\u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\u4E0E\u9876\u680F\u62D6\u653E\u5171\u7528\u3002 */\n fileInput: RefObject<HTMLInputElement | null>\n acceptFiles: (files: File[] | null) => void\n}): JSX.Element {\n return (\n <div\n className={css.topbar}\n data-drop={dropActive || undefined}\n onDragOver={(event) => { event.preventDefault(); setDropActive(true) }}\n onDragLeave={() => { setDropActive(false) }}\n onDrop={(event) => { void onDrop(event) }}\n >\n <div className={css.chipRow} role=\"group\" aria-label={t('presetCatTitle')}>\n <button\n type=\"button\"\n className={`${css.catItem} ${activePreset === ALL_PRESETS ? css.catItemActive : ''}`}\n data-active={activePreset === ALL_PRESETS || undefined}\n onClick={() => { setActivePreset(ALL_PRESETS) }}\n >\n <span className={css.catIcon} data-active={activePreset === ALL_PRESETS || undefined}><CatAllIcon size={16} /></span>\n <span className={css.catLabel}>{t('presetAll')}</span>\n <span className={css.catCount} title={t('presetCountTip', { n: enabledCountFor(ALL_PRESETS), total: totalSkills })}>{enabledCountFor(ALL_PRESETS)}</span>\n </button>\n {presets.map((preset) => {\n const overrideCount = Object.values(overrides[preset.id] ?? {}).filter((state2) => state2 === false).length\n return (\n <button\n key={preset.id}\n type=\"button\"\n className={`${css.catItem} ${activePreset === preset.id ? css.catItemActive : ''}`}\n data-active={activePreset === preset.id || undefined}\n onClick={() => { setActivePreset(preset.id) }}\n >\n <span className={css.catIcon} data-active={activePreset === preset.id || undefined}><IconAgentPresetOutlineRegular size={15} /></span>\n <span className={css.catLabel}>{preset.name ?? preset.id}</span>\n <span className={css.catCount} data-warn={overrideCount > 0 || undefined}\n title={t('presetCountTip', { n: enabledCountFor(preset.id), total: totalSkills })\n + (overrideCount > 0 ? ` \u00B7 ${t('presetOverrideCount', { n: overrideCount })}` : '')}>\n {enabledCountFor(preset.id)}\n </span>\n </button>\n )\n })}\n </div>\n\n {/* \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u80F6\u56CA\u5373\u7B5B\u9009\uFF08\u518D\u70B9\u4E00\u6B21\u53D6\u6D88\uFF09\u3002\u6CA1\u6709\u4E00\u4E2A\u771F\u5206\u7C7B\u65F6\u4E0D\u5360\u8FD9\u4E00\u884C\u3002 */}\n {hasCategories && (\n <div className={css.catChipRow} role=\"group\" aria-label={t('bundleCatFilterAria')}>\n <span className={css.catChipLabel}>{t('bundleCatTitle')}</span>\n <button\n type=\"button\"\n className={css.catChip}\n data-active={activeCat === null || undefined}\n aria-pressed={activeCat === null}\n onClick={() => { setCatFilter(null) }}\n >\n {t('bundleCatAll')}\n <span className={css.catChipCount}>{bundleCount}</span>\n </button>\n {categoryList.map((cat) => {\n const none = cat === UNCATEGORIZED\n const active = activeCat === cat\n return (\n <button\n type=\"button\"\n key={cat}\n className={css.catChip}\n data-active={active || undefined}\n aria-pressed={active}\n onClick={() => { setCatFilter(active ? null : cat) }}\n >\n {none ? t('bundleCatNone') : cat}\n <span className={css.catChipCount}>{categoryCounts.get(cat) ?? 0}</span>\n </button>\n )\n })}\n </div>\n )}\n\n {/* \u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 / \u540D\u79F0\u6392\u5E8F / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u6280\u80FD\u5065\u5EB7 / \u5237\u65B0 \u00B7 \u65B0\u5EFA \u00B7 \u6DFB\u52A0 */}\n <div className={css.topbarActions}>\n <div className={css.searchBox}>\n <SearchIcon />\n <input\n className={css.searchInput}\n value={query}\n placeholder={t('searchPlaceholder')}\n aria-label={t('searchPlaceholder')}\n onChange={(event) => { setQuery(event.currentTarget.value) }}\n />\n </div>\n <div className={css.dropWrap}>\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 36 }}\n aria-haspopup=\"menu\"\n aria-expanded={openMenu === 'sort' || undefined}\n onClick={() => { setOpenMenu((value) => value === 'sort' ? null : 'sort') }}\n >\n {t('sortLabel')}\n <SortDirIcon dir={sortAsc ? 'asc' : 'desc'} size={12} />\n <IconChevronDownOutlineRegular size={11} aria-hidden=\"true\" />\n </button>\n {openMenu === 'sort' && (\n <>\n <button type=\"button\" className={css.bulkOverlay} aria-label={t('close')} onClick={() => { setOpenMenu(null) }} />\n <div className={css.dropMenu} role=\"menu\">\n <button type=\"button\" role=\"menuitemradio\" className={css.dropItem} aria-checked={sortAsc}\n onClick={() => { setSortAsc(true); setOpenMenu(null) }}>\n <span className={css.dropCheck} data-on={sortAsc || undefined} aria-hidden=\"true\">{sortAsc ? '\u2713' : ''}</span>\n {t('nameAsc')}\n </button>\n <button type=\"button\" role=\"menuitemradio\" className={css.dropItem} aria-checked={!sortAsc}\n onClick={() => { setSortAsc(false); setOpenMenu(null) }}>\n <span className={css.dropCheck} data-on={!sortAsc || undefined} aria-hidden=\"true\">{!sortAsc ? '\u2713' : ''}</span>\n {t('nameDesc')}\n </button>\n </div>\n </>\n )}\n </div>\n <div className={css.statusSeg} role=\"group\" aria-label={t('statusAll')}>\n {([\n ['all', t('statusAll'), enabledCount + disabledCount],\n ['on', t('statusOn'), enabledCount],\n ['off', t('statusOff'), disabledCount],\n ] as const).map(([value, label, count]) => (\n <button\n key={value}\n type=\"button\"\n className={`${css.statusSegBtn} ${statusFilter === value ? css.statusSegActive : ''}`}\n data-active={statusFilter === value || undefined}\n aria-pressed={statusFilter === value}\n onClick={() => { setStatusFilter(value) }}\n >\n {label}\n <span className={css.statusSegCount}>{count}</span>\n </button>\n ))}\n </div>\n <span className={css.healthInline} data-tone={healthView.tone} title={healthView.title === '' ? undefined : healthView.title}>\n {t('statSync')} \u00B7 {healthView.label}\n </span>\n <span className={css.toolbarSpacer} />\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 34, alignSelf: 'center' }}\n onClick={onRefresh}\n >\n <IconRefreshOutlineRegular size={14} aria-hidden=\"true\" />\n {t('refresh')}\n </button>\n <button\n type=\"button\"\n className={`${css.newBundleBtn} ${newBundleOpen ? css.newBundleBtnOpen : ''}`}\n style={{ width: 'auto', marginTop: 0, height: 34, fontSize: 12 }}\n aria-expanded={newBundleOpen || undefined}\n onClick={onNewBundle}\n >\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n {t('newBundle')}\n </button>\n <button\n type=\"button\"\n className={css.addBtn}\n style={{ height: 34, alignSelf: 'center' }}\n aria-label={t('addSkillsTitle')}\n title={t('addSkillsSub')}\n onClick={onAdd}\n >\n <CloudUpIcon size={15} aria-hidden=\"true\" />\n {t('addSkillsTitle')}\n </button>\n <input\n ref={fileInput}\n type=\"file\"\n className={css.hiddenInput}\n multiple\n {...{ webkitdirectory: '' }}\n onChange={(event) => {\n acceptFiles(event.currentTarget.files === null ? null : Array.from(event.currentTarget.files))\n }}\n />\n </div>\n\n </div>\n )\n}\n/**\n * MCP \u9876\u680F\uFF1A\u4E0E\u6280\u80FD\u9875\u540C\u6784\u7684\u9884\u8BBE chips\uFF08\u5168\u90E8 + \u5404\u9884\u8BBE\uFF0C\u6570\u5B57 = \u8BE5\u5C42\u53EF\u89C1 Server \u6570\uFF09\n * + \u542F\u7528\u72B6\u6001\u5206\u6BB5\u3002\u6446\u5728\u4E3B\u533A\u4E4B\u4E0A\uFF0C\u4E0E\u6280\u80FD\u9875\u540C\u4E00\u4F4D\u7F6E\u3001\u540C\u4E00\u5957\u7C7B\u540D\u3002\n */\nexport function McpTopBar({\n t, live, scope, onScope, status, onStatus, query, onQuery, onRefresh, onAddOwn, onAddCustom,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n live: LiveMcpStatus\n scope: string\n onScope: (value: string) => void\n status: 'all' | 'on' | 'off'\n onStatus: (value: 'all' | 'on' | 'off') => void\n query: string\n onQuery: (value: string) => void\n onRefresh: () => void\n /** \u6253\u5F00\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\uFF08\u53EA\u5728\u9884\u8BBE\u8303\u56F4\u663E\u793A\u8FD9\u4E2A\u6309\u94AE\uFF09\u3002 */\n onAddOwn: () => void\n onAddCustom: () => void\n}): JSX.Element {\n const data = live.state === 'ready' ? live.data : null\n const presets = data?.presets ?? []\n const globals = data?.servers ?? []\n const offCount = globals.filter(server => server.config.disabled).length\n const maskedOf = (presetId: string): Set<string> => new Set(\n Object.entries(data?.masks?.[presetId] ?? {}).filter(([, on]) => on === false).map(([name]) => name),\n )\n /** \u8BE5\u9884\u8BBE\u53EF\u89C1\u7684 Server \u6570 = \u672A\u88AB\u5B83\u906E\u853D\u7684\u5168\u5C40 + \u5B83\u81EA\u5E26\u7684\u884C\u3002 */\n const visibleCount = (presetId: string): number => {\n const masked = maskedOf(presetId)\n return globals.filter(server => !masked.has(server.serverName)).length + (data?.presetServers?.[presetId] ?? []).length\n }\n const chips: Array<{ id: string; label: string; count: number; overrides: number; icon: JSX.Element }> = [\n { id: '', label: t('presetAll'), count: globals.length, overrides: 0, icon: <CatAllIcon size={16} /> },\n ...presets.map(preset => ({\n id: preset.id,\n label: preset.name ?? preset.id,\n count: visibleCount(preset.id),\n overrides: maskedOf(preset.id).size,\n icon: <IconAgentPresetOutlineRegular size={15} />,\n })),\n ]\n /** \u8FDE\u63A5\u72B6\u6001\uFF08\u66FF\u4EE3\u539F\u300C\u8FDE\u63A5\u72B6\u6001\u300D\u7EDF\u8BA1\u5361\uFF09\uFF1A\u6307\u793A\u5B9E\u65F6\u72B6\u6001\u63A5\u53E3\u80FD\u5426\u8BFB\u5230\u6CE8\u518C\u8868\u3002 */\n const conn = live.state === 'ready'\n ? { tone: 'ok', label: t('mcpConnOk'), title: t('mcpConnTip', { n: globals.length }) }\n : live.state === 'loading'\n ? { tone: 'pending', label: t('statChecking'), title: '' }\n : { tone: 'warn', label: t('mcpConnDown'), title: t('mcpLiveUnavailable') }\n return (\n <div className={css.topbar}>\n {presets.length > 0 && (\n <div className={css.chipRow} role=\"group\" aria-label={t('mcpScopeTitle')}>\n {chips.map(chip => (\n <button\n key={chip.id === '' ? '__all__' : chip.id}\n type=\"button\"\n className={`${css.catItem} ${scope === chip.id ? css.catItemActive : ''}`}\n data-active={scope === chip.id || undefined}\n onClick={() => { onScope(chip.id) }}\n >\n <span className={css.catIcon} data-active={scope === chip.id || undefined}>{chip.icon}</span>\n <span className={css.catLabel}>{chip.label}</span>\n <span\n className={css.catCount}\n data-warn={chip.overrides > 0 || undefined}\n title={chip.id === ''\n ? t('mcpScopeAllTip', { n: chip.count })\n : t('mcpScopePresetTip', { n: chip.count })\n + (chip.overrides > 0 ? ` \u00B7 ${t('mcpScopeOverrideCount', { n: chip.overrides })}` : '')}\n >\n {chip.count}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* \u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u8FDE\u63A5\u72B6\u6001 / \u5237\u65B0 \u00B7 \u6DFB\u52A0\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09 */}\n <div className={css.topbarActions}>\n <div className={css.searchBox}>\n <SearchIcon />\n <input\n className={css.searchInput}\n value={query}\n placeholder={t('mcpSearchServers')}\n aria-label={t('mcpSearchServers')}\n onChange={(event) => { onQuery(event.currentTarget.value) }}\n />\n </div>\n <div className={css.statusSeg} role=\"group\" aria-label={t('statusAll')}>\n {([\n ['all', t('statusAll'), globals.length],\n ['on', t('statusOn'), globals.length - offCount],\n ['off', t('statusOff'), offCount],\n ] as const).map(([value, label, count]) => (\n <button\n key={value}\n type=\"button\"\n className={`${css.statusSegBtn} ${status === value ? css.statusSegActive : ''}`}\n data-active={status === value || undefined}\n aria-pressed={status === value}\n onClick={() => { onStatus(value) }}\n >\n {label}\n <span className={css.statusSegCount}>{count}</span>\n </button>\n ))}\n </div>\n <span className={css.healthInline} data-tone={conn.tone} title={conn.title === '' ? undefined : conn.title}>\n {t('mcpConnStatus')} \u00B7 {conn.label}\n </span>\n <span className={css.toolbarSpacer} />\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 34, alignSelf: 'center' }}\n onClick={onRefresh}\n >\n {t('mcpLiveRefresh')}\n </button>\n {scope !== '' && (\n <button\n type=\"button\"\n className={css.newBundleBtn}\n style={{ width: 'auto', marginTop: 0, height: 34, fontSize: 12 }}\n onClick={onAddOwn}\n >\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n {t('mcpPresetAddOwn')}\n </button>\n )}\n <button\n type=\"button\"\n className={css.addBtn}\n style={{ height: 34, alignSelf: 'center' }}\n aria-label={t('mcpAddServer')}\n title={scope === '' ? undefined : t('mcpAddGlobalHint')}\n onClick={onAddCustom}\n >\n <IconPlusOutlineRegular size={15} aria-hidden=\"true\" />\n {/* \u9884\u8BBE\u8303\u56F4\u4E0B\u5199\u660E\u8FD9\u4E00\u6761\u662F\u5168\u5C40\u7684\uFF1A\u53EA\u60F3\u7ED9\u5F53\u524D\u9884\u8BBE\u7528\u8BF7\u8D70\u5DE6\u4FA7\u7684\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u3002 */}\n {scope === '' ? t('mcpAddServer') : t('mcpAddServerGlobal')}\n </button>\n </div>\n </div>\n )\n}\n\n/** ---------------------------------------------------------------- \u9884\u8BBE\u5706\u7403\uFF08\u5386\u53F2\u4FDD\u7559\u7EC4\u4EF6\uFF0C\u5F53\u524D\u9762\u677F\u7528 chips\uFF09 */\n\n/** \u7403\u5185\u6587\u5B57\uFF1A\u4E2D\u6587\u53D6\u9996\u5B57\uFF0C\u62C9\u4E01\u53D6\u9996\u5B57\u6BCD\u3002 */\nexport function ballInitial(label: string): string {\n const trimmed = label.trim()\n if (trimmed === '') return '?'\n return [...trimmed][0] ?? '?'\n}\n\n/** \u4E00\u4E2A\u9884\u8BBE\u5706\u7403\uFF08\u65E0\u5E95\u8272\uFF0C\u4EC5\u63CF\u8FB9\u8F6E\u5ED3\uFF1B\u6709\u5355\u72EC\u8BBE\u7F6E\u65F6\u53F3\u4E0B\u89D2\u70B9\u4EAE\u5C0F\u5706\u70B9\uFF09\u3002 */\nexport function PresetBall({ id, label, active, dot, title, onSelect }: {\n id: string\n label: string\n active: boolean\n dot: boolean\n title: string\n onSelect: () => void\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n className={css.presetBallWrap}\n data-active={active ? 'true' : undefined}\n aria-pressed={active}\n title={title}\n onClick={onSelect}\n >\n <span className={css.presetBall} data-dot={dot ? 'true' : undefined}>\n {id === ALL_PRESETS ? <IconAgentPresetOutlineRegular size={18} aria-hidden=\"true\" /> : ballInitial(label)}\n </span>\n <span className={css.presetBallLabel}>{label}</span>\n </button>\n )\n}\n", "/**\n * error-boundary \u2014 \u628A\u300C\u9762\u677F\u6E32\u67D3\u5D29\u6E83\u300D\u5173\u8FDB\u7B3C\u5B50\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u8981\u6709\uFF1A\u4FA7\u8FB9\u680F\u5165\u53E3\u662F `createRoot` \u6302\u51FA\u6765\u7684\u72EC\u7ACB React \u6839\uFF0CReact 18\n * \u5BF9\u6E32\u67D3\u671F\u5F02\u5E38\u7684\u9ED8\u8BA4\u5904\u7406\u662F**\u5378\u8F7D\u6574\u4E2A\u6839**\u2014\u2014\u9762\u677F\u91CC\u4E00\u4E2A\u7EC4\u4EF6\u629B\u9519\uFF0C\u5BFC\u822A\u884C\u6309\u94AE\n * \u4F1A\u8DDF\u7740\u4E00\u8D77\u6D88\u5931\uFF0C\u800C\u4E14\u4E0D\u7559\u75D5\u8FF9\uFF08\u5BBF\u4E3B DOM \u8FD8\u5728\u3001\u53EA\u662F\u7A7A\u4E86\uFF0C\u770B\u8D77\u6765\u5C31\u50CF\u300C\u69FD\u4F4D\n * \u6CA1\u4E86\u300D\uFF09\u3002`ctx.effect` \u5916\u7684 `safe()` \u53EA\u80FD\u5305\u4F4F\u540C\u6B65\u7684 apply()\uFF0C\u62E6\u4E0D\u5230\u6E32\u67D3\u671F\n * \u5F02\u5E38\u3002\n *\n * \u56E0\u6B64\u6BCF\u4E2A\u5F39\u5C42\u9762\u677F\u90FD\u8981\u5355\u72EC\u5305\u4E00\u5C42\uFF1A\u5D29\u4E86\u53EA\u6536\u8D77\u90A3\u4E00\u4E2A\u9762\u677F\uFF0C\u5BFC\u822A\u6309\u94AE\u7167\u5E38\u7559\u7740\uFF0C\n * \u540C\u65F6\u628A\u771F\u5B9E\u9519\u8BEF\u548C\u7EC4\u4EF6\u6808\u6253\u5230\u63A7\u5236\u53F0\uFF0C\u4FBF\u4E8E\u5B9A\u4F4D\u3002\n */\n\nimport { Component, type ErrorInfo, type ReactNode } from 'react'\n\n/** \u8FB9\u754C\u5C5E\u6027\u3002 */\nexport interface ErrorBoundaryProps {\n /** \u51FA\u9519\u65F6\u6253\u5728\u65E5\u5FD7\u91CC\u7684\u540D\u5B57\u3002 */\n label: string\n /** \u5D29\u6E83\u540E\u7684\u66FF\u4EE3\u5185\u5BB9\uFF08\u5BFC\u822A\u884C\u573A\u666F\u4F20 null\uFF0C\u53EA\u6536\u9762\u677F\uFF09\u3002 */\n fallback?: ReactNode\n /** \u6355\u83B7\u5230\u9519\u8BEF\u65F6\u7684\u56DE\u8C03\uFF08\u7528\u4E8E\u987A\u624B\u628A\u9762\u677F\u5173\u6389\uFF09\u3002 */\n onError?: (error: Error) => void\n children: ReactNode\n}\n\ninterface ErrorBoundaryState {\n error: Error | null\n}\n\n/** \u53EA\u515C\u6E32\u67D3/\u751F\u547D\u5468\u671F\u5F02\u5E38\u7684\u9519\u8BEF\u8FB9\u754C\uFF08\u4E0D\u515C\u4E8B\u4EF6\u56DE\u8C03\u4E0E\u5F02\u6B65\uFF09\u3002 */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n override state: ErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // \u6253\u51FA\u7EC4\u4EF6\u6808\uFF1A\u6CA1\u6709\u5B83\uFF0C\u5D29\u6E83\u53EA\u4F1A\u8868\u73B0\u4E3A\u300C\u754C\u9762\u5C11\u4E86\u4E00\u5757\u300D\uFF0C\u65E0\u4ECE\u4E0B\u624B\u3002\n console.error(`[dsh-prompt-customizer] ${this.props.label} \u6E32\u67D3\u5D29\u6E83\uFF1A`, error, info.componentStack ?? '')\n try {\n this.props.onError?.(error)\n } catch (callbackError) {\n console.error('[dsh-prompt-customizer] \u9519\u8BEF\u8FB9\u754C\u56DE\u8C03\u5931\u8D25\uFF1A', callbackError)\n }\n }\n\n override render(): ReactNode {\n if (this.state.error !== null) return this.props.fallback ?? null\n return this.props.children\n }\n}\n", "/**\n * sidebar-nav \u2014 \u4FA7\u8FB9\u680F\u5BFC\u822A\u533A\u5171\u4EAB\u6302\u8F7D\u5668\u3002\n *\n * \u5728 sidebar \u7684\u6D4F\u89C8\u533A\u5BB9\u5668\uFF08`[data-slot=\"sidebar.workspaces\"]`\uFF09\u6B63\u4E0A\u65B9\u63D2\n * \u4E00\u4E2A host\uFF0Chost \u5185\u6309\u56FA\u5B9A\u987A\u5E8F\uFF08\u5F53\u524D\u53EA\u6709 skills\uFF09\u653E `data-nav-slot` \u69FD\u4F4D\u5BB9\u5668\uFF1B\n * \u5404\u5165\u53E3\uFF08\u80FD\u529B\u5165\u53E3 React \u7EC4\u4EF6\uFF0C\u4EE5\u53CA\u5C06\u6765\u53EF\u80FD\u65B0\u589E\u7684\u5165\u53E3\uFF09\u7ECF `useNavSlot` \u8F6E\u8BE2\n * \u62FF\u5230\u81EA\u5DF1\u7684\u69FD\u4F4D\u540E `createPortal` \u8FDB\u53BB\u2014\u2014\u987A\u5E8F\u786E\u5B9A\u3001\u4E92\u4E0D\u8986\u76D6\u3001\u8DDF React \u9996\u6B21\n * \u63D0\u4EA4\u4E0D\u7ADE\u6001\u3002\n *\n * rail \u6298\u53E0\u6001\u7531 `useRail` \u89C2\u5BDF `data-shell-overlay` \u6846\u67B6\u5BB9\u5668\u7684\n * `data-sidebar-collapsed` \u5C5E\u6027\u5207\u6362\uFF0Crail \u4E0B\u5BFC\u822A\u884C\u6536\u7F29\u4E3A\u56FE\u6807\u94AE\u3002\n */\n\nimport { useEffect, useState, type MouseEvent, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { PopoverAnchor } from './popover-shell.js'\n\n/** nav host id\uFF08\u672C\u6A21\u5757\u521B\u5EFA\uFF09\u3002 */\nconst HOST_ID = 'dsh-prompt-customizer-nav-host'\n/** slots \u6E32\u67D3\u5668\u7684\u7A33\u5B9A\u951A\u70B9\uFF08SidebarRoot \u66B4\u9732\u7684 `sidebar.workspaces` slot\uFF09\u3002 */\nconst ANCHOR_SELECTOR = '[data-slot=\"sidebar.workspaces\"]'\n/** \u4FA7\u8FB9\u680F\u6298\u53E0\u89C2\u5BDF\uFF1A\u6846\u67B6\u5BB9\u5668\u9009\u62E9\u5728\u6240\u6709 sidebar \u72B6\u6001\uFF08wide/rail\uFF09\u4E0B\u90FD\u552F\u4E00\u3002 */\nconst FRAME_SELECTOR = 'div:has(> [data-shell-overlay])'\n\n/**\n * nav host \u7684\u884C\u5E03\u5C40\uFF1A\u6BCF\u4E2A\u6570\u7EC4\u5143\u7D20\u662F\u4E00\u884C\uFF0C\u884C\u5185\u6570\u7EC4\u662F\u5E76\u6392\u7684\u69FD\u4F4D\u3002\n *\n * [skills]\n *\n * \u5386\u53F2\uFF1A\u8BB0\u5FC6 / \u7528\u91CF / \u81EA\u52A8\u5316\u4E09\u4E2A\u5165\u53E3\u79FB\u9664\u540E\u53EA\u5269\u80FD\u529B\uFF08\u6280\u80FD + MCP\uFF09\u5165\u53E3\uFF0C\n * \u884C\u5185\u4E0D\u518D\u9700\u8981\u5E76\u6392\u5BB9\u5668\uFF0C\u6309\u94AE\u76F4\u63A5\u6491\u6EE1\u6574\u884C\uFF08\u4E0E\u539F\u751F\u5BFC\u822A\u884C\u540C\u6B3E\u51E0\u4F55\uFF09\u3002\n */\nconst SLOT_LAYOUT = [\n ['skills'],\n] as const\n\n/** \u69FD\u4F4D\u540D\uFF08\u5E03\u5C40\u8868\u5C55\u5E73\uFF09\u3002 */\nconst SLOT_NAMES = SLOT_LAYOUT.flat() as readonly string[]\n\n/** \u69FD\u4F4D\u540D\u3002 */\nexport type NavSlotName = (typeof SLOT_LAYOUT)[number][number]\n\n/** \u5EFA\u4E00\u4E2A\u69FD\u4F4D\u5BB9\u5668\uFF08portal \u76EE\u6807\uFF09\u3002 */\nfunction makeSlot(name: string): HTMLDivElement {\n const slot = document.createElement('div')\n slot.dataset.navSlot = name\n return slot\n}\n\nlet started = false\nlet pollTimer = 0\nlet hostObserver: MutationObserver | undefined\n\n/** \u786E\u4FDD host \u5DF2\u521B\u5EFA\u5E76\u63D2\u5230 `sidebar.workspaces` slot \u4E4B\u524D\uFF08\u5E42\u7B49\uFF09\u3002 */\nfunction ensureHostPlaced(): boolean {\n const anchor = document.querySelector(ANCHOR_SELECTOR)\n if (anchor === null) return false\n const parent = anchor.parentElement\n if (parent === null) return false\n let host = document.getElementById(HOST_ID) as HTMLDivElement | null\n if (host === null) {\n host = document.createElement('div')\n host.id = HOST_ID\n host.dataset.plugin = 'dsh-prompt-customizer'\n for (const row of SLOT_LAYOUT) {\n for (const name of row) host.appendChild(makeSlot(name))\n }\n }\n // \u5C31\u4F4D\u5224\u5B9A\uFF1Ahost \u4E0E\u951A\u70B9\u540C\u7236\u3001\u4E14\u5728\u951A\u70B9\u4E4B\u524D\u3002\n const inPlace = host.parentElement === parent\n && (anchor.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_PRECEDING) !== 0\n if (!inPlace) {\n parent.insertBefore(host, anchor)\n }\n return true\n}\n\n/**\n * \u76EF\u4F4F\u5BBF\u4E3B\u7684\u76F4\u63A5\u7236\u8282\u70B9\uFF0C\u5BBF\u4E3B\u4E00\u88AB\u6458\u6389\u7ACB\u523B\u8865\u4F4D\u3002\n *\n * host \u662F\u6211\u4EEC\u624B\u5DE5 `insertBefore` \u8FDB DSH \u81EA\u6709 React \u6811\u7684\u88F8\u8282\u70B9\u2014\u2014React \u4E0D\u8BA4\u8BC6\n * \u5B83\uFF0C\u4FA7\u8FB9\u680F\u4EFB\u4F55\u4E00\u6B21 children \u91CD\u6392\u90FD\u53EF\u80FD\u628A\u5B83\u56DE\u6536\u6389\u3002\u53EA\u9760 1.5s \u8F6E\u8BE2\u4F1A\u7559\u4E0B\n * \u6700\u957F 1.5s \u7684\u7A7A\u7A97\uFF08\u89C6\u89C9\u4E0A\u5C31\u662F\u5165\u53E3\u95EA\u4E00\u4E0B\u518D\u56DE\u6765\uFF09\u3002\u8FD9\u91CC\u53EA\u89C2\u5BDF\u7236\u8282\u70B9\u7684\n * childList\uFF08\u4E0D\u5F00 subtree\uFF09\uFF1A\u4FA7\u8FB9\u680F\u81EA\u8EAB\u7684 DOM \u53D8\u52A8\u9891\u7387\u5F88\u4F4E\uFF0C\u800C\u5F39\u5C42\u9762\u677F\u5DF2\u7ECF\n * portal \u5230 body\uFF0C\u4E0D\u4F1A\u5728\u8FD9\u91CC\u4EA7\u751F\u566A\u97F3\u3002\n *\n * \u6536\u655B\u6027\uFF1A\u8865\u4F4D\u540E host \u5DF2\u5C31\u4F4D\uFF0C`ensureHostPlaced` \u4E0D\u518D\u6539\u52A8 DOM\uFF0C\u4E0D\u4F1A\u81EA\u6FC0\u3002\n * \u7236\u8282\u70B9\u6574\u4F53\u88AB\u66FF\u6362\u65F6\u89C2\u5BDF\u4F1A\u5931\u8054\uFF0C\u7531\u8F6E\u8BE2\u515C\u5E95\u91CD\u6302\u3002\n */\nfunction watchHostParent(): void {\n const parent = document.getElementById(HOST_ID)?.parentElement\n if (parent === undefined) return\n hostObserver?.disconnect()\n hostObserver = new MutationObserver(() => {\n const before = document.getElementById(HOST_ID)?.parentElement\n ensureHostPlaced()\n if (document.getElementById(HOST_ID)?.parentElement !== before) watchHostParent()\n })\n hostObserver.observe(parent, { childList: true })\n}\n\n/**\n * \u6302\u8F7D\u5BFC\u822A\u533A host\uFF08\u5E42\u7B49\u5355\u4F8B\uFF09\u3002\u9996\u6B21\u8C03\u7528\u8005\u6301\u6709\u6E05\u7406\u6743\uFF08\u505C\u8F6E\u8BE2\u3001\u79FB\u9664 host\uFF09\uFF0C\n * \u540E\u7EED\u8C03\u7528\u8FD4\u56DE no-op\u3002\n */\nexport function ensureNavMount(): () => void {\n if (typeof document === 'undefined') return () => {}\n if (started) return () => {}\n started = true\n ensureHostPlaced()\n watchHostParent()\n // \u4F4E\u9891\u8F6E\u8BE2\u515C\u5E95\uFF1A\u4FA7\u8FB9\u680F\u5BB9\u5668\u6574\u4F53\u88AB\u66FF\u6362\uFF08\u89C2\u5BDF\u5931\u8054\uFF09\u65F6\u91CD\u6302\uFF08HMR\u3001React \u91CD\u5EFA\u7B49\uFF09\u3002\n pollTimer = window.setInterval(() => {\n ensureHostPlaced()\n if (hostObserver === undefined) watchHostParent()\n }, 1500)\n return () => {\n window.clearInterval(pollTimer)\n pollTimer = 0\n hostObserver?.disconnect()\n hostObserver = undefined\n started = false\n document.getElementById(HOST_ID)?.remove()\n }\n}\n\n/** \u8F6E\u8BE2\u83B7\u53D6\u6307\u5B9A\u69FD\u4F4D\u5BB9\u5668\uFF08\u672A\u5C31\u4F4D\u65F6\u8FD4\u56DE null\uFF0C\u7EC4\u4EF6\u636E\u6B64\u6682\u4E0D\u6E32\u67D3\uFF09\u3002\n *\n * \u69FD\u4F4D\u76F4\u63A5\u6302\u5728 nav host \u4E0B\uFF0C\u56E0\u6B64\u5168\u5C40\u6309 data-nav-slot \u67E5\u627E\u2014\u2014\u69FD\u4F4D\u540D\u7531\u672C\u6A21\u5757\n * \u7EDF\u4E00\u521B\u5EFA\uFF0C\u552F\u4E00\u3002\n *\n * **\u6C38\u4E0D\u505C\u6B62**\uFF1A\u672A\u5C31\u4F4D\u65F6 100ms \u9636\u68AF\u5FEB\u67E5\uFF0810 \u6B21\u540E\u9000 400ms\uFF09\uFF1B\u627E\u5230\u540E\u9000\u5316\u4E3A\n * 800ms \u6162\u901F\u6821\u9A8C\u2014\u2014\u540C\u4E00\u8282\u70B9 setSlot \u88AB React \u76F4\u63A5\u8DF3\u8FC7\uFF0C\u96F6\u6E32\u67D3\u5F00\u9500\u3002\u8FD9\u6837\n * \u69FD\u4F4D\u4E00\u65E6\u88AB\u79FB\u9664/\u66FF\u6362\uFF08HMR\u3001React \u91CD\u5EFA host\u3001\u7ADE\u6001\u6E05\u7A7A\u7B49\uFF09\uFF0Cportal \u4F1A\u81EA\u52A8\n * \u8FC1\u5230\u65B0\u69FD\uFF1B\u5426\u5219\u4F1A\u6525\u7740\u6E38\u79BB\u7684\u65E7\u69FD\u5F15\u7528\u628A\u5165\u53E3\u300C\u5F04\u4E22\u300D\u4E14\u4E0D\u518D\u6062\u590D\u3002\n */\nexport function useNavSlot(name: NavSlotName): HTMLElement | null {\n const [slot, setSlot] = useState<HTMLElement | null>(null)\n useEffect(() => {\n let timer = 0\n let tries = 0\n const poll = (): void => {\n const found = document.querySelector<HTMLElement>(`[data-nav-slot='${name}']`)\n if (found !== null) tries = 0\n else tries += 1\n setSlot(found)\n timer = window.setTimeout(poll, found !== null ? 800 : tries <= 10 ? 100 : 400)\n }\n poll()\n return () => { window.clearTimeout(timer) }\n }, [name])\n return slot\n}\n\n/** \u4FA7\u8FB9\u680F\u6298\u53E0\u6001\uFF08rail = \u53EA\u663E\u793A\u56FE\u6807\uFF09\u3002\n *\n * \u89C2\u5BDF\u6302\u5728 body \u5B50\u6811\u4E0A\uFF08attributeFilter \u9650\u5B9A data-sidebar-collapsed\uFF09\uFF1A\n * \u6846\u67B6\u5BB9\u5668\u53EF\u80FD\u5728\u6298\u53E0\u65F6\u88AB React \u91CD\u6302\uFF0C\u76EF\u5355\u8282\u70B9\u4F1A\u5931\u8054\uFF1Bbody \u7EA7\u89C2\u5BDF + \u4F4E\u9891\n * \u515C\u5E95\u91CD\u8BFB\u5BF9\u300C\u6846\u67B6\u8FDF\u5230 / \u8282\u70B9\u66FF\u6362 / \u5C5E\u6027\u65F6\u5E8F\u300D\u90FD\u514D\u75AB\u3002\u503C\u4E0D\u53D8\u65F6 React \u81EA\u52A8\n * \u8DF3\u8FC7\u6E32\u67D3\uFF0C\u8F6E\u8BE2\u65E0\u989D\u5916\u5F00\u9500\u3002\n */\nexport function useRail(): boolean {\n const [rail, setRail] = useState(() =>\n document.querySelector(FRAME_SELECTOR)?.hasAttribute('data-sidebar-collapsed') ?? false)\n useEffect(() => {\n const read = (): void => {\n setRail(document.querySelector(FRAME_SELECTOR)?.hasAttribute('data-sidebar-collapsed') ?? false)\n }\n read()\n const observer = new MutationObserver(read)\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-sidebar-collapsed'], subtree: true })\n const timer = window.setInterval(read, 1500)\n return () => {\n observer.disconnect()\n window.clearInterval(timer)\n }\n }, [])\n return rail\n}\n\nconst STYLE_ID = 'dsh-prompt-customizer-nav-styles'\n\nconst SHEET = `\n/* \u5BFC\u822A\u884C\uFF1A\u4E0E\u539F\u751F\u5BFC\u822A\u884C\u540C\u6B3E\u51E0\u4F55\uFF08\u900F\u660E\u5E95 + hover \u9AD8\u4EAE + \u6587\u5B57\u7701\u7565\uFF09 */\n.dsh-nav-btn{position:relative;display:flex;align-items:center;gap:8px;width:calc(100% - 4px);height:34px;padding:0 10px;margin:0 2px 4px;box-sizing:border-box;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-primary,#eee);font-size:14px;line-height:20px;font-family:inherit;cursor:pointer;text-align:left;user-select:none;overflow:hidden;transition:background 120ms ease}\n.dsh-nav-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.dsh-nav-btn[data-open='true']{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.dsh-nav-btn>svg{flex:none;color:var(--dsw-alias-label-secondary,#bbb)}\n.dsh-nav-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n/* \u6298\u53E0 rail \u6001\uFF1A\u53EA\u7559\u56FE\u6807 */\n.dsh-nav-btn[data-rail='true']{width:36px;height:36px;padding:0;margin:0 0 8px;justify-content:center;border-radius:8px}\n/* nav host\uFF1A\u5404\u884C\u7EB5\u5411\u5806\u53E0\uFF1B\u69FD\u4F4D display:contents\uFF0C\u6309\u94AE\u76F4\u63A5\u6491\u6EE1\u6574\u884C\u3002 */\n#dsh-prompt-customizer-nav-host{display:flex;flex-direction:column;align-items:stretch;width:100%}\n#dsh-prompt-customizer-nav-host>[data-nav-slot]{display:contents}\n`\n\n/** \u6CE8\u5165\u5BFC\u822A\u884C\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureNavStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** NavButton \u5C5E\u6027\u3002 */\nexport interface NavButtonProps {\n /** \u884C\u56FE\u6807\uFF08svg \u5143\u7D20\uFF0C\u989C\u8272\u7531\u6837\u5F0F\u8868\u7EDF\u4E00\u7740\u8272\uFF09\u3002 */\n icon: ReactNode\n /** \u884C\u6587\u5B57\uFF08rail \u6001\u4E0D\u6E32\u67D3\uFF09\u3002 */\n label: string\n /** \u6298\u53E0\u6001\uFF08\u53EA\u7559\u56FE\u6807\uFF09\u3002 */\n rail?: boolean\n /** \u9762\u677F\u5C55\u5F00\u6001\uFF08\u9AD8\u4EAE\u5E95\u8272\uFF09\u3002 */\n expanded?: boolean\n /** \u65E0\u969C\u788D\u540D\uFF08\u7F3A\u7701\u7528 label\uFF09\u3002 */\n ariaLabel?: string\n /** \u60AC\u505C\uFF1A\u6ED1\u51FA\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF09\u3002 */\n onMouseEnter?: (e: MouseEvent<HTMLButtonElement>) => void\n /** \u79FB\u51FA\u6309\u94AE\uFF1A\u542F\u52A8\u81EA\u52A8\u6536\u56DE\u8BA1\u65F6\uFF08hover \u6A21\u5F0F\uFF09\u3002 */\n onMouseLeave?: () => void\n /** \u70B9\u51FB\uFF08hover \u6A21\u5F0F = \u5207\u6362\u9489\u4F4F\uFF09\u3002 */\n onClick: (e: MouseEvent<HTMLButtonElement>) => void\n}\n\n/** \u6E32\u67D3\u4E00\u6761\u5BFC\u822A\u884C\u6309\u94AE\uFF08\u4E0E auto-nav \u540C\u6B3E\u89C2\u611F\uFF09\u3002 */\nexport function NavButton({\n icon, label, rail = false, expanded = false, ariaLabel,\n onMouseEnter, onMouseLeave, onClick,\n}: NavButtonProps): JSX.Element {\n return (\n <button\n type=\"button\"\n className=\"dsh-nav-btn\"\n data-rail={rail || undefined}\n data-open={expanded || undefined}\n aria-label={ariaLabel ?? label}\n aria-expanded={expanded}\n title={rail ? (ariaLabel ?? label) : undefined}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n >\n {icon}\n {!rail && <span className=\"dsh-nav-label\">{label}</span>}\n </button>\n )\n}\n\n/** \u4FBF\u6377\u7EC4\u5408\uFF1Aportal \u5230\u6307\u5B9A\u69FD\u4F4D\uFF08slot \u672A\u5C31\u4F4D\u65F6\u4E0D\u6E32\u67D3\uFF09\u3002 */\nexport function NavPortal({ name, children }: { name: NavSlotName; children: ReactNode }): JSX.Element | null {\n const slot = useNavSlot(name)\n if (slot === null) return null\n return createPortal(children, slot)\n}\n\n/** \u9762\u677F\u4E92\u65A5 + \u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\uFF1A\u5165\u53E3\u5171\u7528\u7684\u9762\u677F\u884C\u4E3A hook\u3002\n *\n * - \u4E92\u65A5\uFF1A\u4EFB\u4E00\u9762\u677F\u6253\u5F00\u65F6\u5E7F\u64AD\uFF0C\u5176\u4F59\u5DF2\u6253\u5F00\u7684\u9762\u677F\u81EA\u52A8\u6536\u56DE\uFF08\u591A\u4E2A\u5165\u53E3\u540C\u65F6\u53EA\u5360\u4F4F\n * \u4E00\u4E2A\u4E3B\u533A\uFF0C\u4E0D\u53E0\u7F57\u6C49\uFF1B\u5F53\u524D\u53EA\u6709\u300C\u80FD\u529B\u300D\u4E00\u4E2A\u5165\u53E3\uFF0C\u5E7F\u64AD\u540C\u65F6\u662F\u65B0\u589E\u5165\u53E3\u7684\u63A5\u7F1D\uFF09\uFF1B\n * - \u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\uFF1A\u9762\u677F\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\u3001\u65E0\u906E\u7F69\uFF0C\u4FA7\u680F\u4FDD\u6301\u53EF\u70B9\uFF1B\u4FA7\u680F\u4F1A\u8BDD\u533A\u5185\n * \u7684\u70B9\u51FB\uFF08\u4F1A\u8BDD\u884C/\u65B0\u4F1A\u8BDD/\u8BBE\u7F6E\u7B49\uFF0C\u81EA\u5DF1\u5BFC\u822A\u884C\u4E0E\u9762\u677F\u5185\u90E8\u9664\u5916\uFF09\u76F4\u63A5\u6536\u9762\u677F\uFF0C\n * \u8DDF\u300C\u70B9\u4F1A\u8BDD\u56DE\u5230\u4F1A\u8BDD\u300D\u7684\u76F4\u89C9\u4E00\u81F4\u3002\n */\nexport type TriadPanelName = 'skills'\n\nconst PANEL_OPEN_EVENT = 'dsh-prompt-customizer:panel-open'\n\n/** \u70B9\u51FB\u662F\u5426\u843D\u5728\u4FA7\u680F\u5217\u5185\uFF08\u6309\u51E0\u4F55\u5224\u5B9A\uFF0C\u4E0D\u4F9D\u8D56\u5BBF\u4E3B\u7684\u54C8\u5E0C\u7C7B\u540D\uFF09\u3002\n *\n * \u8BA4\u300C\u53C8\u9AD8\u53C8\u7A84\u3001\u8D34\u5DE6\u300D\u7684\u5217\u5BB9\u5668\uFF1A\u6574\u9875\u7EA7\u7956\u5148\uFF08frame/root\uFF0C\u5BBD\u5360\u6EE1\u89C6\u53E3\uFF09\u4E0D\u7B97\uFF0C\n * \u5426\u5219\u4E3B\u533A\u70B9\u51FB\u987A\u7740\u5192\u6CE1\u94FE\u4E5F\u4F1A\u8BEF\u5224\u6210\u4FA7\u680F\u3002 */\nfunction clickInSidebar(target: Element): boolean {\n let node: Element | null = target\n while (node !== null && node !== document.body) {\n const rect = node.getBoundingClientRect()\n if (\n rect.height >= window.innerHeight * 0.7\n && rect.left <= 8\n && rect.right <= window.innerWidth * 0.6\n ) return true\n node = node.parentElement\n }\n return false\n}\n\nexport function usePanelAutoClose(name: TriadPanelName, open: boolean, requestClose: () => void): void {\n // \u6253\u5F00\u65F6\u5E7F\u64AD\uFF0C\u6324\u6389\u522B\u7684\u9762\u677F\u3002\n useEffect(() => {\n if (!open) return\n window.dispatchEvent(new CustomEvent(PANEL_OPEN_EVENT, { detail: name }))\n }, [open, name])\n // \u542C\u522B\u4EBA\u7684\u5E7F\u64AD + \u4FA7\u680F\u4F1A\u8BDD\u533A\u70B9\u51FB\u3002\n useEffect(() => {\n if (!open) return undefined\n const onSiblingOpen = (event: Event): void => {\n if ((event as CustomEvent<TriadPanelName>).detail !== name) requestClose()\n }\n const onDocClick = (event: globalThis.MouseEvent): void => {\n const target = event.target\n if (!(target instanceof Element)) return\n // \u81EA\u5DF1\u5BFC\u822A\u884C\u3001\u9762\u677F\u672C\u4F53\uFF08\u542B\u9762\u677F\u5185\u5F39\u5230 body \u7684\u4E8C\u7EA7\u5F39\u7A97\uFF09\u4E0D\u6536\u3002\n if (target.closest(`#${HOST_ID}, .psh-card`) !== null) return\n if (clickInSidebar(target)) requestClose()\n }\n window.addEventListener(PANEL_OPEN_EVENT, onSiblingOpen)\n document.addEventListener('click', onDocClick, true)\n return () => {\n window.removeEventListener(PANEL_OPEN_EVENT, onSiblingOpen)\n document.removeEventListener('click', onDocClick, true)\n }\n }, [open, name, requestClose])\n}\n\n/** \u300C\u5BFC\u822A\u884C\u53F3\u7F18\u300D\u6ED1\u51FA\u951A\u70B9\uFF08\u517C\u5BB9\u4FDD\u7559\uFF1A\u53F3\u4FA7\u62BD\u5C49\u4E0D\u518D\u8DDF\u968F\u6309\u94AE\u5B9A\u4F4D\uFF09\u3002\n *\n * \u53D6\u6309\u94AE\u6240\u5728\u884C\u5BB9\u5668\uFF08dsh-prompt-customizer \u7684 nav host\uFF09\u7684\u53F3\u7F18 +8 \u4F5C\u6C34\u5E73\u4F4D\uFF1Btop \u53D6\u6309\u94AE\n * \u9876\u7F18 -6\u3002nav host \u662F\u7EDF\u4E00\u7684\u884C\u5BB9\u5668\uFF0C\u4E09\u4E2A\u5165\u53E3\u5171\u7528\u3002 */\nexport function navAnchorFrom(el: Element | null): PopoverAnchor | null {\n if (el === null) return null\n const row = el.closest(`#${HOST_ID}`)\n if (row === null) return null\n const rowRect = row.getBoundingClientRect()\n const btnRect = el.getBoundingClientRect()\n return { left: Math.round(rowRect.right + 8), top: Math.round(btnRect.top - 6) }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,eAAAA;AAAA,EAAA;AAAA;AAAA;;;ACMA,IAAAC,iBAAyB;AACzB,oBAA2B;;;ACG3B,IAAAC,iBAAgG;AAChG,IAAAC,oCAEO;;;ACEP,IAAAC,gBAAwE;AACxE,uBAA6B;;;ACJ7B,mBAA0E;AAGnE,IAAM,gBAAgB;AAG7B,IAAM,WAAW;AAEjB,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAqCwC,aAAa;AAAA,wDACX,aAAa;AAAA,oDACjB,aAAa;AAAA,sDACX,aAAa;AAAA,wDACX,aAAa;AAAA,0DACX,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAQtC,aAAa;AAAA;AAAA;AAAA,oDAGM,aAAa;AAAA,sDACX,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU5D,SAAS,wBAA8B;AAC5C,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAe,QAAQ,MAAM,KAAM;AAChD,QAAM,MAAM,SAAS,cAAc,OAAO;AAC1C,MAAI,KAAK;AACT,MAAI,cAAc;AAClB,WAAS,KAAK,YAAY,GAAG;AAC/B;AAGO,SAAS,eAAe,SAA0B;AACvD,SAAO,UAAU,wBAAwB;AAC3C;AAQO,SAAS,qBAAqB,SAA0B;AAC7D,SAAO,UAAU,yBAAyB;AAC5C;AAGO,SAAS,mBAAmB,SAA0B;AAC3D,SAAO,UAAU,uBAAuB;AAC1C;AAGO,IAAM,oBAAoB;AAO1B,SAAS,cAAc,MAAe,SAAqB,aAAa,eAA+D;AAC5I,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,eAAW,qBAAsB,IAAI;AAC3C,QAAM,iBAAa,qBAAO,KAAK;AAG/B,oCAAgB,MAAM;AACpB,QAAI,MAAM;AACR,iBAAW,UAAU;AACrB,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,mBAAe,0BAAY,MAAM;AACrC,QAAI,WAAW,QAAS;AACxB,eAAW,UAAU;AACrB,eAAW,IAAI;AACf,aAAS,UAAU,OAAO,WAAW,MAAM;AACzC,cAAQ;AAAA,IACV,GAAG,UAAU;AAAA,EACf,GAAG,CAAC,SAAS,UAAU,CAAC;AAExB,8BAAU,MAAM,MAAM;AACpB,QAAI,SAAS,YAAY,KAAM,QAAO,aAAa,SAAS,OAAO;AAAA,EACrE,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,SAAS,aAAa;AACjC;;;ADuDI;AAxLJ,IAAMC,YAAW;AAGjB,IAAM,qBAAqB;AAE3B,IAAM,YAAY;AAGlB,SAAS,eAAuB;AAC9B,MAAI;AACF,UAAM,OAAO,SAAS,eAAe,gCAAgC;AACrE,QAAI,SAAS,MAAM;AACjB,YAAM,YAAY,KAAK,sBAAsB,EAAE;AAC/C,UAAI,OAAO,KAAK;AAChB,aAAO,SAAS,QAAQ,SAAS,SAAS,MAAM;AAC9C,cAAM,OAAO,KAAK,sBAAsB;AACxC,YAAI,KAAK,UAAU,OAAO,cAAc,OAAO,KAAK,QAAQ,KAAK,KAAK,SAAS,YAAY,GAAG;AAC5F,iBAAO,KAAK,MAAM,KAAK,KAAK;AAAA,QAC9B;AACA,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAAkB;AAC1B,SAAO;AACT;AAEA,IAAMC,SAAQ;AAAA;AAAA;AAAA,wDAG0C,aAAa;AAAA,0DACX,aAAa;AAAA;AAAA,0VAEmR,aAAa,sCAAsC,aAAa;AAAA;AAAA,kPAExK,aAAa;AAAA;AAAA;AAAA;AAAA,8EAIjL,aAAa;AAAA,gFACX,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4EAcjB,aAAa;AAAA,8EACX,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCpF,SAAS,oBAA0B;AACxC,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAeD,SAAQ,MAAM,KAAM;AAChD,QAAM,MAAM,SAAS,cAAc,OAAO;AAC1C,MAAI,KAAKA;AACT,MAAI,QAAQ,SAAS;AACrB,MAAI,cAAcC;AAClB,WAAS,KAAK,YAAY,GAAG;AAC/B;AA0CO,SAAS,aAAa;AAAA,EAC3B;AAAA,EAAS;AAAA,EAAS,QAAQ;AAAA,EAAK;AAAA,EAAM;AAAA,EAAkB;AAAA,EAAkB;AAAA,EAAW,QAAQ;AAAA,EAAO;AACrG,GAAmC;AAEjC,QAAM,CAAC,IAAI,KAAK,QAAI,wBAAS,OAAO,UAAU;AAC9C,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,YAAY;AACrD,+BAAU,MAAM;AACd,UAAM,SAAS,MAAY;AACzB,YAAM,OAAO,UAAU;AACvB,kBAAY,aAAa,CAAC;AAAA,IAC5B;AACA,WAAO;AACP,WAAO,iBAAiB,UAAU,MAAM;AACxC,UAAM,WAAW,IAAI,iBAAiB,MAAM;AAC5C,aAAS,QAAQ,SAAS,MAAM,EAAE,YAAY,MAAM,iBAAiB,CAAC,wBAAwB,GAAG,SAAS,KAAK,CAAC;AAChH,UAAM,QAAQ,OAAO,YAAY,QAAQ,IAAI;AAC7C,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,MAAM;AAC3C,eAAS,WAAW;AACpB,aAAO,cAAc,KAAK;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AACL,QAAM,MAAM,SAAS;AACrB,QAAM,OAAO,UAAU,QAAQ;AAE/B,QAAM,SAAS,KAAK;AACpB,QAAM,OAAO,SAAS,UAAU;AAChC,QAAM,QAAmC,SAAS,SAAY,EAAE,MAAM,SAAS;AAE/E,+BAAU,MAAM;AACd,QAAI,QAAS,QAAO;AACpB,UAAM,QAAQ,CAAC,UAA+B;AAC5C,UAAI,MAAM,QAAQ,SAAU,SAAQ;AAAA,IACtC;AACA,aAAS,iBAAiB,WAAW,KAAK;AAC1C,WAAO,MAAM;AAAE,eAAS,oBAAoB,WAAW,KAAK;AAAA,IAAE;AAAA,EAChE,GAAG,CAAC,SAAS,OAAO,CAAC;AAOrB,aAAO;AAAA,IACL,4EACG;AAAA,gBACC,4CAAC,SAAI,WAAU,YAAW,aAAW,MAAM,eAAY,QAAO,SAAS,SAAS;AAAA,MAElF;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,YAAY,qBAAqB,OAAO,CAAC;AAAA,UACpD,aAAW;AAAA,UACX,aAAW;AAAA,UACX,cAAY,QAAQ,KAAK;AAAA,UACzB;AAAA,UACA,MAAK;AAAA,UACL,cAAW;AAAA,UACX,cAAY;AAAA,UACZ,cAAc;AAAA,UACd,cAAc;AAAA,UAEb;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAwBO,SAAS,QAAQ,EAAE,UAAU,UAAU,GAA6D;AACzG,SAAO,4CAAC,SAAI,WAAW,cAAc,UAAa,cAAc,KAAK,YAAY,SAAS,KAAK,YAAa,UAAS;AACvH;;;AE5OA,IAAAC,gBAAqH;AACrH,sCAA8C;;;ACTvC,IAAM,MAAM;AAAA,EACjB,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EAEP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,eAAe;AAAA,EACf,UAAU;AAAA,EACV,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,OAAO;AAAA,EACP,WAAW;AAAA,EACX,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAEZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA;AAAA,EAEV,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA;AAAA,EAEb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,KAAK;AAAA,EACL,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB;AAAA;AAAA,EAElB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAEd,UAAU;AAAA,EACV,SAAS;AAAA,EACT,eAAe;AAAA,EACf,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA;AAAA,EAER,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AAAA,EACV,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA,EACX,cAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,SAAS;AAAA;AAAA,EAET,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA;AAAA,EAEf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,UAAU;AAAA;AAAA,EAEV,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAU;AAAA;AAAA,EAEV,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,gBAAgB;AAAA;AAAA,EAEhB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cAAc;AAAA;AAAA,EAEd,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa;AAAA;AAAA,EAEb,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,WAAW;AACb;AAEO,IAAMC,YAAW;AACjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2sBd,SAAS,eAAe;AAC7B,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAeD,SAAQ,MAAM,KAAM;AAChD,QAAM,MAAM,SAAS,cAAc,OAAO;AAC1C,MAAI,KAAKA;AACT,MAAI,cAAcC;AAClB,WAAS,KAAK,YAAY,GAAG;AAC/B;;;ACxkCA,IAAM,OAAO;AAQN,SAAS,YAAY,OAA2B;AACrD,QAAM,QAAQ,MAAM,cAAc;AAClC,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,MAAM,KAAK,KAAK,EAAE,SAAS,IAAI;AACxC;AAEA,IAAI,UAA8B;AAClC,IAAI,YAAwE;AAGrE,SAAS,UAAU,OAAuB,SAA4B;AAC3E,YAAU;AACV,MAAI;AACF,UAAM,aAAa,QAAQ,MAAM,KAAK,UAAU,OAAO,CAAC;AACxD,UAAM,aAAa,QAAQ,cAAc,QAAQ,IAAI;AACrD,UAAM,aAAa,gBAAgB;AAAA,EACrC,QAAQ;AAAA,EAA6B;AACvC;AAGO,SAAS,aAAmB;AACjC,YAAU;AACZ;AAGO,SAAS,UAAU,OAA2C;AACnE,MAAI;AACF,UAAM,MAAM,MAAM,aAAa,QAAQ,IAAI;AAC3C,QAAI,QAAQ,GAAI,QAAO,KAAK,MAAM,GAAG;AAAA,EACvC,QAAQ;AAAA,EAAkB;AAC1B,SAAO;AACT;AAGO,SAAS,YAAY,OAAuB,MAAyB;AAC1E,QAAM,UAAU,UAAU,KAAK;AAC/B,SAAO,YAAY,QAAQ,QAAQ,SAAS;AAC9C;AAGO,SAAS,oBAAoB,MAAwE;AAC1G,cAAY;AACd;AAGO,SAAS,YAAY,KAAmB,SAAmC;AAChF,MAAI,YAAY,KAAM;AACtB,cAAY,KAAK,OAAO;AAC1B;;;ACvFO,IAAM,KAAK,MAAM;AACtB,QAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,SAAS;AACrD,SAAO;AAAA;AAAA,IAEL,OAAO,EAAE,QAAQ,QAAQ,SAAS,QAAQ,eAAe,UAAU,YAAY,WAAW,UAAU,IAAI,YAAY,KAAK,WAAW,EAAE;AAAA,IACtI,MAAM,EAAE,GAAG,MAAM,KAAK,IAAI,SAAS,iBAAiB,UAAU,QAAQ,cAAc,kCAAkC;AAAA,IACtH,WAAW,EAAE,GAAG,MAAM,KAAK,GAAG,UAAU,IAAI,YAAY,KAAK,YAAY,SAAS;AAAA,IAClF,KAAK,EAAE,GAAG,MAAM,KAAK,GAAG,SAAS,GAAG,QAAQ,mCAAmC,cAAc,EAAE;AAAA,IAC/F,QAAQ,EAAE,SAAS,YAAY,QAAQ,QAAQ,cAAc,GAAG,YAAY,eAAe,QAAQ,WAAW,OAAO,WAAW,SAAS,MAAM,UAAU,IAAI,YAAY,SAAS;AAAA,IAClL,cAAc,EAAE,SAAS,YAAY,QAAQ,QAAQ,cAAc,GAAG,YAAY,wBAAwB,QAAQ,WAAW,OAAO,WAAW,YAAY,KAAK,UAAU,IAAI,YAAY,SAAS;AAAA;AAAA,IAEnM,YAAY,EAAE,SAAS,YAAY,QAAQ,QAAQ,cAAc,GAAG,YAAY,wBAAwB,SAAS,mCAAmC,eAAe,GAAG,QAAQ,WAAW,OAAO,WAAW,UAAU,IAAI,YAAY,SAAS;AAAA,IAC9O,kBAAkB,EAAE,SAAS,YAAY,QAAQ,QAAQ,cAAc,GAAG,YAAY,uBAAuB,SAAS,kCAAkC,eAAe,GAAG,QAAQ,WAAW,OAAO,WAAW,YAAY,KAAK,UAAU,IAAI,YAAY,SAAS;AAAA,IACnQ,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;AAAA,IAC7B,aAAa,EAAE,GAAG,MAAM,KAAK,GAAG,YAAY,OAAO;AAAA,IACnD,SAAS,EAAE,SAAS,eAAe,YAAY,UAAU,gBAAgB,UAAU,OAAO,IAAI,QAAQ,IAAI,QAAQ,QAAQ,cAAc,GAAG,YAAY,eAAe,QAAQ,WAAW,OAAO,WAAW,SAAS,KAAK;AAAA;AAAA;AAAA,IAGzN,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,QAAQ,YAAY,UAAU;AAAA,IACtE,SAAS,EAAE,OAAO,KAAK,MAAM,QAAQ,SAAS,QAAQ,eAAe,UAAU,WAAW,GAAG,aAAa,mCAAmC,WAAW,aAAa;AAAA,IACrK,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,QAAQ,SAAS,YAAY;AAAA,IAC5E,SAAS,EAAE,MAAM,QAAQ,GAAG,MAAM,KAAK,GAAG,SAAS,YAAY,WAAW,mCAAmC,UAAU,OAAO;AAAA,IAC9H,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,QAAQ,eAAe,UAAU,WAAW,EAAE;AAAA,IACzF,gBAAgB,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,QAAQ,SAAS,YAAY;AAAA,IACjF,WAAW,EAAE,GAAG,MAAM,KAAK,GAAG,cAAc,GAAG,OAAO,yBAAyB,UAAU,IAAI,YAAY,IAAI;AAAA;AAAA,IAE7G,MAAM,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE;AAAA,IACzD,KAAK,EAAE,GAAG,MAAM,KAAK,GAAG,SAAS,WAAW,QAAQ,kCAAkC,cAAc,GAAG,YAAY,wBAAwB;AAAA,IAC3I,YAAY,EAAE,GAAG,MAAM,KAAK,GAAG,UAAU,GAAG;AAAA,IAC5C,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;AAAA,IAChC,UAAU,EAAE,GAAG,MAAM,KAAK,GAAG,YAAY,YAAY,UAAU,OAAO;AAAA,IACtE,MAAM,EAAE,YAAY,aAAa,UAAU,IAAI,WAAW,YAAY;AAAA,IACtE,UAAU,EAAE,OAAO,wBAAwB,UAAU,GAAG;AAAA,IACxD,SAAS,EAAE,OAAO,yBAAyB,UAAU,IAAI,UAAU,UAAU,cAAc,YAAY,YAAY,SAAS;AAAA,IAC5H,aAAa,EAAE,YAAY,aAAa,UAAU,IAAI,YAAY,KAAK,YAAY,YAAY,WAAW,cAAc,MAAM,GAAG,WAAW,GAAG,WAAW,QAAQ,SAAS,IAAI,QAAQ,kCAAkC,cAAc,GAAG,YAAY,mBAAmB,QAAQ,EAAE;AAAA,IACnR,UAAU,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,EAAE;AAAA,IACtD,UAAU,EAAE,YAAY,aAAa,UAAU,IAAI,OAAO,yBAAyB,QAAQ,kCAAkC,cAAc,GAAG,SAAS,WAAW,QAAQ,OAAO;AAAA,IACjL,SAAS,EAAE,OAAO,WAAW,UAAU,IAAI,QAAQ,gCAAgC,cAAc,KAAK,SAAS,QAAQ;AAAA,IACvH,cAAc,EAAE,OAAO,WAAW,UAAU,IAAI,QAAQ,gCAAgC,cAAc,KAAK,SAAS,QAAQ;AAAA,IAC5H,eAAe,EAAE,OAAO,WAAW,UAAU,IAAI,QAAQ,iCAAiC,cAAc,KAAK,SAAS,QAAQ;AAAA,IAC9H,aAAa,EAAE,OAAO,WAAW,UAAU,IAAI,QAAQ,iCAAiC,cAAc,KAAK,SAAS,QAAQ;AAAA,IAC5H,aAAa,EAAE,OAAO,yBAAyB,UAAU,IAAI,QAAQ,kCAAkC,cAAc,KAAK,SAAS,QAAQ;AAAA,IAC3I,MAAM,EAAE,SAAS,WAAW,QAAQ,mCAAmC,cAAc,GAAG,YAAY,eAAe,QAAQ,WAAW,OAAO,WAAW,YAAY,SAAS;AAAA,IAC7K,UAAU,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE;AAAA,IAC7D,OAAO,EAAE,SAAS,SAAS,QAAQ,kCAAkC,cAAc,GAAG,YAAY,eAAe,QAAQ,WAAW,OAAO,WAAW,UAAU,IAAI,YAAY,KAAK,SAAS,IAAI;AAAA,IAClM,YAAY,EAAE,SAAS,KAAK;AAAA;AAAA,IAE5B,YAAY,EAAE,MAAM,QAAQ,QAAQ,QAAQ,OAAO,yBAAyB,UAAU,IAAI,YAAY,GAAG,YAAY,QAAQ,SAAS,QAAQ;AAAA,IAC9I,UAAU,EAAE,SAAS,IAAI;AAAA,IACzB,WAAW,EAAE,WAAW,0BAA0B;AAAA,IAClD,WAAW,EAAE,WAAW,2BAA2B;AAAA,IACnD,UAAU,EAAE,SAAS,mCAAmC,eAAe,IAAI,cAAc,EAAE;AAAA,IAC3F,gBAAgB,EAAE,SAAS,kCAAkC,eAAe,IAAI,cAAc,GAAG,YAAY,uBAAuB;AAAA,IACpI,WAAW,EAAE,WAAW,IAAI,SAAS,OAAO,QAAQ,mCAAmC,cAAc,GAAG,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE;AAAA,IACzJ,WAAW,EAAE,GAAG,MAAM,KAAK,EAAE;AAAA,IAC7B,SAAS,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,WAAW,EAAE;AAAA,IAC1E,WAAW,EAAE,SAAS,OAAO,QAAQ,mCAAmC,cAAc,GAAG,YAAY,eAAe,OAAO,WAAW,YAAY,WAAW,UAAU,IAAI,QAAQ,YAAY,OAAO,QAAQ,WAAW,aAAa;AAAA,IACtO,OAAO,EAAE,SAAS,WAAW,QAAQ,mCAAmC,cAAc,GAAG,YAAY,eAAe,OAAO,UAAU;AAAA,IACrI,OAAO,EAAE,OAAO,yBAAyB,UAAU,GAAG;AAAA,IACtD,OAAO,EAAE,OAAO,WAAW,UAAU,IAAI,cAAc,EAAE;AAAA,IACzD,UAAU,EAAE,OAAO,WAAW,UAAU,IAAI,cAAc,EAAE;AAAA,IAC5D,YAAY,EAAE,OAAO,WAAW,UAAU,IAAI,cAAc,EAAE;AAAA,IAC9D,SAAS,EAAE,SAAS,YAAY,QAAQ,mCAAmC,cAAc,GAAG,YAAY,eAAe,QAAQ,WAAW,OAAO,UAAU;AAAA,IAC3J,cAAc,EAAE,SAAS,YAAY,QAAQ,qBAAqB,cAAc,GAAG,YAAY,wBAAwB,QAAQ,WAAW,OAAO,UAAU;AAAA,EAC7J;AACF,GAAG;;;ACzCH,IAAM,iBAA+D,CAAC,aAAa,UAAU,YAAY;AAGzG,SAAS,QAAQ,OAAiB,QAAkC,UAAqC,OAAiD;AACxJ,SAAO,MAAM,IAAI,CAAC,MAAM,OAAO;AAAA,IAC7B;AAAA,IACA,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI;AAAA,IAC9B,MAAM,SAAS,IAAI,IAAK,OAAO,IAAI,KAAK,KAAM;AAAA,IAC9C,QAAQ,SAAS,IAAI;AAAA,IACrB,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,EACzC,EAAE;AACJ;AAWO,SAAS,gBAAgB,KAAa,QAA+B;AAC1E,QAAM,cAAc,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI;AAChD,QAAM,SAAS,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAU,CAAC;AAC/E,QAAM,WAAW,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,IAAI,WAAW,QAAQ,CAAU,CAAC;AAC1F,QAAM,QAAQ,QAAQ,aAAa,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,MAAM,IAAI;AAC9F,aAAW,SAAS,gBAAgB;AAClC,UAAM,SAAS,IAAI,UAAU,CAAC,GAC3B,OAAO,CAAC,SAAS,KAAK,UAAU,KAAK,EACrC,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;AACjD,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,KAAK,GAAG;AAAA,MACZ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,MAC7B,CAAC,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG,QAAQ;AAAA,MACtD,CAAC,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG,WAAW;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,OAAmB;AAAA,IACvB,UAAU,IAAI;AAAA,IACd,SAAS,IAAI;AAAA,IACb;AAAA,IACA,OAAO,IAAI;AAAA,EACb;AAEA,OAAK,IAAI,qBAAqB,CAAC,GAAG,SAAS,EAAG,MAAK,oBAAoB,IAAI;AAC3E,OAAK,IAAI,sBAAsB,CAAC,GAAG,SAAS,EAAG,MAAK,qBAAqB,IAAI;AAC7E,SAAO;AACT;AAUO,SAAS,cAAc,KAAuB,KAAa,cAA8C;AAC9G,QAAM,MAAM,oBAAI,IAAqB;AACrC,aAAW,OAAO,KAAK,YAAY,CAAC,EAAG,KAAI,IAAI,IAAI,MAAM,EAAE,GAAG,KAAK,QAAQ,SAAS,CAAC;AACrF,aAAW,QAAQ,IAAI,UAAU,CAAC,GAAG;AACnC,UAAM,WAAW,KAAK,WAAW;AACjC,UAAM,WAAW,IAAI,IAAI,KAAK,IAAI;AAClC,QAAI,UAAU;AACZ,UAAI,IAAI,KAAK,MAAM,WACf,EAAE,GAAG,UAAU,OAAO,KAAK,OAAO,MAAM,KAAK,QAAQ,IAAI,QAAQ,SAAS,IAC1E,EAAE,GAAG,UAAU,OAAO,KAAK,OAAO,QAAQ,SAAS,CAAC;AAAA,IAC1D,OAAO;AACL,UAAI,IAAI,KAAK,MAAM;AAAA,QACjB,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK,QAAQ;AAAA,QACnB,QAAQ,CAAC,aAAa,IAAI,KAAK,IAAI;AAAA,QACnC,UAAU;AAAA,QACV,QAAQ,WAAW,WAAW;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,OAAO,EAAE,EAAE;AACnG;AAgBA,SAAS,aAAa,MAAyD;AAC7E,QAAM,WAAW,oBAAI,IAAgC;AACrD,aAAW,OAAO,KAAM,UAAS,IAAI,IAAI,MAAM,IAAI,KAAK;AAExD,QAAM,SAAmB,CAAC;AAC1B,QAAM,SAAS,oBAAI,IAAY;AAE/B,aAAW,OAAO,MAAM;AACtB,UAAM,SAAS,SAAS,IAAI,IAAI,IAAI;AACpC,QAAI,CAAC,UAAU,CAAC,SAAS,IAAI,MAAM,GAAG;AAAE,aAAO,KAAK,IAAI,IAAI;AAAG,aAAO,IAAI,IAAI,IAAI;AAAA,IAAE;AAAA,EACtF;AAEA,MAAI,UAAU;AACd,SAAO,SAAS;AACd,cAAU;AACV,eAAW,OAAO,MAAM;AACtB,UAAI,OAAO,IAAI,IAAI,IAAI,EAAG;AAC1B,YAAM,SAAS,SAAS,IAAI,IAAI,IAAI;AACpC,UAAI,UAAU,OAAO,IAAI,MAAM,GAAG;AAChC,eAAO,OAAO,OAAO,QAAQ,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI;AACrD,eAAO,IAAI,IAAI,IAAI;AACnB,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,aAAW,OAAO,MAAM;AACtB,QAAI,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG;AAAE,aAAO,KAAK,IAAI,IAAI;AAAG,aAAO,IAAI,IAAI,IAAI;AAAA,IAAE;AAAA,EAC3E;AACA,SAAO;AACT;AAUO,SAAS,aAAa,aAAoD;AAC/E,QAAM,OAAO,eAAe,CAAC;AAC7B,QAAM,SAAS,oBAAI,IAA6C,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAChF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,IAAI,SAAS;AAC3B,UAAM,QAAQ,OAAO,IAAI,KAAK;AAC9B,QAAI,MAAO,OAAM,KAAK,GAAG;AAAA,QACpB,QAAO,IAAI,OAAO,CAAC,GAAG,CAAC;AAAA,EAC9B;AACA,QAAM,MAAwB,CAAC;AAC/B,aAAW,CAAC,OAAO,OAAO,KAAK,QAAQ;AACrC,UAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAClE,UAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,IAAI,CAAC,CAAC;AACzE,UAAM,QAAQ,aAAa,OAAO;AAClC,QAAI,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,MAAO,UAAU,WAC1C,EAAE,MAAM,OAAO,GAAG,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,QAAQ,UAAU,IAAI,IAAI,EAAE,IAC7E,EAAE,MAAM,OAAO,GAAG,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,QAAQ,UAAU,IAAI,IAAI,GAAG,MAAM,CAAE,CAAC;AAAA,EAC7F;AACA,SAAO;AACT;AAcO,SAAS,gBAAgB,MAAkB,KAAa,cAAgD;AAC7G,QAAM,cAAc,KAAK,SAAS,CAAC;AACnC,QAAM,cAAc,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAG1D,QAAM,UAAU,IAAI,KAAK,KAAK,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,aAAa,IAAI,CAAC,CAAC,CAAC;AAUhF,QAAMC,UAAS,aAAa,YAAY,OAAO,CAAC,MAAM,aAAa,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/E,QAAM,OAAO,IAAI,IAAIA,QAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC9C,MAAI,QAAQA,QAAO;AACnB,aAAW,QAAQ,IAAI,UAAU,CAAC,GAAG;AACnC,QAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,YAAY,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,EAAG;AAC9E,SAAK,IAAI,KAAK,IAAI;AAClB,IAAAA,QAAO,KAAK,EAAE,MAAM,KAAK,MAAM,OAAO,SAAS,MAAM,KAAK,QAAQ,IAAI,QAAQ,KAAK,WAAW,KAAK,CAAC;AAAA,EACtG;AAKA,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,cAAc,IAAI,IAAI,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAC3E,eAAW,QAAQ,aAAc,KAAI,CAAC,YAAY,IAAI,IAAI,EAAG,SAAQ,IAAI,IAAI;AAC7E,eAAW,QAAQ,YAAa,SAAQ,OAAO,IAAI;AAAA,EACrD;AAKA,QAAM,eAA4B,CAAC;AACnC,QAAM,YAAY,KAAK,OAAO,cAAc,SAAY,KAAK,MAAM,YAAY,IAAI,OAAO;AAC1F,QAAM,aAAa,KAAK,OAAO,eAAe,SAAY,KAAK,MAAM,aAAa,IAAI,OAAO;AAC7F,MAAI,cAAc,OAAW,cAAa,YAAY;AACtD,MAAI,eAAe,OAAW,cAAa,aAAa;AACxD,QAAM,QAAqB;AAAA,IACzB,UAAU,CAAC,GAAG,OAAO;AAAA,IACrB,SAAS,EAAE,GAAI,IAAI,WAAW,CAAC,GAAI,GAAI,KAAK,WAAW,CAAC,EAAG;AAAA,IAC3D,QAAAA;AAAA,IACA,OAAO;AAAA,MACL,SAAS,KAAK,OAAO,WAAW,CAAC;AAAA,MACjC,GAAG;AAAA,IACL;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,KAAK,iBAAiB,EAAG,OAAM,oBAAoB,KAAK;AAC1E,MAAI,MAAM,QAAQ,KAAK,kBAAkB,EAAG,OAAM,qBAAqB,KAAK;AAC5E,SAAO;AACT;AAwBO,IAAM,aAA6B,CAAC,aAAa,UAAU,YAAY;AAMvE,SAAS,eAAe,KAA0D;AACvF,SAAO,QAAQ,WAAW,WAAW;AACvC;AAOO,SAAS,iBAAiB,OAAgC,KAAmB,SAAgC;AAClH,QAAM,OAAO,SAAS,CAAC;AACvB,QAAM,SAAS,eAAe,GAAG;AACjC,MAAI,WAAW,YAAa,QAAO,EAAE,GAAG,MAAM,WAAW,EAAE,GAAI,KAAK,aAAa,CAAC,GAAI,QAAQ,EAAE;AAChG,MAAI,WAAW,aAAc,QAAO,EAAE,GAAG,MAAM,YAAY,EAAE,GAAI,KAAK,cAAc,CAAC,GAAI,QAAQ,EAAE;AACnG,SAAO,EAAE,GAAG,MAAM,QAAQ;AAC5B;AAOO,SAAS,aAAa,OAAgC,KAAmB,KAA4B;AAC1G,QAAM,OAAO,SAAS,CAAC;AACvB,QAAM,SAAS,eAAe,GAAG;AACjC,MAAI,WAAW,YAAa,QAAO,EAAE,GAAG,MAAM,WAAW,EAAE,GAAI,KAAK,aAAa,CAAC,GAAI,IAAI,EAAE;AAC5F,MAAI,WAAW,aAAc,QAAO,EAAE,GAAG,MAAM,YAAY,EAAE,GAAI,KAAK,cAAc,CAAC,GAAI,IAAI,EAAE;AAC/F,SAAO,EAAE,GAAG,MAAM,IAAI;AACxB;AAuBO,SAAS,SAAS,KAAa,QAAoC;AACxE,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,MAAM,IAAI,YAAY,MAAM,KAAK,CAAC;AACxC,SAAO;AAAA,IACL,UAAU,IAAI,YAAY,CAAC;AAAA,IAC3B,mBAAmB,IAAI,qBAAqB,CAAC;AAAA,IAC7C,oBAAoB,IAAI,sBAAsB,CAAC;AAAA,IAC/C,SAAS,IAAI,WAAW,CAAC;AAAA,IACzB,QAAQ,IAAI,UAAU,CAAC;AAAA,IACvB,OAAO;AAAA,MACL,SAAS,IAAI,OAAO,WAAW,CAAC;AAAA,MAChC,KAAK,IAAI,OAAO,OAAO,CAAC;AAAA,MACxB,WAAW,IAAI,OAAO;AAAA,MACtB,YAAY,IAAI,OAAO;AAAA,IACzB;AAAA,IACA,SAAS,IAAI;AAAA,IACb,cAAc,IAAI;AAAA,EACpB;AACF;AAiCO,SAAS,qBAAqB,MAAsB;AACzD,QAAM,YAAY,OAAO,IAAI,EAC1B,QAAQ,8BAA8B,GAAG,EACzC,KAAK,EACL,QAAQ,UAAU,EAAE;AACvB,QAAM,OAAO,cAAc,KAAK,WAAW;AAC3C,SAAO,GAAG,IAAI;AAChB;AAMO,SAAS,mBAAmB,UAAoB,QAAiB,QAAgC;AACtG,QAAM,WAAW,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AACzD,QAAM,gBAAgB,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACzD,QAAM,QAAQ,SACX,OAAO,CAAC,MAAM,KAAK,OAAQ,EAAyB,SAAS,YAAY,CAAC,cAAc,IAAK,EAAa,IAAI,CAAC,EAC/G,IAAI,CAAC,OAAO,EAAE,IAAI,OAAO,GAAG,MAAO,EAAa,MAAM,MAAQ,EAAa,QAAQ,CAAC,EAAiB,EAAE;AAC1G,SAAO,MAAM,SAAS,IAAI,CAAC,GAAG,UAAU,GAAG,KAAK,IAAI;AACtD;AAGO,SAAS,aAAa,SAAmB,IAAY,UAA6D;AACvH,SAAO;AAAA,IACL,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,IAC1C,UAAU,aAAa,KAAK,SAAY;AAAA,EAC1C;AACF;AAGO,SAAS,QAAgB;AAC9B,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAC/E;;;AChZO,SAAS,cAAc,KAAK;AACjC,SAAO,QAAQ,cAAc,cAAc,QAAQ,eAAe,eAAe;AACnF;AAGO,SAAS,cAAc,KAAK;AACjC,SAAO,QAAQ,cAAc,cAAc,QAAQ,WAAW,WAAW;AAC3E;AAIO,SAAS,iBAAiB,KAAK,OAAO;AAC3C,MAAI,UAAU,SAAU,QAAO;AAC/B,SAAO,UAAU;AACnB;AAIO,SAAS,YAAY,KAAK,KAAK;AACpC,QAAM,OAAO,cAAc,GAAG;AAC9B,SAAO,SAAS,cAAe,IAAI,qBAAqB,CAAC,IACrD,SAAS,eAAgB,IAAI,sBAAsB,CAAC,IACnD,IAAI,YAAY,CAAC;AACxB;AAgBO,SAAS,WAAW,KAAK,KAAK;AACnC,QAAM,QAAQ,cAAc,GAAG;AAC/B,QAAM,QAAQ,oBAAI,IAAI;AACtB,QAAM,SAAS,oBAAI,IAAI;AACvB,QAAM,OAAO,oBAAI,IAAI;AACrB,QAAM,QAAQ,oBAAI,IAAI;AACtB,aAAW,QAAQ,IAAI,UAAU,CAAC,GAAG;AACnC,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS,SAAU;AAChF,UAAM,YAAY,KAAK,SAAS;AAChC,QAAI,cAAc,MAAO,OAAM,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC;AAC7D,QAAI,CAAC,iBAAiB,KAAK,SAAS,EAAG;AACvC,UAAM,IAAI,KAAK,IAAI;AACnB,QAAI,KAAK,QAAQ,CAAC,KAAK,IAAI,KAAK,IAAI,EAAG,MAAK,IAAI,KAAK,MAAM,KAAK,IAAI;AACpE,QAAI,KAAK,WAAW,KAAM,QAAO,IAAI,KAAK,IAAI;AAAA,EAChD;AACA,SAAO,EAAE,OAAO,OAAO,QAAQ,MAAM,MAAM;AAC7C;AAUO,SAAS,WAAW,KAAK,KAAK,MAAM,SAAS;AAClD,QAAM,OAAO,cAAc,GAAG;AAC9B,QAAM,QAAQ,SAAS,cAAc,sBAAsB,SAAS,eAAe,uBAAuB;AAC1G,QAAM,OAAO,IAAI,KAAK,KAAK,CAAC,GAAG,MAAM;AACrC,QAAM,IAAI,IAAI,QAAQ,IAAI;AAC1B,MAAI,SAAS;AACX,QAAI,KAAK,EAAG,QAAO,CAAC;AACpB,QAAI,KAAK,IAAI;AAAA,EACf,OAAO;AACL,QAAI,IAAI,EAAG,QAAO,CAAC;AACnB,QAAI,OAAO,GAAG,CAAC;AAAA,EACjB;AACA,SAAO,EAAE,CAAC,KAAK,GAAG,IAAI;AACxB;AAOO,SAAS,cAAc,MAAM,UAAU,YAAY,KAAK,SAAS,MAAM;AAC5E,QAAM,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,SAAS,QAAQ;AACvD,QAAM,MAAM,KAAK,UAAU,CAAC,QAAQ,IAAI,SAAS,UAAU;AAC3D,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,UAAU,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC;AACnF,QAAM,QAAQ,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,QAAQ;AAChE,MAAI,CAAC,MAAO,QAAO;AACnB,OAAK,OAAO,UAAU,GAAG,KAAK;AAC9B,SAAO;AACT;AAUO,SAAS,mBAAmB,KAAK,KAAK,MAAM;AACjD,QAAM,QAAQ,cAAc,GAAG;AAC/B,QAAM,UAAU,IAAI,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,cAAc,KAAK;AACrF,QAAM,UAAU,KAAK,IAAI,CAAC,KAAK,OAAO;AAAA,IACpC,MAAM,IAAI;AAAA,IACV,OAAO;AAAA,IACP,MAAM,IAAI,aAAa,IAAI,SAAU,IAAI,QAAQ,KAAM;AAAA,IACvD;AAAA,IACA,QAAQ,IAAI;AAAA,EACd,EAAE;AACF,SAAO,CAAC,GAAG,QAAQ,GAAG,OAAO;AAC/B;AASO,SAAS,yBAAyB,KAAK,WAAW;AACvD,QAAM,UAAU,IAAI,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,cAAc,QAAQ;AACxF,QAAM,UAAU,CAAC,aAAa,UAAU,YAAY,EAAE,QAAQ,CAAC,QAAQ;AACrE,UAAM,QAAQ,cAAc,GAAG;AAC/B,YAAQ,UAAU,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,OAAO;AAAA,MAC7C,MAAM,IAAI;AAAA,MACV,OAAO;AAAA,MACP,MAAM,IAAI,aAAa,IAAI,SAAU,IAAI,QAAQ,KAAM;AAAA,MACvD;AAAA,MACA,QAAQ,IAAI;AAAA,IACd,EAAE;AAAA,EACJ,CAAC;AACD,SAAO,CAAC,GAAG,QAAQ,GAAG,OAAO;AAC/B;AAMA,IAAM,cAAc,CAAC,UAAU,aAAa,YAAY;AAMxD,SAAS,WAAW,KAAK,QAAQ;AAC/B,MAAI,IAAI,WAAW,KAAM,QAAO,IAAI,aAAa,IAAI,QAAQ;AAC7D,MAAI,IAAI,aAAa,GAAI,QAAO,IAAI;AACpC,MAAI,WAAW,KAAM,QAAO;AAC5B,QAAM,OAAO,IAAI,QAAQ;AACzB,SAAO,SAAS,MAAM,KAAK,WAAW,GAAG,IAAI,KAAK;AACpD;AAUO,SAAS,aAAa,KAAK,OAAO,UAAU;AACjD,QAAM,SAAS,oBAAI,IAAI;AACvB,QAAM,QAAQ,CAAC;AACf,aAAW,OAAO,aAAa;AAC7B,eAAW,OAAO,UAAU,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,GAAG;AAC3D,YAAM,SAAS,WAAW,KAAK,IAAI,IAAI,MAAM;AAC7C,YAAM,MAAM,OAAO,IAAI,IAAI,IAAI;AAC/B,UAAI,QAAQ,QAAW;AACrB,eAAO,IAAI,IAAI,MAAM,EAAE,KAAK,OAAO,CAAC;AACpC,cAAM,KAAK,IAAI,IAAI;AAAA,MACrB,WAAW,IAAI,WAAW,QAAQ,QAAQ;AACxC,eAAO,IAAI,IAAI,MAAM,EAAE,KAAK,OAAO,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,IAAI,EAAE,GAAG;AACjD;AAgBO,SAAS,yBAAyB,KAAK,MAAM,UAAU;AAC5D,QAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AACjD,QAAM,UAAU,IAAI,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,cAAc,YAAY,MAAM,IAAI,KAAK,IAAI,CAAC;AAChH,QAAM,UAAU,CAAC;AACjB,aAAW,OAAO,aAAa;AAC7B,UAAM,QAAQ,cAAc,GAAG;AAC/B,QAAI,QAAQ;AACZ,eAAW,OAAO,MAAM;AACtB,YAAM,SAAS,aAAa,SAAY,QAAQ,SAAS,KAAK,IAAI,IAAI;AACtE,UAAI,WAAW,QAAQ,WAAW,OAAW;AAC7C,YAAM,OAAO,WAAW,KAAK,MAAM;AACnC,UAAI,WAAW,QAAQ,SAAS,GAAI;AACpC,cAAQ,KAAK,EAAE,MAAM,IAAI,MAAM,OAAO,SAAS,MAAM,OAAO,QAAQ,IAAI,WAAW,KAAK,CAAC;AAAA,IAC3F;AAAA,EACF;AACA,SAAO,CAAC,GAAG,QAAQ,GAAG,OAAO;AAC/B;AAMO,SAAS,mBAAmB,MAAM,UAAU;AACjD,QAAM,UAAU,oBAAI,IAAI;AACxB,aAAW,OAAO,aAAa;AAC7B,eAAW,OAAO,MAAM;AACtB,YAAM,SAAS,WAAW,KAAK,IAAI,IAAI;AACvC,UAAI,WAAW,QAAQ,WAAW,UAAa,WAAW,KAAM;AAChE,UAAI,WAAW,KAAK,KAAK,MAAM,GAAI,SAAQ,IAAI,IAAI,IAAI;AAAA,IACzD;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO;AACpB;AAMO,SAAS,oBAAoB,MAAM;AACxC,QAAM,UAAU,KAAK,OAAO,CAAC,QAAQ,IAAI,YAAY,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;AAChF,SAAO,EAAE,UAAU,SAAS,mBAAmB,CAAC,GAAG,OAAO,GAAG,oBAAoB,CAAC,GAAG,OAAO,EAAE;AAChG;AAYO,SAAS,UAAU,KAAK,MAAM,KAAK;AACxC,QAAM,UAAU,IAAI,WAAW,CAAC;AAChC,QAAM,SAAS,IAAI,IAAI,YAAY,KAAK,GAAG,CAAC;AAC5C,QAAM,aAAa,IAAI,KAAK,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AAC/E,QAAM,aAAa,IAAI,KAAK,MAAM,gBAAgB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AACnF,QAAM,EAAE,OAAO,OAAO,cAAc,QAAQ,aAAa,MAAM,OAAO,WAAW,IAAI,WAAW,KAAK,GAAG;AACxG,QAAM,QAAQ,CAAC;AACf,QAAM,OAAO,oBAAI,IAAI;AACrB,QAAM,OAAO,CAAC,SAAS;AAAE,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG;AAAE,WAAK,IAAI,IAAI;AAAG,YAAM,KAAK,IAAI;AAAA,IAAE;AAAA,EAAE;AAInF,aAAW,OAAO,MAAM,gBAAgB,CAAC,GAAG;AAC1C,QAAI,WAAW,IAAI,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,IAAI,KAAK,IAAI,YAAY,KAAM,MAAK,IAAI,IAAI;AAAA,EAC7F;AAMA,aAAW,QAAQ,WAAW,KAAK,GAAG;AACpC,QAAI,WAAW,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,EAAG,MAAK,IAAI;AAAA,EAC/D;AAIA,aAAW,QAAQ,IAAI,UAAU,CAAC,GAAG;AACnC,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS,SAAU;AAChF,SAAK,KAAK,SAAS,cAAc,MAAO;AACxC,QAAI,KAAK,WAAW,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,WAAW,IAAI,KAAK,IAAI,KAAK,WAAW,IAAI,KAAK,IAAI,EAAG,MAAK,KAAK,IAAI;AAAA,EAC3H;AAEA,aAAW,QAAQ,YAAa,MAAK,IAAI;AACzC,QAAM,OAAO,MAAM,IAAI,CAAC,SAAS;AAE/B,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK;AACnC,WAAO;AAAA,MACL;AAAA,MACA,MAAM,WAAW,IAAI,IAAI,GAAG,QAAQ,WAAW,IAAI,IAAI,GAAG,QAAQ;AAAA,MAClE,UAAU,aAAa,MAAM,OAAO,OAAO,SAAS,IAAI;AAAA,MACxD,QAAQ,YAAY,IAAI,IAAI;AAAA,MAC5B;AAAA,MACA,SAAS,OAAO,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF,CAAC;AAGD,MAAI,WAAW,OAAO,GAAG;AACvB,UAAM,WAAW,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AAC5D,SAAK,KAAK,CAAC,GAAG,OAAO,WAAW,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,KAAK,MAAM,WAAW,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,KAAK,EAAE;AAAA,EACnI;AACA,SAAO;AACT;AAUO,SAAS,sBAAsB,KAAK,OAAO,OAAO;AACvD,QAAM,UAAU,CAAC;AACjB,aAAW,OAAO,CAAC,aAAa,UAAU,YAAY,GAAG;AACvD,YAAQ,GAAG,IAAI,UAAU,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ;AACpE,UAAI,IAAI,OAAQ,QAAO;AACvB,YAAM,QAAQ,QAAQ,IAAI,IAAI;AAC9B,UAAI,UAAU,OAAW,QAAO;AAChC,YAAM,KAAK,OAAO,UAAU,aAAa,MAAM,IAAI,IAAI,IAAI;AAC3D,aAAO,KAAK,EAAE,GAAG,KAAK,UAAU,IAAI,MAAM,GAAG,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AACA,SAAO,yBAAyB,KAAK,OAAO;AAC9C;AAQO,SAAS,sBAAsB,KAAK,OAAO,OAAO;AACvD,QAAM,UAAU,CAAC;AACjB,aAAW,OAAO,CAAC,aAAa,UAAU,YAAY,GAAG;AACvD,YAAQ,GAAG,IAAI,UAAU,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ;AACpE,UAAI,IAAI,UAAU,IAAI,aAAa,MAAM,QAAQ,IAAI,IAAI,MAAM,OAAW,QAAO;AACjF,aAAO,EAAE,GAAG,KAAK,UAAU,IAAI,MAAM,GAAG;AAAA,IAC1C,CAAC;AAAA,EACH;AACA,SAAO,yBAAyB,KAAK,OAAO;AAC9C;AAQO,SAAS,UAAU,KAAK,OAAO;AACpC,aAAW,QAAQ,KAAK,UAAU,CAAC,GAAG;AACpC,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS,SAAU;AAChF,UAAM,KAAK,QAAQ,KAAK,IAAI;AAC5B,QAAI,OAAO,OAAO,YAAY,OAAO,MAAM,KAAK,SAAS,GAAI,QAAO;AAAA,EACtE;AACA,SAAO;AACT;;;AC3WO,IAAM,OAAO;AAAA,EAClB,oBAAoB;AAAA,EAEpB,kBAAkB;AAAA,EAElB,mBAAmB;AAAA,EAEnB,sBAAsB;AAAA,EAEtB,aAAa;AAAA,EAEb,cAAc;AAAA,EAEd,aAAa;AAAA,EAEb,aAAa;AAAA,EAEb,aAAa;AAAA,EAEb,aAAa;AAAA,EAEb,aAAa;AAAA,EAEb,mBAAmB;AAAA,EAEnB,kBAAkB;AAAA,EAElB,aAAa;AAAA,EAEb,iBAAiB;AAAA,EAEjB,cAAc;AAAA,EAEd,iBAAiB;AAAA,EAEjB,sBAAsB;AAAA,EAEtB,6BAA6B;AAAA,EAE7B,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnB,0BAA0B,CAAC,WAAY,WAAW,KAC9C,OACA;AACN;;;ACjDO,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAb,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACDd,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIf,IAAM,SAAS,CAAC,aAAa;AAClC,QAAM,KAAK,OAAO,YAAY,EAAE,EAAE,QAAQ,OAAU;AACpD,MAAI,KAAK,EAAG,QAAO;AACnB,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQb,SAAO,OAAO,2CAAkB,SAAS,MAAM,EAAE;AACnD;;;ACLO,IAAM,cAAc;AAAA,EACzB,GAAG;AAAA,EACH,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,aAAa;AACf;;;ACGA,IAAAC,gBAAuI;;;ACXvI,IAAAC,gBAA0C;AAI1C,IAAM,OAAO;AAEb,IAAM,WAAW;AASV,SAAS,kBAAkB,KAA0C;AAC1E,+BAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,OAAO,KAAM,QAAO;AAExB,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,QAAI,WAA0B;AAE9B,UAAM,aAAa,MAAY;AAC7B,aAAO;AACP,iBAAW;AACX,UAAI,UAAU,GAAG;AACf,6BAAqB,KAAK;AAC1B,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,YAAY,MAAY;AAC5B,cAAQ;AACR,UAAI,SAAS,EAAG;AAChB,YAAM,SAAS,GAAG;AAClB,SAAG,aAAa;AAEhB,UAAI,GAAG,cAAc,QAAQ;AAC3B,eAAO;AACP;AAAA,MACF;AACA,cAAQ,sBAAsB,SAAS;AAAA,IACzC;AAEA,UAAM,UAAU,CAAC,YAA0B;AACzC,YAAM,OAAO,GAAG,sBAAsB;AACtC,YAAM,UAAU,UAAU,KAAK;AAC/B,YAAM,aAAa,KAAK,SAAS;AACjC,aAAO,UAAU,OACb,CAAC,KAAK,MAAO,OAAO,WAAW,OAAQ,QAAQ,IAC/C,aAAa,OACX,KAAK,MAAO,OAAO,cAAc,OAAQ,QAAQ,IACjD;AACN,UAAI,SAAS,GAAG;AACd,mBAAW;AACX;AAAA,MACF;AACA,UAAI,UAAU,EAAG,SAAQ,sBAAsB,SAAS;AAAA,IAC1D;AAEA,UAAM,aAAa,CAAC,UAA2B;AAE7C,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB,mBAAW;AACX;AAAA,MACF;AACA,iBAAW,MAAM;AACjB,cAAQ,MAAM,OAAO;AAAA,IACvB;AAGA,UAAM,cAAc,CAAC,UAA2B;AAC9C,YAAM,KAAK,MAAM;AACjB,UAAI,OAAO,QAAQ,GAAG,SAAS,EAAE,EAAG;AACpC,iBAAW;AAAA,IACb;AAEA,UAAM,QAAQ,MAAY,WAAW;AAErC,OAAG,iBAAiB,YAAY,YAAY,IAAI;AAChD,OAAG,iBAAiB,aAAa,aAAa,IAAI;AAClD,OAAG,iBAAiB,QAAQ,OAAO,IAAI;AAEvC,WAAO,iBAAiB,WAAW,KAAK;AAGxC,WAAO,iBAAiB,aAAa,KAAK;AAE1C,WAAO,MAAM;AACX,iBAAW;AACX,SAAG,oBAAoB,YAAY,YAAY,IAAI;AACnD,SAAG,oBAAoB,aAAa,aAAa,IAAI;AACrD,SAAG,oBAAoB,QAAQ,OAAO,IAAI;AAC1C,aAAO,oBAAoB,WAAW,KAAK;AAC3C,aAAO,oBAAoB,aAAa,KAAK;AAE7C,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AACV;;;AD9DA,IAAM,UAAU,CAAC,KAAmB,SAAyB,GAAG,GAAG,IAAI,IAAI;AAEpE,SAAS,aAAa,EAAE,KAAK,KAAK,QAAQ,OAAO,SAAS,GAAG,UAAU,MAAM,GAYnE;AACf,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAmB,KAAK;AACpD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAwB,IAAI;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AAErC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAwB,IAAI;AAExD,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAwB,IAAI;AAC5D,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAwB,IAAI;AAE5D,QAAM,gBAAY,sBAA8B,IAAI;AACpD,oBAAkB,SAAS;AAM3B,QAAM,WAAW,CAAC,KAAmB,SAAiC;AACpE,UAAM,OAAO,SAAS,GAAG;AACzB,QAAI,SAAS,UAAa,SAAS,KAAM,QAAO;AAChD,YAAQ,KAAK,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,SAAS,IAAI;AAAA,EAClE;AAEA,QAAM,cAAc,MAAe,WAAW,MAAM,CAAC,QAAQ,SAAS,KAAK,EAAE,MAAM,IAAI;AAEvF,QAAM,aAAa,MAAiB,aAAa,KAAK,QAAQ,QAAQ;AACtE,QAAM,SAAS,CAAC,QACd,YAAY,OAAO,WAAW,IAAI,UAAU,KAAK,SAAS,GAAG,KAAK,MAAM,GAAG;AAK7E,QAAM,aAAa,CAAC,KAAmB,MAAc,YAA2B;AAC9E,UAAM,QAAQ,WAAW,KAAK,KAAK,MAAM,OAAO;AAChD,eAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,YAAM,OAAkE,KAAK;AAAA,IAC/E;AAAA,EACF;AAIA,QAAM,gBAAgB,CAACC,UAA0B;AAC/C,QAAI,CAAC,YAAY,GAAG;AAClB,gBAAU,EAAE,cAAc,CAAC;AAC3B;AAAA,IACF;AACA,UAAM,UAAU,yBAAyB,KAAKA,OAAM,QAAQ,CAAC;AAC7D,UAAM,SAAS,oBAAoBA,KAAI;AACvC,UAAM,YAAY,OAAO,QAAQ;AACjC,UAAM,qBAAqB,OAAO,iBAAiB;AACnD,UAAM,sBAAsB,OAAO,kBAAkB;AAAA,EACvD;AAGA,QAAM,WAAW,CAAC,KAAmB,SAA0B,SAAS,KAAK,IAAI,MAAM;AAIvF,QAAM,eAAe,CAAC,KAAmBA,UAA0B;AACjE,UAAM,UAAU,mBAAmB,KAAK,KAAKA,KAAI,CAAC;AAAA,EACpD;AAGA,QAAM,cAAc,CAAC,KAAmBA,UAA0B;AAChE,QAAI,YAAY,KAAM,eAAcA,KAAI;AAAA,QACnC,cAAa,KAAKA,KAAI;AAAA,EAC7B;AAEA,QAAM,gBAAgB,CAAC,KAAmB,SAAuB;AAC/D,QAAI,YAAY,MAAM;AACpB,YAAMA,QAAO,OAAO,GAAG;AACvB,YAAM,MAAMA,MAAK,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AAClD,UAAI,QAAQ,OAAW;AACvB,oBAAcA,MAAK,IAAI,CAAC,SAAU,KAAK,SAAS,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,QAAQ,IAAI,IAAK,CAAC;AACnG;AAAA,IACF;AACA,eAAW,KAAK,MAAM,CAAC,YAAY,KAAK,GAAG,EAAE,SAAS,IAAI,CAAC;AAAA,EAC7D;AAGA,QAAM,UAAU,CAAC,KAAmB,OAAe,QAAsB;AACvE,UAAMA,QAAO,OAAO,GAAG;AACvB,UAAM,SAAS,QAAQ;AACvB,QAAI,SAAS,KAAK,UAAUA,MAAK,OAAQ;AACzC,UAAM,OAAOA,MAAK,MAAM;AACxB,UAAM,CAAC,IAAI,IAAI,KAAK,OAAO,OAAO,CAAC;AACnC,SAAK,OAAO,QAAQ,GAAG,IAAI;AAC3B,gBAAY,KAAK,IAAI;AAAA,EACvB;AAIA,QAAM,iBAAiB,CAAC,KAAmB,SAAuB;AAChE,QAAI,YAAY,MAAM;AACpB,oBAAc,OAAO,GAAG,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS,IAAI,CAAC;AAC5D;AAAA,IACF;AACA,UAAM,cAAc,cAAc,GAAG;AACrC,UAAMC,WAAU,IAAI,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM;AAC9C,UAAI,EAAE,SAAS,KAAM,QAAO;AAC5B,YAAM,YAAY,EAAE,SAAS;AAC7B,aAAO,EAAE,cAAc,eAAe,cAAc;AAAA,IACtD,CAAC;AACD,UAAM,UAAUA,OAAM;AACtB,eAAW,KAAK,MAAM,KAAK;AAAA,EAC7B;AAIA,QAAM,eAAe,CAAC,KAAmB,QAAuB;AAC9D,eAAW,QAAQ,KAAK,IAAI,IAAI,CAAC;AACjC,aAAS,IAAI,YAAY,IAAI,IAAI;AAAA,EACnC;AACA,QAAM,gBAAgB,CAAC,KAAmB,QAAuB;AAC/D,UAAM,WAAW,CAAC,MAAyB,EAAE,SAAS,IAAI,OAAO,IAAI,EAAE,GAAG,GAAG,UAAU,OAAO,MAAM,MAAM;AAE1G,gBAAY,KAAK,OAAO,GAAG,EAAE,IAAI,QAAQ,CAAC;AAC1C,eAAW,IAAI;AAAA,EACjB;AACA,QAAM,iBAAiB,CAAC,KAAmB,QAAuB;AAChE,UAAM,OAAO,OAAO,GAAG,EAAE;AAAA,MAAI,CAAC,MAC5B,EAAE,SAAS,IAAI,OAAO,IAAI,EAAE,GAAG,GAAG,UAAU,IAAI,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG;AAAA,IAC/E;AACA,gBAAY,KAAK,IAAI;AAErB,QAAI,CAAC,IAAI,UAAU,OAAO,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI,IAAI,GAAG;AAC7D,YAAM,OAAO,EAAE,GAAI,IAAI,WAAW,CAAC,EAAG;AACtC,aAAO,KAAK,IAAI,IAAI;AACpB,YAAM,WAAW,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,MAAc,MAAcC,WAA8B;AAC5E,QAAI,YAAY,MAAM;AAEpB,oBAAc,CAAC,GAAG,OAAOA,MAAK,GAAG,EAAE,MAAM,MAAM,UAAU,OAAO,QAAQ,MAAM,UAAU,MAAM,SAAS,MAAM,CAAC,CAAC;AAC/G;AAAA,IACF;AACA,UAAMD,WAAU,IAAI,UAAU,CAAC,GAAG,MAAM;AACxC,IAAAA,QAAO,KAAK,EAAE,MAAM,OAAO,MAAMA,QAAO,QAAQ,MAAM,OAAAC,QAAO,QAAQ,KAAK,CAAC;AAC3E,UAAM,UAAUD,OAAM;AAAA,EACxB;AAMA,QAAM,cAAc,CAAC,KAAmB,MAAc,MAAc,eAA8B;AAChG,QAAI,SAAS,MAAM,KAAK,WAAW,GAAG,GAAG;AACvC,gBAAU,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC5C;AAAA,IACF;AAGA,UAAM,OAAO,aAAa,SAAY,OAAO,SAAS,MAAM,IAAI;AAChE,cAAU,IAAI;AACd,UAAMD,QAAO,OAAO,GAAG;AACvB,UAAM,WAAWA,MAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,IAAI;AAErD,UAAM,OAAO,aAAa,SACtB,CAAC,GAAGA,MAAK,OAAO,CAAC,QAAQ,IAAI,SAAS,IAAI,GAAG,YAAY,OAAO,EAAE,GAAG,UAAU,SAAS,MAAM,IAAI,QAAQ,IAC1G,CAAC,GAAGA,OAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN,UAAU,OAAO,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI;AAAA,MAC/C,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AACL,QAAI,YAAY,QAAQ,aAAa,UAAa,SAAS,KAAK,IAAI,KAAK,YAAY,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAC7G,iBAAW,KAAK,MAAM,KAAK;AAAA,IAC7B;AACA,gBAAY,KAAK,IAAI;AACrB,QAAI,eAAe,OAAW,WAAU,EAAE,iBAAiB,EAAE,MAAM,IAAI,WAAW,GAAG,GAAG,MAAM,WAAW,CAAC,CAAC;AAAA,EAC7G;AAIA,QAAM,kBAAkB,CAAC,SAAuB;AAC9C,UAAMA,QAAO,OAAO,KAAK;AACzB,UAAM,MAAMA,MAAK,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AAClD,QAAI,QAAQ,OAAW;AACvB,QAAI,YAAY,MAAM;AAEpB,YAAM,SAAS,WAAW,KAAK,CAAC,QAAQ,SAAS,KAAK,IAAI,MAAM,IAAI;AACpE,oBAAc,IAAI,UAAU,CAAC,SACzBA,MAAK,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,IACxCA,MAAK,IAAI,CAAC,SAAU,KAAK,SAAS,OAAO,EAAE,GAAG,MAAM,SAAS,KAAK,IAAI,IAAK,CAAC;AAAA,IAClF,WAAW,IAAI,UAAU,IAAI,aAAa,MAAM,cAAc,IAAI,IAAI,GAAG;AACvE,qBAAe,OAAO,IAAI;AAAA,IAC5B,OAAO;AACL,iBAAW,OAAO,MAAM,IAAI;AAAA,IAC9B;AACA,cAAU,EAAE,kBAAkB,EAAE,MAAM,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC;AAAA,EAClE;AAGA,QAAM,YAAY,CAAC,OAAuB,WAA0B;AAClE,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,YAAY,QAAQ,QAAQ,SAAS,UAAW;AACpD,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,gBAAY,IAAI;AAChB,QAAI,QAAQ,SAAS,OAAO,KAAM;AAClC,UAAM,OAAQ,MAAM,cAA8B,sBAAsB;AACxE,UAAM,MAAM,MAAM,UAAU,KAAK,MAAM,KAAK,SAAS,IAAI,UAAU;AACnE,QAAI,QAAQ,SAAS,OAAO;AAC1B,YAAM,OAAO,cAAc,OAAO,KAAK,GAAG,QAAQ,MAAM,OAAO,MAAM,GAAG;AACxE,UAAI,SAAS,MAAM;AAAE,oBAAY,OAAO,IAAI;AAAG,kBAAU,IAAI;AAAA,MAAE;AAC/D;AAAA,IACF;AACA,gBAAY,OAAO,QAAQ,MAAM,QAAQ,QAAQ,IAAI,QAAQ,SAAS,SAAS,SAAY,WAAW,QAAQ,IAAI,CAAC;AAAA,EACrH;AAGA,QAAM,aAAa,CAAC,UAAgC;AAClD,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,YAAY,QAAQ,QAAQ,SAAS,UAAW;AACpD,UAAM,eAAe;AACrB,gBAAY,IAAI;AAChB,QAAI,QAAQ,SAAS,OAAO;AAC1B,kBAAY,OAAO,QAAQ,MAAM,QAAQ,QAAQ,IAAI,QAAQ,SAAS,SAAS,SAAY,WAAW,QAAQ,IAAI,CAAC;AACnH;AAAA,IACF;AACA,UAAM,OAAO,OAAO,KAAK;AACzB,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,QAAI,SAAS,UAAa,KAAK,SAAS,QAAQ,KAAM;AACtD,UAAM,OAAO,cAAc,MAAM,QAAQ,MAAM,KAAK,MAAM,OAAO;AACjE,QAAI,SAAS,KAAM,aAAY,OAAO,IAAI;AAAA,EAC5C;AAGA,QAAM,aAAa,CAAC,UAAgC;AAClD,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,YAAY,QAAQ,QAAQ,SAAS,UAAW;AACpD,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,gBAAY,IAAI;AAChB,QAAI,QAAQ,SAAS,MAAO;AAC5B,oBAAgB,QAAQ,IAAI;AAAA,EAC9B;AAIA,+BAAU,MAAM;AACd,wBAAoB,CAAC,KAAK,YAAY;AACpC,UAAI,QAAQ,SAAS,aAAa,QAAQ,MAAO;AAEjD,UAAI,YAAY,QAAQ,QAAQ,SAAS,OAAQ;AACjD,kBAAY,KAAK,QAAQ,MAAM,QAAQ,QAAQ,IAAI,WAAW,KAAK,CAAC;AAAA,IACtE,CAAC;AACD,WAAO,MAAM,oBAAoB,IAAI;AAAA,EACvC,CAAC;AAED,QAAM,aAAa,CAAC,QAClB,QAAQ,cAAc,EAAE,iBAAiB,IAAI,QAAQ,eAAe,EAAE,sBAAsB,IAAI,EAAE,oBAAoB;AAGxH,QAAM,WAAW,CAAC,QAA2C;AAC3D,UAAM,OAAO,SAAS,GAAG;AACzB,QAAI,SAAS,UAAa,SAAS,KAAM,QAAO;AAChD,QAAI,IAAI,kBAAkB,MAAO,QAAO;AACxC,QAAI,KAAK,gBAAgB,QAAW;AAClC,iBAAO,cAAAG,eAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,qBAAqB,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC;AAAA,IAC7F;AACA,UAAM,OAAO,KAAK;AAClB,QAAI,SAAS,QAAW;AACtB,iBAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,gBAAgB,EAAE,SAAS,KAAK,SAAS,UAAU,KAAK,SAAS,CAAC,CAAC;AAAA,IAChH;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,KAAmB,QAA0B,YAAY,QAAQ,KAAK,IAAI,IAAI;AAEjG,QAAM,YAAY,CAAC,KAAmB,KAAc,OAAe,UAAuC;AACxG,QAAI,CAAC,WAAW,GAAG,EAAG,QAAO;AAC7B,UAAM,OAAO,aAAa,QAAQ,SAAS,WAAW,GAAG,IAAI,IAAI,GAAG,IAAI,SAAS,MAAM,IAAI,KAAK,SAAS,CAAC,IAAI;AAC9G,eAAO,cAAAA,eAAE,OAAO;AAAA,MACd,KAAK,IAAI;AAAA,MACT,OAAO;AAAA,QACL,GAAG,EAAE;AAAA,QACL,GAAI,IAAI,UAAU,EAAE,aAAa,CAAC;AAAA,QAClC,GAAI,SAAS,UAAU,EAAE,YAAY,CAAC;AAAA,QACtC,GAAI,SAAS,UAAU,EAAE,YAAY,CAAC;AAAA,QACtC,GAAI,aAAa,IAAI,OAAO,EAAE,WAAW,CAAC;AAAA,MAC5C;AAAA,MACA,YAAY,CAAC,UAA0B;AACrC,YAAI,CAAC,YAAY,OAAO,SAAS,EAAG;AACpC,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB,cAAM,OAAQ,MAAM,cAA8B,sBAAsB;AACxE,oBAAY,GAAG,IAAI,IAAI,IAAI,MAAM,UAAU,KAAK,MAAM,KAAK,SAAS,IAAI,UAAU,OAAO,EAAE;AAAA,MAC7F;AAAA,MACA,QAAQ,CAAC,UAA0B,UAAU,OAAO,GAAG;AAAA,IACzD,GAAG;AAAA;AAAA,UAED,cAAAA,eAAE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO,EAAE,MAAM;AAAA,QACf,OAAO,EAAE;AAAA,QACT,aAAa,CAAC,UAA0B;AACtC,sBAAY,IAAI,IAAI;AACpB,oBAAU,OAAO,EAAE,MAAM,WAAW,MAAM,IAAI,MAAM,MAAM,KAAK,MAAM,IAAI,YAAY,IAAI,KAAK,CAAC;AAAA,QACjG;AAAA,QACA,WAAW,MAAM;AAAE,sBAAY,IAAI;AAAG,sBAAY,IAAI;AAAG,qBAAW;AAAA,QAAE;AAAA,MACxE,GAAG,QAAG;AAAA,UACN,cAAAA,eAAE,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,CAAC,IAAI;AAAA,QACd,UAAU,MAAM,cAAc,KAAK,IAAI,IAAI;AAAA,QAC3C,OAAO,IAAI,UAAU,EAAE,WAAW,IAAI,EAAE,YAAY;AAAA,QACpD,OAAO,EAAE,QAAQ,GAAG,QAAQ,WAAW,MAAM,OAAO;AAAA,MACtD,CAAC;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,YAC7B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,cAC9B,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,IAAI;AAAA,cACrC,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG,MAAM,KAAK;AAAA,cAC5C,cAAAA,eAAE,QAAQ,EAAE,OAAO,IAAI,SAAS,EAAE,cAAc,EAAE,YAAY,GAAG,IAAI,SAAS,EAAE,QAAQ,IAAI,EAAE,QAAQ,CAAC;AAAA;AAAA;AAAA,UAGvG,YAAY,IAAI,IAAI,IAAI,QAAI,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,aAAa,CAAC,IAAI;AAAA,UACjH,IAAI,eAAW,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,GAAG,EAAE,UAAU,CAAC,IAAI;AAAA,UACtE,IAAI,cAAU,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,EAAE,WAAW,CAAC,IAAI;AAAA,QACvE,CAAC;AAAA,QACD,UAAU,KAAK,GAAG,QACd,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,cAC7B,cAAAA,eAAE,YAAY,EAAE,OAAO,EAAE,WAAW,OAAO,OAAO,UAAU,CAAC,MAAwC,SAAS,EAAE,OAAO,KAAK,GAAG,MAAM,EAAE,CAAC;AAAA,cACxI,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,gBAC/B,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc,KAAK,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC;AAAA,gBAChF,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,SAAS,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC;AAAA,YAC3E,CAAC,IAAI,WAAW,IAAI,YAAY,OAAO,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI,IAAI,SACrE,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,eAAe,KAAK,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,IACpF;AAAA,UACN,CAAC;AAAA,QACH,CAAC,QACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI,YAAY,IAAI,QAAQ,EAAE,EAAE,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE;AAAA,MACrI,CAAC;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,YAC9B,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,OAAO,UAAU,UAAU,GAAG,SAAS,MAAM,QAAQ,KAAK,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAG;AAAA,YACtH,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,OAAO,UAAU,UAAU,QAAQ,GAAG,SAAS,MAAM,QAAQ,KAAK,OAAO,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,QAAG;AAAA,MACjI,CAAC;AAAA,MACD,UAAU,KAAK,GAAG,IAAI,WAAO,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,aAAa,KAAK,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC;AAAA,MAC/G,CAAC,UAAU,KAAK,GAAG,KAAK,CAAC,IAAI,WAAW,IAAI,YAAY,OAAO,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI,IAAI,SAC7F,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,eAAe,KAAK,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,IACpF;AAAA,MACJ,IAAI,aAAS,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,eAAe,KAAK,IAAI,IAAI,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI;AAAA,IAC/H,CAAC;AAAA,EACH;AAGA,QAAM,OAAO,OAAO,KAAK;AAEzB,QAAM,gBAAgB,YAAY,QAAQ,YAAY,IAAI,mBAAmB,MAAM,QAAQ,IAAI,CAAC;AAEhG,QAAM,gBAAgB,WAAW,KAAK,KAAK,EAAE;AAE7C,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,QAAQ,OAAO,OAAO,UAAU,CAAC,CAAC,GAAG;AAC9C,eAAW,WAAW,MAAM,gBAAgB,CAAC,GAAG;AAC9C,UAAI,QAAQ,UAAU,QAAS,aAAY,IAAI,QAAQ,IAAI;AAAA,IAC7D;AAAA,EACF;AACA,QAAM,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE;AACnD,QAAM,WAAW,KAAK,SAAS;AAC/B,QAAM,aAAa,CAAC,QAClB,WAAW,UAAU,WAAW,OAAO,CAAC,IAAI,UAAU,IAAI;AAE5D,QAAM,eAAe,KAAK,YAAY,CAAC;AAEvC,aAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,QACpC,cAAAA,eAAE,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO,EAAE,GAAG,EAAE,WAAW,GAAI,aAAa,SAAS,EAAE,WAAW,CAAC,EAAG;AAAA;AAAA,MAEpE,YAAY,CAAC,UAA0B;AACrC,cAAM,UAAU,UAAU,KAAK;AAC/B,YAAI,YAAY,QAAQ,QAAQ,SAAS,aAAa,QAAQ,SAAS,MAAO;AAC9E,cAAM,eAAe;AACrB,oBAAY,MAAM;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,IACV,GAAG;AAAA,MACD,aAAS,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI;AAAA,MACrD,cAAc,SAAS,QACnB,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,sBAAsB,EAAE,OAAO,cAAc,KAAK,QAAG,EAAE,CAAC,CAAC,IAC7F;AAAA,MACJ,SAAS,KAAK;AAAA,MACd,KAAK,IAAI,CAAC,KAAK,MAAM,UAAU,OAAO,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,MAC1D,KAAK,WAAW,QAAI,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC,IAAI;AAAA,MAC/D,cACI,cAAAA,eAAE,YAAY;AAAA,QACZ,OAAO,CAAC,MAAM,SAAS;AAAE,qBAAW,MAAM,MAAM,cAAc,KAAK,CAAC;AAAG,qBAAW,KAAK;AAAA,QAAE;AAAA,QACzF,YAAY,WAAW,KAAK;AAAA,QAC5B;AAAA,MACF,CAAC,IACD;AAAA;AAAA;AAAA;AAAA,UAIJ,cAAAA,eAAE,WAAW;AAAA,QACX,OAAO,EAAE,GAAG,EAAE,WAAW,GAAI,aAAa,SAAS,EAAE,iBAAiB,CAAC,EAAG;AAAA,QAC1E,YAAY,CAAC,UAA0B;AACrC,cAAI,CAAC,YAAY,OAAO,SAAS,EAAG;AACpC,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,sBAAY,MAAM;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,MACV,GAAG;AAAA,YACD,cAAAA;AAAA,UAAE;AAAA,UAAW,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,QAAQ,UAAU,EAAE;AAAA,UACtD,GAAG,EAAE,kBAAkB,CAAC,KAAK,aAAa,MAAM;AAAA,QAAG;AAAA,YACrD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,cAAc,EAAE,EAAE,GAAG,EAAE,kBAAkB,CAAC;AAAA,QAC1E,aAAa,WAAW,QAAI,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC,IAAI;AAAA,QACvE,aAAa,IAAI,CAAC,YAAQ,cAAAA,eAAE,OAAO;AAAA,UACjC,KAAK,IAAI;AAAA,UACT,OAAO,EAAE,GAAG,EAAE,KAAK,SAAS,KAAK;AAAA,UACjC,WAAW;AAAA,UACX,OAAO,EAAE,MAAM;AAAA,UACf,aAAa,CAAC,UAA0B,UAAU,OAAO,EAAE,MAAM,WAAW,MAAM,IAAI,MAAM,MAAM,QAAQ,MAAM,IAAI,QAAQ,GAAG,CAAC;AAAA,UAChI,WAAW;AAAA,QACb,GAAG;AAAA,cACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,gBAC7B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,OAAG,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC;AAAA,gBACtE,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI,QAAQ,EAAE,EAAE,MAAM,GAAG,GAAG,KAAK,EAAE,SAAS,CAAC;AAAA,UACrF,CAAC;AAAA,QACH,CAAC,CAAC;AAAA,MACJ,CAAC;AAAA;AAAA,UAED,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,WAAW,EAAE,EAAE,GAAG;AAAA,YACpD,cAAAA;AAAA,UAAE;AAAA,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,WAAW,CAAC,OAAO,GAAG,OAAO,EAAE,WAAW,EAAE;AAAA,UACtF,UAAU,QAAK,EAAE,YAAY,CAAC,KAAK,KAAK,EAAE,WAAW,CAAC;AAAA,QAAE;AAAA,MAC5D,CAAC;AAAA,IACH,CAAC;AAAA;AAAA,QAED,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,UAC7B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,YACzB,cAAAA;AAAA,UAAE;AAAA,UAAU,EAAE,OAAO,WAAW,QAAQ,EAAE,eAAe,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,EAAE;AAAA,UACjG,GAAG,EAAE,WAAW,CAAC,IAAI,KAAK,MAAM;AAAA,QAAE;AAAA,YACpC,cAAAA;AAAA,UAAE;AAAA,UAAU,EAAE,OAAO,WAAW,OAAO,EAAE,eAAe,EAAE,QAAQ,SAAS,MAAM,UAAU,IAAI,EAAE;AAAA,UAC/F,GAAG,EAAE,UAAU,CAAC,IAAI,OAAO;AAAA,QAAE;AAAA,YAC/B,cAAAA;AAAA,UAAE;AAAA,UAAU,EAAE,OAAO,WAAW,QAAQ,EAAE,eAAe,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,EAAE;AAAA,UACjG,GAAG,EAAE,WAAW,CAAC,IAAI,QAAQ;AAAA,QAAE;AAAA,MACnC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAGA,SAAS,WAAW,EAAE,OAAO,YAAY,EAAE,GAI1B;AACf,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,EAAE;AACnC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,EAAE;AACnC,QAAM,SAAS,MAAY;AACzB,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,KAAK,KAAK,GAAG,IAAI;AACvB,YAAQ,EAAE;AAAG,YAAQ,EAAE;AAAA,EACzB;AACA,aAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,QACtC,cAAAA,eAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,OAAO,MAAM,GAAG,aAAa,EAAE,MAAM,GAAG,OAAO,MAAM,UAAU,CAAC,MAAqC,QAAQ,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,QAChK,cAAAA,eAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,MAAM,EAAE,GAAG,aAAa,GAAG,EAAE,MAAM,CAAC,SAAI,UAAU,UAAK,OAAO,MAAM,UAAU,CAAC,MAAqC,QAAQ,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,QAC/K,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,EAAE,KAAK,CAAC;AAAA,EAC1D,CAAC;AACH;;;AEtgBA,IAAAC,gBAAqH;AAe9G,SAAS,UAAU,EAAE,KAAK,KAAK,QAAQ,OAAO,SAAS,GAAG,MAAM,GAUtD;AACf,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAmB,KAAK;AACpD,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAwB,IAAI;AAExD,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAwB,IAAI;AAC5D,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAwB,IAAI;AAE5D,QAAM,gBAAY,sBAA8B,IAAI;AACpD,oBAAkB,SAAS;AAG3B,QAAM,YAAY,CAAC,QAAgC;AACjD,UAAM,QAAQ,IAAI,SAAS,CAAC;AAC5B,UAAM,OAAO,QAAQ,cAAc,MAAM,WAAW,UAAU,QAAQ,eAAe,MAAM,YAAY,UAAU,MAAM;AACvH,WAAO,QAAQ,CAAC;AAAA,EAClB;AACA,QAAM,QAAQ,CAAC,QAAgC;AAC7C,UAAM,QAAQ,IAAI,SAAS,CAAC;AAC5B,UAAM,OAAO,QAAQ,cAAc,MAAM,WAAW,MAAM,QAAQ,eAAe,MAAM,YAAY,MAAM,MAAM;AAC/G,WAAO,QAAQ,CAAC;AAAA,EAClB;AAEA,QAAM,aAAa,CAAC,KAAmB,SAAmB,QAAwB;AAChF,UAAM,SAAS,aAAa,iBAAiB,IAAI,SAAS,CAAC,GAAG,KAAK,OAAO,GAAG,KAAK,GAAG,CAAC;AAAA,EACxF;AAIA,QAAM,cAAc,CAClBC,WACS;AACT,QAAI,QAAQ,IAAI;AAChB,eAAW,KAAK,YAAY;AAC1B,YAAM,OAAOA,OAAM,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,CAAC;AAC5C,UAAI,SAAS,KAAM;AACnB,cAAQ,iBAAiB,aAAa,OAAO,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,OAAO;AAAA,IAC5E;AACA,UAAM,SAAS,KAAK;AAAA,EACtB;AAGA,QAAM,YAAY,CAAC,SAAiC,SAAS,GAAG,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI;AAC3G,QAAM,cAAc,CAAC,KAAmB,SAA0B,UAAU,GAAG,EAAE,SAAS,IAAI;AAE9F,QAAM,YAAyB,MAAM;AACnC,UAAM,OAAO,WAAW,IAAI,CAAC,QAAQ,SAAS,GAAG,GAAG,aAAa,EAAE,KAAK,CAAC,MAAM,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;AACrH,WAAO,IAAI,IAAI,IAAI;AAAA,EACrB,GAAG;AAIH,QAAM,aAAa,CAAC,KAAmB,MAAc,WAA0B;AAC7E,QAAI,UAAU,UAAU,GAAG;AAC3B,QAAI,MAAM,MAAM,GAAG;AACnB,QAAI,CAAC,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,SAAS,IAAI,EAAG,OAAM,CAAC,GAAG,KAAK,IAAI;AACvE,cAAU,SACL,QAAQ,SAAS,IAAI,IAAI,UAAU,CAAC,GAAG,SAAS,IAAI,IACrD,QAAQ,OAAO,CAAC,MAAM,MAAM,IAAI;AACpC,eAAW,KAAK,SAAS,GAAG;AAAA,EAC9B;AAGA,QAAM,SAAS,CAAC,QAAqG;AACnH,UAAM,UAAU,UAAU,GAAG;AAC7B,UAAM,WAAW,SAAS,GAAG,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,UAAU;AAAA,MAC9D,MAAM,KAAK;AAAA,MACX,aAAa,KAAK,eAAe;AAAA,MACjC,QAAQ,QAAQ,SAAS,KAAK,IAAI;AAAA,MAClC,OAAO;AAAA,IACT,EAAE;AACF,UAAM,QAAQ,IAAI,IAAI,QAAQ,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AACpD,UAAM,QAAQ,MAAM,GAAG,EACpB,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,EACjC,IAAI,CAAC,UAAU,EAAE,MAAM,aAAa,IAAI,QAAQ,OAAO,OAAO,KAAK,EAAE;AACxE,WAAO,CAAC,GAAG,SAAS,GAAG,KAAK;AAAA,EAC9B;AAGA,QAAM,aAAa,CAAC,KAAmB,MAAc,oBAAmC;AACtF,QAAI,SAAS;AAGX,kBAAY,CAAC,IAAI,SAAS,QAAQ;AAChC,YAAI,gBAAiB,QAAO,EAAE,SAAS,QAAQ,OAAO,CAAC,MAAM,MAAM,IAAI,GAAG,IAAI;AAC9E,YAAI,IAAI,SAAS,IAAI,EAAG,QAAO,EAAE,SAAS,KAAK,IAAI,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE;AAC7E,eAAO,QAAQ,SAAS,IAAI,IAAI,OAAO,EAAE,SAAS,CAAC,GAAG,SAAS,IAAI,GAAG,IAAI;AAAA,MAC5E,CAAC;AACD,gBAAU,IAAI;AACd;AAAA,IACF;AACA,QAAI,iBAAiB;AACnB,iBAAW,KAAK,MAAM,KAAK;AAAA,IAC7B,OAAO;AACL,UAAI,UAAU,UAAU,GAAG;AAC3B,UAAI,MAAM,MAAM,GAAG;AACnB,UAAI,IAAI,SAAS,IAAI,EAAG,OAAM,IAAI,OAAO,CAAC,MAAM,MAAM,IAAI;AAAA,eACjD,CAAC,QAAQ,SAAS,IAAI,EAAG,WAAU,CAAC,GAAG,SAAS,IAAI;AAC7D,iBAAW,KAAK,SAAS,GAAG;AAAA,IAC9B;AACA,cAAU,IAAI;AAAA,EAChB;AAGA,QAAM,cAAc,CAAC,KAAmB,SAAuB;AAC7D,QAAI,CAAC,YAAY,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,GAAG;AAClD,gBAAU,EAAE,MAAM,QAAQ,MAAM,EAAE,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC;AAClE;AAAA,IACF;AACA,QAAI,SAAS;AAEX,kBAAY,CAAC,GAAG,SAAS,SAAS;AAAA,QAChC,SAAS,QAAQ,OAAO,CAAC,MAAM,MAAM,IAAI;AAAA,QACzC,KAAK,CAAC,YAAY,GAAG,IAAI,KAAK,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI;AAAA,MACvE,EAAE;AACF,gBAAU,EAAE,MAAM,MAAM,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC;AAC5D;AAAA,IACF;AACA,eAAW,KAAK,MAAM,KAAK;AAC3B,cAAU,EAAE,MAAM,MAAM,MAAM,YAAY,KAAK,IAAI,IAAI,EAAE,aAAa,EAAE,MAAM,IAAI,WAAW,GAAG,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,OAAO,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC;AAAA,EAC3J;AAKA,QAAM,kBAAkB,CAAC,KAAmB,SAAuB;AACjE,QAAI,UAAU,UAAU,GAAG;AAC3B,QAAI,MAAM,MAAM,GAAG;AACnB,QAAI,IAAI,SAAS,IAAI,EAAG,OAAM,IAAI,OAAO,CAAC,SAAS,SAAS,IAAI;AAAA,aACvD,CAAC,QAAQ,SAAS,IAAI,EAAG,WAAU,CAAC,GAAG,SAAS,IAAI;AAC7D,eAAW,KAAK,SAAS,GAAG;AAC5B,cAAU,EAAE,MAAM,MAAM,MAAM,EAAE,wBAAwB,EAAE,MAAM,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC;AAAA,EAC5F;AAIA,QAAM,eAAe,CAAC,KAAmB,YAA+B;AACtE,QAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,IAAK;AACrD,QAAI,QAAQ,SAAS,QAAQ;AAAE,kBAAY,KAAK,QAAQ,IAAI;AAAG;AAAA,IAAO;AACtE,eAAW,KAAK,QAAQ,MAAM,QAAQ,WAAW,IAAI;AACrD,cAAU,EAAE,MAAM,MAAM,MAAM,EAAE,cAAc,EAAE,MAAM,QAAQ,MAAM,IAAI,WAAW,GAAG,GAAG,MAAM,WAAW,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,EAC9H;AAGA,QAAM,aAAa,CAAC,UAAgC;AAClD,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,YAAY,QAAQ,QAAQ,SAAS,OAAQ;AACjD,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,gBAAY,IAAI;AAChB,iBAAa,OAAO,OAAO;AAAA,EAC7B;AAGA,QAAM,aAAa,CAAC,UAAgC;AAClD,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,YAAY,QAAQ,QAAQ,SAAS,OAAQ;AACjD,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,gBAAY,IAAI;AAChB,QAAI,QAAQ,SAAS,MAAO,iBAAgB,OAAO,QAAQ,IAAI;AAAA,EACjE;AAIA,+BAAU,MAAM;AACd,wBAAoB,CAAC,KAAK,YAAY,aAAa,KAAK,OAAO,CAAC;AAChE,WAAO,MAAM,oBAAoB,IAAI;AAAA,EACvC,CAAC;AAED,QAAM,aAAa,CAAC,QAClB,QAAQ,cAAc,EAAE,iBAAiB,IAAI,QAAQ,eAAe,EAAE,sBAAsB,IAAI,EAAE,oBAAoB;AAGxH,QAAM,OAAO,OAAO,KAAK;AACzB,QAAM,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE;AAClD,QAAM,WAAW,KAAK,SAAS;AAC/B,QAAM,aAAa,CAAC,QAClB,WAAW,UAAU,WAAW,OAAO,CAAC,IAAI,SAAS,IAAI;AAE3D,QAAM,YAAY,CAAC,QAAqG;AACtH,QAAI,CAAC,WAAW,GAAG,EAAG,QAAO;AAC7B,eAAO,cAAAC,eAAE,OAAO;AAAA,MACd,KAAK,IAAI;AAAA,MACT,OAAO;AAAA,QACL,GAAG,EAAE;AAAA,QACL,GAAI,IAAI,SAAS,EAAE,aAAa,CAAC;AAAA,QACjC,GAAI,aAAa,IAAI,OAAO,EAAE,iBAAiB,CAAC;AAAA,QAChD,GAAI,aAAa,IAAI,OAAO,EAAE,WAAW,CAAC;AAAA,MAC5C;AAAA,MACA,OAAO,IAAI,YAAY,MAAM,GAAG,GAAG;AAAA,MACnC,YAAY,CAAC,UAA0B;AACrC,YAAI,CAAC,YAAY,OAAO,MAAM,EAAG;AACjC,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB,oBAAY,IAAI,IAAI;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,IACV,GAAG;AAAA;AAAA,UAED,cAAAA,eAAE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO,EAAE,MAAM;AAAA,QACf,OAAO,EAAE;AAAA,QACT,aAAa,CAAC,UAA0B;AACtC,sBAAY,IAAI,IAAI;AACpB,oBAAU,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,MAAM,MAAM,OAAO,QAAQ,IAAI,OAAO,CAAC;AAAA,QACpF;AAAA,QACA,WAAW,MAAM;AAAE,sBAAY,IAAI;AAAG,sBAAY,IAAI;AAAG,qBAAW;AAAA,QAAE;AAAA,MACxE,GAAG,QAAG;AAAA,UACN,cAAAA,eAAE,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,CAAC,IAAI;AAAA,QACd,UAAU,MAAM,WAAW,OAAO,IAAI,MAAM,IAAI,MAAM;AAAA,QACtD,OAAO,IAAI,SAAS,EAAE,UAAU,IAAI,EAAE,WAAW;AAAA,QACjD,OAAO,EAAE,QAAQ,GAAG,QAAQ,WAAW,MAAM,OAAO;AAAA,MACtD,CAAC;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,YAC7B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,cAC9B,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,IAAI;AAAA,UACrC,IAAI,YAAQ,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,GAAG,EAAE,cAAc,CAAC,IAAI;AAAA,UACrE,IAAI,aAAS,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,EAAE,UAAU,CAAC,IAAI;AAAA,QACrE,CAAC;AAAA,QACD,IAAI,gBAAgB,SAAK,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,YAAY,MAAM,GAAG,GAAG,CAAC,IAAI;AAAA,MAC3F,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU;AAAA,IACjD,MAAM,KAAK;AAAA,IACX,aAAa,OAAO,SAAS,WAAW,KAAM,KAAK,eAAe;AAAA,EACpE,EAAE;AAEF,aAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,QACpC,cAAAA,eAAE,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO,EAAE,GAAG,EAAE,WAAW,GAAI,aAAa,SAAS,EAAE,WAAW,CAAC,EAAG;AAAA;AAAA,MAEpE,YAAY,CAAC,UAA0B;AACrC,cAAM,UAAU,UAAU,KAAK;AAC/B,YAAI,YAAY,QAAQ,QAAQ,SAAS,UAAU,QAAQ,SAAS,MAAO;AAC3E,cAAM,eAAe;AACrB,oBAAY,MAAM;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,IACV,GAAG;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,eAAe,CAAC;AAAA,MAC/C,aAAS,cAAAA,eAAE,OAAO,EAAE,OAAO,OAAO,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,IAAI,IAAI;AAAA,MAC9F,KAAK,IAAI,SAAS;AAAA,MAClB,KAAK,WAAW,QAAI,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC,IAAI;AAAA;AAAA;AAAA;AAAA,UAI/D,cAAAA,eAAE,WAAW;AAAA,QACX,OAAO,EAAE,GAAG,EAAE,WAAW,GAAI,aAAa,SAAS,EAAE,iBAAiB,CAAC,EAAG;AAAA,QAC1E,YAAY,CAAC,UAA0B;AACrC,cAAI,CAAC,YAAY,OAAO,MAAM,EAAG;AACjC,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,sBAAY,MAAM;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,MACV,GAAG;AAAA,YACD,cAAAA;AAAA,UAAE;AAAA,UAAW,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,QAAQ,UAAU,EAAE;AAAA,UACtD,GAAG,EAAE,eAAe,CAAC,KAAK,SAAS,MAAM;AAAA,QAAG;AAAA,QAC9C,SAAS,WAAW,QAAI,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC,IAAI;AAAA,QACnE,SAAS,IAAI,CAAC,aAAS,cAAAA,eAAE,OAAO;AAAA,UAC9B,KAAK,KAAK;AAAA,UACV,OAAO,EAAE,GAAG,EAAE,KAAK,SAAS,KAAK;AAAA,UACjC,WAAW;AAAA,UACX,OAAO,EAAE,UAAU;AAAA,UACnB,aAAa,CAAC,UAA0B,UAAU,OAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,OAAO,CAAC;AAAA,UACxG,WAAW;AAAA,QACb,GAAG;AAAA,cACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,gBAC7B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,OAAG,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,gBACvE,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK,YAAY,MAAM,GAAG,GAAG,CAAC;AAAA,UAC/D,CAAC;AAAA,QACH,CAAC,CAAC;AAAA,MACJ,CAAC;AAAA,IACH,CAAC;AAAA;AAAA,QAED,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,UAC7B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,YACzB,cAAAA;AAAA,UAAE;AAAA,UAAU,EAAE,OAAO,WAAW,QAAQ,EAAE,eAAe,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,EAAE;AAAA,UACjG,GAAG,EAAE,WAAW,CAAC,IAAI,KAAK,MAAM;AAAA,QAAE;AAAA,YACpC,cAAAA;AAAA,UAAE;AAAA,UAAU,EAAE,OAAO,WAAW,OAAO,EAAE,eAAe,EAAE,QAAQ,SAAS,MAAM,UAAU,IAAI,EAAE;AAAA,UAC/F,GAAG,EAAE,UAAU,CAAC,IAAI,OAAO;AAAA,QAAE;AAAA,YAC/B,cAAAA;AAAA,UAAE;AAAA,UAAU,EAAE,OAAO,WAAW,QAAQ,EAAE,eAAe,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,EAAE;AAAA,UACjG,GAAG,EAAE,WAAW,CAAC,IAAI,QAAQ;AAAA,QAAE;AAAA,MACnC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AChUA,IAAAC,gBAAqG;;;ACuB9F,SAAS,WAAW,KAAuB;AAChD,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,QAAM,IAAI;AACV,SAAO,EAAE,wBAAwB,UAAa,EAAE,cAAc;AAChE;AAGA,SAAS,SAAS,KAAkC;AAClD,MAAI,CAAC,WAAW,GAAG,EAAG,QAAO;AAC7B,QAAM,YAAa,IAAuD;AAC1E,SAAO,aAAa,OAAO,UAAU,WAAW,aAAc,UAAU,SAAyB;AACnG;AAOA,IAAM,eAAe,CAAC,EAAE,MAAM,QAAQ,YAAY,CAAC,MAAM,EAAE,CAAC;AAO5D,eAAsB,cAAc,QAAqB,aAAqB,MAAoC;AAChH,MAAI;AACF,UAAM,OAAO,MAAM,OAAO,sBAAsB,EAAE,aAAa,aAAa,SAAS,aAAa,CAAC;AACnG,QAAI,OAAO,SAAS,YAAY,SAAS,GAAI,QAAO,EAAE,MAAM,YAAY;AACxE,UAAM,OAAO,6BAA6B,EAAE,MAAM,UAAU,KAAK,CAAC;AAClE,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB,QAAQ;AACN,WAAO,EAAE,MAAM,cAAc;AAAA,EAC/B;AACF;AAGA,eAAsB,cAAc,QAA2C;AAC7E,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,sBAAsB,EAAE,UAAU,OAAO,WAAW,OAAO,SAAS,aAAa,CAAC;AAC9G,UAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,OAAO,CAAC,IAAI;AACjD,QAAI,OAAO,SAAS,YAAY,SAAS,GAAI,QAAO,EAAE,MAAM,YAAY;AACxE,UAAM,OAAO,MAAM,OAAO,4BAA4B,EAAE,KAAK,CAAC;AAC9D,QAAI,OAAO,SAAS,SAAU,QAAO,EAAE,MAAM,cAAc;AAC3D,WAAO,EAAE,MAAM,QAAQ,KAAK;AAAA,EAC9B,QAAQ;AACN,WAAO,EAAE,MAAM,cAAc;AAAA,EAC/B;AACF;AAaO,SAAS,YAAY,QAA+B,UAAkB,MAAoB;AAC/F,QAAM,OAAO,OAAO,SAAS,IAAI;AACjC,QAAM,MAAM,OAAO,UAAU,IAAI;AACjC,QAAM,SAAS,OAAO,WAAW;AACjC,SAAO,OAAO;AACd,SAAO,WAAW;AAClB,SAAO,MAAM;AACb,SAAO,OAAO,GAAG;AACnB;AA4BO,SAAS,mBAAmB,QAAgB,cAAiC;AAClF,SAAO,KAAK,UAAU,EAAE,MAAM,OAAO,MAAM,MAAM,OAAO,MAAM,GAAI,MAAM,QAAQ,YAAY,IAAI,EAAE,aAAa,IAAI,CAAC,EAAG,GAAG,MAAM,CAAC;AACnI;AAOO,SAAS,mBAAmB,MAAuB;AACxD,QAAM,UAAU,OAAO,IAAI,EAAE,KAAK;AAClC,MAAI,YAAY,GAAI,OAAM,IAAI,MAAM,cAAc;AAClD,SAAO,KAAK,MAAM,OAAO;AAC3B;AAYA,SAAS,wBAA+C;AACtD,QAAM,IAAI;AACV,QAAM,MAAM,EAAE;AACd,QAAM,MAAM,EAAE;AACd,SAAO;AAAA,IACL,YAAY,MAAM,IAAI,cAAc,GAAG;AAAA,IACvC,UAAU,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAAA,IACjE,WAAW,CAAC,SAAS,IAAI,gBAAgB,IAAY;AAAA,IACrD,QAAQ,CAAC,MAAM,IAAI,gBAAgB,CAAC;AAAA,EACtC;AACF;AAGO,SAAS,UAAU,KAA4B;AACpD,QAAM,IAAI,QAAQ,SAAY,MAAM,OAAO,WAAW,cAAc,SAAS;AAC7E,QAAM,SAAS,SAAS,CAAC;AACzB,QAAM,QAAQ,WAAW;AACzB,SAAO;AAAA,IACL;AAAA,IACA,UAAU,CAAC,MAAM,SAAU,QAAQ,cAAc,QAAS,MAAM,IAAI,IAAI,QAAQ,QAAQ,EAAE,MAAM,cAAc,CAAC;AAAA,IAC/G,UAAU,MAAO,QAAQ,cAAc,MAAO,IAAI,QAAQ,QAAQ,EAAE,MAAM,cAAc,CAAC;AAAA,IACzF,UAAU,CAAC,MAAM,SAAS,YAAY,sBAAsB,GAAG,MAAM,IAAI;AAAA,EAC3E;AACF;AAQA,eAAsB,iBAAiB,QAAgB,IAAkB,cAAgD;AACvH,QAAM,MAAM,MAAM,UAAU;AAC5B,MAAI;AACF,UAAM,OAAO,mBAAmB,QAAQ,YAAY;AACpD,UAAM,WAAW,qBAAqB,OAAO,IAAI;AACjD,QAAI,IAAI,OAAO;AACb,YAAM,MAAM,MAAM,IAAI,SAAS,UAAU,IAAI;AAC7C,UAAI,IAAI,SAAS,QAAS,QAAO,EAAE,IAAI,MAAM,KAAK,QAAQ;AAC1D,UAAI,IAAI,SAAS,YAAa,QAAO,EAAE,IAAI,OAAO,KAAK,SAAS,WAAW,KAAK;AAAA,IAElF;AACA,QAAI,SAAS,UAAU,IAAI;AAC3B,WAAO,EAAE,IAAI,MAAM,KAAK,UAAU;AAAA,EACpC,SAAS,GAAG;AACV,WAAO,EAAE,IAAI,OAAO,KAAK,WAAW,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE;AAAA,EAC1F;AACF;AAQA,eAAsB,iBAAiB,IAAyC;AAC9E,QAAM,MAAM,MAAM,UAAU;AAC5B,MAAI;AACF,QAAI,IAAI,OAAO;AACb,YAAM,MAAM,MAAM,IAAI,SAAS;AAC/B,UAAI,IAAI,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,MAAM,KAAK,QAAQ;AAC7E,UAAI,IAAI,SAAS,YAAa,QAAO,EAAE,MAAM,YAAY;AAAA,IAC3D;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,EAAE,MAAM,cAAc;AAC/B;;;ADtMA,SAAS,YAA2F;AAClG,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAwB,IAAI;AACxD,QAAM,kBAAc,sBAA6C,IAAI;AACrE,+BAAU,MAAM,MAAM;AACpB,QAAI,YAAY,YAAY,KAAM,cAAa,YAAY,OAAO;AAAA,EACpE,GAAG,CAAC,CAAC;AACL,QAAM,OAAO,CAAC,MAAsB,SAAuB;AACzD,QAAI,YAAY,YAAY,KAAM,cAAa,YAAY,OAAO;AAClE,cAAU,EAAE,MAAM,KAAK,CAAC;AACxB,gBAAY,UAAU,WAAW,MAAM,UAAU,IAAI,GAAG,GAAI;AAAA,EAC9D;AACA,SAAO,EAAE,QAAQ,KAAK;AACxB;AAEO,SAAS,YAAY,EAAE,KAAK,KAAK,QAAQ,GAAG,YAAY,aAAa,aAAa,GAYxE;AACf,QAAM,UAAU,IAAI,WAAW,CAAC;AAChC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,EAAE;AACnC,QAAM,EAAE,QAAQ,KAAK,IAAI,UAAU;AAEnC,QAAM,cAAU,sBAAgC,IAAI;AAEpD,QAAM,eAAe,IAAI,IAAI,IAAI,YAAY,CAAC,CAAC;AAI/C,QAAM,gBAAgB,oBAAI,IAAY;AACtC,aAAW,OAAO,YAAY;AAC5B,eAAW,OAAO,SAAS,GAAG,GAAG,gBAAgB,CAAC,EAAG,eAAc,IAAI,IAAI,IAAI;AAAA,EACjF;AACA,QAAM,YAAY,cAAc,KAAK,KAAK,YAAY;AACtD,QAAM,SAAS,cAAc,SAAS,IAClC,YACA,UAAU,OAAO,CAAC,QAAQ,IAAI,WAAW,YAAY,cAAc,IAAI,IAAI,IAAI,CAAC;AACpF,QAAM,eAAe,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AAI1D,QAAM,cAAc,MAAY;AAC9B,UAAM,aAAa,KAAK,KAAK,KAAK,GAAG,EAAE,QAAQ,CAAC,IAAI,QAAQ,SAAS,CAAC;AACtE,UAAM,OAAO,gBAAgB,KAAK,MAAM;AACxC,gBAAY,WAAW,CAAC,GAAG,SAAS,EAAE,IAAI,MAAM,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC;AAC5E,YAAQ,EAAE;AAAA,EACZ;AAKA,QAAM,cAAc,CAAC,WAAyB;AAC5C,eAAW,gBAAgB,OAAO,MAAM,KAAK,YAAY,CAAC;AAC1D,gBAAY,gBAAgB,OAAO,EAAE;AAAA,EACvC;AAEA,QAAM,eAAe,CAAC,OAAqB;AACzC,UAAM,OAAO,aAAa,SAAS,IAAI,IAAI,YAAY;AACvD,gBAAY,WAAW,KAAK,OAAO;AACnC,QAAI,KAAK,aAAa,UAAa,IAAI,iBAAiB,GAAI,aAAY,gBAAgB,MAAS;AAAA,EACnG;AAIA,QAAM,eAAe,OAAO,WAAkC;AAC5D,QAAI;AACF,YAAM,MAAM,MAAM,iBAAiB,QAAQ,QAAW,YAAY;AAClE,UAAI,IAAI,GAAI,MAAK,MAAM,EAAE,UAAU,CAAC;AAAA,eAC3B,IAAI,UAAW,MAAK,MAAM,EAAE,cAAc,CAAC;AAAA,UAC/C,MAAK,SAAS,GAAG,EAAE,YAAY,CAAC,GAAG,IAAI,UAAU,OAAO,IAAI,UAAU,EAAE,EAAE;AAAA,IACjF,SAAS,GAAG;AACV,WAAK,SAAS,GAAG,EAAE,YAAY,CAAC,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,IACnF;AAAA,EACF;AAIA,QAAM,eAAe,CAAC,SAAuB;AAC3C,QAAI;AACF,YAAM,SAAS,mBAAmB,IAAI;AACtC,YAAM,OAAO,mBAAmB,SAAS,QAAQ,KAAK;AACtD,YAAM,QAAQ,KAAK,SAAS,QAAQ;AACpC,YAAM,YAAY,WAAW,QAAQ,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,KACnF,MAAM,QAAS,OAAsC,YAAY,KAChE,OAAwC,gBAAgB,CAAC,GAAG,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAC9G,CAAC;AACL,YAAM,QAAQ,UAAU,OAAO,CAAC,MAAM,CAAC,aAAa,SAAS,CAAC,CAAC;AAC/D,UAAI,MAAM,SAAS,EAAG,aAAY,gBAAgB,CAAC,GAAG,cAAc,GAAG,KAAK,CAAC;AAC7E,YAAM,aAAa,MAAM,SAAS,IAAI,EAAE,oBAAoB,EAAE,OAAO,MAAM,OAAO,CAAC,IAAI;AACvF,UAAI,SAAS,EAAG,MAAK,MAAM,EAAE,YAAY,IAAI,UAAU;AAAA,WAClD;AACH,oBAAY,WAAW,IAAI;AAC3B,aAAK,MAAM,GAAG,EAAE,UAAU,CAAC,MAAM,KAAK,IAAI,UAAU,EAAE;AAAA,MACxD;AAAA,IACF,SAAS,GAAG;AACV,WAAK,SAAS,GAAG,EAAE,YAAY,CAAC,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,IACnF;AAAA,EACF;AAIA,QAAM,eAAe,YAA2B;AAC9C,QAAI;AACF,YAAM,MAAM,MAAM,iBAAiB;AACnC,UAAI,IAAI,SAAS,QAAQ;AAAE,qBAAa,IAAI,IAAI;AAAG;AAAA,MAAO;AAC1D,UAAI,IAAI,SAAS,aAAa;AAAE,aAAK,MAAM,EAAE,cAAc,CAAC;AAAG;AAAA,MAAO;AACtE,cAAQ,SAAS,MAAM;AAAA,IACzB,SAAS,GAAG;AACV,WAAK,SAAS,GAAG,EAAE,YAAY,CAAC,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,IACnF;AAAA,EACF;AAGA,QAAM,eAAe,CAAC,MAA2C;AAC/D,UAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,MAAE,OAAO,QAAQ;AACjB,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,MAAM,aAAa,OAAO,OAAO,MAAM,CAAC;AACxD,WAAO,UAAU,MAAM,KAAK,SAAS,EAAE,YAAY,CAAC;AACpD,WAAO,WAAW,IAAI;AAAA,EACxB;AAEA,aAAO,cAAAC,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,QACpC,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,MAC/B,aAAS,cAAAA,eAAE,OAAO,EAAE,OAAO,OAAO,SAAS,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,IAAI,IAAI;AAAA,UACzF,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,cAAc,CAAC;AAAA,UAClD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,YAC/B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,cAC/B,cAAAA,eAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,MAAM,EAAE,GAAG,aAAa,EAAE,YAAY,GAAG,OAAO,MAAM,UAAU,CAAC,MAAqC,QAAQ,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,cACjK,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,YAAY,GAAG,EAAE,MAAM,CAAC;AAAA,QAChE,CAAC;AAAA,YACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,cAC/B,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM;AAAE,iBAAK,aAAa;AAAA,UAAE,EAAE,GAAG,EAAE,QAAQ,CAAC;AAAA,cAClF,cAAAA,eAAE,SAAS,EAAE,KAAK,SAAS,MAAM,QAAQ,QAAQ,0BAA0B,OAAO,EAAE,SAAS,OAAO,GAAG,UAAU,aAAa,CAAC;AAAA,QACjI,CAAC;AAAA,MACH,CAAC;AAAA,MACD,QAAQ,WAAW,QAAI,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC,IAAI;AAAA,MAClE,QAAQ,IAAI,CAAC,WAAW;AACtB,cAAM,SAAS,IAAI,iBAAiB,OAAO;AAC3C,mBAAO,cAAAA,eAAE,OAAO,EAAE,KAAK,OAAO,IAAI,OAAO,EAAE,IAAI,GAAG;AAAA,cAChD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,gBAC7B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,kBAC9B,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAG,OAAO,IAAI;AAAA,cACxC,aAAS,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,EAAE,QAAQ,CAAC,IAAI;AAAA,YAC1D,CAAC;AAAA,UACH,CAAC;AAAA,cACD,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,YAAY,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;AAAA,cAC7E,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM;AAAE,iBAAK,aAAa,MAAM;AAAA,UAAE,EAAE,GAAG,EAAE,QAAQ,CAAC;AAAA,cACxF,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,aAAa,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC;AAAA,QACpF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,aAAa,EAAE,KAAK,KAAK,GAAG,aAAa,cAAc,YAAY,SAAS,aAAa,GAaxF;AAEf,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,EAAE;AAC7C,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,KAAK;AAE9C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,EAAE;AAI/C,QAAM,oBAAoB,YAA2B;AACnD,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,QAAQ,WAAW,KAAK,SAAU;AACtC,gBAAY,IAAI;AAChB,QAAI,MAAM,aAAa,OAAO,EAAG,cAAa,EAAE;AAChD,gBAAY,KAAK;AAAA,EACnB;AAGA,QAAM,mBAAmB,CAAC,UAAwB;AAChD,gBAAY,gBAAgB,aAAa,OAAO,CAAC,MAAM,MAAM,KAAK,CAAC;AAAA,EACrE;AACA,QAAM,gBAAgB,MAAY;AAChC,UAAM,QAAQ,WAAW,KAAK;AAC9B,kBAAc,EAAE;AAChB,QAAI,UAAU,MAAM,aAAa,SAAS,KAAK,EAAG;AAClD,gBAAY,gBAAgB,CAAC,GAAG,cAAc,KAAK,CAAC;AAAA,EACtD;AAEA,aAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,QACrC,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG;AAAA,UACpC,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,YAC/B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE,kBAAkB,CAAC;AAAA,YACrD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,oBAAoB,EAAE,MAAM,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAAA,YAClG,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,cAC/B,cAAAA,eAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,MAAM,EAAE,GAAG,aAAa,EAAE,iBAAiB,GAAG,OAAO,WAAW,UAAU,CAAC,MAAqC,aAAa,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,cAChL,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,UAAU,YAAY,UAAU,KAAK,EAAE,WAAW,GAAG,SAAS,MAAM;AAAE,iBAAK,kBAAkB;AAAA,UAAE,EAAE,GAAG,EAAE,cAAc,CAAC;AAAA,QACpJ,CAAC;AAAA,MACH,CAAC;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,eAAe,CAAC;AAAA,UACnD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,YAC/B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE,YAAY,CAAC;AAAA,YAC/C,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,WAAW,CAAC;AAAA,YAC3C,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,cAC/B,cAAAA,eAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG;AAAA,gBAClC,cAAAA,eAAE,SAAS;AAAA,cACT,MAAM;AAAA,cACN,SAAS,IAAI,kBAAkB;AAAA;AAAA,cAE/B,UAAU,CAAC,MAAqC,YAAY,iBAAiB,EAAE,OAAO,OAAO;AAAA,YAC/F,CAAC;AAAA,gBACD,cAAAA;AAAA,cAAE;AAAA,cAAQ,EAAE,OAAO,IAAI,kBAAkB,QAAQ,EAAE,UAAU,EAAE,aAAa;AAAA,cAC1E,IAAI,kBAAkB,QAAQ,EAAE,SAAS,IAAI,EAAE,UAAU;AAAA,YAAC;AAAA,UAC9D,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,YAC/B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE,eAAe,CAAC;AAAA,YAClD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,cAAc,CAAC;AAAA,YAC9C,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,WAAW,EAAE,EAAE,GAAG,aAAa,IAAI,CAAC,cAAU,cAAAA,eAAE,QAAQ;AAAA,UACzF,KAAK;AAAA,UACL,OAAO,EAAE,GAAG,EAAE,UAAU,SAAS,eAAe,YAAY,UAAU,KAAK,EAAE;AAAA,QAC/E,GAAG;AAAA,UACD;AAAA,cACA,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,UAAU,GAAG,OAAO,EAAE,QAAQ,GAAG,SAAS,MAAM,iBAAiB,KAAK,EAAE,GAAG,MAAG;AAAA,QAC7G,CAAC,CAAC,CAAC;AAAA,QACH,aAAa,WAAW,QAAI,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,eAAe,CAAC,IAAI;AAAA,YAC/E,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,WAAW,EAAE,EAAE,GAAG;AAAA,cACpD,cAAAA,eAAE,SAAS;AAAA,YACT,OAAO,EAAE,GAAG,EAAE,OAAO,MAAM,EAAE;AAAA,YAC7B,aAAa,EAAE,aAAa;AAAA,YAC5B,OAAO;AAAA,YACP,UAAU,CAAC,MAAqC,cAAc,EAAE,OAAO,KAAK;AAAA,UAC9E,CAAC;AAAA,cACD,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,UAAU,WAAW,KAAK,MAAM,IAAI,SAAS,cAAc,GAAG,EAAE,mBAAmB,CAAC;AAAA,QACnH,CAAC;AAAA,YACD,cAAAA,eAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG;AAAA,cACxC,cAAAA,eAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,QAAQ,UAAU,EAAE,GAAG,GAAG,EAAE,cAAc,CAAC,KAAK,KAAK,WAAW,UAAU,CAAC,GAAG;AAAA,cAClH,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,WAAW,EAAE,EAAE,GAAG,EAAE,aAAa,CAAC;AAAA,cAClE,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,WAAW,EAAE,EAAE,IAAI,KAAK,aAAa,CAAC,GAAG,IAAI,CAAC,gBAAY,cAAAA,eAAE,QAAQ,EAAE,KAAK,SAAS,OAAO,EAAE,SAAS,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC;AAAA,QAChK,CAAC;AAAA,MACH,CAAC;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,YAC/B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE,YAAY,CAAC;AAAA,YAC/C,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,WAAW,CAAC;AAAA,YAC3C,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,cAC/B,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM;AAE1C,gBAAI,OAAO,QAAQ,EAAE,cAAc,CAAC,EAAG,SAAQ;AAAA,UACjD,EAAE,GAAG,EAAE,aAAa,CAAC;AAAA,QACvB,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AEjSA,IAAAC,gBAAsD;;;ACLtD,IAAAC,gBAAsD;AAStD,SAAS,KAAK,MAA0D;AACtE,SAAO,OAAO,SAAS,WAAW,EAAE,MAAM,MAAM,aAAa,GAAG,IAAI;AACtE;AAEO,SAAS,aAAa,EAAE,OAAO,EAAE,GAAyD;AAC/F,MAAI,MAAM,WAAW,EAAG,YAAO,cAAAC,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC;AACtE,aAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG;AAAA,QACjC,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,UAC9B,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG,GAAG,MAAM,MAAM,IAAI,EAAE,kBAAkB,CAAC,EAAE;AAAA,IAC7E,CAAC;AAAA,IACD,MAAM,IAAI,CAAC,SAAS;AAClB,YAAM,EAAE,MAAM,YAAY,IAAI,KAAK,IAAI;AACvC,iBAAO,cAAAA,eAAE,OAAO,EAAE,KAAK,MAAM,OAAO,EAAE,IAAI,GAAG;AAAA,YAC3C,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,cAC7B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,OAAG,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;AAAA,cAClE,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,eAAe,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC;AAAA,QACxE,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;ADfO,SAAS,YAAY,EAAE,GAAG,QAAQ,OAAO,IAAI,GAOnC;AACf,QAAM,OAAO,SAAS,KAAK,KAAK;AAGhC,QAAM,WAAW,SAAS,QAAQ,SAAS,SAAY,OACnD,KAAK,gBAAgB,SACnB,EAAE,qBAAqB,EAAE,MAAM,KAAK,YAAY,CAAC,IACjD,KAAK,iBAAiB,SACpB,EAAE,gBAAgB,EAAE,SAAS,KAAK,aAAa,SAAS,UAAU,KAAK,aAAa,SAAS,CAAC,IAC9F;AAER,aAAO,cAAAC,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,QACrC,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG;AAAA;AAAA,MAEpC,aAAa,WAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,IAAI;AAAA;AAAA,MAElE,SAAS,QAAQ,KAAK,kBAAkB,YACpC,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,eAAe,CAAC,IACpD;AAAA,MACJ,WAAW,WAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,SAAS,CAAC,IAAI;AAAA,MAC/D,WAAW,QAAQ,SAAS,WACxB,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,aAAa,CAAC,IAC7C;AAAA,MACJ,WAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,eAAe,CAAC,IAAI;AAAA,MAC1D,MAAM,aAAa,aAAS,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,qBAAqB;AAAA,QACnF,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,YAAY,IAAI,UAAQ,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,MACrF,CAAC,CAAC,IAAI;AAAA,MACN,QAAQ,WACJ,OACE;AAAA,YACE,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,cAC9B,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,aAAa,CAAC;AAAA,cAC9C,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG,GAAG,KAAK,SAAS,MAAM,IAAI,EAAE,iBAAiB,CAAC,EAAE;AAAA,QACpF,CAAC;AAAA,YACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,KAAK,QAAQ,EAAE,OAAO,CAAC;AAAA,YAC1D,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE,iBAAiB,CAAC;AAAA,QACpD,IAAI,KAAK,YAAY,CAAC,GAAG,IAAI,iBAAW,cAAAA,eAAE,OAAO,EAAE,KAAK,QAAQ,KAAK,GAAG;AAAA,cACtE,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,IAAI;AAAA,cACzC,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,QAAQ,QAAQ,EAAE,OAAO,CAAC;AAAA,QAC/D,CAAC,CAAC;AAAA,MACJ,IACA,OACF,OACE;AAAA;AAAA;AAAA;AAAA,YAIE,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;AAAA,cAC9B,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,kBAAkB,CAAC;AAAA,cACnD,cAAAA;AAAA,YAAE;AAAA,YAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,YAC5B,GAAG,KAAK,MAAM,MAAM,MAAM,KAAK,iBAAiB,GAAG,IAAI,EAAE,mBAAmB,CAAC;AAAA,UAAE;AAAA,QACnF,CAAC;AAAA,YACD,cAAAA,eAAE,cAAc,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;AAAA,MAC1C,IACA;AAAA,IACR,CAAC;AAAA,EACH,CAAC;AACH;;;AjBnDA,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAC1B,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,cAAc;AAMpB,IAAM,YAA4B,CAAC,aAAa,cAAc,QAAQ;AAGtE,IAAM,eAAe,CAAC,YAAY,qBAAqB,sBAAsB,WAAW,UAAU,OAAO;AAqBlG,SAAS,MAAM,EAAE,GAAG,QAAQ,GAAyD;AAC1F,QAAM,CAAC,KAAK,MAAM,QAAI,wBAAwB,IAAI;AAClD,QAAM,CAAC,KAAK,MAAM,QAAI,wBAA2B,IAAI;AAErD,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA4B,IAAI;AAC5D,QAAM,CAAC,cAAc,eAAe,QAAI,wBAA4B,CAAC,CAAC;AACtE,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAoB,UAAU;AACtD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB,IAAI;AAEtD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,CAAC;AAExC,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,WAAW;AAE5D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAA8B,IAAI;AAGpE,QAAM,cAAU,sBAAO,CAAC;AACxB,QAAM,iBAAa,sBAAO,CAAC;AAG3B,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA6B,MAAS;AAIlE,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA6B,QAAQ;AAGzE,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAA2B,IAAI;AACzD,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB,IAAI;AACtD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAuB,IAAI;AAC7D,QAAM,iBAAa,sBAA6C,IAAI;AAEpE,QAAM,OAAO,MAAY;AACvB,UAAM,aAAa,MAAM,KAAK,IAAI,CAAC,EAAE,EAClC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAS;AACd,UAAI,MAAM,OAAO,KAAM,OAAM,IAAI,MAAM,MAAM,SAAS,eAAe;AACrE,aAAO,KAAK,MAAgB;AAC5B,eAAS,IAAI;AAAA,IACf,CAAC,EACA,MAAM,CAAC,MAAe,SAAS,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,EAC/E;AACA,+BAAU,MAAM,CAAC,CAAC;AAGlB,QAAM,UAAU,MAAqB;AACnC,UAAM,MAAM,EAAE,WAAW;AACzB,UAAM,KAAK,SAAS,UAAU,mBAAmB,MAAM,CAAC,KAAK;AAE7D,UAAM,SAAS,CAACC,WACd,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,SAASA,MAAK,MAAM,KAAK,IAAI,CAAC;AACtD,UAAM,WAAqB,CAAC;AAC5B,UAAM,OAAO,CAACA,WACZ,MAAM,cAAc,OAAOA,MAAK,CAAC,EAC9B,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAkB;AACvB,UAAI,KAAK,OAAO,MAAO,OAAM,IAAI,MAAM,KAAK,SAAS,EAAE,aAAa,CAAC;AACrE,aAAO;AAAA,IACT,CAAC,EACA,MAAM,CAACC,WAAmB;AACzB,eAAS,KAAK,GAAGD,MAAK,KAAK,OAAOC,kBAAiB,QAAQA,OAAM,UAAUA,MAAK,CAAC,EAAE;AACnF,aAAO;AAAA,IACT,CAAC;AAEL,WAAO,QAAQ,IAAI,CAAC,GAAG,UAAU,IAAI,IAAI,GAAG,MAAM,gBAAgB,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,UAAQ;AACvG,UAAI,KAAK,OAAO,MAAO,OAAM,IAAI,MAAM,KAAK,SAAS,kBAAkB;AACvE,aAAO;AAAA,IACT,CAAC,EAAE,MAAM,CAACA,WAAmB;AAC3B,eAAS,KAAK,OAAOA,kBAAiB,QAAQA,OAAM,UAAUA,MAAK,CAAC;AACpE,aAAO;AAAA,IACT,CAAC,CAAC,CAAC,EACA,KAAK,CAAC,CAAC,MAAM,MAAM,KAAK,aAAa,MAAM;AAC1C,UAAI,QAAQ,WAAW,QAAS;AAChC,gBAAU,EAAE,WAAW,MAAM,YAAY,MAAM,QAAQ,IAAI,CAAC;AAC5D,aAAO,aAA0B;AACjC,eAAS,SAAS,SAAS,SAAS,KAAK,IAAI,IAAI,IAAI;AAAA,IACvD,CAAC,EACA,MAAM,CAAC,MAAe;AACrB,UAAI,QAAQ,WAAW,QAAS;AAChC,gBAAU,EAAE,WAAW,MAAM,YAAY,MAAM,QAAQ,KAAK,CAAC;AAC7D,eAAS,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,CAAC;AAAA,IACrD,CAAC;AAAA,EACL;AAGA,+BAAU,MAAM;AAAE,SAAK,QAAQ;AAAA,EAAE,GAAG,CAAC,QAAQ,OAAO,CAAC;AAKrD,QAAM,mBAAmB,MAAY;AACnC,QAAI,UAAU,QAAQ,CAAC,MAAM,MAAO;AACpC,UAAM,QAAiC,CAAC;AACxC,UAAM,SAAS;AACf,eAAW,SAAS,cAAc;AAChC,UAAI,OAAO,OAAO,QAAQ,KAAK,EAAG,OAAM,KAAK,IAAI,OAAO,KAAK;AAAA,IAC/D;AACA,QAAI,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG;AACrC,UAAM,MAAM,EAAE,QAAQ;AAGtB,UAAM,UAAU,WAAW,SAAY,UAAU,mBAAmB,MAAM,CAAC,KAAK;AAChF,UAAM,cAAc,SAAS;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,QAAQ,OAAO,MAAM,CAAC;AAAA,IAC/C,CAAC,EACE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAS;AACd,UAAI,MAAM,OAAO,MAAO,OAAM,IAAI,MAAM,MAAM,SAAS,gBAAgB;AACvE,UAAI,QAAQ,QAAQ,QAAS;AAC7B,gBAAU,CAAC,SAAU,SAAS,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,KAAgB,CAAE;AAClF,eAAS,IAAI;AAAA,IACf,CAAC,EACA,MAAM,CAAC,MAAe;AAGrB,eAAS,GAAG,EAAE,iBAAiB,CAAC,SAAI,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,IAClF,CAAC;AAAA,EACL;AAEA,+BAAU,MAAM;AACd,QAAI,UAAU,QAAQ,CAAC,MAAM,MAAO,QAAO;AAC3C,UAAM,QAAQ,WAAW,kBAAkB,GAAG;AAC9C,WAAO,MAAM;AAAE,mBAAa,KAAK;AAAA,IAAE;AAAA,EAErC,GAAG,CAAC,OAAO,OAAO,MAAM,CAAC;AAIzB,QAAM,eAAe,MAAY;AAC/B,UAAM,oBAAoB,MAAM,KAAK,IAAI,CAAC,EAAE,EACzC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAS,gBAAgB,MAAM,QAAQ,MAAM,OAAO,IAAI,KAAK,UAA+B,CAAC,CAAC,CAAC,EACrG,MAAM,MAAM,gBAAgB,CAAC,CAAC,CAAC;AAAA,EACpC;AACA,+BAAU,MAAM;AAAE,iBAAa;AAAA,EAAE,GAAG,CAAC,CAAC;AAItC,+BAAU,MAAM;AACd,cAAU,CAACC,aAAY;AACrB,UAAIA,aAAY,OAAW,QAAOA;AAClC,YAAM,QAAQ,aAAa,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC;AACnE,aAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,YAAY,CAAC,MAAc,OAAqB,SAAe;AACnE,QAAI,WAAW,YAAY,KAAM,cAAa,WAAW,OAAO;AAChE,aAAS,IAAI;AACb,iBAAa,IAAI;AACjB,eAAW,UAAU,WAAW,MAAM,SAAS,IAAI,GAAG,IAAI;AAAA,EAC5D;AAIA,QAAM,aAAa,MAAY;AAC7B,YAAQ,WAAW;AACnB,aAAS,IAAI;AAAA,EACf;AAEA,MAAI,QAAQ,MAAM;AAChB,eAAO,cAAAC,eAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,SAAS,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC;AAAA,EACtE;AAKA,QAAM,OAAO,SAAS,KAAK,MAAM;AACjC,QAAM,OAAe,QACjB;AAAA,IACE,GAAG;AAAA,IACH,UAAU,MAAM,YAAY,KAAK;AAAA,IACjC,mBAAmB,MAAM,qBAAqB,KAAK;AAAA,IACnD,oBAAoB,MAAM,sBAAsB,KAAK;AAAA,IACrD,SAAS,MAAM,WAAW,KAAK;AAAA,IAC/B,QAAQ,MAAM,UAAU,KAAK;AAAA,IAC7B,OAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,IACA;AAEJ,QAAM,aAAa,CAAC,OAAe,UAAyB;AAC1D,UAAM,MAAM,UAAU,SAAY,mBAAmB;AACrD,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,CAAC;AAAA,IACvC,CAAC,EACE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAS;AACd,UAAI,MAAM,OAAO,KAAM,OAAM,IAAI,MAAM,MAAM,SAAS,cAAc;AACpE,aAAO,KAAK,MAAgB;AAC5B,eAAS,IAAI;AACb,iBAAW,CAAC,MAAM,IAAI,CAAC;AAAA,IACzB,CAAC,EACA,MAAM,CAAC,MAAe,SAAS,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,EAC/E;AAKA,QAAM,OAAO,CAAC,OAAkB,UAAyB;AACvD,aAAS,CAAC,OAAO;AAAA,MACf,GAAI,KAAK,EAAE,OAAO,MAAM;AAAA,MACxB,CAAC,KAAK,GAAG;AAAA,MACT,OAAO;AAAA,IACT,EAAE;AAAA,EACJ;AAIA,QAAM,OAAO,MAAY;AACvB,QAAI,UAAU,QAAQ,OAAQ;AAC9B,UAAM,gBAAgB,CAAC,YAAY,qBAAqB,sBAAsB,WAAW,UAAU,OAAO;AAC1G,UAAM,QAAiC,CAAC;AACxC,eAAW,SAAS,eAAe;AACjC,UAAI,OAAO,OAAO,OAAO,KAAK,EAAG,OAAM,KAAK,IAAI,MAAM,KAAK;AAAA,IAC7D;AACA,cAAU,IAAI;AACd,UAAM,kBAAkB;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,QAAQ,MAAM,CAAC;AAAA,IACxC,CAAC,EACE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAS;AACd,UAAI,MAAM,OAAO,KAAM,OAAM,IAAI,MAAM,MAAM,SAAS,aAAa;AACnE,aAAO,KAAK,MAAgB;AAC5B,iBAAW;AACX,eAAS,IAAI;AACb,iBAAW,CAAC,MAAM,IAAI,CAAC;AACvB,gBAAU,EAAE,QAAQ,CAAC;AAAA,IACvB,CAAC,EACA,MAAM,CAAC,MAAe,SAAS,GAAG,EAAE,UAAU,CAAC,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE,CAAC,EACjG,QAAQ,MAAM,UAAU,KAAK,CAAC;AAAA,EACnC;AAIA,QAAM,aAAa,CAAC,UAA6B;AAC/C,UAAM,kBAAkB;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,QAAQ,MAAM,CAAC;AAAA,IACxC,CAAC,EACE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAS;AACd,UAAI,MAAM,OAAO,KAAM,OAAM,IAAI,MAAM,MAAM,SAAS,cAAc;AACpE,aAAO,KAAK,MAAgB;AAC5B,eAAS,IAAI;AACb,iBAAW,CAAC,MAAM,IAAI,CAAC;AAAA,IACzB,CAAC,EACA,MAAM,CAAC,MAAe,SAAS,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,EAC/E;AAEA,QAAM,cAAc;AAMpB,QAAM,OAAO,UAAU,MAAM,WAAW;AAIxC,QAAM,WAAW,CAAC,MAAc,aAA6B;AAC3D,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAS,YAAwC,IAAI;AAC3D,UAAM,KAAK,OAAO,UAAU,aAAc,MAAsC,QAAQ,IAAI;AAC5F,WAAO,OAAO,OAAO,YAAY,OAAO,KAAK,KAAK;AAAA,EACpD;AACA,QAAM,WAAW,MAAY;AAC3B,QAAI,WAAW,QAAQ,OAAO,cAAc,QAAQ,OAAO,WAAW,QAAQ,OAAO,eAAe,MAAM;AACxG,gBAAU,EAAE,YAAY,GAAG,KAAK;AAChC;AAAA,IACF;AACA,SAAK,UAAU,OAAO,sBAAsB,MAAM,QAAQ,WAAW,IAAI,sBAAsB,MAAM,QAAQ,WAAW,CAAC;AACzH,cAAU,OAAO,EAAE,YAAY,IAAI,EAAE,WAAW,CAAC;AAAA,EACnD;AAGA,QAAM,WAAW,CAAC,KAAmB,SAAiC;AACpE,UAAMC,QAAO,SAAS,GAAG;AACzB,QAAIA,UAAS,UAAaA,UAAS,KAAM,QAAO;AAChD,YAAQA,MAAK,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,SAAS,IAAI;AAAA,EAClE;AAMA,QAAM,gBAAgB,CAAC,OAAsB;AAC3C,eAAW,EAAE;AACb,QAAI,CAAC,GAAI;AACT,QAAI,WAAW,QAAQ,UAAU,KAAK,CAAC,QAAQ,OAAO,GAAG,MAAM,IAAI,GAAG;AACpE,gBAAU,EAAE,cAAc,GAAG,KAAK;AAClC;AAAA,IACF;AACA,UAAM,OAAO,aAAa,MAAM,QAAQ,QAAQ;AAChD,QAAI,KAAK,WAAW,GAAG;AACrB,gBAAU,EAAE,cAAc,GAAG,KAAK;AAClC;AAAA,IACF;AACA,SAAK,UAAU,yBAAyB,MAAM,MAAM,QAAQ,CAAC;AAC7D,UAAM,SAAS,oBAAoB,IAAI;AACvC,SAAK,YAAY,OAAO,QAAQ;AAChC,SAAK,qBAAqB,OAAO,iBAAiB;AAClD,SAAK,sBAAsB,OAAO,kBAAkB;AACpD,UAAM,UAAU,mBAAmB,MAAM,QAAQ;AACjD,cAAU,QAAQ,SAAS,IACvB,GAAG,EAAE,aAAa,CAAC,IAAI,EAAE,sBAAsB,EAAE,OAAO,QAAQ,KAAK,QAAG,EAAE,CAAC,CAAC,KAC5E,EAAE,aAAa,CAAC;AAAA,EACtB;AAIA,QAAM,WAAW,MAAY;AAC3B,UAAM,kBAAkB;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC,EACE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAS;AACd,UAAI,MAAM,OAAO,KAAM,OAAM,IAAI,MAAM,MAAM,SAAS,cAAc;AACpE,aAAO,KAAK,MAAgB;AAC5B,iBAAW;AACX,eAAS,IAAI;AACb,iBAAW,CAAC,MAAM,IAAI,CAAC;AACvB,gBAAU,EAAE,SAAS,CAAC;AAAA,IACxB,CAAC,EACA,MAAM,CAAC,MAAe,SAAS,GAAG,EAAE,WAAW,CAAC,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE,CAAC;AAAA,EACvG;AAIA,QAAM,aAAa,CAAC,SAA0B;AAC5C,UAAM,WAAW,SAAS,cAAc,SAAS,YAAY,SAAS;AACtE,QAAI,SAAS;AACX,UAAI,OAAO,SAAS,CAAC,OAAO,QAAQ,EAAE,gBAAgB,CAAC,EAAG;AAC1D,iBAAW;AAAA,IACb;AACA,YAAQ,IAAI;AACZ,kBAAc,SAAS,UAAU,UAAU,QAAQ;AAAA,EACrD;AAGA,QAAM,eAAe,CAAC,SAAmC;AACvD,QAAI,OAAO,SAAS,CAAC,OAAO,QAAQ,EAAE,gBAAgB,CAAC,EAAG;AAC1D,eAAW;AACX,cAAU,IAAI;AAAA,EAChB;AAMA,QAAM,eAAe,CAAC,eAAyC;AAC7D,UAAM,OAAO,WAAW,KAAK;AAC7B,QAAI,KAAK,WAAW,EAAG,QAAO,QAAQ,QAAQ,KAAK;AACnD,WAAO,MAAM,oBAAoB;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,UAAU,KAAK,YAAY,CAAC;AAAA,UAC5B,mBAAmB,KAAK,qBAAqB,CAAC;AAAA,UAC9C,oBAAoB,KAAK,sBAAsB,CAAC;AAAA,UAChD,SAAS,KAAK,WAAW,CAAC;AAAA,UAC1B,QAAQ,KAAK,UAAU,CAAC;AAAA,UACxB,OAAO,KAAK,SAAS,CAAC;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH,CAAC,EACE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EACpB,KAAK,CAAC,SAAS;AACd,UAAI,MAAM,OAAO,KAAM,OAAM,IAAI,MAAM,MAAM,SAAS,EAAE,kBAAkB,CAAC;AAC3E,WAAK;AACL,mBAAa;AACb,gBAAU,EAAE,gBAAgB,GAAG,IAAI;AACnC,aAAO;AAAA,IACT,CAAC,EACA,MAAM,CAAC,MAAe;AACrB,gBAAU,GAAG,EAAE,kBAAkB,CAAC,SAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,KAAK;AACzF,aAAO;AAAA,IACT,CAAC;AAAA,EACL;AAEA,QAAM,UAAU,CAAC,KAAgB,cAC/B,cAAAD,eAAE,UAAU,EAAE,KAAK,OAAO,SAAS,MAAM,EAAE,eAAe,EAAE,QAAQ,SAAS,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK;AAG7G,QAAM,aAAa,CAAC,QAClB,QAAQ,cAAc,EAAE,iBAAiB,IAAI,QAAQ,eAAe,EAAE,sBAAsB,IAAI,EAAE,oBAAoB;AACxH,QAAM,aAAa,OAAO,UAAU;AAOpC,QAAM,aAAa,CAAC,IAAY,OAAe,MAAoB,WAAkC;AACnG,UAAM,SAAS,WAAW;AAC1B,UAAM,MAAM,WAAW,UAAa,WAAW;AAC/C,UAAM,aAAa,OAAO,KAAK,KAAK,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE;AAC3D,eAAO,cAAAA,eAAE,UAAU;AAAA,MACjB,KAAK;AAAA,MACL,MAAM;AAAA,MACN,WAAW,IAAI;AAAA,MACf,eAAe,UAAU;AAAA,MACzB,SAAS,MAAM,aAAa,EAAE;AAAA,MAC9B,OAAO,MACH,GAAG,KAAK,WAAM,EAAE,QAAQ,CAAC,KACzB,aAAa,IAAI,GAAG,KAAK,SAAM,EAAE,oBAAoB,EAAE,GAAG,WAAW,CAAC,CAAC,KAAK;AAAA,IAClF,GAAG;AAAA,UACD,cAAAA,eAAE,QAAQ,EAAE,WAAW,IAAI,SAAS,eAAe,UAAU,OAAU,GAAG,IAAI;AAAA,UAC9E,cAAAA,eAAE,QAAQ,EAAE,WAAW,IAAI,SAAS,GAAG,KAAK;AAAA,MAC5C,UAAM,cAAAA,eAAE,QAAQ,EAAE,WAAW,IAAI,UAAU,aAAa,KAAK,GAAG,EAAE,QAAQ,CAAC,IAAI;AAAA,MAC/E,CAAC,OAAO,aAAa,QAAI,cAAAA,eAAE,QAAQ,EAAE,WAAW,IAAI,UAAU,aAAa,KAAK,GAAG,OAAO,UAAU,CAAC,IAAI;AAAA,IAC3G,CAAC;AAAA,EACH;AAEA,aAAO,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,QAKlC,cAAAA,eAAE,OAAO,EAAE,KAAK,WAAW,WAAW,IAAI,OAAO,GAAG;AAAA,UAClD,cAAAA,eAAE,OAAO,EAAE,WAAW,IAAI,SAAS,MAAM,SAAS,cAAc,EAAE,aAAa,EAAE,GAAG;AAAA,QAClF,GAAG,aAAa,IAAI,CAAC,MAAM,WAAW,EAAE,IAAI,EAAE,UAAM,cAAAA,eAAE,+DAA+B,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;AAAA,MAC/G,CAAC;AAAA,IACH,CAAC;AAAA;AAAA;AAAA;AAAA,QAID,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG;AAAA,UAC1B,cAAAA,eAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG;AAAA,YAChC,cAAAA,eAAE,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,KAAK,eAAe,SAAS,gBAAgB,SAAS,eAAe,QAAQ,OAAO,EAAE,MAAM,OAAO,EAAE,GAAG;AAAA,cACjN,cAAAA,eAAE,QAAQ,EAAE,GAAG,6DAA6D,CAAC;AAAA,cAC7E,cAAAA,eAAE,QAAQ,EAAE,GAAG,YAAY,CAAC;AAAA,cAC5B,cAAAA,eAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,cAC3B,cAAAA,eAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,cAC3B,cAAAA,eAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;AAAA,QAC5B,CAAC;AAAA,QACD,EAAE,KAAK;AAAA,MACT,CAAC;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,QACzB,QAAQ,YAAY,EAAE,cAAc,CAAC;AAAA,QACrC,QAAQ,SAAS,EAAE,WAAW,CAAC;AAAA,QAC/B,QAAQ,WAAW,EAAE,aAAa,CAAC;AAAA,MACrC,CAAC;AAAA,UACD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG;AAAA,QACjC,SAAS,cAAc,SAAS,cAC5B,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,UAAU,IAAI,CAAC,YAAQ,cAAAA,eAAE,UAAU;AAAA,UAC5D;AAAA,UACA,OAAO,cAAc,MAChB,UAAU,MAAM,EAAE,mBAAmB,EAAE,aACxC,UAAU,MAAM,EAAE,eAAe,EAAE;AAAA,UACvC,SAAS,MAAM,SAAS,GAAG;AAAA;AAAA,UAE3B,YAAY,CAAC,UAA0B;AACrC,gBAAI,UAAU,KAAK,MAAM,KAAM;AAC/B,kBAAM,eAAe;AACrB,yBAAa,GAAG;AAAA,UAClB;AAAA,UACA,aAAa,MAAM,aAAa,CAACD,aAAaA,aAAY,MAAM,OAAOA,QAAQ;AAAA,UAC/E,QAAQ,CAAC,UAA0B;AACjC,kBAAM,UAAU,UAAU,KAAK;AAC/B,yBAAa,IAAI;AACjB,gBAAI,YAAY,KAAM;AACtB,kBAAM,eAAe;AACrB,wBAAY,KAAK,OAAO;AAAA,UAC1B;AAAA,QACF,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,IACpB;AAAA,QACJ,eAAe,SAAS,cAAc,SAAS,eAC3C,cAAAC,eAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,CAAC,IAC7E;AAAA,QACJ,SAAS,cAAc,SAAS,cAC5B,cAAAA,eAAE,SAAS;AAAA,UACT,OAAO,EAAE,GAAG,EAAE,OAAO,SAAS,eAAe,YAAY,UAAU,KAAK,GAAG,QAAQ,WAAW,YAAY,SAAS;AAAA,UACnH,OAAO,EAAE,mBAAmB;AAAA,QAC9B,GAAG;AAAA,cACD,cAAAA,eAAE,SAAS;AAAA,YACT,MAAM;AAAA,YACN,SAAS;AAAA,YACT,UAAU,CAAC,MAAwC,cAAc,EAAE,OAAO,OAAO;AAAA,YACjF,OAAO,EAAE,QAAQ,GAAG,QAAQ,UAAU;AAAA,UACxC,CAAC;AAAA,UACD,EAAE,eAAe;AAAA,QACnB,CAAC,IACD;AAAA,QACJ,SAAS,iBACL,cAAAA,eAAE,SAAS;AAAA,UACT,OAAO,EAAE,GAAG,EAAE,OAAO,SAAS,eAAe,YAAY,UAAU,KAAK,GAAG,QAAQ,WAAW,YAAY,SAAS;AAAA,UACnH,OAAO,EAAE,QAAQ;AAAA,QACnB,GAAG;AAAA,cACD,cAAAA,eAAE,SAAS;AAAA,YACT,MAAM;AAAA,YACN,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAO,EAAE,QAAQ,GAAG,QAAQ,UAAU;AAAA,UACxC,CAAC;AAAA,UACD,EAAE,UAAU;AAAA,QACd,CAAC,IACD;AAAA,YACJ,cAAAA,eAAE,UAAU;AAAA,UACV,OAAO,OAAO,QAAQ,EAAE,eAAe,EAAE;AAAA,UACzC,UAAU,CAAC,OAAO,SAAS;AAAA,UAC3B,SAAS;AAAA,QACX,GAAG,EAAE,MAAM,CAAC;AAAA;AAAA;AAAA,YAGZ,cAAAA,eAAE,UAAU,EAAE,OAAO,EAAE,SAAS,SAAS,MAAM;AAAE,eAAK,QAAQ,EAAE,KAAK,MAAM,iBAAiB,CAAC;AAAA,QAAE,EAAE,GAAG,EAAE,SAAS,CAAC;AAAA;AAAA,QAEhH,YAAY,SAAY,WAAO,cAAAA;AAAA,UAAE;AAAA,UAAU,EAAE,OAAO,EAAE,SAAS,SAAS,SAAS,cAAc,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE;AAAA,cAC3H,cAAAA,eAAE,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,eAAe,OAAO,GAAG;AAAA,gBAC7F,cAAAA,eAAE,QAAQ,EAAE,GAAG,sBAAsB,QAAQ,gBAAgB,aAAa,KAAK,eAAe,QAAQ,CAAC;AAAA,UACzG,CAAC;AAAA,QAAC;AAAA,MACN,CAAC;AAAA,IACH,CAAC;AAAA;AAAA,QAED,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG;AAAA,MACzC,YAAQ,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI;AAAA,MACtD,YAAQ,cAAAA,eAAE,OAAO,EAAE,OAAO,cAAc,QAAQ,EAAE,QAAQ,EAAE,SAAS,GAAG,KAAK,IAAI;AAAA,MACjF,UAAU,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,GAAG,aACjD,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,cAAc,CAAC,IAC9C;AAAA,MACJ,KAAK,kBAAkB,SAAS,SAAS,gBACrC,cAAAA,eAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,eAAe,CAAC,IACpD;AAAA,IACN,CAAC;AAAA;AAAA;AAAA;AAAA,QAID,cAAAA;AAAA,MAAE;AAAA,MAAO,EAAE,KAAK,QAAQ,OAAO,EAAE,KAAK;AAAA,MACpC,SAAS,aACL;AAAA,YACE,cAAAA,eAAE,cAAc,EAAE,KAAK,YAAY,KAAK,MAAM,KAAK,QAAQ,OAAO,SAAS,GAAG,UAAU,OAAO,KAAK,CAAC;AAAA,YACrG,cAAAA,eAAE,aAAa,EAAE,KAAK,WAAW,GAAG,QAAQ,OAAO,KAAK,WAAW,CAAC;AAAA,MACtE,IACA,SAAS,UACP;AAAA,YACE,cAAAA,eAAE,WAAW,EAAE,KAAK,SAAS,KAAK,MAAM,KAAK,QAAQ,OAAO,SAAS,GAAG,OAAO,KAAK,CAAC;AAAA,YACrF,cAAAA,eAAE,aAAa,EAAE,KAAK,WAAW,GAAG,QAAQ,OAAO,KAAK,WAAW,CAAC;AAAA,MACtE,IACA;AAAA,YACE,cAAAA,eAAE,aAAa;AAAA,UACb,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA,cAAc,IAAI,gBAAgB,CAAC;AAAA,QACrC,CAAC;AAAA,YACD,cAAAA,eAAE,cAAc;AAAA,UACd,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,SAAU,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,GAAG,QAAQ,SAAU;AAAA,UACnF,SAAS;AAAA,UACT,cAAc,IAAI,gBAAgB,CAAC;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IAAC;AAAA,EACX,CAAC;AACH;;;AmBpoBO,IAAM,OAAO;AAAA,EAClB,IAAI;AAAA,IACF,KAAK;AAAA,IACL,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,MAAM;AAAA,IACN,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,eAAe;AAAA,IACf,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,iBAAiB;AAAA;AAAA,IAEjB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,cAAc;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,cAAc;AAAA;AAAA,IAEd,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AAAA,EACA,IAAI;AAAA,IACF,KAAK;AAAA,IACL,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,MAAM;AAAA,IACN,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,eAAe;AAAA,IACf,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,iBAAiB;AAAA;AAAA,IAEjB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,cAAc;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,cAAc;AAAA;AAAA,IAEd,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AACF;;;AC7SA,IAAM,KAAK;AASX,IAAI;AAGG,SAAS,UAAqB;AACnC,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,CAAC,KAAK,WAAW;AACtB,QAAI,OAAQ,KAAK,GAA8B,GAAG,KAAK;AACvD,QAAI,WAAW,QAAW;AACxB,iBAAW,QAAQ,OAAO,KAAK,MAAM,EAAG,QAAO,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,KAAK,OAAO,OAAO,IAAI,CAAC,CAAC;AAAA,IAClG;AACA,WAAO;AAAA,EACT;AACF;AAGO,SAAS,YAAY,KAA0B;AACpD,QAAM,SAAU,IAAiD;AACjE,MAAI,WAAW,UAAa,OAAO,OAAO,SAAS,YAAY;AAC7D,YAAQ,KAAK,uHAAgE;AAC7E;AAAA,EACF;AAIA,MAAI,OAAO,MAAM;AACf,QAAI;AACF,aAAO,OAAO,SAAS,IAAI,IAAI;AAAA,IACjC,SAAS,OAAO;AACd,cAAQ,MAAM,0DAA0D,KAAK;AAC7E,aAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAAA,EACF,GAAG,kCAAkC;AACrC,MAAI;AACF,YAAQ,OAAO,KAAK,EAAE;AAAA,EACxB,SAAS,OAAO;AACd,YAAQ,KAAK,4FAA8D,KAAK;AAAA,EAClF;AACF;;;AC/CM,IAAAE,sBAAA;AAHC,SAAS,aAA0B;AACxC,SACE,6CAAC,SAAI,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,QAAQ,eAAe,SAAS,GAC5E,uDAAC,SAAM,GAAG,QAAQ,GAAG,GACvB;AAEJ;;;ACPO,IAAM,iBAAiB;AAE9B,eAAsB,aAAgB,MAAc,SAAmC;AACrF,QAAM,WAAW,MAAM,MAAM,iBAAiB,MAAM,OAAO;AAC3D,QAAM,OAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACpD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,KAAK,SAAS,qBAAqB,OAAO,SAAS,MAAM,IAAI,GAAG;AAClG,SAAO;AACT;AAEO,IAAM,WAAW;AAAA,EACtB,MAAM,MAA8B,aAA4B,SAAS,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC;AAAA,EACpH,cAAc,MACZ,MAAM,6BAA6B,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC,EAC3E,KAAK,CAAC,aAAa,SAAS,KAAK,CAA+C,EAChF,KAAK,CAAC,SAAS;AACd,QAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,KAAK,WAAW,QAAW;AAC1E,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,WAAO;AAAA,EACT,CAAC;AAAA,EACL,iBAAiB,CAAC,MAAc,YAC9B,MAAM,6BAA6B,mBAAmB,IAAI,CAAC,IAAI;AAAA,IAC7D,QAAQ;AAAA,IACR,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB;AAAA,IAC1E,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,EAClC,CAAC,EAAE,KAAK,CAAC,aAAa,SAAS,KAAK,CAA6C,EAC9E,KAAK,CAAC,SAAS;AACd,QAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,KAAK,SAAS,eAAe;AAC3D,WAAO;AAAA,EACT,CAAC;AAAA,EACL,kBAAkB,CAAC,UAAkB,YACnC,MAAM,8BAA8B,mBAAmB,QAAQ,CAAC,IAAI;AAAA,IAClE,QAAQ;AAAA,IACR,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB;AAAA,IAC1E,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,EAClC,CAAC,EAAE,KAAK,CAAC,aAAa,SAAS,KAAK,CAA+D,EAChG,KAAK,CAAC,SAAS;AACd,QAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,KAAK,SAAS,eAAe;AAC3D,WAAO;AAAA,EACT,CAAC;AAAA;AAAA,EAEL,cAAc,MACZ,MAAM,8BAA8B,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC,EAC5E,KAAK,CAAC,aAAa,SAAS,KAAK,CAA+C,EAChF,KAAK,CAAC,SAAS;AACd,QAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,CAAC,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC7E,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,WAAO;AAAA,EACT,CAAC;AAAA,EACL,uBAAuB,CAAC,UAAkB,MAAc,YACtD,MAAM,8BAA8B,mBAAmB,QAAQ,CAAC,WAAW,mBAAmB,IAAI,CAAC,IAAI;AAAA,IACrG,QAAQ;AAAA,IACR,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB;AAAA,IAC1E,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,EAClC,CAAC,EAAE,KAAK,CAAC,aAAa,SAAS,KAAK,CAA6C,EAC9E,KAAK,CAAC,SAAS;AACd,QAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,KAAK,SAAS,eAAe;AAC3D,WAAO;AAAA,EACT,CAAC;AAAA,EACL,wBAAwB,CAAC,UAAkB,UAAkB,YAC3D,MAAM,8BAA8B,mBAAmB,QAAQ,CAAC,YAAY,mBAAmB,QAAQ,CAAC,IAAI;AAAA,IAC1G,QAAQ;AAAA,IACR,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB;AAAA,IAC1E,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,EAClC,CAAC,EAAE,KAAK,CAAC,aAAa,SAAS,KAAK,CAA6C,EAC9E,KAAK,CAAC,SAAS;AACd,QAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,KAAK,SAAS,eAAe;AAC3D,WAAO;AAAA,EACT,CAAC;AAAA,EACL,aAAa,CAAC,aACZ,MAAM,8BAA8B,mBAAmB,QAAQ,CAAC,UAAU;AAAA,IACxE,QAAQ;AAAA,IACR,SAAS,EAAE,QAAQ,mBAAmB;AAAA,EACxC,CAAC,EAAE,KAAK,CAAC,aAAa,SAAS,KAAK,CAA6C,EAC9E,KAAK,CAAC,SAAS;AACd,QAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,KAAK,SAAS,cAAc;AAC1D,WAAO;AAAA,EACT,CAAC;AAAA,EACL,cAAc,CAAC,MAAc,aAAuB,CAAC,MACnD,aAAa,YAAY,EAAE,QAAQ,QAAQ,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB,GAAG,MAAM,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,CAAC;AAAA,EACtK,cAAc,CAAC,UAAkB,SAC/B,aAAa,YAAY,mBAAmB,QAAQ,CAAC,IAAI,EAAE,QAAQ,SAAS,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB,GAAG,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;AAAA;AAAA,EAE3L,qBAAqB,CAAC,UAAkB,eACtC,aAAa,YAAY,mBAAmB,QAAQ,CAAC,IAAI,EAAE,QAAQ,SAAS,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB,GAAG,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,EACjM,cAAc,CAAC,aACb,aAAa,YAAY,mBAAmB,QAAQ,CAAC,IAAI,EAAE,QAAQ,UAAU,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC;AAAA,EACxH,iBAAiB,CAAC,UAAkB,eAClC,aAAa,YAAY,mBAAmB,QAAQ,CAAC,WAAW,EAAE,QAAQ,OAAO,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB,GAAG,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,EACtM,aAAa,CAAC,SACZ,aAAa,WAAW,mBAAmB,IAAI,CAAC,IAAI,EAAE,QAAQ,UAAU,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC;AAAA,EACnH,cAAc,CAAC,UACb,aAAa,WAAW,EAAE,QAAQ,QAAQ,SAAS,EAAE,QAAQ,oBAAoB,gBAAgB,mBAAmB,GAAG,MAAM,KAAK,UAAU,KAAK,EAAE,CAAC;AAAA;AAAA,EAEtJ,QAAQ,MACN,MAAM,qBAAqB,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC,EACnE,KAAK,CAAC,aAAa,SAAS,KAAK,CAA+C,EAChF,KAAK,CAAC,SAAS;AACd,QAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,CAAC,MAAM,QAAQ,KAAK,MAAM,GAAG;AAC5E,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AACA,WAAO;AAAA,EACT,CAAC;AACP;;;AC1GO,SAAS,cAAc,OAA2C;AACvE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,KAAK,SAAS,MAAM;AAAA,EAC5B,CAAC;AACH;AAEA,eAAsB,aAAa,OAAwB,QAAgB,KAAqC;AAC9G,MAAI,MAAM,QAAQ;AAChB,UAAM,YAAY;AAClB,UAAM,OAAO,MAAM,cAAc,SAAS;AAC1C,UAAM,OAAO,WAAW,KAAK,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,IAAI;AACjE,QAAI,KAAK,EAAE,MAAM,KAAK,CAAC;AACvB;AAAA,EACF;AACA,MAAI,MAAM,aAAa;AACrB,UAAM,WAAW;AACjB,UAAM,SAAS,SAAS,aAAa;AACrC,UAAM,MAAyB,CAAC;AAChC,WAAO,MAAM;AACX,YAAM,QAAQ,MAAM,IAAI,QAA2B,CAAC,SAAS,WAAW;AACtE,eAAO,YAAY,SAAS,MAAM;AAAA,MACpC,CAAC;AACD,UAAI,MAAM,WAAW,EAAG;AACxB,UAAI,KAAK,GAAG,KAAK;AAAA,IACnB;AACA,UAAM,aAAa,WAAW,KAAK,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,IAAI;AACvE,eAAW,SAAS,IAAK,OAAM,aAAa,OAAO,YAAY,GAAG;AAAA,EACpE;AACF;AAEO,SAAS,aAAa,MAA6B;AACxD,SAAO,KAAK,YAAY,EAAE,KAAK,CAAC,WAAW;AACzC,UAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,QAAI,SAAS;AACb,UAAM,YAAY;AAClB,aAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,WAAW;AAC5D,gBAAU,OAAO,aAAa,GAAG,MAAM,SAAS,OAAO,QAAQ,SAAS,CAAC;AAAA,IAC3E;AACA,WAAO,KAAK,MAAM;AAAA,EACpB,CAAC;AACH;;;AC3CA,IAAAC,oBAA6B;AAC7B,IAAAC,mCAEO;;;ACEH,IAAAC,sBAAA;AA0CG,SAAS,YAA4H;AAC1I,SAAO,EAAE,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,KAAK,eAAe,SAAS,gBAAgB,QAAQ;AACnH;AAGO,SAAS,WAAW,EAAE,OAAO,GAAG,GAAmC;AACxE,SACE,8CAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,eAAY,QAC9D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,OAAM,MAAK,gBAAe;AAAA,IACtE,6CAAC,UAAK,GAAE,yBAAwB,MAAK,WAAU,SAAQ,OAAM;AAAA,KAC/D;AAEJ;AAGO,SAAS,UAAU,EAAE,OAAO,GAAG,GAAmC;AACvE,SACE,8CAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,eAAY,QAAQ,GAAG,UAAU,GAAG,aAAa,GACnG;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,QAAO,OAAM,MAAK,QAAO,KAAI,IAAG,OAAM;AAAA,IACpD,6CAAC,UAAK,GAAE,yCAAwC;AAAA,KAClD;AAEJ;AAGO,SAAS,YAAY,EAAE,OAAO,GAAG,GAAmC;AACzE,SACE,8CAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,eAAY,QAAQ,GAAG,UAAU,GACnF;AAAA,iDAAC,UAAK,GAAE,+EAA8E;AAAA,IACtF,6CAAC,UAAK,GAAE,wCAAuC;AAAA,KACjD;AAEJ;AAGO,SAAS,YAAY,EAAE,KAAK,OAAO,GAAG,GAAwD;AACnG,SACE,6CAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,eAAY,QAAQ,GAAG,UAAU,GAClF,kBAAQ,QAAQ,6CAAC,UAAK,GAAE,oCAAmC,IAAK,6CAAC,UAAK,GAAE,qCAAoC,GAC/G;AAEJ;AAGO,SAAS,eAAe,EAAE,OAAO,GAAG,GAAmC;AAC5E,SACE,8CAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,eAAY,QAC9D;AAAA,iDAAC,UAAK,GAAE,yHAAwH,MAAK,mDAAkD;AAAA,IACvL,6CAAC,UAAK,GAAE,kEAAiE,MAAK,WAAU,SAAQ,OAAM;AAAA,KACxG;AAEJ;AAGO,SAAS,eAAe,EAAE,OAAO,GAAG,GAAmC;AAC5E,SACE,6CAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAAM,eAAY,QAAQ,GAAG,UAAU,GACnF,uDAAC,UAAK,GAAE,yBAAwB,GAClC;AAEJ;AAIO,SAAS,eAA4B;AAC1C,SACE,8CAAC,SAAI,OAAM,OAAM,QAAO,MAAK,SAAQ,cAAa,eAAY,QAC5D;AAAA,kDAAC,UACC;AAAA,oDAAC,oBAAe,IAAG,kBAAiB,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAC1D;AAAA,qDAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,QACrC,6CAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,SACvC;AAAA,MACA,8CAAC,oBAAe,IAAG,kBAAiB,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KAC1D;AAAA,qDAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,QACrC,6CAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,SACvC;AAAA,OACF;AAAA,IAEA,6CAAC,UAAK,GAAE,mCAAkC,MAAK,wBAAuB,QAAO,WAAU,aAAY,KAAI;AAAA,IAEvG,6CAAC,UAAK,GAAE,iCAAgC,MAAK,wBAAuB,QAAO,WAAU,aAAY,KAAI;AAAA,IAErG,6CAAC,UAAK,GAAE,iCAAgC,MAAK,wBAAuB,QAAO,mDAAkD,aAAY,KAAI;AAAA,IAC7I,6CAAC,UAAK,GAAE,iCAAgC,MAAK,WAAU,QAAO,mDAAkD,aAAY,KAAI;AAAA,IAChI,6CAAC,UAAK,GAAE,mCAAkC,MAAK,WAAU,QAAO,mDAAkD,aAAY,KAAI;AAAA,IAElI,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,WAAU,SAAQ,OAAM;AAAA,IAC3D,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAM,MAAK,WAAU;AAAA,IAE/C,6CAAC,UAAK,GAAE,uGAAsG,MAAK,WAAU;AAAA,IAC7H,6CAAC,UAAK,GAAE,+FAA8F,MAAK,WAAU;AAAA,IACrH,6CAAC,YAAO,IAAG,OAAM,IAAG,MAAK,GAAE,KAAI,MAAK,WAAU;AAAA,KAChD;AAEJ;AAGO,SAAS,oBAAiC;AAC/C,SACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAY,QAC1D;AAAA,iDAAC,UAAK,GAAE,OAAM,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,OAAM,MAAK,mDAAkD;AAAA,IAC3G,6CAAC,UAAK,GAAE,+BAA8B,QAAO,WAAU,aAAY,OAAM,eAAc,SAAQ;AAAA,KACjG;AAEJ;AAGO,SAAS,WAAwB;AACtC,SACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,eAAY,QACzJ;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,IACvD,6CAAC,UAAK,GAAE,2DAA0D;AAAA,KACpE;AAEJ;AAGO,SAAS,YAAyB;AACvC,SACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAY,QAC3J,uDAAC,cAAS,QAAO,kBAAiB,GACpC;AAEJ;AAIO,SAAS,aAA0B;AACxC,SACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,eAAY,QACzJ;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,SAAQ;AAAA,KAC9C;AAEJ;AAEO,SAAS,UAAuB;AACrC,SACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,eAAY,QACzJ;AAAA,iDAAC,UAAK,GAAE,kFAAiF;AAAA,IACzF,6CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,QAAO,IAAG,KAAI;AAAA,KACvC;AAEJ;;;ADhLM,IAAAC,sBAAA;AALC,SAAS,QAAQ,EAAE,MAAM,OAAO,GAAG,GAAkF;AAC1H,QAAM,SAAS,EAAE,OAAO,MAAM,QAAQ,MAAM,SAAS,aAAa,eAAe,KAAK;AACtF,QAAMC,KAAI,EAAE,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,KAAK,eAAe,SAAS,gBAAgB,QAAQ;AACpH,MAAI,SAAS,MAAM;AACjB,WACE,8CAAC,SAAK,GAAG,QAAS,GAAGA,IAAG;AAAA,mDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,OAAM,QAAO,OAAM,IAAG,OAAM;AAAA,MAAE,6CAAC,UAAK,GAAE,QAAO,GAAE,KAAI,OAAM,OAAM,QAAO,OAAM,IAAG,OAAM;AAAA,MAAE,6CAAC,UAAK,GAAE,KAAI,GAAE,QAAO,OAAM,OAAM,QAAO,OAAM,IAAG,OAAM;AAAA,MAAE,6CAAC,UAAK,GAAE,QAAO,GAAE,QAAO,OAAM,OAAM,QAAO,OAAM,IAAG,OAAM;AAAA,OAAE;AAAA,EAEhQ;AACA,MAAI,SAAS,QAAQ;AACnB,WACE,6CAAC,SAAK,GAAG,QAAS,GAAGA,IAAG,uDAAC,UAAK,GAAE,+CAA8C,GAAE;AAAA,EAEpF;AACA,MAAI,SAAS,OAAO;AAClB,WACE,8CAAC,SAAK,GAAG,QAAS,GAAGA,IAAG;AAAA,mDAAC,UAAK,GAAE,0BAAyB;AAAA,MAAE,6CAAC,UAAK,GAAE,iCAAgC;AAAA,OAAE;AAAA,EAEzG;AACA,MAAI,SAAS,QAAQ;AACnB,WACE,6CAAC,SAAK,GAAG,QAAS,GAAGA,IAAG,uDAAC,UAAK,GAAE,uCAAsC,GAAE;AAAA,EAE5E;AACA,SACE,6CAAC,SAAK,GAAG,QAAS,GAAGA,IAAG,uDAAC,UAAK,GAAE,4JAA2J,GAAE;AAEjM;AAGO,SAAS,WAAW,EAAE,GAAG,SAAS,MAAM,KAAK,OAAO,GAM3C;AACd,QAAM,OAAiE;AAAA,IACrE,CAAC,EAAE,YAAY,GAAG,IAAI;AAAA,IAAG,CAAC,EAAE,cAAc,GAAG,MAAM;AAAA,IAAG,CAAC,EAAE,aAAa,GAAG,KAAK;AAAA,IAC9E,CAAC,EAAE,cAAc,GAAG,MAAM;AAAA,IAAG,CAAC,EAAE,cAAc,GAAG,MAAM;AAAA,EACzD;AACA,QAAM,QAAyC;AAAA,IAC7C,CAAC,GAAG,EAAE,YAAY,GAAG,EAAE,gBAAgB,CAAC;AAAA,IACxC,CAAC,GAAG,EAAE,YAAY,GAAG,EAAE,gBAAgB,CAAC;AAAA,IACxC,CAAC,GAAG,EAAE,YAAY,GAAG,EAAE,gBAAgB,CAAC;AAAA,IACxC,CAAC,GAAG,EAAE,YAAY,GAAG,EAAE,gBAAgB,CAAC;AAAA,EAC1C;AACA,QAAM,QAAQ,CAAC,EAAE,YAAY,GAAG,EAAE,YAAY,GAAG,EAAE,YAAY,GAAG,EAAE,YAAY,CAAC;AACjF,aAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,IAAI;AAAA,QACf,MAAK;AAAA,QACL,cAAY,EAAE,iBAAiB;AAAA,QAC/B,OAAO,EAAE,MAAM,KAAK,OAAO;AAAA,QAE3B;AAAA,wDAAC,SAAI,WAAW,IAAI,gBAClB;AAAA,yDAAC,UAAK,WAAW,IAAI,gBAAgB,uDAAC,qBAAkB,GAAE;AAAA,YAC1D,6CAAC,UAAK,WAAW,IAAI,iBAAkB,YAAE,iBAAiB,GAAE;AAAA,YAC5D,6CAAC,YAAO,MAAK,UAAS,WAAW,IAAI,iBAAiB,cAAY,EAAE,YAAY,GAAG,SAAS,SAC1F,uDAAC,4DAAwB,MAAM,IAAI,eAAY,QAAO,GACxD;AAAA,aACF;AAAA,UAEA,8CAAC,SAAI,WAAW,IAAI,gBAElB;AAAA,0DAAC,aAAQ,WAAW,IAAI,UACtB;AAAA,4DAAC,SAAI,WAAW,IAAI,cAClB;AAAA,6DAAC,UAAK,WAAW,IAAI,cAAc,uDAAC,4DAAwB,MAAM,IAAI,eAAY,QAAO,GAAE;AAAA,gBAC3F,6CAAC,UAAK,WAAW,IAAI,eAAgB,YAAE,WAAW,GAAE;AAAA,iBACtD;AAAA,cACA,6CAAC,OAAE,WAAW,IAAI,eAAgB,YAAE,eAAe,GAAE;AAAA,cACrD,6CAAC,SAAI,WAAW,IAAI,WACjB,eAAK,IAAI,CAAC,CAAC,OAAO,IAAI,MACrB,8CAAC,UAAiB,WAAW,IAAI,UAC/B;AAAA,6DAAC,UAAK,WAAW,IAAI,cAAc,uDAAC,WAAQ,MAAY,GAAE;AAAA,gBAC1D,6CAAC,UAAK,WAAW,IAAI,eAAgB,iBAAM;AAAA,mBAFlC,KAGX,CACD,GACH;AAAA,eACF;AAAA,YAGA,6CAAC,aAAQ,WAAW,IAAI,UACrB,gBAAM,IAAI,CAAC,CAAC,KAAK,OAAO,IAAI,MAC3B,8CAAC,SAAc,WAAW,IAAI,WAC5B;AAAA,2DAAC,UAAK,WAAW,IAAI,cAAe,eAAI;AAAA,cACxC,8CAAC,SAAI,WAAW,IAAI,eAClB;AAAA,8DAAC,SAAI,WAAW,IAAI,mBAClB;AAAA,+DAAC,UAAK,WAAW,IAAI,gBAAiB,iBAAM;AAAA,kBAC5C,6CAAC,mEAA+B,WAAW,IAAI,gBAAgB,MAAM,IAAI,eAAY,QAAO;AAAA,mBAC9F;AAAA,gBACA,6CAAC,OAAE,WAAW,IAAI,eAAgB,gBAAK;AAAA,iBACzC;AAAA,iBARQ,GASV,CACD,GACH;AAAA,YAGA,8CAAC,aAAQ,WAAW,IAAI,WACtB;AAAA,2DAAC,SAAI,WAAW,IAAI,gBAAiB,YAAE,WAAW,GAAE;AAAA,cACpD,6CAAC,QAAG,WAAW,IAAI,eAChB,gBAAM,IAAI,CAAC,SACV,8CAAC,QAAc,WAAW,IAAI,eAC5B;AAAA,6DAAC,aAAU;AAAA,gBACV;AAAA,mBAFM,IAGT,CACD,GACH;AAAA,cACA,8CAAC,YAAO,MAAK,UAAS,WAAW,IAAI,cAAc,SAAS,SAC1D;AAAA,6DAAC,UAAM,YAAE,eAAe,GAAE;AAAA,gBAC1B,6CAAC,kBAAe,MAAM,IAAI;AAAA,iBAC5B;AAAA,cACA,6CAAC,UAAK,WAAW,IAAI,cAAc,eAAY,QAAO,uDAAC,gBAAa,GAAE;AAAA,eACxE;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AE5HO,IAAM,WAAmC;AAAA,EAC9C,OAAO;AAAA,EAAM,YAAY;AAAA,EAAQ,OAAO;AAAA,EAAM,SAAS;AAAA,EACvD,OAAO;AAAA,EAAa,OAAO;AAAA,EAAM,SAAS;AAAA,EAC1C,YAAY;AAAA,EAAmB,YAAY;AAAA,EAC3C,WAAW;AAAA,EAAU,kBAAkB;AAAA,EAAU,gBAAgB;AAAA,EAAW,gBAAgB;AAAA,EAAU,WAAW;AAAA,EAAQ,YAAY;AAAA,EAAM,aAAa;AAAA,EAAO,cAAc;AAAA,EAAQ,aAAa;AAAA,EAAO,YAAY;AAAA,EAAQ,gBAAgB;AAAA,EAAQ,kBAAkB;AAAA,EAAW,gBAAgB;AAAA,EAAa,aAAa;AAAA,EAAe,aAAa;AAAA,EAA6B,gBAAgB;AAAA,EACrY,aAAa;AAAA,EAAQ,wBAAwB;AAAA,EAAe,oBAAoB;AAAA,EAChF,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EAAa,cAAc;AAAA,EAAW,gBAAgB;AAAA,EAAM,eAAe;AAAA,EAC1F,cAAc;AAAA,EAAO,cAAc;AAAA;AAAA,EAEnC,gBAAgB;AAAA,EAAM,cAAc;AAAA,EAAQ,eAAe;AAAA,EAAO,qBAAqB;AAAA,EACvF,eAAe;AAAA,EAAQ,oBAAoB;AAAA,EAAe,sBAAsB;AAAA,EAChF,gBAAgB;AAAA,EAAkB,cAAc;AAAA,EAChD,gBAAgB;AAAA,EAAmB,eAAe;AAAA,EAAM,oBAAoB;AAAA,EAC5E,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EAAgB,iBAAiB;AAAA,EAClD,gBAAgB;AAAA,EAChB,WAAW;AAAA,EAAS,sBAAsB;AAAA,EAAS,QAAQ;AAAA,EAAM,QAAQ;AAAA,EACzE,yBAAyB;AAAA,EAAgB,QAAQ;AAAA,EAAO,QAAQ;AAAA,EAChE,aAAa;AAAA,EAAW,aAAa;AAAA,EACrC,YAAY;AAAA,EAAQ,YAAY;AAAA,EAChC,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,aAAa;AAAA,EAAM,cAAc;AAAA,EACjC,cAAc;AAAA,EAAQ,eAAe;AAAA,EACrC,cAAc;AAAA,EACd,WAAW;AAAA,EACX,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA;AAAA,EAEtB,eAAe;AAAA,EAAS,iBAAiB;AAAA,EAAO,YAAY;AAAA,EAAM,UAAU;AAAA,EAAM,UAAU;AAAA;AAAA,EAE5F,aAAa;AAAA,EAAe,cAAc;AAAA,EAAO,WAAW;AAAA,EAC5D,aAAa;AAAA,EAAQ,cAAc;AAAA,EAAQ,YAAY;AAAA,EAAO,YAAY;AAAA,EAAY,UAAU;AAAA,EAChG,aAAa;AAAA,EAAS,aAAa;AAAA,EAAQ,WAAW;AAAA,EAAQ,UAAU;AAAA,EAAQ,aAAa;AAAA,EAC7F,iBAAiB;AAAA,EAAe,iBAAiB;AAAA,EACjD,eAAe;AAAA,EAAY,cAAc;AAAA,EACzC,cAAc;AAAA,EAAQ,YAAY;AAAA,EAAW,aAAa;AAAA,EAAQ,aAAa;AAAA,EAC/E,mBAAmB;AAAA,EAAiB,WAAW;AAAA,EAAM,eAAe;AAAA,EAAO,aAAa;AAAA,EAAQ,WAAW;AAAA,EAC3G,cAAc;AAAA,EAAY,UAAU;AAAA,EAAM,UAAU;AAAA,EACpD,aAAa;AAAA,EAAQ,WAAW;AAAA,EAChC,kBAAkB;AAAA,EAAW,aAAa;AAAA,EAA2B,iBAAiB;AAAA,EAAS,iBAAiB;AAAA,EAChH,SAAS;AAAA;AAAA,EAET,gBAAgB;AAAA,EAAc,aAAa;AAAA,EAC3C,QAAQ;AAAA,EAAM,aAAa;AAAA,EAAQ,QAAQ;AAAA,EAAU,YAAY;AAAA,EAAQ,aAAa;AAAA,EACtF,WAAW;AAAA,EAAM,UAAU;AAAA,EAAO,WAAW;AAAA,EAC7C,SAAS;AAAA,EAAQ,YAAY;AAAA,EAAQ,eAAe;AAAA,EACpD,gBAAgB;AAAA,EAAQ,cAAc;AAAA,EACtC,UAAU;AAAA,EAAW,YAAY;AAAA,EAAsB,cAAc;AAAA;AAAA,EAErE,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,YAAY;AAAA,EAAS,cAAc;AAAA,EAAQ,aAAa;AAAA,EAAQ,cAAc;AAAA,EAAQ,cAAc;AAAA,EACpG,YAAY;AAAA,EAAY,gBAAgB;AAAA,EACxC,YAAY;AAAA,EAAY,gBAAgB;AAAA,EACxC,YAAY;AAAA,EAAa,gBAAgB;AAAA,EACzC,YAAY;AAAA,EAAQ,gBAAgB;AAAA,EACpC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EAAmB,YAAY;AAAA,EAC3C,YAAY;AAAA,EAAY,YAAY;AAAA,EACpC,eAAe;AAAA,EACf,YAAY;AAAA;AAAA,EAEZ,WAAW;AAAA,EAAS,YAAY;AAAA,EAAO,SAAS;AAAA;AAAA,EAEhD,WAAW;AAAA,EAAc,UAAU;AAAA,EAAQ,QAAQ;AAAA,EAAQ,WAAW;AAAA,EACtE,kBAAkB;AAAA,EAAiB,mBAAmB;AAAA,EAAiB,QAAQ;AAAA;AAAA,EAE/E,UAAU;AAAA,EAAU,aAAa;AAAA,EACjC,aAAa;AAAA,EACb,gBAAgB;AAAA,EAAmB,cAAc;AAAA,EACjD,cAAc;AAAA,EAAiB,kBAAkB;AAAA,EACjD,gBAAgB;AAAA,EAAO,oBAAoB;AAAA,EAC3C,cAAc;AAAA,EAAQ,kBAAkB;AAAA,EACxC,gBAAgB;AAAA,EAAO,oBAAoB;AAAA;AAAA,EAE3C,qBAAqB;AAAA;AAAA,EAErB,cAAc;AAAA,EAAiB,cAAc;AAAA,EAC7C,YAAY;AAAA,EACZ,UAAU;AAAA,EAAO,WAAW;AAAA,EAC5B,kBAAkB;AAAA,EAClB,YAAY;AAAA,EAAM,uBAAuB;AAAA,EACzC,YAAY;AAAA,EAAU,uBAAuB;AAAA,EAC7C,YAAY;AAAA,EAAQ,iBAAiB;AAAA,EAAS,gBAAgB;AAAA,EAAQ,eAAe;AAAA,EACrF,eAAe;AAAA,EAAQ,0BAA0B;AAAA,EACjD,WAAW;AAAA,EAAQ,sBAAsB;AAAA,EACzC,eAAe;AAAA,EAAM,WAAW;AAAA;AAAA,EAEhC,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA;AAAA,EAEf,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,kBAAkB;AAAA;AAAA,EAElB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EAAO,cAAc;AAAA,EAAO,eAAe;AAAA,EAAO,cAAc;AAAA;AAAA,EAE3E,gBAAgB;AAAA,EAChB,eAAe;AAAA,EAAM,QAAQ;AAAA,EAC7B,gBAAgB;AAAA,EAAM,iBAAiB;AAAA,EACvC,kBAAkB;AAAA,EAAO,mBAAmB;AAAA,EAC5C,cAAc;AAAA,EACd,mBAAmB;AAAA;AAAA,EAEnB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EAAQ,WAAW;AAAA,EAAO,aAAa;AAAA,EAAO,YAAY;AAAA,EACzE,mBAAmB;AAAA;AAAA,EAEnB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,wBAAwB;AAAA;AAAA,EAExB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA;AAAA,EAEjB,gBAAgB;AAAA,EAAc,oBAAoB;AAAA,EAClD,eAAe;AAAA,EAAa,mBAAmB;AAAA,EAC/C,YAAY;AAAA,EAAQ,gBAAgB;AAAA,EACpC,eAAe;AAAA,EAAQ,mBAAmB;AAAA,EAC1C,aAAa;AAAA,EAAS,eAAe;AAAA,EACrC,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA;AAAA,EAEvB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA;AAAA,EAErB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA;AAAA,EAEnB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAErB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA;AAAA,EAEtB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA;AAAA,EAEf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,WAAW;AAAA,EAAO,eAAe;AAAA,EACjC,WAAW;AAAA,EAAQ,eAAe;AAAA,EAClC,WAAW;AAAA,EAAO,eAAe;AAAA,EACjC,WAAW;AAAA,EAAO,eAAe;AAAA,EACjC,aAAa;AAAA,EACb,UAAU;AAAA,EAAS,WAAW;AAAA,EAAc,eAAe;AAAA,EAC3D,QAAQ;AAAA,EAAM,SAAS;AAAA,EAAM,SAAS;AAAA,EAAM,QAAQ;AAAA,EACpD,eAAe;AAAA,EACf,UAAU;AAAA,EAAiB,cAAc;AAAA,EACzC,UAAU;AAAA,EAAS,cAAc;AAAA,EACjC,UAAU;AAAA,EAAS,cAAc;AAAA,EACjC,eAAe;AAAA,EAAY,cAAc;AAAA,EACzC,aAAa;AAAA,EAAU,iBAAiB;AAAA,EACxC,aAAa;AAAA,EACb,eAAe;AAAA;AAAA,EAEf,SAAS;AAAA,EAAM,UAAU;AAAA,EAAM,aAAa;AAAA,EAC5C,YAAY;AAAA,EAAW,UAAU;AAAA,EAAW,UAAU;AAAA,EAAO,UAAU;AAAA;AAAA,EAEvE,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA,EACf,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,gBAAgB;AAClB;AAEO,SAAS,OAAO,KAAa,QAAkD;AACpF,MAAI,OAAO,SAAS,GAAG,KAAK;AAC5B,MAAI,QAAQ;AACV,eAAW,KAAK,OAAO,KAAK,MAAM,EAAG,QAAO,KAAK,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;AAAA,EACzF;AACA,SAAO;AACT;;;ACzQA,IAAAC,iBAAyB;AACzB,IAAAC,mCAA8B;AAwFxB,IAAAC,sBAAA;AA/EC,SAAS,YAAY,EAAE,GAAG,UAAU,SAAS,SAAS,GAO7C;AACd,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAA0B,MAAM;AAC5D,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,EAAE;AACnC,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAmC,IAAI;AAC/D,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAmD,IAAI;AACrF,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAmB,CAAC,CAAC;AACjD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAmB,CAAC,CAAC;AACrD,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAwB,IAAI;AACxD,QAAM,SAAS,aAAa,SAAY,WAAW;AACnD,QAAM,cAAc,WAAW,SAC3B,iGACA;AACJ,QAAM,QAAQ,KAAK,KAAK,MAAM;AAE9B,QAAM,OAAO,CAAC,MAAc,YAC1B,MAAM,MAAM;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,IAC1E,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC,EAAE,KAAK,OAAO,aAAa;AAC1B,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,WAAO,QAAQ,EAAE,IAAI,OAAO,OAAO,QAAQ,SAAS,MAAM,GAAG;AAAA,EAC/D,CAAC;AAEH,QAAM,QAAQ,MAAY;AAAE,cAAU,CAAC,CAAC;AAAG,gBAAY,CAAC,CAAC;AAAG,cAAU,IAAI;AAAG,eAAW,IAAI;AAAA,EAAE;AAE9F,QAAM,aAAa,MAAY;AAC7B,QAAI,SAAS,QAAQ,MAAO;AAC5B,YAAQ,SAAS;AAAG,UAAM;AAC1B,SAAK,KAAK,0BAA0B,EAAE,QAAQ,MAAM,OAAO,CAAC,EACzD,KAAK,CAAC,SAAS;AACd,YAAM,OAAO,MAAM,QAAQ,KAAK,MAAM,IAAK,KAAK,SAAsB,CAAC;AACvE,gBAAU,IAAI;AACd,UAAI,MAAM,QAAQ,KAAK,QAAQ,EAAG,aAAY,KAAK,QAAoB;AACvE,UAAI,OAAO,KAAK,SAAS,UAAU;AACjC,cAAM,UAAU,MAAM,QAAQ,KAAK,OAAO,IAAK,KAAK,UAAwC,CAAC;AAC7F,mBAAW,EAAE,OAAO,QAAQ,IAAI,UAAQ,OAAO,KAAK,QAAQ,EAAE,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC;AAAA,MACrF;AACA,UAAI,KAAK,WAAW,KAAK,OAAO,KAAK,UAAU,SAAU,WAAU,CAAC,KAAK,KAAK,CAAC;AAAA,IACjF,CAAC,EACA,MAAM,CAAC,UAAmB;AAAE,gBAAU,CAAC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;AAAA,IAAE,CAAC,EACjG,QAAQ,MAAM;AAAE,cAAQ,IAAI;AAAA,IAAE,CAAC;AAAA,EACpC;AAEA,QAAM,SAAS,MAAY;AACzB,QAAI,SAAS,QAAQ,MAAO;AAC5B,YAAQ,KAAK;AAAG,UAAM;AACtB,UAAM,OAAO,aAAa,SACtB,0BACA,0BAA0B,mBAAmB,QAAQ,CAAC;AAC1D,UAAM,UAAU,aAAa,SAAY,EAAE,QAAQ,OAAO,QAAQ,KAAK,IAAI,EAAE,QAAQ,KAAK;AAC1F,SAAK,KAAK,MAAM,OAAO,EACpB,KAAK,CAAC,SAAS;AACd,YAAM,OAAO,MAAM,QAAQ,KAAK,MAAM,IAAK,KAAK,SAAsB,CAAC;AACvE,UAAI,KAAK,SAAS,GAAG;AACnB,kBAAU,IAAI;AACd,YAAI,MAAM,QAAQ,KAAK,QAAQ,EAAG,aAAY,KAAK,QAAoB;AACvE;AAAA,MACF;AACA,UAAI,KAAK,OAAO,MAAM;AAAE,kBAAU,CAAC,OAAO,KAAK,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAAG;AAAA,MAAO;AACvF,YAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAK,KAAK,QAAqB,CAAC;AACtE,YAAM,UAAU,MAAM,QAAQ,KAAK,OAAO,IAAK,KAAK,UAAgC,CAAC;AACrF,gBAAU,EAAE,iBAAiB,EAAE,OAAO,MAAM,QAAQ,SAAS,MAAM,QAAQ,OAAO,IAAI,QAAQ,SAAS,OAAO,OAAO,EAAE,CAAC,CAAC;AACzH,UAAI,MAAM,QAAQ,KAAK,QAAQ,EAAG,aAAY,KAAK,QAAoB;AACvE,cAAQ,KAAK;AAAA,IACf,CAAC,EACA,MAAM,CAAC,UAAmB;AAAE,gBAAU,CAAC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;AAAA,IAAE,CAAC,EACjG,QAAQ,MAAM;AAAE,cAAQ,IAAI;AAAA,IAAE,CAAC;AAAA,EACpC;AAEA,SACE,8CAAC,SAAI,WAAW,IAAI,YAClB;AAAA,iDAAC,OAAE,WAAW,IAAI,aACf,YAAE,gBAAgB,EAAE,OAAO,aAAa,SAAY,EAAE,qBAAqB,IAAI,GAAG,EAAE,qBAAqB,CAAC,UAAK,QAAQ,SAAI,CAAC,GAC/H;AAAA,IACA,6CAAC,SAAI,WAAW,IAAI,YAClB,uDAAC,SAAI,WAAW,IAAI,eAAe,MAAK,SAAQ,cAAY,EAAE,gBAAgB,GAC1E,WAAC,QAAQ,MAAM,EAAY,IAAI,WAC/B;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,GAAG,IAAI,aAAa,IAAI,WAAW,QAAQ,IAAI,mBAAmB,EAAE;AAAA,QAC/E,eAAa,WAAW,SAAS;AAAA,QACjC,gBAAc,WAAW;AAAA,QACzB,SAAS,MAAM;AAAE,oBAAU,KAAK;AAAG,gBAAM;AAAA,QAAE;AAAA,QAE1C;AAAA,gBAAM,YAAY;AAAA,UAAG,UAAU,SAAS,SAAM,EAAE,gBAAgB,CAAC,KAAK;AAAA;AAAA;AAAA,MAPlE;AAAA,IAQP,CACD,GACH,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,IAAI;AAAA,QACf,OAAO;AAAA,QACP;AAAA,QACA,cAAY,EAAE,gBAAgB;AAAA,QAC9B,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,WAAS;AAAA,QACT,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,YAAY;AAAA,QACd;AAAA,QACA,UAAU,CAAC,UAAU;AAAE,kBAAQ,MAAM,cAAc,KAAK;AAAG,gBAAM;AAAA,QAAE;AAAA;AAAA,IACrE;AAAA,IACC,OAAO,SAAS,KACf,6CAAC,SAAI,WAAW,IAAI,OAAO,MAAK,SAC7B,iBAAO,IAAI,UAAQ,6CAAC,SAAgB,kBAAP,IAAY,CAAM,GAClD;AAAA,IAED,SAAS,SAAS,KACjB,6CAAC,SAAI,WAAW,IAAI,aAAa,MAAK,UACnC,mBAAS,IAAI,UAAQ,8CAAC,SAAe;AAAA;AAAA,MAAG;AAAA,SAAT,IAAc,CAAM,GACtD;AAAA,IAED,YAAY,QACX,8CAAC,SACC;AAAA,mDAAC,OAAE,WAAW,IAAI,aAAc,YAAE,kBAAkB,EAAE,GAAG,QAAQ,MAAM,QAAQ,OAAO,QAAQ,MAAM,KAAK,IAAI,EAAE,CAAC,GAAE;AAAA,MAClH,6CAAC,SAAI,OAAO;AAAA,QACV,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,MACd,GAAI,kBAAQ,MAAK;AAAA,OACnB;AAAA,IAED,WAAW,QAAQ,6CAAC,OAAE,WAAW,IAAI,aAAa,MAAK,UAAU,kBAAO;AAAA,IACzE,8CAAC,SAAI,WAAW,IAAI,YAClB;AAAA,mDAAC,2CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,SAAS,QAAQ,OAAO,SAAS,YAChF,mBAAS,YAAY,EAAE,kBAAkB,IAAI,EAAE,eAAe,GACjE;AAAA,MACA,6CAAC,2CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,SAAS,QAAQ,OAAO,SAAS,QAChF,mBAAS,QAAQ,EAAE,gBAAgB,IAAI,EAAE,eAAe,GAC3D;AAAA,MACA,6CAAC,2CAAO,SAAQ,WAAU,MAAK,UAAS,SAAS,UAAW,YAAE,QAAQ,GAAE;AAAA,OAC1E;AAAA,KACF;AAEJ;AAGO,SAAS,YAAY,EAAE,GAAG,MAAM,SAAS,QAAQ,GAKxC;AACd,SACE,6CAAC,0CAAM,MAAY,SAAkB,YAAY,EAAE,OAAO,GAAG,OAAO,EAAE,kBAAkB,GACtF,uDAAC,eAAY,GAAM,SAAkB,UAAU,SAAS,GAC1D;AAEJ;;;AC5KA,IAAAC,iBAAyB;AACzB,IAAAC,mCAEO;;;ACUP,IAAAC,iBAA0B;AAC1B,IAAAC,oBAA6B;AAC7B,IAAAC,mCAAuB;AA2GnB,IAAAC,sBAAA;AApGJ,IAAMC,YAAW;AAEjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCd,SAAS,qBAA2B;AAClC,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAeD,SAAQ,MAAM,KAAM;AAChD,QAAM,MAAM,SAAS,cAAc,OAAO;AAC1C,MAAI,KAAKA;AACT,MAAI,QAAQ,SAAS;AACrB,MAAI,cAAcC;AAClB,WAAS,KAAK,YAAY,GAAG;AAC/B;AAwBO,SAAS,cAAc;AAAA,EAC5B;AAAA,EAAM;AAAA,EAAO;AAAA,EAAS;AAAA,EAAc;AAAA,EAAa,SAAS;AAAA,EAAO;AAAA,EAAW;AAC9E,GAA2C;AACzC,wBAAsB;AACtB,qBAAmB;AACnB,QAAM,EAAE,SAAS,aAAa,IAAI,cAAc,MAAM,OAAO;AAG7D,gCAAU,MAAM;AACd,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,CAAC,UAA+B;AAC5C,UAAI,MAAM,QAAQ,SAAU,cAAa;AAAA,IAC3C;AACA,aAAS,iBAAiB,WAAW,KAAK;AAC1C,WAAO,MAAM;AAAE,eAAS,oBAAoB,WAAW,KAAK;AAAA,IAAE;AAAA,EAChE,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,gBAAgB,MAAY;AAChC,cAAU;AACV,iBAAa;AAAA,EACf;AACA,QAAM,eAAe,MAAY;AAC/B,iBAAa;AAAA,EACf;AAEA,aAAO;AAAA,IACL,8EACE;AAAA,mDAAC,SAAI,WAAW,YAAY,mBAAmB,OAAO,CAAC,IAAI,eAAY,QAAO,SAAS,cAAc;AAAA,MACrG,6CAAC,SAAI,WAAU,YACb,wDAAC,SAAI,WAAW,YAAY,eAAe,OAAO,CAAC,IAAI,MAAK,UAAS,cAAW,QAAO,cAAY,OACjG;AAAA,qDAAC,SAAI,WAAU,aAAa,iBAAM;AAAA,QAClC,6CAAC,SAAI,WAAU,YAAY,mBAAQ;AAAA,QACnC,8CAAC,SAAI,WAAU,eACb;AAAA,uDAAC,2CAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,cAAe,uBAAY;AAAA,UACxE;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,SAAS,YAAY;AAAA,cAC9B,MAAK;AAAA,cACL,WAAS;AAAA,cACT,WAAW,SAAS,mBAAmB;AAAA,cACvC,SAAS;AAAA,cAER;AAAA;AAAA,UACH;AAAA,WACF;AAAA,SACF,GACF;AAAA,OACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AClJA,IAAAC,iBAAoC;AAqD7B,IAAM,6BAA6B;AAGnC,IAAM,4BAA4B;AASlC,SAAS,yBAAyB,MAAoB,YAA4B;AACvF,MAAI,QAAQ,KAAK,QAAQ,KAAK,YAAU,OAAO,eAAe,UAAU,GAAG,aAAa;AACxF,aAAW,QAAQ,OAAO,OAAO,KAAK,iBAAiB,CAAC,CAAC,GAAG;AAC1D,UAAM,MAAM,KAAK,KAAK,UAAQ,KAAK,eAAe,UAAU;AAC5D,QAAI,QAAQ,OAAW,SAAQ,KAAK,IAAI,OAAO,IAAI,mBAAmB,CAAC;AAAA,EACzE;AACA,SAAO;AACT;AAGO,SAAS,0BAA0B,YAAoB,QAAyB;AACrF,SAAO,eAAe,KAAK,SAAS;AACtC;AAGO,SAAS,kBAA+C;AAC7D,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAwB,EAAE,OAAO,WAAW,MAAM,KAAK,CAAC;AACpF,QAAM,OAAO,MAAY;AACvB,cAAU,CAACC,aAAaA,SAAQ,UAAU,UAAUA,WAAU,EAAE,OAAO,WAAW,MAAM,KAAK,CAAE;AAC/F,SAAK,MAAM,yBAAyB,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC,EAC5E,KAAK,CAAC,aAAa;AAAE,UAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,OAAO,SAAS,MAAM,CAAC;AAAG,aAAO,SAAS,KAAK;AAAA,IAAE,CAAC,EACzG,KAAK,CAAC,SAAS;AACd,UAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,CAAC,MAAM,QAAS,KAA+B,OAAO,EAAG,OAAM,IAAI,MAAM,WAAW;AACrI,YAAM,OAAO;AACb,gBAAU,EAAE,OAAO,SAAS,KAAK,CAAC;AAAA,IACpC,CAAC,EACA,MAAM,MAAM;AAAE,gBAAU,EAAE,OAAO,eAAe,MAAM,KAAK,CAAC;AAAA,IAAE,CAAC;AAAA,EACpE;AACA,gCAAU,MAAM;AAAE,SAAK;AAAA,EAA6D,GAAG,CAAC,CAAC;AACzF,SAAO,CAAC,QAAQ,IAAI;AACtB;;;AFlDU,IAAAC,sBAAA;AA3BH,SAAS,aAAa,OAAsB,eAAmC;AACpF,QAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,UAAQ,KAAK,IAAI,CAAC;AAClD,SAAO,CAAC,GAAG,MAAM,IAAI,UAAQ,KAAK,IAAI,GAAG,GAAG,cAAc,OAAO,UAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;AAC5F;AAEO,SAAS,aAAa,EAAE,GAAG,YAAY,OAAO,eAAe,QAAQ,MAAM,SAAS,GASpE;AACrB,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,QAAQ,aAAa,OAAO,aAAa;AAC/C,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,MAAM,IAAI,IAAI,aAAa;AACjC,SACE,6CAAC,SAAI,WAAW,IAAI,cAAc,MAAK,SAAQ,cAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC,GAClG,gBAAM,IAAI,CAAC,SAAS;AACnB,UAAM,WAAW,IAAI,IAAI,IAAI;AAC7B,UAAM,WAAW,QAAQ,IAAI,IAAI,MAAM;AACvC,UAAM,QAAQ,KAAK,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,MAAM,IAAI;AACpE,UAAM,cAAc,MAAM,KAAK,UAAQ,KAAK,SAAS,IAAI,GAAG,eAAe;AAC3E,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,IAAI;AAAA,QACf,WAAS,WAAW,SAAY;AAAA,QAChC,eAAa,YAAY;AAAA,QACzB,aAAW,SAAS,QAAQ;AAAA,QAC5B,UAAU,SAAS,QAAQ;AAAA,QAC3B,gBAAc,CAAC;AAAA,QACf,OAAO,WACH,GAAG,EAAE,qBAAqB,CAAC;AAAA,EAAK,IAAI,KACpC,GAAG,WAAW,EAAE,oBAAoB,IAAI,EAAE,qBAAqB,CAAC;AAAA,EAAK,IAAI,GAAG,gBAAgB,KAAK,KAAK;AAAA,EAAK,WAAW,EAAE;AAAA,QAC5H,SAAS,MAAM;AAAE,mBAAS,MAAM,QAAQ;AAAA,QAAE;AAAA,QAEzC;AAAA,sBAAY,6CAAC,aAAU,MAAM,GAAG;AAAA,UAChC;AAAA;AAAA;AAAA,MAdI;AAAA,IAeP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAQO,SAAS,QAAQ,EAAE,GAAG,MAAM,OAAO,OAAO,QAAQ,WAAW,cAAc,cAAc,YAAY,cAAc,GAc1G;AACd,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAwB,IAAI;AACpD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAwB,IAAI;AAEtD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,IAAI;AACjD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAE3C,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwB,IAAI;AAE5D,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAwB,IAAI;AAE9D,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAwB,IAAI;AAEpE,QAAM,QAAQ,KAAK,UAAU,UAAU,KAAK,OAAO;AACnD,QAAM,UAAU,OAAO,WAAW,CAAC;AACnC,QAAM,UAAU,OAAO,WAAW,CAAC;AACnC,QAAM,SAAS,UAAU,KAAK,SAAY,QAAQ,KAAK,YAAU,OAAO,OAAO,KAAK;AACpF,QAAM,SAAS,IAAI,IAAI,OAAO,QAAQ,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,EAC9D,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC;AACzD,QAAM,UAAU,UAAU,KAAK,CAAC,IAAK,OAAO,gBAAgB,KAAK,KAAK,CAAC;AACvE,QAAM,WAAW,IAAI,IAAI,QAAQ,IAAI,SAAO,IAAI,UAAU,CAAC;AAG3D,QAAM,YAAY,OAAO,gBAAgB,CAAC;AAC1C,QAAM,eAAe,OAAO,wBAAwB,CAAC;AAMrD,QAAM,QAAQ,CAAC,YAAoB,UAAuC;AACxE,UAAM,QAAQ,aAAa,KAAK,IAAI,UAAU;AAC9C,QAAI,UAAU,MAAO,QAAO,OAAO,OAAO,CAAC;AAC3C,QAAI,UAAU,GAAI,QAAO,UAAU,UAAU,KAAK,CAAC;AACnD,WAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,UAAU,UAAU,KAAK,CAAC,GAAI,GAAI,OAAO,WAAW,CAAC,CAAE,CAAC,CAAC;AAAA,EACnF;AAEA,QAAM,WAAW,CAAC,eAAoC,IAAI,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,UAAU,KAAK,CAAC,CAAC;AAK7G,QAAM,cAAc,OAAO,cAAc,KAAK;AAC9C,QAAM,YAA2B,MAAM;AACrC,QAAI,UAAU,MAAM,OAAO,SAAS,KAAK,gBAAgB,OAAW,QAAO;AAC3E,QAAI,YAAY,OAAO,SAAS,EAAG,QAAO,EAAE,wBAAwB,EAAE,SAAS,YAAY,OAAO,CAAC,EAAG,CAAC;AACvG,QAAI,YAAY,WAAW,EAAG,QAAO,EAAE,gBAAgB;AACvD,QAAI,YAAY,iBAAiB,EAAG,QAAO,EAAE,eAAe;AAC5D,WAAO;AAAA,EACT,GAAG;AAGH,QAAM,QAAQ,CAAC,OAAe,KAAa,YAA2C;AACpF,QAAI,SAAS,KAAM;AACnB,YAAQ,KAAK;AACb,aAAS,IAAI;AACb,SAAK,MAAM,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,MAC1E,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC,EACE,KAAK,OAAO,aAAa;AACxB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,UAAI,SAAS,MAAM,MAAM,OAAO,MAAM;AAAE,kBAAU;AAAG;AAAA,MAAO;AAC5D,YAAM,IAAI,MAAM,MAAM,SAAS,OAAO,SAAS,MAAM,CAAC;AAAA,IACxD,CAAC,EACA,MAAM,CAAC,UAAmB;AAAE,eAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAAE,CAAC,EAC9F,QAAQ,MAAM;AAAE,cAAQ,IAAI;AAAA,IAAE,CAAC;AAAA,EACpC;AACA,QAAM,eAAe,CAAC,YAAoB,aAA4B;AACpE,UAAM,UAAU,UAAU,IAAI,yBAAyB,EAAE,YAAY,SAAS,CAAC;AAAA,EACjF;AACA,QAAM,eAAe,CAAC,eAA6B;AACjD,UAAM,UAAU,UAAU,IAAI,yBAAyB,EAAE,YAAY,QAAQ,SAAS,CAAC;AAAA,EACzF;AACA,QAAM,YAAY,CAAC,YAAoB,YAA2B;AAChE,QAAI,SAAS,KAAM;AACnB,YAAQ,QAAQ,UAAU,EAAE;AAC5B,aAAS,IAAI;AACb,SAAK,MAAM,wBAAwB,mBAAmB,KAAK,CAAC,IAAI,mBAAmB,UAAU,CAAC,IAAI;AAAA,MAChG,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,MAC1E,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,IAClC,CAAC,EACE,KAAK,OAAO,aAAa;AACxB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,UAAI,SAAS,MAAM,MAAM,OAAO,MAAM;AAAE,kBAAU;AAAG;AAAA,MAAO;AAC5D,YAAM,IAAI,MAAM,MAAM,SAAS,OAAO,SAAS,MAAM,CAAC;AAAA,IACxD,CAAC,EACA,MAAM,CAAC,UAAmB;AAAE,eAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAAE,CAAC,EAC9F,QAAQ,MAAM;AAAE,cAAQ,IAAI;AAAA,IAAE,CAAC;AAAA,EACpC;AAMA,QAAM,WAAW,CAAC,YAAoB,OAAiB,SAAkB,WAAoC;AAC3G,QAAI,MAAM,WAAW,KAAK,aAAa,QAAQ,SAAS,KAAM;AAC9D,gBAAY,MAAM,CAAC,CAAE;AACrB,aAAS,IAAI;AACb,SAAK,MAAM,wBAAwB,mBAAmB,UAAU,CAAC,IAAI;AAAA,MACnE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,MAC1E,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,GAAI,UAAU,KAAK,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO,EAAG,CAAC;AAAA,IACpG,CAAC,EACE,KAAK,OAAO,aAAa;AACxB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,UAAI,SAAS,MAAM,MAAM,OAAO,MAAM;AAAE,kBAAU;AAAG;AAAA,MAAO;AAC5D,YAAM,IAAI,MAAM,MAAM,SAAS,OAAO,SAAS,MAAM,CAAC;AAAA,IACxD,CAAC,EACA,MAAM,CAAC,UAAmB;AAAE,eAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAAE,CAAC,EAC9F,QAAQ,MAAM;AAAE,kBAAY,IAAI;AAAA,IAAE,CAAC;AAAA,EACxC;AACA,QAAM,aAAa,CAAC,YAAoB,UAAkB,SAAkB,WAAoC;AAC9G,aAAS,YAAY,CAAC,QAAQ,GAAG,SAAS,MAAM;AAAA,EAClD;AACA,QAAM,YAAY,CAAC,eAA6B;AAC9C,QAAI,SAAS,KAAM;AACnB,YAAQ,OAAO,UAAU,EAAE;AAC3B,aAAS,IAAI;AACb,SAAK,MAAM,0BAA0B,mBAAmB,KAAK,CAAC,YAAY,mBAAmB,UAAU,CAAC,IAAI;AAAA,MAC1G,QAAQ;AAAA,MAAU,SAAS,EAAE,QAAQ,mBAAmB;AAAA,IAC1D,CAAC,EACE,KAAK,OAAO,aAAa;AACxB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,UAAI,SAAS,MAAM,MAAM,OAAO,MAAM;AAAE,kBAAU;AAAG;AAAA,MAAO;AAC5D,YAAM,IAAI,MAAM,MAAM,SAAS,OAAO,SAAS,MAAM,CAAC;AAAA,IACxD,CAAC,EACA,MAAM,CAAC,UAAmB;AAAE,eAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAAE,CAAC,EAC9F,QAAQ,MAAM;AAAE,cAAQ,IAAI;AAAA,IAAE,CAAC;AAAA,EACpC;AAEA,QAAM,aAAa,MAAY;AAC7B,QAAI,SAAS,QAAQ,OAAO,SAAS,EAAG;AACxC,YAAQ,cAAc;AACtB,aAAS,IAAI;AACb,UAAM,QAAQ,CAAC,GAAG,MAAM;AACxB,UAAM,YAAY;AAChB,iBAAW,cAAc,OAAO;AAC9B,cAAM,WAAW,MAAM,MAAM,wBAAwB,mBAAmB,KAAK,CAAC,IAAI,mBAAmB,UAAU,CAAC,IAAI;AAAA,UAClH,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,UAC1E,MAAM,KAAK,UAAU,EAAE,SAAS,KAAK,CAAC;AAAA,QACxC,CAAC;AACD,cAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,YAAI,EAAE,SAAS,MAAM,MAAM,OAAO,MAAO,OAAM,IAAI,MAAM,MAAM,SAAS,OAAO,SAAS,MAAM,CAAC;AAAA,MACjG;AACA,gBAAU;AAAA,IACZ,GAAG,EACA,MAAM,CAAC,UAAmB;AAAE,eAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAAE,CAAC,EAC9F,QAAQ,MAAM;AAAE,cAAQ,IAAI;AAAA,IAAE,CAAC;AAAA,EACpC;AAGA,QAAM,SAAS,MAAM,KAAK,EAAE,YAAY;AACxC,QAAM,eAAe,QAAQ,OAAO,aAAW,WAAW,MACrD,OAAO,WAAW,YAAY,EAAE,SAAS,MAAM,KAC/C,OAAO,MAAM,KAAK,UAAQ,KAAK,KAAK,YAAY,EAAE,SAAS,MAAM,CAAC,OACjE,WAAW,UACT,UAAU,KAAM,WAAW,QAAQ,OAAO,OAAO,WAAW,CAAC,OAAO,OAAO,WAC1E,WAAW,QAAQ,OAAO,IAAI,OAAO,UAAU,IAAI,CAAC,OAAO,IAAI,OAAO,UAAU,GAAI;AAC7F,QAAM,WAAW,QAAQ,OAAO,SAAO,WAAW,MAC7C,IAAI,WAAW,YAAY,EAAE,SAAS,MAAM,KAC5C,IAAI,QAAQ,YAAY,EAAE,SAAS,MAAM,CAAC;AAE/C,SACE,8CAAC,SAAI,WAAW,IAAI,eAElB;AAAA,kDAAC,SAAI,WAAW,IAAI,SAClB;AAAA,mDAAC,UAAK,WAAW,IAAI,aAClB,oBAAU,KACP,EAAE,iBAAiB,IACnB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,QAAQ,MAAM,CAAC,GAC7D;AAAA,MACC,UAAU,MAAM,OAAO,OAAO,KAC7B,6CAAC,YAAO,MAAK,UAAS,WAAW,IAAI,aAAa,UAAU,SAAS,MAAM,SAAS,YACjF,YAAE,aAAa,GAClB;AAAA,OAEJ;AAAA,IAEC,UAAU,QAAQ,6CAAC,OAAE,WAAW,IAAI,OAAO,MAAK,SAAS,YAAE,mBAAmB,EAAE,SAAS,MAAM,CAAC,GAAE;AAAA,IAGlG,aAAa,QAAQ,6CAAC,OAAE,WAAW,IAAI,OAAO,MAAK,SAAS,oBAAS;AAAA,IAGrE,aAAa,SAAS,KACrB,6CAAC,OAAE,WAAW,IAAI,cAAc,MAAK,UAAU,YAAE,mBAAmB,EAAE,OAAO,aAAa,KAAK,QAAG,EAAE,CAAC,GAAE;AAAA,IAGxG,KAAK,UAAU,gBACd,6CAAC,OAAE,WAAW,IAAI,cAAe,YAAE,oBAAoB,GAAE,IAEzD,8EAEE;AAAA,oDAAC,aAAQ,WAAW,IAAI,YAAY,aAAW,aAAa,SAAS,QACnE;AAAA,qDAAC,YAAO,WAAW,IAAI,gBAAgB,aAAW,aAAa,SAAS,QACtE;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,IAAI;AAAA,YACf,iBAAe;AAAA,YACf,SAAS,MAAM;AAAE,4BAAc,CAAC,UAAU,CAAC,KAAK;AAAA,YAAE;AAAA,YAElD;AAAA,2DAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO,uDAAC,8DAA0B,MAAM,IAAI,GAAE;AAAA,cAC3F,6CAAC,UAAK,WAAW,IAAI,YAAa,oBAAU,KAAK,EAAE,cAAc,IAAI,EAAE,wBAAwB,GAAE;AAAA,cACjG,6CAAC,UAAK,WAAW,IAAI,aAAc,uBAAa,QAAO;AAAA,cACvD,6CAAC,kEAA8B,WAAW,IAAI,SAAS,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,QACtF,GACF;AAAA,QACC,cAAe,8EACf;AAAA,oBAAU,MAAM,6CAAC,OAAE,WAAW,IAAI,cAAe,YAAE,mBAAmB,GAAE;AAAA,UACxE,aAAa,WAAW,IACvB,6CAAC,OAAE,WAAW,IAAI,cAAe,kBAAQ,WAAW,IAAI,EAAE,cAAc,IAAI,EAAE,sBAAsB,GAAE,IAEtG,6CAAC,SAAI,WAAW,IAAI,YACjB,uBAAa,IAAI,CAAC,WAAW;AAC5B,kBAAM,WAAW,OAAO,IAAI,OAAO,UAAU;AAC7C,kBAAM,UAAU,SAAS,IAAI,OAAO,UAAU;AAC9C,kBAAM,WAAW,MAAM,OAAO,YAAY,SAAS;AACnD,kBAAM,cAAc,SAAS,OAAO,UAAU;AAC9C,kBAAM,SAAS,OAAO,MAAM;AAC5B,kBAAM,aAAa,0BAA0B,OAAO,WAAW,MAAM;AAErE,kBAAM,cAAc,aAAa,OAAO,OAAO,QAAQ,EAAE,OAAO,UAAQ,YAAY,IAAI,IAAI,CAAC,EAAE;AAC/F,mBACE,8CAAC,aAA4C,WAAW,IAAI,YAC1D;AAAA,4DAAC,SAAI,WAAW,IAAI,gBAClB;AAAA,8DAAC,UAAK,WAAW,IAAI,oBACnB;AAAA,+DAAC,UAAK,WAAW,IAAI,gBAAiB,iBAAO,YAAW;AAAA,kBACxD,8CAAC,UAAK,WAAW,IAAI,gBAEnB;AAAA,kEAAC,UAAK,WAAW,IAAI,cAClB;AAAA,6BAAO,YAAY,IAAI,OAAO,YAAY;AAAA,sBAAO;AAAA,sBAAE,EAAE,gBAAgB;AAAA,uBACxE;AAAA,oBACC,cACC,6CAAC,UAAK,WAAW,IAAI,cAAc,YAAS,QAAO,OAAO,EAAE,uBAAuB,GAChF,YAAE,oBAAoB,GACzB;AAAA,oBAGD,cAAc,KACb,8CAAC,UAAK,WAAW,IAAI,cAAc,eAAY,QAAO,OAAO,EAAE,qBAAqB,GACjF;AAAA,wBAAE,kBAAkB;AAAA,sBAAG,cAAc,IAAI,IAAI,WAAW,KAAK;AAAA,uBAChE;AAAA,oBAED,SAAS,SAAS,KACjB,6CAAC,UAAK,WAAW,IAAI,cAAc,YAAS,QAAQ,YAAE,wBAAwB,EAAE,GAAG,SAAS,OAAO,CAAC,GAAE;AAAA,oBAEvG,UAAU,KACN,OAAO,OAAO,WAAW,6CAAC,UAAK,WAAW,IAAI,cAAe,YAAE,iBAAiB,GAAE,IAAU,OAC5F,WAAW,6CAAC,UAAK,WAAW,IAAI,cAAe,YAAE,iBAAiB,GAAE,IAAU;AAAA,qBACrF;AAAA,mBACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,UAAU,KACZ,OAAO,OAAO,WAAW,EAAE,aAAa,IAAI,EAAE,iBAAiB,IAChE,UACE,EAAE,4BAA4B,IAC9B,WAAW,EAAE,aAAa,IAAI,EAAE,iBAAiB;AAAA,oBACvD,MAAK;AAAA,oBACL,SAAS;AAAA,oBAET;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,gBAAc,UAAU,KAAK,CAAC,OAAO,OAAO,WAAW,CAAC;AAAA,wBACxD,cAAY,UAAU,KAAK,EAAE,iBAAiB,IAAI,EAAE,iBAAiB;AAAA,wBACrE,WAAW,GAAG,IAAI,MAAM,KAAK,UAAU,KAAK,OAAO,OAAO,WAAW,YAAY,IAAI,YAAY,IAAI,QAAQ;AAAA,wBAG7G,UAAU,SAAS,QAAS,UAAU,MAAM,CAAC,OAAO,OAAO;AAAA,wBAC3D,SAAS,MAAM;AACb,8BAAI,UAAU,IAAI;AAChB,kCAAM,eAAe,CAAC,OAAO,OAAO;AACpC,yCAAa,OAAO,YAAY,YAAY;AAE5C,gCAAI,CAAC,aAAc,cAAa,CAAC,OAAO,UAAU,CAAC;AAAA,0BACrD,MAAO,WAAU,OAAO,YAAY,QAAQ;AAAA,wBAC9C;AAAA,wBAEA,uDAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO;AAAA;AAAA,oBACtD;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cACA,6CAAC,OAAE,WAAW,IAAI,gBACf,iBAAO,OAAO,YAAY,UAAU,MAAM,OAAO,MAAM,WAAW,IAC/D,GAAG,EAAE,iBAAiB,CAAC,SAAM,EAAE,qBAAqB,CAAC,KACrD,EAAE,cAAc,GACtB;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,YAAY,OAAO;AAAA,kBACnB,OAAO,OAAO;AAAA,kBACd,eAAe;AAAA,kBACf,QAAQ;AAAA,kBACR,MAAM;AAAA,kBACN,UAAU,CAAC,UAAU,YAAY;AAAE,+BAAW,OAAO,YAAY,UAAU,SAAS,SAAS;AAAA,kBAAE;AAAA;AAAA,cACjG;AAAA,cACA,8CAAC,SAAI,WAAW,IAAI,aAClB;AAAA,6DAAC,UAAK,WAAW,IAAI,aACnB,uDAAC,UAAK,WAAW,IAAI,kBAClB,oBAAU,KAAK,EAAE,mBAAmB,IACjC,UACG,WAAW,EAAE,wBAAwB,IAAI,EAAE,kBAAkB,IAC9D,WAAW,EAAE,iBAAiB,IAAI,EAAE,oBAAoB,GAChE,GACF;AAAA,gBACC,UAAU,MAAM,OAAO,OAAO,WAC7B;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAW,IAAI;AAAA,oBACf,OAAO,EAAE,WAAW;AAAA,oBACpB,UAAU,SAAS;AAAA,oBACnB,SAAS,MAAM;AAAE,mCAAa,OAAO,UAAU;AAAA,oBAAE;AAAA,oBAEjD;AAAA,mEAAC,4DAAwB,MAAM,IAAI,eAAY,QAAO;AAAA,sBAAG,EAAE,WAAW;AAAA;AAAA;AAAA,gBACxE,IACE;AAAA,iBACN;AAAA,iBA7FY,UAAU,OAAO,UAAU,EA8FzC;AAAA,UAEJ,CAAC,GACH;AAAA,WAEF;AAAA,SACF;AAAA,MAGC,UAAU,MACT,8CAAC,aAAQ,WAAW,IAAI,YAAY,aAAW,UAAU,SAAS,QAChE;AAAA,qDAAC,YAAO,WAAW,IAAI,gBAAgB,aAAW,UAAU,SAAS,QACnE;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,IAAI;AAAA,YACf,iBAAe;AAAA,YACf,SAAS,MAAM;AAAE,yBAAW,CAAC,UAAU,CAAC,KAAK;AAAA,YAAE;AAAA,YAE/C;AAAA,2DAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO,uDAAC,kEAA8B,MAAM,IAAI,GAAE;AAAA,cAC/F,6CAAC,UAAK,WAAW,IAAI,YAAa,YAAE,qBAAqB,GAAE;AAAA,cAC3D,6CAAC,UAAK,WAAW,IAAI,aAAc,mBAAS,QAAO;AAAA,cACnD,6CAAC,kEAA8B,WAAW,IAAI,SAAS,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,QACtF,GACF;AAAA,QACC,WAAY,8EACb;AAAA,uDAAC,OAAE,WAAW,IAAI,cAAe,YAAE,kBAAkB,GAAE;AAAA,UACtD,QAAQ,UAAU,YAAY,6CAAC,OAAE,WAAW,IAAI,cAAe,YAAE,sBAAsB,GAAE;AAAA,UACzF,SAAS,WAAW,IACnB,6CAAC,OAAE,WAAW,IAAI,cAAe,kBAAQ,WAAW,IAAI,EAAE,mBAAmB,IAAI,EAAE,sBAAsB,GAAE,IAE3G,6CAAC,SAAI,WAAW,IAAI,YACjB,mBAAS,IAAI,SAAO;AAEnB,kBAAM,SAAS,MAAM,IAAI,YAAY,KAAK;AAE1C,kBAAM,gBAAgB,IAAI,SAAS,CAAC,GAAG,IAAI,UAAQ,KAAK,IAAI;AAC5D,kBAAM,cAAc,aAAa,SAAS,KAAK,aAAa,MAAM,UAAQ,OAAO,SAAS,IAAI,CAAC;AAC/F,mBACA,8CAAC,aAAsC,WAAW,IAAI,YACpD;AAAA,4DAAC,SAAI,WAAW,IAAI,gBAClB;AAAA,8DAAC,UAAK,WAAW,IAAI,oBACnB;AAAA,+DAAC,UAAK,WAAW,IAAI,gBAAiB,cAAI,YAAW;AAAA,kBACrD,8CAAC,UAAK,WAAW,IAAI,gBACnB;AAAA,iEAAC,UAAK,WAAW,IAAI,cAAe,cAAI,WAAU;AAAA,oBAClD,8CAAC,UAAK,WAAW,IAAI,cACjB;AAAA,2BAAI,mBAAmB,KAAK,IAAI,IAAI,kBAAmB,IAAI,OAAO,UAAU;AAAA,sBAAG;AAAA,sBAAE,EAAE,gBAAgB;AAAA,uBACvG;AAAA,oBACC,0BAA0B,IAAI,mBAAmB,GAAG,IAAI,OAAO,UAAU,CAAC,KACzE,6CAAC,UAAK,WAAW,IAAI,cAAc,YAAS,QAAO,OAAO,EAAE,uBAAuB,GAChF,YAAE,oBAAoB,GACzB;AAAA,oBAED,QAAQ,KAAK,UAAQ,KAAK,eAAe,IAAI,UAAU,KACtD,6CAAC,UAAK,WAAW,IAAI,cAAc,eAAY,QAAO,OAAO,EAAE,0BAA0B,GACtF,YAAE,0BAA0B,GAC/B;AAAA,oBAED,OAAO,SAAS,KACf,6CAAC,UAAK,WAAW,IAAI,cAAc,YAAS,QAAQ,YAAE,wBAAwB,EAAE,GAAG,OAAO,OAAO,CAAC,GAAE;AAAA,qBAExG;AAAA,mBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,aAAa,WAAW,IAC3B,EAAE,uBAAuB,IACzB,cACE,EAAE,kBAAkB,IACpB,OAAO,SAAS,IACd,GAAG,EAAE,mBAAmB,CAAC,SAAM,EAAE,mBAAmB,CAAC,KACrD,EAAE,mBAAmB;AAAA,oBAC7B,MAAK;AAAA,oBACL,SAAS;AAAA,oBAET;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,gBAAc,CAAC;AAAA,wBACf,cAAY,EAAE,kBAAkB,EAAE,MAAM,IAAI,WAAW,CAAC;AAAA,wBACxD,WAAW,GAAG,IAAI,MAAM,IAAI,cAAc,IAAI,YAAY,IAAI,QAAQ;AAAA,wBACtE,UAAU,SAAS,QAAQ,aAAa,QAAQ,aAAa,WAAW;AAAA,wBACxE,SAAS,MAAM;AAAE,mCAAS,IAAI,YAAY,cAAc,aAAa,KAAK;AAAA,wBAAE;AAAA,wBAE5E,uDAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO;AAAA;AAAA,oBACtD;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,cACA,6CAAC,OAAE,WAAW,IAAI,gBAAiB,cAAI,SAAQ;AAAA,cAC/C;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,YAAY,IAAI;AAAA,kBAChB,OAAO,IAAI,SAAS,CAAC;AAAA,kBACrB,eAAe;AAAA,kBACf,MAAM;AAAA,kBACN,UAAU,CAAC,UAAU,YAAY;AAAE,+BAAW,IAAI,YAAY,UAAU,SAAS,KAAK;AAAA,kBAAE;AAAA;AAAA,cAC1F;AAAA,cACA,8CAAC,SAAI,WAAW,IAAI,aAClB;AAAA,6DAAC,UAAK,WAAW,IAAI,aACnB,uDAAC,UAAK,WAAW,IAAI,kBAAmB,YAAE,qBAAqB,GAAE,GACnE;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAW,IAAI;AAAA,oBACf,UAAU,SAAS;AAAA,oBACnB,SAAS,MAAM;AAAE,sCAAgB,IAAI,UAAU;AAAA,oBAAE;AAAA,oBAEjD;AAAA,mEAAC,4DAAwB,MAAM,IAAI,eAAY,QAAO;AAAA,sBAAG,EAAE,WAAW;AAAA;AAAA;AAAA,gBACxE;AAAA,iBACF;AAAA,iBAtEY,OAAO,IAAI,UAAU,EAuEnC;AAAA,UAEF,CAAC,GACH;AAAA,WAEF;AAAA,SACF;AAAA,OAEJ;AAAA,IAIF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY,EAAE,OAAO;AAAA,QACrB,OAAO,GAAG,EAAE,iBAAiB,CAAC,SAAM,QAAQ,QAAQ,KAAK;AAAA,QAEzD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV,SAAS,CAAC,UAAU;AAAE,wBAAU;AAAG,2BAAa,KAAK;AAAA,YAAE;AAAA,YACvD,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAGC,cAAc,QACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAI;AAAA,QACJ,OAAO,EAAE,uBAAuB;AAAA,QAChC,SAAS,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAAA,QACrD,cAAc,EAAE,WAAW;AAAA,QAC3B,aAAa,EAAE,QAAQ;AAAA,QACvB,QAAM;AAAA,QACN,WAAW,MAAM;AAAE,gBAAM,OAAO;AAAW,uBAAa,IAAI;AAAG,uBAAa,IAAI;AAAA,QAAE;AAAA,QAClF,SAAS,MAAM;AAAE,uBAAa,IAAI;AAAA,QAAE;AAAA;AAAA,IACtC;AAAA,IAID,iBAAiB,QAChB;AAAA,MAAC;AAAA;AAAA,QACC,MAAI;AAAA,QACJ,OAAO,EAAE,0BAA0B;AAAA,QACnC,SAAS,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAAA,QAC3D,cAAc,EAAE,WAAW;AAAA,QAC3B,aAAa,EAAE,QAAQ;AAAA,QACvB,QAAM;AAAA,QACN,WAAW,MAAM;AAAE,gBAAM,OAAO;AAAc,0BAAgB,IAAI;AAAG,oBAAU,IAAI;AAAA,QAAE;AAAA,QACrF,SAAS,MAAM;AAAE,0BAAgB,IAAI;AAAA,QAAE;AAAA;AAAA,IACzC;AAAA,KAEJ;AAEJ;;;AGhkBA,IAAAC,iBAAgE;AAChE,IAAAC,mCAEO;;;ACmCA,IAAM,2BAA2B,CAAC,gBAAM,gBAAM,4BAAQ,4BAAQ,gBAAM,sBAAO,gBAAM,cAAI;AAGrF,IAAM,gBAAgB;AAGtB,IAAM,wBAAwB;AAK9B,SAAS,eAAe,QAAuC;AACpE,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,EAC5D,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC5B;AAEO,IAAM,cAAc;;;ADnBnB,IAAAC,sBAAA;AAhBD,SAAS,eAAe,EAAE,OAAO,UAAU,MAAM,GAIxC;AACd,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,OAAO,MAAM,UAAU;AAC7B,QAAM,MAAM,CAAC,QAAsB;AACjC,UAAM,OAAO,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE;AACnC,aAAS,EAAE;AACX,QAAI,SAAS,MAAM,MAAM,SAAS,IAAI,KAAK,KAAM;AACjD,aAAS,CAAC,GAAG,OAAO,IAAI,CAAC;AAAA,EAC3B;AACA,SACE,8CAAC,SAAI,WAAW,IAAI,WACjB;AAAA,UAAM,WAAW,IAChB,6CAAC,OAAE,WAAW,IAAI,UAAW,iBAAO,oBAAoB,GAAE,IAE1D,6CAAC,QAAG,WAAW,IAAI,aAAa,cAAY,OACzC,gBAAM,IAAI,CAAC,SACV,8CAAC,QAAc,WAAW,IAAI,gBAC5B;AAAA,mDAAC,UAAK,WAAW,IAAI,iBAAkB,gBAAK;AAAA,MAC5C;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,IAAI;AAAA,UACf,cAAY,OAAO,mBAAmB,EAAE,KAAK,CAAC;AAAA,UAC9C,SAAS,MAAM;AAAE,qBAAS,MAAM,OAAO,CAAC,SAAS,SAAS,IAAI,CAAC;AAAA,UAAE;AAAA,UAEjE,uDAAC,4DAAwB,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA,MACxD;AAAA,SATO,IAUT,CACD,GACH;AAAA,IAEF,6CAAC,SAAI,WAAW,IAAI,YAAY,MAAK,SAAQ,cAAY,OAAO,gBAAgB,GAC7E,mCAAyB,OAAO,CAAC,WAAW,CAAC,MAAM,SAAS,MAAM,CAAC,EAAE,IAAI,CAAC,WACzE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAEL,WAAW,IAAI;AAAA,QACf,UAAU;AAAA,QACV,OAAO,OAAO,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAAA,QACpD,SAAS,MAAM;AAAE,cAAI,MAAM;AAAA,QAAE;AAAA,QAE7B;AAAA,uDAAC,UAAK,WAAW,IAAI,eAAe,eAAY,QAAO,eAAC;AAAA,UAAQ;AAAA;AAAA;AAAA,MAN3D;AAAA,IAOP,CACD,GACH;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,IAAI;AAAA,QACf,OAAO;AAAA,QACP,aAAa,OAAO,sBAAsB;AAAA,QAC1C,cAAY,OAAO,iBAAiB;AAAA,QACpC,UAAU;AAAA,QACV,UAAU,CAAC,UAAU;AAAE,mBAAS,MAAM,cAAc,KAAK;AAAA,QAAE;AAAA,QAC3D,WAAW,CAAC,UAAU;AAAE,cAAI,MAAM,QAAQ,SAAS;AAAE,kBAAM,eAAe;AAAG,gBAAI,KAAK;AAAA,UAAE;AAAA,QAAE;AAAA;AAAA,IAC5F;AAAA,IACC,QAAQ,6CAAC,OAAE,WAAW,IAAI,UAAW,iBAAO,kBAAkB,EAAE,GAAG,sBAAsB,CAAC,GAAE;AAAA,KAC/F;AAEJ;AAEO,SAAS,UAAU,EAAE,OAAO,UAAU,YAAY,SAAS,cAAc,YAAY,OAAO,UAAU,QAAQ,UAAU,UAAU,SAAS,GAgBlI;AACd,QAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC1D,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,QAAM,kBAAc,uBAAsB,IAAI;AAC9C,gCAAU,MAAM,MAAM;AACpB,QAAI,YAAY,YAAY,KAAM,QAAO,aAAa,YAAY,OAAO;AAAA,EAC3E,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,MAAY;AAC9B,cAAU,IAAI;AACd,QAAI,YAAY,YAAY,KAAM,QAAO,aAAa,YAAY,OAAO;AACzE,gBAAY,UAAU,OAAO,WAAW,MAAM;AAAE,gBAAU,KAAK;AAAA,IAAE,GAAG,IAAI;AAAA,EAC1E;AAEA,QAAM,WAAW,MAAY;AAC3B,UAAM,WAAW,MAAY;AAC3B,UAAI;AACF,cAAM,WAAW,SAAS,cAAc,UAAU;AAClD,iBAAS,QAAQ,MAAM;AACvB,iBAAS,MAAM,WAAW;AAC1B,iBAAS,MAAM,UAAU;AACzB,iBAAS,KAAK,YAAY,QAAQ;AAClC,iBAAS,OAAO;AAChB,iBAAS,YAAY,MAAM;AAC3B,iBAAS,KAAK,YAAY,QAAQ;AAAA,MACpC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,QAAI;AACF,UAAI,UAAU,cAAc,QAAW;AACrC,aAAK,UAAU,UAAU,UAAU,MAAM,IAAI,EAAE,KAAK,aAAa,MAAM;AAAE,mBAAS;AAAG,sBAAY;AAAA,QAAE,CAAC;AAAA,MACtG,OAAO;AACL,iBAAS;AACT,oBAAY;AAAA,MACd;AAAA,IACF,QAAQ;AACN,eAAS;AACT,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,cAAc,iBAAiB,UAAU,OAAO,cAAc,IAAI,OAAO,aAAa;AAC5F,QAAM,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY,MAAM;AAC/E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,IAAI;AAAA,MACf,YAAU,UAAU,SAAY;AAAA,MAChC,OAAO,EAAE,WAAW,MAAM;AAAA,MAE1B;AAAA,sDAAC,SAAI,WAAW,IAAI,eAClB;AAAA,uDAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO,mBAAK;AAAA,UACzD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,IAAI;AAAA,cACf,OAAO,MAAM;AAAA,cACb,SAAS,MAAM;AAAE,uBAAO,KAAK;AAAA,cAAE;AAAA,cAE9B,gBAAM;AAAA;AAAA,UACT;AAAA,UACA,6CAAC,UAAK,WAAW,IAAI,iBACnB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,gBAAc;AAAA,cACd,cAAY;AAAA,cACZ,OAAO;AAAA,cACP,WAAW,GAAG,IAAI,MAAM,IAAI,UAAU,IAAI,WAAW,IAAI,SAAS;AAAA,cAClE,UAAU,iBAAiB;AAAA,cAC3B,SAAS,CAAC,UAAU;AAClB,sBAAM,gBAAgB;AACtB,yBAAS,OAAO,CAAC,OAAO;AAAA,cAC1B;AAAA,cAEA,uDAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO;AAAA;AAAA,UACtD,GACF;AAAA,WACF;AAAA,QACC,gBAAgB,MACf,6CAAC,YAAO,MAAK,UAAS,WAAW,IAAI,WAAW,OAAO,aAAa,SAAS,MAAM;AAAE,iBAAO,KAAK;AAAA,QAAE,GAAI,uBAAY;AAAA,QAErH,8CAAC,SAAI,WAAW,IAAI,WAClB;AAAA,uDAAC,UAAK,WAAW,GAAG,IAAI,GAAG,IAAI,IAAI,SAAS,IAAK,wBAAc,OAAO,UAAU,GAAE;AAAA,UAClF,6CAAC,UAAK,WAAW,GAAG,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,YAAU,UAAU,SAAY,QAAS,sBAAW;AAAA,UAClG,CAAC,WAAW,6CAAC,UAAK,WAAW,GAAG,IAAI,GAAG,IAAI,IAAI,SAAS,IAAK,iBAAO,aAAa,GAAE;AAAA,UACpF,6CAAC,UAAK,WAAW,IAAI,WAAY,iBAAO,aAAa,EAAE,GAAG,SAAS,CAAC,GAAE;AAAA,WACxE;AAAA,QACA,8CAAC,SAAI,WAAW,IAAI,eAClB;AAAA,uDAAC,UAAK,WAAW,IAAI,gBAAiB,iBAAO,YAAY,GAAE;AAAA,UAC3D,8CAAC,SAAI,WAAW,IAAI,kBAClB;AAAA,yDAAC,4CAAQ,OAAO,OAAO,eAAe,GAAG,MAAK,UAAS,SAAS,KAC9D;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW,IAAI;AAAA,gBACf,eAAa,SAAS,SAAS;AAAA,gBAC/B,cAAY,SAAS,OAAO,iBAAiB,IAAI,OAAO,eAAe;AAAA,gBACvE,OAAO,SAAS,OAAO,iBAAiB,IAAI,OAAO,eAAe;AAAA,gBAClE,SAAS;AAAA,gBAER,mBAAS,6CAAC,aAAU,IAAK,6CAAC,YAAS;AAAA;AAAA,YACtC,GACF;AAAA,YACC,aAAa,OACZ,6CAAC,4CAAQ,OAAO,OAAO,aAAa,GAAG,MAAK,UAAS,SAAS,KAC5D;AAAA,cAAC;AAAA;AAAA,gBAAO,MAAK;AAAA,gBAAS,WAAW,IAAI;AAAA,gBAAe,cAAY,OAAO,aAAa;AAAA,gBAClF,OAAO,OAAO,aAAa;AAAA,gBAAG,SAAS,MAAM;AAAE,6BAAW,KAAK;AAAA,gBAAE;AAAA,gBACjE,uDAAC,4DAAwB,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA,YACxD,GACF,IAEA,6CAAC,4CAAQ,OAAO,OAAO,gBAAgB,GAAG,MAAK,UAAS,SAAS,KAC/D;AAAA,cAAC;AAAA;AAAA,gBAAO,MAAK;AAAA,gBAAS,WAAW,IAAI;AAAA,gBAAe,cAAY,OAAO,gBAAgB;AAAA,gBACrF,OAAO,OAAO,gBAAgB;AAAA,gBAAG,SAAS,MAAM;AAAE,6BAAW,KAAK;AAAA,gBAAE;AAAA,gBACpE,uDAAC,2DAAuB,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA,YACvD,GACF;AAAA,YAEF,6CAAC,4CAAQ,OAAO,OAAO,gBAAgB,GAAG,MAAK,UAAS,SAAS,KAC/D;AAAA,cAAC;AAAA;AAAA,gBAAO,MAAK;AAAA,gBAAS,WAAW,GAAG,IAAI,aAAa,IAAI,IAAI,mBAAmB;AAAA,gBAC9E,cAAY,OAAO,gBAAgB;AAAA,gBAAG,OAAO,OAAO,gBAAgB;AAAA,gBACpE,SAAS,MAAM;AAAE,6BAAW,KAAK;AAAA,gBAAE;AAAA,gBACnC,uDAAC,4DAAwB,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA,YACxD,GACF;AAAA,aACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AElOA,IAAAC,mCAAsB;;;ACEf,SAAS,WAAWC,IAAmB;AAC5C,SAAO,OAAOA,EAAC,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM;AACpF;AAEO,SAAS,SAASA,IAAmB;AAC1C,SAAO,WAAWA,EAAC,EAChB,QAAQ,oBAAoB,qBAAqB,EACjD,QAAQ,cAAc,iBAAiB,EACvC,QAAQ,mCAAmC,sDAAsD;AACtG;AAEO,SAAS,oBAAoB,MAAsB;AACxD,QAAM,OAAO,OAAO,IAAI,EAAE,QAAQ,mCAAmC,EAAE;AACvE,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,MAAI,OAAO;AACX,MAAI,SAAS;AACb,MAAI,UAAoB,CAAC;AACzB,MAAI,SAAS;AACb,MAAI,UAAU;AACd,QAAM,YAAY,MAAY;AAC5B,QAAI,QAAQ;AAAE,cAAQ;AAAS,eAAS;AAAA,IAAM;AAAA,EAChD;AACA,QAAM,aAAa,MAAY;AAC7B,QAAI,SAAS;AAAE,cAAQ;AAAiB,gBAAU;AAAA,IAAM;AAAA,EAC1D;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,UAAI,QAAQ;AACV,gBAAQ,UAAU,WAAW,QAAQ,KAAK,IAAI,CAAC,IAAI;AACnD,kBAAU,CAAC;AACX,iBAAS;AAAA,MACX,OAAO;AACL,kBAAU;AAAG,mBAAW;AACxB,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AACA,QAAI,QAAQ;AAAE,cAAQ,KAAK,IAAI;AAAG;AAAA,IAAS;AAC3C,QAAI,YAAY,SAAS,YAAY,OAAO;AAC1C,gBAAU;AAAG,iBAAW;AACxB,cAAQ;AACR;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,UAAI,CAAC,SAAS;AAAE,kBAAU;AAAG,gBAAQ;AAAgB,kBAAU;AAAA,MAAK;AACpE,cAAQ,QAAQ,SAAS,QAAQ,QAAQ,SAAS,EAAE,CAAC,IAAI;AACzD;AAAA,IACF;AACA,UAAM,UAAU,oBAAoB,KAAK,OAAO;AAChD,QAAI,YAAY,MAAM;AACpB,gBAAU;AAAG,iBAAW;AAGxB,YAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC;AAC3C,cAAQ,KAAK,OAAO,KAAK,CAAC,MAAM,SAAS,QAAQ,CAAC,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAC1E;AAAA,IACF;AACA,UAAM,OAAO,gBAAgB,KAAK,OAAO;AACzC,QAAI,SAAS,MAAM;AACjB,UAAI,CAAC,QAAQ;AAAE,mBAAW;AAAG,gBAAQ;AAAQ,iBAAS;AAAA,MAAK;AAC3D,cAAQ,SAAS,SAAS,KAAK,CAAC,CAAC,IAAI;AACrC;AAAA,IACF;AACA,cAAU;AAAG,eAAW;AACxB,QAAI,YAAY,IAAI;AAAE,cAAQ;AAAW;AAAA,IAAS;AAClD,YAAQ,QAAQ,SAAS,OAAO,IAAI;AAAA,EACtC;AACA,YAAU;AAAG,aAAW;AACxB,MAAI,OAAQ,SAAQ,UAAU,WAAW,QAAQ,KAAK,IAAI,CAAC,IAAI;AAC/D,SAAO;AACT;;;ADlCU,IAAAC,sBAAA;AAhCH,IAAM,oBAAoB,CAAC,MAAM,IAAI,EAAE;AACvC,IAAM,kBAAkB;AAExB,IAAM,qBAAqB,CAAC,sBAAO,4BAAQ,oBAAK;AAKhD,SAAS,kBAA+B;AAC7C,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,eAAe;AAChD,QAAI,OAAO,QAAQ,YAAY,QAAQ,GAAI,QAAO,EAAE,MAAM,GAAG,MAAM,MAAM;AACzE,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,OAAO,OAAO,OAAO,SAAS,YAAY,OAAO,QAAQ,KAAK,OAAO,OAAO,kBAAkB,SAChG,KAAK,MAAM,OAAO,IAAI,IACtB;AACJ,WAAO,EAAE,MAAM,MAAM,OAAO,SAAS,KAAK;AAAA,EAC5C,QAAQ;AACN,WAAO,EAAE,MAAM,GAAG,MAAM,MAAM;AAAA,EAChC;AACF;AAGO,SAAS,iBAAiB,OAA0B;AACzD,MAAI;AAAE,iBAAa,QAAQ,iBAAiB,KAAK,UAAU,KAAK,CAAC;AAAA,EAAE,QAAQ;AAAA,EAAW;AACxF;AAGO,SAAS,iBAAiB,EAAE,KAAK,GAAmC;AACzE,SACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAY,QAC1J,iBACG,6CAAC,UAAK,GAAE,0DAAyD,IACjE,6CAAC,UAAK,GAAE,0DAAyD,GACvE;AAEJ;AAIO,SAAS,cAAc,OAA4B;AACxD,QAAM,OAAkB,CAAC;AACzB,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAI,UAAU;AACd,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG;AAC5C,gBAAU,YAAY,KAAK,MAAM,CAAC,IAAI,UAAU,MAAM,MAAM,CAAC;AAC7D,UAAI,CAAC,SAAS,IAAI,OAAO,GAAG;AAC1B,iBAAS,IAAI,OAAO;AACpB,aAAK,KAAK,EAAE,MAAM,OAAO,MAAM,UAAU,KAAK,OAAO,GAAG,MAAM,MAAM,CAAC;AAAA,MACvE;AAAA,IACF;AACA,SAAK,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,MAAM,SAAS,GAAG,MAAM,SAAS,WAAW,CAAC;AAAA,EACtF;AACA,SAAO;AACT;AAMO,SAAS,YAAY;AAAA,EAC1B;AAAA,EAAG;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAY;AAAA,EAAa;AAAA,EAAc;AAAA,EAAc;AAC9E,GASuB;AACrB,MAAI,WAAW,KAAM,QAAO;AAC5B,SACM;AAAA,IAAC;AAAA;AAAA,MACC,MAAI;AAAA,MACJ,SAAS,MAAM;AAAE,gBAAQ;AAAA,MAAE;AAAA,MAC3B,YAAY,EAAE,OAAO;AAAA,MACrB,OAAO,OAAO,MAAM,QAAQ,OAAO,SAAS,aAAa,KAAK,WAAQ,OAAO;AAAA,MAC7E,WAAW,IAAI,eAAe,aAAa,MAAM,IAAI,kBAAkB;AAAA,MACvE,kBAAkB,IAAI;AAAA,MAGtB;AAAA,sDAAC,SAAI,WAAW,IAAI,eAClB;AAAA,wDAAC,UAAK,WAAW,IAAI,YACnB;AAAA,yDAAC,OAAG,iBAAO,MAAK;AAAA,YAChB,6CAAC,UAAM,YAAE,oBAAoB,EAAE,GAAG,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM,MAAM,SAAS,EAAE,CAAC,GAAE;AAAA,aACzG;AAAA,UACA,6CAAC,UAAK,WAAW,IAAI,iBAAiB,MAAK,SAAQ,cAAY,EAAE,YAAY,GAC1E,4BAAkB,IAAI,CAAC,MAAM,UAC5B;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAW,IAAI,iBAAiB,UAAU,IAAI,MAAM,IAAI,kBAAkB,UAAU,IAAI,MAAM,IAAI,kBAAkB;AAAA,cACpH,eAAa,eAAe,QAAQ,SAAS;AAAA,cAC7C,OAAO,mBAAmB,KAAK;AAAA,cAC/B,cAAY,mBAAmB,KAAK;AAAA,cACpC,gBAAc,eAAe;AAAA,cAC7B,SAAS,MAAM;AAAE,4BAAY,KAAK;AAAA,cAAE;AAAA,cACrC;AAAA;AAAA,YARM;AAAA,UAQL,CACH,GACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,IAAI,gBAAgB,MAAM,IAAI;AAAA,cACzC,eAAa,aAAa,SAAS;AAAA,cACnC,OAAO,aAAa,EAAE,gBAAgB,IAAI,EAAE,YAAY;AAAA,cACxD,cAAY,aAAa,EAAE,gBAAgB,IAAI,EAAE,YAAY;AAAA,cAC7D,gBAAc;AAAA,cACd,SAAS;AAAA,cAET,uDAAC,oBAAiB,MAAM,YAAY;AAAA;AAAA,UACtC;AAAA,WACF;AAAA,QACA,8CAAC,SAAI,WAAW,IAAI,cAClB;AAAA,uDAAC,SAAI,WAAW,IAAI,WAAW,cAAY,EAAE,WAAW,GACrD,wBAAc,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,UACpF;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,IAAI,iBAAiB,IAAI,SAAS,QAAQ,MAAM,IAAI,eAAe;AAAA,cAC9E,eAAa,IAAI,SAAS,UAAU,IAAI,SAAS,OAAO,OAAO,SAAS;AAAA,cACxE,YAAU,IAAI,SAAS,QAAQ,SAAS;AAAA,cACxC,OAAO,EAAE,aAAa,IAAI,IAAI,QAAQ,GAAG;AAAA,cACzC,OAAO,IAAI;AAAA,cACX,SAAS,IAAI,SAAS,SAAS,MAAM;AAAE,6BAAa,IAAI,IAAI;AAAA,cAAE,IAAI;AAAA,cAEjE;AAAA,oBAAI,SAAS,QAAQ,eAAQ;AAAA,gBAC7B,IAAI;AAAA;AAAA;AAAA,YATA,IAAI,OAAO,MAAM,OAAO,KAAK;AAAA,UAUpC,CACD,GACH;AAAA,UACA,6CAAC,SAAI,WAAW,IAAI,eAAe,OAAO,EAAE,aAAa,GAAG,OAAO,kBAAkB,UAAU,CAAC,CAAC,KAAK,GACnG,iBAAO,YAAY,OAChB,EAAE,gBAAgB,IAClB,OAAO,UAAU,SACf,OAAO,QACP,6CAAC,SAAI,yBAAyB,EAAE,QAAQ,oBAAoB,OAAO,WAAW,EAAE,EAAE,GAAG,GAC7F;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAER;;;AEnJA,IAAAC,mCAGO;AA2DK,IAAAC,uBAAA;AAnDL,SAAS,WAAW;AAAA,EACzB;AAAA,EAAG;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAc;AAAA,EAAS;AAAA,EAAgB;AAAA,EAAmB;AAAA,EAAU;AAAA,EACtF;AAAA,EAAS;AAAA,EAAW;AAAA,EAAkB;AAAA,EAAU;AAAA,EAAc;AAAA,EAAiB;AAAA,EAAU;AAAA,EACzF;AAAA,EAAiB;AAAA,EAAU;AAAA,EAAU;AAAA,EAAc;AAAA,EAAW;AAAA,EAAgB;AAAA,EAAc;AAAA,EAC5F;AAAA,EAAgB;AAAA,EAAmB;AAAA,EAAY;AAAA,EAAa;AAAA,EAAc;AAAA,EAAY;AAAA,EACtF;AAAA,EAAa;AAAA,EAAe;AAAA,EAAY;AAAA,EAAiB;AAAA,EAAW;AAAA,EAAkB;AACxF,GAwCgB;AACd,SACE,gFAEO;AAAA,WAAO,UAAU,WAChB,+CAAC,SAAI,WAAW,IAAI,cAAc,MAAK,UACrC;AAAA,oDAAC,UAAK,WAAW,IAAI,mBAAoB,YAAE,cAAc,EAAE,GAAG,OAAO,OAAO,OAAO,OAAO,CAAC,GAAE;AAAA,MAC7F,8CAAC,QACE,iBAAO,OAAO,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,UAC5C,8CAAC,QAA2C,gBAAM,WAAzC,GAAG,MAAM,IAAI,IAAI,OAAO,KAAK,CAAC,EAAmB,CAC3D,GACH;AAAA,OACF;AAAA,IAIF,+CAAC,SAAI,WAAW,IAAI,SAClB;AAAA,oDAAC,UAAK,WAAW,IAAI,aAClB,2BAAiB,cACd,EAAE,eAAe,IACjB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,YAAY,GAAG,QAAQ,aAAa,CAAC,GAChH;AAAA,MACC,iBAAiB,eAAe,OAAO,KAAK,cAAc,EAAE,SAAS,KACpE,8CAAC,YAAO,MAAK,UAAS,WAAW,IAAI,aAAa,SAAS,mBACxD,YAAE,aAAa,GAClB;AAAA,OAEJ;AAAA,IAKA,+CAAC,SAAI,WAAW,GAAG,IAAI,UAAU,IAAI,iBAAiB,IACnD;AAAA,YAAM,WAAW,YAAY,8CAAC,OAAE,WAAW,IAAI,QAAS,YAAE,SAAS,GAAE,IAAO;AAAA,MAC5E,MAAM,WAAW,UAChB,+CAAC,SAAI,WAAW,IAAI,SAClB;AAAA,sDAAC,OAAE,MAAK,SAAS,YAAE,OAAO,GAAE;AAAA,QAC5B,+CAAC,2CAAO,SAAQ,WAAU,SAAS,SAAS;AAAA,wDAAC,8DAA0B,MAAM,IAAI;AAAA,UAAE;AAAA,UAAE,EAAE,OAAO;AAAA,WAAE;AAAA,SAClG,IACE;AAAA,MAEH,MAAM,WAAW,YAChB,YACE,8CAAC,OAAE,WAAW,IAAI,UAAW,YAAE,SAAS,GAAE,IAE1C,gFACG;AAAA,yBAAiB,IAAI,CAAC,WAAW;AAChC,gBAAM,QAAQ,SAAS,IAAI,OAAO,EAAE;AACpC,gBAAM,eAAe,cAAc,aAAa,OAAO;AACvD,gBAAM,gBAAgB,gBAAgB,MAAM;AAC5C,gBAAM,iBAAiB,SAAS,IAAI,UAAU,OAAO,EAAE,EAAE;AACzD,gBAAM,YAAY,aAAa,SAAS,GAAG,IAAI,SAAS,IAAI,IAAI,aAAa,KAAK,IAAI;AACtF,gBAAM,UAAU,OAAO,iBAAiB,CAAC;AACzC,gBAAM,aAAa,OAAO,cAAc,CAAC;AACzC,gBAAM,cAAc,OAAO,eAAe;AAE1C,gBAAM,WAAW,SAAS;AAC1B,iBACE,+CAAC,aAAwB,WAAW,IAAI,YAAY,aAAW,WAAW,SAAS,QAAW,cAAY,cAAc,SAAS,QAC/H;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,IAAI;AAAA,gBACf,aAAW,WAAW,SAAS;AAAA,gBAE/B;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAW,IAAI;AAAA,sBACf,iBAAe;AAAA,sBACf,SAAS,CAAC,UAAU;AAGlB,8BAAM,MAAO,MAAM,OAAuB,QAAQ,gBAAgB;AAClE,4BAAI,QAAQ,MAAM;AAChB,gCAAM,MAAM,IAAI,QAAQ,UAAU;AAClC,uCAAa,cAAc,MAAM,OAAO,GAAG;AAC3C;AAAA,wBACF;AACA,uCAAe,OAAO,EAAE;AAAA,sBAC1B;AAAA,sBAEA;AAAA,sEAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO,wDAAC,kBAAe,MAAM,IAAI,GAAE;AAAA,wBAChF,8CAAC,UAAK,WAAW,IAAI,YAAY,OAAO,OAAO,MAAO,iBAAO,MAAK;AAAA,wBAClE,8CAAC,UAAK,WAAW,IAAI,aAAc,YAAE,eAAe,EAAE,GAAG,OAAO,WAAW,CAAC,GAAE;AAAA,wBAC7E,WAAW,SAAS,KACnB,8CAAC,UAAK,WAAW,IAAI,YAClB,qBAAW,IAAI,CAAC,QACf;AAAA,0BAAC;AAAA;AAAA,4BAEC,WAAW,IAAI;AAAA,4BACf,gBAAc;AAAA,4BACd,eAAa,cAAc,OAAO;AAAA,4BAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAC;AAAA,4BAErC;AAAA;AAAA,0BANI;AAAA,wBAOP,CACD,GACH;AAAA,wBAEF,8CAAC,kEAA8B,WAAW,IAAI,SAAS,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,kBACtF;AAAA,kBAEA,8CAAC,UAAK,WAAW,IAAI,cACnB;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,gBAAc;AAAA,sBACd,cAAY,gBAAgB,EAAE,eAAe,IAAI,EAAE,cAAc;AAAA,sBACjE,OAAO,gBAAgB,EAAE,eAAe,IAAI,EAAE,cAAc;AAAA,sBAC5D,WAAW,GAAG,IAAI,MAAM,IAAI,gBAAgB,IAAI,WAAW,IAAI,SAAS;AAAA,sBACxE,UAAU,kBAAkB,OAAO,eAAe;AAAA,sBAClD,SAAS,CAAC,UAAU;AAClB,8BAAM,gBAAgB;AACtB,qCAAa,QAAQ,CAAC,aAAa;AAAA,sBACrC;AAAA,sBAEA,wDAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO;AAAA;AAAA,kBACtD,GACF;AAAA,kBACA,8CAAC,SAAI,WAAW,IAAI,YAClB;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAM,aAAa,UAAU,OAAO,EAAE;AAAA,sBACtC,SAAS,MAAM;AAAE,oCAAY,IAAI;AAAA,sBAAE;AAAA,sBACnC,UAAU,CAAC,OAAO;AAChB,oCAAY,IAAI;AAChB,4BAAI,OAAO,SAAU,cAAa,QAAQ,IAAI;AAAA,iCACrC,OAAO,UAAW,cAAa,QAAQ,KAAK;AAAA,iCAC5C,OAAO,SAAU,iBAAgB,EAAE,UAAU,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,iCAC3E,OAAO,MAAO,eAAc,MAAM;AAAA,iCAClC,OAAO,SAAU,YAAW,EAAE,MAAM,UAAU,OAAO,CAAC;AAAA,sBACjE;AAAA,sBACA,QAAM;AAAA,sBACN,OAAO;AAAA,wBACL,EAAE,IAAI,UAAU,OAAO,EAAE,cAAc,GAAG,MAAM,8CAAC,4DAAwB,MAAM,IAAI,EAAG;AAAA,wBACtF,EAAE,IAAI,WAAW,OAAO,EAAE,eAAe,GAAG,MAAM,8CAAC,4DAAwB,MAAM,IAAI,EAAG;AAAA,wBACxF,EAAE,MAAM,aAAa,IAAI,MAAM;AAAA,wBAC/B,EAAE,IAAI,UAAU,OAAO,EAAE,QAAQ,GAAG,MAAM,8CAAC,2DAAuB,MAAM,IAAI,EAAG;AAAA,wBAC/E,EAAE,IAAI,OAAO,OAAO,EAAE,eAAe,GAAG,MAAM,8CAAC,WAAQ,EAAG;AAAA,wBAC1D,EAAE,IAAI,UAAU,OAAO,EAAE,QAAQ,GAAG,MAAM,8CAAC,4DAAwB,MAAM,IAAI,GAAI,QAAQ,KAAK;AAAA,sBAChG;AAAA,sBACA,QACE;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAW,IAAI;AAAA,0BACf,cAAY,EAAE,aAAa;AAAA,0BAC3B,iBAAc;AAAA,0BACd,iBAAe,aAAa,UAAU,OAAO,EAAE,MAAM;AAAA,0BACrD,SAAS,CAAC,UAAU;AAClB,kCAAM,gBAAgB;AACtB,wCAAY,aAAa,UAAU,OAAO,EAAE,KAAK,OAAO,UAAU,OAAO,EAAE,EAAE;AAAA,0BAC/E;AAAA,0BAEA,wDAAC,+DAA2B,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA,sBAC3D;AAAA;AAAA,kBAEJ,GACF;AAAA;AAAA;AAAA,YACF;AAAA,YACC,gBAAgB,iBAAiB,QAChC,+CAAC,UAAK,WAAW,GAAG,IAAI,UAAU,IAAI,IAAI,eAAe,IAAI,UAAU,CAAC,UAAU;AAAE,mBAAK,aAAa,KAAK;AAAA,YAAE,GAC3G;AAAA;AAAA,gBAAC;AAAA;AAAA,kBAAM,WAAW,IAAI;AAAA,kBAAa,OAAO,aAAa;AAAA,kBAAM,aAAa,EAAE,yBAAyB;AAAA,kBACnG,cAAY,EAAE,yBAAyB;AAAA,kBAAG,WAAS;AAAA,kBAAC,UAAU;AAAA,kBAC9D,UAAU,CAAC,UAAU;AAMnB,0BAAM,OAAO,MAAM,cAAc;AACjC,oCAAgB,CAACC,aAAYA,aAAY,OAAOA,WAAU,EAAE,GAAGA,UAAS,MAAM,KAAK,CAAC;AAAA,kBACtF;AAAA;AAAA,cAAG;AAAA,cACL,8CAAC,2CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,YAAY,aAAa,KAAK,KAAK,MAAM,IAAK,YAAE,QAAQ,GAAE;AAAA,cAC5G,8CAAC,2CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,UAAU,SAAS,MAAM;AAAE,gCAAgB,IAAI;AAAA,cAAE,GAAI,YAAE,QAAQ,GAAE;AAAA,eACrH;AAAA,YAED,QAAQ,SAAS,KAChB,+CAAC,SAAI,WAAW,IAAI,eAAe,MAAK,UACtC;AAAA,4DAAC,UAAM,YAAE,kBAAkB,EAAE,GAAG,QAAQ,OAAO,CAAC,GAAE;AAAA,cAClD,8CAAC,UAAM,kBAAQ,KAAK,QAAG,GAAE;AAAA,cACzB,8CAAC,YAAO,MAAK,UAAS,WAAW,IAAI,kBAAkB,SAAS,MAAM;AAAE,qBAAK,YAAY,MAAM;AAAA,cAAE,GAC9F,YAAE,aAAa,GAClB;AAAA,eACF;AAAA,YAED,YACC,8CAAC,QAAG,WAAW,WAAW,gBAAc,iBAAiB,OAAO,KAAK,SAAS,QAC3E,iBAAO,OAAO,WAAW,IACxB,+CAAC,QAAG,WAAW,IAAI,aACjB;AAAA,4DAAC,UAAK,WAAW,IAAI,kBAAmB,YAAE,kBAAkB,GAAE;AAAA,cAC9D,8CAAC,UAAK,WAAW,IAAI,iBAAkB,YAAE,iBAAiB,GAAE;AAAA,cAC5D,+CAAC,YAAO,MAAK,UAAS,WAAW,IAAI,gBAAgB,SAAS,MAAM;AAAE,+BAAe,OAAO,EAAE;AAAA,cAAE,GAC9F;AAAA,8DAAC,eAAY,MAAM,IAAI;AAAA,gBACtB,EAAE,kBAAkB;AAAA,iBACvB;AAAA,eACF,IACE,OAAO,OAAO,IAAI,CAAC,OAAO,UAC5B;AAAA,cAAC;AAAA;AAAA,gBAA2B;AAAA,gBAAc,UAAU,OAAO;AAAA,gBAAI,YAAY,OAAO;AAAA,gBAChF,SAAS,eAAe,MAAM,IAAI;AAAA,gBAClC,cAAc,kBAAkB,MAAM,IAAI;AAAA,gBAC1C;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,UAAU,CAACC,OAAM;AAAE,uBAAK,iBAAiB,OAAO,IAAIA,GAAE,IAAI;AAAA,gBAAE;AAAA,gBAC5D,UAAU,CAACA,OAAM;AAAE,6BAAW,EAAE,MAAM,SAAS,MAAMA,GAAE,MAAM,KAAKA,GAAE,IAAI,CAAC;AAAA,gBAAE;AAAA;AAAA,cAR7D,MAAM;AAAA,YAQ0D,CACjF,GACH;AAAA,eAlJU,OAAO,EAoJrB;AAAA,QAEJ,CAAC;AAAA,QAEA,gBAAgB,SAAS,KACxB,+CAAC,aAAQ,WAAW,IAAI,YAAY,aAAW,YAAY,SAAS,QAClE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,IAAI;AAAA,cACf,aAAW,YAAY,SAAS;AAAA,cAEhC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW,IAAI;AAAA,kBACf,iBAAe;AAAA,kBACf,SAAS,MAAM;AAAE,qCAAiB,CAAC,UAAU,CAAC,KAAK;AAAA,kBAAE;AAAA,kBAErD;AAAA,kEAAC,UAAK,WAAW,IAAI,YAAY,eAAY,QAAO,wDAAC,8DAA0B,MAAM,IAAI,GAAE;AAAA,oBAC3F,8CAAC,UAAK,WAAW,IAAI,YAAa,YAAE,YAAY,GAAE;AAAA,oBAClD,8CAAC,UAAK,WAAW,IAAI,aAAc,YAAE,eAAe,EAAE,GAAG,gBAAgB,OAAO,CAAC,GAAE;AAAA,oBACnF,8CAAC,kEAA8B,WAAW,IAAI,SAAS,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,cACtF;AAAA;AAAA,UACF;AAAA,UACC,aACC,8CAAC,QAAG,WAAW,aAAa,SAAS,GAAG,IAAI,SAAS,IAAI,IAAI,aAAa,KAAK,IAAI,WAChF,0BAAgB,IAAI,CAAC,OAAO,UAC3B;AAAA,YAAC;AAAA;AAAA,cAA2B;AAAA,cAAc,UAAU;AAAA,cAAM,YAAY;AAAA,cACpE,SAAS,eAAe,MAAM,IAAI;AAAA,cAClC,cAAc,kBAAkB,MAAM,IAAI;AAAA,cAC1C;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,UAAU,CAACA,OAAM;AAAE,gCAAgBA,EAAC;AAAA,cAAE;AAAA,cACtC,UAAU,CAACA,OAAM;AAAE,2BAAW,EAAE,MAAM,SAAS,MAAMA,GAAE,MAAM,KAAKA,GAAE,IAAI,CAAC;AAAA,cAAE;AAAA;AAAA,YAR7D,MAAM;AAAA,UAQ0D,CACjF,GACH;AAAA,WAEJ;AAAA,SAIJ;AAAA,OAGN;AAAA,KACN;AAEJ;;;ACtTA,IAAAC,mCAEO;AAaD,IAAAC,uBAAA;AANC,SAAS,UAAU,EAAE,GAAG,MAAM,OAAO,GAI5B;AACd,SACI,+CAAC,SAAI,WAAU,YACb;AAAA,kDAAC,UAAK,WAAU,aAAY,OAAO,EAAE,MAAM,OAAO,GAAI,YAAE,YAAY,GAAE;AAAA,IACtE,8CAAC,SAAI,WAAW,IAAI,UAAU,MAAK,WAAU,cAAW,oCACpD;AAAA,MACA,CAAC,SAAS,EAAE,WAAW,CAAC;AAAA,MACxB,CAAC,OAAO,EAAE,SAAS,CAAC;AAAA,MACpB,CAAC,UAAU,EAAE,YAAY,CAAC;AAAA,IAC5B,EAAY,IAAI,CAAC,CAAC,OAAO,KAAK,MAC5B;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAe,SAAS;AAAA,QACxB,WAAW,GAAG,IAAI,OAAO,IAAI,SAAS,QAAQ,IAAI,gBAAgB,EAAE;AAAA,QACpE,eAAa,SAAS,SAAS;AAAA,QAC/B,SAAS,MAAM;AAAE,iBAAO,KAAK;AAAA,QAAE;AAAA,QAE9B;AAAA;AAAA,MARI;AAAA,IASP,CACD,GACH;AAAA,KACF;AAEN;AAOO,SAAS,YAAY;AAAA,EAC1B;AAAA,EAAG;AAAA,EAAY;AAAA,EAAe;AAAA,EAAQ;AAAA,EAAc;AAAA,EAAiB;AAAA,EAAS;AAAA,EAC9E;AAAA,EAAiB;AAAA,EAAa;AAAA,EAAc;AAAA,EAAe;AAAA,EAAY;AAAA,EAAe;AAAA,EAAW;AAAA,EACjG;AAAA,EAAc;AAAA,EAAgB;AAAA,EAAa;AAAA,EAAc;AAAA,EAAiB;AAAA,EAAO;AAAA,EAAU;AAAA,EAC3F;AAAA,EAAa;AAAA,EAAS;AAAA,EAAY;AAAA,EAAe;AAAA,EAAa;AAAA,EAAO;AAAA,EAAW;AAAA,EAAW;AAC7F,GAoCgB;AACd,SACM;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,IAAI;AAAA,MACf,aAAW,cAAc;AAAA,MACzB,YAAY,CAAC,UAAU;AAAE,cAAM,eAAe;AAAG,sBAAc,IAAI;AAAA,MAAE;AAAA,MACrE,aAAa,MAAM;AAAE,sBAAc,KAAK;AAAA,MAAE;AAAA,MAC1C,QAAQ,CAAC,UAAU;AAAE,aAAK,OAAO,KAAK;AAAA,MAAE;AAAA,MAExC;AAAA,uDAAC,SAAI,WAAW,IAAI,SAAS,MAAK,SAAQ,cAAY,EAAE,gBAAgB,GACtE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,GAAG,IAAI,OAAO,IAAI,iBAAiB,cAAc,IAAI,gBAAgB,EAAE;AAAA,cAClF,eAAa,iBAAiB,eAAe;AAAA,cAC7C,SAAS,MAAM;AAAE,gCAAgB,WAAW;AAAA,cAAE;AAAA,cAE9C;AAAA,8DAAC,UAAK,WAAW,IAAI,SAAS,eAAa,iBAAiB,eAAe,QAAW,wDAAC,cAAW,MAAM,IAAI,GAAE;AAAA,gBAC9G,8CAAC,UAAK,WAAW,IAAI,UAAW,YAAE,WAAW,GAAE;AAAA,gBAC/C,8CAAC,UAAK,WAAW,IAAI,UAAU,OAAO,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,WAAW,GAAG,OAAO,YAAY,CAAC,GAAI,0BAAgB,WAAW,GAAE;AAAA;AAAA;AAAA,UACpJ;AAAA,UACC,QAAQ,IAAI,CAAC,WAAW;AACvB,kBAAM,gBAAgB,OAAO,OAAO,UAAU,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,WAAW,KAAK,EAAE;AACrG,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAW,GAAG,IAAI,OAAO,IAAI,iBAAiB,OAAO,KAAK,IAAI,gBAAgB,EAAE;AAAA,gBAChF,eAAa,iBAAiB,OAAO,MAAM;AAAA,gBAC3C,SAAS,MAAM;AAAE,kCAAgB,OAAO,EAAE;AAAA,gBAAE;AAAA,gBAE5C;AAAA,gEAAC,UAAK,WAAW,IAAI,SAAS,eAAa,iBAAiB,OAAO,MAAM,QAAW,wDAAC,kEAA8B,MAAM,IAAI,GAAE;AAAA,kBAC/H,8CAAC,UAAK,WAAW,IAAI,UAAW,iBAAO,QAAQ,OAAO,IAAG;AAAA,kBACzD;AAAA,oBAAC;AAAA;AAAA,sBAAK,WAAW,IAAI;AAAA,sBAAU,aAAW,gBAAgB,KAAK;AAAA,sBAC7D,OAAO,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,OAAO,EAAE,GAAG,OAAO,YAAY,CAAC,KAC3E,gBAAgB,IAAI,SAAM,EAAE,uBAAuB,EAAE,GAAG,cAAc,CAAC,CAAC,KAAK;AAAA,sBACjF,0BAAgB,OAAO,EAAE;AAAA;AAAA,kBAC5B;AAAA;AAAA;AAAA,cAZK,OAAO;AAAA,YAad;AAAA,UAEJ,CAAC;AAAA,WACH;AAAA,QAGC,iBACC,+CAAC,SAAI,WAAW,IAAI,YAAY,MAAK,SAAQ,cAAY,EAAE,qBAAqB,GAC9E;AAAA,wDAAC,UAAK,WAAW,IAAI,cAAe,YAAE,gBAAgB,GAAE;AAAA,UACxD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,IAAI;AAAA,cACf,eAAa,cAAc,QAAQ;AAAA,cACnC,gBAAc,cAAc;AAAA,cAC5B,SAAS,MAAM;AAAE,6BAAa,IAAI;AAAA,cAAE;AAAA,cAEnC;AAAA,kBAAE,cAAc;AAAA,gBACjB,8CAAC,UAAK,WAAW,IAAI,cAAe,uBAAY;AAAA;AAAA;AAAA,UAClD;AAAA,UACC,aAAa,IAAI,CAAC,QAAQ;AACzB,kBAAM,OAAO,QAAQ;AACrB,kBAAM,SAAS,cAAc;AAC7B,mBACE;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBAEL,WAAW,IAAI;AAAA,gBACf,eAAa,UAAU;AAAA,gBACvB,gBAAc;AAAA,gBACd,SAAS,MAAM;AAAE,+BAAa,SAAS,OAAO,GAAG;AAAA,gBAAE;AAAA,gBAElD;AAAA,yBAAO,EAAE,eAAe,IAAI;AAAA,kBAC7B,8CAAC,UAAK,WAAW,IAAI,cAAe,yBAAe,IAAI,GAAG,KAAK,GAAE;AAAA;AAAA;AAAA,cAP5D;AAAA,YAQP;AAAA,UAEJ,CAAC;AAAA,WACH;AAAA,QAIF,+CAAC,SAAI,WAAW,IAAI,eAClB;AAAA,yDAAC,SAAI,WAAW,IAAI,WAClB;AAAA,0DAAC,cAAW;AAAA,YACZ;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,IAAI;AAAA,gBACf,OAAO;AAAA,gBACP,aAAa,EAAE,mBAAmB;AAAA,gBAClC,cAAY,EAAE,mBAAmB;AAAA,gBACjC,UAAU,CAAC,UAAU;AAAE,2BAAS,MAAM,cAAc,KAAK;AAAA,gBAAE;AAAA;AAAA,YAC7D;AAAA,aACF;AAAA,UACA,+CAAC,SAAI,WAAW,IAAI,UAClB;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW,IAAI;AAAA,gBACf,OAAO,EAAE,QAAQ,GAAG;AAAA,gBACpB,iBAAc;AAAA,gBACd,iBAAe,aAAa,UAAU;AAAA,gBACtC,SAAS,MAAM;AAAE,8BAAY,CAAC,UAAU,UAAU,SAAS,OAAO,MAAM;AAAA,gBAAE;AAAA,gBAEzE;AAAA,oBAAE,WAAW;AAAA,kBACd,8CAAC,eAAY,KAAK,UAAU,QAAQ,QAAQ,MAAM,IAAI;AAAA,kBACtD,8CAAC,kEAA8B,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,YAC9D;AAAA,YACC,aAAa,UACZ,gFACE;AAAA,4DAAC,YAAO,MAAK,UAAS,WAAW,IAAI,aAAa,cAAY,EAAE,OAAO,GAAG,SAAS,MAAM;AAAE,4BAAY,IAAI;AAAA,cAAE,GAAG;AAAA,cAChH,+CAAC,SAAI,WAAW,IAAI,UAAU,MAAK,QACjC;AAAA;AAAA,kBAAC;AAAA;AAAA,oBAAO,MAAK;AAAA,oBAAS,MAAK;AAAA,oBAAgB,WAAW,IAAI;AAAA,oBAAU,gBAAc;AAAA,oBAChF,SAAS,MAAM;AAAE,iCAAW,IAAI;AAAG,kCAAY,IAAI;AAAA,oBAAE;AAAA,oBACrD;AAAA,oEAAC,UAAK,WAAW,IAAI,WAAW,WAAS,WAAW,QAAW,eAAY,QAAQ,oBAAU,WAAM,IAAG;AAAA,sBACrG,EAAE,SAAS;AAAA;AAAA;AAAA,gBACd;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBAAO,MAAK;AAAA,oBAAS,MAAK;AAAA,oBAAgB,WAAW,IAAI;AAAA,oBAAU,gBAAc,CAAC;AAAA,oBACjF,SAAS,MAAM;AAAE,iCAAW,KAAK;AAAG,kCAAY,IAAI;AAAA,oBAAE;AAAA,oBACtD;AAAA,oEAAC,UAAK,WAAW,IAAI,WAAW,WAAS,CAAC,WAAW,QAAW,eAAY,QAAQ,WAAC,UAAU,WAAM,IAAG;AAAA,sBACvG,EAAE,UAAU;AAAA;AAAA;AAAA,gBACf;AAAA,iBACF;AAAA,eACF;AAAA,aAEJ;AAAA,UACA,8CAAC,SAAI,WAAW,IAAI,WAAW,MAAK,SAAQ,cAAY,EAAE,WAAW,GACjE;AAAA,YACA,CAAC,OAAO,EAAE,WAAW,GAAG,eAAe,aAAa;AAAA,YACpD,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY;AAAA,YAClC,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa;AAAA,UACvC,EAAY,IAAI,CAAC,CAAC,OAAO,OAAO,KAAK,MACnC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAW,GAAG,IAAI,YAAY,IAAI,iBAAiB,QAAQ,IAAI,kBAAkB,EAAE;AAAA,cACnF,eAAa,iBAAiB,SAAS;AAAA,cACvC,gBAAc,iBAAiB;AAAA,cAC/B,SAAS,MAAM;AAAE,gCAAgB,KAAK;AAAA,cAAE;AAAA,cAEvC;AAAA;AAAA,gBACD,8CAAC,UAAK,WAAW,IAAI,gBAAiB,iBAAM;AAAA;AAAA;AAAA,YARvC;AAAA,UASP,CACD,GACH;AAAA,UACA,+CAAC,UAAK,WAAW,IAAI,cAAc,aAAW,WAAW,MAAM,OAAO,WAAW,UAAU,KAAK,SAAY,WAAW,OACpH;AAAA,cAAE,UAAU;AAAA,YAAE;AAAA,YAAI,WAAW;AAAA,aAChC;AAAA,UACA,8CAAC,UAAK,WAAW,IAAI,eAAe;AAAA,UACpC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,IAAI;AAAA,cACf,OAAO,EAAE,QAAQ,IAAI,WAAW,SAAS;AAAA,cACzC,SAAS;AAAA,cAET;AAAA,8DAAC,8DAA0B,MAAM,IAAI,eAAY,QAAO;AAAA,gBACvD,EAAE,SAAS;AAAA;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,GAAG,IAAI,YAAY,IAAI,gBAAgB,IAAI,mBAAmB,EAAE;AAAA,cAC3E,OAAO,EAAE,OAAO,QAAQ,WAAW,GAAG,QAAQ,IAAI,UAAU,GAAG;AAAA,cAC/D,iBAAe,iBAAiB;AAAA,cAChC,SAAS;AAAA,cAET;AAAA,8DAAC,2DAAuB,MAAM,IAAI,eAAY,QAAO;AAAA,gBACpD,EAAE,WAAW;AAAA;AAAA;AAAA,UAChB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,IAAI;AAAA,cACf,OAAO,EAAE,QAAQ,IAAI,WAAW,SAAS;AAAA,cACzC,cAAY,EAAE,gBAAgB;AAAA,cAC9B,OAAO,EAAE,cAAc;AAAA,cACvB,SAAS;AAAA,cAET;AAAA,8DAAC,eAAY,MAAM,IAAI,eAAY,QAAO;AAAA,gBACzC,EAAE,gBAAgB;AAAA;AAAA;AAAA,UACrB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,WAAW,IAAI;AAAA,cACf,UAAQ;AAAA,cACP,GAAG,EAAE,iBAAiB,GAAG;AAAA,cAC1B,UAAU,CAAC,UAAU;AACnB,4BAAY,MAAM,cAAc,UAAU,OAAO,OAAO,MAAM,KAAK,MAAM,cAAc,KAAK,CAAC;AAAA,cAC/F;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA;AAAA,EAEF;AAER;AAKO,SAAS,UAAU;AAAA,EACxB;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAO;AAAA,EAAS;AAAA,EAAW;AAAA,EAAU;AAClF,GAagB;AACd,QAAM,OAAO,KAAK,UAAU,UAAU,KAAK,OAAO;AAClD,QAAM,UAAU,MAAM,WAAW,CAAC;AAClC,QAAM,UAAU,MAAM,WAAW,CAAC;AAClC,QAAM,WAAW,QAAQ,OAAO,YAAU,OAAO,OAAO,QAAQ,EAAE;AAClE,QAAM,WAAW,CAAC,aAAkC,IAAI;AAAA,IACtD,OAAO,QAAQ,MAAM,QAAQ,QAAQ,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAAA,EACrG;AAEA,QAAM,eAAe,CAAC,aAA6B;AACjD,UAAM,SAAS,SAAS,QAAQ;AAChC,WAAO,QAAQ,OAAO,YAAU,CAAC,OAAO,IAAI,OAAO,UAAU,CAAC,EAAE,UAAU,MAAM,gBAAgB,QAAQ,KAAK,CAAC,GAAG;AAAA,EACnH;AACA,QAAM,QAAmG;AAAA,IACvG,EAAE,IAAI,IAAI,OAAO,EAAE,WAAW,GAAG,OAAO,QAAQ,QAAQ,WAAW,GAAG,MAAM,8CAAC,cAAW,MAAM,IAAI,EAAG;AAAA,IACrG,GAAG,QAAQ,IAAI,aAAW;AAAA,MACxB,IAAI,OAAO;AAAA,MACX,OAAO,OAAO,QAAQ,OAAO;AAAA,MAC7B,OAAO,aAAa,OAAO,EAAE;AAAA,MAC7B,WAAW,SAAS,OAAO,EAAE,EAAE;AAAA,MAC/B,MAAM,8CAAC,kEAA8B,MAAM,IAAI;AAAA,IACjD,EAAE;AAAA,EACJ;AAEA,QAAM,OAAO,KAAK,UAAU,UACxB,EAAE,MAAM,MAAM,OAAO,EAAE,WAAW,GAAG,OAAO,EAAE,cAAc,EAAE,GAAG,QAAQ,OAAO,CAAC,EAAE,IACnF,KAAK,UAAU,YACb,EAAE,MAAM,WAAW,OAAO,EAAE,cAAc,GAAG,OAAO,GAAG,IACvD,EAAE,MAAM,QAAQ,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,oBAAoB,EAAE;AAC9E,SACE,+CAAC,SAAI,WAAW,IAAI,QACjB;AAAA,YAAQ,SAAS,KAChB,8CAAC,SAAI,WAAW,IAAI,SAAS,MAAK,SAAQ,cAAY,EAAE,eAAe,GACpE,gBAAM,IAAI,UACT;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,GAAG,IAAI,OAAO,IAAI,UAAU,KAAK,KAAK,IAAI,gBAAgB,EAAE;AAAA,QACvE,eAAa,UAAU,KAAK,MAAM;AAAA,QAClC,SAAS,MAAM;AAAE,kBAAQ,KAAK,EAAE;AAAA,QAAE;AAAA,QAElC;AAAA,wDAAC,UAAK,WAAW,IAAI,SAAS,eAAa,UAAU,KAAK,MAAM,QAAY,eAAK,MAAK;AAAA,UACtF,8CAAC,UAAK,WAAW,IAAI,UAAW,eAAK,OAAM;AAAA,UAC3C;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,IAAI;AAAA,cACf,aAAW,KAAK,YAAY,KAAK;AAAA,cACjC,OAAO,KAAK,OAAO,KACf,EAAE,kBAAkB,EAAE,GAAG,KAAK,MAAM,CAAC,IACrC,EAAE,qBAAqB,EAAE,GAAG,KAAK,MAAM,CAAC,KACrC,KAAK,YAAY,IAAI,SAAM,EAAE,yBAAyB,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC,KAAK;AAAA,cAEvF,eAAK;AAAA;AAAA,UACR;AAAA;AAAA;AAAA,MAjBK,KAAK,OAAO,KAAK,YAAY,KAAK;AAAA,IAkBzC,CACD,GACH;AAAA,IAIF,+CAAC,SAAI,WAAW,IAAI,eAClB;AAAA,qDAAC,SAAI,WAAW,IAAI,WAClB;AAAA,sDAAC,cAAW;AAAA,QACZ;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,IAAI;AAAA,YACf,OAAO;AAAA,YACP,aAAa,EAAE,kBAAkB;AAAA,YACjC,cAAY,EAAE,kBAAkB;AAAA,YAChC,UAAU,CAAC,UAAU;AAAE,sBAAQ,MAAM,cAAc,KAAK;AAAA,YAAE;AAAA;AAAA,QAC5D;AAAA,SACF;AAAA,MACA,8CAAC,SAAI,WAAW,IAAI,WAAW,MAAK,SAAQ,cAAY,EAAE,WAAW,GACjE;AAAA,QACA,CAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,MAAM;AAAA,QACtC,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,SAAS,QAAQ;AAAA,QAC/C,CAAC,OAAO,EAAE,WAAW,GAAG,QAAQ;AAAA,MAClC,EAAY,IAAI,CAAC,CAAC,OAAO,OAAO,KAAK,MACnC;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW,GAAG,IAAI,YAAY,IAAI,WAAW,QAAQ,IAAI,kBAAkB,EAAE;AAAA,UAC7E,eAAa,WAAW,SAAS;AAAA,UACjC,gBAAc,WAAW;AAAA,UACzB,SAAS,MAAM;AAAE,qBAAS,KAAK;AAAA,UAAE;AAAA,UAEhC;AAAA;AAAA,YACD,8CAAC,UAAK,WAAW,IAAI,gBAAiB,iBAAM;AAAA;AAAA;AAAA,QARvC;AAAA,MASP,CACD,GACH;AAAA,MACA,+CAAC,UAAK,WAAW,IAAI,cAAc,aAAW,KAAK,MAAM,OAAO,KAAK,UAAU,KAAK,SAAY,KAAK,OAClG;AAAA,UAAE,eAAe;AAAA,QAAE;AAAA,QAAI,KAAK;AAAA,SAC/B;AAAA,MACA,8CAAC,UAAK,WAAW,IAAI,eAAe;AAAA,MACpC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,IAAI;AAAA,UACf,OAAO,EAAE,QAAQ,IAAI,WAAW,SAAS;AAAA,UACzC,SAAS;AAAA,UAER,YAAE,gBAAgB;AAAA;AAAA,MACrB;AAAA,MACC,UAAU,MACT;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,IAAI;AAAA,UACf,OAAO,EAAE,OAAO,QAAQ,WAAW,GAAG,QAAQ,IAAI,UAAU,GAAG;AAAA,UAC/D,SAAS;AAAA,UAET;AAAA,0DAAC,2DAAuB,MAAM,IAAI,eAAY,QAAO;AAAA,YACpD,EAAE,iBAAiB;AAAA;AAAA;AAAA,MACtB;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,IAAI;AAAA,UACf,OAAO,EAAE,QAAQ,IAAI,WAAW,SAAS;AAAA,UACzC,cAAY,EAAE,cAAc;AAAA,UAC5B,OAAO,UAAU,KAAK,SAAY,EAAE,kBAAkB;AAAA,UACtD,SAAS;AAAA,UAET;AAAA,0DAAC,2DAAuB,MAAM,IAAI,eAAY,QAAO;AAAA,YAEpD,UAAU,KAAK,EAAE,cAAc,IAAI,EAAE,oBAAoB;AAAA;AAAA;AAAA,MAC5D;AAAA,OACF;AAAA,KACF;AAEJ;;;AvC6XM,IAAAC,uBAAA;AApwBN,IAAM,qBAAqB;AAG3B,SAAS,gBAAgB,MAA6B;AACpD,QAAM,QAAQ,KAAK,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE;AAC7C,OAAK,MAAM,CAAC,KAAK,IAAI,KAAK,MAAM,MAAO,QAAO;AAC9C,aAAW,QAAQ,MAAM,MAAM,CAAC,GAAG;AACjC,QAAI,KAAK,KAAK,MAAM,MAAO;AAC3B,UAAM,OAAO,2BAA2B,KAAK,IAAI;AACjD,QAAI,SAAS,KAAM,SAAQ,KAAK,CAAC,KAAK,IAAI,QAAQ,gBAAgB,EAAE;AAAA,EACtE;AACA,SAAO;AACT;AACO,SAAS,YAAY,EAAE,SAAS,UAAU,OAAO,SAAS,MAAM,kBAAkB,iBAAiB,GAAyJ;AACjQ,eAAa;AACb,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAqB,EAAE,QAAQ,UAAU,CAAC;AACpE,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,CAAC;AAEtC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAsB,oBAAI,IAAI,CAAC;AAE/D,QAAM,CAAC,WAAW,gBAAgB,QAAI,yBAAS,KAAK;AACpD,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAA6B,IAAI;AAE7D,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAiB,MAAM,gBAAgB,EAAE,IAAI;AACjF,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAkB,MAAM,gBAAgB,EAAE,IAAI;AAClF,QAAM,CAAC,cAAc,eAAe,QAAI,yBAA2B,IAAI;AACvE,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AACxD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,EAAE;AAErD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAmB,CAAC,CAAC;AAC/D,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAoD,IAAI;AAChG,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAE9C,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAwB,IAAI;AACpE,QAAM,mBAAe,uBAAsB,IAAI;AAC/C,QAAM,CAAC,SAAS,UAAU,QAAI,yBAA8B,IAAI;AAChE,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAA8B,IAAI;AAEhE,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,EAAE;AACjD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,yBAAS,EAAE;AAC/D,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAA6B,MAAS;AACpF,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAwB,IAAI;AAMpE,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAkE,CAAC,CAAC;AAChG,QAAM,kBAAc,uBAAiB,CAAC,CAAC;AACvC,QAAM,YAAY,CAAC,MAAoB,SAAuB;AAC5D,UAAM,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO;AACpC,cAAU,CAACC,aAAY,CAAC,GAAGA,SAAQ,MAAM,EAAE,GAAG,EAAE,IAAI,MAAM,KAAK,CAAC,CAAC;AACjE,UAAM,QAAQ,OAAO,WAAW,MAAM;AACpC,gBAAU,CAACA,aAAYA,SAAQ,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AAAA,IACjE,GAAG,SAAS,QAAQ,OAAO,IAAI;AAC/B,gBAAY,QAAQ,KAAK,KAAK;AAAA,EAChC;AAEA,QAAM,YAAY,CAAC,OAAe,UAAyB;AACzD,cAAU,OAAO,OAAO,YAAY,EAAE,OAAO,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC,CAAC;AAAA,EACjH;AAEA,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAwB,IAAI;AAC1E,gCAAU,MAAM;AACd,QAAI,YAAY,QAAQ,QAAQ,YAAY,MAAM;AAAE,yBAAmB,IAAI;AAAG,aAAO;AAAA,IAAU;AAC/F,UAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU;AACnE,QAAI,UAAU,QAAW;AAAE,yBAAmB,IAAI;AAAG,aAAO;AAAA,IAAU;AACtE,QAAIA,WAAU;AACd,SAAK,MAAM,KAAK,KAAK,EAAE,KAAK,CAAC,SAAS;AACpC,UAAI,CAACA,SAAS;AACd,yBAAmB,gBAAgB,IAAI,CAAC;AAAA,IAC1C,GAAG,MAAM;AAAE,UAAIA,SAAS,oBAAmB,IAAI;AAAA,IAAE,CAAC;AAClD,WAAO,MAAM;AAAE,MAAAA,WAAU;AAAA,IAAM;AAAA,EACjC,GAAG,CAAC,OAAO,CAAC;AACZ,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,gBAAY,uBAAyB,IAAI;AAE/C,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAgF,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;AAEzI,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAsB,oBAAI,IAAI,CAAC;AAE/D,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAsB,CAAC,CAAC;AACtD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAkD,CAAC,CAAC;AACtF,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAiB,WAAW;AAEpE,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAsC,KAAK;AACnF,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,QAAM,CAAC,QAAQ,QAAI,yBAA0B,MAAM;AAEnD,QAAM,CAAC,cAAc,eAAe,QAAI,yBAA+B,KAAK;AAE5E,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAwB,IAAI;AAE9D,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAoD,IAAI;AAC1F,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAmB,CAAC,CAAC;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAElD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwB,IAAI;AAE5D,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAqB,EAAE,OAAO,UAAU,CAAC;AAErE,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAEhD,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAqC,OAAO;AAEpE,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,EAAE;AAE3C,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,EAAE;AAE3C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAA+B,KAAK;AAElF,QAAM,CAAC,SAAS,cAAc,IAAI,gBAAgB;AAElD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAElD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AAKxD,QAAM,oBAAgB,uBAAsB,IAAI;AAChD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAmB,CAAC,CAAC;AAEnE,QAAM,iBAAa,uBAAO,OAAO;AACjC,gCAAU,MAAM;AAAE,eAAW,UAAU;AAAA,EAAQ,GAAG,CAAC,OAAO,CAAC;AAC3D,QAAM,eAAe,MAAY;AAC/B,QAAI,cAAc,YAAY,MAAM;AAClC,aAAO,cAAc,cAAc,OAAO;AAC1C,oBAAc,UAAU;AAAA,IAC1B;AACA,uBAAmB,CAAC,CAAC;AAAA,EACvB;AAEA,QAAM,gBAAgB,CAAC,UAA0B;AAC/C,QAAI,cAAc,YAAY,MAAM;AAClC,aAAO,cAAc,cAAc,OAAO;AAC1C,oBAAc,UAAU;AAAA,IAC1B;AACA,mBAAe;AACf,UAAM,UAAU,IAAI,IAAI,MAAM,OAAO,UAAQ,SAAS,EAAE,CAAC;AACzD,QAAI,QAAQ,SAAS,GAAG;AAAE,yBAAmB,CAAC,CAAC;AAAG;AAAA,IAAO;AACzD,uBAAmB,CAAC,GAAG,OAAO,CAAC;AAC/B,UAAM,YAAY,KAAK,IAAI;AAC3B,kBAAc,UAAU,OAAO,YAAY,MAAM;AAC/C,YAAM,WAAW,WAAW;AAC5B,UAAI,SAAS,UAAU,SAAS;AAC9B,mBAAW,QAAQ,CAAC,GAAG,OAAO,GAAG;AAC/B,cAAI,yBAAyB,SAAS,MAAM,IAAI,IAAI,EAAG,SAAQ,OAAO,IAAI;AAAA,QAC5E;AACA,2BAAmB,CAAC,GAAG,OAAO,CAAC;AAAA,MACjC;AACA,UAAI,QAAQ,SAAS,KAAK,KAAK,IAAI,IAAI,YAAY,0BAA2B,cAAa;AAAA,UACtF,gBAAe;AAAA,IACtB,GAAG,0BAA0B;AAAA,EAC/B;AAEA,QAAM,UAAU,MAAY;AAC1B,cAAU,CAAC,UAAU,QAAQ,CAAC;AAAA,EAChC;AAGA,QAAM,aAAa,MAAY;AAC7B,SAAK,SAAS,KAAK,EAAE,KAAK,CAAC,aAAa;AACtC,eAAS,CAACA,aAAYA,SAAQ,WAAW,UACrCA,WACA,EAAE,QAAQ,SAAS,SAAS,CAAC;AAAA,IACnC,GAAG,MAAM;AAAA,IAAe,CAAC;AACzB,SAAK,SAAS,aAAa,EAAE;AAAA,MAC3B,CAAC,WAAW;AACV,mBAAW,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ,CAAC;AAC7D,qBAAa,OAAO,SAAS;AAC7B,mBAAW,OAAO,OAAO;AAAA,MAC3B;AAAA,MACA,MAAM;AACJ,aAAK,SAAS,aAAa,EAAE,KAAK,CAAC,WAAW;AAAE,qBAAW,MAAM;AAAA,QAAE,GAAG,MAAM;AAAA,QAAe,CAAC;AAAA,MAC9F;AAAA,IACF;AACA,SAAK,SAAS,OAAO,EAAE;AAAA,MACrB,CAAC,WAAW;AAAE,kBAAU,OAAO,KAAK,EAAE,OAAO,MAAM,OAAO,IAAI,EAAE,OAAO,SAAS,OAAO,CAAC;AAAA,MAAE;AAAA,MAC1F,MAAM;AAAA,MAAe;AAAA,IACvB;AAAA,EACF;AAGA,gCAAU,MAAM;AACd,UAAM,QAAQ,OAAO,YAAY,YAAY,GAAM;AACnD,UAAM,QAAQ,MAAY;AAAE,UAAI,SAAS,oBAAoB,UAAW,YAAW;AAAA,IAAE;AACrF,UAAM,UAAU,MAAY;AAAE,iBAAW;AAAA,IAAE;AAC3C,aAAS,iBAAiB,oBAAoB,KAAK;AACnD,WAAO,iBAAiB,SAAS,OAAO;AACxC,WAAO,MAAM;AACX,aAAO,cAAc,KAAK;AAC1B,eAAS,oBAAoB,oBAAoB,KAAK;AACtD,aAAO,oBAAoB,SAAS,OAAO;AAAA,IAC7C;AAAA,EAEF,GAAG,CAAC,CAAC;AAGL,QAAM,qBAAqB,MAAY;AACrC,SAAK,SAAS,aAAa,EAAE;AAAA,MAC3B,CAAC,WAAW;AACV,mBAAW,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ,CAAC;AAC7D,qBAAa,OAAO,SAAS;AAC7B,mBAAW,OAAO,OAAO;AAAA,MAC3B;AAAA,MACA,MAAM;AAEJ,aAAK,SAAS,aAAa,EAAE,KAAK,CAAC,WAAW;AAAE,qBAAW,MAAM;AAAA,QAAE,GAAG,MAAM;AAAA,QAAe,CAAC;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI;AAEV,gCAAU,MAAM;AACd,QAAIA,WAAU;AACd,aAAS,EAAE,QAAQ,UAAU,CAAC;AAC9B,SAAK,SAAS,KAAK,EAAE;AAAA,MACnB,CAAC,aAAa;AACZ,YAAIA,SAAS,UAAS,EAAE,QAAQ,SAAS,SAAS,CAAC;AAAA,MACrD;AAAA,MACA,MAAM;AACJ,YAAIA,SAAS,UAAS,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,SAAK,SAAS,aAAa,EAAE;AAAA,MAC3B,CAAC,WAAW;AACV,YAAI,CAACA,SAAS;AACd,mBAAW,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ,CAAC;AAC7D,qBAAa,OAAO,SAAS;AAC7B,mBAAW,OAAO,OAAO;AAAA,MAC3B;AAAA,MACA,MAAM;AAEJ,aAAK,SAAS,aAAa,EAAE;AAAA,UAC3B,CAAC,WAAW;AAAE,gBAAIA,SAAS,YAAW,MAAM;AAAA,UAAE;AAAA,UAC9C,MAAM;AAAA,UAAsC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,cAAU,EAAE,OAAO,UAAU,CAAC;AAC9B,SAAK,SAAS,OAAO,EAAE;AAAA,MACrB,CAAC,WAAW;AAAE,YAAIA,SAAS,WAAU,OAAO,KAAK,EAAE,OAAO,MAAM,OAAO,IAAI,EAAE,OAAO,SAAS,OAAO,CAAC;AAAA,MAAE;AAAA,MACvG,MAAM;AAAE,YAAIA,SAAS,WAAU,EAAE,OAAO,cAAc,CAAC;AAAA,MAAE;AAAA,IAC3D;AACA,WAAO,MAAM;AAAE,MAAAA,WAAU;AAAA,IAAM;AAAA,EAGjC,GAAG,CAAC,MAAM,CAAC;AAGX,gCAAU,MAAM,MAAM;AACpB,QAAI,aAAa,YAAY,KAAM,QAAO,aAAa,aAAa,OAAO;AAC3E,QAAI,cAAc,YAAY,KAAM,QAAO,cAAc,cAAc,OAAO;AAC9E,eAAW,SAAS,YAAY,QAAS,QAAO,aAAa,KAAK;AAAA,EACpE,GAAG,CAAC,CAAC;AAGL,QAAM,CAAC,UAAU,WAAW,QAAI,yBAA+D,IAAI;AACnG,gCAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,SAAS,SAAS,cAAc,yBAAyB;AAC/D,UAAM,OAAO,QAAQ,QAAQ,WAAW;AACxC,QAAI,EAAE,gBAAgB,aAAc;AACpC,UAAM,OAAO,KAAK,sBAAsB;AACxC,UAAM,KAAK,OAAO;AAClB,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK,GAAG;AAChC,UAAM,WAAW;AACjB,gBAAY;AAAA,MACV,MAAM,KAAK,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,WAAW,EAAE;AAAA,MACzD;AAAA,MACA,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM,EAAE;AAAA,IAC7C,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,YAAY,OAAO,KAAa,WAAkD;AACtF,QAAI,SAAS,IAAI,GAAG,EAAG;AACvB,gBAAY,CAACA,aAAY,IAAI,IAAIA,QAAO,EAAE,IAAI,GAAG,CAAC;AAClD,oBAAgB,IAAI;AACpB,QAAI;AACF,YAAM,OAAO;AAEb,yBAAmB;AAAA,IACrB,SAAS,OAAO;AACd,gBAAU,OAAO,OAAO,gBAAgB,EAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC,CAAC;AAAA,IAC9G,UAAE;AACA,kBAAY,CAACA,aAAY;AACvB,cAAM,OAAO,IAAI,IAAIA,QAAO;AAC5B,aAAK,OAAO,GAAG;AACf,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,OAAkB,YAA2B;AAChE,QAAI,iBAAiB,aAAa;AAChC,WAAK,UAAU,SAAS,MAAM,IAAI,IAAI,MAAM,SAAS,gBAAgB,MAAM,MAAM,OAAO,CAAC;AACzF;AAAA,IACF;AACA,SAAK;AAAA,MACH,SAAS,MAAM,IAAI;AAAA,MACnB,MAAM,SAAS,sBAAsB,cAAc,MAAM,MAAM,OAAO;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,QAAoB,YAA2B;AACnE,QAAI,iBAAiB,aAAa;AAChC,WAAK,UAAU,UAAU,OAAO,EAAE,IAAI,MAAM,SAAS,iBAAiB,OAAO,IAAI,OAAO,CAAC;AACzF;AAAA,IACF;AACA,SAAK;AAAA,MACH,UAAU,OAAO,EAAE;AAAA,MACnB,MAAM,SAAS,uBAAuB,cAAc,OAAO,IAAI,OAAO;AAAA,IACxE;AAAA,EACF;AAGA,QAAM,iBAAiB,iBAAiB,cAAc,CAAC,IAAK,UAAU,YAAY,KAAK,CAAC;AAQxF,QAAM,iBAAiB,CAAC,UAAkB,SAA0B;AAClE,QAAI,QAAQ,OAAO,IAAI,MAAM,MAAO,QAAO;AAC3C,QAAI,aAAa,YAAa,QAAO;AACrC,YAAQ,UAAU,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM;AAAA,EAC/C;AAGA,QAAM,kBAAkB,CAAC,aAA6B;AACpD,QAAI,IAAI;AACR,eAAW,UAAU,QAAS,YAAW,SAAS,OAAO,OAAQ,KAAI,eAAe,UAAU,MAAM,IAAI,EAAG,MAAK;AAChH,eAAW,SAAS,MAAO,KAAI,eAAe,UAAU,MAAM,IAAI,EAAG,MAAK;AAC1E,WAAO;AAAA,EACT;AAQA,QAAM,iBAAiB,CAAC,SAA0B,eAAe,cAAc,IAAI;AAGnF,QAAM,kBAAkB,CAAC,WAAgC;AACvD,QAAI,iBAAiB,YAAa,QAAO,QAAQ,QAAQ,OAAO,EAAE,MAAM;AACxE,WAAO,OAAO,OAAO,MAAM,CAAC,UAAU,eAAe,MAAM,IAAI,CAAC;AAAA,EAClE;AAGA,QAAM,oBAAoB,CAAC,SACzB,iBAAiB,eAAe,QAAQ,OAAO,IAAI,MAAM,QAAQ,EAAE,sBAAsB,IAAI;AAG/F,QAAM,oBAAoB,MAAY;AACpC,QAAI,iBAAiB,YAAa;AAClC,SAAK,UAAU,SAAS,YAAY,IAAI,MAAM,SAAS,YAAY,YAAY,CAAC;AAAA,EAClF;AAEA,QAAM,iBAAiB,CAAC,aAA2B;AACjD,gBAAY,CAACA,aAAY;AACvB,YAAM,OAAO,IAAI,IAAIA,QAAO;AAC5B,UAAI,KAAK,IAAI,QAAQ,EAAG,MAAK,OAAO,QAAQ;AAAA,UACvC,MAAK,IAAI,QAAQ;AACtB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAIA,QAAM,oBAAoB,OAAO,WAAmB,aAAoC;AACtF,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,6BAA6B,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,QAAQ,CAAC,EAAE;AAC1H,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAI,KAAK,UAAU,OAAW,OAAM,IAAI,MAAM,OAAO,KAAK,KAAK,CAAC;AAChE,gBAAU,CAAC,MAAM,MAAM,OAAO,IAAI,EAAE,GAAG,GAAG,SAAS,OAAO,SAAU,KAAK,WAAW,GAAc,CAAC;AAAA,IACrG,SAAS,OAAO;AACd,gBAAU,CAAC,MAAM,MAAM,OAAO,IAAI,EAAE,GAAG,GAAG,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC;AAAA,IAC3H;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,UAA2B;AAC7C,cAAU,EAAE,OAAO,MAAM,YAAY,SAAS,KAAK,CAAC;AACpD,SAAK,kBAAkB,MAAM,MAAM,UAAU;AAAA,EAC/C;AAGA,QAAM,qBAAqB,CAAC,UAAwB;AAClD,kBAAc,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,kBAAkB,SAAS,CAAC,CAAC;AAAA,EAC1E;AAGA,QAAM,mBAAmB,MAAY;AACnC,kBAAc,CAACA,aAAY,CAACA,QAAO;AAAA,EACrC;AAIA,gCAAU,MAAM;AAAE,qBAAiB,EAAE,MAAM,YAAY,MAAM,WAAW,CAAC;AAAA,EAAE,GAAG,CAAC,YAAY,UAAU,CAAC;AAEtG,QAAM,mBAAmB,CAAC,aAA2B;AACnD,QAAI,WAAW,KAAM;AACrB,cAAU,EAAE,GAAG,QAAQ,MAAM,UAAU,SAAS,MAAM,OAAO,OAAU,CAAC;AACxE,SAAK,kBAAkB,OAAO,MAAM,MAAM,QAAQ;AAAA,EACpD;AAEA,QAAM,WAAW,OAAO,OAAkB,aAAoC;AAC5E,QAAI;AACF,UAAI,MAAM,WAAW,QAAS;AAC9B,YAAM,SAAS,MAAM,SAAS,QAAQ,KAAK,CAAC,cAAc,UAAU,OAAO,QAAQ;AACnF,UAAI,WAAW,OAAW,OAAM,IAAI,MAAM,kBAAkB;AAC5D,YAAM,SAAS,gBAAgB,UAAU,CAAC,GAAG,OAAO,OAAO,IAAI,CAACC,OAAMA,GAAE,IAAI,GAAG,MAAM,IAAI,CAAC;AAC1F,sBAAgB,IAAI;AACpB,gBAAU,MAAM,OAAO,YAAY,EAAE,MAAM,MAAM,KAAK,CAAC,CAAC;AACxD,cAAQ;AAAA,IACV,SAAS,OAAO;AACd,gBAAU,kCAAS,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,UAA+B;AAClD,QAAI,UAAU,QAAQ,MAAM,WAAW,EAAG;AAC1C,UAAM,YAA6B,CAAC;AACpC,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,KAAK;AACtB,UAAI,aAAa,GAAI;AACrB,YAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,UAAI,MAAM,SAAS,EAAG;AACtB,gBAAU,KAAK,EAAE,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,KAAK,CAAC;AAAA,IACzD;AACA,QAAI,UAAU,WAAW,EAAG;AAC5B,UAAM,eAAe,UAAU,WAAW,KAAK,UAAU,CAAC,EAAE,KAAK,YAAY,EAAE,SAAS,MAAM,IAAI,UAAU,CAAC,IAAI;AACjH,QAAI,iBAAiB,QAAW;AAC9B,YAAM,SAAS,IAAI,WAAW;AAC9B,aAAO,SAAS,MAAM;AACpB,cAAM,OAAO,OAAO,OAAO,UAAU,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AAC1D,mBAAW,EAAE,SAAS,MAAM,MAAM,aAAa,MAAM,MAAM,YAAY,aAAa,KAAK,CAAC;AAC1F,wBAAgB,IAAI;AACpB,mBAAW,IAAI;AAAA,MACjB;AACA,aAAO,cAAc,aAAa,IAAI;AACtC;AAAA,IACF;AACA,UAAM,WAAW,UAAU,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK;AACrD,mBAAe,QAAQ;AACvB,oBAAgB,IAAI;AACpB,eAAW,EAAE,OAAO,WAAW,YAAY,SAAS,CAAC;AACrD,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,SAAS,OAAO,UAAoD;AACxE,UAAM,eAAe;AACrB,kBAAc,KAAK;AACnB,UAAM,YAA6B,CAAC;AACpC,UAAM,QAAQ,MAAM,aAAa;AACjC,QAAI,UAAU,OAAW;AACzB,UAAM,UAAgC,CAAC;AACvC,eAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AACpC,YAAM,QAAQ,KAAK,mBAAmB;AACtC,UAAI,UAAU,UAAa,UAAU,KAAM,SAAQ,KAAK,aAAa,OAAO,IAAI,SAAS,CAAC;AAAA,IAC5F;AACA,UAAM,QAAQ,IAAI,OAAO;AACzB,QAAI,UAAU,WAAW,EAAG;AAC5B,UAAM,eAAe,UAAU,WAAW,KAAK,UAAU,CAAC,EAAE,KAAK,YAAY,EAAE,SAAS,MAAM,IAAI,UAAU,CAAC,IAAI;AACjH,QAAI,iBAAiB,QAAW;AAC9B,iBAAW,EAAE,SAAS,MAAM,MAAM,aAAa,MAAM,MAAM,MAAM,aAAa,aAAa,IAAI,GAAG,YAAY,aAAa,KAAK,CAAC;AACjI,sBAAgB,IAAI;AACpB,iBAAW,IAAI;AACf;AAAA,IACF;AACA,UAAM,WAAW,UAAU,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK;AACrD,mBAAe,QAAQ;AACvB,oBAAgB,IAAI;AACpB,eAAW,EAAE,OAAO,WAAW,YAAY,SAAS,CAAC;AACrD,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,iBAAiB,OAAO,UAAqD;AACjF,UAAM,eAAe;AACrB,QAAI,YAAY,QAAQ,WAAY;AACpC,QAAI,QAAQ,YAAY,QAAQ,YAAY,KAAK,MAAM,GAAI;AAC3D,kBAAc,IAAI;AAClB,oBAAgB,IAAI;AACpB,QAAI;AACF,UAAI,YAA+B,CAAC;AACpC,UAAI,QAAQ,YAAY,MAAM;AAC5B,oBAAY,MAAM,SAAS,aAAa;AAAA,UACtC,SAAS,QAAQ;AAAA,UACjB,aAAa,mBAAmB,KAAK;AAAA,UACrC,GAAG,oBAAoB,SAAY,CAAC,IAAI,EAAE,UAAU,gBAAgB;AAAA,QACtE,CAAC;AAAA,MACH,OAAO;AACL,cAAM,QAAQ,MAAM,QAAQ,IAAI,QAAQ,MAAM,IAAI,OAAO,EAAE,MAAM,KAAK,OAAO;AAAA,UAC3E;AAAA,UACA,MAAM,MAAM,aAAa,IAAI;AAAA,QAC/B,EAAE,CAAC;AACH,oBAAY,MAAM,SAAS,aAAa;AAAA,UACtC,WAAW,YAAY,KAAK;AAAA,UAC5B,aAAa,mBAAmB,KAAK;AAAA,UACrC,GAAG,oBAAoB,SAAY,CAAC,IAAI,EAAE,UAAU,gBAAgB;AAAA,UACpE;AAAA,QACF,CAAC;AAAA,MACH;AAEA,gBAAU,MAAM,OAAO,eAAe,EAAE,MAAM,UAAU,QAAQ,YAAY,KAAK,EAAE,CAAC,CAAC;AACrF,iBAAW,IAAI;AACf,qBAAe,EAAE;AACjB,4BAAsB,EAAE;AACxB,yBAAmB,MAAS;AAC5B,iBAAW,KAAK;AAChB,cAAQ;AAAA,IACV,SAAS,OAAO;AACd,sBAAgB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACxE,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,kBAAkB,OAAO,UAAqD;AAClF,UAAM,eAAe;AACrB,QAAI,kBAAkB,cAAc,KAAK,MAAM,GAAI;AACnD,sBAAkB,IAAI;AACtB,QAAI;AACF,YAAM,UAAU,cAAc,KAAK;AACnC,YAAM,SAAS,aAAa,SAAS,aAAa;AAClD,uBAAiB,EAAE;AACnB,uBAAiB,CAAC,CAAC;AACnB,uBAAiB,KAAK;AACtB,gBAAU,MAAM,OAAO,iBAAiB,EAAE,MAAM,QAAQ,CAAC,CAAC;AAC1D,cAAQ;AAAA,IACV,SAAS,OAAO;AACd,gBAAU,kCAAS,KAAK;AAAA,IAC1B,UAAE;AACA,wBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,WAA6B;AAClD,iBAAa,EAAE,UAAU,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC;AACvD,gBAAY,CAAC,GAAI,OAAO,cAAc,CAAC,CAAE,CAAC;AAAA,EAC5C;AAGA,QAAM,mBAAmB,YAA2B;AAClD,QAAI,cAAc,QAAQ,WAAY;AACtC,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,SAAS,oBAAoB,UAAU,UAAU,QAAQ;AAC/D,UAAI,cAAc,QAAQ,CAAC,SAAS,SAAS,SAAS,KAAK,cAAc,cAAe,cAAa,IAAI;AACzG,gBAAU,MAAM,OAAO,kBAAkB,EAAE,MAAM,UAAU,KAAK,CAAC,CAAC;AAClE,mBAAa,IAAI;AACjB,cAAQ;AAAA,IACV,SAAS,OAAO;AACd,gBAAU,4BAAQ,KAAK;AAAA,IACzB,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,UAAqD;AAE/E,UAAM,eAAe;AACrB,QAAI,YAAY,iBAAiB,QAAQ,aAAa,KAAK,KAAK,MAAM,GAAI;AAC1E,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,SAAS,aAAa,aAAa,UAAU,aAAa,KAAK,KAAK,CAAC;AAE3E,YAAM,YAAY,aAAa;AAC/B,UAAI,aAAa,YAAY,KAAM,QAAO,aAAa,aAAa,OAAO;AAC3E,sBAAgB,SAAS;AACzB,mBAAa,UAAU,OAAO,WAAW,MAAM;AAAE,wBAAgB,IAAI;AAAA,MAAE,GAAG,IAAI;AAC9E,sBAAgB,IAAI;AACpB,cAAQ;AAAA,IACV,SAAS,OAAO;AACd,gBAAU,wCAAU,KAAK;AAAA,IAC3B,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,gBAAgB,YAA2B;AAC/C,QAAI,YAAY,QAAQ,WAAY;AACpC,kBAAc,IAAI;AAClB,UAAM,QAAQ,QAAQ,SAAS,WAAW,QAAQ,OAAO,OAAO,QAAQ;AACxE,QAAI;AACF,UAAI,QAAQ,SAAS,SAAU,OAAM,SAAS,aAAa,QAAQ,OAAO,EAAE;AAAA,UACvE,OAAM,SAAS,YAAY,QAAQ,IAAI;AAC5C,iBAAW,IAAI;AACf,gBAAU,MAAM,QAAQ,SAAS,WAC7B,OAAO,iBAAiB,EAAE,MAAM,MAAM,CAAC,IACvC,OAAO,aAAa,EAAE,MAAM,MAAM,CAAC,CAAC;AACxC,cAAQ;AAAA,IACV,SAAS,OAAO;AAEd,gBAAU,QAAQ,SAAS,WAAW,mCAAU,4BAAQ,KAAK;AAAA,IAC/D,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,UAAkB,SAAgC;AAChF,QAAI;AACF,UAAI,MAAM,WAAW,QAAS;AAC9B,YAAM,SAAS,MAAM,SAAS,QAAQ,KAAK,CAAC,cAAc,UAAU,OAAO,QAAQ;AACnF,UAAI,WAAW,OAAW;AAC1B,YAAM,SAAS,gBAAgB,UAAU,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE,OAAO,CAAC,cAAc,cAAc,IAAI,CAAC;AAC3H,gBAAU,MAAM,OAAO,aAAa,EAAE,KAAK,CAAC,CAAC;AAC7C,cAAQ;AAAA,IACV,SAAS,OAAO;AACd,gBAAU,kCAAS,KAAK;AAAA,IAC1B;AAAA,EACF;AAGA,QAAM,cAAc,OAAO,WAAsC;AAC/D,QAAI;AAEF,YAAM,OAAO,MAAM,WAAW,UACzB,MAAM,SAAS,QAAQ,KAAK,CAAC,cAAc,UAAU,OAAO,OAAO,EAAE,KAAK,SAC3E;AACJ,YAAM,SAAS,gBAAgB,OAAO,IAAI,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAChF,gBAAU,MAAM,OAAO,QAAQ,CAAC;AAChC,cAAQ;AAAA,IACV,SAAS,OAAO;AACd,gBAAU,wCAAU,KAAK;AAAA,IAC3B;AAAA,EACF;AAGA,QAAM,iBAAiB,CAAC,aAA2B;AACjD,eAAW,IAAI;AACf,oBAAgB,IAAI;AACpB,uBAAmB,QAAQ;AAC3B,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,UAAU,MAAM,WAAW,UAAU,MAAM,SAAS,UAAU,CAAC;AACrE,QAAM,QAAQ,MAAM,WAAW,UAAU,MAAM,SAAS,QAAQ,CAAC;AAEjE,QAAM,aAAa,iBAAiB,cAChC,EAAE,UAAU,IACX,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,YAAY,GAAG,QAAQ;AAGnE,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAM,SAAS,CAAC,UAA8B;AAC5C,QAAI,MAAM,GAAI,QAAO;AACrB,QAAI,MAAM,KAAK,YAAY,EAAE,SAAS,CAAC,EAAG,QAAO;AACjD,YAAQ,MAAM,eAAe,IAAI,YAAY,EAAE,SAAS,CAAC;AAAA,EAC3D;AACA,QAAM,cAAc,CAAC,UAA8B;AAGjD,QAAI,iBAAiB,MAAO,QAAO;AAEnC,UAAM,KAAK,iBAAiB,cACxB,QAAQ,OAAO,MAAM,IAAI,MAAM,QAC/B,eAAe,cAAc,MAAM,IAAI;AAC3C,WAAO,iBAAiB,OAAO,KAAK,CAAC;AAAA,EACvC;AACA,QAAM,eAAe,CAAC,SAAmC,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAChF,UAAM,QAAQ,EAAE,KAAK,cAAc,EAAE,IAAI;AACzC,WAAO,UAAU,QAAQ,CAAC;AAAA,EAC5B,CAAC;AACD,QAAM,iBAAiB,CAAC,SACtB,aAAa,KAAK,OAAO,CAAC,UACxB,OAAO,KAAK,KACT,YAAY,KAAK,CAAC,CAAC;AAO1B,QAAM,YAAY,MAAM,MAAM,iBAAiB;AAK/C,QAAM,kBAAkB,MAAM;AAC5B,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,UAAU,SAAS;AAC5B,YAAM,OAAO,OAAO,cAAc,CAAC;AACnC,UAAI,KAAK,WAAW,GAAG;AACrB,eAAO,IAAI,gBAAgB,OAAO,IAAI,aAAa,KAAK,KAAK,CAAC;AAC9D;AAAA,MACF;AACA,iBAAW,OAAO,KAAM,QAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IACpE;AACA,WAAO;AAAA,EACT,GAAG;AACH,QAAM,eAAe,eAAe,cAAc;AAElD,QAAM,gBAAgB,aAAa,KAAK,CAAC,QAAQ,QAAQ,aAAa;AAEtE,QAAM,YAAY,cAAc,QAAQ,eAAe,IAAI,SAAS,IAAI,YAAY;AACpF,QAAM,WAAW,CAAC,WAAgC;AAChD,QAAI,cAAc,KAAM,QAAO;AAC/B,UAAM,OAAO,OAAO,cAAc,CAAC;AACnC,WAAO,cAAc,gBAAgB,KAAK,WAAW,IAAI,KAAK,SAAS,SAAS;AAAA,EAClF;AACA,QAAM,oBAAoB,iBAAiB,UAAU,CAAC,IAAI,SACvD,OAAO,CAAC,WAAW,SAAS,MAAM,CAAC,EACnC,IAAI,CAAC,YAAY,EAAE,GAAG,QAAQ,QAAQ,eAAe,OAAO,MAAM,EAAE,EAAE,EACtE,OAAO,CAAC,WAAW,OAAO,OAAO,SAAS,KAAM,OAAO,eAAe,KAAK,CAAC,SAAU;AACzF,QAAM,kBAAkB,iBAAiB,aAAa,cAAc,OAAO,CAAC,IAAI,eAAe,KAAK;AACpG,QAAM,cAAc,QAAQ,OAAO,CAAC,GAAG,WAAW,IAAI,OAAO,YAAY,CAAC,IAAI,MAAM;AACpF,QAAM,cAAc,QAAQ;AAE5B,QAAM,aAAa,OAAO,UAAU,OAChC,EAAE,MAAM,MAAM,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,aAAa,EAAE,IAC/D,OAAO,UAAU,UACf,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,OAAO,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,EAAE,KAAK,IAAI,EAAE,IACjJ,OAAO,UAAU,gBACf,EAAE,MAAM,WAAW,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,aAAa,EAAE,IACpE,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,GAAG,OAAO,GAAG;AAC5D,QAAM,gBAAgB,MAAM;AAC1B,QAAI,IAAI;AACR,eAAW,UAAU,QAAS,YAAW,SAAS,OAAO,OAAQ,KAAI,QAAQ,OAAO,MAAM,IAAI,MAAM,MAAO,MAAK;AAChH,eAAW,SAAS,MAAO,KAAI,QAAQ,OAAO,MAAM,IAAI,MAAM,MAAO,MAAK;AAC1E,WAAO;AAAA,EACT,GAAG;AAEH,QAAM,iBAAiB,MAAM;AAC3B,QAAI,IAAI;AACR,eAAW,UAAU,QAAS,YAAW,SAAS,OAAO,OAAQ,KAAI,QAAQ,OAAO,MAAM,IAAI,MAAM,MAAO,MAAK;AAChH,eAAW,SAAS,MAAO,KAAI,QAAQ,OAAO,MAAM,IAAI,MAAM,MAAO,MAAK;AAC1E,WAAO;AAAA,EACT,GAAG;AACH,QAAM,YAAY,iBAAiB,WAAW,KAAK,gBAAgB,WAAW;AAE9E,QAAM,cAAc,YAAY,KAAK;AACrC,QAAM,cAAc,gBAAgB,MAAM,CAAC,mBAAmB,KAAK,WAAW;AAE9E,QAAM,eAAe,YAAY,OAC7B,EAAE,sBAAsB,EAAE,MAAM,GAAG,CAAC,IACpC,QAAQ,SAAS,WACf,EAAE,uBAAuB,EAAE,MAAM,QAAQ,OAAO,KAAK,CAAC,IACtD,EAAE,sBAAsB,EAAE,MAAM,QAAQ,KAAK,CAAC,KAEzC,QAAQ,SAAS,WAAW,QAAQ,QAAQ,UAAa,QAAQ,QAAQ,QAAQ,OAChF,EAAE,sBAAsB,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI;AAE5D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAK;AAAA,MACL;AAAA,MACA,SAAS,MAAM;AAEb,YAAI,cAAc,WAAY;AAC9B,YAAI,iBAAiB,WAAW,YAAY,QAAQ,WAAW,QAAQ,iBAAiB,QAAQ,cAAc,KAAM;AACpH,gBAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,MACjC,WAAW,EAAE,YAAY;AAAA,MAGzB;AAAA,sDAAC,aAAU,GAAM,MAAY,QAAQ,SAAS;AAAA,QAC9C,+CAAC,WAAQ,WAAW,IAAI,WACxB;AAAA,wDAAC,UAAK,yBAAqB,MAAC,eAAY,QAAO,OAAO,EAAE,SAAS,OAAO,GAAG;AAAA,UAC3E,+CAAC,SAAI,WAAW,IAAI,KAAK,aAAW,MAAM,WAAW,WAElD;AAAA,qBAAS,WACR;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,aAAa,MAAM;AAAE,mCAAiB,IAAI;AAAA,gBAAE;AAAA,gBAC5C,OAAO,MAAM;AAAE,6BAAW,IAAI;AAAG,kCAAgB,IAAI;AAAG,6BAAW,IAAI;AAAA,gBAAE;AAAA,gBACzE,WAAW;AAAA,gBACX;AAAA,gBACA;AAAA;AAAA,YACF;AAAA,YAGD,SAAS,SACR;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,WAAW,MAAM;AAAE,iCAAe;AAAA,gBAAE;AAAA,gBACpC,UAAU,MAAM;AAAE,mCAAiB,IAAI;AAAA,gBAAE;AAAA,gBACzC,aAAa,MAAM;AAAE,gCAAc,IAAI;AAAA,gBAAE;AAAA;AAAA,YAC3C;AAAA,YAIF,8CAAC,SAAI,WAAW,IAAI,SACnB,mBAAS,WACR,8CAAC,cAAW,IACV,SAAS,QACX;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,WAAW,MAAM;AAAE,iCAAe;AAAA,gBAAE;AAAA,gBACpC,cAAc;AAAA,gBACd,cAAc,CAAC,UAAU;AAAE,gCAAc,KAAK;AAAA,gBAAE;AAAA,gBAChD,YAAY;AAAA,gBACZ,eAAe,MAAM;AAAE,mCAAiB,KAAK;AAAA,gBAAE;AAAA;AAAA,YACjD,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF,GAEF;AAAA,aACF;AAAA,WACA;AAAA,QAEC,OAAO,SAAS,KACf,8CAAC,SAAI,WAAW,IAAI,YAAY,MAAK,UAAS,aAAU,UACrD,iBAAO,IAAI,CAAC,SACX,+CAAC,UAAmB,WAAW,GAAG,IAAI,KAAK,IAAI,KAAK,SAAS,QAAQ,IAAI,WAAW,IAAI,OAAO,IAAI,aAAW,KAAK,MACjH;AAAA,wDAAC,OAAE,WAAW,IAAI,UAAU,eAAY,QAAO;AAAA,UAC9C,KAAK;AAAA,aAFG,KAAK,EAGhB,CACD,GACH;AAAA,QAGD,aAAa,aAAa,QACzB,8CAAC,cAAW,GAAM,SAAS,MAAM;AAAE,uBAAa,KAAK;AAAA,QAAE,GAAG,MAAM,SAAS,MAAM,KAAK,SAAS,KAAK,QAAQ,SAAS,QAAQ;AAAA,QAG7H;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAM;AAAA,YACN,SAAS,MAAM;AAAE,4BAAc,KAAK;AAAA,YAAE;AAAA,YACtC,SAAS,CAAC,UAAU;AAAE,4BAAc,KAAK;AAAA,YAAE;AAAA;AAAA,QAC7C;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,SAAS,MAAM;AAAE,kBAAI,CAAC,gBAAgB;AAAE,iCAAiB,KAAK;AAAG,iCAAiB,CAAC,CAAC;AAAA,cAAE;AAAA,YAAE;AAAA,YACxF,YAAY,EAAE,OAAO;AAAA,YACrB,OAAO,EAAE,WAAW;AAAA,YAEpB,yDAAC,UAAK,WAAW,IAAI,WAAW,UAAU,CAAC,UAAU;AAAE,mBAAK,gBAAgB,KAAK;AAAA,YAAE,GACjF;AAAA;AAAA,gBAAC;AAAA;AAAA,kBAAM,WAAW,IAAI;AAAA,kBAAa,OAAO;AAAA,kBAAe,aAAa,EAAE,sBAAsB;AAAA,kBAC5F,cAAY,EAAE,sBAAsB;AAAA,kBAAG,WAAS;AAAA,kBAAC,UAAU;AAAA,kBAC3D,UAAU,CAAC,UAAU;AAAE,qCAAiB,MAAM,cAAc,KAAK;AAAA,kBAAE;AAAA;AAAA,cAAG;AAAA,cACxE,8CAAC,kBAAe,OAAO,eAAe,UAAU,kBAAkB,OAAO,EAAE,WAAW,GAAG;AAAA,cACzF,+CAAC,SAAI,WAAW,IAAI,YAClB;AAAA,8DAAC,4CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,kBAAkB,cAAc,KAAK,MAAM,IAAK,YAAE,QAAQ,GAAE;AAAA,gBAC9G,8CAAC,4CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,gBAAgB,SAAS,MAAM;AAAE,mCAAiB,KAAK;AAAG,mCAAiB,CAAC,CAAC;AAAA,gBAAE,GAAI,YAAE,QAAQ,GAAE;AAAA,iBACnJ;AAAA,eACF;AAAA;AAAA,QACF;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,cAAc;AAAA,YACpB,SAAS,MAAM;AAAE,kBAAI,CAAC,WAAY,cAAa,IAAI;AAAA,YAAE;AAAA,YACrD,YAAY,EAAE,OAAO;AAAA,YACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,QAAQ,GAAG,CAAC;AAAA,YAE9D,yDAAC,SAAI,WAAW,IAAI,WAClB;AAAA,4DAAC,kBAAe,OAAO,UAAU,UAAU,aAAa,OAAO,EAAE,eAAe,GAAG;AAAA,cACnF,+CAAC,SAAI,WAAW,IAAI,YAClB;AAAA,8DAAC,4CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,YAAY,SAAS,MAAM;AAAE,uBAAK,iBAAiB;AAAA,gBAAE,GAAI,YAAE,eAAe,GAAE;AAAA,gBAC9H,8CAAC,4CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,YAAY,SAAS,MAAM;AAAE,+BAAa,IAAI;AAAA,gBAAE,GAAI,YAAE,QAAQ,GAAE;AAAA,iBACpH;AAAA,eACF;AAAA;AAAA,QACF;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,SAAS,MAAM;AACb,kBAAI,WAAY;AAChB,yBAAW,KAAK;AAChB,yBAAW,IAAI;AACf,4BAAc,KAAK;AAAA,YACrB;AAAA,YACA,YAAY,EAAE,OAAO;AAAA,YACrB,OAAO,EAAE,gBAAgB;AAAA,YAExB,sBAAY,OACX;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,GAAG,IAAI,OAAO,IAAI,aAAa,IAAI,gBAAgB,EAAE;AAAA,gBAChE,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,cAAY,EAAE,gBAAgB;AAAA,gBAC9B,SAAS,MAAM;AAAE,4BAAU,SAAS,MAAM;AAAA,gBAAE;AAAA,gBAC5C,YAAY,CAAC,UAAU;AAAE,wBAAM,eAAe;AAAG,gCAAc,IAAI;AAAA,gBAAE;AAAA,gBACrE,aAAa,MAAM;AAAE,gCAAc,KAAK;AAAA,gBAAE;AAAA,gBAC1C,QAAQ,CAAC,UAAU;AAAE,uBAAK,OAAO,KAAK;AAAA,gBAAE;AAAA,gBACxC,WAAW,CAAC,UAAU;AACpB,sBAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,0BAAM,eAAe;AACrB,8BAAU,SAAS,MAAM;AAAA,kBAC3B;AAAA,gBACF;AAAA,gBAEA;AAAA,iEAAC,UAAK,WAAW,IAAI,aACnB;AAAA,kEAAC,UAAK,WAAW,IAAI,aAAa,wDAAC,eAAY,MAAM,IAAI,GAAE;AAAA,oBAC3D,8CAAC,UAAK,WAAW,IAAI,cAAe,YAAE,aAAa,GAAE;AAAA,qBACvD;AAAA,kBACA,8CAAC,UAAK,WAAW,IAAI,YAAa,YAAE,WAAW,GAAE;AAAA,kBACjD,+CAAC,UAAK,WAAW,IAAI,SACnB;AAAA,kEAAC,eAAY,MAAM,IAAI;AAAA,oBACvB,8CAAC,UAAK,WAAW,IAAI,aAAc,YAAE,UAAU,GAAE;AAAA,oBACjD,8CAAC,UAAK,WAAW,IAAI,aAAc,YAAE,YAAY,GAAE;AAAA,qBACrD;AAAA,kBACA,8CAAC,YAAO,MAAK,UAAS,WAAW,IAAI,QAAQ,SAAS,CAAC,UAAU;AAAE,0BAAM,gBAAgB;AAAG,8BAAU,SAAS,MAAM;AAAA,kBAAE,GACpH,YAAE,cAAc,GACnB;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK;AAAA,sBACL,MAAK;AAAA,sBACL,WAAW,IAAI;AAAA,sBACf,UAAQ;AAAA,sBACP,GAAG,EAAE,iBAAiB,GAAG;AAAA,sBAC1B,UAAU,CAAC,UAAU;AACnB,oCAAY,MAAM,cAAc,UAAU,OAAO,OAAO,MAAM,KAAK,MAAM,cAAc,KAAK,CAAC;AAAA,sBAC/F;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF,IAEA,+CAAC,UAAK,WAAW,IAAI,aAAa,UAAU,CAAC,UAAU;AAAE,mBAAK,eAAe,KAAK;AAAA,YAAE,GAClF;AAAA,6DAAC,SAAI,WAAW,IAAI,YAClB;AAAA;AAAA,kBAAC;AAAA;AAAA,oBAAM,WAAW,IAAI;AAAA,oBAAa,OAAO;AAAA,oBACxC,aAAa,QAAQ,YAAY,OAAO,EAAE,wBAAwB,IAAI,EAAE,wBAAwB;AAAA,oBAChG,cAAY,EAAE,aAAa;AAAA,oBAC3B,UAAU,cAAc,QAAQ,YAAY;AAAA,oBAC5C,UAAU,CAAC,UAAU;AAAE,qCAAe,MAAM,cAAc,KAAK;AAAA,oBAAE;AAAA;AAAA,gBAAG;AAAA,gBACtE;AAAA,kBAAC;AAAA;AAAA,oBAAM,WAAW,IAAI;AAAA,oBAAa,OAAO;AAAA,oBAAoB,aAAa,EAAE,oBAAoB;AAAA,oBAC/F,cAAY,EAAE,oBAAoB;AAAA,oBAAG,UAAU;AAAA,oBAC/C,UAAU,CAAC,UAAU;AAAE,4CAAsB,MAAM,cAAc,KAAK;AAAA,oBAAE;AAAA;AAAA,gBAAG;AAAA,gBAC7E,+CAAC,WAAM,WAAW,IAAI,cACpB;AAAA,gEAAC,UAAK,WAAW,IAAI,gBAAiB,YAAE,eAAe,GAAE;AAAA,kBACzD;AAAA,oBAAC;AAAA;AAAA,sBAAO,OAAO,mBAAmB;AAAA,sBAAI,UAAU;AAAA,sBAC9C,UAAU,CAAC,UAAU;AAAE,2CAAmB,MAAM,cAAc,UAAU,KAAK,SAAY,MAAM,cAAc,KAAK;AAAA,sBAAE;AAAA,sBACpH;AAAA,sEAAC,YAAO,OAAM,IAAI,YAAE,cAAc,GAAE;AAAA,wBACnC,QAAQ,IAAI,CAAC,WAAW,8CAAC,YAAuB,OAAO,OAAO,IAAK,iBAAO,QAArC,OAAO,EAAmC,CAAS;AAAA;AAAA;AAAA,kBAC3F;AAAA,mBACF;AAAA,gBACA,8CAAC,UAAK,WAAW,IAAI,aAClB,kBAAQ,YAAY,OACjB,EAAE,cAAc,EAAE,GAAG,GAAG,QAAQ,QAAQ,WAAW,CAAC,IACpD,EAAE,cAAc,EAAE,GAAG,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,WAAW,CAAC,GAC7E;AAAA,iBACF;AAAA,cACC,QAAQ,YAAY,QAAQ,eAAe,8CAAC,OAAE,WAAW,IAAI,OAAO,MAAK,SAAS,YAAE,oBAAoB,GAAE;AAAA,cAC1G,QAAQ,YAAY,QAAQ,CAAC,eAAe,gBAAgB,MAAM,oBAAoB,QAAQ,oBAAoB,eACjH,8CAAC,OAAE,WAAW,IAAI,aAAc,YAAE,sBAAsB,EAAE,MAAM,iBAAiB,MAAM,YAAY,CAAC,GAAE;AAAA,cAExG,+CAAC,SAAI,WAAW,IAAI,gBAClB;AAAA,8DAAC,4CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,cAAe,QAAQ,YAAY,SAAS,gBAAgB,MAAM,cAAgB,YAAE,gBAAgB,GAAE;AAAA,gBACxJ,8CAAC,4CAAO,SAAQ,WAAU,MAAK,UAAS,UAAU,YAAY,SAAS,MAAM;AAAE,6BAAW,IAAI;AAAG,6BAAW,KAAK;AAAA,gBAAE,GAAI,YAAE,eAAe,GAAE;AAAA,iBAC5I;AAAA,cACC,iBAAiB,QAAQ,8CAAC,OAAE,WAAW,IAAI,OAAO,MAAK,SAAS,wBAAa;AAAA,eAChF;AAAA;AAAA,QAEJ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,YAAY;AAAA,YAClB,SAAS,MAAM;AACb,kBAAI,CAAC,WAAY,YAAW,IAAI;AAAA,YAClC;AAAA,YACA,YAAY,EAAE,OAAO;AAAA,YACrB,OAAO;AAAA,YACP,QACE,gFACE;AAAA,4DAAC,4CAAO,SAAQ,WAAU,UAAU,YAAY,SAAS,MAAM;AAAE,2BAAW,IAAI;AAAA,cAAE,GAAI,YAAE,QAAQ,GAAE;AAAA,cAClG,8CAAC,4CAAO,SAAQ,WAAU,UAAU,YAAY,SAAS,MAAM;AAAE,qBAAK,cAAc;AAAA,cAAE,GAAI,YAAE,QAAQ,GAAE;AAAA,eACxG;AAAA;AAAA,QAEJ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa;AAAA,YACb,cAAc;AAAA,YACd,cAAc;AAAA,YACd,SAAS,MAAM;AAAE,wBAAU,IAAI;AAAA,YAAE;AAAA;AAAA,QACnC;AAAA,QACC,iBAAiB,QAChB;AAAA,UAAC;AAAA;AAAA,YACC,MAAI;AAAA,YACJ,SAAS,MAAM;AAAE,8BAAgB,IAAI;AAAA,YAAE;AAAA,YACvC,YAAY,EAAE,OAAO;AAAA,YACrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,KAAK,CAAC;AAAA,YACnD,WAAW,IAAI;AAAA,YACf,kBAAkB,IAAI;AAAA,YAErB,kBAAQ,WAAW,IAClB,8CAAC,OAAE,WAAW,IAAI,YAAa,YAAE,aAAa,GAAE,IAEhD,8CAAC,QAAG,WAAW,IAAI,YAChB,kBAAQ,IAAI,CAAC,QAAQ,UACpB,8CAAC,QAAmB,OAAO,EAAE,WAAW,OAAO,GAC7C;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW,IAAI;AAAA,gBACf,OAAO,EAAE,WAAW,MAAM;AAAA,gBAC1B,SAAS,MAAM;AAAE,uBAAK,SAAS,cAAc,OAAO,EAAE;AAAA,gBAAE;AAAA,gBAExD;AAAA,gEAAC,UAAK,WAAW,IAAI,gBAAgB,eAAY,QAAO,wDAAC,kEAA6B,MAAM,IAAI,GAAE;AAAA,kBAClG,+CAAC,UAAK,WAAW,IAAI,gBACnB;AAAA,kEAAC,UAAK,WAAW,IAAI,gBAAiB,iBAAO,MAAK;AAAA,oBAClD,8CAAC,UAAK,WAAW,IAAI,gBAAiB,YAAE,eAAe,EAAE,GAAG,OAAO,WAAW,CAAC,GAAE;AAAA,qBACnF;AAAA,kBACA,8CAAC,UAAK,WAAW,IAAI,UAAU,eAAY,QAAO,wDAAC,mEAA8B,MAAM,IAAI,GAAE;AAAA;AAAA;AAAA,YAC/F,KAbO,OAAO,EAchB,CACD,GACH;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AwCtmCA,IAAAC,iBAA0D;AAkBnD,IAAM,gBAAN,cAA4B,yBAAkD;AAAA,EAA9E;AAAA;AACL,wBAAS,SAA4B,EAAE,OAAO,KAAK;AAAA;AAAA,EAEnD,OAAO,yBAAyB,OAAkC;AAChE,WAAO,EAAE,MAAM;AAAA,EACjB;AAAA,EAES,kBAAkB,OAAc,MAAuB;AAE9D,YAAQ,MAAM,2BAA2B,KAAK,MAAM,KAAK,mCAAU,OAAO,KAAK,kBAAkB,EAAE;AACnG,QAAI;AACF,WAAK,MAAM,UAAU,KAAK;AAAA,IAC5B,SAAS,eAAe;AACtB,cAAQ,MAAM,kFAAqC,aAAa;AAAA,IAClE;AAAA,EACF;AAAA,EAES,SAAoB;AAC3B,QAAI,KAAK,MAAM,UAAU,KAAM,QAAO,KAAK,MAAM,YAAY;AAC7D,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;ACvCA,IAAAC,iBAAqE;AACrE,IAAAC,oBAA6B;AA2NzB,IAAAC,uBAAA;AAvNJ,IAAM,UAAU;AAEhB,IAAM,kBAAkB;AAExB,IAAM,iBAAiB;AAUvB,IAAM,cAAc;AAAA,EAClB,CAAC,QAAQ;AACX;AAGA,IAAM,aAAa,YAAY,KAAK;AAMpC,SAAS,SAAS,MAA8B;AAC9C,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,QAAQ,UAAU;AACvB,SAAO;AACT;AAEA,IAAI,UAAU;AACd,IAAI,YAAY;AAChB,IAAI;AAGJ,SAAS,mBAA4B;AACnC,QAAM,SAAS,SAAS,cAAc,eAAe;AACrD,MAAI,WAAW,KAAM,QAAO;AAC5B,QAAM,SAAS,OAAO;AACtB,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,OAAO,SAAS,eAAe,OAAO;AAC1C,MAAI,SAAS,MAAM;AACjB,WAAO,SAAS,cAAc,KAAK;AACnC,SAAK,KAAK;AACV,SAAK,QAAQ,SAAS;AACtB,eAAW,OAAO,aAAa;AAC7B,iBAAW,QAAQ,IAAK,MAAK,YAAY,SAAS,IAAI,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,QAAM,UAAU,KAAK,kBAAkB,WACjC,OAAO,wBAAwB,IAAI,IAAI,KAAK,iCAAiC;AACnF,MAAI,CAAC,SAAS;AACZ,WAAO,aAAa,MAAM,MAAM;AAAA,EAClC;AACA,SAAO;AACT;AAcA,SAAS,kBAAwB;AAC/B,QAAM,SAAS,SAAS,eAAe,OAAO,GAAG;AACjD,MAAI,WAAW,OAAW;AAC1B,gBAAc,WAAW;AACzB,iBAAe,IAAI,iBAAiB,MAAM;AACxC,UAAM,SAAS,SAAS,eAAe,OAAO,GAAG;AACjD,qBAAiB;AACjB,QAAI,SAAS,eAAe,OAAO,GAAG,kBAAkB,OAAQ,iBAAgB;AAAA,EAClF,CAAC;AACD,eAAa,QAAQ,QAAQ,EAAE,WAAW,KAAK,CAAC;AAClD;AAMO,SAAS,iBAA6B;AAC3C,MAAI,OAAO,aAAa,YAAa,QAAO,MAAM;AAAA,EAAC;AACnD,MAAI,QAAS,QAAO,MAAM;AAAA,EAAC;AAC3B,YAAU;AACV,mBAAiB;AACjB,kBAAgB;AAEhB,cAAY,OAAO,YAAY,MAAM;AACnC,qBAAiB;AACjB,QAAI,iBAAiB,OAAW,iBAAgB;AAAA,EAClD,GAAG,IAAI;AACP,SAAO,MAAM;AACX,WAAO,cAAc,SAAS;AAC9B,gBAAY;AACZ,kBAAc,WAAW;AACzB,mBAAe;AACf,cAAU;AACV,aAAS,eAAe,OAAO,GAAG,OAAO;AAAA,EAC3C;AACF;AAYO,SAAS,WAAW,MAAuC;AAChE,QAAM,CAAC,MAAM,OAAO,QAAI,yBAA6B,IAAI;AACzD,gCAAU,MAAM;AACd,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,UAAM,OAAO,MAAY;AACvB,YAAM,QAAQ,SAAS,cAA2B,mBAAmB,IAAI,IAAI;AAC7E,UAAI,UAAU,KAAM,SAAQ;AAAA,UACvB,UAAS;AACd,cAAQ,KAAK;AACb,cAAQ,OAAO,WAAW,MAAM,UAAU,OAAO,MAAM,SAAS,KAAK,MAAM,GAAG;AAAA,IAChF;AACA,SAAK;AACL,WAAO,MAAM;AAAE,aAAO,aAAa,KAAK;AAAA,IAAE;AAAA,EAC5C,GAAG,CAAC,IAAI,CAAC;AACT,SAAO;AACT;AASO,SAAS,UAAmB;AACjC,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,MAC/B,SAAS,cAAc,cAAc,GAAG,aAAa,wBAAwB,KAAK,KAAK;AACzF,gCAAU,MAAM;AACd,UAAM,OAAO,MAAY;AACvB,cAAQ,SAAS,cAAc,cAAc,GAAG,aAAa,wBAAwB,KAAK,KAAK;AAAA,IACjG;AACA,SAAK;AACL,UAAM,WAAW,IAAI,iBAAiB,IAAI;AAC1C,aAAS,QAAQ,SAAS,MAAM,EAAE,YAAY,MAAM,iBAAiB,CAAC,wBAAwB,GAAG,SAAS,KAAK,CAAC;AAChH,UAAM,QAAQ,OAAO,YAAY,MAAM,IAAI;AAC3C,WAAO,MAAM;AACX,eAAS,WAAW;AACpB,aAAO,cAAc,KAAK;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAEA,IAAMC,YAAW;AAEjB,IAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeP,SAAS,kBAAwB;AACtC,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAeD,SAAQ,MAAM,KAAM;AAChD,QAAM,MAAM,SAAS,cAAc,OAAO;AAC1C,MAAI,KAAKA;AACT,MAAI,QAAQ,SAAS;AACrB,MAAI,cAAcC;AAClB,WAAS,KAAK,YAAY,GAAG;AAC/B;AAuBO,SAAS,UAAU;AAAA,EACxB;AAAA,EAAM;AAAA,EAAO,OAAO;AAAA,EAAO,WAAW;AAAA,EAAO;AAAA,EAC7C;AAAA,EAAc;AAAA,EAAc;AAC9B,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,aAAW,QAAQ;AAAA,MACnB,aAAW,YAAY;AAAA,MACvB,cAAY,aAAa;AAAA,MACzB,iBAAe;AAAA,MACf,OAAO,OAAQ,aAAa,QAAS;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,QACA,CAAC,QAAQ,8CAAC,UAAK,WAAU,iBAAiB,iBAAM;AAAA;AAAA;AAAA,EACnD;AAEJ;AAGO,SAAS,UAAU,EAAE,MAAM,SAAS,GAAmE;AAC5G,QAAM,OAAO,WAAW,IAAI;AAC5B,MAAI,SAAS,KAAM,QAAO;AAC1B,aAAO,gCAAa,UAAU,IAAI;AACpC;AAYA,IAAM,mBAAmB;AAMzB,SAAS,eAAe,QAA0B;AAChD,MAAI,OAAuB;AAC3B,SAAO,SAAS,QAAQ,SAAS,SAAS,MAAM;AAC9C,UAAM,OAAO,KAAK,sBAAsB;AACxC,QACE,KAAK,UAAU,OAAO,cAAc,OACjC,KAAK,QAAQ,KACb,KAAK,SAAS,OAAO,aAAa,IACrC,QAAO;AACT,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,MAAsB,MAAe,cAAgC;AAErG,gCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,WAAO,cAAc,IAAI,YAAY,kBAAkB,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EAC1E,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,gCAAU,MAAM;AACd,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,gBAAgB,CAAC,UAAuB;AAC5C,UAAK,MAAsC,WAAW,KAAM,cAAa;AAAA,IAC3E;AACA,UAAM,aAAa,CAAC,UAAuC;AACzD,YAAM,SAAS,MAAM;AACrB,UAAI,EAAE,kBAAkB,SAAU;AAElC,UAAI,OAAO,QAAQ,IAAI,OAAO,aAAa,MAAM,KAAM;AACvD,UAAI,eAAe,MAAM,EAAG,cAAa;AAAA,IAC3C;AACA,WAAO,iBAAiB,kBAAkB,aAAa;AACvD,aAAS,iBAAiB,SAAS,YAAY,IAAI;AACnD,WAAO,MAAM;AACX,aAAO,oBAAoB,kBAAkB,aAAa;AAC1D,eAAS,oBAAoB,SAAS,YAAY,IAAI;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,YAAY,CAAC;AAC/B;AAMO,SAAS,cAAc,IAA0C;AACtE,MAAI,OAAO,KAAM,QAAO;AACxB,QAAM,MAAM,GAAG,QAAQ,IAAI,OAAO,EAAE;AACpC,MAAI,QAAQ,KAAM,QAAO;AACzB,QAAM,UAAU,IAAI,sBAAsB;AAC1C,QAAM,UAAU,GAAG,sBAAsB;AACzC,SAAO,EAAE,MAAM,KAAK,MAAM,QAAQ,QAAQ,CAAC,GAAG,KAAK,KAAK,MAAM,QAAQ,MAAM,CAAC,EAAE;AACjF;;;A1CzSI,IAAAC,uBAAA;AAdJ,SAAS,gBAAgB,GAA8D;AACrF,SAAO,cAAc,EAAE,aAAa;AACtC;AAGA,SAAS,cAA2B;AAClC,wBAAsB;AACtB,oBAAkB;AAClB,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAA+B,IAAI;AAC/D,QAAM,EAAE,SAAS,aAAa,IAAI,cAAc,MAAM,MAAM;AAAE,YAAQ,KAAK;AAAA,EAAE,CAAC;AAC9E,QAAM,OAAO,QAAQ;AACrB,oBAAkB,UAAU,MAAM,YAAY;AAC9C,SACE,gFAEE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MACE,8CAAC,SAAI,OAAO,OAAO,KAAK,IAAI,QAAQ,OAAO,KAAK,IAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAY,QACnL,wDAAC,UAAK,GAAE,mCAAkC,GAC5C;AAAA,QAEF,OAAM;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV,SAAS,OAAK;AACZ,YAAE,gBAAgB;AAClB,oBAAU,gBAAgB,CAAC,CAAC;AAC5B,kBAAQ,IAAI;AAAA,QACd;AAAA;AAAA,IACF;AAAA,IACC,QACC,8CAAC,iBAAc,OAAM,4BAAO,UAAU,MAAM,SAAS,cACnD,wDAAC,eAAY,SAAkB,SAAS,cAAc,QAAgB,GACxE;AAAA,KAEJ;AAEJ;AAGA,SAAS,eAAmC;AAC1C,kBAAgB;AAChB,SACE,8CAAC,aAAU,MAAK,UACd,wDAAC,eAAY,GACf;AAEJ;AAEO,SAAS,MAAM,KAA0B;AAC9C,MAAI,OAAO,MAAM;AACf,mBAAe;AAGf,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,UAAM,WAAO,0BAAW,MAAM;AAC9B,SAAK,OAAO,8CAAC,gBAAa,CAAE;AAC5B,WAAO,MAAM;AAAE,WAAK,QAAQ;AAAA,IAAE;AAAA,EAChC,GAAG,yBAAyB;AAC9B;;;ADnDO,IAAM,SAAS,CAAC,SAAS,UAAU,iBAAiB,UAAU;AAGrE,SAAS,KAAK,OAAe,KAAmC,KAA0B;AACxF,MAAI;AACF,QAAI,GAAG;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK,YAAY,KAAK;AAAA,EACjE;AACF;AAEO,SAASC,OAAM,KAA0B;AAC9C,OAAK,gBAAgB,OAAkB,GAAG;AAC1C,OAAK,iBAAiB,aAAa,GAAG;AACxC;",
|
|
6
|
-
"names": ["apply", "import_react", "import_react", "import_dsh_client_ui_primitives", "import_react", "STYLE_ID", "SHEET", "import_react", "STYLE_ID", "SHEET", "inject", "import_react", "import_react", "rows", "inject", "phase", "h", "import_react", "apply", "h", "import_react", "h", "import_react", "import_react", "h", "h", "
|
|
3
|
+
"sources": ["../src/client/index.ts", "../src/client/skills/entry.tsx", "../src/client/skills/SkillsPanel.tsx", "../src/client/popover-shell.tsx", "../src/client/modal-animation.ts", "../src/client/prompt/Panel.tsx", "../src/client/skills/styles.ts", "../src/client/prompt/dnd.ts", "../src/client/prompt/styles.ts", "../src/client/prompt/types.ts", "../src/client/prompt/phase-ops.ts", "../src/client/prompt/presets.ts", "../src/client/prompt/SectionsPane.tsx", "../src/client/prompt/drag-scroll.ts", "../src/client/prompt/ToolsPane.tsx", "../src/client/prompt/tool-pool.ts", "../src/client/prompt/PresetsPane.tsx", "../src/client/prompt/preset-io.ts", "../src/client/prompt/PreviewPane.tsx", "../src/client/prompt/PreviewTools.tsx", "../src/client/prompt/locales.ts", "../src/client/prompt/index.ts", "../src/client/prompt/PromptView.tsx", "../src/client/skills/types.ts", "../src/client/skills/api.ts", "../src/client/skills/files.ts", "../src/client/skills/GuidePanel.tsx", "../src/client/skills/icons.tsx", "../src/client/skills/locales.ts", "../src/client/skills/McpAddModal.tsx", "../src/client/skills/mcp-state.ts", "../src/client/skills/McpView.tsx", "../src/client/confirm-dialog.tsx", "../src/client/skills/mcp-live.ts", "../src/client/skills/SkillCard.tsx", "../src/client/skills/SkillViewer.tsx", "../src/client/skills/markdown.ts", "../src/client/skills/SkillsView.tsx", "../src/client/skills/TopBar.tsx", "../src/client/error-boundary.tsx", "../src/client/sidebar-nav.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * dsh-prompt-customizer \u2014 browser half entry.\n *\n * Mounts the capability module (skills + MCP + prompt management), each piece\n * isolated so a failure in one cannot take down the others:\n *\n * - skills panel \u2192 sidebar nav row + panel (SKILL / MCP / \u63D0\u793A\u8BCD top-level tabs)\n * - prompt \u2192 locale registration for the \u63D0\u793A\u8BCD tab (panel body lives in\n * `./prompt`, ported from dsh-prompt-customizer)\n *\n * \u4E0D\u518D\u6CE8\u518C\u5185\u6838\u5DF2\u7ECF\u63D0\u4F9B\u7684\u90A3\u4E09\u6837\uFF08`skill` locale \u547D\u540D\u7A7A\u95F4\u3001`tool.call.toolview`\n * \u7684 `skill` \u5DE5\u5177\u884C\u3001`/` \u659C\u6760\u6E90\uFF09\uFF1A\u5B83\u4EEC\u5C5E\u4E8E `@deepseek-ai/dsh-client-ui-skill`\uFF0C\n * \u800C locale / slots / inputTriggers \u4E09\u4E2A\u6CE8\u518C\u8868\u5BF9\u540C\u540D/\u540C\u952E**\u76F4\u63A5\u629B\u9519**\uFF0C\u4E14\u8C01\u5148\n * \u6CE8\u518C\u8C01\u8BA9\u540E\u6765\u8005\u629B \u2014\u2014 \u91CD\u590D\u6CE8\u518C\u4F1A\u628A\u5185\u6838\u63D2\u4EF6\u7684 apply \u6253\u6302\uFF0C\u6574\u6761\u5BA2\u6237\u7AEF\u63D2\u4EF6\u52A0\u8F7D\n * \u94FE\u4E00\u8D77\u5931\u8D25\uFF080.6.0 \u5B9E\u6D4B\u8E29\u8FC7\uFF09\u3002\u6280\u80FD\u6570\u636E\u672C\u8EAB\u4ECD\u7531\u672C\u63D2\u4EF6\u7684\u9762\u677F\u4E0E\u8DEF\u7531\u63D0\u4F9B\u3002\n *\n * All data comes from the host half's loopback-only HTTP routes via\n * same-origin fetch. No DSH source is modified.\n */\n\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport { apply as applySkillsEntry } from './skills/entry.js'\nimport { applyPrompt } from './prompt/index.js'\n\n/** Client services required before the browser half activates. */\nexport const inject = ['slots', 'locale', 'inputTriggers', 'sessions']\n\n/** Run one module's apply, logging and swallowing any failure. */\nfunction safe(label: string, run: (ctx: ClientContext) => void, ctx: ClientContext): void {\n try {\n run(ctx)\n } catch (error) {\n console.error(`[dsh-prompt-customizer] ${label} failed:`, error)\n }\n}\n\nexport function apply(ctx: ClientContext): void {\n safe('skills panel', applySkillsEntry, ctx)\n safe('prompt locale', applyPrompt, ctx)\n}\n", "/**\r\n * \u80FD\u529B\uFF08\u6280\u80FD + MCP \u7BA1\u7406\uFF09\u5165\u53E3\uFF1A\u4FA7\u8FB9\u680F\u5BFC\u822A\u884C\u3002\r\n *\r\n * \u70B9\u51FB\u6253\u5F00\u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u7684\u9762\u677F\uFF08\u8DDF\u70B9\u4F1A\u8BDD\u4E00\u6837\u5360\u4F4F\u4E3B\u533A\uFF0C\u79FB\u52A8\u7AEF\u56DE\u9000\u5E95\u90E8 sheet\uFF09\uFF0C\r\n * \u9762\u677F\u9876\u90E8 SKILL / MCP \u53CC\u5C42\u9876\u5C42 tab\u3002\r\n */\r\nimport { useCallback, useState } from 'react'\r\nimport { createRoot } from 'react-dom/client'\r\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\r\nimport { SkillsPanel } from './SkillsPanel'\r\nimport { ensureModalAnimStyles, useModalClose } from '../modal-animation'\r\nimport { ErrorBoundary } from '../error-boundary'\r\nimport { NavButton, NavPortal, ensureNavMount, ensureNavStyles, navAnchorFrom, usePanelAutoClose, useRail } from '../sidebar-nav'\r\nimport { ensureShellStyles, type PopoverAnchor } from '../popover-shell'\r\n\r\n/** \u4ECE\u70B9\u51FB\u4E8B\u4EF6\u53D6\u951A\u70B9\uFF1A\u6240\u5728\u5BFC\u822A\u884C\u53F3\u7F18 +8\u3001\u6309\u94AE\u9876\u7F18 -6\u3002 */\r\nfunction anchorFromEvent(e: React.MouseEvent<HTMLButtonElement>): PopoverAnchor | null {\r\n return navAnchorFrom(e.currentTarget)\r\n}\r\n\r\n/** \u6280\u80FD\u5165\u53E3\uFF1A\u5BFC\u822A\u884C + \u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u7684\u9762\u677F\u3002 */\r\nfunction SkillsEntry(): JSX.Element {\r\n ensureModalAnimStyles()\r\n ensureShellStyles()\r\n const [open, setOpen] = useState(false)\r\n const [anchor, setAnchor] = useState<PopoverAnchor | null>(null)\r\n // onClose \u5FC5\u987B\u662F\u7A33\u5B9A\u5F15\u7528\uFF1AuseModalClose \u7684 requestClose \u4F9D\u8D56\u5B83\uFF0C\u800C\r\n // usePanelAutoClose \u7684\u6355\u83B7\u76D1\u542C\u53C8\u4F9D\u8D56 requestClose \u2014\u2014 \u5185\u8054\u7BAD\u5934\u4F1A\u8BA9\u8FD9\u4E2A\r\n // document \u7EA7\u6355\u83B7\u76D1\u542C\u6BCF\u6B21\u6E32\u67D3\u90FD\u62C6\u88C5\u4E00\u904D\uFF0C\u62C6\u88C5\u95F4\u9699\u7684\u70B9\u51FB\u4F1A\u88AB\u6F0F\u6389\r\n // \uFF08\u684C\u9762\u7248\u6E32\u67D3\u66F4\u6162\uFF0C\u8868\u73B0\u4E3A\u70B9 MCP / \u63D0\u793A\u8BCD\u6CA1\u53CD\u5E94\uFF09\u3002\r\n const onClose = useCallback(() => { setOpen(false) }, [])\r\n const { closing, requestClose } = useModalClose(open, onClose)\r\n const rail = useRail()\r\n usePanelAutoClose('skills', open, requestClose)\r\n return (\r\n <>\r\n {/* \u80FD\u529B\uFF08\u95EA\u7535\uFF0CFeather zap \u7EBF\u6027\u98CE\uFF0C\u81EA\u7ED8\u56FE\u6807\uFF09 */}\r\n <NavButton\r\n icon={(\r\n <svg width={rail ? 18 : 16} height={rail ? 18 : 16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M13 2 3 14h7l-1 8 10-12h-7l1-8z\" />\r\n </svg>\r\n )}\r\n label=\"\u80FD\u529B\"\r\n rail={rail}\r\n expanded={open}\r\n onClick={e => {\r\n e.stopPropagation()\r\n setAnchor(anchorFromEvent(e))\r\n setOpen(true)\r\n }}\r\n />\r\n {open && (\r\n <ErrorBoundary label=\"\u6280\u80FD\u9762\u677F\" fallback={null} onError={requestClose}>\r\n <SkillsPanel closing={closing} onClose={requestClose} anchor={anchor} />\r\n </ErrorBoundary>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\n/** \u5BFC\u822A\u884C\u5E94\u7528\uFF1A\u80FD\u529B\u5165\u53E3 portal \u5230 nav host \u7684 skills \u69FD\u3002 */\r\nfunction SkillsNavApp(): JSX.Element | null {\r\n ensureNavStyles()\r\n return (\r\n <NavPortal name=\"skills\">\r\n <SkillsEntry />\r\n </NavPortal>\r\n )\r\n}\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n ctx.effect(() => {\r\n ensureNavMount()\r\n // React \u6839\u6302\u5728\u6E38\u79BB\u5BB9\u5668\u4E0A\uFF08React 18 \u652F\u6301\u5BB9\u5668\u540E\u5165\u6811\uFF09\uFF1B\u5B9E\u9645 UI \u7ECF portal\r\n // \u843D\u5230 sidebar-nav \u7684\u69FD\u4F4D div\u3002\r\n const holder = document.createElement('div')\r\n const root = createRoot(holder)\r\n root.render(<SkillsNavApp />)\r\n return () => { root.unmount() }\r\n }, 'triad: skills nav entry')\r\n}\r\n", "/**\n * SkillsPanel \u2014 \u80FD\u529B\u7BA1\u7406\u9762\u677F\uFF08SKILL / MCP \u53CC\u9876\u5C42 tab\uFF09\u3002\n *\n * \u62C6\u5206\u540E\u7684\u7F16\u6392\u5C42\uFF1A\u6301\u6709\u5168\u90E8\u72B6\u6001\u4E0E\u64CD\u4F5C\uFF0C\u6309\u9875\u7B7E\u6E32\u67D3\u9876\u680F\uFF08TopBar\uFF09\u4E0E\u4E3B\u533A\n * \uFF08SkillsView / McpView\uFF09\uFF0C\u5E76\u7EDF\u7BA1\u4E8C\u7EA7\u5F39\u7A97\uFF08\u6DFB\u52A0\u6280\u80FD\u3001\u65B0\u5EFA\u6280\u80FD\u5305\u3001\u8BBE\u7F6E\u5206\u7C7B\u3001\n * \u5220\u9664\u786E\u8BA4\u3001\u6587\u4EF6\u67E5\u770B\u5668\u3001\u5F52\u5165\u6280\u80FD\u5305\uFF09\u4E0E\u53F3\u4E0B\u89D2\u64CD\u4F5C\u56DE\u6267\u3002\n *\n * \u6570\u636E\u5168\u90E8\u8D70 /api/skill-manager\u3001/api/skill-toggles\u3001/api/skill-health\u3001\n * /api/triad/mcp-* \u3002\u62C6\u5206\u53EA\u79FB\u52A8\u4EE3\u7801\uFF0C\u672A\u6539\u52A8 DOM \u7ED3\u6784\u4E0E\u7C7B\u540D\u3002\n */\nimport { useEffect, useRef, useState, type CSSProperties, type DragEvent, type FormEvent } from 'react'\nimport {\n Button, IconChevronDownOutlineRegular, IconFolderOpenOutlineRegular, Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { PshBody, PopoverShell, type PopoverAnchor } from '../popover-shell'\nimport { PromptView } from '../prompt/PromptView'\nimport { skillApi } from './api.js'\nimport { collectEntry, fileToBase64 } from './files.js'\nimport { GuidePanel } from './GuidePanel.js'\nimport { CloudUpIcon } from './icons.js'\nimport { skillT } from './locales.js'\nimport { McpAddModal } from './McpAddModal.js'\nimport { McpView } from './McpView.js'\nimport {\n MCP_TOOL_WATCH_INTERVAL_MS, MCP_TOOL_WATCH_TIMEOUT_MS, mcpRegisteredToolCountOf, useMcpLiveState,\n} from './mcp-live.js'\nimport { CategoryEditor } from './SkillCard.js'\nimport { SkillViewer, VIEWER_FONT_SIZES, readViewerPrefs, writeViewerPrefs } from './SkillViewer.js'\nimport { SkillsView } from './SkillsView.js'\nimport { css, ensureStyles } from './styles.js'\nimport { McpTopBar, PanelHead, SkillTopBar } from './TopBar.js'\nimport {\n ALL_PRESETS, UNCATEGORIZED, bundleVisibleInList, enabledStateAt, skillOverridesAt, sortCategories,\n} from './types.js'\nimport type {\n AddScope, BundleInfo, CollectedFile, ConfirmState, HealthView, InstallState, PanelState, PresetRow, SkillEnableScope,\n SkillEnableTables, SkillInfo, ViewerState,\n} from './types.js'\nconst SKILL_NAME_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/\n\n/** \u4ECE SKILL.md \u6587\u672C\u91CC\u53D6 frontmatter \u7684 name\uFF08\u5B89\u88C5\u5F39\u7A97\u9884\u89C8\u771F\u5B9E\u6280\u80FD\u540D\u7528\uFF09\u3002 */\nfunction frontmatterName(text: string): string | null {\n const lines = text.split(/\\r?\\n/).slice(0, 80)\n if ((lines[0] ?? '').trim() !== '---') return null\n for (const line of lines.slice(1)) {\n if (line.trim() === '---') break\n const pair = /^\\s*name\\s*:\\s*(.+?)\\s*$/.exec(line)\n if (pair !== null) return (pair[1] ?? '').replace(/^[\"']|[\"']$/g, '')\n }\n return null\n}\nexport function SkillsPanel({ onClose, closing = false, anchor = null, onCardMouseEnter, onCardMouseLeave }: { onClose: () => void; closing?: boolean; anchor?: PopoverAnchor | null; onCardMouseEnter?: () => void; onCardMouseLeave?: () => void }): JSX.Element {\n ensureStyles()\n const [state, setState] = useState<PanelState>({ status: 'loading' })\n const [reload, setReload] = useState(0)\n /**\n * \u9762\u677F\u6B63\u5728\u914D\u7F6E\u7684\u5DE5\u4F5C\u533A\uFF1Bnull = \u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD\u3002\n *\n * \u5B83\u540C\u65F6\u51B3\u5B9A\u6280\u80FD\u76EE\u5F55\u4E0E MCP \u6CE8\u5165\u7684\u5DE5\u4F5C\u533A\u7EA7\u5F00\u5173 \u2014\u2014 \u653E\u5728\u9876\u90E8\u6807\u7B7E\u884C\uFF0C\u8BA9\u7528\u6237\n * \u4E00\u773C\u770B\u6E05\u300C\u6211\u73B0\u5728\u6539\u7684\u662F\u54EA\u4E2A\u5DE5\u4F5C\u533A\u300D\u3002\n */\n const [workspace, setWorkspace] = useState<string | null>(null)\n /** \u5B9A\u65F6\u5668/\u7126\u70B9\u56DE\u8C03\u91CC\u8BFB\u53D6\u6700\u65B0\u9009\u62E9\uFF0C\u907F\u514D\u7A7A\u4F9D\u8D56\u95ED\u5305\u628A\u5DE5\u4F5C\u533A\u5207\u56DE\u201C\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD\u201D\u3002 */\n const workspaceRef = useRef<string | null>(workspace)\n /** \u9759\u9ED8\u8F6E\u8BE2\u5E8F\u53F7\uFF1A\u5207 workspace \u540E\u65E7\u54CD\u5E94\u4E0D\u80FD\u8986\u76D6\u65B0\u72B6\u6001\u3002 */\n const silentSeq = useRef(0)\n useEffect(() => { workspaceRef.current = workspace }, [workspace])\n /** \u53EF\u9009\u5DE5\u4F5C\u533A\u6E05\u5355\uFF08\u5BBF\u4E3B\u6309\u6D3B\u52A8\u4F1A\u8BDD cwd \u222A \u542F\u52A8\u76EE\u5F55\u7ED9\u51FA\uFF09\u3002 */\n const [workspaces, setWorkspaces] = useState<string[]>([])\n /**\n * \u300C\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD\u300D\u65F6\u5B9E\u9645\u751F\u6548\u7684\u5DE5\u4F5C\u533A\uFF1AMCP \u7684\u5DE5\u4F5C\u533A\u7EA7\u5F00\u5173\u8981\u7528\u5B83\u8BB0\u8D26\uFF0C\n * \u5426\u5219\u7528\u6237\u6CA1\u624B\u52A8\u9009\u5DE5\u4F5C\u533A\u65F6\u90A3\u4E2A\u6309\u94AE\u5C31\u65E0\u5904\u53EF\u53BB\u3002\n */\n const [currentWorkspace, setCurrentWorkspace] = useState<string | null>(null)\n // \u5206\u533A\u5C55\u5F00\u96C6\u5408\uFF1A\u9ED8\u8BA4\u7A7A = \u5168\u90E8\u6536\u8D77\uFF08\u9762\u677F\u6253\u5F00\u65F6\u53EA\u663E\u793A\u6280\u80FD\u5305\u6807\u9898\u884C\uFF09\u3002\n const [expanded, setExpanded] = useState<Set<string>>(new Set())\n // \u6563\u88C5\u6280\u80FD\u533A\u5C55\u5F00\u3002\n const [looseOpen, setLooseExpanded] = useState(false)\n const [viewer, setViewer] = useState<ViewerState | null>(null)\n /** \u67E5\u770B\u5668\u504F\u597D\uFF1A\u5B57\u53F7\u6863\u4F4D + \u662F\u5426\u5168\u5C4F\uFF08localStorage \u6301\u4E45\u5316\uFF0C\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\uFF09\u3002 */\n const [viewerFont, setViewerFont] = useState<number>(() => readViewerPrefs().font)\n const [viewerFull, setViewerFull] = useState<boolean>(() => readViewerPrefs().full)\n const [assignTarget, setAssignTarget] = useState<SkillInfo | null>(null)\n const [newBundleOpen, setNewBundleOpen] = useState(false)\n const [newBundleName, setNewBundleName] = useState('')\n /** \u65B0\u5EFA\u6280\u80FD\u5305\u5F39\u7A97\u91CC\u540C\u65F6\u6302\u7684\u5206\u7C7B\u3002 */\n const [newBundleCats, setNewBundleCats] = useState<string[]>([])\n const [creatingBundle, setCreatingBundle] = useState(false)\n const [renameTarget, setRenameTarget] = useState<{ bundleId: string; name: string } | null>(null)\n const [renaming, setRenaming] = useState(false)\n // \u6539\u540D\u6210\u529F\u7684\u5361\u7247 id\uFF1A\u89E6\u53D1\u4E00\u6B21\u9AD8\u4EAE\u8109\u51B2\uFF0C\u968F\u540E\u81EA\u52A8\u6E05\u9664\u3002\n const [renamedFlash, setRenamedFlash] = useState<string | null>(null)\n const renamedTimer = useRef<number | null>(null)\n const [confirm, setConfirm] = useState<ConfirmState | null>(null)\n const [confirming, setConfirming] = useState(false)\n const [install, setInstall] = useState<InstallState | null>(null)\n /** \u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\u5F00\u5173\uFF08\u9009\u5B8C\u6587\u4EF6\u540E\u540C\u4E00\u5F39\u7A97\u5185\u586B\u8868\u5355\uFF09\u3002 */\n const [addOpen, setAddOpen] = useState(false)\n const [installName, setInstallName] = useState('')\n const [installDescription, setInstallDescription] = useState('')\n /**\n * \u6DFB\u52A0\u6280\u80FD\u7684\u843D\u70B9\uFF1A\u9ED8\u8BA4\u5168\u5C40\uFF08\u6240\u6709\u5DE5\u4F5C\u533A\u5171\u7528\uFF09\uFF1B\u9009\u5DE5\u4F5C\u533A\u5219\u5199\u8FDB\u8BE5\u5DE5\u4F5C\u533A\u7684\n * `.agents/skills`\uFF08\u76EE\u5F55\u4E0D\u5B58\u5728\u4F1A\u81EA\u52A8\u521B\u5EFA\uFF09\u3002\n */\n const [installScope, setInstallScope] = useState<AddScope>('global')\n const [installBundleId, setInstallBundleId] = useState<string | undefined>(undefined)\n const [installing, setInstalling] = useState(false)\n const [installError, setInstallError] = useState<string | null>(null)\n /**\n * \u9762\u677F\u7EA7\u63D0\u793A\u6761\u3002\u65E7\u5B9E\u73B0\u628A\u6240\u6709\u5931\u8D25\u90FD\u585E\u8FDB installError\uFF0C\u800C\u5B83\u53EA\u5728\u300C\u6DFB\u52A0\u6280\u80FD\u300D\u5F39\u7A97\u91CC\n * \u6E32\u67D3 \u2014\u2014 \u4E8E\u662F\u5220\u9664\u6280\u80FD\u3001\u5F52\u7EC4\u3001\u6539\u540D\u3001\u5F00\u5173\u5931\u8D25\u65F6\u9762\u677F\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u663E\u793A\uFF0C\u7528\u6237\u53EA\u770B\u5230\n * \u300C\u70B9\u4E86\u6CA1\u53CD\u5E94\u300D\u3002\u6210\u8D25\u53CD\u9988\u7EDF\u4E00\u8D70\u8FD9\u91CC\u3002\n */\n const [toasts, setToasts] = useState<Array<{ id: number; tone: 'ok' | 'err'; text: string }>>([])\n const toastTimers = useRef<number[]>([])\n const pushToast = (tone: 'ok' | 'err', text: string): void => {\n const id = Date.now() + Math.random()\n setToasts((current) => [...current.slice(-2), { id, tone, text }])\n const timer = window.setTimeout(() => {\n setToasts((current) => current.filter((item) => item.id !== id))\n }, tone === 'err' ? 6400 : 2800)\n toastTimers.current.push(timer)\n }\n /** \u7EDF\u4E00\u5931\u8D25\u63D0\u793A\uFF1Alabel \u8BF4\u6E05\u662F\u54EA\u4E00\u6B65\uFF0Cmessage \u7528 host \u539F\u6587\u3002 */\n const failToast = (label: string, error: unknown): void => {\n pushToast('err', skillT('opFailed', { label, message: error instanceof Error ? error.message : String(error) }))\n }\n /** \u6587\u4EF6\u5939\u5BFC\u5165\u65F6 SKILL.md \u91CC\u5199\u7684\u6280\u80FD\u540D\uFF1A\u4E0E\u7528\u6237\u586B\u7684\u540D\u5B57\u4E0D\u4E00\u81F4\u65F6\u63D0\u524D\u8BF4\u660E\u4F1A\u6539\u5199\u3002 */\n const [installMetaName, setInstallMetaName] = useState<string | null>(null)\n useEffect(() => {\n if (install === null || install.archive === true) { setInstallMetaName(null); return undefined }\n const entry = install.files.find((item) => item.path === 'SKILL.md')\n if (entry === undefined) { setInstallMetaName(null); return undefined }\n let current = true\n void entry.file.text().then((text) => {\n if (!current) return\n setInstallMetaName(frontmatterName(text))\n }, () => { if (current) setInstallMetaName(null) })\n return () => { current = false }\n }, [install])\n const [dropActive, setDropActive] = useState(false)\n const fileInput = useRef<HTMLInputElement>(null)\n // \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\u72B6\u6001\uFF08skillName \u2192 enabled\uFF1BbundleId \u2192 enabled\uFF09\n const [toggles, setToggles] = useState<{ skills: Record<string, boolean>; bundles: Record<string, boolean> }>({ skills: {}, bundles: {} })\n const [workspaceToggles, setWorkspaceToggles] = useState<{ skills: Record<string, boolean>; bundles: Record<string, boolean> }>({ skills: {}, bundles: {} })\n // \u5207\u6362\u8FDB\u884C\u4E2D\u7684 key\uFF08\u907F\u514D\u91CD\u590D\u70B9\u51FB\uFF09\n const [toggling, setToggling] = useState<Set<string>>(new Set())\n // Agent \u9884\u8BBE\u5206\u7C7B\uFF1A\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5F53\u524D\u9009\u4E2D\u7684\u9884\u8BBE\uFF08'' = \u5168\u90E8 Agent\uFF09\n const [presets, setPresets] = useState<PresetRow[]>([])\n const [overrides, setOverrides] = useState<Record<string, Record<string, boolean>>>({})\n const [workspaceOverrides, setWorkspaceOverrides] = useState<Record<string, Record<string, boolean>>>({})\n const [activePreset, setActivePreset] = useState<string>(ALL_PRESETS)\n // Skills Hub \u5DE5\u5177\u680F\uFF1A\u641C\u7D22\u8BCD / \u6765\u6E90\u7B5B\u9009(\u5168\u90E8=all|bundles|loose) / \u540D\u79F0\u6392\u5E8F / \u89C6\u56FE\u5207\u6362\n const [query, setQuery] = useState('')\n const [sourceFilter, setSourceFilter] = useState<'all' | 'bundles' | 'loose'>('all')\n const [sortAsc, setSortAsc] = useState(true)\n /** \u5DE6\u680F\u5206\u7C7B / \u7B5B\u9009\uFF1A\u542F\u7528\u72B6\u6001 + Agent \u9884\u8BBE\uFF08\u5206\u7C7B\u5207\u6362\u7531\u5DE6\u680F\u300CAgent \u9884\u8BBE\u5206\u7C7B\u300D\u9A71\u52A8\uFF09\u3002 */\n const [statusFilter, setStatusFilter] = useState<'all' | 'on' | 'off'>('all')\n /** \u6280\u80FD\u5305\u5206\u7C7B\u7B5B\u9009\uFF1Anull = \u4E0D\u7B5B\uFF1B\u5206\u7C7B\u540D\u6216 UNCATEGORIZED = \u53EA\u770B\u8BE5\u7C7B\u3002 */\n const [catFilter, setCatFilter] = useState<string | null>(null)\n /** \u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u5F39\u7A97\u7684\u76EE\u6807\u5305\uFF08null = \u5173\uFF09\uFF1BcatDraft \u662F\u5F39\u7A97\u5185\u7684\u7F16\u8F91\u526F\u672C\u3002 */\n const [catTarget, setCatTarget] = useState<{ bundleId: string; name: string } | null>(null)\n const [catDraft, setCatDraft] = useState<string[]>([])\n const [savingCats, setSavingCats] = useState(false)\n /** \u81EA\u5B9A\u4E49\u4E0B\u62C9/\u83DC\u5355\uFF1A\u6765\u6E90\u7B5B\u9009 / Agent \u9884\u8BBE / \u540D\u79F0\u6392\u5E8F / \u5FEB\u6377\u7B5B\u9009 / \u884C\u5185\u66F4\u591A\u83DC\u5355\uFF08\u54EA\u4E2A\u5F00\u7740\uFF0Cnull = \u90FD\u5173\uFF09\u3002 */\n const [openMenu, setOpenMenu] = useState<string | null>(null)\n /** \u540C\u6B65\u72B6\u6001\uFF1A/api/skill-health \u53EA\u8BFB\u626B\u63CF\u7ED3\u679C\uFF08\u7F3A SKILL.md \u7B49\uFF09\u3002 */\n const [health, setHealth] = useState<HealthView>({ state: 'loading' })\n /** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5F39\u7A97\u5F00\u5173\u3002 */\n const [guideOpen, setGuideOpen] = useState(false)\n /** \u5DE6\u4FA7\u9876\u5C42 tab\uFF1ASKILL\uFF08\u6280\u80FD\u7BA1\u7406\uFF09/ MCP\uFF08MCP Server\uFF09\u3002 */\n const [kind, setKind] = useState<'skill' | 'mcp' | 'prompt'>('skill')\n // \u7EDF\u4E00\u7F16\u8F91\u5C42\u7EA7\uFF08\u9884\u8BBE\u7EA7 / \u5DE5\u4F5C\u533A\u7EA7\uFF09\uFF0C\u4E09 tab \u5171\u7528\uFF1B\u5DE5\u4F5C\u533A\u7531\u9876\u90E8\u5DE5\u4F5C\u533A\u9009\u62E9\u5668\u51B3\u5B9A\u3002\n const [level, setLevel] = useState<'preset' | 'workspace'>('preset')\n /** MCP \u9875\u8303\u56F4\uFF08'' = \u5168\u90E8 Agent\uFF09\u3002 */\n const [mcpScope, setMcpScope] = useState('')\n /** MCP Server \u641C\u7D22\u8BCD\u3002 */\n const [mcpQuery, setMcpQuery] = useState('')\n /** MCP \u542F\u7528\u72B6\u6001\u7B5B\u9009\uFF08\u4F5C\u7528\u4E8E\u5168\u5C40\u6761\u76EE\uFF09\u3002 */\n const [mcpStatusFilter, setMcpStatusFilter] = useState<'all' | 'on' | 'off'>('all')\n /** \u771F\u5B9E MCP \u6CE8\u518C\u72B6\u6001\uFF08/api/triad/mcp-status\uFF09\uFF1AMCP \u9875\u552F\u4E00\u6570\u636E\u6E90\u3002 */\n const [mcpLive, mcpRefreshLive] = useMcpLiveState()\n /** \u6DFB\u52A0 MCP Server\uFF08\u7C98\u8D34 JSON / YAML\uFF09\u5F39\u7A97\u5F00\u5173\u3002 */\n const [mcpAddOpen, setMcpAddOpen] = useState(false)\n /** \u6DFB\u52A0\u300C\u9884\u8BBE\u4E13\u5C5E Server\u300D\u5F39\u7A97\u5F00\u5173\uFF08\u6309\u94AE\u5728 MCP \u9876\u680F\uFF0C\u5F39\u7A97\u7531 McpView \u6E32\u67D3\uFF09\u3002 */\n const [mcpAddOwnOpen, setMcpAddOwnOpen] = useState(false)\n /* \u2500\u2500 \u6DFB\u52A0/\u542F\u7528\u540E\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * \u5199\u914D\u7F6E\u53EA\u662F\u8BA9 DSH \u70ED\u91CD\u8F7D\u90A3\u4E00\u884C\uFF1BMCP \u8FDB\u7A0B\u8981\u665A\u51E0\u79D2\u624D\u8FDE\u4E0A\u5E76\u6CE8\u518C\u5DE5\u5177\u3002\n * \u4E4B\u524D\u53EA\u5237\u65B0\u4E00\u6B21 \u2192 \u9762\u677F\u4E0A Server \u6709\u4E86\u4F46\u5DE5\u5177\u662F\u7A7A\u7684\uFF0C\u7528\u6237\u8FD8\u5F97\u81EA\u5DF1\u70B9\u300C\u5237\u65B0\u300D\u3002\n * \u8FD9\u91CC\u6309 2s \u8F6E\u8BE2\uFF0C\u76EE\u6807\u90FD\u62A5\u51FA\u5DE5\u5177\uFF08\u6216 90s \u8D85\u65F6\uFF09\u5C31\u6536\u5DE5\u3002 */\n const mcpWatchTimer = useRef<number | null>(null)\n const [mcpWaitingTools, setMcpWaitingTools] = useState<string[]>([])\n /** \u6700\u65B0\u72B6\u6001\u5FEB\u7167\uFF1A\u5B9A\u65F6\u5668\u56DE\u8C03\u91CC\u8BFB\u4E0D\u5230\u65B0\u7684\u95ED\u5305\u503C\u3002 */\n const mcpLiveRef = useRef(mcpLive)\n useEffect(() => { mcpLiveRef.current = mcpLive }, [mcpLive])\n const stopMcpWatch = (): void => {\n if (mcpWatchTimer.current !== null) {\n window.clearInterval(mcpWatchTimer.current)\n mcpWatchTimer.current = null\n }\n setMcpWaitingTools([])\n }\n /** \u7ACB\u5373\u5237\u65B0\u4E00\u6B21\uFF0C\u7136\u540E\u8F6E\u8BE2\u5230\u8FD9\u4E9B Server \u6CE8\u518C\u51FA\u5DE5\u5177\u4E3A\u6B62\uFF08\u8D85\u65F6/\u5168\u90E8\u5C31\u7EEA\u5373\u505C\uFF09\u3002 */\n const watchMcpTools = (names: string[]): void => {\n if (mcpWatchTimer.current !== null) {\n window.clearInterval(mcpWatchTimer.current)\n mcpWatchTimer.current = null\n }\n mcpRefreshLive()\n const pending = new Set(names.filter(name => name !== ''))\n if (pending.size === 0) { setMcpWaitingTools([]); return }\n setMcpWaitingTools([...pending])\n const startedAt = Date.now()\n mcpWatchTimer.current = window.setInterval(() => {\n const snapshot = mcpLiveRef.current\n if (snapshot.state === 'ready') {\n for (const name of [...pending]) {\n if (mcpRegisteredToolCountOf(snapshot.data, name) > 0) pending.delete(name)\n }\n setMcpWaitingTools([...pending])\n }\n if (pending.size === 0 || Date.now() - startedAt > MCP_TOOL_WATCH_TIMEOUT_MS) stopMcpWatch()\n else mcpRefreshLive()\n }, MCP_TOOL_WATCH_INTERVAL_MS)\n }\n\n const refresh = (): void => {\n setReload((value) => value + 1)\n }\n\n /** \u9759\u9ED8\u540C\u6B65\uFF1A\u4E0D\u7F6E loading\uFF0C\u76F4\u63A5\u66FF\u6362\u6570\u636E\uFF08\u81EA\u52A8\u540C\u6B65\u673A\u5236\u7528\uFF09\u3002 */\n const silentSync = (): void => {\n const seq = ++silentSeq.current\n void skillApi.list(workspaceRef.current).then((snapshot) => {\n if (seq !== silentSeq.current) return\n setState((current) => current.status === 'error'\n ? current\n : { status: 'ready', snapshot })\n }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n void skillApi.presetStatus(workspaceRef.current).then(\n (status) => {\n if (seq !== silentSeq.current) return\n setToggles({ skills: status.skills, bundles: status.bundles })\n setWorkspaceToggles({ skills: status.workspaceSkills ?? {}, bundles: status.workspaceBundles ?? {} })\n setOverrides(status.overrides)\n setPresets(status.presets)\n void skillApi.workspaceStatus().then((s) => { if (seq === silentSeq.current) setWorkspaceOverrides(s.workspaces) }, () => {})\n },\n () => {\n void skillApi.toggleStatus(workspaceRef.current).then((status) => { if (seq === silentSeq.current) setToggles(status) }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n },\n )\n void skillApi.health().then(\n (report) => { if (seq === silentSeq.current) setHealth(report.ok ? { state: 'ok', report } : { state: 'issue', report }) },\n () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ },\n )\n }\n\n /** \u81EA\u52A8\u540C\u6B65\u673A\u5236\uFF1A\u9762\u677F\u6253\u5F00\u671F\u95F4 30s \u8F6E\u8BE2 + \u9875\u9762\u91CD\u65B0\u53EF\u89C1/\u805A\u7126\u7ACB\u5373\u5237\u65B0\uFF08\u4E0D\u95EA\u70C1\uFF09\u3002 */\n useEffect(() => {\n const timer = window.setInterval(silentSync, 30_000)\n const onVis = (): void => { if (document.visibilityState === 'visible') silentSync() }\n const onFocus = (): void => { silentSync() }\n document.addEventListener('visibilitychange', onVis)\n window.addEventListener('focus', onFocus)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', onVis)\n window.removeEventListener('focus', onFocus)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n /** \u5F00\u5173\u5207\u6362\u540E\u9759\u9ED8\u540C\u6B65:\u53EA\u91CD\u62C9\u5F00\u5173\u72B6\u6001,\u4E0D\u91CD\u8F7D\u6574\u4E2A\u9762\u677F(\u907F\u514D\u95EA\u70C1)\u3002 */\n const refreshTogglesOnly = (): void => {\n void skillApi.presetStatus(workspaceRef.current).then(\n (status) => {\n setToggles({ skills: status.skills, bundles: status.bundles })\n setWorkspaceToggles({ skills: status.workspaceSkills ?? {}, bundles: status.workspaceBundles ?? {} })\n setOverrides(status.overrides)\n setPresets(status.presets)\n void skillApi.workspaceStatus().then((s) => setWorkspaceOverrides(s.workspaces), () => {})\n },\n () => {\n // \u9884\u8BBE\u63A5\u53E3\u4E0D\u53EF\u7528\uFF08\u8001 host\uFF09\u65F6\u9000\u56DE\u53EA\u8BFB\u5168\u5C40\u5C42\u72B6\u6001\u3002\n void skillApi.toggleStatus(workspaceRef.current).then((status) => { setToggles(status) }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n },\n )\n }\n\n const t = skillT\n\n useEffect(() => {\n let current = true\n setState({ status: 'loading' })\n void skillApi.list(workspace).then(\n (snapshot) => {\n if (current) setState({ status: 'ready', snapshot })\n },\n () => {\n if (current) setState({ status: 'error' })\n },\n )\n void skillApi.presetStatus(workspace).then(\n (status) => {\n if (!current) return\n setToggles({ skills: status.skills, bundles: status.bundles })\n setWorkspaceToggles({ skills: status.workspaceSkills ?? {}, bundles: status.workspaceBundles ?? {} })\n setOverrides(status.overrides)\n setPresets(status.presets)\n void skillApi.workspaceStatus().then((s) => setWorkspaceOverrides(s.workspaces), () => {})\n },\n () => {\n // \u9884\u8BBE\u63A5\u53E3\u4E0D\u53EF\u7528\u65F6\u9000\u5316\u4E3A\u300C\u53EA\u6709\u5168\u5C40\u5C42\u300D\uFF1A\u5706\u7403\u6761\u53EA\u5269\u300C\u5168\u90E8 Agent\u300D\u3002\n void skillApi.toggleStatus(workspace).then(\n (status) => { if (current) setToggles(status) },\n () => { /* \u5F00\u5173\u63A5\u53E3\u4E5F\u4E0D\u53EF\u7528\u65F6\u4FDD\u6301\u7A7A\u72B6\u6001\uFF08\u5F00\u5173\u4ECD\u53EF\u64CD\u4F5C,\u5931\u8D25\u4F1A\u63D0\u793A\uFF09\u3002 */ },\n )\n },\n )\n // \u540C\u6B65\u72B6\u6001\uFF1A\u53EA\u8BFB\u5065\u5EB7\u626B\u63CF\uFF08\u76EE\u5F55\u5B8C\u6574\u6027 + \u8D26\u672C\u60AC\u6302\u5F15\u7528\uFF09\u3002\n setHealth({ state: 'loading' })\n void skillApi.health().then(\n (report) => { if (current) setHealth(report.ok ? { state: 'ok', report } : { state: 'issue', report }) },\n () => { if (current) setHealth({ state: 'unavailable' }) },\n )\n return () => { current = false }\n // reload \u62C6\u5206\u4E3A\u53D8\u5316\u952E\uFF1Bopen \u6052 true\uFF08\u672C\u7EC4\u4EF6\u5728\u6253\u5F00\u65F6\u624D\u6E32\u67D3\uFF09\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [reload, workspace])\n\n // \u5DE5\u4F5C\u533A\u6E05\u5355\uFF1A\u53EA\u5728\u9762\u677F\u6253\u5F00\u65F6\u53D6\u4E00\u6B21\uFF1B\u5931\u8D25\u5C31\u53EA\u5269\u300C\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD\u300D\u4E00\u9879\u3002\n useEffect(() => {\n let current = true\n void skillApi.workspaces().then(\n (result) => {\n if (!current) return\n setWorkspaces(Array.isArray(result.workspaces) ? result.workspaces : [])\n setCurrentWorkspace(typeof result.current === 'string' && result.current !== '' ? result.current : null)\n },\n () => { if (current) setWorkspaces([]) },\n )\n return () => { current = false }\n }, [reload])\n\n // \u5378\u8F7D\u65F6\u6E05\u6389\u6539\u540D\u9AD8\u4EAE\u4E0E\u63D0\u793A\u6761\u5B9A\u65F6\u5668\uFF0C\u907F\u514D\u5378\u8F7D\u540E setState\u3002\n useEffect(() => () => {\n if (renamedTimer.current !== null) window.clearTimeout(renamedTimer.current)\n if (mcpWatchTimer.current !== null) window.clearInterval(mcpWatchTimer.current)\n for (const timer of toastTimers.current) window.clearTimeout(timer)\n }, [])\n\n /** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u6D6E\u5C42\u7684\u4F4D\u7F6E\uFF1A\u8D34\u7740\u9762\u677F\u5361\u7247\u53F3\u7F18\u5185\u4FA7\uFF08\u9762\u677F\u94FA\u6EE1\u4E3B\u533A\uFF0C\u5916\u4FA7\u5DF2\u65E0\u7A7A\u95F4\uFF09\u3002 */\n const [guidePos, setGuidePos] = useState<{ left: number; top: number; height: number } | null>(null)\n useEffect(() => {\n if (!guideOpen) return\n const marker = document.querySelector('[data-skm-panel-marker]')\n const card = marker?.closest('.psh-card')\n if (!(card instanceof HTMLElement)) return\n const rect = card.getBoundingClientRect()\n const vh = window.innerHeight\n const top = Math.max(8, rect.top)\n const overlayW = 300\n setGuidePos({\n left: Math.max(rect.left + 12, rect.right - overlayW - 12),\n top,\n height: Math.min(rect.height, vh - top - 12),\n })\n }, [guideOpen])\n\n const runToggle = async (key: string, action: () => Promise<unknown>): Promise<void> => {\n if (toggling.has(key)) return\n setToggling((current) => new Set(current).add(key))\n setInstallError(null)\n try {\n await action()\n // \u5F00\u5173\u53EA\u6539 frontmatter,\u6280\u80FD\u5217\u8868\u7ED3\u6784\u4E0D\u53D8:\u9759\u9ED8\u540C\u6B65\u5373\u53EF,\u4E0D\u91CD\u8F7D\u9762\u677F\u3002\n refreshTogglesOnly()\n } catch (error) {\n pushToast('err', skillT('toggleFailed', { message: error instanceof Error ? error.message : String(error) }))\n } finally {\n setToggling((current) => {\n const next = new Set(current)\n next.delete(key)\n return next\n })\n }\n }\n\n // \u6280\u80FD\u5F00\u5173\u7684\u5B8C\u6574\u4F5C\u7528\u57DF\uFF1A\u5C42\u7EA7 + \u9884\u8BBE + \u5DE5\u4F5C\u533A\uFF08\u6309 cwd\uFF09\u3002\u8BFB\u4E0E\u5199\u5171\u7528\u540C\u4E00\u4E2A\u5BF9\u8C61\u3002\n const effectiveWorkspace = workspace ?? currentWorkspace\n const scope: SkillEnableScope = { level, presetId: activePreset, cwd: effectiveWorkspace }\n\n const toggleSkill = (skill: SkillInfo, enabled: boolean): void => {\n if (scope.level === 'workspace') {\n if (scope.cwd === null) { pushToast('err', 'no active workspace'); return }\n void runToggle(`skill:${skill.name}`, () => skillApi.setWorkspaceSkillEnabled(scope.cwd!, skill.name, enabled))\n return\n }\n if (scope.presetId === ALL_PRESETS) {\n void runToggle(`skill:${skill.name}`, () => skillApi.setSkillEnabled(skill.name, enabled))\n return\n }\n void runToggle(\n `skill:${skill.name}`,\n () => skillApi.setPresetSkillEnabled(scope.presetId, skill.name, enabled),\n )\n }\n\n const toggleBundle = (bundle: BundleInfo, enabled: boolean): void => {\n if (scope.level === 'workspace') {\n if (scope.cwd === null) { pushToast('err', 'no active workspace'); return }\n void runToggle(`bundle:${bundle.id}`, () => skillApi.setWorkspaceBundleEnabled(scope.cwd!, bundle.id, enabled))\n return\n }\n if (scope.presetId === ALL_PRESETS) {\n void runToggle(`bundle:${bundle.id}`, () => skillApi.setBundleEnabled(bundle.id, enabled))\n return\n }\n void runToggle(\n `bundle:${bundle.id}`,\n () => skillApi.setPresetBundleEnabled(scope.presetId, bundle.id, enabled),\n )\n }\n\n /** \u4E09\u5C42\u5F00\u5173\u8D26\u672C\uFF1A\u5168\u90E8\u8BFB\u53D6/\u8BA1\u6570\u90FD\u4ECE\u8FD9\u91CC\u6309\u540C\u4E00\u4E2A scope \u6C42\u503C\u3002 */\n const enableTables: SkillEnableTables = {\n skills: toggles.skills,\n overrides,\n workspaceOverrides,\n workspaceSkills: workspaceToggles.skills,\n }\n /** \u5F53\u524D\u4F5C\u7528\u57DF\u771F\u6B63\u4F1A\u5199\u5165/\u6E05\u7406\u7684\u90A3\u5C42\u8986\u76D6\uFF08\u6309\u94AE\u663E\u793A\u4E0E\u52A8\u4F5C\u5171\u7528\uFF09\u3002 */\n const scopeOverrides = skillOverridesAt(scope, enableTables)\n const scopeOverrideCount = Object.keys(scopeOverrides).length\n\n /** \u67D0\u4E2A\u9884\u8BBE\uFF08\u53E0\u52A0\u5F53\u524D\u5C42\u7EA7/\u5DE5\u4F5C\u533A\uFF09\u4E0B\u5DF2\u542F\u7528\u7684\u6280\u80FD\u6570\u3002 */\n const enabledCountFor = (presetId: string): number => {\n const target: SkillEnableScope = { level: scope.level, presetId, cwd: scope.cwd }\n let n = 0\n for (const bundle of bundles) for (const skill of bundle.skills) if (enabledStateAt(target, skill.name, enableTables)) n += 1\n for (const skill of loose) if (enabledStateAt(target, skill.name, enableTables)) n += 1\n return n\n }\n\n /** \u5F53\u524D\u89C6\u56FE\u91CC\u4E00\u4E2A\u6280\u80FD\u7684\u5F00\u5173\u503C\uFF08\u5DE5\u4F5C\u533A > \u9884\u8BBE > \u5168\u5C40\uFF09\u3002 */\n const skillEnabledIn = (name: string): boolean => enabledStateAt(scope, name, enableTables)\n\n /** \u6280\u80FD\u5305\u5728\u5F53\u524D\u89C6\u56FE\u4E0B\u7684\u5F00\u5173\u503C\uFF1A\u5185\u90E8\u6280\u80FD\u5168\u5F00\u624D\u7B97\u5F00\u3002 */\n const bundleEnabledIn = (bundle: BundleInfo): boolean =>\n bundle.skills.length > 0 && bundle.skills.every((skill) => skillEnabledIn(skill.name))\n\n /** \u9884\u8BBE\u89C6\u56FE\u4E0B\uFF0C\u88AB\u5168\u5C40\u5C42\u7981\u7528\u7684\u6280\u80FD\u884C\u9501\u4F4F\u5F00\u5173\uFF08\u9884\u8BBE\u5C42\u53EA\u80FD\u6536\u7A84\uFF0C\u65E0\u6CD5\u6253\u5F00\uFF09\u3002 */\n const skillLockedReason = (name: string): string | undefined =>\n scope.level === 'preset' && scope.presetId !== ALL_PRESETS && toggles.skills[name] === false\n ? t('presetLockedByGlobal')\n : undefined\n\n /**\n * \u6E05\u7A7A\u5F53\u524D\u4F5C\u7528\u57DF\u7684\u5168\u90E8\u5355\u72EC\u8BBE\u7F6E\uFF1A\u9884\u8BBE\u7EA7\u6E05 preset \u8D26\uFF0C\u5DE5\u4F5C\u533A\u7EA7\u6309 cwd \u6E05 workspace \u8D26\u3002\n * @param target - \u4E0E\u6309\u94AE\u663E\u793A\u5171\u7528\u7684\u540C\u4E00\u4E2A scope \u5BF9\u8C61\u3002\n */\n const resetScope = (target: SkillEnableScope): void => {\n if (target.level === 'workspace') {\n if (target.cwd === null) return\n void runToggle(`reset:workspace:${target.cwd}`, () => skillApi.resetWorkspace(target.cwd!))\n return\n }\n if (target.presetId === ALL_PRESETS) return\n void runToggle(`reset:${target.presetId}`, () => skillApi.resetPreset(target.presetId))\n }\n\n // \u300C\u5E94\u7528\u5230\u6240\u6709\u9884\u8BBE\u300D\uFF1A\u628A\u300C\u5168\u90E8\u300D\u89C6\u56FE\u7684\u6280\u80FD\u542F\u505C\u8986\u76D6\u5230\u6BCF\u4E2A\u9884\u8BBE\uFF08\u6E05\u7A7A\u5404\u9884\u8BBE per-preset \u8986\u76D6\uFF0C\u4EE4\u5176\u5168\u90E8\u7EE7\u627F\u5168\u90E8/\u5168\u5C40\uFF09\u3002\n const applySkillsToAllPresets = async (): Promise<void> => {\n if (!window.confirm(t('applyAllConfirm'))) return\n try {\n const status = await skillApi.presetStatus()\n const ids = status.presets.map((p) => p.id)\n for (const id of ids) { await skillApi.resetPreset(id) }\n refreshTogglesOnly()\n pushToast('ok', t('applyAllOk', { n: ids.length }))\n } catch (error) {\n pushToast('err', `${t('applyAll')}\uFF1A${error instanceof Error ? error.message : String(error)}`)\n }\n }\n // \u300C\u5E94\u7528\u5230\u6240\u6709\u9884\u8BBE\u300D\uFF1A\u628A MCP \u7684\u6309\u9884\u8BBE\u5DE5\u5177\u914D\u7F6E\u8986\u76D6\u4E3A\u300C\u5168\u90E8/\u5168\u5C40\u300D\uFF08\u6E05\u7A7A\u5404\u9884\u8BBE masks + \u5DE5\u5177\u7EA7\u542F\u505C\u8986\u76D6\uFF09\u3002\u5DE5\u4F5C\u533A\u4E0D\u53D7\u5F71\u54CD\u3002\n const applyMcpToAllPresets = async (): Promise<void> => {\n if (!window.confirm(t('mcpApplyAllConfirm'))) return\n try {\n const res = await fetch('/api/triad/mcp-apply-all', { method: 'POST', headers: { accept: 'application/json' } })\n const body = await res.json().catch(() => null) as { ok?: boolean; error?: string; clearedMasks?: number; clearedTools?: number } | null\n if (!(res.ok && body?.ok === true)) throw new Error(body?.error ?? String(res.status))\n mcpRefreshLive()\n pushToast('ok', t('mcpApplyAllOk', { masks: body.clearedMasks ?? 0, tools: body.clearedTools ?? 0 }))\n } catch (error) {\n pushToast('err', `${t('mcpApplyAll')}\uFF1A${error instanceof Error ? error.message : String(error)}`)\n }\n }\n\n const toggleExpanded = (bundleId: string): void => {\n setExpanded((current) => {\n const next = new Set(current)\n if (next.has(bundleId)) next.delete(bundleId)\n else next.add(bundleId)\n return next\n })\n }\n\n // Skills Hub \u9ED8\u8BA4\u5168\u5C55\u5F00\uFF08\u53C2\u8003\u56FE\u6574\u9875\u53EF\u89C1\uFF09\uFF1B\u7528\u6237\u624B\u52A8\u6536\u8D77\u540E\u4FDD\u6301\u5404\u81EA\u72B6\u6001\u3002\n\n const loadViewerContent = async (skillName: string, filePath: string): Promise<void> => {\n try {\n const res = await fetch(`/api/skill-manager/skills/${encodeURIComponent(skillName)}/files/${encodeURIComponent(filePath)}`)\n const body = await res.json() as { error?: unknown; content?: unknown }\n if (body.error !== undefined) throw new Error(String(body.error))\n setViewer((v) => v === null ? v : { ...v, loading: false, content: (body.content ?? '') as string })\n } catch (error) {\n setViewer((v) => v === null ? v : { ...v, loading: false, error: error instanceof Error ? error.message : String(error) })\n }\n }\n\n const openViewer = (skill: SkillInfo): void => {\n setViewer({ skill, file: 'SKILL.md', loading: true })\n void loadViewerContent(skill.name, 'SKILL.md')\n }\n\n /** \u5207\u5B57\u53F7\u6863\u4F4D\uFF08\u5939\u5230\u5408\u6CD5\u533A\u95F4\uFF09\u3002 */\n const setViewerFontLevel = (level: number): void => {\n setViewerFont(Math.min(Math.max(level, 0), VIEWER_FONT_SIZES.length - 1))\n }\n\n /** \u5168\u5C4F / \u8FD8\u539F\uFF1A\u5F39\u7A97\u5BBD\u9AD8\u8D70 CSS \u8FC7\u6E21\uFF0C\u4E0D\u91CD\u6302\u5185\u5BB9\uFF0C\u6EDA\u52A8\u4F4D\u7F6E\u4FDD\u6301\u3002 */\n const toggleViewerFull = (): void => {\n setViewerFull((current) => !current)\n }\n\n // \u504F\u597D\u7EDF\u4E00\u5728\u8FD9\u91CC\u843D\u76D8\uFF1A\u8FDE\u70B9\u4E24\u4E2A\u63A7\u4EF6\u65F6\uFF0C\u4E8B\u4EF6\u56DE\u8C03\u8BFB\u5230\u7684\u662F\u540C\u4E00\u5E27\u7684\u65E7\u95ED\u5305\u503C\uFF0C\n // \u5206\u5F00\u5199\u4F1A\u628A\u5176\u4E2D\u4E00\u9879\u5B58\u6210\u65E7\u503C\u3002\n useEffect(() => { writeViewerPrefs({ font: viewerFont, full: viewerFull }) }, [viewerFont, viewerFull])\n\n const selectViewerFile = (filePath: string): void => {\n if (viewer === null) return\n setViewer({ ...viewer, file: filePath, loading: true, error: undefined })\n void loadViewerContent(viewer.skill.name, filePath)\n }\n\n const doAssign = async (skill: SkillInfo, bundleId: string): Promise<void> => {\n try {\n if (state.status !== 'ready') return\n const bundle = state.snapshot.bundles.find((candidate) => candidate.id === bundleId)\n if (bundle === undefined) throw new Error('bundle not found')\n await skillApi.setBundleSkills(bundleId, [...bundle.skills.map((s) => s.name), skill.name])\n setAssignTarget(null)\n pushToast('ok', skillT('assignOk', { name: skill.name }))\n refresh()\n } catch (error) {\n failToast('\u5F52\u5165\u6280\u80FD\u5305', error)\n }\n }\n\n const acceptFiles = (files: File[] | null): void => {\n if (files === null || files.length === 0) return\n const collected: CollectedFile[] = []\n for (const file of files) {\n const relative = file.webkitRelativePath\n if (relative === '') continue\n const parts = relative.split('/')\n if (parts.length < 2) continue\n collected.push({ path: parts.slice(1).join('/'), file })\n }\n if (collected.length === 0) return\n const zipCandidate = collected.length === 1 && collected[0].path.toLowerCase().endsWith('.zip') ? collected[0] : undefined\n if (zipCandidate !== undefined) {\n const reader = new FileReader()\n reader.onload = () => {\n const data = String(reader.result ?? '').split(',')[1] ?? ''\n setInstall({ archive: true, name: zipCandidate.path, data, folderName: zipCandidate.path })\n setInstallError(null)\n setAddOpen(true)\n }\n reader.readAsDataURL(zipCandidate.file)\n return\n }\n const rootName = collected[0]?.path.split('/')[0] ?? ''\n setInstallName(rootName)\n setInstallError(null)\n setInstall({ files: collected, folderName: rootName })\n setAddOpen(true)\n }\n\n const onDrop = async (event: DragEvent<HTMLDivElement>): Promise<void> => {\n event.preventDefault()\n setDropActive(false)\n const collected: CollectedFile[] = []\n const items = event.dataTransfer.items\n if (items === undefined) return\n const pending: Array<Promise<void>> = []\n for (const item of Array.from(items)) {\n const entry = item.webkitGetAsEntry?.()\n if (entry !== undefined && entry !== null) pending.push(collectEntry(entry, '', collected))\n }\n await Promise.all(pending)\n if (collected.length === 0) return\n const zipCandidate = collected.length === 1 && collected[0].path.toLowerCase().endsWith('.zip') ? collected[0] : undefined\n if (zipCandidate !== undefined) {\n setInstall({ archive: true, name: zipCandidate.path, data: await fileToBase64(zipCandidate.file), folderName: zipCandidate.path })\n setInstallError(null)\n setAddOpen(true)\n return\n }\n const rootName = collected[0]?.path.split('/')[0] ?? ''\n setInstallName(rootName)\n setInstallError(null)\n setInstall({ files: collected, folderName: rootName })\n setAddOpen(true)\n }\n\n const confirmInstall = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n if (install === null || installing) return\n if (install.archive !== true && installName.trim() === '') return\n setInstalling(true)\n setInstallError(null)\n // \u843D\u70B9\uFF1A\u9ED8\u8BA4\u5168\u5C40\uFF1B\u9009\u5DE5\u4F5C\u533A\u65F6\u5E26\u4E0A\u8DEF\u5F84\uFF08\u5BBF\u4E3B\u4F1A\u521B\u5EFA\u7F3A\u5931\u7684 .agents/skills\uFF09\u3002\n const scopeFields = installScope === 'workspace' && (workspace ?? currentWorkspace) !== null\n ? { scope: 'workspace' as const, workspace: (workspace ?? currentWorkspace)! }\n : {}\n try {\n let installed: { name?: string } = {}\n if (install.archive === true) {\n installed = await skillApi.installSkill({\n archive: install.data,\n description: installDescription.trim(),\n ...installBundleId === undefined ? {} : { bundleId: installBundleId },\n ...scopeFields,\n })\n } else {\n const files = await Promise.all(install.files.map(async ({ path, file }) => ({\n path,\n data: await fileToBase64(file),\n })))\n installed = await skillApi.installSkill({\n skillName: installName.trim(),\n description: installDescription.trim(),\n ...installBundleId === undefined ? {} : { bundleId: installBundleId },\n ...scopeFields,\n files,\n })\n }\n // \u540D\u5B57\u4EE5 host \u843D\u5730\u7684\u89C4\u8303\u540D\u4E3A\u51C6\uFF1A\u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4E0D\u4E00\u81F4\u65F6\uFF0C\u7528\u6237\u770B\u5F97\u5230\u88C5\u6210\u4E86\u4EC0\u4E48\u3002\n pushToast('ok', skillT('installedOk', { name: installed.name ?? installName.trim() }))\n setInstall(null)\n setInstallName('')\n setInstallDescription('')\n setInstallBundleId(undefined)\n setAddOpen(false)\n refresh()\n } catch (error) {\n setInstallError(error instanceof Error ? error.message : String(error))\n } finally {\n setInstalling(false)\n }\n }\n\n const submitNewBundle = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n if (creatingBundle || newBundleName.trim() === '') return\n setCreatingBundle(true)\n try {\n const created = newBundleName.trim()\n await skillApi.createBundle(created, newBundleCats)\n setNewBundleName('')\n setNewBundleCats([])\n setNewBundleOpen(false)\n pushToast('ok', skillT('bundleCreated', { name: created }))\n refresh()\n } catch (error) {\n failToast('\u65B0\u5EFA\u6280\u80FD\u5305', error)\n } finally {\n setCreatingBundle(false)\n }\n }\n\n /** \u6253\u5F00\u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u5F39\u7A97\uFF1A\u8349\u7A3F\u4ECE\u5FEB\u7167\u91CC\u7684\u5F53\u524D\u503C\u8D77\u6B65\u3002 */\n const openCatEditor = (bundle: BundleInfo): void => {\n setCatTarget({ bundleId: bundle.id, name: bundle.name })\n setCatDraft([...(bundle.categories ?? [])])\n }\n\n /** \u4FDD\u5B58\u5206\u7C7B\uFF1APATCH \u53EA\u5E26 categories\uFF1B\u987A\u624B\u628A\u7B5B\u9009\u8DDF\u5230\u65B0\u503C\uFF0C\u907F\u514D\u6539\u5B8C\u5305\u300C\u6D88\u5931\u300D\u3002 */\n const submitCategories = async (): Promise<void> => {\n if (catTarget === null || savingCats) return\n setSavingCats(true)\n try {\n await skillApi.setBundleCategories(catTarget.bundleId, catDraft)\n if (activeCat !== null && !catDraft.includes(activeCat) && activeCat !== UNCATEGORIZED) setCatFilter(null)\n pushToast('ok', skillT('bundleCatSaved', { name: catTarget.name }))\n setCatTarget(null)\n refresh()\n } catch (error) {\n failToast('\u8BBE\u7F6E\u5206\u7C7B', error)\n } finally {\n setSavingCats(false)\n }\n }\n\n const submitRename = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n\n event.preventDefault()\n if (renaming || renameTarget === null || renameTarget.name.trim() === '') return\n setRenaming(true)\n try {\n await skillApi.renameBundle(renameTarget.bundleId, renameTarget.name.trim())\n // \u6539\u540D\u6210\u529F\u540E\u8BA9\u5361\u7247\u95EA\u4E00\u4E0B\u9AD8\u4EAE\uFF081600ms \u540E\u81EA\u52A8\u6E05\u9664\uFF09\u3002\n const renamedId = renameTarget.bundleId\n if (renamedTimer.current !== null) window.clearTimeout(renamedTimer.current)\n setRenamedFlash(renamedId)\n renamedTimer.current = window.setTimeout(() => { setRenamedFlash(null) }, 1600)\n setRenameTarget(null)\n refresh()\n } catch (error) {\n failToast('\u91CD\u547D\u540D\u6280\u80FD\u5305', error)\n } finally {\n setRenaming(false)\n }\n }\n\n const confirmDelete = async (): Promise<void> => {\n if (confirm === null || confirming) return\n setConfirming(true)\n const label = confirm.kind === 'bundle' ? confirm.bundle.name : confirm.name\n try {\n if (confirm.kind === 'bundle') await skillApi.deleteBundle(confirm.bundle.id)\n else await skillApi.deleteSkill(confirm.name)\n setConfirm(null)\n pushToast('ok', confirm.kind === 'bundle'\n ? skillT('bundleDeleted', { name: label })\n : skillT('deletedOk', { name: label }))\n refresh()\n } catch (error) {\n // \u65E7\u5B9E\u73B0\u628A\u5931\u8D25\u5199\u8FDB\u53EA\u5728\u5B89\u88C5\u5F39\u7A97\u91CC\u6E32\u67D3\u7684 installError\uFF1A\u5220\u9664\u5931\u8D25\u65F6\u9762\u677F\u4E0A\u6BEB\u65E0\u53CD\u5E94\u3002\n failToast(confirm.kind === 'bundle' ? '\u5220\u9664\u6280\u80FD\u5305' : '\u5220\u9664\u6280\u80FD', error)\n } finally {\n setConfirming(false)\n }\n }\n\n const removeFromBundle = async (bundleId: string, name: string): Promise<void> => {\n try {\n if (state.status !== 'ready') return\n const bundle = state.snapshot.bundles.find((candidate) => candidate.id === bundleId)\n if (bundle === undefined) return\n await skillApi.setBundleSkills(bundleId, bundle.skills.map((skill) => skill.name).filter((skillName) => skillName !== name))\n pushToast('ok', skillT('removedOk', { name }))\n refresh()\n } catch (error) {\n failToast('\u79FB\u51FA\u6280\u80FD\u5305', error)\n }\n }\n\n /** \u6E05\u7406\u8D26\u672C\u91CC\u6307\u5411\u5DF2\u5220\u9664\u6280\u80FD\u7684\u6761\u76EE\uFF08\u6280\u80FD\u5305\u663E\u793A\u300CN \u4E2A\u5931\u6548\u5F15\u7528\u300D\u65F6\u7528\uFF09\u3002 */\n const pruneBundle = async (bundle: BundleInfo): Promise<void> => {\n try {\n // \u5FC5\u987B\u56DE\u5230\u672A\u8FC7\u6EE4\u7684\u5FEB\u7167\u53D6\u6210\u5458\uFF1A\u89C6\u56FE\u91CC\u7684 bundle \u53EF\u80FD\u5DF2\u88AB\u641C\u7D22/\u72B6\u6001\u7B5B\u9009\u88C1\u6389\u8FC7\u3002\n const full = state.status === 'ready'\n ? (state.snapshot.bundles.find((candidate) => candidate.id === bundle.id) ?? bundle)\n : bundle\n await skillApi.setBundleSkills(bundle.id, full.skills.map((skill) => skill.name))\n pushToast('ok', skillT('pruned'))\n refresh()\n } catch (error) {\n failToast('\u6E05\u7406\u5931\u6548\u5F15\u7528', error)\n }\n }\n\n /** \u4ECE\u7A7A\u6280\u80FD\u5305\u7684\u5F15\u5BFC\u6309\u94AE\u76F4\u63A5\u8FDB\u5165\u300C\u6DFB\u52A0\u6280\u80FD\u300D\uFF0C\u5E76\u628A\u5F52\u7EC4\u9884\u9009\u6210\u5B83\u3002 */\n const openInstallFor = (bundleId: string): void => {\n setInstall(null)\n setInstallError(null)\n setInstallBundleId(bundleId)\n setAddOpen(true)\n }\n\n const bundles = state.status === 'ready' ? state.snapshot.bundles : []\n const loose = state.status === 'ready' ? state.snapshot.loose : []\n /** \u5F53\u524D\u4F5C\u7528\u57DF pill \u6587\u6848\uFF1A\u5DE5\u4F5C\u533A\u7EA7 = \u5DE5\u4F5C\u533A\uFF0C\u9884\u8BBE\u7EA7 = \u5168\u5C40 / \u9884\u8BBE\u540D\u3002 */\n const scopeLabel = level === 'workspace'\n ? t('scopeWorkspace')\n : activePreset === ALL_PRESETS\n ? t('scopeAll')\n : (presets.find((preset) => preset.id === activePreset)?.name ?? activePreset)\n\n /* \u2500\u2500 Skills Hub \u6D3E\u751F\u6570\u636E\uFF1A\u641C\u7D22 / Agent \u9884\u8BBE / \u72B6\u6001 / \u6392\u5E8F \u2500\u2500 */\n const q = query.trim().toLowerCase()\n const qMatch = (skill: SkillInfo): boolean => {\n if (q === '') return true\n if (skill.name.toLowerCase().includes(q)) return true\n return (skill.description ?? '').toLowerCase().includes(q)\n }\n const statusMatch = (skill: SkillInfo): boolean => {\n // \u300C\u5168\u90E8\u300D= \u4E0D\u5206\u542F\u7528\u72B6\u6001\u4E00\u5F8B\u663E\u793A\u3002\u65E7\u5B9E\u73B0\u5728\u8FD9\u91CC\u4E5F return on\uFF0C\u4E8E\u662F\u6280\u80FD\u4E00\u5173\u5361\u7247\u5C31\n // \u5F53\u573A\u4ECE\u5217\u8868\u91CC\u6D88\u5931\uFF0C\u60F3\u518D\u6253\u5F00\u53EA\u80FD\u5207\u5230\u300C\u5DF2\u505C\u7528\u300D\u6863\u53BB\u635E \u2014\u2014 \u5173\u6389\u5373\u9690\u8EAB\u3002\n if (statusFilter === 'all') return true\n // \u542F\u7528\u6001\u6309\u5F53\u524D scope \u8BA1\u7B97\uFF08\u5DE5\u4F5C\u533A > \u9884\u8BBE > \u5168\u5C40\uFF09\uFF0C\u4E0E\u5361\u7247\u5F00\u5173\u540C\u4E00\u89C4\u5219\u3002\n const on = enabledStateAt(scope, skill.name, enableTables)\n return statusFilter === 'on' ? on : !on\n }\n const sortedSkills = (list: SkillInfo[]): SkillInfo[] => [...list].sort((a, b) => {\n const order = a.name.localeCompare(b.name)\n return sortAsc ? order : -order\n })\n const filteredSkills = (list: SkillInfo[]): SkillInfo[] =>\n sortedSkills(list.filter((skill) =>\n qMatch(skill)\n && statusMatch(skill)))\n /**\n * \u5168\u91CF\u7B5B\u9009\u7ED3\u679C\uFF08\u6279\u91CF\u64CD\u4F5C\u4F5C\u7528\u4E8E\u5168\u90E8\uFF09\u3002\n * \u7A7A\u6280\u80FD\u5305\u5FC5\u987B\u7559\u5728\u5217\u8868\u91CC\uFF1A\u65E7\u5B9E\u73B0\u4E00\u5F8B filter(skills.length > 0)\uFF0C\u4E8E\u662F\u65B0\u5EFA\u7684\u5305\u3001\n * \u4EE5\u53CA\u8D26\u672C\u6309\u76EE\u5F55\u540D\u8BB0\u8D26\u5BFC\u81F4\u6210\u5458\u89E3\u6790\u4E0D\u5230\u7684\u5305\uFF0C\u90FD\u4F1A\u4ECE\u9762\u677F\u4E0A\u51ED\u7A7A\u6D88\u5931 \u2014\u2014 \u65E2\u770B\u4E0D\u5230\n * \u4E5F\u70B9\u4E0D\u5230\uFF0C\u6CA1\u6CD5\u518D\u5F80\u91CC\u5F52\u6280\u80FD\u3002\u53EA\u6709\u771F\u6B63\u5E26\u7B5B\u9009\u6761\u4EF6\u65F6\u624D\u6309\u547D\u4E2D\u60C5\u51B5\u9690\u85CF\u3002\n */\n const filtering = q !== '' || statusFilter !== 'all'\n /**\n * \u5206\u7C7B\u7D22\u5F15\uFF1A\u5206\u7C7B\u540D \u2192 \u6302\u4E86\u5B83\u7684\u6280\u80FD\u5305\u6570\uFF1B\u6CA1\u6302\u4EFB\u4F55\u5206\u7C7B\u7684\u5305\u5F52\u5230 UNCATEGORIZED \u6876\u3002\n * \u9876\u680F\u80F6\u56CA\u4E0E\u5305\u540D\u65C1\u7684\u6807\u7B7E\u90FD\u4ECE\u8FD9\u91CC\u53D6\u6570\uFF0C\u6240\u4EE5\u4E24\u8FB9\u53E3\u5F84\u5929\u7136\u4E00\u81F4\u3002\n */\n const categoryCounts = (() => {\n const counts = new Map<string, number>()\n for (const bundle of bundles) {\n const cats = bundle.categories ?? []\n if (cats.length === 0) {\n counts.set(UNCATEGORIZED, (counts.get(UNCATEGORIZED) ?? 0) + 1)\n continue\n }\n for (const cat of cats) counts.set(cat, (counts.get(cat) ?? 0) + 1)\n }\n return counts\n })()\n const categoryList = sortCategories(categoryCounts)\n /** \u5206\u7C7B\u5019\u9009\u53EA\u4ECE\u73B0\u6709\u6280\u80FD\u5305\u6D3E\u751F\uFF08\u4E0D\u518D\u5185\u7F6E\u4E00\u7EC4\u5199\u6B7B\u7684\u4E2D\u6587\u5206\u7C7B\uFF09\u3002 */\n const categorySuggestions = categoryList.filter((cat) => cat !== UNCATEGORIZED)\n /** \u81F3\u5C11\u8981\u6709\u4E00\u4E2A\u771F\u5206\u7C7B\uFF08\u672A\u5206\u7C7B\u6876\u4E0D\u7B97\uFF09\u624D\u503C\u5F97\u5360\u4E00\u884C\u9876\u680F\u7A7A\u95F4\u3002 */\n const hasCategories = categoryList.some((cat) => cat !== UNCATEGORIZED)\n /** \u9009\u4E2D\u7684\u5206\u7C7B\u88AB\u6700\u540E\u4E00\u4E2A\u5305\u6458\u6389\u65F6\u81EA\u52A8\u56DE\u843D\u300C\u5168\u90E8\u300D\uFF0C\u4E0D\u7559\u4E00\u4E2A\u7B5B\u4E0D\u51FA\u4E1C\u897F\u7684\u6B7B\u72B6\u6001\u3002 */\n const activeCat = catFilter !== null && categoryCounts.has(catFilter) ? catFilter : null\n const catMatch = (bundle: BundleInfo): boolean => {\n if (activeCat === null) return true\n const cats = bundle.categories ?? []\n return activeCat === UNCATEGORIZED ? cats.length === 0 : cats.includes(activeCat)\n }\n const visibleBundleAll = (sourceFilter === 'loose' ? [] : bundles)\n .filter((bundle) => catMatch(bundle))\n .map((bundle) => ({ ...bundle, skills: filteredSkills(bundle.skills) }))\n .filter((bundle) => bundleVisibleInList(bundle, filtering))\n const visibleLooseAll = sourceFilter === 'bundles' || activeCat !== null ? [] : filteredSkills(loose)\n /** \u5B9E\u9645\u6E32\u67D3\u96C6\u5408\u7684\u6280\u80FD\u6570\uFF1A\u4E0D\u542B\u8D26\u672C\u91CC\u5DF2\u5931\u6548\u7684\u5F15\u7528\u3002 */\n const allSkills = [...bundles.flatMap((bundle) => bundle.skills), ...loose]\n const totalSkills = allSkills.length\n const bundleCount = bundles.length\n /** \u540C\u6B65\u72B6\u6001\u5361\u5C55\u793A\u6A21\u578B\uFF1Aok=\u7EFF\u70B9\u5168\u5065\u5EB7\uFF1Bissue=\u6A59\u70B9\u5E26\u6570\u91CF\uFF1Bunavailable=\u7070\u70B9\u5F85\u68C0\u6D4B\uFF08\u65E7 host \u672A\u52A0\u8F7D\u65B0\u8DEF\u7531\uFF09\uFF1Bloading=\u68C0\u6D4B\u4E2D\u3002 */\n const healthView = health.state === 'ok'\n ? { tone: 'ok', label: t('statHealthy'), title: t('statHealthy') }\n : health.state === 'issue'\n ? { tone: 'warn', label: t('statIssues', { n: health.report.issues.length }), title: health.report.issues.map((issue) => issue.message).join('\\n') }\n : health.state === 'unavailable'\n ? { tone: 'pending', label: t('statPending'), title: t('statPending') }\n : { tone: 'idle', label: t('statChecking'), title: '' }\n const enabledCount = allSkills.filter((skill) => enabledStateAt(scope, skill.name, enableTables)).length\n /** \u5F53\u524D\u4F5C\u7528\u57DF\u4E0B\u505C\u7528\u7684\u6280\u80FD\u6570\uFF08\u9876\u680F\u300C\u5DF2\u505C\u7528\u300D\u8BA1\u6570\uFF1B\u4E0E\u300C\u5DF2\u542F\u7528\u300D\u540C\u4E00\u53E3\u5F84\uFF09\u3002 */\n const disabledCount = allSkills.length - enabledCount\n const noResults = visibleBundleAll.length === 0 && visibleLooseAll.length === 0\n\n const trimmedName = installName.trim()\n const nameInvalid = trimmedName !== '' && !SKILL_NAME_PATTERN.test(trimmedName)\n\n const confirmTitle = confirm === null\n ? t('deleteSkillConfirm', { name: '' })\n : confirm.kind === 'bundle'\n ? t('deleteBundleConfirm', { name: confirm.bundle.name })\n : t('deleteSkillConfirm', { name: confirm.name })\n // \u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4E0D\u4E00\u81F4\u65F6\u8BF4\u660E\u767D\uFF1A\u5220\u7684\u662F\u90A3\u4E2A\u76EE\u5F55\uFF0C\u907F\u514D\u7528\u6237\u4EE5\u4E3A\u5220\u9519\u4E1C\u897F\u3002\n + (confirm.kind === 'skill' && confirm.dir !== undefined && confirm.dir !== confirm.name\n ? t('deleteSkillDirNote', { dir: confirm.dir }) : '')\n\n return (\n <PopoverShell\n solid\n closing={closing}\n onClose={() => {\n // \u5B89\u88C5/\u786E\u8BA4\u8FDB\u884C\u4E2D\u7981\u6B62\u5173\u95ED\uFF1B\u4E8C\u7EA7\u5F39\u7A97\uFF08\u65B0\u5EFA/\u6DFB\u52A0/\u786E\u8BA4/\u67E5\u770B\u5668/\u5F52\u7EC4\uFF09\u6253\u5F00\u65F6 Esc \u5F52\u4E8C\u7EA7\u5F39\u7A97\u3002\n if (installing || confirming) return\n if (newBundleOpen || addOpen || confirm !== null || viewer !== null || assignTarget !== null || catTarget !== null) return\n onClose()\n }}\n anchor={anchor}\n onCardMouseEnter={onCardMouseEnter}\n onCardMouseLeave={onCardMouseLeave}\n size={{ width: 1150, height: 860 }}\n ariaLabel={t('panelTitle')}\n >\n {/* \u5934\u90E8\uFF1A\u6807\u9898\uFF08\u80FD\u529B\u7BA1\u7406\uFF09+ \u7D27\u8D34\u6587\u5B57\u53F3\u4FA7\u7684 SKILL/MCP \u9876\u5C42 tab + \u5173\u95ED */}\n <PanelHead\n t={t}\n kind={kind}\n onKind={setKind}\n level={level}\n onLevel={setLevel}\n workspaces={workspaces}\n workspaceValue={workspace}\n onWorkspace={setWorkspace}\n openMenu={openMenu}\n setOpenMenu={setOpenMenu}\n />\n <PshBody className={css.modalBody}>\n <span data-skm-panel-marker aria-hidden=\"true\" style={{ display: 'none' }} />\n <div className={css.hub} aria-busy={state.status === 'loading'}>\n {/* \u2500\u2500 \u9876\u680F\uFF08\u4EC5 SKILL \u89C6\u56FE\uFF09\uFF1A\u9884\u8BBE chips + \u5FEB\u6377\u7B5B\u9009 + \u65B0\u5EFA/\u6DFB\u52A0/\u6307\u5357 \u2500\u2500 */}\n {kind === 'skill' && (\n <SkillTopBar\n t={t}\n dropActive={dropActive}\n setDropActive={setDropActive}\n onDrop={onDrop}\n activePreset={activePreset}\n setActivePreset={setActivePreset}\n presets={presets}\n overrides={level === 'workspace' ? {} : overrides}\n enabledCountFor={enabledCountFor}\n totalSkills={totalSkills}\n enabledCount={enabledCount}\n disabledCount={disabledCount}\n healthView={healthView}\n hasCategories={hasCategories}\n activeCat={activeCat}\n setCatFilter={setCatFilter}\n categoryList={categoryList}\n categoryCounts={categoryCounts}\n bundleCount={bundleCount}\n statusFilter={statusFilter}\n setStatusFilter={setStatusFilter}\n query={query}\n setQuery={setQuery}\n openMenu={openMenu}\n setOpenMenu={setOpenMenu}\n sortAsc={sortAsc}\n setSortAsc={setSortAsc}\n newBundleOpen={newBundleOpen}\n onNewBundle={() => { setNewBundleOpen(true) }}\n onAdd={() => { setInstall(null); setInstallError(null); setAddOpen(true) }}\n onRefresh={refresh}\n fileInput={fileInput}\n acceptFiles={acceptFiles}\n />\n )}\n {/* \u2500\u2500 \u9876\u680F\uFF08MCP \u89C6\u56FE\uFF09\uFF1A\u4E0E\u6280\u80FD\u9875\u540C\u6784\u7684\u9884\u8BBE chips + \u72B6\u6001\u5206\u6BB5 \u2500\u2500 */}\n {kind === 'mcp' && (\n <McpTopBar\n t={t}\n live={mcpLive}\n scope={mcpScope}\n onScope={setMcpScope}\n status={mcpStatusFilter}\n onStatus={setMcpStatusFilter}\n query={mcpQuery}\n onQuery={setMcpQuery}\n onRefresh={() => { mcpRefreshLive() }}\n onAddOwn={() => { setMcpAddOwnOpen(true) }}\n onAddCustom={() => { setMcpAddOpen(true) }}\n workspace={effectiveWorkspace}\n level={level}\n />\n )}\n\n {/* \u2500\u2500 \u4E3B\u533A \u2500\u2500 */}\n <div className={css.hubMain}>\n {kind === 'skill' && level === 'preset' && activePreset === ALL_PRESETS ? (\n <div style={{ padding: '4px 12px 0' }}>\n <button type=\"button\" className={css.toolButton} title={t('applyAllHint')} onClick={() => { void applySkillsToAllPresets() }}>{t('applyAll')}</button>\n </div>\n ) : null}\n {kind === 'mcp' && level === 'preset' && mcpScope === '' ? (\n <div style={{ padding: '4px 12px 0' }}>\n <button type=\"button\" className={css.toolButton} title={t('mcpApplyAllHint')} onClick={() => { void applyMcpToAllPresets() }}>{t('mcpApplyAll')}</button>\n </div>\n ) : null}\n {kind === 'prompt' ? (\n <PromptView />\n ) : kind === 'mcp' ? (\n <McpView\n t={t}\n live={mcpLive}\n scope={mcpScope}\n query={mcpQuery}\n status={mcpStatusFilter}\n onRefresh={() => { mcpRefreshLive() }}\n waitingTools={mcpWaitingTools}\n onWatchTools={(names) => { watchMcpTools(names) }}\n addOwnOpen={mcpAddOwnOpen}\n onCloseAddOwn={() => { setMcpAddOwnOpen(false) }}\n workspace={effectiveWorkspace}\n level={level}\n />\n ) : (\n <SkillsView\n t={t}\n state={state}\n health={health}\n scope={scope}\n scopeOverrideCount={scopeOverrideCount}\n presets={presets}\n onResetScope={resetScope}\n openMenu={openMenu}\n setOpenMenu={setOpenMenu}\n refresh={refresh}\n noResults={noResults}\n visibleBundleAll={visibleBundleAll}\n expanded={expanded}\n renameTarget={renameTarget}\n setRenameTarget={setRenameTarget}\n renaming={renaming}\n submitRename={submitRename}\n bundleEnabledIn={bundleEnabledIn}\n toggling={toggling}\n setCatFilter={setCatFilter}\n activeCat={activeCat}\n toggleExpanded={toggleExpanded}\n renamedFlash={renamedFlash}\n openInstallFor={openInstallFor}\n skillEnabledIn={skillEnabledIn}\n skillLockedReason={skillLockedReason}\n scopeLabel={scopeLabel}\n toggleSkill={toggleSkill}\n toggleBundle={toggleBundle}\n openViewer={openViewer}\n removeFromBundle={removeFromBundle}\n pruneBundle={pruneBundle}\n openCatEditor={openCatEditor}\n setConfirm={setConfirm}\n setAssignTarget={setAssignTarget}\n looseOpen={looseOpen}\n setLooseExpanded={setLooseExpanded}\n visibleLooseAll={visibleLooseAll}\n />\n )}\n </div>\n </div>\n </PshBody>\n {/* \u64CD\u4F5C\u56DE\u6267\uFF1A\u5B89\u88C5/\u5220\u9664/\u5F52\u7EC4/\u5F00\u5173\u7684\u6210\u8D25\u90FD\u4ECE\u8FD9\u91CC\u5192\u51FA\u6765\uFF08\u9762\u677F\u53F3\u4E0B\u89D2\uFF0C\u81EA\u52A8\u6536\u8D77\uFF09 */}\n {toasts.length > 0 && (\n <div className={css.toastStack} role=\"status\" aria-live=\"polite\">\n {toasts.map((item) => (\n <span key={item.id} className={`${css.toast} ${item.tone === 'err' ? css.toastErr : css.toastOk}`} data-tone={item.tone}>\n <i className={css.toastDot} aria-hidden=\"true\" />\n {item.text}\n </span>\n ))}\n </div>\n )}\n {/* \u5FEB\u901F\u4E0A\u624B\u6307\u5357 / MCP \u89E3\u91CA\uFF1A\u9762\u677F\u53F3\u4FA7\u60AC\u6D6E\u5361\uFF08portal \u5230 body\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09 */}\n {guideOpen && guidePos !== null && (\n <GuidePanel t={t} onClose={() => { setGuideOpen(false) }} left={guidePos.left} top={guidePos.top} height={guidePos.height} />\n )}\n\n <McpAddModal\n t={t}\n open={mcpAddOpen}\n onClose={() => { setMcpAddOpen(false) }}\n onAdded={(added) => { watchMcpTools(added) }}\n />\n\n {/* \u65B0\u5EFA\u6280\u80FD\u5305\u5F39\u7A97\uFF1A\u540D\u5B57\u4E0E\u5206\u7C7B\u4E00\u8D77\u7ED9\uFF0C\u7701\u5F97\u5EFA\u5B8C\u518D\u8FDB\u53BB\u8BBE\u7F6E\u4E00\u6B21\u3002 */}\n <Modal\n open={newBundleOpen}\n onClose={() => { if (!creatingBundle) { setNewBundleOpen(false); setNewBundleCats([]) } }}\n closeLabel={t('close')}\n title={t('newBundle')}\n >\n <form className={css.stackForm} onSubmit={(event) => { void submitNewBundle(event) }}>\n <input className={css.inlineInput} value={newBundleName} placeholder={t('newBundlePlaceholder')}\n aria-label={t('newBundlePlaceholder')} autoFocus disabled={creatingBundle}\n onChange={(event) => { setNewBundleName(event.currentTarget.value) }} />\n <CategoryEditor value={newBundleCats} onChange={setNewBundleCats} label={t('newBundle')} suggestions={categorySuggestions} />\n <div className={css.inlineForm}>\n <Button variant=\"primary\" type=\"submit\" disabled={creatingBundle || newBundleName.trim() === ''}>{t('create')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={creatingBundle} onClick={() => { setNewBundleOpen(false); setNewBundleCats([]) }}>{t('cancel')}</Button>\n </div>\n </form>\n </Modal>\n\n {/* \u8BBE\u7F6E\u5206\u7C7B\u5F39\u7A97\uFF1A\u4E0E\u65B0\u5EFA\u5305\u5171\u7528\u540C\u4E00\u4E2A CategoryEditor\uFF0C\u503C\u8D70\u8349\u7A3F\u6001\uFF0C\u4FDD\u5B58\u624D\u843D\u76D8\u3002 */}\n <Modal\n open={catTarget !== null}\n onClose={() => { if (!savingCats) setCatTarget(null) }}\n closeLabel={t('close')}\n title={t('bundleCatEditTitle', { name: catTarget?.name ?? '' })}\n >\n <div className={css.stackForm}>\n <CategoryEditor value={catDraft} onChange={setCatDraft} label={t('bundleCatEdit')} suggestions={categorySuggestions} />\n <div className={css.inlineForm}>\n <Button variant=\"primary\" type=\"button\" disabled={savingCats} onClick={() => { void submitCategories() }}>{t('bundleCatDone')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={savingCats} onClick={() => { setCatTarget(null) }}>{t('cancel')}</Button>\n </div>\n </div>\n </Modal>\n\n {/* \u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\uFF1A\u5148\u62D6\u653E/\u6D4F\u89C8\u9009\u6587\u4EF6\uFF0C\u518D\u586B\u8868\u5355\u5B89\u88C5 */}\n <Modal\n open={addOpen}\n onClose={() => {\n if (installing) return\n setAddOpen(false)\n setInstall(null)\n setDropActive(false)\n }}\n closeLabel={t('close')}\n title={t('addSkillsTitle')}\n >\n {install === null ? (\n <div\n className={`${css.addCard} ${dropActive ? css.addCardActive : ''}`}\n role=\"button\"\n tabIndex={0}\n aria-label={t('addSkillsTitle')}\n onClick={() => { fileInput.current?.click() }}\n onDragOver={(event) => { event.preventDefault(); setDropActive(true) }}\n onDragLeave={() => { setDropActive(false) }}\n onDrop={(event) => { void onDrop(event) }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n fileInput.current?.click()\n }\n }}\n >\n <span className={css.addCardHead}>\n <span className={css.addCardIcon}><CloudUpIcon size={22} /></span>\n <span className={css.addCardTitle}>{t('bannerTitle')}</span>\n </span>\n <span className={css.addCardSub}>{t('bannerSub')}</span>\n <span className={css.addDrop}>\n <CloudUpIcon size={18} />\n <span className={css.addDropText}>{t('dropHere')}</span>\n <span className={css.addDropHint}>{t('dropFormat')}</span>\n </span>\n <button type=\"button\" className={css.addBtn} onClick={(event) => { event.stopPropagation(); fileInput.current?.click() }}>\n {t('browseImport')}\n </button>\n <input\n ref={fileInput}\n type=\"file\"\n className={css.hiddenInput}\n multiple\n {...{ webkitdirectory: '' }}\n onChange={(event) => {\n acceptFiles(event.currentTarget.files === null ? null : Array.from(event.currentTarget.files))\n }}\n />\n </div>\n ) : (\n <form className={css.installForm} onSubmit={(event) => { void confirmInstall(event) }}>\n <div className={css.installRow}>\n <input className={css.inlineInput} value={installName}\n placeholder={install.archive === true ? t('installNameFromArchive') : t('installNamePlaceholder')}\n aria-label={t('installName')}\n disabled={installing || install.archive === true}\n onChange={(event) => { setInstallName(event.currentTarget.value) }} />\n <input className={css.inlineInput} value={installDescription} placeholder={t('installDescription')}\n aria-label={t('installDescription')} disabled={installing}\n onChange={(event) => { setInstallDescription(event.currentTarget.value) }} />\n <label className={css.bundleSelect}>\n <span className={css.visuallyHidden}>{t('installBundle')}</span>\n <select value={installBundleId ?? ''} disabled={installing}\n onChange={(event) => { setInstallBundleId(event.currentTarget.value === '' ? undefined : event.currentTarget.value) }}>\n <option value=\"\">{t('installLoose')}</option>\n {bundles.map((bundle) => <option key={bundle.id} value={bundle.id}>{bundle.name}</option>)}\n </select>\n </label>\n {/* \u843D\u70B9\uFF1A\u9ED8\u8BA4\u5168\u5C40\uFF08\u6240\u6709\u5DE5\u4F5C\u533A\u5171\u7528\uFF09\uFF1B\u9009\u5DE5\u4F5C\u533A\u5219\u53EA\u88C5\u8FDB\u8BE5\u5DE5\u4F5C\u533A\u3002 */}\n {(workspace ?? currentWorkspace) !== null && (\n <label className={css.bundleSelect}>\n <span className={css.visuallyHidden}>{t('addScopeLabel')}</span>\n <select value={installScope} disabled={installing}\n onChange={(event) => { setInstallScope(event.currentTarget.value === 'workspace' ? 'workspace' : 'global') }}>\n <option value=\"global\">{t('addScopeGlobal')}</option>\n <option value=\"workspace\">{t('addScopeWorkspace')}</option>\n </select>\n </label>\n )}\n <span className={css.installMeta}>\n {install.archive === true\n ? t('uploadMeta', { n: 1, folder: install.folderName })\n : t('uploadMeta', { n: install.files.length, folder: install.folderName })}\n </span>\n </div>\n {install.archive !== true && nameInvalid && <p className={css.error} role=\"alert\">{t('installNameInvalid')}</p>}\n {install.archive !== true && !nameInvalid && trimmedName !== '' && installMetaName !== null && installMetaName !== trimmedName && (\n <p className={css.installHint}>{t('installNameRewrite', { meta: installMetaName, name: trimmedName })}</p>\n )}\n <div className={css.installActions}>\n <Button variant=\"primary\" type=\"submit\" disabled={installing || (install.archive !== true && (trimmedName === '' || nameInvalid))}>{t('installConfirm')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={installing} onClick={() => { setInstall(null); setAddOpen(false) }}>{t('installCancel')}</Button>\n </div>\n {installError !== null && <p className={css.error} role=\"alert\">{installError}</p>}\n </form>\n )}\n </Modal>\n\n <Modal\n open={confirm !== null}\n onClose={() => {\n if (!confirming) setConfirm(null)\n }}\n closeLabel={t('close')}\n title={confirmTitle}\n footer={\n <>\n <Button variant=\"outline\" disabled={confirming} onClick={() => { setConfirm(null) }}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={confirming} onClick={() => { void confirmDelete() }}>{t('delete')}</Button>\n </>\n }\n />\n\n <SkillViewer\n t={t}\n viewer={viewer}\n viewerFont={viewerFont}\n viewerFull={viewerFull}\n onFontLevel={setViewerFontLevel}\n onToggleFull={toggleViewerFull}\n onSelectFile={selectViewerFile}\n onClose={() => { setViewer(null) }}\n />\n {assignTarget !== null && (\n <Modal\n open\n onClose={() => { setAssignTarget(null) }}\n closeLabel={t('close')}\n title={t('assignTitle', { name: assignTarget.name })}\n className={css.assignModal}\n contentClassName={css.assignModalBody}\n >\n {bundles.length === 0 ? (\n <p className={css.looseEmpty}>{t('assignEmpty')}</p>\n ) : (\n <ul className={css.assignList}>\n {bundles.map((bundle, index) => (\n <li key={bundle.id} style={{ listStyle: 'none' }}>\n <button\n type=\"button\"\n className={css.assignCard}\n style={{ '--skm-i': index } as CSSProperties}\n onClick={() => { void doAssign(assignTarget, bundle.id) }}\n >\n <span className={css.assignCardIcon} aria-hidden=\"true\"><IconFolderOpenOutlineRegular size={16} /></span>\n <span className={css.assignCardBody}>\n <span className={css.assignCardName}>{bundle.name}</span>\n <span className={css.assignCardDesc}>{t('skillsCount', { n: bundle.skillCount })}</span>\n </span>\n <span className={css.assignGo} aria-hidden=\"true\"><IconChevronDownOutlineRegular size={14} /></span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </Modal>\n )}\n </PopoverShell>\n )\n}\n", "/**\n * popover-shell \u2014 \u300C\u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u300D\u9762\u677F\u5916\u58F3\uFF08\u6280\u80FD\u9762\u677F\u7528\uFF09\u3002\n *\n * \u8DDF\u70B9\u4F1A\u8BDD\u4E00\u81F4\u7684\u884C\u4E3A\uFF1A\n * - drawer \u6A21\u5F0F\uFF1A\u76F4\u63A5\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\uFF08\u4FA7\u680F\u53F3\u7F18 \u2192 \u89C6\u53E3\u53F3\u7F18\uFF0C\u5168\u9AD8\uFF0C\u65E0\u906E\u7F69\uFF09\uFF0C\n * \u81EA\u53F3\u5411\u5DE6\u6ED1\u5165\uFF08translateX(56px)\u21920\uFF09\uFF0C\u5173\u95ED\u53CD\u5411\u6536\u56DE\uFF1B\u4FA7\u680F\u4FDD\u6301\u53EF\u70B9\uFF0C\n * \u968F\u65F6\u5207\u4F1A\u8BDD\uFF08\u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\u9762\u677F\uFF09\uFF1B\n * - \u79FB\u52A8\u7AEF\u56DE\u9000\u5168\u5C4F sheet\uFF08translateY(24px) \u4E0A\u6ED1\uFF0C\u540C auto-sheet-in\uFF0C\u5E26\u906E\u7F69\uFF09\uFF1B\n * - Esc \u5173\u95ED\u8D70 props.onClose\uFF08\u9762\u677F\u53EF\u81EA\u884C\u62E6\u622A\uFF09\u3002\n *\n * z \u5C42\u7EA7\uFF1Amask 999 / card 1000\u2014\u2014\u4E0E ui-primitives Modal \u7684 root(1000) \u540C\u5C42\uFF0C\n * \u9762\u677F\u5185\u90E8\u7684 primitives \u4E8C\u7EA7\u5F39\u7A97\uFF08\u5982\u6280\u80FD\u6587\u4EF6\u67E5\u770B\u5668\uFF09portal \u5230 body \u66F4\u9760\u540E\uFF0C\n * DOM \u987A\u5E8F\u53D6\u80DC\u6D6E\u4E8E\u672C\u58F3\u4E4B\u4E0A\u3002\n */\n\nimport { useEffect, useState, type CSSProperties, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { MODAL_ANIM_MS, modalDrawerAnimClass } from './modal-animation.js'\n\nconst STYLE_ID = 'dsh-popover-shell-styles'\n\n/** \u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18\u56DE\u9000\u503C\uFF08px\uFF09\uFF1A\u4FA7\u680F\u5B9E\u6D4B\u5931\u8D25\u65F6\u76D6\u4F4F 280px \u53F3\u4FA7\u5168\u90E8\u533A\u57DF\u3002 */\nconst FALLBACK_MAIN_LEFT = 280\n/** \u7A84\u5C4F\u9608\u503C\uFF08px\uFF09\uFF1A\u4F4E\u4E8E\u8BE5\u5BBD\u5EA6\u56DE\u9000\u5168\u5C4F sheet\uFF08\u4E0E\u79FB\u52A8\u7AEF\u5168\u5C4F\u5A92\u4F53\u67E5\u8BE2\u540C\u503C\uFF09\u3002 */\nconst NARROW_VP = 768\n\n/** \u8BFB\u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18 = \u4FA7\u680F\u5217\u53F3\u7F18\uFF08\u8DDF\u968F\u4FA7\u680F\u6298\u53E0\u53D8\u5316\uFF1B\u5931\u8D25\u56DE\u9000 280\uFF09\u3002 */\nfunction readMainLeft(): number {\n try {\n const host = document.getElementById('dsh-prompt-customizer-nav-host')\n if (host !== null) {\n const hostRight = host.getBoundingClientRect().right\n let node = host.parentElement\n while (node !== null && node !== document.body) {\n const rect = node.getBoundingClientRect()\n if (rect.height >= window.innerHeight * 0.7 && rect.left <= 8 && rect.right >= hostRight - 4) {\n return Math.round(rect.right)\n }\n node = node.parentElement\n }\n }\n } catch { /* \u91CF\u4E0D\u5230\u5C31\u56DE\u9000\u56FA\u5B9A\u503C */ }\n return FALLBACK_MAIN_LEFT\n}\n\nconst SHEET = `\n/* \u2500\u2500 \u906E\u7F69\uFF1A\u6DE1\u5165\u6DE1\u51FA \u2500\u2500 */\n.psh-mask{position:fixed;inset:0;z-index:999;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.45))}\n.psh-mask[data-anim='in']{animation:dsh-modal-mask-in ${MODAL_ANIM_MS}ms ease both}\n.psh-mask[data-anim='out']{animation:dsh-modal-mask-out ${MODAL_ANIM_MS}ms ease both}\n/* \u2500\u2500 \u5361\u7247\uFF1A\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u62BD\u5C49 / \u5E95\u90E8 sheet \u56DE\u9000 \u2500\u2500 */\n.psh-card{position:fixed;z-index:1000;display:flex;flex-direction:column;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));border-radius:14px;background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,#16181d));box-shadow:var(--dsw-shadow-lv3,0 8px 40px rgba(0,0,0,.5));overflow:hidden;transition:width ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1),height ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n/* \u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\uFF1A\u4FA7\u680F\u53F3\u7F18 \u2192 \u89C6\u53E3\u53F3\u7F18\u5168\u9AD8\u5E73\u94FA\uFF0C\u65E0\u5706\u89D2\u65E0\u9634\u5F71\uFF0C\u50CF\u5207\u4E86\u4E2A\u89C6\u56FE */\n.psh-card[data-mode='drawer']{top:0;right:0;bottom:0;height:100vh;height:100dvh;max-height:100vh;max-height:100dvh;border-radius:0;border:none;border-left:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.06));box-shadow:none;transition:left ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n/* in \u52A8\u753B\u4E0D\u5F97\u5E26 fill-mode\uFF08both/forwards \u4F1A\u6B8B\u7559 to \u5E27 transform\uFF0C\u4F7F\u5361\u7247\u6210\u4E3A\n \u540E\u4EE3 position:fixed \u5143\u7D20\uFF08\u56FE\u8868 tooltip\uFF09\u7684\u5305\u542B\u5757\uFF0C\u6D6E\u5C42\u6574\u4F53\u504F\u79FB\uFF09\uFF1Bout \u9700\u8981\n forwards \u4FDD\u6301\u9690\u85CF\u6001\u76F4\u5230\u5378\u8F7D\uFF0C\u6B64\u65F6\u65E0\u4EA4\u4E92\u3001\u65E0\u526F\u4F5C\u7528\u3002 */\n.psh-card[data-mode='drawer'][data-anim='in']{animation:dsh-modal-drawer-in ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n.psh-card[data-mode='drawer'][data-anim='out']{animation:dsh-modal-drawer-out ${MODAL_ANIM_MS}ms cubic-bezier(.4,0,.2,1) both}\n.psh-card[data-mode='sheet']{left:12px !important;right:12px;bottom:12px;top:auto !important}\n/* Windows \u684C\u9762\u7248\uFF1ADSH \u5728 .frame::before \u94FA\u4E86\u4E00\u6761 --dsh-windows-titlebar-height\n \u9AD8\u7684 -webkit-app-region:drag \u62D6\u62FD\u6761\u3002Electron \u7684 app-region \u662F\u51E0\u4F55 + \u6587\u6863\u987A\u5E8F\n \u5408\u6210\u7684\uFF0C\u843D\u5728\u8BE5\u6761\u51E0\u4F55\u5185\u7684\u5143\u7D20\u6536\u4E0D\u5230\u9F20\u6807\u4E8B\u4EF6\uFF1BDSH \u53EA\u5728 darwin \u4E0A\u5199\u4E86\n body > :not(#root){no-drag} \u7684\u653E\u884C\u89C4\u5219\uFF0CWindows \u6CA1\u6709\u7B49\u4EF7\u89C4\u5219\u3002\n \u672C\u9762\u677F portal \u5230 body\u3001drawer \u4ECE top:0 \u8D77\uFF0C\u5934\u90E8\uFF08\u80FD\u529B\u7BA1\u7406 / SKILL / MCP /\n \u63D0\u793A\u8BCD \u90A3\u4E00\u884C\uFF09\u6B63\u597D\u843D\u5728\u62D6\u62FD\u6761\u91CC \u2014\u2014 \u8868\u73B0\u4E3A\u70B9 tab \u5B8C\u5168\u6CA1\u53CD\u5E94\uFF08web \u7248\u65E0\u62D6\u62FD\u6761\uFF0C\n \u6240\u4EE5\u770B\u4E0D\u51FA\u95EE\u9898\uFF09\u3002\u8BA9\u51FA\u8FD9\u6761\u9AD8\u5EA6\u5373\u53EF\uFF1Bweb \u7248\u6CA1\u6709\u8BE5\u53D8\u91CF\uFF0Ccalc \u7ED3\u679C\u4E3A 0\u3002 */\n[data-windows-titlebar] .psh-card{top:var(--dsh-windows-titlebar-height,0px)}\n[data-windows-titlebar] .psh-card[data-mode='drawer']{height:auto;bottom:0}\n/* \u5B9E\u5E95\u5361\u7247\uFF08solid \u6A21\u5F0F\uFF09\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4FDD\u6301\u4E0D\u900F\u660E\u8868\u9762\u3002\n \u4E24\u6761\u5FC5\u8981\u6761\u4EF6\u2014\u2014\n 1) \u5E95\u8272\u5FC5\u987B\u7528 static token\uFF08bg-layer-* \u7B49 alias \u5728\u73BB\u7483\u6A21\u5F0F\u4E0B\u88AB\n overrideTokens \u6362\u6210 rgba\uFF0C\u7528\u5B83\u4EEC\u4ECD\u7136\u900F\uFF09\uFF1B\n 2) \u9009\u62E9\u5668\u9700\u5E26 html[data-dsh-glass] \u524D\u7F00\u4EE5\u538B\u8FC7 glass.ts \u91CC\n \u300C\u63D2\u4EF6\u81EA\u7ED8\u9762\u677F\u4E00\u5F8B transparent\u300D\u90A3\u6761\u89C4\u5219\uFF08\u540C\u7279\u5F02\u6027\u9760\u987A\u5E8F\u53D6\u80DC\u4E0D\u53EF\u9760\uFF09\u3002 */\n.psh-card[data-solid],html[data-dsh-glass] .psh-card[data-solid]{\n background:var(--dsw-static-neutral-bluish-00,#fff);\n backdrop-filter:none;-webkit-backdrop-filter:none}\nbody[data-ds-dark-theme] .psh-card[data-solid],\nhtml[data-dsh-glass] body[data-ds-dark-theme] .psh-card[data-solid]{\n background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\n.psh-card[data-mode='sheet'][data-anim='in']{animation:dsh-modal-slide-in ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n.psh-card[data-mode='sheet'][data-anim='out']{animation:dsh-modal-slide-out ${MODAL_ANIM_MS}ms cubic-bezier(.4,0,.2,1) both}\n/* \u2500\u2500 \u901A\u7528\u5361\u7247\u5934\u90E8\uFF1A\u6807\u9898 + \u5173\u95ED\uFF08\u5BF9\u9F50 auto-card-head \u89C4\u683C\uFF09\u2500\u2500 */\n.psh-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 16px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08))}\n.psh-title{flex:1;min-width:0;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#eee)}\n.psh-close{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-secondary,#bbb)}\n.psh-close:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n/* \u5361\u7247\u4E3B\u4F53\u6EDA\u52A8\u533A */\n.psh-body{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}\n/* \u2500\u2500 \u79FB\u52A8\u7AEF\uFF1A\u4EFB\u4F55\u6A21\u5F0F\u5F3A\u5236\u5168\u5C4F sheet\uFF08100vw / 100dvh\uFF0Cradius 0\uFF09\u3002\n \u53C2\u8003 tool-summary .dts__modal \u7684 767.98px \u5199\u6CD5\uFF1B!important \u538B\u8FC7\u7EC4\u4EF6\u5185\u8054\n left/top/width/height\uFF08drawer \u6A21\u5F0F\u7528\u5185\u8054\u5BBD\u5EA6\uFF0C\u5FC5\u987B\u8986\u76D6\u5230 0/\u5168\u5C4F\uFF09\u3002\n transform:none \u4EC5\u4F5C\u9759\u6001\u515C\u5E95\uFF0C\u6ED1\u5165/\u6ED1\u51FA\u52A8\u753B\u7684 keyframe transform \u4ECD\u4F18\u5148\u64AD\u653E\uFF1B\n \u672C\u5757\u6CE8\u91CA\u5185\u5BB9\u672A\u5199\u51FA\u300C\u661F\u53F7\u7D27\u8DDF\u6B63\u659C\u6760\u300D\u4E24\u5B57\u7B26\u5E8F\u5217\u3002 \u2500\u2500 */\n@media (max-width: 767.98px){\n .psh-card{\n left:0 !important;\n top:0 !important;\n right:auto !important;\n bottom:auto !important;\n width:100vw !important;\n max-width:100vw !important;\n height:100vh !important;\n height:100dvh !important;\n max-height:100vh !important;\n max-height:100dvh !important;\n border-radius:0 !important;\n transform:none !important;\n }\n}\n@media (prefers-reduced-motion:reduce){\n .psh-mask,.psh-card{animation:none!important}\n .psh-card{transition:none!important}\n}\n`\n\n/** \u6CE8\u5165\u5916\u58F3\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureShellStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** \u951A\u70B9\uFF1A\u5165\u53E3\u6309\u94AE\u53F3\u7F18 + \u9876\u7F18\u7684\u89C6\u53E3\u5750\u6807\uFF08getBoundingClientRect \u7CFB\uFF09\u3002 */\nexport interface PopoverAnchor {\n left: number\n top: number\n}\n\n/** \u7406\u60F3\u5C3A\u5BF8\uFF08px\uFF09\uFF1A\u62BD\u5C49\u5BBD\u5EA6\u968F tab \u5207\u6362\u4EE5 240ms \u5E73\u6ED1\u8FC7\u6E21\uFF08automation \u5361\u7247\u540C\u6B3E\u66F2\u7EBF\uFF09\u3002 */\nexport interface PopoverSize {\n width: number\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E00\u5F8B\u5168\u9AD8\uFF0Cheight/fill \u4E0D\u518D\u751F\u6548\u3002 */\n height?: number\n fill?: boolean\n}\n\n/** PopoverShell \u5C5E\u6027\u3002 */\nexport interface PopoverShellProps {\n /** \u6B63\u5728\u64AD\u653E\u6536\u56DE\u52A8\u753B\uFF08\u6B64\u65F6\u4ECD\u6302\u8F7D\uFF0C\u64AD out \u52A8\u753B\uFF09\u3002 */\n closing: boolean\n /** \u8BF7\u6C42\u5173\u95ED\uFF08\u906E\u7F69\u70B9\u51FB / Esc / \u5173\u95ED\u94AE\u7EDF\u4E00\u8D70\u8FD9\u91CC\uFF09\u3002 */\n onClose: () => void\n /** \u5165\u53E3\u951A\u70B9\uFF08\u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E0D\u518D\u8DDF\u968F\u6309\u94AE\u5B9A\u4F4D\uFF0C\u4F20\u4E0D\u4F20\u90FD\u4E0D\u5F71\u54CD\u5E03\u5C40\uFF09\u3002 */\n anchor?: PopoverAnchor | null\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u9762\u677F\u76F4\u63A5\u94FA\u6EE1\u4F1A\u8BDD\u4E3B\u533A\uFF0C\u7406\u60F3\u5BBD\u5EA6\u4E0D\u518D\u751F\u6548\u3002 */\n width?: number\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u94FA\u6EE1\u4E3B\u533A\uFF0C\u52A8\u6001\u5C3A\u5BF8\u4E0D\u518D\u751F\u6548\u3002 */\n size?: PopoverSize\n /** \u9F20\u6807\u8FDB\u5165\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF1A\u53D6\u6D88\u81EA\u52A8\u6536\u56DE\uFF09\u3002 */\n onCardMouseEnter?: () => void\n /** \u9F20\u6807\u79BB\u5F00\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF1A\u542F\u52A8\u81EA\u52A8\u6536\u56DE\u8BA1\u65F6\uFF09\u3002 */\n onCardMouseLeave?: () => void\n /** \u65E0\u969C\u788D\u540D\uFF08role=dialog \u7684 aria-label\uFF09\u3002 */\n ariaLabel: string\n /** \u5B9E\u5E95\u5361\u7247\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4E0D\u900F\u660E\uFF08\u5185\u5BB9\u5BC6\u96C6\u7684\u6570\u636E\u9762\u677F\u7528\uFF0C\u907F\u514D\u80CC\u666F\u7A7F\u900F\u5E72\u6270\u9605\u8BFB\uFF09\u3002 */\n solid?: boolean\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E00\u5F8B\u5168\u9AD8\uFF0C\u8BE5\u503C\u4E0D\u518D\u751F\u6548\u3002 */\n bottomInset?: number\n children: ReactNode\n}\n\n/** \u6E32\u67D3\u300C\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u9762\u677F\u300D\uFF08\u542B\u906E\u7F69\uFF09\u3002\u5185\u5BB9\u81EA\u5E26\u5934\u90E8\u65F6\u65E0\u9700\u518D\u7528 PshHead\u3002 */\nexport function PopoverShell({\n closing, onClose, width = 560, size, onCardMouseEnter, onCardMouseLeave, ariaLabel, solid = false, children,\n}: PopoverShellProps): JSX.Element {\n // \u89C6\u53E3\u5BBD\u5EA6 + \u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18\u8D70 state\uFF1A\u7A97\u53E3\u7F29\u653E/\u4FA7\u680F\u6298\u53E0\u65F6\u5B9E\u65F6\u8DDF\u968F\u3002\n const [vw, setVw] = useState(window.innerWidth)\n const [mainLeft, setMainLeft] = useState(readMainLeft)\n useEffect(() => {\n const reread = (): void => {\n setVw(window.innerWidth)\n setMainLeft(readMainLeft())\n }\n reread()\n window.addEventListener('resize', reread)\n const observer = new MutationObserver(reread)\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-sidebar-collapsed'], subtree: true })\n const timer = window.setInterval(reread, 1500)\n return () => {\n window.removeEventListener('resize', reread)\n observer.disconnect()\n window.clearInterval(timer)\n }\n }, [])\n void (size?.width ?? width)\n const anim = closing ? 'out' : 'in'\n // \u7A84\u5C4F\u56DE\u9000\u5168\u5C4F sheet\uFF1B\u684C\u9762\u7AEF\u76F4\u63A5\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\uFF08left=\u4FA7\u680F\u53F3\u7F18\uFF0C\u53F3\u62C9\u6EE1\uFF09\u3002\n const narrow = vw < NARROW_VP\n const mode = narrow ? 'sheet' : 'drawer'\n const style: CSSProperties | undefined = narrow ? undefined : { left: mainLeft }\n\n useEffect(() => {\n if (closing) return undefined\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [closing, onClose])\n\n // portal \u5230 body\uFF1A\u5361\u7247\u4E0D\u80FD\u7559\u5728\u5165\u53E3\u6240\u5728\u7684 DOM \u5B50\u6811\u91CC\u3002\n // \u5165\u53E3\u662F portal \u8FDB\u4FA7\u8FB9\u680F\u5BFC\u822A\u69FD\u7684\uFF0C\u800C\u69FD\u4F4D\u5BBF\u4E3B\u662F\u6211\u4EEC\u624B\u5DE5\u63D2\u8FDB DSH \u81EA\u6709\n // React \u6811\u7684\u88F8\u8282\u70B9\u2014\u2014\u5F39\u5C42\u4E00\u65E6\u7559\u5728\u91CC\u9762\uFF0C\u4FA7\u8FB9\u680F\u4EFB\u4F55\u4E00\u6B21\u91CD\u6E32\u67D3\u90FD\u53EF\u80FD\u8FDE\u5E26\n // \u56DE\u6536\u5B83\uFF0C\u4E14 position:fixed \u4F1A\u88AB\u4FA7\u8FB9\u680F\u7684 transform \u7956\u5148\u53D8\u6210\u5C40\u90E8\u5B9A\u4F4D\u3002\n // \u632A\u5230 body \u540E\uFF1A\u4E0D\u53D7\u4FA7\u8FB9\u680F\u6E32\u67D3\u5F71\u54CD\u3001fixed \u951A\u5B9A\u89C6\u53E3\u3001\u5C42\u7EA7\u4E0E DOM \u987A\u5E8F\u53EF\u63A7\u3002\n return createPortal(\n <>\n {narrow && (\n <div className=\"psh-mask\" data-anim={anim} aria-hidden=\"true\" onClick={onClose} />\n )}\n <div\n className={`psh-card ${modalDrawerAnimClass(closing)}`}\n data-anim={anim}\n data-mode={mode}\n data-solid={solid ? '' : undefined}\n style={style}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n onMouseEnter={onCardMouseEnter}\n onMouseLeave={onCardMouseLeave}\n >\n {children}\n </div>\n </>,\n document.body,\n )\n}\n\n/** \u5361\u7247\u5934\u90E8\u5C5E\u6027\u3002 */\nexport interface PshHeadProps {\n title: string\n closeLabel: string\n onClose: () => void\n}\n\n/** \u901A\u7528\u5361\u7247\u5934\u90E8\uFF08\u6807\u9898 + \u5173\u95ED\u94AE\uFF09\u3002 */\nexport function PshHead({ title, closeLabel, onClose }: PshHeadProps): JSX.Element {\n return (\n <div className=\"psh-head\">\n <span className=\"psh-title\">{title}</span>\n <button type=\"button\" className=\"psh-close\" aria-label={closeLabel} onClick={onClose}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 4l8 8M12 4l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n )\n}\n\n/** \u5361\u7247\u4E3B\u4F53\u6EDA\u52A8\u5BB9\u5668\uFF08flex:1 + overflow hidden\uFF0C\u5185\u90E8\u9762\u677F\u81EA\u884C\u6EDA\u52A8\uFF09\u3002 */\nexport function PshBody({ children, className }: { children: ReactNode; className?: string }): JSX.Element {\n return <div className={className !== undefined && className !== '' ? `psh-body ${className}` : 'psh-body'}>{children}</div>\n}\n", "/**\n * \u5F39\u7A97\u5F00\u5408\u52A8\u753B\uFF08\u7528\u91CF\u5DE5\u4F5C\u53F0 / \u6280\u80FD\u9762\u677F / \u8BB0\u5FC6\u9762\u677F\u5171\u7528\uFF09\u2014\u2014\u5BF9\u9F50\u300C\u81EA\u52A8\u5316\u300D\u5361\u7247\u7684\u6ED1\u5165\u6ED1\u51FA\u624B\u611F\uFF1A\n * - \u5F39\u51FA\uFF1Afade + \u81EA\u5E95\u90E8 24px \u4E0A\u6ED1\u8FDB\u5165\uFF08\u65E0\u7F29\u653E\uFF1Bautomation sheet-in \u540C\u6B3E\u4F4D\u79FB\u4E0E\u66F2\u7EBF\uFF09\uFF0Cmount \u65F6\u64AD\u653E\u3002\n * - \u6536\u56DE\uFF1Afade + \u4E0B\u6ED1 24px \u9000\u51FA\uFF08automation sheet-out \u540C\u6B3E\u53CD\u5411\u66F2\u7EBF\uFF09\uFF0Cclosing \u9636\u6BB5\u64AD\u653E\uFF0C\u7ED3\u675F\u540E\u518D\u5378\u8F7D\u3002\n * - \u5185\u5BB9\uFF1A`.dsh-modal-stagger` \u5BB9\u5668\u5728\u5361\u7247\u6ED1\u5165\u540E 60ms \u8F7B\u5FAE\u4E0A\u6D6E\u8DDF\u8FDB\uFF08automation \u5185\u90E8\u533A\u5757\u540C\u6B3E\n * rise-in\uFF09\uFF0C\u5173\u95ED\u65F6\u52A8\u753B\u81EA\u52A8\u89E3\u9664\u3001\u968F\u5361\u7247\u6574\u4F53\u6536\u56DE\u6E10\u9690\u3002\n *\n * \u7528\u6CD5\uFF1A\u5165\u53E3\u7EC4\u4EF6\u7528 useModalClose \u6301\u6709 closing \u6001\uFF0C\u628A closing \u4F20\u7ED9\u5F39\u7A97\uFF0C\n * \u5F39\u7A97\u628A closing \u6620\u5C04\u6210 slide-out class\uFF08\u5361\u7247\uFF09\u4E0E mask \u7684\u6DE1\u51FA class\uFF1B\n * \u9700\u8981\u5185\u5BB9\u9519\u843D\u611F\u7684\u9762\u677F\u5728\u5185\u5BB9\u6839\u5BB9\u5668\u4E0A\u52A0 `dsh-modal-stagger` \u5373\u53EF\u3002\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\n/** \u52A8\u753B\u65F6\u957F\uFF08ms\uFF09\uFF0CCSS \u4E0E hook \u8BA1\u65F6\u4FDD\u6301\u4E00\u81F4\uFF08\u4E0E automation \u7684 AUTO_ANIM_MS \u540C\u503C\uFF09\u3002 */\nexport const MODAL_ANIM_MS = 240\n\n/** \u6837\u5F0F\u6807\u7B7E id\uFF08\u5E26 triad \u524D\u7F00\uFF1Adsh-chat-flow \u6CE8\u5165\u540C\u540D\u65E7\u8868\uFF0C\u5148\u5230\u5148\u5F97\u4F1A\u541E\u6389\u672C\u8868\u7684 keyframes\uFF09\u3002 */\nconst STYLE_ID = 'dsh-prompt-customizer-modal-animation-styles'\n\nconst SHEET = `\n@keyframes dsh-modal-slide-in {\n from { opacity: 0; transform: translateY(24px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes dsh-modal-slide-out {\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(24px); }\n}\n@keyframes dsh-modal-side-in {\n from { opacity: 0; transform: translateX(-14px); }\n to { opacity: 1; transform: translateX(0); }\n}\n@keyframes dsh-modal-side-out {\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(-10px); }\n}\n@keyframes dsh-modal-drawer-in {\n from { opacity: 0; transform: translateX(56px); }\n to { opacity: 1; transform: translateX(0); }\n}\n@keyframes dsh-modal-drawer-out {\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(40px); }\n}\n@keyframes dsh-modal-rise-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes dsh-modal-mask-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes dsh-modal-mask-out {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n.dsh-modal-slide-in { animation: dsh-modal-slide-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-slide-out { animation: dsh-modal-slide-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n.dsh-modal-side-in { animation: dsh-modal-side-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-side-out { animation: dsh-modal-side-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n.dsh-modal-drawer-in { animation: dsh-modal-drawer-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-drawer-out { animation: dsh-modal-drawer-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n/* \u5185\u5BB9\u9519\u843D\uFF1A\u5361\u7247\u64AD\u653E\u6ED1\u5165\uFF08\u5E95\u90E8\u4E0A\u6ED1 / \u53F3\u4FA7\u6ED1\u5165\u5747\u53EF\uFF09\u65F6\u751F\u6548\uFF0C\u5173\u95ED\u65F6\u968F\u5361\u7247\u6574\u4F53\u6536\u56DE\u3002\n fill-mode \u5FC5\u987B\u7528 backwards\uFF08\u5EF6\u8FDF\u671F\u5E94\u7528 from \u5E27\u9690\u85CF\uFF09\u800C\u975E both\u2014\u2014both \u4F1A\u5728\u52A8\u753B\n \u7ED3\u675F\u540E\u6B8B\u7559 to \u5E27 transform\uFF08\u5373\u4F7F translateY(0)\uFF09\uFF0C\u4F7F\u8BE5\u5BB9\u5668\u6210\u4E3A\u540E\u4EE3 position:fixed\n \u5143\u7D20\uFF08\u56FE\u8868 tooltip\uFF09\u7684\u5305\u542B\u5757\uFF0C\u6D6E\u5C42\u6574\u4F53\u504F\u79FB\u3002 */\n.dsh-modal-slide-in .dsh-modal-stagger,\n.dsh-modal-side-in .dsh-modal-stagger,\n.dsh-modal-drawer-in .dsh-modal-stagger {\n animation: dsh-modal-rise-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1) backwards;\n animation-delay: 60ms;\n}\n.dsh-modal-mask-in { animation: dsh-modal-mask-in ${MODAL_ANIM_MS}ms ease; }\n.dsh-modal-mask-out { animation: dsh-modal-mask-out ${MODAL_ANIM_MS}ms ease forwards; }\n@media (prefers-reduced-motion: reduce) {\n .dsh-modal-slide-in, .dsh-modal-slide-out, .dsh-modal-side-in, .dsh-modal-side-out,\n .dsh-modal-drawer-in, .dsh-modal-drawer-out,\n .dsh-modal-mask-in, .dsh-modal-mask-out { animation: none; }\n .dsh-modal-slide-in .dsh-modal-stagger, .dsh-modal-side-in .dsh-modal-stagger, .dsh-modal-drawer-in .dsh-modal-stagger { animation: none; }\n}\n`\n\n/** \u6CE8\u5165\u5F39\u7A97\u52A8\u753B\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureModalAnimStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** \u5361\u7247\u52A8\u753B class\uFF08open \u9636\u6BB5\u6ED1\u5165\uFF0Cclosing \u9636\u6BB5\u6ED1\u51FA\uFF09\u3002 */\nexport function modalAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-slide-out' : 'dsh-modal-slide-in'\n}\n\n/** \u5361\u7247\u52A8\u753B class\u2014\u2014\u53F3\u4FA7\u6ED1\u5165\u53D8\u4F53\uFF08\u8D34\u5165\u53E3\u5F39\u51FA\u7684 popover \u5361\u7247\u7528\uFF0C\u73B0\u4EC5\u517C\u5BB9\u4FDD\u7559\uFF09\u3002 */\nexport function modalSideAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-side-out' : 'dsh-modal-side-in'\n}\n\n/** \u5361\u7247\u52A8\u753B class\u2014\u2014\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u62BD\u5C49\u53D8\u4F53\uFF08\u7528\u91CF/\u6280\u80FD/\u8BB0\u5FC6\u9762\u677F\u7528\uFF1A\u81EA\u53F3\u5411\u5DE6\u6ED1\u5165\uFF09\u3002 */\nexport function modalDrawerAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-drawer-out' : 'dsh-modal-drawer-in'\n}\n\n/** \u906E\u7F69\u52A8\u753B class\uFF08\u81EA\u5B9A\u4E49\u5F39\u7A97\u624D\u6709\u906E\u7F69\uFF0C\u5982\u7528\u91CF\u5DE5\u4F5C\u53F0\uFF09\u3002 */\nexport function modalMaskAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-mask-out' : 'dsh-modal-mask-in'\n}\n\n/** \u5185\u5BB9\u5BB9\u5668 class\uFF1A\u5361\u7247\u6ED1\u5165\u540E\u9519\u843D\u8DDF\u8FDB\uFF08\u914D\u5408 modalAnimClass \u4F7F\u7528\uFF09\u3002 */\nexport const modalStaggerClass = 'dsh-modal-stagger'\n\n/**\n * \u5F39\u7A97\u5173\u95ED\u52A8\u753B\u72B6\u6001\u673A\uFF1A\u5148\u7F6E closing \u64AD\u653E\u6536\u56DE\u52A8\u753B\uFF0C\u7ED3\u675F\u540E\u518D\u771F\u6B63 onClose\u3002\n * `open` \u7531\u5165\u53E3\u4F20\u5165\uFF1A\u5F39\u7A97\u518D\u6B21\u6253\u5F00\u65F6\u91CD\u7F6E closing\uFF08\u5426\u5219\u4E0A\u4E00\u6B21\u6536\u56DE\u52A8\u753B\u4F1A\u628A\n * closing \u5361\u5728 true\uFF0C\u91CD\u5F00\u540E\u5F39\u7A97\u900F\u660E\u4E14\u906E\u7F69\u6321\u4F4F\u6574\u9875\uFF09\u3002\n */\nexport function useModalClose(open: boolean, onClose: () => void, durationMs = MODAL_ANIM_MS): { closing: boolean; requestClose: () => void } {\n const [closing, setClosing] = useState(false)\n const timerRef = useRef<number | null>(null)\n const closingRef = useRef(false)\n\n // \u6253\u5F00\uFF08\u542B\u91CD\u65B0\u6253\u5F00\uFF09\u65F6\u91CD\u7F6E\u5173\u95ED\u6001\uFF1A\u5728\u7ED8\u5236\u524D\u540C\u6B65\u590D\u4F4D\uFF0C\u907F\u514D\u4E00\u5E27\u900F\u660E\u95EA\u73B0\u3002\n useLayoutEffect(() => {\n if (open) {\n closingRef.current = false\n setClosing(false)\n }\n }, [open])\n\n const requestClose = useCallback(() => {\n if (closingRef.current) return\n closingRef.current = true\n setClosing(true)\n timerRef.current = window.setTimeout(() => {\n onClose()\n }, durationMs)\n }, [onClose, durationMs])\n\n useEffect(() => () => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current)\n }, [])\n\n return { closing, requestClose }\n}\n", "/**\n * Panel \u2014 \u63D0\u793A\u8BCD\u7BA1\u7406\u9762\u677F\uFF08\u72EC\u7ACB\u62BD\u5C49\u7684\u6839\u7EC4\u4EF6\uFF09\u3002\n *\n * \u62C9\u53D6\u914D\u7F6E\u4E0E\u6E05\u5355\u3001\u7EF4\u62A4\u6A21\u5F0F\u4E0E\u7F16\u8F91\u76EE\u6807\u72B6\u6001\uFF0C\u628A\u5DE6\u53F3\u4E24\u680F\u88C5\u914D\u8D77\u6765\uFF1A\n * - \u5934\u90E8\uFF1A\u6807\u9898 + \u6A21\u5F0F\u5207\u6362\uFF08\u63D0\u793A\u8BCD / \u5DE5\u5177 / \u9884\u8BBE\uFF09+ \u4FDD\u5B58 / \u5237\u65B0 / \u5173\u95ED\uFF1B\n * - \u7B2C\u4E8C\u884C\uFF1Aagent \u9884\u8BBE Tab\uFF08\u5168\u90E8 Agent + \u5404\u9884\u8BBE\uFF0C\u70B9\u51FB\u5373\u5207\u6362\u7F16\u8F91\u76EE\u6807\uFF0C\n * \u50CF\u5BBF\u4E3B\u80FD\u529B\u7BA1\u7406\u9875\u7684\u9884\u8BBE\u5207\u6362\uFF09+ \u4E09\u6001\u540C\u6B65 / \u4E2D\u6587\u63D0\u793A\u8BCD\u5F00\u5173\uFF1B\n * - \u4E3B\u4F53\u5206\u680F\uFF1A\u5DE6\u680F = \u52FE\u9009\u5217\u8868\uFF08\u63D0\u793A\u8BCD\u6216\u5DE5\u5177\uFF0C\u5E95\u90E8\u4E09\u6001\u8FC7\u6EE4\uFF09\uFF0C\u53F3\u680F =\n * \u6700\u7EC8\u88C5\u914D\u9884\u89C8\uFF1B\u9884\u8BBE\u6A21\u5F0F\u4E0B\u5DE6\u680F\u662F\u5FEB\u7167\u5E93\u3001\u53F3\u680F\u662F\u5168\u5C40\u8BBE\u7F6E\u3002\n *\n * \u914D\u7F6E\u6765\u81EA\u63D2\u4EF6\u81EA\u6709 /config \u8DEF\u7531\uFF1B\u6E05\u5355\u4E0E\u4E09\u9636\u6BB5\u9884\u89C8\u6765\u81EA /inventory \u4E0E\n * /preview?phase=\u2026\u3002\u7F16\u8F91\u53EA\u6539\u5185\u5B58\u8349\u7A3F\uFF0C\u7531\u300C\u4FDD\u5B58\u300D\u6309\u94AE\u7ECF /config/apply \u4E00\u6B21\n * \u5199\u76D8\uFF08\u5199\u9519\u7684\u914D\u7F6E\u4E0D\u70B9\u4FDD\u5B58\u5C31\u4E0D\u4F1A\u8FDB\u6587\u4EF6\uFF09\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport { IconAgentPresetOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\n// \u9884\u8BBE chips \u884C\u76F4\u63A5\u590D\u7528\u80FD\u529B\u9762\u677F\uFF08SKILL / MCP\uFF09\u7684\u7C7B\u540D\uFF1A\u4E09\u5904\u300CAgent \u9884\u8BBE\u300D\u51E0\u4F55\u4E00\u81F4\u3002\nimport { css } from '../skills/styles.js'\nimport { payloadOf, dropOnPhase } from './dnd.ts'\nimport { type Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport {\n PHASES,\n PHASE_KEYS,\n PHASE_LABEL_KEY,\n hasContent,\n sameEntry,\n type AgentPresetInfo,\n type Config,\n type ContextField,\n type EntryRef,\n type Inventory,\n type PhaseKey,\n type PhaseViews,\n type Preview,\n type SectionField,\n} from './types.ts'\nimport { editView, overrideView, type ConfigPatch } from './presets.ts'\nimport { contextPatch, mirroredRows, mirrorPhaseInjectEntries, mirroredDeniedLists, mirrorSkippedNames } from './phase-ops.ts'\nimport { SectionsPane } from './SectionsPane.tsx'\nimport { ToolsPane } from './ToolsPane.tsx'\nimport { PresetsPane, SettingsPane } from './PresetsPane.tsx'\nimport { PreviewPane } from './PreviewPane.tsx'\nimport { makeIoEnv } from './preset-io.ts'\n\nconst INVENTORY_URL = '/api/prompt-customizer/inventory'\nconst AGENT_PRESETS_URL = '/api/prompt-customizer/agent-presets'\nconst CONFIG_URL = '/api/prompt-customizer/config'\nconst CONFIG_BATCH_URL = '/api/prompt-customizer/config/batch'\nconst CONFIG_SET_URL = '/api/prompt-customizer/config/set'\nconst CONFIG_UNSET_URL = '/api/prompt-customizer/config/unset'\nconst CONFIG_APPLY_URL = '/api/prompt-customizer/config/apply'\nconst CONFIG_RESET_URL = '/api/prompt-customizer/config/reset'\nconst PREVIEW_URL = '/api/prompt-customizer/preview'\n\n/** \u7F16\u8F91\u8349\u7A3F\u91CC\u53EF\u80FD\u51FA\u73B0\u7684\u5B57\u6BB5\uFF08\u4E0E\u670D\u52A1\u7AEF /config/apply \u7684 APPLY_FIELDS \u4E00\u81F4\uFF0C\u7531 PHASES \u6D3E\u751F\uFF09\u3002 */\nconst DRAFT_FIELDS: string[] = [\n ...PHASES.flatMap((phase) => [phase.sectionField, phase.contextField]),\n 'replacements',\n 'inject',\n 'tools',\n]\n\n/** \u9762\u677F\u9876\u5C42\u6A21\u5F0F\uFF1A\u63D0\u793A\u8BCD / \u5DE5\u5177 / \u9884\u8BBE\uFF08\u9884\u89C8\u5E38\u9A7B\u53F3\u680F\uFF0C\u4E0D\u518D\u662F\u72EC\u7ACB\u6A21\u5F0F\uFF09\u3002 */\ntype PanelMode = 'sections' | 'tools' | 'presets'\n\n/** \u53EF\u7F16\u8F91\u7684\u914D\u7F6E\u5B57\u6BB5\uFF08\u542B\u6BCF\u9636\u6BB5\u72EC\u7ACB\u6BB5 / \u4E0A\u4E0B\u6587\u540D\u5355\uFF09\u3002 */\ntype EditField = SectionField | ContextField | 'replacements' | 'inject' | 'tools'\n\n/** \u7F16\u8F91\u57DF\u8349\u7A3F\uFF1A\u63D0\u793A\u8BCD/\u5DE5\u5177\u4E24\u680F\u5171\u4EAB\u7684\u672A\u4FDD\u5B58\u5B57\u6BB5 + \u810F\u6807\u8BB0\u3002\n * \u53EA\u8BB0\u5F55\u7528\u6237\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\uFF08\u9996\u6B21\u7F16\u8F91\u53EA\u5199\u90A3\u4E00\u9879\uFF09\uFF0C\u4FDD\u5B58\u65F6\u4E5F\u53EA\u63D0\u4EA4\u8FD9\u4E9B\n * \u5B57\u6BB5 \u2014\u2014 \u672A\u7F16\u8F91\u7684\u5B57\u6BB5\u7EE7\u7EED\u56DE\u843D\u5168\u5C40 / \u7EE7\u627F\uFF0C\u907F\u514D\u4E00\u6B21\u4FDD\u5B58\u51BB\u7ED3\u5168\u90E8\u7EE7\u627F\u503C\u3002 */\ninterface EditDraft extends Partial<Record<SectionField | ContextField, EntryRef[]>> {\n replacements?: Config['replacements']\n inject?: Config['inject']\n tools?: Config['tools']\n dirty: boolean\n}\n\nexport function Panel({ t, onClose, level = 'preset', workspace }: { t: Translate; onClose?: () => void; level?: 'preset' | 'workspace'; workspace?: string }): ReactElement {\n const [cfg, setCfg] = useState<Config | null>(null)\n const [inv, setInv] = useState<Inventory | null>(null)\n // \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\uFF1A\u6A21\u578B\u89C6\u89D2\u7684\u552F\u4E00\u6570\u636E\u6E90\uFF08\u52A0\u8F7D\u4E2D\u4E3A null\uFF09\u3002\n const [phases, setPhases] = useState<PhaseViews | null>(null)\n const [agentPresets, setAgentPresets] = useState<AgentPresetInfo[]>([])\n const [currentPreset, setCurrentPreset] = useState<string | undefined>(undefined)\n const [workspaceOverrides, setWorkspaceOverrides] = useState<Record<string, Config>>({})\n const [currentWorkspace, setCurrentWorkspace] = useState<string | undefined>(undefined)\n const [mode, setMode] = useState<PanelMode>('sections')\n const [error, setError] = useState<string | null>(null)\n // \u914D\u7F6E\u5199\u5165\u8BA1\u6570\uFF1A\u6BCF\u6B21\u6210\u529F\u5199\u914D\u7F6E\u540E +1\uFF0C\u9A71\u52A8\u9884\u89C8\u91CD\u8F7D\u3002\n const [version, setVersion] = useState(0)\n // \u4E09\u9636\u6BB5\u89C6\u56FE\uFF1A\u5DE6\u680F\u5217\u8868\u4E0E\u53F3\u680F\u9884\u89C8\u5171\u7528\uFF1B\u5DE6\u53F3\u4E24\u680F\u7684\u9636\u6BB5 Tab \u8054\u52A8\u5207\u6362\u540C\u4E00\u4EFD\u3002\n const [phase, setPhase] = useState<PhaseKey>('bootstrap')\n // \u62D6\u62FD\u60AC\u505C\u4E2D\u7684\u9636\u6BB5 Tab\uFF1A\u9AD8\u4EAE\u63D0\u793A\u300C\u677E\u624B = \u590D\u5236\u5230\u8BE5\u9636\u6BB5\u300D\uFF08\u5904\u7406\u7531\u6302\u8F7D\u4E2D\u7684\u5217\u8868\u8D1F\u8D23\uFF09\u3002\n const [dropPhase, setDropPhase] = useState<PhaseKey | null>(null)\n // \u8349\u7A3F\u9884\u89C8\u7684\u540C\u6B65\u5E8F\u53F7\uFF1A\u6BCF\u6B21\u53D1\u8D77\u540C\u6B65 +1\uFF0C\u8FC7\u671F\u54CD\u5E94\uFF08\u5DF2\u4FDD\u5B58 / \u518D\u6B21\u7F16\u8F91\u540E\uFF09\n // \u76F4\u63A5\u4E22\u5F03\uFF0C\u7EDD\u4E0D\u8986\u76D6\u65B0\u6570\u636E\u3002\n const syncSeq = useRef(0)\n const refreshSeq = useRef(0)\n // \u5F53\u524D\u5237\u65B0\u8BF7\u6C42\u7684 scope \u952E\uFF1A\u5207\u6362\u7F16\u8F91\u76EE\u6807 / \u5C42\u7EA7 / \u5DE5\u4F5C\u533A\u540E\uFF0C\u5728\u9014\u65E7\u54CD\u5E94\u76F4\u63A5\u4E22\u5F03\u3002\n const scopeKeyRef = useRef('')\n // \u7F16\u8F91\u76EE\u6807\uFF1Aagent \u9884\u8BBE id\u30020.9.0 \u8D77\u300C\u5168\u90E8 Agent\u300D\u5165\u53E3\u5DF2\u79FB\u9664 \u2014\u2014 \u63D0\u793A\u8BCD\u5FC5\u987B\n // \u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF1B\u5217\u8868\u5230\u8FBE\u540E\u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E00\u4E2A\u53EF\u7528\u9884\u8BBE\uFF08\u89C1\u4E0B\u65B9 effect\uFF09\u3002\n const [target, setTarget] = useState<string | undefined>(undefined)\n // \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u52FE\u9009\u540E\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u680F\u7684\u4E09\u6001\u4E00\u8D77\u751F\u6548 \u2014\u2014 \u63D0\u793A\u8BCD\u680F\u6309\n // \u5E38\u9A7B\u671F\u7684\u5E76\u96C6\u884C\u96C6\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF08\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u4E00\u6B21\u5199\u5168\u4E09\u6001\uFF09\uFF0C\n // \u5DE5\u5177\u680F\u7684\u5C4F\u853D\u4E0E\u52A0\u56DE\u5BF9\u4E09\u4E2A\u9636\u6BB5\u540C\u65F6\u751F\u6548\u3002\u4EC5\u5728\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u4E2A\u6A21\u5F0F\u663E\u793A\u3002\n const [syncAll, setSyncAll] = useState(false)\n // \u53F3\u680F\u9884\u89C8\u7684\u5B50\u89C6\u56FE\uFF1A\u63D0\u793A\u8BCD\u6A21\u5F0F\u9ED8\u8BA4\u770B\u63D0\u793A\u8BCD\u3001\u5DE5\u5177\u6A21\u5F0F\u9ED8\u8BA4\u770B\u5DE5\u5177\u3002\n const [previewSub, setPreviewSub] = useState<'prompt' | 'tools'>('prompt')\n // \u7F16\u8F91\u57DF\u8349\u7A3F\uFF1Anull = \u65E0\u8349\u7A3F\uFF08\u663E\u793A\u78C1\u76D8\u503C\uFF09\u3002\u63D0\u793A\u8BCD \u2194 \u5DE5\u5177\u5207\u6362\u4FDD\u7559\uFF1B\n // \u5207\u5230\u9884\u8BBE\u6A21\u5F0F\u6216\u5207\u6362\u7F16\u8F91\u76EE\u6807\u65F6\u4E22\u5F03\uFF08\u810F\u8349\u7A3F\u5148\u7ECF\u786E\u8BA4\uFF09\u3002\n const [draft, setDraft] = useState<EditDraft | null>(null)\n const [saving, setSaving] = useState(false)\n // \u6240\u6709\u914D\u7F6E\u5199\u5165\u4E32\u884C\u5316\uFF1A\u9884\u8BBE\u5E94\u7528/\u5220\u9664/\u5BFC\u5165\u4F1A\u5148\u540E\u5199\u591A\u4E2A\u5B57\u6BB5\uFF0C\u907F\u514D\u4E24\u4E2A\n // read-modify-write \u8BF7\u6C42\u4E71\u5E8F\u628A\u524D\u4E00\u4E2A\u5B57\u6BB5\u8986\u76D6\u6389\u3002\n const writeChain = useRef<Promise<unknown>>(Promise.resolve())\n const enqueueWrite = <T,>(operation: () => Promise<T>): Promise<T> => {\n const next = writeChain.current.then(operation, operation)\n writeChain.current = next.then(() => undefined, () => undefined)\n return next\n }\n const [flash, setFlash] = useState<string | null>(null)\n const [flashKind, setFlashKind] = useState<'ok' | 'err'>('ok')\n const [backingUp, setBackingUp] = useState(false)\n const [restoring, setRestoring] = useState(false)\n const [cleaning, setCleaning] = useState(false)\n const flashTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const loadConfig = (): Promise<Error | null> => fetch(CONFIG_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'config failed')\n setCfg(body.config as Config)\n setWorkspaceOverrides((body.workspaceOverrides ?? {}) as Record<string, Config>)\n setCurrentWorkspace(typeof body.currentWorkspace === 'string' && body.currentWorkspace !== '' ? body.currentWorkspace : undefined)\n setError(null)\n return null\n })\n .catch((e: unknown) => {\n const error = e instanceof Error ? e : new Error(String(e))\n setError(error.message)\n return error\n })\n const load = (): void => { void loadConfig() }\n useEffect(load, [])\n\n // \u8FD4\u56DE Promise\uFF1A\u624B\u52A8\u5237\u65B0\u540E\u53EF\u4EE5\u94FE\u4E0A\u8349\u7A3F\u8865\u540C\u6B65\uFF08\u89C1\u300C\u5237\u65B0\u300D\u6309\u94AE\uFF09\u3002\n const refresh = (): Promise<void> => {\n // \u5237\u65B0\u6309\u94AE\u5FC5\u987B\u91CD\u8BFB /config\uFF1A\u53EA\u5237\u65B0 preview \u4F1A\u8BA9 editView \u4ECD\u57FA\u4E8E\u65E7\n // overrides\uFF0C\u4E4B\u540E\u518D\u6B21\u4FDD\u5B58\u53EF\u80FD\u628A\u5916\u90E8\u4FEE\u6539\u8986\u76D6\u6389\u3002\n const configReady = loadConfig()\n const seq = ++refreshSeq.current\n // scope \u952E = \u5C42\u7EA7 + \u9884\u8BBE + \u5DE5\u4F5C\u533A\uFF1A\u54CD\u5E94\u56DE\u6765\u65F6\u82E5\u5DF2\u5207\u6362\u76EE\u6807\uFF0C\u6574\u5305\u4E22\u5F03\u3002\n const scopeKey = `${level}\\u0000${target ?? ''}\\u0000${level === 'workspace' ? (workspace ?? currentWorkspace ?? '') : ''}`\n scopeKeyRef.current = scopeKey\n // \u63D0\u793A\u8BCD/\u5DE5\u5177\u4E25\u683C\u6309\u5177\u4F53\u9884\u8BBE\uFF1A\u672A\u9009\u5B9A\u9884\u8BBE\u524D\u4E0D\u53D1\u65E0 scope \u8BF7\u6C42\uFF08\u907F\u514D\u5E76\u96C6\u4E32\u53F0\uFF09\u3002\n if (level === 'preset' && target === undefined) {\n setPhases(null)\n setInv(null)\n return Promise.resolve()\n }\n const wsSel = level === 'workspace' ? (workspace ?? currentWorkspace ?? '') : ''\n const qs = `${target ? `?scope=${encodeURIComponent(target)}` : ''}${wsSel === '' ? '' : `${target ? '&' : '?'}workspace=${encodeURIComponent(wsSel)}`}`\n // \u5148\u6E05\u7A7A\u4E09\u9636\u6BB5\u518D\u53D1\u8BF7\u6C42\uFF1A\u5207\u6362\u76EE\u6807\u671F\u95F4\u7EDD\u4E0D\u80FD\u62FF\u4E0A\u4E00\u4EFD\u88C5\u914D\u5F53\u5F53\u524D\u76EE\u6807\u3002\n setPhases(null)\n setInv(null)\n // \u4E09\u9636\u6BB5\u4E0E\u6E05\u5355\u90FD\u8BFB\u53D6\u5F53\u524D\u6A21\u5F0F\uFF1B\u7D2F\u8BA1\u6C60\u4EC5\u4F9B\u6DFB\u52A0\u53C2\u8003\uFF0C\u4E0D\u66FF\u4EE3\u9884\u8BBE\u88C5\u914D\u3002\n const params = (phase: string): string =>\n `${qs}${qs ? '&' : '?'}phase=${phase}&t=${Date.now()}`\n const failures: string[] = []\n const grab = (phase: string): Promise<Preview | null> =>\n fetch(PREVIEW_URL + params(phase))\n .then((r) => r.json())\n .then((body: Preview) => {\n if (body.ok === false) throw new Error(body.error ?? t('previewFail'))\n return body\n })\n .catch((error: unknown) => {\n failures.push(`${phase}: ${String(error instanceof Error ? error.message : error)}`)\n return null\n })\n return Promise.all([configReady, ...PHASE_KEYS.map(grab), fetch(INVENTORY_URL + qs).then((r) => r.json()).then(body => {\n if (body.ok === false) throw new Error(body.error ?? 'inventory failed')\n return body\n }).catch((error: unknown) => {\n failures.push(String(error instanceof Error ? error.message : error))\n return null\n })])\n .then((responses) => {\n const inventoryData = responses[responses.length - 1] as unknown as Inventory | null\n if (seq !== refreshSeq.current || scopeKey !== scopeKeyRef.current) return\n const views = { ...({} as PhaseViews) }\n PHASE_KEYS.forEach((key, index) => { views[key] = responses[index + 1] as Preview | null })\n setPhases(views)\n setInv(inventoryData as Inventory)\n const configError = responses[0] as unknown as Error | null\n setError(configError !== null ? configError.message : failures.length ? failures.join('\\n') : null)\n })\n .catch((e: unknown) => {\n if (seq !== refreshSeq.current || scopeKey !== scopeKeyRef.current) return\n const empty = {} as PhaseViews\n for (const key of PHASE_KEYS) empty[key] = null\n setPhases(empty)\n setError(String(e instanceof Error ? e.message : e))\n })\n }\n // \u6302\u8F7D\u65F6\u4E0E\u5207\u6362\u7F16\u8F91\u76EE\u6807\u540E\uFF1A\u6E05\u5355\u4E0E\u4E09\u9636\u6BB5\u9884\u89C8\u5207\u5230\u5BF9\u5E94 scope\u3002\n // version \u5165\u4F9D\u8D56\uFF1A\u4FDD\u5B58/\u5199\u914D\u7F6E\u6210\u529F\u540E +1\uFF0C\u9A71\u52A8\u91CD\u65B0\u62C9\u53D6\uFF08\u5426\u5219\u4E00\u76F4\u663E\u793A\u4FDD\u5B58\u524D\u7684\u88C5\u914D\uFF09\u3002\n useEffect(() => { void refresh() }, [target, version, level, workspace, currentWorkspace])\n\n // \u8349\u7A3F\u5B9E\u65F6\u9884\u89C8\uFF1A\u628A\u672A\u4FDD\u5B58\u7684\u7F16\u8F91\u8349\u7A3F\u8865\u4E01 POST \u7ED9 /preview\uFF08\u670D\u52A1\u7AEF\u53EA\u5728\u5185\u5B58\u91CC\n // \u53E0\u52A0\uFF0C\u78C1\u76D8\u4E0D\u52A8\uFF09\uFF0C\u53EA\u5237\u65B0\u5F53\u524D\u9636\u6BB5\u89C6\u56FE \u2014\u2014 \u9884\u89C8\u968F\u6539\u968F\u52A8\uFF1B\u4FDD\u5B58\u540E\u7684 GET \u5168\u91CF\n // \u62C9\u53D6\u4F1A\u8986\u76D6\u56DE\u6743\u5A01\u72B6\u6001\u3002syncSeq \u8BA9\u8FC7\u671F\u54CD\u5E94\uFF08\u53C8\u7F16\u8F91\u4E86 / \u5DF2\u4FDD\u5B58\uFF09\u76F4\u63A5\u4E22\u5F03\u3002\n const syncDraftPreview = (): void => {\n if (draft === null || !draft.dirty) return\n if (level !== 'preset') return // \u5DE5\u4F5C\u533A\u7EA7\u8349\u7A3F\u9884\u89C8\u8D70\u4FDD\u5B58\u540E\u91CD\u62C9\uFF0C\u4E0D\u53E0\u52A0\u5230\u9884\u8BBE\u9884\u89C8\n const patch: Record<string, unknown> = {}\n const source = draft as unknown as Record<string, unknown>\n for (const field of DRAFT_FIELDS) {\n if (Object.hasOwn(source, field)) patch[field] = source[field]\n }\n if (Object.keys(patch).length === 0) return\n const seq = ++syncSeq.current\n // scope \u8D70\u67E5\u8BE2\u4E32\uFF08\u670D\u52A1\u7AEF previewTarget \u53EA\u8BA4 query\uFF09\uFF1A\u8349\u7A3F\u8865\u4E01\u5FC5\u987B\u843D\u5728\n // \u5F53\u524D\u7F16\u8F91\u7684\u9884\u8BBE\u4E0A\uFF0C\u5426\u5219\u751F\u6548\u89C6\u56FE\u4E3A\u7A7A\u3001\u9884\u89C8\u9000\u56DE\u5B98\u65B9\u539F\u6837\u3002\u5DE5\u4F5C\u533A\u7EA7\u4E0D\u8D70\n // \u8349\u7A3F\u5B9E\u65F6\u9884\u89C8\uFF08\u4E0A\u9762\u5DF2\u63D0\u524D\u8FD4\u56DE\uFF09\u3002\n const scopeQs = target !== undefined ? `?scope=${encodeURIComponent(target)}` : ''\n fetch(PREVIEW_URL + scopeQs, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch, phase }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok === false) throw new Error(body?.error ?? 'preview failed')\n if (seq !== syncSeq.current) return // \u8FC7\u671F\u54CD\u5E94\uFF1A\u8349\u7A3F\u53C8\u53D8\u4E86\u6216\u5DF2\u4FDD\u5B58\uFF0C\u4E22\u5F03\n setPhases((prev) => (prev === null ? prev : { ...prev, [phase]: body as Preview }))\n setError(null)\n })\n .catch((e: unknown) => {\n // \u5B9E\u65F6\u9884\u89C8\u5931\u8D25\u4E0D\u518D\u9759\u9ED8\uFF1A\u6D88\u606F\u6761\u63D0\u793A\uFF08\u4E0B\u4E00\u6B21\u6210\u529F\u4F1A\u81EA\u52A8\u6E05\u9664\uFF09\u3002\u4FDD\u5B58\u540E\n // \u7684\u5168\u91CF\u5237\u65B0\u4ECD\u4F1A\u8986\u76D6\u56DE\u6743\u5A01\u72B6\u6001\uFF0C\u4E0D\u5F71\u54CD\u7F16\u8F91\u3002\n setError(`${t('previewSyncFail')}\uFF1A${e instanceof Error ? e.message : String(e)}`)\n })\n }\n // \u7F16\u8F91\uFF08draft \u8EAB\u4EFD\u53D8\u5316\uFF09\u3001\u5207\u6362\u9636\u6BB5 / \u7F16\u8F91\u76EE\u6807\u540E\uFF1A\u9632\u6296 600ms \u540C\u6B65\u4E00\u6B21\u3002\n useEffect(() => {\n if (draft === null || !draft.dirty) return undefined\n const timer = setTimeout(syncDraftPreview, 600)\n return () => { clearTimeout(timer) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [draft, phase, target, level, workspace, currentWorkspace])\n\n // \u679A\u4E3E\u5DF2\u5B89\u88C5\u7684 agent \u9884\u8BBE\uFF08roster \u5B9E\u65F6\u8BFB\u53D6\uFF09\uFF0C\u7ED9\u9876\u90E8\u9884\u8BBE Tab \u4F9B\u8D27\u3002\n // \u62BD\u6210\u51FD\u6570\uFF1A\u4FDD\u5B58\u9884\u8BBE\u6210\u529F\u540E\u4E5F\u8981\u7ACB\u5373\u5237\u65B0 Tab \u884C\u3002\n const fetchPresets = (): void => {\n fetch(AGENT_PRESETS_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => {\n setAgentPresets(Array.isArray(body?.presets) ? body.presets as AgentPresetInfo[] : [])\n setCurrentPreset(typeof body?.currentPreset === 'string' && body.currentPreset !== '' ? body.currentPreset : undefined)\n })\n .catch(() => { setAgentPresets([]); setCurrentPreset(undefined) })\n }\n useEffect(() => { fetchPresets() }, [])\n\n // \u9ED8\u8BA4\u7F16\u8F91\u76EE\u6807\uFF1A\u9884\u8BBE\u540D\u5355\u5F02\u6B65\u5230\u8FBE\u540E\u8865\u9009\u4E00\u6B21\uFF08\u9996\u4E2A\u53EF\u7528\u9884\u8BBE\uFF0C\u5168\u5931\u6548\u5219\u9996\u4E2A\uFF09\u3002\n // \u53EA\u5728\u5C1A\u672A\u9009\u62E9\u65F6\u751F\u6548 \u2014\u2014 \u7528\u6237\u6B64\u540E\u5207\u6362 / \u540D\u5355\u5237\u65B0\u90FD\u4E0D\u8986\u76D6\u5F53\u524D\u9009\u62E9\u3002\n useEffect(() => {\n setTarget((current) => {\n if (current !== undefined) return current\n const live = currentPreset === undefined ? undefined : agentPresets.find((p) => p.id === currentPreset && !p.broken)\n if (live !== undefined) return live.id\n const first = agentPresets.find((p) => !p.broken) ?? agentPresets[0]\n return first?.id\n })\n }, [agentPresets, currentPreset])\n\n // \u4FDD\u5B58\u6210\u529F/\u5931\u8D25\u540E\u7684\u77ED\u4FC3\u95EA\u793A\u6D88\u606F\uFF083 \u79D2\u81EA\u52A8\u6D88\u5931\uFF1Berr \u7528\u7EA2\u8272\u6837\u5F0F\uFF09\u3002\n const showFlash = (text: string, kind: 'ok' | 'err' = 'ok'): void => {\n if (flashTimer.current !== null) clearTimeout(flashTimer.current)\n setFlash(text)\n setFlashKind(kind)\n flashTimer.current = setTimeout(() => setFlash(null), 3200)\n }\n\n\n // \u4E22\u5F03\u8349\u7A3F\uFF1A\u9012\u589E\u540C\u6B65\u5E8F\u53F7\uFF0C\u4F5C\u5E9F\u5728\u9014\u7684\u8349\u7A3F\u9884\u89C8\u54CD\u5E94\uFF08\u4FDD\u5B58\u540E GET \u4F1A\u6574\u4F53\u8986\u76D6\uFF0C\n // \u8FC7\u671F\u54CD\u5E94\u7EDD\u4E0D\u80FD\u53CD\u8FC7\u6765\u76D6\u6389\u6743\u5A01\u6570\u636E\uFF09\u3002\n const clearDraft = (): void => {\n syncSeq.current += 1\n setDraft(null)\n }\n\n if (cfg === null) {\n return h('div', { style: { ...s.pRoot, padding: 16 } }, t('loading'))\n }\n\n // \u7F16\u8F91\u89C6\u56FE\uFF1A\u8349\u7A3F\u5B58\u5728\u65F6\u4EE5\u8349\u7A3F\u8986\u76D6\u5BF9\u5E94\u5B57\u6BB5\uFF08\u4E24\u680F\u5171\u4EAB\u7F16\u8F91\u57DF\uFF09\u3002\n // \u8349\u7A3F\u53EA\u542B\u7528\u6237\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\uFF0C\u672A\u7F16\u8F91\u5B57\u6BB5\u56DE\u843D\u57FA\u7EBF \u2014\u2014 \u7EDD\u4E0D\u628A\u7EE7\u627F\u503C\n // \u51BB\u7ED3\u8FDB override\u3002\n // \u5DE5\u4F5C\u533A\u7EA7\uFF1A\u628A\u8BE5\u5DE5\u4F5C\u533A\u7684 override \u5F53\u4F5C\u7F16\u8F91\u6E90\uFF08\u53E0\u5728\u9884\u8BBE\u7EA7\u4E4B\u4E0A\u3001\u8FD0\u884C\u65F6\u5DE5\u4F5C\u533A\u4F18\u5148\uFF09\u3002\n const wsKey = workspace ?? currentWorkspace ?? undefined\n const base = level === 'workspace'\n ? overrideView(cfg, wsKey !== undefined ? workspaceOverrides[wsKey] : undefined)\n : editView(cfg, target)\n const view: Config = (() => {\n if (draft === null) return base\n const next: Config = {\n ...base,\n replacements: draft.replacements ?? base.replacements,\n inject: draft.inject ?? base.inject,\n tools: draft.tools ?? base.tools,\n }\n for (const phase of PHASES) {\n next[phase.sectionField] = draft[phase.sectionField] ?? base[phase.sectionField]\n next[phase.contextField] = draft[phase.contextField] ?? base[phase.contextField]\n }\n return next\n })()\n // \u4E09\u6001\u57FA\u5EA7\u59CB\u7EC8\u7528\u300C\u6240\u9009\u9884\u8BBE\u300D\u7684\u9010\u9636\u6BB5\u88C5\u914D\uFF08\u9884\u8BBE\u8D85\u96C6\uFF09\u3002\u5DE5\u4F5C\u533A\u7EA7\u4E0D\u80FD\u62FF\u5F53\u524D\u4F1A\u8BDD\n // \u89C6\u56FE\u9876\u66FF\uFF1A\u4F1A\u8BDD\u53EF\u80FD\u5C5E\u4E8E\u522B\u7684\u9884\u8BBE\uFF0C\u4F1A\u628A\u8BE5\u9884\u8BBE\u7684\u4E13\u5C5E\u6BB5/\u5DE5\u5177\u6F0F\u6389\uFF08\u5982 ptc \u7684 tools:ptc-only\uFF09\u3002\n const ep: PhaseViews | null = phases\n\n const writeField = (field: string, value: unknown): Promise<boolean> => {\n const url = value === undefined ? CONFIG_UNSET_URL : CONFIG_SET_URL\n return enqueueWrite(async () => {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ field, value }),\n })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'write failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n return true\n }).catch((e: unknown) => {\n setError(String(e instanceof Error ? e.message : e))\n return false\n })\n }\n\n const writeGlobalBatch = (fields: Record<string, unknown>): Promise<boolean> => {\n return enqueueWrite(async () => {\n const response = await fetch(CONFIG_BATCH_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ fields }),\n })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'batch write failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n return true\n }).catch((e: unknown) => {\n setError(String(e instanceof Error ? e.message : e))\n return false\n })\n }\n\n // \u4E24\u680F\u7684\u5199\u5165\uFF1A\u53EA\u6539\u5185\u5B58\u8349\u7A3F\uFF0C\u4E0D\u843D\u76D8\u3002\u8349\u7A3F\u53EA\u8BB0\u5F55\u88AB\u7F16\u8F91\u7684\u8FD9\u4E00\u5B57\u6BB5 \u2014\u2014 \u4FDD\u5B58\u65F6\n // \u4E5F\u53EA\u4F1A\u63D0\u4EA4\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\u3002/config/apply \u5FC5\u5E26 target\uFF08agent \u9884\u8BBE id\uFF0C0.9.0\n // \u8D77\u670D\u52A1\u7AEF\u62D2\u7EDD\u65E0\u76EE\u6807\u5199\u76D8\uFF09\uFF0C\u5199 overrides[id]\uFF08\u5B57\u6BB5\u7EA7\u63A5\u7BA1\u8BED\u4E49\u5728\u4FDD\u5B58\u65F6\u751F\u6548\uFF09\u3002\n const edit = (field: EditField, value: unknown): void => {\n setDraft((d) => ({\n ...(d ?? { dirty: false }),\n [field]: value,\n dirty: true,\n }))\n }\n\n // \u7EDF\u4E00\u4FDD\u5B58\uFF1A\u8349\u7A3F\u91CC\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\u4E00\u6B21 POST \u5230 /config/apply\uFF0C\u6210\u529F\u540E\u6E05\n // \u8349\u7A3F\u5E76\u91C7\u7EB3\u6700\u65B0\u914D\u7F6E\u3002\u5931\u8D25\u65F6\u4FDD\u7559\u8349\u7A3F\uFF08\u6539\u5B8C\u53EF\u4EE5\u518D\u8BD5\uFF0C\u4E0D\u4F1A\u4E22\uFF09\u3002\n const save = (): void => {\n if (draft === null || saving) return\n if (level === 'workspace' && wsKey === undefined) { showFlash(t('workspaceRequired'), 'err'); return }\n const patch: Record<string, unknown> = {}\n const edited = draft as unknown as Record<string, unknown>\n for (const field of DRAFT_FIELDS) {\n if (Object.hasOwn(edited, field)) patch[field] = edited[field]\n }\n setSaving(true)\n // \u4FDD\u5B58\u4E5F\u5FC5\u987B\u8D70\u540C\u4E00\u6761\u5199\u961F\u5217\uFF1A\u9884\u8BBE Apply/Delete/Import \u5C1A\u672A\u5B8C\u6210\u65F6\u70B9\u4FDD\u5B58\uFF0C\n // \u4E0D\u4F1A\u548C\u5B83\u4EEC\u5E76\u53D1\u8986\u76D6\u3002\n void enqueueWrite(async () => {\n const response = await fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(level === 'workspace' ? { level: 'workspace', workspace: wsKey, patch } : { target, patch }),\n })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'save failed')\n setCfg(body.config as Config)\n if (body.workspaceOverrides !== undefined) setWorkspaceOverrides(body.workspaceOverrides as Record<string, Config>)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('saveOk'))\n }).catch((e: unknown) => setError(`${t('saveFail')}: ${e instanceof Error ? e.message : String(e)}`))\n .finally(() => setSaving(false))\n }\n\n // \u9884\u8BBE\u6A21\u5F0F\u7684\u300C\u5E94\u7528\u300D\uFF1A\u663E\u5F0F\u610F\u56FE\u76F4\u63A5\u843D\u76D8\uFF08\u4E0D\u7ECF\u8349\u7A3F\uFF09\uFF0C\u5B8C\u6574\u8865\u4E01\u4E00\u6B21\u5199\u5165\u5F53\u524D\n // \u7F16\u8F91\u76EE\u6807\u3002\u8C03\u7528\u70B9\u5DF2\u5728\u79BB\u5F00\u7F16\u8F91\u57DF\u65F6\u6E05\u7A7A\u8349\u7A3F\uFF0C\u4E0D\u4F1A\u6709\u5E76\u53D1\u8349\u7A3F\u5199\u76D8\u3002\n const writePatch = (patch: ConfigPatch): Promise<boolean> => {\n return enqueueWrite(async () => {\n const response = await fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'apply failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n return true\n }).catch((e: unknown) => {\n setError(String(e instanceof Error ? e.message : e))\n return false\n })\n }\n // \u5E94\u7528\u5FEB\u7167\uFF1A\u6309\u5F53\u524D\u5C42\u7EA7\u5199\u5165\u2014\u2014\u5DE5\u4F5C\u533A\u7EA7\u5199 workspaceOverrides[cwd]\uFF0C\u5426\u5219\u5199\u9884\u8BBE\u7EA7 overrides[target]\u3002\n const writePatchLayered = (patch: ConfigPatch): Promise<boolean> => {\n if (level === 'workspace') {\n const cwd = workspace ?? currentWorkspace\n if (cwd === undefined || cwd === null || cwd === '') { showFlash(t('workspaceRequired'), 'err'); return Promise.resolve(false) }\n return enqueueWrite(async () => {\n const response = await fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ level: 'workspace', workspace: cwd, patch }),\n })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'apply failed')\n setCfg(body.config as Config)\n if (body.workspaceOverrides !== undefined) setWorkspaceOverrides(body.workspaceOverrides as Record<string, Config>)\n setError(null)\n setVersion((n) => n + 1)\n return true\n }).catch((e: unknown) => {\n setError(String(e instanceof Error ? e.message : e))\n return false\n })\n }\n return writePatch(patch)\n }\n\n // \u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\u663E\u9690\uFF1A\u548C\u63D0\u793A\u8BCD/\u5DE5\u5177\u4E00\u6837\u8FDB\u8349\u7A3F\uFF0C\u7EDF\u4E00\u4FDD\u5B58\u65F6\u4E00\u6B21\u843D\u76D8\uFF1B\u4E0D\u7ACB\u5373\u5237\u65B0\u3002\n // \u6BCF\u4E2A\u9636\u6BB5\u53EA\u7528\u5404\u81EA\u7684 baseContexts \u8BA1\u7B97 hidden\uFF1B\u4E09\u6001\u540C\u6B65\u8981\u6C42\u4E09\u9636\u6BB5\u90FD\u5C31\u7EEA\n // \uFF08\u7F3A\u4E00\u6001\u7EDD\u4E0D\u628A\u8BE5\u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\uFF09\u3002\n const toggleContext = (entry: EntryRef, hide: boolean): void => {\n const keys = syncAll ? PHASE_KEYS : [phase]\n const targets = keys.map((key) => ({ key, view: phases?.[key] }))\n if (targets.some(({ view }) => view === null || view === undefined || !Array.isArray(view.baseContexts))) {\n showFlash(t('contextsNotReady'), 'err')\n return\n }\n for (const { key } of targets) {\n const patch = contextPatch(view, key, entry, hide)\n for (const [field, value] of Object.entries(patch)) edit(field as ContextField, value)\n }\n }\n // \u9884\u8BBE\u5E93\uFF08presets / activePreset\uFF09\u6C38\u8FDC\u4FDD\u6301\u5728\u5168\u5C40\u5B57\u6BB5\uFF0C\u4E0D\u5206\u4F5C\u7528\u57DF\u3002\n const writeGlobal = writeField\n\n /** \u8BE5\u6761\u76EE\u662F\u5426\u5728\u76EE\u6807\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\uFF08base \u89C6\u56FE\uFF09\u91CC\uFF1A\u955C\u50CF\u65F6\u636E\u6B64\u51B3\u5B9A\u300C\u53EA\u5199 order\u300D\u8FD8\u662F\u300C\u5FC5\u987B\u5E26\u6B63\u6587\u300D\u3002 */\n const nativeIn = (key: PhaseKey, entry: EntryRef): boolean | null => {\n const view = ep?.[key]\n if (view === undefined || view === null) return null\n return (view.baseSections ?? []).some((section) => sameEntry(section, entry))\n }\n\n // \u300C\u4E09\u6001\u540C\u6B65\u300D\u5F00\u5173\uFF08\u5934\u90E8\u5DE5\u5177\u680F\uFF09\uFF1A\u52FE\u9009\u77AC\u95F4\u5373\u6309\u5E38\u9A7B\u671F\u7684\u5E76\u96C6\u884C\u96C6\u8986\u5199\u53E6\u5916\u4E24\u6001\n // \uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\uFF1B\u4E4B\u540E\u63D0\u793A\u8BCD\u680F\u7684\u4EFB\u4F55\n // \u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u90FD\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08\u89C1 SectionsPane \u7684 persistMirror\uFF09\u3002\n // \u4E09\u9636\u6BB5\u88C5\u914D\u672A\u5C31\u7EEA\uFF08\u6216\u4E3A\u7A7A\uFF09\u65F6\u62D2\u7EDD\u6267\u884C \u2014\u2014 \u7F3A\u4E00\u6001\u4F1A\u628A\u8BE5\u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\u3002\n const toggleSyncAll = (on: boolean): void => {\n if (!on) { setSyncAll(false); return }\n if (ep === null || PHASE_KEYS.some((key) => ep[key] === null)) {\n showFlash(t('syncNotReady'), 'err')\n return\n }\n const rows = mirroredRows(view, ep, nativeIn)\n if (rows.length === 0) {\n showFlash(t('syncNotReady'), 'err')\n return\n }\n setSyncAll(true)\n edit('inject', mirrorPhaseInjectEntries(view, rows, nativeIn))\n const denied = mirroredDeniedLists(rows)\n for (const descriptor of PHASES) edit(descriptor.sectionField, denied[descriptor.sectionField])\n const skipped = mirrorSkippedNames(rows, nativeIn)\n showFlash(skipped.length > 0\n ? `${t('syncApplied')} ${t('syncSkippedDynamic', { names: skipped.join('\u3001') })}`\n : t('syncApplied'))\n }\n\n // \u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u670D\u52A1\u7AEF\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u5173\u95ED forceSections\uFF08\u4E0E\u4E0D\u88C5\u63D2\u4EF6\u7B49\u6548\uFF09\u3002\n // \u4E8C\u6B21\u786E\u8BA4\u7531\u8BBE\u7F6E\u680F\u7684\u8C03\u7528\u70B9\u8D1F\u8D23\uFF1B\u6210\u529F\u540E\u6E05\u8349\u7A3F\u3001\u91CD\u62C9\u5168\u90E8\u89C6\u56FE\u3002\n const resetAll = (): void => {\n void enqueueWrite(async () => {\n const response = await fetch(CONFIG_RESET_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'reset failed')\n setCfg(body.config as Config)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('resetOk'))\n }).catch((e: unknown) => setError(`${t('resetFail')}: ${e instanceof Error ? e.message : String(e)}`))\n }\n\n // \u5207\u6362\u6A21\u5F0F\uFF1A\u63D0\u793A\u8BCD \u2194 \u5DE5\u5177\u662F\u540C\u4E00\u7F16\u8F91\u57DF\uFF0C\u8349\u7A3F\u4FDD\u7559\uFF1B\u5207\u5230\u9884\u8BBE\u5373\u79BB\u5F00\u7F16\u8F91\u57DF\uFF0C\n // \u810F\u8349\u7A3F\u7ECF\u786E\u8BA4\u540E\u4E22\u5F03\u3002\u53F3\u680F\u9884\u89C8\u5B50\u89C6\u56FE\u8DDF\u968F\u6A21\u5F0F\u3002\n const switchMode = (next: PanelMode): void => {\n const leaving = (mode === 'sections' || mode === 'tools') && next === 'presets'\n if (leaving) {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n clearDraft()\n }\n setMode(next)\n setPreviewSub(next === 'tools' ? 'tools' : 'prompt')\n }\n\n // \u5207\u6362\u81EA\u5B9A\u4E49\u5C42\u7EA7\uFF1A\u9884\u8BBE\u7EA7 \u2194 \u5DE5\u4F5C\u533A\u7EA7\uFF08\u5DE5\u4F5C\u533A\u7EA7\u4F5C\u7528\u4E8E\u5F53\u524D\u5DE5\u4F5C\u533A\u3001\u8986\u76D6\u9884\u8BBE\u7EA7\uFF09\u3002\n\n // \u5207\u6362\u7F16\u8F91\u76EE\u6807\uFF08\u9876\u90E8\u9884\u8BBE Tab\uFF09\uFF1A\u8349\u7A3F\u57FA\u7EBF\u968F\u76EE\u6807\u53D8\u5316\uFF0C\u810F\u8349\u7A3F\u5148\u7ECF\u786E\u8BA4\u518D\u4E22\u5F03\u3002\n const switchTarget = (next: string | undefined): void => {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n clearDraft()\n setTarget(next)\n }\n\n // \u5355\u9884\u8BBE\u5B9A\u5236\u5BFC\u5165/\u5BFC\u51FA\uFF1A\u53EA\u8BFB\u5199 overrides[target]\uFF0C\u4E0D\u6D89\u53CA\u5BBF\u4E3B\u9884\u8BBE\u5B9A\u4E49\u3002\n const exportPreset = (): void => {\n if (target === undefined) { showFlash(t('presetIoNoTarget'), 'err'); return }\n fetch(`/api/prompt-customizer/export?scope=${encodeURIComponent(target)}`)\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'export failed')\n const filename = `prompt-customizer-${target}.json`\n const text = JSON.stringify(body, null, 2)\n const io = makeIoEnv()\n void io.saveText(filename, text).then((outcome) => {\n if (outcome.kind === 'saved') showFlash(t('presetIoOk', { name: filename }), 'ok')\n else if (outcome.kind === 'unavailable') { io.download(filename, text); showFlash(t('presetIoOk', { name: filename }), 'ok') }\n })\n })\n .catch((e: unknown) => showFlash(`${t('presetIoFail')}: ${String(e instanceof Error ? e.message : e)}`, 'err'))\n }\n\n const importPreset = (text: string): void => {\n if (target === undefined) { showFlash(t('presetIoNoTarget'), 'err'); return }\n let parsed: { format?: unknown; customization?: unknown }\n try { parsed = JSON.parse(text) } catch { showFlash(t('presetIoBadFormat'), 'err'); return }\n const customization = parsed?.customization\n if (parsed?.format !== 'dsh-prompt-customizer/export@1' || customization === null || typeof customization !== 'object' || Array.isArray(customization)) {\n showFlash(t('presetIoBadFormat'), 'err')\n return\n }\n if (!window.confirm(t('presetIoConfirm', { target }))) return\n void enqueueWrite(async () => {\n const response = await fetch('/api/prompt-customizer/import', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, customization }),\n })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'import failed')\n setCfg(body.config as Config)\n setVersion((n) => n + 1)\n showFlash(t('presetIoImported'), 'ok')\n }).catch((e: unknown) => showFlash(`${t('presetIoFail')}: ${String(e instanceof Error ? e.message : e)}`, 'err'))\n }\n\n const cleanupEmpty = (): void => {\n if (cleaning) return\n if (!window.confirm(t('cleanupConfirm'))) return\n setCleaning(true)\n void enqueueWrite(async () => {\n const response = await fetch('/api/prompt-customizer/overrides/cleanup', { method: 'POST' })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'cleanup failed')\n setCfg(body.config as Config)\n setVersion((n) => n + 1)\n showFlash(t('cleanupOk', { n: Array.isArray(body.removed) ? body.removed.length : 0 }), 'ok')\n }).catch((e: unknown) => showFlash(`${t('cleanupFail')}: ${String(e instanceof Error ? e.message : e)}`, 'err'))\n .finally(() => setCleaning(false))\n }\n\n // \u5168\u91CF\u5907\u4EFD\uFF1A\u6574\u5E93\uFF08\u5168\u90E8\u63D0\u793A\u8BCD\u914D\u7F6E + \u76EE\u5F55\u6C60 + \u8D26\u672C\uFF09\u5BFC\u51FA\u4E3A JSON\u3002\n const backupAll = (): void => {\n if (backingUp) return\n setBackingUp(true)\n fetch('/api/prompt-customizer/backup')\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'backup failed')\n const filename = `dsh-prompt-customizer-backup-${new Date().toISOString().slice(0, 10)}.json`\n const text = JSON.stringify(body, null, 2)\n const io = makeIoEnv()\n void io.saveText(filename, text).then((outcome) => {\n if (outcome.kind === 'saved') showFlash(t('backupOk', { name: filename }), 'ok')\n else if (outcome.kind === 'unavailable') { io.download(filename, text); showFlash(t('backupOk', { name: filename }), 'ok') }\n })\n })\n .catch((e: unknown) => showFlash(`${t('backupFail')}\uFF1A${String(e instanceof Error ? e.message : e)}`, 'err'))\n .finally(() => setBackingUp(false))\n }\n\n // \u6062\u590D\uFF1A\u89E3\u6790\u5907\u4EFD JSON \u2192 \u4E8C\u6B21\u786E\u8BA4 \u2192 \u6574\u5E93\u66FF\u6362\u3002\n const restoreAll = (text: string): void => {\n let parsed: { format?: unknown; docs?: unknown }\n try { parsed = JSON.parse(text) } catch { showFlash(t('restoreBadFormat'), 'err'); return }\n if (parsed?.format !== 'dsh-prompt-customizer/backup@1' || parsed.docs === null || typeof parsed.docs !== 'object') {\n showFlash(t('restoreBadFormat'), 'err')\n return\n }\n if (!window.confirm(t('restoreConfirm'))) return\n setRestoring(true)\n void enqueueWrite(async () => {\n const response = await fetch('/api/prompt-customizer/restore', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(parsed),\n })\n const body = await response.json()\n if (body?.ok !== true) throw new Error(body?.error ?? 'restore failed')\n setCfg(body.config as Config)\n if (body.workspaceOverrides !== undefined) setWorkspaceOverrides(body.workspaceOverrides as Record<string, Config>)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('restoreOk'), 'ok')\n }).catch((e: unknown) => setError(`${t('restoreFail')}: ${e instanceof Error ? e.message : String(e)}`))\n .finally(() => setRestoring(false))\n }\n\n const modeBtn = (key: PanelMode, label: string): ReactElement =>\n h('button', { key, style: mode === key ? s.segBtnActive : s.segBtn, onClick: () => switchMode(key) }, label)\n\n // \u9636\u6BB5\u6309\u94AE\u547D\u540D\uFF08\u552F\u4E00\u6765\u6E90\uFF1APHASE_LABEL_KEY \u8868\uFF09\u3002\n const stageLabel = (key: PhaseKey): string => t(PHASE_LABEL_KEY[key])\n const draftDirty = draft?.dirty === true\n\n /**\n * \u7F16\u8F91\u76EE\u6807 chip\uFF1A\u4E0E SKILL / MCP \u9876\u680F\u7684\u9884\u8BBE chips \u7528\u540C\u4E00\u5957\u7C7B\u540D\uFF08\u51E0\u4F55\u3001\u914D\u8272\u3001\n * \u60AC\u505C\u4E0E\u9009\u4E2D\u6001\u5B8C\u5168\u5BF9\u9F50\uFF09\u3002\u5C3E\u90E8\u6570\u5B57 = \u8BE5\u9884\u8BBE\u5DF2\u5B9A\u5236\u7684\u5B57\u6BB5\u6570\uFF08\u6709\u5219\u6A59\u8272\uFF09\uFF0C\n * \u4E0E MCP \u7684\u300C\u6570\u5B57 + \u6A59\u8272 = \u6709\u5355\u72EC\u8BBE\u7F6E\u300D\u540C\u4E00\u8BFB\u6CD5\uFF1B\u5931\u6548\u9884\u8BBE\u7F6E\u6362\u6210\u300C\u5931\u6548\u300D\u6807\u8BB0\u3002\n */\n const targetChip = (id: string, label: string, icon: ReactElement, broken?: string): ReactElement => {\n const active = target === id\n const bad = broken !== undefined && broken !== ''\n // \u53EA\u7EDF\u8BA1\u300C\u975E\u7A7A\u300D\u5B57\u6BB5\uFF1A\u7A7A\u6570\u7EC4 / \u7A7A\u5BF9\u8C61\u4E0D\u7B97\u5B9A\u5236\uFF08\u5426\u5219\u6BCF\u4E2A\u9884\u8BBE\u90FD\u663E\u793A\u6EE1\u8BA1\u6570\uFF09\u3002\n const customized = Object.values(cfg?.overrides?.[id] ?? {}).filter(hasContent).length\n return h('button', {\n key: id,\n type: 'button',\n className: css.catItem,\n 'data-active': active || undefined,\n onClick: () => switchTarget(id),\n title: bad\n ? `${label} \u2014 ${t('broken')}`\n : customized > 0 ? `${label} \u00B7 ${t('targetCustomized', { n: customized })}` : label,\n }, [\n h('span', { className: css.catIcon, 'data-active': active || undefined }, icon),\n h('span', { className: css.catLabel }, label),\n bad ? h('span', { className: css.catCount, 'data-warn': true }, t('broken')) : null,\n !bad && customized > 0 ? h('span', { className: css.catCount, 'data-warn': true }, String(customized)) : null,\n ])\n }\n\n return h('div', { style: s.pRoot }, [\n // \u2500\u2500 \u7B2C\u4E00\u884C\uFF1Aagent \u9884\u8BBE\uFF08\u7F16\u8F91\u76EE\u6807\uFF09\u2500\u2500\n // \u4E0E SKILL / MCP \u9876\u680F\u540C\u6B3E chips \u884C\uFF08\u540C\u4E00\u5957\u7C7B\u540D + \u56FE\u6807 + \u8BA1\u6570\uFF09\uFF0C\u4E14\u6392\u5728\n // \u5B9A\u5236\u9762\u677F\u81EA\u5DF1\u7684\u5934\u90E8\u4E4B\u4E0A\uFF1A\u4E09\u4E2A tab \u7684\u300C\u9884\u8BBE\u5728\u4E0A\u300D\u8282\u594F\u4E00\u81F4\u3002\n // 0.9.0 \u8D77\u300C\u5168\u90E8 Agent\u300D\u5165\u53E3\u79FB\u9664\uFF1A\u63D0\u793A\u8BCD\u5FC5\u987B\u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF0C\u65E0\u5168\u5C40\u76EE\u6807\u3002\n h('div', { key: 'targets', className: css.topbar }, [\n h('div', { className: css.chipRow, role: 'group', 'aria-label': t('targetLabel') }, [\n ...agentPresets.map((p) => targetChip(p.id, p.name, h(IconAgentPresetOutlineRegular, { size: 15 }), p.broken)),\n ]),\n ]),\n // \u2500\u2500 \u7B2C\u4E8C\u884C\uFF1A\u6807\u9898 + \u6A21\u5F0F\u5207\u6362 + \uFF08\u9636\u6BB5\u5207\u6362 + \u5F00\u5173\uFF09 + \u5DE5\u5177\u680F \u2500\u2500\n // \u9636\u6BB5\u6309\u94AE\u5408\u5E76\u653E\u5728\u4E09\u6001\u540C\u6B65\u9009\u62E9\u6846\u5DE6\u4FA7\uFF1A\u5DE6\u680F\u5217\u8868\u4E0E\u53F3\u680F\u9884\u89C8\u8DDF\u7740\u540C\u4E00\u4E2A\n // \u9636\u6BB5\u72B6\u6001\u8D70\uFF0C\u4E00\u5904\u5207\u6362\u4E24\u8FB9\u8054\u52A8\u3002\u4EC5\u5728\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u4E2A\u6A21\u5F0F\u663E\u793A\u3002\n h('div', { style: s.head }, [\n h('span', { style: s.headTitle }, [\n h('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': 'true', style: { flex: 'none' } }, [\n h('path', { d: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z' }),\n h('path', { d: 'M14 2v6h6' }),\n h('path', { d: 'M16 13H8' }),\n h('path', { d: 'M16 17H8' }),\n h('path', { d: 'M10 9H8' }),\n ]),\n t('nav'),\n ]),\n h('div', { style: s.seg }, [\n modeBtn('sections', t('tabsSections')),\n modeBtn('tools', t('tabsTools')),\n modeBtn('presets', t('tabsPresets')),\n ]),\n h('div', { style: s.headActions }, [\n mode === 'sections' || mode === 'tools'\n ? h('div', { style: s.seg }, PHASE_KEYS.map((key) => h('button', {\n key,\n style: dropPhase === key\n ? (phase === key ? s.segBtnDropActive : s.segBtnDrop)\n : phase === key ? s.segBtnActive : s.segBtn,\n onClick: () => setPhase(key),\n // \u62D6\u5230\u9636\u6BB5 Tab = \u628A\u884C\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u6BB5 / \u5DE5\u5177\u5404\u6309\u81EA\u5DF1\u7684\u8BED\u4E49\u843D\u5730\uFF09\u3002\n onDragOver: (event: ReactDragEvent) => {\n if (payloadOf(event) === null) return\n event.preventDefault()\n setDropPhase(key)\n },\n onDragLeave: () => setDropPhase((current) => (current === key ? null : current)),\n onDrop: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n setDropPhase(null)\n if (payload === null) return\n event.preventDefault()\n dropOnPhase(key, payload)\n },\n }, stageLabel(key))))\n : null,\n draftDirty && (mode === 'sections' || mode === 'tools')\n ? h('span', { style: s.badgeReplaced, title: t('draftBadge') }, t('draftBadge'))\n : null,\n mode === 'sections' || mode === 'tools'\n ? h('label', {\n style: { ...s.muted, display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer', whiteSpace: 'nowrap' },\n title: t('syncAllPhasesHint'),\n }, [\n h('input', {\n type: 'checkbox',\n checked: syncAll,\n onChange: (e: { target: { checked: boolean } }) => toggleSyncAll(e.target.checked),\n style: { margin: 0, cursor: 'pointer' },\n }),\n t('syncAllPhases'),\n ])\n : null,\n h('button', {\n style: draft?.dirty ? s.saveBtnDirty : s.saveBtn,\n disabled: !draft?.dirty || saving,\n onClick: save,\n }, t('save')),\n // \u5237\u65B0 = GET \u78C1\u76D8\u6743\u5A01\u72B6\u6001\uFF1B\u6709\u810F\u8349\u7A3F\u65F6\u518D\u8865\u4E00\u6B21\u5F53\u524D\u9636\u6BB5\u7684\u8349\u7A3F\u53E0\u52A0\u9884\u89C8\uFF0C\n // \u907F\u514D\u9884\u89C8\u77ED\u6682\u56DE\u9000\u5230\u300C\u4E0A\u6B21\u4FDD\u5B58\u300D\u7684\u72B6\u6001\u3002\n h('button', { style: s.saveBtn, onClick: () => { void refresh().then(() => syncDraftPreview()) } }, t('refresh')),\n // \u5173\u95ED\u6309\u94AE\u53EA\u5728\u72EC\u7ACB\u5F00\u7A97\u65F6\u7ED9\u51FA\uFF08onClose \u7F3A\u7701 = \u7531\u5916\u5C42 tab \u627F\u8F7D\uFF0C\u4E0D\u9700\u8981\u5B83\uFF09\u3002\n onClose === undefined ? null : h('button', { style: s.iconBtn, onClick: onClose, 'aria-label': t('close'), title: t('close') },\n h('svg', { width: 15, height: 15, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': 'true' }, [\n h('path', { d: 'M4 4l8 8M12 4l-8 8', stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round' }),\n ])),\n ]),\n ]),\n // \u2500\u2500 \u6D88\u606F\u6761\uFF08\u9519\u8BEF / \u95EA\u793A / \u76EE\u6807\u5F02\u5E38\u8B66\u793A\uFF09 \u2500\u2500\n h('div', { style: { padding: '0 14px' } }, [\n error ? h('div', { style: s.error }, String(error)) : null,\n flash ? h('div', { style: flashKind === 'err' ? s.error : s.noticeOk }, flash) : null,\n target && agentPresets.find((p) => p.id === target)?.broken\n ? h('div', { style: s.error }, t('brokenPreset'))\n : null,\n inv?.scopeResolved === false && mode !== 'presets'\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n level === 'workspace' && currentWorkspace === undefined\n ? h('div', { style: s.noticeWarn }, t('workspaceNoSession'))\n : null,\n ]),\n // \u2500\u2500 \u4E3B\u4F53\u5206\u680F\uFF08flex row\uFF1A\u5DE6\u680F\u5217\u8868 / \u53F3\u680F\u9884\u89C8\uFF09\u2500\u2500\n // \u9876\u90E8\u9009\u300C\u63D0\u793A\u8BCD\u300D= \u63D0\u793A\u8BCD\u7F16\u8F91 + \u63D0\u793A\u8BCD\u9884\u89C8\uFF1B\u9009\u300C\u5DE5\u5177\u300D= \u5DE5\u5177\u7F16\u8F91 +\n // \u5DE5\u5177\u9884\u89C8\uFF08previewSub \u8DDF\u968F\u6A21\u5F0F\uFF0C\u65E0\u624B\u52A8\u5207\u6362\uFF09\u3002\u9636\u6BB5\u7531\u5934\u90E8\u7EDF\u4E00\u63A7\u5236\u3002\n h('div', { key: 'body', style: s.body },\n mode === 'sections'\n ? [\n h(SectionsPane, { key: 'sections', cfg: view, inv, phases: ep, phase, syncAll, t, write: edit }),\n h(PreviewPane, { key: 'preview', t, phases: ep, phase, sub: previewSub, onToggleContext: toggleContext }),\n ]\n : mode === 'tools'\n ? [\n h(ToolsPane, {\n key: 'tools',\n cfg: view,\n inv,\n phases: ep,\n phase,\n syncAll,\n t,\n write: edit,\n onOpenSection: () => switchMode('sections'),\n }),\n h(PreviewPane, { key: 'preview', t, phases: ep, phase, sub: previewSub, onToggleContext: toggleContext }),\n ]\n : [\n h(PresetsPane, {\n key: 'presets',\n cfg: view,\n inv,\n phases: ep,\n t,\n writePatch: writePatchLayered,\n applyLevel: level,\n applyTargetName: level === 'workspace' ? (workspace ?? currentWorkspace ?? undefined) : target,\n writeGlobal,\n writeGlobalBatch,\n // \u9ED1\u540D\u5355\u6C38\u8FDC\u662F\u5168\u5C40\u5B57\u6BB5\uFF1A\u53D6\u539F\u59CB\u914D\u7F6E\uFF08\u4E0D\u7ECF editView \u7684\u76EE\u6807\u53E0\u52A0\uFF09\u3002\n envBlocklist: cfg.envBlocklist ?? [],\n }),\n h(SettingsPane, {\n key: 'settings',\n cfg: view,\n inv,\n t,\n writeGlobal,\n onBackupAll: backupAll,\n onRestoreAll: restoreAll,\n backingUp,\n restoring,\n cleaning,\n target,\n onExportPreset: exportPreset,\n onImportPreset: importPreset,\n onCleanupEmpty: cleanupEmpty,\n onReset: resetAll,\n envBlocklist: cfg.envBlocklist ?? [],\n }),\n ]),\n ])\n}\n", "/**\n * skills/styles \u2014 \u9762\u677F\u5168\u5957\u6837\u5F0F\uFF1Acss \u7C7B\u540D\u8868 + \u6CE8\u5165\u7528\u7684 SHEET + ensureStyles()\u3002\n */\n\n/** ---------------------------------------------------------------- \u6837\u5F0F */\n\nexport const css = {\n entry: 'skm-entry',\n label: 'skm-label',\n // SKILL / MCP \u9876\u5C42 tab + MCP \u5360\u4F4D\n kindTabs: 'skm-kind-tabs',\n kindTab: 'skm-kind-tab',\n kindTabActive: 'skm-kind-tab-active',\n mcpEmpty: 'skm-mcp-empty',\n mcpEmptyIcon: 'skm-mcp-empty-icon',\n mcpEmptyTitle: 'skm-mcp-empty-title',\n mcpEmptyDesc: 'skm-mcp-empty-desc',\n mcpPage: 'skm-mcp-view-root',\n mcpViewRoot: 'skm-mcp-view-root',\n mcpSide: 'skm-mcp-side',\n mcpMain: 'skm-mcp-main',\n mcpServerLayout: 'skm-mcp-server-layout',\n mcpServerMain: 'skm-mcp-server-main',\n mcpHeader: 'skm-mcp-header',\n mcpHeaderText: 'skm-mcp-header-text',\n mcpHeaderTitleRow: 'skm-mcp-header-title-row',\n mcpHeaderTitle: 'skm-mcp-header-title',\n mcpHeaderBadge: 'skm-mcp-header-badge',\n mcpHeaderSub: 'skm-mcp-header-sub',\n mcpHeaderActions: 'skm-mcp-header-actions',\n mcpMarketBtn: 'skm-mcp-market-btn',\n mcpAddBtn: 'skm-mcp-add-btn',\n mcpBellBtn: 'skm-mcp-bell-btn',\n mcpEmptyList: 'skm-mcp-empty-list',\n mcpCopyHint: 'skm-mcp-copy-hint',\n mcpIntroCard: 'skm-mcp-intro-card',\n mcpIntroBody: 'skm-mcp-intro-body',\n mcpIntroTitle: 'skm-mcp-intro-title',\n mcpIntroDesc: 'skm-mcp-intro-desc',\n mcpIntroBtn: 'skm-mcp-intro-btn',\n mcpInfoOverlay: 'skm-mcp-info-overlay',\n mcpInfoOverlayHead: 'skm-mcp-info-overlay-head',\n mcpInfoOverlayIcon: 'skm-mcp-info-overlay-icon',\n mcpInfoOverlayTitle: 'skm-mcp-info-overlay-title',\n mcpInfoOverlayBody: 'skm-mcp-info-overlay-body',\n mcpRow: 'skm-mcp-row',\n mcpRowLogo: 'skm-mcp-row-logo',\n mcpRowBody: 'skm-mcp-row-body',\n mcpRowNameRow: 'skm-mcp-row-name-row',\n mcpRowName: 'skm-mcp-row-name',\n mcpRowTag: 'skm-mcp-row-tag',\n mcpRowExt: 'skm-mcp-row-ext',\n mcpRowDesc: 'skm-mcp-row-desc',\n mcpRowStatus: 'skm-mcp-row-status',\n mcpViewAll: 'skm-mcp-view-all',\n mcpAddSmallBtn: 'skm-mcp-add-small-btn',\n mcpRecommendTitle: 'skm-mcp-recommend-title',\n mcpRecHead: 'skm-mcp-rec-head',\n mcpRecCatsRow: 'skm-mcp-rec-cats-row',\n mcpRecResultsTitle: 'skm-mcp-rec-results-title',\n mcpRecStars: 'skm-mcp-rec-stars',\n mcpOpenLink: 'skm-mcp-open-link',\n mcpRecCardExternal: 'skm-mcp-rec-card-external',\n mcpResolveErr: 'skm-mcp-resolve-err',\n mcpExtActions: 'skm-mcp-ext-actions',\n mcpCardFoot: 'skm-mcp-card-foot',\n mcpCardItem: 'skm-mcp-card-item',\n mcpCardItemLabel: 'skm-mcp-card-item-label',\n mcpCardItemMeta: 'skm-mcp-card-item-meta',\n mcpCardDelete: 'skm-mcp-card-delete',\n mcpToolChips: 'skm-mcp-tool-chips',\n mcpToolChip: 'skm-mcp-tool-chip',\n mcpRecCats: 'skm-mcp-rec-cats',\n mcpRecCat: 'skm-mcp-rec-cat',\n mcpRecCatActive: 'skm-mcp-rec-cat-active',\n mcpRecGrid: 'skm-mcp-rec-grid',\n mcpRecCard: 'skm-mcp-rec-card',\n mcpRecCardHead: 'skm-mcp-rec-card-head',\n mcpRecCardTitleRow: 'skm-mcp-rec-card-title-row',\n mcpRecCardName: 'skm-mcp-rec-card-name',\n mcpRecCardTags: 'skm-mcp-rec-card-tags',\n mcpRecCatTag: 'skm-mcp-rec-cat-tag',\n mcpRecCardDesc: 'skm-mcp-rec-card-desc',\n mcpRecCardFoot: 'skm-mcp-rec-card-foot',\n mcpRecCardMeta: 'skm-mcp-rec-card-meta',\n mcpAddedTag: 'skm-mcp-added-tag',\n mcpAddForm: 'skm-mcp-add-form',\n mcpAddTypeRow: 'skm-mcp-add-type-row',\n mcpAddTypeBtn: 'skm-mcp-add-type-btn',\n mcpAddTypeActive: 'skm-mcp-add-type-active',\n mcpToolSearch: 'skm-mcp-tool-search',\n mcpToolSearchInput: 'skm-mcp-tool-search-input',\n mcpConfigGrid: 'skm-mcp-config-grid',\n mcpConfigCard: 'skm-mcp-config-card',\n mcpConfigHead: 'skm-mcp-config-head',\n mcpConfigTitle: 'skm-mcp-config-title',\n mcpConfigCopy: 'skm-mcp-config-copy',\n mcpConfigCode: 'skm-mcp-config-code',\n mcpInfoCol: 'skm-mcp-info-col',\n mcpInfoCard: 'skm-mcp-info-card',\n mcpInfoCardTitle: 'skm-mcp-info-card-title',\n mcpInfoDesc: 'skm-mcp-info-desc',\n mcpInfoPoints: 'skm-mcp-info-points',\n mcpPoint: 'skm-mcp-point',\n mcpPointIcon: 'skm-mcp-point-icon',\n mcpPointBody: 'skm-mcp-point-body',\n mcpPointTitle: 'skm-mcp-point-title',\n mcpPointDesc: 'skm-mcp-point-desc',\n mcpFlow: 'skm-mcp-flow',\n mcpFlowNode: 'skm-mcp-flow-node',\n mcpFlowIcon: 'skm-mcp-flow-icon',\n mcpFlowLabel: 'skm-mcp-flow-label',\n mcpFlowArrow: 'skm-mcp-flow-arrow',\n mcpFlowArrowText: 'skm-mcp-flow-arrow-text',\n mcpFlowExt: 'skm-mcp-flow-ext',\n mcpFlowExtLabel: 'skm-mcp-flow-ext-label',\n mcpFlowExtIcons: 'skm-mcp-flow-ext-icons',\n mcpFlowExtIcon: 'skm-mcp-flow-ext-icon',\n mcpApiText: 'skm-mcp-api-text',\n mcpSteps: 'skm-mcp-steps',\n mcpStep: 'skm-mcp-step',\n mcpStepNum: 'skm-mcp-step-num',\n mcpStepBody: 'skm-mcp-step-body',\n mcpStepTitle: 'skm-mcp-step-title',\n mcpStepDesc: 'skm-mcp-step-desc',\n modal: 'skm-modal',\n modalBody: 'skm-modal-body',\n panel: 'skm-panel',\n topRow: 'skm-top-row',\n newBundleButton: 'skm-new-bundle',\n upload: 'skm-upload',\n uploadActive: 'skm-upload-active',\n hiddenInput: 'skm-hidden-input',\n installForm: 'skm-install-form',\n installRow: 'skm-install-row',\n inlineForm: 'skm-inline-form',\n // \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u9876\u680F\u80F6\u56CA\u884C / \u5305\u540D\u65C1\u6807\u7B7E / \u5206\u7C7B\u7F16\u8F91\u5668\n stackForm: 'skm-stack-form',\n catChipRow: 'skm-cat-chip-row',\n catChipLabel: 'skm-cat-chip-label',\n catChip: 'skm-cat-chip',\n catChipCount: 'skm-cat-chip-count',\n bundleCats: 'skm-bundle-cats',\n bundleCatTag: 'skm-bundle-cat-tag',\n catEditor: 'skm-cat-editor',\n catEmpty: 'skm-cat-empty',\n catSelected: 'skm-cat-selected',\n catSelectedTag: 'skm-cat-selected-tag',\n catSelectedName: 'skm-cat-selected-name',\n catRemove: 'skm-cat-remove',\n catSuggest: 'skm-cat-suggest',\n catPreset: 'skm-cat-preset',\n catPresetPlus: 'skm-cat-preset-plus',\n catInput: 'skm-cat-input',\n catLimit: 'skm-cat-limit',\n // \u5757\u7EA7\u53D8\u4F53\uFF1A\u6539\u540D\u8F93\u5165\u884C\u72EC\u5360\u4E00\u6574\u884C\uFF08\u6574\u884C\u5185\u5BB9\u4FDD\u7559\uFF0C\u8868\u5355\u8FFD\u52A0\u5728\u5176\u4E0B\u65B9\uFF09\u3002\n inlineFormBlock: 'skm-inline-form-block',\n inlineInput: 'skm-inline-input',\n bundleSelect: 'skm-bundle-select',\n installMeta: 'skm-install-meta',\n installActions: 'skm-install-actions',\n sectionTitle: 'skm-section-title',\n status: 'skm-status',\n failure: 'skm-failure',\n error: 'skm-error',\n bundleList: 'skm-bundle-list',\n bundle: 'skm-bundle',\n bundleRow: 'skm-bundle-row',\n bundleName: 'skm-bundle-name',\n bundleCount: 'skm-bundle-count',\n chevron: 'skm-chevron',\n bundleActions: 'skm-bundle-actions',\n iconAction: 'skm-icon-action',\n skillList: 'skm-skill-list',\n skillItem: 'skm-skill-item',\n skillRow: 'skm-skill-row',\n skillLabel: 'skm-skill-label',\n skillName: 'skm-skill-name',\n skillDescription: 'skm-skill-desc',\n skillExpand: 'skm-skill-expand',\n skillCount: 'skm-skill-count',\n skillCompat: 'skm-skill-compat',\n // \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\n skillGrid: 'skm-skill-grid',\n skillCard: 'skm-skill-card',\n skillCardHead: 'skm-skill-card-head',\n skillIcon: 'skm-skill-icon',\n skillBadge: 'skm-skill-badge',\n skillTitleWrap: 'skm-skill-title-wrap',\n skillTitle: 'skm-skill-title',\n skillCopy: 'skm-skill-copy',\n skillCardToggle: 'skm-skill-card-toggle',\n skillDesc: 'skm-skill-card-desc',\n skillTags: 'skm-skill-tags',\n tag: 'skm-tag',\n tagSource: 'skm-tag-source',\n tagScope: 'skm-tag-scope',\n skillMeta: 'skm-skill-meta',\n skillCardFoot: 'skm-skill-card-foot',\n skillFootLabel: 'skm-skill-foot-label',\n skillFootIcon: 'skm-skill-foot-icon',\n skillFootIconDanger: 'skm-skill-foot-icon-danger',\n skillCardActions: 'skm-skill-card-actions',\n // Skills Hub \u9875\u9762\u7ED3\u6784\n hub: 'skm-hub',\n hubRow: 'skm-hub-row',\n hubSide: 'skm-hub-side',\n topbar: 'skm-topbar',\n chipRow: 'skm-chip-row',\n hubBrand: 'skm-hub-brand',\n hubLogo: 'skm-hub-logo',\n hubBrandText: 'skm-hub-brand-text',\n hubBrandTitle: 'skm-hub-brand-title',\n hubBrandSub: 'skm-hub-brand-sub',\n hubGroup: 'skm-hub-group',\n hubItem: 'skm-hub-item',\n hubItemActive: 'skm-hub-item-active',\n hubItemIcon: 'skm-hub-item-icon',\n hubItemLabel: 'skm-hub-item-label',\n hubItemCount: 'skm-hub-item-count',\n // \u5DE6\u680F\uFF1A\u6280\u80FD\u5206\u7C7B / \u5FEB\u6377\u7B5B\u9009 / \u6DFB\u52A0\u6280\u80FD\u5361\n catTitle: 'skm-cat-title',\n catItem: 'skm-cat-item',\n catItemActive: 'skm-cat-item-active',\n catIcon: 'skm-cat-icon',\n catLabel: 'skm-cat-label',\n catCount: 'skm-cat-count',\n filterBlock: 'skm-filter-block',\n filterRow: 'skm-filter-row',\n filterRowLabel: 'skm-filter-row-label',\n filterRowLabelStrong: 'skm-filter-row-label-strong',\n filterRowChevron: 'skm-filter-row-chevron',\n filterRowWrap: 'skm-filter-row-wrap',\n filterMenu: 'skm-filter-menu',\n filterOption: 'skm-filter-option',\n presetDot: 'skm-preset-dot',\n filtersTitle: 'skm-filters-title',\n statusSeg: 'skm-status-seg',\n statusSegBtn: 'skm-status-seg-btn',\n statusSegActive: 'skm-status-seg-active',\n statusSegCount: 'skm-status-seg-count',\n topbarActions: 'skm-topbar-actions',\n healthInline: 'skm-health-inline',\n addCard: 'skm-add-card',\n addCardActive: 'skm-add-card-active',\n addCardHead: 'skm-add-card-head',\n addCardIcon: 'skm-add-card-icon',\n addCardTitle: 'skm-add-card-title',\n addCardSub: 'skm-add-card-sub',\n addDrop: 'skm-add-drop',\n addDropIcon: 'skm-add-drop-icon',\n addDropText: 'skm-add-drop-text',\n addDropHint: 'skm-add-drop-hint',\n addBtn: 'skm-add-btn',\n // \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\n guideCard: 'skm-guide-card',\n guideTitle: 'skm-guide-title',\n guideDesc: 'skm-guide-desc',\n guideBtn: 'skm-guide-btn',\n guideArt: 'skm-guide-art',\n // \u53F3\u4FA7\u6307\u5357\u680F\n guidePanel: 'skm-guide-panel',\n guidePanelHead: 'skm-guide-panel-head',\n guidePanelLogo: 'skm-guide-panel-logo',\n guidePanelTitle: 'skm-guide-panel-title',\n guidePanelClose: 'skm-guide-panel-close',\n guidePanelBody: 'skm-guide-panel-body',\n guideSec: 'skm-guide-sec',\n guideSecHead: 'skm-guide-sec-head',\n guideSecIcon: 'skm-guide-sec-icon',\n guideSecTitle: 'skm-guide-sec-title',\n guideWhatDesc: 'skm-guide-what-desc',\n guideCaps: 'skm-guide-caps',\n guideCap: 'skm-guide-cap',\n guideCapIcon: 'skm-guide-cap-icon',\n guideCapLabel: 'skm-guide-cap-label',\n guideStep: 'skm-guide-step',\n guideStepNum: 'skm-guide-step-num',\n guideStepBody: 'skm-guide-step-body',\n guideStepTitleRow: 'skm-guide-step-title-row',\n guideStepTitle: 'skm-guide-step-title',\n guideStepArrow: 'skm-guide-step-arrow',\n guideStepDesc: 'skm-guide-step-desc',\n guideFullBtn: 'skm-guide-full-btn',\n guideBest: 'skm-guide-best',\n guideBestTitle: 'skm-guide-best-title',\n guideBestList: 'skm-guide-best-list',\n guideBestItem: 'skm-guide-best-item',\n guideMoreBtn: 'skm-guide-more-btn',\n guideBestArt: 'skm-guide-best-art',\n hubMain: 'skm-hub-main',\n // \u5206\u7EC4\u884C\n bundleRowOuter: 'skm-bundle-row-outer',\n bundleIcon: 'skm-bundle-icon',\n bundleMore: 'skm-bundle-more',\n bundleMoreBtn: 'skm-bundle-more-btn',\n // \u5206\u9875\n pagination: 'skm-pagination',\n pageInfo: 'skm-page-info',\n pageBtns: 'skm-page-btns',\n pageBtn: 'skm-page-btn',\n pageBtnActive: 'skm-page-btn-active',\n pageSizeSel: 'skm-page-size-sel',\n newBundleBtn: 'skm-new-bundle-btn',\n newBundleBtnOpen: 'skm-new-bundle-btn-open',\n toolbar: 'skm-toolbar',\n searchBox: 'skm-search-box',\n searchInput: 'skm-search-input',\n toolSelectWrap: 'skm-tool-select-wrap',\n toolSelect: 'skm-tool-select',\n toolSelectChevron: 'skm-tool-select-chevron',\n dropWrap: 'skm-drop-wrap',\n dropMenu: 'skm-drop-menu',\n dropItem: 'skm-drop-item',\n dropCheck: 'skm-drop-check',\n dropBadge: 'skm-drop-badge',\n toolButton: 'skm-tool-button',\n toolbarSpacer: 'skm-toolbar-spacer',\n bulkOverlay: 'skm-bulk-overlay',\n dropLabelEllipsis: 'skm-drop-label-ellipsis',\n scopeTag: 'skm-scope-tag',\n presetPill: 'skm-preset-pill',\n presetSelect: 'skm-preset-select',\n presetPillChevron: 'skm-preset-pill-chevron',\n presetPillLabel: 'skm-preset-pill-label',\n viewToggle: 'skm-view-toggle',\n viewBtn: 'skm-view-btn',\n hintRow: 'skm-hint-row',\n hintRowText: 'skm-hint-row-text',\n banner: 'skm-banner',\n bannerActive: 'skm-banner-active',\n bannerIcon: 'skm-banner-icon',\n bannerText: 'skm-banner-text',\n bannerTitle: 'skm-banner-title',\n bannerSub: 'skm-banner-sub',\n bannerBtn: 'skm-banner-btn',\n mainScroll: 'skm-main-scroll',\n hubSection: 'skm-hub-section',\n hubSectionHead: 'skm-hub-section-head',\n noResult: 'skm-no-result',\n // \u5F52\u5165\u6280\u80FD\u5305\u5F39\u7A97\uFF08\u5361\u7247\u5316\uFF09\n assignModal: 'skm-assign-modal',\n assignModalBody: 'skm-assign-modal-body',\n assignList: 'skm-assign-list',\n assignCard: 'skm-assign-card',\n assignCardIcon: 'skm-assign-card-icon',\n assignCardBody: 'skm-assign-card-body',\n assignCardName: 'skm-assign-card-name',\n assignCardDesc: 'skm-assign-card-desc',\n assignGo: 'skm-assign-go',\n // \u540C\u6B65\u72B6\u6001\u5065\u5EB7\u68C0\u67E5\n healthNotice: 'skm-health-notice',\n healthNoticeTitle: 'skm-health-notice-title',\n skillFiles: 'skm-skill-files',\n skillFile: 'skm-skill-file',\n skillPreview: 'skm-skill-preview',\n viewerModal: 'skm-viewer-modal',\n viewerBody: 'skm-viewer-body',\n viewerLayout: 'skm-viewer-layout',\n viewerNav: 'skm-viewer-nav',\n viewerNavItem: 'skm-viewer-nav-item',\n viewerNavDir: 'skm-viewer-nav-dir',\n viewerContent: 'skm-viewer-content',\n viewerModalFull: 'skm-viewer-modal-full',\n viewerToolbar: 'skm-viewer-toolbar',\n viewerPath: 'skm-viewer-path',\n viewerToolGroup: 'skm-viewer-tool-group',\n viewerToolBtn: 'skm-viewer-tool-btn',\n viewerToolBtnA1: 'skm-viewer-tool-btn-a1',\n viewerToolBtnA3: 'skm-viewer-tool-btn-a3',\n viewerToolBtnFrame: 'skm-viewer-tool-btn-frame',\n looseEmpty: 'skm-loose-empty',\n visuallyHidden: 'skm-visually-hidden',\n // \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\n toggle: 'skm-toggle',\n toggleOn: 'skm-toggle-on',\n toggleOff: 'skm-toggle-off',\n toggleKnob: 'skm-toggle-knob',\n bundleToggle: 'skm-bundle-toggle',\n // Agent \u9884\u8BBE\u5206\u7C7B\uFF08\u5706\u7403\uFF09\n presetStrip: 'skm-preset-strip',\n presetBallWrap: 'skm-preset-ball-wrap',\n presetBall: 'skm-preset-ball',\n presetBallLabel: 'skm-preset-ball-label',\n presetHint: 'skm-preset-hint',\n presetHintText: 'skm-preset-hint-text',\n presetReset: 'skm-preset-reset',\n // \u7A7A\u6280\u80FD\u5305 / \u5931\u6548\u5F15\u7528 / \u9762\u677F\u7EA7\u63D0\u793A\u6761\n toastStack: 'skm-toast-stack',\n toast: 'skm-toast',\n toastOk: 'skm-toast-ok',\n toastErr: 'skm-toast-err',\n toastDot: 'skm-toast-dot',\n bundleEmpty: 'skm-bundle-empty',\n bundleEmptyTitle: 'skm-bundle-empty-title',\n bundleEmptyHint: 'skm-bundle-empty-hint',\n bundleEmptyBtn: 'skm-bundle-empty-btn',\n bundleMissing: 'skm-bundle-missing',\n bundleMissingBtn: 'skm-bundle-missing-btn',\n installHint: 'skm-install-hint',\n tagStatus: 'skm-tag-status',\n}\n\nexport const STYLE_ID = 'dsh-skill-manager-styles'\nexport const SHEET = `\n.skm-entry{flex:1 1 50%;min-width:0;display:inline-flex;align-items:center;gap:8px;height:32px;box-sizing:border-box;border:none;border-radius:10px;padding:0 8px;background:transparent;cursor:pointer;color:var(--dsw-alias-label-primary,#eee);font-family:inherit;font-size:14px;line-height:20px;overflow:hidden}\n.skm-entry:hover{background:transparent}\n.skm-entry[aria-expanded='true']{background:transparent;color:var(--dsw-alias-label-primary,#eee)}\n.skm-entry:focus,.skm-entry:focus-visible{outline:none;border:none}\n.skm-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-modal-body{overflow:hidden;display:flex;flex-direction:column}\n.skm-panel{flex:1;min-height:0;display:flex;flex-direction:column;gap:8px;overflow-y:auto;padding:2px 2px 6px;box-sizing:border-box}\n.skm-top-row{flex:none;display:flex;align-items:center;justify-content:flex-end;gap:8px}\n.skm-new-bundle{flex:none;display:inline-flex;align-items:center;gap:4px;appearance:none;border:none;border-radius:12px;padding:4px 10px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#999);background:transparent;cursor:pointer}\n.skm-new-bundle:hover,.skm-new-bundle[aria-expanded='true']{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n.skm-upload{flex:none;display:flex;align-items:center;justify-content:center;gap:8px;min-height:56px;padding:10px 12px;box-sizing:border-box;border:1px dashed var(--dsw-alias-border-l3,#444);border-radius:12px;color:var(--dsw-alias-label-tertiary,#888);font-size:12px;line-height:18px;text-align:center;cursor:pointer;user-select:none}\n.skm-upload:hover{border-color:var(--dsw-alias-state-business-primary,#4a9eff);color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-upload-active{border-color:var(--dsw-alias-state-business-primary,#4a9eff);background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-hidden-input{display:none}\n.skm-install-form{flex:none;display:flex;flex-direction:column;gap:8px;padding:10px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:12px;background:var(--dsw-alias-bg-layer-1,#1c1f26)}\n.skm-install-row{display:flex;flex-direction:column;gap:6px}\n.skm-inline-form{flex:none;display:flex;align-items:center;gap:6px}\n/* \u5757\u7EA7\u53D8\u4F53\uFF1Awidth:100% \u8BA9\u5B83\u5728 .skm-bundle\uFF08flex-wrap\uFF09\u91CC\u81EA\u52A8\u6362\u884C\u72EC\u5360\u4E00\u884C\uFF0C\n \u8F93\u5165\u6846\u56E0\u6B64\u80FD\u5403\u6EE1\u6574\u884C\u5BBD\u5EA6\uFF0C\u4E0D\u5FC5\u88AB\u4E24\u4E2A\u6309\u94AE\u6324\u5230\u53EA\u5269\u9ED8\u8BA4 20 \u5B57\u7B26\u3002 */\n.skm-inline-form-block{width:100%;box-sizing:border-box;padding:0 8px 8px;animation:skm-form-in 160ms ease-out}\n@keyframes skm-form-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n/* \u6539\u540D\u6210\u529F\uFF1A\u5361\u7247\u8FB9\u6846\u9AD8\u4EAE\u8109\u51B2\uFF081 \u79D2\u540E\u56DE\u843D\uFF09\uFF0C\u4E0E\u6574\u4F53\u6DF1\u8272\u5361\u7247\u8282\u594F\u4E00\u81F4 */\n.skm-bundle[data-renamed='true']{animation:skm-card-pop 900ms ease-out}\n@keyframes skm-card-pop{0%{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}55%{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}100%{border-color:var(--dsw-alias-border-l1,rgba(255,255,255,.08));box-shadow:none}}\n.skm-inline-input{flex:1;min-width:0;height:32px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:8px;padding:0 10px;font-size:13px;color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-bg-base,#0e1116)}\n.skm-inline-input::placeholder{color:var(--dsw-alias-label-tertiary,#888)}\n.skm-bundle-select{display:flex;align-items:center}\n.skm-bundle-select select{flex:1;height:32px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:8px;padding:0 8px;font-size:13px;color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-bg-base,#0e1116)}\n.skm-install-meta{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-install-actions{display:flex;align-items:center;gap:6px}\n.skm-section-title{margin:6px 2px 0;font-size:12px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-status{margin:2px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-failure{display:flex;align-items:center;gap:8px}\n.skm-failure p{margin:2px;font-size:13px;line-height:20px;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-error{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-bundle-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}\n/* \u5206\u7EC4\u884C\uFF08\u53C2\u8003\u8BBE\u8BA1\u7A3F\uFF09\uFF1A\u767D\u5E95\u5706\u89D2\u884C\uFF0C\u84DD\u6587\u4EF6\u5939\u56FE\u6807 + \u540D\u79F0 + \u8BA1\u6570 pill + chevron + \u66F4\u591A */\n.skm-bundle-row-outer{flex:none;display:flex;align-items:center;gap:6px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:11px;background:var(--dsw-alias-bg-base,#fff);padding:2px 6px 2px 10px;min-height:40px;transition:border-color 160ms ease,box-shadow 160ms ease,background 160ms ease}\n.skm-bundle-row-outer:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14));box-shadow:0 2px 8px rgba(16,24,40,.06)}\n.skm-bundle-row{flex:1;min-width:0;display:inline-flex;align-items:center;gap:10px;appearance:none;border:none;background:transparent;padding:6px 2px;font-size:14px;cursor:pointer;color:var(--dsw-alias-label-primary,#1f2430);font-family:inherit;border-radius:8px;text-align:left;transition:background 140ms ease}\n.skm-bundle-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.02))}\n.skm-bundle-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-bundle-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;display:inline-flex;align-items:center;gap:6px}\n.skm-bundle-count{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-bg-module-platform,#f1f3f5);border-radius:999px;padding:0 8px;white-space:nowrap}\n/* \u2500\u2500 \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u9876\u680F\u80F6\u56CA\u7B5B\u9009 / \u5305\u540D\u65C1\u6807\u7B7E / \u5206\u7C7B\u7F16\u8F91\u5668 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/* \u914D\u8272\u53EA\u8D70\u4E3B\u9898\u84DD\u4E00\u628A\u5237\u5B50\uFF08\u4E0E .skm-tag \u540C\u8BED\u8A00\uFF09\uFF1B\u5206\u7C7B\u540D\u4E0D\u53C2\u4E0E\u914D\u8272\u2014\u2014\n \u5F69\u8679\u8272\u677F\u5B9E\u6D4B\u89C6\u89C9\u592A\u5435\uFF0C\u4E0E\u9762\u677F\u5176\u4F59\u90E8\u5206\u6253\u67B6\uFF0C\u5DF2\u5426\u3002 */\n.skm-stack-form{display:flex;flex-direction:column;gap:10px}\n.skm-cat-chip-row{flex:1 1 100%;order:3;display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding-top:2px;animation:skm-cat-row-in 220ms cubic-bezier(.2,.8,.2,1) both}\n@keyframes skm-cat-row-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}\n.skm-cat-chip-label{flex:none;font-size:11.5px;line-height:18px;letter-spacing:.02em;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-cat-chip{flex:none;display:inline-flex;align-items:center;gap:5px;height:26px;box-sizing:border-box;padding:0 9px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-size:12px;line-height:18px;cursor:pointer;transition:color 150ms ease,border-color 150ms ease,background 150ms ease,box-shadow 200ms ease,transform 120ms ease}\n.skm-cat-chip:hover{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 52%,transparent);color:var(--dsw-alias-label-primary,#1f2430);transform:translateY(-1px)}\n.skm-cat-chip:active{transform:translateY(0) scale(.97)}\n.skm-cat-chip[data-active]{border-color:transparent;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 15%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-weight:600;box-shadow:0 0 0 1px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 36%,transparent),0 2px 10px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 20%,transparent)}\n.skm-cat-chip-count{flex:none;min-width:16px;padding:0 5px;box-sizing:border-box;border-radius:999px;background:var(--dsw-alias-bg-module-platform,rgba(0,0,0,.05));color:var(--dsw-alias-label-tertiary,#81858c);font-size:10.5px;line-height:16px;font-variant-numeric:tabular-nums;transition:background 160ms ease,color 160ms ease}\n.skm-cat-chip[data-active] .skm-cat-chip-count{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u5305\u540D\u65C1\u6807\u7B7E\uFF1A\u6574\u9897\u53EF\u70B9\uFF08\u70B9\u5728\u6807\u9898\u884C\u91CC\uFF0C\u7531 JS \u5206\u6D41\u6210\u7B5B\u9009\u800C\u975E\u5C55\u5F00\uFF09\uFF0C\u5E26\u5165\u573A\u5F39\u5165\u3002 */\n.skm-bundle-cats{flex:none;display:inline-flex;align-items:center;gap:4px;flex-wrap:wrap;min-width:0}\n.skm-bundle-cat-tag{display:inline-flex;align-items:center;gap:4px;height:19px;box-sizing:border-box;padding:0 7px;border-radius:999px;font-size:11px;line-height:17px;white-space:nowrap;cursor:pointer;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 11%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent);animation:skm-cat-tag-in 200ms cubic-bezier(.2,.9,.3,1.1) both;transition:background 150ms ease,border-color 150ms ease,transform 120ms ease,box-shadow 180ms ease}\n.skm-bundle-cat-tag:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 20%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 45%,transparent);transform:translateY(-1px);box-shadow:0 2px 7px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent)}\n.skm-bundle-cat-tag[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:transparent;color:#fff;box-shadow:0 2px 9px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 40%,transparent)}\n@keyframes skm-cat-tag-in{from{opacity:0;transform:translateY(3px) scale(.94)}to{opacity:1;transform:none}}\n/* \u5206\u7C7B\u7F16\u8F91\u5668 */\n.skm-cat-editor{display:flex;flex-direction:column;gap:8px;box-sizing:border-box;width:100%}\n.skm-cat-empty{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-cat-selected{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:5px}\n.skm-cat-selected-tag{display:inline-flex;align-items:center;gap:5px;height:24px;box-sizing:border-box;padding:0 4px 0 9px;border-radius:999px;font-size:12px;line-height:20px;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 26%,transparent);animation:skm-cat-tag-in 200ms cubic-bezier(.2,.9,.3,1.1) both}\n.skm-cat-selected-name{white-space:nowrap}\n.skm-cat-remove{flex:none;display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;padding:0;border:none;border-radius:50%;background:transparent;color:inherit;cursor:pointer;opacity:.6;transition:opacity 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-cat-remove:hover{opacity:1;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent)}\n.skm-cat-remove:active{transform:scale(.9)}\n.skm-cat-suggest{display:flex;flex-wrap:wrap;gap:4px}\n.skm-cat-preset{display:inline-flex;align-items:center;gap:3px;height:23px;box-sizing:border-box;padding:0 8px;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.16));border-radius:999px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-size:11.5px;line-height:19px;cursor:pointer;transition:color 140ms ease,border-color 140ms ease,background 140ms ease,transform 120ms ease}\n.skm-cat-preset:hover:not(:disabled){color:var(--dsw-alias-state-business-primary,#3d6be5);border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 55%,transparent);border-style:solid;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 9%,transparent);transform:translateY(-1px)}\n.skm-cat-preset:active:not(:disabled){transform:translateY(0) scale(.96)}\n.skm-cat-preset:disabled{opacity:.4;cursor:default}\n.skm-cat-preset-plus{font-size:13px;line-height:16px;opacity:.7}\n.skm-cat-input{box-sizing:border-box;width:100%;height:32px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:9px;padding:0 10px;font-family:inherit;font-size:12.5px;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430);background:var(--dsw-alias-bg-base,#fff);transition:border-color 150ms ease,box-shadow 150ms ease}\n.skm-cat-input:focus,.skm-cat-input:focus-visible{outline:none;border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 3px rgba(61,107,229,.12)}\n.skm-cat-limit{margin:0;font-size:11.5px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n\n.skm-chevron{flex:none;margin-left:auto;color:var(--dsw-alias-label-caption,#adb2b8);transition:transform 120ms}\n.skm-bundle-row-outer[data-open='true'] .skm-chevron{transform:rotate(180deg)}\n.skm-bundle-more{flex:none;display:flex;align-items:center}\n.skm-bundle-more-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-caption,#adb2b8);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-bundle-more-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-bundle-more-btn:active{transform:scale(.9)}\n.skm-bundle-actions{margin-left:auto;display:flex;align-items:center;gap:2px;padding-right:2px}\n.skm-icon-action{flex:none;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;border-radius:50%;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-tertiary,#888);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-icon-action:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-icon-action:active{transform:scale(.9)}\n\n/* \u2500\u2500 \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\uFF1A\u53CC\u5217\u7F51\u683C\uFF1B\u5217\u8868\u89C6\u56FE\u5207\u5355\u5217\u5BBD\u5361 \u2500\u2500 */\n.skm-skill-grid{list-style:none;margin:8px 0 0;padding:0;width:100%;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;box-sizing:border-box}\n.skm-skill-grid > .skm-status{grid-column:1/-1;padding-top:4px}\n.skm-skill-card{position:relative;min-width:0;display:flex;flex-direction:column;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);padding:14px 16px 0;overflow:hidden;opacity:0;animation:skm-card-in 260ms cubic-bezier(.2,.7,.3,1.06) forwards;animation-delay:calc(var(--skm-i,0)*40ms);transition:border-color 160ms ease,box-shadow 160ms ease,transform 160ms ease}\n.skm-skill-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));box-shadow:0 3px 14px rgba(16,24,40,.08);transform:translateY(-1px)}\n@keyframes skm-card-in{from{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}\n.skm-skill-card-head{display:flex;align-items:center;gap:10px;min-width:0}\n.skm-skill-icon{flex:none;width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:12px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);transition:color 160ms ease,border-color 160ms ease,transform 160ms ease}\n.skm-skill-badge{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:7px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10.5px;font-weight:700;letter-spacing:.2px}\n.skm-skill-title-wrap{flex:1;min-width:0;display:flex;align-items:center;gap:6px}\n.skm-skill-title{flex:1;min-width:0;appearance:none;border:none;background:transparent;padding:0;text-align:left;font-family:inherit;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#0f1115);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border-radius:6px;transition:color 140ms ease}\n.skm-skill-title:hover{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-skill-title:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:1px}\n.skm-skill-copy{flex:none;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;border-radius:6px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-caption,#adb2b8);opacity:.55;transition:opacity 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-skill-copy:hover{opacity:1;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));transform:scale(1.08)}\n.skm-skill-copy:active{transform:scale(.9)}\n.skm-skill-copy[data-copied='true']{opacity:1;color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-skill-card-toggle{flex:none;display:inline-flex;align-items:center}\n.skm-skill-card-desc{margin:8px 0 0;appearance:none;border:none;background:transparent;padding:0;text-align:left;font-family:inherit;font-size:13px;line-height:19px;color:var(--dsw-alias-label-tertiary,#81858c);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;min-height:38px;cursor:pointer;transition:color 140ms ease}\n.skm-skill-card-desc:hover{color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-skill-tags{display:flex;align-items:center;gap:8px;margin-top:12px;min-width:0}\n.skm-tag{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 10px;border-radius:999px;font-size:12px;line-height:20px;box-sizing:border-box;white-space:nowrap;transition:color 160ms ease,border-color 160ms ease,background 160ms ease}\n.skm-tag-source{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-tag-scope{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-tag-scope[data-off='true']{border-color:var(--dsw-alias-border-l2,rgba(0,0,0,.12));color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u5173\u6389\u7684\u6280\u80FD\u7559\u5728\u5217\u8868\u91CC\uFF0C\u4F46\u8981\u4E00\u773C\u770B\u51FA\u662F\u5173\u7684\uFF1A\u5DE6\u4FA7\u72B6\u6001\u6761 + \u6807\u9898\u964D\u9971\u548C\uFF08\u5E26\u8FC7\u6E21\uFF09 */\n.skm-skill-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:transparent;transition:background 220ms ease}\n.skm-skill-card[data-off='true']{background:var(--dsw-alias-bg-layer-1,rgba(0,0,0,.02))}\n.skm-skill-card[data-off='true']::before{background:var(--dsw-alias-border-l3,rgba(0,0,0,.2))}\n.skm-skill-card[data-off='true'] .skm-skill-badge,.skm-skill-card[data-off='true'] .skm-skill-title{color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-skill-card[data-off='true'] .skm-skill-card-desc{color:var(--dsw-alias-label-quaternary,#a5aab2)}\n.skm-skill-badge,.skm-skill-title{transition:color 220ms ease}\n.skm-tag-status{background:transparent;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.18));color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-skill-meta{margin-left:auto;flex:none;font-size:12px;line-height:17px;color:var(--dsw-alias-label-caption,#adb2b8);white-space:nowrap}\n.skm-skill-card-foot{display:flex;align-items:center;gap:6px;margin:12px -16px 0;padding:8px 14px 8px 16px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.06))}\n.skm-skill-foot-label{flex:none;font-size:12px;line-height:17px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-skill-foot-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-secondary,#61666b);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-skill-foot-icon:hover{background:var(--dsw-alias-interactive-bg-hover-solid,#f1f3f5);color:var(--dsw-alias-label-primary,#0f1115);transform:scale(1.05)}\n.skm-skill-foot-icon:active{transform:scale(.92)}\n.skm-skill-foot-icon:disabled{opacity:.38;cursor:default}\n.skm-skill-foot-icon:disabled:hover{background:transparent;color:var(--dsw-alias-label-secondary,#61666b);transform:none}\n.skm-skill-foot-icon-danger:hover{background:#fdebeb;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-skill-card-actions{margin-left:auto;display:flex;align-items:center;gap:4px}\n\n/* \u2500\u2500 Skills Hub \u9875\u9762\u9AA8\u67B6\uFF1A\u5DE6\u680F\uFF08\u5206\u7C7B/\u7B5B\u9009/\u6DFB\u52A0\uFF09 / \u7EDF\u8BA1\u884C / \u5DE5\u5177\u680F / tabs / \u5206\u7EC4 / \u5361\u7247 \u2500\u2500 */\n.skm-hub{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;min-width:0;background:var(--dsw-alias-bg-base,#fff)}\n.skm-topbar{flex:none;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));background:var(--dsw-alias-bg-base,#fff)}\n.skm-topbar[data-drop]{outline:2px dashed var(--dsw-alias-state-business-primary,#3d6be5);outline-offset:-2px}\n.skm-chip-row{flex:1 1 auto;min-width:200px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.skm-topbar .skm-cat-item{flex:none;width:auto}\n.skm-topbar .skm-new-bundle-btn{flex:none;width:auto;margin-top:0;height:32px;font-size:12px}\n/* SKILL / MCP \u9876\u5C42 tab\uFF08\u7D27\u8D34\u6807\u9898\u6587\u5B57\u53F3\u4FA7\uFF09 */\n.skm-kind-tabs{flex:none;display:inline-flex;align-items:center;gap:4px;padding:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:999px;background:var(--dsw-alias-bg-module-platform,#f2f4f7)}\n.skm-kind-tab{flex:none;display:inline-flex;align-items:center;justify-content:center;height:24px;box-sizing:border-box;border:none;border-radius:999px;background:transparent;padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-kind-tab:hover{color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-kind-tab:active{transform:scale(.96)}\n.skm-kind-tab[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 1px 5px rgba(61,107,229,.3)}\n/* MCP \u89C6\u56FE\u6839\uFF1A\u5DE6\u4FA7\u7AD6\u6392\u83DC\u5355\uFF08\u540C\u6280\u80FD\u5DE6\u680F\u98CE\u683C\uFF09+ \u5185\u5BB9\u533A */\n.skm-mcp-view-root{flex:1;min-height:0;display:flex;min-width:0;overflow-y:auto;padding:14px 20px 22px 0}\n.skm-mcp-side{flex:none;width:216px;box-sizing:border-box;padding:4px 12px 0 20px;border-right:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));display:flex;flex-direction:column;gap:2px}\n.skm-mcp-main{flex:1;min-width:0;padding:0 4px 0 18px;display:flex;flex-direction:column}\n.skm-mcp-tabs{flex:none;display:flex;align-items:center;gap:10px}\n.skm-mcp-tab{flex:none;display:inline-flex;align-items:center;justify-content:center;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 18px;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-tab:hover{color:var(--dsw-alias-label-primary,#1f2430);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-mcp-tab:active{transform:scale(.97)}\n.skm-mcp-tab[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 8px rgba(61,107,229,.3)}\n/* MCP Server \u9875\uFF1A\u5DE6\u4E3B\u5217 + \u53F3\u4FE1\u606F\u5217 */\n.skm-mcp-server-layout{flex:none;display:flex;align-items:flex-start;gap:18px;min-width:0}\n/* MCP \u9875\u4E3B\u5BB9\u5668 = \u6EDA\u52A8\u5BB9\u5668\uFF1A\u5361\u7247\u591A\u4E86/\u5DE5\u5177\u591A\u4E86\u90FD\u80FD\u6EDA\u5230\u5E95\uFF08\u7236\u5C42 .skm-hub-main \u662F overflow:hidden\uFF09\u3002 */\n.skm-mcp-server-main{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:column;gap:16px;overflow-y:auto;overflow-x:hidden;padding-right:6px;scrollbar-gutter:stable}\n/* \u56FE\u4E00\uFF1A\u5934\u90E8 */\n.skm-mcp-header{flex:none;display:flex;align-items:flex-start;justify-content:space-between;gap:14px}\n.skm-mcp-header-text{min-width:0;display:flex;flex-direction:column;gap:5px}\n.skm-mcp-header-title-row{display:flex;align-items:center;gap:10px}\n.skm-mcp-header-title{font-size:20px;font-weight:700;line-height:26px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-header-badge{flex:none;display:inline-flex;align-items:center;height:20px;padding:0 9px;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10.5px;font-weight:600;line-height:14px}\n.skm-mcp-header-sub{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-header-actions{flex:none;display:inline-flex;align-items:center;gap:8px}\n.skm-mcp-market-btn{flex:none;display:inline-flex;align-items:center;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:13px;line-height:18px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:border-color 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-mcp-market-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18));color:var(--dsw-alias-label-primary,#1f2430);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.02))}\n.skm-mcp-market-btn:active{transform:scale(.98)}\n.skm-mcp-add-btn{flex:none;display:inline-flex;align-items:center;height:34px;box-sizing:border-box;border:none;border-radius:10px;background:var(--dsw-alias-state-business-primary,#3d6be5);padding:0 14px;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;color:#fff;cursor:pointer;box-shadow:0 2px 8px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-add-btn:hover{background:#3059cf;box-shadow:0 3px 12px rgba(61,107,229,.4);transform:translateY(-1px)}\n.skm-mcp-add-btn:active{transform:translateY(0) scale(.98)}\n.skm-mcp-bell-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;border-radius:10px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-mcp-bell-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-bell-btn:active{transform:scale(.94)}\n.skm-mcp-copy-hint{flex:none;margin:0;padding:8px 12px;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2fb344) 10%,transparent);color:var(--dsw-alias-state-success-primary,#2fb344);font-size:12px;line-height:17px}\n/* \u7EDF\u8BA1\u5361\uFF08\u590D\u7528\u6280\u80FD\u7EDF\u8BA1\u5361\u6837\u5F0F\uFF0C\u53BB\u6389\u5217\u8868\u9875\u5185\u8FB9\u8DDD\uFF09 */\n/* \u56FE\u4E8C\uFF1A\u5217\u8868\u5361 */\n/* MCP \u5FEB\u901F\u4E86\u89E3\u5F15\u5BFC\u5361\uFF08\u5DE6\u680F\u5E95\u90E8\uFF0C\u70B9\u51FB\u53F3\u4FA7\u60AC\u6D6E\uFF1B\u540C\u6280\u80FD\u6307\u5357\u5361\u6837\u5F0F\uFF09 */\n.skm-mcp-intro-card{flex:none;display:flex;flex-direction:column;gap:5px;margin-top:auto;box-sizing:border-box;border:1px solid #e4e9f8;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f3f7ff);padding:14px;cursor:pointer;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-intro-card:hover{border-color:#cdd9f7;box-shadow:0 4px 14px rgba(61,107,229,.08)}\n.skm-mcp-intro-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-intro-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-intro-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;margin-top:4px;height:28px;box-sizing:border-box;border:none;border-radius:999px;background:var(--dsw-alias-state-business-primary,#3d6be5);padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:#fff;cursor:pointer;box-shadow:0 2px 6px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-intro-btn:hover{background:#3059cf;box-shadow:0 3px 10px rgba(61,107,229,.38);transform:translateY(-1px)}\n.skm-mcp-intro-btn:active{transform:translateY(0) scale(.97)}\n/* MCP \u89E3\u91CA\u60AC\u6D6E\u5C42\uFF08\u540C\u6280\u80FD\u6307\u5357\u6D6E\u5C42\uFF09 */\n.skm-mcp-info-overlay{position:fixed;z-index:1001;width:330px;max-height:calc(100vh - 24px);box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);box-shadow:0 12px 40px rgba(16,24,40,.16);display:flex;flex-direction:column;overflow:hidden;animation:skm-guide-in 240ms cubic-bezier(.2,.7,.3,1.06) both}\n.skm-mcp-info-overlay-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 12px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-info-overlay-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-info-overlay-title{flex:1;min-width:0;font-size:15px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-info-overlay-body{flex:1;min-height:0;overflow-y:auto;padding:12px 14px 20px;display:flex;flex-direction:column;gap:12px}\n.skm-mcp-row{display:flex;align-items:center;gap:10px;padding:10px 4px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-row:first-child{border-top:none}\n.skm-mcp-row-logo{flex:none;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-row-logo[data-kind='slack']{background:#fff}\n.skm-mcp-row-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-mcp-row-name-row{display:flex;align-items:center;gap:7px;min-width:0}\n.skm-mcp-row-name{font-size:13px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-row-tag{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;font-size:10px;line-height:14px;background:#f1f3f5;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-row-tag[data-official]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-row-ext{flex:none;display:inline-flex;border:none;background:transparent;padding:2px;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:color 140ms ease}\n.skm-mcp-row-ext:hover{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-row-desc{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-row-status{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:999px;font-size:11px;line-height:16px;background:#f0f4ee;color:#2f9e44}\n.skm-mcp-row-status[data-on]{background:#e7f6ec}\n.skm-mcp-row-status:not([data-on]){background:#f2f3f5;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-view-all{flex:none;align-self:center;display:inline-flex;align-items:center;gap:5px;margin-top:8px;border:none;background:transparent;padding:6px 10px;font-size:12px;line-height:17px;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;font-family:inherit;transition:color 140ms ease}\n.skm-mcp-view-all:hover{color:#3059cf}\n/* \u63A8\u8350\u884C\u300C\u6DFB\u52A0\u300D\u5C0F\u6309\u94AE */\n.skm-mcp-add-small-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:26px;box-sizing:border-box;border:1px solid #bccff5;border-radius:999px;background:#f4f8ff;padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;transition:background 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-add-small-btn:hover{border-color:#9db6ef;background:#e9f1ff}\n.skm-mcp-add-small-btn:active{transform:scale(.96)}\n/* \u63A8\u8350 MCP Server \u6807\u9898 */\n.skm-mcp-recommend-title{flex:none;font-size:15px;font-weight:700;line-height:21px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u63A8\u8350\u533A\uFF1A\u6807\u9898\u884C + \u5206\u7C7B pills + \u5361\u7247\u7F51\u683C */\n.skm-mcp-rec-head{flex:none;display:flex;align-items:center;justify-content:space-between;gap:12px}\n.skm-mcp-rec-cats-row{flex:none;display:flex;align-items:center}\n.skm-mcp-rec-results-title{flex:none;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-rec-stars{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-secondary,#61666b);font-size:10.5px;line-height:16px}\n.skm-mcp-open-link{flex:none;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 30%,transparent);border-radius:999px;background:transparent;padding:0 11px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);text-decoration:none;cursor:pointer;transition:background 140ms ease,transform 140ms ease}\n.skm-mcp-open-link:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent)}\n.skm-mcp-open-link:active{transform:scale(.96)}\n.skm-mcp-rec-card-external{border-style:dashed}\n.skm-mcp-resolve-err{flex:none;margin:0;font-size:11px;line-height:16px;color:var(--dsw-alias-state-warn-primary,#e0851c)}\n.skm-mcp-ext-actions{flex:none;display:inline-flex;align-items:center;gap:6px}\n/* MCP Server \u5361\uFF1A\u81EA\u542F\u52A8/\u542F\u7528 \u8BBE\u7F6E\u884C */\n.skm-mcp-card-foot{flex:none;display:flex;align-items:center;gap:12px;margin-top:auto;padding-top:8px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-card-item{flex:none;display:inline-flex;align-items:center;gap:6px}\n.skm-mcp-card-item-label{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-card-item-meta{flex:none;margin-left:auto;font-size:11px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-card-item-meta[data-on]{color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-mcp-card-delete{flex:none;margin-left:auto;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid transparent;border-radius:8px;background:transparent;padding:0 8px;font:inherit;font-size:11.5px;font-weight:600;line-height:1;font-family:inherit;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-card-delete:hover{background:#fdebeb;border-color:#f3c4c4;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-mcp-card-delete:active{transform:scale(.94)}\n.skm-mcp-card-delete:disabled{opacity:.5;cursor:default;transform:none}\n.skm-mcp-rec-cats{flex:none;display:inline-flex;align-items:center;gap:6px}\n.skm-mcp-rec-cat{flex:none;display:inline-flex;align-items:center;justify-content:center;height:28px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:12px;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-rec-cat:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-rec-cat:active{transform:scale(.96)}\n.skm-mcp-rec-cat[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n.skm-mcp-rec-grid{flex:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\n.skm-mcp-rec-card{flex:none;min-width:0;display:flex;flex-direction:column;gap:9px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:14px 16px;box-shadow:0 1px 2px rgba(16,24,40,.03);opacity:0;animation:skm-card-in 260ms cubic-bezier(.2,.7,.3,1.06) forwards;transition:border-color 160ms ease,box-shadow 160ms ease,transform 160ms ease}\n.skm-mcp-rec-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.13));box-shadow:0 4px 14px rgba(16,24,40,.08);transform:translateY(-1px)}\n.skm-mcp-rec-card-head{display:flex;align-items:center;gap:10px;min-width:0}\n.skm-mcp-rec-card-title-row{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.skm-mcp-rec-card-name{font-size:14px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-rec-card-tags{display:flex;align-items:center;gap:6px}\n.skm-mcp-rec-cat-tag{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10px;line-height:14px}\n.skm-mcp-rec-cat-tag[data-off]{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#f5a524) 16%,transparent);color:var(--dsw-alias-state-warn-label,#b26b00)}\n.skm-mcp-rec-cat-tag[data-shadow]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);border:1px dashed color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 40%,transparent)}\n.skm-mcp-rec-cat-tag[data-locked]{background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-tertiary,#81858c);border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08))}\n.skm-mcp-tool-chip[data-locked]{text-decoration:line-through}\n.skm-mcp-tool-chips{display:flex;flex-wrap:wrap;gap:4px;margin:6px 0 8px;max-height:132px;overflow-y:auto}\n.skm-mcp-tool-chip[data-locked]{opacity:.5;cursor:not-allowed;text-decoration:line-through}\n.skm-mcp-tool-chip{font:inherit;font-size:11px;line-height:16px;padding:1px 7px;border-radius:999px;cursor:pointer;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-tertiary,#81858c);transition:background .12s,color .12s,border-color .12s}\n.skm-mcp-tool-chip[data-on]{background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2ba471) 12%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2ba471) 34%,transparent);color:var(--dsw-alias-state-success-primary,#2ba471)}\n.skm-mcp-tool-chip:hover:not(:disabled){border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 50%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-tool-chip:disabled{opacity:.55;cursor:default}\n.skm-mcp-tool-chip[data-busy]{opacity:.35}\n.skm-mcp-rec-card-desc{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;min-height:36px}\n.skm-mcp-rec-card-foot{display:flex;align-items:center;gap:8px;margin-top:auto;padding-top:6px}\n.skm-mcp-rec-card-meta{flex:1;min-width:0;font-size:11px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-added-tag{flex:none;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid #b7e0c3;border-radius:999px;background:#e7f6ec;padding:0 10px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:#2f9e44;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-added-tag:hover{border-color:#93cfa6;background:#d9f0e1}\n.skm-mcp-added-tag:active{transform:scale(.96)}\n/* \u6DFB\u52A0 MCP Server \u8868\u5355 */\n.skm-mcp-add-form{display:flex;flex-direction:column;gap:8px}\n.skm-mcp-add-type-row{display:flex;align-items:center;gap:6px}\n.skm-mcp-add-type-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:28px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-add-type-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-add-type-btn:active{transform:scale(.96)}\n.skm-mcp-add-type-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n/* \u5DE5\u5177\u5217\u8868\u641C\u7D22\u6846 */\n.skm-mcp-tool-search{flex:none;display:flex;align-items:center;gap:8px;height:32px;width:260px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;color:var(--dsw-alias-label-caption,#adb2b8);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-mcp-tool-search:focus-within{border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 14%,transparent)}\n.skm-mcp-tool-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:12.5px;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430);font-family:inherit}\n.skm-mcp-tool-search-input::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}\n/* \u8FDE\u63A5\u65E5\u5FD7\u884C */\n/* \u914D\u7F6E\u6A21\u677F\u5361 */\n.skm-mcp-config-grid{flex:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}\n.skm-mcp-config-card{flex:none;min-width:0;display:flex;flex-direction:column;gap:10px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:12px 14px;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 160ms ease,box-shadow 160ms ease}\n.skm-mcp-config-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.13));box-shadow:0 3px 10px rgba(16,24,40,.07)}\n.skm-mcp-config-head{display:flex;align-items:center;justify-content:space-between;gap:8px}\n.skm-mcp-config-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-config-copy{flex:none;display:inline-flex;align-items:center;height:24px;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 30%,transparent);border-radius:999px;background:transparent;padding:0 10px;font-size:11px;line-height:16px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-mcp-config-copy:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent)}\n.skm-mcp-config-copy:active{transform:scale(.96)}\n.skm-mcp-config-code{flex:none;margin:0;padding:10px 12px;border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:17px;overflow:auto}\n/* \u56FE\u4E09\uFF1A\u53F3\u4FA7\u4FE1\u606F\u680F */\n.skm-mcp-info-col{flex:none;width:322px;display:flex;flex-direction:column;gap:12px}\n.skm-mcp-info-card{flex:none;display:flex;flex-direction:column;gap:9px;box-sizing:border-box;border:1px solid #dfe8fa;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f1f5ff);padding:14px}\n.skm-mcp-info-card-title{font-size:14px;font-weight:700;line-height:20px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-info-desc{margin:0;font-size:12px;line-height:19px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-info-points{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.skm-mcp-point{display:flex;gap:8px;align-items:flex-start}\n.skm-mcp-point-icon{flex:none;width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-point-body{min-width:0;display:flex;flex-direction:column;gap:1px}\n.skm-mcp-point-title{font-size:12px;font-weight:600;line-height:17px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-point-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u5DE5\u4F5C\u539F\u7406\u6D41\u7A0B */\n.skm-mcp-flow{flex:none;display:flex;align-items:center;gap:4px}\n.skm-mcp-flow-node{flex:none;width:64px;display:inline-flex;flex-direction:column;align-items:center;gap:4px}\n.skm-mcp-flow-icon{flex:none;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-flow-icon[data-client]{background:#dbebfd;color:#2276d2}\n.skm-mcp-flow-icon[data-server]{background:#eae8fa;color:#6b46e5}\n.skm-mcp-flow-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-secondary,#61666b);white-space:nowrap}\n.skm-mcp-flow-arrow{flex:1;min-width:0;display:inline-flex;flex-direction:column;align-items:center;gap:2px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-arrow-text{font-size:9px;line-height:12px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-ext{flex:none;display:flex;flex-direction:column;gap:6px;padding-top:6px;border-top:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.1))}\n.skm-mcp-flow-ext-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-ext-icons{display:flex;gap:8px}\n.skm-mcp-flow-ext-icon{flex:none;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.07));border-radius:8px;background:#fff;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-api-text{font-size:9px;font-weight:700;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u5FEB\u901F\u4E0A\u624B */\n.skm-mcp-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.skm-mcp-step{display:flex;gap:8px;align-items:flex-start}\n.skm-mcp-step-num{flex:none;width:22px;height:22px;border-radius:50%;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:12px;font-weight:700;line-height:22px;text-align:center}\n.skm-mcp-step-body{min-width:0;display:flex;flex-direction:column;gap:1px}\n.skm-mcp-step-title{font-size:12px;font-weight:600;line-height:17px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-step-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* MCP \u7A7A\u6001\uFF08\u5DE5\u5177\u5217\u8868/\u8FDE\u63A5\u65E5\u5FD7/\u914D\u7F6E\u6A21\u677F\u5360\u4F4D\uFF09 */\n.skm-mcp-empty{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:40px}\n.skm-mcp-empty-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:64px;height:64px;border-radius:18px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 4px 12px rgba(61,107,229,.1)}\n.skm-mcp-empty-title{font-size:16px;font-weight:700;line-height:22px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-empty-desc{font-size:13px;line-height:19px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-hub-row{flex:1;min-height:0;min-width:0;display:flex}\n/* \u53F3\u4FA7\u6307\u5357\u6D6E\u5C42\u5361\uFF08\u70B9\u51FB\u300C\u5F00\u59CB\u5B66\u4E60\u300D\u51FA\u73B0\uFF0C\u8D34\u9762\u677F\u53F3\u7F18\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09 */\n.skm-guide-panel{position:fixed;z-index:1001;width:300px;max-height:calc(100vh - 24px);box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);box-shadow:0 12px 40px rgba(16,24,40,.16);display:flex;flex-direction:column;overflow:hidden;animation:skm-guide-in 240ms cubic-bezier(.2,.7,.3,1.06) both}\n@keyframes skm-guide-in{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:translateX(0)}}\n.skm-guide-panel-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 12px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-guide-panel-logo{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-guide-panel-title{flex:1;min-width:0;font-size:15px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-panel-close{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-guide-panel-close:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-panel-close:active{transform:scale(.9)}\n.skm-guide-panel-body{flex:1;min-height:0;overflow-y:auto;padding:12px 14px 20px;display:flex;flex-direction:column;gap:14px}\n.skm-guide-sec{flex:none;display:flex;flex-direction:column;gap:8px}\n.skm-guide-sec-head{display:flex;align-items:center;gap:7px}\n.skm-guide-sec-icon{flex:none;display:inline-flex;width:22px;height:22px;align-items:center;justify-content:center;border-radius:7px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-guide-sec-title{font-size:14px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-what-desc{margin:0;font-size:12px;line-height:19px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-guide-caps{display:flex;flex-wrap:wrap;gap:6px 10px}\n.skm-guide-cap{flex:none;display:inline-flex;align-items:center;gap:4px}\n.skm-guide-cap-icon{flex:none;display:inline-flex;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-guide-cap-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-tertiary,#81858c);white-space:nowrap}\n.skm-guide-step{display:flex;gap:8px;padding:2px 0}\n.skm-guide-step-num{flex:none;width:22px;height:22px;border-radius:50%;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:12px;font-weight:700;line-height:22px;text-align:center}\n.skm-guide-step-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}\n.skm-guide-step-title-row{display:flex;align-items:center;gap:6px}\n.skm-guide-step-title{font-size:13px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-step-arrow{margin-left:auto;flex:none;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-guide-step-desc{margin:0;font-size:11px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-guide-full-btn{flex:none;align-self:stretch;display:inline-flex;align-items:center;justify-content:center;gap:6px;margin-top:6px;height:32px;box-sizing:border-box;border:1px solid #bccff5;border-radius:999px;background:#f4f8ff;color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:12px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-guide-full-btn:hover{border-color:#9db6ef;background:#e9f1ff;box-shadow:0 2px 8px rgba(61,107,229,.1)}\n.skm-guide-full-btn:active{transform:scale(.98)}\n.skm-guide-best{flex:none;display:flex;flex-direction:column;gap:8px;box-sizing:border-box;border:1px solid #dbe6fb;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#eef4ff);padding:12px 12px 0;overflow:hidden;position:relative}\n.skm-guide-best-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-best-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}\n.skm-guide-best-item{display:flex;align-items:center;gap:7px;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-guide-best-item svg{flex:none;color:#2fb26b}\n.skm-guide-more-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;border:none;background:transparent;padding:2px 0;font-size:11px;line-height:16px;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;font-family:inherit;transition:color 140ms ease}\n.skm-guide-more-btn:hover{color:#3059cf}\n.skm-guide-best-art{flex:none;display:inline-flex;align-items:flex-end;justify-content:center;margin:2px -12px 0;transform:scale(.8);transform-origin:bottom right;pointer-events:none}\n.skm-hub-side{flex:none;width:216px;box-sizing:border-box;padding:16px 14px 16px 16px;border-right:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));background:var(--dsw-alias-bg-base,#fff);overflow-y:auto;display:flex;flex-direction:column;gap:2px}\n.skm-cat-title{flex:none;margin:0 6px 10px;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-cat-list{flex:none;display:flex;flex-direction:column;gap:4px;max-height:190px;overflow-y:auto;padding-right:2px;box-sizing:border-box;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.18));--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,rgba(0,0,0,.3))}\n.skm-cat-item{flex:none;display:flex;align-items:center;gap:10px;width:100%;box-sizing:border-box;border:1px solid transparent;border-radius:10px;padding:8px 10px;background:transparent;cursor:pointer;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);transition:background 140ms ease,border-color 140ms ease,color 140ms ease,box-shadow 140ms ease}\n.skm-cat-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.03));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-cat-item[data-active]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);border-color:rgba(61,107,229,.10);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-cat-icon{flex:none;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;color:var(--dsw-alias-label-caption,#adb2b8);transition:color 140ms ease}\n.skm-cat-icon[data-active]{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-cat-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;font-size:13px;font-weight:500;line-height:18px}\n.skm-cat-item[data-active] .skm-cat-label{font-weight:600}\n.skm-cat-count{flex:none;font-size:12px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-cat-item[data-active] .skm-cat-count{color:var(--dsw-alias-state-business-primary,#5b82e5)}\n.skm-cat-count[data-warn]{color:#e0851c;font-weight:600}\n.skm-filters-title{flex:none;margin:18px 6px 8px;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-filter-block{flex:none;display:flex;flex-direction:column;gap:8px}\n/* \u542F\u7528\u72B6\u6001\uFF1A\u5E73\u94FA\u4E09\u6863\u5206\u6BB5\u6309\u94AE */\n.skm-status-seg{flex:none;display:flex;align-items:center;gap:6px;padding:0 2px}\n.skm-status-seg-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:30px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;font-size:12px;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;white-space:nowrap;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-status-seg-btn:hover{color:var(--dsw-alias-label-primary,#1f2430);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-status-seg-btn:active{transform:scale(.96)}\n.skm-status-seg-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 6px rgba(61,107,229,.28)}\n.skm-filter-row-wrap{position:relative;flex:none}\n.skm-filter-row{flex:none;display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:9px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;font-family:inherit;cursor:pointer;transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-filter-row:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-filter-row[aria-expanded='true']{border-color:var(--dsw-alias-state-business-primary,var(--dsw-alias-state-business-primary,#3d6be5));box-shadow:0 0 0 2px rgba(61,107,229,.12)}\n.skm-filter-row-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;font-size:12px;line-height:17px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-filter-row-label-strong{font-weight:600;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-filter-row-chevron{flex:none;color:var(--dsw-alias-label-caption,#adb2b8);transition:transform 140ms ease}\n.skm-filter-row-chevron[data-open]{transform:rotate(180deg)}\n.skm-filter-menu{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:60;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:0 8px 22px rgba(16,24,40,.12);padding:4px;display:flex;flex-direction:column;gap:2px;animation:skm-form-in 140ms ease-out}\n.skm-filter-option{display:flex;align-items:center;gap:8px;width:100%;border:none;border-radius:8px;padding:7px 10px;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;font-family:inherit;text-align:left;white-space:nowrap;transition:background 120ms ease,color 120ms ease}\n.skm-filter-option:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-preset-dot{flex:none;justify-content:center;width:8px;height:8px;border-radius:50%;background:transparent;margin-left:auto}\n.skm-preset-dot[data-on]{background:var(--dsw-alias-state-business-primary,#e0851c)}\n/* \u65B0\u5EFA\u6280\u80FD\u5305\u6309\u94AE\uFF08\u5DE6\u680F\uFF0C\u6DFB\u52A0\u6280\u80FD\u5361\u4E0A\u65B9\uFF09 */\n.skm-new-bundle-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;height:34px;width:100%;box-sizing:border-box;margin-top:18px;border:1px solid #c7d6f7;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-new-bundle-btn:hover{border-color:#9db6ef;background:#e3ecff;box-shadow:0 2px 8px rgba(61,107,229,.12)}\n.skm-new-bundle-btn:active{transform:scale(.98)}\n.skm-new-bundle-btn-open{border-color:var(--dsw-alias-state-business-primary,#3d6be5);background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 8px rgba(61,107,229,.3)}\n.skm-new-bundle-btn-open:hover{background:#3059cf;border-color:#3059cf;color:#fff}\n/* \u6DFB\u52A0\u6280\u80FD\u5361 */\n.skm-add-card{flex:none;display:flex;flex-direction:column;gap:8px;margin-top:18px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:12px;cursor:pointer;box-shadow:0 1px 2px rgba(16,24,40,.04);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-add-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14));box-shadow:0 4px 14px rgba(16,24,40,.08)}\n.skm-add-card-active{border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 2px rgba(61,107,229,.14)}\n.skm-add-card-head{display:flex;align-items:center;gap:8px}\n.skm-add-card-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent)}\n.skm-add-card-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-add-card-sub{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-add-drop{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;border:1px dashed var(--dsw-alias-border-l3,rgba(0,0,0,.18));border-radius:10px;padding:12px 8px;color:var(--dsw-alias-label-tertiary,#81858c);background:var(--dsw-alias-bg-module-platform,#fafbfc);transition:border-color 140ms ease,background 140ms ease}\n.skm-add-card:hover .skm-add-drop{border-color:rgba(61,107,229,.4);background:#f5f8ff}\n.skm-add-drop-icon{flex:none;display:inline-flex}\n.skm-add-drop-text{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-add-drop-hint{font-size:10px;line-height:14px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-add-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:32px;box-sizing:border-box;border:none;border-radius:9px;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;box-shadow:0 1px 3px rgba(61,107,229,.35);transition:background 140ms ease,transform 140ms ease,box-shadow 140ms ease}\n.skm-add-btn:hover{background:#3059cf;box-shadow:0 2px 8px rgba(61,107,229,.4);transform:translateY(-1px)}\n.skm-add-btn:active{transform:translateY(0) scale(.98)}\n/* \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\uFF08\u6DFB\u52A0\u6280\u80FD\u5361\u4E0B\u65B9\uFF09 */\n.skm-guide-card{flex:none;display:flex;flex-direction:column;gap:5px;margin-top:18px;box-sizing:border-box;border:1px solid #e4e9f8;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f3f7ff);padding:14px;overflow:hidden;position:relative;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-guide-card:hover{border-color:#cdd9f7;box-shadow:0 4px 14px rgba(61,107,229,.08)}\n.skm-guide-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-guide-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;margin-top:4px;height:28px;box-sizing:border-box;border:none;border-radius:999px;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:12px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;box-shadow:0 2px 6px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-guide-btn:hover{background:#3059cf;box-shadow:0 3px 10px rgba(61,107,229,.38);transform:translateY(-1px)}\n.skm-guide-btn:active{transform:translateY(0) scale(.97)}\n.skm-guide-art{flex:none;display:inline-flex;align-items:flex-end;justify-content:center;margin:8px -14px 0;padding-top:6px;background:linear-gradient(180deg,rgba(61,107,229,.06),rgba(61,107,229,.14))}\n.skm-guide-modal-text{margin:0;font-size:13px;line-height:22px;color:var(--dsw-alias-label-secondary,#4a4f5a)}\n.skm-hub-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}\n.skm-health-notice{flex:none;margin:8px 16px 0;box-sizing:border-box;border:1px solid #f0cf9e;border-radius:10px;background:#fdf6e3;padding:8px 12px;display:flex;flex-direction:column;gap:4px;animation:skm-form-in 180ms ease-out}\n.skm-health-notice-title{font-size:12px;font-weight:700;line-height:17px;color:#b45309}\n.skm-health-notice ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}\n.skm-health-notice li{font-size:12px;line-height:17px;color:#8a5a17}\n.skm-toolbar{flex:none;display:flex;align-items:center;gap:8px;padding:12px 16px 4px;flex-wrap:wrap}\n.skm-search-box{flex:1;min-width:170px;display:flex;align-items:center;gap:8px;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;color:var(--dsw-alias-label-caption,#adb2b8);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-search-box:focus-within{border-color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 0 0 3px rgba(65,118,230,.14)}\n.skm-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary,#0f1115);font-family:inherit}\n.skm-search-input::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-tool-select-wrap{position:relative;flex:none;display:inline-flex;align-items:center}\n.skm-tool-select{appearance:none;-webkit-appearance:none;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:13px;line-height:18px;font-family:inherit;padding:0 26px 0 12px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease}\n.skm-tool-select:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18))}\n.skm-tool-select:focus-visible{outline:none;border-color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-tool-select-chevron{position:absolute;right:9px;pointer-events:none;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-tool-button{flex:none;display:inline-flex;align-items:center;gap:6px;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:13px;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-tool-button:hover{background:var(--dsw-alias-interactive-bg-hover-solid,#f7f8f9);color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-drop-label-ellipsis{display:block;min-width:0;max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n/* \u5DE5\u4F5C\u533A/\u5168\u5C40\u6765\u6E90\u6807\u7B7E\uFF1A\u9762\u677F\u5757\u4E0A\u533A\u5206\u300C\u8FD9\u6761\u5C5E\u4E8E\u5F53\u524D\u5DE5\u4F5C\u533A\u300D\u8FD8\u662F\u300C\u5168\u5C40\u5171\u7528\u300D\u3002 */\n.skm-scope-tag{flex:none;display:inline-flex;align-items:center;gap:3px;height:17px;padding:0 6px;border-radius:6px;font-size:11px;line-height:17px;font-weight:600;letter-spacing:.02em;white-space:nowrap}\n.skm-scope-tag[data-scope='workspace']{background:var(--dsw-alias-bg-accent,rgba(88,101,242,.14));color:var(--dsw-alias-label-accent,#4b57d6)}\n.skm-scope-tag[data-scope='global']{background:var(--dsw-alias-bg-neutral,rgba(0,0,0,.06));color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-scope-tag[data-side='closed']{background:var(--dsw-alias-bg-danger,rgba(220,38,38,.12));color:var(--dsw-alias-label-danger,#c02424)}\n.skm-tool-button:active{transform:scale(.97)}\n.skm-tool-button:disabled{opacity:.5;cursor:default}\n.skm-toolbar-spacer{flex:1 1 12px}\n.skm-bulk-overlay{position:fixed;inset:0;z-index:995;border:none;background:transparent;cursor:default;padding:0}\n.skm-preset-pill{position:relative;flex:none;display:inline-flex;align-items:center;gap:6px;height:36px;box-sizing:border-box;border:1px solid #c9d6f5;border-radius:10px;background:#eef3fd;color:#3b62d6;padding:0 10px;font-family:inherit;font-size:13px;line-height:18px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-preset-pill:active{transform:scale(.97)}\n.skm-preset-pill-label{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-preset-select{appearance:none;-webkit-appearance:none;border:none;outline:none;background:transparent;color:inherit;font-size:13px;line-height:18px;font-family:inherit;padding:0 18px 0 0;cursor:pointer;max-width:150px}\n.skm-preset-pill-chevron{pointer-events:none;color:#6f8cd6;transition:transform 140ms ease}\n.skm-preset-pill[aria-expanded='true'] .skm-preset-pill-chevron{transform:rotate(180deg)}\n.skm-drop-wrap{position:relative;flex:none}\n.skm-drop-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:996;min-width:180px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:0 6px 20px rgba(16,24,40,.12);padding:4px;display:flex;flex-direction:column;gap:2px;animation:skm-form-in 140ms ease-out;max-height:320px;overflow-y:auto}\n.skm-drop-item{display:flex;align-items:center;gap:8px;border:none;border-radius:8px;padding:7px 10px;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;font-family:inherit;text-align:left;white-space:nowrap;transition:background 120ms ease,color 120ms ease}\n.skm-drop-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-drop-item[aria-checked='true']{color:var(--dsw-alias-label-primary,#0f1115);font-weight:600}\n.skm-drop-check{flex:none;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:var(--dsw-alias-state-business-primary,#4176e6);opacity:0;transform:scale(.6);transition:opacity 140ms ease,transform 140ms ease}\n.skm-drop-check[data-on]{opacity:1;transform:scale(1)}\n.skm-drop-badge{margin-left:auto;flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-bg-module-platform,#f1f3f5);border-radius:999px;padding:0 8px}\n.skm-view-toggle{flex:none;display:inline-flex;align-items:center;gap:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:3px;transition:border-color 140ms ease}\n.skm-view-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:30px;height:28px;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-view-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-view-btn[data-active]{background:var(--dsw-alias-bg-module-platform,#eef0f2);color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-view-btn:active{transform:scale(.94)}\n.skm-hint-row{flex:none;display:flex;align-items:center;gap:10px;padding:6px 16px 0}\n.skm-hint-row-text{flex:1;min-width:0;font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-banner{flex:none;display:flex;align-items:center;gap:12px;margin:10px 16px 0;box-sizing:border-box;border:1px solid #f2df9e;border-radius:14px;background:#fdf8e3;padding:10px 12px;cursor:pointer;transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-banner:hover{border-color:#ecd58a;box-shadow:0 2px 8px rgba(232,163,61,.12)}\n.skm-banner:active{transform:scale(.995)}\n.skm-banner-active{border-color:#e8a33d;box-shadow:0 0 0 3px rgba(232,163,61,.18)}\n.skm-banner-icon{flex:none;width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;border:1.5px solid #e8a33d;color:#e8a33d;background:transparent}\n.skm-banner-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-banner-title{font-size:14px;font-weight:700;line-height:20px;color:#1f2937}\n.skm-banner-sub{font-size:12px;line-height:17px;color:#6b7280;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-banner-btn{flex:none;display:inline-flex;align-items:center;height:32px;box-sizing:border-box;border:none;border-radius:10px;background:#e8850c;color:#fff;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 14px;cursor:pointer;box-shadow:0 1px 3px rgba(232,133,12,.35);transition:background 140ms ease,transform 140ms ease,box-shadow 140ms ease}\n.skm-banner-btn:hover{background:#d67906;box-shadow:0 2px 8px rgba(232,133,12,.4);transform:translateY(-1px)}\n.skm-banner-btn:active{transform:translateY(0) scale(.98)}\n.skm-main-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;padding:12px 16px 20px;display:flex;flex-direction:column;gap:12px;scrollbar-gutter:stable}\n.skm-hub-section{min-width:0;width:100%;box-sizing:border-box}\n/* \u5C55\u5F00/\u6298\u53E0\u6052\u4E3A\u6574\u884C\u5BBD\uFF1A\u65E7\u89C4\u5219\u53EA\u8BA9 data-open \u7684 section \u8DE8\u4E24\u5217\uFF0C\u6536\u8D77\u65F6\u4F1A\u7F29\u6210\u534A\u5BBD\u3002 */\n.skm-hub-section{display:flex;flex-direction:column;min-width:0}\n.skm-hub-section-head{display:flex;align-items:center;gap:8px;min-width:0;padding:2px 4px 0}\n.skm-no-result{padding:18px 4px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u65B0\u5EFA\u6280\u80FD\u5305\u5165\u53E3\uFF08\u7070\u5B57\u6309\u94AE\u884C\uFF09 */\n.skm-new-bundle-line{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:4px;border:none;border-radius:8px;padding:6px 10px;margin:2px 0 0 4px;background:transparent;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c);cursor:pointer;font-family:inherit;transition:background 140ms ease,color 140ms ease}\n.skm-new-bundle-line:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-secondary,#61666b)}\n/* \u5206\u9875\u884C */\n.skm-pagination{flex:none;display:flex;align-items:center;gap:10px;padding:4px 4px 0}\n.skm-page-info{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-page-btns{flex:1;display:flex;align-items:center;gap:4px}\n.skm-page-btn{flex:none;min-width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:8px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:12px;line-height:18px;font-family:inherit;cursor:pointer;transition:border-color 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-page-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-page-btn:active{transform:scale(.94)}\n.skm-page-btn:disabled{opacity:.45;cursor:default}\n.skm-page-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n.skm-page-size-sel{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b)}\n\n/* \u2500\u2500 \u5F52\u5165\u6280\u80FD\u5305\u5F39\u7A97\uFF08\u5361\u7247\u5316\uFF0C\u4E0E\u6280\u80FD\u5361\u7247\u540C\u8BED\u8A00\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.skm-assign-modal{width:min(560px,calc(100vw - 48px))}\n.skm-assign-modal-body{overflow:hidden;display:flex;flex-direction:column;max-height:min(560px,calc(100vh - 180px))}\n.skm-assign-list{list-style:none;margin:0;padding:4px 2px 2px;display:flex;flex-direction:column;gap:8px;overflow-y:auto}\n.skm-assign-card{display:flex;align-items:center;gap:10px;width:100%;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.08));border-radius:12px;background:var(--dsw-alias-bg-base,#fff);padding:10px 12px;cursor:pointer;font-family:inherit;text-align:left;opacity:0;animation:skm-card-in 240ms cubic-bezier(.2,.7,.3,1.06) forwards;animation-delay:calc(var(--skm-i,0)*45ms);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-assign-card:hover{border-color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 2px 8px rgba(16,24,40,.07);transform:translateY(-1px)}\n.skm-assign-card:active{transform:translateY(0) scale(.99)}\n.skm-assign-card-icon{flex:none;width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);transition:color 140ms ease,border-color 140ms ease}\n.skm-assign-card:hover .skm-assign-card-icon{color:var(--dsw-alias-label-primary,#0f1115);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14))}\n.skm-assign-card-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-assign-card-name{font-size:14px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary,#0f1115);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-assign-card-desc{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-assign-go{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;color:var(--dsw-alias-label-caption,#adb2b8);transform:rotate(-90deg);transition:transform 160ms ease,background 140ms ease,color 140ms ease}\n.skm-assign-card:hover .skm-assign-go{transform:rotate(-90deg) translateX(2px);color:var(--dsw-alias-state-business-primary,#4176e6);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.03))}\n.skm-skill-list{list-style:none;margin:0;padding:2px 6px 6px;width:100%;display:flex;flex-direction:column;gap:2px}\n.skm-skill-item{display:flex;flex-direction:column;gap:2px;padding:2px 0;border-radius:8px}\n.skm-skill-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-row{display:flex;align-items:center;gap:6px;padding:2px 6px;border-radius:8px}\n.skm-skill-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-label{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}\n.skm-skill-name{font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary,#eee);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-skill-desc{font-size:12px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-skill-expand{flex:none;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;border-radius:6px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-tertiary,#888);transition:transform 120ms}\n.skm-skill-expand:hover{color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-expand[data-open='true']{transform:rotate(180deg)}\n.skm-skill-count{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:8px;padding:0 6px;white-space:nowrap}\n.skm-skill-compat{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:170px}\n.skm-skill-files{list-style:none;margin:0 0 2px 10px;padding:2px 0 2px 10px;border-left:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));display:flex;flex-direction:column;gap:0}\n.skm-skill-file{display:flex;align-items:center;gap:6px;padding:2px 6px;border-radius:6px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#bbb);font-family:ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.skm-skill-file:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-file[data-main='true']{color:var(--dsw-alias-label-primary,#eee);font-weight:500}\n.skm-skill-dir{color:var(--dsw-alias-label-tertiary,#888)}\n.skm-skill-preview{border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:10px;background:var(--dsw-alias-bg-base,#0e1116);padding:8px 12px;margin:0 0 2px 10px;font-size:12px;line-height:20px;color:var(--dsw-alias-label-primary,#eee);overflow:auto;max-height:280px;box-sizing:border-box}\n.skm-skill-preview h3,.skm-skill-preview h4,.skm-skill-preview h5{margin:10px 0 4px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#eee)}\n.skm-skill-preview p{margin:4px 0}\n.skm-skill-preview pre{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:8px;padding:8px 10px;overflow:auto;font-family:ui-monospace,monospace;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#bbb);margin:6px 0}\n.skm-skill-preview code{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:4px;padding:0 4px;font-family:ui-monospace,monospace;font-size:11px}\n.skm-skill-preview a{color:var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-skill-preview ul{margin:4px 0;padding-left:18px}\n.skm-skill-preview li{margin:2px 0}\n/* \u67E5\u770B\u5668\u9ED8\u8BA4\u5C31\u662F\u5927\u753B\u5E45\uFF081280\u00D7880 \u4E0A\u9650\uFF0C\u968F\u89C6\u53E3\u6536\u7F29\uFF09\uFF0C\u53EF\u4E00\u952E\u5168\u5C4F\uFF1B\u5BBD/\u9AD8\u5E26\u7F13\u52A8\u8FC7\u6E21\u3002 */\n.skm-viewer-modal{width:min(1280px,calc(100vw - 64px));animation:skm-viewer-in 260ms cubic-bezier(.2,.7,.3,1.06);transition:width 320ms cubic-bezier(.22,.72,.24,1)}\n.skm-viewer-modal-full{width:calc(100vw - 48px)}\n@keyframes skm-viewer-in{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:none}}\n.skm-viewer-body{overflow:hidden;display:flex;flex-direction:column;height:min(880px,calc(100vh - 96px));transition:height 320ms cubic-bezier(.22,.72,.24,1);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2)}\n/* \u5B98\u65B9 Modal \u7684 root \u81EA\u5E26 24px \u5185\u8FB9\u8DDD\u3001dialog \u81EA\u5E26 24px \u4E0B\u5185\u8FB9\u8DDD\uFF1A\n \u5168\u5C4F\u6863\u6309\u8FD9\u4E24\u5904\u7559\u767D\u6536\uFF0C\u514D\u5F97\u88AB flex-shrink \u622A\u65AD\u6216\u4E0A\u4E0B\u6EA2\u51FA\u3002 */\n.skm-viewer-modal-full .skm-viewer-body{height:calc(100vh - 76px)}\n/* \u5F39\u7A97\u5934\u90E8\uFF08\u5B98\u65B9 Modal \u7684 header \u662F\u672C\u5BB9\u5668\u7B2C\u4E00\u4E2A div\uFF09\uFF1A\u968F\u5927\u753B\u5E45\u653E\u5927\u4E00\u6863\u3002 */\n.skm-viewer-body > div:first-child{padding:20px 18px 0 26px}\n.skm-viewer-body > div:first-child h2{font-size:17px;line-height:26px;font-weight:600}\n.skm-viewer-body > div:nth-of-type(2){flex:1;min-height:0;display:flex;flex-direction:column;margin-top:2px;padding:0 20px 20px}\n.skm-viewer-toolbar{flex:none;display:flex;align-items:center;gap:10px;padding:0 2px 12px}\n.skm-viewer-path{flex:1;min-width:0;display:flex;align-items:center;gap:8px;font-size:12.5px;line-height:18px;font-family:ui-monospace,monospace;color:var(--dsw-alias-label-tertiary,#888);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.skm-viewer-path b{font-weight:600;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-viewer-tool-group{flex:none;display:inline-flex;align-items:center;gap:2px;padding:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7)}\n.skm-viewer-tool-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:26px;padding:0 7px;box-sizing:border-box;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-weight:600;line-height:16px;cursor:pointer;transition:background 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-viewer-tool-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-viewer-tool-btn:active{transform:scale(.93)}\n.skm-viewer-tool-btn[data-active='true']{background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 1px 3px rgba(16,24,40,.12)}\n.skm-viewer-tool-btn-a1{font-size:11px}\n.skm-viewer-tool-btn-a3{font-size:15px}\n.skm-viewer-tool-btn-frame{border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.1));border-radius:10px;background:var(--dsw-alias-bg-base,#fff)}\n.skm-viewer-tool-btn-frame[data-active='true']{border-color:var(--dsw-alias-state-business-primary,#4176e6);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4176e6) 10%,transparent);color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:none}\n.skm-viewer-layout{flex:1;min-height:0;display:flex;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:14px;overflow:hidden}\n.skm-viewer-nav{flex:none;width:252px;border-right:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));overflow-y:auto;padding:8px;box-sizing:border-box;background:var(--dsw-alias-bg-module-platform,#f5f6f7)}\n.skm-viewer-nav-item{display:flex;align-items:center;gap:6px;padding:5px 9px;border-radius:8px;font-size:12.5px;line-height:20px;color:var(--dsw-alias-label-secondary,#bbb);font-family:ui-monospace,monospace;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background 140ms ease,color 140ms ease,box-shadow 160ms ease}\n.skm-viewer-nav-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-viewer-nav-item[data-active='true']{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4a9eff) 14%,transparent);color:var(--dsw-alias-label-primary,#eee);box-shadow:inset 2px 0 0 var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-viewer-nav-dir{cursor:default;color:var(--dsw-alias-label-tertiary,#888)}\n/* \u6B63\u6587\u5168\u90E8\u8D70 em\uFF1A--skm-vfs \u4E00\u4E2A\u53D8\u91CF\u9A71\u52A8\u5B57\u53F7\u4E09\u6863\uFF0C\u5207\u6362\u65F6\u53EA\u8FC7\u6E21 font-size\u3002 */\n.skm-viewer-content{flex:1;min-width:0;overflow:auto;padding:26px 34px 48px;box-sizing:border-box;font-size:var(--skm-vfs,15px);line-height:1.75;color:var(--dsw-alias-label-primary,#eee);transition:font-size 180ms ease}\n.skm-viewer-content > :first-child{margin-top:0}\n.skm-viewer-content h1,.skm-viewer-content h2,.skm-viewer-content h3,.skm-viewer-content h4,.skm-viewer-content h5{margin:1.15em 0 .5em;line-height:1.35;font-weight:600;color:var(--dsw-alias-label-primary,#eee);max-width:84ch}\n.skm-viewer-content h1{font-size:1.72em;letter-spacing:-.012em}\n.skm-viewer-content h2{font-size:1.38em}\n.skm-viewer-content h3{font-size:1.16em}\n.skm-viewer-content h4,.skm-viewer-content h5{font-size:1.04em}\n.skm-viewer-content p{margin:.62em 0;max-width:92ch}\n.skm-viewer-content pre{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:10px;padding:14px 16px;overflow:auto;font-family:ui-monospace,monospace;font-size:.86em;line-height:1.7;color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-viewer-content code{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:5px;padding:1px 5px;font-family:ui-monospace,monospace;font-size:.86em}\n.skm-viewer-content pre code{background:transparent;padding:0}\n.skm-viewer-content a{color:var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-viewer-content ul,.skm-viewer-content ol{margin:.62em 0;padding-left:1.6em}\n.skm-viewer-content li{margin:.32em 0;max-width:92ch}\n.skm-viewer-content blockquote{margin:.9em 0;padding:.25em 1em;border-left:3px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));color:var(--dsw-alias-label-secondary,#bbb);max-width:82ch}\n.skm-viewer-content hr{border:none;border-top:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));margin:1.5em 0}\n.skm-loose-empty{margin:2px;padding:4px 0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n\n/* \u2500\u2500 \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\uFF08Skills Hub \u98CE\u683C\uFF1A\u7EFF\u8272\u80F6\u56CA + \u767D\u8272\u5706\u94AE\uFF0C\u56DE\u5F39\u8FC7\u6E21\uFF09 \u2500\u2500 */\n.skm-toggle{flex:none;display:inline-flex;align-items:center;width:34px;height:20px;box-sizing:border-box;border-radius:10px;padding:2px;appearance:none;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-alias-bg-module-platform,#e9ebee);cursor:pointer;transition:background 160ms ease,border-color 160ms ease,filter 160ms ease}\n.skm-toggle:hover{filter:brightness(1.03)}\n.skm-toggle:disabled{opacity:.55;cursor:not-allowed;filter:none}\n.skm-toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:1px}\n.skm-toggle-on{border-color:transparent;background:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-toggle-off{background:var(--dsw-alias-bg-module-platform,#e9ebee);border-color:var(--dsw-alias-border-l2,rgba(0,0,0,.1))}\n.skm-toggle-knob{display:block;width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform 180ms cubic-bezier(.3,1.4,.5,1)}\n.skm-toggle-on .skm-toggle-knob{transform:translateX(14px)}\n.skm-toggle-off .skm-toggle-knob{transform:translateX(0)}\n.skm-bundle-toggle{flex:none;display:inline-flex;align-items:center;gap:4px;margin-left:0}\n\n/* \u2500\u2500 Agent \u9884\u8BBE\u5206\u7C7B\u5706\u7403\u6761\uFF08\u5F27\u5F62\u6062\u590D\uFF0C\u6574\u5217\u4F4D\u4E8E\u7EDF\u8BA1\u884C\u4E0E\u5DE5\u5177\u680F\u4E4B\u95F4\uFF09 \u2500\u2500 */\n.skm-preset-strip{flex:none;display:flex;align-items:flex-start;gap:10px;padding:12px 16px 0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}\n.skm-preset-strip::-webkit-scrollbar{display:none}\n.skm-preset-ball-wrap{flex:none;display:flex;flex-direction:column;align-items:center;gap:6px;width:56px;border:none;background:transparent;padding:0;cursor:pointer;font-family:inherit}\n.skm-preset-ball{position:relative;display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:50%;box-sizing:border-box;font-size:17px;font-weight:600;line-height:1;color:var(--dsw-alias-label-primary,#eee);text-transform:uppercase;background:var(--dsw-alias-bg-layer-2,#262b36);border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));transition:border-color 140ms,filter 140ms}\n.skm-preset-ball-wrap:hover .skm-preset-ball{filter:brightness(1.15)}\n.skm-preset-ball-wrap[data-active='true'] .skm-preset-ball{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-preset-ball[data-dot='true']::after{content:'';position:absolute;right:-1px;bottom:-1px;width:12px;height:12px;border-radius:50%;background:var(--dsw-alias-state-business-primary,#4a9eff);border:2px solid var(--dsw-alias-bg-layer-1,#1c1f26);box-sizing:border-box}\n.skm-preset-ball-label{max-width:56px;font-size:11px;line-height:15px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}\n.skm-preset-ball-wrap[data-active='true'] .skm-preset-ball-label{color:var(--dsw-alias-label-primary,#eee)}\n.skm-preset-hint{flex:none;display:flex;align-items:center;gap:8px;padding:0 2px 2px}\n.skm-preset-hint-text{flex:1;min-width:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-preset-reset{flex:none;appearance:none;border:none;border-radius:12px;padding:2px 10px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#999);background:transparent;cursor:pointer;font-family:inherit}\n.skm-preset-reset:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n\n/* \u2500\u2500 \u9762\u677F\u7EA7\u63D0\u793A\u6761\uFF1A\u5220\u9664/\u5F52\u7EC4/\u6539\u540D/\u5B89\u88C5\u7684\u6210\u8D25\u90FD\u8981\u8BA9\u7528\u6237\u770B\u89C1 \u2500\u2500 */\n.skm-toast-stack{position:absolute;right:18px;bottom:18px;z-index:6;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}\n.skm-toast{display:inline-flex;align-items:center;gap:8px;max-width:min(460px,72vw);box-sizing:border-box;padding:8px 14px;border-radius:10px;font-size:12.5px;line-height:18px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-static-neutral-bluish-00,#fff);color:var(--dsw-alias-label-primary,#222);box-shadow:var(--dsw-shadow-lv2,0 6px 22px rgba(0,0,0,.16));animation:skm-toast-in 260ms cubic-bezier(.2,.9,.25,1) both}\n.skm-toast-ok{border-color:rgba(35,160,90,.38);color:#1c7a45}\n.skm-toast-err{border-color:rgba(226,80,64,.42);color:#b3271c}\n.skm-toast-dot{flex:none;width:6px;height:6px;border-radius:50%;background:currentColor;animation:skm-toast-ping 1.7s ease-out infinite}\n@keyframes skm-toast-in{from{opacity:0;transform:translateY(10px) scale(.97)}to{opacity:1;transform:none}}\n@keyframes skm-toast-ping{0%{box-shadow:0 0 0 0 currentColor;opacity:.9}70%{box-shadow:0 0 0 7px rgba(0,0,0,0);opacity:.35}100%{box-shadow:0 0 0 0 rgba(0,0,0,0);opacity:1}}\nbody[data-ds-dark-theme] .skm-toast{background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\nbody[data-ds-dark-theme] .skm-toast-ok{color:#6ee7a8}\nbody[data-ds-dark-theme] .skm-toast-err{color:#ff8a7a}\n\n/* \u2500\u2500 \u7A7A\u6280\u80FD\u5305\uFF1A\u53EF\u89C1 + \u53EF\u64CD\u4F5C\uFF08\u65E7\u5B9E\u73B0\u628A 0 \u6210\u5458\u7684\u5305\u6574\u6BB5\u8FC7\u6EE4\u6389\uFF0C\u5EFA\u5B8C\u5305\u5C31\u300C\u6D88\u5931\u300D\uFF09 \u2500\u2500 */\n.skm-bundle-empty{grid-column:1/-1;display:flex;align-items:center;gap:12px;flex-wrap:wrap;box-sizing:border-box;margin:2px 0 6px;padding:14px 16px;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.18));border-radius:12px;background:var(--dsw-alias-bg-layer-1,rgba(0,0,0,.02));animation:skm-fade-up 260ms ease both}\n.skm-bundle-empty-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary,#333)}\n.skm-bundle-empty-hint{flex:1 1 200px;min-width:160px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#8b9099)}\n.skm-bundle-empty-btn{flex:none;display:inline-flex;align-items:center;gap:6px;appearance:none;border:1px solid var(--dsw-alias-state-business-primary,#4176e6);border-radius:9px;padding:5px 12px;font-size:12px;line-height:18px;font-family:inherit;cursor:pointer;color:var(--dsw-alias-state-business-primary,#4176e6);background:transparent;transition:background 160ms ease,color 160ms ease,transform 160ms ease,box-shadow 160ms ease}\n.skm-bundle-empty-btn:hover{background:var(--dsw-alias-state-business-primary,#4176e6);color:#fff;transform:translateY(-1px);box-shadow:0 4px 14px rgba(65,118,230,.28)}\n.skm-bundle-empty-btn:active{transform:translateY(0)}\n@keyframes skm-fade-up{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}\n\n/* \u2500\u2500 \u8D26\u672C\u5931\u6548\u5F15\u7528\uFF1A\u660E\u8BF4\u300C\u5305\u91CC\u6709\u6307\u5411\u5DF2\u5220\u9664\u6280\u80FD\u7684\u6761\u76EE\u300D\u5E76\u4E00\u952E\u6E05\u7406 \u2500\u2500 */\n.skm-bundle-missing{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:2px 0 6px;padding:8px 12px;border-radius:10px;border:1px solid rgba(240,150,40,.38);background:rgba(240,150,40,.09);font-size:12px;line-height:18px;color:#8a5a12;animation:skm-fade-up 260ms ease both}\n.skm-bundle-missing code{padding:1px 6px;border-radius:5px;background:rgba(240,150,40,.16);font-size:11.5px}\n.skm-bundle-missing-btn{appearance:none;border:1px solid rgba(240,150,40,.55);background:transparent;border-radius:8px;padding:2px 9px;font-size:11.5px;line-height:18px;font-family:inherit;cursor:pointer;color:inherit;transition:background 140ms ease,transform 140ms ease}\n.skm-bundle-missing-btn:hover{background:rgba(240,150,40,.2);transform:translateY(-1px)}\nbody[data-ds-dark-theme] .skm-bundle-missing{color:#f0c48a}\n.skm-install-hint{margin:2px 0 0;font-size:11.5px;line-height:17px;color:var(--dsw-alias-label-tertiary,#8b9099)}\n\n/* \u2500\u2500 SKILL \u9876\u680F\u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 + \u72B6\u6001\u5206\u6BB5\uFF08\u5E26\u8BA1\u6570\uFF09+ \u5065\u5EB7\u6307\u793A + \u5237\u65B0/\u65B0\u5EFA/\u6DFB\u52A0 \u2500\u2500 */\n.skm-topbar-actions{flex:1 1 100%;order:4;min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.skm-status-seg-count{margin-left:6px;font-size:11px;line-height:15px;font-variant-numeric:tabular-nums;opacity:.72}\n.skm-health-inline{flex:none;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:17px;white-space:nowrap;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-health-inline::before{content:'';flex:none;width:7px;height:7px;border-radius:50%;background:currentColor}\n.skm-health-inline[data-tone='ok']{color:#12805c}\n.skm-health-inline[data-tone='warn']{color:#c2410c}\n.skm-health-inline[data-tone='pending'],.skm-health-inline[data-tone='idle']{color:var(--dsw-alias-label-caption,#adb2b8)}\n\n/* \u2500\u2500 \u79FB\u52A8\u7AEF\uFF1A\u4FA7\u680F\u6536\u7A84/\u9690\u85CF\u3001\u67E5\u770B\u5668\u4E0A\u4E0B\u5806\u53E0\u3001\u5361\u7247\u7F51\u683C\u5355\u5217 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 767.98px) {\n .skm-viewer-modal,.skm-viewer-modal-full{width:calc(100vw - 48px)}\n .skm-viewer-body,.skm-viewer-modal-full .skm-viewer-body{height:calc(100vh - 76px)}\n .skm-viewer-body > div:nth-of-type(2){padding:0 10px 10px}\n .skm-viewer-toolbar{flex-wrap:wrap;gap:6px;padding-bottom:8px}\n .skm-viewer-layout{flex-direction:column}\n .skm-viewer-nav{width:100%;border-right:none;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));flex:none;max-height:38%}\n .skm-viewer-content{flex:1;min-height:0;padding:16px 14px 28px}\n .skm-hub-side{display:none}\n .skm-skill-grid{grid-template-columns:minmax(0,1fr)}\n .skm-toolbar{padding:12px 12px 4px}\n .skm-banner{margin:10px 12px 0}\n .skm-main-scroll{padding:12px 12px 20px}\n}\n\n/* \u2500\u2500 \u51CF\u5F31\u52A8\u6548\uFF1A\u5361\u7247\u5165\u573A/\u60AC\u505C\u4F4D\u79FB\u4E0E\u5F00\u5173\u56DE\u5F39\u5168\u90E8\u6536\u655B \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (prefers-reduced-motion: reduce) {\n .skm-skill-card{animation:none;opacity:1;transition:none}\n .skm-assign-card{animation:none;opacity:1;transition:none}\n .skm-drop-menu{animation:none}\n .skm-viewer-modal{animation:none}\n .skm-viewer-modal,.skm-viewer-body,.skm-viewer-content,.skm-viewer-nav-item,.skm-viewer-tool-btn{transition:none}\n .skm-toggle-knob{transition:none}\n .skm-toggle{transition:none}\n .skm-tag{transition:none}\n .skm-skill-copy,.skm-skill-icon,.skm-skill-foot-icon,.skm-icon-action,.skm-bundle,.skm-hub-item,.skm-tool-button,.skm-banner,.skm-banner-btn,.skm-view-btn,.skm-drop-item,.skm-assign-card{transition:none}\n .skm-toast{animation:none}\n .skm-toast-dot{animation:none}\n .skm-bundle-empty,.skm-bundle-missing{animation:none}\n .skm-bundle-empty-btn,.skm-bundle-missing-btn{transition:none}\n .skm-skill-card::before,.skm-skill-badge,.skm-skill-title,.skm-tag-status{transition:none}\n .skm-cat-chip-row{animation:none}\n .skm-bundle-cat-tag,.skm-cat-selected-tag{animation:none}\n .skm-cat-chip,.skm-bundle-cat-tag,.skm-cat-preset,.skm-cat-remove,.skm-cat-input,.skm-cat-chip-count{transition:none}\n}\n`\n\nexport function ensureStyles() {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n", "/**\r\n * dnd \u2014 \u63D0\u793A\u8BCD\u9762\u677F\u7684\u62D6\u62FD\u8F7D\u8377 + \u300C\u62D6\u5230\u9636\u6BB5 Tab\u300D\u6295\u9012\u70B9\u3002\r\n *\r\n * \u4E09\u4E2A Tab \u7684\u62D6\u62FD\u624B\u52BF\uFF08\u4E0E locales \u91CC\u7684\u63D0\u793A\u6587\u6848\u4E00\u4E00\u5BF9\u5E94\uFF09\uFF1A\r\n * - \u5217\u8868\u5185\u4E0A\u4E0B\u62D6 = \u6392\u5E8F\uFF08\u6BB5\u884C\uFF1B\u5DE5\u5177\u5217\u8868\u6309\u6CE8\u518C\u8868\u987A\u5E8F\uFF0C\u4E0D\u652F\u6301\u6392\u5E8F\uFF09\uFF1B\r\n * - \u300C\u5168\u90E8\u300D\u6C60 \u21C4 \u9636\u6BB5\u5217\u8868 = \u52A0\u5165\u8BE5\u9636\u6BB5 / \u4ECE\u8BE5\u9636\u6BB5\u62FF\u6389\uFF1B\r\n * - \u884C\u62D6\u5230\u5934\u90E8\u9636\u6BB5 Tab = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u5DE5\u5177\u7684\u9690\u85CF\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF09\u3002\r\n *\r\n * \u8F7D\u8377\u8D70\u4E24\u6761\u8DEF\uFF1A`dataTransfer`\uFF08\u6807\u51C6\u8DEF\u5F84\uFF09\u4E0E\u6A21\u5757\u5185\u5B58\uFF08dragover \u9636\u6BB5\u591A\u6570\u6D4F\u89C8\u5668\r\n * \u4E0D\u7ED9\u8BFB dataTransfer\uFF0C\u540C\u9875\u9762\u62D6\u62FD\u672C\u6765\u4E5F\u4E0D\u9700\u8981\u5E8F\u5217\u5316\uFF09\u3002\u9636\u6BB5 Tab \u5728 Panel \u5934\u90E8\u3001\r\n * \u4E0E\u5217\u8868\u4E0D\u5728\u540C\u4E00\u68F5\u5B50\u6811\uFF0C\u6240\u4EE5\u6295\u9012\u70B9\u7528\u300C\u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\u6CE8\u518C\u4E00\u4E2A\u56DE\u8C03\u300D\u6765\u63A5\uFF1A\r\n * \u6362 Tab / \u6362\u6A21\u5F0F\u65F6\u65E7\u5217\u8868\u5378\u8F7D\u3001\u65B0\u5217\u8868\u6CE8\u518C\uFF0C\u4EFB\u4F55\u65F6\u523B\u53EA\u6709\u4E00\u4E2A\u5904\u7406\u8005\u3002\r\n */\r\nimport type { DragEvent as ReactDragEvent } from 'react'\r\nimport type { EntrySource, PhaseKey } from './types.ts'\r\n\r\n/** \u8F7D\u8377\u79CD\u7C7B\uFF1A\u6BB5\u884C / \u5DE5\u5177\u884C\u3002 */\r\nexport type DragKind = 'section' | 'tool'\r\n/** \u6765\u6E90\uFF1A\u67D0\u4E2A\u9636\u6BB5\u5217\u8868\uFF0C\u6216\u300C\u5168\u90E8\u300D\u53EA\u8BFB\u6C60\u3002 */\r\nexport type DragFrom = PhaseKey | 'pool'\r\n\r\nexport interface DragPayload {\r\n kind: DragKind\r\n name: string\r\n /** \u6761\u76EE\u6765\u6E90\uFF1A\u540C\u540D\u4E0D\u540C\u6E90\u6309 name+source \u5206\u5F00\u64CD\u4F5C\u3002 */\r\n source?: EntrySource\r\n /** \u5DE5\u5177\u540C\u540D\u591A\u884C\uFF08live / preset \u4E24\u6001\uFF09\u7684\u5C55\u793A\u533A\u5206\u540E\u7F00\u3002 */\r\n keySuffix?: string\r\n from: DragFrom\r\n /** \u6BB5\u884C\u5F53\u524D\u6587\u672C\uFF08\u62D6\u5230\u522B\u7684\u9636\u6BB5\u65F6\u4F5C\u4E3A\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165\u6587\u672C\uFF09\uFF1B\u5DE5\u5177\u4E0D\u7528\u3002 */\r\n text?: string\r\n /** \u5DE5\u5177\u884C\u5F53\u524D\u662F\u5426\u5728\u8BE5\u9636\u6BB5\u9690\u85CF\uFF1A\u9636\u6BB5\u95F4\u590D\u5236\u65F6\u4E00\u8D77\u5E26\u8FC7\u53BB\u3002 */\r\n hidden?: boolean\r\n}\r\n\r\n/** \u81EA\u5B9A\u4E49 MIME\uFF1A\u540C\u9875\u9762\u5185\u7528\u5B83\u533A\u5206\u300C\u672C\u9762\u677F\u7684\u62D6\u62FD\u300D\u4E0E\u5916\u90E8\u62D6\u5165\uFF08\u5982\u5BFC\u5165\u6280\u80FD\uFF09\u3002 */\r\nconst MIME = 'application/x-dsh-prompt-part'\r\n\r\n/**\r\n * \u662F\u4E0D\u662F\u672C\u9762\u677F\u53D1\u8D77\u7684\u62D6\u62FD \u2014\u2014 \u539F\u751F\u4E8B\u4EF6\u7248\uFF08drag-scroll \u7528\uFF09\u3002\r\n *\r\n * \u62D6\u62FD\u8FDB\u884C\u4E2D `dataTransfer.types` \u53EF\u8BFB\uFF08\u6570\u636E\u672C\u8EAB\u88AB\u4FDD\u62A4\uFF0C\u7C7B\u578B\u6E05\u5355\u4E0D\u4FDD\u62A4\uFF09\uFF0C\r\n * \u6240\u4EE5\u6355\u83B7\u9636\u6BB5\u7684\u76D1\u542C\u80FD\u9760\u5B83\u8FC7\u6EE4\uFF1A\u53EA\u7ED9\u81EA\u5DF1\u4EBA\u7684\u62D6\u62FD\u505A\u8D34\u8FB9\u6EDA\u52A8\uFF0C\u5916\u6765\u62D6\u5165\u4E0D\u6EDA\u3002\r\n */\r\nexport function isPanelDrag(event: DragEvent): boolean {\r\n const types = event.dataTransfer?.types\r\n if (types === undefined) return false\r\n return Array.from(types).includes(MIME)\r\n}\r\n\r\nlet current: DragPayload | null = null\r\nlet phaseDrop: ((key: PhaseKey, payload: DragPayload) => void) | null = null\r\n\r\n/** \u62D6\u8D77\uFF1A\u767B\u8BB0\u8F7D\u8377 + \u5199 dataTransfer\uFF08\u5199\u4E0D\u8FDB\u53BB\u4E5F\u80FD\u9760\u5185\u5B58\u8F7D\u8377\u7EE7\u7EED\uFF09\u3002 */\r\nexport function beginDrag(event: ReactDragEvent, payload: DragPayload): void {\r\n current = payload\r\n try {\r\n event.dataTransfer.setData(MIME, JSON.stringify(payload))\r\n event.dataTransfer.setData('text/plain', payload.name)\r\n event.dataTransfer.effectAllowed = 'copyMove'\r\n } catch { /* \u81EA\u5B9A\u4E49 MIME \u88AB\u62D2\uFF1A\u8BFB\u4FA7\u56DE\u843D\u5185\u5B58\u8F7D\u8377 */ }\r\n}\r\n\r\n/** \u62D6\u5B8C\uFF1A\u6E05\u6389\u8F7D\u8377\uFF08drop \u4E4B\u540E\u6D4F\u89C8\u5668\u8FD8\u4F1A\u8865\u4E00\u6B21 dragend\uFF09\u3002 */\r\nexport function finishDrag(): void {\r\n current = null\r\n}\r\n\r\n/** \u8BFB\u8F7D\u8377\uFF1A\u4F18\u5148 dataTransfer\uFF0C\u56DE\u843D\u5185\u5B58\uFF08dragover \u9636\u6BB5\u53EA\u53EF\u80FD\u662F\u540E\u8005\uFF09\u3002 */\r\nexport function payloadOf(event: ReactDragEvent): DragPayload | null {\r\n try {\r\n const raw = event.dataTransfer.getData(MIME)\r\n if (raw !== '') return JSON.parse(raw) as DragPayload\r\n } catch { /* \u8BFB\u4E0D\u5230\u5C31\u7528\u5185\u5B58\u8F7D\u8377 */ }\r\n return current\r\n}\r\n\r\n/** \u662F\u4E0D\u662F\u672C\u9762\u677F\u8BA4\u53EF\u7684\u53EF\u6295\u653E\u8F7D\u8377\uFF08dragover \u9760\u5B83\u51B3\u5B9A\u8981\u4E0D\u8981 preventDefault\uFF09\u3002 */\r\nexport function acceptsDrop(event: ReactDragEvent, kind: DragKind): boolean {\r\n const payload = payloadOf(event)\r\n return payload !== null && payload.kind === kind\r\n}\r\n\r\n/** \u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\uFF08\u6BB5 / \u5DE5\u5177\uFF09\u628A\u300C\u62D6\u5230\u9636\u6BB5 Tab\u300D\u7684\u5904\u7406\u51FD\u6570\u6CE8\u518C\u8FDB\u6765\u3002 */\r\nexport function setPhaseDropHandler(next: ((key: PhaseKey, payload: DragPayload) => void) | null): void {\r\n phaseDrop = next\r\n}\r\n\r\n/** \u9636\u6BB5 Tab \u88AB\u6295\u653E\uFF1A\u4EA4\u7ED9\u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\u5904\u7406\uFF08\u6CA1\u6709\u5217\u8868\u5C31\u4EC0\u4E48\u90FD\u4E0D\u505A\uFF09\u3002 */\r\nexport function dropOnPhase(key: PhaseKey, payload: DragPayload | null): void {\r\n if (payload === null) return\r\n phaseDrop?.(key, payload)\r\n}\r\n", "/** \u63D0\u793A\u8BCD\u5B9A\u5236\u9762\u677F\u5404\u7EC4\u4EF6\u5171\u4EAB\u7684\u5185\u8054\u6837\u5F0F\uFF08\u989C\u8272\u8D70\u534A\u900F\u660E\u7070\uFF0C\u968F\u5BBF\u4E3B\u4E3B\u9898\u81EA\u7136\u9002\u914D\uFF09\u3002 */\nexport const s = (() => {\n const flex = { display: 'flex', alignItems: 'center' }\n return {\n // \u2500\u2500 \u9762\u677F\u9AA8\u67B6\uFF08\u62BD\u5C49\u5185\u90E8\u5206\u680F\u5E03\u5C40\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n pRoot: { height: '100%', display: 'flex', flexDirection: 'column', fontFamily: 'inherit', fontSize: 13, lineHeight: 1.5, minHeight: 0 },\n head: { ...flex, gap: 10, padding: '10px 14px 8px', flexWrap: 'wrap', borderBottom: '1px solid rgba(128,128,128,.18)' },\n headTitle: { ...flex, gap: 8, fontSize: 15, fontWeight: 600, whiteSpace: 'nowrap' },\n seg: { ...flex, gap: 2, padding: 2, border: '1px solid rgba(128,128,128,.28)', borderRadius: 8 },\n segBtn: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.72, fontSize: 13, whiteSpace: 'nowrap' },\n segBtnActive: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.22)', cursor: 'pointer', color: 'inherit', fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap' },\n // \u62D6\u62FD\u60AC\u505C\u5728\u9636\u6BB5\u6309\u94AE\u4E0A\uFF08\u677E\u624B = \u590D\u5236\u5230\u8BE5\u9636\u6BB5\uFF09\u3002\n segBtnDrop: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.16)', outline: '2px dashed rgba(88,166,255,.85)', outlineOffset: 1, cursor: 'pointer', color: 'inherit', fontSize: 13, whiteSpace: 'nowrap' },\n segBtnDropActive: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.3)', outline: '2px dashed rgba(88,166,255,.9)', outlineOffset: 1, cursor: 'pointer', color: 'inherit', fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap' },\n grow: { flex: 1, minWidth: 0 },\n headActions: { ...flex, gap: 6, marginLeft: 'auto' },\n iconBtn: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 28, height: 28, border: 'none', borderRadius: 8, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.75 },\n // \u9884\u8BBE\uFF08\u7F16\u8F91\u76EE\u6807\uFF09\u884C\u6539\u7528\u80FD\u529B\u9762\u677F\u9876\u680F\u7684 chips \u7C7B\u540D\uFF08\u89C1 Panel.tsx \u7684 css.topbar / css.catItem\uFF09\uFF0C\n // \u8FD9\u91CC\u4E0D\u518D\u4FDD\u7559\u81EA\u7ED8\u7684 subhead / targetRow / targetTab \u6837\u5F0F\u3002\n body: { flex: 1, minHeight: 0, display: 'flex', alignItems: 'stretch' },\n colLeft: { width: 420, flex: 'none', display: 'flex', flexDirection: 'column', minHeight: 0, borderRight: '1px solid rgba(128,128,128,.18)', boxSizing: 'border-box' },\n colScroll: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '10px 12px' },\n colFoot: { flex: 'none', ...flex, gap: 8, padding: '8px 12px', borderTop: '1px solid rgba(128,128,128,.18)', flexWrap: 'wrap' },\n colRight: { flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', minHeight: 0 },\n colRightScroll: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '10px 14px' },\n groupHead: { ...flex, gap: 8, marginBottom: 6, color: 'rgba(128,128,128,.95)', fontSize: 12, fontWeight: 600 },\n // \u2500\u2500 \u901A\u7528\u63A7\u4EF6\uFF08\u6CBF\u7528\u65E7\u9762\u677F\u7684\u89C2\u611F\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n list: { display: 'flex', flexDirection: 'column', gap: 6 },\n row: { ...flex, gap: 8, padding: '6px 8px', border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(128,128,128,.06)' },\n switchWrap: { ...flex, gap: 6, minWidth: 90 },\n rowBody: { flex: 1, minWidth: 0 },\n rowTitle: { ...flex, gap: 6, alignItems: 'baseline', flexWrap: 'wrap' },\n code: { fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' },\n orderTag: { color: 'rgba(128,128,128,.8)', fontSize: 11 },\n preview: { color: 'rgba(128,128,128,.85)', fontSize: 12, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },\n previewText: { fontFamily: 'monospace', fontSize: 12, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', flex: 1, minHeight: 0, overflowY: 'auto', padding: 10, border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(0,0,0,.18)', margin: 0 },\n toolWrap: { display: 'flex', flexWrap: 'wrap', gap: 6 },\n toolChip: { fontFamily: 'monospace', fontSize: 12, color: 'rgba(128,128,128,.95)', border: '1px solid rgba(128,128,128,.3)', borderRadius: 6, padding: '2px 6px', cursor: 'help' },\n badgeOk: { color: '#3fb950', fontSize: 11, border: '1px solid rgba(63,185,80,.5)', borderRadius: 999, padding: '0 6px' },\n badgeBlocked: { color: '#f85149', fontSize: 11, border: '1px solid rgba(248,81,73,.5)', borderRadius: 999, padding: '0 6px' },\n badgeReplaced: { color: '#d29922', fontSize: 11, border: '1px solid rgba(210,153,34,.5)', borderRadius: 999, padding: '0 6px' },\n badgeCustom: { color: '#58a6ff', fontSize: 11, border: '1px solid rgba(88,166,255,.5)', borderRadius: 999, padding: '0 6px' },\n badgeSystem: { color: 'rgba(128,128,128,.85)', fontSize: 11, border: '1px solid rgba(128,128,128,.4)', borderRadius: 999, padding: '0 6px' },\n mini: { padding: '3px 8px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', whiteSpace: 'nowrap' },\n arrowCol: { display: 'flex', flexDirection: 'column', gap: 2 },\n arrow: { padding: '0 6px', border: '1px solid rgba(128,128,128,.3)', borderRadius: 4, background: 'transparent', cursor: 'pointer', color: 'inherit', fontSize: 11, lineHeight: 1.4, opacity: 0.8 },\n rowBlocked: { opacity: 0.55 },\n // \u2500\u2500 \u62D6\u62FD\uFF08\u89C1 dnd.ts\uFF09\uFF1A\u6293\u624B / \u62D6\u52A8\u4E2D\u7684\u884C / \u884C\u4E0A\u7684\u63D2\u5165\u4F4D\u7F6E / \u6574\u5757\u6295\u653E\u533A \u2500\u2500\n dragHandle: { flex: 'none', cursor: 'grab', color: 'rgba(128,128,128,.85)', fontSize: 13, lineHeight: 1, userSelect: 'none', padding: '0 2px' },\n dragging: { opacity: 0.5 },\n dropAbove: { boxShadow: 'inset 0 2px 0 0 #58a6ff' },\n dropBelow: { boxShadow: 'inset 0 -2px 0 0 #58a6ff' },\n dropZone: { outline: '2px dashed rgba(88,166,255,.55)', outlineOffset: -3, borderRadius: 8 },\n dropZoneActive: { outline: '2px dashed rgba(88,166,255,.9)', outlineOffset: -3, borderRadius: 8, background: 'rgba(88,166,255,.06)' },\n injectBox: { marginTop: 10, padding: '8px', border: '1px dashed rgba(128,128,128,.4)', borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6 },\n injectRow: { ...flex, gap: 6 },\n editBox: { display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4 },\n editInput: { padding: '6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit', fontFamily: 'inherit', fontSize: 12, resize: 'vertical', width: '100%', boxSizing: 'border-box' },\n input: { padding: '4px 6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit' },\n muted: { color: 'rgba(128,128,128,.75)', fontSize: 12 },\n error: { color: '#f85149', fontSize: 12, marginBottom: 6 },\n noticeOk: { color: '#3fb950', fontSize: 12, marginBottom: 6 },\n noticeWarn: { color: '#d29922', fontSize: 12, marginBottom: 6 },\n saveBtn: { padding: '4px 12px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },\n saveBtnDirty: { padding: '4px 12px', border: '1px solid #d29922', borderRadius: 6, background: 'rgba(210,153,34,.15)', cursor: 'pointer', color: 'inherit' },\n }\n})()\n", "/** \u63D0\u793A\u8BCD\u5B9A\u5236\u9762\u677F\uFF08\u5BA2\u6237\u7AEF\uFF09\u7684\u5171\u4EAB\u7C7B\u578B\u5B9A\u4E49\u3002\n *\n * \u9636\u6BB5\u4E0E\u6761\u76EE\u8EAB\u4EFD\u7684\u552F\u4E00\u6765\u6E90\uFF1A\n * - `PHASES` \u662F\u9636\u6BB5\u552F\u4E00\u63CF\u8FF0\u8868\uFF08\u4E0E\u670D\u52A1\u7AEF model.js \u540C\u6784\uFF09\uFF1A\u6BB5\u5B57\u6BB5\u3001\u4E0A\u4E0B\u6587\u5B57\u6BB5\u3001\n * \u5DE5\u5177\u5B57\u6BB5\u5168\u90E8\u7531\u5B83\u6D3E\u751F\uFF0C\u5BA2\u6237\u7AEF\u4E0D\u5F97\u518D\u624B\u5199\u7B2C\u4E8C\u4EFD\u4E09\u6001\u6620\u5C04\u3002\n * - \u6BB5 / \u5DE5\u5177 / \u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\u7684\u8EAB\u4EFD = `{name, source}`\uFF1B`source` \u662F\u6CE8\u518C\u5C42\n * \uFF08global / preset / agent / executor / workspace\uFF09\uFF0C\u53EF\u5E26 provider id\u3002\n * \u540C\u540D\u4E0D\u540C\u6E90\u662F\u4E0D\u540C\u6761\u76EE\u3002\n */\n\n/** \u6761\u76EE\u6765\u6E90\u7684\u6CE8\u518C\u5C42\u3002 */\nexport type SourceKind = 'global' | 'preset' | 'agent' | 'executor' | 'workspace'\n\n/** \u6761\u76EE\u6765\u6E90\uFF1A\u6CE8\u518C\u5C42 + \u53EF\u9009 provider / \u9884\u8BBE / \u4F1A\u8BDD\u6807\u8BC6\u3002 */\nexport interface EntrySource {\n kind: SourceKind\n id?: string\n}\n\n/** \u6BB5 / \u5DE5\u5177 / \u4E0A\u4E0B\u6587 / \u540D\u5355\u6761\u76EE\u7684\u7EDF\u4E00\u8EAB\u4EFD\u3002 */\nexport interface EntryRef {\n name: string\n source?: EntrySource\n}\n\n/** \u9636\u6BB5\u952E\uFF08\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002 */\nexport type PhaseKey = 'bootstrap' | 'active' | 'compaction'\n\n/** \u6CE8\u5165 / \u66FF\u6362\u6761\u76EE\u53EF\u4F5C\u7528\u7684\u9636\u6BB5\uFF1A`always` + \u4E09\u4E2A\u5177\u4F53\u9636\u6BB5\u3002 */\nexport type Phase = 'always' | PhaseKey\n\nexport type SectionField = 'sectionsBootstrap' | 'sections' | 'sectionsCompaction'\nexport type ContextField = 'contextsBootstrap' | 'contexts' | 'contextsCompaction'\n\n/** \u9636\u6BB5\u63CF\u8FF0\uFF1A\u552F\u4E00\u8868\u7684\u4E00\u884C\u3002 */\nexport interface PhaseDescriptor {\n key: PhaseKey\n sectionField: SectionField\n contextField: ContextField\n /** \u8BE5\u9636\u6BB5\u7684\u5DE5\u5177\u540D\u5355\u5B57\u6BB5\uFF1B\u5E38\u9A7B\u671F\u7528\u9759\u6001 `exclude`/`add`\uFF08\u6B64\u952E\u7F3A\u7701\uFF09\u3002 */\n toolField?: 'bootstrap' | 'compaction'\n status: { promoted: boolean; boundary: number }\n}\n\n/** \u9636\u6BB5\u552F\u4E00\u63CF\u8FF0\u8868\uFF08\u4E0E\u670D\u52A1\u7AEF vendor/prompt-customizer/model.js \u7684 PHASES \u540C\u6784\uFF09\u3002 */\nexport const PHASES: readonly PhaseDescriptor[] = [\n { key: 'bootstrap', sectionField: 'sectionsBootstrap', contextField: 'contextsBootstrap', toolField: 'bootstrap', status: { promoted: false, boundary: -1 } },\n { key: 'active', sectionField: 'sections', contextField: 'contexts', toolField: undefined, status: { promoted: true, boundary: -1 } },\n { key: 'compaction', sectionField: 'sectionsCompaction', contextField: 'contextsCompaction', toolField: 'compaction', status: { promoted: false, boundary: 1 } },\n] as const\n\n/** \u5168\u90E8\u9636\u6BB5\u7684\u7A33\u5B9A\u987A\u5E8F\uFF08\u552F\u4E00\u6765\u6E90\uFF1APHASES\uFF09\u3002 */\nexport const PHASE_KEYS: PhaseKey[] = PHASES.map((phase) => phase.key)\n\n/** \u9636\u6BB5 \u2192 \u6587\u6848\u952E\uFF08\u6240\u6709 UI \u7EDF\u4E00\u4ECE\u8FD9\u91CC\u53D6\u9636\u6BB5\u540D\uFF09\u3002 */\nexport const PHASE_LABEL_KEY: Record<PhaseKey, string> = {\n bootstrap: 'phaseStageGuide',\n active: 'phaseStageResident',\n compaction: 'phaseStageControlled',\n}\n\n/** \u6765\u6E90\u5C55\u793A\u6587\u6848\u952E\u3002 */\nexport const SOURCE_LABEL_KEY: Record<SourceKind, string> = {\n global: 'sourceGlobal',\n preset: 'sourcePreset',\n agent: 'sourceAgent',\n executor: 'sourceExecutor',\n workspace: 'sourceWorkspace',\n}\n\n/** \u5B8C\u6574\u76EE\u5F55\u7684\u6765\u6E90\u5206\u7EC4\u987A\u5E8F\u3002 */\nexport const SOURCE_KIND_ORDER: SourceKind[] = ['global', 'preset', 'workspace', 'agent', 'executor']\n\n/** \u628A\u6765\u6E90\u7EDF\u4E00\u6210\u5BF9\u8C61\uFF1A\u517C\u5BB9\u670D\u52A1\u7AEF\u5076\u5C14\u56DE\u4F20\u7684\u5B57\u7B26\u4E32\u6807\u8BC6\uFF08\u4EC5\u8BFB\u5C55\u793A\u7528\uFF09\u3002 */\nexport function normalizeSource(source: EntrySource | string | null | undefined): EntrySource | undefined {\n if (source === null || source === undefined) return undefined\n // \u65E7\u6570\u636E\u91CC\u7684\u7EAF\u5B57\u7B26\u4E32\u6765\u6E90\u6CA1\u6709\u6CE8\u518C\u5C42\u4FE1\u606F\uFF0C\u4E0D\u80FD\u731C\u6210 preset\uFF1B\u6309\u300C\u6765\u6E90\u672A\u77E5\u300D\u5904\u7406\u3002\n if (typeof source === 'string') return undefined\n if (typeof source === 'object' && typeof source.kind === 'string') {\n return typeof source.id === 'string' && source.id !== '' ? { kind: source.kind as SourceKind, id: source.id } : { kind: source.kind as SourceKind }\n }\n return undefined\n}\n\n/** \u6765\u6E90\u7684\u7A33\u5B9A\u952E\uFF08`kind:id`\uFF09\u3002 */\nexport function sourceKey(source: EntrySource | string | null | undefined): string {\n const normalized = normalizeSource(source)\n return normalized === undefined ? '' : `${normalized.kind}:${normalized.id ?? ''}`\n}\n\n/** \u89C4\u8303\u5316\u4E00\u4E2A\u6761\u76EE\uFF1A\u5B57\u7B26\u4E32\u6309\u300C\u6765\u6E90\u672A\u77E5\u7684 name-only\u300D\u8BFB\u53D6\uFF08\u65E7\u6570\u636E\u53EA\u8BFB\u515C\u5E95\uFF09\u3002 */\nexport function normalizeEntry(value: EntryRef | string | null | undefined): EntryRef | undefined {\n if (typeof value === 'string') return value === '' ? undefined : { name: value }\n if (value === null || value === undefined || typeof value !== 'object') return undefined\n if (typeof value.name !== 'string' || value.name === '') return undefined\n const source = normalizeSource(value.source)\n return source === undefined ? { name: value.name } : { name: value.name, source }\n}\n\n/** \u6761\u76EE\u8EAB\u4EFD\u952E\uFF1Aname + NUL + source\u3002 */\nexport function entryKey(entry: EntryRef | string | null | undefined): string {\n const normalized = normalizeEntry(entry)\n return normalized === undefined ? '' : `${normalized.name}\\u0000${sourceKey(normalized.source)}`\n}\n\n/** \u4E24\u4E2A\u6761\u76EE\u662F\u5426\u540C\u4E00\u8EAB\u4EFD\u3002 */\nexport function sameEntry(left: EntryRef | string | null | undefined, right: EntryRef | string | null | undefined): boolean {\n const aEntry = normalizeEntry(left)\n const bEntry = normalizeEntry(right)\n // \u9884\u8BBE\u914D\u7F6E\u91CC\u7684 agent \u5DE5\u5177\u4E0D\u80FD\u7ED1\u5B9A\u67D0\u4E2A session id\uFF1A\u89E3\u9664\u5C4F\u853D\u65F6\u5373\u4F7F\u5F53\u524D\n // \u4F1A\u8BDD\u5DF2\u7ECF\u6362\u4E86\uFF0C\u4E5F\u5E94\u6309 kind + name \u547D\u4E2D\u5E76\u5220\u9664\u65E7\u6761\u76EE\u3002\n if (aEntry?.source?.kind === 'agent' && bEntry?.source?.kind === 'agent' && aEntry.name === bEntry.name) return true\n const a = entryKey(left)\n return a !== '' && a === entryKey(right)\n}\n\n/** \u503C\u662F\u5426\u300C\u975E\u7A7A\u300D\uFF1A\u6570\u7EC4\u975E\u7A7A\u3001\u5BF9\u8C61\u4EFB\u4E00\u5B50\u503C\u975E\u7A7A\u3001\u5B57\u7B26\u4E32\u975E\u7A7A\u3002 */\nexport function hasContent(value: unknown): boolean {\n if (value === null || value === undefined) return false\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object') return Object.values(value as Record<string, unknown>).some(hasContent)\n return value !== ''\n}\n\n// \u2500\u2500 \u914D\u7F6E \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u9636\u6BB5\u5316\u66FF\u6362\u6761\u76EE\uFF1A\u53EA\u66FF\u6362\u5DF2\u5B58\u5728\u6BB5\uFF0C\u6309\u9636\u6BB5\uFF08always / \u5177\u4F53\u9636\u6BB5\uFF09\u751F\u6548\u3002 */\nexport interface ReplacementEntry extends EntryRef {\n phase: Phase\n text: string\n}\n\n/** \u6CE8\u5165\u6761\u76EE\uFF1A\u5E26 order / \u9636\u6BB5 / \u81EA\u5B9A\u4E49\u6807\u8BB0\uFF1Bsource \u53C2\u4E0E (phase,name,source) \u5206\u7EC4\u3002 */\nexport interface InjectEntry extends EntryRef {\n order?: number\n text: string\n phase?: Phase\n custom?: boolean\n}\n\n/** \u4E00\u4EFD\u9636\u6BB5\u7684\u5DE5\u5177\u540D\u5355\u3002 */\nexport interface PhaseToolsConfig {\n exclude?: EntryRef[]\n add?: EntryRef[]\n}\n\n/** \u5DE5\u5177\u8FC7\u6EE4\u914D\u7F6E\uFF1A\u4E09\u4EFD exclude / add \u540D\u5355\u4E92\u4E0D\u7EE7\u627F\u3002 */\nexport interface ToolsConfig {\n exclude?: EntryRef[]\n add?: EntryRef[]\n bootstrap?: PhaseToolsConfig\n compaction?: PhaseToolsConfig\n}\n\n/** \u4E00\u4EFD\u8986\u76D6\u914D\u7F6E\uFF1A\u4E0E\u5168\u5C40\u5B57\u6BB5\u540C\u6784\u3002 */\nexport interface OverrideData {\n sections?: EntryRef[]\n sectionsBootstrap?: EntryRef[]\n sectionsCompaction?: EntryRef[]\n contexts?: EntryRef[]\n contextsBootstrap?: EntryRef[]\n contextsCompaction?: EntryRef[]\n replacements?: ReplacementEntry[]\n inject?: InjectEntry[]\n tools?: ToolsConfig\n}\n\n/** \u89E3\u6790\u540E\u7684\u547D\u540D\u7A7A\u95F4\u914D\u7F6E\u5BF9\u8C61\uFF08\u4F5C\u7528\u57DF\u4E2D\u7684 value\uFF09\u3002 */\nexport interface Config extends OverrideData {\n /** \u5F3A\u5236\u8986\u76D6\u5F00\u5173\uFF08\u9ED8\u8BA4\u5F00\uFF09\u3002 */\n forceSections?: boolean\n /** \u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF08\u5168\u5C40\u5B57\u6BB5\uFF09\u3002 */\n envBlocklist?: string[]\n presets?: Preset[]\n activePreset?: string\n /** \u6309 agent \u9884\u8BBE id \u7684\u5B57\u6BB5\u7EA7\u8986\u76D6\u3002 */\n overrides?: Record<string, OverrideData>\n}\n\n/** \u4E00\u4EFD\u5B8C\u6574\u7684\u5B9A\u5236\u5FEB\u7167\uFF0C\u53EF\u4FDD\u5B58 / \u5E94\u7528 / \u5BFC\u51FA\u5BFC\u5165\u3002 */\nexport interface Preset {\n id: string\n name: string\n data: PresetData\n}\n\n/** \u9884\u8BBE\u6355\u83B7\u7684\u5B9A\u5236\u5B57\u6BB5\uFF08\u5B8C\u6574\u5FEB\u7167\uFF0C\u542B\u6BCF\u9636\u6BB5\u72EC\u7ACB\u8BBE\u5B9A\uFF09\u3002\n * \u53EF\u9009\u5B57\u6BB5\u7F3A\u7701 = \u65E7\u5FEB\u7167\uFF1A\u5E94\u7528\u65F6\u4FDD\u7559\u5F53\u524D\u914D\u7F6E\u4E0D\u62B9\u6389\u3002 */\nexport interface PresetData extends OverrideData {\n /** \u76F8\u5BF9\u987A\u5E8F\uFF1A\u6BCF\u6BB5\u8BB0\u5F55\u5B83\u5E94\u8DDF\u968F\u7684\u524D\u4E00\u6BB5\uFF08after = \u524D\u4E00\u6BB5\u7684\u6761\u76EE\u8EAB\u4EFD\u952E\uFF09\n * \u4E0E\u6240\u5C5E\u9636\u6BB5\uFF08phase\uFF09\u3002\u540C\u540D\u4E0D\u540C\u6E90\u6309\u6761\u76EE\u8EAB\u4EFD\u5206\u5F00\u8BB0\u5F55\u3002 */\n order?: Array<EntryRef & { after?: string; text?: string; custom?: boolean; phase?: Phase }>\n}\n\n// \u2500\u2500 \u6E05\u5355 / \u9884\u89C8 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u5DE5\u5177\u5C55\u793A\u72B6\u6001\u3002 */\nexport type ToolState = 'controllable' | 'locked-agent' | 'locked-executor' | 'masked-plugin' | 'masked-own' | 'masked-shadow'\n\n/** \u5DE5\u5177\u63D0\u793A\u8BCD\u6BB5\uFF08tool:* systemPrompt.section\uFF09\u7684\u5C55\u793A\u5143\u6570\u636E\u3002 */\nexport interface ToolPromptSection extends EntryRef {\n /** \u9759\u6001 provider \u6587\u672C\u4E3A\u7A7A\uFF1B\u52A8\u6001 provider \u6216\u7F3A\u7701\u65F6\u7531\u524D\u7AEF\u6309\u5B9E\u9645\u6BB5\u6587\u672C\u5224\u65AD\u3002 */\n empty?: boolean\n /** \u52A8\u6001 provider\uFF1B\u6587\u672C\u53EA\u80FD\u5728\u88C5\u914D\u65F6\u5F97\u5230\u3002 */\n dynamic?: boolean\n}\n\n/** \u6BB5\u884C\u4E0A\u7684\u5DE5\u5177\u7EC4\u5173\u7CFB\uFF1A\u4E00\u4E2A tool:* \u6BB5\u53EF\u80FD\u670D\u52A1\u591A\u4E2A\u5DE5\u5177\u3002 */\nexport interface ToolPromptInfo {\n tools: string[]\n empty?: boolean\n}\n\n/** \u5BBF\u4E3B\u8DEF\u7531\u8FD4\u56DE\u7684\u6E05\u5355\u8F7D\u8377\uFF1A\u5F53\u524D\u751F\u6548\u7684\u63D0\u793A\u8BCD\u6BB5\u4E0E\u5DE5\u5177\u76EE\u5F55\u3002 */\nexport interface Inventory {\n sections: Array<EntryRef & {\n order: number\n text?: string\n active: boolean\n replaced: boolean\n scope?: 'agent'\n dynamic?: boolean\n toolPrompt?: ToolPromptInfo\n }>\n tools: Array<EntryRef & {\n description?: string\n hidden: boolean\n state?: ToolState\n scope?: 'agent' | 'executor'\n maskedByPlugin?: boolean\n maskedByOwnPlugin?: boolean\n maskedByShadow?: boolean\n /** \u540C\u540D\u906E\u853D\uFF1A\u9876\u6389\u8BE5\u884C\u7684 agent \u4F5C\u7528\u57DF\u5DE5\u5177\u8EAB\u4EFD\uFF08\u53EA\u8BFB\u5C55\u793A\uFF09\u3002 */\n shadowedBy?: { name: string; source?: EntrySource }\n promptSections?: ToolPromptSection[]\n /** \u540C\u540D\u591A\u884C\uFF08\u5982 live / preset \u4E24\u6001\uFF09\u7684\u5C55\u793A\u533A\u5206\u540E\u7F00\u3002 */\n keySuffix?: string\n }>\n contexts?: Array<EntryRef & { text: string; active?: boolean; blocked?: boolean; dynamic?: boolean }>\n /** false = \u9884\u8BBE scope \u672A\u80FD\u6302\u8F7D\uFF0C\u6E05\u5355\u56DE\u9000\u5230\u4E86\u5168\u5C40\u5C42\u3002 */\n scopeResolved?: boolean\n /** \u5F53\u524D\u5DF2\u6CE8\u518C\u7684\u63D0\u793A\u8BCD\u53D8\u91CF\u540D\u3002 */\n variables?: string[]\n}\n\n/** `/api/prompt-customizer/agent-presets` \u8FD4\u56DE\u7684\u4E00\u4E2A\u5DF2\u5B89\u88C5 agent \u9884\u8BBE\u3002 */\nexport interface AgentPresetInfo {\n id: string\n name: string\n description?: string\n /** \u975E\u7A7A\u8868\u793A\u8BE5\u9884\u8BBE\u635F\u574F\u3001\u65E0\u6CD5\u6302\u8F7D\uFF08\u53EA\u8BFB\u5C55\u793A\uFF09\u3002 */\n broken?: string\n}\n\n/** \u9884\u8FC7\u6EE4\u6BB5\u89C6\u56FE\uFF08\u8FDB\u5165\u672C\u63D2\u4EF6\u8FC7\u6EE4\u524D\u7684\u6BB5\u539F\u6587 + \u8BE5\u9636\u6BB5\u72EC\u7ACB\u5C4F\u853D / \u66FF\u6362 / \u52A8\u6001\u6807\u8BB0\uFF09\u3002 */\nexport interface BaseSection extends EntryRef {\n text: string\n blocked: boolean\n replaced: boolean\n scope?: 'agent'\n dynamic?: boolean\n toolPrompt?: ToolPromptInfo\n}\n\n/** \u9884\u8FC7\u6EE4\u5DE5\u5177\u89C6\u56FE\u3002 */\nexport interface BaseTool extends EntryRef {\n description: string\n hidden: boolean\n state?: ToolState\n scope?: 'agent' | 'executor'\n maskedByPlugin?: boolean\n maskedByOwnPlugin?: boolean\n maskedByShadow?: boolean\n /** \u540C\u540D\u906E\u853D\uFF1A\u9876\u6389\u8BE5\u884C\u7684 agent \u4F5C\u7528\u57DF\u5DE5\u5177\u8EAB\u4EFD\uFF08\u53EA\u8BFB\u5C55\u793A\uFF09\u3002 */\n shadowedBy?: { name: string; source?: EntrySource }\n promptSections?: ToolPromptSection[]\n keySuffix?: string\n}\n\n/** \u9884\u8FC7\u6EE4\u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\u89C6\u56FE\u3002 */\nexport interface BaseContext extends EntryRef {\n text: string\n blocked?: boolean\n active?: boolean\n dynamic?: boolean\n}\n\n/** \u5DE5\u5177\u9884\u89C8\u6761\u76EE\uFF1A\u5BF9\u8C61\u5F62\u6001\u6216\u7EAF\u5B57\u7B26\u4E32\u5DE5\u5177\u540D\uFF08\u7EDF\u4E00\u5F52\u4E00\u5316\u4E3A\u5BF9\u8C61\uFF09\u3002 */\nexport type PreviewTool = EntryRef & { description?: string; keySuffix?: string; promptSections?: ToolPromptSection[] }\n\n/** \u5BBF\u4E3B\u8DEF\u7531\u8FD4\u56DE\u7684\u6700\u7EC8\u88C5\u914D\u9884\u89C8\u8F7D\u8377\u3002 */\nexport interface Preview {\n ok: boolean\n error?: string\n source?: 'preset' | 'session'\n /** \u5F53\u524D\u4F1A\u8BDD\u89C6\u56FE\u7684\u4F1A\u8BDD\u5143\u6570\u636E\uFF1B\u9884\u8BBE\u9884\u89C8\u4E3A\u7A7A\u3002 */\n session?: { id: string; presetId?: string; phase?: string; createdAt?: number } | null\n /** \u672A\u89E3\u6790\u7684\u63D0\u793A\u8BCD\u53D8\u91CF\u8BCA\u65AD\uFF08\u4F1A\u8BDD\u53D8\u91CF\u5728\u8BCA\u65AD\u88C5\u914D\u91CC\u4FDD\u6301\u6A21\u677F\u5F15\u7528\uFF09\u3002 */\n diagnostics?: Array<{ name: string; variable: string; kind: 'session-variable' }>\n contexts?: Array<{ name: string; text: string }>\n scope?: unknown\n scopeResolved?: boolean\n takenOverBy?: string\n lostSections?: { emitted: number; survived: number; dropped: number }\n registryTotal?: number\n registryTools?: Array<EntryRef | string>\n /** 2.1.0 \u8D77\uFF1A\u6709\u540C\u9884\u8BBE\u6D3B\u52A8 agent \u65F6\u6765\u81EA\u300C\u8BE5\u9884\u8BBE + \u540C\u9884\u8BBE\u6D3B\u52A8 agent\u300D\u7684\u771F\u5B9E\u88C5\u914D\uFF08ADR-0005\uFF09\u3002 */\n sections: Array<EntryRef & { text: string }>\n /** \u4E0E sections \u540C\u6E90\u7684\u6700\u7EC8\u7CFB\u7EDF\u63D0\u793A\u8BCD\u6B63\u6587\uFF08\u53EA\u542B\u6BB5\uFF0C\u4E0D\u542B\u5DE5\u5177\u58F0\u660E\uFF09\u3002 */\n text: string\n tools: Array<PreviewTool | string>\n baseSections?: BaseSection[]\n baseTools?: BaseTool[]\n /** \u9884\u8BBE\u9884\u89C8\u91CC\u989D\u5916\u626B\u63CF\u5230\u7684 agent \u4F5C\u7528\u57DF\u5DE5\u5177\uFF08\u53EA\u4F9B\u5B8C\u6574\u76EE\u5F55/\u906E\u853D\u6C60\uFF0C\u4E0D\u53C2\u4E0E\u7EAF\u9884\u8BBE\u88C5\u914D\uFF09\u3002 */\n catalogTools?: BaseTool[]\n baseContexts?: BaseContext[]\n /** \u751F\u6548\u914D\u7F6E\uFF08\u6E05\u5355\u8DEF\u7531\u7528\uFF09\u3002 */\n config?: OverrideData\n sectionOrder?: Record<string, number>\n}\n\n/** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\u3002 */\nexport type PhaseViews = Record<PhaseKey, Preview | null>\n", "/** \u63D0\u793A\u8BCD\u6BB5\u9762\u677F\u7684\u7EAF\u72B6\u6001\u903B\u8F91\uFF08\u65E0 React / \u65E0 IO\uFF09\u3002\n *\n * \u4E0E\u65E7 `vendor/prompt-customizer/sectionOps.mjs` \u7684\u804C\u8D23\u76F8\u540C\uFF0C\u4F46\u8EAB\u4EFD\u7EDF\u4E00\u4E3A\n * `{name, source}`\uFF1A\u6240\u6709\u96C6\u5408 / \u6620\u5C04\u7684\u952E\u90FD\u662F `entryKey`\uFF0C\u540C\u540D\u4E0D\u540C\u6E90\u5206\u5F00\u5904\u7406\u3002\n * \u9636\u6BB5\u5B57\u6BB5\u540D\u4E0E\u987A\u5E8F\u5168\u90E8\u6765\u81EA `PHASES`\uFF0C\u672C\u6587\u4EF6\u4E0D\u624B\u5199\u7B2C\u4E8C\u4EFD\u4E09\u6001\u6620\u5C04\u3002\n */\nimport {\n PHASES,\n PHASE_KEYS,\n entryKey,\n normalizeEntry,\n sameEntry,\n type Config,\n type ContextField,\n type EntryRef,\n type InjectEntry,\n type PhaseKey,\n type Preview,\n type ReplacementEntry,\n type SectionField,\n type ToolPromptInfo,\n} from './types.ts'\n\n/** \u5C4F\u5E55\u4E0A\u4E00\u6761\u53EF\u4EA4\u4E92\u7684\u6BB5\u884C\u3002`dynamic` \u53EA\u5728\u670D\u52A1\u7AEF\u7ED9\u51FA\u6807\u8BB0\u65F6\u624D\u662F\u5E03\u5C14\u503C \u2014\u2014\n * \u7F3A\u7701\uFF08undefined\uFF09= \u5BBF\u4E3B\u4E0D\u652F\u6301\u8BE5\u6807\u8BB0\uFF0C\u754C\u9762\u4E0D\u5F97\u7528\u539F\u6587\u731C\u3002 */\nexport interface PhaseRow extends EntryRef {\n text: string\n replaced: boolean\n custom: boolean\n /** \u672C\u9636\u6BB5\u7684\u7528\u6237\u66FF\u6362\u6587\u672C\uFF08\u7A7A\u4E32 = \u672C\u9636\u6BB5\u6CA1\u6539\u8FC7\u6587\u672C\uFF09\u3002 */\n override: string\n /** \u8BE5\u9636\u6BB5\u81EA\u5DF1\u7684\u5C4F\u853D\u540D\u5355\u662F\u5426\u5C4F\u853D\u4E86\u6B64\u6BB5\uFF1A\u52FE\u9009\u6846 = \u672A\u5C4F\u853D\uFF08\u6CE8\u5165\u6A21\u578B\uFF09\u3002 */\n blocked: boolean\n dynamic?: boolean\n /** tool:* \u6BB5\u5173\u8054\u7684\u5DE5\u5177\u7EC4\uFF08\u670D\u52A1\u7AEF inventory \u63D0\u4F9B\uFF1B\u65E7\u5BBF\u4E3B\u7F3A\u7701\uFF09\u3002 */\n toolPrompt?: ToolPromptInfo\n}\n\nfunction descriptorOf(key: PhaseKey) {\n const phase = PHASES.find((item) => item.key === key)\n if (phase === undefined) throw new Error(`unknown phase: ${String(key)}`)\n return phase\n}\n\nexport function sectionFieldOf(key: PhaseKey): SectionField {\n return descriptorOf(key).sectionField\n}\n\nexport function contextFieldOf(key: PhaseKey): ContextField {\n return descriptorOf(key).contextField\n}\n\n/** \u9636\u6BB5 \u2192 \u5DE5\u5177\u540D\u5355\u5B57\u6BB5\uFF1A\u9884\u7F6E\u671F\u7528 `bootstrap`\u3001\u538B\u7F29\u53D7\u63A7\u671F\u7528 `compaction`\uFF0C\u5E38\u9A7B\u671F\u9759\u6001\u3002 */\nexport function toolFieldOf(key: PhaseKey): 'static' | 'bootstrap' | 'compaction' {\n return descriptorOf(key).toolField ?? 'static'\n}\n\n/** \u8BE5\u6CE8\u5165 / \u66FF\u6362\u9636\u6BB5\u662F\u5426\u4F5C\u7528\u4E8E\u5F53\u524D\u540D\u4E49\u9636\u6BB5\u3002 */\nexport function acceptsInjectFor(key: PhaseKey, phase: string): boolean {\n return phase === 'always' || phase === key\n}\n\nexport function sectionEntries(cfg: Config | null | undefined, key: PhaseKey): EntryRef[] {\n return normalizeList(cfg?.[sectionFieldOf(key)])\n}\n\nexport function contextEntries(cfg: Config | null | undefined, key: PhaseKey): EntryRef[] {\n return normalizeList(cfg?.[contextFieldOf(key)])\n}\n\n/** \u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\u663E\u9690\uFF1A\u53EA\u6539\u672C\u9636\u6BB5 contexts \u540D\u5355\uFF0C\u4E0D\u7ACB\u5373\u843D\u76D8\u3002 */\nexport function contextPatch(\n cfg: Config | null | undefined,\n key: PhaseKey,\n entry: EntryRef,\n hidden: boolean,\n): Partial<Record<ContextField, EntryRef[]>> {\n const field = contextFieldOf(key)\n const current = contextEntries(cfg, key)\n const index = current.findIndex((item) => sameEntry(item, entry))\n if (hidden) {\n if (index < 0) current.push({ name: entry.name, ...(entry.source === undefined ? {} : { source: entry.source }) })\n } else if (index >= 0) {\n current.splice(index, 1)\n }\n return { [field]: current }\n}\n\nfunction normalizeList(list: Array<EntryRef | string> | undefined | null): EntryRef[] {\n const out: EntryRef[] = []\n const seen = new Set<string>()\n for (const value of list ?? []) {\n const entry = normalizeEntry(value)\n if (entry === undefined) continue\n const key = entryKey(entry)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(entry)\n }\n return out\n}\n\n/** \u8BE5\u9636\u6BB5\u4E13\u5C5E\u7684\u66FF\u6362\u6761\u76EE\uFF08always + \u672C\u9636\u6BB5\uFF09\u3002 */\nexport function replacementEntriesFor(cfg: Config | null | undefined, key: PhaseKey): ReplacementEntry[] {\n return (cfg?.replacements ?? []).filter((item) => acceptsInjectFor(key, item?.phase ?? 'always'))\n}\n\n/** \u67D0\u9636\u6BB5\u7684\u6CE8\u5165\u8EAB\u4EFD\u3002\u6240\u6709\u96C6\u5408 / \u6620\u5C04\u7684\u952E\u90FD\u662F `entryKey`\u3002 */\nexport interface InjectedAt {\n names: Set<string>\n custom: Set<string>\n text: Map<string, string>\n order: Map<string, number>\n}\n\nexport function injectedAt(cfg: Config | null | undefined, key: PhaseKey): InjectedAt {\n const names = new Set<string>()\n const custom = new Set<string>()\n const text = new Map<string, string>()\n const order = new Map<string, number>()\n for (const item of cfg?.inject ?? []) {\n const entry = normalizeEntry(item)\n if (entry === undefined) continue\n const identity = entryKey(entry)\n const phase = item.phase ?? 'always'\n if (phase === key) order.set(identity, item.order ?? 0)\n if (!acceptsInjectFor(key, phase)) continue\n names.add(identity)\n if (item.text) {\n // \u672C\u9636\u6BB5\u4E13\u5C5E\u6761\u76EE\u8986\u76D6 always \u6761\u76EE\u7684\u6587\u672C\u3002\n if (phase === key || !text.has(identity)) text.set(identity, item.text)\n }\n if (item.custom === true) custom.add(identity)\n }\n return { names, custom, text, order }\n}\n\n/** \u5C4F\u853D / \u6062\u590D\u4E00\u4E2A\u6BB5\uFF1A\u53EA\u8BFB\u5199\u672C\u9636\u6BB5\u81EA\u5DF1\u7684\u540D\u5355\uFF08\u8FD4\u56DE\u5B57\u6BB5\u8865\u4E01\uFF1B\u7A7A\u8865\u4E01 = \u4E0D\u5199\u76D8\uFF09\u3002 */\nexport function blockPatch(\n cfg: Config | null | undefined,\n key: PhaseKey,\n entry: EntryRef,\n blocked: boolean,\n): Partial<Record<SectionField, EntryRef[]>> {\n const field = sectionFieldOf(key)\n const current = sectionEntries(cfg, key)\n const index = current.findIndex((item) => sameEntry(item, entry))\n if (blocked) {\n if (index >= 0) return {}\n current.push({ name: entry.name, ...(entry.source === undefined ? {} : { source: entry.source }) })\n } else {\n if (index < 0) return {}\n current.splice(index, 1)\n }\n return { [field]: current }\n}\n\ninterface BaseLike extends EntryRef {\n text?: string\n blocked?: boolean\n replaced?: boolean\n dynamic?: boolean\n toolPrompt?: ToolPromptInfo\n}\n\n/**\n * \u4E00\u4E2A\u9636\u6BB5\u90E8\u5206\u7684\u5168\u90E8\u884C\uFF1Abase\uFF08\u9884\u8FC7\u6EE4\uFF09\u89C6\u56FE \u222A post\uFF08\u6700\u7EC8\u88C5\u914D\uFF09\u222A \u8BE5\u9636\u6BB5\u6CE8\u5165\u6761\u76EE\n * \u222A \u5C4F\u853D\u540D\u5355\u3002\u884C\u8EAB\u4EFD\u6309 name+source\uFF0C\u540C\u540D\u4E0D\u540C\u6E90\u5404\u5360\u4E00\u884C\u3002\n */\nexport function phaseRows(cfg: Config | null | undefined, view: Preview | null | undefined, key: PhaseKey): PhaseRow[] {\n const base = (view?.baseSections ?? []) as BaseLike[]\n const post = (view?.sections ?? []) as BaseLike[]\n const denied = sectionEntries(cfg, key)\n const deniedKeys = new Set(denied.map((entry) => entryKey(entry)))\n const baseByKey = new Map(base.map((entry) => [entryKey(entry), entry]))\n const postByKey = new Map(post.map((entry) => [entryKey(entry), entry]))\n const injected = injectedAt(cfg, key)\n const replacements = replacementEntriesFor(cfg, key)\n\n const order: EntryRef[] = []\n const seen = new Set<string>()\n const push = (entry: EntryRef): void => {\n const identity = entryKey(entry)\n if (identity === '' || seen.has(identity)) return\n seen.add(identity)\n order.push({ name: entry.name, ...(entry.source === undefined ? {} : { source: entry.source }) })\n }\n\n for (const section of base) {\n const identity = entryKey(section)\n if (postByKey.has(identity) || deniedKeys.has(identity) || section.blocked === true) push(section)\n }\n for (const section of post) {\n const identity = entryKey(section)\n if (!baseByKey.has(identity) && injected.names.has(identity)) push(section)\n }\n for (const item of cfg?.inject ?? []) {\n const entry = normalizeEntry(item)\n if (entry === undefined) continue\n const identity = entryKey(entry)\n if ((item.phase ?? 'always') !== key) continue\n if (item.custom === true || injected.text.has(identity) || baseByKey.has(identity) || postByKey.has(identity)) push(entry)\n }\n for (const entry of denied) push(entry)\n for (const identity of injected.custom) {\n const item = (cfg?.inject ?? []).find((candidate) => entryKey(candidate) === identity)\n if (item !== undefined) push(item)\n }\n\n const rows = order.map((entry) => {\n const identity = entryKey(entry)\n const baseSection = baseByKey.get(identity)\n const postSection = postByKey.get(identity)\n const override = injected.text.get(identity) ?? ''\n const replacement = replacements.find((item) => sameEntry(item, entry))\n const dynamic = typeof baseSection?.dynamic === 'boolean'\n ? baseSection.dynamic\n : typeof postSection?.dynamic === 'boolean' ? postSection.dynamic : undefined\n const toolPrompt = baseSection?.toolPrompt ?? postSection?.toolPrompt\n return {\n name: entry.name,\n ...(entry.source === undefined ? {} : { source: entry.source }),\n text: postSection?.text ?? baseSection?.text ?? '',\n replaced: replacement !== undefined || override !== '',\n custom: injected.custom.has(identity),\n override,\n blocked: deniedKeys.has(identity),\n ...(dynamic === undefined ? {} : { dynamic }),\n ...(toolPrompt === undefined ? {} : { toolPrompt }),\n } satisfies PhaseRow\n })\n if (injected.order.size > 0) {\n const fallback = new Map(rows.map((row, index) => [entryKey(row), index]))\n rows.sort((left, right) => {\n const a = injected.order.get(entryKey(left)) ?? fallback.get(entryKey(left)) ?? 0\n const b = injected.order.get(entryKey(right)) ?? fallback.get(entryKey(right)) ?? 0\n return a - b\n })\n }\n return rows\n}\n\n/**\n * \u6301\u4E45\u5316\u4E00\u4E2A\u9636\u6BB5\u7684\u6709\u5E8F\u5217\u8868\uFF1A\u628A rows \u5199\u6210\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF0Corder = \u8FDE\u7EED\u6574\u6570\uFF1B\n * \u5176\u5B83\u9636\u6BB5\uFF08\u542B always\uFF09\u7684\u6CE8\u5165\u6761\u76EE\u539F\u6837\u4FDD\u7559\u3002\u6761\u76EE\u5F62\u72B6\u6309 (phase,name,source) \u5206\u7EC4\uFF0C\n * \u540C\u540D\u4E0D\u540C\u6E90\u7EDD\u4E0D\u4E92\u76F8\u8986\u76D6\u3002\n */\nexport function phaseInjectEntries(cfg: Config | null | undefined, key: PhaseKey, rows: PhaseRow[]): InjectEntry[] {\n const remaining = (cfg?.inject ?? []).filter((item) => (item.phase ?? 'always') !== key)\n const entries: InjectEntry[] = rows.map((row, index) => ({\n name: row.name,\n ...(row.source === undefined ? {} : { source: row.source }),\n order: index,\n text: row.override || (row.custom ? (row.text ?? '') : ''),\n phase: key,\n custom: row.custom,\n }))\n return [...remaining, ...entries]\n}\n\n/** \u91CD\u6392 / \u63D2\u5165\uFF1A\u628A drag \u884C\u63D2\u5230 target \u884C\u4E4B\u4E0A\u6216\u4E4B\u4E0B\uFF0C\u8FD4\u56DE\u65B0\u5217\u8868\u3002 */\nexport function reorderInsert<T extends EntryRef>(\n rows: T[],\n drag: EntryRef,\n target: EntryRef,\n pos: 'above' | 'below',\n): T[] | null {\n const base = rows.filter((row) => !sameEntry(row, drag))\n const index = base.findIndex((row) => sameEntry(row, target))\n if (index < 0) return null\n const entry = rows.find((row) => sameEntry(row, drag))\n if (entry === undefined) return null\n base.splice(pos === 'above' ? index : index + 1, 0, entry)\n return base\n}\n\n/** \u4E09\u6001\u540C\u6B65\u7684\u9AA8\u67B6\u987A\u5E8F\uFF1A\u5E38\u9A7B\u671F\u5728\u524D\uFF08\u6570\u636E\u5E8F\uFF09\uFF0C\u5176\u4F59\u9636\u6BB5\u6309 PHASES \u987A\u5EF6\u3002 */\nconst MIRROR_ORDER: PhaseKey[] = ['active', ...PHASE_KEYS.filter((key) => key !== 'active')]\n\n/** \u4E09\u6001\u540C\u6B65\u7684\u5E76\u96C6\u884C\u96C6\uFF1A\u5E38\u9A7B\u671F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\u3002 */\nexport function mirroredRows(\n cfg: Config | null | undefined,\n views: Partial<Record<PhaseKey, Preview | null>> | null | undefined,\n nativeOf?: (key: PhaseKey, entry: EntryRef) => boolean | null | undefined,\n): PhaseRow[] {\n const picked = new Map<string, { row: PhaseRow; native: boolean }>()\n const order: string[] = []\n for (const key of MIRROR_ORDER) {\n for (const row of phaseRows(cfg, views?.[key] ?? null, key)) {\n const identity = entryKey(row)\n const native = nativeOf?.(key, row) === true\n const current = picked.get(identity)\n if (current === undefined) {\n picked.set(identity, { row, native })\n order.push(identity)\n } else if (current.native !== true && native) {\n picked.set(identity, { row, native })\n }\n }\n }\n return order.map((identity) => picked.get(identity)!.row)\n}\n\n/** \u955C\u50CF\u5230\u67D0\u9636\u6BB5\u65F6\u8BE5\u884C\u8981\u5199\u7684\u6B63\u6587\uFF08'' = \u53EA\u8986\u76D6 order\uFF0C\u6CE8\u518C\u8868\u539F\u6587\u4E0D\u52A8\uFF09\u3002 */\nfunction mirrorText(row: PhaseRow, native: boolean): string {\n if (row.custom === true) return row.override || (row.text ?? '')\n if (row.override !== '') return row.override\n if (native === true) return ''\n if (row.dynamic === true) return ''\n return row.text ?? ''\n}\n\n/** \u4E09\u6001\u540C\u6B65\u6301\u4E45\u5316\uFF1A\u628A\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6\u955C\u50CF\u5199\u5165\u4E09\u4E2A\u9636\u6BB5\u3002 */\nexport function mirrorPhaseInjectEntries(\n cfg: Config | null | undefined,\n rows: PhaseRow[],\n nativeOf?: (key: PhaseKey, entry: EntryRef) => boolean | null | undefined,\n): InjectEntry[] {\n const names = new Set(rows.map((row) => entryKey(row)))\n const always = (cfg?.inject ?? []).filter((item) => (item.phase ?? 'always') === 'always' && names.has(entryKey(item)))\n const entries: InjectEntry[] = []\n for (const key of PHASE_KEYS) {\n let order = 0\n for (const row of rows) {\n const native = nativeOf?.(key, row)\n if (native === null || native === undefined) continue\n const text = mirrorText(row, native)\n if (native !== true && text === '') continue\n entries.push({\n name: row.name,\n ...(row.source === undefined ? {} : { source: row.source }),\n order: order++,\n text,\n phase: key,\n custom: row.custom,\n })\n }\n }\n return [...always, ...entries]\n}\n\n/** \u955C\u50CF\u65F6\u5728\u76EE\u6807\u9636\u6BB5\u5EFA\u4E0D\u51FA\u6765\u7684\u6BB5\u540D\uFF08\u52A8\u6001\u6BB5\u65E0\u6B63\u6587\uFF09\uFF1A\u754C\u9762\u636E\u6B64\u7ED9\u51FA\u8BF4\u660E\u3002 */\nexport function mirrorSkippedNames(\n rows: PhaseRow[],\n nativeOf?: (key: PhaseKey, entry: EntryRef) => boolean | null | undefined,\n): string[] {\n const skipped = new Set<string>()\n for (const key of PHASE_KEYS) {\n for (const row of rows) {\n const native = nativeOf?.(key, row)\n if (native === null || native === undefined || native === true) continue\n if (mirrorText(row, false) === '') skipped.add(row.name)\n }\n }\n return [...skipped]\n}\n\n/** \u4E09\u6001\u540C\u6B65\u7684\u5C4F\u853D\u540D\u5355\uFF1A\u4E09\u4EFD\u540D\u5355\u7EDF\u4E00\u4E3A\u5E76\u96C6\u884C\u96C6\u91CC\u7684\u5C4F\u853D\u6761\u76EE\uFF08name+source\uFF09\u3002\n * \u5B57\u6BB5\u540D\u7531 PHASES \u751F\u6210\uFF0C\u4E0D\u624B\u5199\u7B2C\u4E8C\u4EFD\u4E09\u6001\u6620\u5C04\u3002 */\nexport function mirroredDeniedLists(rows: PhaseRow[]): Record<SectionField, EntryRef[]> {\n const blocked = rows\n .filter((row) => row.blocked === true)\n .map((row) => ({ name: row.name, ...(row.source === undefined ? {} : { source: row.source }) }))\n const out = {} as Record<SectionField, EntryRef[]>\n for (const phase of PHASES) out[phase.sectionField] = blocked.map((entry) => ({ ...entry }))\n return out\n}\n", "/** \u7EAF\u51FD\u6570\u7684\u9884\u8BBE / \u6BB5\u64CD\u4F5C\u52A9\u624B\uFF0C\u540C\u65F6\u88AB\u5BA2\u6237\u7AEF UI \u4E0E Node \u6D4B\u8BD5\u590D\u7528\uFF08\u4E0D\u89E6\u78B0 IO \u4E0E React\uFF09\u3002\n *\n * \u6761\u76EE\u8EAB\u4EFD\u7EDF\u4E00\u4E3A `{name, source}`\uFF1B\u9636\u6BB5\u5B57\u6BB5\u540D\u4E0E\u987A\u5E8F\u5168\u90E8\u6765\u81EA `PHASES`\uFF0C\n * \u4E0D\u518D\u624B\u5199 `CAPTURE_PHASES` / `PART_ORDER` \u7B49\u91CD\u590D\u5E38\u91CF\u3002\n */\nimport {\n PHASES,\n PHASE_KEYS,\n entryKey,\n normalizeEntry,\n sameEntry,\n type Config,\n type EntryRef,\n type InjectEntry,\n type Inventory,\n type OverrideData,\n type Phase,\n type PhaseKey,\n type Preset,\n type PresetData,\n type ReplacementEntry,\n type SectionField,\n type ContextField,\n type ToolsConfig,\n} from './types.ts'\nimport { toolFieldOf } from './phase-ops.ts'\n\nexport interface Section extends EntryRef {\n order: number\n text?: string\n active: boolean\n replaced: boolean\n /** true = \u672C\u63D2\u4EF6\u6CE8\u5165\uFF08\u53EF\u5220\u9664\uFF09\uFF1Bfalse = \u8BFB\u81EA\u5BBF\u4E3B\u63D0\u793A\u8BCD\u6E05\u5355\u3002 */\n custom: boolean\n /** \u670D\u52A1\u7AEF\u63D0\u4F9B\u7684\u52A8\u6001\u6BB5\u6807\u8BB0\uFF08\u7F3A\u7701 = \u5BBF\u4E3B\u4E0D\u652F\u6301\uFF0C\u754C\u9762\u4E0D\u5F97\u7528\u539F\u6587\u731C\uFF09\u3002 */\n dynamic?: boolean\n}\n\n/** \u5E94\u7528\u9884\u8BBE\u540E\u9700\u8981\u56DE\u5199\u5230\u8BBE\u7F6E\u4F5C\u7528\u57DF\u7684\u90A3\u90E8\u5206\u914D\u7F6E\u5B57\u6BB5\u3002\n * \u9636\u6BB5\u5B57\u6BB5\u4E3A\u53EF\u9009\uFF1A\u5FEB\u7167\u4E0D\u5E26 \u2192 \u5E94\u7528\u65F6\u4FDD\u7559\u5F53\u524D\u503C\uFF0C\u7EDD\u4E0D\u62B9\u6389\u3002 */\nexport interface ConfigPatch extends Partial<Record<SectionField | ContextField, EntryRef[]>> {\n replacements?: ReplacementEntry[]\n inject?: InjectEntry[]\n tools?: ToolsConfig\n}\n\n/** \u6309 PHASES \u751F\u6210\u4E00\u4EFD\u8986\u76D6\u914D\u7F6E\u7684\u5168\u90E8\u9636\u6BB5\u5B57\u6BB5\uFF08\u7A7A\u6570\u7EC4\u515C\u5E95\uFF09\u3002 */\nfunction phaseFieldValues(source: OverrideData | undefined): Record<SectionField | ContextField, EntryRef[]> {\n const out = {} as Record<SectionField | ContextField, EntryRef[]>\n for (const phase of PHASES) {\n out[phase.sectionField] = [...(source?.[phase.sectionField] ?? [])]\n out[phase.contextField] = [...(source?.[phase.contextField] ?? [])]\n }\n return out\n}\n\n/** \u5F52\u4E00\u5316\u5DE5\u5177\u914D\u7F6E\uFF1A\u4E09\u4E2A\u9636\u6BB5\u7684 exclude/add \u90FD\u662F EntryRef[]\u3002 */\nexport function normalizeToolsConfig(tools: ToolsConfig | undefined): ToolsConfig {\n const out: ToolsConfig = {\n exclude: [...(tools?.exclude ?? [])],\n add: [...(tools?.add ?? [])],\n }\n for (const phase of PHASES) {\n if (phase.toolField === undefined) continue\n const group = tools?.[phase.toolField]\n out[phase.toolField] = {\n exclude: [...(group?.exclude ?? [])],\n add: [...(group?.add ?? [])],\n }\n }\n return out\n}\n\n/** \u628A\u4E00\u6761\u6709\u5E8F\u6761\u76EE\u8F6C\u6210\u76F8\u5BF9\u94FE\uFF08\u6BCF\u6BB5\u8BB0\u4F4F\u5B83\u7684\u524D\u4E00\u6BB5\u7684\u6761\u76EE\u8EAB\u4EFD\u952E\uFF09\u3002 */\nfunction toChain(\n items: Array<EntryRef & { text?: string; custom?: boolean }>,\n phase?: Phase,\n): NonNullable<PresetData['order']> {\n return items.map((item, index) => ({\n name: item.name,\n ...(item.source === undefined ? {} : { source: item.source }),\n after: index > 0 ? entryKey(items[index - 1]!) : undefined,\n text: item.custom === true ? (item.text ?? '') : '',\n custom: item.custom === true,\n ...(phase === undefined ? {} : { phase }),\n }))\n}\n\n/** \u4ECE\u5F53\u524D\u914D\u7F6E\u6784\u5EFA\u9884\u8BBE\u5FEB\u7167\uFF08\u5B8C\u6574\u6355\u83B7\uFF0C\u542B\u6BCF\u9636\u6BB5\u72EC\u7ACB\u8BBE\u5B9A\u4E0E\u9636\u6BB5\u5316\u66FF\u6362\uFF09\u3002 */\nexport function buildPresetData(cfg: Config, merged: Section[]): PresetData {\n // \u5168\u5C40\u94FE\u91CC\u7684\u81EA\u5B9A\u4E49\u6BB5\u6B63\u6587\u53EA\u53D6 always \u6CE8\u5165\u6761\u76EE\u7684\u6587\u672C\uFF1A\u540C\u540D\u6761\u76EE\u5728\u522B\u7684\u9636\u6BB5\n // \u6709\u81EA\u5DF1\u7684\u66FF\u6362\u6587\u672C\uFF0C\u4E0D\u80FD\u88AB mergeSections \u7684\u300C\u540E\u5199\u8986\u76D6\u300D\u5E26\u8FDB always \u7EC4\u3002\n const alwaysText = new Map<string, string>()\n for (const item of cfg.inject ?? []) {\n if ((item.phase ?? 'always') !== 'always') continue\n alwaysText.set(entryKey(item), item.text ?? '')\n }\n // \u5168\u5C40\u94FE\u53EA\u6536\u300C\u7CFB\u7EDF\u6BB5 + \u786E\u5B9E\u5C5E\u4E8E always \u7684\u81EA\u5B9A\u4E49\u6BB5\u300D\uFF1A\u53EA\u5728\u67D0\u4E2A\u9636\u6BB5\u6CE8\u5165\u7684\n // \u81EA\u5B9A\u4E49\u6BB5\u7531\u8BE5\u9636\u6BB5\u7684\u94FE\u6355\u83B7\uFF0C\u4E0D\u80FD\u501F\u5168\u5C40\u94FE\u590D\u6D3B\u6210 always\u3002\n const globalRows = merged.filter((section) => !section.custom || alwaysText.has(entryKey(section)))\n const order = toChain(globalRows.map((section) => ({\n name: section.name,\n ...(section.source === undefined ? {} : { source: section.source }),\n text: section.custom ? (alwaysText.get(entryKey(section)) ?? section.text ?? '') : '',\n custom: section.custom,\n })))\n for (const phase of PHASE_KEYS) {\n const items = (cfg.inject ?? [])\n .filter((item) => (item.phase ?? 'always') === phase)\n .slice()\n .sort((left, right) => (left.order ?? 0) - (right.order ?? 0))\n if (items.length === 0) continue\n order.push(...toChain(items.map((item) => ({\n name: item.name,\n ...(item.source === undefined ? {} : { source: item.source }),\n text: item.text,\n custom: item.custom === true,\n })), phase))\n }\n return {\n ...phaseFieldValues(cfg),\n replacements: [...(cfg.replacements ?? [])],\n order,\n tools: normalizeToolsConfig(cfg.tools),\n }\n}\n\n/** \u628A\u5BBF\u4E3B\u6E05\u5355\u6BB5\u4E0E\u7528\u6237\u6CE8\u5165\u5217\u8868\u6309 order \u5408\u5E76\u3001\u6392\u5E8F\u3002\u6761\u76EE\u8EAB\u4EFD\u6309 name+source\u3002 */\nexport function mergeSections(inv: Inventory | null, cfg: Config, blockedKeys: ReadonlySet<string>): Section[] {\n const map = new Map<string, Section>()\n for (const section of inv?.sections ?? []) {\n const entry = normalizeEntry(section)\n if (entry === undefined) continue\n map.set(entryKey(entry), {\n ...entry,\n order: section.order,\n text: section.text ?? '',\n active: blockedKeys.has(entryKey(entry)) ? false : section.active !== false,\n replaced: section.replaced === true,\n custom: false,\n ...(section.dynamic === undefined ? {} : { dynamic: section.dynamic }),\n })\n }\n for (const item of cfg.inject ?? []) {\n const entry = normalizeEntry(item)\n if (entry === undefined) continue\n const identity = entryKey(entry)\n const custom = item.custom === true\n const existing = map.get(identity)\n const replacement = (cfg.replacements ?? []).some((candidate) => sameEntry(candidate, entry))\n if (existing !== undefined) {\n map.set(identity, {\n ...existing,\n order: item.order ?? existing.order,\n ...(item.text !== undefined && item.text !== '' ? { text: item.text } : {}),\n custom: custom || existing.custom,\n active: !blockedKeys.has(identity),\n replaced: replacement || existing.replaced,\n })\n } else {\n map.set(identity, {\n ...entry,\n order: item.order ?? 0,\n text: item.text ?? '',\n active: !blockedKeys.has(identity),\n replaced: replacement,\n custom,\n })\n }\n }\n return [...map.values()]\n .sort((left, right) => left.order - right.order || left.name.localeCompare(right.name))\n .map((section, index) => ({ ...section, order: index }))\n}\n\n/** ConfigPatch \u91CC\u5BF9\u5916\u7684\u6CE8\u5165\u6761\u76EE\u3002 */\nexport type ResolvedInject = InjectEntry\n\n/** \u628A\u4E00\u6761\u76F8\u5BF9\u94FE\u89E3\u6790\u4E3A\u7EDD\u5BF9\u6709\u5E8F\u6761\u76EE\uFF08\u951A\u70B9 = \u524D\u4E00\u6BB5\u7684\u6761\u76EE\u8EAB\u4EFD\u952E\uFF09\u3002 */\nfunction resolveChain(list: NonNullable<PresetData['order']>): Array<EntryRef & { text?: string; custom?: boolean }> {\n const byKey = new Map<string, NonNullable<PresetData['order']>[number]>()\n for (const item of list) {\n const entry = normalizeEntry(item)\n if (entry === undefined) continue\n byKey.set(entryKey(entry), { ...item, ...entry })\n }\n const result: Array<EntryRef & { text?: string; custom?: boolean }> = []\n const placed = new Set<string>()\n const insert = (item: NonNullable<PresetData['order']>[number]): void => {\n const entry = normalizeEntry(item)\n if (entry === undefined) return\n const identity = entryKey(entry)\n if (placed.has(identity)) return\n placed.add(identity)\n result.push({ ...entry, text: item.text, custom: item.custom })\n }\n // \u6CA1\u6709\u951A\u70B9 / \u951A\u70B9\u4E0D\u5728\u672C\u7EC4\u5185\u7684\u6761\u76EE\u6309\u539F\u59CB\u987A\u5E8F\u6392\u5728\u6700\u524D\u3002\n for (const item of byKey.values()) {\n if (item.after === undefined || item.after === '' || !byKey.has(item.after)) insert(item)\n }\n let changed = true\n while (changed) {\n changed = false\n for (const item of byKey.values()) {\n const entry = normalizeEntry(item)\n if (entry === undefined) continue\n const identity = entryKey(entry)\n if (placed.has(identity)) continue\n const anchor = item.after\n if (anchor !== undefined && placed.has(anchor)) {\n const anchorIndex = result.findIndex((candidate) => entryKey(candidate) === anchor)\n result.splice(anchorIndex + 1, 0, { ...entry, text: item.text, custom: item.custom })\n placed.add(identity)\n changed = true\n }\n }\n }\n for (const item of byKey.values()) insert(item)\n return result\n}\n\n/** \u628A\u5FEB\u7167\u91CC\u7684\u76F8\u5BF9\u987A\u5E8F\u89E3\u6790\u4E3A\u6CE8\u5165\u6761\u76EE\u5217\u8868\u3002\u6309 (phase,name,source) \u5206\u7EC4\u3001\u7EC4\u5185\u91CD\u7F16\u53F7\u3002 */\nexport function resolveOrder(presetOrder: PresetData['order']): ResolvedInject[] {\n const groups = new Map<Phase, NonNullable<PresetData['order']>>()\n for (const item of presetOrder ?? []) {\n const phase = (item.phase ?? 'always') as Phase\n const group = groups.get(phase)\n if (group === undefined) groups.set(phase, [item])\n else group.push(item)\n }\n const out: ResolvedInject[] = []\n for (const phase of ['always', ...PHASE_KEYS] as Phase[]) {\n const members = groups.get(phase)\n if (members === undefined) continue\n resolveChain(members).forEach((entry, index) => {\n out.push({\n name: entry.name,\n ...(entry.source === undefined ? {} : { source: entry.source }),\n order: index,\n text: entry.text ?? '',\n custom: entry.custom === true,\n ...(phase === 'always' ? {} : { phase }),\n })\n })\n }\n return out\n}\n\n/** \u6309 (phase,name,source) \u91CD\u65B0\u5206\u7EC4\u5E76\u7F16\u53F7\uFF1A\u540C\u9636\u6BB5\u540C\u6761\u76EE\u540E\u8005\u8986\u76D6\u524D\u8005\u3002 */\nfunction reindexInject(entries: InjectEntry[]): InjectEntry[] {\n const groups = new Map<Phase, Map<string, InjectEntry>>()\n for (const item of entries) {\n const phase = (item.phase ?? 'always') as Phase\n const group = groups.get(phase)\n if (group === undefined) groups.set(phase, new Map([[entryKey(item), item]]))\n else group.set(entryKey(item), item)\n }\n const out: InjectEntry[] = []\n for (const phase of ['always', ...PHASE_KEYS] as Phase[]) {\n const group = groups.get(phase)\n if (group === undefined) continue\n let order = 0\n for (const item of group.values()) {\n out.push({\n name: item.name,\n ...(item.source === undefined ? {} : { source: item.source }),\n order: order++,\n text: item.text ?? '',\n custom: item.custom === true,\n ...(phase === 'always' ? {} : { phase }),\n })\n }\n }\n return out\n}\n\n/** \u5408\u5E76\u9636\u6BB5\u5316\u66FF\u6362\uFF1A\u540C\u4E00 (phase,name,source) \u4EE5\u540E\u8005\u4E3A\u51C6\u3002 */\nfunction mergeReplacements(base: ReplacementEntry[] | undefined, incoming: ReplacementEntry[] | undefined): ReplacementEntry[] {\n const map = new Map<string, ReplacementEntry>()\n for (const item of base ?? []) map.set(`${item.phase ?? 'always'}\\u0000${entryKey(item)}`, item)\n for (const item of incoming ?? []) map.set(`${item.phase ?? 'always'}\\u0000${entryKey(item)}`, item)\n return [...map.values()]\n}\n\n/** \u5DE5\u5177\u5FEB\u7167\u5408\u5E76\uFF1A\u540D\u5355\u4EE5\u5FEB\u7167\u4E3A\u51C6\uFF0C\u4F46\u5FEB\u7167\u6CA1\u7ED9\u7684 `add` \u7EDD\u4E0D\u91CD\u7F6E\u3002 */\nfunction mergeToolsSnapshot(base: ToolsConfig | undefined, snapshot: ToolsConfig | undefined): ToolsConfig {\n const out = normalizeToolsConfig(base)\n if (snapshot === undefined) return out\n if (Array.isArray(snapshot.exclude)) out.exclude = [...snapshot.exclude]\n if (Array.isArray(snapshot.add)) out.add = [...snapshot.add]\n for (const phase of PHASES) {\n if (phase.toolField === undefined) continue\n const incoming = snapshot[phase.toolField]\n if (incoming === undefined) continue\n const current = out[phase.toolField] ?? {}\n out[phase.toolField] = {\n exclude: incoming.exclude !== undefined ? [...incoming.exclude] : current.exclude,\n add: incoming.add !== undefined ? [...incoming.add] : current.add,\n }\n }\n return out\n}\n\n/**\n * \u8BA1\u7B97\u5E94\u7528\u9884\u8BBE\u65F6\u7684\u914D\u7F6E\u8865\u4E01\uFF1A\n * - \u6BB5\u540D\u5355\u6309 EntryRef\uFF08name+source\uFF09\u5339\u914D\uFF0C\u5339\u914D\u4E0D\u4E0A\u7684\u8DF3\u8FC7\uFF1B\n * - \u5DE5\u5177\u5FEB\u7167\u5408\u5E76\u4FDD\u7559\u5F53\u524D `add`\uFF08\u5FEB\u7167\u6CA1\u7ED9\u5C31\u4E0D\u91CD\u7F6E\uFF09\uFF1B\n * - \u6CE8\u5165\u6309 (phase,name,source) \u5206\u7EC4\u91CD\u7F16\u53F7\u3002\n */\nexport function applyPresetData(\n data: PresetData,\n cfg: Config,\n current: ReadonlySet<string> | ReadonlyMap<string, EntryRef>,\n): ConfigPatch {\n const mapCurrent = current instanceof Map ? current as ReadonlyMap<string, EntryRef> : undefined\n const entryOf = (identity: string): EntryRef => mapCurrent?.get(identity) ?? { name: identity }\n const currentKeys: ReadonlySet<string> = mapCurrent === undefined ? current as ReadonlySet<string> : new Set(mapCurrent.keys())\n const presetOrder = data.order ?? []\n const presetKeys = new Set(presetOrder.map((item) => entryKey(item)))\n const known = new Map<string, EntryRef>()\n const remember = (entry: EntryRef | string): void => {\n const normalized = normalizeEntry(entry)\n if (normalized !== undefined) known.set(entryKey(normalized), normalized)\n }\n for (const entry of data.sections ?? []) remember(entry)\n for (const entry of presetOrder) remember(entry)\n for (const entry of cfg.sections ?? []) remember(entry)\n for (const entry of cfg.sectionsBootstrap ?? []) remember(entry)\n for (const entry of cfg.sectionsCompaction ?? []) remember(entry)\n for (const item of cfg.inject ?? []) remember(item)\n if (mapCurrent !== undefined) for (const entry of mapCurrent.values()) remember(entry)\n\n const blocked = new Set<string>()\n for (const entry of data.sections ?? []) {\n const identity = entryKey(entry)\n if (currentKeys.has(identity)) blocked.add(identity)\n }\n\n const inject = resolveOrder(presetOrder.filter((item) => currentKeys.has(entryKey(item))))\n const kept = new Set(inject.map((item) => entryKey(item)))\n for (const item of cfg.inject ?? []) {\n const identity = entryKey(item)\n if (identity === '' || presetKeys.has(identity) || kept.has(identity)) continue\n kept.add(identity)\n inject.push(item)\n }\n const finalInject = reindexInject(inject)\n\n if (presetOrder.length > 0) {\n const active = new Set([...presetKeys].filter((identity) => !blocked.has(identity)))\n for (const identity of currentKeys) if (!presetKeys.has(identity)) blocked.add(identity)\n for (const identity of active) blocked.delete(identity)\n }\n\n const patch: ConfigPatch = {\n sections: [...blocked].map((identity) => known.get(identity) ?? entryOf(identity)),\n replacements: mergeReplacements(cfg.replacements, data.replacements),\n inject: finalInject,\n tools: mergeToolsSnapshot(cfg.tools, data.tools),\n }\n for (const phase of PHASES) {\n const sectionList = data[phase.sectionField]\n const contextList = data[phase.contextField]\n if (Array.isArray(sectionList)) patch[phase.sectionField] = [...sectionList]\n if (Array.isArray(contextList)) patch[phase.contextField] = [...contextList]\n }\n return patch\n}\n\n/** \u4ECE\u914D\u7F6E\u4E2D\u79FB\u9664\u4E00\u4E2A\u6761\u76EE\uFF1A\u6240\u6709\u9636\u6BB5\u540D\u5355\u3001\u6CE8\u5165\u6761\u76EE\u3001\u66FF\u6362\u6761\u76EE\u4E00\u8D77\u6E05\u6389\u3002 */\nexport function removeSection(entry: EntryRef, cfg: Config): Partial<Config> {\n const out: Partial<Config> = {\n inject: (cfg.inject ?? [])\n .filter((item) => !sameEntry(item, entry))\n .map((item, index) => ({ ...item, order: index })),\n replacements: (cfg.replacements ?? []).filter((item) => !sameEntry(item, entry)),\n }\n for (const phase of PHASES) {\n out[phase.sectionField] = (cfg[phase.sectionField] ?? []).filter((item) => !sameEntry(item, entry))\n out[phase.contextField] = (cfg[phase.contextField] ?? []).filter((item) => !sameEntry(item, entry))\n }\n return out\n}\n\n// \u2500\u2500 \u5DE5\u5177\u8FC7\u6EE4 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ToolsCfg = { exclude?: EntryRef[] }\n\n/** \u628A\u4E00\u4E2A\u9636\u6BB5\u7684 exclude \u540D\u5355\u5199\u56DE\u6574\u4EFD\u5DE5\u5177\u914D\u7F6E\u3002 */\nexport function withPhaseExclude(tools: ToolsConfig | undefined, key: PhaseKey, exclude: EntryRef[]): ToolsConfig {\n const base = tools ?? {}\n const field = toolFieldOf(key)\n if (field === 'static') return { ...base, exclude }\n return { ...base, [field]: { ...(base[field] ?? {}), exclude } }\n}\n\n/** \u628A\u4E00\u4E2A\u9636\u6BB5\u7684 add \u540D\u5355\u5199\u56DE\u6574\u4EFD\u5DE5\u5177\u914D\u7F6E\u3002 */\nexport function withPhaseAdd(tools: ToolsConfig | undefined, key: PhaseKey, add: EntryRef[]): ToolsConfig {\n const base = tools ?? {}\n const field = toolFieldOf(key)\n if (field === 'static') return { ...base, add }\n return { ...base, [field]: { ...(base[field] ?? {}), add } }\n}\n\n/** \u67D0\u4E2A\u5DE5\u5177\u5728\u5F53\u524D\u9ED1\u540D\u5355\u914D\u7F6E\u4E0B\u662F\u5426\u88AB\u9690\u85CF\uFF08\u6309 name+source\uFF09\u3002 */\nexport function isToolHidden(entry: EntryRef, toolsCfg: ToolsCfg | undefined): boolean {\n return (toolsCfg?.exclude ?? []).some((item) => sameEntry(item, entry))\n}\n\n/** \u5207\u6362\u67D0\u4E2A\u5DE5\u5177\u7684\u9690\u85CF\u72B6\u6001\uFF0C\u8FD4\u56DE\u65B0\u7684\u5DE5\u5177\u914D\u7F6E\uFF08\u4E0D\u6539\u539F\u5BF9\u8C61\uFF09\u3002 */\nexport function toggleTool(entry: EntryRef, currentlyHidden: boolean, toolsCfg: ToolsCfg | undefined): ToolsCfg {\n const exclude = (toolsCfg?.exclude ?? []).slice()\n const index = exclude.findIndex((item) => sameEntry(item, entry))\n if (currentlyHidden) {\n if (index >= 0) exclude.splice(index, 1)\n } else if (index < 0) {\n exclude.push({ name: entry.name, ...(entry.source === undefined ? {} : { source: entry.source }) })\n }\n return { exclude }\n}\n\n// \u2500\u2500 \u6309 agent \u9884\u8BBE\u7684\u8986\u76D6\u7F16\u8F91 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u628A\u4E00\u4EFD override \u539F\u6587\u53D8\u6210\u7F16\u8F91\u663E\u793A\u89C6\u56FE\uFF08\u8986\u76D6\u6240\u6709 PHASES \u5B57\u6BB5 + replacements\uFF09\u3002 */\nexport function overrideView(cfg: Config, ovr: OverrideData | undefined): Config {\n const o = ovr ?? {}\n return {\n ...phaseFieldValues(o),\n replacements: [...(o.replacements ?? [])],\n inject: [...(o.inject ?? [])],\n tools: normalizeToolsConfig(o.tools),\n presets: cfg.presets,\n activePreset: cfg.activePreset,\n // \u5168\u5C40\u5F00\u5173 / \u9ED1\u540D\u5355\u4E0D\u7ECF override\uFF1A\u663E\u793A\u4E0E\u5199\u5165\u90FD\u843D\u5728\u9876\u5C42\uFF0C\u907F\u514D\u9762\u677F\u663E\u793A\u6210\u9ED8\u8BA4\u503C\u3002\n forceSections: cfg.forceSections,\n envBlocklist: cfg.envBlocklist,\n }\n}\n\nexport function editView(cfg: Config, target: string | undefined): Config {\n if (!target) return cfg\n return overrideView(cfg, cfg.overrides?.[target])\n}\n\n/** \u5F80\u67D0\u4E2A agent \u9884\u8BBE\u7684 override \u91CC\u5199\u5165\u4E00\u4E2A\u5B57\u6BB5\uFF08\u4E0D\u6539\u539F\u5BF9\u8C61\uFF09\u3002 */\nexport function setOverrideField(cfg: Config, target: string, field: keyof OverrideData, value: unknown): Record<string, OverrideData> {\n return {\n ...(cfg.overrides ?? {}),\n [target]: { ...(cfg.overrides?.[target] ?? {}), [field]: value },\n }\n}\n\n// \u2500\u2500 \u9884\u8BBE\u5217\u8868\u64CD\u4F5C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u5E8F\u5217\u5316\u9884\u8BBE\u7528\u4E8E\u5BFC\u51FA\uFF08JSON \u5B89\u5168\u7684\u5B8C\u6574\u5FEB\u7167\uFF09\u3002 */\nexport function serializePreset(preset: Preset): { name: string; data: PresetData } {\n return { name: preset.name, data: preset.data }\n}\n\n/** Derive a safe default filename for a preset export. */\nexport function presetExportFilename(name: string): string {\n const sanitized = String(name)\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]/g, '_')\n .trim()\n .replace(/[. ]+$/, '')\n const base = sanitized === '' ? 'preset' : sanitized\n return `${base}.json`\n}\n\n/** \u5BFC\u5165\u9884\u8BBE\uFF1A\u540C\u540D\u7684\u4F1A\u88AB\u8DF3\u8FC7\uFF0C\u53EA\u8FFD\u52A0\u540D\u5B57\u4E0D\u540C\u7684\u9884\u8BBE\u3002 */\nexport function addImportedPresets(existing: Preset[], parsed: unknown, makeId: () => string): Preset[] {\n const incoming = Array.isArray(parsed) ? parsed : [parsed]\n const existingNames = new Set(existing.map((preset) => preset.name))\n const added = incoming\n .filter((preset) => preset && typeof (preset as { name?: unknown }).name === 'string' && !existingNames.has((preset as Preset).name))\n .map((preset) => ({ id: makeId(), name: (preset as Preset).name, data: ((preset as Preset).data ?? {}) as PresetData }))\n return added.length > 0 ? [...existing, ...added] : existing\n}\n\n/** \u5220\u9664\u67D0\u4E2A\u9884\u8BBE\uFF1B\u82E5\u5B83\u6B63\u662F\u5F53\u524D\u6FC0\u6D3B\u7684\u9884\u8BBE\uFF0C\u5219\u540C\u65F6\u6E05\u9664 activeId\u3002 */\nexport function removePreset(presets: Preset[], id: string, activeId?: string): { presets: Preset[]; activeId?: string } {\n return {\n presets: presets.filter((preset) => preset.id !== id),\n activeId: activeId === id ? undefined : activeId,\n }\n}\n\n/** \u751F\u6210\u9884\u8BBE id\uFF1A\u65F6\u95F4\u6233 + \u968F\u673A\u6BB5\uFF08base36\uFF09\u3002 */\nexport function genId(): string {\n return 'p_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 7)\n}\n", "/**\n * SectionsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u5DE6\u680F\uFF08\u63D0\u793A\u8BCD\u6A21\u5F0F\uFF09\u3002\n *\n * \u9876\u90E8\u4E09\u4E2A\u9636\u6BB5 Tab\uFF08\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF0C\u6052\u5B9A\u5168\u90E8\u53EF\u9009\uFF09\uFF0C\u4E0E\u53F3\u680F\n * \u9884\u89C8\u7684\u9636\u6BB5\u6309\u94AE**\u8054\u52A8**\uFF1A\u4E24\u8FB9\u5207\u7684\u662F\u540C\u4E00\u4E2A\u9636\u6BB5\uFF0C\u7F16\u8F91\u54EA\u4E2A\u9636\u6BB5\u5C31\u770B\u54EA\u4E2A\u9636\u6BB5\u7684\n * \u88C5\u914D\u3002\u6BCF\u4E2A\u9636\u6BB5\u5217\u51FA\u8BE5\u9636\u6BB5\u88C5\u914D\u91CC\u7684\u6BB5\uFF1A\u52FE\u9009\u6846 = \u8BE5\u9636\u6BB5\u662F\u5426\u6CE8\u5165\u6A21\u578B\uFF08\u52FE\u4E0A =\n * \u542F\u7528\uFF09\uFF0C\u88AB\u505C\u7528\u7684\u884C\u534A\u900F\u660E\u539F\u4F4D\u4FDD\u7559\u3001\u968F\u65F6\u53EF\u52FE\u56DE\u3002\u884C\u5185\uFF1A\u6293\u624B\u62D6\u52A8\u6392\u5E8F / \u2191\u2193 \u91CD\u6392\u3001\n * \u7F16\u8F91\uFF08\u6309\u9636\u6BB5\u66FF\u6362\u6587\u672C\uFF09\u3001\u8FD8\u539F\u3001\u5220\u9664\uFF08\u4EC5\u81EA\u5B9A\u4E49\u6BB5\uFF09\uFF1B\u300C+ \u6CE8\u5165\u300D\u5C55\u5F00\u6CE8\u5165\u65B0\u6BB5\u8868\u5355\u3002\n *\n * \u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 / \u5DF2\u505C\u7528\uFF09\u2014\u2014\u50CF\u5BBF\u4E3B\u80FD\u529B\u7BA1\u7406\u9875\u4E00\u6837\u6309\n * \u52FE\u9009\u72B6\u6001\u7B5B\u9009\u5F53\u524D\u9636\u6BB5\u7684\u5217\u8868\u3002\n *\n * \u62D6\u62FD\uFF08\u89C1 dnd.ts\uFF09\uFF1A\u884C\u6293\u624B\u4E0A\u4E0B\u62D6 = \u5728\u672C\u9636\u6BB5\u6392\u5E8F\uFF1B\u628A\u884C\u62D6\u56DE\u672B\u5C3E\u7684\u300C\u672C\u7CFB\u7EDF\u5168\u90E8\n * \u63D0\u793A\u8BCD\u300D\u6C60 = \u4ECE\u672C\u9636\u6BB5\u79FB\u9664\uFF1B\u628A\u6C60\u91CC\u7684\u6BB5\u62D6\u8FDB\u5217\u8868 = \u52A0\u5165\u672C\u9636\u6BB5\uFF08\u5E26\u6C60\u91CC\u539F\u6587\uFF09\uFF1B\n * \u628A\u884C\u62D6\u5230\u5934\u90E8\u67D0\u4E2A\u9636\u6BB5 Tab = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\u3002\u70B9\u6309\u8DEF\u5F84\u7167\u65E7\uFF1A\u6C60\u91CC\u6BCF\u884C\u4E09\u4E2A\u5C0F\u6309\u94AE\n * \u4E5F\u80FD\u52A0\u5165\u5BF9\u5E94\u9636\u6BB5\uFF08\u8FD0\u884C\u65F6\u52A8\u6001\u6BB5\u52A0\u4E0D\u8FDB\uFF0C\u4F1A\u7ED9\u51FA\u8BF4\u660E\uFF09\u3002\n *\n * \u4E09\u6001\u540C\u6B65\uFF08syncAll\uFF0C\u9ED8\u8BA4\u5173\uFF09\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u300C\u5E76\u96C6\u884C\u96C6\u300D\u2014\u2014 \u5E38\u9A7B\u671F\u884C\u5E8F\u4E3A\n * \u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF0C\u540C\u540D\u6BB5\u4EE5\u539F\u751F\u90A3\u4E00\u9636\u6BB5\u7684\u884C\u4E3A\u51C6\uFF1B\u589E\u5220 / \u6392\u5E8F /\n * \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u5F8B\u7ECF persistRows \u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\uFF09\uFF0C\n * \u6240\u4EE5\u4E09\u6001\u5217\u8868\u4E0E\u6587\u672C\u6052\u7B49\uFF0C\u4E0D\u518D\u9010\u9636\u6BB5\u5404\u5199\u4E00\u4EFD\u3002\n *\n * \u5168\u90E8\u9636\u6BB5\u72B6\u6001\u903B\u8F91\u6765\u81EA phase-ops.ts\uFF08\u7EAF\u51FD\u6570\uFF0Cnode --test \u5355\u6D4B\u76F4\u63A5\u8986\u76D6\u540C\u4E00\u4EFD\n * \u4EE3\u7801\uFF09\uFF1B\u6761\u76EE\u8EAB\u4EFD\u7EDF\u4E00\u4E3A name+source\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type ChangeEvent, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport {\n PHASES,\n PHASE_KEYS,\n PHASE_LABEL_KEY,\n entryKey,\n sameEntry,\n type Config,\n type ContextField,\n type EntryRef,\n type Inventory,\n type PhaseKey,\n type PhaseViews,\n type SectionField,\n} from './types.ts'\nimport type { Translate } from './locales.ts'\nimport {\n blockPatch,\n injectedAt,\n mirrorPhaseInjectEntries,\n mirrorSkippedNames,\n mirroredDeniedLists,\n mirroredRows,\n phaseInjectEntries,\n phaseRows,\n reorderInsert,\n type PhaseRow,\n} from './phase-ops.ts'\nimport { acceptsDrop, beginDrag, dropOnPhase, finishDrag, payloadOf, setPhaseDropHandler, type DragPayload } from './dnd.ts'\nimport { useDragAutoScroll } from './drag-scroll.ts'\nimport { s } from './styles.ts'\n\ntype PartRow = PhaseRow\n\n/** \u4E09\u6001\u8FC7\u6EE4\uFF1A\u5168\u90E8 / \u5DF2\u542F\u7528\uFF08\u672A\u5C4F\u853D\uFF09/ \u5DF2\u505C\u7528\uFF08\u88AB\u5C4F\u853D\uFF09\u3002 */\nexport type TriState = 'all' | 'on' | 'off'\n\n/** \u7F16\u8F91\u6001\u7684\u952E\uFF1A\u9636\u6BB5 + \u6761\u76EE\u8EAB\u4EFD\uFF0C\u5426\u5219\u540C\u540D\u4E0D\u540C\u6E90 / \u4E0D\u540C\u9636\u6BB5\u4F1A\u540C\u65F6\u5C55\u5F00\u7F16\u8F91\u5668\u3002 */\nconst editKey = (key: PhaseKey, entry: EntryRef): string => `${key}:${entryKey(entry)}`\n\nexport function SectionsPane({ cfg, inv, phases, phase, syncAll, t, write }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseKey\n /** \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6\uFF0C\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u6B21\u5199\u5168\u4E09\u6001\u3002 */\n syncAll?: boolean\n t: Translate\n write: (field: SectionField | ContextField | 'replacements' | 'inject' | 'tools', value: unknown) => void\n}): ReactElement {\n const [filter, setFilter] = useState<TriState>('all')\n const [editing, setEditing] = useState<string | null>(null)\n const [draft, setDraft] = useState('')\n // \u300C\u6CE8\u5165\u65B0\u6BB5\u300D\u8868\u5355\u5C55\u5F00\u6001\uFF08\u5F53\u524D\u9636\u6BB5\u5206\u7EC4\u5185\uFF09\u3002\n const [addOpen, setAddOpen] = useState(false)\n // \u9762\u677F\u5185\u77ED\u63D0\u793A\uFF08\u4F8B\u5982\uFF1A\u52A8\u6001\u6BB5\u52A0\u4E0D\u8FDB\u67D0\u4E2A\u9636\u6BB5\u65F6\u8BF4\u660E\u539F\u56E0\uFF09\u3002\n const [notice, setNotice] = useState<string | null>(null)\n // \u62D6\u62FD\uFF1A\u6B63\u5728\u62D6\u7684\u884C\u540D\uFF0C\u6295\u653E\u4F4D\u7F6E\u6807\u8BB0\uFF08`<\u884C\u540D>:above|below` / `list` / `pool`\uFF09\u3002\n const [dragName, setDragName] = useState<string | null>(null)\n const [dropMark, setDropMark] = useState<string | null>(null)\n // \u5217\u8868\u6EDA\u52A8\u5BB9\u5668\uFF1A\u62D6\u5230\u4E0A\u4E0B\u8FB9\u7F18\u65F6\u81EA\u52A8\u6EDA\uFF08\u957F\u5217\u8868\u91CC\u624B\u62D6\u591F\u4E0D\u5230\u89C6\u53E3\u5916\u7684\u4F4D\u7F6E\uFF09\u3002\n const scrollRef = useRef<HTMLDivElement | null>(null)\n useDragAutoScroll(scrollRef)\n\n // \u2500\u2500 \u4E09\u6001\u540C\u6B65\uFF08syncAll\uFF09\uFF1A\u4E09\u6001\u5171\u7528\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u8BE5\u6761\u76EE\u662F\u5426\u5728\u76EE\u6807\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\uFF08base \u89C6\u56FE\uFF09\u91CC\uFF1A\u955C\u50CF\u65F6\u636E\u6B64\u51B3\u5B9A\u300C\u53EA\u5199 order\u300D\n * \u8FD8\u662F\u300C\u5FC5\u987B\u5E26\u6B63\u6587\u300D\u3002null = \u8BE5\u9636\u6BB5\u89C6\u56FE\u672A\u5C31\u7EEA\uFF08\u955C\u50CF\u6574\u6BB5\u8DF3\u8FC7\uFF0C\u7EDD\u4E0D\u628A\u7F3A\u5931\u7684\n * \u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\uFF09\u3002 */\n const nativeIn = (key: PhaseKey, entry: EntryRef): boolean | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n return (view.baseSections ?? []).some((section) => sameEntry(section, entry))\n }\n /** \u4E09\u9636\u6BB5\u88C5\u914D\u662F\u5426\u90FD\u5C31\u7EEA\uFF08\u7F3A\u4E00\u6001\u5C31\u4E0D\u505A\u955C\u50CF\uFF09\u3002 */\n const mirrorReady = (): boolean => PHASE_KEYS.every((key) => phases?.[key] !== null && phases?.[key] !== undefined)\n /** \u5E76\u96C6\u884C\u96C6\uFF1A\u5E38\u9A7B\u671F\u884C\u5E8F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF08\u540C\u540D\u540C\u6E90\u4EE5\u539F\u751F\u90A3\u9636\u6BB5\u4E3A\u51C6\uFF09\u3002 */\n const mirrorRows = (): PartRow[] => mirroredRows(cfg, phases, nativeIn)\n const rowsOf = (key: PhaseKey): PartRow[] =>\n syncAll === true ? mirrorRows() : phaseRows(cfg, phases?.[key] ?? null, key)\n\n // \u5C4F\u853D / \u6062\u590D\u4E00\u4E2A\u6BB5\uFF08blockPatch \u53EA\u52A8\u672C\u9636\u6BB5\u81EA\u5DF1\u7684\u540D\u5355\uFF09\u3002\u5199\u5165\u4E25\u683C\u843D\u5728\u5F53\u524D\n // \u7F16\u8F91\u76EE\u6807\u7684\u8349\u7A3F\u91CC \u2014\u2014 \u9884\u8BBE\u4E4B\u95F4\u4E92\u76F8\u72EC\u7ACB\uFF1A\u5728 A \u9884\u8BBE\u91CC\u7684\u4EFB\u4F55\u6539\u52A8\u5BF9 B \u9884\u8BBE\u4E0E\n // \u5168\u5C40\u9ED8\u8BA4\u96F6\u5F71\u54CD\u3002\n const applyBlock = (key: PhaseKey, entry: EntryRef, blocked: boolean): void => {\n const patch = blockPatch(cfg, key, entry, blocked)\n for (const [field, value] of Object.entries(patch)) {\n write(field as SectionField, value)\n }\n }\n\n /** \u4E09\u6001\u540C\u6B65\u843D\u76D8\uFF1A\u5E76\u96C6\u884C\u96C6\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\uFF09\u2014\u2014 \u9010\u9636\u6BB5\n * \u5404\u5199\u4E00\u6B21\u4F1A\u4E92\u76F8\u8986\u76D6\uFF08edit \u5BF9 inject \u662F\u6574\u4F53\u66FF\u6362\uFF09\uFF0C\u5FC5\u987B\u4E00\u6B21\u5199\u5168\u3002 */\n const persistMirror = (rows: PartRow[]): void => {\n if (!mirrorReady()) {\n setNotice(t('syncNotReady'))\n return\n }\n write('inject', mirrorPhaseInjectEntries(cfg, rows, nativeIn))\n const denied = mirroredDeniedLists(rows)\n for (const descriptor of PHASES) write(descriptor.sectionField, denied[descriptor.sectionField])\n }\n\n // \u8BE5\u6761\u76EE\u662F\u5426\u5728\u8BE5\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\u91CC\uFF08\u5224\u65AD\u52A0\u5165\u662F\u300C\u89E3\u9664\u5C4F\u853D\u300D\u8FD8\u662F\u300C\u51ED\u7A7A\u6CE8\u5165\u300D\uFF09\u3002\n const inBaseOf = (key: PhaseKey, entry: EntryRef): boolean => nativeIn(key, entry) === true\n\n // \u6301\u4E45\u5316\u4E00\u4E2A\u9636\u6BB5\u7684\u6709\u5E8F\u5217\u8868\uFF08\u5199\u56DE inject\uFF09\uFF1A\u6BCF\u884C\u4E00\u6761\u6CE8\u5165\u9879\u3001order \u4E3A\u8FDE\u7EED\u6574\u6570\uFF1B\n // \u7CFB\u7EDF\u884C\u7A7A\u6587\u672C\uFF08\u4EC5 order \u8986\u76D6\uFF09\uFF0Ccustom \u884C\u4FDD\u7559\u6587\u672C\uFF1B\u5176\u5B83\u9636\u6BB5\u7684\u6CE8\u5165\u9879\u539F\u6837\u4FDD\u7559\u3002\n const persistPhase = (key: PhaseKey, rows: PartRow[]): void => {\n write('inject', phaseInjectEntries(cfg, key, rows))\n }\n\n /** \u6301\u4E45\u5316\u4E00\u4EFD\u6709\u5E8F\u884C\u96C6\uFF1A\u4E09\u6001\u540C\u6B65 = \u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF0C\u5426\u5219\u53EA\u5199\u5F53\u524D\u9636\u6BB5\u3002 */\n const persistRows = (key: PhaseKey, rows: PartRow[]): void => {\n if (syncAll === true) persistMirror(rows)\n else persistPhase(key, rows)\n }\n\n const toggleBlocked = (key: PhaseKey, row: PartRow): void => {\n if (syncAll === true) {\n const rows = rowsOf(key)\n const target = rows.find((item) => sameEntry(item, row))\n if (target === undefined) return\n persistMirror(rows.map((item) => (sameEntry(item, row) ? { ...item, blocked: !item.blocked } : item)))\n return\n }\n applyBlock(key, row, !row.blocked)\n }\n\n // \u4E0A\u79FB/\u4E0B\u79FB\u4E00\u683C\uFF08\u6570\u7EC4\u4EA4\u6362\u540E\u91CD\u6392\u6574\u4E2A\u9636\u6BB5\uFF09\u3002\n const moveRow = (key: PhaseKey, index: number, dir: -1 | 1): void => {\n const rows = rowsOf(key)\n const target = index + dir\n if (target < 0 || target >= rows.length) return\n const next = rows.slice()\n const [item] = next.splice(index, 1)\n next.splice(target, 0, item!)\n persistRows(key, next)\n }\n\n // \u4ECE\u8BE5\u9636\u6BB5\u79FB\u9664\u4E00\u4E2A\u6BB5\uFF1A\u53EA\u5220\u672C\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF1B\u82E5\u5B83\u4ECD\u9760 always \u6761\u76EE\u5B58\u5728\uFF0C\n // \u5219\u6539\u5199\u672C\u9636\u6BB5\u5C4F\u853D\u540D\u5355\uFF08\u4E0D\u80FD\u5220 always \u2014\u2014 \u90A3\u7B49\u4E8E\u4E09\u6001\u4E00\u8D77\u5220\uFF09\u3002\n const removeFromPart = (key: PhaseKey, row: PartRow): void => {\n if (syncAll === true) {\n persistMirror(rowsOf(key).filter((item) => !sameEntry(item, row)))\n return\n }\n const inject = (cfg.inject ?? []).filter((item) => !((item.phase ?? 'always') === key && sameEntry(item, row)))\n const stillAlways = inject.some((item) => (item.phase ?? 'always') === 'always' && sameEntry(item, row))\n write('inject', inject)\n if (stillAlways) applyBlock(key, row, true)\n }\n\n // \u6587\u672C\u7F16\u8F91\u6309\u9636\u6BB5\u751F\u6548\uFF1A\u7F16\u8F91\u6001\u7684\u952E\u662F\u300C\u9636\u6BB5 + \u6761\u76EE\u8EAB\u4EFD\u300D\u3002\u5199\u5165\u8D70 persistPhase\n //\uFF08\u672C\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\u5E26 text\uFF09\uFF0C\u7EDD\u4E0D\u78B0\u5168\u5C40\u66FF\u6362\u5B57\u5178\u3002\n const startReplace = (key: PhaseKey, row: PartRow): void => {\n setEditing(editKey(key, row))\n setDraft(row.override || row.text)\n }\n const commitReplace = (key: PhaseKey, row: PartRow): void => {\n const patchRow = (candidate: PartRow): PartRow =>\n sameEntry(candidate, row) ? { ...candidate, override: draft, text: draft } : candidate\n // \u4E09\u6001\u540C\u6B65\uFF1A\u66FF\u6362\u6587\u672C\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08\u540C\u540D\u540C\u6E90\u884C = \u540C\u4E00\u4EFD\u6587\u672C\uFF09\u3002\n persistRows(key, rowsOf(key).map(patchRow))\n setEditing(null)\n }\n const restoreReplace = (key: PhaseKey, row: PartRow): void => {\n const next = rowsOf(key).map((candidate) =>\n sameEntry(candidate, row) ? { ...candidate, override: '', text: candidate.custom ? candidate.text : '' } : candidate,\n )\n persistRows(key, next)\n // \u9636\u6BB5\u5316\u66FF\u6362\u6761\u76EE\uFF1A\u53EA\u6E05\u9664\u672C\u9636\u6BB5\uFF08\u542B always\uFF09\u5BF9\u8FD9\u6761\u76EE\u751F\u6548\u7684\u66FF\u6362\u3002\n const rest = (cfg.replacements ?? []).filter((item) => !(\n sameEntry(item, row)\n && ((item.phase ?? 'always') === 'always' || (item.phase ?? 'always') === key)\n ))\n if (rest.length !== (cfg.replacements ?? []).length) write('replacements', rest)\n }\n\n const addSection = (name: string, text: string, phase: PhaseKey): void => {\n const row: PartRow = { name, text, replaced: false, custom: true, override: text, blocked: false }\n if (syncAll === true) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u65B0\u6BB5\u4E00\u6B21\u5EFA\u8FDB\u4E09\u4E2A\u9636\u6BB5\uFF08\u5E76\u96C6\u884C\u96C6\u5C3E\u90E8\uFF0C\u5E26\u81EA\u64B0\u6B63\u6587\uFF09\u3002\n persistMirror([...rowsOf(phase), row])\n return\n }\n // order \u7531 phaseInjectEntries \u7EDF\u4E00\u751F\u6210\u8FDE\u7EED\u503C\uFF0C\u7EDD\u4E0D\u4ECE 120 \u4E4B\u7C7B\u7684\u9B54\u6CD5\u6570\u8D77\u6B65\u3002\n write('inject', phaseInjectEntries(cfg, phase, [...rowsOf(phase), row]))\n }\n\n /** \u670D\u52A1\u7AEF dynamic \u6807\u8BB0\uFF1A\u53EA\u8BA4\u5E03\u5C14\u503C\uFF1Bundefined = \u5BBF\u4E3B\u4E0D\u652F\u6301\uFF0C\u754C\u9762\u4E0D\u5F97\u731C\u3002 */\n const dynamicOf = (entry: EntryRef): boolean | undefined => {\n for (const key of PHASE_KEYS) {\n const section = (phases?.[key]?.baseSections ?? []).find((candidate) => sameEntry(candidate, entry))\n if (section !== undefined && typeof section.dynamic === 'boolean') return section.dynamic\n }\n const poolSection = (inv?.sections ?? []).find((candidate) => sameEntry(candidate, entry))\n return typeof poolSection?.dynamic === 'boolean' ? poolSection.dynamic : undefined\n }\n\n // \u4ECE\u300C\u5168\u90E8\u300D\u6C60\u628A\u4E00\u4E2A\u6BB5\u52A0\u5165\u67D0\u9636\u6BB5\u3002\u52A8\u6001\u6BB5\uFF08\u670D\u52A1\u7AEF dynamic=true\uFF09\u6CA1\u6709\u53EF\u5E26\u7684\n // \u539F\u6587\uFF1B\u5BBF\u4E3B\u4E0D\u63D0\u4F9B dynamic \u6807\u8BB0\u65F6\u7981\u7528\u52A0\u5165\u5E76\u63D0\u793A\uFF0C\u7EDD\u4E0D\u7528\u6587\u672C\u524D\u7F00\u731C\u6D4B\u3002\n const addFromPool = (key: PhaseKey, entry: EntryRef, text: string, copiedFrom?: string): void => {\n const dynamic = dynamicOf(entry)\n if (dynamic === true) {\n setNotice(t('sectionDynamicNoAdd', { name: entry.name }))\n return\n }\n if (dynamic === undefined) {\n setNotice(t('sectionDynamicUnsupported', { name: entry.name }))\n return\n }\n setNotice(null)\n const rows = rowsOf(key)\n const existing = rows.find((row) => sameEntry(row, entry))\n // \u4E09\u6001\u540C\u6B65\u4E0B\u300C\u52A0\u5165\u300D= \u4E09\u6001\u90FD\u51FA\u73B0\u4E14\u90FD\u5F00\u542F\uFF08\u5E76\u96C6\u884C\u96C6\u91CC\u91CD\u6392\u5230\u5C3E\u90E8 / \u8FFD\u52A0\u65B0\u884C\uFF09\u3002\n const next = existing !== undefined\n ? [...rows.filter((row) => !sameEntry(row, entry)), syncAll === true ? { ...existing, blocked: false } : existing]\n : [...rows, {\n name: entry.name,\n ...(entry.source === undefined ? {} : { source: entry.source }),\n text: '',\n replaced: (cfg.replacements ?? []).some((item) => sameEntry(item, entry)),\n custom: false,\n override: text,\n blocked: false,\n }]\n if (syncAll !== true && (existing === undefined || existing.blocked) && inBaseOf(key, entry)) {\n const patch = blockPatch(cfg, key, entry, false)\n for (const [field, value] of Object.entries(patch)) write(field as SectionField, value)\n }\n persistRows(key, next)\n if (copiedFrom !== undefined) setNotice(t('sectionCopied', { name: entry.name, to: stageLabel(key), from: copiedFrom }))\n }\n\n // \u2500\u2500 \u62D6\u62FD\u843D\u5730\uFF08\u624B\u52BF\u5B9A\u4E49\u89C1 dnd.ts\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u62D6\u62FD\u8F7D\u8377 \u2192 \u6761\u76EE\u8EAB\u4EFD\uFF08name + source\uFF09\u3002 */\n const entryOfPayload = (payload: { name: string; source?: EntryRef['source'] }): EntryRef => ({\n name: payload.name,\n ...(payload.source === undefined ? {} : { source: payload.source }),\n })\n\n /** \u4ECE\u672C\u9636\u6BB5\u62FF\u6389\u4E00\u6BB5\uFF1A\u6CE8\u5165\u8FDB\u6765\u7684\u64A4\u9500\u6CE8\u5165\uFF0C\u539F\u751F\u6BB5\u5219\u5C4F\u853D\u6389\uFF08\u7B49\u4EF7\u4E8E\u53D6\u6D88\u52FE\u9009\uFF09\u3002 */\n const removeFromPhase = (entry: EntryRef): void => {\n const rows = rowsOf(phase)\n const row = rows.find((item) => sameEntry(item, entry))\n if (row === undefined) return\n if (syncAll === true) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u539F\u751F\u6BB5\u4E09\u6001\u4E00\u8D77\u5C4F\u853D\uFF1B\u53EA\u9760\u6CE8\u5165\u5B58\u5728\u7684\u6BB5\u4E09\u6001\u4E00\u8D77\u64A4\u9500\u6CE8\u5165\u3002\n const native = PHASE_KEYS.some((key) => nativeIn(key, row) === true)\n persistMirror(row.custom || !native\n ? rows.filter((item) => !sameEntry(item, row))\n : rows.map((item) => (sameEntry(item, row) ? { ...item, blocked: true } : item)))\n } else if (row.custom || row.override !== '' || injectedNames.has(entryKey(row))) {\n removeFromPart(phase, row)\n } else {\n applyBlock(phase, row, true)\n }\n setNotice(t('sectionRemoved', { name: row.name, from: stageLabel(phase) }))\n }\n\n /** \u884C\u4E0A\u6295\u653E\uFF1A\u540C\u9636\u6BB5 = \u6392\u5E8F\uFF1B\u522B\u7684\u9636\u6BB5 / \u6C60\u91CC\u6765\u7684 = \u590D\u5236\u8FDB\u672C\u9636\u6BB5\uFF08\u6E90\u4E0D\u52A8\uFF09\u3002 */\n const dropOnRow = (event: ReactDragEvent, target: PartRow): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n const entry = entryOfPayload(payload)\n if (sameEntry(entry, target)) return\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\n const pos = event.clientY < rect.top + rect.height / 2 ? 'above' : 'below'\n if (payload.from === phase) {\n const next = reorderInsert(rowsOf(phase), entry, target, pos)\n if (next !== null) { persistRows(phase, next); setNotice(null) }\n return\n }\n addFromPool(phase, entry, payload.text ?? '', payload.from === 'pool' ? undefined : stageLabel(payload.from))\n }\n\n /** \u5217\u8868\u7A7A\u767D\u5904\u6295\u653E\uFF1A\u8FFD\u52A0\u5230\u672C\u9636\u6BB5\u672B\u5C3E\uFF1B\u6C60\u91CC\u62D6\u6765\u7684 = \u52A0\u5165\u672C\u9636\u6BB5\u3002 */\n const dropOnList = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n setDropMark(null)\n const entry = entryOfPayload(payload)\n if (payload.from !== phase) {\n addFromPool(phase, entry, payload.text ?? '', payload.from === 'pool' ? undefined : stageLabel(payload.from))\n return\n }\n const list = rowsOf(phase)\n const last = list[list.length - 1]\n if (last === undefined || sameEntry(last, entry)) return\n const next = reorderInsert(list, entry, last, 'below')\n if (next !== null) persistRows(phase, next)\n }\n\n /** \u6C60\u4E0A\u6295\u653E\uFF1A\u628A\u884C\u4ECE\u672C\u9636\u6BB5\u62FF\u6389\uFF08\u62D6\u56DE\u300C\u5168\u90E8\u300D\u7684\u624B\u52BF\uFF09\u3002 */\n const dropOnPool = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n if (payload.from !== phase) return\n removeFromPhase(entryOfPayload(payload))\n }\n\n // \u5934\u90E8\u9636\u6BB5 Tab \u4E0A\u7684\u6295\u653E\uFF1A\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u6362 Tab / \u6362\u6A21\u5F0F\u65F6\u65E7\u5217\u8868\u5378\u8F7D\u3001\n // \u65B0\u5217\u8868\u6CE8\u518C \u2014\u2014 \u4EFB\u4F55\u65F6\u523B\u53EA\u6709\u4E00\u4E2A\u5904\u7406\u8005\uFF09\u3002\n useEffect(() => {\n setPhaseDropHandler((key, payload) => {\n if (payload.kind !== 'section' || key === phase) return\n // \u4E09\u6001\u540C\u6B65\uFF1A\u6BB5\u5DF2\u7ECF\u5728\u4E09\u4E2A\u9636\u6BB5\u91CC\u4E86\uFF0C\u62D6\u5230\u522B\u7684\u9636\u6BB5 Tab \u4E0D\u518D\u590D\u5236\uFF08\u53EA\u6709\u6C60\u91CC\u6765\u7684\u8981\u52A0\u5165\uFF09\u3002\n if (syncAll === true && payload.from !== 'pool') return\n addFromPool(key, entryOfPayload(payload), payload.text ?? '', stageLabel(phase))\n })\n return () => setPhaseDropHandler(null)\n })\n\n const stageLabel = (key: PhaseKey): string => t(PHASE_LABEL_KEY[key])\n\n // \u8BE5\u9636\u6BB5\u7684\u300C\u6BB5\u7EA7\u5B9A\u5236\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\u300D\u8B66\u793A\uFF08forceSections \u5173\u95ED\u6216\u5931\u6548\u65F6\uFF09\u3002\n const partNote = (key: PhaseKey): ReactElement | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n if (cfg.forceSections !== false) return null\n if (view.takenOverBy !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsTakenOver', { name: view.takenOverBy }))\n }\n const lost = view.lostSections\n if (lost !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsLost', { emitted: lost.emitted, survived: lost.survived }))\n }\n return null\n }\n\n const isEditing = (key: PhaseKey, row: PartRow): boolean => editing === editKey(key, row)\n\n const renderRow = (key: PhaseKey, row: PartRow, index: number, total: number): ReactElement | null => {\n if (!rowVisible(row)) return null\n const identity = entryKey(row)\n const toolPrompt = row.toolPrompt ?? (row.name.startsWith('tool:')\n ? { tools: [row.name.slice('tool:'.length)], empty: row.text.length === 0 }\n : undefined)\n const mark = dropMark !== null && dropMark.startsWith(`${identity}:`) ? dropMark.slice(identity.length + 1) : null\n return h('div', {\n key: identity,\n style: {\n ...s.row,\n ...(row.blocked ? s.rowBlocked : {}),\n ...(mark === 'above' ? s.dropAbove : {}),\n ...(mark === 'below' ? s.dropBelow : {}),\n ...(dragName === identity ? s.dragging : {}),\n },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'section')) return\n event.preventDefault()\n event.stopPropagation()\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\n setDropMark(`${identity}:${event.clientY < rect.top + rect.height / 2 ? 'above' : 'below'}`)\n },\n onDrop: (event: ReactDragEvent) => dropOnRow(event, row),\n }, [\n // \u62D6\u62FD\u6293\u624B\uFF1A\u6574\u884C draggable \u4F1A\u628A\u52FE\u9009\u6846 / \u6587\u672C\u57DF\u7684\u9009\u62E9\u624B\u52BF\u4E00\u8D77\u5403\u6389\u3002\n h('span', {\n draggable: true,\n title: t('drag'),\n style: s.dragHandle,\n onDragStart: (event: ReactDragEvent) => {\n setDragName(identity)\n beginDrag(event, {\n kind: 'section',\n name: row.name,\n ...(row.source === undefined ? {} : { source: row.source }),\n from: key,\n text: row.override || row.text,\n })\n },\n onDragEnd: () => { setDragName(null); setDropMark(null); finishDrag() },\n }, '\u283F'),\n h('input', {\n type: 'checkbox',\n checked: !row.blocked,\n onChange: () => toggleBlocked(key, row),\n title: row.blocked ? t('blockedOn') : t('blockedOff'),\n style: { margin: 0, cursor: 'pointer', flex: 'none' },\n }),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n h('span', { style: s.orderTag }, '#' + index),\n h('span', { style: row.custom ? s.badgeCustom : s.badgeSystem }, row.custom ? t('manual') : t('system')),\n row.source === undefined ? null : h('span', { style: s.badgeSystem }, `${row.source.kind}${row.source.id === undefined ? '' : `:${row.source.id}`}`),\n // \u4F1A\u8BDD\u7EA7\uFF1A\u53EA\u5728 agent \u81EA\u5DF1\u7684\u4F5C\u7528\u57DF\u91CC\u6CE8\u518C\uFF08\u9884\u8BBE scope \u7684\u6CE8\u518C\u8868\u6CA1\u6709\u5B83\uFF0C\n // \u4F46\u771F\u5B9E\u4F1A\u8BDD\u88C5\u914D\u4E00\u5B9A\u6709\uFF09\u2014\u2014 \u9884\u89C8\u5DF2\u628A\u5B83\u5E76\u8FDB\u5217\u8868\uFF0C\u8FD9\u91CC\u6807\u51FA\u6765\u514D\u5F97\u8BEF\u4F1A\u3002\n agentScoped.has(identity) ? h('span', { style: s.badgeSystem, title: t('agentScopedHint') }, t('agentScoped')) : null,\n toolPrompt === undefined\n ? null\n : h('span', {\n style: s.badgeSystem,\n title: t('toolPromptToolsHint', { tools: toolPrompt.tools.join(', ') }),\n }, t('toolPromptBadge')),\n row.replaced ? h('span', { style: s.badgeReplaced }, t('replaced')) : null,\n row.blocked ? h('span', { style: s.badgeBlocked }, t('blockedOn')) : null,\n ]),\n isEditing(key, row)\n ? h('div', { style: s.editBox }, [\n h('textarea', { style: s.editInput, value: draft, onChange: (e: ChangeEvent<HTMLTextAreaElement>) => setDraft(e.target.value), rows: 3 }),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => commitReplace(key, row) }, t('save')),\n h('button', { style: s.mini, onClick: () => setDraft('') }, t('clearInput')),\n !row.custom && row.replaced\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n ]),\n ])\n : h('div', { style: s.preview }, String(row.override || row.text || '').slice(0, 140) || (row.dynamic === true ? t('dynamic') : t('empty'))),\n toolPrompt === undefined\n ? null\n : h('div', { style: { ...s.muted, fontSize: '11px' } },\n `${t('toolPromptToolsLabel')}: ${toolPrompt.tools.join(' / ')}${toolPrompt.empty === true ? ` \u00B7 ${t('empty')}` : ''}`),\n ]),\n h('div', { style: s.arrowCol }, [\n h('button', { style: s.arrow, disabled: index === 0, onClick: () => moveRow(key, index, -1), title: t('moveUp') }, '\u2191'),\n h('button', { style: s.arrow, disabled: index === total - 1, onClick: () => moveRow(key, index, 1), title: t('moveDown') }, '\u2193'),\n ]),\n isEditing(key, row) ? null : h('button', { style: s.mini, onClick: () => startReplace(key, row) }, t('replace')),\n !isEditing(key, row) && !row.custom && row.replaced\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n row.custom ? h('button', { style: s.mini, onClick: () => removeFromPart(key, row), title: t('delete') }, t('delete')) : null,\n ])\n }\n\n // \u5F53\u524D\u9636\u6BB5\u7684\u884C + \u4E09\u6001\u8FC7\u6EE4\u3002\n const rows = rowsOf(phase)\n /** \u4E09\u6001\u540C\u6B65\u4E0B\u5EFA\u4E0D\u5230\u5176\u5B83\u9636\u6BB5\u7684\u52A8\u6001\u6BB5\uFF08\u884C\u96C6\u91CC\u663E\u793A\u3001\u88C5\u914D\u91CC\u6CA1\u6709\uFF09\uFF1A\u7ED9\u51FA\u8BF4\u660E\u3002 */\n const mirrorSkipped = syncAll === true && mirrorReady() ? mirrorSkippedNames(rows, nativeIn) : []\n /** \u672C\u9636\u6BB5\u6709\u6CE8\u5165\u6761\u76EE\uFF08= \u88AB\u663E\u5F0F\u52A0\u8FDB\u6765\u8FC7\uFF09\u7684\u6761\u76EE\u8EAB\u4EFD\u952E\uFF1A\u62D6\u56DE\u6C60\u65F6\u7528\u6765\u81EA\u52A8\u9009\u300C\u64A4\u9500\u6CE8\u5165\u300D\u8FD8\u662F\u300C\u5C4F\u853D\u300D\u3002 */\n const injectedNames = injectedAt(cfg, phase).names\n /** \u53EA\u5728 agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684\u6BB5\uFF08\u9884\u89C8\u628A\u5B83\u4EEC\u5E76\u8FDB\u6765\u4E86\uFF0C\u5E26 scope \u6807\u8BB0\uFF09\uFF1A\u884C\u4E0A\u6807\u300C\u4F1A\u8BDD\u7EA7\u300D\u3002 */\n const agentScoped = new Set<string>()\n for (const view of Object.values(phases ?? {})) {\n for (const section of view?.baseSections ?? []) {\n if (section.scope === 'agent') agentScoped.add(entryKey(section))\n }\n }\n const onCount = rows.filter((row) => !row.blocked).length\n const offCount = rows.length - onCount\n const rowVisible = (row: PartRow): boolean =>\n filter === 'all' || (filter === 'on' ? !row.blocked : row.blocked)\n\n const poolSections = inv?.sections ?? []\n\n return h('div', { style: s.colLeft }, [\n h('div', {\n ref: scrollRef,\n style: { ...s.colScroll, ...(dropMark === 'list' ? s.dropZone : {}) },\n // \u5217\u8868\u7A7A\u767D\u5904 = \u300C\u672C\u9636\u6BB5\u672B\u5C3E\u300D\u7684\u6295\u653E\u70B9\uFF08\u6C60\u91CC\u62D6\u8FDB\u6765\u7684\u6BB5\u4E5F\u4ECE\u8FD9\u91CC\u8FDB\uFF09\u3002\n onDragOver: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section' || payload.from === phase) return\n event.preventDefault()\n setDropMark('list')\n },\n onDrop: dropOnList,\n }, [\n notice ? h('div', { style: s.noticeWarn }, notice) : null,\n mirrorSkipped.length > 0\n ? h('div', { style: s.noticeWarn }, t('syncSkippedDynamic', { names: mirrorSkipped.join('\u3001') }))\n : null,\n partNote(phase),\n rows.map((row, i) => renderRow(phase, row, i, rows.length)),\n rows.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n addOpen\n ? h(InjectForm, {\n onAdd: (name, text) => { addSection(name, text, phase); setAddOpen(false) },\n phaseLabel: stageLabel(phase),\n t,\n })\n : null,\n // \u672C\u7CFB\u7EDF\u5168\u90E8\u63D0\u793A\u8BCD\uFF1A\u8DE8\u9884\u8BBE\u7D2F\u79EF\u7684\u53EA\u8BFB\u6C60\uFF08\u6298\u53E0\u533A\uFF09\u3002\u52A0\u5165\u67D0\u4E2A\u9636\u6BB5\u9760\u62D6\u62FD\uFF1A\n // \u628A\u884C\u62D6\u8FDB\u4E0A\u9762\u7684\u9636\u6BB5\u5217\u8868 = \u52A0\u5165\u672C\u9636\u6BB5\uFF0C\u62D6\u5230\u5934\u90E8\u9636\u6BB5 Tab = \u52A0\u5165\u90A3\u4E2A\u9636\u6BB5\n // \uFF08\u884C\u4E0A\u4E0D\u518D\u653E\u4E09\u4E2A\u6309\u94AE \u2014\u2014 \u62D6\u62FD\u662F\u552F\u4E00\u8DEF\u5F84\uFF0C\u6C60\u540C\u65F6\u662F\u300C\u4ECE\u9636\u6BB5\u62FF\u6389\u300D\u7684\u6295\u653E\u70B9\uFF09\u3002\n h('details', {\n style: { ...s.injectBox, ...(dropMark === 'pool' ? s.dropZoneActive : {}) },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'section')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark('pool')\n },\n onDrop: dropOnPool,\n }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } },\n `${t('allSectionsTitle')} (${poolSections.length})`),\n h('div', { style: { ...s.muted, marginBottom: 4 } }, t('sectionsFourHint')),\n poolSections.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n poolSections.map((sec) => h('div', {\n key: entryKey(sec),\n style: { ...s.row, opacity: 0.92 },\n draggable: true,\n title: t('drag'),\n onDragStart: (event: ReactDragEvent) => beginDrag(event, {\n kind: 'section',\n name: sec.name,\n ...(sec.source === undefined ? {} : { source: sec.source }),\n from: 'pool',\n text: sec.text ?? '',\n }),\n onDragEnd: finishDrag,\n }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, sec.name),\n sec.source === undefined ? null : h('span', { style: s.badgeSystem }, `${sec.source.kind}${sec.source.id === undefined ? '' : `:${sec.source.id}`}`),\n ]),\n h('div', { style: s.preview }, String(sec.text ?? '').slice(0, 140) || t('dynamic')),\n ]),\n ])),\n ]),\n // \u300C+ \u6CE8\u5165\u300D\u5165\u53E3\u653E\u5728\u6EDA\u52A8\u533A\u672B\u5C3E\uFF1A\u65B0\u6BB5\u901A\u5E38\u8FFD\u52A0\u5728\u5F53\u524D\u9636\u6BB5\u5217\u8868\u5C3E\u90E8\u3002\n h('div', { style: { ...s.injectRow, marginTop: 8 } }, [\n h('button', { style: s.mini, onClick: () => setAddOpen(!addOpen), title: t('injectNew') },\n addOpen ? `\u00D7 ${t('clearInput')}` : `+ ${t('injectNew')}`),\n ]),\n ]),\n // \u5DE6\u680F\u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 / \u5DF2\u505C\u7528\uFF09\uFF0C\u53EA\u7EDF\u8BA1\u5F53\u524D\u9636\u6BB5\u3002\n h('div', { style: s.colFoot }, [\n h('div', { style: s.seg }, [\n h('button', { style: filter === 'all' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('all') },\n `${t('filterAll')} ${rows.length}`),\n h('button', { style: filter === 'on' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('on') },\n `${t('filterOn')} ${onCount}`),\n h('button', { style: filter === 'off' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('off') },\n `${t('filterOff')} ${offCount}`),\n ]),\n ]),\n ])\n}\n\n/** \u6CE8\u5165\u65B0\u6BB5\u8868\u5355\uFF1A\u300C+ \u6CE8\u5165\u300D\u5C55\u5F00\uFF0C\u9636\u6BB5\u9501\u5B9A\u4E3A\u5F53\u524D Tab \u7684\u9636\u6BB5\u3002 */\nfunction InjectForm({ onAdd, phaseLabel, t }: {\n onAdd: (name: string, text: string) => void\n phaseLabel: string\n t: Translate\n}): ReactElement {\n const [name, setName] = useState('')\n const [text, setText] = useState('')\n const submit = (): void => {\n if (!name.trim()) return\n onAdd(name.trim(), text)\n setName(''); setText('')\n }\n return h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, width: '30%' }, placeholder: t('name'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('input', { style: { ...s.input, flex: 1 }, placeholder: `${t('text')}\uFF08${phaseLabel}\uFF09`, value: text, onChange: (e: ChangeEvent<HTMLInputElement>) => setText(e.target.value) }),\n h('button', { style: s.mini, onClick: submit }, t('add')),\n ])\n}\n", "/**\r\n * drag-scroll \u2014\u2014 \u62D6\u62FD\u65F6\u8D34\u8FB9\u81EA\u52A8\u6EDA\u52A8\u3002\r\n *\r\n * \u5217\u8868\u6BD4\u89C6\u53E3\u957F\u7684\u65F6\u5019\uFF0C\u9760\u624B\u62D6\u6839\u672C\u5230\u4E0D\u4E86\u89C6\u53E3\u5916\u7684\u6295\u653E\u4F4D\u7F6E\uFF08\u628A\u884C\u62D6\u5230\u4E0A\u9762\u7684\u7B2C\r\n * 3 \u4E2A\u4F4D\u7F6E\u3001\u6216\u4ECE\u5E95\u90E8\u300C\u5168\u90E8\u300D\u6C60\u62D6\u5230\u9876\u90E8\uFF0C\u90FD\u8981\u5148\u505C\u4E0B\u6765\u6EDA\u4E00\u6EDA \u2014\u2014 \u800C\u62D6\u62FD\u4E2D\r\n * \u662F\u6EDA\u4E0D\u4E86\u7684\uFF09\u3002\u8FD9\u91CC\u5728\u6307\u9488\u8FDB\u5165\u5BB9\u5668\u4E0A/\u4E0B\u8FB9\u7F18\u5E26\u65F6\u6301\u7EED\u6EDA\u52A8\uFF1A\u8D8A\u9760\u8FB9\u8D8A\u5FEB\uFF0C\u6307\u9488\r\n * \u56DE\u5230\u4E2D\u95F4\u5C31\u505C\u3002\r\n *\r\n * \u4E24\u4E2A\u5B9E\u73B0\u8981\u70B9\uFF1A\r\n * - HTML5 \u62D6\u62FD\u53EA\u5728\u6307\u9488\u79FB\u52A8\u65F6\u7ED9 `dragover`\uFF0C\u9760\u5B83\u4E00\u6B21\u6EDA\u4E00\u5C4F\u4F1A\u4E00\u987F\u4E00\u987F\uFF0C\u6240\u4EE5\r\n * \u8FB9\u7F18\u5185\u6539\u7528 requestAnimationFrame \u9010\u5E27\u6EDA\uFF08\u6BCF\u5E27\u6700\u591A MAX_STEP \u50CF\u7D20\uFF09\uFF1B\r\n * - \u884C\u4E0A\u7684\u6295\u653E\u5904\u7406\u4F1A\u5728\u5192\u6CE1\u9636\u6BB5 `stopPropagation`\uFF0C\u6240\u4EE5\u8FD9\u91CC\u7528**\u6355\u83B7**\u9636\u6BB5\r\n * \u7684\u539F\u751F\u76D1\u542C\u6302\u5728\u6EDA\u52A8\u5BB9\u5668\u4E0A \u2014\u2014 \u6355\u83B7\u5148\u4E8E\u5192\u6CE1\u6267\u884C\uFF0C\u4E0D\u53D7\u884C\u5904\u7406\u5F71\u54CD\u3002\r\n */\r\nimport { useEffect, type RefObject } from 'react'\r\nimport { isPanelDrag } from './dnd.ts'\r\n\r\n/** \u8FDB\u5165\u8FD9\u4E2A\u50CF\u7D20\u5E26\u5F00\u59CB\u6EDA\u3002 */\r\nconst EDGE = 56\r\n/** \u6BCF\u5E27\u6700\u5927\u6EDA\u52A8\u50CF\u7D20\uFF08\u8D8A\u9760\u8FB9\u8D8A\u63A5\u8FD1\u5B83\uFF09\u3002 */\r\nconst MAX_STEP = 18\r\n\r\n/**\r\n * \u7ED9\u6EDA\u52A8\u5BB9\u5668\u6302\u4E0A\u300C\u62D6\u62FD\u8D34\u8FB9\u81EA\u52A8\u6EDA\u300D\u3002\r\n *\r\n * \u4F20\u5165\u7684 ref \u6307\u5411\u771F\u6B63 overflow-y:auto \u7684\u90A3\u4E00\u5C42\uFF08\u5217\u8868 + \u6C60\u90FD\u5728\u91CC\u9762\uFF0C\u6240\u4EE5\u6EDA\u52A8\r\n * \u5B83\u5C31\u80FD\u628A\u4EFB\u4E00\u6295\u653E\u4F4D\u7F6E\u5E26\u8FDB\u89C6\u53E3\uFF09\u3002\u53EA\u5728\u6307\u9488\u5904\u4E8E\u5BB9\u5668\u5782\u76F4\u8303\u56F4\u5185\u4E14\u8D34\u7740\u4E0A/\u4E0B\u8FB9\r\n * \u7F18\u65F6\u6EDA\uFF0C\u6A2A\u5411\u4E0D\u53C2\u4E0E\u3002\r\n */\r\nexport function useDragAutoScroll(ref: RefObject<HTMLElement | null>): void {\r\n useEffect(() => {\r\n const el = ref.current\r\n if (el === null) return undefined\r\n\r\n let frame = 0\r\n let step = 0\r\n let pendingY: number | null = null\r\n\r\n const stopScroll = (): void => {\r\n step = 0\r\n pendingY = null\r\n if (frame !== 0) {\r\n cancelAnimationFrame(frame)\r\n frame = 0\r\n }\r\n }\r\n\r\n const stepFrame = (): void => {\r\n frame = 0\r\n if (step === 0) return\r\n const before = el.scrollTop\r\n el.scrollTop += step\r\n // \u6EDA\u5230\u5934\uFF08\u6D4F\u89C8\u5668\u628A scrollTop \u5939\u4F4F\uFF09\u5C31\u505C\uFF0C\u522B\u7A7A\u8F6C rAF\u3002\r\n if (el.scrollTop === before) {\r\n step = 0\r\n return\r\n }\r\n frame = requestAnimationFrame(stepFrame)\r\n }\r\n\r\n const measure = (clientY: number): void => {\r\n const rect = el.getBoundingClientRect()\r\n const fromTop = clientY - rect.top\r\n const fromBottom = rect.bottom - clientY\r\n step = fromTop < EDGE\r\n ? -Math.ceil(((EDGE - fromTop) / EDGE) * MAX_STEP)\r\n : fromBottom < EDGE\r\n ? Math.ceil(((EDGE - fromBottom) / EDGE) * MAX_STEP)\r\n : 0\r\n if (step === 0) {\r\n stopScroll()\r\n return\r\n }\r\n if (frame === 0) frame = requestAnimationFrame(stepFrame)\r\n }\r\n\r\n const onDragOver = (event: DragEvent): void => {\r\n // \u53EA\u8BA4\u672C\u9762\u677F\u81EA\u5DF1\u7684\u62D6\u62FD\uFF1A\u5916\u90E8\u62D6\u5165\uFF08\u6BD4\u5982\u5F80\u6280\u80FD\u9762\u677F\u4E22\u6587\u4EF6\uFF09\u4E0D\u6EDA\u3002\r\n if (!isPanelDrag(event)) {\r\n stopScroll()\r\n return\r\n }\r\n pendingY = event.clientY\r\n measure(event.clientY)\r\n }\r\n\r\n // \u6307\u9488\u53EA\u662F\u4ECE\u5BB9\u5668\u632A\u8FDB\u5B50\u5143\u7D20\u65F6\u4E5F\u4F1A\u6765\u4E00\u6761 dragleave\uFF0C\u522B\u628A\u5B83\u5F53\u6210\u300C\u79BB\u5F00\u300D\u3002\r\n const onDragLeave = (event: DragEvent): void => {\r\n const to = event.relatedTarget as Node | null\r\n if (to !== null && el.contains(to)) return\r\n stopScroll()\r\n }\r\n\r\n const onEnd = (): void => stopScroll()\r\n\r\n el.addEventListener('dragover', onDragOver, true)\r\n el.addEventListener('dragleave', onDragLeave, true)\r\n el.addEventListener('drop', onEnd, true)\r\n // dragend \u53EA\u53D1\u7ED9\u62D6\u8D77\u5143\u7D20\uFF08\u53EF\u80FD\u5728\u522B\u7684\u5BB9\u5668\u91CC\uFF09\uFF0C\u6302 window \u6700\u7A33\u3002\r\n window.addEventListener('dragend', onEnd)\r\n // \u6307\u9488\u5728\u8FB9\u7F18\u5E26\u91CC\u9759\u6B62\u65F6\u6D4F\u89C8\u5668\u4ECD\u4F1A\u7ED9\u96F6\u661F\u7684 dragover\uFF1B\u82E5\u4E00\u6B21\u90FD\u6CA1\u6709\uFF08\u79BB\u5F00\r\n // \u5BB9\u5668\u524D\u7684\u6700\u540E\u4E00\u6B21\uFF09\uFF0C\u4E0B\u4E00\u6B21\u62D6\u62FD\u5F00\u59CB\u524D\u628A\u72B6\u6001\u6E05\u5E72\u51C0\u3002\r\n window.addEventListener('dragstart', onEnd)\r\n\r\n return () => {\r\n stopScroll()\r\n el.removeEventListener('dragover', onDragOver, true)\r\n el.removeEventListener('dragleave', onDragLeave, true)\r\n el.removeEventListener('drop', onEnd, true)\r\n window.removeEventListener('dragend', onEnd)\r\n window.removeEventListener('dragstart', onEnd)\r\n // pendingY \u53EA\u5728\u62D6\u62FD\u671F\u95F4\u6709\u610F\u4E49\uFF1B\u9000\u51FA\u65F6\u6E05\u6389\uFF0C\u907F\u514D\u9648\u65E7\u5F15\u7528\u3002\r\n pendingY = null\r\n }\r\n }, [ref])\r\n}\r\n", "/**\n * ToolsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u5DE6\u680F\uFF08\u5DE5\u5177\u6A21\u5F0F\uFF09\u3002\n *\n * \u9876\u90E8\u4E09\u4E2A\u9636\u6BB5 Tab\uFF08\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF09\uFF0C\u4E0E\u53F3\u680F\u9884\u89C8\u7684\u9636\u6BB5\u6309\u94AE\n * **\u8054\u52A8**\u3002\u6BCF\u4E2A\u9636\u6BB5\u5217\u51FA\u8BE5\u9636\u6BB5\u8FDB\u5165\u8FC7\u6EE4\u7684\u76EE\u5F55 \u222A \u7528\u6237\u52A0\u56DE\u7684\u5DE5\u5177\uFF1A\u52FE\u9009\u6846 =\n * \u8BE5\u9636\u6BB5\u5BF9\u6A21\u578B\u53EF\u89C1\uFF1B\u9690\u85CF\u540E\u4ECD\u5728\u5217\u8868\u53EF\u53CD\u9009\u3002\u4E09\u4EFD\u540D\u5355\u4E92\u4E0D\u7EE7\u627F\u3002\n *\n * \u6761\u76EE\u8EAB\u4EFD = `{name, source}`\uFF1A\u540C\u540D\u4E0D\u540C\u6E90\u7684\u5DE5\u5177\u5206\u884C\u3001\u6309 name+source \u64CD\u4F5C\uFF1B\n * \u670D\u52A1\u7AEF\u63D0\u4F9B\u7684 `keySuffix`\uFF08\u5982 live / preset \u4E24\u6001\uFF09\u53EA\u7528\u4E8E\u533A\u5206\u5C55\u793A\u884C\u3002\n *\n * \u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 = \u53EF\u89C1 / \u5DF2\u505C\u7528 = \u9690\u85CF\uFF09\uFF0C\u53EA\u7EDF\u8BA1\u5F53\u524D\n * \u9636\u6BB5\u3002\u5B8C\u6574\u76EE\u5F55\u6309\u6765\u6E90\u5206\u7EC4\u3001\u540C\u4E00 name+source \u7684\u591A\u72B6\u6001\u805A\u5408\u5C55\u793A\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport {\n PHASE_KEYS,\n PHASE_LABEL_KEY,\n SOURCE_KIND_ORDER,\n SOURCE_LABEL_KEY,\n entryKey,\n normalizeEntry,\n sameEntry,\n sourceKey,\n type BaseTool,\n type Config,\n type EntryRef,\n type EntrySource,\n type Inventory,\n type PhaseKey,\n type PhaseViews,\n type ToolPromptSection,\n type ToolState,\n} from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { toolFieldOf } from './phase-ops.ts'\nimport { withPhaseAdd, withPhaseExclude } from './presets.ts'\nimport { acceptsDrop, beginDrag, finishDrag, payloadOf, setPhaseDropHandler, type DragPayload } from './dnd.ts'\nimport { useDragAutoScroll } from './drag-scroll.ts'\nimport { s } from './styles.ts'\nimport type { TriState } from './SectionsPane.tsx'\nimport { buildMaskedPool, toolStateOf } from './tool-pool.ts'\n\n/** \u4E00\u6B21\u52A0\u56DE\u64CD\u4F5C\u7684\u53CD\u9988\uFF08ok = \u5DF2\u5199\u5165\uFF0Cwarn = \u4EC0\u4E48\u90FD\u6CA1\u6539\u5E76\u8BF4\u660E\u539F\u56E0\uFF09\u3002 */\ntype Notice = { kind: 'ok' | 'warn'; text: string }\n\n/** \u5DE5\u5177\u884C\uFF1A\u6761\u76EE\u8EAB\u4EFD + \u5C55\u793A / \u72B6\u6001\u5B57\u6BB5\u3002 */\ntype ToolRow = EntryRef & {\n description: string\n promptSections: ToolPromptSection[]\n hidden: boolean\n added: boolean\n state?: ToolState\n scope?: 'agent' | 'executor'\n keySuffix?: string\n}\n\n/** \u6E05\u5355\u4E0E\u9884\u89C8\u4E24\u4E2A\u6765\u6E90\u7684\u5DE5\u5177\u6761\u76EE\uFF08description \u53EF\u80FD\u7F3A\u5E2D\uFF09\u3002 */\ntype ToolLike = EntryRef & {\n description?: string\n promptSections?: ToolPromptSection[]\n hidden?: boolean\n state?: ToolState\n scope?: 'agent' | 'executor'\n maskedByPlugin?: boolean\n maskedByOwnPlugin?: boolean\n keySuffix?: string\n}\n\nfunction entryOf(tool: EntryRef | string): EntryRef | undefined {\n return normalizeEntry(tool)\n}\n\nfunction entryOfPayload(payload: DragPayload): EntryRef {\n return {\n name: payload.name,\n ...(payload.source === undefined ? {} : { source: payload.source }),\n }\n}\n\nfunction listHas(list: EntryRef[], entry: EntryRef): boolean {\n return list.some((item) => sameEntry(item, entry))\n}\n\nfunction listWithout(list: EntryRef[], entry: EntryRef): EntryRef[] {\n return list.filter((item) => !sameEntry(item, entry))\n}\n\nfunction listWith(list: EntryRef[], entry: EntryRef): EntryRef[] {\n if (listHas(list, entry)) return list\n return [...list, { name: entry.name, ...(entry.source === undefined ? {} : { source: entry.source }) }]\n}\n\nexport function ToolsPane({ cfg, inv, phases, phase, syncAll, t, write, onOpenSection }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseKey\n /** \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u9690\u85CF / \u663E\u793A\u4E0E\u52A0\u56DE\u5BF9\u4E09\u4E2A\u9636\u6BB5\u4E00\u8D77\u751F\u6548\uFF08\u53EA\u4F5C\u7528\u4E8E\u540C name+source \u6761\u76EE\uFF09\u3002 */\n syncAll?: boolean\n t: Translate\n write: (field: 'replacements' | 'inject' | 'tools', value: unknown) => void\n /** \u4ECE\u5DE5\u5177\u884C\u8DF3\u5230\u63D0\u793A\u8BCD\u9875\u7684\u5BF9\u5E94 tool:* \u6BB5\uFF08\u53EF\u9009\uFF1B\u4E0D\u4F20\u65F6\u53EA\u663E\u793A\u63D0\u793A\u8BCD\u6BB5\u6807\u7B7E\uFF09\u3002 */\n onOpenSection?: (entry: EntryRef) => void\n}): ReactElement {\n const [filter, setFilter] = useState<TriState>('all')\n const [notice, setNotice] = useState<Notice | null>(null)\n // \u62D6\u62FD\uFF1A\u6B63\u5728\u62D6\u7684\u884C\u952E\uFF0C\u6295\u653E\u4F4D\u7F6E\u6807\u8BB0\uFF08\u884C\u952E / `list` / `pool`\uFF09\u3002\n const [dragName, setDragName] = useState<string | null>(null)\n const [dropMark, setDropMark] = useState<string | null>(null)\n // \u5217\u8868\u6EDA\u52A8\u5BB9\u5668\uFF1A\u62D6\u5230\u4E0A\u4E0B\u8FB9\u7F18\u65F6\u81EA\u52A8\u6EDA\uFF08\u957F\u5217\u8868\u91CC\u624B\u62D6\u591F\u4E0D\u5230\u89C6\u53E3\u5916\u7684\u4F4D\u7F6E\uFF09\u3002\n const scrollRef = useRef<HTMLDivElement | null>(null)\n useDragAutoScroll(scrollRef)\n\n // \u67D0\u9636\u6BB5\u81EA\u5DF1\u7684\u9ED1\u540D\u5355 / \u52A0\u56DE\u540D\u5355\uFF08\u6309 PHASES \u7684 toolField \u6D3E\u751F\uFF0C\u4E09\u4EFD\u4E92\u4E0D\u7EE7\u627F\uFF09\u3002\n const excludeOf = (key: PhaseKey): EntryRef[] => {\n const tools = cfg.tools ?? {}\n const field = toolFieldOf(key)\n const list = field === 'static' ? tools.exclude : tools[field]?.exclude\n return list ?? []\n }\n const addOf = (key: PhaseKey): EntryRef[] => {\n const tools = cfg.tools ?? {}\n const field = toolFieldOf(key)\n const list = field === 'static' ? tools.add : tools[field]?.add\n return list ?? []\n }\n // \u4E00\u6B21\u5199\u5165\u540C\u65F6\u843D\u8BE5\u9636\u6BB5\u7684 exclude \u4E0E add\uFF08\u5728\u540C\u4E00\u4EFD tools \u4E0A\u53E0\u5B8C\u518D\u5199\u4E00\u6B21\uFF09\u3002\n const writeLists = (key: PhaseKey, exclude: EntryRef[], add: EntryRef[]): void => {\n write('tools', withPhaseAdd(withPhaseExclude(cfg.tools ?? {}, key, exclude), key, add))\n }\n\n // \u4E09\u6001\u540C\u6B65\u5199\u5165\uFF08syncAll \u5F00\u542F\u65F6\uFF09\uFF1A\u5BF9\u4E09\u4E2A\u9636\u6BB5\u5404\u81EA\u7684 exclude / add \u540D\u5355\u505A\u540C\u4E00\n // \u53D8\u6362\uFF0C\u53E0\u8FDB\u4E00\u4EFD tools \u540E\u4E00\u6B21\u5199\u5165\u3002\u53D8\u6362\u8FD4\u56DE null = \u8BE5\u9636\u6BB5\u65E0\u53EF\u505A\u7684\u6539\u52A8\uFF0C\u8DF3\u8FC7\u3002\n const writeSynced = (\n apply: (key: PhaseKey, exclude: EntryRef[], add: EntryRef[]) => { exclude: EntryRef[]; add: EntryRef[] } | null,\n ): void => {\n let tools = cfg.tools\n let changed = false\n for (const key of PHASE_KEYS) {\n const next = apply(key, excludeOf(key), addOf(key))\n if (next === null) continue\n changed = true\n tools = withPhaseExclude(withPhaseAdd(tools, key, next.add), key, next.exclude)\n }\n if (changed) write('tools', tools)\n }\n\n // \u8BE5\u9636\u6BB5\u7684\u88C5\u914D\u76EE\u5F55\uFF08\u8FDB\u5165\u672C\u63D2\u4EF6\u8FC7\u6EE4\u7684\u5DE5\u5177\u539F\u6587\uFF09\u4E0E\u8BE5\u9884\u8BBE\u6CE8\u518C\u8868\uFF08\u80FD\u52A0\u56DE\u7684\u6765\u6E90\uFF09\u3002\n const catalogOf = (key: PhaseKey): BaseTool[] => phases?.[key]?.catalogTools ?? phases?.[key]?.baseTools ?? []\n const isInCatalog = (key: PhaseKey, entry: EntryRef): boolean => catalogOf(key).some((tool) => sameEntry(tool, entry))\n // \u6CE8\u518C\u8868\u4E09\u4E2A\u9636\u6BB5\u5171\u4EAB\u540C\u4E00 scope\uFF1A\u53D6\u4E09\u9636\u6BB5\u5E76\u96C6\uFF08\u4E0D\u662F\u7B2C\u4E00\u4E2A\u975E\u7A7A\uFF09\uFF0C\u540C\u540D\u540C\u6E90\u53BB\u91CD\u3002\n const registry: EntryRef[] = (() => {\n const out: EntryRef[] = []\n const seen = new Set<string>()\n for (const key of PHASE_KEYS) {\n for (const value of phases?.[key]?.registryTools ?? []) {\n const entry = entryOf(value)\n if (entry === undefined) continue\n const identity = entryKey(entry)\n if (seen.has(identity)) continue\n seen.add(identity)\n out.push(entry)\n }\n }\n return out\n })()\n /** \u6CE8\u518C\u8868\u91CC\u662F\u5426\u6709\u8BE5\u5DE5\u5177\uFF1A\u670D\u52A1\u7AEF\u4ECD\u53EA\u56DE\u4F20\u5DE5\u5177\u540D\uFF08\u65E0 source\uFF09\u65F6\u6309\u540D\u5B57\u515C\u5E95\u5339\u914D\u3002 */\n const inRegistry = (entry: EntryRef): boolean =>\n registry.some((candidate) => sameEntry(candidate, entry) || (candidate.source === undefined && candidate.name === entry.name))\n\n const stateOf = (tool: ToolLike): ToolState => toolStateOf(tool)\n /** \u53EF\u5728\u9636\u6BB5\u91CC\u52FE\u9009\u5F00\u5173\uFF1A\u666E\u901A\u9884\u8BBE\u5DE5\u5177 + agent \u4F5C\u7528\u57DF\u5DE5\u5177\uFF08\u540E\u8005\u9760\u88C5\u914D\u540E\u8FC7\u6EE4 tools \u5B9E\u73B0\u9690\u85CF\uFF09\u3002 */\n const isToggleable = (tool: ToolLike): boolean => {\n const state = stateOf(tool)\n return state === 'controllable' || state === 'locked-agent'\n }\n /** \u6267\u884C\u5668\u5305\u88C5\uFF08\u5982 PTC run_code\uFF09\uFF1A\u6A21\u578B\u53EF\u89C1\u4F46\u672C\u63D2\u4EF6\u4E0D\u6309\u9636\u6BB5\u5220\uFF0C\u9501\u5B9A\u3002 */\n const isLockedExec = (tool: ToolLike): boolean => stateOf(tool) === 'locked-executor'\n // \u628A\u4E00\u4E2A\u5DE5\u5177\u653E\u8FDB\u67D0\u9636\u6BB5\uFF08\u590D\u5236\u8BED\u4E49\uFF0C\u7EDD\u4E0D\u6539\u52A8\u5176\u5B83\u9636\u6BB5\uFF09\uFF1A\u4E0D\u5728\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u5C31\n // \u52A0\u8FDB add \u540D\u5355\uFF1Bhidden \u51B3\u5B9A\u5B83\u5728\u76EE\u6807\u9636\u6BB5\u662F\u53EF\u89C1\u8FD8\u662F\u9690\u85CF\u3002\n const addToPhase = (key: PhaseKey, entry: EntryRef, hidden: boolean): void => {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (!isInCatalog(key, entry) && !listHas(add, entry)) add = listWith(add, entry)\n if (hidden) {\n exclude = listHas(exclude, entry) ? exclude : listWith(exclude, entry)\n } else {\n const exact = listWithout(exclude, entry)\n // \u89E3\u9664\u5C4F\u853D\u65F6\u517C\u5BB9\u65E7 source id / \u65E7\u6765\u6E90\u5199\u6CD5\uFF1A\u6CA1\u6709\u7CBE\u786E\u547D\u4E2D\u5C31\u6309\u5DE5\u5177\u540D\u6E05\u6389\n // \u8BE5\u9636\u6BB5\u7684 exclude\uFF0C\u907F\u514D\u201CUI \u5DF2\u53D6\u6D88\u52FE\u9009\u4F46\u540E\u7AEF\u4ECD\u6309\u65E7\u6761\u76EE\u9690\u85CF\u201D\u3002\n exclude = exact.length === exclude.length\n ? exclude.filter((item) => normalizeEntry(item)?.name !== entry.name)\n : exact\n }\n writeLists(key, exclude, add)\n }\n\n /** \u67D0\u4E2A\u5DE5\u5177\u5DF2\u7531\u670D\u52A1\u7AEF inventory / \u4E09\u9636\u6BB5\u89C6\u56FE\u5E26\u51FA\u7684\u63D0\u793A\u8BCD\u6BB5\u5143\u6570\u636E\u3002 */\n const promptSectionsOfName = (name: string): ToolPromptSection[] => {\n for (const tool of inv?.tools ?? []) {\n if (tool.name === name && Array.isArray(tool.promptSections)) return tool.promptSections\n }\n for (const key of PHASE_KEYS) {\n const view = phases?.[key]\n for (const tool of [...(view?.baseTools ?? []), ...(view?.catalogTools ?? [])]) {\n if (tool.name === name && Array.isArray(tool.promptSections)) return tool.promptSections\n }\n }\n return []\n }\n\n // \u9636\u6BB5\u5206\u7EC4\u91CC\u7684\u884C = \u8BE5\u9636\u6BB5\u8FDB\u5165\u8FC7\u6EE4\u7684\u76EE\u5F55 \u222A \u5DF2\u52A0\u56DE\uFF08\u4F46\u5C1A\u672A\u51FA\u73B0\u5728\u88C5\u914D\u91CC\uFF09\u7684\u5DE5\u5177\u3002\n const rowsOf = (key: PhaseKey): ToolRow[] => {\n const catalog = catalogOf(key)\n .filter((tool) => isToggleable(tool) || isLockedExec(tool))\n .map((tool) => ({\n name: tool.name,\n ...(tool.source === undefined ? {} : { source: tool.source }),\n description: tool.description ?? '',\n promptSections: tool.promptSections ?? [],\n hidden: isLockedExec(tool) ? false : tool.hidden === true,\n added: false,\n state: stateOf(tool),\n ...(tool.scope === 'agent' || tool.scope === 'executor' ? { scope: tool.scope } : {}),\n ...(tool.keySuffix === undefined ? {} : { keySuffix: tool.keySuffix }),\n }))\n const added = addOf(key)\n .filter((entry) => !catalog.some((row) => sameEntry(row, entry)))\n .map((entry) => ({\n name: entry.name,\n ...(entry.source === undefined ? {} : { source: entry.source }),\n description: '',\n promptSections: promptSectionsOfName(entry.name),\n hidden: false,\n added: true,\n state: 'controllable' as ToolState,\n }))\n return [...catalog, ...added]\n }\n\n // \u52FE\u9009 / \u53D6\u6D88\u52FE\u9009\uFF1A\u53EA\u52A8\u8FD9\u4E00\u4E2A\u5DE5\u5177\uFF08name+source\uFF09\u5728\u672C\u9636\u6BB5\u7684\u53EF\u89C1\u6027\u3002\n const toggleHide = (key: PhaseKey, row: ToolRow, currentlyHidden: boolean): void => {\n if (syncAll) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u663E\u793A = \u5404\u9636\u6BB5 exclude \u79FB\u9664\uFF08\u7EDD\u4E0D\u987A\u624B\u628A\u6CA1\u52A0\u56DE\u7684\u5DE5\u5177\u52A0\u8FDB add\uFF09\uFF1B\n // \u9690\u85CF = \u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\u3001\u539F\u751F\u7684\u8FDB\u8BE5\u9636\u6BB5 exclude\u3002\n writeSynced((_key, exclude, add) => {\n if (currentlyHidden) return { exclude: listWithout(exclude, row), add }\n if (listHas(add, row)) return { exclude, add: listWithout(add, row) }\n return listHas(exclude, row) ? null : { exclude: listWith(exclude, row), add }\n })\n setNotice(null)\n return\n }\n if (currentlyHidden) {\n addToPhase(key, row, false)\n } else {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (listHas(add, row)) add = listWithout(add, row)\n else if (!listHas(exclude, row)) exclude = listWith(exclude, row)\n writeLists(key, exclude, add)\n }\n setNotice(null)\n }\n\n // \u4ECE\u6C60\u52A0\u5165\u67D0\u9636\u6BB5\u3002\u6CE8\u518C\u8868\u91CC\u6CA1\u6709\u7684\u52A0\u4E0D\u8FDB\u6765\u3002\n const addFromPool = (key: PhaseKey, entry: EntryRef): void => {\n if (!isInCatalog(key, entry) && !inRegistry(entry)) {\n setNotice({ kind: 'warn', text: t('toolNotInRegistry', { name: entry.name }) })\n return\n }\n if (syncAll) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u4E09\u4E2A\u9636\u6BB5\u90FD\u8BA9\u5B83\u51FA\u73B0\uFF08\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u6CA1\u6709\u7684\u5C31\u5199\u8FDB\u5404\u81EA\u7684 add \u540D\u5355\uFF09\u3002\n writeSynced((phaseKey, exclude, add) => ({\n exclude: listWithout(exclude, entry),\n add: !isInCatalog(phaseKey, entry) && !listHas(add, entry) ? listWith(add, entry) : add,\n }))\n setNotice({ kind: 'ok', text: t('toolSyncShown', { name: entry.name }) })\n return\n }\n addToPhase(key, entry, false)\n setNotice({\n kind: 'ok',\n text: isInCatalog(key, entry)\n ? t('toolShown', { name: entry.name, to: stageLabel(key) })\n : t('toolAdded', { name: entry.name, phase: stageLabel(key) }),\n })\n }\n\n // \u2500\u2500 \u62D6\u62FD\u843D\u5730\uFF08\u624B\u52BF\u5B9A\u4E49\u89C1 dnd.ts\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u4ECE\u67D0\u9636\u6BB5\u62FF\u6389\u4E00\u4E2A\u5DE5\u5177\uFF1A\u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\uFF0C\u539F\u751F\u5DE5\u5177\u5219\u8FDB\u8BE5\u9636\u6BB5\u9ED1\u540D\u5355\u3002 */\n const removeFromPhase = (key: PhaseKey, entry: EntryRef): void => {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (listHas(add, entry)) add = listWithout(add, entry)\n else if (!listHas(exclude, entry)) exclude = listWith(exclude, entry)\n writeLists(key, exclude, add)\n setNotice({ kind: 'ok', text: t('toolRemovedFromPhase', { name: entry.name, from: stageLabel(key) }) })\n }\n\n /** \u4E00\u6B21\u300C\u653E\u8FDB\u76EE\u6807\u9636\u6BB5\u300D\u7684\u843D\u5730\u3002 */\n const dropToolInto = (key: PhaseKey, payload: DragPayload): void => {\n if (payload.kind !== 'tool' || payload.from === key) return\n const entry = entryOfPayload(payload)\n if (payload.from === 'pool') { addFromPool(key, entry); return }\n addToPhase(key, entry, payload.hidden === true)\n setNotice({ kind: 'ok', text: t('toolCopied', { name: entry.name, to: stageLabel(key), from: stageLabel(payload.from) }) })\n }\n\n /** \u884C / \u5217\u8868\u4E0A\u7684\u6295\u653E\uFF1A\u628A\u624B\u91CC\u7684\u5DE5\u5177\u653E\u8FDB\u672C\u9636\u6BB5\u3002 */\n const dropOnPane = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n dropToolInto(phase, payload)\n }\n\n /** \u6C60\u4E0A\u7684\u6295\u653E\uFF1A\u628A\u884C\u4ECE\u672C\u9636\u6BB5\u62FF\u6389\u3002 */\n const dropOnPool = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n if (payload.from === phase) removeFromPhase(phase, entryOfPayload(payload))\n }\n\n // \u5934\u90E8\u9636\u6BB5 Tab \u4E0A\u7684\u6295\u653E\uFF1A\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\u3002\n useEffect(() => {\n setPhaseDropHandler((key, payload) => dropToolInto(key, payload))\n return () => setPhaseDropHandler(null)\n })\n\n const stageLabel = (key: PhaseKey): string => t(PHASE_LABEL_KEY[key])\n\n // \u5F53\u524D\u9636\u6BB5\u7684\u884C + \u4E09\u6001\u8FC7\u6EE4\uFF08\u5DF2\u542F\u7528 = \u5BF9\u6A21\u578B\u53EF\u89C1\uFF09\u3002\n const rows = rowsOf(phase)\n const onCount = rows.filter((row) => !row.hidden).length\n const offCount = rows.length - onCount\n const rowVisible = (row: ToolRow): boolean =>\n filter === 'all' || (filter === 'on' ? !row.hidden : row.hidden)\n\n const renderRow = (row: ToolRow): ReactElement | null => {\n if (!rowVisible(row)) return null\n const locked = row.state === 'locked-executor'\n const identity = `${entryKey(row)}\\u0000${row.keySuffix ?? ''}`\n const promptSectionEmpty = (section: ToolPromptSection): boolean => {\n if (section.empty === true) return true\n for (const key of PHASE_KEYS) {\n const base = phases?.[key]?.baseSections ?? []\n const match = base.find((candidate) => sameEntry(candidate, section))\n if (match !== undefined && String(match.text ?? '').length === 0) return true\n }\n return false\n }\n const promptSectionList = (): ReactElement | null => {\n if (row.state === 'locked-executor') return null\n if (row.promptSections.length === 0) {\n return h('div', { style: { ...s.muted, fontSize: '11px' } },\n `${t('toolPromptSections')}: ${t('toolPromptNone')}`)\n }\n return h('div', {\n style: { ...s.muted, fontSize: '11px', display: 'flex', alignItems: 'center', gap: '4px', flexWrap: 'wrap' },\n }, [\n h('span', {}, `${t('toolPromptSections')}:`),\n ...row.promptSections.map((section) => {\n const label = `${section.name}${promptSectionEmpty(section) ? ` ${t('empty')}` : ''}`\n const key = `${section.name}\\u0000${sourceKey(section.source)}`\n return onOpenSection === undefined\n ? h('span', {\n key,\n style: s.badgeSystem,\n title: t('toolPromptHint'),\n }, label)\n : h('button', {\n key,\n style: s.mini,\n title: t('toolPromptHint'),\n onClick: () => onOpenSection({ name: section.name, ...(section.source === undefined ? {} : { source: section.source }) }),\n }, label)\n }),\n ])\n }\n return h('div', {\n key: identity,\n style: {\n ...s.row,\n ...(row.hidden ? s.rowBlocked : {}),\n ...(dropMark === identity ? s.dropZoneActive : {}),\n ...(dragName === identity ? s.dragging : {}),\n },\n title: row.description.slice(0, 120),\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'tool')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(identity)\n },\n onDrop: dropOnPane,\n }, [\n // \u62D6\u62FD\u6293\u624B\uFF1A\u6574\u884C draggable \u4F1A\u628A\u52FE\u9009\u6846\u7684\u624B\u52BF\u4E00\u8D77\u5403\u6389\u3002\n h('span', {\n draggable: !locked,\n title: locked ? t('toolExecutorScopedHint') : t('drag'),\n style: s.dragHandle,\n onDragStart: (event: ReactDragEvent) => {\n setDragName(identity)\n beginDrag(event, {\n kind: 'tool',\n name: row.name,\n ...(row.source === undefined ? {} : { source: row.source }),\n ...(row.keySuffix === undefined ? {} : { keySuffix: row.keySuffix }),\n from: phase,\n hidden: row.hidden,\n })\n },\n onDragEnd: () => { setDragName(null); setDropMark(null); finishDrag() },\n }, '\u283F'),\n h('input', {\n type: 'checkbox',\n checked: locked ? true : !row.hidden,\n disabled: locked,\n onChange: () => toggleHide(phase, row, row.hidden),\n title: locked ? t('toolExecutorScopedHint') : row.hidden ? t('hiddenOn') : t('hiddenOff'),\n style: { margin: 0, cursor: locked ? 'not-allowed' : 'pointer', flex: 'none' },\n }),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n row.source === undefined ? null : h('span', { style: s.badgeSystem }, sourceLabel(row.source)),\n row.keySuffix === undefined ? null : h('span', { style: s.badgeSystem }, row.keySuffix),\n row.added ? h('span', { style: s.badgeCustom }, t('toolAddedTag')) : null,\n row.state === 'locked-agent' ? h('span', { style: s.badgeSystem, title: t('toolAgentScopedHint') }, t('toolAgentScoped')) : null,\n row.state === 'locked-executor' ? h('span', { style: s.badgeSystem, title: t('toolExecutorScopedHint') }, t('toolExecutorScoped')) : null,\n !locked && row.hidden ? h('span', { style: s.badgeBlocked }, t('hiddenOn')) : null,\n ]),\n row.description !== '' ? h('div', { style: s.preview }, `${t('toolDescriptionLabel')}: ${row.description.slice(0, 120)}`) : null,\n promptSectionList(),\n ]),\n ])\n }\n\n // \u300C\u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177\u300D\u6DFB\u52A0\u6C60\uFF1A\u53EA\u5217\u53EF\u5F00\u5173\u7684\u9884\u8BBE\u5DE5\u5177\uFF08\u6309 name+source \u5206\u884C\uFF09\u3002\n const allTools = (inv?.tools ?? [])\n .filter((tool) => isToggleable(tool))\n .map((tool) => ({\n name: tool.name,\n ...(tool.source === undefined ? {} : { source: tool.source }),\n description: tool.description ?? '',\n keySuffix: tool.keySuffix,\n }))\n\n // \u53EA\u8BFB\u300C\u5B8C\u6574\u76EE\u5F55 / \u5DF2\u906E\u853D\u300D\uFF1A\u88AB\u522B\u7684\u63D2\u4EF6\u906E\u853D / \u88AB\u672C\u63D2\u4EF6 MCP \u906E\u853D\u7684\u5DE5\u5177\u3002\n // \u6765\u6E90 = \u8DE8\u9884\u8BBE\u6C60 \u222A \u5F53\u524D\u9636\u6BB5\u5B8C\u6574\u57FA\u5EA7\uFF1B\u540C\u4E00 name+source \u7684\u591A\u72B6\u6001\u805A\u5408\u4E00\u884C\u3002\n type Agg = { entry: EntryRef; description: string; states: Set<ToolState> }\n const readOnly: Agg[] = buildMaskedPool([\n ...(inv?.tools ?? []),\n ...PHASE_KEYS.flatMap((key) => catalogOf(key)),\n ])\n // \u6309\u6765\u6E90\u5206\u7EC4\uFF08global / preset / workspace / agent / executor / \u672A\u77E5\uFF09\u3002\n const readOnlyGroups = (() => {\n const groups = new Map<string, { source?: EntrySource; rows: Agg[] }>()\n for (const row of readOnly) {\n const key = sourceKey(row.entry.source)\n const group = groups.get(key)\n if (group === undefined) groups.set(key, { ...(row.entry.source === undefined ? {} : { source: row.entry.source }), rows: [row] })\n else group.rows.push(row)\n }\n return [...groups.values()].sort((left, right) => {\n const leftKind = left.source?.kind\n const rightKind = right.source?.kind\n const leftRank = leftKind === undefined ? SOURCE_KIND_ORDER.length : SOURCE_KIND_ORDER.indexOf(leftKind)\n const rightRank = rightKind === undefined ? SOURCE_KIND_ORDER.length : SOURCE_KIND_ORDER.indexOf(rightKind)\n if (leftRank !== rightRank) return leftRank - rightRank\n return String(left.source?.id ?? '').localeCompare(String(right.source?.id ?? ''))\n })\n })()\n\n const sourceLabel = (source?: EntrySource): string => {\n if (source === undefined) return t('sourceUnknown')\n const label = t(SOURCE_LABEL_KEY[source.kind] ?? 'sourceUnknown')\n return source.id === undefined ? label : `${label} \u00B7 ${source.id}`\n }\n const stateBadge = (state: ToolState): ReactElement => {\n // \u53EA\u8BFB\u5B8C\u6574\u76EE\u5F55\u805A\u5408\uFF1A\u5176\u5B83\u63D2\u4EF6 restrict / \u540C\u540D\u906E\u853D / \u672C\u63D2\u4EF6 MCP \u906E\u853D / agent \u4F5C\u7528\u57DF\u6CE8\u518C\u3002\n const own = state === 'masked-own'\n const shadow = state === 'masked-shadow'\n const agent = state === 'locked-agent'\n const hint = own ? t('toolMaskedByOwnPluginHint')\n : shadow ? t('toolMaskedByShadowHint')\n : agent ? t('toolAgentScopedHint') : t('toolMaskedByPluginHint')\n const label = own ? t('toolMaskedByOwnPlugin')\n : shadow ? t('toolMaskedByShadow')\n : agent ? t('toolAgentScoped') : t('toolMaskedByPlugin')\n return h('span', {\n style: s.badgeReplaced,\n title: hint,\n }, label)\n }\n\n return h('div', { style: s.colLeft }, [\n h('div', {\n ref: scrollRef,\n style: { ...s.colScroll, ...(dropMark === 'list' ? s.dropZone : {}) },\n // \u5217\u8868\u7A7A\u767D\u5904\u6295\u653E\uFF1A\u6C60\u91CC / \u522B\u7684\u9636\u6BB5\u62D6\u6765\u7684\u5DE5\u5177\u653E\u8FDB\u672C\u9636\u6BB5\u3002\n onDragOver: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool' || payload.from === phase) return\n event.preventDefault()\n setDropMark('list')\n },\n onDrop: dropOnPane,\n }, [\n h('div', { style: s.muted }, t('toolsFourHint')),\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.noticeWarn }, notice.text) : null,\n rows.map(renderRow),\n rows.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n // \u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177\uFF1A\u6CE8\u518C\u8868\u7684\u5B8C\u6574\u76EE\u5F55\uFF0C\u53EA\u8BFB\u6C60\uFF1B\u62D6\u5165 / \u62D6\u51FA\u6539\u53D8\u9636\u6BB5\u540D\u5355\u3002\n h('details', {\n style: { ...s.injectBox, ...(dropMark === 'pool' ? s.dropZoneActive : {}) },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'tool')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark('pool')\n },\n onDrop: dropOnPool,\n }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } },\n `${t('allToolsTitle')} (${allTools.length})`),\n allTools.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n allTools.map((tool) => h('div', {\n key: `${entryKey(tool)}\\u0000${tool.keySuffix ?? ''}`,\n style: { ...s.row, opacity: 0.92 },\n draggable: true,\n title: t('dragHint'),\n onDragStart: (event: ReactDragEvent) => beginDrag(event, {\n kind: 'tool',\n name: tool.name,\n ...(tool.source === undefined ? {} : { source: tool.source }),\n ...(tool.keySuffix === undefined ? {} : { keySuffix: tool.keySuffix }),\n from: 'pool',\n }),\n onDragEnd: finishDrag,\n }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, tool.name),\n tool.source === undefined ? null : h('span', { style: s.badgeSystem }, sourceLabel(tool.source)),\n ]),\n tool.description !== '' ? h('div', { style: s.preview }, tool.description.slice(0, 120)) : null,\n ]),\n ])),\n ]),\n // \u53EA\u8BFB\u300C\u5B8C\u6574\u76EE\u5F55\u300D\uFF1A\u4E0D\u53EF\u63A7\u5DE5\u5177\u6309\u6765\u6E90\u5206\u7EC4\uFF0C\u540C\u4E00 name+source \u7684\u591A\u72B6\u6001\u805A\u5408\u4E00\u884C\u3002\n readOnly.length === 0 ? null : h('details', { style: s.injectBox }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } }, `${t('completeCatalogTitle')} (${readOnly.length})`),\n h('div', { style: s.muted }, t('completeCatalogHint')),\n readOnlyGroups.map((group) => h('div', { key: sourceKey(group.source) || 'unknown' }, [\n h('div', { style: { ...s.muted, marginTop: 6, fontWeight: 600 } }, sourceLabel(group.source)),\n group.rows.map((row) => h('div', {\n key: entryKey(row.entry),\n style: { ...s.row, opacity: 0.8 },\n }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.entry.name),\n ...[...row.states].map((state) => stateBadge(state)),\n ]),\n row.description !== '' ? h('div', { style: s.preview }, row.description.slice(0, 120)) : null,\n ]),\n ])),\n ])),\n ]),\n ]),\n // \u5DE6\u680F\u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 = \u53EF\u89C1 / \u5DF2\u505C\u7528 = \u9690\u85CF\uFF09\u3002\n h('div', { style: s.colFoot }, [\n h('div', { style: s.seg }, [\n h('button', { style: filter === 'all' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('all') },\n `${t('filterAll')} ${rows.length}`),\n h('button', { style: filter === 'on' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('on') },\n `${t('filterOn')} ${onCount}`),\n h('button', { style: filter === 'off' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('off') },\n `${t('filterOff')} ${offCount}`),\n ]),\n ]),\n ])\n}\n", "import { entryKey, normalizeEntry, type EntryRef, type ToolState } from './types.ts'\n\nexport type ToolPoolLike = EntryRef & {\n description?: string\n state?: ToolState\n scope?: 'agent' | 'executor'\n maskedByPlugin?: boolean\n maskedByOwnPlugin?: boolean\n maskedByShadow?: boolean\n}\n\nexport type MaskedPoolRow = {\n entry: EntryRef\n description: string\n states: Set<ToolState>\n}\n\nexport function toolStateOf(tool: ToolPoolLike): ToolState {\n return tool.state\n ?? (tool.scope === 'agent' ? 'locked-agent'\n : tool.scope === 'executor' ? 'locked-executor'\n : tool.maskedByOwnPlugin === true ? 'masked-own'\n : tool.maskedByShadow === true ? 'masked-shadow'\n : tool.maskedByPlugin === true ? 'masked-plugin'\n : 'controllable')\n}\n\n/** \u53EA\u8BFB\u300C\u5B8C\u6574\u76EE\u5F55 / \u5DF2\u906E\u853D\u300D\u6C60\uFF1A\u4FDD\u7559 masked \u884C\uFF08\u542B\u540C\u540D\u906E\u853D\uFF09\u4E0E agent \u4F5C\u7528\u57DF\u6CE8\u518C\u884C\uFF1B\n * \u540C\u540D base \u884C\u4E0D\u80FD\u628A\u5B83\u8FC7\u6EE4\u6389\u3002agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684\u6A21\u578B\u53EF\u89C1\u3001\u4F46\u672C\u63D2\u4EF6\u65E0\u6CD5\u7528 restrict\n * \u53CD\u5F00\uFF0C\u6309\u300C\u4F1A\u8BDD\u7EA7\u300D\u5982\u5B9E\u5217\u51FA\uFF08\u4E0D\u4F2A\u79F0\u906E\u853D\uFF09\u3002 */\nexport function buildMaskedPool(tools: readonly ToolPoolLike[]): MaskedPoolRow[] {\n const map = new Map<string, MaskedPoolRow>()\n for (const tool of tools) {\n if (tool.name === '') continue\n const state = toolStateOf(tool)\n if (state !== 'masked-plugin' && state !== 'masked-own' && state !== 'masked-shadow'\n && state !== 'locked-agent') continue\n const entry = normalizeEntry(tool)\n if (entry === undefined) continue\n const identity = entryKey(entry)\n const existing = map.get(identity)\n if (existing === undefined) {\n map.set(identity, { entry, description: tool.description ?? '', states: new Set([state]) })\n } else {\n existing.states.add(state)\n if (existing.description === '' && (tool.description ?? '') !== '') existing.description = tool.description ?? ''\n }\n }\n return [...map.values()].sort((left, right) => left.entry.name.localeCompare(right.entry.name))\n}\n", "/**\n * PresetsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u9884\u8BBE\u6A21\u5F0F\uFF08\u5DE6\u53F3\u53CC\u680F\uFF09\u3002\n *\n * \u4E24\u79CD\u300C\u9884\u8BBE\u300D\u5206\u5F00\uFF0C\u5404\u5360\u4E00\u680F\uFF1A\n * - \u5DE6\u680F\uFF08PresetsPane\uFF09\uFF1A\u914D\u7F6E\u5FEB\u7167\u5E93 \u2014\u2014 \u4FDD\u5B58\u5F53\u524D\u914D\u7F6E / \u5BFC\u5165 / \u5E94\u7528 / \u5BFC\u51FA /\n * \u5220\u9664\u3002\u5FEB\u7167\u53EA\u6539\u672C\u63D2\u4EF6\u5185\u7684 presets \u5E93\uFF0C\u4E0D\u4F1A\u53D8\u6210\u53EF\u9009\u7684 agent \u9884\u8BBE\uFF1B\n * - \u53F3\u680F\uFF08SettingsPane\uFF09\uFF1A\u5B58\u4E3A agent \u9884\u8BBE\uFF08\u6574\u4F53 fork \u5F53\u524D\u7F16\u8F91\u76EE\u6807\u7684\u9884\u8BBE\u76EE\u5F55\uFF0C\n * \u5E76\u628A\u5F53\u524D\u5B9A\u5236\u5199\u8FDB\u5B83\u7684\u8986\u76D6\u9879\uFF09+ \u5168\u5C40\u8BBE\u7F6E\uFF08\u5F3A\u5236\u8986\u76D6\u5F00\u5173\u3001\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u3001\n * \u63D0\u793A\u8BCD\u53D8\u91CF\u53C2\u8003\u3001\u6062\u590D\u521D\u59CB\u72B6\u6001\uFF09\u3002\n *\n * \u5BFC\u5165\u5BFC\u51FA\u7ECF preset-io \u53CC\u7AEF\u9002\u914D\uFF1ATauri 2 \u684C\u9762\u8D70\u539F\u751F\u5BF9\u8BDD\u6846\uFF0CWeb \u8D70\u4E0B\u8F7D /\n * \u6587\u4EF6\u9009\u62E9\uFF1B\u6210\u529F / \u5931\u8D25 / \u53D6\u6D88\u90FD\u6709\u9762\u677F\u5185\u6D88\u606F\u6761\u63D0\u793A\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type ReactElement, type ChangeEvent } from 'react'\nimport { PHASE_KEYS, entryKey, type Config, type EntryRef, type Inventory, type PhaseViews, type Preset } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { addImportedPresets, applyPresetData, buildPresetData, genId, mergeSections, removePreset, type ConfigPatch } from './presets.ts'\nimport { decodePresetExport, exportPresetFile, importPresetFile } from './preset-io.ts'\nimport { s } from './styles.ts'\n\n/** \u4E00\u6B21\u6027\u64CD\u4F5C\u63D0\u793A\uFF1Akind \u51B3\u5B9A\u914D\u8272\uFF0C\u51E0\u79D2\u540E\u81EA\u52A8\u6D88\u5931\u3002 */\ninterface Notice {\n kind: 'ok' | 'error'\n text: string\n}\n\n/** 4 \u79D2\u81EA\u52A8\u6D88\u5931\u7684\u9762\u677F\u5185\u6D88\u606F\u6761\uFF08\u5DE6\u53F3\u4E24\u680F\u5171\u7528\u884C\u4E3A\uFF09\u3002 */\nfunction useNotice(): { notice: Notice | null; show: (kind: Notice['kind'], text: string) => void } {\n const [notice, setNotice] = useState<Notice | null>(null)\n const noticeTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n useEffect(() => () => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n }, [])\n const show = (kind: Notice['kind'], text: string): void => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n setNotice({ kind, text })\n noticeTimer.current = setTimeout(() => setNotice(null), 4000)\n }\n return { notice, show }\n}\n\nexport function PresetsPane({ cfg, inv, phases, t, writePatch, writeGlobal, writeGlobalBatch, envBlocklist, applyLevel, applyTargetName }: {\n cfg: Config\n inv: Inventory | null\n /** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\u3002 */\n phases: PhaseViews | null\n t: Translate\n /** \u5E94\u7528\u9884\u8BBE\uFF1A\u5B8C\u6574\u8865\u4E01\u4E00\u6B21\u843D\u76D8\uFF08\u663E\u5F0F\u610F\u56FE\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002 */\n writePatch: (patch: ConfigPatch) => Promise<boolean>\n /** \u9884\u8BBE\u5E93\u4E13\u7528\uFF1A\u6C38\u8FDC\u5199\u5728\u5168\u5C40\u5B57\u6BB5\uFF08presets / activePreset \u4E0D\u5206\u4F5C\u7528\u57DF\uFF09\u3002 */\n writeGlobal: (field: string, value: unknown) => Promise<boolean>\n /** \u591A\u4E2A\u5168\u5C40\u5B57\u6BB5\u4E00\u6B21\u5199\u5165\uFF08\u5BFC\u5165\u9884\u8BBE\u7684 envBlocklist + presets \u539F\u5B50\u5316\uFF09\u3002 */\n writeGlobalBatch: (fields: Record<string, unknown>) => Promise<boolean>\n /** \u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF08\u6C38\u8FDC\u9876\u5C42\u5B57\u6BB5\uFF0C\u4E0D\u5206\u4F5C\u7528\u57DF\uFF09\uFF1B\u5BFC\u51FA\u968F\u884C\u3001\u5BFC\u5165\u5E76\u96C6\u3002 */\n envBlocklist: string[]\n /** \u5E94\u7528\u76EE\u6807\u5C42\u7EA7\uFF1A\u9884\u8BBE\u7EA7 / \u5DE5\u4F5C\u533A\u7EA7\uFF08\u4E0E\u9876\u90E8\u7EDF\u4E00\u5207\u6362\u4E00\u81F4\uFF09\u3002 */\n applyLevel: 'preset' | 'workspace'\n /** \u5E94\u7528\u76EE\u6807\u663E\u793A\u540D\uFF08\u9884\u8BBE id \u6216\u5DE5\u4F5C\u533A cwd\uFF09\u3002 */\n applyTargetName?: string\n}): ReactElement {\n const presets = cfg.presets ?? []\n const [name, setName] = useState('')\n const { notice, show } = useNotice()\n // Web \u56DE\u9000\u7528\u7684\u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF08tauri \u4E0D\u53EF\u7528\u65F6\u624D\u70B9\u5B83\uFF09\u3002\n const fileRef = useRef<HTMLInputElement | null>(null)\n\n // \u6E05\u5355\u672C\u8EAB\u5DF2\u6309\u5F53\u524D\u9884\u8BBE scope \u8FC7\u6EE4\uFF08\u4E0D\u518D\u6709\u8DE8\u9884\u8BBE\u7D2F\u79EF\u6C60\uFF09\uFF0C\u76F4\u63A5\u7528\u6E05\u5355 + \u6CE8\u5165\n // \u6784\u5EFA\u5FEB\u7167\u6355\u83B7\u5B87\u5B99\uFF1B\u5C4F\u853D\u540D\u5355\u6309 name+source \u7684\u6761\u76EE\u8EAB\u4EFD\u5339\u914D\u3002\n const blockedKeys = new Set((cfg.sections ?? []).map((entry) => entryKey(entry)))\n const merged = mergeSections(inv, cfg, blockedKeys)\n // \u5E94\u7528\u65F6\u7684\u300C\u5F53\u524D\u7CFB\u7EDF\u6761\u76EE\u300D= \u6E05\u5355\u6761\u76EE \u222A \u4E09\u9636\u6BB5\u771F\u5B9E\u57FA\u5EA7\uFF08\u8FC7\u6EE4\u6389\u9884\u8BBE\u91CC\u6839\u672C\u6CA1\u6709\u7684\u6761\u76EE\uFF09\u3002\n // \u4F20 Map\uFF08\u952E \u2192 \u6761\u76EE\uFF09\u4EE5\u4FBF\u8865\u4E01\u91CC\u5199\u56DE\u5E26 source \u7684\u5B8C\u6574\u8EAB\u4EFD\u3002\n const currentEntries = new Map<string, EntryRef>()\n for (const section of merged) currentEntries.set(entryKey(section), { name: section.name, ...(section.source === undefined ? {} : { source: section.source }) })\n for (const key of PHASE_KEYS) {\n for (const section of phases?.[key]?.baseSections ?? []) {\n currentEntries.set(entryKey(section), { name: section.name, ...(section.source === undefined ? {} : { source: section.source }) })\n }\n }\n\n // \u628A\u5F53\u524D\u5B9A\u5236\u6355\u83B7\u4E3A\u65B0\u9884\u8BBE\uFF08\u5B8C\u6574\u5FEB\u7167\uFF09\u3002\u7EDD\u5BF9\u987A\u5E8F\u4F1A\u88AB\u8F6C\u6210\u76F8\u5BF9\u5F62\u5F0F\n //\uFF08\u6BCF\u6BB5\u8BB0\u5F55\u5B83\u5E94\u8DDF\u968F\u7684\u524D\u4E00\u6BB5\uFF09\uFF0C\u56E0\u6B64\u9884\u8BBE\u53EF\u4EE5\u8DE8\u4E0D\u540C\u63D0\u793A\u8BCD\u79FB\u690D\u3002\n const saveCurrent = async (): Promise<void> => {\n const presetName = name.trim() || `${t('preset')} ${presets.length + 1}`\n const data = buildPresetData(cfg, merged)\n const written = await writeGlobal('presets', [...presets, { id: genId(), name: presetName, data }])\n if (written) setName('')\n }\n\n // \u5E94\u7528\u9884\u8BBE\u3002\u8865\u4E01\u7531\u7EAF\u51FD\u6570\u52A9\u624B\u8BA1\u7B97\uFF08\u540C\u540D\u6BB5\u8986\u76D6\u3001\u5339\u914D\u4E0D\u4E0A\u7684\u8DF3\u8FC7\u3001\u4E0D\u5728\u9884\u8BBE\n // \u5217\u8868\u4E2D\u7684\u5F53\u524D\u6BB5\u88AB\u5C4F\u853D\u3001\u53EA\u6709\u9884\u8BBE\u7684\u300C\u6FC0\u6D3B\u6BB5\u300D\u88AB\u89E3\u9664\u5C4F\u853D\uFF09\u3002\u56DB\u4E2A\u5B9A\u5236\u5B57\u6BB5\u4EE5\n // \u4E00\u4E2A\u8865\u4E01\u5199\u5165\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1B\u5FEB\u7167\u5E93\uFF08presets / activePreset\uFF09\u6C38\u8FDC\u4FDD\u6301\u5728\u5168\u5C40\u3002\n const applyPreset = async (preset: Preset): Promise<void> => {\n const applied = await writePatch(applyPresetData(preset.data, cfg, currentEntries))\n if (!applied) return\n // \u5DE5\u4F5C\u533A\u7EA7\u5E94\u7528\u4E0D\u6539\u300C\u6D3B\u52A8\u9884\u8BBE\u300D\u8FD9\u4E2A\u5E93\u6982\u5FF5\uFF1B\u4EC5\u9884\u8BBE\u7EA7\u5E94\u7528\u65F6\u6807\u8BB0\u3002\n if (applyLevel !== 'workspace') await writeGlobal('activePreset', preset.id)\n }\n\n const deletePreset = async (id: string): Promise<void> => {\n const next = removePreset(presets, id, cfg.activePreset)\n const deleted = await writeGlobal('presets', next.presets)\n if (deleted && next.activeId === undefined && cfg.activePreset === id) await writeGlobal('activePreset', undefined)\n }\n\n // \u5BFC\u51FA\u4E00\u4E2A\u9884\u8BBE\uFF1ATauri \u684C\u9762\u8D70\u539F\u751F\u4FDD\u5B58\u5BF9\u8BDD\u6846\uFF0CWeb\uFF08\u6216 tauri \u63D2\u4EF6\u4E0D\u53EF\u7528\n // \u65F6\uFF09\u56DE\u9000\u4E3A\u4E0B\u8F7D\u3002saved/downloaded = \u6210\u529F\uFF1B\u7528\u6237\u53D6\u6D88\u5355\u72EC\u63D0\u793A\uFF0C\u4E0D\u7B97\u5931\u8D25\u3002\n const exportPreset = async (preset: Preset): Promise<void> => {\n try {\n const res = await exportPresetFile(preset, undefined, envBlocklist)\n if (res.ok) show('ok', t('exportOk'))\n else if (res.cancelled) show('ok', t('exportCancel'))\n else show('error', `${t('exportFail')}${res.message ? ': ' + res.message : ''}`)\n } catch (e) {\n show('error', `${t('exportFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // \u89E3\u6790\u5BFC\u5165\u6587\u672C \u2192 \u53BB\u91CD\u8FFD\u52A0 \u2192 \u63D0\u793A\u65B0\u589E\u6570\u91CF\u3002\u89E3\u6790\u5931\u8D25\u63D0\u793A\u9519\u8BEF\u3002\n // \u5355\u5BF9\u8C61\u683C\u5F0F\u7684\u6587\u4EF6\u8FD8\u53EF\u80FD\u968F\u884C\u643A\u5E26\u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF1A\u4E0E\u5F53\u524D\u540D\u5355\u5E76\u96C6\u5408\u5E76\u3002\n const importParsed = async (text: string): Promise<void> => {\n try {\n const parsed = decodePresetExport(text)\n const next = addImportedPresets(presets, parsed, genId)\n const added = next.length - presets.length\n const fileBlock = parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)\n && Array.isArray((parsed as { envBlocklist?: unknown }).envBlocklist)\n ? ((parsed as { envBlocklist?: unknown[] }).envBlocklist ?? []).filter((e): e is string => typeof e === 'string')\n : []\n const fresh = fileBlock.filter((e) => !envBlocklist.includes(e))\n const mergedNote = fresh.length > 0 ? t('importBlockMerge', { count: fresh.length }) : ''\n if (added <= 0) show('ok', t('importNone') + mergedNote)\n const fields: Record<string, unknown> = {}\n if (fresh.length > 0) fields.envBlocklist = [...envBlocklist, ...fresh]\n if (added > 0) fields.presets = next\n if (Object.keys(fields).length > 0) {\n const written = await writeGlobalBatch(fields)\n if (!written) return\n }\n if (added > 0) show('ok', `${t('importOk')} (+${added})${mergedNote}`)\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // \u5BFC\u5165\u9884\u8BBE\uFF1A\u4F18\u5148 Tauri \u539F\u751F\u6253\u5F00\u5BF9\u8BDD\u6846\uFF1Bunavailable\uFF08Web \u6216\u684C\u9762\u7AEF\u7F3A\n // dialog/fs \u63D2\u4EF6\uFF09\u65F6\u70B9\u9690\u85CF file input \u56DE\u9000\u5230\u6587\u4EF6\u9009\u62E9\u5668\u3002\u53D6\u6D88\u5355\u72EC\u63D0\u793A\u3002\n const importPreset = async (): Promise<void> => {\n try {\n const res = await importPresetFile()\n if (res.kind === 'text') { void importParsed(res.text); return }\n if (res.kind === 'cancelled') { show('ok', t('importCancel')); return }\n fileRef.current?.click()\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // Web \u56DE\u9000\u8DEF\u5F84\uFF1A\u6587\u4EF6\u9009\u62E9\u5668\u7684 onChange\u3002\u7528\u6237\u53D6\u6D88\uFF08\u65E0\u6587\u4EF6\uFF09\u9759\u9ED8\u8FD4\u56DE\u3002\n const onImportFile = (e: ChangeEvent<HTMLInputElement>): void => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => { void importParsed(String(reader.result)) }\n reader.onerror = () => show('error', t('importFail'))\n reader.readAsText(file)\n }\n\n return h('div', { style: s.colLeft }, [\n h('div', { style: s.colScroll }, [\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.error }, notice.text) : null,\n h('div', { style: s.groupHead }, t('libraryTitle')),\n h('div', { style: s.muted }, t(applyLevel === 'workspace' ? 'applyToWorkspace' : 'applyToPreset', { name: applyTargetName ?? '' })),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('presetName'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('button', { style: s.mini, onClick: saveCurrent }, t('save')),\n ]),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => { void importPreset() } }, t('import')),\n h('input', { ref: fileRef, type: 'file', accept: '.json,application/json', style: { display: 'none' }, onChange: onImportFile }),\n ]),\n ]),\n presets.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n presets.map((preset) => {\n const active = cfg.activePreset === preset.id\n return h('div', { key: preset.id, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, preset.name),\n active ? h('span', { style: s.badgeOk }, t('active')) : null,\n ]),\n ]),\n h('button', { style: s.mini, onClick: () => applyPreset(preset) }, t('apply')),\n h('button', { style: s.mini, onClick: () => { void exportPreset(preset) } }, t('export')),\n h('button', { style: s.mini, onClick: () => deletePreset(preset.id) }, t('delete')),\n ])\n }),\n ]),\n ])\n}\n\nexport function SettingsPane({ cfg, inv, t, writeGlobal, onReset, envBlocklist, target, onExportPreset, onImportPreset, onCleanupEmpty, onBackupAll, onRestoreAll, backingUp, restoring, cleaning }: {\n cfg: Config\n inv: Inventory | null\n t: Translate\n /** \u5168\u5C40\u5B57\u6BB5\u4E13\u7528\u5199\u901A\u9053\uFF08forceSections / envBlocklist\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002 */\n writeGlobal: (field: string, value: unknown) => void\n /** \u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u5173\u95ED forceSections\uFF08\u4E0E\u4E0D\u88C5\u63D2\u4EF6\u7B49\u6548\uFF09\u3002 */\n onReset: () => void\n envBlocklist: string[]\n /** \u5168\u91CF\u5907\u4EFD\uFF08\u6574\u5E93\uFF1A\u5168\u90E8\u63D0\u793A\u8BCD + \u5DE5\u5177 + \u5DE5\u4F5C\u533A + \u8D26\u672C\uFF09\u3002 */\n onBackupAll: () => void\n /** \u6062\u590D\u5907\u4EFD\uFF08\u4F20\u5165\u5907\u4EFD JSON \u6587\u672C\uFF09\u3002 */\n onRestoreAll: (text: string) => void\n /** \u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1B\u7F3A\u7701 = \u4E0D\u663E\u793A\u5355\u9884\u8BBE\u5BFC\u5165\u5BFC\u51FA\u3002 */\n target?: string\n onExportPreset: () => void\n onImportPreset: (text: string) => void\n onCleanupEmpty: () => void\n backingUp: boolean\n restoring: boolean\n cleaning: boolean\n}): ReactElement {\n // \u9ED1\u540D\u5355\u300C\u6DFB\u52A0\u300D\u8F93\u5165\u6846\u7684\u6682\u5B58\u503C\u3002\n const [blockInput, setBlockInput] = useState('')\n const backupFileRef = useRef<HTMLInputElement | null>(null)\n const presetFileRef = useRef<HTMLInputElement | null>(null)\n\n // \u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF1A\u5168\u5C40\u5B57\u6BB5\uFF0C\u6539\u52A8\u5373\u5199\uFF08\u4E0E forceSections \u540C\u4E00\u901A\u9053\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002\n const removeBlockEntry = (entry: string): void => {\n writeGlobal('envBlocklist', envBlocklist.filter((e) => e !== entry))\n }\n const addBlockEntry = (): void => {\n const entry = blockInput.trim()\n setBlockInput('')\n if (entry === '' || envBlocklist.includes(entry)) return\n writeGlobal('envBlocklist', [...envBlocklist, entry])\n }\n\n return h('div', { style: s.colRight }, [\n h('div', { style: { ...s.colRightScroll, display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(320px, 1fr))', gap: 12, alignContent: 'start' } }, [\n target === undefined ? null : h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('presetIoTitle')),\n h('div', { style: s.muted }, t('presetIoHint')),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: onExportPreset }, t('presetExport')),\n h('button', { style: s.mini, onClick: () => presetFileRef.current?.click() }, t('presetImport')),\n h('button', { style: s.mini, disabled: cleaning, onClick: onCleanupEmpty }, cleaning ? t('cleanupRunning') : t('cleanupEmpty')),\n h('input', {\n ref: presetFileRef,\n type: 'file',\n accept: '.json,application/json',\n style: { display: 'none' },\n onChange: (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => onImportPreset(String(reader.result))\n reader.readAsText(file)\n },\n }),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('backupTitle')),\n h('div', { style: s.muted }, t('backupHint')),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, disabled: backingUp, onClick: onBackupAll }, backingUp ? t('backupExportRunning') : t('backupExport')),\n h('button', { style: s.mini, disabled: restoring, onClick: () => backupFileRef.current?.click() }, restoring ? t('backupRestoreRunning') : t('backupRestore')),\n h('input', {\n ref: backupFileRef,\n type: 'file',\n accept: '.json,application/json',\n style: { display: 'none' },\n onChange: (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => onRestoreAll(String(reader.result))\n reader.readAsText(file)\n },\n }),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('forceTitle')),\n h('div', { style: s.muted }, t('forceHint')),\n h('div', { style: s.injectRow }, [\n h('label', { style: s.switchWrap }, [\n h('input', {\n type: 'checkbox',\n checked: cfg.forceSections !== false,\n // forceSections \u662F\u5168\u5C40\u5B57\u6BB5\uFF0C\u4E0E presets/activePreset \u4E00\u6837\u6C38\u8FDC\u5199\u9876\u5C42\u3002\n onChange: (e: ChangeEvent<HTMLInputElement>) => writeGlobal('forceSections', e.target.checked),\n }),\n h('span', { style: cfg.forceSections !== false ? s.badgeOk : s.badgeBlocked },\n cfg.forceSections !== false ? t('forceOn') : t('forceOff')),\n ]),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('envBlockTitle')),\n h('div', { style: s.muted }, t('envBlockHint')),\n h('div', { style: { ...s.toolWrap, marginTop: 6 } }, envBlocklist.map((entry) => h('span', {\n key: entry,\n style: { ...s.toolChip, display: 'inline-flex', alignItems: 'center', gap: 4 },\n }, [\n entry,\n h('span', { style: { cursor: 'pointer' }, title: t('delete'), onClick: () => removeBlockEntry(entry) }, '\u00D7'),\n ]))),\n envBlocklist.length === 0 ? h('div', { style: s.muted }, t('envBlockEmpty')) : null,\n h('div', { style: { ...s.injectRow, marginTop: 6 } }, [\n h('input', {\n style: { ...s.input, flex: 1 },\n placeholder: t('envBlockAdd'),\n value: blockInput,\n onChange: (e: ChangeEvent<HTMLInputElement>) => setBlockInput(e.target.value),\n }),\n h('button', { style: s.mini, disabled: blockInput.trim() === '', onClick: addBlockEntry }, t('envBlockAddAction')),\n ]),\n h('details', { style: { marginTop: 6 } }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } }, `${t('envVarsTitle')} (${inv?.variables?.length ?? 0})`),\n h('div', { style: { ...s.muted, marginTop: 4 } }, t('envVarsHint')),\n h('div', { style: { ...s.toolWrap, marginTop: 4 } }, (inv?.variables ?? []).map((varName) => h('span', { key: varName, style: s.toolChip }, `{{${varName}}}`))),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('resetTitle')),\n h('div', { style: s.muted }, t('resetHint')),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => {\n // \u4E8C\u6B21\u786E\u8BA4\uFF1A\u6E05\u7A7A\u4E0D\u53EF\u64A4\u9500\uFF0C\u5FC5\u987B\u660E\u786E\u70B9\u5934\u624D\u52A8\u624B\u3002\n if (window.confirm(t('resetConfirm'))) onReset()\n } }, t('resetAction')),\n ]),\n ]),\n ]),\n ])\n}\n", "/**\n * preset-io.ts \u2014\u2014 \u8DE8\u73AF\u5883\uFF08Tauri 2 \u684C\u9762 / Web\uFF09\u7684\u9884\u8BBE\u5BFC\u5165\u5BFC\u51FA\u9002\u914D\u5C42\u3002\n *\n * \u6D4F\u89C8\u5668\u7AEF\u6700\u521D\u8DD1\u5728\u666E\u901A\u7F51\u9875\u91CC\uFF1A\u5BFC\u51FA\u7528 Blob + <a download>\uFF0C\u5BFC\u5165\u7528\u9690\u85CF\u7684\n * <input type=\"file\"> + FileReader\u3002\u5BBF\u4E3B\u73B0\u5728\u53EF\u80FD\u5305\u5728 Tauri \u684C\u9762 WebView\n * \u91CC\uFF0C\u684C\u9762\u7AEF\u7684\u9884\u671F\u4EA4\u4E92\u662F\u300C\u539F\u751F\u4FDD\u5B58 / \u6253\u5F00\u5BF9\u8BDD\u6846 + \u771F\u5B9E\u6587\u4EF6\u8BFB\u5199\u300D\u3002\n *\n * \u672C\u6A21\u5757\u4FDD\u6301\u6587\u4EF6\u683C\u5F0F\u7EAF\u51C0\uFF08encode/decode \u4E3A\u7EAF\u51FD\u6570\uFF09\uFF0C\u628A\u771F\u6B63\u7684 I/O \u8DEF\u7531\u5230\n * \u4E00\u4E2A\u5C0F\u578B\u7684\u53EF\u6CE8\u5165 `PresetIoEnv`\uFF1A\n *\n * - Tauri v2\uFF1A\u901A\u8FC7 window.__TAURI_INTERNALS__.invoke \u8C03\u7528\u539F\u751F\u7684\n * `plugin:dialog|save` / `plugin:dialog|open` \u4E0E\n * `plugin:fs|write_text_file` / `plugin:fs|read_text_file` \u547D\u4EE4 \u2014\u2014 \u4F46\n * \u4EC5\u5F53\u5BBF\u4E3B\u5E94\u7528\u6CE8\u518C\u4E86 dialog / fs \u63D2\u4EF6\u3001\u4E14\u5176 capability ACL \u653E\u884C\u8FD9\u4E9B\n * \u547D\u4EE4\u65F6\u624D\u53EF\u7528\u3002\u4EFB\u4F55\u62D2\u7EDD\uFF08\u63D2\u4EF6\u672A\u6CE8\u518C\u3001ACL \"not allowed\"\uFF09\u90FD\u5F52\u4E3A\n * `unavailable`\uFF0C\u7531\u8C03\u7528\u65B9\u56DE\u9000\u5230 Web \u8DEF\u5F84 \u2014\u2014 \u6240\u4EE5\u5373\u4F7F Tauri \u5BBF\u4E3B\u5C1A\u672A\n * \u5E26 dialog/fs \u63D2\u4EF6\uFF0C\u672C\u63D2\u4EF6\u4E5F\u7167\u5E38\u5DE5\u4F5C\u3002\n * - Web\uFF08\u4EE5\u53CA tauri \u56DE\u9000\uFF09\uFF1ABlob + \u951A\u70B9\u4E0B\u8F7D / \u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF0C\u4E0E\u65E7\u884C\u4E3A\n * \u5B8C\u5168\u4E00\u81F4\u3002\u5728 WebView2 \u91CC\u951A\u70B9\u4E0B\u8F7D\u4F1A\u9000\u5316\u4E3A WebView \u9ED8\u8BA4\u7684\u4E0B\u8F7D\u5904\u7406\uFF0C\n * \u6587\u4EF6\u8F93\u5165\u4ECD\u4F1A\u6253\u5F00\u7CFB\u7EDF\u9009\u62E9\u5668\u3002\n *\n * \u672C\u6A21\u5757\u5728\u6A21\u5757\u4F5C\u7528\u57DF\u4E0D\u89E6\u78B0 DOM \u2014\u2014 \u6BCF\u4E2A\u5206\u652F\u90FD\u63A5\u53D7\u6CE8\u5165\u7684\u5047\u5B9E\u73B0 \u2014\u2014 \u56E0\u6B64\n * \u53EF\u4EE5\u5728 Node \u4E0B\u52A0\u8F7D\uFF0Cweb / tauri \u5DF2\u4FDD\u5B58 / tauri \u5DF2\u53D6\u6D88 / tauri \u4E0D\u53EF\u7528\n * \u7684\u6574\u4E2A\u77E9\u9635\u90FD\u80FD\u5355\u6D4B\u8986\u76D6\u3002\n */\nimport type { Preset } from './types.ts'\nimport { presetExportFilename } from './presets.ts'\n\n// \u2500\u2500 \u73AF\u5883\u68C0\u6D4B \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Tauri v2 \u539F\u59CB IPC \u6865\uFF08window.__TAURI_INTERNALS__\uFF09\u3002 */\nexport interface TauriInvoke {\n (cmd: string, args?: Record<string, unknown>, options?: unknown): Promise<unknown>\n}\n\n/** \u9875\u9762\u662F\u5426\u8FD0\u884C\u5728 Tauri\uFF08v1 \u6807\u8BB0\u6216 v2 \u6865\uFF09webview \u5185\u3002 */\nexport function isTauriEnv(win: unknown): boolean {\n if (win === null || win === undefined) return false\n const w = win as { __TAURI_INTERNALS__?: unknown; __TAURI__?: unknown }\n return w.__TAURI_INTERNALS__ !== undefined || w.__TAURI__ !== undefined\n}\n\n/** \u53D6\u53EF\u7528\u7684 Tauri v2 invoke \u6865\uFF1B\u4E0D\u53EF\u7528\u65F6\u8FD4\u56DE null\u3002 */\nfunction invokeOf(win: unknown): TauriInvoke | null {\n if (!isTauriEnv(win)) return null\n const internals = (win as { __TAURI_INTERNALS__?: { invoke?: unknown } }).__TAURI_INTERNALS__\n return internals && typeof internals.invoke === 'function' ? (internals.invoke as TauriInvoke) : null\n}\n\n// \u2500\u2500 \u539F\u751F\uFF08tauri\uFF09\u539F\u8BED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SaveOutcome = { kind: 'saved' } | { kind: 'cancelled' } | { kind: 'unavailable' }\nexport type OpenOutcome = { kind: 'text'; text: string } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\nconst JSON_FILTERS = [{ name: 'JSON', extensions: ['json'] }]\n\n/**\n * \u539F\u751F\u4FDD\u5B58\u5BF9\u8BDD\u6846 + \u5199\u6587\u4EF6\u3002`cancelled` = \u7528\u6237\u5173\u95ED\u4E86\u5BF9\u8BDD\u6846\uFF08\u8C03\u7528\u65B9\u7EDD\u4E0D\n * \u5F97\u518D\u56DE\u9000\u5230\u4E0B\u8F7D\uFF09\uFF1B`unavailable` = \u5BBF\u4E3B\u65E0\u6CD5\u63D0\u4F9B dialog/fs \u63D2\u4EF6\uFF08\u63D2\u4EF6\n * \u7F3A\u5931\u6216\u88AB ACL \u62E6\u622A\uFF09\uFF0C\u8C03\u7528\u65B9\u5E94\u5F53\u56DE\u9000\u3002\n */\nexport async function tauriSaveText(invoke: TauriInvoke, defaultName: string, text: string): Promise<SaveOutcome> {\n try {\n const path = await invoke('plugin:dialog|save', { defaultPath: defaultName, filters: JSON_FILTERS })\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n await invoke('plugin:fs|write_text_file', { path, contents: text })\n return { kind: 'saved' }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n/** \u539F\u751F\u6253\u5F00\u5BF9\u8BDD\u6846 + \u8BFB\u6587\u4EF6\u3002`cancelled` = \u7528\u6237\u5173\u95ED\u4E86\u5BF9\u8BDD\u6846\u3002 */\nexport async function tauriOpenText(invoke: TauriInvoke): Promise<OpenOutcome> {\n try {\n const picked = await invoke('plugin:dialog|open', { multiple: false, directory: false, filters: JSON_FILTERS })\n const path = Array.isArray(picked) ? picked[0] : picked\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n const text = await invoke('plugin:fs|read_text_file', { path })\n if (typeof text !== 'string') return { kind: 'unavailable' }\n return { kind: 'text', text }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n// \u2500\u2500 Web \u56DE\u9000\u539F\u8BED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u951A\u70B9\u4E0B\u8F7D\u7684\u76EE\u6807\u63A5\u53E3\uFF1B\u4F9D\u8D56\u5168\u90E8\u6CE8\u5165\u4EE5\u4FBF Node \u91CC\u4F2A\u9020\u3002 */\nexport interface BrowserDownloadTarget {\n makeAnchor(): { href: string; download: string; click(): void }\n makeBlob(text: string): unknown\n objectUrl(blob: unknown): string\n revoke(url: string): void\n}\n\n/** Web \u56DE\u9000\u5BFC\u51FA\uFF1ABlob + object URL + <a download> + revoke\u3002 */\nexport function webDownload(target: BrowserDownloadTarget, filename: string, text: string): void {\n const blob = target.makeBlob(text)\n const url = target.objectUrl(blob)\n const anchor = target.makeAnchor()\n anchor.href = url\n anchor.download = filename\n anchor.click()\n target.revoke(url)\n}\n\n/** FileReader \u5F62\u72B6\u7684\u8BFB\u53D6\u5668\uFF08\u6D4F\u89C8\u5668\u6CE8\u5165\u771F FileReader\uFF0C\u6D4B\u8BD5\u6CE8\u5165\u5047\u5B9E\u73B0\uFF09\u3002\n * \u56DE\u8C03\u7C7B\u578B\u5E26\u53EF\u9009\u7684\u4E8B\u4EF6\u53C2\u6570\uFF0C\u8BA9 DOM FileReader \u7684\n * `(this: FileReader, ev: ProgressEvent) => any` \u5904\u7406\u5668\u80FD\u5E72\u51C0\u8D4B\u503C\u3002 */\nexport interface FileReaderLike {\n readAsText(file: unknown): void\n onload: ((ev?: unknown) => void) | null\n onerror: ((ev?: unknown) => void) | null\n result: string | ArrayBuffer | null\n}\n\n/** Web \u56DE\u9000\u5BFC\u5165\uFF1A\u7ECF FileReader \u5F62\u72B6\u7684\u8BFB\u53D6\u5668\u89E3\u6790\u6240\u9009\u6587\u4EF6\u7684\u6587\u672C\u3002 */\nexport function readPickedFile(reader: FileReaderLike, file: unknown): Promise<string> {\n return new Promise((resolve, reject) => {\n reader.onload = () => {\n const r = reader.result\n resolve(typeof r === 'string' ? r : String(r ?? ''))\n }\n reader.onerror = () => reject(new Error('FREAD'))\n reader.readAsText(file)\n })\n}\n\n// \u2500\u2500 \u7EAF\u6587\u4EF6\u683C\u5F0F \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u628A\u5355\u4E2A\u9884\u8BBE\u7F16\u7801\u4E3A\u5BFC\u51FA\u6587\u4EF6\u7684 JSON \u683C\u5F0F\uFF08\u5355\u5BF9\u8C61\u683C\u5F0F\uFF09\u3002`envBlocklist`\n * \u662F\u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u7684\u968F\u884C\u5FEB\u7167\uFF1A\u5BFC\u5165\u7AEF\u6309\u5E76\u96C6\u5E76\u5165\uFF08\u89C1 PresetsTab\uFF09\u3002 */\nexport function encodePresetExport(preset: Preset, envBlocklist?: string[]): string {\n return JSON.stringify({ name: preset.name, data: preset.data, ...(Array.isArray(envBlocklist) ? { envBlocklist } : {}) }, null, 2)\n}\n\n/**\n * \u89E3\u6790\u5BFC\u51FA\u7684\u9884\u8BBE\u6587\u4EF6\uFF1A\u5355\u4E2A { name, data } \u5BF9\u8C61\u6216\u5BF9\u8C61\u6570\u7EC4\u3002\u7A7A\u5185\u5BB9 /\n * \u975E\u6CD5 JSON \u629B\u666E\u901A Error\uFF0C\u7531\u8C03\u7528\u65B9\u7ED9\u51FA\u53CB\u597D\u63D0\u793A\uFF1B\u6761\u76EE\u7EA7\u7684\u8FC7\u6EE4\u5728\n * addImportedPresets \u91CC\u8FDB\u884C\u3002\n */\nexport function decodePresetExport(text: string): unknown {\n const trimmed = String(text).trim()\n if (trimmed === '') throw new Error('EMPTY_EXPORT')\n return JSON.parse(trimmed)\n}\n\n// \u2500\u2500 \u73AF\u5883\u95E8\u9762 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u8C03\u7528\u65B9\uFF08UI \u6216\u6D4B\u8BD5\uFF09\u9A71\u52A8\u7684 I/O \u9762\u3002 */\nexport interface PresetIoEnv {\n readonly tauri: boolean\n saveText(defaultName: string, text: string): Promise<SaveOutcome>\n openText(): Promise<OpenOutcome>\n download(name: string, text: string): void\n}\n\nfunction browserDownloadTarget(): BrowserDownloadTarget {\n const g = globalThis as { document?: Document; URL?: { createObjectURL(b: Blob): string; revokeObjectURL(u: string): void } }\n const doc = g.document!\n const url = g.URL!\n return {\n makeAnchor: () => doc.createElement('a'),\n makeBlob: (text) => new Blob([text], { type: 'application/json' }),\n objectUrl: (blob) => url.createObjectURL(blob as Blob),\n revoke: (u) => url.revokeObjectURL(u),\n }\n}\n\n/** \u4E3A\u5F53\u524D window \u6784\u5EFA\u771F\u5B9E\u73AF\u5883\uFF08\u5728 Node \u91CC\u8C03\u7528\u4E5F\u5B89\u5168\uFF09\u3002 */\nexport function makeIoEnv(win?: unknown): PresetIoEnv {\n const w = win !== undefined ? win : typeof window !== 'undefined' ? window : undefined\n const invoke = invokeOf(w)\n const tauri = invoke !== null\n return {\n tauri,\n saveText: (name, text) => (tauri ? tauriSaveText(invoke!, name, text) : Promise.resolve({ kind: 'unavailable' })),\n openText: () => (tauri ? tauriOpenText(invoke!) : Promise.resolve({ kind: 'unavailable' })),\n download: (name, text) => webDownload(browserDownloadTarget(), name, text),\n }\n}\n\nexport type ExportResult = { ok: boolean; via: 'tauri' | 'browser'; cancelled?: boolean; message?: string }\n\n/**\n * \u5BFC\u51FA\u4E00\u4E2A\u9884\u8BBE\uFF1A\u5BBF\u4E3B\u80FD\u63D0\u4F9B\u539F\u751F\u5BF9\u8BDD\u6846\u65F6\u8D70 tauri \u4FDD\u5B58\uFF08cancelled = \u7528\u6237\n * \u62D2\u7EDD\uFF0C\u7EDD\u4E0D\u56DE\u9000\u4E0B\u8F7D\uFF09\uFF1B\u5426\u5219\u8D70 Web \u4E0B\u8F7D\u3002\n */\nexport async function exportPresetFile(preset: Preset, io?: PresetIoEnv, envBlocklist?: string[]): Promise<ExportResult> {\n const env = io ?? makeIoEnv()\n try {\n const text = encodePresetExport(preset, envBlocklist)\n const filename = presetExportFilename(preset.name)\n if (env.tauri) {\n const out = await env.saveText(filename, text)\n if (out.kind === 'saved') return { ok: true, via: 'tauri' }\n if (out.kind === 'cancelled') return { ok: false, via: 'tauri', cancelled: true }\n // unavailable -> \u7EE7\u7EED\u8D70 Web \u4E0B\u8F7D\n }\n env.download(filename, text)\n return { ok: true, via: 'browser' }\n } catch (e) {\n return { ok: false, via: 'browser', message: e instanceof Error ? e.message : String(e) }\n }\n}\n\nexport type ImportResult = { kind: 'text'; text: string; via: 'tauri' } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\n/**\n * \u7ECF\u539F\u751F tauri \u6253\u5F00\u5BF9\u8BDD\u6846\u5BFC\u5165\u4E00\u4E2A\u9884\u8BBE\uFF1B\u8FD4\u56DE `unavailable` \u65F6\u7531\u8C03\u7528\u65B9\n * \u70B9\u51FB\u81EA\u5DF1\u7684\u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF08Web \u56DE\u9000\uFF09\u3002\n */\nexport async function importPresetFile(io?: PresetIoEnv): Promise<ImportResult> {\n const env = io ?? makeIoEnv()\n try {\n if (env.tauri) {\n const out = await env.openText()\n if (out.kind === 'text') return { kind: 'text', text: out.text, via: 'tauri' }\n if (out.kind === 'cancelled') return { kind: 'cancelled' }\n }\n } catch {\n /* \u843D\u5230\u4E0B\u9762\u7684\u9009\u62E9\u5668\u56DE\u9000 */\n }\n return { kind: 'unavailable' }\n}\n", "/**\n * PreviewPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u53F3\u680F\uFF08\u63D0\u793A\u8BCD / \u5DE5\u5177\u6A21\u5F0F\u5E38\u9A7B\uFF09\u3002\n *\n * \u53EA\u8BFB\u9884\u89C8\uFF0C\u6CA1\u6709\u4EFB\u4F55\u5207\u6362\u63A7\u4EF6\uFF1A\u770B\u63D0\u793A\u8BCD\u8FD8\u662F\u5DE5\u5177\u7531\u9876\u90E8\u6A21\u5F0F\u51B3\u5B9A\uFF08\u9009\u300C\u63D0\u793A\u8BCD\u300D\n * = \u63D0\u793A\u8BCD\u7F16\u8F91 + \u63D0\u793A\u8BCD\u9884\u89C8\uFF1B\u9009\u300C\u5DE5\u5177\u300D= \u5DE5\u5177\u7F16\u8F91 + \u5DE5\u5177\u9884\u89C8\uFF09\uFF0C\u9636\u6BB5\u7531\u5934\u90E8\n * \u7684\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u63A7\u5236\uFF08\u4E0E\u5DE6\u680F\u8054\u52A8\uFF09\u3002\u6570\u636E\u6765\u81EA Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\uFF0C\n * \u7F16\u8F91\u8349\u7A3F\u540E\u7531 Panel \u9632\u6296\u53E0\u52A0\u540C\u6B65 \u2014\u2014 \u6240\u89C1\u5373\u6A21\u578B\u6240\u89C1\u3002\u672C\u89C6\u56FE\u7EDD\u4E0D\u4FEE\u6539\u914D\u7F6E\u3002\n */\nimport { createElement as h, type ReactElement } from 'react'\nimport { entryKey, type PhaseKey, type PhaseViews, type EntryRef } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport { PreviewTools } from './PreviewTools.tsx'\n\nexport function PreviewPane({ t, phases, phase, sub, onToggleContext }: {\n t: Translate\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseKey\n /** \u63D0\u793A\u8BCD / \u5DE5\u5177\u5B50\u89C6\u56FE\uFF1A\u8DDF\u968F\u9876\u90E8\u6A21\u5F0F\uFF08\u65E0\u624B\u52A8\u5207\u6362\uFF09\u3002 */\n sub: 'prompt' | 'tools'\n /** \u5207\u6362\u67D0\u4E2A\u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\u7684\u663E\u9690\uFF08hide=true \u8868\u793A\u9690\u85CF\uFF09\u3002 */\n onToggleContext?: (entry: EntryRef, hide: boolean) => void\n}): ReactElement {\n const data = phases?.[phase] ?? null\n // \u6309\u5F53\u524D\u6240\u9009\u9636\u6BB5\u5224\u5B9A\u300C\u6BB5\u7EA7\u5B9A\u5236\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\u300D\uFF1A\u6709 complete \u6BB5\u6574\u6BB5\u63A5\u7BA1\u5C31\u8BF4\n // \u63A5\u7BA1\uFF0C\u5426\u5219\u63A2\u6D4B\u672C\u63D2\u4EF6\u4EA7\u51FA\u7684\u6BB5\u662F\u5426\u88AB\u4E0B\u6E38\u4E22\u5F03\uFF08\u4E22\u5F03\u89C4\u5219\u4E0D\u6B62\u4E00\u79CD\uFF09\u3002\n const lossNote = data === null || data === undefined ? null\n : data.takenOverBy !== undefined\n ? t('sectionsTakenOver', { name: data.takenOverBy })\n : data.lostSections !== undefined\n ? t('sectionsLost', { emitted: data.lostSections.emitted, survived: data.lostSections.survived })\n : null\n\n // \u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\uFF1A\u53EA\u8BA4\u670D\u52A1\u7AEF baseContexts\uFF08\u5E26 blocked / source / dynamic\uFF09\u3002\n // \u7F3A\u5E2D = \u5BBF\u4E3B\u4E0D\u652F\u6301\u8BE5\u9879\u63A7\u5236\uFF1A\u7981\u7528\u5F00\u5173\u5E76\u63D0\u793A\uFF0C\u7EDD\u4E0D\u4F2A\u9020 blocked:false\u3002\n const baseContexts = data?.baseContexts\n\n return h('div', { style: s.colRight }, [\n h('div', { style: s.colRightScroll }, [\n // \u8BE5\u9636\u6BB5\u7684\u672C\u63D2\u4EF6\u6BB5\u7EA7\u4EA7\u51FA\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\uFF08\u6574\u6BB5\u63A5\u7BA1\u6216\u88AB\u4E0B\u6E38\u4E22\u5F03\uFF09\u3002\n lossNote !== null ? h('div', { style: s.noticeWarn }, lossNote) : null,\n // scope \u6302\u8F7D\u5931\u8D25\u56DE\u9000\u5168\u5C40\u5C42\u65F6\u660E\u786E\u8B66\u793A\uFF1A\u8FD9\u4E0D\u662F\u8BE5\u9884\u8BBE\u7684\u539F\u751F\u88C5\u914D\u3002\n data !== null && data.scopeResolved === false\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n phases === null ? h('div', { style: s.muted }, t('loading')) : null,\n phases !== null && data === null\n ? h('div', { style: s.error }, t('previewFail'))\n : null,\n data ? h('div', { style: s.muted }, t('previewPreset')) : null,\n sub === 'prompt'\n ? data\n ? [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewHint')),\n h('span', { style: s.orderTag }, `${data.sections.length} ${t('previewSections')}`),\n ]),\n h('pre', { style: s.previewText }, data.text || t('empty')),\n h('div', { style: s.rowTitle }, t('runtimeContexts')),\n baseContexts === undefined\n ? h('div', { style: s.noticeWarn }, t('contextsUnsupported'))\n : baseContexts.length === 0\n ? h('div', { style: s.muted }, t('empty'))\n : baseContexts.map((context, index) => {\n const identity = `${entryKey(context)}:${index}`\n const disabled = onToggleContext === undefined\n const hidden = context.blocked === true || context.active === false\n return h('div', { key: identity, style: { opacity: hidden ? 0.5 : 1 } }, [\n h('label', { style: { ...s.muted, display: 'flex', alignItems: 'center', gap: 6, cursor: disabled ? 'default' : 'pointer' } }, [\n h('input', {\n type: 'checkbox',\n checked: !hidden,\n disabled,\n onChange: (e: { currentTarget: { checked: boolean } }) => onToggleContext?.(context, !e.currentTarget.checked),\n }),\n context.name,\n context.source === undefined\n ? null\n : h('span', { style: s.badgeSystem }, `${context.source.kind}${context.source.id === undefined ? '' : `:${context.source.id}`}`),\n context.dynamic === true ? h('span', { style: s.badgeSystem }, t('dynamic')) : null,\n ]),\n h('pre', { style: s.previewText }, context.text || t('empty')),\n ])\n }),\n ]\n : null\n : data\n ? [\n // \u6A21\u578B\u89C6\u89D2 vs \u6CE8\u518C\u8868\u89C6\u89D2\u7684\u5BF9\u7167\uFF1A\u9884\u89C8\u6309\u6240\u9009\u9636\u6BB5\u8FD0\u884C\u5168\u90E8\u88C5\u914D\u89C4\u5219\n //\uFF08\u542B\u9884\u8BBE\u539F\u751F\u7684\u9636\u6BB5\u88C1\u526A\uFF09\uFF0C\u67D0\u4E9B\u9884\u8BBE\uFF08\u5982 PTC / Code Mode\uFF09\u4F1A\u628A\n // \u5B8C\u6574\u76EE\u5F55\u5305\u88C5\u6210\u5355\u4E00\u5DE5\u5177\uFF0C\u6CE8\u518C\u8868\u539F\u59CB\u76EE\u5F55\u4ECD\u5217\u5728\u5DE5\u5177\u5B50\u89C6\u56FE\u3002\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewToolsHint')),\n h('span', { style: s.orderTag },\n `${data.tools.length} / ${data.registryTotal ?? '?'} ${t('previewToolsCount')}`),\n ]),\n h(PreviewTools, { tools: data.tools, t }),\n ]\n : null,\n ]),\n ])\n}\n", "/** \u5DE5\u5177\u9884\u89C8\uFF1A\u5F53\u524D\u5B9A\u5236\uFF08\u9ED1\u540D\u5355\u8FC7\u6EE4\u4E4B\u540E\uFF09\u6700\u7EC8\u5BF9\u6A21\u578B\u53EF\u89C1\u7684\u5DE5\u5177\u76EE\u5F55\uFF0C\n * \u53EA\u8BFB\u3001\u6E05\u5355\u5F0F\u5448\u73B0\uFF1A\u5217\u51FA\u5373\u4EE3\u8868\u6A21\u578B\u770B\u5F97\u89C1 \u2014\u2014 \u8FD9\u91CC\u6CA1\u6709\u300C\u5DF2\u5C4F\u853D\u300D\u72B6\u6001\u3002\n * \u672C\u89C6\u56FE\u7EDD\u4E0D\u4FEE\u6539\u9ED1\u540D\u5355\u914D\u7F6E\u3002 */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport { entryKey, type EntrySource, type PreviewTool } from './types.ts'\n\n/** \u628A\u5B57\u7B26\u4E32\u5F62\u6001\u7684\u6761\u76EE\u8865\u5168\u4E3A { name }\u3002 */\nfunction norm(tool: PreviewTool | string): { name: string; description: string; source?: EntrySource; keySuffix?: string } {\n if (typeof tool === 'string') return { name: tool, description: '' }\n return {\n name: tool.name,\n description: tool.description ?? '',\n ...(tool.source === undefined ? {} : { source: tool.source }),\n ...(tool.keySuffix === undefined ? {} : { keySuffix: tool.keySuffix }),\n }\n}\n\nexport function PreviewTools({ tools, t }: { tools: Array<PreviewTool | string>; t: Translate }): ReactElement {\n if (tools.length === 0) return h('div', { style: s.muted }, t('empty'))\n return h('div', { style: s.list }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.orderTag }, `${tools.length} ${t('previewToolCount')}`),\n ]),\n tools.map((tool, index) => {\n const { name, description, source, keySuffix } = norm(tool)\n // \u540C\u540D\u4E0D\u540C\u6E90 / \u540C\u540D\u591A\u6001\u90FD\u8981\u5206\u884C\uFF1Akey \u7528 name+source+keySuffix+\u5E8F\u53F7\u3002\n const identity = `${entryKey({ name, ...(source === undefined ? {} : { source }) })}:${index}:${keySuffix ?? ''}`\n return h('div', { key: identity, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, name),\n source === undefined\n ? null\n : h('span', { style: s.badgeSystem }, `${source.kind}${source.id === undefined ? '' : `:${source.id}`}`),\n keySuffix === undefined ? null : h('span', { style: s.badgeSystem }, keySuffix),\n ]),\n h('div', { style: s.preview }, String(description ?? '').slice(0, 140)),\n ]),\n ])\n }),\n ])\n}\n", "/** Locale dictionaries for the prompt-customizer panel. */\nexport const DICT = {\n zh: {\n nav: '\u63D0\u793A\u8BCD\u5B9A\u5236',\n previewPreset: '\u6765\u6E90\uFF1A\u5F53\u524D\u6A21\u5F0F\u9884\u8BBE\u3002\u6709\u540C\u9884\u8BBE\u6D3B\u52A8\u4F1A\u8BDD\u65F6\uFF0C\u63D0\u793A\u8BCD\u6E05\u5355\u4E0E\u53F3\u680F\u663E\u793A\u8BE5\u4F1A\u8BDD\u7684\u771F\u5B9E\u88C5\u914D\uFF08\u542B\u63D2\u4EF6\u6CE8\u5165\u7684\u4F1A\u8BDD\u7EA7\u6BB5\uFF09\uFF1B\u5DE5\u5177\u76EE\u5F55\u4ECD\u6309\u6B64\u9884\u8BBE\u72EC\u7ACB\u88C5\u914D\u3002',\n runtimeContexts: '\u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\uFF08\u53EF\u663E\u9690\uFF1Bhost \u5E76\u5165\u7CFB\u7EDF\u63D0\u793A\u8BCD\u7684\u90E8\u5206\uFF09',\n loading: '\u52A0\u8F7D\u4E2D\u2026',\n tabsSections: '\u63D0\u793A\u8BCD',\n tabsTools: '\u5DE5\u5177',\n tabsPresets: '\u914D\u7F6E',\n refresh: '\u5237\u65B0',\n blockedOff: '\u672A\u5C4F\u853D',\n blockedOn: '\u5DF2\u5C4F\u853D',\n replaced: '\u5DF2\u66FF\u6362',\n manual: '\u624B\u52A8',\n system: '\u7CFB\u7EDF',\n replace: '\u7F16\u8F91',\n clearInput: '\u6E05\u7A7A',\n injectNew: '\u6CE8\u5165\u65B0\u6BB5',\n name: '\u540D\u79F0',\n text: '\u6587\u672C',\n add: '\u6DFB\u52A0',\n hiddenOff: '\u53EF\u89C1',\n hiddenOn: '\u5DF2\u9690\u85CF',\n empty: '\uFF08\u7A7A\uFF09',\n dynamic: '<\u52A8\u6001\u751F\u6210>',\n drag: '\u62D6\u52A8\u6392\u5E8F',\n moveUp: '\u4E0A\u79FB',\n moveDown: '\u4E0B\u79FB',\n previewHint: '\u4EE5\u4E0B\u4E3A\u5C4F\u853D/\u66FF\u6362/\u6CE8\u5165\u540E\u7684\u6700\u7EC8\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF1A',\n previewSections: '\u6BB5',\n previewToolCount: '\u4E2A\u5DE5\u5177',\n presetName: '\u914D\u7F6E\u540D\u79F0',\n backupTitle: '\u5B8C\u6574\u5907\u4EFD\uFF08\u5168\u90E8\u63D0\u793A\u8BCD / \u5DE5\u5177\uFF09',\n backupHint: '\u5168\u90E8\u9884\u8BBE\u5B9A\u5236\u5BFC\u51FA\uFF1A\u6240\u6709\u9884\u8BBE\u7684\u63D0\u793A\u8BCD\u3001\u5DE5\u5177\u3001\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u4E0E\u63D2\u4EF6\u8D26\u672C\uFF0C\u4E00\u4E2A JSON\u3002\u6062\u590D\u4F1A\u6574\u4F53\u8986\u76D6\u5F53\u524D\u6570\u636E\u3002',\n backupExport: '\u5BFC\u51FA\u5B8C\u6574\u5907\u4EFD',\n backupExportRunning: '\u5BFC\u51FA\u4E2D\u2026',\n backupRestore: '\u6062\u590D\u5907\u4EFD',\n backupRestoreRunning: '\u6062\u590D\u4E2D\u2026',\n backupOk: '\u5DF2\u5BFC\u51FA {name}',\n backupFail: '\u5BFC\u51FA\u5907\u4EFD\u5931\u8D25',\n presetIoTitle: '\u5F53\u524D\u9884\u8BBE\u5BFC\u5165 / \u5BFC\u51FA',\n presetIoHint: '\u53EA\u5904\u7406\u5F53\u524D\u9884\u8BBE\u7684\u5B9A\u5236\uFF08overrides\uFF09\uFF0C\u4E0D\u5305\u542B\u5BBF\u4E3B\u9884\u8BBE\u5B9A\u4E49\u3002',\n presetExport: '\u5BFC\u51FA\u5F53\u524D\u9884\u8BBE',\n presetImport: '\u5BFC\u5165\u5230\u5F53\u524D\u9884\u8BBE',\n presetIoOk: '\u5DF2\u5BFC\u51FA {name}',\n presetIoImported: '\u5DF2\u5BFC\u5165\u5F53\u524D\u9884\u8BBE\u5B9A\u5236',\n presetIoFail: '\u9884\u8BBE\u5BFC\u5165/\u5BFC\u51FA\u5931\u8D25',\n presetIoBadFormat: '\u4E0D\u662F\u6709\u6548\u7684\u9884\u8BBE\u5B9A\u5236\u6587\u4EF6',\n presetIoNoTarget: '\u8BF7\u5148\u9009\u62E9\u4E00\u4E2A agent \u9884\u8BBE',\n presetIoConfirm: '\u5C06\u628A\u6587\u4EF6\u4E2D\u7684\u5B9A\u5236\u5BFC\u5165\u5230\u9884\u8BBE\u300C{target}\u300D\uFF0C\u8986\u76D6\u8BE5\u9884\u8BBE\u73B0\u6709\u5B9A\u5236\u3002\u7EE7\u7EED\uFF1F',\n cleanupEmpty: '\u6E05\u7406\u7A7A\u914D\u7F6E',\n cleanupRunning: '\u6E05\u7406\u4E2D\u2026',\n cleanupConfirm: '\u5220\u9664\u6240\u6709\u5B57\u6BB5\u90FD\u4E3A\u7A7A\u7684\u9884\u8BBE overrides\uFF1F\u4E0D\u4F1A\u5F71\u54CD\u6709\u5185\u5BB9\u7684\u914D\u7F6E\u3002',\n cleanupOk: '\u5DF2\u6E05\u7406 {n} \u4EFD\u7A7A\u914D\u7F6E',\n cleanupFail: '\u6E05\u7406\u7A7A\u914D\u7F6E\u5931\u8D25',\n restoreOk: '\u5DF2\u6062\u590D\u5907\u4EFD',\n restoreFail: '\u6062\u590D\u5907\u4EFD\u5931\u8D25',\n restoreBadFormat: '\u4E0D\u662F\u6709\u6548\u7684\u5907\u4EFD\u6587\u4EF6\uFF08\u683C\u5F0F\u4E0D\u5339\u914D\uFF09',\n restoreConfirm: '\u6062\u590D\u5907\u4EFD\u4F1A\u6574\u4F53\u8986\u76D6\u5F53\u524D\u5168\u90E8\u63D0\u793A\u8BCD / \u5DE5\u5177 / \u8D26\u672C\u6570\u636E\uFF0C\u786E\u5B9A\u7EE7\u7EED\uFF1F',\n save: '\u4FDD\u5B58',\n import: '\u5BFC\u5165',\n apply: '\u5E94\u7528',\n export: '\u5BFC\u51FA',\n delete: '\u5220\u9664',\n restore: '\u8FD8\u539F',\n active: '\u4F7F\u7528\u4E2D',\n preset: '\u9884\u8BBE',\n syncAllPhases: '\u4E09\u6001\u540C\u6B65',\n syncAllPhasesHint: '\u52FE\u9009\u540E\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u6BB5\u5217\u8868\uFF08\u5E38\u9A7B\u671F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF0C\u540C\u540D\u6BB5\u4EE5\u539F\u751F\u90A3\u9636\u6BB5\u4E3A\u51C6\uFF09\uFF0C\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF1B\u52FE\u9009\u77AC\u95F4\u5373\u6309\u5E38\u9A7B\u671F\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF08\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\u3002\u5DE5\u5177\u680F\u7684\u9690\u85CF / \u663E\u793A\u4E0E\u52A0\u56DE\u540C\u6837\u5BF9\u4E09\u6001\u4E00\u8D77\u751F\u6548\u3002\u9ED8\u8BA4\u5173\u95ED\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5404\u7BA1\u5404\u7684\u3002',\n syncApplied: '\u5DF2\u6309\u5E38\u9A7B\u671F\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF1A\u4E09\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u6BB5\u5217\u8868\u4E0E\u6587\u672C\uFF08\u5199\u5165\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\u3002',\n syncNotReady: '\u4E09\u9636\u6BB5\u88C5\u914D\u672A\u5C31\u7EEA\uFF08\u6216\u4E3A\u7A7A\uFF09\uFF0C\u65E0\u6CD5\u6267\u884C\u4E09\u6001\u540C\u6B65 \u2014\u2014 \u8BF7\u70B9\u300C\u5237\u65B0\u300D\u91CD\u8BD5\u3002',\n syncSkippedDynamic: '\u300C{names}\u300D\u662F\u8FD0\u884C\u65F6\u52A8\u6001\u6BB5\uFF0C\u65E0\u6CD5\u52A0\u5165\u5176\u5B83\u9636\u6BB5\uFF08\u5B83\u7684\u5185\u5BB9\u53EA\u6709\u88C5\u914D\u65F6\u624D\u77E5\u9053\uFF09\u3002',\n broken: '\u635F\u574F',\n brokenPreset: '\u8BE5 agent \u9884\u8BBE\u5F53\u524D\u65E0\u6CD5\u6302\u8F7D\uFF0C\u4ECD\u53EF\u7F16\u8F91\u5176\u5B9A\u5236\uFF08\u4FEE\u590D\u9884\u8BBE\u540E\u81EA\u52A8\u751F\u6548\uFF09\u3002',\n // agent \u5468\u671F\u4E09\u9636\u6BB5\u7684\u5C55\u793A\u547D\u540D\uFF08\u5F15\u5BFC\u671F \u2192 \u5E38\u9A7B\u671F \u2192 \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002\n phaseStageGuide: '\u5F15\u5BFC\u671F',\n phaseStageResident: '\u5E38\u9A7B\u671F',\n phaseStageControlled: '\u538B\u7F29\u53D7\u63A7\u671F',\n allToolsTitle: '\u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177',\n allSectionsTitle: '\u672C\u7CFB\u7EDF\u5168\u90E8\u63D0\u793A\u8BCD',\n toolsFourHint: '\u4E09\u4E2A\u9636\u6BB5\u5404\u4E00\u4EFD\u540D\u5355\uFF0C\u4E92\u4E0D\u7EE7\u627F\uFF1A\u52FE\u9009 = \u8BE5\u9636\u6BB5\u662F\u5426\u5BF9\u6A21\u578B\u53EF\u89C1\uFF1B\u4ECE\u300C\u5168\u90E8\u300D\u62D6\u5165\u67D0\u9636\u6BB5 = \u8BA9\u8FD9\u4E00\u4E2A\u5DE5\u5177\u5728\u8BE5\u9636\u6BB5\u51FA\u73B0\uFF08\u82E5\u8BE5\u9636\u6BB5\u9ED8\u8BA4\u88C1\u6389\u4E86\u5B83\uFF0C\u5C31\u52A0\u56DE\u53BB\uFF09\uFF1B\u5728\u4E24\u4E2A\u9636\u6BB5\u4E4B\u95F4\u62D6\u52A8\uFF08\u62D6\u5230\u4E0A\u65B9\u9636\u6BB5\u6309\u94AE\uFF09= \u590D\u5236\uFF08\u6E90\u9636\u6BB5\u4E0D\u52A8\uFF0C\u76EE\u6807\u9636\u6BB5\u591A\u4E00\u4EFD\uFF0C\u9690\u85CF/\u542F\u7528\u72B6\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF09\uFF1B\u62D6\u56DE\u300C\u5168\u90E8\u300D= \u4ECE\u8BE5\u9636\u6BB5\u62FF\u6389\u5B83\u3002\u6BCF\u4E2A\u52A8\u4F5C\u53EA\u5F71\u54CD\u88AB\u62D6\u7684\u90A3\u4E00\u4E2A\u5DE5\u5177\u3002',\n sectionsFourHint: '\u62D6\u62FD\u53CC\u5411\uFF1A\u628A\u300C\u5168\u90E8\u300D\u91CC\u7684\u6BB5\u62D6\u8FDB\u4E0A\u65B9\u5217\u8868 = \u52A0\u5165\u8BE5\u9636\u6BB5\u5E76\u9ED8\u8BA4\u5F00\u542F\uFF1B\u4ECE\u9636\u6BB5\u62D6\u56DE\u300C\u5168\u90E8\u300D= \u4ECE\u8BE5\u9636\u6BB5\u79FB\u9664\uFF08\u539F\u751F\u6BB5\u8F6C\u4E3A\u5C4F\u853D\uFF09\u3002\u540C\u4E00\u4E2A\u9636\u6BB5\u91CC\u62D6\u52A8\u884C\u6293\u624B = \u6392\u5E8F\uFF1B\u62D6\u5230\u4E0A\u65B9\u7684\u9636\u6BB5\u6309\u94AE = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\u3002\u5C4F\u853D\u6BB5\u4E0E\u666E\u901A\u6BB5\u5B8C\u5168\u4E00\u6837\u53EF\u62D6\u62FD / \u7F16\u8F91\uFF0C\u53EA\u662F\u4E0D\u6CE8\u5165\u6A21\u578B\u3002',\n dragHint: '\u62D6\u5165 = \u8BA9\u8BE5\u5DE5\u5177\u5728\u8FD9\u4E2A\u9636\u6BB5\u51FA\u73B0',\n toolAddedTag: '\u52A0\u56DE',\n toolAdded: '\u5DF2\u628A\u300C{name}\u300D\u52A0\u56DE{phase}\uFF1A\u8BE5\u9636\u6BB5\u9ED8\u8BA4\u88C1\u6389\u4E86\u5B83\uFF0C\u4FDD\u5B58\u540E\u5B83\u4F1A\u91CD\u65B0\u51FA\u73B0\u5728\u8BE5\u9636\u6BB5\uFF08\u5F53\u524D\u9884\u8BBE\u6CE8\u518C\u8868\u91CC\u6709\u5B83\uFF09\u3002',\n toolNotInRegistry: '\u300C{name}\u300D\u4E0D\u5728\u672C\u9884\u8BBE\u7684\u6CE8\u518C\u8868\u91CC\uFF08\u5B83\u662F\u522B\u7684\u9884\u8BBE\u72EC\u6709\u7684\u5DE5\u5177\uFF09\uFF0C\u5F53\u524D\u9884\u8BBE\u6CA1\u6709\u5B83\u7684\u5B9A\u4E49\uFF0C\u52A0\u4E0D\u8FDB\u6765\u3002',\n toolCopied: '\u5DF2\u628A\u300C{name}\u300D\u590D\u5236\u5230{to}\uFF1A{from}\u90A3\u4EFD\u4FDD\u6301\u4E0D\u52A8\uFF0C\u9690\u85CF/\u542F\u7528\u72B6\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\u3002',\n toolRemovedFromPhase: '\u5DF2\u628A\u300C{name}\u300D\u4ECE{from}\u62FF\u6389\uFF1A\u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\uFF0C\u539F\u751F\u5DE5\u5177\u5219\u5728\u8BE5\u9636\u6BB5\u9690\u85CF\uFF08\u4ECD\u53EF\u5728\u8FD9\u91CC\u53CD\u9009\u56DE\u6765\uFF09\u3002',\n sectionCopied: '\u5DF2\u628A\u300C{name}\u300D\u590D\u5236\u5230{to}\uFF08\u6E90{from}\u4FDD\u6301\u4E0D\u52A8\uFF09\uFF1A\u65B0\u9636\u6BB5\u91CC\u5B83\u662F\u5F00\u542F\u7684\uFF0C\u53EF\u7EE7\u7EED\u7F16\u8F91\u6587\u672C\u6216\u62D6\u52A8\u6392\u5E8F\u3002',\n sectionRemoved: '\u5DF2\u628A\u300C{name}\u300D\u4ECE{from}\u62FF\u6389\uFF1A\u65B0\u52A0\u5165\u7684\u64A4\u9500\u52A0\u5165\uFF0C\u539F\u751F\u6BB5\u5219\u8F6C\u4E3A\u5C4F\u853D\uFF08\u53EF\u52FE\u9009\u56DE\u6765\uFF09\u3002',\n toolShown: '\u300C{name}\u300D\u5DF2\u5728{to}\u663E\u793A\u3002',\n toolSyncShown: '\u300C{name}\u300D\u5DF2\u5728\u4E09\u4E2A\u9636\u6BB5\u663E\u793A\uFF08\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u6CA1\u6709\u7684\u5DF2\u5199\u8FDB\u5404\u81EA\u7684\u52A0\u56DE\u540D\u5355\uFF09\u3002',\n sectionsTakenOver: '\u300C{name}\u300D\u6BB5\u58F0\u660E\u4E86 complete \u6574\u6BB5\u63A5\u7BA1\uFF08\u5BBF\u4E3B\u5728\u88C5\u914D\u7011\u5E03\u6D41\u4E4B\u540E\u5F3A\u5236\u8FD8\u539F\u4E3A\u90A3\u4E00\u6761\u6BB5\uFF09\u3002\u672C\u63D2\u4EF6\u9ED8\u8BA4\u7684 forceSections \u5DF2\u7ED5\u5F00\u8BE5\u673A\u5236\uFF0C\u6BB5\u7EA7\u5C4F\u853D / \u66FF\u6362 / \u6CE8\u5165 / \u6392\u5E8F\u7167\u5E38\u751F\u6548\uFF1B\u6B64\u63D0\u793A\u53EA\u4F1A\u5728 forceSections \u5173\u95ED\u6216\u5F3A\u5236\u8986\u76D6\u5931\u6548\u65F6\u51FA\u73B0\uFF0C\u5F00\u542F forceSections \u5373\u53EF\u6062\u590D\u3002',\n sectionsLost: '\u672C\u63D2\u4EF6\u5728\u8BE5\u9636\u6BB5\u4EA7\u51FA\u7684 {emitted} \u4E2A\u6BB5\u91CC\uFF0C\u53EA\u6709 {survived} \u4E2A\u8FDB\u5165\u6700\u7EC8\u63D0\u793A\u8BCD\uFF1A\u5176\u4F59\u88AB\u4E0B\u6E38\u88C5\u914D\u89C4\u5219\u4E22\u5F03\uFF0C\u6BB5\u7EA7\u5B9A\u5236\u4E0D\u4F1A\u5B8C\u5168\u751F\u6548\uFF08\u5DE5\u5177\u8FC7\u6EE4\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002',\n sectionDynamicNoAdd: '\u300C{name}\u300D\u662F\u8FD0\u884C\u65F6\u624D\u751F\u6210\u7684\u52A8\u6001\u6BB5\uFF0C\u6CA1\u6CD5\u9884\u5148\u52A0\u8FDB\u67D0\u4E2A\u9636\u6BB5\uFF08\u5B83\u7684\u5185\u5BB9\u53EA\u6709\u88C5\u914D\u65F6\u624D\u77E5\u9053\uFF09\u3002',\n exportOk: '\u5BFC\u51FA\u6210\u529F',\n exportCancel: '\u5DF2\u53D6\u6D88\u5BFC\u51FA',\n exportFail: '\u5BFC\u51FA\u5931\u8D25',\n importOk: '\u5BFC\u5165\u5B8C\u6210',\n importNone: '\u6CA1\u6709\u65B0\u589E\u9884\u8BBE\uFF08\u540C\u540D\u5DF2\u5B58\u5728\u6216\u6587\u4EF6\u4E3A\u7A7A\uFF09',\n importCancel: '\u5DF2\u53D6\u6D88\u5BFC\u5165',\n importFail: '\u5BFC\u5165\u5931\u8D25',\n saveOk: '\u5DF2\u4FDD\u5B58',\n saveFail: '\u4FDD\u5B58\u5931\u8D25',\n discardConfirm: '\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539\uFF0C\u79BB\u5F00\u5C06\u4E22\u5F03\u3002\u786E\u5B9A\u79BB\u5F00\u5417\uFF1F',\n forceTitle: '\u5F3A\u5236\u8986\u76D6\uFF08forceSections\uFF09',\n forceHint: '\u5F00\u542F\u540E\uFF0C\u4EC5\u5F53\u5F53\u524D\u9636\u6BB5\u5B58\u5728\u5B9E\u9645\u6BB5\u7B56\u7565\uFF08\u5C4F\u853D / \u66FF\u6362 / \u6CE8\u5165 / \u6392\u5E8F\uFF09\u65F6\uFF0C\u6700\u7EC8\u63D0\u793A\u8BCD\u6BB5\u4EE5\u672C\u63D2\u4EF6\u4E3A\u51C6\uFF08\u53EF\u7ED5\u8FC7 complete \u6574\u6BB5\u63A5\u7BA1\u4E0E\u9884\u8BBE\u9636\u6BB5\u88C1\u6BB5\uFF09\uFF1B\u6CA1\u6709\u6BB5\u5B9A\u5236\u65F6\u4FDD\u6301\u5BBF\u4E3B\u539F\u6837\u3002\u300C\u6062\u590D\u521D\u59CB\u72B6\u6001\u300D\u4F1A\u81EA\u52A8\u5173\u95ED\u5B83\u3002',\n forceOn: '\u5DF2\u5F00\u542F',\n forceOff: '\u5DF2\u5173\u95ED',\n envBlockTitle: '\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF08envBlocklist\uFF09',\n envBlockHint: '\u7CFB\u7EDF\u73AF\u5883\u53D8\u91CF\uFF08process.env\uFF09\u5DF2\u5168\u91CF\u6CE8\u518C\u4E3A\u63D0\u793A\u8BCD\u53D8\u91CF\uFF1A\u6BB5\u6587\u672C\u91CC\u5199 {{env_\u952E\u540D\u5C0F\u5199}} \u5F15\u7528\uFF08\u5982 {{env_path}}\uFF09\uFF1B\u547D\u4E2D\u9ED1\u540D\u5355\u7684\u952E\u4E0D\u6CE8\u518C\u2014\u2014env \u91CC\u5E38\u6709\u5BC6\u94A5\uFF0C\u8FDB\u4E86\u63D0\u793A\u8BCD\u5C31\u4F1A\u968F\u8BF7\u6C42\u53D1\u7ED9\u6A21\u578B\u3002\u6761\u76EE\u652F\u6301 * \u901A\u914D\u3001\u5927\u5C0F\u5199\u4E0D\u654F\u611F\u3002\u5185\u7F6E\u53D8\u91CF {{date}} {{time}} {{datetime}} {{weekday}} {{hostname}} {{platform}} {{arch}} {{username}} {{home}} {{shell}} {{locale}} {{node_version}} \u6052\u53EF\u7528\u3002',\n envBlockAdd: '\u952E\u540D\u6216\u901A\u914D\uFF0C\u5982 GITHUB_TOKEN \u6216 *_KEY*',\n envBlockAddAction: '\u6DFB\u52A0',\n envBlockEmpty: '\u9ED1\u540D\u5355\u4E3A\u7A7A\uFF1A\u6240\u6709\u73AF\u5883\u53D8\u91CF\u90FD\u4F1A\u88AB\u6CE8\u518C',\n envVarsTitle: '\u5DF2\u6CE8\u518C\u7684\u63D0\u793A\u8BCD\u53D8\u91CF',\n envVarsHint: '\u6BB5\u6587\u672C\u91CC\u5F15\u7528 {{\u53D8\u91CF\u540D}}\uFF1B\u5F15\u7528\u672A\u6CE8\u518C\u7684\u540D\u5B57\u4F1A\u8BA9\u6574\u6B21\u6E32\u67D3\u62A5\u9519\uFF08\u5BBF\u4E3B\u4E25\u683C\u6A21\u5F0F\uFF09\u3002',\n importBlockMerge: '\uFF0C\u6587\u4EF6\u4E2D\u7684\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u5DF2\u5E76\u5165\uFF08+{count} \u6761\uFF09',\n resetTitle: '\u6062\u590D\u521D\u59CB\u72B6\u6001',\n resetHint: '\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\uFF08\u5C4F\u853D / \u66FF\u6362 / \u6CE8\u5165 / \u6392\u5E8F\u3001\u9636\u6BB5\u5DE5\u5177\u76EE\u5F55\u3001\u914D\u7F6E\u5FEB\u7167\u3001agent \u9884\u8BBE\u8986\u76D6\uFF09\uFF0C\u5E76\u5173\u95ED forceSections \u2014\u2014 \u4E4B\u540E\u6240\u6709 AI \u5BF9\u8BDD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD\uFF0C\u4E0E\u5378\u8F7D\u63D2\u4EF6\u7B49\u6548\uFF0C\u65E0\u9700\u5378\u8F7D\u6216\u91CD\u542F\u3002\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\uFF1B\u8981\u91CD\u65B0\u542F\u7528\u5B9A\u5236\uFF0C\u5728\u4E0A\u65B9\u6253\u5F00\u300C\u5F3A\u5236\u8986\u76D6\u300D\u5F00\u5173\u5373\u53EF\u3002',\n resetConfirm: '\u786E\u5B9A\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u6062\u590D\u521D\u59CB\u72B6\u6001\u5417\uFF1F\\n\\n\u5C06\u5220\u9664\uFF1A\u5C4F\u853D\u540D\u5355\u3001\u6BB5\u66FF\u6362\u3001\u6CE8\u5165\u6BB5\u3001\u9636\u6BB5\u5DE5\u5177\u76EE\u5F55\u3001\u914D\u7F6E\u5FEB\u7167\u3001agent \u9884\u8BBE\u8986\u76D6\uFF1B\u5E76\u5173\u95ED forceSections\u3002\\n\u4E4B\u540E\u6240\u6709 AI \u5BF9\u8BDD\u90FD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD\uFF08\u4E0E\u5378\u8F7D\u63D2\u4EF6\u7B49\u6548\uFF09\u3002\\n\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\u3002',\n resetAction: '\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236',\n resetOk: '\u5DF2\u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u6240\u6709 AI \u5BF9\u8BDD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD',\n resetFail: '\u6062\u590D\u521D\u59CB\u72B6\u6001\u5931\u8D25',\n scopeFallback: '\u8BE5 agent \u9884\u8BBE\u7684\u5E38\u9A7B scope \u672A\u80FD\u6302\u8F7D\uFF0C\u4EE5\u4E0B\u663E\u793A\u7684\u662F\u5168\u5C40\u5C42\u5185\u5BB9\uFF08\u5E76\u975E\u8BE5\u9884\u8BBE\u7684\u539F\u751F\u6BB5\u4E0E\u5DE5\u5177\uFF09\u3002',\n previewFail: '\u8BE5\u9636\u6BB5\u88C5\u914D\u5931\u8D25\uFF08scope \u6302\u8F7D\u5931\u8D25\u6216\u9884\u8BBE\u63D2\u4EF6\u5F02\u5E38\uFF09\uFF0C\u8BF7\u5207\u6362\u76EE\u6807\u6216\u67E5\u770B\u670D\u52A1\u65E5\u5FD7\u3002',\n previewToolsHint: '\u6A21\u578B\u5B9E\u9645\u53EF\u89C1\u7684\u5DE5\u5177\u76EE\u5F55\uFF08\u6309\u6240\u9009\u9636\u6BB5\u8FD0\u884C\u9884\u8BBE\u7684\u5168\u90E8\u88C5\u914D\u89C4\u5219\uFF0C\u542B\u539F\u751F\u9636\u6BB5\u88C1\u526A\uFF09\uFF1A',\n previewToolsCount: '\u6CE8\u518C\u8868',\n toolAgentScoped: '\u4F1A\u8BDD\u7EA7',\n toolAgentScopedHint: '\u8BE5\u5DE5\u5177\u7531\u63D2\u4EF6\u5728 agent \u81EA\u5DF1\u7684\u4F5C\u7528\u57DF\u6CE8\u518C\uFF08\u4E0D\u662F\u9884\u8BBE\u6CE8\u518C\u8868\u9879\uFF09\uFF1Brestrict \u7BA1\u4E0D\u5230\u4F5C\u7528\u57DF\u5185\u540D\u5B57\uFF0C\u672C\u63D2\u4EF6\u9760\u88C5\u914D\u540E\u8FC7\u6EE4 tools \u5B9E\u73B0\u6309\u9636\u6BB5\u9690\u85CF\uFF0C\u53EF\u5728\u4E0A\u9762\u7684\u542F\u7528\u5217\u8868\u52FE\u9009\u3002\u7EE7\u627F\u5C42\u6CA1\u6709\u540C\u540D\u539F\u5B9A\u4E49\u65F6\u5B83\u4E0D\u662F\u300C\u906E\u853D\u300D\uFF0C\u53EA\u8BFB\u6C60\u6309\u300C\u4F1A\u8BDD\u7EA7\u300D\u5982\u5B9E\u5217\u51FA\u3002',\n toolDescriptionLabel: '\u5DE5\u5177\u63CF\u8FF0\uFF08\u53EA\u8BFB\uFF09',\n toolPromptSections: '\u63D0\u793A\u8BCD\u6BB5',\n toolPromptNone: '\u65E0\u63D0\u793A\u8BCD\u6BB5',\n toolPromptHint: '\u5DE5\u5177\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\u6BB5\uFF08\u7B2C\u4E00\u90E8\u5206\uFF09\uFF1B\u5DE5\u5177\u663E\u9690\u5728\u5DE5\u5177\u9875\u5355\u72EC\u63A7\u5236\uFF0Cdescription / JSON Schema \u4E0D\u5728\u8FD9\u91CC\u7F16\u8F91\u3002',\n toolPromptBadge: '\u5DE5\u5177\u63D0\u793A\u8BCD',\n toolPromptToolsLabel: '\u5173\u8054\u5DE5\u5177',\n toolPromptToolsHint: '\u8FD9\u4E2A\u63D0\u793A\u8BCD\u6BB5\u670D\u52A1\u7684\u5DE5\u5177\uFF1A{tools}',\n toolExecutorScoped: '\u6267\u884C\u5668\u5305\u88C5',\n toolExecutorScopedHint: '\u8BE5\u5DE5\u5177\u662F\u6267\u884C\u5668\u63D0\u4F9B\u7ED9\u6A21\u578B\u7684\u5305\u88C5\u9879\uFF08\u5982 PTC \u7684 run_code\uFF09\uFF0C\u4E0D\u662F\u666E\u901A\u6CE8\u518C\u8868\u5DE5\u5177\uFF1B\u4E0D\u80FD\u6309\u9636\u6BB5\u52FE\u9009\u3002',\n toolMaskedByPlugin: '\u63D2\u4EF6\u906E\u853D',\n toolMaskedByPluginHint: '\u8BE5\u5DE5\u5177\u5728\u9884\u8BBE\u6CE8\u518C\u8868\u91CC\u6709\uFF0C\u4F46\u88AB\u5176\u5B83\u63D2\u4EF6\u5728 agent \u4F5C\u7528\u57DF restrict \u6389\u4E86\uFF1B\u672C\u63D2\u4EF6\u65E0\u6CD5\u53CD\u5411\u89E3\u9664\u3002',\n toolMaskedByShadow: '\u540C\u540D\u906E\u853D',\n toolMaskedByShadowHint: '\u8BE5\u5DE5\u5177\u662F\u7EE7\u627F\u5C42\uFF08global / preset\uFF09\u7684\u539F\u751F\u5DE5\u5177\uFF0C\u88AB\u63D2\u4EF6\u5728 agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684\u540C\u540D\u5DE5\u5177\u9876\u6389\uFF1B\u672C\u63D2\u4EF6\u65E0\u6CD5\u53CD\u5411\u89E3\u9664\uFF0C\u6A21\u578B\u53EA\u4F1A\u770B\u5230\u63D2\u4EF6\u90A3\u4E00\u4E2A\u3002',\n toolMaskedByOwnPlugin: '\u672C\u63D2\u4EF6\u906E\u853D',\n toolMaskedByOwnPluginHint: '\u8BE5\u5DE5\u5177\u88AB\u672C\u63D2\u4EF6\u7684 MCP \u5DE5\u5177\u7EA7\u7981\u7528 / \u9884\u8BBE\u906E\u853D / \u5DE5\u4F5C\u533A\u5173\u95ED\u9690\u85CF\uFF0C\u53EF\u5728 MCP Tab \u6062\u590D\u3002',\n completeCatalogTitle: '\u5B8C\u6574\u76EE\u5F55 / \u5DF2\u906E\u853D\uFF08\u53EA\u8BFB\uFF09',\n completeCatalogHint: '\u8FD9\u91CC\u5217\u51FA\u672C\u63D2\u4EF6\u65E0\u6CD5\u6309\u9636\u6BB5\u5F00\u5173\u7684\u5DE5\u5177\uFF1Aagent \u4F5C\u7528\u57DF\u6CE8\u518C\u3001\u6267\u884C\u5668\u5305\u88C5\u3001\u88AB\u522B\u7684\u63D2\u4EF6 restrict\u3001\u88AB\u540C\u540D\u63D2\u4EF6\u5DE5\u5177\u9876\u6389\u3001\u88AB\u672C\u63D2\u4EF6 MCP \u906E\u853D\u3002\u5B83\u4EEC\u4E0D\u4F1A\u51FA\u73B0\u5728\u4E0A\u9762\u7684\u542F\u7528\u5217\u8868\u91CC\u3002',\n workspaceRequired: '\u5DE5\u4F5C\u533A\u7EA7\u4FDD\u5B58\u9700\u8981\u5F53\u524D\u5DE5\u4F5C\u533A\uFF08\u6D3B\u52A8\u4F1A\u8BDD\u7684 cwd\uFF09',\n workspaceNoSession: '\u5DE5\u4F5C\u533A\u7EA7\uFF1A\u5F53\u524D\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD\uFF0C\u53D6\u4E0D\u5230\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF1B\u5F00\u4F1A\u8BDD\u540E\u518D\u7F16\u8F91\u5DE5\u4F5C\u533A\u7EA7\u3002',\n // \u72EC\u7ACB\u9762\u677F\uFF08\u4FA7\u8FB9\u680F\u5165\u53E3 + \u62BD\u5C49\u5206\u680F\uFF09\u65B0\u589E\u3002\n close: '\u5173\u95ED',\n filterAll: '\u5168\u90E8',\n filterOn: '\u5DF2\u542F\u7528',\n filterOff: '\u5DF2\u505C\u7528',\n targetLabel: '\u7F16\u8F91\u76EE\u6807\uFF08Agent \u9884\u8BBE\uFF09',\n targetCustomized: '\u8BE5\u9884\u8BBE {n} \u9879\u5B9A\u5236',\n agentScoped: '\u4F1A\u8BDD\u7EA7',\n agentScopedHint: '\u8FD9\u4E00\u6BB5\u7531\u63D2\u4EF6\u5728\u5F53\u524D\u6D3B\u52A8 agent \u81EA\u5DF1\u7684\u4F5C\u7528\u57DF\u91CC\u6CE8\u518C\uFF08\u4E0D\u662F\u672C\u9884\u8BBE scope \u7684\u6CE8\u518C\u8868\u9879\uFF09\uFF1A\u9762\u677F\u7528\u540C\u9884\u8BBE\u6D3B\u52A8 agent \u7684\u771F\u5B9E\u88C5\u914D\u679A\u4E3E\u5230\u5B83\uFF0C\u5E76\u5728\u53F3\u680F\u9884\u89C8\u91CC\u663E\u793A\u5B83\u3002\u5B83\u9ED8\u8BA4\u5C31\u5728\u7CFB\u7EDF\u63D0\u793A\u8BCD\u91CC\uFF0C\u8EAB\u4EFD\u6309 agent \u6765\u6E90\u8DE8\u4F1A\u8BDD\u7A33\u5B9A\uFF0C\u6240\u4EE5\u53EF\u4EE5\u50CF\u666E\u901A\u6BB5\u4E00\u6837\u5C4F\u853D / \u66FF\u6362 / \u6392\u5E8F\u3002',\n libraryTitle: '\u914D\u7F6E\u5FEB\u7167\u5E93',\n applyToPreset: '\u5E94\u7528\u5C06\u5199\u5165\uFF1A\u9884\u8BBE\u7EA7\u300C{name}\u300D',\n applyToWorkspace: '\u5E94\u7528\u5C06\u5199\u5165\uFF1A\u5DE5\u4F5C\u533A\u7EA7\u300C{name}\u300D',\n draftBadge: '\u9884\u89C8\u542B\u672A\u4FDD\u5B58\u8349\u7A3F',\n previewSyncFail: '\u5B9E\u65F6\u9884\u89C8\u540C\u6B65\u5931\u8D25\uFF08\u4E0B\u6B21\u7F16\u8F91\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF0C\u6216\u70B9\u300C\u5237\u65B0\u300D\uFF09',\n sectionDynamicUnsupported: '\u5BBF\u4E3B\u6CA1\u6709\u4E3A\u8BE5\u6BB5\u63D0\u4F9B dynamic \u6807\u8BB0\uFF0C\u65E0\u6CD5\u5224\u65AD\u5B83\u662F\u4E0D\u662F\u8FD0\u884C\u65F6\u52A8\u6001\u6BB5 \u2014\u2014 \u5DF2\u7981\u7528\u52A0\u5165\uFF08\u4E0D\u731C\u6D4B\uFF09\u3002',\n contextsUnsupported: '\u5BBF\u4E3B\u6CA1\u6709\u63D0\u4F9B\u8BE5\u9636\u6BB5\u7684\u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\u6E05\u5355\uFF08baseContexts\uFF09\uFF0C\u65E0\u6CD5\u5728\u8FD9\u91CC\u663E\u9690\uFF1B\u4E0D\u4F2A\u9020\u72B6\u6001\u3002',\n contextsNotReady: '\u4E09\u9636\u6BB5\u88C5\u914D\u5C1A\u672A\u5C31\u7EEA\uFF0C\u65E0\u6CD5\u6267\u884C\u4E0A\u4E0B\u6587\u7684\u4E09\u6001\u540C\u6B65 \u2014\u2014 \u8BF7\u70B9\u300C\u5237\u65B0\u300D\u540E\u91CD\u8BD5\u3002',\n sourceGlobal: '\u5168\u5C40',\n sourcePreset: '\u9884\u8BBE',\n sourceAgent: '\u4F1A\u8BDD',\n sourceExecutor: '\u6267\u884C\u5668',\n sourceWorkspace: '\u5DE5\u4F5C\u533A',\n sourceUnknown: '\u6765\u6E90\u672A\u77E5',\n },\n en: {\n nav: 'Prompt Customizer',\n previewPreset: 'Source: selected mode preset. With a same-preset active session, the prompt inventory and preview show that session\\'s real assembly (including plugin-injected session-level sections); the tool catalog stays on the pure preset assembly.',\n runtimeContexts: 'Runtime contexts (toggleable; the part the host folds into the system prompt)',\n loading: 'Loading\u2026',\n tabsSections: 'Sections',\n tabsTools: 'Tools',\n tabsPresets: 'Presets',\n refresh: 'Refresh',\n blockedOff: 'Active',\n blockedOn: 'Blocked',\n replaced: 'Replaced',\n manual: 'Manual',\n system: 'System',\n replace: 'Replace',\n clearInput: 'Clear',\n injectNew: 'Inject section',\n name: 'Name',\n text: 'Text',\n add: 'Add',\n hiddenOff: 'Visible',\n hiddenOn: 'Hidden',\n empty: '(empty)',\n dynamic: '<dynamic>',\n drag: 'Drag to reorder',\n moveUp: 'Move up',\n moveDown: 'Move down',\n previewHint: 'Final system prompt after block/replace/inject:',\n previewSections: 'sections',\n previewToolCount: 'tools',\n presetName: 'Config name',\n backupTitle: 'Full backup (all prompts / tools)',\n backupHint: 'All preset customizations: prompts, tools, env blocklist and plugin ledgers in one JSON. Restore overwrites current data.',\n backupExport: 'Export full backup',\n backupExportRunning: 'Exporting\u2026',\n backupRestore: 'Restore backup',\n backupRestoreRunning: 'Restoring\u2026',\n backupOk: 'Exported {name}',\n backupFail: 'Backup export failed',\n presetIoTitle: 'Current preset import / export',\n presetIoHint: 'Only the current preset customization (overrides); host preset definitions are not included.',\n presetExport: 'Export current preset',\n presetImport: 'Import into current preset',\n presetIoOk: 'Exported {name}',\n presetIoImported: 'Imported current preset customization',\n presetIoFail: 'Preset import/export failed',\n presetIoBadFormat: 'Not a valid preset customization file',\n presetIoNoTarget: 'Select an agent preset first',\n presetIoConfirm: 'Import the customization into preset \"{target}\" and overwrite its current customization?',\n cleanupEmpty: 'Clean empty overrides',\n cleanupRunning: 'Cleaning\u2026',\n cleanupConfirm: 'Delete all preset overrides whose fields are empty? Non-empty configurations are untouched.',\n cleanupOk: 'Removed {n} empty configurations',\n cleanupFail: 'Cleaning empty overrides failed',\n restoreOk: 'Backup restored',\n restoreFail: 'Restore failed',\n restoreBadFormat: 'Not a valid backup file (format mismatch)',\n restoreConfirm: 'Restoring will overwrite ALL current prompt / tool / ledger data. Continue?',\n save: 'Save',\n import: 'Import',\n apply: 'Apply',\n export: 'Export',\n delete: 'Delete',\n restore: 'Restore',\n active: 'Active',\n preset: 'Preset',\n syncAllPhases: 'Sync phases',\n syncAllPhasesHint: 'When checked, the three phases share one section list (the resident period is the backbone; sections only the other two phases have are appended at the end, and a same-named row follows the phase where it natively exists), and add / remove / reorder / check / text edits are written to all three phases at once. Ticking the box immediately overwrites the other two phases with the resident-period content (written to the edit draft; press Save to apply). Tool hiding / showing and adding back also apply to all three phases. Unchecked (default): handle each phase separately.',\n syncApplied: 'The other two phases were overwritten from the resident period: all three phases now share one section list and text (written to the draft; press Save to apply).',\n syncNotReady: 'The three phase assemblies are not ready (or are empty); cannot sync phases \u2014 press Refresh and retry.',\n syncSkippedDynamic: '\"{names}\" is a runtime-generated dynamic section and cannot be added to the other phases (its content is only known during assembly).',\n broken: 'broken',\n brokenPreset: 'This agent preset cannot mount right now; its customization is still editable and applies once fixed.',\n // agent \u5468\u671F\u4E09\u9636\u6BB5\u7684\u5C55\u793A\u547D\u540D\uFF08\u5F15\u5BFC\u671F \u2192 \u5E38\u9A7B\u671F \u2192 \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002\n phaseStageGuide: 'Guide period',\n phaseStageResident: 'Resident period',\n phaseStageControlled: 'Compaction-controlled period',\n allToolsTitle: 'All system tools',\n allSectionsTitle: 'All system sections',\n toolsFourHint: 'Each of the three periods keeps its own list, with no inheritance: the checkbox = visible to the model in that period; dragging a tool from \"All\" into a period makes it appear there (if the period trims it by default, it is added back); dragging between two periods copies it (the source is untouched, the target gains one, and the hidden/enabled state carries over); dragging it back to \"All\" removes it from that period. Every action touches only the tool you dragged.',\n sectionsFourHint: 'Drag both ways: drop a section from \"All\" onto a period part to enable it there; drag from a part back to \"All\" to remove it from that period. Blocked sections stay fully operable \u2014 they are just not injected.',\n dragHint: 'Drag in to make this tool appear in this period',\n toolAddedTag: 'added',\n toolAdded: 'Added \"{name}\" back to {phase}: the period trims it by default, so it will reappear there once saved (it exists in this preset\u2019s registry).',\n toolNotInRegistry: '\"{name}\" is not in this preset\u2019s registry (it belongs to another preset). There is no definition for it here, so it cannot be added.',\n toolCopied: 'Copied \"{name}\" to {to}: the copy in {from} is left untouched, and its hidden/enabled state carries over.',\n toolRemovedFromPhase: 'Removed \"{name}\" from {from}: an add-back is reverted, a native tool is hidden in that period (still selectable back here).',\n sectionCopied: 'Copied \"{name}\" to {to} (the source {from} is untouched): it is enabled there and can be edited or dragged to reorder.',\n sectionRemoved: 'Removed \"{name}\" from {from}: an added-in section is reverted, a native section becomes blocked (tick it to restore).',\n toolShown: '\"{name}\" is now visible in {to}.',\n toolSyncShown: '\"{name}\" is now visible in all three phases (periods without it in their catalog got it added back).',\n sectionsTakenOver: 'The \"{name}\" section declares a complete takeover (the host restores that single section after the assembly waterfall). This plugin\u2019s forceSections (default on) bypasses that mechanism, so section-level blocking / replacement / injection / ordering still applies; this notice only appears when forceSections is off or the override fails \u2014 enable it to restore.',\n sectionsLost: 'Only {survived} of the {emitted} sections this plugin emitted for this phase reach the final prompt \u2014 the rest are dropped by downstream assembly rules, so section-level customization cannot fully apply (tool filtering is unaffected).',\n sectionDynamicNoAdd: '\"{name}\" is generated at runtime \u2014 it cannot be added to a phase ahead of time (its content is only known during assembly).',\n exportOk: 'Exported',\n exportCancel: 'Export cancelled',\n exportFail: 'Export failed',\n importOk: 'Import complete',\n importNone: 'Nothing imported (duplicate names or empty file)',\n importCancel: 'Import cancelled',\n importFail: 'Import failed',\n saveOk: 'Saved',\n saveFail: 'Save failed',\n discardConfirm: 'You have unsaved changes; leaving will discard them. Leave anyway?',\n forceTitle: 'Force override (forceSections)',\n forceHint: 'When on, final prompt sections follow this plugin only when the current phase has an actual section policy (block / replace / inject / order). With no section customization the host output is kept unchanged, including a complete persona. \"Restore initial state\" turns this off automatically.',\n forceOn: 'On',\n forceOff: 'Off',\n envBlockTitle: 'Environment variable blocklist (envBlocklist)',\n envBlockHint: 'All system environment variables (process.env) are registered as prompt variables: reference them in section text as {{env_lowercase_key}} (e.g. {{env_path}}); keys hit by the blocklist are not registered \u2014 env often carries secrets, and anything in the prompt is sent to the model. Entries support * wildcards, case-insensitive. Built-ins {{date}} {{time}} {{datetime}} {{weekday}} {{hostname}} {{platform}} {{arch}} {{username}} {{home}} {{shell}} {{locale}} {{node_version}} are always available.',\n envBlockAdd: 'Key or wildcard, e.g. GITHUB_TOKEN or *_KEY*',\n envBlockAddAction: 'Add',\n envBlockEmpty: 'Blocklist is empty: every environment variable gets registered',\n envVarsTitle: 'Registered prompt variables',\n envVarsHint: 'Reference {{name}} in section text; an unregistered name fails the whole render (host strict mode).',\n importBlockMerge: ', the file\u2019s env-variable blocklist was merged in (+{count} entries)',\n resetTitle: 'Restore initial state',\n resetHint: 'Clears all customization (blocking / replacement / injection / ordering, per-phase tool catalogs, config snapshots, agent-preset overrides) and turns forceSections off \u2014 every AI conversation goes back to being unaffected by this plugin, equivalent to uninstalling it, without uninstalling or restarting. This cannot be undone; to re-enable customization, turn the \"Force override\" switch above back on.',\n resetConfirm: 'Clear all customization and restore the initial state?\\n\\nThis will delete: block lists, section replacements, injected sections, per-phase tool catalogs, config snapshots, and agent-preset overrides; forceSections will be turned off.\\nAfterwards no AI conversation is affected by this plugin (equivalent to uninstalling).\\nThis cannot be undone.',\n resetAction: 'Clear all customization',\n resetOk: 'Initial state restored: no AI conversation is affected by this plugin anymore',\n resetFail: 'Failed to restore initial state',\n scopeFallback: \"This agent preset's standing scope could not be mounted; what you see is the global layer (not the preset's native sections/tools).\",\n previewFail: 'Assembly for this phase failed (scope mount error or a preset plugin threw); switch target or check the server log.',\n previewToolsHint: 'Tool catalog as the model actually sees it (all assembly rules run for the selected phase, including native phase narrowing):',\n previewToolsCount: 'of registry',\n toolAgentScoped: 'session-level',\n toolAgentScopedHint: 'Registered by a plugin in the agent\\'s own scope (not a preset registry entry). restrict cannot deny scope-local names; this plugin hides it per phase by filtering the assembled tools, so it stays toggleable in the enabled list. With no inherited same-name definition it is not \"masked\" \u2014 the read-only pool lists it as session-level rather than inventing a shadow.',\n toolDescriptionLabel: 'Tool description (read-only)',\n toolPromptSections: 'Prompt sections',\n toolPromptNone: 'No prompt section',\n toolPromptHint: 'The tool\\'s system-prompt section (part 1); tool visibility is controlled separately in the Tools tab. description / JSON Schema are not edited here.',\n toolPromptBadge: 'tool prompt',\n toolPromptToolsLabel: 'Associated tools',\n toolPromptToolsHint: 'Tools served by this prompt section: {tools}',\n toolExecutorScoped: 'executor wrapper',\n toolExecutorScopedHint: 'Provided by the tool executor as a model-facing wrapper (such as PTC run_code), not an ordinary registry tool; it cannot be toggled per phase.',\n toolMaskedByPlugin: 'plugin-masked',\n toolMaskedByPluginHint: 'Present in the preset registry but restricted away by another plugin in the agent scope; this plugin cannot lift that restriction.',\n toolMaskedByShadow: 'shadowed by same name',\n toolMaskedByShadowHint: 'An inherited (global/preset) tool displaced by a plugin tool with the same name registered in the agent scope. This plugin cannot lift it; the model sees only the plugin tool.',\n toolMaskedByOwnPlugin: 'masked by this plugin',\n toolMaskedByOwnPluginHint: 'Hidden by this plugin\\'s MCP tool disable / preset mask / workspace close ledger; re-enable it in the MCP tab.',\n completeCatalogTitle: 'Complete catalog / masked (read-only)',\n completeCatalogHint: 'Tools this plugin cannot toggle per phase: agent-scope registrations, executor wrappers, tools restricted by other plugins, inherited tools displaced by a same-name plugin tool, and tools masked by this plugin\\'s MCP ledgers. They never appear in the enabled list above.',\n workspaceRequired: 'Saving workspace-level requires a current workspace (active session cwd).',\n workspaceNoSession: 'Workspace level: no active session, so the workspace path is unknown; open a session first.',\n // \u72EC\u7ACB\u9762\u677F\uFF08\u4FA7\u8FB9\u680F\u5165\u53E3 + \u62BD\u5C49\u5206\u680F\uFF09\u65B0\u589E\u3002\n close: 'Close',\n filterAll: 'All',\n filterOn: 'Enabled',\n filterOff: 'Disabled',\n targetLabel: 'Edit target (agent preset)',\n targetCustomized: '{n} overridden field(s)',\n agentScoped: 'session-level',\n agentScopedHint: 'This section is registered by a plugin in the active agent\u2019s own scope (not in this preset scope\u2019s registry): the panel enumerates it from the same-preset active agent\u2019s real assembly and shows it in the preview. It is in the system prompt by default, its identity stays stable across sessions as an agent source, and it can be blocked / replaced / reordered like any other row.',\n libraryTitle: 'Config snapshots',\n applyToPreset: 'Apply writes to: preset \"{name}\"',\n applyToWorkspace: 'Apply writes to: workspace \"{name}\"',\n draftBadge: 'Preview includes unsaved draft',\n previewSyncFail: 'Live preview sync failed (retries on next edit, or press Refresh)',\n sectionDynamicUnsupported: 'The host supplies no dynamic marker for this section, so it cannot be told apart from a runtime-generated one \u2014 adding it is disabled rather than guessed.',\n contextsUnsupported: 'The host supplies no runtime-context list (baseContexts) for this phase; visibility cannot be toggled here and no fake state is shown.',\n contextsNotReady: 'The three phase assemblies are not ready; cannot sync contexts across phases \u2014 press Refresh and retry.',\n sourceGlobal: 'Global',\n sourcePreset: 'Preset',\n sourceAgent: 'Session',\n sourceExecutor: 'Executor',\n sourceWorkspace: 'Workspace',\n sourceUnknown: 'Source unknown',\n },\n} as const\n\nexport type Translate = (key: string, params?: Record<string, string | number>) => string\n", "/**\n * prompt \u2014 \u63D0\u793A\u8BCD\u7BA1\u7406\uFF08\u4E0A\u6E38 dsh-prompt-customizer v0.5.1 \u7684\u6D4F\u89C8\u5668\u534A\u8EAB\uFF09\u3002\n *\n * \u8FC1\u79FB\u8303\u56F4\uFF1A\u53EA\u4FDD\u7559\u9762\u677F\u672C\u4F53\uFF08Panel \u4E0E\u5B83\u7684\u5206\u680F / \u9884\u89C8 / \u5FEB\u7167\u5E93\uFF09\u3002\u4E0A\u6E38\u7684\n * \u4FA7\u8FB9\u680F\u5165\u53E3\u4E0E\u62BD\u5C49\u5916\u58F3\uFF08nav.tsx / shell.tsx\uFF09\u7531 triad \u7684\u300C\u63D0\u793A\u8BCD\u300D\u9876\u5C42 tab\n * \u53D6\u4EE3\uFF1B\u5BBF\u4E3B\u8DEF\u7531\u4ECD\u662F /api/prompt-customizer/*\uFF08\u89C1 vendor/prompt-customizer\uFF09\u3002\n *\n * \u4E0E\u4E0A\u6E38\u7684\u552F\u4E00\u5DEE\u5F02\uFF1A\u9762\u677F\u4E0D\u518D\u81EA\u5DF1\u5F00\u7A97\uFF08\u65E0\u5173\u95ED\u6309\u94AE\u3001\u65E0\u906E\u7F69\u4E0E\u4FA7\u680F\u51E0\u4F55\u63A8\u7B97\uFF09\u3002\n */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport { DICT, type Translate } from './locales.ts'\n\n/** \u6587\u6848\u547D\u540D\u7A7A\u95F4\uFF08\u4E0E\u4E0A\u6E38\u4E00\u81F4\uFF0C\u907F\u514D\u4E24\u4EFD\u5B57\u5178\uFF09\u3002 */\nconst NS = 'prompt-customizer'\n\n/** triad \u5BA2\u6237\u7AEF\u4E0A\u4E0B\u6587\u91CC\u672C\u6A21\u5757\u7528\u5230\u7684\u90E8\u5206\u3002 */\ninterface PromptLocaleHost {\n register(namespace: string, dicts: { zh: Record<string, string>; en: Record<string, string> }): unknown\n bind(namespace: string): Translate\n}\n\n/** apply \u65F6\u7ED1\u5B9A\u7684\u7FFB\u8BD1\u51FD\u6570\uFF08\u8DDF\u968F DSH \u5F53\u524D\u8BED\u8A00\uFF09\u3002 */\nlet bound: Translate | undefined\n\n/** \u9762\u677F\u6587\u6848\u51FD\u6570\uFF1AapplyPrompt \u4E4B\u524D\u56DE\u843D\u5230\u4E2D\u6587\u8868\uFF08\u9762\u677F\u4E0D\u4F1A\u56E0\u7F3A\u5C11 locale \u670D\u52A1\u53D8\u7A7A\u767D\uFF09\u3002 */\nexport function promptT(): Translate {\n if (bound !== undefined) return bound\n return (key, params) => {\n let text = (DICT.zh as Record<string, string>)[key] ?? key\n if (params !== undefined) {\n for (const name of Object.keys(params)) text = text.split(`{${name}}`).join(String(params[name]))\n }\n return text\n }\n}\n\n/** \u6CE8\u518C\u6587\u6848\u547D\u540D\u7A7A\u95F4\uFF1B\u9762\u677F\u672C\u4F53\u7531\u300C\u63D0\u793A\u8BCD\u300Dtab \u6E32\u67D3\uFF08\u8FD9\u91CC\u4E0D\u5EFA\u4EFB\u4F55\u5165\u53E3\uFF09\u3002 */\nexport function applyPrompt(ctx: ClientContext): void {\n const locale = (ctx as unknown as { locale?: PromptLocaleHost }).locale\n if (locale === undefined || typeof locale.bind !== 'function') {\n console.warn('[dsh-prompt-customizer] prompt locale unavailable: \u63D0\u793A\u8BCD\u9762\u677F\u56DE\u843D\u4E2D\u6587\u6587\u6848')\n return\n }\n // \u547D\u540D\u7A7A\u95F4\u662F\u63D2\u4EF6\u81EA\u5DF1\u7684\uFF08'prompt-customizer'\uFF09\u3002\u6CE8\u518C\u5931\u8D25\u7EDD\u4E0D\u80FD\u62D6\u57AE\u6574\u6761\u5BA2\u6237\u7AEF\n // \u63D2\u4EF6\u52A0\u8F7D\u94FE\uFF08\u540C\u540D\u6CE8\u518C\u4F1A\u629B\u9519\uFF0C\u4E14\u8C01\u5148\u6CE8\u518C\u8C01\u8BA9\u540E\u6765\u8005\u629B\uFF09\u2014\u2014\u5931\u8D25\u5C31\u56DE\u843D\u63D2\u4EF6\u5185\n // \u81EA\u5E26\u7684 zh \u6587\u6848\uFF0C\u9762\u677F\u7167\u5E38\u80FD\u7528\u3002\n ctx.effect(() => {\n try {\n return locale.register(NS, DICT)\n } catch (error) {\n console.error('[dsh-prompt-customizer] prompt locale register failed:', error)\n return () => {}\n }\n }, 'prompt-customizer: prompt locale')\n try {\n bound = locale.bind(NS)\n } catch (error) {\n console.warn('[dsh-prompt-customizer] prompt locale bind failed, \u56DE\u843D\u4E2D\u6587\u6587\u6848:', error)\n }\n}\n", "/**\r\n * PromptView \u2014 \u300C\u63D0\u793A\u8BCD\u300D\u9876\u5C42 tab \u7684\u5185\u5BB9\u3002\r\n *\r\n * \u76F4\u63A5\u590D\u7528\u4E0A\u6E38\u9762\u677F\u672C\u4F53\uFF08Panel\uFF09\uFF1A\u5355\u9884\u8BBE\u7684\u63D0\u793A\u8BCD / \u5DE5\u5177\u7F16\u8F91\u3001\u4FDD\u5B58 / \u5237\u65B0\u3001\r\n * \u5DE6\u680F\u52FE\u9009 + \u53F3\u680F\u88C5\u914D\u9884\u89C8\uFF1B\u5DE5\u4F5C\u533A\u7EA7\u63D0\u793A\u8BCD/\u5DE5\u5177\u5C42\u5DF2\u5F52\u6863\u4E0B\u7EBF\u3002\r\n */\r\nimport { Panel } from './Panel.tsx'\r\nimport { promptT } from './index.ts'\r\n\r\nexport function PromptView(): JSX.Element {\r\n return (\r\n <div style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\r\n <Panel t={promptT()} />\r\n </div>\r\n )\r\n}\r\n", "/**\n * skills/types \u2014 \u9762\u677F\u62C6\u5206\u540E\u7684\u5171\u4EAB\u6570\u636E\u6A21\u578B\u4E0E\u5E38\u91CF\u3002\n *\n * \u542B\u5404\u9762\u677F\u5171\u7528\u7684\u89C6\u56FE\u72B6\u6001\u7C7B\u578B\u3001\u6280\u80FD/MCP \u7EBF\u534F\u8BAE\u5F62\u72B6\u3001\u6280\u80FD\u5305\u5206\u7C7B\u5E38\u91CF\uFF1B\n * \u53EA\u653E\u7C7B\u578B\u4E0E\u7EAF\u51FD\u6570\uFF0C\u4E0D\u5F15\u5165\u4EFB\u4F55\u8FD0\u884C\u65F6\u4F9D\u8D56\u3002\n */\n/** ---------------------------------------------------------------- \u6570\u636E\u6A21\u578B */\n\nexport interface SkillInfo {\n name: string\n description?: string\n files?: string[]\n fileCount?: number\n compatibility?: string\n /** \u6280\u80FD\u76EE\u5F55\u540D\uFF1A\u4E0E name \u53EF\u4EE5\u4E0D\u4E00\u81F4\uFF08\u624B\u5DE5\u62F7\u76EE\u5F55\u3001\u6539\u540D\u5BFC\u5165\uFF09\uFF0C\u5220\u9664/\u67E5\u770B\u8D70\u5B83\u3002 */\n dir?: string\n /** \u6765\u6E90\u6807\u7B7E\uFF08\u5185\u6838 `SkillSource`\uFF1Auser-agents / project-dsh / bundled / runtime \u2026\uFF09\u3002 */\n root?: string\n /** \u5BBF\u4E3B\u63D0\u4F9B\u7684\u6765\u6E90\u6876\uFF08workspace / global \u6216 `{kind,label}`\uFF09\uFF1B\u7F3A\u7701\u65F6\u6309 `root` \u7684 SkillSource \u6620\u5C04\u3002 */\n origin?: string | { kind?: string; origin?: string; scope?: string; label?: string }\n /** \u5BBF\u4E3B\u63D0\u4F9B\u7684\u6CE8\u518C\u5C42\uFF08workspace / global / project / user\uFF09\uFF1B\u4E0E origin \u4E8C\u9009\u4E00\u3002 */\n scope?: string\n /** \u8BE5\u6280\u80FD\u662F\u5426\u843D\u5728\u53EF\u5199\u6839\uFF08\u51B3\u5B9A\u300C\u5220\u9664\u300D\u80FD\u5426\u771F\u7684\u5220\u6389\u6587\u4EF6\uFF1B\u663E\u9690\u5BF9\u6240\u6709\u6765\u6E90\u4E00\u81F4\uFF09\u3002 */\n deletable?: boolean\n /** \u5185\u6838 invocation \u7B56\u7565\uFF1A\u6A21\u578B\u53EF\u8C03\u7528 / \u7528\u6237\u53EF\u8C03\u7528\uFF08\u4EC5\u5C55\u793A\uFF09\u3002 */\n modelInvocable?: boolean\n userInvocable?: boolean\n}\n\nexport interface BundleInfo {\n id: string\n name: string\n skillCount: number\n skills: SkillInfo[]\n /** \u8D26\u672C\u91CC\u6307\u5411\u5DF2\u6D88\u5931\u6280\u80FD\u7684\u6761\u76EE\uFF08\u9762\u677F\u7ED9\u300C\u6E05\u7406\u5931\u6548\u5F15\u7528\u300D\u5165\u53E3\uFF09\u3002 */\n missingSkills?: string[]\n /** \u6280\u80FD\u5305\u5206\u7C7B\uFF08\u4E00\u4E2A\u5305\u53EF\u6302\u591A\u4E2A\uFF09\uFF1B\u8001\u8D26\u672C\u6CA1\u6709\u8BE5\u5B57\u6BB5\u65F6\u6309\u672A\u5206\u7C7B\u5904\u7406\u3002 */\n categories?: string[]\n}\n\nexport interface SkillSnapshot {\n bundles: BundleInfo[]\n loose: SkillInfo[]\n}\n\nexport type PanelState =\n | { status: 'loading' }\n | { status: 'error' }\n | { status: 'ready'; snapshot: SkillSnapshot }\n/** ---------------------------------------------------------------- \u6280\u80FD\u5305\u5206\u7C7B */\n\n/** \u5206\u7C7B\u7B5B\u9009\u91CC\u4EE3\u8868\u300C\u6CA1\u6302\u4EFB\u4F55\u5206\u7C7B\u7684\u5305\u300D\u7684\u54E8\u5175\u503C\uFF08\u4E0D\u4F1A\u662F\u5408\u6CD5\u5206\u7C7B\u540D\uFF09\u3002 */\nexport const UNCATEGORIZED = '\\u0000none'\n\n/** \u4E00\u4E2A\u6280\u80FD\u5305\u6700\u591A\u6302\u51E0\u4E2A\u5206\u7C7B\uFF08\u4E0E host \u7684 CATEGORY_MAX_PER_BUNDLE \u5BF9\u9F50\uFF09\u3002 */\nexport const MAX_BUNDLE_CATEGORIES = 8\n\n/** \u5206\u7C7B\u4E0D\u505A\u9010\u7C7B\u914D\u8272\uFF1A\u4E00\u4E2A\u9762\u677F\u53EA\u6709\u4E3B\u9898\u84DD\u4E00\u628A\u5237\u5B50\uFF08\u5F69\u8679\u8272\u677F\u5B9E\u6D4B\u592A\u5435\uFF0C\u5DF2\u5426\uFF09\u3002 */\n\n/** \u5206\u7C7B\u540D\u5355\u6392\u5E8F\uFF1A\u6309\u6302\u8F7D\u7684\u5305\u6570\u4ECE\u591A\u5230\u5C11\uFF0C\u540C\u6570\u6309\u540D\u5B57\u3002 */\nexport function sortCategories(counts: Map<string, number>): string[] {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0], 'zh'))\n .map((entry) => entry[0])\n}\n/** \u300C\u5168\u90E8 Agent\u300D\u865A\u62DF\u9884\u8BBE\u7684\u54E8\u5175 id\uFF1A\u7A7A\u4E32\uFF0C\u771F\u5B9E preset id \u7684\u9996\u5B57\u7B26\u5FC5\u987B\u662F a-z0-9\u3002 */\nexport const ALL_PRESETS = ''\n\n/**\n * preset id \u662F\u5426\u5408\u6CD5\uFF1A\u5185\u6838 agent-preset schema \u53EA\u8981\u6C42 string\uFF08\u4EFB\u610F\u975E\u7A7A\uFF09\uFF0C\n * \u4E0D\u80FD\u6309\u76EE\u5F55\u540D\u89C4\u5219\u8FC7\u6EE4\u81EA\u5B9A\u4E49\u9884\u8BBE\u3002\u7A7A\u4E32\u662F `ALL_PRESETS` \u54E8\u5175\uFF0C\u56E0\u6B64\u4E0D\u53EF\u80FD\u4E0E\u771F\u5B9E id \u649E\u4E0A\u3002\n * API \u5C42\u5199 preset \u8D26\u672C\u524D\u7EDF\u4E00\u8D70\u5B83\u6821\u9A8C\u3002\n */\nexport function isValidPresetId(value: string): boolean {\n return value.trim() !== ''\n}\n\n/* ---------------------------------------------------------------- \u6280\u80FD\u6765\u6E90 */\n\n/**\n * \u5185\u6838 `SkillSource` \u679A\u4E3E \u2192 \u9762\u677F\u7684\u4E8C\u6876\u6765\u6E90\u3002\n *\n * \u5BBF\u4E3B\u4EE5\u540E\u82E5\u76F4\u63A5\u5728 `skill.origin` / `skill.scope` \u4E0A\u7ED9\u51FA\u6765\u6E90\u6876\uFF0C\u4F18\u5148\u7528\u663E\u5F0F\u5B57\u6BB5\uFF1B\n * \u5426\u5219\u5728\u8FD9\u91CC\u96C6\u4E2D\u6620\u5C04\u3002\u672A\u77E5\u6765\u6E90\u539F\u6837\u5C55\u793A\uFF08\u4E0D\u731C\u6210 global\uFF09\u3002\n */\nconst SKILL_SOURCE_ORIGINS: Record<string, 'workspace' | 'global'> = {\n 'project-dsh': 'workspace',\n 'project-agents': 'workspace',\n 'user-dsh': 'global',\n 'user-agents': 'global',\n bundled: 'global',\n runtime: 'global',\n custom: 'global',\n // \u5BBF\u4E3B\u663E\u5F0F origin \u5B57\u6BB5\u53EF\u80FD\u76F4\u63A5\u662F\u6876\u540D\u3002\n workspace: 'workspace',\n global: 'global',\n project: 'workspace',\n user: 'global',\n}\n\n/** \u6280\u80FD\u6765\u6E90\u7684\u5C55\u793A\u6A21\u578B\uFF1Aknown \u6876\u7528\u672C\u5730\u5316\u6587\u6848\uFF0Cunknown \u539F\u6837\u663E\u793A source\u3002 */\nexport type SkillOrigin =\n | { kind: 'workspace' | 'global'; label?: undefined }\n | { kind: 'unknown'; label: string }\n\n/**\n * \u89E3\u6790\u4E00\u4E2A\u6280\u80FD\u7684\u6765\u6E90\u6876\u3002\n * @param skill - \u6280\u80FD\u6458\u8981\u3002\n * @returns \u65E0\u6765\u6E90\u5B57\u6BB5\u65F6 undefined\uFF1B\u672A\u77E5\u6765\u6E90\u8FD4\u56DE kind=unknown + \u539F\u59CB\u6807\u7B7E\u3002\n */\nexport function skillOriginOf(skill: SkillInfo): SkillOrigin | undefined {\n const raw = skill.origin ?? skill.scope\n if (typeof raw === 'string' && raw.trim() !== '') {\n const mapped = SKILL_SOURCE_ORIGINS[raw.trim()]\n return mapped === undefined ? { kind: 'unknown', label: raw.trim() } : { kind: mapped }\n }\n if (typeof raw === 'object' && raw !== null) {\n const bucket = [raw.kind, raw.origin, raw.scope]\n .find((value): value is string => typeof value === 'string' && value.trim() !== '')\n const label = typeof raw.label === 'string' && raw.label.trim() !== '' ? raw.label.trim() : undefined\n if (bucket !== undefined) {\n const mapped = SKILL_SOURCE_ORIGINS[bucket.trim()]\n return mapped === undefined ? { kind: 'unknown', label: label ?? bucket.trim() } : { kind: mapped }\n }\n if (label !== undefined) return { kind: 'unknown', label }\n }\n if (skill.root === undefined || skill.root.trim() === '') return undefined\n const source = skill.root.trim()\n const mapped = SKILL_SOURCE_ORIGINS[source]\n return mapped === undefined ? { kind: 'unknown', label: source } : { kind: mapped }\n}\n\n/* ---------------------------------------------------------------- \u6280\u80FD\u5F00\u5173\u4F5C\u7528\u57DF */\n\n/** \u6280\u80FD\u5F00\u5173\u7684\u7F16\u8F91\u5C42\u7EA7\u3002 */\nexport type SkillLevel = 'preset' | 'workspace'\n\n/**\n * \u6280\u80FD\u5F00\u5173\u7684\u5B8C\u6574\u4F5C\u7528\u57DF\uFF1A\u5C42\u7EA7 + \u9884\u8BBE + \u5DE5\u4F5C\u533A\uFF08\u6309 cwd\uFF09\u3002\n * \u300C\u6309\u94AE\u663E\u793A\u300D\u4E0E\u300C\u6309\u94AE\u52A8\u4F5C\u300D\u5171\u7528\u540C\u4E00\u4E2A\u5BF9\u8C61\uFF0C\u907F\u514D\u4E24\u5C42\u5404\u8BFB\u4E00\u5957\u72B6\u6001\u3002\n */\nexport interface SkillEnableScope {\n level: SkillLevel\n presetId: string\n cwd: string | null\n}\n\n/** \u4E09\u5C42\u5F00\u5173\u8D26\u672C\uFF08\u7531 /api/skill-toggles \u7CFB\u5217\u63A5\u53E3\u63D0\u4F9B\uFF09\u3002 */\nexport interface SkillEnableTables {\n /** \u5168\u5C40\u5C42\uFF1Aname \u2192 enabled\u3002 */\n skills: Record<string, boolean>\n /** \u9884\u8BBE\u5C42\uFF1ApresetId \u2192 name \u2192 enabled\uFF08\u663E\u5F0F false = \u8BE5\u9884\u8BBE\u4E0B\u5173\u95ED\uFF09\u3002 */\n overrides: Record<string, Record<string, boolean>>\n /** \u5DE5\u4F5C\u533A\u5C42\uFF1Acwd \u2192 name \u2192 enabled\uFF08\u663E\u5F0F true \u53EF\u8986\u76D6\u9884\u8BBE/\u5168\u5C40\u7684\u5173\u95ED\uFF09\u3002 */\n workspaceOverrides: Record<string, Record<string, boolean>>\n /** \u6307\u5B9A workspace \u7684\u751F\u6548\u57FA\u5EA7\uFF08global + workspace\uFF0C\u4E0D\u542B preset \u8986\u76D6\uFF09\u3002 */\n workspaceSkills?: Record<string, boolean>\n}\n\n/**\n * \u67D0\u4F5C\u7528\u57DF\u4E0B\u4E00\u4E2A\u6280\u80FD\u7684\u5F00\u5173\u503C\u3002\n *\n * \u5BBF\u4E3B\u95F8\u95E8\u7684\u771F\u5B9E\u4F18\u5148\u7EA7\u662F\u300C\u5DE5\u4F5C\u533A > \u9884\u8BBE > \u5168\u5C40\u300D\uFF1A\u5DE5\u4F5C\u533A\u663E\u5F0F true \u4E5F\u80FD\u6253\u5F00\n * \u9884\u8BBE/\u5168\u5C40\u5173\u6389\u7684\u6280\u80FD\uFF0C\u6240\u4EE5\u8FD9\u91CC\u4E0D\u80FD\u7528\u300C\u5168\u5C40 false \u4E00\u7968\u5426\u51B3\u300D\u7684\u65E7\u6A21\u578B\u3002\n *\n * @param scope - \u7F16\u8F91\u4F5C\u7528\u57DF\u3002\n * @param name - \u6280\u80FD\u540D\u3002\n * @param tables - \u4E09\u5C42\u8D26\u672C\u3002\n * @returns \u8BE5\u4F5C\u7528\u57DF\u4E0B\u662F\u5426\u542F\u7528\u3002\n */\nexport function enabledStateAt(scope: SkillEnableScope, name: string, tables: SkillEnableTables): boolean {\n if (scope.level === 'workspace' && scope.cwd !== null) {\n const workspace = tables.workspaceOverrides[scope.cwd] ?? {}\n if (Object.hasOwn(workspace, name)) return workspace[name] !== false\n const workspaceBase = tables.workspaceSkills?.[name]\n if (workspaceBase !== undefined) return workspaceBase !== false\n }\n if (scope.presetId !== ALL_PRESETS) {\n const preset = tables.overrides[scope.presetId] ?? {}\n if (Object.hasOwn(preset, name)) return preset[name] !== false\n }\n return tables.skills[name] !== false\n}\n\n/**\n * \u8BE5\u4F5C\u7528\u57DF\u5B9E\u9645\u4F1A\u5199\u5165/\u6E05\u7406\u7684\u90A3\u5C42\u8986\u76D6\u8868\uFF08\u7528\u4E8E\u300C\u6E05\u7A7A\u5355\u72EC\u8BBE\u7F6E\u300D\u6309\u94AE\u7684\u663E\u793A\uFF09\u3002\n *\n * @param scope - \u7F16\u8F91\u4F5C\u7528\u57DF\u3002\n * @param tables - \u4E09\u5C42\u8D26\u672C\u3002\n * @returns \u8BE5\u4F5C\u7528\u57DF\u7684\u8986\u76D6\u8868\uFF1B\u300C\u5168\u90E8 Agent\u300D\u6216\u5DE5\u4F5C\u533A\u672A\u5B9A\u65F6\u4E3A\u7A7A\u8868\u3002\n */\nexport function skillOverridesAt(\n scope: SkillEnableScope,\n tables: SkillEnableTables,\n): Record<string, boolean> {\n if (scope.level === 'workspace') {\n return scope.cwd === null ? {} : (tables.workspaceOverrides[scope.cwd] ?? {})\n }\n return scope.presetId === ALL_PRESETS ? {} : (tables.overrides[scope.presetId] ?? {})\n}\n\n/**\n * \u6280\u80FD\u5305\u662F\u5426\u9700\u8981\u5728\u5217\u8868\u91CC\u4FDD\u7559\u4E00\u884C\u3002\n *\n * \u7A7A\u5305\u5FC5\u987B\u4FDD\u7559\uFF08\u5426\u5219\u65B0\u5EFA\u540E\u65E0\u5904\u53EF\u70B9\uFF09\uFF1B\u8D26\u672C\u91CC\u7684\u6210\u5458\u5168\u90E8\u5931\u6548\uFF08missingSkills>0\uFF09\n * \u7684\u5305\u4E5F\u5FC5\u987B\u4FDD\u7559\uFF0C\u5426\u5219\u7528\u6237\u770B\u4E0D\u5230\u300C\u6E05\u7406\u5931\u6548\u5F15\u7528\u300D\u5165\u53E3\u3002\u53EA\u6709\u771F\u6B63\u5E26\u7B5B\u9009\u6761\u4EF6\u65F6\uFF0C\n * \u624D\u5141\u8BB8\u9690\u85CF\u300C\u6CA1\u6709\u6210\u5458\u3001\u4E5F\u6CA1\u6709\u5931\u6548\u5F15\u7528\u3001\u4E5F\u4E0D\u662F\u7A7A\u5305\u300D\u7684\u5305\u3002\n *\n * @param bundle - \u6280\u80FD\u5305\u3002\n * @param filtering - \u5F53\u524D\u662F\u5426\u5E26\u641C\u7D22/\u72B6\u6001\u7B5B\u9009\u3002\n * @returns \u662F\u5426\u6E32\u67D3\u8BE5\u6280\u80FD\u5305\u3002\n */\nexport function bundleVisibleInList(\n bundle: Pick<BundleInfo, 'skills' | 'skillCount' | 'missingSkills'>,\n filtering: boolean,\n): boolean {\n return bundle.skills.length > 0\n || (bundle.missingSkills?.length ?? 0) > 0\n || (bundle.skillCount === 0 && !filtering)\n}\nexport type ConfirmState =\n | { kind: 'bundle'; bundle: BundleInfo }\n | { kind: 'skill'; name: string; dir?: string }\nexport type InstallState =\n | { archive: true; name: string; data: string; folderName: string }\n | { archive?: false; files: CollectedFile[]; folderName: string }\nexport type ViewerState = { skill: SkillInfo; file: string; loading: boolean; error?: string; content?: string }\n/** \u6536\u96C6\u5230\u7684\u4E00\u4E2A\u5F85\u5B89\u88C5\u6587\u4EF6\uFF1A\u76F8\u5BF9\u6280\u80FD\u6839\u7684\u8DEF\u5F84 + \u6D4F\u89C8\u5668 File \u53E5\u67C4\u3002 */\nexport interface CollectedFile { path: string; file: File }\nexport type InstallInput =\n | { archive: string; description: string; bundleId?: string; scope?: AddScope; workspace?: string }\n | { skillName: string; description: string; bundleId?: string; scope?: AddScope; workspace?: string; files: Array<{ path: string; data: string }> }\n\n/**\n * \u6DFB\u52A0\u5165\u53E3\u7684\u4F5C\u7528\u57DF\uFF1A`global`\uFF08~/.agents/skills\u3001profile patch\uFF0C\u6240\u6709\u5DE5\u4F5C\u533A\u5171\u7528\uFF09\n * \u6216 `workspace`\uFF08\u6280\u80FD\u5199\u8FDB\u5F53\u524D\u5DE5\u4F5C\u533A\u7684 `.agents/skills`\uFF0CMCP \u5199\u8FDB\u9879\u76EE\u6839\u7684\n * `.mcp.json` \u2014\u2014 \u4E3B\u6D41 agent \u901A\u7528\u683C\u5F0F\uFF09\u3002\n * \u9ED8\u8BA4 global\u3002\n */\nexport type AddScope = 'global' | 'workspace'\n\n/** \u5065\u5EB7\u626B\u63CF\u7684\u5C55\u793A\u6A21\u578B\uFF08\u9876\u680F\u5065\u5EB7\u6307\u793A\u7684 tone / \u6587\u6848 / \u60AC\u505C\u8BE6\u60C5\uFF09\u3002 */\nexport interface HealthViewModel {\n tone: string\n label: string\n title: string\n}\n\n/** \u6280\u80FD\u76EE\u5F55\u5065\u5EB7\u68C0\u67E5\uFF08/api/skill-health \u54CD\u5E94\uFF0Chost \u53EA\u8BFB\u626B\u63CF\uFF09\u3002 */\nexport interface HealthIssue {\n level: 'error' | 'warn'\n code: string\n skill?: string\n bundle?: string\n message: string\n}\n\nexport interface HealthReport {\n ok: boolean\n healthy: number\n issues: HealthIssue[]\n}\n\n/** \u540C\u6B65\u72B6\u6001\u5361\u7684\u5C55\u793A\u6001\u3002 */\nexport type HealthView =\n | { state: 'loading' }\n | { state: 'ok'; report: HealthReport }\n | { state: 'issue'; report: HealthReport }\n | { state: 'unavailable' }\n\n/** \u6280\u80FD\u5F00\u5173\u72B6\u6001(/api/skill-toggles/status \u54CD\u5E94)\u3002 */\nexport interface ToggleStatus {\n skills: Record<string, boolean>\n bundles: Record<string, boolean>\n}\n\n/** \u4E00\u4E2A Agent \u9884\u8BBE(host \u4ECE ctx.agentPresets.list() \u6295\u5F71\u800C\u6765)\u3002 */\nexport interface PresetRow {\n id: string\n trust: 'system' | 'user'\n isDefault?: boolean\n name?: string\n description?: string\n order?: number\n}\n\n/** /api/skill-toggles/presets \u54CD\u5E94:\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5168\u5C40\u5C42\u72B6\u6001\u3002 */\nexport interface PresetStatus extends ToggleStatus {\n presets: PresetRow[]\n /** presetId \u2192 { skillName: false } \u2014\u2014 \u53EA\u6709\u663E\u5F0F false \u624D\u662F\u300C\u8BE5\u9884\u8BBE\u4E0B\u5173\u95ED\u300D\u3002 */\n overrides: Record<string, Record<string, boolean>>\n /** \u6307\u5B9A workspace \u7684\u751F\u6548\u57FA\u5EA7\uFF0C\u8865\u9F50 workspace \u72EC\u6709\u6280\u80FD\u3002 */\n workspaceSkills?: Record<string, boolean>\n workspaceBundles?: Record<string, boolean>\n}\n\n", "/**\n * skills/api \u2014 /api/skill-manager \u4E0E /api/skill-toggles \u7684\u7C7B\u578B\u5316\u8BF7\u6C42\u5C01\u88C5\u3002\n */\nimport {\n isValidPresetId,\n type HealthReport, type HealthView, type InstallInput, type PresetStatus, type SkillSnapshot, type ToggleStatus,\n} from './types.js'\n/** ---------------------------------------------------------------- API */\n\nexport const SKILL_API_BASE = '/api/skill-manager'\n\n/**\n * \u5199\u9884\u8BBE\u8D26\u672C\u524D\u7684 API \u5C42\u6821\u9A8C\uFF1A\u7A7A\u4E32\u662F\u300C\u5168\u90E8 Agent\u300D\u54E8\u5175\uFF0C\u7EDD\u4E0D\u80FD\u843D\u6210\u771F\u5B9E preset id\u3002\n * @param presetId - \u76EE\u6807\u9884\u8BBE id\u3002\n */\nexport function assertPresetId(presetId: string): void {\n if (!isValidPresetId(presetId)) throw new Error(`invalid preset id: ${JSON.stringify(presetId)}`)\n}\n\nexport async function skillRequest<T>(path: string, options?: RequestInit): Promise<T> {\n const response = await fetch(SKILL_API_BASE + path, options)\n const body = (await response.json().catch(() => ({}))) as T & { error?: string }\n if (!response.ok) throw new Error(body.error || 'request failed (' + String(response.status) + ')')\n return body\n}\n\nexport const skillApi = {\n /** \u6280\u80FD\u5FEB\u7167\uFF1B`cwd` \u6307\u5B9A\u5DE5\u4F5C\u533A\uFF08\u7F3A\u7701\u6309\u5F53\u524D\u4F1A\u8BDD\uFF09\u3002 */\n list: (cwd?: string | null): Promise<SkillSnapshot> => skillRequest<SkillSnapshot>(\n cwd === undefined || cwd === null || cwd === '' ? '/list' : `/list?cwd=${encodeURIComponent(cwd)}`,\n { headers: { accept: 'application/json' } },\n ),\n /** \u53EF\u9009\u5DE5\u4F5C\u533A\u6E05\u5355\uFF08\u9762\u677F\u9876\u680F\u9009\u62E9\u5668\uFF09\u3002 */\n workspaces: (): Promise<{ workspaces: string[]; current?: string | null }> =>\n skillRequest<{ workspaces: string[]; current?: string | null }>('/workspaces', { headers: { accept: 'application/json' } }),\n toggleStatus: (cwd?: string | null): Promise<ToggleStatus> =>\n fetch(cwd === undefined || cwd === null || cwd === ''\n ? '/api/skill-toggles/status'\n : `/api/skill-toggles/status?workspace=${encodeURIComponent(cwd)}`, { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<ToggleStatus & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || body.skills === undefined) {\n throw new Error('toggle status unavailable')\n }\n return body as ToggleStatus\n }),\n setSkillEnabled: (name: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/skills/${encodeURIComponent(name)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n setBundleEnabled: (bundleId: string, enabled: boolean): Promise<{ ok: boolean; handled?: number }> =>\n fetch(`/api/skill-toggles/bundles/${encodeURIComponent(bundleId)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string; handled?: number }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n /** \u9884\u8BBE\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5168\u5C40\u5C42\u72B6\u6001(\u4E00\u6B21\u62C9\u9F50)\u3002 */\n presetStatus: (cwd?: string | null): Promise<PresetStatus> =>\n fetch(cwd === undefined || cwd === null || cwd === ''\n ? '/api/skill-toggles/presets'\n : `/api/skill-toggles/presets?workspace=${encodeURIComponent(cwd)}`, { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<PresetStatus & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray(body.presets)) {\n throw new Error('preset status unavailable')\n }\n return body as PresetStatus\n }),\n setPresetSkillEnabled: (presetId: string, name: string, enabled: boolean): Promise<{ ok: boolean }> => {\n assertPresetId(presetId)\n return fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/skills/${encodeURIComponent(name)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n })\n },\n setPresetBundleEnabled: (presetId: string, bundleId: string, enabled: boolean): Promise<{ ok: boolean }> => {\n assertPresetId(presetId)\n return fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/bundles/${encodeURIComponent(bundleId)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n })\n },\n resetPreset: (presetId: string): Promise<{ ok: boolean }> => {\n assertPresetId(presetId)\n return fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/reset`, {\n method: 'POST',\n headers: { accept: 'application/json' },\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'reset failed')\n return body\n })\n },\n /** \u5DE5\u4F5C\u533A\u7EA7\u5F00\u5173\uFF1A\u5168\u90E8\u5DE5\u4F5C\u533A\u8986\u76D6\uFF08\u6309 cwd\uFF09\u3002 */\n workspaceStatus: (): Promise<{ workspaces: Record<string, Record<string, boolean>> }> =>\n fetch('/api/skill-toggles/workspaces', { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<{ workspaces?: Record<string, Record<string, boolean>>; error?: string }>)\n .then((body) => {\n if (body.error) throw new Error(body.error)\n return { workspaces: body.workspaces ?? {} }\n }),\n setWorkspaceSkillEnabled: (cwd: string, name: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/workspaces/${encodeURIComponent(cwd)}/skills/${encodeURIComponent(name)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n setWorkspaceBundleEnabled: (cwd: string, bundleId: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/workspaces/${encodeURIComponent(cwd)}/bundles/${encodeURIComponent(bundleId)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n /** \u6E05\u7A7A\u67D0\u5DE5\u4F5C\u533A\u7684\u5168\u90E8\u6280\u80FD\u5F00\u5173\u8986\u76D6\uFF08\u6309 cwd\uFF0C\u56DE\u843D\u9884\u8BBE/\u5168\u5C40\uFF09\u3002 */\n resetWorkspace: (cwd: string): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/workspaces/${encodeURIComponent(cwd)}/reset`, {\n method: 'POST',\n headers: { accept: 'application/json' },\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'reset failed')\n return body\n }),\n createBundle: (name: string, categories: string[] = []): Promise<Record<string, never>> =>\n skillRequest('/bundles', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ name, categories }) }),\n renameBundle: (bundleId: string, name: string): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'PATCH', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ name }) }),\n /** \u53EA\u6539\u5206\u7C7B\u7684 PATCH\uFF1Ahost \u4FA7 name \u7F3A\u7701\u5373\u4FDD\u6301\u539F\u503C\uFF0C\u4E0D\u5FC5\u56DE\u4F20\u5305\u540D\u3002 */\n setBundleCategories: (bundleId: string, categories: string[]): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'PATCH', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ categories }) }),\n deleteBundle: (bundleId: string): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'DELETE', headers: { accept: 'application/json' } }),\n setBundleSkills: (bundleId: string, skillNames: string[]): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}/skills`, { method: 'PUT', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ skillNames }) }),\n deleteSkill: (name: string): Promise<Record<string, never>> =>\n skillRequest(`/skills/${encodeURIComponent(name)}`, { method: 'DELETE', headers: { accept: 'application/json' } }),\n installSkill: (input: InstallInput): Promise<{ name?: string; dir?: string; renamed?: boolean }> =>\n skillRequest('/skills', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify(input) }),\n /** \u6280\u80FD\u76EE\u5F55\u5065\u5EB7\u68C0\u67E5\uFF1A\u53EA\u8BFB\u626B\u63CF\uFF08\u7F3A SKILL.md / frontmatter \u65E0\u6548 / \u540D\u79F0\u4E0D\u4E00\u81F4 / \u8D26\u672C\u60AC\u6302\u5F15\u7528\uFF09\u3002 */\n health: (): Promise<HealthReport> =>\n fetch('/api/skill-health', { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<HealthReport & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray(body.issues)) {\n throw new Error('health unavailable')\n }\n return body as HealthReport\n }),\n}\n", "/**\n * skills/files \u2014 \u6280\u80FD\u6587\u4EF6\u5939/\u538B\u7F29\u5305\u6536\u96C6\uFF08webkitGetAsEntry \u9012\u5F52\u76EE\u5F55 + base64 \u7F16\u7801\uFF09\u3002\n */\nimport type { CollectedFile } from './types.js'\n/** ---------------------------------------------------------------- \u6587\u4EF6\u6536\u96C6 */\n\nexport function readEntryFile(entry: FileSystemFileEntry): Promise<File> {\n return new Promise((resolve, reject) => {\n entry.file(resolve, reject)\n })\n}\n\nexport async function collectEntry(entry: FileSystemEntry, prefix: string, out: CollectedFile[]): Promise<void> {\n if (entry.isFile) {\n const fileEntry = entry as FileSystemFileEntry\n const file = await readEntryFile(fileEntry)\n const path = prefix === '' ? entry.name : `${prefix}/${entry.name}`\n out.push({ path, file })\n return\n }\n if (entry.isDirectory) {\n const dirEntry = entry as FileSystemDirectoryEntry\n const reader = dirEntry.createReader()\n const all: FileSystemEntry[] = []\n while (true) {\n const batch = await new Promise<FileSystemEntry[]>((resolve, reject) => {\n reader.readEntries(resolve, reject)\n })\n if (batch.length === 0) break\n all.push(...batch)\n }\n const nextPrefix = prefix === '' ? entry.name : `${prefix}/${entry.name}`\n for (const child of all) await collectEntry(child, nextPrefix, out)\n }\n}\n\nexport function fileToBase64(file: File): Promise<string> {\n return file.arrayBuffer().then((buffer) => {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n const chunkSize = 32768\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize))\n }\n return btoa(binary)\n })\n}\n", "/**\n * skills/GuidePanel \u2014 \u53F3\u4FA7\u300C\u5FEB\u901F\u4E0A\u624B\u300D\u6D6E\u5C42\u5361\uFF08portal \u5230 body\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09\u3002\n */\nimport { createPortal } from 'react-dom'\nimport {\n IconChevronRightOutlineRegular, IconCloseOutlineRegular, IconSkillOutlineRegular,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ArrowRightIcon, CheckIcon, GuideArtIcon, GuideArtIconSmall } from './icons.js'\nimport { css } from './styles.js'\n/** ---------------------------------------------------------------- \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u9762\u677F\uFF08\u53F3\u4FA7\u680F\uFF09 */\n\n/** \u80FD\u529B\u5C0F\u5361\u56FE\u6807\uFF08stroke currentColor\uFF09\u3002 */\nexport function CapIcon({ kind, size = 17 }: { kind: 'ui' | 'code' | 'doc' | 'data' | 'tool'; size?: number }): JSX.Element {\n const common = { width: size, height: size, viewBox: '0 0 24 24', 'aria-hidden': true } as const\n const s = { fill: 'none', stroke: 'currentColor', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round' } as const\n if (kind === 'ui') {\n return (\n <svg {...common} {...s}><rect x=\"4\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"13.5\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"4\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"13.5\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /></svg>\n )\n }\n if (kind === 'code') {\n return (\n <svg {...common} {...s}><path d=\"M9 7.5 5.5 12 9 16.5M15 7.5 18.5 12 15 16.5\" /></svg>\n )\n }\n if (kind === 'doc') {\n return (\n <svg {...common} {...s}><path d=\"M6.5 4.5h7l4 4v11h-11Z\" /><path d=\"M13.5 4.5v4h4M9 13h6M9 16h4.5\" /></svg>\n )\n }\n if (kind === 'data') {\n return (\n <svg {...common} {...s}><path d=\"M5 19h14M7 16v-5M12 16V8M17 16v-8.5\" /></svg>\n )\n }\n return (\n <svg {...common} {...s}><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" /></svg>\n )\n}\n\n/** \u53F3\u4FA7\u6307\u5357\u6D6E\u5C42\u5361\uFF08\u70B9\u51FB\u300C\u5F00\u59CB\u5B66\u4E60\u300D\u51FA\u73B0\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF1B\u53C2\u8003\u8BBE\u8BA1\u7A3F\u7A84\u680F\u5185\u5BB9\uFF09\u3002 */\nexport function GuidePanel({ t, onClose, left, top, height }: {\n t: (key: string) => string\n onClose: () => void\n left: number\n top: number\n height: number\n}): JSX.Element {\n const caps: Array<[string, 'ui' | 'code' | 'doc' | 'data' | 'tool']> = [\n [t('guideCapUi'), 'ui'], [t('guideCapCode'), 'code'], [t('guideCapDoc'), 'doc'],\n [t('guideCapData'), 'data'], [t('guideCapTool'), 'tool'],\n ]\n const steps: Array<[number, string, string]> = [\n [1, t('guideStep1'), t('guideStep1Desc')],\n [2, t('guideStep2'), t('guideStep2Desc')],\n [3, t('guideStep3'), t('guideStep3Desc')],\n [4, t('guideStep4'), t('guideStep4Desc')],\n ]\n const bests = [t('guideBest1'), t('guideBest2'), t('guideBest3'), t('guideBest4')]\n return createPortal(\n <aside\n className={css.guidePanel}\n role=\"complementary\"\n aria-label={t('guidePanelTitle')}\n style={{ left, top, height }}\n >\n <div className={css.guidePanelHead}>\n <span className={css.guidePanelLogo}><GuideArtIconSmall /></span>\n <span className={css.guidePanelTitle}>{t('guidePanelTitle')}</span>\n <button type=\"button\" className={css.guidePanelClose} aria-label={t('guideClose')} onClick={onClose}>\n <IconCloseOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div className={css.guidePanelBody}>\n {/* \u4EC0\u4E48\u662F Skill */}\n <section className={css.guideSec}>\n <div className={css.guideSecHead}>\n <span className={css.guideSecIcon}><IconSkillOutlineRegular size={14} aria-hidden=\"true\" /></span>\n <span className={css.guideSecTitle}>{t('guideWhat')}</span>\n </div>\n <p className={css.guideWhatDesc}>{t('guideWhatDesc')}</p>\n <div className={css.guideCaps}>\n {caps.map(([label, kind]) => (\n <span key={label} className={css.guideCap}>\n <span className={css.guideCapIcon}><CapIcon kind={kind} /></span>\n <span className={css.guideCapLabel}>{label}</span>\n </span>\n ))}\n </div>\n </section>\n\n {/* \u56DB\u6B65\u6D41\u7A0B */}\n <section className={css.guideSec}>\n {steps.map(([num, title, desc]) => (\n <div key={num} className={css.guideStep}>\n <span className={css.guideStepNum}>{num}</span>\n <div className={css.guideStepBody}>\n <div className={css.guideStepTitleRow}>\n <span className={css.guideStepTitle}>{title}</span>\n <IconChevronRightOutlineRegular className={css.guideStepArrow} size={12} aria-hidden=\"true\" />\n </div>\n <p className={css.guideStepDesc}>{desc}</p>\n </div>\n </div>\n ))}\n </section>\n\n {/* \u6700\u4F73\u5B9E\u8DF5 */}\n <section className={css.guideBest}>\n <div className={css.guideBestTitle}>{t('guideBest')}</div>\n <ul className={css.guideBestList}>\n {bests.map((item) => (\n <li key={item} className={css.guideBestItem}>\n <CheckIcon />\n {item}\n </li>\n ))}\n </ul>\n <button type=\"button\" className={css.guideMoreBtn} onClick={onClose}>\n <span>{t('guideMoreBest')}</span>\n <ArrowRightIcon size={12} />\n </button>\n <span className={css.guideBestArt} aria-hidden=\"true\"><GuideArtIcon /></span>\n </section>\n </div>\n </aside>,\n document.body,\n )\n}\n", "/**\n * skills/icons \u2014 \u9762\u677F\u81EA\u7ED8\u56FE\u6807\uFF1A\u7EDF\u8BA1\u5361\u5B9E\u5FC3\u56FE\u6807 + Skills Hub \u7EBF\u6027\u56FE\u6807\uFF08Feather \u98CE\uFF09\u3002\n */\n/** ---------------------------------------------------------------- \u7EDF\u8BA1\u5361\u56FE\u6807\uFF08\u5B9E\u5FC3\u6E10\u53D8\uFF0C\u4E0E\u8BBE\u8BA1\u7A3F\u4E00\u81F4\uFF09 */\n\n/** \u84DD\u8272\u5B9E\u5FC3\u7ACB\u65B9\u4F53\uFF08\u7BA1\u7406\u7684\u6280\u80FD\uFF09\u3002 */\nexport function StatCubeIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M12 3 20.4 7.4 12 11.8 3.6 7.4Z\" fill=\"#6C92FF\" />\n <path d=\"M12 11.8 20.4 7.4v9.2L12 21Z\" fill=\"#2A55F2\" />\n <path d=\"M12 11.8 3.6 7.4v9.2L12 21Z\" fill=\"#174BFC\" />\n <path d=\"M12 3 20.4 7.4 12 11.8 3.6 7.4Z\" fill=\"none\" stroke=\"#FFFFFF\" strokeWidth=\"0.9\" strokeLinejoin=\"round\" opacity=\".9\" />\n </svg>\n )\n}\n\n/** \u7EFF\u8272\u5B9E\u5FC3\u5706 + \u767D\u8272\u5BF9\u52FE\uFF08\u5168\u5C40\u542F\u7528\uFF09\u3002 */\nexport function StatCheckCircleIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9.4\" fill=\"#0FC566\" />\n <path d=\"M7.9 12.3 10.7 15.1 16.2 9.2\" fill=\"none\" stroke=\"#FFFFFF\" strokeWidth=\"2.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/** \u7D2B\u8272\u5B9E\u5FC3\u5706\u89D2\u65B9\u5757 + \u767D\u8272\u5185\u683C\uFF08\u6563\u88C5\u6280\u80FD\uFF09\u3002 */\nexport function StatSquareIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <rect x=\"4.2\" y=\"4.2\" width=\"15.6\" height=\"15.6\" rx=\"3.2\" fill=\"#6C33F2\" />\n <path d=\"M7.8 7.8h8.4v8.4H7.8Z\" fill=\"#FFFFFF\" opacity=\".92\" />\n <path d=\"M7.8 7.8h4.2v4.2H7.8ZM12 12h4.2v4.2H12Z\" fill=\"#6C33F2\" />\n </svg>\n )\n}\n\n/** \u6A59\u8272\u5B9E\u5FC3\u5FC3\u5F62 + \u767D\u8272\u9AD8\u5149\u70B9\uFF08\u6280\u80FD\u5065\u5EB7\uFF09\u3002 */\nexport function StatHeartIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M12 20.6C7.2 17.2 3.9 14 3.9 10.2 3.9 7.3 6.2 5.2 8.8 5.2c1.4 0 2.6.6 3.2 1.6.6-1 1.8-1.6 3.2-1.6 2.6 0 4.9 2.1 4.9 5 0 3.8-3.3 7-8.1 10.4z\" fill=\"#F4502A\" />\n <circle cx=\"8.9\" cy=\"9.3\" r=\"1.6\" fill=\"#FFFFFF\" opacity=\".95\" />\n </svg>\n )\n}\n\n/** ---------------------------------------------------------------- \u5DE6\u680F/\u5DE5\u5177\u680F\u5C0F\u56FE\u6807\uFF08\u7EBF\u6846\u98CE\u683C currentColor\uFF09 */\n\nexport function catStroke(): { fill: 'none'; stroke: 'currentColor'; strokeWidth: number; strokeLinecap: 'round'; strokeLinejoin: 'round' } {\n return { fill: 'none', stroke: 'currentColor', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round' }\n}\n\n/** \u5168\u90E8\uFF1A\u84DD\u65B9\u5185\u767D\u56DB\u683C\uFF08active \u4E3B\u5BFC\u8272\uFF09\u3002 */\nexport function CatAllIcon({ size = 16 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"4.5\" fill=\"currentColor\" />\n <path d=\"M9.2 9.2h5.6v5.6H9.2Z\" fill=\"#FFFFFF\" opacity=\".92\" />\n </svg>\n )\n}\n\n/** \u5C0F\u9501\uFF1A\u8BE5\u5DE5\u5177\u5728\u300C\u5168\u90E8 Agent\u300D\u5C42\u88AB\u505C\u7528\uFF08\u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF0C\u9884\u8BBE\u5C42\u4E0D\u53EF\u62E8\u52A8\uFF09\u3002 */\nexport function LockGlyph({ size = 10 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()} strokeWidth={2}>\n <rect x=\"5\" y=\"10.5\" width=\"14\" height=\"9\" rx=\"2.4\" />\n <path d=\"M8.2 10.5V8.4a3.8 3.8 0 0 1 7.6 0v2.1\" />\n </svg>\n )\n}\n\n/** \u62D6\u653E\u4E91\u56FE\u6807\u3002 */\nexport function CloudUpIcon({ size = 18 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n <path d=\"M17.7 9.5A5.2 5.2 0 0 0 7.6 8.2 4 4 0 0 0 6.5 16h10.9a3.8 3.8 0 0 0 .5-7.6Z\" />\n <path d=\"M12 17.5v-5M9.6 14.6 12 12.2l2.4 2.4\" />\n </svg>\n )\n}\n\n/** \u540D\u79F0\u6392\u5E8F\u7BAD\u5934\uFF08\u2191/\u2193\uFF09\u3002 */\nexport function SortDirIcon({ dir, size = 12 }: { dir: 'asc' | 'desc'; size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n {dir === 'asc' ? <path d=\"M12 19V5M5.8 10.8 12 4.6l6.2 6.2\" /> : <path d=\"M12 5v14M5.8 13.2 12 19.4l6.2-6.2\" />}\n </svg>\n )\n}\n\n/** \u5206\u7EC4\u884C\u84DD\u8272\u6587\u4EF6\u5939\uFF08\u5B9E\u5FC3\uFF09\u3002 */\nexport function FolderBlueIcon({ size = 17 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M3.5 7.2a2.2 2.2 0 0 1 2.2-2.2h4l2 2.1h6.6a2.2 2.2 0 0 1 2.2 2.2v7.5a2.2 2.2 0 0 1-2.2 2.2H5.7a2.2 2.2 0 0 1-2.2-2.2Z\" fill=\"var(--dsw-alias-state-business-primary,#3d6be5)\" />\n <path d=\"M3.5 9.5h17v1.6a2.2 2.2 0 0 0-2.2-2.2H5.7a2.2 2.2 0 0 0-2.2 2Z\" fill=\"#FFFFFF\" opacity=\".25\" />\n </svg>\n )\n}\n\n/** \u53F3\u7BAD\u5934\uFF08\u6307\u5357\u6309\u94AE\uFF09\u3002 */\nexport function ArrowRightIcon({ size = 13 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n <path d=\"M5 12h14M13 6l6 6-6 6\" />\n </svg>\n )\n}\n\n\n/** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\uFF1A\u5E95\u90E8 3D \u4E66\u672C\u63D2\u56FE + \u661F\u70B9\u88C5\u9970\u3002 */\nexport function GuideArtIcon(): JSX.Element {\n return (\n <svg width=\"150\" height=\"86\" viewBox=\"0 0 150 86\" aria-hidden=\"true\">\n <defs>\n <linearGradient id=\"skm-guide-book\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" stopColor=\"#9DB7F7\" />\n <stop offset=\"1\" stopColor=\"#6E8FF0\" />\n </linearGradient>\n <linearGradient id=\"skm-guide-page\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0\" stopColor=\"#FFFFFF\" />\n <stop offset=\"1\" stopColor=\"#D9E4FF\" />\n </linearGradient>\n </defs>\n {/* \u80CC\u9762\u4E66\u9875 (\u53F3) */}\n <path d=\"M96 34 L141 52 L120 66 L78 50 Z\" fill=\"url(#skm-guide-page)\" stroke=\"#C7D6F7\" strokeWidth=\"1\" />\n {/* \u80CC\u9762\u4E66\u9875 (\u5DE6) */}\n <path d=\"M84 32 L50 52 L28 44 L64 26 Z\" fill=\"url(#skm-guide-page)\" stroke=\"#C7D6F7\" strokeWidth=\"1\" />\n {/* \u4E66\u5C01\u9762\u5E95\u5EA7 */}\n <path d=\"M64 26 L96 34 L78 50 L50 52 Z\" fill=\"url(#skm-guide-book)\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n <path d=\"M50 52 L28 44 L30 56 L52 66 Z\" fill=\"#B7C9F5\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n <path d=\"M78 50 L120 66 L118 78 L76 62 Z\" fill=\"#A9BEF1\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n {/* \u5C01\u9762\u4E0A\u7684\u5706\u5F62\u5FBD\u7AE0 */}\n <circle cx=\"73\" cy=\"44\" r=\"9\" fill=\"#FFFFFF\" opacity=\".85\" />\n <circle cx=\"73\" cy=\"44\" r=\"5.5\" fill=\"#6E8FF0\" />\n {/* \u661F\u70B9\u88C5\u9970 */}\n <path d=\"M118 10c.6 2.6 1.6 3.6 4.2 4.2-2.6.6-3.6 1.6-4.2 4.2-.6-2.6-1.6-3.6-4.2-4.2 2.6-.6 3.6-1.6 4.2-4.2Z\" fill=\"#BCCFFF\" />\n <path d=\"M126 26c.4 1.7 1 2.3 2.7 2.7-1.7.4-2.3 1-2.7 2.7-.4-1.7-1-2.3-2.7-2.7 1.7-.4 2.3-1 2.7-2.7Z\" fill=\"#C9D9FF\" />\n <circle cx=\"111\" cy=\"24\" r=\"2\" fill=\"#C9D9FF\" />\n </svg>\n )\n}\n\n/** \u6307\u5357\u9762\u677F logo\uFF1A\u5C0F\u4E66\u5757\u3002 */\nexport function GuideArtIconSmall(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2.5\" fill=\"var(--dsw-alias-state-business-primary,#3d6be5)\" />\n <path d=\"M4.5 5h7M4.5 8h7M4.5 11h4.5\" stroke=\"#FFFFFF\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\n/** \u590D\u5236\u56FE\u6807\uFF08Feather copy\uFF0C\u7EBF\u6027\u63CF\u8FB9\uFF0C\u4E0E\u5BFC\u822A\u624B\u7ED8\u56FE\u6807\u540C\u98CE\uFF09\u3002 */\nexport function CopyIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\n/** \u5B8C\u6210\u52FE\u56FE\u6807\uFF08Feather check\uFF09\u3002 */\nexport function CheckIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n/* \u2500\u2500 Skills Hub \u9875\u9762\u56FE\u6807\uFF08Feather \u7EBF\u6027\u98CE\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport function SearchIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n )\n}\n\nexport function TagIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\" />\n <line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\" />\n </svg>\n )\n}\n\nexport function BulbIcon(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18h6\" />\n <path d=\"M10 22h4\" />\n <path d=\"M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.3h6c0-1 .4-1.8 1-2.3A7 7 0 0 0 12 2z\" />\n </svg>\n )\n}\n\n/** \u54C1\u724C\u5B57\u6807\uFF1A\u4FA7\u680F Logo \u533A\u52A0\u7C97\u300Cskill\u300D\u6587\u5B57 SVG\uFF08\u65E0\u5E95\u8272\uFF0CcurrentColor = \u54C1\u724C\u84DD\uFF09\u3002 */\nexport function HubWordmarkIcon(): JSX.Element {\n return (\n <svg width=\"26\" height=\"12\" viewBox=\"0 0 26 12\" aria-hidden=\"true\">\n <text\n x=\"13\"\n y=\"10\"\n textAnchor=\"middle\"\n fontSize=\"10.5\"\n fontWeight=\"800\"\n letterSpacing=\"-0.15\"\n fontFamily=\"ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif\"\n fill=\"currentColor\"\n >skill</text>\n </svg>\n )\n}\n\n/** \u6280\u80FD\u5B57\u6807\uFF1A\u74F7\u7247\u5185\u7684\u300Cskill\u300D\u6587\u5B57 SVG\uFF08\u66FF\u6362\u539F\u56FE\u6807\uFF0C\u968F\u74F7\u7247 currentColor \u7740\u8272\uFF09\u3002 */\nexport function SkillWordmarkIcon(): JSX.Element {\n return (\n <svg width=\"34\" height=\"15\" viewBox=\"0 0 34 15\" aria-hidden=\"true\">\n <text\n x=\"17\"\n y=\"12\"\n textAnchor=\"middle\"\n fontSize=\"12\"\n fontWeight=\"800\"\n letterSpacing=\"-0.2\"\n fontFamily=\"ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif\"\n fill=\"currentColor\"\n >skill</text>\n </svg>\n )\n}\n", "/**\n * skills/locales \u2014 \u9762\u677F\u6587\u6848\u8868\uFF08SKILL \u4E0E MCP \u5171\u7528\uFF09\u4E0E\u63D2\u503C\u51FD\u6570 skillT\u3002\n */\n/** ---------------------------------------------------------------- \u6587\u6848\u4E0E\u53C2\u6570 */\n\nexport const SKILL_ZH: Record<string, string> = {\n panelTitle: '\u80FD\u529B\u7BA1\u7406', close: '\u5173\u95ED', loading: '\u6B63\u5728\u8BFB\u53D6\u6280\u80FD\u2026',\n error: '\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u6280\u80FD\u3002', retry: '\u91CD\u8BD5', refresh: '\u5237\u65B0',\n uploadMeta: '{n} \u4E2A\u6587\u4EF6 \u00B7 {folder}',\n fileCount: '{n} \u6587\u4EF6', previewLoading: '\u6B63\u5728\u52A0\u8F7D\u5185\u5BB9\u2026', viewerNav: '\u6280\u80FD\u6587\u4EF6', viewerFont: '\u5B57\u53F7', viewerFull: '\u5168\u5C4F\u67E5\u770B', viewerExitFull: '\u9000\u51FA\u5168\u5C4F', viewerFilesCount: '{n} \u4E2A\u6587\u4EF6', assignToBundle: '\u5F52\u5165 Bundle', assignTitle: '\u5C06\u300C{name}\u300D\u5F52\u5165', assignEmpty: '\u8FD8\u6CA1\u6709\u6280\u80FD\u5305,\u5148\u70B9\u300C\u65B0\u5EFA Bundle\u300D\u521B\u5EFA\u4E00\u4E2A\u3002', deleteSkillBtn: '\u5220\u9664\u6280\u80FD',\n installName: '\u6280\u80FD\u540D\u79F0', installNamePlaceholder: '\u4F8B\u5982 my-skill', installDescription: '\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09',\n installNameFromArchive: '\u6280\u80FD\u540D\u53D6\u81EA\u538B\u7F29\u5305\u5185\u7684 SKILL.md',\n installNameInvalid: '\u6280\u80FD\u540D\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26\uFF08a-z 0-9 -\uFF09',\n installBundle: '\u5F52\u5165 Bundle', installLoose: '\u4E0D\u5F52\u7EC4\uFF08\u6563\u88C5\uFF09', installConfirm: '\u5B89\u88C5', installCancel: '\u53D6\u6D88',\n // \u6280\u80FD\u5305\u5206\u7C7B\n bundleCatTitle: '\u5206\u7C7B', bundleCatAll: '\u5168\u90E8\u5206\u7C7B', bundleCatNone: '\u672A\u5206\u7C7B', bundleCatFilterAria: '\u6309\u5206\u7C7B\u7B5B\u9009\u6280\u80FD\u5305',\n bundleCatEdit: '\u8BBE\u7F6E\u5206\u7C7B', bundleCatEditTitle: '\u300C{name}\u300D\u7684\u5206\u7C7B', bundleCatPlaceholder: '\u81EA\u5B9A\u4E49\u5206\u7C7B\uFF0C\u56DE\u8F66\u6DFB\u52A0',\n bundleCatSaved: '\u5DF2\u66F4\u65B0\u300C{name}\u300D\u7684\u5206\u7C7B', bundleCatTip: '\u53EA\u770B\u300C{name}\u300D\u5206\u7C7B \u00B7 \u518D\u70B9\u4E00\u6B21\u53D6\u6D88\u7B5B\u9009',\n bundleCatLimit: '\u4E00\u4E2A\u6280\u80FD\u5305\u6700\u591A {n} \u4E2A\u5206\u7C7B', bundleCatDone: '\u4FDD\u5B58', bundleCatAddPreset: '\u52A0\u5165\u300C{name}\u300D',\n bundleCatEmptyHint: '\u8FD8\u6CA1\u5206\u7C7B\u3002\u4ECE\u5DF2\u6709\u5206\u7C7B\u91CC\u9009\u4E00\u4E2A\uFF0C\u6216\u81EA\u5DF1\u5199\u4E00\u4E2A \u2014\u2014 \u5206\u7C7B\u53EA\u5F71\u54CD\u8FD9\u91CC\u7684\u67E5\u627E\uFF0C\u4E0D\u6539\u53D8\u6280\u80FD\u672C\u8EAB\u3002',\n bundleCatRemove: '\u79FB\u9664\u5206\u7C7B\u300C{name}\u300D', bundleCatCustom: '\u81EA\u5B9A\u4E49\u5206\u7C7B',\n newBundle: '\u65B0\u5EFA\u6280\u80FD\u5305', newBundlePlaceholder: '\u6280\u80FD\u5305\u540D\u79F0', create: '\u521B\u5EFA', cancel: '\u53D6\u6D88',\n renameBundlePlaceholder: '\u65B0\u7684 Bundle \u540D\u79F0', rename: '\u91CD\u547D\u540D', delete: '\u5220\u9664',\n skillsCount: '{n} \u4E2A\u6280\u80FD', removeSkill: '\u79FB\u51FA',\n looseTitle: '\u6563\u88C5\u6280\u80FD',\n deleteBundleConfirm: '\u5220\u9664 Bundle\u300C{name}\u300D\uFF1F\u5176\u4E2D\u7684\u6280\u80FD\u5C06\u53D8\u4E3A\u6563\u88C5\u3002',\n deleteSkillConfirm: '\u5220\u9664\u6280\u80FD\u300C{name}\u300D\uFF1F\u6B64\u64CD\u4F5C\u4F1A\u5220\u9664\u5B83\u7684\u6587\u4EF6\u3002',\n enableSkill: '\u542F\u7528', disableSkill: '\u7981\u7528',\n enableBundle: '\u542F\u7528\u5168\u90E8', disableBundle: '\u7981\u7528\u5168\u90E8',\n toggleFailed: '\u5207\u6362\u5931\u8D25\uFF1A{message}',\n presetAll: '\u5168\u90E8',\n presetHintAll: '\u5F53\u524D\u7F16\u8F91\u300C\u5168\u90E8 Agent\u300D\uFF1A\u5F00\u5173\u5BF9\u6240\u6709\u9884\u8BBE\u751F\u6548\uFF0C\u6240\u6709\u6765\u6E90\u7684\u6280\u80FD\u90FD\u80FD\u5173\uFF08\u968F\u5B89\u88C5/\u63D2\u4EF6\u63D0\u4F9B\u7684\u4E5F\u4E00\u6837\uFF0C\u4E0D\u6539\u5B83\u4EEC\u7684\u6587\u4EF6\uFF09\u3002',\n presetHintScoped: '\u5F53\u524D\u7F16\u8F91\u300C{name}\u300D\uFF1A\u53EA\u5BF9\u8BE5 Agent \u9884\u8BBE\u751F\u6548\uFF0C\u5176\u5B83\u9884\u8BBE\u4E0D\u53D7\u5F71\u54CD\u3002',\n presetReset: '\u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u5355\u72EC\u8BBE\u7F6E',\n presetOverrideCount: '{n} \u9879\u5355\u72EC\u8BBE\u7F6E',\n presetLockedByGlobal: '\u300C\u5168\u90E8 Agent\u300D\u5C42\u5DF2\u7981\u7528\uFF0C\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00',\n // \u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\u6587\u6848\n copySkillName: '\u590D\u5236\u6280\u80FD\u540D', copiedSkillName: '\u5DF2\u590D\u5236', toolsLabel: '\u5DE5\u5177', scopeAll: '\u5168\u5C40', scopeWorkspace: '\u5DE5\u4F5C\u533A', tagLoose: '\u6563\u88C5',\n // Skills Hub \u9875\u9762\u6587\u6848\n statSync: '\u6280\u80FD\u5065\u5EB7', statHealthy: '\u5168\u90E8\u5065\u5EB7',\n statChecking: '\u68C0\u6D4B\u4E2D\u2026', statIssues: '{n} \u4E2A\u95EE\u9898', statPending: '\u5F85\u68C0\u6D4B',\n searchPlaceholder: '\u641C\u7D22\u6280\u80FD\u540D\u79F0\u3001\u63CF\u8FF0\u6216\u6807\u7B7E\u2026', sortLabel: '\u540D\u79F0',\n bannerTitle: '\u6DFB\u52A0\u6280\u80FD', bannerSub: '\u62D6\u5165\u6280\u80FD\u6587\u4EF6\u5939\u5B89\u88C5\uFF0C\u6216\u70B9\u51FB\u6D4F\u89C8\u9009\u62E9',\n noMatch: '\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684\u6280\u80FD',\n // \u5DE6\u680F\uFF1AAgent \u9884\u8BBE\u5206\u7C7B / \u5FEB\u6377\u7B5B\u9009 / \u6DFB\u52A0\u6280\u80FD\u5361\n presetCatTitle: 'Agent \u9884\u8BBE\u5206\u7C7B',\n statusAll: '\u5168\u90E8', statusOn: '\u5DF2\u542F\u7528', statusOff: '\u5DF2\u505C\u7528',\n addSkillsTitle: '\u6DFB\u52A0\u6280\u80FD', addSkillsSub: '\u62D6\u5165\u6280\u80FD\u6587\u4EF6\u5B89\u88C5\uFF0C\u6216\u70B9\u51FB\u6D4F\u89C8\u9009\u62E9',\n dropHere: '\u62D6\u62FD\u6587\u4EF6\u5230\u6B64\u5904', dropFormat: '\u652F\u6301 .zip .skill \u7B49\u683C\u5F0F', browseImport: '\u6D4F\u89C8\u5E76\u5BFC\u5165',\n // \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\n guidePanelTitle: '\u5FEB\u901F\u4E0A\u624B',\n guideWhat: '\u4EC0\u4E48\u662F Skill?',\n guideWhatDesc: 'Skill \u662F Agent \u7684\u80FD\u529B\u6A21\u5757\uFF0C\u53EF\u4EE5\u8BA9 Agent \u5B66\u4F1A\u7279\u5B9A\u4EFB\u52A1\u3001\u6269\u5C55\u66F4\u591A\u80FD\u529B\u3002',\n guideCapUi: 'UI \u8BBE\u8BA1', guideCapCode: '\u4EE3\u7801\u751F\u6210', guideCapDoc: '\u6587\u6863\u5904\u7406', guideCapData: '\u6570\u636E\u5206\u6790', guideCapTool: '\u5DE5\u5177\u8C03\u7528',\n guideStep1: '\u521B\u5EFA Skill', guideStep1Desc: '\u901A\u8FC7\u4E0A\u4F20\u6587\u4EF6\u6216\u914D\u7F6E\u89C4\u5219\uFF0C\u521B\u5EFA\u65B0\u7684 Skill\uFF0C\u8BA9 Agent \u5B66\u4F1A\u65B0\u80FD\u529B\u3002',\n guideStep2: '\u914D\u7F6E Skill', guideStep2Desc: '\u8BBE\u7F6E\u8F93\u5165\u8F93\u51FA\u3001\u53C2\u6570\u548C\u6743\u9650\uFF0C\u786E\u4FDD Skill \u80FD\u6B63\u786E\u88AB Agent \u8C03\u7528\u3002',\n guideStep3: '\u542F\u7528\u7ED9 Agent', guideStep3Desc: '\u5C06 Skill \u542F\u7528\u5230 Agent \u4E2D\uFF0C\u8BA9 Agent \u5728\u5BF9\u8BDD\u4E2D\u81EA\u52A8\u4F7F\u7528\u3002',\n guideStep4: '\u67E5\u770B\u6548\u679C', guideStep4Desc: '\u5728\u5BF9\u8BDD\u4E2D\u6D4B\u8BD5 Skill \u7684\u6548\u679C\uFF0C\u6301\u7EED\u4F18\u5316\u6280\u80FD\u8868\u73B0\u3002',\n guideBest: '\u6700\u4F73\u5B9E\u8DF5',\n guideBest1: '\u4E00\u4E2A Skill \u4E13\u6CE8\u4E00\u4E2A\u80FD\u529B', guideBest2: '\u63CF\u8FF0\u6E05\u695A\u8F93\u5165\u548C\u8F93\u51FA',\n guideBest3: '\u5B9A\u671F\u66F4\u65B0\u6280\u80FD\u6587\u4EF6', guideBest4: '\u4E0D\u8981\u521B\u5EFA\u91CD\u590D\u80FD\u529B',\n guideMoreBest: '\u4E86\u89E3\u66F4\u591A\u6700\u4F73\u5B9E\u8DF5',\n guideClose: '\u6536\u8D77\u6307\u5357',\n // SKILL / MCP \u9876\u5C42 tab\n kindSkill: 'SKILL', kindPrompt: '\u63D0\u793A\u8BCD', kindMcp: 'MCP',\n levelPreset: '\u9884\u8BBE\u7EA7', levelWorkspace: '\u5DE5\u4F5C\u533A\u7EA7', levelAria: '\u9884\u8BBE\u7EA7 / \u5DE5\u4F5C\u533A\u7EA7',\n applyAll: '\u5E94\u7528\u5230\u6240\u6709\u9884\u8BBE',\n applyAllHint: '\u628A\u300C\u5168\u90E8\u300D\u89C6\u56FE\u7684\u6280\u80FD\u542F\u505C\u8986\u76D6\u5230\u6BCF\u4E2A agent \u9884\u8BBE\uFF08\u6E05\u7A7A\u5404\u9884\u8BBE\u7684\u5355\u72EC\u5F00\u5173\uFF0C\u4EE4\u5176\u5168\u90E8\u7EE7\u627F\u5168\u90E8/\u5168\u5C40\uFF09\u3002',\n applyAllConfirm: '\u5C06\u628A\u5F53\u524D\u300C\u5168\u90E8\u300D\u7684\u6280\u80FD\u542F\u505C\u8986\u76D6\u5230\u6240\u6709 agent \u9884\u8BBE\uFF08\u6E05\u9664\u5404\u9884\u8BBE\u539F\u6709\u7684\u5355\u72EC\u5F00\u5173\uFF09\u3002\u786E\u5B9A\uFF1F',\n applyAllOk: '\u5DF2\u5E94\u7528\u5230 {n} \u4E2A\u9884\u8BBE',\n mcpApplyAll: '\u5E94\u7528\u5230\u6240\u6709\u9884\u8BBE\uFF08MCP\uFF09',\n mcpApplyAllHint: '\u628A\u300C\u5168\u90E8\u300D\u89C6\u56FE\u7684 MCP \u5DE5\u5177\u914D\u7F6E\u8986\u76D6\u5230\u6BCF\u4E2A agent \u9884\u8BBE\uFF08\u6E05\u7A7A\u5404\u9884\u8BBE\u7684\u906E\u853D/\u5DE5\u5177\u542F\u505C\u8986\u76D6\uFF09\uFF1B\u5DE5\u4F5C\u533A\u7EA7\u4E0D\u53D7\u5F71\u54CD\u3002',\n mcpApplyAllConfirm: '\u5C06\u628A\u5F53\u524D\u300C\u5168\u90E8\u300D\u7684 MCP \u5DE5\u5177\u914D\u7F6E\u8986\u76D6\u5230\u6240\u6709 agent \u9884\u8BBE\uFF08\u6E05\u9664\u5404\u9884\u8BBE\u539F\u6709\u7684\u906E\u853D/\u5DE5\u5177\u542F\u505C\u8986\u76D6\uFF09\u3002\u5DE5\u4F5C\u533A\u4E0D\u53D7\u5F71\u54CD\u3002\u786E\u5B9A\uFF1F',\n mcpApplyAllOk: '\u5DF2\u5E94\u7528\u5230\u6240\u6709\u9884\u8BBE\uFF08\u6E05\u7406\u906E\u853D {masks} / \u5DE5\u5177 {tools}\uFF09',\n mcpEdit: '\u7F16\u8F91',\n mcpEditTitle: '\u7F16\u8F91 MCP Server',\n mcpEditReload: '\u4FDD\u5B58\u540E\u5C1D\u8BD5\u70ED\u91CD\u8F7D\uFF08\u9ED8\u8BA4\u4E0B\u6B21\u4F1A\u8BDD / \u91CD\u542F\u751F\u6548\uFF09',\n mcpEditSaved: '\u5DF2\u4FDD\u5B58\u4FEE\u6539\uFF08\u4E0B\u6B21\u4F1A\u8BDD / \u91CD\u542F\u751F\u6548\uFF09',\n mcpAddServer: '\u6DFB\u52A0 MCP Server',\n // MCP Server \u5217\u8868\n mcpListTitle: 'MCP Server \u5217\u8868',\n mcpRemove: '\u79FB\u9664',\n mcpAddModalTitle: '\u6DFB\u52A0 MCP Server',\n mcpAddConfirm: '\u6DFB\u52A0',\n // \u771F\u5B9E\u6CE8\u518C\u72B6\u6001\uFF08mcp-client \u6865\u63A5\uFF09\n mcpLiveDisabled: '\u5DF2\u7981\u7528',\n mcpLiveEmpty: '\u672A\u68C0\u6D4B\u5230\u5DF2\u6CE8\u518C\u7684 MCP Server\uFF1A\u5728 cordis.patch.yml \u6DFB\u52A0 mcp-client \u6761\u76EE\u5E76\u91CD\u542F DSH \u540E\u5373\u53EF',\n mcpLiveUnavailable: '\u72B6\u6001\u63A5\u53E3\u672A\u5C31\u7EEA\uFF08host \u6539\u52A8\u9700\u91CD\u542F DSH \u670D\u52A1\uFF09\uFF1A\u6865\u63A5\u5DE5\u5177\u4ECD\u53EF\u7528\uFF0C\u6B64\u9875\u6682\u65E0\u6CD5\u8BFB\u53D6\u6CE8\u518C\u8868',\n mcpLiveToolsOf: '\u5DE5\u5177',\n mcpToolsUnknown: '\u5DE5\u5177\u6570\u672A\u77E5',\n mcpLiveRefresh: '\u5237\u65B0',\n mcpConnStatus: '\u8FDE\u63A5\u72B6\u6001', mcpConnOk: '\u5DF2\u8FDE\u63A5', mcpConnDown: '\u4E0D\u53EF\u7528', mcpConnTip: '\u5B9E\u65F6\u8BFB\u53D6\u5230 {n} \u4E2A\u5168\u5C40 MCP Server',\n mcpLiveConfigHint: '\u6DFB\u52A0\uFF1A\u7F16\u8F91 cordis.patch.yml\uFF08\u6216\u4F7F\u7528\u300C\u6DFB\u52A0 MCP Server\u300D\u751F\u6210\u914D\u7F6E\u7247\u6BB5\uFF09',\n // \u9884\u8BBE\u7EF4\u5EA6\uFF080.1.6\uFF09\uFF1A\u5168\u5C40 / \u9884\u8BBE\u4E13\u5C5E / \u906E\u853D\n mcpScopeTitle: 'Agent \u9884\u8BBE\u8303\u56F4',\n mcpScopeHintAll: '\u5F53\u524D\u67E5\u770B\u5168\u5C40 Server\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF09\u3002\u9009\u62E9\u67D0\u4E2A\u9884\u8BBE\uFF0C\u53EF\u7BA1\u7406\u5B83\u4E13\u5C5E\u7684 Server \u4E0E\u906E\u853D\u3002',\n mcpPresetGlobalSection: '\u7EE7\u627F\u7684\u5168\u5C40 Server',\n mcpPresetOwnSection: '\u8BE5\u9884\u8BBE\u4E13\u5C5E Server',\n mcpPresetMasked: '\u5DF2\u906E\u853D',\n mcpPresetMaskState: '\u7EE7\u627F\u5168\u5C40\uFF08\u672A\u906E\u853D\uFF09',\n mcpPresetMaskHint: '\u5173\u6389\u5F00\u5173 = \u5BF9\u8BE5\u9884\u8BBE\u906E\u853D\uFF1A\u5DE5\u5177\u3001\u670D\u52A1\u5668\u6307\u4EE4\u4E0E\u8D44\u6E90\u8BFB\u53D6\u90FD\u9690\u85CF\uFF1B\u5168\u5C40\u8FDE\u63A5\u4FDD\u7559\uFF08\u8981\u300C\u4E0D\u8FDE\u63A5\u300D\u8BF7\u6539\u7528\u300C\u4E13\u5C5E Server\u300D\uFF09\u3002',\n mcpPresetCovered: '\u5DF2\u88AB\u672C\u9884\u8BBE\u540C\u540D Server \u8986\u76D6',\n mcpPresetOwnHint: '\u4E13\u5C5E Server \u5199\u8FDB\u8BE5\u9884\u8BBE\u58F0\u660E\u884C\u7684 plugins\uFF1A\u72EC\u7ACB\u8FDE\u63A5\uFF0C\u4EC5\u8BE5\u9884\u8BBE\u4E0E\u5176\u5B50\u4EE3\u7406\u53EF\u89C1\u3002',\n mcpAddServerGlobal: '\u6DFB\u52A0 MCP Server\uFF08\u5168\u5C40\uFF09',\n mcpAddGlobalHint: '\u5168\u5C40 Server \u5BF9\u6240\u6709\u9884\u8BBE\u751F\u6548\uFF1B\u53EA\u60F3\u7ED9\u5F53\u524D\u9884\u8BBE\u7528\uFF0C\u8BF7\u70B9\u5DE6\u4FA7\u7684\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u3002',\n mcpOwnRemoveConfirmTitle: '\u79FB\u9664\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\uFF1F',\n mcpOwnRemoveConfirmMsg: '\u5C06\u4ECE\u300C{name}\u300D\u7684\u58F0\u660E\u884C\u91CC\u5220\u6389\u8FD9\u4E00\u6761 mcp-client \u6761\u76EE\uFF08\u7531 DSH \u539F\u5B50\u5199\u56DE profile \u914D\u7F6E\uFF09\uFF0C\u5BF9\u8BE5\u9884\u8BBE\u7684\u65B0\u4F1A\u8BDD\u751F\u6548\uFF1B\u5168\u5C40\u7684\u540C\u540D Server \u4E0D\u53D7\u5F71\u54CD\u3002',\n // \u540C\u540D\u8986\u76D6\uFF1A\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server \u65F6\u7684\u906E\u853D\u5F00\u5173\u4E0E\u63D0\u793A\n mcpPresetCoveredSwitchHint: '\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761\u3002\u8BE5\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server\uFF0C\u5DE5\u5177\u4ECD\u7531\u5B83\u63D0\u4F9B \u2014\u2014 \u8981\u4E00\u8D77\u5173\u6389\u8BF7\u79FB\u9664\u4E0B\u65B9\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\u3002',\n mcpPresetCoveredMasked: '\u5DF2\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761 \u00B7 \u5DE5\u5177\u4ECD\u7531\u8BE5\u9884\u8BBE\u540C\u540D Server \u63D0\u4F9B',\n mcpPresetShadowGlobalTag: '\u540C\u540D\u5168\u5C40',\n mcpPresetShadowGlobalTip: '\u5168\u5C40\u4E5F\u6709\u4E00\u53F0\u540C\u540D Server\u3002\u672C\u9884\u8BBE\u7528\u81EA\u5E26\u7684\u8FD9\u53F0\uFF0C\u4E24\u8FB9\u7684\u5DE5\u5177\u5F00\u5173\u5404\u8BB0\u5404\u7684\u8D26\uFF08\u4E92\u4E0D\u5F71\u54CD\uFF09\u3002',\n mcpPresetOwnEmpty: '\u8BE5\u9884\u8BBE\u8FD8\u6CA1\u6709\u4E13\u5C5E Server',\n mcpPresetStorageHint: '\u8BE5\u9884\u8BBE\u7531\u968F\u5B89\u88C5\u7684 bundle \u58F0\u660E\uFF1A\u5199\u5165\u4F1A\u5728 profile \u5C42\u6574\u4EFD\u8986\u76D6\u5B83\u7684 plugins\uFF0C\u6B64\u540E\u8BE5\u9884\u8BBE\u4E0D\u518D\u8DDF\u968F DSH \u5347\u7EA7\u53D8\u5316\u3002',\n mcpPresetAddOwn: '\u6DFB\u52A0\u4E13\u5C5E Server',\n mcpPresetNewSession: '\u9884\u8BBE\u6539\u52A8\uFF08\u70ED\u91CD\u8F7D\uFF09\u5BF9\u65B0\u4F1A\u8BDD\u751F\u6548',\n mcpPresetFailed: '\u64CD\u4F5C\u5931\u8D25\uFF1A{message}',\n // MCP \u9875\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09\uFF1A\u7EDF\u8BA1\u5361 / \u63D0\u793A\u884C / \u5DE5\u5177\u6761\n mcpScopeAllTip: '\u5168\u90E8 Agent\uFF1A{n} \u4E2A\u5168\u5C40 Server\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF09',\n mcpScopePresetTip: '\u8BE5\u9884\u8BBE\u53EF\u89C1 {n} \u4E2A Server',\n mcpScopeOverrideCount: '{n} \u9879\u5355\u72EC\u8BBE\u7F6E',\n mcpScopeHintScoped: '\u5F53\u524D\u7F16\u8F91\u300C{name}\u300D\uFF1A\u4E13\u5C5E Server \u53EA\u5BF9\u8FD9\u4E2A\u9884\u8BBE\u751F\u6548\uFF1B\u5F00\u5173 = \u906E\u853D\u5B83\u7EE7\u627F\u7684\u5168\u5C40 Server\uFF0C\u5176\u5B83\u9884\u8BBE\u4E0D\u53D7\u5F71\u54CD\u3002',\n mcpScopeHintWorkspace: '\u5F53\u524D\u7F16\u8F91\u5DE5\u4F5C\u533A\u300C{path}\u300D\uFF1A\u4E3B\u5F00\u5173\u5199\u300C\u672C\u5DE5\u4F5C\u533A\u5173\u95ED\u300D\uFF0C\u53EA\u5F71\u54CD\u8FD9\u4E2A\u5DE5\u4F5C\u533A\u7684\u4F1A\u8BDD\uFF1B\u9884\u8BBE\u4E13\u5C5E Server \u4ECD\u6309\u9884\u8BBE\u8BB0\u8D26\u3002',\n mcpWaitingTools: '\u6B63\u5728\u7B49\u5F85\u300C{names}\u300D\u8FDE\u63A5\u5E76\u6CE8\u518C\u5DE5\u5177\u2026\uFF08\u81EA\u52A8\u5237\u65B0\u4E2D\uFF0C\u65E0\u9700\u624B\u52A8\u70B9\u5237\u65B0\uFF09',\n mcpToolsPendingReg: '\u7B49\u5F85\u6CE8\u518C',\n mcpToolsPendingRegTip: '\u5DE5\u5177\u540D\u6765\u81EA\u5386\u53F2\u7F13\u5B58\uFF1A\u8FDB\u7A0B\u8FD8\u5728\u8FDE\u63A5\uFF0C\u6CE8\u518C\u5B8C\u6210\u540E\u6570\u91CF\u4F1A\u81EA\u52A8\u66F4\u65B0\u4E3A\u5B9E\u9645\u503C\u3002',\n // \u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF08\u5DE5\u5177\u7EA7\uFF09\n mcpToolGlobalOff: '\u5168\u5C40\u5DF2\u505C\u7528',\n mcpToolGlobalOffTip: '\u5168\u5C40\u5DF2\u505C\u7528\uFF1A\u8BE5\u5DE5\u5177\u5728\u300C\u5168\u90E8 Agent\u300D\u5C42\u88AB\u5173\u95ED \u2014\u2014 \u4E00\u7968\u5426\u51B3\uFF0C\u6240\u6709\u9884\u8BBE\u90FD\u4E0D\u53EF\u89C1\u3001\u4E0D\u53EF\u8C03\u7528\uFF08\u9884\u8BBE\u5C42\u4E0D\u53EF\u62E8\u52A8\uFF09\u3002\u5404\u9884\u8BBE\u539F\u6709\u7684\u4E2A\u6027\u5316\u8BBE\u7F6E\u5DF2\u4FDD\u7559\uFF0C\u5168\u5C40\u6062\u590D\u540E\u81EA\u52A8\u8FD8\u539F\u3002',\n // \u4E00\u952E\u5168\u7981 / \u5168\u5F00\n mcpToolAllAria: '\u300C{name}\u300D\u7684\u5168\u90E8\u5DE5\u5177',\n mcpToolAllEnable: '\u5F00\u542F\u8BE5 MCP \u7684\u5168\u90E8\u5DE5\u5177',\n mcpToolAllDisable: '\u4E00\u952E\u7981\u7528\u8BE5 MCP \u7684\u5168\u90E8\u5DE5\u5177\uFF08\u53EA\u5173\u5DE5\u5177\uFF0C\u4FDD\u7559\u8FDE\u63A5\uFF09',\n mcpToolAllPartial: '\u90E8\u5206\u5DE5\u5177\u5DF2\u7981\u7528',\n // \u906E\u853D\u5B89\u88C5\u8BCA\u65AD\n mcpMaskInstallFailed: '\u906E\u853D\u672A\u5728\u8FD0\u884C\u671F\u751F\u6548\uFF1A{message}',\n mcpMaskNoAgent: '\u906E\u853D\u5DF2\u5199\u5165\uFF0C\u4F46\u8BE5\u9884\u8BBE\u5F53\u524D\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD \u2014\u2014 \u65B0\u4F1A\u8BDD\u8D77\u751F\u6548\u3002',\n mcpMaskNoDeny: '\u906E\u853D\u5DF2\u5199\u5165\uFF0C\u4F46\u8FD0\u884C\u671F\u8FD8\u6CA1\u62D2\u5230\u4EFB\u4F55\u5DE5\u5177\uFF08\u8BE5 MCP \u53EF\u80FD\u5C1A\u672A\u6CE8\u518C\u5DE5\u5177\uFF09\u3002\u82E5\u5BF9\u8BDD\u91CC\u4ECD\u80FD\u770B\u5230\u5B83\u7684\u5DE5\u5177\uFF0C\u8BF7\u91CD\u5F00\u4F1A\u8BDD\u6216\u91CD\u542F DSH\u3002',\n mcpSearchServers: '\u641C\u7D22 Server \u540D\u79F0\u6216\u5DE5\u5177\u2026',\n mcpListFilteredEmpty: '\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684 Server',\n mcpToolsUnavailable: '\u5DE5\u5177\u4E0D\u53EF\u7528',\n // \u5DE5\u5177\u7EA7\u542F\u505C\uFF08\u5361\u7247\u4E0A\u7684\u5DE5\u5177 chips\uFF09\n mcpToolsHint: '\u70B9\u51FB\u5DE5\u5177\u540D\u53EF\u5355\u72EC\u542F\u505C\uFF1A\u7EFF = \u542F\u7528\uFF0C\u7070 = \u7981\u7528\u3002',\n mcpToolChipsAria: '\u300C{name}\u300D\u63D0\u4F9B\u7684\u5DE5\u5177',\n mcpToolClickEnable: '\u70B9\u51FB\u542F\u7528\u8BE5\u5DE5\u5177',\n mcpToolClickDisable: '\u70B9\u51FB\u7981\u7528\u8BE5\u5DE5\u5177',\n mcpToolDisabledCount: '{n} \u4E2A\u5DE5\u5177\u5DF2\u7981\u7528',\n // \u7C98\u8D34\u6DFB\u52A0\uFF08JSON / DSH \u539F\u751F YAML\uFF09\n mcpPasteHint: '\u7C98\u8D34\u5176\u5B83 harness \u7684 JSON\uFF08.mcp.json \u7684 mcpServers \u6620\u5C04\uFF09\u6216 DSH \u539F\u751F YAML\uFF08\u4E5F\u63A5\u53D7 mcp-client \u884C\u7247\u6BB5\uFF09\uFF1B\u5199\u5165 {scope}\u3002',\n mcpPasteScopeGlobal: '\u5168\u5C40 profile patch\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF0C\u70ED\u91CD\u8F7D\u5373\u65F6\u751F\u6548\uFF09',\n mcpPasteScopePreset: '\u9884\u8BBE\u4E13\u5C5E',\n mcpPasteFormat: '\u7C98\u8D34\u683C\u5F0F',\n mcpPasteNative: '\u539F\u751F',\n mcpPasteParsed: '\u89E3\u6790\u51FA {n} \u4E2A server\uFF1A{names}',\n mcpPasteCheck: '\u6821\u9A8C\u5E76\u9884\u89C8',\n mcpPasteChecking: '\u6821\u9A8C\u4E2D\u2026',\n mcpPasteAdding: '\u5199\u5165\u4E2D\u2026',\n mcpPasteAdded: '\u5DF2\u6DFB\u52A0 {added} \u4E2A\uFF0C\u8DF3\u8FC7 {skipped} \u4E2A\u5DF2\u5B58\u5728',\n mcpPasteFailed: '\u6DFB\u52A0\u5931\u8D25',\n mcpRemoveConfirmTitle: '\u79FB\u9664 MCP Server',\n mcpRemoveConfirmMsg: '\u5C06\u4ECE cordis.patch.yml \u4E2D\u5220\u9664\u300C{name}\u300D\u6761\u76EE\uFF0C\u5176\u5DE5\u5177\u968F\u5373\u6CE8\u9500\u4E14\u4E0D\u53EF\u6062\u590D\uFF1B\u5982\u9700\u6062\u590D\u8BF7\u91CD\u65B0\u6DFB\u52A0\u3002',\n // \u5206\u7EC4\u884C / \u66F4\u591A\u83DC\u5355 / \u5206\u9875\n nameAsc: '\u5347\u5E8F', nameDesc: '\u964D\u5E8F', moreActions: '\u66F4\u591A\u64CD\u4F5C',\n // \u7A7A\u6280\u80FD\u5305 / \u5931\u6548\u5F15\u7528 / \u64CD\u4F5C\u53CD\u9988\n bundleEmptyTitle: '\u8FD9\u4E2A\u6280\u80FD\u5305\u8FD8\u662F\u7A7A\u7684',\n bundleEmptyHint: '\u4E0A\u4F20\u6280\u80FD\u65F6\u5728\u8FD9\u91CC\u9009\u5B83\u5F52\u7EC4\uFF0C\u6216\u4ECE\u6563\u88C5\u6280\u80FD\u5361\u7247\u70B9\u300C+\u300D\u5F52\u5165\u3002',\n bundleUploadHere: '\u4E0A\u4F20\u6280\u80FD\u5230\u6B64\u5305',\n bundleMissingN: '\u8D26\u672C\u91CC\u6709 {n} \u4E2A\u6280\u80FD\u5DF2\u4E0D\u5B58\u5728',\n bundlePrune: '\u6E05\u7406\u5931\u6548\u5F15\u7528',\n pruned: '\u5DF2\u6E05\u7406\u5931\u6548\u5F15\u7528',\n installedOk: '\u5DF2\u5B89\u88C5\u6280\u80FD\u300C{name}\u300D',\n deletedOk: '\u5DF2\u5220\u9664\u6280\u80FD\u300C{name}\u300D',\n removedOk: '\u5DF2\u4ECE\u6280\u80FD\u5305\u79FB\u51FA\u300C{name}\u300D',\n assignOk: '\u5DF2\u628A\u300C{name}\u300D\u5F52\u5165\u6280\u80FD\u5305',\n bundleCreated: '\u5DF2\u521B\u5EFA\u6280\u80FD\u5305\u300C{name}\u300D\uFF0C\u4E0A\u4F20\u6280\u80FD\u65F6\u53EF\u76F4\u63A5\u5F52\u5165\u5B83',\n bundleDeleted: '\u5DF2\u5220\u9664\u6280\u80FD\u5305\u300C{name}\u300D\uFF0C\u5176\u4E2D\u7684\u6280\u80FD\u53D8\u4E3A\u6563\u88C5',\n opFailed: '\u64CD\u4F5C\u5931\u8D25\uFF1A{label} \u2014 {message}',\n installNameRewrite: 'SKILL.md \u91CC\u5199\u7684\u662F\u300C{meta}\u300D\uFF0C\u5B89\u88C5\u65F6\u4F1A\u7EDF\u4E00\u6539\u6210\u300C{name}\u300D\uFF08\u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4FDD\u6301\u4E00\u81F4\uFF09\u3002',\n deleteSkillDirNote: '\uFF08\u6280\u80FD\u76EE\u5F55\u300C{dir}\u300D\u4E0E\u6280\u80FD\u540D\u4E0D\u540C\uFF0C\u4F1A\u4E00\u5E76\u5220\u9664\uFF09',\n skillOffTag: '\u5DF2\u505C\u7528',\n originWorkspace: '\u5DE5\u4F5C\u533A',\n originGlobal: '\u5168\u5C40',\n originWorkspaceHint: '\u5F53\u524D\u5DE5\u4F5C\u533A\u4E13\u7528\uFF1A\u540C\u540D\u7684\u5168\u5C40\u6280\u80FD\u4F1A\u88AB\u5B83\u8986\u76D6\uFF1B\u5173\u6389\u53EA\u5F71\u54CD\u8FD9\u4E2A\u5DE5\u4F5C\u533A\u3002',\n originGlobalHint: '\u5168\u5C40\u53EF\u7528\uFF1A\u6240\u6709\u5DE5\u4F5C\u533A\u90FD\u80FD\u770B\u5230\uFF1B\u5173\u6389\u5BF9\u6240\u6709\u5DE5\u4F5C\u533A\u751F\u6548\uFF08\u9664\u975E\u67D0\u5DE5\u4F5C\u533A\u6709\u540C\u540D\u6280\u80FD\uFF09\u3002',\n workspacePickerAria: '\u9009\u62E9\u8981\u914D\u7F6E\u7684\u5DE5\u4F5C\u533A',\n addScopeLabel: '\u6DFB\u52A0\u5230\u54EA\u91CC',\n addScopeGlobal: '\u5168\u5C40',\n addScopeWorkspace: '\u5F53\u524D\u5DE5\u4F5C\u533A',\n workspacePickerAuto: '\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD',\n mcpWorkspaceDisable: '\u672C\u5DE5\u4F5C\u533A\u5173\u95ED',\n mcpWorkspaceEnable: '\u672C\u5DE5\u4F5C\u533A\u542F\u7528',\n mcpWorkspaceDisableHint: '\u53EA\u5728\u8FD9\u4E2A\u5DE5\u4F5C\u533A\u7684\u4F1A\u8BDD\u91CC\u4E0D\u6CE8\u5165\u5B83\u7684\u5DE5\u5177\uFF1B\u6362\u5230\u522B\u7684\u5DE5\u4F5C\u533A\u7167\u5E38\u6CE8\u5165\u3002',\n mcpWorkspaceEnableHint: '\u91CD\u65B0\u5728\u8FD9\u4E2A\u5DE5\u4F5C\u533A\u6CE8\u5165\u5B83\u7684\u5DE5\u5177\u3002',\n mcpWorkspaceClosed: '\u672C\u5DE5\u4F5C\u533A\u5DF2\u5173',\n mcpWorkspaceClosedHint: '\u8BE5 Server \u5728\u5F53\u524D\u5DE5\u4F5C\u533A\u88AB\u5173\u95ED\uFF1A\u8FD9\u91CC\u7684\u4F1A\u8BDD\u770B\u4E0D\u5230\u5B83\u7684\u5DE5\u5177\uFF0C\u5176\u5B83\u5DE5\u4F5C\u533A\u4E0D\u53D7\u5F71\u54CD\u3002',\n mcpWorkspaceToolLedgerRaw: '\u672C\u5DE5\u4F5C\u533A\u5DE5\u5177\u7981\u7528\u8D26\u672C\uFF08\u672A\u80FD\u5F52\u5230\u5F53\u524D Server \u5361\u7247\uFF0C\u6309\u670D\u52A1\u7AEF\u539F\u6837\u5217\u51FA\uFF09\uFF1A{names}',\n workspaceHint: '\u5F53\u524D\u7F16\u8F91\u5DE5\u4F5C\u533A\u300C{path}\u300D\uFF1A\u5F00\u5173\u53EA\u5728\u8FD9\u4E2A\u5DE5\u4F5C\u533A\u751F\u6548\uFF0C\u5E76\u8986\u76D6\u540C\u540D\u7684\u9884\u8BBE/\u5168\u5C40\u8BBE\u7F6E\u3002',\n workspaceReset: '\u6E05\u7A7A\u8BE5\u5DE5\u4F5C\u533A\u7684\u5355\u72EC\u8BBE\u7F6E',\n presetCountTip: '\u8BE5\u9884\u8BBE\u4E0B\u5DF2\u542F\u7528 {n} \u4E2A / \u5171 {total} \u4E2A\u6280\u80FD',\n}\n\nexport function skillT(key: string, params?: Record<string, string | number>): string {\n let text = SKILL_ZH[key] ?? key\n if (params) {\n for (const k of Object.keys(params)) text = text.split(`{${k}}`).join(String(params[k]))\n }\n return text\n}\n", "/**\n * skills/McpAddModal \u2014 \u7C98\u8D34\u6DFB\u52A0 MCP Server\uFF08JSON / DSH \u539F\u751F YAML\uFF1A\u6821\u9A8C\u9884\u89C8 \u2192 \u843D\u76D8\uFF09\u3002\n */\nimport { useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport {\n detectMcpFormat, mcpEditFormatOptions, type McpConfigFormat, type McpFormatCapabilities,\n} from './mcp-state.js'\nimport { css } from './styles.js'\n\n/**\n * \u7C98\u8D34\u6DFB\u52A0 MCP\uFF1AJSON\uFF08\u5176\u5B83 harness \u7684 `.mcp.json` \u5F62\u6001\uFF09\u6216 DSH \u539F\u751F YAML\uFF0C\n * \u5148\u300C\u6821\u9A8C\u5E76\u9884\u89C8\u300D\uFF08\u5BBF\u4E3B\u89E3\u6790\uFF0C\u5E26\u884C\u53F7\u62A5\u9519\uFF09\uFF0C\u786E\u8BA4\u540E\u5199\u5165\u76EE\u6807\uFF08\u5168\u5C40 patch / \u9884\u8BBE\uFF09\u3002\n * \u4E00\u6B21\u7C98\u8D34\u53EF\u542B\u591A\u4E2A server\uFF1B\u5DF2\u5B58\u5728\u7684 serverName \u81EA\u52A8\u8DF3\u8FC7\u3002\n */\nexport function McpPasteAdd({ t, presetId, onAdded, onCancel, workspace, editServer, editText, onEdited, editSource, editPreset, editWorkspace, editFormat, editCapabilities }: {\n t: (key: string, params?: Record<string, string | number>) => string\n /** \u76EE\u6807\u9884\u8BBE\uFF1Bundefined = \u5168\u5C40 profile patch\u3002 */\n presetId?: string\n /** \u9762\u677F\u5F53\u524D\u9009\u4E2D\u7684\u5DE5\u4F5C\u533A\uFF08\u63D0\u4F9B\u540E\u624D\u80FD\u300C\u6DFB\u52A0\u5230\u5F53\u524D\u5DE5\u4F5C\u533A\u300D\uFF09\u3002 */\n workspace?: string | null\n /** \u6DFB\u52A0\u6210\u529F\u56DE\u8C03\uFF1A\u5E26\u4E0A\u672C\u6B21\u65B0\u589E\u7684 serverName\uFF08\u9762\u677F\u636E\u6B64\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C\uFF09\u3002 */\n onAdded: (added: string[]) => void\n onCancel: () => void\n /** \u7F16\u8F91\u6A21\u5F0F\uFF1A\u8981\u7F16\u8F91\u7684 serverName\uFF08\u5168\u5C40 profile patch\uFF09\u3002 */\n editServer?: string\n /** \u7F16\u8F91\u6A21\u5F0F\uFF1A\u5F53\u524D config \u539F\u6587\uFF08YAML \u5B50\u5757\uFF0C\u5DF2\u53BB\u7F29\u8FDB\uFF09\u3002 */\n editText?: string\n /** \u7F16\u8F91\u4FDD\u5B58\u6210\u529F\u56DE\u8C03\u3002 */\n onEdited?: () => void\n /** \u7F16\u8F91\u6765\u6E90\uFF1Aglobal / preset / workspace\u3002 */\n editSource?: 'global' | 'preset' | 'workspace'\n editPreset?: string\n editWorkspace?: string\n /** \u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u7F16\u8F91\u683C\u5F0F\uFF1B\u7F3A\u7701\u65F6\u6309\u6587\u672C\u5F62\u6001\u515C\u5E95\uFF08\u4E0D\u6309 source \u731C\uFF09\u3002 */\n editFormat?: McpConfigFormat\n /** \u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u7F16\u8F91\u80FD\u529B\uFF08\u53EF\u5207\u6362\u7684\u683C\u5F0F\uFF09\u3002 */\n editCapabilities?: McpFormatCapabilities\n}): JSX.Element {\n /** \u7F16\u8F91\u5165\u53E3\u4E0D\u518D\u6309\u300Cglobal=YAML / preset=JSON\u300D\u63A8\u65AD\uFF1A\u7528\u670D\u52A1\u7AEF format\uFF0C\u5176\u6B21\u770B\u6587\u672C\u5F62\u6001\u3002 */\n const initialFormat: McpConfigFormat = editServer !== undefined\n ? (editFormat ?? detectMcpFormat(editText ?? ''))\n : 'json'\n const [format, setFormat] = useState<McpConfigFormat>(initialFormat)\n /** \u7F16\u8F91\u6A21\u5F0F\u4E14\u670D\u52A1\u7AEF\u672A\u58F0\u660E\u80FD\u529B\u65F6\u53EA\u4FDD\u7559\u5F53\u524D\u683C\u5F0F\uFF0C\u907F\u514D\u5207\u5230\u5BBF\u4E3B\u4E0D\u63A5\u53D7\u7684\u683C\u5F0F\u3002 */\n // \u7F16\u8F91\u5168\u5C40 profile patch \u65F6\u4FDD\u7559 JSON \u5165\u53E3\uFF1A\u5BBF\u4E3B\u56DE\u663E\u662F YAML\uFF0C\u4F46\u7528\u6237\u4ECD\u53EF\u901A\u8FC7\n // /mcp-format \u4E92\u8F6C\u540E\u4EE5 JSON \u7F16\u8F91\uFF1B\u4EC5\u9884\u8BBE/\u5DE5\u4F5C\u533A\u7684\u539F\u751F .mcp.json \u53EA\u4FDD\u7559 JSON\u3002\n const formatOptions = mcpEditFormatOptions(\n editServer === undefined ? undefined : editSource,\n initialFormat,\n editCapabilities,\n )\n const [text, setText] = useState(editText ?? '')\n const [reload, setReload] = useState(false)\n const [busy, setBusy] = useState<'preview' | 'add' | null>(null)\n const [preview, setPreview] = useState<{ names: string[]; yaml: string } | null>(null)\n const [errors, setErrors] = useState<string[]>([])\n const [warnings, setWarnings] = useState<string[]>([])\n const [notice, setNotice] = useState<string | null>(null)\n /**\n * \u843D\u70B9\uFF1A\u9ED8\u8BA4\u5168\u5C40\uFF08profile patch\uFF09\u3002\u9009\u5DE5\u4F5C\u533A\u65F6\u5199\u8BE5\u5DE5\u4F5C\u533A\u9879\u76EE\u6839\u7684 `.mcp.json`\n * \uFF08\u4E3B\u6D41 agent \u901A\u7528\u683C\u5F0F\uFF0C\u9996\u6B21\u65B0\u5EFA\u3001\u540E\u7EED\u5408\u5E76\uFF09\uFF0C\u53EA\u5728\u8BE5\u5DE5\u4F5C\u533A\u6CE8\u5165 \u2014\u2014\n * \u540C\u540D server \u53EF\u4EE5\u4E24\u4E2A\u5DE5\u4F5C\u533A\u5404\u914D\u4E00\u4EFD\u3002\n */\n const [scope, setScope] = useState<'global' | 'workspace'>('global')\n const target = presetId === undefined ? 'global' : 'preset'\n const placeholder = format === 'json'\n ? '{ \"mcpServers\": { \"my-server\": { \"command\": \"npx\", \"args\": [\"-y\", \"@scope/mcp-server\"] } } }'\n : 'mcpServers:\\n my-server:\\n command: npx\\n args: [\"-y\", \"@scope/mcp-server\"]'\n const empty = text.trim() === ''\n\n const call = (path: string, payload: Record<string, unknown>): Promise<Record<string, unknown>> =>\n fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(payload),\n }).then(async (response) => {\n const body = await response.json().catch(() => null) as Record<string, unknown> | null\n return body ?? { ok: false, error: `HTTP ${response.status}` }\n })\n\n const reset = (): void => { setErrors([]); setWarnings([]); setNotice(null); setPreview(null) }\n\n // \u5207\u6362 JSON / YAML\uFF1A\u628A\u5F53\u524D\u6587\u672C\u6309\u76EE\u6807\u683C\u5F0F\u5B9E\u9645\u6539\u5199\uFF08\u8C03\u7528\u5BBF\u4E3B /mcp-format \u4E92\u8F6C\uFF09\uFF0C\u800C\u4E0D\u662F\u53EA\u6539\u6807\u7B7E\u3002\n const switchFormat = (next: McpConfigFormat): void => {\n if (next === format) return\n if (text.trim() === '') { setFormat(next); reset(); return }\n setBusy('preview')\n void call('/api/triad/mcp-format', { format, text, to: next })\n .then((body) => {\n if (body.ok === true && typeof body.text === 'string') { setText(body.text); setFormat(next); reset() }\n else setErrors(Array.isArray(body.errors) ? (body.errors as string[]) : [String(body.error ?? 'format convert failed')])\n })\n .catch((error: unknown) => { setErrors([error instanceof Error ? error.message : String(error)]) })\n .finally(() => { setBusy(null) })\n }\n\n const previewNow = (): void => {\n if (busy !== null || empty) return\n setBusy('preview'); reset()\n void call('/api/triad/mcp-preview', { format, text, target })\n .then((body) => {\n const list = Array.isArray(body.errors) ? (body.errors as string[]) : []\n setErrors(list)\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n if (typeof body.yaml === 'string') {\n const servers = Array.isArray(body.servers) ? (body.servers as Array<{ name?: unknown }>) : []\n setPreview({ names: servers.map(item => String(item.name ?? '')), yaml: body.yaml })\n }\n if (list.length === 0 && typeof body.error === 'string') setErrors([body.error])\n })\n .catch((error: unknown) => { setErrors([error instanceof Error ? error.message : String(error)]) })\n .finally(() => { setBusy(null) })\n }\n\n const addNow = (): void => {\n if (busy !== null || empty) return\n setBusy('add'); reset()\n // \u7F16\u8F91\u6A21\u5F0F\uFF1A\u6539\u5168\u5C40 profile patch \u91CC\u8BE5 server \u7684 config\uFF08\u590D\u7528 remove+append\uFF0C\u5E26 .bak\uFF09\u3002\n if (editServer !== undefined) {\n const payload = editSource === 'preset'\n ? { source: 'preset', preset: editPreset, serverName: editServer, format, text, reload }\n : editSource === 'workspace'\n ? { source: 'workspace', workspace: editWorkspace, serverName: editServer, format, text, reload }\n : { serverName: editServer, format, text, reload }\n void call('/api/triad/mcp-edit', payload)\n .then((body) => {\n const list = Array.isArray(body.errors) ? (body.errors as string[]) : []\n if (list.length > 0) { setErrors(list); return }\n if (body.ok !== true) { setErrors([String(body.error ?? t('mcpPasteFailed'))]); return }\n setNotice(t('mcpEditSaved'))\n onEdited?.()\n })\n .catch((error: unknown) => { setErrors([error instanceof Error ? error.message : String(error)]) })\n .finally(() => { setBusy(null) })\n return\n }\n const path = presetId === undefined\n ? '/api/triad/mcp-config'\n : `/api/triad/mcp-presets/${encodeURIComponent(presetId)}/servers`\n const toWorkspace = presetId === undefined && scope === 'workspace' && typeof workspace === 'string' && workspace !== ''\n const payload = presetId === undefined\n ? { action: 'add', format, text, ...toWorkspace ? { scope: 'workspace', workspace } : {} }\n : { format, text }\n void call(path, payload)\n .then((body) => {\n const list = Array.isArray(body.errors) ? (body.errors as string[]) : []\n if (list.length > 0) {\n setErrors(list)\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n return\n }\n if (body.ok !== true) { setErrors([String(body.error ?? t('mcpPasteFailed'))]); return }\n const added = Array.isArray(body.added) ? (body.added as string[]) : []\n const skipped = Array.isArray(body.skipped) ? (body.skipped as number | string[]) : []\n setNotice(t('mcpPasteAdded', { added: added.length, skipped: Array.isArray(skipped) ? skipped.length : Number(skipped) }))\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n onAdded(added)\n })\n .catch((error: unknown) => { setErrors([error instanceof Error ? error.message : String(error)]) })\n .finally(() => { setBusy(null) })\n }\n\n return (\n <div className={css.mcpAddForm}>\n <p className={css.installHint}>\n {t('mcpPasteHint', { scope: presetId === undefined ? t('mcpPasteScopeGlobal') : `${t('mcpPasteScopePreset')} \u201C${presetId}\u201D` })}\n </p>\n <div className={css.installRow}>\n <div className={css.mcpAddTypeRow} role=\"group\" aria-label={t('mcpPasteFormat')}>\n {formatOptions.map(value => (\n <button\n key={value}\n type=\"button\"\n className={`${css.mcpAddTypeBtn} ${format === value ? css.mcpAddTypeActive : ''}`}\n data-active={format === value || undefined}\n aria-pressed={format === value}\n onClick={() => { switchFormat(value) }}\n >\n {value.toUpperCase()}{value === 'yaml' ? ` \u00B7 ${t('mcpPasteNative')}` : ''}\n </button>\n ))}\n </div>\n </div>\n {/* \u843D\u70B9\u9009\u62E9\uFF1A\u9ED8\u8BA4\u5168\u5C40\uFF1B\u9009\u5DE5\u4F5C\u533A\u65F6\u5199\u8BE5\u5DE5\u4F5C\u533A\u81EA\u5DF1\u7684 .mcp.json\u3002 */}\n {editServer === undefined && presetId === undefined && typeof workspace === 'string' && workspace !== '' && (\n <div className={css.installRow}>\n <div className={css.mcpAddTypeRow} role=\"group\" aria-label={t('addScopeLabel')}>\n {(['global', 'workspace'] as const).map(value => (\n <button\n key={value}\n type=\"button\"\n className={`${css.mcpAddTypeBtn} ${scope === value ? css.mcpAddTypeActive : ''}`}\n data-active={scope === value || undefined}\n aria-pressed={scope === value}\n title={value === 'workspace' ? workspace : undefined}\n onClick={() => { setScope(value); reset() }}\n >\n {value === 'global' ? t('addScopeGlobal') : t('addScopeWorkspace')}\n </button>\n ))}\n </div>\n </div>\n )}\n <textarea\n className={css.inlineInput}\n value={text}\n placeholder={placeholder}\n aria-label={t('mcpPasteFormat')}\n rows={8}\n spellCheck={false}\n autoFocus\n style={{\n fontFamily: 'ui-monospace, SFMono-Regular, Consolas, monospace',\n fontSize: 12,\n lineHeight: '18px',\n minHeight: 120,\n resize: 'vertical',\n whiteSpace: 'pre',\n }}\n onChange={(event) => { setText(event.currentTarget.value); reset() }}\n />\n {errors.length > 0 && (\n <div className={css.error} role=\"alert\">\n {errors.map(item => <div key={item}>{item}</div>)}\n </div>\n )}\n {warnings.length > 0 && (\n <div className={css.installHint} role=\"status\">\n {warnings.map(item => <div key={item}>\u00B7 {item}</div>)}\n </div>\n )}\n {preview !== null && (\n <div>\n <p className={css.installHint}>{t('mcpPasteParsed', { n: preview.names.length, names: preview.names.join(', ') })}</p>\n <pre style={{\n margin: 0,\n maxHeight: 200,\n overflow: 'auto',\n fontFamily: 'ui-monospace, SFMono-Regular, Consolas, monospace',\n fontSize: 11,\n lineHeight: '16px',\n whiteSpace: 'pre-wrap',\n }}>{preview.yaml}</pre>\n </div>\n )}\n {notice !== null && <p className={css.mcpCopyHint} role=\"status\">{notice}</p>}\n {editServer !== undefined && (\n <label style={{ display: 'flex', alignItems: 'center', gap: 6, marginTop: 6, fontSize: 12, cursor: 'pointer' }}>\n <input type=\"checkbox\" checked={reload} onChange={(event) => setReload(event.currentTarget.checked)} />\n {t('mcpEditReload')}\n </label>\n )}\n <div className={css.inlineForm}>\n <Button variant=\"outline\" type=\"button\" disabled={busy !== null || empty} onClick={previewNow}>\n {busy === 'preview' ? t('mcpPasteChecking') : t('mcpPasteCheck')}\n </Button>\n <Button variant=\"primary\" type=\"button\" disabled={busy !== null || empty} onClick={addNow}>\n {busy === 'add' ? t('mcpPasteAdding') : t('mcpAddConfirm')}\n </Button>\n <Button variant=\"outline\" type=\"button\" onClick={onCancel}>{t('cancel')}</Button>\n </div>\n </div>\n )\n}\n\n/** \u6DFB\u52A0\u5168\u5C40 MCP Server \u5F39\u7A97\uFF1A\u7C98\u8D34 JSON / DSH \u539F\u751F YAML\uFF0C\u76F4\u63A5\u5199\u5165 profile patch\u3002 */\nexport function McpAddModal({ t, open, onClose, onAdded }: {\n t: (key: string) => string\n open: boolean\n onClose: () => void\n onAdded: (added: string[]) => void\n}): JSX.Element {\n return (\n <Modal open={open} onClose={onClose} closeLabel={t('close')} title={t('mcpAddModalTitle')}>\n <McpPasteAdd t={t} onAdded={onAdded} onCancel={onClose} />\n </Modal>\n )\n}\n", "/**\n * skills/mcp-state \u2014 MCP \u5206\u5C42\u5F00\u5173\u7684\u7EAF\u51FD\u6570\u3002\n *\n * \u7EDF\u4E00\u4E09\u4EF6\u4E8B\uFF1A\n * 1. \u5F53\u524D\u7F16\u8F91\u5C42\u7EA7\u8BE5\u5199\u54EA\u4E00\u672C\u8D26\uFF08global / preset mask / workspace close\uFF09\uFF1B\n * 2. \u4E00\u6761 Server \u884C\u7684\u6709\u6548\u542F\u7528\u6001\uFF08config.disabled \u2192 mask \u2192 workspaceClosed\uFF09\uFF1B\n * 3. MCP \u914D\u7F6E\u7F16\u8F91\u7684\u683C\u5F0F\u80FD\u529B\uFF08\u670D\u52A1\u7AEF\u8FD4\u56DE\u4EC0\u4E48\u5C31\u7528\u4EC0\u4E48\uFF0C\u4E0D\u6309 source \u731C\uFF09\u3002\n *\n * \u65E0 React / \u65E0\u8FD0\u884C\u65F6\u4F9D\u8D56\uFF0C\u4F9B\u9762\u677F\u4E0E\u5355\u6D4B\u5171\u7528\u3002\n */\n\n/** MCP \u7F16\u8F91\u5C42\u7EA7\uFF08\u4E0E\u6280\u80FD\u9762\u677F\u5171\u7528\u9884\u8BBE\u7EA7 / \u5DE5\u4F5C\u533A\u7EA7\u5207\u6362\uFF09\u3002 */\nexport type McpLevel = 'preset' | 'workspace'\n\n/** \u4E00\u53F0 Server \u7684\u5F00\u5173\u843D\u70B9\u3002 */\nexport type McpToggleTarget =\n | { kind: 'global' }\n | { kind: 'mask'; presetId: string }\n | { kind: 'workspace'; cwd: string }\n\n/**\n * \u5F53\u524D\u5C42\u7EA7/\u8303\u56F4\u4E0B\uFF0C\u5361\u7247\u4E3B\u5F00\u5173\u5E94\u8BE5\u5199\u54EA\u91CC\u3002\n *\n * @param level - \u9884\u8BBE\u7EA7\u6216\u5DE5\u4F5C\u533A\u7EA7\u3002\n * @param scope - \u5F53\u524D\u9884\u8BBE id\uFF1B\u7A7A\u4E32 = \u5168\u90E8 Agent\u3002\n * @param workspace - \u5F53\u524D\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\uFF1Bnull = \u672A\u9009\u62E9\u3002\n * @returns \u5199\u76EE\u6807\uFF1B\u5DE5\u4F5C\u533A\u7EA7\u4F46\u62FF\u4E0D\u5230 cwd \u65F6\u8FD4\u56DE null\uFF08\u4E0D\u843D\u4EFB\u4F55\u8D26\uFF09\u3002\n */\nexport function mcpToggleTarget(\n level: McpLevel,\n scope: string,\n workspace: string | null,\n): McpToggleTarget | null {\n if (level === 'workspace') {\n if (workspace === null || workspace.trim() === '') return null\n return { kind: 'workspace', cwd: workspace }\n }\n return scope === '' ? { kind: 'global' } : { kind: 'mask', presetId: scope }\n}\n\n/** \u4E00\u53F0 Server \u7684\u6709\u6548\u72B6\u6001\u8F93\u5165\u3002\u4F18\u5148\u7EA7\uFF1Aconfig.disabled \u2192 mask \u2192 workspaceClosed\u3002 */\nexport interface McpEffectiveInput {\n /** \u5168\u5C40\u914D\u7F6E\u6761\u76EE\u672C\u8EAB\u88AB\u7981\u7528\uFF08\u786C\u5173\uFF0C\u540E\u9762\u51E0\u5C42\u90FD\u6253\u4E0D\u5F00\uFF09\u3002 */\n configDisabled?: boolean\n /** \u5F53\u524D\u9884\u8BBE\u628A\u5B83\u906E\u853D\u3002 */\n masked?: boolean\n /** \u5F53\u524D\u5DE5\u4F5C\u533A\u628A\u5B83\u5173\u95ED\u3002 */\n workspaceClosed?: boolean\n}\n\n/**\n * \u6709\u6548\u542F\u7528\u6001\uFF1B\u4EFB\u4E00\u5C42\u5173\u95ED\u5373\u4E3A\u5173\u3002\n * @param input - \u4E09\u5C42\u72B6\u6001\u3002\n * @returns \u6A21\u578B\u4FA7\u6700\u7EC8\u662F\u5426\u53EF\u89C1\u3002\n */\nexport function mcpEffectiveEnabled(input: McpEffectiveInput): boolean {\n return input.configDisabled !== true && input.masked !== true && input.workspaceClosed !== true\n}\n\n/** MCP \u914D\u7F6E\u6587\u672C\u683C\u5F0F\u3002 */\nexport type McpConfigFormat = 'json' | 'yaml'\n\n/** \u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u7F16\u8F91\u80FD\u529B\uFF08\u7F3A\u7701\u65F6\u7531\u5BA2\u6237\u7AEF\u6309\u6587\u672C\u5F62\u6001\u4FDD\u5B88\u63A8\u65AD\uFF09\u3002 */\nexport interface McpFormatCapabilities {\n /** \u652F\u6301\u7684\u683C\u5F0F\uFF1B\u7F3A\u7701 = \u4EC5\u5F53\u524D\u683C\u5F0F\u3002 */\n formats?: McpConfigFormat[]\n /** \u662F\u5426\u53EF\u7F16\u8F91\u3002 */\n editable?: boolean\n /** \u662F\u5426\u652F\u6301 JSON \u2194 YAML \u4E92\u8F6C\u3002 */\n convert?: boolean\n}\n\n/**\n * \u6E05\u6D17\u670D\u52A1\u7AEF\u8FD4\u56DE\u7684 capabilities\uFF08\u9632\u6B62\u810F\u5B57\u6BB5\u6E17\u8FDB UI\uFF09\u3002\n * @param value - \u539F\u59CB\u54CD\u5E94\u5B57\u6BB5\u3002\n * @returns \u89C4\u8303\u5316\u540E\u7684\u80FD\u529B\u5BF9\u8C61\uFF1B\u6CA1\u6709\u4EFB\u4F55\u6709\u6548\u5B57\u6BB5\u65F6 undefined\u3002\n */\nexport function normalizeMcpFormatCapabilities(value: unknown): McpFormatCapabilities | undefined {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const result: McpFormatCapabilities = {}\n if (Array.isArray(raw.formats)) {\n const formats = [...new Set(raw.formats.filter((item): item is McpConfigFormat => item === 'json' || item === 'yaml'))]\n if (formats.length > 0) result.formats = formats\n }\n if (typeof raw.editable === 'boolean') result.editable = raw.editable\n if (typeof raw.convert === 'boolean') result.convert = raw.convert\n return Object.keys(result).length === 0 ? undefined : result\n}\n\n/**\n * \u4ECE\u914D\u7F6E\u6587\u672C\u5F62\u6001\u5224\u65AD\u683C\u5F0F\uFF08\u4EC5\u5728\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE format \u65F6\u515C\u5E95\uFF0C\u4E0D\u6309\u6765\u6E90\u731C\uFF09\u3002\n * @param text - \u914D\u7F6E\u539F\u6587\u3002\n * @returns JSON \u6216 YAML\u3002\n */\nexport function detectMcpFormat(text: string): McpConfigFormat {\n const trimmed = text.trim()\n if (trimmed === '') return 'json'\n return trimmed.startsWith('{') || trimmed.startsWith('[') ? 'json' : 'yaml'\n}\n\n/**\n * \u7F16\u8F91\u5F39\u7A97\u53EF\u5207\u6362\u7684\u683C\u5F0F\u5217\u8868\u3002\n * @param capabilities - \u670D\u52A1\u7AEF\u80FD\u529B\uFF1B\u7F3A\u7701\u65F6\u53EA\u7528 fallback\u3002\n * @param fallback - \u4FDD\u5B88\u56DE\u9000\uFF08\u7F16\u8F91\u6A21\u5F0F\u901A\u5E38\u53EA\u5141\u8BB8\u5F53\u524D\u683C\u5F0F\uFF09\u3002\n * @returns \u53BB\u91CD\u540E\u7684\u683C\u5F0F\u5217\u8868\u3002\n */\nexport function mcpFormatOptions(\n capabilities: McpFormatCapabilities | undefined,\n fallback: McpConfigFormat[],\n): McpConfigFormat[] {\n const formats = capabilities?.formats\n return formats !== undefined && formats.length > 0 ? [...new Set(formats)] : [...new Set(fallback)]\n}\n\n/**\n * \u7F16\u8F91\u5F39\u7A97\u683C\u5F0F\u5165\u53E3\u3002\u5168\u5C40 profile patch \u7684\u539F\u59CB\u6587\u672C\u662F YAML\uFF0C\u4F46 JSON \u7F16\u8F91\u5165\u53E3\n * \u5FC5\u987B\u4FDD\u7559\uFF08\u5BBF\u4E3B /mcp-format \u80FD\u53CC\u5411\u4E92\u8F6C\uFF09\uFF1Bpreset/workspace \u7684 `.mcp.json`\n * \u53EA\u5141\u8BB8 JSON\u3002\n */\nexport function mcpEditFormatOptions(\n source: 'global' | 'preset' | 'workspace' | undefined,\n current: McpConfigFormat,\n capabilities?: McpFormatCapabilities,\n): McpConfigFormat[] {\n if (source === undefined) return mcpFormatOptions(capabilities, ['json', 'yaml'])\n if (source === 'global') return mcpFormatOptions(capabilities, [current, current === 'json' ? 'yaml' : 'json'])\n return mcpFormatOptions(capabilities, ['json'])\n}\n\n/** \u5DE5\u4F5C\u533A\u5DE5\u5177\u7981\u7528\u8D26\u672C\uFF1A\u4F18\u5148\u6309 server \u5206\u7EC4\u7684\u65B0\u63A5\u53E3\uFF0C\u5176\u6B21\u517C\u5BB9\u6241\u5E73\u7684\u65E7\u63A5\u53E3\u3002 */\nexport interface WorkspaceToolLedgerLike {\n /** \u65B0\u63A5\u53E3\uFF1Acwd \u2192 serverName \u2192 \u5DE5\u5177\u5168\u540D[]\u3002 */\n byServer?: Record<string, Record<string, string[]>> | undefined\n /** \u65E7\u63A5\u53E3\uFF1Acwd \u2192 \u5DE5\u5177\u5168\u540D[]\uFF08\u4E0D\u518D\u6309 `mcp__` \u524D\u7F00\u53CD\u63A8\u5F52\u5C5E\uFF09\u3002 */\n flat?: Record<string, string[]> | undefined\n}\n\n/**\n * \u67D0\u53F0 Server \u5728\u5F53\u524D\u5DE5\u4F5C\u533A\u88AB\u7981\u7528\u7684\u5DE5\u5177\u540D\u3002\n *\n * \u65B0\u63A5\u53E3\u6309 server \u5206\u7EC4\u76F4\u63A5\u53D6\uFF1B\u65E7\u63A5\u53E3\u9000\u56DE\u300C\u4E0E\u72B6\u6001\u63A5\u53E3\u91CC\u8BE5 Server \u7684 tools \u540D\u5355\u6C42\u4EA4\u300D\uFF0C\n * \u4E0D\u5728\u5BA2\u6237\u7AEF\u89E3\u6790 `mcp__` \u524D\u7F00\u3002\u65E0\u6CD5\u5F52\u5C5E\u7684\u65E7\u8D26\u76EE\u7531\u8C03\u7528\u65B9\u539F\u6837\u5C55\u793A\u3002\n *\n * @param ledger - \u5DE5\u4F5C\u533A\u5DE5\u5177\u7981\u7528\u8D26\u672C\u3002\n * @param cwd - \u5F53\u524D\u5DE5\u4F5C\u533A\uFF1Bnull \u8FD4\u56DE\u7A7A\u3002\n * @param serverName - Server \u540D\u3002\n * @param tools - \u72B6\u6001\u63A5\u53E3\u91CC\u8BE5 Server \u7684\u5DE5\u5177\u5217\u8868\uFF08\u6309 server \u5206\u7EC4\u7684\u7ED3\u679C\uFF09\u3002\n * @returns \u8BE5 Server \u7684\u7981\u7528\u5DE5\u5177\u5168\u540D\u3002\n */\nexport function workspaceDisabledToolsFor(\n ledger: WorkspaceToolLedgerLike,\n cwd: string | null,\n serverName: string,\n tools: ReadonlyArray<{ name: string }>,\n): string[] {\n if (cwd === null || cwd === '') return []\n const grouped = ledger.byServer?.[cwd]?.[serverName]\n if (grouped !== undefined) return grouped\n const owned = new Set(tools.map((tool) => tool.name))\n return (ledger.flat?.[cwd] ?? []).filter((name) => owned.has(name))\n}\n\n/**\n * \u65E7\u8D26\u672C\u91CC\u65E0\u6CD5\u5F52\u5230\u4EFB\u4F55 Server \u5361\u7247\u7684\u5DE5\u5177\u540D\uFF08\u539F\u6837\u5C55\u793A\u7528\uFF09\u3002\n * @param ledger - \u5DE5\u4F5C\u533A\u5DE5\u5177\u7981\u7528\u8D26\u672C\u3002\n * @param cwd - \u5F53\u524D\u5DE5\u4F5C\u533A\u3002\n * @param attributed - \u5DF2\u5F52\u5C5E\u5230\u5361\u7247\u7684\u5DE5\u5177\u540D\u96C6\u5408\u3002\n * @returns \u672A\u5F52\u5C5E\u7684\u5DE5\u5177\u5168\u540D\uFF08\u4EC5\u65E7\u6241\u5E73\u63A5\u53E3\u4F1A\u4EA7\u751F\uFF09\u3002\n */\nexport function ungroupedWorkspaceTools(\n ledger: WorkspaceToolLedgerLike,\n cwd: string | null,\n attributed: ReadonlySet<string>,\n): string[] {\n if (cwd === null || cwd === '') return []\n if (ledger.byServer?.[cwd] !== undefined) return []\n return (ledger.flat?.[cwd] ?? []).filter((name) => !attributed.has(name))\n}\n", "/**\n * skills/McpView \u2014 MCP \u9875\u4E3B\u533A\uFF1A\u7F16\u8F91\u5C42\u63D0\u793A\u884C + Server \u5217\u8868\u3002\n *\n * \u641C\u7D22\u3001\u8BA1\u6570\u5206\u6BB5\u3001\u8FDE\u63A5\u72B6\u6001\u4E0E\u5237\u65B0/\u6DFB\u52A0\u6309\u94AE\u90FD\u5728\u9876\u680F\uFF08McpTopBar\uFF09\uFF1B\u8FD9\u91CC\u53EA\u8D1F\u8D23\n * \u4E24\u4E2A\u5217\u8868\u5757\uFF1A\u300C\u7EE7\u627F\u7684\u5168\u5C40 Server\u300D\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\u4E0E\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\uFF0C\n * \u6BCF\u5F20\u5361\u7247\u5E26\u5DE5\u5177\u7EA7 chips\uFF08\u7EFF = \u542F\u7528\u3001\u7070 = \u7981\u7528\uFF0C\u70B9\u4E00\u4E0B\u5373\u5207\u6362\uFF09\uFF1B\u5361\u7247\u4E3B\u5F00\u5173\n * \u6309 level \u843D\u8D26\uFF1A\u9884\u8BBE\u7EA7 = \u906E\u853D\u5168\u5C40\u6761\u76EE\uFF0C\u5DE5\u4F5C\u533A\u7EA7 = \u5728\u5F53\u524D\u5DE5\u4F5C\u533A\u5173\u95ED\u8BE5 Server\u3002\n */\nimport { useEffect, useState } from 'react'\nimport {\n IconAgentPresetOutlineRegular, IconArchiveOutlineRegular, IconChevronDownOutlineRegular, IconTrashOutlineRegular, Modal, Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ConfirmDialog } from '../confirm-dialog'\nimport { LockGlyph } from './icons.js'\nimport { McpPasteAdd } from './McpAddModal.js'\nimport {\n isToolRegistrationPending, type LiveMcpServer, type LiveMcpStatus, type LiveMcpTool, type PresetMcpRowWire,\n} from './mcp-live.js'\nimport {\n detectMcpFormat, mcpEffectiveEnabled, mcpToggleTarget, normalizeMcpFormatCapabilities,\n ungroupedWorkspaceTools, workspaceDisabledToolsFor, type McpConfigFormat, type McpFormatCapabilities,\n} from './mcp-state.js'\nimport { css } from './styles.js'\n/**\n * \u5DE5\u5177 chips\uFF1A\u5361\u7247\u4E0A\u5217\u51FA\u8BE5 MCP \u63D0\u4F9B\u7684**\u5168\u90E8**\u5DE5\u5177\u540D\uFF0C\u7EFF = \u542F\u7528\u3001\u7070 = \u7981\u7528\uFF0C\n * \u70B9\u51FB\u5373\u5207\u6362\uFF08\u5355\u4E2A\u5DE5\u5177\u7EA7 disabled\uFF0C\u89C1 host \u7684 mcp-tool-disable\uFF09\u3002\n *\n * \u540D\u5355 = \u6CE8\u518C\u5DE5\u5177 \u222A \u8D26\u672C\u7981\u7528\u540D\uFF1A\u88AB\u7981\u7528\u7684\u5DE5\u5177\u5728 agent \u4F5C\u7528\u57DF\u91CC\u5DF2\u88AB\u9690\u85CF\n * \uFF08restrict\uFF09\uFF0C\u4F46\u8D26\u672C\u4ECD\u7559\u7740\u540D\u5B57\uFF0C\u6240\u4EE5\u8FD8\u80FD\u70B9\u56DE\u6765\u3002\n */\n/** \u5361\u7247\u8981\u5217\u51FA\u7684\u5DE5\u5177\u5168\u540D\uFF1A\u6CE8\u518C\u5217\u8868 \u222A \u8D26\u672C\u7981\u7528\u540D\uFF08\u88AB\u9690\u85CF\u7684\u4E5F\u8981\u80FD\u70B9\u56DE\u6765\uFF09\u3002 */\nexport function mcpToolNames(tools: LiveMcpTool[], disabledTools: string[]): string[] {\n const known = new Set(tools.map(tool => tool.name))\n return [...tools.map(tool => tool.name), ...disabledTools.filter(name => !known.has(name))]\n}\n\nexport function McpToolChips({ t, serverName, tools, disabledTools, locked, busy, onToggle }: {\n t: (key: string, params?: Record<string, string | number>) => string\n serverName: string\n tools: LiveMcpTool[]\n disabledTools: string[]\n /** \u9884\u8BBE\u8303\u56F4\u4E0B\u300C\u5168\u5C40\u5C42\u5DF2\u7981\u7528\u300D\u7684\u540D\u5B57\uFF1A\u9884\u8BBE\u5C42\u53EA\u80FD\u52A0\u7981\uFF0C\u4E0D\u80FD\u6253\u5F00\u5B83\u4EEC\u3002 */\n locked?: ReadonlySet<string>\n busy: string | null\n onToggle: (fullName: string, enabled: boolean) => void\n}): JSX.Element | null {\n const names = mcpToolNames(tools, disabledTools)\n if (names.length === 0) return null\n const off = new Set(disabledTools)\n return (\n <div className={css.mcpToolChips} role=\"group\" aria-label={t('mcpToolChipsAria', { name: serverName })}>\n {names.map((name) => {\n const disabled = off.has(name)\n const isLocked = locked?.has(name) === true\n const description = tools.find(tool => tool.name === name)?.description ?? ''\n return (\n <button\n key={name}\n type=\"button\"\n className={css.mcpToolChip}\n data-on={disabled ? undefined : 'true'}\n data-locked={isLocked || undefined}\n data-busy={busy === name || undefined}\n disabled={busy !== null || isLocked}\n aria-pressed={!disabled}\n title={isLocked\n ? `${t('mcpToolGlobalOffTip')}\\n${name}`\n : `${disabled ? t('mcpToolClickEnable') : t('mcpToolClickDisable')}\\n${name}${description === '' ? '' : `\\n${description}`}`}\n onClick={() => { onToggle(name, disabled) }}\n >\n {isLocked && <LockGlyph size={9} />}\n {name}\n </button>\n )\n })}\n </div>\n )\n}\n\n/**\n * MCP \u9875\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09\uFF1A\u56DB\u5F20\u7EDF\u8BA1\u5361 + \u5F53\u524D\u7F16\u8F91\u5C42\u63D0\u793A\u884C + \u5DE5\u5177\u6761\uFF08\u641C\u7D22 / \u5237\u65B0 /\n * \u6DFB\u52A0\uFF09+ Server \u5217\u8868\u3002\u5217\u8868\u56FA\u5B9A\u4E24\u5757\u2014\u2014\u300C\u7EE7\u627F\u7684\u5168\u5C40 Server\u300D\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\n * \u4E0E\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\uFF08\u5199\u8FDB\u8BE5\u9884\u8BBE\u7EC4\u5408\u6587\u4EF6\uFF09\uFF1B\u300C\u5168\u90E8 Agent\u300D\u5C42\u53EA\u6709\u524D\u8005\uFF0C\n * \u5F00\u5173\u76F4\u63A5\u542F\u7528/\u7981\u7528\u5168\u5C40\u6761\u76EE\u3002\n */\nexport function McpView({ t, live, scope, query, status, onRefresh, waitingTools, onWatchTools, addOwnOpen, onCloseAddOwn, workspace, level }: {\n t: (key: string, params?: Record<string, string | number>) => string\n live: LiveMcpStatus\n scope: string\n query: string\n status: 'all' | 'on' | 'off'\n onRefresh: () => void\n /** \u6B63\u5728\u7B49\u5F85\u6CE8\u518C\u5DE5\u5177\u7684 Server\uFF08\u9762\u677F\u5728\u8F6E\u8BE2\uFF0C\u65E0\u9700\u7528\u6237\u624B\u52A8\u5237\u65B0\uFF09\u3002 */\n waitingTools: string[]\n /** \u8BA9\u9762\u677F\u5F00\u59CB\u8F6E\u8BE2\u8FD9\u4E9B Server \u7684\u5DE5\u5177\u6CE8\u518C\uFF08\u542F\u7528\u540E\u81EA\u52A8\u7B49\uFF09\u3002 */\n onWatchTools: (names: string[]) => void\n /** \u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u5F39\u7A97\u5F00\u5173\uFF1A\u6309\u94AE\u5728\u9876\u680F\uFF0C\u72B6\u6001\u7531\u9762\u677F\u6301\u6709\u3002 */\n addOwnOpen: boolean\n onCloseAddOwn: () => void\n /** \u9762\u677F\u5F53\u524D\u9009\u4E2D\u7684\u5DE5\u4F5C\u533A\uFF08null = \u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD\uFF09\uFF1B\u5DE5\u4F5C\u533A\u7EA7\u5173\u95ED\u6309\u5B83\u8BB0\u8D26\u3002 */\n workspace: string | null\n /** \u7EDF\u4E00\u7F16\u8F91\u5C42\u7EA7\uFF1A\u5DE5\u4F5C\u533A\u7EA7\u624D\u663E\u793A\u300C\u672C\u5DE5\u4F5C\u533A\u5173\u95ED\u300D\u7B49\u6309 cwd \u8BB0\u8D26\u7684\u63A7\u5236\u3002 */\n level: 'preset' | 'workspace'\n}): JSX.Element {\n const [busy, setBusy] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n /** \u4E24\u4E2A\u5217\u8868\u5757\u7684\u6298\u53E0\u6001\uFF08\u9ED8\u8BA4\u5C55\u5F00\uFF0C\u70B9\u6807\u9898\u884C\u6536\u8D77\uFF09\u3002 */\n const [globalOpen, setGlobalOpen] = useState(true)\n const [ownOpen, setOwnOpen] = useState(true)\n /** mcps \u76EE\u5F55\u6765\u6E90\u90A3\u5757\uFF08\u5168\u5C40 + \u5DE5\u4F5C\u533A\uFF09\u7684\u6298\u53E0\u6001\u3002 */\n /** \u6B63\u5728\u5207\u6362\u7684\u5DE5\u5177\u5168\u540D\uFF08\u9632\u8FDE\u70B9\uFF09\u3002 */\n const [toolBusy, setToolBusy] = useState<string | null>(null)\n /** \u5168\u5C40\u6761\u76EE\u5220\u9664\u786E\u8BA4\uFF08null=\u5173\u95ED\uFF09\u3002 */\n const [removeReq, setRemoveReq] = useState<string | null>(null)\n const [editState, setEditState] = useState<{\n serverName: string\n text: string\n source: 'global' | 'preset' | 'workspace'\n preset?: string\n workspace?: string\n /** \u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u683C\u5F0F\uFF1B\u7F3A\u7701\u65F6\u6309\u6587\u672C\u5F62\u6001\u515C\u5E95\uFF08\u4E0D\u6309 source \u731C\uFF09\u3002 */\n format: McpConfigFormat\n /** \u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u7F16\u8F91\u80FD\u529B\uFF08\u53EF\u5207\u6362\u7684\u683C\u5F0F\u7B49\uFF09\u3002 */\n capabilities?: McpFormatCapabilities\n } | null>(null)\n const [wsNames, setWsNames] = useState<string[]>([])\n /** \u9884\u8BBE\u4E13\u5C5E\u884C\u79FB\u9664\u786E\u8BA4\uFF08null=\u5173\u95ED\uFF09\u3002 */\n const [removeOwnReq, setRemoveOwnReq] = useState<string | null>(null)\n // \u5F53\u524D\u5DE5\u4F5C\u533A .mcp.json \u91CC\u7684 server \u540D\uFF08\u7528\u4E8E\u7ED9\u5DE5\u4F5C\u533A\u6761\u76EE\u663E\u793A\u201C\u7F16\u8F91\u201D\u6309\u94AE\uFF09\u3002\n useEffect(() => {\n if (workspace === null || workspace === '') { setWsNames([]); return }\n let alive = true\n void fetch(`/api/triad/mcp-edit?source=workspace&workspace=${encodeURIComponent(workspace)}&serverName=`, { headers: { accept: 'application/json' } })\n .then((response) => response.json())\n .then((body) => { const payload = body as { ok?: boolean; names?: unknown } | null; if (alive && payload?.ok === true && Array.isArray(payload.names)) setWsNames((payload.names as unknown[]).map(String)) })\n .catch(() => { /* ignore */ })\n return () => { alive = false }\n }, [workspace])\n\n const ready = live.state === 'ready' ? live.data : null\n const globals = ready?.servers ?? []\n /**\n * \u5F53\u524D\u5DE5\u4F5C\u533A\u88AB\u5173\u6389\u7684 Server \u540D\u5355\uFF08\u8D26\u672C\u6309\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u8BB0\u8D26\uFF09\u3002\n * \u7A7A\u96C6 = \u6CA1\u6709\u4EFB\u4F55\u5DE5\u4F5C\u533A\u7EA7\u5173\u95ED\uFF0C\u5361\u7247\u7167\u5E38\u663E\u793A\u3002\n */\n const closedInWorkspace = new Set<string>(\n workspace === null\n ? []\n : Object.entries(ready?.workspaceClosed?.[workspace] ?? {})\n .filter(([, on]) => on === false)\n .map(([name]) => name),\n )\n const presets = ready?.presets ?? []\n const scoped = scope === '' ? undefined : presets.find(preset => preset.id === scope)\n const masked = new Set(Object.entries(ready?.masks?.[scope] ?? {})\n .filter(([, on]) => on === false).map(([name]) => name))\n const ownRows = scope === '' ? [] : (ready?.presetServers?.[scope] ?? [])\n const ownNames = new Set(ownRows.map(row => row.serverName))\n /* \u5DE5\u5177\u7EA7\u7981\u7528\u4E24\u5C42\u8D26\u672C\uFF1A\u6709\u6548\u7981\u7528 = \u5168\u5C40\u5C42 \u222A \u5F53\u524D\u9884\u8BBE\u5C42\uFF08\u9884\u8BBE\u5C42\u53EA\u52A0\u7981\uFF0C\u4E0D\u6253\u5F00\uFF09\u3002\n * \u9884\u8BBE\u81EA\u5E26\u7684\u5361\u53EA\u770B\u9884\u8BBE\u5C42 \u2014\u2014 \u4E0E\u7EE7\u627F\u6765\u7684\u5168\u5C40 Server \u5F7B\u5E95\u5206\u79BB\uFF08\u4E0D\u540C\u540D\u524D\u7F00\u4E5F\u4E0D\u4F1A\u4E92\u76F8\u7275\u8FDE\uFF09\u3002 */\n const globalOff = ready?.toolDisabled ?? {}\n const presetTables = ready?.toolDisabledByPreset ?? {}\n /** \u5DE5\u4F5C\u533A\u7EA7\u5DE5\u5177\u7981\u7528\u8D26\u672C\uFF1A\u65B0\u63A5\u53E3\u6309 server \u5206\u7EC4\u4F18\u5148\uFF0C\u65E7\u63A5\u53E3\u53EA\u505A\u540D\u5355\u6C42\u4EA4\uFF08\u4E0D\u89E3\u6790\u524D\u7F00\uFF09\u3002 */\n const workspaceToolLedger = {\n byServer: ready?.workspaceToolDisabledByServer,\n flat: ready?.workspaceToolDisabled,\n }\n /**\n * \u67D0\u6761\u300C\u884C\u300D\u7684\u6709\u6548\u7981\u7528\u96C6\u5408\uFF08\u540C\u540D\u4E5F\u5F7B\u5E95\u72EC\u7ACB\uFF09\uFF1A\n * inherit\uFF08\u7EE7\u627F\u7684\u5168\u5C40\u884C\uFF09= \u5168\u5C40\u5C42 \u222A inherit \u6761\u76EE\uFF1Bown\uFF08\u9884\u8BBE\u81EA\u5E26\u884C\uFF09= \u4EC5 own \u6761\u76EE\u3002\n * \u4E24\u6761\u884C\u5404\u8BB0\u4E00\u4EFD\u8D26\uFF0C\u4E92\u4E0D\u7275\u8FDE \u2014\u2014 \u64A4\u6389\u5176\u4E2D\u4E00\u6761\u65F6\u53E6\u4E00\u6761\u7684\u8BBE\u7F6E\u5404\u81EA\u751F\u6548\u3002\n */\n const offOf = (serverName: string, owner: 'own' | 'inherit', tools: LiveMcpTool[]): string[] => {\n const entry = presetTables[scope]?.[serverName]\n let base: string[]\n if (owner === 'own') base = entry?.own ?? []\n else if (scope === '') base = globalOff[serverName] ?? []\n else base = [...new Set([...(globalOff[serverName] ?? []), ...(entry?.inherit ?? [])])]\n if (level === 'workspace') {\n base = [...new Set([...base, ...workspaceDisabledToolsFor(workspaceToolLedger, workspace, serverName, tools)])]\n }\n return base\n }\n /** \u5168\u5C40\u5C42\u5DF2\u7981\u7528\u7684\u540D\u5B57\uFF1A\u7EE7\u627F\u884C\u65E0\u6CD5\u5728\u9884\u8BBE\u5C42\u6253\u5F00\u5B83\uFF08\u4E0E\u6280\u80FD\u9762\u677F\u540C\u6A21\u578B\uFF09\u3002 */\n const lockedOf = (serverName: string): Set<string> => new Set(scope === '' ? [] : globalOff[serverName] ?? [])\n /**\n * \u906E\u853D\u8BCA\u65AD\uFF1A\u8D26\u672C\u91CC\u6807\u4E86\u300C\u5DF2\u906E\u853D\u300D\u4F46\u8FD0\u884C\u671F\u4E00\u4E2A\u5DE5\u5177\u90FD\u6CA1\u62D2\u5230\uFF08\u6216\u5B89\u88C5\u62A5\u9519\uFF09\u65F6\n * \u7ED9\u51FA\u8BF4\u660E \u2014\u2014 \u4EE5\u524D\u8FD9\u79CD\u60C5\u51B5\u662F\u9759\u9ED8\u7684\uFF0C\u9762\u677F\u770B\u7740\u300C\u5DF2\u906E\u853D\u300D\u4F46\u6A21\u578B\u7AEF\u5DE5\u5177\u7167\u65E7\u53EF\u89C1\u3002\n */\n const maskInstall = ready?.maskInstall?.[scope]\n const maskWarn: string | null = (() => {\n if (scope === '' || masked.size === 0 || maskInstall === undefined) return null\n if (maskInstall.errors.length > 0) return t('mcpMaskInstallFailed', { message: maskInstall.errors[0]! })\n if (maskInstall.agents === 0) return t('mcpMaskNoAgent')\n if (maskInstall.deniedAgents === 0) return t('mcpMaskNoDeny')\n return null\n })()\n\n /** \u7EDF\u4E00\u5199\u8BF7\u6C42\uFF1A\u6210\u529F\u5237\u65B0\u6570\u636E\uFF0C\u5931\u8D25\u6536\u96C6\u9519\u8BEF\u6587\u6848\u3002 */\n const write = (token: string, url: string, payload: Record<string, unknown>): void => {\n if (busy !== null) return\n setBusy(token)\n setError(null)\n void fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(payload),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n const toggleGlobal = (serverName: string, disabled: boolean): void => {\n write(`toggle:${serverName}`, '/api/triad/mcp-config', { serverName, disabled })\n }\n /**\n * \u5728**\u5F53\u524D\u5DE5\u4F5C\u533A**\u5173\u95ED/\u542F\u7528\u8FD9\u53F0 Server\uFF08\u4E0D\u52A8 profile patch\uFF09\u3002\n *\n * \u8BED\u4E49\u4E0E\u6280\u80FD\u7684\u5DE5\u4F5C\u533A\u5206\u5C42\u4E00\u81F4\uFF1A\u53EA\u5F71\u54CD\u8BE5\u5DE5\u4F5C\u533A\u7684\u4F1A\u8BDD\uFF1B\u6362\u5DE5\u4F5C\u533A\u7167\u5E38\u6CE8\u5165\uFF0C\n * \u4E8E\u662F\u5DE5\u5177\u96C6\u5408\u968F\u5DE5\u4F5C\u533A\u53D8\u5316\u3002\u5173\u95ED\u540E\u8D70 PUT /api/triad/mcp-workspace-scope\u3002\n */\n const toggleWorkspaceServer = (serverName: string, enabled: boolean): void => {\n if (workspace === null) return\n const token = `ws:${serverName}`\n setBusy(token)\n setError(null)\n void fetch(`/api/triad/mcp-workspace-scope/workspace/${encodeURIComponent(workspace)}/servers/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled }),\n })\n .then(async (response) => {\n if (!response.ok) {\n const body = await response.json().catch(() => ({})) as { error?: string }\n throw new Error(body.error ?? `HTTP ${String(response.status)}`)\n }\n onRefresh()\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n /** \u6253\u5F00\u300C\u7F16\u8F91 MCP\u300D\uFF1A\u8BFB\u53D6\u8BE5\u5168\u5C40 server \u7684\u5F53\u524D config \u539F\u6587\uFF0C\u5F39\u7A97\u5185\u7F16\u8F91\u3002 */\n const openEdit = (serverName: string, source: 'global' | 'preset' | 'workspace' = 'global', extra?: { preset?: string; workspace?: string }): void => {\n setError(null)\n const qs = new URLSearchParams({ source, serverName })\n if (extra?.preset !== undefined) qs.set('preset', extra.preset)\n if (extra?.workspace !== undefined) qs.set('workspace', extra.workspace)\n void fetch(`/api/triad/mcp-edit?${qs.toString()}`, { headers: { accept: 'application/json' } })\n .then((response) => response.json())\n .then((body) => {\n const payload = body as {\n ok?: boolean; text?: string; error?: string; format?: unknown; capabilities?: unknown\n } | null\n if (payload?.ok === true) {\n const text = String(payload.text ?? '')\n const format = payload.format === 'json' || payload.format === 'yaml' ? payload.format : detectMcpFormat(text)\n setEditState({\n serverName,\n text,\n source,\n preset: extra?.preset,\n workspace: extra?.workspace,\n format,\n capabilities: normalizeMcpFormatCapabilities(payload.capabilities),\n })\n } else setError(String(payload?.error ?? 'load mcp config failed'))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n }\n\n const removeGlobal = (serverName: string): void => {\n write(`remove:${serverName}`, '/api/triad/mcp-config', { serverName, action: 'remove' })\n }\n const setMasked = (serverName: string, enabled: boolean): void => {\n if (busy !== null) return\n setBusy(`mask:${serverName}`)\n setError(null)\n void fetch(`/api/triad/mcp-masks/${encodeURIComponent(scope)}/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled }),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n /**\n * \u5DE5\u5177\u7EA7\u542F\u505C\uFF08\u5355\u6761\u6216\u591A\u6761\u4E00\u6279\uFF09\uFF1A`PUT /api/triad/mcp-tools/<server>`\n * `{ enabled, tools, preset?, source? }`\u3002\u8303\u56F4\u51B3\u5B9A\u5199\u54EA\u6761\u300C\u884C\u300D\uFF1A\n * \u300C\u5168\u90E8 Agent\u300D\u2192 \u5168\u5C40\u884C\uFF1B\u67D0\u4E2A\u9884\u8BBE \u2192 \u8BE5\u9884\u8BBE\u5C42\uFF08`source` \u6307\u5B9A\u54EA\u6761\u884C\uFF09\u3002\n */\n const putTools = (serverName: string, names: string[], enabled: boolean, source: 'own' | 'inherit'): void => {\n if (names.length === 0 || toolBusy !== null || busy !== null) return\n setToolBusy(names[0]!)\n setError(null)\n void fetch(`/api/triad/mcp-tools/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled, tools: names, ...(scope === '' ? {} : { preset: scope, source }) }),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setToolBusy(null) })\n }\n const toggleTool = (serverName: string, fullName: string, enabled: boolean, source: 'own' | 'inherit'): void => {\n if (level === 'workspace') {\n if (workspace === null) { setError('no active workspace'); return }\n if (toolBusy !== null || busy !== null) return\n setToolBusy(fullName)\n setError(null)\n void fetch(`/api/triad/mcp-workspace-scope/workspace/${encodeURIComponent(workspace)}/tools`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ name: fullName, enabled }),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setToolBusy(null) })\n return\n }\n putTools(serverName, [fullName], enabled, source)\n }\n /**\n * \u5DE5\u4F5C\u533A\u7EA7\u6279\u91CF\u5DE5\u5177\u542F\u505C\uFF1A\u5DE5\u4F5C\u533A\u5C42\u53EA\u63A5\u53D7\u5355\u4E2A\u5DE5\u5177\u540D\uFF0C\u9010\u6761\u987A\u5E8F\u5199\uFF0C\u907F\u514D\u5E76\u53D1\u8986\u76D6\u8D26\u672C\u3002\n * @param names - \u5DE5\u5177\u5168\u540D\u3002\n * @param enabled - true = \u542F\u7528\uFF08\u4ECE\u5DE5\u4F5C\u533A\u8D26\u672C\u79FB\u9664\uFF09\u3002\n */\n const putWorkspaceTools = (names: string[], enabled: boolean): void => {\n if (names.length === 0 || toolBusy !== null || busy !== null) return\n if (workspace === null) { setError('no active workspace'); return }\n setToolBusy(names[0]!)\n setError(null)\n void (async () => {\n for (const name of names) {\n const response = await fetch(`/api/triad/mcp-workspace-scope/workspace/${encodeURIComponent(workspace)}/tools`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ name, enabled }),\n })\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (!(response.ok && body?.ok === true)) throw new Error(body?.error ?? String(response.status))\n }\n onRefresh()\n })()\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setToolBusy(null) })\n }\n const removeOwn = (serverName: string): void => {\n if (busy !== null) return\n setBusy(`own:${serverName}`)\n setError(null)\n void fetch(`/api/triad/mcp-presets/${encodeURIComponent(scope)}/servers/${encodeURIComponent(serverName)}`, {\n method: 'DELETE', headers: { accept: 'application/json' },\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n /** \u4E00\u952E\u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u906E\u853D\uFF08\u987A\u5E8F\u9010\u4E2A\u53D6\u6D88\uFF0C\u907F\u514D\u5E76\u53D1\u5199\u8D26\u672C\u4E92\u76F8\u8986\u76D6\uFF09\u3002 */\n const clearMasks = (): void => {\n if (busy !== null || masked.size === 0) return\n setBusy('mask:__all__')\n setError(null)\n const names = [...masked]\n void (async () => {\n for (const serverName of names) {\n const response = await fetch(`/api/triad/mcp-masks/${encodeURIComponent(scope)}/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled: true }),\n })\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (!(response.ok && body?.ok === true)) throw new Error(body?.error ?? String(response.status))\n }\n onRefresh()\n })()\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n\n /** \u5361\u7247\u4E3B\u5F00\u5173\u7684\u5199\u76EE\u6807\uFF1A\u5DE5\u4F5C\u533A\u7EA7\u5199 workspace close\uFF0C\u9884\u8BBE\u7EA7\u5199 mask / global\u3002 */\n const target = mcpToggleTarget(level, scope, workspace)\n /** \u5168\u5C40\u884C\u7684\u6709\u6548\u542F\u7528\u6001\uFF1Aconfig.disabled \u2192 \u5F53\u524D\u9884\u8BBE mask \u2192 \u5F53\u524D\u5DE5\u4F5C\u533A\u5173\u95ED\u3002 */\n const globalRowEnabled = (server: LiveMcpServer): boolean => mcpEffectiveEnabled({\n configDisabled: server.config.disabled,\n masked: scope !== '' && masked.has(server.serverName),\n workspaceClosed: closedInWorkspace.has(server.serverName),\n })\n /** \u9884\u8BBE\u81EA\u5E26\u884C\u7684\u6709\u6548\u542F\u7528\u6001\uFF1A\u53EA\u53D7\u5F53\u524D\u5DE5\u4F5C\u533A\u5173\u95ED\u5F71\u54CD\u3002 */\n const ownRowEnabled = (row: PresetMcpRowWire): boolean =>\n mcpEffectiveEnabled({ workspaceClosed: closedInWorkspace.has(row.serverName) })\n const statusMatch = (enabled: boolean): boolean =>\n status === 'all' || (status === 'on' ? enabled : !enabled)\n\n /* \u8FC7\u6EE4\uFF1A\u641C\u7D22\u547D\u4E2D serverName \u6216\u5DE5\u5177\u540D\uFF1B\u72B6\u6001\u6863\u7EDF\u4E00\u6309 effectiveEnabled \u5224\u5B9A\u3002 */\n const needle = query.trim().toLowerCase()\n const shownGlobals = globals.filter(server => (needle === ''\n || server.serverName.toLowerCase().includes(needle)\n || server.tools.some(tool => tool.name.toLowerCase().includes(needle)))\n && statusMatch(globalRowEnabled(server)))\n const shownOwn = ownRows.filter(row => needle === ''\n || row.serverName.toLowerCase().includes(needle)\n || row.summary.toLowerCase().includes(needle))\n const shownOwnFiltered = shownOwn.filter(row => statusMatch(ownRowEnabled(row)))\n /** \u65E7\u6241\u5E73\u8D26\u672C\u91CC\u65E0\u6CD5\u5F52\u5230\u5361\u7247\u7684\u5DE5\u5177\u540D\uFF1A\u539F\u6837\u5C55\u793A\uFF0C\u4E0D\u6309 `mcp__` \u524D\u7F00\u731C\u5F52\u5C5E\u3002 */\n const attributedWorkspaceTools = new Set<string>()\n if (level === 'workspace') {\n for (const server of globals) {\n for (const name of workspaceDisabledToolsFor(workspaceToolLedger, workspace, server.serverName, server.tools)) attributedWorkspaceTools.add(name)\n }\n for (const row of ownRows) {\n for (const name of workspaceDisabledToolsFor(workspaceToolLedger, workspace, row.serverName, row.tools ?? [])) attributedWorkspaceTools.add(name)\n }\n }\n const unattributedWorkspaceTools = level === 'workspace'\n ? ungroupedWorkspaceTools(workspaceToolLedger, workspace, attributedWorkspaceTools)\n : []\n\n\n return (\n <div className={css.mcpServerMain}>\n {editState !== null && (\n <Modal open onClose={() => setEditState(null)} closeLabel={t('close')} title={t('mcpEditTitle')}>\n <McpPasteAdd\n key={`${editState.source}:${editState.preset ?? ''}:${editState.workspace ?? ''}:${editState.serverName}`}\n t={t}\n onAdded={() => { setEditState(null); onRefresh() }}\n onCancel={() => setEditState(null)}\n editServer={editState.serverName}\n editText={editState.text}\n editSource={editState.source}\n editPreset={editState.preset}\n editWorkspace={editState.workspace}\n editFormat={editState.format}\n editCapabilities={editState.capabilities}\n onEdited={() => { setEditState(null); onRefresh() }}\n />\n </Modal>\n )}\n {/* \u5F53\u524D\u7F16\u8F91\u5C42\u63D0\u793A\u884C\uFF08\u4E0E\u6280\u80FD\u9875 hintRow \u540C\u6784\uFF09 */}\n <div className={css.hintRow}>\n <span className={css.hintRowText}>\n {level === 'workspace'\n ? t('mcpScopeHintWorkspace', { path: workspace ?? '' })\n : scope === ''\n ? t('mcpScopeHintAll')\n : t('mcpScopeHintScoped', { name: scoped?.name ?? scope })}\n </span>\n {level === 'preset' && scope !== '' && masked.size > 0 && (\n <button type=\"button\" className={css.presetReset} disabled={busy !== null} onClick={clearMasks}>\n {t('presetReset')}\n </button>\n )}\n </div>\n\n {error !== null && <p className={css.error} role=\"alert\">{t('mcpPresetFailed', { message: error })}</p>}\n\n {/* \u906E\u853D\u8BCA\u65AD\uFF1A\u8D26\u672C\u5199\u4E86\u4F46\u8FD0\u884C\u671F\u6CA1\u62D2\u5230\u5DE5\u5177/\u5B89\u88C5\u62A5\u9519\u65F6\uFF0C\u660E\u786E\u8BF4\u51FA\u6765 */}\n {maskWarn !== null && <p className={css.error} role=\"alert\">{maskWarn}</p>}\n\n {/* \u65E7\u6241\u5E73\u8D26\u672C\u91CC\u65E0\u6CD5\u5F52\u5230\u5361\u7247\u7684\u5DE5\u5177\uFF1A\u539F\u6837\u5C55\u793A\u670D\u52A1\u7AEF\u7ED3\u6784\uFF0C\u4E0D\u5728\u5BA2\u6237\u7AEF\u6309\u524D\u7F00\u731C\u5F52\u5C5E */}\n {unattributedWorkspaceTools.length > 0 && (\n <p className={css.mcpEmptyList} role=\"status\">\n {t('mcpWorkspaceToolLedgerRaw', { names: unattributedWorkspaceTools.join('\u3001') })}\n </p>\n )}\n\n {/* \u6DFB\u52A0/\u542F\u7528\u540E\u7684\u81EA\u52A8\u7B49\u5F85\uFF1A\u9762\u677F\u5728\u8F6E\u8BE2\uFF0C\u7528\u6237\u4E0D\u7528\u518D\u624B\u52A8\u70B9\u300C\u5237\u65B0\u300D */}\n {waitingTools.length > 0 && (\n <p className={css.mcpEmptyList} role=\"status\">{t('mcpWaitingTools', { names: waitingTools.join('\u3001') })}</p>\n )}\n\n {live.state === 'unavailable' ? (\n <p className={css.mcpEmptyList}>{t('mcpLiveUnavailable')}</p>\n ) : (\n <>\n {/* \u2460 \u7EE7\u627F\u7684\u5168\u5C40 Server\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\uFF1B\u6807\u9898\u884C\u53EF\u6298\u53E0\uFF0C\u4E0E\u6280\u80FD\u9875\u6280\u80FD\u5305\u540C\u6784 */}\n <section className={css.hubSection} data-open={globalOpen ? 'true' : undefined}>\n <header className={css.bundleRowOuter} data-open={globalOpen ? 'true' : undefined}>\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={globalOpen}\n onClick={() => { setGlobalOpen((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconArchiveOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{scope === '' ? t('mcpListTitle') : t('mcpPresetGlobalSection')}</span>\n <span className={css.bundleCount}>{shownGlobals.length}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {globalOpen && (<>\n {scope !== '' && <p className={css.mcpEmptyList}>{t('mcpPresetMaskHint')}</p>}\n {shownGlobals.length === 0 ? (\n <p className={css.mcpEmptyList}>{globals.length === 0 ? t('mcpLiveEmpty') : t('mcpListFilteredEmpty')}</p>\n ) : (\n <div className={css.mcpRecGrid}>\n {shownGlobals.map((server) => {\n const isMasked = masked.has(server.serverName)\n const covered = ownNames.has(server.serverName)\n const offTools = offOf(server.serverName, 'inherit', server.tools)\n const lockedTools = lockedOf(server.serverName)\n const listed = server.tools.length\n const pendingReg = isToolRegistrationPending(server.toolCount, listed)\n /** \u88AB\u300C\u5168\u90E8 Agent\u300D\u5C42\u4E00\u7968\u5426\u51B3\u7684\u5DE5\u5177\u6570\uFF08\u9884\u8BBE\u89C6\u56FE\u91CC\u624D\u53EF\u80FD > 0\uFF09\u3002 */\n const lockedCount = mcpToolNames(server.tools, offTools).filter(name => lockedTools.has(name)).length\n /** \u5DE5\u4F5C\u533A\u7EA7\u4E3B\u5F00\u5173\u5199 workspace close\uFF1B\u9884\u8BBE\u7EA7\u5199 mask / global\uFF08toggleTarget \u7EDF\u4E00\uFF09\u3002 */\n const workspaceClosed = closedInWorkspace.has(server.serverName)\n const switchOn = target === null\n ? false\n : target.kind === 'workspace'\n ? !workspaceClosed\n : target.kind === 'mask' ? !isMasked : !server.config.disabled\n const switchDisabled = busy !== null || target === null\n || (target.kind === 'global' && !server.config.editable)\n const switchLabel = target === null\n ? t('mcpWorkspaceDisableHint')\n : target.kind === 'workspace'\n ? (workspaceClosed ? t('mcpWorkspaceEnable') : t('mcpWorkspaceDisable'))\n : target.kind === 'mask'\n ? (isMasked ? t('enableSkill') : t('mcpPresetMasked'))\n : t('mcpLiveDisabled')\n return (\n <section key={`global-${server.serverName}`} className={css.mcpRecCard}>\n <div className={css.mcpRecCardHead}>\n <span className={css.mcpRecCardTitleRow}>\n <span className={css.mcpRecCardName}>{server.serverName}</span>\n <span className={css.mcpRecCardTags}>\n {/* \u6570\u91CF\u8DDF\u968F\u5361\u7247\u5B9E\u9645\u5217\u51FA\u7684\u5DE5\u5177\uFF1A\u8FDB\u7A0B\u8FD8\u5728\u8FDE\u65F6\u5148\u6309\u540D\u5355\u7F13\u5B58\u663E\u793A\uFF0C\u5E76\u6807\u51FA\u300C\u7B49\u5F85\u6CE8\u518C\u300D */}\n <span className={css.mcpRecCatTag}>\n {server.toolCount > 0 ? server.toolCount : listed} {t('mcpLiveToolsOf')}\n </span>\n {pendingReg && (\n <span className={css.mcpRecCatTag} data-off=\"true\" title={t('mcpToolsPendingRegTip')}>\n {t('mcpToolsPendingReg')}\n </span>\n )}\n {/* \u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF1A\u9884\u8BBE\u5C42\u8FD9\u4E9B\u5DE5\u5177\u88AB\u5F3A\u5236\u7F6E\u7070\u3001\u4E0D\u53EF\u62E8\u52A8 */}\n {lockedCount > 0 && (\n <span className={css.mcpRecCatTag} data-locked=\"true\" title={t('mcpToolGlobalOffTip')}>\n {t('mcpToolGlobalOff')}{lockedCount > 1 ? ` ${lockedCount}` : ''}\n </span>\n )}\n {offTools.length > 0 && (\n <span className={css.mcpRecCatTag} data-off=\"true\">{t('mcpToolDisabledCount', { n: offTools.length })}</span>\n )}\n {scope === ''\n ? (server.config.disabled ? <span className={css.mcpRecCatTag}>{t('mcpLiveDisabled')}</span> : null)\n : (isMasked ? <span className={css.mcpRecCatTag}>{t('mcpPresetMasked')}</span> : null)}\n {/* \u6765\u6E90\u4E0E\u5DE5\u4F5C\u533A\u72B6\u6001\uFF1A\u5168\u5C40\u884C\u8FD8\u662F\u67D0\u5DE5\u4F5C\u533A\u4E13\u7528\uFF0C\u4EE5\u53CA\u672C\u5DE5\u4F5C\u533A\u662F\u5426\u5DF2\u5173\u3002 */}\n <span className={css.scopeTag} data-scope='global' title={t('originGlobalHint')}>{t('originGlobal')}</span>\n {closedInWorkspace.has(server.serverName) && (\n <span className={css.scopeTag} data-scope='workspace' data-side='closed' title={t('mcpWorkspaceClosedHint')}>\n {t('mcpWorkspaceClosed')}\n </span>\n )}\n </span>\n </span>\n <Tooltip\n label={target?.kind === 'workspace'\n ? (workspaceClosed ? t('mcpWorkspaceEnableHint') : t('mcpWorkspaceDisableHint'))\n : target?.kind === 'mask' && covered\n ? t('mcpPresetCoveredSwitchHint')\n : switchLabel}\n side=\"bottom\"\n delayMs={500}\n >\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={switchOn}\n aria-label={switchLabel}\n className={`${css.toggle} ${switchOn ? css.toggleOn : css.toggleOff}`}\n /* \u9884\u8BBE\u5C42\uFF1A\u5373\u4F7F\u8BE5\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server\uFF0C\u4E5F\u5141\u8BB8\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761 \u2014\u2014\n * \u906E\u853D\u662F\u300C\u672C\u9884\u8BBE\u4E0D\u8981\u5168\u5C40\u90A3\u4EFD\u300D\u7684\u6301\u4E45\u8868\u8FBE\uFF0C\u7B49\u81EA\u5E26\u7684\u88AB\u79FB\u9664\u540E\u5373\u523B\u751F\u6548\u3002 */\n disabled={switchDisabled}\n onClick={() => {\n if (target === null) return\n if (target.kind === 'global') {\n const nextDisabled = !server.config.disabled\n toggleGlobal(server.serverName, nextDisabled)\n // \u542F\u7528 = \u91CD\u65B0\u62C9\u8D77\u8FDB\u7A0B\u5E76\u6CE8\u518C\u5DE5\u5177\uFF1A\u5F00\u59CB\u8F6E\u8BE2\uFF0C\u522B\u8BA9\u7528\u6237\u7B49 / \u624B\u70B9\u5237\u65B0\u3002\n if (!nextDisabled) onWatchTools([server.serverName])\n } else if (target.kind === 'mask') setMasked(server.serverName, isMasked)\n else toggleWorkspaceServer(server.serverName, workspaceClosed)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n <p className={css.mcpRecCardDesc}>\n {server.config.disabled && scope === '' && server.tools.length === 0\n ? `${t('mcpLiveDisabled')} \u00B7 ${t('mcpToolsUnavailable')}`\n : t('mcpToolsHint')}\n </p>\n <McpToolChips\n t={t}\n serverName={server.serverName}\n tools={server.tools}\n disabledTools={offTools}\n locked={lockedTools}\n busy={toolBusy}\n onToggle={(fullName, enabled) => { toggleTool(server.serverName, fullName, enabled, 'inherit') }}\n />\n <div className={css.mcpCardFoot}>\n <span className={css.mcpCardItem}>\n <span className={css.mcpCardItemLabel}>\n {scope === '' ? t('mcpLiveConfigHint')\n : covered\n ? (isMasked ? t('mcpPresetCoveredMasked') : t('mcpPresetCovered'))\n : isMasked ? t('mcpPresetMasked') : t('mcpPresetMaskState')}\n </span>\n </span>\n {scope === '' && server.config.editable ? (\n <button type=\"button\" className={css.mcpCardDelete} title={t('mcpEdit')} disabled={busy !== null} onClick={() => { openEdit(server.serverName) }}>\n {t('mcpEdit')}\n </button>\n ) : null}\n {scope === '' && !server.config.editable && workspace !== null && wsNames.includes(server.serverName) ? (\n <button type=\"button\" className={css.mcpCardDelete} title={t('mcpEdit')} disabled={busy !== null} onClick={() => { openEdit(server.serverName, 'workspace', { workspace: workspace ?? undefined }) }}>\n {t('mcpEdit')}\n </button>\n ) : null}\n {scope === '' && server.config.editable ? (\n <button\n type=\"button\"\n className={css.mcpCardDelete}\n title={t('mcpRemove')}\n disabled={busy !== null}\n onClick={() => { setRemoveReq(server.serverName) }}\n >\n <IconTrashOutlineRegular size={13} aria-hidden=\"true\" />{t('mcpRemove')}\n </button>\n ) : null}\n </div>\n </section>\n )\n })}\n </div>\n )}\n </>)}\n </section>\n\n {/* \u2462 \u8BE5\u9884\u8BBE\u4E13\u5C5E Server\uFF08\u5199\u8FDB\u8BE5\u9884\u8BBE\u7EC4\u5408\u6587\u4EF6\uFF09\uFF1B\u6807\u9898\u884C\u540C\u6837\u53EF\u6298\u53E0 */}\n {scope !== '' && (\n <section className={css.hubSection} data-open={ownOpen ? 'true' : undefined}>\n <header className={css.bundleRowOuter} data-open={ownOpen ? 'true' : undefined}>\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={ownOpen}\n onClick={() => { setOwnOpen((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconAgentPresetOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{t('mcpPresetOwnSection')}</span>\n <span className={css.bundleCount}>{shownOwnFiltered.length}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {ownOpen && (<>\n <p className={css.mcpEmptyList}>{t('mcpPresetOwnHint')}</p>\n {scoped?.trust === 'system' && <p className={css.mcpEmptyList}>{t('mcpPresetStorageHint')}</p>}\n {shownOwnFiltered.length === 0 ? (\n <p className={css.mcpEmptyList}>{ownRows.length === 0 ? t('mcpPresetOwnEmpty') : t('mcpListFilteredEmpty')}</p>\n ) : (\n <div className={css.mcpRecGrid}>\n {shownOwnFiltered.map(row => {\n /* \u9884\u8BBE\u81EA\u5E26\u7684\u8FD9\u6761\u884C\u53EA\u8BA4 own \u6761\u76EE\uFF1A\u5168\u5C40\u884C/\u7EE7\u627F\u884C\u7684\u8BBE\u7F6E\u4E0E\u5B83\u4E92\u4E0D\u5F71\u54CD\u3002 */\n const offOwn = offOf(row.serverName, 'own', row.tools ?? [])\n /** \u4E00\u952E\u5168\u7981/\u5168\u5F00\uFF1A\u4E00\u6B21\u8BF7\u6C42\u5E26\u4E0A\u8BE5\u884C\u7684\u5168\u90E8\u5DE5\u5177\u540D\u3002 */\n const ownToolNames = (row.tools ?? []).map(tool => tool.name)\n const allDisabled = ownToolNames.length > 0 && ownToolNames.every(name => offOwn.includes(name))\n return (\n <section key={`own-${row.serverName}`} className={css.mcpRecCard}>\n <div className={css.mcpRecCardHead}>\n <span className={css.mcpRecCardTitleRow}>\n <span className={css.mcpRecCardName}>{row.serverName}</span>\n <span className={css.mcpRecCardTags}>\n <span className={css.mcpRecCatTag}>{row.transport}</span>\n <span className={css.mcpRecCatTag}>\n {row.registeredCount === undefined\n ? t('mcpToolsUnknown')\n : `${row.registeredCount > 0 ? row.registeredCount : (row.tools?.length ?? 0)} ${t('mcpLiveToolsOf')}`}\n </span>\n {row.registeredCount !== undefined && isToolRegistrationPending(row.registeredCount, row.tools?.length ?? 0) && (\n <span className={css.mcpRecCatTag} data-off=\"true\" title={t('mcpToolsPendingRegTip')}>\n {t('mcpToolsPendingReg')}\n </span>\n )}\n {globals.some(item => item.serverName === row.serverName) && (\n <span className={css.mcpRecCatTag} data-shadow=\"true\" title={t('mcpPresetShadowGlobalTip')}>\n {t('mcpPresetShadowGlobalTag')}\n </span>\n )}\n {offOwn.length > 0 && (\n <span className={css.mcpRecCatTag} data-off=\"true\">{t('mcpToolDisabledCount', { n: offOwn.length })}</span>\n )}\n </span>\n </span>\n {/* \u4E00\u952E\u5168\u7981/\u5168\u5F00\uFF1A\u9884\u8BBE\u81EA\u5E26\u8FD9\u53F0\u7684\u300C\u5FEB\u901F\u7981\u7528\u5168\u90E8\u5DE5\u5177\u300D\u6ED1\u5757 */}\n <Tooltip\n label={ownToolNames.length === 0\n ? t('mcpToolsPendingRegTip')\n : allDisabled\n ? t('mcpToolAllEnable')\n : offOwn.length > 0\n ? `${t('mcpToolAllPartial')} \u00B7 ${t('mcpToolAllDisable')}`\n : t('mcpToolAllDisable')}\n side=\"bottom\"\n delayMs={400}\n >\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!allDisabled}\n aria-label={t('mcpToolAllAria', { name: row.serverName })}\n className={`${css.toggle} ${allDisabled ? css.toggleOff : css.toggleOn}`}\n disabled={busy !== null || toolBusy !== null || ownToolNames.length === 0 || (level === 'workspace' && workspace === null)}\n onClick={() => {\n if (level === 'workspace') putWorkspaceTools(ownToolNames, allDisabled)\n else putTools(row.serverName, ownToolNames, allDisabled, 'own')\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n <p className={css.mcpRecCardDesc}>{row.summary}</p>\n <McpToolChips\n t={t}\n serverName={row.serverName}\n tools={row.tools ?? []}\n disabledTools={offOwn}\n busy={toolBusy}\n onToggle={(fullName, enabled) => { toggleTool(row.serverName, fullName, enabled, 'own') }}\n />\n <div className={css.mcpCardFoot}>\n <span className={css.mcpCardItem}>\n <span className={css.mcpCardItemLabel}>{t('mcpPresetNewSession')}</span>\n </span>\n <button type=\"button\" className={css.mcpCardDelete} title={t('mcpEdit')} disabled={busy !== null} onClick={() => { openEdit(row.serverName, 'preset', { preset: scope }) }}>\n {t('mcpEdit')}\n </button>\n <button\n type=\"button\"\n className={css.mcpCardDelete}\n disabled={busy !== null}\n onClick={() => { setRemoveOwnReq(row.serverName) }}\n >\n <IconTrashOutlineRegular size={13} aria-hidden=\"true\" />{t('mcpRemove')}\n </button>\n </div>\n </section>\n )\n })}\n </div>\n )}\n </>)}\n </section>\n )}\n </>\n )}\n\n {/* \u9884\u8BBE\u4E13\u5C5E\u6DFB\u52A0\uFF1A\u7C98\u8D34 JSON / DSH \u539F\u751F YAML\uFF08\u6309\u94AE\u5728\u9876\u680F\uFF09 */}\n <Modal\n open={addOwnOpen}\n onClose={onCloseAddOwn}\n closeLabel={t('close')}\n title={`${t('mcpPresetAddOwn')} \u00B7 ${scoped?.name ?? scope}`}\n >\n <McpPasteAdd\n t={t}\n presetId={scope}\n workspace={workspace}\n onAdded={(added) => { onRefresh(); onWatchTools(added) }}\n onCancel={onCloseAddOwn}\n />\n </Modal>\n\n {/* \u5168\u5C40\u6761\u76EE\u5220\u9664\u786E\u8BA4 */}\n {removeReq !== null && (\n <ConfirmDialog\n open\n title={t('mcpRemoveConfirmTitle')}\n message={t('mcpRemoveConfirmMsg', { name: removeReq })}\n confirmLabel={t('mcpRemove')}\n cancelLabel={t('cancel')}\n danger\n onConfirm={() => { const name = removeReq; setRemoveReq(null); removeGlobal(name) }}\n onClose={() => { setRemoveReq(null) }}\n />\n )}\n\n {/* \u9884\u8BBE\u4E13\u5C5E\u884C\u79FB\u9664\u786E\u8BA4\uFF08\u540C\u540D\u5168\u5C40\u6761\u76EE\u4E0D\u53D7\u5F71\u54CD\uFF09 */}\n {removeOwnReq !== null && (\n <ConfirmDialog\n open\n title={t('mcpOwnRemoveConfirmTitle')}\n message={t('mcpOwnRemoveConfirmMsg', { name: removeOwnReq })}\n confirmLabel={t('mcpRemove')}\n cancelLabel={t('cancel')}\n danger\n onConfirm={() => { const name = removeOwnReq; setRemoveOwnReq(null); removeOwn(name) }}\n onClose={() => { setRemoveOwnReq(null) }}\n />\n )}\n </div>\n )\n}\n", "/**\n * ConfirmDialog \u2014 \u66FF\u4EE3 window.confirm \u7684\u4E3B\u9898\u5316\u786E\u8BA4\u5F39\u7A97\uFF08\u6280\u80FD\u9762\u677F\u7834\u574F\u6027\u64CD\u4F5C\u4E13\u7528\uFF09\u3002\n *\n * \u80CC\u666F\uFF1Awindow.confirm \u5728 Electron \u91CC\u662F\u7CFB\u7EDF\u6837\u5F0F\u7684\u7070\u5E95\u5F39\u7A97\uFF08\u6807\u9898\u8FD8\u662F\u7A97\u53E3\u540D\n * dsh-shell\uFF09\uFF0C\u8DDF DSH/\u63D2\u4EF6\u4E3B\u9898\u5B8C\u5168\u8131\u79BB\uFF0C\u4E14\u65E0\u6CD5\u5B9A\u5236\u3002\u672C\u7EC4\u4EF6\u63D0\u4F9B\u540C\u8BED\u4E49\u66FF\u4EE3\uFF1A\n *\n * - createPortal \u5230 body\uFF1A\u7956\u5148\u5BB9\u5668\uFF08\u73BB\u7483\u8D28\u611F backdrop-filter / transform\uFF09\n * \u4F1A\u628A position:fixed \u9489\u8FDB\u5C40\u90E8\u5750\u6807\u7CFB\uFF0C\u906E\u7F69\u5FC5\u987B\u6302\u5230 document.body\uFF1B\n * - z-index 1200\uFF1A\u5168\u5C4F\u5F39\u5C42\u60EF\u4F8B\uFF08\u9AD8\u4E8E popover-shell \u7684 mask 999 / card 1000\uFF09\uFF1B\n * - \u5F00\u5408\u52A8\u753B\u590D\u7528 modal-animation\uFF1Amask \u6DE1\u5165\u6DE1\u51FA + \u5361\u7247\u81EA\u5E95\u90E8 24px \u4E0A\u6ED1\u5F39\u51FA\u3001\n * \u53CD\u5411\u6536\u56DE\uFF0C\u5185\u5BB9\u65E0\u9519\u843D\uFF08\u786E\u8BA4\u5F39\u7A97\u5185\u5BB9\u77ED\uFF0C\u4E0D\u9700\u8981 stagger\uFF09\uFF0C\n * \u5E76\u9075\u5B88 prefers-reduced-motion\uFF1B\n * - \u4EA4\u4E92\uFF1AEsc / \u70B9\u906E\u7F69 = \u53D6\u6D88\uFF1B\u786E\u8BA4\u94AE autoFocus\uFF08\u56DE\u8F66\u5373\u786E\u8BA4\uFF09\uFF1B\u70B9\u786E\u8BA4\u540E\u5148\n * \u64AD\u6536\u56DE\u52A8\u753B\u3001240ms \u540E\u518D\u5378\u8F7D\uFF08onClose\uFF09\uFF0C\u6267\u884C\u52A8\u4F5C\u4E0E\u52A8\u753B\u5E76\u884C\u4E0D\u963B\u585E\uFF1B\n * - danger \u53D8\u4F53\uFF1A\u7834\u574F\u6027\u64CD\u4F5C\uFF08\u5220\u9664/\u6E05\u7A7A/\u56DE\u6EDA\uFF09\u786E\u8BA4\u6309\u94AE\u7528\u8B66\u793A\u7EA2\n * \uFF08--dsw-alias-state-error-primary\uFF09\uFF0C\u4E0E\u9762\u677F iconActionDanger \u540C\u6B3E\u8272\u3002\n *\n * \u6837\u5F0F\u72EC\u7ACB\u6CE8\u5165\uFF08STYLE_ID \u5E42\u7B49\uFF09\uFF0C\u7C7B\u540D\u524D\u7F00 mcd-\uFF0C\u4E0D\u4F9D\u8D56 popover-shell \u5185\u90E8\u7C7B\u3002\n */\n\nimport { useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport {\n ensureModalAnimStyles,\n modalAnimClass,\n modalMaskAnimClass,\n useModalClose,\n} from './modal-animation.js'\nconst STYLE_ID = 'dsh-prompt-customizer-confirm-dialog-styles'\n\nconst SHEET = `\n/* \u2500\u2500 \u906E\u7F69\uFF1A\u56FA\u5B9A\u5168\u5C4F\uFF0C\u70B9\u51FB=\u53D6\u6D88 \u2500\u2500 */\n.mcd-mask{position:fixed;inset:0;z-index:1200;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.45))}\n/* \u5C45\u4E2D\u5BB9\u5668\uFF1Aflex \u5B9A\u4F4D\uFF0C\u5361\u7247\u52A8\u753B\u7684 transform \u4E0D\u4E0E\u5176\u51B2\u7A81 */\n.mcd-wrap{position:fixed;inset:0;z-index:1201;display:flex;align-items:center;justify-content:center;pointer-events:none}\n/* \u2500\u2500 \u5361\u7247\uFF1A\u5B9E\u5E95\uFF08\u73BB\u7483\u6A21\u5F0F\u4E5F\u4E0D\u900F\uFF09\u3001\u5706\u89D2 14\u3001l3 \u6295\u5F71 \u2500\u2500 */\n.mcd-card{\n pointer-events:auto;display:flex;flex-direction:column;\n width:min(420px,calc(100vw - 48px));max-height:calc(100vh - 96px);\n box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));\n border-radius:14px;\n box-shadow:var(--dsw-shadow-lv3,0 8px 40px rgba(0,0,0,.5));\n overflow:hidden}\n/* \u5B9E\u5E95\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4FDD\u6301\u4E0D\u900F\u660E\u8868\u9762\uFF08\u540C popover-shell \u7684 data-solid \u89C4\u5219\uFF1A\n \u9759\u6001 token + html[data-dsh-glass] \u524D\u7F00\u538B\u8FC7 glass.ts \u7684 transparent \u89C4\u5219\uFF09 */\n.mcd-card,html[data-dsh-glass] .mcd-card{\n background:var(--dsw-static-neutral-bluish-00,#fff);\n backdrop-filter:none;-webkit-backdrop-filter:none}\nbody[data-ds-dark-theme] .mcd-card,html[data-dsh-glass] body[data-ds-dark-theme] .mcd-card{\n background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\n/* \u2500\u2500 \u5185\u5BB9 \u2500\u2500 */\n.mcd-title{flex:none;padding:14px 18px 8px;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#eee)}\n.mcd-body{flex:none;min-height:0;padding:0 18px 16px;overflow-y:auto;font-size:13px;line-height:20px;color:var(--dsw-alias-label-secondary,#bbb);word-break:break-word}\n.mcd-actions{flex:none;display:flex;justify-content:flex-end;gap:8px;padding:12px 14px;border-top:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.06))}\n/* danger \u53D8\u4F53\uFF1A\u8B66\u793A\u7EA2\u786E\u8BA4\u6309\u94AE\uFF08outline \u5E95 + \u7EA2\u5B57\u7EA2\u6846\uFF0Chover \u52A0\u6DF1\uFF09 */\n.mcd-btn-danger{\n border-color:var(--dsw-alias-state-error-primary,#e0434b)!important;\n color:var(--dsw-alias-state-error-primary,#e0434b)!important}\n.mcd-btn-danger:hover{\n background:var(--dsw-alias-interactive-bg-hover-danger,rgba(224,67,75,.12))!important;\n border-color:var(--dsw-alias-state-error-primary,#e0434b)!important;\n color:var(--dsw-alias-state-error-primary,#e0434b)!important}\n@media (prefers-reduced-motion:reduce){\n .mcd-mask,.mcd-card{animation:none!important}\n}\n`\n\n/** \u6CE8\u5165\u786E\u8BA4\u5F39\u7A97\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nfunction ensureDialogStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** ConfirmDialog \u5C5E\u6027\u3002 */\nexport interface ConfirmDialogProps {\n open: boolean\n /** \u6807\u9898\uFF08\u77ED\u540D\u8BCD\uFF0C\u5982\u300C\u8BF7\u786E\u8BA4\u300D\uFF09\u3002 */\n title: string\n /** \u8BF4\u660E\u6587\u6848\uFF08\u5DF2\u6E32\u67D3\u597D\u7684\u5B57\u7B26\u4E32\uFF0C\u542B\u53C2\u6570\u65F6\u7531\u8C03\u7528\u65B9 t() \u5C55\u5F00\uFF09\u3002 */\n message: string\n confirmLabel: string\n cancelLabel: string\n /** \u7834\u574F\u6027\u64CD\u4F5C\uFF1A\u786E\u8BA4\u6309\u94AE\u8B66\u793A\u7EA2\u3002 */\n danger?: boolean\n /** \u70B9\u786E\u8BA4\uFF1A\u7ACB\u5373\u6267\u884C\uFF08\u4E0E\u6536\u56DE\u52A8\u753B\u5E76\u884C\uFF09\u3002 */\n onConfirm: () => void\n /** \u771F\u6B63\u5173\u95ED\uFF08\u6536\u56DE\u52A8\u753B\u64AD\u5B8C\u540E\u89E6\u53D1\uFF1B\u8C03\u7528\u65B9\u5728\u6B64\u6E05 state\uFF09\u3002 */\n onClose: () => void\n}\n\n/**\n * \u4E3B\u9898\u5316\u786E\u8BA4\u5F39\u7A97\u3002\u8C03\u7528\u65B9\u4EE5 `open` \u63A7\u5236\u663E\u793A\uFF1A\n * \u6761\u4EF6\u6E32\u67D3 `{req !== null && <ConfirmDialog open ... />}` \u65F6\uFF0C\n * open \u6052\u4E3A true\uFF0C\u6302\u8F7D\u5373\u5F39\u5165\uFF1BonClose \u91CC\u628A req \u7F6E null \u5373\u5378\u8F7D\u3002\n */\nexport function ConfirmDialog({\n open, title, message, confirmLabel, cancelLabel, danger = false, onConfirm, onClose,\n}: ConfirmDialogProps): JSX.Element | null {\n ensureModalAnimStyles()\n ensureDialogStyles()\n const { closing, requestClose } = useModalClose(open, onClose)\n\n // Esc = \u53D6\u6D88\uFF08\u4E0E\u906E\u7F69\u70B9\u51FB\u7B49\u4EF7\uFF09\u3002\n useEffect(() => {\n if (!open) return undefined\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') requestClose()\n }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [open, requestClose])\n\n if (!open) return null\n\n const handleConfirm = (): void => {\n onConfirm()\n requestClose()\n }\n const handleCancel = (): void => {\n requestClose()\n }\n\n return createPortal(\n <>\n <div className={`mcd-mask ${modalMaskAnimClass(closing)}`} aria-hidden=\"true\" onClick={handleCancel} />\n <div className=\"mcd-wrap\">\n <div className={`mcd-card ${modalAnimClass(closing)}`} role=\"dialog\" aria-modal=\"true\" aria-label={title}>\n <div className=\"mcd-title\">{title}</div>\n <div className=\"mcd-body\">{message}</div>\n <div className=\"mcd-actions\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleCancel}>{cancelLabel}</Button>\n <Button\n variant={danger ? 'outline' : 'primary'}\n size=\"sm\"\n autoFocus\n className={danger ? 'mcd-btn-danger' : undefined}\n onClick={handleConfirm}\n >\n {confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n", "/**\n * skills/mcp-live \u2014 /api/triad/mcp-status \u7684\u771F\u5B9E MCP \u72B6\u6001\u3002\n *\n * \u7C7B\u578B\uFF08\u5DE5\u5177/Server/\u9884\u8BBE\u884C/\u6574\u4EFD\u5FEB\u7167\uFF09+ \u62C9\u53D6 hook + \u300C\u5DE5\u5177\u662F\u5426\u5DF2\u6CE8\u518C\u300D\u5224\u5B9A\uFF1B\n * \u9762\u677F\u4E0E MCP \u89C6\u56FE\u5171\u7528\u3002\n */\nimport { useEffect, useState } from 'react'\nimport type { PresetRow } from './types.js'\n\n\n/** \u771F\u5B9E MCP \u72B6\u6001\uFF08host /api/triad/mcp-status\uFF1Actx.tools \u4E2D mcp__* \u5DE5\u5177\u5206\u7EC4\uFF09\u3002 */\nexport interface LiveMcpTool {\n name: string\n description: string\n}\nexport interface LiveMcpServer {\n serverName: string\n toolCount: number\n tools: LiveMcpTool[]\n /** \u914D\u7F6E\u6587\u4EF6\u6761\u76EE\u4FE1\u606F\uFF08\u542F\u7528/\u7981\u7528\u5F00\u5173\u7528\uFF09\u3002 */\n config: { entryId: string | null; disabled: boolean; editable: boolean }\n /** 0.1.6\uFF1A\u4F5C\u7528\u57DF\uFF08\u5F53\u524D\u6052\u4E3A global\uFF09\u3002 */\n scope?: string\n /** 0.1.6\uFF1A\u54EA\u4E9B Agent \u9884\u8BBE\u906E\u853D\u4E86\u5B83\uFF08\u8D26\u672C\u955C\u50CF\uFF09\u3002 */\n maskedBy?: string[]\n}\n/** \u9884\u8BBE\u81EA\u5E26\u7684 mcp-client \u884C\uFF08host \u4ECE\u9884\u8BBE\u7EC4\u5408\u6587\u672C\u89E3\u6790\uFF09\u3002 */\nexport interface PresetMcpRowWire {\n entryId: string\n serverName: string\n transport: string\n summary: string\n /** \u8BE5 server \u7684\u5DE5\u5177\uFF08\u6D3B\u52A8 agent \u4F5C\u7528\u57DF \u222A \u540D\u5355\u7F13\u5B58\uFF1B\u65E0\u6570\u636E\u65F6\u7F3A\u7701\uFF09\u3002 */\n tools?: LiveMcpTool[]\n /**\n * \u5B9E\u9645\u6CE8\u518C\u7684\u5DE5\u5177\u6570\uFF08\u7531 mcp-status \u5BCC\u5316\uFF0C\u4E0D\u542B\u540D\u5355\u7F13\u5B58\uFF09\u3002\n * \u7F3A\u7701 = \u8BE5\u9884\u8BBE\u5F53\u524D\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD\uFF0C\u5DE5\u5177\u6570\u672A\u77E5 \u2014\u2014 \u9762\u677F\u4E0D\u80FD\u663E\u793A\u6210 0\u3002\n */\n registeredCount?: number\n}\nexport interface LiveMcpState {\n at: string\n serverCount: number\n toolCount: number\n servers: LiveMcpServer[]\n /** 0.1.6\uFF1AAgent \u9884\u8BBE\u540D\u5355\u3002 */\n presets?: PresetRow[]\n /** 0.1.6\uFF1ApresetId \u2192 { serverName: false }\uFF08\u663E\u5F0F\u906E\u853D\uFF1B\u7F3A\u7701 = \u7EE7\u627F\u5168\u5C40\uFF09\u3002 */\n masks?: Record<string, Record<string, boolean>>\n /** 0.1.6\uFF1ApresetId \u2192 \u8BE5\u9884\u8BBE\u81EA\u5E26\u7684 mcp-client \u884C\u3002 */\n presetServers?: Record<string, PresetMcpRowWire[]>\n /**\n * \u5DE5\u4F5C\u533A\u7EA7\u5173\u95ED\u8D26\u672C\uFF1A`{ \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84: { serverName: false } }`\u3002\n * \u53EA\u5F71\u54CD\u8BE5\u5DE5\u4F5C\u533A\u7684\u4F1A\u8BDD\uFF1B\u6362\u5DE5\u4F5C\u533A\u7167\u5E38\u6CE8\u5165\uFF08\u56E0\u6B64\u5DE5\u5177\u96C6\u5408\u968F\u5DE5\u4F5C\u533A\u53D8\u5316\uFF09\u3002\n */\n workspaceClosed?: Record<string, Record<string, boolean>>\n /** \u5DE5\u4F5C\u533A\u7EA7\u5DE5\u5177\u7981\u7528\u8D26\u672C\uFF1A`{ \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84: mcp__ \u5DE5\u5177\u5168\u540D[] }`\u3002 */\n workspaceToolDisabled?: Record<string, string[]>\n /** \u65B0\u63A5\u53E3\uFF1A\u5DE5\u4F5C\u533A\u7EA7\u5DE5\u5177\u7981\u7528\u8D26\u672C\u6309 server \u5206\u7EC4\uFF08\u4F18\u5148\u4E8E\u6241\u5E73\u7ED3\u6784\uFF09\u3002 */\n workspaceToolDisabledByServer?: Record<string, Record<string, string[]>>\n /** \u5DE5\u5177\u7EA7\u7981\u7528\u00B7\u5168\u5C40\u5C42\u955C\u50CF\uFF1AserverName \u2192 \u7981\u7528\u5DE5\u5177\u5168\u540D\uFF08\u6240\u6709\u9884\u8BBE\u751F\u6548\uFF09\u3002 */\n toolDisabled?: Record<string, string[]>\n /** \u5DE5\u5177\u7EA7\u7981\u7528\u00B7\u9884\u8BBE\u5C42\u955C\u50CF\uFF08\u6309\u300C\u884C\u300D\u5206\u8D26\uFF09\uFF1ApresetId \u2192 serverName \u2192 { own, inherit }\u3002 */\n toolDisabledByPreset?: Record<string, Record<string, { own: string[]; inherit: string[] }>>\n /** \u906E\u853D\u8865\u4E01\u8FD0\u884C\u671F\u5B89\u88C5\u8BCA\u65AD\uFF1ApresetId \u2192 \u6D3B\u52A8 agent \u6570\u4E0E deny \u6570\u3001\u5931\u8D25\u539F\u56E0\u3002 */\n maskInstall?: Record<string, { agents: number; deniedAgents: number; denyTotal: number; errors: string[] }>\n /** mcps \u76EE\u5F55\u6765\u6E90\u7684 Server\uFF08\u5168\u5C40\u5C42 + \u5DE5\u4F5C\u533A\u5C42\uFF1B\u7531\u672C\u63D2\u4EF6\u6302\u8F7D\uFF09\u3002 */\n}\nexport type LiveMcpStatus =\n | { state: 'loading'; data: null }\n | { state: 'ready'; data: LiveMcpState }\n | { state: 'unavailable'; data: null }\n\n/** \u6DFB\u52A0/\u542F\u7528\u540E\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C\u7684\u8F6E\u8BE2\u95F4\u9694\u4E0E\u603B\u65F6\u957F\u3002 */\nexport const MCP_TOOL_WATCH_INTERVAL_MS = 2000\n// npx \u9996\u6B21\u62C9\u5305\u53EF\u80FD\u8981\u4E00\u4E24\u5206\u949F\uFF0C\u7B49\u5F85\u7A97\u53E3\u7ED9\u8DB3\uFF1B\u671F\u95F4\u5361\u7247\u663E\u793A\u300C\u7B49\u5F85\u6CE8\u518C\u300D\uFF0C\u8D85\u65F6\u540E\n// \u7528\u6237\u4ECD\u53EF\u624B\u52A8\u5237\u65B0\uFF08\u4E0B\u4E00\u6B21\u6DFB\u52A0/\u542F\u7528\u4F1A\u91CD\u65B0\u5F00\u59CB\u7B49\u5F85\uFF09\u3002\nexport const MCP_TOOL_WATCH_TIMEOUT_MS = 150_000\n\n/**\n * \u72B6\u6001\u91CC\u67D0 Server **\u5B9E\u9645\u6CE8\u518C**\u7684\u5DE5\u5177\u6570\uFF08\u5168\u5C40\u6761\u76EE \u222A \u5404\u9884\u8BBE\u81EA\u5E26\u884C\uFF0C\u53D6\u6700\u5927\uFF09\u3002\n *\n * \u4E00\u5B9A\u8981\u7528\u6CE8\u518C\u6570\uFF08`toolCount` / `registeredCount`\uFF09\uFF0C\u4E0D\u80FD\u7528\u5361\u7247\u4E0A\u90A3\u4EFD\n * \u300C\u6CE8\u518C \u222A \u540D\u5355\u7F13\u5B58\u300D\u7684\u5217\u8868\u957F\u5EA6 \u2014\u2014 \u7F13\u5B58\u4F1A\u8BA9\u8FD8\u6CA1\u8FDE\u4E0A\u7684 Server \u770B\u8D77\u6765\u5DF2\u5C31\u7EEA\uFF0C\n * \u81EA\u52A8\u7B49\u5F85\u5C31\u4F1A\u63D0\u524D\u6536\u5DE5\uFF08\u8868\u73B0\u5C31\u662F\u5361\u5728\u300C0 \u5DE5\u5177\u300D\u8FD8\u5F97\u624B\u52A8\u5237\u65B0\uFF09\u3002\n */\nexport function mcpRegisteredToolCountOf(data: LiveMcpState, serverName: string): number {\n let count = data.servers.find(server => server.serverName === serverName)?.toolCount ?? 0\n for (const rows of Object.values(data.presetServers ?? {})) {\n const row = rows.find(item => item.serverName === serverName)\n if (row !== undefined) count = Math.max(count, row.registeredCount ?? 0)\n }\n return count\n}\n\n/** \u8BE5 Server \u662F\u5426\u8FD8\u6CA1\u6CE8\u518C\u51FA\u5DE5\u5177\uFF08\u5361\u7247\u7ED9\u300C\u7B49\u5F85\u6CE8\u518C\u300D\u6807\u8BB0\u7528\uFF09\u3002 */\nexport function isToolRegistrationPending(registered: number, listed: number): boolean {\n return registered === 0 && listed > 0\n}\n\n/** \u62C9\u53D6\u771F\u5B9E MCP \u6CE8\u518C\u72B6\u6001\uFF1B\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u91CD\u542F\u7B49\uFF09\u2192 unavailable\uFF08\u754C\u9762\u5F15\u5BFC\u91CD\u542F\uFF09\u3002 */\nexport function useMcpLiveState(): [LiveMcpStatus, () => void] {\n const [status, setStatus] = useState<LiveMcpStatus>({ state: 'loading', data: null })\n const load = (): void => {\n setStatus((current) => (current.state === 'ready' ? current : { state: 'loading', data: null }))\n void fetch('/api/triad/mcp-status', { headers: { accept: 'application/json' } })\n .then((response) => { if (!response.ok) throw new Error(String(response.status)); return response.json() })\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray((body as { servers?: unknown }).servers)) throw new Error('bad shape')\n const data = body as LiveMcpState\n setStatus({ state: 'ready', data })\n })\n .catch(() => { setStatus({ state: 'unavailable', data: null }) })\n }\n useEffect(() => { load() /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, [])\n return [status, load]\n}\n", "/**\n * skills/SkillCard \u2014 \u6280\u80FD\u5361\uFF08\u7F51\u683C\u5355\u5143\uFF09\u4E0E\u6280\u80FD\u5305\u5206\u7C7B\u7F16\u8F91\u5668\u3002\n */\nimport { useEffect, useRef, useState, type CSSProperties } from 'react'\nimport {\n IconCloseOutlineRegular, IconPlusOutlineRegular, IconTrashOutlineRegular, Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CheckIcon, CopyIcon } from './icons.js'\nimport { skillT } from './locales.js'\nimport { css } from './styles.js'\nimport { MAX_BUNDLE_CATEGORIES, skillOriginOf, type SkillInfo } from './types.js'\n/**\n * \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\uFF1A\n * [\u56FE\u6807\u74F7\u7247] \u6807\u9898(\u7C97) [\u590D\u5236\u94AE] [\u7EFF\u8272\u5F00\u5173]\n * \u63CF\u8FF0\u4E00\u884C\uFF08\u7701\u7565\u53F7\uFF09\n * [\u6765\u6E90 pill][\u4F5C\u7528\u57DF pill] N \u6587\u4EF6\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * \u5DE5\u5177 [\u67E5\u770B] [\u67E5\u770B\u6587\u4EF6\u6309\u94AE] [\u5F52\u5165/\u79FB\u51FA] [\u5220\u9664]\n */\n/**\n * \u5206\u7C7B\u7F16\u8F91\u5668\uFF1A\u5DF2\u9009\u6807\u7B7E\uFF08\u53EF\u6458\uFF09+ \u5EFA\u8BAE\u5206\u7C7B\uFF08\u70B9\u52A0\uFF09+ \u81EA\u5B9A\u4E49\u8F93\u5165\uFF08\u56DE\u8F66\u52A0\uFF09\u3002\n * \u300C\u65B0\u5EFA\u6280\u80FD\u5305\u300D\u4E0E\u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u4E24\u5904\u5171\u7528\uFF0C\u503C\u7531\u7236\u7EA7\u6301\u6709\u3002\n */\nexport function CategoryEditor({ value, onChange, label, suggestions = [] }: {\n value: string[]\n onChange: (next: string[]) => void\n label: string\n /** \u4ECE\u73B0\u6709\u6280\u80FD\u5305\u5206\u7C7B\u6D3E\u751F\u7684\u5019\u9009\uFF1B\u4E0D\u4F20 = \u53EA\u5141\u8BB8\u81EA\u7531\u8F93\u5165\u3002 */\n suggestions?: string[]\n}): JSX.Element {\n const [draft, setDraft] = useState('')\n const full = value.length >= MAX_BUNDLE_CATEGORIES\n const suggestionsLeft = suggestions.filter((preset) => !value.includes(preset))\n const add = (raw: string): void => {\n const name = raw.trim().slice(0, 24)\n setDraft('')\n if (name === '' || value.includes(name) || full) return\n onChange([...value, name])\n }\n return (\n <div className={css.catEditor}>\n {value.length === 0 ? (\n <p className={css.catEmpty}>{skillT('bundleCatEmptyHint')}</p>\n ) : (\n <ul className={css.catSelected} aria-label={label}>\n {value.map((name) => (\n <li key={name} className={css.catSelectedTag}>\n <span className={css.catSelectedName}>{name}</span>\n <button\n type=\"button\"\n className={css.catRemove}\n aria-label={skillT('bundleCatRemove', { name })}\n onClick={() => { onChange(value.filter((item) => item !== name)) }}\n >\n <IconCloseOutlineRegular size={11} aria-hidden=\"true\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n {suggestionsLeft.length > 0 && (\n <div className={css.catSuggest} role=\"group\" aria-label={skillT('bundleCatTitle')}>\n {suggestionsLeft.map((preset) => (\n <button\n type=\"button\"\n key={preset}\n className={css.catPreset}\n disabled={full}\n title={skillT('bundleCatAddPreset', { name: preset })}\n onClick={() => { add(preset) }}\n >\n <span className={css.catPresetPlus} aria-hidden=\"true\">+</span>{preset}\n </button>\n ))}\n </div>\n )}\n <input\n className={css.catInput}\n value={draft}\n placeholder={skillT('bundleCatPlaceholder')}\n aria-label={skillT('bundleCatCustom')}\n disabled={full}\n onChange={(event) => { setDraft(event.currentTarget.value) }}\n onKeyDown={(event) => { if (event.key === 'Enter') { event.preventDefault(); add(draft) } }}\n />\n {full && <p className={css.catLimit}>{skillT('bundleCatLimit', { n: MAX_BUNDLE_CATEGORIES })}</p>}\n </div>\n )\n}\n\nexport function SkillCard({ skill, bundleId, bundleName, enabled, lockedReason, scopeLabel, index, onToggle, onView, onAssign, onRemove, onDelete }: {\n skill: SkillInfo\n bundleId: string | null\n bundleName: string | null\n enabled: boolean\n /** \u975E\u7A7A\u65F6\u5F00\u5173\u88AB\u9501\u4F4F\uFF08\u5982\uFF1A\u5168\u5C40\u5C42\u5DF2\u7981\u7528\uFF0C\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00\uFF09\uFF0C\u5E76\u663E\u793A\u539F\u56E0\u3002 */\n lockedReason?: string\n /** \u5F53\u524D\u4F5C\u7528\u57DF pill \u6587\u6848\uFF08\u300C\u5168\u90E8 Agent\u300D= \u5168\u5C40\uFF09\u3002 */\n scopeLabel: string\n /** \u7F51\u683C\u5E8F\u53F7\uFF1A\u5165\u573A\u9519\u5CF0\u52A8\u753B\u5EF6\u65F6\u3002 */\n index: number\n onToggle: (skill: SkillInfo, enabled: boolean) => void\n onView: (skill: SkillInfo) => void\n onAssign?: (skill: SkillInfo) => void\n onRemove?: (skill: SkillInfo) => void\n onDelete?: (skill: SkillInfo) => void\n}): JSX.Element {\n const files = Array.isArray(skill.files) ? skill.files : []\n const description = skill.description ?? ''\n const [copied, setCopied] = useState(false)\n const copiedTimer = useRef<number | null>(null)\n useEffect(() => () => {\n if (copiedTimer.current !== null) window.clearTimeout(copiedTimer.current)\n }, [])\n\n const flashCopied = (): void => {\n setCopied(true)\n if (copiedTimer.current !== null) window.clearTimeout(copiedTimer.current)\n copiedTimer.current = window.setTimeout(() => { setCopied(false) }, 1200)\n }\n /** \u590D\u5236\u6280\u80FD\u540D\uFF1A\u4E3B\u7528 clipboard API\uFF0C\u56DE\u9000\u4E00\u4E2A\u9690\u85CF textarea + execCommand\u3002 */\n const copyName = (): void => {\n const fallback = (): void => {\n try {\n const textarea = document.createElement('textarea')\n textarea.value = skill.name\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n document.execCommand('copy')\n document.body.removeChild(textarea)\n } catch {\n /* \u590D\u5236\u5931\u8D25\u9759\u9ED8\uFF1A\u6309\u94AE\u4ECD\u7ED9\u51FA\u5DF2\u590D\u5236\u53CD\u9988\uFF0C\u65E0\u526F\u4F5C\u7528\u3002 */\n }\n }\n try {\n if (navigator.clipboard !== undefined) {\n void navigator.clipboard.writeText(skill.name).then(flashCopied, () => { fallback(); flashCopied() })\n } else {\n fallback()\n flashCopied()\n }\n } catch {\n fallback()\n flashCopied()\n }\n }\n\n const toggleLabel = lockedReason ?? (enabled ? skillT('disableSkill') : skillT('enableSkill'))\n const fileMeta = typeof skill.fileCount === 'number' ? skill.fileCount : files.length\n /**\n * \u6765\u6E90\uFF1A\u4F18\u5148\u5BBF\u4E3B\u7ED9\u7684 skill.origin / skill.scope\uFF0C\u7F3A\u7701\u6309 SkillSource \u679A\u4E3E\u96C6\u4E2D\u6620\u5C04\uFF1B\n * \u672A\u77E5\u6765\u6E90\u539F\u6837\u663E\u793A\u3002\u5DE5\u4F5C\u533A\u540C\u540D\u6280\u80FD\u4F18\u5148\u4E8E\u5168\u5C40\uFF0C\u8FD9\u6761\u6807\u7B7E\u5C31\u662F\u8BA9\u7528\u6237\u4E00\u773C\u770B\u51FA\n * \u300C\u6211\u5173\u6389\u7684\u4F1A\u4E0D\u4F1A\u5F71\u54CD\u522B\u7684\u9879\u76EE\u300D\u3002\n */\n const skillOrigin = skillOriginOf(skill)\n return (\n <li\n className={css.skillCard}\n data-off={enabled ? undefined : 'true'}\n style={{ '--skm-i': index } as CSSProperties}\n >\n <div className={css.skillCardHead}>\n <span className={css.skillBadge} aria-hidden=\"true\">skill</span>\n <button\n type=\"button\"\n className={css.skillTitle}\n title={skill.name}\n onClick={() => { onView(skill) }}\n >\n {skill.name}\n </button>\n <span className={css.skillCardToggle}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={toggleLabel}\n title={toggleLabel}\n className={`${css.toggle} ${enabled ? css.toggleOn : css.toggleOff}`}\n disabled={lockedReason !== undefined}\n onClick={(event) => {\n event.stopPropagation()\n onToggle(skill, !enabled)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </span>\n </div>\n {description !== '' && (\n <button type=\"button\" className={css.skillDesc} title={description} onClick={() => { onView(skill) }}>{description}</button>\n )}\n <div className={css.skillTags}>\n <span className={`${css.tag} ${css.tagSource}`}>{bundleName ?? skillT('tagLoose')}</span>\n <span className={`${css.tag} ${css.tagScope}`} data-off={enabled ? undefined : 'true'}>{scopeLabel}</span>\n {/* \u6765\u6E90\uFF1A\u5DE5\u4F5C\u533A\uFF08\u5F53\u524D\u5DE5\u4F5C\u533A\u4E13\u7528\uFF0C\u540C\u540D\u65F6\u4F18\u5148\u4E8E\u5168\u5C40\uFF09\u8FD8\u662F\u5168\u5C40\u3002 */}\n {skillOrigin !== undefined && (\n <span\n className={css.scopeTag}\n data-scope={skillOrigin.kind === 'unknown' ? 'other' : skillOrigin.kind}\n title={skillOrigin.kind === 'workspace'\n ? skillT('originWorkspaceHint')\n : skillOrigin.kind === 'global' ? skillT('originGlobalHint') : skillOrigin.label}\n >\n {skillOrigin.kind === 'workspace'\n ? skillT('originWorkspace')\n : skillOrigin.kind === 'global' ? skillT('originGlobal') : skillOrigin.label}\n </span>\n )}\n {!enabled && <span className={`${css.tag} ${css.tagStatus}`}>{skillT('skillOffTag')}</span>}\n <span className={css.skillMeta}>{skillT('fileCount', { n: fileMeta })}</span>\n </div>\n <div className={css.skillCardFoot}>\n <span className={css.skillFootLabel}>{skillT('toolsLabel')}</span>\n <div className={css.skillCardActions}>\n <Tooltip label={skillT('copySkillName')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.skillFootIcon}\n data-copied={copied ? 'true' : undefined}\n aria-label={copied ? skillT('copiedSkillName') : skillT('copySkillName')}\n title={copied ? skillT('copiedSkillName') : skillT('copySkillName')}\n onClick={copyName}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n </Tooltip>\n {bundleId !== null ? (\n <Tooltip label={skillT('removeSkill')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={css.skillFootIcon} aria-label={skillT('removeSkill')}\n title={skillT('removeSkill')} onClick={() => { onRemove?.(skill) }}>\n <IconCloseOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n ) : (\n <Tooltip label={skillT('assignToBundle')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={css.skillFootIcon} aria-label={skillT('assignToBundle')}\n title={skillT('assignToBundle')} onClick={() => { onAssign?.(skill) }}>\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n )}\n <Tooltip label={skillT('deleteSkillBtn')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={`${css.skillFootIcon} ${css.skillFootIconDanger}`}\n aria-label={skillT('deleteSkillBtn')} title={skillT('deleteSkillBtn')}\n onClick={() => { onDelete?.(skill) }}>\n <IconTrashOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n </div>\n </li>\n )\n}\n", "/**\n * skills/SkillViewer \u2014 \u6280\u80FD\u6587\u4EF6\u67E5\u770B\u5668\uFF08\u5927\u753B\u5E45 + \u4E09\u6863\u5B57\u53F7 + \u5168\u5C4F\uFF09\u53CA\u5176\u504F\u597D\u8BFB\u5199\u3002\n */\nimport { type CSSProperties } from 'react'\nimport { Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { renderSkillMarkdown } from './markdown.js'\nimport { css } from './styles.js'\nimport type { ViewerState } from './types.js'\n/** ---------------------------------------------------------------- \u67E5\u770B\u5668\u504F\u597D */\n\n/** \u5B57\u53F7\u4E09\u6863\uFF08px\uFF09\uFF1A\u5C0F / \u6807\u51C6 / \u5927\u3002\u9ED8\u8BA4\u53D6\u4E2D\u95F4\u4E00\u6863\u3002 */\nexport const VIEWER_FONT_SIZES = [13.5, 15, 17]\nexport const VIEWER_PREF_KEY = 'dsh.triad.skillViewer'\n/** \u4E09\u6863\u5B57\u53F7\u7684\u60AC\u6D6E\u6587\u6848\uFF08\u4E0E VIEWER_FONT_SIZES \u4E00\u4E00\u5BF9\u5E94\uFF09\u3002 */\nexport const VIEWER_FONT_LABELS = ['\u5C0F\u5B57\u53F7', '\u6807\u51C6\u5B57\u53F7', '\u5927\u5B57\u53F7']\n\nexport interface ViewerPrefs { font: number; full: boolean }\n\n/** \u8BFB\u67E5\u770B\u5668\u504F\u597D\uFF08\u5B57\u53F7 + \u5168\u5C4F\uFF09\uFF1BlocalStorage \u4E0D\u53EF\u7528\u65F6\u56DE\u843D\u5230\u9ED8\u8BA4\u503C\u3002 */\nexport function readViewerPrefs(): ViewerPrefs {\n try {\n const raw = localStorage.getItem(VIEWER_PREF_KEY)\n if (typeof raw !== 'string' || raw === '') return { font: 1, full: false }\n const parsed = JSON.parse(raw) as Partial<ViewerPrefs>\n const font = typeof parsed.font === 'number' && parsed.font >= 0 && parsed.font < VIEWER_FONT_SIZES.length\n ? Math.trunc(parsed.font)\n : 1\n return { font, full: parsed.full === true }\n } catch {\n return { font: 1, full: false }\n }\n}\n\n/** \u5199\u67E5\u770B\u5668\u504F\u597D\uFF1B\u9690\u79C1\u6A21\u5F0F\u7B49\u5199\u5165\u5931\u8D25\u65F6\u9759\u9ED8\u964D\u7EA7\u4E3A\u300C\u53EA\u6D3B\u5230\u672C\u6B21\u5237\u65B0\u300D\u3002 */\nexport function writeViewerPrefs(prefs: ViewerPrefs): void {\n try { localStorage.setItem(VIEWER_PREF_KEY, JSON.stringify(prefs)) } catch { /* \u5FFD\u7565 */ }\n}\n\n/** \u5168\u5C4F / \u8FD8\u539F\uFF1A\u5BF9\u89D2\u7BAD\u5934\uFF0C\u72B6\u6001\u5207\u6362\u65F6\u9760 CSS \u8FC7\u6E21\u7FFB\u8F6C\u3002 */\nexport function ViewerExpandIcon({ full }: { full: boolean }): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {full\n ? <path d=\"M6.2 2.2v4h-4M9.8 2.2v4h4M6.2 13.8v-4h-4M9.8 13.8v-4h4\" />\n : <path d=\"M2.2 6.2v-4h4M13.8 6.2v-4h-4M2.2 9.8v4h4M13.8 9.8v4h-4\" />}\n </svg>\n )\n}\n\nexport interface ViewRow { kind: 'dir' | 'file'; path: string; depth: number; main: boolean }\n\nexport function skillFileRows(files: string[]): ViewRow[] {\n const rows: ViewRow[] = []\n const seenDirs = new Set<string>()\n for (const path of files) {\n const parts = path.split('/')\n let dirPath = ''\n for (let i = 0; i < parts.length - 1; i += 1) {\n dirPath = dirPath === '' ? parts[i] : dirPath + '/' + parts[i]\n if (!seenDirs.has(dirPath)) {\n seenDirs.add(dirPath)\n rows.push({ kind: 'dir', path: dirPath + '/', depth: i, main: false })\n }\n }\n rows.push({ kind: 'file', path, depth: parts.length - 1, main: path === 'SKILL.md' })\n }\n return rows\n}\n\n/**\n * \u67E5\u770B\u5668\u5F39\u7A97\uFF1A\u5DE6\u4FA7\u6587\u4EF6\u6811 + \u53F3\u4FA7\u6E32\u67D3\u5185\u5BB9\uFF1B\u5DE5\u5177\u6761\u5207\u4E09\u6863\u5B57\u53F7\u4E0E\u5168\u5C4F\u3002\n * viewer \u4E3A null \u65F6\u4E0D\u6E32\u67D3\uFF08\u8C03\u7528\u65B9\u6761\u4EF6\u6302\u8F7D\uFF09\u3002\n */\nexport function SkillViewer({\n t, viewer, viewerFont, viewerFull, onFontLevel, onToggleFull, onSelectFile, onClose,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n viewer: ViewerState | null\n viewerFont: number\n viewerFull: boolean\n onFontLevel: (level: number) => void\n onToggleFull: () => void\n onSelectFile: (filePath: string) => void\n onClose: () => void\n}): JSX.Element | null {\n if (viewer === null) return null\n return (\n <Modal\n open\n onClose={() => { onClose() }}\n closeLabel={t('close')}\n title={viewer.skill.name + (viewer.file === 'SKILL.md' ? '' : ' \u00B7 ' + viewer.file)}\n className={css.viewerModal + (viewerFull ? ' ' + css.viewerModalFull : '')}\n contentClassName={css.viewerBody}\n >\n {/* \u5DE5\u5177\u6761\uFF1A\u5F53\u524D\u6587\u4EF6 + \u5B57\u53F7\u4E09\u6863 + \u5168\u5C4F\u5207\u6362\uFF08\u504F\u597D\u6301\u4E45\u5316\uFF09 */}\n <div className={css.viewerToolbar}>\n <span className={css.viewerPath}>\n <b>{viewer.file}</b>\n <span>{t('viewerFilesCount', { n: Array.isArray(viewer.skill.files) ? viewer.skill.files.length : 0 })}</span>\n </span>\n <span className={css.viewerToolGroup} role=\"group\" aria-label={t('viewerFont')}>\n {VIEWER_FONT_SIZES.map((size, level) => (\n <button\n key={size}\n type=\"button\"\n className={css.viewerToolBtn + (level === 0 ? ' ' + css.viewerToolBtnA1 : level === 2 ? ' ' + css.viewerToolBtnA3 : '')}\n data-active={viewerFont === level ? 'true' : undefined}\n title={VIEWER_FONT_LABELS[level]}\n aria-label={VIEWER_FONT_LABELS[level]}\n aria-pressed={viewerFont === level}\n onClick={() => { onFontLevel(level) }}\n >A</button>\n ))}\n </span>\n <button\n type=\"button\"\n className={css.viewerToolBtn + ' ' + css.viewerToolBtnFrame}\n data-active={viewerFull ? 'true' : undefined}\n title={viewerFull ? t('viewerExitFull') : t('viewerFull')}\n aria-label={viewerFull ? t('viewerExitFull') : t('viewerFull')}\n aria-pressed={viewerFull}\n onClick={onToggleFull}\n >\n <ViewerExpandIcon full={viewerFull} />\n </button>\n </div>\n <div className={css.viewerLayout}>\n <nav className={css.viewerNav} aria-label={t('viewerNav')}>\n {skillFileRows(Array.isArray(viewer.skill.files) ? viewer.skill.files : []).map((row, index) => (\n <div\n key={row.path + '-' + String(index)}\n className={css.viewerNavItem + (row.kind === 'dir' ? ' ' + css.viewerNavDir : '')}\n data-active={row.kind === 'file' && row.path === viewer.file ? 'true' : undefined}\n data-dir={row.kind === 'dir' ? 'true' : undefined}\n style={{ paddingLeft: 8 + row.depth * 14 }}\n title={row.path}\n onClick={row.kind === 'file' ? () => { onSelectFile(row.path) } : undefined}\n >\n {row.kind === 'dir' ? '\uD83D\uDCC1 ' : '\uD83D\uDCC4 '}\n {row.path}\n </div>\n ))}\n </nav>\n <div className={css.viewerContent} style={{ '--skm-vfs': `${String(VIEWER_FONT_SIZES[viewerFont])}px` } as CSSProperties}>\n {viewer.loading === true\n ? t('previewLoading')\n : viewer.error !== undefined\n ? viewer.error\n : <div dangerouslySetInnerHTML={{ __html: renderSkillMarkdown(viewer.content ?? '') }} />}\n </div>\n </div>\n </Modal>\n )\n}\n", "/**\n * skills/markdown \u2014 \u6280\u80FD\u5185\u5BB9\u9884\u89C8\u7684\u6781\u7B80 markdown \u6E32\u67D3\uFF08\u96F6\u5916\u90E8\u4F9D\u8D56\uFF0C\u53EA\u62FC HTML \u5B57\u7B26\u4E32\uFF09\u3002\n */\n/** ---------------------------------------------------------------- markdown \u9884\u89C8 */\n\n// \u6280\u80FD\u5185\u5BB9\u9884\u89C8\uFF1A\u6781\u7B80 markdown \u6E32\u67D3\uFF08frontmatter \u9690\u85CF\uFF0C\u6807\u9898/\u5217\u8868/\u4EE3\u7801\u5757/\u7C97\u4F53/\u884C\u5185\u4EE3\u7801/\u94FE\u63A5\uFF09\u3002\nexport function escapeHtml(s: string): string {\n return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\nexport function inlineMd(s: string): string {\n return escapeHtml(s)\n .replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n .replace(/`([^`]+)`/g, '<code>$1</code>')\n .replace(/\\[([^\\]]+)\\]\\((https?:[^)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noreferrer\">$1</a>')\n}\n\nexport function renderSkillMarkdown(text: string): string {\n const body = String(text).replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, '')\n const lines = body.split('\\n')\n let html = ''\n let inCode = false\n let codeBuf: string[] = []\n let inList = false\n let inQuote = false\n const closeList = (): void => {\n if (inList) { html += '</ul>'; inList = false }\n }\n const closeQuote = (): void => {\n if (inQuote) { html += '</blockquote>'; inQuote = false }\n }\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.startsWith('```')) {\n if (inCode) {\n html += '<pre>' + escapeHtml(codeBuf.join('\\n')) + '</pre>'\n codeBuf = []\n inCode = false\n } else {\n closeList(); closeQuote()\n inCode = true\n }\n continue\n }\n if (inCode) { codeBuf.push(line); continue }\n if (trimmed === '---' || trimmed === '***') {\n closeList(); closeQuote()\n html += '<hr>'\n continue\n }\n if (trimmed.startsWith('>')) {\n if (!inQuote) { closeList(); html += '<blockquote>'; inQuote = true }\n html += '<p>' + inlineMd(trimmed.replace(/^>\\s?/, '')) + '</p>'\n continue\n }\n const heading = /^(#{1,4})\\s+(.*)$/.exec(trimmed)\n if (heading !== null) {\n closeList(); closeQuote()\n // \u76F4\u63A5\u7528\u771F\u5B9E\u5C42\u7EA7\uFF08# \u2192 h1 \u2026\u2026 ###### \u2192 h6\uFF09\uFF1A\u67E5\u770B\u5668\u5B57\u53F7\u4E00\u6863\u4E00\u6863\u62C9\u5F97\u5F00\uFF0C\n // \u65E7\u5199\u6CD5\u628A # \u538B\u6210 h3\uFF0C\u4E00\u7EA7\u6807\u9898\u53EA\u6709 15px\uFF0C\u6574\u7BC7\u6587\u6863\u770B\u8D77\u6765\u50CF\u6CA1\u653E\u5927\u3002\n const level = Math.min(heading[1].length, 6)\n html += `<h${String(level)}>` + inlineMd(heading[2]) + `</h${String(level)}>`\n continue\n }\n const item = /^[-*]\\s+(.*)$/.exec(trimmed)\n if (item !== null) {\n if (!inList) { closeQuote(); html += '<ul>'; inList = true }\n html += '<li>' + inlineMd(item[1]) + '</li>'\n continue\n }\n closeList(); closeQuote()\n if (trimmed === '') { html += '<p></p>'; continue }\n html += '<p>' + inlineMd(trimmed) + '</p>'\n }\n closeList(); closeQuote()\n if (inCode) html += '<pre>' + escapeHtml(codeBuf.join('\\n')) + '</pre>'\n return html\n}\n", "/**\n * skills/SkillsView \u2014 SKILL \u9875\u4E3B\u533A\uFF1A\u540C\u6B65\u63D0\u793A\u3001\u9884\u8BBE\u63D0\u793A\u884C\u4E0E\u6280\u80FD\u5217\u8868\uFF08\u6280\u80FD\u5305 + \u6563\u88C5\u6280\u80FD\uFF09\u3002\n *\n * \u7EAF\u5C55\u793A\uFF1A\u72B6\u6001\u4E0E\u64CD\u4F5C\u5168\u90E8\u7531 SkillsPanel \u6301\u6709\uFF0Cprops \u6CE8\u5165\u3002\u641C\u7D22\u3001\u8BA1\u6570\u3001\u5237\u65B0\u4E0E\u6DFB\u52A0\n * \u5DF2\u4E0A\u79FB\u5230\u9876\u680F SkillTopBar\uFF0C\u8FD9\u91CC\u53EA\u8D1F\u8D23\u5217\u8868\u672C\u4F53\u3002\n */\nimport type { Dispatch, FormEvent, SetStateAction } from 'react'\nimport {\n Button, IconArchiveOutlineRegular, IconCheckOutlineRegular, IconChevronDownOutlineRegular, IconCloseOutlineRegular,\n IconEditOutlineRegular, IconEllipsisOutlineRegular, IconRefreshOutlineRegular, IconTrashOutlineRegular, Menu,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { modalStaggerClass } from '../modal-animation'\nimport { CloudUpIcon, FolderBlueIcon, TagIcon } from './icons.js'\nimport { SkillCard } from './SkillCard.js'\nimport { css } from './styles.js'\nimport { ALL_PRESETS } from './types.js'\nimport type { BundleInfo, ConfirmState, HealthView, PanelState, PresetRow, SkillEnableScope, SkillInfo } from './types.js'\n\nexport function SkillsView({\n t, state, health, scope, scopeOverrideCount, presets, onResetScope, openMenu, setOpenMenu,\n refresh, noResults, visibleBundleAll, expanded, renameTarget, setRenameTarget, renaming, submitRename,\n bundleEnabledIn, toggling, setCatFilter, activeCat, toggleExpanded, renamedFlash, openInstallFor,\n skillEnabledIn, skillLockedReason, scopeLabel, toggleSkill, toggleBundle, openViewer, removeFromBundle,\n pruneBundle, openCatEditor, setConfirm, setAssignTarget, looseOpen, setLooseExpanded, visibleLooseAll,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n state: PanelState\n health: HealthView\n /** \u6280\u80FD\u5F00\u5173\u7684\u5B8C\u6574\u4F5C\u7528\u57DF\uFF08\u4E0E\u9762\u677F\u52A8\u4F5C\u5171\u7528\u540C\u4E00\u4E2A\u5BF9\u8C61\uFF09\u3002 */\n scope: SkillEnableScope\n /** \u8BE5\u4F5C\u7528\u57DF\u5DF2\u6709\u7684\u8986\u76D6\u9879\u6570\uFF1A>0 \u624D\u663E\u793A\u300C\u6E05\u7A7A\u5355\u72EC\u8BBE\u7F6E\u300D\u3002 */\n scopeOverrideCount: number\n presets: PresetRow[]\n onResetScope: (scope: SkillEnableScope) => void\n openMenu: string | null\n setOpenMenu: Dispatch<SetStateAction<string | null>>\n refresh: () => void\n noResults: boolean\n visibleBundleAll: BundleInfo[]\n expanded: Set<string>\n renameTarget: { bundleId: string; name: string } | null\n setRenameTarget: Dispatch<SetStateAction<{ bundleId: string; name: string } | null>>\n renaming: boolean\n submitRename: (event: FormEvent<HTMLFormElement>) => Promise<void>\n bundleEnabledIn: (bundle: BundleInfo) => boolean\n toggling: Set<string>\n setCatFilter: Dispatch<SetStateAction<string | null>>\n activeCat: string | null\n toggleExpanded: (bundleId: string) => void\n renamedFlash: string | null\n openInstallFor: (bundleId: string) => void\n skillEnabledIn: (name: string) => boolean\n skillLockedReason: (name: string) => string | undefined\n scopeLabel: string\n toggleSkill: (skill: SkillInfo, enabled: boolean) => void\n toggleBundle: (bundle: BundleInfo, enabled: boolean) => void\n openViewer: (skill: SkillInfo) => void\n removeFromBundle: (bundleId: string, name: string) => Promise<void>\n pruneBundle: (bundle: BundleInfo) => Promise<void>\n openCatEditor: (bundle: BundleInfo) => void\n setConfirm: Dispatch<SetStateAction<ConfirmState | null>>\n setAssignTarget: Dispatch<SetStateAction<SkillInfo | null>>\n looseOpen: boolean\n setLooseExpanded: Dispatch<SetStateAction<boolean>>\n visibleLooseAll: SkillInfo[]\n}): JSX.Element {\n const showReset = scopeOverrideCount > 0\n && (scope.level === 'workspace' ? scope.cwd !== null : scope.presetId !== ALL_PRESETS)\n return (\n <>\n {/* \u540C\u6B65\u95EE\u9898\u660E\u7EC6\uFF1A\u53EA\u8BFB\u5065\u5EB7\u626B\u63CF\u53D1\u73B0 error \u7EA7\u95EE\u9898\u65F6\u5C55\u793A\uFF08\u9876\u680F\u5065\u5EB7\u6307\u793A\u60AC\u505C\u770B\u5168\u91CF\uFF09 */}\n {health.state === 'issue' && (\n <div className={css.healthNotice} role=\"status\">\n <span className={css.healthNoticeTitle}>{t('statIssues', { n: health.report.issues.length })}</span>\n <ul>\n {health.report.issues.slice(0, 4).map((issue, index) => (\n <li key={`${issue.code}-${String(index)}`}>{issue.message}</li>\n ))}\n </ul>\n </div>\n )}\n\n {/* \u9884\u8BBE\u63D0\u793A\u884C\uFF1A\u5F53\u524D\u7F16\u8F91\u5C42\u8BF4\u660E + \u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u5355\u72EC\u8BBE\u7F6E */}\n <div className={css.hintRow}>\n <span className={css.hintRowText}>\n {scope.level === 'workspace'\n ? t('workspaceHint', { path: scope.cwd ?? '' })\n : scope.presetId === ALL_PRESETS\n ? t('presetHintAll')\n : t('presetHintScoped', { name: presets.find((preset) => preset.id === scope.presetId)?.name ?? scope.presetId })}\n </span>\n {showReset && (\n <button type=\"button\" className={css.presetReset} onClick={() => { onResetScope(scope) }}>\n {scope.level === 'workspace' ? t('workspaceReset') : t('presetReset')}\n </button>\n )}\n </div>\n\n {/* \u5206\u7C7B tabs \u5DF2\u79FB\u9664\uFF1A\u4E0E\u5DE6\u680F\u300CAgent \u9884\u8BBE\u5206\u7C7B\u300D\u91CD\u590D\uFF08\u5DE6\u680F\u63A7\u5236\u9884\u8BBE\u5207\u6362\uFF09 */}\n\n {/* \u5185\u5BB9\u533A\uFF1A\u6280\u80FD\u5305 sections + \u6563\u88C5\u6280\u80FD */}\n <div className={`${css.mainScroll} ${modalStaggerClass}`}>\n {state.status === 'loading' ? <p className={css.status}>{t('loading')}</p> : null}\n {state.status === 'error' ? (\n <div className={css.failure}>\n <p role=\"alert\">{t('error')}</p>\n <Button variant=\"outline\" onClick={refresh}><IconRefreshOutlineRegular size={14} /> {t('retry')}</Button>\n </div>\n ) : null}\n\n {state.status === 'ready' && (\n noResults ? (\n <p className={css.noResult}>{t('noMatch')}</p>\n ) : (\n <>\n {visibleBundleAll.map((bundle) => {\n const open2 = expanded.has(bundle.id)\n const renamingThis = renameTarget?.bundleId === bundle.id\n const bundleEnabled = bundleEnabledIn(bundle)\n const bundleToggling = toggling.has(`bundle:${bundle.id}`)\n const missing = bundle.missingSkills ?? []\n const bundleCats = bundle.categories ?? []\n const emptyBundle = bundle.skillCount === 0\n // \u7A7A\u5305\u9ED8\u8BA4\u5C55\u5F00\u663E\u793A\u5F15\u5BFC\uFF1A\u6298\u53E0\u7740\u53EA\u5269\u4E00\u884C\u6807\u9898\uFF0C\u7528\u6237\u4F1A\u4EE5\u4E3A\u5305\u4E22\u4E86\u3002\n const openView = open2 || emptyBundle\n return (\n <section key={bundle.id} className={css.hubSection} data-open={openView ? 'true' : undefined} data-empty={emptyBundle ? 'true' : undefined}>\n <header\n className={css.bundleRowOuter}\n data-open={openView ? 'true' : undefined}\n >\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={openView}\n onClick={(event) => {\n // \u6807\u9898\u884C\u91CC\u5D4C\u7740\u5206\u7C7B\u6807\u7B7E\uFF1A\u70B9\u5230\u6807\u7B7E\u5C31\u662F\u7B5B\u9009\uFF0C\u4E0D\u8BE5\u987A\u624B\u628A\u5305\u5C55\u5F00/\u6536\u8D77\u3002\n // \u6807\u7B7E\u672C\u8EAB\u662F span\uFF08\u6309\u94AE\u91CC\u4E0D\u80FD\u518D\u5957\u6309\u94AE\uFF09\uFF0C\u952E\u76D8\u8DEF\u5F84\u8D70\u9876\u680F\u5206\u7C7B\u80F6\u56CA\u3002\n const hit = (event.target as HTMLElement).closest('[data-skm-cat]') as HTMLElement | null\n if (hit !== null) {\n const cat = hit.dataset.skmCat ?? ''\n setCatFilter(activeCat === cat ? null : cat)\n return\n }\n toggleExpanded(bundle.id)\n }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><FolderBlueIcon size={17} /></span>\n <span className={css.bundleName} title={bundle.name}>{bundle.name}</span>\n <span className={css.bundleCount}>{t('skillsCount', { n: bundle.skillCount })}</span>\n {bundleCats.length > 0 && (\n <span className={css.bundleCats}>\n {bundleCats.map((cat) => (\n <span\n key={cat}\n className={css.bundleCatTag}\n data-skm-cat={cat}\n data-active={activeCat === cat || undefined}\n title={t('bundleCatTip', { name: cat })}\n >\n {cat}\n </span>\n ))}\n </span>\n )}\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n {/* \u6280\u80FD\u5305\u4E00\u952E\u5F00\u5173\uFF1A\u6574\u5305\u542F\u7528/\u7981\u7528 */}\n <span className={css.bundleToggle}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={bundleEnabled}\n aria-label={bundleEnabled ? t('disableBundle') : t('enableBundle')}\n title={bundleEnabled ? t('disableBundle') : t('enableBundle')}\n className={`${css.toggle} ${bundleEnabled ? css.toggleOn : css.toggleOff}`}\n disabled={bundleToggling || bundle.skillCount === 0}\n onClick={(event) => {\n event.stopPropagation()\n toggleBundle(bundle, !bundleEnabled)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </span>\n <div className={css.bundleMore}>\n <Menu\n open={openMenu === `bundle:${bundle.id}`}\n onClose={() => { setOpenMenu(null) }}\n onSelect={(id: string) => {\n setOpenMenu(null)\n if (id === 'enable') toggleBundle(bundle, true)\n else if (id === 'disable') toggleBundle(bundle, false)\n else if (id === 'rename') setRenameTarget({ bundleId: bundle.id, name: bundle.name })\n else if (id === 'cat') openCatEditor(bundle)\n else if (id === 'delete') setConfirm({ kind: 'bundle', bundle })\n }}\n portal\n items={[\n { id: 'enable', label: t('enableBundle'), icon: <IconCheckOutlineRegular size={14} /> },\n { id: 'disable', label: t('disableBundle'), icon: <IconCloseOutlineRegular size={14} /> },\n { type: 'separator', id: 'gap' },\n { id: 'rename', label: t('rename'), icon: <IconEditOutlineRegular size={14} /> },\n { id: 'cat', label: t('bundleCatEdit'), icon: <TagIcon /> },\n { id: 'delete', label: t('delete'), icon: <IconTrashOutlineRegular size={14} />, danger: true },\n ]}\n anchor={(\n <button\n type=\"button\"\n className={css.bundleMoreBtn}\n aria-label={t('moreActions')}\n aria-haspopup=\"menu\"\n aria-expanded={openMenu === `bundle:${bundle.id}` || undefined}\n onClick={(event) => {\n event.stopPropagation()\n setOpenMenu(openMenu === `bundle:${bundle.id}` ? null : `bundle:${bundle.id}`)\n }}\n >\n <IconEllipsisOutlineRegular size={15} aria-hidden=\"true\" />\n </button>\n )}\n />\n </div>\n </header>\n {renamingThis && renameTarget !== null && (\n <form className={`${css.inlineForm} ${css.inlineFormBlock}`} onSubmit={(event) => { void submitRename(event) }}>\n <input className={css.inlineInput} value={renameTarget.name} placeholder={t('renameBundlePlaceholder')}\n aria-label={t('renameBundlePlaceholder')} autoFocus disabled={renaming}\n onChange={(event) => {\n // \u5148\u628A\u503C\u53D6\u51FA\u518D\u8FDB setState \u56DE\u8C03\uFF1AReact \u5408\u6210\u4E8B\u4EF6\u5728\n // \u56DE\u8C03\u6267\u884C\u5B8C\u6BD5\u540E\u4F1A\u628A currentTarget \u7F6E\u7A7A\uFF0C\u82E5\u5728\u51FD\u6570\u5F0F\n // updater \u91CC\u624D\u8BFB event.currentTarget.value\uFF0C\u6E32\u67D3\u9636\u6BB5\n // \u4F1A\u629B Cannot read properties of null\uFF0C\u6574\u4E2A\u6280\u80FD\u9762\u677F\n // \u88AB ErrorBoundary \u6458\u6389\u2014\u2014\u8868\u73B0\u5C31\u662F\u300C\u6539\u540D\u65F6\u5361\u7247\u6D88\u5931\u300D\u3002\n const next = event.currentTarget.value\n setRenameTarget((current) => current === null ? current : { ...current, name: next })\n }} />\n <Button variant=\"primary\" type=\"submit\" disabled={renaming || renameTarget.name.trim() === ''}>{t('rename')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={renaming} onClick={() => { setRenameTarget(null) }}>{t('cancel')}</Button>\n </form>\n )}\n {missing.length > 0 && (\n <div className={css.bundleMissing} role=\"status\">\n <span>{t('bundleMissingN', { n: missing.length })}</span>\n <code>{missing.join('\u3001')}</code>\n <button type=\"button\" className={css.bundleMissingBtn} onClick={() => { void pruneBundle(bundle) }}>\n {t('bundlePrune')}\n </button>\n </div>\n )}\n {openView && (\n <ul className={css.skillGrid} data-renamed={renamedFlash === bundle.id ? 'true' : undefined}>\n {bundle.skills.length === 0 ? (\n <li className={css.bundleEmpty}>\n <span className={css.bundleEmptyTitle}>{t('bundleEmptyTitle')}</span>\n <span className={css.bundleEmptyHint}>{t('bundleEmptyHint')}</span>\n <button type=\"button\" className={css.bundleEmptyBtn} onClick={() => { openInstallFor(bundle.id) }}>\n <CloudUpIcon size={14} />\n {t('bundleUploadHere')}\n </button>\n </li>\n ) : bundle.skills.map((skill, index) => (\n <SkillCard key={skill.name} skill={skill} bundleId={bundle.id} bundleName={bundle.name}\n enabled={skillEnabledIn(skill.name)}\n lockedReason={skillLockedReason(skill.name)}\n scopeLabel={scopeLabel}\n index={index}\n onToggle={toggleSkill}\n onView={openViewer}\n onRemove={(s) => { void removeFromBundle(bundle.id, s.name) }}\n onDelete={(s) => { setConfirm({ kind: 'skill', name: s.name, dir: s.dir }) }} />\n ))}\n </ul>\n )}\n </section>\n )\n })}\n\n {visibleLooseAll.length > 0 && (\n <section className={css.hubSection} data-open={looseOpen ? 'true' : undefined}>\n <header\n className={css.bundleRowOuter}\n data-open={looseOpen ? 'true' : undefined}\n >\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={looseOpen}\n onClick={() => { setLooseExpanded((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconArchiveOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{t('looseTitle')}</span>\n <span className={css.bundleCount}>{t('skillsCount', { n: visibleLooseAll.length })}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {looseOpen && (\n <ul className={css.skillGrid}>\n {visibleLooseAll.map((skill, index) => (\n <SkillCard key={skill.name} skill={skill} bundleId={null} bundleName={null}\n enabled={skillEnabledIn(skill.name)}\n lockedReason={skillLockedReason(skill.name)}\n scopeLabel={scopeLabel}\n index={index}\n onToggle={toggleSkill}\n onView={openViewer}\n onAssign={(s) => { setAssignTarget(s) }}\n onDelete={(s) => { setConfirm({ kind: 'skill', name: s.name, dir: s.dir }) }} />\n ))}\n </ul>\n )}\n </section>\n )}\n\n {/* \u65B0\u5EFA\u6280\u80FD\u5305\u5165\u53E3\u5DF2\u79FB\u81F3\u5DE6\u680F\uFF08newBundleBtn\uFF09 */}\n </>\n )\n )}\n </div>\n </>\n )\n}\n", "/**\n * skills/TopBar \u2014 \u9762\u677F\u9876\u680F\u3002\n *\n * \u300C\u80FD\u529B\u7BA1\u7406\u300D\u6807\u9898 + SKILL/MCP \u9876\u5C42 tab\uFF08PanelHead\uFF09\uFF0C\u4EE5\u53CA\u4E24\u4E2A\u9875\u7B7E\u5404\u81EA\u7684\n * Agent \u9884\u8BBE chips \u4E0E\u542F\u7528\u72B6\u6001\u5206\u6BB5\uFF08SkillTopBar / McpTopBar\uFF09\u3002\n */\nimport type { Dispatch, DragEvent, RefObject, SetStateAction } from 'react'\nimport {\n IconAgentPresetOutlineRegular, IconChevronDownOutlineRegular, IconPlusOutlineRegular, IconRefreshOutlineRegular,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CatAllIcon, CloudUpIcon, SearchIcon, SortDirIcon } from './icons.js'\nimport type { LiveMcpStatus } from './mcp-live.js'\nimport { mcpEffectiveEnabled } from './mcp-state.js'\nimport { css } from './styles.js'\nimport { ALL_PRESETS, UNCATEGORIZED, type HealthViewModel, type PresetRow } from './types.js'\n\n/** \u9762\u677F\u5934\u90E8\uFF1A\u6807\u9898\uFF08\u80FD\u529B\u7BA1\u7406\uFF09+ \u7D27\u8D34\u6587\u5B57\u53F3\u4FA7\u7684 SKILL / MCP / \u63D0\u793A\u8BCD \u9876\u5C42 tab\u3002 */\n/**\n * \u9762\u677F\u5934\uFF1A\u6807\u9898 + SKILL / MCP / \u63D0\u793A\u8BCD \u4E09\u6863\uFF0C\u53F3\u4FA7\u662F**\u5DE5\u4F5C\u533A\u9009\u62E9\u5668**\u3002\n *\n * \u5DE5\u4F5C\u533A\u653E\u5728\u8FD9\u4E00\u884C\uFF08\u800C\u4E0D\u662F\u64CD\u4F5C\u884C\uFF09\u662F\u56E0\u4E3A\u5B83\u540C\u65F6\u51B3\u5B9A\u6280\u80FD\u76EE\u5F55\u4E0E MCP \u6CE8\u5165\uFF1A\n * \u7528\u6237\u9700\u8981\u4E00\u773C\u770B\u5230\u300C\u6211\u73B0\u5728\u914D\u7F6E\u7684\u662F\u54EA\u4E2A\u5DE5\u4F5C\u533A\u300D\u3002\n */\nexport function PanelHead({ t, kind, onKind, level, onLevel, workspaces, workspaceValue, onWorkspace, openMenu, setOpenMenu }: {\n t: (key: string, params?: Record<string, string | number>) => string\n kind: 'skill' | 'mcp' | 'prompt'\n onKind: (value: 'skill' | 'mcp' | 'prompt') => void\n level: 'preset' | 'workspace'\n onLevel: (value: 'preset' | 'workspace') => void\n workspaces: string[]\n /** \u5F53\u524D\u9009\u4E2D\u7684\u5DE5\u4F5C\u533A\uFF1Bnull = \u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD\u3002 */\n workspaceValue: string | null\n onWorkspace: (cwd: string | null) => void\n openMenu: string | null\n setOpenMenu: Dispatch<SetStateAction<string | null>>\n}): JSX.Element {\n return (\n <div className=\"psh-head\">\n <span className=\"psh-title\" style={{ flex: 'none' }}>{t('panelTitle')}</span>\n <div className={css.kindTabs} role=\"tablist\" aria-label=\"SKILL / MCP / \u63D0\u793A\u8BCD\">\n {([\n ['skill', t('kindSkill')],\n ['mcp', t('kindMcp')],\n ['prompt', t('kindPrompt')],\n ] as const).map(([value, label]) => (\n <button\n key={value}\n type=\"button\"\n role=\"tab\"\n aria-selected={kind === value}\n className={`${css.kindTab} ${kind === value ? css.kindTabActive : ''}`}\n data-active={kind === value || undefined}\n onClick={() => { onKind(value) }}\n >\n {label}\n </button>\n ))}\n </div>\n {/* \u63D0\u793A\u8BCD\u5DF2\u4E0B\u7EBF\u5DE5\u4F5C\u533A\u7EA7\uFF1B\u5C42\u7EA7\u5207\u6362\u53EA\u7528\u4E8E\u6280\u80FD / MCP\u3002 */}\n {kind !== 'prompt' && (\n <div className={css.kindTabs} role=\"tablist\" aria-label={t('levelAria')} style={{ marginLeft: 8 }}>\n {([['preset', t('levelPreset')], ['workspace', t('levelWorkspace')]] as const).map(([value, label]) => (\n <button\n key={value}\n type=\"button\"\n role=\"tab\"\n aria-selected={level === value}\n className={`${css.kindTab} ${level === value ? css.kindTabActive : ''}`}\n data-active={level === value || undefined}\n onClick={() => { onLevel(value) }}\n >\n {label}\n </button>\n ))}\n </div>\n )}\n <span className={css.toolbarSpacer} />\n {/* \u5DE5\u4F5C\u533A\u9009\u62E9\u5668\uFF1A\u6280\u80FD\u76EE\u5F55\u4E0E MCP \u6CE8\u5165\u90FD\u6309\u5B83\u89E3\u6790\u3002 */}\n {kind !== 'prompt' && onWorkspace !== undefined && (\n <div className={css.dropWrap} data-drop=\"workspace\" style={{ alignSelf: 'center', marginRight: 4 }}>\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 30, maxWidth: 240 }}\n aria-haspopup=\"menu\"\n aria-expanded={openMenu === 'workspace' || undefined}\n aria-label={t('workspacePickerAria')}\n title={workspaceValue === null ? t('workspacePickerAuto') : workspaceValue}\n onClick={() => { setOpenMenu((value) => value === 'workspace' ? null : 'workspace') }}\n >\n <span className={css.dropLabelEllipsis}>{workspaceValue === null\n ? t('workspacePickerAuto')\n : shortenPath(workspaceValue)}</span>\n <IconChevronDownOutlineRegular size={11} aria-hidden=\"true\" />\n </button>\n {openMenu === 'workspace' && (\n <>\n <button type=\"button\" className={css.bulkOverlay} aria-label={t('close')} onClick={() => { setOpenMenu(null) }} />\n <div className={css.dropMenu} role=\"menu\">\n <button type=\"button\" role=\"menuitemradio\" className={css.dropItem}\n aria-checked={workspaceValue === null}\n onClick={() => { onWorkspace(null); setOpenMenu(null) }}>\n <span className={css.dropCheck} data-on={workspaceValue === null || undefined} aria-hidden=\"true\">{workspaceValue === null ? '\u2713' : ''}</span>\n {t('workspacePickerAuto')}\n </button>\n {workspaces.map(item => (\n <button key={item} type=\"button\" role=\"menuitemradio\" className={css.dropItem}\n aria-checked={workspaceValue === item}\n title={item}\n onClick={() => { onWorkspace(item); setOpenMenu(null) }}>\n <span className={css.dropCheck} data-on={workspaceValue === item || undefined} aria-hidden=\"true\">{workspaceValue === item ? '\u2713' : ''}</span>\n {shortenPath(item)}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * SKILL \u9876\u680F\uFF1AAgent \u9884\u8BBE chips\uFF08\u6570\u5B57 = \u8BE5\u5C42\u542F\u7528\u6280\u80FD\u6570\uFF09+ \u6280\u80FD\u5305\u5206\u7C7B\u80F6\u56CA\uFF0C\n * \u4E0B\u4E00\u884C\u662F\u64CD\u4F5C\u884C\u2014\u2014\u641C\u7D22 / \u540D\u79F0\u6392\u5E8F / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u6280\u80FD\u5065\u5EB7 / \u5237\u65B0 \u00B7 \u65B0\u5EFA \u00B7 \u6DFB\u52A0\u3002\n * \u6574\u5757\u540C\u65F6\u662F\u6280\u80FD\u6587\u4EF6\u5939\u62D6\u653E\u533A\u3002\n */\nexport function SkillTopBar({\n t, dropActive, setDropActive, onDrop, activePreset, setActivePreset, presets, overrides,\n enabledCountFor, totalSkills, enabledCount, disabledCount, healthView, hasCategories, activeCat, setCatFilter,\n categoryList, categoryCounts, bundleCount, statusFilter, setStatusFilter, query, setQuery, openMenu,\n setOpenMenu, sortAsc, setSortAsc, newBundleOpen, onNewBundle, onAdd, onRefresh, fileInput, acceptFiles,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n dropActive: boolean\n setDropActive: Dispatch<SetStateAction<boolean>>\n onDrop: (event: DragEvent<HTMLDivElement>) => Promise<void>\n activePreset: string\n setActivePreset: Dispatch<SetStateAction<string>>\n presets: PresetRow[]\n overrides: Record<string, Record<string, boolean>>\n enabledCountFor: (presetId: string) => number\n totalSkills: number\n enabledCount: number\n disabledCount: number\n /** \u5065\u5EB7\u626B\u63CF\u5C55\u793A\u6A21\u578B\uFF08tone \u51B3\u5B9A\u5706\u70B9\u989C\u8272\uFF09\u3002 */\n healthView: HealthViewModel\n hasCategories: boolean\n activeCat: string | null\n setCatFilter: Dispatch<SetStateAction<string | null>>\n categoryList: string[]\n categoryCounts: Map<string, number>\n bundleCount: number\n statusFilter: 'all' | 'on' | 'off'\n setStatusFilter: Dispatch<SetStateAction<'all' | 'on' | 'off'>>\n query: string\n setQuery: Dispatch<SetStateAction<string>>\n openMenu: string | null\n setOpenMenu: Dispatch<SetStateAction<string | null>>\n sortAsc: boolean\n setSortAsc: Dispatch<SetStateAction<boolean>>\n newBundleOpen: boolean\n onNewBundle: () => void\n onAdd: () => void\n onRefresh: () => void\n /** \u9690\u85CF\u7684\u76EE\u5F55\u9009\u62E9\u6846\uFF1A\u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\u4E0E\u9876\u680F\u62D6\u653E\u5171\u7528\u3002 */\n fileInput: RefObject<HTMLInputElement>\n acceptFiles: (files: File[] | null) => void\n}): JSX.Element {\n return (\n <div\n className={css.topbar}\n data-drop={dropActive || undefined}\n onDragOver={(event) => { event.preventDefault(); setDropActive(true) }}\n onDragLeave={() => { setDropActive(false) }}\n onDrop={(event) => { void onDrop(event) }}\n >\n <div className={css.chipRow} role=\"group\" aria-label={t('presetCatTitle')}>\n <button\n type=\"button\"\n className={`${css.catItem} ${activePreset === ALL_PRESETS ? css.catItemActive : ''}`}\n data-active={activePreset === ALL_PRESETS || undefined}\n onClick={() => { setActivePreset(ALL_PRESETS) }}\n >\n <span className={css.catIcon} data-active={activePreset === ALL_PRESETS || undefined}><CatAllIcon size={16} /></span>\n <span className={css.catLabel}>{t('presetAll')}</span>\n <span className={css.catCount} title={t('presetCountTip', { n: enabledCountFor(ALL_PRESETS), total: totalSkills })}>{enabledCountFor(ALL_PRESETS)}</span>\n </button>\n {presets.map((preset) => {\n const overrideCount = Object.values(overrides[preset.id] ?? {}).filter((state2) => state2 === false).length\n return (\n <button\n key={preset.id}\n type=\"button\"\n className={`${css.catItem} ${activePreset === preset.id ? css.catItemActive : ''}`}\n data-active={activePreset === preset.id || undefined}\n onClick={() => { setActivePreset(preset.id) }}\n >\n <span className={css.catIcon} data-active={activePreset === preset.id || undefined}><IconAgentPresetOutlineRegular size={15} /></span>\n <span className={css.catLabel}>{preset.name ?? preset.id}</span>\n <span className={css.catCount} data-warn={overrideCount > 0 || undefined}\n title={t('presetCountTip', { n: enabledCountFor(preset.id), total: totalSkills })\n + (overrideCount > 0 ? ` \u00B7 ${t('presetOverrideCount', { n: overrideCount })}` : '')}>\n {enabledCountFor(preset.id)}\n </span>\n </button>\n )\n })}\n </div>\n\n {/* \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u80F6\u56CA\u5373\u7B5B\u9009\uFF08\u518D\u70B9\u4E00\u6B21\u53D6\u6D88\uFF09\u3002\u6CA1\u6709\u4E00\u4E2A\u771F\u5206\u7C7B\u65F6\u4E0D\u5360\u8FD9\u4E00\u884C\u3002 */}\n {hasCategories && (\n <div className={css.catChipRow} role=\"group\" aria-label={t('bundleCatFilterAria')}>\n <span className={css.catChipLabel}>{t('bundleCatTitle')}</span>\n <button\n type=\"button\"\n className={css.catChip}\n data-active={activeCat === null || undefined}\n aria-pressed={activeCat === null}\n onClick={() => { setCatFilter(null) }}\n >\n {t('bundleCatAll')}\n <span className={css.catChipCount}>{bundleCount}</span>\n </button>\n {categoryList.map((cat) => {\n const none = cat === UNCATEGORIZED\n const active = activeCat === cat\n return (\n <button\n type=\"button\"\n key={cat}\n className={css.catChip}\n data-active={active || undefined}\n aria-pressed={active}\n onClick={() => { setCatFilter(active ? null : cat) }}\n >\n {none ? t('bundleCatNone') : cat}\n <span className={css.catChipCount}>{categoryCounts.get(cat) ?? 0}</span>\n </button>\n )\n })}\n </div>\n )}\n\n {/* \u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 / \u540D\u79F0\u6392\u5E8F / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u6280\u80FD\u5065\u5EB7 / \u5237\u65B0 \u00B7 \u65B0\u5EFA \u00B7 \u6DFB\u52A0 */}\n <div className={css.topbarActions}>\n <div className={css.searchBox}>\n <SearchIcon />\n <input\n className={css.searchInput}\n value={query}\n placeholder={t('searchPlaceholder')}\n aria-label={t('searchPlaceholder')}\n onChange={(event) => { setQuery(event.currentTarget.value) }}\n />\n </div>\n <div className={css.dropWrap}>\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 36 }}\n aria-haspopup=\"menu\"\n aria-expanded={openMenu === 'sort' || undefined}\n onClick={() => { setOpenMenu((value) => value === 'sort' ? null : 'sort') }}\n >\n {t('sortLabel')}\n <SortDirIcon dir={sortAsc ? 'asc' : 'desc'} size={12} />\n <IconChevronDownOutlineRegular size={11} aria-hidden=\"true\" />\n </button>\n {openMenu === 'sort' && (\n <>\n <button type=\"button\" className={css.bulkOverlay} aria-label={t('close')} onClick={() => { setOpenMenu(null) }} />\n <div className={css.dropMenu} role=\"menu\">\n <button type=\"button\" role=\"menuitemradio\" className={css.dropItem} aria-checked={sortAsc}\n onClick={() => { setSortAsc(true); setOpenMenu(null) }}>\n <span className={css.dropCheck} data-on={sortAsc || undefined} aria-hidden=\"true\">{sortAsc ? '\u2713' : ''}</span>\n {t('nameAsc')}\n </button>\n <button type=\"button\" role=\"menuitemradio\" className={css.dropItem} aria-checked={!sortAsc}\n onClick={() => { setSortAsc(false); setOpenMenu(null) }}>\n <span className={css.dropCheck} data-on={!sortAsc || undefined} aria-hidden=\"true\">{!sortAsc ? '\u2713' : ''}</span>\n {t('nameDesc')}\n </button>\n </div>\n </>\n )}\n </div>\n <div className={css.statusSeg} role=\"group\" aria-label={t('statusAll')}>\n {([\n ['all', t('statusAll'), enabledCount + disabledCount],\n ['on', t('statusOn'), enabledCount],\n ['off', t('statusOff'), disabledCount],\n ] as const).map(([value, label, count]) => (\n <button\n key={value}\n type=\"button\"\n className={`${css.statusSegBtn} ${statusFilter === value ? css.statusSegActive : ''}`}\n data-active={statusFilter === value || undefined}\n aria-pressed={statusFilter === value}\n onClick={() => { setStatusFilter(value) }}\n >\n {label}\n <span className={css.statusSegCount}>{count}</span>\n </button>\n ))}\n </div>\n <span className={css.healthInline} data-tone={healthView.tone} title={healthView.title === '' ? undefined : healthView.title}>\n {t('statSync')} \u00B7 {healthView.label}\n </span>\n <span className={css.toolbarSpacer} />\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 34, alignSelf: 'center' }}\n onClick={onRefresh}\n >\n <IconRefreshOutlineRegular size={14} aria-hidden=\"true\" />\n {t('refresh')}\n </button>\n <button\n type=\"button\"\n className={`${css.newBundleBtn} ${newBundleOpen ? css.newBundleBtnOpen : ''}`}\n style={{ width: 'auto', marginTop: 0, height: 34, fontSize: 12 }}\n aria-expanded={newBundleOpen || undefined}\n onClick={onNewBundle}\n >\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n {t('newBundle')}\n </button>\n <button\n type=\"button\"\n className={css.addBtn}\n style={{ height: 34, alignSelf: 'center' }}\n aria-label={t('addSkillsTitle')}\n title={t('addSkillsSub')}\n onClick={onAdd}\n >\n <CloudUpIcon size={15} aria-hidden=\"true\" />\n {t('addSkillsTitle')}\n </button>\n <input\n ref={fileInput}\n type=\"file\"\n className={css.hiddenInput}\n multiple\n {...{ webkitdirectory: '' }}\n onChange={(event) => {\n acceptFiles(event.currentTarget.files === null ? null : Array.from(event.currentTarget.files))\n }}\n />\n </div>\n\n </div>\n )\n}\n/**\n * MCP \u9876\u680F\uFF1A\u4E0E\u6280\u80FD\u9875\u540C\u6784\u7684\u9884\u8BBE chips\uFF08\u5168\u90E8 + \u5404\u9884\u8BBE\uFF0C\u6570\u5B57 = \u8BE5\u5C42\u53EF\u89C1 Server \u6570\uFF09\n * + \u542F\u7528\u72B6\u6001\u5206\u6BB5\u3002\u6446\u5728\u4E3B\u533A\u4E4B\u4E0A\uFF0C\u4E0E\u6280\u80FD\u9875\u540C\u4E00\u4F4D\u7F6E\u3001\u540C\u4E00\u5957\u7C7B\u540D\u3002\n */\nexport function McpTopBar({\n t, live, scope, onScope, status, onStatus, query, onQuery, onRefresh, onAddOwn, onAddCustom, workspace, level,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n live: LiveMcpStatus\n scope: string\n onScope: (value: string) => void\n status: 'all' | 'on' | 'off'\n onStatus: (value: 'all' | 'on' | 'off') => void\n query: string\n onQuery: (value: string) => void\n onRefresh: () => void\n /** \u6253\u5F00\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\uFF08\u53EA\u5728\u9884\u8BBE\u8303\u56F4\u663E\u793A\u8FD9\u4E2A\u6309\u94AE\uFF09\u3002 */\n onAddOwn: () => void\n onAddCustom: () => void\n /** \u9762\u677F\u5F53\u524D\u5DE5\u4F5C\u533A\uFF1A\u5DE5\u4F5C\u533A\u7EA7\u5173\u95ED\u4F1A\u8BA1\u5165\u542F\u7528/\u505C\u7528\u8BA1\u6570\u3002 */\n workspace: string | null\n /** \u7EDF\u4E00\u7F16\u8F91\u5C42\u7EA7\uFF1A\u5DE5\u4F5C\u533A\u7EA7\u4E0D\u518D\u663E\u793A\u9884\u8BBE\u906E\u853D\u7684\u5355\u72EC\u8BBE\u7F6E\u5FBD\u6807\u3002 */\n level: 'preset' | 'workspace'\n}): JSX.Element {\n const data = live.state === 'ready' ? live.data : null\n const presets = data?.presets ?? []\n const globals = data?.servers ?? []\n /** \u5F53\u524D\u5DE5\u4F5C\u533A\u88AB\u5173\u6389\u7684 Server \u540D\u5355\u3002 */\n const closedInWorkspace = new Set<string>(\n workspace === null\n ? []\n : Object.entries(data?.workspaceClosed?.[workspace] ?? {})\n .filter(([, on]) => on === false)\n .map(([name]) => name),\n )\n const maskedOf = (presetId: string): Set<string> => new Set(\n Object.entries(data?.masks?.[presetId] ?? {}).filter(([, on]) => on === false).map(([name]) => name),\n )\n /**\n * \u5F53\u524D\u5DE5\u4F5C\u533A + \u6307\u5B9A\u9884\u8BBE\u4E0B\u5B9E\u9645\u4F1A\u6E32\u67D3\u7684\u884C\u96C6\u5408\uFF1A\u5168\u5C40\u884C + \u8BE5\u9884\u8BBE\u81EA\u5E26\u884C\u3002\n * \u8BA1\u6570\u5FC5\u987B\u6309\u8FD9\u4EFD\u884C\u96C6\u5408\u6C42\uFF0C\u4E0D\u80FD\u53EA\u6570 globals\uFF08\u4F1A\u6F0F\u6389 presetServers/workspaceClosed\uFF09\u3002\n */\n const rowsOf = (presetId: string): Array<{ enabled: boolean }> => {\n const masked = maskedOf(presetId)\n const rows = globals.map(server => ({\n enabled: mcpEffectiveEnabled({\n configDisabled: server.config.disabled,\n masked: presetId !== '' && masked.has(server.serverName),\n workspaceClosed: closedInWorkspace.has(server.serverName),\n }),\n }))\n if (presetId !== '') {\n for (const row of data?.presetServers?.[presetId] ?? []) {\n rows.push({ enabled: mcpEffectiveEnabled({ workspaceClosed: closedInWorkspace.has(row.serverName) }) })\n }\n }\n return rows\n }\n /** \u8BE5\u9884\u8BBE\u4E0B\u5DF2\u542F\u7528\u7684 Server \u6570\uFF08= \u5B9E\u9645\u6E32\u67D3\u884C\u91CC\u6709\u6548\u542F\u7528\u7684\u6570\u91CF\uFF09\u3002 */\n const visibleCount = (presetId: string): number => {\n return rowsOf(presetId).filter(row => row.enabled).length\n }\n const chips: Array<{ id: string; label: string; count: number; overrides: number; icon: JSX.Element }> = [\n { id: '', label: t('presetAll'), count: visibleCount(''), overrides: 0, icon: <CatAllIcon size={16} /> },\n ...presets.map(preset => ({\n id: preset.id,\n label: preset.name ?? preset.id,\n count: visibleCount(preset.id),\n overrides: level === 'preset' ? maskedOf(preset.id).size : 0,\n icon: <IconAgentPresetOutlineRegular size={15} />,\n })),\n ]\n /** \u8FDE\u63A5\u72B6\u6001\uFF08\u66FF\u4EE3\u539F\u300C\u8FDE\u63A5\u72B6\u6001\u300D\u7EDF\u8BA1\u5361\uFF09\uFF1A\u6307\u793A\u5B9E\u65F6\u72B6\u6001\u63A5\u53E3\u80FD\u5426\u8BFB\u5230\u6CE8\u518C\u8868\u3002 */\n const conn = live.state === 'ready'\n ? { tone: 'ok', label: t('mcpConnOk'), title: t('mcpConnTip', { n: globals.length }) }\n : live.state === 'loading'\n ? { tone: 'pending', label: t('statChecking'), title: '' }\n : { tone: 'warn', label: t('mcpConnDown'), title: t('mcpLiveUnavailable') }\n /** \u5F53\u524D\u8303\u56F4\u5B9E\u9645\u6E32\u67D3\u7684\u884C\uFF1A\u8BA1\u6570\u4E0E\u5217\u8868\u7B5B\u9009\u540C\u6E90\u3002 */\n const scopeRows = rowsOf(scope)\n const onCount = scopeRows.filter(row => row.enabled).length\n const offCount = scopeRows.length - onCount\n return (\n <div className={css.topbar}>\n {presets.length > 0 && (\n <div className={css.chipRow} role=\"group\" aria-label={t('mcpScopeTitle')}>\n {chips.map(chip => (\n <button\n key={chip.id === '' ? '\\u0000all' : chip.id}\n type=\"button\"\n className={`${css.catItem} ${scope === chip.id ? css.catItemActive : ''}`}\n data-active={scope === chip.id || undefined}\n onClick={() => { onScope(chip.id) }}\n >\n <span className={css.catIcon} data-active={scope === chip.id || undefined}>{chip.icon}</span>\n <span className={css.catLabel}>{chip.label}</span>\n <span\n className={css.catCount}\n data-warn={chip.overrides > 0 || undefined}\n title={chip.id === ''\n ? t('mcpScopeAllTip', { n: chip.count })\n : t('mcpScopePresetTip', { n: chip.count })\n + (chip.overrides > 0 ? ` \u00B7 ${t('mcpScopeOverrideCount', { n: chip.overrides })}` : '')}\n >\n {chip.count}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* \u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u8FDE\u63A5\u72B6\u6001 / \u5237\u65B0 \u00B7 \u6DFB\u52A0\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09 */}\n <div className={css.topbarActions}>\n <div className={css.searchBox}>\n <SearchIcon />\n <input\n className={css.searchInput}\n value={query}\n placeholder={t('mcpSearchServers')}\n aria-label={t('mcpSearchServers')}\n onChange={(event) => { onQuery(event.currentTarget.value) }}\n />\n </div>\n <div className={css.statusSeg} role=\"group\" aria-label={t('statusAll')}>\n {([\n ['all', t('statusAll'), scopeRows.length],\n ['on', t('statusOn'), onCount],\n ['off', t('statusOff'), offCount],\n ] as const).map(([value, label, count]) => (\n <button\n key={value}\n type=\"button\"\n className={`${css.statusSegBtn} ${status === value ? css.statusSegActive : ''}`}\n data-active={status === value || undefined}\n aria-pressed={status === value}\n onClick={() => { onStatus(value) }}\n >\n {label}\n <span className={css.statusSegCount}>{count}</span>\n </button>\n ))}\n </div>\n <span className={css.healthInline} data-tone={conn.tone} title={conn.title === '' ? undefined : conn.title}>\n {t('mcpConnStatus')} \u00B7 {conn.label}\n </span>\n <span className={css.toolbarSpacer} />\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 34, alignSelf: 'center' }}\n onClick={onRefresh}\n >\n {t('mcpLiveRefresh')}\n </button>\n {scope !== '' && (\n <button\n type=\"button\"\n className={css.newBundleBtn}\n style={{ width: 'auto', marginTop: 0, height: 34, fontSize: 12 }}\n onClick={onAddOwn}\n >\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n {t('mcpPresetAddOwn')}\n </button>\n )}\n <button\n type=\"button\"\n className={css.addBtn}\n style={{ height: 34, alignSelf: 'center' }}\n aria-label={t('mcpAddServer')}\n title={scope === '' ? undefined : t('mcpAddGlobalHint')}\n onClick={onAddCustom}\n >\n <IconPlusOutlineRegular size={15} aria-hidden=\"true\" />\n {/* \u9884\u8BBE\u8303\u56F4\u4E0B\u5199\u660E\u8FD9\u4E00\u6761\u662F\u5168\u5C40\u7684\uFF1A\u53EA\u60F3\u7ED9\u5F53\u524D\u9884\u8BBE\u7528\u8BF7\u8D70\u5DE6\u4FA7\u7684\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u3002 */}\n {scope === '' ? t('mcpAddServer') : t('mcpAddServerGlobal')}\n </button>\n </div>\n </div>\n )\n}\n\n/**\n * \u8DEF\u5F84\u7F29\u5199\uFF1A\u53EA\u4FDD\u7559\u6700\u540E\u4E24\u6BB5\uFF0C\u957F\u8DEF\u5F84\u4E0D\u81F3\u4E8E\u628A\u5DE5\u5177\u680F\u6491\u5F00\u3002\n * Windows \u53CD\u659C\u6760\u4E0E POSIX \u659C\u6760\u90FD\u6309\u5206\u9694\u7B26\u5904\u7406\u3002\n * @param path - \u7EDD\u5BF9\u8DEF\u5F84\u3002\n * @returns \u5F62\u5982 `\u2026/dsh-pulgn/skin` \u7684\u77ED\u6807\u7B7E\u3002\n */\nfunction shortenPath(path: string): string {\n const parts = path.split(/[\\\\/]/).filter((item) => item !== '')\n if (parts.length <= 2) return path\n return `\u2026/${parts.slice(-2).join('/')}`\n}\n\n/** ---------------------------------------------------------------- \u9884\u8BBE\u5706\u7403\uFF08\u5386\u53F2\u4FDD\u7559\u7EC4\u4EF6\uFF0C\u5F53\u524D\u9762\u677F\u7528 chips\uFF09 */\n\n/** \u7403\u5185\u6587\u5B57\uFF1A\u4E2D\u6587\u53D6\u9996\u5B57\uFF0C\u62C9\u4E01\u53D6\u9996\u5B57\u6BCD\u3002 */\nexport function ballInitial(label: string): string {\n const trimmed = label.trim()\n if (trimmed === '') return '?'\n return [...trimmed][0] ?? '?'\n}\n\n/** \u4E00\u4E2A\u9884\u8BBE\u5706\u7403\uFF08\u65E0\u5E95\u8272\uFF0C\u4EC5\u63CF\u8FB9\u8F6E\u5ED3\uFF1B\u6709\u5355\u72EC\u8BBE\u7F6E\u65F6\u53F3\u4E0B\u89D2\u70B9\u4EAE\u5C0F\u5706\u70B9\uFF09\u3002 */\nexport function PresetBall({ id, label, active, dot, title, onSelect }: {\n id: string\n label: string\n active: boolean\n dot: boolean\n title: string\n onSelect: () => void\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n className={css.presetBallWrap}\n data-active={active ? 'true' : undefined}\n aria-pressed={active}\n title={title}\n onClick={onSelect}\n >\n <span className={css.presetBall} data-dot={dot ? 'true' : undefined}>\n {id === ALL_PRESETS ? <IconAgentPresetOutlineRegular size={18} aria-hidden=\"true\" /> : ballInitial(label)}\n </span>\n <span className={css.presetBallLabel}>{label}</span>\n </button>\n )\n}\n", "/**\n * error-boundary \u2014 \u628A\u300C\u9762\u677F\u6E32\u67D3\u5D29\u6E83\u300D\u5173\u8FDB\u7B3C\u5B50\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u8981\u6709\uFF1A\u4FA7\u8FB9\u680F\u5165\u53E3\u662F `createRoot` \u6302\u51FA\u6765\u7684\u72EC\u7ACB React \u6839\uFF0CReact 18\n * \u5BF9\u6E32\u67D3\u671F\u5F02\u5E38\u7684\u9ED8\u8BA4\u5904\u7406\u662F**\u5378\u8F7D\u6574\u4E2A\u6839**\u2014\u2014\u9762\u677F\u91CC\u4E00\u4E2A\u7EC4\u4EF6\u629B\u9519\uFF0C\u5BFC\u822A\u884C\u6309\u94AE\n * \u4F1A\u8DDF\u7740\u4E00\u8D77\u6D88\u5931\uFF0C\u800C\u4E14\u4E0D\u7559\u75D5\u8FF9\uFF08\u5BBF\u4E3B DOM \u8FD8\u5728\u3001\u53EA\u662F\u7A7A\u4E86\uFF0C\u770B\u8D77\u6765\u5C31\u50CF\u300C\u69FD\u4F4D\n * \u6CA1\u4E86\u300D\uFF09\u3002`ctx.effect` \u5916\u7684 `safe()` \u53EA\u80FD\u5305\u4F4F\u540C\u6B65\u7684 apply()\uFF0C\u62E6\u4E0D\u5230\u6E32\u67D3\u671F\n * \u5F02\u5E38\u3002\n *\n * \u56E0\u6B64\u6BCF\u4E2A\u5F39\u5C42\u9762\u677F\u90FD\u8981\u5355\u72EC\u5305\u4E00\u5C42\uFF1A\u5D29\u4E86\u53EA\u6536\u8D77\u90A3\u4E00\u4E2A\u9762\u677F\uFF0C\u5BFC\u822A\u6309\u94AE\u7167\u5E38\u7559\u7740\uFF0C\n * \u540C\u65F6\u628A\u771F\u5B9E\u9519\u8BEF\u548C\u7EC4\u4EF6\u6808\u6253\u5230\u63A7\u5236\u53F0\uFF0C\u4FBF\u4E8E\u5B9A\u4F4D\u3002\n */\n\nimport { Component, type ErrorInfo, type ReactNode } from 'react'\n\n/** \u8FB9\u754C\u5C5E\u6027\u3002 */\nexport interface ErrorBoundaryProps {\n /** \u51FA\u9519\u65F6\u6253\u5728\u65E5\u5FD7\u91CC\u7684\u540D\u5B57\u3002 */\n label: string\n /** \u5D29\u6E83\u540E\u7684\u66FF\u4EE3\u5185\u5BB9\uFF08\u5BFC\u822A\u884C\u573A\u666F\u4F20 null\uFF0C\u53EA\u6536\u9762\u677F\uFF09\u3002 */\n fallback?: ReactNode\n /** \u6355\u83B7\u5230\u9519\u8BEF\u65F6\u7684\u56DE\u8C03\uFF08\u7528\u4E8E\u987A\u624B\u628A\u9762\u677F\u5173\u6389\uFF09\u3002 */\n onError?: (error: Error) => void\n children: ReactNode\n}\n\ninterface ErrorBoundaryState {\n error: Error | null\n}\n\n/** \u53EA\u515C\u6E32\u67D3/\u751F\u547D\u5468\u671F\u5F02\u5E38\u7684\u9519\u8BEF\u8FB9\u754C\uFF08\u4E0D\u515C\u4E8B\u4EF6\u56DE\u8C03\u4E0E\u5F02\u6B65\uFF09\u3002 */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n override state: ErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // \u6253\u51FA\u7EC4\u4EF6\u6808\uFF1A\u6CA1\u6709\u5B83\uFF0C\u5D29\u6E83\u53EA\u4F1A\u8868\u73B0\u4E3A\u300C\u754C\u9762\u5C11\u4E86\u4E00\u5757\u300D\uFF0C\u65E0\u4ECE\u4E0B\u624B\u3002\n console.error(`[dsh-prompt-customizer] ${this.props.label} \u6E32\u67D3\u5D29\u6E83\uFF1A`, error, info.componentStack ?? '')\n try {\n this.props.onError?.(error)\n } catch (callbackError) {\n console.error('[dsh-prompt-customizer] \u9519\u8BEF\u8FB9\u754C\u56DE\u8C03\u5931\u8D25\uFF1A', callbackError)\n }\n }\n\n override render(): ReactNode {\n if (this.state.error !== null) return this.props.fallback ?? null\n return this.props.children\n }\n}\n", "/**\n * sidebar-nav \u2014 \u4FA7\u8FB9\u680F\u5BFC\u822A\u533A\u5171\u4EAB\u6302\u8F7D\u5668\u3002\n *\n * \u5728 sidebar \u7684\u6D4F\u89C8\u533A\u5BB9\u5668\uFF08`[data-slot=\"sidebar.workspaces\"]`\uFF09\u6B63\u4E0A\u65B9\u63D2\n * \u4E00\u4E2A host\uFF0Chost \u5185\u6309\u56FA\u5B9A\u987A\u5E8F\uFF08\u5F53\u524D\u53EA\u6709 skills\uFF09\u653E `data-nav-slot` \u69FD\u4F4D\u5BB9\u5668\uFF1B\n * \u5404\u5165\u53E3\uFF08\u80FD\u529B\u5165\u53E3 React \u7EC4\u4EF6\uFF0C\u4EE5\u53CA\u5C06\u6765\u53EF\u80FD\u65B0\u589E\u7684\u5165\u53E3\uFF09\u7ECF `useNavSlot` \u8F6E\u8BE2\n * \u62FF\u5230\u81EA\u5DF1\u7684\u69FD\u4F4D\u540E `createPortal` \u8FDB\u53BB\u2014\u2014\u987A\u5E8F\u786E\u5B9A\u3001\u4E92\u4E0D\u8986\u76D6\u3001\u8DDF React \u9996\u6B21\n * \u63D0\u4EA4\u4E0D\u7ADE\u6001\u3002\n *\n * rail \u6298\u53E0\u6001\u7531 `useRail` \u89C2\u5BDF `data-shell-overlay` \u6846\u67B6\u5BB9\u5668\u7684\n * `data-sidebar-collapsed` \u5C5E\u6027\u5207\u6362\uFF0Crail \u4E0B\u5BFC\u822A\u884C\u6536\u7F29\u4E3A\u56FE\u6807\u94AE\u3002\n */\n\nimport { useEffect, useState, type MouseEvent, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { PopoverAnchor } from './popover-shell.js'\n\n/** nav host id\uFF08\u672C\u6A21\u5757\u521B\u5EFA\uFF09\u3002 */\nconst HOST_ID = 'dsh-prompt-customizer-nav-host'\n/** slots \u6E32\u67D3\u5668\u7684\u7A33\u5B9A\u951A\u70B9\uFF08SidebarRoot \u66B4\u9732\u7684 `sidebar.workspaces` slot\uFF09\u3002 */\nconst ANCHOR_SELECTOR = '[data-slot=\"sidebar.workspaces\"]'\n/** \u4FA7\u8FB9\u680F\u6298\u53E0\u89C2\u5BDF\uFF1A\u6846\u67B6\u5BB9\u5668\u9009\u62E9\u5728\u6240\u6709 sidebar \u72B6\u6001\uFF08wide/rail\uFF09\u4E0B\u90FD\u552F\u4E00\u3002 */\nconst FRAME_SELECTOR = 'div:has(> [data-shell-overlay])'\n\n/**\n * nav host \u7684\u884C\u5E03\u5C40\uFF1A\u6BCF\u4E2A\u6570\u7EC4\u5143\u7D20\u662F\u4E00\u884C\uFF0C\u884C\u5185\u6570\u7EC4\u662F\u5E76\u6392\u7684\u69FD\u4F4D\u3002\n *\n * [skills]\n *\n * \u5386\u53F2\uFF1A\u8BB0\u5FC6 / \u7528\u91CF / \u81EA\u52A8\u5316\u4E09\u4E2A\u5165\u53E3\u79FB\u9664\u540E\u53EA\u5269\u80FD\u529B\uFF08\u6280\u80FD + MCP\uFF09\u5165\u53E3\uFF0C\n * \u884C\u5185\u4E0D\u518D\u9700\u8981\u5E76\u6392\u5BB9\u5668\uFF0C\u6309\u94AE\u76F4\u63A5\u6491\u6EE1\u6574\u884C\uFF08\u4E0E\u539F\u751F\u5BFC\u822A\u884C\u540C\u6B3E\u51E0\u4F55\uFF09\u3002\n */\nconst SLOT_LAYOUT = [\n ['skills'],\n] as const\n\n/** \u69FD\u4F4D\u540D\uFF08\u5E03\u5C40\u8868\u5C55\u5E73\uFF09\u3002 */\nconst SLOT_NAMES = SLOT_LAYOUT.flat() as readonly string[]\n\n/** \u69FD\u4F4D\u540D\u3002 */\nexport type NavSlotName = (typeof SLOT_LAYOUT)[number][number]\n\n/** \u5EFA\u4E00\u4E2A\u69FD\u4F4D\u5BB9\u5668\uFF08portal \u76EE\u6807\uFF09\u3002 */\nfunction makeSlot(name: string): HTMLDivElement {\n const slot = document.createElement('div')\n slot.dataset.navSlot = name\n return slot\n}\n\nlet started = false\nlet pollTimer = 0\nlet hostObserver: MutationObserver | undefined\n\n/** \u786E\u4FDD host \u5DF2\u521B\u5EFA\u5E76\u63D2\u5230 `sidebar.workspaces` slot \u4E4B\u524D\uFF08\u5E42\u7B49\uFF09\u3002 */\nfunction ensureHostPlaced(): boolean {\n const anchor = document.querySelector(ANCHOR_SELECTOR)\n if (anchor === null) return false\n const parent = anchor.parentElement\n if (parent === null) return false\n let host = document.getElementById(HOST_ID) as HTMLDivElement | null\n if (host === null) {\n host = document.createElement('div')\n host.id = HOST_ID\n host.dataset.plugin = 'dsh-prompt-customizer'\n for (const row of SLOT_LAYOUT) {\n for (const name of row) host.appendChild(makeSlot(name))\n }\n }\n // \u5C31\u4F4D\u5224\u5B9A\uFF1Ahost \u4E0E\u951A\u70B9\u540C\u7236\u3001\u4E14\u5728\u951A\u70B9\u4E4B\u524D\u3002\n const inPlace = host.parentElement === parent\n && (anchor.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_PRECEDING) !== 0\n if (!inPlace) {\n parent.insertBefore(host, anchor)\n }\n return true\n}\n\n/**\n * \u76EF\u4F4F\u5BBF\u4E3B\u7684\u76F4\u63A5\u7236\u8282\u70B9\uFF0C\u5BBF\u4E3B\u4E00\u88AB\u6458\u6389\u7ACB\u523B\u8865\u4F4D\u3002\n *\n * host \u662F\u6211\u4EEC\u624B\u5DE5 `insertBefore` \u8FDB DSH \u81EA\u6709 React \u6811\u7684\u88F8\u8282\u70B9\u2014\u2014React \u4E0D\u8BA4\u8BC6\n * \u5B83\uFF0C\u4FA7\u8FB9\u680F\u4EFB\u4F55\u4E00\u6B21 children \u91CD\u6392\u90FD\u53EF\u80FD\u628A\u5B83\u56DE\u6536\u6389\u3002\u53EA\u9760 1.5s \u8F6E\u8BE2\u4F1A\u7559\u4E0B\n * \u6700\u957F 1.5s \u7684\u7A7A\u7A97\uFF08\u89C6\u89C9\u4E0A\u5C31\u662F\u5165\u53E3\u95EA\u4E00\u4E0B\u518D\u56DE\u6765\uFF09\u3002\u8FD9\u91CC\u53EA\u89C2\u5BDF\u7236\u8282\u70B9\u7684\n * childList\uFF08\u4E0D\u5F00 subtree\uFF09\uFF1A\u4FA7\u8FB9\u680F\u81EA\u8EAB\u7684 DOM \u53D8\u52A8\u9891\u7387\u5F88\u4F4E\uFF0C\u800C\u5F39\u5C42\u9762\u677F\u5DF2\u7ECF\n * portal \u5230 body\uFF0C\u4E0D\u4F1A\u5728\u8FD9\u91CC\u4EA7\u751F\u566A\u97F3\u3002\n *\n * \u6536\u655B\u6027\uFF1A\u8865\u4F4D\u540E host \u5DF2\u5C31\u4F4D\uFF0C`ensureHostPlaced` \u4E0D\u518D\u6539\u52A8 DOM\uFF0C\u4E0D\u4F1A\u81EA\u6FC0\u3002\n * \u7236\u8282\u70B9\u6574\u4F53\u88AB\u66FF\u6362\u65F6\u89C2\u5BDF\u4F1A\u5931\u8054\uFF0C\u7531\u8F6E\u8BE2\u515C\u5E95\u91CD\u6302\u3002\n */\nfunction watchHostParent(): void {\n const parent = document.getElementById(HOST_ID)?.parentElement\n if (parent === undefined) return\n hostObserver?.disconnect()\n hostObserver = new MutationObserver(() => {\n const before = document.getElementById(HOST_ID)?.parentElement\n ensureHostPlaced()\n if (document.getElementById(HOST_ID)?.parentElement !== before) watchHostParent()\n })\n hostObserver.observe(parent, { childList: true })\n}\n\n/**\n * \u6302\u8F7D\u5BFC\u822A\u533A host\uFF08\u5E42\u7B49\u5355\u4F8B\uFF09\u3002\u9996\u6B21\u8C03\u7528\u8005\u6301\u6709\u6E05\u7406\u6743\uFF08\u505C\u8F6E\u8BE2\u3001\u79FB\u9664 host\uFF09\uFF0C\n * \u540E\u7EED\u8C03\u7528\u8FD4\u56DE no-op\u3002\n */\nexport function ensureNavMount(): () => void {\n if (typeof document === 'undefined') return () => {}\n if (started) return () => {}\n started = true\n ensureHostPlaced()\n watchHostParent()\n // \u4F4E\u9891\u8F6E\u8BE2\u515C\u5E95\uFF1A\u4FA7\u8FB9\u680F\u5BB9\u5668\u6574\u4F53\u88AB\u66FF\u6362\uFF08\u89C2\u5BDF\u5931\u8054\uFF09\u65F6\u91CD\u6302\uFF08HMR\u3001React \u91CD\u5EFA\u7B49\uFF09\u3002\n pollTimer = window.setInterval(() => {\n ensureHostPlaced()\n if (hostObserver === undefined) watchHostParent()\n }, 1500)\n return () => {\n window.clearInterval(pollTimer)\n pollTimer = 0\n hostObserver?.disconnect()\n hostObserver = undefined\n started = false\n document.getElementById(HOST_ID)?.remove()\n }\n}\n\n/** \u8F6E\u8BE2\u83B7\u53D6\u6307\u5B9A\u69FD\u4F4D\u5BB9\u5668\uFF08\u672A\u5C31\u4F4D\u65F6\u8FD4\u56DE null\uFF0C\u7EC4\u4EF6\u636E\u6B64\u6682\u4E0D\u6E32\u67D3\uFF09\u3002\n *\n * \u69FD\u4F4D\u76F4\u63A5\u6302\u5728 nav host \u4E0B\uFF0C\u56E0\u6B64\u5168\u5C40\u6309 data-nav-slot \u67E5\u627E\u2014\u2014\u69FD\u4F4D\u540D\u7531\u672C\u6A21\u5757\n * \u7EDF\u4E00\u521B\u5EFA\uFF0C\u552F\u4E00\u3002\n *\n * **\u6C38\u4E0D\u505C\u6B62**\uFF1A\u672A\u5C31\u4F4D\u65F6 100ms \u9636\u68AF\u5FEB\u67E5\uFF0810 \u6B21\u540E\u9000 400ms\uFF09\uFF1B\u627E\u5230\u540E\u9000\u5316\u4E3A\n * 800ms \u6162\u901F\u6821\u9A8C\u2014\u2014\u540C\u4E00\u8282\u70B9 setSlot \u88AB React \u76F4\u63A5\u8DF3\u8FC7\uFF0C\u96F6\u6E32\u67D3\u5F00\u9500\u3002\u8FD9\u6837\n * \u69FD\u4F4D\u4E00\u65E6\u88AB\u79FB\u9664/\u66FF\u6362\uFF08HMR\u3001React \u91CD\u5EFA host\u3001\u7ADE\u6001\u6E05\u7A7A\u7B49\uFF09\uFF0Cportal \u4F1A\u81EA\u52A8\n * \u8FC1\u5230\u65B0\u69FD\uFF1B\u5426\u5219\u4F1A\u6525\u7740\u6E38\u79BB\u7684\u65E7\u69FD\u5F15\u7528\u628A\u5165\u53E3\u300C\u5F04\u4E22\u300D\u4E14\u4E0D\u518D\u6062\u590D\u3002\n */\nexport function useNavSlot(name: NavSlotName): HTMLElement | null {\n const [slot, setSlot] = useState<HTMLElement | null>(null)\n useEffect(() => {\n let timer = 0\n let tries = 0\n const poll = (): void => {\n const found = document.querySelector<HTMLElement>(`[data-nav-slot='${name}']`)\n if (found !== null) tries = 0\n else tries += 1\n setSlot(found)\n timer = window.setTimeout(poll, found !== null ? 800 : tries <= 10 ? 100 : 400)\n }\n poll()\n return () => { window.clearTimeout(timer) }\n }, [name])\n return slot\n}\n\n/** \u4FA7\u8FB9\u680F\u6298\u53E0\u6001\uFF08rail = \u53EA\u663E\u793A\u56FE\u6807\uFF09\u3002\n *\n * \u89C2\u5BDF\u6302\u5728 body \u5B50\u6811\u4E0A\uFF08attributeFilter \u9650\u5B9A data-sidebar-collapsed\uFF09\uFF1A\n * \u6846\u67B6\u5BB9\u5668\u53EF\u80FD\u5728\u6298\u53E0\u65F6\u88AB React \u91CD\u6302\uFF0C\u76EF\u5355\u8282\u70B9\u4F1A\u5931\u8054\uFF1Bbody \u7EA7\u89C2\u5BDF + \u4F4E\u9891\n * \u515C\u5E95\u91CD\u8BFB\u5BF9\u300C\u6846\u67B6\u8FDF\u5230 / \u8282\u70B9\u66FF\u6362 / \u5C5E\u6027\u65F6\u5E8F\u300D\u90FD\u514D\u75AB\u3002\u503C\u4E0D\u53D8\u65F6 React \u81EA\u52A8\n * \u8DF3\u8FC7\u6E32\u67D3\uFF0C\u8F6E\u8BE2\u65E0\u989D\u5916\u5F00\u9500\u3002\n */\nexport function useRail(): boolean {\n const [rail, setRail] = useState(() =>\n document.querySelector(FRAME_SELECTOR)?.hasAttribute('data-sidebar-collapsed') ?? false)\n useEffect(() => {\n const read = (): void => {\n setRail(document.querySelector(FRAME_SELECTOR)?.hasAttribute('data-sidebar-collapsed') ?? false)\n }\n read()\n const observer = new MutationObserver(read)\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-sidebar-collapsed'], subtree: true })\n const timer = window.setInterval(read, 1500)\n return () => {\n observer.disconnect()\n window.clearInterval(timer)\n }\n }, [])\n return rail\n}\n\nconst STYLE_ID = 'dsh-prompt-customizer-nav-styles'\n\nconst SHEET = `\n/* \u5BFC\u822A\u884C\uFF1A\u4E0E\u539F\u751F\u5BFC\u822A\u884C\u540C\u6B3E\u51E0\u4F55\uFF08\u900F\u660E\u5E95 + hover \u9AD8\u4EAE + \u6587\u5B57\u7701\u7565\uFF09 */\n.dsh-nav-btn{position:relative;display:flex;align-items:center;gap:8px;width:calc(100% - 4px);height:34px;padding:0 10px;margin:0 2px 4px;box-sizing:border-box;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-primary,#eee);font-size:14px;line-height:20px;font-family:inherit;cursor:pointer;text-align:left;user-select:none;overflow:hidden;transition:background 120ms ease}\n.dsh-nav-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.dsh-nav-btn[data-open='true']{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.dsh-nav-btn>svg{flex:none;color:var(--dsw-alias-label-secondary,#bbb)}\n.dsh-nav-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n/* \u6298\u53E0 rail \u6001\uFF1A\u53EA\u7559\u56FE\u6807 */\n.dsh-nav-btn[data-rail='true']{width:36px;height:36px;padding:0;margin:0 0 8px;justify-content:center;border-radius:8px}\n/* nav host\uFF1A\u5404\u884C\u7EB5\u5411\u5806\u53E0\uFF1B\u69FD\u4F4D display:contents\uFF0C\u6309\u94AE\u76F4\u63A5\u6491\u6EE1\u6574\u884C\u3002 */\n#dsh-prompt-customizer-nav-host{display:flex;flex-direction:column;align-items:stretch;width:100%}\n#dsh-prompt-customizer-nav-host>[data-nav-slot]{display:contents}\n`\n\n/** \u6CE8\u5165\u5BFC\u822A\u884C\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureNavStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** NavButton \u5C5E\u6027\u3002 */\nexport interface NavButtonProps {\n /** \u884C\u56FE\u6807\uFF08svg \u5143\u7D20\uFF0C\u989C\u8272\u7531\u6837\u5F0F\u8868\u7EDF\u4E00\u7740\u8272\uFF09\u3002 */\n icon: ReactNode\n /** \u884C\u6587\u5B57\uFF08rail \u6001\u4E0D\u6E32\u67D3\uFF09\u3002 */\n label: string\n /** \u6298\u53E0\u6001\uFF08\u53EA\u7559\u56FE\u6807\uFF09\u3002 */\n rail?: boolean\n /** \u9762\u677F\u5C55\u5F00\u6001\uFF08\u9AD8\u4EAE\u5E95\u8272\uFF09\u3002 */\n expanded?: boolean\n /** \u65E0\u969C\u788D\u540D\uFF08\u7F3A\u7701\u7528 label\uFF09\u3002 */\n ariaLabel?: string\n /** \u60AC\u505C\uFF1A\u6ED1\u51FA\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF09\u3002 */\n onMouseEnter?: (e: MouseEvent<HTMLButtonElement>) => void\n /** \u79FB\u51FA\u6309\u94AE\uFF1A\u542F\u52A8\u81EA\u52A8\u6536\u56DE\u8BA1\u65F6\uFF08hover \u6A21\u5F0F\uFF09\u3002 */\n onMouseLeave?: () => void\n /** \u70B9\u51FB\uFF08hover \u6A21\u5F0F = \u5207\u6362\u9489\u4F4F\uFF09\u3002 */\n onClick: (e: MouseEvent<HTMLButtonElement>) => void\n}\n\n/** \u6E32\u67D3\u4E00\u6761\u5BFC\u822A\u884C\u6309\u94AE\uFF08\u4E0E auto-nav \u540C\u6B3E\u89C2\u611F\uFF09\u3002 */\nexport function NavButton({\n icon, label, rail = false, expanded = false, ariaLabel,\n onMouseEnter, onMouseLeave, onClick,\n}: NavButtonProps): JSX.Element {\n return (\n <button\n type=\"button\"\n className=\"dsh-nav-btn\"\n data-rail={rail || undefined}\n data-open={expanded || undefined}\n aria-label={ariaLabel ?? label}\n aria-expanded={expanded}\n title={rail ? (ariaLabel ?? label) : undefined}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n >\n {icon}\n {!rail && <span className=\"dsh-nav-label\">{label}</span>}\n </button>\n )\n}\n\n/** \u4FBF\u6377\u7EC4\u5408\uFF1Aportal \u5230\u6307\u5B9A\u69FD\u4F4D\uFF08slot \u672A\u5C31\u4F4D\u65F6\u4E0D\u6E32\u67D3\uFF09\u3002 */\nexport function NavPortal({ name, children }: { name: NavSlotName; children: ReactNode }): JSX.Element | null {\n const slot = useNavSlot(name)\n if (slot === null) return null\n return createPortal(children, slot)\n}\n\n/** \u9762\u677F\u4E92\u65A5 + \u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\uFF1A\u5165\u53E3\u5171\u7528\u7684\u9762\u677F\u884C\u4E3A hook\u3002\n *\n * - \u4E92\u65A5\uFF1A\u4EFB\u4E00\u9762\u677F\u6253\u5F00\u65F6\u5E7F\u64AD\uFF0C\u5176\u4F59\u5DF2\u6253\u5F00\u7684\u9762\u677F\u81EA\u52A8\u6536\u56DE\uFF08\u591A\u4E2A\u5165\u53E3\u540C\u65F6\u53EA\u5360\u4F4F\n * \u4E00\u4E2A\u4E3B\u533A\uFF0C\u4E0D\u53E0\u7F57\u6C49\uFF1B\u5F53\u524D\u53EA\u6709\u300C\u80FD\u529B\u300D\u4E00\u4E2A\u5165\u53E3\uFF0C\u5E7F\u64AD\u540C\u65F6\u662F\u65B0\u589E\u5165\u53E3\u7684\u63A5\u7F1D\uFF09\uFF1B\n * - \u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\uFF1A\u9762\u677F\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\u3001\u65E0\u906E\u7F69\uFF0C\u4FA7\u680F\u4FDD\u6301\u53EF\u70B9\uFF1B\u4FA7\u680F\u4F1A\u8BDD\u533A\u5185\n * \u7684\u70B9\u51FB\uFF08\u4F1A\u8BDD\u884C/\u65B0\u4F1A\u8BDD/\u8BBE\u7F6E\u7B49\uFF0C\u81EA\u5DF1\u5BFC\u822A\u884C\u4E0E\u9762\u677F\u5185\u90E8\u9664\u5916\uFF09\u76F4\u63A5\u6536\u9762\u677F\uFF0C\n * \u8DDF\u300C\u70B9\u4F1A\u8BDD\u56DE\u5230\u4F1A\u8BDD\u300D\u7684\u76F4\u89C9\u4E00\u81F4\u3002\n */\nexport type TriadPanelName = 'skills'\n\nconst PANEL_OPEN_EVENT = 'dsh-prompt-customizer:panel-open'\n\n/** \u70B9\u51FB\u662F\u5426\u843D\u5728\u4FA7\u680F\u5217\u5185\uFF08\u6309\u51E0\u4F55\u5224\u5B9A\uFF0C\u4E0D\u4F9D\u8D56\u5BBF\u4E3B\u7684\u54C8\u5E0C\u7C7B\u540D\uFF09\u3002\n *\n * \u8BA4\u300C\u53C8\u9AD8\u53C8\u7A84\u3001\u8D34\u5DE6\u300D\u7684\u5217\u5BB9\u5668\uFF1A\u6574\u9875\u7EA7\u7956\u5148\uFF08frame/root\uFF0C\u5BBD\u5360\u6EE1\u89C6\u53E3\uFF09\u4E0D\u7B97\uFF0C\n * \u5426\u5219\u4E3B\u533A\u70B9\u51FB\u987A\u7740\u5192\u6CE1\u94FE\u4E5F\u4F1A\u8BEF\u5224\u6210\u4FA7\u680F\u3002 */\nfunction clickInSidebar(target: Element): boolean {\n let node: Element | null = target\n while (node !== null && node !== document.body) {\n const rect = node.getBoundingClientRect()\n if (\n rect.height >= window.innerHeight * 0.7\n && rect.left <= 8\n && rect.right <= window.innerWidth * 0.6\n ) return true\n node = node.parentElement\n }\n return false\n}\n\nexport function usePanelAutoClose(name: TriadPanelName, open: boolean, requestClose: () => void): void {\n // \u6253\u5F00\u65F6\u5E7F\u64AD\uFF0C\u6324\u6389\u522B\u7684\u9762\u677F\u3002\n useEffect(() => {\n if (!open) return\n window.dispatchEvent(new CustomEvent(PANEL_OPEN_EVENT, { detail: name }))\n }, [open, name])\n // \u542C\u522B\u4EBA\u7684\u5E7F\u64AD + \u4FA7\u680F\u4F1A\u8BDD\u533A\u70B9\u51FB\u3002\n useEffect(() => {\n if (!open) return undefined\n const onSiblingOpen = (event: Event): void => {\n if ((event as CustomEvent<TriadPanelName>).detail !== name) requestClose()\n }\n const onDocClick = (event: globalThis.MouseEvent): void => {\n const target = event.target\n if (!(target instanceof Element)) return\n // \u81EA\u5DF1\u5BFC\u822A\u884C\u3001\u9762\u677F\u672C\u4F53\uFF08\u542B\u9762\u677F\u5185\u5F39\u5230 body \u7684\u4E8C\u7EA7\u5F39\u7A97\uFF09\u4E0D\u6536\u3002\n if (target.closest(`#${HOST_ID}, .psh-card`) !== null) return\n if (clickInSidebar(target)) requestClose()\n }\n window.addEventListener(PANEL_OPEN_EVENT, onSiblingOpen)\n document.addEventListener('click', onDocClick, true)\n return () => {\n window.removeEventListener(PANEL_OPEN_EVENT, onSiblingOpen)\n document.removeEventListener('click', onDocClick, true)\n }\n }, [open, name, requestClose])\n}\n\n/** \u300C\u5BFC\u822A\u884C\u53F3\u7F18\u300D\u6ED1\u51FA\u951A\u70B9\uFF08\u517C\u5BB9\u4FDD\u7559\uFF1A\u53F3\u4FA7\u62BD\u5C49\u4E0D\u518D\u8DDF\u968F\u6309\u94AE\u5B9A\u4F4D\uFF09\u3002\n *\n * \u53D6\u6309\u94AE\u6240\u5728\u884C\u5BB9\u5668\uFF08dsh-prompt-customizer \u7684 nav host\uFF09\u7684\u53F3\u7F18 +8 \u4F5C\u6C34\u5E73\u4F4D\uFF1Btop \u53D6\u6309\u94AE\n * \u9876\u7F18 -6\u3002nav host \u662F\u7EDF\u4E00\u7684\u884C\u5BB9\u5668\uFF0C\u4E09\u4E2A\u5165\u53E3\u5171\u7528\u3002 */\nexport function navAnchorFrom(el: Element | null): PopoverAnchor | null {\n if (el === null) return null\n const row = el.closest(`#${HOST_ID}`)\n if (row === null) return null\n const rowRect = row.getBoundingClientRect()\n const btnRect = el.getBoundingClientRect()\n return { left: Math.round(rowRect.right + 8), top: Math.round(btnRect.top - 6) }\n}\n"],
|
|
5
|
+
"mappings": "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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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",
|
|
6
|
+
"names": ["apply", "import_react", "import_react", "import_dsh_client_ui_primitives", "import_react", "STYLE_ID", "SHEET", "import_react", "STYLE_ID", "SHEET", "current", "current", "entryOf", "inject", "import_react", "import_react", "rows", "inject", "phase", "entryOfPayload", "h", "import_react", "apply", "h", "import_react", "h", "import_react", "import_react", "h", "h", "error", "phase", "current", "h", "view", "import_jsx_runtime", "mapped", "import_react_dom", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "s", "import_react", "import_dsh_client_ui_primitives", "current", "import_jsx_runtime", "payload", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_react_dom", "import_dsh_client_ui_primitives", "import_jsx_runtime", "STYLE_ID", "SHEET", "import_react", "current", "import_jsx_runtime", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_dsh_client_ui_primitives", "s", "import_jsx_runtime", "import_dsh_client_ui_primitives", "import_jsx_runtime", "current", "s", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "current", "s", "level", "import_react", "import_react", "import_react_dom", "import_jsx_runtime", "STYLE_ID", "SHEET", "import_jsx_runtime", "apply"]
|
|
7
7
|
}
|