@double-coding/dsh-connectors 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +173 -0
- package/LICENSE +21 -0
- package/README.en.md +156 -0
- package/README.md +153 -2
- package/assets/readme/architecture.webp +0 -0
- package/assets/readme/hero-en.svg +62 -0
- package/assets/readme/hero.svg +62 -0
- package/assets/readme/panel.webp +0 -0
- package/cordis.patch.yml +8 -0
- package/dist/client.js +5385 -0
- package/dist/client.js.map +7 -0
- package/dist/host/catalog.d.ts +7 -0
- package/dist/host/catalog.js +15 -0
- package/dist/host/catalog.js.map +1 -0
- package/dist/host/cli/adapters.d.ts +69 -0
- package/dist/host/cli/adapters.js +577 -0
- package/dist/host/cli/adapters.js.map +1 -0
- package/dist/host/cli/exec.d.ts +34 -0
- package/dist/host/cli/exec.js +186 -0
- package/dist/host/cli/exec.js.map +1 -0
- package/dist/host/cli/service.d.ts +44 -0
- package/dist/host/cli/service.js +711 -0
- package/dist/host/cli/service.js.map +1 -0
- package/dist/host/cli/version.d.ts +1 -0
- package/dist/host/cli/version.js +16 -0
- package/dist/host/cli/version.js.map +1 -0
- package/dist/host/connections.d.ts +106 -0
- package/dist/host/connections.js +1207 -0
- package/dist/host/connections.js.map +1 -0
- package/dist/host/errors.d.ts +4 -0
- package/dist/host/errors.js +8 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/instanceUrl.d.ts +1 -0
- package/dist/host/instanceUrl.js +27 -0
- package/dist/host/instanceUrl.js.map +1 -0
- package/dist/host/mcpServers.d.ts +19 -0
- package/dist/host/mcpServers.js +243 -0
- package/dist/host/mcpServers.js.map +1 -0
- package/dist/host/oauth.d.ts +49 -0
- package/dist/host/oauth.js +215 -0
- package/dist/host/oauth.js.map +1 -0
- package/dist/host/openExternal.d.ts +1 -0
- package/dist/host/openExternal.js +45 -0
- package/dist/host/openExternal.js.map +1 -0
- package/dist/host/providers.d.ts +105 -0
- package/dist/host/providers.js +199 -0
- package/dist/host/providers.js.map +1 -0
- package/dist/host/routes.d.ts +18 -0
- package/dist/host/routes.js +514 -0
- package/dist/host/routes.js.map +1 -0
- package/dist/host/sse-bridge.d.ts +1 -0
- package/dist/host/sse-bridge.js +168 -0
- package/dist/host/sse-bridge.js.map +1 -0
- package/dist/host/store.d.ts +184 -0
- package/dist/host/store.js +98 -0
- package/dist/host/store.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/categories.d.ts +12 -0
- package/dist/shared/categories.js +59 -0
- package/dist/shared/categories.js.map +1 -0
- package/dist/shared/customConfig.d.ts +1 -0
- package/dist/shared/customConfig.js +2 -0
- package/dist/shared/customConfig.js.map +1 -0
- package/dist/shared/types.d.ts +222 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +96 -4
- package/providers/README.md +44 -0
- package/providers/amap/icon.png +0 -0
- package/providers/amap/provider.json +34 -0
- package/providers/baidu-netdisk/icon.png +0 -0
- package/providers/baidu-netdisk/provider.json +36 -0
- package/providers/circleci/icon.svg +1 -0
- package/providers/circleci/provider.json +29 -0
- package/providers/cloudflare-docs/icon.svg +1 -0
- package/providers/cloudflare-docs/provider.json +26 -0
- package/providers/context7/icon.png +0 -0
- package/providers/context7/provider.json +25 -0
- package/providers/deepwiki/icon.svg +5 -0
- package/providers/deepwiki/provider.json +26 -0
- package/providers/firecrawl/icon.png +0 -0
- package/providers/firecrawl/provider.json +40 -0
- package/providers/gitee/icon.svg +1 -0
- package/providers/gitee/provider.json +32 -0
- package/providers/github/icon.svg +1 -0
- package/providers/github/provider.json +33 -0
- package/providers/gitlab/icon.svg +1 -0
- package/providers/gitlab/provider.json +31 -0
- package/providers/gitlab-self-hosted/icon.svg +1 -0
- package/providers/gitlab-self-hosted/provider.json +39 -0
- package/providers/grafana/icon.svg +1 -0
- package/providers/grafana/provider.json +32 -0
- package/providers/linear/icon.svg +1 -0
- package/providers/linear/provider.json +41 -0
- package/providers/microsoft-learn/icon.svg +6 -0
- package/providers/microsoft-learn/provider.json +26 -0
- package/providers/neon/icon.svg +1 -0
- package/providers/neon/provider.json +41 -0
- package/providers/notion/icon.svg +1 -0
- package/providers/notion/provider.json +29 -0
- package/providers/posthog/icon.svg +1 -0
- package/providers/posthog/provider.json +38 -0
- package/providers/postman/icon.svg +1 -0
- package/providers/postman/provider.json +29 -0
- package/providers/qcc/icon.png +0 -0
- package/providers/qcc/provider.json +50 -0
- package/providers/sentry/icon.svg +1 -0
- package/providers/sentry/provider.json +30 -0
- package/providers/sourcegraph/icon.png +0 -0
- package/providers/sourcegraph/provider.json +32 -0
- package/providers/supabase/icon.svg +1 -0
- package/providers/supabase/provider.json +52 -0
- package/providers/tavily/icon.svg +4 -0
- package/providers/tavily/provider.json +41 -0
- package/providers/tencent-docs/icon.png +0 -0
- package/providers/tencent-docs/provider.json +34 -0
- package/providers/tencent-yuanbao-search/icon.png +0 -0
- package/providers/tencent-yuanbao-search/provider.json +32 -0
- package/providers/tianyancha/icon.png +0 -0
- package/providers/tianyancha/provider.json +34 -0
- package/providers/yunxiao/icon.svg +1 -0
- package/providers/yunxiao/provider.json +30 -0
- package/schema/provider.schema.json +325 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client/index.tsx", "../src/shared/types.ts", "../src/client/cli-icons.generated.ts", "../src/client/icons.tsx", "../src/client/provider-icons.generated.ts", "../src/shared/categories.ts", "../src/shared/customConfig.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Context } from '@deepseek-ai/cordis'\nimport type * as MonacoApi from 'monaco-editor'\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { CatalogPayload, CliConnectorPayload, CliConnectorView, CliListPayload, CliLogPayload, ConnectionView, ConnectorCard, ConnectionsPayload, CustomConfigPayload, CustomConfigView, CustomConnectorsPayload, CustomUpdatePayload, OAuthStartPayload, OAuthStatusPayload, ToolInfo } from '../shared/types.js'\nimport { ROUTE_PREFIX } from '../shared/types.js'\nimport { CLI_ICONS } from './cli-icons.generated.js'\nimport { IconAlert, IconCheck, IconChevronDown, IconClose, IconCopy, IconEye, IconEyeOff, IconHelp, IconLink, IconMore, IconPencil, IconPlay, IconPlug, IconPlus, IconRefresh, IconSearch, IconServer, IconTrash } from './icons.js'\nimport { PROVIDER_ICONS } from './provider-icons.generated.js'\nimport { BUILTIN_CATEGORIES, canonicalizeCardCategories, parseExampleLines } from '../shared/categories.js'\nimport { CUSTOM_SECRET_PLACEHOLDER } from '../shared/customConfig.js'\n\nexport const inject: string[] = []\n\nconst PANEL_ID = 'dsh-connectors'\nconst STYLE_ID = 'dsh-connectors-style'\nconst PROBE_ROUNDS = 6\nconst PROBE_INTERVAL_MS = 350\nconst MCP_SERVERS_PLACEHOLDER = `{\n \"mcpServers\": {\n \"my-server\": {\n \"url\": \"https://example.com/mcp\",\n \"headers\": { \"Authorization\": \"Bearer ...\" },\n \"x-dsh\": {\n \"description\": \"\u67E5\u8BE2\u4ED3\u5E93\u7ED3\u6784\u4E0E\u6587\u6863\",\n \"category\": \"\u77E5\u8BC6\u68C0\u7D22\",\n \"examples\": [\"\u7528 my-server \u67E5\u4E00\u4E0B\u6700\u65B0\u6587\u6863\"]\n }\n }\n }\n}`\ninterface SlotsFace {\n inject: (name: string, callback: () => unknown) => unknown\n register: (spec: Record<string, unknown>, component: unknown) => () => void\n}\n\ninterface WorkspaceFace {\n startSession: (workspaceId: string | undefined, options?: { prompt?: string; clearPreviousDraft?: boolean }) => void\n}\n\nexport function apply(ctx: Context): () => void {\n installStyles()\n const get = (ctx as Context & { get?: (name: string) => unknown }).get?.bind(ctx)\n let disposed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n\n const startTrial = (prompt: string): void => {\n const workspace = get?.('uiWorkspace') as WorkspaceFace | undefined\n if (workspace === undefined || typeof workspace.startSession !== 'function') {\n throw new Error('\u5F53\u524D DSH \u7248\u672C\u4E0D\u652F\u6301\u4ECE\u8FDE\u63A5\u5668\u6253\u5F00\u4F1A\u8BDD')\n }\n workspace.startSession(undefined, { prompt, clearPreviousDraft: true })\n }\n\n const mount = (round: number): void => {\n if (disposed) return\n const slots = get?.('slots') as SlotsFace | undefined\n if (slots === undefined) {\n if (round < PROBE_ROUNDS) {\n timer = setTimeout(() => mount(round + 1), PROBE_INTERVAL_MS)\n } else {\n console.warn('[dsh-connectors] slots service unavailable; panel not mounted')\n }\n return\n }\n try {\n slots.inject('main', () => slots.register({ name: 'main', key: PANEL_ID }, () => <Panel startTrial={startTrial} />))\n slots.inject('sidebar.panellist', () =>\n slots.register({ name: 'sidebar.panellist', id: PANEL_ID, order: 20, label: () => '\u8FDE\u63A5\u5668' }, PanelIcon))\n console.info('[dsh-connectors] panel registered')\n } catch (error) {\n console.error('[dsh-connectors] panel registration failed', error)\n }\n\n try {\n slots.inject('conversation.input.left', () =>\n slots.register({ name: 'conversation.input.left', id: `${PANEL_ID}-dock`, order: 20, label: '\u8FDE\u63A5\u5668' }, ConnectorDock))\n } catch (error) {\n console.warn('[dsh-connectors] composer dock slot unavailable', error)\n }\n\n try {\n slots.inject('conversation.input.overlay', () =>\n slots.register({ name: 'conversation.input.overlay', id: `${PANEL_ID}-popover`, order: 20, label: '\u8FDE\u63A5\u5668' }, ConnectorPopover))\n } catch (error) {\n console.warn('[dsh-connectors] composer overlay slot unavailable', error)\n }\n\n try {\n slots.inject('shell.overlay', () =>\n slots.register({ name: 'shell.overlay', id: `${PANEL_ID}-flow`, order: 20, label: '\u8FDE\u63A5\u5668\u5F39\u7A97' }, () => <Panel startTrial={startTrial} variant=\"overlay\" />))\n } catch (error) {\n console.warn('[dsh-connectors] shell overlay slot unavailable', error)\n }\n }\n\n mount(0)\n\n return () => {\n disposed = true\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\nfunction PanelIcon(): JSX.Element {\n return <IconPlug size={16} />\n}\n\ninterface ConnectResponse {\n ok: boolean\n value?: { connection: ConnectionView }\n error?: { code: string; message: string }\n}\n\nclass ApiError extends Error {\n constructor(\n readonly code: string,\n message: string,\n ) {\n super(message)\n }\n}\n\nasync function request<T>(url: string, init?: RequestInit): Promise<T> {\n const response = await fetch(url, {\n ...init,\n headers: init?.body === undefined ? undefined : { 'content-type': 'application/json' },\n })\n const body = await response.json() as T & { ok?: boolean; error?: { code?: string; message?: string } }\n if (!response.ok || body.ok === false) {\n throw new ApiError(body.error?.code ?? 'request_failed', body.error?.message ?? `HTTP ${response.status}`)\n }\n return body\n}\n\nconst MIN_INSTALL_FEEDBACK_MS = 500\n\nfunction withInstallFeedback<T>(task: Promise<T>): Promise<T> {\n return Promise.all([task, new Promise<void>(resolve => { setTimeout(resolve, MIN_INSTALL_FEEDBACK_MS) })])\n .then(([value]) => value)\n}\n\nasync function writeClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText !== undefined) {\n try {\n await navigator.clipboard.writeText(text)\n return\n } catch {\n // \u9875\u9762\u672A\u805A\u7126\u6216\u6743\u9650\u53D7\u9650\u65F6\u7EE7\u7EED\u8D70 execCommand\n }\n }\n const area = document.createElement('textarea')\n area.value = text\n area.setAttribute('readonly', '')\n area.style.position = 'fixed'\n area.style.opacity = '0'\n document.body.appendChild(area)\n area.select()\n let copied = false\n try {\n copied = document.execCommand('copy')\n } finally {\n area.remove()\n }\n if (!copied) throw new Error('copy failed')\n}\n\ninterface PanelProps {\n startTrial: (prompt: string) => void\n variant?: 'panel' | 'overlay'\n}\n\nfunction promptForExample(card: ConnectorCard, example: string): string {\n return example.toLowerCase().includes(card.name.toLowerCase()) ? example : `\u4F7F\u7528 ${card.name}\uFF1A${example}`\n}\n\nfunction promptForNextExample(card: ConnectorCard): string {\n const examples = card.examples ?? []\n if (examples.length === 0) return `\u4F7F\u7528 ${card.name} \u7684\u5DE5\u5177\u5B8C\u6210\u4E00\u4E2A\u7B80\u5355\u4EFB\u52A1\uFF0C\u5148\u5217\u51FA\u53EF\u7528\u5DE5\u5177\u3002`\n const key = `dsh-connectors:trial-index:${card.id}`\n let index = 0\n try {\n const stored = Number.parseInt(window.localStorage.getItem(key) ?? '', 10)\n if (Number.isFinite(stored) && stored >= 0) index = stored\n } catch {\n index = 0\n }\n const example = examples[index % examples.length]!\n try {\n window.localStorage.setItem(key, String((index + 1) % examples.length))\n } catch {\n // \u5B58\u50A8\u4E0D\u53EF\u7528\u65F6\u672C\u6B21\u4ECD\u4F7F\u7528\u5F53\u524D\u5E8F\u53F7\n }\n return promptForExample(card, example)\n}\n\nfunction shortToolName(name: string, serverName?: string): string {\n if (serverName === undefined) return name\n const prefix = `mcp__${serverName}__`\n return name.startsWith(prefix) ? name.slice(prefix.length) : name\n}\n\nconst OAUTH_TIMEOUT_MS = 90 * 1000\nconst OAUTH_POLL_MS = 1200\n\nfunction isOAuthCard(card: ConnectorCard): boolean {\n return card.auth.type === 'oauth2'\n}\n\nfunction isTokenCard(card: ConnectorCard): boolean {\n return card.auth.type === 'bearer' || card.auth.type === 'header'\n}\n\nfunction tokenLabel(card: ConnectorCard): string {\n const auth = card.auth\n return auth.type === 'bearer' || auth.type === 'header' ? auth.label : '\u8BBF\u95EE\u4EE4\u724C'\n}\n\nfunction instanceNoun(card: ConnectorCard): string {\n return card.instance?.noun ?? '\u5730\u5740'\n}\n\nfunction tokenHelp(card: ConnectorCard): { url: string; label: string; hint?: string } | undefined {\n const auth = card.auth\n return auth.type === 'bearer' || auth.type === 'header' ? auth.help : undefined\n}\n\nfunction Spinner({ inline = false }: { inline?: boolean }): JSX.Element {\n return (\n <svg\n className={inline ? 'dshc-spinner dshc-spinner-inline' : 'dshc-spinner'}\n viewBox=\"0 0 16 16\"\n aria-hidden\n >\n <circle cx=\"8\" cy=\"8\" r=\"6\" fill=\"none\" stroke=\"currentColor\" strokeOpacity=\".18\" strokeWidth=\"1.75\" />\n <path d=\"M8 2a6 6 0 0 1 6 6\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nfunction ToolRow({ name, description }: { name: string; description?: string }): JSX.Element {\n const [expanded, setExpanded] = useState(false)\n const [overflow, setOverflow] = useState(false)\n const descRef = useRef<HTMLParagraphElement>(null)\n\n useLayoutEffect(() => {\n const element = descRef.current\n if (element === null || description === undefined) {\n setOverflow(false)\n return\n }\n if (expanded) return\n const measure = (): void => {\n setOverflow(element.scrollHeight > element.clientHeight + 1)\n }\n measure()\n const frame = window.requestAnimationFrame(measure)\n return () => window.cancelAnimationFrame(frame)\n }, [description, expanded])\n\n return (\n <div className=\"dshc-tool\">\n <div className=\"dshc-tool-head\">\n <code>{name}</code>\n {overflow && (\n <button\n type=\"button\"\n className=\"dshc-tool-expand\"\n aria-label={expanded ? '\u6536\u8D77\u63CF\u8FF0' : '\u5C55\u5F00\u63CF\u8FF0'}\n aria-expanded={expanded}\n title={expanded ? '\u6536\u8D77\u63CF\u8FF0' : '\u5C55\u5F00\u63CF\u8FF0'}\n onClick={() => setExpanded(current => !current)}\n >\n <IconChevronDown\n size={14}\n className={expanded ? 'dshc-tool-chevron dshc-tool-chevron-expanded' : 'dshc-tool-chevron'}\n />\n </button>\n )}\n </div>\n {description !== undefined && (\n <p ref={descRef} className={expanded ? 'dshc-tool-desc-expanded' : undefined}>{description}</p>\n )}\n </div>\n )\n}\n\ntype Monaco = typeof MonacoApi\ntype MonacoEditorInstance = MonacoApi.editor.IStandaloneCodeEditor\ntype MonacoDisposable = MonacoApi.IDisposable\n\ninterface MonacoAmdRequire {\n (deps: string[], callback: () => void): void\n config(options: { paths: Record<string, string> }): void\n}\n\ndeclare global {\n interface Window {\n monaco?: Monaco\n require?: MonacoAmdRequire\n }\n}\n\nlet monacoPromise: Promise<Monaco> | null = null\n\nfunction loadMonaco(): Promise<Monaco> {\n if (window.monaco !== undefined) return Promise.resolve(window.monaco)\n if (monacoPromise !== null) return monacoPromise\n\n const load = new Promise<Monaco>((resolve, reject) => {\n const start = (): void => {\n const amd = window.require\n if (amd === undefined) {\n reject(new Error('Monaco AMD loader unavailable'))\n return\n }\n try {\n amd.config({ paths: { vs: `${ROUTE_PREFIX}/api/monaco/vs` } })\n amd(['vs/editor/editor.main'], () => {\n if (window.monaco !== undefined) resolve(window.monaco)\n else reject(new Error('Monaco editor unavailable'))\n })\n } catch (error) {\n reject(error)\n }\n }\n\n if (window.require !== undefined) {\n start()\n return\n }\n const script = document.createElement('script')\n script.src = `${ROUTE_PREFIX}/api/monaco/vs/loader.js`\n script.async = true\n script.onload = start\n script.onerror = () => reject(new Error('Monaco loader failed to load'))\n document.head.appendChild(script)\n })\n\n monacoPromise = Promise.race([\n load,\n new Promise<Monaco>((_, reject) => {\n window.setTimeout(() => reject(new Error('Monaco editor load timeout')), 15_000)\n }),\n ])\n monacoPromise.catch(() => {\n monacoPromise = null\n })\n return monacoPromise\n}\n\nfunction JsonEditor({ value, onChange }: { value: string; onChange: (value: string) => void }): JSX.Element {\n const mountRef = useRef<HTMLDivElement>(null)\n const editorRef = useRef<MonacoEditorInstance | null>(null)\n const subscriptionRef = useRef<MonacoDisposable | null>(null)\n const onChangeRef = useRef(onChange)\n const valueRef = useRef(value)\n const [ready, setReady] = useState(false)\n const [failed, setFailed] = useState(false)\n onChangeRef.current = onChange\n valueRef.current = value\n\n useEffect(() => {\n let active = true\n void loadMonaco().then(monaco => {\n if (!active || mountRef.current === null) return\n const editor = monaco.editor.create(mountRef.current, {\n value: valueRef.current,\n language: 'json',\n theme: 'vs',\n ariaLabel: 'mcpServers JSON',\n automaticLayout: true,\n minimap: { enabled: false },\n lineNumbers: 'on',\n lineNumbersMinChars: 3,\n folding: true,\n glyphMargin: false,\n lineDecorationsWidth: 10,\n scrollBeyondLastLine: false,\n wordWrap: 'off',\n tabSize: 2,\n insertSpaces: true,\n detectIndentation: false,\n fontSize: 12,\n lineHeight: 18,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n padding: { top: 10, bottom: 10 },\n renderLineHighlight: 'line',\n overviewRulerLanes: 0,\n hideCursorInOverviewRuler: true,\n overviewRulerBorder: false,\n contextmenu: false,\n quickSuggestions: false,\n suggestOnTriggerCharacters: false,\n fixedOverflowWidgets: true,\n renderValidationDecorations: 'on',\n bracketPairColorization: { enabled: true },\n scrollbar: { verticalScrollbarSize: 8, horizontalScrollbarSize: 8, useShadows: false },\n })\n editorRef.current = editor\n subscriptionRef.current = editor.onDidChangeModelContent(() => {\n onChangeRef.current(editor.getValue())\n })\n setReady(true)\n editor.focus()\n }).catch(() => {\n if (active) setFailed(true)\n })\n\n return () => {\n active = false\n subscriptionRef.current?.dispose()\n subscriptionRef.current = null\n editorRef.current?.dispose()\n editorRef.current = null\n }\n }, [])\n\n useEffect(() => {\n const editor = editorRef.current\n if (editor !== null && editor.getValue() !== value) editor.setValue(value)\n }, [value])\n\n return (\n <div className=\"dshc-json-editor\">\n <div ref={mountRef} className=\"dshc-json-editor-mount\" />\n {!ready && (\n <textarea\n autoFocus\n className=\"dshc-json-editor-fallback\"\n aria-label=\"mcpServers JSON\"\n spellCheck={false}\n value={value}\n onChange={event => onChange(event.target.value)}\n />\n )}\n {!ready && !failed && (\n <div className=\"dshc-json-editor-loading\">\n <Spinner inline />\n \u6B63\u5728\u52A0\u8F7D\u7F16\u8F91\u5668\u2026\n </div>\n )}\n </div>\n )\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new ApiError('oauth_cancelled', '\u5DF2\u53D6\u6D88\u6388\u6743'))\n return\n }\n const onAbort = (): void => {\n clearTimeout(timer)\n reject(new ApiError('oauth_cancelled', '\u5DF2\u53D6\u6D88\u6388\u6743'))\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\ninterface OAuthFlowInfo {\n flowId: string\n authorizeUrl: string\n opened: boolean\n}\n\nfunction oauthRedirectUri(card: ConnectorCard): string {\n const url = new URL(`${window.location.origin}${ROUTE_PREFIX}/api/oauth/callback`)\n // \u767E\u5EA6\u7B49\u5382\u5546\u8981\u6C42\u56DE\u8C03\u4F7F\u7528\u57DF\u540D\uFF0C\u4E0D\u63A5\u53D7 IP\uFF1B\u672C\u673A\u8BBF\u95EE\u65F6\u6539\u7528 localhost\n const needsDomain = card.auth.type === 'oauth2' && card.auth.registration === 'user'\n if (needsDomain && (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(url.hostname) || url.hostname === '[::1]')) {\n url.hostname = 'localhost'\n }\n return url.toString()\n}\n\nasync function authorizeConnector(\n card: ConnectorCard,\n options: { signal?: AbortSignal; onFlow?: (flow: OAuthFlowInfo) => void } = {},\n): Promise<ConnectionView> {\n const redirectUri = oauthRedirectUri(card)\n let response: OAuthStartPayload\n try {\n response = await request<OAuthStartPayload>(`${ROUTE_PREFIX}/api/oauth/start`, {\n method: 'POST',\n body: JSON.stringify({ connectorId: card.id, redirectUri }),\n signal: options.signal,\n })\n } catch (cause) {\n if (options.signal?.aborted) throw new ApiError('oauth_cancelled', '\u5DF2\u53D6\u6D88\u6388\u6743')\n throw cause\n }\n const { flowId, authorizeUrl, opened } = response.value\n options.onFlow?.({ flowId, authorizeUrl, opened })\n if (options.signal?.aborted) throw new ApiError('oauth_cancelled', '\u5DF2\u53D6\u6D88\u6388\u6743')\n\n const deadline = Date.now() + OAUTH_TIMEOUT_MS\n for (;;) {\n await sleep(OAUTH_POLL_MS, options.signal)\n let status: OAuthStatusPayload['value'] | undefined\n try {\n const payload = await request<OAuthStatusPayload>(\n `${ROUTE_PREFIX}/api/oauth/status?flowId=${encodeURIComponent(flowId)}`,\n { signal: options.signal },\n )\n status = payload.value\n } catch {\n if (options.signal?.aborted) throw new ApiError('oauth_cancelled', '\u5DF2\u53D6\u6D88\u6388\u6743')\n }\n if (status?.status === 'done') {\n let connection: ConnectionView | undefined\n let fetched = false\n try {\n const list = await request<ConnectionsPayload>(`${ROUTE_PREFIX}/api/connections`, {\n signal: options.signal,\n })\n connection = list.value.connections.find(item => item.connectorId === card.id)\n fetched = true\n } catch {\n if (options.signal?.aborted) throw new ApiError('oauth_cancelled', '\u5DF2\u53D6\u6D88\u6388\u6743')\n }\n if (fetched) {\n if (connection === undefined) {\n throw new ApiError('oauth_failed', '\u6388\u6743\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u627E\u5230\u8FDE\u63A5\u8BB0\u5F55\uFF0C\u8BF7\u5237\u65B0\u9762\u677F\u91CD\u8BD5')\n }\n return connection\n }\n }\n if (status?.status === 'error') {\n throw new ApiError('oauth_failed', status.message ?? '\u6388\u6743\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5')\n }\n if (status?.status === 'expired') {\n throw new ApiError('oauth_expired', '\u6388\u6743\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u8BD5')\n }\n if (Date.now() >= deadline) {\n await request(`${ROUTE_PREFIX}/api/oauth/cancel`, {\n method: 'POST',\n body: JSON.stringify({ flowId }),\n }).catch(() => undefined)\n throw new ApiError('oauth_timeout', '\u6388\u6743\u8D85\u65F6\uFF0C\u8BF7\u91CD\u8BD5')\n }\n }\n}\n\nasync function saveOAuthClient(card: ConnectorCard, clientId: string, clientSecret: string): Promise<ConnectionView> {\n const response = await request<ConnectResponse>(`${ROUTE_PREFIX}/api/connections/${encodeURIComponent(card.id)}/oauth-client`, {\n method: 'POST',\n body: JSON.stringify({ clientId, clientSecret }),\n })\n const connection = response.value?.connection\n if (connection === undefined) throw new ApiError('invalid_response', '\u4FDD\u5B58\u5E94\u7528\u51ED\u636E\u5931\u8D25\uFF1A\u5BBF\u4E3B\u6CA1\u6709\u8FD4\u56DE\u8FDE\u63A5')\n return connection\n}\n\ninterface DockSnapshot {\n open: boolean\n cards: ConnectorCard[]\n connections: Record<string, ConnectionView>\n cli: CliConnectorView[]\n loaded: boolean\n loading: boolean\n error: string | null\n query: string\n pendingId: string | null\n cliPendingId: string | null\n}\n\nconst initialDockSnapshot: DockSnapshot = {\n open: false,\n cards: [],\n connections: {},\n cli: [],\n loaded: false,\n loading: false,\n error: null,\n query: '',\n pendingId: null,\n cliPendingId: null,\n}\n\nlet dockSnapshot = initialDockSnapshot\nconst dockListeners = new Set<() => void>()\nlet dockRequest: Promise<void> | null = null\nlet dockDirty = false\n\nfunction updateDock(patch: Partial<DockSnapshot>): void {\n dockSnapshot = { ...dockSnapshot, ...patch }\n for (const listener of dockListeners) listener()\n}\n\nfunction subscribeDock(listener: () => void): () => void {\n dockListeners.add(listener)\n return () => {\n dockListeners.delete(listener)\n }\n}\n\nfunction useDock(): DockSnapshot {\n return useSyncExternalStore(subscribeDock, () => dockSnapshot)\n}\n\nfunction refreshDock(): Promise<void> {\n if (dockRequest !== null) {\n dockDirty = true\n return dockRequest\n }\n updateDock({ loading: true, error: null })\n const task = (async () => {\n try {\n const [catalog, list, cli] = await Promise.all([\n request<CatalogPayload>(`${ROUTE_PREFIX}/api/catalog`),\n request<ConnectionsPayload>(`${ROUTE_PREFIX}/api/connections`),\n request<CliListPayload>(`${ROUTE_PREFIX}/api/cli`).catch(() => null),\n ])\n updateDock({\n cards: catalog.value.cards,\n connections: Object.fromEntries(list.value.connections.map(item => [item.connectorId, item])),\n cli: cli?.value.connectors ?? [],\n loaded: true,\n loading: false,\n })\n } catch (cause) {\n updateDock({ error: cause instanceof Error ? cause.message : String(cause), loading: false })\n }\n })()\n dockRequest = task\n void task.finally(() => {\n dockRequest = null\n if (dockDirty) {\n dockDirty = false\n void refreshDock()\n }\n })\n return task\n}\n\nfunction notifyConnectionsChanged(): void {\n window.dispatchEvent(new CustomEvent('dshc:connections-changed'))\n}\n\nfunction closeDock(): void {\n if (!dockSnapshot.open && dockSnapshot.pendingId === null) return\n updateDock({ open: false, query: '', error: null, pendingId: null, cliPendingId: null })\n}\n\nfunction toggleDock(): void {\n if (dockSnapshot.open) closeDock()\n else updateDock({ open: true, error: null })\n}\n\nlet flowRequest: string | null = null\nlet cliFlowRequest: { id: string; action: 'install' | 'login' } | null = null\n\nfunction requestCliFlow(id: string, action: 'install' | 'login'): void {\n cliFlowRequest = { id, action }\n window.dispatchEvent(new Event('dshc:cli-flow-request'))\n}\n\nfunction announceCliFlowOpened(id: string): void {\n window.dispatchEvent(new CustomEvent('dshc:cli-flow-opened', { detail: { id } }))\n}\n\nfunction requestConnectorFlow(cardId: string): void {\n flowRequest = cardId\n window.dispatchEvent(new Event('dshc:flow-request'))\n}\n\nfunction announceConnectorFlow(cardId: string): void {\n window.dispatchEvent(new CustomEvent('dshc:flow-opened', { detail: { cardId } }))\n}\n\nfunction announceConnectorFlowStarted(cardId: string): void {\n window.dispatchEvent(new CustomEvent('dshc:flow-started', { detail: { cardId } }))\n}\n\nfunction announceConnectorFlowFinished(cardId: string): void {\n window.dispatchEvent(new CustomEvent('dshc:flow-finished', { detail: { cardId } }))\n}\n\nfunction requestConnectorFlowCancel(cardId: string): void {\n window.dispatchEvent(new CustomEvent('dshc:flow-cancel', { detail: { cardId } }))\n}\n\nfunction announceConnectorFlowError(cardId: string, message: string): void {\n window.dispatchEvent(new CustomEvent('dshc:flow-error', { detail: { cardId, message } }))\n}\n\nfunction dockCardRank(card: ConnectorCard, connections: DockSnapshot['connections']): number {\n const connection = connections[card.id]\n if (connection === undefined) return 3\n if (!connection.authorized) return 2\n return connection.enabled ? 0 : 1\n}\n\nfunction cliDockRank(connector: CliConnectorView): number {\n if (!connector.installed) return 3\n if (!connector.authenticated) return 2\n return connector.enabled !== false ? 0 : 1\n}\n\nfunction compareDockCards(\n left: ConnectorCard,\n right: ConnectorCard,\n connections: DockSnapshot['connections'],\n): number {\n return dockCardRank(left, connections) - dockCardRank(right, connections)\n || left.name.localeCompare(right.name, 'zh-CN')\n || left.id.localeCompare(right.id)\n}\n\nfunction enabledDockCards(state: DockSnapshot): ConnectorCard[] {\n return state.cards\n .filter(card => {\n const connection = state.connections[card.id]\n return connection !== undefined && connection.enabled && connection.authorized\n })\n .sort((left, right) => compareDockCards(left, right, state.connections))\n}\n\nfunction enabledDockCli(state: DockSnapshot): CliConnectorView[] {\n return state.cli\n .filter(connector => connector.installed && connector.authenticated && connector.enabled !== false)\n .sort((left, right) => left.name.localeCompare(right.name, 'zh-CN'))\n}\n\nfunction dockActionLabel(card: ConnectorCard, connection?: ConnectionView): string {\n if (connection === undefined) return '\u5B89\u88C5'\n if (card.instance !== undefined && connection.instanceReady !== true) return '\u914D\u7F6E'\n return '\u6388\u6743'\n}\n\nfunction openConnectorPanel(): void {\n closeDock()\n if (document.querySelector('.dshc-root:not(.dshc-flow-root)') !== null) return\n const button = Array.from(document.querySelectorAll('button')).find(item => item.getAttribute('aria-label') === '\u8FDE\u63A5\u5668')\n if (button === undefined) return\n const rect = button.getBoundingClientRect()\n const options: MouseEventInit = {\n bubbles: true,\n cancelable: true,\n clientX: rect.left + rect.width / 2,\n clientY: rect.top + rect.height / 2,\n button: 0,\n }\n for (const type of ['pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click']) {\n const EventType = type.startsWith('pointer') ? PointerEvent : MouseEvent\n button.dispatchEvent(new EventType(type, options))\n }\n}\n\nasync function toggleDockConnection(card: ConnectorCard, enabled: boolean): Promise<void> {\n updateDock({ pendingId: card.id })\n try {\n await request(`${ROUTE_PREFIX}/api/connections/${encodeURIComponent(card.id)}`, {\n method: 'PATCH',\n body: JSON.stringify({ enabled }),\n })\n } catch {\n // \u5931\u8D25\u539F\u56E0\u5199\u5165\u8FDE\u63A5\u8BB0\u5F55\uFF0CrefreshDock \u540E\u7531\u884C\u5185\u72B6\u6001\u5C55\u793A\n } finally {\n await refreshDock()\n updateDock({ pendingId: null })\n }\n}\n\nasync function toggleDockCli(connector: CliConnectorView, enabled: boolean): Promise<void> {\n updateDock({ cliPendingId: connector.id })\n try {\n await request(`${ROUTE_PREFIX}/api/cli/${encodeURIComponent(connector.id)}`, {\n method: 'PATCH',\n body: JSON.stringify({ enabled }),\n })\n } catch {\n // \u5931\u8D25\u4FDD\u7559\u539F\u72B6\u6001\uFF0C\u5237\u65B0\u540E\u7531 API \u72B6\u6001\u515C\u5E95\n } finally {\n await refreshDock()\n updateDock({ cliPendingId: null })\n }\n}\n\nasync function cancelDockCli(connector: CliConnectorView): Promise<void> {\n updateDock({ cliPendingId: connector.id })\n try {\n await request(`${ROUTE_PREFIX}/api/cli/${encodeURIComponent(connector.id)}/cancel`, { method: 'POST' })\n } catch {\n // \u53D6\u6D88\u5931\u8D25\u7531\u5237\u65B0\u540E\u7684\u9636\u6BB5\u72B6\u6001\u515C\u5E95\n } finally {\n await refreshDock()\n updateDock({ cliPendingId: null })\n }\n}\n\nfunction ConnectorDock(): JSX.Element | null {\n const state = useDock()\n\n useEffect(() => {\n void refreshDock()\n const onChange = (): void => {\n void refreshDock()\n }\n window.addEventListener('dshc:connections-changed', onChange)\n return () => {\n window.removeEventListener('dshc:connections-changed', onChange)\n closeDock()\n }\n }, [])\n\n if (!state.loaded) return null\n const cards = enabledDockCards(state)\n const cli = enabledDockCli(state)\n if (cards.length === 0 && cli.length === 0) return null\n const entries = [\n ...cards.map(card => ({ kind: 'mcp' as const, id: card.id, name: card.name, card, failed: state.connections[card.id]?.error !== undefined })),\n ...cli.map(connector => ({ kind: 'cli' as const, id: connector.id, name: connector.name, connector, failed: connector.phase === 'error' })),\n ].sort((left, right) => left.name.localeCompare(right.name, 'zh-CN'))\n const shown = entries.slice(0, 3)\n const extra = entries.length - shown.length\n const label = entries\n .map(entry => `${entry.name}${entry.failed ? '\uFF08\u8FDE\u63A5\u5931\u8D25\uFF09' : ''}`)\n .join('\u3001')\n const single = entries.length === 1\n\n return (\n <button\n type=\"button\"\n className={single ? 'dshc-dock dshc-dock-single' : 'dshc-dock'}\n data-dshc-dock=\"true\"\n title={label}\n aria-label={`\u5DF2\u542F\u7528 ${entries.length} \u4E2A\u8FDE\u63A5\u5668`}\n onClick={toggleDock}\n >\n {shown.map((entry, index) => (\n <span key={`${entry.kind}:${entry.id}`} className=\"dshc-dock-icon\" style={{ zIndex: shown.length - index }}>\n {entry.kind === 'mcp'\n ? <ConnectorLogo card={entry.card} size={single ? 24 : 18} />\n : <CliLogo connector={entry.connector} size={single ? 24 : 18} />}\n {entry.failed && <span className=\"dshc-dock-dot\" />}\n </span>\n ))}\n {extra > 0 && <span className=\"dshc-dock-more\">+{extra}</span>}\n </button>\n )\n}\n\nfunction ConnectorPopover(): JSX.Element | null {\n const state = useDock()\n const [tip, setTip] = useState<{ text: string; left: number; top: number; width: number } | null>(null)\n const [pendingLabel, setPendingLabel] = useState<string | null>(null)\n const flowAckRef = useRef<string | null>(null)\n const cliWasActiveRef = useRef(false)\n\n useEffect(() => {\n setTip(null)\n }, [state.open, state.query])\n\n useEffect(() => {\n const onStarted = (event: Event): void => {\n const cardId = (event as CustomEvent<{ cardId?: string }>).detail?.cardId\n if (cardId !== undefined) flowAckRef.current = cardId\n }\n const onOpened = (event: Event): void => {\n const cardId = (event as CustomEvent<{ cardId?: string }>).detail?.cardId\n if (cardId !== undefined && dockSnapshot.pendingId !== null && dockSnapshot.pendingId !== cardId) return\n updateDock({ pendingId: null })\n setPendingLabel(null)\n }\n const onAuthorizing = (event: Event): void => {\n const cardId = (event as CustomEvent<{ cardId?: string }>).detail?.cardId\n if (cardId !== undefined && dockSnapshot.pendingId === cardId) setPendingLabel('\u6388\u6743')\n }\n const onFinished = (event: Event): void => {\n if (dockSnapshot.pendingId === null) return\n const cardId = (event as CustomEvent<{ cardId?: string }>).detail?.cardId\n if (cardId !== undefined && dockSnapshot.pendingId !== cardId) return\n updateDock({ pendingId: null })\n setPendingLabel(null)\n void refreshDock()\n }\n const onError = (event: Event): void => {\n const detail = (event as CustomEvent<{ cardId?: string; message?: string }>).detail\n if (detail?.cardId === undefined || dockSnapshot.pendingId !== detail.cardId) return\n updateDock({ error: detail.message ?? null })\n }\n const onCliOpened = (event: Event): void => {\n const id = (event as CustomEvent<{ id?: string }>).detail?.id\n if (id !== undefined && dockSnapshot.cliPendingId !== null && dockSnapshot.cliPendingId !== id) return\n updateDock({ cliPendingId: null })\n void refreshDock()\n }\n window.addEventListener('dshc:flow-started', onStarted)\n window.addEventListener('dshc:flow-opened', onOpened)\n window.addEventListener('dshc:flow-authorizing', onAuthorizing)\n window.addEventListener('dshc:flow-finished', onFinished)\n window.addEventListener('dshc:flow-error', onError)\n window.addEventListener('dshc:cli-flow-opened', onCliOpened)\n return () => {\n window.removeEventListener('dshc:flow-started', onStarted)\n window.removeEventListener('dshc:flow-opened', onOpened)\n window.removeEventListener('dshc:flow-authorizing', onAuthorizing)\n window.removeEventListener('dshc:flow-finished', onFinished)\n window.removeEventListener('dshc:flow-error', onError)\n window.removeEventListener('dshc:cli-flow-opened', onCliOpened)\n }\n }, [])\n\n useEffect(() => {\n if (state.open) void refreshDock()\n }, [state.open])\n\n const cliActive = state.cli.some(connector => connector.phase !== 'idle' && connector.phase !== 'error')\n useEffect(() => {\n if (!state.open) return\n if (cliActive) {\n cliWasActiveRef.current = true\n const timer = window.setInterval(() => {\n void refreshDock()\n }, 1200)\n return () => window.clearInterval(timer)\n }\n if (!cliWasActiveRef.current) return\n cliWasActiveRef.current = false\n const timer = window.setTimeout(() => { void refreshDock() }, 900)\n return () => window.clearTimeout(timer)\n }, [state.open, cliActive])\n\n useEffect(() => {\n if (!state.open) return\n const onKey = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') return\n if (document.querySelector('.dshc-overlay .dshc-dialog') !== null) return\n closeDock()\n }\n const onPointerDown = (event: PointerEvent): void => {\n const target = event.target as HTMLElement | null\n if (target?.closest('[data-dshc-dock],.dshc-dock-popover,.dshc-overlay,.dshc-dialog,.dshc-card-tip') === null) closeDock()\n }\n window.addEventListener('keydown', onKey)\n window.addEventListener('pointerdown', onPointerDown, true)\n return () => {\n window.removeEventListener('keydown', onKey)\n window.removeEventListener('pointerdown', onPointerDown, true)\n }\n }, [state.open])\n\n if (!state.open) return null\n\n const keyword = state.query.trim().toLowerCase()\n const cards = state.cards\n .filter(card => keyword === ''\n || `${card.name} ${card.vendor ?? ''} ${card.summary} ${(card.tags ?? []).join(' ')}`.toLowerCase().includes(keyword))\n .sort((left, right) => compareDockCards(left, right, state.connections))\n const cli = state.cli\n .filter(connector => keyword === ''\n || `${connector.name} CLI ${connector.vendor} ${connector.description} ${connector.examples.join(' ')}`.toLowerCase().includes(keyword))\n .sort((left, right) => left.name.localeCompare(right.name, 'zh-CN'))\n\n const showRowTip = (element: HTMLElement, text: string): void => {\n if (text.trim() === '') return\n const rect = element.getBoundingClientRect()\n const width = Math.min(320, window.innerWidth - 32)\n let left = rect.right + 10\n if (left + width > window.innerWidth - 16) left = Math.max(16, rect.left - width - 10)\n const top = Math.max(16, Math.min(rect.top, window.innerHeight - 200))\n setTip({ text, left, top, width })\n }\n\n const startFlow = (card: ConnectorCard): void => {\n flowAckRef.current = null\n setTip(null)\n setPendingLabel(dockActionLabel(card, state.connections[card.id]))\n updateDock({ pendingId: card.id, error: null })\n requestConnectorFlow(card.id)\n window.setTimeout(() => {\n if (dockSnapshot.pendingId !== card.id || flowAckRef.current === card.id) return\n updateDock({ pendingId: null })\n openConnectorPanel()\n }, 1500)\n }\n\n const startCliFlow = (connector: CliConnectorView, action: 'install' | 'login'): void => {\n setTip(null)\n updateDock({ cliPendingId: connector.id, error: null })\n requestCliFlow(connector.id, action)\n window.setTimeout(() => {\n if (dockSnapshot.cliPendingId !== connector.id) return\n updateDock({ cliPendingId: null })\n openConnectorPanel()\n }, 1500)\n }\n\n const rows = [\n ...cards.map(card => ({\n kind: 'mcp' as const,\n id: card.id,\n name: card.name,\n rank: dockCardRank(card, state.connections),\n card,\n })),\n ...cli.map(connector => ({\n kind: 'cli' as const,\n id: connector.id,\n name: connector.name,\n rank: cliDockRank(connector),\n connector,\n })),\n ].sort((left, right) => left.rank - right.rank\n || left.name.localeCompare(right.name, 'zh-CN')\n || left.id.localeCompare(right.id))\n\n const renderMcpRow = (card: ConnectorCard): JSX.Element => {\n const connection = state.connections[card.id]\n const pending = state.pendingId === card.id\n const actionLabel = dockActionLabel(card, connection)\n const pendingLabelText = pendingLabel ?? actionLabel\n const canCancel = isOAuthCard(card) || isTokenCard(card) || card.instance !== undefined\n return (\n <div className=\"dshc-dock-item\" key={card.id}>\n <div\n className=\"dshc-dock-row\"\n onMouseEnter={event => showRowTip(event.currentTarget, card.description ?? card.summary)}\n onMouseLeave={() => setTip(null)}\n >\n <span className=\"dshc-dock-row-icon\"><ConnectorLogo card={card} size={18} /></span>\n <span className=\"dshc-dock-row-main\">\n <span className=\"dshc-dock-row-name\">{card.name}</span>\n {connection?.error !== undefined && (\n <span className=\"dshc-dock-row-error\" title={connection.error}>\u8FDE\u63A5\u5931\u8D25</span>\n )}\n </span>\n {connection !== undefined && connection.authorized\n ? (\n pending\n ? <span className=\"dshc-dock-toggle\" role=\"status\" aria-label=\"\u5904\u7406\u4E2D\">\n <Spinner inline />\n </span>\n : <button\n type=\"button\"\n role=\"switch\"\n className=\"dshc-switch\"\n aria-checked={connection.enabled}\n aria-label={connection.enabled ? `\u505C\u7528 ${card.name}` : `\u542F\u7528 ${card.name}`}\n title={connection.enabled ? '\u505C\u7528' : '\u542F\u7528'}\n onClick={() => { void toggleDockConnection(card, !connection.enabled) }}\n />\n )\n : (\n pending\n ? <span className=\"dshc-dock-pending\" role=\"status\" aria-label={`${pendingLabelText}\u4E2D`}>\n <Spinner inline />\n {pendingLabelText}\u4E2D\u2026\n {canCancel && (\n <button\n type=\"button\"\n className=\"dshc-dock-pending-cancel\"\n onClick={event => {\n event.stopPropagation()\n requestConnectorFlowCancel(card.id)\n }}\n >\n \u53D6\u6D88\n </button>\n )}\n </span>\n : <button type=\"button\" className=\"dshc-dock-connect\" onClick={() => startFlow(card)}>\n <IconLink size={13} />\n {actionLabel}\n </button>\n )}\n </div>\n </div>\n )\n }\n\n const renderCliRow = (connector: CliConnectorView): JSX.Element => {\n const busy = connector.phase === 'installing'\n || connector.phase === 'updating'\n || connector.phase === 'configuring'\n || connector.phase === 'logging_in'\n || connector.phase === 'uninstalling'\n const pending = state.cliPendingId === connector.id || busy\n const enabled = connector.enabled !== false\n const ready = connector.installed && connector.authenticated\n const action = connector.installed ? 'login' : 'install'\n const actionLabel = connector.installed ? '\u767B\u5F55' : '\u5B89\u88C5'\n const pendingLabel = connector.stage ?? actionLabel\n return (\n <div className=\"dshc-dock-item\" key={`cli:${connector.id}`}>\n <div\n className=\"dshc-dock-row\"\n onMouseEnter={event => showRowTip(event.currentTarget, connector.description)}\n onMouseLeave={() => setTip(null)}\n >\n <span className=\"dshc-dock-row-icon\"><CliLogo connector={connector} size={18} /></span>\n <span className=\"dshc-dock-row-main\">\n <span className=\"dshc-dock-row-name\">{connector.name}</span>\n {connector.phase === 'error' && connector.lastError !== undefined && (\n <span className=\"dshc-dock-row-error\" title={connector.lastError}>\u5904\u7406\u5931\u8D25</span>\n )}\n </span>\n <span className=\"dshc-dock-row-hint\">CLI</span>\n {ready && !busy\n ? (\n pending\n ? <span className=\"dshc-dock-toggle\" role=\"status\" aria-label=\"\u5904\u7406\u4E2D\">\n <Spinner inline />\n </span>\n : <button\n type=\"button\"\n role=\"switch\"\n className=\"dshc-switch\"\n aria-checked={enabled}\n aria-label={enabled ? `\u505C\u7528 ${connector.name}` : `\u542F\u7528 ${connector.name}`}\n title={enabled ? '\u505C\u7528' : '\u542F\u7528'}\n onClick={() => { void toggleDockCli(connector, !enabled) }}\n />\n )\n : (\n pending\n ? <span className=\"dshc-dock-pending\" role=\"status\" aria-label={`${pendingLabel}\u4E2D`}>\n <Spinner inline />\n {pendingLabel}\u4E2D\u2026\n <button\n type=\"button\"\n className=\"dshc-dock-pending-cancel\"\n onClick={event => {\n event.stopPropagation()\n void cancelDockCli(connector)\n }}\n >\n \u53D6\u6D88\n </button>\n </span>\n : <button type=\"button\" className=\"dshc-dock-connect\" onClick={() => startCliFlow(connector, action)}>\n <IconLink size={13} />\n {actionLabel}\n </button>\n )}\n </div>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"dshc-dock-popover\" role=\"dialog\" aria-label=\"\u8FDE\u63A5\u5668\">\n <label className=\"dshc-dock-search\">\n <IconSearch size={13} />\n <input\n autoFocus\n name=\"dsh-connector-dock-search\"\n autoComplete=\"off\"\n data-lpignore=\"true\"\n data-1p-ignore=\"true\"\n data-bwignore=\"true\"\n placeholder=\"\u641C\u7D22\u8FDE\u63A5\u5668\"\n value={state.query}\n onChange={event => updateDock({ query: event.target.value })}\n />\n </label>\n <div className=\"dshc-dock-list\" onScroll={() => setTip(null)}>\n {!state.loaded\n ? <div className=\"dshc-dock-empty\">{state.loading ? '\u6B63\u5728\u52A0\u8F7D\u8FDE\u63A5\u5668\u2026' : '\u6CA1\u6709\u53EF\u7528\u7684\u8FDE\u63A5\u5668'}</div>\n : rows.length === 0\n ? <div className=\"dshc-dock-empty\">\u6CA1\u6709\u5339\u914D\u7684\u8FDE\u63A5\u5668</div>\n : rows.map(entry => entry.kind === 'mcp'\n ? renderMcpRow(entry.card)\n : renderCliRow(entry.connector))}\n </div>\n {state.error !== null && <div className=\"dshc-dock-error\">{state.error}</div>}\n <button type=\"button\" className=\"dshc-dock-manage\" onClick={openConnectorPanel}>\n <IconLink size={13} />\n \u7BA1\u7406\u8FDE\u63A5\u5668\n </button>\n </div>\n {tip !== null && createPortal(\n <div className=\"dshc-card-tip dshc-dock-tip\" style={{ left: tip.left, top: tip.top, width: tip.width }}>\n {tip.text}\n </div>,\n document.body,\n )}\n </>\n )\n}\n\nfunction Panel({ startTrial, variant = 'panel' }: PanelProps): JSX.Element {\n const [cards, setCards] = useState<ConnectorCard[]>([])\n const [connections, setConnections] = useState<Record<string, ConnectionView>>({})\n const [error, setError] = useState<string | null>(null)\n const [query, setQuery] = useState('')\n const searchRef = useRef<HTMLInputElement>(null)\n const [category, setCategory] = useState('\u5168\u90E8')\n const [loading, setLoading] = useState(false)\n const [dialogCard, setDialogCard] = useState<ConnectorCard | null>(null)\n const [dialogInstall, setDialogInstall] = useState(false)\n const [credentialCard, setCredentialCard] = useState<ConnectorCard | null>(null)\n const [credentialMode, setCredentialMode] = useState<'install' | 'update'>('update')\n const [credentialSaving, setCredentialSaving] = useState<string | null>(null)\n const [credentialError, setCredentialError] = useState<{ cardId: string; message: string } | null>(null)\n const [oauthAppCard, setOauthAppCard] = useState<ConnectorCard | null>(null)\n const [oauthAppSaving, setOauthAppSaving] = useState(false)\n const [oauthAppError, setOauthAppError] = useState<string | null>(null)\n const [dialogError, setDialogError] = useState<string | null>(null)\n const [pending, setPending] = useState<string | null>(null)\n const [connectingId, setConnectingId] = useState<string | null>(null)\n const [togglePending, setTogglePending] = useState<string | null>(null)\n const [cardErrors, setCardErrors] = useState<Record<string, string>>({})\n const [oauthFlow, setOAuthFlow] = useState<(OAuthFlowInfo & { connectorId: string }) | null>(null)\n const [oauthStarting, setOauthStarting] = useState<string | null>(null)\n const oauthAbortRef = useRef<AbortController | null>(null)\n const [customOpen, setCustomOpen] = useState(false)\n const [deleteCard, setDeleteCard] = useState<ConnectorCard | null>(null)\n const [deleteError, setDeleteError] = useState<string | null>(null)\n const [instanceCard, setInstanceCard] = useState<ConnectorCard | null>(null)\n const [instanceMode, setInstanceMode] = useState<'config' | 'replace'>('config')\n const [instancePending, setInstancePending] = useState(false)\n const [instanceError, setInstanceError] = useState<string | null>(null)\n const [instanceReturnToDetail, setInstanceReturnToDetail] = useState(false)\n const [editCard, setEditCard] = useState<ConnectorCard | null>(null)\n const [editConfig, setEditConfig] = useState<CustomConfigView | null>(null)\n const [editReturnToDetail, setEditReturnToDetail] = useState(false)\n const dialogCardRef = useRef<ConnectorCard | null>(null)\n const installOpRef = useRef<{ cardId: string; kind: 'token' | 'instance'; canceled: boolean } | null>(null)\n const [flowTick, setFlowTick] = useState(0)\n const [cliConnectors, setCliConnectors] = useState<CliConnectorView[]>([])\n const [cliError, setCliError] = useState<string | null>(null)\n const [cliDetailId, setCliDetailId] = useState<string | null>(null)\n const [cliInstallId, setCliInstallId] = useState<string | null>(null)\n const [cliLoginId, setCliLoginId] = useState<string | null>(null)\n const [cliUninstallId, setCliUninstallId] = useState<string | null>(null)\n const [cliUpdateId, setCliUpdateId] = useState<string | null>(null)\n const [cliUpdateStarted, setCliUpdateStarted] = useState(false)\n const [cliUpdateError, setCliUpdateError] = useState<string | null>(null)\n const [cliUninstallPending, setCliUninstallPending] = useState(false)\n const [cliUninstallError, setCliUninstallError] = useState<string | null>(null)\n const [cliBusyId, setCliBusyId] = useState<string | null>(null)\n const [cliTogglePending, setCliTogglePending] = useState<string | null>(null)\n const [cliFlow, setCliFlow] = useState<{ id: string; action: 'install' | 'login' } | null>(null)\n const [cliErrorId, setCliErrorId] = useState<string | null>(null)\n\n useEffect(() => {\n dialogCardRef.current = dialogCard\n }, [dialogCard])\n\n const refreshConnections = (): void => {\n void (async () => {\n try {\n const list = await request<ConnectionsPayload>(`${ROUTE_PREFIX}/api/connections`)\n setConnections(Object.fromEntries(list.value.connections.map(item => [item.connectorId, item])))\n } catch {\n // \u4FDD\u7559\u5F53\u524D\u72B6\u6001\uFF0C\u4E0B\u4E00\u6B21\u5237\u65B0\u518D\u8BD5\n }\n })()\n }\n\n const refreshSoon = (): void => {\n for (const delay of [1200, 3200, 8000, 15000]) {\n window.setTimeout(refreshConnections, delay)\n }\n }\n\n const load = (): void => {\n setLoading(true)\n setError(null)\n void (async () => {\n try {\n const [catalog, list] = await Promise.all([\n request<CatalogPayload>(`${ROUTE_PREFIX}/api/catalog`),\n request<ConnectionsPayload>(`${ROUTE_PREFIX}/api/connections`),\n ])\n setCards(canonicalizeCardCategories(catalog.value.cards))\n const merged = Object.fromEntries(list.value.connections.map(item => [item.connectorId, item]))\n setConnections(merged)\n if (Object.values(merged).some(item => item.authorized && item.error === undefined && item.tools.length === 0)) {\n refreshSoon()\n }\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setLoading(false)\n }\n })()\n }\n\n useEffect(load, [])\n\n useEffect(() => {\n const onChange = (): void => refreshConnections()\n window.addEventListener('dshc:connections-changed', onChange)\n return () => window.removeEventListener('dshc:connections-changed', onChange)\n }, [])\n\n const loadCli = (): void => {\n void (async () => {\n try {\n const response = await request<CliListPayload>(`${ROUTE_PREFIX}/api/cli`)\n setCliConnectors(response.value.connectors)\n setCliError(null)\n } catch (cause) {\n setCliError(cause instanceof Error ? cause.message : String(cause))\n }\n })()\n }\n\n useEffect(loadCli, [])\n\n const cliActive = cliConnectors.some(connector => connector.phase !== 'idle' && connector.phase !== 'error')\n const cliWasActiveRef = useRef(false)\n useEffect(() => {\n if (cliActive) {\n cliWasActiveRef.current = true\n const timer = window.setInterval(() => {\n void (async () => {\n try {\n const response = await request<CliListPayload>(`${ROUTE_PREFIX}/api/cli`)\n setCliConnectors(response.value.connectors)\n } catch {\n // \u8F6E\u8BE2\u5931\u8D25\u4FDD\u7559\u5F53\u524D\u72B6\u6001\n }\n })()\n }, 1200)\n return () => window.clearInterval(timer)\n }\n if (!cliWasActiveRef.current) return\n cliWasActiveRef.current = false\n const timer = window.setTimeout(loadCli, 900)\n return () => window.clearTimeout(timer)\n }, [cliActive])\n\n useEffect(() => {\n if (variant !== 'overlay') return\n const onRequest = (): void => {\n if (cliFlowRequest !== null) {\n setCliFlow(cliFlowRequest)\n cliFlowRequest = null\n }\n }\n window.addEventListener('dshc:cli-flow-request', onRequest)\n if (cliFlowRequest !== null) onRequest()\n return () => window.removeEventListener('dshc:cli-flow-request', onRequest)\n }, [variant])\n\n useEffect(() => {\n if (variant !== 'overlay' || cliFlow === null) return\n const connector = cliConnectors.find(item => item.id === cliFlow.id)\n if (connector === undefined) return\n const request = cliFlow\n setCliFlow(null)\n if (request.action === 'install') {\n setCliInstallId(connector.id)\n } else {\n runCliAction(connector.id, 'login')\n setCliLoginId(connector.id)\n }\n announceCliFlowOpened(connector.id)\n }, [variant, cliFlow, cliConnectors])\n\n const applyCli = (connector: CliConnectorView): void => {\n setCliConnectors(previous => {\n const existing = previous.find(item => item.id === connector.id)\n if (\n existing?.updatedAt !== undefined\n && connector.updatedAt !== undefined\n && connector.updatedAt < existing.updatedAt\n ) {\n return previous\n }\n return existing === undefined\n ? [...previous, connector]\n : previous.map(item => (item.id === connector.id ? connector : item))\n })\n }\n\n const runCliAction = (id: string, action: 'install' | 'login' | 'logout' | 'cancel'): void => {\n setCliBusyId(id)\n void (async () => {\n try {\n const response = await request<CliConnectorPayload>(`${ROUTE_PREFIX}/api/cli/${encodeURIComponent(id)}/${action}`, {\n method: 'POST',\n })\n applyCli(response.value.connector)\n setCliError(null)\n if (action === 'login') setCliLoginId(id)\n if (action === 'logout') setCliLoginId(null)\n notifyConnectionsChanged()\n } catch (cause) {\n setCliError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setCliBusyId(null)\n }\n })()\n }\n\n const toggleCli = (connector: CliConnectorView, enabled: boolean): void => {\n setCliTogglePending(connector.id)\n void (async () => {\n try {\n const response = await request<CliConnectorPayload>(`${ROUTE_PREFIX}/api/cli/${encodeURIComponent(connector.id)}`, {\n method: 'PATCH',\n body: JSON.stringify({ enabled }),\n })\n applyCli(response.value.connector)\n setCliError(null)\n notifyConnectionsChanged()\n } catch (cause) {\n setCliError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setCliTogglePending(current => current === connector.id ? null : current)\n }\n })()\n }\n\n const trialCli = (connector: CliConnectorView, example?: string): void => {\n const prompt = example !== undefined\n ? `\u4F7F\u7528${connector.name} CLI\uFF1A${example}`\n : connector.examples[0] !== undefined\n ? `\u4F7F\u7528${connector.name} CLI\uFF1A${connector.examples[0]}`\n : `\u4F7F\u7528 ${connector.name} CLI \u5B8C\u6210\u4E00\u4E2A\u7B80\u5355\u4EFB\u52A1\uFF0C\u5148\u8BF4\u660E\u53EF\u4EE5\u505A\u4EC0\u4E48\u3002`\n try {\n startTrial(prompt)\n } catch (cause) {\n setCliError(cause instanceof Error ? cause.message : String(cause))\n }\n }\n\n const uninstallCli = (connector: CliConnectorView): void => {\n if (cliUninstallPending) return\n setCliUninstallPending(true)\n setCliUninstallError(null)\n void (async () => {\n try {\n const response = await request<CliConnectorPayload>(\n `${ROUTE_PREFIX}/api/cli/${encodeURIComponent(connector.id)}/uninstall`,\n { method: 'POST' },\n )\n applyCli(response.value.connector)\n notifyConnectionsChanged()\n } catch (cause) {\n setCliUninstallError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setCliUninstallPending(false)\n }\n })()\n }\n\n const closeCliUninstall = (): void => {\n setCliUninstallId(null)\n setCliUninstallError(null)\n }\n\n const startCliUpdate = (connector: CliConnectorView): void => {\n setCliUpdateStarted(false)\n setCliUpdateError(null)\n void (async () => {\n try {\n const response = await request<CliConnectorPayload>(\n `${ROUTE_PREFIX}/api/cli/${encodeURIComponent(connector.id)}/update`,\n { method: 'POST' },\n )\n applyCli(response.value.connector)\n setCliUpdateStarted(true)\n } catch (cause) {\n setCliUpdateError(cause instanceof Error ? cause.message : String(cause))\n }\n })()\n }\n\n const closeCliUpdate = (): void => {\n setCliUpdateId(null)\n setCliUpdateStarted(false)\n setCliUpdateError(null)\n }\n\n const cancelUninstall = (connector: CliConnectorView): void => {\n setCliUninstallPending(true)\n setCliUninstallError(null)\n void (async () => {\n try {\n const response = await request<CliConnectorPayload>(\n `${ROUTE_PREFIX}/api/cli/${encodeURIComponent(connector.id)}/cancel`,\n { method: 'POST' },\n )\n applyCli(response.value.connector)\n setCliUninstallId(null)\n notifyConnectionsChanged()\n } catch (cause) {\n setCliUninstallError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setCliUninstallPending(false)\n }\n })()\n }\n\n useEffect(() => {\n if (cliUninstallId === null) return\n const connector = cliConnectors.find(item => item.id === cliUninstallId)\n if (connector === undefined) return\n if (connector.phase === 'error' && connector.lastError !== undefined) {\n setCliUninstallError(connector.lastError)\n }\n if (connector.phase === 'idle' && !connector.installed) {\n setCliUninstallId(null)\n setCliUninstallError(null)\n notifyConnectionsChanged()\n }\n }, [cliConnectors, cliUninstallId])\n\n const cliDetail = cliConnectors.find(connector => connector.id === cliDetailId) ?? null\n const cliInstall = cliConnectors.find(connector => connector.id === cliInstallId) ?? null\n const cliLogin = cliConnectors.find(connector => connector.id === cliLoginId) ?? null\n const cliUninstall = cliConnectors.find(connector => connector.id === cliUninstallId) ?? null\n const cliUpdate = cliConnectors.find(connector => connector.id === cliUpdateId) ?? null\n const cliErrorConnector = cliConnectors.find(connector => connector.id === cliErrorId) ?? null\n\n const categories = useMemo(() => {\n const present = new Set([\n ...cards.map(card => card.category),\n ...cliConnectors.map(connector => connector.category),\n ])\n const builtinSet = new Set<string>(BUILTIN_CATEGORIES)\n const builtin = BUILTIN_CATEGORIES.filter(category => present.has(category))\n const custom = [...present]\n .filter(category => !builtinSet.has(category))\n .sort((left, right) => left.localeCompare(right, 'zh-CN'))\n return ['\u5168\u90E8', ...builtin, ...custom]\n }, [cards, cliConnectors])\n\n const categoryOptions = useMemo(() => {\n const builtinSet = new Set<string>(BUILTIN_CATEGORIES)\n const custom = [...new Set(\n cards.map(card => card.category).filter(category => !builtinSet.has(category)),\n )].sort((left, right) => left.localeCompare(right, 'zh-CN'))\n return [...BUILTIN_CATEGORIES, ...custom]\n }, [cards])\n\n useEffect(() => {\n if (!categories.includes(category)) setCategory('\u5168\u90E8')\n }, [categories, category])\n\n const visible = useMemo(() => {\n const keyword = query.trim().toLowerCase()\n return cards.filter(card => {\n if (category !== '\u5168\u90E8' && card.category !== category) return false\n if (keyword.length === 0) return true\n return `${card.name} ${card.vendor ?? ''} ${card.summary} ${(card.tags ?? []).join(' ')}`.toLowerCase().includes(keyword)\n })\n }, [cards, category, query])\n\n const visibleCli = useMemo(() => {\n const keyword = query.trim().toLowerCase()\n return cliConnectors.filter(connector => {\n if (category !== '\u5168\u90E8' && connector.category !== category) return false\n if (keyword.length === 0) return true\n return `${connector.name} ${connector.vendor} ${connector.description} ${connector.examples.join(' ')}`.toLowerCase().includes(keyword)\n })\n }, [category, cliConnectors, query])\n\n const gridEntries = useMemo(() => {\n const rank = new Map<string, number>(BUILTIN_CATEGORIES.map((category, index) => [category, index]))\n const categoryRank = (category: string): number => rank.get(category) ?? BUILTIN_CATEGORIES.length\n const items = [\n ...visible.map((card, index) => ({ kind: 'mcp' as const, category: card.category, index, card })),\n ...visibleCli.map((connector, index) => ({ kind: 'cli' as const, category: connector.category, index, connector })),\n ]\n return items.sort((left, right) => categoryRank(left.category) - categoryRank(right.category)\n || left.category.localeCompare(right.category, 'zh-CN')\n || (left.kind === right.kind ? left.index - right.index : left.kind === 'mcp' ? -1 : 1))\n }, [visible, visibleCli])\n\n const openDialog = (card: ConnectorCard, install = false): void => {\n setDialogError(null)\n setDialogInstall(install)\n setDialogCard(card)\n }\n\n const openCredentialDialog = (card: ConnectorCard, mode: 'install' | 'update' = 'update'): void => {\n setCredentialError(null)\n setCredentialMode(mode)\n setCredentialCard(card)\n }\n\n const saveCredential = (card: ConnectorCard, token: string): void => {\n setCredentialSaving(card.id)\n setCredentialError(null)\n clearCardError(card.id)\n void (async () => {\n try {\n const response = await withInstallFeedback(request<ConnectResponse>(`${ROUTE_PREFIX}/api/connections`, {\n method: 'POST',\n body: JSON.stringify({ connectorId: card.id, token }),\n }))\n const connection = response.value?.connection\n if (connection === undefined) throw new ApiError('invalid_response', '\u4FDD\u5B58\u5931\u8D25\uFF1A\u5BBF\u4E3B\u6CA1\u6709\u8FD4\u56DE\u8FDE\u63A5')\n applyConnection(connection)\n if (connection.authorized && connection.error === undefined && connection.tools.length === 0) refreshSoon()\n setCredentialCard(current => current !== null && current.id === card.id ? null : current)\n if (dialogCardRef.current?.id === card.id) {\n setDialogError(null)\n setDialogInstall(false)\n }\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause)\n setCardError(card.id, message)\n setCredentialError({ cardId: card.id, message })\n if (dialogCardRef.current?.id === card.id) setDialogError(message)\n } finally {\n setCredentialSaving(current => current === card.id ? null : current)\n }\n })()\n }\n\n const clearCardError = (connectorId: string): void => {\n setCardErrors(previous => {\n if (previous[connectorId] === undefined) return previous\n const next = { ...previous }\n delete next[connectorId]\n return next\n })\n }\n\n const setCardError = (connectorId: string, message: string): void => {\n setCardErrors(previous => ({ ...previous, [connectorId]: message }))\n }\n\n const applyConnection = (connection: ConnectionView): void => {\n setConnections(previous => ({ ...previous, [connection.connectorId]: connection }))\n clearCardError(connection.connectorId)\n notifyConnectionsChanged()\n }\n\n const isUserOAuthCard = (card: ConnectorCard): boolean =>\n card.auth.type === 'oauth2' && card.auth.registration === 'user'\n\n const startOAuthFlow = (\n card: ConnectorCard,\n installFirst: boolean,\n surface: 'dialog' | 'page' = 'dialog',\n force = false,\n ): void => {\n if (isUserOAuthCard(card) && connections[card.id]?.oauthClientReady !== true) {\n clearCardError(card.id)\n if (surface === 'dialog') setDialogError(null)\n setOauthAppError(null)\n setOauthAppCard(card)\n return\n }\n runOAuth(card, installFirst, surface, force)\n }\n\n const submitOAuthApp = (clientId: string, clientSecret: string): void => {\n const card = oauthAppCard\n if (card === null || oauthAppSaving) return\n setOauthAppSaving(true)\n setOauthAppError(null)\n void (async () => {\n try {\n if (connections[card.id] === undefined) {\n const installed = await installConnector(card)\n applyConnection(installed)\n }\n const updated = await saveOAuthClient(card, clientId, clientSecret)\n applyConnection(updated)\n setOauthAppCard(null)\n runOAuth(card, false, dialogCard?.id === card.id ? 'dialog' : 'page', false, updated)\n } catch (cause) {\n setOauthAppError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setOauthAppSaving(false)\n }\n })()\n }\n\n const connect = (card: ConnectorCard, token?: string, surface: 'dialog' | 'page' = 'dialog'): Promise<boolean> => {\n setPending(card.id)\n setConnectingId(card.id)\n clearCardError(card.id)\n if (surface === 'dialog') setDialogError(null)\n return (async () => {\n try {\n const body: Record<string, string> = { connectorId: card.id }\n if (token !== undefined) body.token = token\n const response = await withInstallFeedback(request<ConnectResponse>(`${ROUTE_PREFIX}/api/connections`, {\n method: 'POST',\n body: JSON.stringify(body),\n }))\n const connection = response.value?.connection\n if (connection !== undefined) {\n applyConnection(connection)\n if (connection.authorized && connection.error === undefined && connection.tools.length === 0) refreshSoon()\n setDialogInstall(false)\n }\n setDialogError(null)\n return true\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause)\n setCardError(card.id, message)\n if (surface === 'dialog') setDialogError(message)\n announceConnectorFlowError(card.id, message)\n refreshConnections()\n notifyConnectionsChanged()\n return false\n } finally {\n setPending(null)\n setConnectingId(current => current === card.id ? null : current)\n announceConnectorFlowFinished(card.id)\n }\n })()\n }\n\n const installConnector = async (card: ConnectorCard): Promise<ConnectionView> => {\n const response = await withInstallFeedback(request<ConnectResponse>(`${ROUTE_PREFIX}/api/connections`, {\n method: 'POST',\n body: JSON.stringify({ connectorId: card.id }),\n }))\n const connection = response.value?.connection\n if (connection === undefined) throw new ApiError('invalid_response', '\u5B89\u88C5\u5931\u8D25\uFF1A\u5BBF\u4E3B\u6CA1\u6709\u8FD4\u56DE\u8FDE\u63A5')\n return connection\n }\n\n const installRecord = (card: ConnectorCard, surface: 'dialog' | 'page'): void => {\n setPending(card.id)\n clearCardError(card.id)\n if (surface === 'dialog') setDialogError(null)\n void (async () => {\n try {\n const connection = await installConnector(card)\n applyConnection(connection)\n if (card.instance !== undefined) {\n openInstanceDialog(card, 'config', surface === 'dialog')\n setDialogInstall(false)\n if (surface === 'dialog') setDialogError(null)\n return\n }\n if (isTokenCard(card)) {\n openCredentialDialog(card, 'install')\n if (surface === 'page') setDialogCard(null)\n setDialogInstall(false)\n if (surface === 'dialog') setDialogError(null)\n return\n }\n if (surface === 'page') setDialogCard(card)\n setDialogInstall(false)\n if (surface === 'dialog') setDialogError(null)\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause)\n setCardError(card.id, message)\n if (surface === 'dialog') setDialogError(message)\n } finally {\n setPending(null)\n }\n })()\n }\n\n const runOAuth = (card: ConnectorCard, installFirst: boolean, surface: 'dialog' | 'page' = 'dialog', force = false, presetConnection?: ConnectionView): void => {\n const controller = new AbortController()\n oauthAbortRef.current = controller\n setOauthStarting(card.id)\n setPending(card.id)\n clearCardError(card.id)\n if (surface === 'dialog') setDialogError(null)\n void (async () => {\n try {\n let connection = presetConnection ?? connections[card.id]\n if (presetConnection === undefined && (installFirst || connection === undefined)) {\n connection = await installConnector(card)\n applyConnection(connection)\n setDialogInstall(false)\n }\n if (connection === undefined) {\n throw new ApiError('not_installed', '\u8BF7\u5148\u5B89\u88C5\u8FDE\u63A5\u5668\uFF0C\u518D\u53D1\u8D77\u6388\u6743')\n }\n if (force || !connection.authorized) {\n window.dispatchEvent(new CustomEvent('dshc:flow-authorizing', { detail: { cardId: card.id } }))\n const authorized = await authorizeConnector(card, {\n signal: controller.signal,\n onFlow: flow => {\n setOAuthFlow({ ...flow, connectorId: card.id })\n if (!flow.opened) {\n setDialogCard(card)\n announceConnectorFlow(card.id)\n }\n },\n })\n applyConnection(authorized)\n if (authorized.authorized && authorized.error === undefined && authorized.tools.length === 0) refreshSoon()\n setDialogInstall(false)\n setDialogError(null)\n }\n } catch (cause) {\n if (!(cause instanceof ApiError && cause.code === 'oauth_cancelled')) {\n const message = cause instanceof Error ? cause.message : String(cause)\n setCardError(card.id, message)\n if (surface === 'dialog') setDialogError(message)\n announceConnectorFlowError(card.id, message)\n }\n refreshConnections()\n notifyConnectionsChanged()\n } finally {\n setPending(null)\n setOauthStarting(null)\n setOAuthFlow(null)\n oauthAbortRef.current = null\n announceConnectorFlowFinished(card.id)\n }\n })()\n }\n\n const openInstanceDialog = (card: ConnectorCard, mode: 'config' | 'replace', fromDetail = false): void => {\n setInstanceError(null)\n setInstanceMode(mode)\n setInstanceReturnToDetail(fromDetail)\n setDialogCard(null)\n setInstanceCard(card)\n }\n\n const submitInstance = (card: ConnectorCard, instanceUrl: string): void => {\n const mode = instanceMode\n setInstancePending(true)\n setInstanceError(null)\n clearCardError(card.id)\n void (async () => {\n try {\n const response = await withInstallFeedback(request<ConnectResponse>(\n `${ROUTE_PREFIX}/api/connections/${encodeURIComponent(card.id)}/instance`,\n { method: 'POST', body: JSON.stringify({ instanceUrl }) },\n ))\n const connection = response.value?.connection\n if (connection === undefined) throw new ApiError('invalid_response', '\u4FDD\u5B58\u5730\u5740\u5931\u8D25\uFF1A\u5BBF\u4E3B\u6CA1\u6709\u8FD4\u56DE\u8FDE\u63A5')\n applyConnection(connection)\n setInstanceCard(null)\n setDialogError(null)\n setDialogInstall(false)\n if (isOAuthCard(card)) {\n runOAuth(card, false, 'page', mode === 'replace', connection)\n } else if (isTokenCard(card)) {\n if (mode === 'replace' && connection.authorized === true) {\n setDialogCard(card)\n return\n }\n openCredentialDialog(card, 'install')\n } else {\n setDialogCard(card)\n void connect(card, undefined, 'dialog')\n }\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause)\n setCardError(card.id, message)\n setInstanceError(message)\n } finally {\n setInstancePending(false)\n }\n })()\n }\n\n const installWithRow = (card: ConnectorCard, kind: 'token' | 'instance'): void => {\n const op = { cardId: card.id, kind, canceled: false }\n installOpRef.current = op\n clearCardError(card.id)\n void (async () => {\n try {\n const connection = await withInstallFeedback(installConnector(card))\n if (op.canceled) {\n try {\n await request(`${ROUTE_PREFIX}/api/connections/${encodeURIComponent(card.id)}`, { method: 'DELETE' })\n } catch (cause) {\n setCardError(card.id, cause instanceof Error ? cause.message : String(cause))\n }\n notifyConnectionsChanged()\n refreshConnections()\n return\n }\n applyConnection(connection)\n if (kind === 'token') openCredentialDialog(card, 'install')\n else openInstanceDialog(card, 'config')\n announceConnectorFlow(card.id)\n } catch (cause) {\n if (op.canceled) return\n const message = cause instanceof Error ? cause.message : String(cause)\n setCardError(card.id, message)\n announceConnectorFlowError(card.id, message)\n } finally {\n if (installOpRef.current === op) installOpRef.current = null\n announceConnectorFlowFinished(card.id)\n }\n })()\n }\n\n const openFlow = (card: ConnectorCard): void => {\n announceConnectorFlowStarted(card.id)\n const connection = connections[card.id]\n if (card.instance !== undefined && connection !== undefined && connection.instanceReady !== true) {\n openInstanceDialog(card, 'config')\n announceConnectorFlow(card.id)\n return\n }\n if (connection === undefined) {\n if (card.instance !== undefined) {\n installWithRow(card, 'instance')\n return\n }\n if (isOAuthCard(card)) {\n startOAuthFlow(card, true, 'page')\n return\n }\n if (isTokenCard(card)) {\n installWithRow(card, 'token')\n return\n }\n void connect(card, undefined, 'page')\n return\n }\n if (!connection.authorized) {\n if (isTokenCard(card)) {\n openCredentialDialog(card, 'install')\n announceConnectorFlow(card.id)\n return\n }\n if (isOAuthCard(card)) {\n startOAuthFlow(card, false, 'page')\n return\n }\n void connect(card, undefined, 'page')\n return\n }\n if (connection.error !== undefined) {\n if (isTokenCard(card)) {\n openCredentialDialog(card, 'update')\n announceConnectorFlow(card.id)\n return\n }\n if (isOAuthCard(card)) {\n startOAuthFlow(card, false, 'page', true)\n return\n }\n if (card.instance !== undefined) {\n openInstanceDialog(card, 'replace')\n announceConnectorFlow(card.id)\n return\n }\n void connect(card, undefined, 'page')\n return\n }\n openDialog(card, false)\n announceConnectorFlow(card.id)\n }\n\n useEffect(() => {\n if (variant !== 'overlay') return\n const onRequest = (): void => setFlowTick(current => current + 1)\n window.addEventListener('dshc:flow-request', onRequest)\n if (flowRequest !== null) onRequest()\n return () => window.removeEventListener('dshc:flow-request', onRequest)\n }, [variant])\n\n useEffect(() => {\n if (variant !== 'overlay' || flowRequest === null || loading) return\n const cardId = flowRequest\n const card = cards.find(item => item.id === cardId)\n flowRequest = null\n if (card !== undefined) openFlow(card)\n }, [variant, flowTick, loading, cards, connections])\n\n useEffect(() => {\n if (variant !== 'overlay') return\n const onCancel = (event: Event): void => {\n const cardId = (event as CustomEvent<{ cardId?: string }>).detail?.cardId\n if (cardId === undefined) return\n if (oauthStarting === cardId || oauthFlow?.connectorId === cardId) {\n cancelAuthorize()\n return\n }\n const op = installOpRef.current\n if (op !== null && op.cardId === cardId) op.canceled = true\n }\n window.addEventListener('dshc:flow-cancel', onCancel)\n return () => window.removeEventListener('dshc:flow-cancel', onCancel)\n }, [variant, oauthStarting, oauthFlow])\n\n useEffect(() => {\n if (variant !== 'panel') return\n const onRequest = (): void => {\n setDialogCard(null)\n setCredentialCard(null)\n setInstanceCard(null)\n setDeleteCard(null)\n setCustomOpen(false)\n setEditCard(null)\n }\n window.addEventListener('dshc:flow-request', onRequest)\n return () => window.removeEventListener('dshc:flow-request', onRequest)\n }, [variant])\n\n const openCustomEdit = (card: ConnectorCard, fromDetail = false): void => {\n clearCardError(card.id)\n setDialogCard(null)\n setEditReturnToDetail(fromDetail)\n setEditCard(null)\n setEditConfig(null)\n void (async () => {\n try {\n const response = await request<CustomConfigPayload>(\n `${ROUTE_PREFIX}/api/custom-connectors/${encodeURIComponent(card.id)}/config`,\n )\n setEditConfig(response.value.config)\n setEditCard(card)\n } catch (cause) {\n setCardError(card.id, cause instanceof Error ? cause.message : String(cause))\n if (fromDetail) setDialogCard(card)\n }\n })()\n }\n\n const closeCustomEdit = (): void => {\n setEditCard(null)\n setEditConfig(null)\n if (editReturnToDetail) setDialogCard(editCard)\n }\n\n const applyCustomEdit = (result: CustomUpdatePayload['value']): void => {\n const updated = canonicalizeCardCategories([result.card])[0] ?? result.card\n setCards(previous => canonicalizeCardCategories(\n previous.map(card => (card.id === updated.id ? updated : card)),\n ))\n if (result.disconnected) {\n setConnections(previous => {\n const next = { ...previous }\n delete next[updated.id]\n return next\n })\n }\n setEditCard(null)\n setEditConfig(null)\n if (editReturnToDetail) setDialogCard(updated)\n notifyConnectionsChanged()\n }\n\n const cancelAuthorize = (): void => {\n const flow = oauthFlow\n oauthAbortRef.current?.abort()\n if (flow !== null) {\n void request(`${ROUTE_PREFIX}/api/oauth/cancel`, {\n method: 'POST',\n body: JSON.stringify({ flowId: flow.flowId }),\n }).catch(() => undefined)\n }\n setDialogError(null)\n }\n\n const revoke = (card: ConnectorCard, surface: 'dialog' | 'page' = 'dialog'): void => {\n setPending(card.id)\n clearCardError(card.id)\n if (surface === 'dialog') setDialogError(null)\n void (async () => {\n try {\n const response = await request<ConnectResponse>(\n `${ROUTE_PREFIX}/api/connections/${encodeURIComponent(card.id)}/oauth`,\n { method: 'DELETE' },\n )\n const connection = response.value?.connection\n if (connection !== undefined) applyConnection(connection)\n else refreshConnections()\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause)\n setCardError(card.id, message)\n if (surface === 'dialog') setDialogError(message)\n } finally {\n setPending(null)\n }\n })()\n }\n\n const disconnect = (card: ConnectorCard): void => {\n setPending(card.id)\n clearCardError(card.id)\n void (async () => {\n try {\n await request(`${ROUTE_PREFIX}/api/connections/${encodeURIComponent(card.id)}`, { method: 'DELETE' })\n setConnections(previous => {\n const next = { ...previous }\n delete next[card.id]\n return next\n })\n notifyConnectionsChanged()\n } catch (cause) {\n setCardError(card.id, cause instanceof Error ? cause.message : String(cause))\n } finally {\n setPending(null)\n }\n })()\n }\n\n const onImported = (imported: ConnectorCard[], connectNow: boolean): void => {\n const canonical = canonicalizeCardCategories(imported)\n setCards(previous => {\n const existing = new Set(previous.map(card => card.id))\n return canonicalizeCardCategories([\n ...previous,\n ...canonical.filter(card => !existing.has(card.id)),\n ])\n })\n if (canonical[0] !== undefined) setCategory(canonical[0].category)\n notifyConnectionsChanged()\n if (connectNow && canonical[0] !== undefined && canonical.length === 1) {\n void connect(canonical[0], undefined, 'page')\n }\n }\n\n const removeCustom = (card: ConnectorCard): void => {\n setPending(card.id)\n setDeleteError(null)\n void (async () => {\n try {\n await request(`${ROUTE_PREFIX}/api/custom-connectors/${encodeURIComponent(card.id)}`, { method: 'DELETE' })\n setCards(previous => previous.filter(item => item.id !== card.id))\n setConnections(previous => {\n const next = { ...previous }\n delete next[card.id]\n return next\n })\n setDeleteCard(null)\n setDialogCard(null)\n notifyConnectionsChanged()\n } catch (cause) {\n setDeleteError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setPending(null)\n }\n })()\n }\n\n const toggleConnection = (card: ConnectorCard, enabled: boolean): void => {\n setTogglePending(card.id)\n clearCardError(card.id)\n void (async () => {\n try {\n const response = await request<ConnectResponse>(\n `${ROUTE_PREFIX}/api/connections/${encodeURIComponent(card.id)}`,\n { method: 'PATCH', body: JSON.stringify({ enabled }) },\n )\n const connection = response.value?.connection\n if (connection !== undefined) {\n applyConnection(connection)\n }\n } catch (cause) {\n setCardError(card.id, cause instanceof Error ? cause.message : String(cause))\n refreshConnections()\n } finally {\n setTogglePending(null)\n }\n })()\n }\n\n const startTrialFor = (card: ConnectorCard): void => {\n clearCardError(card.id)\n try {\n startTrial(promptForNextExample(card))\n } catch (cause) {\n setCardError(card.id, cause instanceof Error ? cause.message : String(cause))\n }\n }\n\n const tryExample = (card: ConnectorCard, example: string): void => {\n setDialogError(null)\n try {\n startTrial(promptForExample(card, example))\n } catch (cause) {\n setDialogError(cause instanceof Error ? cause.message : String(cause))\n }\n }\n\n const isAuthorizing = (card: ConnectorCard): boolean =>\n pending === card.id\n && (oauthStarting === card.id\n || oauthFlow?.connectorId === card.id\n || (isOAuthCard(card) && connections[card.id]?.authorized === false))\n\n const renderCard = (card: ConnectorCard): JSX.Element => (\n <ConnectorCardView\n key={card.id}\n card={card}\n connection={connections[card.id]}\n errorMessage={cardErrors[card.id]}\n togglePending={togglePending === card.id}\n authorizing={isAuthorizing(card)}\n installing={pending === card.id}\n connecting={credentialSaving === card.id || connectingId === card.id}\n onOpen={() => openDialog(card, false)}\n onInstall={() => {\n if (card.instance !== undefined) {\n installRecord(card, 'page')\n return\n }\n if (isOAuthCard(card)) {\n startOAuthFlow(card, true, 'page')\n return\n }\n if (isTokenCard(card)) {\n installRecord(card, 'page')\n return\n }\n if (card.auth.type === 'none') {\n connect(card, undefined, 'page')\n return\n }\n openDialog(card, true)\n }}\n onAuthorize={() => {\n if (card.instance !== undefined && connections[card.id]?.instanceReady !== true) {\n openInstanceDialog(card, 'config')\n return\n }\n if (isOAuthCard(card)) {\n startOAuthFlow(card, false, 'page')\n return\n }\n if (isTokenCard(card)) {\n openCredentialDialog(card, connections[card.id]?.authorized === true ? 'update' : 'install')\n return\n }\n openDialog(card, false)\n }}\n onCancelAuthorize={cancelAuthorize}\n onUpdateCredential={isTokenCard(card) && connections[card.id]?.authorized === true\n ? () => openCredentialDialog(card)\n : undefined}\n onReauthorize={isOAuthCard(card) && connections[card.id]?.authorized === true\n ? () => startOAuthFlow(card, false, 'page', true)\n : undefined}\n onReconfigureInstance={card.instance !== undefined && connections[card.id]?.instanceReady === true\n ? () => openInstanceDialog(card, 'replace')\n : undefined}\n onRevoke={isOAuthCard(card)\n ? () => revoke(card, 'page')\n : undefined}\n onTrial={() => startTrialFor(card)}\n onToggle={enabled => toggleConnection(card, enabled)}\n onDisconnect={() => disconnect(card)}\n onDelete={card.source === 'custom'\n ? () => {\n setDeleteError(null)\n setDeleteCard(card)\n }\n : undefined}\n onEditCustom={card.source === 'custom' ? () => openCustomEdit(card) : undefined}\n />\n )\n\n const renderCli = (connector: CliConnectorView): JSX.Element => (\n <CliCardView\n key={connector.id}\n connector={connector}\n togglePending={cliTogglePending === connector.id}\n pending={cliBusyId === connector.id}\n onOpen={() => setCliDetailId(connector.id)}\n onInstall={() => setCliInstallId(connector.id)}\n onLogin={() => runCliAction(connector.id, 'login')}\n onLogout={() => runCliAction(connector.id, 'logout')}\n onOpenInstall={() => setCliInstallId(connector.id)}\n onOpenLogin={() => setCliLoginId(connector.id)}\n onToggle={enabled => toggleCli(connector, enabled)}\n onTrial={() => trialCli(connector)}\n onOpenError={() => setCliErrorId(connector.id)}\n onCancel={() => runCliAction(connector.id, 'cancel')}\n onUninstall={() => {\n setCliUninstallError(null)\n setCliUninstallId(connector.id)\n }}\n onOpenUninstall={() => {\n setCliUninstallError(null)\n setCliUninstallId(connector.id)\n }}\n onUpdate={() => {\n setCliUpdateError(null)\n setCliUpdateId(connector.id)\n startCliUpdate(connector)\n }}\n onOpenUpdate={() => {\n setCliUpdateError(null)\n setCliUpdateStarted(true)\n setCliUpdateId(connector.id)\n }}\n />\n )\n\n return (\n <div className={variant === 'overlay' ? 'dshc-root dshc-flow-root' : 'dshc-root'}>\n <div className=\"dshc-inner\">\n <header className=\"dshc-header\">\n <h1>\u8FDE\u63A5\u5668</h1>\n <button type=\"button\" className=\"dshc-btn dshc-btn-primary dshc-create\" onClick={() => setCustomOpen(true)}>\n <IconPlus size={13} />\n \u81EA\u5B9A\u4E49\u8FDE\u63A5\u5668\n </button>\n </header>\n\n <nav\n className=\"dshc-tabs\"\n onWheel={event => {\n const element = event.currentTarget\n if (element.scrollWidth <= element.clientWidth) return\n if (Math.abs(event.deltaY) <= Math.abs(event.deltaX)) return\n element.scrollLeft += event.deltaY\n event.preventDefault()\n }}\n >\n {categories.map(item => (\n <button\n key={item}\n type=\"button\"\n className={item === category ? 'dshc-tab dshc-tab-active' : 'dshc-tab'}\n onClick={() => setCategory(item)}\n >\n {item}\n </button>\n ))}\n </nav>\n\n <label className=\"dshc-search\">\n <IconSearch size={14} />\n <input\n ref={searchRef}\n name=\"dsh-connector-search\"\n autoComplete=\"off\"\n data-lpignore=\"true\"\n data-1p-ignore=\"true\"\n data-bwignore=\"true\"\n placeholder=\"\u641C\u7D22\u8FDE\u63A5\u5668\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n />\n {query !== '' && (\n <button\n type=\"button\"\n className=\"dshc-search-clear\"\n aria-label=\"\u6E05\u7A7A\u641C\u7D22\"\n title=\"\u6E05\u7A7A\u641C\u7D22\"\n onMouseDown={event => event.preventDefault()}\n onClick={() => {\n setQuery('')\n searchRef.current?.focus()\n }}\n >\n <IconClose size={12} />\n </button>\n )}\n </label>\n\n {error !== null && <div className=\"dshc-error\">{error}</div>}\n\n {visible.length === 0 && visibleCli.length === 0\n ? <div className=\"dshc-empty\">{loading ? '\u6B63\u5728\u52A0\u8F7D\u8FDE\u63A5\u5668\u2026' : '\u6CA1\u6709\u5339\u914D\u7684\u8FDE\u63A5\u5668'}</div>\n : (\n <div className=\"dshc-grid\">\n {gridEntries.map(entry => entry.kind === 'mcp' ? renderCard(entry.card) : renderCli(entry.connector))}\n </div>\n )}\n </div>\n\n {dialogCard !== null && (\n <ConnectorDialog\n card={dialogCard}\n connection={connections[dialogCard.id]}\n pending={pending === dialogCard.id || credentialSaving === dialogCard.id}\n toggling={togglePending === dialogCard.id}\n authorizing={isAuthorizing(dialogCard)}\n connecting={connectingId === dialogCard.id || credentialSaving === dialogCard.id}\n authorizeLink={oauthFlow?.connectorId === dialogCard.id ? oauthFlow.authorizeUrl : null}\n installOpen={dialogInstall}\n error={dialogError}\n behind={credentialCard !== null || deleteCard !== null}\n escLocked={credentialCard !== null || deleteCard !== null}\n onClose={() => {\n setDialogCard(null)\n setDialogInstall(false)\n setDialogError(null)\n }}\n onBeginInstall={() => {\n if (dialogCard.instance !== undefined || isTokenCard(dialogCard)) {\n installRecord(dialogCard, 'dialog')\n return\n }\n if (dialogCard.auth.type === 'none') {\n void connect(dialogCard, undefined, 'dialog')\n return\n }\n startOAuthFlow(dialogCard, true, 'dialog')\n }}\n onCancelInstall={() => {\n setDialogInstall(false)\n setDialogError(null)\n }}\n onConnect={token => connect(dialogCard, token, 'dialog')}\n onInstallOAuth={() => runOAuth(dialogCard, true)}\n onConfigureInstance={() => openInstanceDialog(dialogCard, 'config', true)}\n onAuthorize={() => startOAuthFlow(dialogCard, false)}\n onReauthorize={() => startOAuthFlow(dialogCard, false, 'dialog', true)}\n onReconfigureInstance={dialogCard.instance !== undefined && connections[dialogCard.id]?.instanceReady === true\n ? () => openInstanceDialog(dialogCard, 'replace', true)\n : undefined}\n onUpdateCredential={() => openCredentialDialog(\n dialogCard,\n connections[dialogCard.id]?.authorized === true ? 'update' : 'install',\n )}\n onCancelAuthorize={cancelAuthorize}\n onTryExample={example => tryExample(dialogCard, example)}\n onRevoke={() => revoke(dialogCard)}\n onDisconnect={() => disconnect(dialogCard)}\n onToggle={enabled => toggleConnection(dialogCard, enabled)}\n onDelete={dialogCard.source === 'custom'\n ? () => {\n setDeleteError(null)\n setDeleteCard(dialogCard)\n }\n : undefined}\n onEditCustom={dialogCard.source === 'custom'\n ? () => openCustomEdit(dialogCard, true)\n : undefined}\n />\n )}\n\n {credentialCard !== null && (\n <CredentialDialog\n card={credentialCard}\n mode={credentialMode}\n saving={credentialSaving === credentialCard.id}\n error={credentialError !== null && credentialError.cardId === credentialCard.id ? credentialError.message : null}\n onClose={() => {\n setCredentialCard(null)\n setCredentialError(null)\n }}\n onSubmit={token => saveCredential(credentialCard, token)}\n />\n )}\n\n {oauthAppCard !== null && (\n <OAuthAppDialog\n card={oauthAppCard}\n saving={oauthAppSaving}\n error={oauthAppError}\n onClose={() => {\n setOauthAppCard(null)\n setOauthAppError(null)\n }}\n onSubmit={submitOAuthApp}\n />\n )}\n\n {instanceCard !== null && (\n <InstanceDialog\n card={instanceCard}\n mode={instanceMode}\n pending={instancePending}\n error={instanceError}\n onClose={() => {\n if (!instancePending) {\n setInstanceCard(null)\n setInstanceError(null)\n if (instanceReturnToDetail) setDialogCard(instanceCard)\n }\n }}\n onSubmit={instanceUrl => submitInstance(instanceCard, instanceUrl)}\n />\n )}\n\n {editCard !== null && editConfig !== null && (\n <CustomConnectorDialog\n categoryOptions={categoryOptions}\n onClose={closeCustomEdit}\n onImported={onImported}\n editing={{ connectorId: editCard.id, initial: editConfig }}\n onEdited={applyCustomEdit}\n />\n )}\n\n {customOpen && (\n <CustomConnectorDialog\n onClose={() => setCustomOpen(false)}\n categoryOptions={categoryOptions}\n onImported={onImported}\n />\n )}\n\n {deleteCard !== null && (\n <DeleteCustomDialog\n card={deleteCard}\n pending={pending === deleteCard.id}\n error={deleteError}\n onClose={() => {\n if (pending === null) {\n setDeleteCard(null)\n setDeleteError(null)\n }\n }}\n onConfirm={() => removeCustom(deleteCard)}\n />\n )}\n\n {cliInstall !== null && (\n <CliInstallDialog\n connector={cliInstall}\n pending={cliBusyId === cliInstall.id}\n onClose={() => setCliInstallId(null)}\n onConfirm={() => runCliAction(cliInstall.id, 'install')}\n onCancel={() => runCliAction(cliInstall.id, 'cancel')}\n />\n )}\n\n {cliLogin !== null && (\n <CliLoginDialog\n connector={cliLogin}\n onCancel={() => runCliAction(cliLogin.id, 'cancel')}\n onClose={() => setCliLoginId(null)}\n />\n )}\n\n {cliUninstall !== null && (\n <CliUninstallDialog\n connector={cliUninstall}\n running={cliUninstall.phase === 'uninstalling'}\n pending={cliUninstallPending}\n error={cliUninstallError}\n onClose={closeCliUninstall}\n onConfirm={() => uninstallCli(cliUninstall)}\n onCancel={() => cancelUninstall(cliUninstall)}\n />\n )}\n\n {cliUpdate !== null && (\n <CliUpdateDialog\n connector={cliUpdate}\n running={cliUpdate.phase === 'updating'}\n started={cliUpdateStarted}\n error={cliUpdateError}\n onClose={closeCliUpdate}\n />\n )}\n\n {cliDetail !== null && (\n <CliDetailDialog\n connector={cliDetail}\n onClose={() => setCliDetailId(null)}\n onTrial={example => {\n setCliDetailId(null)\n trialCli(cliDetail, example)\n }}\n onInstall={() => {\n const id = cliDetail.id\n setCliDetailId(null)\n setCliInstallId(id)\n }}\n onLogin={() => {\n const id = cliDetail.id\n setCliDetailId(null)\n runCliAction(id, 'login')\n }}\n onUninstall={() => {\n const id = cliDetail.id\n setCliDetailId(null)\n setCliUninstallError(null)\n setCliUninstallId(id)\n }}\n />\n )}\n\n {cliErrorConnector !== null && (\n <CliErrorDialog\n connector={cliErrorConnector}\n onClose={() => setCliErrorId(null)}\n />\n )}\n </div>\n )\n}\n\ninterface CliCardViewProps {\n connector: CliConnectorView\n togglePending: boolean\n pending: boolean\n onOpen: () => void\n onInstall: () => void\n onLogin: () => void\n onLogout: () => void\n onOpenInstall: () => void\n onOpenLogin: () => void\n onToggle: (enabled: boolean) => void\n onTrial: () => void\n onOpenError: () => void\n onCancel: () => void\n onUninstall: () => void\n onOpenUninstall: () => void\n onUpdate: () => void\n onOpenUpdate: () => void\n}\n\nfunction CliCardView({ connector, togglePending, pending, onOpen, onInstall, onLogin, onLogout, onOpenInstall, onOpenLogin, onToggle, onTrial, onOpenError, onCancel, onUninstall, onOpenUninstall, onUpdate, onOpenUpdate }: CliCardViewProps): JSX.Element {\n const [menuOpen, setMenuOpen] = useState(false)\n const [menuAbove, setMenuAbove] = useState(false)\n const [tip, setTip] = useState<CardTip | null>(null)\n const menuRef = useRef<HTMLSpanElement>(null)\n const busy = pending\n || connector.phase === 'installing'\n || connector.phase === 'updating'\n || connector.phase === 'configuring'\n || connector.phase === 'logging_in'\n || connector.phase === 'uninstalling'\n const enabled = connector.enabled !== false\n const connected = connector.installed && connector.authenticated\n const canTry = connected && enabled && connector.skills.installed && !busy\n const error = !busy && connector.phase === 'error' && connector.lastError !== undefined ? connector.lastError : undefined\n const busyLabel = connector.phase === 'installing'\n ? '\u5B89\u88C5\u4E2D\u2026'\n : connector.phase === 'updating'\n ? '\u66F4\u65B0\u4E2D\u2026'\n : connector.phase === 'uninstalling'\n ? '\u5378\u8F7D\u4E2D\u2026'\n : connector.phase === 'configuring' ? '\u914D\u7F6E\u4E2D\u2026' : '\u767B\u5F55\u4E2D\u2026'\n const busyProgress = connector.phase === 'installing'\n ? '\u5B89\u88C5\u8FDB\u5EA6'\n : connector.phase === 'updating'\n ? '\u66F4\u65B0\u8FDB\u5EA6'\n : connector.phase === 'uninstalling' ? '\u5378\u8F7D\u8FDB\u5EA6' : '\u767B\u5F55\u8FDB\u5EA6'\n const stateLabel = busy\n ? '\uFF0C\u5904\u7406\u4E2D'\n : !connector.installed\n ? '\uFF0C\u672A\u5B89\u88C5'\n : !connector.authenticated\n ? '\uFF0C\u5DF2\u5B89\u88C5\u672A\u767B\u5F55'\n : enabled ? '\uFF0C\u5DF2\u767B\u5F55' : '\uFF0C\u5DF2\u505C\u7528'\n\n const toggleMenu = (button: HTMLElement): void => {\n const rect = button.getBoundingClientRect()\n setMenuAbove(rect.bottom + 170 > window.innerHeight)\n setMenuOpen(current => !current)\n }\n\n useEffect(() => {\n if (!menuOpen) return\n const onPointerDown = (event: PointerEvent): void => {\n if (menuRef.current !== null && !menuRef.current.contains(event.target as Node)) setMenuOpen(false)\n }\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') setMenuOpen(false)\n }\n window.addEventListener('pointerdown', onPointerDown, true)\n window.addEventListener('keydown', onKeyDown)\n return () => {\n window.removeEventListener('pointerdown', onPointerDown, true)\n window.removeEventListener('keydown', onKeyDown)\n }\n }, [menuOpen])\n\n useEffect(() => {\n if (tip === null) return\n const close = (): void => setTip(null)\n window.addEventListener('pointerdown', close, true)\n return () => window.removeEventListener('pointerdown', close, true)\n }, [tip])\n\n const showTip = (element: HTMLElement): void => {\n if (element.scrollHeight <= element.clientHeight + 1) return\n const rect = element.getBoundingClientRect()\n const width = Math.min(360, window.innerWidth - 32)\n const left = Math.max(16, Math.min(rect.left, window.innerWidth - width - 16))\n setTip({ text: connector.description, left, top: rect.bottom + 8 })\n }\n\n const actionClass = error !== undefined\n ? 'dshc-card-action dshc-card-action-error'\n : enabled ? 'dshc-card-action dshc-card-action-connected' : 'dshc-card-action dshc-card-action-disabled'\n\n return (\n <>\n <article\n className={menuOpen ? 'dshc-card dshc-card-menu-open' : 'dshc-card'}\n role=\"button\"\n tabIndex={0}\n aria-label={`\u67E5\u770B ${connector.name}${stateLabel}`}\n onClick={() => {\n if (menuOpen) {\n setMenuOpen(false)\n return\n }\n onOpen()\n }}\n onKeyDown={event => {\n if (event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onOpen()\n }\n }}\n >\n <div className=\"dshc-card-top\">\n <span className=\"dshc-avatar\"><CliLogo connector={connector} size={22} /></span>\n <div className=\"dshc-card-title\">\n <strong>{connector.name}</strong>\n <span>{connector.vendor} \u00B7 CLI</span>\n </div>\n </div>\n <p\n className=\"dshc-summary\"\n onMouseEnter={event => showTip(event.currentTarget)}\n onMouseLeave={() => setTip(null)}\n onPointerLeave={() => setTip(null)}\n >\n {connector.description}\n </p>\n <div className=\"dshc-card-foot\">\n <span className=\"dshc-badge\">{connector.category}</span>\n {!connector.installed ? (\n <span className=\"dshc-card-install-actions\">\n {error !== undefined && (\n <button\n type=\"button\"\n className=\"dshc-card-action dshc-card-action-error dshc-card-status\"\n title=\"\u67E5\u770B\u9519\u8BEF\u65E5\u5FD7\"\n aria-label={`\u67E5\u770B ${connector.name} \u9519\u8BEF\u65E5\u5FD7`}\n onClick={event => {\n event.stopPropagation()\n onOpenError()\n }}\n >\n <IconAlert size={16} />\n </button>\n )}\n <button\n type=\"button\"\n className={busy\n ? 'dshc-card-action dshc-card-action-connect dshc-card-action-loading'\n : 'dshc-card-action dshc-card-action-connect'}\n title=\"\u5B89\u88C5\"\n aria-label={`\u5B89\u88C5 ${connector.name} CLI`}\n onClick={event => {\n event.stopPropagation()\n if (busy) onOpenInstall()\n else onInstall()\n }}\n >\n {busy ? <Spinner /> : <IconPlus size={16} />}\n </button>\n </span>\n ) : !connector.authenticated ? (\n <span className=\"dshc-card-auth-actions\">\n <button\n type=\"button\"\n className=\"dshc-card-auth\"\n aria-label={busy ? `\u67E5\u770B ${connector.name} ${busyProgress}` : `\u767B\u5F55 ${connector.name}`}\n title={busy ? (connector.stage ?? busyLabel) : undefined}\n onClick={event => {\n event.stopPropagation()\n if (connector.phase === 'uninstalling') onOpenUninstall()\n else if (connector.phase === 'updating') onOpenUpdate()\n else if (busy) onOpenLogin()\n else onLogin()\n }}\n >\n {busy && <Spinner inline />}\n {busy ? busyLabel : '\u767B\u5F55'}\n </button>\n {!busy && (error !== undefined\n ? <button\n type=\"button\"\n className=\"dshc-card-action dshc-card-action-error dshc-card-status\"\n title=\"\u67E5\u770B\u9519\u8BEF\u65E5\u5FD7\"\n aria-label={`\u67E5\u770B ${connector.name} \u9519\u8BEF\u65E5\u5FD7`}\n onClick={event => {\n event.stopPropagation()\n onOpenError()\n }}\n >\n <IconAlert size={16} />\n </button>\n : <span className=\"dshc-card-installed\" title=\"CLI \u5DF2\u5B89\u88C5\" aria-label=\"CLI \u5DF2\u5B89\u88C5\">\n <IconCheck size={14} />\n </span>)}\n <span className=\"dshc-card-more-wrap\" ref={menuRef}>\n <button\n type=\"button\"\n className=\"dshc-card-more\"\n aria-label={`${connector.name} \u66F4\u591A\u64CD\u4F5C`}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={event => {\n event.stopPropagation()\n toggleMenu(event.currentTarget)\n }}\n >\n <IconMore size={16} />\n </button>\n {menuOpen && (\n <span className={menuAbove ? 'dshc-menu dshc-menu-above' : 'dshc-menu'} role=\"menu\" onClick={event => event.stopPropagation()}>\n {busy ? (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item dshc-menu-item-danger\"\n onClick={() => {\n setMenuOpen(false)\n onCancel()\n }}\n >\n <IconClose size={14} />\n {connector.phase === 'uninstalling'\n ? '\u53D6\u6D88\u5378\u8F7D'\n : connector.phase === 'updating' ? '\u53D6\u6D88\u66F4\u65B0' : '\u53D6\u6D88\u767B\u5F55'}\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n onClick={() => {\n setMenuOpen(false)\n onUpdate()\n }}\n >\n <IconRefresh size={14} />\n \u66F4\u65B0 CLI\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item dshc-menu-item-danger\"\n onClick={() => {\n setMenuOpen(false)\n onUninstall()\n }}\n >\n <IconTrash size={14} />\n \u5378\u8F7D CLI\n </button>\n </>\n )}\n </span>\n )}\n </span>\n </span>\n ) : (\n <span className={busy ? 'dshc-card-actions dshc-card-actions-busy' : 'dshc-card-actions'}>\n {busy\n ? <button\n type=\"button\"\n className=\"dshc-card-auth\"\n title={connector.stage ?? busyLabel}\n aria-label={`\u67E5\u770B ${connector.name} ${busyProgress}`}\n onClick={event => {\n event.stopPropagation()\n if (connector.phase === 'installing') onOpenInstall()\n else if (connector.phase === 'updating') onOpenUpdate()\n else if (connector.phase === 'uninstalling') onOpenUninstall()\n else onOpenLogin()\n }}\n >\n <Spinner inline />\n {busyLabel}\n </button>\n : error !== undefined\n ? <button\n type=\"button\"\n className={`${actionClass} dshc-card-status`}\n title=\"\u67E5\u770B\u9519\u8BEF\u65E5\u5FD7\"\n aria-label={`\u67E5\u770B ${connector.name} \u9519\u8BEF\u65E5\u5FD7`}\n onClick={event => {\n event.stopPropagation()\n onOpenError()\n }}\n >\n <IconAlert size={16} />\n </button>\n : <span className={`${actionClass} dshc-card-status`} title={enabled ? '\u5DF2\u542F\u7528' : '\u5DF2\u505C\u7528'} aria-hidden>\n <IconCheck size={16} />\n </span>}\n <span className=\"dshc-card-controls\">\n <span className=\"dshc-card-more-wrap\" ref={menuRef}>\n <button\n type=\"button\"\n className=\"dshc-card-more\"\n aria-label={`${connector.name} \u66F4\u591A\u64CD\u4F5C`}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={event => {\n event.stopPropagation()\n toggleMenu(event.currentTarget)\n }}\n >\n <IconMore size={16} />\n </button>\n {menuOpen && (\n <span className={menuAbove ? 'dshc-menu dshc-menu-above' : 'dshc-menu'} role=\"menu\" onClick={event => event.stopPropagation()}>\n {busy ? (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item dshc-menu-item-danger\"\n onClick={() => {\n setMenuOpen(false)\n onCancel()\n }}\n >\n <IconClose size={14} />\n {connector.phase === 'installing'\n ? '\u53D6\u6D88\u5B89\u88C5'\n : connector.phase === 'updating'\n ? '\u53D6\u6D88\u66F4\u65B0'\n : connector.phase === 'uninstalling' ? '\u53D6\u6D88\u5378\u8F7D' : '\u53D6\u6D88\u767B\u5F55'}\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n disabled={!canTry}\n onClick={() => {\n setMenuOpen(false)\n onTrial()\n }}\n >\n <IconPlay size={14} />\n \u53BB\u8BD5\u8BD5\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n onClick={() => {\n setMenuOpen(false)\n onLogin()\n }}\n >\n <IconRefresh size={14} />\n \u91CD\u65B0\u767B\u5F55\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n onClick={() => {\n setMenuOpen(false)\n onLogout()\n }}\n >\n <IconPlug size={14} />\n \u89E3\u7ED1\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n onClick={() => {\n setMenuOpen(false)\n onUpdate()\n }}\n >\n <IconRefresh size={14} />\n \u66F4\u65B0 CLI\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item dshc-menu-item-danger\"\n onClick={() => {\n setMenuOpen(false)\n onUninstall()\n }}\n >\n <IconTrash size={14} />\n \u5378\u8F7D CLI\n </button>\n </>\n )}\n </span>\n )}\n </span>\n {togglePending\n ? <span className=\"dshc-card-toggle\" role=\"status\" aria-label=\"\u5904\u7406\u4E2D\">\n <Spinner />\n </span>\n : busy\n ? null\n : <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={enabled ? `\u505C\u7528 ${connector.name}` : `\u542F\u7528 ${connector.name}`}\n title={enabled ? '\u505C\u7528' : '\u542F\u7528'}\n className=\"dshc-switch\"\n onClick={event => {\n event.stopPropagation()\n onToggle(!enabled)\n }}\n />}\n </span>\n </span>\n )}\n </div>\n </article>\n {tip !== null && createPortal(\n <div className=\"dshc-card-tip\" style={{ left: tip.left, top: tip.top }}>\n {tip.text}\n </div>,\n document.body,\n )}\n </>\n )\n}\n\ninterface CliInstallDialogProps {\n connector: CliConnectorView\n pending: boolean\n onClose: () => void\n onConfirm: () => void\n onCancel: () => void\n}\n\nfunction CliInstallDialog({ connector, pending, onClose, onConfirm, onCancel }: CliInstallDialogProps): JSX.Element {\n const busy = pending || connector.phase === 'installing'\n const failed = !busy && connector.phase === 'error' && connector.lastError !== undefined\n const done = !busy && connector.installed\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div className=\"dshc-dialog dshc-dialog-detail\" role=\"dialog\" aria-modal=\"true\" aria-label={`\u5B89\u88C5 ${connector.name} CLI`}>\n <div className=\"dshc-dialog-head\">\n <span className=\"dshc-dialog-avatar\"><CliLogo connector={connector} size={28} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>{done ? '\u5B89\u88C5\u5B8C\u6210' : `\u5B89\u88C5 ${connector.name} CLI`}</h2>\n <span>{connector.vendor}</span>\n </div>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n {busy ? (\n <>\n <div className=\"dshc-cli-wait\">\n <Spinner />\n <span>{connector.stage ?? '\u5B89\u88C5\u4E2D\u2026'}</span>\n </div>\n {connector.output !== undefined && connector.output.trim() !== '' && (\n <details className=\"dshc-cli-output\" open>\n <summary>\u5B89\u88C5\u8F93\u51FA</summary>\n <pre>{connector.output.slice(-4000)}</pre>\n </details>\n )}\n </>\n ) : done ? (\n <>\n <p className=\"dshc-dialog-hint\">CLI \u5DF2\u5B89\u88C5{connector.version === undefined ? '' : ` \u00B7 v${connector.version}`}\u3002\u767B\u5F55\u8BF7\u56DE\u5230\u5361\u7247\u70B9\u51FB\u300C\u767B\u5F55\u300D\u3002</p>\n {connector.skills.installed && (\n <p className=\"dshc-dialog-hint\">\u5DF2\u53D1\u73B0 {connector.skills.count} \u4E2A Skills\u3002</p>\n )}\n </>\n ) : (\n <>\n <p className=\"dshc-dialog-hint\">\n \u5C06\u6267\u884C\u4EE5\u4E0B\u547D\u4EE4\u5B89\u88C5\u5B98\u65B9 CLI \u4E0E Skills\u3002\u4F1A\u5199\u5165\u672C\u673A npm \u5168\u5C40\u76EE\u5F55\u548C <code>~/.agents/skills</code>\uFF0C\u5F71\u54CD\u672C\u673A\u5176\u4ED6 Agent\u3002\n </p>\n <pre className=\"dshc-cli-commands\">{connector.installHint.join('\\n')}</pre>\n <p className=\"dshc-dialog-hint\">\n <a className=\"dshc-link\" href={connector.docsUrl} target=\"_blank\" rel=\"noreferrer\">\u67E5\u770B\u5B98\u65B9\u5B89\u88C5\u6587\u6863</a>\n </p>\n {failed && <p className=\"dshc-dialog-error\">{connector.lastError}</p>}\n </>\n )}\n </div>\n <div className=\"dshc-dialog-actions\">\n <span className=\"dshc-dialog-actions-right\">\n {busy ? (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onCancel}>\u53D6\u6D88\u5B89\u88C5</button>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\u5173\u95ED</button>\n </>\n ) : done ? (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" onClick={onClose}>\u5173\u95ED</button>\n ) : (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\u53D6\u6D88</button>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" onClick={onConfirm}>\n {failed ? '\u91CD\u8BD5' : '\u5B89\u88C5'}\n </button>\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n )\n}\n\ninterface CliLoginDialogProps {\n connector: CliConnectorView\n onCancel: () => void\n onClose: () => void\n}\n\nfunction CliLoginDialog({ connector, onCancel, onClose }: CliLoginDialogProps): JSX.Element {\n const [copied, setCopied] = useState<string | null>(null)\n const [copyFailed, setCopyFailed] = useState<string | null>(null)\n const busy = connector.phase === 'configuring' || connector.phase === 'logging_in'\n const failed = connector.phase === 'error'\n const success = connector.authenticated && !busy\n const link = connector.link\n const statusText = busy\n ? (connector.stage === '\u914D\u7F6E\u5E94\u7528' ? '\u914D\u7F6E\u5E94\u7528\u4E2D' : '\u7B49\u5F85\u6388\u6743')\n : success ? '\u5DF2\u767B\u5F55' : failed ? '\u767B\u5F55\u5931\u8D25' : '\u672A\u767B\u5F55'\n const statusClass = success\n ? 'dshc-status-pill dshc-status-pill-connected'\n : failed ? 'dshc-status-pill dshc-status-pill-error' : 'dshc-status-pill'\n const accountLabel = connector.account?.name ?? connector.account?.email\n const statusLabel = success && accountLabel !== undefined ? `\u5DF2\u767B\u5F55 \u00B7 ${accountLabel}` : statusText\n const copy = (value: string, key: string): void => {\n void (async () => {\n try {\n await writeClipboard(value)\n setCopied(key)\n setCopyFailed(null)\n window.setTimeout(() => setCopied(current => (current === key ? null : current)), 1500)\n } catch {\n setCopied(null)\n setCopyFailed(key)\n window.setTimeout(() => setCopyFailed(current => (current === key ? null : current)), 2000)\n }\n })()\n }\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div className=\"dshc-dialog dshc-dialog-detail\" role=\"dialog\" aria-modal=\"true\" aria-label={`\u767B\u5F55 ${connector.name}`}>\n <div className=\"dshc-dialog-head\">\n <span className=\"dshc-dialog-avatar\"><CliLogo connector={connector} size={28} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>{success ? '\u5DF2\u767B\u5F55' : connector.authenticated ? '\u91CD\u65B0\u767B\u5F55' : `\u767B\u5F55 ${connector.name}`}</h2>\n <span>{connector.vendor}</span>\n </div>\n <span className={`${statusClass} dshc-dialog-status-pill`} title={accountLabel}>\n {busy && <Spinner inline />}\n {statusLabel}\n </span>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n {success ? (\n <p className=\"dshc-dialog-hint\">\u8D26\u53F7\u5DF2\u8FDE\u63A5\uFF0C\u53EF\u4EE5\u5173\u95ED\u6B64\u7A97\u53E3\u5E76\u8BA9 Agent \u4F7F\u7528\u5B98\u65B9 Skills\u3002</p>\n ) : (\n <>\n <p className=\"dshc-dialog-hint\">\n {busy\n ? connector.stage === '\u914D\u7F6E\u5E94\u7528'\n ? '\u6B63\u5728\u51C6\u5907\u5E94\u7528\u914D\u7F6E\uFF0C\u6388\u6743\u9875\u9762\u4F1A\u81EA\u52A8\u6253\u5F00\uFF1B\u82E5\u672A\u6253\u5F00\uFF0C\u8BF7\u70B9\u51FB\u300C\u6253\u5F00\u6388\u6743\u9875\u9762\u300D\u3002'\n : '\u8BF7\u5728\u6D4F\u89C8\u5668\u5B8C\u6210\u767B\u5F55\u6388\u6743\uFF0C\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u540C\u6B65\u3002'\n : failed\n ? '\u767B\u5F55\u672A\u5B8C\u6210\uFF0C\u8BF7\u5173\u95ED\u540E\u91CD\u65B0\u70B9\u51FB\u300C\u767B\u5F55\u300D\uFF1B\u5B8C\u6574\u9519\u8BEF\u53EF\u4ECE\u5361\u7247\u611F\u53F9\u53F7\u67E5\u770B\u3002'\n : '\u767B\u5F55\u6D41\u7A0B\u5DF2\u7ED3\u675F\u6216\u5C1A\u672A\u5F00\u59CB\u3002'}\n </p>\n {connector.code !== undefined && (\n <div className=\"dshc-cli-code\">\n <code>{connector.code}</code>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={() => copy(connector.code ?? '', 'code')}>\n {copied === 'code' ? '\u5DF2\u590D\u5236' : copyFailed === 'code' ? '\u590D\u5236\u5931\u8D25' : '\u590D\u5236\u8BBE\u5907\u7801'}\n </button>\n </div>\n )}\n </>\n )}\n </div>\n <div className=\"dshc-dialog-actions\">\n {!success && (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-ghost\"\n onClick={() => {\n onCancel()\n onClose()\n }}\n >\n \u53D6\u6D88\u767B\u5F55\n </button>\n )}\n <span className=\"dshc-dialog-actions-right\">\n {success ? (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" onClick={onClose}>\u5B8C\u6210</button>\n ) : (\n <>\n {link !== undefined && (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-outline\"\n onClick={() => copy(link, 'link')}\n >\n {copied === 'link' ? '\u5DF2\u590D\u5236' : copyFailed === 'link' ? '\u590D\u5236\u5931\u8D25' : '\u590D\u5236\u94FE\u63A5'}\n </button>\n )}\n {link !== undefined\n ? (\n <a className=\"dshc-btn dshc-btn-md dshc-btn-primary\" href={link} target=\"_blank\" rel=\"noreferrer\">\n \u6253\u5F00\u6388\u6743\u9875\u9762\n </a>\n )\n : (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\n \u5173\u95ED\n </button>\n )}\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n )\n}\n\ninterface CliUninstallDialogProps {\n connector: CliConnectorView\n running: boolean\n pending: boolean\n error: string | null\n onClose: () => void\n onConfirm: () => void\n onCancel: () => void\n}\n\nfunction CliUninstallDialog({ connector, running, pending, error, onClose, onConfirm, onCancel }: CliUninstallDialogProps): JSX.Element {\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose])\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div className=\"dshc-dialog\" role=\"dialog\" aria-modal=\"true\" aria-busy={running} aria-label={`\u5378\u8F7D ${connector.name} CLI`}>\n <div className=\"dshc-dialog-head\">\n <span className=\"dshc-dialog-avatar\"><CliLogo connector={connector} size={28} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>\u5378\u8F7D {connector.name} CLI</h2>\n <span>{connector.vendor}</span>\n </div>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n {running ? (\n <>\n <div className=\"dshc-cli-wait\">\n <Spinner />\n <span>{connector.stage ?? '\u6B63\u5728\u5378\u8F7D CLI \u4E0E\u5B98\u65B9 Skills\u2026'}</span>\n </div>\n <p className=\"dshc-dialog-hint\">\n \u5378\u8F7D\u5728\u5BBF\u4E3B\u4FA7\u7EE7\u7EED\u6267\u884C\uFF1B\u5173\u95ED\u5F39\u7A97\u4E0D\u4F1A\u4E2D\u6B62\uFF0C\u53EF\u4EE5\u4ECE\u5361\u7247\u91CD\u65B0\u6253\u5F00\u8FDB\u5EA6\u3002\n </p>\n </>\n ) : (\n <>\n <p className=\"dshc-dialog-body\">\n \u5C06\u5378\u8F7D\u672C\u673A npm \u5168\u5C40 CLI{connector.skills.count > 0 ? `\uFF0C\u5E76\u5220\u9664 ~/.agents/skills \u4E0B ${connector.skills.count} \u4E2A\u5B98\u65B9 Skills` : ''}\u3002\n </p>\n <p className=\"dshc-dialog-hint\">\n {connector.skills.count > 0\n ? '\u5176\u4ED6 Agent \u5C06\u65E0\u6CD5\u7EE7\u7EED\u4F7F\u7528\u8FD9\u4E9B Skills\uFF0C\u5F53\u524D\u767B\u5F55\u6001\u4E5F\u4F1A\u6E05\u9664\uFF1B\u9700\u8981\u91CD\u65B0\u5B89\u88C5\u624D\u80FD\u6062\u590D\u3002'\n : '\u5176\u4ED6 Agent \u5C06\u65E0\u6CD5\u7EE7\u7EED\u4F7F\u7528\u8BE5 CLI\uFF0C\u5F53\u524D\u767B\u5F55\u6001\u4E5F\u4F1A\u6E05\u9664\uFF1B\u9700\u8981\u91CD\u65B0\u5B89\u88C5\u624D\u80FD\u6062\u590D\u3002'}\n </p>\n </>\n )}\n {error !== null && <p className=\"dshc-dialog-error\">{error}</p>}\n </div>\n <div className=\"dshc-dialog-actions\">\n {running ? (\n <>\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-outline dshc-btn-danger\"\n disabled={pending}\n onClick={onCancel}\n >\n {pending && <Spinner inline />}\n \u53D6\u6D88\u5378\u8F7D\n </button>\n <span className=\"dshc-dialog-actions-right\">\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\n \u5173\u95ED\n </button>\n </span>\n </>\n ) : (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\n \u53D6\u6D88\n </button>\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-outline dshc-btn-danger\"\n disabled={pending}\n onClick={onConfirm}\n >\n {pending && <Spinner inline />}\n {pending ? '\u542F\u52A8\u4E2D\u2026' : '\u5378\u8F7D CLI'}\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n )\n}\n\ninterface CliUpdateDialogProps {\n connector: CliConnectorView\n running: boolean\n started: boolean\n error: string | null\n onClose: () => void\n}\n\nfunction CliUpdateDialog({ connector, running, started, error, onClose }: CliUpdateDialogProps): JSX.Element {\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose])\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div className=\"dshc-dialog\" role=\"dialog\" aria-modal=\"true\" aria-busy={running} aria-label={`\u66F4\u65B0 ${connector.name} CLI`}>\n <div className=\"dshc-dialog-head\">\n <span className=\"dshc-dialog-avatar\"><CliLogo connector={connector} size={28} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>\u66F4\u65B0 {connector.name} CLI</h2>\n <span>{connector.vendor}</span>\n </div>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n {running ? (\n <>\n <div className=\"dshc-cli-wait\">\n <Spinner />\n <span>{connector.stage ?? '\u6B63\u5728\u66F4\u65B0 CLI\u2026'}</span>\n </div>\n <p className=\"dshc-dialog-hint\">\n \u66F4\u65B0\u4F1A\u539F\u5730\u5347\u7EA7 npm \u5168\u5C40 CLI \u5E76\u91CD\u65B0\u62C9\u53D6 Skills\uFF0C\u4E0D\u4F1A\u6E05\u9664\u767B\u5F55\u6001\uFF1B\u5173\u95ED\u5F39\u7A97\u4E0D\u4F1A\u4E2D\u6B62\uFF0C\u53EF\u518D\u6B21\u6253\u5F00\u67E5\u770B\u8FDB\u5EA6\u3002\n </p>\n </>\n ) : (\n <p className=\"dshc-dialog-body\">\n {started ? `\u5DF2\u66F4\u65B0\u5230 v${connector.version ?? '\u6700\u65B0\u7248\u672C'}\u3002` : '\u51C6\u5907\u66F4\u65B0\u2026'}\n </p>\n )}\n {error !== null && <p className=\"dshc-dialog-error\">{error}</p>}\n </div>\n <div className=\"dshc-dialog-actions\">\n <span className=\"dshc-dialog-actions-right\">\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\n {running ? '\u540E\u53F0\u7EE7\u7EED' : '\u5B8C\u6210'}\n </button>\n </span>\n </div>\n </div>\n </div>\n )\n}\n\ninterface CliDetailDialogProps {\n connector: CliConnectorView\n onClose: () => void\n onTrial: (example: string) => void\n onInstall: () => void\n onLogin: () => void\n onUninstall: () => void\n}\n\nfunction CliDetailDialog({ connector, onClose, onTrial, onInstall, onLogin, onUninstall }: CliDetailDialogProps): JSX.Element {\n const [copied, setCopied] = useState<number | null>(null)\n const [copyFailed, setCopyFailed] = useState<number | null>(null)\n const [showAllCapabilities, setShowAllCapabilities] = useState(false)\n const [exampleTip, setExampleTip] = useState<{\n index: number\n action: 'copy' | 'try'\n left: number\n top: number\n above: boolean\n } | null>(null)\n const busy = connector.phase === 'installing' || connector.phase === 'updating' || connector.phase === 'configuring' || connector.phase === 'logging_in' || connector.phase === 'uninstalling'\n const enabled = connector.enabled !== false\n const canTry = connector.authenticated && connector.installed && enabled && connector.skills.installed && !busy\n const status = busy\n ? (connector.stage ?? '\u5904\u7406\u4E2D')\n : !connector.installed\n ? '\u672A\u5B89\u88C5'\n : !connector.authenticated\n ? '\u5DF2\u5B89\u88C5\u672A\u767B\u5F55'\n : enabled ? '\u5DF2\u767B\u5F55' : '\u5DF2\u505C\u7528'\n const statusClass = connector.authenticated && enabled && !busy\n ? 'dshc-status-pill dshc-status-pill-connected'\n : 'dshc-status-pill'\n const accountLabel = connector.account?.name ?? connector.account?.email\n const statusWithAccount = !busy && accountLabel !== undefined ? `${status} \u00B7 ${accountLabel}` : status\n const accountTitle = accountLabel === undefined\n ? undefined\n : [accountLabel, connector.account?.org].filter(Boolean).join(' \u00B7 ')\n const capabilities = connector.capabilities\n const visibleCapabilities = capabilities === undefined\n ? []\n : showAllCapabilities ? capabilities.items : capabilities.items.slice(0, 4)\n\n useEffect(() => {\n setShowAllCapabilities(false)\n }, [connector.id])\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose])\n\n const copy = (text: string, index: number): void => {\n void (async () => {\n try {\n await writeClipboard(text)\n setCopied(index)\n setCopyFailed(null)\n window.setTimeout(() => setCopied(current => (current === index ? null : current)), 1500)\n } catch {\n setCopyFailed(index)\n setCopied(null)\n window.setTimeout(() => setCopyFailed(current => (current === index ? null : current)), 2000)\n }\n })()\n }\n\n const showExampleTip = (element: HTMLElement, index: number, action: 'copy' | 'try'): void => {\n const rect = element.getBoundingClientRect()\n const above = rect.bottom + 34 > window.innerHeight\n setExampleTip({\n index,\n action,\n left: rect.left + rect.width / 2,\n top: above ? rect.top - 6 : rect.bottom + 6,\n above,\n })\n }\n\n const exampleTipText = exampleTip === null\n ? null\n : exampleTip.action === 'try'\n ? (canTry ? '\u53BB\u8BD5\u8BD5' : !connector.authenticated ? '\u767B\u5F55\u540E\u53EF\u7528' : !enabled ? '\u5DF2\u505C\u7528' : 'Skills \u672A\u5C31\u7EEA')\n : copied === exampleTip.index\n ? '\u5DF2\u590D\u5236'\n : copyFailed === exampleTip.index\n ? '\u590D\u5236\u5931\u8D25'\n : '\u590D\u5236'\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div className=\"dshc-dialog dshc-dialog-detail\" role=\"dialog\" aria-modal=\"true\" aria-label={connector.name}>\n <div className=\"dshc-dialog-head dshc-dialog-head-detail\">\n <span className=\"dshc-avatar dshc-dialog-avatar dshc-dialog-avatar-lg\"><CliLogo connector={connector} size={32} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>{connector.name}</h2>\n <span>{[connector.vendor, connector.category].join(' \u00B7 ')}</span>\n </div>\n <span className={`${statusClass} dshc-dialog-status-pill`} title={accountTitle}>{statusWithAccount}</span>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n <p className=\"dshc-dialog-body\">{connector.description}</p>\n {connector.versionOutdated && (\n <p className=\"dshc-dialog-error\">\n CLI \u7248\u672C {connector.version ?? '\u672A\u77E5'} \u4F4E\u4E8E\u5B98\u65B9\u8981\u6C42 {connector.minVersion}\uFF0C\u8BF7\u7528\u300C\u66F4\u591A \u2192 \u66F4\u65B0 CLI\u300D\u5347\u7EA7\u3002\n </p>\n )}\n {capabilities !== undefined && capabilities.items.length > 0 && (\n <section className=\"dshc-tools dshc-capabilities\">\n <div className=\"dshc-tools-head dshc-capability-head\">\n <h3>\u53EF\u7528\u80FD\u529B</h3>\n <span\n className=\"dshc-tools-count\"\n title={capabilities.kind === 'products'\n ? `${capabilities.total} \u4E2A\u547D\u4EE4`\n : capabilities.kind === 'groups'\n ? `${capabilities.total} \u4E2A\u547D\u4EE4\u7EC4`\n : `${capabilities.total} \u4E2A Skills`}\n >\n {capabilities.kind === 'products'\n ? `${capabilities.items.length} \u4E2A\u4EA7\u54C1`\n : capabilities.kind === 'groups'\n ? `${capabilities.items.length} \u4E2A\u547D\u4EE4\u7EC4`\n : `${capabilities.total} \u4E2A Skills`}\n </span>\n </div>\n <div className=\"dshc-tool-list\">\n {visibleCapabilities.map(item => (\n <ToolRow\n key={item.id}\n name={item.name}\n description={item.description}\n />\n ))}\n </div>\n {capabilities.items.length > 4 && (\n <button\n type=\"button\"\n className=\"dshc-tools-toggle\"\n onClick={() => setShowAllCapabilities(current => !current)}\n >\n {showAllCapabilities ? '\u6536\u8D77' : `\u5C55\u5F00\u5168\u90E8 ${capabilities.items.length} \u4E2A`}\n </button>\n )}\n </section>\n )}\n {connector.examples.length > 0 && (\n <section className=\"dshc-examples\">\n <h3>\u8BD5\u8BD5\u8FD9\u6837\u7528</h3>\n <div className=\"dshc-example-list\">\n {connector.examples.map((example, index) => (\n <div className=\"dshc-example\" key={example}>\n <span className=\"dshc-example-text\">{example}</span>\n <span className=\"dshc-example-actions\">\n <button\n type=\"button\"\n className={copied === index\n ? 'dshc-example-action dshc-example-action-success'\n : copyFailed === index\n ? 'dshc-example-action dshc-example-action-error'\n : 'dshc-example-action'}\n aria-label={`\u590D\u5236\u793A\u4F8B\uFF1A${example}`}\n onMouseEnter={event => showExampleTip(event.currentTarget, index, 'copy')}\n onMouseLeave={() => setExampleTip(null)}\n onFocus={event => showExampleTip(event.currentTarget, index, 'copy')}\n onBlur={() => setExampleTip(null)}\n onClick={() => copy(example, index)}\n >\n {copied === index\n ? <IconCheck size={14} />\n : copyFailed === index\n ? <IconAlert size={14} />\n : <IconCopy size={14} />}\n </button>\n <button\n type=\"button\"\n className=\"dshc-example-action\"\n aria-label={`\u53BB\u8BD5\u8BD5\uFF1A${example}`}\n disabled={!canTry}\n onMouseEnter={event => showExampleTip(event.currentTarget, index, 'try')}\n onMouseLeave={() => setExampleTip(null)}\n onFocus={event => showExampleTip(event.currentTarget, index, 'try')}\n onBlur={() => setExampleTip(null)}\n onClick={() => onTrial(example)}\n >\n <IconPlay size={14} />\n </button>\n </span>\n </div>\n ))}\n </div>\n </section>\n )}\n </div>\n <div className=\"dshc-dialog-actions\">\n {connector.installed && (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-ghost dshc-btn-danger\"\n disabled={busy}\n onClick={onUninstall}\n >\n \u5378\u8F7D CLI\n </button>\n )}\n <span className=\"dshc-dialog-actions-right\">\n {!connector.installed ? (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\u5173\u95ED</button>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" disabled={busy} onClick={onInstall}>\u5B89\u88C5</button>\n </>\n ) : !connector.authenticated ? (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" disabled={busy} onClick={onLogin}>\u767B\u5F55</button>\n ) : (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" onClick={onClose}>\u5B8C\u6210</button>\n )}\n </span>\n </div>\n </div>\n {exampleTip !== null && exampleTipText !== null && createPortal(\n <div\n className={exampleTip.above\n ? 'dshc-card-tip dshc-action-tip dshc-action-tip-above'\n : 'dshc-card-tip dshc-action-tip'}\n style={{ left: exampleTip.left, top: exampleTip.top }}\n >\n {exampleTipText}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n\ninterface CliErrorDialogProps {\n connector: CliConnectorView\n onClose: () => void\n}\n\nfunction CliErrorDialog({ connector, onClose }: CliErrorDialogProps): JSX.Element {\n const [log, setLog] = useState('')\n const [loading, setLoading] = useState(true)\n const [loadError, setLoadError] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n const [copyFailed, setCopyFailed] = useState(false)\n\n useEffect(() => {\n let active = true\n setLoading(true)\n setLoadError(null)\n void (async () => {\n try {\n const response = await request<CliLogPayload>(`${ROUTE_PREFIX}/api/cli/${encodeURIComponent(connector.id)}/log`)\n if (active) setLog(response.value.output)\n } catch (cause) {\n if (active) setLoadError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n if (active) setLoading(false)\n }\n })()\n return () => {\n active = false\n }\n }, [connector.id])\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose])\n\n const fullText = [connector.lastError ?? '', log.trim()].filter(text => text !== '').join('\\n\\n')\n const copy = (): void => {\n if (fullText === '') return\n void (async () => {\n try {\n await writeClipboard(fullText)\n setCopied(true)\n setCopyFailed(false)\n window.setTimeout(() => setCopied(false), 1500)\n } catch {\n setCopied(false)\n setCopyFailed(true)\n window.setTimeout(() => setCopyFailed(false), 2000)\n }\n })()\n }\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div className=\"dshc-dialog dshc-dialog-detail\" role=\"dialog\" aria-modal=\"true\" aria-label={`${connector.name} \u9519\u8BEF\u65E5\u5FD7`}>\n <div className=\"dshc-dialog-head dshc-dialog-head-detail\">\n <span className=\"dshc-avatar dshc-dialog-avatar dshc-dialog-avatar-lg\"><IconAlert size={20} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>\u9519\u8BEF\u65E5\u5FD7</h2>\n <span>{connector.name} \u00B7 CLI</span>\n </div>\n <span className=\"dshc-status-pill dshc-status-pill-error dshc-dialog-status-pill\">\u5904\u7406\u5931\u8D25</span>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n <p className=\"dshc-dialog-error\">{connector.lastError ?? 'CLI \u5904\u7406\u5931\u8D25\uFF0C\u672A\u8FD4\u56DE\u9519\u8BEF\u6458\u8981\u3002'}</p>\n <section className=\"dshc-cli-log-section\">\n <div className=\"dshc-tools-head\">\n <h3>\u8FD0\u884C\u65E5\u5FD7</h3>\n {!loading && log.trim() !== '' && <span className=\"dshc-tools-count\">{log.split(/\\r?\\n/).length} \u884C</span>}\n </div>\n {loading\n ? <p className=\"dshc-dialog-hint\"><Spinner inline /> \u6B63\u5728\u8BFB\u53D6\u65E5\u5FD7\u2026</p>\n : loadError !== null\n ? <p className=\"dshc-dialog-error\">{loadError}</p>\n : log.trim() === ''\n ? <p className=\"dshc-dialog-hint\">\u672C\u6B21\u9519\u8BEF\u6CA1\u6709\u7559\u4E0B\u66F4\u591A\u8FD0\u884C\u65E5\u5FD7\u3002</p>\n : <pre className=\"dshc-cli-log\">{log}</pre>}\n </section>\n </div>\n <div className=\"dshc-dialog-actions\">\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-ghost\"\n disabled={loading || fullText === ''}\n onClick={copy}\n >\n {copied ? <IconCheck size={14} /> : copyFailed ? <IconAlert size={14} /> : <IconCopy size={14} />}\n {copied ? '\u5DF2\u590D\u5236' : copyFailed ? '\u590D\u5236\u5931\u8D25' : '\u590D\u5236\u65E5\u5FD7'}\n </button>\n <span className=\"dshc-dialog-actions-right\">\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" onClick={onClose}>\u5173\u95ED</button>\n </span>\n </div>\n </div>\n </div>\n )\n}\n\nfunction CliLogo({ connector, size }: { connector: CliConnectorView; size: number }): JSX.Element {\n const src = CLI_ICONS[connector.id]\n return src === undefined\n ? <span className=\"dshc-logo-fallback\" style={{ width: size, height: size }}>{connector.name.slice(0, 1)}</span>\n : <img className=\"dshc-logo-img\" width={size} height={size} src={src} alt=\"\" />\n}\n\ninterface CardTip {\n text: string\n left: number\n top: number\n}\n\ninterface CardProps {\n card: ConnectorCard\n connection?: ConnectionView\n errorMessage?: string\n togglePending: boolean\n authorizing: boolean\n installing: boolean\n connecting: boolean\n onOpen: () => void\n onInstall: () => void\n onAuthorize: () => void\n onCancelAuthorize: () => void\n onUpdateCredential?: () => void\n onReauthorize?: () => void\n onReconfigureInstance?: () => void\n onRevoke?: () => void\n onTrial: () => void\n onToggle: (enabled: boolean) => void\n onDisconnect: () => void\n onDelete?: () => void\n onEditCustom?: () => void\n}\n\nfunction ConnectorCardView({ card, connection, errorMessage, togglePending, authorizing, installing, connecting, onOpen, onInstall, onAuthorize, onCancelAuthorize, onUpdateCredential, onReauthorize, onReconfigureInstance, onRevoke, onTrial, onToggle, onDisconnect, onDelete, onEditCustom }: CardProps): JSX.Element {\n const [menuOpen, setMenuOpen] = useState(false)\n const [menuAbove, setMenuAbove] = useState(false)\n const [tip, setTip] = useState<CardTip | null>(null)\n const menuRef = useRef<HTMLSpanElement>(null)\n const connected = connection !== undefined && connection.authorized && connection.enabled && connection.error === undefined\n const unauthorized = connection !== undefined && !connection.authorized\n const toolCount = connection?.tools.length ?? 0\n const error = connection?.error ?? errorMessage\n const enabled = connection?.enabled === true\n\n const toggleMenu = (button: HTMLElement): void => {\n const rect = button.getBoundingClientRect()\n setMenuAbove(rect.bottom + 170 > window.innerHeight)\n setMenuOpen(current => !current)\n }\n\n useEffect(() => {\n if (tip === null) return\n const close = (): void => setTip(null)\n window.addEventListener('pointerdown', close, true)\n return () => window.removeEventListener('pointerdown', close, true)\n }, [tip])\n\n const showTip = (element: HTMLElement): void => {\n // line-clamp \u4E0B\u53EA\u6709 scrollHeight \u8D85\u51FA\u624D\u4EE3\u8868\u6587\u672C\u88AB\u622A\u65AD\n if (element.scrollHeight <= element.clientHeight + 1) return\n const rect = element.getBoundingClientRect()\n const width = Math.min(360, window.innerWidth - 32)\n const left = Math.max(16, Math.min(rect.left, window.innerWidth - width - 16))\n setTip({ text: card.summary, left, top: rect.bottom + 8 })\n }\n\n useEffect(() => {\n if (!menuOpen) return\n const onPointerDown = (event: PointerEvent): void => {\n if (menuRef.current !== null && !menuRef.current.contains(event.target as Node)) setMenuOpen(false)\n }\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') setMenuOpen(false)\n }\n window.addEventListener('pointerdown', onPointerDown, true)\n window.addEventListener('keydown', onKeyDown)\n return () => {\n window.removeEventListener('pointerdown', onPointerDown, true)\n window.removeEventListener('keydown', onKeyDown)\n }\n }, [menuOpen])\n\n const actionClass = error !== undefined\n ? 'dshc-card-action dshc-card-action-error'\n : connection === undefined\n ? 'dshc-card-action dshc-card-action-connect'\n : enabled\n ? 'dshc-card-action dshc-card-action-connected'\n : 'dshc-card-action dshc-card-action-disabled'\n const instancePending = card.instance !== undefined\n && connection !== undefined\n && connection.instanceReady !== true\n const actionText = connecting ? '\u8FDE\u63A5\u4E2D\u2026' : error ?? (connection === undefined\n ? '\u67E5\u770B\u8BE6\u60C5'\n : unauthorized\n ? (instancePending ? '\u5F85\u914D\u7F6E' : '\u672A\u6388\u6743')\n : !enabled\n ? '\u5DF2\u505C\u7528'\n : toolCount > 0\n ? `\u5DF2\u8FDE\u63A5 \u00B7 ${toolCount} \u4E2A\u5DE5\u5177\\n${connection.tools.join('\\n')}`\n : '\u5DF2\u8FDE\u63A5 \u00B7 \u6CE8\u518C\u4E2D')\n const installActionClass = installing\n ? 'dshc-card-action dshc-card-action-connect dshc-card-action-loading'\n : 'dshc-card-action dshc-card-action-connect'\n const installLabel = installing ? '\u5B89\u88C5\u4E2D\u2026' : error !== undefined ? '\u91CD\u8BD5' : '\u5B89\u88C5'\n const stateLabel = connecting\n ? '\uFF0C\u8FDE\u63A5\u4E2D'\n : error !== undefined\n ? '\uFF0C\u8FDE\u63A5\u5931\u8D25'\n : connection === undefined\n ? ''\n : unauthorized\n ? (instancePending ? '\uFF0C\u5F85\u914D\u7F6E' : '\uFF0C\u672A\u6388\u6743')\n : !enabled\n ? '\uFF0C\u5DF2\u505C\u7528'\n : toolCount > 0 ? `\uFF0C\u5DF2\u8FDE\u63A5\uFF0C${toolCount} \u4E2A\u5DE5\u5177` : '\uFF0C\u5DF2\u8FDE\u63A5\uFF0C\u6B63\u5728\u6CE8\u518C\u5DE5\u5177'\n const deleteItem = (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item dshc-menu-item-danger\"\n onClick={() => {\n setMenuOpen(false)\n if (onDelete !== undefined) onDelete()\n else onDisconnect()\n }}\n >\n <IconTrash size={14} />\n \u5220\u9664\n </button>\n )\n const disconnectItem = onDelete === undefined ? null : (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n onClick={() => {\n setMenuOpen(false)\n onDisconnect()\n }}\n >\n <IconPlug size={14} />\n \u65AD\u5F00\n </button>\n )\n const reconfigureItem = onReconfigureInstance === undefined ? null : (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n disabled={authorizing}\n onClick={() => {\n setMenuOpen(false)\n onReconfigureInstance()\n }}\n >\n <IconServer size={14} />\n \u66F4\u6362{instanceNoun(card)}\n </button>\n )\n const editItem = onEditCustom === undefined ? null : (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n disabled={authorizing}\n onClick={() => {\n setMenuOpen(false)\n onEditCustom()\n }}\n >\n <IconPencil size={14} />\n \u7F16\u8F91\u914D\u7F6E\n </button>\n )\n\n return (\n <>\n <article\n className={menuOpen ? 'dshc-card dshc-card-menu-open' : 'dshc-card'}\n role=\"button\"\n tabIndex={0}\n aria-label={`\u67E5\u770B ${card.name}${stateLabel}`}\n onClick={() => {\n if (menuOpen) {\n setMenuOpen(false)\n return\n }\n onOpen()\n }}\n onKeyDown={event => {\n if (event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onOpen()\n }\n }}\n >\n <div className=\"dshc-card-top\">\n <span className=\"dshc-avatar\"><ConnectorLogo card={card} /></span>\n <div className=\"dshc-card-title\">\n <strong>{card.name}</strong>\n <span>{card.vendor ?? card.server.transport}</span>\n </div>\n </div>\n <p\n className=\"dshc-summary\"\n onMouseEnter={event => showTip(event.currentTarget)}\n onMouseLeave={() => setTip(null)}\n onPointerLeave={() => setTip(null)}\n >\n {card.summary}\n </p>\n {error !== undefined && <p className=\"dshc-card-error\" title={error}>{error}</p>}\n <div className=\"dshc-card-foot\">\n <span className=\"dshc-badge\">{card.category}</span>\n {connection === undefined ? (\n <span className=\"dshc-card-install-actions\">\n {onDelete !== undefined && (\n <span className=\"dshc-card-more-wrap dshc-card-more-float\" ref={menuRef}>\n <button\n type=\"button\"\n className=\"dshc-card-more\"\n aria-label={`${card.name} \u66F4\u591A\u64CD\u4F5C`}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={event => {\n event.stopPropagation()\n toggleMenu(event.currentTarget)\n }}\n >\n <IconMore size={16} />\n </button>\n {menuOpen && (\n <span className={menuAbove ? 'dshc-menu dshc-menu-above' : 'dshc-menu'} role=\"menu\" onClick={event => event.stopPropagation()}>\n {editItem}\n {deleteItem}\n </span>\n )}\n </span>\n )}\n <button\n type=\"button\"\n className={installActionClass}\n title={installLabel}\n aria-label={installing ? `\u6B63\u5728\u5B89\u88C5 ${card.name}` : `${installLabel} ${card.name}`}\n disabled={installing}\n onClick={event => {\n event.stopPropagation()\n onInstall()\n }}\n >\n {installing ? <Spinner /> : <IconPlus size={16} />}\n </button>\n </span>\n ) : unauthorized ? (\n <span className=\"dshc-card-auth-actions\">\n <button\n type=\"button\"\n className=\"dshc-card-auth\"\n aria-label={authorizing\n ? `\u53D6\u6D88\u6388\u6743 ${card.name}`\n : connecting\n ? `\u6B63\u5728\u8FDE\u63A5 ${card.name}`\n : `${instancePending ? '\u914D\u7F6E' : '\u6388\u6743'} ${card.name}`}\n disabled={connecting}\n onClick={event => {\n event.stopPropagation()\n if (authorizing) onCancelAuthorize()\n else if (!connecting) onAuthorize()\n }}\n >\n {(authorizing || connecting) && <Spinner inline />}\n {authorizing ? '\u53D6\u6D88\u6388\u6743' : connecting ? '\u8FDE\u63A5\u4E2D\u2026' : (instancePending ? '\u914D\u7F6E' : '\u6388\u6743')}\n </button>\n <span\n className=\"dshc-card-installed\"\n role=\"img\"\n aria-label={instancePending ? '\u5DF2\u5B89\u88C5\uFF0C\u5F85\u914D\u7F6E' : '\u5DF2\u5B89\u88C5\uFF0C\u5F85\u6388\u6743'}\n title={instancePending ? '\u5DF2\u5B89\u88C5\uFF0C\u5F85\u914D\u7F6E' : '\u5DF2\u5B89\u88C5\uFF0C\u5F85\u6388\u6743'}\n >\n <IconCheck size={14} />\n </span>\n <span className=\"dshc-card-more-wrap\" ref={menuRef}>\n <button\n type=\"button\"\n className=\"dshc-card-more\"\n aria-label={`${card.name} \u66F4\u591A\u64CD\u4F5C`}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={event => {\n event.stopPropagation()\n toggleMenu(event.currentTarget)\n }}\n >\n <IconMore size={16} />\n </button>\n {menuOpen && (\n <span className={menuAbove ? 'dshc-menu dshc-menu-above' : 'dshc-menu'} role=\"menu\" onClick={event => event.stopPropagation()}>\n {reconfigureItem}\n {editItem}\n {disconnectItem}\n {deleteItem}\n </span>\n )}\n </span>\n </span>\n ) : (\n <span className=\"dshc-card-actions\">\n <span className={`${actionClass} dshc-card-status`} title={connecting ? '\u8FDE\u63A5\u4E2D\u2026' : authorizing ? '\u6388\u6743\u4E2D\u2026' : actionText} aria-hidden>\n {(authorizing || connecting)\n ? <Spinner />\n : error !== undefined\n ? <IconAlert size={16} />\n : <IconCheck size={16} />}\n </span>\n <span className=\"dshc-card-controls\">\n <span className=\"dshc-card-more-wrap\" ref={menuRef}>\n <button\n type=\"button\"\n className=\"dshc-card-more\"\n aria-label={`${card.name} \u66F4\u591A\u64CD\u4F5C`}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={event => {\n event.stopPropagation()\n toggleMenu(event.currentTarget)\n }}\n >\n <IconMore size={16} />\n </button>\n {menuOpen && (\n <span className={menuAbove ? 'dshc-menu dshc-menu-above' : 'dshc-menu'} role=\"menu\" onClick={event => event.stopPropagation()}>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n disabled={!connected || toolCount === 0}\n onClick={() => {\n setMenuOpen(false)\n onTrial()\n }}\n >\n <IconPlay size={14} />\n \u53BB\u8BD5\u8BD5\n </button>\n {onUpdateCredential !== undefined && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n onClick={() => {\n setMenuOpen(false)\n onUpdateCredential()\n }}\n >\n <IconRefresh size={14} />\n \u66F4\u65B0\u4EE4\u724C\n </button>\n )}\n {onReauthorize !== undefined && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n onClick={() => {\n setMenuOpen(false)\n onReauthorize()\n }}\n >\n <IconRefresh size={14} />\n \u91CD\u65B0\u6388\u6743\n </button>\n )}\n {reconfigureItem}\n {onRevoke !== undefined && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dshc-menu-item\"\n onClick={() => {\n setMenuOpen(false)\n onRevoke()\n }}\n >\n <IconLink size={14} />\n \u53D6\u6D88\u6388\u6743\n </button>\n )}\n {editItem}\n {disconnectItem}\n {deleteItem}\n </span>\n )}\n </span>\n {togglePending\n ? <span className=\"dshc-card-toggle\" role=\"status\" aria-label=\"\u5904\u7406\u4E2D\">\n <Spinner />\n </span>\n : <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={enabled ? `\u505C\u7528 ${card.name}` : `\u542F\u7528 ${card.name}`}\n title={enabled ? '\u505C\u7528' : '\u542F\u7528'}\n className=\"dshc-switch\"\n onClick={event => {\n event.stopPropagation()\n onToggle(!enabled)\n }}\n />}\n </span>\n </span>\n )}\n </div>\n </article>\n {tip !== null && createPortal(\n <div className=\"dshc-card-tip\" style={{ left: tip.left, top: tip.top }}>\n {tip.text}\n </div>,\n document.body,\n )}\n </>\n )\n}\n\ninterface ConnectorDialogProps {\n card: ConnectorCard\n connection?: ConnectionView\n pending: boolean\n toggling: boolean\n authorizing: boolean\n connecting: boolean\n authorizeLink: string | null\n installOpen: boolean\n error: string | null\n behind?: boolean\n escLocked?: boolean\n onClose: () => void\n onBeginInstall: () => void\n onCancelInstall: () => void\n onConnect: (token?: string) => Promise<boolean>\n onInstallOAuth: () => void\n onConfigureInstance: () => void\n onAuthorize: () => void\n onReauthorize: () => void\n onReconfigureInstance?: () => void\n onUpdateCredential: () => void\n onCancelAuthorize: () => void\n onTryExample: (example: string) => void\n onRevoke: () => void\n onDisconnect: () => void\n onToggle: (enabled: boolean) => void\n onDelete?: () => void\n onEditCustom?: () => void\n}\n\nfunction ConnectorDialog({ card, connection, pending, toggling, authorizing, connecting, authorizeLink, installOpen, error, behind = false, escLocked = false, onClose, onBeginInstall, onCancelInstall, onConnect, onInstallOAuth, onConfigureInstance, onAuthorize, onReauthorize, onReconfigureInstance, onUpdateCredential, onCancelAuthorize, onTryExample, onRevoke, onDisconnect, onToggle, onDelete, onEditCustom }: ConnectorDialogProps): JSX.Element {\n const [copied, setCopied] = useState<number | null>(null)\n const [copyFailed, setCopyFailed] = useState<number | null>(null)\n const [showAllTools, setShowAllTools] = useState(false)\n const [toolQuery, setToolQuery] = useState('')\n const toolSearchRef = useRef<HTMLInputElement>(null)\n const [exampleTip, setExampleTip] = useState<{\n index: number\n action: 'copy' | 'try'\n left: number\n top: number\n above: boolean\n } | null>(null)\n useEffect(() => {\n setToolQuery('')\n }, [card.id])\n\n const needsToken = isTokenCard(card)\n const oauth = isOAuthCard(card)\n const unauthorized = connection !== undefined && !connection.authorized\n const instancePending = card.instance !== undefined\n && connection !== undefined\n && connection.instanceReady !== true\n const disabled = connection !== undefined && connection.authorized && !connection.enabled\n const connected = connection !== undefined && connection.authorized && connection.enabled && connection.error === undefined\n const noneConnecting = connecting && !oauth && !needsToken\n const toolDetails: ToolInfo[] = connection?.toolDetails ?? (connection?.tools ?? []).map(name => ({ name }))\n const canTry = connected && toolDetails.length > 0\n const visibleTools = showAllTools ? toolDetails : toolDetails.slice(0, 4)\n const toolQueryText = toolQuery.trim().toLowerCase()\n const filteredTools = toolQueryText === ''\n ? toolDetails\n : toolDetails.filter(tool => `${shortToolName(tool.name, connection?.serverName)} ${tool.name} ${tool.description ?? ''}`\n .toLowerCase()\n .includes(toolQueryText))\n const shownTools = toolQueryText === '' ? visibleTools : filteredTools\n const examples = card.examples ?? []\n const instance = card.instance\n const showingInstall = installOpen && instance === undefined && connection === undefined && !needsToken\n const needsInstanceConfig = instance !== undefined\n && connection !== undefined\n && !connection.authorized\n && connection.instanceReady !== true\n const busy = pending || toggling\n const removeLabel = onDelete === undefined ? '\u5220\u9664' : '\u65AD\u5F00'\n const removingLabel = onDelete === undefined ? '\u5220\u9664\u4E2D\u2026' : '\u65AD\u5F00\u4E2D\u2026'\n const removeClass = onDelete === undefined\n ? 'dshc-btn dshc-btn-md dshc-btn-outline dshc-btn-danger'\n : 'dshc-btn dshc-btn-md dshc-btn-outline'\n\n useEffect(() => {\n setCopied(null)\n setCopyFailed(null)\n setShowAllTools(false)\n }, [card.id])\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && !escLocked) onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose, busy, escLocked])\n\n const copyExample = (index: number, text: string): void => {\n void (async () => {\n try {\n await writeClipboard(text)\n setCopied(index)\n setCopyFailed(null)\n window.setTimeout(() => setCopied(current => (current === index ? null : current)), 1500)\n } catch {\n setCopyFailed(index)\n setCopied(null)\n window.setTimeout(() => setCopyFailed(current => (current === index ? null : current)), 2000)\n }\n })()\n }\n\n const showExampleTip = (element: HTMLElement, index: number, action: 'copy' | 'try'): void => {\n const rect = element.getBoundingClientRect()\n const above = rect.bottom + 34 > window.innerHeight\n setExampleTip({\n index,\n action,\n left: rect.left + rect.width / 2,\n top: above ? rect.top - 6 : rect.bottom + 6,\n above,\n })\n }\n\n const exampleTipText = exampleTip === null\n ? null\n : exampleTip.action === 'try'\n ? '\u53BB\u8BD5\u8BD5'\n : copied === exampleTip.index\n ? '\u5DF2\u590D\u5236'\n : copyFailed === exampleTip.index\n ? '\u590D\u5236\u5931\u8D25'\n : '\u590D\u5236'\n\n const statusText = connecting && connection !== undefined && connection.error === undefined\n ? '\u8FDE\u63A5\u4E2D'\n : connection === undefined\n ? '\u672A\u8FDE\u63A5'\n : unauthorized\n ? (authorizing ? '\u6388\u6743\u4E2D' : instancePending ? '\u5F85\u914D\u7F6E' : '\u672A\u6388\u6743')\n : disabled\n ? '\u5DF2\u505C\u7528'\n : connected\n ? '\u5DF2\u8FDE\u63A5'\n : '\u8FDE\u63A5\u5931\u8D25'\n const statusClass = connection === undefined || unauthorized || disabled\n ? 'dshc-status-pill'\n : connected\n ? 'dshc-status-pill dshc-status-pill-connected'\n : 'dshc-status-pill dshc-status-pill-error'\n\n return (\n <div\n className={behind ? 'dshc-overlay dshc-overlay-behind' : 'dshc-overlay'}\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div className=\"dshc-dialog dshc-dialog-detail\" role=\"dialog\" aria-modal=\"true\" aria-label={card.name}>\n <div className=\"dshc-dialog-head dshc-dialog-head-detail\">\n <span className=\"dshc-avatar dshc-dialog-avatar dshc-dialog-avatar-lg\"><ConnectorLogo card={card} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>{card.name}</h2>\n <span>{[card.vendor, card.category].filter(Boolean).join(' \u00B7 ')}</span>\n </div>\n <span className={`${statusClass} dshc-dialog-status-pill`}>{statusText}</span>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n\n <div className=\"dshc-dialog-content\">\n <p className=\"dshc-dialog-body\">{card.description ?? card.summary}</p>\n {connection?.error !== undefined && <p className=\"dshc-dialog-error\">{connection.error}</p>}\n\n {needsInstanceConfig && (\n <p className=\"dshc-dialog-hint\">\n {card.instance?.presets === undefined\n ? `\u70B9\u51FB\u300C\u914D\u7F6E\u300D\u586B\u5199\u5B8C\u6574\u7684 MCP \u5730\u5740\uFF1B\u5730\u5740\u53EA\u4FDD\u5B58\u5728\u672C\u673A\u3002`\n : `\u70B9\u51FB\u300C\u914D\u7F6E\u300D\u9009\u62E9${instanceNoun(card)}\uFF1B\u9009\u62E9\u7ED3\u679C\u53EA\u4FDD\u5B58\u5728\u672C\u673A\u3002`}\n </p>\n )}\n\n {needsToken && connection !== undefined && !connection.authorized && !needsInstanceConfig && (\n <p className=\"dshc-dialog-hint\">\u70B9\u51FB\u300C\u6388\u6743\u300D\u540E\u586B\u5199 {tokenLabel(card)}\uFF1B\u4EE4\u724C\u53EA\u4FDD\u5B58\u5728\u672C\u673A\u3002</p>\n )}\n {needsToken && connection?.authorized === true && connection.error !== undefined && (\n <p className=\"dshc-dialog-hint\">\u70B9\u51FB\u300C\u66F4\u65B0\u4EE4\u724C\u300D\u91CD\u65B0\u586B\u5199 {tokenLabel(card)}\u3002</p>\n )}\n {oauth && connection === undefined && !showingInstall && (\n <p className=\"dshc-dialog-hint\">\u70B9\u51FB\u300C\u5B89\u88C5\u300D\u540E\u4F1A\u6253\u5F00\u9ED8\u8BA4\u6D4F\u89C8\u5668\u5B8C\u6210 {card.name} \u6388\u6743\u3002</p>\n )}\n {oauth && unauthorized && (\n <p className=\"dshc-dialog-hint\">\n {authorizing\n ? '\u5DF2\u6253\u5F00\u6388\u6743\u9875\uFF0C\u5B8C\u6210\u6388\u6743\u540E\u4F1A\u81EA\u52A8\u540C\u6B65\uFF1B\u5982\u5DF2\u5173\u95ED\u6388\u6743\u9875\uFF0C\u8BF7\u70B9\u300C\u53D6\u6D88\u6388\u6743\u300D\u540E\u91CD\u8BD5\u3002'\n : needsInstanceConfig\n ? `\u5DF2\u5B89\u88C5\uFF0C\u70B9\u51FB\u300C\u914D\u7F6E\u300D\u9009\u62E9${instanceNoun(card)}\u540E\u5F00\u59CB\u6388\u6743\u3002`\n : `\u5DF2\u5B89\u88C5\uFF0C\u70B9\u51FB\u6388\u6743\u540E\u5728\u6D4F\u89C8\u5668\u5B8C\u6210 ${card.name} \u6388\u6743\u3002`}\n </p>\n )}\n {authorizeLink !== null && authorizing && (\n <p className=\"dshc-dialog-hint\">\n \u6CA1\u6709\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF1F\n <a className=\"dshc-link\" href={authorizeLink} target=\"_blank\" rel=\"noreferrer\">\u70B9\u6B64\u6388\u6743</a>\n </p>\n )}\n {error !== null && error !== connection?.error && <p className=\"dshc-dialog-error\">{error}</p>}\n\n {toolDetails.length > 0 && (\n <section className=\"dshc-tools\">\n <div className=\"dshc-tools-head\">\n <h3>\u53EF\u7528\u5DE5\u5177</h3>\n <span className=\"dshc-tools-count\">\n {toolQueryText === '' ? toolDetails.length : `${filteredTools.length}/${toolDetails.length}`}\n </span>\n <span className=\"dshc-tools-search-wrap\">\n <input\n ref={toolSearchRef}\n className=\"dshc-tools-search\"\n name=\"dsh-connector-tool-search\"\n type=\"text\"\n autoComplete=\"off\"\n data-lpignore=\"true\"\n data-1p-ignore=\"true\"\n data-bwignore=\"true\"\n spellCheck={false}\n aria-label=\"\u641C\u7D22\u5DE5\u5177\"\n placeholder=\"\u641C\u7D22\u5DE5\u5177\"\n value={toolQuery}\n onChange={event => setToolQuery(event.target.value)}\n />\n {toolQuery !== '' && (\n <button\n type=\"button\"\n className=\"dshc-tools-search-clear\"\n aria-label=\"\u6E05\u7A7A\u641C\u7D22\"\n title=\"\u6E05\u7A7A\u641C\u7D22\"\n onClick={() => {\n setToolQuery('')\n toolSearchRef.current?.focus()\n }}\n >\n <IconClose size={12} />\n </button>\n )}\n </span>\n </div>\n <div className=\"dshc-tool-list\">\n {shownTools.map(tool => (\n <ToolRow\n key={tool.name}\n name={shortToolName(tool.name, connection?.serverName)}\n description={tool.description}\n />\n ))}\n {toolQueryText !== '' && filteredTools.length === 0 && (\n <p className=\"dshc-tools-empty\">\u6CA1\u6709\u5339\u914D\u7684\u5DE5\u5177</p>\n )}\n </div>\n {toolQueryText === '' && toolDetails.length > 4 && (\n <button\n type=\"button\"\n className=\"dshc-tools-toggle\"\n onClick={() => setShowAllTools(current => !current)}\n >\n {showAllTools ? '\u6536\u8D77' : `\u5C55\u5F00\u5168\u90E8 ${toolDetails.length} \u4E2A`}\n </button>\n )}\n </section>\n )}\n {disabled && <p className=\"dshc-dialog-hint\">\u5DF2\u505C\u7528\uFF0C\u542F\u7528\u540E\u4F1A\u91CD\u65B0\u6CE8\u518C\u5DE5\u5177\u3002</p>}\n {connected && toolDetails.length === 0 && (\n <p className=\"dshc-dialog-hint\">{connecting ? '\u6B63\u5728\u8FDE\u63A5\u2026' : '\u6B63\u5728\u6CE8\u518C\u5DE5\u5177\u2026'}</p>\n )}\n\n {examples.length > 0 && (\n <section className=\"dshc-examples\">\n <h3>\u8BD5\u8BD5\u8FD9\u6837\u7528</h3>\n <div className=\"dshc-example-list\">\n {examples.map((example, index) => (\n <div className=\"dshc-example\" key={example}>\n <span className=\"dshc-example-text\">{example}</span>\n <span className=\"dshc-example-actions\">\n <button\n type=\"button\"\n className={copied === index\n ? 'dshc-example-action dshc-example-action-success'\n : copyFailed === index\n ? 'dshc-example-action dshc-example-action-error'\n : 'dshc-example-action'}\n aria-label={`\u590D\u5236\u793A\u4F8B\uFF1A${example}`}\n onMouseEnter={event => showExampleTip(event.currentTarget, index, 'copy')}\n onMouseLeave={() => setExampleTip(null)}\n onFocus={event => showExampleTip(event.currentTarget, index, 'copy')}\n onBlur={() => setExampleTip(null)}\n onClick={() => copyExample(index, promptForExample(card, example))}\n >\n {copied === index\n ? <IconCheck size={14} />\n : copyFailed === index\n ? <IconAlert size={14} />\n : <IconCopy size={14} />}\n </button>\n <button\n type=\"button\"\n className=\"dshc-example-action\"\n aria-label={`\u53BB\u8BD5\u8BD5\uFF1A${example}`}\n disabled={!canTry}\n onMouseEnter={event => showExampleTip(event.currentTarget, index, 'try')}\n onMouseLeave={() => setExampleTip(null)}\n onFocus={event => showExampleTip(event.currentTarget, index, 'try')}\n onBlur={() => setExampleTip(null)}\n onClick={() => onTryExample(example)}\n >\n <IconPlay size={14} />\n </button>\n </span>\n </div>\n ))}\n </div>\n </section>\n )}\n </div>\n\n <div className=\"dshc-dialog-actions\">\n {onDelete !== undefined && (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-ghost dshc-btn-danger\" disabled={busy} onClick={onDelete}>\n \u5220\u9664\n </button>\n )}\n {onEditCustom !== undefined && !authorizing && (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-ghost\" disabled={busy} onClick={onEditCustom}>\n \u7F16\u8F91\u914D\u7F6E\n </button>\n )}\n {onReconfigureInstance !== undefined && connection !== undefined && !authorizing && (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-ghost\" disabled={busy} onClick={onReconfigureInstance}>\n \u66F4\u6362{instanceNoun(card)}\n </button>\n )}\n {oauth && connection?.authorized === true && !authorizing && (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-ghost\" disabled={busy} onClick={onRevoke}>\n \u53D6\u6D88\u6388\u6743\n </button>\n )}\n <span className=\"dshc-dialog-actions-right\">\n {authorizing && connection?.authorized === true && (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onCancelAuthorize}>\n \u53D6\u6D88\u6388\u6743\n </button>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" disabled>\n <Spinner />\n \u6388\u6743\u4E2D\u2026\n </button>\n </>\n )}\n {unauthorized && (\n authorizing ? (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onCancelAuthorize}>\n \u53D6\u6D88\u6388\u6743\n </button>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" disabled>\n <Spinner />\n \u6388\u6743\u4E2D\u2026\n </button>\n </>\n ) : (\n <>\n <button type=\"button\" className={removeClass} disabled={busy} onClick={onDisconnect}>\n {removeLabel}\n </button>\n {needsInstanceConfig ? (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={onConfigureInstance}\n >\n {pending && <Spinner />}\n {pending ? '\u914D\u7F6E\u4E2D\u2026' : '\u914D\u7F6E'}\n </button>\n ) : oauth ? (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" disabled={busy} onClick={onAuthorize}>\n \u6388\u6743 {card.name}\n </button>\n ) : needsToken ? (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={onUpdateCredential}\n >\n {busy && <Spinner />}\n {busy ? '\u8FDE\u63A5\u4E2D\u2026' : `\u6388\u6743 ${card.name}`}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={() => onConnect(undefined)}\n >\n {pending ? '\u8FDE\u63A5\u4E2D\u2026' : '\u8FDE\u63A5'}\n </button>\n )}\n </>\n )\n )}\n {!authorizing && disabled && (\n <>\n <button type=\"button\" className={removeClass} disabled={busy} onClick={onDisconnect}>\n {removeLabel}\n </button>\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={() => onToggle(true)}\n >\n {toggling ? '\u542F\u7528\u4E2D\u2026' : '\u542F\u7528'}\n </button>\n </>\n )}\n {!authorizing && connected && (\n noneConnecting ? (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\n \u53D6\u6D88\n </button>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" disabled>\n <Spinner />\n \u8FDE\u63A5\u4E2D\u2026\n </button>\n </>\n ) : (\n <>\n <button type=\"button\" className={removeClass} disabled={busy} onClick={onDisconnect}>\n {pending && !connecting ? removingLabel : removeLabel}\n </button>\n {oauth && (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-ghost\" disabled={busy} onClick={onReauthorize}>\n \u91CD\u65B0\u6388\u6743\n </button>\n )}\n {needsToken && (\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-ghost\" disabled={busy} onClick={onUpdateCredential}>\n {pending && <Spinner />}\n {pending ? '\u66F4\u65B0\u4E2D\u2026' : '\u66F4\u65B0\u4EE4\u724C'}\n </button>\n )}\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-primary\" disabled={busy} onClick={onClose}>\n {connecting && <Spinner />}\n {connecting ? '\u8FDE\u63A5\u4E2D\u2026' : '\u5B8C\u6210'}\n </button>\n </>\n )\n )}\n {!authorizing && connection !== undefined && connection.authorized && !connected && !disabled && (\n <>\n <button type=\"button\" className={removeClass} disabled={busy} onClick={onDisconnect}>\n {removeLabel}\n </button>\n {oauth ? (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={onReauthorize}\n >\n {pending ? '\u6388\u6743\u4E2D\u2026' : '\u91CD\u65B0\u6388\u6743'}\n </button>\n ) : needsToken ? (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={onUpdateCredential}\n >\n {pending && <Spinner />}\n {pending ? '\u66F4\u65B0\u4E2D\u2026' : '\u66F4\u65B0\u4EE4\u724C'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={() => onConnect(undefined)}\n >\n {pending ? '\u91CD\u8BD5\u4E2D\u2026' : '\u91CD\u8BD5'}\n </button>\n )}\n </>\n )}\n {connection === undefined && showingInstall && (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" disabled={busy} onClick={onCancelInstall}>\n \u53D6\u6D88\n </button>\n {oauth && (\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={onInstallOAuth}\n >\n {pending && <Spinner />}\n {pending ? '\u5B89\u88C5\u4E2D\u2026' : '\u5B89\u88C5'}\n </button>\n )}\n </>\n )}\n {connection === undefined && !showingInstall && (\n <>\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\n \u5173\u95ED\n </button>\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={busy}\n onClick={onBeginInstall}\n >\n {pending && <Spinner />}\n {pending ? '\u5B89\u88C5\u4E2D\u2026' : '\u5B89\u88C5'}\n </button>\n </>\n )}\n </span>\n </div>\n </div>\n {exampleTip !== null && exampleTipText !== null && createPortal(\n <div\n className={exampleTip.above\n ? 'dshc-card-tip dshc-action-tip dshc-action-tip-above'\n : 'dshc-card-tip dshc-action-tip'}\n style={{ left: exampleTip.left, top: exampleTip.top }}\n >\n {exampleTipText}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n\ninterface InstanceDialogProps {\n card: ConnectorCard\n mode: 'config' | 'replace'\n pending: boolean\n error: string | null\n onClose: () => void\n onSubmit: (instanceUrl: string) => void\n}\n\nfunction InstanceDialog({ card, mode, pending, error, onClose, onSubmit }: InstanceDialogProps): JSX.Element {\n const instance = card.instance\n const presets = instance?.presets\n const [instanceUrl, setInstanceUrl] = useState(presets?.[0]?.url ?? '')\n const config = mode === 'config'\n const noun = instanceNoun(card)\n const selectedPreset = presets?.find(item => item.url === instanceUrl)\n const title = presets === undefined\n ? (config ? '\u586B\u5199\u5730\u5740' : '\u66F4\u6362\u5730\u5740')\n : (config ? `\u9009\u62E9${noun}` : `\u66F4\u6362${noun}`)\n const submitLabel = config\n ? (isOAuthCard(card) ? '\u4FDD\u5B58\u5E76\u6388\u6743' : isTokenCard(card) ? '\u4FDD\u5B58\u5E76\u7EE7\u7EED' : '\u4FDD\u5B58\u5E76\u8FDE\u63A5')\n : (isOAuthCard(card) ? '\u4FDD\u5B58\u5E76\u91CD\u65B0\u6388\u6743' : isTokenCard(card) ? '\u4FDD\u5B58' : '\u4FDD\u5B58\u5E76\u91CD\u65B0\u8FDE\u63A5')\n const keepLocal = presets === undefined ? '\u5730\u5740\u53EA\u4FDD\u5B58\u5728\u672C\u673A\u3002' : '\u9009\u62E9\u7ED3\u679C\u53EA\u4FDD\u5B58\u5728\u672C\u673A\u3002'\n const configHint = isOAuthCard(card)\n ? `\u4FDD\u5B58\u540E\u4F1A\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\u5B8C\u6210\u6388\u6743\uFF1B${keepLocal}`\n : isTokenCard(card)\n ? `\u4FDD\u5B58\u540E\u7EE7\u7EED\u586B\u5199\u4EE4\u724C\uFF1B${keepLocal}`\n : `\u4FDD\u5B58\u540E\u76F4\u63A5\u8FDE\u63A5\uFF1B${keepLocal}`\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && !pending) onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose, pending])\n\n const submit = (): void => {\n if (pending || instanceUrl.trim() === '') return\n onSubmit(instanceUrl.trim())\n }\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget && !pending) onClose()\n }}\n >\n <form\n className=\"dshc-dialog dshc-dialog-instance\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`${config ? '\u586B\u5199' : '\u66F4\u6362'} ${card.name} ${noun}`}\n noValidate\n onSubmit={event => {\n event.preventDefault()\n submit()\n }}\n >\n <div className=\"dshc-dialog-head\">\n <span className=\"dshc-dialog-avatar\"><ConnectorLogo card={card} size={28} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>{title}</h2>\n <span>{card.name}</span>\n </div>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" disabled={pending} onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n <p className=\"dshc-dialog-hint\">\n {config ? configHint : '\u66F4\u6362\u540E\u4F1A\u65AD\u5F00\u5F53\u524D\u8FDE\u63A5\u3001\u6E05\u9664\u5DF2\u6709\u51ED\u636E\uFF0C\u9700\u8981\u91CD\u65B0\u914D\u7F6E\u6216\u6388\u6743\u3002'}\n </p>\n <label className=\"dshc-field\">\n <span>{instance?.label ?? '\u670D\u52A1\u5730\u5740'}</span>\n {presets === undefined\n ? (\n <input\n autoFocus\n type=\"url\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={pending}\n placeholder={instance?.placeholder ?? 'https://gitlab.example.com'}\n value={instanceUrl}\n onChange={event => setInstanceUrl(event.target.value)}\n />\n )\n : (\n <span className=\"dshc-select\">\n <span className=\"dshc-select-control\">\n <select\n autoFocus\n disabled={pending}\n value={instanceUrl}\n onChange={event => setInstanceUrl(event.target.value)}\n >\n {presets.map(item => (\n <option key={item.url} value={item.url}>{item.label}</option>\n ))}\n </select>\n <span className=\"dshc-select-toggle dshc-select-toggle-static\" aria-hidden=\"true\">\n <IconChevronDown size={14} />\n </span>\n </span>\n </span>\n )}\n </label>\n {selectedPreset?.hint !== undefined && <p className=\"dshc-dialog-hint\">{selectedPreset.hint}</p>}\n {instance?.hint !== undefined && <p className=\"dshc-dialog-hint\">{instance.hint}</p>}\n {instance?.help !== undefined && (\n <p className=\"dshc-dialog-hint\">\n <a className=\"dshc-link\" href={instance.help.url} target=\"_blank\" rel=\"noreferrer\">\n {instance.help.label}\n </a>\n {instance.help.hint !== undefined && <span>\u3000{instance.help.hint}</span>}\n </p>\n )}\n {presets === undefined && instanceUrl.trim().startsWith('http://') && (\n <p className=\"dshc-dialog-hint\">\u975E https \u5730\u5740\u4F1A\u660E\u6587\u4F20\u8F93\uFF0C\u8BF7\u786E\u8BA4\u7F51\u7EDC\u53EF\u4FE1\u3002</p>\n )}\n {error !== null && <p className=\"dshc-dialog-error\">{error}</p>}\n </div>\n <div className=\"dshc-dialog-actions\">\n <span className=\"dshc-dialog-actions-right\">\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" disabled={pending} onClick={onClose}>\n {pending ? '\u5173\u95ED' : '\u53D6\u6D88'}\n </button>\n <button\n type=\"submit\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={pending || instanceUrl.trim() === ''}\n >\n {pending && <Spinner />}\n {pending ? '\u4FDD\u5B58\u4E2D\u2026' : submitLabel}\n </button>\n </span>\n </div>\n </form>\n </div>\n )\n}\n\ninterface CredentialDialogProps {\n card: ConnectorCard\n mode: 'install' | 'update'\n saving: boolean\n error: string | null\n onClose: () => void\n onSubmit: (token: string) => void\n}\n\nfunction CredentialDialog({ card, mode, saving, error, onClose, onSubmit }: CredentialDialogProps): JSX.Element {\n const [token, setToken] = useState('')\n const [tokenVisible, setTokenVisible] = useState(false)\n const help = tokenHelp(card)\n const title = mode === 'install' ? '\u586B\u5199\u4EE4\u724C' : '\u66F4\u65B0\u4EE4\u724C'\n const submitLabel = mode === 'install' ? '\u8FDE\u63A5' : '\u4FDD\u5B58'\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose])\n\n const submit = (): void => {\n if (saving || token.trim() === '') return\n onSubmit(token)\n }\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div\n className=\"dshc-dialog dshc-dialog-credential\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={mode === 'install' ? `\u586B\u5199 ${card.name} \u4EE4\u724C` : `\u66F4\u65B0 ${card.name} \u4EE4\u724C`}\n >\n <div className=\"dshc-dialog-head\">\n <span className=\"dshc-dialog-avatar\"><ConnectorLogo card={card} size={28} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>{title}</h2>\n <span>{card.name}</span>\n </div>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n <p className=\"dshc-dialog-hint\">\n {mode === 'install'\n ? `\u586B\u5199 ${tokenLabel(card)} \u540E\u8FDE\u63A5\uFF1B\u4EE4\u724C\u53EA\u4FDD\u5B58\u5728\u672C\u673A\u3002`\n : '\u5F53\u524D\u4EE4\u724C\u4E0D\u4F1A\u663E\u793A\uFF1B\u4FDD\u5B58\u65B0\u4EE4\u724C\u540E\u7ACB\u5373\u66FF\u6362\u3002'}\n </p>\n <div className=\"dshc-field\">\n <label htmlFor=\"dshc-credential-token\">{tokenLabel(card)}</label>\n <span className=\"dshc-field-control\">\n <input\n id=\"dshc-credential-token\"\n name=\"dsh-connector-token\"\n type={tokenVisible ? 'text' : 'password'}\n autoFocus\n autoComplete=\"new-password\"\n data-lpignore=\"true\"\n data-1p-ignore=\"true\"\n data-bwignore=\"true\"\n disabled={saving}\n placeholder={mode === 'install' ? '\u7C98\u8D34\u4EE4\u724C' : '\u7C98\u8D34\u65B0\u4EE4\u724C'}\n value={token}\n onChange={event => setToken(event.target.value)}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n event.preventDefault()\n submit()\n }\n }}\n />\n <button\n type=\"button\"\n className=\"dshc-field-reveal\"\n aria-label={tokenVisible ? '\u9690\u85CF\u4EE4\u724C' : '\u663E\u793A\u4EE4\u724C'}\n title={tokenVisible ? '\u9690\u85CF\u4EE4\u724C' : '\u663E\u793A\u4EE4\u724C'}\n aria-pressed={tokenVisible}\n disabled={saving}\n onMouseDown={event => event.preventDefault()}\n onClick={() => setTokenVisible(current => !current)}\n >\n {tokenVisible ? <IconEyeOff size={16} /> : <IconEye size={16} />}\n </button>\n </span>\n </div>\n {help !== undefined && (\n <p className=\"dshc-dialog-hint\">\n <a className=\"dshc-link\" href={help.url} target=\"_blank\" rel=\"noreferrer\">\n {help.label}\n </a>\n {help.hint !== undefined && <span>\u3000{help.hint}</span>}\n </p>\n )}\n {error !== null && <p className=\"dshc-dialog-error\">{error}</p>}\n {saving && <p className=\"dshc-dialog-hint\">\u5173\u95ED\u5F39\u7A97\u4E0D\u4F1A\u4E2D\u65AD\u8FDE\u63A5\uFF0C\u7ED3\u679C\u4F1A\u663E\u793A\u5728\u5361\u7247\u4E0A\u3002</p>}\n </div>\n <div className=\"dshc-dialog-actions\">\n <span className=\"dshc-dialog-actions-right\">\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\n {saving ? '\u5173\u95ED' : '\u53D6\u6D88'}\n </button>\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={saving || token.trim() === ''}\n onClick={submit}\n >\n {saving && <Spinner />}\n {saving ? (mode === 'install' ? '\u8FDE\u63A5\u4E2D\u2026' : '\u4FDD\u5B58\u4E2D\u2026') : submitLabel}\n </button>\n </span>\n </div>\n </div>\n </div>\n )\n}\n\ninterface OAuthAppDialogProps {\n card: ConnectorCard\n saving: boolean\n error: string | null\n onClose: () => void\n onSubmit: (clientId: string, clientSecret: string) => void\n}\n\nfunction OAuthAppDialog({ card, saving, error, onClose, onSubmit }: OAuthAppDialogProps): JSX.Element {\n const [clientId, setClientId] = useState('')\n const [clientSecret, setClientSecret] = useState('')\n const [secretVisible, setSecretVisible] = useState(false)\n const [copied, setCopied] = useState(false)\n const help = card.auth.type === 'oauth2' ? card.auth.help : undefined\n const callback = oauthRedirectUri(card)\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose])\n\n const submit = (): void => {\n if (saving || clientId.trim() === '' || clientSecret.trim() === '') return\n onSubmit(clientId.trim(), clientSecret.trim())\n }\n\n const copyCallback = (): void => {\n void navigator.clipboard.writeText(callback).then(() => {\n setCopied(true)\n window.setTimeout(() => setCopied(false), 1500)\n }).catch(() => undefined)\n }\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}\n >\n <div className=\"dshc-dialog dshc-dialog-credential\" role=\"dialog\" aria-modal=\"true\" aria-label={`\u914D\u7F6E ${card.name} \u5E94\u7528`}>\n <div className=\"dshc-dialog-head\">\n <span className=\"dshc-dialog-avatar\"><ConnectorLogo card={card} size={28} /></span>\n <div className=\"dshc-dialog-title\">\n <h2>\u914D\u7F6E OAuth \u5E94\u7528</h2>\n <span>{card.name}</span>\n </div>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n <p className=\"dshc-dialog-hint\">\n \u5728{card.vendor ?? card.name}\u5F00\u653E\u5E73\u53F0\u521B\u5EFA\u5E94\u7528\uFF0C\u628A\u56DE\u8C03\u5730\u5740\u586B\u5230\u5E94\u7528\u7684\u5B89\u5168\u8BBE\u7F6E\u91CC\uFF0C\u518D\u586B\u5165\u5E94\u7528\u51ED\u636E\uFF1B\u51ED\u636E\u53EA\u4FDD\u5B58\u5728\u672C\u673A\u3002\n </p>\n <div className=\"dshc-field\">\n <label htmlFor=\"dshc-oauth-callback\">\u56DE\u8C03\u5730\u5740</label>\n <span className=\"dshc-field-control\">\n <input id=\"dshc-oauth-callback\" readOnly value={callback} onFocus={event => event.currentTarget.select()} />\n <button type=\"button\" className=\"dshc-field-copy\" onClick={copyCallback}>\n {copied ? '\u5DF2\u590D\u5236' : '\u590D\u5236'}\n </button>\n </span>\n </div>\n <div className=\"dshc-field\">\n <label htmlFor=\"dshc-oauth-client-id\">AppKey</label>\n <span className=\"dshc-field-control\">\n <input\n id=\"dshc-oauth-client-id\"\n name=\"dsh-oauth-client-id\"\n type=\"text\"\n autoFocus\n autoComplete=\"off\"\n data-lpignore=\"true\"\n data-1p-ignore=\"true\"\n data-bwignore=\"true\"\n spellCheck={false}\n disabled={saving}\n placeholder=\"\u5E94\u7528 AppKey / Client ID\"\n value={clientId}\n onChange={event => setClientId(event.target.value)}\n />\n </span>\n </div>\n <div className=\"dshc-field\">\n <label htmlFor=\"dshc-oauth-client-secret\">SecretKey</label>\n <span className=\"dshc-field-control\">\n <input\n id=\"dshc-oauth-client-secret\"\n name=\"dsh-oauth-client-secret\"\n type={secretVisible ? 'text' : 'password'}\n autoComplete=\"new-password\"\n data-lpignore=\"true\"\n data-1p-ignore=\"true\"\n data-bwignore=\"true\"\n disabled={saving}\n placeholder=\"\u5E94\u7528 SecretKey / Client Secret\"\n value={clientSecret}\n onChange={event => setClientSecret(event.target.value)}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n event.preventDefault()\n submit()\n }\n }}\n />\n <button\n type=\"button\"\n className=\"dshc-field-reveal\"\n aria-label={secretVisible ? '\u9690\u85CF SecretKey' : '\u663E\u793A SecretKey'}\n title={secretVisible ? '\u9690\u85CF SecretKey' : '\u663E\u793A SecretKey'}\n aria-pressed={secretVisible}\n disabled={saving}\n onMouseDown={event => event.preventDefault()}\n onClick={() => setSecretVisible(current => !current)}\n >\n {secretVisible ? <IconEyeOff size={16} /> : <IconEye size={16} />}\n </button>\n </span>\n </div>\n {help !== undefined && (\n <p className=\"dshc-dialog-hint\">\n <a className=\"dshc-link\" href={help.url} target=\"_blank\" rel=\"noreferrer\">{help.label}</a>\n {help.hint !== undefined && <span>\u3000{help.hint}</span>}\n </p>\n )}\n {error !== null && <p className=\"dshc-dialog-error\">{error}</p>}\n {saving && <p className=\"dshc-dialog-hint\">\u4FDD\u5B58\u540E\u4F1A\u6253\u5F00\u6D4F\u89C8\u5668\u5B8C\u6210\u6388\u6743\u3002</p>}\n </div>\n <div className=\"dshc-dialog-actions\">\n <span className=\"dshc-dialog-actions-right\">\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" onClick={onClose}>\n {saving ? '\u5173\u95ED' : '\u53D6\u6D88'}\n </button>\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={saving || clientId.trim() === '' || clientSecret.trim() === ''}\n onClick={submit}\n >\n {saving && <Spinner />}\n {saving ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u5E76\u6388\u6743'}\n </button>\n </span>\n </div>\n </div>\n </div>\n )\n}\n\ninterface CustomEditInfo {\n connectorId: string\n initial: CustomConfigView\n}\n\ninterface CustomDialogProps {\n onClose: () => void\n categoryOptions: string[]\n onImported: (connectors: ConnectorCard[], connectNow: boolean) => void\n editing?: CustomEditInfo\n onEdited?: (result: CustomUpdatePayload['value']) => void\n}\n\nfunction CustomConnectorDialog({ onClose, categoryOptions, onImported, editing, onEdited }: CustomDialogProps): JSX.Element {\n const [json, setJson] = useState(editing?.initial.json ?? MCP_SERVERS_PLACEHOLDER)\n const [description, setDescription] = useState('')\n const [category, setCategory] = useState('')\n const [examples, setExamples] = useState('')\n const [pending, setPending] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [privateWarning, setPrivateWarning] = useState(false)\n const [privateConfirmed, setPrivateConfirmed] = useState(false)\n const [categoryOpen, setCategoryOpen] = useState(false)\n const [categoryMenu, setCategoryMenu] = useState<{ left: number; top: number; width: number } | null>(null)\n const [helpTip, setHelpTip] = useState<{\n left: number\n top: number\n above: boolean\n kind: 'import' | 'x-dsh'\n } | null>(null)\n const categoryRef = useRef<HTMLDivElement>(null)\n const categoryMenuRef = useRef<HTMLDivElement>(null)\n const categoryInputRef = useRef<HTMLInputElement>(null)\n const helpHideTimerRef = useRef<number | null>(null)\n const helpHoverRef = useRef(false)\n const parsedJson = useMemo<{\n count: number\n meta: { description?: string; category?: string; examples?: string[] } | null\n }>(() => {\n try {\n const parsed = JSON.parse(json) as { mcpServers?: unknown }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { count: 0, meta: null }\n }\n const servers = parsed.mcpServers\n if (servers === null || typeof servers !== 'object' || Array.isArray(servers)) {\n return { count: 0, meta: null }\n }\n const entries = Object.entries(servers)\n if (entries.length !== 1) return { count: entries.length, meta: null }\n const server = entries[0]?.[1]\n if (server === null || typeof server !== 'object' || Array.isArray(server)) {\n return { count: 1, meta: null }\n }\n const xdsh = (server as Record<string, unknown>)['x-dsh']\n if (xdsh === null || typeof xdsh !== 'object' || Array.isArray(xdsh)) {\n return { count: 1, meta: null }\n }\n const record = xdsh as Record<string, unknown>\n const description = typeof record.description === 'string' && record.description.trim() !== ''\n ? record.description.trim()\n : undefined\n const category = typeof record.category === 'string' && record.category.trim() !== ''\n ? record.category.trim()\n : undefined\n const examples = Array.isArray(record.examples)\n ? record.examples\n .filter((item): item is string => typeof item === 'string' && item.trim() !== '')\n .map(item => item.trim())\n : undefined\n return {\n count: 1,\n meta: {\n ...(description === undefined ? {} : { description }),\n ...(category === undefined ? {} : { category }),\n ...(examples === undefined || examples.length === 0 ? {} : { examples }),\n },\n }\n } catch {\n return { count: 0, meta: null }\n }\n }, [json])\n const serverCount = parsedJson.count\n const jsonMeta = parsedJson.meta\n const hasJsonMeta = jsonMeta !== null\n && (jsonMeta.description !== undefined || jsonMeta.category !== undefined || jsonMeta.examples !== undefined)\n const previewMeta = jsonMeta\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || pending) return\n if (categoryOpen) {\n setCategoryOpen(false)\n return\n }\n onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose, pending, categoryOpen])\n\n useEffect(() => {\n if (!categoryOpen) return\n const onPointerDown = (event: PointerEvent): void => {\n const target = event.target as Node\n if (categoryRef.current?.contains(target) === true || categoryMenuRef.current?.contains(target) === true) return\n setCategoryOpen(false)\n }\n const close = (): void => setCategoryOpen(false)\n window.addEventListener('pointerdown', onPointerDown, true)\n window.addEventListener('scroll', close, true)\n window.addEventListener('resize', close)\n return () => {\n window.removeEventListener('pointerdown', onPointerDown, true)\n window.removeEventListener('scroll', close, true)\n window.removeEventListener('resize', close)\n }\n }, [categoryOpen])\n\n const openCategoryMenu = (): void => {\n const rect = categoryInputRef.current?.getBoundingClientRect()\n if (rect !== undefined) {\n setCategoryMenu({ left: rect.left, top: rect.bottom + 4, width: rect.width })\n }\n setCategoryOpen(true)\n }\n\n const cancelHelpTipHide = (): void => {\n if (helpHideTimerRef.current !== null) {\n window.clearTimeout(helpHideTimerRef.current)\n helpHideTimerRef.current = null\n }\n }\n\n const showHelpTip = (element: HTMLElement, kind: 'import' | 'x-dsh'): void => {\n cancelHelpTipHide()\n const rect = element.getBoundingClientRect()\n const width = Math.min(380, window.innerWidth - 32)\n const left = Math.max(16, Math.min(rect.left, window.innerWidth - width - 16))\n const above = rect.bottom + 220 > window.innerHeight\n setHelpTip({ left, top: above ? rect.top - 8 : rect.bottom + 8, above, kind })\n }\n\n const hideHelpTipSoon = (): void => {\n if (helpHoverRef.current) return\n cancelHelpTipHide()\n helpHideTimerRef.current = window.setTimeout(() => {\n helpHideTimerRef.current = null\n if (!helpHoverRef.current) setHelpTip(null)\n }, 140)\n }\n\n useEffect(() => () => cancelHelpTipHide(), [])\n\n const submit = (connectNow: boolean): void => {\n setPending(true)\n setError(null)\n const exampleLines = parseExampleLines(examples)\n void (async () => {\n try {\n const body = JSON.stringify({\n json,\n allowPrivate: privateWarning,\n ...(description.trim() === '' ? {} : { description: description.trim() }),\n ...(category.trim() === '' ? {} : { category: category.trim() }),\n ...(exampleLines.length === 0 ? {} : { examples: exampleLines }),\n })\n if (editing !== undefined) {\n const response = await request<CustomUpdatePayload>(\n `${ROUTE_PREFIX}/api/custom-connectors/${encodeURIComponent(editing.connectorId)}`,\n { method: 'PUT', body },\n )\n onEdited?.(response.value)\n return\n }\n const response = await request<CustomConnectorsPayload>(`${ROUTE_PREFIX}/api/custom-connectors`, {\n method: 'POST',\n body,\n })\n onImported(response.value.connectors, connectNow)\n onClose()\n } catch (cause) {\n if (cause instanceof ApiError && cause.code === 'private_url_confirmation') {\n setPrivateWarning(true)\n setPrivateConfirmed(false)\n setError(cause.message)\n } else {\n setError(cause instanceof Error ? cause.message : String(cause))\n }\n } finally {\n setPending(false)\n }\n })()\n }\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget && !pending) onClose()\n }}\n >\n <form\n className=\"dshc-dialog dshc-dialog-wide\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={editing === undefined ? '\u81EA\u5B9A\u4E49\u8FDE\u63A5\u5668' : '\u7F16\u8F91\u8FDE\u63A5\u5668\u914D\u7F6E'}\n onSubmit={event => {\n event.preventDefault()\n if (pending || json.trim() === '' || (privateWarning && !privateConfirmed)) return\n if (editing !== undefined) {\n if (serverCount === 1) submit(false)\n return\n }\n submit(serverCount === 1)\n }}\n >\n <div className=\"dshc-dialog-head\">\n <div className=\"dshc-dialog-head-title\">\n <h2>{editing === undefined ? '\u81EA\u5B9A\u4E49\u8FDE\u63A5\u5668' : '\u7F16\u8F91\u914D\u7F6E'}</h2>\n {editing === undefined && (\n <button\n type=\"button\"\n className=\"dshc-help-btn\"\n aria-label=\"\u81EA\u5B9A\u4E49\u8FDE\u63A5\u5668\u8BF4\u660E\"\n onMouseEnter={event => showHelpTip(event.currentTarget, 'import')}\n onMouseLeave={hideHelpTipSoon}\n onFocus={event => showHelpTip(event.currentTarget, 'import')}\n onBlur={hideHelpTipSoon}\n >\n <IconHelp size={14} />\n </button>\n )}\n </div>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" disabled={pending} onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n {editing?.initial.installed === true && (\n <p className=\"dshc-dialog-hint\">\n \u5F53\u524D\u5DF2\u5B89\u88C5\uFF1B\u5982\u4FEE\u6539\u5730\u5740\u3001\u547D\u4EE4\u3001\u8BF7\u6C42\u5934\u6216\u73AF\u5883\u53D8\u91CF\uFF0C\u4FDD\u5B58\u540E\u4F1A\u65AD\u5F00\u8FDE\u63A5\uFF0C\u9700\u8981\u91CD\u65B0\u5B89\u88C5\u3002\n </p>\n )}\n <div className=\"dshc-field\">\n <span className=\"dshc-field-label\">\n <span>mcpServers JSON</span>\n <button\n type=\"button\"\n className=\"dshc-help-btn\"\n aria-label=\"x-dsh \u8BF4\u660E\"\n onMouseEnter={event => showHelpTip(event.currentTarget, 'x-dsh')}\n onMouseLeave={hideHelpTipSoon}\n onFocus={event => showHelpTip(event.currentTarget, 'x-dsh')}\n onBlur={hideHelpTipSoon}\n >\n <IconHelp size={14} />\n </button>\n </span>\n <JsonEditor\n value={json}\n onChange={value => {\n setJson(value)\n setPrivateWarning(false)\n setPrivateConfirmed(false)\n setError(null)\n }}\n />\n </div>\n {editing !== undefined && (\n <p className=\"dshc-dialog-hint\">\n \u4FEE\u6539\u4F1A\u4FDD\u5B58\u5230\u672C\u673A\uFF1B\u5BC6\u94A5\u4E0E URL \u67E5\u8BE2\u53C2\u6570\u4E0D\u4F1A\u56DE\u663E\uFF0C\u4FDD\u6301 {CUSTOM_SECRET_PLACEHOLDER} \u4F1A\u6CBF\u7528\u539F\u503C\u3002\n </p>\n )}\n {hasJsonMeta && (\n <p className=\"dshc-dialog-hint\">\u5DF2\u8BFB\u53D6 JSON \u4E2D\u7684 x-dsh\uFF1B\u4E0B\u65B9\u7559\u7A7A\u5C31\u4F7F\u7528\u5B83\uFF0C\u586B\u5199\u4F1A\u8986\u76D6\u3002</p>\n )}\n <label className=\"dshc-field\">\n <span>\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09</span>\n <input\n autoComplete=\"off\"\n maxLength={120}\n placeholder={previewMeta?.description === undefined\n ? '\u4F8B\u5982\uFF1A\u901A\u8FC7 DeepWiki \u67E5\u8BE2\u4ED3\u5E93\u7ED3\u6784\u4E0E\u6587\u6863'\n : `JSON \u4E2D\uFF1A${previewMeta.description}`}\n value={description}\n onChange={event => setDescription(event.target.value)}\n />\n </label>\n <div className=\"dshc-field\">\n <span className=\"dshc-field-label\">\n <span>\u7C7B\u522B\uFF08\u53EF\u9009\uFF09</span>\n </span>\n <div className=\"dshc-select\" ref={categoryRef}>\n <div className=\"dshc-select-control\">\n <input\n ref={categoryInputRef}\n autoComplete=\"off\"\n placeholder={previewMeta?.category === undefined ? '\u9ED8\u8BA4\uFF1A\u5176\u4ED6' : `JSON \u4E2D\uFF1A${previewMeta.category}`}\n value={category}\n aria-expanded={categoryOpen}\n onFocus={openCategoryMenu}\n onChange={event => {\n setCategory(event.target.value)\n openCategoryMenu()\n }}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n event.preventDefault()\n setCategoryOpen(false)\n }\n }}\n />\n <button\n type=\"button\"\n className=\"dshc-select-toggle\"\n aria-label=\"\u9009\u62E9\u7C7B\u522B\"\n onMouseDown={event => event.preventDefault()}\n onClick={() => {\n if (categoryOpen) setCategoryOpen(false)\n else openCategoryMenu()\n }}\n >\n <IconChevronDown size={14} />\n </button>\n </div>\n </div>\n <p className=\"dshc-dialog-hint\">\n {previewMeta?.category === undefined\n ? '\u7559\u7A7A\u4F1A\u5F52\u5165\u300C\u5176\u4ED6\u300D\uFF1B\u53EF\u76F4\u63A5\u8F93\u5165\u65B0\u7C7B\u522B\u3002'\n : '\u7559\u7A7A\u4F7F\u7528 JSON \u4E2D\u7684\u7C7B\u522B\uFF1B\u586B\u5199\u4F1A\u8986\u76D6\u3002'}\n </p>\n </div>\n <label className=\"dshc-field\">\n <span>\u793A\u4F8B\u63D0\u793A\u8BCD\uFF08\u53EF\u9009\uFF0C\u6BCF\u884C\u4E00\u6761\uFF09</span>\n <textarea\n className=\"dshc-examples-input\"\n spellCheck={false}\n placeholder={previewMeta?.examples === undefined\n ? '\u7528 DeepWiki \u67E5\u4E00\u4E0B facebook/react \u7684\u4ED3\u5E93\u7ED3\u6784'\n : `JSON \u4E2D\uFF1A\\n${previewMeta.examples.join('\\n')}`}\n value={examples}\n onChange={event => setExamples(event.target.value)}\n />\n </label>\n {editing === undefined && serverCount > 1 && (\n <p className=\"dshc-warning\">\n \u68C0\u6D4B\u5230 {serverCount} \u4E2A Server\uFF1B\u591A Server \u8BF7\u7528\u300C\u4EC5\u5BFC\u5165\u300D\uFF0C\u5BFC\u5165\u540E\u5206\u522B\u8FDE\u63A5\u3002\n \u586B\u5199\u4E0B\u65B9\u63CF\u8FF0\u3001\u7C7B\u522B\u3001\u793A\u4F8B\u4F1A\u8986\u76D6\u6240\u6709 Server\uFF1B\u7559\u7A7A\u5219\u5404 Server \u4F7F\u7528\u81EA\u5DF1\u7684 x-dsh\u3002\n </p>\n )}\n {editing !== undefined && json.trim() !== '' && serverCount !== 1 && (\n <p className=\"dshc-warning\">\n \u7F16\u8F91\u65F6\u53EA\u80FD\u4FDD\u7559\u4E00\u4E2A Server\uFF0C\u5F53\u524D\u68C0\u6D4B\u5230 {serverCount} \u4E2A\u3002\n </p>\n )}\n {privateWarning && (\n <>\n <p className=\"dshc-warning\">{error}</p>\n <label className=\"dshc-check\">\n <input\n type=\"checkbox\"\n checked={privateConfirmed}\n onChange={event => setPrivateConfirmed(event.target.checked)}\n />\n \u6211\u786E\u8BA4\u5141\u8BB8\u8BBF\u95EE\u672C\u673A\u6216\u5185\u7F51\u5730\u5740\n </label>\n </>\n )}\n </div>\n {error !== null && !privateWarning && (\n <div className=\"dshc-dialog-alert\" role=\"alert\">{error}</div>\n )}\n <div className=\"dshc-dialog-actions\">\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" disabled={pending} onClick={onClose}>\n \u53D6\u6D88\n </button>\n {editing === undefined ? (\n <>\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-outline\"\n disabled={pending || json.trim() === '' || (privateWarning && !privateConfirmed)}\n onClick={() => submit(false)}\n >\n {privateWarning ? '\u4ECD\u7136\u4EC5\u5BFC\u5165' : '\u4EC5\u5BFC\u5165'}\n </button>\n <button\n type=\"submit\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={pending || json.trim() === '' || serverCount !== 1 || (privateWarning && !privateConfirmed)}\n >\n {pending ? '\u5BFC\u5165\u4E2D\u2026' : privateWarning ? '\u4ECD\u7136\u5BFC\u5165\u5E76\u8FDE\u63A5' : '\u5BFC\u5165\u5E76\u8FDE\u63A5'}\n </button>\n </>\n ) : (\n <button\n type=\"submit\"\n className=\"dshc-btn dshc-btn-md dshc-btn-primary\"\n disabled={pending || json.trim() === '' || serverCount !== 1 || (privateWarning && !privateConfirmed)}\n >\n {pending && <Spinner />}\n {pending ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58'}\n </button>\n )}\n </div>\n </form>\n {categoryOpen && categoryMenu !== null && createPortal(\n <div\n ref={categoryMenuRef}\n className=\"dshc-select-menu dshc-select-menu-portal\"\n style={{ left: categoryMenu.left, top: categoryMenu.top, width: categoryMenu.width }}\n role=\"listbox\"\n >\n {categoryOptions.map(item => (\n <button\n key={item}\n type=\"button\"\n role=\"option\"\n aria-selected={category === item}\n className={category === item\n ? 'dshc-select-item dshc-select-item-active'\n : 'dshc-select-item'}\n onClick={() => {\n setCategory(item)\n setCategoryOpen(false)\n }}\n >\n {item}\n </button>\n ))}\n </div>,\n document.body,\n )}\n {helpTip !== null && createPortal(\n <div\n className=\"dshc-card-tip dshc-help-tip\"\n style={{\n left: helpTip.left,\n top: helpTip.top,\n ...(helpTip.above ? { transform: 'translateY(-100%)' } : {}),\n }}\n onMouseEnter={() => {\n helpHoverRef.current = true\n cancelHelpTipHide()\n }}\n onMouseLeave={() => {\n helpHoverRef.current = false\n cancelHelpTipHide()\n setHelpTip(null)\n }}\n >\n {helpTip.kind === 'import' ? (\n <>\n <strong>\u81EA\u5B9A\u4E49\u8FDE\u63A5\u5668</strong>\n <span>\u7C98\u8D34 mcpServers JSON\uFF0C\u652F\u6301 Streamable HTTP\u3001SSE \u4E0E stdio \u4E09\u7C7B MCP Server\u3002</span>\n </>\n ) : (\n <>\n <strong>\u53EF\u9009\u6269\u5C55\uFF1Ax-dsh</strong>\n <span>\u53EF\u5728\u6BCF\u4E2A server \u914D\u7F6E\u91CC\u6307\u5B9A\u63CF\u8FF0\u3001\u7C7B\u522B\u4E0E\u793A\u4F8B\uFF0C\u4F18\u5148\u4E8E\u4E0B\u65B9\u8868\u5355\uFF1A</span>\n <code>{`\"x-dsh\": {\n \"description\": \"\u67E5\u8BE2\u4ED3\u5E93\u7ED3\u6784\u4E0E\u6587\u6863\",\n \"category\": \"\u77E5\u8BC6\u68C0\u7D22\",\n \"examples\": [\"\u7528 DeepWiki \u67E5 facebook/react \u7684\u4ED3\u5E93\u7ED3\u6784\"]\n}`}</code>\n </>\n )}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n\ninterface DeleteDialogProps {\n card: ConnectorCard\n pending: boolean\n error: string | null\n onClose: () => void\n onConfirm: () => void\n}\n\nfunction DeleteCustomDialog({ card, pending, error, onClose, onConfirm }: DeleteDialogProps): JSX.Element {\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && !pending) onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose, pending])\n\n return (\n <div\n className=\"dshc-overlay\"\n onMouseDown={event => {\n if (event.target === event.currentTarget && !pending) onClose()\n }}\n >\n <div className=\"dshc-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label={`\u5220\u9664 ${card.name}`}>\n <div className=\"dshc-dialog-head\">\n <h2>\u5220\u9664 {card.name}</h2>\n <button type=\"button\" className=\"dshc-icon-btn\" aria-label=\"\u5173\u95ED\" disabled={pending} onClick={onClose}>\n <IconClose size={16} />\n </button>\n </div>\n <div className=\"dshc-dialog-content\">\n <p className=\"dshc-dialog-body\">\u8FD9\u4E2A\u81EA\u5B9A\u4E49\u8FDE\u63A5\u5668\u4F1A\u4ECE\u672C\u673A\u79FB\u9664\uFF0C\u5DF2\u4FDD\u5B58\u7684\u914D\u7F6E\u4E0E\u51ED\u636E\u4F1A\u4E00\u8D77\u5220\u9664\uFF0C\u5DF2\u8FDE\u63A5\u7684\u5DE5\u5177\u4F1A\u6CE8\u9500\u3002</p>\n {error !== null && <p className=\"dshc-dialog-error\">{error}</p>}\n </div>\n <div className=\"dshc-dialog-actions\">\n <button type=\"button\" className=\"dshc-btn dshc-btn-md dshc-btn-outline\" disabled={pending} onClick={onClose}>\n \u53D6\u6D88\n </button>\n <button\n type=\"button\"\n className=\"dshc-btn dshc-btn-md dshc-btn-outline dshc-btn-danger\"\n disabled={pending}\n onClick={onConfirm}\n >\n {pending ? '\u5220\u9664\u4E2D\u2026' : '\u5220\u9664'}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ConnectorLogo({ card, size = 22 }: { card: ConnectorCard; size?: number }): JSX.Element {\n const src = PROVIDER_ICONS[card.id]\n if (src !== undefined) {\n return <img width={size} height={size} className=\"dshc-logo-img\" src={src} alt=\"\" />\n }\n return (\n <span\n className=\"dshc-logo-fallback\"\n style={{ width: size, height: size, fontSize: Math.max(10, Math.round(size * 0.44)) }}\n aria-hidden\n >\n {card.name.slice(0, 1).toUpperCase()}\n </span>\n )\n}\n\nfunction installStyles(): void {\n if (document.getElementById(STYLE_ID) !== null) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = `\n.dshc-root{\n height:100%;overflow:auto;\n padding:0 clamp(24px,4vw,48px);\n background:var(--dsw-alias-bg-base);\n color:var(--dsw-alias-label-primary);\n font:14px/22px var(--dsw-font-family);\n}\n.dshc-root.dshc-flow-root{height:0;overflow:visible;padding:0;background:transparent;pointer-events:none}\n.dshc-flow-root .dshc-inner{display:none}\n.dshc-flow-root .dshc-overlay{pointer-events:auto}\n.dshc-inner{box-sizing:border-box;max-width:960px;margin:0 auto;padding:28px 0 48px}\n.dshc-header{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px;margin-bottom:24px}\n.dshc-header h1{margin:0;font-size:20px;font-weight:500;line-height:28px;color:var(--dsw-alias-label-primary)}\n.dshc-search{box-sizing:border-box;display:flex;align-items:center;gap:6px;height:36px;margin:0 0 16px;padding:0 10px;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);color:var(--dsw-alias-label-tertiary);cursor:text;transition:border-color .15s}\n.dshc-search:hover{border-color:var(--dsw-alias-border-l2)}\n.dshc-search:focus-within{border-color:var(--dsw-alias-state-business-primary)}\n.dshc-search input{flex:1;min-width:0;height:100%;border:0;outline:0;background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:14px;line-height:22px}\n.dshc-search input::placeholder{color:var(--dsw-alias-label-caption)}\n.dshc-search-clear{flex:none;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dshc-search-clear:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dshc-btn{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;gap:4px;height:36px;padding:0 14px;border:none;border-radius:var(--dsw-radius-md);background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:14px;line-height:22px;white-space:nowrap;text-decoration:none;cursor:pointer}\n.dshc-btn:disabled{opacity:.4;cursor:not-allowed}\n.dshc-btn-md{height:40px}\n.dshc-btn-ghost:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-btn-ghost:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active)}\n.dshc-btn-outline{border:.5px solid var(--dsw-alias-border-l3)}\n.dshc-btn-outline:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-btn-primary{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}\n.dshc-btn-primary:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}\n.dshc-btn-danger{color:var(--dsw-alias-state-error-primary)}\n.dshc-btn-danger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-create{height:32px;padding:0 12px;border-radius:var(--dsw-radius-lg);font-size:13px;line-height:20px}\n.dshc-tabs{display:flex;flex-wrap:nowrap;align-items:center;gap:8px 12px;margin-bottom:14px;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;padding-bottom:2px;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2) transparent}\n.dshc-tabs::-webkit-scrollbar{height:6px}\n.dshc-tabs::-webkit-scrollbar-thumb{border-radius:999px;background:var(--dsw-alias-scrollbar-bg-l2)}\n.dshc-tabs::-webkit-scrollbar-thumb:hover{background:var(--dsw-alias-scrollbar-hover-l2)}\n.dshc-tabs .dshc-tab{flex:none}\n.dshc-tab{box-sizing:border-box;display:inline-flex;align-items:center;height:28px;padding:0 10px;border:0;border-radius:14px;background:transparent;color:var(--dsw-alias-label-tertiary);font:inherit;font-size:14px;line-height:22px;white-space:nowrap;cursor:pointer}\n.dshc-tab:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-tab-active{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dshc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}\n.dshc-card{box-sizing:border-box;display:flex;flex-direction:column;gap:12px;padding:16px;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);cursor:pointer;transition:border-color .15s,background-color .15s}\n.dshc-card:hover{border-color:var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-2)}\n.dshc-card:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}\n.dshc-card-top{display:flex;align-items:center;gap:12px;min-width:0}\n.dshc-avatar{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;flex:none;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);overflow:hidden}\n.dshc-logo-img{border-radius:calc(var(--dsw-radius-md) - 2px)}\n.dshc-logo-fallback{display:inline-flex;align-items:center;justify-content:center;flex:none;border-radius:50%;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-secondary);font-weight:500;line-height:1}\n.dshc-card-title{display:flex;flex-direction:column;min-width:0}\n.dshc-card-title strong{font-size:14px;font-weight:500;line-height:20px;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshc-card-title span{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshc-summary{display:-webkit-box;margin:0;min-height:36px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;font-size:13px;line-height:18px;color:var(--dsw-alias-label-tertiary)}\n.dshc-card-error{display:-webkit-box;margin:0;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;font-size:12px;line-height:16px;color:var(--dsw-alias-state-error-primary)}\n.dshc-card-tip{position:fixed;z-index:2000;box-sizing:border-box;max-width:min(360px,calc(100vw - 32px));max-height:min(240px,40vh);padding:6px 9px;overflow:hidden;border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-tooltip-bg);color:var(--dsw-static-neutral-bluish-00,#fff);font-size:13px;line-height:20px;white-space:pre-line;overflow-wrap:break-word;box-shadow:var(--dsw-elevation-prominent);pointer-events:none;animation:dshc-tip-in .12s ease-out}\n@keyframes dshc-tip-in{from{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}\n.dshc-card-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:auto}\n.dshc-badge{display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font-size:10px;line-height:18px;white-space:nowrap}\n.dshc-card-action{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;flex:none;background:transparent;color:var(--dsw-alias-label-tertiary)}\nbutton.dshc-card-action{padding:0;border:0;background:transparent;cursor:pointer}\nbutton.dshc-card-action:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}\n.dshc-card-action-connect{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:50%;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);box-shadow:0 1px 2px color-mix(in srgb,#000 6%,transparent);opacity:0;pointer-events:none;transition:opacity .15s,background-color .15s,border-color .15s,box-shadow .15s,color .15s}\n.dshc-card:hover .dshc-card-action-connect,.dshc-card:focus-within .dshc-card-action-connect{opacity:1;pointer-events:auto}\n.dshc-card-action-connect:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid,var(--dsw-alias-interactive-bg-hover));border-color:var(--dsw-alias-border-l4);color:var(--dsw-alias-label-primary);box-shadow:0 2px 5px color-mix(in srgb,#000 8%,transparent)}\n.dshc-card:hover .dshc-card-action-connect:disabled,.dshc-card:focus-within .dshc-card-action-connect:disabled{opacity:.4;cursor:not-allowed}\n.dshc-card-action-connect.dshc-card-action-loading{opacity:1;pointer-events:auto;cursor:progress;border-color:transparent;background:transparent;box-shadow:none}\n.dshc-card:hover .dshc-card-action-connect.dshc-card-action-loading,.dshc-card:focus-within .dshc-card-action-connect.dshc-card-action-loading{opacity:1;pointer-events:auto;cursor:progress}\n.dshc-spinner{display:inline-block;width:16px;height:16px;flex:none;transform-origin:50% 50%;animation:dshc-spin .8s linear infinite}\n@keyframes dshc-spin{to{transform:rotate(360deg)}}\n.dshc-card-action-connected{color:var(--dsw-alias-state-success-primary)}\n.dshc-card-action-disabled{color:var(--dsw-alias-label-tertiary)}\n.dshc-card-action-error{color:var(--dsw-alias-state-error-primary)}\n.dshc-card-auth-actions{display:flex;align-items:center;gap:4px;flex:none}\n.dshc-card-auth{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;gap:4px;height:28px;padding:0 10px;border:.5px solid var(--dsw-alias-border-l3);border-radius:999px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}\n.dshc-spinner-inline{width:12px;height:12px}\n.dshc-card-auth:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dshc-card-auth:disabled{opacity:.4;cursor:not-allowed}\n.dshc-card-auth:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}\n.dshc-card-installed{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;flex:none;border:.5px solid var(--dsw-alias-border-l3);border-radius:50%;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-tertiary);box-shadow:0 1px 2px color-mix(in srgb,#000 6%,transparent)}\n.dshc-card-actions{display:flex;align-items:center;flex:none}\n.dshc-card-toggle{display:inline-flex;align-items:center;justify-content:center;width:28px;height:16px;flex:none}\n.dshc-card-controls{display:flex;align-items:center;justify-content:flex-end;gap:6px;width:0;opacity:0;overflow:hidden;pointer-events:none;transition:width .26s cubic-bezier(.2,0,0,1),opacity .18s ease}\n.dshc-card-controls>*{flex:none}\n.dshc-card:hover .dshc-card-controls,.dshc-card:focus-within .dshc-card-controls,.dshc-card-menu-open .dshc-card-controls{width:62px;opacity:1;pointer-events:auto}\n.dshc-card-actions-busy .dshc-card-controls{width:28px;opacity:1;pointer-events:auto}\n.dshc-card:hover .dshc-card-actions-busy .dshc-card-controls,.dshc-card:focus-within .dshc-card-actions-busy .dshc-card-controls,.dshc-card-menu-open .dshc-card-actions-busy .dshc-card-controls{width:28px;opacity:1;pointer-events:auto}\n.dshc-card-menu-open .dshc-card-controls{overflow:visible}\n.dshc-switch{position:relative;box-sizing:border-box;width:28px;height:16px;flex:none;margin:0;padding:0;border:0;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-label-tertiary) 40%,transparent);cursor:pointer;transition:background-color .15s}\n.dshc-switch::after{content:\"\";position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:var(--dsw-alias-label-primary-foreground);box-shadow:0 1px 2px color-mix(in srgb,#000 25%,transparent);transition:transform .15s}\n.dshc-switch[aria-checked=true]{background:var(--dsw-alias-state-success-primary)}\n.dshc-switch[aria-checked=true]::after{transform:translateX(12px)}\n.dshc-switch:disabled{opacity:.4;cursor:not-allowed}\n.dshc-switch:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}\n.dshc-card-more-wrap{position:relative;display:inline-flex;flex:none}\n.dshc-card-install-actions{position:relative;display:flex;align-items:center;flex:none}\n.dshc-card-more-wrap.dshc-card-more-float{position:absolute;right:32px;top:0;opacity:0;pointer-events:none;transition:opacity .15s}\n.dshc-card:hover .dshc-card-more-float,.dshc-card:focus-within .dshc-card-more-float,.dshc-card-menu-open .dshc-card-more-float{opacity:1;pointer-events:auto}\n.dshc-card-more{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer;transition:background-color .15s}\n.dshc-card-more:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-card-more:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}\n.dshc-menu{position:absolute;right:0;top:calc(100% + 6px);z-index:20;box-sizing:border-box;display:flex;flex-direction:column;gap:2px;width:168px;padding:4px;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-elevation-prominent)}\n.dshc-menu-above{top:auto;bottom:calc(100% + 6px)}\n.dshc-cli-commands{margin:0;padding:10px 12px;border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:12px/20px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}\n.dshc-cli-wait{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}\n.dshc-cli-code{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}\n.dshc-cli-code code{font:12px/20px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-3)}\n.dshc-cli-output{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary)}\n.dshc-cli-output summary{cursor:pointer}\n.dshc-cli-output pre{max-height:140px;margin:6px 0 0;padding:8px;overflow:auto;border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-layer-3);font:11px/16px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}\n.dshc-cli-log-section{display:flex;flex-direction:column;gap:8px}\n.dshc-cli-log{max-height:320px;margin:0;padding:12px;overflow:auto;border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-secondary);font:11px/17px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}\n.dshc-menu-item{display:flex;align-items:center;gap:8px;width:100%;height:32px;padding:0 10px;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;line-height:20px;text-align:left;cursor:pointer}\n.dshc-menu-item:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-menu-item:disabled{opacity:.4;cursor:not-allowed}\n.dshc-menu-item-danger{color:var(--dsw-alias-state-error-primary)}\n.dshc-dock{box-sizing:border-box;display:inline-flex;align-items:center;gap:0;height:28px;padding:2px 6px;border:0;border-radius:999px;background:transparent;cursor:pointer;flex:none;transition:background-color .15s}\n.dshc-dock-single{width:32px;height:32px;padding:4px;gap:0;justify-content:center;border-radius:50%}\n.dshc-dock:hover{background:var(--dsw-alias-interactive-bg-hover-solid,var(--dsw-alias-interactive-bg-hover))}\n.dshc-dock-icon{position:relative;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex:none;border-radius:50%;background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1))}\n.dshc-dock-single .dshc-dock-icon{width:24px;height:24px}\n.dshc-dock-icon+.dshc-dock-icon{margin-left:-7px}\n.dshc-dock-icon .dshc-logo-img{border-radius:50%}\n.dshc-dock-dot{position:absolute;right:0;bottom:0;z-index:2;width:6px;height:6px;border-radius:50%;background:var(--dsw-alias-state-error-primary)}\n.dshc-dock-more{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;margin-left:2px;border-radius:50%;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font-size:9px;font-weight:500;flex:none}\n.dshc-dock-popover{position:absolute;left:0;bottom:calc(100% + 8px);z-index:40;box-sizing:border-box;display:flex;flex-direction:column;width:min(340px,calc(100vw - 32px));max-height:min(460px,60vh);padding:8px;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-elevation-prominent)}\n.dshc-dock-search{display:flex;align-items:center;gap:6px;height:32px;padding:0 10px;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-tertiary);flex:none}\n.dshc-dock-search input{flex:1;min-width:0;height:100%;border:0;outline:0;background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:13px}\n.dshc-dock-search input::placeholder{color:var(--dsw-alias-label-caption)}\n.dshc-dock-list{display:flex;flex-direction:column;gap:2px;margin-top:6px;min-height:0;flex:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2) transparent}\n.dshc-dock-list::-webkit-scrollbar{width:6px}\n.dshc-dock-list::-webkit-scrollbar-thumb{border-radius:999px;background:var(--dsw-alias-scrollbar-bg-l2)}\n.dshc-dock-item{display:flex;flex-direction:column}\n.dshc-dock-row{display:flex;align-items:center;gap:10px;min-height:38px;padding:4px 6px;border-radius:var(--dsw-radius-md)}\n.dshc-dock-row:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-dock-row-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;flex:none}\n.dshc-dock-row-main{display:flex;flex-direction:column;min-width:0;flex:1}\n.dshc-dock-row-name{font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshc-dock-row-error{font-size:11px;line-height:16px;color:var(--dsw-alias-state-error-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshc-dock-row-hint{flex:none;color:var(--dsw-alias-label-tertiary);font-size:11px}\n.dshc-dock-toggle{display:inline-flex;align-items:center;justify-content:center;width:28px;height:16px;flex:none}\n.dshc-dock-connect{display:inline-flex;align-items:center;justify-content:center;gap:4px;flex:none;height:24px;padding:0 4px;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-tertiary);font:inherit;font-size:12px;cursor:pointer}\n.dshc-dock-connect:hover{color:var(--dsw-alias-label-primary)}\n.dshc-dock-connect:disabled{opacity:.4;cursor:not-allowed}\n.dshc-dock-pending{display:inline-flex;align-items:center;justify-content:center;gap:4px;flex:none;height:24px;padding:0 4px;color:var(--dsw-alias-label-tertiary);font-size:12px;white-space:nowrap}\n.dshc-dock-pending-cancel{margin-left:2px;padding:0;border:0;background:transparent;color:var(--dsw-alias-state-error-primary);font:inherit;font-size:12px;cursor:pointer;opacity:0;transition:opacity .12s}\n.dshc-dock-row:hover .dshc-dock-pending-cancel,.dshc-dock-pending-cancel:focus-visible{opacity:1}\n@media (hover:none){.dshc-dock-pending-cancel{opacity:1}}\n.dshc-dock-tip{max-width:min(320px,calc(100vw - 32px))}\n.dshc-dock-empty{padding:16px 8px;text-align:center;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}\n.dshc-dock-error{padding:4px 6px;color:var(--dsw-alias-state-error-primary);font-size:11px;line-height:16px;overflow-wrap:anywhere}\n.dshc-dock-manage{display:flex;align-items:center;gap:6px;height:32px;margin-top:4px;padding:0 8px;border:0;border-top:.5px solid var(--dsw-alias-border-l3);background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;cursor:pointer;flex:none}\n.dshc-dock-manage:hover{color:var(--dsw-alias-label-primary)}\n.dshc-overlay{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:max(24px,var(--dsh-frame-overlay-top,24px)) 24px;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur)}\n.dshc-overlay-behind{background:transparent;backdrop-filter:none}\n.dshc-dialog{box-sizing:border-box;position:relative;z-index:1;display:flex;flex-direction:column;gap:20px;width:min(380px,100%);max-height:min(800px,100%);padding:0 0 24px;overflow:hidden;border:0;border-radius:var(--dsw-radius-panel);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-elevation-prominent)}\n.dshc-dialog-detail,.dshc-dialog-wide{width:min(560px,100%)}\n.dshc-dialog-credential{width:min(460px,100%)}\n.dshc-dialog-instance{width:min(460px,100%)}\n.dshc-dialog-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:22px 14px 12px 24px}\n.dshc-dialog-head-title{display:flex;align-items:center;gap:6px;min-width:0}\n.dshc-dialog-head-detail{gap:12px}\n.dshc-dialog-head h2{margin:0;font-size:16px;font-weight:500;line-height:24px}\n.dshc-dialog-avatar{width:44px;height:44px}\n.dshc-dialog-title{display:flex;flex-direction:column;flex:1;min-width:0}\n.dshc-dialog-title h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshc-dialog-title span{font-size:13px;line-height:18px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshc-icon-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer}\n.dshc-icon-btn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-icon-btn:disabled{opacity:.4;cursor:not-allowed}\n.dshc-dialog-content{display:flex;flex-direction:column;gap:16px;min-height:0;padding:0 24px;overflow-y:auto}\n.dshc-dialog-body{margin:0;font-size:14px;line-height:22px;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}\n.dshc-dialog-status-pill{flex:none;max-width:240px;overflow:hidden;text-overflow:ellipsis}\n.dshc-status-pill{display:inline-flex;align-items:center;padding:1px 8px;border-radius:999px;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:500;line-height:17px;white-space:nowrap}\n.dshc-status-pill-connected{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 10%,transparent);color:var(--dsw-alias-state-success-primary)}\n.dshc-status-pill-error{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}\n.dshc-status-pill .dshc-spinner{margin-right:5px}\n.dshc-field{display:flex;flex-direction:column;gap:6px;font-size:13px;line-height:18px;color:var(--dsw-alias-label-secondary)}\n.dshc-field input{box-sizing:border-box;height:40px;padding:0 14px;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;outline:none}\n.dshc-field-control{position:relative;display:block}\n.dshc-field-control input{width:100%;padding-right:40px}\n.dshc-field-reveal{position:absolute;top:50%;right:6px;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dshc-field-reveal:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}\n.dshc-field-reveal:focus-visible{outline:none;background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dshc-field-copy{position:absolute;top:50%;right:6px;transform:translateY(-50%);height:28px;padding:0 10px;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-state-business-primary);font:inherit;font-size:12px;cursor:pointer}\n.dshc-field-copy:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-field input::placeholder{color:var(--dsw-alias-label-caption)}\n.dshc-field input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}\n.dshc-field select{box-sizing:border-box;width:100%;height:40px;padding:0 38px 0 14px;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;outline:none;appearance:none;cursor:pointer}\n.dshc-field select:focus-visible{border-color:var(--dsw-alias-state-business-primary)}\n.dshc-field select:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}\n.dshc-select-toggle-static{pointer-events:none}\n.dshc-field textarea{box-sizing:border-box;min-height:180px;max-height:320px;padding:10px 14px;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:12px/18px var(--dsw-font-markdown-code-font-family);outline:none;resize:vertical}\n.dshc-json-editor{position:relative;height:260px;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);overflow:hidden;background:#fff}\n.dshc-json-editor-mount{position:absolute;inset:0}\n.dshc-json-editor-fallback{position:absolute;inset:0;box-sizing:border-box;width:100%;height:100%;padding:10px 14px;border:0;outline:0;resize:none;background:#fff;color:var(--dsw-alias-label-primary);font:12px/18px var(--dsw-font-markdown-code-font-family)}\n.dshc-json-editor-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:6px;background:color-mix(in srgb,#fff 88%,transparent);color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;pointer-events:none}\n.dshc-field textarea:focus-visible{border-color:var(--dsw-alias-state-business-primary)}\n.dshc-field textarea.dshc-examples-input{min-height:72px;max-height:120px;padding:8px 12px;font:inherit;font-size:13px;line-height:20px}\n.dshc-field-label{display:flex;align-items:center;gap:4px}\n.dshc-help-btn{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:0;border-radius:50%;background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dshc-help-btn:hover,.dshc-help-btn:focus-visible{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);outline:none}\n.dshc-select{position:relative}\n.dshc-select-control{position:relative;display:flex;align-items:center}\n.dshc-select-control input{width:100%;padding-right:36px}\n.dshc-select-toggle{position:absolute;top:50%;right:4px;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dshc-select-toggle:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}\n.dshc-select-menu{position:absolute;top:calc(100% + 4px);right:0;left:0;z-index:30;display:flex;flex-direction:column;max-height:220px;padding:4px;overflow-y:auto;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-elevation-prominent)}\n.dshc-select-menu-portal{position:fixed;right:auto;z-index:1100;box-sizing:border-box}\n.dshc-select-item{display:flex;align-items:center;width:100%;height:32px;padding:0 10px;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;text-align:left;cursor:pointer}\n.dshc-select-item:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.dshc-select-item-active{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-state-business-primary)}\n.dshc-help-tip{display:flex;flex-direction:column;gap:6px;max-width:min(380px,calc(100vw - 32px));max-height:none;padding:10px 12px;overflow:visible;white-space:normal;pointer-events:auto;user-select:text;cursor:auto}\n.dshc-help-tip strong{font-weight:500}\n.dshc-help-tip code{display:block;padding:6px 8px;border-radius:var(--dsw-radius-sm);background:rgba(255,255,255,.12);color:inherit;font:12px/18px var(--dsw-font-markdown-code-font-family);white-space:pre-wrap;overflow-wrap:anywhere;overflow:hidden}\n.dshc-dialog-hint{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary)}\n.dshc-link{color:var(--dsw-alias-state-business-primary);text-decoration:none}\n.dshc-link:hover{text-decoration:underline}\n.dshc-dialog-error{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere}\n.dshc-dialog-alert{margin:0 24px;padding:8px 10px;border:.5px solid color-mix(in srgb,var(--dsw-alias-state-error-primary) 32%,transparent);border-radius:var(--dsw-radius-md);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,transparent);color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:18px;overflow-wrap:anywhere}\n.dshc-tools{display:flex;flex-direction:column;gap:8px;min-height:0}\n.dshc-tools-head{display:flex;align-items:center;gap:8px}\n.dshc-tools-search-wrap{position:relative;display:inline-flex;align-items:center;margin-left:auto}\n.dshc-tools-search{box-sizing:border-box;width:168px;height:28px;padding:0 28px 0 10px;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;line-height:26px;outline:none}\n.dshc-tools-search-clear{position:absolute;top:50%;right:3px;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dshc-tools-search-clear:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dshc-tools-search::placeholder{color:var(--dsw-alias-label-caption)}\n.dshc-tools-search:focus-visible{border-color:var(--dsw-alias-state-business-primary)}\n.dshc-tools-empty{margin:0;padding:16px 12px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}\n.dshc-tools-head h3{margin:0;font-size:14px;font-weight:500;line-height:20px}\n.dshc-tools-count{display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font-size:10px;line-height:18px}\n.dshc-capability-head{gap:6px}\n.dshc-capability-head .dshc-tools-count{height:20px;padding:0 8px;font-size:11px;line-height:20px}\n.dshc-tool-list{max-height:240px;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2) transparent}\n.dshc-tool-list::-webkit-scrollbar{width:6px}\n.dshc-tool-list::-webkit-scrollbar-thumb{border-radius:999px;background:var(--dsw-alias-scrollbar-bg-l2)}\n.dshc-tool-list::-webkit-scrollbar-thumb:hover{background:var(--dsw-alias-scrollbar-hover-l2)}\n.dshc-tool{padding:8px 12px;border-top:.5px solid var(--dsw-alias-border-l3)}\n.dshc-tool:first-child{border-top:0}\n.dshc-tool-head{display:flex;align-items:center;gap:8px;min-width:0}\n.dshc-tool code{display:block;flex:1;min-width:0;font:12px/18px var(--dsw-font-markdown-code-font-family);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}\n.dshc-tool-expand{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;flex:none;padding:0;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dshc-tool-expand:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dshc-tool-expand:disabled{opacity:.35;cursor:not-allowed}\n.dshc-tool-expand:disabled:hover{background:transparent;color:var(--dsw-alias-label-tertiary)}\n.dshc-tool-chevron{transition:transform .15s}\n.dshc-tool-chevron-expanded{transform:rotate(180deg)}\n.dshc-tool p{display:-webkit-box;margin:2px 0 0;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;overflow-wrap:anywhere}\n.dshc-tool p.dshc-tool-desc-expanded{display:block;overflow:visible;-webkit-line-clamp:unset;white-space:pre-wrap}\n.dshc-tools-toggle{align-self:flex-start;padding:0;border:0;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12.5px;line-height:18px;cursor:pointer}\n.dshc-tools-toggle:hover{color:var(--dsw-alias-label-primary)}\n.dshc-examples{display:flex;flex-direction:column;gap:8px}\n.dshc-examples h3{margin:0;font-size:14px;font-weight:500;line-height:20px}\n.dshc-example-list{display:flex;flex-direction:column;gap:6px}\n.dshc-example{box-sizing:border-box;display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;line-height:20px}\n.dshc-example-text{flex:1;min-width:0;overflow-wrap:anywhere}\n.dshc-example-actions{display:flex;align-items:center;gap:2px;flex:none}\n.dshc-example-action{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dsw-radius-sm);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dshc-example-action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dshc-example-action:disabled{opacity:.4;cursor:not-allowed}\n.dshc-example-action:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}\n.dshc-example-action-success{color:var(--dsw-alias-state-success-primary)}\n.dshc-example-action-error{color:var(--dsw-alias-state-error-primary)}\n.dshc-action-tip{transform:translateX(-50%);animation:dshc-action-tip-in .12s ease-out}\n.dshc-action-tip-above{transform:translate(-50%,-100%)}\n@keyframes dshc-action-tip-in{from{opacity:0}to{opacity:1}}\n.dshc-warning{margin:0;padding:10px 12px;border-radius:var(--dsw-radius-md);background:var(--dsw-alias-state-warn-tertiary);color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px;overflow-wrap:anywhere}\n.dshc-check{display:flex;align-items:flex-start;gap:8px;font-size:13px;line-height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer}\n.dshc-check input{margin:2px 0 0;accent-color:var(--dsw-alias-state-business-primary)}\n.dshc-dialog-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:0 24px}\n.dshc-dialog-actions-right{display:flex;align-items:center;gap:8px;margin-left:auto}\n.dshc-empty{padding:48px 0;text-align:center;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary)}\n.dshc-error{margin-bottom:16px;padding:10px 12px;border:.5px solid var(--dsw-alias-state-error-primary);border-radius:var(--dsw-radius-md);color:var(--dsw-alias-state-error-primary);font-size:13px;line-height:20px}\n`\n document.head.appendChild(style)\n}\n", "export type TransportKind = 'stdio' | 'streamable-http' | 'sse'\n\nexport interface AuthHelp {\n url: string\n label: string\n hint?: string\n}\n\nexport type CardAuth =\n | { type: 'none' }\n | { type: 'bearer'; label: string; help?: AuthHelp }\n | { type: 'header'; header: string; prefix?: string; label: string; help?: AuthHelp }\n | {\n type: 'oauth2'\n flow: 'pkce'\n registration: 'dcr' | { clientId: string } | 'user'\n scopes?: string[]\n clientName?: string\n endpoints?: { authorization: string; token: string }\n authorizeParams?: Record<string, string>\n tokenMethod?: 'POST' | 'GET'\n pkce?: boolean\n help?: AuthHelp\n }\n\nexport interface ServerSpec {\n serverName: string\n transport: TransportKind\n url?: string\n command?: string\n args?: string[]\n}\n\nexport interface ProviderInstancePreset {\n label: string\n url: string\n hint?: string\n}\n\nexport interface ProviderInstance {\n label: string\n noun?: string\n placeholder?: string\n hint?: string\n help?: AuthHelp\n presets?: ProviderInstancePreset[]\n}\n\nexport interface ConnectorCard {\n id: string\n name: string\n vendor?: string\n category: string\n summary: string\n description?: string\n examples?: string[]\n tags?: string[]\n published: boolean\n featured?: boolean\n source?: 'builtin' | 'custom'\n instance?: ProviderInstance\n auth: CardAuth\n server: ServerSpec\n}\n\nexport interface ToolInfo {\n name: string\n description?: string\n}\n\nexport interface ConnectionView {\n connectorId: string\n name: string\n serverName: string\n transport: TransportKind\n enabled: boolean\n authorized: boolean\n instanceReady?: boolean\n oauthClientReady?: boolean\n tools: string[]\n toolDetails: ToolInfo[]\n error?: string\n createdAt: number\n}\n\nexport interface ConnectionsPayload {\n ok: true\n value: {\n connections: ConnectionView[]\n }\n}\n\nexport interface CatalogPayload {\n ok: true\n value: {\n version: number\n cards: ConnectorCard[]\n }\n}\n\nexport interface CustomConnectorsPayload {\n ok: true\n value: {\n connectors: ConnectorCard[]\n }\n}\n\nexport interface CustomConfigView {\n json: string\n installed: boolean\n}\n\nexport interface CustomConfigPayload {\n ok: true\n value: {\n config: CustomConfigView\n }\n}\n\nexport interface CustomUpdatePayload {\n ok: true\n value: {\n card: ConnectorCard\n disconnected: boolean\n }\n}\n\nexport interface OAuthStartPayload {\n ok: true\n value: {\n authorizeUrl: string\n flowId: string\n opened: boolean\n }\n}\n\nexport interface OAuthStatusPayload {\n ok: true\n value: {\n status: 'pending' | 'done' | 'error' | 'expired'\n message?: string\n }\n}\n\nexport interface HealthPayload {\n ok: true\n value: {\n name: string\n version: string\n capabilities: Record<string, boolean>\n node: string\n }\n}\n\nexport const ROUTE_PREFIX = '/dsh-connectors'\n\nexport type CliConnectorId = 'dingtalk' | 'feishu' | 'tmeet' | 'wecom' | 'hf' | 'agent-mail'\n\nexport type CliPhase = 'idle' | 'installing' | 'updating' | 'configuring' | 'logging_in' | 'uninstalling' | 'error'\n\nexport interface CliCapabilityItem {\n id: string\n name: string\n description?: string\n count?: number\n}\n\nexport interface CliCapabilitiesView {\n kind: 'products' | 'skills' | 'groups'\n total: number\n items: CliCapabilityItem[]\n}\n\nexport interface CliConnectorView {\n id: CliConnectorId\n name: string\n vendor: string\n description: string\n category: string\n docsUrl: string\n examples: string[]\n installHint: string[]\n installed: boolean\n enabled: boolean\n version?: string\n authenticated: boolean\n account?: {\n name?: string\n email?: string\n org?: string\n }\n skills: {\n installed: boolean\n count: number\n names: string[]\n dir?: string\n }\n minVersion?: string\n versionOutdated?: boolean\n capabilities?: CliCapabilitiesView\n phase: CliPhase\n stage?: string\n link?: string\n code?: string\n output?: string\n lastError?: string\n updatedAt?: number\n}\n\nexport interface CliListPayload {\n ok: true\n value: {\n connectors: CliConnectorView[]\n }\n}\n\nexport interface CliConnectorPayload {\n ok: true\n value: {\n connector: CliConnectorView\n }\n}\n\nexport interface CliActionPayload {\n ok: true\n value: {\n connector: CliConnectorView\n }\n}\n\nexport interface CliLogPayload {\n ok: true\n value: {\n output: string\n }\n}\n", "// \u7531 scripts/build-cli-icons.mjs \u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u6539\u3002\n// \u5728 assets/cli/<id>.png|jpg|ico|svg \u653E\u7F6E\u5B98\u65B9\u56FE\u6807\u540E\u91CD\u65B0\u8FD0\u884C npm run cli:icons\u3002\nexport const CLI_ICONS: Record<string, string> = {\n \"dingtalk\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QB6RXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAABJKGAAcAAAAiAAAAUKABAAMAAAABAAEAAKACAAQAAAABAAACAKADAAQAAAABAAACAAAAAABBU0NJSQAAADdOMzZBQzZFSkgzSjVaU1E0WFNOQklLWFVZ/+0AOFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAAOEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv/AABEIAgACAAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2wBDAAICAgICAgMCAgMEAwMDBAUEBAQEBQcFBQUFBQcIBwcHBwcHCAgICAgICAgKCgoKCgoLCwsLCw0NDQ0NDQ0NDQ3/2wBDAQICAgMDAwYDAwYNCQcJDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ3/3QAEACD/2gAMAwEAAhEDEQA/AP38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/0P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/0f38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/0v38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/0/38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiuc8X+JLLwf4V1jxXqLBbbSLG4vZM9CsCF8fjjA+ta0KM61SNGkryk0ku7eiIq1I04OpN2S1foj8sf22v2lPE0ni+5+EfgbUZ9M07SAqatcWkjRTXV06hjDvXDCKJWAYA/M+c8KK+Pvhf8ffih8Jdai1Xw1rNxLbhwbjTryV57O5Xurxs3yk54dcMD3ry7Xdav8AxJreoeIdVkMt7qd1NeXDn+KWdy7H8zWVX+nHDfh/lGWZDTyOpQhOPKlO6T55W96T73e3ZWS2R/F+c8WY/GZpPMoVZRd/ds7cq6JfLfv1P6KPgd8e/BXx08OjVPD0v2fU7VE/tHS5WH2i1kbv23xE/dkHB6HDZA9wr+ZPwT448U/DrxHa+LPBuoSadqVofklj5V0P3o5FPyvG38SsCD9cV+5X7OX7T3hb46aSmn3Bj0vxbaxbr3TCcLKF6zWxY5eM9Sv3k6NkYY/yD4t+CuI4dlLM8pTng3v1lT8pd49pdNpa2b/f+AvEejm8Vgsc1HELbop+naXdfNdl9RUUUV+AH6oFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//1P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvjT9u3xefDXwEvdLhkCz+I76100D+IxBjPLj22xbT/vV9l1+Vv/BSXXyZ/A/hdDwq3+oSD1J8qJPy+f8AOv03wcylZhxjgaMldRlzv/txOa/FI+M8Qcc8Jw9iqkXq48v/AIE1H8mz8uaKKK/0rP42CtXQ9c1jw1q9pr/h+8m0/UbGUTW9zAxSSN16EEfkR0I4PFZVFRUpwqQdOorp6NPVNPoyoTlCSlF2aP26/Ze/a60f4s21t4M8cyw6d4yjXZGeI7fUwo+/F2Wbu0XfqnGQv29X8ttvcXFpcRXdpK8E8LrJFLGxR0dDlWVhyCCMgjkGv1w/ZY/bOt/Eotfh58X7xINZJWHT9ZlwkV7nhY7g8Kk3ZX4WTvhvvfxh4v8AgVPA8+dcOQvS3nTWrh3cF1j3jvHpePw/0Z4f+J0cTy5dm8rVNoze0vKXaXZ7Prrv+kVFFFfyyftwUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/V/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/F3/gohqBufjRpNjniz8P24x6GS4nY/piv2ir8RP8AgoCJP+F+LvIKnQrHZ7DfNn9a/evo404y4wUn0pza/Bfkz8u8X5tcPtLrOP6nxFRRRX9/H8qBRRRQAUUUUAfpb+yv+2hNoZtvh58Y75pdNwsOna3MSz22MBYrpurRdllOSnRsryv6zwzQ3MKXFu6yxSqHR0IZWVhkEEcEEcgiv5a6+6f2XP2vtV+Fk1r4H+IM0t/4PYiOCYgyXGl5PBT+J7f+9HyV6p3U/wAreL/gVHGc+dcNwtV3nSW0u7guku8dpdNdJfuXh/4nOhy5bnErw2jN7ryl5dn066bftfRWbo+saV4h0u11vQ7uG+sL2JZre5gcPHLG3RlYcEVpV/GdSnKEnCas1o090z+iIyUkpRd0woooqCgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/W/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/Gf/gorprW/wAXtD1L+C80CNR/vQ3EwI/JhX7MV+YP/BSTw60mm+CvFqL8sE97p0px085Ulj5/7ZvX7P4A46OG40w0ZPSanH/yVtfikfnfiphXW4crNfZcZf8AkyX5M/KWiiiv9ET+RwooooAKKKKACiiigD6s/Zt/aj8TfA3U49I1BpdU8H3Uu6608nc9sXPzTWpJG1+7JkK/fDYYfuH4M8aeGPiD4dtPFfhC/i1HTL1d0c0R6EfeR1OGR1PDKwBB6iv5kK93+BP7QHjP4E+IRf6HIbvR7qRTqWkysRBcqONy9fLmUfdcfRgV4r+fvFvwUw/EMZZplCUMYtWto1PXtPtLrtLuv1fgLxIq5S44HHtyw/R7uHp3j3XTp2f9ENFebfCz4r+DPjD4Xi8VeC7wXEJwlxbv8txaTYyYpk6qw7HlWHKkjmvSa/hLHYHEYPETwuLg4VIuzi1Zp+aP6ew2JpYilGvQkpRlqmtU0FFFFcpuFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//1/38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvlf8AbN8Ft4z/AGf/ABAIE33OiGLWIQBk/wCiH97/AOQWkr6oqnqFha6pYXOmX0YltruGSCaM9HjlUqyn6gkV7PDmcTynNMPmdPelOMvWzTa+a0POzfL447BVcHPacXH71v8AI/lzoruvib4Ivfht4/17wNqAPmaPeywIxBHmQ53QyDIHDxlWH1rha/1XwmKpYqhDE0HeE0pJ901dP7j+GsRQnQqyo1VaUW015rRhRRRXQYhRRRQAUUUUAFFFFAHpXwr+LPjT4O+J4vFHgy8MEnypdWz5a2vIQcmOZP4h6EYZTypBr92/gZ8ffBfx28PHUvD8n2XVLRVGo6XMw8+2dv4h/fiY/dkAwehAORX87VdV4L8beKPh54itfFfg7UJdN1KzbKSxHhlP3o5FPDxt0ZWBBFfkPij4SYDizDuvTtTxcV7s+j/uztuuz3j0urp/oHBHHuKyKr7Kd50G9Y9vOPZ91s/xX9N1FfK/7OH7UPhf46aYmlXezS/F1rDuu9OJ+ScLw01sTy6dyv3kzg5GGP1RX+fufZDj8mxs8vzKm4VY7p/g09mn0a0Z/VmV5phcxw0cXg5qUJdV+T7NdUFFFFeOegFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/0P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD8tv+ChnwheRdM+M2kxk+WselauqjouSbaY/iTGxP+wK/LCv6dvF3hXRvG/hnU/CXiGEXGnatbSWtwnfbIMZU9mU4ZT2IBr+c/wCLHw11v4SePdU8C66C0ljLmCcAhLm2fmKZfZ16jswK9q/ub6OnHccxyp8P4qX76hrHzpt/+2N29HHzP5m8XeGHhMcs1or93V+Lyn/9stfVM85ooor+kj8cCiiigAooooAKKKKACiiigDR0jV9U0DU7bWtEu5rC/s5BLb3Nu5jlidejKw5B/nX7Ofsu/tgaX8U0tvAvj94tO8WpGEhuCQlvqhXunQJORyY+jclP7o/FKnxySRSLLEzI6MGVlOGVhyCCOQQehr4DxA8Osr4swX1fGLlqx+Col70X+sX1i9+lnZn1fCnF+NyHE+1w7vB/FF7P/J9n+a0P6laK/Mj9ln9tJNUaz+HXxjvEiu8LBp+uzNtScjhYrtjwsh6LKcBv48Ny36bAgjI5Br/PLjHgvM+Gce8BmcLP7Ml8Ml3i/wA1utmf1pw9xHgs5wqxWClddV1i+zX9J9BaKKK+TPdCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//0f38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqMGqabc3UthbXcEtzb/62FJFaSP8A3lByv4ivE/2nPG+pfD34G+KvEuizNbailslrazIcPFLdypCHU9mQOWB9QK/n40nxBrug6xF4h0XULmy1OCTzo7yCVknEmc7t4OSSeuevev27wy8GK3F+XV8wWJVJQlyR93m5pJJu+qstVtd79tfzbjTxFp5BjKWEdHnclzPW1ldpW0d3o+346f1A18k/ta/s8r8bfBi6loEar4s0JXk08khRdRHmS1dj03fejJ4D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w69qvmaD4SDZa/kT99dgEgraxt97kYMjfIvbcQVr/RXN86yrh3LvrONnGlQppJfJaRilq3ZaJK5/I2Ay7HZvjPZYaLnUk7v57tvp5tng3w5+GXjX4reIovDPgjTpL+6cqZXHywW8ZODJNIflRB78noATxX7S/s+fsk+CfgtDDruqiPXvFhUF9QlTMNqxxlbRGHyYP/LQ/vD/ALIO2vevh18M/BXwq8PReGfA+mx6faJhpGHzTTyf89JpD80jn1J4HAwOK7yv4e8TfHHMeInLAZbejhNrfbmv7zWy/urTu30/pbgvw0wmUKOKxlqlfv8AZj/hXfzfysFFFFfg5+oBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/9L9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPmD9q/43p8F/hpPNpcyr4j1zfZaSmQWjYj97cYPaFTkdt5UdCa/BbT9P1TXtTh03TLee/1C+lEcUMStLNNLIeAFGSzE19ufFXwp8Y/2p/2hNa03SdIubbT9DupNJgmvEeGysLS3cjzJHIxvmIMm1cs24AZUAj9HfgN+zN4D+Bdgtxp6DVPEU0e261i4QCX5gN0cC8+TEcfdBLH+Jjxj+w+HuJMk8MuGo06lquYV0pyhFrS691Skr8sYp+bbbaVndfz7m2T5lxpnEpxvTwlJuKk1vZ+84rq2/kklfXR/LX7Ov7CtppgtfGXxsiS7u+JbfQAQ8EXAKm7YcSMO8Q+Qdy3QfphDDFbxJBAixxRqEREAVVVRgAAcAAcACpKK/mji/jbNuJcY8ZmtTm/litIxXaK6eu76tn7LkHDeAybD/V8DC3d9ZPu3/SXRBRRRXyZ7oUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/9P9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9T9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9X9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9b9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=\",\n \"feishu\": \"data:image/x-icon;base64,AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAABMLAAATCwAAAAAAAAAAAAD///8A////AP///wf///8U////W////4f///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+G////T////yL///8J////AP///wD///8B////D////2n////R////9P////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////9f///+D///92////EP///wH///8N////hv////L////9//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7////z////hv///wr///9T////8f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8P///zj///+s////+v//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+v///6v////x/////v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v////H///////////////////////////////////////////////////////////////////////////////////////39///7+f//+vj///v5///9/P///f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/P//9/P//+/p///s5P//59z//9jI///KtP//ybP//8q0///Xx///2cn//+je///s5P//8uz///f0///+/v//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vL//+vj///VxP//uJr//5Vp//+FUv//cjX//3Az//9wM///cDP//3Az//9wM///cDT//3g+//+GU///onv//7mc///dz///7OP///n3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Ls///k2f//t5j//4xc//9xNf//bzL//3Ay//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDL//3Az//93Pf//jV3//8Sr///n3P//9/P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////08P//4dX//6eD//9+SP//cDP//3Ay//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDL//3Az//+FUf//u57//+bc///6+P///////////////////////////////////////////////////////////////////////////////////////////////////v7//+7n//+zk///fkj//3Ay//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wMv//cDP//4ta///Hr///8Or/////////////////////////////////////////////////////////////////////////////////////////////+/n//7KR//9yNv//cDL//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//28y//9xNf//qof//+bc///9/f//////////////////////////////////////////////////////////////////////////////////+PX//41c//9xNf//cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//5Zq///Xxv///fz/////////////////////////////////////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9xM///cTT//3E0//9xNP//cTT//3Ez//+FT///1MH///z7////////////////////////////////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9xM///cDP/92ww/+xmLf/lYyv/32Ap/99gKf/hYSr/6GQs//FpL//+g07//9XD///+/v//////////////////////////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9xNP//cTP/9Gov/+hkLP/YXCf/x1Mh/7JIGv+kQRb/mDsS/5c7Ev+cPRT/qEQY/7tNHf/aXSj/74BS///l2f//////////////////////////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9vMv//cTP//G4y/+plLP/eXyn/wlAg/6xFGf+YOxL/mDsS/5k7E/+ZPBP/mjwT/5o8E/+aPBP/mTwT/5k7E/+dPRT/uk4f/+GOa//96eD///7+////////////////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///bzH//20v//t0Ov/hXib/z1Yj/7BHGv+fPhX/mDsS/5k7E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mTsS/6VDGP/am3///vXy////////////////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wM///cDP//28y//9uMP//fET//5pv//i0lf/FfFz/nkch/5g6EP+ZPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8FP+mTyn/6cq+//79/f//////////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///cDP//3Az//9wMv//bjD//3U6//+VZ///wqj//+3l//7////x5eD/0KSR/6xfPf+ZOhH/mjsS/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+bPhb/t3ZZ//fx7v//////////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///cDP//28y//9yNv//j17//7qd///k2P///////////////////////////+DFt/+4d1v/nEAY/5o7E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/nEAY/9u5qv/9/Pv/////////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//3Az//9wM///bzH//39I//+ujP//28z////////////////////////////////////////////v4Nr/w4xw/51FGP+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mz4V/7BmRv/37+v////+////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///cDP//28y//9uMP//kmP//8my///39P////////////////////////////////////////////////////7/5OOn/6yJE/+cRRL/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5xBGf/Ztqb//fz7////////////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9wM///bzL//3g///+vjf//3tD//////////////////////////////////////////////////////////v/5/Ov/zeNL/7jOBf+qign/nEUS/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5s+Ff+uY0L/9u7q/////v//////////////////////////////////+PX//4hV//9xNP//cDP//3Az//9vMf//gkz//7uf///49f////////////////////////////////////////////////////////////7+/P/f7Iv/vNgL/7nWAP+3zgH/qowJ/5xGEv+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+cQBj/17Kh//38+///////////////////////////////////+PX//4hV//9xNP//cDP//3Ay//+SY///z7v///j2/////////////////////////////////////////////////////////////v/9/+31v//B2yD/udYB/7nWAP+51gD/t84B/6uPCf+cRhL/mjsT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+bPhX/rWA///bv6/////7/////////////////////////////+PX//4hV//9xNP//cDP//5lt///dzv////////////////////////////////////////////////////////////////////7/+fzp/83iSf+61gL/udYA/7nWAP+51gD/udYA/7fOAf+rkQj/nUsR/5o6E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mz8W/8eUff/9/Pv/////////////////////////////+PX//4hV//9xNP//mm///+LV///////////////////////////////////////////////////////////////////////+//z/3OuB/7vXCf+51gD/udYA/7nWAP+51gD/udYA/7nWAP+4zwH/rp4H/6NoDf+bPxL/mjoT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/5o8E/+aPBP/mjwT/6BHIf/fwbT//vz8////////////////////////+PX//4hV//+dc///49f//////////////////////////////////////////////////////////////////////////f/n8af/wNob/7nWAf+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udQA/7S7BP+vmhH/o2kN/5o/D/+YNw3/mDgO/5k5D/+ZOhD/mToQ/5k5D/+YOA7/mDgO/6BHIf/CinH/+PHu/////v//////////////////+/r//8Cm///m3P///////////////////////////////////////////////////////////////////////v/9/+31wP/F3Sv/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nYAP+61gb/tb0H/8GtS//JmH7/vYBl/7VvUf+wZ0j/sGdI/7VvUf+9gGX/ypmE/9/BtP/p1Mv//Pj3/////////////////////////v7///bz//////////////////////////////////////////////////////////////////////////7/9vnd/8vhRP+51gH/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/vNkI/+XyoP/38uv/8uXg/+3c1f/q2ND/6tjQ/+3c1f/y5eD/+fLw///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4++f/0uRb/7vXBv+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/vtkU//f64f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j75v/S5V3/u9gK/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+61wX/0+Vg//3+9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pvl/9HkWf+71wn/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+82An/8PbJ//7//f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/3++T/0ORW/7vXCf+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7rXBP/Q41b//P3z//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f74//P41L/u9cI/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYB/77aFf/w98r//v/9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+//3/7fW//8vgQv+71wf/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/u9cG/9jpdP/9/vb///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7++//j75n/xNwn/7rWAv+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+61gP/yN85//f64f////7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7/+vzr/9jocv/A2hn/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAP+51gD/udYA/7nWAf/D2yL/8PfI/////f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f75/+z0uv/l75//5e+f/+Xvn//l75//5e+f/+Xvn//l75//5e+f/+Xvn//l75//5e+f/+Xvn//l75//5e+f/+Xvn//l75//5e+f/+bwov/1+dn//v/8//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3++f/9/vf//f73//3+9//9/vf//f73//3+9//9/vf//f73//3+9//9/vf//f73//3+9//9/vf//f73//3+9//9/vf//f73//3+9//////////////////////////////////////////////////////////////////////////////////////////////////////x/////v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v////H///+s////+v//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+v///6z///85////8P//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8f///1L///8K////hf////P////+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3////y////hf///w3///8B////EP///3b////g////9f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////+f////n////5////9f///9L///9o////D////wH///8A////AP///wn///8i////T////4b///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+J////if///4n///+H////W////xT///8H////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\n \"tmeet\": \"data:image/png;base64,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\",\n \"wecom\": \"data:image/png;base64,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\",\n \"hf\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5NSIgaGVpZ2h0PSI4OCIgZmlsbD0ibm9uZSI+Cgk8cGF0aCBmaWxsPSIjRkZEMjFFIiBkPSJNNDcuMjEgNzYuNWEzNC43NSAzNC43NSAwIDEgMCAwLTY5LjUgMzQuNzUgMzQuNzUgMCAwIDAgMCA2OS41WiIgLz4KCTxwYXRoCgkJZmlsbD0iI0ZGOUQwQiIKCQlkPSJNODEuOTYgNDEuNzVhMzQuNzUgMzQuNzUgMCAxIDAtNjkuNSAwIDM0Ljc1IDM0Ljc1IDAgMCAwIDY5LjUgMFptLTczLjUgMGEzOC43NSAzOC43NSAwIDEgMSA3Ny41IDAgMzguNzUgMzguNzUgMCAwIDEtNzcuNSAwWiIKCS8+Cgk8cGF0aAoJCWZpbGw9IiMzQTNCNDUiCgkJZD0iTTU4LjUgMzIuM2MxLjI4LjQ0IDEuNzggMy4wNiAzLjA3IDIuMzhhNSA1IDAgMSAwLTYuNzYtMi4wN2MuNjEgMS4xNSAyLjU1LS43MiAzLjctLjMyWk0zNC45NSAzMi4zYy0xLjI4LjQ0LTEuNzkgMy4wNi0zLjA3IDIuMzhhNSA1IDAgMSAxIDYuNzYtMi4wN2MtLjYxIDEuMTUtMi41Ni0uNzItMy43LS4zMloiCgkvPgoJPHBhdGgKCQlmaWxsPSIjRkYzMjNEIgoJCWQ9Ik00Ni45NiA1Ni4yOWM5LjgzIDAgMTMtOC43NiAxMy0xMy4yNiAwLTIuMzQtMS41Ny0xLjYtNC4wOS0uMzYtMi4zMyAxLjE1LTUuNDYgMi43NC04LjkgMi43NC03LjE5IDAtMTMtNi44OC0xMy0yLjM4czMuMTYgMTMuMjYgMTMgMTMuMjZaIgoJLz4KCTxwYXRoCgkJZmlsbD0iIzNBM0I0NSIKCQlmaWxsLXJ1bGU9ImV2ZW5vZGQiCgkJZD0iTTM5LjQzIDU0YTguNyA4LjcgMCAwIDEgNS4zLTQuNDljLjQtLjEyLjgxLjU3IDEuMjQgMS4yOC40LjY4LjgyIDEuMzcgMS4yNCAxLjM3LjQ1IDAgLjktLjY4IDEuMzMtMS4zNS40NS0uNy44OS0xLjM4IDEuMzItMS4yNWE4LjYxIDguNjEgMCAwIDEgNSA0LjE3YzMuNzMtMi45NCA1LjEtNy43NCA1LjEtMTAuNyAwLTIuMzQtMS41Ny0xLjYtNC4wOS0uMzZsLS4xNC4wN2MtMi4zMSAxLjE1LTUuMzkgMi42Ny04Ljc3IDIuNjdzLTYuNDUtMS41Mi04Ljc3LTIuNjdjLTIuNi0xLjI5LTQuMjMtMi4xLTQuMjMuMjkgMCAzLjA1IDEuNDYgOC4wNiA1LjQ3IDEwLjk3WiIKCQljbGlwLXJ1bGU9ImV2ZW5vZGQiCgkvPgoJPHBhdGgKCQlmaWxsPSIjRkY5RDBCIgoJCWQ9Ik03MC43MSAzN2EzLjI1IDMuMjUgMCAxIDAgMC02LjUgMy4yNSAzLjI1IDAgMCAwIDAgNi41Wk0yNC4yMSAzN2EzLjI1IDMuMjUgMCAxIDAgMC02LjUgMy4yNSAzLjI1IDAgMCAwIDAgNi41Wk0xNy41MiA0OGMtMS42MiAwLTMuMDYuNjYtNC4wNyAxLjg3YTUuOTcgNS45NyAwIDAgMC0xLjMzIDMuNzYgNy4xIDcuMSAwIDAgMC0xLjk0LS4zYy0xLjU1IDAtMi45NS41OS0zLjk0IDEuNjZhNS44IDUuOCAwIDAgMC0uOCA3IDUuMyA1LjMgMCAwIDAtMS43OSAyLjgyYy0uMjQuOS0uNDggMi44LjggNC43NGE1LjIyIDUuMjIgMCAwIDAtLjM3IDUuMDJjMS4wMiAyLjMyIDMuNTcgNC4xNCA4LjUyIDYuMSAzLjA3IDEuMjIgNS44OSAyIDUuOTEgMi4wMWE0NC4zMyA0NC4zMyAwIDAgMCAxMC45MyAxLjZjNS44NiAwIDEwLjA1LTEuOCAxMi40Ni01LjM0IDMuODgtNS42OSAzLjMzLTEwLjktMS43LTE1LjkyLTIuNzctMi43OC00LjYyLTYuODctNS03Ljc3LS43OC0yLjY2LTIuODQtNS42Mi02LjI1LTUuNjJhNS43IDUuNyAwIDAgMC00LjYgMi40NmMtMS0xLjI2LTEuOTgtMi4yNS0yLjg2LTIuODJBNy40IDcuNCAwIDAgMCAxNy41MiA0OFptMCA0Yy41MSAwIDEuMTQuMjIgMS44Mi42NSAyLjE0IDEuMzYgNi4yNSA4LjQzIDcuNzYgMTEuMTguNS45MiAxLjM3IDEuMzEgMi4xNCAxLjMxIDEuNTUgMCAyLjc1LTEuNTMuMTUtMy40OC0zLjkyLTIuOTMtMi41NS03LjcyLS42OC04LjAxLjA4LS4wMi4xNy0uMDIuMjQtLjAyIDEuNyAwIDIuNDUgMi45MyAyLjQ1IDIuOTNzMi4yIDUuNTIgNS45OCA5LjNjMy43NyAzLjc3IDMuOTcgNi44IDEuMjIgMTAuODMtMS44OCAyLjc1LTUuNDcgMy41OC05LjE2IDMuNTgtMy44MSAwLTcuNzMtLjktOS45Mi0xLjQ2LS4xMS0uMDMtMTMuNDUtMy44LTExLjc2LTcgLjI4LS41NC43NS0uNzYgMS4zNC0uNzYgMi4zOCAwIDYuNyAzLjU0IDguNTcgMy41NC40MSAwIC43LS4xNy44My0uNi43OS0yLjg1LTEyLjA2LTQuMDUtMTAuOTgtOC4xNy4yLS43My43MS0xLjAyIDEuNDQtMS4wMiAzLjE0IDAgMTAuMiA1LjUzIDExLjY4IDUuNTMuMTEgMCAuMi0uMDMuMjQtLjEuNzQtMS4yLjMzLTIuMDQtNC45LTUuMi01LjIxLTMuMTYtOC44OC01LjA2LTYuOC03LjMzLjI0LS4yNi41OC0uMzggMS0uMzggMy4xNyAwIDEwLjY2IDYuODIgMTAuNjYgNi44MnMyLjAyIDIuMSAzLjI1IDIuMWMuMjggMCAuNTItLjEuNjgtLjM4Ljg2LTEuNDYtOC4wNi04LjIyLTguNTYtMTEuMDEtLjM0LTEuOS4yNC0yLjg1IDEuMzEtMi44NVoiCgkvPgoJPHBhdGgKCQlmaWxsPSIjRkZEMjFFIgoJCWQ9Ik0zOC42IDc2LjY5YzIuNzUtNC4wNCAyLjU1LTcuMDctMS4yMi0xMC44NC0zLjc4LTMuNzctNS45OC05LjMtNS45OC05LjNzLS44Mi0zLjItMi42OS0yLjljLTEuODcuMy0zLjI0IDUuMDguNjggOC4wMSAzLjkxIDIuOTMtLjc4IDQuOTItMi4yOSAyLjE3LTEuNS0yLjc1LTUuNjItOS44Mi03Ljc2LTExLjE4LTIuMTMtMS4zNS0zLjYzLS42LTMuMTMgMi4yLjUgMi43OSA5LjQzIDkuNTUgOC41NiAxMS0uODcgMS40Ny0zLjkzLTEuNzEtMy45My0xLjcxcy05LjU3LTguNzEtMTEuNjYtNi40NGMtMi4wOCAyLjI3IDEuNTkgNC4xNyA2LjggNy4zMyA1LjIzIDMuMTYgNS42NCA0IDQuOSA1LjItLjc1IDEuMi0xMi4yOC04LjUzLTEzLjM2LTQuNC0xLjA4IDQuMTEgMTEuNzcgNS4zIDEwLjk4IDguMTUtLjggMi44NS05LjA2LTUuMzgtMTAuNzQtMi4xOC0xLjcgMy4yMSAxMS42NSA2Ljk4IDExLjc2IDcuMDEgNC4zIDEuMTIgMTUuMjUgMy40OSAxOS4wOC0yLjEyWiIKCS8+Cgk8cGF0aAoJCWZpbGw9IiNGRjlEMEIiCgkJZD0iTTc3LjQgNDhjMS42MiAwIDMuMDcuNjYgNC4wNyAxLjg3YTUuOTcgNS45NyAwIDAgMSAxLjMzIDMuNzYgNy4xIDcuMSAwIDAgMSAxLjk1LS4zYzEuNTUgMCAyLjk1LjU5IDMuOTQgMS42NmE1LjggNS44IDAgMCAxIC44IDcgNS4zIDUuMyAwIDAgMSAxLjc4IDIuODJjLjI0LjkuNDggMi44LS44IDQuNzRhNS4yMiA1LjIyIDAgMCAxIC4zNyA1LjAyYy0xLjAyIDIuMzItMy41NyA0LjE0LTguNTEgNi4xLTMuMDggMS4yMi01LjkgMi01LjkyIDIuMDFhNDQuMzMgNDQuMzMgMCAwIDEtMTAuOTMgMS42Yy01Ljg2IDAtMTAuMDUtMS44LTEyLjQ2LTUuMzQtMy44OC01LjY5LTMuMzMtMTAuOSAxLjctMTUuOTIgMi43OC0yLjc4IDQuNjMtNi44NyA1LjAxLTcuNzcuNzgtMi42NiAyLjgzLTUuNjIgNi4yNC01LjYyYTUuNyA1LjcgMCAwIDEgNC42IDIuNDZjMS0xLjI2IDEuOTgtMi4yNSAyLjg3LTIuODJBNy40IDcuNCAwIDAgMSA3Ny40IDQ4Wm0wIDRjLS41MSAwLTEuMTMuMjItMS44Mi42NS0yLjEzIDEuMzYtNi4yNSA4LjQzLTcuNzYgMTEuMThhMi40MyAyLjQzIDAgMCAxLTIuMTQgMS4zMWMtMS41NCAwLTIuNzUtMS41My0uMTQtMy40OCAzLjkxLTIuOTMgMi41NC03LjcyLjY3LTguMDFhMS41NCAxLjU0IDAgMCAwLS4yNC0uMDJjLTEuNyAwLTIuNDUgMi45My0yLjQ1IDIuOTNzLTIuMiA1LjUyLTUuOTcgOS4zYy0zLjc4IDMuNzctMy45OCA2LjgtMS4yMiAxMC44MyAxLjg3IDIuNzUgNS40NyAzLjU4IDkuMTUgMy41OCAzLjgyIDAgNy43My0uOSA5LjkzLTEuNDYuMS0uMDMgMTMuNDUtMy44IDExLjc2LTctLjI5LS41NC0uNzUtLjc2LTEuMzQtLjc2LTIuMzggMC02LjcxIDMuNTQtOC41NyAzLjU0LS40MiAwLS43MS0uMTctLjgzLS42LS44LTIuODUgMTIuMDUtNC4wNSAxMC45Ny04LjE3LS4xOS0uNzMtLjctMS4wMi0xLjQ0LTEuMDItMy4xNCAwLTEwLjIgNS41My0xMS42OCA1LjUzLS4xIDAtLjE5LS4wMy0uMjMtLjEtLjc0LTEuMi0uMzQtMi4wNCA0Ljg4LTUuMiA1LjIzLTMuMTYgOC45LTUuMDYgNi44LTcuMzMtLjIzLS4yNi0uNTctLjM4LS45OC0uMzgtMy4xOCAwLTEwLjY3IDYuODItMTAuNjcgNi44MnMtMi4wMiAyLjEtMy4yNCAyLjFhLjc0Ljc0IDAgMCAxLS42OC0uMzhjLS44Ny0xLjQ2IDguMDUtOC4yMiA4LjU1LTExLjAxLjM0LTEuOS0uMjQtMi44NS0xLjMxLTIuODVaIgoJLz4KCTxwYXRoCgkJZmlsbD0iI0ZGRDIxRSIKCQlkPSJNNTYuMzMgNzYuNjljLTIuNzUtNC4wNC0yLjU2LTcuMDcgMS4yMi0xMC44NCAzLjc3LTMuNzcgNS45Ny05LjMgNS45Ny05LjNzLjgyLTMuMiAyLjctMi45YzEuODYuMyAzLjIzIDUuMDgtLjY4IDguMDEtMy45MiAyLjkzLjc4IDQuOTIgMi4yOCAyLjE3IDEuNTEtMi43NSA1LjYzLTkuODIgNy43Ni0xMS4xOCAyLjEzLTEuMzUgMy42NC0uNiAzLjEzIDIuMi0uNSAyLjc5LTkuNDIgOS41NS04LjU1IDExIC44NiAxLjQ3IDMuOTItMS43MSAzLjkyLTEuNzFzOS41OC04LjcxIDExLjY2LTYuNDRjMi4wOCAyLjI3LTEuNTggNC4xNy02LjggNy4zMy01LjIzIDMuMTYtNS42MyA0LTQuOSA1LjIuNzUgMS4yIDEyLjI4LTguNTMgMTMuMzYtNC40IDEuMDggNC4xMS0xMS43NiA1LjMtMTAuOTcgOC4xNS44IDIuODUgOS4wNS01LjM4IDEwLjc0LTIuMTggMS42OSAzLjIxLTExLjY1IDYuOTgtMTEuNzYgNy4wMS00LjMxIDEuMTItMTUuMjYgMy40OS0xOS4wOC0yLjEyWiIKCS8+Cjwvc3ZnPgo=\",\n \"agent-mail\": \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMTAiIGZpbGw9IiNmZmYiLz4KPHBhdGggZD0iTTIwIDVDMjQuMDAzOCA1IDI3LjE5MzggNS4yMTUxOSAyOS42OTM0IDUuNTEzNjdDMzQuNjA0MiA2LjEwMDM1IDM3LjUgMTAuNDAzNyAzNy41IDE1LjM0OTZWMjQuNjUwNEMzNy41IDI5LjU5NjMgMzQuNjA0MiAzMy44OTk3IDI5LjY5MzQgMzQuNDg2M0wyOC43MjI3IDM0LjU5NDdDMjYuMzgzIDM0LjgzNTggMjMuNTAzMiAzNSAyMCAzNUMxNS45OTYyIDM1IDEyLjgwNjIgMzQuNzg0OCAxMC4zMDY2IDM0LjQ4NjNDNS4zOTU3NSAzMy44OTk3IDIuNSAyOS41OTYzIDIuNSAyNC42NTA0VjE1LjM0OTZDMi41IDEwLjU1ODEgNS4yMTc3MiA2LjM2OTQgOS44NTI1NCA1LjU3OTFMMTAuMzA2NiA1LjUxMzY3QzEyLjgwNjIgNS4yMTUxOSAxNS45OTYyIDUgMjAgNVpNMjAgOC4xNTAzOUMxNi4xMDgyIDguMTUwMzkgMTMuMDQ0MSA4LjM1ODQgMTAuNjgwNyA4LjY0MDYyQzcuNzY5MDcgOC45ODgzMSA1LjY1MDM5IDExLjU0MTcgNS42NTAzOSAxNS4zNDk2VjI0LjY1MDRDNS42NTAzOSAyOC40NTgzIDcuNzY5MDcgMzEuMDExNyAxMC42ODA3IDMxLjM1OTRDMTMuMDQ0MSAzMS42NDE2IDE2LjEwODIgMzEuODQ5NiAyMCAzMS44NDk2QzIzLjg5MTggMzEuODQ5NiAyNi45NTU5IDMxLjY0MTYgMjkuMzE5MyAzMS4zNTk0QzMyLjIzMDkgMzEuMDExNyAzNC4zNDk2IDI4LjQ1ODMgMzQuMzQ5NiAyNC42NTA0VjE1LjM0OTZDMzQuMzQ5NiAxMS41NDE3IDMyLjIzMDkgOC45ODgzMSAyOS4zMTkzIDguNjQwNjJDMjYuOTU1OSA4LjM1ODQgMjMuODkxOCA4LjE1MDM5IDIwIDguMTUwMzlaTTI5LjMzNjkgMjEuMDkwOEMzMC4yMDY4IDIxLjA5MDggMzAuOTEyMSAyMS43OTYyIDMwLjkxMjEgMjIuNjY2QzMwLjkxMjEgMjUuNzQ1IDI4LjQxNTkgMjguMjQxMiAyNS4zMzY5IDI4LjI0MTJIMjIuMzM2OUMyMS40NjcyIDI4LjI0MSAyMC43NjE3IDI3LjUzNTggMjAuNzYxNyAyNi42NjZDMjAuNzYxNyAyNS43OTYzIDIxLjQ2NzIgMjUuMDkxIDIyLjMzNjkgMjUuMDkwOEgyNS4zMzY5QzI2LjY3NjIgMjUuMDkwOCAyNy43NjE3IDI0LjAwNTMgMjcuNzYxNyAyMi42NjZDMjcuNzYxNyAyMS43OTYzIDI4LjQ2NzIgMjEuMDkxIDI5LjMzNjkgMjEuMDkwOFpNMTUuMjQzMiAxNUMxNi4xMTI5IDE1LjAwMDEgMTYuODE4NCAxNS43MDU0IDE2LjgxODQgMTYuNTc1MlYxOC40MjQ4QzE2LjgxODQgMTkuMjk0NiAxNi4xMTI5IDE5Ljk5OTkgMTUuMjQzMiAyMEMxNC4zNzMzIDIwIDEzLjY2OCAxOS4yOTQ3IDEzLjY2OCAxOC40MjQ4VjE2LjU3NTJDMTMuNjY4IDE1LjcwNTMgMTQuMzczMyAxNSAxNS4yNDMyIDE1Wk0yMi43NDMyIDE1QzIzLjYxMjkgMTUuMDAwMSAyNC4zMTg0IDE1LjcwNTQgMjQuMzE4NCAxNi41NzUyVjE4LjQyNDhDMjQuMzE4NCAxOS4yOTQ2IDIzLjYxMjkgMTkuOTk5OSAyMi43NDMyIDIwQzIxLjg3MzMgMjAgMjEuMTY4IDE5LjI5NDcgMjEuMTY4IDE4LjQyNDhWMTYuNTc1MkMyMS4xNjggMTUuNzA1MyAyMS44NzMzIDE1IDIyLjc0MzIgMTVaIiBmaWxsPSIjMTExIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0IDQpIHNjYWxlKDAuOCkiLz4KPC9zdmc+Cg==\"\n}\n", "/** ic_ds_* glyphs inlined from @deepseek-ai/dsh-client-ui-primitives (MIT). */\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport function IconPinwheel({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" strokeWidth={1} aria-hidden>\n <path d=\"M7.84457 5.06199C11.6605 4.93876 14.7962 6.14848 14.8484 7.76397C14.8875 8.97461 13.1838 10.0696 10.7215 10.5942\" stroke=\"currentColor\" />\n <path d=\"M5.12742 8.07731C5.00419 4.26138 6.21391 1.12568 7.8294 1.07351C9.04004 1.03441 10.135 2.73808 10.6596 5.20037\" stroke=\"currentColor\" />\n <path d=\"M8.02457 10.6802C4.20865 10.8034 1.07294 9.5937 1.02077 7.97821C0.981678 6.76758 2.68535 5.67262 5.14763 5.14798\" stroke=\"currentColor\" />\n <path d=\"M10.7476 7.89535C10.8708 11.7113 9.66109 14.847 8.0456 14.8991C6.83496 14.9382 5.74 13.2346 5.21536 10.7723\" stroke=\"currentColor\" />\n </svg>\n )\n}\n\nexport function IconPlug({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" strokeWidth={1} aria-hidden>\n <path d=\"M5.25 1.75V4.5M10.75 1.75V4.5\" stroke=\"currentColor\" strokeLinecap=\"round\" />\n <path d=\"M4 4.5H12V7.25C12 9.45914 10.2091 11.25 8 11.25C5.79086 11.25 4 9.45914 4 7.25V4.5Z\" stroke=\"currentColor\" strokeLinejoin=\"round\" />\n <path d=\"M8 11.25V14.25\" stroke=\"currentColor\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nexport function IconLink({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n fill=\"currentColor\"\n d=\"M9.94133 6.50173C11.3218 7.99603 11.3218 10.3011 9.94128 11.7954C9.88691 11.8542 9.82125 11.9196 9.72099 12.0198L7.75707 13.9838C7.65709 14.0838 7.592 14.1491 7.53334 14.2034C6.03906 15.5843 3.7327 15.5854 2.23827 14.2048C2.17933 14.1503 2.11374 14.0844 2.01315 13.9838C1.91318 13.8839 1.84922 13.8188 1.79495 13.7601C0.413857 12.2657 0.413909 9.95948 1.795 8.46503C1.84923 8.4064 1.91335 8.34115 2.01321 8.24129L3.79275 6.46313C3.71814 7.08101 3.75236 7.71445 3.90115 8.33518L3.00344 9.23151C2.89398 9.34097 2.8535 9.38307 2.82251 9.41658C1.93771 10.3744 1.93704 11.8514 2.82179 12.8092C2.85279 12.8427 2.89383 12.884 3.0034 12.9936C3.11272 13.1029 3.15429 13.1442 3.18777 13.1752C4.14561 14.0603 5.62381 14.0608 6.58178 13.1758C6.61532 13.1448 6.65722 13.1032 6.76685 12.9935L8.73077 11.0296C8.83999 10.9204 8.88142 10.8787 8.91238 10.8452C9.79744 9.88728 9.7969 8.40911 8.91173 7.45124C8.88074 7.41775 8.83944 7.3762 8.73011 7.26687C8.62082 7.15757 8.58061 7.11623 8.54712 7.08526C8.37347 6.92477 8.18243 6.79361 7.98088 6.69165L9.00289 5.66964C9.17506 5.78373 9.34035 5.91265 9.49663 6.05703C9.55538 6.11135 9.62026 6.17652 9.72036 6.27662C9.82094 6.3772 9.88686 6.4428 9.94133 6.50173Z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M6.06816 9.49196C4.68626 7.99724 4.68667 5.68942 6.06885 4.19487C6.12268 4.13671 6.18789 4.07306 6.28706 3.9739L8.24541 2.01416C8.34478 1.91479 8.41018 1.85055 8.46845 1.79665C9.96301 0.414902 12.2689 0.414922 13.7635 1.79665C13.8217 1.85051 13.8866 1.91559 13.9858 2.01486C14.0849 2.11394 14.1502 2.17769 14.204 2.23583C15.5861 3.7304 15.5866 6.03823 14.2047 7.53291C14.1508 7.59125 14.0854 7.65638 13.9858 7.75595L12.1994 9.54098C12.2614 8.92982 12.2185 8.30587 12.0634 7.69657L12.9956 6.76573C13.1044 6.65692 13.1458 6.61529 13.1765 6.58205C14.0621 5.62404 14.0621 4.1454 13.1765 3.18738C13.1458 3.15419 13.104 3.1135 12.9956 3.00508C12.8877 2.89716 12.8471 2.85551 12.814 2.82485C11.8559 1.9389 10.376 1.93886 9.41794 2.82485C9.38479 2.85554 9.34381 2.89622 9.23564 3.00439L7.27728 4.96413C7.16875 5.07265 7.12708 5.11322 7.09636 5.14643C6.21074 6.10441 6.21153 7.58236 7.09705 8.5404C7.12775 8.57357 7.16826 8.61575 7.27659 8.72408C7.38456 8.83205 7.42647 8.87227 7.45958 8.90293C7.62849 9.0591 7.81309 9.1881 8.00856 9.28894L6.98795 10.3095C6.82111 10.1978 6.66052 10.0715 6.50872 9.93114C6.45057 9.87733 6.38547 9.81341 6.28637 9.71431C6.1871 9.61504 6.12202 9.55018 6.06816 9.49196Z\"\n />\n </svg>\n )\n}\n\nexport function IconCopy({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <rect x=\"5.75\" y=\"5.75\" width=\"7.5\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <path\n d=\"M10.75 4.25V3.5A1.5 1.5 0 0 0 9.25 2h-5A1.5 1.5 0 0 0 2.75 3.5v6a1.5 1.5 0 0 0 1.5 1.5h.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\nexport function IconClose({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path d=\"M3.5 3.5L12.5 12.5M12.5 3.5L3.5 12.5\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nexport function IconCheck({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path d=\"M3.2 8.4L6.4 11.6L12.8 4.4\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nexport function IconAlert({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <circle cx=\"8\" cy=\"8\" r=\"6.25\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <path d=\"M8 4.6V8.8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.2\" r=\"0.7\" fill=\"currentColor\" />\n </svg>\n )\n}\n\nexport function IconMore({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden>\n <circle cx=\"3.5\" cy=\"8\" r=\"1\" />\n <circle cx=\"8\" cy=\"8\" r=\"1\" />\n <circle cx=\"12.5\" cy=\"8\" r=\"1\" />\n </svg>\n )\n}\n\nexport function IconPlay({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path d=\"M4.6 3.2L12.2 8L4.6 12.8V3.2Z\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nexport function IconTrash({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path d=\"M3.2 4.6H12.8\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n <path d=\"M6.2 4.6V3.2H9.8V4.6\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinejoin=\"round\" />\n <path d=\"M4.6 4.6L5.2 13H10.8L11.4 4.6\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinejoin=\"round\" />\n <path d=\"M6.8 7V11M9.2 7V11\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nexport function IconChevronDown({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path d=\"M3.5 6L8 10.5L12.5 6\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nexport function IconChevronRight({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path d=\"M6 3.5L10.5 8L6 12.5\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nexport function IconSearch({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n fill=\"currentColor\"\n d=\"M11.894845 6.647401C11.894845 3.725463 9.534486 1.356779 6.623219 1.35657C3.711786 1.35657 1.351635 3.725338 1.351635 6.647401C1.351843 9.569296 3.711911 11.938273 6.623219 11.938273C9.534361 11.938064 11.894637 9.569171 11.894845 6.647401ZM13.245462 6.647401C13.245254 10.317935 10.280401 13.293613 6.623219 13.293821C2.965871 13.293821 0.000204 10.31806 0 6.647401C0 2.976574 2.965746 0 6.623219 0C10.280526 0.000205 13.245462 2.9767 13.245462 6.647401Z\"\n />\n <path fill=\"currentColor\" d=\"M16.000417 15.041079L15.044449 16.000433L11.530434 12.473588L12.486298 11.514234L16.000417 15.041079Z\" />\n </svg>\n )\n}\n\nexport function IconEye({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M1.75 8S4 3.75 8 3.75 14.25 8 14.25 8 12 12.25 8 12.25 1.75 8 1.75 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n )\n}\n\nexport function IconHelp({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <circle cx=\"8\" cy=\"8\" r=\"6.25\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <path\n d=\"M6.35 6.1A1.65 1.65 0 1 1 8.7 7.5c-.45.28-.7.6-.7 1.05v.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"8\" cy=\"11.2\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n )\n}\n\nexport function IconServer({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"4.75\" rx=\"1.25\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <rect x=\"2.5\" y=\"8.75\" width=\"11\" height=\"4.75\" rx=\"1.25\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <circle cx=\"5\" cy=\"4.875\" r=\".75\" fill=\"currentColor\" />\n <circle cx=\"5\" cy=\"11.125\" r=\".75\" fill=\"currentColor\" />\n </svg>\n )\n}\n\nexport function IconPencil({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M10.6 2.9a1.35 1.35 0 0 1 1.9 0l.6.6a1.35 1.35 0 0 1 0 1.9L6.2 12.2l-3 .8.8-3 6.6-6.6Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M9.5 4L12 6.5\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nexport function IconEyeOff({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M1.75 8S4 3.75 8 3.75 14.25 8 14.25 8 12 12.25 8 12.25 1.75 8 1.75 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <path d=\"M2.5 2.5L13.5 13.5\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nexport function IconPlus({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path fill=\"currentColor\" d=\"M8.64453 1.5V7.34961H14.5V8.65039H8.64453V14.5H7.34473V8.65039H1.5V7.34961H7.34473V1.5H8.64453Z\" />\n </svg>\n )\n}\n\nexport function IconRefresh({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n fill=\"currentColor\"\n d=\"M7.92136 0.349152C10.3744 0.349234 12.5564 1.5052 13.9557 3.29894L15.1281 2.12759C15.3303 1.92546 15.6767 2.06943 15.6767 2.35538V5.53923C15.6766 5.71626 15.5329 5.85976 15.3559 5.86002H12.171C11.8854 5.8597 11.7426 5.51465 11.9443 5.31249L12.9641 4.29056C11.8237 2.74305 9.98908 1.74106 7.92136 1.74097C4.46436 1.74097 1.66233 4.543 1.66233 8C1.66233 11.457 4.46436 14.259 7.92136 14.259C11.3782 14.2589 14.1804 11.4569 14.1804 8H15.5722C15.5722 12.2251 12.1465 15.6507 7.92136 15.6508C3.69614 15.6508 0.270508 12.2252 0.270508 8C0.270508 3.77478 3.69614 0.349152 7.92136 0.349152Z\"\n />\n </svg>\n )\n}\n\nexport function IconCode({ size = 16, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n fill=\"currentColor\"\n d=\"M12.3368 1.53569L11.931 4.43172H14.8086V5.79673H11.7404L11.1962 9.67859H14.2839V11.0436H11.0056L10.4994 14.6529L9.14873 14.4643L9.62731 11.0436H5.75876L5.25252 14.6529L3.90186 14.4643L4.38043 11.0436H1.69141V9.67859H4.57104L5.11417 5.79673H2.21609V4.43172H5.30581L5.73724 1.34713L7.08995 1.53569L6.68414 4.43172H10.5527L10.9841 1.34713L12.3368 1.53569ZM5.94937 9.67859H9.81791L10.361 5.79673H6.49353L5.94937 9.67859Z\"\n />\n </svg>\n )\n}\n\nexport function IconGlobe({ size = 14, className }: IconProps): JSX.Element {\n return (\n <svg width={size} height={size} className={className} viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden>\n <path\n fill=\"currentColor\"\n d=\"M7.00018 0.353516C10.6708 0.353535 13.6468 3.32958 13.6469 7.00018C13.6468 10.6708 10.6708 13.6468 7.00018 13.6469C3.32957 13.6468 0.353535 10.6708 0.353516 7.00018C0.353535 3.32957 3.32957 0.353531 7.00018 0.353516ZM5.44643 7.59661C5.49463 8.97506 5.70762 10.191 6.02136 11.0793C6.20141 11.5891 6.40328 11.9585 6.59898 12.1889C6.79501 12.4196 6.93213 12.454 7.00018 12.454C7.06822 12.454 7.20533 12.4197 7.40138 12.1889C7.59708 11.9585 7.79895 11.589 7.979 11.0793C8.29274 10.191 8.50574 8.97506 8.55394 7.59661H5.44643ZM1.57861 7.59661C1.80785 9.70467 3.2386 11.4509 5.1715 12.1388C5.07135 11.9317 4.97972 11.7098 4.89746 11.477C4.53084 10.4391 4.30224 9.0828 4.25357 7.59661H1.57861ZM9.74679 7.59661C9.69813 9.0828 9.46952 10.4391 9.1029 11.477C9.0206 11.7099 8.92818 11.9316 8.82797 12.1388C10.7613 11.4511 12.1925 9.70496 12.4218 7.59661H9.74679ZM5.1706 1.8616C3.23814 2.54963 1.80876 4.29604 1.5795 6.40376H4.25357C4.30224 4.91756 4.53083 3.56129 4.89746 2.5234C4.97968 2.29066 5.07051 2.0686 5.1706 1.8616ZM7.00018 1.54637C6.93213 1.54638 6.79503 1.5807 6.59898 1.81145C6.40332 2.04177 6.20139 2.41058 6.02136 2.92012C5.70754 3.80851 5.49461 5.02499 5.44643 6.40376H8.55394C8.50575 5.025 8.29282 3.80851 7.979 2.92012C7.79898 2.41059 7.59705 2.04177 7.40138 1.81145C7.20531 1.58067 7.06823 1.54637 7.00018 1.54637ZM8.82887 1.8616C8.92902 2.0687 9.02064 2.29053 9.1029 2.5234C9.46953 3.56129 9.69812 4.91756 9.74679 6.40376H12.4209C12.1916 4.29575 10.7618 2.54943 8.82887 1.8616Z\"\n />\n </svg>\n )\n}\n", "// \u7531 scripts/build-provider-icons.mjs \u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u6539\u3002\n// \u5728 providers/<id>/icon.svg|png|webp \u653E\u7F6E\u56FE\u6807\u540E\u91CD\u65B0\u8FD0\u884C npm run providers:icons\u3002\nexport const PROVIDER_ICONS: Record<string, string> = {\n \"amap\": \"data:image/png;base64,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\",\n \"baidu-netdisk\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFeElEQVR4nMWXa2wUVRTHfzO73dnulm3pAsVCreXdolQeMXwQHwGaCEYggYgxxEcMJggJCWiMX/yAkhASgyY+MOAjmPgFEImNVj4o8lKB2kfsoiCs5dHti213O7s7Mztzze1W+8bFB/yTyWTmnnv//3vuuefeozAA9XX1gcJg4Xq/37/E4/Hc5XK5JiqKovIvIIRwbNuOmKYZ1nW9JhqN7p0zZ05smGEoFFqeSCTaxP8MydHU1LR8EHl9ff0Sx3HErYLkamhoWNJLfvbs2TzDMFLiFkNy1p6tzVOLiorWezwejVsMyRkcF9zo9vl8K//JALoDYQNsB0o0GOu++TECgcCjbk3TSm6mU2cadrXC8W6IGGBY4BewIA9emQLTc7Mfy+PxFCupVCqmadqYbDr8nISnw3AlBbkOdBlgWuB2BN1J8ChwaIHCI+OzE2AYRlwK6NE0zZ/NzJedh5gNtgUBFRb6QdhwtENwPg52GmxTIVQFs/KyEqAjPZBN1G7qFoJmIcoahVgVEuJisr/takqIZacdwWEh+FKI8vrsdoLkzirLXQUSoTZeOFOHdNXu6VDm7W8v1qB6gUJhHiyrPYP/u0vUimxGhqw80NnVLfQXXxVi1Wpx7otvR7X76cAJIUoeFGblWnH5l+b/zgOF0S58Rg+MCTKz9fdR7e6NXAJvATlGgsnXWrJygHqjxk/aYWUYVndMwAkUgN8LTZdG73AqBPk+CI6l6kopC3+EN8/9AwEJB544DxsuwjdtcMDrpaZwKthJiHTAzvcgafR3sB2c7XsQoTCQ5OTEGRzJL+KHC7D5GMyrhg5zZAHKSHnguUtwsAPucEMyDZ5xUH61k917tzFBFRA3obgYKmeDUBCnG6H2PIrm5nrLdda9/Aan7plK9ELfFLuhogR+XjZyHogNFPBVN6y7kCHPAbaXwuIx8JsLrFMhZu96C4UUWB6IJsG0IccNehKry6R52xb0tYuYaUNNKzz7PVxPguiCt6tgw/S/EbC5GfZ3Qo6APVNhcf5g1Xt+ukr+voOsicisFIe0jWF62B8oZdbW1cy/v3yQ/ZFWqKrpXRkWlsGpqsEC3EPXpNXKvGfmDieXmDB3EivSm1jU0srsaIQ23eFEzng2rpnMqoLh9kuL4M4gNF+By4nh7e6hP3KUvmVLg+GANiRMg1FQ49BUUsSxyUW9M9tZCVtvkHp1Ga/K8LEkhv2a4QVDQMSCHTIFDsG2MARVgRKVRoL90zLkb4dhSwOkh2TAl+qhU94AbZhTkIUHHi+EvW0gg+KDNui2YWkAdBs+isCZmMADtJiZk2/FBPi6AzYeF6AoHO2EDVMg4ILDLbDvV+lWmXJh6+DwGH0bftwBG36D4hxIpDMnngx2qTZhCVJp+GyuwvJxGfvaGMw/KsBUel2NjCMbcDKupwu23p9ZqoGQQaiOtAxPjYPdUyHXBT125giW7640zPDDt/f1k0vMC8DpBxTuLugjH/BoLnj9oeHkfVBveCG5noaaKPyeApl/ZvngsQHEI+HQNaiLgpGGMj8snwSTRrkl9eYBXdcv+ny+Mm4DEolEWLUs6xq3CaZpXlZjsdjnt0tAT0/PIbW9vf0dy7IGHG23BqZpGpGWyPu9H3V1dX9fmllpIeK6ED2JvkcXjp4QsZQjulOi/0kKYaZvPJTkamxs7C3NlD8VyeK0tLT0w9zc3JEv1Scb4PnXoCgIqgqmju4LUvnwDiJeN/mmrIShJQqfPglrK0aeeTKZbA+Hw89UVFRUy++/MmF5eXl1Y2PjtIKCgvU+n2+Jpmn95bmigGUi5LHrUuXuRXWrJFwKmpMg1/HiFaJXgKzxbFkv9An6szy3LCscj8e/iUaj71ZWVv5Vnv8Bxx3LDavStScAAAAASUVORK5CYII=\",\n \"circleci\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjMzQzNDM0IiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+Q2lyY2xlQ0k8L3RpdGxlPjxwYXRoIGQ9Ik04Ljk2MyAxMmMwLTEuNTg0IDEuMjg0LTIuODU1IDIuODU1LTIuODU1IDEuNTcyIDAgMi44NTYgMS4yODQgMi44NTYgMi44NTUgMCAxLjU3Mi0xLjI4NCAyLjg1Ni0yLjg1NiAyLjg1Ni0xLjU3IDAtMi44NTUtMS4yODQtMi44NTUtMi44NTZ6bTIuODU1LTEyQzYuMjE1IDAgMS41MjIgMy44NC4xOSA5LjAyNWMtLjAxLjAzNi0uMDEuMDctLjAxLjEyIDAgLjMxMy4yNTIuNTc2LjU3NS41NzZINS41OWMuMjMgMCAuNDMzLS4xMy41MTctLjMzMy45OTctMi4xNiAzLjE4LTMuNjcyIDUuNzEyLTMuNjcyIDMuNDY2IDAgNi4yODYgMi44MiA2LjI4NiA2LjI4NyAwIDMuNDctMi44MiA2LjI5LTYuMjkgNi4yOS0yLjUzIDAtNC43MTQtMS41LTUuNzEtMy42NzMtLjA5Ny0uMTktLjI5LS4zMzYtLjUxNy0uMzM2SC43NTVjLS4zMTIgMC0uNTc1LjI1My0uNTc1LjU3NiAwIC4wMzcuMDE0LjA3Mi4wMTQuMTJDMS41MTQgMjAuMTYgNi4yMTQgMjQgMTEuODE4IDI0YzYuNjI0IDAgMTItNS4zNzUgMTItMTIgMC02LjYyMy01LjM3Ni0xMi0xMi0xMnoiLz48L3N2Zz4=\",\n \"cloudflare-docs\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRjM4MDIwIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+Q2xvdWRmbGFyZTwvdGl0bGU+PHBhdGggZD0iTTE2LjUwODggMTYuODQ0N2MuMTQ3NS0uNTA2OC4wOTA4LS45NzA3LS4xNTUzLTEuMzE1NC0uMjI0Ni0uMzE2NC0uNjA0NS0uNDk5LTEuMDYxNS0uNTIwNWwtOC42NTkyLS4xMTIzYS4xNTU5LjE1NTkgMCAwIDEtLjEzMzMtLjA3MTNjLS4wMjgzLS4wNDItLjAzNTEtLjA5ODYtLjAyMS0uMTU1My4wMjc4LS4wODQuMTEyMy0uMTQ4NC4yMDM2LS4xNTYybDguNzM1OS0uMTEyM2MxLjAzNTEtLjA0ODkgMi4xNjAxLS44ODY4IDIuNTUzNy0xLjkxMzZsLjQ5OS0xLjMwMTNjLjAyMTUtLjA1NjEuMDI5My0uMTEyOC4wMTQ3LS4xNjgtLjU2MjUtMi41NDYzLTIuODM1LTQuNDQ1My01LjU0OTktNC40NDUzLTIuNTAzOSAwLTQuNjI4NCAxLjYxNzctNS4zODc2IDMuODYxNC0uNDkyNy0uMzY1OC0xLjExODctLjU2MjUtMS43OTQtLjQ5OS0xLjIwMjYuMTE5LTIuMTY2NSAxLjA4My0yLjI4NjEgMi4yODU2LS4wMjgzLjMxLS4wMDY5LjYxMjguMDYzNS44OTRDMS41NjgzIDEzLjE3MSAwIDE0Ljc3NTQgMCAxNi43NTJjMCAuMTc0OC4wMTQyLjM1MTUuMDM1Mi41MjczLjAxNDEuMDgzLjA4NDQuMTQ3NS4xNjg5LjE0NzVoMTUuOTgxNGMuMDkwOSAwIC4xNzU4LS4wNjQ1LjIwMzItLjE1NTNsLjEyLS40MjY4em0yLjc1NjgtNS41NjM0Yy0uMDc3MSAwLS4xNjExIDAtLjIzODMuMDExMi0uMDU2NiAwLS4xMDU0LjA0MTUtLjEyNy4wOTc2bC0uMzM3OCAxLjE3NDRjLS4xNDc1LjUwNjgtLjA5MTguOTcwNy4xNTQzIDEuMzE2NC4yMjU2LjMxNjQuNjA1NS40OTggMS4wNjI1LjUxOTVsMS44NDM3LjExMzNjLjA1NTcgMCAuMTA1NS4wMjYzLjEzMjkuMDcwMy4wMjgzLjA0My4wMzUxLjEwNzQuMDIxNC4xNTYyLS4wMjgzLjA4NC0uMTEzMi4xNDg1LS4yMDQuMTU1M2wtMS45MjEuMTEyM2MtMS4wNDEuMDQ4OC0yLjE1ODIuODg2Ny0yLjU1MjcgMS45MTRsLS4xNDA2LjM1ODVjLS4wMjgzLjA3MTMuMDIxNS4xNDE2LjA5ODYuMTQxNmg2LjU5NzdjLjA3NzEgMCAuMTQ3NC0uMDQ4OS4xNjktLjEyNi4xMTIyLS40MDgyLjE3NTctLjgzNy4xNzU3LTEuMjgwMyAwLTIuNjAyNS0yLjEyNS00LjcyNy00LjczNDQtNC43MjciLz48L3N2Zz4=\",\n \"context7\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABLCAYAAADXjBHUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaWlDQ1BEaXNwbGF5IFAzAAB4nHWQvUvDUBTFT6tS0DqIDh0cMolD1NIKdnFoKxRFMFQFq1OafgltfCQpUnETVyn4H1jBWXCwiFRwcXAQRAcR3Zw6KbhoeN6XVNoi3sfl/Ticc7lcwBtQGSv2AijplpFMxKS11Lrke4OHnlOqZrKooiwK/v276/PR9d5PiFlNu3YQ2U9cl84ul3aeAlN//V3Vn8maGv3f1EGNGRbgkYmVbYsJ3iUeMWgp4qrgvMvHgtMunzuelWSc+JZY0gpqhrhJLKc79HwHl4plrbWD2N6f1VeXxRzqUcxhEyYYilBRgQQF4X/8044/ji1yV2BQLo8CLMpESRETssTz0KFhEjJxCEHqkLhz634PrfvJbW3vFZhtcM4v2tpCAzidoZPV29p4BBgaAG7qTDVUR+qh9uZywPsJMJgChu8os2HmwiF3e38M6Hvh/GMM8B0CdpXzryPO7RqFn4Er/QcXKWq8MSlPPgAABA5JREFUeAHtmzFME2EUgB+GQXCgGCSBpeiICRjERROKoYtG4kANC6kDasLCAgNLO+BcBxgYxIHiZhkgRJcahcgmJB1k1HaBBBLtomHTezXVu/+u9N3de03Q9yUM/cPlb7/+79279/9tap4bfwdKXZqtv2FQ6nIOFBIqioiKIqKiiKgoIiqKiIoioqKIqCgiKoqIiiKioog0Q0hil3th+cEU+GX78z5M5pZ8XZObmIX+7ij4JbGagcJhEcIQWhTS034J/FIKcE2kpTXQXHhdWDT0iKgoIqFDr3BYguK3Y0dIlKzXK7tbp16H/+OX7N4WbFm57TSS12Ou9xJkLpPQoson3+GRlZTzj9N/xqLWGy2f/IDFndfASbaO/NRIwpXDxl5mKl9kWFhCD7/lmc2sY+zZvSTErvRCo+jv7oF0POEYe/o2B4WDInDAlqMWrNVjhsWLxBREzl8AaXCO3MSMY2x9/yPM53PABWsyx7oIQ64KhmAqPgbS4BxmyM1urgAnrKIwaS58cOal6Vt3ob+rB6TALwPnsIMhx5GX7LCXB4s7bxyrCslY+UqK9EjCNVYv6QeBXRTeBbO77x1jmNQlVhWuJiwH7KAk7tWEiBScG1YiNUkODAE3nqtpj381ISKiCgclV/glB4eBmyGP8qNeQRoUEVEYfqWvR46xyPlW1roKuxbmnU5KEiL2rIePNiZ9jHmqzyowTUoCuamKmCivhHqty38vqRa4oihzciEmqlR2v+kgTbdaePWYzuSK8oLzcSYaoIEXhoaKamvhExVpkX+GtNPUPDf+E5S6aIeTiIoioqKIqCgiKooIywaoF1jneFXPXE/3yYGYa2z7y75YdS4mCh+AsWduBytnLlGpuHvHZfLVkiXqDLVZ/kXERLV5PK5whgX2vFxzClbrYqJ62jtcY1x7bEipfOSeM9IBUoiJikY6XWOYbLnw6ndFL3aCFGKivFoqXh8uKBuf3H15zn6XiYgoLA282rScOQrbzWbrtzJvRKb9IiLKqzcusde27rHbM3r1BkggImr65h3Ha876yc6qJd/c7bnfOwgSsIvCarzfaPxzHpawg+FnbuHjapY4RcMuytw+l1pNVXAL38x9KY+N0bCwisLt7UatpirVg2x2cEV5PQuGgU1U5YiP8U3iiTvJ1VQF737m6b7M6MNAJ4hrwSZqbWLGdXZyPr8GjQLnsocg7kwvJ/yff68FiyhcSfaQQ0nx5/OVsGgUONfvOf/eBTEEuY4chd6Fwbtc/kna93UYLvjB/IAHaoPc0QYX5kL/cuG/aLPoLxcaiIoiEroVXCwfB6qVpH65wDWXiW6pE9HQI6KiiKgoIiqKiIoioqKIqCgiKoqIiiKiooioKCIqiojVPWi6DUpdfgE8wFukKedIwQAAAABJRU5ErkJggg==\",\n \"deepwiki\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij4KICA8cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSI2IiBmaWxsPSIjNkI0RUZGIi8+CiAgPHBhdGggZD0iTTYgNy41YzIuMiAwIDQgLjUgNiAxLjggMi0xLjMgMy44LTEuOCA2LTEuOHY5LjJjLTIuMiAwLTQgLjUtNiAxLjgtMi0xLjMtMy44LTEuOC02LTEuOFY3LjVaIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiAgPHBhdGggZD0iTTEyIDkuM3Y5LjIiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPC9zdmc+Cg==\",\n \"firecrawl\": \"data:image/png;base64,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\",\n \"gitee\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjQzcxRDIzIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+R2l0ZWU8L3RpdGxlPjxwYXRoIGQ9Ik0xMS45ODQgMEExMiAxMiAwIDAgMCAwIDEyYTEyIDEyIDAgMCAwIDEyIDEyIDEyIDEyIDAgMCAwIDEyLTEyQTEyIDEyIDAgMCAwIDEyIDBhMTIgMTIgMCAwIDAtLjAxNiAwem02LjA5IDUuMzMzYy4zMjggMCAuNTkzLjI2Ni41OTIuNTkzdjEuNDgyYS41OTQuNTk0IDAgMCAxLS41OTMuNTkySDkuNzc3Yy0uOTgyIDAtMS43NzguNzk2LTEuNzc4IDEuNzc4djUuNjNjMCAuMzI3LjI2Ni41OTIuNTkzLjU5Mmg1LjYzYy45ODIgMCAxLjc3OC0uNzk2IDEuNzc4LTEuNzc4di0uMjk2YS41OTMuNTkzIDAgMCAwLS41OTItLjU5M2gtNC4xNWEuNTkyLjU5MiAwIDAgMS0uNTkyLS41OTJ2LTEuNDgyYS41OTMuNTkzIDAgMCAxIC41OTMtLjU5Mmg2LjgxNWMuMzI3IDAgLjU5My4yNjUuNTkzLjU5MnYzLjQwOGE0IDQgMCAwIDEtNCA0SDUuOTI2YS41OTMuNTkzIDAgMCAxLS41OTMtLjU5M1Y5Ljc3OGE0LjQ0NCA0LjQ0NCAwIDAgMSA0LjQ0NS00LjQ0NGg4LjI5NloiLz48L3N2Zz4=\",\n \"github\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBmaWxsPSIjMTgxNzE3IiBkPSJNMTIgLjI5N2MtNi42MyAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDMgMy40MzggOS44IDguMjA1IDExLjM4NS42LjExMy44Mi0uMjU4LjgyLS41NzcgMC0uMjg1LS4wMS0xLjA0LS4wMTUtMi4wNC0zLjMzOC43MjQtNC4wNDItMS42MS00LjA0Mi0xLjYxQzQuNDIyIDE4LjA3IDMuNjMzIDE3LjcgMy42MzMgMTcuN2MtMS4wODctLjc0NC4wODQtLjcyOS4wODQtLjcyOSAxLjIwNS4wODQgMS44MzggMS4yMzYgMS44MzggMS4yMzYgMS4wNyAxLjgzNSAyLjgwOSAxLjMwNSAzLjQ5NS45OTguMTA4LS43NzYuNDE3LTEuMzA1Ljc2LTEuNjA1LTIuNjY1LS4zLTUuNDY2LTEuMzMyLTUuNDY2LTUuOTMgMC0xLjMxLjQ2NS0yLjM4IDEuMjM1LTMuMjItLjEzNS0uMzAzLS41NC0xLjUyMy4xMDUtMy4xNzYgMCAwIDEuMDA1LS4zMjIgMy4zIDEuMjMuOTYtLjI2NyAxLjk4LS4zOTkgMy0uNDA1IDEuMDIuMDA2IDIuMDQuMTM4IDMgLjQwNSAyLjI4LTEuNTUyIDMuMjg1LTEuMjMgMy4yODUtMS4yMy42NDUgMS42NTMuMjQgMi44NzMuMTIgMy4xNzYuNzY1Ljg0IDEuMjMgMS45MSAxLjIzIDMuMjIgMCA0LjYxLTIuODA1IDUuNjI1LTUuNDc1IDUuOTIuNDIuMzYuODEgMS4wOTYuODEgMi4yMiAwIDEuNjA2LS4wMTUgMi44OTYtLjAxNSAzLjI4NiAwIC4zMTUuMjEuNjkuODI1LjU3QzIwLjU2NSAyMi4wOTIgMjQgMTcuNTkyIDI0IDEyLjI5N2MwLTYuNjI3LTUuMzczLTEyLTEyLTEyIi8+PC9zdmc+Cg==\",\n \"gitlab\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBmaWxsPSIjZTI0MzI5IiBkPSJNMTIgMjIuMTg2bDQuNDItMTMuNjA1SDcuNThMMTIgMjIuMTg2eiIvPjxwYXRoIGZpbGw9IiNmYzZkMjYiIGQ9Ik0xMiAyMi4xODZMNy41OCA4LjU4MUgxLjY1TDEyIDIyLjE4NnoiLz48cGF0aCBmaWxsPSIjZmNhMzI2IiBkPSJNMS42NSA4LjU4MUwuMTY3IDEzLjE0NWEuOTE2LjkxNiAwIDAwLjMzMyAxLjAyNkwxMiAyMi4xODYgMS42NSA4LjU4MXoiLz48cGF0aCBmaWxsPSIjZTI0MzI5IiBkPSJNMS42NSA4LjU4MWg1LjkzTDUuMDMzLjkyN2EuNDU4LjQ1OCAwIDAwLS44NzIgMEwxLjY1IDguNTgxeiIvPjxwYXRoIGZpbGw9IiNmYzZkMjYiIGQ9Ik0xMiAyMi4xODZsNC40Mi0xMy42MDVoNS45M0wxMiAyMi4xODZ6Ii8+PHBhdGggZmlsbD0iI2ZjYTMyNiIgZD0iTTIyLjM1IDguNTgxbDEuNDgzIDQuNTY0YS45MTYuOTE2IDAgMDEtLjMzMyAxLjAyNkwxMiAyMi4xODYgMjIuMzUgOC41ODF6Ii8+PHBhdGggZmlsbD0iI2UyNDMyOSIgZD0iTTIyLjM1IDguNTgxaC01LjkzbDIuNTQ3LTcuNjU0YS40NTguNDU4IDAgMDEuODcyIDBsMi41MTEgNy42NTR6Ii8+PC9zdmc+Cg==\",\n \"gitlab-self-hosted\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBmaWxsPSIjZTI0MzI5IiBkPSJNMTIgMjIuMTg2bDQuNDItMTMuNjA1SDcuNThMMTIgMjIuMTg2eiIvPjxwYXRoIGZpbGw9IiNmYzZkMjYiIGQ9Ik0xMiAyMi4xODZMNy41OCA4LjU4MUgxLjY1TDEyIDIyLjE4NnoiLz48cGF0aCBmaWxsPSIjZmNhMzI2IiBkPSJNMS42NSA4LjU4MUwuMTY3IDEzLjE0NWEuOTE2LjkxNiAwIDAwLjMzMyAxLjAyNkwxMiAyMi4xODYgMS42NSA4LjU4MXoiLz48cGF0aCBmaWxsPSIjZTI0MzI5IiBkPSJNMS42NSA4LjU4MWg1LjkzTDUuMDMzLjkyN2EuNDU4LjQ1OCAwIDAwLS44NzIgMEwxLjY1IDguNTgxeiIvPjxwYXRoIGZpbGw9IiNmYzZkMjYiIGQ9Ik0xMiAyMi4xODZsNC40Mi0xMy42MDVoNS45M0wxMiAyMi4xODZ6Ii8+PHBhdGggZmlsbD0iI2ZjYTMyNiIgZD0iTTIyLjM1IDguNTgxbDEuNDgzIDQuNTY0YS45MTYuOTE2IDAgMDEtLjMzMyAxLjAyNkwxMiAyMi4xODYgMjIuMzUgOC41ODF6Ii8+PHBhdGggZmlsbD0iI2UyNDMyOSIgZD0iTTIyLjM1IDguNTgxaC01LjkzbDIuNTQ3LTcuNjU0YS40NTguNDU4IDAgMDEuODcyIDBsMi41MTEgNy42NTR6Ii8+PC9zdmc+Cg==\",\n \"grafana\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRjQ2ODAwIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+R3JhZmFuYTwvdGl0bGU+PHBhdGggZD0iTTIzLjAyIDEwLjU5YTguNTc4IDguNTc4IDAgMCAwLS44NjItMy4wMzQgOC45MTEgOC45MTEgMCAwIDAtMS43ODktMi40NDVjLjMzNy0xLjM0Mi0uNDEzLTIuNTA1LS40MTMtMi41MDUtMS4yOTItLjA4LTIuMTEzLjQtMi40MTYuNjItLjA1Mi0uMDItLjEwMi0uMDQ0LS4xNTQtLjA2NC0uMjItLjA4OS0uNDQ2LS4xNzItLjY3Ny0uMjQ3LS4yMzEtLjA3My0uNDctLjE0LS43MTEtLjE5N2E5Ljg2NyA5Ljg2NyAwIDAgMC0uODc1LS4xNjFDMTQuNTU3Ljc1MyAxMi45NCAwIDEyLjk0IDBjLTEuODA0IDEuMTQ1LTIuMTQ3IDIuNzQ0LTIuMTQ3IDIuNzQ0bC0uMDE4LjA5M2MtLjA5OC4wMjktLjIuMDU3LS4yOTguMDg4LS4xMzguMDQyLS4yNzUuMDk0LS40MTMuMTQzLS4xMzguMDU1LS4yNzUuMTA3LS40MS4xNjZhOC44NjkgOC44NjkgMCAwIDAtMS41NTcuODdsLS4wNjMtLjAyOWMtMi40OTctLjk1NS00LjcxNi4xOTUtNC43MTYuMTk1LS4yMDMgMi42NTguOTk2IDQuMzMgMS4yMzUgNC42MzZhMTEuNjA4IDExLjYwOCAwIDAgMC0uNjA3IDIuNjM1QzEuNjM2IDEyLjY3Ny45NTMgMTUuMDE0Ljk1MyAxNS4wMTRjMS45MjYgMi4yMTQgNC4xNzEgMi4zNTEgNC4xNzEgMi4zNTEuMDAzLS4wMDIuMDA2LS4wMDIuMDA2LS4wMDUuMjg1LjUwOS42MTUuOTk0Ljk4NiAxLjQ0Ni4xNTYuMTkuMzIuMzcxLjQ4OC41NDgtLjcwNCAyLjAwOS4wOTkgMy42OC4wOTkgMy42OCAyLjE0NC4wOCAzLjU1My0uOTM3IDMuODQ5LTEuMTczYTkuNzg0IDkuNzg0IDAgMCAwIDMuMTY0LjUwMWguMDhsLjA1NS0uMDAzLjEwNy0uMDAyLjEwMy0uMDA1LjAwMy4wMDJjMS4wMSAxLjQ0IDIuNzg4IDEuNjQ2IDIuNzg4IDEuNjQ2IDEuMjY0LTEuMzMyIDEuMzM3LTIuNjUzIDEuMzM3LTIuOTR2LS4wNThjMC0uMDItLjAwMy0uMDM5LS4wMDMtLjA2LjI2NS0uMTg3LjUyLS4zODcuNzU4LS42YTcuODc1IDcuODc1IDAgMCAwIDEuNDE1LTEuN2MxLjQzLjA4MyAyLjQzNy0uODg1IDIuNDM3LS44ODUtLjIzNi0xLjQ5LTEuMDg1LTIuMjE2LTEuMjY0LTIuMzU0bC0uMDE4LS4wMTMtLjAxNi0uMDEzYS4yMTcuMjE3IDAgMCAxLS4wMzEtLjAyYy4wMDgtLjA5Mi4wMTYtLjE4LjAyLS4yNy4wMTEtLjE2Mi4wMTYtLjMyMy4wMTYtLjQ4di0uMjUzbC0uMDA1LS4wOTgtLjAwOC0uMTM1YTEuODkxIDEuODkxIDAgMCAwLS4wMS0uMTNjLS4wMDMtLjA0Mi0uMDA4LS4wODMtLjAxMy0uMTI1bC0uMDE2LS4xMjQtLjAxOC0uMTIyYTYuMjE1IDYuMjE1IDAgMCAwLTIuMDMyLTMuNzMgNi4wMTUgNi4wMTUgMCAwIDAtMy4yMjItMS40NiA2LjI5MiA2LjI5MiAwIDAgMC0uODUtLjA0OGwtLjEwNy4wMDJoLS4wNjNsLS4wNDQuMDAzLS4xMDQuMDA4YTQuNzc3IDQuNzc3IDAgMCAwLTMuMzM1IDEuNjk1Yy0uMzMyLjQtLjU5Mi44NC0uNzY4IDEuMjk3YTQuNTk0IDQuNTk0IDAgMCAwLS4zMTIgMS44MTdsLjAwMy4wOTFjLjAwNS4wNTUuMDA3LjExLjAxMy4xNjRhMy42MTUgMy42MTUgMCAwIDAgLjY5OCAxLjgyIDMuNTMgMy41MyAwIDAgMCAxLjgyNyAxLjI4MmMuMzMuMDk4LjY2LjE0Ljk3MS4xMzcuMDM5IDAgLjA3OCAwIC4xMTQtLjAwMmwuMDYzLS4wMDNjLjAyIDAgLjA0MS0uMDAzLjA2Mi0uMDAzLjAzNC0uMDAyLjA2NS0uMDA3LjA5OS0uMDEuMDA3IDAgLjAxOC0uMDAzLjAyOC0uMDAzbC4wMzEtLjAwNS4wNi0uMDA4YTEuMTggMS4xOCAwIDAgMCAuMTEyLS4wMmMuMDM2LS4wMDguMDcyLS4wMTMuMTA5LS4wMjRhMi42MzQgMi42MzQgMCAwIDAgLjkxNC0uNDE1Yy4wMjgtLjAyLjA1Ni0uMDQxLjA4NS0uMDY1YS4yNDguMjQ4IDAgMCAwIC4wMzktLjM1LjI0NC4yNDQgMCAwIDAtLjMwOS0uMDZsLS4wNzguMDQyYy0uMDkuMDQ0LS4xODQuMDgzLS4yODMuMTE2YTIuNDc2IDIuNDc2IDAgMCAxLS40NzUuMDk2Yy0uMDI4LjAwMy0uMDU0LjAwNi0uMDgzLjAwNmwtLjA4My4wMDJjLS4wMjYgMC0uMDU0IDAtLjA4LS4wMDJsLS4xMDItLjAwNmgtLjAxMmwtLjAyNC4wMDZjLS4wMTYtLjAwMy0uMDMxLS4wMDMtLjA0NC0uMDA2LS4wMzEtLjAwMi0uMDYtLjAwNy0uMDkxLS4wMWEyLjU5IDIuNTkgMCAwIDEtLjcyNC0uMjEzIDIuNTU3IDIuNTU3IDAgMCAxLS42NjctLjQzOCAyLjUyIDIuNTIgMCAwIDEtLjgwNS0xLjQ3NSAyLjMwNiAyLjMwNiAwIDAgMS0uMDI5LS40NDRsLjAwNi0uMTIydi0uMDIzbC4wMDItLjAzMWMuMDAzLS4wMjEuMDAzLS4wNC4wMDUtLjA2YTMuMTYzIDMuMTYzIDAgMCAxIDEuMzUyLTIuMjkgMy4xMiAzLjEyIDAgMCAxIC45MzctLjQzIDIuOTQ2IDIuOTQ2IDAgMCAxIC43NzYtLjEwMWguMDZsLjA3LjAwMi4wNDUuMDAzaC4wMjZsLjA3LjAwNWE0LjA0MSA0LjA0MSAwIDAgMSAxLjYzNS40OSAzLjk0IDMuOTQgMCAwIDEgMS42MDIgMS42NjIgMy43NyAzLjc3IDAgMCAxIC4zOTcgMS40MTRsLjAwNS4wNzYuMDAzLjA3NWMuMDAyLjAyNi4wMDIuMDUuMDAyLjA3NSAwIC4wMjQuMDAzLjA1MiAwIC4wN3YuMDY1bC0uMDAyLjA3My0uMDA4LjE3NGE2LjE5NSA2LjE5NSAwIDAgMS0uMDguNjM5IDUuMSA1LjEgMCAwIDEtLjI2Ny45MjcgNS4zMSA1LjMxIDAgMCAxLS42MjQgMS4xMyA1LjA1MiA1LjA1MiAwIDAgMS0zLjIzNyAyLjAxNCA0LjgyIDQuODIgMCAwIDEtLjY0OS4wNjZsLS4wMzkuMDAzaC0uMjg3YTYuNjA3IDYuNjA3IDAgMCAxLTEuNzE2LS4yNjUgNi43NzYgNi43NzYgMCAwIDEtMy40LTIuMjc0IDYuNzUgNi43NSAwIDAgMS0uNzQ2LTEuMTUgNi42MTYgNi42MTYgMCAwIDEtLjcxNC0yLjU5NmwtLjAwNS0uMDgzLS4wMDItLjAydi0uMDU2bC0uMDAzLS4wNzN2LS4wOTZsLS4wMDMtLjEwNHYtLjA3bC4wMDMtLjE2M2MuMDA4LS4yMi4wMjYtLjQ1LjA1NC0uNjc4YTguNzA3IDguNzA3IDAgMCAxIC4yOC0xLjM1NWMuMTI4LS40NDQuMjg2LS44NzIuNDczLTEuMjc3YTcuMDQgNy4wNCAwIDAgMSAxLjQ1Ni0yLjEgNS45MjUgNS45MjUgMCAwIDEgLjk1My0uNzYzYy4xNjktLjExMS4zNDMtLjIxMy41MjQtLjMwNi4wODktLjA1LjE4Mi0uMDkxLjI3My0uMTM1LjA0Ny0uMDIuMDkzLS4wNDIuMTM4LS4wNjJhNy4xNzcgNy4xNzcgMCAwIDEgLjcxNC0uMjY3bC4xNDUtLjA0NWMuMDQ5LS4wMTUuMDk4LS4wMjYuMTQ4LS4wNDEuMDk4LS4wMjkuMTk3LS4wNTIuMjk2LS4wNzYuMDQ5LS4wMTMuMS0uMDIuMTUtLjAzM2wuMTUtLjAzMi4xNTEtLjAyOC4wNzYtLjAxMy4wNzUtLjAxLjE1My0uMDI0Yy4wNTctLjAxLjExNC0uMDEzLjE3MS0uMDIzbC4xNjktLjAyMWMuMDM2LS4wMDMuMDczLS4wMDguMTA2LS4wMWwuMDczLS4wMDguMDM2LS4wMDMuMDQyLS4wMDJjLjA1Ny0uMDAzLjExNC0uMDA4LjE3MS0uMDFsLjA4Ni0uMDA2aC4wMjNsLjAzNy0uMDAzLjE0NS0uMDA3YTcuOTk5IDcuOTk5IDAgMCAxIDEuNzA4LjEyNSA3LjkxNyA3LjkxNyAwIDAgMSAyLjA0OC42OCA4LjI1MyA4LjI1MyAwIDAgMSAxLjY3MiAxLjA5bC4wOS4wNzcuMDg5LjA3OGMuMDYuMDUyLjExNC4xMDcuMTcxLjE1OS4wNTcuMDUyLjExMi4xMDYuMTY2LjE2LjA1Mi4wNTUuMTA3LjEwNy4xNTkuMTY0YTguNjcxIDguNjcxIDAgMCAxIDEuNDEgMS45NzhjLjAxMi4wMjYuMDI4LjA1Mi4wNC4wNzhsLjA0LjA3OC4wNzUuMTU2Yy4wMjMuMDUxLjA1LjEuMDcuMTUzbC4wNjUuMTVhOC44NDggOC44NDggMCAwIDEgLjQ1IDEuMzQuMTkuMTkgMCAwIDAgLjIwMS4xNDIuMTg2LjE4NiAwIDAgMCAuMTcyLS4xODRjLjAxLS4yNDYuMDAyLS41MzItLjAyNC0uODU2eiIvPjwvc3ZnPg==\",\n \"linear\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBmaWxsPSIjNUU2QUQyIiBkPSJNMi44ODYgNC4xOEExMS45ODIgMTEuOTgyIDAgMCAxIDExLjk5IDBDMTguNjI0IDAgMjQgNS4zNzYgMjQgMTIuMDA5YzAgMy42NC0xLjYyIDYuOTAzLTQuMTggOS4xMDVMMi44ODcgNC4xOFpNMS44MTcgNS42MjZsMTYuNTU2IDE2LjU1NmMtLjUyNC4zMy0xLjA3NS42Mi0xLjY1Ljg2NkwuOTUxIDcuMjc3Yy4yNDctLjU3NS41MzctMS4xMjYuODY2LTEuNjVaTS4zMjIgOS4xNjNsMTQuNTE1IDE0LjUxNWMtLjcxLjE3Mi0xLjQ0My4yODItMi4xOTUuMzIyTDAgMTEuMzU4YTEyIDEyIDAgMCAxIC4zMjItMi4xOTVabS0uMTcgNC44NjIgOS44MjMgOS44MjRhMTIuMDIgMTIuMDIgMCAwIDEtOS44MjQtOS44MjRaIi8+PC9zdmc+Cg==\",\n \"microsoft-learn\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij4KICA8cmVjdCB4PSIyIiB5PSIyIiB3aWR0aD0iOSIgaGVpZ2h0PSI5IiBmaWxsPSIjRjI1MDIyIi8+CiAgPHJlY3QgeD0iMTMiIHk9IjIiIHdpZHRoPSI5IiBoZWlnaHQ9IjkiIGZpbGw9IiM3RkJBMDAiLz4KICA8cmVjdCB4PSIyIiB5PSIxMyIgd2lkdGg9IjkiIGhlaWdodD0iOSIgZmlsbD0iIzAwQTRFRiIvPgogIDxyZWN0IHg9IjEzIiB5PSIxMyIgd2lkdGg9IjkiIGhlaWdodD0iOSIgZmlsbD0iI0ZGQjkwMCIvPgo8L3N2Zz4K\",\n \"neon\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBmaWxsPSIjMzRENTlBIiBkPSJNMjQgMFYyNGwtOS4zNjUtOC4wNDVWMjRIMFYwWk0yLjk0MiAyMS4wODdoOC43NTFWOS41NjNsOS4zNjUgOC4yMDRWMi45MTlMMi45NDIgMi45MTRaIi8+PC9zdmc+Cg==\",\n \"notion\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjMDAwMDAwIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+Tm90aW9uPC90aXRsZT48cGF0aCBkPSJNNC40NTkgNC4yMDhjLjc0Ni42MDYgMS4wMjYuNTYgMi40MjguNDY2bDEzLjIxNS0uNzkzYy4yOCAwIC4wNDctLjI4LS4wNDYtLjMyNkwxNy44NiAxLjk2OGMtLjQyLS4zMjYtLjk4MS0uNy0yLjA1NS0uNjA3TDMuMDEgMi4yOTVjLS40NjYuMDQ2LS41Ni4yOC0uMzc0LjQ2NnptLjc5MyAzLjA4djEzLjkwNGMwIC43NDcuMzczIDEuMDI3IDEuMjE0Ljk4bDE0LjUyMy0uODRjLjg0MS0uMDQ2LjkzNS0uNTYuOTM1LTEuMTY3VjYuMzU0YzAtLjYwNi0uMjMzLS45MzMtLjc0OC0uODg3bC0xNS4xNzcuODg3Yy0uNTYuMDQ3LS43NDcuMzI3LS43NDcuOTMzem0xNC4zMzcuNzQ1Yy4wOTMuNDIgMCAuODQtLjQyLjg4OGwtLjcuMTR2MTAuMjY0Yy0uNjA4LjMyNy0xLjE2OC41MTQtMS42MzUuNTE0LS43NDggMC0uOTM1LS4yMzQtMS40OTUtLjkzM2wtNC41NzctNy4xODZ2Ni45NTJMMTIuMjEgMTlzMCAuODQtMS4xNjguODRsLTMuMjIyLjE4NmMtLjA5My0uMTg2IDAtLjY1My4zMjctLjc0NmwuODQtLjIzM1Y5Ljg1NEw3LjgyMiA5Ljc2Yy0uMDk0LS40Mi4xNC0xLjAyNi43OTMtMS4wNzNsMy40NTYtLjIzMyA0Ljc2NCA3LjI3OXYtNi40NGwtMS4yMTUtLjEzOWMtLjA5My0uNTE0LjI4LS44ODcuNzQ3LS45MzN6TTEuOTM2IDEuMDM1bDEzLjMxLS45OGMxLjYzNC0uMTQgMi4wNTUtLjA0NyAzLjA4Mi43bDQuMjQ5IDIuOTg2Yy43LjUxMy45MzQuNjUzLjkzNCAxLjIxM3YxNi4zNzhjMCAxLjAyNi0uMzczIDEuNjM0LTEuNjggMS43MjZsLTE1LjQ1OC45MzRjLS45OC4wNDctMS40NDgtLjA5My0xLjk2Mi0uNzQ3bC0zLjEyOS00LjA2Yy0uNTYtLjc0Ny0uNzkzLTEuMzA2LS43OTMtMS45NlYyLjY2N2MwLS44MzkuMzc0LTEuNTQgMS40NDctMS42MzJ6Ii8+PC9zdmc+\",\n \"posthog\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjMDAwMDAwIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+UG9zdEhvZzwvdGl0bGU+PHBhdGggZD0iTTkuODU0IDE0LjUgNSA5LjY0Ny44NTQgNS41QS41LjUgMCAwIDAgMCA1Ljg1NFY4LjQ0YS41LjUgMCAwIDAgLjE0Ni4zNTNMNSAxMy42NDdsLjE0Ny4xNDZMOS44NTQgMTguNWwuMTQ2LjE0N3YtLjA0OWMuMDY1LjAzLjEzNC4wNDkuMjA3LjA0OWgyLjU4NmEuNS41IDAgMCAwIC4zNTMtLjg1NEw5Ljg1NCAxNC41em0wLTUtNC00YS40ODcuNDg3IDAgMCAwLS40MDktLjE0NC41MTUuNTE1IDAgMCAwLS4zNTYuMjEuNDkzLjQ5MyAwIDAgMC0uMDg5LjI4OFY4LjQ0YS41LjUgMCAwIDAgLjE0Ny4zNTNsOSA5YS41LjUgMCAwIDAgLjg1My0uMzU0di0yLjU4NWEuNS41IDAgMCAwLS4xNDYtLjM1NGwtNS01em0xLTRhLjUuNSAwIDAgMC0uODU0LjM1NFY4LjQ0YS41LjUgMCAwIDAgLjE0Ny4zNTNsNCA0YS41LjUgMCAwIDAgLjg1My0uMzU0VjkuODU0YS41LjUgMCAwIDAtLjE0Ni0uMzU0bC00LTR6bTEyLjY0NyAxMS41MTVhMy44NjMgMy44NjMgMCAwIDEtMi4yMzItMS4xbC00LjcwOC00LjcwN2EuNS41IDAgMCAwLS44NTQuMzU0djYuNTg1YS41LjUgMCAwIDAgLjUuNUgyMy41YS41LjUgMCAwIDAgLjUtLjV2LS42YzAtLjI3Ni0uMjI1LS40OTctLjQ5OS0uNTMyem0tNS4zOTQuMDMyYS44LjggMCAxIDEgMC0xLjYuOC44IDAgMCAxIDAgMS42ek0uODU0IDE1LjVhLjUuNSAwIDAgMC0uODU0LjM1NHYyLjI5M2EuNS41IDAgMCAwIC41LjVoMi4yOTNjLjIyMiAwIC4zOS0uMTM1LjQ2Mi0uMzA5YS40OTMuNDkzIDAgMCAwLS4xMDktLjU0NUwuODU0IDE1LjUwMXpNNSAxNC42NDcuODU0IDEwLjVhLjUuNSAwIDAgMC0uODU0LjM1M3YyLjU4NmEuNS41IDAgMCAwIC4xNDYuMzUzTDQuODU0IDE4LjVsLjE0Ni4xNDdoMi43OTNhLjUuNSAwIDAgMCAuMzUzLS44NTRMNSAxNC42NDd6Ii8+PC9zdmc+\",\n \"postman\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRkY2QzM3IiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+UG9zdG1hbjwvdGl0bGU+PHBhdGggZD0iTTEzLjUyNy4wOTlDNi45NTUtLjc0NC45NDIgMy45LjA5OSAxMC40NzNjLS44NDMgNi41NzIgMy44IDEyLjU4NCAxMC4zNzMgMTMuNDI4IDYuNTczLjg0MyAxMi41ODctMy44MDEgMTMuNDI4LTEwLjM3NEMyNC43NDQgNi45NTUgMjAuMTAxLjk0MyAxMy41MjcuMDk5em0yLjQ3MSA3LjQ4NWEuODU1Ljg1NSAwIDAgMC0uNTkzLjI1bC00LjQ1MyA0LjQ1My0uMzA3LS4zMDctLjY0My0uNjQzYzQuMzg5LTQuMzc2IDUuMTgtNC40MTggNS45OTYtMy43NTN6bS00Ljg2MyA0Ljg2MWw0LjQ0LTQuNDRhLjYyLjYyIDAgMSAxIC44NDcuOTAzbC00LjY5OSA0LjEyNS0uNTg4LS41ODh6bS4zMy42OTRsLTEuMS4yMzhhLjA2LjA2IDAgMCAxLS4wNjctLjAzMi4wNi4wNiAwIDAgMSAuMDEtLjA3M2wuNjQ1LS42NDUuNTEyLjUxMnptLTIuODAzLS40NTlsMS4xNzItMS4xNzIuODc5Ljg3OC0xLjk3OS40MjZhLjA3NC4wNzQgMCAwIDEtLjA4NS0uMDM5LjA3Mi4wNzIgMCAwIDEgLjAxMy0uMDkzem0tMy42NDYgNi4wNThhLjA3Ni4wNzYgMCAwIDEtLjA2OS0uMDgzLjA3Ny4wNzcgMCAwIDEgLjAyMi0uMDQ2aC4wMDJsLjk0Ni0uOTQ2IDEuMjIyIDEuMjIyLTIuMTIzLS4xNDd6bTIuNDI1LTEuMjU2YS4yMjguMjI4IDAgMCAwLS4xMTcuMjU2bC4yMDMuODY1YS4xMjUuMTI1IDAgMCAxLS4yMTEuMTE3aC0uMDAzbC0uOTM0LS45MzQtLjI5NC0uMjk1IDMuNzYyLTMuNzU4IDEuODItLjM5My44NzQuODc0Yy0xLjI1NSAxLjEwMi0yLjk3MSAyLjIwMS01LjEgMy4yNjh6bTUuMjc5LTMuNDI4aC0uMDAybC0uODM5LS44MzkgNC42OTktNC4xMjVhLjk1Mi45NTIgMCAwIDAgLjExOS0uMTI3Yy0uMTQ4IDEuMzQ1LTIuMDI5IDMuMjQ1LTMuOTc3IDUuMDkxem0zLjY1Ny02LjQ2bC0uMDAzLS4wMDJhMS44MjIgMS44MjIgMCAwIDEgMi40NTktMi42ODRsLTEuNjEgMS42MTNhLjExOS4xMTkgMCAwIDAgMCAuMTY5bDEuMjQ3IDEuMjQ3YTEuODE3IDEuODE3IDAgMCAxLTIuMDkzLS4zNDN6bTIuNTc4IDBhMS43MTQgMS43MTQgMCAwIDEtLjI3MS4yMThoLS4wMDFsLTEuMjA3LTEuMjA3IDEuNTMzLTEuNTMzYy42NjEuNzIuNjM3IDEuODMyLS4wNTQgMi41MjJ6TTE4Ljg1NSA2LjA1YS4xNDMuMTQzIDAgMCAwLS4wNTMuMTU3LjQxNi40MTYgMCAwIDEtLjA1My40NS4xNC4xNCAwIDAgMCAuMDIzLjE5Ny4xNDEuMTQxIDAgMCAwIC4wODQuMDMuMTQuMTQgMCAwIDAgLjEwNi0uMDUuNjkxLjY5MSAwIDAgMCAuMDg3LS43NTEuMTM4LjEzOCAwIDAgMC0uMTk0LS4wMzN6Ii8+PC9zdmc+\",\n \"qcc\": \"data:image/png;base64,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\",\n \"sentry\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjMzYyRDU5IiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+U2VudHJ5PC90aXRsZT48cGF0aCBkPSJNMTMuOTEgMi41MDVjLS44NzMtMS40NDgtMi45NzItMS40NDgtMy44NDQgMEw2LjkwNCA3LjkyYTE1LjQ3OCAxNS40NzggMCAwIDEgOC41MyAxMi44MTFoLTIuMjIxQTEzLjMwMSAxMy4zMDEgMCAwIDAgNS43ODQgOS44MTRsLTIuOTI2IDUuMDZhNy42NSA3LjY1IDAgMCAxIDQuNDM1IDUuODQ4SDIuMTk0YS4zNjUuMzY1IDAgMCAxLS4yOTgtLjUzNGwxLjQxMy0yLjQwMmE1LjE2IDUuMTYgMCAwIDAtMS42MTQtLjkxM0wuMjk2IDE5LjI3NWEyLjE4MiAyLjE4MiAwIDAgMCAuODEyIDIuOTk5IDIuMjQgMi4yNCAwIDAgMCAxLjA4Ni4yODhoNi45ODNhOS4zMjIgOS4zMjIgMCAwIDAtMy44NDUtOC4zMThsMS4xMS0xLjkyMmExMS40NyAxMS40NyAwIDAgMSA0Ljk1IDEwLjI0aDUuOTE1YTE3LjI0MiAxNy4yNDIgMCAwIDAtNy44ODUtMTUuMjhsMi4yNDQtMy44NDVhLjM3LjM3IDAgMCAxIC41MDQtLjEzYy4yNTUuMTQgOS43NSAxNi43MDggOS45MjggMTYuOWEuMzY1LjM2NSAwIDAgMS0uMzI3LjU0M2gtMi4yODdjLjAyOS42MTIuMDI5IDEuMjIzIDAgMS44MzFoMi4yOTdhMi4yMDYgMi4yMDYgMCAwIDAgMS45MjItMy4zMXoiLz48L3N2Zz4=\",\n \"sourcegraph\": \"data:image/png;base64,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\",\n \"supabase\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBmaWxsPSIjM0ZDRjhFIiBkPSJNMTEuOSAxLjAzNmMtLjAxNS0uOTg2LTEuMjYtMS40MS0xLjg3NC0uNjM3TC43NjQgMTIuMDVDLS4zMyAxMy40MjcuNjUgMTUuNDU1IDIuNDA5IDE1LjQ1NWg5LjU3OWwuMTEzIDcuNTFjLjAxNC45ODUgMS4yNTkgMS40MDggMS44NzMuNjM2bDkuMjYyLTExLjY1M2MxLjA5My0xLjM3NS4xMTMtMy40MDMtMS42NDUtMy40MDNoLTkuNjQyeiIvPjwvc3ZnPgo=\",\n \"tavily\": \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NSA1NSIgd2lkdGg9IjU1IiBoZWlnaHQ9IjU1Ij4KPHBhdGggZD0iTTM4LjgwODggMEM0NC40NzYyIDAgNDcuMzEwMSA5LjE4OTVlLTA1IDQ5LjQ3NDggMS4xMDMwNkM1MS4zNzg4IDIuMDczMjYgNTIuOTI3IDMuNjIxMzUgNTMuODk3MSA1LjUyNTQ0QzU1LjAwMDEgNy42OTAxMyA1NSAxMC41MjQgNTUgMTYuMTkxNFYzOC44MDg4QzU1IDQ0LjQ3NjEgNTUuMDAwMSA0Ny4zMDk5IDUzLjg5NzEgNDkuNDc0NkM1Mi45MjcgNTEuMzc4NiA1MS4zNzg4IDUyLjkyNjcgNDkuNDc0OCA1My44OTY5QzQ3LjMxMDEgNTQuOTk5OSA0NC40NzYyIDU1IDM4LjgwODggNTVIMTYuMTkxNEMxMC41MjM5IDU1IDcuNjkwMTQgNTQuOTk5OSA1LjUyNTQ0IDUzLjg5NjlDMy42MjEzMyA1Mi45MjY3IDIuMDczMjUgNTEuMzc4NyAxLjEwMzA2IDQ5LjQ3NDZDMC4wMDAxMDk5NTggNDcuMzA5OSAwIDQ0LjQ3NjIgMCAzOC44MDg4VjE2LjE5MTJDMCAxMC41MjM4IDAuMDAwMTA3NjE0IDcuNjkwMTIgMS4xMDMwNiA1LjUyNTQ0QzIuMDczMjUgMy42MjEzMyAzLjYyMTMzIDIuMDczMjYgNS41MjU0NCAxLjEwMzA2QzcuNjkwMTQgOC44ODQzNmUtMDUgMTAuNTIzOSAwIDE2LjE5MTQgMEgzOC44MDg4WiIgZmlsbD0iIzFGMUUxRSIvPgo8cGF0aCBkPSJNMjMuMzg2MyAzMC40MDVDMjMuMDg4NSAzMC40MDUgMjIuNzkzNCAzMC40NjM4IDIyLjUxODMgMzAuNTc4MkMyMi4yNDMzIDMwLjY5MjYgMjEuOTkzMyAzMC44NjAzIDIxLjc4MjcgMzEuMDcxNkwxNy40NTM0IDM1LjQxODhMMTYuMzAyOSAzNC4yNjM4QzE1LjQ1NzMgMzMuNDE1IDE0LjAwOTkgMzMuODM0NiAxMy43NDcxIDM1LjAwNjRMMTIuMTA3MyA0Mi4zMDIzQzEyLjA0OTggNDIuNTUzMiAxMi4wNTY4IDQyLjgxNDggMTIuMTI4IDQzLjA2MjFDMTIuMTk5IDQzLjMwODUgMTIuMzMxMyA0My41MzI3IDEyLjUxMjMgNDMuNzEzNkwxMi41MTA4IDQzLjcxNTlDMTIuNjkxNSA0My44OTg3IDEyLjkxNTUgNDQuMDMyMSAxMy4xNjE5IDQ0LjEwMzdDMTMuNDA4MyA0NC4xNzUyIDEzLjY2ODggNDQuMTgyNCAxMy45MTg4IDQ0LjEyNDZMMjEuMTg2MiA0Mi40Nzc2QzIyLjM1MjcgNDIuMjEzNyAyMi43NzE1IDQwLjc2MTQgMjEuOTI1OSAzOS45MTI0TDIwLjc3NTQgMzguNzU3NEwyNS4xMDU2IDM0LjQxMUMyNS41MzA2IDMzLjk4NDIgMjUuNzY5NSAzMy40MDQ5IDI1Ljc2OTUgMzIuODAxM0MyNS43Njk1IDMyLjE5NzcgMjUuNTMwNiAzMS42MTg1IDI1LjEwNTYgMzEuMTkxNkwyNS4wNDc2IDMxLjEzMzRMMjUuMDQ5NyAzMS4xMzE5TDI0Ljk4OTYgMzEuMDcxNkMyNC43NzkxIDMwLjg2MDMgMjQuNTI5IDMwLjY5MjYgMjQuMjU0IDMwLjU3ODJDMjMuOTc5IDMwLjQ2MzggMjMuNjg0IDMwLjQwNTEgMjMuMzg2MyAzMC40MDVaIE0zOS4wMDU0IDI3LjY2NjNDMzcuOTk0MSAyNy4wMjQ1IDM2LjY3NjggMjcuNzU0NiAzNi42NzY2IDI4Ljk1NTZWMzAuNTg4NEgyNy4zOTgxQzI3LjcwODEgMzEuMTgzMiAyNy44ODQ3IDMxLjg1OTYgMjcuODg0NyAzMi41Nzc0QzI3Ljg4NDYgMzMuNjE1MiAyNy41MTgxIDM0LjU2NzIgMjYuOTA4IDM1LjMwOTlMMzYuNjc1OCAzNS4zMDk2TDM2LjY3NTIgMzYuOTQyNEMzNi42NzUzIDM4LjE0MzQgMzcuOTk0MSAzOC44NzM2IDM5LjAwNTQgMzguMjMxOUw0NS4zMDQ1IDM0LjIzODdDNDUuNzc1NyAzMy45Mzg0IDQ2LjAxMTQgMzMuNDQzIDQ2LjAxMTUgMzIuOTQ4QzQ2LjAxMDkgMzIuNDUzNiA0NS43NzUyIDMxLjk1OTIgNDUuMzAzIDMxLjY2MDFMMzkuMDA1NCAyNy42NjYzWiBNMjMuNjEwNCAxMC4yMjA2QzIzLjM1MzkgMTAuMjE5NCAyMy4xMDEgMTAuMjgzOSAyMi44NzYzIDEwLjQwODFDMjIuNjUxNCAxMC41MzI1IDIyLjQ2MTQgMTAuNzEzMiAyMi4zMjUzIDEwLjkzMThMMTguMzQ3MiAxNy4yNTQ5SDE4LjM0NThDMTcuNzA2NyAxOC4yNzAxIDE4LjQzNDYgMTkuNTkzMyAxOS42MzA3IDE5LjU5MzZIMjEuMjU3OFYyOC45ODY5QzIxLjkzMjcgMjguNTQwNiAyMi43NDAzIDI4LjI4MDEgMjMuNjA5IDI4LjI4MDFDMjQuNDc4MSAyOC4yODAxIDI1LjI4NjQgMjguNTQwNyAyNS45NjE1IDI4Ljk4NzVWMTkuNTkzNkgyNy41ODg0QzI4Ljc4NDkgMTkuNTkzNiAyOS41MTEyIDE4LjI3MDIgMjguODcyOCAxNy4yNTQxTDI0Ljg5MzkgMTAuOTMxOEMyNC41OTUxIDEwLjQ1ODQgMjQuMTAyOSAxMC4yMjEyIDIzLjYxMDQgMTAuMjIwNloiIGZpbGw9IiNGRkZDRjYiLz4KPC9zdmc+Cg==\",\n \"tencent-docs\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFnUlEQVR42u2XeWwUVRzHX5RDSBFqWo5ylBZru7NHry1GlHiBQrmKQAul21a6M7vdtggiAQmGEoE/1KhRkwJGawKCGENCkHgQoBhjuQSNRkwpxnB5QJB23nszs9fXzMz2gE53+YNE/+Aln8xm5+287/zm9/3OWwKA/JeQuwKcEu+DQ+KVgsguCiI7Lois1Qq7xFqdPtb6wALamraEtrr8fee4yumJ9Eblt+R90eqsV4IkaX+YDN8TJRmbQVJ2hWICRK0Pgsj3CiKFILJ+sXkZMqsZVm5TUdTAkTSPwuW/eU7+fBnj3lRBOoGkg5GXk3eHSPKuKMnY0kuAXeJ9EER2Nt7iOplVDOOWUly6FkUHiyKzimJgMYXTx2CXYgJKZKQ2B0E4QP4EBpyObB+5NUKy1oOk7I4JEGr5Tdhr+RhBZFoiAWnlFAV1DP/IUejjj+tRTG5gIM/KxnlHDYNrMUXSwTCIDJBLALkGDDqB/ePeARn1UUxAni/UTb4vTJw+dbotQfl1RjxHMa+Ro/dQg8CcDQrINBk5lRSuSor7jkVAKEAuAOQiQDqAe9twZsRnwVRDQIEv3I3bHyFOSfVnVlNkVJpltiKjihmLrGhSYTWkt1WQp2Vkehiy13BkbFCQub6H9M0KMtcqWwwBNol1kyMy4vSzpsI6hvEV1Cjz+KW3UEGNZ0+mdeLdfUH0Nzbu1ECekTGxhMJdSpG3qIfchTLyqpTymA2VbgSvQlJL2aHXPtWgaFGcaY/gZFsE35/r4bR+bIvg2NkIbtAo4o33vwji3pkyUstucYiXwuHnuYYAl6j1IKlDx5bTKwUBhvbLEdyJceB4CMNKZNw/v5cIiV2212qDzQpUaiaeIHF6tRxXwGywkaUUP5y/MyJOtYUxtpxi8GzTpoLEvhMCmukCx0bFZJNC7Mv5QuF5ZihNKqGYUEFx7g5V4npnFNPXcoxYIMMpKU35YjCWhNuCxLk9SFzNIeJ4SVln85gW1EUMmWN+Pn/FFKF7XudqRxSd3HohvSv03tAX1Ofqx65eufB3BI+vZkhbzFe6vLEcKPSoxO1RSWGFSuzL2B6b1NMsuojUUoqMKorHXmRG0LjrGUYvpth1JGQp4GRbGNnLKHL95nydonoG3VlzN3A8uZojW2RP5TUwU8CUWo08WquRKQGNOCR2Jsd7c+A4JIZ0D8OoMooxSyhSFlHcM0NGy49hSwE7DgVBnujsnt8b/btJVSzqqmMZufWsK4oVIgQUYvPz0YLIWKIEHLvU7GY9eq1G404Ng2fL1i8w0XhP/Ko//zxvrAdyG0Ik74UwcdZpD9u8LGEEJy+gKF7P+222ytcVDJ0bN8oPOGtU4qpRTQGuBm5g93HxdgTojVn3nnUEKxowdRXHyDJrATlevXrKpqLlQVLYELOhe41q4AzwN2zLEgsYUCzjrb3WEdx+JYJJ1QwTK1k/AhicPl5VVK8Sd12sAoJPJYKk6nuArxMtnl3DjETb32rtgC9PhYwQeyjOjdglLd8mBolNjFXAVh8kQp1G7BJrF7yJNyETPBS/XLAOp6bPgxhYLMe7RofDp6U4/CHi8Mea0F2rkFwfz8q5jeev2+iRFRwyt3bAiq0qhsyR49w9a3X6FdKFIWBqQ4i4a9UZ2TWJNyHDSijKtij9OqCkUcHw+XGuI7Edgo+TLsweMPaAfE2ixXV0f69r1iwXv3ojivyAuVWzzgAKl6SuKpQipEAKG5g5EFCSHT7+YSIL6ucHzZLR/JW1A/S9Q9oSarjA0gGmgJLJUoS4pbCB2YQinymI7Fyiu3+w2uyBb3+2juBPWkJImicjpyaOA3wsS/BR0oW5LRe52y7xZrvEf7JL/HB/pHv4YUHkR37/K/oNgJZwxCQaRQuAo69+rB0dNIse6uf3+rU/cPk46c3d/4b/CwH/Ak8c/zLL6A8WAAAAAElFTkSuQmCC\",\n \"tencent-yuanbao-search\": \"data:image/png;base64,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\",\n \"tianyancha\": \"data:image/png;base64,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\",\n \"yunxiao\": \"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRkY2QTAwIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+QWxpYmFiYSBDbG91ZDwvdGl0bGU+PHBhdGggZD0iTTMuOTk2IDQuNTE3aDUuMjkxTDguMDEgNi4zMjQgNC4xNTMgNy41MDZhMS42NjggMS42NjggMCAwIDAtMS4xNjUgMS42MDF2NS43ODZhMS42NjggMS42NjggMCAwIDAgMS4xNjUgMS42bDMuODU3IDEuMTgzIDEuMjc3IDEuODA3SDMuOTk2QTMuOTk2IDMuOTk2IDAgMCAxIDAgMTUuNDg3VjguNTEzYTMuOTk2IDMuOTk2IDAgMCAxIDMuOTk2LTMuOTk2bTE2LjAwOCAwaC01LjI5MWwxLjI3NyAxLjgwNyAzLjg1NyAxLjE4MmMuNzE1LjIyNyAxLjE3Ljg4OSAxLjE2NSAxLjYwMXY1Ljc4NmExLjY2OCAxLjY2OCAwIDAgMS0xLjE2NSAxLjZsLTMuODU3IDEuMTgzLTEuMjc3IDEuODA3aDUuMjkxQTMuOTk2IDMuOTk2IDAgMCAwIDI0IDE1LjQ4N1Y4LjUxM2EzLjk5NiAzLjk5NiAwIDAgMC0zLjk5Ni0zLjk5Nm0tNC4wMDcgOC4zNDVIOC4wMDJ2LTEuODA0aDcuOTk1WiIvPjwvc3ZnPg==\"\n}\n", "export const BUILTIN_CATEGORIES = ['\u5F00\u53D1\u5DE5\u5177', '\u9879\u76EE\u7BA1\u7406', '\u6570\u636E\u5E93', '\u77E5\u8BC6\u68C0\u7D22', '\u529E\u516C\u534F\u4F5C', '\u5B89\u5168\u8FD0\u7EF4', '\u6570\u636E\u5206\u6790', '\u5176\u4ED6'] as const\n\nexport const MAX_CATEGORY_LENGTH = 16\nexport const MAX_EXAMPLES = 6\nconst RESERVED_CATEGORIES = ['\u5168\u90E8', '\u81EA\u5B9A\u4E49']\nconst CONTROL_CHARS = /[\\u0000-\\u001F\\u007F]/\n\nexport function cleanCategory(value: string): string {\n return value.trim().replace(/\\s+/g, ' ')\n}\n\nexport function categoryKey(value: string): string {\n return cleanCategory(value).toLocaleLowerCase()\n}\n\nexport function canonicalBuiltinCategory(value: string): string | undefined {\n const key = categoryKey(value)\n return BUILTIN_CATEGORIES.find(category => categoryKey(category) === key)\n}\n\nexport function validateCategory(value: string): string | undefined {\n const cleaned = cleanCategory(value)\n if (cleaned === '') return '\u7C7B\u522B\u4E0D\u80FD\u4E3A\u7A7A'\n if (Array.from(cleaned).length > MAX_CATEGORY_LENGTH) return `\u7C7B\u522B\u6700\u591A ${MAX_CATEGORY_LENGTH} \u4E2A\u5B57`\n if (CONTROL_CHARS.test(cleaned)) return '\u7C7B\u522B\u4E0D\u80FD\u5305\u542B\u63A7\u5236\u5B57\u7B26'\n if (RESERVED_CATEGORIES.some(item => categoryKey(item) === categoryKey(cleaned))) {\n return `\u300C${cleaned}\u300D\u662F\u4FDD\u7559\u540D\u79F0\uFF0C\u8BF7\u6362\u4E00\u4E2A\u7C7B\u522B`\n }\n return undefined\n}\n\nexport function resolveCategory(value: string | undefined, fallback = '\u5176\u4ED6'): string {\n const cleaned = cleanCategory(value ?? '')\n if (cleaned === '') return fallback\n return canonicalBuiltinCategory(cleaned) ?? cleaned\n}\n\nexport function parseExampleLines(value: string): string[] {\n return value\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(line => line !== '')\n .slice(0, MAX_EXAMPLES)\n}\n\nexport function canonicalizeCardCategories<T extends { category: string }>(cards: T[]): T[] {\n const builtinKeys = new Map(BUILTIN_CATEGORIES.map(category => [categoryKey(category), category]))\n const labels = new Map<string, string>()\n for (const card of cards) {\n const cleaned = cleanCategory(card.category) || '\u5176\u4ED6'\n const key = categoryKey(cleaned)\n if (!labels.has(key)) labels.set(key, builtinKeys.get(key) ?? cleaned)\n }\n return cards.map(card => {\n const cleaned = cleanCategory(card.category) || '\u5176\u4ED6'\n return {\n ...card,\n category: labels.get(categoryKey(cleaned)) ?? cleaned,\n }\n })\n}\n", "export const CUSTOM_SECRET_PLACEHOLDER = '<\u5DF2\u4FDD\u5B58>'\n"],
|
|
5
|
+
"mappings": "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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiRpB,WAAS,KAAK,YAAY,KAAK;AACjC;",
|
|
6
|
+
"names": ["import_jsx_runtime", "timer", "pendingLabel", "request", "category", "description", "examples", "response"]
|
|
7
|
+
}
|