dsh-agent-plugins-market 0.4.5 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/README.zh.md +4 -4
- package/client/client.js +697 -63
- package/client/client.js.map +1 -1
- package/lib/discovery.js +30 -28
- package/lib/index.js +4 -0
- package/lib/manager.js +11 -0
- package/lib/mcp-status.js +147 -0
- package/lib/routes.js +3 -0
- package/lib/types/discovery.d.ts +7 -4
- package/lib/types/manager.d.ts +6 -0
- package/lib/types/mcp-status.d.ts +51 -0
- package/package.json +1 -1
package/client/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["Component","h","useState","h","Modal","css","Button","MarkdownText","useState","useCallback","useMemo","h","css","Button","Input","Toast","Modal","Tooltip","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/MarketSection.tsx","../src/client/index.ts"],"sourcesContent":["/** zh/en dictionaries for the Agent Plugins Market section. */\n\nexport type Dictionary = Record<string, string>\n\nexport const zh: Dictionary = {\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: '移除仓库源',\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 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}\n\nexport const en: Dictionary = {\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',\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 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}\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 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: 14px;\n color: var(--dsw-alias-label-primary, #1f2328);\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: 12px;\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.tabGap {\n width: 16px;\n flex-shrink: 0;\n}\n\n.searchGroup {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n.searchWrap {\n display: flex;\n align-items: center;\n}\n\n.searchInput {\n display: flex;\n align-items: center;\n}\n\n.searchInput input {\n width: 240px;\n font-size: 12px;\n line-height: 20px;\n}\n\n.tabRow {\n display: flex;\n gap: 2px;\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n align-items: flex-end;\n justify-content: flex-end;\n}\n\n.tab,\n.tabOn {\n border: none;\n background: none;\n font: inherit;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n padding: 7px 12px;\n cursor: pointer;\n border-bottom: 2px solid transparent;\n white-space: nowrap;\n}\n\n.tabOn {\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/* View-switch control (列表/网格): same metrics as .tab so it aligns on the row. */\n.viewSwitch {\n border: none;\n background: none;\n font: inherit;\n font-size: 13px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n padding: 7px 12px;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.viewSwitch:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\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(120px, 1fr));\n gap: 6px;\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: rgba(255, 255, 255, 0.85);\n}\n\n.srcTabOn .srcTabEdit:hover {\n color: #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, #4f6ef7);\n border-color: var(--dsw-alias-brand-primary, #4f6ef7);\n}\n\n.srcTabOn .srcTabMain {\n color: #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: rgba(255, 255, 255, 0.85);\n}\n\n.srcTabOn .srcTabDel:hover {\n color: #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 * 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') : detail.layout === 'claude-code' ? t('layoutCC') : detail.layout === 'codex' ? t('layoutCodex') : detail.layout === 'remote' ? t('layoutRemote') : 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(';')}`),\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","/**\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 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}\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\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 }: 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: css.market },\n h('header', { className: css.header },\n h('div', { className: css.titleRow },\n h('h2', { className: css.title }, t('nav')),\n h('p', { className: css.sub }, t('subtitle')),\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 h('div', { className: css.searchWrap },\n h(Input, { className: css.searchInput, placeholder: t('searchPh'), value: search, onChange: event => setSearch((event.target as HTMLInputElement).value) })),\n ),\n ),\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('div', { className: css.tabRow },\n h(TabButton, { t, active: tab === 'all', label: `${t('tabAll')} ${scopeTotals.all}`, onClick: () => setTab('all') }),\n h(TabButton, { t, active: tab === 'installed', label: `${t('tabInstalled')} ${scopeTotals.installed}`, onClick: () => setTab('installed') }),\n h(TabButton, { t, active: tab === 'uninstalled', label: `${t('tabUninstalled')} ${scopeTotals.all - scopeTotals.installed}`, onClick: () => setTab('uninstalled') }),\n h('div', { className: css.tabGap }),\n h('button', {\n type: 'button',\n className: css.viewSwitch,\n onClick: () => setView(view === 'grid' ? 'list' : 'grid'),\n }, view === 'grid' ? t('list') : t('grid')),\n ),\n ),\n h('main', { className: view === 'grid' ? css.grid : css.list },\n loading\n ? h('div', { className: css.empty }, '…')\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') : `${t('removeSourceConfirmTitle')}「${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\nfunction TabButton({ t: _t, active, label, onClick }: { t: Translate; active: boolean; label: string; onClick: () => void }): ReactNode {\n return h('button', { type: 'button', className: active ? css.tabOn : css.tab, onClick }, label)\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(';'),\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(';'),\n children: h('span', { className: css.warnLine }, `⚠ ${t('mcpSection')} ${suite.mcpErrors!.length}`) as unknown as ReactElement,\n }),\n ),\n )\n}\n","/**\n * dsh-agent-plugins-market client: registers the Agent Plugins Market section inside the Web\n * GUI's settings dialog (the same settings.section seat dshmarket uses).\n * Mirrors the market's integration contract: the bundle's only externals are\n * react and the injected `dsh.client.inject` module table, so it cannot reach\n * 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 } from './locales.js'\nimport { MarketSection } from './MarketSection.js'\n\nconst NS = 'dsh-agent-plugins-market'\n\nexport type Translate = (key: string) => 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}\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 ctx.slots.inject('settings.section', () => 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 })))\n}\n"],"mappings":"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"}
|
|
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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"}
|