dsh-plugin-capabilities 0.3.1 → 0.3.3

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/lib/client.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client/index.ts", "../src/client/CapabilitiesSection.tsx", "../src/client/css.ts", "../src/client/MarketTab.tsx", "../src/client/McpTab.tsx", "../src/client/SkillsTab.tsx", "../src/client/locales.ts"],
4
- "sourcesContent": ["/** dsh-plugin-capabilities client entry: contributes the top-level\n * \u201C\u6280\u80FD\u4E0E MCP\u201D section into Settings (beside \u901A\u7528\u8BBE\u7F6E/\u6A21\u578B, with Skills, MCP,\n * and \u5E02\u573A as internal tabs). Calls the host routes with fetch. */\n\nimport { createElement as h } from 'react'\nimport { CapabilitiesSection } from './CapabilitiesSection.tsx'\nimport type { McpInjected, McpRow } from './McpTab.tsx'\nimport type { MarketInjected, RootRowView } from './MarketTab.tsx'\nimport type { SkillsInjected, SkillRowView } from './SkillsTab.tsx'\nimport { zh, en } from './locales.ts'\n\n/** Locale dictionary namespace owned by this plugin. */\nexport const NS = 'settings.pluginCapabilities'\n\n/** The `t` function bound by the locale service. */\nexport interface Translate {\n (key: string): string\n}\n\n/** Minimal structural subset of the slots service. */\ninterface SlotsService {\n inject(slot: string, register: () => unknown): void\n register(meta: Record<string, unknown>, component: () => unknown): unknown\n}\n\n/** Minimal structural subset of the locale service. */\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 client cordis context this plugin relies on (structural). */\ninterface CapabilitiesClientContext {\n effect(callback: () => unknown, label?: string): void\n locale: LocaleService\n slots: SlotsService\n}\n\n/** Same-origin fetch of the manager's host routes. */\nasync function fetchJson<T>(path: string, init?: RequestInit): Promise<T> {\n const response = await fetch(path, init)\n const body = (await response.json()) as T & { error?: string }\n if (!response.ok) throw new Error(body.error ?? `HTTP ${response.status}`)\n return body\n}\n\nconst post = (path: string, body: unknown): Promise<unknown> =>\n fetchJson(path, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(body) })\n\nexport const name = 'dsh-plugin-capabilities'\nexport const inject = ['slots', 'locale']\n\nexport interface SkillBody { content: string }\n\n/** One foreign-agent server from the import scan. */\nexport interface ImportedServerView {\n agent: 'claude-code' | 'codex'\n name: string\n transport: 'stdio' | 'streamable-http'\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n}\n\n/** Openable targets on the host (server resolves real paths). */\nexport type OpenTarget =\n | { target: 'user-skills' }\n | { target: 'skill'; name: string }\n | { target: 'root'; id: string }\n\nexport function apply(ctx: CapabilitiesClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-plugin-capabilities: dictionaries')\n const t = ctx.locale.bind(NS)\n\n const skillsInjected: SkillsInjected = {\n list: () => fetchJson<{ skills: SkillRowView[] }>('/dsh-plugin-capabilities/skills'),\n get: (name: string) => fetchJson<SkillBody>(`/dsh-plugin-capabilities/skill?name=${encodeURIComponent(name)}`),\n save: (input: unknown) => post('/dsh-plugin-capabilities/skill/save', input) as Promise<{ ok: boolean }>,\n remove: (name: string) => post('/dsh-plugin-capabilities/skill/delete', { name }) as Promise<{ ok: boolean }>,\n policy: (name: string, enabled: boolean) =>\n post('/dsh-plugin-capabilities/skill/policy', { name, enabled }) as Promise<{ ok: boolean }>,\n open: (target: OpenTarget) => post('/dsh-plugin-capabilities/open', target) as Promise<{ ok: boolean }>,\n roots: () => fetchJson<{ roots: RootRowView[] }>('/dsh-plugin-capabilities/roots'),\n addRoot: (input: { kind: 'local' | 'git'; path?: string; url?: string }) =>\n post('/dsh-plugin-capabilities/roots/add', input) as Promise<{ ok: boolean; root: RootRowView }>,\n removeRoot: (id: string) => post('/dsh-plugin-capabilities/roots/remove', { id }) as Promise<{ ok: boolean }>,\n }\n\n const mcpInjected: McpInjected = {\n list: () => fetchJson<{ servers: McpRow[] }>('/dsh-plugin-capabilities/mcp'),\n save: (input: unknown) => post('/dsh-plugin-capabilities/mcp/save', input) as Promise<{ ok: boolean; id: string }>,\n toggle: (id: string, disabled: boolean) => post('/dsh-plugin-capabilities/mcp/toggle', { id, disabled }) as Promise<{ ok: boolean }>,\n remove: (id: string) => post('/dsh-plugin-capabilities/mcp/remove', { id }) as Promise<{ ok: boolean }>,\n scanImport: () => fetchJson<{ servers: ImportedServerView[]; existing: string[] }>('/dsh-plugin-capabilities/import/scan'),\n applyImport: (items: Array<{ agent: string; name: string }>) =>\n post('/dsh-plugin-capabilities/import/apply', { items }) as Promise<{ ok: boolean; results: Array<{ name: string; ok: boolean; error?: string }> }>,\n restart: async (): Promise<void> => {\n if (window.dshDesktop !== undefined) {\n window.dshDesktop.restartSidecar?.()\n return\n }\n // \u72EC\u7ACB dsh web\uFF1A\u81EA\u91CD\u542F\u8DEF\u7531\u3002\u8FDE\u63A5\u5728\u5173\u505C\u9014\u4E2D\u65AD\u5F00\u5C5E\u9884\u671F\uFF0C\u4E0D\u7B97\u5931\u8D25\u3002\n try { await post('/dsh-plugin-capabilities/restart', {}) } catch { /* dying mid-restart is expected */ }\n },\n desktop: window.dshDesktop !== undefined,\n }\n\n const marketInjected: MarketInjected = {\n skillsIndex: () => fetchJson<{ source: 'remote' | 'bundled'; repos: Array<MarketRepoView & { installedId: string | null }> }>('/dsh-plugin-capabilities/market/skills'),\n mcpIndex: () => fetchJson<{ source: 'remote' | 'bundled'; servers: Array<MarketServerView & { installed: boolean }> }>('/dsh-plugin-capabilities/market/mcp'),\n installSkillRepo: (url: string) =>\n post('/dsh-plugin-capabilities/market/skills/install', { url }) as Promise<{ ok: boolean; root: RootRowView }>,\n installMcp: (id: string) =>\n post('/dsh-plugin-capabilities/market/mcp/install', { id }) as Promise<{ ok: boolean; id: string }>,\n removeRoot: skillsInjected.removeRoot,\n }\n\n // One top-level nav entry (between \u6A21\u578B and \u63D2\u4EF6), not a tab under the\n // Plugins section \u2014 the section component owns its internal tabs directly,\n // so nothing registers into settings.plugins.tab anymore.\n ctx.slots.inject('settings.section', () => {\n return ctx.slots.register({\n name: 'settings.section',\n id: 'capabilities',\n order: 12,\n label: () => t('sectionNav'),\n locale: NS,\n }, () => h(CapabilitiesSection, { t, skills: skillsInjected, mcp: mcpInjected, market: marketInjected }))\n })\n}\n\n/** One skill inside a market repository's inventory, as the browser sees it. */\nexport interface MarketSkillItemView {\n name: string\n description?: string\n descriptionZh?: string\n}\n\n/** One skills-market repository as the browser sees it. */\nexport interface MarketRepoView {\n id: string\n name: string\n nameZh?: string\n description: string\n descriptionZh?: string\n detail?: string\n detailZh?: string\n url: string\n homepage?: string\n skillCount?: number\n skills?: MarketSkillItemView[]\n}\n\n/** One MCP-market server as the browser sees it. */\nexport interface MarketServerView {\n id: string\n name: string\n nameZh?: string\n description: string\n descriptionZh?: string\n transport: 'stdio' | 'streamable-http'\n command?: string\n args?: string[]\n envKeys?: string[]\n url?: string\n homepage: string\n category?: string\n runtime?: string\n tools?: string[]\n detail?: string\n detailZh?: string\n}\n", "/** Settings top-level \u201C\u6280\u80FD\u4E0E MCP\u201D section: one nav entry beside \u901A\u7528\u8BBE\u7F6E and\n * \u6A21\u578B, with the Skills, MCP, and \u5E02\u573A pages as internal tabs. The pages are\n * pure composition; data still arrives through the injected faces. */\n\nimport { useEffect, useId, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { CSS } from './css.ts'\nimport { MarketTab } from './MarketTab.tsx'\nimport type { MarketInjected } from './MarketTab.tsx'\nimport { McpTab } from './McpTab.tsx'\nimport type { McpInjected } from './McpTab.tsx'\nimport { SkillsTab } from './SkillsTab.tsx'\nimport type { SkillsInjected } from './SkillsTab.tsx'\nimport type { Translate } from './index.ts'\n\nexport function CapabilitiesSection(props: {\n t: Translate\n skills: SkillsInjected\n mcp: McpInjected\n market: MarketInjected\n}): ReactElement {\n const { t, skills, mcp, market } = props\n const tabsId = useId()\n const tabRefs = useRef<Array<HTMLButtonElement | null>>([])\n const rows = [\n { id: 'skills', label: t('skillsTab') },\n { id: 'mcp', label: t('mcpTab') },\n { id: 'market', label: t('marketTab') },\n ]\n const [activeId, setActiveId] = useState('skills')\n // The skills page mounts immediately; a tab mounts only when first\n // selected, then stays mounted while hidden so editor drafts and outcome\n // banners survive switching between the views.\n const [visitedIds, setVisitedIds] = useState<ReadonlySet<string>>(() => new Set(['skills']))\n\n useEffect(() => {\n setVisitedIds((previous) => {\n if (previous.has(activeId)) return previous\n return new Set([...previous, activeId])\n })\n }, [activeId])\n\n return (\n <div className=\"dpc-section\">\n <style>{CSS}</style>\n\n <h2 className=\"dpc-heading\">{t('sectionNav')}</h2>\n <div className=\"dpc-tabs\" role=\"tablist\" aria-label={t('sectionNav')}>\n {rows.map((row, index) => {\n const selected = row.id === activeId\n return (\n <button\n key={row.id}\n ref={(element) => { tabRefs.current[index] = element }}\n id={`${tabsId}-tab-${row.id}`}\n type=\"button\"\n role=\"tab\"\n className=\"dpc-tab\"\n aria-selected={selected}\n aria-controls={`${tabsId}-panel-${row.id}`}\n data-active={selected ? 'true' : undefined}\n tabIndex={selected ? 0 : -1}\n onClick={() => { setActiveId(row.id) }}\n onKeyDown={(event) => {\n let nextIndex: number\n switch (event.key) {\n case 'ArrowRight': nextIndex = (index + 1) % rows.length; break\n case 'ArrowLeft': nextIndex = (index - 1 + rows.length) % rows.length; break\n case 'Home': nextIndex = 0; break\n case 'End': nextIndex = rows.length - 1; break\n default: return\n }\n event.preventDefault()\n setActiveId(rows[nextIndex]?.id ?? 'skills')\n tabRefs.current[nextIndex]?.focus()\n }}\n >\n {row.label}\n </button>\n )\n })}\n </div>\n {rows\n .filter(row => row.id === activeId || visitedIds.has(row.id))\n .map((row) => {\n const selected = row.id === activeId\n return (\n <div\n key={row.id}\n id={`${tabsId}-panel-${row.id}`}\n className=\"dpc-tabPanel\"\n role=\"tabpanel\"\n aria-labelledby={`${tabsId}-tab-${row.id}`}\n hidden={!selected}\n >\n {row.id === 'skills'\n ? <SkillsTab t={t} injected={skills} />\n : row.id === 'mcp'\n ? <McpTab t={t} injected={mcp} />\n : <MarketTab t={t} market={market} mcp={mcp} />}\n </div>\n )\n })}\n </div>\n )\n}\n", "/** Shared scoped stylesheet for the capabilities tabs \u2014 rides the host's\n * --dsw-* tokens (same design language as the plugin-inventory and install\n * tabs) so light and dark themes both stay correct. Prefix: dpc-. */\n\nexport const CSS = `\n.dpc-section{display:flex;flex-direction:column;gap:14px;width:100%;max-width:760px;color:var(--dsw-alias-label-primary)}\n.dpc-heading{margin:0;font-size:18px;line-height:26px;font-weight:600}\n/* Top-level section's internal tabs \u2014 same underline-tab look as the host's\n Plugins section so the promoted placement still reads as one family. */\n.dpc-tabs{display:flex;align-items:flex-end;gap:22px;border-bottom:1px solid var(--dsw-alias-border-l2);margin-top:2px}\n.dpc-tab{position:relative;border:0;padding:7px 1px 9px;background:transparent;color:var(--dsw-alias-label-tertiary);font:inherit;font-size:13px;line-height:20px;cursor:pointer}\n.dpc-tab:hover,.dpc-tab[data-active='true']{color:var(--dsw-alias-label-primary)}\n.dpc-tab[data-active='true']::after,.dpc-tab:focus-visible::after{position:absolute;right:0;bottom:-1px;left:0;height:2px;border-radius:2px 2px 0 0;background:var(--dsw-alias-label-primary);content:''}\n.dpc-tab:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:2px;color:var(--dsw-alias-label-primary)}\n.dpc-tabPanel{min-width:0;padding-top:2px}\n.dpc-head{display:flex;align-items:center;gap:8px}\n.dpc-head h3{margin:0;font-size:13px;line-height:20px;font-weight:600}\n.dpc-head>svg{flex:none;color:var(--dsw-alias-label-tertiary)}\n.dpc-intro{margin:0;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary)}\n.dpc-listHead{display:flex;align-items:baseline;gap:7px;padding:0 2px;margin-top:2px}\n.dpc-listHead h3{margin:0;font-size:13px;line-height:20px;font-weight:600}\n.dpc-count{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}\n.dpc-spacer{flex:1}\n.dpc-refresh{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dpc-refresh:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dpc-refresh:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}\n.dpc-empty{margin:0;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary)}\n.dpc-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch;gap:10px;margin:0;padding:0;list-style:none}\n.dpc-card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;background:var(--dsw-alias-bg-layer-3);padding:12px 14px;cursor:pointer}\n.dpc-card:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.dpc-cardTop{display:flex;align-items:center;gap:8px}\n.dpc-cardTitle{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;line-height:20px;font-weight:600;font-family:var(--ds-font-family-code)}\n.dpc-cardDesc{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}\n.dpc-cardRow{display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.dpc-tag{display:inline-flex;align-items:center;min-height:20px;border-radius:5px;padding:1px 6px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);font-size:11px;line-height:16px;white-space:nowrap}\n.dpc-tag[data-kind='source']{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary)}\n.dpc-tag[data-kind='off']{background:color-mix(in srgb,var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-tertiary)) 12%,transparent);color:var(--dsw-alias-label-secondary)}\n.dpc-cardActions{display:flex;align-items:center;gap:6px;margin-left:auto}\n.dpc-banner{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:10px 12px;background:var(--dsw-alias-bg-layer-3);font-size:13px;line-height:20px}\n.dpc-banner[data-kind='ok']{border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary) 35%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 8%,transparent)}\n.dpc-banner[data-kind='error']{border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 35%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 8%,transparent)}\n.dpc-banner[data-kind='info']{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary) 35%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 8%,transparent)}\n.dpc-bannerBody{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dpc-bannerHint{display:flex;align-items:center;gap:8px;flex-wrap:wrap;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}\n.dpc-form{display:flex;flex-direction:column;gap:10px}\n.dpc-label{display:flex;flex-direction:column;gap:4px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary)}\n.dpc-label>span:first-child{color:var(--dsw-alias-label-tertiary)}\n.dpc-input,.dpc-textarea,.dpc-select{width:100%;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:7px 10px;outline:none;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px}\n.dpc-textarea{min-height:240px;resize:vertical;font-family:var(--ds-font-family-code);line-height:1.5}\n.dpc-textarea[data-short='true']{min-height:96px}\n.dpc-input:focus-visible,.dpc-textarea:focus-visible,.dpc-select:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--dsw-alias-state-business-primary) 18%,transparent)}\n.dpc-checks{display:flex;gap:16px;font-size:13px;line-height:20px}\n.dpc-checks label{display:inline-flex;align-items:center;gap:6px;cursor:pointer}\n.dpc-formError{margin:0;color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:18px}\n/* Import dialog: wider than the host's 380px default; the server list gets\n its own scroll so title, intro, and footer stay pinned. The doubled class\n beats the host dialog's module CSS regardless of injection order. */\n.dpc-modalWide.dpc-modalWide{width:min(680px,100%)}\n/* Editor dialogs (new skill / server): 640px wide so markdown bodies and\n command/arg/env lines stop wrapping mid-token; the content column scrolls\n on short viewports instead of clipping past the dialog edge. */\n.dpc-modalForm.dpc-modalForm{width:min(640px,100%)}\n.dpc-modalScroll.dpc-modalScroll{max-height:calc(100vh - 160px);overflow-y:auto}\n.dpc-importScroll{display:flex;flex-direction:column;gap:14px;max-height:min(400px,52vh);overflow-y:auto;padding:2px 4px 2px 2px}\n.dpc-importGroup{display:flex;flex-direction:column;gap:8px}\n.dpc-importHead{display:flex;align-items:center;gap:8px;padding:0 2px}\n.dpc-importCount{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}\n.dpc-importAll{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer}\n/* Skills search + source filter chips. */\n.dpc-search{width:200px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:4px 10px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;line-height:18px}\n.dpc-search:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}\n.dpc-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.dpc-chip{border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:2px 10px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;line-height:16px;cursor:pointer}\n.dpc-chip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dpc-chip[data-active='true']{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}\n.dpc-chip:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}\n/* Load-policy switch on skill cards (no form semantics \u2014 instant apply). */\n.dpc-switch{position:relative;flex:none;width:30px;height:18px;border:0;border-radius:999px;background:var(--dsw-alias-bg-layer-1);box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);cursor:pointer;transition:background .15s}\n.dpc-switch[aria-checked='true']{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 55%,transparent);box-shadow:none}\n.dpc-switchKnob{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--dsw-alias-label-primary);transition:left .15s}\n.dpc-switch[aria-checked='true'] .dpc-switchKnob{left:14px;background:#fff}\n.dpc-switch:disabled{opacity:.55;cursor:default}\n.dpc-switch:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}\n/* Quiet inline link-button (open folder, homepage). */\n.dpc-link{border:0;padding:0;background:transparent;color:var(--dsw-alias-state-business-primary);font:inherit;font-size:12px;line-height:18px;cursor:pointer;text-decoration:none}\n.dpc-link:hover{text-decoration:underline}\n.dpc-link:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:2px}\n/* Skill repositories list + add form. */\n.dpc-rootsHead{margin-top:10px}\n.dpc-roots{display:flex;flex-direction:column;gap:6px;margin:0;padding:0;list-style:none}\n.dpc-root{display:flex;align-items:center;gap:8px;min-width:0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;background:var(--dsw-alias-bg-layer-3)}\n.dpc-rootLabel{flex:none;font-size:13px;line-height:18px;font-weight:600}\n.dpc-rootPath{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary);font-family:var(--ds-font-family-code)}\n.dpc-addRoot{border:1px dashed var(--dsw-alias-border-l2);border-radius:8px;padding:10px 12px}\n.dpc-addRootRow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.dpc-addRootRow .dpc-select{width:auto;flex:none}\n.dpc-addRootRow .dpc-input{flex:1;min-width:200px}\n/* Market segments + env hint + MCP format preview. */\n.dpc-segments{display:inline-flex;gap:4px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:3px;background:var(--dsw-alias-bg-layer-1)}\n.dpc-segment{border:0;border-radius:6px;padding:4px 14px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;line-height:18px;cursor:pointer}\n.dpc-segment:hover{color:var(--dsw-alias-label-primary)}\n.dpc-segment[data-active='true']{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font-weight:600}\n.dpc-segment:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}\n.dpc-envHint{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary))}\n.dpc-format{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;background:var(--dsw-alias-bg-layer-1)}\n.dpc-format summary{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer;user-select:none}\n.dpc-format summary:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:2px}\n.dpc-format .dpc-form{margin-top:8px}\n.dpc-formatHint{margin:2px 0 0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary)}\n.dpc-code{margin:4px 0 8px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;padding:8px 10px;overflow-x:auto;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);font-size:11px;line-height:17px;white-space:pre}\n/* Market detail modal. */\n.dpc-detailDesc{margin:0;font-size:13px;line-height:20px}\n.dpc-detailSection{margin-top:12px;display:flex;flex-direction:column;gap:6px}\n.dpc-detailLabel{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary)}\n.dpc-detailTags{display:flex;flex-wrap:wrap;gap:4px}\n.dpc-skillList{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px}\n.dpc-skillItem{display:flex;gap:8px;align-items:baseline;font-size:12px;line-height:18px;min-width:0}\n.dpc-skillName{font-family:var(--ds-font-family-code);color:var(--dsw-alias-label-primary);white-space:nowrap;flex:none}\n.dpc-skillDesc{color:var(--dsw-alias-label-secondary);min-width:0}\n@media(max-width:680px){.dpc-cards{grid-template-columns:minmax(0,1fr)}}\n`\n", "/** Settings \u201C\u5E02\u573A\u201D tab: browse and install curated skill repositories and\n * MCP servers. Two segments (skills / MCP) with independently fetched\n * indexes; installs reuse the repositories and MCP-row plumbing, so a\n * skills install lands live in the catalog and an MCP install raises the\n * same pending-restart notice as the MCP tab. */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { Button, IconRefreshOutline14, Modal, StateDot } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CSS } from './css.ts'\nimport type { MarketRepoView, MarketServerView, Translate } from './index.ts'\nimport type { McpInjected } from './McpTab.tsx'\n\n/** One registered skill repository as the roots route reports it. */\nexport interface RootRowView {\n id: string\n kind: 'local' | 'git'\n label: string\n url?: string\n ref?: string\n path?: string\n roots: string[]\n materialDir?: string\n addedAt: number\n /** False once one of its scan roots vanished from disk. */\n live: boolean\n}\n\nexport interface MarketInjected {\n skillsIndex(): Promise<{ source: 'remote' | 'bundled'; repos: Array<MarketRepoView & { installedId: string | null }> }>\n mcpIndex(): Promise<{ source: 'remote' | 'bundled'; servers: Array<MarketServerView & { installed: boolean }> }>\n installSkillRepo(url: string): Promise<{ ok: boolean; root: RootRowView }>\n installMcp(id: string): Promise<{ ok: boolean; id: string }>\n removeRoot(id: string): Promise<{ ok: boolean }>\n}\n\n/** UI language hint for the index's zh display fields. */\nconst zhUi = (): boolean => navigator.language.toLowerCase().startsWith('zh')\n\ntype Segment = 'skills' | 'mcp'\n\nexport function MarketTab(props: { t: Translate; market: MarketInjected; mcp: McpInjected }): ReactElement {\n const { t, market, mcp } = props\n const [segment, setSegment] = useState<Segment>('skills')\n const [repos, setRepos] = useState<Array<MarketRepoView & { installedId: string | null }> | null>(null)\n const [servers, setServers] = useState<Array<MarketServerView & { installed: boolean }> | null>(null)\n const [source, setSource] = useState<'remote' | 'bundled'>('remote')\n const [busyId, setBusyId] = useState<string | null>(null)\n const [outcome, setOutcome] = useState<{ ok: boolean; text: string } | null>(null)\n const [confirmUninstall, setConfirmUninstall] = useState<{ kind: 'root' | 'mcp'; id: string; name: string } | null>(null)\n const [detail, setDetail] = useState<{ kind: Segment; id: string } | null>(null)\n const [reload, setReload] = useState(0)\n\n const refreshSkills = useCallback((): void => {\n setRepos(null)\n void market.skillsIndex().then(\n (body) => { setRepos(body.repos); setSource(body.source) },\n (error: Error) => { setRepos([]); setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }) },\n )\n }, [market, t])\n\n const refreshMcp = useCallback((): void => {\n setServers(null)\n void market.mcpIndex().then(\n (body) => { setServers(body.servers); setSource(body.source) },\n (error: Error) => { setServers([]); setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }) },\n )\n }, [market, t])\n\n useEffect(() => {\n // Refetch the visible segment when it changes or the reload ticks; the\n // hidden segment keeps its last state as a cache.\n if (segment === 'skills') refreshSkills()\n else refreshMcp()\n }, [segment, reload, refreshSkills, refreshMcp])\n\n const doInstallRepo = async (repo: MarketRepoView): Promise<void> => {\n setBusyId(repo.id)\n setOutcome(null)\n try {\n await market.installSkillRepo(repo.url)\n setOutcome({ ok: true, text: t('marketRepoInstalled') })\n refreshSkills()\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n refreshSkills()\n } finally {\n setBusyId(null)\n }\n }\n\n const doInstallMcp = async (server: MarketServerView): Promise<void> => {\n setBusyId(server.id)\n setOutcome(null)\n try {\n await market.installMcp(server.id)\n setOutcome({ ok: true, text: t('restartNeeded') })\n refreshMcp()\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n refreshMcp()\n } finally {\n setBusyId(null)\n }\n }\n\n const doUninstall = async (): Promise<void> => {\n if (confirmUninstall === null) return\n const target = confirmUninstall\n setBusyId(target.id)\n try {\n if (target.kind === 'root') {\n await market.removeRoot(target.id)\n setOutcome({ ok: true, text: t('rootRemoved') })\n refreshSkills()\n } else {\n await mcp.remove(target.id)\n setOutcome({ ok: true, text: t('restartNeeded') })\n refreshMcp()\n }\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusyId(null)\n setConfirmUninstall(null)\n }\n }\n\n const pick = <T,>(base: T, zh: T | undefined): T => (zhUi() && zh !== undefined ? zh : base)\n const title = (entry: { name: string; nameZh?: string }): string => pick(entry.name, entry.nameZh)\n const desc = (entry: { description: string; descriptionZh?: string }): string => pick(entry.description, entry.descriptionZh)\n const longText = (entry: { description: string; descriptionZh?: string; detail?: string; detailZh?: string }): string =>\n entry.detail !== undefined ? pick(entry.detail, entry.detailZh) : desc(entry)\n\n const cardStop = (event: { stopPropagation(): void }): void => { event.stopPropagation() }\n\n // The card list refreshes on install/uninstall, so the detail modal resolves\n // its entry by id each render and follows the fresh installed state.\n const detailRepo = detail !== null && detail.kind === 'skills' && repos !== null ? repos.find(repo => repo.id === detail.id) ?? null : null\n const detailServer = detail !== null && detail.kind === 'mcp' && servers !== null ? servers.find(server => server.id === detail.id) ?? null : null\n\n return (\n <div className=\"dpc-section\">\n <style>{CSS}</style>\n\n <div className=\"dpc-head\">\n <h3>{t('marketTitle')}</h3>\n <span className=\"dpc-spacer\" />\n <button type=\"button\" className=\"dpc-refresh\" aria-label={t('refresh')} title={t('refresh')} onClick={() => setReload((value) => value + 1)}>\n <IconRefreshOutline14 size={14} aria-hidden=\"true\" />\n </button>\n </div>\n <p className=\"dpc-intro\">{t('marketIntro')}</p>\n\n <div className=\"dpc-segments\" role=\"tablist\" aria-label={t('marketTitle')}>\n <button type=\"button\" role=\"tab\" aria-selected={segment === 'skills'} className=\"dpc-segment\" data-active={segment === 'skills' ? 'true' : undefined} onClick={() => setSegment('skills')}>\n {t('marketSkills')}\n </button>\n <button type=\"button\" role=\"tab\" aria-selected={segment === 'mcp'} className=\"dpc-segment\" data-active={segment === 'mcp' ? 'true' : undefined} onClick={() => setSegment('mcp')}>\n {t('marketMcp')}\n </button>\n </div>\n\n {outcome !== null && (\n <div className=\"dpc-banner\" data-kind={outcome.ok ? 'ok' : 'error'} role=\"status\">\n <StateDot state={outcome.ok ? 'done' : 'error'} size={10} />\n <div className=\"dpc-bannerBody\"><span>{outcome.text}</span></div>\n </div>\n )}\n {source === 'bundled' && (\n <div className=\"dpc-banner\" data-kind=\"info\" role=\"status\">\n <StateDot state=\"ongoing\" size={10} />\n <div className=\"dpc-bannerBody\"><span>{t('marketOffline')}</span></div>\n </div>\n )}\n\n {segment === 'skills' && (\n <>\n <p className=\"dpc-intro\">{t('marketSkillsIntro')}</p>\n {repos === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {repos !== null && repos.length === 0 && <p className=\"dpc-empty\">{t('marketEmpty')}</p>}\n {repos !== null && repos.length > 0 && (\n <ul className=\"dpc-cards\">\n {repos.map((repo) => (\n <li className=\"dpc-card\" key={repo.id} onClick={() => setDetail({ kind: 'skills', id: repo.id })}>\n <div className=\"dpc-cardTop\">\n <strong className=\"dpc-cardTitle\" title={repo.url}>{title(repo)}</strong>\n {repo.skillCount !== undefined && <span className=\"dpc-tag\">{t('marketSkillCount').replace('{n}', String(repo.skillCount))}</span>}\n {repo.installedId !== null && <span className=\"dpc-tag\" data-kind=\"source\">{t('marketInstalled')}</span>}\n </div>\n <p className=\"dpc-cardDesc\">{desc(repo)}</p>\n <div className=\"dpc-cardRow\">\n <button type=\"button\" className=\"dpc-link\" onClick={() => setDetail({ kind: 'skills', id: repo.id })}>{t('marketDetail')}</button>\n <a className=\"dpc-link\" href={repo.homepage ?? repo.url} target=\"_blank\" rel=\"noreferrer\" onClick={cardStop}>{t('marketHome')}</a>\n <span className=\"dpc-spacer\" />\n {repo.installedId !== null ? (\n <Button variant=\"ghost\" size=\"sm\" disabled={busyId !== null} onClick={(event) => { event.stopPropagation(); setConfirmUninstall({ kind: 'root', id: repo.installedId as string, name: title(repo) }) }}>\n {t('marketUninstall')}\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" disabled={busyId !== null} onClick={(event) => { event.stopPropagation(); void doInstallRepo(repo) }}>\n {busyId === repo.id ? t('marketInstalling') : t('marketInstall')}\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </>\n )}\n\n {segment === 'mcp' && (\n <>\n <p className=\"dpc-intro\">{t('marketMcpIntro')}</p>\n {servers === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {servers !== null && servers.length === 0 && <p className=\"dpc-empty\">{t('marketEmpty')}</p>}\n {servers !== null && servers.length > 0 && (\n <ul className=\"dpc-cards\">\n {servers.map((server) => (\n <li className=\"dpc-card\" key={server.id} onClick={() => setDetail({ kind: 'mcp', id: server.id })}>\n <div className=\"dpc-cardTop\">\n <strong className=\"dpc-cardTitle\" title={server.id}>{title(server)}</strong>\n <span className=\"dpc-tag\">{server.transport}</span>\n {server.runtime !== undefined && <span className=\"dpc-tag\">{server.runtime}</span>}\n {server.installed && <span className=\"dpc-tag\" data-kind=\"source\">{t('marketInstalled')}</span>}\n </div>\n <p className=\"dpc-cardDesc\">{desc(server)}</p>\n {server.envKeys !== undefined && server.envKeys.length > 0 && (\n <p className=\"dpc-envHint\">{t('marketNeedsEnv')}: {server.envKeys.join(', ')}</p>\n )}\n <div className=\"dpc-cardRow\">\n <button type=\"button\" className=\"dpc-link\" onClick={() => setDetail({ kind: 'mcp', id: server.id })}>{t('marketDetail')}</button>\n <a className=\"dpc-link\" href={server.homepage} target=\"_blank\" rel=\"noreferrer\" onClick={cardStop}>{t('marketHome')}</a>\n <span className=\"dpc-spacer\" />\n {server.installed ? (\n <Button variant=\"ghost\" size=\"sm\" disabled={busyId !== null} onClick={(event) => { event.stopPropagation(); void mcp.list().then(\n (body) => {\n const row = body.servers.find(item => item.serverName === server.id)\n if (row !== undefined) setConfirmUninstall({ kind: 'mcp', id: row.id, name: server.id })\n },\n (error: Error) => setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }),\n ) }}>\n {t('marketUninstall')}\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" disabled={busyId !== null} onClick={(event) => { event.stopPropagation(); void doInstallMcp(server) }}>\n {busyId === server.id ? t('marketInstalling') : t('marketAdd')}\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </>\n )}\n\n <Modal\n open={detailRepo !== null || detailServer !== null}\n onClose={() => setDetail(null)}\n title={detailRepo !== null ? title(detailRepo) : detailServer !== null ? title(detailServer) : ''}\n footer={\n <>\n {detailRepo !== null && (\n <a className=\"dpc-link\" href={detailRepo.homepage ?? detailRepo.url} target=\"_blank\" rel=\"noreferrer\">{t('marketHome')}</a>\n )}\n {detailServer !== null && (\n <a className=\"dpc-link\" href={detailServer.homepage} target=\"_blank\" rel=\"noreferrer\">{t('marketHome')}</a>\n )}\n <span className=\"dpc-spacer\" />\n {detailRepo !== null && (detailRepo.installedId !== null ? (\n <Button variant=\"ghost\" disabled={busyId !== null} onClick={() => { setConfirmUninstall({ kind: 'root', id: detailRepo.installedId as string, name: title(detailRepo) }); setDetail(null) }}>\n {t('marketUninstall')}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busyId !== null} onClick={() => void doInstallRepo(detailRepo)}>\n {busyId === detailRepo.id ? t('marketInstalling') : t('marketInstall')}\n </Button>\n ))}\n {detailServer !== null && (detailServer.installed ? (\n <Button variant=\"ghost\" disabled={busyId !== null} onClick={() => void mcp.list().then(\n (body) => {\n const row = body.servers.find(item => item.serverName === detailServer.id)\n if (row !== undefined) { setConfirmUninstall({ kind: 'mcp', id: row.id, name: title(detailServer) }); setDetail(null) }\n },\n (error: Error) => setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }),\n )}>\n {t('marketUninstall')}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busyId !== null} onClick={() => void doInstallMcp(detailServer)}>\n {busyId === detailServer.id ? t('marketInstalling') : t('marketAdd')}\n </Button>\n ))}\n </>\n }\n >\n {detailRepo !== null && (\n <>\n <p className=\"dpc-detailDesc\">{longText(detailRepo)}</p>\n {detailRepo.skills !== undefined && detailRepo.skills.length > 0 && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketSkillListLabel')}</div>\n <ul className=\"dpc-skillList\">\n {detailRepo.skills.map(item => (\n <li className=\"dpc-skillItem\" key={item.name}>\n <code className=\"dpc-skillName\">{item.name}</code>\n {item.description !== undefined && (\n <span className=\"dpc-skillDesc\">{pick(item.description, item.descriptionZh)}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n </>\n )}\n {detailServer !== null && (\n <>\n <p className=\"dpc-detailDesc\">{longText(detailServer)}</p>\n {detailServer.command !== undefined && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketCommandLabel')}</div>\n <code className=\"dpc-code\">{[detailServer.command, ...(detailServer.args ?? [])].join(' ')}</code>\n </div>\n )}\n {detailServer.transport === 'streamable-http' && detailServer.url !== undefined && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketCommandLabel')}</div>\n <code className=\"dpc-code\">{detailServer.url}</code>\n </div>\n )}\n {detailServer.envKeys !== undefined && detailServer.envKeys.length > 0 && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketNeedsEnv')}</div>\n <div className=\"dpc-detailTags\">\n {detailServer.envKeys.map(key => <span className=\"dpc-tag\" key={key}>{key}</span>)}\n </div>\n </div>\n )}\n {detailServer.tools !== undefined && detailServer.tools.length > 0 && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketToolsLabel')}</div>\n <div className=\"dpc-detailTags\">\n {detailServer.tools.map(name => <span className=\"dpc-tag\" key={name}>{name}</span>)}\n </div>\n </div>\n )}\n </>\n )}\n </Modal>\n\n <Modal\n open={confirmUninstall !== null}\n onClose={() => setConfirmUninstall(null)}\n title={t('marketUninstallConfirm')}\n description={confirmUninstall?.name ?? undefined}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setConfirmUninstall(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={busyId !== null} onClick={() => void doUninstall()}>{t('marketUninstall')}</Button>\n </>\n }\n >\n <p>{confirmUninstall?.kind === 'root' ? t('marketUninstallRootWarn') : t('removeWarn')}</p>\n </Modal>\n </div>\n )\n}\n", "/** Settings \u2192 Plugins \u201CMCP\u201D tab: manage the profile's mcp-client rows.\n * Mutations rewrite the profile patch and need a dsh restart \u2014 the banner\n * hands the restart to the desktop shell when one is present. */\n\nimport { useEffect, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { Button, IconApiOutline14, IconRefreshOutline14, Modal, StateDot } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CSS } from './css.ts'\nimport type { ImportedServerView, Translate } from './index.ts'\n\nexport interface McpRow {\n id: string\n serverName: string\n transport: 'stdio' | 'streamable-http'\n disabled: boolean\n command?: string\n args?: string[]\n env?: Record<string, string>\n cwd?: string\n url?: string\n headers?: Record<string, string>\n}\n\nexport interface McpInjected {\n list(): Promise<{ servers: McpRow[] }>\n save(input: Record<string, unknown>): Promise<{ ok: boolean; id: string }>\n toggle(id: string, disabled: boolean): Promise<{ ok: boolean }>\n remove(id: string): Promise<{ ok: boolean }>\n scanImport(): Promise<{ servers: ImportedServerView[]; existing: string[] }>\n applyImport(items: Array<{ agent: string; name: string }>): Promise<{ ok: boolean; results: Array<{ name: string; ok: boolean; error?: string }> }>\n restart(): Promise<void>\n desktop: boolean\n}\n\n/** Editor dialog state; null when closed. Textareas hold line-based values. */\ninterface EditorState {\n id: string\n serverName: string\n transport: 'stdio' | 'streamable-http'\n command: string\n args: string\n env: string\n url: string\n headers: string\n}\n\n/** One import entry together with its index in the flat state array \u2014\n * checkbox handlers rewrite the flat array, so indices must survive grouping. */\ntype ImportItem = { server: ImportedServerView; existing: boolean; checked: boolean }\n\n/** Group import candidates by source agent, known agents first. */\nexport function importGroups(items: ImportItem[]): Array<{ agent: string; label: string; items: Array<{ item: ImportItem; index: number }> }> {\n const label = (agent: string) => agent === 'claude-code' ? 'Claude Code' : agent === 'codex' ? 'Codex' : agent\n const order = ['claude-code', 'codex']\n const agents = [...new Set(items.map(item => item.server.agent))]\n .sort((a, b) => {\n const rank = (agent: string) => { const at = order.indexOf(agent); return at === -1 ? order.length : at }\n return rank(a) - rank(b) || a.localeCompare(b)\n })\n return agents.map(agent => ({\n agent,\n label: label(agent),\n items: items.map((item, index) => ({ item, index })).filter(({ item }) => item.server.agent === agent),\n }))\n}\n\n/** KEY=VALUE / KEY: VALUE lines to a map. */\nfunction parsePairs(text: string, separator: ':' | '='): Record<string, string> {\n const map: Record<string, string> = {}\n for (const line of text.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (trimmed === '' || trimmed.startsWith('#')) continue\n const at = trimmed.indexOf(separator)\n if (at <= 0) continue\n map[trimmed.slice(0, at).trim()] = trimmed.slice(at + 1).trim()\n }\n return map\n}\n\nfunction mapToPairs(map: Record<string, string> | undefined, separator: string): string {\n if (map === undefined) return ''\n return Object.entries(map).map(([key, value]) => `${key}${separator}${value.includes('\\n') ? JSON.stringify(value) : value}`).join('\\n')\n}\n\n/** YAML double-quoted scalar (JSON syntax is valid YAML); plain for simple ids. */\nfunction yamlScalar(value: string): string {\n return /^[A-Za-z0-9_./@-]+$/.test(value) ? value : JSON.stringify(value)\n}\n\n/** Shape the profile patch row exactly as the host would persist it (preview). */\nexport function mcpRowYaml(input: { serverName: string; transport: 'stdio' | 'streamable-http'; command?: string; args?: string[]; env?: Record<string, string>; url?: string; headers?: Record<string, string> }): string {\n const name = input.serverName.trim() === '' ? 'server-name' : input.serverName.trim()\n const lines = [\n '- insert:',\n ` - id: mcp-${name}`,\n \" name: '@deepseek-ai/dsh-mcp-client'\",\n ' config:',\n ` serverName: ${yamlScalar(name)}`,\n ` transport: ${input.transport}`,\n ]\n if (input.transport === 'stdio') {\n lines.push(` command: ${yamlScalar(input.command ?? '')}`)\n const args = input.args ?? []\n if (args.length > 0) {\n lines.push(' args:')\n for (const arg of args) lines.push(` - ${yamlScalar(arg)}`)\n }\n const env = input.env ?? {}\n if (Object.keys(env).length > 0) {\n lines.push(' env:')\n for (const [key, value] of Object.entries(env)) lines.push(` ${yamlScalar(key)}: ${yamlScalar(value)}`)\n }\n } else {\n lines.push(` url: ${yamlScalar(input.url ?? '')}`)\n const headers = input.headers ?? {}\n if (Object.keys(headers).length > 0) {\n lines.push(' headers:')\n for (const [key, value] of Object.entries(headers)) lines.push(` ${yamlScalar(key)}: ${yamlScalar(value)}`)\n }\n }\n return lines.join('\\n')\n}\n\n/** The equivalent mcpServers JSON a foreign config or docs page would show. */\nexport function mcpJsonExample(transport: 'stdio' | 'streamable-http'): string {\n const entry = transport === 'stdio'\n ? {\n command: 'npx',\n args: ['-y', '@example/mcp-server'],\n env: { API_KEY: 'value' },\n }\n : {\n type: 'http',\n url: 'https://example.com/mcp',\n headers: { Authorization: 'Bearer <token>' },\n }\n return JSON.stringify({ mcpServers: { 'server-name': entry } }, null, 2)\n}\n\n/** Fields parsed out of a pasted MCP JSON config (any common shape). */\nexport interface ParsedMcpJson {\n serverName?: string\n transport: 'stdio' | 'streamable-http'\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n}\n\n/** Parse one MCP server from pasted JSON: a bare entry, a dsh row, or a\n * `{\"mcpServers\": {\u2026}}` wrapper (first entry wins). Returns the reason on bad input. */\nexport function parseMcpJson(text: string): ParsedMcpJson | { error: string } {\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n return { error: 'not valid JSON' }\n }\n if (typeof parsed !== 'object' || parsed === null) return { error: 'expected a JSON object' }\n let record = parsed as Record<string, unknown>\n let nameFromWrapper: string | undefined\n const wrapped = record.mcpServers ?? record.mcp_servers ?? record.servers\n if (typeof wrapped === 'object' && wrapped !== null && !Array.isArray(wrapped)) {\n const first = Object.entries(wrapped as Record<string, unknown>)[0]\n if (first === undefined) return { error: 'mcpServers object is empty' }\n nameFromWrapper = first[0]\n if (typeof first[1] !== 'object' || first[1] === null) return { error: 'server entry is not an object' }\n record = first[1] as Record<string, unknown>\n }\n const stringMap = (value: unknown): Record<string, string> | undefined => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined\n const out: Record<string, string> = {}\n for (const [key, entry] of Object.entries(value)) {\n if (typeof entry === 'string') out[key] = entry\n }\n return Object.keys(out).length > 0 ? out : undefined\n }\n const args = Array.isArray(record.args) && record.args.every(entry => typeof entry === 'string')\n ? record.args as string[]\n : undefined\n const command = typeof record.command === 'string' ? record.command : undefined\n const url = typeof record.url === 'string' ? record.url : undefined\n const declared = typeof record.type === 'string' ? record.type : typeof record.transport === 'string' ? record.transport : undefined\n const httpDeclared = declared === 'http' || declared === 'streamable-http' || declared === 'sse'\n const transport: 'stdio' | 'streamable-http' = command !== undefined && !httpDeclared\n ? 'stdio'\n : url !== undefined ? 'streamable-http' : httpDeclared ? 'streamable-http' : 'stdio'\n if (transport === 'stdio' && command === undefined) return { error: 'stdio config needs a \"command\" field' }\n if (transport === 'streamable-http' && url === undefined) return { error: 'http config needs a \"url\" field' }\n const serverName = nameFromWrapper\n ?? (typeof record.serverName === 'string' ? record.serverName : undefined)\n ?? (typeof record.name === 'string' && record.name !== '@deepseek-ai/dsh-mcp-client' ? record.name : undefined)\n const env = stringMap(record.env)\n const headers = stringMap(record.headers)\n return {\n ...(serverName !== undefined ? { serverName } : {}),\n transport,\n ...(command !== undefined ? { command } : {}),\n ...(args !== undefined ? { args } : {}),\n ...(env !== undefined ? { env } : {}),\n ...(url !== undefined ? { url } : {}),\n ...(headers !== undefined ? { headers } : {}),\n }\n}\n\nexport function McpTab(props: { t: Translate; injected: McpInjected }): ReactElement {\n const { t, injected } = props\n const [servers, setServers] = useState<McpRow[] | null>(null)\n const [editor, setEditor] = useState<EditorState | null>(null)\n const [confirmId, setConfirmId] = useState<string | null>(null)\n const [importOpen, setImportOpen] = useState(false)\n const [importItems, setImportItems] = useState<Array<{ server: ImportedServerView; existing: boolean; checked: boolean }> | null>(null)\n const [busy, setBusy] = useState(false)\n const [pending, setPending] = useState(false)\n const [restartConfirm, setRestartConfirm] = useState(false)\n const [restarting, setRestarting] = useState(false)\n const [outcome, setOutcome] = useState<{ ok: boolean; text: string } | null>(null)\n const [formError, setFormError] = useState<string | null>(null)\n const [reload, setReload] = useState(0)\n const [pasteJson, setPasteJson] = useState('')\n const [pasteError, setPasteError] = useState<string | null>(null)\n\n const openImport = async (): Promise<void> => {\n setImportOpen(true)\n setImportItems(null)\n try {\n const body = await injected.scanImport()\n const existing = new Set(body.existing)\n setImportItems(body.servers.map(server => ({\n server,\n existing: existing.has(server.name),\n checked: !existing.has(server.name),\n })))\n } catch (error) {\n setImportItems([])\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n }\n }\n\n const doImport = async (): Promise<void> => {\n if (importItems === null) return\n const items = importItems.filter(item => item.checked && !item.existing).map(item => ({ agent: item.server.agent, name: item.server.name }))\n setBusy(true)\n try {\n const body = await injected.applyImport(items)\n const failed = body.results.filter(item => !item.ok)\n setOutcome(failed.length === 0\n ? { ok: true, text: t('restartNeeded') }\n : { ok: false, text: `${t('failed')}: ${failed.map(item => `${item.name} (${item.error})`).join(', ')}` })\n setImportOpen(false)\n setPending(true)\n setReload((value) => value + 1)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n }\n }\n\n const reloadList = (showPending: boolean): void => {\n setReload((value) => value + 1)\n if (showPending) setPending(true)\n }\n\n useEffect(() => {\n let current = true\n void injected.list().then(\n (body) => { if (current) setServers(body.servers) },\n (error: Error) => { if (current) { setServers([]); setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }) } },\n )\n return () => { current = false }\n }, [injected, reload, t])\n\n const openCreate = (): void => {\n setFormError(null)\n setPasteError(null)\n setPasteJson('')\n setEditor({ id: '', serverName: '', transport: 'stdio', command: '', args: '', env: '', url: '', headers: '' })\n }\n\n const openEdit = (row: McpRow): void => {\n setFormError(null)\n setPasteError(null)\n setPasteJson('')\n setEditor({\n id: row.id,\n serverName: row.serverName,\n transport: row.transport,\n command: row.command ?? '',\n args: (row.args ?? []).join('\\n'),\n env: mapToPairs(row.env, '='),\n url: row.url ?? '',\n headers: mapToPairs(row.headers, ':'),\n })\n }\n\n /** Fill the form from pasted JSON (mcpServers wrapper, bare entry, dsh row). */\n const doPasteFill = (): void => {\n if (editor === null || pasteJson.trim() === '') return\n const parsed = parseMcpJson(pasteJson)\n if ('error' in parsed) {\n setPasteError(parsed.error)\n return\n }\n // Existing rows keep their identity (serverName + transport); a pasted\n // config of the other transport cannot apply to them.\n const lockIdentity = editor.id !== ''\n if (lockIdentity && parsed.transport !== editor.transport) {\n setPasteError(t('pasteTransportMismatch'))\n return\n }\n setPasteError(null)\n setFormError(null)\n setEditor({\n ...editor,\n ...(parsed.serverName !== undefined && !lockIdentity ? { serverName: parsed.serverName } : {}),\n ...(!lockIdentity ? { transport: parsed.transport } : {}),\n ...(parsed.transport === 'stdio'\n ? {\n command: parsed.command ?? editor.command,\n args: (parsed.args ?? []).join('\\n'),\n env: mapToPairs(parsed.env, '='),\n }\n : {\n url: parsed.url ?? editor.url,\n headers: mapToPairs(parsed.headers, ':'),\n }),\n })\n }\n\n const doSave = async (): Promise<void> => {\n if (editor === null) return\n setBusy(true)\n setFormError(null)\n try {\n await injected.save({\n id: editor.id,\n serverName: editor.serverName.trim(),\n transport: editor.transport,\n ...(editor.transport === 'stdio'\n ? {\n command: editor.command.trim(),\n args: editor.args.split(/\\r?\\n/).map(line => line.trim()).filter(line => line !== ''),\n env: parsePairs(editor.env, '='),\n }\n : {\n url: editor.url.trim(),\n headers: parsePairs(editor.headers, ':'),\n }),\n })\n setEditor(null)\n setOutcome({ ok: true, text: t('restartNeeded') })\n reloadList(true)\n } catch (error) {\n setFormError(String(error instanceof Error ? error.message : error))\n } finally {\n setBusy(false)\n }\n }\n\n const doToggle = async (row: McpRow): Promise<void> => {\n setBusy(true)\n try {\n await injected.toggle(row.id, !row.disabled)\n setOutcome({ ok: true, text: t('restartNeeded') })\n reloadList(true)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n }\n }\n\n const doRemove = async (): Promise<void> => {\n if (confirmId === null) return\n setBusy(true)\n try {\n await injected.remove(confirmId)\n setOutcome({ ok: true, text: t('restartNeeded') })\n reloadList(true)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n setConfirmId(null)\n }\n }\n\n const doRestart = (): void => {\n setRestartConfirm(false)\n setRestarting(true)\n void injected.restart()\n // \u684C\u9762\u6A21\u5F0F\uFF1A\u58F3\u5C42\u91CD\u542F\u5B8C\u6210\u540E\u4F1A\u91CD\u8F7D\u7A97\u53E3\u3002\u72EC\u7ACB\u6A21\u5F0F\uFF1A\u8F6E\u8BE2\u672C\u6E90\uFF0C\u6062\u590D\u5373\u5237\u65B0\u3002\n if (injected.desktop) return\n const deadline = Date.now() + 60_000\n const poll = (): void => {\n if (Date.now() > deadline) return\n window.setTimeout(() => {\n void injected.list().then(\n () => { window.location.reload() },\n () => { poll() },\n )\n }, 1500)\n }\n window.setTimeout(poll, 3000)\n }\n\n const restartBanner = (\n <div className=\"dpc-banner\" data-kind=\"info\" role=\"status\">\n <StateDot state=\"ongoing\" size={10} />\n <div className=\"dpc-bannerBody\">\n <span>{restarting ? t('restarting') : t('restartNeeded')}</span>\n <span className=\"dpc-bannerHint\">\n {restarting\n ? (!injected.desktop && t('restartPortHint'))\n : injected.desktop\n ? <>{t('restartDesktopHint')}{' '}<Button variant=\"outline\" size=\"sm\" onClick={() => setRestartConfirm(true)}>{t('restartNow')}</Button></>\n : t('restartOtherHint')}\n </span>\n </div>\n </div>\n )\n\n return (\n <div className=\"dpc-section\">\n <style>{CSS}</style>\n\n <div className=\"dpc-head\">\n <IconApiOutline14 aria-hidden=\"true\" />\n <h3>{t('mcpTitle')}</h3>\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" size=\"sm\" disabled={restarting} onClick={() => setRestartConfirm(true)}>{t('restart')}</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void openImport()}>{t('importServers')}</Button>\n <Button variant=\"primary\" size=\"sm\" onClick={openCreate}>{t('addServer')}</Button>\n </div>\n <p className=\"dpc-intro\">{t('mcpIntro')}</p>\n\n {outcome !== null && (\n <div className=\"dpc-banner\" data-kind={outcome.ok ? 'ok' : 'error'} role=\"status\">\n <StateDot state={outcome.ok ? 'done' : 'error'} size={10} />\n <div className=\"dpc-bannerBody\"><span>{outcome.text}</span></div>\n </div>\n )}\n {(pending || restarting) && restartBanner}\n\n <div className=\"dpc-listHead\">\n <h3>{t('mcpTab')}</h3>\n {servers !== null && <span className=\"dpc-count\">{servers.length}</span>}\n <span className=\"dpc-spacer\" />\n <button type=\"button\" className=\"dpc-refresh\" aria-label={t('view')} title={t('view')} disabled={busy} onClick={() => setReload((value) => value + 1)}>\n <IconRefreshOutline14 size={14} aria-hidden=\"true\" />\n </button>\n </div>\n\n {servers === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {servers !== null && servers.length === 0 && <p className=\"dpc-empty\">{t('emptyMcp')}</p>}\n {servers !== null && servers.length > 0 && (\n <ul className=\"dpc-cards\">\n {servers.map((row) => (\n <li className=\"dpc-card\" key={row.id}>\n <div className=\"dpc-cardTop\">\n <strong className=\"dpc-cardTitle\" title={row.id}>{row.serverName}</strong>\n <span className=\"dpc-tag\">{row.transport}</span>\n <span className=\"dpc-tag\" data-kind={row.disabled ? 'off' : undefined}>{row.disabled ? t('disabled') : t('enabled')}</span>\n </div>\n <p className=\"dpc-cardDesc\">\n {row.transport === 'stdio' ? `${row.command ?? ''} ${(row.args ?? []).join(' ')}` : row.url ?? ''}\n </p>\n <div className=\"dpc-cardRow\">\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => void doToggle(row)}>{t('toggle')}</Button>\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => openEdit(row)}>{t('edit')}</Button>\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => setConfirmId(row.id)}>{t('delete')}</Button>\n </div>\n </li>\n ))}\n </ul>\n )}\n\n <Modal\n open={editor !== null}\n onClose={() => setEditor(null)}\n title={editor !== null && editor.id !== '' ? t('editServer') : t('addServer')}\n className=\"dpc-modalForm\"\n contentClassName=\"dpc-modalScroll\"\n >\n {editor !== null && (\n <div className=\"dpc-form\">\n <label className=\"dpc-label\">\n <span>{t('serverName')}</span>\n <input\n className=\"dpc-input\"\n value={editor.serverName}\n disabled={editor.id !== ''}\n onChange={(event) => setEditor({ ...editor, serverName: event.target.value })}\n />\n </label>\n <label className=\"dpc-label\">\n <span>{t('transport')}</span>\n <select\n className=\"dpc-select\"\n value={editor.transport}\n disabled={editor.id !== ''}\n onChange={(event) => setEditor({ ...editor, transport: event.target.value as EditorState['transport'] })}\n >\n <option value=\"stdio\">{t('transportStdio')}</option>\n <option value=\"streamable-http\">{t('transportHttp')}</option>\n </select>\n </label>\n {editor.transport === 'stdio' ? (\n <>\n <label className=\"dpc-label\">\n <span>{t('command')}</span>\n <input className=\"dpc-input\" value={editor.command} onChange={(event) => setEditor({ ...editor, command: event.target.value })} />\n </label>\n <label className=\"dpc-label\">\n <span>{t('args')}</span>\n <textarea className=\"dpc-textarea\" data-short=\"true\" value={editor.args} onChange={(event) => setEditor({ ...editor, args: event.target.value })} />\n </label>\n <label className=\"dpc-label\">\n <span>{t('envPairs')}</span>\n <textarea className=\"dpc-textarea\" data-short=\"true\" value={editor.env} onChange={(event) => setEditor({ ...editor, env: event.target.value })} />\n </label>\n </>\n ) : (\n <>\n <label className=\"dpc-label\">\n <span>{t('url')}</span>\n <input className=\"dpc-input\" value={editor.url} onChange={(event) => setEditor({ ...editor, url: event.target.value })} />\n </label>\n <label className=\"dpc-label\">\n <span>{t('headersPairs')}</span>\n <textarea className=\"dpc-textarea\" data-short=\"true\" value={editor.headers} onChange={(event) => setEditor({ ...editor, headers: event.target.value })} />\n </label>\n </>\n )}\n <details className=\"dpc-format\">\n <summary>{t('formatTitle')}</summary>\n <div className=\"dpc-form\">\n <label className=\"dpc-label\">\n <span>{t('formatPaste')}</span>\n <textarea\n className=\"dpc-textarea\"\n data-short=\"true\"\n placeholder={'{\\n \"mcpServers\": { \"name\": { \"command\": \"npx\", \"args\": [\"\u2026\"] } } }\\n'}\n value={pasteJson}\n onChange={(event) => setPasteJson(event.target.value)}\n />\n </label>\n {pasteError !== null && <p className=\"dpc-formError\">{pasteError}</p>}\n <div className=\"dpc-cardRow\">\n <Button variant=\"outline\" size=\"sm\" disabled={pasteJson.trim() === ''} onClick={doPasteFill}>{t('formatFill')}</Button>\n </div>\n <p className=\"dpc-formatHint\">{t('formatYamlHint')}</p>\n <pre className=\"dpc-code\">{mcpRowYaml({\n serverName: editor.serverName,\n transport: editor.transport,\n ...(editor.transport === 'stdio'\n ? {\n command: editor.command.trim(),\n args: editor.args.split(/\\r?\\n/).map(line => line.trim()).filter(line => line !== ''),\n env: parsePairs(editor.env, '='),\n }\n : {\n url: editor.url.trim(),\n headers: parsePairs(editor.headers, ':'),\n }),\n })}</pre>\n <p className=\"dpc-formatHint\">{t('formatJsonHint')}</p>\n <pre className=\"dpc-code\">{mcpJsonExample(editor.transport)}</pre>\n </div>\n </details>\n {formError !== null && <p className=\"dpc-formError\">{formError}</p>}\n <div className=\"dpc-cardRow\">\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" onClick={() => setEditor(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={busy} onClick={() => void doSave()}>{t('save')}</Button>\n </div>\n </div>\n )}\n </Modal>\n\n <Modal\n open={confirmId !== null}\n onClose={() => setConfirmId(null)}\n title={t('confirmRemove')}\n description={confirmId ?? undefined}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setConfirmId(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={busy} onClick={() => void doRemove()}>{t('delete')}</Button>\n </>\n }\n >\n <p>{t('removeWarn')}</p>\n </Modal>\n\n <Modal\n open={restartConfirm}\n onClose={() => setRestartConfirm(false)}\n title={t('restartConfirmTitle')}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setRestartConfirm(false)}>{t('cancel')}</Button>\n <Button variant=\"primary\" onClick={doRestart}>{t('restartNow')}</Button>\n </>\n }\n >\n <p>{t('restartConfirmBody')}</p>\n </Modal>\n\n <Modal\n open={importOpen}\n onClose={() => setImportOpen(false)}\n title={t('importServers')}\n className=\"dpc-modalWide\"\n >\n <div className=\"dpc-form\">\n <p className=\"dpc-intro\" style={{ margin: 0 }}>{t('importIntro')}</p>\n {importItems === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {importItems !== null && importItems.length === 0 && <p className=\"dpc-empty\">{t('importEmpty')}</p>}\n {importItems !== null && importItems.length > 0 && (\n <div className=\"dpc-importScroll\">\n {importGroups(importItems).map(group => {\n const selectable = group.items\n .filter(({ item }) => !item.existing)\n .map(({ index }) => index)\n const allChecked = selectable.length > 0\n && selectable.every(index => importItems[index].checked)\n return (\n <section className=\"dpc-importGroup\" key={group.agent}>\n <div className=\"dpc-importHead\">\n <span className=\"dpc-tag\" data-kind=\"source\">{group.label}</span>\n <span className=\"dpc-importCount\">{group.items.length}</span>\n {selectable.length > 0 && (\n <label className=\"dpc-importAll\">\n <input\n type=\"checkbox\"\n checked={allChecked}\n onChange={(event) => {\n const next = importItems.slice()\n for (const index of selectable) next[index] = { ...next[index], checked: event.target.checked }\n setImportItems(next)\n }}\n />\n {t('importSelectAll')}\n </label>\n )}\n </div>\n <ul className=\"dpc-cards\" style={{ gridTemplateColumns: 'minmax(0, 1fr)' }}>\n {group.items.map(({ item, index }) => {\n const command = item.server.transport === 'stdio'\n ? `${item.server.command ?? ''} ${(item.server.args ?? []).join(' ')}`.trim()\n : item.server.url ?? ''\n return (\n <li className=\"dpc-card\" key={`${item.server.agent}/${item.server.name}`} style={{ opacity: item.existing ? 0.55 : 1 }}>\n <div className=\"dpc-cardTop\">\n <label style={{ display: 'inline-flex', alignItems: 'center', gap: 8, minWidth: 0, cursor: item.existing ? 'default' : 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={item.checked}\n disabled={item.existing}\n onChange={(event) => {\n const next = importItems.slice()\n next[index] = { ...item, checked: event.target.checked }\n setImportItems(next)\n }}\n />\n <strong className=\"dpc-cardTitle\" title={item.server.name}>{item.server.name}</strong>\n </label>\n <span className=\"dpc-tag\">{item.server.transport}</span>\n {item.existing && <span className=\"dpc-tag\">{t('importExisting')}</span>}\n </div>\n <p className=\"dpc-cardDesc\" title={command}>{command}</p>\n </li>\n )\n })}\n </ul>\n </section>\n )\n })}\n </div>\n )}\n {formError !== null && <p className=\"dpc-formError\">{formError}</p>}\n <div className=\"dpc-cardRow\">\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" onClick={() => setImportOpen(false)}>{t('cancel')}</Button>\n <Button\n variant=\"primary\"\n disabled={busy || importItems === null || !importItems.some(item => item.checked && !item.existing)}\n onClick={() => void doImport()}\n >\n {t('importSelected')}\n </Button>\n </div>\n </div>\n </Modal>\n </div>\n )\n}\n", "/** Settings \u201C\u6280\u80FD\u201D tab: view the discovered catalog, edit the user-owned\n * root, toggle skills on/off, open their folders, and manage the custom\n * skill repositories (local paths and GitHub checkouts) feeding the catalog.\n * Pure presentation-layer \u2014 data arrives through props. */\n\nimport { useEffect, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { Button, IconRefreshOutline14, IconSkillOutline16, Modal, StateDot } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CSS } from './css.ts'\nimport type { OpenTarget, Translate } from './index.ts'\nimport type { RootRowView } from './MarketTab.tsx'\n\n/** One skill as the host reports it (plus the flags the route adds). */\nexport interface SkillRowView {\n name: string\n description: string\n whenToUse?: string\n invocation: { modelInvocable: boolean; userInvocable: boolean }\n source: string\n provider: string\n editable: boolean\n /** The skill's folder when it lives on disk (drives open-folder). */\n dir?: string\n /** File-backed skills can be enabled/disabled through the policy route. */\n policyEditable: boolean\n}\n\nexport interface SkillsInjected {\n list(): Promise<{ skills: SkillRowView[] }>\n get(name: string): Promise<{ content: string }>\n save(input: { name: string; description: string; whenToUse?: string; modelInvocable: boolean; userInvocable: boolean; content: string }): Promise<{ ok: boolean }>\n remove(name: string): Promise<{ ok: boolean }>\n policy(name: string, enabled: boolean): Promise<{ ok: boolean }>\n open(target: OpenTarget): Promise<{ ok: boolean }>\n roots(): Promise<{ roots: RootRowView[] }>\n addRoot(input: { kind: 'local' | 'git'; path?: string; url?: string }): Promise<{ ok: boolean; root: RootRowView }>\n removeRoot(id: string): Promise<{ ok: boolean }>\n}\n\n/** Editor dialog state; null when closed. */\ninterface EditorState {\n mode: 'create' | 'edit' | 'view'\n name: string\n description: string\n whenToUse: string\n modelInvocable: boolean\n userInvocable: boolean\n content: string\n}\n\nconst SOURCE_KEYS: Record<string, string> = {\n 'project-dsh': 'sourceProjectDsh',\n 'project-agents': 'sourceProjectAgents',\n 'user-dsh': 'sourceUserDsh',\n 'user-agents': 'sourceUserAgents',\n runtime: 'sourceRuntime',\n bundled: 'sourceBundled',\n custom: 'sourceCustom',\n}\n\n/** Status tag for the invocation policy; undefined = default (both allowed). */\nfunction policyTag(skill: SkillRowView): { key?: string; off: boolean } {\n const { modelInvocable, userInvocable } = skill.invocation\n if (!modelInvocable && !userInvocable) return { key: 'skillDisabled', off: true }\n if (!modelInvocable) return { key: 'skillUserOnly', off: false }\n if (!userInvocable) return { key: 'skillModelOnly', off: false }\n return { off: false }\n}\n\n/** Add-repository form state; null when the form is collapsed. */\ninterface AddRootState {\n kind: 'local' | 'git'\n value: string\n}\n\nexport function SkillsTab(props: { t: Translate; injected: SkillsInjected }): ReactElement {\n const { t, injected } = props\n const [skills, setSkills] = useState<SkillRowView[] | null>(null)\n const [editor, setEditor] = useState<EditorState | null>(null)\n const [confirmName, setConfirmName] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const [outcome, setOutcome] = useState<{ ok: boolean; text: string } | null>(null)\n const [formError, setFormError] = useState<string | null>(null)\n const [reload, setReload] = useState(0)\n const [query, setQuery] = useState('')\n const [sourceFilter, setSourceFilter] = useState<string>('all')\n\n // Custom skill repositories.\n const [roots, setRoots] = useState<RootRowView[] | null>(null)\n const [addRoot, setAddRoot] = useState<AddRootState | null>(null)\n const [rootBusy, setRootBusy] = useState(false)\n const [confirmRootId, setConfirmRootId] = useState<string | null>(null)\n\n useEffect(() => {\n let current = true\n void injected.list().then(\n (body) => { if (current) setSkills(body.skills) },\n (error: Error) => { if (current) { setSkills([]); setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }) } },\n )\n void injected.roots().then(\n (body) => { if (current) setRoots(body.roots) },\n () => { if (current) setRoots([]) },\n )\n return () => { current = false }\n }, [injected, reload, t])\n\n const openCreate = (): void => {\n setFormError(null)\n setEditor({ mode: 'create', name: '', description: '', whenToUse: '', modelInvocable: true, userInvocable: true, content: '' })\n }\n\n const openExisting = async (skill: SkillRowView): Promise<void> => {\n setBusy(true)\n setFormError(null)\n try {\n const body = await injected.get(skill.name)\n setEditor({\n mode: skill.editable ? 'edit' : 'view',\n name: skill.name,\n description: skill.description,\n whenToUse: skill.whenToUse ?? '',\n modelInvocable: skill.invocation.modelInvocable,\n userInvocable: skill.invocation.userInvocable,\n content: body.content,\n })\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n }\n }\n\n /**\n * After a write/delete, the watched directory takes a moment to invalidate\n * the catalog \u2014 poll until the change is visible (bounded), then stop.\n */\n const refreshUntil = (predicate: (skills: SkillRowView[]) => boolean, timeoutMs = 10_000): void => {\n const deadline = Date.now() + timeoutMs\n const tick = (): void => {\n if (Date.now() > deadline) return\n setTimeout(() => {\n void injected.list().then(\n (body) => {\n setSkills(body.skills)\n if (!predicate(body.skills)) tick()\n },\n () => tick(),\n )\n }, 1000)\n }\n tick()\n }\n\n const doSave = async (): Promise<void> => {\n if (editor === null) return\n setBusy(true)\n setFormError(null)\n try {\n const name = editor.name.trim()\n await injected.save({\n name,\n description: editor.description,\n whenToUse: editor.whenToUse.trim() === '' ? undefined : editor.whenToUse,\n modelInvocable: editor.modelInvocable,\n userInvocable: editor.userInvocable,\n content: editor.content,\n })\n setOutcome({ ok: true, text: t('saved') })\n setEditor(null)\n refreshUntil(skills => skills.some(skill => skill.name === name))\n } catch (error) {\n setFormError(String(error instanceof Error ? error.message : error))\n } finally {\n setBusy(false)\n }\n }\n\n const doDelete = async (): Promise<void> => {\n if (confirmName === null) return\n const name = confirmName\n setBusy(true)\n try {\n await injected.remove(name)\n setOutcome({ ok: true, text: t('saved') })\n refreshUntil(skills => !skills.some(skill => skill.name === name))\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n setConfirmName(null)\n }\n }\n\n const doToggle = async (skill: SkillRowView): Promise<void> => {\n const enabled = skill.invocation.modelInvocable || skill.invocation.userInvocable\n setBusy(true)\n try {\n await injected.policy(skill.name, !enabled)\n setOutcome({ ok: true, text: !enabled ? t('skillEnabled') : t('skillDisabledMsg') })\n refreshUntil(list => {\n const row = list.find(item => item.name === skill.name)\n return row !== undefined && row.invocation.modelInvocable === !enabled && row.invocation.userInvocable === !enabled\n })\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n }\n }\n\n const doOpen = async (target: OpenTarget): Promise<void> => {\n try {\n await injected.open(target)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n }\n }\n\n const doAddRoot = async (): Promise<void> => {\n if (addRoot === null || addRoot.value.trim() === '') return\n setRootBusy(true)\n setFormError(null)\n try {\n await injected.addRoot(addRoot.kind === 'local'\n ? { kind: 'local', path: addRoot.value.trim() }\n : { kind: 'git', url: addRoot.value.trim() })\n setOutcome({ ok: true, text: t('rootAdded') })\n setAddRoot(null)\n void injected.roots().then(\n (body) => setRoots(body.roots),\n () => setRoots([]),\n )\n // The provider remounts asynchronously; refresh the catalog a few\n // times so the repository's skills appear without manual reload.\n for (let tick = 0; tick < 4; tick++) {\n await new Promise(resolve => setTimeout(resolve, 1500))\n void injected.list().then(\n (body) => setSkills(body.skills),\n () => undefined,\n )\n }\n } catch (error) {\n setFormError(String(error instanceof Error ? error.message : error))\n } finally {\n setRootBusy(false)\n }\n }\n\n const doRemoveRoot = async (): Promise<void> => {\n if (confirmRootId === null) return\n setRootBusy(true)\n try {\n await injected.removeRoot(confirmRootId)\n setOutcome({ ok: true, text: t('rootRemoved') })\n setRoots(null)\n void injected.roots().then(\n (body) => setRoots(body.roots),\n () => setRoots([]),\n )\n setReload((value) => value + 1)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setRootBusy(false)\n setConfirmRootId(null)\n }\n }\n\n const readOnly = editor?.mode === 'view'\n\n const needle = query.trim().toLowerCase()\n const filtered = skills === null ? [] : skills.filter(skill =>\n (sourceFilter === 'all' || skill.source === sourceFilter)\n && (needle === '' || skill.name.toLowerCase().includes(needle) || skill.description.toLowerCase().includes(needle)))\n const sources = skills === null ? [] : [...new Set(skills.map(skill => skill.source))]\n\n return (\n <div className=\"dpc-section\">\n <style>{CSS}</style>\n\n <div className=\"dpc-head\">\n <IconSkillOutline16 aria-hidden=\"true\" />\n <h3>{t('skillsTitle')}</h3>\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void doOpen({ target: 'user-skills' })}>{t('openUserSkills')}</Button>\n <Button variant=\"primary\" size=\"sm\" onClick={openCreate}>{t('newSkill')}</Button>\n </div>\n <p className=\"dpc-intro\">{t('skillsIntro')}</p>\n\n {outcome !== null && (\n <div className=\"dpc-banner\" data-kind={outcome.ok ? 'ok' : 'error'} role=\"status\">\n <StateDot state={outcome.ok ? 'done' : 'error'} size={10} />\n <div className=\"dpc-bannerBody\"><span>{outcome.text}</span></div>\n </div>\n )}\n\n <div className=\"dpc-listHead\">\n <h3>{t('skillsTab')}</h3>\n {skills !== null && <span className=\"dpc-count\">{filtered.length}/{skills.length}</span>}\n <span className=\"dpc-spacer\" />\n <input\n className=\"dpc-search\"\n type=\"search\"\n placeholder={t('searchSkills')}\n aria-label={t('searchSkills')}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n <button type=\"button\" className=\"dpc-refresh\" aria-label={t('refresh')} title={t('refresh')} disabled={busy} onClick={() => setReload((value) => value + 1)}>\n <IconRefreshOutline14 size={14} aria-hidden=\"true\" />\n </button>\n </div>\n\n {sources.length > 1 && (\n <div className=\"dpc-chips\" role=\"group\" aria-label={t('source')}>\n {[{ id: 'all', label: t('filterAll') }, ...sources.map(source => ({ id: source, label: t(SOURCE_KEYS[source] ?? 'sourceCustom') }))].map(chip => (\n <button\n key={chip.id}\n type=\"button\"\n className=\"dpc-chip\"\n data-active={sourceFilter === chip.id ? 'true' : undefined}\n onClick={() => setSourceFilter(chip.id)}\n >\n {chip.label}\n </button>\n ))}\n </div>\n )}\n\n {skills === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {skills !== null && filtered.length === 0 && <p className=\"dpc-empty\">{skills.length === 0 ? t('emptySkills') : t('noMatch')}</p>}\n {skills !== null && filtered.length > 0 && (\n <ul className=\"dpc-cards\">\n {filtered.map((skill) => {\n const tag = policyTag(skill)\n return (\n <li className=\"dpc-card\" key={`${skill.source}/${skill.name}`}>\n <div className=\"dpc-cardTop\">\n <strong className=\"dpc-cardTitle\" title={skill.name}>{skill.name}</strong>\n <span className=\"dpc-tag\" data-kind=\"source\">{t(SOURCE_KEYS[skill.source] ?? 'sourceCustom')}</span>\n {tag.key !== undefined && <span className=\"dpc-tag\" data-kind={tag.off ? 'off' : undefined}>{t(tag.key)}</span>}\n </div>\n <p className=\"dpc-cardDesc\" title={skill.description}>{skill.description}</p>\n <div className=\"dpc-cardRow\">\n {skill.policyEditable && (\n <button\n type=\"button\"\n className=\"dpc-switch\"\n role=\"switch\"\n aria-checked={skill.invocation.modelInvocable || skill.invocation.userInvocable}\n aria-label={t('toggleSkill')}\n title={t('toggleSkillHint')}\n disabled={busy}\n onClick={() => void doToggle(skill)}\n >\n <span className=\"dpc-switchKnob\" />\n </button>\n )}\n {skill.dir !== undefined && (\n <button type=\"button\" className=\"dpc-link\" onClick={() => void doOpen({ target: 'skill', name: skill.name })}>{t('openFolder')}</button>\n )}\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => void openExisting(skill)}>\n {skill.editable ? t('edit') : t('view')}\n </Button>\n {skill.editable && (\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => setConfirmName(skill.name)}>{t('delete')}</Button>\n )}\n </div>\n </li>\n )\n })}\n </ul>\n )}\n\n <div className=\"dpc-listHead dpc-rootsHead\">\n <h3>{t('rootsTitle')}</h3>\n {roots !== null && <span className=\"dpc-count\">{roots.length}</span>}\n <span className=\"dpc-spacer\" />\n {addRoot === null && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setAddRoot({ kind: 'git', value: '' })}>{t('addRoot')}</Button>\n )}\n </div>\n <p className=\"dpc-intro\">{t('rootsIntro')}</p>\n {roots === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {roots !== null && roots.length === 0 && <p className=\"dpc-empty\">{t('emptyRoots')}</p>}\n {roots !== null && roots.length > 0 && (\n <ul className=\"dpc-roots\">\n {roots.map((root) => (\n <li className=\"dpc-root\" key={root.id}>\n <span className=\"dpc-tag\" data-kind=\"source\">{root.kind === 'git' ? 'GitHub' : t('rootLocal')}</span>\n <strong className=\"dpc-rootLabel\" title={root.kind === 'git' ? root.url : root.path}>{root.label}</strong>\n <span className=\"dpc-rootPath\">{root.kind === 'git' ? root.url : root.path}</span>\n {!root.live && <span className=\"dpc-tag\" data-kind=\"off\">{t('rootStale')}</span>}\n <span className=\"dpc-spacer\" />\n <button type=\"button\" className=\"dpc-link\" onClick={() => void doOpen({ target: 'root', id: root.id })}>{t('openFolder')}</button>\n <Button variant=\"ghost\" size=\"sm\" disabled={rootBusy} onClick={() => setConfirmRootId(root.id)}>{t('delete')}</Button>\n </li>\n ))}\n </ul>\n )}\n {addRoot !== null && (\n <div className=\"dpc-form dpc-addRoot\">\n <div className=\"dpc-addRootRow\">\n <select\n className=\"dpc-select\"\n aria-label={t('rootKind')}\n value={addRoot.kind}\n onChange={(event) => setAddRoot({ ...addRoot, kind: event.target.value as AddRootState['kind'] })}\n >\n <option value=\"git\">GitHub</option>\n <option value=\"local\">{t('rootLocal')}</option>\n </select>\n <input\n className=\"dpc-input\"\n type=\"text\"\n placeholder={addRoot.kind === 'git' ? 'https://github.com/anthropics/skills' : t('rootLocalPlaceholder')}\n aria-label={t('rootPlaceholder')}\n value={addRoot.value}\n autoFocus\n onChange={(event) => setAddRoot({ ...addRoot, value: event.target.value })}\n onKeyDown={(event) => { if (event.key === 'Enter') void doAddRoot() }}\n />\n <Button variant=\"primary\" size=\"sm\" disabled={rootBusy || addRoot.value.trim() === ''} onClick={() => void doAddRoot()}>{t('add')}</Button>\n <Button variant=\"ghost\" size=\"sm\" disabled={rootBusy} onClick={() => { setAddRoot(null); setFormError(null) }}>{t('cancel')}</Button>\n </div>\n <p className=\"dpc-intro\">{addRoot.kind === 'git' ? t('rootGitHint') : t('rootLocalHint')}</p>\n {formError !== null && <p className=\"dpc-formError\">{formError}</p>}\n </div>\n )}\n\n <Modal\n open={editor !== null}\n onClose={() => setEditor(null)}\n title={editor === null ? '' : editor.mode === 'create' ? t('newSkill') : editor.mode === 'edit' ? t('editSkill') : t('viewSkill')}\n className=\"dpc-modalForm\"\n contentClassName=\"dpc-modalScroll\"\n >\n {editor !== null && (\n <div className=\"dpc-form\">\n <label className=\"dpc-label\">\n <span>{t('skillName')}</span>\n <input\n className=\"dpc-input\"\n value={editor.name}\n disabled={readOnly || editor.mode === 'edit'}\n onChange={(event) => setEditor({ ...editor, name: event.target.value })}\n />\n </label>\n <label className=\"dpc-label\">\n <span>{t('skillDescription')}</span>\n <input\n className=\"dpc-input\"\n value={editor.description}\n disabled={readOnly}\n onChange={(event) => setEditor({ ...editor, description: event.target.value })}\n />\n </label>\n <label className=\"dpc-label\">\n <span>{t('skillWhenToUse')}</span>\n <input\n className=\"dpc-input\"\n value={editor.whenToUse}\n disabled={readOnly}\n onChange={(event) => setEditor({ ...editor, whenToUse: event.target.value })}\n />\n </label>\n <div className=\"dpc-checks\">\n <label>\n <input\n type=\"checkbox\"\n checked={editor.modelInvocable}\n disabled={readOnly}\n onChange={(event) => setEditor({ ...editor, modelInvocable: event.target.checked })}\n />\n {t('modelInvocable')}\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={editor.userInvocable}\n disabled={readOnly}\n onChange={(event) => setEditor({ ...editor, userInvocable: event.target.checked })}\n />\n {t('userInvocable')}\n </label>\n </div>\n <label className=\"dpc-label\">\n <span>{t('skillContent')}</span>\n <textarea\n className=\"dpc-textarea\"\n value={editor.content}\n readOnly={readOnly}\n onChange={(event) => setEditor({ ...editor, content: event.target.value })}\n />\n </label>\n {formError !== null && <p className=\"dpc-formError\">{formError}</p>}\n <div className=\"dpc-cardRow\">\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" onClick={() => setEditor(null)}>{readOnly ? t('close') : t('cancel')}</Button>\n {!readOnly && <Button variant=\"primary\" disabled={busy} onClick={() => void doSave()}>{t('save')}</Button>}\n </div>\n </div>\n )}\n </Modal>\n\n <Modal\n open={confirmName !== null}\n onClose={() => setConfirmName(null)}\n title={t('confirmDelete')}\n description={confirmName ?? undefined}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setConfirmName(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={busy} onClick={() => void doDelete()}>{t('delete')}</Button>\n </>\n }\n >\n <p>{t('deleteWarn')}</p>\n </Modal>\n\n <Modal\n open={confirmRootId !== null}\n onClose={() => setConfirmRootId(null)}\n title={t('confirmRemoveRoot')}\n description={roots?.find(root => root.id === confirmRootId)?.label ?? undefined}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setConfirmRootId(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={rootBusy} onClick={() => void doRemoveRoot()}>{t('delete')}</Button>\n </>\n }\n >\n <p>{t('removeRootWarn')}</p>\n </Modal>\n </div>\n )\n}\n", "/** zh/en dictionaries for the Settings capabilities tabs. */\n\nexport const zh = {\n sectionNav: '\u6280\u80FD\u4E0E MCP',\n skillsTab: '\u6280\u80FD',\n mcpTab: 'MCP',\n marketTab: '\u5E02\u573A',\n skillsTitle: '\u6280\u80FD\u7BA1\u7406',\n skillsIntro: '\u67E5\u770B\u4E0E\u7F16\u8F91 dsh \u53D1\u73B0\u7684\u6280\u80FD\uFF1B\u7528\u6237\u7EA7\u6280\u80FD\uFF08DSH_HOME/skills\uFF09\u53EF\u5728\u6B64\u65B0\u5EFA\u3001\u4FEE\u6539\u3001\u5220\u9664\uFF0C\u6587\u4EF6\u88AB\u76D1\u542C\uFF0C\u4FDD\u5B58\u5373\u751F\u6548\u3002\u82E5\u5B58\u5728 ~/.claude/skills \u6216 ~/.codex/skills\uFF0C\u4F1A\u81EA\u52A8\u7EB3\u5165\u626B\u63CF\uFF08\u96F6\u62F7\u8D1D\u3001\u5B9E\u65F6\u540C\u6B65\uFF09\u3002\u5361\u7247\u4E0A\u7684\u5F00\u5173\u63A7\u5236\u662F\u5426\u52A0\u8F7D\uFF1A\u505C\u7528\u5373\u4ECE\u6A21\u578B\u4E0E\u7528\u6237\u76EE\u5F55\u540C\u65F6\u6458\u9664\uFF0C\u5F00\u542F\u6062\u590D\u9ED8\u8BA4\u3002',\n newSkill: '\u65B0\u5EFA\u6280\u80FD',\n editSkill: '\u7F16\u8F91\u6280\u80FD',\n viewSkill: '\u67E5\u770B\u6280\u80FD',\n skillName: '\u540D\u79F0\uFF08kebab-case\uFF09',\n skillDescription: '\u63CF\u8FF0',\n skillWhenToUse: '\u4F7F\u7528\u65F6\u673A\uFF08\u53EF\u9009\uFF09',\n skillContent: '\u6B63\u6587\uFF08Markdown\uFF09',\n modelInvocable: '\u5141\u8BB8\u6A21\u578B\u8C03\u7528',\n userInvocable: '\u5141\u8BB8\u7528\u6237 / \u8C03\u7528',\n save: '\u4FDD\u5B58',\n cancel: '\u53D6\u6D88',\n delete: '\u5220\u9664',\n edit: '\u7F16\u8F91',\n view: '\u67E5\u770B',\n close: '\u5173\u95ED',\n emptySkills: '\u8FD8\u6CA1\u6709\u53D1\u73B0\u4EFB\u4F55\u6280\u80FD',\n loading: '\u8F7D\u5165\u4E2D\u2026',\n source: '\u6765\u6E90',\n sourceProjectDsh: '\u9879\u76EE',\n sourceProjectAgents: '\u9879\u76EE',\n sourceUserDsh: '\u7528\u6237',\n sourceUserAgents: '\u7528\u6237',\n sourceRuntime: '\u8FD0\u884C\u65F6',\n sourceBundled: '\u5185\u7F6E',\n sourceCustom: '\u81EA\u5B9A\u4E49',\n readOnly: '\u53EA\u8BFB',\n confirmDelete: '\u786E\u8BA4\u5220\u9664\u6280\u80FD\uFF1F',\n deleteWarn: '\u5C06\u5220\u9664 DSH_HOME/skills \u4E0B\u7684\u6574\u4E2A\u6280\u80FD\u76EE\u5F55\uFF0C\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\u3002',\n saved: '\u5DF2\u4FDD\u5B58\uFF0C\u6280\u80FD\u76EE\u5F55\u88AB\u76D1\u542C\uFF0C\u7A0D\u5019\u5373\u53EF\u5728\u4F1A\u8BDD\u4E2D\u4F7F\u7528\u3002',\n searchSkills: '\u641C\u7D22\u6280\u80FD\u540D\u79F0\u6216\u63CF\u8FF0',\n filterAll: '\u5168\u90E8',\n noMatch: '\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD',\n refresh: '\u5237\u65B0',\n skillDisabled: '\u5DF2\u505C\u7528',\n skillUserOnly: '\u4EC5\u7528\u6237\u53EF\u7528',\n skillModelOnly: '\u4EC5\u6A21\u578B\u53EF\u7528',\n skillEnabled: '\u5DF2\u542F\u7528\uFF0C\u7A0D\u5019\u5728\u5217\u8868\u4E2D\u751F\u6548\u3002',\n skillDisabledMsg: '\u5DF2\u505C\u7528\uFF1A\u6A21\u578B\u4E0E / \u547D\u4EE4\u90FD\u4E0D\u4F1A\u518D\u52A0\u8F7D\u5B83\u3002',\n toggleSkill: '\u5207\u6362\u6280\u80FD\u52A0\u8F7D',\n toggleSkillHint: '\u505C\u7528\u4F1A\u5728\u8BE5\u6280\u80FD\u7684 SKILL.md \u91CC\u5199\u5165 disable-model-invocation \u4E0E user-invocable\uFF0C\u540C\u65F6\u4ECE\u6A21\u578B\u4E0E\u7528\u6237\u76EE\u5F55\u6458\u9664\uFF1B\u5F00\u542F\u5219\u6062\u590D\u9ED8\u8BA4\u7B56\u7565\u3002\u6587\u4EF6\u5176\u4F59\u5185\u5BB9\u4E0D\u53D8\u3002',\n openFolder: '\u6253\u5F00\u76EE\u5F55',\n openUserSkills: '\u6253\u5F00\u6280\u80FD\u76EE\u5F55',\n rootsTitle: '\u6280\u80FD\u4ED3\u5E93',\n rootsIntro: '\u624B\u52A8\u6DFB\u52A0\u6280\u80FD\u4ED3\u5E93\uFF1A\u672C\u5730\u76EE\u5F55\u76F4\u63A5\u626B\u63CF\uFF08\u96F6\u62F7\u8D1D\uFF09\uFF0CGitHub \u4ED3\u5E93\u4E0B\u8F7D\u538B\u7F29\u5305\u540E\u89E3\u5305\u5230 DSH_HOME \u5185\uFF08\u65E0\u9700\u5B89\u88C5 git\uFF09\u3002\u4E5F\u53EF\u4EE5\u5728\u300C\u5E02\u573A\u300D\u9875\u4E00\u952E\u5B89\u88C5\u7CBE\u9009\u4ED3\u5E93\u3002',\n emptyRoots: '\u8FD8\u6CA1\u6709\u6DFB\u52A0\u81EA\u5B9A\u4E49\u6280\u80FD\u4ED3\u5E93',\n addRoot: '\u6DFB\u52A0\u4ED3\u5E93',\n rootLocal: '\u672C\u5730',\n rootLocalPlaceholder: 'D:\\\\path\\\\to\\\\skills',\n rootKind: '\u4ED3\u5E93\u7C7B\u578B',\n rootPlaceholder: '\u4ED3\u5E93\u5730\u5740',\n add: '\u6DFB\u52A0',\n rootAdded: '\u4ED3\u5E93\u5DF2\u6DFB\u52A0\uFF0C\u76EE\u5F55\u5B9E\u65F6\u751F\u6548\u3002',\n rootRemoved: '\u4ED3\u5E93\u5DF2\u79FB\u9664\u3002',\n rootStale: '\u76EE\u5F55\u7F3A\u5931',\n rootGitHint: '\u652F\u6301 https://github.com/owner/repo\u3001owner/repo\uFF0C\u53EF\u7528 #\u5206\u652F \u6216 /tree/\u5206\u652F \u6307\u5B9A\u7248\u672C\u3002',\n rootLocalHint: '\u6307\u5411\u4E00\u4E2A\u6280\u80FD\u76EE\u5F55\uFF08\u5185\u542B SKILL.md\uFF09\u6216\u88C5\u7740\u591A\u4E2A\u6280\u80FD\u76EE\u5F55\u7684\u6587\u4EF6\u5939\u3002',\n confirmRemoveRoot: '\u786E\u8BA4\u79FB\u9664\u8BE5\u4ED3\u5E93\uFF1F',\n removeRootWarn: '\u5C06\u53D6\u6D88\u626B\u63CF\u8BE5\u4ED3\u5E93\u5E76\u5220\u9664\u4E0B\u8F7D\u5230 DSH_HOME \u7684\u526F\u672C\uFF08\u672C\u5730\u76EE\u5F55\u672C\u8EAB\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002',\n mcpTitle: 'MCP \u670D\u52A1\u5668',\n mcpIntro: '\u7BA1\u7406 profile \u4E2D\u7684 MCP \u670D\u52A1\u5668\u884C\uFF08@deepseek-ai/dsh-mcp-client\uFF09\u3002\u65B0\u589E\u3001\u4FEE\u6539\u6216\u5220\u9664\u540E\u9700\u8981\u91CD\u542F dsh \u624D\u751F\u6548\u3002',\n addServer: '\u6DFB\u52A0\u670D\u52A1\u5668',\n editServer: '\u7F16\u8F91\u670D\u52A1\u5668',\n serverName: '\u670D\u52A1\u5668\u540D\uFF08\u5DE5\u5177\u540D\u524D\u7F00\uFF09',\n transport: '\u4F20\u8F93\u65B9\u5F0F',\n transportStdio: 'stdio\uFF08\u672C\u5730\u547D\u4EE4\uFF09',\n transportHttp: 'streamable-http\uFF08URL\uFF09',\n command: '\u547D\u4EE4',\n args: '\u53C2\u6570\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF09',\n envPairs: '\u73AF\u5883\u53D8\u91CF\uFF08\u6BCF\u884C KEY=VALUE\uFF09',\n url: 'URL',\n headersPairs: '\u8BF7\u6C42\u5934\uFF08\u6BCF\u884C KEY: VALUE\uFF09',\n disabled: '\u5DF2\u505C\u7528',\n enabled: '\u542F\u7528\u4E2D',\n toggle: '\u505C\u7528/\u542F\u7528',\n confirmRemove: '\u786E\u8BA4\u79FB\u9664\u8BE5\u670D\u52A1\u5668\uFF1F',\n removeWarn: '\u5C06\u4ECE profile \u914D\u7F6E\u4E2D\u79FB\u9664\u8FD9\u4E00\u884C\uFF0C\u91CD\u542F dsh \u540E\u5176\u5DE5\u5177\u4E0D\u518D\u51FA\u73B0\u3002',\n emptyMcp: '\u8FD8\u6CA1\u6709\u914D\u7F6E MCP \u670D\u52A1\u5668',\n importServers: '\u4ECE\u5176\u4ED6 Agent \u5BFC\u5165',\n importIntro: '\u626B\u63CF Claude Code\uFF08~/.claude.json\uFF09\u4E0E Codex\uFF08~/.codex/config.toml\uFF09\u7684 MCP \u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u52FE\u9009\u540E\u5BFC\u5165\u4E3A\u672C profile \u7684\u670D\u52A1\u5668\u884C\u3002',\n importEmpty: '\u6CA1\u6709\u53D1\u73B0\u53EF\u5BFC\u5165\u7684 MCP \u670D\u52A1\u5668',\n importSelectAll: '\u5168\u9009',\n importExisting: '\u5DF2\u5B58\u5728',\n importSelected: '\u5BFC\u5165\u9009\u4E2D\u9879',\n restartNeeded: '\u914D\u7F6E\u5DF2\u5199\u5165\uFF0C\u91CD\u542F dsh \u540E\u751F\u6548\u3002',\n restartDesktopHint: '\u91CD\u542F\u7531\u684C\u9762\u5E94\u7528\u8D1F\u8D23\uFF1A\u6258\u76D8\u83DC\u5355\u300C\u91CD\u542F\u670D\u52A1\u300D\u3002',\n restartOtherHint: '\u91CD\u542F\u65B9\u5F0F\uFF1A\u5173\u95ED\u5F53\u524D dsh \u8FDB\u7A0B\u540E\u91CD\u65B0\u8FD0\u884C\u3002',\n restartNow: '\u91CD\u542F\u670D\u52A1',\n restart: '\u91CD\u542F',\n restartConfirmTitle: '\u91CD\u542F dsh\uFF1F',\n restartConfirmBody: '\u91CD\u542F\u4F1A\u4E2D\u65AD\u6B63\u5728\u8FDB\u884C\u7684\u56DE\u5408\uFF0C\u672A\u4FDD\u5B58\u7684\u8F93\u5165\u53EF\u80FD\u4E22\u5931\uFF1BMCP \u884C\u7684\u53D8\u66F4\u5C06\u5728\u91CD\u542F\u540E\u751F\u6548\u3002',\n restarting: '\u6B63\u5728\u91CD\u542F\uFF0C\u6062\u590D\u540E\u5C06\u81EA\u52A8\u5237\u65B0\u9875\u9762\u2026',\n restartPortHint: '\u82E5\u91CD\u542F\u540E\u9875\u9762\u957F\u65F6\u95F4\u672A\u6062\u590D\uFF0C\u53EF\u80FD\u662F\u7AEF\u53E3\u5DF2\u53D8\u5316\uFF1A\u5728\u7EC8\u7AEF\u67E5\u770B\u65B0\u5730\u5740\u540E\u6253\u5F00\u3002',\n failed: '\u64CD\u4F5C\u5931\u8D25',\n formatTitle: '\u5B8C\u6574\u683C\u5F0F\u4E0E\u5FEB\u901F\u586B\u5145',\n formatPaste: '\u7C98\u8D34 JSON \u914D\u7F6E\uFF08mcpServers \u5305\u88C5\u6216\u5355\u6761\u76EE\u5747\u53EF\uFF09',\n formatFill: '\u89E3\u6790\u5E76\u586B\u5145\u8868\u5355',\n formatYamlHint: '\u4FDD\u5B58\u540E\u5C06\u5199\u5165 profile patch \u7684\u5B8C\u6574\u884C\uFF08\u5B9E\u65F6\u9884\u89C8\uFF09\uFF1A',\n formatJsonHint: '\u7B49\u4EF7\u7684 mcpServers JSON \u5199\u6CD5\uFF08\u53EF\u7C98\u8D34\u5230\u5176\u4ED6\u5DE5\u5177\uFF09\uFF1A',\n pasteTransportMismatch: '\u8BE5\u884C\u7684\u4F20\u8F93\u65B9\u5F0F\u5DF2\u9501\u5B9A\uFF0C\u4E0E\u7C98\u8D34\u914D\u7F6E\u7684\u7C7B\u578B\u4E0D\u4E00\u81F4\u3002',\n marketTitle: '\u5E02\u573A',\n marketIntro: '\u7CBE\u9009\u7684\u6280\u80FD\u4ED3\u5E93\u4E0E MCP \u670D\u52A1\u5668\uFF0C\u4E00\u952E\u5B89\u88C5\u3002\u5217\u8868\u6765\u81EA\u63D2\u4EF6\u4ED3\u5E93\u7684\u5728\u7EBF\u7D22\u5F15\uFF0C\u79BB\u7EBF\u65F6\u56DE\u9000\u5230\u5305\u5185\u5FEB\u7167\u3002',\n marketSkills: '\u6280\u80FD\u5E02\u573A',\n marketMcp: 'MCP \u5E02\u573A',\n marketSkillsIntro: '\u5B89\u88C5\u6280\u80FD\u4ED3\u5E93\uFF08GitHub \u4E0B\u8F7D\u89E3\u5305\uFF0C\u5B9E\u65F6\u8FDB\u5165\u626B\u63CF\u76EE\u5F55\uFF09\uFF1B\u5DF2\u5B89\u88C5\u7684\u4ED3\u5E93\u53EF\u5728\u300C\u6280\u80FD\u300D\u9875\u7BA1\u7406\u3002',\n marketMcpIntro: '\u6DFB\u52A0 MCP \u670D\u52A1\u5668\u884C\uFF08\u4E0E\u300CMCP\u300D\u9875\u540C\u4E00\u5B58\u50A8\uFF0C\u6DFB\u52A0\u540E\u9700\u91CD\u542F\u751F\u6548\uFF09\uFF1B\u9700\u8981\u5BC6\u94A5\u7684\u670D\u52A1\u5728\u5B89\u88C5\u540E\u4E8E\u5217\u8868\u4E2D\u8865\u586B\u73AF\u5883\u53D8\u91CF\u3002',\n marketEmpty: '\u5E02\u573A\u5217\u8868\u4E3A\u7A7A\u6216\u4E0D\u53EF\u7528',\n marketOffline: '\u5728\u7EBF\u7D22\u5F15\u4E0D\u53EF\u8FBE\uFF0C\u5F53\u524D\u5C55\u793A\u5305\u5185\u5FEB\u7167\uFF08\u53EF\u80FD\u4E0E\u6700\u65B0\u5217\u8868\u6709\u5DEE\u5F02\uFF09\u3002',\n marketSkillCount: '{n} \u4E2A\u6280\u80FD',\n marketInstall: '\u5B89\u88C5',\n marketAdd: '\u6DFB\u52A0',\n marketInstalling: '\u8FDB\u884C\u4E2D\u2026',\n marketInstalled: '\u5DF2\u5B89\u88C5',\n marketUninstall: '\u79FB\u9664',\n marketHome: '\u4E3B\u9875',\n marketNeedsEnv: '\u9700\u8981\u73AF\u5883\u53D8\u91CF',\n marketRepoInstalled: '\u4ED3\u5E93\u5DF2\u5B89\u88C5\uFF0C\u6280\u80FD\u7A0D\u5019\u51FA\u73B0\u5728\u300C\u6280\u80FD\u300D\u9875\u5217\u8868\u3002',\n marketUninstallConfirm: '\u786E\u8BA4\u79FB\u9664\uFF1F',\n marketUninstallRootWarn: '\u5C06\u53D6\u6D88\u626B\u63CF\u8BE5\u4ED3\u5E93\u5E76\u5220\u9664\u4E0B\u8F7D\u7684\u526F\u672C\uFF08\u79FB\u9664\u540E\u53EF\u91CD\u65B0\u5B89\u88C5\uFF09\u3002',\n marketDetail: '\u8BE6\u60C5',\n marketSkillListLabel: '\u6280\u80FD\u6E05\u5355',\n marketToolsLabel: '\u63D0\u4F9B\u5DE5\u5177',\n marketCommandLabel: '\u542F\u52A8\u547D\u4EE4',\n}\n\nexport const en = {\n sectionNav: 'Skills & MCP',\n skillsTab: 'Skills',\n mcpTab: 'MCP',\n marketTab: 'Market',\n skillsTitle: 'Skills',\n skillsIntro: 'View and edit the skills dsh discovers; user-level skills (DSH_HOME/skills) can be created, edited, and deleted here \u2014 the directory is watched, saves apply without a restart. ~/.claude/skills and ~/.codex/skills are scanned too when present (zero-copy, live-synced). The switch on each card toggles loading: disabling removes the skill from both the model and user catalogs; enabling restores the default policy.',\n newSkill: 'New skill',\n editSkill: 'Edit skill',\n viewSkill: 'View skill',\n skillName: 'Name (kebab-case)',\n skillDescription: 'Description',\n skillWhenToUse: 'When to use (optional)',\n skillContent: 'Body (Markdown)',\n modelInvocable: 'Model-invocable',\n userInvocable: 'User-invocable (/)',\n save: 'Save',\n cancel: 'Cancel',\n delete: 'Delete',\n edit: 'Edit',\n view: 'View',\n close: 'Close',\n emptySkills: 'No skills discovered yet',\n loading: 'Loading\u2026',\n source: 'Source',\n sourceProjectDsh: 'project',\n sourceProjectAgents: 'project',\n sourceUserDsh: 'user',\n sourceUserAgents: 'user',\n sourceRuntime: 'runtime',\n sourceBundled: 'bundled',\n sourceCustom: 'custom',\n readOnly: 'read-only',\n confirmDelete: 'Delete this skill?',\n deleteWarn: 'Removes the whole skill directory under DSH_HOME/skills. This cannot be undone.',\n saved: 'Saved. The skills directory is watched; the skill is usable in sessions shortly.',\n searchSkills: 'Search name or description',\n filterAll: 'All',\n noMatch: 'No skills match',\n refresh: 'Refresh',\n skillDisabled: 'disabled',\n skillUserOnly: 'user-only',\n skillModelOnly: 'model-only',\n skillEnabled: 'Enabled \u2014 the list reflects it shortly.',\n skillDisabledMsg: 'Disabled: neither the model nor / commands will load it.',\n toggleSkill: 'Toggle skill loading',\n toggleSkillHint: 'Disabling writes disable-model-invocation and user-invocable into the skill\\u2019s SKILL.md, removing it from both catalogs; enabling restores the default policy. The rest of the file is untouched.',\n openFolder: 'Open folder',\n openUserSkills: 'Open skills folder',\n rootsTitle: 'Skill repositories',\n rootsIntro: 'Add skill repositories by hand: local folders are scanned in place (zero-copy), GitHub repos arrive as a downloaded copy inside DSH_HOME (no git needed). The Market tab offers curated repos with one click.',\n emptyRoots: 'No custom skill repositories yet',\n addRoot: 'Add repository',\n rootLocal: 'Local',\n rootLocalPlaceholder: 'D:\\\\path\\\\to\\\\skills',\n rootKind: 'Repository type',\n rootPlaceholder: 'Repository address',\n add: 'Add',\n rootAdded: 'Repository added \u2014 the catalog follows live.',\n rootRemoved: 'Repository removed.',\n rootStale: 'missing',\n rootGitHint: 'Accepts https://github.com/owner/repo and owner/repo; pick a version with #branch or /tree/branch.',\n rootLocalHint: 'Point at one skill folder (with SKILL.md) or a folder of skill folders.',\n confirmRemoveRoot: 'Remove this repository?',\n removeRootWarn: 'Stops scanning the repository and deletes the copy downloaded into DSH_HOME (a local folder itself is untouched).',\n mcpTitle: 'MCP servers',\n mcpIntro: 'Manage the MCP server rows (@deepseek-ai/dsh-mcp-client) in this profile. Additions, edits, and removals take effect after a dsh restart.',\n addServer: 'Add server',\n editServer: 'Edit server',\n serverName: 'Server name (tool name prefix)',\n transport: 'Transport',\n transportStdio: 'stdio (local command)',\n transportHttp: 'streamable-http (URL)',\n command: 'Command',\n args: 'Arguments (one per line)',\n envPairs: 'Environment (KEY=VALUE per line)',\n url: 'URL',\n headersPairs: 'Headers (KEY: VALUE per line)',\n disabled: 'Disabled',\n enabled: 'Enabled',\n toggle: 'Enable/disable',\n confirmRemove: 'Remove this server?',\n removeWarn: 'Removes the row from the profile configuration; its tools disappear after the next dsh restart.',\n emptyMcp: 'No MCP servers configured yet',\n importServers: 'Import from other agents',\n importIntro: 'Scans Claude Code (~/.claude.json) and Codex (~/.codex/config.toml) MCP server configs; selected entries become server rows in this profile.',\n importEmpty: 'No importable MCP servers found',\n importSelectAll: 'Select all',\n importExisting: 'already here',\n importSelected: 'Import selected',\n restartNeeded: 'Configuration written \u2014 restart dsh to apply.',\n restartDesktopHint: 'The desktop app owns restarts: use the tray \u201CRestart service\u201D.',\n restartOtherHint: 'Restart by closing this dsh process and running it again.',\n restartNow: 'Restart service',\n restart: 'Restart',\n restartConfirmTitle: 'Restart dsh?',\n restartConfirmBody: 'Restarting interrupts any running turn and may lose unsaved input; pending MCP changes apply after the restart.',\n restarting: 'Restarting \u2014 the page will reload once the host is back\u2026',\n restartPortHint: 'If the page does not recover, the port may have changed: check the terminal for the new URL.',\n failed: 'Operation failed',\n formatTitle: 'Full format & quick fill',\n formatPaste: 'Paste a JSON config (mcpServers wrapper or a bare entry)',\n formatFill: 'Parse and fill the form',\n formatYamlHint: 'The complete row as it will land in the profile patch (live preview):',\n formatJsonHint: 'Equivalent mcpServers JSON (paste-ready for other tools):',\n pasteTransportMismatch: 'This row\\u2019s transport is locked and differs from the pasted config.',\n marketTitle: 'Market',\n marketIntro: 'Curated skill repositories and MCP servers, installable with one click. The list comes from the plugin repository\\u2019s online index, falling back to the bundled snapshot offline.',\n marketSkills: 'Skills market',\n marketMcp: 'MCP market',\n marketSkillsIntro: 'Installs skill repositories (GitHub download, live catalog); manage installed ones on the Skills tab.',\n marketMcpIntro: 'Adds MCP server rows (same storage as the MCP tab; restart to apply). Servers needing keys get their environment filled in on the row after install.',\n marketEmpty: 'Market list is empty or unavailable',\n marketOffline: 'Online index unreachable \u2014 showing the bundled snapshot, which may lag behind.',\n marketSkillCount: '{n} skills',\n marketInstall: 'Install',\n marketAdd: 'Add',\n marketInstalling: 'Working\u2026',\n marketInstalled: 'installed',\n marketUninstall: 'Uninstall',\n marketHome: 'Homepage',\n marketNeedsEnv: 'Needs environment variables',\n marketRepoInstalled: 'Repository installed \u2014 its skills appear on the Skills tab shortly.',\n marketUninstallConfirm: 'Uninstall?',\n marketUninstallRootWarn: 'Stops scanning the repository and deletes the downloaded copy (you can reinstall later).',\n marketDetail: 'Details',\n marketSkillListLabel: 'Skills included',\n marketToolsLabel: 'Tools provided',\n marketCommandLabel: 'Launch command',\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/** dsh-plugin-capabilities client entry: contributes the top-level\n * \u201C\u6280\u80FD\u4E0E MCP\u201D section into Settings (beside \u901A\u7528\u8BBE\u7F6E/\u6A21\u578B, with Skills, MCP,\n * and \u5E02\u573A as internal tabs). Calls the host routes with fetch. */\n\nimport { createElement as h } from 'react'\nimport { CapabilitiesSection } from './CapabilitiesSection.tsx'\nimport type { McpInjected, McpRow } from './McpTab.tsx'\nimport type { MarketInjected, RootRowView } from './MarketTab.tsx'\nimport type { SkillsInjected, SkillRowView } from './SkillsTab.tsx'\nimport { zh, en } from './locales.ts'\n\n/** Locale dictionary namespace owned by this plugin. */\nexport const NS = 'settings.pluginCapabilities'\n\n/** The `t` function bound by the locale service. */\nexport interface Translate {\n (key: string): string\n}\n\n/** Minimal structural subset of the slots service. */\ninterface SlotsService {\n inject(slot: string, register: () => unknown): void\n register(meta: Record<string, unknown>, component: () => unknown): unknown\n}\n\n/** Minimal structural subset of the locale service. */\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 client cordis context this plugin relies on (structural). */\ninterface CapabilitiesClientContext {\n effect(callback: () => unknown, label?: string): void\n locale: LocaleService\n slots: SlotsService\n}\n\n/** Same-origin fetch of the manager's host routes. */\nasync function fetchJson<T>(path: string, init?: RequestInit): Promise<T> {\n const response = await fetch(path, init)\n const body = (await response.json()) as T & { error?: string }\n if (!response.ok) throw new Error(body.error ?? `HTTP ${response.status}`)\n return body\n}\n\nconst post = (path: string, body: unknown): Promise<unknown> =>\n fetchJson(path, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(body) })\n\nexport const name = 'dsh-plugin-capabilities'\nexport const inject = ['slots', 'locale']\n\nexport interface SkillBody { content: string }\n\n/** One foreign-agent server from the import scan. */\nexport interface ImportedServerView {\n agent: 'claude-code' | 'codex'\n name: string\n transport: 'stdio' | 'streamable-http'\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n}\n\n/** Openable targets on the host (server resolves real paths). */\nexport type OpenTarget =\n | { target: 'user-skills' }\n | { target: 'skill'; name: string }\n | { target: 'root'; id: string }\n\nexport function apply(ctx: CapabilitiesClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-plugin-capabilities: dictionaries')\n const t = ctx.locale.bind(NS)\n\n const skillsInjected: SkillsInjected = {\n list: () => fetchJson<{ skills: SkillRowView[] }>('/dsh-plugin-capabilities/skills'),\n get: (name: string) => fetchJson<SkillBody>(`/dsh-plugin-capabilities/skill?name=${encodeURIComponent(name)}`),\n save: (input: unknown) => post('/dsh-plugin-capabilities/skill/save', input) as Promise<{ ok: boolean }>,\n remove: (name: string) => post('/dsh-plugin-capabilities/skill/delete', { name }) as Promise<{ ok: boolean }>,\n policy: (name: string, enabled: boolean) =>\n post('/dsh-plugin-capabilities/skill/policy', { name, enabled }) as Promise<{ ok: boolean }>,\n open: (target: OpenTarget) => post('/dsh-plugin-capabilities/open', target) as Promise<{ ok: boolean }>,\n roots: () => fetchJson<{ roots: RootRowView[] }>('/dsh-plugin-capabilities/roots'),\n addRoot: (input: { kind: 'local' | 'git'; path?: string; url?: string }) =>\n post('/dsh-plugin-capabilities/roots/add', input) as Promise<{ ok: boolean; root: RootRowView }>,\n removeRoot: (id: string) => post('/dsh-plugin-capabilities/roots/remove', { id }) as Promise<{ ok: boolean }>,\n }\n\n const mcpInjected: McpInjected = {\n list: () => fetchJson<{ servers: McpRow[] }>('/dsh-plugin-capabilities/mcp'),\n save: (input: unknown) => post('/dsh-plugin-capabilities/mcp/save', input) as Promise<{ ok: boolean; id: string }>,\n toggle: (id: string, disabled: boolean) => post('/dsh-plugin-capabilities/mcp/toggle', { id, disabled }) as Promise<{ ok: boolean }>,\n remove: (id: string) => post('/dsh-plugin-capabilities/mcp/remove', { id }) as Promise<{ ok: boolean }>,\n scanImport: () => fetchJson<{ servers: ImportedServerView[]; existing: string[] }>('/dsh-plugin-capabilities/import/scan'),\n applyImport: (items: Array<{ agent: string; name: string }>) =>\n post('/dsh-plugin-capabilities/import/apply', { items }) as Promise<{ ok: boolean; results: Array<{ name: string; ok: boolean; error?: string }> }>,\n restart: async (): Promise<void> => {\n if (window.dshDesktop !== undefined) {\n window.dshDesktop.restartSidecar?.()\n return\n }\n // \u72EC\u7ACB dsh web\uFF1A\u81EA\u91CD\u542F\u8DEF\u7531\u3002\u8FDE\u63A5\u5728\u5173\u505C\u9014\u4E2D\u65AD\u5F00\u5C5E\u9884\u671F\uFF0C\u4E0D\u7B97\u5931\u8D25\u3002\n try { await post('/dsh-plugin-capabilities/restart', {}) } catch { /* dying mid-restart is expected */ }\n },\n desktop: window.dshDesktop !== undefined,\n }\n\n const marketInjected: MarketInjected = {\n skillsIndex: () => fetchJson<{ source: 'remote' | 'bundled'; repos: Array<MarketRepoView & { installedId: string | null }> }>('/dsh-plugin-capabilities/market/skills'),\n mcpIndex: () => fetchJson<{ source: 'remote' | 'bundled'; servers: Array<MarketServerView & { installed: boolean }> }>('/dsh-plugin-capabilities/market/mcp'),\n installSkillRepo: (url: string) =>\n post('/dsh-plugin-capabilities/market/skills/install', { url }) as Promise<{ ok: boolean; root: RootRowView }>,\n installMcp: (id: string) =>\n post('/dsh-plugin-capabilities/market/mcp/install', { id }) as Promise<{ ok: boolean; id: string }>,\n removeRoot: skillsInjected.removeRoot,\n }\n\n // One top-level nav entry (between \u6A21\u578B and \u63D2\u4EF6), not a tab under the\n // Plugins section \u2014 the section component owns its internal tabs directly,\n // so nothing registers into settings.plugins.tab anymore.\n ctx.slots.inject('settings.section', () => {\n return ctx.slots.register({\n name: 'settings.section',\n id: 'capabilities',\n order: 12,\n label: () => t('sectionNav'),\n locale: NS,\n }, () => h(CapabilitiesSection, { t, skills: skillsInjected, mcp: mcpInjected, market: marketInjected }))\n })\n}\n\n/** One skill inside a market repository's inventory, as the browser sees it. */\nexport interface MarketSkillItemView {\n name: string\n description?: string\n descriptionZh?: string\n}\n\n/** One skills-market repository as the browser sees it. */\nexport interface MarketRepoView {\n id: string\n name: string\n nameZh?: string\n description: string\n descriptionZh?: string\n detail?: string\n detailZh?: string\n url: string\n homepage?: string\n skillCount?: number\n skills?: MarketSkillItemView[]\n}\n\n/** One MCP-market server as the browser sees it. */\nexport interface MarketServerView {\n id: string\n name: string\n nameZh?: string\n description: string\n descriptionZh?: string\n transport: 'stdio' | 'streamable-http'\n command?: string\n args?: string[]\n envKeys?: string[]\n url?: string\n homepage: string\n category?: string\n runtime?: string\n tools?: string[]\n detail?: string\n detailZh?: string\n}\n", "/** Settings top-level \u201C\u6280\u80FD\u4E0E MCP\u201D section: one nav entry beside \u901A\u7528\u8BBE\u7F6E and\n * \u6A21\u578B, with the Skills, MCP, and \u5E02\u573A pages as internal tabs. The pages are\n * pure composition; data still arrives through the injected faces. */\n\nimport { useEffect, useId, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { CSS } from './css.ts'\nimport { MarketTab } from './MarketTab.tsx'\nimport type { MarketInjected } from './MarketTab.tsx'\nimport { McpTab } from './McpTab.tsx'\nimport type { McpInjected } from './McpTab.tsx'\nimport { SkillsTab } from './SkillsTab.tsx'\nimport type { SkillsInjected } from './SkillsTab.tsx'\nimport type { Translate } from './index.ts'\n\nexport function CapabilitiesSection(props: {\n t: Translate\n skills: SkillsInjected\n mcp: McpInjected\n market: MarketInjected\n}): ReactElement {\n const { t, skills, mcp, market } = props\n const tabsId = useId()\n const tabRefs = useRef<Array<HTMLButtonElement | null>>([])\n const rows = [\n { id: 'skills', label: t('skillsTab') },\n { id: 'mcp', label: t('mcpTab') },\n { id: 'market', label: t('marketTab') },\n ]\n const [activeId, setActiveId] = useState('skills')\n // The skills page mounts immediately; a tab mounts only when first\n // selected, then stays mounted while hidden so editor drafts and outcome\n // banners survive switching between the views.\n const [visitedIds, setVisitedIds] = useState<ReadonlySet<string>>(() => new Set(['skills']))\n\n useEffect(() => {\n setVisitedIds((previous) => {\n if (previous.has(activeId)) return previous\n return new Set([...previous, activeId])\n })\n }, [activeId])\n\n return (\n <div className=\"dpc-section\">\n <style>{CSS}</style>\n\n <h2 className=\"dpc-heading\">{t('sectionNav')}</h2>\n <div className=\"dpc-tabs\" role=\"tablist\" aria-label={t('sectionNav')}>\n {rows.map((row, index) => {\n const selected = row.id === activeId\n return (\n <button\n key={row.id}\n ref={(element) => { tabRefs.current[index] = element }}\n id={`${tabsId}-tab-${row.id}`}\n type=\"button\"\n role=\"tab\"\n className=\"dpc-tab\"\n aria-selected={selected}\n aria-controls={`${tabsId}-panel-${row.id}`}\n data-active={selected ? 'true' : undefined}\n tabIndex={selected ? 0 : -1}\n onClick={() => { setActiveId(row.id) }}\n onKeyDown={(event) => {\n let nextIndex: number\n switch (event.key) {\n case 'ArrowRight': nextIndex = (index + 1) % rows.length; break\n case 'ArrowLeft': nextIndex = (index - 1 + rows.length) % rows.length; break\n case 'Home': nextIndex = 0; break\n case 'End': nextIndex = rows.length - 1; break\n default: return\n }\n event.preventDefault()\n setActiveId(rows[nextIndex]?.id ?? 'skills')\n tabRefs.current[nextIndex]?.focus()\n }}\n >\n {row.label}\n </button>\n )\n })}\n </div>\n {rows\n .filter(row => row.id === activeId || visitedIds.has(row.id))\n .map((row) => {\n const selected = row.id === activeId\n return (\n <div\n key={row.id}\n id={`${tabsId}-panel-${row.id}`}\n className=\"dpc-tabPanel\"\n role=\"tabpanel\"\n aria-labelledby={`${tabsId}-tab-${row.id}`}\n hidden={!selected}\n >\n {row.id === 'skills'\n ? <SkillsTab t={t} injected={skills} />\n : row.id === 'mcp'\n ? <McpTab t={t} injected={mcp} />\n : <MarketTab t={t} market={market} mcp={mcp} />}\n </div>\n )\n })}\n </div>\n )\n}\n", "/** Shared scoped stylesheet for the capabilities tabs \u2014 rides the host's\n * --dsw-* tokens (same design language as the plugin-inventory and install\n * tabs) so light and dark themes both stay correct. Prefix: dpc-. */\n\nexport const CSS = `\n.dpc-section{display:flex;flex-direction:column;gap:14px;width:100%;max-width:760px;color:var(--dsw-alias-label-primary)}\n.dpc-heading{margin:0;font-size:18px;line-height:26px;font-weight:600}\n/* Top-level section's internal tabs \u2014 same underline-tab look as the host's\n Plugins section so the promoted placement still reads as one family. */\n.dpc-tabs{display:flex;align-items:flex-end;gap:22px;border-bottom:1px solid var(--dsw-alias-border-l2);margin-top:2px}\n.dpc-tab{position:relative;border:0;padding:7px 1px 9px;background:transparent;color:var(--dsw-alias-label-tertiary);font:inherit;font-size:13px;line-height:20px;cursor:pointer}\n.dpc-tab:hover,.dpc-tab[data-active='true']{color:var(--dsw-alias-label-primary)}\n.dpc-tab[data-active='true']::after,.dpc-tab:focus-visible::after{position:absolute;right:0;bottom:-1px;left:0;height:2px;border-radius:2px 2px 0 0;background:var(--dsw-alias-label-primary);content:''}\n.dpc-tab:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:2px;color:var(--dsw-alias-label-primary)}\n.dpc-tabPanel{min-width:0;padding-top:2px}\n.dpc-head{display:flex;align-items:center;gap:8px}\n.dpc-head h3{margin:0;font-size:13px;line-height:20px;font-weight:600}\n.dpc-head>svg{flex:none;color:var(--dsw-alias-label-tertiary)}\n.dpc-intro{margin:0;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary)}\n.dpc-listHead{display:flex;align-items:baseline;gap:7px;padding:0 2px;margin-top:2px}\n.dpc-listHead h3{margin:0;font-size:13px;line-height:20px;font-weight:600}\n.dpc-count{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}\n.dpc-spacer{flex:1}\n.dpc-refresh{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}\n.dpc-refresh:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dpc-refresh:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}\n.dpc-empty{margin:0;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary)}\n.dpc-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch;gap:10px;margin:0;padding:0;list-style:none}\n.dpc-card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;background:var(--dsw-alias-bg-layer-3);padding:12px 14px;cursor:pointer}\n.dpc-card:hover{background:var(--dsw-alias-interactive-bg-hover)}\n.dpc-cardTop{display:flex;align-items:center;gap:8px}\n.dpc-cardTitle{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;line-height:20px;font-weight:600;font-family:var(--ds-font-family-code)}\n.dpc-cardDesc{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}\n.dpc-cardRow{display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.dpc-tag{display:inline-flex;align-items:center;min-height:20px;border-radius:5px;padding:1px 6px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);font-size:11px;line-height:16px;white-space:nowrap}\n.dpc-tag[data-kind='source']{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary)}\n.dpc-tag[data-kind='off']{background:color-mix(in srgb,var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-tertiary)) 12%,transparent);color:var(--dsw-alias-label-secondary)}\n.dpc-cardActions{display:flex;align-items:center;gap:6px;margin-left:auto}\n.dpc-banner{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:10px 12px;background:var(--dsw-alias-bg-layer-3);font-size:13px;line-height:20px}\n.dpc-banner[data-kind='ok']{border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary) 35%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 8%,transparent)}\n.dpc-banner[data-kind='error']{border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 35%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 8%,transparent)}\n.dpc-banner[data-kind='info']{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary) 35%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 8%,transparent)}\n.dpc-bannerBody{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.dpc-bannerHint{display:flex;align-items:center;gap:8px;flex-wrap:wrap;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}\n.dpc-form{display:flex;flex-direction:column;gap:10px}\n.dpc-label{display:flex;flex-direction:column;gap:4px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary)}\n.dpc-label>span:first-child{color:var(--dsw-alias-label-tertiary)}\n.dpc-input,.dpc-textarea,.dpc-select{width:100%;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:7px 10px;outline:none;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px}\n.dpc-textarea{min-height:320px;resize:vertical;font-family:var(--ds-font-family-code);line-height:1.5}\n.dpc-textarea[data-short='true']{min-height:96px}\n.dpc-input:focus-visible,.dpc-textarea:focus-visible,.dpc-select:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--dsw-alias-state-business-primary) 18%,transparent)}\n.dpc-checks{display:flex;gap:16px;font-size:13px;line-height:20px}\n.dpc-checks label{display:inline-flex;align-items:center;gap:6px;cursor:pointer}\n.dpc-formError{margin:0;color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:18px}\n/* Import dialog: wider than the host's 380px default; the server list gets\n its own scroll so title, intro, and footer stay pinned. The doubled class\n beats the host dialog's module CSS regardless of injection order. */\n.dpc-modalWide.dpc-modalWide{width:min(680px,100%)}\n/* Editor dialogs (new skill / server): 640px wide so markdown bodies and\n command/arg/env lines stop wrapping mid-token; the content column scrolls\n on short viewports instead of clipping past the dialog edge. */\n.dpc-modalForm.dpc-modalForm{width:min(760px,100%)}\n.dpc-modalScroll.dpc-modalScroll{max-height:calc(100vh - 160px);overflow-y:auto}\n.dpc-mdPreview{min-height:320px;max-height:60vh;overflow-y:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;background:var(--dsw-alias-bg-layer-1);font-size:13px}\n.dpc-importScroll{display:flex;flex-direction:column;gap:14px;max-height:min(400px,52vh);overflow-y:auto;padding:2px 4px 2px 2px}\n.dpc-importGroup{display:flex;flex-direction:column;gap:8px}\n.dpc-importHead{display:flex;align-items:center;gap:8px;padding:0 2px}\n.dpc-importCount{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}\n.dpc-importAll{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer}\n/* Skills search + source filter chips. */\n.dpc-search{width:200px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:4px 10px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;line-height:18px}\n.dpc-search:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}\n.dpc-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.dpc-chip{border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:2px 10px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;line-height:16px;cursor:pointer}\n.dpc-chip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}\n.dpc-chip[data-active='true']{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}\n.dpc-chip:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}\n/* Load-policy switch on skill cards (no form semantics \u2014 instant apply). */\n.dpc-switch{position:relative;flex:none;width:30px;height:18px;border:0;border-radius:999px;background:var(--dsw-alias-bg-layer-1);box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);cursor:pointer;transition:background .15s}\n.dpc-switch[aria-checked='true']{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 55%,transparent);box-shadow:none}\n.dpc-switchKnob{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--dsw-alias-label-primary);transition:left .15s}\n.dpc-switch[aria-checked='true'] .dpc-switchKnob{left:14px;background:#fff}\n.dpc-switch:disabled{opacity:.55;cursor:default}\n.dpc-switch:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}\n/* Quiet inline link-button (open folder, homepage). */\n.dpc-link{border:0;padding:0;background:transparent;color:var(--dsw-alias-state-business-primary);font:inherit;font-size:12px;line-height:18px;cursor:pointer;text-decoration:none}\n.dpc-link:hover{text-decoration:underline}\n.dpc-link:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:2px}\n/* Skill repositories list + add form. */\n.dpc-rootsHead{margin-top:10px}\n.dpc-roots{display:flex;flex-direction:column;gap:6px;margin:0;padding:0;list-style:none}\n.dpc-root{display:flex;align-items:center;gap:8px;min-width:0;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;background:var(--dsw-alias-bg-layer-3)}\n.dpc-rootLabel{flex:none;font-size:13px;line-height:18px;font-weight:600}\n.dpc-rootPath{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary);font-family:var(--ds-font-family-code)}\n.dpc-addRoot{border:1px dashed var(--dsw-alias-border-l2);border-radius:8px;padding:10px 12px}\n.dpc-addRootRow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.dpc-addRootRow .dpc-select{width:auto;flex:none}\n.dpc-addRootRow .dpc-input{flex:1;min-width:200px}\n/* Market segments + env hint + MCP format preview. */\n.dpc-segments{display:inline-flex;gap:4px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:3px;background:var(--dsw-alias-bg-layer-1)}\n.dpc-segment{border:0;border-radius:6px;padding:4px 14px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;line-height:18px;cursor:pointer}\n.dpc-segment:hover{color:var(--dsw-alias-label-primary)}\n.dpc-segment[data-active='true']{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font-weight:600}\n.dpc-segment:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}\n.dpc-envHint{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary))}\n.dpc-format{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;background:var(--dsw-alias-bg-layer-1)}\n.dpc-format summary{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer;user-select:none}\n.dpc-format summary:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px;border-radius:2px}\n.dpc-format .dpc-form{margin-top:8px}\n.dpc-formatHint{margin:2px 0 0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary)}\n.dpc-code{margin:4px 0 8px;border:1px solid var(--dsw-alias-border-l2);border-radius:6px;padding:8px 10px;overflow-x:auto;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);font-size:11px;line-height:17px;white-space:pre}\n/* Market detail modal. The host dialog card is a fixed 380px column with no\n scroll, which the long-form intros turn into a clipped strip \u2014 widen it\n (doubled selector outranks the module class regardless of style order),\n cap the height, and scroll inside the content region. */\n.dpc-marketDialog.dpc-marketDialog{width:min(720px,100%);max-height:calc(100vh - 48px)}\n.dpc-marketContent{overflow-y:auto;min-height:0}\n.dpc-detailTagsRow{display:flex;flex-wrap:wrap;gap:4px;margin:0 0 8px}\n.dpc-detailDesc{margin:0;font-size:13px;line-height:20px}\n.dpc-detailSection{margin-top:14px;display:flex;flex-direction:column;gap:6px}\n.dpc-detailLabel{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary)}\n.dpc-detailTags{display:flex;flex-wrap:wrap;gap:4px}\n.dpc-skillList{margin:0;padding:0;list-style:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px 18px}\n.dpc-skillItem{display:flex;gap:8px;align-items:baseline;font-size:12px;line-height:18px;min-width:0}\n.dpc-skillName{font-family:var(--ds-font-family-code);color:var(--dsw-alias-label-primary);white-space:nowrap;flex:none}\n.dpc-skillDesc{color:var(--dsw-alias-label-secondary);min-width:0}\n@media(max-width:560px){.dpc-skillList{grid-template-columns:minmax(0,1fr)}}\n@media(max-width:680px){.dpc-cards{grid-template-columns:minmax(0,1fr)}}\n`\n", "/** Settings \u201C\u5E02\u573A\u201D tab: browse and install curated skill repositories and\n * MCP servers. Two segments (skills / MCP) with independently fetched\n * indexes; installs reuse the repositories and MCP-row plumbing, so a\n * skills install lands live in the catalog and an MCP install raises the\n * same pending-restart notice as the MCP tab. */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { Button, IconRefreshOutline14, Modal, StateDot } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CSS } from './css.ts'\nimport type { MarketRepoView, MarketServerView, Translate } from './index.ts'\nimport type { McpInjected } from './McpTab.tsx'\n\n/** One registered skill repository as the roots route reports it. */\nexport interface RootRowView {\n id: string\n kind: 'local' | 'git'\n label: string\n url?: string\n ref?: string\n path?: string\n roots: string[]\n materialDir?: string\n addedAt: number\n /** False once one of its scan roots vanished from disk. */\n live: boolean\n}\n\nexport interface MarketInjected {\n skillsIndex(): Promise<{ source: 'remote' | 'bundled'; repos: Array<MarketRepoView & { installedId: string | null }> }>\n mcpIndex(): Promise<{ source: 'remote' | 'bundled'; servers: Array<MarketServerView & { installed: boolean }> }>\n installSkillRepo(url: string): Promise<{ ok: boolean; root: RootRowView }>\n installMcp(id: string): Promise<{ ok: boolean; id: string }>\n removeRoot(id: string): Promise<{ ok: boolean }>\n}\n\n/** UI language hint for the index's zh display fields. */\nconst zhUi = (): boolean => navigator.language.toLowerCase().startsWith('zh')\n\ntype Segment = 'skills' | 'mcp'\n\nexport function MarketTab(props: { t: Translate; market: MarketInjected; mcp: McpInjected }): ReactElement {\n const { t, market, mcp } = props\n const [segment, setSegment] = useState<Segment>('skills')\n const [repos, setRepos] = useState<Array<MarketRepoView & { installedId: string | null }> | null>(null)\n const [servers, setServers] = useState<Array<MarketServerView & { installed: boolean }> | null>(null)\n const [source, setSource] = useState<'remote' | 'bundled'>('remote')\n const [busyId, setBusyId] = useState<string | null>(null)\n const [outcome, setOutcome] = useState<{ ok: boolean; text: string } | null>(null)\n const [confirmUninstall, setConfirmUninstall] = useState<{ kind: 'root' | 'mcp'; id: string; name: string } | null>(null)\n const [detail, setDetail] = useState<{ kind: Segment; id: string } | null>(null)\n const [reload, setReload] = useState(0)\n\n const refreshSkills = useCallback((): void => {\n setRepos(null)\n void market.skillsIndex().then(\n (body) => { setRepos(body.repos); setSource(body.source) },\n (error: Error) => { setRepos([]); setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }) },\n )\n }, [market, t])\n\n const refreshMcp = useCallback((): void => {\n setServers(null)\n void market.mcpIndex().then(\n (body) => { setServers(body.servers); setSource(body.source) },\n (error: Error) => { setServers([]); setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }) },\n )\n }, [market, t])\n\n useEffect(() => {\n // Refetch the visible segment when it changes or the reload ticks; the\n // hidden segment keeps its last state as a cache.\n if (segment === 'skills') refreshSkills()\n else refreshMcp()\n }, [segment, reload, refreshSkills, refreshMcp])\n\n const doInstallRepo = async (repo: MarketRepoView): Promise<void> => {\n setBusyId(repo.id)\n setOutcome(null)\n try {\n await market.installSkillRepo(repo.url)\n setOutcome({ ok: true, text: t('marketRepoInstalled') })\n refreshSkills()\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n refreshSkills()\n } finally {\n setBusyId(null)\n }\n }\n\n const doInstallMcp = async (server: MarketServerView): Promise<void> => {\n setBusyId(server.id)\n setOutcome(null)\n try {\n await market.installMcp(server.id)\n setOutcome({ ok: true, text: t('restartNeeded') })\n refreshMcp()\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n refreshMcp()\n } finally {\n setBusyId(null)\n }\n }\n\n const doUninstall = async (): Promise<void> => {\n if (confirmUninstall === null) return\n const target = confirmUninstall\n setBusyId(target.id)\n try {\n if (target.kind === 'root') {\n await market.removeRoot(target.id)\n setOutcome({ ok: true, text: t('rootRemoved') })\n refreshSkills()\n } else {\n await mcp.remove(target.id)\n setOutcome({ ok: true, text: t('restartNeeded') })\n refreshMcp()\n }\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusyId(null)\n setConfirmUninstall(null)\n }\n }\n\n const pick = <T,>(base: T, zh: T | undefined): T => (zhUi() && zh !== undefined ? zh : base)\n const title = (entry: { name: string; nameZh?: string }): string => pick(entry.name, entry.nameZh)\n const desc = (entry: { description: string; descriptionZh?: string }): string => pick(entry.description, entry.descriptionZh)\n const longText = (entry: { description: string; descriptionZh?: string; detail?: string; detailZh?: string }): string =>\n entry.detail !== undefined ? pick(entry.detail, entry.detailZh) : desc(entry)\n\n const cardStop = (event: { stopPropagation(): void }): void => { event.stopPropagation() }\n\n // The card list refreshes on install/uninstall, so the detail modal resolves\n // its entry by id each render and follows the fresh installed state.\n const detailRepo = detail !== null && detail.kind === 'skills' && repos !== null ? repos.find(repo => repo.id === detail.id) ?? null : null\n const detailServer = detail !== null && detail.kind === 'mcp' && servers !== null ? servers.find(server => server.id === detail.id) ?? null : null\n\n return (\n <div className=\"dpc-section\">\n <style>{CSS}</style>\n\n <div className=\"dpc-head\">\n <h3>{t('marketTitle')}</h3>\n <span className=\"dpc-spacer\" />\n <button type=\"button\" className=\"dpc-refresh\" aria-label={t('refresh')} title={t('refresh')} onClick={() => setReload((value) => value + 1)}>\n <IconRefreshOutline14 size={14} aria-hidden=\"true\" />\n </button>\n </div>\n <p className=\"dpc-intro\">{t('marketIntro')}</p>\n\n <div className=\"dpc-segments\" role=\"tablist\" aria-label={t('marketTitle')}>\n <button type=\"button\" role=\"tab\" aria-selected={segment === 'skills'} className=\"dpc-segment\" data-active={segment === 'skills' ? 'true' : undefined} onClick={() => setSegment('skills')}>\n {t('marketSkills')}\n </button>\n <button type=\"button\" role=\"tab\" aria-selected={segment === 'mcp'} className=\"dpc-segment\" data-active={segment === 'mcp' ? 'true' : undefined} onClick={() => setSegment('mcp')}>\n {t('marketMcp')}\n </button>\n </div>\n\n {outcome !== null && (\n <div className=\"dpc-banner\" data-kind={outcome.ok ? 'ok' : 'error'} role=\"status\">\n <StateDot state={outcome.ok ? 'done' : 'error'} size={10} />\n <div className=\"dpc-bannerBody\"><span>{outcome.text}</span></div>\n </div>\n )}\n {source === 'bundled' && (\n <div className=\"dpc-banner\" data-kind=\"info\" role=\"status\">\n <StateDot state=\"ongoing\" size={10} />\n <div className=\"dpc-bannerBody\"><span>{t('marketOffline')}</span></div>\n </div>\n )}\n\n {segment === 'skills' && (\n <>\n <p className=\"dpc-intro\">{t('marketSkillsIntro')}</p>\n {repos === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {repos !== null && repos.length === 0 && <p className=\"dpc-empty\">{t('marketEmpty')}</p>}\n {repos !== null && repos.length > 0 && (\n <ul className=\"dpc-cards\">\n {repos.map((repo) => (\n <li className=\"dpc-card\" key={repo.id} onClick={() => setDetail({ kind: 'skills', id: repo.id })}>\n <div className=\"dpc-cardTop\">\n <strong className=\"dpc-cardTitle\" title={repo.url}>{title(repo)}</strong>\n {repo.skillCount !== undefined && <span className=\"dpc-tag\">{t('marketSkillCount').replace('{n}', String(repo.skillCount))}</span>}\n {repo.installedId !== null && <span className=\"dpc-tag\" data-kind=\"source\">{t('marketInstalled')}</span>}\n </div>\n <p className=\"dpc-cardDesc\">{desc(repo)}</p>\n <div className=\"dpc-cardRow\">\n <button type=\"button\" className=\"dpc-link\" onClick={() => setDetail({ kind: 'skills', id: repo.id })}>{t('marketDetail')}</button>\n <a className=\"dpc-link\" href={repo.homepage ?? repo.url} target=\"_blank\" rel=\"noreferrer\" onClick={cardStop}>{t('marketHome')}</a>\n <span className=\"dpc-spacer\" />\n {repo.installedId !== null ? (\n <Button variant=\"ghost\" size=\"sm\" disabled={busyId !== null} onClick={(event) => { event.stopPropagation(); setConfirmUninstall({ kind: 'root', id: repo.installedId as string, name: title(repo) }) }}>\n {t('marketUninstall')}\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" disabled={busyId !== null} onClick={(event) => { event.stopPropagation(); void doInstallRepo(repo) }}>\n {busyId === repo.id ? t('marketInstalling') : t('marketInstall')}\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </>\n )}\n\n {segment === 'mcp' && (\n <>\n <p className=\"dpc-intro\">{t('marketMcpIntro')}</p>\n {servers === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {servers !== null && servers.length === 0 && <p className=\"dpc-empty\">{t('marketEmpty')}</p>}\n {servers !== null && servers.length > 0 && (\n <ul className=\"dpc-cards\">\n {servers.map((server) => (\n <li className=\"dpc-card\" key={server.id} onClick={() => setDetail({ kind: 'mcp', id: server.id })}>\n <div className=\"dpc-cardTop\">\n <strong className=\"dpc-cardTitle\" title={server.id}>{title(server)}</strong>\n <span className=\"dpc-tag\">{server.transport}</span>\n {server.runtime !== undefined && <span className=\"dpc-tag\">{server.runtime}</span>}\n {server.installed && <span className=\"dpc-tag\" data-kind=\"source\">{t('marketInstalled')}</span>}\n </div>\n <p className=\"dpc-cardDesc\">{desc(server)}</p>\n {server.envKeys !== undefined && server.envKeys.length > 0 && (\n <p className=\"dpc-envHint\">{t('marketNeedsEnv')}: {server.envKeys.join(', ')}</p>\n )}\n <div className=\"dpc-cardRow\">\n <button type=\"button\" className=\"dpc-link\" onClick={() => setDetail({ kind: 'mcp', id: server.id })}>{t('marketDetail')}</button>\n <a className=\"dpc-link\" href={server.homepage} target=\"_blank\" rel=\"noreferrer\" onClick={cardStop}>{t('marketHome')}</a>\n <span className=\"dpc-spacer\" />\n {server.installed ? (\n <Button variant=\"ghost\" size=\"sm\" disabled={busyId !== null} onClick={(event) => { event.stopPropagation(); void mcp.list().then(\n (body) => {\n const row = body.servers.find(item => item.serverName === server.id)\n if (row !== undefined) setConfirmUninstall({ kind: 'mcp', id: row.id, name: server.id })\n },\n (error: Error) => setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }),\n ) }}>\n {t('marketUninstall')}\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" disabled={busyId !== null} onClick={(event) => { event.stopPropagation(); void doInstallMcp(server) }}>\n {busyId === server.id ? t('marketInstalling') : t('marketAdd')}\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </>\n )}\n\n <Modal\n open={detailRepo !== null || detailServer !== null}\n onClose={() => setDetail(null)}\n title={detailRepo !== null ? title(detailRepo) : detailServer !== null ? title(detailServer) : ''}\n closeLabel={t('close')}\n className=\"dpc-marketDialog\"\n contentClassName=\"dpc-marketContent\"\n footer={\n <>\n {detailRepo !== null && (\n <a className=\"dpc-link\" href={detailRepo.homepage ?? detailRepo.url} target=\"_blank\" rel=\"noreferrer\">{t('marketHome')}</a>\n )}\n {detailServer !== null && (\n <a className=\"dpc-link\" href={detailServer.homepage} target=\"_blank\" rel=\"noreferrer\">{t('marketHome')}</a>\n )}\n <span className=\"dpc-spacer\" />\n {detailRepo !== null && (detailRepo.installedId !== null ? (\n <Button variant=\"ghost\" disabled={busyId !== null} onClick={() => { setConfirmUninstall({ kind: 'root', id: detailRepo.installedId as string, name: title(detailRepo) }); setDetail(null) }}>\n {t('marketUninstall')}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busyId !== null} onClick={() => void doInstallRepo(detailRepo)}>\n {busyId === detailRepo.id ? t('marketInstalling') : t('marketInstall')}\n </Button>\n ))}\n {detailServer !== null && (detailServer.installed ? (\n <Button variant=\"ghost\" disabled={busyId !== null} onClick={() => void mcp.list().then(\n (body) => {\n const row = body.servers.find(item => item.serverName === detailServer.id)\n if (row !== undefined) { setConfirmUninstall({ kind: 'mcp', id: row.id, name: title(detailServer) }); setDetail(null) }\n },\n (error: Error) => setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }),\n )}>\n {t('marketUninstall')}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busyId !== null} onClick={() => void doInstallMcp(detailServer)}>\n {busyId === detailServer.id ? t('marketInstalling') : t('marketAdd')}\n </Button>\n ))}\n </>\n }\n >\n {(detailRepo !== null || detailServer !== null) && (\n <div className=\"dpc-detailTagsRow\">\n {detailRepo !== null && detailRepo.skillCount !== undefined && (\n <span className=\"dpc-tag\">{t('marketSkillCount').replace('{n}', String(detailRepo.skillCount))}</span>\n )}\n {detailRepo !== null && detailRepo.installedId !== null && (\n <span className=\"dpc-tag\" data-kind=\"source\">{t('marketInstalled')}</span>\n )}\n {detailServer !== null && (\n <>\n <span className=\"dpc-tag\">{detailServer.transport}</span>\n {detailServer.runtime !== undefined && <span className=\"dpc-tag\">{detailServer.runtime}</span>}\n {detailServer.category !== undefined && <span className=\"dpc-tag\">{detailServer.category}</span>}\n {detailServer.installed && <span className=\"dpc-tag\" data-kind=\"source\">{t('marketInstalled')}</span>}\n </>\n )}\n </div>\n )}\n {detailRepo !== null && (\n <>\n <p className=\"dpc-detailDesc\">{longText(detailRepo)}</p>\n {detailRepo.skills !== undefined && detailRepo.skills.length > 0 && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketSkillListLabel')}</div>\n <ul className=\"dpc-skillList\">\n {detailRepo.skills.map(item => (\n <li className=\"dpc-skillItem\" key={item.name}>\n <code className=\"dpc-skillName\">{item.name}</code>\n {item.description !== undefined && (\n <span className=\"dpc-skillDesc\">{pick(item.description, item.descriptionZh)}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n </>\n )}\n {detailServer !== null && (\n <>\n <p className=\"dpc-detailDesc\">{longText(detailServer)}</p>\n {detailServer.command !== undefined && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketCommandLabel')}</div>\n <code className=\"dpc-code\">{[detailServer.command, ...(detailServer.args ?? [])].join(' ')}</code>\n </div>\n )}\n {detailServer.transport === 'streamable-http' && detailServer.url !== undefined && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketCommandLabel')}</div>\n <code className=\"dpc-code\">{detailServer.url}</code>\n </div>\n )}\n {detailServer.envKeys !== undefined && detailServer.envKeys.length > 0 && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketNeedsEnv')}</div>\n <div className=\"dpc-detailTags\">\n {detailServer.envKeys.map(key => <span className=\"dpc-tag\" key={key}>{key}</span>)}\n </div>\n </div>\n )}\n {detailServer.tools !== undefined && detailServer.tools.length > 0 && (\n <div className=\"dpc-detailSection\">\n <div className=\"dpc-detailLabel\">{t('marketToolsLabel')}</div>\n <div className=\"dpc-detailTags\">\n {detailServer.tools.map(name => <span className=\"dpc-tag\" key={name}>{name}</span>)}\n </div>\n </div>\n )}\n </>\n )}\n </Modal>\n\n <Modal\n open={confirmUninstall !== null}\n onClose={() => setConfirmUninstall(null)}\n title={t('marketUninstallConfirm')}\n description={confirmUninstall?.name ?? undefined}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setConfirmUninstall(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={busyId !== null} onClick={() => void doUninstall()}>{t('marketUninstall')}</Button>\n </>\n }\n >\n <p>{confirmUninstall?.kind === 'root' ? t('marketUninstallRootWarn') : t('removeWarn')}</p>\n </Modal>\n </div>\n )\n}\n", "/** Settings \u2192 Plugins \u201CMCP\u201D tab: manage the profile's mcp-client rows.\n * Mutations rewrite the profile patch and need a dsh restart \u2014 the banner\n * hands the restart to the desktop shell when one is present. */\n\nimport { useEffect, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { Button, IconApiOutline14, IconRefreshOutline14, Modal, StateDot } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CSS } from './css.ts'\nimport type { ImportedServerView, Translate } from './index.ts'\n\nexport interface McpRow {\n id: string\n serverName: string\n transport: 'stdio' | 'streamable-http'\n disabled: boolean\n command?: string\n args?: string[]\n env?: Record<string, string>\n cwd?: string\n url?: string\n headers?: Record<string, string>\n}\n\nexport interface McpInjected {\n list(): Promise<{ servers: McpRow[] }>\n save(input: Record<string, unknown>): Promise<{ ok: boolean; id: string }>\n toggle(id: string, disabled: boolean): Promise<{ ok: boolean }>\n remove(id: string): Promise<{ ok: boolean }>\n scanImport(): Promise<{ servers: ImportedServerView[]; existing: string[] }>\n applyImport(items: Array<{ agent: string; name: string }>): Promise<{ ok: boolean; results: Array<{ name: string; ok: boolean; error?: string }> }>\n restart(): Promise<void>\n desktop: boolean\n}\n\n/** Editor dialog state; null when closed. Textareas hold line-based values. */\ninterface EditorState {\n id: string\n serverName: string\n transport: 'stdio' | 'streamable-http'\n command: string\n args: string\n env: string\n url: string\n headers: string\n}\n\n/** One import entry together with its index in the flat state array \u2014\n * checkbox handlers rewrite the flat array, so indices must survive grouping. */\ntype ImportItem = { server: ImportedServerView; existing: boolean; checked: boolean }\n\n/** Group import candidates by source agent, known agents first. */\nexport function importGroups(items: ImportItem[]): Array<{ agent: string; label: string; items: Array<{ item: ImportItem; index: number }> }> {\n const label = (agent: string) => agent === 'claude-code' ? 'Claude Code' : agent === 'codex' ? 'Codex' : agent\n const order = ['claude-code', 'codex']\n const agents = [...new Set(items.map(item => item.server.agent))]\n .sort((a, b) => {\n const rank = (agent: string) => { const at = order.indexOf(agent); return at === -1 ? order.length : at }\n return rank(a) - rank(b) || a.localeCompare(b)\n })\n return agents.map(agent => ({\n agent,\n label: label(agent),\n items: items.map((item, index) => ({ item, index })).filter(({ item }) => item.server.agent === agent),\n }))\n}\n\n/** KEY=VALUE / KEY: VALUE lines to a map. */\nfunction parsePairs(text: string, separator: ':' | '='): Record<string, string> {\n const map: Record<string, string> = {}\n for (const line of text.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (trimmed === '' || trimmed.startsWith('#')) continue\n const at = trimmed.indexOf(separator)\n if (at <= 0) continue\n map[trimmed.slice(0, at).trim()] = trimmed.slice(at + 1).trim()\n }\n return map\n}\n\nfunction mapToPairs(map: Record<string, string> | undefined, separator: string): string {\n if (map === undefined) return ''\n return Object.entries(map).map(([key, value]) => `${key}${separator}${value.includes('\\n') ? JSON.stringify(value) : value}`).join('\\n')\n}\n\n/** YAML double-quoted scalar (JSON syntax is valid YAML); plain for simple ids. */\nfunction yamlScalar(value: string): string {\n return /^[A-Za-z0-9_./@-]+$/.test(value) ? value : JSON.stringify(value)\n}\n\n/** Shape the profile patch row exactly as the host would persist it (preview). */\nexport function mcpRowYaml(input: { serverName: string; transport: 'stdio' | 'streamable-http'; command?: string; args?: string[]; env?: Record<string, string>; url?: string; headers?: Record<string, string> }): string {\n const name = input.serverName.trim() === '' ? 'server-name' : input.serverName.trim()\n const lines = [\n '- insert:',\n ` - id: mcp-${name}`,\n \" name: '@deepseek-ai/dsh-mcp-client'\",\n ' config:',\n ` serverName: ${yamlScalar(name)}`,\n ` transport: ${input.transport}`,\n ]\n if (input.transport === 'stdio') {\n lines.push(` command: ${yamlScalar(input.command ?? '')}`)\n const args = input.args ?? []\n if (args.length > 0) {\n lines.push(' args:')\n for (const arg of args) lines.push(` - ${yamlScalar(arg)}`)\n }\n const env = input.env ?? {}\n if (Object.keys(env).length > 0) {\n lines.push(' env:')\n for (const [key, value] of Object.entries(env)) lines.push(` ${yamlScalar(key)}: ${yamlScalar(value)}`)\n }\n } else {\n lines.push(` url: ${yamlScalar(input.url ?? '')}`)\n const headers = input.headers ?? {}\n if (Object.keys(headers).length > 0) {\n lines.push(' headers:')\n for (const [key, value] of Object.entries(headers)) lines.push(` ${yamlScalar(key)}: ${yamlScalar(value)}`)\n }\n }\n return lines.join('\\n')\n}\n\n/** The equivalent mcpServers JSON a foreign config or docs page would show. */\nexport function mcpJsonExample(transport: 'stdio' | 'streamable-http'): string {\n const entry = transport === 'stdio'\n ? {\n command: 'npx',\n args: ['-y', '@example/mcp-server'],\n env: { API_KEY: 'value' },\n }\n : {\n type: 'http',\n url: 'https://example.com/mcp',\n headers: { Authorization: 'Bearer <token>' },\n }\n return JSON.stringify({ mcpServers: { 'server-name': entry } }, null, 2)\n}\n\n/** Fields parsed out of a pasted MCP JSON config (any common shape). */\nexport interface ParsedMcpJson {\n serverName?: string\n transport: 'stdio' | 'streamable-http'\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n}\n\n/** Parse one MCP server from pasted JSON: a bare entry, a dsh row, or a\n * `{\"mcpServers\": {\u2026}}` wrapper (first entry wins). Returns the reason on bad input. */\nexport function parseMcpJson(text: string): ParsedMcpJson | { error: string } {\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n return { error: 'not valid JSON' }\n }\n if (typeof parsed !== 'object' || parsed === null) return { error: 'expected a JSON object' }\n let record = parsed as Record<string, unknown>\n let nameFromWrapper: string | undefined\n const wrapped = record.mcpServers ?? record.mcp_servers ?? record.servers\n if (typeof wrapped === 'object' && wrapped !== null && !Array.isArray(wrapped)) {\n const first = Object.entries(wrapped as Record<string, unknown>)[0]\n if (first === undefined) return { error: 'mcpServers object is empty' }\n nameFromWrapper = first[0]\n if (typeof first[1] !== 'object' || first[1] === null) return { error: 'server entry is not an object' }\n record = first[1] as Record<string, unknown>\n }\n const stringMap = (value: unknown): Record<string, string> | undefined => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined\n const out: Record<string, string> = {}\n for (const [key, entry] of Object.entries(value)) {\n if (typeof entry === 'string') out[key] = entry\n }\n return Object.keys(out).length > 0 ? out : undefined\n }\n const args = Array.isArray(record.args) && record.args.every(entry => typeof entry === 'string')\n ? record.args as string[]\n : undefined\n const command = typeof record.command === 'string' ? record.command : undefined\n const url = typeof record.url === 'string' ? record.url : undefined\n const declared = typeof record.type === 'string' ? record.type : typeof record.transport === 'string' ? record.transport : undefined\n const httpDeclared = declared === 'http' || declared === 'streamable-http' || declared === 'sse'\n const transport: 'stdio' | 'streamable-http' = command !== undefined && !httpDeclared\n ? 'stdio'\n : url !== undefined ? 'streamable-http' : httpDeclared ? 'streamable-http' : 'stdio'\n if (transport === 'stdio' && command === undefined) return { error: 'stdio config needs a \"command\" field' }\n if (transport === 'streamable-http' && url === undefined) return { error: 'http config needs a \"url\" field' }\n const serverName = nameFromWrapper\n ?? (typeof record.serverName === 'string' ? record.serverName : undefined)\n ?? (typeof record.name === 'string' && record.name !== '@deepseek-ai/dsh-mcp-client' ? record.name : undefined)\n const env = stringMap(record.env)\n const headers = stringMap(record.headers)\n return {\n ...(serverName !== undefined ? { serverName } : {}),\n transport,\n ...(command !== undefined ? { command } : {}),\n ...(args !== undefined ? { args } : {}),\n ...(env !== undefined ? { env } : {}),\n ...(url !== undefined ? { url } : {}),\n ...(headers !== undefined ? { headers } : {}),\n }\n}\n\nexport function McpTab(props: { t: Translate; injected: McpInjected }): ReactElement {\n const { t, injected } = props\n const [servers, setServers] = useState<McpRow[] | null>(null)\n const [editor, setEditor] = useState<EditorState | null>(null)\n const [confirmId, setConfirmId] = useState<string | null>(null)\n const [importOpen, setImportOpen] = useState(false)\n const [importItems, setImportItems] = useState<Array<{ server: ImportedServerView; existing: boolean; checked: boolean }> | null>(null)\n const [busy, setBusy] = useState(false)\n const [pending, setPending] = useState(false)\n const [restartConfirm, setRestartConfirm] = useState(false)\n const [restarting, setRestarting] = useState(false)\n const [outcome, setOutcome] = useState<{ ok: boolean; text: string } | null>(null)\n const [formError, setFormError] = useState<string | null>(null)\n const [reload, setReload] = useState(0)\n const [pasteJson, setPasteJson] = useState('')\n const [pasteError, setPasteError] = useState<string | null>(null)\n\n const openImport = async (): Promise<void> => {\n setImportOpen(true)\n setImportItems(null)\n try {\n const body = await injected.scanImport()\n const existing = new Set(body.existing)\n setImportItems(body.servers.map(server => ({\n server,\n existing: existing.has(server.name),\n checked: !existing.has(server.name),\n })))\n } catch (error) {\n setImportItems([])\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n }\n }\n\n const doImport = async (): Promise<void> => {\n if (importItems === null) return\n const items = importItems.filter(item => item.checked && !item.existing).map(item => ({ agent: item.server.agent, name: item.server.name }))\n setBusy(true)\n try {\n const body = await injected.applyImport(items)\n const failed = body.results.filter(item => !item.ok)\n setOutcome(failed.length === 0\n ? { ok: true, text: t('restartNeeded') }\n : { ok: false, text: `${t('failed')}: ${failed.map(item => `${item.name} (${item.error})`).join(', ')}` })\n setImportOpen(false)\n setPending(true)\n setReload((value) => value + 1)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n }\n }\n\n const reloadList = (showPending: boolean): void => {\n setReload((value) => value + 1)\n if (showPending) setPending(true)\n }\n\n useEffect(() => {\n let current = true\n void injected.list().then(\n (body) => { if (current) setServers(body.servers) },\n (error: Error) => { if (current) { setServers([]); setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }) } },\n )\n return () => { current = false }\n }, [injected, reload, t])\n\n const openCreate = (): void => {\n setFormError(null)\n setPasteError(null)\n setPasteJson('')\n setEditor({ id: '', serverName: '', transport: 'stdio', command: '', args: '', env: '', url: '', headers: '' })\n }\n\n const openEdit = (row: McpRow): void => {\n setFormError(null)\n setPasteError(null)\n setPasteJson('')\n setEditor({\n id: row.id,\n serverName: row.serverName,\n transport: row.transport,\n command: row.command ?? '',\n args: (row.args ?? []).join('\\n'),\n env: mapToPairs(row.env, '='),\n url: row.url ?? '',\n headers: mapToPairs(row.headers, ':'),\n })\n }\n\n /** Fill the form from pasted JSON (mcpServers wrapper, bare entry, dsh row). */\n const doPasteFill = (): void => {\n if (editor === null || pasteJson.trim() === '') return\n const parsed = parseMcpJson(pasteJson)\n if ('error' in parsed) {\n setPasteError(parsed.error)\n return\n }\n // Existing rows keep their identity (serverName + transport); a pasted\n // config of the other transport cannot apply to them.\n const lockIdentity = editor.id !== ''\n if (lockIdentity && parsed.transport !== editor.transport) {\n setPasteError(t('pasteTransportMismatch'))\n return\n }\n setPasteError(null)\n setFormError(null)\n setEditor({\n ...editor,\n ...(parsed.serverName !== undefined && !lockIdentity ? { serverName: parsed.serverName } : {}),\n ...(!lockIdentity ? { transport: parsed.transport } : {}),\n ...(parsed.transport === 'stdio'\n ? {\n command: parsed.command ?? editor.command,\n args: (parsed.args ?? []).join('\\n'),\n env: mapToPairs(parsed.env, '='),\n }\n : {\n url: parsed.url ?? editor.url,\n headers: mapToPairs(parsed.headers, ':'),\n }),\n })\n }\n\n const doSave = async (): Promise<void> => {\n if (editor === null) return\n setBusy(true)\n setFormError(null)\n try {\n await injected.save({\n id: editor.id,\n serverName: editor.serverName.trim(),\n transport: editor.transport,\n ...(editor.transport === 'stdio'\n ? {\n command: editor.command.trim(),\n args: editor.args.split(/\\r?\\n/).map(line => line.trim()).filter(line => line !== ''),\n env: parsePairs(editor.env, '='),\n }\n : {\n url: editor.url.trim(),\n headers: parsePairs(editor.headers, ':'),\n }),\n })\n setEditor(null)\n setOutcome({ ok: true, text: t('restartNeeded') })\n reloadList(true)\n } catch (error) {\n setFormError(String(error instanceof Error ? error.message : error))\n } finally {\n setBusy(false)\n }\n }\n\n const doToggle = async (row: McpRow): Promise<void> => {\n setBusy(true)\n try {\n await injected.toggle(row.id, !row.disabled)\n setOutcome({ ok: true, text: t('restartNeeded') })\n reloadList(true)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n }\n }\n\n const doRemove = async (): Promise<void> => {\n if (confirmId === null) return\n setBusy(true)\n try {\n await injected.remove(confirmId)\n setOutcome({ ok: true, text: t('restartNeeded') })\n reloadList(true)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n setConfirmId(null)\n }\n }\n\n const doRestart = (): void => {\n setRestartConfirm(false)\n setRestarting(true)\n void injected.restart()\n // \u684C\u9762\u6A21\u5F0F\uFF1A\u58F3\u5C42\u91CD\u542F\u5B8C\u6210\u540E\u4F1A\u91CD\u8F7D\u7A97\u53E3\u3002\u72EC\u7ACB\u6A21\u5F0F\uFF1A\u8F6E\u8BE2\u672C\u6E90\uFF0C\u6062\u590D\u5373\u5237\u65B0\u3002\n if (injected.desktop) return\n const deadline = Date.now() + 60_000\n const poll = (): void => {\n if (Date.now() > deadline) return\n window.setTimeout(() => {\n void injected.list().then(\n () => { window.location.reload() },\n () => { poll() },\n )\n }, 1500)\n }\n window.setTimeout(poll, 3000)\n }\n\n const restartBanner = (\n <div className=\"dpc-banner\" data-kind=\"info\" role=\"status\">\n <StateDot state=\"ongoing\" size={10} />\n <div className=\"dpc-bannerBody\">\n <span>{restarting ? t('restarting') : t('restartNeeded')}</span>\n <span className=\"dpc-bannerHint\">\n {restarting\n ? (!injected.desktop && t('restartPortHint'))\n : injected.desktop\n ? <>{t('restartDesktopHint')}{' '}<Button variant=\"outline\" size=\"sm\" onClick={() => setRestartConfirm(true)}>{t('restartNow')}</Button></>\n : t('restartOtherHint')}\n </span>\n </div>\n </div>\n )\n\n return (\n <div className=\"dpc-section\">\n <style>{CSS}</style>\n\n <div className=\"dpc-head\">\n <IconApiOutline14 aria-hidden=\"true\" />\n <h3>{t('mcpTitle')}</h3>\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" size=\"sm\" disabled={restarting} onClick={() => setRestartConfirm(true)}>{t('restart')}</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void openImport()}>{t('importServers')}</Button>\n <Button variant=\"primary\" size=\"sm\" onClick={openCreate}>{t('addServer')}</Button>\n </div>\n <p className=\"dpc-intro\">{t('mcpIntro')}</p>\n\n {outcome !== null && (\n <div className=\"dpc-banner\" data-kind={outcome.ok ? 'ok' : 'error'} role=\"status\">\n <StateDot state={outcome.ok ? 'done' : 'error'} size={10} />\n <div className=\"dpc-bannerBody\"><span>{outcome.text}</span></div>\n </div>\n )}\n {(pending || restarting) && restartBanner}\n\n <div className=\"dpc-listHead\">\n <h3>{t('mcpTab')}</h3>\n {servers !== null && <span className=\"dpc-count\">{servers.length}</span>}\n <span className=\"dpc-spacer\" />\n <button type=\"button\" className=\"dpc-refresh\" aria-label={t('view')} title={t('view')} disabled={busy} onClick={() => setReload((value) => value + 1)}>\n <IconRefreshOutline14 size={14} aria-hidden=\"true\" />\n </button>\n </div>\n\n {servers === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {servers !== null && servers.length === 0 && <p className=\"dpc-empty\">{t('emptyMcp')}</p>}\n {servers !== null && servers.length > 0 && (\n <ul className=\"dpc-cards\">\n {servers.map((row) => (\n <li className=\"dpc-card\" key={row.id}>\n <div className=\"dpc-cardTop\">\n <strong className=\"dpc-cardTitle\" title={row.id}>{row.serverName}</strong>\n <span className=\"dpc-tag\">{row.transport}</span>\n <span className=\"dpc-tag\" data-kind={row.disabled ? 'off' : undefined}>{row.disabled ? t('disabled') : t('enabled')}</span>\n </div>\n <p className=\"dpc-cardDesc\">\n {row.transport === 'stdio' ? `${row.command ?? ''} ${(row.args ?? []).join(' ')}` : row.url ?? ''}\n </p>\n <div className=\"dpc-cardRow\">\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => void doToggle(row)}>{t('toggle')}</Button>\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => openEdit(row)}>{t('edit')}</Button>\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => setConfirmId(row.id)}>{t('delete')}</Button>\n </div>\n </li>\n ))}\n </ul>\n )}\n\n <Modal\n open={editor !== null}\n onClose={() => setEditor(null)}\n title={editor !== null && editor.id !== '' ? t('editServer') : t('addServer')}\n className=\"dpc-modalForm\"\n contentClassName=\"dpc-modalScroll\"\n >\n {editor !== null && (\n <div className=\"dpc-form\">\n <label className=\"dpc-label\">\n <span>{t('serverName')}</span>\n <input\n className=\"dpc-input\"\n value={editor.serverName}\n disabled={editor.id !== ''}\n onChange={(event) => setEditor({ ...editor, serverName: event.target.value })}\n />\n </label>\n <label className=\"dpc-label\">\n <span>{t('transport')}</span>\n <select\n className=\"dpc-select\"\n value={editor.transport}\n disabled={editor.id !== ''}\n onChange={(event) => setEditor({ ...editor, transport: event.target.value as EditorState['transport'] })}\n >\n <option value=\"stdio\">{t('transportStdio')}</option>\n <option value=\"streamable-http\">{t('transportHttp')}</option>\n </select>\n </label>\n {editor.transport === 'stdio' ? (\n <>\n <label className=\"dpc-label\">\n <span>{t('command')}</span>\n <input className=\"dpc-input\" value={editor.command} onChange={(event) => setEditor({ ...editor, command: event.target.value })} />\n </label>\n <label className=\"dpc-label\">\n <span>{t('args')}</span>\n <textarea className=\"dpc-textarea\" data-short=\"true\" value={editor.args} onChange={(event) => setEditor({ ...editor, args: event.target.value })} />\n </label>\n <label className=\"dpc-label\">\n <span>{t('envPairs')}</span>\n <textarea className=\"dpc-textarea\" data-short=\"true\" value={editor.env} onChange={(event) => setEditor({ ...editor, env: event.target.value })} />\n </label>\n </>\n ) : (\n <>\n <label className=\"dpc-label\">\n <span>{t('url')}</span>\n <input className=\"dpc-input\" value={editor.url} onChange={(event) => setEditor({ ...editor, url: event.target.value })} />\n </label>\n <label className=\"dpc-label\">\n <span>{t('headersPairs')}</span>\n <textarea className=\"dpc-textarea\" data-short=\"true\" value={editor.headers} onChange={(event) => setEditor({ ...editor, headers: event.target.value })} />\n </label>\n </>\n )}\n <details className=\"dpc-format\">\n <summary>{t('formatTitle')}</summary>\n <div className=\"dpc-form\">\n <label className=\"dpc-label\">\n <span>{t('formatPaste')}</span>\n <textarea\n className=\"dpc-textarea\"\n data-short=\"true\"\n placeholder={'{\\n \"mcpServers\": { \"name\": { \"command\": \"npx\", \"args\": [\"\u2026\"] } } }\\n'}\n value={pasteJson}\n onChange={(event) => setPasteJson(event.target.value)}\n />\n </label>\n {pasteError !== null && <p className=\"dpc-formError\">{pasteError}</p>}\n <div className=\"dpc-cardRow\">\n <Button variant=\"outline\" size=\"sm\" disabled={pasteJson.trim() === ''} onClick={doPasteFill}>{t('formatFill')}</Button>\n </div>\n <p className=\"dpc-formatHint\">{t('formatYamlHint')}</p>\n <pre className=\"dpc-code\">{mcpRowYaml({\n serverName: editor.serverName,\n transport: editor.transport,\n ...(editor.transport === 'stdio'\n ? {\n command: editor.command.trim(),\n args: editor.args.split(/\\r?\\n/).map(line => line.trim()).filter(line => line !== ''),\n env: parsePairs(editor.env, '='),\n }\n : {\n url: editor.url.trim(),\n headers: parsePairs(editor.headers, ':'),\n }),\n })}</pre>\n <p className=\"dpc-formatHint\">{t('formatJsonHint')}</p>\n <pre className=\"dpc-code\">{mcpJsonExample(editor.transport)}</pre>\n </div>\n </details>\n {formError !== null && <p className=\"dpc-formError\">{formError}</p>}\n <div className=\"dpc-cardRow\">\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" onClick={() => setEditor(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={busy} onClick={() => void doSave()}>{t('save')}</Button>\n </div>\n </div>\n )}\n </Modal>\n\n <Modal\n open={confirmId !== null}\n onClose={() => setConfirmId(null)}\n title={t('confirmRemove')}\n description={confirmId ?? undefined}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setConfirmId(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={busy} onClick={() => void doRemove()}>{t('delete')}</Button>\n </>\n }\n >\n <p>{t('removeWarn')}</p>\n </Modal>\n\n <Modal\n open={restartConfirm}\n onClose={() => setRestartConfirm(false)}\n title={t('restartConfirmTitle')}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setRestartConfirm(false)}>{t('cancel')}</Button>\n <Button variant=\"primary\" onClick={doRestart}>{t('restartNow')}</Button>\n </>\n }\n >\n <p>{t('restartConfirmBody')}</p>\n </Modal>\n\n <Modal\n open={importOpen}\n onClose={() => setImportOpen(false)}\n title={t('importServers')}\n className=\"dpc-modalWide\"\n >\n <div className=\"dpc-form\">\n <p className=\"dpc-intro\" style={{ margin: 0 }}>{t('importIntro')}</p>\n {importItems === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {importItems !== null && importItems.length === 0 && <p className=\"dpc-empty\">{t('importEmpty')}</p>}\n {importItems !== null && importItems.length > 0 && (\n <div className=\"dpc-importScroll\">\n {importGroups(importItems).map(group => {\n const selectable = group.items\n .filter(({ item }) => !item.existing)\n .map(({ index }) => index)\n const allChecked = selectable.length > 0\n && selectable.every(index => importItems[index].checked)\n return (\n <section className=\"dpc-importGroup\" key={group.agent}>\n <div className=\"dpc-importHead\">\n <span className=\"dpc-tag\" data-kind=\"source\">{group.label}</span>\n <span className=\"dpc-importCount\">{group.items.length}</span>\n {selectable.length > 0 && (\n <label className=\"dpc-importAll\">\n <input\n type=\"checkbox\"\n checked={allChecked}\n onChange={(event) => {\n const next = importItems.slice()\n for (const index of selectable) next[index] = { ...next[index], checked: event.target.checked }\n setImportItems(next)\n }}\n />\n {t('importSelectAll')}\n </label>\n )}\n </div>\n <ul className=\"dpc-cards\" style={{ gridTemplateColumns: 'minmax(0, 1fr)' }}>\n {group.items.map(({ item, index }) => {\n const command = item.server.transport === 'stdio'\n ? `${item.server.command ?? ''} ${(item.server.args ?? []).join(' ')}`.trim()\n : item.server.url ?? ''\n return (\n <li className=\"dpc-card\" key={`${item.server.agent}/${item.server.name}`} style={{ opacity: item.existing ? 0.55 : 1 }}>\n <div className=\"dpc-cardTop\">\n <label style={{ display: 'inline-flex', alignItems: 'center', gap: 8, minWidth: 0, cursor: item.existing ? 'default' : 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={item.checked}\n disabled={item.existing}\n onChange={(event) => {\n const next = importItems.slice()\n next[index] = { ...item, checked: event.target.checked }\n setImportItems(next)\n }}\n />\n <strong className=\"dpc-cardTitle\" title={item.server.name}>{item.server.name}</strong>\n </label>\n <span className=\"dpc-tag\">{item.server.transport}</span>\n {item.existing && <span className=\"dpc-tag\">{t('importExisting')}</span>}\n </div>\n <p className=\"dpc-cardDesc\" title={command}>{command}</p>\n </li>\n )\n })}\n </ul>\n </section>\n )\n })}\n </div>\n )}\n {formError !== null && <p className=\"dpc-formError\">{formError}</p>}\n <div className=\"dpc-cardRow\">\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" onClick={() => setImportOpen(false)}>{t('cancel')}</Button>\n <Button\n variant=\"primary\"\n disabled={busy || importItems === null || !importItems.some(item => item.checked && !item.existing)}\n onClick={() => void doImport()}\n >\n {t('importSelected')}\n </Button>\n </div>\n </div>\n </Modal>\n </div>\n )\n}\n", "/** Settings \u201C\u6280\u80FD\u201D tab: view the discovered catalog, edit the user-owned\n * root, toggle skills on/off, open their folders, and manage the custom\n * skill repositories (local paths and GitHub checkouts) feeding the catalog.\n * Pure presentation-layer \u2014 data arrives through props. */\n\nimport { useEffect, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { Button, IconRefreshOutline14, IconSkillOutline16, MarkdownText, Modal, StateDot } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CSS } from './css.ts'\nimport type { OpenTarget, Translate } from './index.ts'\nimport type { RootRowView } from './MarketTab.tsx'\n\n/** One skill as the host reports it (plus the flags the route adds). */\nexport interface SkillRowView {\n name: string\n description: string\n whenToUse?: string\n invocation: { modelInvocable: boolean; userInvocable: boolean }\n source: string\n provider: string\n editable: boolean\n /** The skill's folder when it lives on disk (drives open-folder). */\n dir?: string\n /** File-backed skills can be enabled/disabled through the policy route. */\n policyEditable: boolean\n}\n\nexport interface SkillsInjected {\n list(): Promise<{ skills: SkillRowView[] }>\n get(name: string): Promise<{ content: string }>\n save(input: { name: string; description: string; whenToUse?: string; modelInvocable: boolean; userInvocable: boolean; content: string }): Promise<{ ok: boolean }>\n remove(name: string): Promise<{ ok: boolean }>\n policy(name: string, enabled: boolean): Promise<{ ok: boolean }>\n open(target: OpenTarget): Promise<{ ok: boolean }>\n roots(): Promise<{ roots: RootRowView[] }>\n addRoot(input: { kind: 'local' | 'git'; path?: string; url?: string }): Promise<{ ok: boolean; root: RootRowView }>\n removeRoot(id: string): Promise<{ ok: boolean }>\n}\n\n/** Editor dialog state; null when closed. */\ninterface EditorState {\n mode: 'create' | 'edit' | 'view'\n name: string\n description: string\n whenToUse: string\n modelInvocable: boolean\n userInvocable: boolean\n content: string\n}\n\nconst SOURCE_KEYS: Record<string, string> = {\n 'project-dsh': 'sourceProjectDsh',\n 'project-agents': 'sourceProjectAgents',\n 'user-dsh': 'sourceUserDsh',\n 'user-agents': 'sourceUserAgents',\n runtime: 'sourceRuntime',\n bundled: 'sourceBundled',\n custom: 'sourceCustom',\n}\n\n/** Status tag for the invocation policy; undefined = default (both allowed). */\nfunction policyTag(skill: SkillRowView): { key?: string; off: boolean } {\n const { modelInvocable, userInvocable } = skill.invocation\n if (!modelInvocable && !userInvocable) return { key: 'skillDisabled', off: true }\n if (!modelInvocable) return { key: 'skillUserOnly', off: false }\n if (!userInvocable) return { key: 'skillModelOnly', off: false }\n return { off: false }\n}\n\n/** Add-repository form state; null when the form is collapsed. */\ninterface AddRootState {\n kind: 'local' | 'git'\n value: string\n}\n\nexport function SkillsTab(props: { t: Translate; injected: SkillsInjected }): ReactElement {\n const { t, injected } = props\n const [skills, setSkills] = useState<SkillRowView[] | null>(null)\n const [editor, setEditor] = useState<EditorState | null>(null)\n /** Content pane of the editor modal: rendered Markdown vs the raw editor. */\n const [preview, setPreview] = useState(false)\n const [confirmName, setConfirmName] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const [outcome, setOutcome] = useState<{ ok: boolean; text: string } | null>(null)\n const [formError, setFormError] = useState<string | null>(null)\n const [reload, setReload] = useState(0)\n const [query, setQuery] = useState('')\n const [sourceFilter, setSourceFilter] = useState<string>('all')\n\n // Custom skill repositories.\n const [roots, setRoots] = useState<RootRowView[] | null>(null)\n const [addRoot, setAddRoot] = useState<AddRootState | null>(null)\n const [rootBusy, setRootBusy] = useState(false)\n const [confirmRootId, setConfirmRootId] = useState<string | null>(null)\n\n useEffect(() => {\n let current = true\n void injected.list().then(\n (body) => { if (current) setSkills(body.skills) },\n (error: Error) => { if (current) { setSkills([]); setOutcome({ ok: false, text: `${t('failed')}: ${String(error.message ?? error)}` }) } },\n )\n void injected.roots().then(\n (body) => { if (current) setRoots(body.roots) },\n () => { if (current) setRoots([]) },\n )\n return () => { current = false }\n }, [injected, reload, t])\n\n const openCreate = (): void => {\n setFormError(null)\n setPreview(false)\n setEditor({ mode: 'create', name: '', description: '', whenToUse: '', modelInvocable: true, userInvocable: true, content: '' })\n }\n\n const openExisting = async (skill: SkillRowView): Promise<void> => {\n setBusy(true)\n setFormError(null)\n try {\n const body = await injected.get(skill.name)\n // Read-only sources open on the rendered preview; editable ones on the\n // plain-text editor. The toggle in the content row flips either way.\n setPreview(!skill.editable)\n setEditor({\n mode: skill.editable ? 'edit' : 'view',\n name: skill.name,\n description: skill.description,\n whenToUse: skill.whenToUse ?? '',\n modelInvocable: skill.invocation.modelInvocable,\n userInvocable: skill.invocation.userInvocable,\n content: body.content,\n })\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n }\n }\n\n /**\n * After a write/delete, the watched directory takes a moment to invalidate\n * the catalog \u2014 poll until the change is visible (bounded), then stop.\n */\n const refreshUntil = (predicate: (skills: SkillRowView[]) => boolean, timeoutMs = 10_000): void => {\n const deadline = Date.now() + timeoutMs\n const tick = (): void => {\n if (Date.now() > deadline) return\n setTimeout(() => {\n void injected.list().then(\n (body) => {\n setSkills(body.skills)\n if (!predicate(body.skills)) tick()\n },\n () => tick(),\n )\n }, 1000)\n }\n tick()\n }\n\n const doSave = async (): Promise<void> => {\n if (editor === null) return\n setBusy(true)\n setFormError(null)\n try {\n const name = editor.name.trim()\n await injected.save({\n name,\n description: editor.description,\n whenToUse: editor.whenToUse.trim() === '' ? undefined : editor.whenToUse,\n modelInvocable: editor.modelInvocable,\n userInvocable: editor.userInvocable,\n content: editor.content,\n })\n setOutcome({ ok: true, text: t('saved') })\n setEditor(null)\n refreshUntil(skills => skills.some(skill => skill.name === name))\n } catch (error) {\n setFormError(String(error instanceof Error ? error.message : error))\n } finally {\n setBusy(false)\n }\n }\n\n const doDelete = async (): Promise<void> => {\n if (confirmName === null) return\n const name = confirmName\n setBusy(true)\n try {\n await injected.remove(name)\n setOutcome({ ok: true, text: t('saved') })\n refreshUntil(skills => !skills.some(skill => skill.name === name))\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n setConfirmName(null)\n }\n }\n\n const doToggle = async (skill: SkillRowView): Promise<void> => {\n const enabled = skill.invocation.modelInvocable || skill.invocation.userInvocable\n setBusy(true)\n try {\n await injected.policy(skill.name, !enabled)\n setOutcome({ ok: true, text: !enabled ? t('skillEnabled') : t('skillDisabledMsg') })\n refreshUntil(list => {\n const row = list.find(item => item.name === skill.name)\n return row !== undefined && row.invocation.modelInvocable === !enabled && row.invocation.userInvocable === !enabled\n })\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setBusy(false)\n }\n }\n\n const doOpen = async (target: OpenTarget): Promise<void> => {\n try {\n await injected.open(target)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n }\n }\n\n const doAddRoot = async (): Promise<void> => {\n if (addRoot === null || addRoot.value.trim() === '') return\n setRootBusy(true)\n setFormError(null)\n try {\n await injected.addRoot(addRoot.kind === 'local'\n ? { kind: 'local', path: addRoot.value.trim() }\n : { kind: 'git', url: addRoot.value.trim() })\n setOutcome({ ok: true, text: t('rootAdded') })\n setAddRoot(null)\n void injected.roots().then(\n (body) => setRoots(body.roots),\n () => setRoots([]),\n )\n // The provider remounts asynchronously; refresh the catalog a few\n // times so the repository's skills appear without manual reload.\n for (let tick = 0; tick < 4; tick++) {\n await new Promise(resolve => setTimeout(resolve, 1500))\n void injected.list().then(\n (body) => setSkills(body.skills),\n () => undefined,\n )\n }\n } catch (error) {\n setFormError(String(error instanceof Error ? error.message : error))\n } finally {\n setRootBusy(false)\n }\n }\n\n const doRemoveRoot = async (): Promise<void> => {\n if (confirmRootId === null) return\n setRootBusy(true)\n try {\n await injected.removeRoot(confirmRootId)\n setOutcome({ ok: true, text: t('rootRemoved') })\n setRoots(null)\n void injected.roots().then(\n (body) => setRoots(body.roots),\n () => setRoots([]),\n )\n setReload((value) => value + 1)\n } catch (error) {\n setOutcome({ ok: false, text: `${t('failed')}: ${String(error instanceof Error ? error.message : error)}` })\n } finally {\n setRootBusy(false)\n setConfirmRootId(null)\n }\n }\n\n const readOnly = editor?.mode === 'view'\n\n const needle = query.trim().toLowerCase()\n const filtered = skills === null ? [] : skills.filter(skill =>\n (sourceFilter === 'all' || skill.source === sourceFilter)\n && (needle === '' || skill.name.toLowerCase().includes(needle) || skill.description.toLowerCase().includes(needle)))\n const sources = skills === null ? [] : [...new Set(skills.map(skill => skill.source))]\n\n return (\n <div className=\"dpc-section\">\n <style>{CSS}</style>\n\n <div className=\"dpc-head\">\n <IconSkillOutline16 aria-hidden=\"true\" />\n <h3>{t('skillsTitle')}</h3>\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void doOpen({ target: 'user-skills' })}>{t('openUserSkills')}</Button>\n <Button variant=\"primary\" size=\"sm\" onClick={openCreate}>{t('newSkill')}</Button>\n </div>\n <p className=\"dpc-intro\">{t('skillsIntro')}</p>\n\n {outcome !== null && (\n <div className=\"dpc-banner\" data-kind={outcome.ok ? 'ok' : 'error'} role=\"status\">\n <StateDot state={outcome.ok ? 'done' : 'error'} size={10} />\n <div className=\"dpc-bannerBody\"><span>{outcome.text}</span></div>\n </div>\n )}\n\n <div className=\"dpc-listHead\">\n <h3>{t('skillsTab')}</h3>\n {skills !== null && <span className=\"dpc-count\">{filtered.length}/{skills.length}</span>}\n <span className=\"dpc-spacer\" />\n <input\n className=\"dpc-search\"\n type=\"search\"\n placeholder={t('searchSkills')}\n aria-label={t('searchSkills')}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n <button type=\"button\" className=\"dpc-refresh\" aria-label={t('refresh')} title={t('refresh')} disabled={busy} onClick={() => setReload((value) => value + 1)}>\n <IconRefreshOutline14 size={14} aria-hidden=\"true\" />\n </button>\n </div>\n\n {sources.length > 1 && (\n <div className=\"dpc-chips\" role=\"group\" aria-label={t('source')}>\n {[{ id: 'all', label: t('filterAll') }, ...sources.map(source => ({ id: source, label: t(SOURCE_KEYS[source] ?? 'sourceCustom') }))].map(chip => (\n <button\n key={chip.id}\n type=\"button\"\n className=\"dpc-chip\"\n data-active={sourceFilter === chip.id ? 'true' : undefined}\n onClick={() => setSourceFilter(chip.id)}\n >\n {chip.label}\n </button>\n ))}\n </div>\n )}\n\n {skills === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {skills !== null && filtered.length === 0 && <p className=\"dpc-empty\">{skills.length === 0 ? t('emptySkills') : t('noMatch')}</p>}\n {skills !== null && filtered.length > 0 && (\n <ul className=\"dpc-cards\">\n {filtered.map((skill) => {\n const tag = policyTag(skill)\n return (\n <li className=\"dpc-card\" key={`${skill.source}/${skill.name}`}>\n <div className=\"dpc-cardTop\">\n <strong className=\"dpc-cardTitle\" title={skill.name}>{skill.name}</strong>\n <span className=\"dpc-tag\" data-kind=\"source\">{t(SOURCE_KEYS[skill.source] ?? 'sourceCustom')}</span>\n {tag.key !== undefined && <span className=\"dpc-tag\" data-kind={tag.off ? 'off' : undefined}>{t(tag.key)}</span>}\n </div>\n <p className=\"dpc-cardDesc\" title={skill.description}>{skill.description}</p>\n <div className=\"dpc-cardRow\">\n {skill.policyEditable && (\n <button\n type=\"button\"\n className=\"dpc-switch\"\n role=\"switch\"\n aria-checked={skill.invocation.modelInvocable || skill.invocation.userInvocable}\n aria-label={t('toggleSkill')}\n title={t('toggleSkillHint')}\n disabled={busy}\n onClick={() => void doToggle(skill)}\n >\n <span className=\"dpc-switchKnob\" />\n </button>\n )}\n {skill.dir !== undefined && (\n <button type=\"button\" className=\"dpc-link\" onClick={() => void doOpen({ target: 'skill', name: skill.name })}>{t('openFolder')}</button>\n )}\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => void openExisting(skill)}>\n {skill.editable ? t('edit') : t('view')}\n </Button>\n {skill.editable && (\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => setConfirmName(skill.name)}>{t('delete')}</Button>\n )}\n </div>\n </li>\n )\n })}\n </ul>\n )}\n\n <div className=\"dpc-listHead dpc-rootsHead\">\n <h3>{t('rootsTitle')}</h3>\n {roots !== null && <span className=\"dpc-count\">{roots.length}</span>}\n <span className=\"dpc-spacer\" />\n {addRoot === null && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setAddRoot({ kind: 'git', value: '' })}>{t('addRoot')}</Button>\n )}\n </div>\n <p className=\"dpc-intro\">{t('rootsIntro')}</p>\n {roots === null && <p className=\"dpc-empty\">{t('loading')}</p>}\n {roots !== null && roots.length === 0 && <p className=\"dpc-empty\">{t('emptyRoots')}</p>}\n {roots !== null && roots.length > 0 && (\n <ul className=\"dpc-roots\">\n {roots.map((root) => (\n <li className=\"dpc-root\" key={root.id}>\n <span className=\"dpc-tag\" data-kind=\"source\">{root.kind === 'git' ? 'GitHub' : t('rootLocal')}</span>\n <strong className=\"dpc-rootLabel\" title={root.kind === 'git' ? root.url : root.path}>{root.label}</strong>\n <span className=\"dpc-rootPath\">{root.kind === 'git' ? root.url : root.path}</span>\n {!root.live && <span className=\"dpc-tag\" data-kind=\"off\">{t('rootStale')}</span>}\n <span className=\"dpc-spacer\" />\n <button type=\"button\" className=\"dpc-link\" onClick={() => void doOpen({ target: 'root', id: root.id })}>{t('openFolder')}</button>\n <Button variant=\"ghost\" size=\"sm\" disabled={rootBusy} onClick={() => setConfirmRootId(root.id)}>{t('delete')}</Button>\n </li>\n ))}\n </ul>\n )}\n {addRoot !== null && (\n <div className=\"dpc-form dpc-addRoot\">\n <div className=\"dpc-addRootRow\">\n <select\n className=\"dpc-select\"\n aria-label={t('rootKind')}\n value={addRoot.kind}\n onChange={(event) => setAddRoot({ ...addRoot, kind: event.target.value as AddRootState['kind'] })}\n >\n <option value=\"git\">GitHub</option>\n <option value=\"local\">{t('rootLocal')}</option>\n </select>\n <input\n className=\"dpc-input\"\n type=\"text\"\n placeholder={addRoot.kind === 'git' ? 'https://github.com/anthropics/skills' : t('rootLocalPlaceholder')}\n aria-label={t('rootPlaceholder')}\n value={addRoot.value}\n autoFocus\n onChange={(event) => setAddRoot({ ...addRoot, value: event.target.value })}\n onKeyDown={(event) => { if (event.key === 'Enter') void doAddRoot() }}\n />\n <Button variant=\"primary\" size=\"sm\" disabled={rootBusy || addRoot.value.trim() === ''} onClick={() => void doAddRoot()}>{t('add')}</Button>\n <Button variant=\"ghost\" size=\"sm\" disabled={rootBusy} onClick={() => { setAddRoot(null); setFormError(null) }}>{t('cancel')}</Button>\n </div>\n <p className=\"dpc-intro\">{addRoot.kind === 'git' ? t('rootGitHint') : t('rootLocalHint')}</p>\n {formError !== null && <p className=\"dpc-formError\">{formError}</p>}\n </div>\n )}\n\n <Modal\n open={editor !== null}\n onClose={() => setEditor(null)}\n title={editor === null ? '' : editor.mode === 'create' ? t('newSkill') : editor.mode === 'edit' ? t('editSkill') : t('viewSkill')}\n className=\"dpc-modalForm\"\n contentClassName=\"dpc-modalScroll\"\n >\n {editor !== null && (\n <div className=\"dpc-form\">\n <label className=\"dpc-label\">\n <span>{t('skillName')}</span>\n <input\n className=\"dpc-input\"\n value={editor.name}\n disabled={readOnly || editor.mode === 'edit'}\n onChange={(event) => setEditor({ ...editor, name: event.target.value })}\n />\n </label>\n <label className=\"dpc-label\">\n <span>{t('skillDescription')}</span>\n <input\n className=\"dpc-input\"\n value={editor.description}\n disabled={readOnly}\n onChange={(event) => setEditor({ ...editor, description: event.target.value })}\n />\n </label>\n <label className=\"dpc-label\">\n <span>{t('skillWhenToUse')}</span>\n <input\n className=\"dpc-input\"\n value={editor.whenToUse}\n disabled={readOnly}\n onChange={(event) => setEditor({ ...editor, whenToUse: event.target.value })}\n />\n </label>\n <div className=\"dpc-checks\">\n <label>\n <input\n type=\"checkbox\"\n checked={editor.modelInvocable}\n disabled={readOnly}\n onChange={(event) => setEditor({ ...editor, modelInvocable: event.target.checked })}\n />\n {t('modelInvocable')}\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={editor.userInvocable}\n disabled={readOnly}\n onChange={(event) => setEditor({ ...editor, userInvocable: event.target.checked })}\n />\n {t('userInvocable')}\n </label>\n </div>\n <div className=\"dpc-label\">\n <div className=\"dpc-cardRow\">\n <span>{t('skillContent')}</span>\n <span className=\"dpc-spacer\" />\n <div className=\"dpc-segments\" role=\"tablist\" aria-label={t('skillContent')}>\n <button type=\"button\" role=\"tab\" aria-selected={preview} className=\"dpc-segment\" data-active={preview ? 'true' : undefined} onClick={() => setPreview(true)}>\n {t('skillPreview')}\n </button>\n <button type=\"button\" role=\"tab\" aria-selected={!preview} className=\"dpc-segment\" data-active={!preview ? 'true' : undefined} onClick={() => setPreview(false)}>\n {readOnly ? t('skillPlainText') : t('edit')}\n </button>\n </div>\n </div>\n {preview\n ? (typeof MarkdownText === 'function'\n ? <div className=\"dpc-mdPreview\"><MarkdownText text={editor.content} /></div>\n : <textarea className=\"dpc-textarea\" value={editor.content} readOnly />)\n : (\n <textarea\n className=\"dpc-textarea\"\n value={editor.content}\n readOnly={readOnly}\n onChange={(event) => setEditor({ ...editor, content: event.target.value })}\n />\n )}\n </div>\n {formError !== null && <p className=\"dpc-formError\">{formError}</p>}\n <div className=\"dpc-cardRow\">\n <span className=\"dpc-spacer\" />\n <Button variant=\"ghost\" onClick={() => setEditor(null)}>{readOnly ? t('close') : t('cancel')}</Button>\n {!readOnly && <Button variant=\"primary\" disabled={busy} onClick={() => void doSave()}>{t('save')}</Button>}\n </div>\n </div>\n )}\n </Modal>\n\n <Modal\n open={confirmName !== null}\n onClose={() => setConfirmName(null)}\n title={t('confirmDelete')}\n description={confirmName ?? undefined}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setConfirmName(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={busy} onClick={() => void doDelete()}>{t('delete')}</Button>\n </>\n }\n >\n <p>{t('deleteWarn')}</p>\n </Modal>\n\n <Modal\n open={confirmRootId !== null}\n onClose={() => setConfirmRootId(null)}\n title={t('confirmRemoveRoot')}\n description={roots?.find(root => root.id === confirmRootId)?.label ?? undefined}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setConfirmRootId(null)}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={rootBusy} onClick={() => void doRemoveRoot()}>{t('delete')}</Button>\n </>\n }\n >\n <p>{t('removeRootWarn')}</p>\n </Modal>\n </div>\n )\n}\n", "/** zh/en dictionaries for the Settings capabilities tabs. */\n\nexport const zh = {\n sectionNav: '\u6280\u80FD\u4E0E MCP',\n skillsTab: '\u6280\u80FD',\n mcpTab: 'MCP',\n marketTab: '\u5E02\u573A',\n skillsTitle: '\u6280\u80FD\u7BA1\u7406',\n skillsIntro: '\u67E5\u770B\u4E0E\u7F16\u8F91 dsh \u53D1\u73B0\u7684\u6280\u80FD\uFF1B\u7528\u6237\u7EA7\u6280\u80FD\uFF08DSH_HOME/skills\uFF09\u53EF\u5728\u6B64\u65B0\u5EFA\u3001\u4FEE\u6539\u3001\u5220\u9664\uFF0C\u6587\u4EF6\u88AB\u76D1\u542C\uFF0C\u4FDD\u5B58\u5373\u751F\u6548\u3002\u82E5\u5B58\u5728 ~/.claude/skills \u6216 ~/.codex/skills\uFF0C\u4F1A\u81EA\u52A8\u7EB3\u5165\u626B\u63CF\uFF08\u96F6\u62F7\u8D1D\u3001\u5B9E\u65F6\u540C\u6B65\uFF09\u3002\u5361\u7247\u4E0A\u7684\u5F00\u5173\u63A7\u5236\u662F\u5426\u52A0\u8F7D\uFF1A\u505C\u7528\u5373\u4ECE\u6A21\u578B\u4E0E\u7528\u6237\u76EE\u5F55\u540C\u65F6\u6458\u9664\uFF0C\u5F00\u542F\u6062\u590D\u9ED8\u8BA4\u3002',\n newSkill: '\u65B0\u5EFA\u6280\u80FD',\n editSkill: '\u7F16\u8F91\u6280\u80FD',\n viewSkill: '\u67E5\u770B\u6280\u80FD',\n skillName: '\u540D\u79F0\uFF08kebab-case\uFF09',\n skillDescription: '\u63CF\u8FF0',\n skillWhenToUse: '\u4F7F\u7528\u65F6\u673A\uFF08\u53EF\u9009\uFF09',\n skillContent: '\u6B63\u6587\uFF08Markdown\uFF09',\n skillPreview: 'Markdown \u9884\u89C8',\n skillPlainText: '\u7EAF\u6587\u672C',\n modelInvocable: '\u5141\u8BB8\u6A21\u578B\u8C03\u7528',\n userInvocable: '\u5141\u8BB8\u7528\u6237 / \u8C03\u7528',\n save: '\u4FDD\u5B58',\n cancel: '\u53D6\u6D88',\n delete: '\u5220\u9664',\n edit: '\u7F16\u8F91',\n view: '\u67E5\u770B',\n close: '\u5173\u95ED',\n emptySkills: '\u8FD8\u6CA1\u6709\u53D1\u73B0\u4EFB\u4F55\u6280\u80FD',\n loading: '\u8F7D\u5165\u4E2D\u2026',\n source: '\u6765\u6E90',\n sourceProjectDsh: '\u9879\u76EE',\n sourceProjectAgents: '\u9879\u76EE',\n sourceUserDsh: '\u7528\u6237',\n sourceUserAgents: '\u7528\u6237',\n sourceRuntime: '\u8FD0\u884C\u65F6',\n sourceBundled: '\u5185\u7F6E',\n sourceCustom: '\u81EA\u5B9A\u4E49',\n readOnly: '\u53EA\u8BFB',\n confirmDelete: '\u786E\u8BA4\u5220\u9664\u6280\u80FD\uFF1F',\n deleteWarn: '\u5C06\u5220\u9664 DSH_HOME/skills \u4E0B\u7684\u6574\u4E2A\u6280\u80FD\u76EE\u5F55\uFF0C\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\u3002',\n saved: '\u5DF2\u4FDD\u5B58\uFF0C\u6280\u80FD\u76EE\u5F55\u88AB\u76D1\u542C\uFF0C\u7A0D\u5019\u5373\u53EF\u5728\u4F1A\u8BDD\u4E2D\u4F7F\u7528\u3002',\n searchSkills: '\u641C\u7D22\u6280\u80FD\u540D\u79F0\u6216\u63CF\u8FF0',\n filterAll: '\u5168\u90E8',\n noMatch: '\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD',\n refresh: '\u5237\u65B0',\n skillDisabled: '\u5DF2\u505C\u7528',\n skillUserOnly: '\u4EC5\u7528\u6237\u53EF\u7528',\n skillModelOnly: '\u4EC5\u6A21\u578B\u53EF\u7528',\n skillEnabled: '\u5DF2\u542F\u7528\uFF0C\u7A0D\u5019\u5728\u5217\u8868\u4E2D\u751F\u6548\u3002',\n skillDisabledMsg: '\u5DF2\u505C\u7528\uFF1A\u6A21\u578B\u4E0E / \u547D\u4EE4\u90FD\u4E0D\u4F1A\u518D\u52A0\u8F7D\u5B83\u3002',\n toggleSkill: '\u5207\u6362\u6280\u80FD\u52A0\u8F7D',\n toggleSkillHint: '\u505C\u7528\u4F1A\u5728\u8BE5\u6280\u80FD\u7684 SKILL.md \u91CC\u5199\u5165 disable-model-invocation \u4E0E user-invocable\uFF0C\u540C\u65F6\u4ECE\u6A21\u578B\u4E0E\u7528\u6237\u76EE\u5F55\u6458\u9664\uFF1B\u5F00\u542F\u5219\u6062\u590D\u9ED8\u8BA4\u7B56\u7565\u3002\u6587\u4EF6\u5176\u4F59\u5185\u5BB9\u4E0D\u53D8\u3002',\n openFolder: '\u6253\u5F00\u76EE\u5F55',\n openUserSkills: '\u6253\u5F00\u6280\u80FD\u76EE\u5F55',\n rootsTitle: '\u6280\u80FD\u4ED3\u5E93',\n rootsIntro: '\u624B\u52A8\u6DFB\u52A0\u6280\u80FD\u4ED3\u5E93\uFF1A\u672C\u5730\u76EE\u5F55\u76F4\u63A5\u626B\u63CF\uFF08\u96F6\u62F7\u8D1D\uFF09\uFF0CGitHub \u4ED3\u5E93\u4E0B\u8F7D\u538B\u7F29\u5305\u540E\u89E3\u5305\u5230 DSH_HOME \u5185\uFF08\u65E0\u9700\u5B89\u88C5 git\uFF09\u3002\u4E5F\u53EF\u4EE5\u5728\u300C\u5E02\u573A\u300D\u9875\u4E00\u952E\u5B89\u88C5\u7CBE\u9009\u4ED3\u5E93\u3002',\n emptyRoots: '\u8FD8\u6CA1\u6709\u6DFB\u52A0\u81EA\u5B9A\u4E49\u6280\u80FD\u4ED3\u5E93',\n addRoot: '\u6DFB\u52A0\u4ED3\u5E93',\n rootLocal: '\u672C\u5730',\n rootLocalPlaceholder: 'D:\\\\path\\\\to\\\\skills',\n rootKind: '\u4ED3\u5E93\u7C7B\u578B',\n rootPlaceholder: '\u4ED3\u5E93\u5730\u5740',\n add: '\u6DFB\u52A0',\n rootAdded: '\u4ED3\u5E93\u5DF2\u6DFB\u52A0\uFF0C\u76EE\u5F55\u5B9E\u65F6\u751F\u6548\u3002',\n rootRemoved: '\u4ED3\u5E93\u5DF2\u79FB\u9664\u3002',\n rootStale: '\u76EE\u5F55\u7F3A\u5931',\n rootGitHint: '\u652F\u6301 https://github.com/owner/repo\u3001owner/repo\uFF0C\u53EF\u7528 #\u5206\u652F \u6216 /tree/\u5206\u652F \u6307\u5B9A\u7248\u672C\u3002',\n rootLocalHint: '\u6307\u5411\u4E00\u4E2A\u6280\u80FD\u76EE\u5F55\uFF08\u5185\u542B SKILL.md\uFF09\u6216\u88C5\u7740\u591A\u4E2A\u6280\u80FD\u76EE\u5F55\u7684\u6587\u4EF6\u5939\u3002',\n confirmRemoveRoot: '\u786E\u8BA4\u79FB\u9664\u8BE5\u4ED3\u5E93\uFF1F',\n removeRootWarn: '\u5C06\u53D6\u6D88\u626B\u63CF\u8BE5\u4ED3\u5E93\u5E76\u5220\u9664\u4E0B\u8F7D\u5230 DSH_HOME \u7684\u526F\u672C\uFF08\u672C\u5730\u76EE\u5F55\u672C\u8EAB\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002',\n mcpTitle: 'MCP \u670D\u52A1\u5668',\n mcpIntro: '\u7BA1\u7406 profile \u4E2D\u7684 MCP \u670D\u52A1\u5668\u884C\uFF08@deepseek-ai/dsh-mcp-client\uFF09\u3002\u65B0\u589E\u3001\u4FEE\u6539\u6216\u5220\u9664\u540E\u9700\u8981\u91CD\u542F dsh \u624D\u751F\u6548\u3002',\n addServer: '\u6DFB\u52A0\u670D\u52A1\u5668',\n editServer: '\u7F16\u8F91\u670D\u52A1\u5668',\n serverName: '\u670D\u52A1\u5668\u540D\uFF08\u5DE5\u5177\u540D\u524D\u7F00\uFF09',\n transport: '\u4F20\u8F93\u65B9\u5F0F',\n transportStdio: 'stdio\uFF08\u672C\u5730\u547D\u4EE4\uFF09',\n transportHttp: 'streamable-http\uFF08URL\uFF09',\n command: '\u547D\u4EE4',\n args: '\u53C2\u6570\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF09',\n envPairs: '\u73AF\u5883\u53D8\u91CF\uFF08\u6BCF\u884C KEY=VALUE\uFF09',\n url: 'URL',\n headersPairs: '\u8BF7\u6C42\u5934\uFF08\u6BCF\u884C KEY: VALUE\uFF09',\n disabled: '\u5DF2\u505C\u7528',\n enabled: '\u542F\u7528\u4E2D',\n toggle: '\u505C\u7528/\u542F\u7528',\n confirmRemove: '\u786E\u8BA4\u79FB\u9664\u8BE5\u670D\u52A1\u5668\uFF1F',\n removeWarn: '\u5C06\u4ECE profile \u914D\u7F6E\u4E2D\u79FB\u9664\u8FD9\u4E00\u884C\uFF0C\u91CD\u542F dsh \u540E\u5176\u5DE5\u5177\u4E0D\u518D\u51FA\u73B0\u3002',\n emptyMcp: '\u8FD8\u6CA1\u6709\u914D\u7F6E MCP \u670D\u52A1\u5668',\n importServers: '\u4ECE\u5176\u4ED6 Agent \u5BFC\u5165',\n importIntro: '\u626B\u63CF Claude Code\uFF08~/.claude.json\uFF09\u4E0E Codex\uFF08~/.codex/config.toml\uFF09\u7684 MCP \u670D\u52A1\u5668\u914D\u7F6E\uFF0C\u52FE\u9009\u540E\u5BFC\u5165\u4E3A\u672C profile \u7684\u670D\u52A1\u5668\u884C\u3002',\n importEmpty: '\u6CA1\u6709\u53D1\u73B0\u53EF\u5BFC\u5165\u7684 MCP \u670D\u52A1\u5668',\n importSelectAll: '\u5168\u9009',\n importExisting: '\u5DF2\u5B58\u5728',\n importSelected: '\u5BFC\u5165\u9009\u4E2D\u9879',\n restartNeeded: '\u914D\u7F6E\u5DF2\u5199\u5165\uFF0C\u91CD\u542F dsh \u540E\u751F\u6548\u3002',\n restartDesktopHint: '\u91CD\u542F\u7531\u684C\u9762\u5E94\u7528\u8D1F\u8D23\uFF1A\u6258\u76D8\u83DC\u5355\u300C\u91CD\u542F\u670D\u52A1\u300D\u3002',\n restartOtherHint: '\u91CD\u542F\u65B9\u5F0F\uFF1A\u5173\u95ED\u5F53\u524D dsh \u8FDB\u7A0B\u540E\u91CD\u65B0\u8FD0\u884C\u3002',\n restartNow: '\u91CD\u542F\u670D\u52A1',\n restart: '\u91CD\u542F',\n restartConfirmTitle: '\u91CD\u542F dsh\uFF1F',\n restartConfirmBody: '\u91CD\u542F\u4F1A\u4E2D\u65AD\u6B63\u5728\u8FDB\u884C\u7684\u56DE\u5408\uFF0C\u672A\u4FDD\u5B58\u7684\u8F93\u5165\u53EF\u80FD\u4E22\u5931\uFF1BMCP \u884C\u7684\u53D8\u66F4\u5C06\u5728\u91CD\u542F\u540E\u751F\u6548\u3002',\n restarting: '\u6B63\u5728\u91CD\u542F\uFF0C\u6062\u590D\u540E\u5C06\u81EA\u52A8\u5237\u65B0\u9875\u9762\u2026',\n restartPortHint: '\u82E5\u91CD\u542F\u540E\u9875\u9762\u957F\u65F6\u95F4\u672A\u6062\u590D\uFF0C\u53EF\u80FD\u662F\u7AEF\u53E3\u5DF2\u53D8\u5316\uFF1A\u5728\u7EC8\u7AEF\u67E5\u770B\u65B0\u5730\u5740\u540E\u6253\u5F00\u3002',\n failed: '\u64CD\u4F5C\u5931\u8D25',\n formatTitle: '\u5B8C\u6574\u683C\u5F0F\u4E0E\u5FEB\u901F\u586B\u5145',\n formatPaste: '\u7C98\u8D34 JSON \u914D\u7F6E\uFF08mcpServers \u5305\u88C5\u6216\u5355\u6761\u76EE\u5747\u53EF\uFF09',\n formatFill: '\u89E3\u6790\u5E76\u586B\u5145\u8868\u5355',\n formatYamlHint: '\u4FDD\u5B58\u540E\u5C06\u5199\u5165 profile patch \u7684\u5B8C\u6574\u884C\uFF08\u5B9E\u65F6\u9884\u89C8\uFF09\uFF1A',\n formatJsonHint: '\u7B49\u4EF7\u7684 mcpServers JSON \u5199\u6CD5\uFF08\u53EF\u7C98\u8D34\u5230\u5176\u4ED6\u5DE5\u5177\uFF09\uFF1A',\n pasteTransportMismatch: '\u8BE5\u884C\u7684\u4F20\u8F93\u65B9\u5F0F\u5DF2\u9501\u5B9A\uFF0C\u4E0E\u7C98\u8D34\u914D\u7F6E\u7684\u7C7B\u578B\u4E0D\u4E00\u81F4\u3002',\n marketTitle: '\u5E02\u573A',\n marketIntro: '\u7CBE\u9009\u7684\u6280\u80FD\u4ED3\u5E93\u4E0E MCP \u670D\u52A1\u5668\uFF0C\u4E00\u952E\u5B89\u88C5\u3002\u5217\u8868\u6765\u81EA\u63D2\u4EF6\u4ED3\u5E93\u7684\u5728\u7EBF\u7D22\u5F15\uFF0C\u79BB\u7EBF\u65F6\u56DE\u9000\u5230\u5305\u5185\u5FEB\u7167\u3002',\n marketSkills: '\u6280\u80FD\u5E02\u573A',\n marketMcp: 'MCP \u5E02\u573A',\n marketSkillsIntro: '\u5B89\u88C5\u6280\u80FD\u4ED3\u5E93\uFF08GitHub \u4E0B\u8F7D\u89E3\u5305\uFF0C\u5B9E\u65F6\u8FDB\u5165\u626B\u63CF\u76EE\u5F55\uFF09\uFF1B\u5DF2\u5B89\u88C5\u7684\u4ED3\u5E93\u53EF\u5728\u300C\u6280\u80FD\u300D\u9875\u7BA1\u7406\u3002',\n marketMcpIntro: '\u6DFB\u52A0 MCP \u670D\u52A1\u5668\u884C\uFF08\u4E0E\u300CMCP\u300D\u9875\u540C\u4E00\u5B58\u50A8\uFF0C\u6DFB\u52A0\u540E\u9700\u91CD\u542F\u751F\u6548\uFF09\uFF1B\u9700\u8981\u5BC6\u94A5\u7684\u670D\u52A1\u5728\u5B89\u88C5\u540E\u4E8E\u5217\u8868\u4E2D\u8865\u586B\u73AF\u5883\u53D8\u91CF\u3002',\n marketEmpty: '\u5E02\u573A\u5217\u8868\u4E3A\u7A7A\u6216\u4E0D\u53EF\u7528',\n marketOffline: '\u5728\u7EBF\u7D22\u5F15\u4E0D\u53EF\u8FBE\uFF0C\u5F53\u524D\u5C55\u793A\u5305\u5185\u5FEB\u7167\uFF08\u53EF\u80FD\u4E0E\u6700\u65B0\u5217\u8868\u6709\u5DEE\u5F02\uFF09\u3002',\n marketSkillCount: '{n} \u4E2A\u6280\u80FD',\n marketInstall: '\u5B89\u88C5',\n marketAdd: '\u6DFB\u52A0',\n marketInstalling: '\u8FDB\u884C\u4E2D\u2026',\n marketInstalled: '\u5DF2\u5B89\u88C5',\n marketUninstall: '\u79FB\u9664',\n marketHome: '\u4E3B\u9875',\n marketNeedsEnv: '\u9700\u8981\u73AF\u5883\u53D8\u91CF',\n marketRepoInstalled: '\u4ED3\u5E93\u5DF2\u5B89\u88C5\uFF0C\u6280\u80FD\u7A0D\u5019\u51FA\u73B0\u5728\u300C\u6280\u80FD\u300D\u9875\u5217\u8868\u3002',\n marketUninstallConfirm: '\u786E\u8BA4\u79FB\u9664\uFF1F',\n marketUninstallRootWarn: '\u5C06\u53D6\u6D88\u626B\u63CF\u8BE5\u4ED3\u5E93\u5E76\u5220\u9664\u4E0B\u8F7D\u7684\u526F\u672C\uFF08\u79FB\u9664\u540E\u53EF\u91CD\u65B0\u5B89\u88C5\uFF09\u3002',\n marketDetail: '\u8BE6\u60C5',\n marketSkillListLabel: '\u6280\u80FD\u6E05\u5355',\n marketToolsLabel: '\u63D0\u4F9B\u5DE5\u5177',\n marketCommandLabel: '\u542F\u52A8\u547D\u4EE4',\n}\n\nexport const en = {\n sectionNav: 'Skills & MCP',\n skillsTab: 'Skills',\n mcpTab: 'MCP',\n marketTab: 'Market',\n skillsTitle: 'Skills',\n skillsIntro: 'View and edit the skills dsh discovers; user-level skills (DSH_HOME/skills) can be created, edited, and deleted here \u2014 the directory is watched, saves apply without a restart. ~/.claude/skills and ~/.codex/skills are scanned too when present (zero-copy, live-synced). The switch on each card toggles loading: disabling removes the skill from both the model and user catalogs; enabling restores the default policy.',\n newSkill: 'New skill',\n editSkill: 'Edit skill',\n viewSkill: 'View skill',\n skillName: 'Name (kebab-case)',\n skillDescription: 'Description',\n skillWhenToUse: 'When to use (optional)',\n skillContent: 'Body (Markdown)',\n skillPreview: 'Markdown preview',\n skillPlainText: 'Plain text',\n modelInvocable: 'Model-invocable',\n userInvocable: 'User-invocable (/)',\n save: 'Save',\n cancel: 'Cancel',\n delete: 'Delete',\n edit: 'Edit',\n view: 'View',\n close: 'Close',\n emptySkills: 'No skills discovered yet',\n loading: 'Loading\u2026',\n source: 'Source',\n sourceProjectDsh: 'project',\n sourceProjectAgents: 'project',\n sourceUserDsh: 'user',\n sourceUserAgents: 'user',\n sourceRuntime: 'runtime',\n sourceBundled: 'bundled',\n sourceCustom: 'custom',\n readOnly: 'read-only',\n confirmDelete: 'Delete this skill?',\n deleteWarn: 'Removes the whole skill directory under DSH_HOME/skills. This cannot be undone.',\n saved: 'Saved. The skills directory is watched; the skill is usable in sessions shortly.',\n searchSkills: 'Search name or description',\n filterAll: 'All',\n noMatch: 'No skills match',\n refresh: 'Refresh',\n skillDisabled: 'disabled',\n skillUserOnly: 'user-only',\n skillModelOnly: 'model-only',\n skillEnabled: 'Enabled \u2014 the list reflects it shortly.',\n skillDisabledMsg: 'Disabled: neither the model nor / commands will load it.',\n toggleSkill: 'Toggle skill loading',\n toggleSkillHint: 'Disabling writes disable-model-invocation and user-invocable into the skill\\u2019s SKILL.md, removing it from both catalogs; enabling restores the default policy. The rest of the file is untouched.',\n openFolder: 'Open folder',\n openUserSkills: 'Open skills folder',\n rootsTitle: 'Skill repositories',\n rootsIntro: 'Add skill repositories by hand: local folders are scanned in place (zero-copy), GitHub repos arrive as a downloaded copy inside DSH_HOME (no git needed). The Market tab offers curated repos with one click.',\n emptyRoots: 'No custom skill repositories yet',\n addRoot: 'Add repository',\n rootLocal: 'Local',\n rootLocalPlaceholder: 'D:\\\\path\\\\to\\\\skills',\n rootKind: 'Repository type',\n rootPlaceholder: 'Repository address',\n add: 'Add',\n rootAdded: 'Repository added \u2014 the catalog follows live.',\n rootRemoved: 'Repository removed.',\n rootStale: 'missing',\n rootGitHint: 'Accepts https://github.com/owner/repo and owner/repo; pick a version with #branch or /tree/branch.',\n rootLocalHint: 'Point at one skill folder (with SKILL.md) or a folder of skill folders.',\n confirmRemoveRoot: 'Remove this repository?',\n removeRootWarn: 'Stops scanning the repository and deletes the copy downloaded into DSH_HOME (a local folder itself is untouched).',\n mcpTitle: 'MCP servers',\n mcpIntro: 'Manage the MCP server rows (@deepseek-ai/dsh-mcp-client) in this profile. Additions, edits, and removals take effect after a dsh restart.',\n addServer: 'Add server',\n editServer: 'Edit server',\n serverName: 'Server name (tool name prefix)',\n transport: 'Transport',\n transportStdio: 'stdio (local command)',\n transportHttp: 'streamable-http (URL)',\n command: 'Command',\n args: 'Arguments (one per line)',\n envPairs: 'Environment (KEY=VALUE per line)',\n url: 'URL',\n headersPairs: 'Headers (KEY: VALUE per line)',\n disabled: 'Disabled',\n enabled: 'Enabled',\n toggle: 'Enable/disable',\n confirmRemove: 'Remove this server?',\n removeWarn: 'Removes the row from the profile configuration; its tools disappear after the next dsh restart.',\n emptyMcp: 'No MCP servers configured yet',\n importServers: 'Import from other agents',\n importIntro: 'Scans Claude Code (~/.claude.json) and Codex (~/.codex/config.toml) MCP server configs; selected entries become server rows in this profile.',\n importEmpty: 'No importable MCP servers found',\n importSelectAll: 'Select all',\n importExisting: 'already here',\n importSelected: 'Import selected',\n restartNeeded: 'Configuration written \u2014 restart dsh to apply.',\n restartDesktopHint: 'The desktop app owns restarts: use the tray \u201CRestart service\u201D.',\n restartOtherHint: 'Restart by closing this dsh process and running it again.',\n restartNow: 'Restart service',\n restart: 'Restart',\n restartConfirmTitle: 'Restart dsh?',\n restartConfirmBody: 'Restarting interrupts any running turn and may lose unsaved input; pending MCP changes apply after the restart.',\n restarting: 'Restarting \u2014 the page will reload once the host is back\u2026',\n restartPortHint: 'If the page does not recover, the port may have changed: check the terminal for the new URL.',\n failed: 'Operation failed',\n formatTitle: 'Full format & quick fill',\n formatPaste: 'Paste a JSON config (mcpServers wrapper or a bare entry)',\n formatFill: 'Parse and fill the form',\n formatYamlHint: 'The complete row as it will land in the profile patch (live preview):',\n formatJsonHint: 'Equivalent mcpServers JSON (paste-ready for other tools):',\n pasteTransportMismatch: 'This row\\u2019s transport is locked and differs from the pasted config.',\n marketTitle: 'Market',\n marketIntro: 'Curated skill repositories and MCP servers, installable with one click. The list comes from the plugin repository\\u2019s online index, falling back to the bundled snapshot offline.',\n marketSkills: 'Skills market',\n marketMcp: 'MCP market',\n marketSkillsIntro: 'Installs skill repositories (GitHub download, live catalog); manage installed ones on the Skills tab.',\n marketMcpIntro: 'Adds MCP server rows (same storage as the MCP tab; restart to apply). Servers needing keys get their environment filled in on the row after install.',\n marketEmpty: 'Market list is empty or unavailable',\n marketOffline: 'Online index unreachable \u2014 showing the bundled snapshot, which may lag behind.',\n marketSkillCount: '{n} skills',\n marketInstall: 'Install',\n marketAdd: 'Add',\n marketInstalling: 'Working\u2026',\n marketInstalled: 'installed',\n marketUninstall: 'Uninstall',\n marketHome: 'Homepage',\n marketNeedsEnv: 'Needs environment variables',\n marketRepoInstalled: 'Repository installed \u2014 its skills appear on the Skills tab shortly.',\n marketUninstallConfirm: 'Uninstall?',\n marketUninstallRootWarn: 'Stops scanning the repository and deletes the downloaded copy (you can reinstall later).',\n marketDetail: 'Details',\n marketSkillListLabel: 'Skills included',\n marketToolsLabel: 'Tools provided',\n marketCommandLabel: 'Launch command',\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_react", "import_react", "zh", "name", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "name", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "name", "skills", "import_jsx_runtime", "name", "h"]
7
7
  }