dsh-agent-plugins-market 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/client.js +20 -3
- package/client/client.js.map +1 -1
- package/lib/runtime/lsp-mounts.js +6 -6
- package/lib/runtime/mcp-config.js +10 -6
- package/lib/runtime/mcp-mounts.js +13 -5
- package/lib/runtime/mcp-status.js +3 -4
- package/lib/types/contracts/mcp-status.d.ts +1 -1
- package/lib/types/runtime/mcp-config.d.ts +11 -5
- package/lib/types/runtime/mcp-status.d.ts +1 -1
- package/package.json +2 -2
package/client/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["searchableCache","searchableFor","h","css","useState","h","css","Modal","Button","Input","h","Modal","css","Button","h","css","css","h","Button","Tooltip","h","Component","h","useState","h","css","Button","useMemo","useState","useRef","h","Modal","css","Button","MarkdownText","h","css","Input","useState","useCallback","useMemo","h","css","Button","Toast","Modal","EMPTY_STATUS","useState","h","css","Button","formatObservedAt","Modal","useState","h","css","Button","Modal","primitives","useState","useCallback","h","css","h","css","createRoot","primitives","h"],"sources":["../src/contracts/market.ts","../src/client/api.ts","../src/client/locales.ts","../src/client/features/market/market-resource.ts","../src/client/features/market/market-view-model.ts","../src/client/market.module.css","../src/client/features/market/SourceTab.tsx","../src/client/features/market/SourceEditorModal.tsx","../src/client/features/market/InstallConfirmModal.tsx","../src/client/ui/ToggleSwitch.tsx","../src/client/features/market/SuiteCard.tsx","../src/client/ui/StatusIcon.tsx","../src/client/ErrorBoundary.tsx","../src/client/credentials.ts","../src/client/mcp-credential.module.css","../src/client/McpCredentialEditor.tsx","../src/client/features/suite-detail/suite-detail-resource.ts","../src/client/SuiteDetail.tsx","../src/client/SearchFilterToolbar.module.css","../src/client/SearchFilterToolbar.tsx","../src/client/MarketSection.tsx","../src/client/features/mcp-status/mcp-status-view-model.ts","../src/client/mcp-status.module.css","../src/client/McpStatusPanel.tsx","../src/client/LspStatusPanel.tsx","../src/client/McpPluginCard.tsx","../src/client/page-mode-selection.ts","../src/client/page-mode.tsx","../src/client/index.ts"],"sourcesContent":["/** Browser-safe market wire records and route constants shared by host and client. */\n\n/** Prefix for all Agent Plugins Market HTTP routes. */\nexport const MARKET_API_PREFIX = '/api/agent-plugins/' as const\n\n/** Fixed Agent Plugins Market HTTP routes. */\nexport const MARKET_ROUTES = {\n overview: `${MARKET_API_PREFIX}overview`,\n mcpStatus: `${MARKET_API_PREFIX}mcp-status`,\n lspStatus: `${MARKET_API_PREFIX}lsp-status`,\n lspServers: `${MARKET_API_PREFIX}lsp-servers`,\n progress: `${MARKET_API_PREFIX}progress`,\n config: `${MARKET_API_PREFIX}config`,\n suite: `${MARKET_API_PREFIX}suite`,\n skill: `${MARKET_API_PREFIX}skill`,\n addSource: `${MARKET_API_PREFIX}sources/add`,\n updateSource: `${MARKET_API_PREFIX}sources/update`,\n adoptSource: `${MARKET_API_PREFIX}sources/adopt`,\n removeSource: `${MARKET_API_PREFIX}sources/remove`,\n refreshSource: `${MARKET_API_PREFIX}sources/refresh`,\n install: `${MARKET_API_PREFIX}install`,\n uninstall: `${MARKET_API_PREFIX}uninstall`,\n setEnabled: `${MARKET_API_PREFIX}set-enabled`,\n setSurface: `${MARKET_API_PREFIX}set-surface`,\n mcpOverrides: `${MARKET_API_PREFIX}mcp-overrides`,\n setMcpOverride: `${MARKET_API_PREFIX}set-mcp-override`,\n mcpRetry: `${MARKET_API_PREFIX}mcp-retry`,\n mcpReauthorize: `${MARKET_API_PREFIX}mcp-reauthorize`,\n mcpBackend: `${MARKET_API_PREFIX}mcp-backend`,\n setMcpBackend: `${MARKET_API_PREFIX}set-mcp-backend`\n} as const\n\n/** The MCP mount backend state reported to the settings page. */\nexport interface McpBackendPayload {\n backend: 'builtin' | 'host'\n /** Whether the host `dsh-mcp-client` resolves from the plugin context. */\n hostClient: { available: boolean; version?: string }\n /** Download region: the persisted setting and its locale-resolved route. */\n downloadRegion: { setting: 'auto' | 'global' | 'china'; effective: 'global' | 'china' }\n}\n\n/** One unmanaged `.sources/` checkout the user can adopt as a source. */\nexport interface UnmanagedSource {\n id: string\n /** The checkout's `origin` remote URL; absent for non-git directories. */\n url?: string\n}\n\n/** A configured source row returned to the market client. */\nexport interface SourceOverview {\n id: string\n url: string\n branch?: string\n local?: boolean\n /** Acquisition kind (`git` / `local` / `archive`); `local` mirrors the legacy flag. */\n kind: string\n /** The checkout pre-existed (manually cloned or adopted); never deleted on removal. */\n adopted?: boolean\n cloned: boolean\n lockCommit?: string\n error?: string\n /** Scanner diagnostics for this source (dropped entries, fallbacks taken);\n * absent when the scan completed with no notes. */\n scanNotes?: string[]\n suiteIds: string[]\n}\n\n/** Counts of runtime surfaces displayed on a suite card. */\nexport interface SuiteSurfaceCounts {\n skills: number\n mcp: number\n hooks: number\n commands: number\n agents: number\n lsp: number\n}\n\n/** Effective per-surface enablement of an installed suite. */\nexport interface SuiteSurfaceToggles {\n skills: boolean\n mcp: boolean\n hooks: boolean\n commands: boolean\n agents: boolean\n lsp: boolean\n}\n\n/** One server's persisted MCP override (wire shape mirrors runtime types). */\nexport type McpServerOverrideWire = {\n enabled?: boolean\n url?: string\n headers?: Record<string, string>\n env?: Record<string, string>\n args?: string[]\n}\n\n/** Overrides for one suite keyed by mcp.json server key. */\nexport type McpSuiteOverridesWire = Record<string, McpServerOverrideWire>\n\n/** A normalized suite card returned by the overview route. */\nexport interface SuiteOverviewCard {\n sourceId: string\n suiteId: string\n name: string\n version?: string\n description?: string\n keywords: string[]\n surfaces: SuiteSurfaceCounts\n enabled: boolean\n installed: boolean\n /** Per-surface toggles; present on installed suites only. */\n surfaceToggles?: SuiteSurfaceToggles\n dimension: string\n layout: string\n remoteUrl?: string\n errors: string[]\n mcpErrors?: string[]\n}\n\n/** The market overview response. */\nexport interface OverviewPayload {\n sources: SourceOverview[]\n suites: SuiteOverviewCard[]\n totals: { all: number; installed: number; enabled: number }\n roots: { user: string; data: string }\n /** Unmanaged `.sources/` checkouts (manual clones) available for adoption. */\n unmanaged?: UnmanagedSource[]\n}\n\n/** Host-side progress of the source mutation currently in flight. */\nexport interface SourceProgress {\n active: boolean\n sourceId: string\n step: string\n}\n\n/** One skill's metadata inside a suite detail response. */\nexport interface SuiteSkillMeta {\n name: string\n description: string\n whenToUse?: string\n path: string\n}\n\n/** One command or agent preview in a suite detail response. */\nexport interface MarkdownPreview {\n name: string\n description?: string\n content: string\n}\n\n/** Claude Code command preview alias retained for feature-specific readability. */\nexport type CommandPreview = MarkdownPreview\n/** Claude Code agent preview alias retained for feature-specific readability. */\nexport type AgentPreview = MarkdownPreview\n\n/** One LSP definition preview in a suite detail response. */\nexport interface LspPreview {\n name: string\n content: string\n}\n\n/** One inline-declared LSP server in a suite detail response. */\nexport interface LspServerPreview {\n /** Server key from the declaring `lspServers` table. */\n key: string\n command: string\n args: string[]\n /** Lowercase leading-dot extension → LSP language id. */\n extensions: Record<string, string>\n env?: Record<string, string>\n}\n\n/** The suite's LSP surface: inline-declared servers plus directory definition files. */\nexport interface LspSurfaceDetail {\n servers: LspServerPreview[]\n raw: LspPreview[]\n}\n\n/** One flattened hook entry in a suite detail response. */\nexport interface HookPreview {\n event: string\n matcher?: string\n command: string\n}\n\n/** One validated MCP server detail in a suite detail response. */\nexport interface McpServerDetail {\n key: string\n type: string\n command?: string\n url?: string\n args?: string[]\n env?: Record<string, string>\n cwd?: string\n headers?: Record<string, string>\n /** External credential references used by env/header/argument placeholders. */\n credentialRefs: string[]\n}\n\n/** Full suite detail response served by the detail modal. */\nexport interface SuiteDetail {\n sourceId: string\n suiteId: string\n name: string\n version: string | null\n description: string | null\n author: string | null\n keywords: string[]\n layout: string\n dimension: string\n root: string\n remoteUrl: string | null\n installed: boolean\n enabled: boolean\n surfaceToggles: SuiteSurfaceToggles | null\n /** Persisted per-server MCP overrides (suite's mcp.json stays source-owned). */\n mcpOverrides?: McpSuiteOverridesWire\n skills: SuiteSkillMeta[]\n mcpServers: McpServerDetail[]\n hooks: { count: number; entries: HookPreview[] }\n commands: MarkdownPreview[]\n agents: MarkdownPreview[]\n lsp: LspSurfaceDetail\n errors: string[]\n mcpErrors: string[]\n}\n\n/** One skill's full file text served by the skill route. */\nexport interface SkillContent {\n name: string\n description: string\n content: string\n path: string\n}\n\n/** Build a suite-detail URL without duplicating route or query encoding logic. */\nexport function suiteRoute(sourceId: string, suiteId: string): string {\n return `${MARKET_ROUTES.suite}?sourceId=${encodeURIComponent(sourceId)}&suiteId=${encodeURIComponent(suiteId)}`\n}\n\n/** Build a skill-content URL without duplicating route or query encoding logic. */\nexport function skillRoute(sourceId: string, suiteId: string, skill: string): string {\n return `${MARKET_ROUTES.skill}?sourceId=${encodeURIComponent(sourceId)}&suiteId=${encodeURIComponent(suiteId)}&skill=${encodeURIComponent(skill)}`\n}\n","/** Typed fetch helpers over the host's `/api/agent-plugins/*` routes. */\nimport { MARKET_API_PREFIX, MARKET_ROUTES, skillRoute, suiteRoute } from '../contracts/market.js'\nimport type { OverviewPayload, SkillContent, SourceProgress, SuiteDetail, SuiteOverviewCard } from '../contracts/market.js'\nimport type { McpStatusPayload } from '../contracts/mcp-status.js'\nimport type { LspStatusPayload } from '../contracts/lsp-status.js'\nimport type { LspServerSpec } from '../model/types.js'\n\nexport type {\n AgentPreview,\n HookPreview,\n LspPreview,\n MarkdownPreview,\n McpServerDetail,\n OverviewPayload,\n SkillContent,\n SourceOverview,\n SourceProgress,\n SuiteDetail,\n SuiteOverviewCard,\n SuiteSkillMeta,\n SuiteSurfaceCounts\n} from '../contracts/market.js'\nexport type { McpStatusEntry, McpStatusPayload, McpStatusTool } from '../contracts/mcp-status.js'\nexport type { LspStatusEntry, LspStatusPayload, LspStatusState } from '../contracts/lsp-status.js'\nexport type { LspServerSpec } from '../model/types.js'\n\n/** Client-facing alias retained during migration from the original transport types. */\nexport type OverviewData = OverviewPayload\n/** Client-facing alias retained during migration from the original transport types. */\nexport type SuiteCardData = SuiteOverviewCard\n\nexport async function fetchOverview(): Promise<OverviewData> {\n const response = await fetch(MARKET_ROUTES.overview, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`overview failed: ${response.status}`)\n return response.json() as Promise<OverviewData>\n}\n\nexport async function fetchSourceProgress(): Promise<SourceProgress> {\n const response = await fetch(MARKET_ROUTES.progress, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`progress failed: ${response.status}`)\n return response.json() as Promise<SourceProgress>\n}\n\nexport async function fetchSuiteDetail(sourceId: string, suiteId: string): Promise<SuiteDetail> {\n const response = await fetch(suiteRoute(sourceId, suiteId), { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`suite detail failed: ${response.status}`)\n return response.json() as Promise<SuiteDetail>\n}\n\nexport async function fetchMcpStatus(): Promise<McpStatusPayload> {\n const response = await fetch(MARKET_ROUTES.mcpStatus, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`MCP status failed: ${response.status}`)\n return response.json() as Promise<McpStatusPayload>\n}\n\nexport async function fetchLspStatus(): Promise<LspStatusPayload> {\n const response = await fetch(MARKET_ROUTES.lspStatus, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`LSP status failed: ${response.status}`)\n return response.json() as Promise<LspStatusPayload>\n}\n\n/** The user's direct LSP server table (normalized specs). */\nexport async function fetchLspServers(): Promise<Record<string, LspServerSpec>> {\n const response = await fetch(MARKET_ROUTES.lspServers, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`LSP servers failed: ${response.status}`)\n const body = (await response.json()) as { lspServers?: Record<string, LspServerSpec> }\n return body.lspServers ?? {}\n}\n\n/** Validate and persist the user's direct LSP server table. */\nexport async function saveLspServers(lspServers: unknown): Promise<Record<string, LspServerSpec>> {\n const response = await fetch(MARKET_ROUTES.lspServers, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ lspServers })\n })\n const body = (await response.json()) as { ok?: boolean; error?: string; lspServers?: Record<string, LspServerSpec> }\n if (!response.ok || body.ok === false) throw new Error(body.error ?? `LSP servers save failed: ${response.status}`)\n return body.lspServers ?? {}\n}\n\nexport async function fetchSkillContent(sourceId: string, suiteId: string, skill: string): Promise<SkillContent> {\n const response = await fetch(skillRoute(sourceId, suiteId, skill), { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`skill content failed: ${response.status}`)\n return response.json() as Promise<SkillContent>\n}\n\n/** Re-run the host MCP reconcile: retries failed mounts, clears residual tools. */\nexport async function retryMcpMounts(): Promise<void> {\n await postAction('mcp-retry', {})\n}\n\n/** Drop one server's OAuth grant so its next mount re-runs browser authorization. */\nexport async function reauthorizeMcpServer(serverName: string): Promise<void> {\n await postAction('mcp-reauthorize', { serverName })\n}\n\n/** The MCP backend card state: active client, host availability, download region. */\nexport interface McpBackendInfo {\n backend: 'builtin' | 'host'\n hostClient: { available: boolean; version?: string }\n downloadRegion: { setting: 'auto' | 'global' | 'china'; effective: 'global' | 'china' }\n}\n\nexport async function fetchMcpBackend(): Promise<McpBackendInfo> {\n const response = await fetch(MARKET_ROUTES.mcpBackend, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`mcp backend failed: ${response.status}`)\n return response.json() as Promise<McpBackendInfo>\n}\n\nexport async function postAction(path: string, body: Record<string, unknown>): Promise<Record<string, unknown>> {\n const response = await fetch(`${MARKET_API_PREFIX}${path}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body)\n })\n const payload = (await response.json()) as { ok: boolean; error?: string }\n if (!response.ok || payload.ok !== true) {\n throw new Error(payload.error ?? `request failed: ${response.status}`)\n }\n return payload\n}\n","/** zh/en dictionaries for the Agent Plugins Market section. */\n\nexport type Dictionary = Record<string, string>\n\n/** Chinese is the source-of-truth key set; English is checked against it below. */\nexport const zh = {\n nav: 'Agent Plugins 市场',\n subtitle: '发现与安装 Agent Plugins(agent-plugins.org 便携包)',\n searchPh: '搜索 Agent Plugins…',\n tabAll: '全部',\n tabInstalled: '已安装',\n tabUninstalled: '未安装',\n market: '仓库源',\n addSource: '添加源',\n sourceIdPh: '源 id(小写字母数字)',\n sourceUrlPh: 'git 仓库地址',\n sourceUrlLocalPh: '本地仓库路径(绝对路径或 ~/…)',\n sourceUrlArchivePh: '压缩包地址(.zip / .tar.gz)',\n sourceModeGit: '远程 git',\n sourceModeArchive: '压缩包',\n sourceModeLocal: '本地目录',\n branchPh: '分支(可选)',\n sourceLocal: '本地',\n sourceArchive: '压缩包',\n sourceAdopted: '已收编',\n sha256Ph: 'SHA-256(可选,64 位十六进制)',\n unmanagedTitle: '检测到未登记的本地仓库:',\n unmanagedAdopt: '收编为源(只登记,不克隆不删除)',\n unmanagedNoRemote: '非 git 目录:将以本地目录形式登记',\n editSource: '编辑当前源',\n editSourceTitle: '编辑仓库源',\n addSourceTitle: '新增仓库源',\n save: '保存',\n confirmDelete: '确认删除',\n refreshAll: '刷新全部',\n detailTitle: 'Agent Plugins 详情',\n overviewSection: '概览',\n skillsSection: '技能',\n mcpSection: 'MCP 服务',\n commandsSection: '命令',\n agentsSection: '子代理',\n hooksLabel: 'Hooks',\n sourceLabel: '来源',\n dimensionLabel: '维度',\n layoutLabel: '布局',\n statusLabel: '状态',\n authorLabel: '作者',\n keywordsLabel: '关键词',\n disabledLabel: '已停用',\n notInstalledLabel: '未安装',\n surfaceTogglesSection: '运行时注入开关',\n surfaceTogglesHint: '按能力面控制注入:关闭后立即卸载对应注入(技能 / MCP / Hooks / 命令 / 子代理 / LSP)',\n mcpOverrideEdit: '编辑覆盖',\n mcpOverrideSave: '保存覆盖',\n mcpOverrideReset: '重置为源配置',\n mcpOverrideEnabled: '挂载此服务',\n mcpOverrideUrlLabel: 'URL 覆盖',\n mcpOverrideHeadersLabel: 'Headers 覆盖(每行 KEY=VALUE)',\n mcpOverrideEnvLabel: 'Env 覆盖(每行 KEY=VALUE)',\n mcpOverrideArgsLabel: 'Args 覆盖(每行一个参数)',\n mcpOverrideKvHint: '值可写 ${ENV_NAME} 引用进程环境变量,密钥不必明文保存。',\n mcpOverriddenBadge: '已覆盖',\n mcpOverrideDisabledBadge: '已停用',\n noSkills: '(无技能)',\n noMcp: '(无 MCP 服务)',\n loading: '加载中…',\n lspSection: 'LSP 服务',\n editorHint: '仓库源提供 Agent Plugins。本地目录直接读取(实时反映工作树);git 源克隆到 ~/.dsh/agent-plugins/.sources/<id>。',\n idHint: '小写字母/数字/连字符,全局唯一',\n urlGitHint: 'git 仓库地址,例如 https://github.com/org/repo.git',\n urlArchiveHint: 'HTTPS 压缩包地址,例如 https://example.com/plugin.zip;下载后解压为源目录',\n urlLocalHint: '绝对路径或 ~/…,直接读取本地目录(不克隆、移除源时不会删除)',\n branchHint: '可选;不填则跟踪默认分支',\n sha256Hint: '可选;填写后校验下载内容的 SHA-256,不匹配即拒绝安装',\n idFixed: 'id 不可修改(源标识全局唯一)',\n progressStarting: '正在提交…',\n progressCloning: '正在克隆仓库(git clone),可能需要几十秒…',\n progressDownloading: '正在下载并解压压缩包,可能需要几十秒…',\n progressReading: '正在读取插件清单…',\n idAutoLabel: '源 ID(自动生成)',\n idAutoHint: '自动从插件清单名或仓库名解析,无需填写',\n detailHint: '点击技能或 MCP 服务行可展开查看详情',\n add: '添加',\n remove: '移除',\n refresh: '刷新',\n install: '安装',\n installing: '安装中…',\n installedBadge: '已安装',\n uninstall: '卸载',\n uninstallConfirmTitle: '卸载 Agent Plugins',\n uninstallConfirmDesc: '将从已安装列表移除该 Agent Plugins,其技能与 MCP 工具随即停止注入。仓库源克隆保留。',\n installConfirmTitle: '确认安装',\n installConfirmDesc: '安装后以下能力将注入当前会话。请确认来源可信,详情可查看插件卡片。',\n installConfirmAction: '确认安装',\n installConfirmNoSurfaces: '该套件未声明任何运行时能力。',\n installConfirmExecutable: '风险提示:安装后将启动该套件的 MCP 子进程并挂载 hooks(第三方代码)。请确认来源可信后再安装。',\n installConfirmSource: '来源',\n installConfirmLocalTree: '本地目录(工作树,未锁定提交)',\n removeSourceConfirmTitle: '移除仓库源「{sourceId}」',\n removeSourceConfirmDesc: '将删除该源的本地克隆与全部安装记录。',\n enable: '启用',\n disable: '禁用',\n cancel: '取消',\n confirm: '确认',\n empty: '没有匹配的 Agent Plugins',\n installedEmpty: '还没有安装 Agent Plugins',\n loadFail: 'Agent Plugins 目录加载失败,请稍后重试',\n actionFail: '操作失败',\n version: '版本',\n dimensionUser: '用户级',\n dimensionProject: '项目级',\n layoutV1: '便携 v1',\n layoutCC: 'Claude Code',\n layoutCodex: 'Codex',\n layoutSkills: '技能集合',\n layoutUniversal: '通用',\n layoutCursor: 'Cursor',\n layoutKimi: 'Kimi',\n layoutRemote: '远程引用',\n layoutProjectNative: '项目原生',\n remoteRef: '远程',\n surfaceSkills: '技能',\n surfaceMcp: 'MCP',\n surfaceHooks: 'Hooks',\n surfaceCommands: '命令',\n surfaceAgents: '子代理',\n surfaceLsp: 'LSP',\n sourceNotCloned: '未克隆',\n sourceCloned: '已克隆',\n errors: '校验问题',\n scanNotes: '扫描提示',\n sourceErrorSeparator: ';',\n viewMode: '视图模式',\n grid: '网格',\n list: '列表',\n openSettings: '在设置中打开',\n rootLabel: 'Agent Plugins 目录',\n dataLabel: 'Agent Plugins 数据目录',\n countAll: '共 {n} 个 Agent Plugins',\n countInstalled: '已装 {n}',\n countEnabled: '启用 {n}',\n mcpStatusNav: 'MCP 服务',\n lspStatusNav: 'LSP 服务',\n lspSearch: '搜索 LSP 服务',\n lspAllMounted: '全部已挂载',\n lspDirect: '直接安装',\n mcpStatusTitle: 'MCP 服务',\n mcpStatusSubtitle: '连接状态、来源和工具清单',\n mcpSearch: '搜索 MCP 名称、来源或地址…',\n mcpAll: '全部',\n mcpPlugin: 'Plugin',\n mcpDirect: '直接安装',\n mcpService: '服务',\n mcpSource: '来源',\n mcpTransport: '传输',\n mcpTools: '工具',\n mcpTool: '工具',\n mcpAllConnected: '全部已连接',\n mcpReasonLabel: '原因',\n mcpRetryNote: '已自动重试多次仍失败。点击「重试」立即重连,或在插件市场中检查该服务的配置。',\n mcpRetrying: '正在重连…',\n mcpRetrySuccess: '重连成功,服务已恢复',\n mcpRetryFailure: '重连失败,请检查原因说明',\n mcpReauthorize: '重新授权',\n mcpConnect: '连接',\n mcpReauthorizing: '等待浏览器授权…',\n marketCardDesc: 'Agent Plugins 市场套件的安装、启用与运行时行为配置。',\n mcpCardTitle: 'MCP 增强模式',\n mcpCardDescOn: '已开启:支持 OAuth 授权、SSE、授权保持等功能。',\n mcpCardDescOff: '已关闭:使用宿主 dsh-mcp-client。',\n mcpCardReadonly: '当前环境设置文档只读,无法切换。',\n mcpForeign: '已由其他客户端挂载',\n mcpForeignHint: '该服务器已通过其他途径(原生配置或另一插件)挂载了同名 MCP,市场已跳过以避免重复挂载。如需由市场接管,请先停用另一来源的该服务器;若确认是残留挂载,重启宿主即可清除。',\n regionLabel: '下载区域',\n regionHint: '中国大陆走镜像线路,仅影响下载线路。',\n regionGlobal: '全球',\n regionChina: '中国大陆',\n mcpBackendHostMissing: '宿主 dsh-mcp-client 在当前环境不可用,无法切换到兼容模式。',\n mcpReauthHint: '删除已保存的授权令牌并重新走浏览器授权——用于权限范围选少了的场景。点击后请在弹出的页面完成登录。',\n mcpConnectHint: '删除旧的授权记录并重新发起浏览器登录。点击后请在弹出的页面完成授权,服务会自动连接。',\n mcpReauthSuccess: '已清除旧授权,请在弹出的浏览器页面重新登录',\n mcpReauthFailure: '重新授权失败,请稍后重试',\n mcpZeroTools: '该服务已连接,但未声明任何工具。',\n mcpConnected: '已连接',\n mcpDegraded: '降级',\n mcpFailed: '失败',\n mcpNeedsCredentials: '需要凭据',\n mcpOrphaned: '插件已卸载,工具残留',\n mcpConfigureCredentials: '配置凭据',\n mcpViewDetails: '查看详情',\n mcpCredentialTitle: '凭据配置',\n mcpCredentialConfigured: '已配置',\n mcpCredentialMissing: '未配置',\n mcpCredentialReadOnly: '由启动环境提供(只读;修改后需重启 DSH)',\n mcpCredentialUnavailable: '当前 profile 未提供凭据服务,请在启动 DSH 前设置环境变量。',\n mcpCredentialPlaceholder: '输入凭据(不会回显)',\n mcpCredentialSave: '保存凭据',\n mcpCredentialUnset: '删除凭据',\n mcpDisabled: '未启用',\n mcpObservedEndpoint: '当前工具表观测',\n mcpServiceDetail: '服务详情',\n mcpConfig: '连接配置',\n mcpSelectHint: '选择一个 MCP 服务查看配置与工具',\n mcpEmpty: '没有匹配的 MCP 服务',\n mcpNoTools: '当前没有已注册工具',\n mcpDirectConfigUnavailable: '宿主未提供直接安装 MCP 的配置记录',\n mcpDirectBoundary: '直接安装 MCP 仅显示当前工具表中可观测的服务;宿主未提供配置与连接状态 API。',\n mcpBackToMarket: '返回市场',\n mcpRetry: '重试',\n mcpFilterAllHint: '全部:插件套件声明的 MCP 服务与宿主直接安装的 MCP',\n mcpFilterPluginHint: 'Plugin:来自插件市场套件的 mcp.json 声明',\n mcpFilterDirectHint: '直接安装:宿主工具表中观测到、非套件来源的 MCP',\n lspStatusTitle: 'LSP 服务',\n lspStatusSubtitle: '语言服务器声明与挂载状态',\n lspAll: '全部',\n lspMounted: '已挂载',\n lspStarting: '启动中…',\n lspBlocked: '被阻塞',\n lspFailed: '失败',\n lspDisabled: '未启用',\n lspHostMissingShort: '宿主缺失',\n lspConflict: '扩展冲突',\n lspHostMissing: '当前 DSH 运行时未携带 LSP 组件(@deepseek-ai/dsh-lsp、dsh-lsp-stdio、dsh-tool-lsp),声明不会被挂载;升级宿主并在 profile 中挂载这三层后重新启用套件即可。',\n lspEmpty: '没有已声明的 LSP 服务器',\n lspReasonLabel: '原因',\n lspFilterAllHint: '全部:套件声明与用户自配的全部语言服务器',\n lspFilterPluginHint: 'Plugin:来自插件市场套件的内联 lspServers 声明',\n lspFilterDirectHint: '直接安装:用户自行配置的语言服务器(本面板配置)',\n lspFilterBlockedHint: '被阻塞:缺宿主组件、挂载失败或扩展冲突,点击卡片查看原因',\n lspFilterDisabledHint: '未启用:套件的 LSP 能力面开关已关闭',\n lspPlugin: 'Plugin',\n lspConfigure: '配置 LSP',\n lspConfigureHint: '编辑用户自配的语言服务器表(Claude Code lspServers 格式),保存后自动挂载',\n lspSave: '保存',\n lspDetailSubtitle: '语言服务器详情',\n lspDetailCommand: '启动命令',\n lspDetailExtensions: '扩展映射',\n mdCodeCopy: '复制',\n mdCodeCopied: '已复制',\n mdFootnotes: '脚注',\n}\n\nexport type LocaleKey = keyof typeof zh\n\nexport const en: Record<LocaleKey, string> = {\n nav: 'Agent Plugins Market',\n subtitle: 'Discover and install Agent Plugins suites (agent-plugins.org portable packages)',\n searchPh: 'Search suites…',\n tabAll: 'All',\n tabInstalled: 'Installed',\n tabUninstalled: 'Uninstalled',\n market: 'Sources',\n addSource: 'Add source',\n sourceIdPh: 'source id (lowercase alnum)',\n sourceUrlPh: 'git repository URL',\n sourceUrlLocalPh: 'local repository path (absolute or ~/…)',\n sourceUrlArchivePh: 'archive URL (.zip / .tar.gz)',\n sourceModeGit: 'remote git',\n sourceModeArchive: 'archive',\n sourceModeLocal: 'local dir',\n branchPh: 'branch (optional)',\n sourceLocal: 'local',\n sourceArchive: 'archive',\n sourceAdopted: 'adopted',\n sha256Ph: 'SHA-256 (optional, 64 hex chars)',\n unmanagedTitle: 'Unregistered local checkouts found:',\n unmanagedAdopt: 'Adopt as a source (register only — no clone, no deletion)',\n unmanagedNoRemote: 'Not a git checkout: registered as a local directory source',\n editSource: 'Edit source',\n editSourceTitle: 'Edit source',\n addSourceTitle: 'Add source',\n save: 'Save',\n confirmDelete: 'Delete',\n refreshAll: 'Refresh all',\n detailTitle: 'Suite details',\n overviewSection: 'Overview',\n skillsSection: 'Skills',\n mcpSection: 'MCP servers',\n commandsSection: 'Commands',\n agentsSection: 'Subagents',\n hooksLabel: 'Hooks',\n sourceLabel: 'Source',\n dimensionLabel: 'Dimension',\n layoutLabel: 'Layout',\n statusLabel: 'Status',\n authorLabel: 'Author',\n keywordsLabel: 'Keywords',\n disabledLabel: 'disabled',\n notInstalledLabel: 'not installed',\n surfaceTogglesSection: 'Runtime injection toggles',\n surfaceTogglesHint: 'Control injection per surface: turning one off unmounts that surface immediately (skills / MCP / hooks / commands / subagents / LSP)',\n mcpOverrideEdit: 'Edit override',\n mcpOverrideSave: 'Save override',\n mcpOverrideReset: 'Reset to source config',\n mcpOverrideEnabled: 'Mount this server',\n mcpOverrideUrlLabel: 'URL override',\n mcpOverrideHeadersLabel: 'Headers override (one KEY=VALUE per line)',\n mcpOverrideEnvLabel: 'Env override (one KEY=VALUE per line)',\n mcpOverrideArgsLabel: 'Args override (one argument per line)',\n mcpOverrideKvHint: 'Values may reference process env vars as ${ENV_NAME} so secrets never persist here.',\n mcpOverriddenBadge: 'overridden',\n mcpOverrideDisabledBadge: 'disabled',\n noSkills: '(no skills)',\n noMcp: '(no MCP servers)',\n loading: 'Loading…',\n lspSection: 'LSP servers',\n editorHint: 'A source provides suites (Agent Plugins). Local directories are read in place (live working tree); git sources clone into ~/.dsh/agent-plugins/.sources/<id>.',\n idHint: 'lowercase letters / digits / hyphens, globally unique',\n urlGitHint: 'git repository URL, e.g. https://github.com/org/repo.git',\n urlArchiveHint: 'HTTPS archive URL, e.g. https://example.com/plugin.zip — downloaded and extracted as the source directory',\n urlLocalHint: 'absolute path or ~/…, read in place (never cloned, never deleted on removal)',\n branchHint: 'optional; defaults to the repository default branch',\n sha256Hint: 'optional; when set, the download SHA-256 is verified and mismatches reject the install',\n idFixed: 'id is fixed (the source identifier is globally unique)',\n progressStarting: 'Submitting…',\n progressCloning: 'Cloning the repository (git clone) — this can take tens of seconds…',\n progressDownloading: 'Downloading and extracting the archive — this can take tens of seconds…',\n progressReading: 'Reading plugin manifests…',\n idAutoLabel: 'Source ID (auto)',\n idAutoHint: 'Derived from the suite or repo name — no need to type it',\n detailHint: 'Click a skill or MCP server row to expand its details',\n add: 'Add',\n remove: 'Remove',\n refresh: 'Refresh',\n install: 'Install',\n installing: 'Installing…',\n installedBadge: 'Installed',\n uninstall: 'Uninstall',\n uninstallConfirmTitle: 'Uninstall suite',\n uninstallConfirmDesc: 'Removes the suite from the installed list; its skills and MCP tools stop injecting. The source clone stays.',\n installConfirmTitle: 'Confirm install',\n installConfirmDesc: 'After install, the surfaces below inject into your sessions. Confirm you trust the source; see the suite card for details.',\n installConfirmAction: 'Install',\n installConfirmNoSurfaces: 'This suite declares no runtime surfaces.',\n installConfirmExecutable: 'Risk notice: installing starts this suite\\'s MCP child processes and mounts hooks (third-party code). Install only if you trust the source.',\n installConfirmSource: 'Source',\n installConfirmLocalTree: 'Local directory (working tree, no locked commit)',\n removeSourceConfirmTitle: 'Remove source “{sourceId}”',\n removeSourceConfirmDesc: 'Deletes the local clone and all install records of this source.',\n enable: 'Enable',\n disable: 'Disable',\n cancel: 'Cancel',\n confirm: 'Confirm',\n empty: 'No matching suites',\n installedEmpty: 'No suites installed yet',\n loadFail: 'Failed to load the suite catalog, try again later',\n actionFail: 'Action failed',\n version: 'Version',\n dimensionUser: 'user',\n dimensionProject: 'project',\n layoutV1: 'portable v1',\n layoutCC: 'Claude Code',\n layoutCodex: 'Codex',\n layoutSkills: 'skill dir',\n layoutUniversal: 'universal',\n layoutCursor: 'Cursor',\n layoutKimi: 'Kimi',\n layoutRemote: 'remote reference',\n layoutProjectNative: 'project native',\n remoteRef: 'remote',\n surfaceSkills: 'skills',\n surfaceMcp: 'MCP',\n surfaceHooks: 'hooks',\n surfaceCommands: 'commands',\n surfaceAgents: 'subagents',\n surfaceLsp: 'LSP',\n sourceNotCloned: 'not cloned',\n sourceCloned: 'cloned',\n errors: 'validation issues',\n scanNotes: 'scan notes',\n sourceErrorSeparator: '; ',\n viewMode: 'View mode',\n grid: 'grid',\n list: 'list',\n openSettings: 'Open in settings',\n rootLabel: 'Suite root',\n dataLabel: 'Suite data root',\n countAll: '{n} suites',\n countInstalled: '{n} installed',\n countEnabled: '{n} enabled',\n mcpStatusNav: 'MCP services',\n lspStatusNav: 'LSP servers',\n lspSearch: 'Search LSP servers',\n lspAllMounted: 'All mounted',\n lspDirect: 'Direct',\n mcpStatusTitle: 'MCP services',\n mcpStatusSubtitle: 'Connection state, sources, and tools',\n mcpSearch: 'Search MCP names, sources, or endpoints…',\n mcpAll: 'All',\n mcpPlugin: 'Plugin',\n mcpDirect: 'Direct',\n mcpService: 'Service',\n mcpSource: 'Source',\n mcpTransport: 'Transport',\n mcpTools: 'tools',\n mcpTool: 'tool',\n mcpAllConnected: 'All connected',\n mcpReasonLabel: 'Reason',\n mcpRetryNote: 'Automatic retries were exhausted. Use Retry to reconnect now, or check the server configuration in the market.',\n mcpRetrying: 'Reconnecting…',\n mcpRetrySuccess: 'Reconnected — the service is live again',\n mcpRetryFailure: 'Reconnect failed — see the reason above',\n mcpReauthorize: 'Re-authorize',\n mcpConnect: 'Connect',\n mcpReauthorizing: 'Waiting for browser authorization…',\n marketCardDesc: 'Install, enable, and runtime settings for Agent Plugins Market suites.',\n mcpCardTitle: 'MCP enhancement',\n mcpCardDescOn: 'On: enables OAuth authorization, SSE, authorization hold, and more.',\n mcpCardDescOff: 'Off: uses the host dsh-mcp-client.',\n mcpCardReadonly: 'The settings document is read-only in this environment; the switch is unavailable.',\n mcpForeign: 'Mounted elsewhere',\n mcpForeignHint: 'This server is already mounted through another path (native config or another plugin); the market skipped it to avoid a duplicate. To let the market take over, disable the other source first. If it is a leftover mount, a Host restart clears it.',\n regionLabel: 'Download region',\n regionHint: 'China mainland routes through a mirror. Affects the download route only.',\n regionGlobal: 'Global',\n regionChina: 'China mainland',\n mcpBackendHostMissing: 'The host dsh-mcp-client is not available here; compat mode cannot be enabled.',\n mcpReauthHint: 'Drops the saved OAuth token and re-runs the browser authorization — for when you picked too narrow a scope. Finish the sign-in in the page that opens.',\n mcpConnectHint: 'Drops the stale grant and starts a fresh browser sign-in. Approve in the page that opens and the service connects automatically.',\n mcpReauthSuccess: 'Old grant dropped — finish the sign-in in the browser page that opened',\n mcpReauthFailure: 'Re-authorization failed — try again shortly',\n mcpZeroTools: 'Connected, but this service advertises no tools.',\n mcpConnected: 'connected',\n mcpDegraded: 'degraded',\n mcpFailed: 'failed',\n mcpNeedsCredentials: 'credentials required',\n mcpOrphaned: 'plugin removed; tools remain',\n mcpConfigureCredentials: 'Configure credentials',\n mcpViewDetails: 'View details',\n mcpCredentialTitle: 'Credential configuration',\n mcpCredentialConfigured: 'configured',\n mcpCredentialMissing: 'not configured',\n mcpCredentialReadOnly: 'provided by the launch environment (read-only; restart DSH after changes)',\n mcpCredentialUnavailable: 'This profile has no credentials service. Set the environment variable before launching DSH.',\n mcpCredentialPlaceholder: 'Enter credential (not echoed)',\n mcpCredentialSave: 'Save credential',\n mcpCredentialUnset: 'Remove credential',\n mcpDisabled: 'disabled',\n mcpObservedEndpoint: 'observed from tool registry',\n mcpServiceDetail: 'Service detail',\n mcpConfig: 'Connection config',\n mcpSelectHint: 'Select an MCP service to inspect config and tools',\n mcpEmpty: 'No matching MCP services',\n mcpNoTools: 'No registered tools',\n mcpDirectConfigUnavailable: 'The host does not expose direct-MCP configuration',\n mcpDirectBoundary: 'Direct MCP entries only show services observed in the current tool registry; the host exposes no config or connection-status API.',\n mcpBackToMarket: 'Back to market',\n mcpRetry: 'Retry',\n mcpFilterAllHint: 'All: MCP services declared by plugin suites plus host-installed MCP',\n mcpFilterPluginHint: 'Plugin: mcp.json declarations from market suites',\n mcpFilterDirectHint: 'Direct: MCP observed in the host tool registry outside any suite',\n lspStatusTitle: 'LSP servers',\n lspStatusSubtitle: 'Declared language servers and their mount state',\n lspAll: 'All',\n lspMounted: 'Mounted',\n lspStarting: 'Starting…',\n lspBlocked: 'Blocked',\n lspFailed: 'Failed',\n lspDisabled: 'Disabled',\n lspHostMissingShort: 'Host missing',\n lspConflict: 'Extension conflict',\n lspHostMissing: 'This DSH runtime does not carry the LSP packages (@deepseek-ai/dsh-lsp, dsh-lsp-stdio, dsh-tool-lsp), so declarations are not mounted; upgrade the host, mount the three layers in the profile, and re-enable the suite.',\n lspEmpty: 'No declared LSP servers',\n lspReasonLabel: 'Reason',\n lspFilterAllHint: 'All: suite-declared and user-configured language servers',\n lspFilterPluginHint: 'Plugin: inline lspServers declarations from market suites',\n lspFilterDirectHint: 'Direct: user-configured language servers (configured in this panel)',\n lspFilterBlockedHint: 'Blocked: missing host packages, failed mounts, or extension conflicts — open a card for the reason',\n lspFilterDisabledHint: 'Disabled: the suite LSP surface toggle is off',\n lspPlugin: 'Plugin',\n lspConfigure: 'Configure LSP',\n lspConfigureHint: 'Edit the user-configured language-server table (Claude Code lspServers format); servers mount automatically after save',\n lspSave: 'Save',\n lspDetailSubtitle: 'Language server detail',\n lspDetailCommand: 'Launch command',\n lspDetailExtensions: 'Extension map',\n mdCodeCopy: 'Copy',\n mdCodeCopied: 'Copied',\n mdFootnotes: 'Footnotes',\n}\n","/** Market overview cache, invalidation, and source-progress resource helpers. */\nimport { fetchOverview, fetchSourceProgress, type OverviewData, type SourceProgress } from '../../api.js'\n\n/** UI state emitted while a source mutation is in flight. */\nexport interface SourceProgressState {\n step: string | undefined\n error: string | undefined\n}\n\nconst EMPTY_OVERVIEW: OverviewData = { sources: [], suites: [], totals: { all: 0, installed: 0, enabled: 0 }, roots: { user: '', data: '' }, unmanaged: [] }\n\nlet cachedOverview: OverviewData | undefined\nlet inflightOverview: Promise<OverviewData> | undefined\n\n/** Load the last overview immediately and revalidate one shared request. */\nexport function loadOverview(): { initial: OverviewData; revalidating: boolean; promise: Promise<OverviewData> } {\n const initial = cachedOverview ?? EMPTY_OVERVIEW\n if (inflightOverview === undefined) {\n inflightOverview = fetchOverview()\n .then(data => {\n cachedOverview = data\n return data\n })\n .finally(() => {\n inflightOverview = undefined\n })\n }\n return { initial, revalidating: cachedOverview === undefined, promise: inflightOverview }\n}\n\n/** Invalidate the shared overview after a mutating action. */\nexport function invalidateOverview(): void {\n cachedOverview = undefined\n}\n\n/**\n * Poll source mutation progress until stopped. Poll failures remain silent\n * because the add-source request is authoritative for mutation success.\n */\nexport function startSourceProgressPolling(\n report: (state: SourceProgressState) => void,\n resolveStep: (step: SourceProgress['step']) => string = step => step\n): { stop: () => void } {\n let stopped = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const tick = async (): Promise<void> => {\n if (stopped) return\n try {\n const progress = await fetchSourceProgress()\n if (!stopped && progress.active) report({ step: resolveStep(progress.step), error: undefined })\n } catch {\n // Transient poll failures are ignored; the add request reports real errors.\n }\n if (!stopped)\n timer = setTimeout(() => {\n void tick()\n }, 800)\n }\n timer = setTimeout(() => {\n void tick()\n }, 400)\n return {\n stop: () => {\n stopped = true\n if (timer !== undefined) clearTimeout(timer)\n }\n }\n}\n","/** Pure market filtering and count derivation. */\nimport type { OverviewData, SuiteCardData } from '../../api.js'\n\n/** Market status filter. */\nexport type MarketFilter = 'all' | 'installed' | 'uninstalled'\n/** Market source scope. */\nexport type MarketCategory = 'all' | string\n\n/** Derived market view data used by the screen and its toolbar. */\nexport interface MarketViewModel {\n scopeTotals: { all: number; installed: number; enabled: number }\n filtered: SuiteCardData[]\n}\n\ninterface SearchableSuite {\n suite: SuiteCardData\n haystack: string\n}\n\nconst searchableCache = new WeakMap<OverviewData, SearchableSuite[]>()\n\n/** Derive visible cards and scope counts in one pass over a normalized payload. */\nexport function deriveMarketViewModel(overview: OverviewData, search: string, filter: MarketFilter, category: MarketCategory): MarketViewModel {\n const searchable = searchableFor(overview)\n const needle = search.trim().toLowerCase()\n let all = 0\n let installed = 0\n let enabled = 0\n const visible: SuiteCardData[] = []\n\n for (const entry of searchable) {\n const suite = entry.suite\n if (category !== 'all' && suite.sourceId !== category) continue\n all++\n if (suite.installed) installed++\n if (suite.enabled) enabled++\n if (filter === 'installed' && !suite.installed) continue\n if (filter === 'uninstalled' && suite.installed) continue\n if (needle !== '' && !entry.haystack.includes(needle)) continue\n visible.push(suite)\n }\n\n return { scopeTotals: { all, installed, enabled }, filtered: visible }\n}\n\nfunction searchableFor(overview: OverviewData): SearchableSuite[] {\n const cached = searchableCache.get(overview)\n if (cached !== undefined) return cached\n const searchable = overview.suites.map(suite => ({\n suite,\n haystack: `${suite.name} ${suite.description ?? ''} ${suite.keywords.join(' ')}`.toLowerCase()\n }))\n searchableCache.set(overview, searchable)\n return searchable\n}\n","/**\n * Agent Plugins Market section styles. Colors ride the dsh --dsw-alias-* tokens with\n * light-mode fallbacks so the page follows the active theme; the section\n * lives inside the settings dialog, so it scrolls within the dialog and\n * never takes over the app frame.\n */\n\n.market {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 24px;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n/* Page mode owns the outer padding; settings mode receives it from the host shell.\n Page mode is a fixed inset-0 shell, so it owns the height and its lists scroll\n inside it; settings mode lets the host `.options` container be the only scroller\n (nested scrollers double-scroll and can paint text outside card bounds). */\n.pageMode {\n height: 100%;\n min-height: 0;\n width: 100%;\n min-width: 0;\n}\n\n.marketControls {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-height: 0;\n}\n\n.mcpSurface {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.surfaceSwitch {\n flex: none;\n align-self: center;\n height: 26px;\n padding: 0 10px;\n border: 1px solid var(--dsw-alias-border-l2, #d4dce8);\n border-radius: 7px;\n background: var(--dsw-alias-bg-layer-1, #fff);\n color: var(--dsw-alias-brand-primary, #4966f5);\n cursor: pointer;\n font-size: 11px;\n}\n\n.surfaceSwitch:hover {\n background: var(--dsw-alias-state-business-tertiary, rgb(228, 237, 253));\n}\n\n/* Legacy page-mode shell: scoped to the injected data attributes. */\n:global(html[data-dsh-agent-plugins-market-page]) :global([data-pane='conversation']),\n:global(html[data-dsh-agent-plugins-market-page]) :global([class*='centerCol']) {\n position: relative;\n}\n\n.pageView {\n position: absolute;\n inset: 0;\n display: none;\n z-index: 60;\n min-width: 0;\n min-height: 0;\n padding: 20px 24px;\n overflow: hidden;\n background: var(--dsw-alias-bg-base, #f7f8fa);\n}\n\n:global(html[data-dsh-agent-plugins-market-page]) .pageView {\n display: flex;\n}\n\n:global(html[data-dsh-agent-plugins-market-page]) :global([data-pane='conversation']) > :not([data-dsh-agent-plugins-market-page-view]),\n:global(html[data-dsh-agent-plugins-market-page]) :global([class*='centerCol']) > :not([data-dsh-agent-plugins-market-page-view]) {\n display: none !important;\n}\n\n.pageEntry {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 32px;\n padding: 6px 12px;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary, #1f2328);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n}\n\n.pageEntry:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n}\n\n.pageEntry:active {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n.pageEntry svg {\n flex-shrink: 0;\n color: var(--dsw-alias-label-secondary, #6b7280);\n}\n\n.pageEntry span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:global([data-dsh-frame][data-sidebar-collapsed]) .pageEntry {\n justify-content: center;\n padding-inline: 0;\n}\n\n:global([data-dsh-frame][data-sidebar-collapsed]) .pageEntry span {\n display: none;\n}\n\n.pageEntry:focus-visible,\n.srcTabMain:focus-visible,\n.srcTabEdit:focus-visible,\n.srcTabDel:focus-visible,\n.seg:focus-visible,\n.segOn:focus-visible,\n.detailItemRow:focus-visible,\n.detailItemOpen:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n.header {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.titleRow {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.sub {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n margin: 0;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.spacer {\n flex: 1;\n}\n\n.searchGroup {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n.body {\n display: flex;\n gap: 20px;\n min-height: 0;\n flex: 1;\n align-items: flex-start;\n}\n\n/* --- source tabs (top, primary) -------------------------------------------------- */\n\n.sourceTabsRow {\n display: block;\n padding: 0;\n}\n\n.sourceTabsScroll {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(118px, 1fr));\n gap: 4px;\n}\n\n/* --- unmanaged checkout adoption row ---------------------------------------------- */\n\n.unmanagedRow {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #57606a);\n}\n\n.unmanagedLabel {\n flex-shrink: 0;\n}\n\n.unmanagedChip {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n height: 22px;\n padding: 0 4px 0 8px;\n border: 1px dashed var(--dsw-alias-border-l3, #d9dde3);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1, #fff);\n max-width: 220px;\n}\n\n.unmanagedChipName {\n font-size: 12px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.unmanagedAdopt {\n border: none;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n padding: 0 4px;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.unmanagedAdopt:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n\n.srcTabEdit {\n border: none;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n padding: 2px 2px;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.srcTabEdit:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.srcTabOn .srcTabEdit {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n.srcTabOn .srcTabEdit:hover {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n.srcTab,\n.srcTabOn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 24px;\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n border-radius: 999px;\n overflow: hidden;\n background: var(--dsw-alias-bg-layer-1, #fff);\n}\n\n.srcTabMain {\n border: none;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary, #1f2328);\n padding: 2px 2px 2px 10px;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n flex: 1;\n}\n\n.srcTabMain:hover {\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n}\n\n.srcTabOn {\n background: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6);\n border-color: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6);\n}\n\n.srcTabOn .srcTabMain {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n font-weight: 600;\n}\n\n.srcTabDel {\n border: none;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n padding: 2px 8px 2px 2px;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.srcTabDel:hover {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.srcTabOn .srcTabDel {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n.srcTabOn .srcTabDel:hover {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n/* --- card grid ----------------------------------------------------------------- */\n\n/* Lists scroll only in page mode (fixed shell); in settings mode the host\n `.options` container is the single scroller. */\n.grid {\n flex: 1;\n min-height: 0;\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n min-width: 0;\n align-content: start;\n}\n\n.pageMode .grid {\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding-right: 4px;\n}\n\n.list {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n}\n\n.pageMode .list {\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding-right: 4px;\n}\n\n.list .card {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px 14px;\n}\n\n.list .cardTop {\n flex: 0 0 auto;\n}\n\n.list .cardDesc {\n flex: 1;\n min-width: 200px;\n min-height: 0;\n max-height: 18px;\n overflow: hidden;\n}\n\n.list .cardActions {\n flex: 0 0 auto;\n}\n\n.list .meta,\n.list .tagRow {\n flex-basis: 100%;\n}\n\n.empty {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n padding: 48px 0;\n text-align: center;\n font-size: 13px;\n grid-column: 1 / -1;\n}\n\n.card {\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 12px;\n padding: 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n cursor: pointer;\n transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;\n}\n\n.card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n box-shadow: 0 1px 4px rgba(16, 24, 40, 0.06);\n}\n\n/* Installed cards carry the MCP card's left accent so install state scans\n like connection state does on the MCP page: green = enabled, gray = off. */\n.cardOn {\n border-left: 3px solid var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.cardMuted {\n border-left: 3px solid var(--dsw-alias-label-tertiary, #98a2b3);\n}\n\n.cardTop {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.cardTitle {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n}\n\n.cardName {\n font-size: 13px;\n font-weight: 600;\n line-height: 22px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.version {\n font-size: 12px;\n line-height: 20px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-variant-numeric: tabular-nums;\n flex-shrink: 0;\n}\n\n.cardActions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n/* Flat icon-only action (harness Button ghost geometry: transparent fill,\n interactive-bg hover). Rendered inline so no button-chrome box shows. */\n.iconBtn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n border: none;\n border-radius: 999px;\n background: none;\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.iconBtn svg {\n width: 15px;\n height: 15px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.8;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.iconBtn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.iconBtn:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n.iconBtn:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 1px;\n}\n\n.iconBtn:disabled {\n cursor: default;\n opacity: 0.4;\n}\n\n/* Destructive action only announces itself on hover, like the platform. */\n.iconBtnDanger:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n color: var(--dsw-alias-state-error-primary, rgb(236, 19, 19));\n}\n\n.switchOn,\n.switchOff {\n position: relative;\n width: 38px;\n height: 22px;\n border: none;\n border-radius: 999px;\n cursor: pointer;\n padding: 0;\n flex-shrink: 0;\n transition: background-color 0.15s ease;\n}\n\n/* ON rides the primary button fill (brand → dark in the platform theme),\n the same track color every other plugin toggle and native control uses —\n not state-success green, which reads as off-convention beside them. */\n.switchOn {\n background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-brand-primary, #4f6ef7));\n}\n\n.switchOff {\n background: var(--dsw-alias-label-dimmed, rgb(225, 229, 238));\n}\n\n.switchOn:disabled,\n.switchOff:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.switchThumb {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n transition: left 0.15s ease;\n pointer-events: none;\n}\n\n.switchOn .switchThumb {\n left: 19px;\n}\n\n.desc {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n /* Two-line cap without legacy -webkit-box clamping: the nested-scroll\n compositor can paint -webkit-box text outside its box, so bound the\n block height instead. */\n max-height: 36px;\n overflow: hidden;\n margin: 0;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n/* Surface-count tags live on their own line below source · layout so the\n first meta row stays scannable. */\n.tagRow {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n.src {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #9ca3af);\n text-decoration: none;\n}\n\n.tag {\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n color: var(--dsw-alias-label-secondary, #6b7280);\n border-radius: 4px;\n flex-shrink: 0;\n padding: 1px 6px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.okState {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-success-primary, #16a34a);\n white-space: nowrap;\n}\n\n.warnLine {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n font-weight: 600;\n font-size: 12px;\n line-height: 18px;\n margin: 0;\n cursor: help;\n}\n\n.modalFooter {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n width: 100%;\n}\n\n.modalFooterLeft {\n margin-right: auto;\n display: flex;\n gap: 8px;\n}\n\n/* --- source editor modal --------------------------------------------------------- */\n\n.editorDialog {\n width: min(500px, 92vw);\n}\n\n/* --- install confirmation modal --------------------------------------------------- */\n\n.installConfirmBody {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n}\n\n.installConfirmSuite {\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #111827);\n}\n\n.installConfirmMeta {\n color: var(--dsw-alias-label-secondary, #4b5563);\n font-size: 12px;\n}\n\n.installConfirmCommit {\n color: var(--dsw-alias-label-secondary, #4b5563);\n font-size: 12px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n.installConfirmTags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.installConfirmWarn {\n color: var(--dsw-alias-state-warn-label, rgb(221, 134, 41));\n font-size: 12px;\n border: 1px solid var(--dsw-alias-state-warn-label, rgb(221, 134, 41));\n border-radius: 8px;\n padding: 8px 10px;\n}\n\n.editorForm {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n\n.modeRow {\n display: flex;\n gap: 6px;\n padding: 3px;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-2, #f3f4f6);\n align-self: flex-start;\n}\n\n.seg,\n.segOn {\n border: none;\n background: none;\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n padding: 5px 14px;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.segOn {\n background: var(--dsw-alias-bg-layer-1, #fff);\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.fieldGroup {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.fieldLabel {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #6b7280);\n}\n\n.fieldHint {\n font-size: 12px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n}\n\n.staticId {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n border: 1px dashed var(--dsw-alias-border-l3, #d9dde3);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-2, #f3f4f6);\n}\n\n.staticIdValue {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n/* --- suite detail modal ---------------------------------------------------------- */\n\n.detailDialog {\n width: min(800px, 94vw);\n}\n\n.detailBody {\n display: flex;\n flex-direction: column;\n gap: 14px;\n max-height: 78vh;\n overflow-y: auto;\n}\n\n.detailSections {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.detailSection {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.detailHead {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #6b7280);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n padding-bottom: 4px;\n}\n\n.detailGrid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: 6px 14px;\n}\n\n.detailCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.detailKey {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n}\n\n.detailValue {\n font-size: 13px;\n color: var(--dsw-alias-label-primary, #1f2328);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detailDesc {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n}\n\n.mono {\n font-family: ui-monospace, Menlo, Consolas, monospace;\n font-size: 12px;\n line-height: 18px;\n word-break: break-all;\n white-space: pre-wrap;\n margin: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.detailItem {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.detailItemRow,\n.detailItemOpen {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n border: none;\n background: none;\n font: inherit;\n text-align: left;\n padding: 7px 10px;\n cursor: pointer;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.detailItemRow:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n}\n\n.detailItemOpen {\n background: var(--dsw-alias-state-business-tertiary, rgb(228, 237, 253));\n}\n\n.detailItemName {\n font-size: 13px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.detailItemDesc {\n flex: 1;\n min-width: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detailChevron {\n flex-shrink: 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n}\n\n.skillContent {\n border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n padding: 10px 12px;\n max-height: 320px;\n overflow-y: auto;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n/* --- add-source progress ------------------------------------------------------- */\n\n.progress,\n.progressError {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 13px;\n line-height: 20px;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n background: var(--dsw-alias-bg-layer-2, rgba(127, 127, 127, 0.06));\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.progressError {\n border-color: var(--dsw-alias-state-error-primary, rgb(236, 19, 19));\n color: var(--dsw-alias-state-error-primary, rgb(236, 19, 19));\n}\n\n.progressSpin {\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 2px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-top-color: var(--dsw-alias-brand-primary, #4f6ef7);\n animation: dshApmSpin 0.8s linear infinite;\n}\n\n@keyframes dshApmSpin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.progressFail {\n font-size: 13px;\n flex-shrink: 0;\n}\n\n.progressText {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n@media (max-width: 720px) {\n .pageView {\n padding: 14px;\n }\n\n .titleRow {\n flex-wrap: wrap;\n }\n\n .title {\n flex: 1 0 auto;\n }\n\n .sub {\n flex: 1 0 100%;\n order: 3;\n white-space: normal;\n }\n\n .searchGroup {\n flex: 1 0 100%;\n order: 4;\n }\n\n .sourceTabsScroll {\n display: flex;\n overflow-x: auto;\n padding-bottom: 2px;\n scrollbar-width: thin;\n }\n\n .srcTab,\n .srcTabOn {\n width: auto;\n min-width: 128px;\n flex: 0 0 auto;\n }\n\n .grid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .list .cardTop,\n .list .cardActions {\n max-width: 100%;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progressSpin,\n .switchOn,\n .switchOff,\n .switchThumb {\n animation: none;\n transition: none;\n }\n}\n\n.surfaceToggles {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 14px;\n align-items: center;\n}\n\n.surfaceToggle {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, rgb(97, 102, 107));\n cursor: pointer;\n user-select: none;\n}\n\n.surfaceToggle input[type='checkbox'] {\n accent-color: var(--dsw-alias-brand-primary-new-colorprimary-new-color, rgb(65, 118, 230));\n margin: 0;\n}\n\n.mcpOverrideForm {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 0 0 10px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1));\n border-radius: 8px;\n}\n\n.mcpCredentialForm {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 0 0 10px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1));\n border-radius: 8px;\n}\n\n.mcpCredentialRow {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.mcpCredentialControls {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.mcpCredentialEditor {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.mcpOverrideCheck {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n cursor: pointer;\n user-select: none;\n}\n\n.mcpOverrideInput {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 8px;\n font-size: 12px;\n}\n\n.mcpOverrideArea {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 8px;\n font-size: 12px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n resize: vertical;\n}\n\n.mcpOverrideActions {\n display: flex;\n gap: 8px;\n}\n\n.backendBlock {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 14px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1));\n border-radius: 10px;\n opacity: 1;\n}\n\n.backendBlock[data-busy='true'] {\n opacity: 0.6;\n pointer-events: none;\n}\n\n.backendRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.backendTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n}\n\n.backendCurrent {\n margin: 0;\n font-size: 12px;\n font-weight: 500;\n}\n\n.backendHint {\n margin: 0;\n font-size: 11px;\n opacity: 0.7;\n}\n\n.backendVersion {\n margin: 0;\n font-size: 11px;\n opacity: 0.55;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n/* The 插件配置 card mirrors the host PluginCard chrome (border-l2 tokens,\n 14/16 header padding, disclosure body at 0 16px) so it sits visually\n identical beside the native cards. */\n\n.pluginCard {\n list-style: none;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 12px;\n background: var(--dsw-alias-bg-layer-3, #fff);\n transition: border-color 0.16s, background 0.16s;\n}\n\n.pluginCard:hover {\n border-color: var(--dsw-alias-label-dimmed, #c8ccd4);\n}\n\n.pluginCardOpen {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border-color: var(--dsw-alias-label-dimmed, #c8ccd4);\n}\n\n.pluginCard[data-busy='true'] {\n opacity: 0.6;\n pointer-events: none;\n}\n\n.pluginCardHeader {\n width: 100%;\n appearance: none;\n border: 0;\n background: none;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n}\n\n.pluginCardHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: -2px;\n}\n\n.pluginCardBody {\n border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n margin: 0 16px;\n padding: 4px 0 8px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.pluginCardRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 8px 0 4px;\n}\n\n.pluginCardText {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n flex: 1;\n}\n\n.pluginCardTitle {\n color: var(--dsw-alias-label-primary, #1f2328);\n font-size: 15px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n.pluginCardDesc {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.pluginCardRowLabel {\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n}\n\n/* The switch is the shared ui/ToggleSwitch component (the same one the\n suite cards use) — no parallel switch styles here. */\n\n.pluginCardError {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-size: 12px;\n line-height: 1.5;\n margin: 0;\n}\n\n.pluginChevron {\n flex: none;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n transition: transform 0.16s;\n display: inline-flex;\n}\n\n.pluginChevronOpen {\n transform: rotate(180deg);\n}\n\n/* Region segmented control, mirroring dshmarket's setSeg chrome. */\n.regionSeg {\n flex: none;\n display: inline-flex;\n gap: 2px;\n padding: 2px;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n}\n\n.regionSegBtn {\n appearance: none;\n border: none;\n background: none;\n font: inherit;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n border-radius: 6px;\n padding: 3px 10px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.regionSegOn {\n appearance: none;\n border: none;\n font: inherit;\n cursor: pointer;\n border-radius: 6px;\n padding: 3px 10px;\n font-size: 12px;\n line-height: 18px;\n background: var(--dsw-alias-bg-layer-2, #eef0f4);\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n}\n\n.regionSegBtn:disabled,\n.regionSegOn:disabled {\n cursor: default;\n opacity: 0.5;\n}\n","/** A source tab with trailing edit and delete controls. */\nimport { createElement as h, type ReactNode } from 'react'\nimport type { Translate } from '../../index.js'\nimport css from '../../market.module.css'\n\nexport interface SourceTabProps {\n t: Translate\n active?: boolean\n label: string\n /** Hover hint for the tab (e.g. scan diagnostics); undefined hides it. */\n title?: string\n onSelect: () => void\n onDelete?: () => void\n onEdit?: () => void\n}\n\n/** A source chip with a trailing delete control (deletion confirms at the section level). */\nexport function SourceTab(props: SourceTabProps): ReactNode {\n const { t, active = false, label, title, onSelect, onDelete, onEdit } = props\n return h(\n 'div',\n { className: active ? css.srcTabOn : css.srcTab, title },\n h('button', { type: 'button', className: css.srcTabMain, onClick: onSelect }, label),\n onEdit === undefined\n ? null\n : h(\n 'button',\n {\n type: 'button',\n className: css.srcTabEdit,\n title: t('editSource'),\n onClick: (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n onEdit()\n }\n },\n '✎'\n ),\n onDelete === undefined\n ? null\n : h(\n 'button',\n {\n type: 'button',\n className: css.srcTabDel,\n title: t('remove'),\n onClick: (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n onDelete()\n }\n },\n '×'\n )\n )\n}\n","/** Source editor modal for adding or editing a catalog source. */\nimport { createElement as h, useState, type ReactNode } from 'react'\nimport { Button, Input, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SourceOverview } from '../../api.js'\nimport type { SourceProgressState } from './market-resource.js'\nimport type { Translate } from '../../index.js'\nimport css from '../../market.module.css'\n\nexport type EditorState = { mode: 'edit'; source: SourceOverview } | { mode: 'add' } | undefined\n\n/** Which acquisition path the editor configures. */\nexport type SourceEditorKind = 'git' | 'archive' | 'local'\n\nexport interface SourceEditorModalProps {\n t: Translate\n editor: Exclude<EditorState, undefined>\n busy: boolean\n progress: SourceProgressState\n onClose: () => void\n onSave: (input: { url: string; branch: string; kind: SourceEditorKind; sha256: string }) => Promise<boolean>\n onRemove: (id: string) => void\n}\n\nexport function SourceEditorModal(props: SourceEditorModalProps): ReactNode {\n const { t, editor } = props\n const [kind, setKind] = useState<SourceEditorKind>(editor.mode === 'edit' ? (editor.source.kind === 'archive' ? 'archive' : editor.source.local === true ? 'local' : 'git') : 'git')\n const [url, setUrl] = useState(editor.mode === 'edit' ? editor.source.url : '')\n const [branch, setBranch] = useState(editor.mode === 'edit' ? (editor.source.branch ?? '') : '')\n const [sha256, setSha256] = useState('')\n const id = editor.mode === 'edit' ? editor.source.id : ''\n const title = editor.mode === 'edit' ? t('editSourceTitle') : t('addSourceTitle')\n const urlPlaceholder = kind === 'local' ? t('sourceUrlLocalPh') : kind === 'archive' ? t('sourceUrlArchivePh') : t('sourceUrlPh')\n const urlHint = kind === 'local' ? t('urlLocalHint') : kind === 'archive' ? t('urlArchiveHint') : t('urlGitHint')\n const segment = (value: SourceEditorKind, label: string): ReactNode =>\n h(\n 'button',\n {\n type: 'button',\n className: kind === value ? css.segOn : css.seg,\n onClick: () => setKind(value)\n },\n label\n )\n return h(Modal, {\n open: true,\n onClose: props.onClose,\n title,\n description: t('editorHint'),\n closeLabel: t('cancel'),\n className: css.editorDialog,\n footer: h(\n 'div',\n { className: css.modalFooter },\n h('div', { className: css.modalFooterLeft }, editor.mode === 'edit' ? h(Button, { variant: 'ghost', onClick: () => props.onRemove(id) }, `🗑 ${t('remove')}`) : null),\n h(Button, { variant: 'ghost', onClick: props.onClose }, t('cancel')),\n h(\n Button,\n {\n variant: 'primary',\n disabled: props.busy,\n onClick: () => {\n void props.onSave({ url: url.trim(), branch: branch.trim(), kind, sha256: sha256.trim() })\n }\n },\n t('save')\n )\n ),\n children: h(\n 'div',\n { className: css.editorForm },\n h(\n 'div',\n { className: css.modeRow },\n segment('git', t('sourceModeGit')),\n segment('archive', t('sourceModeArchive')),\n segment('local', t('sourceModeLocal'))\n ),\n editor.mode === 'edit'\n ? h(\n 'div',\n { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, t('sourceIdPh')),\n h('div', { className: css.staticId }, h('span', { className: css.staticIdValue }, id), h('span', { className: css.fieldHint }, t('idFixed')))\n )\n : null,\n h(\n 'div',\n { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, urlPlaceholder),\n h(Input, { placeholder: urlPlaceholder, value: url, onChange: event => setUrl((event.target as HTMLInputElement).value) }),\n h('span', { className: css.fieldHint }, urlHint)\n ),\n kind === 'git'\n ? h(\n 'div',\n { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, t('branchPh')),\n h(Input, { placeholder: t('branchPh'), value: branch, onChange: event => setBranch((event.target as HTMLInputElement).value) }),\n h('span', { className: css.fieldHint }, t('branchHint'))\n )\n : null,\n kind === 'archive'\n ? h(\n 'div',\n { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, t('sha256Ph')),\n h(Input, { placeholder: t('sha256Ph'), value: sha256, onChange: event => setSha256((event.target as HTMLInputElement).value) }),\n h('span', { className: css.fieldHint }, t('sha256Hint'))\n )\n : null,\n props.progress.error === undefined && props.progress.step === undefined\n ? null\n : h(\n 'div',\n {\n className: props.progress.error === undefined ? css.progress : css.progressError\n },\n props.progress.error === undefined ? h('span', { className: css.progressSpin }) : h('span', { className: css.progressFail }, '✕'),\n h('span', { className: css.progressText }, props.progress.error === undefined ? props.progress.step : `${t('actionFail')}: ${props.progress.error}`)\n )\n )\n })\n}\n","/** Pre-install confirmation modal: concise surface counts plus a risk notice. */\nimport { createElement as h, type ReactNode } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SuiteCardData } from '../../api.js'\nimport type { Translate } from '../../index.js'\nimport css from '../../market.module.css'\n\nexport interface InstallConfirmState {\n suite: SuiteCardData\n /** Locked source commit shown in the confirm dialog; undefined for local sources. */\n lockCommit?: string\n /** True when the source is a local working tree (no immutable commit). */\n localSource?: boolean\n}\n\nexport interface InstallConfirmModalProps {\n t: Translate\n state: InstallConfirmState\n busy: boolean\n onClose: () => void\n onConfirm: () => Promise<boolean>\n}\n\n/** Surface count tags shown on the card; keys mirror SuiteCard's tag list. */\nconst SURFACE_TAGS: Array<{ key: 'skills' | 'mcp' | 'hooks' | 'commands' | 'agents' | 'lsp'; labelKey: 'surfaceSkills' | 'surfaceMcp' | 'surfaceHooks' | 'surfaceCommands' | 'surfaceAgents' | 'surfaceLsp' }> = [\n { key: 'skills', labelKey: 'surfaceSkills' },\n { key: 'mcp', labelKey: 'surfaceMcp' },\n { key: 'hooks', labelKey: 'surfaceHooks' },\n { key: 'commands', labelKey: 'surfaceCommands' },\n { key: 'agents', labelKey: 'surfaceAgents' },\n { key: 'lsp', labelKey: 'surfaceLsp' }\n]\n\nexport function InstallConfirmModal(props: InstallConfirmModalProps): ReactNode {\n const { t, state, busy } = props\n const surfaces = state.suite.surfaces\n const tags = SURFACE_TAGS.filter(tag => surfaces[tag.key] > 0)\n const executable = surfaces.mcp > 0 || surfaces.hooks > 0\n\n return h(Modal, {\n open: true,\n onClose: props.onClose,\n title: t('installConfirmTitle'),\n description: t('installConfirmDesc'),\n closeLabel: t('cancel'),\n className: css.editorDialog,\n footer: h(\n 'div',\n { className: css.modalFooter },\n h(Button, { variant: 'ghost', disabled: busy, onClick: props.onClose }, t('cancel')),\n h(\n Button,\n {\n variant: 'primary',\n disabled: busy,\n onClick: () => {\n void props.onConfirm()\n }\n },\n t('installConfirmAction')\n )\n ),\n children: h(\n 'div',\n { className: css.installConfirmBody },\n h('div', { className: css.installConfirmSuite }, `${state.suite.sourceId} / ${state.suite.name}`),\n state.suite.version === undefined ? null : h('div', { className: css.installConfirmMeta }, `${t('version')}: v${state.suite.version}`),\n state.lockCommit === undefined\n ? null\n : h('div', { className: css.installConfirmCommit }, `${t('installConfirmSource')}: ${state.lockCommit.slice(0, 12)}`),\n state.lockCommit === undefined && state.localSource === true\n ? h('div', { className: css.installConfirmCommit }, `${t('installConfirmSource')}: ${t('installConfirmLocalTree')}`)\n : null,\n tags.length === 0\n ? h('div', { className: css.installConfirmMeta }, t('installConfirmNoSurfaces'))\n : h(\n 'div',\n { className: css.installConfirmTags },\n tags.map(tag => h('span', { key: tag.key, className: css.tag }, `${t(tag.labelKey)} ${surfaces[tag.key]}`))\n ),\n executable ? h('div', { className: css.installConfirmWarn }, t('installConfirmExecutable')) : null\n )\n })\n}\n","/** Shared switch control (ON = primary button fill, like every host toggle). */\nimport { createElement as h, type ReactNode } from 'react'\nimport css from '../market.module.css'\n\nexport interface ToggleSwitchProps {\n on: boolean\n disabled?: boolean\n title?: string\n onChange: () => void\n}\n\n/** A green/gray switch control for suite enable state. */\nexport function ToggleSwitch(props: ToggleSwitchProps): ReactNode {\n return h(\n 'button',\n {\n type: 'button',\n role: 'switch',\n 'aria-checked': props.on,\n title: props.title,\n disabled: props.disabled,\n className: props.on ? css.switchOn : css.switchOff,\n onClick: (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n props.onChange()\n }\n },\n h('span', { className: css.switchThumb })\n )\n}\n","/** A suite card in the market grid/list. */\nimport { createElement as h, type ReactElement, type ReactNode } from 'react'\nimport { Button, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SuiteCardData } from '../../api.js'\nimport type { Translate } from '../../index.js'\nimport { ToggleSwitch } from '../../ui/ToggleSwitch.js'\nimport css from '../../market.module.css'\n\nexport interface SuiteCardProps {\n t: Translate\n suite: SuiteCardData\n busy: boolean\n onOpen: () => void\n onInstall: () => void\n onAddSource: () => void\n onToggle: () => void\n onRefresh: () => void\n onUninstall: () => void\n}\n\nexport function SuiteCard(props: SuiteCardProps): ReactNode {\n const { t, suite, busy } = props\n const tags: Array<[string, number]> = (\n [\n [t('surfaceSkills'), suite.surfaces.skills],\n [t('surfaceMcp'), suite.surfaces.mcp],\n [t('surfaceHooks'), suite.surfaces.hooks],\n [t('surfaceCommands'), suite.surfaces.commands],\n [t('surfaceAgents'), suite.surfaces.agents],\n [t('surfaceLsp'), suite.surfaces.lsp]\n ] as Array<[string, number]>\n ).filter(([, count]) => count > 0)\n const layoutLabel =\n suite.layout === 'agent-plugin-v1'\n ? t('layoutV1')\n : suite.layout === 'claude-code'\n ? t('layoutCC')\n : suite.layout === 'codex'\n ? t('layoutCodex')\n : suite.layout === 'universal'\n ? t('layoutUniversal')\n : suite.layout === 'cursor'\n ? t('layoutCursor')\n : suite.layout === 'kimi'\n ? t('layoutKimi')\n : suite.layout === 'remote'\n ? t('layoutRemote')\n : suite.layout === 'project-native'\n ? t('layoutProjectNative')\n : t('layoutSkills')\n const isRemote = suite.remoteUrl !== undefined\n const hasTagRow = tags.length > 0 || suite.errors.length > 0 || (suite.mcpErrors?.length ?? 0) > 0\n const stop = (callback: () => void) => (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n callback()\n }\n // Installed cards carry the MCP card's left accent: green = enabled, gray = disabled.\n const accent = suite.installed ? (suite.enabled ? css.cardOn : css.cardMuted) : undefined\n return h(\n 'article',\n { className: accent ? `${css.card} ${accent}` : css.card, onClick: props.onOpen },\n h(\n 'div',\n { className: css.cardTop },\n h(\n 'div',\n { className: css.cardTitle },\n h('span', { className: css.cardName }, suite.name),\n suite.version === undefined ? null : h('span', { className: css.version }, `v${suite.version}`)\n ),\n h(\n 'div',\n { className: css.cardActions },\n suite.installed\n ? [\n h(\n 'button',\n {\n key: 'refresh',\n type: 'button',\n className: css.iconBtn,\n title: t('refresh'),\n disabled: busy,\n onClick: stop(props.onRefresh)\n },\n h(\n 'svg',\n { viewBox: '0 0 24 24', 'aria-hidden': 'true' },\n h('path', { d: 'M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8' }),\n h('path', { d: 'M21 3v5h-5' })\n )\n ),\n h(\n 'button',\n {\n key: 'uninstall',\n type: 'button',\n className: `${css.iconBtn} ${css.iconBtnDanger}`,\n title: t('uninstall'),\n disabled: busy,\n onClick: stop(props.onUninstall)\n },\n h(\n 'svg',\n { viewBox: '0 0 24 24', 'aria-hidden': 'true' },\n h('path', { d: 'M3 6h18' }),\n h('path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6' }),\n h('path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2' })\n )\n ),\n // The enable switch reads last, at the card's trailing edge.\n h(ToggleSwitch, {\n key: 'toggle',\n on: suite.enabled,\n disabled: busy,\n title: suite.enabled ? t('disable') : t('enable'),\n onChange: props.onToggle\n })\n ]\n : isRemote\n ? h(\n Button,\n {\n variant: 'primary',\n size: 'sm',\n disabled: busy,\n title: suite.remoteUrl,\n onClick: stop(props.onAddSource)\n },\n t('addSource')\n )\n : h(\n Button,\n {\n variant: 'primary',\n size: 'sm',\n disabled: busy,\n onClick: stop(props.onInstall)\n },\n t('install')\n )\n )\n ),\n h('p', { className: css.desc }, suite.description ?? ''),\n h(\n 'div',\n { className: css.meta },\n h('span', { className: css.src }, `${suite.sourceId} · ${isRemote ? t('remoteRef') : suite.dimension === 'user' ? t('dimensionUser') : t('dimensionProject')}`),\n h('span', { className: css.tag }, layoutLabel)\n ),\n hasTagRow\n ? h(\n 'div',\n { className: css.tagRow },\n ...tags.map(([label, count]) => h('span', { key: label, className: css.tag }, `${label} ${count}`)),\n suite.errors.length === 0\n ? null\n : h(Tooltip, {\n label: suite.errors.slice(0, 8).join(t('sourceErrorSeparator')),\n children: h('span', { className: css.warnLine }, `⚠ ${t('errors')} ${suite.errors.length}`) as unknown as ReactElement\n }),\n (suite.mcpErrors?.length ?? 0) === 0\n ? null\n : h(Tooltip, {\n label: suite.mcpErrors!.slice(0, 8).join(t('sourceErrorSeparator')),\n children: h('span', { className: css.warnLine }, `⚠ ${t('mcpSection')} ${suite.mcpErrors!.length}`) as unknown as ReactElement\n })\n )\n : null\n )\n}\n","/** Shared status icon used by market and MCP status filter tabs. */\nimport { createElement as h, type ReactNode } from 'react'\n\nexport type StatusIconKind = 'all' | 'installed' | 'uninstalled'\n\nexport interface StatusIconProps {\n kind: StatusIconKind\n}\n\n/** An SVG status icon for the all/installed/uninstalled filter tabs. */\nexport function StatusIcon({ kind }: StatusIconProps): ReactNode {\n const common = { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n if (kind === 'installed') {\n return h('svg', common, h('circle', { cx: 8, cy: 8, r: 5.5 }), h('path', { d: 'm5.5 8 1.7 1.7 3.4-3.4' }))\n }\n if (kind === 'uninstalled') {\n return h('svg', common, h('path', { d: 'M8 2v8m-3-3 3 3 3-3M3 13h10' }))\n }\n return h('svg', common, h('path', { d: 'M2.5 5 8 2.5 13.5 5 8 7.5 2.5 5Zm0 3L8 10.5 13.5 8M2.5 11 8 13.5 13.5 11' }))\n}\n","/**\n * Error boundary for untrusted preview content.\n *\n * Skill/command/agent bodies and hook/LSP JSON are third-party content; a\n * renderer throw must degrade to a plain-text fallback instead of unmounting\n * the whole settings section (React has no built-in boundary).\n */\nimport { createElement as h, Component, type ReactNode } from 'react'\n\ninterface Props {\n children: ReactNode\n fallback?: (error: Error) => ReactNode\n}\n\ninterface State {\n error: Error | undefined\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n override state: State = { error: undefined }\n\n static getDerivedStateFromError(error: Error): State {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: unknown): void {\n console.warn('[dsh-agent-plugins-market] preview render failed:', error, info)\n }\n\n override render(): ReactNode {\n if (this.state.error !== undefined) {\n return this.props.fallback === undefined\n ? h('pre', { className: 'dsh-agent-plugins-fallback' }, `预览渲染失败:${this.state.error.message}`)\n : this.props.fallback(this.state.error)\n }\n return this.props.children\n }\n}\n","/** Browser-safe structural subset of the Host credentials wire. */\n\nexport interface CredentialView {\n configured: boolean\n source?: string\n writable: boolean\n}\n\nexport interface CredentialApi {\n describe(payload: { refs: string[] }): Promise<unknown>\n set(payload: { ref: string; value: string }): Promise<unknown>\n unset(payload: { ref: string }): Promise<unknown>\n}\n\ninterface CredentialDescribeResponse {\n result?: {\n ok?: boolean\n value?: { credentials?: Record<string, CredentialView> }\n error?: { message?: string }\n }\n}\n\ninterface CredentialMutationResponse {\n result?: { ok?: boolean; error?: { message?: string } }\n}\n\n/** Read one value-free credential view; secret values never enter the browser state. */\nexport async function describeCredential(api: CredentialApi | undefined, ref: string): Promise<CredentialView | undefined> {\n if (api === undefined) return undefined\n const response = (await api.describe({ refs: [ref] })) as CredentialDescribeResponse\n if (response.result?.ok !== true) throw new Error(response.result?.error?.message ?? 'credential lookup failed')\n return response.result.value?.credentials?.[ref]\n}\n\nexport async function setCredential(api: CredentialApi, ref: string, value: string): Promise<void> {\n const response = (await api.set({ ref, value })) as CredentialMutationResponse\n if (response.result?.ok !== true) throw new Error(response.result?.error?.message ?? 'credential save failed')\n}\n\nexport async function unsetCredential(api: CredentialApi, ref: string): Promise<void> {\n const response = (await api.unset({ ref })) as CredentialMutationResponse\n if (response.result?.ok !== true) throw new Error(response.result?.error?.message ?? 'credential removal failed')\n}\n","/* Write-only MCP credential editor. Colors ride dsh --dsw-alias-* tokens. */\n\n.form {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px 14px;\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n}\n\n.head {\n margin: 0;\n color: var(--dsw-alias-label-secondary, #667085);\n font-size: 12px;\n font-weight: 600;\n}\n\n.error {\n padding: 8px 10px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n border-radius: 8px;\n overflow-wrap: anywhere;\n font-size: 12px;\n line-height: 18px;\n}\n\n.row {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 6px;\n padding-top: 8px;\n border-top: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n}\n\n.ref {\n color: var(--dsw-alias-label-primary, #1f2328);\n font: 600 12px/18px ui-monospace, Menlo, Consolas, monospace;\n}\n\n.controls {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 8px;\n}\n\n.facts {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.factOk, .factMiss {\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.factOk {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, rgb(230, 250, 237));\n}\n\n.factMiss {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231));\n}\n\n.note {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n line-height: 17px;\n}\n\n.editor {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.input {\n width: 100%;\n box-sizing: border-box;\n padding: 7px 10px;\n color: var(--dsw-alias-label-primary, #1f2328);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n font-size: 12px;\n}\n\n.input:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 1px;\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n","/**\n * Write-only credential editor for MCP `${ENV_NAME}` references.\n *\n * Read facts (configured / source / writable) come from the value-free\n * credentials wire; a typed value crosses the wire exactly once, inside\n * `credentials.set`, and never re-enters component state. Read-only\n * launch-environment credentials render guidance instead of a form that could\n * only fake success.\n */\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { createElement as h } from 'react'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { describeCredential, setCredential, unsetCredential, type CredentialApi, type CredentialView } from './credentials.js'\nimport type { Translate } from './index.js'\nimport css from './mcp-credential.module.css'\n\nexport function McpCredentialEditor(props: { t: Translate; api?: CredentialApi; refs: string[] }): ReactNode {\n const { t, api, refs } = props\n const [views, setViews] = useState<Record<string, CredentialView>>({})\n const [drafts, setDrafts] = useState<Record<string, string>>({})\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [error, setError] = useState<string | undefined>(undefined)\n const refKey = refs.join('|')\n\n useEffect(() => {\n let cancelled = false\n setViews({})\n setError(undefined)\n if (api === undefined || refs.length === 0) return () => {\n cancelled = true\n }\n void Promise.all(refs.map(async ref => [ref, await describeCredential(api, ref)] as const))\n .then(entries => {\n if (cancelled) return\n setViews(Object.fromEntries(entries.flatMap(([ref, view]) => (view === undefined ? [] : [[ref, view]]))))\n })\n .catch(reason => {\n if (!cancelled) setError(reason instanceof Error ? reason.message : String(reason))\n })\n return () => {\n cancelled = true\n }\n }, [api, refKey])\n\n if (refs.length === 0) return null\n const refresh = async (ref: string): Promise<void> => {\n if (api === undefined) return\n const view = await describeCredential(api, ref)\n if (view !== undefined) setViews(current => ({ ...current, [ref]: view }))\n }\n const save = async (ref: string): Promise<void> => {\n const value = drafts[ref]?.trim()\n if (api === undefined || value === undefined || value === '') return\n setBusy(ref)\n setError(undefined)\n try {\n await setCredential(api, ref, value)\n setDrafts(current => ({ ...current, [ref]: '' }))\n await refresh(ref)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setBusy(undefined)\n }\n }\n const unset = async (ref: string): Promise<void> => {\n if (api === undefined) return\n setBusy(ref)\n setError(undefined)\n try {\n await unsetCredential(api, ref)\n await refresh(ref)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setBusy(undefined)\n }\n }\n\n return h(\n 'section',\n { className: css.form },\n h('h4', { className: css.head }, t('mcpCredentialTitle')),\n error === undefined ? null : h('div', { className: css.error }, error),\n refs.map(ref => {\n const view = views[ref]\n const refBusy = busy === ref\n return h(\n 'div',\n { key: ref, className: css.row },\n h('code', { className: css.ref }, ref),\n view === undefined\n ? h('div', { className: css.note }, api === undefined ? t('mcpCredentialUnavailable') : t('loading'))\n : h(\n 'div',\n { className: css.controls },\n h(\n 'div',\n { className: css.facts },\n h('span', { className: view.configured ? css.factOk : css.factMiss }, view.configured ? t('mcpCredentialConfigured') : t('mcpCredentialMissing')),\n view.source === undefined ? null : h('span', { className: css.note }, view.source)\n ),\n view.writable\n ? h(\n 'div',\n { className: css.editor },\n h('input', {\n className: css.input,\n type: 'password',\n autoComplete: 'new-password',\n value: drafts[ref] ?? '',\n placeholder: t('mcpCredentialPlaceholder'),\n disabled: refBusy,\n onChange: event => setDrafts(current => ({ ...current, [ref]: (event.target as HTMLInputElement).value }))\n }),\n h(\n 'div',\n { className: css.actions },\n h(Button, { variant: 'primary', size: 'sm', disabled: refBusy || (drafts[ref]?.trim() ?? '') === '', onClick: () => void save(ref) }, t('mcpCredentialSave')),\n view.configured ? h(Button, { variant: 'ghost', size: 'sm', disabled: refBusy, onClick: () => void unset(ref) }, t('mcpCredentialUnset')) : null\n )\n )\n : h('div', { className: css.note }, t('mcpCredentialReadOnly'))\n )\n )\n })\n )\n}\n","/** Request-order guard for asynchronously loaded suite detail content. */\n\n/** A small monotonic guard that invalidates stale detail responses. */\nexport interface LatestRequestGuard {\n next(): number\n invalidate(): void\n isCurrent(requestId: number): boolean\n}\n\n/** Create a request guard for one detail modal instance. */\nexport function createLatestRequestGuard(): LatestRequestGuard {\n let revision = 0\n return {\n next: () => ++revision,\n invalidate: () => {\n revision++\n },\n isCurrent: requestId => requestId === revision\n }\n}\n","/**\n * Suite detail modal: click one suite card to browse its internals.\n *\n * Sections: manifest overview, the skill list (each skill expands to its\n * SKILL.md body through the safe MarkdownText renderer), the validated\n * mcp.json servers (each expands to its full config), command/subagent file\n * lists, hook/LSP counts, and validation diagnostics.\n */\nimport { createElement as h, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Button, Modal, MarkdownText, type MarkdownLabels } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { fetchSkillContent, fetchSuiteDetail, postAction, type McpServerDetail, type SuiteDetail } from './api.js'\nimport type { CredentialApi } from './credentials.js'\nimport { ErrorBoundary } from './ErrorBoundary.js'\nimport { McpCredentialEditor } from './McpCredentialEditor.js'\nimport type { Translate } from './index.js'\nimport { createLatestRequestGuard } from './features/suite-detail/suite-detail-resource.js'\nimport css from './market.module.css'\n\n/** Toggleable surface keys paired with their translation keys. */\nconst SURFACE_TOGGLE_ROWS = [\n ['skills', 'surfaceSkills'],\n ['mcp', 'surfaceMcp'],\n ['hooks', 'surfaceHooks'],\n ['commands', 'surfaceCommands'],\n ['agents', 'surfaceAgents'],\n ['lsp', 'surfaceLsp']\n] as const\n\nexport interface SuiteDetailModalProps {\n t: Translate\n credentials?: CredentialApi\n sourceId: string\n suiteId: string\n onClose: () => void\n}\n\nexport function SuiteDetailModal({ t, credentials, sourceId, suiteId, onClose }: SuiteDetailModalProps): ReactNode {\n // MarkdownText's chrome (code copy buttons, footnotes heading) is\n // Cordis-free and takes its copy through this labels object.\n const markdownLabels = useMemo<MarkdownLabels>(\n () => ({ code: { copyLabel: t('mdCodeCopy'), copiedLabel: t('mdCodeCopied') }, footnotes: t('mdFootnotes') }),\n [t]\n )\n const [detail, setDetail] = useState<SuiteDetail | undefined>(undefined)\n const [error, setError] = useState<string | undefined>(undefined)\n const [openSkill, setOpenSkill] = useState<string | undefined>(undefined)\n const [skillText, setSkillText] = useState<string | undefined>(undefined)\n const [skillLoading, setSkillLoading] = useState(false)\n const skillRequestGuard = useRef(createLatestRequestGuard())\n const [openMcp, setOpenMcp] = useState<string | undefined>(undefined)\n const [openPreview, setOpenPreview] = useState<string | undefined>(undefined)\n\n useEffect(() => {\n let cancelled = false\n skillRequestGuard.current.invalidate()\n setDetail(undefined)\n setError(undefined)\n setOpenSkill(undefined)\n setSkillText(undefined)\n fetchSuiteDetail(sourceId, suiteId)\n .then(value => {\n if (!cancelled) setDetail(value)\n })\n .catch(reason => {\n if (!cancelled) setError(reason instanceof Error ? reason.message : String(reason))\n })\n return () => {\n cancelled = true\n skillRequestGuard.current.invalidate()\n }\n }, [sourceId, suiteId])\n\n const toggleSkill = async (name: string): Promise<void> => {\n const requestId = skillRequestGuard.current.next()\n if (openSkill === name) {\n setOpenSkill(undefined)\n return\n }\n setOpenSkill(name)\n setSkillLoading(true)\n setSkillText(undefined)\n try {\n const content = await fetchSkillContent(sourceId, suiteId, name)\n if (skillRequestGuard.current.isCurrent(requestId)) setSkillText(content.content)\n } catch (reason) {\n if (skillRequestGuard.current.isCurrent(requestId)) setSkillText(`⚠ ${reason instanceof Error ? reason.message : String(reason)}`)\n } finally {\n if (skillRequestGuard.current.isCurrent(requestId)) setSkillLoading(false)\n }\n }\n\n const toggleMcp = (key: string): void => {\n setOpenMcp(openMcp === key ? undefined : key)\n }\n\n const [surfaceBusy, setSurfaceBusy] = useState(false)\n const toggleSurface = async (surface: string, enabled: boolean): Promise<void> => {\n setSurfaceBusy(true)\n try {\n await postAction('set-surface', { sourceId, suiteId, surface, enabled })\n const next = await fetchSuiteDetail(sourceId, suiteId)\n setDetail(next)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setSurfaceBusy(false)\n }\n }\n\n /** Save or clear one server's MCP override, then refresh the detail. */\n const saveMcpOverride = async (serverKey: string, patch: Record<string, unknown> | null): Promise<void> => {\n setSurfaceBusy(true)\n try {\n await postAction('set-mcp-override', { sourceId, suiteId, serverKey, override: patch })\n const next = await fetchSuiteDetail(sourceId, suiteId)\n setDetail(next)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setSurfaceBusy(false)\n }\n }\n\n const layoutLabel =\n detail === undefined\n ? ''\n : detail.layout === 'agent-plugin-v1'\n ? t('layoutV1')\n : detail.layout === 'claude-code'\n ? t('layoutCC')\n : detail.layout === 'codex'\n ? t('layoutCodex')\n : detail.layout === 'universal'\n ? t('layoutUniversal')\n : detail.layout === 'cursor'\n ? t('layoutCursor')\n : detail.layout === 'kimi'\n ? t('layoutKimi')\n : detail.layout === 'remote'\n ? t('layoutRemote')\n : detail.layout === 'project-native'\n ? t('layoutProjectNative')\n : t('layoutSkills')\n\n return h(Modal, {\n open: true,\n onClose,\n title: detail === undefined ? t('detailTitle') : `${detail.name}${detail.version === null ? '' : ` v${detail.version}`}`,\n description: detail === undefined ? undefined : t('detailHint'),\n closeLabel: t('cancel'),\n className: css.detailDialog,\n contentClassName: css.detailBody,\n footer: h('div', { className: css.modalFooter }, h(Button, { variant: 'ghost', onClick: onClose }, t('cancel'))),\n children: h(ErrorBoundary, {\n fallback: boundaryError => h('div', { className: css.warnLine }, `${t('actionFail')}: ${boundaryError.message}`),\n children:\n error !== undefined\n ? h('div', { className: css.warnLine }, error)\n : detail === undefined\n ? h('div', { className: css.empty }, t('loading'))\n : h(\n 'div',\n { className: css.detailSections },\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, t('overviewSection')),\n h(\n 'div',\n { className: css.detailGrid },\n h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('sourceLabel')), h('span', { className: css.detailValue }, detail.sourceId)),\n h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('dimensionLabel')),\n h('span', { className: css.detailValue }, detail.dimension === 'user' ? t('dimensionUser') : t('dimensionProject'))\n ),\n h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('layoutLabel')), h('span', { className: css.detailValue }, layoutLabel)),\n h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('statusLabel')),\n h(\n 'span',\n { className: detail.enabled ? css.okState : css.detailValue },\n detail.installed ? (detail.enabled ? t('installedBadge') : t('disabledLabel')) : t('notInstalledLabel')\n )\n ),\n detail.author === null\n ? null\n : h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('authorLabel')),\n h('span', { className: css.detailValue }, detail.author)\n ),\n detail.keywords.length === 0\n ? null\n : h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('keywordsLabel')),\n h('span', { className: css.detailValue }, detail.keywords.join(', '))\n )\n ),\n detail.description === null ? null : h('p', { className: css.detailDesc }, detail.description),\n h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('rootLabel')), h('span', { className: css.mono }, detail.root)),\n detail.installed === false || detail.surfaceToggles === null\n ? null\n : h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('surfaceTogglesSection')),\n h(\n 'div',\n { className: css.surfaceToggles, title: t('surfaceTogglesHint') },\n ...SURFACE_TOGGLE_ROWS.map(([key, labelKey]) =>\n h('label', { key, className: css.surfaceToggle }, h('input', {\n type: 'checkbox',\n checked: detail.surfaceToggles![key],\n disabled: surfaceBusy,\n onChange: event => {\n void toggleSurface(key, (event.target as HTMLInputElement).checked)\n }\n }), t(labelKey))\n )\n )\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('skillsSection')} (${detail.skills.length})`),\n detail.skills.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.skills.map(skill =>\n h(\n 'div',\n { key: skill.name, className: css.detailItem },\n h(\n 'button',\n {\n type: 'button',\n className: openSkill === skill.name ? css.detailItemOpen : css.detailItemRow,\n onClick: () => {\n void toggleSkill(skill.name)\n }\n },\n h('span', { className: css.detailItemName }, skill.name),\n h('span', { className: css.detailItemDesc }, skill.description),\n h('span', { className: css.detailChevron }, openSkill === skill.name ? '▾' : '▸')\n ),\n openSkill !== skill.name ? null : h('div', { className: css.skillContent }, skillLoading ? t('loading') : h(MarkdownText, { text: skillText ?? '', labels: markdownLabels }))\n )\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('mcpSection')} (${detail.mcpServers.length})`),\n detail.mcpErrors.length === 0\n ? null\n : h('div', { className: css.warnLine, style: { margin: '0 0 6px' } }, `⚠ ${detail.mcpErrors.join(t('sourceErrorSeparator'))}`),\n detail.mcpServers.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.mcpServers.map(server => {\n const override = detail.mcpOverrides?.[server.key]\n const overridden = override !== undefined && Object.keys(override).length > 0\n const disabled = override?.enabled === false\n return h(\n 'div',\n { key: server.key, className: css.detailItem },\n h(\n 'button',\n {\n type: 'button',\n className: openMcp === server.key ? css.detailItemOpen : css.detailItemRow,\n onClick: () => toggleMcp(server.key)\n },\n h('span', { className: css.detailItemName }, server.key),\n h(\n 'span',\n { className: css.detailItemDesc },\n `${mcpSummary(server)}${disabled ? ` · ${t('mcpOverrideDisabledBadge')}` : overridden ? ` · ${t('mcpOverriddenBadge')}` : ''}`\n ),\n h('span', { className: css.detailChevron }, openMcp === server.key ? '▾' : '▸')\n ),\n openMcp === server.key\n ? h(\n 'div',\n { className: css.skillContent },\n detail.installed && detail.surfaceToggles?.mcp !== false\n ? h(McpCredentialEditor, { t, api: credentials, refs: server.credentialRefs ?? [] })\n : null,\n detail.installed && detail.surfaceToggles?.mcp !== false\n ? h(McpOverrideEditor, {\n t,\n serverKey: server.key,\n transport: server.type,\n override: override ?? {},\n busy: surfaceBusy,\n onSave: patch => saveMcpOverride(server.key, patch),\n onReset: () => saveMcpOverride(server.key, null)\n })\n : null,\n h('pre', { className: css.mono }, JSON.stringify(server, null, 2))\n )\n : null\n )\n })\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('commandsSection')} (${detail.commands.length})`),\n detail.commands.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.commands.map(command =>\n h(PreviewRow, {\n key: `c:${command.name}`,\n t,\n name: `/${command.name}`,\n description: command.description,\n open: openPreview === `c:${command.name}`,\n onToggle: () => setOpenPreview(openPreview === `c:${command.name}` ? undefined : `c:${command.name}`),\n children: h(MarkdownText, { text: command.content, labels: markdownLabels })\n })\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('agentsSection')} (${detail.agents.length})`),\n detail.agents.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.agents.map(agent =>\n h(PreviewRow, {\n key: `a:${agent.name}`,\n t,\n name: agent.name,\n description: agent.description,\n open: openPreview === `a:${agent.name}`,\n onToggle: () => setOpenPreview(openPreview === `a:${agent.name}` ? undefined : `a:${agent.name}`),\n children: h(MarkdownText, { text: agent.content, labels: markdownLabels })\n })\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('hooksLabel')} (${detail.hooks.count})`),\n detail.hooks.count === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.hooks.entries.map((hook, index) =>\n h(PreviewRow, {\n key: `h:${index}`,\n t,\n name: hook.event,\n description: hook.command,\n open: openPreview === `h:${index}`,\n onToggle: () => setOpenPreview(openPreview === `h:${index}` ? undefined : `h:${index}`),\n children: h('pre', { className: css.mono }, JSON.stringify(hook, null, 2))\n })\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('lspSection')} (${detail.lsp.servers.length + detail.lsp.raw.length})`),\n detail.lsp.servers.length === 0 && detail.lsp.raw.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : [\n ...detail.lsp.servers.map(server =>\n h(PreviewRow, {\n key: `l:${server.key}`,\n t,\n name: server.key,\n description: lspSummary(server),\n open: openPreview === `l:${server.key}`,\n onToggle: () => setOpenPreview(openPreview === `l:${server.key}` ? undefined : `l:${server.key}`),\n children: h('pre', { className: css.mono }, JSON.stringify(server, null, 2))\n })\n ),\n ...detail.lsp.raw.map(entry =>\n h(PreviewRow, {\n key: `l:${entry.name}`,\n t,\n name: entry.name,\n open: openPreview === `l:${entry.name}`,\n onToggle: () => setOpenPreview(openPreview === `l:${entry.name}` ? undefined : `l:${entry.name}`),\n children: h('pre', { className: css.mono }, entry.content)\n })\n )\n ]\n ),\n detail.errors.length === 0\n ? null\n : h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('errors')} (${detail.errors.length})`),\n detail.errors.map((entry, index) => h('div', { key: index, className: css.warnLine }, entry))\n )\n )\n })\n })\n}\n\nfunction mcpSummary(server: McpServerDetail): string {\n if (server.type === 'stdio') return server.command ?? server.type\n return server.url ?? server.type\n}\n\n/** One-line summary of a declared LSP server: command plus mapped extension list. */\nfunction lspSummary(server: { command: string; extensions: Record<string, string> }): string {\n return [server.command, Object.keys(server.extensions).join(' ')].join(' · ')\n}\n\n/** Parse `KEY=VALUE` lines into a record; blank and comment lines are skipped. */\nfunction parseKvLines(text: string): Record<string, string> | undefined {\n const result: Record<string, string> = {}\n for (const line of text.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed === '' || trimmed.startsWith('#')) continue\n const eq = trimmed.indexOf('=')\n if (eq <= 0) continue\n result[trimmed.slice(0, eq).trim()] = trimmed.slice(eq + 1).trim()\n }\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/** Format a record back into sorted `KEY=VALUE` lines without exposing literal secrets. */\nconst SENSITIVE_KEY = /(authorization|token|secret|password|credential|api[-_]?key)/i\n\nfunction formatKvLines(map: Record<string, string> | undefined): string {\n if (map === undefined) return ''\n return Object.keys(map)\n .filter(key => !SENSITIVE_KEY.test(key) || map[key]?.includes('${'))\n .sort()\n .map(key => `${key}=${map[key]}`)\n .join('\\n')\n}\n\ntype OverridePatch = Record<string, unknown>\n\n/**\n * Per-server MCP override editor: enable/disable plus connection-input\n * replacement (url/headers for http servers, args/env for stdio). The\n * suite's own mcp.json stays source-owned; everything here persists as a\n * user override layered on top at mount time.\n */\nfunction McpOverrideEditor(props: {\n t: Translate\n serverKey: string\n transport: string\n override: Record<string, unknown>\n busy: boolean\n onSave: (patch: OverridePatch) => Promise<void>\n onReset: () => Promise<void>\n}): ReactNode {\n const { t, transport, override, busy } = props\n const [draft, setDraft] = useState<OverridePatch>(override)\n const kvHint = t('mcpOverrideKvHint')\n const isHttp = transport !== 'stdio'\n /** Gather the draft fields into one sanitized override patch and save it. */\n const submit = (): void => {\n const patch: OverridePatch = {}\n patch['enabled'] = draft['enabled'] !== false\n if (isHttp && typeof draft['url'] === 'string' && draft['url'] !== '') patch['url'] = draft['url']\n const headerText = isHttp ? String(draft['__headers'] ?? '') : ''\n const headers = parseKvLines(headerText)\n if (headers !== undefined) patch['headers'] = headers\n const envText = !isHttp ? String(draft['__env'] ?? '') : ''\n const env = parseKvLines(envText)\n if (env !== undefined) patch['env'] = env\n const argsText = !isHttp ? String(draft['__args'] ?? '') : ''\n const args = argsText\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line !== '')\n if (args.length > 0) patch['args'] = args\n void props.onSave(patch)\n }\n return h(\n 'div',\n { className: css.mcpOverrideForm },\n h(\n 'label',\n { className: css.mcpOverrideCheck },\n h('input', {\n type: 'checkbox',\n checked: draft['enabled'] !== false,\n disabled: busy,\n onChange: event => setDraft({ ...draft, enabled: (event.target as HTMLInputElement).checked })\n }),\n t('mcpOverrideEnabled')\n ),\n isHttp\n ? h('input', {\n className: css.mcpOverrideInput,\n value: typeof draft['url'] === 'string' ? draft['url'] : '',\n placeholder: t('mcpOverrideUrlLabel'),\n disabled: busy,\n onChange: event => setDraft({ ...draft, url: (event.target as HTMLInputElement).value })\n })\n : null,\n isHttp\n ? h('textarea', {\n className: css.mcpOverrideArea,\n rows: 3,\n placeholder: t('mcpOverrideHeadersLabel'),\n title: kvHint,\n value: typeof draft['__headers'] === 'string' ? draft['__headers'] : formatKvLines(override['headers'] as Record<string, string> | undefined),\n disabled: busy,\n onChange: (event: { target: EventTarget | null }) => setDraft({ ...draft, __headers: (event.target as HTMLTextAreaElement).value })\n })\n : null,\n !isHttp\n ? h('textarea', {\n className: css.mcpOverrideArea,\n rows: 3,\n placeholder: t('mcpOverrideEnvLabel'),\n title: kvHint,\n value: typeof draft['__env'] === 'string' ? draft['__env'] : formatKvLines(override['env'] as Record<string, string> | undefined),\n disabled: busy,\n onChange: (event: { target: EventTarget | null }) => setDraft({ ...draft, __env: (event.target as HTMLTextAreaElement).value })\n })\n : null,\n !isHttp\n ? h('textarea', {\n className: css.mcpOverrideArea,\n rows: 3,\n placeholder: t('mcpOverrideArgsLabel'),\n value: typeof draft['__args'] === 'string' ? draft['__args'] : Array.isArray(override['args']) ? (override['args'] as string[]).join('\\n') : '',\n disabled: busy,\n onChange: (event: { target: EventTarget | null }) => setDraft({ ...draft, __args: (event.target as HTMLTextAreaElement).value })\n })\n : null,\n h('div', { className: css.mcpOverrideActions },\n h(Button, { variant: 'primary', size: 'sm', disabled: busy, onClick: submit }, t('mcpOverrideSave')),\n h(Button, { variant: 'ghost', size: 'sm', disabled: busy, onClick: () => void props.onReset() }, t('mcpOverrideReset'))\n ),\n h('div', { className: css.detailItemDesc }, kvHint)\n )\n}\n\nfunction PreviewRow(props: { t: Translate; name: string; description?: string; open: boolean; onToggle: () => void; children: ReactNode }): ReactNode {\n const { name, description, open, onToggle, children } = props\n return h(\n 'div',\n { className: css.detailItem },\n h(\n 'button',\n {\n type: 'button',\n className: open ? css.detailItemOpen : css.detailItemRow,\n onClick: onToggle\n },\n h('span', { className: css.detailItemName }, name),\n description === undefined ? null : h('span', { className: css.detailItemDesc }, description),\n h('span', { className: css.detailChevron }, open ? '▾' : '▸')\n ),\n open ? h('div', { className: css.skillContent }, children) : null\n )\n}\n","/* Shared search + filter + view-switch row.\n *\n * Flexbox, not a fixed column grid: panels pass different filter counts\n * (MCP 3, LSP 4), and a hard-coded grid template overflowed on the fourth\n * filter, pushing the view switch onto its own row and forcing a horizontal\n * scrollbar. Here the search box flexes, filter buttons keep their natural\n * width, and the spacer pushes the view switch to the trailing edge. */\n.toolbar {\n display: flex;\n align-items: flex-end;\n gap: 6px;\n min-width: 0;\n}\n\n.filterGap,\n.viewGap {\n flex: 1 0 12px;\n min-width: 0;\n}\n\n.search {\n display: flex;\n flex: 1 1 240px;\n align-items: center;\n box-sizing: border-box;\n min-width: 0;\n height: 36px;\n}\n\n.search input {\n box-sizing: border-box;\n min-width: 0;\n width: 100%;\n height: 36px;\n min-height: 36px;\n max-height: 36px;\n padding-top: 0;\n padding-bottom: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n.filter,\n.filterOn {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n gap: 5px;\n min-width: 54px;\n height: 36px;\n padding: 7px 9px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n border: none;\n border-bottom: 2px solid transparent;\n background: none;\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n white-space: nowrap;\n}\n\n.filterOn {\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n border-bottom-color: var(--dsw-alias-brand-primary, #4f6ef7);\n font-weight: 600;\n}\n\n.filter svg,\n.filterOn svg,\n.viewSwitch svg {\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.filterCount {\n font-variant-numeric: tabular-nums;\n}\n\n.viewSwitch {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 36px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n border: none;\n border-bottom: 2px solid transparent;\n background: none;\n cursor: pointer;\n}\n\n.viewSwitch:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.viewSwitch:focus-visible,\n.filter:focus-visible,\n.filterOn:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n@media (max-width: 760px) {\n .toolbar {\n flex-wrap: wrap;\n justify-content: flex-end;\n }\n\n .search {\n flex-basis: 100%;\n }\n\n .filterGap {\n display: none;\n }\n}\n","/**\n * Shared search, filter, and view controls for catalog-style settings panels.\n */\nimport { createElement as h, type ReactNode } from 'react'\nimport { Input } from '@deepseek-ai/dsh-client-ui-primitives'\nimport css from './SearchFilterToolbar.module.css'\n\nexport type SearchFilterToolbarView = 'grid' | 'list'\n\nexport interface SearchFilterToolbarFilter {\n id: string\n label: string\n count: number\n icon: ReactNode\n active: boolean\n onSelect: () => void\n /** Extended hover/aria explanation; falls back to the label when absent. */\n hint?: string\n}\n\nexport interface SearchFilterToolbarProps {\n search: string\n searchLabel: string\n searchPlaceholder: string\n onSearchChange: (search: string) => void\n filters: readonly SearchFilterToolbarFilter[]\n view: SearchFilterToolbarView\n gridLabel: string\n listLabel: string\n onViewChange: (view: SearchFilterToolbarView) => void\n className?: string\n}\n\n/**\n * Render a consistent control row for searchable grid and list content.\n *\n * @param props - Search state, selectable filters, and view-mode state.\n * @returns Search input, filter tabs, and an accessible grid/list toggle.\n */\nexport function SearchFilterToolbar(props: SearchFilterToolbarProps): ReactNode {\n const nextView: SearchFilterToolbarView = props.view === 'grid' ? 'list' : 'grid'\n const nextViewLabel = nextView === 'grid' ? props.gridLabel : props.listLabel\n return h('div', { className: props.className === undefined ? css.toolbar : `${css.toolbar} ${props.className}` },\n h(Input, {\n className: css.search,\n value: props.search,\n placeholder: props.searchPlaceholder,\n 'aria-label': props.searchLabel,\n onChange: event => props.onSearchChange((event.target as HTMLInputElement).value),\n }),\n h('div', { className: css.filterGap }),\n ...props.filters.map(filter => h('button', {\n key: filter.id,\n type: 'button',\n className: filter.active ? css.filterOn : css.filter,\n title: filter.hint ?? `${filter.label} ${filter.count}`,\n 'aria-label': filter.hint ?? `${filter.label} ${filter.count}`,\n onClick: filter.onSelect,\n }, filter.icon, h('span', { className: css.filterCount }, filter.count))),\n h('div', { className: css.viewGap }),\n h('button', {\n type: 'button',\n className: css.viewSwitch,\n 'aria-label': nextViewLabel,\n title: nextViewLabel,\n onClick: () => props.onViewChange(nextView),\n }, h(ViewIcon, { mode: nextView })),\n )\n}\n\nfunction ViewIcon({ mode }: { mode: SearchFilterToolbarView }): ReactNode {\n const common = { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n return mode === 'list'\n ? h('svg', common, h('path', { d: 'M3 4h10M3 8h10M3 12h10' }))\n : h('svg', common, h('rect', { x: 2.5, y: 2.5, width: 4, height: 4, rx: .8 }), h('rect', { x: 9.5, y: 2.5, width: 4, height: 4, rx: .8 }), h('rect', { x: 2.5, y: 9.5, width: 4, height: 4, rx: .8 }), h('rect', { x: 9.5, y: 9.5, width: 4, height: 4, rx: .8 }))\n}\n","/**\n * The Agent Plugins Market settings section.\n *\n * Layout: repository sources run along the TOP as chips (全部 first), with\n * edit-current / add / refresh-all controls on the right; below sit search,\n * status tabs, and the card grid. Colors ride the dsh --dsw-alias-* tokens\n * with light-mode fallbacks so the page follows the active theme.\n */\nimport { createElement as h, useCallback, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { Button, Modal, Toast } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { postAction, type OverviewData, type SuiteCardData } from './api.js'\nimport { loadOverview, invalidateOverview, startSourceProgressPolling, type SourceProgressState } from './features/market/market-resource.js'\nimport { deriveMarketViewModel, type MarketCategory, type MarketFilter } from './features/market/market-view-model.js'\nimport { SourceTab } from './features/market/SourceTab.js'\nimport { SourceEditorModal, type EditorState } from './features/market/SourceEditorModal.js'\nimport { InstallConfirmModal, type InstallConfirmState } from './features/market/InstallConfirmModal.js'\nimport { SuiteCard } from './features/market/SuiteCard.js'\nimport { StatusIcon } from './ui/StatusIcon.js'\nimport type { Translate } from './index.js'\nimport type { CredentialApi } from './credentials.js'\nimport { ErrorBoundary } from './ErrorBoundary.js'\nimport { SuiteDetailModal } from './SuiteDetail.js'\nimport { SearchFilterToolbar } from './SearchFilterToolbar.js'\nimport css from './market.module.css'\n\n/** Host step keys -> translation keys, resolved against the active t(). */\nconst PROGRESS_STEP_LABELS: Record<string, string> = {\n cloning: 'progressCloning',\n downloading: 'progressDownloading',\n reading: 'progressReading'\n}\n\nexport interface MarketSectionProps {\n t: Translate\n /** Host credentials wire used for write-only MCP env configuration. */\n credentials?: CredentialApi\n /** The host surface controls only outer spacing; data and actions stay shared. */\n mode?: 'settings' | 'page'\n}\n\ntype Tab = MarketFilter\ntype Category = MarketCategory\ntype ViewMode = 'grid' | 'list'\n\ninterface ToastState {\n key: number\n message: string\n}\n\ninterface ConfirmState {\n kind: 'uninstall' | 'removeSource'\n sourceId: string\n suiteId?: string\n}\n\nfunction progressStepLabel(t: Translate, step: string): string {\n const key = PROGRESS_STEP_LABELS[step]\n return key === undefined ? step : t(key as Parameters<Translate>[0])\n}\n\n/** Keep parameterized copy compatible with hosts whose bound translator ignores params. */\nfunction interpolate(text: string, params: Record<string, unknown>): string {\n return text.replace(/\\{(\\w+)\\}/g, (match, key: string) => (key in params ? String(params[key]) : match))\n}\n\nexport function MarketSection({ t, credentials, mode = 'settings' }: MarketSectionProps): ReactNode {\n const [overview, setOverview] = useState<OverviewData>(() => loadOverview().initial)\n const [loading, setLoading] = useState(() => loadOverview().revalidating)\n const [search, setSearch] = useState('')\n const [tab, setTab] = useState<Tab>('all')\n const [category, setCategory] = useState<Category>('all')\n const [view, setView] = useState<ViewMode>('grid')\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [toast, setToast] = useState<ToastState | undefined>(undefined)\n const [confirm, setConfirm] = useState<ConfirmState | undefined>(undefined)\n const [installConfirm, setInstallConfirm] = useState<InstallConfirmState | undefined>(undefined)\n const [editor, setEditor] = useState<EditorState>(undefined)\n const [detail, setDetail] = useState<{ sourceId: string; suiteId: string } | undefined>(undefined)\n const [progress, setProgress] = useState<SourceProgressState>({ step: undefined, error: undefined })\n\n const refresh = useCallback(async () => {\n invalidateOverview()\n try {\n const data = await loadOverview().promise\n setOverview(data)\n } catch {\n setToast({ key: Date.now(), message: t('loadFail') })\n } finally {\n setLoading(false)\n }\n }, [t])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n const action = useCallback(\n async (key: string, path: string, body: Record<string, unknown>): Promise<boolean> => {\n setBusy(key)\n try {\n await postAction(path, body)\n invalidateOverview()\n await refresh()\n return true\n } catch (error) {\n setToast({ key: Date.now(), message: `${t('actionFail')}: ${error instanceof Error ? error.message : String(error)}` })\n return false\n } finally {\n setBusy(undefined)\n }\n },\n [refresh, t]\n )\n\n const viewModel = useMemo(() => deriveMarketViewModel(overview, search, tab, category), [overview, search, tab, category])\n const { scopeTotals, filtered } = viewModel\n\n const openUninstall = useCallback((suite: SuiteCardData) => {\n setConfirm({ kind: 'uninstall', sourceId: suite.sourceId, suiteId: suite.suiteId })\n }, [])\n\n const confirmAction = useCallback(async () => {\n if (confirm === undefined) return\n if (confirm.kind === 'uninstall' && confirm.suiteId !== undefined) {\n await action(`u:${confirm.suiteId}`, 'uninstall', { sourceId: confirm.sourceId, suiteId: confirm.suiteId })\n } else if (confirm.kind === 'removeSource') {\n await action(`s:${confirm.sourceId}`, 'sources/remove', { id: confirm.sourceId })\n if (category === confirm.sourceId) setCategory('all')\n }\n setConfirm(undefined)\n }, [confirm, action, category])\n\n const selectedSource = category === 'all' ? undefined : overview.sources.find(source => source.id === category)\n\n const adoptSource = useCallback(\n async (id: string) => {\n await action(`s:adopt:${id}`, 'sources/adopt', { id })\n },\n [action]\n )\n const unmanaged = overview.unmanaged ?? []\n\n return h(ErrorBoundary, {\n fallback: error => h('div', { className: css.empty }, `${t('actionFail')}: ${error.message}`),\n children: h(\n 'div',\n { className: mode === 'page' ? `${css.market} ${css.pageMode}` : css.market },\n h(\n 'header',\n { className: css.header },\n h(\n 'div',\n { className: css.titleRow },\n h('h2', { className: css.title }, t('nav')),\n h('div', { className: css.spacer }),\n h(\n 'div',\n { className: css.searchGroup },\n h(Button, { variant: 'ghost', size: 'sm', title: t('addSource'), onClick: () => setEditor({ mode: 'add' }) }, '+'),\n h(\n Button,\n {\n variant: 'ghost',\n size: 'sm',\n title: t('refreshAll'),\n onClick: () => {\n void action('s:refresh:all', 'sources/refresh', {})\n }\n },\n '↻'\n )\n )\n ),\n h(\n 'div',\n { className: css.marketControls },\n h(\n 'div',\n { className: css.sourceTabsRow },\n h(\n 'div',\n { className: css.sourceTabsScroll },\n h(SourceTab, {\n key: '__all__',\n t,\n active: category === 'all',\n label: `${t('tabAll')} ${overview.totals.all}`,\n onSelect: () => setCategory('all')\n }),\n ...[...overview.sources]\n .sort((a, b) => a.id.localeCompare(b.id))\n .map(source => {\n const notes = source.scanNotes ?? []\n const noteHint = notes.length === 0 ? undefined : `${t('scanNotes')}: ${notes.slice(0, 8).join(t('sourceErrorSeparator'))}`\n const kindBadge = source.local === true ? t('sourceLocal') : source.kind === 'archive' ? t('sourceArchive') : source.adopted === true ? t('sourceAdopted') : undefined\n return h(SourceTab, {\n key: source.id,\n t,\n active: category === source.id,\n label: `${source.id}${kindBadge === undefined ? '' : ` · ${kindBadge}`} ${source.suiteIds.length}${source.cloned === false || notes.length > 0 ? ' ⚠' : ''}`,\n title: noteHint,\n onSelect: () => setCategory(source.id),\n onDelete: () => setConfirm({ kind: 'removeSource', sourceId: source.id }),\n onEdit: selectedSource?.id === source.id ? () => setEditor({ mode: 'edit', source: source }) : undefined\n })\n })\n )\n ),\n unmanaged.length === 0\n ? null\n : h(\n 'div',\n { className: css.unmanagedRow },\n h('span', { className: css.unmanagedLabel }, t('unmanagedTitle')),\n ...unmanaged.map(entry =>\n h(\n 'span',\n { key: entry.id, className: css.unmanagedChip, title: entry.url ?? t('unmanagedNoRemote') },\n h('span', { className: css.unmanagedChipName }, entry.id),\n h(\n 'button',\n {\n type: 'button',\n className: css.unmanagedAdopt,\n disabled: busy !== undefined,\n title: t('unmanagedAdopt'),\n onClick: () => {\n void adoptSource(entry.id)\n }\n },\n '+'\n )\n )\n )\n ),\n h(SearchFilterToolbar, {\n search,\n searchLabel: t('searchPh'),\n searchPlaceholder: t('searchPh'),\n onSearchChange: setSearch,\n filters: [\n { id: 'all', label: t('tabAll'), count: scopeTotals.all, icon: h(StatusIcon, { kind: 'all' }), active: tab === 'all', onSelect: () => setTab('all') },\n {\n id: 'installed',\n label: t('tabInstalled'),\n count: scopeTotals.installed,\n icon: h(StatusIcon, { kind: 'installed' }),\n active: tab === 'installed',\n onSelect: () => setTab('installed')\n },\n {\n id: 'uninstalled',\n label: t('tabUninstalled'),\n count: scopeTotals.all - scopeTotals.installed,\n icon: h(StatusIcon, { kind: 'uninstalled' }),\n active: tab === 'uninstalled',\n onSelect: () => setTab('uninstalled')\n }\n ],\n view,\n gridLabel: t('grid'),\n listLabel: t('list'),\n onViewChange: nextView => setView(nextView)\n })\n )\n ),\n h(\n 'main',\n { className: view === 'grid' ? css.grid : css.list },\n loading\n ? h('div', { className: css.empty }, t('loading'))\n : filtered.length === 0\n ? h('div', { className: css.empty }, tab === 'installed' ? t('installedEmpty') : t('empty'))\n : filtered.map(suite =>\n h(SuiteCard, {\n key: `${suite.sourceId}/${suite.suiteId}`,\n t,\n suite,\n busy: busy !== undefined,\n onOpen: () => setDetail({ sourceId: suite.sourceId, suiteId: suite.suiteId }),\n onInstall: () => {\n const source = overview.sources.find(entry => entry.id === suite.sourceId)\n setInstallConfirm({\n suite,\n ...(source?.lockCommit === undefined ? {} : { lockCommit: source.lockCommit }),\n ...(source?.local === true ? { localSource: true } : {})\n })\n },\n onAddSource: () => {\n if (suite.remoteUrl !== undefined) void action(`a:${suite.suiteId}`, 'sources/add', { url: suite.remoteUrl })\n },\n onToggle: () => {\n void action(`e:${suite.suiteId}`, 'set-enabled', { sourceId: suite.sourceId, suiteId: suite.suiteId, enabled: !suite.enabled })\n },\n onRefresh: () => {\n void action(`r:${suite.suiteId}`, 'sources/refresh', { id: suite.sourceId })\n },\n onUninstall: () => openUninstall(suite)\n })\n )\n ),\n toast === undefined ? null : h(Toast, { key: toast.key, text: toast.message, onDone: () => setToast(undefined) }),\n installConfirm === undefined\n ? null\n : h(InstallConfirmModal, {\n t,\n state: installConfirm,\n busy: busy !== undefined,\n onClose: () => setInstallConfirm(undefined),\n onConfirm: async () => {\n const ok = await action(`i:${installConfirm.suite.suiteId}`, 'install', {\n sourceId: installConfirm.suite.sourceId,\n suiteId: installConfirm.suite.suiteId\n })\n if (ok) setInstallConfirm(undefined)\n return ok\n }\n }),\n confirm === undefined\n ? null\n : h(Modal, {\n open: true,\n onClose: () => setConfirm(undefined),\n title:\n confirm.kind === 'uninstall'\n ? t('uninstallConfirmTitle')\n : interpolate(t('removeSourceConfirmTitle', { sourceId: confirm.sourceId }), { sourceId: confirm.sourceId }),\n closeLabel: t('cancel'),\n description: confirm.kind === 'uninstall' ? t('uninstallConfirmDesc') : t('removeSourceConfirmDesc'),\n footer: h(\n 'div',\n { className: css.modalFooter },\n h(Button, { variant: 'ghost', onClick: () => setConfirm(undefined) }, t('cancel')),\n h(\n Button,\n {\n variant: 'primary',\n onClick: () => {\n void confirmAction()\n }\n },\n t('confirmDelete')\n )\n )\n }),\n detail === undefined\n ? null\n : h(SuiteDetailModal, {\n t,\n credentials,\n sourceId: detail.sourceId,\n suiteId: detail.suiteId,\n onClose: () => setDetail(undefined)\n }),\n editor === undefined\n ? null\n : h(SourceEditorModal, {\n t,\n editor,\n busy: busy !== undefined,\n progress,\n onClose: () => setEditor(undefined),\n onSave: async ({ url, branch, kind, sha256 }) => {\n const key = editor.mode === 'edit' ? `s:edit:${editor.source.id}` : `s:add:${url}`\n const body: Record<string, unknown> = { url, local: kind === 'local', kind }\n if (branch !== '' && kind === 'git') body['branch'] = branch\n if (sha256 !== '' && kind === 'archive') body['sha256'] = sha256\n if (editor.mode === 'add') {\n setBusy(key)\n setProgress({ step: t('progressStarting'), error: undefined })\n const poll = startSourceProgressPolling(setProgress, step => progressStepLabel(t, step))\n try {\n const payload = await postAction('sources/add', body)\n const derived = (payload['source'] as { id?: string } | undefined)?.id\n invalidateOverview()\n await refresh()\n setEditor(undefined)\n if (derived !== undefined) setCategory(derived)\n return true\n } catch (error) {\n setToast({ key: Date.now(), message: `${t('actionFail')}: ${error instanceof Error ? error.message : String(error)}` })\n setProgress({ step: undefined, error: error instanceof Error ? error.message : String(error) })\n return false\n } finally {\n poll.stop()\n setBusy(undefined)\n }\n }\n const ok = await action(key, 'sources/update', { id: editor.source.id, ...body })\n if (ok) setEditor(undefined)\n return ok\n },\n onRemove: async id => {\n setConfirm({ kind: 'removeSource', sourceId: id })\n setEditor(undefined)\n }\n })\n )\n })\n}\n","/** Pure MCP status filtering and count derivation. */\nimport type { McpStatusEntry, McpStatusPayload } from '../../api.js'\n\n/** MCP status list filter. */\nexport type McpStatusFilter = 'all' | 'plugin' | 'direct'\n\n/** Derived MCP list data used by the status screen. */\nexport interface McpStatusViewModel {\n activeEntries: McpStatusEntry[]\n filtered: McpStatusEntry[]\n filterCounts: { all: number; plugin: number; direct: number }\n /** Counted over the active (non-disabled-hidden) rows for the current view. */\n visibleTotals: { all: number; connected: number; degraded: number; failed: number; needsCredentials: number; orphaned: number; disabled: number; foreign: number }\n}\n\ninterface SearchableEntry {\n entry: McpStatusEntry\n haystack: string\n}\n\nconst searchableCache = new WeakMap<McpStatusPayload, SearchableEntry[]>()\n\n/** Derive active rows, filter counts, and visible rows in one pass. */\nexport function deriveMcpStatusViewModel(payload: McpStatusPayload, filter: McpStatusFilter, search: string): McpStatusViewModel {\n const searchable = searchableFor(payload)\n const activeEntries = searchable.map(item => item.entry)\n const filterCounts = { all: 0, plugin: 0, direct: 0 }\n const visibleTotals = { all: 0, connected: 0, degraded: 0, failed: 0, needsCredentials: 0, orphaned: 0, disabled: 0, foreign: 0 }\n const filtered: McpStatusEntry[] = []\n const needle = search.trim().toLowerCase()\n\n for (const item of searchable) {\n const entry = item.entry\n filterCounts.all++\n filterCounts[entry.kind]++\n visibleTotals.all++\n if (entry.state === 'connected') visibleTotals.connected++\n if (entry.state === 'degraded') visibleTotals.degraded++\n if (entry.state === 'failed') visibleTotals.failed++\n if (entry.state === 'needs-credentials') visibleTotals.needsCredentials++\n if (entry.state === 'orphaned') visibleTotals.orphaned++\n if (entry.state === 'disabled') visibleTotals.disabled++\n if (entry.state === 'foreign') visibleTotals.foreign++\n if (filter !== 'all' && entry.kind !== filter) continue\n if (needle !== '' && !item.haystack.includes(needle)) continue\n filtered.push(entry)\n }\n\n return {\n activeEntries,\n filtered,\n filterCounts,\n visibleTotals\n }\n}\n\nfunction searchableFor(payload: McpStatusPayload): SearchableEntry[] {\n const cached = searchableCache.get(payload)\n if (cached !== undefined) return cached\n const searchable = payload.entries\n .filter(entry => entry.state !== 'disabled')\n .map(entry => ({\n entry,\n haystack: `${entry.name} ${entry.source ?? ''} ${entry.endpoint ?? ''} ${entry.transport} ${entry.reason ?? ''} ${(entry.credentialRefs ?? []).join(' ')}`.toLowerCase()\n }))\n searchableCache.set(payload, searchable)\n return searchable\n}\n",".surface {\n display: flex;\n min-width: 0;\n flex-direction: column;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n.header {\n display: flex;\n flex: none;\n align-items: center;\n gap: 8px;\n padding: 4px 0 8px;\n}\n.title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n.subtitle {\n margin: 2px 0 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 13px;\n line-height: 20px;\n}\n.headerActions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n.summary {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n color: var(--dsw-alias-label-secondary, #667085);\n font-size: 12px;\n white-space: nowrap;\n}\n.errorSummary {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n}\n/* Summary bar: one chip per non-healthy state, plus the observation time. */\n.summaryBar {\n display: flex;\n flex: none;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n}\n.summaryChip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n}\n.chiporphaned, .chipfailed {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n}\n.chipneedsCredentials, .chipdegraded {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231));\n}\n.chipdisabled {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-1, #fff);\n}\n.summaryAllGood {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n color: var(--dsw-alias-state-success-primary, #16a34a);\n font-size: 12px;\n}\n.summaryCount {\n font-weight: 700;\n}\n.summaryLabel {\n color: inherit;\n}\n.observedAt {\n margin-left: auto;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n white-space: nowrap;\n}\n.summaryDotGreen, .summaryDotRed {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n}\n.summaryDotGreen { background: var(--dsw-alias-state-success-primary, #16a34a); }\n.summaryDotRed { background: var(--dsw-alias-state-error-primary, #dc2626); }\n.summaryDotWarn { background: var(--dsw-alias-state-warn-primary, #b45309); }\n.summaryDotInfo { background: var(--dsw-alias-brand-primary, #4f6ef7); }\n.toolbar {\n flex: none;\n margin-bottom: 24px;\n}\n.grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n min-width: 0;\n gap: 12px;\n align-content: start;\n}\n.list {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 8px;\n}\n.list .card {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n column-gap: 14px;\n row-gap: 8px;\n}\n.list .cardTop {\n flex: 0 1 260px;\n}\n.list .endpoint {\n flex: 1 1 200px;\n max-height: 18px;\n}\n.card {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n color: inherit;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 12px;\n cursor: pointer;\n font: inherit;\n text-align: left;\n user-select: none;\n transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;\n}\n.card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n box-shadow: 0 1px 4px rgba(16, 24, 40, 0.06);\n}\n.cardBody {\n display: flex;\n min-width: 0;\n flex: 1;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px 10px;\n}\n\n.card:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n.cardTop {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n.statusDot {\n width: 7px;\n height: 7px;\n flex: none;\n border-radius: 50%;\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n.statusconnected { background: var(--dsw-alias-state-success-primary, #16a34a); }\n.statusdegraded { background: var(--dsw-alias-state-warn-primary, #b45309); }\n.statusfailed { background: var(--dsw-alias-state-error-primary, #dc2626); }\n.statusneeds-credentials { background: var(--dsw-alias-state-warn-primary, #b45309); }\n.statusorphaned { background: var(--dsw-alias-state-error-primary, #dc2626); }\n.statusdisabled { background: var(--dsw-alias-label-tertiary, #98a2b3); }\n.service {\n flex: 1;\n min-width: 0;\n}\n.name {\n display: block;\n overflow: hidden;\n color: var(--dsw-alias-label-primary, #1f2328);\n text-overflow: ellipsis;\n white-space: nowrap;\n font: 600 13px/22px ui-monospace, Menlo, Consolas, monospace;\n}\n.endpoint {\n /* Two-line truncation without legacy -webkit-box line clamping: the\n nested-scroll compositor paints -webkit-box text outside its box when\n the surrounding page re-scrolls, so cap the block height instead. */\n max-height: 36px;\n overflow: hidden;\n margin: 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font: 12px/18px ui-monospace, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n}\n.sourcePlugin, .sourceDirect, .transport, .toolCount {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n padding: 1px 6px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n border-radius: 4px;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n line-height: 18px;\n}\n.sourcePlugin svg, .sourceDirect svg {\n width: 14px;\n height: 14px;\n flex: none;\n color: currentColor;\n stroke: currentColor;\n stroke-width: 1.35;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n.transport {\n font-family: ui-monospace, Menlo, Consolas, monospace;\n}\n.toolCount {\n flex: none;\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n}\n.reasonLabel {\n flex: none;\n font-weight: 600;\n opacity: 0.85;\n}\n/* State pill: the card's one-line verdict, color-coded by severity. */\n.statePill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 17px;\n white-space: nowrap;\n font-weight: 600;\n}\n.statePill::before {\n width: 6px;\n height: 6px;\n content: '';\n background: currentColor;\n border-radius: 50%;\n}\n.stateconnected {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, rgb(230, 250, 237));\n}\n.statedegraded, .stateneeds-credentials {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231));\n}\n.statefailed, .stateorphaned {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n}\n.statedisabled {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n}\n/* Card left accent follows the state so scanning the grid is instant. */\n.cardConnected { border-left: 3px solid var(--dsw-alias-state-success-primary, #16a34a); }\n.cardDegraded, .cardNeedsCredentials { border-left: 3px solid var(--dsw-alias-state-warn-primary, #b45309); }\n.cardFailed, .cardOrphaned { border-left: 3px solid var(--dsw-alias-state-error-primary, #dc2626); }\n.cardDisabled { border-left: 3px solid var(--dsw-alias-label-tertiary, #98a2b3); }\n.state, .detailState {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n color: var(--dsw-alias-state-success-primary, #16a34a);\n font-size: 11px;\n white-space: nowrap;\n}\n.state::before, .detailState::before {\n width: 6px;\n height: 6px;\n content: '';\n background: currentColor;\n border-radius: 50%;\n}\n.stateconnected, .detailStateconnected { color: var(--dsw-alias-state-success-primary, #16a34a); }\n.statedegraded, .detailStatedegraded { color: var(--dsw-alias-state-warn-primary, #b45309); }\n.statefailed, .detailStatefailed { color: var(--dsw-alias-state-error-primary, #dc2626); }\n.stateneeds-credentials, .detailStateneeds-credentials { color: var(--dsw-alias-state-warn-primary, #b45309); }\n.stateorphaned, .detailStateorphaned { color: var(--dsw-alias-state-error-primary, #dc2626); }\n.statedisabled, .detailStatedisabled { color: var(--dsw-alias-label-tertiary, #98a2b3); }\n.chevron { color: var(--dsw-alias-label-tertiary, #8b93a1); font-size: 18px; }\n.empty, .detailEmpty {\n padding: 24px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 12px;\n text-align: center;\n}\n.error {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 16px 0;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-size: 12px;\n}\n.boundary {\n margin: 10px 0 0;\n padding: 9px 10px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border-left: 2px solid var(--dsw-alias-border-l3, #d9dde3);\n font-size: 11px;\n line-height: 17px;\n}\n.detailDialog { width: min(720px, 94vw); }\n.detailBody { max-height: 72vh; overflow-y: auto; }\n.modalFooter { display: flex; justify-content: flex-end; width: 100%; }\n.detail { display: flex; flex-direction: column; gap: 16px; }\n.detailMeta { display: flex; flex-wrap: wrap; gap: 6px; }\n/* Modal hero: state + endpoint above the fold. */\n.detailHero {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n}\n.detailHeroText {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 5px;\n}\n.detailEndpoint {\n margin: 0;\n color: var(--dsw-alias-label-secondary, #667085);\n overflow-wrap: anywhere;\n font: 12px/18px ui-monospace, Menlo, Consolas, monospace;\n}\n.reason {\n padding: 9px 10px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n border-left: 2px solid currentColor;\n font-size: 11px;\n line-height: 16px;\n}\n.reasonBox {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 10px 12px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n border-radius: 8px;\n}\n.reasonText {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 12px;\n line-height: 18px;\n}\n.detailSection { display: flex; flex-direction: column; gap: 7px; }\n.detailHead {\n margin: 0;\n padding-bottom: 5px;\n color: var(--dsw-alias-label-secondary, #667085);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n font-size: 12px;\n font-weight: 600;\n}\n.config {\n max-height: 220px;\n overflow: auto;\n margin: 0;\n padding: 10px;\n color: var(--dsw-alias-label-primary, #344054);\n background: var(--dsw-alias-bg-layer-2, #f6f8fc);\n border: 1px solid var(--dsw-alias-border-l1, #e2e7ef);\n border-radius: 7px;\n white-space: pre-wrap;\n word-break: break-word;\n font: 11px/17px ui-monospace, Menlo, Consolas, monospace;\n}\n.toolList { display: flex; flex-direction: column; }\n/* Two columns: the name track sizes to its content (long MCP tool names are\n the identity, never clipped), the description takes the remainder. */\n.tool {\n display: grid;\n grid-template-columns: minmax(140px, max-content) minmax(0, 1fr);\n gap: 12px;\n align-items: center;\n padding: 7px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n}\n.tool:last-child { border-bottom: none; }\n.toolName { overflow: hidden; color: var(--dsw-alias-label-primary, #1f2328); text-overflow: ellipsis; white-space: nowrap; font: 11px/16px ui-monospace, Menlo, Consolas, monospace; }\n.toolDescription { overflow: hidden; color: var(--dsw-alias-label-tertiary, #8b93a1); text-overflow: ellipsis; white-space: nowrap; font-size: 10px; }\n@media (max-width: 760px) {\n .header, .toolbar { padding-left: 0; padding-right: 0; }\n .header { flex-direction: column; }\n .headerActions { width: 100%; margin-left: 0; justify-content: space-between; }\n .grid { grid-template-columns: minmax(0, 1fr); }\n .list .cardTop { max-width: 100%; }\n .tool { grid-template-columns: minmax(0, 1fr); }\n .toolDescription { display: none; }\n .summaryBar { gap: 6px; padding: 8px 10px; }\n .observedAt { flex-basis: 100%; margin-left: 0; }\n}\n\n/* ── LSP status states (reuse the MCP pill/accent palette) ──────────────── */\n.statemounted {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, rgb(230, 250, 237));\n}\n.statehost-missing {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231));\n}\n.stateconflict {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n}\n.statusmounted {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n.statushost-missing {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n}\n.statusconflict {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n.cardMounted { border-left: 3px solid var(--dsw-alias-state-success-primary, #16a34a); }\n.cardHostMissing { border-left: 3px solid var(--dsw-alias-state-warn-primary, #b45309); }\n.cardConflict { border-left: 3px solid var(--dsw-alias-state-error-primary, #dc2626); }\n.chipmounted { background: var(--dsw-alias-state-success-tertiary, rgb(230, 250, 237)); }\n.chipblocked { background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231)); }\n\n/* ── Panel polish: spacing between header/summary/toolbar, compact rows ─── */\n.summaryBar + .toolbar,\n.toolbar {\n margin-top: 12px;\n}\n.header + .summaryBar {\n margin-top: 12px;\n}\n\n/* Hide the entire summary bar when every row is healthy: the green\n \"all good\" confirmation repeated above a green-stamped list is noise. */\n@media (prefers-reduced-data: no-preference) {\n /* no-op block keeps the section marker above meaningful rules only */\n}\n\n/* Compact list mode: one-line rows (state · name · meta pill on the right). */\n.list .card {\n min-height: 0;\n padding: 2px 0;\n}\n.list .cardBody {\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: 12px;\n padding: 8px 14px;\n}\n.list .cardTop {\n flex: 0 1 300px;\n min-width: 0;\n}\n.list .endpoint {\n flex: 1 1 240px;\n max-height: 22px;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n/* LSP extension-map rows: no index column — extension gets room to breathe. */\n.extRow {\n display: grid;\n grid-template-columns: minmax(64px, auto) 20px minmax(0, 1fr);\n gap: 10px;\n align-items: center;\n padding: 7px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n}\n.extRow:last-child { border-bottom: none; }\n.extName { color: var(--dsw-alias-label-primary, #1f2328); font: 12px/18px ui-monospace, Menlo, Consolas, monospace; }\n.extArrow { color: var(--dsw-alias-label-tertiary, #8b93a1); }\n.extLanguage { overflow: hidden; color: var(--dsw-alias-label-tertiary, #8b93a1); text-overflow: ellipsis; white-space: nowrap; font: 12px/18px ui-monospace, Menlo, Consolas, monospace; }\n\n/* ── Detail-dialog retry control: spinner + in-place outcome echo ────── */\n.retryStack {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n margin-right: 4px;\n}\n.retrySpinner {\n display: inline-flex;\n font-size: 13px;\n line-height: 1;\n}\n.spinning {\n animation: mcp-retry-spin 0.9s linear infinite;\n}\n@keyframes mcp-retry-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n@media (prefers-reduced-motion: reduce) {\n .spinning { animation: none; }\n}\n.retryEchoSuccess,\n.retryEchoFailure {\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n}\n.retryEchoSuccess { color: var(--dsw-alias-state-success-primary, #16a34a); }\n.retryEchoFailure { color: var(--dsw-alias-state-error-primary, #dc2626); }\n.statusstarting {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n animation: lspStartingPulse 1.2s ease-in-out infinite;\n}\n@keyframes lspStartingPulse {\n 50% { opacity: 0.35; }\n}\n\n.statusforeign { background: var(--dsw-alias-brand-primary, #4f6ef7); }\n\n.cardForeign { border-left: 3px solid var(--dsw-alias-brand-primary, #4f6ef7); }\n\n.reasonRaw {\n margin: 6px 0 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n line-height: 1.5;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n word-break: break-all;\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { createElement as h } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { Translate } from './index.js'\nimport { fetchMcpStatus, reauthorizeMcpServer, retryMcpMounts, type McpStatusEntry, type McpStatusPayload } from './api.js'\nimport type { CredentialApi } from './credentials.js'\nimport { McpCredentialEditor } from './McpCredentialEditor.js'\nimport { SearchFilterToolbar, type SearchFilterToolbarView } from './SearchFilterToolbar.js'\nimport { deriveMcpStatusViewModel, type McpStatusFilter } from './features/mcp-status/mcp-status-view-model.js'\nimport css from './mcp-status.module.css'\n\ninterface McpStatusPanelProps {\n t: Translate\n credentials?: CredentialApi\n}\n\ntype Filter = McpStatusFilter\ntype ViewMode = SearchFilterToolbarView\n\nconst EMPTY_STATUS: McpStatusPayload = {\n entries: [],\n observedAt: '',\n totals: { all: 0, connected: 0, degraded: 0, failed: 0, needsCredentials: 0, orphaned: 0, disabled: 0, foreign: 0 },\n directObservationOnly: true\n}\n\n/** DSH-native MCP inventory with a per-state overview and per-service detail. */\nexport function McpStatusPanel({ t, credentials }: McpStatusPanelProps): ReactNode {\n const [payload, setPayload] = useState<McpStatusPayload>(EMPTY_STATUS)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | undefined>(undefined)\n const [filter, setFilter] = useState<Filter>('all')\n const [search, setSearch] = useState('')\n const [view, setView] = useState<ViewMode>('grid')\n const [selected, setSelected] = useState<McpStatusEntry | undefined>(undefined)\n\n const retry = (entryId: string): Promise<boolean> => {\n return retryMcpMounts()\n .then(async () => {\n // The POST only acknowledges that a reconcile ran; the mount's real\n // verdict arrives in the refreshed status, so the outcome echo reads\n // the state instead of trusting the request.\n const refreshed = await fetchMcpStatus().catch(() => undefined)\n if (refreshed !== undefined) setPayload(refreshed)\n return refreshed?.entries.some(entry => entry.id === entryId && entry.state === 'connected') === true\n })\n .catch(async caught => {\n setError(caught instanceof Error ? caught.message : String(caught))\n // Still re-read: the failure may be transport-level while the mount\n // actually settled; the echo follows the observed state.\n const refreshed = await fetchMcpStatus().catch(() => undefined)\n if (refreshed !== undefined) setPayload(refreshed)\n return refreshed?.entries.some(entry => entry.id === entryId && entry.state === 'connected') === true\n })\n .finally(() => setLoading(false))\n }\n const reauthorize = (serverName: string): Promise<void> => {\n return reauthorizeMcpServer(serverName)\n .then(() => retryMcpMounts())\n .then(async () => {\n await new Promise(resolve => setTimeout(resolve, 500))\n const refreshed = await fetchMcpStatus().catch(() => undefined)\n if (refreshed !== undefined) setPayload(refreshed)\n })\n }\n\n const refresh = (): void => {\n setLoading(true)\n setError(undefined)\n fetchMcpStatus()\n .then(setPayload)\n .catch(caught => {\n setError(caught instanceof Error ? caught.message : String(caught))\n })\n .finally(() => setLoading(false))\n }\n\n useEffect(() => {\n refresh()\n }, [])\n\n const viewModel = deriveMcpStatusViewModel(payload, filter, search)\n const { activeEntries, filtered, filterCounts, visibleTotals } = viewModel\n // Hide the summary bar entirely while every active row is connected: the\n // green confirmation above an all-green list is noise, not information.\n const allHealthy = activeEntries.length > 0 && visibleTotals.connected === activeEntries.length\n\n return h(\n 'div',\n { className: css.surface },\n h(\n 'header',\n { className: css.header },\n h(\n 'div',\n { className: css.headerText },\n h('h2', { className: css.title }, t('mcpStatusTitle')),\n h('p', { className: css.subtitle }, t('mcpStatusSubtitle'))\n ),\n h(\n 'div',\n { className: css.headerActions },\n h(Button, { variant: 'ghost', size: 'sm', onClick: refresh, disabled: loading, title: t('refresh') }, `↻ ${t('refresh')}`)\n )\n ),\n activeEntries.length === 0 || allHealthy || loading\n ? null\n : h(StatusSummaryBar, { t, totals: visibleTotals, observedAt: payload.observedAt }),\n h(SearchFilterToolbar, {\n className: css.toolbar,\n search,\n searchLabel: t('mcpSearch'),\n searchPlaceholder: t('mcpSearch'),\n onSearchChange: setSearch,\n filters: (['all', 'plugin', 'direct'] as Filter[]).map(kind => ({\n id: kind,\n label: filterLabel(t, kind),\n count: filterCounts[kind],\n icon: h(McpFilterIcon, { kind }),\n active: filter === kind,\n onSelect: () => setFilter(kind),\n hint: mcpFilterHint(t, kind)\n })),\n view,\n gridLabel: t('grid'),\n listLabel: t('list'),\n onViewChange: nextView => setView(nextView)\n }),\n error !== undefined\n ? h('div', { className: css.error }, error, h(Button, { variant: 'ghost', size: 'sm', onClick: refresh }, t('mcpRetry')))\n : loading && activeEntries.length === 0\n ? h('div', { className: css.empty }, t('loading'))\n : filtered.length === 0\n ? h('div', { className: css.empty }, t('mcpEmpty'))\n : h(\n 'div',\n { className: view === 'grid' ? css.grid : css.list },\n filtered.map(entry => h(McpCard, { key: entry.id, entry, t, onClick: () => setSelected(entry) }))\n ),\n selected === undefined ? null : h(McpDetailModal, { entry: selected, t, credentials, onClose: () => setSelected(undefined), onRetry: retry, onReauthorize: reauthorize })\n )\n}\n\n/**\n * One chip per non-healthy state, shown only when that state is non-zero.\n *\n * The chips are ordered by severity so the first one the eye lands on is the\n * state that most needs attention, and the whole bar collapses to a single\n * \"all connected\" confirmation when nothing is wrong.\n */\nfunction StatusSummaryBar({ t, totals, observedAt }: { t: Translate; totals: McpStatusPayload['totals']; observedAt: string }): ReactNode {\n const chips: Array<{ key: string; count: number; label: string }> = [\n { key: 'orphaned', count: totals.orphaned, label: t('mcpOrphaned') },\n { key: 'failed', count: totals.failed, label: t('mcpFailed') },\n { key: 'needsCredentials', count: totals.needsCredentials, label: t('mcpNeedsCredentials') },\n { key: 'degraded', count: totals.degraded, label: t('mcpDegraded') },\n { key: 'foreign', count: totals.foreign, label: t('mcpForeign') },\n { key: 'disabled', count: totals.disabled, label: t('mcpDisabled') }\n ].filter(chip => chip.count > 0)\n\n return h(\n 'div',\n { className: css.summaryBar },\n chips.length === 0\n ? h('span', { className: css.summaryAllGood }, h('span', { className: css.summaryDotGreen }), t('mcpAllConnected'))\n : chips.map(chip =>\n h(\n 'span',\n { key: chip.key, className: `${css.summaryChip} ${css[`chip${chip.key}`]}`, title: `${chip.count} ${chip.label}` },\n h('span', { className: css[`summaryDot${dotTone(chip.key)}`] }),\n h('span', { className: css.summaryCount }, chip.count),\n h('span', { className: css.summaryLabel }, chip.label)\n )\n ),\n h('span', { className: css.observedAt }, observedAt === '' ? '' : formatObservedAt(observedAt))\n )\n}\n\nfunction dotTone(key: string): string {\n if (key === 'foreign') return 'Info'\n if (key === 'degraded' || key === 'needsCredentials') return 'Warn'\n return 'Red'\n}\n\nfunction formatObservedAt(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return ''\n return date.toLocaleTimeString()\n}\n\nfunction McpCard({ entry, t, onClick }: { entry: McpStatusEntry; t: Translate; onClick: () => void }): ReactNode {\n const interactive = { role: 'button' as const, tabIndex: 0, onClick, onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n // Enter and Space activate a role=\"button\" the same way a native one does.\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n onClick()\n } }\n return h(\n 'div',\n { className: `${css.card} ${css[`card${stateClass(entry.state)}`]}`, ...interactive },\n h(\n 'div',\n { className: css.cardBody },\n h(\n 'div',\n { className: css.cardTop },\n h('span', { className: `${css.statusDot} ${css[`status${entry.state}`]}`, 'aria-hidden': true }),\n h('span', { className: css.service }, h('span', { className: css.name }, entry.name)),\n h('span', { className: css.toolCount }, entry.tools.length === 1 ? `${entry.tools.length} ${t('mcpTool')}` : `${entry.tools.length} ${t('mcpTools')}`)\n ),\n h('p', { className: css.endpoint }, entry.endpoint ?? t('mcpObservedEndpoint'))\n // Reason text, the state pill, and every action (retry, configure,\n // details) live in the detail dialog: the card keeps only the identity\n // line and the endpoint, so a wall of red cards stays scannable.\n )\n )\n}\n\nfunction stateClass(state: string): string {\n return state\n .split('-')\n .map((part, index) => (index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))\n .join('')\n .replace(/^./, char => char.toUpperCase())\n}\n\nfunction McpSourceIcon({ kind }: { kind: 'plugin' | 'direct' }): ReactNode {\n const common = { width: 14, height: 14, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n return kind === 'plugin'\n ? h(\n 'svg',\n common,\n h('path', {\n d: 'M6 2.5v2H4A1.5 1.5 0 0 0 2.5 6v2h2a1.5 1.5 0 1 1 0 3h-2v2A1.5 1.5 0 0 0 4 14.5h2v-2a1.5 1.5 0 1 1 3 0v2h2a1.5 1.5 0 0 0 1.5-1.5v-2h-2a1.5 1.5 0 1 1 0-3h2V6A1.5 1.5 0 0 0 11 4.5H9v-2a1.5 1.5 0 1 0-3 0Z'\n })\n )\n : h('svg', common, h('circle', { cx: 8, cy: 5, r: 2.2 }), h('path', { d: 'M3.5 13c.6-2.2 2.1-3.3 4.5-3.3s3.9 1.1 4.5 3.3' }))\n}\n\nfunction McpFilterIcon({ kind }: { kind: Filter }): ReactNode {\n if (kind === 'plugin') return h(McpSourceIcon, { kind: 'plugin' })\n if (kind === 'direct') return h(McpSourceIcon, { kind: 'direct' })\n return h(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true },\n h('path', { d: 'M2.5 5 8 2.5 13.5 5 8 7.5 2.5 5Zm0 3L8 10.5 13.5 8M2.5 11 8 13.5 13.5 11' })\n )\n}\n\n/**\n * The detail dialog owns every action and every long text: state, reason,\n * credentials, config, tools, and the retry control with its in-place result\n * echo. The state pill is dropped entirely — the dot and the reason box carry\n * that information without a second red stamp.\n */\nfunction McpDetailModal({ entry, t, credentials, onClose, onRetry, onReauthorize }: {\n entry: McpStatusEntry\n t: Translate\n credentials?: CredentialApi\n onClose: () => void\n onRetry: (entryId: string) => Promise<boolean>\n onReauthorize: (serverName: string) => Promise<void>\n}): ReactNode {\n const [retrying, setRetrying] = useState(false)\n const [retryOutcome, setRetryOutcome] = useState<'success' | 'failure' | undefined>(undefined)\n const [reauthorizing, setReauthorizing] = useState(false)\n const [reauthOutcome, setReauthOutcome] = useState<'success' | 'failure' | undefined>(undefined)\n const retry = (): void => {\n setRetrying(true)\n setRetryOutcome(undefined)\n onRetry(entry.id)\n .then(success => setRetryOutcome(success ? 'success' : 'failure'))\n .catch(() => setRetryOutcome('failure'))\n .finally(() => setRetrying(false))\n }\n const reauthorize = (): void => {\n setReauthorizing(true)\n setReauthOutcome(undefined)\n onReauthorize(entry.name)\n .then(() => setReauthOutcome('success'))\n .catch(() => setReauthOutcome('failure'))\n .finally(() => setReauthorizing(false))\n }\n return h(Modal, {\n open: true,\n onClose,\n title: entry.name,\n description: t('mcpServiceDetail'),\n closeLabel: t('cancel'),\n className: css.detailDialog,\n contentClassName: css.detailBody,\n footer: h(\n 'div',\n { className: css.modalFooter },\n entry.kind === 'direct' || entry.state === 'connected' || entry.state === 'disabled' || entry.state === 'foreign'\n ? null\n : h(\n 'span',\n { className: css.retryStack },\n retryOutcome === 'success'\n ? h('span', { className: css.retryEchoSuccess, role: 'status' }, `✓ ${t('mcpRetrySuccess')}`)\n : retryOutcome === 'failure'\n ? h('span', { className: css.retryEchoFailure, role: 'alert' }, `✕ ${t('mcpRetryFailure')}`)\n : null,\n h(\n Button,\n { variant: 'ghost', size: 'sm', disabled: retrying, onClick: retry },\n h('span', { className: retrying ? `${css.retrySpinner} ${css.spinning}` : css.retrySpinner, 'aria-hidden': true }, '↻'),\n retrying ? t('mcpRetrying') : t('mcpRetry')\n )\n ),\n entry.kind === 'plugin'\n ? h(\n 'span',\n { className: css.retryStack },\n reauthOutcome === 'success'\n ? h('span', { className: css.retryEchoSuccess, role: 'status' }, `✓ ${t('mcpReauthSuccess')}`)\n : reauthOutcome === 'failure'\n ? h('span', { className: css.retryEchoFailure, role: 'alert' }, `✕ ${t('mcpReauthFailure')}`)\n : null,\n h(\n Button,\n { variant: 'ghost', size: 'sm', disabled: reauthorizing, title: entry.state === 'failed' ? t('mcpConnectHint') : t('mcpReauthHint'), onClick: reauthorize },\n reauthorizing ? t('mcpReauthorizing') : entry.state === 'failed' ? t('mcpConnect') : t('mcpReauthorize')\n )\n )\n : null,\n h(Button, { variant: 'ghost', onClick: onClose }, t('cancel'))\n ),\n children: h(\n 'div',\n { className: css.detail },\n h(\n 'div',\n { className: css.detailHero },\n h('span', { className: `${css.statusDot} ${css[`status${entry.state}`]}`, 'aria-hidden': true }),\n h(\n 'div',\n { className: css.detailHeroText },\n entry.endpoint === undefined ? null : h('p', { className: css.detailEndpoint }, entry.endpoint),\n // Source and transport moved here from the card meta row.\n h('p', { className: css.detailEndpoint }, [\n entry.kind === 'plugin' ? `${t('mcpPlugin')}: ${entry.source ?? '—'}` : t('mcpDirect'),\n entry.transport\n ].join(' · '))\n )\n ),\n // A foreign mount is informational: the localized hint replaces the raw\n // English reason, which drops to a dim secondary line for its tool names.\n entry.state === 'foreign'\n ? h(\n 'div',\n { className: css.reasonBox },\n h('span', { className: css.reasonLabel }, t('mcpReasonLabel')),\n h('p', { className: css.reasonText }, t('mcpForeignHint')),\n entry.reason === undefined ? null : h('p', { className: css.reasonRaw }, entry.reason)\n )\n : entry.reason === undefined\n ? null\n : h(\n 'div',\n { className: css.reasonBox },\n h('span', { className: css.reasonLabel }, t('mcpReasonLabel')),\n h('p', { className: css.reasonText }, entry.reason)\n ),\n entry.kind === 'direct' ? h('div', { className: css.reasonBox }, h('p', { className: css.reasonText }, t('mcpDirectBoundary'))) : null,\n entry.credentialRefs?.length === 0 || entry.credentialRefs === undefined ? null : h(McpCredentialEditor, { t, api: credentials, refs: entry.credentialRefs }),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, t('mcpConfig')),\n entry.config === undefined\n ? h('div', { className: css.detailEmpty }, t('mcpDirectConfigUnavailable'))\n : h('pre', { className: css.config }, JSON.stringify(entry.config, null, 2))\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('mcpTools')} (${entry.tools.length})`),\n entry.tools.length === 0\n ? h('div', { className: css.detailEmpty }, entry.advertisedTools === false && entry.state === 'degraded' ? t('mcpZeroTools') : t('mcpNoTools'))\n : h(\n 'div',\n { className: css.toolList },\n entry.tools.map(tool =>\n h(\n 'div',\n { key: tool.name, className: css.tool },\n h('span', { className: css.toolName }, tool.name),\n tool.description === undefined || tool.description === '' ? null : h('span', { className: css.toolDescription }, tool.description)\n )\n )\n )\n )\n )\n })\n}\n\nfunction filterLabel(t: Translate, kind: Filter): string {\n if (kind === 'plugin') return t('mcpPlugin')\n if (kind === 'direct') return t('mcpDirect')\n return t('mcpAll')\n}\n\n/** Hover/aria explanation for each MCP filter tab. */\nfunction mcpFilterHint(t: Translate, kind: Filter): string {\n if (kind === 'plugin') return t('mcpFilterPluginHint')\n if (kind === 'direct') return t('mcpFilterDirectHint')\n return t('mcpFilterAllHint')\n}\n\n","/**\n * LSP status panel: declared language servers of enabled suites with their\n * mount state. Rows come from the declaration-and-diagnostic model — the DSH\n * `ctx.lsp` seam has no provider snapshot, so \"mounted\" means the mount\n * registration succeeded, not that a process probe ran.\n *\n * Visual language mirrors McpStatusPanel: the same shared SearchFilterToolbar,\n * the same summary chips, cards, and state pills from mcp-status.module.css.\n * Cards stay lean (state dot + name + command + one state pill); the source\n * suite and the full extension map live in the detail dialog.\n */\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { createElement as h } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { Translate } from './index.js'\nimport { fetchLspServers, fetchLspStatus, saveLspServers, type LspStatusEntry, type LspStatusPayload, type LspStatusState } from './api.js'\nimport { SearchFilterToolbar, type SearchFilterToolbarView } from './SearchFilterToolbar.js'\nimport css from './mcp-status.module.css'\n\ninterface LspStatusPanelProps {\n t: Translate\n}\n\nconst EMPTY_STATUS: LspStatusPayload = {\n entries: [],\n observedAt: '',\n totals: { all: 0, mounted: 0, failed: 0, blocked: 0, disabled: 0 },\n hostMissing: true\n}\n\ntype Filter = 'all' | 'plugin' | 'direct' | 'blocked'\n\nconst FILTER_KEYS: Filter[] = ['all', 'plugin', 'direct', 'blocked']\n\nconst FILTER_LABEL_KEYS: Record<Filter, 'lspAll' | 'lspPlugin' | 'lspDirect' | 'lspBlocked'> = {\n all: 'lspAll',\n plugin: 'lspPlugin',\n direct: 'lspDirect',\n blocked: 'lspBlocked'\n}\n\n/** Tooltip text per filter: the counts alone do not explain the grouping. */\nconst FILTER_HINT_KEYS: Partial<Record<Filter, 'lspFilterAllHint' | 'lspFilterPluginHint' | 'lspFilterDirectHint' | 'lspFilterBlockedHint'>> = {\n all: 'lspFilterAllHint',\n plugin: 'lspFilterPluginHint',\n direct: 'lspFilterDirectHint',\n blocked: 'lspFilterBlockedHint'\n}\nfunction matches(entry: LspStatusEntry, filter: Filter): boolean {\n if (filter === 'all') return true\n if (filter === 'plugin' || filter === 'direct') return entry.kind === filter\n return entry.state === 'host-missing' || entry.state === 'conflict' || entry.state === 'failed'\n}\n\nfunction severity(entry: LspStatusEntry): number {\n if (entry.state === 'failed') return 0\n if (entry.state === 'conflict') return 1\n if (entry.state === 'host-missing') return 2\n if (entry.state === 'starting') return 3\n if (entry.state === 'disabled') return 4\n return 5\n}\n\n/** Language-server inventory with per-state overview and per-server detail. */\nexport function LspStatusPanel({ t }: LspStatusPanelProps): ReactNode {\n const [payload, setPayload] = useState<LspStatusPayload>(EMPTY_STATUS)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | undefined>(undefined)\n const [filter, setFilter] = useState<Filter>('all')\n const [search, setSearch] = useState('')\n const [view, setView] = useState<SearchFilterToolbarView>('grid')\n const [selected, setSelected] = useState<LspStatusEntry | undefined>(undefined)\n const [editorOpen, setEditorOpen] = useState(false)\n\n const refresh = (): void => {\n setLoading(true)\n setError(undefined)\n fetchLspStatus()\n .then(setPayload)\n .catch(caught => {\n setError(caught instanceof Error ? caught.message : String(caught))\n })\n .finally(() => setLoading(false))\n }\n\n useEffect(() => {\n refresh()\n }, [])\n\n // Startup follows a race: the reconciler mounts LSP servers in the host\n // process after discovery, so an early read can observe `starting` rows.\n // Poll quietly until every row settles (or the window closes) instead of\n // freezing a stale verdict on screen.\n const anyStarting = payload.entries.some(entry => entry.state === 'starting')\n useEffect(() => {\n if (!anyStarting) return\n let cancelled = false\n let attempts = 0\n const timer = setInterval(() => {\n attempts += 1\n if (cancelled || attempts > 20) {\n clearInterval(timer)\n return\n }\n fetchLspStatus()\n .then(value => {\n if (!cancelled) setPayload(value)\n })\n .catch(() => {})\n }, 1_000)\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [anyStarting])\n\n const needle = search.trim().toLowerCase()\n const counts = FILTER_KEYS.reduce<Record<string, number>>((acc, key) => {\n acc[key] = payload.entries.filter(entry => matches(entry, key)).length\n return acc\n }, {})\n const visible = payload.entries\n .filter(entry => matches(entry, filter))\n .filter(entry => needle === '' || `${entry.serverKey} ${entry.suiteName} ${entry.command}`.toLowerCase().includes(needle))\n const settled = payload.entries.filter(entry => entry.state !== 'starting')\n const allHealthy = settled.length > 0 && settled.every(entry => entry.state === 'mounted')\n\n return h(\n 'div',\n { className: css.surface },\n h(\n 'header',\n { className: css.header },\n h(\n 'div',\n { className: css.headerText },\n h('h2', { className: css.title }, t('lspStatusTitle')),\n h('p', { className: css.subtitle }, t('lspStatusSubtitle'))\n ),\n h(\n 'div',\n { className: css.headerActions },\n h(Button, { variant: 'ghost', size: 'sm', onClick: () => setEditorOpen(true), disabled: loading, title: t('lspConfigure') }, t('lspConfigure')),\n h(Button, { variant: 'ghost', size: 'sm', onClick: refresh, disabled: loading, title: t('refresh') }, `↻ ${t('refresh')}`)\n )\n ),\n // The summary bar appears only when attention is needed; a healthy panel\n // is silent (the green card accents already say \"mounted\").\n allHealthy || payload.entries.length === 0 || loading\n ? null\n : h(\n 'div',\n { className: css.summaryBar },\n payload.hostMissing\n ? h('span', { className: `${css.summaryChip} ${css.chipblocked}`, title: t('lspHostMissing') }, t('lspHostMissingShort'))\n : ([\n { key: 'failed', count: payload.totals.failed, label: t('lspFailed') },\n { key: 'blocked', count: payload.totals.blocked, label: t('lspBlocked') },\n { key: 'disabled', count: payload.totals.disabled, label: t('lspDisabled') }\n ] as Array<{ key: string; count: number; label: string }>)\n .filter(chip => chip.count > 0)\n .map(chip =>\n h(\n 'span',\n { key: chip.key, className: `${css.summaryChip} ${css[`chip${chip.key}`]}`, title: `${chip.count} ${chip.label}` },\n h('span', { className: css.summaryCount }, chip.count),\n h('span', { className: css.summaryLabel }, chip.label)\n )\n ),\n h('span', { className: css.observedAt }, formatObservedAt(payload.observedAt))\n ),\n h(SearchFilterToolbar, {\n className: css.toolbar,\n search,\n searchLabel: t('lspSearch'),\n searchPlaceholder: t('lspSearch'),\n onSearchChange: setSearch,\n filters: FILTER_KEYS.map(key => ({\n id: key,\n label: t(FILTER_LABEL_KEYS[key]),\n count: counts[key] ?? 0,\n icon: h(LspFilterIcon, { k: key }),\n active: filter === key,\n onSelect: () => setFilter(key),\n hint: FILTER_HINT_KEYS[key] === undefined ? undefined : t(FILTER_HINT_KEYS[key]!)\n })),\n view,\n gridLabel: t('grid'),\n listLabel: t('list'),\n onViewChange: nextView => setView(nextView)\n }),\n error !== undefined\n ? h('div', { className: css.error }, error, h(Button, { variant: 'ghost', size: 'sm', onClick: refresh }, t('mcpRetry')))\n : loading && payload.entries.length === 0\n ? h('div', { className: css.empty }, t('loading'))\n : visible.length === 0\n ? h('div', { className: css.empty }, t('lspEmpty'))\n : h(\n 'div',\n { className: view === 'grid' ? css.grid : css.list },\n [...visible].sort((left, right) => severity(left) - severity(right)).map(entry => h(LspRow, { key: entry.id, entry, t, onOpen: () => setSelected(entry) }))\n ),\n selected === undefined ? null : h(LspDetailModal, { entry: selected, t, onClose: () => setSelected(undefined) }),\n editorOpen\n ? h(LspConfigEditor, {\n t,\n onClose: () => setEditorOpen(false),\n onSaved: () => {\n setEditorOpen(false)\n refresh()\n }\n })\n : null\n )\n}\n\n/**\n * Direct LSP configuration editor: one JSON document shaped like Claude\n * Code's `lspServers` table. The host validates with the same fail-closed\n * rules as suite declarations and mounts direct servers on the next\n * reconcile pass.\n */\nfunction LspConfigEditor({ t, onClose, onSaved }: { t: Translate; onClose: () => void; onSaved: () => void }): ReactNode {\n const [text, setText] = useState<string | undefined>(undefined)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | undefined>(undefined)\n\n useEffect(() => {\n let cancelled = false\n fetchLspServers()\n .then(servers => {\n if (cancelled) return\n setText(JSON.stringify({ lspServers: servers }, null, 2))\n })\n .catch(reason => {\n if (cancelled) setError(reason instanceof Error ? reason.message : String(reason))\n })\n return () => {\n cancelled = true\n }\n }, [])\n\n const save = async (): Promise<void> => {\n setBusy(true)\n setError(undefined)\n try {\n const parsed: unknown = JSON.parse(text ?? '')\n await saveLspServers(parsed)\n onSaved()\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setBusy(false)\n }\n }\n\n return h(Modal, {\n open: true,\n onClose,\n title: t('lspConfigure'),\n description: t('lspConfigureHint'),\n closeLabel: t('cancel'),\n className: css.detailDialog,\n contentClassName: css.detailBody,\n footer: h(\n 'div',\n { className: css.modalFooter },\n h(Button, { variant: 'ghost', onClick: onClose }, t('cancel')),\n h(Button, { variant: 'primary', disabled: busy || text === undefined, onClick: () => { void save() } }, t('lspSave'))\n ),\n children: h(\n 'div',\n { className: css.detail },\n error === undefined ? null : h('div', { className: css.error }, error),\n text === undefined\n ? h('div', { className: css.empty }, t('loading'))\n : h('textarea', {\n className: css.config,\n rows: 16,\n spellcheck: false,\n value: text,\n onChange: (event: { target: { value: string } }) => setText(event.target.value)\n })\n )\n })\n}\n\n/** Lean row: state dot, server key, command. The card accent + status dot\n * carry the state; no redundant pill for the healthy case. Kind badge shows\n * where the declaration comes from (suite vs user configuration). */\nfunction LspRow({ entry, t, onOpen }: { entry: LspStatusEntry; t: Translate; onOpen: () => void }): ReactNode {\n const interactive = {\n role: 'button' as const,\n tabIndex: 0,\n onClick: onOpen,\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n onOpen()\n }\n }\n const showPill = entry.state !== 'mounted'\n return h(\n 'div',\n { className: `${css.card} ${css[`card${accentClass(entry.state)}`]}`, ...interactive },\n h(\n 'div',\n { className: css.cardBody },\n h(\n 'div',\n { className: css.cardTop },\n h('span', { className: `${css.statusDot} ${css[`status${dotClass(entry.state)}`]}`, 'aria-hidden': true }),\n h('span', { className: css.service }, h('span', { className: css.name }, entry.serverKey)),\n entry.kind === 'plugin'\n ? h('span', { className: css.sourcePlugin }, entry.suiteName)\n : h('span', { className: css.sourceDirect }, t('lspDirect')),\n showPill ? h('span', { className: `${css.statePill} ${css[`state${pillClass(entry.state)}`]}` }, stateLabel(t, entry.state)) : null\n ),\n h('p', { className: css.endpoint }, [entry.command, ...entry.args].join(' '))\n )\n )\n}\n\nfunction LspDetailModal({ entry, t, onClose }: { entry: LspStatusEntry; t: Translate; onClose: () => void }): ReactNode {\n const extensions = Object.entries(entry.extensions)\n return h(Modal, {\n open: true,\n onClose,\n title: entry.serverKey,\n description: t('lspDetailSubtitle'),\n closeLabel: t('cancel'),\n className: css.detailDialog,\n contentClassName: css.detailBody,\n footer: h('div', { className: css.modalFooter }, h(Button, { variant: 'ghost', onClick: onClose }, t('cancel'))),\n children: h(\n 'div',\n { className: css.detail },\n h(\n 'div',\n { className: css.detailHero },\n h('span', { className: `${css.statusDot} ${css[`status${dotClass(entry.state)}`]}`, 'aria-hidden': true }),\n h(\n 'div',\n { className: css.detailHeroText },\n // The status dot carries the healthy verdict; only non-healthy\n // states get an explicit pill.\n entry.state === 'mounted' ? null : h('span', { className: `${css.statePill} ${css[`state${pillClass(entry.state)}`]}` }, stateLabel(t, entry.state)),\n h('p', { className: css.detailEndpoint }, `${entry.suiteName} · ${entry.sourceId}`)\n )\n ),\n entry.reason === undefined\n ? null\n : h(\n 'div',\n { className: css.reasonBox },\n h('span', { className: css.reasonLabel }, t('lspReasonLabel')),\n h('p', { className: css.reasonText }, entry.reason)\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, t('lspDetailCommand')),\n h('pre', { className: css.config }, [entry.command, ...entry.args].join(' '))\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('lspDetailExtensions')} (${extensions.length})`),\n h(\n 'div',\n { className: css.toolList },\n extensions.map(([ext, languageId]) =>\n h(\n 'div',\n { key: ext, className: css.extRow },\n h('span', { className: css.extName }, ext),\n h('span', { className: css.extArrow, 'aria-hidden': true }, '→'),\n h('span', { className: css.extLanguage }, languageId)\n )\n )\n )\n )\n )\n })\n}\n\n/** Filter icons mirroring McpFilterIcon's language: shared glyph shapes for\n * all/plugin/direct so the two panels read as one system, plus a warning\n * triangle for the blocked state. */\nfunction LspFilterIcon({ k }: { k: string }): ReactNode {\n const common = { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n if (k === 'plugin') {\n return h('svg', common, h('path', { d: 'M6 2.5v2H4A1.5 1.5 0 0 0 2.5 6v2h2a1.5 1.5 0 1 1 0 3h-2v2A1.5 1.5 0 0 0 4 14.5h2v-2a1.5 1.5 0 1 1 3 0v2h2a1.5 1.5 0 0 0 1.5-1.5v-2h-2a1.5 1.5 0 1 1 0-3h2V6A1.5 1.5 0 0 0 11 4.5H9v-2a1.5 1.5 0 1 0-3 0Z' }))\n }\n if (k === 'direct') {\n return h('svg', common, h('circle', { cx: 8, cy: 5, r: 2.2 }), h('path', { d: 'M3.5 13c.6-2.2 2.1-3.3 4.5-3.3s3.9 1.1 4.5 3.3' }))\n }\n if (k === 'blocked') {\n return h('svg', common, h('path', { d: 'M8 2.5 14 13H2L8 2.5Z', stroke: 'currentColor', strokeLinejoin: 'round' }), h('path', { d: 'M8 6.5v3M8 11.2v.3', stroke: 'currentColor', strokeLinecap: 'round' }))\n }\n return h('svg', common, h('path', { d: 'M2.5 5 8 2.5 13.5 5 8 7.5 2.5 5Zm0 3L8 10.5 13.5 8M2.5 11 8 13.5 13.5 11' }))\n}\n\n/** The card-accent CSS suffix; host-missing uses the warn palette. */\nfunction accentClass(state: LspStatusState): string {\n if (state === 'mounted') return 'Mounted'\n if (state === 'host-missing') return 'HostMissing'\n if (state === 'conflict') return 'Conflict'\n if (state === 'failed') return 'Failed'\n return 'Disabled'\n}\n\n/** The status-dot CSS suffix (lowercase state names in the stylesheet). */\nfunction dotClass(state: LspStatusState): string {\n return state === 'host-missing' ? 'host-missing' : state\n}\n\n/** The state-pill CSS suffix; conflict borrows the failed palette and\n * starting borrows the warn palette. */\nfunction pillClass(state: LspStatusState): string {\n if (state === 'conflict') return 'failed'\n if (state === 'starting') return 'host-missing'\n return state\n}\n\nfunction stateLabel(t: Translate, state: LspStatusState): string {\n if (state === 'mounted') return t('lspMounted')\n if (state === 'starting') return t('lspStarting')\n if (state === 'host-missing') return t('lspHostMissingShort')\n if (state === 'failed') return t('lspFailed')\n if (state === 'conflict') return t('lspConflict')\n return t('lspDisabled')\n}\n\nfunction formatObservedAt(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return ''\n return date.toLocaleTimeString()\n}\n","/**\n * The Agent Plugins Market card on the host's 插件配置 (plugin configuration)\n * tab: the market feature's configuration entry, named after the market\n * itself. Disclosed inside is the MCP enhancement switch — ON (default)\n * mounts suite MCP servers through the market's built-in bridge (OAuth\n * authorization, SSE, browser-leg hold); OFF falls back to the host's\n * `dsh-mcp-client` compatibility client.\n *\n * The switch state is the market's host settings namespace (bound by the\n * client entry), so a flip persists through the host settings document and\n * the node half's namespace watcher remounts the servers. The host client\n * version probe rides the market's own API.\n */\nimport { createElement as h, useCallback, useEffect, useState, type ReactNode } from 'react'\nimport * as primitives from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { McpBackendInfo } from './api.js'\nimport { ToggleSwitch } from './ui/ToggleSwitch.js'\nimport css from './market.module.css'\n\n/** Locale subset the card needs (structural — the host binds the real one). */\ntype CardTranslate = (key: string, params?: Record<string, unknown>) => string\n\n/** The host's disclosure chevron, matching the native cards' glyph exactly. */\nconst chevronIcon = (primitives as unknown as Record<string, unknown>)['IconChevronDownOutline14'] as\n | ((props: { size?: number }) => ReactNode)\n | undefined\n\n/** The bound settings-namespace face the client entry hands the card. */\nexport interface McpEnhanceScopeFace {\n /** Whether the enhancement is on; defaults to true before the first answer. */\n enhanced(): boolean\n /** Whether the host settings document accepts writes. */\n writable(): boolean\n subscribe(listener: () => void): () => void\n setEnhanced(next: boolean): Promise<void>\n /** The persisted download region; `auto` follows the interface language. */\n region(): 'auto' | 'global' | 'china'\n setRegion(next: 'global' | 'china'): Promise<void>\n}\n\nexport interface McpPluginCardProps {\n t: CardTranslate\n scope: McpEnhanceScopeFace\n /** Live host-client probe (availability + version) from the market API. */\n probe: () => Promise<McpBackendInfo>\n}\n\nexport function McpPluginCard({ t, scope, probe }: McpPluginCardProps): ReactNode {\n const [open, setOpen] = useState(false)\n const [, setTick] = useState(0)\n const [probeInfo, setProbeInfo] = useState<McpBackendInfo | undefined>(undefined)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | undefined>(undefined)\n\n useEffect(() => scope.subscribe(() => setTick(tick => tick + 1)), [scope])\n\n const refreshProbe = useCallback(async () => {\n try {\n setProbeInfo(await probe())\n } catch {\n // The version line degrades silently; the switch still works.\n }\n }, [probe])\n\n useEffect(() => { void refreshProbe() }, [refreshProbe])\n\n const enhanced = scope.enhanced()\n const writable = scope.writable()\n const regionSetting = scope.region()\n // The highlighted segment is the route clones actually take: the explicit\n // choice, or the language-resolved one while the setting is still auto.\n const effectiveRegion = probeInfo?.downloadRegion.effective ?? (regionSetting === 'china' ? 'china' : 'global')\n // Compat mode requires the host client to resolve; the enhanced (built-in)\n // client is always available because it ships inside this plugin.\n const hostUsable = probeInfo?.hostClient.available === true\n\n const onToggle = (): void => {\n if (busy || !writable) return\n const next = !enhanced\n if (!next && !hostUsable) {\n setError(t('mcpBackendHostMissing'))\n return\n }\n setBusy(true)\n setError(undefined)\n void scope.setEnhanced(next).then(() => {\n setBusy(false)\n }).catch((cause: unknown) => {\n setError(cause instanceof Error ? cause.message : String(cause))\n setBusy(false)\n })\n }\n\n return h(\n 'div',\n {\n className: open ? `${css.pluginCard} ${css.pluginCardOpen}` : css.pluginCard,\n 'data-busy': busy ? 'true' : undefined\n },\n h(\n 'button',\n {\n type: 'button',\n className: css.pluginCardHeader,\n 'aria-expanded': open,\n onClick: () => { setOpen(current => !current) },\n }, h(\n 'div',\n { className: css.pluginCardText },\n h('div', { className: css.pluginCardTitle }, t('nav')),\n h('div', { className: css.pluginCardDesc }, t('marketCardDesc'))\n ),\n h(\n 'span',\n { className: open ? `${css.pluginChevron} ${css.pluginChevronOpen}` : css.pluginChevron },\n chevronIcon !== undefined ? h(chevronIcon, { size: 14 }) : '▾'\n )\n ),\n open\n ? h(\n 'div',\n { className: css.pluginCardBody },\n h(\n 'div',\n { className: css.pluginCardRow },\n h(\n 'div',\n { className: css.pluginCardText },\n h('div', { className: css.pluginCardRowLabel }, t('mcpCardTitle')),\n h('div', { className: css.pluginCardDesc }, enhanced ? t('mcpCardDescOn') : t('mcpCardDescOff'))\n ),\n h(ToggleSwitch, {\n on: enhanced,\n disabled: busy || !writable,\n title: writable ? undefined : t('mcpCardReadonly'),\n onChange: onToggle\n })\n ),\n error !== undefined\n ? h('div', { className: css.pluginCardError }, error)\n : null,\n h(\n 'div',\n { className: css.pluginCardRow },\n h(\n 'div',\n { className: css.pluginCardText },\n h('div', { className: css.pluginCardRowLabel }, t('regionLabel')),\n h('div', { className: css.pluginCardDesc }, t('regionHint'))\n ),\n h(\n 'div',\n { className: css.regionSeg },\n (['global', 'china'] as const).map(region =>\n h(\n 'button',\n {\n key: region,\n type: 'button',\n disabled: busy || !writable,\n className: effectiveRegion === region ? css.regionSegOn : css.regionSegBtn,\n onClick: () => {\n if (regionSetting === region) return\n setBusy(true)\n setError(undefined)\n void scope.setRegion(region).then(() => {\n setBusy(false)\n }).catch((cause: unknown) => {\n setError(cause instanceof Error ? cause.message : String(cause))\n setBusy(false)\n })\n }\n },\n region === 'global' ? t('regionGlobal') : t('regionChina')\n )\n )\n )\n )\n )\n : null\n )\n}\n","/** Pure capability decision for the legacy page-mode fallback. */\n\n/**\n * Use the DOM page fallback only when the host has no settings page and does\n * expose a page shell for the fallback to mount into.\n *\n * @param settingsSurfaceAvailable - whether `settings.section` is live.\n * @param pageShellAvailable - whether the sidebar/conversation shell exists.\n * @returns true when the fallback is the only available market surface.\n */\nexport function shouldUseLegacyPageMode(settingsSurfaceAvailable: boolean, pageShellAvailable: boolean): boolean {\n return !settingsSurfaceAvailable && pageShellAvailable\n}\n","/**\n * Legacy Web page-mode adapter.\n *\n * Current DSH compositions expose `settings.section`; older compositions that\n * predate that slot can still host a top-level market panel through the DOM\n * shell used by the original page-mode integration. The adapter is deliberately\n * guarded by the live settings-slot state so one composition never renders two\n * market surfaces.\n */\nimport { createElement as h } from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\nimport { MarketSection } from './MarketSection.js'\nimport { shouldUseLegacyPageMode } from './page-mode-selection.js'\nimport type { Translate } from './index.js'\nimport type { CredentialApi } from './credentials.js'\nimport css from './market.module.css'\n\n/** Browser-side inputs required by the legacy page-mode adapter. */\nexport interface LegacyPageModeOptions {\n /** Current namespace-bound translator. */\n t: Translate\n /** Host credentials wire used for write-only MCP env configuration. */\n credentials?: CredentialApi\n /** Whether the host has mounted a live `settings.section` declaration. */\n isSettingsSurfaceAvailable: () => boolean\n /** Optional locale revision subscription supplied by newer hosts. */\n subscribeLocale?: (listener: () => void) => () => void\n}\n\nconst ACTIVE_ATTRIBUTE = 'data-dsh-agent-plugins-market-page'\nconst VIEW_ATTRIBUTE = 'data-dsh-agent-plugins-market-page-view'\nconst ENTRY_ATTRIBUTE = 'data-dsh-agent-plugins-market-entry'\nconst SURFACE_EVENT = 'dsh-agent-plugins-market-settings-surface'\nconst PANEL_EVENT = 'dsh-panel-activate'\nconst PANEL_NAME = 'agent-plugins-market'\n\n/** Notify the page adapter that the settings-slot capability changed. */\nexport const LEGACY_PAGE_MODE_SURFACE_EVENT = SURFACE_EVENT\nconst SIDEBAR_COLUMN_SELECTOR = '[data-pane=\"sidebar\"], [class*=\"sidebarCol\"]'\nconst CONVERSATION_COLUMN_SELECTOR = '[data-pane=\"conversation\"], [class*=\"centerCol\"]'\nconst SIDEBAR_CONTEXT_SELECTOR = '[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]'\n\n/**\n * Mount the page-mode fallback and its sidebar entry.\n *\n * The fallback remains dormant when the settings surface is present. It also\n * remains a no-op in non-browser runtimes or shells that expose neither the\n * sidebar nor the conversation column.\n *\n * @param options - page-mode dependencies and host capability probe.\n * @returns disposer that removes the injected entry, panel, listeners, and\n * active document marker.\n */\nexport function mountLegacyPageMode(options: LegacyPageModeOptions): () => void {\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return () => {}\n\n let stopped = false\n let open = false\n let root: Root | undefined\n let container: HTMLDivElement | undefined\n let entry: HTMLButtonElement | undefined\n let entryLabel: HTMLSpanElement | undefined\n let observer: MutationObserver | undefined\n\n const setActive = (next: boolean): void => {\n open = next\n if (open && !options.isSettingsSurfaceAvailable()) {\n document.documentElement.setAttribute(ACTIVE_ATTRIBUTE, '')\n document.dispatchEvent(new CustomEvent(PANEL_EVENT, { detail: PANEL_NAME }))\n } else {\n document.documentElement.removeAttribute(ACTIVE_ATTRIBUTE)\n }\n }\n\n const removeView = (): void => {\n setActive(false)\n root?.unmount()\n root = undefined\n container?.remove()\n container = undefined\n }\n\n const renderView = (): void => {\n if (root === undefined) return\n root.render(h(MarketSection, { t: options.t, credentials: options.credentials, mode: 'page' }))\n }\n\n const updateEntryCopy = (): void => {\n if (entryLabel === undefined || entry === undefined) return\n const label = options.t('nav')\n entryLabel.textContent = label\n entry.title = label\n entry.setAttribute('aria-label', label)\n }\n\n const ensureView = (): void => {\n if (stopped || options.isSettingsSurfaceAvailable()) {\n removeView()\n return\n }\n const column = conversationColumn()\n if (!shouldUseLegacyPageMode(options.isSettingsSurfaceAvailable(), column !== undefined)) {\n removeView()\n return\n }\n if (column === undefined) return\n if (container !== undefined && container.isConnected) return\n root?.unmount()\n container?.remove()\n container = document.createElement('div')\n container.setAttribute(VIEW_ATTRIBUTE, '')\n container.className = css.pageView\n column.appendChild(container)\n root = createRoot(container)\n renderView()\n }\n\n const ensureEntry = (): void => {\n if (stopped || options.isSettingsSurfaceAvailable()) {\n entry?.remove()\n return\n }\n const rootElement = sidebarRoot()\n const anchor = rootElement === undefined ? undefined : newSessionButton(rootElement)\n if (rootElement === undefined || anchor === undefined || anchor.parentElement === null) return\n if (entry === undefined) {\n entry = createEntry(() => { setActive(!open); ensureView() })\n entryLabel = entry.querySelector<HTMLSpanElement>('[data-dsh-agent-plugins-market-label]') ?? undefined\n updateEntryCopy()\n }\n if (entry.parentElement !== anchor.parentElement || entry.previousSibling !== anchor) {\n anchor.insertAdjacentElement('afterend', entry)\n }\n }\n\n const observeShell = (): void => {\n if (stopped || observer !== undefined || options.isSettingsSurfaceAvailable()) return\n observer = new MutationObserver(ensure)\n observer.observe(document.body ?? document.documentElement, { childList: true, subtree: true })\n }\n\n const stopObservingShell = (): void => {\n observer?.disconnect()\n observer = undefined\n }\n\n const ensure = (): void => {\n if (stopped) return\n if (options.isSettingsSurfaceAvailable()) {\n stopObservingShell()\n removeView()\n entry?.remove()\n return\n }\n observeShell()\n ensureView()\n ensureEntry()\n }\n\n const onLocale = (): void => {\n updateEntryCopy()\n renderView()\n }\n const onSurfaceChange = (): void => { ensure() }\n const unsubscribeLocale = options.subscribeLocale?.(onLocale)\n const onPanelActivate = (event: Event): void => {\n const detail = (event as CustomEvent<string>).detail\n if (detail !== PANEL_NAME && open) setActive(false)\n }\n const onSidebarContextClick = (event: MouseEvent): void => {\n if (!open) return\n const target = event.target\n if (!(target instanceof HTMLElement) || target.closest(SIDEBAR_CONTEXT_SELECTOR) === null) return\n setActive(false)\n }\n\n document.addEventListener(PANEL_EVENT, onPanelActivate)\n document.addEventListener(SURFACE_EVENT, onSurfaceChange)\n document.addEventListener('click', onSidebarContextClick, true)\n queueMicrotask(ensure)\n\n return () => {\n stopped = true\n unsubscribeLocale?.()\n document.removeEventListener(PANEL_EVENT, onPanelActivate)\n document.removeEventListener(SURFACE_EVENT, onSurfaceChange)\n document.removeEventListener('click', onSidebarContextClick, true)\n stopObservingShell()\n entry?.remove()\n removeView()\n }\n}\n\nfunction sidebarRoot(): HTMLElement | undefined {\n const column = document.querySelector<HTMLElement>(SIDEBAR_COLUMN_SELECTOR)\n if (column === null) return undefined\n return column.querySelector<HTMLElement>('[class*=\"logoRow\"]')?.parentElement\n ?? (column.firstElementChild as HTMLElement | null)\n ?? undefined\n}\n\nfunction newSessionButton(root: HTMLElement): HTMLButtonElement | undefined {\n const nested = root.querySelector<HTMLButtonElement>('button[class*=\"newSession\"]')\n if (nested !== null) return nested\n for (const child of root.children) {\n if (child instanceof HTMLButtonElement) return child\n }\n return undefined\n}\n\nfunction conversationColumn(): HTMLElement | undefined {\n return document.querySelector<HTMLElement>(CONVERSATION_COLUMN_SELECTOR) ?? undefined\n}\n\nfunction createEntry(onClick: () => void): HTMLButtonElement {\n const button = document.createElement('button')\n button.type = 'button'\n button.setAttribute(ENTRY_ATTRIBUTE, '')\n button.className = css.pageEntry\n button.innerHTML = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"2\" y=\"2\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"2\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/></svg>'\n const label = document.createElement('span')\n label.dataset.dshAgentPluginsMarketLabel = ''\n button.append(label)\n button.addEventListener('click', onClick)\n return button\n}\n","/**\n * dsh-agent-plugins-market client: registers the Agent Plugins Market section inside the Web\n * GUI's settings page (the same settings.section seat dshmarket uses), with a\n * guarded legacy top-level page fallback for older shells. The bundle's\n * browser externals are React, ReactDOM, and the injected `dsh.client.inject`\n * module table, so it cannot reach packages the host does not serve.\n */\nimport { createElement as h } from 'react'\nimport * as primitives from '@deepseek-ai/dsh-client-ui-primitives'\nimport { fetchMcpBackend } from './api.js'\nimport { en, zh, type LocaleKey } from './locales.js'\nimport { MarketSection } from './MarketSection.js'\nimport { McpStatusPanel } from './McpStatusPanel.js'\nimport { LspStatusPanel } from './LspStatusPanel.js'\nimport { McpPluginCard } from './McpPluginCard.js'\nimport type { CredentialApi } from './credentials.js'\nimport { LEGACY_PAGE_MODE_SURFACE_EVENT, mountLegacyPageMode } from './page-mode.js'\n\nconst NS = 'dsh-agent-plugins-market'\n\nexport type Translate = (key: LocaleKey, params?: Record<string, unknown>) => string\n\n/** The subset of the locale service this plugin touches. */\ninterface LocaleService {\n register(namespace: string, dicts: { zh: Record<string, string>; en: Record<string, string> }): unknown\n bind(namespace: string): Translate\n subscribe?: (listener: () => void) => () => void\n}\n\n/** The subset of the slots service this plugin touches. */\ninterface SlotsService {\n inject(slot: string, register: () => unknown): void\n register(meta: Record<string, unknown>, component: () => unknown): unknown\n}\n\n/** The subset of the host settings-scope service this plugin touches. */\ninterface SettingsScopeService {\n bind(options: { namespace: string }): {\n getSnapshot(): { value?: { mcpEnhanced?: boolean; downloadRegion?: string }; writable: boolean }\n subscribe(listener: () => void): () => void\n set(field: string, value: unknown): Promise<void>\n }\n}\n\n/** The client cordis context this plugin relies on (structural subset). */\ninterface SuiteClientContext {\n effect(callback: () => unknown, label?: string): void\n /** Late service resolution; absent on hosts predating cross-plugin inject. */\n inject?(services: string[], callback: (resolved: Record<string, unknown>) => void): void\n locale: LocaleService\n slots: SlotsService\n connection: { api: { credentials: CredentialApi } }\n}\n\nexport const name = 'dsh-agent-plugins-market'\nexport const inject = ['slots', 'locale', 'connection']\nexport const REQUIRED_PRIMITIVES = ['Button', 'Input', 'Modal', 'Toast', 'Tooltip'] as const\n\n/**\n * Register the MCP enhancement card into the host's shared 插件配置 tab\n * (`settings.plugin.item`), the same seat dshmarket uses. Called through\n * `ctx.inject(['settingsScope'])` at apply time; a host without the\n * settingsScope service simply skips the card.\n */\n\n/** Detect host primitives that predate the exports this UI relies on. */\nexport function missingPrimitives(module: Record<string, unknown>, required: readonly string[] = REQUIRED_PRIMITIVES): string[] {\n return required.filter(name => module[name] === undefined)\n}\n\nexport function apply(ctx: SuiteClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-agent-plugins: dictionaries')\n const t = ctx.locale.bind(NS)\n const credentials = ctx.connection.api.credentials\n\n const gaps = missingPrimitives(primitives as unknown as Record<string, unknown>)\n if (gaps.length > 0) {\n console.warn(`[dsh-agent-plugins-market] host ui-primitives missing ${gaps.join(', ')} — Agent Plugins Market section disabled (dsh web >= 0.1.0-rc.6 required)`)\n return\n }\n\n let settingsSurfaceAvailable = false\n ctx.effect(() => mountLegacyPageMode({\n t,\n credentials,\n isSettingsSurfaceAvailable: () => settingsSurfaceAvailable,\n subscribeLocale: ctx.locale.subscribe === undefined ? undefined : (listener) => ctx.locale.subscribe!(listener),\n }), 'dsh-agent-plugins-market: legacy page mode')\n\n // The host 插件配置 tab card. Registration rides the injected scope's slots\n // (the dshmarket / dsh-rewind pattern), and the card state binds the\n // market's settings namespace — the namespace the node half registers,\n // which is also what makes the tab serve our card at all.\n ctx.inject?.(['settingsScope'], (scoped: { settingsScope?: SettingsScopeService; slots?: SlotsService }) => {\n const service = scoped.settingsScope\n const slots = scoped.slots\n if (service === undefined || slots === undefined) return\n const tCard = ctx.locale.bind(NS)\n const scope = service.bind({ namespace: NS })\n slots.inject('settings.plugin.item', () =>\n slots.register({\n name: 'settings.plugin.item',\n key: NS,\n locale: NS,\n inject: () => ({ t: tCard }),\n }, () => h(McpPluginCard, {\n t: key => tCard(key as LocaleKey),\n scope: {\n enhanced: () => scope.getSnapshot().value?.mcpEnhanced !== false,\n writable: () => scope.getSnapshot().writable,\n subscribe: listener => scope.subscribe(listener),\n setEnhanced: next => scope.set('mcpEnhanced', next),\n region: () => {\n const value = scope.getSnapshot().value?.downloadRegion\n return value === 'global' || value === 'china' ? value : 'auto'\n },\n setRegion: next => scope.set('downloadRegion', next)\n },\n probe: () => fetchMcpBackend(),\n })),\n )\n })\n\n ctx.slots.inject('settings.section', () => {\n settingsSurfaceAvailable = true\n notifyPageModeSurfaceChange()\n const marketDispose = ctx.slots.register({\n name: 'settings.section',\n id: 'agent-plugin',\n order: 45,\n label: () => t('nav'),\n locale: NS,\n inject: () => ({ t }),\n }, () => h(MarketSection, {\n t,\n credentials,\n mode: 'settings',\n }))\n const mcpDispose = ctx.slots.register({\n name: 'settings.section',\n id: 'mcp-status',\n order: 46,\n label: () => t('mcpStatusNav'),\n locale: NS,\n inject: () => ({ t }),\n }, () => h(McpStatusPanel, { t, credentials }))\n const lspDispose = ctx.slots.register({\n name: 'settings.section',\n id: 'lsp-status',\n order: 47,\n label: () => t('lspStatusNav'),\n locale: NS,\n inject: () => ({ t }),\n }, () => h(LspStatusPanel, { t }))\n return () => {\n settingsSurfaceAvailable = false\n notifyPageModeSurfaceChange()\n if (typeof mcpDispose === 'function') mcpDispose()\n if (typeof lspDispose === 'function') lspDispose()\n if (typeof marketDispose === 'function') marketDispose()\n }\n })\n}\n\nfunction notifyPageModeSurfaceChange(): void {\n if (typeof document !== 'undefined') document.dispatchEvent(new Event(LEGACY_PAGE_MODE_SURFACE_EVENT))\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["searchableCache","searchableFor","h","css","useState","h","css","Modal","Button","Input","h","Modal","css","Button","h","css","css","h","Button","Tooltip","h","Component","h","useState","h","css","Button","useMemo","useState","useRef","h","Modal","css","Button","MarkdownText","h","css","Input","useState","useCallback","useMemo","h","css","Button","Toast","Modal","EMPTY_STATUS","useState","h","css","Button","formatObservedAt","Modal","useState","h","css","Button","Modal","primitives","useState","useCallback","h","css","h","css","createRoot","primitives","h"],"sources":["../src/contracts/market.ts","../src/client/api.ts","../src/client/locales.ts","../src/client/features/market/market-resource.ts","../src/client/features/market/market-view-model.ts","../src/client/market.module.css","../src/client/features/market/SourceTab.tsx","../src/client/features/market/SourceEditorModal.tsx","../src/client/features/market/InstallConfirmModal.tsx","../src/client/ui/ToggleSwitch.tsx","../src/client/features/market/SuiteCard.tsx","../src/client/ui/StatusIcon.tsx","../src/client/ErrorBoundary.tsx","../src/client/credentials.ts","../src/client/mcp-credential.module.css","../src/client/McpCredentialEditor.tsx","../src/client/features/suite-detail/suite-detail-resource.ts","../src/client/SuiteDetail.tsx","../src/client/SearchFilterToolbar.module.css","../src/client/SearchFilterToolbar.tsx","../src/client/MarketSection.tsx","../src/client/features/mcp-status/mcp-status-view-model.ts","../src/client/mcp-status.module.css","../src/client/McpStatusPanel.tsx","../src/client/LspStatusPanel.tsx","../src/client/McpPluginCard.tsx","../src/client/page-mode-selection.ts","../src/client/page-mode.tsx","../src/client/index.ts"],"sourcesContent":["/** Browser-safe market wire records and route constants shared by host and client. */\n\n/** Prefix for all Agent Plugins Market HTTP routes. */\nexport const MARKET_API_PREFIX = '/api/agent-plugins/' as const\n\n/** Fixed Agent Plugins Market HTTP routes. */\nexport const MARKET_ROUTES = {\n overview: `${MARKET_API_PREFIX}overview`,\n mcpStatus: `${MARKET_API_PREFIX}mcp-status`,\n lspStatus: `${MARKET_API_PREFIX}lsp-status`,\n lspServers: `${MARKET_API_PREFIX}lsp-servers`,\n progress: `${MARKET_API_PREFIX}progress`,\n config: `${MARKET_API_PREFIX}config`,\n suite: `${MARKET_API_PREFIX}suite`,\n skill: `${MARKET_API_PREFIX}skill`,\n addSource: `${MARKET_API_PREFIX}sources/add`,\n updateSource: `${MARKET_API_PREFIX}sources/update`,\n adoptSource: `${MARKET_API_PREFIX}sources/adopt`,\n removeSource: `${MARKET_API_PREFIX}sources/remove`,\n refreshSource: `${MARKET_API_PREFIX}sources/refresh`,\n install: `${MARKET_API_PREFIX}install`,\n uninstall: `${MARKET_API_PREFIX}uninstall`,\n setEnabled: `${MARKET_API_PREFIX}set-enabled`,\n setSurface: `${MARKET_API_PREFIX}set-surface`,\n mcpOverrides: `${MARKET_API_PREFIX}mcp-overrides`,\n setMcpOverride: `${MARKET_API_PREFIX}set-mcp-override`,\n mcpRetry: `${MARKET_API_PREFIX}mcp-retry`,\n mcpReauthorize: `${MARKET_API_PREFIX}mcp-reauthorize`,\n mcpBackend: `${MARKET_API_PREFIX}mcp-backend`,\n setMcpBackend: `${MARKET_API_PREFIX}set-mcp-backend`\n} as const\n\n/** The MCP mount backend state reported to the settings page. */\nexport interface McpBackendPayload {\n backend: 'builtin' | 'host'\n /** Whether the host `dsh-mcp-client` resolves from the plugin context. */\n hostClient: { available: boolean; version?: string }\n /** Download region: the persisted setting and its locale-resolved route. */\n downloadRegion: { setting: 'auto' | 'global' | 'china'; effective: 'global' | 'china' }\n}\n\n/** One unmanaged `.sources/` checkout the user can adopt as a source. */\nexport interface UnmanagedSource {\n id: string\n /** The checkout's `origin` remote URL; absent for non-git directories. */\n url?: string\n}\n\n/** A configured source row returned to the market client. */\nexport interface SourceOverview {\n id: string\n url: string\n branch?: string\n local?: boolean\n /** Acquisition kind (`git` / `local` / `archive`); `local` mirrors the legacy flag. */\n kind: string\n /** The checkout pre-existed (manually cloned or adopted); never deleted on removal. */\n adopted?: boolean\n cloned: boolean\n lockCommit?: string\n error?: string\n /** Scanner diagnostics for this source (dropped entries, fallbacks taken);\n * absent when the scan completed with no notes. */\n scanNotes?: string[]\n suiteIds: string[]\n}\n\n/** Counts of runtime surfaces displayed on a suite card. */\nexport interface SuiteSurfaceCounts {\n skills: number\n mcp: number\n hooks: number\n commands: number\n agents: number\n lsp: number\n}\n\n/** Effective per-surface enablement of an installed suite. */\nexport interface SuiteSurfaceToggles {\n skills: boolean\n mcp: boolean\n hooks: boolean\n commands: boolean\n agents: boolean\n lsp: boolean\n}\n\n/** One server's persisted MCP override (wire shape mirrors runtime types). */\nexport type McpServerOverrideWire = {\n enabled?: boolean\n url?: string\n headers?: Record<string, string>\n env?: Record<string, string>\n args?: string[]\n}\n\n/** Overrides for one suite keyed by mcp.json server key. */\nexport type McpSuiteOverridesWire = Record<string, McpServerOverrideWire>\n\n/** A normalized suite card returned by the overview route. */\nexport interface SuiteOverviewCard {\n sourceId: string\n suiteId: string\n name: string\n version?: string\n description?: string\n keywords: string[]\n surfaces: SuiteSurfaceCounts\n enabled: boolean\n installed: boolean\n /** Per-surface toggles; present on installed suites only. */\n surfaceToggles?: SuiteSurfaceToggles\n dimension: string\n layout: string\n remoteUrl?: string\n errors: string[]\n mcpErrors?: string[]\n}\n\n/** The market overview response. */\nexport interface OverviewPayload {\n sources: SourceOverview[]\n suites: SuiteOverviewCard[]\n totals: { all: number; installed: number; enabled: number }\n roots: { user: string; data: string }\n /** Unmanaged `.sources/` checkouts (manual clones) available for adoption. */\n unmanaged?: UnmanagedSource[]\n}\n\n/** Host-side progress of the source mutation currently in flight. */\nexport interface SourceProgress {\n active: boolean\n sourceId: string\n step: string\n}\n\n/** One skill's metadata inside a suite detail response. */\nexport interface SuiteSkillMeta {\n name: string\n description: string\n whenToUse?: string\n path: string\n}\n\n/** One command or agent preview in a suite detail response. */\nexport interface MarkdownPreview {\n name: string\n description?: string\n content: string\n}\n\n/** Claude Code command preview alias retained for feature-specific readability. */\nexport type CommandPreview = MarkdownPreview\n/** Claude Code agent preview alias retained for feature-specific readability. */\nexport type AgentPreview = MarkdownPreview\n\n/** One LSP definition preview in a suite detail response. */\nexport interface LspPreview {\n name: string\n content: string\n}\n\n/** One inline-declared LSP server in a suite detail response. */\nexport interface LspServerPreview {\n /** Server key from the declaring `lspServers` table. */\n key: string\n command: string\n args: string[]\n /** Lowercase leading-dot extension → LSP language id. */\n extensions: Record<string, string>\n env?: Record<string, string>\n}\n\n/** The suite's LSP surface: inline-declared servers plus directory definition files. */\nexport interface LspSurfaceDetail {\n servers: LspServerPreview[]\n raw: LspPreview[]\n}\n\n/** One flattened hook entry in a suite detail response. */\nexport interface HookPreview {\n event: string\n matcher?: string\n command: string\n}\n\n/** One validated MCP server detail in a suite detail response. */\nexport interface McpServerDetail {\n key: string\n type: string\n command?: string\n url?: string\n args?: string[]\n env?: Record<string, string>\n cwd?: string\n headers?: Record<string, string>\n /** External credential references used by env/header/argument placeholders. */\n credentialRefs: string[]\n}\n\n/** Full suite detail response served by the detail modal. */\nexport interface SuiteDetail {\n sourceId: string\n suiteId: string\n name: string\n version: string | null\n description: string | null\n author: string | null\n keywords: string[]\n layout: string\n dimension: string\n root: string\n remoteUrl: string | null\n installed: boolean\n enabled: boolean\n surfaceToggles: SuiteSurfaceToggles | null\n /** Persisted per-server MCP overrides (suite's mcp.json stays source-owned). */\n mcpOverrides?: McpSuiteOverridesWire\n skills: SuiteSkillMeta[]\n mcpServers: McpServerDetail[]\n hooks: { count: number; entries: HookPreview[] }\n commands: MarkdownPreview[]\n agents: MarkdownPreview[]\n lsp: LspSurfaceDetail\n errors: string[]\n mcpErrors: string[]\n}\n\n/** One skill's full file text served by the skill route. */\nexport interface SkillContent {\n name: string\n description: string\n content: string\n path: string\n}\n\n/** Build a suite-detail URL without duplicating route or query encoding logic. */\nexport function suiteRoute(sourceId: string, suiteId: string): string {\n return `${MARKET_ROUTES.suite}?sourceId=${encodeURIComponent(sourceId)}&suiteId=${encodeURIComponent(suiteId)}`\n}\n\n/** Build a skill-content URL without duplicating route or query encoding logic. */\nexport function skillRoute(sourceId: string, suiteId: string, skill: string): string {\n return `${MARKET_ROUTES.skill}?sourceId=${encodeURIComponent(sourceId)}&suiteId=${encodeURIComponent(suiteId)}&skill=${encodeURIComponent(skill)}`\n}\n","/** Typed fetch helpers over the host's `/api/agent-plugins/*` routes. */\nimport { MARKET_API_PREFIX, MARKET_ROUTES, skillRoute, suiteRoute } from '../contracts/market.js'\nimport type { OverviewPayload, SkillContent, SourceProgress, SuiteDetail, SuiteOverviewCard } from '../contracts/market.js'\nimport type { McpStatusPayload } from '../contracts/mcp-status.js'\nimport type { LspStatusPayload } from '../contracts/lsp-status.js'\nimport type { LspServerSpec } from '../model/types.js'\n\nexport type {\n AgentPreview,\n HookPreview,\n LspPreview,\n MarkdownPreview,\n McpServerDetail,\n OverviewPayload,\n SkillContent,\n SourceOverview,\n SourceProgress,\n SuiteDetail,\n SuiteOverviewCard,\n SuiteSkillMeta,\n SuiteSurfaceCounts\n} from '../contracts/market.js'\nexport type { McpStatusEntry, McpStatusPayload, McpStatusTool } from '../contracts/mcp-status.js'\nexport type { LspStatusEntry, LspStatusPayload, LspStatusState } from '../contracts/lsp-status.js'\nexport type { LspServerSpec } from '../model/types.js'\n\n/** Client-facing alias retained during migration from the original transport types. */\nexport type OverviewData = OverviewPayload\n/** Client-facing alias retained during migration from the original transport types. */\nexport type SuiteCardData = SuiteOverviewCard\n\nexport async function fetchOverview(): Promise<OverviewData> {\n const response = await fetch(MARKET_ROUTES.overview, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`overview failed: ${response.status}`)\n return response.json() as Promise<OverviewData>\n}\n\nexport async function fetchSourceProgress(): Promise<SourceProgress> {\n const response = await fetch(MARKET_ROUTES.progress, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`progress failed: ${response.status}`)\n return response.json() as Promise<SourceProgress>\n}\n\nexport async function fetchSuiteDetail(sourceId: string, suiteId: string): Promise<SuiteDetail> {\n const response = await fetch(suiteRoute(sourceId, suiteId), { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`suite detail failed: ${response.status}`)\n return response.json() as Promise<SuiteDetail>\n}\n\nexport async function fetchMcpStatus(): Promise<McpStatusPayload> {\n const response = await fetch(MARKET_ROUTES.mcpStatus, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`MCP status failed: ${response.status}`)\n return response.json() as Promise<McpStatusPayload>\n}\n\nexport async function fetchLspStatus(): Promise<LspStatusPayload> {\n const response = await fetch(MARKET_ROUTES.lspStatus, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`LSP status failed: ${response.status}`)\n return response.json() as Promise<LspStatusPayload>\n}\n\n/** The user's direct LSP server table (normalized specs). */\nexport async function fetchLspServers(): Promise<Record<string, LspServerSpec>> {\n const response = await fetch(MARKET_ROUTES.lspServers, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`LSP servers failed: ${response.status}`)\n const body = (await response.json()) as { lspServers?: Record<string, LspServerSpec> }\n return body.lspServers ?? {}\n}\n\n/** Validate and persist the user's direct LSP server table. */\nexport async function saveLspServers(lspServers: unknown): Promise<Record<string, LspServerSpec>> {\n const response = await fetch(MARKET_ROUTES.lspServers, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ lspServers })\n })\n const body = (await response.json()) as { ok?: boolean; error?: string; lspServers?: Record<string, LspServerSpec> }\n if (!response.ok || body.ok === false) throw new Error(body.error ?? `LSP servers save failed: ${response.status}`)\n return body.lspServers ?? {}\n}\n\nexport async function fetchSkillContent(sourceId: string, suiteId: string, skill: string): Promise<SkillContent> {\n const response = await fetch(skillRoute(sourceId, suiteId, skill), { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`skill content failed: ${response.status}`)\n return response.json() as Promise<SkillContent>\n}\n\n/** Re-run the host MCP reconcile: retries failed mounts, clears residual tools. */\nexport async function retryMcpMounts(): Promise<void> {\n await postAction('mcp-retry', {})\n}\n\n/** Drop one server's OAuth grant so its next mount re-runs browser authorization. */\nexport async function reauthorizeMcpServer(serverName: string): Promise<void> {\n await postAction('mcp-reauthorize', { serverName })\n}\n\n/** The MCP backend card state: active client, host availability, download region. */\nexport interface McpBackendInfo {\n backend: 'builtin' | 'host'\n hostClient: { available: boolean; version?: string }\n downloadRegion: { setting: 'auto' | 'global' | 'china'; effective: 'global' | 'china' }\n}\n\nexport async function fetchMcpBackend(): Promise<McpBackendInfo> {\n const response = await fetch(MARKET_ROUTES.mcpBackend, { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`mcp backend failed: ${response.status}`)\n return response.json() as Promise<McpBackendInfo>\n}\n\nexport async function postAction(path: string, body: Record<string, unknown>): Promise<Record<string, unknown>> {\n const response = await fetch(`${MARKET_API_PREFIX}${path}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body)\n })\n const payload = (await response.json()) as { ok: boolean; error?: string }\n if (!response.ok || payload.ok !== true) {\n throw new Error(payload.error ?? `request failed: ${response.status}`)\n }\n return payload\n}\n","/** zh/en dictionaries for the Agent Plugins Market section. */\n\nexport type Dictionary = Record<string, string>\n\n/** Chinese is the source-of-truth key set; English is checked against it below. */\nexport const zh = {\n nav: 'Agent Plugins 市场',\n subtitle: '发现与安装 Agent Plugins(agent-plugins.org 便携包)',\n searchPh: '搜索 Agent Plugins…',\n tabAll: '全部',\n tabInstalled: '已安装',\n tabUninstalled: '未安装',\n market: '仓库源',\n addSource: '添加源',\n sourceIdPh: '源 id(小写字母数字)',\n sourceUrlPh: 'git 仓库地址',\n sourceUrlLocalPh: '本地仓库路径(绝对路径或 ~/…)',\n sourceUrlArchivePh: '压缩包地址(.zip / .tar.gz)',\n sourceModeGit: '远程 git',\n sourceModeArchive: '压缩包',\n sourceModeLocal: '本地目录',\n branchPh: '分支(可选)',\n sourceLocal: '本地',\n sourceArchive: '压缩包',\n sourceAdopted: '已收编',\n sha256Ph: 'SHA-256(可选,64 位十六进制)',\n unmanagedTitle: '检测到未登记的本地仓库:',\n unmanagedAdopt: '收编为源(只登记,不克隆不删除)',\n unmanagedNoRemote: '非 git 目录:将以本地目录形式登记',\n editSource: '编辑当前源',\n editSourceTitle: '编辑仓库源',\n addSourceTitle: '新增仓库源',\n save: '保存',\n confirmDelete: '确认删除',\n refreshAll: '刷新全部',\n detailTitle: 'Agent Plugins 详情',\n overviewSection: '概览',\n skillsSection: '技能',\n mcpSection: 'MCP 服务',\n commandsSection: '命令',\n agentsSection: '子代理',\n hooksLabel: 'Hooks',\n sourceLabel: '来源',\n dimensionLabel: '维度',\n layoutLabel: '布局',\n statusLabel: '状态',\n authorLabel: '作者',\n keywordsLabel: '关键词',\n disabledLabel: '已停用',\n notInstalledLabel: '未安装',\n surfaceTogglesSection: '运行时注入开关',\n surfaceTogglesHint: '按能力面控制注入:关闭后立即卸载对应注入(技能 / MCP / Hooks / 命令 / 子代理 / LSP)',\n mcpOverrideEdit: '编辑覆盖',\n mcpOverrideSave: '保存覆盖',\n mcpOverrideReset: '重置为源配置',\n mcpOverrideEnabled: '挂载此服务',\n mcpOverrideUrlLabel: 'URL 覆盖',\n mcpOverrideHeadersLabel: 'Headers 覆盖(每行 KEY=VALUE)',\n mcpOverrideEnvLabel: 'Env 覆盖(每行 KEY=VALUE)',\n mcpOverrideArgsLabel: 'Args 覆盖(每行一个参数)',\n mcpOverrideKvHint: '值可写 ${ENV_NAME} 引用进程环境变量,密钥不必明文保存。',\n mcpOverriddenBadge: '已覆盖',\n mcpOverrideDisabledBadge: '已停用',\n noSkills: '(无技能)',\n noMcp: '(无 MCP 服务)',\n loading: '加载中…',\n lspSection: 'LSP 服务',\n editorHint: '仓库源提供 Agent Plugins。本地目录直接读取(实时反映工作树);git 源克隆到 ~/.dsh/agent-plugins/.sources/<id>。',\n idHint: '小写字母/数字/连字符,全局唯一',\n urlGitHint: 'git 仓库地址,例如 https://github.com/org/repo.git',\n urlArchiveHint: 'HTTPS 压缩包地址,例如 https://example.com/plugin.zip;下载后解压为源目录',\n urlLocalHint: '绝对路径或 ~/…,直接读取本地目录(不克隆、移除源时不会删除)',\n branchHint: '可选;不填则跟踪默认分支',\n sha256Hint: '可选;填写后校验下载内容的 SHA-256,不匹配即拒绝安装',\n idFixed: 'id 不可修改(源标识全局唯一)',\n progressStarting: '正在提交…',\n progressCloning: '正在克隆仓库(git clone),可能需要几十秒…',\n progressDownloading: '正在下载并解压压缩包,可能需要几十秒…',\n progressReading: '正在读取插件清单…',\n idAutoLabel: '源 ID(自动生成)',\n idAutoHint: '自动从插件清单名或仓库名解析,无需填写',\n detailHint: '点击技能或 MCP 服务行可展开查看详情',\n add: '添加',\n remove: '移除',\n refresh: '刷新',\n install: '安装',\n installing: '安装中…',\n installedBadge: '已安装',\n uninstall: '卸载',\n uninstallConfirmTitle: '卸载 Agent Plugins',\n uninstallConfirmDesc: '将从已安装列表移除该 Agent Plugins,其技能与 MCP 工具随即停止注入。仓库源克隆保留。',\n installConfirmTitle: '确认安装',\n installConfirmDesc: '安装后以下能力将注入当前会话。请确认来源可信,详情可查看插件卡片。',\n installConfirmAction: '确认安装',\n installConfirmNoSurfaces: '该套件未声明任何运行时能力。',\n installConfirmExecutable: '风险提示:安装后将启动该套件的 MCP 子进程并挂载 hooks(第三方代码)。请确认来源可信后再安装。',\n installConfirmSource: '来源',\n installConfirmLocalTree: '本地目录(工作树,未锁定提交)',\n removeSourceConfirmTitle: '移除仓库源「{sourceId}」',\n removeSourceConfirmDesc: '将删除该源的本地克隆与全部安装记录。',\n enable: '启用',\n disable: '禁用',\n cancel: '取消',\n confirm: '确认',\n empty: '没有匹配的 Agent Plugins',\n installedEmpty: '还没有安装 Agent Plugins',\n loadFail: 'Agent Plugins 目录加载失败,请稍后重试',\n actionFail: '操作失败',\n version: '版本',\n dimensionUser: '用户级',\n dimensionProject: '项目级',\n layoutV1: '便携 v1',\n layoutCC: 'Claude Code',\n layoutCodex: 'Codex',\n layoutSkills: '技能集合',\n layoutUniversal: '通用',\n layoutCursor: 'Cursor',\n layoutKimi: 'Kimi',\n layoutRemote: '远程引用',\n layoutProjectNative: '项目原生',\n remoteRef: '远程',\n surfaceSkills: '技能',\n surfaceMcp: 'MCP',\n surfaceHooks: 'Hooks',\n surfaceCommands: '命令',\n surfaceAgents: '子代理',\n surfaceLsp: 'LSP',\n sourceNotCloned: '未克隆',\n sourceCloned: '已克隆',\n errors: '校验问题',\n scanNotes: '扫描提示',\n sourceErrorSeparator: ';',\n viewMode: '视图模式',\n grid: '网格',\n list: '列表',\n openSettings: '在设置中打开',\n rootLabel: 'Agent Plugins 目录',\n dataLabel: 'Agent Plugins 数据目录',\n countAll: '共 {n} 个 Agent Plugins',\n countInstalled: '已装 {n}',\n countEnabled: '启用 {n}',\n mcpStatusNav: 'MCP 服务',\n lspStatusNav: 'LSP 服务',\n lspSearch: '搜索 LSP 服务',\n lspAllMounted: '全部已挂载',\n lspDirect: '直接安装',\n mcpStatusTitle: 'MCP 服务',\n mcpStatusSubtitle: '连接状态、来源和工具清单',\n mcpSearch: '搜索 MCP 名称、来源或地址…',\n mcpAll: '全部',\n mcpPlugin: 'Plugin',\n mcpDirect: '直接安装',\n mcpService: '服务',\n mcpSource: '来源',\n mcpTransport: '传输',\n mcpTools: '工具',\n mcpTool: '工具',\n mcpAllConnected: '全部已连接',\n mcpReasonLabel: '原因',\n mcpRetryNote: '已自动重试多次仍失败。点击「重试」立即重连,或在插件市场中检查该服务的配置。',\n mcpRetrying: '正在重连…',\n mcpRetrySuccess: '重连成功,服务已恢复',\n mcpRetryFailure: '重连失败,请检查原因说明',\n mcpReauthorize: '重新授权',\n mcpConnect: '连接',\n mcpReauthorizing: '等待浏览器授权…',\n marketCardDesc: 'Agent Plugins 市场套件的安装、启用与运行时行为配置。',\n mcpCardTitle: 'MCP 增强模式',\n mcpCardDescOn: '已开启:支持 OAuth 授权、SSE、授权保持等功能。',\n mcpCardDescOff: '已关闭:使用宿主 dsh-mcp-client。',\n mcpCardReadonly: '当前环境设置文档只读,无法切换。',\n mcpForeign: '已由其他客户端挂载',\n mcpForeignHint: '该服务器已通过其他途径(原生配置或另一插件)挂载了同名 MCP,市场已跳过以避免重复挂载。如需由市场接管,请先停用另一来源的该服务器;若确认是残留挂载,重启宿主即可清除。',\n mcpDuplicateHint: '另一来源已挂载了相同的服务器,本副本未注册——同一服务器挂载两份对模型没有额外意义。卸载另一来源的套件后,本副本会在下次刷新时自动接管。',\n regionLabel: '下载区域',\n regionHint: '中国大陆走镜像线路,仅影响下载线路。',\n regionGlobal: '全球',\n regionChina: '中国大陆',\n mcpBackendHostMissing: '宿主 dsh-mcp-client 在当前环境不可用,无法切换到兼容模式。',\n mcpReauthHint: '删除已保存的授权令牌并重新走浏览器授权——用于权限范围选少了的场景。点击后请在弹出的页面完成登录。',\n mcpConnectHint: '删除旧的授权记录并重新发起浏览器登录。点击后请在弹出的页面完成授权,服务会自动连接。',\n mcpReauthSuccess: '已清除旧授权,请在弹出的浏览器页面重新登录',\n mcpReauthFailure: '重新授权失败,请稍后重试',\n mcpZeroTools: '该服务已连接,但未声明任何工具。',\n mcpConnected: '已连接',\n mcpDegraded: '降级',\n mcpFailed: '失败',\n mcpNeedsCredentials: '需要凭据',\n mcpOrphaned: '插件已卸载,工具残留',\n mcpConfigureCredentials: '配置凭据',\n mcpViewDetails: '查看详情',\n mcpCredentialTitle: '凭据配置',\n mcpCredentialConfigured: '已配置',\n mcpCredentialMissing: '未配置',\n mcpCredentialReadOnly: '由启动环境提供(只读;修改后需重启 DSH)',\n mcpCredentialUnavailable: '当前 profile 未提供凭据服务,请在启动 DSH 前设置环境变量。',\n mcpCredentialPlaceholder: '输入凭据(不会回显)',\n mcpCredentialSave: '保存凭据',\n mcpCredentialUnset: '删除凭据',\n mcpDisabled: '未启用',\n mcpObservedEndpoint: '当前工具表观测',\n mcpServiceDetail: '服务详情',\n mcpConfig: '连接配置',\n mcpSelectHint: '选择一个 MCP 服务查看配置与工具',\n mcpEmpty: '没有匹配的 MCP 服务',\n mcpNoTools: '当前没有已注册工具',\n mcpDirectConfigUnavailable: '宿主未提供直接安装 MCP 的配置记录',\n mcpDirectBoundary: '直接安装 MCP 仅显示当前工具表中可观测的服务;宿主未提供配置与连接状态 API。',\n mcpBackToMarket: '返回市场',\n mcpRetry: '重试',\n mcpFilterAllHint: '全部:插件套件声明的 MCP 服务与宿主直接安装的 MCP',\n mcpFilterPluginHint: 'Plugin:来自插件市场套件的 mcp.json 声明',\n mcpFilterDirectHint: '直接安装:宿主工具表中观测到、非套件来源的 MCP',\n lspStatusTitle: 'LSP 服务',\n lspStatusSubtitle: '语言服务器声明与挂载状态',\n lspAll: '全部',\n lspMounted: '已挂载',\n lspStarting: '启动中…',\n lspBlocked: '被阻塞',\n lspFailed: '失败',\n lspDisabled: '未启用',\n lspHostMissingShort: '宿主缺失',\n lspConflict: '扩展冲突',\n lspHostMissing: '当前 DSH 运行时未携带 LSP 组件(@deepseek-ai/dsh-lsp、dsh-lsp-stdio、dsh-tool-lsp),声明不会被挂载;升级宿主并在 profile 中挂载这三层后重新启用套件即可。',\n lspEmpty: '没有已声明的 LSP 服务器',\n lspReasonLabel: '原因',\n lspFilterAllHint: '全部:套件声明与用户自配的全部语言服务器',\n lspFilterPluginHint: 'Plugin:来自插件市场套件的内联 lspServers 声明',\n lspFilterDirectHint: '直接安装:用户自行配置的语言服务器(本面板配置)',\n lspFilterBlockedHint: '被阻塞:缺宿主组件、挂载失败或扩展冲突,点击卡片查看原因',\n lspFilterDisabledHint: '未启用:套件的 LSP 能力面开关已关闭',\n lspPlugin: 'Plugin',\n lspConfigure: '配置 LSP',\n lspConfigureHint: '编辑用户自配的语言服务器表(Claude Code lspServers 格式),保存后自动挂载',\n lspSave: '保存',\n lspDetailSubtitle: '语言服务器详情',\n lspDetailCommand: '启动命令',\n lspDetailExtensions: '扩展映射',\n mdCodeCopy: '复制',\n mdCodeCopied: '已复制',\n mdFootnotes: '脚注',\n}\n\nexport type LocaleKey = keyof typeof zh\n\nexport const en: Record<LocaleKey, string> = {\n nav: 'Agent Plugins Market',\n subtitle: 'Discover and install Agent Plugins suites (agent-plugins.org portable packages)',\n searchPh: 'Search suites…',\n tabAll: 'All',\n tabInstalled: 'Installed',\n tabUninstalled: 'Uninstalled',\n market: 'Sources',\n addSource: 'Add source',\n sourceIdPh: 'source id (lowercase alnum)',\n sourceUrlPh: 'git repository URL',\n sourceUrlLocalPh: 'local repository path (absolute or ~/…)',\n sourceUrlArchivePh: 'archive URL (.zip / .tar.gz)',\n sourceModeGit: 'remote git',\n sourceModeArchive: 'archive',\n sourceModeLocal: 'local dir',\n branchPh: 'branch (optional)',\n sourceLocal: 'local',\n sourceArchive: 'archive',\n sourceAdopted: 'adopted',\n sha256Ph: 'SHA-256 (optional, 64 hex chars)',\n unmanagedTitle: 'Unregistered local checkouts found:',\n unmanagedAdopt: 'Adopt as a source (register only — no clone, no deletion)',\n unmanagedNoRemote: 'Not a git checkout: registered as a local directory source',\n editSource: 'Edit source',\n editSourceTitle: 'Edit source',\n addSourceTitle: 'Add source',\n save: 'Save',\n confirmDelete: 'Delete',\n refreshAll: 'Refresh all',\n detailTitle: 'Suite details',\n overviewSection: 'Overview',\n skillsSection: 'Skills',\n mcpSection: 'MCP servers',\n commandsSection: 'Commands',\n agentsSection: 'Subagents',\n hooksLabel: 'Hooks',\n sourceLabel: 'Source',\n dimensionLabel: 'Dimension',\n layoutLabel: 'Layout',\n statusLabel: 'Status',\n authorLabel: 'Author',\n keywordsLabel: 'Keywords',\n disabledLabel: 'disabled',\n notInstalledLabel: 'not installed',\n surfaceTogglesSection: 'Runtime injection toggles',\n surfaceTogglesHint: 'Control injection per surface: turning one off unmounts that surface immediately (skills / MCP / hooks / commands / subagents / LSP)',\n mcpOverrideEdit: 'Edit override',\n mcpOverrideSave: 'Save override',\n mcpOverrideReset: 'Reset to source config',\n mcpOverrideEnabled: 'Mount this server',\n mcpOverrideUrlLabel: 'URL override',\n mcpOverrideHeadersLabel: 'Headers override (one KEY=VALUE per line)',\n mcpOverrideEnvLabel: 'Env override (one KEY=VALUE per line)',\n mcpOverrideArgsLabel: 'Args override (one argument per line)',\n mcpOverrideKvHint: 'Values may reference process env vars as ${ENV_NAME} so secrets never persist here.',\n mcpOverriddenBadge: 'overridden',\n mcpOverrideDisabledBadge: 'disabled',\n noSkills: '(no skills)',\n noMcp: '(no MCP servers)',\n loading: 'Loading…',\n lspSection: 'LSP servers',\n editorHint: 'A source provides suites (Agent Plugins). Local directories are read in place (live working tree); git sources clone into ~/.dsh/agent-plugins/.sources/<id>.',\n idHint: 'lowercase letters / digits / hyphens, globally unique',\n urlGitHint: 'git repository URL, e.g. https://github.com/org/repo.git',\n urlArchiveHint: 'HTTPS archive URL, e.g. https://example.com/plugin.zip — downloaded and extracted as the source directory',\n urlLocalHint: 'absolute path or ~/…, read in place (never cloned, never deleted on removal)',\n branchHint: 'optional; defaults to the repository default branch',\n sha256Hint: 'optional; when set, the download SHA-256 is verified and mismatches reject the install',\n idFixed: 'id is fixed (the source identifier is globally unique)',\n progressStarting: 'Submitting…',\n progressCloning: 'Cloning the repository (git clone) — this can take tens of seconds…',\n progressDownloading: 'Downloading and extracting the archive — this can take tens of seconds…',\n progressReading: 'Reading plugin manifests…',\n idAutoLabel: 'Source ID (auto)',\n idAutoHint: 'Derived from the suite or repo name — no need to type it',\n detailHint: 'Click a skill or MCP server row to expand its details',\n add: 'Add',\n remove: 'Remove',\n refresh: 'Refresh',\n install: 'Install',\n installing: 'Installing…',\n installedBadge: 'Installed',\n uninstall: 'Uninstall',\n uninstallConfirmTitle: 'Uninstall suite',\n uninstallConfirmDesc: 'Removes the suite from the installed list; its skills and MCP tools stop injecting. The source clone stays.',\n installConfirmTitle: 'Confirm install',\n installConfirmDesc: 'After install, the surfaces below inject into your sessions. Confirm you trust the source; see the suite card for details.',\n installConfirmAction: 'Install',\n installConfirmNoSurfaces: 'This suite declares no runtime surfaces.',\n installConfirmExecutable: 'Risk notice: installing starts this suite\\'s MCP child processes and mounts hooks (third-party code). Install only if you trust the source.',\n installConfirmSource: 'Source',\n installConfirmLocalTree: 'Local directory (working tree, no locked commit)',\n removeSourceConfirmTitle: 'Remove source “{sourceId}”',\n removeSourceConfirmDesc: 'Deletes the local clone and all install records of this source.',\n enable: 'Enable',\n disable: 'Disable',\n cancel: 'Cancel',\n confirm: 'Confirm',\n empty: 'No matching suites',\n installedEmpty: 'No suites installed yet',\n loadFail: 'Failed to load the suite catalog, try again later',\n actionFail: 'Action failed',\n version: 'Version',\n dimensionUser: 'user',\n dimensionProject: 'project',\n layoutV1: 'portable v1',\n layoutCC: 'Claude Code',\n layoutCodex: 'Codex',\n layoutSkills: 'skill dir',\n layoutUniversal: 'universal',\n layoutCursor: 'Cursor',\n layoutKimi: 'Kimi',\n layoutRemote: 'remote reference',\n layoutProjectNative: 'project native',\n remoteRef: 'remote',\n surfaceSkills: 'skills',\n surfaceMcp: 'MCP',\n surfaceHooks: 'hooks',\n surfaceCommands: 'commands',\n surfaceAgents: 'subagents',\n surfaceLsp: 'LSP',\n sourceNotCloned: 'not cloned',\n sourceCloned: 'cloned',\n errors: 'validation issues',\n scanNotes: 'scan notes',\n sourceErrorSeparator: '; ',\n viewMode: 'View mode',\n grid: 'grid',\n list: 'list',\n openSettings: 'Open in settings',\n rootLabel: 'Suite root',\n dataLabel: 'Suite data root',\n countAll: '{n} suites',\n countInstalled: '{n} installed',\n countEnabled: '{n} enabled',\n mcpStatusNav: 'MCP services',\n lspStatusNav: 'LSP servers',\n lspSearch: 'Search LSP servers',\n lspAllMounted: 'All mounted',\n lspDirect: 'Direct',\n mcpStatusTitle: 'MCP services',\n mcpStatusSubtitle: 'Connection state, sources, and tools',\n mcpSearch: 'Search MCP names, sources, or endpoints…',\n mcpAll: 'All',\n mcpPlugin: 'Plugin',\n mcpDirect: 'Direct',\n mcpService: 'Service',\n mcpSource: 'Source',\n mcpTransport: 'Transport',\n mcpTools: 'tools',\n mcpTool: 'tool',\n mcpAllConnected: 'All connected',\n mcpReasonLabel: 'Reason',\n mcpRetryNote: 'Automatic retries were exhausted. Use Retry to reconnect now, or check the server configuration in the market.',\n mcpRetrying: 'Reconnecting…',\n mcpRetrySuccess: 'Reconnected — the service is live again',\n mcpRetryFailure: 'Reconnect failed — see the reason above',\n mcpReauthorize: 'Re-authorize',\n mcpConnect: 'Connect',\n mcpReauthorizing: 'Waiting for browser authorization…',\n marketCardDesc: 'Install, enable, and runtime settings for Agent Plugins Market suites.',\n mcpCardTitle: 'MCP enhancement',\n mcpCardDescOn: 'On: enables OAuth authorization, SSE, authorization hold, and more.',\n mcpCardDescOff: 'Off: uses the host dsh-mcp-client.',\n mcpCardReadonly: 'The settings document is read-only in this environment; the switch is unavailable.',\n mcpForeign: 'Mounted elsewhere',\n mcpForeignHint: 'This server is already mounted through another path (native config or another plugin); the market skipped it to avoid a duplicate. To let the market take over, disable the other source first. If it is a leftover mount, a Host restart clears it.',\n mcpDuplicateHint: 'Another source already mounted this server, so this copy was not registered — mounting the same server twice adds nothing for the model. Uninstall the other source\\'s suite and this copy takes over on the next refresh.',\n regionLabel: 'Download region',\n regionHint: 'China mainland routes through a mirror. Affects the download route only.',\n regionGlobal: 'Global',\n regionChina: 'China mainland',\n mcpBackendHostMissing: 'The host dsh-mcp-client is not available here; compat mode cannot be enabled.',\n mcpReauthHint: 'Drops the saved OAuth token and re-runs the browser authorization — for when you picked too narrow a scope. Finish the sign-in in the page that opens.',\n mcpConnectHint: 'Drops the stale grant and starts a fresh browser sign-in. Approve in the page that opens and the service connects automatically.',\n mcpReauthSuccess: 'Old grant dropped — finish the sign-in in the browser page that opened',\n mcpReauthFailure: 'Re-authorization failed — try again shortly',\n mcpZeroTools: 'Connected, but this service advertises no tools.',\n mcpConnected: 'connected',\n mcpDegraded: 'degraded',\n mcpFailed: 'failed',\n mcpNeedsCredentials: 'credentials required',\n mcpOrphaned: 'plugin removed; tools remain',\n mcpConfigureCredentials: 'Configure credentials',\n mcpViewDetails: 'View details',\n mcpCredentialTitle: 'Credential configuration',\n mcpCredentialConfigured: 'configured',\n mcpCredentialMissing: 'not configured',\n mcpCredentialReadOnly: 'provided by the launch environment (read-only; restart DSH after changes)',\n mcpCredentialUnavailable: 'This profile has no credentials service. Set the environment variable before launching DSH.',\n mcpCredentialPlaceholder: 'Enter credential (not echoed)',\n mcpCredentialSave: 'Save credential',\n mcpCredentialUnset: 'Remove credential',\n mcpDisabled: 'disabled',\n mcpObservedEndpoint: 'observed from tool registry',\n mcpServiceDetail: 'Service detail',\n mcpConfig: 'Connection config',\n mcpSelectHint: 'Select an MCP service to inspect config and tools',\n mcpEmpty: 'No matching MCP services',\n mcpNoTools: 'No registered tools',\n mcpDirectConfigUnavailable: 'The host does not expose direct-MCP configuration',\n mcpDirectBoundary: 'Direct MCP entries only show services observed in the current tool registry; the host exposes no config or connection-status API.',\n mcpBackToMarket: 'Back to market',\n mcpRetry: 'Retry',\n mcpFilterAllHint: 'All: MCP services declared by plugin suites plus host-installed MCP',\n mcpFilterPluginHint: 'Plugin: mcp.json declarations from market suites',\n mcpFilterDirectHint: 'Direct: MCP observed in the host tool registry outside any suite',\n lspStatusTitle: 'LSP servers',\n lspStatusSubtitle: 'Declared language servers and their mount state',\n lspAll: 'All',\n lspMounted: 'Mounted',\n lspStarting: 'Starting…',\n lspBlocked: 'Blocked',\n lspFailed: 'Failed',\n lspDisabled: 'Disabled',\n lspHostMissingShort: 'Host missing',\n lspConflict: 'Extension conflict',\n lspHostMissing: 'This DSH runtime does not carry the LSP packages (@deepseek-ai/dsh-lsp, dsh-lsp-stdio, dsh-tool-lsp), so declarations are not mounted; upgrade the host, mount the three layers in the profile, and re-enable the suite.',\n lspEmpty: 'No declared LSP servers',\n lspReasonLabel: 'Reason',\n lspFilterAllHint: 'All: suite-declared and user-configured language servers',\n lspFilterPluginHint: 'Plugin: inline lspServers declarations from market suites',\n lspFilterDirectHint: 'Direct: user-configured language servers (configured in this panel)',\n lspFilterBlockedHint: 'Blocked: missing host packages, failed mounts, or extension conflicts — open a card for the reason',\n lspFilterDisabledHint: 'Disabled: the suite LSP surface toggle is off',\n lspPlugin: 'Plugin',\n lspConfigure: 'Configure LSP',\n lspConfigureHint: 'Edit the user-configured language-server table (Claude Code lspServers format); servers mount automatically after save',\n lspSave: 'Save',\n lspDetailSubtitle: 'Language server detail',\n lspDetailCommand: 'Launch command',\n lspDetailExtensions: 'Extension map',\n mdCodeCopy: 'Copy',\n mdCodeCopied: 'Copied',\n mdFootnotes: 'Footnotes',\n}\n","/** Market overview cache, invalidation, and source-progress resource helpers. */\nimport { fetchOverview, fetchSourceProgress, type OverviewData, type SourceProgress } from '../../api.js'\n\n/** UI state emitted while a source mutation is in flight. */\nexport interface SourceProgressState {\n step: string | undefined\n error: string | undefined\n}\n\nconst EMPTY_OVERVIEW: OverviewData = { sources: [], suites: [], totals: { all: 0, installed: 0, enabled: 0 }, roots: { user: '', data: '' }, unmanaged: [] }\n\nlet cachedOverview: OverviewData | undefined\nlet inflightOverview: Promise<OverviewData> | undefined\n\n/** Load the last overview immediately and revalidate one shared request. */\nexport function loadOverview(): { initial: OverviewData; revalidating: boolean; promise: Promise<OverviewData> } {\n const initial = cachedOverview ?? EMPTY_OVERVIEW\n if (inflightOverview === undefined) {\n inflightOverview = fetchOverview()\n .then(data => {\n cachedOverview = data\n return data\n })\n .finally(() => {\n inflightOverview = undefined\n })\n }\n return { initial, revalidating: cachedOverview === undefined, promise: inflightOverview }\n}\n\n/** Invalidate the shared overview after a mutating action. */\nexport function invalidateOverview(): void {\n cachedOverview = undefined\n}\n\n/**\n * Poll source mutation progress until stopped. Poll failures remain silent\n * because the add-source request is authoritative for mutation success.\n */\nexport function startSourceProgressPolling(\n report: (state: SourceProgressState) => void,\n resolveStep: (step: SourceProgress['step']) => string = step => step\n): { stop: () => void } {\n let stopped = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const tick = async (): Promise<void> => {\n if (stopped) return\n try {\n const progress = await fetchSourceProgress()\n if (!stopped && progress.active) report({ step: resolveStep(progress.step), error: undefined })\n } catch {\n // Transient poll failures are ignored; the add request reports real errors.\n }\n if (!stopped)\n timer = setTimeout(() => {\n void tick()\n }, 800)\n }\n timer = setTimeout(() => {\n void tick()\n }, 400)\n return {\n stop: () => {\n stopped = true\n if (timer !== undefined) clearTimeout(timer)\n }\n }\n}\n","/** Pure market filtering and count derivation. */\nimport type { OverviewData, SuiteCardData } from '../../api.js'\n\n/** Market status filter. */\nexport type MarketFilter = 'all' | 'installed' | 'uninstalled'\n/** Market source scope. */\nexport type MarketCategory = 'all' | string\n\n/** Derived market view data used by the screen and its toolbar. */\nexport interface MarketViewModel {\n scopeTotals: { all: number; installed: number; enabled: number }\n filtered: SuiteCardData[]\n}\n\ninterface SearchableSuite {\n suite: SuiteCardData\n haystack: string\n}\n\nconst searchableCache = new WeakMap<OverviewData, SearchableSuite[]>()\n\n/** Derive visible cards and scope counts in one pass over a normalized payload. */\nexport function deriveMarketViewModel(overview: OverviewData, search: string, filter: MarketFilter, category: MarketCategory): MarketViewModel {\n const searchable = searchableFor(overview)\n const needle = search.trim().toLowerCase()\n let all = 0\n let installed = 0\n let enabled = 0\n const visible: SuiteCardData[] = []\n\n for (const entry of searchable) {\n const suite = entry.suite\n if (category !== 'all' && suite.sourceId !== category) continue\n all++\n if (suite.installed) installed++\n if (suite.enabled) enabled++\n if (filter === 'installed' && !suite.installed) continue\n if (filter === 'uninstalled' && suite.installed) continue\n if (needle !== '' && !entry.haystack.includes(needle)) continue\n visible.push(suite)\n }\n\n return { scopeTotals: { all, installed, enabled }, filtered: visible }\n}\n\nfunction searchableFor(overview: OverviewData): SearchableSuite[] {\n const cached = searchableCache.get(overview)\n if (cached !== undefined) return cached\n const searchable = overview.suites.map(suite => ({\n suite,\n haystack: `${suite.name} ${suite.description ?? ''} ${suite.keywords.join(' ')}`.toLowerCase()\n }))\n searchableCache.set(overview, searchable)\n return searchable\n}\n","/**\n * Agent Plugins Market section styles. Colors ride the dsh --dsw-alias-* tokens with\n * light-mode fallbacks so the page follows the active theme; the section\n * lives inside the settings dialog, so it scrolls within the dialog and\n * never takes over the app frame.\n */\n\n.market {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 24px;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n/* Page mode owns the outer padding; settings mode receives it from the host shell.\n Page mode is a fixed inset-0 shell, so it owns the height and its lists scroll\n inside it; settings mode lets the host `.options` container be the only scroller\n (nested scrollers double-scroll and can paint text outside card bounds). */\n.pageMode {\n height: 100%;\n min-height: 0;\n width: 100%;\n min-width: 0;\n}\n\n.marketControls {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-height: 0;\n}\n\n.mcpSurface {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.surfaceSwitch {\n flex: none;\n align-self: center;\n height: 26px;\n padding: 0 10px;\n border: 1px solid var(--dsw-alias-border-l2, #d4dce8);\n border-radius: 7px;\n background: var(--dsw-alias-bg-layer-1, #fff);\n color: var(--dsw-alias-brand-primary, #4966f5);\n cursor: pointer;\n font-size: 11px;\n}\n\n.surfaceSwitch:hover {\n background: var(--dsw-alias-state-business-tertiary, rgb(228, 237, 253));\n}\n\n/* Legacy page-mode shell: scoped to the injected data attributes. */\n:global(html[data-dsh-agent-plugins-market-page]) :global([data-pane='conversation']),\n:global(html[data-dsh-agent-plugins-market-page]) :global([class*='centerCol']) {\n position: relative;\n}\n\n.pageView {\n position: absolute;\n inset: 0;\n display: none;\n z-index: 60;\n min-width: 0;\n min-height: 0;\n padding: 20px 24px;\n overflow: hidden;\n background: var(--dsw-alias-bg-base, #f7f8fa);\n}\n\n:global(html[data-dsh-agent-plugins-market-page]) .pageView {\n display: flex;\n}\n\n:global(html[data-dsh-agent-plugins-market-page]) :global([data-pane='conversation']) > :not([data-dsh-agent-plugins-market-page-view]),\n:global(html[data-dsh-agent-plugins-market-page]) :global([class*='centerCol']) > :not([data-dsh-agent-plugins-market-page-view]) {\n display: none !important;\n}\n\n.pageEntry {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 32px;\n padding: 6px 12px;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary, #1f2328);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n}\n\n.pageEntry:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n}\n\n.pageEntry:active {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n.pageEntry svg {\n flex-shrink: 0;\n color: var(--dsw-alias-label-secondary, #6b7280);\n}\n\n.pageEntry span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:global([data-dsh-frame][data-sidebar-collapsed]) .pageEntry {\n justify-content: center;\n padding-inline: 0;\n}\n\n:global([data-dsh-frame][data-sidebar-collapsed]) .pageEntry span {\n display: none;\n}\n\n.pageEntry:focus-visible,\n.srcTabMain:focus-visible,\n.srcTabEdit:focus-visible,\n.srcTabDel:focus-visible,\n.seg:focus-visible,\n.segOn:focus-visible,\n.detailItemRow:focus-visible,\n.detailItemOpen:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n.header {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.titleRow {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.sub {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n margin: 0;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.spacer {\n flex: 1;\n}\n\n.searchGroup {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n.body {\n display: flex;\n gap: 20px;\n min-height: 0;\n flex: 1;\n align-items: flex-start;\n}\n\n/* --- source tabs (top, primary) -------------------------------------------------- */\n\n.sourceTabsRow {\n display: block;\n padding: 0;\n}\n\n.sourceTabsScroll {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(118px, 1fr));\n gap: 4px;\n}\n\n/* --- unmanaged checkout adoption row ---------------------------------------------- */\n\n.unmanagedRow {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #57606a);\n}\n\n.unmanagedLabel {\n flex-shrink: 0;\n}\n\n.unmanagedChip {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n height: 22px;\n padding: 0 4px 0 8px;\n border: 1px dashed var(--dsw-alias-border-l3, #d9dde3);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1, #fff);\n max-width: 220px;\n}\n\n.unmanagedChipName {\n font-size: 12px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.unmanagedAdopt {\n border: none;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n padding: 0 4px;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.unmanagedAdopt:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n\n.srcTabEdit {\n border: none;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n padding: 2px 2px;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.srcTabEdit:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.srcTabOn .srcTabEdit {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n.srcTabOn .srcTabEdit:hover {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n.srcTab,\n.srcTabOn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 24px;\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n border-radius: 999px;\n overflow: hidden;\n background: var(--dsw-alias-bg-layer-1, #fff);\n}\n\n.srcTabMain {\n border: none;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary, #1f2328);\n padding: 2px 2px 2px 10px;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n flex: 1;\n}\n\n.srcTabMain:hover {\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n}\n\n.srcTabOn {\n background: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6);\n border-color: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6);\n}\n\n.srcTabOn .srcTabMain {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n font-weight: 600;\n}\n\n.srcTabDel {\n border: none;\n background: none;\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n padding: 2px 8px 2px 2px;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.srcTabDel:hover {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.srcTabOn .srcTabDel {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n.srcTabOn .srcTabDel:hover {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n/* --- card grid ----------------------------------------------------------------- */\n\n/* Lists scroll only in page mode (fixed shell); in settings mode the host\n `.options` container is the single scroller. */\n.grid {\n flex: 1;\n min-height: 0;\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n min-width: 0;\n align-content: start;\n}\n\n.pageMode .grid {\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding-right: 4px;\n}\n\n.list {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n}\n\n.pageMode .list {\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding-right: 4px;\n}\n\n.list .card {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px 14px;\n}\n\n.list .cardTop {\n flex: 0 0 auto;\n}\n\n.list .cardDesc {\n flex: 1;\n min-width: 200px;\n min-height: 0;\n max-height: 18px;\n overflow: hidden;\n}\n\n.list .cardActions {\n flex: 0 0 auto;\n}\n\n.list .meta,\n.list .tagRow {\n flex-basis: 100%;\n}\n\n.empty {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n padding: 48px 0;\n text-align: center;\n font-size: 13px;\n grid-column: 1 / -1;\n}\n\n.card {\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 12px;\n padding: 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n cursor: pointer;\n transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;\n}\n\n.card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n box-shadow: 0 1px 4px rgba(16, 24, 40, 0.06);\n}\n\n/* Installed cards carry the MCP card's left accent so install state scans\n like connection state does on the MCP page: green = enabled, gray = off. */\n.cardOn {\n border-left: 3px solid var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.cardMuted {\n border-left: 3px solid var(--dsw-alias-label-tertiary, #98a2b3);\n}\n\n.cardTop {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.cardTitle {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n}\n\n.cardName {\n font-size: 13px;\n font-weight: 600;\n line-height: 22px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.version {\n font-size: 12px;\n line-height: 20px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-variant-numeric: tabular-nums;\n flex-shrink: 0;\n}\n\n.cardActions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n/* Flat icon-only action (harness Button ghost geometry: transparent fill,\n interactive-bg hover). Rendered inline so no button-chrome box shows. */\n.iconBtn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n border: none;\n border-radius: 999px;\n background: none;\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.iconBtn svg {\n width: 15px;\n height: 15px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.8;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.iconBtn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.iconBtn:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n.iconBtn:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 1px;\n}\n\n.iconBtn:disabled {\n cursor: default;\n opacity: 0.4;\n}\n\n/* Destructive action only announces itself on hover, like the platform. */\n.iconBtnDanger:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n color: var(--dsw-alias-state-error-primary, rgb(236, 19, 19));\n}\n\n.switchOn,\n.switchOff {\n position: relative;\n width: 38px;\n height: 22px;\n border: none;\n border-radius: 999px;\n cursor: pointer;\n padding: 0;\n flex-shrink: 0;\n transition: background-color 0.15s ease;\n}\n\n/* ON rides the primary button fill (brand → dark in the platform theme),\n the same track color every other plugin toggle and native control uses —\n not state-success green, which reads as off-convention beside them. */\n.switchOn {\n background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-brand-primary, #4f6ef7));\n}\n\n.switchOff {\n background: var(--dsw-alias-label-dimmed, rgb(225, 229, 238));\n}\n\n.switchOn:disabled,\n.switchOff:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.switchThumb {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n transition: left 0.15s ease;\n pointer-events: none;\n}\n\n.switchOn .switchThumb {\n left: 19px;\n}\n\n.desc {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n /* Two-line cap without legacy -webkit-box clamping: the nested-scroll\n compositor can paint -webkit-box text outside its box, so bound the\n block height instead. */\n max-height: 36px;\n overflow: hidden;\n margin: 0;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n/* Surface-count tags live on their own line below source · layout so the\n first meta row stays scannable. */\n.tagRow {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n.src {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #9ca3af);\n text-decoration: none;\n}\n\n.tag {\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n color: var(--dsw-alias-label-secondary, #6b7280);\n border-radius: 4px;\n flex-shrink: 0;\n padding: 1px 6px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.okState {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-success-primary, #16a34a);\n white-space: nowrap;\n}\n\n.warnLine {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n font-weight: 600;\n font-size: 12px;\n line-height: 18px;\n margin: 0;\n cursor: help;\n}\n\n.modalFooter {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n width: 100%;\n}\n\n.modalFooterLeft {\n margin-right: auto;\n display: flex;\n gap: 8px;\n}\n\n/* --- source editor modal --------------------------------------------------------- */\n\n.editorDialog {\n width: min(500px, 92vw);\n}\n\n/* --- install confirmation modal --------------------------------------------------- */\n\n.installConfirmBody {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n}\n\n.installConfirmSuite {\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #111827);\n}\n\n.installConfirmMeta {\n color: var(--dsw-alias-label-secondary, #4b5563);\n font-size: 12px;\n}\n\n.installConfirmCommit {\n color: var(--dsw-alias-label-secondary, #4b5563);\n font-size: 12px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n.installConfirmTags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.installConfirmWarn {\n color: var(--dsw-alias-state-warn-label, rgb(221, 134, 41));\n font-size: 12px;\n border: 1px solid var(--dsw-alias-state-warn-label, rgb(221, 134, 41));\n border-radius: 8px;\n padding: 8px 10px;\n}\n\n.editorForm {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n\n.modeRow {\n display: flex;\n gap: 6px;\n padding: 3px;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-2, #f3f4f6);\n align-self: flex-start;\n}\n\n.seg,\n.segOn {\n border: none;\n background: none;\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n padding: 5px 14px;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.segOn {\n background: var(--dsw-alias-bg-layer-1, #fff);\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.fieldGroup {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.fieldLabel {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #6b7280);\n}\n\n.fieldHint {\n font-size: 12px;\n line-height: 16px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n}\n\n.staticId {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n border: 1px dashed var(--dsw-alias-border-l3, #d9dde3);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-2, #f3f4f6);\n}\n\n.staticIdValue {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n/* --- suite detail modal ---------------------------------------------------------- */\n\n.detailDialog {\n width: min(800px, 94vw);\n}\n\n.detailBody {\n display: flex;\n flex-direction: column;\n gap: 14px;\n max-height: 78vh;\n overflow-y: auto;\n}\n\n.detailSections {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.detailSection {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.detailHead {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary, #6b7280);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n padding-bottom: 4px;\n}\n\n.detailGrid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: 6px 14px;\n}\n\n.detailCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.detailKey {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n}\n\n.detailValue {\n font-size: 13px;\n color: var(--dsw-alias-label-primary, #1f2328);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detailDesc {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n}\n\n.mono {\n font-family: ui-monospace, Menlo, Consolas, monospace;\n font-size: 12px;\n line-height: 18px;\n word-break: break-all;\n white-space: pre-wrap;\n margin: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.detailItem {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.detailItemRow,\n.detailItemOpen {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n border: none;\n background: none;\n font: inherit;\n text-align: left;\n padding: 7px 10px;\n cursor: pointer;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.detailItemRow:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n}\n\n.detailItemOpen {\n background: var(--dsw-alias-state-business-tertiary, rgb(228, 237, 253));\n}\n\n.detailItemName {\n font-size: 13px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.detailItemDesc {\n flex: 1;\n min-width: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detailChevron {\n flex-shrink: 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n}\n\n.skillContent {\n border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n padding: 10px 12px;\n max-height: 320px;\n overflow-y: auto;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n/* --- add-source progress ------------------------------------------------------- */\n\n.progress,\n.progressError {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 13px;\n line-height: 20px;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n background: var(--dsw-alias-bg-layer-2, rgba(127, 127, 127, 0.06));\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.progressError {\n border-color: var(--dsw-alias-state-error-primary, rgb(236, 19, 19));\n color: var(--dsw-alias-state-error-primary, rgb(236, 19, 19));\n}\n\n.progressSpin {\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 2px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-top-color: var(--dsw-alias-brand-primary, #4f6ef7);\n animation: dshApmSpin 0.8s linear infinite;\n}\n\n@keyframes dshApmSpin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.progressFail {\n font-size: 13px;\n flex-shrink: 0;\n}\n\n.progressText {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n@media (max-width: 720px) {\n .pageView {\n padding: 14px;\n }\n\n .titleRow {\n flex-wrap: wrap;\n }\n\n .title {\n flex: 1 0 auto;\n }\n\n .sub {\n flex: 1 0 100%;\n order: 3;\n white-space: normal;\n }\n\n .searchGroup {\n flex: 1 0 100%;\n order: 4;\n }\n\n .sourceTabsScroll {\n display: flex;\n overflow-x: auto;\n padding-bottom: 2px;\n scrollbar-width: thin;\n }\n\n .srcTab,\n .srcTabOn {\n width: auto;\n min-width: 128px;\n flex: 0 0 auto;\n }\n\n .grid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .list .cardTop,\n .list .cardActions {\n max-width: 100%;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progressSpin,\n .switchOn,\n .switchOff,\n .switchThumb {\n animation: none;\n transition: none;\n }\n}\n\n.surfaceToggles {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 14px;\n align-items: center;\n}\n\n.surfaceToggle {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, rgb(97, 102, 107));\n cursor: pointer;\n user-select: none;\n}\n\n.surfaceToggle input[type='checkbox'] {\n accent-color: var(--dsw-alias-brand-primary-new-colorprimary-new-color, rgb(65, 118, 230));\n margin: 0;\n}\n\n.mcpOverrideForm {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 0 0 10px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1));\n border-radius: 8px;\n}\n\n.mcpCredentialForm {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin: 0 0 10px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1));\n border-radius: 8px;\n}\n\n.mcpCredentialRow {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.mcpCredentialControls {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.mcpCredentialEditor {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.mcpOverrideCheck {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n cursor: pointer;\n user-select: none;\n}\n\n.mcpOverrideInput {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 8px;\n font-size: 12px;\n}\n\n.mcpOverrideArea {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 8px;\n font-size: 12px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n resize: vertical;\n}\n\n.mcpOverrideActions {\n display: flex;\n gap: 8px;\n}\n\n.backendBlock {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 14px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.1));\n border-radius: 10px;\n opacity: 1;\n}\n\n.backendBlock[data-busy='true'] {\n opacity: 0.6;\n pointer-events: none;\n}\n\n.backendRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.backendTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n}\n\n.backendCurrent {\n margin: 0;\n font-size: 12px;\n font-weight: 500;\n}\n\n.backendHint {\n margin: 0;\n font-size: 11px;\n opacity: 0.7;\n}\n\n.backendVersion {\n margin: 0;\n font-size: 11px;\n opacity: 0.55;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n/* The 插件配置 card mirrors the host PluginCard chrome (border-l2 tokens,\n 14/16 header padding, disclosure body at 0 16px) so it sits visually\n identical beside the native cards. */\n\n.pluginCard {\n list-style: none;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 12px;\n background: var(--dsw-alias-bg-layer-3, #fff);\n transition: border-color 0.16s, background 0.16s;\n}\n\n.pluginCard:hover {\n border-color: var(--dsw-alias-label-dimmed, #c8ccd4);\n}\n\n.pluginCardOpen {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border-color: var(--dsw-alias-label-dimmed, #c8ccd4);\n}\n\n.pluginCard[data-busy='true'] {\n opacity: 0.6;\n pointer-events: none;\n}\n\n.pluginCardHeader {\n width: 100%;\n appearance: none;\n border: 0;\n background: none;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n}\n\n.pluginCardHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: -2px;\n}\n\n.pluginCardBody {\n border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n margin: 0 16px;\n padding: 4px 0 8px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.pluginCardRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 8px 0 4px;\n}\n\n.pluginCardText {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n flex: 1;\n}\n\n.pluginCardTitle {\n color: var(--dsw-alias-label-primary, #1f2328);\n font-size: 15px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n.pluginCardDesc {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.pluginCardRowLabel {\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n}\n\n/* The switch is the shared ui/ToggleSwitch component (the same one the\n suite cards use) — no parallel switch styles here. */\n\n.pluginCardError {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-size: 12px;\n line-height: 1.5;\n margin: 0;\n}\n\n.pluginChevron {\n flex: none;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n transition: transform 0.16s;\n display: inline-flex;\n}\n\n.pluginChevronOpen {\n transform: rotate(180deg);\n}\n\n/* Region segmented control, mirroring dshmarket's setSeg chrome. */\n.regionSeg {\n flex: none;\n display: inline-flex;\n gap: 2px;\n padding: 2px;\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n}\n\n.regionSegBtn {\n appearance: none;\n border: none;\n background: none;\n font: inherit;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n border-radius: 6px;\n padding: 3px 10px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.regionSegOn {\n appearance: none;\n border: none;\n font: inherit;\n cursor: pointer;\n border-radius: 6px;\n padding: 3px 10px;\n font-size: 12px;\n line-height: 18px;\n background: var(--dsw-alias-bg-layer-2, #eef0f4);\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n}\n\n.regionSegBtn:disabled,\n.regionSegOn:disabled {\n cursor: default;\n opacity: 0.5;\n}\n","/** A source tab with trailing edit and delete controls. */\nimport { createElement as h, type ReactNode } from 'react'\nimport type { Translate } from '../../index.js'\nimport css from '../../market.module.css'\n\nexport interface SourceTabProps {\n t: Translate\n active?: boolean\n label: string\n /** Hover hint for the tab (e.g. scan diagnostics); undefined hides it. */\n title?: string\n onSelect: () => void\n onDelete?: () => void\n onEdit?: () => void\n}\n\n/** A source chip with a trailing delete control (deletion confirms at the section level). */\nexport function SourceTab(props: SourceTabProps): ReactNode {\n const { t, active = false, label, title, onSelect, onDelete, onEdit } = props\n return h(\n 'div',\n { className: active ? css.srcTabOn : css.srcTab, title },\n h('button', { type: 'button', className: css.srcTabMain, onClick: onSelect }, label),\n onEdit === undefined\n ? null\n : h(\n 'button',\n {\n type: 'button',\n className: css.srcTabEdit,\n title: t('editSource'),\n onClick: (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n onEdit()\n }\n },\n '✎'\n ),\n onDelete === undefined\n ? null\n : h(\n 'button',\n {\n type: 'button',\n className: css.srcTabDel,\n title: t('remove'),\n onClick: (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n onDelete()\n }\n },\n '×'\n )\n )\n}\n","/** Source editor modal for adding or editing a catalog source. */\nimport { createElement as h, useState, type ReactNode } from 'react'\nimport { Button, Input, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SourceOverview } from '../../api.js'\nimport type { SourceProgressState } from './market-resource.js'\nimport type { Translate } from '../../index.js'\nimport css from '../../market.module.css'\n\nexport type EditorState = { mode: 'edit'; source: SourceOverview } | { mode: 'add' } | undefined\n\n/** Which acquisition path the editor configures. */\nexport type SourceEditorKind = 'git' | 'archive' | 'local'\n\nexport interface SourceEditorModalProps {\n t: Translate\n editor: Exclude<EditorState, undefined>\n busy: boolean\n progress: SourceProgressState\n onClose: () => void\n onSave: (input: { url: string; branch: string; kind: SourceEditorKind; sha256: string }) => Promise<boolean>\n onRemove: (id: string) => void\n}\n\nexport function SourceEditorModal(props: SourceEditorModalProps): ReactNode {\n const { t, editor } = props\n const [kind, setKind] = useState<SourceEditorKind>(editor.mode === 'edit' ? (editor.source.kind === 'archive' ? 'archive' : editor.source.local === true ? 'local' : 'git') : 'git')\n const [url, setUrl] = useState(editor.mode === 'edit' ? editor.source.url : '')\n const [branch, setBranch] = useState(editor.mode === 'edit' ? (editor.source.branch ?? '') : '')\n const [sha256, setSha256] = useState('')\n const id = editor.mode === 'edit' ? editor.source.id : ''\n const title = editor.mode === 'edit' ? t('editSourceTitle') : t('addSourceTitle')\n const urlPlaceholder = kind === 'local' ? t('sourceUrlLocalPh') : kind === 'archive' ? t('sourceUrlArchivePh') : t('sourceUrlPh')\n const urlHint = kind === 'local' ? t('urlLocalHint') : kind === 'archive' ? t('urlArchiveHint') : t('urlGitHint')\n const segment = (value: SourceEditorKind, label: string): ReactNode =>\n h(\n 'button',\n {\n type: 'button',\n className: kind === value ? css.segOn : css.seg,\n onClick: () => setKind(value)\n },\n label\n )\n return h(Modal, {\n open: true,\n onClose: props.onClose,\n title,\n description: t('editorHint'),\n closeLabel: t('cancel'),\n className: css.editorDialog,\n footer: h(\n 'div',\n { className: css.modalFooter },\n h('div', { className: css.modalFooterLeft }, editor.mode === 'edit' ? h(Button, { variant: 'ghost', onClick: () => props.onRemove(id) }, `🗑 ${t('remove')}`) : null),\n h(Button, { variant: 'ghost', onClick: props.onClose }, t('cancel')),\n h(\n Button,\n {\n variant: 'primary',\n disabled: props.busy,\n onClick: () => {\n void props.onSave({ url: url.trim(), branch: branch.trim(), kind, sha256: sha256.trim() })\n }\n },\n t('save')\n )\n ),\n children: h(\n 'div',\n { className: css.editorForm },\n h(\n 'div',\n { className: css.modeRow },\n segment('git', t('sourceModeGit')),\n segment('archive', t('sourceModeArchive')),\n segment('local', t('sourceModeLocal'))\n ),\n editor.mode === 'edit'\n ? h(\n 'div',\n { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, t('sourceIdPh')),\n h('div', { className: css.staticId }, h('span', { className: css.staticIdValue }, id), h('span', { className: css.fieldHint }, t('idFixed')))\n )\n : null,\n h(\n 'div',\n { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, urlPlaceholder),\n h(Input, { placeholder: urlPlaceholder, value: url, onChange: event => setUrl((event.target as HTMLInputElement).value) }),\n h('span', { className: css.fieldHint }, urlHint)\n ),\n kind === 'git'\n ? h(\n 'div',\n { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, t('branchPh')),\n h(Input, { placeholder: t('branchPh'), value: branch, onChange: event => setBranch((event.target as HTMLInputElement).value) }),\n h('span', { className: css.fieldHint }, t('branchHint'))\n )\n : null,\n kind === 'archive'\n ? h(\n 'div',\n { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, t('sha256Ph')),\n h(Input, { placeholder: t('sha256Ph'), value: sha256, onChange: event => setSha256((event.target as HTMLInputElement).value) }),\n h('span', { className: css.fieldHint }, t('sha256Hint'))\n )\n : null,\n props.progress.error === undefined && props.progress.step === undefined\n ? null\n : h(\n 'div',\n {\n className: props.progress.error === undefined ? css.progress : css.progressError\n },\n props.progress.error === undefined ? h('span', { className: css.progressSpin }) : h('span', { className: css.progressFail }, '✕'),\n h('span', { className: css.progressText }, props.progress.error === undefined ? props.progress.step : `${t('actionFail')}: ${props.progress.error}`)\n )\n )\n })\n}\n","/** Pre-install confirmation modal: concise surface counts plus a risk notice. */\nimport { createElement as h, type ReactNode } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SuiteCardData } from '../../api.js'\nimport type { Translate } from '../../index.js'\nimport css from '../../market.module.css'\n\nexport interface InstallConfirmState {\n suite: SuiteCardData\n /** Locked source commit shown in the confirm dialog; undefined for local sources. */\n lockCommit?: string\n /** True when the source is a local working tree (no immutable commit). */\n localSource?: boolean\n}\n\nexport interface InstallConfirmModalProps {\n t: Translate\n state: InstallConfirmState\n busy: boolean\n onClose: () => void\n onConfirm: () => Promise<boolean>\n}\n\n/** Surface count tags shown on the card; keys mirror SuiteCard's tag list. */\nconst SURFACE_TAGS: Array<{ key: 'skills' | 'mcp' | 'hooks' | 'commands' | 'agents' | 'lsp'; labelKey: 'surfaceSkills' | 'surfaceMcp' | 'surfaceHooks' | 'surfaceCommands' | 'surfaceAgents' | 'surfaceLsp' }> = [\n { key: 'skills', labelKey: 'surfaceSkills' },\n { key: 'mcp', labelKey: 'surfaceMcp' },\n { key: 'hooks', labelKey: 'surfaceHooks' },\n { key: 'commands', labelKey: 'surfaceCommands' },\n { key: 'agents', labelKey: 'surfaceAgents' },\n { key: 'lsp', labelKey: 'surfaceLsp' }\n]\n\nexport function InstallConfirmModal(props: InstallConfirmModalProps): ReactNode {\n const { t, state, busy } = props\n const surfaces = state.suite.surfaces\n const tags = SURFACE_TAGS.filter(tag => surfaces[tag.key] > 0)\n const executable = surfaces.mcp > 0 || surfaces.hooks > 0\n\n return h(Modal, {\n open: true,\n onClose: props.onClose,\n title: t('installConfirmTitle'),\n description: t('installConfirmDesc'),\n closeLabel: t('cancel'),\n className: css.editorDialog,\n footer: h(\n 'div',\n { className: css.modalFooter },\n h(Button, { variant: 'ghost', disabled: busy, onClick: props.onClose }, t('cancel')),\n h(\n Button,\n {\n variant: 'primary',\n disabled: busy,\n onClick: () => {\n void props.onConfirm()\n }\n },\n t('installConfirmAction')\n )\n ),\n children: h(\n 'div',\n { className: css.installConfirmBody },\n h('div', { className: css.installConfirmSuite }, `${state.suite.sourceId} / ${state.suite.name}`),\n state.suite.version === undefined ? null : h('div', { className: css.installConfirmMeta }, `${t('version')}: v${state.suite.version}`),\n state.lockCommit === undefined\n ? null\n : h('div', { className: css.installConfirmCommit }, `${t('installConfirmSource')}: ${state.lockCommit.slice(0, 12)}`),\n state.lockCommit === undefined && state.localSource === true\n ? h('div', { className: css.installConfirmCommit }, `${t('installConfirmSource')}: ${t('installConfirmLocalTree')}`)\n : null,\n tags.length === 0\n ? h('div', { className: css.installConfirmMeta }, t('installConfirmNoSurfaces'))\n : h(\n 'div',\n { className: css.installConfirmTags },\n tags.map(tag => h('span', { key: tag.key, className: css.tag }, `${t(tag.labelKey)} ${surfaces[tag.key]}`))\n ),\n executable ? h('div', { className: css.installConfirmWarn }, t('installConfirmExecutable')) : null\n )\n })\n}\n","/** Shared switch control (ON = primary button fill, like every host toggle). */\nimport { createElement as h, type ReactNode } from 'react'\nimport css from '../market.module.css'\n\nexport interface ToggleSwitchProps {\n on: boolean\n disabled?: boolean\n title?: string\n onChange: () => void\n}\n\n/** A green/gray switch control for suite enable state. */\nexport function ToggleSwitch(props: ToggleSwitchProps): ReactNode {\n return h(\n 'button',\n {\n type: 'button',\n role: 'switch',\n 'aria-checked': props.on,\n title: props.title,\n disabled: props.disabled,\n className: props.on ? css.switchOn : css.switchOff,\n onClick: (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n props.onChange()\n }\n },\n h('span', { className: css.switchThumb })\n )\n}\n","/** A suite card in the market grid/list. */\nimport { createElement as h, type ReactElement, type ReactNode } from 'react'\nimport { Button, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SuiteCardData } from '../../api.js'\nimport type { Translate } from '../../index.js'\nimport { ToggleSwitch } from '../../ui/ToggleSwitch.js'\nimport css from '../../market.module.css'\n\nexport interface SuiteCardProps {\n t: Translate\n suite: SuiteCardData\n busy: boolean\n onOpen: () => void\n onInstall: () => void\n onAddSource: () => void\n onToggle: () => void\n onRefresh: () => void\n onUninstall: () => void\n}\n\nexport function SuiteCard(props: SuiteCardProps): ReactNode {\n const { t, suite, busy } = props\n const tags: Array<[string, number]> = (\n [\n [t('surfaceSkills'), suite.surfaces.skills],\n [t('surfaceMcp'), suite.surfaces.mcp],\n [t('surfaceHooks'), suite.surfaces.hooks],\n [t('surfaceCommands'), suite.surfaces.commands],\n [t('surfaceAgents'), suite.surfaces.agents],\n [t('surfaceLsp'), suite.surfaces.lsp]\n ] as Array<[string, number]>\n ).filter(([, count]) => count > 0)\n const layoutLabel =\n suite.layout === 'agent-plugin-v1'\n ? t('layoutV1')\n : suite.layout === 'claude-code'\n ? t('layoutCC')\n : suite.layout === 'codex'\n ? t('layoutCodex')\n : suite.layout === 'universal'\n ? t('layoutUniversal')\n : suite.layout === 'cursor'\n ? t('layoutCursor')\n : suite.layout === 'kimi'\n ? t('layoutKimi')\n : suite.layout === 'remote'\n ? t('layoutRemote')\n : suite.layout === 'project-native'\n ? t('layoutProjectNative')\n : t('layoutSkills')\n const isRemote = suite.remoteUrl !== undefined\n const hasTagRow = tags.length > 0 || suite.errors.length > 0 || (suite.mcpErrors?.length ?? 0) > 0\n const stop = (callback: () => void) => (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n callback()\n }\n // Installed cards carry the MCP card's left accent: green = enabled, gray = disabled.\n const accent = suite.installed ? (suite.enabled ? css.cardOn : css.cardMuted) : undefined\n return h(\n 'article',\n { className: accent ? `${css.card} ${accent}` : css.card, onClick: props.onOpen },\n h(\n 'div',\n { className: css.cardTop },\n h(\n 'div',\n { className: css.cardTitle },\n h('span', { className: css.cardName }, suite.name),\n suite.version === undefined ? null : h('span', { className: css.version }, `v${suite.version}`)\n ),\n h(\n 'div',\n { className: css.cardActions },\n suite.installed\n ? [\n h(\n 'button',\n {\n key: 'refresh',\n type: 'button',\n className: css.iconBtn,\n title: t('refresh'),\n disabled: busy,\n onClick: stop(props.onRefresh)\n },\n h(\n 'svg',\n { viewBox: '0 0 24 24', 'aria-hidden': 'true' },\n h('path', { d: 'M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8' }),\n h('path', { d: 'M21 3v5h-5' })\n )\n ),\n h(\n 'button',\n {\n key: 'uninstall',\n type: 'button',\n className: `${css.iconBtn} ${css.iconBtnDanger}`,\n title: t('uninstall'),\n disabled: busy,\n onClick: stop(props.onUninstall)\n },\n h(\n 'svg',\n { viewBox: '0 0 24 24', 'aria-hidden': 'true' },\n h('path', { d: 'M3 6h18' }),\n h('path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6' }),\n h('path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2' })\n )\n ),\n // The enable switch reads last, at the card's trailing edge.\n h(ToggleSwitch, {\n key: 'toggle',\n on: suite.enabled,\n disabled: busy,\n title: suite.enabled ? t('disable') : t('enable'),\n onChange: props.onToggle\n })\n ]\n : isRemote\n ? h(\n Button,\n {\n variant: 'primary',\n size: 'sm',\n disabled: busy,\n title: suite.remoteUrl,\n onClick: stop(props.onAddSource)\n },\n t('addSource')\n )\n : h(\n Button,\n {\n variant: 'primary',\n size: 'sm',\n disabled: busy,\n onClick: stop(props.onInstall)\n },\n t('install')\n )\n )\n ),\n h('p', { className: css.desc }, suite.description ?? ''),\n h(\n 'div',\n { className: css.meta },\n h('span', { className: css.src }, `${suite.sourceId} · ${isRemote ? t('remoteRef') : suite.dimension === 'user' ? t('dimensionUser') : t('dimensionProject')}`),\n h('span', { className: css.tag }, layoutLabel)\n ),\n hasTagRow\n ? h(\n 'div',\n { className: css.tagRow },\n ...tags.map(([label, count]) => h('span', { key: label, className: css.tag }, `${label} ${count}`)),\n suite.errors.length === 0\n ? null\n : h(Tooltip, {\n label: suite.errors.slice(0, 8).join(t('sourceErrorSeparator')),\n children: h('span', { className: css.warnLine }, `⚠ ${t('errors')} ${suite.errors.length}`) as unknown as ReactElement\n }),\n (suite.mcpErrors?.length ?? 0) === 0\n ? null\n : h(Tooltip, {\n label: suite.mcpErrors!.slice(0, 8).join(t('sourceErrorSeparator')),\n children: h('span', { className: css.warnLine }, `⚠ ${t('mcpSection')} ${suite.mcpErrors!.length}`) as unknown as ReactElement\n })\n )\n : null\n )\n}\n","/** Shared status icon used by market and MCP status filter tabs. */\nimport { createElement as h, type ReactNode } from 'react'\n\nexport type StatusIconKind = 'all' | 'installed' | 'uninstalled'\n\nexport interface StatusIconProps {\n kind: StatusIconKind\n}\n\n/** An SVG status icon for the all/installed/uninstalled filter tabs. */\nexport function StatusIcon({ kind }: StatusIconProps): ReactNode {\n const common = { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n if (kind === 'installed') {\n return h('svg', common, h('circle', { cx: 8, cy: 8, r: 5.5 }), h('path', { d: 'm5.5 8 1.7 1.7 3.4-3.4' }))\n }\n if (kind === 'uninstalled') {\n return h('svg', common, h('path', { d: 'M8 2v8m-3-3 3 3 3-3M3 13h10' }))\n }\n return h('svg', common, h('path', { d: 'M2.5 5 8 2.5 13.5 5 8 7.5 2.5 5Zm0 3L8 10.5 13.5 8M2.5 11 8 13.5 13.5 11' }))\n}\n","/**\n * Error boundary for untrusted preview content.\n *\n * Skill/command/agent bodies and hook/LSP JSON are third-party content; a\n * renderer throw must degrade to a plain-text fallback instead of unmounting\n * the whole settings section (React has no built-in boundary).\n */\nimport { createElement as h, Component, type ReactNode } from 'react'\n\ninterface Props {\n children: ReactNode\n fallback?: (error: Error) => ReactNode\n}\n\ninterface State {\n error: Error | undefined\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n override state: State = { error: undefined }\n\n static getDerivedStateFromError(error: Error): State {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: unknown): void {\n console.warn('[dsh-agent-plugins-market] preview render failed:', error, info)\n }\n\n override render(): ReactNode {\n if (this.state.error !== undefined) {\n return this.props.fallback === undefined\n ? h('pre', { className: 'dsh-agent-plugins-fallback' }, `预览渲染失败:${this.state.error.message}`)\n : this.props.fallback(this.state.error)\n }\n return this.props.children\n }\n}\n","/** Browser-safe structural subset of the Host credentials wire. */\n\nexport interface CredentialView {\n configured: boolean\n source?: string\n writable: boolean\n}\n\nexport interface CredentialApi {\n describe(payload: { refs: string[] }): Promise<unknown>\n set(payload: { ref: string; value: string }): Promise<unknown>\n unset(payload: { ref: string }): Promise<unknown>\n}\n\ninterface CredentialDescribeResponse {\n result?: {\n ok?: boolean\n value?: { credentials?: Record<string, CredentialView> }\n error?: { message?: string }\n }\n}\n\ninterface CredentialMutationResponse {\n result?: { ok?: boolean; error?: { message?: string } }\n}\n\n/** Read one value-free credential view; secret values never enter the browser state. */\nexport async function describeCredential(api: CredentialApi | undefined, ref: string): Promise<CredentialView | undefined> {\n if (api === undefined) return undefined\n const response = (await api.describe({ refs: [ref] })) as CredentialDescribeResponse\n if (response.result?.ok !== true) throw new Error(response.result?.error?.message ?? 'credential lookup failed')\n return response.result.value?.credentials?.[ref]\n}\n\nexport async function setCredential(api: CredentialApi, ref: string, value: string): Promise<void> {\n const response = (await api.set({ ref, value })) as CredentialMutationResponse\n if (response.result?.ok !== true) throw new Error(response.result?.error?.message ?? 'credential save failed')\n}\n\nexport async function unsetCredential(api: CredentialApi, ref: string): Promise<void> {\n const response = (await api.unset({ ref })) as CredentialMutationResponse\n if (response.result?.ok !== true) throw new Error(response.result?.error?.message ?? 'credential removal failed')\n}\n\n/** Current Host remote service; methods return unwrapped RPC results. */\nexport interface CredentialRemote {\n describe(refs: string[]): Promise<{ ok: boolean; value?: Record<string, CredentialView>; error?: { message?: string } }>\n set(ref: string, value: string): Promise<unknown>\n unset(ref: string): Promise<unknown>\n}\n\n/** Adapt the current Host service to the credential editor's wire contract. */\nexport function credentialApi(remote: CredentialRemote): CredentialApi {\n return {\n describe: async ({ refs }) => {\n const result = await remote.describe(refs)\n return { result: result.ok ? { ok: true, value: { credentials: result.value } } : result }\n },\n set: async ({ ref, value }) => ({ result: await remote.set(ref, value) }),\n unset: async ({ ref }) => ({ result: await remote.unset(ref) }),\n }\n}\n","/* Write-only MCP credential editor. Colors ride dsh --dsw-alias-* tokens. */\n\n.form {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px 14px;\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n}\n\n.head {\n margin: 0;\n color: var(--dsw-alias-label-secondary, #667085);\n font-size: 12px;\n font-weight: 600;\n}\n\n.error {\n padding: 8px 10px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n border-radius: 8px;\n overflow-wrap: anywhere;\n font-size: 12px;\n line-height: 18px;\n}\n\n.row {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 6px;\n padding-top: 8px;\n border-top: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n}\n\n.ref {\n color: var(--dsw-alias-label-primary, #1f2328);\n font: 600 12px/18px ui-monospace, Menlo, Consolas, monospace;\n}\n\n.controls {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 8px;\n}\n\n.facts {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.factOk, .factMiss {\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.factOk {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, rgb(230, 250, 237));\n}\n\n.factMiss {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231));\n}\n\n.note {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n line-height: 17px;\n}\n\n.editor {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.input {\n width: 100%;\n box-sizing: border-box;\n padding: 7px 10px;\n color: var(--dsw-alias-label-primary, #1f2328);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n font-size: 12px;\n}\n\n.input:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 1px;\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n","/**\n * Write-only credential editor for MCP `${ENV_NAME}` references.\n *\n * Read facts (configured / source / writable) come from the value-free\n * credentials wire; a typed value crosses the wire exactly once, inside\n * `credentials.set`, and never re-enters component state. Read-only\n * launch-environment credentials render guidance instead of a form that could\n * only fake success.\n */\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { createElement as h } from 'react'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { describeCredential, setCredential, unsetCredential, type CredentialApi, type CredentialView } from './credentials.js'\nimport type { Translate } from './index.js'\nimport css from './mcp-credential.module.css'\n\nexport function McpCredentialEditor(props: { t: Translate; api?: CredentialApi; refs: string[] }): ReactNode {\n const { t, api, refs } = props\n const [views, setViews] = useState<Record<string, CredentialView>>({})\n const [drafts, setDrafts] = useState<Record<string, string>>({})\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [error, setError] = useState<string | undefined>(undefined)\n const refKey = refs.join('|')\n\n useEffect(() => {\n let cancelled = false\n setViews({})\n setError(undefined)\n if (api === undefined || refs.length === 0) return () => {\n cancelled = true\n }\n void Promise.all(refs.map(async ref => [ref, await describeCredential(api, ref)] as const))\n .then(entries => {\n if (cancelled) return\n setViews(Object.fromEntries(entries.flatMap(([ref, view]) => (view === undefined ? [] : [[ref, view]]))))\n })\n .catch(reason => {\n if (!cancelled) setError(reason instanceof Error ? reason.message : String(reason))\n })\n return () => {\n cancelled = true\n }\n }, [api, refKey])\n\n if (refs.length === 0) return null\n const refresh = async (ref: string): Promise<void> => {\n if (api === undefined) return\n const view = await describeCredential(api, ref)\n if (view !== undefined) setViews(current => ({ ...current, [ref]: view }))\n }\n const save = async (ref: string): Promise<void> => {\n const value = drafts[ref]?.trim()\n if (api === undefined || value === undefined || value === '') return\n setBusy(ref)\n setError(undefined)\n try {\n await setCredential(api, ref, value)\n setDrafts(current => ({ ...current, [ref]: '' }))\n await refresh(ref)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setBusy(undefined)\n }\n }\n const unset = async (ref: string): Promise<void> => {\n if (api === undefined) return\n setBusy(ref)\n setError(undefined)\n try {\n await unsetCredential(api, ref)\n await refresh(ref)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setBusy(undefined)\n }\n }\n\n return h(\n 'section',\n { className: css.form },\n h('h4', { className: css.head }, t('mcpCredentialTitle')),\n error === undefined ? null : h('div', { className: css.error }, error),\n refs.map(ref => {\n const view = views[ref]\n const refBusy = busy === ref\n return h(\n 'div',\n { key: ref, className: css.row },\n h('code', { className: css.ref }, ref),\n view === undefined\n ? h('div', { className: css.note }, api === undefined ? t('mcpCredentialUnavailable') : t('loading'))\n : h(\n 'div',\n { className: css.controls },\n h(\n 'div',\n { className: css.facts },\n h('span', { className: view.configured ? css.factOk : css.factMiss }, view.configured ? t('mcpCredentialConfigured') : t('mcpCredentialMissing')),\n view.source === undefined ? null : h('span', { className: css.note }, view.source)\n ),\n view.writable\n ? h(\n 'div',\n { className: css.editor },\n h('input', {\n className: css.input,\n type: 'password',\n autoComplete: 'new-password',\n value: drafts[ref] ?? '',\n placeholder: t('mcpCredentialPlaceholder'),\n disabled: refBusy,\n onChange: event => setDrafts(current => ({ ...current, [ref]: (event.target as HTMLInputElement).value }))\n }),\n h(\n 'div',\n { className: css.actions },\n h(Button, { variant: 'primary', size: 'sm', disabled: refBusy || (drafts[ref]?.trim() ?? '') === '', onClick: () => void save(ref) }, t('mcpCredentialSave')),\n view.configured ? h(Button, { variant: 'ghost', size: 'sm', disabled: refBusy, onClick: () => void unset(ref) }, t('mcpCredentialUnset')) : null\n )\n )\n : h('div', { className: css.note }, t('mcpCredentialReadOnly'))\n )\n )\n })\n )\n}\n","/** Request-order guard for asynchronously loaded suite detail content. */\n\n/** A small monotonic guard that invalidates stale detail responses. */\nexport interface LatestRequestGuard {\n next(): number\n invalidate(): void\n isCurrent(requestId: number): boolean\n}\n\n/** Create a request guard for one detail modal instance. */\nexport function createLatestRequestGuard(): LatestRequestGuard {\n let revision = 0\n return {\n next: () => ++revision,\n invalidate: () => {\n revision++\n },\n isCurrent: requestId => requestId === revision\n }\n}\n","/**\n * Suite detail modal: click one suite card to browse its internals.\n *\n * Sections: manifest overview, the skill list (each skill expands to its\n * SKILL.md body through the safe MarkdownText renderer), the validated\n * mcp.json servers (each expands to its full config), command/subagent file\n * lists, hook/LSP counts, and validation diagnostics.\n */\nimport { createElement as h, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Button, Modal, MarkdownText, type MarkdownLabels } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { fetchSkillContent, fetchSuiteDetail, postAction, type McpServerDetail, type SuiteDetail } from './api.js'\nimport type { CredentialApi } from './credentials.js'\nimport { ErrorBoundary } from './ErrorBoundary.js'\nimport { McpCredentialEditor } from './McpCredentialEditor.js'\nimport type { Translate } from './index.js'\nimport { createLatestRequestGuard } from './features/suite-detail/suite-detail-resource.js'\nimport css from './market.module.css'\n\n/** Toggleable surface keys paired with their translation keys. */\nconst SURFACE_TOGGLE_ROWS = [\n ['skills', 'surfaceSkills'],\n ['mcp', 'surfaceMcp'],\n ['hooks', 'surfaceHooks'],\n ['commands', 'surfaceCommands'],\n ['agents', 'surfaceAgents'],\n ['lsp', 'surfaceLsp']\n] as const\n\nexport interface SuiteDetailModalProps {\n t: Translate\n credentials?: CredentialApi\n sourceId: string\n suiteId: string\n onClose: () => void\n}\n\nexport function SuiteDetailModal({ t, credentials, sourceId, suiteId, onClose }: SuiteDetailModalProps): ReactNode {\n // MarkdownText's chrome (code copy buttons, footnotes heading) is\n // Cordis-free and takes its copy through this labels object.\n const markdownLabels = useMemo<MarkdownLabels>(\n () => ({ code: { copyLabel: t('mdCodeCopy'), copiedLabel: t('mdCodeCopied') }, footnotes: t('mdFootnotes') }),\n [t]\n )\n const [detail, setDetail] = useState<SuiteDetail | undefined>(undefined)\n const [error, setError] = useState<string | undefined>(undefined)\n const [openSkill, setOpenSkill] = useState<string | undefined>(undefined)\n const [skillText, setSkillText] = useState<string | undefined>(undefined)\n const [skillLoading, setSkillLoading] = useState(false)\n const skillRequestGuard = useRef(createLatestRequestGuard())\n const [openMcp, setOpenMcp] = useState<string | undefined>(undefined)\n const [openPreview, setOpenPreview] = useState<string | undefined>(undefined)\n\n useEffect(() => {\n let cancelled = false\n skillRequestGuard.current.invalidate()\n setDetail(undefined)\n setError(undefined)\n setOpenSkill(undefined)\n setSkillText(undefined)\n fetchSuiteDetail(sourceId, suiteId)\n .then(value => {\n if (!cancelled) setDetail(value)\n })\n .catch(reason => {\n if (!cancelled) setError(reason instanceof Error ? reason.message : String(reason))\n })\n return () => {\n cancelled = true\n skillRequestGuard.current.invalidate()\n }\n }, [sourceId, suiteId])\n\n const toggleSkill = async (name: string): Promise<void> => {\n const requestId = skillRequestGuard.current.next()\n if (openSkill === name) {\n setOpenSkill(undefined)\n return\n }\n setOpenSkill(name)\n setSkillLoading(true)\n setSkillText(undefined)\n try {\n const content = await fetchSkillContent(sourceId, suiteId, name)\n if (skillRequestGuard.current.isCurrent(requestId)) setSkillText(content.content)\n } catch (reason) {\n if (skillRequestGuard.current.isCurrent(requestId)) setSkillText(`⚠ ${reason instanceof Error ? reason.message : String(reason)}`)\n } finally {\n if (skillRequestGuard.current.isCurrent(requestId)) setSkillLoading(false)\n }\n }\n\n const toggleMcp = (key: string): void => {\n setOpenMcp(openMcp === key ? undefined : key)\n }\n\n const [surfaceBusy, setSurfaceBusy] = useState(false)\n const toggleSurface = async (surface: string, enabled: boolean): Promise<void> => {\n setSurfaceBusy(true)\n try {\n await postAction('set-surface', { sourceId, suiteId, surface, enabled })\n const next = await fetchSuiteDetail(sourceId, suiteId)\n setDetail(next)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setSurfaceBusy(false)\n }\n }\n\n /** Save or clear one server's MCP override, then refresh the detail. */\n const saveMcpOverride = async (serverKey: string, patch: Record<string, unknown> | null): Promise<void> => {\n setSurfaceBusy(true)\n try {\n await postAction('set-mcp-override', { sourceId, suiteId, serverKey, override: patch })\n const next = await fetchSuiteDetail(sourceId, suiteId)\n setDetail(next)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setSurfaceBusy(false)\n }\n }\n\n const layoutLabel =\n detail === undefined\n ? ''\n : detail.layout === 'agent-plugin-v1'\n ? t('layoutV1')\n : detail.layout === 'claude-code'\n ? t('layoutCC')\n : detail.layout === 'codex'\n ? t('layoutCodex')\n : detail.layout === 'universal'\n ? t('layoutUniversal')\n : detail.layout === 'cursor'\n ? t('layoutCursor')\n : detail.layout === 'kimi'\n ? t('layoutKimi')\n : detail.layout === 'remote'\n ? t('layoutRemote')\n : detail.layout === 'project-native'\n ? t('layoutProjectNative')\n : t('layoutSkills')\n\n return h(Modal, {\n open: true,\n onClose,\n title: detail === undefined ? t('detailTitle') : `${detail.name}${detail.version === null ? '' : ` v${detail.version}`}`,\n description: detail === undefined ? undefined : t('detailHint'),\n closeLabel: t('cancel'),\n className: css.detailDialog,\n contentClassName: css.detailBody,\n footer: h('div', { className: css.modalFooter }, h(Button, { variant: 'ghost', onClick: onClose }, t('cancel'))),\n children: h(ErrorBoundary, {\n fallback: boundaryError => h('div', { className: css.warnLine }, `${t('actionFail')}: ${boundaryError.message}`),\n children:\n error !== undefined\n ? h('div', { className: css.warnLine }, error)\n : detail === undefined\n ? h('div', { className: css.empty }, t('loading'))\n : h(\n 'div',\n { className: css.detailSections },\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, t('overviewSection')),\n h(\n 'div',\n { className: css.detailGrid },\n h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('sourceLabel')), h('span', { className: css.detailValue }, detail.sourceId)),\n h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('dimensionLabel')),\n h('span', { className: css.detailValue }, detail.dimension === 'user' ? t('dimensionUser') : t('dimensionProject'))\n ),\n h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('layoutLabel')), h('span', { className: css.detailValue }, layoutLabel)),\n h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('statusLabel')),\n h(\n 'span',\n { className: detail.enabled ? css.okState : css.detailValue },\n detail.installed ? (detail.enabled ? t('installedBadge') : t('disabledLabel')) : t('notInstalledLabel')\n )\n ),\n detail.author === null\n ? null\n : h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('authorLabel')),\n h('span', { className: css.detailValue }, detail.author)\n ),\n detail.keywords.length === 0\n ? null\n : h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('keywordsLabel')),\n h('span', { className: css.detailValue }, detail.keywords.join(', '))\n )\n ),\n detail.description === null ? null : h('p', { className: css.detailDesc }, detail.description),\n h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('rootLabel')), h('span', { className: css.mono }, detail.root)),\n detail.installed === false || detail.surfaceToggles === null\n ? null\n : h(\n 'div',\n { className: css.detailCell },\n h('span', { className: css.detailKey }, t('surfaceTogglesSection')),\n h(\n 'div',\n { className: css.surfaceToggles, title: t('surfaceTogglesHint') },\n ...SURFACE_TOGGLE_ROWS.map(([key, labelKey]) =>\n h('label', { key, className: css.surfaceToggle }, h('input', {\n type: 'checkbox',\n checked: detail.surfaceToggles![key],\n disabled: surfaceBusy,\n onChange: event => {\n void toggleSurface(key, (event.target as HTMLInputElement).checked)\n }\n }), t(labelKey))\n )\n )\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('skillsSection')} (${detail.skills.length})`),\n detail.skills.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.skills.map(skill =>\n h(\n 'div',\n { key: skill.name, className: css.detailItem },\n h(\n 'button',\n {\n type: 'button',\n className: openSkill === skill.name ? css.detailItemOpen : css.detailItemRow,\n onClick: () => {\n void toggleSkill(skill.name)\n }\n },\n h('span', { className: css.detailItemName }, skill.name),\n h('span', { className: css.detailItemDesc }, skill.description),\n h('span', { className: css.detailChevron }, openSkill === skill.name ? '▾' : '▸')\n ),\n openSkill !== skill.name ? null : h('div', { className: css.skillContent }, skillLoading ? t('loading') : h(MarkdownText, { text: skillText ?? '', labels: markdownLabels }))\n )\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('mcpSection')} (${detail.mcpServers.length})`),\n detail.mcpErrors.length === 0\n ? null\n : h('div', { className: css.warnLine, style: { margin: '0 0 6px' } }, `⚠ ${detail.mcpErrors.join(t('sourceErrorSeparator'))}`),\n detail.mcpServers.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.mcpServers.map(server => {\n const override = detail.mcpOverrides?.[server.key]\n const overridden = override !== undefined && Object.keys(override).length > 0\n const disabled = override?.enabled === false\n return h(\n 'div',\n { key: server.key, className: css.detailItem },\n h(\n 'button',\n {\n type: 'button',\n className: openMcp === server.key ? css.detailItemOpen : css.detailItemRow,\n onClick: () => toggleMcp(server.key)\n },\n h('span', { className: css.detailItemName }, server.key),\n h(\n 'span',\n { className: css.detailItemDesc },\n `${mcpSummary(server)}${disabled ? ` · ${t('mcpOverrideDisabledBadge')}` : overridden ? ` · ${t('mcpOverriddenBadge')}` : ''}`\n ),\n h('span', { className: css.detailChevron }, openMcp === server.key ? '▾' : '▸')\n ),\n openMcp === server.key\n ? h(\n 'div',\n { className: css.skillContent },\n detail.installed && detail.surfaceToggles?.mcp !== false\n ? h(McpCredentialEditor, { t, api: credentials, refs: server.credentialRefs ?? [] })\n : null,\n detail.installed && detail.surfaceToggles?.mcp !== false\n ? h(McpOverrideEditor, {\n t,\n serverKey: server.key,\n transport: server.type,\n override: override ?? {},\n busy: surfaceBusy,\n onSave: patch => saveMcpOverride(server.key, patch),\n onReset: () => saveMcpOverride(server.key, null)\n })\n : null,\n h('pre', { className: css.mono }, JSON.stringify(server, null, 2))\n )\n : null\n )\n })\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('commandsSection')} (${detail.commands.length})`),\n detail.commands.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.commands.map(command =>\n h(PreviewRow, {\n key: `c:${command.name}`,\n t,\n name: `/${command.name}`,\n description: command.description,\n open: openPreview === `c:${command.name}`,\n onToggle: () => setOpenPreview(openPreview === `c:${command.name}` ? undefined : `c:${command.name}`),\n children: h(MarkdownText, { text: command.content, labels: markdownLabels })\n })\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('agentsSection')} (${detail.agents.length})`),\n detail.agents.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.agents.map(agent =>\n h(PreviewRow, {\n key: `a:${agent.name}`,\n t,\n name: agent.name,\n description: agent.description,\n open: openPreview === `a:${agent.name}`,\n onToggle: () => setOpenPreview(openPreview === `a:${agent.name}` ? undefined : `a:${agent.name}`),\n children: h(MarkdownText, { text: agent.content, labels: markdownLabels })\n })\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('hooksLabel')} (${detail.hooks.count})`),\n detail.hooks.count === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.hooks.entries.map((hook, index) =>\n h(PreviewRow, {\n key: `h:${index}`,\n t,\n name: hook.event,\n description: hook.command,\n open: openPreview === `h:${index}`,\n onToggle: () => setOpenPreview(openPreview === `h:${index}` ? undefined : `h:${index}`),\n children: h('pre', { className: css.mono }, JSON.stringify(hook, null, 2))\n })\n )\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('lspSection')} (${detail.lsp.servers.length + detail.lsp.raw.length})`),\n detail.lsp.servers.length === 0 && detail.lsp.raw.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : [\n ...detail.lsp.servers.map(server =>\n h(PreviewRow, {\n key: `l:${server.key}`,\n t,\n name: server.key,\n description: lspSummary(server),\n open: openPreview === `l:${server.key}`,\n onToggle: () => setOpenPreview(openPreview === `l:${server.key}` ? undefined : `l:${server.key}`),\n children: h('pre', { className: css.mono }, JSON.stringify(server, null, 2))\n })\n ),\n ...detail.lsp.raw.map(entry =>\n h(PreviewRow, {\n key: `l:${entry.name}`,\n t,\n name: entry.name,\n open: openPreview === `l:${entry.name}`,\n onToggle: () => setOpenPreview(openPreview === `l:${entry.name}` ? undefined : `l:${entry.name}`),\n children: h('pre', { className: css.mono }, entry.content)\n })\n )\n ]\n ),\n detail.errors.length === 0\n ? null\n : h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('errors')} (${detail.errors.length})`),\n detail.errors.map((entry, index) => h('div', { key: index, className: css.warnLine }, entry))\n )\n )\n })\n })\n}\n\nfunction mcpSummary(server: McpServerDetail): string {\n if (server.type === 'stdio') return server.command ?? server.type\n return server.url ?? server.type\n}\n\n/** One-line summary of a declared LSP server: command plus mapped extension list. */\nfunction lspSummary(server: { command: string; extensions: Record<string, string> }): string {\n return [server.command, Object.keys(server.extensions).join(' ')].join(' · ')\n}\n\n/** Parse `KEY=VALUE` lines into a record; blank and comment lines are skipped. */\nfunction parseKvLines(text: string): Record<string, string> | undefined {\n const result: Record<string, string> = {}\n for (const line of text.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed === '' || trimmed.startsWith('#')) continue\n const eq = trimmed.indexOf('=')\n if (eq <= 0) continue\n result[trimmed.slice(0, eq).trim()] = trimmed.slice(eq + 1).trim()\n }\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/** Format a record back into sorted `KEY=VALUE` lines without exposing literal secrets. */\nconst SENSITIVE_KEY = /(authorization|token|secret|password|credential|api[-_]?key)/i\n\nfunction formatKvLines(map: Record<string, string> | undefined): string {\n if (map === undefined) return ''\n return Object.keys(map)\n .filter(key => !SENSITIVE_KEY.test(key) || map[key]?.includes('${'))\n .sort()\n .map(key => `${key}=${map[key]}`)\n .join('\\n')\n}\n\ntype OverridePatch = Record<string, unknown>\n\n/**\n * Per-server MCP override editor: enable/disable plus connection-input\n * replacement (url/headers for http servers, args/env for stdio). The\n * suite's own mcp.json stays source-owned; everything here persists as a\n * user override layered on top at mount time.\n */\nfunction McpOverrideEditor(props: {\n t: Translate\n serverKey: string\n transport: string\n override: Record<string, unknown>\n busy: boolean\n onSave: (patch: OverridePatch) => Promise<void>\n onReset: () => Promise<void>\n}): ReactNode {\n const { t, transport, override, busy } = props\n const [draft, setDraft] = useState<OverridePatch>(override)\n const kvHint = t('mcpOverrideKvHint')\n const isHttp = transport !== 'stdio'\n /** Gather the draft fields into one sanitized override patch and save it. */\n const submit = (): void => {\n const patch: OverridePatch = {}\n patch['enabled'] = draft['enabled'] !== false\n if (isHttp && typeof draft['url'] === 'string' && draft['url'] !== '') patch['url'] = draft['url']\n const headerText = isHttp ? String(draft['__headers'] ?? '') : ''\n const headers = parseKvLines(headerText)\n if (headers !== undefined) patch['headers'] = headers\n const envText = !isHttp ? String(draft['__env'] ?? '') : ''\n const env = parseKvLines(envText)\n if (env !== undefined) patch['env'] = env\n const argsText = !isHttp ? String(draft['__args'] ?? '') : ''\n const args = argsText\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line !== '')\n if (args.length > 0) patch['args'] = args\n void props.onSave(patch)\n }\n return h(\n 'div',\n { className: css.mcpOverrideForm },\n h(\n 'label',\n { className: css.mcpOverrideCheck },\n h('input', {\n type: 'checkbox',\n checked: draft['enabled'] !== false,\n disabled: busy,\n onChange: event => setDraft({ ...draft, enabled: (event.target as HTMLInputElement).checked })\n }),\n t('mcpOverrideEnabled')\n ),\n isHttp\n ? h('input', {\n className: css.mcpOverrideInput,\n value: typeof draft['url'] === 'string' ? draft['url'] : '',\n placeholder: t('mcpOverrideUrlLabel'),\n disabled: busy,\n onChange: event => setDraft({ ...draft, url: (event.target as HTMLInputElement).value })\n })\n : null,\n isHttp\n ? h('textarea', {\n className: css.mcpOverrideArea,\n rows: 3,\n placeholder: t('mcpOverrideHeadersLabel'),\n title: kvHint,\n value: typeof draft['__headers'] === 'string' ? draft['__headers'] : formatKvLines(override['headers'] as Record<string, string> | undefined),\n disabled: busy,\n onChange: (event: { target: EventTarget | null }) => setDraft({ ...draft, __headers: (event.target as HTMLTextAreaElement).value })\n })\n : null,\n !isHttp\n ? h('textarea', {\n className: css.mcpOverrideArea,\n rows: 3,\n placeholder: t('mcpOverrideEnvLabel'),\n title: kvHint,\n value: typeof draft['__env'] === 'string' ? draft['__env'] : formatKvLines(override['env'] as Record<string, string> | undefined),\n disabled: busy,\n onChange: (event: { target: EventTarget | null }) => setDraft({ ...draft, __env: (event.target as HTMLTextAreaElement).value })\n })\n : null,\n !isHttp\n ? h('textarea', {\n className: css.mcpOverrideArea,\n rows: 3,\n placeholder: t('mcpOverrideArgsLabel'),\n value: typeof draft['__args'] === 'string' ? draft['__args'] : Array.isArray(override['args']) ? (override['args'] as string[]).join('\\n') : '',\n disabled: busy,\n onChange: (event: { target: EventTarget | null }) => setDraft({ ...draft, __args: (event.target as HTMLTextAreaElement).value })\n })\n : null,\n h('div', { className: css.mcpOverrideActions },\n h(Button, { variant: 'primary', size: 'sm', disabled: busy, onClick: submit }, t('mcpOverrideSave')),\n h(Button, { variant: 'ghost', size: 'sm', disabled: busy, onClick: () => void props.onReset() }, t('mcpOverrideReset'))\n ),\n h('div', { className: css.detailItemDesc }, kvHint)\n )\n}\n\nfunction PreviewRow(props: { t: Translate; name: string; description?: string; open: boolean; onToggle: () => void; children: ReactNode }): ReactNode {\n const { name, description, open, onToggle, children } = props\n return h(\n 'div',\n { className: css.detailItem },\n h(\n 'button',\n {\n type: 'button',\n className: open ? css.detailItemOpen : css.detailItemRow,\n onClick: onToggle\n },\n h('span', { className: css.detailItemName }, name),\n description === undefined ? null : h('span', { className: css.detailItemDesc }, description),\n h('span', { className: css.detailChevron }, open ? '▾' : '▸')\n ),\n open ? h('div', { className: css.skillContent }, children) : null\n )\n}\n","/* Shared search + filter + view-switch row.\n *\n * Flexbox, not a fixed column grid: panels pass different filter counts\n * (MCP 3, LSP 4), and a hard-coded grid template overflowed on the fourth\n * filter, pushing the view switch onto its own row and forcing a horizontal\n * scrollbar. Here the search box flexes, filter buttons keep their natural\n * width, and the spacer pushes the view switch to the trailing edge. */\n.toolbar {\n display: flex;\n align-items: flex-end;\n gap: 6px;\n min-width: 0;\n}\n\n.filterGap,\n.viewGap {\n flex: 1 0 12px;\n min-width: 0;\n}\n\n.search {\n display: flex;\n flex: 1 1 240px;\n align-items: center;\n box-sizing: border-box;\n min-width: 0;\n height: 36px;\n}\n\n.search input {\n box-sizing: border-box;\n min-width: 0;\n width: 100%;\n height: 36px;\n min-height: 36px;\n max-height: 36px;\n padding-top: 0;\n padding-bottom: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n.filter,\n.filterOn {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n gap: 5px;\n min-width: 54px;\n height: 36px;\n padding: 7px 9px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n border: none;\n border-bottom: 2px solid transparent;\n background: none;\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n white-space: nowrap;\n}\n\n.filterOn {\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n border-bottom-color: var(--dsw-alias-brand-primary, #4f6ef7);\n font-weight: 600;\n}\n\n.filter svg,\n.filterOn svg,\n.viewSwitch svg {\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.filterCount {\n font-variant-numeric: tabular-nums;\n}\n\n.viewSwitch {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 36px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n border: none;\n border-bottom: 2px solid transparent;\n background: none;\n cursor: pointer;\n}\n\n.viewSwitch:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.viewSwitch:focus-visible,\n.filter:focus-visible,\n.filterOn:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n@media (max-width: 760px) {\n .toolbar {\n flex-wrap: wrap;\n justify-content: flex-end;\n }\n\n .search {\n flex-basis: 100%;\n }\n\n .filterGap {\n display: none;\n }\n}\n","/**\n * Shared search, filter, and view controls for catalog-style settings panels.\n */\nimport { createElement as h, type ReactNode } from 'react'\nimport { Input } from '@deepseek-ai/dsh-client-ui-primitives'\nimport css from './SearchFilterToolbar.module.css'\n\nexport type SearchFilterToolbarView = 'grid' | 'list'\n\nexport interface SearchFilterToolbarFilter {\n id: string\n label: string\n count: number\n icon: ReactNode\n active: boolean\n onSelect: () => void\n /** Extended hover/aria explanation; falls back to the label when absent. */\n hint?: string\n}\n\nexport interface SearchFilterToolbarProps {\n search: string\n searchLabel: string\n searchPlaceholder: string\n onSearchChange: (search: string) => void\n filters: readonly SearchFilterToolbarFilter[]\n view: SearchFilterToolbarView\n gridLabel: string\n listLabel: string\n onViewChange: (view: SearchFilterToolbarView) => void\n className?: string\n}\n\n/**\n * Render a consistent control row for searchable grid and list content.\n *\n * @param props - Search state, selectable filters, and view-mode state.\n * @returns Search input, filter tabs, and an accessible grid/list toggle.\n */\nexport function SearchFilterToolbar(props: SearchFilterToolbarProps): ReactNode {\n const nextView: SearchFilterToolbarView = props.view === 'grid' ? 'list' : 'grid'\n const nextViewLabel = nextView === 'grid' ? props.gridLabel : props.listLabel\n return h('div', { className: props.className === undefined ? css.toolbar : `${css.toolbar} ${props.className}` },\n h(Input, {\n className: css.search,\n value: props.search,\n placeholder: props.searchPlaceholder,\n 'aria-label': props.searchLabel,\n onChange: event => props.onSearchChange((event.target as HTMLInputElement).value),\n }),\n h('div', { className: css.filterGap }),\n ...props.filters.map(filter => h('button', {\n key: filter.id,\n type: 'button',\n className: filter.active ? css.filterOn : css.filter,\n title: filter.hint ?? `${filter.label} ${filter.count}`,\n 'aria-label': filter.hint ?? `${filter.label} ${filter.count}`,\n onClick: filter.onSelect,\n }, filter.icon, h('span', { className: css.filterCount }, filter.count))),\n h('div', { className: css.viewGap }),\n h('button', {\n type: 'button',\n className: css.viewSwitch,\n 'aria-label': nextViewLabel,\n title: nextViewLabel,\n onClick: () => props.onViewChange(nextView),\n }, h(ViewIcon, { mode: nextView })),\n )\n}\n\nfunction ViewIcon({ mode }: { mode: SearchFilterToolbarView }): ReactNode {\n const common = { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n return mode === 'list'\n ? h('svg', common, h('path', { d: 'M3 4h10M3 8h10M3 12h10' }))\n : h('svg', common, h('rect', { x: 2.5, y: 2.5, width: 4, height: 4, rx: .8 }), h('rect', { x: 9.5, y: 2.5, width: 4, height: 4, rx: .8 }), h('rect', { x: 2.5, y: 9.5, width: 4, height: 4, rx: .8 }), h('rect', { x: 9.5, y: 9.5, width: 4, height: 4, rx: .8 }))\n}\n","/**\n * The Agent Plugins Market settings section.\n *\n * Layout: repository sources run along the TOP as chips (全部 first), with\n * edit-current / add / refresh-all controls on the right; below sit search,\n * status tabs, and the card grid. Colors ride the dsh --dsw-alias-* tokens\n * with light-mode fallbacks so the page follows the active theme.\n */\nimport { createElement as h, useCallback, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { Button, Modal, Toast } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { postAction, type OverviewData, type SuiteCardData } from './api.js'\nimport { loadOverview, invalidateOverview, startSourceProgressPolling, type SourceProgressState } from './features/market/market-resource.js'\nimport { deriveMarketViewModel, type MarketCategory, type MarketFilter } from './features/market/market-view-model.js'\nimport { SourceTab } from './features/market/SourceTab.js'\nimport { SourceEditorModal, type EditorState } from './features/market/SourceEditorModal.js'\nimport { InstallConfirmModal, type InstallConfirmState } from './features/market/InstallConfirmModal.js'\nimport { SuiteCard } from './features/market/SuiteCard.js'\nimport { StatusIcon } from './ui/StatusIcon.js'\nimport type { Translate } from './index.js'\nimport type { CredentialApi } from './credentials.js'\nimport { ErrorBoundary } from './ErrorBoundary.js'\nimport { SuiteDetailModal } from './SuiteDetail.js'\nimport { SearchFilterToolbar } from './SearchFilterToolbar.js'\nimport css from './market.module.css'\n\n/** Host step keys -> translation keys, resolved against the active t(). */\nconst PROGRESS_STEP_LABELS: Record<string, string> = {\n cloning: 'progressCloning',\n downloading: 'progressDownloading',\n reading: 'progressReading'\n}\n\nexport interface MarketSectionProps {\n t: Translate\n /** Host credentials wire used for write-only MCP env configuration. */\n credentials?: CredentialApi\n /** The host surface controls only outer spacing; data and actions stay shared. */\n mode?: 'settings' | 'page'\n}\n\ntype Tab = MarketFilter\ntype Category = MarketCategory\ntype ViewMode = 'grid' | 'list'\n\ninterface ToastState {\n key: number\n message: string\n}\n\ninterface ConfirmState {\n kind: 'uninstall' | 'removeSource'\n sourceId: string\n suiteId?: string\n}\n\nfunction progressStepLabel(t: Translate, step: string): string {\n const key = PROGRESS_STEP_LABELS[step]\n return key === undefined ? step : t(key as Parameters<Translate>[0])\n}\n\n/** Keep parameterized copy compatible with hosts whose bound translator ignores params. */\nfunction interpolate(text: string, params: Record<string, unknown>): string {\n return text.replace(/\\{(\\w+)\\}/g, (match, key: string) => (key in params ? String(params[key]) : match))\n}\n\nexport function MarketSection({ t, credentials, mode = 'settings' }: MarketSectionProps): ReactNode {\n const [overview, setOverview] = useState<OverviewData>(() => loadOverview().initial)\n const [loading, setLoading] = useState(() => loadOverview().revalidating)\n const [search, setSearch] = useState('')\n const [tab, setTab] = useState<Tab>('all')\n const [category, setCategory] = useState<Category>('all')\n const [view, setView] = useState<ViewMode>('grid')\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [toast, setToast] = useState<ToastState | undefined>(undefined)\n const [confirm, setConfirm] = useState<ConfirmState | undefined>(undefined)\n const [installConfirm, setInstallConfirm] = useState<InstallConfirmState | undefined>(undefined)\n const [editor, setEditor] = useState<EditorState>(undefined)\n const [detail, setDetail] = useState<{ sourceId: string; suiteId: string } | undefined>(undefined)\n const [progress, setProgress] = useState<SourceProgressState>({ step: undefined, error: undefined })\n\n const refresh = useCallback(async () => {\n invalidateOverview()\n try {\n const data = await loadOverview().promise\n setOverview(data)\n } catch {\n setToast({ key: Date.now(), message: t('loadFail') })\n } finally {\n setLoading(false)\n }\n }, [t])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n const action = useCallback(\n async (key: string, path: string, body: Record<string, unknown>): Promise<boolean> => {\n setBusy(key)\n try {\n await postAction(path, body)\n invalidateOverview()\n await refresh()\n return true\n } catch (error) {\n setToast({ key: Date.now(), message: `${t('actionFail')}: ${error instanceof Error ? error.message : String(error)}` })\n return false\n } finally {\n setBusy(undefined)\n }\n },\n [refresh, t]\n )\n\n const viewModel = useMemo(() => deriveMarketViewModel(overview, search, tab, category), [overview, search, tab, category])\n const { scopeTotals, filtered } = viewModel\n\n const openUninstall = useCallback((suite: SuiteCardData) => {\n setConfirm({ kind: 'uninstall', sourceId: suite.sourceId, suiteId: suite.suiteId })\n }, [])\n\n const confirmAction = useCallback(async () => {\n if (confirm === undefined) return\n if (confirm.kind === 'uninstall' && confirm.suiteId !== undefined) {\n await action(`u:${confirm.suiteId}`, 'uninstall', { sourceId: confirm.sourceId, suiteId: confirm.suiteId })\n } else if (confirm.kind === 'removeSource') {\n await action(`s:${confirm.sourceId}`, 'sources/remove', { id: confirm.sourceId })\n if (category === confirm.sourceId) setCategory('all')\n }\n setConfirm(undefined)\n }, [confirm, action, category])\n\n const selectedSource = category === 'all' ? undefined : overview.sources.find(source => source.id === category)\n\n const adoptSource = useCallback(\n async (id: string) => {\n await action(`s:adopt:${id}`, 'sources/adopt', { id })\n },\n [action]\n )\n const unmanaged = overview.unmanaged ?? []\n\n return h(ErrorBoundary, {\n fallback: error => h('div', { className: css.empty }, `${t('actionFail')}: ${error.message}`),\n children: h(\n 'div',\n { className: mode === 'page' ? `${css.market} ${css.pageMode}` : css.market },\n h(\n 'header',\n { className: css.header },\n h(\n 'div',\n { className: css.titleRow },\n h('h2', { className: css.title }, t('nav')),\n h('div', { className: css.spacer }),\n h(\n 'div',\n { className: css.searchGroup },\n h(Button, { variant: 'ghost', size: 'sm', title: t('addSource'), onClick: () => setEditor({ mode: 'add' }) }, '+'),\n h(\n Button,\n {\n variant: 'ghost',\n size: 'sm',\n title: t('refreshAll'),\n onClick: () => {\n void action('s:refresh:all', 'sources/refresh', {})\n }\n },\n '↻'\n )\n )\n ),\n h(\n 'div',\n { className: css.marketControls },\n h(\n 'div',\n { className: css.sourceTabsRow },\n h(\n 'div',\n { className: css.sourceTabsScroll },\n h(SourceTab, {\n key: '__all__',\n t,\n active: category === 'all',\n label: `${t('tabAll')} ${overview.totals.all}`,\n onSelect: () => setCategory('all')\n }),\n ...[...overview.sources]\n .sort((a, b) => a.id.localeCompare(b.id))\n .map(source => {\n const notes = source.scanNotes ?? []\n const noteHint = notes.length === 0 ? undefined : `${t('scanNotes')}: ${notes.slice(0, 8).join(t('sourceErrorSeparator'))}`\n const kindBadge = source.local === true ? t('sourceLocal') : source.kind === 'archive' ? t('sourceArchive') : source.adopted === true ? t('sourceAdopted') : undefined\n return h(SourceTab, {\n key: source.id,\n t,\n active: category === source.id,\n label: `${source.id}${kindBadge === undefined ? '' : ` · ${kindBadge}`} ${source.suiteIds.length}${source.cloned === false || notes.length > 0 ? ' ⚠' : ''}`,\n title: noteHint,\n onSelect: () => setCategory(source.id),\n onDelete: () => setConfirm({ kind: 'removeSource', sourceId: source.id }),\n onEdit: selectedSource?.id === source.id ? () => setEditor({ mode: 'edit', source: source }) : undefined\n })\n })\n )\n ),\n unmanaged.length === 0\n ? null\n : h(\n 'div',\n { className: css.unmanagedRow },\n h('span', { className: css.unmanagedLabel }, t('unmanagedTitle')),\n ...unmanaged.map(entry =>\n h(\n 'span',\n { key: entry.id, className: css.unmanagedChip, title: entry.url ?? t('unmanagedNoRemote') },\n h('span', { className: css.unmanagedChipName }, entry.id),\n h(\n 'button',\n {\n type: 'button',\n className: css.unmanagedAdopt,\n disabled: busy !== undefined,\n title: t('unmanagedAdopt'),\n onClick: () => {\n void adoptSource(entry.id)\n }\n },\n '+'\n )\n )\n )\n ),\n h(SearchFilterToolbar, {\n search,\n searchLabel: t('searchPh'),\n searchPlaceholder: t('searchPh'),\n onSearchChange: setSearch,\n filters: [\n { id: 'all', label: t('tabAll'), count: scopeTotals.all, icon: h(StatusIcon, { kind: 'all' }), active: tab === 'all', onSelect: () => setTab('all') },\n {\n id: 'installed',\n label: t('tabInstalled'),\n count: scopeTotals.installed,\n icon: h(StatusIcon, { kind: 'installed' }),\n active: tab === 'installed',\n onSelect: () => setTab('installed')\n },\n {\n id: 'uninstalled',\n label: t('tabUninstalled'),\n count: scopeTotals.all - scopeTotals.installed,\n icon: h(StatusIcon, { kind: 'uninstalled' }),\n active: tab === 'uninstalled',\n onSelect: () => setTab('uninstalled')\n }\n ],\n view,\n gridLabel: t('grid'),\n listLabel: t('list'),\n onViewChange: nextView => setView(nextView)\n })\n )\n ),\n h(\n 'main',\n { className: view === 'grid' ? css.grid : css.list },\n loading\n ? h('div', { className: css.empty }, t('loading'))\n : filtered.length === 0\n ? h('div', { className: css.empty }, tab === 'installed' ? t('installedEmpty') : t('empty'))\n : filtered.map(suite =>\n h(SuiteCard, {\n key: `${suite.sourceId}/${suite.suiteId}`,\n t,\n suite,\n busy: busy !== undefined,\n onOpen: () => setDetail({ sourceId: suite.sourceId, suiteId: suite.suiteId }),\n onInstall: () => {\n const source = overview.sources.find(entry => entry.id === suite.sourceId)\n setInstallConfirm({\n suite,\n ...(source?.lockCommit === undefined ? {} : { lockCommit: source.lockCommit }),\n ...(source?.local === true ? { localSource: true } : {})\n })\n },\n onAddSource: () => {\n if (suite.remoteUrl !== undefined) void action(`a:${suite.suiteId}`, 'sources/add', { url: suite.remoteUrl })\n },\n onToggle: () => {\n void action(`e:${suite.suiteId}`, 'set-enabled', { sourceId: suite.sourceId, suiteId: suite.suiteId, enabled: !suite.enabled })\n },\n onRefresh: () => {\n void action(`r:${suite.suiteId}`, 'sources/refresh', { id: suite.sourceId })\n },\n onUninstall: () => openUninstall(suite)\n })\n )\n ),\n toast === undefined ? null : h(Toast, { key: toast.key, text: toast.message, onDone: () => setToast(undefined) }),\n installConfirm === undefined\n ? null\n : h(InstallConfirmModal, {\n t,\n state: installConfirm,\n busy: busy !== undefined,\n onClose: () => setInstallConfirm(undefined),\n onConfirm: async () => {\n const ok = await action(`i:${installConfirm.suite.suiteId}`, 'install', {\n sourceId: installConfirm.suite.sourceId,\n suiteId: installConfirm.suite.suiteId\n })\n if (ok) setInstallConfirm(undefined)\n return ok\n }\n }),\n confirm === undefined\n ? null\n : h(Modal, {\n open: true,\n onClose: () => setConfirm(undefined),\n title:\n confirm.kind === 'uninstall'\n ? t('uninstallConfirmTitle')\n : interpolate(t('removeSourceConfirmTitle', { sourceId: confirm.sourceId }), { sourceId: confirm.sourceId }),\n closeLabel: t('cancel'),\n description: confirm.kind === 'uninstall' ? t('uninstallConfirmDesc') : t('removeSourceConfirmDesc'),\n footer: h(\n 'div',\n { className: css.modalFooter },\n h(Button, { variant: 'ghost', onClick: () => setConfirm(undefined) }, t('cancel')),\n h(\n Button,\n {\n variant: 'primary',\n onClick: () => {\n void confirmAction()\n }\n },\n t('confirmDelete')\n )\n )\n }),\n detail === undefined\n ? null\n : h(SuiteDetailModal, {\n t,\n credentials,\n sourceId: detail.sourceId,\n suiteId: detail.suiteId,\n onClose: () => setDetail(undefined)\n }),\n editor === undefined\n ? null\n : h(SourceEditorModal, {\n t,\n editor,\n busy: busy !== undefined,\n progress,\n onClose: () => setEditor(undefined),\n onSave: async ({ url, branch, kind, sha256 }) => {\n const key = editor.mode === 'edit' ? `s:edit:${editor.source.id}` : `s:add:${url}`\n const body: Record<string, unknown> = { url, local: kind === 'local', kind }\n if (branch !== '' && kind === 'git') body['branch'] = branch\n if (sha256 !== '' && kind === 'archive') body['sha256'] = sha256\n if (editor.mode === 'add') {\n setBusy(key)\n setProgress({ step: t('progressStarting'), error: undefined })\n const poll = startSourceProgressPolling(setProgress, step => progressStepLabel(t, step))\n try {\n const payload = await postAction('sources/add', body)\n const derived = (payload['source'] as { id?: string } | undefined)?.id\n invalidateOverview()\n await refresh()\n setEditor(undefined)\n if (derived !== undefined) setCategory(derived)\n return true\n } catch (error) {\n setToast({ key: Date.now(), message: `${t('actionFail')}: ${error instanceof Error ? error.message : String(error)}` })\n setProgress({ step: undefined, error: error instanceof Error ? error.message : String(error) })\n return false\n } finally {\n poll.stop()\n setBusy(undefined)\n }\n }\n const ok = await action(key, 'sources/update', { id: editor.source.id, ...body })\n if (ok) setEditor(undefined)\n return ok\n },\n onRemove: async id => {\n setConfirm({ kind: 'removeSource', sourceId: id })\n setEditor(undefined)\n }\n })\n )\n })\n}\n","/** Pure MCP status filtering and count derivation. */\nimport type { McpStatusEntry, McpStatusPayload } from '../../api.js'\n\n/** MCP status list filter. */\nexport type McpStatusFilter = 'all' | 'plugin' | 'direct'\n\n/** Derived MCP list data used by the status screen. */\nexport interface McpStatusViewModel {\n activeEntries: McpStatusEntry[]\n filtered: McpStatusEntry[]\n filterCounts: { all: number; plugin: number; direct: number }\n /** Counted over the active (non-disabled-hidden) rows for the current view. */\n visibleTotals: { all: number; connected: number; degraded: number; failed: number; needsCredentials: number; orphaned: number; disabled: number; foreign: number }\n}\n\ninterface SearchableEntry {\n entry: McpStatusEntry\n haystack: string\n}\n\nconst searchableCache = new WeakMap<McpStatusPayload, SearchableEntry[]>()\n\n/** Derive active rows, filter counts, and visible rows in one pass. */\nexport function deriveMcpStatusViewModel(payload: McpStatusPayload, filter: McpStatusFilter, search: string): McpStatusViewModel {\n const searchable = searchableFor(payload)\n const activeEntries = searchable.map(item => item.entry)\n const filterCounts = { all: 0, plugin: 0, direct: 0 }\n const visibleTotals = { all: 0, connected: 0, degraded: 0, failed: 0, needsCredentials: 0, orphaned: 0, disabled: 0, foreign: 0 }\n const filtered: McpStatusEntry[] = []\n const needle = search.trim().toLowerCase()\n\n for (const item of searchable) {\n const entry = item.entry\n filterCounts.all++\n filterCounts[entry.kind]++\n visibleTotals.all++\n if (entry.state === 'connected') visibleTotals.connected++\n if (entry.state === 'degraded') visibleTotals.degraded++\n if (entry.state === 'failed') visibleTotals.failed++\n if (entry.state === 'needs-credentials') visibleTotals.needsCredentials++\n if (entry.state === 'orphaned') visibleTotals.orphaned++\n if (entry.state === 'disabled') visibleTotals.disabled++\n if (entry.state === 'foreign') visibleTotals.foreign++\n if (filter !== 'all' && entry.kind !== filter) continue\n if (needle !== '' && !item.haystack.includes(needle)) continue\n filtered.push(entry)\n }\n\n return {\n activeEntries,\n filtered,\n filterCounts,\n visibleTotals\n }\n}\n\nfunction searchableFor(payload: McpStatusPayload): SearchableEntry[] {\n const cached = searchableCache.get(payload)\n if (cached !== undefined) return cached\n const searchable = payload.entries\n .filter(entry => entry.state !== 'disabled')\n .map(entry => ({\n entry,\n haystack: `${entry.name} ${entry.source ?? ''} ${entry.endpoint ?? ''} ${entry.transport} ${entry.reason ?? ''} ${(entry.credentialRefs ?? []).join(' ')}`.toLowerCase()\n }))\n searchableCache.set(payload, searchable)\n return searchable\n}\n",".surface {\n display: flex;\n min-width: 0;\n flex-direction: column;\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n.header {\n display: flex;\n flex: none;\n align-items: center;\n gap: 8px;\n padding: 4px 0 8px;\n}\n.title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n.subtitle {\n margin: 2px 0 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 13px;\n line-height: 20px;\n}\n.headerActions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n.summary {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n color: var(--dsw-alias-label-secondary, #667085);\n font-size: 12px;\n white-space: nowrap;\n}\n.errorSummary {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n}\n/* Summary bar: one chip per non-healthy state, plus the observation time. */\n.summaryBar {\n display: flex;\n flex: none;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n}\n.summaryChip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n}\n.chiporphaned, .chipfailed {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n}\n.chipneedsCredentials, .chipdegraded {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231));\n}\n.chipdisabled {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-1, #fff);\n}\n.summaryAllGood {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n color: var(--dsw-alias-state-success-primary, #16a34a);\n font-size: 12px;\n}\n.summaryCount {\n font-weight: 700;\n}\n.summaryLabel {\n color: inherit;\n}\n.observedAt {\n margin-left: auto;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n white-space: nowrap;\n}\n.summaryDotGreen, .summaryDotRed {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n}\n.summaryDotGreen { background: var(--dsw-alias-state-success-primary, #16a34a); }\n.summaryDotRed { background: var(--dsw-alias-state-error-primary, #dc2626); }\n.summaryDotWarn { background: var(--dsw-alias-state-warn-primary, #b45309); }\n.summaryDotInfo { background: var(--dsw-alias-brand-primary, #4f6ef7); }\n.toolbar {\n flex: none;\n margin-bottom: 24px;\n}\n.grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n min-width: 0;\n gap: 12px;\n align-content: start;\n}\n.list {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 8px;\n}\n.list .card {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n column-gap: 14px;\n row-gap: 8px;\n}\n.list .cardTop {\n flex: 0 1 260px;\n}\n.list .endpoint {\n flex: 1 1 200px;\n max-height: 18px;\n}\n.card {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n color: inherit;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 12px;\n cursor: pointer;\n font: inherit;\n text-align: left;\n user-select: none;\n transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;\n}\n.card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-interactive-bg-hover, rgba(38, 49, 72, 0.06));\n box-shadow: 0 1px 4px rgba(16, 24, 40, 0.06);\n}\n.cardBody {\n display: flex;\n min-width: 0;\n flex: 1;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px 10px;\n}\n\n.card:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n.cardTop {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n.statusDot {\n width: 7px;\n height: 7px;\n flex: none;\n border-radius: 50%;\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n.statusconnected { background: var(--dsw-alias-state-success-primary, #16a34a); }\n.statusdegraded { background: var(--dsw-alias-state-warn-primary, #b45309); }\n.statusfailed { background: var(--dsw-alias-state-error-primary, #dc2626); }\n.statusneeds-credentials { background: var(--dsw-alias-state-warn-primary, #b45309); }\n.statusorphaned { background: var(--dsw-alias-state-error-primary, #dc2626); }\n.statusdisabled { background: var(--dsw-alias-label-tertiary, #98a2b3); }\n.service {\n flex: 1;\n min-width: 0;\n}\n.name {\n display: block;\n overflow: hidden;\n color: var(--dsw-alias-label-primary, #1f2328);\n text-overflow: ellipsis;\n white-space: nowrap;\n font: 600 13px/22px ui-monospace, Menlo, Consolas, monospace;\n}\n.endpoint {\n /* Two-line truncation without legacy -webkit-box line clamping: the\n nested-scroll compositor paints -webkit-box text outside its box when\n the surrounding page re-scrolls, so cap the block height instead. */\n max-height: 36px;\n overflow: hidden;\n margin: 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font: 12px/18px ui-monospace, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n}\n.sourcePlugin, .sourceDirect, .transport, .toolCount {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n padding: 1px 6px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n border-radius: 4px;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n line-height: 18px;\n}\n.sourcePlugin svg, .sourceDirect svg {\n width: 14px;\n height: 14px;\n flex: none;\n color: currentColor;\n stroke: currentColor;\n stroke-width: 1.35;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n.transport {\n font-family: ui-monospace, Menlo, Consolas, monospace;\n}\n.toolCount {\n flex: none;\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n}\n.reasonLabel {\n flex: none;\n font-weight: 600;\n opacity: 0.85;\n}\n/* State pill: the card's one-line verdict, color-coded by severity. */\n.statePill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 17px;\n white-space: nowrap;\n font-weight: 600;\n}\n.statePill::before {\n width: 6px;\n height: 6px;\n content: '';\n background: currentColor;\n border-radius: 50%;\n}\n.stateconnected {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, rgb(230, 250, 237));\n}\n.statedegraded, .stateneeds-credentials {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231));\n}\n.statefailed, .stateorphaned {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n}\n.statedisabled {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n}\n/* Card left accent follows the state so scanning the grid is instant. */\n.cardConnected { border-left: 3px solid var(--dsw-alias-state-success-primary, #16a34a); }\n.cardDegraded, .cardNeedsCredentials { border-left: 3px solid var(--dsw-alias-state-warn-primary, #b45309); }\n.cardFailed, .cardOrphaned { border-left: 3px solid var(--dsw-alias-state-error-primary, #dc2626); }\n.cardDisabled { border-left: 3px solid var(--dsw-alias-label-tertiary, #98a2b3); }\n.state, .detailState {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n color: var(--dsw-alias-state-success-primary, #16a34a);\n font-size: 11px;\n white-space: nowrap;\n}\n.state::before, .detailState::before {\n width: 6px;\n height: 6px;\n content: '';\n background: currentColor;\n border-radius: 50%;\n}\n.stateconnected, .detailStateconnected { color: var(--dsw-alias-state-success-primary, #16a34a); }\n.statedegraded, .detailStatedegraded { color: var(--dsw-alias-state-warn-primary, #b45309); }\n.statefailed, .detailStatefailed { color: var(--dsw-alias-state-error-primary, #dc2626); }\n.stateneeds-credentials, .detailStateneeds-credentials { color: var(--dsw-alias-state-warn-primary, #b45309); }\n.stateorphaned, .detailStateorphaned { color: var(--dsw-alias-state-error-primary, #dc2626); }\n.statedisabled, .detailStatedisabled { color: var(--dsw-alias-label-tertiary, #98a2b3); }\n.chevron { color: var(--dsw-alias-label-tertiary, #8b93a1); font-size: 18px; }\n.empty, .detailEmpty {\n padding: 24px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 12px;\n text-align: center;\n}\n.error {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 16px 0;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-size: 12px;\n}\n.boundary {\n margin: 10px 0 0;\n padding: 9px 10px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border-left: 2px solid var(--dsw-alias-border-l3, #d9dde3);\n font-size: 11px;\n line-height: 17px;\n}\n.detailDialog { width: min(720px, 94vw); }\n.detailBody { max-height: 72vh; overflow-y: auto; }\n.modalFooter { display: flex; justify-content: flex-end; width: 100%; }\n.detail { display: flex; flex-direction: column; gap: 16px; }\n.detailMeta { display: flex; flex-wrap: wrap; gap: 6px; }\n/* Modal hero: state + endpoint above the fold. */\n.detailHero {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n}\n.detailHeroText {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 5px;\n}\n.detailEndpoint {\n margin: 0;\n color: var(--dsw-alias-label-secondary, #667085);\n overflow-wrap: anywhere;\n font: 12px/18px ui-monospace, Menlo, Consolas, monospace;\n}\n.reason {\n padding: 9px 10px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n border-left: 2px solid currentColor;\n font-size: 11px;\n line-height: 16px;\n}\n.reasonBox {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 10px 12px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n border-radius: 8px;\n}\n.reasonText {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 12px;\n line-height: 18px;\n}\n.detailSection { display: flex; flex-direction: column; gap: 7px; }\n.detailHead {\n margin: 0;\n padding-bottom: 5px;\n color: var(--dsw-alias-label-secondary, #667085);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n font-size: 12px;\n font-weight: 600;\n}\n.config {\n max-height: 220px;\n overflow: auto;\n margin: 0;\n padding: 10px;\n color: var(--dsw-alias-label-primary, #344054);\n background: var(--dsw-alias-bg-layer-2, #f6f8fc);\n border: 1px solid var(--dsw-alias-border-l1, #e2e7ef);\n border-radius: 7px;\n white-space: pre-wrap;\n word-break: break-word;\n font: 11px/17px ui-monospace, Menlo, Consolas, monospace;\n}\n.toolList { display: flex; flex-direction: column; }\n/* Two columns: the name track sizes to its content (long MCP tool names are\n the identity, never clipped), the description takes the remainder. */\n.tool {\n display: grid;\n grid-template-columns: minmax(140px, max-content) minmax(0, 1fr);\n gap: 12px;\n align-items: center;\n padding: 7px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n}\n.tool:last-child { border-bottom: none; }\n.toolName { overflow: hidden; color: var(--dsw-alias-label-primary, #1f2328); text-overflow: ellipsis; white-space: nowrap; font: 11px/16px ui-monospace, Menlo, Consolas, monospace; }\n.toolDescription { overflow: hidden; color: var(--dsw-alias-label-tertiary, #8b93a1); text-overflow: ellipsis; white-space: nowrap; font-size: 10px; }\n@media (max-width: 760px) {\n .header, .toolbar { padding-left: 0; padding-right: 0; }\n .header { flex-direction: column; }\n .headerActions { width: 100%; margin-left: 0; justify-content: space-between; }\n .grid { grid-template-columns: minmax(0, 1fr); }\n .list .cardTop { max-width: 100%; }\n .tool { grid-template-columns: minmax(0, 1fr); }\n .toolDescription { display: none; }\n .summaryBar { gap: 6px; padding: 8px 10px; }\n .observedAt { flex-basis: 100%; margin-left: 0; }\n}\n\n/* ── LSP status states (reuse the MCP pill/accent palette) ──────────────── */\n.statemounted {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, rgb(230, 250, 237));\n}\n.statehost-missing {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231));\n}\n.stateconflict {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, rgba(236, 19, 19, 0.05));\n}\n.statusmounted {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n.statushost-missing {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n}\n.statusconflict {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n.cardMounted { border-left: 3px solid var(--dsw-alias-state-success-primary, #16a34a); }\n.cardHostMissing { border-left: 3px solid var(--dsw-alias-state-warn-primary, #b45309); }\n.cardConflict { border-left: 3px solid var(--dsw-alias-state-error-primary, #dc2626); }\n.chipmounted { background: var(--dsw-alias-state-success-tertiary, rgb(230, 250, 237)); }\n.chipblocked { background: var(--dsw-alias-state-warn-tertiary, rgb(254, 245, 231)); }\n\n/* ── Panel polish: spacing between header/summary/toolbar, compact rows ─── */\n.summaryBar + .toolbar,\n.toolbar {\n margin-top: 12px;\n}\n.header + .summaryBar {\n margin-top: 12px;\n}\n\n/* Hide the entire summary bar when every row is healthy: the green\n \"all good\" confirmation repeated above a green-stamped list is noise. */\n@media (prefers-reduced-data: no-preference) {\n /* no-op block keeps the section marker above meaningful rules only */\n}\n\n/* Compact list mode: one-line rows (state · name · meta pill on the right). */\n.list .card {\n min-height: 0;\n padding: 2px 0;\n}\n.list .cardBody {\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: 12px;\n padding: 8px 14px;\n}\n.list .cardTop {\n flex: 0 1 300px;\n min-width: 0;\n}\n.list .endpoint {\n flex: 1 1 240px;\n max-height: 22px;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n/* LSP extension-map rows: no index column — extension gets room to breathe. */\n.extRow {\n display: grid;\n grid-template-columns: minmax(64px, auto) 20px minmax(0, 1fr);\n gap: 10px;\n align-items: center;\n padding: 7px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n}\n.extRow:last-child { border-bottom: none; }\n.extName { color: var(--dsw-alias-label-primary, #1f2328); font: 12px/18px ui-monospace, Menlo, Consolas, monospace; }\n.extArrow { color: var(--dsw-alias-label-tertiary, #8b93a1); }\n.extLanguage { overflow: hidden; color: var(--dsw-alias-label-tertiary, #8b93a1); text-overflow: ellipsis; white-space: nowrap; font: 12px/18px ui-monospace, Menlo, Consolas, monospace; }\n\n/* ── Detail-dialog retry control: spinner + in-place outcome echo ────── */\n.retryStack {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n margin-right: 4px;\n}\n.retrySpinner {\n display: inline-flex;\n font-size: 13px;\n line-height: 1;\n}\n.spinning {\n animation: mcp-retry-spin 0.9s linear infinite;\n}\n@keyframes mcp-retry-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n@media (prefers-reduced-motion: reduce) {\n .spinning { animation: none; }\n}\n.retryEchoSuccess,\n.retryEchoFailure {\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n}\n.retryEchoSuccess { color: var(--dsw-alias-state-success-primary, #16a34a); }\n.retryEchoFailure { color: var(--dsw-alias-state-error-primary, #dc2626); }\n.statusstarting {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n animation: lspStartingPulse 1.2s ease-in-out infinite;\n}\n@keyframes lspStartingPulse {\n 50% { opacity: 0.35; }\n}\n\n.statusforeign { background: var(--dsw-alias-brand-primary, #4f6ef7); }\n\n.cardForeign { border-left: 3px solid var(--dsw-alias-brand-primary, #4f6ef7); }\n\n.reasonRaw {\n margin: 6px 0 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n line-height: 1.5;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n word-break: break-all;\n}\n","import { useEffect, useState, type ReactNode } from 'react'\nimport { createElement as h } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { Translate } from './index.js'\nimport { fetchMcpStatus, reauthorizeMcpServer, retryMcpMounts, type McpStatusEntry, type McpStatusPayload } from './api.js'\nimport type { CredentialApi } from './credentials.js'\nimport { McpCredentialEditor } from './McpCredentialEditor.js'\nimport { SearchFilterToolbar, type SearchFilterToolbarView } from './SearchFilterToolbar.js'\nimport { deriveMcpStatusViewModel, type McpStatusFilter } from './features/mcp-status/mcp-status-view-model.js'\nimport css from './mcp-status.module.css'\n\ninterface McpStatusPanelProps {\n t: Translate\n credentials?: CredentialApi\n}\n\ntype Filter = McpStatusFilter\ntype ViewMode = SearchFilterToolbarView\n\nconst EMPTY_STATUS: McpStatusPayload = {\n entries: [],\n observedAt: '',\n totals: { all: 0, connected: 0, degraded: 0, failed: 0, needsCredentials: 0, orphaned: 0, disabled: 0, foreign: 0 },\n directObservationOnly: true\n}\n\n/** DSH-native MCP inventory with a per-state overview and per-service detail. */\nexport function McpStatusPanel({ t, credentials }: McpStatusPanelProps): ReactNode {\n const [payload, setPayload] = useState<McpStatusPayload>(EMPTY_STATUS)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | undefined>(undefined)\n const [filter, setFilter] = useState<Filter>('all')\n const [search, setSearch] = useState('')\n const [view, setView] = useState<ViewMode>('grid')\n const [selected, setSelected] = useState<McpStatusEntry | undefined>(undefined)\n\n const retry = (entryId: string): Promise<boolean> => {\n return retryMcpMounts()\n .then(async () => {\n // The POST only acknowledges that a reconcile ran; the mount's real\n // verdict arrives in the refreshed status, so the outcome echo reads\n // the state instead of trusting the request.\n const refreshed = await fetchMcpStatus().catch(() => undefined)\n if (refreshed !== undefined) setPayload(refreshed)\n return refreshed?.entries.some(entry => entry.id === entryId && entry.state === 'connected') === true\n })\n .catch(async caught => {\n setError(caught instanceof Error ? caught.message : String(caught))\n // Still re-read: the failure may be transport-level while the mount\n // actually settled; the echo follows the observed state.\n const refreshed = await fetchMcpStatus().catch(() => undefined)\n if (refreshed !== undefined) setPayload(refreshed)\n return refreshed?.entries.some(entry => entry.id === entryId && entry.state === 'connected') === true\n })\n .finally(() => setLoading(false))\n }\n const reauthorize = (serverName: string): Promise<void> => {\n return reauthorizeMcpServer(serverName)\n .then(() => retryMcpMounts())\n .then(async () => {\n await new Promise(resolve => setTimeout(resolve, 500))\n const refreshed = await fetchMcpStatus().catch(() => undefined)\n if (refreshed !== undefined) setPayload(refreshed)\n })\n }\n\n const refresh = (): void => {\n setLoading(true)\n setError(undefined)\n fetchMcpStatus()\n .then(setPayload)\n .catch(caught => {\n setError(caught instanceof Error ? caught.message : String(caught))\n })\n .finally(() => setLoading(false))\n }\n\n useEffect(() => {\n refresh()\n }, [])\n\n const viewModel = deriveMcpStatusViewModel(payload, filter, search)\n const { activeEntries, filtered, filterCounts, visibleTotals } = viewModel\n // Hide the summary bar entirely while every active row is connected: the\n // green confirmation above an all-green list is noise, not information.\n const allHealthy = activeEntries.length > 0 && visibleTotals.connected === activeEntries.length\n\n return h(\n 'div',\n { className: css.surface },\n h(\n 'header',\n { className: css.header },\n h(\n 'div',\n { className: css.headerText },\n h('h2', { className: css.title }, t('mcpStatusTitle')),\n h('p', { className: css.subtitle }, t('mcpStatusSubtitle'))\n ),\n h(\n 'div',\n { className: css.headerActions },\n h(Button, { variant: 'ghost', size: 'sm', onClick: refresh, disabled: loading, title: t('refresh') }, `↻ ${t('refresh')}`)\n )\n ),\n activeEntries.length === 0 || allHealthy || loading\n ? null\n : h(StatusSummaryBar, { t, totals: visibleTotals, observedAt: payload.observedAt }),\n h(SearchFilterToolbar, {\n className: css.toolbar,\n search,\n searchLabel: t('mcpSearch'),\n searchPlaceholder: t('mcpSearch'),\n onSearchChange: setSearch,\n filters: (['all', 'plugin', 'direct'] as Filter[]).map(kind => ({\n id: kind,\n label: filterLabel(t, kind),\n count: filterCounts[kind],\n icon: h(McpFilterIcon, { kind }),\n active: filter === kind,\n onSelect: () => setFilter(kind),\n hint: mcpFilterHint(t, kind)\n })),\n view,\n gridLabel: t('grid'),\n listLabel: t('list'),\n onViewChange: nextView => setView(nextView)\n }),\n error !== undefined\n ? h('div', { className: css.error }, error, h(Button, { variant: 'ghost', size: 'sm', onClick: refresh }, t('mcpRetry')))\n : loading && activeEntries.length === 0\n ? h('div', { className: css.empty }, t('loading'))\n : filtered.length === 0\n ? h('div', { className: css.empty }, t('mcpEmpty'))\n : h(\n 'div',\n { className: view === 'grid' ? css.grid : css.list },\n filtered.map(entry => h(McpCard, { key: entry.id, entry, t, onClick: () => setSelected(entry) }))\n ),\n selected === undefined ? null : h(McpDetailModal, { entry: selected, t, credentials, onClose: () => setSelected(undefined), onRetry: retry, onReauthorize: reauthorize })\n )\n}\n\n/**\n * One chip per non-healthy state, shown only when that state is non-zero.\n *\n * The chips are ordered by severity so the first one the eye lands on is the\n * state that most needs attention, and the whole bar collapses to a single\n * \"all connected\" confirmation when nothing is wrong.\n */\nfunction StatusSummaryBar({ t, totals, observedAt }: { t: Translate; totals: McpStatusPayload['totals']; observedAt: string }): ReactNode {\n const chips: Array<{ key: string; count: number; label: string }> = [\n { key: 'orphaned', count: totals.orphaned, label: t('mcpOrphaned') },\n { key: 'failed', count: totals.failed, label: t('mcpFailed') },\n { key: 'needsCredentials', count: totals.needsCredentials, label: t('mcpNeedsCredentials') },\n { key: 'degraded', count: totals.degraded, label: t('mcpDegraded') },\n { key: 'foreign', count: totals.foreign, label: t('mcpForeign') },\n { key: 'disabled', count: totals.disabled, label: t('mcpDisabled') }\n ].filter(chip => chip.count > 0)\n\n return h(\n 'div',\n { className: css.summaryBar },\n chips.length === 0\n ? h('span', { className: css.summaryAllGood }, h('span', { className: css.summaryDotGreen }), t('mcpAllConnected'))\n : chips.map(chip =>\n h(\n 'span',\n { key: chip.key, className: `${css.summaryChip} ${css[`chip${chip.key}`]}`, title: `${chip.count} ${chip.label}` },\n h('span', { className: css[`summaryDot${dotTone(chip.key)}`] }),\n h('span', { className: css.summaryCount }, chip.count),\n h('span', { className: css.summaryLabel }, chip.label)\n )\n ),\n h('span', { className: css.observedAt }, observedAt === '' ? '' : formatObservedAt(observedAt))\n )\n}\n\nfunction dotTone(key: string): string {\n if (key === 'foreign') return 'Info'\n if (key === 'degraded' || key === 'needsCredentials') return 'Warn'\n return 'Red'\n}\n\nfunction formatObservedAt(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return ''\n return date.toLocaleTimeString()\n}\n\nfunction McpCard({ entry, t, onClick }: { entry: McpStatusEntry; t: Translate; onClick: () => void }): ReactNode {\n const interactive = { role: 'button' as const, tabIndex: 0, onClick, onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n // Enter and Space activate a role=\"button\" the same way a native one does.\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n onClick()\n } }\n return h(\n 'div',\n { className: `${css.card} ${css[`card${stateClass(entry.state)}`]}`, ...interactive },\n h(\n 'div',\n { className: css.cardBody },\n h(\n 'div',\n { className: css.cardTop },\n h('span', { className: `${css.statusDot} ${css[`status${entry.state}`]}`, 'aria-hidden': true }),\n h('span', { className: css.service }, h('span', { className: css.name }, entry.name)),\n h('span', { className: css.toolCount }, entry.tools.length === 1 ? `${entry.tools.length} ${t('mcpTool')}` : `${entry.tools.length} ${t('mcpTools')}`)\n ),\n h('p', { className: css.endpoint }, entry.endpoint ?? t('mcpObservedEndpoint'))\n // Reason text, the state pill, and every action (retry, configure,\n // details) live in the detail dialog: the card keeps only the identity\n // line and the endpoint, so a wall of red cards stays scannable.\n )\n )\n}\n\nfunction stateClass(state: string): string {\n return state\n .split('-')\n .map((part, index) => (index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))\n .join('')\n .replace(/^./, char => char.toUpperCase())\n}\n\nfunction McpSourceIcon({ kind }: { kind: 'plugin' | 'direct' }): ReactNode {\n const common = { width: 14, height: 14, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n return kind === 'plugin'\n ? h(\n 'svg',\n common,\n h('path', {\n d: 'M6 2.5v2H4A1.5 1.5 0 0 0 2.5 6v2h2a1.5 1.5 0 1 1 0 3h-2v2A1.5 1.5 0 0 0 4 14.5h2v-2a1.5 1.5 0 1 1 3 0v2h2a1.5 1.5 0 0 0 1.5-1.5v-2h-2a1.5 1.5 0 1 1 0-3h2V6A1.5 1.5 0 0 0 11 4.5H9v-2a1.5 1.5 0 1 0-3 0Z'\n })\n )\n : h('svg', common, h('circle', { cx: 8, cy: 5, r: 2.2 }), h('path', { d: 'M3.5 13c.6-2.2 2.1-3.3 4.5-3.3s3.9 1.1 4.5 3.3' }))\n}\n\nfunction McpFilterIcon({ kind }: { kind: Filter }): ReactNode {\n if (kind === 'plugin') return h(McpSourceIcon, { kind: 'plugin' })\n if (kind === 'direct') return h(McpSourceIcon, { kind: 'direct' })\n return h(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true },\n h('path', { d: 'M2.5 5 8 2.5 13.5 5 8 7.5 2.5 5Zm0 3L8 10.5 13.5 8M2.5 11 8 13.5 13.5 11' })\n )\n}\n\n/**\n * The detail dialog owns every action and every long text: state, reason,\n * credentials, config, tools, and the retry control with its in-place result\n * echo. The state pill is dropped entirely — the dot and the reason box carry\n * that information without a second red stamp.\n */\nfunction McpDetailModal({ entry, t, credentials, onClose, onRetry, onReauthorize }: {\n entry: McpStatusEntry\n t: Translate\n credentials?: CredentialApi\n onClose: () => void\n onRetry: (entryId: string) => Promise<boolean>\n onReauthorize: (serverName: string) => Promise<void>\n}): ReactNode {\n const [retrying, setRetrying] = useState(false)\n const [retryOutcome, setRetryOutcome] = useState<'success' | 'failure' | undefined>(undefined)\n const [reauthorizing, setReauthorizing] = useState(false)\n const [reauthOutcome, setReauthOutcome] = useState<'success' | 'failure' | undefined>(undefined)\n const retry = (): void => {\n setRetrying(true)\n setRetryOutcome(undefined)\n onRetry(entry.id)\n .then(success => setRetryOutcome(success ? 'success' : 'failure'))\n .catch(() => setRetryOutcome('failure'))\n .finally(() => setRetrying(false))\n }\n const reauthorize = (): void => {\n setReauthorizing(true)\n setReauthOutcome(undefined)\n onReauthorize(entry.name)\n .then(() => setReauthOutcome('success'))\n .catch(() => setReauthOutcome('failure'))\n .finally(() => setReauthorizing(false))\n }\n return h(Modal, {\n open: true,\n onClose,\n title: entry.name,\n description: t('mcpServiceDetail'),\n closeLabel: t('cancel'),\n className: css.detailDialog,\n contentClassName: css.detailBody,\n footer: h(\n 'div',\n { className: css.modalFooter },\n entry.kind === 'direct' || entry.state === 'connected' || entry.state === 'disabled' || entry.state === 'foreign'\n ? null\n : h(\n 'span',\n { className: css.retryStack },\n retryOutcome === 'success'\n ? h('span', { className: css.retryEchoSuccess, role: 'status' }, `✓ ${t('mcpRetrySuccess')}`)\n : retryOutcome === 'failure'\n ? h('span', { className: css.retryEchoFailure, role: 'alert' }, `✕ ${t('mcpRetryFailure')}`)\n : null,\n h(\n Button,\n { variant: 'ghost', size: 'sm', disabled: retrying, onClick: retry },\n h('span', { className: retrying ? `${css.retrySpinner} ${css.spinning}` : css.retrySpinner, 'aria-hidden': true }, '↻'),\n retrying ? t('mcpRetrying') : t('mcpRetry')\n )\n ),\n entry.kind === 'plugin'\n ? h(\n 'span',\n { className: css.retryStack },\n reauthOutcome === 'success'\n ? h('span', { className: css.retryEchoSuccess, role: 'status' }, `✓ ${t('mcpReauthSuccess')}`)\n : reauthOutcome === 'failure'\n ? h('span', { className: css.retryEchoFailure, role: 'alert' }, `✕ ${t('mcpReauthFailure')}`)\n : null,\n h(\n Button,\n { variant: 'ghost', size: 'sm', disabled: reauthorizing, title: entry.state === 'failed' ? t('mcpConnectHint') : t('mcpReauthHint'), onClick: reauthorize },\n reauthorizing ? t('mcpReauthorizing') : entry.state === 'failed' ? t('mcpConnect') : t('mcpReauthorize')\n )\n )\n : null,\n h(Button, { variant: 'ghost', onClick: onClose }, t('cancel'))\n ),\n children: h(\n 'div',\n { className: css.detail },\n h(\n 'div',\n { className: css.detailHero },\n h('span', { className: `${css.statusDot} ${css[`status${entry.state}`]}`, 'aria-hidden': true }),\n h(\n 'div',\n { className: css.detailHeroText },\n entry.endpoint === undefined ? null : h('p', { className: css.detailEndpoint }, entry.endpoint),\n // Source and transport moved here from the card meta row.\n h('p', { className: css.detailEndpoint }, [\n entry.kind === 'plugin' ? `${t('mcpPlugin')}: ${entry.source ?? '—'}` : t('mcpDirect'),\n entry.transport\n ].join(' · '))\n )\n ),\n // A foreign mount is informational: the localized hint (per cause —\n // another plugin, or another source's identical suite) replaces the raw\n // English reason, which drops to a dim secondary line for its details.\n entry.state === 'foreign'\n ? h(\n 'div',\n { className: css.reasonBox },\n h('span', { className: css.reasonLabel }, t('mcpReasonLabel')),\n h('p', { className: css.reasonText }, entry.code === 'duplicate-mount' ? t('mcpDuplicateHint') : t('mcpForeignHint')),\n entry.reason === undefined ? null : h('p', { className: css.reasonRaw }, entry.reason)\n )\n : entry.reason === undefined\n ? null\n : h(\n 'div',\n { className: css.reasonBox },\n h('span', { className: css.reasonLabel }, t('mcpReasonLabel')),\n h('p', { className: css.reasonText }, entry.reason)\n ),\n entry.kind === 'direct' ? h('div', { className: css.reasonBox }, h('p', { className: css.reasonText }, t('mcpDirectBoundary'))) : null,\n entry.credentialRefs?.length === 0 || entry.credentialRefs === undefined ? null : h(McpCredentialEditor, { t, api: credentials, refs: entry.credentialRefs }),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, t('mcpConfig')),\n entry.config === undefined\n ? h('div', { className: css.detailEmpty }, t('mcpDirectConfigUnavailable'))\n : h('pre', { className: css.config }, JSON.stringify(entry.config, null, 2))\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('mcpTools')} (${entry.tools.length})`),\n entry.tools.length === 0\n ? h('div', { className: css.detailEmpty }, entry.advertisedTools === false && entry.state === 'degraded' ? t('mcpZeroTools') : t('mcpNoTools'))\n : h(\n 'div',\n { className: css.toolList },\n entry.tools.map(tool =>\n h(\n 'div',\n { key: tool.name, className: css.tool },\n h('span', { className: css.toolName }, tool.name),\n tool.description === undefined || tool.description === '' ? null : h('span', { className: css.toolDescription }, tool.description)\n )\n )\n )\n )\n )\n })\n}\n\nfunction filterLabel(t: Translate, kind: Filter): string {\n if (kind === 'plugin') return t('mcpPlugin')\n if (kind === 'direct') return t('mcpDirect')\n return t('mcpAll')\n}\n\n/** Hover/aria explanation for each MCP filter tab. */\nfunction mcpFilterHint(t: Translate, kind: Filter): string {\n if (kind === 'plugin') return t('mcpFilterPluginHint')\n if (kind === 'direct') return t('mcpFilterDirectHint')\n return t('mcpFilterAllHint')\n}\n\n","/**\n * LSP status panel: declared language servers of enabled suites with their\n * mount state. Rows come from the declaration-and-diagnostic model — the DSH\n * `ctx.lsp` seam has no provider snapshot, so \"mounted\" means the mount\n * registration succeeded, not that a process probe ran.\n *\n * Visual language mirrors McpStatusPanel: the same shared SearchFilterToolbar,\n * the same summary chips, cards, and state pills from mcp-status.module.css.\n * Cards stay lean (state dot + name + command + one state pill); the source\n * suite and the full extension map live in the detail dialog.\n */\nimport { useEffect, useState, type ReactNode } from 'react'\nimport { createElement as h } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { Translate } from './index.js'\nimport { fetchLspServers, fetchLspStatus, saveLspServers, type LspStatusEntry, type LspStatusPayload, type LspStatusState } from './api.js'\nimport { SearchFilterToolbar, type SearchFilterToolbarView } from './SearchFilterToolbar.js'\nimport css from './mcp-status.module.css'\n\ninterface LspStatusPanelProps {\n t: Translate\n}\n\nconst EMPTY_STATUS: LspStatusPayload = {\n entries: [],\n observedAt: '',\n totals: { all: 0, mounted: 0, failed: 0, blocked: 0, disabled: 0 },\n hostMissing: true\n}\n\ntype Filter = 'all' | 'plugin' | 'direct' | 'blocked'\n\nconst FILTER_KEYS: Filter[] = ['all', 'plugin', 'direct', 'blocked']\n\nconst FILTER_LABEL_KEYS: Record<Filter, 'lspAll' | 'lspPlugin' | 'lspDirect' | 'lspBlocked'> = {\n all: 'lspAll',\n plugin: 'lspPlugin',\n direct: 'lspDirect',\n blocked: 'lspBlocked'\n}\n\n/** Tooltip text per filter: the counts alone do not explain the grouping. */\nconst FILTER_HINT_KEYS: Partial<Record<Filter, 'lspFilterAllHint' | 'lspFilterPluginHint' | 'lspFilterDirectHint' | 'lspFilterBlockedHint'>> = {\n all: 'lspFilterAllHint',\n plugin: 'lspFilterPluginHint',\n direct: 'lspFilterDirectHint',\n blocked: 'lspFilterBlockedHint'\n}\nfunction matches(entry: LspStatusEntry, filter: Filter): boolean {\n if (filter === 'all') return true\n if (filter === 'plugin' || filter === 'direct') return entry.kind === filter\n return entry.state === 'host-missing' || entry.state === 'conflict' || entry.state === 'failed'\n}\n\nfunction severity(entry: LspStatusEntry): number {\n if (entry.state === 'failed') return 0\n if (entry.state === 'conflict') return 1\n if (entry.state === 'host-missing') return 2\n if (entry.state === 'starting') return 3\n if (entry.state === 'disabled') return 4\n return 5\n}\n\n/** Language-server inventory with per-state overview and per-server detail. */\nexport function LspStatusPanel({ t }: LspStatusPanelProps): ReactNode {\n const [payload, setPayload] = useState<LspStatusPayload>(EMPTY_STATUS)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | undefined>(undefined)\n const [filter, setFilter] = useState<Filter>('all')\n const [search, setSearch] = useState('')\n const [view, setView] = useState<SearchFilterToolbarView>('grid')\n const [selected, setSelected] = useState<LspStatusEntry | undefined>(undefined)\n const [editorOpen, setEditorOpen] = useState(false)\n\n const refresh = (): void => {\n setLoading(true)\n setError(undefined)\n fetchLspStatus()\n .then(setPayload)\n .catch(caught => {\n setError(caught instanceof Error ? caught.message : String(caught))\n })\n .finally(() => setLoading(false))\n }\n\n useEffect(() => {\n refresh()\n }, [])\n\n // Startup follows a race: the reconciler mounts LSP servers in the host\n // process after discovery, so an early read can observe `starting` rows.\n // Poll quietly until every row settles (or the window closes) instead of\n // freezing a stale verdict on screen.\n const anyStarting = payload.entries.some(entry => entry.state === 'starting')\n useEffect(() => {\n if (!anyStarting) return\n let cancelled = false\n let attempts = 0\n const timer = setInterval(() => {\n attempts += 1\n if (cancelled || attempts > 20) {\n clearInterval(timer)\n return\n }\n fetchLspStatus()\n .then(value => {\n if (!cancelled) setPayload(value)\n })\n .catch(() => {})\n }, 1_000)\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [anyStarting])\n\n const needle = search.trim().toLowerCase()\n const counts = FILTER_KEYS.reduce<Record<string, number>>((acc, key) => {\n acc[key] = payload.entries.filter(entry => matches(entry, key)).length\n return acc\n }, {})\n const visible = payload.entries\n .filter(entry => matches(entry, filter))\n .filter(entry => needle === '' || `${entry.serverKey} ${entry.suiteName} ${entry.command}`.toLowerCase().includes(needle))\n const settled = payload.entries.filter(entry => entry.state !== 'starting')\n const allHealthy = settled.length > 0 && settled.every(entry => entry.state === 'mounted')\n\n return h(\n 'div',\n { className: css.surface },\n h(\n 'header',\n { className: css.header },\n h(\n 'div',\n { className: css.headerText },\n h('h2', { className: css.title }, t('lspStatusTitle')),\n h('p', { className: css.subtitle }, t('lspStatusSubtitle'))\n ),\n h(\n 'div',\n { className: css.headerActions },\n h(Button, { variant: 'ghost', size: 'sm', onClick: () => setEditorOpen(true), disabled: loading, title: t('lspConfigure') }, t('lspConfigure')),\n h(Button, { variant: 'ghost', size: 'sm', onClick: refresh, disabled: loading, title: t('refresh') }, `↻ ${t('refresh')}`)\n )\n ),\n // The summary bar appears only when attention is needed; a healthy panel\n // is silent (the green card accents already say \"mounted\").\n allHealthy || payload.entries.length === 0 || loading\n ? null\n : h(\n 'div',\n { className: css.summaryBar },\n payload.hostMissing\n ? h('span', { className: `${css.summaryChip} ${css.chipblocked}`, title: t('lspHostMissing') }, t('lspHostMissingShort'))\n : ([\n { key: 'failed', count: payload.totals.failed, label: t('lspFailed') },\n { key: 'blocked', count: payload.totals.blocked, label: t('lspBlocked') },\n { key: 'disabled', count: payload.totals.disabled, label: t('lspDisabled') }\n ] as Array<{ key: string; count: number; label: string }>)\n .filter(chip => chip.count > 0)\n .map(chip =>\n h(\n 'span',\n { key: chip.key, className: `${css.summaryChip} ${css[`chip${chip.key}`]}`, title: `${chip.count} ${chip.label}` },\n h('span', { className: css.summaryCount }, chip.count),\n h('span', { className: css.summaryLabel }, chip.label)\n )\n ),\n h('span', { className: css.observedAt }, formatObservedAt(payload.observedAt))\n ),\n h(SearchFilterToolbar, {\n className: css.toolbar,\n search,\n searchLabel: t('lspSearch'),\n searchPlaceholder: t('lspSearch'),\n onSearchChange: setSearch,\n filters: FILTER_KEYS.map(key => ({\n id: key,\n label: t(FILTER_LABEL_KEYS[key]),\n count: counts[key] ?? 0,\n icon: h(LspFilterIcon, { k: key }),\n active: filter === key,\n onSelect: () => setFilter(key),\n hint: FILTER_HINT_KEYS[key] === undefined ? undefined : t(FILTER_HINT_KEYS[key]!)\n })),\n view,\n gridLabel: t('grid'),\n listLabel: t('list'),\n onViewChange: nextView => setView(nextView)\n }),\n error !== undefined\n ? h('div', { className: css.error }, error, h(Button, { variant: 'ghost', size: 'sm', onClick: refresh }, t('mcpRetry')))\n : loading && payload.entries.length === 0\n ? h('div', { className: css.empty }, t('loading'))\n : visible.length === 0\n ? h('div', { className: css.empty }, t('lspEmpty'))\n : h(\n 'div',\n { className: view === 'grid' ? css.grid : css.list },\n [...visible].sort((left, right) => severity(left) - severity(right)).map(entry => h(LspRow, { key: entry.id, entry, t, onOpen: () => setSelected(entry) }))\n ),\n selected === undefined ? null : h(LspDetailModal, { entry: selected, t, onClose: () => setSelected(undefined) }),\n editorOpen\n ? h(LspConfigEditor, {\n t,\n onClose: () => setEditorOpen(false),\n onSaved: () => {\n setEditorOpen(false)\n refresh()\n }\n })\n : null\n )\n}\n\n/**\n * Direct LSP configuration editor: one JSON document shaped like Claude\n * Code's `lspServers` table. The host validates with the same fail-closed\n * rules as suite declarations and mounts direct servers on the next\n * reconcile pass.\n */\nfunction LspConfigEditor({ t, onClose, onSaved }: { t: Translate; onClose: () => void; onSaved: () => void }): ReactNode {\n const [text, setText] = useState<string | undefined>(undefined)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | undefined>(undefined)\n\n useEffect(() => {\n let cancelled = false\n fetchLspServers()\n .then(servers => {\n if (cancelled) return\n setText(JSON.stringify({ lspServers: servers }, null, 2))\n })\n .catch(reason => {\n if (cancelled) setError(reason instanceof Error ? reason.message : String(reason))\n })\n return () => {\n cancelled = true\n }\n }, [])\n\n const save = async (): Promise<void> => {\n setBusy(true)\n setError(undefined)\n try {\n const parsed: unknown = JSON.parse(text ?? '')\n await saveLspServers(parsed)\n onSaved()\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n setBusy(false)\n }\n }\n\n return h(Modal, {\n open: true,\n onClose,\n title: t('lspConfigure'),\n description: t('lspConfigureHint'),\n closeLabel: t('cancel'),\n className: css.detailDialog,\n contentClassName: css.detailBody,\n footer: h(\n 'div',\n { className: css.modalFooter },\n h(Button, { variant: 'ghost', onClick: onClose }, t('cancel')),\n h(Button, { variant: 'primary', disabled: busy || text === undefined, onClick: () => { void save() } }, t('lspSave'))\n ),\n children: h(\n 'div',\n { className: css.detail },\n error === undefined ? null : h('div', { className: css.error }, error),\n text === undefined\n ? h('div', { className: css.empty }, t('loading'))\n : h('textarea', {\n className: css.config,\n rows: 16,\n spellcheck: false,\n value: text,\n onChange: (event: { target: { value: string } }) => setText(event.target.value)\n })\n )\n })\n}\n\n/** Lean row: state dot, server key, command. The card accent + status dot\n * carry the state; no redundant pill for the healthy case. Kind badge shows\n * where the declaration comes from (suite vs user configuration). */\nfunction LspRow({ entry, t, onOpen }: { entry: LspStatusEntry; t: Translate; onOpen: () => void }): ReactNode {\n const interactive = {\n role: 'button' as const,\n tabIndex: 0,\n onClick: onOpen,\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n onOpen()\n }\n }\n const showPill = entry.state !== 'mounted'\n return h(\n 'div',\n { className: `${css.card} ${css[`card${accentClass(entry.state)}`]}`, ...interactive },\n h(\n 'div',\n { className: css.cardBody },\n h(\n 'div',\n { className: css.cardTop },\n h('span', { className: `${css.statusDot} ${css[`status${dotClass(entry.state)}`]}`, 'aria-hidden': true }),\n h('span', { className: css.service }, h('span', { className: css.name }, entry.serverKey)),\n entry.kind === 'plugin'\n ? h('span', { className: css.sourcePlugin }, entry.suiteName)\n : h('span', { className: css.sourceDirect }, t('lspDirect')),\n showPill ? h('span', { className: `${css.statePill} ${css[`state${pillClass(entry.state)}`]}` }, stateLabel(t, entry.state)) : null\n ),\n h('p', { className: css.endpoint }, [entry.command, ...entry.args].join(' '))\n )\n )\n}\n\nfunction LspDetailModal({ entry, t, onClose }: { entry: LspStatusEntry; t: Translate; onClose: () => void }): ReactNode {\n const extensions = Object.entries(entry.extensions)\n return h(Modal, {\n open: true,\n onClose,\n title: entry.serverKey,\n description: t('lspDetailSubtitle'),\n closeLabel: t('cancel'),\n className: css.detailDialog,\n contentClassName: css.detailBody,\n footer: h('div', { className: css.modalFooter }, h(Button, { variant: 'ghost', onClick: onClose }, t('cancel'))),\n children: h(\n 'div',\n { className: css.detail },\n h(\n 'div',\n { className: css.detailHero },\n h('span', { className: `${css.statusDot} ${css[`status${dotClass(entry.state)}`]}`, 'aria-hidden': true }),\n h(\n 'div',\n { className: css.detailHeroText },\n // The status dot carries the healthy verdict; only non-healthy\n // states get an explicit pill.\n entry.state === 'mounted' ? null : h('span', { className: `${css.statePill} ${css[`state${pillClass(entry.state)}`]}` }, stateLabel(t, entry.state)),\n h('p', { className: css.detailEndpoint }, `${entry.suiteName} · ${entry.sourceId}`)\n )\n ),\n entry.reason === undefined\n ? null\n : h(\n 'div',\n { className: css.reasonBox },\n h('span', { className: css.reasonLabel }, t('lspReasonLabel')),\n h('p', { className: css.reasonText }, entry.reason)\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, t('lspDetailCommand')),\n h('pre', { className: css.config }, [entry.command, ...entry.args].join(' '))\n ),\n h(\n 'section',\n { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('lspDetailExtensions')} (${extensions.length})`),\n h(\n 'div',\n { className: css.toolList },\n extensions.map(([ext, languageId]) =>\n h(\n 'div',\n { key: ext, className: css.extRow },\n h('span', { className: css.extName }, ext),\n h('span', { className: css.extArrow, 'aria-hidden': true }, '→'),\n h('span', { className: css.extLanguage }, languageId)\n )\n )\n )\n )\n )\n })\n}\n\n/** Filter icons mirroring McpFilterIcon's language: shared glyph shapes for\n * all/plugin/direct so the two panels read as one system, plus a warning\n * triangle for the blocked state. */\nfunction LspFilterIcon({ k }: { k: string }): ReactNode {\n const common = { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n if (k === 'plugin') {\n return h('svg', common, h('path', { d: 'M6 2.5v2H4A1.5 1.5 0 0 0 2.5 6v2h2a1.5 1.5 0 1 1 0 3h-2v2A1.5 1.5 0 0 0 4 14.5h2v-2a1.5 1.5 0 1 1 3 0v2h2a1.5 1.5 0 0 0 1.5-1.5v-2h-2a1.5 1.5 0 1 1 0-3h2V6A1.5 1.5 0 0 0 11 4.5H9v-2a1.5 1.5 0 1 0-3 0Z' }))\n }\n if (k === 'direct') {\n return h('svg', common, h('circle', { cx: 8, cy: 5, r: 2.2 }), h('path', { d: 'M3.5 13c.6-2.2 2.1-3.3 4.5-3.3s3.9 1.1 4.5 3.3' }))\n }\n if (k === 'blocked') {\n return h('svg', common, h('path', { d: 'M8 2.5 14 13H2L8 2.5Z', stroke: 'currentColor', strokeLinejoin: 'round' }), h('path', { d: 'M8 6.5v3M8 11.2v.3', stroke: 'currentColor', strokeLinecap: 'round' }))\n }\n return h('svg', common, h('path', { d: 'M2.5 5 8 2.5 13.5 5 8 7.5 2.5 5Zm0 3L8 10.5 13.5 8M2.5 11 8 13.5 13.5 11' }))\n}\n\n/** The card-accent CSS suffix; host-missing uses the warn palette. */\nfunction accentClass(state: LspStatusState): string {\n if (state === 'mounted') return 'Mounted'\n if (state === 'host-missing') return 'HostMissing'\n if (state === 'conflict') return 'Conflict'\n if (state === 'failed') return 'Failed'\n return 'Disabled'\n}\n\n/** The status-dot CSS suffix (lowercase state names in the stylesheet). */\nfunction dotClass(state: LspStatusState): string {\n return state === 'host-missing' ? 'host-missing' : state\n}\n\n/** The state-pill CSS suffix; conflict borrows the failed palette and\n * starting borrows the warn palette. */\nfunction pillClass(state: LspStatusState): string {\n if (state === 'conflict') return 'failed'\n if (state === 'starting') return 'host-missing'\n return state\n}\n\nfunction stateLabel(t: Translate, state: LspStatusState): string {\n if (state === 'mounted') return t('lspMounted')\n if (state === 'starting') return t('lspStarting')\n if (state === 'host-missing') return t('lspHostMissingShort')\n if (state === 'failed') return t('lspFailed')\n if (state === 'conflict') return t('lspConflict')\n return t('lspDisabled')\n}\n\nfunction formatObservedAt(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return ''\n return date.toLocaleTimeString()\n}\n","/**\n * The Agent Plugins Market card on the host's 插件配置 (plugin configuration)\n * tab: the market feature's configuration entry, named after the market\n * itself. Disclosed inside is the MCP enhancement switch — ON (default)\n * mounts suite MCP servers through the market's built-in bridge (OAuth\n * authorization, SSE, browser-leg hold); OFF falls back to the host's\n * `dsh-mcp-client` compatibility client.\n *\n * The switch state is the market's host settings namespace (bound by the\n * client entry), so a flip persists through the host settings document and\n * the node half's namespace watcher remounts the servers. The host client\n * version probe rides the market's own API.\n */\nimport { createElement as h, useCallback, useEffect, useState, type ReactNode } from 'react'\nimport * as primitives from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { McpBackendInfo } from './api.js'\nimport { ToggleSwitch } from './ui/ToggleSwitch.js'\nimport css from './market.module.css'\n\n/** Locale subset the card needs (structural — the host binds the real one). */\ntype CardTranslate = (key: string, params?: Record<string, unknown>) => string\n\n/** The host's disclosure chevron, matching the native cards' glyph exactly. */\nconst chevronIcon = (primitives as unknown as Record<string, unknown>)['IconChevronDownOutline14'] as\n | ((props: { size?: number }) => ReactNode)\n | undefined\n\n/** The bound settings-namespace face the client entry hands the card. */\nexport interface McpEnhanceScopeFace {\n /** Whether the enhancement is on; defaults to true before the first answer. */\n enhanced(): boolean\n /** Whether the host settings document accepts writes. */\n writable(): boolean\n subscribe(listener: () => void): () => void\n setEnhanced(next: boolean): Promise<void>\n /** The persisted download region; `auto` follows the interface language. */\n region(): 'auto' | 'global' | 'china'\n setRegion(next: 'global' | 'china'): Promise<void>\n}\n\nexport interface McpPluginCardProps {\n t: CardTranslate\n scope: McpEnhanceScopeFace\n /** Live host-client probe (availability + version) from the market API. */\n probe: () => Promise<McpBackendInfo>\n}\n\nexport function McpPluginCard({ t, scope, probe }: McpPluginCardProps): ReactNode {\n const [open, setOpen] = useState(false)\n const [, setTick] = useState(0)\n const [probeInfo, setProbeInfo] = useState<McpBackendInfo | undefined>(undefined)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | undefined>(undefined)\n\n useEffect(() => scope.subscribe(() => setTick(tick => tick + 1)), [scope])\n\n const refreshProbe = useCallback(async () => {\n try {\n setProbeInfo(await probe())\n } catch {\n // The version line degrades silently; the switch still works.\n }\n }, [probe])\n\n useEffect(() => { void refreshProbe() }, [refreshProbe])\n\n const enhanced = scope.enhanced()\n const writable = scope.writable()\n const regionSetting = scope.region()\n // The highlighted segment is the route clones actually take: the explicit\n // choice, or the language-resolved one while the setting is still auto.\n const effectiveRegion = probeInfo?.downloadRegion.effective ?? (regionSetting === 'china' ? 'china' : 'global')\n // Compat mode requires the host client to resolve; the enhanced (built-in)\n // client is always available because it ships inside this plugin.\n const hostUsable = probeInfo?.hostClient.available === true\n\n const onToggle = (): void => {\n if (busy || !writable) return\n const next = !enhanced\n if (!next && !hostUsable) {\n setError(t('mcpBackendHostMissing'))\n return\n }\n setBusy(true)\n setError(undefined)\n void scope.setEnhanced(next).then(() => {\n setBusy(false)\n }).catch((cause: unknown) => {\n setError(cause instanceof Error ? cause.message : String(cause))\n setBusy(false)\n })\n }\n\n return h(\n 'div',\n {\n className: open ? `${css.pluginCard} ${css.pluginCardOpen}` : css.pluginCard,\n 'data-busy': busy ? 'true' : undefined\n },\n h(\n 'button',\n {\n type: 'button',\n className: css.pluginCardHeader,\n 'aria-expanded': open,\n onClick: () => { setOpen(current => !current) },\n }, h(\n 'div',\n { className: css.pluginCardText },\n h('div', { className: css.pluginCardTitle }, t('nav')),\n h('div', { className: css.pluginCardDesc }, t('marketCardDesc'))\n ),\n h(\n 'span',\n { className: open ? `${css.pluginChevron} ${css.pluginChevronOpen}` : css.pluginChevron },\n chevronIcon !== undefined ? h(chevronIcon, { size: 14 }) : '▾'\n )\n ),\n open\n ? h(\n 'div',\n { className: css.pluginCardBody },\n h(\n 'div',\n { className: css.pluginCardRow },\n h(\n 'div',\n { className: css.pluginCardText },\n h('div', { className: css.pluginCardRowLabel }, t('mcpCardTitle')),\n h('div', { className: css.pluginCardDesc }, enhanced ? t('mcpCardDescOn') : t('mcpCardDescOff'))\n ),\n h(ToggleSwitch, {\n on: enhanced,\n disabled: busy || !writable,\n title: writable ? undefined : t('mcpCardReadonly'),\n onChange: onToggle\n })\n ),\n error !== undefined\n ? h('div', { className: css.pluginCardError }, error)\n : null,\n h(\n 'div',\n { className: css.pluginCardRow },\n h(\n 'div',\n { className: css.pluginCardText },\n h('div', { className: css.pluginCardRowLabel }, t('regionLabel')),\n h('div', { className: css.pluginCardDesc }, t('regionHint'))\n ),\n h(\n 'div',\n { className: css.regionSeg },\n (['global', 'china'] as const).map(region =>\n h(\n 'button',\n {\n key: region,\n type: 'button',\n disabled: busy || !writable,\n className: effectiveRegion === region ? css.regionSegOn : css.regionSegBtn,\n onClick: () => {\n if (regionSetting === region) return\n setBusy(true)\n setError(undefined)\n void scope.setRegion(region).then(() => {\n setBusy(false)\n }).catch((cause: unknown) => {\n setError(cause instanceof Error ? cause.message : String(cause))\n setBusy(false)\n })\n }\n },\n region === 'global' ? t('regionGlobal') : t('regionChina')\n )\n )\n )\n )\n )\n : null\n )\n}\n","/** Pure capability decision for the legacy page-mode fallback. */\n\n/**\n * Use the DOM page fallback only when the host has no settings page and does\n * expose a page shell for the fallback to mount into.\n *\n * @param settingsSurfaceAvailable - whether `settings.section` is live.\n * @param pageShellAvailable - whether the sidebar/conversation shell exists.\n * @returns true when the fallback is the only available market surface.\n */\nexport function shouldUseLegacyPageMode(settingsSurfaceAvailable: boolean, pageShellAvailable: boolean): boolean {\n return !settingsSurfaceAvailable && pageShellAvailable\n}\n","/**\n * Legacy Web page-mode adapter.\n *\n * Current DSH compositions expose `settings.section`; older compositions that\n * predate that slot can still host a top-level market panel through the DOM\n * shell used by the original page-mode integration. The adapter is deliberately\n * guarded by the live settings-slot state so one composition never renders two\n * market surfaces.\n */\nimport { createElement as h } from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\nimport { MarketSection } from './MarketSection.js'\nimport { shouldUseLegacyPageMode } from './page-mode-selection.js'\nimport type { Translate } from './index.js'\nimport type { CredentialApi } from './credentials.js'\nimport css from './market.module.css'\n\n/** Browser-side inputs required by the legacy page-mode adapter. */\nexport interface LegacyPageModeOptions {\n /** Current namespace-bound translator. */\n t: Translate\n /** Host credentials wire used for write-only MCP env configuration. */\n credentials?: CredentialApi\n /** Whether the host has mounted a live `settings.section` declaration. */\n isSettingsSurfaceAvailable: () => boolean\n /** Optional locale revision subscription supplied by newer hosts. */\n subscribeLocale?: (listener: () => void) => () => void\n}\n\nconst ACTIVE_ATTRIBUTE = 'data-dsh-agent-plugins-market-page'\nconst VIEW_ATTRIBUTE = 'data-dsh-agent-plugins-market-page-view'\nconst ENTRY_ATTRIBUTE = 'data-dsh-agent-plugins-market-entry'\nconst SURFACE_EVENT = 'dsh-agent-plugins-market-settings-surface'\nconst PANEL_EVENT = 'dsh-panel-activate'\nconst PANEL_NAME = 'agent-plugins-market'\n\n/** Notify the page adapter that the settings-slot capability changed. */\nexport const LEGACY_PAGE_MODE_SURFACE_EVENT = SURFACE_EVENT\nconst SIDEBAR_COLUMN_SELECTOR = '[data-pane=\"sidebar\"], [class*=\"sidebarCol\"]'\nconst CONVERSATION_COLUMN_SELECTOR = '[data-pane=\"conversation\"], [class*=\"centerCol\"]'\nconst SIDEBAR_CONTEXT_SELECTOR = '[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]'\n\n/**\n * Mount the page-mode fallback and its sidebar entry.\n *\n * The fallback remains dormant when the settings surface is present. It also\n * remains a no-op in non-browser runtimes or shells that expose neither the\n * sidebar nor the conversation column.\n *\n * @param options - page-mode dependencies and host capability probe.\n * @returns disposer that removes the injected entry, panel, listeners, and\n * active document marker.\n */\nexport function mountLegacyPageMode(options: LegacyPageModeOptions): () => void {\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return () => {}\n\n let stopped = false\n let open = false\n let root: Root | undefined\n let container: HTMLDivElement | undefined\n let entry: HTMLButtonElement | undefined\n let entryLabel: HTMLSpanElement | undefined\n let observer: MutationObserver | undefined\n\n const setActive = (next: boolean): void => {\n open = next\n if (open && !options.isSettingsSurfaceAvailable()) {\n document.documentElement.setAttribute(ACTIVE_ATTRIBUTE, '')\n document.dispatchEvent(new CustomEvent(PANEL_EVENT, { detail: PANEL_NAME }))\n } else {\n document.documentElement.removeAttribute(ACTIVE_ATTRIBUTE)\n }\n }\n\n const removeView = (): void => {\n setActive(false)\n root?.unmount()\n root = undefined\n container?.remove()\n container = undefined\n }\n\n const renderView = (): void => {\n if (root === undefined) return\n root.render(h(MarketSection, { t: options.t, credentials: options.credentials, mode: 'page' }))\n }\n\n const updateEntryCopy = (): void => {\n if (entryLabel === undefined || entry === undefined) return\n const label = options.t('nav')\n entryLabel.textContent = label\n entry.title = label\n entry.setAttribute('aria-label', label)\n }\n\n const ensureView = (): void => {\n if (stopped || options.isSettingsSurfaceAvailable()) {\n removeView()\n return\n }\n const column = conversationColumn()\n if (!shouldUseLegacyPageMode(options.isSettingsSurfaceAvailable(), column !== undefined)) {\n removeView()\n return\n }\n if (column === undefined) return\n if (container !== undefined && container.isConnected) return\n root?.unmount()\n container?.remove()\n container = document.createElement('div')\n container.setAttribute(VIEW_ATTRIBUTE, '')\n container.className = css.pageView\n column.appendChild(container)\n root = createRoot(container)\n renderView()\n }\n\n const ensureEntry = (): void => {\n if (stopped || options.isSettingsSurfaceAvailable()) {\n entry?.remove()\n return\n }\n const rootElement = sidebarRoot()\n const anchor = rootElement === undefined ? undefined : newSessionButton(rootElement)\n if (rootElement === undefined || anchor === undefined || anchor.parentElement === null) return\n if (entry === undefined) {\n entry = createEntry(() => { setActive(!open); ensureView() })\n entryLabel = entry.querySelector<HTMLSpanElement>('[data-dsh-agent-plugins-market-label]') ?? undefined\n updateEntryCopy()\n }\n if (entry.parentElement !== anchor.parentElement || entry.previousSibling !== anchor) {\n anchor.insertAdjacentElement('afterend', entry)\n }\n }\n\n const observeShell = (): void => {\n if (stopped || observer !== undefined || options.isSettingsSurfaceAvailable()) return\n observer = new MutationObserver(ensure)\n observer.observe(document.body ?? document.documentElement, { childList: true, subtree: true })\n }\n\n const stopObservingShell = (): void => {\n observer?.disconnect()\n observer = undefined\n }\n\n const ensure = (): void => {\n if (stopped) return\n if (options.isSettingsSurfaceAvailable()) {\n stopObservingShell()\n removeView()\n entry?.remove()\n return\n }\n observeShell()\n ensureView()\n ensureEntry()\n }\n\n const onLocale = (): void => {\n updateEntryCopy()\n renderView()\n }\n const onSurfaceChange = (): void => { ensure() }\n const unsubscribeLocale = options.subscribeLocale?.(onLocale)\n const onPanelActivate = (event: Event): void => {\n const detail = (event as CustomEvent<string>).detail\n if (detail !== PANEL_NAME && open) setActive(false)\n }\n const onSidebarContextClick = (event: MouseEvent): void => {\n if (!open) return\n const target = event.target\n if (!(target instanceof HTMLElement) || target.closest(SIDEBAR_CONTEXT_SELECTOR) === null) return\n setActive(false)\n }\n\n document.addEventListener(PANEL_EVENT, onPanelActivate)\n document.addEventListener(SURFACE_EVENT, onSurfaceChange)\n document.addEventListener('click', onSidebarContextClick, true)\n queueMicrotask(ensure)\n\n return () => {\n stopped = true\n unsubscribeLocale?.()\n document.removeEventListener(PANEL_EVENT, onPanelActivate)\n document.removeEventListener(SURFACE_EVENT, onSurfaceChange)\n document.removeEventListener('click', onSidebarContextClick, true)\n stopObservingShell()\n entry?.remove()\n removeView()\n }\n}\n\nfunction sidebarRoot(): HTMLElement | undefined {\n const column = document.querySelector<HTMLElement>(SIDEBAR_COLUMN_SELECTOR)\n if (column === null) return undefined\n return column.querySelector<HTMLElement>('[class*=\"logoRow\"]')?.parentElement\n ?? (column.firstElementChild as HTMLElement | null)\n ?? undefined\n}\n\nfunction newSessionButton(root: HTMLElement): HTMLButtonElement | undefined {\n const nested = root.querySelector<HTMLButtonElement>('button[class*=\"newSession\"]')\n if (nested !== null) return nested\n for (const child of root.children) {\n if (child instanceof HTMLButtonElement) return child\n }\n return undefined\n}\n\nfunction conversationColumn(): HTMLElement | undefined {\n return document.querySelector<HTMLElement>(CONVERSATION_COLUMN_SELECTOR) ?? undefined\n}\n\nfunction createEntry(onClick: () => void): HTMLButtonElement {\n const button = document.createElement('button')\n button.type = 'button'\n button.setAttribute(ENTRY_ATTRIBUTE, '')\n button.className = css.pageEntry\n button.innerHTML = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"2\" y=\"2\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"2\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/></svg>'\n const label = document.createElement('span')\n label.dataset.dshAgentPluginsMarketLabel = ''\n button.append(label)\n button.addEventListener('click', onClick)\n return button\n}\n","/**\n * dsh-agent-plugins-market client: registers the Agent Plugins Market section inside the Web\n * GUI's settings page (the same settings.section seat dshmarket uses), with a\n * guarded legacy top-level page fallback for older shells. The bundle's\n * browser externals are React, ReactDOM, and the injected `dsh.client.inject`\n * module table, so it cannot reach packages the host does not serve.\n */\nimport { createElement as h } from 'react'\nimport * as primitives from '@deepseek-ai/dsh-client-ui-primitives'\nimport { fetchMcpBackend } from './api.js'\nimport { en, zh, type LocaleKey } from './locales.js'\nimport { MarketSection } from './MarketSection.js'\nimport { McpStatusPanel } from './McpStatusPanel.js'\nimport { LspStatusPanel } from './LspStatusPanel.js'\nimport { McpPluginCard } from './McpPluginCard.js'\nimport { credentialApi, type CredentialRemote } from './credentials.js'\nimport { LEGACY_PAGE_MODE_SURFACE_EVENT, mountLegacyPageMode } from './page-mode.js'\n\nconst NS = 'dsh-agent-plugins-market'\n\nexport type Translate = (key: LocaleKey, params?: Record<string, unknown>) => string\n\n/** The subset of the locale service this plugin touches. */\ninterface LocaleService {\n register(namespace: string, dicts: { zh: Record<string, string>; en: Record<string, string> }): unknown\n bind(namespace: string): Translate\n subscribe?: (listener: () => void) => () => void\n}\n\n/** The subset of the slots service this plugin touches. */\ninterface SlotsService {\n inject(slot: string, register: () => unknown): void\n register(meta: Record<string, unknown>, component: () => unknown): unknown\n}\n\n/** The subset of the host settings-scope service this plugin touches. */\ninterface SettingsScopeService {\n bind(options: { namespace: string }): {\n getSnapshot(): { value?: { mcpEnhanced?: boolean; downloadRegion?: string }; writable: boolean }\n subscribe(listener: () => void): () => void\n set(field: string, value: unknown): Promise<void>\n }\n}\n\n/** The client cordis context this plugin relies on (structural subset). */\ninterface SuiteClientContext {\n effect(callback: () => unknown, label?: string): void\n /** Late service resolution; absent on hosts predating cross-plugin inject. */\n inject?(services: string[], callback: (resolved: Record<string, unknown>) => void): void\n locale: LocaleService\n slots: SlotsService\n remote: { credentials: CredentialRemote }\n}\n\nexport const name = 'dsh-agent-plugins-market'\nexport const inject = ['slots', 'locale', 'remote', 'remote.credentials']\nexport const REQUIRED_PRIMITIVES = ['Button', 'Input', 'Modal', 'Toast', 'Tooltip'] as const\n\n/**\n * Register the MCP enhancement card into the host's shared 插件配置 tab\n * (`settings.plugin.item`), the same seat dshmarket uses. Called through\n * `ctx.inject(['settingsScope'])` at apply time; a host without the\n * settingsScope service simply skips the card.\n */\n\n/** Detect host primitives that predate the exports this UI relies on. */\nexport function missingPrimitives(module: Record<string, unknown>, required: readonly string[] = REQUIRED_PRIMITIVES): string[] {\n return required.filter(name => module[name] === undefined)\n}\n\nexport function apply(ctx: SuiteClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-agent-plugins: dictionaries')\n const t = ctx.locale.bind(NS)\n const credentials = credentialApi(ctx.remote.credentials)\n\n const gaps = missingPrimitives(primitives as unknown as Record<string, unknown>)\n if (gaps.length > 0) {\n console.warn(`[dsh-agent-plugins-market] host ui-primitives missing ${gaps.join(', ')} — Agent Plugins Market section disabled (dsh web >= 0.1.0-rc.6 required)`)\n return\n }\n\n let settingsSurfaceAvailable = false\n ctx.effect(() => mountLegacyPageMode({\n t,\n credentials,\n isSettingsSurfaceAvailable: () => settingsSurfaceAvailable,\n subscribeLocale: ctx.locale.subscribe === undefined ? undefined : (listener) => ctx.locale.subscribe!(listener),\n }), 'dsh-agent-plugins-market: legacy page mode')\n\n // The host 插件配置 tab card. Registration rides the injected scope's slots\n // (the dshmarket / dsh-rewind pattern), and the card state binds the\n // market's settings namespace — the namespace the node half registers,\n // which is also what makes the tab serve our card at all.\n ctx.inject?.(['settingsScope'], (scoped: { settingsScope?: SettingsScopeService; slots?: SlotsService }) => {\n const service = scoped.settingsScope\n const slots = scoped.slots\n if (service === undefined || slots === undefined) return\n const tCard = ctx.locale.bind(NS)\n const scope = service.bind({ namespace: NS })\n slots.inject('settings.plugin.item', () =>\n slots.register({\n name: 'settings.plugin.item',\n key: NS,\n locale: NS,\n inject: () => ({ t: tCard }),\n }, () => h(McpPluginCard, {\n t: key => tCard(key as LocaleKey),\n scope: {\n enhanced: () => scope.getSnapshot().value?.mcpEnhanced !== false,\n writable: () => scope.getSnapshot().writable,\n subscribe: listener => scope.subscribe(listener),\n setEnhanced: next => scope.set('mcpEnhanced', next),\n region: () => {\n const value = scope.getSnapshot().value?.downloadRegion\n return value === 'global' || value === 'china' ? value : 'auto'\n },\n setRegion: next => scope.set('downloadRegion', next)\n },\n probe: () => fetchMcpBackend(),\n })),\n )\n })\n\n ctx.slots.inject('settings.section', () => {\n settingsSurfaceAvailable = true\n notifyPageModeSurfaceChange()\n const marketDispose = ctx.slots.register({\n name: 'settings.section',\n id: 'agent-plugin',\n order: 45,\n label: () => t('nav'),\n locale: NS,\n inject: () => ({ t }),\n }, () => h(MarketSection, {\n t,\n credentials,\n mode: 'settings',\n }))\n const mcpDispose = ctx.slots.register({\n name: 'settings.section',\n id: 'mcp-status',\n order: 46,\n label: () => t('mcpStatusNav'),\n locale: NS,\n inject: () => ({ t }),\n }, () => h(McpStatusPanel, { t, credentials }))\n const lspDispose = ctx.slots.register({\n name: 'settings.section',\n id: 'lsp-status',\n order: 47,\n label: () => t('lspStatusNav'),\n locale: NS,\n inject: () => ({ t }),\n }, () => h(LspStatusPanel, { t }))\n return () => {\n settingsSurfaceAvailable = false\n notifyPageModeSurfaceChange()\n if (typeof mcpDispose === 'function') mcpDispose()\n if (typeof lspDispose === 'function') lspDispose()\n if (typeof marketDispose === 'function') marketDispose()\n }\n })\n}\n\nfunction notifyPageModeSurfaceChange(): void {\n if (typeof document !== 'undefined') document.dispatchEvent(new Event(LEGACY_PAGE_MODE_SURFACE_EVENT))\n}\n"],"mappings":"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"}
|