dsh-prompt-customizer 0.2.7 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["useState","h","h","useState","useRef","h","h","useState","useRef","h","h","useState"],"sources":["../src/client/locales.ts","../src/client/styles.ts","../src/client/presets.ts","../src/client/SectionsTab.tsx","../src/client/ToolsTab.tsx","../src/client/PresetsTab.tsx","../src/client/PreviewTools.tsx","../src/client/PreviewTab.tsx","../src/client/index.ts"],"sourcesContent":["/** Locale dictionaries for the prompt-customizer panel. */\nexport const DICT = {\n zh: {\n nav: '提示词定制',\n loading: '加载中…',\n unavailable: '当前环境未启用本命名空间。',\n tabsSections: '提示词',\n tabsTools: '工具',\n tabsPresets: '预设',\n tabsPreview: '预览',\n refresh: '刷新',\n blockedOff: '未屏蔽',\n blockedOn: '已屏蔽',\n replaced: '已替换',\n manual: '手动',\n system: '系统',\n replace: '编辑',\n clearReplace: '清除',\n injectNew: '注入新段',\n name: '名称',\n order: '顺序',\n text: '文本',\n add: '添加',\n hiddenOff: '可见',\n hiddenOn: '已隐藏',\n selectAll: '全选',\n selectNone: '全不选',\n empty: '(空)',\n dynamic: '<动态生成>',\n drag: '拖动排序',\n moveUp: '上移',\n moveDown: '下移',\n previewHint: '以下为屏蔽/替换/注入后的最终系统提示词:',\n previewPrompt: '提示词预览',\n previewSections: '段',\n previewTools: '工具预览',\n previewToolCount: '个工具',\n savePreset: '保存当前为预设',\n presetName: '预设名称',\n save: '保存',\n importPreset: '导入预设',\n import: '导入',\n apply: '应用',\n export: '导出',\n delete: '删除',\n active: '使用中',\n preset: '预设',\n },\n en: {\n nav: 'Prompt Customizer',\n loading: 'Loading…',\n unavailable: 'Namespace unavailable in this environment.',\n tabsSections: 'Sections',\n tabsTools: 'Tools',\n tabsPresets: 'Presets',\n tabsPreview: 'Preview',\n refresh: 'Refresh',\n blockedOff: 'Active',\n blockedOn: 'Blocked',\n replaced: 'Replaced',\n manual: 'Manual',\n system: 'System',\n replace: 'Replace',\n clearReplace: 'Clear',\n injectNew: 'Inject section',\n name: 'Name',\n order: 'Order',\n text: 'Text',\n add: 'Add',\n hiddenOff: 'Visible',\n hiddenOn: 'Hidden',\n selectAll: 'Select all',\n selectNone: 'Select none',\n empty: '(empty)',\n dynamic: '<dynamic>',\n drag: 'Drag to reorder',\n moveUp: 'Move up',\n moveDown: 'Move down',\n previewHint: 'Final system prompt after block/replace/inject:',\n previewPrompt: 'Prompt preview',\n previewSections: 'sections',\n previewTools: 'Tools preview',\n previewToolCount: 'tools',\n savePreset: 'Save current as preset',\n presetName: 'Preset name',\n save: 'Save',\n importPreset: 'Import preset',\n import: 'Import',\n apply: 'Apply',\n export: 'Export',\n delete: 'Delete',\n active: 'Active',\n preset: 'Preset',\n },\n} as const\n\nexport type Translate = (key: string) => string\n","/** Inline styles shared by the prompt-customizer panel components. */\nexport const s = (() => {\n const flex = { display: 'flex', alignItems: 'center' }\n return {\n root: { fontFamily: 'inherit', fontSize: 13, lineHeight: 1.5 },\n bar: { ...flex, gap: 6, marginBottom: 8, flexWrap: 'wrap' },\n tab: { padding: '4px 10px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.75 },\n tabActive: { padding: '4px 10px', border: '1px solid rgba(128,128,128,.7)', borderRadius: 6, background: 'rgba(128,128,128,.18)', cursor: 'pointer', color: 'inherit' },\n refresh: { marginLeft: 'auto', padding: '4px 10px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },\n list: { display: 'flex', flexDirection: 'column', gap: 6 },\n row: { ...flex, gap: 8, padding: '6px 8px', border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(128,128,128,.06)' },\n switchWrap: { ...flex, gap: 6, minWidth: 90 },\n rowBody: { flex: 1, minWidth: 0 },\n rowTitle: { ...flex, gap: 6, alignItems: 'baseline', flexWrap: 'wrap' },\n code: { fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' },\n orderTag: { color: 'rgba(128,128,128,.8)', fontSize: 11 },\n preview: { color: 'rgba(128,128,128,.85)', fontSize: 12, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },\n previewText: { fontFamily: 'monospace', fontSize: 12, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', maxHeight: 480, overflowY: 'auto', padding: 10, border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(0,0,0,.18)', margin: 0 },\n toolWrap: { display: 'flex', flexWrap: 'wrap', gap: 6 },\n toolChip: { fontFamily: 'monospace', fontSize: 12, color: 'rgba(128,128,128,.95)', border: '1px solid rgba(128,128,128,.3)', borderRadius: 6, padding: '2px 6px', cursor: 'help' },\n badgeOk: { color: '#3fb950', fontSize: 11, border: '1px solid rgba(63,185,80,.5)', borderRadius: 999, padding: '0 6px' },\n badgeBlocked: { color: '#f85149', fontSize: 11, border: '1px solid rgba(248,81,73,.5)', borderRadius: 999, padding: '0 6px' },\n badgeReplaced: { color: '#d29922', fontSize: 11, border: '1px solid rgba(210,153,34,.5)', borderRadius: 999, padding: '0 6px' },\n badgeCustom: { color: '#58a6ff', fontSize: 11, border: '1px solid rgba(88,166,255,.5)', borderRadius: 999, padding: '0 6px' },\n badgeSystem: { color: 'rgba(128,128,128,.85)', fontSize: 11, border: '1px solid rgba(128,128,128,.4)', borderRadius: 999, padding: '0 6px' },\n mini: { padding: '3px 8px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', whiteSpace: 'nowrap' },\n arrowCol: { display: 'flex', flexDirection: 'column', gap: 2 },\n arrow: { padding: '0 6px', border: '1px solid rgba(128,128,128,.3)', borderRadius: 4, background: 'transparent', cursor: 'pointer', color: 'inherit', fontSize: 11, lineHeight: 1.4, opacity: 0.8 },\n rowDragging: { opacity: 0.4 },\n rowDropAbove: { boxShadow: '0 -2px 0 0 #58a6ff' },\n rowDropBelow: { boxShadow: '0 2px 0 0 #58a6ff' },\n dragHandle: { cursor: 'grab', color: 'rgba(128,128,128,.7)', fontSize: 13, padding: '0 2px', userSelect: 'none' },\n injectBox: { marginTop: 10, padding: '8px', border: '1px dashed rgba(128,128,128,.4)', borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6 },\n injectRow: { ...flex, gap: 6 },\n editBox: { display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4 },\n editInput: { padding: '6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit', fontFamily: 'inherit', fontSize: 12, resize: 'vertical', width: '100%', boxSizing: 'border-box' },\n input: { padding: '4px 6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit' },\n muted: { color: 'rgba(128,128,128,.75)', fontSize: 12 },\n error: { color: '#f85149', fontSize: 12, marginBottom: 6 },\n }\n})()\n","/** Pure preset / section helpers shared by the client UI and the node tests. */\nimport type { Config, Inventory, Preset, PresetData } from './types.ts'\n\nexport interface Section {\n name: string\n order: number\n text?: string\n active: boolean\n replaced: boolean\n /** `system` = read from the host prompt inventory (not deletable); `custom` = added by this plugin (deletable). */\n source?: 'system' | 'custom'\n}\n\n/** The config fields a preset apply must write back to the settings scope. */\nexport interface ConfigPatch {\n sections: string[]\n replace: Record<string, string>\n inject: Array<{ name: string; order: number; text: string }>\n tools: { exclude: string[]; include: string[] }\n}\n\n/**\n * Merge the inventory sections with the user's inject list, sorted by order.\n * Sections read from the inventory (other plugins) are `system`; sections this\n * plugin generated carry a hidden `custom` marker and are `custom`. The source\n * is decided by the hidden marker — never by name collisions — so a custom\n * section keeps its identity (and its deletability) even when its name happens\n * to match an inventory section, and across preset switches. Custom sections\n * always render their own text; they can never be \"<动态生成>\".\n */\nexport function mergeSections(inv: Inventory | null, cfg: Config, blockedNames: ReadonlySet<string>): Section[] {\n const map = new Map<string, Section>()\n for (const sec of inv?.sections ?? []) map.set(sec.name, { ...sec, source: 'system' })\n for (const item of cfg.inject ?? []) {\n const isCustom = item.custom === true\n const existing = map.get(item.name)\n if (existing) {\n map.set(item.name, isCustom\n ? { ...existing, order: item.order, text: item.text ?? '', source: 'custom' }\n : { ...existing, order: item.order, source: 'system' })\n } else {\n map.set(item.name, {\n name: item.name,\n order: item.order,\n text: item.text ?? '',\n active: !blockedNames.has(item.name),\n replaced: false,\n source: isCustom ? 'custom' : 'system',\n })\n }\n }\n return [...map.values()].sort((a, b) => a.order - b.order)\n}\n\n/**\n * Resolve a preset's relative order into an absolute ordered list (0..n-1).\n * Sections with no anchor (or whose anchor is absent) come first in preset\n * order; each anchored section is inserted right after its anchor; any\n * remaining sections (cycles) are appended.\n */\nexport function resolveOrder(presetOrder: PresetData['order']): Array<{ name: string; order: number; text: string; custom?: boolean }> {\n const list = presetOrder ?? []\n const afterMap = new Map<string, string | undefined>()\n const textMap = new Map<string, string>()\n const customMap = new Map<string, boolean>()\n for (const sec of list) {\n afterMap.set(sec.name, sec.after)\n textMap.set(sec.name, sec.text)\n customMap.set(sec.name, sec.custom === true)\n }\n\n const result: string[] = []\n const placed = new Set<string>()\n\n for (const sec of list) {\n const anchor = afterMap.get(sec.name)\n if (!anchor || !afterMap.has(anchor)) { result.push(sec.name); placed.add(sec.name) }\n }\n\n let changed = true\n while (changed) {\n changed = false\n for (const sec of list) {\n if (placed.has(sec.name)) continue\n const anchor = afterMap.get(sec.name)\n if (anchor && placed.has(anchor)) {\n result.splice(result.indexOf(anchor) + 1, 0, sec.name)\n placed.add(sec.name)\n changed = true\n }\n }\n }\n\n for (const sec of list) {\n if (!placed.has(sec.name)) { result.push(sec.name); placed.add(sec.name) }\n }\n\n return result.map((name, i) => ({ name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name) }))\n}\n\n/**\n * Build a preset snapshot from the current config. The order list is derived\n * from the MERGED section list (not just `cfg.inject`) so that a preset saved\n * after only blocking sections (without reordering) still carries the full\n * ordered set, and thus a meaningful \"active list\" when applied.\n */\nexport function buildPresetData(cfg: Config, merged: Section[]): PresetData {\n // Only custom (plugin-added) sections carry their own text into the preset's\n // order list. System sections keep an empty text so applying the preset only\n // reorders them and never freezes their dynamically generated content.\n const order = merged.map((sec, i) => ({\n name: sec.name,\n after: i > 0 ? merged[i - 1].name : undefined,\n text: sec.source === 'custom' ? (sec.text ?? '') : '',\n custom: sec.source === 'custom',\n }))\n return {\n sections: cfg.sections,\n replace: cfg.replace,\n order,\n tools: cfg.tools,\n }\n}\n\n/**\n * Compute the config patch when applying a preset:\n * - same-name sections are overridden (the order list drives this at runtime)\n * - preset sections missing from the current prompt are added\n * - current sections NOT in the preset's ordered list are disabled by default\n * - only the preset's ACTIVE sections (in the order list but not in its block\n * list) are unblocked; the preset's own blocked sections stay blocked.\n *\n * Custom injected sections that exist in the current config but are NOT in the\n * preset's ordered list are preserved in the resulting inject list (so they\n * stay visible) and disabled (added to the blocked set), rather than silently\n * dropped — a preset must not make the user's own injected sections vanish.\n */\nexport function applyPresetData(data: PresetData, cfg: Config, currentNames: ReadonlySet<string>): ConfigPatch {\n const presetOrder = data.order ?? []\n const presetNames = new Set(presetOrder.map((x) => x.name))\n const blocked = new Set(data.sections ?? [])\n\n // Inject list = the preset's resolved order, then any custom injected\n // sections present in the current config but absent from the preset list.\n // Keeping them in `inject` makes them visible; they are disabled below.\n // Kept customs continue after the preset's own indexes; if the preset covers\n // only a small subset they may tie with the inventory's native orders — the\n // merge view sorts stably (inventory first), so ordering stays deterministic,\n // and the next reorder/persist re-indexes everything contiguously anyway.\n const inject = resolveOrder(presetOrder)\n const kept = new Set(inject.map((x) => x.name))\n let order = inject.length\n for (const item of cfg.inject ?? []) {\n if (!item || !item.name || presetNames.has(item.name) || kept.has(item.name)) continue\n kept.add(item.name)\n inject.push({ name: item.name, order: order++, text: item.text ?? '', custom: item.custom === true })\n }\n\n // Only enforce the \"active set\" when the preset actually defines an order.\n // An empty order (e.g. a hand-authored / imported preset that only blocks a\n // few sections) must not default-disable every current section.\n if (presetOrder.length > 0) {\n const activeNames = new Set([...presetNames].filter((n) => !blocked.has(n)))\n for (const name of currentNames) if (!presetNames.has(name)) blocked.add(name)\n for (const name of activeNames) blocked.delete(name)\n }\n\n return {\n sections: [...blocked],\n replace: { ...(cfg.replace ?? {}), ...(data.replace ?? {}) },\n inject,\n tools: { exclude: data.tools?.exclude ?? [], include: data.tools?.include ?? [] },\n }\n}\n\n/**\n * Remove a custom (plugin-added) section from the config: it disappears from\n * the inject list, is no longer forced into the blocked set, and any replace\n * text for it is cleared. The remaining inject entries are re-indexed to a\n * contiguous 0..n-1 order (the virtual index model), so removal never leaves\n * holes. System sections read from the host inventory cannot be removed this\n * way (they would just come back on the next inventory read).\n */\nexport function removeSection(name: string, cfg: Config): Pick<Config, 'sections' | 'inject' | 'replace'> {\n const sections = (cfg.sections ?? []).filter((n) => n !== name)\n const inject = (cfg.inject ?? [])\n .filter((item) => item.name !== name)\n .map((item, i) => ({ ...item, order: i }))\n const replace = { ...(cfg.replace ?? {}) }\n delete replace[name]\n return { sections, inject, replace }\n}\n\n// ── Tool filtering ──────────────────────────────────────────────────────────\n\nexport type ToolsCfg = { exclude?: string[]; include?: string[] }\n\n/** Whether a tool is hidden under the current include/exclude config. */\nexport function isToolHidden(name: string, toolsCfg: ToolsCfg | undefined): boolean {\n const include = toolsCfg?.include ?? []\n const exclude = toolsCfg?.exclude ?? []\n return include.length > 0 ? !include.includes(name) : exclude.includes(name)\n}\n\n/** Toggle a tool's hidden state, returning a new tools config. */\nexport function toggleTool(name: string, currentlyHidden: boolean, toolsCfg: ToolsCfg | undefined): ToolsCfg {\n const include = toolsCfg?.include ?? []\n const exclude = toolsCfg?.exclude ?? []\n if (include.length > 0) {\n const next = include.slice()\n if (currentlyHidden) {\n next.push(name)\n // Re-showing a tool in whitelist mode must also clear any stale blacklist\n // entry, otherwise the name lingers in both lists and reappears as hidden\n // if the user later switches back to blacklist mode.\n const nextExclude = exclude.filter((n) => n !== name)\n return { exclude: nextExclude, include: next }\n }\n const i = next.indexOf(name)\n if (i >= 0) next.splice(i, 1)\n return { exclude, include: next }\n }\n const next = exclude.slice()\n if (currentlyHidden) { const i = next.indexOf(name); if (i >= 0) next.splice(i, 1) }\n else next.push(name)\n return { exclude: next, include }\n}\n\n/**\n * Switch between include (whitelist) and exclude (blacklist) modes. Turning\n * include mode on discards names unknown to the current tool set and seeds the\n * include list from the currently non-excluded tools; turning it off clears the\n * include list (keep only known exclude names).\n */\nexport function setToolMode(on: boolean, toolsCfg: ToolsCfg | undefined, toolNames: string[]): ToolsCfg {\n const known = new Set(toolNames)\n const exclude = (toolsCfg?.exclude ?? []).filter((n) => known.has(n))\n if (on) return { exclude, include: toolNames.filter((n) => !exclude.includes(n)) }\n return { exclude, include: [] }\n}\n\n// ── Preset list operations ──────────────────────────────────────────────────\n\n/** Serialize a preset for export (JSON-safe full snapshot). */\nexport function serializePreset(preset: Preset): { name: string; data: PresetData } {\n return { name: preset.name, data: preset.data }\n}\n\n/**\n * Import preset(s): same-name presets are skipped, only distinct names are\n * added. Returns a new presets list (or the original if nothing changed).\n */\nexport function addImportedPresets(existing: Preset[], parsed: unknown, makeId: () => string): Preset[] {\n const incoming = Array.isArray(parsed) ? parsed : [parsed]\n const existingNames = new Set(existing.map((p) => p.name))\n const added = incoming\n .filter((p) => p && typeof (p as { name?: unknown }).name === 'string' && !existingNames.has((p as Preset).name))\n .map((p) => ({ id: makeId(), name: (p as Preset).name, data: ((p as Preset).data ?? {}) as PresetData }))\n return added.length > 0 ? [...existing, ...added] : existing\n}\n\n/** Delete a preset, clearing the active id if it pointed at the removed one. */\nexport function removePreset(presets: Preset[], id: string, activeId?: string): { presets: Preset[]; activeId?: string } {\n return {\n presets: presets.filter((p) => p.id !== id),\n activeId: activeId === id ? undefined : activeId,\n }\n}\n","/** Prompt-sections tab: block / replace / inject / reorder prompt sections. */\nimport { createElement as h, useState, type ReactElement, type DragEvent, type ChangeEvent } from 'react'\nimport type { Config, Inventory, SettingsScope } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { mergeSections, removeSection, type Section } from './presets.ts'\nimport { s } from './styles.ts'\n\nexport function SectionsTab({ cfg, inv, scope, t }: { cfg: Config; inv: Inventory | null; scope: SettingsScope; t: Translate }): ReactElement {\n const replace = cfg.replace ?? {}\n const blockedNames = new Set(cfg.sections ?? [])\n const [editing, setEditing] = useState<string | null>(null)\n const [draft, setDraft] = useState('')\n const [dragName, setDragName] = useState<string | null>(null)\n const [dropTarget, setDropTarget] = useState<{ name: string; pos: 'above' | 'below' } | null>(null)\n\n // Merge inventory sections with user-injected sections, sorted by order.\n // Injected sections that don't exist in the original prompt appear here too,\n // positioned by their order value.\n const merged: Section[] = mergeSections(inv, cfg, blockedNames)\n\n const toggleBlock = (name: string, currentlyBlocked: boolean): void => {\n const list = (cfg.sections ?? []).slice()\n if (currentlyBlocked) { const i = list.indexOf(name); if (i >= 0) list.splice(i, 1) }\n else list.push(name)\n scope.set('sections', list)\n }\n const startReplace = (name: string, original: string): void => {\n // Echo the ORIGINAL prompt text so the user edits from the current value.\n setEditing(name)\n setDraft(replace[name] ?? original)\n }\n const commitReplace = (name: string): void => {\n const next = { ...replace }\n if (draft.trim() === '') delete next[name]\n else next[name] = draft\n scope.set('replace', next)\n setEditing(null)\n }\n const clearReplace = (name: string): void => {\n const next = { ...replace }\n delete next[name]\n scope.set('replace', next)\n }\n\n // Persist the full ordered list. We treat the sorted list as an array and\n // re-index every section with a sequential integer order (0, 1, 2, …), so\n // there are never duplicate or fractional orders. System sections keep empty\n // text (so we never freeze their dynamically generated content); custom\n // (plugin-generated) sections keep their own text and the hidden `custom`\n // marker, so they render real content and stay identifiable/deletable.\n const persistOrder = (ordered: Section[]): void => {\n const list = ordered.map((sec, i) => {\n const existing = (cfg.inject ?? []).find((x) => x.name === sec.name)\n const isCustom = sec.source === 'custom'\n return { name: sec.name, order: i, text: isCustom ? (sec.text ?? '') : (existing?.text ?? ''), custom: isCustom }\n })\n scope.set('inject', list)\n }\n\n // Delete a custom (plugin-added) section: remove it from inject / sections /\n // replace so it no longer appears in the panel at all.\n const removeCustom = (name: string): void => {\n const patch = removeSection(name, cfg)\n scope.set('sections', patch.sections)\n scope.set('inject', patch.inject)\n scope.set('replace', patch.replace)\n }\n\n // Move a section up/down one slot (array-index swap), then re-index.\n const moveOrder = (index: number, dir: -1 | 1): void => {\n const target = index + dir\n if (target < 0 || target >= merged.length) return\n const next = merged.slice()\n const [item] = next.splice(index, 1)\n next.splice(target, 0, item)\n persistOrder(next)\n }\n\n const onDragStart = (e: DragEvent, name: string): void => {\n setDragName(name)\n e.dataTransfer.effectAllowed = 'move'\n try { e.dataTransfer.setData('text/plain', name) } catch { /* ignore */ }\n }\n const onDragOver = (e: DragEvent, name: string): void => {\n if (!dragName || dragName === name) return\n e.preventDefault()\n e.dataTransfer.dropEffect = 'move'\n const rect = e.currentTarget.getBoundingClientRect()\n const pos = e.clientY < rect.top + rect.height / 2 ? 'above' : 'below'\n setDropTarget({ name, pos })\n }\n const onDrop = (e: DragEvent, target: Section): void => {\n e.preventDefault()\n if (!dragName || dragName === target.name) { setDragName(null); setDropTarget(null); return }\n const dragged = merged.find((x) => x.name === dragName)\n if (!dragged) { setDragName(null); setDropTarget(null); return }\n const next = merged.filter((x) => x.name !== dragName)\n const idx = next.findIndex((x) => x.name === target.name)\n const pos = dropTarget?.name === target.name ? dropTarget.pos : 'below'\n next.splice(pos === 'above' ? idx : idx + 1, 0, dragged)\n persistOrder(next)\n setDragName(null)\n setDropTarget(null)\n }\n const onDragEnd = (): void => { setDragName(null); setDropTarget(null) }\n\n // Add a new injected section, placed by its order hint, then re-index. The\n // section is marked `custom` (the hidden marker) so it is identified as\n // plugin-generated and thus deletable, and its own text is preserved.\n const addSection = (name: string, order: number, text: string): void => {\n const next = merged.slice()\n const entry: Section = { name, order, text, active: true, replaced: false, source: 'custom' }\n const existing = next.findIndex((x) => x.name === name)\n if (existing >= 0) next[existing] = entry\n else {\n const idx = next.findIndex((x) => x.order > order)\n if (idx < 0) next.push(entry)\n else next.splice(idx, 0, entry)\n }\n persistOrder(next)\n }\n\n return h('div', { style: s.list }, [\n merged.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n merged.map((sec, index) => {\n const blocked = blockedNames.has(sec.name)\n const isEditing = editing === sec.name\n const isDragging = dragName === sec.name\n const isDropTarget = dropTarget?.name === sec.name\n const rowStyle = {\n ...s.row,\n ...(isDragging ? s.rowDragging : {}),\n ...(isDropTarget && dropTarget.pos === 'above' ? s.rowDropAbove : {}),\n ...(isDropTarget && dropTarget.pos === 'below' ? s.rowDropBelow : {}),\n }\n return h('div', {\n key: sec.name,\n style: rowStyle,\n draggable: true,\n onDragStart: (e: DragEvent) => onDragStart(e, sec.name),\n onDragOver: (e: DragEvent) => onDragOver(e, sec.name),\n onDrop: (e: DragEvent) => onDrop(e, sec),\n onDragEnd,\n }, [\n h('span', { style: s.dragHandle, title: t('drag') }, '⠿'),\n h('label', { style: s.switchWrap }, [\n h('input', { type: 'checkbox', checked: blocked, onChange: () => toggleBlock(sec.name, blocked) }),\n h('span', { style: blocked ? s.badgeBlocked : s.badgeOk }, blocked ? t('blockedOn') : t('blockedOff')),\n ]),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, sec.name),\n h('span', { style: s.orderTag }, '#' + index),\n h('span', { style: sec.source === 'custom' ? s.badgeCustom : s.badgeSystem }, sec.source === 'custom' ? t('manual') : t('system')),\n sec.replaced ? h('span', { style: s.badgeReplaced }, t('replaced')) : null,\n ]),\n isEditing\n ? h('div', { style: s.editBox }, [\n h('textarea', { style: s.editInput, value: draft, onChange: (e: ChangeEvent<HTMLTextAreaElement>) => setDraft(e.target.value), rows: 3 }),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => commitReplace(sec.name) }, t('add')),\n h('button', { style: s.mini, onClick: () => setEditing(null) }, t('clearReplace')),\n ]),\n ])\n : h('div', { style: s.preview }, String(sec.text ?? '').slice(0, 140) || (sec.source === 'custom' ? t('empty') : t('dynamic'))),\n ]),\n h('div', { style: s.arrowCol }, [\n h('button', { style: s.arrow, disabled: index === 0, onClick: () => moveOrder(index, -1), title: t('moveUp') }, '↑'),\n h('button', { style: s.arrow, disabled: index === merged.length - 1, onClick: () => moveOrder(index, 1), title: t('moveDown') }, '↓'),\n ]),\n h('button', { style: s.mini, onClick: () => replace[sec.name] ? clearReplace(sec.name) : startReplace(sec.name, String(sec.text ?? '')) }, replace[sec.name] ? t('clearReplace') : t('replace')),\n sec.source === 'custom' ? h('button', { style: s.mini, onClick: () => removeCustom(sec.name), title: t('delete') }, t('delete')) : null,\n ])\n }),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('injectNew')),\n h(InjectForm, { onAdd: addSection, t }),\n ]),\n ])\n}\n\nfunction InjectForm({ onAdd, t }: { onAdd: (name: string, order: number, text: string) => void; t: Translate }): ReactElement {\n const [name, setName] = useState('')\n const [order, setOrder] = useState('120')\n const [text, setText] = useState('')\n\n const submit = (): void => {\n if (!name.trim()) return\n onAdd(name.trim(), Number(order) || 120, text)\n setName(''); setText(''); setOrder('120')\n }\n\n return h('div', {}, [\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, width: '22%' }, placeholder: t('name'), value: name, onChange: (e) => setName(e.target.value) }),\n h('input', { style: { ...s.input, width: '12%' }, type: 'number', placeholder: t('order'), value: order, onChange: (e) => setOrder(e.target.value) }),\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('text'), value: text, onChange: (e) => setText(e.target.value) }),\n h('button', { style: s.mini, onClick: submit }, t('add')),\n ]),\n ])\n}\n","/** Tools tab: hide tools from the model catalog (blacklist only — check = hide). */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { Config, Inventory, SettingsScope } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\n\nexport function ToolsTab({ cfg, inv, scope, t }: { cfg: Config; inv: Inventory | null; scope: SettingsScope; t: Translate }): ReactElement {\n const tools = inv?.tools ?? []\n const exclude = cfg.tools?.exclude ?? []\n\n // Blacklist-only: a tool is hidden iff it is in the exclude list. Any stale\n // whitelist (include) is discarded on write so mode switching is gone.\n const hidden = (name: string): boolean => exclude.includes(name)\n\n const toggle = (name: string, currentlyHidden: boolean): void => {\n const next = exclude.slice()\n if (currentlyHidden) { const i = next.indexOf(name); if (i >= 0) next.splice(i, 1) }\n else next.push(name)\n scope.set('tools', { exclude: next, include: [] })\n }\n\n const setAll = (hideAll: boolean): void => {\n scope.set('tools', { exclude: hideAll ? tools.map((tool) => tool.name) : [], include: [] })\n }\n\n return h('div', {}, [\n h('div', { style: s.bar }, [\n h('button', { style: s.mini, onClick: () => setAll(true) }, t('selectAll')),\n h('button', { style: s.mini, onClick: () => setAll(false) }, t('selectNone')),\n ]),\n h('div', { style: s.list }, [\n tools.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n tools.map((tool) => {\n const isHidden = hidden(tool.name)\n return h('div', { key: tool.name, style: s.row }, [\n h('label', { style: s.switchWrap }, [\n h('input', { type: 'checkbox', checked: isHidden, onChange: () => toggle(tool.name, isHidden) }),\n h('span', { style: isHidden ? s.badgeBlocked : s.badgeOk }, isHidden ? t('hiddenOn') : t('hiddenOff')),\n ]),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, tool.name)),\n h('div', { style: s.preview }, String(tool.description ?? '').slice(0, 140)),\n ]),\n ])\n }),\n ]),\n ])\n}\n","/** Presets tab: save / apply / export / import complete customization snapshots. */\nimport { createElement as h, useRef, useState, type ReactElement, type ChangeEvent } from 'react'\nimport type { Config, Inventory, Preset, PresetData, SettingsScope } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { addImportedPresets, applyPresetData, buildPresetData, mergeSections, removePreset, serializePreset } from './presets.ts'\nimport { s } from './styles.ts'\n\nexport function PresetsTab({ cfg, inv, scope, t }: { cfg: Config; inv: Inventory | null; scope: SettingsScope; t: Translate }): ReactElement {\n const presets = cfg.presets ?? []\n const [name, setName] = useState('')\n const fileRef = useRef<HTMLInputElement | null>(null)\n\n const blockedNames = new Set(cfg.sections ?? [])\n const merged = mergeSections(inv, cfg, blockedNames)\n const currentNames = new Set(merged.map((sec) => sec.name))\n\n // Capture the current customization as a new preset (full snapshot). The\n // absolute order is converted to a relative form (each section records the\n // section it should follow) so the preset stays portable across prompts.\n const saveCurrent = (): void => {\n const presetName = name.trim() || `${t('preset')} ${presets.length + 1}`\n const data = buildPresetData(cfg, merged)\n scope.set('presets', [...presets, { id: genId(), name: presetName, data }])\n setName('')\n }\n\n // Apply a preset. The patch is computed by the pure helper:\n // - same-name sections are overridden (content + order)\n // - preset sections missing from the current prompt are added\n // - current sections NOT in the preset list are disabled (blocked)\n // - only the preset's ACTIVE sections are unblocked (its own blocked list\n // is preserved)\n const applyPreset = (preset: Preset): void => {\n const patch = applyPresetData(preset.data, cfg, currentNames)\n scope.set('inject', patch.inject)\n scope.set('replace', patch.replace)\n scope.set('sections', patch.sections)\n scope.set('tools', patch.tools)\n scope.set('activePreset', preset.id)\n }\n\n const deletePreset = (id: string): void => {\n const next = removePreset(presets, id, cfg.activePreset)\n scope.set('presets', next.presets)\n if (next.activeId === undefined && cfg.activePreset === id) scope.unset('activePreset')\n }\n\n // Serialize a preset to a downloadable JSON file.\n const exportPreset = (preset: Preset): void => {\n const blob = new Blob([JSON.stringify(serializePreset(preset), null, 2)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${preset.name}.json`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n // Import preset(s) from a JSON file. Same-name presets are skipped; only\n // presets with new names are added to the local list.\n const onImportFile = (e: ChangeEvent<HTMLInputElement>): void => {\n const file = e.target.files?.[0]\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => {\n try {\n const parsed = JSON.parse(String(reader.result))\n scope.set('presets', addImportedPresets(presets, parsed, genId))\n } catch { /* ignore invalid json */ }\n }\n reader.readAsText(file)\n e.target.value = ''\n }\n\n return h('div', { style: s.list }, [\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('savePreset')),\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('presetName'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('button', { style: s.mini, onClick: saveCurrent }, t('save')),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('importPreset')),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => fileRef.current?.click() }, t('import')),\n h('input', { ref: fileRef, type: 'file', accept: '.json,application/json', style: { display: 'none' }, onChange: onImportFile }),\n ]),\n ]),\n presets.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n presets.map((preset) => {\n const active = cfg.activePreset === preset.id\n return h('div', { key: preset.id, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, preset.name),\n active ? h('span', { style: s.badgeOk }, t('active')) : null,\n ]),\n ]),\n h('button', { style: s.mini, onClick: () => applyPreset(preset) }, t('apply')),\n h('button', { style: s.mini, onClick: () => exportPreset(preset) }, t('export')),\n h('button', { style: s.mini, onClick: () => deletePreset(preset.id) }, t('delete')),\n ])\n }),\n ])\n}\n\nfunction genId(): string {\n return 'p_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 7)\n}\n","/** Tools preview: read-only whitelist-style list of the tools the current\n * preset will inject (the FINAL model-visible catalog after include/exclude).\n * A tool being listed means it is visible — there is no \"blocked\" state here.\n * This view never edits the blacklist/whitelist config. */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\n\nexport type PreviewTool = { name: string; description: string } | string\n\nfunction norm(tool: PreviewTool): { name: string; description: string } {\n return typeof tool === 'string' ? { name: tool, description: '' } : tool\n}\n\nexport function PreviewTools({ tools, t }: { tools: PreviewTool[]; t: Translate }): ReactElement {\n if (tools.length === 0) return h('div', { style: s.muted }, t('empty'))\n return h('div', { style: s.list }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.orderTag }, `${tools.length} ${t('previewToolCount')}`),\n ]),\n tools.map((tool) => {\n const { name, description } = norm(tool)\n return h('div', { key: name, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, name)),\n h('div', { style: s.preview }, String(description ?? '').slice(0, 140)),\n ]),\n ])\n }),\n ])\n}\n","/** Preview tab: two read-only sub-tabs — the FINAL assembled system prompt\n * after every plugin's filter, and the tools the current preset will inject\n * (whitelist-style, after include/exclude). Neither view edits config. */\nimport { createElement as h, useEffect, useRef, useState, type ReactElement } from 'react'\nimport type { Preview, SettingsScope } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport { PreviewTools } from './PreviewTools.tsx'\n\nconst PREVIEW_URL = '/api/prompt-customizer/preview'\n\nexport function PreviewTab({ scope, t }: { scope: SettingsScope; t: Translate }): ReactElement {\n const [sub, setSub] = useState<'prompt' | 'tools'>('prompt')\n const [data, setData] = useState<Preview | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n // Reload whenever the namespace config changes (block/replace/inject), so the\n // section count and final text always reflect the current customization —\n // not just on mount. A config change that lands while a fetch is in flight is\n // never dropped: it schedules one trailing reload, so the preview converges\n // to the latest config even when the in-flight response was served before the\n // write committed on the host.\n const inFlight = useRef(false)\n const pending = useRef(false)\n const load = (): void => {\n if (inFlight.current) { pending.current = true; return }\n inFlight.current = true\n setData(null)\n fetch(PREVIEW_URL, { cache: 'no-store' })\n .then((r) => r.json())\n .then((body: Preview) => {\n if (body && body.ok === false) throw new Error((body as { error?: string }).error ?? 'preview failed')\n setData(body)\n setError(null)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n .finally(() => {\n inFlight.current = false\n if (pending.current) { pending.current = false; load() }\n })\n }\n useEffect(load, [])\n useEffect(() => scope.subscribe(load), [scope])\n\n return h('div', { style: s.list }, [\n h('div', { style: s.bar }, [\n h('button', { style: sub === 'prompt' ? s.tabActive : s.tab, onClick: () => setSub('prompt') }, t('previewPrompt')),\n h('button', { style: sub === 'tools' ? s.tabActive : s.tab, onClick: () => setSub('tools') }, t('previewTools')),\n ]),\n error ? h('div', { style: s.error }, String(error)) : null,\n data === null && !error ? h('div', { style: s.muted }, t('loading')) : null,\n sub === 'prompt'\n ? data\n ? [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewHint')),\n h('span', { style: s.orderTag }, `${data.sections.length} ${t('previewSections')}`),\n ]),\n h('pre', { style: s.previewText }, data.text || t('empty')),\n ]\n : null\n : data\n ? h(PreviewTools, { tools: data.tools, t })\n : null,\n ])\n}\n","/**\n * dsh-prompt-customizer — browser half (TypeScript source).\n *\n * Registers a \"提示词定制\" settings section (sidebar entry) and a plugin\n * settings card. The panel fetches the effective section / tool inventory\n * from the host `/api/prompt-customizer/inventory` and lets the user block,\n * replace, inject prompt sections and hide tools. All writes go through the\n * bound settings scope (`prompt-customizer` namespace) and apply live.\n *\n * Built by tsdown into the __ModuleLoader__ factory bundle at client/client.js;\n * the only external is the loader module table's react entry.\n */\nimport { createElement as h, useEffect, useState, type ReactElement } from 'react'\nimport { DICT, type Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport type { Config, Inventory, SettingsScope } from './types.ts'\nimport { SectionsTab } from './SectionsTab.tsx'\nimport { ToolsTab } from './ToolsTab.tsx'\nimport { PresetsTab } from './PresetsTab.tsx'\nimport { PreviewTab } from './PreviewTab.tsx'\n\nconst NS = 'prompt-customizer'\nconst INVENTORY_URL = '/api/prompt-customizer/inventory'\n\nexport const name = 'prompt-customizer'\nexport const inject = ['slots', 'locale']\n\n/** The subset of the client cordis context this plugin touches. */\ninterface ClientContext {\n effect(callback: () => unknown, label?: string): void\n locale: {\n register(namespace: string, dicts: { zh: Record<string, string>; en: Record<string, string> }): unknown\n bind(namespace: string): Translate\n }\n inject(services: string[], callback: (scoped: SettingsScopeHost) => void): void\n}\n\n/** The host surface the settings card needs (settingsScope transport). */\ninterface SettingsScopeHost {\n settingsScope: {\n bind(options: { namespace: string }): SettingsScope\n }\n slots: {\n inject(name: string, register: () => unknown): void\n register(meta: Record<string, unknown>, render: () => unknown): unknown\n }\n}\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, DICT), 'prompt-customizer: locale')\n const t = ctx.locale.bind(NS)\n\n // Register a standalone settings section (sidebar menu entry) so the panel\n // only appears under \"提示词定制\", not as a card inside the \"插件\" settings\n // list. Goes through a NESTED inject of settingsScope so the panel can\n // read/write the namespace config; on hosts without the settings transport\n // it stays hidden instead of unmounting the whole plugin.\n ctx.inject(['settingsScope'], (scoped) => {\n const scope = scoped.settingsScope.bind({ namespace: NS })\n\n scoped.slots.inject('settings.section', () => scoped.slots.register({\n name: 'settings.section',\n id: 'prompt-customizer',\n order: 50,\n label: () => t('nav'),\n locale: NS,\n inject: () => ({ t }),\n }, () => h(Panel, { scope, t })))\n })\n}\n\n// ── Root panel ──────────────────────────────────────────────────────────────\n\nfunction Panel({ scope, t }: { scope: SettingsScope; t: Translate }): ReactElement {\n const [snap, setSnap] = useState(() => scope.getSnapshot())\n const [inv, setInv] = useState<Inventory | null>(null)\n const [tab, setTab] = useState<'sections' | 'tools' | 'presets' | 'preview'>('sections')\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => scope.subscribe(() => setSnap(scope.getSnapshot())), [scope])\n\n const refresh = (): void => {\n fetch(INVENTORY_URL)\n .then((r) => r.json())\n .then((data: Inventory) => { setInv(data); setError(null) })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n useEffect(refresh, [])\n\n if (snap.status !== 'ready' && snap.value === undefined) {\n return h('div', { style: s.muted }, t('loading'))\n }\n\n const cfg: Config = snap.value && typeof snap.value === 'object'\n ? snap.value as Config\n : { sections: [], replace: {}, inject: [], tools: { exclude: [], include: [] } }\n\n return h('div', { style: s.root }, [\n h('div', { style: s.bar }, [\n h('button', { style: tab === 'sections' ? s.tabActive : s.tab, onClick: () => setTab('sections') }, t('tabsSections')),\n h('button', { style: tab === 'tools' ? s.tabActive : s.tab, onClick: () => setTab('tools') }, t('tabsTools')),\n h('button', { style: tab === 'presets' ? s.tabActive : s.tab, onClick: () => setTab('presets') }, t('tabsPresets')),\n h('button', { style: tab === 'preview' ? s.tabActive : s.tab, onClick: () => setTab('preview') }, t('tabsPreview')),\n h('button', { style: s.refresh, onClick: refresh }, t('refresh')),\n ]),\n error ? h('div', { style: s.error }, String(error)) : null,\n tab === 'sections'\n ? h(SectionsTab, { cfg, inv, scope, t })\n : tab === 'tools'\n ? h(ToolsTab, { cfg, inv, scope, t })\n : tab === 'presets'\n ? h(PresetsTab, { cfg, inv, scope, t })\n : h(PreviewTab, { scope, t }),\n ])\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["useState","useRef","h","useState","h","useState","useRef","h","h","useState","h","h","useState","useRef"],"sources":["../src/client/locales.ts","../src/client/styles.ts","../src/client/presets.ts","../lib/sectionOps.mjs","../src/client/SectionsTab.tsx","../src/client/ToolsTab.tsx","../src/client/preset-io.ts","../src/client/PresetsTab.tsx","../src/client/PreviewTools.tsx","../src/client/PreviewTab.tsx","../src/client/index.ts"],"sourcesContent":["/** Locale dictionaries for the prompt-customizer panel. */\nexport const DICT = {\n zh: {\n nav: '提示词定制',\n loading: '加载中…',\n unavailable: '当前环境未启用本命名空间。',\n tabsSections: '提示词',\n tabsTools: '工具',\n tabsPresets: '配置',\n tabsPreview: '预览',\n refresh: '刷新',\n blockedOff: '未屏蔽',\n blockedOn: '已屏蔽',\n replaced: '已替换',\n manual: '手动',\n system: '系统',\n replace: '编辑',\n clearReplace: '清除',\n clearInput: '清空',\n injectNew: '注入新段',\n name: '名称',\n order: '顺序',\n text: '文本',\n add: '添加',\n hiddenOff: '可见',\n hiddenOn: '已隐藏',\n selectAll: '全选',\n selectNone: '全不选',\n empty: '(空)',\n dynamic: '<动态生成>',\n drag: '拖动排序',\n moveUp: '上移',\n moveDown: '下移',\n previewHint: '以下为屏蔽/替换/注入后的最终系统提示词:',\n previewPrompt: '提示词预览',\n previewSections: '段',\n previewTools: '工具预览',\n previewToolCount: '个工具',\n savePreset: '保存当前配置',\n presetName: '配置名称',\n saveAsPresetCard: '存为 agent 预设',\n saveAsPresetHint: '整体复制「{name}」这个预设的组成为新预设(组成文件与伴生脚本一并带走),再把当前定制写进它的覆盖项 —— 新预设出现在顶部编辑目标里。',\n agentPresetName: '新预设名',\n forkSourceDefault: '默认预设',\n saveAsPresetOk: '预设已创建,可在顶部的编辑目标选择器里选到它',\n saveAsPresetFail: '保存预设失败',\n save: '保存',\n importPreset: '导入配置',\n import: '导入',\n apply: '应用',\n export: '导出',\n delete: '删除',\n restore: '还原',\n active: '使用中',\n preset: '预设',\n ioFailed: '导入/导出失败',\n importInvalid: '无效的配置文件',\n targetGlobal: '目标:全局默认',\n targetHint: '选择编辑目标 —— 选中某个 agent 预设后,改动只对该预设生效(字段级覆盖)。',\n broken: '损坏',\n brokenPreset: '该 agent 预设当前无法挂载,仍可编辑其定制(修复预设后自动生效)。',\n phaseBootstrap: '仅引导阶段',\n phaseActive: '晋级后',\n phaseCompaction: '压缩后',\n // agent 周期三阶段的展示命名(引导期 → 常驻期 → 压缩受控期)。\n phaseStageGuide: '引导期',\n phaseStageResident: '常驻期',\n phaseStageControlled: '压缩受控期',\n toolsPartGuide: '引导期工具',\n toolsPartResident: '常驻期工具',\n toolsPartControlled: '压缩受控期工具',\n allToolsTitle: '本系统全部工具',\n sectionsPartGuide: '引导期提示词',\n sectionsPartResident: '常驻期提示词',\n sectionsPartControlled: '压缩受控期提示词',\n allSectionsTitle: '本系统全部提示词',\n toolsFourHint: '三个阶段各一份名单,互不继承:勾选 = 该阶段是否对模型可见;从「全部」拖入某阶段 = 让这一个工具在该阶段出现(若该阶段默认裁掉了它,就加回去);在两个阶段之间拖动 = 复制(源阶段不动,目标阶段多一份,隐藏/启用状态一起带过去);拖回「全部」= 从该阶段拿掉它。每个动作只影响被拖的那一个工具。',\n sectionsFourHint: '拖拽双向:把「全部」里的段拖入上方阶段 = 加入该阶段并默认开启;从阶段拖回「全部」= 从该阶段移除。屏蔽段与普通段完全一样可拖拽 / 编辑,只是不注入模型。',\n dragHint: '拖入 = 让该工具在这个阶段出现',\n phaseShortGuide: '引',\n phaseShortResident: '常',\n phaseShortControlled: '压',\n poolMarksHint: '每个名字后的三个标记 = 该工具在引导期 / 常驻期 / 压缩受控期的状态:绿=该阶段可见(或已加回),灰=该阶段已隐藏,暗=不在该阶段、也没加回。',\n toolAddedTag: '加回',\n toolAdded: '已把「{name}」加回{phase}:该阶段默认裁掉了它,保存后它会重新出现在该阶段(当前预设注册表里有它)。',\n toolNotInRegistry: '「{name}」不在本预设的注册表里(它是别的预设独有的工具),当前预设没有它的定义,加不进来。',\n toolCopied: '已把「{name}」复制到{to}:{from}那份保持不动,隐藏/启用状态一起带过去。',\n toolShown: '「{name}」已在{to}显示。',\n toolHiddenIn: '「{name}」已在{to}隐藏。',\n sectionsTakenOver: '该目标的最终系统提示词由「{name}」段整段接管:宿主在装配瀑布流之后把 sections 强制还原为那一条段,因此本插件的段级屏蔽 / 替换 / 注入 / 排序都不会进入模型看到的提示词(工具过滤仍然生效)。要让段级定制生效,需在该 agent 预设里关掉 persona 的 complete。',\n sectionsLost: '本插件在该阶段产出的 {emitted} 个段里,只有 {survived} 个进入最终提示词:其余被下游装配规则丢弃,段级定制不会完全生效(工具过滤不受影响)。',\n sectionBlockedStrip: '(本阶段已屏蔽,模型不可见)',\n phaseSuppressed: '被抑制(不在任何阶段的装配中)',\n sectionDynamicNoAdd: '「{name}」是运行时才生成的动态段,没法预先加进某个阶段(它的内容只有装配时才知道)。',\n exportOk: '导出成功',\n exportCancel: '已取消导出',\n exportFail: '导出失败',\n importOk: '导入完成',\n importNone: '没有新增预设(同名已存在或文件为空)',\n importCancel: '已取消导入',\n importFail: '导入失败',\n saveOk: '已保存',\n saveFail: '保存失败',\n discardConfirm: '有未保存的更改,离开将丢弃。确定离开吗?',\n scopeFallback: '该 agent 预设的常驻 scope 未能挂载,以下显示的是全局层内容(并非该预设的原生段与工具)。',\n previewDegraded: '伪会话触发了某个预设插件的异常,本次预览已降级为无会话装配——预设原生的阶段裁剪规则未参与运行。',\n previewFail: '该阶段装配失败(scope 挂载失败或预设插件异常),请切换目标或查看服务日志。',\n phaseVisible: '阶段可见',\n previewToolsHint: '模型实际可见的工具目录(按所选阶段运行预设的全部装配规则,含原生阶段裁剪):',\n previewToolsCount: '注册表',\n saveAsPreset: '存为预设',\n },\n en: {\n nav: 'Prompt Customizer',\n loading: 'Loading…',\n unavailable: 'Namespace unavailable in this environment.',\n tabsSections: 'Sections',\n tabsTools: 'Tools',\n tabsPresets: 'Presets',\n tabsPreview: 'Preview',\n refresh: 'Refresh',\n blockedOff: 'Active',\n blockedOn: 'Blocked',\n replaced: 'Replaced',\n manual: 'Manual',\n system: 'System',\n replace: 'Replace',\n clearReplace: 'Clear',\n clearInput: 'Clear',\n injectNew: 'Inject section',\n name: 'Name',\n order: 'Order',\n text: 'Text',\n add: 'Add',\n hiddenOff: 'Visible',\n hiddenOn: 'Hidden',\n selectAll: 'Select all',\n selectNone: 'Select none',\n empty: '(empty)',\n dynamic: '<dynamic>',\n drag: 'Drag to reorder',\n moveUp: 'Move up',\n moveDown: 'Move down',\n previewHint: 'Final system prompt after block/replace/inject:',\n previewPrompt: 'Prompt preview',\n previewSections: 'sections',\n previewTools: 'Tools preview',\n previewToolCount: 'tools',\n savePreset: 'Save current config',\n presetName: 'Config name',\n saveAsPresetCard: 'Save as agent preset',\n saveAsPresetHint: 'Copy the whole \"{name}\" preset into a new one (composition plus its companion scripts), then write the current customization into its override — the new preset shows up in the target selector above.',\n agentPresetName: 'New preset name',\n forkSourceDefault: 'the default preset',\n saveAsPresetOk: 'Preset created — pick it in the target selector above',\n saveAsPresetFail: 'Failed to save preset',\n save: 'Save',\n importPreset: 'Import preset',\n import: 'Import',\n apply: 'Apply',\n export: 'Export',\n delete: 'Delete',\n restore: 'Restore',\n active: 'Active',\n preset: 'Preset',\n ioFailed: 'Import/export failed',\n importInvalid: 'Invalid preset file',\n targetGlobal: 'Target: global default',\n targetHint: 'Pick an edit target — changes apply only to the chosen agent preset (field-level override).',\n broken: 'broken',\n brokenPreset: 'This agent preset cannot mount right now; its customization is still editable and applies once fixed.',\n phaseBootstrap: 'Bootstrap only',\n phaseActive: 'After promotion',\n phaseCompaction: 'Post-compaction',\n // agent 周期三阶段的展示命名(引导期 → 常驻期 → 压缩受控期)。\n phaseStageGuide: 'Guide period',\n phaseStageResident: 'Resident period',\n phaseStageControlled: 'Compaction-controlled period',\n toolsPartGuide: 'Guide-period tools',\n toolsPartResident: 'Resident-period tools',\n toolsPartControlled: 'Compaction-controlled tools',\n allToolsTitle: 'All system tools',\n sectionsPartGuide: 'Guide-period sections',\n sectionsPartResident: 'Resident-period sections',\n sectionsPartControlled: 'Compaction-controlled sections',\n allSectionsTitle: 'All system sections',\n toolsFourHint: 'Each of the three periods keeps its own list, with no inheritance: the checkbox = visible to the model in that period; dragging a tool from \"All\" into a period makes it appear there (if the period trims it by default, it is added back); dragging between two periods copies it (the source is untouched, the target gains one, and the hidden/enabled state carries over); dragging it back to \"All\" removes it from that period. Every action touches only the tool you dragged.',\n sectionsFourHint: 'Drag both ways: drop a section from \"All\" onto a period part to enable it there; drag from a part back to \"All\" to remove it from that period. Blocked sections stay fully operable — they are just not injected.',\n dragHint: 'Drag in to make this tool appear in this period',\n phaseShortGuide: 'G',\n phaseShortResident: 'R',\n phaseShortControlled: 'C',\n poolMarksHint: 'The three marks after each name = this tool’s state in the guide / resident / compaction-controlled periods: green = visible there (or added back), grey = hidden there, dim = not present and not added.',\n toolAddedTag: 'added',\n toolAdded: 'Added \"{name}\" back to {phase}: the period trims it by default, so it will reappear there once saved (it exists in this preset’s registry).',\n toolNotInRegistry: '\"{name}\" is not in this preset’s registry (it belongs to another preset). There is no definition for it here, so it cannot be added.',\n toolCopied: 'Copied \"{name}\" to {to}: the copy in {from} is left untouched, and its hidden/enabled state carries over.',\n toolShown: '\"{name}\" is now visible in {to}.',\n toolHiddenIn: '\"{name}\" is now hidden in {to}.',\n sectionsTakenOver: 'The final system prompt here is taken over wholesale by the \"{name}\" section: the host restores that single section after the assembly waterfall, so this plugin’s section-level blocking / replacement / injection / ordering never reaches the model (tool filtering still applies). To make section customization effective, turn off the persona’s complete flag in this agent preset.',\n sectionsLost: 'Only {survived} of the {emitted} sections this plugin emitted for this phase reach the final prompt — the rest are dropped by downstream assembly rules, so section-level customization cannot fully apply (tool filtering is unaffected).',\n sectionBlockedStrip: ' (blocked in this period; invisible to the model)',\n phaseSuppressed: 'Suppressed (absent from every phase assembly)',\n sectionDynamicNoAdd: '\"{name}\" is generated at runtime — it cannot be added to a phase ahead of time (its content is only known during assembly).',\n exportOk: 'Exported',\n exportCancel: 'Export cancelled',\n exportFail: 'Export failed',\n importOk: 'Import complete',\n importNone: 'Nothing imported (duplicate names or empty file)',\n importCancel: 'Import cancelled',\n importFail: 'Import failed',\n saveOk: 'Saved',\n saveFail: 'Save failed',\n discardConfirm: 'You have unsaved changes; leaving will discard them. Leave anyway?',\n scopeFallback: \"This agent preset's standing scope could not be mounted; what you see is the global layer (not the preset's native sections/tools).\",\n previewDegraded: 'A preset plugin threw on the synthetic session; this preview fell back to an agent-less assembly — native phase rules did not run.',\n previewFail: 'Assembly for this phase failed (scope mount error or a preset plugin threw); switch target or check the server log.',\n phaseVisible: 'visible in phase',\n previewToolsHint: 'Tool catalog as the model actually sees it (all assembly rules run for the selected phase, including native phase narrowing):',\n previewToolsCount: 'of registry',\n saveAsPreset: 'Save as preset',\n },\n} as const\n\nexport type Translate = (key: string, params?: Record<string, string | number>) => string\n","/** 提示词定制面板各组件共享的内联样式(颜色走半透明灰,随宿主主题自然适配)。 */\nexport const s = (() => {\n const flex = { display: 'flex', alignItems: 'center' }\n return {\n root: { fontFamily: 'inherit', fontSize: 13, lineHeight: 1.5 },\n bar: { ...flex, gap: 6, marginBottom: 8, flexWrap: 'wrap' },\n tab: { padding: '4px 10px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.75 },\n tabActive: { padding: '4px 10px', border: '1px solid rgba(128,128,128,.7)', borderRadius: 6, background: 'rgba(128,128,128,.18)', cursor: 'pointer', color: 'inherit' },\n refresh: { marginLeft: 'auto', padding: '4px 10px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },\n list: { display: 'flex', flexDirection: 'column', gap: 6 },\n row: { ...flex, gap: 8, padding: '6px 8px', border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(128,128,128,.06)' },\n switchWrap: { ...flex, gap: 6, minWidth: 90 },\n rowBody: { flex: 1, minWidth: 0 },\n rowTitle: { ...flex, gap: 6, alignItems: 'baseline', flexWrap: 'wrap' },\n code: { fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' },\n orderTag: { color: 'rgba(128,128,128,.8)', fontSize: 11 },\n preview: { color: 'rgba(128,128,128,.85)', fontSize: 12, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },\n previewText: { fontFamily: 'monospace', fontSize: 12, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', maxHeight: 480, overflowY: 'auto', padding: 10, border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(0,0,0,.18)', margin: 0 },\n toolWrap: { display: 'flex', flexWrap: 'wrap', gap: 6 },\n toolChip: { fontFamily: 'monospace', fontSize: 12, color: 'rgba(128,128,128,.95)', border: '1px solid rgba(128,128,128,.3)', borderRadius: 6, padding: '2px 6px', cursor: 'help' },\n badgeOk: { color: '#3fb950', fontSize: 11, border: '1px solid rgba(63,185,80,.5)', borderRadius: 999, padding: '0 6px' },\n badgeBlocked: { color: '#f85149', fontSize: 11, border: '1px solid rgba(248,81,73,.5)', borderRadius: 999, padding: '0 6px' },\n badgeReplaced: { color: '#d29922', fontSize: 11, border: '1px solid rgba(210,153,34,.5)', borderRadius: 999, padding: '0 6px' },\n badgeCustom: { color: '#58a6ff', fontSize: 11, border: '1px solid rgba(88,166,255,.5)', borderRadius: 999, padding: '0 6px' },\n badgeSystem: { color: 'rgba(128,128,128,.85)', fontSize: 11, border: '1px solid rgba(128,128,128,.4)', borderRadius: 999, padding: '0 6px' },\n mini: { padding: '3px 8px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', whiteSpace: 'nowrap' },\n arrowCol: { display: 'flex', flexDirection: 'column', gap: 2 },\n arrow: { padding: '0 6px', border: '1px solid rgba(128,128,128,.3)', borderRadius: 4, background: 'transparent', cursor: 'pointer', color: 'inherit', fontSize: 11, lineHeight: 1.4, opacity: 0.8 },\n rowDragging: { opacity: 0.4 },\n rowDropAbove: { boxShadow: '0 -2px 0 0 #58a6ff' },\n rowDropBelow: { boxShadow: '0 2px 0 0 #58a6ff' },\n dragHandle: { cursor: 'grab', color: 'rgba(128,128,128,.7)', fontSize: 13, padding: '0 2px', userSelect: 'none' },\n injectBox: { marginTop: 10, padding: '8px', border: '1px dashed rgba(128,128,128,.4)', borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6 },\n injectRow: { ...flex, gap: 6 },\n editBox: { display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4 },\n editInput: { padding: '6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit', fontFamily: 'inherit', fontSize: 12, resize: 'vertical', width: '100%', boxSizing: 'border-box' },\n input: { padding: '4px 6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit' },\n // 原生下拉的弹出列表不吃继承色(浅色底 + 继承的浅色字会看不见):\n // 用系统色对(Canvas/CanvasText)跟随宿主 color-scheme,深浅主题下都可读。\n option: { backgroundColor: 'Canvas', color: 'CanvasText' },\n muted: { color: 'rgba(128,128,128,.75)', fontSize: 12 },\n error: { color: '#f85149', fontSize: 12, marginBottom: 6 },\n noticeOk: { color: '#3fb950', fontSize: 12, marginBottom: 6 },\n noticeWarn: { color: '#d29922', fontSize: 12, marginBottom: 6 },\n groupTitle: { display: 'flex', gap: 8, alignItems: 'baseline', marginTop: 8, marginBottom: 2, color: 'rgba(128,128,128,.9)', fontSize: 12 },\n saveBtn: { padding: '4px 12px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },\n saveBtnDirty: { padding: '4px 12px', border: '1px solid #d29922', borderRadius: 6, background: 'rgba(210,153,34,.15)', cursor: 'pointer', color: 'inherit' },\n }\n})()\n","/** 纯函数的预设 / 段操作助手,同时被客户端 UI 与 Node 测试复用(不触碰 IO 与 React)。 */\nimport type { Config, Inventory, OverrideData, Phase, PhaseViewKey, Preset, PresetData, ToolsConfig } from './types.ts'\n\nexport interface Section {\n name: string\n order: number\n text?: string\n active: boolean\n replaced: boolean\n /** `system` = 读自宿主提示词清单(不可删除);`custom` = 本插件注入(可删除)。 */\n source?: 'system' | 'custom'\n}\n\n/** 应用预设后需要回写到设置作用域的那部分配置字段。\n * 阶段名单为可选:旧快照不带 → 应用时保留当前值,绝不抹掉。 */\nexport interface ConfigPatch {\n sections: string[]\n sectionsBootstrap?: string[]\n sectionsCompaction?: string[]\n replace: Record<string, string>\n inject: ResolvedInject[]\n tools: ToolsConfig\n}\n\n/** 快照捕获的阶段 order 空间(always 之外的三个阶段)。 */\nconst CAPTURE_PHASES: Array<'bootstrap' | 'active' | 'compaction'> = ['bootstrap', 'active', 'compaction']\n\n/** 把一条有序名字转成相对链(每段记住它的前一段),text / custom 只给 custom 段。 */\nfunction toChain(names: string[], textOf: (name: string) => string, customOf: (name: string) => boolean, phase?: Phase): NonNullable<PresetData['order']> {\n return names.map((name, i) => ({\n name,\n after: i > 0 ? names[i - 1] : undefined,\n text: customOf(name) ? (textOf(name) ?? '') : '',\n custom: customOf(name),\n ...(phase !== undefined ? { phase } : {}),\n }))\n}\n\n/**\n * 从当前配置构建预设快照(完整捕获,含每阶段独立设定)。\n *\n * 全局相对链派生自合并后的完整段列表(而不仅是 `cfg.inject`),这样即使保存前\n * 只是屏蔽了几个段(没有重排),预设仍会携带完整的有序集合,应用时才能得到一个\n * 有意义的「激活列表」。在此之上,bootstrap / active / compaction 各再带一条自己\n * 的相对链 —— 数据源就是 UI 逐阶段持久化的注入条目(每阶段独立的 order 空间),\n * 否则阶段化的名单与排序在「导出 → 导入 → 应用」后就丢了。\n */\nexport function buildPresetData(cfg: Config, merged: Section[]): PresetData {\n const globalNames = merged.map((sec) => sec.name)\n const textOf = new Map(merged.map((sec) => [sec.name, sec.text ?? ''] as const))\n const customOf = new Map(merged.map((sec) => [sec.name, sec.source === 'custom'] as const))\n const order = toChain(globalNames, (n) => textOf.get(n) ?? '', (n) => customOf.get(n) === true)\n for (const phase of CAPTURE_PHASES) {\n const items = (cfg.inject ?? [])\n .filter((item) => item.phase === phase)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n if (items.length === 0) continue\n order.push(...toChain(\n items.map((item) => item.name),\n (n) => items.find((item) => item.name === n)?.text ?? '',\n (n) => items.find((item) => item.name === n)?.custom === true,\n phase,\n ))\n }\n const data: PresetData = {\n sections: cfg.sections,\n replace: cfg.replace,\n order,\n tools: cfg.tools,\n }\n // 非空才捕获:没有阶段名单的配置导出的快照与改动前逐键一致。\n if ((cfg.sectionsBootstrap ?? []).length > 0) data.sectionsBootstrap = cfg.sectionsBootstrap\n if ((cfg.sectionsCompaction ?? []).length > 0) data.sectionsCompaction = cfg.sectionsCompaction\n return data\n}\n\n/**\n * 把宿主清单段与用户注入列表按 order 合并、排序。\n * 读自清单(其他插件产出)的段标记为 `system`;本插件生成的段带隐藏的\n * `custom` 标记,标记为 `custom`。来源只由隐藏标记决定——绝不靠名字碰撞\n * 判断——因此即使自定义段恰好与某个清单段重名,它也能保住自己的身份\n * (以及可删除性),并在切换预设后依然成立。自定义段始终渲染自己的文本,\n * 永远不会显示为「<动态生成>」。\n */\nexport function mergeSections(inv: Inventory | null, cfg: Config, blockedNames: ReadonlySet<string>): Section[] {\n const map = new Map<string, Section>()\n for (const sec of inv?.sections ?? []) map.set(sec.name, { ...sec, source: 'system' })\n for (const item of cfg.inject ?? []) {\n const isCustom = item.custom === true\n const existing = map.get(item.name)\n if (existing) {\n map.set(item.name, isCustom\n ? { ...existing, order: item.order, text: item.text ?? '', source: 'custom' }\n : { ...existing, order: item.order, source: 'system' })\n } else {\n map.set(item.name, {\n name: item.name,\n order: item.order,\n text: item.text ?? '',\n active: !blockedNames.has(item.name),\n replaced: false,\n source: isCustom ? 'custom' : 'system',\n })\n }\n }\n return [...map.values()].sort((a, b) => a.order - b.order).map((sec, i) => ({ ...sec, order: i }))\n}\n\n/** ConfigPatch 里对外的注入条目(always 组刻意不带 phase 键)。 */\nexport interface ResolvedInject {\n name: string\n order: number\n text: string\n custom?: boolean\n phase?: Phase\n}\n\n/**\n * 把一条相对链解析为绝对有序名字(0..n-1)。\n * 没有锚点(或锚点不在本组内)的名字按原始顺序排在最前;每个带锚点的名字\n * 插到其锚点之后;剩余的名字(存在环)追加到末尾。\n */\nfunction resolveChain(list: Array<{ name: string; after?: string }>): string[] {\n const afterMap = new Map<string, string | undefined>()\n for (const sec of list) afterMap.set(sec.name, sec.after)\n\n const result: string[] = []\n const placed = new Set<string>()\n\n for (const sec of list) {\n const anchor = afterMap.get(sec.name)\n if (!anchor || !afterMap.has(anchor)) { result.push(sec.name); placed.add(sec.name) }\n }\n\n let changed = true\n while (changed) {\n changed = false\n for (const sec of list) {\n if (placed.has(sec.name)) continue\n const anchor = afterMap.get(sec.name)\n if (anchor && placed.has(anchor)) {\n result.splice(result.indexOf(anchor) + 1, 0, sec.name)\n placed.add(sec.name)\n changed = true\n }\n }\n }\n\n for (const sec of list) {\n if (!placed.has(sec.name)) { result.push(sec.name); placed.add(sec.name) }\n }\n return result\n}\n\n/**\n * 把快照里的相对顺序解析为注入条目列表。\n *\n * order 条目可以带 `phase`:同名而不同 phase 的多条 = 该段在多个阶段各有自己的\n * 位置(每阶段有独立的 order 空间,与 UI 的 phaseInjectEntries 一致)。无 phase\n * 的条目属于 always 组 —— 也就是旧快照的单一全局序,输出形状与旧实现逐键一致\n * (刻意不写 phase 键,「保存 → 应用 = 不动点」的不变量依赖键形状完全相同)。\n */\nexport function resolveOrder(presetOrder: PresetData['order']): ResolvedInject[] {\n const list = presetOrder ?? []\n const groups = new Map<Phase, NonNullable<PresetData['order']>>([['always', []]])\n for (const sec of list) {\n const phase = sec.phase ?? 'always'\n const group = groups.get(phase)\n if (group) group.push(sec)\n else groups.set(phase, [sec])\n }\n const out: ResolvedInject[] = []\n for (const [phase, members] of groups) {\n const textMap = new Map(members.map((x) => [x.name, x.text ?? '']))\n const customMap = new Map(members.map((x) => [x.name, x.custom === true]))\n const names = resolveChain(members)\n out.push(...names.map((name, i) => (phase === 'always'\n ? { name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name) }\n : { name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name), phase })))\n }\n return out\n}\n\n/**\n * 计算应用预设时的配置补丁:\n * - 同名段被覆盖(顺序列表在运行时驱动这一行为)\n * - 预设中有、当前提示词中没有的段被添加\n * - 当前有、但不在预设有序列表中的段默认被屏蔽\n * - 只有预设的「激活段」(在 order 列表且不在其屏蔽名单中)被解除屏蔽;\n * 预设自己屏蔽的段保持屏蔽。\n *\n * 当前配置里存在、但不在预设有序列表中的自定义注入段会被保留到结果的\n * inject 列表中(因此仍然可见)并置为禁用(加入屏蔽集合),而不是被静默\n * 丢弃——预设不能让用户自己注入的凭空消失。\n */\nexport function applyPresetData(data: PresetData, cfg: Config, currentNames: ReadonlySet<string>): ConfigPatch {\n const presetOrder = data.order ?? []\n const presetNames = new Set(presetOrder.map((x) => x.name))\n const blocked = new Set(data.sections ?? [])\n\n // 注入列表 = 预设解析出的顺序,再追加当前配置中存在、但预设列表没有的\n // 自定义注入段。让它们留在 `inject` 里才能保持可见;随后统一置为禁用。\n // 被保留的自定义段接在预设自身的下标之后;若预设只覆盖一小部分段,它们\n // 可能与清单原生 order 并列——合并视图按稳定排序(清单在前),顺序仍是\n // 确定性的,且下一次重排/持久化会把所有下标重新连续化。\n const inject = resolveOrder(presetOrder)\n const kept = new Set(inject.map((x) => x.name))\n let order = inject.length\n for (const item of cfg.inject ?? []) {\n if (!item || !item.name || presetNames.has(item.name) || kept.has(item.name)) continue\n kept.add(item.name)\n inject.push({ name: item.name, order: order++, text: item.text ?? '', custom: item.custom === true })\n }\n\n // 仅当预设确实定义了 order 列表时才强制执行「激活集合」。\n // 空的 order(例如手工编写 / 只屏蔽了几个段的导入预设)绝不能把当前所有\n // 段默认禁用。\n if (presetOrder.length > 0) {\n const activeNames = new Set([...presetNames].filter((n) => !blocked.has(n)))\n for (const name of currentNames) if (!presetNames.has(name)) blocked.add(name)\n for (const name of activeNames) blocked.delete(name)\n }\n\n // 阶段化字段一律「快照有则覆盖,缺省则保留当前值」:旧快照(没有这些键)\n // 应用后仍只换静态过滤,绝不把用户已有的阶段目录与阶段名单抹平。\n // 缺席时不留下显式 undefined 键 —— 「保存→应用 = 不动点」的不变量依赖键形状。\n const keptCatalogs: ToolsConfig = {}\n const bootstrap = data.tools?.bootstrap !== undefined ? data.tools.bootstrap : cfg.tools?.bootstrap\n const compaction = data.tools?.compaction !== undefined ? data.tools.compaction : cfg.tools?.compaction\n if (bootstrap !== undefined) keptCatalogs.bootstrap = bootstrap\n if (compaction !== undefined) keptCatalogs.compaction = compaction\n const patch: ConfigPatch = {\n sections: [...blocked],\n replace: { ...(cfg.replace ?? {}), ...(data.replace ?? {}) },\n inject,\n tools: {\n exclude: data.tools?.exclude ?? [],\n ...keptCatalogs,\n },\n }\n if (Array.isArray(data.sectionsBootstrap)) patch.sectionsBootstrap = data.sectionsBootstrap\n if (Array.isArray(data.sectionsCompaction)) patch.sectionsCompaction = data.sectionsCompaction\n return patch\n}\n\n/**\n * 从配置中移除一个 custom(本插件注入)段:它从 inject 列表消失,不再被\n * 强制加入屏蔽集合,相关的替换文本也被清除。剩余的 inject 条目会被重新\n * 编号为连续的 0..n-1(虚拟下标模型),删除不会留下空洞。读自宿主清单的\n * system 段无法这样移除(下次读取清单时它们又会回来)。\n */\nexport function removeSection(name: string, cfg: Config): Pick<Config, 'sections' | 'inject' | 'replace'> {\n const sections = (cfg.sections ?? []).filter((n) => n !== name)\n const inject = (cfg.inject ?? [])\n .filter((item) => item.name !== name)\n .map((item, i) => ({ ...item, order: i }))\n const replace = { ...(cfg.replace ?? {}) }\n delete replace[name]\n return { sections, inject, replace }\n}\n\n// ── 工具过滤 ─────────────────────────────────────────────────────────────\n\nexport type ToolsCfg = { exclude?: string[] }\n\n/** 三个阶段部分的固定展示顺序:引导期 → 常驻期 → 压缩受控期。\n * 恒定全部渲染 —— 预设没有某个阶段时该部分只是空的,绝不隐藏。 */\nexport const PART_ORDER: PhaseViewKey[] = ['bootstrap', 'active', 'compaction']\n\n/**\n * 一个阶段部分写回哪一份过滤配置:引导期 → `tools.bootstrap`、压缩受控期 →\n * `tools.compaction`、常驻期 → 静态 `tools.exclude`。三份名单互不继承。\n */\nexport function phaseConfigKey(key: PhaseViewKey): 'bootstrap' | 'compaction' | 'static' {\n return key === 'active' ? 'static' : key\n}\n\n/**\n * 把一个阶段的 exclude 名单写回整份工具配置,返回新对象(其余阶段原样保留)。\n * 一次拖放可能要同时改两个阶段的名单(搬移 = 源阶段隐藏 + 目标阶段显示),必须\n * 在同一个对象上连续套完再落一次写入 —— 分两次写会各自基于旧 cfg 计算而互相覆盖。\n */\nexport function withPhaseExclude(tools: ToolsConfig | undefined, key: PhaseViewKey, exclude: string[]): ToolsConfig {\n const base = tools ?? {}\n const target = phaseConfigKey(key)\n if (target === 'bootstrap') return { ...base, bootstrap: { ...(base.bootstrap ?? {}), exclude } }\n if (target === 'compaction') return { ...base, compaction: { ...(base.compaction ?? {}), exclude } }\n return { ...base, exclude }\n}\n\n/**\n * 把一个阶段的 add 名单(要加回该阶段的工具)写回整份工具配置,返回新对象。\n * 与 withPhaseExclude 对称:常驻期写静态 `tools.add`,引导期写 `tools.bootstrap.add`,\n * 压缩受控期写 `tools.compaction.add`,其余阶段原样保留。\n */\nexport function withPhaseAdd(tools: ToolsConfig | undefined, key: PhaseViewKey, add: string[]): ToolsConfig {\n const base = tools ?? {}\n const target = phaseConfigKey(key)\n if (target === 'bootstrap') return { ...base, bootstrap: { ...(base.bootstrap ?? {}), add } }\n if (target === 'compaction') return { ...base, compaction: { ...(base.compaction ?? {}), add } }\n return { ...base, add }\n}\n\n/** 某个工具在当前黑名单配置下是否被隐藏。 */\nexport function isToolHidden(name: string, toolsCfg: ToolsCfg | undefined): boolean {\n return (toolsCfg?.exclude ?? []).includes(name)\n}\n\n/** 切换某个工具的隐藏状态,返回新的工具配置(不改原对象)。 */\nexport function toggleTool(name: string, currentlyHidden: boolean, toolsCfg: ToolsCfg | undefined): ToolsCfg {\n const exclude = (toolsCfg?.exclude ?? []).slice()\n if (currentlyHidden) { const i = exclude.indexOf(name); if (i >= 0) exclude.splice(i, 1) }\n else if (!exclude.includes(name)) exclude.push(name)\n return { exclude }\n}\n\n// ── 按 agent 预设的覆盖编辑 ─────────────────────────────────────────────\n\n/**\n * 编辑目标的「显示视图」:全局目标返回原配置;agent 预设目标把该预设\n * override 的字段叠在全局值之上展示(空缺字段显示全局继承值)。`presets`\n * 与 `activePreset` 永远来自全局 —— 预设快照库本身不分作用域。\n */\nexport function editView(cfg: Config, target: string | undefined): Config {\n if (!target) return cfg\n const ovr = cfg.overrides?.[target] ?? {}\n return {\n sections: ovr.sections ?? cfg.sections,\n sectionsBootstrap: ovr.sectionsBootstrap ?? cfg.sectionsBootstrap,\n sectionsCompaction: ovr.sectionsCompaction ?? cfg.sectionsCompaction,\n replace: ovr.replace ?? cfg.replace,\n inject: ovr.inject ?? cfg.inject,\n tools: {\n exclude: ovr.tools?.exclude ?? cfg.tools?.exclude,\n add: ovr.tools?.add ?? cfg.tools?.add,\n bootstrap: ovr.tools?.bootstrap ?? cfg.tools?.bootstrap,\n compaction: ovr.tools?.compaction ?? cfg.tools?.compaction,\n },\n presets: cfg.presets,\n activePreset: cfg.activePreset,\n }\n}\n\n/**\n * 往某个 agent 预设的 override 里写入一个字段,返回新的 overrides 记录\n * (不改原对象)。与 editView 配对:编辑视图里看到的继承值一旦被修改,\n * 就整体落成该预设自己的字段(字段级接管语义)。\n */\nexport function setOverrideField(\n cfg: Config,\n target: string,\n field: 'sections' | 'replace' | 'inject' | 'tools',\n value: unknown,\n): Record<string, OverrideData> {\n return {\n ...(cfg.overrides ?? {}),\n [target]: { ...(cfg.overrides?.[target] ?? {}), [field]: value },\n }\n}\n\n// ── 预设列表操作 ──────────────────────────────────────────────────────────\n\n/** 序列化预设用于导出(JSON 安全的完整快照)。 */\nexport function serializePreset(preset: Preset): { name: string; data: PresetData } {\n return { name: preset.name, data: preset.data }\n}\n\n/**\n * Derive a safe default filename for a preset export. User-entered preset\n * names may contain characters that are illegal in filenames (`/\\:*?\"<>|`,\n * control chars) — those are replaced; a trailing dot/space is trimmed\n * (invalid on Windows); an empty or all-illegal result falls back to\n * `preset`.\n */\nexport function presetExportFilename(name: string): string {\n const sanitized = String(name)\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]/g, '_')\n .trim()\n .replace(/[. ]+$/, '')\n const base = sanitized === '' ? 'preset' : sanitized\n return `${base}.json`\n}\n\n/**\n * 导入预设:同名的会被跳过,只追加名字不同的预设。返回新的预设列表\n * (若没有任何变更则返回原列表)。\n */\nexport function addImportedPresets(existing: Preset[], parsed: unknown, makeId: () => string): Preset[] {\n const incoming = Array.isArray(parsed) ? parsed : [parsed]\n const existingNames = new Set(existing.map((p) => p.name))\n const added = incoming\n .filter((p) => p && typeof (p as { name?: unknown }).name === 'string' && !existingNames.has((p as Preset).name))\n .map((p) => ({ id: makeId(), name: (p as Preset).name, data: ((p as Preset).data ?? {}) as PresetData }))\n return added.length > 0 ? [...existing, ...added] : existing\n}\n\n/** 删除某个预设;若它正是当前激活的预设,则同时清除 activeId。 */\nexport function removePreset(presets: Preset[], id: string, activeId?: string): { presets: Preset[]; activeId?: string } {\n return {\n presets: presets.filter((p) => p.id !== id),\n activeId: activeId === id ? undefined : activeId,\n }\n}\n\n/** 生成预设 id:时间戳 + 随机段(base36),够用且无需额外依赖。 */\nexport function genId(): string {\n return 'p_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 7)\n}\n","/**\n * 提示词段面板的纯状态逻辑(无 React / 无 IO)。\n * 与 src/client/SectionsTab.tsx 共享同一份实现(浏览器里随 client bundle\n * 打包;node --test 直接 import 本文件跑单测),保证「测试即上线代码」。\n *\n * 阶段模型:引导期(bootstrap)/ 常驻期(active)/ 压缩受控期(compaction)\n * 恒定全部显示(预设没有某个阶段时该部分就是空的),各自拥有独立的注入\n * 名单与 order 空间;屏蔽按「每阶段独立名单」写回(引导期 →\n * sectionsBootstrap,压缩受控期 → sectionsCompaction,常驻期 → 全局 sections)。\n * 入参统一是名义阶段键,不再有「同形折叠组」这种把引导期当常驻期用的形态。\n */\n\n/** 名义阶段键 → 屏蔽名单写回目标(常驻期用全局 sections)。 */\nexport function sectionListOf(key) {\n return key === 'bootstrap' ? 'bootstrap' : key === 'compaction' ? 'compaction' : 'global'\n}\n\n/** 名义阶段键 → 注入阶段:压缩受控期是独立注入阶段(compaction)。 */\nexport function injectPhaseOf(key) {\n return key === 'bootstrap' ? 'bootstrap' : key === 'active' ? 'active' : 'compaction'\n}\n\n/** 某注入段出现在哪些阶段部分:always 全阶段;bootstrap/compaction/active\n * 仅各自对应的阶段(与服务端 filterInjectByPhase 的三态互相独立一致)。 */\nexport function acceptsInjectFor(key, phase) {\n if (phase === 'always') return true\n return phase === key\n}\n\n/** 该阶段生效的屏蔽名单(全局 + 阶段独立 的 union)。 */\nexport function deniedNames(cfg, key) {\n const list = sectionListOf(key)\n const phase = list === 'bootstrap' ? (cfg.sectionsBootstrap ?? []) : list === 'compaction' ? (cfg.sectionsCompaction ?? []) : []\n return [...(cfg.sections ?? []), ...phase]\n}\n\n/**\n * 某个阶段部分当前的注入身份(含未保存草稿)。\n *\n * `names` = 本部分可见的注入段名(本阶段专属 + 跨阶段的 always)。post 视图来自\n * 「上次保存」的服务端结果,删除只改草稿,所以 post 独有段必须有 names 背书才\n * 能显示 —— 否则刚删掉的自定义段会以「系统段」复活(身份只认 custom 标记,条目\n * 没了就被判成系统),再经一次重排就被写成 custom:false 空文本,用户填的内容被\n * 抹平。`custom` 只收真正的自定义段,`order` 只收本阶段的草稿序。\n *\n * `text` = 本阶段生效的用户文本:自定义段自带的文本,以及**系统段在本阶段被\n * 替换后的文本**(非空即替换)。系统段的文本必须按阶段存 —— 注入条目本来就带\n * `phase`,服务端按阶段筛选,所以三个阶段各改各的文本互不影响;旧的全局\n * `replace` 字典一份文本对三个阶段同时生效,已不承担界面编辑。\n */\nexport function injectedAt(cfg, key) {\n const phase = injectPhaseOf(key)\n const names = new Set()\n const custom = new Set()\n const text = new Map()\n const order = new Map()\n for (const item of cfg.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n const itemPhase = item.phase ?? 'always'\n if (itemPhase === phase) order.set(item.name, item.order ?? 0)\n if (!acceptsInjectFor(key, itemPhase)) continue\n names.add(item.name)\n if (item.text && !text.has(item.name)) text.set(item.name, item.text)\n if (item.custom === true) custom.add(item.name)\n }\n return { phase, names, custom, text, order }\n}\n\n/**\n * 屏蔽/恢复一个段(当前阶段语义):返回需要写盘的字段补丁。\n * - 屏蔽:该阶段名单加入(常驻期直接加入全局 sections)。\n * - 恢复:从该阶段名单与全局名单同时移除(union 语义 —— 否则仍会被另一\n * 份名单挡住,恢复不生效)。\n * 名单无变化时不产出字段(空补丁 = 不写盘),避免把继承值冻结成无意义的\n * 空数组覆盖。\n */\nexport function blockPatch(cfg, key, name, blocked) {\n const list = sectionListOf(key)\n const g = (cfg.sections ?? []).slice()\n const gi = g.indexOf(name)\n const patch = {}\n if (list === 'global') {\n if (blocked) { if (gi < 0) { g.push(name); patch.sections = g } }\n else if (gi >= 0) { g.splice(gi, 1); patch.sections = g }\n return patch\n }\n const field = list === 'bootstrap' ? 'sectionsBootstrap' : 'sectionsCompaction'\n const phase = (cfg[field] ?? []).slice()\n const pi = phase.indexOf(name)\n if (blocked) {\n if (pi < 0) { phase.push(name); patch[field] = phase }\n } else {\n if (pi >= 0) { phase.splice(pi, 1); patch[field] = phase }\n if (gi >= 0) { g.splice(gi, 1); patch.sections = g }\n }\n return patch\n}\n\n/**\n * 重排/插入一个阶段的有序行列表:把 dragName 从列表中移除后,插入到\n * targetName 行之上(pos='above')或之下(pos='below');返回新列表。\n * 拖入的新段由调用方以 newRow 提供,插入后保留在列表中(其余行保持原样)。\n */\nexport function reorderInsert(rows, dragName, targetName, pos, newRow = null) {\n const base = rows.filter((row) => row.name !== dragName)\n const idx = base.findIndex((row) => row.name === targetName)\n if (idx < 0) return null\n const insertAt = Math.max(0, Math.min(pos === 'above' ? idx : idx + 1, base.length))\n const entry = newRow ?? rows.find((row) => row.name === dragName)\n if (!entry) return null\n base.splice(insertAt, 0, entry)\n return base\n}\n\n/**\n * 持久化一个阶段的有序列表(v1 persistOrder 的逐阶段版):把 rows(有序行)\n * 写成该阶段的注入条目,order = 连续整数(0,1,2,…)——「虚拟 order 决定注入\n * 顺序」;文本优先级 = 本阶段的用户替换文本(row.override)→ 自定义段自带的\n * 文本(row.text)→ 空文本(= 仅 order 覆盖,服务端保留原文)。三者缺一不可:\n * 重排走的就是这个函数,漏掉 override 会让一次拖动把用户在该阶段改的文本抹平。\n * 其它阶段(含 always)的注入条目原样保留。\n */\nexport function phaseInjectEntries(cfg, key, rows) {\n const phase = injectPhaseOf(key)\n const others = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') !== phase)\n const entries = rows.map((row, i) => ({\n name: row.name,\n order: i,\n text: row.override || (row.custom ? (row.text ?? '') : ''),\n phase,\n custom: row.custom,\n }))\n return [...others, ...entries]\n}","/** 提示词段 Tab:四个部分 —— 引导期 / 常驻期 / 压缩受控期(三个阶段恒定\n * 显示,预设没有某个阶段时该部分只是空的)+ 本系统全部提示词(只读池)。\n *\n * 交互对齐提示词段初版(v1),并修复三类反馈缺失:\n * - 上三段每行 = 真实进入该阶段装配的段(post 视图,与预览一致 —— 预设\n * 原生阶段插件裁剪掉的段不显示)∪ 被屏蔽的段 ∪ 配置里的自定义注入段,\n * 顺序以 base 骨架为底再叠加草稿序;整行可拖拽,拖到某行上方/下方出现\n * 插入指示线,松手即在该位置重排。\n * - 被屏蔽的段与普通段一模一样:留在列表原位、一样可操作(拖拽/箭头/替换/\n * 恢复/删除),随时可互相转换,唯一区别是屏蔽勾选框与「已屏蔽」徽标 ——\n * 屏蔽只意味着不注入模型,不剥夺任何编辑能力(v1 语义)。屏蔽勾选直接\n * 绑定当前生效名单(deniedNames = 全局 + 该阶段名单,含未保存草稿),\n * 点击立即反馈。\n * - 重排(拖入/箭头)走 `persistPhase`:把该阶段全部行重写为连续整数\n * 虚拟 order(系统段写空文本 = 仅 order 覆盖,服务端保留原文;custom 段\n * 保留文本)—— UI 行序叠加同一份 order 立即重排,拖动即时可见。\n * - 文本编辑(「编辑」/「还原」)同样按阶段生效:写的就是本阶段注入条目的\n * 文本,三个阶段各改各的、互不影响(服务端让本阶段注入文本优先于全局\n * replace,否则一份文本会同时改坏三个阶段)。全局 replace 字典自此不再由\n * 界面写入,只在「还原」时顺带清除遗留条目 —— 新界面没有别的出口能恢复它。\n * - 拖放搬移保留行对象(system/custom 身份与文本原样带走),绝不重建行 ——\n * 重建会把系统段误标成 custom 并清空内容。只有从其它部分/全部池拖入的\n * 新段才构造新行(身份取自拖拽源)。\n * - 拖放事件在行上处理并 stopPropagation,避免与阶段框二次处理对冲。\n * - 全部提示词 → 上三段:插入该段到目标位置(已存在则只是移动排序;该段\n * 在目标阶段被屏蔽则同步解除屏蔽 —— 行立即出现)。上三段 → 全部:从该\n * 阶段移除 —— custom 段删除注入条目;系统段等价于屏蔽该阶段(系统段是\n * 装配的一部分,无法真正删除)。\n * - 解除屏蔽按份额归属分流写入:继承自全局名单的屏蔽直接改全局名单(立即\n * 写盘通道)—— override 无法表达「比全局更宽松」(空名单回落全局,解除\n * 会在保存后复现);override 自报名单与阶段名单的份额走目标草稿。\n * - 每个阶段部分按自己那一阶段的装配结果给出警示:该 scope 有 complete 段\n * 整段接管最终提示词,或本插件产出的段被下游装配规则丢弃时,明确写出\n * 「段级定制不会(完全)进入模型看到的提示词」,避免提示词 Tab 与预览 Tab\n * 各说各话。\n *\n * 全部阶段状态逻辑来自 lib/sectionOps.mjs(纯函数,node --test 单测直接\n * 覆盖同一份代码)。\n */\nimport { createElement as h, useRef, useState, type CSSProperties, type ReactElement, type DragEvent, type ChangeEvent } from 'react'\nimport type { Config, Inventory, Phase, PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER } from './presets.ts'\nimport { injectPhaseOf, injectedAt, deniedNames, blockPatch, reorderInsert, phaseInjectEntries } from '../../lib/sectionOps.mjs'\nimport { s } from './styles.ts'\n\n/** Panel 并行拉取的三阶段装配(与 PreviewTab 同一形状)。 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** 屏幕上一条可交互的段行。 */\ninterface PartRow {\n name: string\n text: string\n replaced: boolean\n custom: boolean\n /** 本阶段的用户替换文本(空串 = 本阶段没改过文本)—— 三个阶段各一份,互不影响。 */\n override: string\n /** 该阶段生效名单(全局 + 阶段独立)是否屏蔽了此段:仅影响展示,不剥夺操作。 */\n blocked: boolean\n}\n\n/** 拖拽来源:全部池,或某个阶段部分(copy 语义,携带源的身份与文本)。 */\ninterface DragSource {\n kind: 'all' | 'part'\n key?: PhaseViewKey\n text: string\n custom: boolean\n}\n\n/** 编辑态的键:段名之外还要带阶段,否则三个部分里同名的行会同时展开编辑器。 */\nconst editKey = (key: PhaseViewKey, name: string): string => `${key}:${name}`\n\nexport function SectionsTab({ cfg, inv, phases, target, globalSections, ownedSections, t, write, writeGlobalField }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** 编辑目标:undefined = 全局默认;字符串 = agent 预设 id(字段级覆盖)。 */\n target: string | undefined\n /** 原始全局段屏蔽名单(未叠加 override / 草稿)——解除屏蔽时判定份额归属。 */\n globalSections: string[] | undefined\n /** 目标 override 自己的段屏蔽名单(未叠加草稿);undefined = 该 override 没有名单。 */\n ownedSections: string[] | undefined\n t: Translate\n write: (field: 'sections' | 'sectionsBootstrap' | 'sectionsCompaction' | 'replace' | 'inject' | 'tools', value: unknown) => void\n /** 全局字段的立即写入通道(不经目标草稿):解除继承自全局的屏蔽时使用。 */\n writeGlobalField: (field: 'sections', value: unknown) => void\n}): ReactElement {\n const [editing, setEditing] = useState<string | null>(null)\n const [draft, setDraft] = useState('')\n const [dragName, setDragName] = useState<string | null>(null)\n const [dragSource, setDragSource] = useState<DragSource | null>(null)\n const [dropTarget, setDropTarget] = useState<{ part: PhaseViewKey; name: string; pos: 'above' | 'below' } | null>(null)\n // 面板内短提示(例如:动态段加不进某个阶段时说明原因)。\n const [notice, setNotice] = useState<string | null>(null)\n\n // ── 拖拽边缘自动滚动 ────────────────────────────────────────────────────\n // 列表远超视口时,浏览器的内建 DnD autoscroll 在宿主滚动容器上不可靠,\n // 视口外的行无法成为放置目标(无法把最上方段拖到最下方)。dragover 冒泡\n // 到根容器记录指针位置并启动 rAF 循环:指针接近视口上/下边缘时逐级向上\n // 找最近的可滚动祖先持续滚动;drop/dragend 停止。\n const scrollRef = useRef<{ raf: number; clientY: number }>({ raf: 0, clientY: 0 })\n const stopAutoScroll = (): void => {\n if (scrollRef.current.raf !== 0) { cancelAnimationFrame(scrollRef.current.raf); scrollRef.current.raf = 0 }\n }\n const autoScrollTick = (): void => {\n scrollRef.current.raf = 0\n const edge = 48\n const y = scrollRef.current.clientY\n const inner = window.innerHeight\n let node = rootRef.current?.parentElement\n while (node !== null && node !== undefined) {\n if (node.scrollHeight > node.clientHeight) {\n if (y < edge) node.scrollTop -= Math.max(6, (edge - y) / 2)\n else if (y > inner - edge) node.scrollTop += Math.max(6, (y - (inner - edge)) / 2)\n else return\n scrollRef.current.raf = requestAnimationFrame(autoScrollTick)\n return\n }\n node = node.parentElement\n }\n // 无可滚动祖先(整页滚动):滚 window 本身。\n if (y < edge) window.scrollBy({ top: -Math.max(6, (edge - y) / 2) })\n else if (y > inner - edge) window.scrollBy({ top: Math.max(6, (y - (inner - edge)) / 2) })\n if (y < edge || y > inner - edge) scrollRef.current.raf = requestAnimationFrame(autoScrollTick)\n }\n const rootRef = useRef<HTMLDivElement | null>(null)\n // 只记录指针位置并启动循环;不 preventDefault —— 行/部分自身已处理放置\n // 语义,空白区域维持「不可放置」的原生表现。\n const rootDragOver = (e: DragEvent): void => {\n if (!dragName) return\n scrollRef.current.clientY = e.clientY\n if (scrollRef.current.raf === 0) scrollRef.current.raf = requestAnimationFrame(autoScrollTick)\n }\n\n // 三个阶段部分:恒定全部显示(预设没有某个阶段时该部分只是空的)。\n const parts: PhaseViewKey[] = PART_ORDER\n // 逐阶段的「段级定制没进最终提示词」警示:每个部分按自己那一阶段的装配结果\n // 判定 —— 有 complete 段整段接管就说接管,否则探测本插件产出的段是否被下游\n // 丢弃(丢弃规则不止 persona complete 一种)。\n const partNote = (key: PhaseViewKey): ReactElement | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n if (view.takenOverBy !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsTakenOver', { name: view.takenOverBy }))\n }\n const lost = view.lostSections\n if (lost !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsLost', { emitted: lost.emitted, survived: lost.survived }))\n }\n return null\n }\n\n // 一个阶段部分的全部行:行集合 = 「真实进入该阶段装配的段」(post 视图,\n // 与预览同源 —— 预设原生阶段插件裁剪掉的段不出现在这里)∪「被屏蔽的段」\n //(屏蔽名单含未保存草稿,随时可反选)∪「配置里属于该阶段的自定义注入段」。\n // 顺序以 base(预过滤)视图的骨架为底,再叠加「该阶段的注入 order」草稿序\n // —— 未保存的重排立即反映到界面。文本 post 优先(替换 / 注入结果),回退\n // base 原文与注入文本。身份只认注入条目的 custom 隐藏标记,绝不互相转换。\n const rowsOf = (key: PhaseViewKey): PartRow[] => {\n const replace = cfg.replace ?? {}\n const view = phases?.[key]\n const denied = new Set(deniedNames(cfg, key))\n const postByName = new Map((view?.sections ?? []).map((sec) => [sec.name, sec] as const))\n const baseByName = new Map((view?.baseSections ?? []).map((sec) => [sec.name, sec] as const))\n // 本部分的注入身份(含未保存草稿):phase = 本阶段注入阶段,names = 本部分\n // 可见的注入段名,custom = 自定义段身份,text = 本阶段生效的用户文本,\n // order = 本阶段草稿序。\n const { phase, names: injectedHere, custom: customNames, text, order: phaseOrder } = injectedAt(cfg, key)\n const names: string[] = []\n const seen = new Set<string>()\n const push = (name: string): void => { if (!seen.has(name)) { seen.add(name); names.push(name) } }\n // base 骨架顺序里取 post 段与被屏蔽段(保持自然位置)。被屏蔽取并集:\n // 当前草稿名单(切换立即反馈)∪ 上次保存的名单(base 的 blocked 标记 ——\n // 刚解除屏蔽的行不会立即消失,仍可再勾回去)。\n for (const sec of view?.baseSections ?? []) {\n if (postByName.has(sec.name) || denied.has(sec.name) || sec.blocked === true) push(sec.name)\n }\n // post 独有段 = 本插件注入进去的段(post 恒为 base 减去屏蔽再加上注入),\n // 追加在尾部。但它来自「上次保存」的服务端结果,删除只改草稿,所以必须\n // 有当前 inject 条目背书 —— 否则刚删掉的自定义段会以「系统段」复活(身份\n // 只认 inject 的 custom 标记,条目没了就被判成系统),再经一次重排就被写成\n // custom:false 空文本,用户填的内容被抹平。\n for (const name of postByName.keys()) {\n if (baseByName.has(name) || injectedHere.has(name)) push(name)\n }\n // 精确属于该阶段的注入条目:自定义段始终显示;系统段在装配输入里见过\n //(base/post)**或**带着用户为该阶段填的文本(= 从全部池显式加进来的)才\n // 显示 —— 既让拖入立即出现,又不让历史遗留的陈旧条目把装配里根本没有的段带回来。\n for (const item of cfg.inject ?? []) {\n if ((item.phase ?? 'always') !== phase) continue\n if (item.custom === true || text.get(item.name) || baseByName.has(item.name) || postByName.has(item.name)) push(item.name)\n }\n // 跨阶段生效的自定义段(如 always)。\n for (const name of customNames) push(name)\n const rows = names.map((name) => {\n // 本阶段的用户替换文本:只认属于本阶段的注入条目(injectedAt 已按阶段筛)。\n const override = text.get(name) ?? ''\n return {\n name,\n text: postByName.get(name)?.text ?? baseByName.get(name)?.text ?? '',\n replaced: override !== '' || Object.hasOwn(replace, name),\n custom: customNames.has(name),\n override,\n blocked: denied.has(name),\n }\n })\n // 草稿序叠加:该阶段有注入 order 就按它重排当前行(未保存的拖动/箭头\n // 立即生效);无 order 的行走 base 骨架相对序(稳定排序)。\n if (phaseOrder.size > 0) {\n const fallback = new Map(rows.map((row, i) => [row.name, i] as const))\n rows.sort((a, b) => (phaseOrder.get(a.name) ?? fallback.get(a.name) ?? 0) - (phaseOrder.get(b.name) ?? fallback.get(b.name) ?? 0))\n }\n return rows\n }\n\n // 屏蔽 / 恢复一个段。屏蔽永远走当前目标的草稿(override 可以表达「比全局\n // 更严格」)。解除屏蔽按屏蔽份额的归属分流:阶段名单与 override 自报名单\n // 走草稿;继承自全局的屏蔽必须直接改全局名单 —— override 表达不了「比全局\n // 更宽松」(空名单回落全局,解除会在保存后失效并复现)。\n const applyBlock = (key: PhaseViewKey, name: string, blocked: boolean): void => {\n if (blocked || !target) {\n const patch = blockPatch(cfg, key, name, blocked)\n for (const [field, value] of Object.entries(patch)) {\n // 名单未变化时不写,避免把继承值冻结进 override。\n if (JSON.stringify(value) === JSON.stringify((cfg as Record<string, unknown>)[field] ?? [])) continue\n write(field as 'sections' | 'sectionsBootstrap' | 'sectionsCompaction', value)\n }\n return\n }\n const patch = blockPatch(cfg, key, name, false)\n const effectiveOwned = ownedSections && ownedSections.length > 0 ? ownedSections : undefined\n for (const [field, value] of Object.entries(patch)) {\n if (field === 'sections') {\n // 全局份额:override 未接管名单(或解除后会把名单清空)时,全局名单\n // 里的该段必须从全局移除,否则空名单回落全局后屏蔽复现。\n if ((globalSections ?? []).includes(name) && (!effectiveOwned || ownedSections!.includes(name))) {\n writeGlobalField('sections', (globalSections ?? []).filter((n) => n !== name))\n }\n // override 自报名单里的份额:走草稿。\n if (effectiveOwned?.includes(name)) write('sections', value)\n continue\n }\n if (JSON.stringify(value) === JSON.stringify((cfg as Record<string, unknown>)[field] ?? [])) continue\n write(field as 'sectionsBootstrap' | 'sectionsCompaction', value)\n }\n }\n const toggleBlocked = (key: PhaseViewKey, name: string): void =>\n applyBlock(key, name, !deniedNames(cfg, key).includes(name))\n\n // 该阶段中某名字是否在该阶段的装配输入里(判断拖入是「解除屏蔽」还是\n // 「凭空注入」)。\n const inBaseOf = (key: PhaseViewKey, name: string): boolean =>\n (phases?.[key]?.baseSections ?? []).some((sec) => sec.name === name)\n\n // 持久化一个阶段的有序列表(写回 inject):该阶段每行一条注入项、order 为\n // 连续整数;系统行空文本(仅 order 覆盖),custom 行保留文本;其它阶段\n //(含 always)的注入项原样保留。被屏蔽的行同样写入(服务端对被屏蔽段\n // 跳过注入,order 留作解除屏蔽后立即生效)。\n const persistPhase = (key: PhaseViewKey, rows: PartRow[]): void => {\n write('inject', phaseInjectEntries(cfg, key, rows))\n }\n\n // 上移/下移一格(数组交换后重排整个阶段)。\n const moveRow = (key: PhaseViewKey, index: number, dir: -1 | 1): void => {\n const rows = rowsOf(key)\n const target = index + dir\n if (target < 0 || target >= rows.length) return\n const next = rows.slice()\n const [item] = next.splice(index, 1)\n next.splice(target, 0, item)\n persistPhase(key, next)\n }\n\n // 从该阶段移除一个段:删掉它在本阶段的注入条目,以及跨阶段生效(always)的\n // 条目 —— 预设应用 / 导入产生的自定义段就是 always,它在三个阶段都显示,\n // 只按当前阶段过滤的话永远删不掉。随后解除该阶段屏蔽,行才真正消失。\n const removeFromPart = (key: PhaseViewKey, name: string): void => {\n const phase = injectPhaseOf(key)\n const inject = (cfg.inject ?? []).filter((x) => {\n if (x.name !== name) return true\n const itemPhase = x.phase ?? 'always'\n return !(itemPhase === phase || itemPhase === 'always')\n })\n write('inject', inject)\n applyBlock(key, name, false)\n }\n\n // 文本编辑按阶段生效:编辑态的键是「阶段 + 段名」,三个阶段部分里同名的行\n // 各自独立展开。写入走 persistPhase(本阶段的注入条目带 text),绝不碰全局\n // replace 字典 —— 那一份文本对三个阶段同时生效,正是「改一个阶段、三个阶段\n // 都变」的根源。\n const startReplace = (key: PhaseViewKey, row: PartRow): void => {\n // 回显当前生效文本:本阶段替换过的从替换值开始,否则从原始文本开始(v1 语义)。\n setEditing(editKey(key, row.name))\n setDraft(row.override || row.text)\n }\n const commitReplace = (key: PhaseViewKey, row: PartRow): void => {\n const next = rowsOf(key).map((r) => (r.name !== row.name ? r : { ...r, override: draft, text: draft }))\n persistPhase(key, next)\n setEditing(null)\n }\n const restoreReplace = (key: PhaseViewKey, row: PartRow): void => {\n const next = rowsOf(key).map((r) =>\n r.name !== row.name ? r : { ...r, override: '', text: r.custom ? r.text : '' },\n )\n persistPhase(key, next)\n // 遗留的全局替换条目(旧版 UI 的产物,新界面再也不写它):只在本部分还原\n // 时一并清除,否则这份跨阶段文本再也没有恢复原文的入口。\n if (!row.custom && Object.hasOwn(cfg.replace ?? {}, row.name)) {\n const rest = { ...(cfg.replace ?? {}) }\n delete rest[row.name]\n write('replace', rest)\n }\n }\n\n const addSection = (name: string, text: string, phase: Phase): void => {\n const inject = (cfg.inject ?? []).slice()\n inject.push({ name, order: 120 + inject.length, text, phase, custom: true })\n write('inject', inject)\n }\n\n // ── 拖拽(v1 语义:整行拖拽 + 上/下插入指示) ─────────────────────────────\n const startDrag = (e: DragEvent, name: string, source: DragSource): void => {\n setDragName(name)\n setDragSource(source)\n e.dataTransfer.effectAllowed = 'move'\n try { e.dataTransfer.setData('text/plain', name) } catch { /* ignore */ }\n }\n const rowDragOver = (e: DragEvent, key: PhaseViewKey, name: string): void => {\n if (!dragName || dragName === name) return\n e.preventDefault()\n e.dataTransfer.dropEffect = 'move'\n const rect = e.currentTarget.getBoundingClientRect()\n const pos = e.clientY < rect.top + rect.height / 2 ? 'above' : 'below'\n setDropTarget({ part: key, name, pos })\n }\n // 从「全部」池把一个该阶段原本没有的系统段加进来:带上它的原文作为本阶段\n // 文本 —— 注入条目带文本,服务端才会把它真正建出来(幽灵防线只放行带文本的\n // 条目)。该阶段已有的段不在此列(只是排序/解除屏蔽)。动态段没有可带的\n // 原文,加不了,返回 blocked 让调用方提示。\n const carryFor = (key: PhaseViewKey, source: DragSource, name: string): { text: string; blocked: boolean } => {\n if (source.kind !== 'all' || source.custom) return { text: '', blocked: false }\n if (inBaseOf(key, name)) return { text: '', blocked: false }\n if (source.text === '') return { text: '', blocked: true }\n return { text: source.text, blocked: false }\n }\n // 拖入/重排:把 dragName 插入到目标行上/下方(已存在则移动位置)。\n // 目标部分里已有的行整体搬移(身份与文本原样保留,绝不重建 —— 重建会把\n // 系统段误标成 custom 并清空内容);只有真正新拖入的段才构造新行。\n const insertInto = (key: PhaseViewKey, targetName: string, pos: 'above' | 'below'): void => {\n if (!dragName || !dragSource) return\n const carry = carryFor(key, dragSource, dragName)\n if (carry.blocked) { setNotice(t('sectionDynamicNoAdd', { name: dragName })); return }\n const rows = rowsOf(key)\n const existing = rows.find((row) => row.name === dragName)\n const newRow: PartRow = existing ?? {\n name: dragName,\n text: dragSource.custom ? dragSource.text : '',\n replaced: Object.hasOwn(cfg.replace ?? {}, dragName),\n custom: dragSource.custom,\n override: carry.text,\n blocked: false,\n }\n const next = reorderInsert(rows, dragName, targetName, pos, newRow)\n if (next === null) return\n // 从全部池拖入一个被本阶段屏蔽的系统段:解除该阶段屏蔽,否则装配仍会过滤。\n if (dragSource.kind === 'all' && inBaseOf(key, dragName) && deniedNames(cfg, key).includes(dragName)) {\n applyBlock(key, dragName, false)\n }\n persistPhase(key, next)\n }\n const rowDrop = (e: DragEvent, key: PhaseViewKey, name: string): void => {\n e.preventDefault()\n e.stopPropagation() // 避免继续冒泡到阶段框的 append 逻辑(防双份)\n if (dragName && dragName !== name) {\n const pos = dropTarget?.part === key && dropTarget.name === name && dropTarget.pos ? dropTarget.pos : 'below'\n insertInto(key, name, pos)\n }\n setDragName(null); setDragSource(null); setDropTarget(null)\n }\n const partDropEnd = (e: DragEvent, key: PhaseViewKey): void => {\n // 拖到阶段部分空白处 = 追加到末尾(同样保留已有行的身份)。\n e.preventDefault()\n if (dragName && dragSource) {\n const carry = carryFor(key, dragSource, dragName)\n if (!carry.blocked) {\n const rows = rowsOf(key)\n const existing = rows.find((row) => row.name === dragName)\n const next = rows.filter((row) => row.name !== dragName)\n next.push(existing ?? {\n name: dragName,\n text: dragSource.custom ? dragSource.text : '',\n replaced: Object.hasOwn(cfg.replace ?? {}, dragName),\n custom: dragSource.custom,\n override: carry.text,\n blocked: false,\n })\n if (dragSource.kind === 'all' && inBaseOf(key, dragName) && deniedNames(cfg, key).includes(dragName)) {\n applyBlock(key, dragName, false)\n }\n persistPhase(key, next)\n } else {\n setNotice(t('sectionDynamicNoAdd', { name: dragName }))\n }\n }\n setDragName(null); setDragSource(null); setDropTarget(null)\n }\n const allBoxDrop = (e: DragEvent): void => {\n e.preventDefault()\n // 拖回「全部」= 从该阶段移除:custom 段删除注入条目;系统段无法真正\n // 删除(它是装配的一部分),等价操作是屏蔽该阶段 —— 行翻转成「已屏蔽」,\n // 仍留在列表里可随时拖回 / 勾回。\n if (dragName && dragSource?.kind === 'part' && dragSource.key) {\n const src = dragSource.key\n const row = rowsOf(src).find((r) => r.name === dragName)\n // 用户加进来的系统段(该阶段原本没有、靠注入文本出现):移除注入条目即还原。\n const addedSystem = !!row && !row.custom && !inBaseOf(src, dragName) && row.override !== ''\n if (row && !row.custom && !addedSystem) applyBlock(src, dragName, true)\n else removeFromPart(src, dragName)\n }\n setDragName(null); setDragSource(null); setDropTarget(null)\n }\n const endDrag = (): void => { stopAutoScroll(); setDragName(null); setDragSource(null); setDropTarget(null) }\n\n const partNoun = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('sectionsPartGuide') : key === 'compaction' ? t('sectionsPartControlled') : t('sectionsPartResident')\n\n const isEditing = (key: PhaseViewKey, row: PartRow): boolean => editing === editKey(key, row.name)\n\n const renderRow = (key: PhaseViewKey, row: PartRow, index: number, total: number): ReactElement => {\n const isDragging = dragName === row.name\n const isDropTarget = dropTarget?.part === key && dropTarget.name === row.name\n const rowStyle: CSSProperties = {\n ...s.row,\n ...(isDragging ? s.rowDragging : {}),\n ...(isDropTarget && dropTarget && dropTarget.pos === 'above' ? s.rowDropAbove : {}),\n ...(isDropTarget && dropTarget && dropTarget.pos === 'below' ? s.rowDropBelow : {}),\n cursor: 'move',\n }\n return h('div', {\n key: row.name,\n style: rowStyle,\n draggable: true,\n onDragStart: (e: DragEvent) => startDrag(e, row.name, { kind: 'part', key, text: row.custom ? (row.override || row.text) : '', custom: row.custom }),\n onDragOver: (e: DragEvent) => rowDragOver(e, key, row.name),\n onDrop: (e: DragEvent) => rowDrop(e, key, row.name),\n onDragEnd: endDrag,\n }, [\n h('span', { style: s.dragHandle, title: t('drag') }, '⠿'),\n h('label', { style: s.switchWrap }, [\n h('input', { type: 'checkbox', checked: row.blocked, onChange: () => toggleBlocked(key, row.name) }),\n h('span', { style: row.blocked ? s.badgeBlocked : s.badgeOk }, row.blocked ? t('blockedOn') : t('blockedOff')),\n ]),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n h('span', { style: s.orderTag }, '#' + index),\n h('span', { style: row.custom ? s.badgeCustom : s.badgeSystem }, row.custom ? t('manual') : t('system')),\n row.replaced ? h('span', { style: s.badgeReplaced }, t('replaced')) : null,\n ]),\n isEditing(key, row)\n ? h('div', { style: s.editBox }, [\n h('textarea', { style: s.editInput, value: draft, onChange: (e: ChangeEvent<HTMLTextAreaElement>) => setDraft(e.target.value), rows: 3 }),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => commitReplace(key, row) }, t('save')),\n h('button', { style: s.mini, onClick: () => setEditing(null) }, t('clearInput')),\n !row.custom && (row.override || Object.hasOwn(cfg.replace ?? {}, row.name))\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n ]),\n ])\n : h('div', { style: s.preview }, String(row.override || row.text || '').slice(0, 140) || (row.custom ? t('empty') : t('dynamic'))),\n ]),\n h('div', { style: s.arrowCol }, [\n h('button', { style: s.arrow, disabled: index === 0, onClick: () => moveRow(key, index, -1), title: t('moveUp') }, '↑'),\n h('button', { style: s.arrow, disabled: index === total - 1, onClick: () => moveRow(key, index, 1), title: t('moveDown') }, '↓'),\n ]),\n isEditing(key, row) ? null : h('button', { style: s.mini, onClick: () => startReplace(key, row) }, t('replace')),\n !isEditing(key, row) && !row.custom && (row.override || Object.hasOwn(cfg.replace ?? {}, row.name))\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n row.custom ? h('button', { style: s.mini, onClick: () => removeFromPart(key, row.name), title: t('delete') }, t('delete')) : null,\n ])\n }\n\n // 一个阶段部分:标题 + 全部行(含被屏蔽的段,整行拖拽/箭头/序号)+ 注入表单。\n const renderPart = (key: PhaseViewKey): ReactElement => {\n const rows = rowsOf(key)\n return h('div', {\n key,\n style: s.injectBox,\n onDragOver: (e: DragEvent) => { if (dragName) { e.preventDefault(); e.dataTransfer.dropEffect = 'move' } },\n onDrop: (e: DragEvent) => partDropEnd(e, key),\n }, [\n h('div', { style: s.rowTitle }, [\n h('span', null, partNoun(key)),\n h('span', { style: s.orderTag }, `${t('phaseVisible')} ${rows.length}`),\n ]),\n partNote(key),\n rows.map((row, i) => renderRow(key, row, i, rows.length)),\n h(InjectForm, { onAdd: (name, text) => addSection(name, text, injectPhaseOf(key)), lockedPhase: injectPhaseOf(key), t }),\n ])\n }\n\n return h('div', { style: s.list, ref: rootRef, onDragOver: rootDragOver }, [\n notice ? h('div', { style: s.noticeWarn }, notice) : null,\n parts.map(renderPart),\n h('div', {\n style: s.injectBox,\n onDragOver: (e: DragEvent) => { if (dragName) { e.preventDefault(); e.dataTransfer.dropEffect = 'move' } },\n onDrop: allBoxDrop,\n }, [\n h('div', { style: s.rowTitle }, [t('allSectionsTitle'), h('span', { style: s.orderTag }, `${(inv?.sections ?? []).length}`)]),\n h('div', { style: { ...s.muted, marginBottom: 4 } }, t('sectionsFourHint')),\n (inv?.sections ?? []).length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n (inv?.sections ?? []).map((sec) => h('div', {\n key: sec.name,\n style: { ...s.row, cursor: 'copy', opacity: 0.92 },\n draggable: true,\n onDragStart: (e: DragEvent) => startDrag(e, sec.name, { kind: 'all', text: (sec.text ?? '').startsWith('<') || !sec.text ? '' : sec.text, custom: false }),\n onDragEnd: endDrag,\n }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, sec.name)),\n h('div', { style: s.preview }, String(sec.text ?? '').slice(0, 140) || t('dynamic')),\n ]),\n ])),\n ]),\n ])\n}\n\n/** 注入新段表单:阶段部分内联形态,阶段锁定为所在部分。 */\nfunction InjectForm({ onAdd, lockedPhase, t }: {\n onAdd: (name: string, text: string) => void\n lockedPhase: 'bootstrap' | 'active' | 'compaction'\n t: Translate\n}): ReactElement {\n const [name, setName] = useState('')\n const [text, setText] = useState('')\n const submit = (): void => {\n if (!name.trim()) return\n onAdd(name.trim(), text)\n setName(''); setText('')\n }\n const phaseLabel = lockedPhase === 'bootstrap' ? t('phaseStageGuide')\n : lockedPhase === 'compaction' ? t('phaseStageControlled')\n : t('phaseStageResident')\n return h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, width: '22%' }, placeholder: t('name'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('input', { style: { ...s.input, flex: 1 }, placeholder: `${t('text')}(${phaseLabel})`, value: text, onChange: (e: ChangeEvent<HTMLInputElement>) => setText(e.target.value) }),\n h('button', { style: s.mini, onClick: submit }, t('add')),\n ])\n}\n","/** 工具 Tab:四个部分 —— 引导期 / 常驻期 / 压缩受控期(三个阶段恒定显示,\n * 预设没有某个阶段时该部分只是空的)+ 本系统全部工具(只读池)。\n * - 上三段每行 = 该阶段进入过滤的目录 ∪ 用户加回的工具(预过滤视图,隐藏后\n * 仍在列表可反选),勾选 = 该阶段可见 / 隐藏。三份名单互不继承。\n * - 「加回」:被该阶段默认裁掉、但仍在当前预设注册表里的工具,可以拖进来重新\n * 出现(写该阶段的 add 名单,装配时从注册表查回 schema 追加)。注册表里根本\n * 没有的(别的预设独有)加不进来,界面明确说明。\n * - 全部工具 = 跨预设累积的注册表并集(只读池),每行标出该工具在三个阶段的\n * 状态;它按定义比任何单一预设都大,所以里面的工具完全可能不在当前预设注册表。\n * - 拖动:全部 → 某阶段 = 让该工具在这一阶段出现;阶段 → 阶段 = 搬移(源阶段\n * 隐藏 + 目标阶段显示);上三段 → 全部 = 在该阶段隐藏它。\n * - 只有黑名单,没有白名单:每个动作只作用于被拖 / 被点的那一个工具,绝不\n * 因为「拖进了一个工具」而把该阶段其它工具一起关掉。 */\nimport { createElement as h, useState, type CSSProperties, type ReactElement, type DragEvent } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER, isToolHidden, withPhaseAdd, withPhaseExclude } from './presets.ts'\nimport { s } from './styles.ts'\n\n/** Panel 并行拉取的三阶段装配(与 PreviewTab 同一形状)。 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** 拖拽来源:全部池,或某个阶段部分。 */\ntype DragSource = { kind: 'all' } | { kind: 'part'; key: PhaseViewKey }\n\n/** 一次拖放的反馈(ok = 已写入,warn = 什么都没改并说明原因)。 */\ntype Notice = { kind: 'ok' | 'warn'; text: string }\n\nexport function ToolsTab({ cfg, inv, phases, t, write }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n t: Translate\n write: (field: 'sections' | 'replace' | 'inject' | 'tools', value: unknown) => void\n}): ReactElement {\n const [dragFrom, setDragFrom] = useState<DragSource | null>(null)\n const [draggedName, setDraggedName] = useState<string | null>(null)\n const [dropHint, setDropHint] = useState<string | null>(null)\n const [notice, setNotice] = useState<Notice | null>(null)\n\n // 某阶段自己的黑名单 / 加回名单(三份互不继承)。\n const excludeOf = (key: PhaseViewKey): string[] => {\n const tools = cfg.tools ?? {}\n const list = key === 'bootstrap' ? tools.bootstrap?.exclude : key === 'compaction' ? tools.compaction?.exclude : tools.exclude\n return list ?? []\n }\n const addOf = (key: PhaseViewKey): string[] => {\n const tools = cfg.tools ?? {}\n const list = key === 'bootstrap' ? tools.bootstrap?.add : key === 'compaction' ? tools.compaction?.add : tools.add\n return list ?? []\n }\n // 一次写入同时落该阶段的 exclude 与 add(在同一份 tools 上叠完再写一次,\n // 分两次写会各自基于旧 cfg 计算而互相覆盖)。\n const writeLists = (key: PhaseViewKey, exclude: string[], add: string[]): void => {\n write('tools', withPhaseAdd(withPhaseExclude(cfg.tools ?? {}, key, exclude), key, add))\n }\n\n // 该阶段的装配目录(进入本插件过滤的工具原文)与该预设注册表(能加回的来源)。\n const catalogOf = (key: PhaseViewKey): string[] => (phases?.[key]?.baseTools ?? []).map((tool) => tool.name)\n const isInCatalog = (key: PhaseViewKey, name: string): boolean => catalogOf(key).includes(name)\n // 注册表三个阶段共享同一 scope,取第一个非空的即可。\n const registry: Set<string> = (() => {\n const list = PART_ORDER.map((key) => phases?.[key]?.registryTools).find((x) => Array.isArray(x) && x.length > 0) ?? []\n return new Set(list)\n })()\n const isInRegistry = (name: string): boolean => registry.has(name)\n\n // 该工具在某阶段是否「在场」(在目录里且没被隐藏,或已加回)。\n const presentIn = (key: PhaseViewKey, name: string): boolean =>\n addOf(key).includes(name) || (isInCatalog(key, name) && !excludeOf(key).includes(name))\n\n // 把一个工具放进某阶段(复制语义,绝不改动其它阶段):不在该阶段目录里就加进\n // add 名单;`hidden` 决定它在目标阶段是可见还是隐藏(拖拽时继承源阶段的状态)。\n const addToPhase = (key: PhaseViewKey, name: string, hidden: boolean): void => {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (!isInCatalog(key, name) && !add.includes(name)) add = [...add, name]\n exclude = hidden\n ? (exclude.includes(name) ? exclude : [...exclude, name])\n : exclude.filter((x) => x !== name)\n writeLists(key, exclude, add)\n }\n\n // 阶段部分里的行 = 该阶段进入过滤的目录 ∪ 已加回(但尚未出现在装配里)的工具。\n const rowsOf = (key: PhaseViewKey): Array<{ name: string; description: string; hidden: boolean; added: boolean }> => {\n const filter = { exclude: excludeOf(key) }\n const catalog = (phases?.[key]?.baseTools ?? []).map((tool) => ({\n name: tool.name,\n description: tool.description ?? '',\n hidden: isToolHidden(tool.name, filter),\n added: false,\n }))\n const names = new Set(catalog.map((row) => row.name))\n const added = addOf(key)\n .filter((name) => !names.has(name))\n .map((name) => ({ name, description: '', hidden: false, added: true }))\n return [...catalog, ...added]\n }\n\n // 勾选 / 取消勾选:只动这一个工具在本阶段的可见性。\n const toggleHide = (key: PhaseViewKey, name: string, currentlyHidden: boolean): void => {\n if (currentlyHidden) {\n addToPhase(key, name, false)\n } else {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (add.includes(name)) add = add.filter((x) => x !== name)\n else if (!exclude.includes(name)) exclude = [...exclude, name]\n writeLists(key, exclude, add)\n }\n setNotice(null)\n }\n\n const phaseNoun = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n\n // 拖到阶段部分 = 复制:目标阶段多一份,源阶段原样不动;隐藏状态跟着走\n //(源阶段是禁用的,复制过去也是禁用,启用同理)。\n const dropOnPart = (dest: PhaseViewKey, name: string, from: DragSource): void => {\n if (!isInCatalog(dest, name) && !isInRegistry(name)) {\n setNotice({ kind: 'warn', text: t('toolNotInRegistry', { name }) })\n return\n }\n const copied = from.kind === 'part' && from.key !== dest\n const hidden = copied ? excludeOf(from.key).includes(name) : false\n addToPhase(dest, name, hidden)\n setNotice({\n kind: 'ok',\n text: copied\n ? t('toolCopied', { name, from: phaseNoun(from.key), to: phaseNoun(dest) })\n : isInCatalog(dest, name)\n ? t('toolShown', { name, to: phaseNoun(dest) })\n : t('toolAdded', { name, phase: phaseNoun(dest) }),\n })\n }\n\n // 拖回「全部」池 = 把它从来源那个阶段拿掉:加回的工具撤销加回,原生工具隐藏。\n const dropOnAll = (name: string, from: DragSource): void => {\n if (from.kind !== 'part') return\n const key = from.key\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (add.includes(name)) {\n add = add.filter((x) => x !== name)\n } else if (!exclude.includes(name)) {\n exclude = [...exclude, name]\n }\n writeLists(key, exclude, add)\n setNotice({ kind: 'ok', text: t('toolHiddenIn', { name, to: phaseNoun(key) }) })\n }\n\n // 某阶段的「启用 / 总数」:本部分列出的行里有多少对模型可见。\n // 模型视角的真实目录数看预览 Tab —— 装配本身没给出、又没加回的工具不会进模型。\n const visibleCount = (key: PhaseViewKey): string => {\n const rows = rowsOf(key)\n return `${rows.filter((row) => !row.hidden).length} / ${rows.length}`\n }\n\n const partNoun = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('toolsPartGuide') : key === 'compaction' ? t('toolsPartControlled') : t('toolsPartResident')\n\n // ── 拖拽 ──────────────────────────────────────────────────────────────────\n const startDrag = (e: DragEvent, from: DragSource, name: string): void => {\n setDragFrom(from)\n setDraggedName(name)\n e.dataTransfer.effectAllowed = 'copy'\n try { e.dataTransfer.setData('text/plain', name) } catch { /* ignore */ }\n }\n const zoneDragOver = (e: DragEvent, zone: string): void => {\n if (!dragFrom || !draggedName) return\n const same = zone === 'all' ? dragFrom.kind === 'all' : (dragFrom.kind === 'part' && dragFrom.key === zone.replace('part:', ''))\n if (zone === 'all' && dragFrom.kind === 'all') { e.preventDefault(); return }\n if (same) return\n e.preventDefault()\n e.dataTransfer.dropEffect = 'copy'\n setDropHint(zone)\n }\n const zoneDrop = (e: DragEvent, zone: string): void => {\n e.preventDefault()\n if (dragFrom && draggedName) {\n if (zone === 'all') dropOnAll(draggedName, dragFrom)\n else {\n const dest = zone.replace('part:', '') as PhaseViewKey\n if (PART_ORDER.includes(dest)) dropOnPart(dest, draggedName, dragFrom)\n }\n }\n setDragFrom(null)\n setDraggedName(null)\n setDropHint(null)\n }\n const endDrag = (): void => { setDragFrom(null); setDraggedName(null); setDropHint(null) }\n const zoneStyle = (zone: string): CSSProperties | undefined =>\n dropHint === zone ? { outline: '2px dashed #7aa7ff', outlineOffset: 2 } : undefined\n\n const allTools = (inv?.tools ?? []).map((tool) => ({\n name: tool.name,\n description: typeof tool === 'string' ? '' : (tool.description ?? ''),\n }))\n\n // 池行上的三阶段状态标记(引 / 常 / 压):绿 = 可见或已加回,灰 = 已隐藏,暗 = 不在。\n const markStyle = (key: PhaseViewKey, name: string): CSSProperties => {\n if (presentIn(key, name)) return { ...s.badgeOk, padding: '0 3px' }\n if (isInCatalog(key, name)) return { ...s.badgeBlocked, padding: '0 3px' }\n return { ...s.muted, opacity: 0.45, padding: '0 3px' }\n }\n const markKey = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? 'phaseShortGuide' : key === 'active' ? 'phaseShortResident' : 'phaseShortControlled'\n\n const renderPhasePart = (key: PhaseViewKey): ReactElement => {\n const rows = rowsOf(key)\n const zoneKey = `part:${key}`\n return h('div', {\n key: zoneKey,\n style: s.injectBox,\n onDragOver: (e: DragEvent) => zoneDragOver(e, zoneKey),\n onDrop: (e: DragEvent) => zoneDrop(e, zoneKey),\n ...(zoneStyle(zoneKey) ?? {}),\n }, [\n h('div', { style: s.rowTitle }, [\n h('span', null, partNoun(key)),\n h('span', { style: s.orderTag }, `${t('phaseVisible')} ${visibleCount(key)}`),\n rows.length === 0 ? h('span', { style: s.muted }, t('dragHint')) : null,\n ]),\n h('div', { style: s.toolWrap }, rows.map((row) => h('span', {\n key: row.name,\n style: { ...s.toolChip, cursor: 'move', display: 'inline-flex', alignItems: 'center', gap: 4 },\n title: row.description.slice(0, 120),\n draggable: true,\n onDragStart: (e: DragEvent) => startDrag(e, { kind: 'part', key }, row.name),\n onDragEnd: endDrag,\n }, [\n h('input', {\n type: 'checkbox',\n checked: !row.hidden,\n onChange: () => toggleHide(key, row.name, row.hidden),\n style: { margin: 0, cursor: 'pointer' },\n }),\n h('span', { style: row.hidden ? s.badgeBlocked : s.badgeOk }, row.name),\n ]))),\n ])\n }\n\n return h('div', {}, [\n h('div', { style: s.muted }, t('toolsFourHint')),\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.noticeWarn }, notice.text) : null,\n PART_ORDER.map(renderPhasePart),\n // 全部工具:本系统注册表的完整目录,只读池(不可勾选,供拖入三个阶段)。\n h('div', {\n style: s.injectBox,\n onDragOver: (e: DragEvent) => zoneDragOver(e, 'all'),\n onDrop: (e: DragEvent) => zoneDrop(e, 'all'),\n ...(zoneStyle('all') ?? {}),\n }, [\n h('div', { style: s.rowTitle }, [t('allToolsTitle'), h('span', { style: s.orderTag }, `${allTools.length}`)]),\n allTools.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n h('div', { style: s.toolWrap }, allTools.map((tool) => h('span', {\n key: tool.name,\n style: { ...s.toolChip, cursor: 'copy' },\n title: tool.description.slice(0, 120),\n draggable: true,\n onDragStart: (e: DragEvent) => startDrag(e, { kind: 'all' }, tool.name),\n onDragEnd: endDrag,\n }, tool.name))),\n ]),\n ])\n}\n","/**\n * preset-io.ts —— 跨环境(Tauri 2 桌面 / Web)的预设导入导出适配层。\n *\n * 浏览器端最初跑在普通网页里:导出用 Blob + <a download>,导入用隐藏的\n * <input type=\"file\"> + FileReader。宿主现在可能包在 Tauri 桌面 WebView\n * 里,桌面端的预期交互是「原生保存 / 打开对话框 + 真实文件读写」。\n *\n * 本模块保持文件格式纯净(encode/decode 为纯函数),把真正的 I/O 路由到\n * 一个小型的可注入 `PresetIoEnv`:\n *\n * - Tauri v2:通过 window.__TAURI_INTERNALS__.invoke 调用原生的\n * `plugin:dialog|save` / `plugin:dialog|open` 与\n * `plugin:fs|write_text_file` / `plugin:fs|read_text_file` 命令 —— 但\n * 仅当宿主应用注册了 dialog / fs 插件、且其 capability ACL 放行这些\n * 命令时才可用。任何拒绝(插件未注册、ACL \"not allowed\")都归为\n * `unavailable`,由调用方回退到 Web 路径 —— 所以即使 Tauri 宿主尚未\n * 带 dialog/fs 插件,本插件也照常工作。\n * - Web(以及 tauri 回退):Blob + 锚点下载 / 隐藏文件输入,与旧行为\n * 完全一致。在 WebView2 里锚点下载会退化为 WebView 默认的下载处理,\n * 文件输入仍会打开系统选择器。\n *\n * 本模块在模块作用域不触碰 DOM —— 每个分支都接受注入的假实现 —— 因此\n * 可以在 Node 下加载,web / tauri 已保存 / tauri 已取消 / tauri 不可用\n * 的整个矩阵都能单测覆盖。\n */\nimport type { Preset } from './types.ts'\nimport { presetExportFilename } from './presets.ts'\n\n// ── 环境检测 ────────────────────────────────────────────────────────────────\n\n/** Tauri v2 原始 IPC 桥(window.__TAURI_INTERNALS__)。 */\nexport interface TauriInvoke {\n (cmd: string, args?: Record<string, unknown>, options?: unknown): Promise<unknown>\n}\n\n/** 页面是否运行在 Tauri(v1 标记或 v2 桥)webview 内。 */\nexport function isTauriEnv(win: unknown): boolean {\n if (win === null || win === undefined) return false\n const w = win as { __TAURI_INTERNALS__?: unknown; __TAURI__?: unknown }\n return w.__TAURI_INTERNALS__ !== undefined || w.__TAURI__ !== undefined\n}\n\n/** 取可用的 Tauri v2 invoke 桥;不可用时返回 null。 */\nfunction invokeOf(win: unknown): TauriInvoke | null {\n if (!isTauriEnv(win)) return null\n const internals = (win as { __TAURI_INTERNALS__?: { invoke?: unknown } }).__TAURI_INTERNALS__\n return internals && typeof internals.invoke === 'function' ? (internals.invoke as TauriInvoke) : null\n}\n\n// ── 原生(tauri)原语 ───────────────────────────────────────────────────────\n\nexport type SaveOutcome = { kind: 'saved' } | { kind: 'cancelled' } | { kind: 'unavailable' }\nexport type OpenOutcome = { kind: 'text'; text: string } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\nconst JSON_FILTERS = [{ name: 'JSON', extensions: ['json'] }]\n\n/**\n * 原生保存对话框 + 写文件。`cancelled` = 用户关闭了对话框(调用方绝不\n * 得再回退到下载);`unavailable` = 宿主无法提供 dialog/fs 插件(插件\n * 缺失或被 ACL 拦截),调用方应当回退。\n */\nexport async function tauriSaveText(invoke: TauriInvoke, defaultName: string, text: string): Promise<SaveOutcome> {\n try {\n const path = await invoke('plugin:dialog|save', { defaultPath: defaultName, filters: JSON_FILTERS })\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n await invoke('plugin:fs|write_text_file', { path, contents: text })\n return { kind: 'saved' }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n/** 原生打开对话框 + 读文件。`cancelled` = 用户关闭了对话框。 */\nexport async function tauriOpenText(invoke: TauriInvoke): Promise<OpenOutcome> {\n try {\n const picked = await invoke('plugin:dialog|open', { multiple: false, directory: false, filters: JSON_FILTERS })\n const path = Array.isArray(picked) ? picked[0] : picked\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n const text = await invoke('plugin:fs|read_text_file', { path })\n if (typeof text !== 'string') return { kind: 'unavailable' }\n return { kind: 'text', text }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n// ── Web 回退原语 ────────────────────────────────────────────────────────────\n\n/** 锚点下载的目标接口;依赖全部注入以便 Node 里伪造。 */\nexport interface BrowserDownloadTarget {\n makeAnchor(): { href: string; download: string; click(): void }\n makeBlob(text: string): unknown\n objectUrl(blob: unknown): string\n revoke(url: string): void\n}\n\n/** Web 回退导出:Blob + object URL + <a download> + revoke。 */\nexport function webDownload(target: BrowserDownloadTarget, filename: string, text: string): void {\n const blob = target.makeBlob(text)\n const url = target.objectUrl(blob)\n const anchor = target.makeAnchor()\n anchor.href = url\n anchor.download = filename\n anchor.click()\n target.revoke(url)\n}\n\n/** FileReader 形状的读取器(浏览器注入真 FileReader,测试注入假实现)。\n * 回调类型带可选的事件参数,让 DOM FileReader 的\n * `(this: FileReader, ev: ProgressEvent) => any` 处理器能干净赋值。 */\nexport interface FileReaderLike {\n readAsText(file: unknown): void\n onload: ((ev?: unknown) => void) | null\n onerror: ((ev?: unknown) => void) | null\n result: string | ArrayBuffer | null\n}\n\n/** Web 回退导入:经 FileReader 形状的读取器解析所选文件的文本。 */\nexport function readPickedFile(reader: FileReaderLike, file: unknown): Promise<string> {\n return new Promise((resolve, reject) => {\n reader.onload = () => {\n const r = reader.result\n resolve(typeof r === 'string' ? r : String(r ?? ''))\n }\n reader.onerror = () => reject(new Error('FREAD'))\n reader.readAsText(file)\n })\n}\n\n// ── 纯文件格式 ──────────────────────────────────────────────────────────────\n\n/** 把单个预设编码为导出文件的 JSON 格式(单对象格式)。 */\nexport function encodePresetExport(preset: Preset): string {\n return JSON.stringify({ name: preset.name, data: preset.data }, null, 2)\n}\n\n/**\n * 解析导出的预设文件:单个 { name, data } 对象或对象数组。空内容 /\n * 非法 JSON 抛普通 Error,由调用方给出友好提示;条目级的过滤在\n * addImportedPresets 里进行。\n */\nexport function decodePresetExport(text: string): unknown {\n const trimmed = String(text).trim()\n if (trimmed === '') throw new Error('EMPTY_EXPORT')\n return JSON.parse(trimmed)\n}\n\n// ── 环境门面 ────────────────────────────────────────────────────────────────\n\n/** 调用方(UI 或测试)驱动的 I/O 面。 */\nexport interface PresetIoEnv {\n readonly tauri: boolean\n saveText(defaultName: string, text: string): Promise<SaveOutcome>\n openText(): Promise<OpenOutcome>\n download(name: string, text: string): void\n}\n\nfunction browserDownloadTarget(): BrowserDownloadTarget {\n const g = globalThis as { document?: Document; URL?: { createObjectURL(b: Blob): string; revokeObjectURL(u: string): void } }\n const doc = g.document!\n const url = g.URL!\n return {\n makeAnchor: () => doc.createElement('a'),\n makeBlob: (text) => new Blob([text], { type: 'application/json' }),\n objectUrl: (blob) => url.createObjectURL(blob as Blob),\n revoke: (u) => url.revokeObjectURL(u),\n }\n}\n\n/** 为当前 window 构建真实环境(在 Node 里调用也安全)。 */\nexport function makeIoEnv(win?: unknown): PresetIoEnv {\n const w = win !== undefined ? win : typeof window !== 'undefined' ? window : undefined\n const invoke = invokeOf(w)\n const tauri = invoke !== null\n return {\n tauri,\n saveText: (name, text) => (tauri ? tauriSaveText(invoke!, name, text) : Promise.resolve({ kind: 'unavailable' })),\n openText: () => (tauri ? tauriOpenText(invoke!) : Promise.resolve({ kind: 'unavailable' })),\n download: (name, text) => webDownload(browserDownloadTarget(), name, text),\n }\n}\n\nexport type ExportResult = { ok: boolean; via: 'tauri' | 'browser'; cancelled?: boolean; message?: string }\n\n/**\n * 导出一个预设:宿主能提供原生对话框时走 tauri 保存(cancelled = 用户\n * 拒绝,绝不回退下载);否则走 Web 下载。\n */\nexport async function exportPresetFile(preset: Preset, io?: PresetIoEnv): Promise<ExportResult> {\n const env = io ?? makeIoEnv()\n try {\n const text = encodePresetExport(preset)\n const filename = presetExportFilename(preset.name)\n if (env.tauri) {\n const out = await env.saveText(filename, text)\n if (out.kind === 'saved') return { ok: true, via: 'tauri' }\n if (out.kind === 'cancelled') return { ok: false, via: 'tauri', cancelled: true }\n // unavailable -> 继续走 Web 下载\n }\n env.download(filename, text)\n return { ok: true, via: 'browser' }\n } catch (e) {\n return { ok: false, via: 'browser', message: e instanceof Error ? e.message : String(e) }\n }\n}\n\nexport type ImportResult = { kind: 'text'; text: string; via: 'tauri' } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\n/**\n * 经原生 tauri 打开对话框导入一个预设;返回 `unavailable` 时由调用方\n * 点击自己的隐藏文件输入(Web 回退)。\n */\nexport async function importPresetFile(io?: PresetIoEnv): Promise<ImportResult> {\n const env = io ?? makeIoEnv()\n try {\n if (env.tauri) {\n const out = await env.openText()\n if (out.kind === 'text') return { kind: 'text', text: out.text, via: 'tauri' }\n if (out.kind === 'cancelled') return { kind: 'cancelled' }\n }\n } catch {\n /* 落到下面的选择器回退 */\n }\n return { kind: 'unavailable' }\n}\n","/** 配置 Tab:两种「预设」分开 ——\n * - 保存当前配置:本插件内的配置快照库(config.presets),可应用 / 导出 / 导入,\n * 不会变成可选的 agent 预设;\n * - 存为 agent 预设:整体 fork 当前编辑目标的预设目录,并把当前定制写进它的\n * 覆盖项,新预设随即出现在顶部的编辑目标选择器里。\n * 导入导出经 preset-io 双端适配:Tauri 2 桌面走原生对话框,Web 走\n * 下载 / 文件选择;成功 / 失败 / 取消都有面板内消息条提示。 */\nimport { createElement as h, useEffect, useRef, useState, type ReactElement, type ChangeEvent } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview, Preset } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { addImportedPresets, applyPresetData, buildPresetData, genId, mergeSections, PART_ORDER, removePreset, type ConfigPatch } from './presets.ts'\nimport { decodePresetExport, exportPresetFile, importPresetFile } from './preset-io.ts'\nimport { s } from './styles.ts'\n\n/** 一次性操作提示:kind 决定配色,几秒后自动消失。 */\ninterface Notice {\n kind: 'ok' | 'error'\n text: string\n}\n\nexport function PresetsTab({ cfg, inv, phases, t, writePatch, writeGlobal, saveAsPreset, forkSource }: {\n cfg: Config\n inv: Inventory | null\n /** Panel 并行拉取的三阶段装配:快照只捕获当前装配里真实存在的段。 */\n phases: Record<PhaseViewKey, Preview | null> | null\n t: Translate\n /** 应用预设:完整补丁一次落盘(显式意图,不经草稿)。 */\n writePatch: (patch: ConfigPatch) => void\n /** 预设库专用:永远写在全局字段(presets / activePreset 不分作用域)。 */\n writeGlobal: (field: string, value: unknown) => void\n /** 存为 agent 预设:fork 当前编辑目标的预设目录并写入 overrides[新名]。 */\n saveAsPreset: (name: string) => Promise<boolean>\n /** fork 来源的显示名(当前编辑目标预设);undefined = 全局目标,由服务端回落默认预设。 */\n forkSource: string | undefined\n}): ReactElement {\n const presets = cfg.presets ?? []\n const [name, setName] = useState('')\n // 「存为 agent 预设」的名字与在途标记(与服务端往返期间禁用按钮)。\n const [agentName, setAgentName] = useState('')\n const [creating, setCreating] = useState(false)\n const [notice, setNotice] = useState<Notice | null>(null)\n // Web 回退用的隐藏文件输入(tauri 不可用时才点它)。\n const fileRef = useRef<HTMLInputElement | null>(null)\n // 消息条自动消失的定时器;新消息会重置旧定时器。\n const noticeTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => () => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n }, [])\n\n // 显示提示;ok 与 error 分别配色,4 秒后自动消失。\n const show = (kind: Notice['kind'], text: string): void => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n setNotice({ kind, text })\n noticeTimer.current = setTimeout(() => setNotice(null), 4000)\n }\n\n const blockedNames = new Set(cfg.sections ?? [])\n // 快照的捕获宇宙 = 当前预设三个阶段装配里真实存在的段名。「本系统全部提示词」\n // 是跨预设只增不减的并集池,直接拿它当捕获集合会把别的预设独有段名灌进快照,\n // 应用回来就是一条条空白幽灵段。装配数据未就绪(宇宙为空)时不过滤,避免捕获成空。\n const assemblyNames = new Set<string>()\n for (const key of PART_ORDER) {\n for (const sec of phases?.[key]?.baseSections ?? []) assemblyNames.add(sec.name)\n }\n const mergedAll = mergeSections(inv, cfg, blockedNames)\n const merged = assemblyNames.size === 0\n ? mergedAll\n : mergedAll.filter((sec) => sec.source === 'custom' || assemblyNames.has(sec.name))\n const currentNames = new Set(merged.map((sec) => sec.name))\n\n // 把当前定制捕获为新预设(完整快照)。绝对顺序会被转成相对形式\n // (每段记录它应跟随的前一段),因此预设可以跨不同提示词移植。\n const saveCurrent = (): void => {\n const presetName = name.trim() || `${t('preset')} ${presets.length + 1}`\n const data = buildPresetData(cfg, merged)\n writeGlobal('presets', [...presets, { id: genId(), name: presetName, data }])\n setName('')\n }\n\n // 应用预设。补丁由纯函数助手计算:\n // - 同名段被覆盖(内容 + 顺序)\n // - 预设中有、当前提示词中没有的段被添加\n // - 当前有、但不在预设列表中的段被屏蔽\n // - 只有预设的「激活段」被解除屏蔽(预设自己的屏蔽名单被保留)\n // 四个定制字段以一个补丁写入当前编辑目标(全局顶层或 overrides[id]);\n // 快照库(presets / activePreset)永远保持在全局。\n const applyPreset = (preset: Preset): void => {\n writePatch(applyPresetData(preset.data, cfg, currentNames))\n writeGlobal('activePreset', preset.id)\n }\n\n const deletePreset = (id: string): void => {\n const next = removePreset(presets, id, cfg.activePreset)\n writeGlobal('presets', next.presets)\n if (next.activeId === undefined && cfg.activePreset === id) writeGlobal('activePreset', undefined)\n }\n\n // 导出一个预设:Tauri 桌面走原生保存对话框,Web(或 tauri 插件不可用\n // 时)回退为下载。saved/downloaded = 成功;用户取消单独提示,不算失败。\n const exportPreset = async (preset: Preset): Promise<void> => {\n try {\n const res = await exportPresetFile(preset)\n if (res.ok) show('ok', t('exportOk'))\n else if (res.cancelled) show('ok', t('exportCancel'))\n else show('error', `${t('exportFail')}${res.message ? ': ' + res.message : ''}`)\n } catch (e) {\n show('error', `${t('exportFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // 解析导入文本 → 去重追加 → 提示新增数量。解析失败提示错误。\n const importParsed = (text: string): void => {\n try {\n const parsed = decodePresetExport(text)\n const next = addImportedPresets(presets, parsed, genId)\n const added = next.length - presets.length\n if (added <= 0) show('ok', t('importNone'))\n else {\n writeGlobal('presets', next)\n show('ok', `${t('importOk')} (+${added})`)\n }\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // 导入预设:优先 Tauri 原生打开对话框;unavailable(Web 或桌面端缺\n // dialog/fs 插件)时点隐藏 file input 回退到文件选择器。取消单独提示。\n const importPreset = async (): Promise<void> => {\n try {\n const res = await importPresetFile()\n if (res.kind === 'text') { importParsed(res.text); return }\n if (res.kind === 'cancelled') { show('ok', t('importCancel')); return }\n fileRef.current?.click()\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // Web 回退路径:文件选择器的 onChange。用户取消(无文件)静默返回。\n const onImportFile = (e: ChangeEvent<HTMLInputElement>): void => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => importParsed(String(reader.result))\n reader.onerror = () => show('error', t('importFail'))\n reader.readAsText(file)\n }\n\n // 存为 agent 预设:fork 当前编辑目标的预设目录 + 把当前定制写进它的覆盖项。\n // 成败由服务端返回,提示统一走面板顶部的消息条(Panel 的 flash),这里只在\n // 成功时清空输入框,避免同一条消息显示两遍。\n const createAgentPreset = async (): Promise<void> => {\n const trimmed = agentName.trim()\n if (trimmed.length === 0 || creating) return\n setCreating(true)\n if (await saveAsPreset(trimmed)) setAgentName('')\n setCreating(false)\n }\n\n return h('div', { style: s.list }, [\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.error }, notice.text) : null,\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('savePreset')),\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('presetName'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('button', { style: s.mini, onClick: saveCurrent }, t('save')),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('saveAsPresetCard')),\n h('div', { style: s.muted }, t('saveAsPresetHint', { name: forkSource ?? t('forkSourceDefault') })),\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('agentPresetName'), value: agentName, onChange: (e: ChangeEvent<HTMLInputElement>) => setAgentName(e.target.value) }),\n h('button', { style: s.mini, disabled: creating || agentName.trim().length === 0, onClick: () => { void createAgentPreset() } }, t('saveAsPreset')),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('importPreset')),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => { void importPreset() } }, t('import')),\n h('input', { ref: fileRef, type: 'file', accept: '.json,application/json', style: { display: 'none' }, onChange: onImportFile }),\n ]),\n ]),\n presets.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n presets.map((preset) => {\n const active = cfg.activePreset === preset.id\n return h('div', { key: preset.id, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, preset.name),\n active ? h('span', { style: s.badgeOk }, t('active')) : null,\n ]),\n ]),\n h('button', { style: s.mini, onClick: () => applyPreset(preset) }, t('apply')),\n h('button', { style: s.mini, onClick: () => { void exportPreset(preset) } }, t('export')),\n h('button', { style: s.mini, onClick: () => deletePreset(preset.id) }, t('delete')),\n ])\n }),\n ])\n}\n","/** 工具预览:当前定制(黑名单过滤之后)最终对模型可见的工具目录,\n * 只读、清单式呈现:列出即代表模型看得见 —— 这里没有「已屏蔽」状态。\n * 本视图绝不修改黑名单配置。 */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\n\n/** 预览工具条目:对象形态或纯字符串工具名(统一归一化为对象)。 */\nexport type PreviewTool = { name: string; description: string } | string\n\n/** 把字符串形态的条目补全为 { name, description: '' }。 */\n\nfunction norm(tool: PreviewTool): { name: string; description: string } {\n return typeof tool === 'string' ? { name: tool, description: '' } : tool\n}\n\nexport function PreviewTools({ tools, t }: { tools: PreviewTool[]; t: Translate }): ReactElement {\n if (tools.length === 0) return h('div', { style: s.muted }, t('empty'))\n return h('div', { style: s.list }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.orderTag }, `${tools.length} ${t('previewToolCount')}`),\n ]),\n tools.map((tool) => {\n const { name, description } = norm(tool)\n return h('div', { key: name, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, name)),\n h('div', { style: s.preview }, String(description ?? '').slice(0, 140)),\n ]),\n ])\n }),\n ])\n}\n","/** 预览 Tab:两个只读子视图 —— 所有插件过滤后的最终装配系统提示词,\n * 以及当前定制(黑名单过滤之后)将注入的工具目录视图。\n * 两个视图都不修改配置。预览目标跟随面板顶部的编辑目标(`target`);\n * 数据直接来自 Panel 并行拉取的三阶段装配(`phases`)—— 与提示词/\n * 工具 Tab 同源(同一份 base + post 视图),杜绝三个视图数据不一致。\n * 阶段按钮恒为引导期 / 常驻期 / 压缩受控期三个(与另两个 Tab 同源同形)。 */\nimport { createElement as h, useState, type ReactElement } from 'react'\nimport type { PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER } from './presets.ts'\nimport { s } from './styles.ts'\nimport { PreviewTools } from './PreviewTools.tsx'\n\nexport function PreviewTab({ t, active, refreshId, target, version, phases }: {\n t: Translate\n active: boolean\n refreshId: number\n /** 顶部编辑目标:undefined = 全局(standard scope);字符串 = agent 预设 id。 */\n target: string | undefined\n /** 配置写入计数:Panel 每次成功写配置后 +1(驱动统一重载)。\n * ponytail: refreshId/version 由 Panel 的统一重载消费,本组件内未直接使用。 */\n version: number\n /** Panel 并行拉取的三阶段装配(模型视角统一数据源)。 */\n phases: Record<PhaseViewKey, Preview | null> | null\n}): ReactElement {\n const [sub, setSub] = useState<'prompt' | 'tools'>('prompt')\n const [phase, setPhase] = useState<PhaseViewKey>('bootstrap')\n\n const data = phases?.[phase] ?? null\n // 按当前所选阶段判定「段级定制没进最终提示词」:有 complete 段整段接管就说\n // 接管,否则探测本插件产出的段是否被下游丢弃(丢弃规则不止一种)。\n const lossNote = data === null || data === undefined ? null\n : data.takenOverBy !== undefined\n ? t('sectionsTakenOver', { name: data.takenOverBy })\n : data.lostSections !== undefined\n ? t('sectionsLost', { emitted: data.lostSections.emitted, survived: data.lostSections.survived })\n : null\n\n // 阶段按钮命名:引导期 / 常驻期 / 压缩受控期。\n const stageLabel = (p: PhaseViewKey): string =>\n p === 'bootstrap' ? t('phaseStageGuide') : p === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n\n return h('div', { style: s.list }, [\n h('div', { style: s.bar }, [\n h('button', { style: sub === 'prompt' ? s.tabActive : s.tab, onClick: () => setSub('prompt') }, t('previewPrompt')),\n h('button', { style: sub === 'tools' ? s.tabActive : s.tab, onClick: () => setSub('tools') }, t('previewTools')),\n h('div', { style: { marginLeft: 'auto', display: 'flex', gap: 4 } },\n PART_ORDER.map((key) => h('button', {\n key,\n style: phase === key ? s.tabActive : s.tab,\n onClick: () => setPhase(key),\n }, stageLabel(key)))),\n ]),\n // 该阶段的本插件段级产出没进最终提示词(整段接管或被下游丢弃)。\n lossNote !== null ? h('div', { style: s.noticeWarn }, lossNote) : null,\n // scope 挂载失败回退全局层时明确警示:这不是该预设的原生装配。\n data !== null && data.scopeResolved === false\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n // 伪会话触发预设插件异常时本次预览降级为无会话装配(原生阶段规则未运行)。\n data !== null && data.degraded === true\n ? h('div', { style: s.noticeWarn }, t('previewDegraded'))\n : null,\n phases === null ? h('div', { style: s.muted }, t('loading')) : null,\n phases !== null && data === null\n ? h('div', { style: s.error }, t('previewFail'))\n : null,\n sub === 'prompt'\n ? data\n ? [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewHint')),\n h('span', { style: s.orderTag }, `${data.sections.length} ${t('previewSections')}`),\n ]),\n h('pre', { style: s.previewText }, data.text || t('empty')),\n ]\n : null\n : data\n ? [\n // 模型视角 vs 注册表视角的对照:预览按所选阶段运行全部装配规则\n // (含预设原生的阶段裁剪),某些预设(如 PTC / Code Mode)会把\n // 完整目录包装成单一工具,注册表原始目录仍列在工具 Tab。\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewToolsHint')),\n h('span', { style: s.orderTag },\n `${data.tools.length} / ${data.registryTotal ?? '?'} ${t('previewToolsCount')}`),\n ]),\n h(PreviewTools, { tools: data.tools, t }),\n ]\n : null,\n ])\n}","/**\n * dsh-prompt-customizer — 浏览器端(TypeScript 源码)。\n *\n * 注册一个「提示词定制」设置分区(侧边栏入口)及插件设置卡片。面板从宿主\n * 的 `/api/prompt-customizer/inventory` 拉取当前生效的段 / 工具清单,让用户\n * 屏蔽、替换、注入提示词段并隐藏工具。所有写入都走绑定的设置作用域\n * (`prompt-customizer` 命名空间),实时生效。\n *\n * 由 tsdown 打包为 client/client.js(__ModuleLoader__ factory bundle);\n * 唯一的外部依赖是 loader 模块表中的 react 入口。\n */\nimport { createElement as h, useEffect, useRef, useState, type ReactElement } from 'react'\nimport { DICT, type Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport type { AgentPresetInfo, Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport { editView, type ConfigPatch } from './presets.ts'\nimport { SectionsTab } from './SectionsTab.tsx'\nimport { ToolsTab } from './ToolsTab.tsx'\nimport { PresetsTab } from './PresetsTab.tsx'\nimport { PreviewTab } from './PreviewTab.tsx'\n\nconst NS = 'prompt-customizer'\nconst INVENTORY_URL = '/api/prompt-customizer/inventory'\nconst AGENT_PRESETS_URL = '/api/prompt-customizer/agent-presets'\nconst CONFIG_URL = '/api/prompt-customizer/config'\nconst CONFIG_SET_URL = '/api/prompt-customizer/config/set'\nconst CONFIG_UNSET_URL = '/api/prompt-customizer/config/unset'\nconst CONFIG_APPLY_URL = '/api/prompt-customizer/config/apply'\nconst PRESETS_CREATE_URL = '/api/prompt-customizer/presets'\nconst PREVIEW_URL = '/api/prompt-customizer/preview'\n\n/** 三阶段预览装配(模型视角):提示词/工具/预览 Tab 的统一数据源。 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** 三套名义装配的共享布局:顺序固定,refresh 按此并行拉取。 */\nconst VIEW_KEYS: PhaseViewKey[] = ['bootstrap', 'compaction', 'active']\n\nexport const name = 'prompt-customizer'\nexport const inject = ['slots', 'locale']\n\n/** 本插件用到的客户端 cordis 上下文的最小子集。 */\ninterface ClientContext {\n effect(callback: () => unknown, label?: string): void\n locale: {\n register(namespace: string, dicts: { zh: Record<string, string>; en: Record<string, string> }): unknown\n bind(namespace: string): Translate\n }\n inject(services: string[], callback: (scoped: SlotsHost) => void): void\n}\n\n/** 设置分区需要的宿主能力面(插槽注册)。 */\ninterface SlotsHost {\n slots: {\n inject(name: string, register: () => unknown): void\n register(meta: Record<string, unknown>, render: () => unknown): unknown\n }\n}\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, DICT), 'prompt-customizer: locale')\n const t = ctx.locale.bind(NS)\n\n // 注册为独立的设置分区(侧边栏菜单项),面板只出现在「提示词定制」下,\n // 而不是作为卡片塞进「插件」设置列表。配置读写走插件自有路由(宿主端的\n // config.yaml),不再依赖 settings 传输层。\n ctx.inject(['slots'], (scoped) => {\n scoped.slots.inject('settings.section', () => scoped.slots.register({\n name: 'settings.section',\n id: 'prompt-customizer',\n order: 50,\n label: () => t('nav'),\n locale: NS,\n inject: () => ({ t }),\n }, () => h(Panel, { t })))\n })\n}\n\n// ── 根面板 ────────────────────────────────────────────────────────────────\n\n/**\n * 面板根组件:拉取配置与清单、维护 Tab 状态,把各 Tab 子视图装配起来。\n * 配置来自插件自有 /config 路由;清单来自 /inventory,可通过「刷新」按钮\n * 手动重取。提示词/工具 Tab 的编辑只改内存草稿,由「保存」按钮经\n * /config/apply 一次写盘(写错的配置不点保存就不会进文件)。\n */\n\n/** 可编辑的配置字段(含每阶段独立段屏蔽名单)。 */\ntype EditField = 'sections' | 'sectionsBootstrap' | 'sectionsCompaction' | 'replace' | 'inject' | 'tools'\n\n/** 编辑域草稿:提示词/工具 Tab 共享的未保存字段 + 脏标记。\n * 只记录用户实际编辑过的字段(首次编辑只写那一项),保存时也只提交这些\n * 字段 —— 未编辑的字段继续回落全局 / 继承,避免一次保存冻结全部继承值。 */\ninterface EditDraft {\n sections?: Config['sections']\n sectionsBootstrap?: Config['sectionsBootstrap']\n sectionsCompaction?: Config['sectionsCompaction']\n replace?: Config['replace']\n inject?: Config['inject']\n tools?: Config['tools']\n dirty: boolean\n}\n\nfunction Panel({ t }: { t: Translate }): ReactElement {\n const [cfg, setCfg] = useState<Config | null>(null)\n const [inv, setInv] = useState<Inventory | null>(null)\n // 三阶段预览装配:模型视角的唯一数据源(加载中为 null)。\n const [phases, setPhases] = useState<PhaseViews | null>(null)\n const [agentPresets, setAgentPresets] = useState<AgentPresetInfo[]>([])\n const [tab, setTab] = useState<'sections' | 'tools' | 'presets' | 'preview'>('sections')\n const [error, setError] = useState<string | null>(null)\n const [refreshId, setRefreshId] = useState(0)\n // 编辑目标:undefined = 全局默认;字符串 = agent 预设 id(字段级 override)。\n const [target, setTarget] = useState<string | undefined>(undefined)\n // 配置写入计数:每次成功写配置后 +1,驱动 PreviewTab 重载。\n // (以下 hooks 必须在任何提前 return 之前声明 —— hooks 顺序不能随加载状态变化。)\n const [version, setVersion] = useState(0)\n // 编辑域草稿:null = 无草稿(Tab 显示磁盘值)。提示词 ↔ 工具切换保留;\n // 切到预设/预览 Tab 或切换编辑目标时丢弃(脏草稿先经确认)。\n const [draft, setDraft] = useState<EditDraft | null>(null)\n const [saving, setSaving] = useState(false)\n const [flash, setFlash] = useState<string | null>(null)\n const [flashKind, setFlashKind] = useState<'ok' | 'err'>('ok')\n const flashTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const load = (): void => {\n fetch(CONFIG_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'config failed')\n setCfg(body.config as Config)\n setError(null)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n useEffect(load, [])\n\n const refresh = (): void => {\n const qs = target ? `?scope=${encodeURIComponent(target)}` : ''\n // 三阶段预览并行拉取:提示词 / 工具 / 预览三个 Tab 全部以这套装配结果\n // 为唯一数据源 —— 静态清单只是注册表视角(不含伪 agent 阶段裁剪、\n // pre-step 注入等运行时规则),与它保持一致才是\"所见即模型所见\"。\n // 三个阶段部分恒定显示(预设没有某个阶段时该部分只是空的),\n // 不再按 (段, 工具) 签名去重折叠。\n const params = (phase: string): string =>\n `${qs}${qs ? '&' : '?'}phase=${phase}&t=${Date.now()}`\n const grab = (phase: string): Promise<Preview | null> =>\n fetch(PREVIEW_URL + params(phase))\n .then((r) => r.json())\n .then((body: Preview) => (body?.ok === false ? null : body))\n .catch(() => null)\n // 「本系统全部提示词/工具」面板是全局注册表,永不随编辑目标切换 ——\n // 清单请求不带 scope,三阶段预览仍带 scope(作为该预设的真实装配)。\n Promise.all([...VIEW_KEYS.map(grab), fetch(INVENTORY_URL).then((r) => r.json())])\n .then(([boot, comp, act, inventoryData]) => {\n setPhases({ bootstrap: boot, compaction: comp, active: act })\n setInv(inventoryData as Inventory)\n setError(null)\n setRefreshId((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n // 挂载时与切换编辑目标后:清单与三阶段预览切到对应 scope。\n // version 入依赖:保存/写配置成功后 +1,驱动三阶段预览重新拉取\n // (PreviewTab 的数据源是 phases,不重拉就会一直显示保存前的装配)。\n useEffect(refresh, [target, version])\n\n // 枚举已安装的 agent 预设(roster 实时读取),给目标选择器与预览选择器供货。\n // 抽成函数:保存预设成功后也要立即刷新目标下拉。\n const fetchPresets = (): void => {\n fetch(AGENT_PRESETS_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => setAgentPresets(Array.isArray(body?.presets) ? body.presets as AgentPresetInfo[] : []))\n .catch(() => setAgentPresets([]))\n }\n useEffect(() => { fetchPresets() }, [])\n\n if (cfg === null) {\n return h('div', { style: s.muted }, t('loading'))\n }\n\n // 保存成功/失败后的短促闪示消息(3 秒自动消失;err 用红色样式)。\n const showFlash = (text: string, kind: 'ok' | 'err' = 'ok'): void => {\n if (flashTimer.current !== null) clearTimeout(flashTimer.current)\n setFlash(text)\n setFlashKind(kind)\n flashTimer.current = setTimeout(() => setFlash(null), 3200)\n }\n\n // 编辑视图:草稿存在时以草稿覆盖对应字段(提示词/工具 Tab 的共享编辑域)。\n // 草稿只含用户实际编辑过的字段,未编辑字段回落基线 —— 绝不把继承值\n // 冻结进 override。\n const base = editView(cfg, target)\n const view: Config = draft\n ? {\n ...base,\n sections: draft.sections ?? base.sections,\n sectionsBootstrap: draft.sectionsBootstrap ?? base.sectionsBootstrap,\n sectionsCompaction: draft.sectionsCompaction ?? base.sectionsCompaction,\n replace: draft.replace ?? base.replace,\n inject: draft.inject ?? base.inject,\n tools: draft.tools ?? base.tools,\n }\n : base\n\n const writeField = (field: string, value: unknown): void => {\n const url = value === undefined ? CONFIG_UNSET_URL : CONFIG_SET_URL\n fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ field, value }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'write failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n\n // 提示词/工具 Tab 的写入:只改内存草稿,不落盘。草稿只记录被编辑的\n // 这一个字段(不携带其余字段的继承值)—— 保存时也只会提交编辑过的\n // 字段,未编辑字段继续回落全局 / 继承。target 缺省时写全局顶层;\n // 预设目标由 /config/apply 写 overrides[id](字段级接管语义在保存时生效)。\n const edit = (field: EditField, value: unknown): void => {\n setDraft((d) => ({\n ...(d ?? { dirty: false }),\n [field]: value,\n dirty: true,\n }))\n }\n\n // 统一保存:草稿里实际编辑过的字段一次 POST 到 /config/apply,成功后清\n // 草稿并采纳最新配置。失败时保留草稿(改完可以再试,不会丢)。\n const save = (): void => {\n if (draft === null || saving) return\n const EDITED_FIELDS = ['sections', 'sectionsBootstrap', 'sectionsCompaction', 'replace', 'inject', 'tools'] as const\n const patch: Record<string, unknown> = {}\n for (const field of EDITED_FIELDS) {\n if (Object.hasOwn(draft, field)) patch[field] = draft[field]\n }\n setSaving(true)\n fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'save failed')\n setCfg(body.config as Config)\n setDraft(null)\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('saveOk'))\n })\n .catch((e: unknown) => setError(`${t('saveFail')}: ${e instanceof Error ? e.message : String(e)}`))\n .finally(() => setSaving(false))\n }\n\n // 预设 Tab 的「应用」:显式意图直接落盘(不经草稿),完整补丁一次写入\n // 当前编辑目标(含每阶段独立名单与阶段工具目录)。调用点已在离开编辑域时\n // 清空草稿,不会有并发草稿写盘。\n const writePatch = (patch: ConfigPatch): void => {\n fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'apply failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n // 预设库(presets / activePreset)永远保持在全局字段,不分作用域。\n const writeGlobal = writeField\n // 提示词 Tab 解除继承自全局的屏蔽时使用的全局通道(与 writeGlobal 同源,\n // 收窄了字段类型以匹配 SectionsTab 的 prop 签名)。\n const writeGlobalField = writeField as (field: 'sections', value: unknown) => void\n\n // 切换 Tab:提示词 ↔ 工具是同一编辑域,草稿保留;切到预设/预览即离开\n // 编辑域,脏草稿经确认后丢弃。\n const switchTab = (next: 'sections' | 'tools' | 'presets' | 'preview'): void => {\n const leaving = (tab === 'sections' || tab === 'tools') && (next === 'presets' || next === 'preview')\n if (leaving) {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n setDraft(null)\n }\n setTab(next)\n }\n\n // 切换编辑目标:草稿基线随目标变化,脏草稿先经确认再丢弃。\n const switchTarget = (next: string | undefined): void => {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n setDraft(null)\n setTarget(next)\n }\n\n // 「存为预设」:把当前编辑内容(含未保存草稿)fork 成一个新的 agent 预设 ——\n // 宿主 authoring API 整体复制来源预设目录(组成文件 / 伴生 .mjs / 技能目录),\n // 同时把当前配置写进 overrides[name]。来源 = 当前编辑目标;全局目标由服务端\n // 回落到 roster 默认预设。名字非法 / 同名由服务端报错。\n // 返回是否成功,让配置 Tab 用面板内消息条提示(不再用 window.prompt / 顶部按钮)。\n const saveAsPreset = (presetName: string): Promise<boolean> => {\n const name = presetName.trim()\n if (name.length === 0) return Promise.resolve(false)\n return fetch(PRESETS_CREATE_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n name,\n from: target,\n config: {\n sections: view.sections ?? [],\n sectionsBootstrap: view.sectionsBootstrap ?? [],\n sectionsCompaction: view.sectionsCompaction ?? [],\n replace: view.replace ?? {},\n inject: view.inject ?? [],\n tools: view.tools ?? {},\n },\n }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? t('saveAsPresetFail'))\n load()\n fetchPresets()\n showFlash(t('saveAsPresetOk'), 'ok')\n return true\n })\n .catch((e: unknown) => {\n showFlash(`${t('saveAsPresetFail')}:${String(e instanceof Error ? e.message : e)}`, 'err')\n return false\n })\n }\n\n return h('div', { style: s.root }, [\n h('div', { style: s.bar }, [\n h('button', { style: tab === 'sections' ? s.tabActive : s.tab, onClick: () => switchTab('sections') }, t('tabsSections')),\n h('button', { style: tab === 'tools' ? s.tabActive : s.tab, onClick: () => switchTab('tools') }, t('tabsTools')),\n h('button', { style: tab === 'presets' ? s.tabActive : s.tab, onClick: () => switchTab('presets') }, t('tabsPresets')),\n h('button', { style: tab === 'preview' ? s.tabActive : s.tab, onClick: () => switchTab('preview') }, t('tabsPreview')),\n h('select', {\n style: { ...s.input, marginLeft: 6 },\n value: target ?? '',\n onChange: (e: { target: { value: string } }) => switchTarget(e.target.value || undefined),\n title: t('targetHint'),\n }, [\n h('option', { value: '', style: s.option }, t('targetGlobal')),\n ...agentPresets.map((p) => h('option', { key: p.id, value: p.id, style: s.option },\n `${p.name}${p.broken ? ` (${t('broken')})` : ''}`)),\n ]),\n h('button', {\n style: draft?.dirty ? s.saveBtnDirty : s.saveBtn,\n disabled: !draft?.dirty || saving,\n onClick: save,\n }, t('save')),\n h('button', { style: s.refresh, onClick: refresh }, t('refresh')),\n ]),\n error ? h('div', { style: s.error }, String(error)) : null,\n flash ? h('div', { style: flashKind === 'err' ? s.error : s.noticeOk }, flash) : null,\n target && agentPresets.find((p) => p.id === target)?.broken\n ? h('div', { style: s.error }, t('brokenPreset'))\n : null,\n inv?.scopeResolved === false\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n tab === 'sections'\n ? h(SectionsTab, {\n cfg: view,\n inv,\n phases,\n target,\n globalSections: cfg.sections,\n ownedSections: target ? cfg.overrides?.[target]?.sections : undefined,\n t,\n write: edit,\n writeGlobalField,\n })\n : tab === 'tools'\n ? h(ToolsTab, { cfg: view, inv, phases, t, write: edit })\n : tab === 'presets'\n ? h(PresetsTab, {\n cfg: view,\n inv,\n phases,\n t,\n writePatch,\n writeGlobal,\n saveAsPreset,\n forkSource: target ? (agentPresets.find((p) => p.id === target)?.name ?? target) : undefined,\n })\n : h(PreviewTab, { t, active: tab === 'preview', refreshId, target, version, phases }),\n ])\n}\n"],"mappings":"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"}