prompt-skill-armory 0.9.8 → 0.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -12,13 +12,13 @@
12
12
  |--|--|--|--|
13
13
  | <img src="docs/preview/preview-6.png" width="220"/> | <img src="docs/preview/preview-7.png" width="220"/> | | |
14
14
 
15
- ![version](https://img.shields.io/badge/version-0.9.8-00ff9c)
15
+ ![version](https://img.shields.io/badge/version-0.9.9-00ff9c)
16
16
  ![license](https://img.shields.io/badge/license-MIT-blue)
17
17
  ![platform](https://img.shields.io/badge/platform-web%20%2B%20desktop-00ff9c)
18
18
  ![CI](https://github.com/Qian-Ning/prompt-skill-armory/actions/workflows/ci.yml/badge.svg)
19
19
 
20
20
  ```
21
- ✦ Armory v0.9.8
21
+ ✦ Armory v0.9.9
22
22
  ┌─────────┬─────────┬─────┬────────────┬──────┬──────┐
23
23
  │ Prompts │ Skills │ MCP │ Wallpaper │ Chat │ Stats│
24
24
  │ global │ merged │ hub │ wallpaper │ sync │ usage│
@@ -125,7 +125,7 @@ Achieved via profile composition (the installer mounts the panel into each profi
125
125
 
126
126
  Every time the panel opens it queries npm for the latest `prompt-skill-armory` version; when a newer version exists a banner appears:
127
127
 
128
- > New version vX.Y.Z (current v0.9.8) [Update now]
128
+ > New version vX.Y.Z (current v0.9.9) [Update now]
129
129
 
130
130
  Clicking "Update now" makes the Host re-run the official installer in place → "Update complete, please restart the client".
131
131
 
package/README.md CHANGED
@@ -12,13 +12,13 @@
12
12
  |--|--|--|--|
13
13
  | <img src="docs/preview/preview-6.png" width="220"/> | <img src="docs/preview/preview-7.png" width="220"/> | | |
14
14
 
15
- ![version](https://img.shields.io/badge/version-0.9.8-00ff9c)
15
+ ![version](https://img.shields.io/badge/version-0.9.9-00ff9c)
16
16
  ![license](https://img.shields.io/badge/license-MIT-blue)
17
17
  ![platform](https://img.shields.io/badge/platform-web%20%2B%20desktop-00ff9c)
18
18
  ![CI](https://github.com/Qian-Ning/prompt-skill-armory/actions/workflows/ci.yml/badge.svg)
19
19
 
20
20
  ```
21
- ✦ Armory v0.9.8
21
+ ✦ Armory v0.9.9
22
22
  ┌─────────┬─────────┬─────┬────────────┬──────┬──────┐
23
23
  │ 提示词 │ 技能 │ MCP │ Wallpaper │ 对话 │ 统计 │
24
24
  │ 全局注入 │ 合并管理 │ 连接 │ 壁纸·特效 │ 导入 │ 用量 │
@@ -128,7 +128,7 @@ pnpm dsh web
128
128
 
129
129
  插件面板每次打开会自动查询 npm 上 `prompt-skill-armory` 的最新版本;发现新版本时顶部显示横幅:
130
130
 
131
- > 有新版本 vX.Y.Z(当前 v0.9.8) [一键更新]
131
+ > 有新版本 vX.Y.Z(当前 v0.9.9) [一键更新]
132
132
 
133
133
  点击「一键更新」→ Host 端运行官方安装器原地重装 → 提示「更新完成,请重启客户端生效」。
134
134
 
package/cli.cjs CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  /**
3
3
  * prompt-skill-armory — one-command installer.
4
4
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prompt-skill-armory",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "One-command installer for Prompt-SkillArmory (prompts + skills manager) into the DeepSeek Harness (web + desktop)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -958,7 +958,7 @@ window.__ModuleLoader__.load({
958
958
  });
959
959
  }
960
960
  /** Bump with every release; keep in sync with package.json version + CHANGELOG. */
961
- const ARMORY_VERSION = "0.9.8";
961
+ const ARMORY_VERSION = "0.9.9";
962
962
  /** Compact duration: 45.2s / 2m42s / 1h05m. */
963
963
  function fmtDuration(ms) {
964
964
  const s = ms / 1e3;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../../packages/client/ui-switchblade/src/client/locales.ts","../../../packages/client/ui-switchblade/src/client/background.ts","../../../packages/client/ui-switchblade/src/client/conversations.ts","../../../packages/client/ui-switchblade/src/client/SwitchbladeSection.tsx","../../../packages/client/ui-switchblade/src/client/store.ts","../../../packages/client/ui-switchblade/src/client/index.ts"],"sourcesContent":["/**\r\n * Switchblade management page dictionaries.\r\n * @module @deepseek-ai/dsh-client-ui-switchblade\r\n */\r\n\r\n/** Locale namespace owned by this plugin (settings.* prefix per the slot contract). */\r\nexport const NS = 'settings.switchblade'\r\n\r\n/** Keys translated by this plugin. */\r\nexport type SwitchbladeKey =\r\n | 'nav' | 'skillsTitle' | 'promptsTitle' | 'commandsTitle'\r\n | 'empty' | 'enabled' | 'disabled' | 'installed'\r\n | 'refresh' | 'setDefault' | 'loadFailed'\r\n | 'globalHint' | 'promptNamePlaceholder' | 'promptDescPlaceholder' | 'promptContentPlaceholder'\r\n | 'addPrompt' | 'enable' | 'disable' | 'delete'\r\n | 'installSkill' | 'skillNamePlaceholder' | 'skillDescPlaceholder' | 'skillContentPlaceholder'\r\n | 'install' | 'uninstall' | 'pickSkillFile' | 'searchPlaceholder'\r\n | 'installedSkills' | 'installedSkillsGoRight' | 'manage'\r\n | 'localSkills' | 'edit' | 'save' | 'cancel' | 'addSkill'\r\n | 'pickZipFile' | 'cliHint'\r\n\r\n/** zh-CN copy. */\r\nexport const zh: Record<SwitchbladeKey, string> = {\r\n nav: 'Armory',\r\n skillsTitle: '技能',\r\n promptsTitle: '提示词',\r\n commandsTitle: '命令',\r\n empty: '(空)',\r\n enabled: '启用',\r\n disabled: '停用',\r\n installed: '已装',\r\n refresh: '刷新',\r\n setDefault: '设为默认',\r\n loadFailed: '加载失败',\r\n globalHint: '· 全局生效',\r\n promptNamePlaceholder: '提示词名称',\r\n promptDescPlaceholder: '描述(可选)',\r\n promptContentPlaceholder: '提示词内容…',\r\n addPrompt: '添加提示词',\r\n enable: '启用',\r\n disable: '停用',\r\n delete: '删除',\r\n installSkill: '技能',\r\n skillNamePlaceholder: '技能名称(kebab-case)',\r\n skillDescPlaceholder: '描述(可选)',\r\n skillContentPlaceholder: '技能指令内容…',\r\n install: '安装',\r\n uninstall: '卸载',\r\n pickSkillFile: '选择本地 .md 技能文件导入',\r\n searchPlaceholder: '搜索…',\r\n installedSkills: '本地化技能',\r\n installedSkillsGoRight: '已安装的技能在右侧第四列管理',\r\n manage: '托管',\r\n localSkills: '本地扫描技能',\r\n edit: '编辑',\r\n save: '保存',\r\n cancel: '取消',\r\n addSkill: '添加技能',\r\n pickZipFile: '导入 .zip 技能包',\r\n cliHint: 'CLI 直接安装(在会话里输入):',\r\n}\r\n\r\n/** en-US copy. */\r\nexport const en: Record<SwitchbladeKey, string> = {\r\n nav: 'Armory',\r\n skillsTitle: 'Skills',\r\n promptsTitle: 'Prompts',\r\n commandsTitle: 'Commands',\r\n empty: '(empty)',\r\n enabled: 'enabled',\r\n disabled: 'disabled',\r\n installed: 'installed',\r\n refresh: 'Refresh',\r\n setDefault: 'Set default',\r\n loadFailed: 'Failed to load',\r\n globalHint: '· global',\r\n promptNamePlaceholder: 'Prompt name',\r\n promptDescPlaceholder: 'Description (optional)',\r\n promptContentPlaceholder: 'Prompt content…',\r\n addPrompt: 'Add prompt',\r\n enable: 'Enable',\r\n disable: 'Disable',\r\n delete: 'Delete',\r\n installSkill: 'Skills',\r\n skillNamePlaceholder: 'Skill name (kebab-case)',\r\n skillDescPlaceholder: 'Description (optional)',\r\n skillContentPlaceholder: 'Skill instructions…',\r\n install: 'Install',\r\n uninstall: 'Uninstall',\r\n pickSkillFile: 'Pick a local .md skill file',\r\n searchPlaceholder: 'Search…',\r\n installedSkills: 'Local skills',\r\n installedSkillsGoRight: 'Installed skills are managed in the right column',\r\n manage: 'Manage',\r\n localSkills: 'Scanned skills',\r\n edit: 'Edit',\r\n save: 'Save',\r\n cancel: 'Cancel',\r\n addSkill: 'Add skill',\r\n pickZipFile: 'Import .zip skill bundle',\r\n cliHint: 'Install via CLI (type in a session):',\r\n}\r\n","/**\r\n * Global background/effects engine for Prompt•Skill-Armory — fusing the\r\n * reference DSH skin/theme plugins' strongest ideas into one feature:\r\n * - dsh-harness-background / dsh-dream-skin: a real walled backdrop engine\r\n * (wallpaper + readability scrim + frosted-glass surfaces + blur + fit),\r\n * - dsh-web / dsh-background: custom user image upload (here as a portable\r\n * data-URL so it needs no filesystem and survives restarts), and\r\n * - catppuccin: the \"whole app recolor\" idea — here the glass surfaces and\r\n * frame transparency are driven by inline body styles so they truly take\r\n * effect.\r\n *\r\n * The critical reliability detail: every knob is written INLINE on\r\n * `document.body` (`style.setProperty`), which outranks any stylesheet, so a\r\n * later-loaded official theme rule cannot wash it out. Persistence goes\r\n * through the Host's same-origin route so the section survives restarts with\r\n * no settings-RPC / allowlist dependency.\r\n *\r\n * This module is deliberately defensive: every mutation is guarded so a bad\r\n * value or a missing DOM API can never take the client plugin tree down.\r\n */\r\n\r\n/** Style for the composer's below-input hint row (per surface, optional). */\r\nexport interface HintStyle {\r\n enabled: boolean\r\n color: string\r\n size: number\r\n /** CSS gradient ('' = use solid color). Gradient text via background-clip. */\r\n gradient: string\r\n}\r\n\r\n/** Built-in fancy gradient text schemes for the hint/stats line. */\r\nexport const GRADIENTS: readonly { id: string; name: string; css: string }[] = [\r\n { id: '', name: '纯色', css: '' },\r\n { id: 'aurora', name: '极光', css: 'linear-gradient(90deg,#58a6ff,#8b5cf6,#ec4899)' },\r\n { id: 'fire', name: '火焰', css: 'linear-gradient(90deg,#fbbf24,#f97316,#ef4444)' },\r\n { id: 'sky', name: '晴空', css: 'linear-gradient(90deg,#38bdf8,#818cf8)' },\r\n { id: 'neon', name: '霓虹', css: 'linear-gradient(90deg,#22d3ee,#a78bfa,#f0abfc)' },\r\n { id: 'ocean', name: '海洋', css: 'linear-gradient(90deg,#34d399,#22d3ee,#3b82f6)' },\r\n { id: 'sunset', name: '晚霞', css: 'linear-gradient(90deg,#f472b6,#fb923c,#f59e0b)' },\r\n]\r\n\r\n/** One durable background section. Mirrors the Host BackgroundSettings. */\r\nexport interface BackgroundSettings {\r\n enabled: boolean\r\n kind: 'image' | 'video'\r\n /** Id of a file stored on disk ('' = none); never stores bytes in settings. */\r\n uploadId: string\r\n /** External image URL ('' = none when an upload is used). */\r\n url: string\r\n opacity: number\r\n scrim: number\r\n panelOpacity: number\r\n blur: number\r\n wallpaperBlur: number\r\n fit: 'cover' | 'contain'\r\n hint: HintStyle\r\n}\r\n\r\nexport const DEFAULT_BACKGROUND: BackgroundSettings = {\r\n enabled: false, kind: 'image', uploadId: '', url: '', opacity: 1, scrim: 0.25, panelOpacity: 1, blur: 16, wallpaperBlur: 0, fit: 'cover',\r\n hint: { enabled: false, color: '#79c0ff', size: 11, gradient: '' },\r\n}\r\n\r\nconst BACKGROUND_API_PREFIX = '/api/switchblade-background'\r\n\r\nconst ACTIVE_ATTR = 'data-ar-bg'\r\nconst GLASS_ATTR = 'data-ar-glass'\r\nconst CSS_TAG = 'prompt-skill-armory/background'\r\n\r\nconst BACKGROUND_CSS = `\r\n .ar-bg-layer { position: fixed; inset: 0; z-index: -2; overflow: hidden; pointer-events: none; }\r\n .ar-bg-layer .ar-bg-image { width: 100%; height: 100%; display: block; border: 0;\r\n object-fit: var(--ar-bg-fit, cover); opacity: var(--ar-bg-opacity, 1);\r\n filter: blur(var(--ar-bg-blur, 0px)); transform: scale(var(--ar-bg-scale, 1)); transform-origin: center; }\r\n .ar-bg-scrim { position: fixed; inset: 0; z-index: -1; pointer-events: none;\r\n background: rgba(255,255,255, var(--ar-bg-scrim, 0.25)); }\r\n body[data-ds-dark-theme] .ar-bg-scrim { background: rgba(0,0,0, var(--ar-bg-scrim, 0.25)); }\r\n body[${ACTIVE_ATTR}] { --dsw-alias-bg-base: transparent; --dsw-specific-sidebar-fill: transparent; }\r\n body[${GLASS_ATTR}] [data-composer-card],\r\n body[${GLASS_ATTR}] [class*=\"_bubble\"]:not([role=\"tooltip\"]),\r\n body[${GLASS_ATTR}] .md-code-block,\r\n body[${GLASS_ATTR}] [data-terminal], body[${GLASS_ATTR}] [data-diff],\r\n body[${GLASS_ATTR}] [data-read], body[${GLASS_ATTR}] [data-search],\r\n body[${GLASS_ATTR}] [data-web], body[${GLASS_ATTR}] [class*=\"_ioCard\"],\r\n body[${GLASS_ATTR}] [class*=\"_instructionsCard\"],\r\n body[${GLASS_ATTR}] [class*=\"_markdown\"] :not(pre) > code {\r\n background-image: linear-gradient(180deg, rgba(255,255,255, var(--ar-glass-sheen, 0.07)), rgba(255,255,255, var(--ar-glass-sheen-mid, 0.02)) 38%, rgba(255,255,255, 0.01));\r\n -webkit-backdrop-filter: blur(var(--ar-glass-blur, 16px)) saturate(var(--ar-glass-saturate, 1.4)) brightness(var(--ar-glass-brightness, 1)) contrast(1.01);\r\n backdrop-filter: blur(var(--ar-glass-blur, 16px)) saturate(var(--ar-glass-saturate, 1.4)) brightness(var(--ar-glass-brightness, 1)) contrast(1.01);\r\n box-shadow: inset 0 1px 0 rgba(255,255,255,0.32), inset 0 -1px 0 rgba(255,255,255,0.08), inset 0 0 0 0.5px rgba(255,255,255,0.08), 0 12px 40px rgba(0,0,0,0.12);\r\n }\r\n body[${ACTIVE_ATTR}] .md-code-block [class*=\"_bannerWrap\"] { background-color: var(--dsw-alias-markdown-code-block-banner); }\r\n`\r\n\r\nfunction injectBackgroundCss(): void {\r\n try {\r\n if (document.querySelector(`style[data-plugin-css=\"${CSS_TAG}\"]`)) return\r\n const tag = document.createElement('style')\r\n tag.dataset.plugin = 'prompt-skill-armory'\r\n tag.dataset.pluginCss = CSS_TAG\r\n tag.textContent = BACKGROUND_CSS\r\n document.head.appendChild(tag)\r\n } catch { /* stylesheet is cosmetic — never fatal */ }\r\n}\r\n\r\nconst GLASS_TOKENS = [\r\n '--dsw-specific-input-major', '--dsw-specific-bubble', '--dsw-alias-markdown-code-block',\r\n '--dsw-alias-markdown-code-block-banner', '--dsw-alias-markdown-inline-code', '--dsw-specific-tip',\r\n] as const\r\n\r\nfunction glassAlpha(panelOpacity: number): number {\r\n const alpha = 0.05 + panelOpacity * 0.85\r\n return Math.max(0, Math.min(0.9, alpha))\r\n}\r\n\r\nclass BackgroundPainter {\r\n private layer: HTMLDivElement | null = null\r\n private img: HTMLMediaElement | null = null\r\n private scrim: HTMLDivElement | null = null\r\n private observer: MutationObserver | undefined\r\n private settings: BackgroundSettings | undefined\r\n private readonly saved = new Map<string, string>()\r\n\r\n private rememberOnce(prop: string): void {\r\n if (this.saved.has(prop)) return\r\n try { this.saved.set(prop, document.body.style.getPropertyValue(prop)) } catch { this.saved.set(prop, '') }\r\n }\r\n private setVar(name: string, value: string): void {\r\n this.rememberOnce(name)\r\n try { document.body.style.setProperty(name, value) } catch { /* ignore */ }\r\n }\r\n\r\n apply(settings: BackgroundSettings): void {\r\n this.settings = settings\r\n if (!settings.enabled) { this.dispose(); return }\r\n try {\r\n injectBackgroundCss()\r\n const hasSource = settings.url !== '' || settings.uploadId !== ''\r\n for (const prop of ['--dsw-alias-bg-base', '--dsw-specific-sidebar-fill']) {\r\n this.rememberOnce(prop); document.body.style.setProperty(prop, 'transparent')\r\n }\r\n if (!hasSource) { this.removeLayers(); document.body.removeAttribute(ACTIVE_ATTR); this.applyGlass(settings, true); return }\r\n const mediaUrl = settings.uploadId !== '' ? `/api/switchblade-wallpaper/image/${settings.uploadId}` : settings.url\r\n const isVideo = settings.kind === 'video'\r\n\r\n if (!this.layer) {\r\n this.layer = document.createElement('div'); this.layer.className = 'ar-bg-layer'\r\n this.img = document.createElement(isVideo ? 'video' : 'img'); this.img.className = 'ar-bg-image'\r\n if (isVideo) {\r\n this.img.setAttribute('autoplay', ''); this.img.setAttribute('loop', ''); this.img.setAttribute('muted', ''); this.img.setAttribute('playsinline', '')\r\n } else { (this.img as HTMLImageElement).referrerPolicy = 'no-referrer'; this.img.alt = '' }\r\n this.img.onerror = () => { if (this.img && this.img.dataset.failed !== '1') { this.img.dataset.failed = '1'; this.img.style.visibility = 'hidden' } }\r\n this.layer.appendChild(this.img); document.body.appendChild(this.layer)\r\n }\r\n if (this.img && this.img.getAttribute('src') !== mediaUrl) {\r\n delete this.img.dataset.failed; this.img.style.visibility = ''; this.img.setAttribute('src', mediaUrl)\r\n }\r\n if (!this.scrim) { this.scrim = document.createElement('div'); this.scrim.className = 'ar-bg-scrim'; document.body.appendChild(this.scrim) }\r\n document.body.setAttribute(ACTIVE_ATTR, 'on')\r\n\r\n const s = document.body.style\r\n this.setVar('--ar-bg-fit', settings.fit)\r\n this.setVar('--ar-bg-opacity', String(settings.opacity))\r\n this.setVar('--ar-bg-blur', `${settings.wallpaperBlur}px`)\r\n this.setVar('--ar-bg-scale', (1 + settings.wallpaperBlur * 0.006).toFixed(4))\r\n this.setVar('--ar-bg-scrim', String(settings.scrim))\r\n this.setVar('--ar-glass-blur', `${settings.blur}px`)\r\n this.setVar('--ar-glass-saturate', String(settings.blur > 0 ? Math.round(Math.min(1.6, 1.1 + settings.blur * 0.02) * 1000) / 1000 : 1))\r\n this.setVar('--ar-glass-brightness', document.body.dataset.dsDarkTheme !== undefined ? '1.04' : '0.98')\r\n this.setVar('--ar-glass-sheen', document.body.dataset.dsDarkTheme !== undefined ? '0.16' : '0.07')\r\n this.setVar('--ar-glass-sheen-mid', document.body.dataset.dsDarkTheme !== undefined ? '0.05' : '0.02')\r\n this.applyGlass(settings, false)\r\n\r\n if (!this.observer) {\r\n this.observer = new MutationObserver(() => { if (this.settings) this.applyGlass(this.settings, false) })\r\n this.observer.observe(document.body, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n }\r\n } catch { this.dispose() }\r\n }\r\n\r\n dispose(): void {\r\n try {\r\n this.observer?.disconnect(); this.observer = undefined\r\n this.removeLayers()\r\n const s = document.body.style\r\n document.body.removeAttribute(ACTIVE_ATTR); document.body.removeAttribute(GLASS_ATTR)\r\n for (const [prop, value] of this.saved) s.setProperty(prop, value)\r\n this.saved.clear(); this.settings = undefined\r\n } catch { /* ignore */ }\r\n }\r\n\r\n private applyGlass(settings: BackgroundSettings | undefined, forceRestore: boolean): void {\r\n try {\r\n const s = document.body.style\r\n for (const t of GLASS_TOKENS) this.rememberOnce(t)\r\n if (forceRestore || settings === undefined || settings.panelOpacity >= 1) {\r\n for (const t of GLASS_TOKENS) { const o = this.saved.get(t); if (o !== undefined && o !== '') s.setProperty(t, o); else s.removeProperty(t) }\r\n document.body.removeAttribute(GLASS_ATTR); this.setVar('--ar-glass-blur', '0px')\r\n return\r\n }\r\n document.body.setAttribute(GLASS_ATTR, 'on')\r\n const inDark = document.body.dataset.dsDarkTheme !== undefined\r\n const alpha = glassAlpha(settings.panelOpacity) * (inDark ? 0.4 : 0.8)\r\n for (const t of GLASS_TOKENS) s.setProperty(t, `rgba(255,255,255,${alpha.toFixed(3)})`)\r\n } catch { /* ignore */ }\r\n }\r\n\r\n private removeLayers(): void {\r\n try {\r\n if (this.layer) { this.layer.remove(); this.layer = null; this.img = null }\r\n if (this.scrim) { this.scrim.remove(); this.scrim = null }\r\n } catch { /* ignore */ }\r\n }\r\n}\r\n\r\nconst painter = new BackgroundPainter()\r\n\r\n// ---------------------------------------------------------------------------\r\n// Transport: persist via the switchblade settings namespace over the\r\n// connection RPC (the same proven path MCP/prompts use; no webServer route,\r\n// no settings-RPC allowlist dependency). Module-private state avoids any\r\n// self-reference / circular-eval order issue.\r\n// ---------------------------------------------------------------------------\r\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\r\n\r\nconst bgState: { status: 'loading' | 'ready' | 'error'; value: BackgroundSettings } = { status: 'loading', value: DEFAULT_BACKGROUND }\r\nconst bgListeners = new Set<() => void>()\r\nconst notifyBg = (): void => { for (const l of bgListeners) l() }\r\n\r\nlet bgApi: ConnectionHandle['api'] | undefined\r\n\r\n/** Bind the transport to a live connection API (set once at plugin apply). */\r\nexport function initBackgroundClient(api: ConnectionHandle['api']): void {\r\n bgApi = api\r\n}\r\n\r\n/** Surface key: separate wallpaper per web vs desktop (they share the settings doc). */\r\nexport const isDesktopSurface = typeof navigator !== 'undefined' && navigator.userAgent.toLowerCase().includes('electron')\r\nconst surfaceKey = (): string => (isDesktopSurface ? 'backgroundDesktop' : 'backgroundWeb')\r\n\r\n/** Read the background section for the current surface from the switchblade settings. */\r\nfunction readSection(value: unknown): BackgroundSettings {\r\n const sec = (value as { namespaces?: { ns?: string; value?: unknown }[] | undefined }).namespaces\r\n ?.find((n) => n.ns === 'switchblade')?.value as Record<string, unknown> | undefined\r\n const raw = sec?.[surfaceKey()]\r\n return { ...DEFAULT_BACKGROUND, ...(typeof raw === 'object' && raw !== null ? (raw as BackgroundSettings) : {}) }\r\n}\r\n\r\nexport const backgroundClient = {\r\n getSnapshot() { return bgState },\r\n subscribe(l: () => void): () => void { bgListeners.add(l); return () => { bgListeners.delete(l) } },\r\n /** Fetch the durable section. @returns true on success (status ready). */\r\n async load(): Promise<boolean> {\r\n if (bgApi === undefined) { bgState.status = 'error'; return false }\r\n try {\r\n const res = await bgApi.settings.describe({})\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n bgState.status = 'ready'\r\n bgState.value = readSection(res.result.value)\r\n notifyBg()\r\n return true\r\n } catch {\r\n bgState.status = 'error'\r\n return false\r\n }\r\n },\r\n async save(section: BackgroundSettings): Promise<void> {\r\n if (bgApi === undefined) return\r\n try {\r\n const res = await bgApi.settings.mutate({ ns: 'switchblade', ops: [{ op: 'set', path: [surfaceKey()], value: section }] })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n bgState.status = 'ready'\r\n bgState.value = { ...section }\r\n } catch { bgState.status = 'error'; bgState.value = section }\r\n notifyBg()\r\n },\r\n}\r\n\r\n/** Upload a local image/video to the Host (bytes go to disk, never settings). */\r\nexport async function uploadMedia(file: File): Promise<{ id: string; kind: 'image' | 'video'; url: string } | null> {\r\n try {\r\n const res = await fetch('/api/switchblade-wallpaper/upload', { method: 'POST', headers: { 'content-type': file.type }, body: file })\r\n const body = (await res.json()) as { ok: boolean; id?: string; kind?: 'image' | 'video'; url?: string }\r\n if (!res.ok || !body.ok || !body.id || !body.kind || !body.url) return null\r\n return { id: body.id, kind: body.kind, url: body.url }\r\n } catch { return null }\r\n}\r\n\r\n/** Apply a full section through the painter (idempotent, never throws). */\r\nexport function applyBackground(section: BackgroundSettings): void {\r\n try { painter.apply(section) } catch { /* never fatal */ }\r\n applyHintStyle()\r\n}\r\n\r\nlet hintObserver: MutationObserver | undefined\r\n\r\n/** Inject (or clear) the per-surface style for the composer's hint row + dock stats line. */\r\nexport function applyHintStyle(): void {\r\n try {\r\n const hint = (bgState.value ?? DEFAULT_BACKGROUND).hint ?? DEFAULT_BACKGROUND.hint\r\n const existing = document.getElementById('switchblade-hint') as HTMLStyleElement | null\r\n if (!hint.enabled) {\r\n if (existing !== null) existing.remove()\r\n hintObserver?.disconnect(); hintObserver = undefined\r\n return\r\n }\r\n if (existing === null) {\r\n const t = document.createElement('style'); t.id = 'switchblade-hint'; document.head.appendChild(t)\r\n }\r\n const tag = document.getElementById('switchblade-hint') as HTMLStyleElement\r\n const color = hint.color || (isDesktopSurface ? '#7ee787' : '#79c0ff')\r\n const size = hint.size || 11\r\n const gradPreset = GRADIENTS.find((g) => g.id === (hint.gradient ?? ''))\r\n const grad = gradPreset !== undefined ? gradPreset.css : ''\r\n let hintCss = `[data-decoration=\"hint\"]{font-size:${size}px;letter-spacing:0.3px;font-weight:600;opacity:0.95;`\r\n const statsStyle = (root: HTMLElement): void => {\r\n if (grad !== '') {\r\n root.style.backgroundImage = grad\r\n root.style.webkitBackgroundClip = 'text'\r\n root.style.backgroundClip = 'text'\r\n root.style.color = 'transparent'\r\n } else {\r\n root.style.backgroundImage = 'none'\r\n root.style.webkitBackgroundClip = 'initial'\r\n root.style.backgroundClip = 'initial'\r\n root.style.color = color\r\n }\r\n root.style.fontSize = `${size}px`\r\n root.style.fontWeight = '600'\r\n root.style.opacity = '0.95'\r\n }\r\n if (grad !== '') {\r\n hintCss += `background-image:${grad};-webkit-background-clip:text;background-clip:text;color:transparent`\r\n } else {\r\n hintCss += `color:${color}`\r\n }\r\n hintCss += '}'\r\n tag.textContent = hintCss\r\n // The dock's StatsLine roots are CSS-module hashed; locate via its aria-hidden \"|\" separators.\r\n const applyStats = (): void => {\r\n try {\r\n const seps = Array.from(document.querySelectorAll<HTMLSpanElement>('span[aria-hidden]'))\r\n for (const sep of seps) {\r\n if (sep.textContent !== '|') continue\r\n const root = sep.parentElement\r\n if (root !== null) statsStyle(root)\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n if (hintObserver !== undefined) hintObserver.disconnect()\r\n hintObserver = new MutationObserver(applyStats)\r\n hintObserver.observe(document.body, { childList: true, subtree: true })\r\n applyStats()\r\n } catch { /* never fatal */ }\r\n}\r\n","/** Client transport for Armory conversation import/export (same-origin host routes). */\r\n\r\nexport interface ConversationRow {\r\n projectKey: string\r\n sessionId: string\r\n title: string\r\n cwd: string\r\n mtime: number\r\n size: number\r\n}\r\n\r\nexport async function listConversations(): Promise<ConversationRow[]> {\r\n try {\r\n const r = await fetch('/api/armory/sessions')\r\n const b = (await r.json()) as { ok: boolean; sessions?: ConversationRow[] }\r\n return b.ok ? (b.sessions ?? []) : []\r\n } catch { return [] }\r\n}\r\n\r\nexport async function exportConversations(ids: string[], projectKey?: string): Promise<string | null> {\r\n try {\r\n const r = await fetch('/api/armory/export', {\r\n method: 'POST', headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ sessionIds: ids, projectKey, includeAttachments: false, includeWorkspace: false }),\r\n })\r\n const b = (await r.json()) as { ok: boolean; name?: string }\r\n return b.ok && b.name !== undefined ? b.name : null\r\n } catch { return null }\r\n}\r\n\r\nexport async function downloadExport(name: string): Promise<boolean> {\r\n try {\r\n const r = await fetch(`/api/armory/export/${name}`)\r\n if (!r.ok) return false\r\n const blob = await r.blob()\r\n const url = URL.createObjectURL(blob)\r\n const a = document.createElement('a')\r\n a.href = url; a.download = name\r\n document.body.appendChild(a); a.click(); a.remove()\r\n setTimeout(() => URL.revokeObjectURL(url), 1000)\r\n return true\r\n } catch { return false }\r\n}\r\n\r\nexport interface DeleteResult { deleted: number; failed: string[] }\r\n\r\nexport async function deleteConversations(ids: string[]): Promise<DeleteResult | null> {\r\n try {\r\n const r = await fetch('/api/armory/delete', {\r\n method: 'POST', headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ sessionIds: ids }),\r\n })\r\n const b = (await r.json()) as { ok: boolean; deleted?: number; failed?: string[] }\r\n if (!b.ok) return null\r\n return { deleted: b.deleted ?? 0, failed: Array.isArray(b.failed) ? b.failed : [] }\r\n } catch { return null }\r\n}\r\n\r\n/** Query the npm registry for the latest published prompt-skill-armory version. */\r\nexport async function checkLatestVersion(): Promise<string> {\r\n try {\r\n const r = await fetch('/api/armory/version')\r\n const b = (await r.json()) as { ok: boolean; latest?: string }\r\n return b.ok ? (b.latest ?? '') : ''\r\n } catch { return '' }\r\n}\r\n\r\n/** Trigger an in-place update (runs the installer, which reinstalls the plugin). */\r\nexport async function runUpdate(): Promise<{ ok: boolean; error?: string }> {\r\n try {\r\n const r = await fetch('/api/armory/update', { method: 'POST' })\r\n const b = (await r.json()) as { ok: boolean; error?: string }\r\n return { ok: b.ok === true, error: b.error }\r\n } catch { return { ok: false, error: String('网络请求失败') } }\r\n}\r\n\r\n/** Compare dotted versions; true when `a` is older than `b`. */\r\nexport function isOlder(a: string, b: string): boolean {\r\n const pa = a.split('.').map((n) => Number(n) || 0)\r\n const pb = b.split('.').map((n) => Number(n) || 0)\r\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\r\n const x = pa[i] ?? 0; const y = pb[i] ?? 0\r\n if (x !== y) return x < y\r\n }\r\n return false\r\n}\r\n\r\n/** One request-log row (cc-switch style). */\r\nexport interface UsageLogRow {\r\n time: number\r\n provider: string\r\n model: string\r\n inputTokens: number\r\n outputTokens: number\r\n cacheReadTokens: number\r\n cacheWriteTokens: number\r\n cacheHitRate: number\r\n costUsd: number\r\n latencyMs: number\r\n firstTokenMs: number\r\n status: string\r\n source: string\r\n}\r\n\r\n/** Session-level usage stats (mirrors the Host aggregate). */\r\nexport interface UsageStats {\r\n range: string\r\n totals: {\r\n sessions: number; turns: number; steps: number; llmMs: number; toolMs: number\r\n inputTokens: number; outputTokens: number; cacheReadTokens: number; cacheWriteTokens: number\r\n ttftMs: number; ttftSteps: number; decodeMs: number; costUsd: number\r\n avgTtftMs: number; tokPerSec: number; perSessionSteps: number; activeDays: number; cacheHitRate: number\r\n }\r\n byDay: { date: string; sessions: number; turns: number; steps: number; llmMs: number; toolMs: number; inputTokens: number; outputTokens: number; cacheReadTokens: number; cacheWriteTokens: number }[]\r\n byHour: { hour: number; steps: number; outputTokens: number; inputTokens: number; cacheReadTokens: number; cacheWriteTokens: number }[]\r\n byProject: { project: string; sessions: number; steps: number; llmMs: number; toolMs: number; inputTokens: number; outputTokens: number; cacheReadTokens: number; cacheWriteTokens: number; costUsd: number; successRate: number; avgLatencyMs: number; cacheHitRate: number }[]\r\n byModel: { model: string; sessions: number; steps: number; inputTokens: number; outputTokens: number; costUsd: number; cacheHitRate: number }[]\r\n recent: UsageLogRow[]\r\n}\r\n\r\nexport async function fetchStats(range = 'all'): Promise<UsageStats | null> {\r\n try {\r\n const r = await fetch(`/api/armory/stats?range=${encodeURIComponent(range)}`)\r\n const b = (await r.json()) as { ok: boolean } & UsageStats\r\n return b.ok\r\n ? { range: b.range, totals: b.totals, byDay: b.byDay, byHour: b.byHour, byProject: b.byProject, byModel: b.byModel, recent: b.recent }\r\n : null\r\n } catch { return null }\r\n}\r\n\r\nexport async function importConversations(file: File, targetProject?: string): Promise<number | null> {\r\n try {\r\n const q = targetProject !== undefined && targetProject !== '' ? `?project=${encodeURIComponent(targetProject)}` : ''\r\n const r = await fetch(`/api/armory/import${q}`, { method: 'POST', headers: { 'content-type': 'application/zip' }, body: file })\r\n const b = (await r.json()) as { ok: boolean; imported?: number }\r\n return b.ok ? (b.imported ?? 0) : null\r\n } catch { return null }\r\n}\r\n","/**\r\n * Prompt-SkillArmory management page.\r\n *\r\n * Three tabs within the settings dialog's fixed width: Prompts / Skills /\r\n * MCP / Wallpaper / Chat / Stats. The Skills tab is the single home for skills — both the ones\r\n * installed through this panel and the ones scanned from the local skill\r\n * roots — merged into one list with full management (add / edit / toggle /\r\n * remove / invoke hint). A CLI entry box offers direct command installation.\r\n * @module @deepseek-ai/dsh-client-ui-switchblade\r\n */\r\n\r\nimport { useEffect, useMemo, useState } from 'react'\r\nimport type { CSSProperties, JSX } from 'react'\r\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { SwitchbladeKey } from './locales.ts'\r\nimport type { McpServerRow, SwitchbladeSectionInjected, SwitchbladeSectionState } from './store.ts'\r\nimport { backgroundClient, DEFAULT_BACKGROUND, applyBackground, uploadMedia, isDesktopSurface, GRADIENTS, type BackgroundSettings } from './background.ts'\r\nimport { listConversations, exportConversations, downloadExport, importConversations, deleteConversations, checkLatestVersion, runUpdate, isOlder, fetchStats, type ConversationRow, type UsageStats } from './conversations.ts'\r\n\r\nexport type { SwitchbladeSectionInjected } from './store.ts'\r\n\r\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\r\n interface LocaleNamespaceMap {\r\n /** Prompt-SkillArmory page copy. */\r\n 'settings.switchblade': SwitchbladeKey\r\n }\r\n}\r\n\r\n/** Full component props: settings-section runtime + locale + injected face. */\r\nexport type SwitchbladeSectionProps =\r\n PropsRuntime<'settings.section'>\r\n & PropsLocale<'settings.switchblade'>\r\n & InjectFace<SwitchbladeSectionInjected>\r\n\r\n/* ── Design tokens ────────────────────────────────────────────────\r\n * Modern dark UI (Linear / GitHub Dark / Raycast language):\r\n * low-saturation surfaces, one soft accent, pill badges, generous\r\n * radius + spacing, system sans for text, mono only for code.\r\n * ──────────────────────────────────────────────────────────────── */\r\nconst BG = '#0d1117' // root background\r\nconst SURFACE = '#161b22' // card / form surface\r\nconst BORDER = '#30363d' // hairline border\r\nconst TEXT = '#e6edf3' // primary text\r\nconst TEXT_MUTED = '#8b949e' // secondary text\r\nconst ACCENT = '#58a6ff' // brand accent (soft blue)\r\nconst SUCCESS = '#3fb950' // enabled / success\r\nconst DANGER = '#f85149' // danger / delete\r\nconst WARN = '#d29922' // installed / warning\r\nconst MONO = \"'JetBrains Mono',ui-monospace,'SF Mono',Consolas,monospace\"\r\nconst SANS = \"-apple-system,'Segoe UI','Inter',Roboto,'Helvetica Neue',sans-serif\"\r\n\r\nconst CSS: Record<string, CSSProperties> = {\r\n root: {\r\n fontFamily: SANS,\r\n background: BG,\r\n color: TEXT,\r\n padding: '20px',\r\n border: `1px solid ${BORDER}`,\r\n borderRadius: '12px',\r\n width: '100%',\r\n boxSizing: 'border-box' as const,\r\n },\r\n head: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n borderBottom: `1px solid ${BORDER}`,\r\n paddingBottom: '12px',\r\n marginBottom: '14px',\r\n },\r\n title: {\r\n fontSize: '15px',\r\n fontWeight: 600,\r\n letterSpacing: '0.2px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n color: TEXT,\r\n },\r\n titleAccent: {\r\n color: ACCENT,\r\n },\r\n tabs: {\r\n display: 'flex',\r\n gap: '2px',\r\n borderBottom: `1px solid ${BORDER}`,\r\n marginBottom: '14px',\r\n flexWrap: 'wrap' as const,\r\n },\r\n tab: {\r\n background: 'transparent',\r\n border: 'none',\r\n borderBottom: '2px solid transparent',\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n padding: '8px 12px',\r\n cursor: 'pointer',\r\n transition: 'color .15s ease, border-color .15s ease',\r\n },\r\n tabActive: {\r\n color: TEXT,\r\n borderBottomColor: ACCENT,\r\n },\r\n /* Fixed-height content area so every tab renders the same height. */\r\n content: {\r\n height: '600px',\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '12px',\r\n },\r\n form: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '8px',\r\n padding: '12px',\r\n border: `1px solid ${BORDER}`,\r\n borderRadius: '10px',\r\n background: SURFACE,\r\n },\r\n input: {\r\n background: BG,\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT,\r\n font: 'inherit',\r\n fontSize: '13px',\r\n padding: '8px 10px',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n transition: 'border-color .15s ease',\r\n },\r\n textarea: {\r\n background: BG,\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT,\r\n font: 'inherit',\r\n fontSize: '13px',\r\n padding: '8px 10px',\r\n borderRadius: '6px',\r\n minHeight: '48px',\r\n resize: 'vertical' as const,\r\n outline: 'none',\r\n transition: 'border-color .15s ease',\r\n },\r\n actions: {\r\n display: 'flex',\r\n gap: '8px',\r\n flexWrap: 'wrap' as const,\r\n },\r\n actionBtn: {\r\n background: 'transparent',\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '12px',\r\n padding: '4px 10px',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n transition: 'color .15s ease, border-color .15s ease, background .15s ease',\r\n },\r\n dangerBtn: {\r\n borderColor: 'rgba(248,81,73,.4)',\r\n color: DANGER,\r\n },\r\n fileBtn: {\r\n background: 'transparent',\r\n border: `1px dashed ${BORDER}`,\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '12px',\r\n padding: '10px',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n textAlign: 'center' as const,\r\n transition: 'color .15s ease, border-color .15s ease',\r\n },\r\n cliBox: {\r\n border: `1px solid ${BORDER}`,\r\n padding: '10px 12px',\r\n fontSize: '12px',\r\n color: TEXT_MUTED,\r\n background: SURFACE,\r\n borderRadius: '8px',\r\n },\r\n searchInput: {\r\n background: BG,\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '12px',\r\n padding: '7px 10px',\r\n borderRadius: '6px',\r\n width: '100%',\r\n boxSizing: 'border-box' as const,\r\n outline: 'none',\r\n transition: 'border-color .15s ease',\r\n },\r\n scrollBox: {\r\n flex: 1,\r\n overflowY: 'auto' as const,\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '8px',\r\n paddingRight: '6px',\r\n minHeight: '0',\r\n },\r\n wallGrid: {\r\n flex: 1,\r\n overflowY: 'auto' as const,\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(auto-fill, minmax(128px, 1fr))',\r\n gap: '10px',\r\n paddingRight: '6px',\r\n minHeight: '0',\r\n alignContent: 'start' as const,\r\n },\r\n wallCard: {\r\n border: `1px solid ${BORDER}`,\r\n background: SURFACE,\r\n borderRadius: '10px',\r\n overflow: 'hidden',\r\n cursor: 'pointer',\r\n transition: 'border-color .15s ease',\r\n },\r\n wallActive: {\r\n borderColor: ACCENT,\r\n },\r\n wallPreview: {\r\n height: '88px',\r\n backgroundSize: 'cover' as const,\r\n backgroundPosition: 'center' as const,\r\n },\r\n wallName: {\r\n padding: '6px 10px',\r\n fontSize: '12px',\r\n color: TEXT,\r\n },\r\n card: {\r\n border: `1px solid ${BORDER}`,\r\n background: SURFACE,\r\n borderRadius: '10px',\r\n padding: '10px 12px',\r\n transition: 'border-color .15s ease, background .15s ease',\r\n },\r\n cardTop: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: '8px',\r\n },\r\n name: {\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n wordBreak: 'break-all' as const,\r\n color: TEXT,\r\n },\r\n badge: {\r\n fontSize: '11px',\r\n fontWeight: 500,\r\n padding: '2px 10px',\r\n borderRadius: '999px',\r\n flex: 'none',\r\n },\r\n badgeEnabled: { color: SUCCESS, background: 'rgba(63,185,80,.12)' },\r\n badgeDisabled: { color: TEXT_MUTED, background: 'rgba(139,148,158,.12)' },\r\n badgeInstalled: { color: WARN, background: 'rgba(210,153,34,.12)' },\r\n desc: {\r\n fontSize: '12px',\r\n color: TEXT_MUTED,\r\n marginTop: '6px',\r\n lineHeight: '1.5',\r\n },\r\n invokeHint: {\r\n fontSize: '11px',\r\n color: ACCENT,\r\n marginTop: '6px',\r\n fontFamily: MONO,\r\n },\r\n empty: {\r\n fontSize: '12px',\r\n color: TEXT_MUTED,\r\n padding: '12px 0',\r\n textAlign: 'center' as const,\r\n },\r\n error: {\r\n color: DANGER,\r\n fontSize: '12px',\r\n padding: '10px 0',\r\n },\r\n refreshBtn: {\r\n background: 'transparent',\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '12px',\r\n padding: '6px 12px',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n transition: 'color .15s ease, border-color .15s ease',\r\n },\r\n hint: {\r\n color: TEXT_MUTED,\r\n fontSize: '11px',\r\n },\r\n versionBadge: {\r\n fontSize: '11px',\r\n fontWeight: 600,\r\n letterSpacing: '0.3px',\r\n color: ACCENT,\r\n border: `1px solid ${BORDER}`,\r\n borderRadius: '999px',\r\n padding: '2px 10px',\r\n marginLeft: '8px',\r\n background: 'rgba(88,166,255,.08)',\r\n flex: 'none',\r\n },\r\n}\r\n\r\n/** Open-book glyph. */\r\nfunction BookIcon({ size = 16 }: { size?: number }): JSX.Element {\r\n return (\r\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" style={{ flex: 'none' }} aria-hidden=\"true\">\r\n <path d=\"M7.5 3.2C6.2 2.4 4.6 2.2 2.8 2.5c-.5.08-.8.5-.8 1v7.6c0 .4.3.7.7.7 1.7-.2 3.2.1 4.8 1V3.2z\" fill=\"currentColor\" opacity=\"0.55\" />\r\n <path d=\"M8.5 3.2c1.3-.8 2.9-1 4.7-.7.5.08.8.5.8 1v7.6c0 .4-.3.7-.7.7-1.7-.2-3.2.1-4.8 1V3.2z\" fill=\"currentColor\" opacity=\"0.85\" />\r\n <path d=\"M8 3.2v10.3\" stroke=\"currentColor\" strokeWidth=\"0.7\" />\r\n </svg>\r\n )\r\n}\r\n\r\ntype TabKey = 'prompts' | 'skills' | 'mcp' | 'wallpaper' | 'chat' | 'stats'\r\n\r\n/** Bump with every release; keep in sync with package.json version + CHANGELOG. */\r\nconst ARMORY_VERSION = '0.9.8'\r\n\r\n/** Compact duration: 45.2s / 2m42s / 1h05m. */\r\nfunction fmtDuration(ms: number): string {\r\n const s = ms / 1000\r\n if (s < 60) return `${Math.round(s * 10) / 10}s`\r\n const m = Math.floor(s / 60)\r\n if (m < 60) return `${m}m${Math.round(s % 60)}s`\r\n const h = Math.floor(m / 60)\r\n return `${h}h${String(m % 60).padStart(2, '0')}m`\r\n}\r\n\r\n/** Compact token count: 517 / 12.2K / 1.2M. */\r\nfunction fmtTokens(n: number): string {\r\n if (n < 1000) return String(n)\r\n if (n < 1_000_000) return `${Math.round(n / 1000)}K`\r\n return `${Math.round(n / 1_000_000 * 10) / 10}M`\r\n}\r\n\r\n/** USD cost, 4 decimals or compact. */\r\nfunction fmtUsd(n: number): string {\r\n if (n === 0) return '$0'\r\n if (n < 0.0001) return '<$0.0001'\r\n return `$${n.toFixed(4)}`\r\n}\r\n\r\n/** Percent. */\r\nfunction fmtPct(n: number): string {\r\n return `${(n * 100).toFixed(1)}%`\r\n}\r\n\r\ninterface TrendPoint { date: string; steps: number; outputTokens: number; inputTokens: number; cacheReadTokens: number; cacheWriteTokens: number }\r\n\r\n/** SVG line chart with dual axes (steps left, tokens right) + hover tooltip. */\r\nfunction TrendChart({ byDay }: { byDay: TrendPoint[] }): JSX.Element {\r\n const [hover, setHover] = useState<number | null>(null)\r\n const W = 640\r\n const H = 180\r\n const PAD = { l: 38, r: 52, t: 10, b: 22 }\r\n const iw = W - PAD.l - PAD.r\r\n const ih = H - PAD.t - PAD.b\r\n const n = byDay.length\r\n if (n === 0) return <div style={CSS.empty}>暂无趋势数据</div>\r\n\r\n const maxSteps = Math.max(...byDay.map((d) => d.steps), 1)\r\n // All token series share the right axis. Input tokens are typically an\r\n // order of magnitude larger than output, so a linear scale flattens the\r\n // output line into the baseline. A log scale keeps both shapes visible;\r\n // the steps axis on the left stays linear.\r\n const maxTokens = Math.max(\r\n ...byDay.map((d) => d.outputTokens),\r\n ...byDay.map((d) => d.inputTokens),\r\n ...byDay.map((d) => d.cacheReadTokens),\r\n ...byDay.map((d) => d.cacheWriteTokens),\r\n 1,\r\n )\r\n const logBase = Math.max(Math.log10(maxTokens), 1) // at least one decade\r\n const x = (i: number): number => PAD.l + (n === 1 ? iw / 2 : (i / (n - 1)) * iw)\r\n const ySteps = (v: number): number => PAD.t + ih - (v / maxSteps) * ih\r\n const yTok = (v: number): number => {\r\n const vv = Math.max(v, 1)\r\n return PAD.t + ih - (Math.log10(vv) / logBase) * ih\r\n }\r\n\r\n const pathSteps = byDay.map((d, i) => `${i === 0 ? 'M' : 'L'}${x(i).toFixed(1)},${ySteps(d.steps).toFixed(1)}`).join(' ')\r\n const pathOut = byDay.map((d, i) => `${i === 0 ? 'M' : 'L'}${x(i).toFixed(1)},${yTok(d.outputTokens).toFixed(1)}`).join(' ')\r\n const pathIn = byDay.map((d, i) => `${i === 0 ? 'M' : 'L'}${x(i).toFixed(1)},${yTok(d.inputTokens).toFixed(1)}`).join(' ')\r\n\r\n // Right-axis ticks in log space: 0% / 25% / 50% / 75% / 100% of the decade,\r\n // rounded to a nice token count (1 / 2 / 5 stepping).\r\n const tokTicks = [0, 0.25, 0.5, 0.75, 1].map((f) => Math.pow(10, f * logBase))\r\n const niceToken = (v: number): string => {\r\n if (v >= 1e6) return `${(v / 1e6).toFixed(v % 1e6 === 0 ? 0 : 1)}M`\r\n if (v >= 1e3) return `${(v / 1e3).toFixed(v % 1e3 === 0 ? 0 : 1)}k`\r\n return String(Math.round(v))\r\n }\r\n\r\n // gridlines (4)\r\n const grid = [0, 1, 2, 3, 4].map((g) => {\r\n const v = maxSteps * (g / 4)\r\n const yy = ySteps(v)\r\n return { yy, label: g === 0 ? '0' : fmtTokens(v) }\r\n })\r\n\r\n const hovered = hover !== null ? byDay[hover] : undefined\r\n\r\n return (\r\n <div style={{ position: 'relative', width: '100%' }}>\r\n <svg viewBox={`0 0 ${W} ${H}`} width=\"100%\" height=\"180\" onMouseLeave={() => setHover(null)}>\r\n {/* gridlines + left labels */}\r\n {grid.map((g, i) => (\r\n <g key={i}>\r\n <line x1={PAD.l} y1={g.yy} x2={W - PAD.r} y2={g.yy} stroke=\"#21262d\" strokeWidth=\"1\" />\r\n <text x={PAD.l - 5} y={g.yy + 3} textAnchor=\"end\" fontSize=\"9\" fill=\"#8b949e\">{g.label}</text>\r\n </g>\r\n ))}\r\n {/* right tokens axis: 5 rounded ticks + max label */}\r\n {tokTicks.map((v, i) => {\r\n const yy = yTok(v)\r\n return (\r\n <text key={i} x={W - PAD.r + 6} y={yy + 3} fontSize=\"9\" fill={i === 4 ? '#3fb950' : '#8b949e'}>\r\n {niceToken(v)}\r\n </text>\r\n )\r\n })}\r\n {/* x labels (max 7) */}\r\n {byDay.map((d, i) => {\r\n if (n > 7 && i % Math.ceil(n / 7) !== 0 && i !== n - 1) return null\r\n return <text key={i} x={x(i)} y={H - 6} textAnchor=\"middle\" fontSize=\"9\" fill=\"#8b949e\">{d.date.includes(':') ? d.date : d.date.slice(5)}</text>\r\n })}\r\n {/* hover vertical guide */}\r\n {hover !== null && (\r\n <line x1={x(hover)} y1={PAD.t} x2={x(hover)} y2={PAD.t + ih} stroke=\"#58a6ff\" strokeDasharray=\"3 3\" strokeWidth=\"1\" />\r\n )}\r\n {/* data lines */}\r\n <path d={pathIn} fill=\"none\" stroke=\"#58a6ff\" strokeWidth=\"1.6\" opacity=\"0.7\" />\r\n <path d={pathOut} fill=\"none\" stroke=\"#3fb950\" strokeWidth=\"1.8\" />\r\n <path d={pathSteps} fill=\"none\" stroke=\"#d29922\" strokeWidth=\"1.8\" strokeDasharray=\"4 3\" />\r\n {/* always-visible data dots + hover hit areas + value labels */}\r\n {byDay.map((d, i) => (\r\n <g key={i}>\r\n <rect x={x(i) - 10} y={PAD.t} width={20} height={ih} fill=\"transparent\" onMouseEnter={() => setHover(i)} />\r\n <circle cx={x(i)} cy={ySteps(d.steps)} r={hover === i ? 4 : 3} fill=\"#d29922\" stroke=\"#0d1117\" strokeWidth=\"1\" />\r\n <circle cx={x(i)} cy={yTok(d.outputTokens)} r={hover === i ? 4 : 3} fill=\"#3fb950\" stroke=\"#0d1117\" strokeWidth=\"1\" />\r\n <circle cx={x(i)} cy={yTok(d.inputTokens)} r={hover === i ? 4 : 3} fill=\"#58a6ff\" stroke=\"#0d1117\" strokeWidth=\"1\" />\r\n {n <= 4 && (\r\n <>\r\n <text x={x(i)} y={ySteps(d.steps) - 6} textAnchor=\"middle\" fontSize=\"8.5\" fill=\"#d29922\">{d.steps}</text>\r\n <text x={x(i)} y={yTok(d.outputTokens) - 6} textAnchor=\"middle\" fontSize=\"8.5\" fill=\"#3fb950\">{fmtTokens(d.outputTokens)}</text>\r\n <text x={x(i)} y={yTok(d.inputTokens) - 6} textAnchor=\"middle\" fontSize=\"8.5\" fill=\"#58a6ff\">{fmtTokens(d.inputTokens)}</text>\r\n </>\r\n )}\r\n </g>\r\n ))}\r\n </svg>\r\n {/* tooltip */}\r\n {hovered !== undefined && (\r\n <div style={{ position: 'absolute', top: 0, left: Math.min(Math.max(x(hover!) / W * 100, 10), 70) + '%', background: 'rgba(22,27,34,.95)', border: '1px solid #30363d', borderRadius: '8px', padding: '8px 10px', fontSize: '11px', color: '#e6edf3', zIndex: 5, whiteSpace: 'nowrap', boxShadow: '0 4px 14px rgba(0,0,0,.4)' }}>\r\n <div style={{ fontWeight: 600, marginBottom: '4px', color: '#58a6ff' }}>{hovered.date}</div>\r\n <div>步骤:{hovered.steps}</div>\r\n <div>输出:{fmtTokens(hovered.outputTokens)}</div>\r\n <div>输入:{fmtTokens(hovered.inputTokens)}</div>\r\n <div>缓存读:{fmtTokens(hovered.cacheReadTokens)} · 写:{fmtTokens(hovered.cacheWriteTokens)}</div>\r\n </div>\r\n )}\r\n {/* legend */}\r\n <div style={{ display: 'flex', gap: '12px', marginTop: '4px', fontSize: '11px', color: '#8b949e', flexWrap: 'wrap' as const }}>\r\n <span><span style={{ color: '#d29922' }}>—</span> 步骤</span>\r\n <span><span style={{ color: '#3fb950' }}>—</span> 输出 Token</span>\r\n <span><span style={{ color: '#58a6ff' }}>—</span> 输入 Token</span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n\r\n/** Render the Prompt-SkillArmory management page. */\r\nexport function SwitchbladeSection(props: SwitchbladeSectionProps): JSX.Element {\r\n const {\r\n useSwitchblade, t, load,\r\n addPrompt, updatePrompt, setPromptEnabled, setDefaultPrompt, deletePrompt,\r\n installSkill, updateSkill, setSkillEnabled, uninstallSkill,\r\n addMcpServer, updateMcpServer, toggleMcpServer, removeMcpServer, testMcpServer,\r\n refreshSessions,\r\n } = props\r\n const state = useSwitchblade((snapshot: SwitchbladeSectionState) => snapshot)\r\n const [promptName, setPromptName] = useState('')\r\n const [promptDesc, setPromptDesc] = useState('')\r\n const [promptContent, setPromptContent] = useState('')\r\n const [promptScopeType, setPromptScopeType] = useState<'global' | 'project' | 'session'>('global')\r\n const [promptScopeKey, setPromptScopeKey] = useState('')\r\n const [skillName, setSkillName] = useState('')\r\n const [skillDesc, setSkillDesc] = useState('')\r\n const [skillContent, setSkillContent] = useState('')\r\n const [busy, setBusy] = useState(false)\r\n const [pickedFile, setPickedFile] = useState('')\r\n const [promptQuery, setPromptQuery] = useState('')\r\n const [skillQuery, setSkillQuery] = useState('')\r\n const [activeTab, setActiveTab] = useState<TabKey>('prompts')\r\n const [editingPromptId, setEditingPromptId] = useState<string | undefined>()\r\n const [editingSkillName, setEditingSkillName] = useState<string | undefined>()\r\n // MCP form state\r\n const [mcpName, setMcpName] = useState('')\r\n const [mcpTransport, setMcpTransport] = useState<'stdio' | 'streamable-http'>('stdio')\r\n const [mcpCommand, setMcpCommand] = useState('')\r\n const [mcpArgs, setMcpArgs] = useState('')\r\n const [mcpEnv, setMcpEnv] = useState('')\r\n const [mcpUrl, setMcpUrl] = useState('')\r\n const [mcpHeaders, setMcpHeaders] = useState('')\r\n const [editingMcpName, setEditingMcpName] = useState<string | undefined>()\r\n\r\n useEffect(() => {\r\n void load()\r\n }, [load])\r\n\r\n const refresh = (): void => {\r\n void load()\r\n }\r\n\r\n /** Parse newline-separated `KEY=VALUE` lines into a record. */\r\n const parseKv = (text: string): Record<string, string> => {\r\n const out: Record<string, string> = {}\r\n for (const line of text.split('\\n')) {\r\n const idx = line.indexOf('=')\r\n if (idx <= 0) continue\r\n const key = line.slice(0, idx).trim()\r\n const value = line.slice(idx + 1).trim()\r\n if (key !== '') out[key] = value\r\n }\r\n return out\r\n }\r\n\r\n /** Submit the MCP server form (add or update). */\r\n const submitMcpServer = (): void => {\r\n if (mcpName.trim() === '') return\r\n setBusy(true)\r\n const base = { serverName: mcpName.trim(), transport: mcpTransport, enabled: true }\r\n const config = mcpTransport === 'stdio'\r\n ? {\r\n ...base,\r\n command: mcpCommand.trim(),\r\n args: mcpArgs.trim() ? mcpArgs.trim().split(/\\s+/) : [],\r\n env: parseKv(mcpEnv),\r\n }\r\n : { ...base, url: mcpUrl.trim(), headers: parseKv(mcpHeaders) }\r\n const action = editingMcpName !== undefined\r\n ? updateMcpServer(editingMcpName, config)\r\n : addMcpServer(config)\r\n void action\r\n .catch((error: unknown) => console.error('[switchblade] mcp save failed', error))\r\n .finally(() => {\r\n setBusy(false)\r\n setMcpName(''); setMcpCommand(''); setMcpArgs(''); setMcpEnv(''); setMcpUrl(''); setMcpHeaders('')\r\n setEditingMcpName(undefined)\r\n })\r\n }\r\n\r\n /** Load one MCP server into the edit form. */\r\n const startEditMcpServer = (server: McpServerRow): void => {\r\n setEditingMcpName(server.serverName)\r\n setMcpName(server.serverName)\r\n setMcpTransport(server.transport)\r\n setMcpCommand(server.command ?? '')\r\n setMcpArgs((server.args ?? []).join(' '))\r\n setMcpEnv(Object.entries(server.env ?? {}).map(([k, v]) => `${k}=${v}`).join('\\n'))\r\n setMcpUrl(server.url ?? '')\r\n setMcpHeaders(Object.entries(server.headers ?? {}).map(([k, v]) => `${k}=${v}`).join('\\n'))\r\n }\r\n\r\n // Background / effects draft + handlers (persisted via backgroundClient\r\n // route; live preview through applyBackground / applyBackgroundKnob).\r\n const [bgDraft, setBgDraft] = useState<BackgroundSettings>(DEFAULT_BACKGROUND)\r\n\r\n // Conversation import/export state\r\n const [chatRows, setChatRows] = useState<ConversationRow[]>([])\r\n const [chatSelected, setChatSelected] = useState<Set<string>>(new Set())\r\n const [chatTarget, setChatTarget] = useState('')\r\n const [chatProject, setChatProject] = useState('')\r\n const [chatBusy, setChatBusy] = useState(false)\r\n const [chatMsg, setChatMsg] = useState('')\r\n // Update availability\r\n const [latestVer, setLatestVer] = useState('')\r\n const [updating, setUpdating] = useState(false)\r\n const [updateMsg, setUpdateMsg] = useState('')\r\n // Usage stats\r\n const [stats, setStats] = useState<UsageStats | null>(null)\r\n const [statsRange, setStatsRange] = useState('all')\r\n const [statsUpdatedAt, setStatsUpdatedAt] = useState(0)\r\n\r\n // Live refresh: poll the current range every 30s while the stats tab is open\r\n // (the host caches for 4s, so polling is cheap). Keeps the chart and totals\r\n // tracking the latest usage for today/7d/30d/all alike.\r\n const reloadStats = async (): Promise<void> => {\r\n const s = await fetchStats(statsRange)\r\n if (s !== null) { setStats(s); setStatsUpdatedAt(Date.now()) }\r\n }\r\n const changeStatsRange = (r: string): void => {\r\n setStatsRange(r)\r\n void fetchStats(r).then((s) => { if (s !== null) { setStats(s); setStatsUpdatedAt(Date.now()) } })\r\n }\r\n useEffect(() => {\r\n if (activeTab !== 'stats') return\r\n const timer = setInterval(() => { void reloadStats() }, 30000)\r\n return () => clearInterval(timer)\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [activeTab, statsRange])\r\n\r\n useEffect(() => {\r\n void checkLatestVersion().then((v) => { if (v !== '') setLatestVer(v) })\r\n }, [])\r\n\r\n const reloadChat = async (): Promise<void> => {\r\n setChatRows(await listConversations())\r\n }\r\n\r\n useEffect(() => { void reloadChat() }, [])\r\n\r\n const toggleChatSel = (id: string): void => {\r\n setChatSelected((prev) => { const n = new Set(prev); if (n.has(id)) n.delete(id); else n.add(id); return n })\r\n }\r\n\r\n // Deduplicated project workspaces (projectKey + display name from cwd basename).\r\n const chatProjects = useMemo(() => {\r\n const byKey = new Map<string, string>()\r\n for (const row of chatRows) {\r\n const name = row.cwd ? row.cwd.split(/[\\\\/]/).filter(Boolean).pop() ?? row.projectKey : row.projectKey\r\n if (!byKey.has(row.projectKey)) byKey.set(row.projectKey, name)\r\n }\r\n return [...byKey.entries()].map(([key, name]) => ({ key, name })).sort((a, b) => a.name.localeCompare(b.name))\r\n }, [chatRows])\r\n\r\n // Keep the selected project valid as rows load.\r\n useEffect(() => {\r\n if (chatProject === '' && chatProjects.length > 0) setChatProject(chatProjects[0].key)\r\n else if (chatProject !== '' && !chatProjects.some((p) => p.key === chatProject)) setChatProject(chatProjects[0]?.key ?? '')\r\n }, [chatProjects, chatProject])\r\n\r\n const doExportChat = async (): Promise<void> => {\r\n setChatBusy(true); setChatMsg('')\r\n try {\r\n const name = await exportConversations([...chatSelected])\r\n if (name === null) { setChatMsg('导出失败'); return }\r\n const ok = await downloadExport(name)\r\n setChatMsg(ok ? `已导出 ${name}` : '导出失败:下载未完成')\r\n } catch { setChatMsg('导出失败') } finally { setChatBusy(false) }\r\n }\r\n\r\n const doExportProject = async (): Promise<void> => {\r\n const key = chatProject.trim()\r\n if (key === '') { setChatMsg('请先选择项目工作区'); return }\r\n setChatBusy(true); setChatMsg('')\r\n try {\r\n const name = await exportConversations([], key)\r\n if (name === null) { setChatMsg('导出失败'); return }\r\n const ok = await downloadExport(name)\r\n setChatMsg(ok ? `已导出整个项目 ${key} → ${name}` : '导出失败:下载未完成')\r\n } catch { setChatMsg('导出失败') } finally { setChatBusy(false) }\r\n }\r\n\r\n const doUpdate = async (): Promise<void> => {\r\n setUpdating(true); setUpdateMsg('')\r\n const r = await runUpdate()\r\n setUpdateMsg(r.ok ? '更新完成,请重启客户端生效' : (r.error !== undefined && r.error !== '' ? `更新失败:${r.error.slice(0, 300)}` : '更新失败'))\r\n setUpdating(false)\r\n }\r\n\r\n const onChatFile = async (file: File | undefined): Promise<void> => {\r\n if (file === undefined) return\r\n setChatBusy(true); setChatMsg('')\r\n try {\r\n const n = await importConversations(file, chatTarget.trim() || undefined)\r\n setChatMsg(n === null ? '导入失败' : `已导入 ${n} 个对话,重启客户端后生效`)\r\n if (n !== null) { refreshSessions(); await reloadChat() }\r\n } catch { setChatMsg('导入失败') } finally { setChatBusy(false) }\r\n }\r\n\r\n const doDeleteChat = async (): Promise<void> => {\r\n const ids = [...chatSelected]\r\n if (ids.length === 0) return\r\n if (!window.confirm(`确定删除选中的 ${ids.length} 个对话吗?此操作不可恢复。`)) return\r\n setChatBusy(true); setChatMsg('')\r\n try {\r\n const r = await deleteConversations(ids)\r\n if (r === null) { setChatMsg('删除失败'); return }\r\n setChatSelected(new Set())\r\n const failMsg = r.failed.length > 0 ? `;${r.failed.length} 个删除失败(文件可能被占用,可稍后重试)` : ''\r\n setChatMsg(`已删除 ${r.deleted} 个对话${failMsg}`)\r\n refreshSessions()\r\n await reloadChat()\r\n } catch { setChatMsg('删除失败') } finally { setChatBusy(false) }\r\n }\r\n\r\n useEffect(() => {\r\n const snap = backgroundClient.getSnapshot()\r\n if (snap.status === 'ready') {\r\n setBgDraft({ ...snap.value })\r\n applyBackground(snap.value)\r\n }\r\n }, [])\r\n\r\n const saveBackground = (draft: BackgroundSettings): void => {\r\n void backgroundClient.save(draft)\r\n }\r\n const resetBackground = (): void => {\r\n const d = { ...DEFAULT_BACKGROUND }\r\n setBgDraft(d); applyBackground(d); void backgroundClient.save(d)\r\n }\r\n const updateBgLive = (patch: Partial<BackgroundSettings>): void => {\r\n setBgDraft((prev) => {\r\n const next = { ...prev, ...patch }\r\n applyBackground(next)\r\n void backgroundClient.save(next)\r\n return next\r\n })\r\n }\r\n const bgSlider = (label: string, key: 'opacity' | 'scrim' | 'panelOpacity' | 'blur' | 'wallpaperBlur', min: number, max: number, step: number): JSX.Element => (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>{label}</span>\r\n <input type=\"range\" min={min} max={max} step={step}\r\n value={bgDraft[key] as number}\r\n onChange={(e) => updateBgLive({ [key]: Number(e.target.value) } as Partial<BackgroundSettings>)}\r\n style={{ flex: 1 }} />\r\n <span style={{ ...CSS.hint, width: '34px', textAlign: 'right' as const }}>{Math.round((bgDraft[key] as number) * 100)}</span>\r\n </div>\r\n )\r\n\r\n /** Read a local skill .md file into the import form. */\r\n const onSkillFile = (file: File | undefined): void => {\r\n if (file === undefined) return\r\n setPickedFile(file.name)\r\n void file.text().then((text) => {\r\n const first = text.split('\\n')[0]?.trim() ?? ''\r\n const nameMatch = /^#\\s+([a-z0-9][a-z0-9-]*)$/i.exec(first)\r\n if (nameMatch !== null) setSkillName(nameMatch[1]?.toLowerCase() ?? '')\r\n setSkillContent(text.trim())\r\n const descLine = text.split('\\n').find((l) => l.startsWith('> '))\r\n if (descLine !== undefined) setSkillDesc(descLine.slice(2).trim())\r\n }).catch((error: unknown) => console.error('[switchblade] read skill file failed', error))\r\n }\r\n\r\n const submitPrompt = (): void => {\r\n if (promptName.trim() === '' || promptContent.trim() === '') return\r\n setBusy(true)\r\n const scope = promptScopeType === 'global'\r\n ? undefined\r\n : promptScopeType === 'project'\r\n ? { type: 'project' as const, key: promptScopeKey.trim() }\r\n : { type: 'session' as const, id: promptScopeKey.trim() }\r\n const action = editingPromptId !== undefined\r\n ? updatePrompt(editingPromptId, { name: promptName, description: promptDesc, content: promptContent, scope })\r\n : addPrompt({ name: promptName, description: promptDesc, content: promptContent, scope })\r\n void action\r\n .catch((error: unknown) => console.error('[switchblade] prompt save failed', error))\r\n .finally(() => {\r\n setBusy(false)\r\n setPromptName(''); setPromptDesc(''); setPromptContent('')\r\n setPromptScopeType('global'); setPromptScopeKey('')\r\n setEditingPromptId(undefined)\r\n })\r\n }\r\n\r\n const startEditPrompt = (row: { promptId: string; name: string; desc: string; content?: string; scope?: { type: string; key?: string; id?: string } }): void => {\r\n setEditingPromptId(row.promptId)\r\n setPromptName(row.name)\r\n setPromptDesc(row.desc)\r\n setPromptContent(row.content ?? '')\r\n const s = row.scope\r\n if (s !== undefined && (s.type === 'project' || s.type === 'session')) {\r\n setPromptScopeType(s.type)\r\n setPromptScopeKey(s.type === 'project' ? (s.key ?? '') : (s.id ?? ''))\r\n } else {\r\n setPromptScopeType('global'); setPromptScopeKey('')\r\n }\r\n }\r\n\r\n const togglePrompt = (id: string, enabled: boolean): void => {\r\n void setPromptEnabled(id, enabled).catch((error: unknown) => console.error('[switchblade] toggle failed', error))\r\n }\r\n\r\n const markDefault = (id: string): void => {\r\n void setDefaultPrompt(id).catch((error: unknown) => console.error('[switchblade] setDefault failed', error))\r\n }\r\n\r\n const removePrompt = (id: string): void => {\r\n void deletePrompt(id).catch((error: unknown) => console.error('[switchblade] delete failed', error))\r\n }\r\n\r\n const submitSkill = (): void => {\r\n if (skillName.trim() === '' || skillContent.trim() === '') return\r\n setBusy(true)\r\n const action = editingSkillName !== undefined\r\n ? updateSkill(editingSkillName, { name: skillName, description: skillDesc, content: skillContent })\r\n : installSkill({ name: skillName, description: skillDesc, content: skillContent })\r\n void action\r\n .catch((error: unknown) => console.error('[switchblade] skill save failed', error))\r\n .finally(() => {\r\n setBusy(false)\r\n setSkillName(''); setSkillDesc(''); setSkillContent('')\r\n setEditingSkillName(undefined)\r\n })\r\n }\r\n\r\n const startEditSkill = (row: { installedName: string; name: string; desc: string }): void => {\r\n const found = state.installedSkills.find((s) => s.name === row.installedName)\r\n setEditingSkillName(row.installedName)\r\n setSkillName(row.name)\r\n setSkillDesc(row.desc)\r\n setSkillContent(found?.content ?? '')\r\n }\r\n\r\n const toggleSkill = (name: string, enabled: boolean): void => {\r\n void setSkillEnabled(name, enabled).catch((error: unknown) => console.error('[switchblade] toggle skill failed', error))\r\n }\r\n\r\n const removeSkill = (name: string): void => {\r\n void uninstallSkill(name).catch((error: unknown) => console.error('[switchblade] uninstall failed', error))\r\n }\r\n\r\n /** Adopt a scanned (local) skill into the managed list. */\r\n const adoptSkill = (name: string): void => {\r\n const found = state.skills.find((s) => s.name === name)\r\n if (found === undefined) return\r\n void installSkill({ name: found.name, description: found.description, content: `# ${found.name}\\n\\n${found.description}` })\r\n .catch((error: unknown) => console.error('[switchblade] adopt skill failed', error))\r\n }\r\n\r\n const promptRows = state.prompts.map((p) => ({\r\n id: p.id, name: p.name, desc: p.description, state: p.enabled ? ('enabled' as const) : ('disabled' as const),\r\n promptId: p.id, isDefault: p.isDefault, content: p.content, promptEnabled: p.enabled, scope: p.scope,\r\n }))\r\n\r\n // Merge managed + scanned skills into ONE list, managed first.\r\n const managedNames = new Set(state.installedSkills.map((s) => s.name))\r\n const managedRows = state.installedSkills.map((s) => ({\r\n key: `m-${s.name}`, name: s.name, desc: s.description,\r\n state: s.enabled ? ('enabled' as const) : ('disabled' as const),\r\n installedName: s.name, skillEnabled: s.enabled, source: 'managed' as const,\r\n }))\r\n const scannedRows = state.skills\r\n .filter((s) => !managedNames.has(s.name))\r\n .map((s) => ({\r\n key: `s-${s.name}`, name: s.name, desc: s.description,\r\n state: ('installed' as const), installedName: s.name, skillEnabled: false, source: 'scanned' as const,\r\n }))\r\n const allSkillRows = [...managedRows, ...scannedRows]\r\n\r\n const match = (row: { name: string; desc: string }, q: string): boolean => {\r\n const query = q.trim().toLowerCase()\r\n if (query === '') return true\r\n return row.name.toLowerCase().includes(query) || row.desc.toLowerCase().includes(query)\r\n }\r\n const filteredPrompts = promptRows.filter((r) => match(r, promptQuery))\r\n const filteredSkills = allSkillRows.filter((r) => match(r, skillQuery))\r\n\r\n const badge = (state: 'enabled' | 'disabled' | 'installed'): CSSProperties => (\r\n state === 'enabled' ? CSS.badgeEnabled! : state === 'disabled' ? CSS.badgeDisabled! : CSS.badgeInstalled!\r\n )\r\n const label = (state: 'enabled' | 'disabled' | 'installed'): string => (\r\n state === 'enabled' ? t('enabled') : state === 'disabled' ? t('disabled') : t('installed')\r\n )\r\n\r\n return (\r\n <div style={CSS.root}>\r\n <div style={CSS.head}>\r\n <div style={CSS.title}>\r\n <BookIcon size={16} /> <span style={CSS.titleAccent}>Armory</span>\r\n <span style={CSS.versionBadge}>v{ARMORY_VERSION}</span>\r\n {latestVer !== '' && isOlder(ARMORY_VERSION, latestVer) && (\r\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px', marginLeft: '8px' }}>\r\n <button style={{ ...CSS.actionBtn, ...CSS.badgeEnabled, fontSize: '11px', padding: '2px 8px' }} disabled={updating} onClick={() => void doUpdate()}>\r\n {updating ? '更新中…' : `↑ v${latestVer} 更新`}\r\n </button>\r\n {updateMsg !== '' && <span style={{ ...CSS.hint, whiteSpace: 'nowrap' as const }}>{updateMsg.slice(0, 60)}</span>}\r\n </span>\r\n )}\r\n </div>\r\n <button style={CSS.refreshBtn} onClick={refresh}>{t('refresh')}</button>\r\n </div>\r\n\r\n {state.status === 'error' && <div style={CSS.error}>✖ {t('loadFailed')}: {state.message}</div>}\r\n\r\n {/* Tab bar */}\r\n <div style={CSS.tabs}>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'prompts' ? CSS.tabActive : {}) }} onClick={() => setActiveTab('prompts')}>\r\n {t('promptsTitle')} ({state.status === 'loading' ? '…' : promptRows.length})\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'skills' ? CSS.tabActive : {}) }} onClick={() => setActiveTab('skills')}>\r\n {t('installSkill')} ({state.status === 'loading' ? '…' : allSkillRows.length})\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'mcp' ? CSS.tabActive : {}) }} onClick={() => setActiveTab('mcp')}>\r\n MCP ({state.status === 'loading' ? '…' : state.mcpServers.length})\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'wallpaper' ? CSS.tabActive : {}) }} onClick={() => setActiveTab('wallpaper')}>\r\n Wallpaper\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'chat' ? CSS.tabActive : {}) }} onClick={() => { setActiveTab('chat'); void reloadChat() }}>\r\n 对话 ({chatRows.length})\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'stats' ? CSS.tabActive : {}) }} onClick={() => { setActiveTab('stats'); void reloadStats() }}>\r\n 统计\r\n </button>\r\n </div>\r\n\r\n {/* Fixed-height content area — every tab renders the same height. */}\r\n <div style={CSS.content}>\r\n {/* ── Tab: prompts ─────────────────────────────────────── */}\r\n {activeTab === 'prompts' && (\r\n <>\r\n <div style={CSS.form}>\r\n <input style={CSS.input} placeholder={t('promptNamePlaceholder')} value={promptName} onChange={(e) => setPromptName(e.target.value)} />\r\n <input style={CSS.input} placeholder={t('promptDescPlaceholder')} value={promptDesc} onChange={(e) => setPromptDesc(e.target.value)} />\r\n <textarea style={CSS.textarea} placeholder={t('promptContentPlaceholder')} value={promptContent} onChange={(e) => setPromptContent(e.target.value)} />\r\n <div style={{ display: 'flex', gap: '6px', alignItems: 'center', flexWrap: 'wrap' as const }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>作用域</span>\r\n {(['global', 'project', 'session'] as const).map((st) => (\r\n <button key={st} style={{ ...CSS.actionBtn, ...(promptScopeType === st ? CSS.tabActive : {}) }}\r\n onClick={() => setPromptScopeType(st)}>\r\n {st === 'global' ? '全局' : st === 'project' ? '指定项目' : '指定会话'}\r\n </button>\r\n ))}\r\n {promptScopeType !== 'global' && (\r\n <input style={{ ...CSS.input, maxWidth: '240px', flex: 1, minWidth: '120px' }}\r\n placeholder={promptScopeType === 'project' ? '项目目录名(如 qc)' : '会话 id(session-…)'}\r\n value={promptScopeKey}\r\n onChange={(e) => setPromptScopeKey(e.target.value)} />\r\n )}\r\n </div>\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} disabled={busy} onClick={submitPrompt}>\r\n {editingPromptId !== undefined ? t('save') : t('addPrompt')}\r\n </button>\r\n {editingPromptId !== undefined && (\r\n <button style={CSS.actionBtn} onClick={() => { setEditingPromptId(undefined); setPromptName(''); setPromptDesc(''); setPromptContent(''); setPromptScopeType('global'); setPromptScopeKey('') }}>{t('cancel')}</button>\r\n )}\r\n </div>\r\n </div>\r\n <input style={CSS.searchInput} placeholder={t('searchPlaceholder')} value={promptQuery} onChange={(e) => setPromptQuery(e.target.value)} />\r\n <div style={CSS.scrollBox}>\r\n {filteredPrompts.length === 0\r\n ? <div style={CSS.empty}>{t('empty')}</div>\r\n : filteredPrompts.map((row) => (\r\n <div key={row.id} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={CSS.name}>{row.isDefault ? '★ ' : ''}{row.name}</div>\r\n <span style={{ ...CSS.badge, ...row.state === 'enabled' ? CSS.badgeEnabled : CSS.badgeDisabled }}>\r\n {row.state === 'enabled' ? t('enabled') : t('disabled')}\r\n </span>\r\n {row.scope !== undefined && row.scope.type !== 'global' && (\r\n <span style={{ ...CSS.badge, ...CSS.badgeInstalled }}>\r\n {row.scope.type === 'project' ? `项目:${row.scope.key}` : `会话:${row.scope.id.slice(0, 12)}…`}\r\n </span>\r\n )}\r\n </div>\r\n <div style={CSS.desc}>{row.desc || row.content?.slice(0, 80)}</div>\r\n <div style={CSS.actions}>\r\n {!row.isDefault && <button style={CSS.actionBtn} onClick={() => markDefault(row.promptId!)}>{t('setDefault')}</button>}\r\n <button style={CSS.actionBtn} onClick={() => togglePrompt(row.promptId!, !row.promptEnabled)}>\r\n {row.state === 'enabled' ? t('disable') : t('enable')}\r\n </button>\r\n <button style={CSS.actionBtn} onClick={() => startEditPrompt(row)}>{t('edit')}</button>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={() => removePrompt(row.promptId!)}>{t('delete')}</button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: skills (merged managed + scanned) ───────────── */}\r\n {activeTab === 'skills' && (\r\n <>\r\n <div style={CSS.form}>\r\n <label style={CSS.fileBtn}>\r\n {pickedFile !== '' ? `📄 ${pickedFile}` : t('pickSkillFile')}\r\n <input type=\"file\" accept=\".md,.markdown,text/markdown,text/plain\" style={{ display: 'none' }} onChange={(e) => onSkillFile(e.target.files?.[0])} />\r\n </label>\r\n <input style={CSS.input} placeholder={t('skillNamePlaceholder')} value={skillName} onChange={(e) => setSkillName(e.target.value)} />\r\n <input style={CSS.input} placeholder={t('skillDescPlaceholder')} value={skillDesc} onChange={(e) => setSkillDesc(e.target.value)} />\r\n <textarea style={CSS.textarea} placeholder={t('skillContentPlaceholder')} value={skillContent} onChange={(e) => setSkillContent(e.target.value)} />\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} disabled={busy} onClick={submitSkill}>\r\n {editingSkillName !== undefined ? t('save') : t('addSkill')}\r\n </button>\r\n {editingSkillName !== undefined && (\r\n <button style={CSS.actionBtn} onClick={() => { setEditingSkillName(undefined); setSkillName(''); setSkillDesc(''); setSkillContent('') }}>{t('cancel')}</button>\r\n )}\r\n </div>\r\n </div>\r\n <div style={CSS.cliBox}>\r\n <div style={{ marginBottom: '4px' }}>{t('cliHint')}</div>\r\n <code style={{ fontSize: '11px', color: ACCENT, fontFamily: MONO }}>/armory-skill-dir &lt;目录&gt; · /armory-install-zip &lt;zip路径&gt;</code>\r\n </div>\r\n <input style={CSS.searchInput} placeholder={t('searchPlaceholder')} value={skillQuery} onChange={(e) => setSkillQuery(e.target.value)} />\r\n <div style={CSS.scrollBox}>\r\n {filteredSkills.length === 0\r\n ? <div style={CSS.empty}>{t('empty')}</div>\r\n : filteredSkills.map((row) => (\r\n <div key={row.key} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={CSS.name}>{row.name}</div>\r\n <span style={{ ...CSS.badge, ...badge(row.state) }}>{label(row.state)}</span>\r\n </div>\r\n <div style={CSS.desc}>{row.desc}</div>\r\n <div style={CSS.invokeHint}>/ {row.name}</div>\r\n <div style={CSS.actions}>\r\n {row.source === 'scanned' ? (\r\n <button style={CSS.actionBtn} onClick={() => adoptSkill(row.name)}>{t('manage')}</button>\r\n ) : (\r\n <>\r\n <button style={CSS.actionBtn} onClick={() => toggleSkill(row.installedName!, !row.skillEnabled)}>\r\n {row.state === 'enabled' ? t('disable') : t('enable')}\r\n </button>\r\n <button style={CSS.actionBtn} onClick={() => startEditSkill(row)}>{t('edit')}</button>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={() => removeSkill(row.installedName!)}>{t('uninstall')}</button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: MCP servers ─────────────────────────────────── */}\r\n {activeTab === 'mcp' && (\r\n <>\r\n <div style={CSS.form}>\r\n <input style={CSS.input} placeholder=\"服务器名称 (serverName)\" value={mcpName} onChange={(e) => setMcpName(e.target.value)} />\r\n <div style={CSS.actions}>\r\n <button style={{ ...CSS.actionBtn, ...(mcpTransport === 'stdio' ? CSS.tabActive : {}) }} onClick={() => setMcpTransport('stdio')}>stdio</button>\r\n <button style={{ ...CSS.actionBtn, ...(mcpTransport === 'streamable-http' ? CSS.tabActive : {}) }} onClick={() => setMcpTransport('streamable-http')}>HTTP</button>\r\n </div>\r\n {mcpTransport === 'stdio' ? (\r\n <>\r\n <input style={CSS.input} placeholder=\"命令 (command, 如 npx)\" value={mcpCommand} onChange={(e) => setMcpCommand(e.target.value)} />\r\n <input style={CSS.input} placeholder=\"参数 (args, 空格分隔)\" value={mcpArgs} onChange={(e) => setMcpArgs(e.target.value)} />\r\n <textarea style={CSS.textarea} placeholder=\"环境变量 (env, 每行 KEY=VALUE)\" value={mcpEnv} onChange={(e) => setMcpEnv(e.target.value)} />\r\n </>\r\n ) : (\r\n <>\r\n <input style={CSS.input} placeholder=\"URL (如 http://localhost:3000/mcp)\" value={mcpUrl} onChange={(e) => setMcpUrl(e.target.value)} />\r\n <textarea style={CSS.textarea} placeholder=\"请求头 (headers, 每行 KEY=VALUE)\" value={mcpHeaders} onChange={(e) => setMcpHeaders(e.target.value)} />\r\n </>\r\n )}\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} disabled={busy} onClick={submitMcpServer}>\r\n {editingMcpName !== undefined ? '保存' : '添加'}\r\n </button>\r\n {editingMcpName !== undefined && (\r\n <button style={CSS.actionBtn} onClick={() => { setEditingMcpName(undefined); setMcpName(''); setMcpCommand(''); setMcpArgs(''); setMcpEnv(''); setMcpUrl(''); setMcpHeaders('') }}>取消</button>\r\n )}\r\n </div>\r\n </div>\r\n <div style={CSS.scrollBox}>\r\n {state.mcpServers.length === 0\r\n ? <div style={CSS.empty}>暂无 MCP 服务器</div>\r\n : state.mcpServers.map((server) => (\r\n <div key={server.serverName} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={CSS.name}>{server.serverName}</div>\r\n <span style={{ ...CSS.badge, ...(server.enabled ? CSS.badgeEnabled : CSS.badgeDisabled) }}>\r\n {server.enabled ? '启用' : '停用'}\r\n </span>\r\n </div>\r\n <div style={CSS.desc}>\r\n {server.transport}{server.transport === 'stdio' ? ` · ${server.command ?? ''}` : ` · ${server.url ?? ''}`}\r\n {' · '}{server.running ? `运行中 (${server.tools?.length ?? 0} 工具)` : '未运行'}\r\n </div>\r\n {server.lastError !== undefined && server.lastError !== '' && (\r\n <div style={{ ...CSS.error, marginTop: '4px' }}>✖ {server.lastError}</div>\r\n )}\r\n {(server.tools?.length ?? 0) > 0 && (\r\n <div style={{ marginTop: '6px', display: 'flex', flexDirection: 'column', gap: '2px' }}>\r\n {server.tools!.map((tool) => (\r\n <div key={tool.name} style={{ fontSize: '11px', color: ACCENT, fontFamily: MONO, wordBreak: 'break-all' as const }}>\r\n {tool.name}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} onClick={() => toggleMcpServer(server.serverName, !server.enabled)}>\r\n {server.enabled ? '停用' : '启用'}\r\n </button>\r\n <button style={CSS.actionBtn} onClick={() => testMcpServer(server.serverName)}>测试</button>\r\n <button style={CSS.actionBtn} onClick={() => startEditMcpServer(server)}>编辑</button>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={() => removeMcpServer(server.serverName)}>删除</button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: global background & effects ──────────────── */}\r\n {activeTab === 'wallpaper' && (\r\n <>\r\n <div style={CSS.form}>\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <span style={{ fontSize: '13px', fontWeight: 600, color: isDesktopSurface ? '#7ee787' : '#79c0ff' }}>\r\n {isDesktopSurface ? '桌面客户端 · 全局壁纸' : '网页 · 全局壁纸'}\r\n </span>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={resetBackground}>重置</button>\r\n </div>\r\n <div onClick={() => { const d = { ...bgDraft, enabled: !bgDraft.enabled }; setBgDraft(d); applyBackground(d); void backgroundClient.save(d) }}\r\n role=\"switch\" aria-checked={bgDraft.enabled}\r\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', padding: '10px 12px', borderRadius: '8px', border: `1px solid ${bgDraft.enabled ? '#238636' : '#30363d'}`, background: bgDraft.enabled ? 'rgba(35,134,54,0.22)' : '#161b22' }}>\r\n <span style={{ fontSize: '13px', fontWeight: 600, color: bgDraft.enabled ? '#7ee787' : '#8b949e' }}>启用壁纸</span>\r\n <span style={{ flex: 1 }} />\r\n <span style={{ width: '40px', height: '22px', borderRadius: '999px', background: bgDraft.enabled ? '#3fb950' : '#30363d', position: 'relative', flex: 'none', transition: 'background .15s ease' }}>\r\n <span style={{ position: 'absolute', top: '2px', left: bgDraft.enabled ? 20 : 2, width: '18px', height: '18px', borderRadius: '50%', background: '#fff', transition: 'left .15s ease' }} />\r\n </span>\r\n </div>\r\n\r\n <label style={CSS.fileBtn}>\r\n 🖼 上传本地壁纸(图片 / 视频,存盘不撑爆配置)\r\n <input type=\"file\" accept=\"image/*,video/*\" style={{ display: 'none' }} onChange={async (e) => {\r\n const f = e.target.files?.[0]\r\n if (f === undefined) return\r\n const up = await uploadMedia(f)\r\n if (up !== null) { const d = { ...bgDraft, uploadId: up.id, kind: up.kind, url: '' }; setBgDraft(d); applyBackground(d); void backgroundClient.save(d) }\r\n e.target.value = ''\r\n }} />\r\n </label>\r\n <input style={CSS.input} placeholder=\"图片 URL(https://…,留空则无壁纸)\" value={bgDraft.url}\r\n onChange={(e) => setBgDraft({ ...bgDraft, url: e.target.value })}\r\n onBlur={() => { if (bgDraft.url.trim() !== '') { applyBackground(bgDraft); void backgroundClient.save(bgDraft) } }}\r\n onKeyDown={(e) => { if (e.key === 'Enter' && bgDraft.url.trim() !== '') { applyBackground(bgDraft); void backgroundClient.save(bgDraft) } }} />\r\n\r\n {(bgDraft.uploadId !== '' || bgDraft.url.trim() !== '') && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', fontSize: '12px', color: '#58a6ff' }}>\r\n <span>已选择:{bgDraft.kind === 'video' ? '🎬 视频' : '🖼 图片'}{bgDraft.uploadId !== '' ? '(本地上传)' : '(链接)'}</span>\r\n <span style={{ flex: 1 }} />\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={() => { const d = { ...bgDraft, uploadId: '', url: '' }; setBgDraft(d); applyBackground(d); void backgroundClient.save(d) }}>清除</button>\r\n </div>\r\n )}\r\n\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginTop: '2px' }}>\r\n <span style={{ fontSize: '12px', fontWeight: 600, color: '#e6edf3' }}>样式</span>\r\n <div style={{ flex: 1, height: '1px', background: '#30363d' }} />\r\n </div>\r\n {bgSlider('图片透明度', 'opacity', 0, 1, 0.05)}\r\n {bgSlider('遮罩', 'scrim', 0, 1, 0.05)}\r\n {bgSlider('面板透明度', 'panelOpacity', 0, 1, 0.05)}\r\n {bgSlider('玻璃模糊', 'blur', 0, 40, 1)}\r\n {bgSlider('壁纸模糊', 'wallpaperBlur', 0, 40, 1)}\r\n\r\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>铺法</span>\r\n {(['cover', 'contain'] as const).map((f) => (\r\n <button key={f} style={{ ...CSS.actionBtn, ...(bgDraft.fit === f ? CSS.tabActive : {}) }}\r\n onClick={() => updateBgLive({ fit: f })}>{f === 'cover' ? '铺满' : '适应'}</button>\r\n ))}\r\n </div>\r\n\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginTop: '4px' }}>\r\n <span style={{ fontSize: '12px', fontWeight: 600, color: '#e6edf3' }}>输入框下方提示样式</span>\r\n <div style={{ flex: 1, height: '1px', background: '#30363d' }} />\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>启用</span>\r\n <button style={{ ...CSS.actionBtn, ...(bgDraft.hint.enabled ? CSS.badgeEnabled : {}) }} onClick={() => updateBgLive({ hint: { ...bgDraft.hint, enabled: !bgDraft.hint.enabled } })}>\r\n {bgDraft.hint.enabled ? '已启用' : '已停用'}\r\n </button>\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>颜色</span>\r\n <input type=\"color\" value={bgDraft.hint.color} onChange={(e) => updateBgLive({ hint: { ...bgDraft.hint, color: e.target.value } })} style={{ flex: 'none', width: '34px', height: '26px', border: 'none', background: 'transparent', padding: 0 }} />\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>字号</span>\r\n <input type=\"range\" min={10} max={16} step={1} value={bgDraft.hint.size} onChange={(e) => updateBgLive({ hint: { ...bgDraft.hint, size: Number(e.target.value) } })} style={{ flex: 1 }} />\r\n <span style={{ ...CSS.hint, width: '30px', textAlign: 'right' as const }}>{bgDraft.hint.size}px</span>\r\n </div>\r\n <div style={{ display: 'flex', gap: '6px', alignItems: 'center', flexWrap: 'wrap' as const }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>渐变色</span>\r\n {GRADIENTS.map((g) => (\r\n <button key={g.id} title={g.name}\r\n style={{ ...CSS.actionBtn, ...(bgDraft.hint.gradient === g.id ? CSS.tabActive : {}), ...(g.css !== '' ? { backgroundImage: g.css, color: 'transparent', backgroundClip: 'text', WebkitBackgroundClip: 'text', fontWeight: 700 } : {}) }}\r\n onClick={() => updateBgLive({ hint: { ...bgDraft.hint, gradient: g.id } })}>{g.name}</button>\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: conversations ───────────────────────────── */}\r\n {activeTab === 'chat' && (\r\n <>\r\n <div style={CSS.form}>\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <span style={{ fontSize: '13px', fontWeight: 600 }}>对话导入 / 导出</span>\r\n <button style={CSS.actionBtn} onClick={() => void reloadChat()} disabled={chatBusy}>刷新</button>\r\n </div>\r\n <div style={{ ...CSS.desc, lineHeight: '1.5' }}>\r\n 可导出选中的对话,也可下拉选择某个项目工作区整体导出;导入后项目工作区名会尽量与导出端保持一致。\r\n </div>\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} disabled={chatBusy || chatSelected.size === 0} onClick={() => void doExportChat()}>\r\n 导出选中({chatSelected.size})\r\n </button>\r\n <button style={CSS.actionBtn} disabled={chatBusy || chatProject === ''} onClick={() => void doExportProject()} title=\"导出该项目工作区下的全部对话,导入后可保留项目名\">\r\n 导出整个项目\r\n </button>\r\n <select\r\n style={{ ...CSS.input, maxWidth: '220px', textOverflow: 'ellipsis' }}\r\n value={chatProject}\r\n onChange={(e) => setChatProject(e.target.value)}\r\n disabled={chatProjects.length === 0}\r\n title=\"选择要整体导出的项目工作区\"\r\n >\r\n {chatProjects.length === 0 && <option value=\"\">(无项目)</option>}\r\n {chatProjects.map((p) => (\r\n <option key={p.key} value={p.key}>{p.name}({chatRows.filter((r) => r.projectKey === p.key).length} 个对话)</option>\r\n ))}\r\n </select>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} disabled={chatBusy || chatSelected.size === 0} onClick={() => void doDeleteChat()}>\r\n 删除选中({chatSelected.size})\r\n </button>\r\n <label style={CSS.fileBtn}>\r\n {chatBusy ? '处理中…' : '选择 zip 导入'}\r\n <input type=\"file\" accept=\".zip\" style={{ display: 'none' }} onChange={(e) => void onChatFile(e.target.files?.[0])} />\r\n </label>\r\n <input style={CSS.input} placeholder=\"目标项目 key(留空=保持原项目)\" value={chatTarget} onChange={(e) => setChatTarget(e.target.value)} />\r\n </div>\r\n {chatMsg !== '' && <div style={CSS.hint}>{chatMsg}</div>}\r\n </div>\r\n <div style={CSS.scrollBox}>\r\n {chatRows.length === 0\r\n ? <div style={CSS.empty}>暂无对话</div>\r\n : chatRows.map((row) => {\r\n const id = `${row.projectKey}/${row.sessionId}`\r\n const sel = chatSelected.has(id)\r\n return (\r\n <div key={id} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', minWidth: 0, flex: 1 }}>\r\n <input type=\"checkbox\" checked={sel} onChange={() => toggleChatSel(id)} style={{ flex: 'none' }} />\r\n <div style={{ ...CSS.name, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis', flex: 1, minWidth: 0 }} title={row.title || id}>\r\n {row.title || '未命名对话'}\r\n </div>\r\n </div>\r\n <span style={{ ...CSS.badge, ...CSS.badgeDisabled, flex: 'none', maxWidth: '150px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title={row.cwd || row.projectKey}>\r\n {row.cwd ? row.cwd.split(/[\\\\/]/).filter(Boolean).pop() : row.projectKey}\r\n </span>\r\n </div>\r\n <div style={{ ...CSS.desc, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {row.cwd || row.projectKey} · {new Date(row.mtime).toLocaleString()} · {row.size >= 1024 ? (row.size / 1024).toFixed(1) + ' KB' : row.size + ' B'}\r\n </div>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: usage stats ─────────────────────────────── */}\r\n {activeTab === 'stats' && (\r\n <>\r\n <div style={CSS.form}>\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '8px', flexWrap: 'wrap' as const }}>\r\n <span style={{ fontSize: '13px', fontWeight: 600 }}>\r\n 使用统计\r\n {statsUpdatedAt > 0 && (\r\n <span style={{ ...CSS.hint, marginLeft: '8px', fontWeight: 400 }}>\r\n 自动刷新 · 上次更新 {new Date(statsUpdatedAt).toLocaleTimeString()}\r\n </span>\r\n )}\r\n </span>\r\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center' }}>\r\n {(['all', '30d', '7d', 'today'] as const).map((r) => (\r\n <button key={r} style={{ ...CSS.actionBtn, ...(statsRange === r ? CSS.tabActive : {}) }} onClick={() => changeStatsRange(r)}>\r\n {r === 'all' ? '全部' : r === '30d' ? '30天' : r === '7d' ? '7天' : '今天'}\r\n </button>\r\n ))}\r\n <button style={CSS.actionBtn} onClick={() => void reloadStats()}>刷新</button>\r\n </div>\r\n </div>\r\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: '8px', marginTop: '4px' }}>\r\n <div style={CSS.card}><div style={CSS.hint}>会话</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats?.totals.sessions ?? '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>轮 / 步骤</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${stats.totals.turns} / ${stats.totals.steps}` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>LLM / 工具时长</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${fmtDuration(stats.totals.llmMs)} / ${fmtDuration(stats.totals.toolMs)}` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>输入 Token</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtTokens(stats.totals.inputTokens) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>输出 Token</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtTokens(stats.totals.outputTokens) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>缓存读 / 写</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${fmtTokens(stats.totals.cacheReadTokens)} / ${fmtTokens(stats.totals.cacheWriteTokens)}` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>缓存命中率</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtPct(stats.totals.cacheHitRate) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>总成本</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtUsd(stats.totals.costUsd) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>平均首Token</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtDuration(stats.totals.avgTtftMs) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>输出吞吐</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${stats.totals.tokPerSec.toFixed(0)} tok/s` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>每会话平均</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${stats.totals.perSessionSteps.toFixed(1)} 步` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>活跃天数</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats?.totals.activeDays ?? '—'}</div></div>\r\n </div>\r\n {stats !== null && (stats.byDay.length > 0 || stats.byHour.length > 0) && (\r\n <TrendChart byDay={stats.byHour.length > 0\r\n ? stats.byHour.map((h) => ({\r\n date: `${String(h.hour).padStart(2, '0')}:00`,\r\n steps: h.steps,\r\n outputTokens: h.outputTokens,\r\n inputTokens: h.inputTokens,\r\n cacheReadTokens: h.cacheReadTokens,\r\n cacheWriteTokens: h.cacheWriteTokens,\r\n }))\r\n : stats.byDay} />\r\n )}\r\n </div>\r\n <div style={CSS.scrollBox}>\r\n {(stats?.byProject ?? []).length === 0 && (stats?.recent ?? []).length === 0\r\n ? <div style={CSS.empty}>暂无使用记录</div>\r\n : <></>}\r\n {(stats?.recent ?? []).length > 0 && (\r\n <div>\r\n <div style={{ ...CSS.hint, marginBottom: '4px' }}>请求日志(最近 {stats!.recent.length})</div>\r\n {stats!.recent.map((r) => (\r\n <div key={r.time + '-' + r.provider} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={{ ...CSS.name, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis', flex: 1, minWidth: 0 }}>{r.provider}</div>\r\n <span style={{ ...CSS.badge, ...(r.status === 'done' ? CSS.badgeEnabled : CSS.badgeInstalled) }}>{r.status === 'done' ? '完成' : '进行中'}</span>\r\n </div>\r\n <div style={CSS.desc}>\r\n {new Date(r.time).toLocaleString()} · {fmtTokens(r.inputTokens)} in / {fmtTokens(r.outputTokens)} out · R{fmtTokens(r.cacheReadTokens)}·W{fmtTokens(r.cacheWriteTokens)} · 命中 {fmtPct(r.cacheHitRate)} · {fmtUsd(r.costUsd)} · {fmtDuration(r.latencyMs)} / 首字 {fmtDuration(r.firstTokenMs)}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {(stats?.byProject ?? []).length > 0 && (\r\n <div>\r\n <div style={{ ...CSS.hint, marginBottom: '4px' }}>Provider / 项目统计</div>\r\n {stats!.byProject.slice(0, 20).map((p) => (\r\n <div key={p.project} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={{ ...CSS.name, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis', flex: 1, minWidth: 0 }}>{p.project}</div>\r\n <span style={{ ...CSS.badge, ...CSS.badgeDisabled }}>{p.sessions} 会话</span>\r\n </div>\r\n <div style={CSS.desc}>\r\n {p.steps} 步 · {fmtTokens(p.inputTokens)} in / {fmtTokens(p.outputTokens)} out · R{fmtTokens(p.cacheReadTokens)} · 命中 {fmtPct(p.cacheHitRate)} · {fmtUsd(p.costUsd)} · 延迟 {p.avgLatencyMs.toFixed(0)}ms · 成功 {p.successRate.toFixed(0)}%\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {(stats?.byModel ?? []).length > 0 && (\r\n <div>\r\n <div style={{ ...CSS.hint, marginBottom: '4px' }}>模型统计</div>\r\n {stats!.byModel.slice(0, 20).map((m) => (\r\n <div key={m.model} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={{ ...CSS.name, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis', flex: 1, minWidth: 0 }}>{m.model}</div>\r\n <span style={{ ...CSS.badge, ...CSS.badgeDisabled }}>{m.sessions} 会话</span>\r\n </div>\r\n <div style={CSS.desc}>{m.steps} 步 · {fmtTokens(m.inputTokens)} in / {fmtTokens(m.outputTokens)} out · 命中 {fmtPct(m.cacheHitRate)} · {fmtUsd(m.costUsd)}</div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","/**\r\n * Switchblade section data controller: reads the skill catalog and the prompt\r\n * roster through the existing connection RPC surface (no Typert\r\n * generation needed — these methods are already wired).\r\n * @module @deepseek-ai/dsh-client-ui-switchblade\r\n */\r\n\r\nimport type { ConnectionHandle, SessionId } from '@deepseek-ai/dsh-api-remotes/client'\r\nimport { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\r\n\r\n/** A skill row as reported by skill.list. */\r\nexport interface SkillRow {\r\n readonly name: string\r\n readonly description: string\r\n readonly modelInvocable: boolean\r\n}\r\n\r\n/** A command row (not yet wired to an RPC; kept for the section's third group). */\r\nexport interface CommandRow {\r\n readonly name: string\r\n readonly description: string\r\n}\r\n\r\n/** One user-authored prompt (mirrors the Host ManagedPrompt). */\r\nexport interface PromptRow {\r\n readonly id: string\r\n readonly name: string\r\n readonly description: string\r\n readonly content: string\r\n readonly order: number\r\n readonly enabled: boolean\r\n readonly isDefault: boolean\r\n /** Fine-grained application scope (global by default). */\r\n readonly scope?: { readonly type: 'global' } | { readonly type: 'project'; readonly key: string } | { readonly type: 'session'; readonly id: string }\r\n}\r\n\r\n/** An installed skill row. */\r\nexport interface InstalledSkillRow {\r\n readonly name: string\r\n readonly description: string\r\n readonly content: string\r\n /** Whether this skill is currently registered (enabled) as a runtime skill. */\r\n readonly enabled: boolean\r\n}\r\n\r\n/** One configured MCP server (mirrors the Host McpServerConfig). */\r\nexport interface McpServerRow {\r\n readonly serverName: string\r\n readonly transport: 'stdio' | 'streamable-http'\r\n readonly command?: string\r\n readonly args?: readonly string[]\r\n readonly env?: Readonly<Record<string, string>>\r\n readonly url?: string\r\n readonly headers?: Readonly<Record<string, string>>\r\n readonly enabled: boolean\r\n /** Runtime: whether a live mcp-client instance is loaded. */\r\n readonly running?: boolean\r\n /** Runtime: tools currently registered from this server. */\r\n readonly tools?: readonly { name: string; description: string }[]\r\n /** Runtime: last startup/connection error, if any. */\r\n readonly lastError?: string\r\n}\r\n\r\n/** The section's loaded view state. */\r\nexport interface SwitchbladeSectionState {\r\n readonly status: 'idle' | 'loading' | 'ready' | 'error'\r\n readonly message?: string\r\n readonly skills: readonly SkillRow[]\r\n readonly commands: readonly CommandRow[]\r\n readonly prompts: readonly PromptRow[]\r\n readonly installedSkills: readonly InstalledSkillRow[]\r\n readonly mcpServers: readonly McpServerRow[]\r\n}\r\n\r\n/** Initial (idle) state. */\r\nconst IDLE: SwitchbladeSectionState = {\r\n status: 'idle',\r\n skills: [],\r\n commands: [],\r\n prompts: [],\r\n installedSkills: [],\r\n mcpServers: [],\r\n}\r\n\r\n/** Normalize a thrown wire error to a message. */\r\nfunction messageOf(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n\r\nexport class SwitchbladeSectionController {\r\n /** Snapshot store backing the section's view state. */\r\n readonly store: SnapshotStore<SwitchbladeSectionState> = createSnapshotStore(IDLE)\r\n\r\n constructor(\r\n private readonly api: ConnectionHandle['api'],\r\n private readonly sessionId?: () => SessionId | undefined,\r\n ) {}\r\n\r\n /**\r\n * Load skills, prompts, and installed skills. Prompts and installed\r\n * skills come from the `switchblade` settings namespace (the Host watches\r\n * it and re-injects on change).\r\n */\r\n async load(): Promise<void> {\r\n this.store.set({ ...IDLE, status: 'loading' })\r\n try {\r\n // skill.list requires a live session; without one we skip it (never\r\n // hang). Settings always resolve, so the panel opens reliably.\r\n const sessionId = this.sessionId?.()\r\n const calls: Promise<unknown>[] = [\r\n this.api.settings.describe({}),\r\n ]\r\n if (sessionId !== undefined) calls.push(this.api.skills.list({ sessionId }))\r\n const [settingsRes, skillRes] = await Promise.all(calls) as [\r\n Awaited<ReturnType<ConnectionHandle['api']['settings']['describe']>>,\r\n Awaited<ReturnType<ConnectionHandle['api']['skills']['list']>> | undefined,\r\n ]\r\n if (!settingsRes.result.ok) throw new Error(`settings.describe: ${settingsRes.result.error.message}`)\r\n\r\n const skills: SkillRow[] = skillRes !== undefined && skillRes.result.ok\r\n ? skillRes.result.value.skills.map((skill) => ({\r\n name: skill.name,\r\n description: skill.description,\r\n modelInvocable: skill.modelInvocable,\r\n }))\r\n : []\r\n\r\n const switchbladeSection = this.sectionFromSettings(settingsRes.result.value, 'switchblade')\r\n const prompts: PromptRow[] = Array.isArray(switchbladeSection?.prompts) ? switchbladeSection.prompts : []\r\n const installedSkills: InstalledSkillRow[] = Array.isArray(switchbladeSection?.installedSkills)\r\n ? switchbladeSection.installedSkills.map((s: { name?: string; description?: string; content?: string; enabled?: boolean }) => ({\r\n name: s.name ?? '',\r\n description: s.description ?? '',\r\n content: s.content ?? '',\r\n enabled: s.enabled ?? true,\r\n }))\r\n : []\r\n const mcpServers: McpServerRow[] = Array.isArray(switchbladeSection?.mcpServers)\r\n ? switchbladeSection.mcpServers.map((s: McpServerRow) => {\r\n const status = (switchbladeSection?.mcpStatus as Record<string, { running?: boolean; tools?: readonly { name: string; description: string }[]; lastError?: string }> | undefined)?.[s.serverName]\r\n return {\r\n serverName: s.serverName,\r\n transport: s.transport,\r\n ...s.command === undefined ? {} : { command: s.command },\r\n ...s.args === undefined ? {} : { args: s.args },\r\n ...s.env === undefined ? {} : { env: s.env },\r\n ...s.url === undefined ? {} : { url: s.url },\r\n ...s.headers === undefined ? {} : { headers: s.headers },\r\n enabled: s.enabled ?? true,\r\n ...status === undefined ? {} : {\r\n running: status.running ?? false,\r\n tools: status.tools ?? [],\r\n ...status.lastError === undefined ? {} : { lastError: status.lastError },\r\n },\r\n }\r\n })\r\n : []\r\n\r\n this.store.set({\r\n status: 'ready',\r\n skills,\r\n commands: [],\r\n prompts,\r\n installedSkills,\r\n mcpServers,\r\n })\r\n } catch (error) {\r\n this.store.set({ ...IDLE, status: 'error', message: messageOf(error) })\r\n }\r\n }\r\n\r\n /** Read one namespace's user section from a settings.describe value. */\r\n private sectionFromSettings(value: unknown, ns: string): Record<string, unknown> | undefined {\r\n if (typeof value !== 'object' || value === null) return undefined\r\n const entries = (value as { namespaces?: unknown }).namespaces\r\n if (!Array.isArray(entries)) return undefined\r\n for (const entry of entries) {\r\n const row = entry as { ns?: unknown; value?: unknown }\r\n if (row.ns === ns) {\r\n const section = row.value\r\n return typeof section === 'object' && section !== null ? section as Record<string, unknown> : undefined\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Prompt CRUD (writes to the switchblade settings namespace; Host re-injects)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Add a prompt. */\r\n async addPrompt(input: { name: string; description: string; content: string; scope?: PromptRow['scope'] }): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['prompts'], value: [...this.currentPrompts(), {\r\n id: this.slugify(input.name),\r\n name: input.name,\r\n description: input.description,\r\n content: input.content,\r\n order: this.currentPrompts().length,\r\n enabled: true,\r\n isDefault: this.currentPrompts().length === 0,\r\n ...(input.scope === undefined || input.scope.type === 'global' ? {} : { scope: input.scope }),\r\n }] }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Toggle one prompt's enabled state. */\r\n async setPromptEnabled(id: string, enabled: boolean): Promise<void> {\r\n const next = this.currentPrompts().map((p) => p.id === id ? { ...p, enabled } : p)\r\n await this.writePrompts(next)\r\n }\r\n\r\n /** Mark one prompt default; clears others. */\r\n async setDefaultPrompt(id: string): Promise<void> {\r\n const next = this.currentPrompts().map((p) => ({ ...p, isDefault: p.id === id }))\r\n await this.writePrompts(next)\r\n }\r\n\r\n /** Delete one prompt. */\r\n async deletePrompt(id: string): Promise<void> {\r\n const next = this.currentPrompts().filter((p) => p.id !== id)\r\n await this.writePrompts(next)\r\n }\r\n\r\n /** Update a prompt's name/description/content/scope. */\r\n async updatePrompt(id: string, patch: { name?: string; description?: string; content?: string; scope?: PromptRow['scope'] }): Promise<void> {\r\n const next = this.currentPrompts().map((p) => p.id === id ? {\r\n ...p,\r\n name: patch.name?.trim() || p.name,\r\n description: patch.description ?? p.description,\r\n content: patch.content ?? p.content,\r\n ...(patch.scope === undefined ? {} : (patch.scope.type === 'global' ? { scope: undefined } : { scope: patch.scope })),\r\n } : p)\r\n await this.writePrompts(next)\r\n }\r\n\r\n /** Persist the prompt list through the settings RPC. */\r\n private async writePrompts(prompts: readonly PromptRow[]): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['prompts'], value: prompts }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Current prompt list from the loaded snapshot. */\r\n private currentPrompts(): readonly PromptRow[] {\r\n return this.store.getSnapshot().prompts\r\n }\r\n\r\n /** Sluggify a name into an id. */\r\n private slugify(value: string): string {\r\n const slug = value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')\r\n return slug.length > 0 ? slug : `prompt-${Date.now()}`\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Skill install/uninstall (writes to the switchblade settings namespace)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Install a skill from a name + content (enabled by default). */\r\n async installSkill(input: { name: string; description: string; content: string }): Promise<void> {\r\n const next = [...this.currentInstalledSkills(), {\r\n name: input.name,\r\n description: input.description,\r\n content: input.content,\r\n enabled: true,\r\n }]\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['installedSkills'], value: next }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Toggle one installed skill's enabled state. */\r\n async setSkillEnabled(name: string, enabled: boolean): Promise<void> {\r\n const next = this.currentInstalledSkills().map((s) => s.name === name ? { ...s, enabled } : s)\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['installedSkills'], value: next }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Uninstall one installed skill. */\r\n async uninstallSkill(name: string): Promise<void> {\r\n const next = this.currentInstalledSkills().filter((s) => s.name !== name)\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['installedSkills'], value: next }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Update an installed skill's name/description/content. */\r\n async updateSkill(name: string, patch: { name?: string; description?: string; content?: string }): Promise<void> {\r\n const next = this.currentInstalledSkills().map((s) => s.name === name ? {\r\n ...s,\r\n name: patch.name?.trim() || s.name,\r\n description: patch.description ?? s.description,\r\n content: patch.content ?? s.content,\r\n } : s)\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['installedSkills'], value: next }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Current installed skills from the loaded snapshot. */\r\n private currentInstalledSkills(): readonly InstalledSkillRow[] {\r\n return this.store.getSnapshot().installedSkills\r\n }\r\n\r\n /**\r\n * Queue a zip archive (base64) for extraction into ~/.dsh/skills. The Host\r\n * watch sees pendingZip and installs it (skil-filesystem then discovers it).\r\n */\r\n async installSkillFromZip(name: string, dataBase64: string): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['pendingZip'], value: { name, dataBase64 } }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n // Wait a tick for the Host watch to extract, then refresh.\r\n await new Promise((r) => setTimeout(r, 500))\r\n await this.load()\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // MCP server management (writes to the switchblade settings namespace; the\r\n // Host watch auto-starts/stops the mcp-client instances)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Add a new MCP server config. */\r\n async addMcpServer(config: McpServerRow): Promise<void> {\r\n const next = [...this.currentMcpServers(), config]\r\n await this.writeMcpServers(next)\r\n }\r\n\r\n /** Update an MCP server config. */\r\n async updateMcpServer(name: string, patch: Partial<McpServerRow>): Promise<void> {\r\n const next = this.currentMcpServers().map((s) => s.serverName === name ? { ...s, ...patch, serverName: name } : s)\r\n await this.writeMcpServers(next)\r\n }\r\n\r\n /** Toggle one MCP server's enabled state (Host auto-starts/stops). */\r\n async toggleMcpServer(name: string, enabled: boolean): Promise<void> {\r\n const next = this.currentMcpServers().map((s) => s.serverName === name ? { ...s, enabled } : s)\r\n await this.writeMcpServers(next)\r\n }\r\n\r\n /** Remove an MCP server config. */\r\n async removeMcpServer(name: string): Promise<void> {\r\n const next = this.currentMcpServers().filter((s) => s.serverName !== name)\r\n await this.writeMcpServers(next)\r\n }\r\n\r\n /**\r\n * Ask the Host to (re)start one server and republish its live status. The\r\n * Host processes the one-shot request and updates mcpStatus; we refresh\r\n * after a short delay so the panel shows the fresh tool list / error.\r\n */\r\n async testMcpServer(name: string): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['mcpTestRequest'], value: { serverName: name, ts: Date.now() } }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await new Promise((r) => setTimeout(r, 2000))\r\n await this.load()\r\n }\r\n\r\n /** Persist the MCP server config list. */\r\n private async writeMcpServers(servers: readonly McpServerRow[]): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['mcpServers'], value: servers }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Current MCP server list from the loaded snapshot. */\r\n private currentMcpServers(): readonly McpServerRow[] {\r\n return this.store.getSnapshot().mcpServers\r\n }\r\n}\r\n\r\n/** The section's injected face: hooks (snapshot store) + actions. */\r\nexport interface SwitchbladeSectionInjected {\r\n hooks: {\r\n /** Page snapshot bound by the renderer as useSwitchblade. */\r\n switchblade: SnapshotStore<SwitchbladeSectionState>\r\n }\r\n load: () => Promise<void>\r\n addPrompt: (input: { name: string; description: string; content: string }) => Promise<void>\r\n updatePrompt: (id: string, patch: { name?: string; description?: string; content?: string }) => Promise<void>\r\n setPromptEnabled: (id: string, enabled: boolean) => Promise<void>\r\n setDefaultPrompt: (id: string) => Promise<void>\r\n deletePrompt: (id: string) => Promise<void>\r\n installSkill: (input: { name: string; description: string; content: string }) => Promise<void>\r\n updateSkill: (name: string, patch: { name?: string; description?: string; content?: string }) => Promise<void>\r\n setSkillEnabled: (name: string, enabled: boolean) => Promise<void>\r\n uninstallSkill: (name: string) => Promise<void>\r\n installSkillFromZip: (name: string, dataBase64: string) => Promise<void>\r\n addMcpServer: (config: McpServerRow) => Promise<void>\r\n updateMcpServer: (name: string, patch: Partial<McpServerRow>) => Promise<void>\r\n toggleMcpServer: (name: string, enabled: boolean) => Promise<void>\r\n removeMcpServer: (name: string) => Promise<void>\r\n testMcpServer: (name: string) => Promise<void>\r\n /** Ask the DSH session runtime to re-pull the conversation list (keeps the official UI in sync after delete/import). */\r\n refreshSessions: () => void\r\n}\r\n","/**\r\n * Switchblade management page, browser half: registers the `settings.section`\r\n * navigation entry and renders the edgelord panel from the connection RPC\r\n * state. Global scope (root) — one management seat for every session.\r\n * @module @deepseek-ai/dsh-client-ui-switchblade\r\n */\r\n\r\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\r\nimport type { ClientContext, ISessions } from '@deepseek-ai/dsh-client-runtime/client'\r\n// Type-only: pulls the locale plugin's Context merge (ctx.locale).\r\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\r\n// Type-only: pulls the settings shell's SlotMap merge (the 'settings.section' entry).\r\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\r\n// Type-only: pulls the LocaleNamespaceMap merge slot (the 'settings.switchblade' entry).\r\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\r\nimport { en, NS, zh, type SwitchbladeKey } from './locales.ts'\r\nimport { SwitchbladeSection } from './SwitchbladeSection.tsx'\r\nimport type { SwitchbladeSectionInjected } from './SwitchbladeSection.tsx'\r\nimport { SwitchbladeSectionController } from './store.ts'\r\nimport { backgroundClient, initBackgroundClient, applyBackground, applyHintStyle } from './background.ts'\r\n\r\nexport { SwitchbladeSection } from './SwitchbladeSection.tsx'\r\nexport type { SwitchbladeSectionInjected, SwitchbladeSectionProps } from './SwitchbladeSection.tsx'\r\nexport { SwitchbladeSectionController } from './store.ts'\r\nexport type { SwitchbladeSectionState, SkillRow } from './store.ts'\r\n\r\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\r\n interface LocaleNamespaceMap {\r\n /** Switchblade management page copy. */\r\n 'settings.switchblade': SwitchbladeKey\r\n }\r\n}\r\n\r\n/** Required services (cordis fiber inject). */\r\nexport const inject = ['slots', 'locale', 'connection', 'sessions']\r\n\r\n/**\r\n * Mount the Switchblade settings section.\r\n * @param ctx - the browser plugin context.\r\n */\r\nexport function apply(ctx: ClientContext): void {\r\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'ui-switchblade: dictionaries')\r\n\r\n const api = (ctx.get('connection') as ConnectionHandle).api\r\n const sessions = ctx.get('sessions') as ISessions\r\n\r\n // Global background/effects survives restart: the Host persists the section\r\n // in its settings document and serves it over a same-origin route; we fetch\r\n // it at startup and repaint on every load or change. paint() gates on\r\n // status==='ready' so a not-yet-loaded snapshot never clears the backdrop.\r\n applyHintStyle()\r\n try {\r\n initBackgroundClient(api)\r\n const paintBackground = (): void => { const s = backgroundClient.getSnapshot(); if (s.status === 'ready') applyBackground(s.value) }\r\n backgroundClient.subscribe(paintBackground)\r\n const applyPersisted = (): void => { void backgroundClient.load().then((ok) => { if (!ok) setTimeout(applyPersisted, 1200) }) }\r\n applyPersisted()\r\n } catch (error) {\r\n // Never let the background integration take the renderer/plugin tree down.\r\n console.warn('[switchblade] background init skipped:', error)\r\n }\r\n\r\n const controller = new SwitchbladeSectionController(api, () => {\r\n const state = sessions.list.getSnapshot()\r\n return state.current === undefined ? undefined : state.current\r\n })\r\n\r\n ctx.slots.inject('settings.section', () => ctx.slots.register({\r\n name: 'settings.section',\r\n id: 'switchblade',\r\n order: 30,\r\n label: () => ctx.locale.bind(NS)('nav'),\r\n locale: NS,\r\n inject: (): SwitchbladeSectionInjected => ({\r\n hooks: { switchblade: controller.store },\r\n load: () => controller.load(),\r\n addPrompt: (input) => controller.addPrompt(input),\r\n updatePrompt: (id, patch) => controller.updatePrompt(id, patch),\r\n setPromptEnabled: (id, enabled) => controller.setPromptEnabled(id, enabled),\r\n setDefaultPrompt: (id) => controller.setDefaultPrompt(id),\r\n deletePrompt: (id) => controller.deletePrompt(id),\r\n installSkill: (input) => controller.installSkill(input),\r\n updateSkill: (name, patch) => controller.updateSkill(name, patch),\r\n setSkillEnabled: (name, enabled) => controller.setSkillEnabled(name, enabled),\r\n uninstallSkill: (name) => controller.uninstallSkill(name),\r\n installSkillFromZip: (name, dataBase64) => controller.installSkillFromZip(name, dataBase64),\r\n addMcpServer: (config) => controller.addMcpServer(config),\r\n updateMcpServer: (name, patch) => controller.updateMcpServer(name, patch),\r\n toggleMcpServer: (name, enabled) => controller.toggleMcpServer(name, enabled),\r\n removeMcpServer: (name) => controller.removeMcpServer(name),\r\n testMcpServer: (name) => controller.testMcpServer(name),\r\n refreshSessions: () => { (sessions as { refresh?: () => Promise<void> }).refresh?.().catch(() => {}) },\r\n }),\r\n }, SwitchbladeSection))\r\n}\r\n\r\n/** Cordis plugin identity. */\r\nexport const name = 'ui-switchblade'\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../../packages/client/ui-switchblade/src/client/locales.ts","../../../packages/client/ui-switchblade/src/client/background.ts","../../../packages/client/ui-switchblade/src/client/conversations.ts","../../../packages/client/ui-switchblade/src/client/SwitchbladeSection.tsx","../../../packages/client/ui-switchblade/src/client/store.ts","../../../packages/client/ui-switchblade/src/client/index.ts"],"sourcesContent":["/**\r\n * Switchblade management page dictionaries.\r\n * @module @deepseek-ai/dsh-client-ui-switchblade\r\n */\r\n\r\n/** Locale namespace owned by this plugin (settings.* prefix per the slot contract). */\r\nexport const NS = 'settings.switchblade'\r\n\r\n/** Keys translated by this plugin. */\r\nexport type SwitchbladeKey =\r\n | 'nav' | 'skillsTitle' | 'promptsTitle' | 'commandsTitle'\r\n | 'empty' | 'enabled' | 'disabled' | 'installed'\r\n | 'refresh' | 'setDefault' | 'loadFailed'\r\n | 'globalHint' | 'promptNamePlaceholder' | 'promptDescPlaceholder' | 'promptContentPlaceholder'\r\n | 'addPrompt' | 'enable' | 'disable' | 'delete'\r\n | 'installSkill' | 'skillNamePlaceholder' | 'skillDescPlaceholder' | 'skillContentPlaceholder'\r\n | 'install' | 'uninstall' | 'pickSkillFile' | 'searchPlaceholder'\r\n | 'installedSkills' | 'installedSkillsGoRight' | 'manage'\r\n | 'localSkills' | 'edit' | 'save' | 'cancel' | 'addSkill'\r\n | 'pickZipFile' | 'cliHint'\r\n\r\n/** zh-CN copy. */\r\nexport const zh: Record<SwitchbladeKey, string> = {\r\n nav: 'Armory',\r\n skillsTitle: '技能',\r\n promptsTitle: '提示词',\r\n commandsTitle: '命令',\r\n empty: '(空)',\r\n enabled: '启用',\r\n disabled: '停用',\r\n installed: '已装',\r\n refresh: '刷新',\r\n setDefault: '设为默认',\r\n loadFailed: '加载失败',\r\n globalHint: '· 全局生效',\r\n promptNamePlaceholder: '提示词名称',\r\n promptDescPlaceholder: '描述(可选)',\r\n promptContentPlaceholder: '提示词内容…',\r\n addPrompt: '添加提示词',\r\n enable: '启用',\r\n disable: '停用',\r\n delete: '删除',\r\n installSkill: '技能',\r\n skillNamePlaceholder: '技能名称(kebab-case)',\r\n skillDescPlaceholder: '描述(可选)',\r\n skillContentPlaceholder: '技能指令内容…',\r\n install: '安装',\r\n uninstall: '卸载',\r\n pickSkillFile: '选择本地 .md 技能文件导入',\r\n searchPlaceholder: '搜索…',\r\n installedSkills: '本地化技能',\r\n installedSkillsGoRight: '已安装的技能在右侧第四列管理',\r\n manage: '托管',\r\n localSkills: '本地扫描技能',\r\n edit: '编辑',\r\n save: '保存',\r\n cancel: '取消',\r\n addSkill: '添加技能',\r\n pickZipFile: '导入 .zip 技能包',\r\n cliHint: 'CLI 直接安装(在会话里输入):',\r\n}\r\n\r\n/** en-US copy. */\r\nexport const en: Record<SwitchbladeKey, string> = {\r\n nav: 'Armory',\r\n skillsTitle: 'Skills',\r\n promptsTitle: 'Prompts',\r\n commandsTitle: 'Commands',\r\n empty: '(empty)',\r\n enabled: 'enabled',\r\n disabled: 'disabled',\r\n installed: 'installed',\r\n refresh: 'Refresh',\r\n setDefault: 'Set default',\r\n loadFailed: 'Failed to load',\r\n globalHint: '· global',\r\n promptNamePlaceholder: 'Prompt name',\r\n promptDescPlaceholder: 'Description (optional)',\r\n promptContentPlaceholder: 'Prompt content…',\r\n addPrompt: 'Add prompt',\r\n enable: 'Enable',\r\n disable: 'Disable',\r\n delete: 'Delete',\r\n installSkill: 'Skills',\r\n skillNamePlaceholder: 'Skill name (kebab-case)',\r\n skillDescPlaceholder: 'Description (optional)',\r\n skillContentPlaceholder: 'Skill instructions…',\r\n install: 'Install',\r\n uninstall: 'Uninstall',\r\n pickSkillFile: 'Pick a local .md skill file',\r\n searchPlaceholder: 'Search…',\r\n installedSkills: 'Local skills',\r\n installedSkillsGoRight: 'Installed skills are managed in the right column',\r\n manage: 'Manage',\r\n localSkills: 'Scanned skills',\r\n edit: 'Edit',\r\n save: 'Save',\r\n cancel: 'Cancel',\r\n addSkill: 'Add skill',\r\n pickZipFile: 'Import .zip skill bundle',\r\n cliHint: 'Install via CLI (type in a session):',\r\n}\r\n","/**\r\n * Global background/effects engine for Prompt•Skill-Armory — fusing the\r\n * reference DSH skin/theme plugins' strongest ideas into one feature:\r\n * - dsh-harness-background / dsh-dream-skin: a real walled backdrop engine\r\n * (wallpaper + readability scrim + frosted-glass surfaces + blur + fit),\r\n * - dsh-web / dsh-background: custom user image upload (here as a portable\r\n * data-URL so it needs no filesystem and survives restarts), and\r\n * - catppuccin: the \"whole app recolor\" idea — here the glass surfaces and\r\n * frame transparency are driven by inline body styles so they truly take\r\n * effect.\r\n *\r\n * The critical reliability detail: every knob is written INLINE on\r\n * `document.body` (`style.setProperty`), which outranks any stylesheet, so a\r\n * later-loaded official theme rule cannot wash it out. Persistence goes\r\n * through the Host's same-origin route so the section survives restarts with\r\n * no settings-RPC / allowlist dependency.\r\n *\r\n * This module is deliberately defensive: every mutation is guarded so a bad\r\n * value or a missing DOM API can never take the client plugin tree down.\r\n */\r\n\r\n/** Style for the composer's below-input hint row (per surface, optional). */\r\nexport interface HintStyle {\r\n enabled: boolean\r\n color: string\r\n size: number\r\n /** CSS gradient ('' = use solid color). Gradient text via background-clip. */\r\n gradient: string\r\n}\r\n\r\n/** Built-in fancy gradient text schemes for the hint/stats line. */\r\nexport const GRADIENTS: readonly { id: string; name: string; css: string }[] = [\r\n { id: '', name: '纯色', css: '' },\r\n { id: 'aurora', name: '极光', css: 'linear-gradient(90deg,#58a6ff,#8b5cf6,#ec4899)' },\r\n { id: 'fire', name: '火焰', css: 'linear-gradient(90deg,#fbbf24,#f97316,#ef4444)' },\r\n { id: 'sky', name: '晴空', css: 'linear-gradient(90deg,#38bdf8,#818cf8)' },\r\n { id: 'neon', name: '霓虹', css: 'linear-gradient(90deg,#22d3ee,#a78bfa,#f0abfc)' },\r\n { id: 'ocean', name: '海洋', css: 'linear-gradient(90deg,#34d399,#22d3ee,#3b82f6)' },\r\n { id: 'sunset', name: '晚霞', css: 'linear-gradient(90deg,#f472b6,#fb923c,#f59e0b)' },\r\n]\r\n\r\n/** One durable background section. Mirrors the Host BackgroundSettings. */\r\nexport interface BackgroundSettings {\r\n enabled: boolean\r\n kind: 'image' | 'video'\r\n /** Id of a file stored on disk ('' = none); never stores bytes in settings. */\r\n uploadId: string\r\n /** External image URL ('' = none when an upload is used). */\r\n url: string\r\n opacity: number\r\n scrim: number\r\n panelOpacity: number\r\n blur: number\r\n wallpaperBlur: number\r\n fit: 'cover' | 'contain'\r\n hint: HintStyle\r\n}\r\n\r\nexport const DEFAULT_BACKGROUND: BackgroundSettings = {\r\n enabled: false, kind: 'image', uploadId: '', url: '', opacity: 1, scrim: 0.25, panelOpacity: 1, blur: 16, wallpaperBlur: 0, fit: 'cover',\r\n hint: { enabled: false, color: '#79c0ff', size: 11, gradient: '' },\r\n}\r\n\r\nconst BACKGROUND_API_PREFIX = '/api/switchblade-background'\r\n\r\nconst ACTIVE_ATTR = 'data-ar-bg'\r\nconst GLASS_ATTR = 'data-ar-glass'\r\nconst CSS_TAG = 'prompt-skill-armory/background'\r\n\r\nconst BACKGROUND_CSS = `\r\n .ar-bg-layer { position: fixed; inset: 0; z-index: -2; overflow: hidden; pointer-events: none; }\r\n .ar-bg-layer .ar-bg-image { width: 100%; height: 100%; display: block; border: 0;\r\n object-fit: var(--ar-bg-fit, cover); opacity: var(--ar-bg-opacity, 1);\r\n filter: blur(var(--ar-bg-blur, 0px)); transform: scale(var(--ar-bg-scale, 1)); transform-origin: center; }\r\n .ar-bg-scrim { position: fixed; inset: 0; z-index: -1; pointer-events: none;\r\n background: rgba(255,255,255, var(--ar-bg-scrim, 0.25)); }\r\n body[data-ds-dark-theme] .ar-bg-scrim { background: rgba(0,0,0, var(--ar-bg-scrim, 0.25)); }\r\n body[${ACTIVE_ATTR}] { --dsw-alias-bg-base: transparent; --dsw-specific-sidebar-fill: transparent; }\r\n body[${GLASS_ATTR}] [data-composer-card],\r\n body[${GLASS_ATTR}] [class*=\"_bubble\"]:not([role=\"tooltip\"]),\r\n body[${GLASS_ATTR}] .md-code-block,\r\n body[${GLASS_ATTR}] [data-terminal], body[${GLASS_ATTR}] [data-diff],\r\n body[${GLASS_ATTR}] [data-read], body[${GLASS_ATTR}] [data-search],\r\n body[${GLASS_ATTR}] [data-web], body[${GLASS_ATTR}] [class*=\"_ioCard\"],\r\n body[${GLASS_ATTR}] [class*=\"_instructionsCard\"],\r\n body[${GLASS_ATTR}] [class*=\"_markdown\"] :not(pre) > code {\r\n background-image: linear-gradient(180deg, rgba(255,255,255, var(--ar-glass-sheen, 0.07)), rgba(255,255,255, var(--ar-glass-sheen-mid, 0.02)) 38%, rgba(255,255,255, 0.01));\r\n -webkit-backdrop-filter: blur(var(--ar-glass-blur, 16px)) saturate(var(--ar-glass-saturate, 1.4)) brightness(var(--ar-glass-brightness, 1)) contrast(1.01);\r\n backdrop-filter: blur(var(--ar-glass-blur, 16px)) saturate(var(--ar-glass-saturate, 1.4)) brightness(var(--ar-glass-brightness, 1)) contrast(1.01);\r\n box-shadow: inset 0 1px 0 rgba(255,255,255,0.32), inset 0 -1px 0 rgba(255,255,255,0.08), inset 0 0 0 0.5px rgba(255,255,255,0.08), 0 12px 40px rgba(0,0,0,0.12);\r\n }\r\n body[${ACTIVE_ATTR}] .md-code-block [class*=\"_bannerWrap\"] { background-color: var(--dsw-alias-markdown-code-block-banner); }\r\n`\r\n\r\nfunction injectBackgroundCss(): void {\r\n try {\r\n if (document.querySelector(`style[data-plugin-css=\"${CSS_TAG}\"]`)) return\r\n const tag = document.createElement('style')\r\n tag.dataset.plugin = 'prompt-skill-armory'\r\n tag.dataset.pluginCss = CSS_TAG\r\n tag.textContent = BACKGROUND_CSS\r\n document.head.appendChild(tag)\r\n } catch { /* stylesheet is cosmetic — never fatal */ }\r\n}\r\n\r\nconst GLASS_TOKENS = [\r\n '--dsw-specific-input-major', '--dsw-specific-bubble', '--dsw-alias-markdown-code-block',\r\n '--dsw-alias-markdown-code-block-banner', '--dsw-alias-markdown-inline-code', '--dsw-specific-tip',\r\n] as const\r\n\r\nfunction glassAlpha(panelOpacity: number): number {\r\n const alpha = 0.05 + panelOpacity * 0.85\r\n return Math.max(0, Math.min(0.9, alpha))\r\n}\r\n\r\nclass BackgroundPainter {\r\n private layer: HTMLDivElement | null = null\r\n private img: HTMLMediaElement | null = null\r\n private scrim: HTMLDivElement | null = null\r\n private observer: MutationObserver | undefined\r\n private settings: BackgroundSettings | undefined\r\n private readonly saved = new Map<string, string>()\r\n\r\n private rememberOnce(prop: string): void {\r\n if (this.saved.has(prop)) return\r\n try { this.saved.set(prop, document.body.style.getPropertyValue(prop)) } catch { this.saved.set(prop, '') }\r\n }\r\n private setVar(name: string, value: string): void {\r\n this.rememberOnce(name)\r\n try { document.body.style.setProperty(name, value) } catch { /* ignore */ }\r\n }\r\n\r\n apply(settings: BackgroundSettings): void {\r\n this.settings = settings\r\n if (!settings.enabled) { this.dispose(); return }\r\n try {\r\n injectBackgroundCss()\r\n const hasSource = settings.url !== '' || settings.uploadId !== ''\r\n for (const prop of ['--dsw-alias-bg-base', '--dsw-specific-sidebar-fill']) {\r\n this.rememberOnce(prop); document.body.style.setProperty(prop, 'transparent')\r\n }\r\n if (!hasSource) { this.removeLayers(); document.body.removeAttribute(ACTIVE_ATTR); this.applyGlass(settings, true); return }\r\n const mediaUrl = settings.uploadId !== '' ? `/api/switchblade-wallpaper/image/${settings.uploadId}` : settings.url\r\n const isVideo = settings.kind === 'video'\r\n\r\n if (!this.layer) {\r\n this.layer = document.createElement('div'); this.layer.className = 'ar-bg-layer'\r\n this.img = document.createElement(isVideo ? 'video' : 'img'); this.img.className = 'ar-bg-image'\r\n if (isVideo) {\r\n this.img.setAttribute('autoplay', ''); this.img.setAttribute('loop', ''); this.img.setAttribute('muted', ''); this.img.setAttribute('playsinline', '')\r\n } else { (this.img as HTMLImageElement).referrerPolicy = 'no-referrer'; this.img.alt = '' }\r\n this.img.onerror = () => { if (this.img && this.img.dataset.failed !== '1') { this.img.dataset.failed = '1'; this.img.style.visibility = 'hidden' } }\r\n this.layer.appendChild(this.img); document.body.appendChild(this.layer)\r\n }\r\n if (this.img && this.img.getAttribute('src') !== mediaUrl) {\r\n delete this.img.dataset.failed; this.img.style.visibility = ''; this.img.setAttribute('src', mediaUrl)\r\n }\r\n if (!this.scrim) { this.scrim = document.createElement('div'); this.scrim.className = 'ar-bg-scrim'; document.body.appendChild(this.scrim) }\r\n document.body.setAttribute(ACTIVE_ATTR, 'on')\r\n\r\n const s = document.body.style\r\n this.setVar('--ar-bg-fit', settings.fit)\r\n this.setVar('--ar-bg-opacity', String(settings.opacity))\r\n this.setVar('--ar-bg-blur', `${settings.wallpaperBlur}px`)\r\n this.setVar('--ar-bg-scale', (1 + settings.wallpaperBlur * 0.006).toFixed(4))\r\n this.setVar('--ar-bg-scrim', String(settings.scrim))\r\n this.setVar('--ar-glass-blur', `${settings.blur}px`)\r\n this.setVar('--ar-glass-saturate', String(settings.blur > 0 ? Math.round(Math.min(1.6, 1.1 + settings.blur * 0.02) * 1000) / 1000 : 1))\r\n this.setVar('--ar-glass-brightness', document.body.dataset.dsDarkTheme !== undefined ? '1.04' : '0.98')\r\n this.setVar('--ar-glass-sheen', document.body.dataset.dsDarkTheme !== undefined ? '0.16' : '0.07')\r\n this.setVar('--ar-glass-sheen-mid', document.body.dataset.dsDarkTheme !== undefined ? '0.05' : '0.02')\r\n this.applyGlass(settings, false)\r\n\r\n if (!this.observer) {\r\n this.observer = new MutationObserver(() => { if (this.settings) this.applyGlass(this.settings, false) })\r\n this.observer.observe(document.body, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n }\r\n } catch { this.dispose() }\r\n }\r\n\r\n dispose(): void {\r\n try {\r\n this.observer?.disconnect(); this.observer = undefined\r\n this.removeLayers()\r\n const s = document.body.style\r\n document.body.removeAttribute(ACTIVE_ATTR); document.body.removeAttribute(GLASS_ATTR)\r\n for (const [prop, value] of this.saved) s.setProperty(prop, value)\r\n this.saved.clear(); this.settings = undefined\r\n } catch { /* ignore */ }\r\n }\r\n\r\n private applyGlass(settings: BackgroundSettings | undefined, forceRestore: boolean): void {\r\n try {\r\n const s = document.body.style\r\n for (const t of GLASS_TOKENS) this.rememberOnce(t)\r\n if (forceRestore || settings === undefined || settings.panelOpacity >= 1) {\r\n for (const t of GLASS_TOKENS) { const o = this.saved.get(t); if (o !== undefined && o !== '') s.setProperty(t, o); else s.removeProperty(t) }\r\n document.body.removeAttribute(GLASS_ATTR); this.setVar('--ar-glass-blur', '0px')\r\n return\r\n }\r\n document.body.setAttribute(GLASS_ATTR, 'on')\r\n const inDark = document.body.dataset.dsDarkTheme !== undefined\r\n const alpha = glassAlpha(settings.panelOpacity) * (inDark ? 0.4 : 0.8)\r\n for (const t of GLASS_TOKENS) s.setProperty(t, `rgba(255,255,255,${alpha.toFixed(3)})`)\r\n } catch { /* ignore */ }\r\n }\r\n\r\n private removeLayers(): void {\r\n try {\r\n if (this.layer) { this.layer.remove(); this.layer = null; this.img = null }\r\n if (this.scrim) { this.scrim.remove(); this.scrim = null }\r\n } catch { /* ignore */ }\r\n }\r\n}\r\n\r\nconst painter = new BackgroundPainter()\r\n\r\n// ---------------------------------------------------------------------------\r\n// Transport: persist via the switchblade settings namespace over the\r\n// connection RPC (the same proven path MCP/prompts use; no webServer route,\r\n// no settings-RPC allowlist dependency). Module-private state avoids any\r\n// self-reference / circular-eval order issue.\r\n// ---------------------------------------------------------------------------\r\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\r\n\r\nconst bgState: { status: 'loading' | 'ready' | 'error'; value: BackgroundSettings } = { status: 'loading', value: DEFAULT_BACKGROUND }\r\nconst bgListeners = new Set<() => void>()\r\nconst notifyBg = (): void => { for (const l of bgListeners) l() }\r\n\r\nlet bgApi: ConnectionHandle['api'] | undefined\r\n\r\n/** Bind the transport to a live connection API (set once at plugin apply). */\r\nexport function initBackgroundClient(api: ConnectionHandle['api']): void {\r\n bgApi = api\r\n}\r\n\r\n/** Surface key: separate wallpaper per web vs desktop (they share the settings doc). */\r\nexport const isDesktopSurface = typeof navigator !== 'undefined' && navigator.userAgent.toLowerCase().includes('electron')\r\nconst surfaceKey = (): string => (isDesktopSurface ? 'backgroundDesktop' : 'backgroundWeb')\r\n\r\n/** Read the background section for the current surface from the switchblade settings. */\r\nfunction readSection(value: unknown): BackgroundSettings {\r\n const sec = (value as { namespaces?: { ns?: string; value?: unknown }[] | undefined }).namespaces\r\n ?.find((n) => n.ns === 'switchblade')?.value as Record<string, unknown> | undefined\r\n const raw = sec?.[surfaceKey()]\r\n return { ...DEFAULT_BACKGROUND, ...(typeof raw === 'object' && raw !== null ? (raw as BackgroundSettings) : {}) }\r\n}\r\n\r\nexport const backgroundClient = {\r\n getSnapshot() { return bgState },\r\n subscribe(l: () => void): () => void { bgListeners.add(l); return () => { bgListeners.delete(l) } },\r\n /** Fetch the durable section. @returns true on success (status ready). */\r\n async load(): Promise<boolean> {\r\n if (bgApi === undefined) { bgState.status = 'error'; return false }\r\n try {\r\n const res = await bgApi.settings.describe({})\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n bgState.status = 'ready'\r\n bgState.value = readSection(res.result.value)\r\n notifyBg()\r\n return true\r\n } catch {\r\n bgState.status = 'error'\r\n return false\r\n }\r\n },\r\n async save(section: BackgroundSettings): Promise<void> {\r\n if (bgApi === undefined) return\r\n try {\r\n const res = await bgApi.settings.mutate({ ns: 'switchblade', ops: [{ op: 'set', path: [surfaceKey()], value: section }] })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n bgState.status = 'ready'\r\n bgState.value = { ...section }\r\n } catch { bgState.status = 'error'; bgState.value = section }\r\n notifyBg()\r\n },\r\n}\r\n\r\n/** Upload a local image/video to the Host (bytes go to disk, never settings). */\r\nexport async function uploadMedia(file: File): Promise<{ id: string; kind: 'image' | 'video'; url: string } | null> {\r\n try {\r\n const res = await fetch('/api/switchblade-wallpaper/upload', { method: 'POST', headers: { 'content-type': file.type }, body: file })\r\n const body = (await res.json()) as { ok: boolean; id?: string; kind?: 'image' | 'video'; url?: string }\r\n if (!res.ok || !body.ok || !body.id || !body.kind || !body.url) return null\r\n return { id: body.id, kind: body.kind, url: body.url }\r\n } catch { return null }\r\n}\r\n\r\n/** Apply a full section through the painter (idempotent, never throws). */\r\nexport function applyBackground(section: BackgroundSettings): void {\r\n try { painter.apply(section) } catch { /* never fatal */ }\r\n applyHintStyle()\r\n}\r\n\r\nlet hintObserver: MutationObserver | undefined\r\n\r\n/** Inject (or clear) the per-surface style for the composer's hint row + dock stats line. */\r\nexport function applyHintStyle(): void {\r\n try {\r\n const hint = (bgState.value ?? DEFAULT_BACKGROUND).hint ?? DEFAULT_BACKGROUND.hint\r\n const existing = document.getElementById('switchblade-hint') as HTMLStyleElement | null\r\n if (!hint.enabled) {\r\n if (existing !== null) existing.remove()\r\n hintObserver?.disconnect(); hintObserver = undefined\r\n return\r\n }\r\n if (existing === null) {\r\n const t = document.createElement('style'); t.id = 'switchblade-hint'; document.head.appendChild(t)\r\n }\r\n const tag = document.getElementById('switchblade-hint') as HTMLStyleElement\r\n const color = hint.color || (isDesktopSurface ? '#7ee787' : '#79c0ff')\r\n const size = hint.size || 11\r\n const gradPreset = GRADIENTS.find((g) => g.id === (hint.gradient ?? ''))\r\n const grad = gradPreset !== undefined ? gradPreset.css : ''\r\n let hintCss = `[data-decoration=\"hint\"]{font-size:${size}px;letter-spacing:0.3px;font-weight:600;opacity:0.95;`\r\n const statsStyle = (root: HTMLElement): void => {\r\n if (grad !== '') {\r\n root.style.backgroundImage = grad\r\n root.style.webkitBackgroundClip = 'text'\r\n root.style.backgroundClip = 'text'\r\n root.style.color = 'transparent'\r\n } else {\r\n root.style.backgroundImage = 'none'\r\n root.style.webkitBackgroundClip = 'initial'\r\n root.style.backgroundClip = 'initial'\r\n root.style.color = color\r\n }\r\n root.style.fontSize = `${size}px`\r\n root.style.fontWeight = '600'\r\n root.style.opacity = '0.95'\r\n }\r\n if (grad !== '') {\r\n hintCss += `background-image:${grad};-webkit-background-clip:text;background-clip:text;color:transparent`\r\n } else {\r\n hintCss += `color:${color}`\r\n }\r\n hintCss += '}'\r\n tag.textContent = hintCss\r\n // The dock's StatsLine roots are CSS-module hashed; locate via its aria-hidden \"|\" separators.\r\n const applyStats = (): void => {\r\n try {\r\n const seps = Array.from(document.querySelectorAll<HTMLSpanElement>('span[aria-hidden]'))\r\n for (const sep of seps) {\r\n if (sep.textContent !== '|') continue\r\n const root = sep.parentElement\r\n if (root !== null) statsStyle(root)\r\n }\r\n } catch { /* ignore */ }\r\n }\r\n if (hintObserver !== undefined) hintObserver.disconnect()\r\n hintObserver = new MutationObserver(applyStats)\r\n hintObserver.observe(document.body, { childList: true, subtree: true })\r\n applyStats()\r\n } catch { /* never fatal */ }\r\n}\r\n","/** Client transport for Armory conversation import/export (same-origin host routes). */\r\n\r\nexport interface ConversationRow {\r\n projectKey: string\r\n sessionId: string\r\n title: string\r\n cwd: string\r\n mtime: number\r\n size: number\r\n}\r\n\r\nexport async function listConversations(): Promise<ConversationRow[]> {\r\n try {\r\n const r = await fetch('/api/armory/sessions')\r\n const b = (await r.json()) as { ok: boolean; sessions?: ConversationRow[] }\r\n return b.ok ? (b.sessions ?? []) : []\r\n } catch { return [] }\r\n}\r\n\r\nexport async function exportConversations(ids: string[], projectKey?: string): Promise<string | null> {\r\n try {\r\n const r = await fetch('/api/armory/export', {\r\n method: 'POST', headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ sessionIds: ids, projectKey, includeAttachments: false, includeWorkspace: false }),\r\n })\r\n const b = (await r.json()) as { ok: boolean; name?: string }\r\n return b.ok && b.name !== undefined ? b.name : null\r\n } catch { return null }\r\n}\r\n\r\nexport async function downloadExport(name: string): Promise<boolean> {\r\n try {\r\n const r = await fetch(`/api/armory/export/${name}`)\r\n if (!r.ok) return false\r\n const blob = await r.blob()\r\n const url = URL.createObjectURL(blob)\r\n const a = document.createElement('a')\r\n a.href = url; a.download = name\r\n document.body.appendChild(a); a.click(); a.remove()\r\n setTimeout(() => URL.revokeObjectURL(url), 1000)\r\n return true\r\n } catch { return false }\r\n}\r\n\r\nexport interface DeleteResult { deleted: number; failed: string[] }\r\n\r\nexport async function deleteConversations(ids: string[]): Promise<DeleteResult | null> {\r\n try {\r\n const r = await fetch('/api/armory/delete', {\r\n method: 'POST', headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ sessionIds: ids }),\r\n })\r\n const b = (await r.json()) as { ok: boolean; deleted?: number; failed?: string[] }\r\n if (!b.ok) return null\r\n return { deleted: b.deleted ?? 0, failed: Array.isArray(b.failed) ? b.failed : [] }\r\n } catch { return null }\r\n}\r\n\r\n/** Query the npm registry for the latest published prompt-skill-armory version. */\r\nexport async function checkLatestVersion(): Promise<string> {\r\n try {\r\n const r = await fetch('/api/armory/version')\r\n const b = (await r.json()) as { ok: boolean; latest?: string }\r\n return b.ok ? (b.latest ?? '') : ''\r\n } catch { return '' }\r\n}\r\n\r\n/** Trigger an in-place update (runs the installer, which reinstalls the plugin). */\r\nexport async function runUpdate(): Promise<{ ok: boolean; error?: string }> {\r\n try {\r\n const r = await fetch('/api/armory/update', { method: 'POST' })\r\n const b = (await r.json()) as { ok: boolean; error?: string }\r\n return { ok: b.ok === true, error: b.error }\r\n } catch { return { ok: false, error: String('网络请求失败') } }\r\n}\r\n\r\n/** Compare dotted versions; true when `a` is older than `b`. */\r\nexport function isOlder(a: string, b: string): boolean {\r\n const pa = a.split('.').map((n) => Number(n) || 0)\r\n const pb = b.split('.').map((n) => Number(n) || 0)\r\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\r\n const x = pa[i] ?? 0; const y = pb[i] ?? 0\r\n if (x !== y) return x < y\r\n }\r\n return false\r\n}\r\n\r\n/** One request-log row (cc-switch style). */\r\nexport interface UsageLogRow {\r\n time: number\r\n provider: string\r\n model: string\r\n inputTokens: number\r\n outputTokens: number\r\n cacheReadTokens: number\r\n cacheWriteTokens: number\r\n cacheHitRate: number\r\n costUsd: number\r\n latencyMs: number\r\n firstTokenMs: number\r\n status: string\r\n source: string\r\n}\r\n\r\n/** Session-level usage stats (mirrors the Host aggregate). */\r\nexport interface UsageStats {\r\n range: string\r\n totals: {\r\n sessions: number; turns: number; steps: number; llmMs: number; toolMs: number\r\n inputTokens: number; outputTokens: number; cacheReadTokens: number; cacheWriteTokens: number\r\n ttftMs: number; ttftSteps: number; decodeMs: number; costUsd: number\r\n avgTtftMs: number; tokPerSec: number; perSessionSteps: number; activeDays: number; cacheHitRate: number\r\n }\r\n byDay: { date: string; sessions: number; turns: number; steps: number; llmMs: number; toolMs: number; inputTokens: number; outputTokens: number; cacheReadTokens: number; cacheWriteTokens: number }[]\r\n byHour: { hour: number; steps: number; outputTokens: number; inputTokens: number; cacheReadTokens: number; cacheWriteTokens: number }[]\r\n byProject: { project: string; sessions: number; steps: number; llmMs: number; toolMs: number; inputTokens: number; outputTokens: number; cacheReadTokens: number; cacheWriteTokens: number; costUsd: number; successRate: number; avgLatencyMs: number; cacheHitRate: number }[]\r\n byModel: { model: string; sessions: number; steps: number; inputTokens: number; outputTokens: number; costUsd: number; cacheHitRate: number }[]\r\n recent: UsageLogRow[]\r\n}\r\n\r\nexport async function fetchStats(range = 'all'): Promise<UsageStats | null> {\r\n try {\r\n const r = await fetch(`/api/armory/stats?range=${encodeURIComponent(range)}`)\r\n const b = (await r.json()) as { ok: boolean } & UsageStats\r\n return b.ok\r\n ? { range: b.range, totals: b.totals, byDay: b.byDay, byHour: b.byHour, byProject: b.byProject, byModel: b.byModel, recent: b.recent }\r\n : null\r\n } catch { return null }\r\n}\r\n\r\nexport async function importConversations(file: File, targetProject?: string): Promise<number | null> {\r\n try {\r\n const q = targetProject !== undefined && targetProject !== '' ? `?project=${encodeURIComponent(targetProject)}` : ''\r\n const r = await fetch(`/api/armory/import${q}`, { method: 'POST', headers: { 'content-type': 'application/zip' }, body: file })\r\n const b = (await r.json()) as { ok: boolean; imported?: number }\r\n return b.ok ? (b.imported ?? 0) : null\r\n } catch { return null }\r\n}\r\n","/**\r\n * Prompt-SkillArmory management page.\r\n *\r\n * Three tabs within the settings dialog's fixed width: Prompts / Skills /\r\n * MCP / Wallpaper / Chat / Stats. The Skills tab is the single home for skills — both the ones\r\n * installed through this panel and the ones scanned from the local skill\r\n * roots — merged into one list with full management (add / edit / toggle /\r\n * remove / invoke hint). A CLI entry box offers direct command installation.\r\n * @module @deepseek-ai/dsh-client-ui-switchblade\r\n */\r\n\r\nimport { useEffect, useMemo, useState } from 'react'\r\nimport type { CSSProperties, JSX } from 'react'\r\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { SwitchbladeKey } from './locales.ts'\r\nimport type { McpServerRow, SwitchbladeSectionInjected, SwitchbladeSectionState } from './store.ts'\r\nimport { backgroundClient, DEFAULT_BACKGROUND, applyBackground, uploadMedia, isDesktopSurface, GRADIENTS, type BackgroundSettings } from './background.ts'\r\nimport { listConversations, exportConversations, downloadExport, importConversations, deleteConversations, checkLatestVersion, runUpdate, isOlder, fetchStats, type ConversationRow, type UsageStats } from './conversations.ts'\r\n\r\nexport type { SwitchbladeSectionInjected } from './store.ts'\r\n\r\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\r\n interface LocaleNamespaceMap {\r\n /** Prompt-SkillArmory page copy. */\r\n 'settings.switchblade': SwitchbladeKey\r\n }\r\n}\r\n\r\n/** Full component props: settings-section runtime + locale + injected face. */\r\nexport type SwitchbladeSectionProps =\r\n PropsRuntime<'settings.section'>\r\n & PropsLocale<'settings.switchblade'>\r\n & InjectFace<SwitchbladeSectionInjected>\r\n\r\n/* ── Design tokens ────────────────────────────────────────────────\r\n * Modern dark UI (Linear / GitHub Dark / Raycast language):\r\n * low-saturation surfaces, one soft accent, pill badges, generous\r\n * radius + spacing, system sans for text, mono only for code.\r\n * ──────────────────────────────────────────────────────────────── */\r\nconst BG = '#0d1117' // root background\r\nconst SURFACE = '#161b22' // card / form surface\r\nconst BORDER = '#30363d' // hairline border\r\nconst TEXT = '#e6edf3' // primary text\r\nconst TEXT_MUTED = '#8b949e' // secondary text\r\nconst ACCENT = '#58a6ff' // brand accent (soft blue)\r\nconst SUCCESS = '#3fb950' // enabled / success\r\nconst DANGER = '#f85149' // danger / delete\r\nconst WARN = '#d29922' // installed / warning\r\nconst MONO = \"'JetBrains Mono',ui-monospace,'SF Mono',Consolas,monospace\"\r\nconst SANS = \"-apple-system,'Segoe UI','Inter',Roboto,'Helvetica Neue',sans-serif\"\r\n\r\nconst CSS: Record<string, CSSProperties> = {\r\n root: {\r\n fontFamily: SANS,\r\n background: BG,\r\n color: TEXT,\r\n padding: '20px',\r\n border: `1px solid ${BORDER}`,\r\n borderRadius: '12px',\r\n width: '100%',\r\n boxSizing: 'border-box' as const,\r\n },\r\n head: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n borderBottom: `1px solid ${BORDER}`,\r\n paddingBottom: '12px',\r\n marginBottom: '14px',\r\n },\r\n title: {\r\n fontSize: '15px',\r\n fontWeight: 600,\r\n letterSpacing: '0.2px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n color: TEXT,\r\n },\r\n titleAccent: {\r\n color: ACCENT,\r\n },\r\n tabs: {\r\n display: 'flex',\r\n gap: '2px',\r\n borderBottom: `1px solid ${BORDER}`,\r\n marginBottom: '14px',\r\n flexWrap: 'wrap' as const,\r\n },\r\n tab: {\r\n background: 'transparent',\r\n border: 'none',\r\n borderBottom: '2px solid transparent',\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n padding: '8px 12px',\r\n cursor: 'pointer',\r\n transition: 'color .15s ease, border-color .15s ease',\r\n },\r\n tabActive: {\r\n color: TEXT,\r\n borderBottomColor: ACCENT,\r\n },\r\n /* Fixed-height content area so every tab renders the same height. */\r\n content: {\r\n height: '600px',\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '12px',\r\n },\r\n form: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '8px',\r\n padding: '12px',\r\n border: `1px solid ${BORDER}`,\r\n borderRadius: '10px',\r\n background: SURFACE,\r\n },\r\n input: {\r\n background: BG,\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT,\r\n font: 'inherit',\r\n fontSize: '13px',\r\n padding: '8px 10px',\r\n borderRadius: '6px',\r\n outline: 'none',\r\n transition: 'border-color .15s ease',\r\n },\r\n textarea: {\r\n background: BG,\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT,\r\n font: 'inherit',\r\n fontSize: '13px',\r\n padding: '8px 10px',\r\n borderRadius: '6px',\r\n minHeight: '48px',\r\n resize: 'vertical' as const,\r\n outline: 'none',\r\n transition: 'border-color .15s ease',\r\n },\r\n actions: {\r\n display: 'flex',\r\n gap: '8px',\r\n flexWrap: 'wrap' as const,\r\n },\r\n actionBtn: {\r\n background: 'transparent',\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '12px',\r\n padding: '4px 10px',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n transition: 'color .15s ease, border-color .15s ease, background .15s ease',\r\n },\r\n dangerBtn: {\r\n borderColor: 'rgba(248,81,73,.4)',\r\n color: DANGER,\r\n },\r\n fileBtn: {\r\n background: 'transparent',\r\n border: `1px dashed ${BORDER}`,\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '12px',\r\n padding: '10px',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n textAlign: 'center' as const,\r\n transition: 'color .15s ease, border-color .15s ease',\r\n },\r\n cliBox: {\r\n border: `1px solid ${BORDER}`,\r\n padding: '10px 12px',\r\n fontSize: '12px',\r\n color: TEXT_MUTED,\r\n background: SURFACE,\r\n borderRadius: '8px',\r\n },\r\n searchInput: {\r\n background: BG,\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '12px',\r\n padding: '7px 10px',\r\n borderRadius: '6px',\r\n width: '100%',\r\n boxSizing: 'border-box' as const,\r\n outline: 'none',\r\n transition: 'border-color .15s ease',\r\n },\r\n scrollBox: {\r\n flex: 1,\r\n overflowY: 'auto' as const,\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n gap: '8px',\r\n paddingRight: '6px',\r\n minHeight: '0',\r\n },\r\n wallGrid: {\r\n flex: 1,\r\n overflowY: 'auto' as const,\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(auto-fill, minmax(128px, 1fr))',\r\n gap: '10px',\r\n paddingRight: '6px',\r\n minHeight: '0',\r\n alignContent: 'start' as const,\r\n },\r\n wallCard: {\r\n border: `1px solid ${BORDER}`,\r\n background: SURFACE,\r\n borderRadius: '10px',\r\n overflow: 'hidden',\r\n cursor: 'pointer',\r\n transition: 'border-color .15s ease',\r\n },\r\n wallActive: {\r\n borderColor: ACCENT,\r\n },\r\n wallPreview: {\r\n height: '88px',\r\n backgroundSize: 'cover' as const,\r\n backgroundPosition: 'center' as const,\r\n },\r\n wallName: {\r\n padding: '6px 10px',\r\n fontSize: '12px',\r\n color: TEXT,\r\n },\r\n card: {\r\n border: `1px solid ${BORDER}`,\r\n background: SURFACE,\r\n borderRadius: '10px',\r\n padding: '10px 12px',\r\n transition: 'border-color .15s ease, background .15s ease',\r\n },\r\n cardTop: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: '8px',\r\n },\r\n name: {\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n wordBreak: 'break-all' as const,\r\n color: TEXT,\r\n },\r\n badge: {\r\n fontSize: '11px',\r\n fontWeight: 500,\r\n padding: '2px 10px',\r\n borderRadius: '999px',\r\n flex: 'none',\r\n },\r\n badgeEnabled: { color: SUCCESS, background: 'rgba(63,185,80,.12)' },\r\n badgeDisabled: { color: TEXT_MUTED, background: 'rgba(139,148,158,.12)' },\r\n badgeInstalled: { color: WARN, background: 'rgba(210,153,34,.12)' },\r\n desc: {\r\n fontSize: '12px',\r\n color: TEXT_MUTED,\r\n marginTop: '6px',\r\n lineHeight: '1.5',\r\n },\r\n invokeHint: {\r\n fontSize: '11px',\r\n color: ACCENT,\r\n marginTop: '6px',\r\n fontFamily: MONO,\r\n },\r\n empty: {\r\n fontSize: '12px',\r\n color: TEXT_MUTED,\r\n padding: '12px 0',\r\n textAlign: 'center' as const,\r\n },\r\n error: {\r\n color: DANGER,\r\n fontSize: '12px',\r\n padding: '10px 0',\r\n },\r\n refreshBtn: {\r\n background: 'transparent',\r\n border: `1px solid ${BORDER}`,\r\n color: TEXT_MUTED,\r\n font: 'inherit',\r\n fontSize: '12px',\r\n padding: '6px 12px',\r\n borderRadius: '6px',\r\n cursor: 'pointer',\r\n transition: 'color .15s ease, border-color .15s ease',\r\n },\r\n hint: {\r\n color: TEXT_MUTED,\r\n fontSize: '11px',\r\n },\r\n versionBadge: {\r\n fontSize: '11px',\r\n fontWeight: 600,\r\n letterSpacing: '0.3px',\r\n color: ACCENT,\r\n border: `1px solid ${BORDER}`,\r\n borderRadius: '999px',\r\n padding: '2px 10px',\r\n marginLeft: '8px',\r\n background: 'rgba(88,166,255,.08)',\r\n flex: 'none',\r\n },\r\n}\r\n\r\n/** Open-book glyph. */\r\nfunction BookIcon({ size = 16 }: { size?: number }): JSX.Element {\r\n return (\r\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" style={{ flex: 'none' }} aria-hidden=\"true\">\r\n <path d=\"M7.5 3.2C6.2 2.4 4.6 2.2 2.8 2.5c-.5.08-.8.5-.8 1v7.6c0 .4.3.7.7.7 1.7-.2 3.2.1 4.8 1V3.2z\" fill=\"currentColor\" opacity=\"0.55\" />\r\n <path d=\"M8.5 3.2c1.3-.8 2.9-1 4.7-.7.5.08.8.5.8 1v7.6c0 .4-.3.7-.7.7-1.7-.2-3.2.1-4.8 1V3.2z\" fill=\"currentColor\" opacity=\"0.85\" />\r\n <path d=\"M8 3.2v10.3\" stroke=\"currentColor\" strokeWidth=\"0.7\" />\r\n </svg>\r\n )\r\n}\r\n\r\ntype TabKey = 'prompts' | 'skills' | 'mcp' | 'wallpaper' | 'chat' | 'stats'\r\n\r\n/** Bump with every release; keep in sync with package.json version + CHANGELOG. */\r\nconst ARMORY_VERSION = '0.9.9'\r\n\r\n/** Compact duration: 45.2s / 2m42s / 1h05m. */\r\nfunction fmtDuration(ms: number): string {\r\n const s = ms / 1000\r\n if (s < 60) return `${Math.round(s * 10) / 10}s`\r\n const m = Math.floor(s / 60)\r\n if (m < 60) return `${m}m${Math.round(s % 60)}s`\r\n const h = Math.floor(m / 60)\r\n return `${h}h${String(m % 60).padStart(2, '0')}m`\r\n}\r\n\r\n/** Compact token count: 517 / 12.2K / 1.2M. */\r\nfunction fmtTokens(n: number): string {\r\n if (n < 1000) return String(n)\r\n if (n < 1_000_000) return `${Math.round(n / 1000)}K`\r\n return `${Math.round(n / 1_000_000 * 10) / 10}M`\r\n}\r\n\r\n/** USD cost, 4 decimals or compact. */\r\nfunction fmtUsd(n: number): string {\r\n if (n === 0) return '$0'\r\n if (n < 0.0001) return '<$0.0001'\r\n return `$${n.toFixed(4)}`\r\n}\r\n\r\n/** Percent. */\r\nfunction fmtPct(n: number): string {\r\n return `${(n * 100).toFixed(1)}%`\r\n}\r\n\r\ninterface TrendPoint { date: string; steps: number; outputTokens: number; inputTokens: number; cacheReadTokens: number; cacheWriteTokens: number }\r\n\r\n/** SVG line chart with dual axes (steps left, tokens right) + hover tooltip. */\r\nfunction TrendChart({ byDay }: { byDay: TrendPoint[] }): JSX.Element {\r\n const [hover, setHover] = useState<number | null>(null)\r\n const W = 640\r\n const H = 180\r\n const PAD = { l: 38, r: 52, t: 10, b: 22 }\r\n const iw = W - PAD.l - PAD.r\r\n const ih = H - PAD.t - PAD.b\r\n const n = byDay.length\r\n if (n === 0) return <div style={CSS.empty}>暂无趋势数据</div>\r\n\r\n const maxSteps = Math.max(...byDay.map((d) => d.steps), 1)\r\n // All token series share the right axis. Input tokens are typically an\r\n // order of magnitude larger than output, so a linear scale flattens the\r\n // output line into the baseline. A log scale keeps both shapes visible;\r\n // the steps axis on the left stays linear.\r\n const maxTokens = Math.max(\r\n ...byDay.map((d) => d.outputTokens),\r\n ...byDay.map((d) => d.inputTokens),\r\n ...byDay.map((d) => d.cacheReadTokens),\r\n ...byDay.map((d) => d.cacheWriteTokens),\r\n 1,\r\n )\r\n const logBase = Math.max(Math.log10(maxTokens), 1) // at least one decade\r\n const x = (i: number): number => PAD.l + (n === 1 ? iw / 2 : (i / (n - 1)) * iw)\r\n const ySteps = (v: number): number => PAD.t + ih - (v / maxSteps) * ih\r\n const yTok = (v: number): number => {\r\n const vv = Math.max(v, 1)\r\n return PAD.t + ih - (Math.log10(vv) / logBase) * ih\r\n }\r\n\r\n const pathSteps = byDay.map((d, i) => `${i === 0 ? 'M' : 'L'}${x(i).toFixed(1)},${ySteps(d.steps).toFixed(1)}`).join(' ')\r\n const pathOut = byDay.map((d, i) => `${i === 0 ? 'M' : 'L'}${x(i).toFixed(1)},${yTok(d.outputTokens).toFixed(1)}`).join(' ')\r\n const pathIn = byDay.map((d, i) => `${i === 0 ? 'M' : 'L'}${x(i).toFixed(1)},${yTok(d.inputTokens).toFixed(1)}`).join(' ')\r\n\r\n // Right-axis ticks in log space: 0% / 25% / 50% / 75% / 100% of the decade,\r\n // rounded to a nice token count (1 / 2 / 5 stepping).\r\n const tokTicks = [0, 0.25, 0.5, 0.75, 1].map((f) => Math.pow(10, f * logBase))\r\n const niceToken = (v: number): string => {\r\n if (v >= 1e6) return `${(v / 1e6).toFixed(v % 1e6 === 0 ? 0 : 1)}M`\r\n if (v >= 1e3) return `${(v / 1e3).toFixed(v % 1e3 === 0 ? 0 : 1)}k`\r\n return String(Math.round(v))\r\n }\r\n\r\n // gridlines (4)\r\n const grid = [0, 1, 2, 3, 4].map((g) => {\r\n const v = maxSteps * (g / 4)\r\n const yy = ySteps(v)\r\n return { yy, label: g === 0 ? '0' : fmtTokens(v) }\r\n })\r\n\r\n const hovered = hover !== null ? byDay[hover] : undefined\r\n\r\n return (\r\n <div style={{ position: 'relative', width: '100%' }}>\r\n <svg viewBox={`0 0 ${W} ${H}`} width=\"100%\" height=\"180\" onMouseLeave={() => setHover(null)}>\r\n {/* gridlines + left labels */}\r\n {grid.map((g, i) => (\r\n <g key={i}>\r\n <line x1={PAD.l} y1={g.yy} x2={W - PAD.r} y2={g.yy} stroke=\"#21262d\" strokeWidth=\"1\" />\r\n <text x={PAD.l - 5} y={g.yy + 3} textAnchor=\"end\" fontSize=\"9\" fill=\"#8b949e\">{g.label}</text>\r\n </g>\r\n ))}\r\n {/* right tokens axis: 5 rounded ticks + max label */}\r\n {tokTicks.map((v, i) => {\r\n const yy = yTok(v)\r\n return (\r\n <text key={i} x={W - PAD.r + 6} y={yy + 3} fontSize=\"9\" fill={i === 4 ? '#3fb950' : '#8b949e'}>\r\n {niceToken(v)}\r\n </text>\r\n )\r\n })}\r\n {/* x labels (max 7) */}\r\n {byDay.map((d, i) => {\r\n if (n > 7 && i % Math.ceil(n / 7) !== 0 && i !== n - 1) return null\r\n return <text key={i} x={x(i)} y={H - 6} textAnchor=\"middle\" fontSize=\"9\" fill=\"#8b949e\">{d.date.includes(':') ? d.date : d.date.slice(5)}</text>\r\n })}\r\n {/* hover vertical guide */}\r\n {hover !== null && (\r\n <line x1={x(hover)} y1={PAD.t} x2={x(hover)} y2={PAD.t + ih} stroke=\"#58a6ff\" strokeDasharray=\"3 3\" strokeWidth=\"1\" />\r\n )}\r\n {/* data lines */}\r\n <path d={pathIn} fill=\"none\" stroke=\"#58a6ff\" strokeWidth=\"1.6\" opacity=\"0.7\" />\r\n <path d={pathOut} fill=\"none\" stroke=\"#3fb950\" strokeWidth=\"1.8\" />\r\n <path d={pathSteps} fill=\"none\" stroke=\"#d29922\" strokeWidth=\"1.8\" strokeDasharray=\"4 3\" />\r\n {/* always-visible data dots + hover hit areas + value labels */}\r\n {byDay.map((d, i) => (\r\n <g key={i}>\r\n <rect x={x(i) - 10} y={PAD.t} width={20} height={ih} fill=\"transparent\" onMouseEnter={() => setHover(i)} />\r\n <circle cx={x(i)} cy={ySteps(d.steps)} r={hover === i ? 4 : 3} fill=\"#d29922\" stroke=\"#0d1117\" strokeWidth=\"1\" />\r\n <circle cx={x(i)} cy={yTok(d.outputTokens)} r={hover === i ? 4 : 3} fill=\"#3fb950\" stroke=\"#0d1117\" strokeWidth=\"1\" />\r\n <circle cx={x(i)} cy={yTok(d.inputTokens)} r={hover === i ? 4 : 3} fill=\"#58a6ff\" stroke=\"#0d1117\" strokeWidth=\"1\" />\r\n {n <= 4 && (\r\n <>\r\n <text x={x(i)} y={ySteps(d.steps) - 6} textAnchor=\"middle\" fontSize=\"8.5\" fill=\"#d29922\">{d.steps}</text>\r\n <text x={x(i)} y={yTok(d.outputTokens) - 6} textAnchor=\"middle\" fontSize=\"8.5\" fill=\"#3fb950\">{fmtTokens(d.outputTokens)}</text>\r\n <text x={x(i)} y={yTok(d.inputTokens) - 6} textAnchor=\"middle\" fontSize=\"8.5\" fill=\"#58a6ff\">{fmtTokens(d.inputTokens)}</text>\r\n </>\r\n )}\r\n </g>\r\n ))}\r\n </svg>\r\n {/* tooltip */}\r\n {hovered !== undefined && (\r\n <div style={{ position: 'absolute', top: 0, left: Math.min(Math.max(x(hover!) / W * 100, 10), 70) + '%', background: 'rgba(22,27,34,.95)', border: '1px solid #30363d', borderRadius: '8px', padding: '8px 10px', fontSize: '11px', color: '#e6edf3', zIndex: 5, whiteSpace: 'nowrap', boxShadow: '0 4px 14px rgba(0,0,0,.4)' }}>\r\n <div style={{ fontWeight: 600, marginBottom: '4px', color: '#58a6ff' }}>{hovered.date}</div>\r\n <div>步骤:{hovered.steps}</div>\r\n <div>输出:{fmtTokens(hovered.outputTokens)}</div>\r\n <div>输入:{fmtTokens(hovered.inputTokens)}</div>\r\n <div>缓存读:{fmtTokens(hovered.cacheReadTokens)} · 写:{fmtTokens(hovered.cacheWriteTokens)}</div>\r\n </div>\r\n )}\r\n {/* legend */}\r\n <div style={{ display: 'flex', gap: '12px', marginTop: '4px', fontSize: '11px', color: '#8b949e', flexWrap: 'wrap' as const }}>\r\n <span><span style={{ color: '#d29922' }}>—</span> 步骤</span>\r\n <span><span style={{ color: '#3fb950' }}>—</span> 输出 Token</span>\r\n <span><span style={{ color: '#58a6ff' }}>—</span> 输入 Token</span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n\r\n/** Render the Prompt-SkillArmory management page. */\r\nexport function SwitchbladeSection(props: SwitchbladeSectionProps): JSX.Element {\r\n const {\r\n useSwitchblade, t, load,\r\n addPrompt, updatePrompt, setPromptEnabled, setDefaultPrompt, deletePrompt,\r\n installSkill, updateSkill, setSkillEnabled, uninstallSkill,\r\n addMcpServer, updateMcpServer, toggleMcpServer, removeMcpServer, testMcpServer,\r\n refreshSessions,\r\n } = props\r\n const state = useSwitchblade((snapshot: SwitchbladeSectionState) => snapshot)\r\n const [promptName, setPromptName] = useState('')\r\n const [promptDesc, setPromptDesc] = useState('')\r\n const [promptContent, setPromptContent] = useState('')\r\n const [promptScopeType, setPromptScopeType] = useState<'global' | 'project' | 'session'>('global')\r\n const [promptScopeKey, setPromptScopeKey] = useState('')\r\n const [skillName, setSkillName] = useState('')\r\n const [skillDesc, setSkillDesc] = useState('')\r\n const [skillContent, setSkillContent] = useState('')\r\n const [busy, setBusy] = useState(false)\r\n const [pickedFile, setPickedFile] = useState('')\r\n const [promptQuery, setPromptQuery] = useState('')\r\n const [skillQuery, setSkillQuery] = useState('')\r\n const [activeTab, setActiveTab] = useState<TabKey>('prompts')\r\n const [editingPromptId, setEditingPromptId] = useState<string | undefined>()\r\n const [editingSkillName, setEditingSkillName] = useState<string | undefined>()\r\n // MCP form state\r\n const [mcpName, setMcpName] = useState('')\r\n const [mcpTransport, setMcpTransport] = useState<'stdio' | 'streamable-http'>('stdio')\r\n const [mcpCommand, setMcpCommand] = useState('')\r\n const [mcpArgs, setMcpArgs] = useState('')\r\n const [mcpEnv, setMcpEnv] = useState('')\r\n const [mcpUrl, setMcpUrl] = useState('')\r\n const [mcpHeaders, setMcpHeaders] = useState('')\r\n const [editingMcpName, setEditingMcpName] = useState<string | undefined>()\r\n\r\n useEffect(() => {\r\n void load()\r\n }, [load])\r\n\r\n const refresh = (): void => {\r\n void load()\r\n }\r\n\r\n /** Parse newline-separated `KEY=VALUE` lines into a record. */\r\n const parseKv = (text: string): Record<string, string> => {\r\n const out: Record<string, string> = {}\r\n for (const line of text.split('\\n')) {\r\n const idx = line.indexOf('=')\r\n if (idx <= 0) continue\r\n const key = line.slice(0, idx).trim()\r\n const value = line.slice(idx + 1).trim()\r\n if (key !== '') out[key] = value\r\n }\r\n return out\r\n }\r\n\r\n /** Submit the MCP server form (add or update). */\r\n const submitMcpServer = (): void => {\r\n if (mcpName.trim() === '') return\r\n setBusy(true)\r\n const base = { serverName: mcpName.trim(), transport: mcpTransport, enabled: true }\r\n const config = mcpTransport === 'stdio'\r\n ? {\r\n ...base,\r\n command: mcpCommand.trim(),\r\n args: mcpArgs.trim() ? mcpArgs.trim().split(/\\s+/) : [],\r\n env: parseKv(mcpEnv),\r\n }\r\n : { ...base, url: mcpUrl.trim(), headers: parseKv(mcpHeaders) }\r\n const action = editingMcpName !== undefined\r\n ? updateMcpServer(editingMcpName, config)\r\n : addMcpServer(config)\r\n void action\r\n .catch((error: unknown) => console.error('[switchblade] mcp save failed', error))\r\n .finally(() => {\r\n setBusy(false)\r\n setMcpName(''); setMcpCommand(''); setMcpArgs(''); setMcpEnv(''); setMcpUrl(''); setMcpHeaders('')\r\n setEditingMcpName(undefined)\r\n })\r\n }\r\n\r\n /** Load one MCP server into the edit form. */\r\n const startEditMcpServer = (server: McpServerRow): void => {\r\n setEditingMcpName(server.serverName)\r\n setMcpName(server.serverName)\r\n setMcpTransport(server.transport)\r\n setMcpCommand(server.command ?? '')\r\n setMcpArgs((server.args ?? []).join(' '))\r\n setMcpEnv(Object.entries(server.env ?? {}).map(([k, v]) => `${k}=${v}`).join('\\n'))\r\n setMcpUrl(server.url ?? '')\r\n setMcpHeaders(Object.entries(server.headers ?? {}).map(([k, v]) => `${k}=${v}`).join('\\n'))\r\n }\r\n\r\n // Background / effects draft + handlers (persisted via backgroundClient\r\n // route; live preview through applyBackground / applyBackgroundKnob).\r\n const [bgDraft, setBgDraft] = useState<BackgroundSettings>(DEFAULT_BACKGROUND)\r\n\r\n // Conversation import/export state\r\n const [chatRows, setChatRows] = useState<ConversationRow[]>([])\r\n const [chatSelected, setChatSelected] = useState<Set<string>>(new Set())\r\n const [chatTarget, setChatTarget] = useState('')\r\n const [chatProject, setChatProject] = useState('')\r\n const [chatBusy, setChatBusy] = useState(false)\r\n const [chatMsg, setChatMsg] = useState('')\r\n // Update availability\r\n const [latestVer, setLatestVer] = useState('')\r\n const [updating, setUpdating] = useState(false)\r\n const [updateMsg, setUpdateMsg] = useState('')\r\n // Usage stats\r\n const [stats, setStats] = useState<UsageStats | null>(null)\r\n const [statsRange, setStatsRange] = useState('all')\r\n const [statsUpdatedAt, setStatsUpdatedAt] = useState(0)\r\n\r\n // Live refresh: poll the current range every 30s while the stats tab is open\r\n // (the host caches for 4s, so polling is cheap). Keeps the chart and totals\r\n // tracking the latest usage for today/7d/30d/all alike.\r\n const reloadStats = async (): Promise<void> => {\r\n const s = await fetchStats(statsRange)\r\n if (s !== null) { setStats(s); setStatsUpdatedAt(Date.now()) }\r\n }\r\n const changeStatsRange = (r: string): void => {\r\n setStatsRange(r)\r\n void fetchStats(r).then((s) => { if (s !== null) { setStats(s); setStatsUpdatedAt(Date.now()) } })\r\n }\r\n useEffect(() => {\r\n if (activeTab !== 'stats') return\r\n const timer = setInterval(() => { void reloadStats() }, 30000)\r\n return () => clearInterval(timer)\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [activeTab, statsRange])\r\n\r\n useEffect(() => {\r\n void checkLatestVersion().then((v) => { if (v !== '') setLatestVer(v) })\r\n }, [])\r\n\r\n const reloadChat = async (): Promise<void> => {\r\n setChatRows(await listConversations())\r\n }\r\n\r\n useEffect(() => { void reloadChat() }, [])\r\n\r\n const toggleChatSel = (id: string): void => {\r\n setChatSelected((prev) => { const n = new Set(prev); if (n.has(id)) n.delete(id); else n.add(id); return n })\r\n }\r\n\r\n // Deduplicated project workspaces (projectKey + display name from cwd basename).\r\n const chatProjects = useMemo(() => {\r\n const byKey = new Map<string, string>()\r\n for (const row of chatRows) {\r\n const name = row.cwd ? row.cwd.split(/[\\\\/]/).filter(Boolean).pop() ?? row.projectKey : row.projectKey\r\n if (!byKey.has(row.projectKey)) byKey.set(row.projectKey, name)\r\n }\r\n return [...byKey.entries()].map(([key, name]) => ({ key, name })).sort((a, b) => a.name.localeCompare(b.name))\r\n }, [chatRows])\r\n\r\n // Keep the selected project valid as rows load.\r\n useEffect(() => {\r\n if (chatProject === '' && chatProjects.length > 0) setChatProject(chatProjects[0].key)\r\n else if (chatProject !== '' && !chatProjects.some((p) => p.key === chatProject)) setChatProject(chatProjects[0]?.key ?? '')\r\n }, [chatProjects, chatProject])\r\n\r\n const doExportChat = async (): Promise<void> => {\r\n setChatBusy(true); setChatMsg('')\r\n try {\r\n const name = await exportConversations([...chatSelected])\r\n if (name === null) { setChatMsg('导出失败'); return }\r\n const ok = await downloadExport(name)\r\n setChatMsg(ok ? `已导出 ${name}` : '导出失败:下载未完成')\r\n } catch { setChatMsg('导出失败') } finally { setChatBusy(false) }\r\n }\r\n\r\n const doExportProject = async (): Promise<void> => {\r\n const key = chatProject.trim()\r\n if (key === '') { setChatMsg('请先选择项目工作区'); return }\r\n setChatBusy(true); setChatMsg('')\r\n try {\r\n const name = await exportConversations([], key)\r\n if (name === null) { setChatMsg('导出失败'); return }\r\n const ok = await downloadExport(name)\r\n setChatMsg(ok ? `已导出整个项目 ${key} → ${name}` : '导出失败:下载未完成')\r\n } catch { setChatMsg('导出失败') } finally { setChatBusy(false) }\r\n }\r\n\r\n const doUpdate = async (): Promise<void> => {\r\n setUpdating(true); setUpdateMsg('')\r\n const r = await runUpdate()\r\n setUpdateMsg(r.ok ? '更新完成,请重启客户端生效' : (r.error !== undefined && r.error !== '' ? `更新失败:${r.error.slice(0, 300)}` : '更新失败'))\r\n setUpdating(false)\r\n }\r\n\r\n const onChatFile = async (file: File | undefined): Promise<void> => {\r\n if (file === undefined) return\r\n setChatBusy(true); setChatMsg('')\r\n try {\r\n const n = await importConversations(file, chatTarget.trim() || undefined)\r\n setChatMsg(n === null ? '导入失败' : `已导入 ${n} 个对话,重启客户端后生效`)\r\n if (n !== null) { refreshSessions(); await reloadChat() }\r\n } catch { setChatMsg('导入失败') } finally { setChatBusy(false) }\r\n }\r\n\r\n const doDeleteChat = async (): Promise<void> => {\r\n const ids = [...chatSelected]\r\n if (ids.length === 0) return\r\n if (!window.confirm(`确定删除选中的 ${ids.length} 个对话吗?此操作不可恢复。`)) return\r\n setChatBusy(true); setChatMsg('')\r\n try {\r\n const r = await deleteConversations(ids)\r\n if (r === null) { setChatMsg('删除失败'); return }\r\n setChatSelected(new Set())\r\n const failMsg = r.failed.length > 0 ? `;${r.failed.length} 个删除失败(文件可能被占用,可稍后重试)` : ''\r\n setChatMsg(`已删除 ${r.deleted} 个对话${failMsg}`)\r\n refreshSessions()\r\n await reloadChat()\r\n } catch { setChatMsg('删除失败') } finally { setChatBusy(false) }\r\n }\r\n\r\n useEffect(() => {\r\n const snap = backgroundClient.getSnapshot()\r\n if (snap.status === 'ready') {\r\n setBgDraft({ ...snap.value })\r\n applyBackground(snap.value)\r\n }\r\n }, [])\r\n\r\n const saveBackground = (draft: BackgroundSettings): void => {\r\n void backgroundClient.save(draft)\r\n }\r\n const resetBackground = (): void => {\r\n const d = { ...DEFAULT_BACKGROUND }\r\n setBgDraft(d); applyBackground(d); void backgroundClient.save(d)\r\n }\r\n const updateBgLive = (patch: Partial<BackgroundSettings>): void => {\r\n setBgDraft((prev) => {\r\n const next = { ...prev, ...patch }\r\n applyBackground(next)\r\n void backgroundClient.save(next)\r\n return next\r\n })\r\n }\r\n const bgSlider = (label: string, key: 'opacity' | 'scrim' | 'panelOpacity' | 'blur' | 'wallpaperBlur', min: number, max: number, step: number): JSX.Element => (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>{label}</span>\r\n <input type=\"range\" min={min} max={max} step={step}\r\n value={bgDraft[key] as number}\r\n onChange={(e) => updateBgLive({ [key]: Number(e.target.value) } as Partial<BackgroundSettings>)}\r\n style={{ flex: 1 }} />\r\n <span style={{ ...CSS.hint, width: '34px', textAlign: 'right' as const }}>{Math.round((bgDraft[key] as number) * 100)}</span>\r\n </div>\r\n )\r\n\r\n /** Read a local skill .md file into the import form. */\r\n const onSkillFile = (file: File | undefined): void => {\r\n if (file === undefined) return\r\n setPickedFile(file.name)\r\n void file.text().then((text) => {\r\n const first = text.split('\\n')[0]?.trim() ?? ''\r\n const nameMatch = /^#\\s+([a-z0-9][a-z0-9-]*)$/i.exec(first)\r\n if (nameMatch !== null) setSkillName(nameMatch[1]?.toLowerCase() ?? '')\r\n setSkillContent(text.trim())\r\n const descLine = text.split('\\n').find((l) => l.startsWith('> '))\r\n if (descLine !== undefined) setSkillDesc(descLine.slice(2).trim())\r\n }).catch((error: unknown) => console.error('[switchblade] read skill file failed', error))\r\n }\r\n\r\n const submitPrompt = (): void => {\r\n if (promptName.trim() === '' || promptContent.trim() === '') return\r\n setBusy(true)\r\n const scope = promptScopeType === 'global'\r\n ? undefined\r\n : promptScopeType === 'project'\r\n ? { type: 'project' as const, key: promptScopeKey.trim() }\r\n : { type: 'session' as const, id: promptScopeKey.trim() }\r\n const action = editingPromptId !== undefined\r\n ? updatePrompt(editingPromptId, { name: promptName, description: promptDesc, content: promptContent, scope })\r\n : addPrompt({ name: promptName, description: promptDesc, content: promptContent, scope })\r\n void action\r\n .catch((error: unknown) => console.error('[switchblade] prompt save failed', error))\r\n .finally(() => {\r\n setBusy(false)\r\n setPromptName(''); setPromptDesc(''); setPromptContent('')\r\n setPromptScopeType('global'); setPromptScopeKey('')\r\n setEditingPromptId(undefined)\r\n })\r\n }\r\n\r\n const startEditPrompt = (row: { promptId: string; name: string; desc: string; content?: string; scope?: { type: string; key?: string; id?: string } }): void => {\r\n setEditingPromptId(row.promptId)\r\n setPromptName(row.name)\r\n setPromptDesc(row.desc)\r\n setPromptContent(row.content ?? '')\r\n const s = row.scope\r\n if (s !== undefined && (s.type === 'project' || s.type === 'session')) {\r\n setPromptScopeType(s.type)\r\n setPromptScopeKey(s.type === 'project' ? (s.key ?? '') : (s.id ?? ''))\r\n } else {\r\n setPromptScopeType('global'); setPromptScopeKey('')\r\n }\r\n }\r\n\r\n const togglePrompt = (id: string, enabled: boolean): void => {\r\n void setPromptEnabled(id, enabled).catch((error: unknown) => console.error('[switchblade] toggle failed', error))\r\n }\r\n\r\n const markDefault = (id: string): void => {\r\n void setDefaultPrompt(id).catch((error: unknown) => console.error('[switchblade] setDefault failed', error))\r\n }\r\n\r\n const removePrompt = (id: string): void => {\r\n void deletePrompt(id).catch((error: unknown) => console.error('[switchblade] delete failed', error))\r\n }\r\n\r\n const submitSkill = (): void => {\r\n if (skillName.trim() === '' || skillContent.trim() === '') return\r\n setBusy(true)\r\n const action = editingSkillName !== undefined\r\n ? updateSkill(editingSkillName, { name: skillName, description: skillDesc, content: skillContent })\r\n : installSkill({ name: skillName, description: skillDesc, content: skillContent })\r\n void action\r\n .catch((error: unknown) => console.error('[switchblade] skill save failed', error))\r\n .finally(() => {\r\n setBusy(false)\r\n setSkillName(''); setSkillDesc(''); setSkillContent('')\r\n setEditingSkillName(undefined)\r\n })\r\n }\r\n\r\n const startEditSkill = (row: { installedName: string; name: string; desc: string }): void => {\r\n const found = state.installedSkills.find((s) => s.name === row.installedName)\r\n setEditingSkillName(row.installedName)\r\n setSkillName(row.name)\r\n setSkillDesc(row.desc)\r\n setSkillContent(found?.content ?? '')\r\n }\r\n\r\n const toggleSkill = (name: string, enabled: boolean): void => {\r\n void setSkillEnabled(name, enabled).catch((error: unknown) => console.error('[switchblade] toggle skill failed', error))\r\n }\r\n\r\n const removeSkill = (name: string): void => {\r\n void uninstallSkill(name).catch((error: unknown) => console.error('[switchblade] uninstall failed', error))\r\n }\r\n\r\n /** Adopt a scanned (local) skill into the managed list. */\r\n const adoptSkill = (name: string): void => {\r\n const found = state.skills.find((s) => s.name === name)\r\n if (found === undefined) return\r\n void installSkill({ name: found.name, description: found.description, content: `# ${found.name}\\n\\n${found.description}` })\r\n .catch((error: unknown) => console.error('[switchblade] adopt skill failed', error))\r\n }\r\n\r\n const promptRows = state.prompts.map((p) => ({\r\n id: p.id, name: p.name, desc: p.description, state: p.enabled ? ('enabled' as const) : ('disabled' as const),\r\n promptId: p.id, isDefault: p.isDefault, content: p.content, promptEnabled: p.enabled, scope: p.scope,\r\n }))\r\n\r\n // Merge managed + scanned skills into ONE list, managed first.\r\n const managedNames = new Set(state.installedSkills.map((s) => s.name))\r\n const managedRows = state.installedSkills.map((s) => ({\r\n key: `m-${s.name}`, name: s.name, desc: s.description,\r\n state: s.enabled ? ('enabled' as const) : ('disabled' as const),\r\n installedName: s.name, skillEnabled: s.enabled, source: 'managed' as const,\r\n }))\r\n const scannedRows = state.skills\r\n .filter((s) => !managedNames.has(s.name))\r\n .map((s) => ({\r\n key: `s-${s.name}`, name: s.name, desc: s.description,\r\n state: ('installed' as const), installedName: s.name, skillEnabled: false, source: 'scanned' as const,\r\n }))\r\n const allSkillRows = [...managedRows, ...scannedRows]\r\n\r\n const match = (row: { name: string; desc: string }, q: string): boolean => {\r\n const query = q.trim().toLowerCase()\r\n if (query === '') return true\r\n return row.name.toLowerCase().includes(query) || row.desc.toLowerCase().includes(query)\r\n }\r\n const filteredPrompts = promptRows.filter((r) => match(r, promptQuery))\r\n const filteredSkills = allSkillRows.filter((r) => match(r, skillQuery))\r\n\r\n const badge = (state: 'enabled' | 'disabled' | 'installed'): CSSProperties => (\r\n state === 'enabled' ? CSS.badgeEnabled! : state === 'disabled' ? CSS.badgeDisabled! : CSS.badgeInstalled!\r\n )\r\n const label = (state: 'enabled' | 'disabled' | 'installed'): string => (\r\n state === 'enabled' ? t('enabled') : state === 'disabled' ? t('disabled') : t('installed')\r\n )\r\n\r\n return (\r\n <div style={CSS.root}>\r\n <div style={CSS.head}>\r\n <div style={CSS.title}>\r\n <BookIcon size={16} /> <span style={CSS.titleAccent}>Armory</span>\r\n <span style={CSS.versionBadge}>v{ARMORY_VERSION}</span>\r\n {latestVer !== '' && isOlder(ARMORY_VERSION, latestVer) && (\r\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px', marginLeft: '8px' }}>\r\n <button style={{ ...CSS.actionBtn, ...CSS.badgeEnabled, fontSize: '11px', padding: '2px 8px' }} disabled={updating} onClick={() => void doUpdate()}>\r\n {updating ? '更新中…' : `↑ v${latestVer} 更新`}\r\n </button>\r\n {updateMsg !== '' && <span style={{ ...CSS.hint, whiteSpace: 'nowrap' as const }}>{updateMsg.slice(0, 60)}</span>}\r\n </span>\r\n )}\r\n </div>\r\n <button style={CSS.refreshBtn} onClick={refresh}>{t('refresh')}</button>\r\n </div>\r\n\r\n {state.status === 'error' && <div style={CSS.error}>✖ {t('loadFailed')}: {state.message}</div>}\r\n\r\n {/* Tab bar */}\r\n <div style={CSS.tabs}>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'prompts' ? CSS.tabActive : {}) }} onClick={() => setActiveTab('prompts')}>\r\n {t('promptsTitle')} ({state.status === 'loading' ? '…' : promptRows.length})\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'skills' ? CSS.tabActive : {}) }} onClick={() => setActiveTab('skills')}>\r\n {t('installSkill')} ({state.status === 'loading' ? '…' : allSkillRows.length})\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'mcp' ? CSS.tabActive : {}) }} onClick={() => setActiveTab('mcp')}>\r\n MCP ({state.status === 'loading' ? '…' : state.mcpServers.length})\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'wallpaper' ? CSS.tabActive : {}) }} onClick={() => setActiveTab('wallpaper')}>\r\n Wallpaper\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'chat' ? CSS.tabActive : {}) }} onClick={() => { setActiveTab('chat'); void reloadChat() }}>\r\n 对话 ({chatRows.length})\r\n </button>\r\n <button style={{ ...CSS.tab, ...(activeTab === 'stats' ? CSS.tabActive : {}) }} onClick={() => { setActiveTab('stats'); void reloadStats() }}>\r\n 统计\r\n </button>\r\n </div>\r\n\r\n {/* Fixed-height content area — every tab renders the same height. */}\r\n <div style={CSS.content}>\r\n {/* ── Tab: prompts ─────────────────────────────────────── */}\r\n {activeTab === 'prompts' && (\r\n <>\r\n <div style={CSS.form}>\r\n <input style={CSS.input} placeholder={t('promptNamePlaceholder')} value={promptName} onChange={(e) => setPromptName(e.target.value)} />\r\n <input style={CSS.input} placeholder={t('promptDescPlaceholder')} value={promptDesc} onChange={(e) => setPromptDesc(e.target.value)} />\r\n <textarea style={CSS.textarea} placeholder={t('promptContentPlaceholder')} value={promptContent} onChange={(e) => setPromptContent(e.target.value)} />\r\n <div style={{ display: 'flex', gap: '6px', alignItems: 'center', flexWrap: 'wrap' as const }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>作用域</span>\r\n {(['global', 'project', 'session'] as const).map((st) => (\r\n <button key={st} style={{ ...CSS.actionBtn, ...(promptScopeType === st ? CSS.tabActive : {}) }}\r\n onClick={() => setPromptScopeType(st)}>\r\n {st === 'global' ? '全局' : st === 'project' ? '指定项目' : '指定会话'}\r\n </button>\r\n ))}\r\n {promptScopeType !== 'global' && (\r\n <input style={{ ...CSS.input, maxWidth: '240px', flex: 1, minWidth: '120px' }}\r\n placeholder={promptScopeType === 'project' ? '项目目录名(如 qc)' : '会话 id(session-…)'}\r\n value={promptScopeKey}\r\n onChange={(e) => setPromptScopeKey(e.target.value)} />\r\n )}\r\n </div>\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} disabled={busy} onClick={submitPrompt}>\r\n {editingPromptId !== undefined ? t('save') : t('addPrompt')}\r\n </button>\r\n {editingPromptId !== undefined && (\r\n <button style={CSS.actionBtn} onClick={() => { setEditingPromptId(undefined); setPromptName(''); setPromptDesc(''); setPromptContent(''); setPromptScopeType('global'); setPromptScopeKey('') }}>{t('cancel')}</button>\r\n )}\r\n </div>\r\n </div>\r\n <input style={CSS.searchInput} placeholder={t('searchPlaceholder')} value={promptQuery} onChange={(e) => setPromptQuery(e.target.value)} />\r\n <div style={CSS.scrollBox}>\r\n {filteredPrompts.length === 0\r\n ? <div style={CSS.empty}>{t('empty')}</div>\r\n : filteredPrompts.map((row) => (\r\n <div key={row.id} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={CSS.name}>{row.isDefault ? '★ ' : ''}{row.name}</div>\r\n <span style={{ ...CSS.badge, ...row.state === 'enabled' ? CSS.badgeEnabled : CSS.badgeDisabled }}>\r\n {row.state === 'enabled' ? t('enabled') : t('disabled')}\r\n </span>\r\n {row.scope !== undefined && row.scope.type !== 'global' && (\r\n <span style={{ ...CSS.badge, ...CSS.badgeInstalled }}>\r\n {row.scope.type === 'project' ? `项目:${row.scope.key}` : `会话:${row.scope.id.slice(0, 12)}…`}\r\n </span>\r\n )}\r\n </div>\r\n <div style={CSS.desc}>{row.desc || row.content?.slice(0, 80)}</div>\r\n <div style={CSS.actions}>\r\n {!row.isDefault && <button style={CSS.actionBtn} onClick={() => markDefault(row.promptId!)}>{t('setDefault')}</button>}\r\n <button style={CSS.actionBtn} onClick={() => togglePrompt(row.promptId!, !row.promptEnabled)}>\r\n {row.state === 'enabled' ? t('disable') : t('enable')}\r\n </button>\r\n <button style={CSS.actionBtn} onClick={() => startEditPrompt(row)}>{t('edit')}</button>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={() => removePrompt(row.promptId!)}>{t('delete')}</button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: skills (merged managed + scanned) ───────────── */}\r\n {activeTab === 'skills' && (\r\n <>\r\n <div style={CSS.form}>\r\n <label style={CSS.fileBtn}>\r\n {pickedFile !== '' ? `📄 ${pickedFile}` : t('pickSkillFile')}\r\n <input type=\"file\" accept=\".md,.markdown,text/markdown,text/plain\" style={{ display: 'none' }} onChange={(e) => onSkillFile(e.target.files?.[0])} />\r\n </label>\r\n <input style={CSS.input} placeholder={t('skillNamePlaceholder')} value={skillName} onChange={(e) => setSkillName(e.target.value)} />\r\n <input style={CSS.input} placeholder={t('skillDescPlaceholder')} value={skillDesc} onChange={(e) => setSkillDesc(e.target.value)} />\r\n <textarea style={CSS.textarea} placeholder={t('skillContentPlaceholder')} value={skillContent} onChange={(e) => setSkillContent(e.target.value)} />\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} disabled={busy} onClick={submitSkill}>\r\n {editingSkillName !== undefined ? t('save') : t('addSkill')}\r\n </button>\r\n {editingSkillName !== undefined && (\r\n <button style={CSS.actionBtn} onClick={() => { setEditingSkillName(undefined); setSkillName(''); setSkillDesc(''); setSkillContent('') }}>{t('cancel')}</button>\r\n )}\r\n </div>\r\n </div>\r\n <div style={CSS.cliBox}>\r\n <div style={{ marginBottom: '4px' }}>{t('cliHint')}</div>\r\n <code style={{ fontSize: '11px', color: ACCENT, fontFamily: MONO }}>/armory-skill-dir &lt;目录&gt; · /armory-install-zip &lt;zip路径&gt;</code>\r\n </div>\r\n <input style={CSS.searchInput} placeholder={t('searchPlaceholder')} value={skillQuery} onChange={(e) => setSkillQuery(e.target.value)} />\r\n <div style={CSS.scrollBox}>\r\n {filteredSkills.length === 0\r\n ? <div style={CSS.empty}>{t('empty')}</div>\r\n : filteredSkills.map((row) => (\r\n <div key={row.key} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={CSS.name}>{row.name}</div>\r\n <span style={{ ...CSS.badge, ...badge(row.state) }}>{label(row.state)}</span>\r\n </div>\r\n <div style={CSS.desc}>{row.desc}</div>\r\n <div style={CSS.invokeHint}>/ {row.name}</div>\r\n <div style={CSS.actions}>\r\n {row.source === 'scanned' ? (\r\n <button style={CSS.actionBtn} onClick={() => adoptSkill(row.name)}>{t('manage')}</button>\r\n ) : (\r\n <>\r\n <button style={CSS.actionBtn} onClick={() => toggleSkill(row.installedName!, !row.skillEnabled)}>\r\n {row.state === 'enabled' ? t('disable') : t('enable')}\r\n </button>\r\n <button style={CSS.actionBtn} onClick={() => startEditSkill(row)}>{t('edit')}</button>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={() => removeSkill(row.installedName!)}>{t('uninstall')}</button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: MCP servers ─────────────────────────────────── */}\r\n {activeTab === 'mcp' && (\r\n <>\r\n <div style={CSS.form}>\r\n <input style={CSS.input} placeholder=\"服务器名称 (serverName)\" value={mcpName} onChange={(e) => setMcpName(e.target.value)} />\r\n <div style={CSS.actions}>\r\n <button style={{ ...CSS.actionBtn, ...(mcpTransport === 'stdio' ? CSS.tabActive : {}) }} onClick={() => setMcpTransport('stdio')}>stdio</button>\r\n <button style={{ ...CSS.actionBtn, ...(mcpTransport === 'streamable-http' ? CSS.tabActive : {}) }} onClick={() => setMcpTransport('streamable-http')}>HTTP</button>\r\n </div>\r\n {mcpTransport === 'stdio' ? (\r\n <>\r\n <input style={CSS.input} placeholder=\"命令 (command, 如 npx)\" value={mcpCommand} onChange={(e) => setMcpCommand(e.target.value)} />\r\n <input style={CSS.input} placeholder=\"参数 (args, 空格分隔)\" value={mcpArgs} onChange={(e) => setMcpArgs(e.target.value)} />\r\n <textarea style={CSS.textarea} placeholder=\"环境变量 (env, 每行 KEY=VALUE)\" value={mcpEnv} onChange={(e) => setMcpEnv(e.target.value)} />\r\n </>\r\n ) : (\r\n <>\r\n <input style={CSS.input} placeholder=\"URL (如 http://localhost:3000/mcp)\" value={mcpUrl} onChange={(e) => setMcpUrl(e.target.value)} />\r\n <textarea style={CSS.textarea} placeholder=\"请求头 (headers, 每行 KEY=VALUE)\" value={mcpHeaders} onChange={(e) => setMcpHeaders(e.target.value)} />\r\n </>\r\n )}\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} disabled={busy} onClick={submitMcpServer}>\r\n {editingMcpName !== undefined ? '保存' : '添加'}\r\n </button>\r\n {editingMcpName !== undefined && (\r\n <button style={CSS.actionBtn} onClick={() => { setEditingMcpName(undefined); setMcpName(''); setMcpCommand(''); setMcpArgs(''); setMcpEnv(''); setMcpUrl(''); setMcpHeaders('') }}>取消</button>\r\n )}\r\n </div>\r\n </div>\r\n <div style={CSS.scrollBox}>\r\n {state.mcpServers.length === 0\r\n ? <div style={CSS.empty}>暂无 MCP 服务器</div>\r\n : state.mcpServers.map((server) => (\r\n <div key={server.serverName} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={CSS.name}>{server.serverName}</div>\r\n <span style={{ ...CSS.badge, ...(server.enabled ? CSS.badgeEnabled : CSS.badgeDisabled) }}>\r\n {server.enabled ? '启用' : '停用'}\r\n </span>\r\n </div>\r\n <div style={CSS.desc}>\r\n {server.transport}{server.transport === 'stdio' ? ` · ${server.command ?? ''}` : ` · ${server.url ?? ''}`}\r\n {' · '}{server.running ? `运行中 (${server.tools?.length ?? 0} 工具)` : '未运行'}\r\n </div>\r\n {server.lastError !== undefined && server.lastError !== '' && (\r\n <div style={{ ...CSS.error, marginTop: '4px' }}>✖ {server.lastError}</div>\r\n )}\r\n {(server.tools?.length ?? 0) > 0 && (\r\n <div style={{ marginTop: '6px', display: 'flex', flexDirection: 'column', gap: '2px' }}>\r\n {server.tools!.map((tool) => (\r\n <div key={tool.name} style={{ fontSize: '11px', color: ACCENT, fontFamily: MONO, wordBreak: 'break-all' as const }}>\r\n {tool.name}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} onClick={() => toggleMcpServer(server.serverName, !server.enabled)}>\r\n {server.enabled ? '停用' : '启用'}\r\n </button>\r\n <button style={CSS.actionBtn} onClick={() => testMcpServer(server.serverName)}>测试</button>\r\n <button style={CSS.actionBtn} onClick={() => startEditMcpServer(server)}>编辑</button>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={() => removeMcpServer(server.serverName)}>删除</button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: global background & effects ──────────────── */}\r\n {activeTab === 'wallpaper' && (\r\n <>\r\n <div style={CSS.form}>\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <span style={{ fontSize: '13px', fontWeight: 600, color: isDesktopSurface ? '#7ee787' : '#79c0ff' }}>\r\n {isDesktopSurface ? '桌面客户端 · 全局壁纸' : '网页 · 全局壁纸'}\r\n </span>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={resetBackground}>重置</button>\r\n </div>\r\n <div onClick={() => { const d = { ...bgDraft, enabled: !bgDraft.enabled }; setBgDraft(d); applyBackground(d); void backgroundClient.save(d) }}\r\n role=\"switch\" aria-checked={bgDraft.enabled}\r\n style={{ display: 'flex', alignItems: 'center', gap: '10px', cursor: 'pointer', padding: '10px 12px', borderRadius: '8px', border: `1px solid ${bgDraft.enabled ? '#238636' : '#30363d'}`, background: bgDraft.enabled ? 'rgba(35,134,54,0.22)' : '#161b22' }}>\r\n <span style={{ fontSize: '13px', fontWeight: 600, color: bgDraft.enabled ? '#7ee787' : '#8b949e' }}>启用壁纸</span>\r\n <span style={{ flex: 1 }} />\r\n <span style={{ width: '40px', height: '22px', borderRadius: '999px', background: bgDraft.enabled ? '#3fb950' : '#30363d', position: 'relative', flex: 'none', transition: 'background .15s ease' }}>\r\n <span style={{ position: 'absolute', top: '2px', left: bgDraft.enabled ? 20 : 2, width: '18px', height: '18px', borderRadius: '50%', background: '#fff', transition: 'left .15s ease' }} />\r\n </span>\r\n </div>\r\n\r\n <label style={CSS.fileBtn}>\r\n 🖼 上传本地壁纸(图片 / 视频,存盘不撑爆配置)\r\n <input type=\"file\" accept=\"image/*,video/*\" style={{ display: 'none' }} onChange={async (e) => {\r\n const f = e.target.files?.[0]\r\n if (f === undefined) return\r\n const up = await uploadMedia(f)\r\n if (up !== null) { const d = { ...bgDraft, uploadId: up.id, kind: up.kind, url: '' }; setBgDraft(d); applyBackground(d); void backgroundClient.save(d) }\r\n e.target.value = ''\r\n }} />\r\n </label>\r\n <input style={CSS.input} placeholder=\"图片 URL(https://…,留空则无壁纸)\" value={bgDraft.url}\r\n onChange={(e) => setBgDraft({ ...bgDraft, url: e.target.value })}\r\n onBlur={() => { if (bgDraft.url.trim() !== '') { applyBackground(bgDraft); void backgroundClient.save(bgDraft) } }}\r\n onKeyDown={(e) => { if (e.key === 'Enter' && bgDraft.url.trim() !== '') { applyBackground(bgDraft); void backgroundClient.save(bgDraft) } }} />\r\n\r\n {(bgDraft.uploadId !== '' || bgDraft.url.trim() !== '') && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', fontSize: '12px', color: '#58a6ff' }}>\r\n <span>已选择:{bgDraft.kind === 'video' ? '🎬 视频' : '🖼 图片'}{bgDraft.uploadId !== '' ? '(本地上传)' : '(链接)'}</span>\r\n <span style={{ flex: 1 }} />\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} onClick={() => { const d = { ...bgDraft, uploadId: '', url: '' }; setBgDraft(d); applyBackground(d); void backgroundClient.save(d) }}>清除</button>\r\n </div>\r\n )}\r\n\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginTop: '2px' }}>\r\n <span style={{ fontSize: '12px', fontWeight: 600, color: '#e6edf3' }}>样式</span>\r\n <div style={{ flex: 1, height: '1px', background: '#30363d' }} />\r\n </div>\r\n {bgSlider('图片透明度', 'opacity', 0, 1, 0.05)}\r\n {bgSlider('遮罩', 'scrim', 0, 1, 0.05)}\r\n {bgSlider('面板透明度', 'panelOpacity', 0, 1, 0.05)}\r\n {bgSlider('玻璃模糊', 'blur', 0, 40, 1)}\r\n {bgSlider('壁纸模糊', 'wallpaperBlur', 0, 40, 1)}\r\n\r\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>铺法</span>\r\n {(['cover', 'contain'] as const).map((f) => (\r\n <button key={f} style={{ ...CSS.actionBtn, ...(bgDraft.fit === f ? CSS.tabActive : {}) }}\r\n onClick={() => updateBgLive({ fit: f })}>{f === 'cover' ? '铺满' : '适应'}</button>\r\n ))}\r\n </div>\r\n\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginTop: '4px' }}>\r\n <span style={{ fontSize: '12px', fontWeight: 600, color: '#e6edf3' }}>输入框下方提示样式</span>\r\n <div style={{ flex: 1, height: '1px', background: '#30363d' }} />\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>启用</span>\r\n <button style={{ ...CSS.actionBtn, ...(bgDraft.hint.enabled ? CSS.badgeEnabled : {}) }} onClick={() => updateBgLive({ hint: { ...bgDraft.hint, enabled: !bgDraft.hint.enabled } })}>\r\n {bgDraft.hint.enabled ? '已启用' : '已停用'}\r\n </button>\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>颜色</span>\r\n <input type=\"color\" value={bgDraft.hint.color} onChange={(e) => updateBgLive({ hint: { ...bgDraft.hint, color: e.target.value } })} style={{ flex: 'none', width: '34px', height: '26px', border: 'none', background: 'transparent', padding: 0 }} />\r\n </div>\r\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>字号</span>\r\n <input type=\"range\" min={10} max={16} step={1} value={bgDraft.hint.size} onChange={(e) => updateBgLive({ hint: { ...bgDraft.hint, size: Number(e.target.value) } })} style={{ flex: 1 }} />\r\n <span style={{ ...CSS.hint, width: '30px', textAlign: 'right' as const }}>{bgDraft.hint.size}px</span>\r\n </div>\r\n <div style={{ display: 'flex', gap: '6px', alignItems: 'center', flexWrap: 'wrap' as const }}>\r\n <span style={{ ...CSS.hint, width: '76px', flex: 'none' }}>渐变色</span>\r\n {GRADIENTS.map((g) => (\r\n <button key={g.id} title={g.name}\r\n style={{ ...CSS.actionBtn, ...(bgDraft.hint.gradient === g.id ? CSS.tabActive : {}), ...(g.css !== '' ? { backgroundImage: g.css, color: 'transparent', backgroundClip: 'text', WebkitBackgroundClip: 'text', fontWeight: 700 } : {}) }}\r\n onClick={() => updateBgLive({ hint: { ...bgDraft.hint, gradient: g.id } })}>{g.name}</button>\r\n ))}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: conversations ───────────────────────────── */}\r\n {activeTab === 'chat' && (\r\n <>\r\n <div style={CSS.form}>\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <span style={{ fontSize: '13px', fontWeight: 600 }}>对话导入 / 导出</span>\r\n <button style={CSS.actionBtn} onClick={() => void reloadChat()} disabled={chatBusy}>刷新</button>\r\n </div>\r\n <div style={{ ...CSS.desc, lineHeight: '1.5' }}>\r\n 可导出选中的对话,也可下拉选择某个项目工作区整体导出;导入后项目工作区名会尽量与导出端保持一致。\r\n </div>\r\n <div style={CSS.actions}>\r\n <button style={CSS.actionBtn} disabled={chatBusy || chatSelected.size === 0} onClick={() => void doExportChat()}>\r\n 导出选中({chatSelected.size})\r\n </button>\r\n <button style={CSS.actionBtn} disabled={chatBusy || chatProject === ''} onClick={() => void doExportProject()} title=\"导出该项目工作区下的全部对话,导入后可保留项目名\">\r\n 导出整个项目\r\n </button>\r\n <select\r\n style={{ ...CSS.input, maxWidth: '220px', textOverflow: 'ellipsis' }}\r\n value={chatProject}\r\n onChange={(e) => setChatProject(e.target.value)}\r\n disabled={chatProjects.length === 0}\r\n title=\"选择要整体导出的项目工作区\"\r\n >\r\n {chatProjects.length === 0 && <option value=\"\">(无项目)</option>}\r\n {chatProjects.map((p) => (\r\n <option key={p.key} value={p.key}>{p.name}({chatRows.filter((r) => r.projectKey === p.key).length} 个对话)</option>\r\n ))}\r\n </select>\r\n <button style={{ ...CSS.actionBtn, ...CSS.dangerBtn }} disabled={chatBusy || chatSelected.size === 0} onClick={() => void doDeleteChat()}>\r\n 删除选中({chatSelected.size})\r\n </button>\r\n <label style={CSS.fileBtn}>\r\n {chatBusy ? '处理中…' : '选择 zip 导入'}\r\n <input type=\"file\" accept=\".zip\" style={{ display: 'none' }} onChange={(e) => void onChatFile(e.target.files?.[0])} />\r\n </label>\r\n <input style={CSS.input} placeholder=\"目标项目 key(留空=保持原项目)\" value={chatTarget} onChange={(e) => setChatTarget(e.target.value)} />\r\n </div>\r\n {chatMsg !== '' && <div style={CSS.hint}>{chatMsg}</div>}\r\n </div>\r\n <div style={CSS.scrollBox}>\r\n {chatRows.length === 0\r\n ? <div style={CSS.empty}>暂无对话</div>\r\n : chatRows.map((row) => {\r\n const id = `${row.projectKey}/${row.sessionId}`\r\n const sel = chatSelected.has(id)\r\n return (\r\n <div key={id} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', minWidth: 0, flex: 1 }}>\r\n <input type=\"checkbox\" checked={sel} onChange={() => toggleChatSel(id)} style={{ flex: 'none' }} />\r\n <div style={{ ...CSS.name, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis', flex: 1, minWidth: 0 }} title={row.title || id}>\r\n {row.title || '未命名对话'}\r\n </div>\r\n </div>\r\n <span style={{ ...CSS.badge, ...CSS.badgeDisabled, flex: 'none', maxWidth: '150px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title={row.cwd || row.projectKey}>\r\n {row.cwd ? row.cwd.split(/[\\\\/]/).filter(Boolean).pop() : row.projectKey}\r\n </span>\r\n </div>\r\n <div style={{ ...CSS.desc, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {row.cwd || row.projectKey} · {new Date(row.mtime).toLocaleString()} · {row.size >= 1024 ? (row.size / 1024).toFixed(1) + ' KB' : row.size + ' B'}\r\n </div>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* ── Tab: usage stats ─────────────────────────────── */}\r\n {activeTab === 'stats' && (\r\n <>\r\n <div style={CSS.form}>\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '8px', flexWrap: 'wrap' as const }}>\r\n <span style={{ fontSize: '13px', fontWeight: 600 }}>\r\n 使用统计\r\n {statsUpdatedAt > 0 && (\r\n <span style={{ ...CSS.hint, marginLeft: '8px', fontWeight: 400 }}>\r\n 自动刷新 · 上次更新 {new Date(statsUpdatedAt).toLocaleTimeString()}\r\n </span>\r\n )}\r\n </span>\r\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center' }}>\r\n {(['all', '30d', '7d', 'today'] as const).map((r) => (\r\n <button key={r} style={{ ...CSS.actionBtn, ...(statsRange === r ? CSS.tabActive : {}) }} onClick={() => changeStatsRange(r)}>\r\n {r === 'all' ? '全部' : r === '30d' ? '30天' : r === '7d' ? '7天' : '今天'}\r\n </button>\r\n ))}\r\n <button style={CSS.actionBtn} onClick={() => void reloadStats()}>刷新</button>\r\n </div>\r\n </div>\r\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: '8px', marginTop: '4px' }}>\r\n <div style={CSS.card}><div style={CSS.hint}>会话</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats?.totals.sessions ?? '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>轮 / 步骤</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${stats.totals.turns} / ${stats.totals.steps}` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>LLM / 工具时长</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${fmtDuration(stats.totals.llmMs)} / ${fmtDuration(stats.totals.toolMs)}` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>输入 Token</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtTokens(stats.totals.inputTokens) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>输出 Token</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtTokens(stats.totals.outputTokens) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>缓存读 / 写</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${fmtTokens(stats.totals.cacheReadTokens)} / ${fmtTokens(stats.totals.cacheWriteTokens)}` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>缓存命中率</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtPct(stats.totals.cacheHitRate) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>总成本</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtUsd(stats.totals.costUsd) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>平均首Token</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? fmtDuration(stats.totals.avgTtftMs) : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>输出吞吐</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${stats.totals.tokPerSec.toFixed(0)} tok/s` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>每会话平均</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats ? `${stats.totals.perSessionSteps.toFixed(1)} 步` : '—'}</div></div>\r\n <div style={CSS.card}><div style={CSS.hint}>活跃天数</div><div style={{ fontSize: '15px', fontWeight: 700, color: '#e6edf3' }}>{stats?.totals.activeDays ?? '—'}</div></div>\r\n </div>\r\n {stats !== null && (stats.byDay.length > 0 || stats.byHour.length > 0) && (\r\n <TrendChart byDay={stats.byHour.length > 0\r\n ? stats.byHour.map((h) => ({\r\n date: `${String(h.hour).padStart(2, '0')}:00`,\r\n steps: h.steps,\r\n outputTokens: h.outputTokens,\r\n inputTokens: h.inputTokens,\r\n cacheReadTokens: h.cacheReadTokens,\r\n cacheWriteTokens: h.cacheWriteTokens,\r\n }))\r\n : stats.byDay} />\r\n )}\r\n </div>\r\n <div style={CSS.scrollBox}>\r\n {(stats?.byProject ?? []).length === 0 && (stats?.recent ?? []).length === 0\r\n ? <div style={CSS.empty}>暂无使用记录</div>\r\n : <></>}\r\n {(stats?.recent ?? []).length > 0 && (\r\n <div>\r\n <div style={{ ...CSS.hint, marginBottom: '4px' }}>请求日志(最近 {stats!.recent.length})</div>\r\n {stats!.recent.map((r) => (\r\n <div key={r.time + '-' + r.provider} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={{ ...CSS.name, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis', flex: 1, minWidth: 0 }}>{r.provider}</div>\r\n <span style={{ ...CSS.badge, ...(r.status === 'done' ? CSS.badgeEnabled : CSS.badgeInstalled) }}>{r.status === 'done' ? '完成' : '进行中'}</span>\r\n </div>\r\n <div style={CSS.desc}>\r\n {new Date(r.time).toLocaleString()} · {fmtTokens(r.inputTokens)} in / {fmtTokens(r.outputTokens)} out · R{fmtTokens(r.cacheReadTokens)}·W{fmtTokens(r.cacheWriteTokens)} · 命中 {fmtPct(r.cacheHitRate)} · {fmtUsd(r.costUsd)} · {fmtDuration(r.latencyMs)} / 首字 {fmtDuration(r.firstTokenMs)}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {(stats?.byProject ?? []).length > 0 && (\r\n <div>\r\n <div style={{ ...CSS.hint, marginBottom: '4px' }}>Provider / 项目统计</div>\r\n {stats!.byProject.slice(0, 20).map((p) => (\r\n <div key={p.project} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={{ ...CSS.name, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis', flex: 1, minWidth: 0 }}>{p.project}</div>\r\n <span style={{ ...CSS.badge, ...CSS.badgeDisabled }}>{p.sessions} 会话</span>\r\n </div>\r\n <div style={CSS.desc}>\r\n {p.steps} 步 · {fmtTokens(p.inputTokens)} in / {fmtTokens(p.outputTokens)} out · R{fmtTokens(p.cacheReadTokens)} · 命中 {fmtPct(p.cacheHitRate)} · {fmtUsd(p.costUsd)} · 延迟 {p.avgLatencyMs.toFixed(0)}ms · 成功 {p.successRate.toFixed(0)}%\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {(stats?.byModel ?? []).length > 0 && (\r\n <div>\r\n <div style={{ ...CSS.hint, marginBottom: '4px' }}>模型统计</div>\r\n {stats!.byModel.slice(0, 20).map((m) => (\r\n <div key={m.model} style={CSS.card}>\r\n <div style={CSS.cardTop}>\r\n <div style={{ ...CSS.name, whiteSpace: 'nowrap' as const, overflow: 'hidden', textOverflow: 'ellipsis', flex: 1, minWidth: 0 }}>{m.model}</div>\r\n <span style={{ ...CSS.badge, ...CSS.badgeDisabled }}>{m.sessions} 会话</span>\r\n </div>\r\n <div style={CSS.desc}>{m.steps} 步 · {fmtTokens(m.inputTokens)} in / {fmtTokens(m.outputTokens)} out · 命中 {fmtPct(m.cacheHitRate)} · {fmtUsd(m.costUsd)}</div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","/**\r\n * Switchblade section data controller: reads the skill catalog and the prompt\r\n * roster through the existing connection RPC surface (no Typert\r\n * generation needed — these methods are already wired).\r\n * @module @deepseek-ai/dsh-client-ui-switchblade\r\n */\r\n\r\nimport type { ConnectionHandle, SessionId } from '@deepseek-ai/dsh-api-remotes/client'\r\nimport { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'\r\n\r\n/** A skill row as reported by skill.list. */\r\nexport interface SkillRow {\r\n readonly name: string\r\n readonly description: string\r\n readonly modelInvocable: boolean\r\n}\r\n\r\n/** A command row (not yet wired to an RPC; kept for the section's third group). */\r\nexport interface CommandRow {\r\n readonly name: string\r\n readonly description: string\r\n}\r\n\r\n/** One user-authored prompt (mirrors the Host ManagedPrompt). */\r\nexport interface PromptRow {\r\n readonly id: string\r\n readonly name: string\r\n readonly description: string\r\n readonly content: string\r\n readonly order: number\r\n readonly enabled: boolean\r\n readonly isDefault: boolean\r\n /** Fine-grained application scope (global by default). */\r\n readonly scope?: { readonly type: 'global' } | { readonly type: 'project'; readonly key: string } | { readonly type: 'session'; readonly id: string }\r\n}\r\n\r\n/** An installed skill row. */\r\nexport interface InstalledSkillRow {\r\n readonly name: string\r\n readonly description: string\r\n readonly content: string\r\n /** Whether this skill is currently registered (enabled) as a runtime skill. */\r\n readonly enabled: boolean\r\n}\r\n\r\n/** One configured MCP server (mirrors the Host McpServerConfig). */\r\nexport interface McpServerRow {\r\n readonly serverName: string\r\n readonly transport: 'stdio' | 'streamable-http'\r\n readonly command?: string\r\n readonly args?: readonly string[]\r\n readonly env?: Readonly<Record<string, string>>\r\n readonly url?: string\r\n readonly headers?: Readonly<Record<string, string>>\r\n readonly enabled: boolean\r\n /** Runtime: whether a live mcp-client instance is loaded. */\r\n readonly running?: boolean\r\n /** Runtime: tools currently registered from this server. */\r\n readonly tools?: readonly { name: string; description: string }[]\r\n /** Runtime: last startup/connection error, if any. */\r\n readonly lastError?: string\r\n}\r\n\r\n/** The section's loaded view state. */\r\nexport interface SwitchbladeSectionState {\r\n readonly status: 'idle' | 'loading' | 'ready' | 'error'\r\n readonly message?: string\r\n readonly skills: readonly SkillRow[]\r\n readonly commands: readonly CommandRow[]\r\n readonly prompts: readonly PromptRow[]\r\n readonly installedSkills: readonly InstalledSkillRow[]\r\n readonly mcpServers: readonly McpServerRow[]\r\n}\r\n\r\n/** Initial (idle) state. */\r\nconst IDLE: SwitchbladeSectionState = {\r\n status: 'idle',\r\n skills: [],\r\n commands: [],\r\n prompts: [],\r\n installedSkills: [],\r\n mcpServers: [],\r\n}\r\n\r\n/** Normalize a thrown wire error to a message. */\r\nfunction messageOf(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error)\r\n}\r\n\r\nexport class SwitchbladeSectionController {\r\n /** Snapshot store backing the section's view state. */\r\n readonly store: SnapshotStore<SwitchbladeSectionState> = createSnapshotStore(IDLE)\r\n\r\n constructor(\r\n private readonly api: ConnectionHandle['api'],\r\n private readonly sessionId?: () => SessionId | undefined,\r\n ) {}\r\n\r\n /**\r\n * Load skills, prompts, and installed skills. Prompts and installed\r\n * skills come from the `switchblade` settings namespace (the Host watches\r\n * it and re-injects on change).\r\n */\r\n async load(): Promise<void> {\r\n this.store.set({ ...IDLE, status: 'loading' })\r\n try {\r\n // skill.list requires a live session; without one we skip it (never\r\n // hang). Settings always resolve, so the panel opens reliably.\r\n const sessionId = this.sessionId?.()\r\n const calls: Promise<unknown>[] = [\r\n this.api.settings.describe({}),\r\n ]\r\n if (sessionId !== undefined) calls.push(this.api.skills.list({ sessionId }))\r\n const [settingsRes, skillRes] = await Promise.all(calls) as [\r\n Awaited<ReturnType<ConnectionHandle['api']['settings']['describe']>>,\r\n Awaited<ReturnType<ConnectionHandle['api']['skills']['list']>> | undefined,\r\n ]\r\n if (!settingsRes.result.ok) throw new Error(`settings.describe: ${settingsRes.result.error.message}`)\r\n\r\n const skills: SkillRow[] = skillRes !== undefined && skillRes.result.ok\r\n ? skillRes.result.value.skills.map((skill) => ({\r\n name: skill.name,\r\n description: skill.description,\r\n modelInvocable: skill.modelInvocable,\r\n }))\r\n : []\r\n\r\n const switchbladeSection = this.sectionFromSettings(settingsRes.result.value, 'switchblade')\r\n const prompts: PromptRow[] = Array.isArray(switchbladeSection?.prompts) ? switchbladeSection.prompts : []\r\n const installedSkills: InstalledSkillRow[] = Array.isArray(switchbladeSection?.installedSkills)\r\n ? switchbladeSection.installedSkills.map((s: { name?: string; description?: string; content?: string; enabled?: boolean }) => ({\r\n name: s.name ?? '',\r\n description: s.description ?? '',\r\n content: s.content ?? '',\r\n enabled: s.enabled ?? true,\r\n }))\r\n : []\r\n const mcpServers: McpServerRow[] = Array.isArray(switchbladeSection?.mcpServers)\r\n ? switchbladeSection.mcpServers.map((s: McpServerRow) => {\r\n const status = (switchbladeSection?.mcpStatus as Record<string, { running?: boolean; tools?: readonly { name: string; description: string }[]; lastError?: string }> | undefined)?.[s.serverName]\r\n return {\r\n serverName: s.serverName,\r\n transport: s.transport,\r\n ...s.command === undefined ? {} : { command: s.command },\r\n ...s.args === undefined ? {} : { args: s.args },\r\n ...s.env === undefined ? {} : { env: s.env },\r\n ...s.url === undefined ? {} : { url: s.url },\r\n ...s.headers === undefined ? {} : { headers: s.headers },\r\n enabled: s.enabled ?? true,\r\n ...status === undefined ? {} : {\r\n running: status.running ?? false,\r\n tools: status.tools ?? [],\r\n ...status.lastError === undefined ? {} : { lastError: status.lastError },\r\n },\r\n }\r\n })\r\n : []\r\n\r\n this.store.set({\r\n status: 'ready',\r\n skills,\r\n commands: [],\r\n prompts,\r\n installedSkills,\r\n mcpServers,\r\n })\r\n } catch (error) {\r\n this.store.set({ ...IDLE, status: 'error', message: messageOf(error) })\r\n }\r\n }\r\n\r\n /** Read one namespace's user section from a settings.describe value. */\r\n private sectionFromSettings(value: unknown, ns: string): Record<string, unknown> | undefined {\r\n if (typeof value !== 'object' || value === null) return undefined\r\n const entries = (value as { namespaces?: unknown }).namespaces\r\n if (!Array.isArray(entries)) return undefined\r\n for (const entry of entries) {\r\n const row = entry as { ns?: unknown; value?: unknown }\r\n if (row.ns === ns) {\r\n const section = row.value\r\n return typeof section === 'object' && section !== null ? section as Record<string, unknown> : undefined\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Prompt CRUD (writes to the switchblade settings namespace; Host re-injects)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Add a prompt. */\r\n async addPrompt(input: { name: string; description: string; content: string; scope?: PromptRow['scope'] }): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['prompts'], value: [...this.currentPrompts(), {\r\n id: this.slugify(input.name),\r\n name: input.name,\r\n description: input.description,\r\n content: input.content,\r\n order: this.currentPrompts().length,\r\n enabled: true,\r\n isDefault: this.currentPrompts().length === 0,\r\n ...(input.scope === undefined || input.scope.type === 'global' ? {} : { scope: input.scope }),\r\n }] }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Toggle one prompt's enabled state. */\r\n async setPromptEnabled(id: string, enabled: boolean): Promise<void> {\r\n const next = this.currentPrompts().map((p) => p.id === id ? { ...p, enabled } : p)\r\n await this.writePrompts(next)\r\n }\r\n\r\n /** Mark one prompt default; clears others. */\r\n async setDefaultPrompt(id: string): Promise<void> {\r\n const next = this.currentPrompts().map((p) => ({ ...p, isDefault: p.id === id }))\r\n await this.writePrompts(next)\r\n }\r\n\r\n /** Delete one prompt. */\r\n async deletePrompt(id: string): Promise<void> {\r\n const next = this.currentPrompts().filter((p) => p.id !== id)\r\n await this.writePrompts(next)\r\n }\r\n\r\n /** Update a prompt's name/description/content/scope. */\r\n async updatePrompt(id: string, patch: { name?: string; description?: string; content?: string; scope?: PromptRow['scope'] }): Promise<void> {\r\n const next = this.currentPrompts().map((p) => p.id === id ? {\r\n ...p,\r\n name: patch.name?.trim() || p.name,\r\n description: patch.description ?? p.description,\r\n content: patch.content ?? p.content,\r\n ...(patch.scope === undefined ? {} : (patch.scope.type === 'global' ? { scope: undefined } : { scope: patch.scope })),\r\n } : p)\r\n await this.writePrompts(next)\r\n }\r\n\r\n /** Persist the prompt list through the settings RPC. */\r\n private async writePrompts(prompts: readonly PromptRow[]): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['prompts'], value: prompts }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Current prompt list from the loaded snapshot. */\r\n private currentPrompts(): readonly PromptRow[] {\r\n return this.store.getSnapshot().prompts\r\n }\r\n\r\n /** Sluggify a name into an id. */\r\n private slugify(value: string): string {\r\n const slug = value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')\r\n return slug.length > 0 ? slug : `prompt-${Date.now()}`\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Skill install/uninstall (writes to the switchblade settings namespace)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Install a skill from a name + content (enabled by default). */\r\n async installSkill(input: { name: string; description: string; content: string }): Promise<void> {\r\n const next = [...this.currentInstalledSkills(), {\r\n name: input.name,\r\n description: input.description,\r\n content: input.content,\r\n enabled: true,\r\n }]\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['installedSkills'], value: next }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Toggle one installed skill's enabled state. */\r\n async setSkillEnabled(name: string, enabled: boolean): Promise<void> {\r\n const next = this.currentInstalledSkills().map((s) => s.name === name ? { ...s, enabled } : s)\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['installedSkills'], value: next }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Uninstall one installed skill. */\r\n async uninstallSkill(name: string): Promise<void> {\r\n const next = this.currentInstalledSkills().filter((s) => s.name !== name)\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['installedSkills'], value: next }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Update an installed skill's name/description/content. */\r\n async updateSkill(name: string, patch: { name?: string; description?: string; content?: string }): Promise<void> {\r\n const next = this.currentInstalledSkills().map((s) => s.name === name ? {\r\n ...s,\r\n name: patch.name?.trim() || s.name,\r\n description: patch.description ?? s.description,\r\n content: patch.content ?? s.content,\r\n } : s)\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['installedSkills'], value: next }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Current installed skills from the loaded snapshot. */\r\n private currentInstalledSkills(): readonly InstalledSkillRow[] {\r\n return this.store.getSnapshot().installedSkills\r\n }\r\n\r\n /**\r\n * Queue a zip archive (base64) for extraction into ~/.dsh/skills. The Host\r\n * watch sees pendingZip and installs it (skil-filesystem then discovers it).\r\n */\r\n async installSkillFromZip(name: string, dataBase64: string): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['pendingZip'], value: { name, dataBase64 } }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n // Wait a tick for the Host watch to extract, then refresh.\r\n await new Promise((r) => setTimeout(r, 500))\r\n await this.load()\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // MCP server management (writes to the switchblade settings namespace; the\r\n // Host watch auto-starts/stops the mcp-client instances)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Add a new MCP server config. */\r\n async addMcpServer(config: McpServerRow): Promise<void> {\r\n const next = [...this.currentMcpServers(), config]\r\n await this.writeMcpServers(next)\r\n }\r\n\r\n /** Update an MCP server config. */\r\n async updateMcpServer(name: string, patch: Partial<McpServerRow>): Promise<void> {\r\n const next = this.currentMcpServers().map((s) => s.serverName === name ? { ...s, ...patch, serverName: name } : s)\r\n await this.writeMcpServers(next)\r\n }\r\n\r\n /** Toggle one MCP server's enabled state (Host auto-starts/stops). */\r\n async toggleMcpServer(name: string, enabled: boolean): Promise<void> {\r\n const next = this.currentMcpServers().map((s) => s.serverName === name ? { ...s, enabled } : s)\r\n await this.writeMcpServers(next)\r\n }\r\n\r\n /** Remove an MCP server config. */\r\n async removeMcpServer(name: string): Promise<void> {\r\n const next = this.currentMcpServers().filter((s) => s.serverName !== name)\r\n await this.writeMcpServers(next)\r\n }\r\n\r\n /**\r\n * Ask the Host to (re)start one server and republish its live status. The\r\n * Host processes the one-shot request and updates mcpStatus; we refresh\r\n * after a short delay so the panel shows the fresh tool list / error.\r\n */\r\n async testMcpServer(name: string): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['mcpTestRequest'], value: { serverName: name, ts: Date.now() } }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await new Promise((r) => setTimeout(r, 2000))\r\n await this.load()\r\n }\r\n\r\n /** Persist the MCP server config list. */\r\n private async writeMcpServers(servers: readonly McpServerRow[]): Promise<void> {\r\n const res = await this.api.settings.mutate({\r\n ns: 'switchblade',\r\n ops: [{ op: 'set', path: ['mcpServers'], value: servers }],\r\n })\r\n if (!res.result.ok) throw new Error(res.result.error.message)\r\n await this.load()\r\n }\r\n\r\n /** Current MCP server list from the loaded snapshot. */\r\n private currentMcpServers(): readonly McpServerRow[] {\r\n return this.store.getSnapshot().mcpServers\r\n }\r\n}\r\n\r\n/** The section's injected face: hooks (snapshot store) + actions. */\r\nexport interface SwitchbladeSectionInjected {\r\n hooks: {\r\n /** Page snapshot bound by the renderer as useSwitchblade. */\r\n switchblade: SnapshotStore<SwitchbladeSectionState>\r\n }\r\n load: () => Promise<void>\r\n addPrompt: (input: { name: string; description: string; content: string }) => Promise<void>\r\n updatePrompt: (id: string, patch: { name?: string; description?: string; content?: string }) => Promise<void>\r\n setPromptEnabled: (id: string, enabled: boolean) => Promise<void>\r\n setDefaultPrompt: (id: string) => Promise<void>\r\n deletePrompt: (id: string) => Promise<void>\r\n installSkill: (input: { name: string; description: string; content: string }) => Promise<void>\r\n updateSkill: (name: string, patch: { name?: string; description?: string; content?: string }) => Promise<void>\r\n setSkillEnabled: (name: string, enabled: boolean) => Promise<void>\r\n uninstallSkill: (name: string) => Promise<void>\r\n installSkillFromZip: (name: string, dataBase64: string) => Promise<void>\r\n addMcpServer: (config: McpServerRow) => Promise<void>\r\n updateMcpServer: (name: string, patch: Partial<McpServerRow>) => Promise<void>\r\n toggleMcpServer: (name: string, enabled: boolean) => Promise<void>\r\n removeMcpServer: (name: string) => Promise<void>\r\n testMcpServer: (name: string) => Promise<void>\r\n /** Ask the DSH session runtime to re-pull the conversation list (keeps the official UI in sync after delete/import). */\r\n refreshSessions: () => void\r\n}\r\n","/**\r\n * Switchblade management page, browser half: registers the `settings.section`\r\n * navigation entry and renders the edgelord panel from the connection RPC\r\n * state. Global scope (root) — one management seat for every session.\r\n * @module @deepseek-ai/dsh-client-ui-switchblade\r\n */\r\n\r\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\r\nimport type { ClientContext, ISessions } from '@deepseek-ai/dsh-client-runtime/client'\r\n// Type-only: pulls the locale plugin's Context merge (ctx.locale).\r\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\r\n// Type-only: pulls the settings shell's SlotMap merge (the 'settings.section' entry).\r\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\r\n// Type-only: pulls the LocaleNamespaceMap merge slot (the 'settings.switchblade' entry).\r\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\r\nimport { en, NS, zh, type SwitchbladeKey } from './locales.ts'\r\nimport { SwitchbladeSection } from './SwitchbladeSection.tsx'\r\nimport type { SwitchbladeSectionInjected } from './SwitchbladeSection.tsx'\r\nimport { SwitchbladeSectionController } from './store.ts'\r\nimport { backgroundClient, initBackgroundClient, applyBackground, applyHintStyle } from './background.ts'\r\n\r\nexport { SwitchbladeSection } from './SwitchbladeSection.tsx'\r\nexport type { SwitchbladeSectionInjected, SwitchbladeSectionProps } from './SwitchbladeSection.tsx'\r\nexport { SwitchbladeSectionController } from './store.ts'\r\nexport type { SwitchbladeSectionState, SkillRow } from './store.ts'\r\n\r\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\r\n interface LocaleNamespaceMap {\r\n /** Switchblade management page copy. */\r\n 'settings.switchblade': SwitchbladeKey\r\n }\r\n}\r\n\r\n/** Required services (cordis fiber inject). */\r\nexport const inject = ['slots', 'locale', 'connection', 'sessions']\r\n\r\n/**\r\n * Mount the Switchblade settings section.\r\n * @param ctx - the browser plugin context.\r\n */\r\nexport function apply(ctx: ClientContext): void {\r\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'ui-switchblade: dictionaries')\r\n\r\n const api = (ctx.get('connection') as ConnectionHandle).api\r\n const sessions = ctx.get('sessions') as ISessions\r\n\r\n // Global background/effects survives restart: the Host persists the section\r\n // in its settings document and serves it over a same-origin route; we fetch\r\n // it at startup and repaint on every load or change. paint() gates on\r\n // status==='ready' so a not-yet-loaded snapshot never clears the backdrop.\r\n applyHintStyle()\r\n try {\r\n initBackgroundClient(api)\r\n const paintBackground = (): void => { const s = backgroundClient.getSnapshot(); if (s.status === 'ready') applyBackground(s.value) }\r\n backgroundClient.subscribe(paintBackground)\r\n const applyPersisted = (): void => { void backgroundClient.load().then((ok) => { if (!ok) setTimeout(applyPersisted, 1200) }) }\r\n applyPersisted()\r\n } catch (error) {\r\n // Never let the background integration take the renderer/plugin tree down.\r\n console.warn('[switchblade] background init skipped:', error)\r\n }\r\n\r\n const controller = new SwitchbladeSectionController(api, () => {\r\n const state = sessions.list.getSnapshot()\r\n return state.current === undefined ? undefined : state.current\r\n })\r\n\r\n ctx.slots.inject('settings.section', () => ctx.slots.register({\r\n name: 'settings.section',\r\n id: 'switchblade',\r\n order: 30,\r\n label: () => ctx.locale.bind(NS)('nav'),\r\n locale: NS,\r\n inject: (): SwitchbladeSectionInjected => ({\r\n hooks: { switchblade: controller.store },\r\n load: () => controller.load(),\r\n addPrompt: (input) => controller.addPrompt(input),\r\n updatePrompt: (id, patch) => controller.updatePrompt(id, patch),\r\n setPromptEnabled: (id, enabled) => controller.setPromptEnabled(id, enabled),\r\n setDefaultPrompt: (id) => controller.setDefaultPrompt(id),\r\n deletePrompt: (id) => controller.deletePrompt(id),\r\n installSkill: (input) => controller.installSkill(input),\r\n updateSkill: (name, patch) => controller.updateSkill(name, patch),\r\n setSkillEnabled: (name, enabled) => controller.setSkillEnabled(name, enabled),\r\n uninstallSkill: (name) => controller.uninstallSkill(name),\r\n installSkillFromZip: (name, dataBase64) => controller.installSkillFromZip(name, dataBase64),\r\n addMcpServer: (config) => controller.addMcpServer(config),\r\n updateMcpServer: (name, patch) => controller.updateMcpServer(name, patch),\r\n toggleMcpServer: (name, enabled) => controller.toggleMcpServer(name, enabled),\r\n removeMcpServer: (name) => controller.removeMcpServer(name),\r\n testMcpServer: (name) => controller.testMcpServer(name),\r\n refreshSessions: () => { (sessions as { refresh?: () => Promise<void> }).refresh?.().catch(() => {}) },\r\n }),\r\n }, SwitchbladeSection))\r\n}\r\n\r\n/** Cordis plugin identity. */\r\nexport const name = 'ui-switchblade'\r\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-switchblade",
3
3
  "description": "Switchblade management page for skills, prompt profiles, and commands in the DeepSeek Harness web UI",
4
- "version": "0.9.8",
4
+ "version": "0.9.9",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -331,7 +331,7 @@ function BookIcon({ size = 16 }: { size?: number }): JSX.Element {
331
331
  type TabKey = 'prompts' | 'skills' | 'mcp' | 'wallpaper' | 'chat' | 'stats'
332
332
 
333
333
  /** Bump with every release; keep in sync with package.json version + CHANGELOG. */
334
- const ARMORY_VERSION = '0.9.8'
334
+ const ARMORY_VERSION = '0.9.9'
335
335
 
336
336
  /** Compact duration: 45.2s / 2m42s / 1h05m. */
337
337
  function fmtDuration(ms: number): string {
@@ -1555,7 +1555,8 @@ var Switchblade = class extends Service {
1555
1555
  static inject = [
1556
1556
  "loader",
1557
1557
  "skills",
1558
- "systemPrompt"
1558
+ "systemPrompt",
1559
+ "commands"
1559
1560
  ];
1560
1561
  /** Registry configuration. */
1561
1562
  static Config = z.object({ defaultProfile: z.string() });
@@ -2546,7 +2547,11 @@ function apply(ctx) {
2546
2547
  ctx.logger.warn("[switchblade] apply() invoked — mounting Switchblade service");
2547
2548
  ctx.plugin(Switchblade).then((fiber) => {
2548
2549
  ctx.logger.warn("[switchblade] Switchblade service mounted");
2549
- const service = fiber.ctx.switchblade;
2550
+ const service = fiber.ctx.get("switchblade");
2551
+ if (service === void 0) {
2552
+ ctx.logger.warn("[switchblade] Switchblade service unavailable — commands not registered");
2553
+ return;
2554
+ }
2550
2555
  defineCommands(ctx, service);
2551
2556
  }, (error) => {
2552
2557
  ctx.logger.warn(`[switchblade] command registration failed: ${error instanceof Error ? error.message : String(error)}`);
@@ -1356,7 +1356,8 @@ var Switchblade = class extends Service {
1356
1356
  static inject = [
1357
1357
  "loader",
1358
1358
  "skills",
1359
- "systemPrompt"
1359
+ "systemPrompt",
1360
+ "commands"
1360
1361
  ];
1361
1362
  /** Registry configuration. */
1362
1363
  static Config = z.object({ defaultProfile: z.string() });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-switchblade",
3
3
  "description": "CCswitch-style manager for skills, prompt profiles, and slash commands in the DeepSeek Harness",
4
- "version": "0.9.8",
4
+ "version": "0.9.9",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -44,7 +44,13 @@ export function apply(ctx: Context): void {
44
44
  // which (via `inject`) can resolve ctx.commands.
45
45
  void ctx.plugin(Switchblade).then((fiber) => {
46
46
  ctx.logger.warn('[switchblade] Switchblade service mounted')
47
- const service = (fiber.ctx as Context & { switchblade: Switchblade }).switchblade
47
+ // DSH 2.0.9's cordis forbids property access to un-injected services
48
+ // (`cannot get property "switchblade" without inject`); resolve lazily.
49
+ const service = fiber.ctx.get('switchblade') as Switchblade | undefined
50
+ if (service === undefined) {
51
+ ctx.logger.warn('[switchblade] Switchblade service unavailable — commands not registered')
52
+ return
53
+ }
48
54
  defineCommands(ctx, service)
49
55
  }, (error: unknown) => {
50
56
  ctx.logger.warn(`[switchblade] command registration failed: ${error instanceof Error ? error.message : String(error)}`)
@@ -228,7 +228,7 @@ declare module '@deepseek-ai/cordis' {
228
228
  */
229
229
  export class Switchblade extends Service {
230
230
  /** Services the plugin reads from ctx; inject-declared so Cordis resolves them. */
231
- static inject = ['loader', 'skills', 'systemPrompt']
231
+ static inject = ['loader', 'skills', 'systemPrompt', 'commands']
232
232
 
233
233
  /** Registry configuration. */
234
234
  static Config: z<Config> = z.object({