dsh-agent-plugins-market 0.4.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +16 -10
  2. package/README.zh.md +16 -10
  3. package/client/client.js +540 -417
  4. package/client/client.js.map +1 -1
  5. package/lib/application/catalog.js +447 -0
  6. package/lib/application/details.js +136 -0
  7. package/lib/application/queries.js +1 -0
  8. package/lib/{discovery → catalog}/manifests.js +20 -12
  9. package/lib/{paths.js → catalog/paths.js} +5 -1
  10. package/lib/{skills-parse.js → catalog/skills-parse.js} +7 -4
  11. package/lib/catalog/source-catalog.js +38 -0
  12. package/lib/{discovery.js → catalog/suite-scanner.js} +28 -86
  13. package/lib/{discovery → catalog}/surfaces.js +9 -11
  14. package/lib/{validate.js → catalog/validate.js} +3 -3
  15. package/lib/context.js +11 -13
  16. package/lib/contracts/market.js +27 -0
  17. package/lib/contracts/mcp-status.js +2 -0
  18. package/lib/index.js +32 -49
  19. package/lib/{state.js → model/state.js} +2 -2
  20. package/lib/routes.js +21 -21
  21. package/lib/{commands-mounts.js → runtime/commands-mounts.js} +10 -11
  22. package/lib/{hooks-mounts.js → runtime/hooks-mounts.js} +1 -1
  23. package/lib/{mcp-config.js → runtime/mcp-config.js} +7 -4
  24. package/lib/{mcp-status.js → runtime/mcp-status.js} +8 -41
  25. package/lib/runtime/reconciler.js +46 -0
  26. package/lib/{skills-provider.js → runtime/skills-provider.js} +26 -23
  27. package/lib/runtime/tool-registry-observer.js +35 -0
  28. package/lib/types/application/catalog.d.ts +113 -0
  29. package/lib/types/application/details.d.ts +12 -0
  30. package/lib/types/application/queries.d.ts +33 -0
  31. package/lib/types/{discovery → catalog}/manifests.d.ts +1 -1
  32. package/lib/types/catalog/source-catalog.d.ts +3 -0
  33. package/lib/types/catalog/suite-scanner.d.ts +9 -0
  34. package/lib/types/{discovery → catalog}/surfaces.d.ts +1 -1
  35. package/lib/types/{validate.d.ts → catalog/validate.d.ts} +1 -1
  36. package/lib/types/context.d.ts +2 -2
  37. package/lib/types/contracts/market.d.ts +153 -0
  38. package/lib/types/contracts/mcp-status.d.ts +38 -0
  39. package/lib/types/index.d.ts +1 -1
  40. package/lib/types/{types.d.ts → model/types.d.ts} +2 -42
  41. package/lib/types/routes.d.ts +2 -2
  42. package/lib/types/{commands-mounts.d.ts → runtime/commands-mounts.d.ts} +1 -1
  43. package/lib/types/{hooks-mounts.d.ts → runtime/hooks-mounts.d.ts} +1 -1
  44. package/lib/types/{mcp-config.d.ts → runtime/mcp-config.d.ts} +1 -1
  45. package/lib/types/{mcp-mounts.d.ts → runtime/mcp-mounts.d.ts} +1 -1
  46. package/lib/types/runtime/mcp-status.d.ts +13 -0
  47. package/lib/types/runtime/reconciler.d.ts +33 -0
  48. package/lib/types/{skills-provider.d.ts → runtime/skills-provider.d.ts} +3 -3
  49. package/lib/types/runtime/tool-registry-observer.d.ts +14 -0
  50. package/package.json +34 -19
  51. package/schemas/README.md +2 -5
  52. package/lib/manager.js +0 -581
  53. package/lib/types/discovery.d.ts +0 -19
  54. package/lib/types/manager.d.ts +0 -124
  55. package/lib/types/mcp-status.d.ts +0 -51
  56. /package/lib/{git.js → catalog/git.js} +0 -0
  57. /package/lib/{types.js → model/types.js} +0 -0
  58. /package/lib/{mcp-mounts.js → runtime/mcp-mounts.js} +0 -0
  59. /package/lib/types/{git.d.ts → catalog/git.d.ts} +0 -0
  60. /package/lib/types/{paths.d.ts → catalog/paths.d.ts} +0 -0
  61. /package/lib/types/{skills-parse.d.ts → catalog/skills-parse.d.ts} +0 -0
  62. /package/lib/types/{state.d.ts → model/state.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["Component","h","useState","h","Modal","css","Button","MarkdownText","h","css","Input","useState","useCallback","useMemo","h","css","Button","Toast","Modal","Input","Tooltip","useState","useMemo","h","css","Button","Modal","h","css","createRoot","primitives","h"],"sources":["../src/client/locales.ts","../src/client/api.ts","../src/client/ErrorBoundary.tsx","../src/client/market.module.css","../src/client/SuiteDetail.tsx","../src/client/SearchFilterToolbar.module.css","../src/client/SearchFilterToolbar.tsx","../src/client/MarketSection.tsx","../src/client/mcp-status.module.css","../src/client/McpStatusPanel.tsx","../src/client/page-mode-selection.ts","../src/client/page-mode.tsx","../src/client/index.ts"],"sourcesContent":["/** 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 sourceModeGit: '远程 git',\n sourceModeLocal: '本地目录',\n branchPh: '分支(可选)',\n sourceLocal: '本地',\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 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 urlLocalHint: '绝对路径或 ~/…,直接读取本地目录(不克隆、移除源时不会删除)',\n branchHint: '可选;不填则跟踪默认分支',\n idFixed: 'id 不可修改(源标识全局唯一)',\n progressStarting: '正在提交…',\n progressCloning: '正在克隆仓库(git clone),可能需要几十秒…',\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 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 remoteRef: '远程',\n surfaceSkills: '技能',\n surfaceMcp: 'MCP',\n surfaceHooks: 'Hooks',\n surfaceCommands: '命令',\n surfaceAgents: '子代理',\n surfaceLsp: 'LSP',\n sourceNotCloned: '未克隆',\n sourceCloned: '已克隆',\n errors: '校验问题',\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 mcpStatusTitle: 'MCP 服务',\n mcpStatusSubtitle: '连接状态、来源和工具清单',\n mcpSearch: '搜索 MCP 名称、来源或地址…',\n mcpAll: '全部',\n mcpPlugin: 'Plugin',\n mcpDirect: '直接安装',\n mcpService: '服务',\n mcpSource: '来源',\n mcpTransport: '传输',\n mcpTools: '工具',\n mcpConnected: '已连接',\n mcpDegraded: '降级',\n mcpFailed: '失败',\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}\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 sourceModeGit: 'remote git',\n sourceModeLocal: 'local dir',\n branchPh: 'branch (optional)',\n sourceLocal: 'local',\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 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 urlLocalHint: 'absolute path or ~/…, read in place (never cloned, never deleted on removal)',\n branchHint: 'optional; defaults to the repository default branch',\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 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 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 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 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 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 mcpConnected: 'connected',\n mcpDegraded: 'degraded',\n mcpFailed: 'failed',\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}\n","/** Typed fetch helpers over the host's `/api/agent-plugins/*` routes. */\n\nexport interface SourceOverview {\n id: string\n url: string\n branch?: string\n /** Local-directory source (read directly, never cloned or deleted). */\n local?: boolean\n cloned: boolean\n lockCommit?: string\n error?: string\n suiteIds: string[]\n}\n\nexport interface SuiteSurfaceCounts {\n skills: number\n mcp: number\n hooks: number\n commands: number\n agents: number\n lsp: number\n}\n\nexport interface SuiteCardData {\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 dimension: string\n layout: string\n remoteUrl?: string\n errors: string[]\n mcpErrors?: string[]\n}\n\nexport interface OverviewData {\n sources: SourceOverview[]\n suites: SuiteCardData[]\n totals: { all: number; installed: number; enabled: number }\n roots: { user: string; data: string }\n}\n\nexport async function fetchOverview(): Promise<OverviewData> {\n const response = await fetch('/api/agent-plugins/overview', { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`overview failed: ${response.status}`)\n return response.json() as Promise<OverviewData>\n}\n\n/** Host-side progress of the source mutation currently in flight, if any. */\nexport interface SourceProgress {\n active: boolean\n sourceId: string\n step: string\n}\n\nexport async function fetchSourceProgress(): Promise<SourceProgress> {\n const response = await fetch('/api/agent-plugins/progress', { credentials: 'same-origin' })\n if (!response.ok) throw new Error(`progress failed: ${response.status}`)\n return response.json() as Promise<SourceProgress>\n}\n\n/** One skill's metadata inside a suite detail. */\nexport interface SuiteSkillMeta {\n name: string\n description: string\n whenToUse?: string\n path: string\n}\n\n/** One CC command with its full template for preview. */\nexport interface CommandPreview {\n name: string\n description?: string\n content: string\n}\n\n/** One CC agent definition with its full text for preview. */\nexport interface AgentPreview {\n name: string\n description?: string\n content: string\n}\n\n/** One LSP definition file (JSON) for preview. */\nexport interface LspPreview {\n name: string\n content: string\n}\n\n/** One flattened CC hook entry for preview. */\nexport interface HookPreview {\n event: string\n matcher?: string\n command: string\n}\n\n/** One validated mcp.json server entry. */\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}\n\n/** Full suite detail served by the market's 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 skills: SuiteSkillMeta[]\n mcpServers: McpServerDetail[]\n hooks: { count: number; entries: HookPreview[] }\n commands: CommandPreview[]\n agents: AgentPreview[]\n lsp: LspPreview[]\n errors: string[]\n mcpErrors: string[]\n}\n\n/** One skill's full file text. */\nexport interface SkillContent {\n name: string\n description: string\n content: string\n path: string\n}\n\nexport async function fetchSuiteDetail(sourceId: string, suiteId: string): Promise<SuiteDetail> {\n const response = await fetch(`/api/agent-plugins/suite?sourceId=${encodeURIComponent(sourceId)}&suiteId=${encodeURIComponent(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 interface McpStatusTool {\n name: string\n description?: string\n}\n\nexport interface McpStatusEntry {\n id: string\n name: string\n kind: 'plugin' | 'direct'\n state: 'connected' | 'degraded' | 'failed' | 'disabled'\n source?: string\n suiteId?: string\n serverKey?: string\n transport: string\n endpoint?: string\n config?: Record<string, unknown>\n tools: McpStatusTool[]\n reason?: string\n}\n\nexport interface McpStatusPayload {\n entries: McpStatusEntry[]\n observedAt: string\n totals: { all: number; connected: number; degraded: number; failed: number; disabled: number }\n directObservationOnly: boolean\n}\n\nexport async function fetchMcpStatus(): Promise<McpStatusPayload> {\n const response = await fetch('/api/agent-plugins/mcp-status', { 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 fetchSkillContent(sourceId: string, suiteId: string, skill: string): Promise<SkillContent> {\n const response = await fetch(`/api/agent-plugins/skill?sourceId=${encodeURIComponent(sourceId)}&suiteId=${encodeURIComponent(suiteId)}&skill=${encodeURIComponent(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\nexport async function postAction(path: string, body: Record<string, unknown>): Promise<Record<string, unknown>> {\n const response = await fetch(`/api/agent-plugins/${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","/**\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","/**\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 height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n min-width: 0;\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.pageMode {\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-bg-selected, #edf1ff);\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-bg-hover, rgba(0, 0, 0, 0.05));\n}\n\n.pageEntry:active {\n background: var(--dsw-alias-bg-active, rgba(0, 0, 0, 0.08));\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.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.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 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 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 -webkit-line-clamp: 1;\n}\n\n.list .cardActions {\n flex: 0 0 auto;\n}\n\n.list .meta {\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}\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.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.switchOn {\n background: var(--dsw-alias-state-success-primary, #22c55e);\n}\n\n.switchOff {\n background: var(--dsw-alias-state-neutral, #d1d5db);\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 min-height: 36px;\n margin: 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.meta {\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.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-bg-hover, rgba(0, 0, 0, 0.05));\n}\n\n.detailItemOpen {\n background: var(--dsw-alias-bg-selected, rgba(79, 110, 247, 0.08));\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-danger, #e5484d);\n color: var(--dsw-alias-danger, #e5484d);\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 * 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, useState, type ReactNode } from 'react'\nimport { Button, Modal, MarkdownText } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { fetchSkillContent, fetchSuiteDetail, type McpServerDetail, type SuiteDetail } from './api.js'\nimport { ErrorBoundary } from './ErrorBoundary.js'\nimport type { Translate } from './index.js'\nimport css from './market.module.css'\n\nexport interface SuiteDetailModalProps {\n t: Translate\n sourceId: string\n suiteId: string\n onClose: () => void\n}\n\nexport function SuiteDetailModal({ t, sourceId, suiteId, onClose }: SuiteDetailModalProps): ReactNode {\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 [openMcp, setOpenMcp] = useState<string | undefined>(undefined)\n const [openPreview, setOpenPreview] = useState<string | undefined>(undefined)\n\n useEffect(() => {\n let cancelled = false\n setDetail(undefined)\n setError(undefined)\n fetchSuiteDetail(sourceId, suiteId)\n .then(value => { if (!cancelled) setDetail(value) })\n .catch(reason => { if (!cancelled) setError(reason instanceof Error ? reason.message : String(reason)) })\n return () => { cancelled = true }\n }, [sourceId, suiteId])\n\n const toggleSkill = async (name: string): Promise<void> => {\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 setSkillText(content.content)\n } catch (reason) {\n setSkillText(`⚠ ${reason instanceof Error ? reason.message : String(reason)}`)\n } finally {\n setSkillLoading(false)\n }\n }\n\n const toggleMcp = (key: string): void => {\n setOpenMcp(openMcp === key ? undefined : key)\n }\n\n const layoutLabel = detail === undefined\n ? ''\n : detail.layout === 'agent-plugin-v1' ? t('layoutV1')\n : detail.layout === 'claude-code' ? t('layoutCC')\n : detail.layout === 'codex' ? t('layoutCodex')\n : detail.layout === 'universal' ? t('layoutUniversal')\n : detail.layout === 'cursor' ? t('layoutCursor')\n : detail.layout === 'kimi' ? t('layoutKimi')\n : detail.layout === 'remote' ? t('layoutRemote')\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 },\n h(Button, { variant: 'ghost', onClick: onClose }, t('cancel')),\n ),\n children: h(ErrorBoundary, {\n fallback: boundaryError => h('div', { className: css.warnLine }, `${t('actionFail')}: ${boundaryError.message}`),\n children: error !== undefined\n ? h('div', { className: css.warnLine }, error)\n : detail === undefined\n ? h('div', { className: css.empty }, t('loading'))\n : h('div', { className: css.detailSections },\n h('section', { className: css.detailSection },\n h('h4', { className: css.detailHead }, t('overviewSection')),\n h('div', { 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('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('dimensionLabel')), h('span', { className: css.detailValue }, detail.dimension === 'user' ? t('dimensionUser') : t('dimensionProject'))),\n h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('layoutLabel')), h('span', { className: css.detailValue }, layoutLabel)),\n h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('statusLabel')), h('span', { className: detail.enabled ? css.okState : css.detailValue }, detail.installed ? (detail.enabled ? t('installedBadge') : t('disabledLabel')) : t('notInstalledLabel'))),\n detail.author === null ? null : h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('authorLabel')), h('span', { className: css.detailValue }, detail.author)),\n detail.keywords.length === 0 ? null : h('div', { className: css.detailCell }, h('span', { className: css.detailKey }, t('keywordsLabel')), h('span', { className: css.detailValue }, detail.keywords.join(', '))),\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 ),\n h('section', { 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 => h('div', { key: skill.name, className: css.detailItem },\n h('button', {\n type: 'button',\n className: openSkill === skill.name ? css.detailItemOpen : css.detailItemRow,\n onClick: () => { void toggleSkill(skill.name) },\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 },\n skillLoading ? t('loading') : h(MarkdownText, { text: skillText ?? '' }),\n ),\n )),\n ),\n h('section', { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('mcpSection')} (${detail.mcpServers.length})`),\n detail.mcpErrors.length === 0 ? null : 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 => h('div', { key: server.key, className: css.detailItem },\n h('button', {\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('span', { className: css.detailItemDesc }, mcpSummary(server)),\n h('span', { className: css.detailChevron }, openMcp === server.key ? '▾' : '▸'),\n ),\n openMcp !== server.key ? null : h('pre', { className: css.mono }, JSON.stringify(server, null, 2)),\n )),\n ),\n h('section', { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('commandsSection')} (${detail.commands.length})`),\n detail.commands.length === 0 ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.commands.map(command => 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 }),\n })),\n ),\n h('section', { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('agentsSection')} (${detail.agents.length})`),\n detail.agents.length === 0 ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.agents.map(agent => 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 }),\n })),\n ),\n h('section', { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('hooksLabel')} (${detail.hooks.count})`),\n detail.hooks.count === 0 ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.hooks.entries.map((hook, index) => 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 h('section', { className: css.detailSection },\n h('h4', { className: css.detailHead }, `${t('lspSection')} (${detail.lsp.length})`),\n detail.lsp.length === 0 ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.lsp.map(entry => 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 detail.errors.length === 0 ? null : h('section', { 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\nfunction PreviewRow(props: {\n t: Translate\n name: string\n description?: string\n open: boolean\n onToggle: () => void\n children: ReactNode\n}): ReactNode {\n const { t: _t, name, description, open, onToggle, children } = props\n return h('div', { className: css.detailItem },\n h('button', {\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",".toolbar {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 12px auto auto auto 8px auto;\n gap: 0;\n min-width: 0;\n align-items: flex-end;\n}\n\n.filterGap,\n.viewGap {\n min-width: 0;\n}\n\n.search {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n min-width: 0;\n width: 100%;\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 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 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 grid-template-columns: auto auto auto 8px auto;\n justify-content: end;\n overflow-x: auto;\n }\n\n .search {\n grid-column: 1 / -1;\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}\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.label} ${filter.count}`,\n 'aria-label': `${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 ReactElement, type ReactNode } from 'react'\nimport {\n Button,\n Input,\n Modal,\n Toast,\n Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { fetchOverview, fetchSourceProgress, postAction, type OverviewData, type SourceOverview, type SourceProgress, type SuiteCardData } from './api.js'\nimport type { Translate } from './index.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 reading: 'progressReading',\n}\n\nexport interface MarketSectionProps {\n t: Translate\n /** The host surface controls only outer spacing; data and actions stay shared. */\n mode?: 'settings' | 'page'\n}\n\ntype Tab = 'all' | 'installed' | 'uninstalled'\ntype Category = 'all' | string\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\ntype EditorState =\n | { mode: 'edit'; source: SourceOverview }\n | { mode: 'add' }\n | undefined\n\ninterface ProgressState {\n step: string | undefined\n error: string | undefined\n}\n\n/**\n * Poll the host's source-mutation progress while an add-source request runs.\n * Failures of the poll itself never surface: the add request is the authority.\n */\nfunction startProgressPolling(report: (state: ProgressState) => void): { stop: () => void } {\n let stopped = false\n const tick = async () => {\n if (stopped) return\n try {\n const progress: SourceProgress = await fetchSourceProgress()\n if (!stopped && progress.active) report({ step: progressStepLabel(progress.step), error: undefined })\n } catch {\n // transient poll failures are ignored; the add request reports real errors\n }\n if (!stopped) timer = setTimeout(tick, 800) as unknown as number\n }\n let timer = setTimeout(tick, 400) as unknown as number\n return {\n stop: () => {\n stopped = true\n clearTimeout(timer)\n },\n }\n}\n\nfunction progressStepLabel(step: string): string {\n return PROGRESS_STEP_LABELS[step] ?? step\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\nconst EMPTY_OVERVIEW: OverviewData = { sources: [], suites: [], totals: { all: 0, installed: 0, enabled: 0 }, roots: { user: '', data: '' } }\n\n/**\n * Session-level overview cache: the first mount paints the last snapshot\n * instantly (no empty-state flash on reopen), then revalidates in the\n * background. Every refresh overwrites the cached copy.\n */\nlet cachedOverview: OverviewData | undefined\nlet inflightOverview: Promise<OverviewData> | undefined\n\nfunction 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(() => { inflightOverview = undefined })\n }\n return { initial, revalidating: cachedOverview === undefined, promise: inflightOverview }\n}\n\n/** Invalidate the cached overview after any mutating action. */\nfunction dropCachedOverview(): void {\n cachedOverview = undefined\n}\n\nexport function MarketSection({ t, mode = 'settings' }: MarketSectionProps): ReactNode {\n const [overview, setOverview] = useState<OverviewData>(() => loadOverview().initial)\n const [loading, setLoading] = useState(() => cachedOverview === undefined)\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 [editor, setEditor] = useState<EditorState>(undefined)\n const [detail, setDetail] = useState<{ sourceId: string; suiteId: string } | undefined>(undefined)\n const [progress, setProgress] = useState<ProgressState>({ step: undefined, error: undefined })\n\n const refresh = useCallback(async () => {\n dropCachedOverview()\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(async (key: string, path: string, body: Record<string, unknown>): Promise<boolean> => {\n setBusy(key)\n try {\n await postAction(path, body)\n dropCachedOverview()\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 }, [refresh, t])\n\n // Scope totals follow the selected source pill; without a selection they\n // mirror the overview-wide totals (全部 / 已安装 / 未安装 stay consistent\n // with the visible set).\n const scopeTotals = useMemo(() => {\n if (category === 'all') return overview.totals\n const scoped = overview.suites.filter(suite => suite.sourceId === category)\n return {\n all: scoped.length,\n installed: scoped.filter(suite => suite.installed).length,\n enabled: scoped.filter(suite => suite.enabled).length,\n }\n }, [overview, category])\n\n const filtered = useMemo(() => {\n const needle = search.trim().toLowerCase()\n return overview.suites.filter((suite) => {\n if (category !== 'all' && suite.sourceId !== category) return false\n if (tab === 'installed' && !suite.installed) return false\n if (tab === 'uninstalled' && suite.installed) return false\n if (needle === '') return true\n const haystack = `${suite.name} ${suite.description ?? ''} ${suite.keywords.join(' ')}`.toLowerCase()\n return haystack.includes(needle)\n })\n }, [overview, search, tab, category])\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 return h(ErrorBoundary, {\n fallback: error => h('div', { className: css.empty }, `${t('actionFail')}: ${error.message}`),\n children: h('div', { className: mode === 'page' ? `${css.market} ${css.pageMode}` : css.market },\n h('header', { className: css.header },\n h('div', { className: css.titleRow },\n h('h2', { className: css.title }, t('nav')),\n h('div', { className: css.spacer }),\n h('div', { className: css.searchGroup },\n h(Button, { variant: 'ghost', size: 'sm', title: t('addSource'), onClick: () => setEditor({ mode: 'add' }) }, '+'),\n h(Button, { variant: 'ghost', size: 'sm', title: t('refreshAll'), onClick: () => { void action('s:refresh:all', 'sources/refresh', {}) } }, '↻'),\n ),\n ),\n h('div', { className: css.marketControls },\n h('div', { className: css.sourceTabsRow },\n h('div', { 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].sort((a, b) => a.id.localeCompare(b.id)).map(source => h(SourceTab, {\n key: source.id,\n t,\n active: category === source.id,\n label: `${source.id}${source.local === true ? ` · ${t('sourceLocal')}` : ''} ${source.suiteIds.length}${source.cloned === false ? ' ⚠' : ''}`,\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 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 { id: 'installed', label: t('tabInstalled'), count: scopeTotals.installed, icon: h(StatusIcon, { kind: 'installed' }), active: tab === 'installed', onSelect: () => setTab('installed') },\n { id: 'uninstalled', label: t('tabUninstalled'), count: scopeTotals.all - scopeTotals.installed, icon: h(StatusIcon, { kind: 'uninstalled' }), active: tab === 'uninstalled', onSelect: () => setTab('uninstalled') },\n ],\n view,\n gridLabel: t('grid'),\n listLabel: t('list'),\n onViewChange: nextView => setView(nextView),\n }),\n ),\n ),\n h('main', { 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 => h(SuiteCard, {\n key: `${suite.sourceId}/${suite.suiteId}`,\n t, suite,\n busy: busy !== undefined,\n onOpen: () => setDetail({ sourceId: suite.sourceId, suiteId: suite.suiteId }),\n onInstall: () => { void action(`i:${suite.suiteId}`, 'install', { sourceId: suite.sourceId, suiteId: suite.suiteId }) },\n onAddSource: () => { if (suite.remoteUrl !== undefined) void action(`a:${suite.suiteId}`, 'sources/add', { url: suite.remoteUrl }) },\n onToggle: () => { void action(`e:${suite.suiteId}`, 'set-enabled', { sourceId: suite.sourceId, suiteId: suite.suiteId, enabled: !suite.enabled }) },\n onRefresh: () => { void action(`r:${suite.suiteId}`, 'sources/refresh', { id: suite.sourceId }) },\n onUninstall: () => openUninstall(suite),\n })),\n ),\n toast === undefined ? null : h(Toast, { key: toast.key, text: toast.message, onDone: () => setToast(undefined) }),\n confirm === undefined ? null : h(Modal, {\n open: true,\n onClose: () => setConfirm(undefined),\n title: confirm.kind === 'uninstall' ? t('uninstallConfirmTitle') : 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('div', { className: css.modalFooter },\n h(Button, { variant: 'ghost', onClick: () => setConfirm(undefined) }, t('cancel')),\n h(Button, { variant: 'primary', onClick: () => { void confirmAction() } }, t('confirmDelete')),\n ),\n }),\n detail === undefined ? null : h(SuiteDetailModal, {\n t,\n sourceId: detail.sourceId,\n suiteId: detail.suiteId,\n onClose: () => setDetail(undefined),\n }),\n\n editor === undefined ? null : h(SourceEditorModal, {\n t,\n editor,\n busy: busy !== undefined,\n progress,\n onClose: () => setEditor(undefined),\n onSave: async (url, branch, local) => {\n const key = editor.mode === 'edit' ? `s:edit:${editor.source.id}` : `s:add:${url}`\n const body = { url, ...branch === '' ? {} : { branch }, local }\n if (editor.mode === 'add') {\n setBusy(key)\n setProgress({ step: t('progressStarting'), error: undefined })\n const poll = startProgressPolling(setProgress)\n try {\n const payload = await postAction('sources/add', body)\n const derived = (payload['source'] as { id?: string } | undefined)?.id\n dropCachedOverview()\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\ntype StatusIconKind = 'all' | 'installed' | 'uninstalled'\n\nfunction StatusIcon({ kind }: { kind: StatusIconKind }): 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/** A source tab with a trailing delete control (deletion confirms at the section level). */\nfunction SourceTab(props: {\n t: Translate\n active?: boolean\n label: string\n onSelect: () => void\n onDelete?: () => void\n onEdit?: () => void\n}): ReactNode {\n const { t, active = false, label, onSelect, onDelete, onEdit } = props\n return h('div', { className: active ? css.srcTabOn : css.srcTab },\n h('button', { type: 'button', className: css.srcTabMain, onClick: onSelect }, label),\n onEdit === undefined ? null : h('button', {\n type: 'button',\n className: css.srcTabEdit,\n title: t('editSource'),\n onClick: (event: { stopPropagation(): void }) => { event.stopPropagation(); onEdit() },\n }, '✎'),\n onDelete === undefined ? null : h('button', {\n type: 'button',\n className: css.srcTabDel,\n title: t('remove'),\n onClick: (event: { stopPropagation(): void }) => { event.stopPropagation(); onDelete() },\n }, '×'),\n )\n}\n\nfunction SourceEditorModal(props: {\n t: Translate\n editor: Exclude<EditorState, undefined>\n busy: boolean\n progress: ProgressState\n onClose: () => void\n onSave: (url: string, branch: string, local: boolean) => Promise<boolean>\n onRemove: (id: string) => void\n}): ReactNode {\n const { t, editor } = props\n const [local, setLocal] = useState(editor.mode === 'edit' && editor.source.local === true)\n const [url, setUrl] = useState(editor.mode === 'edit' ? editor.source.url : '')\n const [branch, setBranch] = useState(editor.mode === 'edit' ? (editor.source.branch ?? '') : '')\n const id = editor.mode === 'edit' ? editor.source.id : ''\n const title = editor.mode === 'edit' ? t('editSourceTitle') : t('addSourceTitle')\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('div', { className: css.modalFooter },\n h('div', { className: css.modalFooterLeft },\n editor.mode === 'edit'\n ? h(Button, { variant: 'ghost', onClick: () => props.onRemove(id) }, `🗑 ${t('remove')}`)\n : null,\n ),\n h(Button, { variant: 'ghost', onClick: props.onClose }, t('cancel')),\n h(Button, {\n variant: 'primary',\n disabled: props.busy,\n onClick: () => { void props.onSave(url.trim(), branch.trim(), local) },\n }, t('save')),\n ),\n children: h('div', { className: css.editorForm },\n h('div', { className: css.modeRow },\n h('button', {\n type: 'button',\n className: local ? css.seg : css.segOn,\n onClick: () => setLocal(false),\n }, t('sourceModeGit')),\n h('button', {\n type: 'button',\n className: local ? css.segOn : css.seg,\n onClick: () => setLocal(true),\n }, t('sourceModeLocal')),\n ),\n editor.mode === 'edit'\n ? h('div', { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, t('sourceIdPh')),\n h('div', { className: css.staticId },\n h('span', { className: css.staticIdValue }, id),\n h('span', { className: css.fieldHint }, t('idFixed')),\n ),\n )\n : null,\n h('div', { className: css.fieldGroup },\n h('label', { className: css.fieldLabel }, local ? t('sourceUrlLocalPh') : t('sourceUrlPh')),\n h(Input, { placeholder: local ? t('sourceUrlLocalPh') : t('sourceUrlPh'), value: url, onChange: event => setUrl((event.target as HTMLInputElement).value) }),\n h('span', { className: css.fieldHint }, local ? t('urlLocalHint') : t('urlGitHint')),\n ),\n local ? null : h('div', { 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 props.progress.error === undefined && props.progress.step === undefined ? null : h('div', {\n className: props.progress.error === undefined ? css.progress : css.progressError,\n },\n props.progress.error === undefined\n ? h('span', { className: css.progressSpin })\n : h('span', { className: css.progressFail }, '✕'),\n h('span', { className: css.progressText },\n props.progress.error === undefined\n ? props.progress.step\n : `${t('actionFail')}: ${props.progress.error}`),\n ),\n ),\n })\n}\n\n/** A green/gray switch control for suite enable state. */\nfunction ToggleSwitch(props: {\n on: boolean\n disabled?: boolean\n title?: string\n onChange: () => void\n}): ReactNode {\n return h('button', {\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 }) => { event.stopPropagation(); props.onChange() },\n }, h('span', { className: css.switchThumb }))\n}\n\nfunction SuiteCard(props: {\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}): ReactNode {\n const { t, suite, busy } = props\n const tags: Array<[string, number]> = ([\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]>).filter(([, count]) => count > 0)\n const layoutLabel = suite.layout === 'agent-plugin-v1' ? t('layoutV1') : suite.layout === 'claude-code' ? t('layoutCC') : suite.layout === 'codex' ? t('layoutCodex') : suite.layout === 'universal' ? t('layoutUniversal') : suite.layout === 'cursor' ? t('layoutCursor') : suite.layout === 'kimi' ? t('layoutKimi') : suite.layout === 'remote' ? t('layoutRemote') : t('layoutSkills')\n const isRemote = suite.remoteUrl !== undefined\n const stop = (callback: () => void) => (event: { stopPropagation(): void }) => { event.stopPropagation(); callback() }\n return h('article', { className: css.card, onClick: props.onOpen },\n h('div', { className: css.cardTop },\n h('div', { 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('div', { className: css.cardActions },\n suite.installed\n ? h(ToggleSwitch, {\n on: suite.enabled,\n disabled: busy,\n title: suite.enabled ? t('disable') : t('enable'),\n onChange: props.onToggle,\n })\n : isRemote\n ? h(Button, {\n variant: 'primary', size: 'sm', disabled: busy,\n title: suite.remoteUrl,\n onClick: stop(props.onAddSource),\n }, t('addSource'))\n : h(Button, {\n variant: 'primary', size: 'sm', disabled: busy,\n onClick: stop(props.onInstall),\n }, t('install')),\n suite.installed ? h(Button, { variant: 'ghost', size: 'sm', title: t('refresh'), disabled: busy, onClick: stop(props.onRefresh) }, '↻') : null,\n suite.installed ? h(Button, { variant: 'ghost', size: 'sm', title: t('uninstall'), disabled: busy, onClick: stop(props.onUninstall) }, '🗑') : null,\n ),\n ),\n h('p', { className: css.desc }, suite.description ?? ''),\n h('div', { 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 suite.installed ? h('span', { className: suite.enabled ? css.okState : css.tag }, suite.enabled ? `✓ ${t('installedBadge')}` : t('installedBadge')) : null,\n ...tags.map(([label, count]) => h('span', { key: label, className: css.tag }, `${label} ${count}`)),\n suite.errors.length === 0 ? null : 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 ? null : 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 )\n}\n",".surface {\n display: flex;\n height: 100%;\n max-height: 100%;\n flex: 1;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\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.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.toolbar {\n flex: none;\n margin-bottom: 24px;\n}\n.grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n flex: 1;\n min-width: 0;\n min-height: 0;\n gap: 12px;\n align-content: start;\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding-right: 4px;\n}\n.list {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n gap: 8px;\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding-right: 4px;\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 min-height: 0;\n -webkit-line-clamp: 1;\n}\n.list .meta {\n flex: 0 1 auto;\n}\n.list .cardReason {\n flex-basis: 100%;\n}\n.card {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px;\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}\n.card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-bg-hover, rgba(0, 0, 0, 0.035));\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.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 display: -webkit-box;\n min-height: 36px;\n overflow: hidden;\n margin: 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n font: 12px/18px ui-monospace, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n}\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\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 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.cardReason {\n margin: 0;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\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.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.reason {\n padding: 9px 10px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-bg-error, rgba(220, 38, 38, .06));\n border-left: 2px solid currentColor;\n font-size: 11px;\n line-height: 16px;\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.tool {\n display: grid;\n grid-template-columns: 26px minmax(120px, auto) minmax(0, 1fr);\n gap: 8px;\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.toolIndex { color: var(--dsw-alias-brand-primary, #4f6ef7); font: 10px/16px ui-monospace, Menlo, Consolas, monospace; }\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, .list .meta { max-width: 100%; }\n .tool { grid-template-columns: 26px minmax(0, 1fr); }\n .toolDescription { display: none; }\n}\n","import { useEffect, useMemo, 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, type McpStatusEntry, type McpStatusPayload } from './api.js'\nimport { SearchFilterToolbar, type SearchFilterToolbarView } from './SearchFilterToolbar.js'\nimport css from './mcp-status.module.css'\n\ninterface McpStatusPanelProps {\n t: Translate\n}\n\ntype Filter = 'all' | 'plugin' | 'direct'\ntype ViewMode = SearchFilterToolbarView\n\nconst EMPTY_STATUS: McpStatusPayload = {\n entries: [],\n observedAt: '',\n totals: { all: 0, connected: 0, degraded: 0, failed: 0, disabled: 0 },\n directObservationOnly: true,\n}\n\n/** DSH-native MCP inventory: click a service card for a standard Modal detail. */\nexport function McpStatusPanel({ t }: 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 refresh = (): void => {\n setLoading(true)\n setError(undefined)\n fetchMcpStatus().then(setPayload).catch(caught => {\n setError(caught instanceof Error ? caught.message : String(caught))\n }).finally(() => setLoading(false))\n }\n\n useEffect(() => { refresh() }, [])\n\n // Disabled plugin definitions are configuration inventory, not runtime MCP\n // status rows. Keep this guard in the client as well as the host aggregator\n // so an older host response cannot reintroduce them into the UI.\n const activeEntries = payload.entries.filter(entry => entry.state !== 'disabled')\n const visibleTotals = {\n all: activeEntries.length,\n connected: activeEntries.filter(entry => entry.state === 'connected').length,\n failed: activeEntries.filter(entry => entry.state === 'failed').length,\n }\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase()\n return activeEntries.filter(entry => {\n if (filter !== 'all' && entry.kind !== filter) return false\n if (query === '') return true\n return `${entry.name} ${entry.source ?? ''} ${entry.endpoint ?? ''} ${entry.transport}`.toLowerCase().includes(query)\n })\n }, [activeEntries, filter, search])\n\n return h('div', { className: css.surface },\n h('header', { className: css.header },\n h('div', {},\n h('h2', { className: css.title }, t('mcpStatusTitle')),\n ),\n h('div', { className: css.headerActions },\n visibleTotals.failed > 0\n ? h('span', { className: css.errorSummary, title: `${visibleTotals.failed} ${t('mcpFailed')}` },\n h('span', { className: css.summaryDotRed }), visibleTotals.failed,\n )\n : null,\n h(Button, { variant: 'ghost', size: 'sm', onClick: refresh, disabled: loading, title: t('refresh') }, '↻'),\n ),\n ),\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: kind === 'all' ? visibleTotals.all : activeEntries.filter(entry => entry.kind === kind).length,\n icon: h(McpFilterIcon, { kind }),\n active: filter === kind,\n onSelect: () => setFilter(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('div', { 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, onClose: () => setSelected(undefined) }),\n )\n}\n\nfunction McpCard({ entry, t, onClick }: { entry: McpStatusEntry; t: Translate; onClick: () => void }): ReactNode {\n return h('button', { type: 'button', className: css.card, onClick },\n h('div', { className: css.cardTop },\n h('span', {\n className: `${css.statusDot} ${css[`status${entry.state}`]}`,\n title: stateLabel(t, entry.state),\n 'aria-label': stateLabel(t, entry.state),\n }),\n h('span', { className: css.service }, h('span', { className: css.name }, entry.name)),\n h('span', { className: css.toolCount }, `${t('mcpTools')} ${entry.tools.length}`),\n ),\n h('p', { className: css.endpoint }, entry.endpoint ?? t('mcpObservedEndpoint')),\n h('div', { className: css.meta },\n h(McpSourceBadge, { kind: entry.kind, label: entry.kind === 'plugin' ? (entry.source ?? '—') : t('mcpDirect'), t }),\n h('span', { className: css.transport }, entry.transport),\n ),\n entry.reason === undefined ? null : h('p', { className: css.cardReason }, entry.reason),\n )\n}\n\nfunction McpSourceBadge({ kind, label, t }: { kind: 'plugin' | 'direct'; label: string; t: Translate }): ReactNode {\n return h('span', { className: kind === 'plugin' ? css.sourcePlugin : css.sourceDirect },\n h(McpSourceIcon, { kind }),\n h('span', {}, kind === 'plugin' ? label : t('mcpDirect')),\n )\n}\n\nfunction McpSourceIcon({ kind }: { kind: 'plugin' | 'direct' }): ReactNode {\n const common = { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true } as const\n return kind === 'plugin'\n ? 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 : 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('svg', { width: 16, height: 16, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true }, 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\nfunction McpDetailModal({ entry, t, onClose }: { entry: McpStatusEntry; t: Translate; onClose: () => void }): ReactNode {\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('div', { className: css.modalFooter }, h(Button, { variant: 'ghost', onClick: onClose }, t('cancel'))),\n children: h('div', { className: css.detail },\n h('div', { className: css.detailMeta },\n h(McpSourceBadge, { kind: entry.kind, label: entry.kind === 'plugin' ? (entry.source ?? '—') : t('mcpDirect'), t }),\n h('span', { className: css.transport }, entry.transport),\n h('span', { className: `${css.state} ${css[`state${entry.state}`]}` }, stateLabel(t, entry.state)),\n ),\n entry.reason === undefined ? null : h('div', { className: css.reason }, entry.reason),\n h('section', { 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('section', { 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 }, t('mcpNoTools'))\n : h('div', { className: css.toolList }, entry.tools.map((tool, index) => h('div', { key: tool.name, className: css.tool },\n h('span', { className: css.toolIndex }, String(index + 1).padStart(2, '0')),\n h('span', { className: css.toolName }, tool.name),\n h('span', { className: css.toolDescription }, tool.description ?? ''),\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\nfunction stateLabel(t: Translate, state: McpStatusEntry['state']): string {\n if (state === 'connected') return t('mcpConnected')\n if (state === 'degraded') return t('mcpDegraded')\n if (state === 'failed') return t('mcpFailed')\n return t('mcpDisabled')\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 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 /** 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, 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 { en, zh, type LocaleKey } from './locales.js'\nimport { MarketSection } from './MarketSection.js'\nimport { McpStatusPanel } from './McpStatusPanel.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 client cordis context this plugin relies on (structural subset). */\ninterface SuiteClientContext {\n effect(callback: () => unknown, label?: string): void\n locale: LocaleService\n slots: SlotsService\n}\n\nexport const name = 'dsh-agent-plugins-market'\nexport const inject = ['slots', 'locale']\n\n/** Primitives this section renders with; absent exports degrade the whole section. */\nexport const REQUIRED_PRIMITIVES = ['Button', 'Input', 'Modal', 'Toast', 'Tooltip'] as const\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\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 isSettingsSurfaceAvailable: () => settingsSurfaceAvailable,\n subscribeLocale: ctx.locale.subscribe === undefined ? undefined : (listener) => ctx.locale.subscribe!(listener),\n }), 'dsh-agent-plugins-market: legacy page mode')\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 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 }))\n return () => {\n settingsSurfaceAvailable = false\n notifyPageModeSurfaceChange()\n if (typeof mcpDispose === 'function') mcpDispose()\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","Modal","css","Button","Input","h","css","h","css","Button","Tooltip","h","Component","h","useState","useRef","h","Modal","css","Button","MarkdownText","h","css","Input","useState","useCallback","useMemo","h","css","Button","Toast","Modal","useState","h","css","Button","Modal","h","css","createRoot","primitives","h"],"sources":["../src/client/locales.ts","../src/contracts/market.ts","../src/client/api.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/ui/ToggleSwitch.tsx","../src/client/features/market/SuiteCard.tsx","../src/client/ui/StatusIcon.tsx","../src/client/ErrorBoundary.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/page-mode-selection.ts","../src/client/page-mode.tsx","../src/client/index.ts"],"sourcesContent":["/** 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 sourceModeGit: '远程 git',\n sourceModeLocal: '本地目录',\n branchPh: '分支(可选)',\n sourceLocal: '本地',\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 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 urlLocalHint: '绝对路径或 ~/…,直接读取本地目录(不克隆、移除源时不会删除)',\n branchHint: '可选;不填则跟踪默认分支',\n idFixed: 'id 不可修改(源标识全局唯一)',\n progressStarting: '正在提交…',\n progressCloning: '正在克隆仓库(git clone),可能需要几十秒…',\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 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 remoteRef: '远程',\n surfaceSkills: '技能',\n surfaceMcp: 'MCP',\n surfaceHooks: 'Hooks',\n surfaceCommands: '命令',\n surfaceAgents: '子代理',\n surfaceLsp: 'LSP',\n sourceNotCloned: '未克隆',\n sourceCloned: '已克隆',\n errors: '校验问题',\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 mcpStatusTitle: 'MCP 服务',\n mcpStatusSubtitle: '连接状态、来源和工具清单',\n mcpSearch: '搜索 MCP 名称、来源或地址…',\n mcpAll: '全部',\n mcpPlugin: 'Plugin',\n mcpDirect: '直接安装',\n mcpService: '服务',\n mcpSource: '来源',\n mcpTransport: '传输',\n mcpTools: '工具',\n mcpConnected: '已连接',\n mcpDegraded: '降级',\n mcpFailed: '失败',\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}\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 sourceModeGit: 'remote git',\n sourceModeLocal: 'local dir',\n branchPh: 'branch (optional)',\n sourceLocal: 'local',\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 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 urlLocalHint: 'absolute path or ~/…, read in place (never cloned, never deleted on removal)',\n branchHint: 'optional; defaults to the repository default branch',\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 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 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 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 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 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 mcpConnected: 'connected',\n mcpDegraded: 'degraded',\n mcpFailed: 'failed',\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}\n","/** 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 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 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} as const\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 cloned: boolean\n lockCommit?: string\n error?: 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/** 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 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}\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 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}\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 skills: SuiteSkillMeta[]\n mcpServers: McpServerDetail[]\n hooks: { count: number; entries: HookPreview[] }\n commands: MarkdownPreview[]\n agents: MarkdownPreview[]\n lsp: LspPreview[]\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'\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'\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 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\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","/** 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: '' } }\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 height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n min-width: 0;\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.pageMode {\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-bg-selected, #edf1ff);\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-bg-hover, rgba(0, 0, 0, 0.05));\n}\n\n.pageEntry:active {\n background: var(--dsw-alias-bg-active, rgba(0, 0, 0, 0.08));\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.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.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 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 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 -webkit-line-clamp: 1;\n}\n\n.list .cardActions {\n flex: 0 0 auto;\n}\n\n.list .meta {\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}\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.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.switchOn {\n background: var(--dsw-alias-state-success-primary, #22c55e);\n}\n\n.switchOff {\n background: var(--dsw-alias-state-neutral, #d1d5db);\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 min-height: 36px;\n margin: 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.meta {\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.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-bg-hover, rgba(0, 0, 0, 0.05));\n}\n\n.detailItemOpen {\n background: var(--dsw-alias-bg-selected, rgba(79, 110, 247, 0.08));\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-danger, #e5484d);\n color: var(--dsw-alias-danger, #e5484d);\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","/** 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 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, onSelect, onDelete, onEdit } = props\n return h(\n 'div',\n { className: active ? css.srcTabOn : css.srcTab },\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\nexport interface SourceEditorModalProps {\n t: Translate\n editor: Exclude<EditorState, undefined>\n busy: boolean\n progress: SourceProgressState\n onClose: () => void\n onSave: (url: string, branch: string, local: boolean) => Promise<boolean>\n onRemove: (id: string) => void\n}\n\nexport function SourceEditorModal(props: SourceEditorModalProps): ReactNode {\n const { t, editor } = props\n const [local, setLocal] = useState(editor.mode === 'edit' && editor.source.local === true)\n const [url, setUrl] = useState(editor.mode === 'edit' ? editor.source.url : '')\n const [branch, setBranch] = useState(editor.mode === 'edit' ? (editor.source.branch ?? '') : '')\n const id = editor.mode === 'edit' ? editor.source.id : ''\n const title = editor.mode === 'edit' ? t('editSourceTitle') : t('addSourceTitle')\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.trim(), branch.trim(), local)\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 h(\n 'button',\n {\n type: 'button',\n className: local ? css.seg : css.segOn,\n onClick: () => setLocal(false)\n },\n t('sourceModeGit')\n ),\n h(\n 'button',\n {\n type: 'button',\n className: local ? css.segOn : css.seg,\n onClick: () => setLocal(true)\n },\n t('sourceModeLocal')\n )\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 }, local ? t('sourceUrlLocalPh') : t('sourceUrlPh')),\n h(Input, { placeholder: local ? t('sourceUrlLocalPh') : t('sourceUrlPh'), value: url, onChange: event => setUrl((event.target as HTMLInputElement).value) }),\n h('span', { className: css.fieldHint }, local ? t('urlLocalHint') : t('urlGitHint'))\n ),\n local\n ? null\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 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","/** Shared green/gray switch control used by suite cards. */\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 : t('layoutSkills')\n const isRemote = suite.remoteUrl !== undefined\n const stop = (callback: () => void) => (event: { stopPropagation(): void }) => {\n event.stopPropagation()\n callback()\n }\n return h(\n 'article',\n { className: 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 ? h(ToggleSwitch, {\n on: suite.enabled,\n disabled: busy,\n title: suite.enabled ? t('disable') : t('enable'),\n onChange: props.onToggle\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 suite.installed ? h(Button, { variant: 'ghost', size: 'sm', title: t('refresh'), disabled: busy, onClick: stop(props.onRefresh) }, '↻') : null,\n suite.installed ? h(Button, { variant: 'ghost', size: 'sm', title: t('uninstall'), disabled: busy, onClick: stop(props.onUninstall) }, '🗑') : null\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 suite.installed ? h('span', { className: suite.enabled ? css.okState : css.tag }, suite.enabled ? `✓ ${t('installedBadge')}` : t('installedBadge')) : null,\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 )\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","/** 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, useRef, useState, type ReactNode } from 'react'\nimport { Button, Modal, MarkdownText } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { fetchSkillContent, fetchSuiteDetail, type McpServerDetail, type SuiteDetail } from './api.js'\nimport { ErrorBoundary } from './ErrorBoundary.js'\nimport type { Translate } from './index.js'\nimport { createLatestRequestGuard } from './features/suite-detail/suite-detail-resource.js'\nimport css from './market.module.css'\n\nexport interface SuiteDetailModalProps {\n t: Translate\n sourceId: string\n suiteId: string\n onClose: () => void\n}\n\nexport function SuiteDetailModal({ t, sourceId, suiteId, onClose }: SuiteDetailModalProps): ReactNode {\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 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 : 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 ),\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 ?? '' }))\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 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('span', { className: css.detailItemDesc }, mcpSummary(server)),\n h('span', { className: css.detailChevron }, openMcp === server.key ? '▾' : '▸')\n ),\n openMcp !== server.key ? null : h('pre', { className: css.mono }, JSON.stringify(server, null, 2))\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 })\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 })\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.length})`),\n detail.lsp.length === 0\n ? h('div', { className: css.sidebarEmpty }, '—')\n : detail.lsp.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 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\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",".toolbar {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 12px auto auto auto 8px auto;\n gap: 0;\n min-width: 0;\n align-items: flex-end;\n}\n\n.filterGap,\n.viewGap {\n min-width: 0;\n}\n\n.search {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n min-width: 0;\n width: 100%;\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 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 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 grid-template-columns: auto auto auto 8px auto;\n justify-content: end;\n overflow-x: auto;\n }\n\n .search {\n grid-column: 1 / -1;\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}\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.label} ${filter.count}`,\n 'aria-label': `${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 { SuiteCard } from './features/market/SuiteCard.js'\nimport { StatusIcon } from './ui/StatusIcon.js'\nimport type { Translate } from './index.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 reading: 'progressReading'\n}\n\nexport interface MarketSectionProps {\n t: Translate\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, 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 [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 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 h(SourceTab, {\n key: source.id,\n t,\n active: category === source.id,\n label: `${source.id}${source.local === true ? ` · ${t('sourceLocal')}` : ''} ${source.suiteIds.length}${source.cloned === false ? ' ⚠' : ''}`,\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 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 void action(`i:${suite.suiteId}`, 'install', { sourceId: suite.sourceId, suiteId: suite.suiteId })\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 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 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, local) => {\n const key = editor.mode === 'edit' ? `s:edit:${editor.source.id}` : `s:add:${url}`\n const body = { url, ...(branch === '' ? {} : { branch }), local }\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 visibleTotals: { all: number; connected: number; failed: 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 let connected = 0\n let failed = 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 if (entry.state === 'connected') connected++\n if (entry.state === 'failed') failed++\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: { all: activeEntries.length, connected, failed }\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}`.toLowerCase()\n }))\n searchableCache.set(payload, searchable)\n return searchable\n}\n",".surface {\n display: flex;\n height: 100%;\n max-height: 100%;\n flex: 1;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\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.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.toolbar {\n flex: none;\n margin-bottom: 24px;\n}\n.grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n flex: 1;\n min-width: 0;\n min-height: 0;\n gap: 12px;\n align-content: start;\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding-right: 4px;\n}\n.list {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n gap: 8px;\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding-right: 4px;\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 min-height: 0;\n -webkit-line-clamp: 1;\n}\n.list .meta {\n flex: 0 1 auto;\n}\n.list .cardReason {\n flex-basis: 100%;\n}\n.card {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px;\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}\n.card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-bg-hover, rgba(0, 0, 0, 0.035));\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.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 display: -webkit-box;\n min-height: 36px;\n overflow: hidden;\n margin: 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n font: 12px/18px ui-monospace, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n}\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\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 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.cardReason {\n margin: 0;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\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.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.reason {\n padding: 9px 10px;\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-bg-error, rgba(220, 38, 38, .06));\n border-left: 2px solid currentColor;\n font-size: 11px;\n line-height: 16px;\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.tool {\n display: grid;\n grid-template-columns: 26px minmax(120px, auto) minmax(0, 1fr);\n gap: 8px;\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.toolIndex { color: var(--dsw-alias-brand-primary, #4f6ef7); font: 10px/16px ui-monospace, Menlo, Consolas, monospace; }\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, .list .meta { max-width: 100%; }\n .tool { grid-template-columns: 26px minmax(0, 1fr); }\n .toolDescription { display: none; }\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, type McpStatusEntry, type McpStatusPayload } from './api.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}\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, disabled: 0 },\n directObservationOnly: true\n}\n\n/** DSH-native MCP inventory: click a service card for a standard Modal detail. */\nexport function McpStatusPanel({ t }: 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 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\n return h(\n 'div',\n { className: css.surface },\n h(\n 'header',\n { className: css.header },\n h('div', {}, h('h2', { className: css.title }, t('mcpStatusTitle'))),\n h(\n 'div',\n { className: css.headerActions },\n visibleTotals.failed > 0\n ? h('span', { className: css.errorSummary, title: `${visibleTotals.failed} ${t('mcpFailed')}` }, h('span', { className: css.summaryDotRed }), visibleTotals.failed)\n : null,\n h(Button, { variant: 'ghost', size: 'sm', onClick: refresh, disabled: loading, title: t('refresh') }, '↻')\n )\n ),\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 })),\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, onClose: () => setSelected(undefined) })\n )\n}\n\nfunction McpCard({ entry, t, onClick }: { entry: McpStatusEntry; t: Translate; onClick: () => void }): ReactNode {\n return h(\n 'button',\n { type: 'button', className: css.card, onClick },\n h(\n 'div',\n { className: css.cardTop },\n h('span', {\n className: `${css.statusDot} ${css[`status${entry.state}`]}`,\n title: stateLabel(t, entry.state),\n 'aria-label': stateLabel(t, entry.state)\n }),\n h('span', { className: css.service }, h('span', { className: css.name }, entry.name)),\n h('span', { className: css.toolCount }, `${t('mcpTools')} ${entry.tools.length}`)\n ),\n h('p', { className: css.endpoint }, entry.endpoint ?? t('mcpObservedEndpoint')),\n h(\n 'div',\n { className: css.meta },\n h(McpSourceBadge, { kind: entry.kind, label: entry.kind === 'plugin' ? (entry.source ?? '—') : t('mcpDirect'), t }),\n h('span', { className: css.transport }, entry.transport)\n ),\n entry.reason === undefined ? null : h('p', { className: css.cardReason }, entry.reason)\n )\n}\n\nfunction McpSourceBadge({ kind, label, t }: { kind: 'plugin' | 'direct'; label: string; t: Translate }): ReactNode {\n return h('span', { className: kind === 'plugin' ? css.sourcePlugin : css.sourceDirect }, h(McpSourceIcon, { kind }), h('span', {}, kind === 'plugin' ? label : t('mcpDirect')))\n}\n\nfunction McpSourceIcon({ kind }: { kind: 'plugin' | 'direct' }): ReactNode {\n const common = { width: 16, height: 16, 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\nfunction McpDetailModal({ entry, t, onClose }: { entry: McpStatusEntry; t: Translate; onClose: () => void }): ReactNode {\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('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.detailMeta },\n h(McpSourceBadge, { kind: entry.kind, label: entry.kind === 'plugin' ? (entry.source ?? '—') : t('mcpDirect'), t }),\n h('span', { className: css.transport }, entry.transport),\n h('span', { className: `${css.state} ${css[`state${entry.state}`]}` }, stateLabel(t, entry.state))\n ),\n entry.reason === undefined ? null : h('div', { className: css.reason }, entry.reason),\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 }, t('mcpNoTools'))\n : h(\n 'div',\n { className: css.toolList },\n entry.tools.map((tool, index) =>\n h(\n 'div',\n { key: tool.name, className: css.tool },\n h('span', { className: css.toolIndex }, String(index + 1).padStart(2, '0')),\n h('span', { className: css.toolName }, tool.name),\n 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\nfunction stateLabel(t: Translate, state: McpStatusEntry['state']): string {\n if (state === 'connected') return t('mcpConnected')\n if (state === 'degraded') return t('mcpDegraded')\n if (state === 'failed') return t('mcpFailed')\n return t('mcpDisabled')\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 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 /** 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, 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 { en, zh, type LocaleKey } from './locales.js'\nimport { MarketSection } from './MarketSection.js'\nimport { McpStatusPanel } from './McpStatusPanel.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 client cordis context this plugin relies on (structural subset). */\ninterface SuiteClientContext {\n effect(callback: () => unknown, label?: string): void\n locale: LocaleService\n slots: SlotsService\n}\n\nexport const name = 'dsh-agent-plugins-market'\nexport const inject = ['slots', 'locale']\n\n/** Primitives this section renders with; absent exports degrade the whole section. */\nexport const REQUIRED_PRIMITIVES = ['Button', 'Input', 'Modal', 'Toast', 'Tooltip'] as const\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\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 isSettingsSurfaceAvailable: () => settingsSurfaceAvailable,\n subscribeLocale: ctx.locale.subscribe === undefined ? undefined : (listener) => ctx.locale.subscribe!(listener),\n }), 'dsh-agent-plugins-market: legacy page mode')\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 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 }))\n return () => {\n settingsSurfaceAvailable = false\n notifyPageModeSurfaceChange()\n if (typeof mcpDispose === 'function') mcpDispose()\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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"}