dsh-plugin-prompt-tool 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -9
- package/engine/anchor-match.mjs +38 -12
- package/engine/anchor-turn.mjs +68 -0
- package/engine/classify-task.mjs +35 -0
- package/engine/code-presentation.mjs +103 -0
- package/engine/compositions/library/anchor-turn.yml +10 -0
- package/engine/compositions/library/bootstrap-filesystem.yml +1 -1
- package/engine/compositions/library/code-presentation.yml +8 -0
- package/engine/compositions/library/command-goal.yml +11 -0
- package/engine/compositions/library/compaction.yml +1 -1
- package/engine/compositions/library/context-gate.yml +1 -2
- package/engine/compositions/library/cot-drip.yml +11 -0
- package/engine/compositions/library/custom-bash.yml +1 -1
- package/engine/compositions/library/delegation.yml +11 -7
- package/engine/compositions/library/deliberation-gate.yml +11 -0
- package/engine/compositions/library/persistent-shell.yml +25 -2
- package/engine/compositions/library/persona.yml +6 -2
- package/engine/compositions/library/planning.yml +1 -1
- package/engine/compositions/library/prompt-config-engine.yml +1 -1
- package/engine/compositions/library/run-code-env.yml +1 -1
- package/engine/compositions/library/skill-filesystem.yml +1 -1
- package/engine/compositions/library/skill-search.yml +1 -1
- package/engine/compositions/library/str-replace-editor.yml +2 -2
- package/engine/compositions/library/tool-ask-user.yml +1 -1
- package/engine/compositions/library/tool-bash.yml +1 -1
- package/engine/compositions/library/tool-bootstrap.yml +1 -3
- package/engine/compositions/library/tool-config-engine.yml +9 -0
- package/engine/compositions/library/tool-filter.yml +3 -7
- package/engine/compositions/library/tool-fs-search.yml +1 -1
- package/engine/compositions/library/tool-fs.yml +1 -1
- package/engine/compositions/library/tool-goal.yml +1 -9
- package/engine/compositions/library/tool-jobs.yml +1 -1
- package/engine/compositions/library/tool-pwsh.yml +1 -1
- package/engine/compositions/library/tool-todo.yml +1 -1
- package/engine/compositions/library/tool-web.yml +2 -2
- package/engine/compositions/source/local/code-presentation.yml +8 -0
- package/engine/compositions/source/local/context-gate.yml +0 -1
- package/engine/compositions/source/local/str-replace-editor.yml +10 -0
- package/engine/compositions/source/local/tool-bootstrap.yml +1 -3
- package/engine/compositions/source/local/tool-config-engine.yml +9 -0
- package/engine/compositions/source/local/tool-filter.yml +8 -0
- package/engine/cot-drip.mjs +137 -0
- package/engine/custom-bash.mjs +73 -21
- package/engine/deliberation-gate.mjs +127 -0
- package/engine/layers.mjs +223 -198
- package/engine/run-code-env.mjs +8 -2
- package/engine/schema.mjs +1 -1
- package/engine/strategies.mjs +25 -14
- package/engine/tool-bootstrap.mjs +185 -59
- package/engine/tool-config-engine.mjs +390 -0
- package/lib/client.js +3840 -2311
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +185 -79
- package/lib/index.mjs +1000 -356
- package/lib/preset-core.d.mts +1 -1
- package/lib/preset-core.mjs +29 -3
- package/lib/{prompt-configs-BgFw_bFf.mjs → prompt-configs-BnQKRHVb.mjs} +211 -136
- package/lib/prompt-configs-CN0sJTUL.d.mts +193 -0
- package/package.json +121 -105
- package/preset/anchored/preset.yml +262 -308
- package/preset/creative/preset.yml +34 -32
- package/preset/custom/preset.yml +0 -1
- package/preset/liangshen/preset.yml +53 -50
- package/preset/minimal/preset.yml +18 -17
- package/preset/ptc/preset.yml +35 -33
- package/preset/standard/preset.yml +34 -32
- package/templates/10-pre-step.yml +18 -15
- package/templates/14-first-turn-anchor.yml +13 -13
- package/templates/15-guide-auto.yml +13 -13
- package/templates/16-custom-fallback.yml +19 -18
- package/templates/18-placeholder-env-facts.yml +13 -2
- package/templates/30-runtime-context.yml +3 -0
- package/templates/40-agent-request.yml +9 -9
- package/templates/60-tool-pipeline.yml +9 -8
- package/templates/tools/10-shell-command.yml +20 -0
- package/templates/tools/20-http-fetch.yml +24 -0
- package/templates/tools/30-fs-read.yml +20 -0
- package/templates/tools/40-delegate-character.yml +15 -0
- package/templates/tools/50-delegate-worldbook.yml +15 -0
- package/templates/tools/60-delegate-session-var.yml +15 -0
- package/templates/tools/70-delegate-worldbook-upsert.yml +36 -0
- package/lib/prompt-configs-B4vH09wx.d.mts +0 -100
- package/templates/11-merged-a.yml +0 -11
- package/templates/13-anchor.yml +0 -19
- package/templates/17-instruction-hint.yml +0 -23
- package/templates/19-placeholder-skill-catalog.yml +0 -19
- package/templates/31-runtime-context-placeholder.yml +0 -18
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["record","useState","useRef","useCallback","useState","styles","useId","styles","isValidElement","cloneElement","useState","IconChevronDownOutline14","useState","styles","useRef","styles","useState","useState","useRef","styles","IconChevronDownOutline14","useState","useRef","styles","IconCopyOutline16","IconFolderOpenOutline16","styles","useState","styles","IconChevronDownOutline14","ui","ui","useState","useRef","ui","IconFolderOpenOutline16","IconTrashOutline16","ui","css","useState","useMemo","useSyncExternalStore","css","css","createRoot"],"sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/client/tab-key.ts","../src/shared/bridge-contract.ts","../src/client/prompt-tool-bridge.ts","../src/client/prompt-tool-store.ts","../src/client/textarea-resize.ts","../src/client/TagInput.tsx","../src/client/PromptConfigCard.tsx","../src/client/PromptConfigList.tsx","../src/client/TemplatePicker.tsx","../src/client/useTemplatePicker.ts","../src/client/PromptConfigsEditor.tsx","../src/client/PresetSwitcher.tsx","../src/client/ToggleRow.tsx","../src/client/CollapsibleCard.tsx","../src/client/SettingInputRow.tsx","../src/client/PresetsPage.tsx","../src/client/character-card.ts","../src/client/CharactersPage.tsx","../src/client/PromptWorkspace.tsx","../src/client/host-surface.ts","../src/client/sidebar-entry.ts","../src/client/workspace-controller.ts","../src/client/workspace-mount.tsx","../src/client/index.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/** ARIA tabs 键盘导航:左右切换、Home/End 跳首尾(顶层页、技能筛选、内容资产 tab 共用)。 */\nimport type { KeyboardEvent as ReactKeyboardEvent } from 'react'\n\nexport function tabKeyHandler<T>(\n items: readonly T[],\n current: T,\n onSelect: (item: T) => void,\n): (event: ReactKeyboardEvent<HTMLElement>) => void {\n return (event) => {\n const index = items.indexOf(current)\n if (index < 0) return\n let next: number | undefined\n if (event.key === 'ArrowRight') next = (index + 1) % items.length\n else if (event.key === 'ArrowLeft') next = (index - 1 + items.length) % items.length\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = items.length - 1\n if (next === undefined) return\n event.preventDefault()\n onSelect(items[next]!)\n }\n}\n","/**\n * settings bridge 跨端契约(host 注册 / client 消费的唯一来源)。\n * 铁律:11 端点载荷统一成功 `{ ok: true, value }`、失败 `{ ok: false, code?, message? }`;\n * 端点附加字段只能以 value 旁的可选扩展字段出现(describe)。\n * 改路径或载荷形状必须同步更新 test/shared/bridge-contract.test.mjs。\n */\nexport const SETTINGS_BRIDGE_PREFIX = '/api/prompt-tool/settings'\n\n/** 22 个桥端点路径(相对前缀)。新增端点必须同时登记到契约测试。 */\nexport const BRIDGE_ENDPOINTS = {\n meta: '/meta',\n describe: '/describe',\n models: '/models',\n mutate: '/mutate',\n configsValidate: '/configs-validate',\n skillFix: '/skill-fix',\n templates: '/templates',\n promptConfigs: '/prompt-configs',\n presetContent: '/preset-content',\n importPreset: '/import-preset',\n paramOverrides: '/param-overrides',\n presetVariables: '/preset-variables',\n importPresetPackage: '/import-preset-package',\n exportPreset: '/export-preset',\n presetDelete: '/preset-delete',\n presetClone: '/preset-clone',\n presetDuplicate: '/preset-duplicate',\n presetOpen: '/preset-open',\n charactersImport: '/characters-import',\n charactersList: '/characters-list',\n charactersDelete: '/characters-delete',\n charactersApply: '/characters-apply',\n charactersRemove: '/characters-remove',\n} as const\n\nexport type BridgeEndpoint = (typeof BRIDGE_ENDPOINTS)[keyof typeof BRIDGE_ENDPOINTS]\n\n/** 失败载荷:两端共用。 */\nexport type BridgeErrorPayload = { ok: false; code?: string; message?: string }\n","/** settings bridge 客户端传输与载荷解析层(无 react 依赖;UI 状态见 prompt-tool-store)。 */\nimport type { PromptConfigDraft, EngineMeta } from './prompt-tool-types.ts'\nimport { SETTINGS_BRIDGE_PREFIX, type BridgeErrorPayload } from '../shared/bridge-contract.ts'\n\nexport interface BridgeSettingsView { ns: string; value: unknown; base?: unknown; revision: number }\nexport type BridgeResult<T> = { ok: true; value: T; providers?: string[]; modelCatalog?: Record<string, string[]>; activeSkillsDirs?: string[]; skillCatalog?: SkillCatalogEntry[]; templatePreStepCount?: number; presetParams?: Record<string, unknown>; hostDefaultModel?: { provider?: string; model?: string; reasoningEffort?: string } } | BridgeErrorPayload\n\n/** 宿主默认模型回显(agent-default-model settings:provider/model/reasoningEffort;插件参数未设置 = 继承宿主)。 */\nexport interface HostDefaultModel {\n provider?: string\n model?: string\n reasoningEffort?: string\n}\n\nexport interface SkillCatalogEntry {\n folder: string\n name: string\n description: string\n valid: boolean\n /** 来源技能目录绝对路径。 */\n dir?: string\n /** 同名标记:多目录存在相同 folder 时 UI 标注。 */\n duplicate?: boolean\n issue?: string\n modelInvocable: boolean\n userInvocable: boolean\n}\n\nexport interface Fields {\n promptText: string\n promptPath: string\n agentsText: string\n agentsPath: string\n injectAgentsPrompt: boolean\n firstTurnAnchor: boolean\n firstTurnText: string\n firstTurnCustom: boolean\n guideText: string\n guideCustom: boolean\n modelProvider: string\n modelName: string\n subagentModelProvider: string\n subagentModelName: string\n modelReasoningEffort: string\n modelTemperature: string\n modelMaxTokens: string\n subagentReasoningEffort: string\n subagentTemperature: string\n subagentMaxTokens: string\n subagentPersona: string\n toolFilterAllow: string\n toolFilterDeny: string\n maxDepth: string\n allowKinds: string\n firstTurnWord: string\n bootstrapMaxTokens: number\n usePtcMode: boolean\n injectPrompt: boolean\n skillSwitches: Record<string, boolean>\n skillOrder: string[]\n skillCatalog: SkillCatalogEntry[]\n /** 用户技能目录列表(按添加顺序);空 = 默认副本。 */\n skillsDirs: string[]\n /** 实际生效目录列表(空配置 = [默认副本路径])。 */\n activeSkillsDirs: string[]\n /** 生效目录存在性(path → 是否存在)。 */\n skillsDirExists: Record<string, boolean>\n skillRankBase: number\n residentAgentsPath: string\n presetDir: string\n presetOrder: number\n fallbackText: string\n writeAgents: boolean\n writePreset: boolean\n presetTemplate: string\n promptConfigs: PromptConfigDraft[]\n}\n\nexport const EMPTY_META: EngineMeta = {\n layers: [],\n strategies: [],\n slotKinds: [],\n positions: [],\n dedupes: [],\n promotions: [],\n audienceModes: [],\n modelScopes: [],\n roles: [],\n mergeModes: [],\n fills: [],\n layerFieldPolicies: {},\n layerLabels: {},\n}\nexport const EMPTY_FIELDS: Fields = {\n promptText: '',\n promptPath: '',\n agentsText: '',\n agentsPath: '',\n injectAgentsPrompt: false,\n firstTurnAnchor: false,\n firstTurnText: '',\n firstTurnCustom: false,\n guideText: '',\n guideCustom: false,\n modelProvider: '',\n modelName: '',\n subagentModelProvider: '',\n subagentModelName: '',\n modelReasoningEffort: '',\n modelTemperature: '',\n modelMaxTokens: '',\n subagentReasoningEffort: '',\n subagentTemperature: '',\n subagentMaxTokens: '',\n subagentPersona: '',\n toolFilterAllow: '',\n toolFilterDeny: '',\n maxDepth: '',\n allowKinds: '',\n firstTurnWord: '',\n bootstrapMaxTokens: 0,\n usePtcMode: true,\n injectPrompt: true,\n skillSwitches: {},\n skillOrder: [],\n skillCatalog: [],\n skillsDirs: [],\n activeSkillsDirs: [],\n skillsDirExists: {},\n skillRankBase: 250,\n residentAgentsPath: '',\n presetDir: '',\n presetOrder: 5,\n fallbackText: '',\n writeAgents: true,\n writePreset: true,\n presetTemplate: 'anchored',\n promptConfigs: [],\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n\nconst readString = (source: Record<string, unknown>, key: string): string | undefined => {\n const value = source[key]\n return typeof value === 'string' ? value : undefined\n}\n\nconst readStringArray = (source: Record<string, unknown>, key: string): string[] => {\n const value = source[key]\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : []\n}\n\nconst readBoolean = (source: Record<string, unknown>, key: string, fallback: boolean): boolean => {\n const value = source[key]\n return typeof value === 'boolean' ? value : fallback\n}\n\nconst readNumber = (source: Record<string, unknown>, key: string, fallback: number): number => {\n const value = source[key]\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : fallback\n}\n\nconst readSkillSwitches = (source: Record<string, unknown>, key: string): Record<string, boolean> => {\n const value = source[key]\n if (value === null || typeof value !== 'object') return {}\n const entries = Object.entries(value as Record<string, unknown>)\n const result: Record<string, boolean> = {}\n for (const [name, enabled] of entries) {\n if (typeof enabled === 'boolean') result[name] = enabled\n }\n return result\n}\n\nconst readSkillCatalog = (source: Record<string, unknown>, key: string): SkillCatalogEntry[] => {\n const value = source[key]\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (entry === null || typeof entry !== 'object') return []\n const record = entry as Record<string, unknown>\n const folder = readString(record, 'folder')\n const name = readString(record, 'name')\n if (folder === undefined || name === undefined) return []\n return [{\n folder,\n name,\n description: readString(record, 'description') ?? '',\n // 向后兼容旧宿主:旧版 /describe 只返回 folder/name/description(且旧扫描\n // 已过滤非法名),缺字段按旧语义默认 true;新版宿主显式携带 valid=false。\n valid: readBoolean(record, 'valid', true),\n ...(typeof record.dir === 'string' && record.dir.length > 0 ? { dir: record.dir } : {}),\n ...(record.duplicate === true ? { duplicate: true } : {}),\n ...(typeof record.issue === 'string' && record.issue.length > 0 ? { issue: record.issue } : {}),\n modelInvocable: readBoolean(record, 'modelInvocable', true),\n userInvocable: readBoolean(record, 'userInvocable', true),\n }]\n })\n}\n\nconst readPromptConfigs = (source: Record<string, unknown>, key: string): PromptConfigDraft[] => {\n const value = source[key]\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (entry === null || typeof entry !== 'object') return []\n const record = entry as Record<string, unknown>\n return typeof record.id === 'string' && record.id.length > 0 ? [entry as PromptConfigDraft] : []\n })\n}\n\nexport const errorMessage = (error: unknown): string => error instanceof Error ? error.message : String(error)\n\nexport async function bridgePost<T>(path: string, body: unknown): Promise<BridgeResult<T>> {\n try {\n const response = await fetch(SETTINGS_BRIDGE_PREFIX + path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n })\n const payload = await response.json() as unknown\n if (payload !== null && typeof payload === 'object') return payload as BridgeResult<T>\n return { ok: false, message: 'settings bridge unavailable' }\n } catch (error) {\n return { ok: false, message: errorMessage(error) }\n }\n}\n\nexport function fieldsFromView(res: BridgeResult<BridgeSettingsView>): Fields {\n const ns = res.ok ? res.value : undefined\n const value = asRecord(ns?.value)\n const base = asRecord(ns?.base)\n const next: Fields = {\n promptText: readString(value, 'promptText') ?? readString(base, 'promptText') ?? '',\n promptPath: readString(value, 'promptPath') ?? readString(base, 'promptPath') ?? '',\n agentsText: readString(value, 'agentsText') ?? readString(base, 'agentsText') ?? '',\n agentsPath: readString(value, 'agentsPath') ?? readString(base, 'agentsPath') ?? '',\n injectAgentsPrompt: readBoolean(value, 'injectAgentsPrompt', readBoolean(base, 'injectAgentsPrompt', false)),\n firstTurnAnchor: readBoolean(value, 'firstTurnAnchor', readBoolean(base, 'firstTurnAnchor', false)),\n firstTurnText: readString(value, 'firstTurnText') ?? readString(base, 'firstTurnText') ?? '',\n firstTurnCustom: readBoolean(value, 'firstTurnCustom', readBoolean(base, 'firstTurnCustom', false)),\n guideText: readString(value, 'guideText') ?? readString(base, 'guideText') ?? '',\n guideCustom: readBoolean(value, 'guideCustom', readBoolean(base, 'guideCustom', false)),\n modelProvider: readString(value, 'modelProvider') ?? readString(base, 'modelProvider') ?? '',\n modelName: readString(value, 'modelName') ?? readString(base, 'modelName') ?? '',\n subagentModelProvider: readString(value, 'subagentModelProvider') ?? readString(base, 'subagentModelProvider') ?? '',\n subagentModelName: readString(value, 'subagentModelName') ?? readString(base, 'subagentModelName') ?? '',\n modelReasoningEffort: readString(value, 'modelReasoningEffort') ?? readString(base, 'modelReasoningEffort') ?? '',\n modelTemperature: readString(value, 'modelTemperature') ?? readString(base, 'modelTemperature') ?? '',\n modelMaxTokens: readString(value, 'modelMaxTokens') ?? readString(base, 'modelMaxTokens') ?? '',\n subagentReasoningEffort: readString(value, 'subagentReasoningEffort') ?? readString(base, 'subagentReasoningEffort') ?? '',\n subagentTemperature: readString(value, 'subagentTemperature') ?? readString(base, 'subagentTemperature') ?? '',\n subagentMaxTokens: readString(value, 'subagentMaxTokens') ?? readString(base, 'subagentMaxTokens') ?? '',\n // 预设级参数(subagentPersona/toolFilterAllow/toolFilterDeny/maxDepth/allowKinds/firstTurnWord)\n // 不进 settings namespace:默认空,由 /param-overrides 读回后填充(store.load paramPatch)。\n subagentPersona: '',\n toolFilterAllow: '',\n toolFilterDeny: '',\n maxDepth: '',\n allowKinds: '',\n firstTurnWord: '',\n bootstrapMaxTokens: readNumber(value, 'bootstrapMaxTokens', readNumber(base, 'bootstrapMaxTokens', 0)),\n usePtcMode: readBoolean(value, 'usePtcMode', readBoolean(base, 'usePtcMode', true)),\n injectPrompt: readBoolean(value, 'injectPrompt', readBoolean(base, 'injectPrompt', true)),\n skillSwitches: value.skillSwitches !== undefined || base.skillSwitches !== undefined\n ? { ...readSkillSwitches(base, 'skillSwitches'), ...readSkillSwitches(value, 'skillSwitches') }\n : {},\n skillOrder: readStringArray(value, 'skillOrder').length > 0\n ? readStringArray(value, 'skillOrder')\n : readStringArray(base, 'skillOrder'),\n skillCatalog: res.ok && res.skillCatalog !== undefined && res.skillCatalog.length > 0\n ? res.skillCatalog\n : readSkillCatalog(value, 'skillCatalog').length > 0\n ? readSkillCatalog(value, 'skillCatalog')\n : readSkillCatalog(base, 'skillCatalog'),\n skillsDirs: readStringArray(value, 'skillsDirs').length > 0\n ? readStringArray(value, 'skillsDirs')\n : readStringArray(base, 'skillsDirs'),\n activeSkillsDirs: readStringArray(value, 'activeSkillsDirs').length > 0\n ? readStringArray(value, 'activeSkillsDirs')\n : readStringArray(base, 'activeSkillsDirs'),\n skillsDirExists: (() => {\n const merged: Record<string, boolean> = {}\n for (const entry of [value, base]) {\n const record = entry\n const exists = record.skillsDirExists\n if (exists !== null && typeof exists === 'object' && !Array.isArray(exists)) {\n Object.assign(merged, exists as Record<string, unknown>)\n }\n }\n const result: Record<string, boolean> = {}\n for (const [path, ok] of Object.entries(merged)) {\n if (typeof ok === 'boolean') result[path] = ok\n }\n return result\n })(),\n skillRankBase: readNumber(value, 'skillRankBase', readNumber(base, 'skillRankBase', 250)),\n residentAgentsPath: readString(value, 'residentAgentsPath') ?? readString(base, 'residentAgentsPath') ?? '',\n presetDir: readString(value, 'presetDir') ?? readString(base, 'presetDir') ?? '',\n presetOrder: readNumber(value, 'presetOrder', readNumber(base, 'presetOrder', 5)),\n fallbackText: readString(value, 'fallbackText') ?? readString(base, 'fallbackText') ?? '',\n writeAgents: readBoolean(value, 'writeAgents', readBoolean(base, 'writeAgents', true)),\n writePreset: readBoolean(value, 'writePreset', readBoolean(base, 'writePreset', true)),\n presetTemplate: readString(value, 'presetTemplate') ?? readString(base, 'presetTemplate') ?? 'anchored',\n promptConfigs: value.promptConfigs !== undefined\n ? readPromptConfigs(value, 'promptConfigs')\n : readPromptConfigs(base, 'promptConfigs'),\n }\n return next\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type {\n IApiClient,\n SettingsNamespaceView,\n SettingsPathOpView,\n} from '@deepseek-ai/dsh-client-connection/client'\nimport type { SettingsScope, SettingsScopeSnapshot } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { EngineMeta, PromptConfigDraft } from './prompt-tool-types.ts'\nimport {\n EMPTY_FIELDS,\n EMPTY_META,\n bridgePost,\n errorMessage,\n fieldsFromView,\n type BridgeResult,\n type BridgeSettingsView,\n type Fields,\n type HostDefaultModel,\n} from './prompt-tool-bridge.ts'\n\n/** rc8 ui-settings 共享镜像传输面:标准字段经官方 settingsScope 读写。 */\nexport interface PromptToolSettingsTransport {\n /** 宿主注册的 prompt-tool settings namespace 绑定。 */\n scope: SettingsScope<Record<string, unknown>>\n /** 触发一次共享 describe mirror 读取(idle 时才真正发 RPC)。 */\n ensure: () => Promise<void>\n /** 批量 path-op 写入;成功后已把应答 fold 回共享 mirror。 */\n mutate: (ops: SettingsPathOpView[], expectedRevision?: number) => Promise<SettingsNamespaceView>\n}\n\nexport interface SwitchSnapshot {\n injectAgentsPrompt: boolean\n firstTurnAnchor: boolean\n firstTurnText: string\n firstTurnCustom: boolean\n guideText: string\n guideCustom: boolean\n modelProvider: string\n modelName: string\n subagentModelProvider: string\n subagentModelName: string\n modelReasoningEffort: string\n modelTemperature: string\n modelMaxTokens: string\n subagentReasoningEffort: string\n subagentTemperature: string\n subagentMaxTokens: string\n bootstrapMaxTokens: number\n usePtcMode: boolean\n injectPrompt: boolean\n skillSwitches: Record<string, boolean>\n skillOrder: string[]\n skillsDirs: string[]\n skillRankBase: number\n residentAgentsPath: string\n presetDir: string\n presetOrder: number\n fallbackText: string\n writeAgents: boolean\n writePreset: boolean\n}\n\nconst EMPTY_SWITCHES: SwitchSnapshot = {\n injectAgentsPrompt: false,\n firstTurnAnchor: false,\n firstTurnText: '',\n firstTurnCustom: false,\n guideText: '',\n guideCustom: false,\n modelProvider: '',\n modelName: '',\n subagentModelProvider: '',\n subagentModelName: '',\n modelReasoningEffort: '',\n modelTemperature: '',\n modelMaxTokens: '',\n subagentReasoningEffort: '',\n subagentTemperature: '',\n subagentMaxTokens: '',\n bootstrapMaxTokens: 0,\n usePtcMode: true,\n injectPrompt: true,\n skillSwitches: {},\n skillOrder: [],\n skillsDirs: [],\n skillRankBase: 250,\n residentAgentsPath: '',\n presetDir: '',\n presetOrder: 5,\n fallbackText: '',\n writeAgents: true,\n writePreset: true,\n}\n\n/** 本项目默认不设上限时的显示值(adapter 默认 maxTokens)。 */\nconst DEFAULT_BOOTSTRAP_DISPLAY = '256000'\n\n/** 内容资产条目:preset.md(prompt-injector)/ agents.md(instruction-hint),\n * text 走生成目录文件通道,settings 覆盖层只存轻字段。 */\nconst isContentAsset = (config: PromptConfigDraft): boolean =>\n config.id === 'prompt-injector' || config.fill === 'instruction-hint'\n\n/** 剥离内容资产的 text(顶层 + params.text):settings 载荷不承载大文本。 */\nconst stripContentText = (config: PromptConfigDraft): PromptConfigDraft => {\n const next: PromptConfigDraft = { ...config }\n delete next.text\n if (next.params !== undefined) {\n const params = { ...next.params }\n delete params.text\n next.params = params\n }\n return next\n}\n\n/** 渲染产物 → 编辑草稿:内容资产条目的 params.text(生成目录文件内容)提升到 text 框显示。 */\nconst liftContentText = (config: PromptConfigDraft): PromptConfigDraft => {\n if (!isContentAsset(config)) return config\n if ((config.text ?? '') !== '') return config\n const text = typeof config.params?.text === 'string' ? config.params.text : ''\n return text.length > 0 ? { ...config, text } : config\n}\n\nexport const snapshotSwitches = (fields: Fields): SwitchSnapshot => ({\n injectAgentsPrompt: fields.injectAgentsPrompt,\n firstTurnAnchor: fields.firstTurnAnchor,\n firstTurnText: fields.firstTurnText,\n firstTurnCustom: fields.firstTurnCustom,\n guideText: fields.guideText,\n guideCustom: fields.guideCustom,\n modelProvider: fields.modelProvider,\n modelName: fields.modelName,\n subagentModelProvider: fields.subagentModelProvider,\n subagentModelName: fields.subagentModelName,\n modelReasoningEffort: fields.modelReasoningEffort,\n modelTemperature: fields.modelTemperature,\n modelMaxTokens: fields.modelMaxTokens,\n subagentReasoningEffort: fields.subagentReasoningEffort,\n subagentTemperature: fields.subagentTemperature,\n subagentMaxTokens: fields.subagentMaxTokens,\n bootstrapMaxTokens: fields.bootstrapMaxTokens,\n usePtcMode: fields.usePtcMode,\n injectPrompt: fields.injectPrompt,\n skillSwitches: { ...fields.skillSwitches },\n skillOrder: [...fields.skillOrder],\n skillsDirs: [...fields.skillsDirs],\n skillRankBase: fields.skillRankBase,\n residentAgentsPath: fields.residentAgentsPath,\n presetDir: fields.presetDir,\n presetOrder: fields.presetOrder,\n fallbackText: fields.fallbackText,\n writeAgents: fields.writeAgents,\n writePreset: fields.writePreset,\n})\n\nconst switchesEqual = (a: SwitchSnapshot, b: SwitchSnapshot): boolean =>\n a.injectAgentsPrompt === b.injectAgentsPrompt\n && a.firstTurnAnchor === b.firstTurnAnchor\n && a.firstTurnText === b.firstTurnText\n && a.firstTurnCustom === b.firstTurnCustom\n && a.guideText === b.guideText\n && a.guideCustom === b.guideCustom\n && a.modelProvider === b.modelProvider\n && a.modelName === b.modelName\n && a.subagentModelProvider === b.subagentModelProvider\n && a.subagentModelName === b.subagentModelName\n && a.modelReasoningEffort === b.modelReasoningEffort\n && a.modelTemperature === b.modelTemperature\n && a.modelMaxTokens === b.modelMaxTokens\n && a.subagentReasoningEffort === b.subagentReasoningEffort\n && a.subagentTemperature === b.subagentTemperature\n && a.subagentMaxTokens === b.subagentMaxTokens\n && a.bootstrapMaxTokens === b.bootstrapMaxTokens\n && a.usePtcMode === b.usePtcMode\n && a.injectPrompt === b.injectPrompt\n && JSON.stringify(a.skillSwitches) === JSON.stringify(b.skillSwitches)\n && JSON.stringify(a.skillOrder) === JSON.stringify(b.skillOrder)\n && JSON.stringify(a.skillsDirs) === JSON.stringify(b.skillsDirs)\n && a.skillRankBase === b.skillRankBase\n && a.residentAgentsPath === b.residentAgentsPath\n && a.presetDir === b.presetDir\n && a.presetOrder === b.presetOrder\n && a.fallbackText === b.fallbackText\n && a.writeAgents === b.writeAgents\n && a.writePreset === b.writePreset\n\nexport type SwitchKey = 'injectAgentsPrompt' | 'firstTurnAnchor' | 'firstTurnCustom' | 'guideCustom' | 'injectPrompt' | 'usePtcMode' | 'writeAgents' | 'writePreset'\n\n/** 参数类布尔开关:写激活预设 preset.yml(settings 只留全局开关)。 */\nconst PARAM_SWITCH_KEYS: ReadonlySet<SwitchKey> = new Set(['firstTurnAnchor', 'firstTurnCustom', 'guideCustom', 'injectPrompt', 'usePtcMode'])\n\nexport interface PromptToolStore {\n fields: Fields\n meta: EngineMeta\n loading: boolean\n providers: string[]\n modelCatalog: Record<string, string[]>\n hostDefaultModel?: HostDefaultModel\n bootstrapTokensDraft: string\n /** 新技能目录路径输入(多目录卡片:输入路径添加)。 */\n skillsDirDraft: string\n /** 当前预设模板消息批层(pre-step)配置数;0 = 模板无配置(入口开关联动关闭)。 */\n templatePreStepCount: number\n savedSwitches: SwitchSnapshot\n savedConfigs: PromptConfigDraft[]\n savingSkillsDir: boolean\n fixingSkill: string | undefined\n notice: string\n noticeKind: 'ok' | 'error'\n load: () => Promise<Fields>\n showNotice: (kind: 'ok' | 'error', message: string) => void\n patch: (partial: Partial<Fields>) => void\n persistSwitches: () => void\n persistParamOverrides: () => Promise<void>\n persistConfigs: (configs: PromptConfigDraft[]) => void\n /** 预设级模板变量(preset.yml 内容变量;writePreset 展开进 variables.yml,引擎合并进每条配置)。 */\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n /** 模板变量插值开关(preset.yml 顶层 variablesEnabled,缺省 true)。 */\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n /** 保存模板变量;可显式传入下一份值(如清空场景,避免 setState 未生效时的旧闭包)。 */\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n toggle: (key: SwitchKey) => void\n toggleBootstrapMaxTokens: () => void\n setPresetTemplate: (id: string) => void\n setBootstrapTokensDraft: (value: string) => void\n commitBootstrapTokensDraft: () => void\n setSkillsDirDraft: (value: string) => void\n /** 追加技能目录(按添加顺序;重复路径拒绝)。 */\n addSkillsDir: (dir: string) => void\n /** 移除技能目录引用(只删引用,不删原文件)。 */\n removeSkillsDir: (dir: string) => void\n toggleSkill: (folder: string) => void\n skillEnabled: (folder: string) => boolean\n fixSkill: (folder: string) => void\n /** 打开指定技能目录;不传 = 打开第一个生效目录。 */\n openSkillsDir: (path?: string) => Promise<void>\n dirtySwitches: boolean\n dirtyConfigs: boolean\n dirty: boolean\n}\n\n\n/** 等待共享 mirror 的首次应答离开 loading(ready/idle/unavailable 都会返回)。 */\nfunction waitForScope(scope: SettingsScope<Record<string, unknown>>): Promise<SettingsScopeSnapshot<Record<string, unknown>>> {\n const current = scope.getSnapshot()\n if (current.status !== 'loading') return Promise.resolve(current)\n return new Promise((resolve) => {\n let settled = false\n const dispose = scope.subscribe(() => {\n const next = scope.getSnapshot()\n if (next.status === 'loading') return\n if (settled) return\n settled = true\n dispose()\n resolve(next)\n })\n // 宿主 mirror 卡 loading 时兜底超时,避免 UI 永久 loading。\n setTimeout(() => {\n if (settled) return\n settled = true\n dispose()\n resolve(scope.getSnapshot())\n }, 5000)\n })\n}\n\n/** 把 rc8 scope 快照 + 自定义 /describe 的 runtime facts 组装成旧 BridgeResult 视图。 */\nfunction bridgeViewFromScope(\n snapshot: SettingsScopeSnapshot<Record<string, unknown>>,\n runtime: BridgeResult<BridgeSettingsView>,\n): BridgeResult<BridgeSettingsView> {\n if (snapshot.status !== 'ready' || snapshot.value === undefined) {\n return {\n ok: false,\n message: snapshot.status === 'unavailable'\n ? 'settings namespace \"prompt-tool\" is not exposed'\n : 'settings namespace \"prompt-tool\" is not ready',\n }\n }\n return {\n ok: true,\n value: {\n ns: 'prompt-tool',\n value: snapshot.value,\n base: snapshot.base,\n revision: snapshot.revision ?? 0,\n },\n providers: runtime.ok ? runtime.providers : undefined,\n modelCatalog: runtime.ok ? runtime.modelCatalog : undefined,\n activeSkillsDirs: runtime.ok ? runtime.activeSkillsDirs : undefined,\n skillCatalog: runtime.ok ? runtime.skillCatalog : undefined,\n templatePreStepCount: runtime.ok ? runtime.templatePreStepCount : undefined,\n hostDefaultModel: runtime.ok ? runtime.hostDefaultModel : undefined,\n }\n}\n\nexport function usePromptToolStore(api: IApiClient, settings: PromptToolSettingsTransport): PromptToolStore {\n const [providers, setProviders] = useState<string[]>([])\n const [modelCatalog, setModelCatalog] = useState<Record<string, string[]>>({})\n const [hostDefaultModel, setHostDefaultModel] = useState<HostDefaultModel | undefined>(undefined)\n const [fields, setFields] = useState<Fields>(EMPTY_FIELDS)\n const [meta, setMeta] = useState<EngineMeta>(EMPTY_META)\n const [bootstrapTokensDraft, setBootstrapTokensDraft] = useState(DEFAULT_BOOTSTRAP_DISPLAY)\n const [skillsDirDraft, setSkillsDirDraft] = useState('')\n const [templatePreStepCount, setTemplatePreStepCount] = useState(0)\n const [savedSwitches, setSavedSwitches] = useState<SwitchSnapshot>(EMPTY_SWITCHES)\n const [savedConfigs, setSavedConfigs] = useState<PromptConfigDraft[]>([])\n const [templateVariables, setTemplateVariables] = useState<Record<string, string>>({})\n const [templateVariablesEnabled, setTemplateVariablesEnabled] = useState(true)\n const [loading, setLoading] = useState(false)\n const [savingSkillsDir, setSavingSkillsDir] = useState(false)\n const [fixingSkill, setFixingSkill] = useState<string | undefined>(undefined)\n const [notice, setNotice] = useState('')\n const [noticeKind, setNoticeKind] = useState<'ok' | 'error'>('ok')\n const fieldsRef = useRef<Fields>(EMPTY_FIELDS)\n const revisionRef = useRef<number | undefined>(undefined)\n const saveQueueRef = useRef<Promise<void>>(Promise.resolve())\n const loadSeqRef = useRef(0)\n\n const showNotice = useCallback((kind: 'ok' | 'error', message: string) => {\n setNotice(message)\n setNoticeKind(kind)\n }, [])\n\n /** 模型目录惰性加载:独立于主 load(/describe 不再阻塞等模型查询)。 */\n const loadModels = useCallback(async (): Promise<void> => {\n const res = await bridgePost<{ modelCatalog: Record<string, string[]> }>('/models', {})\n if (res.ok) setModelCatalog(res.value.modelCatalog ?? {})\n }, [])\n\n const applyView = useCallback((res: BridgeResult<BridgeSettingsView>): Fields => {\n setTemplatePreStepCount(res.ok && typeof res.templatePreStepCount === 'number' ? res.templatePreStepCount : 0)\n setProviders(res.ok ? res.providers ?? [] : [])\n setModelCatalog(res.ok ? res.modelCatalog ?? {} : {})\n setHostDefaultModel(res.ok ? res.hostDefaultModel : undefined)\n const next = fieldsFromView(res)\n // 引擎参数按预设存储(激活预设 preset.yml):settings 不再承载,\n // 参数键由 /describe 的 presetParams 合并(类型匹配键覆盖,其余保持)。\n if (res.ok && res.presetParams !== undefined) {\n const params = res.presetParams\n const nextRecord = next as unknown as Record<string, unknown>\n for (const key of Object.keys(params)) {\n const value = params[key]\n if (value === undefined || value === null || key === 'promptConfigs') continue\n const current = nextRecord[key]\n if (current === undefined) continue\n if (typeof current === 'boolean' && typeof value === 'boolean') {\n nextRecord[key] = value\n } else if (typeof current === 'number' && typeof value === 'number') {\n nextRecord[key] = value\n } else if (typeof current === 'string' && typeof value === 'string') {\n nextRecord[key] = value\n }\n }\n }\n // 检测到 DeepSeek 路由且用户未设置服务商时,直接预选第一个检测到的 provider\n // (模型名为空则路由不激活,继承主会话语义不变;用户后续选择模型名即生效)。\n if (res.ok && next.modelProvider === '' && (res.providers?.length ?? 0) > 0) {\n next.modelProvider = res.providers![0]!\n }\n // 子代理服务商同样预选:模型名为空则固定路由不激活(继承主会话),仅让模型名下拉有候选。\n if (res.ok && next.subagentModelProvider === '' && (res.providers?.length ?? 0) > 0) {\n next.subagentModelProvider = res.providers![0]!\n }\n fieldsRef.current = next\n setFields(next)\n setBootstrapTokensDraft(next.bootstrapMaxTokens > 0 ? String(next.bootstrapMaxTokens) : DEFAULT_BOOTSTRAP_DISPLAY)\n setSkillsDirDraft('')\n setSavedSwitches(snapshotSwitches(next))\n setSavedConfigs(next.promptConfigs)\n if (res.ok) revisionRef.current = res.value.revision\n return next\n }, [])\n\n const load = useCallback(async () => {\n // 并发保护:慢的旧请求不得覆盖新请求(last-good 语义保留旧数据)。\n const seq = ++loadSeqRef.current\n setLoading(true)\n try {\n const metaRes = await bridgePost<{ meta: EngineMeta }>('/meta', {})\n if (seq !== loadSeqRef.current) return EMPTY_FIELDS\n if (metaRes.ok) setMeta(metaRes.value.meta)\n // 自定义 /describe 只用于拿到 live runtime facts(DeepSeek 检测、技能目录快照),\n // 标准 settings 分层数据来自 rc8 共享 describe mirror 的 scope。\n const runtime = await bridgePost<BridgeSettingsView>('/describe', {})\n await settings.ensure()\n const snapshot = await waitForScope(settings.scope)\n const res = bridgeViewFromScope(snapshot, runtime)\n if (seq !== loadSeqRef.current) return EMPTY_FIELDS\n if (!res.ok) {\n showNotice('error', '读取配置失败:' + (res.message ?? ''))\n return EMPTY_FIELDS\n }\n applyView(res)\n // 用户参数覆盖(生成目录 prompt-tool.overrides.yml;settings 不再承载参数)。\n const overridesRes = await bridgePost<{ overrides: Record<string, unknown> }>('/param-overrides', {})\n if (seq !== loadSeqRef.current) return EMPTY_FIELDS\n if (overridesRes.ok) {\n const o = overridesRes.value.overrides\n const paramPatch: Partial<Fields> = {}\n if (typeof o.firstTurnAnchor === 'boolean') paramPatch.firstTurnAnchor = o.firstTurnAnchor\n if (typeof o.firstTurnText === 'string') paramPatch.firstTurnText = o.firstTurnText\n if (typeof o.firstTurnCustom === 'boolean') paramPatch.firstTurnCustom = o.firstTurnCustom\n if (typeof o.guideText === 'string') paramPatch.guideText = o.guideText\n if (typeof o.guideCustom === 'boolean') paramPatch.guideCustom = o.guideCustom\n if (typeof o.modelProvider === 'string') paramPatch.modelProvider = o.modelProvider\n if (typeof o.modelName === 'string') paramPatch.modelName = o.modelName\n if (typeof o.subagentModelProvider === 'string') paramPatch.subagentModelProvider = o.subagentModelProvider\n if (typeof o.subagentModelName === 'string') paramPatch.subagentModelName = o.subagentModelName\n // 模型参数三件套(主对话 + 子代理):引擎按这些 params 生成 model-params\n // 配置(agent-request patch),UI 侧统一在「模型设置」卡片编辑显示,\n // 不依赖模块列表里的 model-params 卡片。\n if (typeof o.modelReasoningEffort === 'string') paramPatch.modelReasoningEffort = o.modelReasoningEffort\n if (typeof o.modelTemperature === 'string') paramPatch.modelTemperature = o.modelTemperature\n if (typeof o.modelMaxTokens === 'string') paramPatch.modelMaxTokens = o.modelMaxTokens\n if (typeof o.subagentReasoningEffort === 'string') paramPatch.subagentReasoningEffort = o.subagentReasoningEffort\n if (typeof o.subagentTemperature === 'string') paramPatch.subagentTemperature = o.subagentTemperature\n if (typeof o.subagentMaxTokens === 'string') paramPatch.subagentMaxTokens = o.subagentMaxTokens\n if (typeof o.usePtcMode === 'boolean') paramPatch.usePtcMode = o.usePtcMode\n if (typeof o.injectPrompt === 'boolean') paramPatch.injectPrompt = o.injectPrompt\n if (typeof o.subagentPersona === 'string') paramPatch.subagentPersona = o.subagentPersona\n if (Array.isArray(o.toolFilterAllow)) paramPatch.toolFilterAllow = o.toolFilterAllow.join(', ')\n else if (typeof o.toolFilterAllow === 'string') paramPatch.toolFilterAllow = o.toolFilterAllow\n if (Array.isArray(o.toolFilterDeny)) paramPatch.toolFilterDeny = o.toolFilterDeny.join(', ')\n else if (typeof o.toolFilterDeny === 'string') paramPatch.toolFilterDeny = o.toolFilterDeny\n if (o.maxDepth !== undefined && o.maxDepth !== null && o.maxDepth !== '') {\n paramPatch.maxDepth = String(o.maxDepth)\n }\n if (Array.isArray(o.allowKinds)) paramPatch.allowKinds = o.allowKinds.join(', ')\n else if (typeof o.allowKinds === 'string') paramPatch.allowKinds = o.allowKinds\n if (typeof o.firstTurnWord === 'string') paramPatch.firstTurnWord = o.firstTurnWord\n if (typeof o.bootstrapMaxTokens === 'number') paramPatch.bootstrapMaxTokens = o.bootstrapMaxTokens\n if (Object.keys(paramPatch).length > 0) {\n const next = { ...fieldsRef.current, ...paramPatch }\n fieldsRef.current = next\n setFields(next)\n setSavedSwitches(snapshotSwitches(next))\n }\n }\n // 预设级模板变量(preset.yml 内容变量;失败不阻断主流程)。\n const varsRes = await bridgePost<{ variables: Record<string, string>; enabled: boolean }>('/preset-variables', {})\n if (seq !== loadSeqRef.current) return EMPTY_FIELDS\n if (varsRes.ok && varsRes.value.variables !== null && typeof varsRes.value.variables === 'object') {\n setTemplateVariables(varsRes.value.variables)\n setTemplateVariablesEnabled(varsRes.value.enabled !== false)\n }\n // 实际生效配置(引擎从生成目录加载;settings.promptConfigs 仅为覆盖层,\n // 默认为空不代表无配置)。非空时以实际配置为准,并同步已保存快照避免误判 dirty。\n const configsRes = await bridgePost<{ promptConfigs: PromptConfigDraft[] }>('/prompt-configs', {})\n if (seq !== loadSeqRef.current) return EMPTY_FIELDS\n if (configsRes.ok && Array.isArray(configsRes.value.promptConfigs) && configsRes.value.promptConfigs.length > 0) {\n // 引擎自动生成的模型参数配置(model-params / subagent-model-params)由\n // 「模型设置」卡片管理,不进入模块列表(避免重复编辑入口)。\n const engineGenerated = new Set(['model-params', 'subagent-model-params'])\n const userConfigs = configsRes.value.promptConfigs.filter((config) => !engineGenerated.has(config.id))\n // 内容资产条目(prompt-injector / instruction-hint):params.text(生成目录文件渲染产物)\n // 提升到 text 框显示,编辑入口统一为模块卡片。\n const actual = userConfigs.map(liftContentText)\n const next = { ...fieldsRef.current, promptConfigs: actual }\n fieldsRef.current = next\n setFields(next)\n setSavedConfigs(actual)\n }\n setNotice('')\n return fieldsRef.current\n } catch (error) {\n showNotice('error', '读取失败:' + errorMessage(error))\n return EMPTY_FIELDS\n } finally {\n if (seq === loadSeqRef.current) setLoading(false)\n }\n }, [applyView, settings, showNotice])\n\n // 挂载即后台拉取模型目录(不阻塞工作台首屏;10min 缓存兜底重复打开)。\n useEffect(() => {\n void loadModels()\n }, [loadModels])\n\n const refreshRevision = useCallback(async () => {\n try {\n await settings.ensure()\n const snapshot = await waitForScope(settings.scope)\n if (snapshot.revision !== undefined) revisionRef.current = snapshot.revision\n } catch {\n // 刷新失败保持原 revision,用户可重试。\n }\n }, [settings])\n\n const patch = useCallback((partial: Partial<Fields>) => {\n let next = { ...fieldsRef.current, ...partial }\n // complete 互斥:system-section/persona 共用官方 complete 语义(预设内仅一个),\n // 开启任一 enabled 配置的 complete 时自动关闭其他 enabled 配置的 complete。\n // disabled 配置不参与(引擎 effectiveList 已过滤,不注册即不独占;重新启用时由本次收敛)。\n if (Array.isArray(next.promptConfigs)) {\n const activeComplete = (config: PromptConfigDraft): boolean => config.enabled !== false && config.params?.complete === true\n const enabledComplete = next.promptConfigs.some(activeComplete)\n if (enabledComplete) {\n const kept = next.promptConfigs.findIndex(activeComplete)\n next = {\n ...next,\n promptConfigs: next.promptConfigs.map((config, index) =>\n index === kept || config.enabled === false\n ? config\n : { ...config, params: { ...config.params, complete: false } }),\n }\n }\n }\n fieldsRef.current = next\n setFields(next)\n }, [])\n\n const enqueueSave = useCallback((ops: SettingsPathOpView[], okMessage: string | undefined, onSaved: () => void, setBusy?: (busy: boolean) => void) => {\n setBusy?.(true)\n saveQueueRef.current = saveQueueRef.current.then(async () => {\n try {\n const view = await settings.mutate(ops, revisionRef.current)\n revisionRef.current = view.revision\n onSaved()\n if (okMessage) showNotice('ok', okMessage)\n } catch (error) {\n await refreshRevision()\n showNotice('error', '保存失败:' + errorMessage(error) + '(已刷新配置版本,可重试)')\n } finally {\n setBusy?.(false)\n }\n }).catch(() => {})\n }, [refreshRevision, settings, showNotice])\n\n const persistSwitches = useCallback((onSaved?: () => void) => enqueueSave(\n [\n { op: 'set', path: ['injectAgentsPrompt'], value: fieldsRef.current.injectAgentsPrompt },\n { op: 'set', path: ['skillSwitches'], value: fieldsRef.current.skillSwitches },\n { op: 'set', path: ['skillOrder'], value: fieldsRef.current.skillOrder },\n { op: 'set', path: ['skillsDirs'], value: fieldsRef.current.skillsDirs },\n { op: 'set', path: ['skillRankBase'], value: fieldsRef.current.skillRankBase },\n { op: 'set', path: ['residentAgentsPath'], value: fieldsRef.current.residentAgentsPath },\n { op: 'set', path: ['presetDir'], value: fieldsRef.current.presetDir },\n { op: 'set', path: ['presetOrder'], value: fieldsRef.current.presetOrder },\n { op: 'set', path: ['fallbackText'], value: fieldsRef.current.fallbackText },\n { op: 'set', path: ['writeAgents'], value: fieldsRef.current.writeAgents },\n { op: 'set', path: ['writePreset'], value: fieldsRef.current.writePreset },\n ],\n undefined,\n () => {\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\n onSaved?.()\n },\n ), [enqueueSave])\n\n /** 参数类设置:写入生成目录 prompt-tool.overrides.yml(随预设隔离,重建保留)。 */\n const persistParamOverrides = useCallback(async () => {\n const f = fieldsRef.current\n const splitList = (value: string): string[] => value.split(',').map((item) => item.trim()).filter((item) => item.length > 0)\n // 空值不写键:保留 preset.yml 模板默认。allowKinds 空数组 = 白名单全拦(危险);maxDepth '' = 不设置。\n const res = await bridgePost<{ overrides: unknown }>('/param-overrides', {\n overrides: {\n firstTurnAnchor: f.firstTurnAnchor,\n firstTurnText: f.firstTurnText,\n firstTurnCustom: f.firstTurnCustom,\n guideText: f.guideText,\n guideCustom: f.guideCustom,\n usePtcMode: f.usePtcMode,\n injectPrompt: f.injectPrompt,\n modelProvider: f.modelProvider,\n modelName: f.modelName,\n subagentModelProvider: f.subagentModelProvider,\n subagentModelName: f.subagentModelName,\n ...(f.modelReasoningEffort.trim().length > 0 ? { modelReasoningEffort: f.modelReasoningEffort } : {}),\n ...(f.modelTemperature.trim().length > 0 ? { modelTemperature: f.modelTemperature } : {}),\n ...(f.modelMaxTokens.trim().length > 0 ? { modelMaxTokens: f.modelMaxTokens } : {}),\n ...(f.subagentReasoningEffort.trim().length > 0 ? { subagentReasoningEffort: f.subagentReasoningEffort } : {}),\n ...(f.subagentTemperature.trim().length > 0 ? { subagentTemperature: f.subagentTemperature } : {}),\n ...(f.subagentMaxTokens.trim().length > 0 ? { subagentMaxTokens: f.subagentMaxTokens } : {}),\n ...(f.subagentPersona.trim().length > 0 ? { subagentPersona: f.subagentPersona } : {}),\n toolFilterAllow: splitList(f.toolFilterAllow),\n toolFilterDeny: splitList(f.toolFilterDeny),\n ...(f.maxDepth !== ''\n ? { maxDepth: f.maxDepth === 'provider-managed' ? 'provider-managed' : Number(f.maxDepth) }\n : {}),\n ...(splitList(f.allowKinds).length > 0 ? { allowKinds: splitList(f.allowKinds) } : {}),\n ...(f.firstTurnWord.trim().length > 0 ? { firstTurnWord: f.firstTurnWord } : {}),\n bootstrapMaxTokens: f.bootstrapMaxTokens,\n },\n })\n if (res.ok) {\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\n // 参数已写激活预设 preset.yml:服务端重建后刷新(模型参数配置等随预设变化)。\n void load()\n } else {\n showNotice('error', '参数保存失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }, [load, showNotice])\n\n const persistConfigs = useCallback((configs: PromptConfigDraft[]) => {\n const contentEntries = configs.filter(isContentAsset)\n void (async () => {\n // 内容资产:text 先写生成目录文件(afterPresetImport 触发重建,渲染产物 params.text 更新)。\n for (const config of contentEntries) {\n const scope = config.id === 'prompt-injector' ? 'preset' : 'agents'\n const res = await bridgePost<{ scope: string }>('/import-preset', { scope, content: config.text ?? '' })\n if (!res.ok) {\n showNotice('error', `${scope === 'preset' ? 'preset.md' : 'agents.md'} 保存失败:` + (res.message ?? 'settings bridge unavailable'))\n return\n }\n }\n // promptConfigs 按预设存储:写激活预设 preset.yml(settings 不再承载)。\n const res = await bridgePost<{ promptConfigs: unknown }>('/param-overrides', {\n promptConfigs: configs.map(stripContentText),\n })\n if (res.ok) {\n setSavedConfigs(configs)\n void load()\n } else {\n showNotice('error', '提示词配置保存失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n })()\n }, [load, showNotice])\n\n /** 模板变量:写激活预设 preset.yml 内容变量(后端 savePresetParams + afterOverridesChange 触发重建)。 */\n const saveTemplateVariables = useCallback(async (next?: Record<string, string>) => {\n // 空 key 行(待编辑)不落盘;本地同步清理保持显示一致。\n const cleaned = Object.fromEntries(\n Object.entries(next ?? templateVariables).filter(([key]) => key.trim().length > 0),\n )\n const res = await bridgePost<{ variables: unknown }>('/preset-variables', {\n variables: cleaned,\n enabled: templateVariablesEnabled,\n })\n if (!res.ok) {\n showNotice('error', `模板变量保存失败:${res.message ?? '未知错误'}`)\n return\n }\n setTemplateVariables(cleaned)\n }, [templateVariables, templateVariablesEnabled, showNotice])\n\n const toggle = useCallback((key: SwitchKey) => {\n patch({ [key]: !fieldsRef.current[key] })\n if (PARAM_SWITCH_KEYS.has(key)) void persistParamOverrides()\n // writePreset 关闭/开启会重建或移除生成目录:保存后必须重新加载,\n // 否则模块卡片仍显示旧配置(不刷新)。\n else if (key === 'writePreset') persistSwitches(() => { void load() })\n else persistSwitches()\n }, [patch, persistParamOverrides, persistSwitches, load])\n\n const toggleBootstrapMaxTokens = useCallback(() => {\n const next = fieldsRef.current.bootstrapMaxTokens > 0 ? 0 : 256000\n patch({ bootstrapMaxTokens: next })\n setBootstrapTokensDraft(DEFAULT_BOOTSTRAP_DISPLAY)\n void persistParamOverrides()\n }, [patch, persistParamOverrides])\n\n const setPresetTemplate = useCallback((id: string) => {\n if (fieldsRef.current.presetTemplate === id) return\n patch({ presetTemplate: id })\n enqueueSave(\n [{ op: 'set', path: ['presetTemplate'], value: id }],\n `已切换预设模板:${id}`,\n () => { void load() },\n )\n }, [enqueueSave, load, patch])\n\n const commitBootstrapTokensDraft = useCallback(() => {\n const parsed = Number(bootstrapTokensDraft)\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n setBootstrapTokensDraft(DEFAULT_BOOTSTRAP_DISPLAY)\n patch({ bootstrapMaxTokens: 256000 })\n } else {\n patch({ bootstrapMaxTokens: parsed })\n }\n void persistParamOverrides()\n }, [bootstrapTokensDraft, patch, persistParamOverrides])\n\n const addSkillsDir = useCallback((dir: string) => {\n const next = dir.trim()\n if (next.length === 0) return\n const current = fieldsRef.current.skillsDirs\n if (current.includes(next)) {\n showNotice('error', '该目录已在列表中')\n return\n }\n const dirs = [...current, next]\n patch({ skillsDirs: dirs })\n enqueueSave(\n [{ op: 'set', path: ['skillsDirs'], value: dirs }],\n `技能目录已添加:${next}`,\n () => {\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\n void load()\n },\n setSavingSkillsDir,\n )\n }, [enqueueSave, load, patch, showNotice])\n\n const removeSkillsDir = useCallback((dir: string) => {\n const dirs = fieldsRef.current.skillsDirs.filter((item) => item !== dir)\n patch({ skillsDirs: dirs })\n enqueueSave(\n [{ op: 'set', path: ['skillsDirs'], value: dirs }],\n `已移除技能目录引用:${dir}`,\n () => {\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\n void load()\n },\n setSavingSkillsDir,\n )\n }, [enqueueSave, load, patch, showNotice])\n\n const skillEnabled = useCallback((folder: string) => fieldsRef.current.skillSwitches[folder] !== false, [])\n\n const toggleSkill = useCallback((folder: string) => {\n const enabled = fieldsRef.current.skillSwitches[folder] !== false\n patch({ skillSwitches: { ...fieldsRef.current.skillSwitches, [folder]: !enabled } })\n persistSwitches()\n }, [patch, persistSwitches])\n\n interface SkillFixValue {\n folder: string\n fixedFolder: string\n name: string\n actions: string[]\n }\n const fixSkill = useCallback(async (folder: string) => {\n setFixingSkill(folder)\n try {\n const res = await bridgePost<SkillFixValue>('/skill-fix', { folder })\n if (res.ok) {\n showNotice('ok', `已修复技能 ${res.value.folder} → ${res.value.fixedFolder}:${res.value.actions.join(';') || '无需改动'}`)\n await load()\n } else {\n showNotice('error', '一键修复失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } catch (error) {\n showNotice('error', '一键修复失败:' + errorMessage(error))\n } finally {\n setFixingSkill(undefined)\n }\n }, [load, showNotice])\n\n const openSkillsDir = useCallback(async (path?: string) => {\n const target = path ?? fieldsRef.current.activeSkillsDirs[0] ?? ''\n if (!target) { showNotice('error', '技能目录路径未知,请先重新读取配置'); return }\n try {\n const res = await api.host.openPath({ path: target })\n if (res.result.ok) showNotice('ok', '已打开技能目录:' + target)\n else showNotice('error', '打开失败:' + (res.result.error?.message ?? ''))\n } catch (error) {\n showNotice('error', '打开失败:' + errorMessage(error))\n }\n }, [api, showNotice])\n\n const currentSwitches = snapshotSwitches(fields)\n const dirtySwitches = !switchesEqual(currentSwitches, savedSwitches)\n const dirtyConfigs = JSON.stringify(fields.promptConfigs) !== JSON.stringify(savedConfigs)\n const dirty = dirtySwitches || dirtyConfigs\n\n return {\n fields,\n meta,\n loading,\n providers,\n modelCatalog,\n hostDefaultModel,\n bootstrapTokensDraft,\n skillsDirDraft,\n templatePreStepCount,\n savedSwitches,\n savedConfigs,\n savingSkillsDir,\n fixingSkill,\n notice,\n noticeKind,\n load,\n showNotice,\n patch,\n persistSwitches,\n persistParamOverrides,\n persistConfigs,\n templateVariables,\n setTemplateVariables,\n templateVariablesEnabled,\n setTemplateVariablesEnabled,\n saveTemplateVariables,\n toggle,\n toggleBootstrapMaxTokens,\n setPresetTemplate,\n setBootstrapTokensDraft,\n commitBootstrapTokensDraft,\n setSkillsDirDraft,\n addSkillsDir,\n removeSkillsDir,\n toggleSkill,\n skillEnabled,\n fixSkill,\n openSkillsDir,\n dirtySwitches,\n dirtyConfigs,\n dirty,\n }\n}\n","/** textarea 随内容自适应高度(field-sizing 的 JS 兜底:不支持的内核手动调整)。 */\nimport type { ChangeEvent } from 'react'\n\nexport function autoResizeTextarea(event: ChangeEvent<HTMLTextAreaElement>): void {\n const el = event.currentTarget\n if (typeof CSS !== 'undefined' && typeof CSS.supports === 'function' && CSS.supports('field-sizing', 'content')) return\n el.style.height = 'auto'\n el.style.height = `${el.scrollHeight}px`\n}\n","/** 标签输入:chip 增删 + 回车/逗号添加;底层仍为逗号分隔字符串,零数据层改动。 */\nimport { useState, type ReactNode } from 'react'\nimport styles from './PromptUi.module.css'\n\nexport function TagInput(props: {\n id: string\n label: string\n hint: string\n value: string\n placeholder?: string\n disabled?: boolean\n onChange: (value: string) => void\n onCommit: () => void\n}): ReactNode {\n const { id, label, hint, value, placeholder, disabled, onChange, onCommit } = props\n const [draft, setDraft] = useState('')\n const tags = value.split(',').map((tag) => tag.trim()).filter((tag) => tag.length > 0)\n\n const commitDraft = () => {\n const next = draft.trim()\n setDraft('')\n if (next.length === 0 || tags.includes(next)) return\n onChange([...tags, next].join(', '))\n onCommit()\n }\n\n const remove = (tag: string) => {\n onChange(tags.filter((item) => item !== tag).join(', '))\n onCommit()\n }\n\n return (\n <div className={styles.rowGroup}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}><strong>{label}</strong><small>{hint}</small></span>\n <div className={styles.tagInput} data-disabled={disabled ? '' : undefined}>\n {tags.map((tag) => (\n <span key={tag} className={styles.tagChip}>\n {tag}\n {!disabled && (\n <button type=\"button\" className={styles.tagChipRemove} aria-label={`移除 ${tag}`} onClick={() => remove(tag)}>×</button>\n )}\n </span>\n ))}\n <input\n id={id}\n className={styles.tagInputField}\n value={draft}\n aria-label={label}\n placeholder={tags.length === 0 ? (placeholder ?? '输入后回车添加') : undefined}\n disabled={disabled}\n spellCheck={false}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault()\n commitDraft()\n } else if (event.key === 'Backspace' && draft.length === 0 && tags.length > 0) {\n remove(tags[tags.length - 1]!)\n }\n }}\n onBlur={commitDraft}\n />\n </div>\n </div>\n </div>\n )\n}\n","/**\n * 单条提示词配置卡片 + 编辑表单(独立文件:\n * 打破 PromptConfigsEditor ⇄ PromptConfigList 的循环 import)。\n */\nimport { cloneElement, isValidElement, useEffect, useId, useState, type ReactElement, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './PromptUi.module.css'\nimport { autoResizeTextarea } from './textarea-resize.ts'\nimport { TagInput } from './TagInput.tsx'\n\nimport type { EngineMeta, LayerFieldPolicy, PromptConfigDraft } from './prompt-tool-types.ts'\n\nexport type { PromptConfigDraft, LayerFieldPolicy } from './prompt-tool-types.ts'\n\n/** sourceKind / form 是少量固定语义值,用下拉选择;引擎不设枚举,因此额外保留当前值。 */\nexport const SOURCE_KINDS = ['', 'plugin', 'instruction-hint', 'skill-catalog', 'env-facts'] as const\nexport const SOURCE_FORMS = ['notice', 'hint', ''] as const\n\n/** audience 的 UI 中文标签:空值=公用(缺省,通用参数默认);main=仅主会话;subagent=仅子代理。 */\nexport const AUDIENCE_LABELS: Record<string, string> = { '': '公用(缺省)', main: '仅主会话', subagent: '仅子代理' }\n\n/** 从引擎 /meta 中读取某层的字段能力;未知层回退 pre-step。 */\nconst EMPTY_POLICY: LayerFieldPolicy = {\n position: false,\n dedupe: false,\n promotion: false,\n audience: false,\n modelScope: false,\n merge: false,\n order: false,\n role: false,\n placeholder: false,\n}\n\nexport function fieldPolicyFor(meta: EngineMeta, layer: string | undefined): LayerFieldPolicy {\n return meta.layerFieldPolicies[(layer ?? 'pre-step')] ?? EMPTY_POLICY\n}\n\nfunction selectOptions(options: readonly string[], value: string | undefined): Array<{ value: string; label: string }> {\n const current = value ?? ''\n const entries = options.map((item) => ({ value: item, label: item === '' ? '(默认)' : item }))\n if (current !== '' && !options.includes(current)) entries.push({ value: current, label: `${current}(当前值)` })\n return entries\n}\n\nexport function Field(props: { label: string; hint?: string; children: ReactNode }): ReactNode {\n const id = useId()\n return (\n <div className={styles.configField}>\n <label className={styles.configFieldLabel} htmlFor={id}>{props.label}</label>\n {isValidElement(props.children) ? cloneElement(props.children as ReactElement<{ id?: string }>, { id }) : props.children}\n {props.hint && <p className={styles.configFieldHint}>{props.hint}</p>}\n </div>\n )\n}\n\nfunction selectValue(options: readonly string[], value: string | undefined, fallback: string): string {\n return options.includes(value ?? '') ? value ?? fallback : fallback\n}\n\n/** JSON 对象文本域:解析失败只在本地标红,不污染草稿。 */\nexport function JsonField(props: { label: string; value: Record<string, unknown> | undefined; onChange: (value: Record<string, unknown> | undefined) => void }): ReactNode {\n const [text, setText] = useState(JSON.stringify(props.value ?? {}, null, 2))\n const [error, setError] = useState('')\n useEffect(() => {\n setText(JSON.stringify(props.value ?? {}, null, 2))\n setError('')\n }, [props.value])\n const commit = () => {\n try {\n const parsed = JSON.parse(text) as unknown\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n setError('必须是 JSON 对象')\n return\n }\n props.onChange(parsed as Record<string, unknown>)\n setError('')\n } catch {\n setError('JSON 无效')\n }\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{props.label}{error && <span className={styles.configJsonError}> {error}</span>}</span>\n <textarea\n className={clsx(styles.configTextarea, styles.configJsonInput, error && styles.configInputError)}\n aria-label={props.label}\n value={text}\n spellCheck={false}\n onChange={(e) => { autoResizeTextarea(e); setText(e.target.value) }}\n onBlur={commit}\n />\n </span>\n )\n}\n\n/** 布尔开关行(params 结构化编辑用)。 */\nfunction ParamToggle(props: { label: string; hint?: string; checked: boolean; onChange: (checked: boolean) => void }): ReactNode {\n return (\n <label className={styles.configEnable} title={props.checked ? '点击关闭' : '点击开启'}>\n <span className={styles.configFieldLabel}>{props.label}</span>\n <input type=\"checkbox\" aria-label={props.label} checked={props.checked} onChange={(e) => props.onChange(e.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n {props.hint && <span className={styles.configFieldHint}>{props.hint}</span>}\n </label>\n )\n}\n\n/** params 文本域(结构化编辑用):失焦写入草稿 params。 */\nfunction ParamTextarea(props: { label: string; hint?: string; value: string; onChange: (value: string) => void }): ReactNode {\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{props.label}</span>\n <textarea\n className={styles.configTextarea}\n aria-label={props.label}\n value={props.value}\n spellCheck={false}\n onChange={(e) => { autoResizeTextarea(e); props.onChange(e.target.value) }}\n />\n {props.hint && <p className={styles.configFieldHint}>{props.hint}</p>}\n </span>\n )\n}\n\n/** params 单行文本域(结构化编辑用)。 */\nfunction ParamInput(props: { label: string; hint?: string; value: string; onChange: (value: string) => void }): ReactNode {\n return (\n <Field label={props.label} hint={props.hint}>\n <input className={styles.configInput} value={props.value} spellCheck={false} onChange={(e) => props.onChange(e.target.value)} />\n </Field>\n )\n}\n\n/**\n * 按 strategy 拆解 params 为结构化编辑框(替代裸 JSON):\n * first-turn-anchor → near-anchor 锚点参数(开关/锚文本/任务正则/引导句);\n * guide-auto → router-guide 每轮引导参数(开关/文本/复杂正则/强弱引导句);\n * custom-fallback → prompt-injector 锚定词(params.text 为运行时注入内容,不暴露编辑);\n * placeholder / instruction-hint → fill 模板参数(text/envKeys/limit/fields/providers/emptyBehavior/emptyText);\n * 无固定字段的策略回退 JSON 编辑(保留任意 params 能力)。\n */\nexport function StrategyParamsFields(props: { strategy: string; layer?: string; params: Record<string, unknown> | undefined; onPatch: (params: Record<string, unknown>) => void }): ReactNode {\n const { strategy, layer, params, onPatch } = props\n const value = params ?? {}\n const str = (key: string): string => (typeof value[key] === 'string' ? value[key] as string : '')\n const bool = (key: string): boolean => value[key] === true\n const set = (key: string, next: unknown): void => onPatch({ ...value, [key]: next })\n if (layer === 'system-section') {\n // system-section 层参数:sectionName(注册名;deployment:persona = 人设 shadow)、\n // complete(独占 system prompt,预设内互斥)、suppressRuntimeContext(抑制动态快照)。\n return (\n <>\n <ParamInput label=\"sectionName(注册段名)\" hint=\"deployment:persona = 人设段(同名 shadow 全局 persona)\" value={str('sectionName')} onChange={(next) => set('sectionName', next)} />\n <ParamToggle label=\"complete(独占 system prompt)\" hint=\"开启后 assembly 只保留本段;预设内互斥(多个 complete 官方 fail loud)\"\n checked={bool('complete')} onChange={(next) => set('complete', next)} />\n <ParamToggle label=\"suppressRuntimeContext(抑制动态上下文)\" hint=\"等价官方 dsh-persona includeRuntimeContext:false\"\n checked={bool('suppressRuntimeContext')} onChange={(next) => set('suppressRuntimeContext', next)} />\n </>\n )\n }\n if (strategy === 'first-turn-anchor') {\n return (\n <>\n <ParamToggle label=\"useCustom(自定义锚文本)\" hint=\"true = 固定使用 firstTurnText;false = 按 buildPattern/complexPattern 自动选择引导句\"\n checked={bool('useCustom')} onChange={(next) => set('useCustom', next)} />\n <ParamTextarea label=\"firstTurnText(自定义锚文本)\" hint=\"useCustom=true 时固定注入\" value={str('firstTurnText')} onChange={(next) => set('firstTurnText', next)} />\n <ParamInput label=\"buildPattern(构建任务正则)\" hint=\"命中即用 firstTurnBuild 引导句\" value={str('buildPattern')} onChange={(next) => set('buildPattern', next)} />\n <ParamInput label=\"complexPattern(复杂任务正则)\" hint=\"命中即用 firstTurnDeep 引导句\" value={str('complexPattern')} onChange={(next) => set('complexPattern', next)} />\n <ParamTextarea label=\"firstTurnBuild(构建引导句)\" value={str('firstTurnBuild')} onChange={(next) => set('firstTurnBuild', next)} />\n <ParamTextarea label=\"firstTurnInspect(排查引导句)\" value={str('firstTurnInspect')} onChange={(next) => set('firstTurnInspect', next)} />\n <ParamTextarea label=\"firstTurnDeep(复杂设计引导句)\" value={str('firstTurnDeep')} onChange={(next) => set('firstTurnDeep', next)} />\n </>\n )\n }\n if (strategy === 'guide-auto') {\n return (\n <>\n <ParamToggle label=\"useCustom(自定义每轮引导)\" hint=\"true = 固定使用 text;false = 按任务自动选择强弱引导\"\n checked={bool('useCustom')} onChange={(next) => set('useCustom', next)} />\n <ParamTextarea label=\"text(自定义引导文本)\" hint=\"useCustom=true 时固定注入\" value={str('text')} onChange={(next) => set('text', next)} />\n <ParamInput label=\"guideComplexPattern(复杂任务正则)\" value={str('guideComplexPattern')} onChange={(next) => set('guideComplexPattern', next)} />\n <ParamTextarea label=\"guideWeak(简单任务自动引导)\" value={str('guideWeak')} onChange={(next) => set('guideWeak', next)} />\n <ParamTextarea label=\"guideDeep(复杂任务自动引导)\" value={str('guideDeep')} onChange={(next) => set('guideDeep', next)} />\n </>\n )\n }\n if (strategy === 'custom-fallback') {\n return (\n <>\n <ParamInput label=\"firstTurnWord(锚定词)\" hint=\"晋升后首个 reasoning 命中该词即注入;任意自定义文本\"\n value={str('firstTurnWord')} onChange={(next) => set('firstTurnWord', next)} />\n </>\n )\n }\n if (strategy === 'world-book') {\n const keyId = useId()\n const list = (key: string): string => Array.isArray(value[key])\n ? (value[key] as unknown[]).map(String).join(', ') : str(key)\n const setList = (key: string, next: string): void => set(key, next.split(',').map((item) => item.trim()).filter((item) => item.length > 0))\n return (\n <>\n <ParamToggle label=\"constant(常驻注入)\" hint=\"true = 不依赖关键字,每轮恒注入;false = 命中 keys 才注入\"\n checked={bool('constant')} onChange={(next) => set('constant', next)} />\n <TagInput id={`${keyId}-keys`} label=\"keys(触发关键字)\" hint=\"命中消息文本中的任一关键字即注入;逗号分隔\" onCommit={() => {}}\n value={list('keys')} placeholder=\"关键字,回车添加\" onChange={(next) => setList('keys', next)} />\n <TagInput id={`${keyId}-secondary-keys`} label=\"secondaryKeys(次级关键字)\" hint=\"与 keys 合并匹配(任一命中即注入);逗号分隔\" onCommit={() => {}}\n value={list('secondaryKeys')} placeholder=\"次级关键字,回车添加\" onChange={(next) => setList('secondaryKeys', next)} />\n <ParamToggle label=\"caseSensitive(区分大小写)\" hint=\"true = 关键字精确大小写匹配\"\n checked={bool('caseSensitive')} onChange={(next) => set('caseSensitive', next)} />\n <ParamToggle label=\"wholeWords(整词匹配)\" hint=\"true = 关键字必须整词出现(词边界),false = 子串包含即命中\"\n checked={bool('wholeWords')} onChange={(next) => set('wholeWords', next)} />\n <ParamToggle label=\"useRegex(键为正则)\" hint=\"true = keys / secondaryKeys 按正则表达式匹配(作者负责合法性)\"\n checked={bool('useRegex')} onChange={(next) => set('useRegex', next)} />\n <OptionField\n label=\"selectiveLogic(触发逻辑)\"\n hint=\"ST world_info_logic:0 = 主/副键任一命中;3 = 副键全中才注入;1 = 副键全不中才注入;2 = 至少一个副键未中才注入\"\n value={value['selectiveLogic'] !== undefined ? String(value['selectiveLogic']) : '0'}\n options={['0', '1', '2', '3']}\n fallback=\"0\"\n labels={{\n '0': '0 · 任一命中(默认)',\n '1': '1 · 副键全排除',\n '2': '2 · 部分排除',\n '3': '3 · 副键全包含',\n }}\n onChange={(next) => set('selectiveLogic', Number(next))}\n />\n </>\n )\n }\n if (strategy === 'placeholder' || strategy === 'instruction-hint') {\n return (\n <>\n <ParamTextarea label=\"text(自定义提示文本)\" hint=\"覆盖文件与动态探测的提示文本;留空 = 默认\"\n value={str('text')} onChange={(next) => set('text', next)} />\n <ParamInput label=\"envKeys(env-facts 环境变量白名单)\" hint=\"逗号分隔;留空 = 默认 DSH_HOME,DSH_WORKSPACE\"\n value={str('envKeys')} onChange={(next) => set('envKeys', next)} />\n <ParamInput label=\"limit(skill-catalog 数量上限)\" hint=\"正整数;留空 = 不限制\"\n value={str('limit')} onChange={(next) => set('limit', next === '' ? '' : Number(next))} />\n <ParamInput label=\"fields(skill-catalog 字段)\" hint=\"逗号分隔;默认 name,description\"\n value={str('fields')} onChange={(next) => set('fields', next)} />\n <ParamInput label=\"providers(skill-catalog provider 白名单)\" hint=\"逗号分隔;留空 = 全部\"\n value={str('providers')} onChange={(next) => set('providers', next)} />\n <OptionField label=\"emptyBehavior(空结果行为)\" hint=\"skip = 不注入;text = 注入 emptyText\"\n value={str('emptyBehavior')} options={['skip', 'text']} fallback=\"skip\" onChange={(next) => set('emptyBehavior', next)} />\n <ParamTextarea label=\"emptyText(空结果提示文本)\" value={str('emptyText')} onChange={(next) => set('emptyText', next)} />\n </>\n )\n }\n // 无策略参数的配置(static 等):预设级内容变量已展开进 variables(官方插值\n // 机制,由上方 VariablesEditor 结构化编辑),params 为空时不再渲染 JSON 框。\n if (Object.keys(value).length === 0) {\n return <p className={styles.configFieldHint}>本策略无高级参数;模板变量见上方「variables」。</p>\n }\n return <JsonField label=\"params(高级参数 JSON;本策略无固定字段)\" value={value} onChange={(next) => { if (next !== undefined) onPatch(next) }} />\n}\n\n/** 模板变量键值对编辑器(替代 JSON):每行 key + value,可增删。工作台「模板变量」卡片复用。 */\nexport function VariablesEditor(props: { value: Record<string, string> | undefined; onChange: (value: Record<string, string> | undefined) => void }): ReactNode {\n const entries = Object.entries(props.value ?? {})\n const commit = (next: Array<[string, string]>) => {\n // 保留空 key 行(「添加变量」新增的待编辑行);空 key 由保存端(savePresetParams)\n // 统一清理,避免新增行被立即过滤导致按钮失效。\n props.onChange(next.length > 0 ? Object.fromEntries(next) : undefined)\n }\n const setEntry = (index: number, key: string, value: string) => {\n commit(entries.map((entry, at): [string, string] => at === index ? [key, value] : entry))\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{'variables(模板变量 {{key}} 插值)'}</span>\n {entries.length === 0 && <p className={styles.configFieldHint}>{'无模板变量;下方添加键值对,注入文本中的 {{key}} 会被替换。'}</p>}\n {entries.map(([key, value], index) => (\n <span key={`${key}-${index}`} className={styles.variableRow}>\n <input className={styles.configInput} aria-label=\"模板变量名\" value={key} spellCheck={false} placeholder=\"变量名\"\n onChange={(e) => setEntry(index, e.target.value, value)} />\n <input className={styles.configInput} aria-label=\"模板变量值\" value={value} spellCheck={false} placeholder=\"变量值\"\n onChange={(e) => setEntry(index, key, e.target.value)} />\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={`删除变量 ${key || index}`}\n onClick={() => commit(entries.filter((_, at) => at !== index))}>删除</button>\n </span>\n ))}\n <span>\n <button type=\"button\" className={styles.pillButton} onClick={() => commit([...entries, ['', '']])}>添加</button>\n </span>\n </span>\n )\n}\n\n/** identity 结构化编辑(替代 JSON):field 下拉 + value 输入;value 留空 = 使用默认(等于配置 id)。 */\nfunction IdentityFields(props: { identity: { field: string; value: string } | undefined; onPatch: (identity: { field: string; value: string } | undefined) => void }): ReactNode {\n const field = props.identity?.field ?? 'plugin'\n const value = props.identity?.value ?? ''\n return (\n <>\n <OptionField label=\"identity.field(幂等身份域)\" hint=\"plugin = 按插件 id 幂等;kind = 按注入类型\"\n value={field} options={['plugin', 'kind']} fallback=\"plugin\" onChange={(next) => props.onPatch({ field: next, value })} />\n <Field label=\"identity.value(幂等身份值)\" hint=\"留空 = 使用默认(等于配置 id)\">\n <input className={styles.configInput} value={value} spellCheck={false}\n onChange={(e) => props.onPatch(e.target.value.length > 0 ? { field, value: e.target.value } : undefined)} />\n </Field>\n </>\n )\n}\n\n/** 枚举下拉:值不在选项内时用回退值,保证表单始终可渲染。 */\nfunction OptionField(props: { label: string; hint?: string; value: string | undefined; options: readonly string[]; fallback: string; onChange: (value: string) => void; keepCurrent?: boolean; labels?: Record<string, string> }): ReactNode {\n const options = props.keepCurrent === true ? selectOptions(props.options, props.value) : props.options.map((item) => ({ value: item, label: item }))\n return (\n <Field label={props.label} hint={props.hint}>\n <select className={styles.configInput} value={selectValue(props.options, props.value, props.fallback)} onChange={(e) => props.onChange(e.target.value)}>\n {options.map((item) => <option key={item.value} value={item.value}>{props.labels?.[item.value] ?? item.label}</option>)}\n </select>\n </Field>\n )\n}\n\n/** 单条提示词配置表单:按注入层级的能力矩阵过滤字段,只显示本层生效的参数。 */\nexport function PromptConfigForm(props: {\n meta: EngineMeta\n config: PromptConfigDraft\n onPatch: (patch: Partial<PromptConfigDraft>) => void\n}): ReactNode {\n const { meta, config, onPatch } = props\n const policy = fieldPolicyFor(meta, config.layer)\n const strategy = config.strategy ?? 'static'\n const placeholder = strategy === 'placeholder' && policy.placeholder\n const fillOptions = ['', ...meta.fills]\n return (\n <div className={styles.configForm}>\n <div className={styles.configGrid}>\n <Field label=\"id(唯一,必填)\">\n <input className={styles.configInput} value={config.id} spellCheck={false} onChange={(e) => onPatch({ id: e.target.value })} />\n </Field>\n <Field label=\"name(显示名)\">\n <input className={styles.configInput} value={config.name ?? ''} spellCheck={false} onChange={(e) => onPatch({ name: e.target.value })} />\n </Field>\n <OptionField label=\"layer\" hint=\"注入层级;切换后下方字段按新层能力矩阵重新出现\" value={config.layer} options={meta.layers} fallback=\"pre-step\" onChange={(value) => onPatch({ layer: value })} />\n <OptionField label=\"strategy\" hint=\"内容策略;placeholder 需配合 fill\" value={config.strategy} options={meta.strategies} fallback=\"static\" onChange={(value) => onPatch({ strategy: value })} />\n <OptionField label=\"configKind\" hint=\"ordered 按 order 升序;anchor 固定文件序排最前\" value={config.configKind} options={meta.slotKinds} fallback=\"ordered\" onChange={(value) => onPatch({ configKind: value })} />\n {policy.role && <OptionField label=\"role\" hint=\"注入消息角色:user / assistant\" value={config.role} options={meta.roles} fallback=\"user\" onChange={(value) => onPatch({ role: value })} />}\n {policy.position && <OptionField label=\"position\" hint=\"同层拼接位置:after-user / before-all / after-all\" value={config.position} options={meta.positions} fallback=\"after-user\" onChange={(value) => onPatch({ position: value })} />}\n {policy.merge && <OptionField label=\"mergeMode\" hint=\"merged=同位置配置拼接为一条消息\" value={config.mergeMode} options={meta.mergeModes} fallback=\"separate\" onChange={(value) => onPatch({ mergeMode: value })} />}\n {policy.order && <Field label=\"order\" hint=\"本层排序:数值小者在前(与同层列表上下移动等价)\"><input className={styles.configInput} type=\"number\" step={1} value={config.order ?? 0} onChange={(e) => onPatch({ order: Number(e.target.value) })} /></Field>}\n <Field label=\"group\" hint=\"互斥组名:同 group 且 exclusive=true 时只执行排序后的第一个 enabled 配置\"><input className={styles.configInput} value={config.group ?? ''} spellCheck={false} onChange={(e) => onPatch({ group: e.target.value })} /></Field>\n <label className={styles.configEnable} title={config.exclusive === true ? '点击关闭互斥' : '点击开启互斥'}>\n <span className={styles.configFieldLabel}>exclusive</span>\n <input type=\"checkbox\" aria-label=\"exclusive\" checked={config.exclusive === true} onChange={(e) => onPatch({ exclusive: e.target.checked })} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n {policy.dedupe && <OptionField label=\"dedupe\" hint=\"session=每会话一次;batch=当前批去重\" value={config.dedupe} options={meta.dedupes} fallback=\"none\" onChange={(value) => onPatch({ dedupe: value })} />}\n {policy.promotion && <OptionField label=\"promotion\" hint=\"none=不要求晋升;main=主会话晋升;include-subagents=子代理跟随\" value={config.promotion} options={meta.promotions} fallback=\"none\" onChange={(value) => onPatch({ promotion: value })} />}\n {policy.audience && <OptionField label=\"消息受众\" hint=\"缺省(通用)=公用,主会话与子代理都注入;main=仅主会话;subagent=仅子代理(专用才标记)\" value={config.audience ?? undefined} options={['', ...meta.audienceModes]} fallback=\"\" labels={AUDIENCE_LABELS} onChange={(value) => onPatch(value === '' ? { audience: null } : { audience: value })} />}\n {policy.modelScope && <OptionField label=\"modelScope\" hint=\"all / pro / flash;flash 按模型名包含 flash 判定\" value={config.modelScope} options={meta.modelScopes} fallback=\"all\" onChange={(value) => onPatch({ modelScope: value })} />}\n {placeholder && <OptionField label=\"fill(placeholder 专用)\" hint=\"instruction-hint / env-facts / skill-catalog\" value={config.fill} options={fillOptions} fallback=\"\" onChange={(value) => onPatch({ fill: value || undefined })} />}\n <OptionField label=\"sourceKind\" hint=\"注入消息 source.kind;默认等于 id\" value={config.sourceKind} options={SOURCE_KINDS} fallback=\"\" keepCurrent onChange={(value) => onPatch({ sourceKind: value || undefined })} />\n <OptionField label=\"form\" hint=\"source.form;默认 notice,hint 用于指令提示\" value={config.form} options={SOURCE_FORMS} fallback=\"notice\" keepCurrent onChange={(value) => onPatch({ form: value || undefined })} />\n <Field label=\"summary\">\n <input className={styles.configInput} value={config.summary ?? ''} spellCheck={false} onChange={(e) => onPatch({ summary: e.target.value })} />\n </Field>\n <Field label=\"templateFile\">\n <input className={styles.configInput} value={config.templateFile ?? ''} spellCheck={false} onChange={(e) => onPatch({ templateFile: e.target.value })} />\n </Field>\n </div>\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{'内容(注入文本;空 = 不注入;变量 {{key}} 插值)'}</span>\n <textarea\n className={styles.configTextarea}\n aria-label=\"注入内容(空 = 不注入)\"\n value={[config.text ?? '', ...(config.texts ?? [])].filter((item) => item.length > 0).join('\\n')}\n spellCheck={false}\n onChange={(e) => {\n autoResizeTextarea(e)\n const next = e.target.value\n // 内容资产(prompt-injector / instruction-hint)走生成目录文件通道(text →\n // params.text);普通配置保存统一写 texts 单段整块(对齐官方 text 单字符串\n // 语义;text 字段兼容读取,编辑后归一)。\n if (config.id === 'prompt-injector' || config.fill === 'instruction-hint') {\n onPatch({ text: next, texts: [] })\n } else {\n onPatch({ text: undefined, texts: next.trim().length > 0 ? [next] : [] })\n }\n }}\n />\n </span>\n <VariablesEditor value={config.variables} onChange={(value) => onPatch({ variables: value })} />\n <StrategyParamsFields strategy={strategy} layer={config.layer} params={config.params} onPatch={(value) => onPatch({ params: value })} />\n <IdentityFields identity={config.identity} onPatch={(value) => onPatch({ identity: value })} />\n </div>\n )\n}\n\nexport interface PromptConfigCardActions {\n canMoveUp: boolean\n canMoveDown: boolean\n onMoveUp: () => void\n onMoveDown: () => void\n onDuplicate: () => void\n onDelete: () => void\n}\n\n/** 模块卡片拖拽排序(HTML5 DnD;移动逻辑在 PromptConfigList 显示视图层)。 */\nexport interface PromptConfigCardDrag {\n dragging: boolean\n dropBefore: boolean\n dropAfter: boolean\n onDragStart: (event: React.DragEvent<HTMLElement>) => void\n onDragOver: (event: React.DragEvent<HTMLElement>) => void\n onDrop: (event: React.DragEvent<HTMLElement>) => void\n onDragEnd: () => void\n}\n\n/** 列表卡片:开关按钮 + 4 个操作按钮 + 可展开编辑表单。 */\nexport function PromptConfigCard(props: {\n meta: EngineMeta\n config: PromptConfigDraft\n expanded: boolean\n drag?: PromptConfigCardDrag\n onToggleExpanded: () => void\n onToggleEnabled: (enabled: boolean) => void\n onPatch: (patch: Partial<PromptConfigDraft>) => void\n actions: PromptConfigCardActions\n}): ReactNode {\n const { meta, config, actions } = props\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const enabled = config.enabled !== false\n const policy = fieldPolicyFor(meta, config.layer)\n const chips = [config.layer ?? 'pre-step', config.strategy ?? 'static']\n if (config.fill) chips.push(config.fill)\n if (policy.position) chips.push(`pos=${config.position ?? 'after-user'}`)\n if (config.mergeMode === 'merged') chips.push('merged')\n if ((config.order ?? 0) !== 0) chips.push(`order=${config.order}`)\n if (config.group) chips.push(config.exclusive === true ? `exclusive:${config.group}` : `group:${config.group}`)\n return (\n <article\n className={clsx(styles.configCard, props.expanded && styles.configCardOpen)}\n data-dragging={props.drag?.dragging ? '' : undefined}\n data-drop-before={props.drag?.dropBefore ? '' : undefined}\n data-drop-after={props.drag?.dropAfter ? '' : undefined}\n onDragOver={props.drag?.onDragOver}\n onDrop={props.drag?.onDrop}\n onDragEnd={props.drag?.onDragEnd}\n >\n <header className={styles.configHeader}>\n {props.drag !== undefined && (\n <span\n className={styles.dragHandle}\n title=\"拖动调整顺序\"\n aria-hidden=\"true\"\n draggable\n onDragStart={props.drag.onDragStart}\n >⠿</span>\n )}\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={props.onToggleExpanded}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>{config.name && config.name !== config.id ? `${config.id} · ${config.name}` : config.id}</span>\n {config.layer === 'system-section' && config.params?.sectionName === 'deployment:persona' && (\n <span className={styles.configChip} title=\"deployment:persona 同名 shadow:主会话人设(子代理经 scope 链继承)\">人设</span>\n )}\n <span className={styles.configMeta}>{chips.join(' · ')}</span>\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} title={enabled ? '点击关闭' : '点击启用'}>\n <input type=\"checkbox\" checked={enabled} aria-label={`启用 ${config.name ?? config.id}`} onChange={(e) => props.onToggleEnabled(e.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} disabled={!actions.canMoveUp} onClick={actions.onMoveUp}>上移</button>\n <button type=\"button\" className={styles.pillButton} disabled={!actions.canMoveDown} onClick={actions.onMoveDown}>下移</button>\n <button type=\"button\" className={styles.pillButton} onClick={actions.onDuplicate}>复制</button>\n {confirmingDelete ? (\n <>\n <button type=\"button\" className={styles.pillButton} data-danger onClick={actions.onDelete}>确认删除</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(false)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>删除</button>\n )}\n </span>\n </span>\n </header>\n {props.expanded && <PromptConfigForm meta={meta} config={config} onPatch={props.onPatch} />}\n </article>\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { bridgePost, errorMessage } from './prompt-tool-bridge.ts'\nimport { PromptConfigCard } from './PromptConfigCard.tsx'\nimport type { EngineMeta, PromptConfigDraft, ValidationErrorEntry } from './prompt-tool-types.ts'\nimport styles from './PromptUi.module.css'\n\ninterface ValidateResult {\n ok: boolean\n valid: boolean\n errors?: ValidationErrorEntry[]\n message?: string\n}\n\nexport interface PromptConfigListProps {\n meta: EngineMeta\n configs: PromptConfigDraft[]\n savedConfigs: PromptConfigDraft[]\n /** 传入 layer 时只展示该层配置;不传展示全部配置。 */\n layer?: string\n /** 传入 scope 时按 audience 作用域过滤:main = 非仅子代理(主会话可见);subagent = 非仅主会话(子代理可见;缺省公用两边都可见)。 */\n scope?: 'main' | 'subagent'\n /** 列表工具栏追加操作(如「新建模板」)。 */\n extraActions?: ReactNode\n /** 列表头部之后、配置卡片之前渲染的固定卡片(如模板变量——归类于配置列表下)。 */\n beforeCards?: ReactNode\n /** 空状态追加提示(如「当前预设模板该层无配置」)。 */\n emptyHint?: string\n onPatchConfigs: (configs: PromptConfigDraft[]) => void\n onSaveConfigs: (configs: PromptConfigDraft[]) => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n}\n\nconst layerOf = (config: PromptConfigDraft): string => config.layer ?? 'pre-step'\n\n/** 与列表一致的显示视图排序:按(层序, order, 声明序)稳定排序,返回排序后 id 序列。 */\nfunction viewOrderedIds(\n all: PromptConfigDraft[],\n layer: string | undefined,\n layers: readonly string[],\n): string[] {\n const layerRank = (config: PromptConfigDraft): number => {\n const index = layers.indexOf(layerOf(config))\n return index < 0 ? layers.length : index\n }\n return all\n .map((config, index) => ({ config, index }))\n .filter((entry) => layer === undefined || layerOf(entry.config) === layer)\n .sort((a, b) => {\n const byLayer = layerRank(a.config) - layerRank(b.config)\n if (byLayer !== 0) return byLayer\n const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0)\n if (byOrder !== 0) return byOrder\n return a.index - b.index\n })\n .map((entry) => entry.config.id)\n}\n\n/**\n * 在显示视图中向上/向下移动:目标 = 当前项的显示相邻项(层序/order/声明序),\n * 交换两者的 order 与数组位置——显示顺序与引擎注入顺序(数组序)同步变化。\n * 修复:此前按数组相邻交换,跨层配置混合时数组顺序 ≠ 显示顺序,上移/下移视觉失效。\n */\nfunction moveWithinLayer(\n all: PromptConfigDraft[],\n globalIndex: number,\n delta: -1 | 1,\n layer?: string,\n layers?: readonly string[],\n): PromptConfigDraft[] {\n const currentId = all[globalIndex]?.id\n if (currentId === undefined) return all\n const view = viewOrderedIds(all, layer, layers ?? [])\n const viewIndex = view.indexOf(currentId)\n const targetViewIndex = viewIndex + delta\n if (viewIndex < 0 || targetViewIndex < 0 || targetViewIndex >= view.length) return all\n const targetId = view[targetViewIndex]!\n const currentIndex = all.findIndex((config) => config.id === currentId)\n const targetIndex = all.findIndex((config) => config.id === targetId)\n if (currentIndex < 0 || targetIndex < 0) return all\n const next = [...all]\n const current = next[currentIndex]\n const targetCard = next[targetIndex]\n // 引擎按 order 升序渲染(executor pre-step / layers 同规则):层内移动必须同步\n // 交换 order,否则拖拽后实际注入顺序不变(显示与引擎脱节 = 排序混乱)。\n if (current === undefined || targetCard === undefined) return all\n next[currentIndex] = { ...targetCard, order: current.order ?? 0 }\n next[targetIndex] = { ...current, order: targetCard.order ?? 0 }\n return next\n}\n\n/** 拖拽移动到目标显示位置:把 source 移到 target 前/后,用显示视图相邻交换逐步到位\n * (order 链式交换,与连续点击上移/下移等价)。 */\nfunction moveToView(\n all: PromptConfigDraft[],\n sourceId: string,\n targetId: string,\n before: boolean,\n layer?: string,\n layers?: readonly string[],\n): PromptConfigDraft[] {\n const view = viewOrderedIds(all, layer, layers ?? [])\n const sourceIndex = view.indexOf(sourceId)\n if (sourceIndex < 0) return all\n const rest = view.filter((id) => id !== sourceId)\n const targetIndex = rest.indexOf(targetId)\n if (targetIndex < 0) return all\n const targetViewIndex = targetIndex + (before ? 0 : 1)\n if (targetViewIndex === sourceIndex) return all\n const steps = targetViewIndex - sourceIndex\n const delta: -1 | 1 = steps > 0 ? 1 : -1\n let current = all\n for (let step = 0; step < Math.abs(steps); step++) {\n const globalIndex = current.findIndex((config) => config.id === sourceId)\n if (globalIndex < 0) break\n current = moveWithinLayer(current, globalIndex, delta, layer, layers)\n }\n return current\n}\n\n/** 共享的提示词配置列表:校验、保存、脏检测、复制、删除、层内移动。 */\nexport function PromptConfigList(props: PromptConfigListProps): ReactNode {\n const { meta, configs, savedConfigs, layer, scope, extraActions, beforeCards, emptyHint, onPatchConfigs, onSaveConfigs, onNotice } = props\n const [expanded, setExpanded] = useState<string | undefined>(undefined)\n const [errors, setErrors] = useState<ValidationErrorEntry[]>([])\n const [validating, setValidating] = useState(false)\n const [saving, setSaving] = useState(false)\n const [filter, setFilter] = useState('')\n /** 拖拽排序状态:源卡片 id + 落点(目标 id + 前/后)。 */\n const [dragId, setDragId] = useState<string | undefined>(undefined)\n const [dropTarget, setDropTarget] = useState<{ id: string; before: boolean } | undefined>(undefined)\n /** 合并过滤下拉:全部 / 世界书(策略)/ 各注入层级。外部 layer prop 传入时固定该层。 */\n const [viewFilter, setViewFilter] = useState<string>('all')\n\n const effectiveLayer = layer ?? (viewFilter !== 'all' && viewFilter !== 'world-book' ? viewFilter : undefined)\n const visible = effectiveLayer === undefined\n ? configs\n : configs.filter((config) => layerOf(config) === effectiveLayer)\n const scoped = scope === undefined\n ? visible\n : visible.filter((config) => {\n const mode = config.audience\n return scope === 'main' ? mode !== 'subagent' : mode !== 'main'\n })\n const byStrategy = viewFilter !== 'world-book'\n ? scoped\n : scoped.filter((config) => config.strategy === 'world-book')\n const keyword = filter.trim().toLowerCase()\n const filtered = keyword.length === 0\n ? byStrategy\n : byStrategy.filter((config) =>\n [config.id, config.name ?? '', config.strategy ?? ''].join(' ').toLowerCase().includes(keyword))\n // 显示顺序 = 引擎注入顺序:按(层序, order, 声明序)稳定排序,跨层全量视图\n // 也一致;order 相同时保持数组原序(同值稳定)。\n const layerRank = (config: PromptConfigDraft): number => {\n const index = meta.layers.indexOf(layerOf(config))\n return index < 0 ? meta.layers.length : index\n }\n const ordered = filtered\n .map((config, index) => ({ config, index }))\n .sort((a, b) => {\n const byLayer = layerRank(a.config) - layerRank(b.config)\n if (byLayer !== 0) return byLayer\n const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0)\n if (byOrder !== 0) return byOrder\n return a.index - b.index\n })\n .map((entry) => entry.config)\n /** 按过滤后可见配置一次性启用/禁用(批量开关)。 */\n const batchSetEnabled = (enabled: boolean): void => {\n const visibleIds = new Set(ordered.map((config) => config.id))\n onPatchConfigs(configs.map((config) => visibleIds.has(config.id) ? { ...config, enabled } : config))\n }\n\n const dirty = JSON.stringify(configs) !== JSON.stringify(savedConfigs)\n\n const runValidate = async (target: PromptConfigDraft[]): Promise<boolean> => {\n setValidating(true)\n try {\n const res = await bridgePost<ValidateResult>('/configs-validate', { promptConfigs: target })\n if (!res.ok) {\n onNotice('error', '校验请求失败:' + (res.message ?? 'settings bridge unavailable'))\n return false\n }\n setErrors(res.value.valid ? [] : res.value.errors ?? [])\n return res.value.valid\n } catch (error) {\n onNotice('error', '校验请求失败:' + errorMessage(error))\n return false\n } finally {\n setValidating(false)\n }\n }\n\n const save = async () => {\n setSaving(true)\n const valid = await runValidate(configs)\n if (valid) {\n setErrors([])\n onSaveConfigs(configs)\n onNotice('ok', `已校验并保存(${configs.length} 条)`)\n }\n setSaving(false)\n }\n\n const discard = () => {\n onPatchConfigs(savedConfigs)\n setErrors([])\n setExpanded(undefined)\n }\n\n const patchAt = (globalIndex: number, patch: Partial<PromptConfigDraft>) => {\n onPatchConfigs(configs.map((config, index) => index === globalIndex ? { ...config, ...patch } : config))\n }\n\n const removeAt = (globalIndex: number) => {\n const removedId = configs[globalIndex]?.id\n if (removedId === undefined) return\n // 删除确认由卡片头部「删除 → 确认删除」两段式承担(宿主 webview 禁 window.confirm,不依赖原生弹窗)。\n onPatchConfigs(configs.filter((_, index) => index !== globalIndex))\n if (expanded === removedId) setExpanded(undefined)\n onNotice('ok', '已删除')\n }\n\n const duplicateAt = (globalIndex: number) => {\n const source = configs[globalIndex]\n if (source === undefined) return\n let id = `${source.id}-copy`\n let suffix = 2\n while (configs.some((config) => config.id === id)) {\n id = `${source.id}-copy${suffix}`\n suffix += 1\n }\n const clone = JSON.parse(JSON.stringify(source)) as PromptConfigDraft\n clone.id = id\n onPatchConfigs([...configs, clone])\n setExpanded(id)\n onNotice('ok', '已复制')\n }\n\n const renderCard = (config: PromptConfigDraft) => {\n const globalIndex = configs.indexOf(config)\n const view = viewOrderedIds(configs, layer, meta.layers)\n const position = view.indexOf(config.id)\n const isOpen = expanded === config.id\n return (\n <PromptConfigCard\n key={config.id}\n meta={meta}\n config={config}\n expanded={isOpen}\n drag={{\n dragging: dragId === config.id,\n dropBefore: dropTarget?.id === config.id && dropTarget.before,\n dropAfter: dropTarget?.id === config.id && !dropTarget.before,\n onDragStart: (event) => {\n setDragId(config.id)\n event.dataTransfer.effectAllowed = 'move'\n },\n onDragOver: (event) => {\n event.preventDefault()\n if (dragId === undefined || dragId === config.id) return\n const rect = event.currentTarget.getBoundingClientRect()\n setDropTarget({ id: config.id, before: event.clientY < rect.top + rect.height / 2 })\n },\n onDrop: (event) => {\n event.preventDefault()\n const target = dropTarget\n if (dragId !== undefined && target !== undefined && dragId !== config.id) {\n onPatchConfigs(moveToView(configs, dragId, target.id, target.before, layer, meta.layers))\n }\n setDragId(undefined)\n setDropTarget(undefined)\n },\n onDragEnd: () => {\n setDragId(undefined)\n setDropTarget(undefined)\n },\n }}\n onToggleExpanded={() => {\n setExpanded(isOpen ? undefined : config.id)\n }}\n onToggleEnabled={(enabled) => patchAt(globalIndex, { enabled })}\n onPatch={(patch) => patchAt(globalIndex, patch)}\n actions={{\n canMoveUp: position > 0,\n canMoveDown: position >= 0 && position < view.length - 1,\n onMoveUp: () => onPatchConfigs(moveWithinLayer(configs, globalIndex, -1, layer, meta.layers)),\n onMoveDown: () => onPatchConfigs(moveWithinLayer(configs, globalIndex, 1, layer, meta.layers)),\n onDuplicate: () => duplicateAt(globalIndex),\n onDelete: () => removeAt(globalIndex),\n }}\n />\n )\n }\n\n return (\n <section className={styles.section} aria-labelledby=\"prompt-tool-configs-heading\">\n <div className={styles.sectionHeading}>\n <div><h2 id=\"prompt-tool-configs-heading\">{layer === undefined ? '模块列表' : '本层配置'}</h2><p>{scoped.length} 条配置 · {scoped.filter((config) => config.enabled !== false).length} 条启用;上下移动控制同层顺序。</p></div>\n <div className={styles.sectionActions}>\n {extraActions}\n <button type=\"button\" className={styles.pillButton} disabled={validating} onClick={() => void runValidate(configs)}>{validating && <span className={styles.spinner} aria-hidden=\"true\" />}{validating ? '校验中…' : '校验'}</button>\n <button type=\"button\" className={styles.primaryPill} disabled={saving || validating} onClick={() => void save()}>{saving && <span className={styles.spinner} aria-hidden=\"true\" />}{saving ? '保存中…' : '保存'}</button>\n </div>\n </div>\n\n {scoped.length > 0 && (\n <div className={styles.listFilterRow}>\n <input\n className={styles.listFilter}\n value={filter}\n aria-label=\"过滤模块列表\"\n placeholder=\"过滤:按 id / 名称…\"\n spellCheck={false}\n onChange={(event) => setFilter(event.target.value)}\n />\n {layer === undefined && (\n <select\n className={styles.listFilter}\n value={viewFilter}\n aria-label=\"按层级或策略过滤\"\n onChange={(event) => setViewFilter(event.target.value)}\n >\n <option value=\"all\">全部</option>\n <option value=\"world-book\">世界书</option>\n {meta.layers.map((item) => (\n <option key={item} value={item}>层级:{item}</option>\n ))}\n </select>\n )}\n <span className={styles.batchControls}>\n <button type=\"button\" className={styles.pillButton} disabled={ordered.length === 0}\n onClick={() => batchSetEnabled(true)}>启用</button>\n <button type=\"button\" className={styles.pillButton} disabled={ordered.length === 0}\n onClick={() => batchSetEnabled(false)}>禁用</button>\n </span>\n </div>\n )}\n\n {errors.length > 0 && (\n <div className={styles.configErrorBox}>\n {errors.map((error, index) => (\n <div key={`${error.index}-${index}`} className={styles.configErrorLine}>[{error.index}] {error.id || '(缺 id)'}:{error.message}</div>\n ))}\n </div>\n )}\n\n {/* 归类于配置列表下的固定卡片(模板变量:可折叠 / 可删除 / 可新建)。 */}\n {beforeCards}\n\n {scoped.length === 0 ? (\n <div className={styles.emptyState}><span className={styles.emptyGlyph} aria-hidden=\"true\">⌁</span><div><h3>{scope === 'subagent' ? '还没有子代理可见的配置' : layer === undefined ? '还没有自定义配置' : '本层还没有自定义配置'}</h3><p>{scope === 'subagent' ? '从上方「新建」插入一条(插入后可在卡片「消息受众」下拉自由切换仅主会话/公用/仅子代理),或到主设置「配置」从目录导入。' : layer === undefined ? '从上方模板插入一条,或从本地目录导入;默认四条内置配置不受影响。' : '请到主设置「配置」从模板插入或从目录导入。'}</p>{emptyHint !== undefined && <p className={styles.readOnly}>{emptyHint}</p>}</div></div>\n ) : filtered.length === 0 ? (\n <p className={styles.readOnly} role=\"status\">没有匹配「{filter.trim()}」的配置。</p>\n ) : (\n <div className={styles.configList}>\n {ordered.map((config) => renderCard(config))}\n </div>\n )}\n\n <div className={styles.feedback} aria-live=\"polite\">\n {dirty && <p className={styles.readOnly}>模块列表有未保存修改。</p>}\n </div>\n\n <footer className={`${styles.actions} ${dirty ? styles.actionsVisible : ''}`} aria-live=\"polite\">\n <span>{dirty ? '有未保存修改' : ''}</span>\n <div>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" disabled={saving || !dirty} onClick={discard}>放弃修改</button>\n <button type=\"button\" className={styles.save} disabled={saving || validating || !dirty} onClick={() => void save()}>{saving && <span className={styles.spinner} aria-hidden=\"true\" />}{saving ? '保存中…' : '保存全部'}</button>\n </div>\n </footer>\n </section>\n )\n}\n","/** 内置模板选择弹窗:按注入层分组展示;传入 layer 时只显示该层模板。 */\r\nimport { useEffect, useRef, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react'\r\nimport styles from './PromptUi.module.css'\r\nimport type { PromptConfigTemplateEntry } from './prompt-tool-types.ts'\r\n\r\nexport const TEMPLATE_LAYER_TITLES: Record<string, string> = {\r\n 'pre-step': '消息批层',\r\n 'system-section': '系统段层',\r\n 'runtime-context': '运行上下文',\r\n 'agent-request': '调用配置层',\r\n 'llm-stream': '模型流层',\r\n 'tool-pipeline': '工具管线层',\r\n}\r\n\r\nexport function TemplatePicker(props: {\r\n templates: PromptConfigTemplateEntry[]\r\n /** 传入 layer 时只显示该层模板(无分组标题);不传按层分组展示全部。 */\r\n layer?: string\n onPick: (entry: PromptConfigTemplateEntry) => void\n /** 可选:「模板变量(Variables)」固定入口——点击不插入配置,由宿主展开模板变量卡片。 */\n onPickVariables?: () => void\n onClose: () => void\n}): ReactNode {\n const { templates, layer, onPick, onPickVariables, onClose } = props\n const dialogRef = useRef<HTMLDivElement>(null)\r\n const restoreRef = useRef<HTMLElement | null>(null)\r\n\r\n // 打开时记录触发元素并聚焦弹窗首控件;关闭时还原焦点(焦点陷阱闭环)。\r\n useEffect(() => {\r\n restoreRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null\r\n dialogRef.current?.querySelector<HTMLElement>('button')?.focus()\r\n return () => { restoreRef.current?.focus() }\r\n }, [])\r\n\r\n const onDialogKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>): void => {\r\n if (event.key === 'Escape') {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n onClose()\r\n return\r\n }\r\n if (event.key !== 'Tab') return\r\n const dialog = dialogRef.current\r\n if (dialog === null) return\r\n const focusables = [...dialog.querySelectorAll<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\r\n )].filter((element) => !element.hasAttribute('disabled'))\r\n if (focusables.length === 0) return\r\n const first = focusables[0]!\r\n const last = focusables[focusables.length - 1]!\r\n const active = document.activeElement\r\n if (event.shiftKey) {\r\n if (active === first || !dialog.contains(active)) {\r\n event.preventDefault()\r\n last.focus()\r\n }\r\n } else if (active === last || !dialog.contains(active)) {\r\n event.preventDefault()\r\n first.focus()\r\n }\r\n }\r\n\r\n const visible = layer === undefined\r\n ? templates\r\n : templates.filter((template) => (template.spec.layer ?? 'pre-step') === layer)\r\n const groups = new Map<string, PromptConfigTemplateEntry[]>()\r\n for (const template of visible) {\r\n const key = template.spec.layer ?? 'pre-step'\r\n const items = groups.get(key)\r\n if (items === undefined) groups.set(key, [template])\r\n else items.push(template)\r\n }\r\n return (\r\n <div className={styles.modalBackdrop} onClick={onClose}>\r\n <div\r\n ref={dialogRef}\r\n className={styles.templateModal}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label=\"选择内置模板\"\r\n onClick={(event) => event.stopPropagation()}\r\n onKeyDown={onDialogKeyDown}\r\n >\r\n <div className={styles.templateModalHead}>\r\n <strong>选择内置模板{layer !== undefined ? `(${TEMPLATE_LAYER_TITLES[layer] ?? layer})` : ''}</strong>\r\n <button type=\"button\" className={styles.pillButton} aria-label=\"关闭模板选择\" onClick={onClose}>×</button>\r\n </div>\n <div className={styles.templateModalList}>\n {onPickVariables !== undefined && (\n <div className={styles.templateGroup}>\n <strong className={styles.templateGroupTitle}>变量</strong>\n <button type=\"button\" className={styles.templateModalItem} onClick={onPickVariables}>\n <strong>Variables</strong>\n <small>{'模板变量(预设级 {{key}} 插值)'}</small>\n </button>\n </div>\n )}\n {visible.length === 0 && <p className={styles.configFieldHint}>本层暂无内置模板。</p>}\n {[...groups.entries()].map(([groupLayer, items]) => (\r\n <div key={groupLayer} className={styles.templateGroup}>\r\n {layer === undefined && <strong className={styles.templateGroupTitle}>{TEMPLATE_LAYER_TITLES[groupLayer] ?? groupLayer}</strong>}\r\n {items.map((template) => (\r\n <button key={template.file} type=\"button\" className={styles.templateModalItem} onClick={() => onPick(template)}>\r\n <strong>{template.file}</strong>\r\n <small>{template.spec.name ?? template.spec.id}</small>\r\n </button>\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","/** 模板库加载 + 插入共享逻辑:PromptConfigsEditor 与各配置列表页(六层/子代理)共用。 */\r\nimport { useState } from 'react'\r\nimport { bridgePost, errorMessage } from './prompt-tool-bridge.ts'\r\nimport type { PromptConfigDraft, PromptConfigTemplateEntry } from './prompt-tool-types.ts'\r\n\r\ninterface TemplatesResult {\r\n ok: boolean\r\n templates?: PromptConfigTemplateEntry[]\r\n message?: string\r\n}\r\n\r\nexport function useTemplatePicker(\r\n configs: PromptConfigDraft[],\r\n onPickConfig: (config: PromptConfigDraft) => void,\r\n onNotice: (kind: 'ok' | 'error', message: string) => void,\r\n): {\r\n templates: PromptConfigTemplateEntry[]\r\n open: boolean\r\n openPicker: () => void\r\n closePicker: () => void\r\n pickTemplate: (entry: PromptConfigTemplateEntry) => void\r\n} {\r\n const [templates, setTemplates] = useState<PromptConfigTemplateEntry[]>([])\r\n const [open, setOpen] = useState(false)\r\n\r\n const loadTemplates = async (): Promise<void> => {\r\n if (templates.length > 0) return\r\n try {\r\n const res = await bridgePost<TemplatesResult>('/templates', {})\r\n if (!res.ok) {\r\n onNotice('error', '读取模板库失败:' + (res.message ?? 'settings bridge unavailable'))\r\n return\r\n }\r\n if (!Array.isArray(res.value.templates)) {\r\n onNotice('error', '读取模板库失败:模板列表为空')\r\n return\r\n }\r\n setTemplates(res.value.templates)\r\n } catch (error) {\r\n onNotice('error', '读取模板库失败:' + errorMessage(error))\r\n }\r\n }\r\n\r\n const openPicker = (): void => {\r\n setOpen(true)\r\n void loadTemplates()\r\n }\r\n\r\n const closePicker = (): void => setOpen(false)\r\n\r\n const pickTemplate = (entry: PromptConfigTemplateEntry): void => {\r\n if (configs.some((config) => config.id === entry.spec.id)) {\r\n onNotice('error', `id 已存在:${entry.spec.id}(请先改名或删除同 id 配置)`)\r\n return\r\n }\r\n const clone = JSON.parse(JSON.stringify(entry.spec)) as PromptConfigDraft\r\n onPickConfig(clone)\r\n onNotice('ok', `已插入模板 ${entry.file}(id=${clone.id})`)\r\n setOpen(false)\r\n }\r\n\r\n return { templates, open, openPicker, closePicker, pickTemplate }\r\n}\r\n","import { useRef, useState, type FocusEvent, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { PromptConfigList } from './PromptConfigList.tsx'\nimport { TemplatePicker } from './TemplatePicker.tsx'\nimport { useTemplatePicker } from './useTemplatePicker.ts'\nimport { VariablesEditor } from './PromptConfigCard.tsx'\nimport styles from './PromptUi.module.css'\n\nimport type { EngineMeta, PromptConfigDraft } from './prompt-tool-types.ts'\n\nexport type { PromptConfigDraft, LayerFieldPolicy } from './prompt-tool-types.ts'\nexport type { ValidationErrorEntry } from './prompt-tool-types.ts'\nexport { Field, JsonField, PromptConfigCard, PromptConfigForm, SOURCE_FORMS, SOURCE_KINDS, fieldPolicyFor } from './PromptConfigCard.tsx'\nexport type { PromptConfigCardActions } from './PromptConfigCard.tsx'\nexport type { PromptConfigTemplateEntry } from './prompt-tool-types.ts'\n\nexport interface PromptConfigsEditorProps {\n meta: EngineMeta\n configs: PromptConfigDraft[]\n savedConfigs: PromptConfigDraft[]\n onPatchConfigs: (configs: PromptConfigDraft[]) => void\n onSaveConfigs: (configs: PromptConfigDraft[]) => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n /** 预设级模板变量(preset.yml 顶层 variables 段;编辑入口与模块列表统一)。 */\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n}\n\n/** 预设级模板变量模块卡片(归类于配置列表下):{{key}} 插值源,非 promptConfig——\n * 不进配置保存路径,保存走 /preset-variables 写 preset.yml 顶层 variables 段。\n * 可折叠(chevron)/ 可删除(清空全部变量,两段式确认)/ 可新建(VariablesEditor 添加变量)。 */\nfunction TemplateVariablesModuleCard(props: {\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n expanded: boolean\n onToggleExpanded: () => void\n}): ReactNode {\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const cardRef = useRef<HTMLElement>(null)\n const count = Object.keys(props.templateVariables).length\n const enabled = props.templateVariablesEnabled\n // 无变量时不显示卡片(模块列表恢复干净;「新建 → Variables」添加空行后自动出现)。\n if (count === 0) return null\n const clearAll = (): void => {\n props.setTemplateVariables({})\n void props.saveTemplateVariables({})\n setConfirmingDelete(false)\n if (props.expanded) props.onToggleExpanded()\n }\n /** 失焦自动保存:焦点离开卡片容器(含收起/切换开关/点击删除)即持久化。 */\n const autoSaveOnBlur = (event: FocusEvent<HTMLElement>): void => {\n const next = event.relatedTarget\n if (next === null || !cardRef.current?.contains(next as Node)) {\n void props.saveTemplateVariables()\n }\n }\n return (\n <article ref={cardRef} className={styles.configCard} onBlur={autoSaveOnBlur}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={props.onToggleExpanded}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>模板变量</span>\n <span className={styles.configMeta}>{`预设级 {{key}} 插值 · ${count} 个变量`}</span>\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} title={enabled ? '点击停用模板变量插值' : '点击启用模板变量插值'}>\n <input\n type=\"checkbox\"\n aria-label=\"启用模板变量插值\"\n checked={enabled}\n onChange={(e) => {\n props.setTemplateVariablesEnabled(e.target.checked)\n void props.saveTemplateVariables()\n }}\n />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <span className={styles.configActions}>\n {confirmingDelete ? (\n <>\n <button type=\"button\" className={styles.pillButton} data-danger onClick={clearAll}>确认清空</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(false)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>删除</button>\n )}\n </span>\n </span>\n </header>\n {props.expanded && (\n <div className={styles.configForm}>\n {!enabled && <p className={styles.configFieldHint}>{'模板变量插值已停用:{{key}} 将不再被替换(预设级变量文件不生成)。'}</p>}\n <VariablesEditor value={props.templateVariables} onChange={(next) => props.setTemplateVariables(next ?? {})} />\n </div>\n )}\n </article>\n )\n}\n\n/** 提示词配置编辑器:配置列表(层级/策略过滤已并入列表)+ 模板插入 + 保存前权威校验。 */\nexport function PromptConfigsEditor(props: PromptConfigsEditorProps): ReactNode {\n const [templateVarsExpanded, setTemplateVarsExpanded] = useState(false)\n const templatePicker = useTemplatePicker(\n props.configs,\n (config) => props.onPatchConfigs([...props.configs, config]),\n props.onNotice,\n )\n /** 「新建 → Variables」:展开模板变量卡片并添加一个待编辑空行。 */\n const pickVariables = (): void => {\n props.setTemplateVariables({ ...props.templateVariables, '': '' })\n setTemplateVarsExpanded(true)\n templatePicker.closePicker()\n }\n return (\n <section className={styles.page} aria-label=\"提示词配置\">\n <PromptConfigList\n meta={props.meta}\n configs={props.configs}\n savedConfigs={props.savedConfigs}\n extraActions={<button type=\"button\" className={styles.primaryPill} onClick={templatePicker.openPicker}>新建</button>}\n beforeCards={\n <TemplateVariablesModuleCard\n templateVariables={props.templateVariables}\n setTemplateVariables={props.setTemplateVariables}\n templateVariablesEnabled={props.templateVariablesEnabled}\n setTemplateVariablesEnabled={props.setTemplateVariablesEnabled}\n saveTemplateVariables={props.saveTemplateVariables}\n expanded={templateVarsExpanded}\n onToggleExpanded={() => setTemplateVarsExpanded(!templateVarsExpanded)}\n />\n }\n onPatchConfigs={props.onPatchConfigs}\n onSaveConfigs={props.onSaveConfigs}\n onNotice={props.onNotice}\n />\n\n {templatePicker.open && (\n <TemplatePicker\n templates={templatePicker.templates}\n onPick={templatePicker.pickTemplate}\n onPickVariables={pickVariables}\n onClose={templatePicker.closePicker}\n />\n )}\n\n <p className={styles.settingsNote}>提示词配置写入 <code>settings.promptConfigs</code>;外部提示词配置可经「预设配置 → 导入预设」引入。</p>\n </section>\n )\n}\n","/** 预设切换器:预设全部在用户目录(首次启动种子化),列表点击切换;新建 = 从内置模板复制还原。 */\nimport { useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconCopyOutline16, IconFolderOpenOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\nimport styles from './PromptUi.module.css'\n\nexport function PresetSwitcher(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = store.fields\n const presets = store.meta.presets ?? []\n const templates = store.meta.builtinTemplates ?? []\n const [importing, setImporting] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState<string | undefined>(undefined)\n const [pickerOpen, setPickerOpen] = useState(false)\n const dialogRef = useRef<HTMLDivElement>(null)\n const yamlRef = useRef<HTMLInputElement>(null)\n const dirRef = useRef<HTMLInputElement>(null)\n\n // 新建弹窗:聚焦首控件 + Esc 关闭。\n useEffect(() => {\n if (!pickerOpen) return\n dialogRef.current?.querySelector<HTMLElement>('button')?.focus()\n const onKeyDown = (event: globalThis.KeyboardEvent): void => {\n if (event.key === 'Escape') setPickerOpen(false)\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [pickerOpen])\n\n /** 上传预设包:path 为相对路径(preset.yml 或文件夹内文件),服务端按 id 归入用户预设目录。 */\n const uploadPreset = async (entries: Array<{ path: string; content: string }>): Promise<void> => {\n if (entries.length === 0) return\n setImporting(true)\n try {\n const res = await bridgePost<{ id: string }>('/import-preset-package', { files: entries })\n if (res.ok) {\n store.showNotice('ok', `预设 ${res.value.id} 已导入,点击卡片即可切换`)\n await store.load()\n } else {\n store.showNotice('error', '导入预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setImporting(false)\n }\n }\n\n /** 导入单个配置文件:preset.yml / 任意 *.yml/*.yaml / SillyTavern *.json(服务端按扩展名分流)。 */\n const pickPresetYaml = (file: File | undefined): void => {\n if (file === undefined) return\n void (async () => {\n const path = /\\.json$/i.test(file.name) ? file.name : 'preset.yml'\n await uploadPreset([{ path, content: await file.text() }])\n })()\n }\n\n /** 导入整个预设文件夹(webkitdirectory;传原始相对路径,顶层目录段由服务端剥离)。 */\n const pickPresetDir = (files: FileList | null): void => {\n if (files === null || files.length === 0) return\n void (async () => {\n const entries: Array<{ path: string; content: string }> = []\n for (const file of Array.from(files)) {\n entries.push({ path: file.webkitRelativePath || file.name, content: await file.text() })\n }\n await uploadPreset(entries)\n })()\n }\n\n /** 导出当前预设为单文件配置(浏览器下载,可保存到任意目录)。 */\n const exportPreset = async (): Promise<void> => {\n const res = await bridgePost<{ id: string; name: string; content: string }>('/export-preset', { id: fields.presetTemplate })\n if (!res.ok) {\n store.showNotice('error', '导出预设失败:' + (res.message ?? 'settings bridge unavailable'))\n return\n }\n const blob = new Blob([res.value.content], { type: 'application/yaml' })\n const url = URL.createObjectURL(blob)\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = `${res.value.id}.preset.yml`\n anchor.click()\n URL.revokeObjectURL(url)\n store.showNotice('ok', `已导出 ${res.value.id}.preset.yml(单文件配置,可保存到任意目录)`)\n }\n\n /** 删除预设(物理删除用户目录副本;插件目录模板保留,可经「新建预设」还原)。 */\n const deletePreset = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-delete', { id })\n if (res.ok) {\n setConfirmingDelete(undefined)\n store.showNotice('ok', `预设 ${id} 已删除(可经「新建预设」从内置模板还原)`)\n await store.load()\n } else {\n store.showNotice('error', '删除预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 复制预设:用户目录完整副本,id 自动递增(<id>-copy / <id>-copy-2 / …)。 */\n const duplicatePreset = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-duplicate', { id })\n if (res.ok) {\n store.showNotice('ok', `已复制为预设 ${res.value.id}`)\n await store.load()\n } else {\n store.showNotice('error', '复制预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 打开预设文件夹(宿主系统文件管理器;失败时提示路径)。 */\n const openLocation = async (id: string): Promise<void> => {\n const res = await bridgePost<{ path: string }>('/preset-open', { id })\n if (res.ok) {\n store.showNotice('ok', `已打开预设文件夹:${res.value.path}`)\n } else {\n store.showNotice('error', '打开预设文件夹失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 新建:从插件目录模板复制到用户目录(还原/自定义起点);自定义入口重名自动递增。 */\n const clonePreset = async (id: string, autoSuffix = false): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-clone', { id, autoSuffix })\n if (res.ok) {\n setPickerOpen(false)\n store.showNotice('ok', `已从内置模板新建预设 ${res.value.id}`)\n await store.load()\n } else {\n store.showNotice('error', '新建预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n const onDialogKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (event.key !== 'Tab' || dialogRef.current === null) return\n const focusables = [...dialogRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )].filter((element) => !element.hasAttribute('disabled'))\n if (focusables.length === 0) return\n const first = focusables[0]!\n const last = focusables[focusables.length - 1]!\n const active = document.activeElement\n if (event.shiftKey) {\n if (active === first || !dialogRef.current.contains(active)) {\n event.preventDefault()\n last.focus()\n }\n } else if (active === last || !dialogRef.current.contains(active)) {\n event.preventDefault()\n first.focus()\n }\n }\n\n return (\n <div className={styles.rowGroup}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>预设模板</strong>\n <small>预设保存在用户目录(首次启动自动内置全部模板);点击卡片即切换并按新模板重建生成目录。删除后可从内置模板「新建」还原;导入预设 = 选择 preset.yml / 任意 *.yml/*.yaml / SillyTavern *.json 配置文件,或整个预设文件夹。</small>\n </span>\n <span className={styles.inlineControls}>\n <input\n ref={yamlRef}\n type=\"file\"\n accept=\".yml,.yaml,.json\"\n className={styles.visuallyHidden}\n aria-label=\"选择 preset.yml / SillyTavern JSON 配置文件\"\n onChange={(event) => { pickPresetYaml(event.target.files?.[0]); event.target.value = '' }}\n />\n <input\n ref={dirRef}\n type=\"file\"\n // @ts-expect-error webkitdirectory 为 Chromium 扩展属性(文件夹选择)。\n webkitdirectory=\"\"\n className={styles.visuallyHidden}\n aria-label=\"选择预设文件夹\"\n onChange={(event) => { pickPresetDir(event.target.files); event.target.value = '' }}\n />\n <button type=\"button\" className={styles.primaryPill} onClick={() => setPickerOpen(true)}>新建预设</button>\n <button type=\"button\" className={styles.pillButton} disabled={importing} onClick={() => yamlRef.current?.click()}>\n {importing ? '导入中…' : '导入预设'}\n </button>\n <button type=\"button\" className={styles.pillButton} disabled={importing} onClick={() => dirRef.current?.click()}>\n 导入文件夹\n </button>\n <button type=\"button\" className={styles.pillButton} onClick={() => void exportPreset()}>\n 导出预设\n </button>\n </span>\n </div>\n <div className={styles.presetGrid}>\n {presets.length === 0 ? (\n <p className={styles.readOnly} role=\"status\">暂无预设;点击上方「新建预设」从内置模板创建,或「导入预设」添加。</p>\n ) : presets.map((preset) => renderCard(preset))}\n </div>\n {pickerOpen && (\n <div className={styles.modalBackdrop} onClick={() => setPickerOpen(false)}>\n <div\n ref={dialogRef}\n className={styles.templateModal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"从内置模板新建预设\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={onDialogKeyDown}\n >\n <div className={styles.templateModalHead}>\n <strong>从内置模板新建预设</strong>\n <button type=\"button\" className={styles.pillButton} aria-label=\"关闭模板选择\" onClick={() => setPickerOpen(false)}>×</button>\n </div>\n <div className={styles.templateModalList}>\n {templates.length === 0 && <p className={styles.configFieldHint}>插件目录无内置模板。</p>}\n <button type=\"button\" className={styles.templateModalItem} data-custom\n title=\"新建一份所有参数为空的自定义预设(重名自动加序号)\"\n onClick={() => void clonePreset('custom', true)}>\n <strong>自定义预设</strong>\n <small>custom · 所有参数为空(空白起点,重名自动加序号)</small>\n </button>\n {templates.map((template) => (\n <button key={template.id} type=\"button\" className={styles.templateModalItem}\n title={`新建到用户目录:${template.id}`} onClick={() => void clonePreset(template.id)}>\n <strong>{template.name}</strong>\n <small>{template.id}</small>\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n\n function renderCard(preset: { id: string; name: string; description?: string }): ReactNode {\n const active = fields.presetTemplate === preset.id\n const confirming = confirmingDelete === preset.id\n return (\n <div key={preset.id} className={clsx(styles.presetCard, active && styles.presetCardActive)}\n data-active={active ? '' : undefined}>\n <button type=\"button\" className={styles.presetCardMain} disabled={!fields.writePreset}\n title={active ? '当前预设模板' : `切换到 ${preset.name}`}\n onClick={() => store.setPresetTemplate(preset.id)}>\n <span className={styles.presetCardHead}>\n <strong className={styles.presetCardName}>{preset.name}</strong>\n {active && <span className={styles.presetInUse}>使用中</span>}\n </span>\n {preset.description !== undefined && preset.description.length > 0\n && <p className={styles.presetCardDesc}>{preset.description}</p>}\n <code className={styles.presetCardId}>{preset.id}</code>\n </button>\n <span className={styles.presetCardFooter}>\n <button type=\"button\" className={styles.presetIconButton} data-tip=\"复制预设\"\n aria-label={`复制预设:${preset.name}`}\n onClick={() => void duplicatePreset(preset.id)}>\n <IconCopyOutline16 />\n </button>\n <button type=\"button\" className={styles.presetIconButton} data-tip=\"打开预设文件夹\"\n aria-label={`打开预设文件夹:${preset.name}`}\n onClick={() => void openLocation(preset.id)}>\n <IconFolderOpenOutline16 />\n </button>\n {confirming ? (\n <span className={styles.presetCardActions}>\n <button type=\"button\" className={styles.pillButton} data-danger disabled={active}\n title=\"删除后可从内置模板「新建」还原\" onClick={() => void deletePreset(preset.id)}>确认删除</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(undefined)}>取消</button>\n </span>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger disabled={active}\n title={active ? '先切换其他预设再删除' : '删除用户目录副本(内置模板保留,可新建还原)'}\n onClick={() => setConfirmingDelete(preset.id)}>删除</button>\n )}\n </span>\n </div>\n )\n }\n}\n","/** 开关行:label + hint + 可选 extra + checkbox。 */\nimport type { ReactNode } from 'react'\nimport styles from './PromptUi.module.css'\n\nexport function ToggleRow(props: { id: string; label: string; hint: string; checked: boolean; disabled?: boolean; extra?: ReactNode; onChange: (value: boolean) => void }): ReactNode {\n return (\n <label className={styles.toggleRow} htmlFor={props.id}>\n <span className={styles.settingCopy}><strong>{props.label}</strong><small>{props.hint}</small></span>\n {props.extra}\n <input id={props.id} type=\"checkbox\" aria-label={props.label} checked={props.checked} disabled={props.disabled} onChange={(event) => props.onChange(event.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n )\n}\n","/** 通用折叠卡片:设置区块统一折叠入口(除模块列表外全部卡片化)。 */\nimport { useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './PromptUi.module.css'\n\nexport function CollapsibleCard(props: {\n id: string\n title: string\n meta?: string\n children: ReactNode\n defaultOpen?: boolean\n}): ReactNode {\n const [open, setOpen] = useState(props.defaultOpen ?? false)\n return (\n <article className={clsx(styles.configCard, open && styles.configCardOpen)}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={open} onClick={() => setOpen((value) => !value)}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>{props.title}</span>\n {props.meta !== undefined && <span className={styles.configMeta}>{props.meta}</span>}\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, open && styles.chevronOpen)} />\n </button>\n </header>\n {open && <div className={styles.configForm}>{props.children}</div>}\n </article>\n )\n}\n","/** 设置输入行:编辑框失焦即保存(与 anchor 文本一致)。 */\nimport type { ReactNode } from 'react'\nimport ui from './PromptUi.module.css'\n\nexport function SettingInputRow(props: {\n id: string\n label: string\n hint: string\n value: string\n type?: 'text' | 'number'\n placeholder?: string\n disabled?: boolean\n onInput: (value: string) => void\n onCommit: () => void\n}): ReactNode {\n return (\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}><strong>{props.label}</strong><small>{props.hint}</small></span>\n <div className={ui.directoryControl}>\n <input\n id={props.id}\n className={ui.directoryInput}\n type={props.type ?? 'text'}\n value={props.value}\n aria-label={props.label}\n placeholder={props.placeholder}\n disabled={props.disabled}\n spellCheck={false}\n autoComplete=\"off\"\n onChange={(event) => props.onInput(event.target.value)}\n onBlur={props.onCommit}\n />\n </div>\n </div>\n </div>\n )\n}\n","/** 「预设和配置」页:全局开关 + 预设切换/导入 + 提示词配置列表统一管理。 */\nimport { type ReactNode } from 'react'\nimport { PresetSwitcher } from './PresetSwitcher.tsx'\nimport { ToggleRow } from './ToggleRow.tsx'\nimport { CollapsibleCard } from './CollapsibleCard.tsx'\nimport { SettingInputRow } from './SettingInputRow.tsx'\nimport ui from './PromptUi.module.css'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\nexport function PresetsPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n return (\n <>\n <section className={ui.section} aria-label=\"全局开关\">\n <div className={ui.rowGroup}>\n <ToggleRow id=\"pt-write-preset\" label=\"全局开关\" hint=\"预设生成总开关,作用于全部六个层级:开启时生成并刷新生成目录;关闭时移除生成目录。关闭/开启后自动重新加载模块卡片。\"\n checked={store.fields.writePreset} onChange={() => store.toggle('writePreset')} />\n </div>\n </section>\n <CollapsibleCard id=\"pt-host-generated\" title=\"AGENTS.md 与生成目录\" meta=\"全局常驻注入、生成路径与显示顺序\">\n <div className={ui.rowGroup}>\n <ToggleRow id=\"pt-write-agents\" label=\"写入 ~/.dsh/AGENTS.md\" hint=\"保持 AGENTS.md 的全局常驻注入;关闭后不再写入,已有文件保持原样。与六层注入无关,属于宿主常驻层。\"\n checked={store.fields.writeAgents} onChange={() => store.toggle('writeAgents')} />\n </div>\n <SettingInputRow id=\"pt-resident-agents-path\" label=\"AGENTS.md 常驻路径\" hint=\"写入/移除 AGENTS.md 受管块的目标文件;修改后下一次开关保存立即切换。\"\n value={store.fields.residentAgentsPath} placeholder={store.fields.residentAgentsPath || '默认 ~/.dsh/AGENTS.md'}\n onInput={(value) => store.patch({ residentAgentsPath: value })}\n onCommit={store.persistSwitches} />\n <SettingInputRow id=\"pt-preset-dir\" label=\"预设根目录\" hint=\"预设根目录(官方 USER_PRESET_DIR);每个预设一个官方预设目录,修改后下次写入会生成到新根,建议同时在宿主 agent-presets 设置里选择该目录。\"\n value={store.fields.presetDir} placeholder={store.fields.presetDir || '默认 ~/.dsh/.agent-presets'}\n onInput={(value) => store.patch({ presetDir: value })}\n onCommit={store.persistSwitches} />\n <SettingInputRow id=\"pt-preset-order\" label=\"preset 显示顺序\" hint=\"生成 preset.yml 的 order;数值小的 preset 在宿主列表中靠前。\"\n type=\"number\" value={String(store.fields.presetOrder)}\n onInput={(value) => store.patch({ presetOrder: Number(value) || 0 })}\n onCommit={store.persistSwitches} />\n </CollapsibleCard>\n <PresetSwitcher store={store} />\n </>\n )\n}\n","/** SillyTavern 角色卡 PNG 解析(对齐官方 src/character-card-parser.js read()):\n * PNG tEXt chunk,关键字 ccv3(v3 优先)/ chara(v2 兜底),值为 base64 编码的\n * 角色卡 JSON。浏览器端解析字节流,不依赖第三方库。 */\n\nexport interface CharacterCardData {\n /** 角色卡 JSON 文本(chara_card_v2/v3,含 data 内层正文)。 */\n jsonText: string\n /** 角色名(顶层 name 或 data.name,缺省回退文件名)。 */\n name: string\n /** 原图 base64(dataURL 逗号后部分,落盘为 avatar.png)。 */\n imageBase64: string\n}\n\nfunction readU32(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset]! << 24) >>> 0) + (bytes[offset + 1]! << 16) + (bytes[offset + 2]! << 8) + bytes[offset + 3]!\n}\n\n/** tEXt 文本为 Latin-1(PNG 规范);关键字/值经此解码后 base64 解出 UTF-8 JSON。 */\nfunction latin1(bytes: Uint8Array): string {\n let text = ''\n for (const byte of bytes) text += String.fromCharCode(byte)\n return text\n}\n\nasync function decodeBase64(text: string): Promise<string> {\n const binary = atob(text)\n const bytes = new Uint8Array(binary.length)\n for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index)\n // V1:明文 base64(JSON);V2:base64(zlib(JSON))——明文 JSON 解析失败时 inflate 回退\n // (对齐官方 character-card-parser read() 与 scripts/extract-st-character.mjs 的 parseChara)。\n const plain = new TextDecoder('utf-8').decode(bytes)\n try {\n JSON.parse(plain)\n return plain\n } catch {\n const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream('deflate'))\n return new TextDecoder('utf-8').decode(await new Response(stream).arrayBuffer())\n }\n}\n\n/** 解析角色卡 PNG:返回角色卡 JSON + 原图 base64。非 PNG / 无角色卡 chunk 抛错。 */\nexport async function parseCharacterCardPng(buffer: ArrayBuffer, fileName: string): Promise<CharacterCardData> {\n const bytes = new Uint8Array(buffer)\n if (bytes.length < 24 || bytes[0] !== 0x89 || bytes[1] !== 0x50 || bytes[2] !== 0x4e || bytes[3] !== 0x47) {\n throw new Error('不是有效的 PNG 文件')\n }\n const chunks: Array<{ keyword: string; text: string }> = []\n let offset = 8\n while (offset + 12 <= bytes.length) {\n const length = readU32(bytes, offset)\n const type = latin1(bytes.subarray(offset + 4, offset + 8))\n const dataStart = offset + 8\n const dataEnd = dataStart + length\n if (type === 'tEXt') {\n let separator = dataStart\n while (separator < dataEnd && bytes[separator] !== 0) separator += 1\n chunks.push({\n keyword: latin1(bytes.subarray(dataStart, separator)).toLowerCase(),\n text: latin1(bytes.subarray(separator + 1, dataEnd)),\n })\n }\n if (type === 'IEND') break\n offset = dataEnd + 4 // 跳过 CRC\n }\n const card = chunks.find((chunk) => chunk.keyword === 'ccv3') ?? chunks.find((chunk) => chunk.keyword === 'chara')\n if (card === undefined) {\n throw new Error('PNG 不含角色卡数据(无 chara/ccv3 tEXt chunk)')\n }\n const jsonText = await decodeBase64(card.text)\n let name = ''\n try {\n const parsed = JSON.parse(jsonText) as { name?: unknown; data?: { name?: unknown } }\n if (typeof parsed.name === 'string' && parsed.name.trim().length > 0) name = parsed.name.trim()\n else if (parsed.data !== null && typeof parsed.data === 'object'\n && typeof parsed.data.name === 'string' && parsed.data.name.trim().length > 0) {\n name = parsed.data.name.trim()\n }\n } catch (error) {\n throw new Error(`角色卡 JSON 解析失败:${error instanceof Error ? error.message : String(error)}`)\n }\n const base64 = (() => {\n let binary = ''\n const chunkSize = 0x8000\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize))\n }\n return btoa(binary)\n })()\n return { jsonText, name: name || fileName.replace(/\\.png$/i, ''), imageBase64: base64 }\n}\n","/** 角色管理页:角色卡库(PNG / JSON 素材 + 转换参数独立存储)。\n * 库中角色卡不直接生成预设——点击「导入到当前预设」把角色卡参数\n * (角色设定 / 系统提示 / 开场白 / 提示词库 / 采样参数)合并进当前激活预设,\n * 已导入的角色卡显示状态并可一键移除。 */\nimport { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { IconFolderOpenOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport { parseCharacterCardPng } from './character-card.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\nimport ui from './PromptUi.module.css'\n\ninterface CharacterCardItem {\n id: string\n name: string\n description?: string\n hasAvatar: boolean\n imported: boolean\n}\n\nexport function CharactersPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const [importing, setImporting] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState<string | undefined>(undefined)\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [characters, setCharacters] = useState<CharacterCardItem[]>([])\n const pngRef = useRef<HTMLInputElement>(null)\n const jsonRef = useRef<HTMLInputElement>(null)\n\n const loadCharacters = async (): Promise<void> => {\n const res = await bridgePost<{ characters: CharacterCardItem[] }>('/characters-list', {})\n if (res.ok) setCharacters(res.value.characters)\n }\n useEffect(() => {\n void loadCharacters()\n }, [])\n\n /** 导入角色卡入库(PNG 解析出 JSON + 原图,JSON 直传)。 */\n const importCard = async (files: FileList | null): Promise<void> => {\n if (files === null || files.length === 0) return\n setImporting(true)\n try {\n for (const file of Array.from(files)) {\n if (/\\.png$/i.test(file.name)) {\n const buffer = await file.arrayBuffer()\n const card = await parseCharacterCardPng(buffer, file.name)\n const res = await bridgePost<{ id: string; name: string }>('/characters-import', {\n files: [\n { path: 'avatar.png', content: card.imageBase64 },\n { path: `${card.name}.json`, content: card.jsonText },\n ],\n })\n if (res.ok) store.showNotice('ok', `角色卡「${res.value.name}」已入库`)\n else store.showNotice('error', '角色卡入库失败:' + (res.message ?? 'settings bridge unavailable'))\n } else if (/\\.json$/i.test(file.name)) {\n const res = await bridgePost<{ id: string; name: string }>('/characters-import', {\n files: [{ path: file.name, content: await file.text() }],\n })\n if (res.ok) store.showNotice('ok', `角色卡「${res.value.name}」已入库`)\n else store.showNotice('error', '角色卡入库失败:' + (res.message ?? 'settings bridge unavailable'))\n } else {\n store.showNotice('error', `不支持的文件类型:${file.name}(仅 .png / .json)`)\n }\n }\n await loadCharacters()\n } catch (error) {\n store.showNotice('error', `角色卡导入失败:${error instanceof Error ? error.message : String(error)}`)\n } finally {\n setImporting(false)\n }\n }\n\n /** 角色卡参数导入当前预设(合并 promptConfigs + params,重建后生效)。 */\n const applyCard = async (id: string): Promise<void> => {\n setBusy(id)\n try {\n const res = await bridgePost<{ id: string; count: number }>('/characters-apply', { id })\n if (res.ok) {\n store.showNotice('ok', `已导入到当前预设(${res.value.count} 条配置)`)\n await store.load()\n await loadCharacters()\n } else {\n store.showNotice('error', '导入到当前预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setBusy(undefined)\n }\n }\n\n /** 从当前预设移除该角色卡参数。 */\n const removeCard = async (id: string): Promise<void> => {\n setBusy(id)\n try {\n const res = await bridgePost<{ id: string; count: number }>('/characters-remove', { id })\n if (res.ok) {\n store.showNotice('ok', `已从当前预设移除(${res.value.count} 条配置)`)\n await store.load()\n await loadCharacters()\n } else {\n store.showNotice('error', '移除失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setBusy(undefined)\n }\n }\n\n const deleteCard = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/characters-delete', { id })\n if (res.ok) {\n setConfirmingDelete(undefined)\n store.showNotice('ok', `角色卡 ${id} 已删除(已导入当前预设的参数不受影响)`)\n await loadCharacters()\n } else {\n store.showNotice('error', '删除失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n const openLocation = async (id: string): Promise<void> => {\n const res = await bridgePost<{ path: string }>('/preset-open', { id: `/.characters/${id}` })\n if (res.ok) store.showNotice('ok', `已打开角色卡目录:${res.value.path}`)\n else store.showNotice('error', '打开目录失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n\n return (\n <section className={ui.section} aria-label=\"角色管理\">\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>角色卡库</strong>\n <small>导入 SillyTavern 角色卡(PNG tEXt chunk:ccv3 / chara,或 chara_card JSON)到独立库。角色卡参数不直接生成预设——点击「导入到当前预设」把角色设定 / 系统提示 / 开场白 / 提示词库合并进当前激活预设,可随时移除。</small>\n </span>\n <span className={ui.inlineControls}>\n <input\n ref={pngRef}\n type=\"file\"\n accept=\".png\"\n multiple\n className={ui.visuallyHidden}\n aria-label=\"选择 SillyTavern 角色卡 PNG\"\n onChange={(event) => { void importCard(event.target.files); event.target.value = '' }}\n />\n <input\n ref={jsonRef}\n type=\"file\"\n accept=\".json\"\n multiple\n className={ui.visuallyHidden}\n aria-label=\"选择角色卡 JSON\"\n onChange={(event) => { void importCard(event.target.files); event.target.value = '' }}\n />\n <button type=\"button\" className={ui.primaryPill} disabled={importing} onClick={() => pngRef.current?.click()}>\n {importing ? '导入中…' : '导入角色卡 PNG'}\n </button>\n <button type=\"button\" className={ui.pillButton} disabled={importing} onClick={() => jsonRef.current?.click()}>\n 导入角色卡 JSON\n </button>\n </span>\n </div>\n </div>\n\n {characters.length === 0 ? (\n <div className={ui.emptyState}>\n <span className={ui.emptyGlyph} aria-hidden=\"true\">⌁</span>\n <div>\n <h3>角色卡库为空</h3>\n <p>从上方导入 SillyTavern 角色卡(PNG / JSON),然后点击「导入到当前预设」应用到正在使用的预设。</p>\n </div>\n </div>\n ) : (\n <div className={ui.presetGrid}>\n {characters.map((card) => {\n const confirming = confirmingDelete === card.id\n return (\n <div key={card.id} className={ui.presetCard}>\n <div className={ui.presetCardBody}>\n <span className={ui.presetCardHead}>\n <strong className={ui.presetCardName}>{card.name}</strong>\n {card.imported && <span className={ui.presetInUse}>已导入当前预设</span>}\n </span>\n {card.description !== undefined && card.description.length > 0\n && <p className={ui.presetCardDesc}>{card.description}</p>}\n <code className={ui.presetCardId}>{card.id}</code>\n </div>\n <span className={ui.presetCardFooter}>\n {card.imported ? (\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\" disabled={busy === card.id}\n onClick={() => void removeCard(card.id)}>\n {busy === card.id ? '移除中…' : '从当前预设移除'}\n </button>\n ) : (\n <button type=\"button\" className={ui.primaryPill} disabled={busy === card.id}\n onClick={() => void applyCard(card.id)}>\n {busy === card.id ? '导入中…' : '导入到当前预设'}\n </button>\n )}\n <button type=\"button\" className={ui.presetIconButton} data-tip=\"打开角色卡目录\"\n aria-label={`打开角色卡目录:${card.name}`}\n onClick={() => void openLocation(card.id)}>\n <IconFolderOpenOutline16 />\n </button>\n {confirming ? (\n <>\n <button type=\"button\" className={ui.pillButton} data-danger\n onClick={() => void deleteCard(card.id)}>确认删除</button>\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\"\n onClick={() => setConfirmingDelete(undefined)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={ui.presetIconButton} data-tip=\"删除角色卡\"\n aria-label={`删除角色卡:${card.name}`}\n onClick={() => setConfirmingDelete(card.id)}>\n <IconTrashOutline16 />\n </button>\n )}\n </span>\n </div>\n )\n })}\n </div>\n )}\n </section>\n )\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport type { IApiClient } from '@deepseek-ai/dsh-client-connection/client'\nimport { tabKeyHandler } from './tab-key.ts'\nimport {\n type PromptToolStore,\n type PromptToolSettingsTransport,\n usePromptToolStore,\n} from './prompt-tool-store.ts'\nimport type { SkillCatalogEntry } from './prompt-tool-bridge.ts'\nimport { PromptConfigList } from './PromptConfigList.tsx'\nimport { PromptConfigsEditor } from './PromptConfigsEditor.tsx'\nimport type { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport { PresetsPage } from './PresetsPage.tsx'\nimport { CharactersPage } from './CharactersPage.tsx'\nimport { TemplatePicker } from './TemplatePicker.tsx'\nimport { useTemplatePicker } from './useTemplatePicker.ts'\nimport { TagInput } from './TagInput.tsx'\nimport { CollapsibleCard } from './CollapsibleCard.tsx'\nimport { SettingInputRow } from './SettingInputRow.tsx'\nimport { autoResizeTextarea } from './textarea-resize.ts'\nimport ui from './PromptUi.module.css'\nimport css from './PromptWorkspace.module.css'\n\n/** 技能调用状态徽章:只保留模型可调用状态,开关关闭后立即变灰。 */\nfunction SkillStatusChips(props: { skill: SkillCatalogEntry; enabled: boolean }): ReactNode {\n const { skill, enabled } = props\n const callable = skill.valid && skill.modelInvocable && enabled\n const status = skill.valid ? (callable ? '模型可调用' : '模型不可调用') : '未注册'\n return (\n <span className={ui.skillStatusRow} aria-label={`技能调用状态:${status}`}>\n <span className={clsx(ui.skillStatusChip, skill.valid ? (callable ? ui.skillStatusModel : ui.skillStatusOff) : ui.skillStatusError)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {status}\n </span>\n </span>\n )\n}\n\nfunction PageHeader(props: { title: string; description: string; meta?: string }): ReactNode {\n return (\n <div className={ui.pageHeader}>\n <div><h2>{props.title}</h2><p>{props.description}</p></div>\n {props.meta !== undefined && <div className={css.pageHeaderMeta}><code>{props.meta}</code></div>}\n </div>\n )\n}\n\n/** 管线参数卡片(与主会话其他卡片同样式):首轮输出封顶 + PTC 模式。\n * 两者是模块装配参数(渲染进 agent.cordis.yml 组合行 config,非提示词配置),\n * 模块库无对应可编辑项,故保留独立开关。 */\nfunction PipelineStatusCards(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = store.fields\n const capped = fields.bootstrapMaxTokens > 0\n return (\n <div className={ui.configCardPair}>\n <article className={ui.configCard}>\n <header className={ui.configHeader}>\n <span className={ui.configTitle}>\n <span className={ui.configName}>首轮输出封顶</span>\n <span className={ui.configMeta}>{capped ? `调用配置层 · 首轮 maxTokens ${fields.bootstrapMaxTokens}` : '调用配置层 · 默认 256000(不设上限)'}</span>\n </span>\n <span className={ui.configHeaderActions}>\n <input\n className={ui.configInput}\n type=\"number\"\n min={1}\n step={1}\n value={store.bootstrapTokensDraft}\n disabled={!fields.writePreset || !capped}\n title=\"首轮请求 #1 的 maxTokens(正整数,失焦保存)\"\n aria-label=\"首轮输出封顶数值\"\n onChange={(event) => store.setBootstrapTokensDraft(event.target.value)}\n onBlur={store.commitBootstrapTokensDraft}\n />\n <label className={ui.configEnable} htmlFor=\"pt-bootstrap-tokens\">\n <input id=\"pt-bootstrap-tokens\" type=\"checkbox\" checked={capped} disabled={!fields.writePreset} aria-label=\"首轮输出封顶\" onChange={store.toggleBootstrapMaxTokens} />\n <span className={ui.switch} aria-hidden=\"true\"><i /></span>\n </label>\n </span>\n </header>\n </article>\n <article className={ui.configCard}>\n <header className={ui.configHeader}>\n <span className={ui.configTitle}>\n <span className={ui.configName}>使用 PTC 模式</span>\n <span className={ui.configMeta}>{fields.usePtcMode ? '工具管线层 · Code Mode(run_code)' : '工具管线层 · 原生完整工具目录'}</span>\n </span>\n <span className={ui.configHeaderActions}>\n <label className={ui.configEnable} htmlFor=\"pt-use-ptc\">\n <input id=\"pt-use-ptc\" type=\"checkbox\" checked={fields.usePtcMode} disabled={!fields.writePreset} aria-label=\"使用 PTC 模式\" onChange={() => store.toggle('usePtcMode')} />\n <span className={ui.switch} aria-hidden=\"true\"><i /></span>\n </label>\n </span>\n </header>\n </article>\n </div>\n )\n}\n\n/** 模型与委派参数卡片(模型设置 + 工具与深度):主对话页与子代理页共用同一配置源(缺省继承宿主默认);模型路由与人设按作用域完全分离(main=主对话模型、subagent=子代理模型,参数各自独立),工具与深度两页通用。 */\nfunction ModelToolCards(props: { store: PromptToolStore; scope: 'main' | 'subagent' }): ReactNode {\n const { store } = props\n const fields = store.fields\n const host = store.hostDefaultModel\n // 宿主默认模型回显:插件参数未设置(空 = 继承宿主)时,下拉可见宿主当前\n // agent-default-model 的可选项(模型目录查询失败/未公布时也能选择与回显)。\n const providerOptions = [...new Set([...store.providers, ...(host?.provider !== undefined && host.provider.length > 0 ? [host.provider] : [])])]\n const provider = props.scope === 'main' ? fields.modelProvider : fields.subagentModelProvider\n const modelName = props.scope === 'main' ? fields.modelName : fields.subagentModelName\n const modelOptions = [...new Set([\n ...(store.modelCatalog[provider] ?? []),\n ...(host?.model !== undefined && host.model.length > 0 ? [host.model] : []),\n ])]\n const maxDepthOptions = ['', 'provider-managed', '0', '1', '2', '3', '5']\n const reasoningEffortOptions = ['', 'off', 'low', 'high', 'max']\n // 宿主默认思维程度回显(agent-default-model settings reasoningEffort;官方档位同源)。\n const hostEffort = host?.reasoningEffort !== undefined && host.reasoningEffort.length > 0\n ? host.reasoningEffort\n : undefined\n const withCurrent = (options: string[], current: string): string[] =>\n current.length > 0 && !options.includes(current) ? [...options, current] : options\n const active = provider.length > 0 && modelName.length > 0\n const reasoningEffort = props.scope === 'main' ? fields.modelReasoningEffort : fields.subagentReasoningEffort\n const temperature = props.scope === 'main' ? fields.modelTemperature : fields.subagentTemperature\n const maxTokens = props.scope === 'main' ? fields.modelMaxTokens : fields.subagentMaxTokens\n const patchModelParam = (key: 'modelReasoningEffort' | 'modelTemperature' | 'modelMaxTokens' | 'subagentReasoningEffort' | 'subagentTemperature' | 'subagentMaxTokens', value: string): void => {\n store.patch({ [key]: value } as Partial<typeof fields>)\n void store.persistParamOverrides()\n }\n const scopeMeta = props.scope === 'main'\n ? { title: '主对话模型', idle: '未设置:继承宿主默认模型', active: '固定模型路由已设置(新会话默认模型)' }\n : { title: '子代理模型', idle: '未设置:继承主会话模型', active: '子代理固定模型路由已设置' }\n // 主对话卡片:宿主默认模型名回显(子代理默认继承主会话,不回显宿主)。\n const idleMeta = props.scope === 'main' && host?.model !== undefined && host.model.length > 0\n ? `未设置:继承宿主默认(${host.model})`\n : scopeMeta.idle\n return (\n <>\n <CollapsibleCard id={props.scope === 'main' ? 'pt-main-model' : 'pt-subagent-model'} title={scopeMeta.title} meta={active ? scopeMeta.active : idleMeta}>\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>模型服务商</strong>\n <small>{props.scope === 'main'\n ? '主对话新会话默认模型(agent-default-model);调用方未显式指定时自动补入。检测到的服务商可直接选择。'\n : '子代理固定模型路由(agentOptions 注入 tool-subagent,经预设参数传递);调用方显式模型优先。检测到的服务商可直接选择。'}</small>\n </span>\n <select\n className={ui.configInput}\n aria-label=\"模型服务商\"\n value={provider}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch(props.scope === 'main' ? { modelProvider: event.target.value } : { subagentModelProvider: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {withCurrent(providerOptions, provider).map((item) => (\n <option key={item} value={item}>{item}</option>\n ))}\n </select>\n </div>\n </div>\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>模型名</strong>\n <small>{props.scope === 'main'\n ? '与模型服务商同时非空时生效(主对话新会话默认模型),例如 deepseek-v4-flash。'\n : '与子代理模型服务商同时非空时生效(子代理固定路由),例如 deepseek-v4-flash。'}</small>\n </span>\n <select\n className={ui.configInput}\n aria-label=\"模型名\"\n value={modelName}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch(props.scope === 'main' ? { modelName: event.target.value } : { subagentModelName: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {withCurrent(modelOptions, modelName).map((item) => (\n <option key={item} value={item}>{item}</option>\n ))}\n </select>\n </div>\n </div>\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>思维程度</strong>\n <small>reasoningEffort(agent-request patch);官方档位 off / low / high / max;{reasoningEffort.length === 0 && hostEffort !== undefined\n ? `留空 = 继承宿主默认(${hostEffort})。`\n : '留空 = 不设置(模型默认)。'}选择即保存。</small>\n </span>\n <select\n className={ui.configInput}\n aria-label=\"思维程度\"\n value={reasoningEffort}\n disabled={!fields.writePreset}\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelReasoningEffort' : 'subagentReasoningEffort',\n event.target.value,\n )}\n >\n {withCurrent(hostEffort !== undefined ? [...new Set([...reasoningEffortOptions, hostEffort])] : reasoningEffortOptions, reasoningEffort).map((item) => (\n <option key={item} value={item}>{item.length === 0 ? '(不设置)' : item}</option>\n ))}\n </select>\n </div>\n </div>\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>采样温度</strong>\n <small>temperature(agent-request patch);数字 0–2,留空 = 不设置(模型默认)。失焦保存。</small>\n </span>\n <input\n className={ui.configInput}\n type=\"number\"\n min={0}\n max={2}\n step={0.1}\n aria-label=\"采样温度\"\n value={temperature}\n disabled={!fields.writePreset}\n placeholder=\"不设置\"\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelTemperature' : 'subagentTemperature',\n event.target.value,\n )}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n </div>\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>输出上限</strong>\n <small>maxTokens(agent-request patch);正整数,留空 = 不设置(模型默认)。失焦保存。</small>\n </span>\n <input\n className={ui.configInput}\n type=\"number\"\n min={1}\n step={1}\n aria-label=\"输出上限\"\n value={maxTokens}\n disabled={!fields.writePreset}\n placeholder=\"不设置\"\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelMaxTokens' : 'subagentMaxTokens',\n event.target.value,\n )}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n </div>\n {props.scope === 'subagent' && (\n <div className={ui.rowGroup}>\n <label className={ui.textBlock}>\n <span className={ui.settingCopy}><strong>子代理自定义模型人设</strong><small>subagentPersona(per-child shadow);留空 = 固定模型路由时回退主对话自定义模型人设,两者都空 = 继承主会话。失焦保存。</small></span>\n <textarea\n className={ui.firstTurnInput}\n value={fields.subagentPersona}\n disabled={!fields.writePreset}\n onChange={(event) => { autoResizeTextarea(event); store.patch({ subagentPersona: event.target.value }) }}\n onBlur={() => void store.persistParamOverrides()}\n spellCheck={false}\n />\n </label>\n </div>\n )}\n </CollapsibleCard>\n<CollapsibleCard id=\"pt-delegation-tools\" title=\"工具与深度\" meta=\"工具集白名单/黑名单(主会话+子代理) + 注入 kind 白名单 + 递归深度\">\n<TagInput id=\"pt-tool-filter-allow\" label=\"工具集白名单\" hint=\"toolFilter.allow:主会话常驻过滤(tool-filter 模块,作用于任意注册工具含自定义插件)+ 委派子代理 toolFilter;回车或逗号添加标签,× 移除;留空 = 不限制。每次增删立即保存。\"\n value={fields.toolFilterAllow} placeholder=\"read, write, glob\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterAllow: value })}\n onCommit={() => void store.persistParamOverrides()} />\n<TagInput id=\"pt-tool-filter-deny\" label=\"工具集黑名单\" hint=\"toolFilter.deny:主会话常驻过滤(tool-filter 模块)+ 委派子代理 toolFilter;回车或逗号添加标签,× 移除;留空 = 不限制。每次增删立即保存。\"\n value={fields.toolFilterDeny} placeholder=\"bash, run_code\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterDeny: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-allow-kinds\" label=\"注入 kind 白名单\" hint=\"context-gate allowKinds(注入门控);回车或逗号添加标签,× 移除,例如 skill-invocation、near-anchor、router-guide;留空 = 官方默认(不过滤)。每次增删立即保存。\"\n value={fields.allowKinds} placeholder=\"skill-invocation, near-anchor, router-guide\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ allowKinds: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>递归深度</strong>\n <small>委派 maxDepth:0 禁止委派;provider-managed 由服务商管理;正整数限制递归层数;不设置 = 官方默认。选择即保存。</small>\n </span>\n <select\n className={ui.configInput}\n aria-label=\"递归深度\"\n value={fields.maxDepth}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch({ maxDepth: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {maxDepthOptions.map((item) => (\n <option key={item} value={item}>{item === '' ? '(不设置)' : item}</option>\n ))}\n </select>\n </div>\n </div>\n </CollapsibleCard>\n </>\n )\n}\n\n/** 模型路由状态 chip:主对话页与子代理页共用(检测到 DeepSeek 路由时展示 provider 列表)。 */\nfunction ModelRouteStatus(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const detected = store.providers.length > 0\n const catalog = store.modelCatalog\n const catalogEntries = Object.entries(catalog)\n const hostModel = store.hostDefaultModel?.model\n return (\n <div className={ui.skillStatusRow} aria-label=\"模型服务商状态\">\n <span className={clsx(ui.skillStatusChip, detected ? ui.skillStatusModel : ui.skillStatusOff)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {detected ? `已检测到模型服务商:${store.providers.join('、')}` : '未检测到模型服务商'}\n </span>\n <span className={clsx(ui.skillStatusChip, catalogEntries.length > 0 ? ui.skillStatusModel : ui.skillStatusOff)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {catalogEntries.length > 0\n ? `已检测到模型名:${catalogEntries.map(([provider, models]) => `${provider} → ${models.join('、')}`).join(';')}`\n : hostModel !== undefined && hostModel.length > 0\n ? `模型名:继承宿主默认(${hostModel})`\n : '未检测到模型名'}\n </span>\n </div>\n )\n}\n\n/** 子代理设置页:路由状态 + 子代理参数卡片(模型 / 工具与深度)。 */\nfunction SubagentSettings(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n return (\n <section className={ui.section} aria-label=\"子代理\">\n <ModelRouteStatus store={store} />\n <ModelToolCards store={store} scope=\"subagent\" />\n </section>\n )\n}\n\n/** 主会话页:主对话参数 + Preset/AGENTS 内容 + 管线状态卡 + 模块库(层筛选)。\n * 注入层 tab 已并入本页(层专属开关与内容资产卡片),模块库按层级下拉筛选浏览。 */\nfunction FeatureSettings(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = store.fields\n return (\n <section className={ui.section} aria-label=\"主会话与全局\">\n <ModelRouteStatus store={store} />\n <ModelToolCards store={store} scope=\"main\" />\n <PipelineStatusCards store={store} />\n <PromptConfigsEditor\n meta={store.meta}\n configs={fields.promptConfigs}\n savedConfigs={store.savedConfigs}\n onPatchConfigs={(configs) => store.patch({ promptConfigs: configs })}\n onSaveConfigs={(configs) => store.persistConfigs(configs)}\n onNotice={store.showNotice}\n templateVariables={store.templateVariables}\n setTemplateVariables={store.setTemplateVariables}\n templateVariablesEnabled={store.templateVariablesEnabled}\n setTemplateVariablesEnabled={store.setTemplateVariablesEnabled}\n saveTemplateVariables={store.saveTemplateVariables}\n />\n </section>\n )\n}\n\n/** 配置列表 + 新建模板:六层页按 layer 过滤,子代理页按 scope 过滤(subagent 只列子代理可见模板)。 */\nfunction ConfigListWithTemplates(props: { store: PromptToolStore; layer?: string; scope?: 'main' | 'subagent' }): ReactNode {\n const { store, layer, scope } = props\n // 当前预设模板消息批层无配置时,pre-step 层空状态追加提示(列表仍可自定义:\n // 新建配置作为 settings 覆盖层保存,切换预设后保留)。\n const preStepEmpty = store.templatePreStepCount === 0 && (layer === undefined || layer === 'pre-step')\n const templatePicker = useTemplatePicker(\n store.fields.promptConfigs,\n (config) => store.patch({ promptConfigs: [...store.fields.promptConfigs, config] }),\n store.showNotice,\n )\n return (\n <>\n <PromptConfigList\n meta={store.meta}\n configs={store.fields.promptConfigs}\n savedConfigs={store.savedConfigs}\n layer={layer}\n scope={scope}\n emptyHint={preStepEmpty ? '当前预设模板消息批层无配置;可新建自定义配置(作为 settings 覆盖层,切换预设后仍保留)。' : undefined}\n extraActions={\n <button type=\"button\" className={ui.primaryPill} onClick={templatePicker.openPicker}>新建</button>\n }\n onPatchConfigs={(configs) => store.patch({ promptConfigs: configs })}\n onSaveConfigs={(configs) => store.persistConfigs(configs)}\n onNotice={store.showNotice}\n />\n {templatePicker.open && (\n <TemplatePicker templates={templatePicker.templates} layer={layer} onPick={templatePicker.pickTemplate} onClose={templatePicker.closePicker} />\n )}\n </>\n )\n}\n\n/** 子代理设置页:子代理参数 + 子代理提示词配置(audience != main,即公用或仅子代理)。 */\nfunction SubagentPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n return (\n <>\n <SubagentSettings store={store} />\n <div className={ui.subagentConfigs}>\n <ConfigListWithTemplates store={store} scope=\"subagent\" />\n </div>\n </>\n )\n}\n\n/** 技能状态筛选维度(统计条与列表联动)。 */\ntype SkillStatusTab = 'all' | 'callable' | 'invalid'\n\nconst SKILL_STATUS_TABS: Array<{ id: SkillStatusTab; label: string }> = [\n { id: 'all', label: '全部' },\n { id: 'callable', label: '模型可调用' },\n { id: 'invalid', label: '未注册' },\n]\n\nfunction SkillsSettings(props: { store: PromptToolStore; api: IApiClient }): ReactNode {\n const { store, api } = props\n const fields = store.fields\n const [pickingDir, setPickingDir] = useState(false)\n const [dragFolder, setDragFolder] = useState<string | undefined>(undefined)\n const [dropTarget, setDropTarget] = useState<{ folder: string; before: boolean } | undefined>(undefined)\n const [skillFilter, setSkillFilter] = useState('')\n const [statusTab, setStatusTab] = useState<SkillStatusTab>('all')\n const [selected, setSelected] = useState<Set<string>>(new Set())\n const [removingDir, setRemovingDir] = useState<string | undefined>(undefined)\n const orderedSkills = useMemo(() => {\n const index = new Map(fields.skillOrder.map((folder, at) => [folder, at]))\n return [...fields.skillCatalog].sort((left, right) => {\n const leftAt = index.get(left.folder)\n const rightAt = index.get(right.folder)\n if (leftAt === undefined && rightAt === undefined) return left.folder.localeCompare(right.folder)\n if (leftAt === undefined) return 1\n if (rightAt === undefined) return -1\n return leftAt - rightAt\n })\n }, [fields.skillCatalog, fields.skillOrder])\n const dirty = JSON.stringify(fields.skillSwitches) !== JSON.stringify(store.savedSwitches.skillSwitches)\n || JSON.stringify(fields.skillOrder) !== JSON.stringify(store.savedSwitches.skillOrder)\n || JSON.stringify(fields.skillsDirs) !== JSON.stringify(store.savedSwitches.skillsDirs)\n || store.skillsDirDraft.trim().length > 0\n\n const callableCount = orderedSkills.filter((skill) => skill.valid && skill.modelInvocable && store.skillEnabled(skill.folder)).length\n const invalidCount = orderedSkills.filter((skill) => !skill.valid).length\n const tabCounts: Record<SkillStatusTab, number> = {\n all: orderedSkills.length,\n callable: callableCount,\n invalid: invalidCount,\n }\n\n const keyword = skillFilter.trim().toLowerCase()\n const visibleSkills = orderedSkills.filter((skill) => {\n if (statusTab === 'callable' && !(skill.valid && skill.modelInvocable && store.skillEnabled(skill.folder))) return false\n if (statusTab === 'invalid' && skill.valid) return false\n return keyword.length === 0\n || [skill.folder, skill.name ?? '', skill.description ?? ''].join(' ').toLowerCase().includes(keyword)\n })\n\n const selectionMode = selected.size > 0\n const toggleSelect = (folder: string) => {\n setSelected((prev) => {\n const next = new Set(prev)\n if (next.has(folder)) next.delete(folder)\n else next.add(folder)\n return next\n })\n }\n /** 全选目标:当前筛选后的合法技能(同名/无效技能不可批量启用)。 */\n const selectableSkills = visibleSkills.filter((skill) => skill.valid)\n const allSelected = selectionMode && selectableSkills.length > 0\n && selectableSkills.every((skill) => selected.has(skill.folder))\n const toggleSelectAll = () => {\n if (allSelected) setSelected(new Set())\n else setSelected(new Set(selectableSkills.map((skill) => skill.folder)))\n }\n const dirSkillCount = (dir: string): number =>\n fields.skillCatalog.filter((skill) => skill.dir === dir).length\n /** 空配置 = 默认副本兜底(只读,不可移除)。 */\n const isDefaultDir = (dir: string): boolean =>\n fields.skillsDirs.length === 0 && fields.activeSkillsDirs[0] === dir\n /** 嵌套技能:folder 含 /(相对路径)即子技能;渲染时父技能下递归展开。 */\n const isNestedFolder = (folder: string): boolean => folder.includes('/')\n /** 主技能序列(不嵌套):拖拽/菜单排序只在主技能间进行,子技能跟随。 */\n const orderedPrimary = orderedSkills.filter((skill) => !isNestedFolder(skill.folder))\n const childrenByParent = new Map<string, SkillCatalogEntry[]>()\n for (const skill of visibleSkills) {\n if (!isNestedFolder(skill.folder)) continue\n const slash = skill.folder.lastIndexOf('/')\n const parent = skill.folder.slice(0, slash)\n const list = childrenByParent.get(parent) ?? []\n list.push(skill)\n childrenByParent.set(parent, list)\n }\n for (const list of childrenByParent.values()) list.sort((a, b) => a.folder.localeCompare(b.folder))\n const expandSkill = (skill: SkillCatalogEntry): SkillCatalogEntry[] =>\n [skill, ...(childrenByParent.get(skill.folder) ?? []).flatMap(expandSkill)]\n const renderOrder = visibleSkills.filter((skill) => !isNestedFolder(skill.folder)).flatMap(expandSkill)\n const depthOf = (folder: string): number => folder.split('/').length - 1\n\n /** 批量启用/禁用:一次 patch + 一次保存(避免逐项写 N 次)。 */\n const batchSet = (enabled: boolean) => {\n const next = { ...fields.skillSwitches }\n for (const folder of selected) next[folder] = enabled\n store.patch({ skillSwitches: next })\n store.persistSwitches()\n store.showNotice('ok', `已${enabled ? '启用' : '禁用'} ${selected.size} 个技能`)\n setSelected(new Set())\n }\n\n const moveSkill = (from: string, to: string) => {\n const folders = orderedSkills.map((skill) => skill.folder)\n const fromAt = folders.indexOf(from)\n const toAt = folders.indexOf(to)\n if (fromAt < 0 || toAt < 0 || fromAt === toAt) return\n const [moved] = folders.splice(fromAt, 1)\n folders.splice(toAt, 0, moved!)\n store.patch({ skillOrder: folders })\n store.persistSwitches()\n }\n\n /** 拖拽插入:插到目标技能前/后(带放置方向指示)。 */\n const moveSkillAt = (from: string, target: string, before: boolean) => {\n const folders = orderedSkills.map((skill) => skill.folder)\n const fromAt = folders.indexOf(from)\n if (fromAt < 0) return\n let toAt = folders.indexOf(target)\n if (toAt < 0 || fromAt === toAt) return\n const [moved] = folders.splice(fromAt, 1)\n if (fromAt < toAt) toAt -= 1\n if (!before) toAt += 1\n folders.splice(toAt, 0, moved!)\n store.patch({ skillOrder: folders })\n store.persistSwitches()\n }\n\n const pickSkillsDir = async () => {\n if (pickingDir) return\n setPickingDir(true)\n try {\n const picked = await api.host.pickDirectory({})\n if (!picked.result.ok) {\n store.showNotice('error', '选择目录失败:' + (picked.result.error?.message ?? 'host.pickDirectory 不可用'))\n return\n }\n const path = picked.result.value?.path\n if (!path) return\n store.addSkillsDir(path)\n } catch (error) {\n store.showNotice('error', '选择目录失败:' + (error instanceof Error ? error.message : String(error)))\n } finally {\n setPickingDir(false)\n }\n }\n\n const renderCard = (skill: SkillCatalogEntry, depth: number, primaryIndex: number): ReactNode => {\n const hint = `${skill.dir ?? 'skills'}/${skill.folder}${skill.description ? ` · ${skill.description}` : ''}`\n const enabled = store.skillEnabled(skill.folder)\n const nested = depth > 0\n const isSelected = selected.has(skill.folder)\n return (\n <div\n key={skill.folder}\n className={clsx(ui.skillCard, !skill.valid && ui.skillRowInvalid)}\n data-nested={nested ? '' : undefined}\n data-selected={selected.has(skill.folder) ? '' : undefined}\n data-dragging={dragFolder === skill.folder ? '' : undefined}\n data-drop-before={dropTarget?.folder === skill.folder && dropTarget.before ? '' : undefined}\n data-drop-after={dropTarget?.folder === skill.folder && !dropTarget.before ? '' : undefined}\n draggable={skill.valid && !nested}\n onDragStart={(event) => {\n setDragFolder(skill.folder)\n event.dataTransfer.effectAllowed = 'move'\n }}\n onDragOver={(event) => {\n event.preventDefault()\n if (dragFolder === undefined || dragFolder === skill.folder || nested) return\n const rect = event.currentTarget.getBoundingClientRect()\n setDropTarget({ folder: skill.folder, before: event.clientY < rect.top + rect.height / 2 })\n }}\n onDrop={(event) => {\n event.preventDefault()\n const target = dropTarget\n if (dragFolder !== undefined && target !== undefined && dragFolder !== skill.folder && !nested) {\n moveSkillAt(dragFolder, target.folder, target.before)\n }\n setDragFolder(undefined)\n setDropTarget(undefined)\n }}\n onDragEnd={() => { setDragFolder(undefined); setDropTarget(undefined) }}\n >\n {/* 勾选框:只选择(职责分离——开关状态由行内 Switch 与上方批量按钮控制)。 */}\n <label className={ui.skillSelect} aria-label={`选择 ${skill.name || skill.folder}`}>\n <input type=\"checkbox\" checked={isSelected} disabled={!skill.valid} onChange={() => toggleSelect(skill.folder)} />\n </label>\n {nested\n ? <span className={ui.skillNestedMark} aria-hidden=\"true\" title=\"嵌套子技能(跟随主技能,不参与拖拽排序)\">▸</span>\n : (\n <>\n <span className={ui.dragHandle} title={`第 ${primaryIndex + 1} 位,拖动调整顺序`} aria-hidden=\"true\">⠿</span>\n <span className={ui.skillRankBadge} title={`第 ${primaryIndex + 1} 位`}>{primaryIndex + 1}</span>\n </>\n )}\n <div className={ui.skillCardBody}>\n <span className={ui.skillCardTitleRow}>\n <strong>{skill.name || skill.folder}</strong>\n {skill.duplicate === true && <span className={ui.duplicateBadge} title={`同名技能:来源目录 ${skill.dir ?? '未知'}`}>同名</span>}\n <SkillStatusChips skill={skill} enabled={enabled} />\n </span>\n <small className={ui.skillCardMeta}>{hint}</small>\n {!skill.valid && skill.issue && <span className={ui.skillIssue} role=\"note\">{skill.issue}</span>}\n </div>\n {/* Switch:独立切换技能开关。 */}\n <label className={ui.skillSwitch} htmlFor={`pt-skill-${skill.folder}`}>\n <input id={`pt-skill-${skill.folder}`} type=\"checkbox\" checked={enabled} disabled={!skill.valid} aria-label={`启用 ${skill.name || skill.folder}`} onChange={() => store.toggleSkill(skill.folder)} />\n <span className={ui.switch} aria-hidden=\"true\"><i /></span>\n </label>\n {!skill.valid ? (\n <button type=\"button\" className={ui.pillButton} disabled={store.fixingSkill === skill.folder} onClick={() => void store.fixSkill(skill.folder)}>\n {store.fixingSkill === skill.folder && <span className={ui.spinner} aria-hidden=\"true\" />}\n {store.fixingSkill === skill.folder ? '修复中…' : '修复'}\n </button>\n ) : !nested ? (\n <span className={ui.skillOrderButtons}>\n <button type=\"button\" className={ui.pillButton} aria-label={`上移 ${skill.name || skill.folder}`} title=\"上移(键盘排序)\" disabled={primaryIndex === 0} onClick={() => moveSkill(skill.folder, orderedPrimary[primaryIndex - 1]!.folder)}>↑</button>\n <button type=\"button\" className={ui.pillButton} aria-label={`下移 ${skill.name || skill.folder}`} title=\"下移(键盘排序)\" disabled={primaryIndex >= orderedPrimary.length - 1} onClick={() => moveSkill(skill.folder, orderedPrimary[primaryIndex + 1]!.folder)}>↓</button>\n </span>\n ) : null}\n </div>\n )\n }\n\n return (\n <section className={ui.section} aria-label=\"技能设置\">\n {fields.skillCatalog.length > 0 && (\n <>\n <div className={ui.skillStatsRow}>\n <div className={ui.skillStats} role=\"tablist\" aria-label=\"技能状态筛选\">\n {SKILL_STATUS_TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={statusTab === tab.id}\n data-active={statusTab === tab.id ? '' : undefined}\n onClick={() => setStatusTab(tab.id)}\n onKeyDown={tabKeyHandler(SKILL_STATUS_TABS.map((entry) => entry.id), statusTab, setStatusTab)}\n >\n <i className={clsx(ui.skillStatDot,\n tab.id === 'invalid' ? ui.skillStatusError\n : tab.id === 'callable' ? ui.skillStatusModel\n : ui.skillStatAll)} aria-hidden=\"true\" />\n <strong>{tabCounts[tab.id]}</strong>\n <small>{tab.label}</small>\n </button>\n ))}\n </div>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.load()}>刷新技能列表</button>\n </div>\n <div className={ui.listFilterRow}>\n <input\n className={ui.listFilter}\n value={skillFilter}\n aria-label=\"过滤技能列表\"\n placeholder=\"过滤技能:名称 / 目录 / 描述…\"\n spellCheck={false}\n onChange={(event) => setSkillFilter(event.target.value)}\n />\n {selected.size > 0 && <span className={ui.selectionCount}>已选 {selected.size}</span>}\n {selectableSkills.length > 0 && (\n <button type=\"button\" className={ui.pillButton} data-active={allSelected ? '' : undefined} onClick={toggleSelectAll}>\n {allSelected ? '取消全选' : '全选'}\n </button>\n )}\n <button type=\"button\" className={ui.pillButton} disabled={!selectionMode} onClick={() => batchSet(true)}>批量启用</button>\n <button type=\"button\" className={ui.pillButton} disabled={!selectionMode} onClick={() => batchSet(false)}>批量禁用</button>\n </div>\n </>\n )}\n\n {fields.skillCatalog.length === 0 ? (\n <div className={ui.emptyState}><span className={ui.emptyGlyph} aria-hidden=\"true\">◇</span><div><h3>skills 目录下没有技能</h3><p>展开下方「目录与来源」选择目录导入,或确认技能目录路径后重新打开工作台。</p></div></div>\n ) : visibleSkills.length === 0 ? (\n <p className={ui.readOnly} role=\"status\">没有匹配当前筛选的技能。</p>\n ) : (\n <>\n <div className={ui.skillCardList} data-dragging={dragFolder !== undefined ? '' : undefined}>\n {renderOrder.map((skill) => {\n const depth = depthOf(skill.folder)\n const primaryIndex = depth === 0 ? orderedPrimary.indexOf(skill) : 0\n return renderCard(skill, depth, primaryIndex)\n })}\n </div>\n </>\n )}\n\n <CollapsibleCard id=\"pt-skills-dirs\" title=\"目录与来源\"\n meta={`${fields.activeSkillsDirs.length} 个目录 · 添加 / 移除引用`}>\n <div className={ui.dirAddBar}>\n <button type=\"button\" className={ui.primaryPill} disabled={pickingDir} onClick={() => void pickSkillsDir()}>\n {pickingDir && <span className={ui.spinner} aria-hidden=\"true\" />}\n {pickingDir ? '选择中…' : '从文件夹选择器添加'}\n </button>\n <div className={ui.dirAddInput}>\n <input\n className={ui.directoryInput}\n aria-label=\"按路径添加技能目录\"\n value={store.skillsDirDraft}\n placeholder=\"或输入目录路径后添加\"\n spellCheck={false}\n onChange={(event) => store.setSkillsDirDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && store.skillsDirDraft.trim().length > 0) {\n store.addSkillsDir(store.skillsDirDraft)\n store.setSkillsDirDraft('')\n }\n }}\n />\n <button\n type=\"button\"\n className={ui.pillButton}\n disabled={store.savingSkillsDir || store.skillsDirDraft.trim().length === 0}\n onClick={() => {\n store.addSkillsDir(store.skillsDirDraft)\n store.setSkillsDirDraft('')\n }}\n >\n {store.savingSkillsDir && <span className={ui.spinner} aria-hidden=\"true\" />}\n 添加\n </button>\n </div>\n </div>\n {fields.activeSkillsDirs.length === 0 ? (\n <p className={ui.readOnly} role=\"status\">技能目录列表为空。</p>\n ) : (\n <div className={ui.dirCardList}>\n {fields.activeSkillsDirs.map((dir, index) => {\n const exists = fields.skillsDirExists[dir] === true\n const count = dirSkillCount(dir)\n const isDefault = isDefaultDir(dir)\n return (\n <div key={dir} className={ui.dirCard} data-invalid={!exists ? '' : undefined}>\n <span className={ui.skillRankBadge} title={`第 ${index + 1} 个目录`}>{index + 1}</span>\n <div className={ui.dirCardBody}>\n <span className={ui.dirCardTitle}>\n <code className={ui.dirPath} title={dir}>{dir}</code>\n {isDefault && <span className={ui.duplicateBadge} title=\"未配置自定义目录时使用的 profile skills 副本\">默认副本</span>}\n </span>\n <span className={ui.dirCardMeta}>\n {exists\n ? (count > 0 ? `${count} 个技能` : '空目录')\n : '目录不存在'}\n {!exists && ' · 可移除后重新添加'}\n </span>\n </div>\n <div className={ui.dirCardActions}>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.openSkillsDir(dir)}>打开</button>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.load()}>重扫</button>\n {!isDefault && (removingDir === dir ? (\n <>\n <button type=\"button\" className={ui.pillButton} data-danger onClick={() => { store.removeSkillsDir(dir); setRemovingDir(undefined) }}>确认移除</button>\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\" onClick={() => setRemovingDir(undefined)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={ui.pillButton} onClick={() => setRemovingDir(dir)}>移除</button>\n ))}\n </div>\n </div>\n )\n })}\n </div>\n )}\n <p className={ui.readOnly}>目录顺序即添加顺序;同名技能全部保留并标注「同名」,模型注册只取首个目录。移除目录只删除引用,不删除原文件。</p>\n <div className={ui.cardDivider} />\n <SettingInputRow id=\"pt-skill-rank-base\" label=\"技能排序基数\" hint=\"每个技能实际 rank = 基数 + 拖拽序号;默认 250。数值过小会让本项目技能抢占其他插件技能的位置,但不会影响任何提示词消息注入。\"\n type=\"number\" value={String(fields.skillRankBase)}\n onInput={(value) => store.patch({ skillRankBase: Number(value) || 0 })}\n onCommit={store.persistSwitches} />\n </CollapsibleCard>\n\n {dirty && <p className={ui.readOnly} role=\"status\">Skills 开关与目录修改立即保存;如上方按钮仍在写入,请稍候。</p>}\n </section>\n )\n}\n\nexport interface PromptWorkspaceProps {\n api: IApiClient\n settings: PromptToolSettingsTransport\n controller: PromptToolWorkspaceController\n onClose: () => void\n}\n\n/** 顶层页面:注入层已并入主会话页(层专属开关 + 内容资产卡片 + 模块库层筛选)。 */\ntype WorkspacePage = 'subagent' | 'skills' | 'features' | 'presets' | 'characters'\n\nconst TOP_PAGES: Array<{ id: WorkspacePage; label: string }> = [\n { id: 'features', label: '主会话' },\n { id: 'subagent', label: '子代理' },\n { id: 'skills', label: '技能设置' },\n { id: 'presets', label: '预设配置' },\n { id: 'characters', label: '角色管理' },\n]\n\n/** 侧边栏独立工作台:顶层 4 页(注入层并入主会话)。 */\nexport function PromptWorkspace(props: PromptWorkspaceProps): ReactNode {\n const store = usePromptToolStore(props.api, props.settings)\n const [page, setPage] = useState<WorkspacePage>('features')\n const open = useSyncExternalStore(\n props.controller.subscribe,\n props.controller.getSnapshot,\n props.controller.getSnapshot,\n ).open\n\n useEffect(() => {\n // 每次打开工作台都重新同步 settings(其他客户端可能已修改)。\n if (open) void store.load()\n }, [open, store.load])\n\n\n const enabledCount = store.fields.promptConfigs.filter((config) => config.enabled !== false).length\n const layerMeta = page === 'skills'\n ? `${store.fields.skillCatalog.length} 技能`\n : page === 'features'\n ? '全局'\n : page === 'presets'\n ? '预设配置'\n : page === 'characters'\n ? `${(store.meta.presets ?? []).filter((preset) => preset.meta?.source === 'sillytavern').length} 角色卡`\n : '子代理'\n const pageTitle = page === 'skills' ? '技能设置'\n : page === 'features' ? '主会话'\n : page === 'presets' ? '预设配置'\n : page === 'characters' ? '角色管理'\n : '子代理'\n const pageDetail = page === 'skills'\n ? '按 skills 目录注册的可开关技能;目录与逐技能开关立即生效。'\n : page === 'features'\n ? '主会话参数(模型设置、工具与深度)、消息批层入口开关、Preset/AGENTS 内容与提示词配置模块库(按层级筛选)。'\n : page === 'presets'\n ? '统一管理预设模板(切换/导入)与提示词配置(六层列表/模板插入/配置目录)。'\n : page === 'characters'\n ? '导入 SillyTavern 角色卡(PNG / JSON)并管理转换出的角色卡预设模块(角色设定 / 系统提示 / 开场白 / 提示词库)。'\n : '子代理作用域参数(模型/人设/工具集/深度)与子代理提示词配置(audience 非仅主会话)。'\n // 已加载过数据时保留旧内容(顶部状态点显示「读取中」),避免切换/保存触发整区骨架屏闪烁。\n const hasData = store.meta.layers.length > 0\n || store.fields.skillCatalog.length > 0\n || store.fields.promptConfigs.length > 0\n\n return (\n <div className={css.shell}>\n <header className={css.masthead}>\n <div className={css.brand}>\n <span className={css.brandLogo} aria-hidden=\"true\">⌁</span>\n <h1>提示词工具</h1>\n </div>\n <div className={css.statusCluster}>\n <span className={css.statusDot} data-state={store.loading ? 'checking' : 'online'} aria-hidden=\"true\" />\n <span>{store.loading ? '读取中' : `${store.fields.promptConfigs.length} 配置 · ${enabledCount} 启用`}</span>\n </div>\n <button type=\"button\" className={css.backButton} onClick={props.onClose}>返回对话</button>\n </header>\n\n <div className={css.topNavigation}>\n <div className={css.nav} role=\"tablist\" aria-label=\"提示词工具页面\">\n {TOP_PAGES.map((item) => (\n <button key={item.id} type=\"button\" role=\"tab\" aria-selected={page === item.id} data-active={page === item.id ? '' : undefined} onClick={() => setPage(item.id)} onKeyDown={tabKeyHandler(TOP_PAGES.map((entry) => entry.id), page, setPage)}>\n <span><strong>{item.label}</strong></span>\n </button>\n ))}\n </div>\n </div>\n\n <main className={css.canvas}>\n <div>\n <PageHeader title={pageTitle} description={pageDetail} meta={layerMeta} />\n\n {store.loading && !hasData ? (\n <div className={ui.skeletonStack} aria-hidden=\"true\">\n {[0, 1, 2, 3].map((item) => <div key={item} className={ui.skeletonRow} />)}\n </div>\n ) : page === 'skills' ? <SkillsSettings store={store} api={props.api} /> : (\n <>\n {page === 'features' && <FeatureSettings store={store} />}\n {page === 'presets' && <PresetsPage store={store} />}\n {page === 'characters' && <CharactersPage store={store} />}\n {page === 'subagent' && <SubagentPage store={store} />}\n </>\n )}\n\n {store.notice && <p className={clsx(ui.notice, store.noticeKind === 'error' && ui.noticeError)} role=\"status\">{store.notice}</p>}\n </div>\n </main>\n </div>\n )\n}\n","/**\n * HostSurfaceAdapter — 所有宿主 DOM 选择器与挂载点探测的集中适配层。\n *\n * 目标:优先使用官方 slots/入口 API;当前仍以 CSS 类选择器兜底时,\n * 所有选择器只允许出现在本文件,宿主改版时只需改这里。\n */\n\nexport const PROMPT_TOOL_VIEW_SELECTOR = '[data-dsh-prompt-tool-view]'\nexport const PROMPT_TOOL_ENTRY_SELECTOR = '[data-dsh-prompt-tool-entry]'\nexport const OFFICIAL_WORKSPACE_SLOT_SELECTOR = '[data-dsh-workspace-slot]'\n\nconst CONVERSATION_COLUMN_SELECTOR = '[data-pane=\"conversation\"], [class*=\"centerCol\"]'\nconst SIDEBAR_COLUMN_SELECTOR = '[data-pane=\"sidebar\"], [class*=\"sidebarCol\"]'\nconst LOGO_ROW_SELECTOR = '[class*=\"logoRow\"]'\nconst NEW_SESSION_SELECTOR = 'button[class*=\"newSession\"]'\nconst SIDEBAR_CONTEXT_SELECTOR = '[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]'\nconst FAMILY_SELECTOR = '[data-dsh-taskboard-entry], [data-dsh-ssh-entry], [data-dsh-prompt-tool-entry]'\n\n/** 官方 workspace slot 挂载点;宿主未暴露时返回 undefined,由 selector 兜底。 */\nexport function findOfficialWorkspaceMount(doc: Document = document): HTMLElement | undefined {\n return doc.querySelector<HTMLElement>(OFFICIAL_WORKSPACE_SLOT_SELECTOR) ?? undefined\n}\n\n/** 中央列容器:工作台面板挂载点(官方 slot 优先,CSS 选择器兜底)。 */\nexport function findConversationColumn(doc: Document = document): HTMLElement | undefined {\n return doc.querySelector<HTMLElement>(CONVERSATION_COLUMN_SELECTOR) ?? undefined\n}\n\n/** 侧边栏根节点。 */\nexport function findSidebarRoot(doc: Document = document): HTMLElement | undefined {\n const column = doc.querySelector<HTMLElement>(SIDEBAR_COLUMN_SELECTOR)\n if (column === null) return undefined\n return column.querySelector<HTMLElement>(LOGO_ROW_SELECTOR)?.parentElement\n ?? (column.firstElementChild as HTMLElement | undefined)\n}\n\n/** 新建会话按钮,用于决定侧边栏入口插入位置。 */\nexport function findNewSessionButton(root: HTMLElement): HTMLButtonElement | undefined {\n const nested = root.querySelector<HTMLButtonElement>(NEW_SESSION_SELECTOR)\n if (nested !== null) return nested\n for (const child of root.children) {\n if (child.tagName === 'BUTTON') return child as HTMLButtonElement\n }\n return undefined\n}\n\n/** 侧边栏入口插入基准:优先 logoRow,否则使用新建会话按钮本身。 */\nexport function findSidebarInsertBase(root: HTMLElement, button: HTMLElement): HTMLElement {\n const row = button.closest(LOGO_ROW_SELECTOR) as HTMLElement | null\n return row !== null && row.parentElement === root ? row : button\n}\n\n/** 侧边栏中已有的同类入口(task-board / ssh / prompt-tool)。 */\nexport function findFamilyEntries(root: HTMLElement): HTMLElement[] {\n return Array.from(root.children).filter(\n (element): element is HTMLElement => element instanceof HTMLElement && element.matches(FAMILY_SELECTOR),\n )\n}\n\n/** 侧边栏上下文选择器:点击这些区域时关闭工作台面板。 */\nexport function matchesSidebarContext(element: Element): boolean {\n return element.closest(SIDEBAR_CONTEXT_SELECTOR) !== null\n}\n","import css from './PromptWorkspace.module.css'\nimport type { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport { findFamilyEntries, findNewSessionButton, findSidebarInsertBase, findSidebarRoot } from './host-surface.ts'\n\nexport { PROMPT_TOOL_ENTRY_SELECTOR } from './host-surface.ts'\n\nfunction createIcon(): SVGSVGElement {\n const namespace = 'http://www.w3.org/2000/svg'\n const icon = document.createElementNS(namespace, 'svg')\n icon.setAttribute('viewBox', '0 0 16 16')\n icon.setAttribute('width', '14')\n icon.setAttribute('height', '14')\n icon.setAttribute('fill', 'none')\n icon.setAttribute('stroke', 'currentColor')\n icon.setAttribute('stroke-width', '1.3')\n icon.setAttribute('stroke-linecap', 'round')\n icon.setAttribute('stroke-linejoin', 'round')\n icon.setAttribute('aria-hidden', 'true')\n const path = document.createElementNS(namespace, 'path')\n path.setAttribute('d', 'M3.5 2.5h6l3 3v8h-9zM9.5 2.5v3h3M6 8.5h4M8 6.5v4')\n icon.append(path)\n return icon\n}\n\nfunction createEntry(controller: PromptToolWorkspaceController): { entry: HTMLButtonElement; label: HTMLSpanElement } {\n const entry = document.createElement('button')\n entry.type = 'button'\n entry.dataset.dshPromptToolEntry = ''\n entry.className = css.entry ?? ''\n const icon = document.createElement('span')\n icon.className = css.entryIcon ?? ''\n icon.append(createIcon())\n const label = document.createElement('span')\n label.className = css.entryLabel ?? ''\n label.textContent = '提示词工具'\n entry.setAttribute('aria-label', '提示词工具')\n entry.title = '提示词工具'\n entry.append(icon, label)\n entry.addEventListener('click', () => { controller.toggle() })\n return { entry, label }\n}\n\nfunction placeEntry(root: HTMLElement, entry: HTMLButtonElement): boolean {\n const button = findNewSessionButton(root)\n if (button === undefined) return false\n if (entry.parentElement === root) return true\n const base = findSidebarInsertBase(root, button)\n const family = findFamilyEntries(root)\n const anchor = family.at(-1)?.nextElementSibling ?? base.nextElementSibling\n root.insertBefore(entry, anchor)\n return true\n}\n\n/** 自愈式官方风格入口:挂在新建会话行下方,点击开关工作台。 */\nexport function mountPromptToolSidebarEntry(controller: PromptToolWorkspaceController): () => void {\n const { entry, label } = createEntry(controller)\n let root: HTMLElement | undefined\n let placed = false\n\n const syncLabel = (): void => {\n const text = '提示词工具'\n if (entry.getAttribute('aria-label') !== text) entry.setAttribute('aria-label', text)\n if (entry.title !== text) entry.title = text\n if (label.textContent !== text) label.textContent = text\n }\n\n const rootObserver = new MutationObserver(() => {\n if (root === undefined || !root.isConnected) {\n placed = false\n tryPlace()\n return\n }\n if (!root.contains(entry)) placed = placeEntry(root, entry)\n })\n\n const tryPlace = (): void => {\n syncLabel()\n if (root !== undefined && !root.isConnected) {\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n if (placed && document.body.contains(entry)) return\n if (placed) {\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n root ??= findSidebarRoot()\n if (root === undefined) return\n placed = placeEntry(root, entry)\n if (placed) rootObserver.observe(root, { childList: true, subtree: true })\n }\n\n // 宿主 DOM 高频变动:body subtree 观察防抖,避免每次变更都全文档扫描。\n let waitTimer: ReturnType<typeof setTimeout> | undefined\n const waitObserver = new MutationObserver(() => {\n if (waitTimer !== undefined) clearTimeout(waitTimer)\n waitTimer = setTimeout(tryPlace, 200)\n })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const syncActive = (): void => {\n if (controller.getSnapshot().open) entry.dataset.active = 'true'\n else delete entry.dataset.active\n }\n const unsubscribe = controller.subscribe(syncActive)\n syncActive()\n tryPlace()\n\n return () => {\n if (waitTimer !== undefined) clearTimeout(waitTimer)\n waitObserver.disconnect()\n rootObserver.disconnect()\n unsubscribe()\n entry.remove()\n }\n}\n","export interface PromptToolWorkspaceSnapshot {\n open: boolean\n}\n\n/** 侧边栏入口与中央列工作台共享的轻量开关状态。 */\nexport class PromptToolWorkspaceController {\n private snapshot: PromptToolWorkspaceSnapshot = { open: false }\n private readonly listeners = new Set<() => void>()\n\n getSnapshot = (): PromptToolWorkspaceSnapshot => this.snapshot\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n open(): void { this.setOpen(true) }\n close(): void { this.setOpen(false) }\n toggle(): void { this.setOpen(!this.snapshot.open) }\n\n private setOpen(open: boolean): void {\n if (this.snapshot.open === open) return\n this.snapshot = { open }\n for (const listener of this.listeners) listener()\n }\n}\n","import { createRoot, type Root } from 'react-dom/client'\nimport type { IApiClient } from '@deepseek-ai/dsh-client-connection/client'\nimport { PromptWorkspace } from './PromptWorkspace.tsx'\nimport type { PromptToolSettingsTransport } from './prompt-tool-store.ts'\nimport css from './PromptWorkspace.module.css'\nimport { mountPromptToolSidebarEntry } from './sidebar-entry.ts'\nimport { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport { findConversationColumn, findOfficialWorkspaceMount, matchesSidebarContext } from './host-surface.ts'\n\nexport { PROMPT_TOOL_VIEW_SELECTOR } from './host-surface.ts'\n\nconst ACTIVE_ATTR = 'data-dsh-prompt-tool-active'\nconst TASKBOARD_ACTIVE_ATTR = 'data-dsh-taskboard-active'\nconst SSH_ACTIVE_ATTR = 'data-dsh-ssh-active'\nconst ACTIVATE_EVENT = 'dsh-panel-activate'\n\nfunction mountPanel(controller: PromptToolWorkspaceController, api: IApiClient, settings: PromptToolSettingsTransport): () => void {\n let root: Root | undefined\n let container: HTMLDivElement | undefined\n\n const ensure = (): void => {\n if (container !== undefined && container.isConnected) return\n if (container !== undefined) {\n root?.unmount()\n root = undefined\n container = undefined\n }\n const column = findOfficialWorkspaceMount() ?? findConversationColumn()\n if (column === undefined) return\n container = document.createElement('div')\n container.dataset.dshPromptToolView = ''\n container.className = css.panelView ?? ''\n column.append(container)\n root = createRoot(container)\n root.render(<PromptWorkspace api={api} settings={settings} controller={controller} onClose={() => { controller.close() }} />)\n // 宿主 DOM 后出现、面板已打开时(applyActive 早于本容器创建),补一次焦点移入。\n if (controller.getSnapshot().open) {\n container.querySelector<HTMLElement>('button, input, select, textarea, [tabindex]')?.focus()\n }\n }\n\n // 宿主 DOM 高频变动:body subtree 观察防抖,避免每次变更都全文档扫描。\n let waitTimer: ReturnType<typeof setTimeout> | undefined\n const waitObserver = new MutationObserver(() => {\n if (waitTimer !== undefined) clearTimeout(waitTimer)\n waitTimer = setTimeout(ensure, 200)\n })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n let suppressCompatibilityClose = false\n const applyActive = (): void => {\n if (!controller.getSnapshot().open) {\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n return\n }\n // 与 task-board / SSH 面板互斥:先发兼容关闭事件,再宣布本面板激活。\n suppressCompatibilityClose = true\n document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: 'ssh' }))\n document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: 'taskboard' }))\n suppressCompatibilityClose = false\n document.documentElement.removeAttribute(TASKBOARD_ACTIVE_ATTR)\n document.documentElement.removeAttribute(SSH_ACTIVE_ATTR)\n document.documentElement.setAttribute(ACTIVE_ATTR, '')\n document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: 'prompt-tool' }))\n // 打开后把焦点移入面板首个可聚焦控件,键盘用户无需手动 Tab 进入。\n container?.querySelector<HTMLElement>('button, input, select, textarea, [tabindex]')?.focus()\n }\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && controller.getSnapshot().open) {\n event.preventDefault()\n controller.close()\n }\n }\n\n const onOtherPanelActivate = (event: Event): void => {\n if (suppressCompatibilityClose || !controller.getSnapshot().open) return\n const detail = (event as CustomEvent<unknown>).detail\n if (detail === 'taskboard' || detail === 'ssh') controller.close()\n }\n\n const onSidebarContextClick = (event: MouseEvent): void => {\n if (!controller.getSnapshot().open) return\n const target = event.target\n if (target instanceof Element && matchesSidebarContext(target)) controller.close()\n }\n\n document.addEventListener('click', onSidebarContextClick, true)\n document.addEventListener(ACTIVATE_EVENT, onOtherPanelActivate)\n document.addEventListener('keydown', onKeyDown)\n const unsubscribe = controller.subscribe(applyActive)\n applyActive()\n ensure()\n\n return () => {\n if (waitTimer !== undefined) clearTimeout(waitTimer)\n document.removeEventListener('click', onSidebarContextClick, true)\n document.removeEventListener(ACTIVATE_EVENT, onOtherPanelActivate)\n document.removeEventListener('keydown', onKeyDown)\n waitObserver.disconnect()\n unsubscribe()\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n root?.unmount()\n root = undefined\n container?.remove()\n container = undefined\n }\n}\n\n/** 挂载侧边栏入口与中央列工作台(同一单元,随插件卸载整体回收)。 */\nexport function mountPromptToolWorkspace(api: IApiClient, settings: PromptToolSettingsTransport): () => void {\n if (typeof document === 'undefined' || typeof window === 'undefined') return () => {}\n const controller = new PromptToolWorkspaceController()\n const disposeEntry = mountPromptToolSidebarEntry(controller)\n const disposePanel = mountPanel(controller, api, settings)\n return () => {\n disposePanel()\n disposeEntry()\n }\n}\n","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type { PromptToolSettingsTransport } from './prompt-tool-store.ts'\nimport { mountPromptToolWorkspace } from './workspace-mount.tsx'\n\nexport const inject = ['slots', 'connection', 'settingsScope']\n\n/** 与宿主 settings namespace 相同的字符串;client 侧不依赖 host 包,按契约字面拼写。 */\nconst PROMPT_TOOL_NS = 'prompt-tool'\n\nexport function apply(ctx: ClientContext): void {\n const connection = ctx.get('connection') as ConnectionHandle | undefined\n if (connection === undefined) return\n\n // rc8 ui-settings 跟进:标准字段读写走官方共享 describe mirror。\n // 绑定生命周期由 SettingsScopeBinder 挂在调用方 fiber 上,无需手工 dispose。\n const scope = ctx.settingsScope.bind<Record<string, unknown>>({ namespace: PROMPT_TOOL_NS })\n const describe = ctx.settingsScope.describe()\n const settings: PromptToolSettingsTransport = {\n scope,\n ensure: () => describe.ensure(),\n mutate: async (ops, expectedRevision) => {\n const response = await connection.api.settings.mutate({\n ns: PROMPT_TOOL_NS,\n ops,\n ...(expectedRevision === undefined ? {} : { expectedRevision }),\n })\n if (!response.result.ok) throw new Error(response.result.error.message)\n describe.acceptView(response.result.value)\n return response.result.value\n },\n }\n\n // 侧边栏独立工作台:新建会话行下方入口 + 中央列面板。\n ctx.effect(() => mountPromptToolWorkspace(connection.api, settings), 'prompt-tool: sidebar workspace')\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["asRecord","record","useState","useRef","useCallback","useState","styles","useId","styles","isValidElement","cloneElement","useState","useMemo","memo","IconChevronDownOutline14","useState","useMemo","useRef","useCallback","styles","useRef","styles","useState","useState","styles","IconChevronDownOutline14","styles","useState","IconChevronDownOutline14","useState","useRef","styles","IconChevronDownOutline14","useSyncExternalStore","useRef","memo","useState","useRef","styles","IconCopyOutline16","IconFolderOpenOutline16","styles","useState","styles","IconChevronDownOutline14","ui","memo","ui","memo","useState","useRef","ui","IconFolderOpenOutline16","IconTrashOutline16","ui","memo","useState","useMemo","useCallback","ui","css","memo","useCallback","useState","useSyncExternalStore","useSyncExternalStore","css","useRef","createPortal","useCallback","useState","ui"],"sources":["../src/client/workspace-controller.ts","../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/client/tab-key.ts","../src/shared/bridge-contract.ts","../src/client/prompt-tool-bridge.ts","../src/client/prompt-tool-store.ts","../src/client/textarea-resize.ts","../src/client/TagInput.tsx","../src/client/PromptConfigCard.tsx","../src/client/PromptConfigList.tsx","../src/client/TemplatePicker.tsx","../src/client/useTemplatePicker.ts","../src/client/EngineModuleCards.tsx","../src/client/CustomToolsModuleCard.tsx","../src/client/PromptConfigsEditor.tsx","../src/client/use-prompt-tool-fields.ts","../src/client/PresetSwitcher.tsx","../src/client/ToggleRow.tsx","../src/client/CollapsibleCard.tsx","../src/client/SettingInputRow.tsx","../src/client/PresetsPage.tsx","../src/client/character-card.ts","../src/client/CharactersPage.tsx","../src/client/SkillsSettings.tsx","../src/client/PromptWorkspace.tsx","../src/client/slot-workbench.tsx","../src/client/index.ts"],"sourcesContent":["export interface PromptToolWorkspaceSnapshot {\n open: boolean\n}\n\n/** 侧边栏入口与中央列工作台共享的轻量开关状态。 */\nexport class PromptToolWorkspaceController {\n private snapshot: PromptToolWorkspaceSnapshot = { open: false }\n private readonly listeners = new Set<() => void>()\n\n getSnapshot = (): PromptToolWorkspaceSnapshot => this.snapshot\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n open(): void { this.setOpen(true) }\n close(): void { this.setOpen(false) }\n toggle(): void { this.setOpen(!this.snapshot.open) }\n\n private setOpen(open: boolean): void {\n if (this.snapshot.open === open) return\n this.snapshot = { open }\n for (const listener of this.listeners) listener()\n }\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/** ARIA tabs 键盘导航:左右切换、Home/End 跳首尾(顶层页、技能筛选、内容资产 tab 共用)。 */\nimport type { KeyboardEvent as ReactKeyboardEvent } from 'react'\n\nexport function tabKeyHandler<T>(\n items: readonly T[],\n current: T,\n onSelect: (item: T) => void,\n): (event: ReactKeyboardEvent<HTMLElement>) => void {\n return (event) => {\n const index = items.indexOf(current)\n if (index < 0) return\n let next: number | undefined\n if (event.key === 'ArrowRight') next = (index + 1) % items.length\n else if (event.key === 'ArrowLeft') next = (index - 1 + items.length) % items.length\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = items.length - 1\n if (next === undefined) return\n event.preventDefault()\n onSelect(items[next]!)\n }\n}\n","/**\n * settings bridge 跨端契约(host 注册 / client 消费的唯一来源)。\n * 铁律:25 端点载荷统一成功 `{ ok: true, value }`、失败 `{ ok: false, code?, message? }`;\n * 端点附加字段只能以 value 旁的可选扩展字段出现(describe)。\n * 改路径或载荷形状必须同步更新 test/shared/bridge-contract.test.mjs。\n */\nexport const SETTINGS_BRIDGE_PREFIX = '/api/prompt-tool/settings'\n\n/** 桥端点路径(相对前缀)。新增端点必须同时登记到契约测试。 */\nexport const BRIDGE_ENDPOINTS = {\n meta: '/meta',\n bootstrap: '/bootstrap',\n describe: '/describe',\n models: '/models',\n mutate: '/mutate',\n configsValidate: '/configs-validate',\n skillFix: '/skill-fix',\n templates: '/templates',\n promptConfigs: '/prompt-configs',\n presetContent: '/preset-content',\n importPreset: '/import-preset',\n paramOverrides: '/param-overrides',\n presetVariables: '/preset-variables',\n customTools: '/custom-tools',\n importPresetPackage: '/import-preset-package',\n exportPreset: '/export-preset',\n presetDelete: '/preset-delete',\n presetClone: '/preset-clone',\n presetDuplicate: '/preset-duplicate',\n presetOpen: '/preset-open',\n charactersImport: '/characters-import',\n charactersList: '/characters-list',\n charactersDelete: '/characters-delete',\n charactersApply: '/characters-apply',\n charactersRemove: '/characters-remove',\n} as const\n\nexport type BridgeEndpoint = (typeof BRIDGE_ENDPOINTS)[keyof typeof BRIDGE_ENDPOINTS]\n\n/** 失败载荷:两端共用。 */\nexport type BridgeErrorPayload = { ok: false; code?: string; message?: string }\n","/** settings bridge 客户端传输与载荷解析层(无 react 依赖;UI 状态见 prompt-tool-store)。 */\nimport type { PromptConfigDraft, EngineMeta } from './prompt-tool-types.ts'\nimport type { EngineParamKey } from '../shared/engine-params.ts'\nimport { SETTINGS_BRIDGE_PREFIX, type BridgeErrorPayload } from '../shared/bridge-contract.ts'\n\nexport interface BridgeSettingsView { ns: string; value: unknown; base?: unknown; revision: number }\nexport type BridgeResult<T> = { ok: true; value: T; providers?: string[]; modelCatalog?: Record<string, string[]>; activeSkillsDirs?: string[]; skillCatalog?: SkillCatalogEntry[]; templatePreStepCount?: number; presetParams?: Record<string, unknown>; hostDefaultModel?: { provider?: string; model?: string; reasoningEffort?: string }; meta?: { meta: EngineMeta }; overrides?: { overrides: Record<string, unknown> }; variables?: { variables: Record<string, string>; enabled: boolean }; promptConfigs?: { promptConfigs: PromptConfigDraft[] } } | BridgeErrorPayload\n\n/** 宿主默认模型回显(agent-default-model settings:provider/model/reasoningEffort;插件参数未设置 = 继承宿主)。 */\nexport interface HostDefaultModel {\n provider?: string\n model?: string\n reasoningEffort?: string\n}\n\nexport interface SkillCatalogEntry {\n folder: string\n name: string\n description: string\n valid: boolean\n /** 来源技能目录绝对路径。 */\n dir?: string\n /** 同名标记:多目录存在相同 folder 时 UI 标注。 */\n duplicate?: boolean\n issue?: string\n modelInvocable: boolean\n userInvocable: boolean\n}\n\nexport interface Fields {\n promptText: string\n promptPath: string\n agentsText: string\n agentsPath: string\n injectAgentsPrompt: boolean\n firstTurnAnchor: boolean\n firstTurnText: string\n firstTurnCustom: boolean\n guideText: string\n guideCustom: boolean\n /** 每轮引导独立开关;undefined = 跟随 firstTurnAnchor。 */\n guideEnabled: boolean | undefined\n modelProvider: string\n modelName: string\n subagentModelProvider: string\n subagentModelName: string\n modelReasoningEffort: string\n modelTemperature: string\n modelMaxTokens: string\n subagentReasoningEffort: string\n subagentTemperature: string\n subagentMaxTokens: string\n toolFilterAllow: string\n toolFilterDeny: string\n /** 子代理也启用主对话工具过滤。 */\n toolFilterSubagents: boolean\n maxDepth: string\n allowKinds: string\n firstTurnWord: string\n bootstrapMaxTokens: number\n usePtcMode: boolean\n /** 门控晋升:首段 reasoning minimal-like + 工具调用才晋升(tool-bootstrap 参数桥)。 */\n promoteGate: boolean\n /** 无工具首响应 / 首轮 turn/end 即晋升。 */\n promoteAfterFirstResponse: boolean\n /** 门控回退步数上限(0 = 引擎默认 4)。 */\n maxPromoteSteps: number\n /** 首轮工具窄化集(逗号分隔;覆盖行默认)。 */\n bootstrapTools: string\n /** 压缩后恢复工具集(逗号分隔)。 */\n compactionTools: string\n /** 渐进披露阶段定义(UI 草稿形态:tools 逗号分隔字符串;非空 = 激活多级阶段窄化)。 */\n stages: StageDraft[]\n /** 预放档数(0 = 引擎默认 1)。 */\n stagePreUnlock: number\n /** 阶段推进工具名(空 = 默认 phase_advance)。 */\n stageAdvanceTool: string\n /** 阶段推进工具描述。 */\n stageAdvanceDescription: string\n /** 阶段状态 section 模板({{stage}}/{{stageName}}/{{unlocked}}/{{total}};空 = 不注入)。 */\n stageSectionTemplate: string\n /** phase-1 提示词段只留 persona。 */\n personaSectionsOnly: boolean\n /** 晋升后 persona 附加工作目录行。 */\n workspaceLine: boolean\n /** phase-1 persona 追加的首次调用指令行。 */\n phase1FirstCallInstruction: string\n /** 晋升后 agent-instructions 全文 → 一次性 hint(context-gate)。 */\n instructionHint: boolean\n /** context-gate phase-1 消息源白名单(逗号分隔;空 = 不启用)。 */\n messageSources: string\n /** 晋升后延迟注入的 source kind(逗号分隔)。 */\n deferredSources: string\n /** 延迟注入宽限步数(0 = 不延迟)。 */\n deferredGraceSteps: number\n /** 前置锚定轮(anchor-turn 行;需模块列表已挂行)。 */\n anchorTurn: boolean\n /** 前置锚定轮自定义锚定文本(空 = 引擎默认)。 */\n anchorTurnText: string\n /** 轨迹深度门(deliberation-gate 行;需模块列表已挂行)。 */\n deliberationGate: boolean\n /** 深思下限字符数(0 = 回落行默认 400)。 */\n deliberationMinChars: number\n /** 每轮最大门控次数(0 = 回落行默认 1)。 */\n deliberationMaxGatesPerTurn: number\n /** 深思维持节拍(cot-drip 行;需模块列表已挂行)。 */\n cotDrip: boolean\n /** 节拍间隔工具结果数(0 = 回落行默认 4)。 */\n cotDripEvery: number\n /** 每轮最大提醒条数(0 = 回落行默认 1)。 */\n cotDripMaxPerTurn: number\n /** str-replace-editor 最大输出字符数;16000 = 官方默认。 */\n strReplaceEditorMaxOutputChars: number\n injectPrompt: boolean\n skillSwitches: Record<string, boolean>\n skillOrder: string[]\n skillCatalog: SkillCatalogEntry[]\n /** 用户技能目录列表(按添加顺序);空 = 默认副本。 */\n skillsDirs: string[]\n /** 实际生效目录列表(空配置 = [默认副本路径])。 */\n activeSkillsDirs: string[]\n /** 生效目录存在性(path → 是否存在)。 */\n skillsDirExists: Record<string, boolean>\n skillRankBase: number\n residentAgentsPath: string\n presetDir: string\n presetOrder: number\n fallbackText: string\n writeAgents: boolean\n writePreset: boolean\n presetTemplate: string\n promptConfigs: PromptConfigDraft[]\n}\n\n/** 渐进披露阶段草稿(UI 编辑形态;persist 时转引擎形态 [{name, tools: string[]}])。 */\nexport interface StageDraft {\n name: string\n tools: string\n}\n\nexport const EMPTY_META: EngineMeta = {\n layers: [],\n strategies: [],\n slotKinds: [],\n positions: [],\n dedupes: [],\n promotions: [],\n audienceModes: [],\n modelScopes: [],\n roles: [],\n mergeModes: [],\n fills: [],\n layerFieldPolicies: {},\n layerLabels: {},\n}\nexport const EMPTY_FIELDS: Fields = {\n promptText: '',\n promptPath: '',\n agentsText: '',\n agentsPath: '',\n injectAgentsPrompt: false,\n firstTurnAnchor: false,\n firstTurnText: '',\n firstTurnCustom: false,\n guideText: '',\n guideCustom: false,\n guideEnabled: undefined,\n modelProvider: '',\n modelName: '',\n subagentModelProvider: '',\n subagentModelName: '',\n modelReasoningEffort: '',\n modelTemperature: '',\n modelMaxTokens: '',\n subagentReasoningEffort: '',\n subagentTemperature: '',\n subagentMaxTokens: '',\n toolFilterAllow: '',\n toolFilterDeny: '',\n toolFilterSubagents: false,\n maxDepth: '',\n allowKinds: '',\n firstTurnWord: '',\n bootstrapMaxTokens: 0,\n usePtcMode: false,\n stages: [],\n stagePreUnlock: 1,\n stageAdvanceTool: '',\n stageAdvanceDescription: '',\n stageSectionTemplate: '',\n promoteGate: false,\n promoteAfterFirstResponse: false,\n maxPromoteSteps: 0,\n bootstrapTools: '',\n compactionTools: '',\n personaSectionsOnly: false,\n workspaceLine: false,\n phase1FirstCallInstruction: '',\n instructionHint: false,\n messageSources: '',\n deferredSources: '',\n deferredGraceSteps: 0,\n anchorTurn: false,\n anchorTurnText: '',\n deliberationGate: false,\n deliberationMinChars: 0,\n deliberationMaxGatesPerTurn: 0,\n cotDrip: false,\n cotDripEvery: 0,\n cotDripMaxPerTurn: 0,\n strReplaceEditorMaxOutputChars: 16000,\n injectPrompt: true,\n skillSwitches: {},\n skillOrder: [],\n skillCatalog: [],\n skillsDirs: [],\n activeSkillsDirs: [],\n skillsDirExists: {},\n skillRankBase: 250,\n residentAgentsPath: '',\n presetDir: '',\n presetOrder: 5,\n fallbackText: '',\n writeAgents: true,\n writePreset: true,\n presetTemplate: 'anchored',\n promptConfigs: [],\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n\nconst readString = (source: Record<string, unknown>, key: string): string | undefined => {\n const value = source[key]\n return typeof value === 'string' ? value : undefined\n}\n\nconst readStringArray = (source: Record<string, unknown>, key: string): string[] => {\n const value = source[key]\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : []\n}\n\nconst readBoolean = (source: Record<string, unknown>, key: string, fallback: boolean): boolean => {\n const value = source[key]\n return typeof value === 'boolean' ? value : fallback\n}\n\nconst readNumber = (source: Record<string, unknown>, key: string, fallback: number): number => {\n const value = source[key]\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : fallback\n}\n\nconst readSkillSwitches = (source: Record<string, unknown>, key: string): Record<string, boolean> => {\n const value = source[key]\n if (value === null || typeof value !== 'object') return {}\n const entries = Object.entries(value as Record<string, unknown>)\n const result: Record<string, boolean> = {}\n for (const [name, enabled] of entries) {\n if (typeof enabled === 'boolean') result[name] = enabled\n }\n return result\n}\n\nconst readSkillCatalog = (source: Record<string, unknown>, key: string): SkillCatalogEntry[] => {\n const value = source[key]\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (entry === null || typeof entry !== 'object') return []\n const record = entry as Record<string, unknown>\n const folder = readString(record, 'folder')\n const name = readString(record, 'name')\n if (folder === undefined || name === undefined) return []\n return [{\n folder,\n name,\n description: readString(record, 'description') ?? '',\n // 向后兼容旧宿主:旧版 /describe 只返回 folder/name/description(且旧扫描\n // 已过滤非法名),缺字段按旧语义默认 true;新版宿主显式携带 valid=false。\n valid: readBoolean(record, 'valid', true),\n ...(typeof record.dir === 'string' && record.dir.length > 0 ? { dir: record.dir } : {}),\n ...(record.duplicate === true ? { duplicate: true } : {}),\n ...(typeof record.issue === 'string' && record.issue.length > 0 ? { issue: record.issue } : {}),\n modelInvocable: readBoolean(record, 'modelInvocable', true),\n userInvocable: readBoolean(record, 'userInvocable', true),\n }]\n })\n}\n\nconst readPromptConfigs = (source: Record<string, unknown>, key: string): PromptConfigDraft[] => {\n const value = source[key]\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (entry === null || typeof entry !== 'object') return []\n const record = entry as Record<string, unknown>\n return typeof record.id === 'string' && record.id.length > 0 ? [entry as PromptConfigDraft] : []\n })\n}\n\nexport const errorMessage = (error: unknown): string => error instanceof Error ? error.message : String(error)\n\nconst isBridgeResultPayload = (payload: unknown): payload is BridgeResult<unknown> => {\n if (payload === null || typeof payload !== 'object' || Array.isArray(payload)) return false\n const record = payload as Record<string, unknown>\n if (typeof record.ok !== 'boolean') return false\n return !record.ok || 'value' in record\n}\n\nexport async function bridgePost<T>(path: string, body: unknown): Promise<BridgeResult<T>> {\n try {\n const response = await fetch(SETTINGS_BRIDGE_PREFIX + path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n })\n const payload = await response.json() as unknown\n if (isBridgeResultPayload(payload)) return payload as BridgeResult<T>\n return { ok: false, message: `invalid settings bridge payload (HTTP ${response.status})` }\n } catch (error) {\n return { ok: false, message: errorMessage(error) }\n }\n}\n\nexport function fieldsFromView(res: BridgeResult<BridgeSettingsView>): Fields {\n const ns = res.ok ? res.value : undefined\n const value = asRecord(ns?.value)\n const base = asRecord(ns?.base)\n const next: Fields = {\n promptText: readString(value, 'promptText') ?? readString(base, 'promptText') ?? '',\n promptPath: readString(value, 'promptPath') ?? readString(base, 'promptPath') ?? '',\n agentsText: readString(value, 'agentsText') ?? readString(base, 'agentsText') ?? '',\n agentsPath: readString(value, 'agentsPath') ?? readString(base, 'agentsPath') ?? '',\n injectAgentsPrompt: readBoolean(value, 'injectAgentsPrompt', readBoolean(base, 'injectAgentsPrompt', false)),\n firstTurnAnchor: readBoolean(value, 'firstTurnAnchor', readBoolean(base, 'firstTurnAnchor', false)),\n firstTurnText: readString(value, 'firstTurnText') ?? readString(base, 'firstTurnText') ?? '',\n firstTurnCustom: readBoolean(value, 'firstTurnCustom', readBoolean(base, 'firstTurnCustom', false)),\n guideText: readString(value, 'guideText') ?? readString(base, 'guideText') ?? '',\n guideCustom: readBoolean(value, 'guideCustom', readBoolean(base, 'guideCustom', false)),\n guideEnabled: typeof value.guideEnabled === 'boolean' ? value.guideEnabled\n : typeof base.guideEnabled === 'boolean' ? base.guideEnabled\n : undefined,\n modelProvider: readString(value, 'modelProvider') ?? readString(base, 'modelProvider') ?? '',\n modelName: readString(value, 'modelName') ?? readString(base, 'modelName') ?? '',\n subagentModelProvider: readString(value, 'subagentModelProvider') ?? readString(base, 'subagentModelProvider') ?? '',\n subagentModelName: readString(value, 'subagentModelName') ?? readString(base, 'subagentModelName') ?? '',\n modelReasoningEffort: readString(value, 'modelReasoningEffort') ?? readString(base, 'modelReasoningEffort') ?? '',\n modelTemperature: readString(value, 'modelTemperature') ?? readString(base, 'modelTemperature') ?? '',\n modelMaxTokens: readString(value, 'modelMaxTokens') ?? readString(base, 'modelMaxTokens') ?? '',\n subagentReasoningEffort: readString(value, 'subagentReasoningEffort') ?? readString(base, 'subagentReasoningEffort') ?? '',\n subagentTemperature: readString(value, 'subagentTemperature') ?? readString(base, 'subagentTemperature') ?? '',\n subagentMaxTokens: readString(value, 'subagentMaxTokens') ?? readString(base, 'subagentMaxTokens') ?? '',\n // 预设级参数(toolFilterAllow/toolFilterDeny/maxDepth/allowKinds/firstTurnWord)\n // 不进 settings namespace:默认空,由 /param-overrides 读回后填充(store.load paramPatch)。\n toolFilterAllow: '',\n toolFilterDeny: '',\n toolFilterSubagents: false,\n maxDepth: '',\n allowKinds: '',\n firstTurnWord: '',\n bootstrapMaxTokens: readNumber(value, 'bootstrapMaxTokens', readNumber(base, 'bootstrapMaxTokens', 0)),\n usePtcMode: readBoolean(value, 'usePtcMode', readBoolean(base, 'usePtcMode', false)),\n // 渐进披露(stages 模式):预设级参数,由 /param-overrides 读回后填充。\n stages: [],\n stagePreUnlock: 1,\n stageAdvanceTool: '',\n stageAdvanceDescription: '',\n stageSectionTemplate: '',\n // 晋升门控(tool-bootstrap 参数桥):预设级参数,由 /param-overrides + presetParams 填充。\n promoteGate: false,\n promoteAfterFirstResponse: false,\n maxPromoteSteps: 0,\n bootstrapTools: '',\n compactionTools: '',\n personaSectionsOnly: false,\n workspaceLine: false,\n phase1FirstCallInstruction: '',\n instructionHint: false,\n // context-gate 注入门控(预设级参数,由 /param-overrides 填充)。\n messageSources: '',\n deferredSources: '',\n deferredGraceSteps: 0,\n // 锚定/深思可选模块(anchor-turn / deliberation-gate / cot-drip 参数桥)。\n anchorTurn: readBoolean(value, 'anchorTurn', readBoolean(base, 'anchorTurn', false)),\n anchorTurnText: readString(value, 'anchorTurnText') ?? readString(base, 'anchorTurnText') ?? '',\n deliberationGate: readBoolean(value, 'deliberationGate', readBoolean(base, 'deliberationGate', false)),\n deliberationMinChars: readNumber(value, 'deliberationMinChars', readNumber(base, 'deliberationMinChars', 0)),\n deliberationMaxGatesPerTurn: readNumber(value, 'deliberationMaxGatesPerTurn', readNumber(base, 'deliberationMaxGatesPerTurn', 0)),\n cotDrip: readBoolean(value, 'cotDrip', readBoolean(base, 'cotDrip', false)),\n cotDripEvery: readNumber(value, 'cotDripEvery', readNumber(base, 'cotDripEvery', 0)),\n cotDripMaxPerTurn: readNumber(value, 'cotDripMaxPerTurn', readNumber(base, 'cotDripMaxPerTurn', 0)),\n strReplaceEditorMaxOutputChars: readNumber(value, 'strReplaceEditorMaxOutputChars',\n readNumber(base, 'strReplaceEditorMaxOutputChars', 16000)),\n injectPrompt: readBoolean(value, 'injectPrompt', readBoolean(base, 'injectPrompt', true)),\n skillSwitches: value.skillSwitches !== undefined || base.skillSwitches !== undefined\n ? { ...readSkillSwitches(base, 'skillSwitches'), ...readSkillSwitches(value, 'skillSwitches') }\n : {},\n skillOrder: readStringArray(value, 'skillOrder').length > 0\n ? readStringArray(value, 'skillOrder')\n : readStringArray(base, 'skillOrder'),\n skillCatalog: res.ok && res.skillCatalog !== undefined && res.skillCatalog.length > 0\n ? res.skillCatalog\n : readSkillCatalog(value, 'skillCatalog').length > 0\n ? readSkillCatalog(value, 'skillCatalog')\n : readSkillCatalog(base, 'skillCatalog'),\n skillsDirs: readStringArray(value, 'skillsDirs').length > 0\n ? readStringArray(value, 'skillsDirs')\n : readStringArray(base, 'skillsDirs'),\n activeSkillsDirs: readStringArray(value, 'activeSkillsDirs').length > 0\n ? readStringArray(value, 'activeSkillsDirs')\n : readStringArray(base, 'activeSkillsDirs'),\n skillsDirExists: (() => {\n const merged: Record<string, boolean> = {}\n for (const entry of [value, base]) {\n const record = entry\n const exists = record.skillsDirExists\n if (exists !== null && typeof exists === 'object' && !Array.isArray(exists)) {\n Object.assign(merged, exists as Record<string, unknown>)\n }\n }\n const result: Record<string, boolean> = {}\n for (const [path, ok] of Object.entries(merged)) {\n if (typeof ok === 'boolean') result[path] = ok\n }\n return result\n })(),\n skillRankBase: readNumber(value, 'skillRankBase', readNumber(base, 'skillRankBase', 250)),\n residentAgentsPath: readString(value, 'residentAgentsPath') ?? readString(base, 'residentAgentsPath') ?? '',\n presetDir: readString(value, 'presetDir') ?? readString(base, 'presetDir') ?? '',\n presetOrder: readNumber(value, 'presetOrder', readNumber(base, 'presetOrder', 5)),\n fallbackText: readString(value, 'fallbackText') ?? readString(base, 'fallbackText') ?? '',\n writeAgents: readBoolean(value, 'writeAgents', readBoolean(base, 'writeAgents', true)),\n writePreset: readBoolean(value, 'writePreset', readBoolean(base, 'writePreset', true)),\n presetTemplate: readString(value, 'presetTemplate') ?? readString(base, 'presetTemplate') ?? 'anchored',\n promptConfigs: value.promptConfigs !== undefined\n ? readPromptConfigs(value, 'promptConfigs')\n : readPromptConfigs(base, 'promptConfigs'),\n }\n return next\n}\n\n/** 编译期契约:所有引擎参数键都必须进入 Fields,防止 host 契约新增键后 client 静默丢弃。 */\ntype MissingEngineParamKeys = Exclude<EngineParamKey, keyof Fields>\nconst _assertEngineParamsInFields: MissingEngineParamKeys[] = []\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { SettingsPathOpView } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { SettingsScope, SettingsScopeSnapshot } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type { EngineMeta, PromptConfigDraft, PromptToolHostApi } from './prompt-tool-types.ts'\nimport {\n EMPTY_FIELDS,\n EMPTY_META,\n bridgePost,\n errorMessage,\n fieldsFromView,\n type BridgeResult,\n type BridgeSettingsView,\n type Fields,\n type HostDefaultModel,\n type StageDraft,\n} from './prompt-tool-bridge.ts'\n\n/** rc8 ui-settings 共享镜像传输面:标准字段经官方 settingsScope 读写。 */\nexport interface PromptToolSettingsTransport {\n /** 宿主注册的 prompt-tool settings namespace 绑定。 */\n scope: SettingsScope<Record<string, unknown>>\n /** 触发一次共享 describe mirror 读取(idle 时才真正发 RPC)。 */\n ensure: () => Promise<void>\n /** 批量 path-op 写入;成功后 scope 快照已 fold 最新 revision。 */\n mutate: (ops: SettingsPathOpView[], expectedRevision?: number) => Promise<void>\n}\n\nexport interface SwitchSnapshot {\n injectAgentsPrompt: boolean\n firstTurnAnchor: boolean\n firstTurnText: string\n firstTurnCustom: boolean\n guideText: string\n guideCustom: boolean\n guideEnabled: boolean | undefined\n modelProvider: string\n modelName: string\n subagentModelProvider: string\n subagentModelName: string\n modelReasoningEffort: string\n modelTemperature: string\n modelMaxTokens: string\n subagentReasoningEffort: string\n subagentTemperature: string\n subagentMaxTokens: string\n bootstrapMaxTokens: number\n usePtcMode: boolean\n stages: StageDraft[]\n stagePreUnlock: number\n stageAdvanceTool: string\n stageAdvanceDescription: string\n stageSectionTemplate: string\n promoteGate: boolean\n promoteAfterFirstResponse: boolean\n maxPromoteSteps: number\n bootstrapTools: string\n compactionTools: string\n personaSectionsOnly: boolean\n workspaceLine: boolean\n phase1FirstCallInstruction: string\n instructionHint: boolean\n messageSources: string\n deferredSources: string\n deferredGraceSteps: number\n anchorTurn: boolean\n anchorTurnText: string\n deliberationGate: boolean\n deliberationMinChars: number\n deliberationMaxGatesPerTurn: number\n cotDrip: boolean\n cotDripEvery: number\n cotDripMaxPerTurn: number\n strReplaceEditorMaxOutputChars: number\n injectPrompt: boolean\n skillSwitches: Record<string, boolean>\n skillOrder: string[]\n skillsDirs: string[]\n skillRankBase: number\n residentAgentsPath: string\n presetDir: string\n presetOrder: number\n fallbackText: string\n writeAgents: boolean\n writePreset: boolean\n}\n\nconst EMPTY_SWITCHES: SwitchSnapshot = {\n injectAgentsPrompt: false,\n firstTurnAnchor: false,\n firstTurnText: '',\n firstTurnCustom: false,\n guideText: '',\n guideCustom: false,\n guideEnabled: undefined,\n modelProvider: '',\n modelName: '',\n subagentModelProvider: '',\n subagentModelName: '',\n modelReasoningEffort: '',\n modelTemperature: '',\n modelMaxTokens: '',\n subagentReasoningEffort: '',\n subagentTemperature: '',\n subagentMaxTokens: '',\n bootstrapMaxTokens: 0,\n usePtcMode: false,\n stages: [],\n stagePreUnlock: 1,\n stageAdvanceTool: '',\n stageAdvanceDescription: '',\n stageSectionTemplate: '',\n promoteGate: false,\n promoteAfterFirstResponse: false,\n maxPromoteSteps: 0,\n bootstrapTools: '',\n compactionTools: '',\n personaSectionsOnly: false,\n workspaceLine: false,\n phase1FirstCallInstruction: '',\n instructionHint: false,\n messageSources: '',\n deferredSources: '',\n deferredGraceSteps: 0,\n anchorTurn: false,\n anchorTurnText: '',\n deliberationGate: false,\n deliberationMinChars: 0,\n deliberationMaxGatesPerTurn: 0,\n cotDrip: false,\n cotDripEvery: 0,\n cotDripMaxPerTurn: 0,\n strReplaceEditorMaxOutputChars: 16000,\n injectPrompt: true,\n skillSwitches: {},\n skillOrder: [],\n skillsDirs: [],\n skillRankBase: 250,\n residentAgentsPath: '',\n presetDir: '',\n presetOrder: 5,\n fallbackText: '',\n writeAgents: true,\n writePreset: true,\n}\n\n/** 本项目默认不设上限时的显示值(adapter 默认 maxTokens)。 */\nconst DEFAULT_BOOTSTRAP_DISPLAY = '256000'\n\n/** 内容资产条目:preset.md(prompt-injector)/ agents.md(instruction-hint),\n * text 走生成目录文件通道,settings 覆盖层只存轻字段。 */\nconst isContentAsset = (config: PromptConfigDraft): boolean =>\n config.id === 'prompt-injector' || config.fill === 'instruction-hint'\n\n/**\n * promptConfigs 脏检测:引用比较为主,但两个空数组内容相同必须判「不脏」。\n * store 初始化时 fields=EMPTY_FIELDS.promptConfigs(模块级常量 [])而\n * savedConfigs 是 useState([]) 新字面量,引用不同——纯引用比较会误判脏,\n * 挂载 800ms 后把空数组自动保存进 preset.yml,清空大预设的全部配置卡。\n */\nconst promptConfigsDirty = (current: PromptConfigDraft[], saved: PromptConfigDraft[]): boolean =>\n current !== saved && !(current.length === 0 && saved.length === 0)\n\n/** 剥离内容资产的 text(顶层 + params.text):settings 载荷不承载大文本。 */\nconst stripContentText = (config: PromptConfigDraft): PromptConfigDraft => {\n const next: PromptConfigDraft = { ...config }\n delete next.text\n if (next.params !== undefined) {\n const params = { ...next.params }\n delete params.text\n next.params = params\n }\n return next\n}\n\n/** 渲染产物 → 编辑草稿:内容资产条目的 params.text(生成目录文件内容)提升到 text 框显示。 */\nconst liftContentText = (config: PromptConfigDraft): PromptConfigDraft => {\n if (!isContentAsset(config)) return config\n if ((config.text ?? '') !== '') return config\n const text = typeof config.params?.text === 'string' ? config.params.text : ''\n return text.length > 0 ? { ...config, text } : config\n}\n\nexport const snapshotSwitches = (fields: Fields): SwitchSnapshot => ({\n injectAgentsPrompt: fields.injectAgentsPrompt,\n firstTurnAnchor: fields.firstTurnAnchor,\n firstTurnText: fields.firstTurnText,\n firstTurnCustom: fields.firstTurnCustom,\n guideText: fields.guideText,\n guideCustom: fields.guideCustom,\n guideEnabled: fields.guideEnabled,\n modelProvider: fields.modelProvider,\n modelName: fields.modelName,\n subagentModelProvider: fields.subagentModelProvider,\n subagentModelName: fields.subagentModelName,\n modelReasoningEffort: fields.modelReasoningEffort,\n modelTemperature: fields.modelTemperature,\n modelMaxTokens: fields.modelMaxTokens,\n subagentReasoningEffort: fields.subagentReasoningEffort,\n subagentTemperature: fields.subagentTemperature,\n subagentMaxTokens: fields.subagentMaxTokens,\n bootstrapMaxTokens: fields.bootstrapMaxTokens,\n usePtcMode: fields.usePtcMode,\n stages: fields.stages.map((stage) => ({ ...stage })),\n stagePreUnlock: fields.stagePreUnlock,\n stageAdvanceTool: fields.stageAdvanceTool,\n stageAdvanceDescription: fields.stageAdvanceDescription,\n stageSectionTemplate: fields.stageSectionTemplate,\n promoteGate: fields.promoteGate,\n promoteAfterFirstResponse: fields.promoteAfterFirstResponse,\n maxPromoteSteps: fields.maxPromoteSteps,\n bootstrapTools: fields.bootstrapTools,\n compactionTools: fields.compactionTools,\n personaSectionsOnly: fields.personaSectionsOnly,\n workspaceLine: fields.workspaceLine,\n phase1FirstCallInstruction: fields.phase1FirstCallInstruction,\n instructionHint: fields.instructionHint,\n messageSources: fields.messageSources,\n deferredSources: fields.deferredSources,\n deferredGraceSteps: fields.deferredGraceSteps,\n anchorTurn: fields.anchorTurn,\n anchorTurnText: fields.anchorTurnText,\n deliberationGate: fields.deliberationGate,\n deliberationMinChars: fields.deliberationMinChars,\n deliberationMaxGatesPerTurn: fields.deliberationMaxGatesPerTurn,\n cotDrip: fields.cotDrip,\n cotDripEvery: fields.cotDripEvery,\n cotDripMaxPerTurn: fields.cotDripMaxPerTurn,\n strReplaceEditorMaxOutputChars: fields.strReplaceEditorMaxOutputChars,\n injectPrompt: fields.injectPrompt,\n skillSwitches: { ...fields.skillSwitches },\n skillOrder: [...fields.skillOrder],\n skillsDirs: [...fields.skillsDirs],\n skillRankBase: fields.skillRankBase,\n residentAgentsPath: fields.residentAgentsPath,\n presetDir: fields.presetDir,\n presetOrder: fields.presetOrder,\n fallbackText: fields.fallbackText,\n writeAgents: fields.writeAgents,\n writePreset: fields.writePreset,\n})\n\nconst isPlainRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value)\n\n/** 深比较 snapshot 内的数组/record;不使用 JSON.stringify,避免键顺序影响脏检测。 */\nconst deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false\n return a.every((item, index) => deepEqual(item, b[index]))\n }\n if (isPlainRecord(a) || isPlainRecord(b)) {\n if (!isPlainRecord(a) || !isPlainRecord(b)) return false\n const keys = new Set([...Object.keys(a), ...Object.keys(b)])\n for (const key of keys) {\n if (!deepEqual(a[key], b[key])) return false\n }\n return true\n }\n return false\n}\n\n/** 全字段结构化比较:SwitchSnapshot 声明的每个键都参与,防止新增参数漏比较。 */\nconst switchesEqual = (a: SwitchSnapshot, b: SwitchSnapshot): boolean => {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)])\n for (const key of keys) {\n if (!deepEqual(a[key as keyof SwitchSnapshot], b[key as keyof SwitchSnapshot])) return false\n }\n return true\n}\n\nexport type SwitchKey = 'injectAgentsPrompt' | 'firstTurnAnchor' | 'firstTurnCustom' | 'guideCustom' | 'toolFilterSubagents' | 'injectPrompt' | 'usePtcMode' | 'promoteGate' | 'promoteAfterFirstResponse' | 'personaSectionsOnly' | 'workspaceLine' | 'instructionHint' | 'anchorTurn' | 'deliberationGate' | 'cotDrip' | 'writeAgents' | 'writePreset'\n\n/** 参数类布尔开关:写激活预设 preset.yml(settings 只留全局开关)。 */\nconst PARAM_SWITCH_KEYS: ReadonlySet<SwitchKey> = new Set(['firstTurnAnchor', 'firstTurnCustom', 'guideCustom', 'toolFilterSubagents', 'injectPrompt', 'usePtcMode', 'promoteGate', 'promoteAfterFirstResponse', 'personaSectionsOnly', 'workspaceLine', 'instructionHint', 'anchorTurn', 'deliberationGate', 'cotDrip'])\n\nexport interface PromptToolStore {\n fields: Fields\n /** fields 外部订阅通道(usePromptToolFields):patch/load 变更后通知。\n * getFields 返回引用稳定快照,selector 化的组件据此跳过无关重渲染。 */\n getFields: () => Fields\n subscribeFields: (listener: () => void) => () => void\n meta: EngineMeta\n loading: boolean\n providers: string[]\n modelCatalog: Record<string, string[]>\n hostDefaultModel?: HostDefaultModel\n bootstrapTokensDraft: string\n /** 新技能目录路径输入(多目录卡片:输入路径添加)。 */\n skillsDirDraft: string\n /** 当前预设模板消息批层(pre-step)配置数;0 = 模板无配置(入口开关联动关闭)。 */\n templatePreStepCount: number\n savedSwitches: SwitchSnapshot\n savedConfigs: PromptConfigDraft[]\n savingSkillsDir: boolean\n fixingSkill: string | undefined\n notice: string\n noticeKind: 'ok' | 'error'\n load: () => Promise<Fields>\n showNotice: (kind: 'ok' | 'error', message: string) => void\n patch: (partial: Partial<Fields>) => void\n persistSwitches: () => void\n persistParamOverrides: () => Promise<void>\n persistConfigs: (configs: PromptConfigDraft[]) => void\n /** 预设级模板变量(preset.yml 内容变量;writePreset 展开进 variables.yml,引擎合并进每条配置)。 */\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n /** 模板变量插值开关(preset.yml 顶层 variablesEnabled,缺省 true)。 */\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n /** 保存模板变量;可显式传入下一份值(如清空场景,避免 setState 未生效时的旧闭包)。 */\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n toggle: (key: SwitchKey) => void\n toggleBootstrapMaxTokens: () => void\n setPresetTemplate: (id: string) => void\n setBootstrapTokensDraft: (value: string) => void\n commitBootstrapTokensDraft: () => void\n /** 门控回退步数草稿(数字输入,失焦提交;0 = 引擎默认 4)。 */\n gateStepsDraft: string\n setGateStepsDraft: (value: string) => void\n commitGateStepsDraft: () => void\n setSkillsDirDraft: (value: string) => void\n /** 追加技能目录(按添加顺序;重复路径拒绝)。 */\n addSkillsDir: (dir: string) => void\n /** 移除技能目录引用(只删引用,不删原文件)。 */\n removeSkillsDir: (dir: string) => void\n toggleSkill: (folder: string) => void\n skillEnabled: (folder: string) => boolean\n fixSkill: (folder: string) => void\n /** 打开指定技能目录;不传 = 打开第一个生效目录。 */\n openSkillsDir: (path?: string) => Promise<void>\n dirtySwitches: boolean\n dirtyConfigs: boolean\n dirty: boolean\n}\n\n\n/** 等待共享 mirror 的首次应答离开 loading(ready/idle/unavailable 都会返回)。 */\nfunction waitForScope(scope: SettingsScope<Record<string, unknown>>): Promise<SettingsScopeSnapshot<Record<string, unknown>>> {\n const current = scope.getSnapshot()\n if (current.status !== 'loading') return Promise.resolve(current)\n return new Promise((resolve) => {\n let settled = false\n const dispose = scope.subscribe(() => {\n const next = scope.getSnapshot()\n if (next.status === 'loading') return\n if (settled) return\n settled = true\n dispose()\n resolve(next)\n })\n // 宿主 mirror 卡 loading 时兜底超时,避免 UI 永久 loading。\n setTimeout(() => {\n if (settled) return\n settled = true\n dispose()\n resolve(scope.getSnapshot())\n }, 5000)\n })\n}\n\n/** 把 /bootstrap 响应(value=服务端 settings descriptor)直接组装成旧 BridgeResult 视图。\n * 不再走 rc8 共享 mirror:宿主全量 describe 在插件多时是秒级 RPC,切换预设后\n * settings.ensure() 会让配置卡延迟十几秒出现;/bootstrap 已携带同源 descriptor。 */\nfunction bridgeViewFromBoot(boot: BridgeResult<BridgeSettingsView>): BridgeResult<BridgeSettingsView> {\n if (!boot.ok) return boot\n return {\n ok: true,\n value: {\n ns: 'prompt-tool',\n value: boot.value.value,\n base: boot.value.base,\n revision: boot.value.revision,\n },\n providers: boot.providers,\n modelCatalog: boot.modelCatalog,\n activeSkillsDirs: boot.activeSkillsDirs,\n skillCatalog: boot.skillCatalog,\n templatePreStepCount: boot.templatePreStepCount,\n presetParams: boot.presetParams,\n hostDefaultModel: boot.hostDefaultModel,\n }\n}\n\nexport function usePromptToolStore(api: PromptToolHostApi, settings: PromptToolSettingsTransport): PromptToolStore {\n const [providers, setProviders] = useState<string[]>([])\n const [modelCatalog, setModelCatalog] = useState<Record<string, string[]>>({})\n const [hostDefaultModel, setHostDefaultModel] = useState<HostDefaultModel | undefined>(undefined)\n const [fields, setFields] = useState<Fields>(EMPTY_FIELDS)\n const [meta, setMeta] = useState<EngineMeta>(EMPTY_META)\n const [bootstrapTokensDraft, setBootstrapTokensDraft] = useState(DEFAULT_BOOTSTRAP_DISPLAY)\n const [gateStepsDraft, setGateStepsDraft] = useState('4')\n const [skillsDirDraft, setSkillsDirDraft] = useState('')\n const [templatePreStepCount, setTemplatePreStepCount] = useState(0)\n const [savedSwitches, setSavedSwitches] = useState<SwitchSnapshot>(EMPTY_SWITCHES)\n const [savedConfigs, setSavedConfigs] = useState<PromptConfigDraft[]>([])\n const [templateVariables, setTemplateVariables] = useState<Record<string, string>>({})\n const [templateVariablesEnabled, setTemplateVariablesEnabled] = useState(true)\n const [loading, setLoading] = useState(false)\n const [savingSkillsDir, setSavingSkillsDir] = useState(false)\n const [fixingSkill, setFixingSkill] = useState<string | undefined>(undefined)\n const [notice, setNotice] = useState('')\n const [noticeKind, setNoticeKind] = useState<'ok' | 'error'>('ok')\n const fieldsRef = useRef<Fields>(EMPTY_FIELDS)\n /** fields 订阅者集合:patch/load 每次产生新 fields 引用时广播。\n * ponytail: 单订阅通道(无 selector 缓存层),selector 在消费侧 useRef 缓存。 */\n const fieldsListenersRef = useRef(new Set<() => void>())\n const publishFields = useCallback((next: Fields) => {\n fieldsRef.current = next\n setFields(next)\n for (const listener of fieldsListenersRef.current) listener()\n }, [])\n const getFields = useCallback(() => fieldsRef.current, [])\n const subscribeFields = useCallback((listener: () => void) => {\n fieldsListenersRef.current.add(listener)\n return () => { fieldsListenersRef.current.delete(listener) }\n }, [])\n const revisionRef = useRef<number | undefined>(undefined)\n const saveQueueRef = useRef<Promise<void>>(Promise.resolve())\n const paramSaveQueueRef = useRef<Promise<void>>(Promise.resolve())\n const loadSeqRef = useRef(0)\n /** 用户草稿版本:patch 时递增。load 应答返回时若版本变化,跳过覆盖,避免\n * 保存后的静默刷新吞掉用户在读取期间的编辑。 */\n const draftVersionRef = useRef(0)\n /** applyView 自动预选的 provider:无模型名时不作为用户显式参数落盘。 */\n const autoModelProviderRef = useRef<string | undefined>(undefined)\n const autoSubagentModelProviderRef = useRef<string | undefined>(undefined)\n /** 最近一次 load 时 preset.yml params 现有键集:persist 只发送「已有键或已改动」,\n * 未动过的键不写——避免 UI 默认值固化覆盖模板 moduleConfigs 默认(liangshen 等)。 */\n const loadedKeysRef = useRef<Set<string>>(new Set())\n\n const showNotice = useCallback((kind: 'ok' | 'error', message: string) => {\n setNotice(message)\n setNoticeKind(kind)\n }, [])\n\n /** 模型目录惰性加载:独立于主 load(/describe 不再阻塞等模型查询)。 */\n const loadModels = useCallback(async (): Promise<void> => {\n const res = await bridgePost<{ modelCatalog: Record<string, string[]> }>('/models', {})\n if (res.ok) setModelCatalog(res.value.modelCatalog ?? {})\n }, [])\n\n const applyView = useCallback((res: BridgeResult<BridgeSettingsView>): Fields => {\n setTemplatePreStepCount(res.ok && typeof res.templatePreStepCount === 'number' ? res.templatePreStepCount : 0)\n setProviders(res.ok ? res.providers ?? [] : [])\n setModelCatalog(res.ok ? res.modelCatalog ?? {} : {})\n setHostDefaultModel(res.ok ? res.hostDefaultModel : undefined)\n const next = fieldsFromView(res)\n // 引擎参数按预设存储(激活预设 preset.yml):settings 不再承载,\n // 参数键由 /describe 的 presetParams 合并(类型匹配键覆盖,其余保持)。\n if (res.ok && res.presetParams !== undefined) {\n const params = res.presetParams\n const nextRecord = next as unknown as Record<string, unknown>\n for (const key of Object.keys(params)) {\n const value = params[key]\n if (value === undefined || value === null || key === 'promptConfigs') continue\n const current = nextRecord[key]\n if (current === undefined) continue\n if (key === 'guideEnabled' && typeof value === 'boolean') {\n nextRecord[key] = value\n } else if (typeof current === 'boolean' && typeof value === 'boolean') {\n nextRecord[key] = value\n } else if (typeof current === 'number' && typeof value === 'number') {\n nextRecord[key] = value\n } else if (typeof current === 'string' && typeof value === 'string') {\n nextRecord[key] = value\n }\n }\n }\n // 检测到 DeepSeek 路由且用户未设置服务商时,直接预选第一个检测到的 provider\n // (模型名为空则路由不激活,继承主会话语义不变;用户后续选择模型名即生效)。\n // 自动预选值记录到 ref:它只是显示兜底,不作为用户显式参数写进 preset.yml。\n autoModelProviderRef.current = undefined\n if (res.ok && next.modelProvider === '' && (res.providers?.length ?? 0) > 0) {\n autoModelProviderRef.current = res.providers![0]!\n next.modelProvider = autoModelProviderRef.current\n }\n // 子代理服务商同样预选:模型名为空则固定路由不激活(继承主会话),仅让模型名下拉有候选。\n autoSubagentModelProviderRef.current = undefined\n if (res.ok && next.subagentModelProvider === '' && (res.providers?.length ?? 0) > 0) {\n autoSubagentModelProviderRef.current = res.providers![0]!\n next.subagentModelProvider = autoSubagentModelProviderRef.current\n }\n publishFields(next)\n setBootstrapTokensDraft(next.bootstrapMaxTokens > 0 ? String(next.bootstrapMaxTokens) : DEFAULT_BOOTSTRAP_DISPLAY)\n setGateStepsDraft(next.maxPromoteSteps > 0 ? String(next.maxPromoteSteps) : '4')\n setSkillsDirDraft('')\n setSavedSwitches(snapshotSwitches(next))\n setSavedConfigs(next.promptConfigs)\n // revision 只在首次建立,后续由 enqueueSave 的 mutate 应答维护——/bootstrap 的\n // descriptor 有 30s 服务端缓存,用其 revision 倒退会导致下一次保存 409。\n if (res.ok && revisionRef.current === undefined) revisionRef.current = res.value.revision\n return next\n }, [])\n\n const load = useCallback(async (options?: { silent?: boolean }) => {\n // 并发保护:慢的旧请求不得覆盖新请求(last-good 语义保留旧数据)。\n const seq = ++loadSeqRef.current\n const draftVersion = draftVersionRef.current\n // silent:保存后静默刷新(不闪 loading、避免重渲染风暴与滚动跳动);失败仍报错。\n if (!options?.silent) setLoading(true)\n try {\n // /bootstrap 聚合读取:meta + describe runtime facts + 参数覆盖 + 模板变量 +\n // 实际生效配置一次取回(此前 5 端点串行,preset.yml 每端点读盘解析)。\n const boot = await bridgePost<BridgeSettingsView>('/bootstrap', {})\n if (seq !== loadSeqRef.current) return EMPTY_FIELDS\n // 读取期间用户已修改草稿:不应用服务端快照覆盖,保留草稿;后续保存/读取再同步。\n if (draftVersionRef.current !== draftVersion) return fieldsRef.current\n if (!boot.ok) {\n showNotice('error', '读取配置失败:' + (boot.message ?? 'bootstrap unavailable'))\n return EMPTY_FIELDS\n }\n if (boot.meta !== undefined) setMeta(boot.meta.meta)\n // /bootstrap 已携带 settings descriptor(value/base/revision):直接作为 fields\n // 主源,不再 await settings.ensure()——宿主全量 describe mirror 是切换预设后\n // 配置卡十几秒才出现的瓶颈。\n const res = bridgeViewFromBoot(boot)\n applyView(res)\n // 用户参数覆盖(激活预设 preset.yml params;settings 不再承载参数)。\n if (boot.ok && boot.overrides !== undefined) {\n const o = boot.overrides.overrides\n loadedKeysRef.current = new Set(Object.keys(o))\n const paramPatch: Partial<Fields> = {}\n if (typeof o.firstTurnAnchor === 'boolean') paramPatch.firstTurnAnchor = o.firstTurnAnchor\n if (typeof o.firstTurnText === 'string') paramPatch.firstTurnText = o.firstTurnText\n if (typeof o.firstTurnCustom === 'boolean') paramPatch.firstTurnCustom = o.firstTurnCustom\n if (typeof o.guideText === 'string') paramPatch.guideText = o.guideText\n if (typeof o.guideCustom === 'boolean') paramPatch.guideCustom = o.guideCustom\n if (typeof o.guideEnabled === 'boolean') paramPatch.guideEnabled = o.guideEnabled\n if (typeof o.modelProvider === 'string') paramPatch.modelProvider = o.modelProvider\n if (typeof o.modelName === 'string') paramPatch.modelName = o.modelName\n if (typeof o.subagentModelProvider === 'string') paramPatch.subagentModelProvider = o.subagentModelProvider\n if (typeof o.subagentModelName === 'string') paramPatch.subagentModelName = o.subagentModelName\n // 模型参数三件套(主对话 + 子代理):引擎按这些 params 生成 model-params\n // 配置(agent-request patch),UI 侧统一在「模型设置」卡片编辑显示,\n // 不依赖模块列表里的 model-params 卡片。\n if (typeof o.modelReasoningEffort === 'string') paramPatch.modelReasoningEffort = o.modelReasoningEffort\n if (typeof o.modelTemperature === 'string') paramPatch.modelTemperature = o.modelTemperature\n if (typeof o.modelMaxTokens === 'string') paramPatch.modelMaxTokens = o.modelMaxTokens\n if (typeof o.subagentReasoningEffort === 'string') paramPatch.subagentReasoningEffort = o.subagentReasoningEffort\n if (typeof o.subagentTemperature === 'string') paramPatch.subagentTemperature = o.subagentTemperature\n if (typeof o.subagentMaxTokens === 'string') paramPatch.subagentMaxTokens = o.subagentMaxTokens\n if (typeof o.usePtcMode === 'boolean') paramPatch.usePtcMode = o.usePtcMode\n if (typeof o.injectPrompt === 'boolean') paramPatch.injectPrompt = o.injectPrompt\n if (Array.isArray(o.toolFilterAllow)) paramPatch.toolFilterAllow = o.toolFilterAllow.join(', ')\n else if (typeof o.toolFilterAllow === 'string') paramPatch.toolFilterAllow = o.toolFilterAllow\n if (Array.isArray(o.toolFilterDeny)) paramPatch.toolFilterDeny = o.toolFilterDeny.join(', ')\n else if (typeof o.toolFilterDeny === 'string') paramPatch.toolFilterDeny = o.toolFilterDeny\n if (o.maxDepth !== undefined && o.maxDepth !== null && o.maxDepth !== '') {\n paramPatch.maxDepth = String(o.maxDepth)\n }\n if (Array.isArray(o.allowKinds)) paramPatch.allowKinds = o.allowKinds.join(', ')\n else if (typeof o.allowKinds === 'string') paramPatch.allowKinds = o.allowKinds\n if (typeof o.firstTurnWord === 'string') paramPatch.firstTurnWord = o.firstTurnWord\n if (typeof o.bootstrapMaxTokens === 'number') paramPatch.bootstrapMaxTokens = o.bootstrapMaxTokens\n // 晋升门控(tool-bootstrap 参数桥)。\n if (typeof o.promoteGate === 'boolean') paramPatch.promoteGate = o.promoteGate\n if (typeof o.promoteAfterFirstResponse === 'boolean') paramPatch.promoteAfterFirstResponse = o.promoteAfterFirstResponse\n if (typeof o.maxPromoteSteps === 'number') paramPatch.maxPromoteSteps = o.maxPromoteSteps\n if (Array.isArray(o.bootstrapTools)) paramPatch.bootstrapTools = o.bootstrapTools.join(', ')\n else if (typeof o.bootstrapTools === 'string') paramPatch.bootstrapTools = o.bootstrapTools\n if (Array.isArray(o.compactionTools)) paramPatch.compactionTools = o.compactionTools.join(', ')\n else if (typeof o.compactionTools === 'string') paramPatch.compactionTools = o.compactionTools\n // 渐进披露(stages 模式):引擎形态 [{name, tools: string[]}] → UI 草稿。\n if (Array.isArray(o.stages)) {\n paramPatch.stages = o.stages\n .filter((stage): stage is { name?: unknown; tools?: unknown } =>\n stage !== null && typeof stage === 'object')\n .map((stage) => ({\n name: typeof stage.name === 'string' ? stage.name : '',\n tools: Array.isArray(stage.tools)\n ? stage.tools.filter((item): item is string => typeof item === 'string').join(', ')\n : '',\n }))\n }\n if (typeof o.stagePreUnlock === 'number') paramPatch.stagePreUnlock = o.stagePreUnlock\n if (typeof o.stageAdvanceTool === 'string') paramPatch.stageAdvanceTool = o.stageAdvanceTool\n if (typeof o.stageAdvanceDescription === 'string') paramPatch.stageAdvanceDescription = o.stageAdvanceDescription\n if (typeof o.stageSectionTemplate === 'string') paramPatch.stageSectionTemplate = o.stageSectionTemplate\n if (typeof o.personaSectionsOnly === 'boolean') paramPatch.personaSectionsOnly = o.personaSectionsOnly\n if (typeof o.workspaceLine === 'boolean') paramPatch.workspaceLine = o.workspaceLine\n if (typeof o.phase1FirstCallInstruction === 'string') paramPatch.phase1FirstCallInstruction = o.phase1FirstCallInstruction\n if (typeof o.instructionHint === 'boolean') paramPatch.instructionHint = o.instructionHint\n // context-gate 注入门控。\n if (Array.isArray(o.messageSources)) paramPatch.messageSources = o.messageSources.join(', ')\n else if (typeof o.messageSources === 'string') paramPatch.messageSources = o.messageSources\n if (Array.isArray(o.deferredSources)) paramPatch.deferredSources = o.deferredSources.join(', ')\n else if (typeof o.deferredSources === 'string') paramPatch.deferredSources = o.deferredSources\n if (typeof o.deferredGraceSteps === 'number') paramPatch.deferredGraceSteps = o.deferredGraceSteps\n // 锚定/深思可选模块(anchor-turn / deliberation-gate / cot-drip 参数桥)。\n if (typeof o.anchorTurn === 'boolean') paramPatch.anchorTurn = o.anchorTurn\n if (typeof o.anchorTurnText === 'string') paramPatch.anchorTurnText = o.anchorTurnText\n if (typeof o.deliberationGate === 'boolean') paramPatch.deliberationGate = o.deliberationGate\n if (typeof o.deliberationMinChars === 'number') paramPatch.deliberationMinChars = o.deliberationMinChars\n if (typeof o.deliberationMaxGatesPerTurn === 'number') paramPatch.deliberationMaxGatesPerTurn = o.deliberationMaxGatesPerTurn\n if (typeof o.cotDrip === 'boolean') paramPatch.cotDrip = o.cotDrip\n if (typeof o.cotDripEvery === 'number') paramPatch.cotDripEvery = o.cotDripEvery\n if (typeof o.cotDripMaxPerTurn === 'number') paramPatch.cotDripMaxPerTurn = o.cotDripMaxPerTurn\n if (typeof o.strReplaceEditorMaxOutputChars === 'number') paramPatch.strReplaceEditorMaxOutputChars = o.strReplaceEditorMaxOutputChars\n if (Object.keys(paramPatch).length > 0) {\n const next = { ...fieldsRef.current, ...paramPatch }\n publishFields(next)\n setSavedSwitches(snapshotSwitches(next))\n }\n }\n // 预设级模板变量(preset.yml 内容变量;失败不阻断主流程)。\n if (boot.ok && boot.variables !== undefined) {\n setTemplateVariables(boot.variables.variables)\n setTemplateVariablesEnabled(boot.variables.enabled !== false)\n }\n // 实际生效配置(引擎从生成目录加载;settings.promptConfigs 仅为覆盖层,\n // 默认为空不代表无配置)。非空时以实际配置为准,并同步已保存快照避免误判 dirty。\n if (boot.ok && boot.promptConfigs !== undefined\n && Array.isArray(boot.promptConfigs.promptConfigs) && boot.promptConfigs.promptConfigs.length > 0) {\n // 引擎自动生成的模型参数配置(model-params / subagent-model-params)由\n // 「模型设置」卡片管理,不进入模块列表(避免重复编辑入口)。\n const engineGenerated = new Set(['model-params', 'subagent-model-params'])\n const userConfigs = boot.promptConfigs.promptConfigs.filter((config) => !engineGenerated.has(config.id))\n // 内容资产条目(prompt-injector / instruction-hint):params.text(生成目录文件渲染产物)\n // 提升到 text 框显示,编辑入口统一为模块卡片。\n const actual = userConfigs.map(liftContentText)\n const next = { ...fieldsRef.current, promptConfigs: actual }\n publishFields(next)\n setSavedConfigs(actual)\n }\n setNotice('')\n return fieldsRef.current\n } catch (error) {\n showNotice('error', '读取失败:' + errorMessage(error))\n return EMPTY_FIELDS\n } finally {\n if (seq === loadSeqRef.current && !options?.silent) setLoading(false)\n }\n }, [applyView, settings, showNotice])\n\n // 挂载即后台拉取模型目录(不阻塞工作台首屏;10min 缓存兜底重复打开)。\n useEffect(() => {\n void loadModels()\n }, [loadModels])\n\n const refreshRevision = useCallback(async () => {\n try {\n await settings.ensure()\n const snapshot = await waitForScope(settings.scope)\n if (snapshot.revision !== undefined) revisionRef.current = snapshot.revision\n } catch {\n // 刷新失败保持原 revision,用户可重试。\n }\n }, [settings])\n\n const patch = useCallback((partial: Partial<Fields>) => {\n draftVersionRef.current += 1\n let next = { ...fieldsRef.current, ...partial }\n // complete 互斥:system-section/persona 共用官方 complete 语义(预设内仅一个),\n // 开启任一 enabled 配置的 complete 时自动关闭其他 enabled 配置的 complete。\n // disabled 配置不参与(引擎 effectiveList 已过滤,不注册即不独占;重新启用时由本次收敛)。\n if (Array.isArray(next.promptConfigs)) {\n const activeComplete = (config: PromptConfigDraft): boolean => config.enabled !== false && config.params?.complete === true\n const enabledComplete = next.promptConfigs.some(activeComplete)\n if (enabledComplete) {\n const kept = next.promptConfigs.findIndex(activeComplete)\n next = {\n ...next,\n promptConfigs: next.promptConfigs.map((config, index) =>\n index === kept || config.enabled === false\n ? config\n : { ...config, params: { ...config.params, complete: false } }),\n }\n }\n }\n publishFields(next)\n }, [publishFields])\n\n const enqueueSave = useCallback((ops: SettingsPathOpView[], okMessage: string | undefined, onSaved: () => void, setBusy?: (busy: boolean) => void) => {\n setBusy?.(true)\n saveQueueRef.current = saveQueueRef.current.then(async () => {\n try {\n await settings.mutate(ops, revisionRef.current)\n revisionRef.current = settings.scope.getSnapshot().revision\n onSaved()\n if (okMessage) showNotice('ok', okMessage)\n } catch (error) {\n // settings 注册重建(fiber reload)会把 namespace revision 归零,客户端\n // 持有的版本号随即过期:冲突时重试一次不带 expectedRevision(官方语义 =\n // 不检查并发,last-write-wins),全局开关不会再被过期版本号卡死。\n const message = errorMessage(error)\n if (/expected revision|changed since it was read/i.test(message)) {\n try {\n await settings.mutate(ops)\n revisionRef.current = settings.scope.getSnapshot().revision\n onSaved()\n if (okMessage) showNotice('ok', okMessage)\n } catch (retryError) {\n await refreshRevision()\n showNotice('error', '保存失败:' + errorMessage(retryError) + '(已刷新配置版本,可重试)')\n }\n } else {\n await refreshRevision()\n showNotice('error', '保存失败:' + message + '(已刷新配置版本,可重试)')\n }\n } finally {\n setBusy?.(false)\n }\n }).catch(() => {})\n }, [refreshRevision, settings, showNotice])\n\n const persistSwitches = useCallback((onSaved?: () => void) => {\n const savedSnapshot = snapshotSwitches(fieldsRef.current)\n return enqueueSave(\n [\n { op: 'set', path: ['injectAgentsPrompt'], value: fieldsRef.current.injectAgentsPrompt },\n { op: 'set', path: ['skillSwitches'], value: fieldsRef.current.skillSwitches },\n { op: 'set', path: ['skillOrder'], value: fieldsRef.current.skillOrder },\n { op: 'set', path: ['skillsDirs'], value: fieldsRef.current.skillsDirs },\n { op: 'set', path: ['skillRankBase'], value: fieldsRef.current.skillRankBase },\n { op: 'set', path: ['residentAgentsPath'], value: fieldsRef.current.residentAgentsPath },\n { op: 'set', path: ['presetDir'], value: fieldsRef.current.presetDir },\n { op: 'set', path: ['presetOrder'], value: fieldsRef.current.presetOrder },\n { op: 'set', path: ['fallbackText'], value: fieldsRef.current.fallbackText },\n { op: 'set', path: ['writeAgents'], value: fieldsRef.current.writeAgents },\n { op: 'set', path: ['writePreset'], value: fieldsRef.current.writePreset },\n ],\n undefined,\n () => {\n setSavedSwitches(savedSnapshot)\n onSaved?.()\n },\n )\n }, [enqueueSave])\n\n /** 参数类设置:写入激活预设 preset.yml(savePresetParams;随预设隔离)。\n * 保存进独立队列;请求成功只把「发起时快照」标记为已保存。若用户在请求期间\n * 继续编辑,则跳过静默重载,避免磁盘旧快照覆盖未保存草稿。 */\n const persistParamOverrides = useCallback(async () => {\n const run = async (): Promise<void> => {\n const f = fieldsRef.current\n const savedSnapshot = snapshotSwitches(f)\n const splitList = (value: string): string[] => value.split(',').map((item) => item.trim()).filter((item) => item.length > 0)\n const loadedKeys = loadedKeysRef.current\n // 条件发送:preset.yml 已有该键(含模板默认键)或字段值 != UI 默认 -> 发送;\n // 未动过的键不写--既保留「改回留空清旧值」(已有键总是发送空值删键),\n // 又避免 UI 默认值固化覆盖模板 moduleConfigs 默认(liangshen promoteGate=true\n // 等被首次保存的 false 静默改写--参数桥优先后的回归)。\n const emit = (key: string, value: unknown, empty: unknown): Record<string, unknown> =>\n loadedKeys.has(key) || !deepEqual(value, empty) ? { [key]: value } : {}\n // provider 自动预选只是显示兜底:preset 未声明且模型名为空时不落盘。\n const providerShouldPersist = (key: 'modelProvider' | 'subagentModelProvider', value: string, auto: string | undefined, modelName: string): boolean =>\n loadedKeys.has(key) || modelName.length > 0 || value !== auto\n const overrides: Record<string, unknown> = {\n ...emit('firstTurnAnchor', f.firstTurnAnchor, false),\n ...emit('firstTurnText', f.firstTurnText, ''),\n ...emit('firstTurnCustom', f.firstTurnCustom, false),\n ...emit('guideText', f.guideText, ''),\n ...emit('guideCustom', f.guideCustom, false),\n ...emit('guideEnabled', f.guideEnabled, undefined),\n ...emit('usePtcMode', f.usePtcMode, false),\n ...emit('injectPrompt', f.injectPrompt, true),\n ...emit('modelProvider', f.modelProvider, ''),\n ...emit('modelName', f.modelName, ''),\n ...emit('subagentModelProvider', f.subagentModelProvider, ''),\n ...emit('subagentModelName', f.subagentModelName, ''),\n ...emit('modelReasoningEffort', f.modelReasoningEffort, ''),\n ...emit('modelTemperature', f.modelTemperature, ''),\n ...emit('modelMaxTokens', f.modelMaxTokens, ''),\n ...emit('subagentReasoningEffort', f.subagentReasoningEffort, ''),\n ...emit('subagentTemperature', f.subagentTemperature, ''),\n ...emit('subagentMaxTokens', f.subagentMaxTokens, ''),\n ...emit('toolFilterAllow', splitList(f.toolFilterAllow), []),\n ...emit('toolFilterDeny', splitList(f.toolFilterDeny), []),\n ...emit('toolFilterSubagents', f.toolFilterSubagents, false),\n ...emit('maxDepth', f.maxDepth === '' ? '' : f.maxDepth === 'provider-managed' ? 'provider-managed' : Number(f.maxDepth), ''),\n ...emit('allowKinds', splitList(f.allowKinds), []),\n ...emit('firstTurnWord', f.firstTurnWord, ''),\n ...emit('bootstrapMaxTokens', f.bootstrapMaxTokens, 0),\n // 晋升门控/渐进披露/验证工具:已有键或已改动才发送;空值由 savePresetParams\n // 删键回落模板/引擎默认;false/0 引擎布尔归一或默认等价。\n ...emit('promoteGate', f.promoteGate, false),\n ...emit('promoteAfterFirstResponse', f.promoteAfterFirstResponse, false),\n ...emit('maxPromoteSteps', f.maxPromoteSteps, 0),\n ...emit('bootstrapTools', splitList(f.bootstrapTools), []),\n ...emit('compactionTools', splitList(f.compactionTools), []),\n ...emit('stages', f.stages\n .map((stage) => ({\n name: stage.name.trim(),\n tools: splitList(stage.tools),\n }))\n .filter((stage) => stage.name.length > 0 && stage.tools.length > 0), []),\n // 未设置 = 1(引擎默认);0 是合法档位,必须能发送并落盘。\n ...emit('stagePreUnlock', f.stagePreUnlock, 1),\n ...emit('stageAdvanceTool', f.stageAdvanceTool, ''),\n ...emit('stageAdvanceDescription', f.stageAdvanceDescription, ''),\n ...emit('stageSectionTemplate', f.stageSectionTemplate, ''),\n ...emit('personaSectionsOnly', f.personaSectionsOnly, false),\n ...emit('workspaceLine', f.workspaceLine, false),\n ...emit('phase1FirstCallInstruction', f.phase1FirstCallInstruction, ''),\n ...emit('instructionHint', f.instructionHint, false),\n // context-gate 注入门控。\n ...emit('messageSources', splitList(f.messageSources), []),\n ...emit('deferredSources', splitList(f.deferredSources), []),\n ...emit('deferredGraceSteps', f.deferredGraceSteps, 0),\n // 锚定/深思可选模块:已有键或已改动才发送;false/0 引擎布尔归一或默认等价。\n ...emit('anchorTurn', f.anchorTurn, false),\n ...emit('anchorTurnText', f.anchorTurnText, ''),\n ...emit('deliberationGate', f.deliberationGate, false),\n ...emit('deliberationMinChars', f.deliberationMinChars, 0),\n ...emit('deliberationMaxGatesPerTurn', f.deliberationMaxGatesPerTurn, 0),\n ...emit('cotDrip', f.cotDrip, false),\n ...emit('cotDripEvery', f.cotDripEvery, 0),\n ...emit('cotDripMaxPerTurn', f.cotDripMaxPerTurn, 0),\n ...emit('strReplaceEditorMaxOutputChars', f.strReplaceEditorMaxOutputChars, 16000),\n }\n // 自动预选 provider 不落盘:从条件发送结果中剔除,除非用户改选或填写模型名。\n if (!providerShouldPersist('modelProvider', f.modelProvider, autoModelProviderRef.current, f.modelName)) delete overrides.modelProvider\n if (!providerShouldPersist('subagentModelProvider', f.subagentModelProvider, autoSubagentModelProviderRef.current, f.subagentModelName)) delete overrides.subagentModelProvider\n const res = await bridgePost<{ overrides: unknown }>('/param-overrides', { overrides })\n if (res.ok) {\n // 只标记发起时快照;若期间有新编辑,当前 fields 仍保持 dirty。\n setSavedSwitches(savedSnapshot)\n const currentSnapshot = snapshotSwitches(fieldsRef.current)\n if (switchesEqual(currentSnapshot, savedSnapshot)) {\n // 参数已写激活预设 preset.yml:服务端重建后刷新(模型参数配置等随预设变化)。\n void load({ silent: true })\n }\n } else {\n showNotice('error', '参数保存失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n paramSaveQueueRef.current = paramSaveQueueRef.current.then(run).catch(() => {})\n await paramSaveQueueRef.current\n }, [load, showNotice])\n\n /** 保存后是否静默重载。切换预设时传 false(随后的 settings.mutate 回调会统一 load,\n * 避免一次切换触发两次全量读取)。 */\n const persistConfigs = useCallback((configs: PromptConfigDraft[], options?: { reload?: boolean; rebuild?: boolean }): Promise<void> => {\n const contentEntries = configs.filter(isContentAsset)\n return (async () => {\n // 内容资产:text 先写生成目录文件。合并为单次 /import-preset(批量载荷),\n // 服务端只触发一次重建——此前逐条请求每条各重建一次(多次写盘+recomposition)。\n if (contentEntries.length > 0) {\n const contents = contentEntries.map((config) => ({\n scope: config.id === 'prompt-injector' ? 'preset' as const : 'agents' as const,\n content: config.text ?? '',\n }))\n const res = await bridgePost<{ scopes: Array<'preset' | 'agents'> }>('/import-preset', { contents })\n if (!res.ok) {\n showNotice('error', 'preset.md/agents.md 保存失败:' + (res.message ?? 'settings bridge unavailable'))\n return\n }\n }\n // promptConfigs 按预设存储:写激活预设 preset.yml(settings 不再承载)。\n // 防御:空数组(且无内容资产)绝不覆盖服务端 promptConfigs——历史教训是\n // 初始化期的空数组自动保存把 beta-2-42 的 129 张配置卡一次清空。\n if (configs.length === 0) return\n const res = await bridgePost<{ promptConfigs: unknown }>('/param-overrides', {\n promptConfigs: configs.map(stripContentText),\n ...(options?.rebuild === false ? { rebuild: false } : {}),\n })\n if (res.ok) {\n setSavedConfigs(configs)\n if (options?.reload !== false) void load({ silent: true })\n } else {\n showNotice('error', '提示词配置保存失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n })()\n }, [load, showNotice])\n\n /** 模板变量:写激活预设 preset.yml 内容变量(后端 savePresetParams + afterOverridesChange 触发重建)。 */\n const saveTemplateVariables = useCallback(async (next?: Record<string, string>) => {\n // 空 key 行(待编辑)不落盘;本地同步清理保持显示一致。\n const cleaned = Object.fromEntries(\n Object.entries(next ?? templateVariables).filter(([key]) => key.trim().length > 0),\n )\n const res = await bridgePost<{ variables: unknown }>('/preset-variables', {\n variables: cleaned,\n enabled: templateVariablesEnabled,\n })\n if (!res.ok) {\n showNotice('error', `模板变量保存失败:${res.message ?? '未知错误'}`)\n return\n }\n setTemplateVariables(cleaned)\n }, [templateVariables, templateVariablesEnabled, showNotice])\n\n const toggle = useCallback((key: SwitchKey) => {\n patch({ [key]: !fieldsRef.current[key] })\n if (PARAM_SWITCH_KEYS.has(key)) void persistParamOverrides()\n // writePreset 关闭/开启会重建或移除生成目录:保存后必须重新加载,\n // 否则模块卡片仍显示旧配置(不刷新)。\n else if (key === 'writePreset') persistSwitches(() => { void load({ silent: true }) })\n else persistSwitches()\n }, [patch, persistParamOverrides, persistSwitches, load])\n\n const toggleBootstrapMaxTokens = useCallback(() => {\n const next = fieldsRef.current.bootstrapMaxTokens > 0 ? 0 : 256000\n patch({ bootstrapMaxTokens: next })\n setBootstrapTokensDraft(DEFAULT_BOOTSTRAP_DISPLAY)\n void persistParamOverrides()\n }, [patch, persistParamOverrides])\n\n const setPresetTemplate = useCallback(async (id: string) => {\n if (fieldsRef.current.presetTemplate === id) return\n // 切换即保存:模块列表有未保存的提示词配置修改时先提交(写当前激活预设),\n // 避免切换后 load() 重置 fields 丢失修改。已保存/无修改则直接切换。\n const dirtyConfigs = promptConfigsDirty(fieldsRef.current.promptConfigs, savedConfigs)\n if (dirtyConfigs) {\n // 免双 load:保存成功后由下方 enqueueSave 的 onSaved 统一静默重载。\n // 切换前只落盘当前预设,不重建;settings 切换后目标预设只重建一次。\n await persistConfigs(fieldsRef.current.promptConfigs, { reload: false, rebuild: false })\n }\n const switchResult = await api.switchPreset(id)\n patch({ presetTemplate: id })\n enqueueSave(\n [{ op: 'set', path: ['presetTemplate'], value: id }],\n switchResult.applied\n ? `已切换预设模板:${id}(当前空会话已重组)`\n : `已切换默认预设模板:${id}`,\n () => {\n void load({ silent: true })\n if (switchResult.message !== undefined) {\n showNotice('error', switchResult.message)\n }\n },\n )\n }, [enqueueSave, load, patch, persistConfigs, savedConfigs])\n\n const commitBootstrapTokensDraft = useCallback(() => {\n const parsed = Number(bootstrapTokensDraft)\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n setBootstrapTokensDraft(DEFAULT_BOOTSTRAP_DISPLAY)\n patch({ bootstrapMaxTokens: 256000 })\n } else {\n patch({ bootstrapMaxTokens: parsed })\n }\n void persistParamOverrides()\n }, [bootstrapTokensDraft, patch, persistParamOverrides])\n\n /** 门控回退步数提交:0 = 引擎默认 4(不写 params)。 */\n const commitGateStepsDraft = useCallback(() => {\n const parsed = Number(gateStepsDraft)\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n setGateStepsDraft(String(fieldsRef.current.maxPromoteSteps > 0 ? fieldsRef.current.maxPromoteSteps : 4))\n return\n }\n patch({ maxPromoteSteps: parsed })\n setGateStepsDraft(String(parsed))\n void persistParamOverrides()\n }, [gateStepsDraft, patch, persistParamOverrides])\n\n const addSkillsDir = useCallback((dir: string) => {\n const next = dir.trim()\n if (next.length === 0) return\n const current = fieldsRef.current.skillsDirs\n if (current.includes(next)) {\n showNotice('error', '该目录已在列表中')\n return\n }\n const dirs = [...current, next]\n patch({ skillsDirs: dirs })\n enqueueSave(\n [{ op: 'set', path: ['skillsDirs'], value: dirs }],\n `技能目录已添加:${next}`,\n () => {\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\n void load({ silent: true })\n },\n setSavingSkillsDir,\n )\n }, [enqueueSave, load, patch, showNotice])\n\n const removeSkillsDir = useCallback((dir: string) => {\n const dirs = fieldsRef.current.skillsDirs.filter((item) => item !== dir)\n patch({ skillsDirs: dirs })\n enqueueSave(\n [{ op: 'set', path: ['skillsDirs'], value: dirs }],\n `已移除技能目录引用:${dir}`,\n () => {\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\n void load({ silent: true })\n },\n setSavingSkillsDir,\n )\n }, [enqueueSave, load, patch, showNotice])\n\n const skillEnabled = useCallback((folder: string) => fieldsRef.current.skillSwitches[folder] !== false, [])\n\n const toggleSkill = useCallback((folder: string) => {\n const enabled = fieldsRef.current.skillSwitches[folder] !== false\n patch({ skillSwitches: { ...fieldsRef.current.skillSwitches, [folder]: !enabled } })\n persistSwitches()\n }, [patch, persistSwitches])\n\n interface SkillFixValue {\n folder: string\n fixedFolder: string\n name: string\n actions: string[]\n }\n const fixSkill = useCallback(async (folder: string) => {\n setFixingSkill(folder)\n try {\n const res = await bridgePost<SkillFixValue>('/skill-fix', { folder })\n if (res.ok) {\n showNotice('ok', `已修复技能 ${res.value.folder} → ${res.value.fixedFolder}:${res.value.actions.join(';') || '无需改动'}`)\n await load()\n } else {\n showNotice('error', '一键修复失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } catch (error) {\n showNotice('error', '一键修复失败:' + errorMessage(error))\n } finally {\n setFixingSkill(undefined)\n }\n }, [load, showNotice])\n\n const openSkillsDir = useCallback(async (path?: string) => {\n const target = path ?? fieldsRef.current.activeSkillsDirs[0] ?? ''\n if (!target) { showNotice('error', '技能目录路径未知,请先重新读取配置'); return }\n try {\n await api.openPath(target)\n showNotice('ok', '已打开技能目录:' + target)\n } catch (error) {\n showNotice('error', '打开失败:' + errorMessage(error))\n }\n }, [api, showNotice])\n\n const currentSwitches = snapshotSwitches(fields)\n const dirtySwitches = !switchesEqual(currentSwitches, savedSwitches)\n const dirtyConfigs = promptConfigsDirty(fields.promptConfigs, savedConfigs)\n const dirty = dirtySwitches || dirtyConfigs\n\n // 任意 UI 修改自动保存:模块列表的提示词配置修改(顶端总开关/卡片字段/增删/排序,\n // 全部经 patch({ promptConfigs }) 落 fields)debounce 后统一走 persistConfigs——\n // 与手动「保存」共用同一写盘逻辑(跳过校验:编辑中间态直存,后端容错;\n // 手动保存按钮仍保留校验路径)。保存成功 load() 更新 savedConfigs → dirty 消失自愈。\n useEffect(() => {\n if (!dirtyConfigs) return\n const timer = setTimeout(() => { void persistConfigs(fields.promptConfigs) }, 800)\n return () => clearTimeout(timer)\n }, [dirtyConfigs, fields.promptConfigs, persistConfigs])\n\n // 返回引用稳定化:memo 子组件以 props.store 同一性跳过父级重渲染(订阅式 selector\n // 化依赖稳定 store 引用);每次渲染重建内容对象但复用 ref 外壳。\n const storeRef = useRef<PromptToolStore>()\n storeRef.current = {\n fields,\n getFields,\n subscribeFields,\n meta,\n loading,\n providers,\n modelCatalog,\n hostDefaultModel,\n bootstrapTokensDraft,\n skillsDirDraft,\n templatePreStepCount,\n savedSwitches,\n savedConfigs,\n savingSkillsDir,\n fixingSkill,\n notice,\n noticeKind,\n load,\n showNotice,\n patch,\n persistSwitches,\n persistParamOverrides,\n persistConfigs,\n templateVariables,\n setTemplateVariables,\n templateVariablesEnabled,\n setTemplateVariablesEnabled,\n saveTemplateVariables,\n toggle,\n toggleBootstrapMaxTokens,\n setPresetTemplate,\n setBootstrapTokensDraft,\n commitBootstrapTokensDraft,\n gateStepsDraft,\n setGateStepsDraft,\n commitGateStepsDraft,\n setSkillsDirDraft,\n addSkillsDir,\n removeSkillsDir,\n toggleSkill,\n skillEnabled,\n fixSkill,\n openSkillsDir,\n dirtySwitches,\n dirtyConfigs,\n dirty,\n }\n return storeRef.current\n}\n","/** textarea 随内容自适应高度(field-sizing 的 JS 兜底:不支持的内核手动调整)。 */\nimport type { ChangeEvent } from 'react'\n\nexport function autoResizeTextarea(event: ChangeEvent<HTMLTextAreaElement>): void {\n const el = event.currentTarget\n if (typeof CSS !== 'undefined' && typeof CSS.supports === 'function' && CSS.supports('field-sizing', 'content')) return\n el.style.height = 'auto'\n el.style.height = `${el.scrollHeight}px`\n}\n","/** 标签输入:chip 增删 + 回车/逗号添加;底层仍为逗号分隔字符串,零数据层改动。 */\nimport { useState, type ReactNode } from 'react'\nimport styles from './PromptUi.module.css'\n\nexport function TagInput(props: {\n id: string\n label: string\n hint: string\n value: string\n placeholder?: string\n disabled?: boolean\n onChange: (value: string) => void\n onCommit: () => void\n}): ReactNode {\n const { id, label, hint, value, placeholder, disabled, onChange, onCommit } = props\n const [draft, setDraft] = useState('')\n const tags = value.split(',').map((tag) => tag.trim()).filter((tag) => tag.length > 0)\n\n const commitDraft = () => {\n const next = draft.trim()\n setDraft('')\n if (next.length === 0 || tags.includes(next)) return\n onChange([...tags, next].join(', '))\n onCommit()\n }\n\n const remove = (tag: string) => {\n onChange(tags.filter((item) => item !== tag).join(', '))\n onCommit()\n }\n\n return (\n <div className={styles.rowGroup}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}><strong>{label}</strong><small>{hint}</small></span>\n <div className={styles.tagInput} data-disabled={disabled ? '' : undefined}>\n {tags.map((tag) => (\n <span key={tag} className={styles.tagChip}>\n {tag}\n {!disabled && (\n <button type=\"button\" className={styles.tagChipRemove} aria-label={`移除 ${tag}`} onClick={() => remove(tag)}>×</button>\n )}\n </span>\n ))}\n <input\n id={id}\n className={styles.tagInputField}\n value={draft}\n aria-label={label}\n placeholder={tags.length === 0 ? (placeholder ?? '输入后回车添加') : undefined}\n disabled={disabled}\n spellCheck={false}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault()\n commitDraft()\n } else if (event.key === 'Backspace' && draft.length === 0 && tags.length > 0) {\n remove(tags[tags.length - 1]!)\n }\n }}\n onBlur={commitDraft}\n />\n </div>\n </div>\n </div>\n )\n}\n","/**\n * 单条提示词配置卡片 + 编辑表单(独立文件:\n * 打破 PromptConfigsEditor ⇄ PromptConfigList 的循环 import)。\n */\nimport { cloneElement, isValidElement, memo, useEffect, useId, useMemo, useState, type ReactElement, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './PromptUi.module.css'\nimport { autoResizeTextarea } from './textarea-resize.ts'\nimport { TagInput } from './TagInput.tsx'\n\nimport type { EngineMeta, LayerFieldPolicy, PromptConfigDraft } from './prompt-tool-types.ts'\n\nexport type { PromptConfigDraft, LayerFieldPolicy } from './prompt-tool-types.ts'\n\n/** sourceKind / form 是少量固定语义值,用下拉选择;引擎不设枚举,因此额外保留当前值。 */\nexport const SOURCE_KINDS = ['', 'plugin', 'instruction-hint', 'skill-catalog', 'env-facts'] as const\nexport const SOURCE_FORMS = ['notice', 'hint', ''] as const\n\n/** audience 的 UI 中文标签:空值=公用(缺省,通用参数默认);main=仅主会话;subagent=仅子代理。 */\nexport const AUDIENCE_LABELS: Record<string, string> = { '': '公用(缺省)', main: '仅主会话', subagent: '仅子代理' }\n\n/** 从引擎 /meta 中读取某层的字段能力;未知层回退 pre-step。 */\nconst EMPTY_POLICY: LayerFieldPolicy = {\n position: false,\n dedupe: false,\n promotion: false,\n audience: false,\n modelScope: false,\n merge: false,\n order: false,\n role: false,\n placeholder: false,\n}\n\nexport function fieldPolicyFor(meta: EngineMeta, layer: string | undefined): LayerFieldPolicy {\n return meta.layerFieldPolicies[(layer ?? 'pre-step')] ?? EMPTY_POLICY\n}\n\nfunction selectOptions(options: readonly string[], value: string | undefined): Array<{ value: string; label: string }> {\n const current = value ?? ''\n const entries = options.map((item) => ({ value: item, label: item === '' ? '(默认)' : item }))\n if (current !== '' && !options.includes(current)) entries.push({ value: current, label: `${current}(当前值)` })\n return entries\n}\n\nexport function Field(props: { label: string; hint?: string; children: ReactNode }): ReactNode {\n const id = useId()\n return (\n <div className={styles.configField}>\n <label className={styles.configFieldLabel} htmlFor={id}>{props.label}</label>\n {isValidElement(props.children) ? cloneElement(props.children as ReactElement<{ id?: string }>, { id }) : props.children}\n {props.hint && <p className={styles.configFieldHint}>{props.hint}</p>}\n </div>\n )\n}\n\nfunction selectValue(options: readonly string[], value: string | undefined, fallback: string): string {\n return options.includes(value ?? '') ? value ?? fallback : fallback\n}\n\n/** JSON 对象文本域:解析失败只在本地标红,不污染草稿。 */\nexport function JsonField(props: { label: string; value: Record<string, unknown> | undefined; onChange: (value: Record<string, unknown> | undefined) => void }): ReactNode {\n const [text, setText] = useState(JSON.stringify(props.value ?? {}, null, 2))\n const [error, setError] = useState('')\n // 依赖序列化结果而非对象引用:父级 patch 会让 params 产生新引用(即使内容未变),\n // 旧写法会把用户未提交的编辑重置;引用不变时 useMemo 不再重复序列化。\n const serialized = useMemo(() => JSON.stringify(props.value ?? {}, null, 2), [props.value])\n useEffect(() => {\n setText(serialized)\n setError('')\n }, [serialized])\n const commit = () => {\n try {\n const parsed = JSON.parse(text) as unknown\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n setError('必须是 JSON 对象')\n return\n }\n props.onChange(parsed as Record<string, unknown>)\n setError('')\n } catch {\n setError('JSON 无效')\n }\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{props.label}{error && <span className={styles.configJsonError}> {error}</span>}</span>\n <textarea\n className={clsx(styles.configTextarea, styles.configJsonInput, error && styles.configInputError)}\n aria-label={props.label}\n value={text}\n spellCheck={false}\n onChange={(e) => { autoResizeTextarea(e); setText(e.target.value) }}\n onBlur={commit}\n />\n </span>\n )\n}\n\n/** 布尔开关行(params 结构化编辑用)。 */\nfunction ParamToggle(props: { label: string; hint?: string; checked: boolean; onChange: (checked: boolean) => void }): ReactNode {\n return (\n <label className={styles.configEnable} title={props.checked ? '点击关闭' : '点击开启'}>\n <span className={styles.configFieldLabel}>{props.label}</span>\n <input type=\"checkbox\" aria-label={props.label} checked={props.checked} onChange={(e) => props.onChange(e.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n {props.hint && <span className={styles.configFieldHint}>{props.hint}</span>}\n </label>\n )\n}\n\n/** params 文本域(结构化编辑用):失焦写入草稿 params。 */\nfunction ParamTextarea(props: { label: string; hint?: string; value: string; onChange: (value: string) => void }): ReactNode {\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{props.label}</span>\n <textarea\n className={styles.configTextarea}\n aria-label={props.label}\n value={props.value}\n spellCheck={false}\n onChange={(e) => { autoResizeTextarea(e); props.onChange(e.target.value) }}\n />\n {props.hint && <p className={styles.configFieldHint}>{props.hint}</p>}\n </span>\n )\n}\n\n/** params 单行文本域(结构化编辑用)。 */\nfunction ParamInput(props: { label: string; hint?: string; value: string; onChange: (value: string) => void }): ReactNode {\n return (\n <Field label={props.label} hint={props.hint}>\n <input className={styles.configInput} value={props.value} spellCheck={false} onChange={(e) => props.onChange(e.target.value)} />\n </Field>\n )\n}\n\n/**\n * 按 strategy 拆解 params 为结构化编辑框(替代裸 JSON):\n * first-turn-anchor → near-anchor 锚点参数(开关/锚文本/任务正则/引导句);\n * guide-auto → router-guide 每轮引导参数(开关/文本/复杂正则/强弱引导句);\n * custom-fallback → prompt-injector 锚定词(params.text 为运行时注入内容,不暴露编辑);\n * placeholder / instruction-hint → fill 模板参数(text/envKeys/limit/fields/providers/emptyBehavior/emptyText);\n * 无固定字段的策略回退 JSON 编辑(保留任意 params 能力)。\n */\nexport function StrategyParamsFields(props: { strategy: string; layer?: string; params: Record<string, unknown> | undefined; onPatch: (params: Record<string, unknown>) => void; id?: string }): ReactNode {\n const { strategy, layer, params, onPatch, id } = props\n const value = params ?? {}\n const str = (key: string): string => (typeof value[key] === 'string' ? value[key] as string : '')\n const bool = (key: string): boolean => value[key] === true\n const set = (key: string, next: unknown): void => onPatch({ ...value, [key]: next })\n if (layer === 'system-section') {\n // system-section 层参数:人设段开关(开 = sectionName=deployment:persona 官方 shadow;\n // 关 = 可选自定义段名,空则引擎回退 id 注册为普通段)、complete(独占 system prompt,\n // 预设内互斥)、suppressRuntimeContext(抑制动态快照)。\n const isPersona = str('sectionName') === 'deployment:persona' || str('sectionName') === 'persona'\n return (\n <>\n <ParamToggle label=\"人设段\" hint=\"开启 = 注册为全局 persona(sectionName=deployment:persona,同名 shadow;触发人设徽标/相位先行/子代理继承)\"\n checked={isPersona}\n onChange={(next) => set('sectionName', next ? 'deployment:persona' : '')} />\n {!isPersona && (\n <ParamInput label=\"sectionName(自定义注册段名)\" hint=\"可选;空 = 引擎回退用 id 注册为普通段。同名段会 shadow 合并/覆盖官方段。\" value={str('sectionName')} onChange={(next) => set('sectionName', next)} />\n )}\n <ParamToggle label=\"complete(独占 system prompt)\" hint=\"开启后 assembly 只保留本段;预设内互斥(多个 complete 官方 fail loud)\"\n checked={bool('complete')} onChange={(next) => set('complete', next)} />\n <ParamToggle label=\"suppressRuntimeContext(抑制动态上下文)\" hint=\"等价官方 dsh-persona includeRuntimeContext:false\"\n checked={bool('suppressRuntimeContext')} onChange={(next) => set('suppressRuntimeContext', next)} />\n </>\n )\n }\n if (strategy === 'first-turn-anchor') {\n // writePreset 按 id 把顶层 params(firstTurnCustom/firstTurnText/…)统一写入\n // 这两个模板配置的 params——这里的编辑会被重建覆盖,隐藏以避免假入口。\n const managed = id === 'near-anchor'\n return (\n <>\n {managed && (\n <p className={styles.configFieldHint}>锚定开关与文本由设置页「锚定」管理(writePreset 重建时统一写入本配置),此处编辑会被覆盖。</p>\n )}\n {!managed && (\n <>\n <ParamToggle label=\"useCustom(自定义锚文本)\" hint=\"true = 固定使用 text;false = 按 buildPattern/complexPattern 自动选择引导句\"\n checked={bool('useCustom')} onChange={(next) => set('useCustom', next)} />\n <ParamTextarea label=\"text(自定义锚文本)\" hint=\"useCustom=true 时固定注入\" value={str('text')} onChange={(next) => set('text', next)} />\n <ParamInput label=\"buildPattern(构建任务正则)\" hint=\"命中即用 firstTurnBuild 引导句\" value={str('buildPattern')} onChange={(next) => set('buildPattern', next)} />\n <ParamInput label=\"complexPattern(复杂任务正则)\" hint=\"命中即用 firstTurnDeep 引导句\" value={str('complexPattern')} onChange={(next) => set('complexPattern', next)} />\n <ParamTextarea label=\"firstTurnBuild(构建引导句)\" value={str('firstTurnBuild')} onChange={(next) => set('firstTurnBuild', next)} />\n <ParamTextarea label=\"firstTurnInspect(排查引导句)\" value={str('firstTurnInspect')} onChange={(next) => set('firstTurnInspect', next)} />\n <ParamTextarea label=\"firstTurnDeep(复杂设计引导句)\" value={str('firstTurnDeep')} onChange={(next) => set('firstTurnDeep', next)} />\n </>\n )}\n </>\n )\n }\n if (strategy === 'guide-auto') {\n const managed = id === 'router-guide'\n return (\n <>\n {managed && (\n <p className={styles.configFieldHint}>引导开关与文本由设置页「引导」管理(writePreset 重建时统一写入本配置),此处编辑会被覆盖。</p>\n )}\n {!managed && (\n <>\n <ParamToggle label=\"useCustom(自定义每轮引导)\" hint=\"true = 固定使用 text;false = 按任务自动选择强弱引导\"\n checked={bool('useCustom')} onChange={(next) => set('useCustom', next)} />\n <ParamTextarea label=\"text(自定义引导文本)\" hint=\"useCustom=true 时固定注入\" value={str('text')} onChange={(next) => set('text', next)} />\n <p className={styles.configFieldHint}>复杂任务判定复用锚定卡的 complexPattern(引导 fallback 共用分类器)。</p>\n <ParamTextarea label=\"guideWeak(简单任务自动引导)\" value={str('guideWeak')} onChange={(next) => set('guideWeak', next)} />\n <ParamTextarea label=\"guideDeep(复杂任务自动引导)\" value={str('guideDeep')} onChange={(next) => set('guideDeep', next)} />\n </>\n )}\n </>\n )\n }\n if (strategy === 'custom-fallback') {\n return (\n <>\n <ParamInput label=\"firstTurnWord(锚定词)\" hint=\"晋升后首个 reasoning 命中该词即注入;任意自定义文本\"\n value={str('firstTurnWord')} onChange={(next) => set('firstTurnWord', next)} />\n </>\n )\n }\n if (strategy === 'world-book') {\n const keyId = useId()\n const list = (key: string): string => Array.isArray(value[key])\n ? (value[key] as unknown[]).map(String).join(', ') : str(key)\n const setList = (key: string, next: string): void => set(key, next.split(',').map((item) => item.trim()).filter((item) => item.length > 0))\n return (\n <>\n <ParamToggle label=\"constant(常驻注入)\" hint=\"true = 不依赖关键字,每轮恒注入;false = 命中 keys 才注入\"\n checked={bool('constant')} onChange={(next) => set('constant', next)} />\n <TagInput id={`${keyId}-keys`} label=\"keys(触发关键字)\" hint=\"命中消息文本中的任一关键字即注入;逗号分隔\" onCommit={() => {}}\n value={list('keys')} placeholder=\"关键字,回车添加\" onChange={(next) => setList('keys', next)} />\n <TagInput id={`${keyId}-secondary-keys`} label=\"secondaryKeys(次级关键字)\" hint=\"与 keys 合并匹配(任一命中即注入);逗号分隔\" onCommit={() => {}}\n value={list('secondaryKeys')} placeholder=\"次级关键字,回车添加\" onChange={(next) => setList('secondaryKeys', next)} />\n <ParamToggle label=\"caseSensitive(区分大小写)\" hint=\"true = 关键字精确大小写匹配\"\n checked={bool('caseSensitive')} onChange={(next) => set('caseSensitive', next)} />\n <ParamToggle label=\"wholeWords(整词匹配)\" hint=\"true = 关键字必须整词出现(词边界),false = 子串包含即命中\"\n checked={bool('wholeWords')} onChange={(next) => set('wholeWords', next)} />\n <ParamToggle label=\"useRegex(键为正则)\" hint=\"true = keys / secondaryKeys 按正则表达式匹配(作者负责合法性)\"\n checked={bool('useRegex')} onChange={(next) => set('useRegex', next)} />\n <OptionField\n label=\"selectiveLogic(触发逻辑)\"\n hint=\"ST world_info_logic:0 = 主/副键任一命中;3 = 副键全中才注入;1 = 副键全不中才注入;2 = 至少一个副键未中才注入\"\n value={value['selectiveLogic'] !== undefined ? String(value['selectiveLogic']) : '0'}\n options={['0', '1', '2', '3']}\n fallback=\"0\"\n labels={{\n '0': '0 · 任一命中(默认)',\n '1': '1 · 副键全排除',\n '2': '2 · 部分排除',\n '3': '3 · 副键全包含',\n }}\n onChange={(next) => set('selectiveLogic', Number(next))}\n />\n </>\n )\n }\n if (strategy === 'placeholder' || strategy === 'instruction-hint') {\n return (\n <>\n <ParamTextarea label=\"text(自定义提示文本)\" hint=\"覆盖文件与动态探测的提示文本;留空 = 默认\"\n value={str('text')} onChange={(next) => set('text', next)} />\n <ParamInput label=\"envKeys(env-facts 环境变量白名单)\" hint=\"逗号分隔;留空 = 默认 DSH_HOME,DSH_WORKSPACE\"\n value={str('envKeys')} onChange={(next) => set('envKeys', next)} />\n <ParamInput label=\"limit(skill-catalog 数量上限)\" hint=\"正整数;留空 = 不限制\"\n value={str('limit')} onChange={(next) => set('limit', next === '' ? '' : Number(next))} />\n <ParamInput label=\"fields(skill-catalog 字段)\" hint=\"逗号分隔;默认 name,description\"\n value={str('fields')} onChange={(next) => set('fields', next)} />\n <ParamInput label=\"providers(skill-catalog provider 白名单)\" hint=\"逗号分隔;留空 = 全部\"\n value={str('providers')} onChange={(next) => set('providers', next)} />\n <OptionField label=\"emptyBehavior(空结果行为)\" hint=\"skip = 不注入;text = 注入 emptyText\"\n value={str('emptyBehavior')} options={['skip', 'text']} fallback=\"skip\" onChange={(next) => set('emptyBehavior', next)} />\n <ParamTextarea label=\"emptyText(空结果提示文本)\" value={str('emptyText')} onChange={(next) => set('emptyText', next)} />\n </>\n )\n }\n // 无策略参数的配置(static 等):预设级内容变量已展开进 variables(官方插值\n // 机制,由上方 VariablesEditor 结构化编辑),params 为空时不再渲染 JSON 框。\n if (Object.keys(value).length === 0) {\n return <p className={styles.configFieldHint}>本策略无高级参数;模板变量见上方「variables」。</p>\n }\n return <JsonField label=\"params(高级参数 JSON;本策略无固定字段)\" value={value} onChange={(next) => { if (next !== undefined) onPatch(next) }} />\n}\n\n/** 模板变量键值对编辑器(替代 JSON):每行 key + value,可增删。工作台「模板变量」卡片复用。 */\nexport function VariablesEditor(props: { value: Record<string, string> | undefined; onChange: (value: Record<string, string> | undefined) => void }): ReactNode {\n const entries = Object.entries(props.value ?? {})\n const commit = (next: Array<[string, string]>) => {\n // 保留空 key 行(「添加变量」新增的待编辑行);空 key 由保存端(savePresetParams)\n // 统一清理,避免新增行被立即过滤导致按钮失效。\n props.onChange(next.length > 0 ? Object.fromEntries(next) : undefined)\n }\n const setEntry = (index: number, key: string, value: string) => {\n commit(entries.map((entry, at): [string, string] => at === index ? [key, value] : entry))\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{'variables(模板变量 {{key}} 插值)'}</span>\n {entries.length === 0 && <p className={styles.configFieldHint}>{'无模板变量;下方添加键值对,注入文本中的 {{key}} 会被替换。'}</p>}\n {entries.map(([key, value], index) => (\n <span key={`${key}-${index}`} className={styles.variableRow}>\n <input className={styles.configInput} aria-label=\"模板变量名\" value={key} spellCheck={false} placeholder=\"变量名\"\n onChange={(e) => setEntry(index, e.target.value, value)} />\n <input className={styles.configInput} aria-label=\"模板变量值\" value={value} spellCheck={false} placeholder=\"变量值\"\n onChange={(e) => setEntry(index, key, e.target.value)} />\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={`删除变量 ${key || index}`}\n onClick={() => commit(entries.filter((_, at) => at !== index))}>删除</button>\n </span>\n ))}\n <span>\n <button type=\"button\" className={styles.pillButton} onClick={() => commit([...entries, ['', '']])}>添加</button>\n </span>\n </span>\n )\n}\n\n/** identity 结构化编辑(替代 JSON):field 下拉 + value 输入;value 留空 = 使用默认(等于配置 id)。 */\nfunction IdentityFields(props: { identity: { field: string; value: string } | undefined; onPatch: (identity: { field: string; value: string } | undefined) => void }): ReactNode {\n const field = props.identity?.field ?? 'plugin'\n const value = props.identity?.value ?? ''\n return (\n <>\n <OptionField label=\"identity.field(幂等身份域)\" hint=\"plugin = 按插件 id 幂等;kind = 按注入类型\"\n value={field} options={['plugin', 'kind']} fallback=\"plugin\" onChange={(next) => props.onPatch({ field: next, value })} />\n <Field label=\"identity.value(幂等身份值)\" hint=\"留空 = 使用默认(等于配置 id)\">\n <input className={styles.configInput} value={value} spellCheck={false}\n onChange={(e) => props.onPatch(e.target.value.length > 0 ? { field, value: e.target.value } : undefined)} />\n </Field>\n </>\n )\n}\n\n/** 枚举下拉:值不在选项内时用回退值,保证表单始终可渲染。 */\nfunction OptionField(props: { label: string; hint?: string; value: string | undefined; options: readonly string[]; fallback: string; onChange: (value: string) => void; keepCurrent?: boolean; labels?: Record<string, string> }): ReactNode {\n const options = props.keepCurrent === true ? selectOptions(props.options, props.value) : props.options.map((item) => ({ value: item, label: item }))\n return (\n <Field label={props.label} hint={props.hint}>\n <select className={styles.configInput} value={selectValue(props.options, props.value, props.fallback)} onChange={(e) => props.onChange(e.target.value)}>\n {options.map((item) => <option key={item.value} value={item.value}>{props.labels?.[item.value] ?? item.label}</option>)}\n </select>\n </Field>\n )\n}\n\n/** 单条提示词配置表单:按注入层级的能力矩阵过滤字段,只显示本层生效的参数。 */\nexport function PromptConfigForm(props: {\n meta: EngineMeta\n config: PromptConfigDraft\n onPatch: (patch: Partial<PromptConfigDraft>) => void\n}): ReactNode {\n const { meta, config, onPatch } = props\n const policy = fieldPolicyFor(meta, config.layer)\n const strategy = config.strategy ?? 'static'\n const placeholder = strategy === 'placeholder' && policy.placeholder\n const fillOptions = ['', ...meta.fills]\n return (\n <div className={styles.configForm}>\n <div className={styles.configGrid}>\n <Field label=\"id(唯一,必填)\">\n <input className={styles.configInput} value={config.id} spellCheck={false} onChange={(e) => onPatch({ id: e.target.value })} />\n </Field>\n <Field label=\"name(显示名)\">\n <input className={styles.configInput} value={config.name ?? ''} spellCheck={false} onChange={(e) => onPatch({ name: e.target.value })} />\n </Field>\n <OptionField label=\"layer\" hint=\"注入层级;切换后下方字段按新层能力矩阵重新出现\" value={config.layer} options={meta.layers} fallback=\"pre-step\" onChange={(value) => onPatch({ layer: value })} />\n <OptionField label=\"strategy\" hint=\"内容策略;placeholder 需配合 fill\" value={config.strategy} options={meta.strategies} fallback=\"static\" onChange={(value) => onPatch({ strategy: value })} />\n <OptionField label=\"configKind\" hint=\"ordered 按 order 升序;anchor 固定文件序排最前\" value={config.configKind} options={meta.slotKinds} fallback=\"ordered\" onChange={(value) => onPatch({ configKind: value })} />\n {policy.role && <OptionField label=\"role\" hint=\"注入消息角色:user / assistant\" value={config.role} options={meta.roles} fallback=\"user\" onChange={(value) => onPatch({ role: value })} />}\n {policy.position && <OptionField label=\"position\" hint=\"同层拼接位置:after-user / before-all / after-all\" value={config.position} options={meta.positions} fallback=\"after-user\" onChange={(value) => onPatch({ position: value })} />}\n {policy.merge && <OptionField label=\"mergeMode\" hint=\"merged=同位置配置拼接为一条消息\" value={config.mergeMode} options={meta.mergeModes} fallback=\"separate\" onChange={(value) => onPatch({ mergeMode: value })} />}\n {policy.order && <Field label=\"order\" hint=\"本层排序:数值小者在前(与同层列表上下移动等价)\"><input className={styles.configInput} type=\"number\" step={1} value={config.order ?? 0} onChange={(e) => onPatch({ order: Number(e.target.value) })} /></Field>}\n <Field label=\"group\" hint=\"互斥组名:同 group 且 exclusive=true 时只执行排序后的第一个 enabled 配置\"><input className={styles.configInput} value={config.group ?? ''} spellCheck={false} onChange={(e) => onPatch({ group: e.target.value })} /></Field>\n <label className={styles.configEnable} title={config.exclusive === true ? '点击关闭互斥' : '点击开启互斥'}>\n <span className={styles.configFieldLabel}>exclusive</span>\n <input type=\"checkbox\" aria-label=\"exclusive\" checked={config.exclusive === true} onChange={(e) => onPatch({ exclusive: e.target.checked })} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n {policy.dedupe && <OptionField label=\"dedupe\" hint=\"session=每会话一次;batch=当前批去重\" value={config.dedupe} options={meta.dedupes} fallback=\"none\" onChange={(value) => onPatch({ dedupe: value })} />}\n {policy.promotion && <OptionField label=\"promotion\" hint=\"none=不要求晋升;main=主会话晋升;include-subagents=子代理跟随\" value={config.promotion} options={meta.promotions} fallback=\"none\" onChange={(value) => onPatch({ promotion: value })} />}\n {policy.audience && <OptionField label=\"消息受众\" hint=\"缺省(通用)=公用,主会话与子代理都注入;main=仅主会话;subagent=仅子代理(专用才标记)\" value={config.audience ?? undefined} options={['', ...meta.audienceModes]} fallback=\"\" labels={AUDIENCE_LABELS} onChange={(value) => onPatch(value === '' ? { audience: null } : { audience: value })} />}\n {policy.modelScope && <OptionField label=\"modelScope\" hint=\"all / pro / flash;flash 按模型名包含 flash 判定\" value={config.modelScope} options={meta.modelScopes} fallback=\"all\" onChange={(value) => onPatch({ modelScope: value })} />}\n {placeholder && <OptionField label=\"fill(placeholder 专用)\" hint=\"instruction-hint / env-facts / skill-catalog\" value={config.fill} options={fillOptions} fallback=\"\" onChange={(value) => onPatch({ fill: value || undefined })} />}\n <OptionField label=\"sourceKind\" hint=\"注入消息 source.kind;默认等于 id\" value={config.sourceKind} options={SOURCE_KINDS} fallback=\"\" keepCurrent onChange={(value) => onPatch({ sourceKind: value || undefined })} />\n <OptionField label=\"form\" hint=\"source.form;默认 notice,hint 用于指令提示\" value={config.form} options={SOURCE_FORMS} fallback=\"notice\" keepCurrent onChange={(value) => onPatch({ form: value || undefined })} />\n <Field label=\"summary\">\n <input className={styles.configInput} value={config.summary ?? ''} spellCheck={false} onChange={(e) => onPatch({ summary: e.target.value })} />\n </Field>\n <Field label=\"templateFile\">\n <input className={styles.configInput} value={config.templateFile ?? ''} spellCheck={false} onChange={(e) => onPatch({ templateFile: e.target.value })} />\n </Field>\n </div>\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{'内容(注入文本;空 = 不注入;变量 {{key}} 插值)'}</span>\n <textarea\n className={styles.configTextarea}\n aria-label=\"注入内容(空 = 不注入)\"\n value={[config.text ?? '', ...(config.texts ?? [])].filter((item) => item.length > 0).join('\\n')}\n spellCheck={false}\n onChange={(e) => {\n autoResizeTextarea(e)\n const next = e.target.value\n // 内容资产(prompt-injector / instruction-hint)走生成目录文件通道(text →\n // params.text);普通配置保存统一写 texts 单段整块(对齐官方 text 单字符串\n // 语义;text 字段兼容读取,编辑后归一)。\n if (config.id === 'prompt-injector' || config.fill === 'instruction-hint') {\n onPatch({ text: next, texts: [] })\n } else {\n onPatch({ text: undefined, texts: next.trim().length > 0 ? [next] : [] })\n }\n }}\n />\n </span>\n <VariablesEditor value={config.variables} onChange={(value) => onPatch({ variables: value })} />\n <StrategyParamsFields strategy={strategy} layer={config.layer} params={config.params} id={config.id} onPatch={(value) => onPatch({ params: value })} />\n <IdentityFields identity={config.identity} onPatch={(value) => onPatch({ identity: value })} />\n </div>\n )\n}\n\n/** 列表卡片(memo 化):props 全部为数据或稳定回调——config 引用变化才重渲染该卡,\n * 129 卡列表编辑/拖拽 hover 时不再整列表级联渲染。 */\nexport const PromptConfigCard = memo(function PromptConfigCard(props: {\n meta: EngineMeta\n config: PromptConfigDraft\n expanded: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n dragging?: boolean\n dropBefore?: boolean\n dropAfter?: boolean\n onToggleExpanded: (id: string) => void\n onToggleEnabled: (id: string, enabled: boolean) => void\n onPatch: (id: string, patch: Partial<PromptConfigDraft>) => void\n onMoveUp: (id: string) => void\n onMoveDown: (id: string) => void\n onDuplicate: (id: string) => void\n onDelete: (id: string) => void\n onDragStart?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDragOver?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDrop?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDragEnd?: () => void\n}): ReactNode {\n const { meta, config } = props\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const enabled = config.enabled !== false\n const policy = fieldPolicyFor(meta, config.layer)\n const chips = [config.layer ?? 'pre-step', config.strategy ?? 'static']\n if (config.fill) chips.push(config.fill)\n if (policy.position) chips.push(`pos=${config.position ?? 'after-user'}`)\n if (config.mergeMode === 'merged') chips.push('merged')\n if ((config.order ?? 0) !== 0) chips.push(`order=${config.order}`)\n if (config.group) chips.push(config.exclusive === true ? `exclusive:${config.group}` : `group:${config.group}`)\n return (\n <article\n className={clsx(styles.configCard, props.expanded && styles.configCardOpen)}\n data-dragging={props.dragging ? '' : undefined}\n data-drop-before={props.dropBefore ? '' : undefined}\n data-drop-after={props.dropAfter ? '' : undefined}\n onDragOver={props.onDragOver === undefined ? undefined : (event) => props.onDragOver!(config.id, event)}\n onDrop={props.onDrop === undefined ? undefined : (event) => props.onDrop!(config.id, event)}\n onDragEnd={props.onDragEnd}\n >\n <header className={styles.configHeader}>\n {props.onDragStart !== undefined && (\n <span\n className={styles.dragHandle}\n title=\"拖动调整顺序\"\n aria-hidden=\"true\"\n draggable\n onDragStart={(event) => props.onDragStart!(config.id, event)}\n >⠿</span>\n )}\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={() => props.onToggleExpanded(config.id)}>\n <span className={styles.configTitle}>\n <span className={styles.configTitleRow}>\n <span className={styles.configName}>{config.name && config.name !== config.id ? `${config.id} · ${config.name}` : config.id}</span>\n {config.layer === 'system-section' && config.params?.sectionName === 'deployment:persona' && (\n <span className={styles.configChip} title=\"deployment:persona 同名 shadow:主会话人设(子代理经 scope 链继承)\">人设</span>\n )}\n </span>\n <span className={styles.configMeta}>{chips.join(' · ')}</span>\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} title={enabled ? '点击关闭' : '点击启用'}>\n <input type=\"checkbox\" checked={enabled} aria-label={`启用 ${config.name ?? config.id}`} onChange={(e) => props.onToggleEnabled(config.id, e.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} disabled={!props.canMoveUp} onClick={() => props.onMoveUp(config.id)}>上移</button>\n <button type=\"button\" className={styles.pillButton} disabled={!props.canMoveDown} onClick={() => props.onMoveDown(config.id)}>下移</button>\n <button type=\"button\" className={styles.pillButton} onClick={() => props.onDuplicate(config.id)}>复制</button>\n {confirmingDelete ? (\n <>\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => props.onDelete(config.id)}>确认删除</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(false)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>删除</button>\n )}\n </span>\n </span>\n </header>\n {props.expanded && <PromptConfigForm meta={meta} config={config} onPatch={(patch) => props.onPatch(config.id, patch)} />}\n </article>\n )\n})\n","import { useCallback, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { bridgePost, errorMessage } from './prompt-tool-bridge.ts'\nimport { PromptConfigCard } from './PromptConfigCard.tsx'\nimport type { EngineMeta, PromptConfigDraft, ValidationErrorEntry } from './prompt-tool-types.ts'\nimport styles from './PromptUi.module.css'\n\ninterface ValidateResult {\n ok: boolean\n valid: boolean\n errors?: ValidationErrorEntry[]\n message?: string\n}\n\nexport interface PromptConfigListProps {\n meta: EngineMeta\n configs: PromptConfigDraft[]\n savedConfigs: PromptConfigDraft[]\n /** 传入 layer 时只展示该层配置;不传展示全部配置。 */\n layer?: string\n /** 传入 scope 时按 audience 作用域过滤:main = 非仅子代理(主会话可见);subagent = 非仅主会话(子代理可见;缺省公用两边都可见)。 */\n scope?: 'main' | 'subagent'\n /** 列表工具栏追加操作(如「新建模板」)。 */\n extraActions?: ReactNode\n /** 列表头部之后、配置卡片之前渲染的固定卡片(如模板变量——归类于配置列表下)。 */\n beforeCards?: ReactNode\n /** 受控层筛选(全部/世界书/层级);未传时内部 state 兜底(子代理页等独立实例)。 */\n viewFilter?: string\n onViewFilterChange?: (value: string) => void\n /** 空状态追加提示(如「当前预设模板该层无配置」)。 */\n emptyHint?: string\n onPatchConfigs: (configs: PromptConfigDraft[]) => void\n onSaveConfigs: (configs: PromptConfigDraft[]) => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n}\n\nconst layerOf = (config: PromptConfigDraft): string => config.layer ?? 'pre-step'\n\n/** 与列表一致的显示视图排序:按(层序, order, 声明序)稳定排序,返回排序后 id 序列。 */\nfunction viewOrderedIds(\n all: PromptConfigDraft[],\n layer: string | undefined,\n layers: readonly string[],\n): string[] {\n const layerRank = (config: PromptConfigDraft): number => {\n const index = layers.indexOf(layerOf(config))\n return index < 0 ? layers.length : index\n }\n return all\n .map((config, index) => ({ config, index }))\n .filter((entry) => layer === undefined || layerOf(entry.config) === layer)\n .sort((a, b) => {\n const byLayer = layerRank(a.config) - layerRank(b.config)\n if (byLayer !== 0) return byLayer\n const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0)\n if (byOrder !== 0) return byOrder\n return a.index - b.index\n })\n .map((entry) => entry.config.id)\n}\n\n/**\n * 在显示视图中向上/向下移动:目标 = 当前项的显示相邻项(层序/order/声明序),\n * 交换两者的 order 与数组位置——显示顺序与引擎注入顺序(数组序)同步变化。\n * 修复:此前按数组相邻交换,跨层配置混合时数组顺序 ≠ 显示顺序,上移/下移视觉失效。\n */\nfunction moveWithinLayer(\n all: PromptConfigDraft[],\n globalIndex: number,\n delta: -1 | 1,\n layer?: string,\n layers?: readonly string[],\n): PromptConfigDraft[] {\n const currentId = all[globalIndex]?.id\n if (currentId === undefined) return all\n const view = viewOrderedIds(all, layer, layers ?? [])\n const viewIndex = view.indexOf(currentId)\n const targetViewIndex = viewIndex + delta\n if (viewIndex < 0 || targetViewIndex < 0 || targetViewIndex >= view.length) return all\n const targetId = view[targetViewIndex]!\n const currentIndex = all.findIndex((config) => config.id === currentId)\n const targetIndex = all.findIndex((config) => config.id === targetId)\n if (currentIndex < 0 || targetIndex < 0) return all\n const next = [...all]\n const current = next[currentIndex]\n const targetCard = next[targetIndex]\n // 引擎按 order 升序渲染(executor pre-step / layers 同规则):层内移动必须同步\n // 交换 order,否则拖拽后实际注入顺序不变(显示与引擎脱节 = 排序混乱)。\n if (current === undefined || targetCard === undefined) return all\n next[currentIndex] = { ...targetCard, order: current.order ?? 0 }\n next[targetIndex] = { ...current, order: targetCard.order ?? 0 }\n return next\n}\n\n/** 拖拽移动到目标显示位置:把 source 移到 target 前/后,用显示视图相邻交换逐步到位\n * (order 链式交换,与连续点击上移/下移等价)。 */\nfunction moveToView(\n all: PromptConfigDraft[],\n sourceId: string,\n targetId: string,\n before: boolean,\n layer?: string,\n layers?: readonly string[],\n): PromptConfigDraft[] {\n const view = viewOrderedIds(all, layer, layers ?? [])\n const sourceIndex = view.indexOf(sourceId)\n if (sourceIndex < 0) return all\n const rest = view.filter((id) => id !== sourceId)\n const targetIndex = rest.indexOf(targetId)\n if (targetIndex < 0) return all\n const targetViewIndex = targetIndex + (before ? 0 : 1)\n if (targetViewIndex === sourceIndex) return all\n const steps = targetViewIndex - sourceIndex\n const delta: -1 | 1 = steps > 0 ? 1 : -1\n let current = all\n for (let step = 0; step < Math.abs(steps); step++) {\n const globalIndex = current.findIndex((config) => config.id === sourceId)\n if (globalIndex < 0) break\n current = moveWithinLayer(current, globalIndex, delta, layer, layers)\n }\n return current\n}\n\n/** 共享的提示词配置列表:校验、保存、脏检测、复制、删除、层内移动。 */\nexport function PromptConfigList(props: PromptConfigListProps): ReactNode {\n const { meta, configs, savedConfigs, layer, scope, extraActions, beforeCards, viewFilter: viewFilterProp, onViewFilterChange, emptyHint, onPatchConfigs, onSaveConfigs, onNotice } = props\n const [expanded, setExpanded] = useState<string | undefined>(undefined)\n const [errors, setErrors] = useState<ValidationErrorEntry[]>([])\n const [validating, setValidating] = useState(false)\n const [saving, setSaving] = useState(false)\n const [filter, setFilter] = useState('')\n /** 拖拽排序状态:源卡片 id + 落点(目标 id + 前/后)。 */\n const [dragId, setDragId] = useState<string | undefined>(undefined)\n const [dropTarget, setDropTarget] = useState<{ id: string; before: boolean } | undefined>(undefined)\n /** 合并过滤下拉:全部 / 世界书(策略)/ 各注入层级。外部 layer prop 传入时固定该层。 */\n const [innerViewFilter, setInnerViewFilter] = useState<string>('all')\n const viewFilter = viewFilterProp ?? innerViewFilter\n const changeViewFilter = (value: string): void => {\n if (onViewFilterChange !== undefined) onViewFilterChange(value)\n else setInnerViewFilter(value)\n }\n\n const effectiveLayer = layer ?? (viewFilter !== 'all' && viewFilter !== 'world-book' ? viewFilter : undefined)\n const visible = effectiveLayer === undefined\n ? configs\n : configs.filter((config) => layerOf(config) === effectiveLayer)\n const scoped = scope === undefined\n ? visible\n : visible.filter((config) => {\n const mode = config.audience\n return scope === 'main' ? mode !== 'subagent' : mode !== 'main'\n })\n const byStrategy = viewFilter !== 'world-book'\n ? scoped\n : scoped.filter((config) => config.strategy === 'world-book')\n const keyword = filter.trim().toLowerCase()\n const filtered = keyword.length === 0\n ? byStrategy\n : byStrategy.filter((config) =>\n [config.id, config.name ?? '', config.strategy ?? ''].join(' ').toLowerCase().includes(keyword))\n // 显示顺序 = 引擎注入顺序:按(层序, order, 声明序)稳定排序,跨层全量视图\n // 也一致;order 相同时保持数组原序(同值稳定)。\n const layerRank = (config: PromptConfigDraft): number => {\n const index = meta.layers.indexOf(layerOf(config))\n return index < 0 ? meta.layers.length : index\n }\n const ordered = filtered\n .map((config, index) => ({ config, index }))\n .sort((a, b) => {\n const byLayer = layerRank(a.config) - layerRank(b.config)\n if (byLayer !== 0) return byLayer\n const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0)\n if (byOrder !== 0) return byOrder\n return a.index - b.index\n })\n .map((entry) => entry.config)\n /** 按过滤后可见配置一次性启用/禁用(批量开关)。 */\n const batchSetEnabled = (enabled: boolean): void => {\n const visibleIds = new Set(ordered.map((config) => config.id))\n onPatchConfigs(configs.map((config) => visibleIds.has(config.id) ? { ...config, enabled } : config))\n }\n\n // patch 路径从不原地 mutate(均生成新数组),引用比较即可判断脏;省掉每次渲染全量序列化大数组。\n const dirty = configs !== savedConfigs\n\n const runValidate = async (target: PromptConfigDraft[]): Promise<boolean> => {\n setValidating(true)\n try {\n const res = await bridgePost<ValidateResult>('/configs-validate', { promptConfigs: target })\n if (!res.ok) {\n onNotice('error', '校验请求失败:' + (res.message ?? 'settings bridge unavailable'))\n return false\n }\n setErrors(res.value.valid ? [] : res.value.errors ?? [])\n return res.value.valid\n } catch (error) {\n onNotice('error', '校验请求失败:' + errorMessage(error))\n return false\n } finally {\n setValidating(false)\n }\n }\n\n const save = async () => {\n setSaving(true)\n const valid = await runValidate(configs)\n if (valid) {\n setErrors([])\n onSaveConfigs(configs)\n onNotice('ok', `已校验并保存(${configs.length} 条)`)\n }\n setSaving(false)\n }\n\n const discard = () => {\n onPatchConfigs(savedConfigs)\n setErrors([])\n setExpanded(undefined)\n }\n\n // 显示顺序(层序/order/声明序)一次计算:position map 供每张卡判断上移/下移,\n // 此前每张卡各自调 viewOrderedIds(O(n log n) × n)。\n const viewIds = useMemo(() => viewOrderedIds(configs, layer, meta.layers), [configs, layer, meta.layers])\n const positionOf = useMemo(() => new Map(viewIds.map((id, at) => [id, at])), [viewIds])\n\n /** 卡片稳定回调(memo 生效前提):经 liveRef 读最新列表状态,回调引用跨渲染不变。 */\n const liveRef = useRef({ configs, layer, metaLayers: meta.layers, dragId, dropTarget })\n liveRef.current = { configs, layer, metaLayers: meta.layers, dragId, dropTarget }\n const handleToggleExpanded = useCallback((id: string) => {\n setExpanded((current) => current === id ? undefined : id)\n }, [])\n const handleToggleEnabled = useCallback((id: string, enabled: boolean) => {\n const index = liveRef.current.configs.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(liveRef.current.configs.map((item, at) => at === index ? { ...item, enabled } : item))\n }, [onPatchConfigs])\n const handlePatch = useCallback((id: string, patch: Partial<PromptConfigDraft>) => {\n const index = liveRef.current.configs.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(liveRef.current.configs.map((item, at) => at === index ? { ...item, ...patch } : item))\n }, [onPatchConfigs])\n const handleMove = useCallback((id: string, delta: -1 | 1) => {\n const { configs: current, layer: currentLayer, metaLayers } = liveRef.current\n const index = current.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(moveWithinLayer(current, index, delta, currentLayer, metaLayers))\n }, [onPatchConfigs])\n const handleDuplicate = useCallback((id: string) => {\n const current = liveRef.current.configs\n const source = current.find((item) => item.id === id)\n if (source === undefined) return\n let nextId = `${source.id}-copy`\n let suffix = 2\n while (current.some((item) => item.id === nextId)) {\n nextId = `${source.id}-copy${suffix}`\n suffix += 1\n }\n const clone = JSON.parse(JSON.stringify(source)) as PromptConfigDraft\n clone.id = nextId\n onPatchConfigs([...current, clone])\n setExpanded(nextId)\n onNotice('ok', '已复制')\n }, [onNotice, onPatchConfigs])\n const handleDelete = useCallback((id: string) => {\n const current = liveRef.current.configs\n onPatchConfigs(current.filter((item) => item.id !== id))\n setExpanded((value) => value === id ? undefined : value)\n onNotice('ok', '已删除')\n }, [onNotice, onPatchConfigs])\n const handleDragStart = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n setDragId(id)\n event.dataTransfer.effectAllowed = 'move'\n }, [])\n const handleDragOver = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n event.preventDefault()\n const { dragId: currentDrag } = liveRef.current\n if (currentDrag === undefined || currentDrag === id) return\n const rect = event.currentTarget.getBoundingClientRect()\n setDropTarget({ id, before: event.clientY < rect.top + rect.height / 2 })\n }, [])\n const handleDrop = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n event.preventDefault()\n const { configs: current, layer: currentLayer, metaLayers, dragId: source, dropTarget: target } = liveRef.current\n if (source !== undefined && target !== undefined && source !== id) {\n onPatchConfigs(moveToView(current, source, target.id, target.before, currentLayer, metaLayers))\n }\n setDragId(undefined)\n setDropTarget(undefined)\n }, [onPatchConfigs])\n const handleDragEnd = useCallback(() => {\n setDragId(undefined)\n setDropTarget(undefined)\n }, [])\n const handleMoveUp = useCallback((id: string) => handleMove(id, -1), [handleMove])\n const handleMoveDown = useCallback((id: string) => handleMove(id, 1), [handleMove])\n\n const renderCard = (config: PromptConfigDraft) => {\n const position = positionOf.get(config.id) ?? -1\n return (\n <PromptConfigCard\n key={config.id}\n meta={meta}\n config={config}\n expanded={expanded === config.id}\n canMoveUp={position > 0}\n canMoveDown={position >= 0 && position < viewIds.length - 1}\n dragging={dragId === config.id}\n dropBefore={dropTarget?.id === config.id && dropTarget.before}\n dropAfter={dropTarget?.id === config.id && !dropTarget.before}\n onToggleExpanded={handleToggleExpanded}\n onToggleEnabled={handleToggleEnabled}\n onPatch={handlePatch}\n onMoveUp={handleMoveUp}\n onMoveDown={handleMoveDown}\n onDuplicate={handleDuplicate}\n onDelete={handleDelete}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n />\n )\n }\n\n return (\n <section className={styles.section} aria-labelledby=\"prompt-tool-configs-heading\">\n <div className={styles.sectionHeading}>\n <div><h2 id=\"prompt-tool-configs-heading\">{layer === undefined ? '模块列表' : '本层配置'}</h2><p>{scoped.length} 条配置 · {scoped.filter((config) => config.enabled !== false).length} 条启用;上下移动控制同层顺序。</p></div>\n <div className={styles.sectionActions}>\n {extraActions}\n <button type=\"button\" className={styles.pillButton} disabled={validating} onClick={() => void runValidate(configs)}>{validating && <span className={styles.spinner} aria-hidden=\"true\" />}{validating ? '校验中…' : '校验'}</button>\n <button type=\"button\" className={styles.primaryPill} disabled={saving || validating} onClick={() => void save()}>{saving && <span className={styles.spinner} aria-hidden=\"true\" />}{saving ? '保存中…' : '保存'}</button>\n </div>\n </div>\n\n <div className={styles.listFilterRow}>\n <input\n className={styles.listFilter}\n value={filter}\n aria-label=\"过滤模块列表\"\n placeholder=\"过滤:按 id / 名称…\"\n spellCheck={false}\n onChange={(event) => setFilter(event.target.value)}\n />\n {layer === undefined && (\n <select\n className={styles.listFilter}\n value={viewFilter}\n aria-label=\"按层级或策略过滤\"\n onChange={(event) => changeViewFilter(event.target.value)}\n >\n <option value=\"all\">全部</option>\n <option value=\"world-book\">世界书</option>\n {meta.layers.map((item) => (\n <option key={item} value={item}>层级:{item}</option>\n ))}\n </select>\n )}\n <span className={styles.batchControls}>\n <button type=\"button\" className={styles.pillButton} disabled={ordered.length === 0}\n onClick={() => batchSetEnabled(true)}>启用</button>\n <button type=\"button\" className={styles.pillButton} disabled={ordered.length === 0}\n onClick={() => batchSetEnabled(false)}>禁用</button>\n </span>\n </div>\n\n {errors.length > 0 && (\n <div className={styles.configErrorBox}>\n {errors.map((error, index) => (\n <div key={`${error.index}-${index}`} className={styles.configErrorLine}>[{error.index}] {error.id || '(缺 id)'}:{error.message}</div>\n ))}\n </div>\n )}\n\n {/* 归类于配置列表下的固定卡片(模板变量:可折叠 / 可删除 / 可新建)。 */}\n {beforeCards}\n\n {scoped.length === 0 ? (\n <div className={styles.emptyState}><span className={styles.emptyGlyph} aria-hidden=\"true\">⌁</span><div><h3>{scope === 'subagent' ? '还没有子代理可见的配置' : effectiveLayer === undefined ? '还没有自定义配置' : '本层还没有自定义配置'}</h3><p>{scope === 'subagent' ? '从上方「新建」插入一条(插入后可在卡片「消息受众」下拉自由切换仅主会话/公用/仅子代理),或到主设置「配置」从目录导入。' : effectiveLayer === undefined ? '从上方模板插入一条,或从本地目录导入;默认四条内置配置不受影响。' : '请到主设置「配置」从模板插入或从目录导入。'}</p>{emptyHint !== undefined && <p className={styles.readOnly}>{emptyHint}</p>}</div></div>\n ) : filtered.length === 0 ? (\n <p className={styles.readOnly} role=\"status\">没有匹配「{filter.trim()}」的配置。</p>\n ) : (\n <div className={styles.configList}>\n {ordered.map((config) => renderCard(config))}\n </div>\n )}\n\n <div className={styles.feedback} aria-live=\"polite\">\n {dirty && <p className={styles.readOnly}>模块列表有未保存修改。</p>}\n </div>\n\n <footer className={`${styles.actions} ${dirty ? styles.actionsVisible : ''}`} aria-live=\"polite\">\n <span>{dirty ? '有未保存修改' : ''}</span>\n <div>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" disabled={saving || !dirty} onClick={discard}>放弃修改</button>\n <button type=\"button\" className={styles.save} disabled={saving || validating || !dirty} onClick={() => void save()}>{saving && <span className={styles.spinner} aria-hidden=\"true\" />}{saving ? '保存中…' : '保存全部'}</button>\n </div>\n </footer>\n </section>\n )\n}","/** 内置模板选择弹窗:按注入层分组展示;传入 layer 时只显示该层模板。 */\nimport { useEffect, useRef, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react'\nimport styles from './PromptUi.module.css'\nimport type { PromptConfigTemplateEntry } from './prompt-tool-types.ts'\n\nexport const TEMPLATE_LAYER_TITLES: Record<string, string> = {\n 'pre-step': '消息批层',\n 'system-section': '系统段层',\n 'runtime-context': '运行上下文',\n 'agent-request': '调用配置层',\n 'llm-stream': '模型流层',\n 'tool-pipeline': '工具管线层',\n}\n\nexport function TemplatePicker(props: {\n templates: PromptConfigTemplateEntry[]\n /** 传入 layer 时只显示该层模板(无分组标题);不传按层分组展示全部。 */\n layer?: string\n onPick: (entry: PromptConfigTemplateEntry) => void\n /** 可选:自定义工具模板(「工具」分组;点击经 onPickTool 回调工具定义)。 */\n toolTemplates?: Array<{ file: string; spec: Record<string, unknown> }>\n onPickTool?: (spec: Record<string, unknown>) => void\n /** 可选:「模板变量(Variables)」固定入口——点击不插入配置,由宿主展开模板变量卡片。 */\n onPickVariables?: () => void\n onClose: () => void\n}): ReactNode {\n const { templates, layer, onPick, toolTemplates, onPickTool, onPickVariables, onClose } = props\n const dialogRef = useRef<HTMLDivElement>(null)\n const restoreRef = useRef<HTMLElement | null>(null)\n\n // 打开时记录触发元素并聚焦弹窗首控件;关闭时还原焦点(焦点陷阱闭环)。\n useEffect(() => {\n restoreRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null\n dialogRef.current?.querySelector<HTMLElement>('button')?.focus()\n return () => { restoreRef.current?.focus() }\n }, [])\n\n const onDialogKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n onClose()\n return\n }\n if (event.key !== 'Tab') return\n const dialog = dialogRef.current\n if (dialog === null) return\n const focusables = [...dialog.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )].filter((element) => !element.hasAttribute('disabled'))\n if (focusables.length === 0) return\n const first = focusables[0]!\n const last = focusables[focusables.length - 1]!\n const active = document.activeElement\n if (event.shiftKey) {\n if (active === first || !dialog.contains(active)) {\n event.preventDefault()\n last.focus()\n }\n } else if (active === last || !dialog.contains(active)) {\n event.preventDefault()\n first.focus()\n }\n }\n\n const visible = layer === undefined\n ? templates\n : templates.filter((template) => (template.spec.layer ?? 'pre-step') === layer)\n const groups = new Map<string, PromptConfigTemplateEntry[]>()\n for (const template of visible) {\n const key = template.spec.layer ?? 'pre-step'\n const items = groups.get(key)\n if (items === undefined) groups.set(key, [template])\n else items.push(template)\n }\n return (\n <div className={styles.modalBackdrop} onClick={onClose}>\n <div\n ref={dialogRef}\n className={styles.templateModal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"选择内置模板\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={onDialogKeyDown}\n >\n <div className={styles.templateModalHead}>\n <strong>选择内置模板{layer !== undefined ? `(${TEMPLATE_LAYER_TITLES[layer] ?? layer})` : ''}</strong>\n <button type=\"button\" className={styles.pillButton} aria-label=\"关闭模板选择\" onClick={onClose}>×</button>\n </div>\n <div className={styles.templateModalList}>\n {onPickVariables !== undefined && (\n <div className={styles.templateGroup}>\n <strong className={styles.templateGroupTitle}>变量</strong>\n <button type=\"button\" className={styles.templateModalItem} onClick={onPickVariables}>\n <strong>Variables</strong>\n <small>{'模板变量(预设级 {{key}} 插值)'}</small>\n </button>\n </div>\n )}\n {visible.length === 0 && (toolTemplates?.length ?? 0) === 0\n && <p className={styles.configFieldHint}>本层暂无内置模板。</p>}\n {[...groups.entries()].map(([groupLayer, items]) => (\n <div key={groupLayer} className={styles.templateGroup}>\n {layer === undefined && <strong className={styles.templateGroupTitle}>{TEMPLATE_LAYER_TITLES[groupLayer] ?? groupLayer}</strong>}\n {items.map((template) => (\n <button key={template.file} type=\"button\" className={styles.templateModalItem} onClick={() => onPick(template)}>\n <strong>{template.file}</strong>\n <small>{template.spec.name ?? template.spec.id}</small>\n </button>\n ))}\n </div>\n ))}\n {toolTemplates !== undefined && toolTemplates.length > 0 && (\n <div className={styles.templateGroup}>\n <strong className={styles.templateGroupTitle}>工具</strong>\n {toolTemplates.map((template) => (\n <button key={template.file} type=\"button\" className={styles.templateModalItem}\n onClick={() => onPickTool?.(template.spec)}>\n <strong>{template.file}</strong>\n <small>{String(template.spec.name ?? template.spec.id ?? '')}</small>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/** 模板库加载 + 插入共享逻辑:PromptConfigsEditor 与各配置列表页(六层/子代理)共用。 */\nimport { useState } from 'react'\nimport { bridgePost, errorMessage } from './prompt-tool-bridge.ts'\nimport type { PromptConfigDraft, PromptConfigTemplateEntry } from './prompt-tool-types.ts'\n\ninterface TemplatesResult {\n ok: boolean\n templates?: PromptConfigTemplateEntry[]\n message?: string\n}\n\nexport function useTemplatePicker(\n configs: PromptConfigDraft[],\n onPickConfig: (config: PromptConfigDraft) => void,\n onNotice: (kind: 'ok' | 'error', message: string) => void,\n): {\n templates: PromptConfigTemplateEntry[]\n open: boolean\n openPicker: () => void\n closePicker: () => void\n pickTemplate: (entry: PromptConfigTemplateEntry) => void\n} {\n const [templates, setTemplates] = useState<PromptConfigTemplateEntry[]>([])\n const [open, setOpen] = useState(false)\n\n const loadTemplates = async (): Promise<void> => {\n if (templates.length > 0) return\n try {\n const res = await bridgePost<TemplatesResult>('/templates', {})\n if (!res.ok) {\n onNotice('error', '读取模板库失败:' + (res.message ?? 'settings bridge unavailable'))\n return\n }\n if (!Array.isArray(res.value.templates)) {\n onNotice('error', '读取模板库失败:模板列表为空')\n return\n }\n setTemplates(res.value.templates)\n } catch (error) {\n onNotice('error', '读取模板库失败:' + errorMessage(error))\n }\n }\n\n const openPicker = (): void => {\n setOpen(true)\n void loadTemplates()\n }\n\n const closePicker = (): void => setOpen(false)\n\n const pickTemplate = (entry: PromptConfigTemplateEntry): void => {\n if (configs.some((config) => config.id === entry.spec.id)) {\n onNotice('error', `id 已存在:${entry.spec.id}(请先改名或删除同 id 配置)`)\n return\n }\n const clone = JSON.parse(JSON.stringify(entry.spec)) as PromptConfigDraft\n onPickConfig(clone)\n onNotice('ok', `已插入模板 ${entry.file}(id=${clone.id})`)\n setOpen(false)\n }\n\n return { templates, open, openPicker, closePicker, pickTemplate }\n}\n","import { useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { TagInput } from './TagInput.tsx'\nimport styles from './PromptUi.module.css'\n\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\n/** 引擎模块可折叠卡片:与模块列表(PromptConfigList)同款形态——\n * configCard + configToggle + chevron,点击展开 configForm 编辑组合行 config\n * (经 params 参数桥扁平键落 preset.yml)。归类于配置列表下(beforeCards)。\n * layer:6 层注入层级归类(pre-step / system-section / tool-pipeline),\n * 参与模块列表层筛选(layerFilter 联动)。 */\nfunction EngineModuleCard(props: {\n store: PromptToolStore\n name: string\n meta: string\n layer?: string\n children?: ReactNode\n /** 纯开关卡:开关直接渲染在 header 顶层(右侧),卡片不展开、不折叠。 */\n topSwitch?: {\n id: string\n label: string\n hint: string\n checked: boolean\n disabled?: boolean\n onToggle: () => void\n }\n}): ReactNode {\n const [expanded, setExpanded] = useState(false)\n const compact = props.topSwitch !== undefined\n return (\n <article className={styles.configCard}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={expanded} onClick={() => setExpanded(!expanded)}>\n <span className={styles.configTitle}>\n <span className={styles.configTitleRow}>\n <span className={styles.configName}>{props.name}</span>\n {props.layer !== undefined && <span className={styles.configChip}>{props.layer}</span>}\n </span>\n <span className={styles.configMeta}>{props.meta}</span>\n </span>\n {!compact && <IconChevronDownOutline14 className={clsx(styles.chevron, expanded && styles.chevronOpen)} />}\n </button>\n {props.topSwitch !== undefined && (\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} htmlFor={props.topSwitch.id} title={props.topSwitch.hint}>\n <input\n id={props.topSwitch.id}\n type=\"checkbox\"\n checked={props.topSwitch.checked}\n disabled={props.topSwitch.disabled}\n aria-label={props.topSwitch.label}\n onChange={props.topSwitch.onToggle}\n />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n </span>\n )}\n </header>\n {expanded && !compact && <div className={styles.configForm}>{props.children}</div>}\n </article>\n )\n}\n\n/** 模型路由模块卡(官方 agent-default-model 层,非引擎模块——归类配置列表下):\n * 主对话/子代理共用同一配置源(缺省继承宿主默认);模型路由与人设按作用域完全分离\n * (main=主对话模型、subagent=子代理模型,参数各自独立)。 */\nexport function ModelRouteModuleCard(props: { store: PromptToolStore; scope: 'main' | 'subagent' }): ReactNode {\n const { store } = props\n const fields = store.fields\n const host = store.hostDefaultModel\n // 宿主默认模型回显:插件参数未设置(空 = 继承宿主)时,下拉可见宿主当前\n // agent-default-model 的可选项(模型目录查询失败/未公布时也能选择与回显)。\n const providerOptions = [...new Set([...store.providers, ...(host?.provider !== undefined && host.provider.length > 0 ? [host.provider] : [])])]\n const provider = props.scope === 'main' ? fields.modelProvider : fields.subagentModelProvider\n const modelName = props.scope === 'main' ? fields.modelName : fields.subagentModelName\n const modelOptions = [...new Set([\n ...(store.modelCatalog[provider] ?? []),\n ...(host?.model !== undefined && host.model.length > 0 ? [host.model] : []),\n ])]\n const reasoningEffortOptions = ['', 'off', 'low', 'high', 'max']\n // 宿主默认思维程度回显(agent-default-model settings reasoningEffort;官方档位同源)。\n const hostEffort = host?.reasoningEffort !== undefined && host.reasoningEffort.length > 0\n ? host.reasoningEffort\n : undefined\n const withCurrent = (options: string[], current: string): string[] =>\n current.length > 0 && !options.includes(current) ? [...options, current] : options\n const active = provider.length > 0 && modelName.length > 0\n const reasoningEffort = props.scope === 'main' ? fields.modelReasoningEffort : fields.subagentReasoningEffort\n const temperature = props.scope === 'main' ? fields.modelTemperature : fields.subagentTemperature\n const maxTokens = props.scope === 'main' ? fields.modelMaxTokens : fields.subagentMaxTokens\n const patchModelParam = (key: 'modelReasoningEffort' | 'modelTemperature' | 'modelMaxTokens' | 'subagentReasoningEffort' | 'subagentTemperature' | 'subagentMaxTokens', value: string): void => {\n store.patch({ [key]: value } as Partial<typeof fields>)\n void store.persistParamOverrides()\n }\n const scopeMeta = props.scope === 'main'\n ? { title: '模型路由', idle: '未设置:展开选择模型(留空 = 继承宿主默认)', active: '固定模型路由已设置(新会话默认模型)' }\n : { title: '子代理模型', idle: '未设置:展开选择模型(留空 = 继承主会话)', active: '子代理固定模型路由已设置' }\n // 主对话卡片:宿主默认模型名回显(子代理默认继承主会话,不回显宿主)。\n const idleMeta = props.scope === 'main' && host?.model !== undefined && host.model.length > 0\n ? `未设置:展开选择模型(当前继承宿主默认 ${host.model})`\n : scopeMeta.idle\n return (\n <EngineModuleCard store={store} name={scopeMeta.title} meta={active ? scopeMeta.active : idleMeta}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>模型服务商</strong>\n <small>{props.scope === 'main'\n ? '主对话新会话默认模型(agent-default-model);调用方未显式指定时自动补入。检测到的服务商可直接选择。'\n : '子代理固定模型路由(agentOptions 注入 tool-subagent,经预设参数传递);调用方显式模型优先。检测到的服务商可直接选择。'}</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"模型服务商\"\n value={provider}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch(props.scope === 'main' ? { modelProvider: event.target.value } : { subagentModelProvider: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {withCurrent(providerOptions, provider).map((item) => (\n <option key={item} value={item}>{item}</option>\n ))}\n </select>\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>模型名</strong>\n <small>{props.scope === 'main'\n ? '与模型服务商同时非空时生效(主对话新会话默认模型),例如 deepseek-v4-flash。'\n : '与子代理模型服务商同时非空时生效(子代理固定路由),例如 deepseek-v4-flash。'}</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"模型名\"\n value={modelName}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch(props.scope === 'main' ? { modelName: event.target.value } : { subagentModelName: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {withCurrent(modelOptions, modelName).map((item) => (\n <option key={item} value={item}>{item}</option>\n ))}\n </select>\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>思维程度</strong>\n <small>reasoningEffort(agent-request patch);官方档位 off / low / high / max;{reasoningEffort.length === 0 && hostEffort !== undefined\n ? `留空 = 继承宿主默认(${hostEffort})。`\n : '留空 = 不设置(模型默认)。'}选择即保存。</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"思维程度\"\n value={reasoningEffort}\n disabled={!fields.writePreset}\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelReasoningEffort' : 'subagentReasoningEffort',\n event.target.value,\n )}\n >\n {withCurrent(hostEffort !== undefined ? [...new Set([...reasoningEffortOptions, hostEffort])] : reasoningEffortOptions, reasoningEffort).map((item) => (\n <option key={item} value={item}>{item.length === 0 ? '(不设置)' : item}</option>\n ))}\n </select>\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>采样温度</strong>\n <small>temperature(agent-request patch);数字 0–2,留空 = 不设置(模型默认)。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={0}\n max={2}\n step={0.1}\n aria-label=\"采样温度\"\n value={temperature}\n disabled={!fields.writePreset}\n placeholder=\"不设置\"\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelTemperature' : 'subagentTemperature',\n event.target.value,\n )}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>输出上限</strong>\n <small>maxTokens(agent-request patch);正整数,留空 = 不设置(模型默认)。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={1}\n step={1}\n aria-label=\"输出上限\"\n value={maxTokens}\n disabled={!fields.writePreset}\n placeholder=\"不设置\"\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelMaxTokens' : 'subagentMaxTokens',\n event.target.value,\n )}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n </EngineModuleCard>\n )\n}\n\n/** 工具与深度模块卡(子代理作用域配置;参数经 params 桥扁平键,与主会话引擎模块卡同一来源)。 */\nexport function DelegationToolsModuleCard(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = store.fields\n const maxDepthOptions = ['', 'provider-managed', '0', '1', '2', '3', '5']\n return (\n <EngineModuleCard store={store} name=\"工具与深度\" meta=\"工具集白名单/黑名单 + 注入 kind 白名单 + 递归深度\">\n <TagInput id=\"pt-tool-filter-allow\" label=\"工具集白名单\" hint=\"toolFilter.allow:主会话常驻过滤(tool-filter 模块,作用于任意注册工具含自定义插件)+ 委派子代理 toolFilter;留空 = 不限制。\"\n value={fields.toolFilterAllow} placeholder=\"read, write, glob\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterAllow: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-tool-filter-deny\" label=\"工具集黑名单\" hint=\"toolFilter.deny:主会话常驻过滤(tool-filter 模块)+ 委派子代理 toolFilter;留空 = 不限制。\"\n value={fields.toolFilterDeny} placeholder=\"bash, run_code\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterDeny: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-allow-kinds\" label=\"注入 kind 白名单\" hint=\"context-gate allowKinds(注入门控);例如 skill-invocation、near-anchor、router-guide;留空 = 官方默认(不过滤)。\"\n value={fields.allowKinds} placeholder=\"skill-invocation, near-anchor, router-guide\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ allowKinds: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>递归深度</strong>\n <small>委派 maxDepth:0 禁止委派;provider-managed 由服务商管理;正整数限制递归层数;不设置 = 官方默认。选择即保存。</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"递归深度\"\n value={fields.maxDepth}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch({ maxDepth: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {maxDepthOptions.map((item) => (\n <option key={item} value={item}>{item === '' ? '(不设置)' : item}</option>\n ))}\n </select>\n </div>\n </EngineModuleCard>\n )\n}\n\n/** 引擎模块卡片组(模块列表顶部,按 6 层注入层级归类):\n * tool-bootstrap(system-section)/ context-gate(pre-step)/\n * code-presentation · tool-filter · delegation\n * (tool-pipeline)各一张可折叠模块卡。\n * 语义 = 参数桥扁平键的 UI 化;保存走 params 桥 /param-overrides。\n * layerFilter:模块列表层筛选联动('all' 显示全部;指定层只显示该层;\n * 'world-book' 不显示引擎卡)。 */\nexport function EngineModuleCards(props: { store: PromptToolStore; layerFilter?: string }): ReactNode {\n const { store } = props\n const fields = store.fields\n const layerFilter = props.layerFilter ?? 'all'\n const visible = (layer?: string): boolean =>\n layerFilter === 'all' || (layer !== undefined && layerFilter === layer)\n // 选中层无引擎模块卡时给出提示(引擎模块分布在 pre-step / system-section / tool-pipeline)。\n const hasVisibleCard = layerFilter === 'all' || layerFilter === 'pre-step'\n || layerFilter === 'system-section' || layerFilter === 'tool-pipeline'\n const capped = fields.bootstrapMaxTokens > 0\n const maxDepthOptions = ['', 'provider-managed', '0', '1', '2', '3', '5']\n const gateRow = (id: string, label: string, hint: string, key: 'usePtcMode' | 'promoteGate' | 'promoteAfterFirstResponse' | 'personaSectionsOnly' | 'workspaceLine' | 'toolFilterSubagents' | 'instructionHint' | 'anchorTurn' | 'deliberationGate' | 'cotDrip'): ReactNode => (\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>{label}</strong>\n <small>{hint}</small>\n </span>\n <label className={styles.configEnable} htmlFor={id}>\n <input id={id} type=\"checkbox\" checked={fields[key]} disabled={!fields.writePreset} aria-label={label} onChange={() => store.toggle(key)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n </div>\n )\n const numberRow = (id: string, label: string, hint: string, value: number, onCommit: (next: number) => void, min = 0): ReactNode => (\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>{label}</strong>\n <small>{hint}</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={min}\n step={1}\n value={String(value)}\n placeholder=\"1(默认)\"\n disabled={!fields.writePreset}\n aria-label={label}\n onChange={(event) => {\n if (event.target.value.trim() === '') onCommit(0)\n else {\n const parsed = Number(event.target.value)\n if (Number.isSafeInteger(parsed) && parsed >= 0) onCommit(parsed)\n }\n }}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n )\n return (\n <>\n {visible('system-section') && (\n <EngineModuleCard store={store} name=\"tool-bootstrap\" layer=\"system-section\" meta=\"目录相位 · 首轮窄化 / 门控晋升 / 压缩恢复\">\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>首轮输出封顶</strong>\n <small>bootstrapMaxTokens:首轮请求 #1 的 maxTokens(正整数,失焦保存);0 = 不设上限。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={1}\n step={1}\n value={store.bootstrapTokensDraft}\n disabled={!fields.writePreset || !capped}\n aria-label=\"首轮输出封顶数值\"\n onChange={(event) => store.setBootstrapTokensDraft(event.target.value)}\n onBlur={store.commitBootstrapTokensDraft}\n />\n <label className={styles.configEnable} htmlFor=\"pt-bootstrap-tokens\">\n <input id=\"pt-bootstrap-tokens\" type=\"checkbox\" checked={capped} disabled={!fields.writePreset} aria-label=\"首轮输出封顶\" onChange={store.toggleBootstrapMaxTokens} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n </div>\n {gateRow('pt-promote-gate', '门控晋升', 'promoteGate:首段 reasoning minimal-like(we 无 let me)+ 工具调用才晋升', 'promoteGate')}\n {gateRow('pt-promote-after', '首响应即晋升', 'promoteAfterFirstResponse:无工具首响应 / 首轮 turn/end 即晋升', 'promoteAfterFirstResponse')}\n {gateRow('pt-persona-only', '首轮只留人设', 'personaSectionsOnly:phase-1 提示词段只留 persona(plan-mode 等晋升后恢复)', 'personaSectionsOnly')}\n {gateRow('pt-workspace-line', '工作目录行', 'workspaceLine:晋升后 persona 附加工作目录行', 'workspaceLine')}\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>首次调用指令</strong>\n <small>phase1FirstCallInstruction:phase-1 persona 追加的首次工具调用指令;空 = 不追加。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.phase1FirstCallInstruction}\n disabled={!fields.writePreset}\n aria-label=\"首次调用指令\"\n placeholder=\"After your first reasoning block, make one tool call.\"\n onChange={(event) => store.patch({ phase1FirstCallInstruction: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>门控回退步数</strong>\n <small>maxPromoteSteps:门控模式步数达上限强制晋升;0 = 引擎默认 4。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={0}\n step={1}\n value={store.gateStepsDraft}\n disabled={!fields.writePreset}\n aria-label=\"门控回退步数\"\n onChange={(event) => store.setGateStepsDraft(event.target.value)}\n onBlur={store.commitGateStepsDraft}\n />\n </div>\n <TagInput id=\"pt-bootstrap-tools\" label=\"首轮窄化集\" hint=\"bootstrapTools:首轮模型可见工具;清空 = 零工具模式(首请求空工具面,assistant/message 后晋升)。回车或逗号添加,× 移除。\"\n value={fields.bootstrapTools} placeholder=\"bash, str_replace_editor\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ bootstrapTools: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <div className={styles.configSectionTitle}>前置锚定轮(anchor-turn 模块)</div>\n {gateRow('pt-anchor-turn', '前置锚定轮', 'anchorTurn:用户首条真实消息前 prepend 合成锚定轮(配合零工具模式 = 空工具面锚定);需模块列表已挂 anchor-turn 行。', 'anchorTurn')}\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>锚定文本</strong>\n <small>anchorTurnText:合成锚定轮文本(如「你是谁」);空 = 引擎默认 \"This round is a test…\"。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.anchorTurnText}\n disabled={!fields.writePreset}\n aria-label=\"锚定文本\"\n placeholder=\"This round is a test. Tools are not open yet…\"\n onChange={(event) => store.patch({ anchorTurnText: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <TagInput id=\"pt-compaction-tools\" label=\"压缩后恢复集\" hint=\"compactionTools:压缩后回到受控相位时的核心工作集(模型中途继续工作)。回车或逗号添加,× 移除。\"\n value={fields.compactionTools} placeholder=\"read, write, edit, glob, grep\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ compactionTools: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <div className={styles.configFieldHint} style={{ marginTop: '6px' }}>\n <strong>渐进披露(stages)</strong>:阶段定义非空即激活多级阶段窄化(替换两相窄化);每阶段模型可见工具 = 当前档 + 预放档。\n </div>\n {fields.stages.map((stage, index) => (\n <div key={`stage-${index}`} className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>{`阶段 ${index + 1}`}</strong>\n <small>名称 + 本阶段工具集(空名称或空工具集的行不写入);上移/下移调整阶段顺序。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={stage.name}\n disabled={!fields.writePreset}\n aria-label={`阶段 ${index + 1} 名称`}\n placeholder=\"阶段名(如 了解 / 开发 / 验证)\"\n onChange={(event) => {\n const next = [...fields.stages]\n next[index] = { ...stage, name: event.target.value }\n store.patch({ stages: next })\n }}\n onBlur={() => void store.persistParamOverrides()}\n />\n <TagInput\n id={`pt-stage-${index}-tools`}\n label=\"工具集\"\n hint=\"本阶段工具(回车或逗号添加,× 移除)。\"\n value={stage.tools}\n placeholder=\"read, glob, grep\"\n disabled={!fields.writePreset}\n onChange={(value) => {\n const next = [...fields.stages]\n next[index] = { ...stage, tools: value }\n store.patch({ stages: next })\n }}\n onCommit={() => void store.persistParamOverrides()}\n />\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} aria-label={`上移阶段 ${index + 1}`} title=\"上移\"\n disabled={!fields.writePreset || index === 0} onClick={() => {\n const next = [...fields.stages]\n ;[next[index - 1], next[index]] = [next[index]!, next[index - 1]!]\n store.patch({ stages: next })\n void store.persistParamOverrides()\n }}>↑</button>\n <button type=\"button\" className={styles.pillButton} aria-label={`下移阶段 ${index + 1}`} title=\"下移\"\n disabled={!fields.writePreset || index >= fields.stages.length - 1} onClick={() => {\n const next = [...fields.stages]\n ;[next[index], next[index + 1]] = [next[index + 1]!, next[index]!]\n store.patch({ stages: next })\n void store.persistParamOverrides()\n }}>↓</button>\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={`删除阶段 ${index + 1}`} title=\"删除\"\n disabled={!fields.writePreset} onClick={() => {\n const next = fields.stages.filter((_, at) => at !== index)\n store.patch({ stages: next })\n void store.persistParamOverrides()\n }}>×</button>\n </span>\n </div>\n ))}\n <div className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} disabled={!fields.writePreset}\n onClick={() => {\n store.patch({ stages: [...fields.stages, { name: '', tools: '' }] })\n void store.persistParamOverrides()\n }}>+ 添加阶段</button>\n </div>\n {numberRow('pt-stage-pre-unlock', '预放档数', 'stagePreUnlock:调用预放档工具 = 直达其档;0 = 不预放,未设置 = 引擎默认 1。', fields.stagePreUnlock, (next) => store.patch({ stagePreUnlock: next }))}\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>推进工具名</strong>\n <small>stageAdvanceTool:阶段推进工具(模型调用即进下一档);空 = 默认 phase_advance。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.stageAdvanceTool}\n disabled={!fields.writePreset}\n aria-label=\"推进工具名\"\n placeholder=\"phase_advance\"\n onChange={(event) => store.patch({ stageAdvanceTool: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>推进工具描述</strong>\n <small>stageAdvanceDescription:阶段推进工具的模型可见描述;空 = 引擎默认。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.stageAdvanceDescription}\n disabled={!fields.writePreset}\n aria-label=\"推进工具描述\"\n placeholder=\"Advance to the next stage.\"\n onChange={(event) => store.patch({ stageAdvanceDescription: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>阶段状态模板</strong>\n <small>{'stageSectionTemplate:阶段状态 section 模板({{stage}}/{{stageName}}/{{unlocked}}/{{total}});空 = 不注入。失焦保存。'}</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.stageSectionTemplate}\n disabled={!fields.writePreset}\n aria-label=\"阶段状态模板\"\n placeholder={'Stage {{stageName}} ({{stage}}/{{total}}). Unlocked: {{unlocked}}.'}\n onChange={(event) => store.patch({ stageSectionTemplate: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n </EngineModuleCard>\n )}\n {visible('pre-step') && (\n <EngineModuleCard store={store} name=\"context-gate\" layer=\"pre-step\" meta=\"注入门控 · 白名单 / 延迟注入 / 指令提示\">\n <TagInput id=\"pt-allow-kinds\" label=\"注入 kind 白名单\" hint=\"allowKinds:context-gate 注入门控;空 = 官方 pre-step 行为(不过滤)。\"\n value={fields.allowKinds} placeholder=\"skill-invocation, near-anchor, router-guide\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ allowKinds: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-message-sources\" label=\"消息源白名单\" hint=\"messageSources:phase-1 只放行声明的 source.kind(含 claimed 批);空 = 不启用。\"\n value={fields.messageSources} placeholder=\"user, goal\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ messageSources: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-deferred-sources\" label=\"晋升后延迟注入\" hint=\"deferredSources:晋升后延迟 N 步注入的 source kind;空 = 不延迟。\"\n value={fields.deferredSources} placeholder=\"agent-instructions, skill-catalog\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ deferredSources: value })}\n onCommit={() => void store.persistParamOverrides()} />\n {numberRow('pt-deferred-steps', '延迟宽限步数', 'deferredGraceSteps:晋升后前 N 步过滤延迟注入源;0 = 不延迟。', fields.deferredGraceSteps, (next) => store.patch({ deferredGraceSteps: next }))}\n {gateRow('pt-instr-hint', '指令提示转换', 'instructionHint:晋升后 agent-instructions 全文 → 一次性引用提示', 'instructionHint')}\n </EngineModuleCard>\n )}\n {visible('tool-pipeline') && (\n <EngineModuleCard store={store} name=\"工具管线\" layer=\"tool-pipeline\" meta=\"工具设置 · 呈现 / 过滤 / 委派 / 验证\">\n <div className={styles.configSectionTitle}>呈现(code-presentation)</div>\n {gateRow('pt-use-ptc', '使用 PTC 模式', 'usePtcMode:晋升后 Code Mode (PTC) 呈现(默认 false,opt-in);false = 原生完整工具目录', 'usePtcMode')}\n\n <div className={styles.configSectionTitle}>过滤(tool-filter)</div>\n <TagInput id=\"pt-tool-filter-allow\" label=\"工具集白名单\" hint=\"toolFilter.allow:主会话常驻过滤(tool-filter 模块,作用于任意注册工具含自定义插件)+ 委派子代理 toolFilter;留空 = 不限制。\"\n value={fields.toolFilterAllow} placeholder=\"read, write, glob\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterAllow: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-tool-filter-deny\" label=\"工具集黑名单\" hint=\"toolFilter.deny:主会话常驻过滤(tool-filter 模块)+ 委派子代理 toolFilter;留空 = 不限制。\"\n value={fields.toolFilterDeny} placeholder=\"bash, run_code\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterDeny: value })}\n onCommit={() => void store.persistParamOverrides()} />\n {gateRow('pt-tool-filter-subagents', '子代理同过滤', 'toolFilterSubagents:主会话 tool-filter 也作用于子代理;false/未设置 = 子代理不受主会话过滤限制。', 'toolFilterSubagents')}\n {numberRow('pt-editor-max-output', '编辑器输出上限', 'strReplaceEditorMaxOutputChars:str_replace_editor 单次输出字符上限;16000 = 官方默认。', fields.strReplaceEditorMaxOutputChars, (next) => store.patch({ strReplaceEditorMaxOutputChars: next }), 1)}\n\n <div className={styles.configSectionTitle}>委派(delegation)</div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>递归深度</strong>\n <small>委派 maxDepth:0 禁止委派;provider-managed 由服务商管理;正整数限制递归层数;不设置 = 官方默认。选择即保存。</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"递归深度\"\n value={fields.maxDepth}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch({ maxDepth: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {maxDepthOptions.map((item) => (\n <option key={item} value={item}>{item === '' ? '(不设置)' : item}</option>\n ))}\n </select>\n </div>\n\n <div className={styles.configSectionTitle}>深思门控(deliberation-gate / cot-drip 模块)</div>\n {gateRow('pt-deliberation-gate', '轨迹深度门', 'deliberationGate:首工具调用前流式深思 < 下限时 deny 一次(规划式提示);需模块列表已挂 deliberation-gate 行。', 'deliberationGate')}\n {numberRow('pt-delib-min-chars', '深思下限', 'deliberationMinChars:首工具调用前的流式深思字符数下限;0 = 引擎默认 400。', fields.deliberationMinChars, (next) => store.patch({ deliberationMinChars: next }))}\n {numberRow('pt-delib-max-gates', '每轮最大门控', 'deliberationMaxGatesPerTurn:每轮最多 deny 次数;0 = 引擎默认 1。', fields.deliberationMaxGatesPerTurn, (next) => store.patch({ deliberationMaxGatesPerTurn: next }))}\n {gateRow('pt-cot-drip', '深思维持节拍', 'cotDrip:每 N 次工具结果滴入一条 \"We…\" 重申提醒(additionalContexts);需模块列表已挂 cot-drip 行。', 'cotDrip')}\n {numberRow('pt-cot-every', '节拍间隔', 'cotDripEvery:每几次工具结果滴入一条;0 = 引擎默认 4(0 禁用由引擎 every:0 语义处理)。', fields.cotDripEvery, (next) => store.patch({ cotDripEvery: next }))}\n {numberRow('pt-cot-max', '每轮最大提醒', 'cotDripMaxPerTurn:每轮最多提醒条数;0 = 引擎默认 1。', fields.cotDripMaxPerTurn, (next) => store.patch({ cotDripMaxPerTurn: next }))}\n </EngineModuleCard>\n )}\n {!hasVisibleCard && (\n <p className={styles.configFieldHint} role=\"status\">\n 该层无引擎模块卡:引擎模块分布在 pre-step(context-gate)/ system-section(tool-bootstrap)/ tool-pipeline(code-presentation · tool-filter · delegation)。\n </p>\n )}\n </>\n )\n}\n","/** 工具管理(tool-pipeline 层):自定义工具定义 + 第三方策略入口。\n * 数据源 preset.yml customTools 段(/custom-tools);工具卡片表单化编辑\n * (kind 专属字段),parameters 行式编辑。内置工具为插件固有注册,\n * 自定义面走 delegate 模板包装(无需开关/描述配置)。 */\nimport { useEffect, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport { Field } from './PromptConfigCard.tsx'\nimport { TemplatePicker } from './TemplatePicker.tsx'\nimport styles from './PromptUi.module.css'\n\n/** 内置工具名(delegate 提示)。 */\nconst BUILTIN_TOOL_NAMES = ['character_list', 'character_import', 'character_apply', 'character_remove', 'character_delete',\n 'world_book_list', 'world_book_upsert', 'world_book_delete', 'session_var']\n\nconst KIND_OPTIONS = ['shell', 'http', 'delegate', 'fs', 'ask-user'] as const\nconst FS_ACTIONS = ['read', 'write', 'append', 'list', 'delete'] as const\nconst HTTP_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'] as const\nconst SHELLS = ['pwsh', 'powershell', 'cmd', 'sh', 'bash'] as const\nconst SCHEMA_TYPES = ['string', 'number', 'integer', 'boolean', 'array', 'object', 'json'] as const\n\ntype ToolDraft = Record<string, unknown>\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/** parameters 行式编辑:key + type 下拉 + required 开关 + description,可增删。 */\nfunction ParameterRowsEditor(props: { value: ToolDraft | undefined; onChange: (value: ToolDraft | undefined) => void }): ReactNode {\n const params = asRecord(props.value)\n const rows = Object.entries(params).map(([key, spec]) => {\n const record = asRecord(spec)\n return {\n key,\n type: typeof record.type === 'string' ? record.type : 'string',\n required: record.required === true,\n description: typeof record.description === 'string' ? record.description : '',\n }\n })\n const commit = (next: Array<{ key: string; type: string; required: boolean; description: string }>): void => {\n const out: ToolDraft = {}\n for (const row of next) {\n // 保留空 key 行(「添加参数」新增的待编辑行);空 key 由保存端(save)统一清理,\n // 与 VariablesEditor 同语义——否则添加/清空 key 瞬间行被过滤,按钮失效。\n out[row.key] = {\n type: row.type,\n ...(row.required ? { required: true } : {}),\n ...(row.description.trim().length > 0 ? { description: row.description } : {}),\n }\n }\n props.onChange(Object.keys(out).length > 0 ? out : undefined)\n }\n const setRow = (index: number, patch: Partial<{ key: string; type: string; required: boolean; description: string }>): void => {\n commit(rows.map((row, at) => at === index ? { ...row, ...patch } : row))\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>parameters(模型可见参数 schema)</span>\n {rows.length === 0 && <p className={styles.configFieldHint}>{'无参数;下方添加。required=true 时模型必须提供该参数。'}</p>}\n {rows.map((row, index) => (\n <span key={`${row.key}-${index}`} className={styles.variableRow}>\n <input className={styles.configInput} aria-label=\"参数名\" value={row.key} spellCheck={false} placeholder=\"参数名\"\n onChange={(e) => setRow(index, { key: e.target.value })} />\n <select className={styles.configInput} aria-label=\"参数类型\" value={row.type}\n onChange={(e) => setRow(index, { type: e.target.value })}>\n {SCHEMA_TYPES.map((type) => <option key={type} value={type}>{type}</option>)}\n </select>\n <label className={styles.configEnable} title=\"required\">\n <input type=\"checkbox\" aria-label=\"必填\" checked={row.required}\n onChange={(e) => setRow(index, { required: e.target.checked })} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <input className={styles.configInput} aria-label=\"参数描述\" value={row.description} spellCheck={false} placeholder=\"描述\"\n onChange={(e) => setRow(index, { description: e.target.value })} />\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={`删除参数 ${row.key || index}`}\n onClick={() => commit(rows.filter((_, at) => at !== index))}>删除</button>\n </span>\n ))}\n <span>\n <button type=\"button\" className={styles.pillButton} onClick={() => commit([...rows, { key: '', type: 'string', required: false, description: '' }])}>\n 添加参数\n </button>\n </span>\n </span>\n )\n}\n\n/** 单张工具卡片(对齐模块列表卡片形态):header(enabled 开关 + chips + 上移/下移/复制/两段式删除)+ Field 表单。 */\nfunction CustomToolCard(props: {\n tool: ToolDraft\n index: number\n expanded: boolean\n onToggleExpanded: () => void\n onPatch: (patch: Partial<ToolDraft>) => void\n onToggleEnabled: (enabled: boolean) => void\n onMoveUp: () => void\n onMoveDown: () => void\n onDuplicate: () => void\n onRemove: () => void\n canMoveUp: boolean\n canMoveDown: boolean\n}): ReactNode {\n const { tool, index } = props\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const execute = asRecord(tool.execute)\n const kind = typeof execute.kind === 'string' ? execute.kind : 'shell'\n const name = typeof tool.name === 'string' ? tool.name : ''\n const id = typeof tool.id === 'string' ? tool.id : `tool-${index + 1}`\n const description = typeof tool.description === 'string' ? tool.description : ''\n const enabled = tool.enabled !== false\n const paramCount = Object.keys(asRecord(tool.parameters)).length\n const chips = [kind]\n if (paramCount > 0) chips.push(`${paramCount} 参数`)\n if (Number.isSafeInteger(tool.timeoutMs) && (tool.timeoutMs as number) > 0) chips.push(`timeout=${tool.timeoutMs}`)\n const patchExecute = (patch: Record<string, unknown>): void => {\n props.onPatch({ execute: { ...execute, ...patch } })\n }\n const patchJson = (field: string, value: ToolDraft | undefined): void => {\n props.onPatch({ [field]: value ?? {} })\n }\n return (\n <article className={clsx(styles.configCard, props.expanded && styles.configCardOpen)}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={props.onToggleExpanded}>\n <span className={styles.configTitle}>\n <span className={styles.configTitleRow}>\n <span className={styles.configName}>{name.length > 0 ? `${id} · ${name}` : id}</span>\n <span className={styles.configChip}>{kind}</span>\n </span>\n <span className={styles.configMeta}>{description || '(无描述)'}{chips.length > 1 && ` · ${chips.slice(1).join(' · ')}`}</span>\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} title={enabled ? '点击停用(enabled=false 不注册)' : '点击启用'}>\n <input type=\"checkbox\" aria-label={`启用工具 ${id}`} checked={enabled}\n onChange={(e) => props.onToggleEnabled(e.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} disabled={!props.canMoveUp} onClick={props.onMoveUp}>上移</button>\n <button type=\"button\" className={styles.pillButton} disabled={!props.canMoveDown} onClick={props.onMoveDown}>下移</button>\n <button type=\"button\" className={styles.pillButton} onClick={props.onDuplicate}>复制</button>\n {confirmingDelete ? (\n <>\n <button type=\"button\" className={styles.pillButton} data-danger onClick={props.onRemove}>确认删除</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(false)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>删除</button>\n )}\n </span>\n </span>\n </header>\n {props.expanded && (\n <div className={styles.configForm}>\n <span className={styles.variableRow}>\n <Field label=\"id(文件标识)\">\n <input className={styles.configInput} aria-label=\"工具 id\" value={id} spellCheck={false}\n onChange={(e) => props.onPatch({ id: e.target.value })} />\n </Field>\n <Field label=\"name(模型可见名)\">\n <input className={styles.configInput} aria-label=\"工具名\" value={name} spellCheck={false} placeholder=\"my_tool\"\n onChange={(e) => props.onPatch({ name: e.target.value })} />\n </Field>\n </span>\n <Field label=\"description(模型可见描述)\">\n <textarea className={styles.configTextarea} rows={2} aria-label=\"工具描述\" value={description} spellCheck={false}\n placeholder=\"描述该工具给模型看\"\n onChange={(e) => props.onPatch({ description: e.target.value })} />\n </Field>\n <Field label=\"execute.kind(执行器)\" hint=\"shell=命令;http=请求;delegate=委托内置/已注册工具;fs=工作区文件;ask-user=询问用户\">\n <select className={styles.configInput} aria-label=\"执行器\" value={kind}\n onChange={(e) => patchExecute({ kind: e.target.value })}>\n {KIND_OPTIONS.map((option) => <option key={option} value={option}>{option}</option>)}\n </select>\n </Field>\n {kind === 'shell' && (\n <>\n <Field label=\"command\" hint={'{{args.x}} 参数插值;env 白名单;cwd=会话工作区'}>\n <textarea className={styles.configTextarea} rows={3} aria-label=\"shell 命令\" spellCheck={false}\n value={typeof execute.command === 'string' ? execute.command : ''} placeholder=\"Write-Output {{args.x}}\"\n onChange={(e) => patchExecute({ command: e.target.value })} />\n </Field>\n <Field label=\"shell\" hint=\"pwsh 强制 UTF-8 输出(中文不乱码)\">\n <select className={styles.configInput} aria-label=\"shell\"\n value={typeof execute.shell === 'string' ? execute.shell : 'pwsh'}\n onChange={(e) => patchExecute({ shell: e.target.value })}>\n {SHELLS.map((shell) => <option key={shell} value={shell}>{shell}</option>)}\n </select>\n </Field>\n </>\n )}\n {kind === 'http' && (\n <>\n <Field label=\"url\" hint={'{{args.x}} 参数插值'}>\n <input className={styles.configInput} aria-label=\"请求 URL\" spellCheck={false}\n value={typeof execute.url === 'string' ? execute.url : ''} placeholder=\"https://…/{{args.q}}\"\n onChange={(e) => patchExecute({ url: e.target.value })} />\n </Field>\n <Field label=\"method\">\n <select className={styles.configInput} aria-label=\"请求方法\"\n value={typeof execute.method === 'string' ? execute.method : 'GET'}\n onChange={(e) => patchExecute({ method: e.target.value })}>\n {HTTP_METHODS.map((method) => <option key={method} value={method}>{method}</option>)}\n </select>\n </Field>\n </>\n )}\n {kind === 'delegate' && (\n <Field label=\"tool(委托目标)\" hint={`内置工具:${BUILTIN_TOOL_NAMES.join(' / ')}`}>\n <input className={styles.configInput} aria-label=\"委托目标工具\" spellCheck={false}\n value={typeof execute.tool === 'string' ? execute.tool : ''} placeholder=\"world_book_upsert\"\n onChange={(e) => patchExecute({ tool: e.target.value })} />\n </Field>\n )}\n {kind === 'fs' && (\n <>\n <Field label=\"action\">\n <select className={styles.configInput} aria-label=\"fs 动作\"\n value={typeof execute.action === 'string' && (FS_ACTIONS as readonly string[]).includes(execute.action) ? execute.action : 'read'}\n onChange={(e) => patchExecute({ action: e.target.value })}>\n {FS_ACTIONS.map((action) => <option key={action} value={action}>{action}</option>)}\n </select>\n </Field>\n <Field label=\"path\" hint=\"相对工作区路径;越界拒绝\">\n <input className={styles.configInput} aria-label=\"文件路径\" spellCheck={false}\n value={typeof execute.path === 'string' ? execute.path : ''} placeholder=\"data/{{args.name}}.json\"\n onChange={(e) => patchExecute({ path: e.target.value })} />\n </Field>\n </>\n )}\n {kind === 'ask-user' && (\n <Field label=\"question(向用户确认的问题)\">\n <input className={styles.configInput} aria-label=\"询问问题\" spellCheck={false}\n value={typeof execute.question === 'string' ? execute.question : ''} placeholder=\"是否继续执行该操作?\"\n onChange={(e) => patchExecute({ question: e.target.value })} />\n </Field>\n )}\n <ParameterRowsEditor\n value={asRecord(tool.parameters)}\n onChange={(next) => props.onPatch({ parameters: next })}\n />\n <Field label=\"output.schema(JSON;默认开放对象)\">\n <textarea className={styles.configTextarea} rows={4} aria-label=\"输出 schema JSON\" spellCheck={false}\n value={JSON.stringify(asRecord(tool.output), null, 2) === '{}' ? '' : JSON.stringify(asRecord(tool.output), null, 2)}\n onChange={(e) => {\n const text = e.target.value.trim()\n if (text.length === 0) { props.onPatch({ output: { schema: { type: 'object', additionalProperties: true } } }); return }\n try { patchJson('output', JSON.parse(text) as ToolDraft) } catch { /* 解析失败不落盘 */ }\n }} />\n </Field>\n </div>\n )}\n </article>\n )\n}\n/** 工具管理区块(tool-pipeline 层可见):标题 + 工具卡片列表。 */\nexport function CustomToolsModuleCard(props: {\n expanded: boolean\n onToggleExpanded: () => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n}): ReactNode {\n const [tools, setTools] = useState<ToolDraft[]>([])\n const [toolTemplates, setToolTemplates] = useState<Array<{ file: string; spec: ToolDraft }>>([])\n const [pickerOpen, setPickerOpen] = useState(false)\n const [expandedCards, setExpandedCards] = useState<Set<number>>(new Set())\n const [loaded, setLoaded] = useState(false)\n const [saving, setSaving] = useState(false)\n useEffect(() => {\n if (loaded || !props.expanded) return\n void (async () => {\n const [customResult, templatesResult] = await Promise.all([\n bridgePost<{ customTools?: unknown[] }>('/custom-tools', {}),\n bridgePost<{ toolTemplates?: Array<{ file: string; spec: ToolDraft }> }>('/templates', {}),\n ])\n setTools((customResult.ok ? customResult.value?.customTools ?? [] : []).map((tool) => asRecord(tool)))\n setToolTemplates(templatesResult.ok ? templatesResult.value?.toolTemplates ?? [] : [])\n setLoaded(true)\n })()\n }, [props.expanded, loaded])\n const save = (): void => {\n // 保存前清理:工具 parameters 的空 key 待编辑行(与 presetVariables 保存端清理对齐)。\n const cleanTools = tools.map((tool) => {\n const params = asRecord(tool.parameters)\n const clean: ToolDraft = {}\n for (const [key, value] of Object.entries(params)) {\n if (key.trim().length === 0) continue\n clean[key] = value\n }\n const next = { ...tool }\n if (Object.keys(clean).length > 0) next.parameters = clean\n else delete next.parameters\n return next\n })\n setSaving(true)\n void bridgePost<{ customTools?: unknown[] }>('/custom-tools', { customTools: cleanTools }).then((customResult) => {\n setSaving(false)\n if (customResult.ok) {\n props.onNotice('ok', `已保存 ${tools.length} 个自定义工具(已重建)`)\n } else {\n props.onNotice('error', ('message' in customResult ? customResult.message : undefined) ?? '保存失败')\n }\n })\n }\n const insertTemplate = (spec: ToolDraft): void => {\n if (tools.some((tool) => tool.id === spec.id)) {\n props.onNotice('error', `工具 id 已存在:${String(spec.id)}`)\n return\n }\n const clone = JSON.parse(JSON.stringify(spec)) as ToolDraft\n setTools([...tools, clone])\n setExpandedCards(new Set([...expandedCards, tools.length]))\n props.onNotice('ok', `已插入工具模板 ${String(spec.id)}(保存后生效)`)\n setPickerOpen(false)\n }\n const patchTool = (index: number, patch: Partial<ToolDraft>): void => {\n setTools(tools.map((tool, at) => at === index ? { ...tool, ...patch } : tool))\n }\n const toggleCard = (index: number): void => {\n const next = new Set(expandedCards)\n if (next.has(index)) next.delete(index)\n else next.add(index)\n setExpandedCards(next)\n }\n return (\n <section aria-label=\"自定义工具\">\n <div className={clsx(styles.sectionHeading, styles.toolHeading)}>\n <div>\n <h2>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={props.onToggleExpanded}>\n <span className={styles.configName}>自定义工具<span className={styles.toolHeadingDot} aria-hidden=\"true\" /></span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n </h2>\n <p>{`${tools.length} 个自定义工具 · 第三方策略见下方模块卡片`}</p>\n </div>\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} onClick={() => setPickerOpen(true)}>从模板新建</button>\n <button type=\"button\" className={styles.pillButton}\n onClick={() => setTools([...tools, {\n id: `tool-${tools.length + 1}`,\n name: 'my_tool',\n description: '',\n output: { schema: { type: 'object', additionalProperties: true } },\n execute: { kind: 'shell', command: '' },\n }])}>\n 添加工具\n </button>\n <button type=\"button\" className={styles.primaryPill} disabled={saving} onClick={save}>\n {saving ? '保存中…' : '保存'}\n </button>\n </span>\n </div>\n {props.expanded && (\n <div className={styles.configList} style={{ marginTop: 10 }}>\n {tools.map((tool, index) => (\n <CustomToolCard\n key={`${String(tool.id ?? '')}-${index}`}\n tool={tool}\n index={index}\n expanded={expandedCards.has(index)}\n onToggleExpanded={() => toggleCard(index)}\n onPatch={(patch) => patchTool(index, patch)}\n onToggleEnabled={(enabled) => patchTool(index, { enabled })}\n onMoveUp={() => setTools(tools.map((item, at) => {\n if (at === index) return tools[index - 1]!\n if (at === index - 1) return tools[index]!\n return item\n }))}\n onMoveDown={() => setTools(tools.map((item, at) => {\n if (at === index) return tools[index + 1]!\n if (at === index + 1) return tools[index]!\n return item\n }))}\n onDuplicate={() => setTools([...tools.slice(0, index + 1), {\n ...JSON.parse(JSON.stringify(tool)) as ToolDraft,\n id: `${String(tool.id ?? 'tool')}-copy`,\n }, ...tools.slice(index + 1)])}\n onRemove={() => setTools(tools.filter((_, at) => at !== index))}\n canMoveUp={index > 0}\n canMoveDown={index < tools.length - 1}\n />\n ))}\n {tools.length === 0 && <p className={styles.configFieldHint}>{'无自定义工具;从模板新建或直接添加。'}</p>}\n </div>\n )}\n {pickerOpen && (\n <TemplatePicker\n templates={[]}\n toolTemplates={toolTemplates}\n onPick={() => {}}\n onPickTool={insertTemplate}\n onClose={() => setPickerOpen(false)}\n />\n )}\n </section>\n )\n}\n","import { useEffect, useRef, useState, type FocusEvent, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { PromptConfigList } from './PromptConfigList.tsx'\nimport { TemplatePicker } from './TemplatePicker.tsx'\nimport { useTemplatePicker } from './useTemplatePicker.ts'\nimport { VariablesEditor } from './PromptConfigCard.tsx'\nimport { EngineModuleCards, ModelRouteModuleCard } from './EngineModuleCards.tsx'\nimport { CustomToolsModuleCard } from './CustomToolsModuleCard.tsx'\nimport styles from './PromptUi.module.css'\n\nimport type { EngineMeta, PromptConfigDraft } from './prompt-tool-types.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\nexport type { PromptConfigDraft, LayerFieldPolicy } from './prompt-tool-types.ts'\nexport type { ValidationErrorEntry } from './prompt-tool-types.ts'\nexport { Field, JsonField, PromptConfigCard, PromptConfigForm, SOURCE_FORMS, SOURCE_KINDS, fieldPolicyFor } from './PromptConfigCard.tsx'\n\nexport type { PromptConfigTemplateEntry } from './prompt-tool-types.ts'\n\nexport interface PromptConfigsEditorProps {\n meta: EngineMeta\n configs: PromptConfigDraft[]\n savedConfigs: PromptConfigDraft[]\n onPatchConfigs: (configs: PromptConfigDraft[]) => void\n onSaveConfigs: (configs: PromptConfigDraft[]) => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n /** 预设级模板变量(preset.yml 顶层 variables 段;编辑入口与模块列表统一)。 */\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n /** 引擎模块配置(tool-bootstrap 等组合行 config 卡片,同模块列表形态)。 */\n store: PromptToolStore\n}\n\n/** 预设级模板变量模块卡片(归类于配置列表下):{{key}} 插值源,非 promptConfig——\n * 不进配置保存路径,保存走 /preset-variables 写 preset.yml 顶层 variables 段。\n * 可折叠(chevron)/ 可删除(清空全部变量,两段式确认)/ 可新建(VariablesEditor 添加变量)。 */\nfunction TemplateVariablesModuleCard(props: {\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n expanded: boolean\n onToggleExpanded: () => void\n}): ReactNode {\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const cardRef = useRef<HTMLElement>(null)\n const count = Object.keys(props.templateVariables).length\n const enabled = props.templateVariablesEnabled\n // 无变量时不显示卡片(模块列表恢复干净;「新建 → Variables」添加空行后自动出现)。\n if (count === 0) return null\n const clearAll = (): void => {\n props.setTemplateVariables({})\n void props.saveTemplateVariables({})\n setConfirmingDelete(false)\n if (props.expanded) props.onToggleExpanded()\n }\n /** 失焦自动保存:焦点离开卡片容器(含收起/切换开关/点击删除)即持久化。 */\n const autoSaveOnBlur = (event: FocusEvent<HTMLElement>): void => {\n const next = event.relatedTarget\n if (next === null || !cardRef.current?.contains(next as Node)) {\n void props.saveTemplateVariables()\n }\n }\n return (\n <article ref={cardRef} className={styles.configCard} onBlur={autoSaveOnBlur}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={props.onToggleExpanded}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>模板变量</span>\n <span className={styles.configMeta}>{`预设级 {{key}} 插值 · ${count} 个变量`}</span>\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} title={enabled ? '点击停用模板变量插值' : '点击启用模板变量插值'}>\n <input\n type=\"checkbox\"\n aria-label=\"启用模板变量插值\"\n checked={enabled}\n onChange={(e) => {\n props.setTemplateVariablesEnabled(e.target.checked)\n void props.saveTemplateVariables()\n }}\n />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <span className={styles.configActions}>\n {confirmingDelete ? (\n <>\n <button type=\"button\" className={styles.pillButton} data-danger onClick={clearAll}>确认清空</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(false)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>删除</button>\n )}\n </span>\n </span>\n </header>\n {props.expanded && (\n <div className={styles.configForm}>\n {!enabled && <p className={styles.configFieldHint}>{'模板变量插值已停用:{{key}} 将不再被替换(预设级变量文件不生成)。'}</p>}\n <VariablesEditor value={props.templateVariables} onChange={(next) => props.setTemplateVariables(next ?? {})} />\n </div>\n )}\n </article>\n )\n}\n\n\n/** 提示词配置编辑器:配置列表(层级/策略过滤已并入列表)+ 模板插入 + 保存前权威校验。 */\nexport function PromptConfigsEditor(props: PromptConfigsEditorProps): ReactNode {\n const [templateVarsExpanded, setTemplateVarsExpanded] = useState(false)\n const [customToolsExpanded, setCustomToolsExpanded] = useState(false)\n /** 层筛选状态(模块列表下拉联动引擎模块卡:选中层只显示该层引擎模块)。 */\n const [layerFilter, setLayerFilter] = useState('all')\n // 进入 tool-pipeline 层时自动展开工具管理(工具域视图)。\n useEffect(() => {\n if (layerFilter === 'tool-pipeline') setCustomToolsExpanded(true)\n }, [layerFilter])\n const templatePicker = useTemplatePicker(\n props.configs,\n (config) => props.onPatchConfigs([...props.configs, config]),\n props.onNotice,\n )\n /** 「新建 → Variables」:展开模板变量卡片并添加一个待编辑空行。 */\n const pickVariables = (): void => {\n props.setTemplateVariables({ ...props.templateVariables, '': '' })\n setTemplateVarsExpanded(true)\n templatePicker.closePicker()\n }\n return (\n <section className={styles.page} aria-label=\"提示词配置\">\n <div className={styles.configList}>\n <ModelRouteModuleCard store={props.store} scope=\"main\" />\n <EngineModuleCards store={props.store} layerFilter={layerFilter} />\n </div>\n <PromptConfigList\n meta={props.meta}\n configs={props.configs}\n savedConfigs={props.savedConfigs}\n viewFilter={layerFilter}\n onViewFilterChange={setLayerFilter}\n extraActions={<button type=\"button\" className={styles.primaryPill} onClick={templatePicker.openPicker}>新建</button>}\n beforeCards={\n <>\n {layerFilter === 'tool-pipeline' && (\n <CustomToolsModuleCard\n expanded={customToolsExpanded}\n onToggleExpanded={() => setCustomToolsExpanded(!customToolsExpanded)}\n onNotice={props.onNotice}\n />\n )}\n <TemplateVariablesModuleCard\n templateVariables={props.templateVariables}\n setTemplateVariables={props.setTemplateVariables}\n templateVariablesEnabled={props.templateVariablesEnabled}\n setTemplateVariablesEnabled={props.setTemplateVariablesEnabled}\n saveTemplateVariables={props.saveTemplateVariables}\n expanded={templateVarsExpanded}\n onToggleExpanded={() => setTemplateVarsExpanded(!templateVarsExpanded)}\n />\n </>\n }\n onPatchConfigs={props.onPatchConfigs}\n onSaveConfigs={props.onSaveConfigs}\n onNotice={props.onNotice}\n />\n\n {templatePicker.open && (\n <TemplatePicker\n templates={templatePicker.templates}\n onPick={templatePicker.pickTemplate}\n onPickVariables={pickVariables}\n onClose={templatePicker.closePicker}\n />\n )}\n\n <p className={styles.settingsNote}>提示词配置写入 <code>settings.promptConfigs</code>;外部提示词配置可经「预设配置 → 导入预设」引入。</p>\n </section>\n )\n}\n","/** fields 订阅式选择器(L3 selector 化):\n * 组件通过 useSyncExternalStore 订阅 store.fields 的引用变化,仅在所选切片\n * 变化时重渲染——配合 React.memo 组件,父级重渲染不再级联触发子组件。\n * 注意 selector 只在 fields 引用变化时执行一次,返回引用由组件 ref 缓存。\n */\nimport { useRef, useSyncExternalStore } from 'react'\nimport type { Fields } from './prompt-tool-bridge.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\nexport function usePromptToolFields<T>(store: PromptToolStore, selector: (fields: Fields) => T): T {\n const fields = useSyncExternalStore(store.subscribeFields, store.getFields, store.getFields)\n const cache = useRef<{ fields: Fields | undefined; value: T }>({ fields: undefined, value: undefined as unknown as T })\n if (cache.current.fields !== fields) {\n cache.current = { fields, value: selector(fields) }\n }\n return cache.current.value\n}","/** 预设切换器:预设全部在用户目录(首次启动种子化),列表点击切换;新建 = 从内置模板复制还原。 */\nimport { memo, useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react'\nimport { usePromptToolFields } from './use-prompt-tool-fields.ts'\nimport clsx from 'clsx'\nimport { IconCopyOutline16, IconFolderOpenOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\nimport styles from './PromptUi.module.css'\n\nexport const PresetSwitcher = memo(function PresetSwitcher(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = usePromptToolFields(store, (value) => value)\n const presets = store.meta.presets ?? []\n const templates = store.meta.builtinTemplates ?? []\n const [importing, setImporting] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState<string | undefined>(undefined)\n const [pickerOpen, setPickerOpen] = useState(false)\n const dialogRef = useRef<HTMLDivElement>(null)\n const yamlRef = useRef<HTMLInputElement>(null)\n const dirRef = useRef<HTMLInputElement>(null)\n\n // 新建弹窗:聚焦首控件 + Esc 关闭。\n useEffect(() => {\n if (!pickerOpen) return\n dialogRef.current?.querySelector<HTMLElement>('button')?.focus()\n const onKeyDown = (event: globalThis.KeyboardEvent): void => {\n if (event.key === 'Escape') setPickerOpen(false)\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [pickerOpen])\n\n /** 上传预设包:path 为相对路径(preset.yml 或文件夹内文件),服务端按 id 归入用户预设目录。 */\n const uploadPreset = async (entries: Array<{ path: string; content: string }>): Promise<void> => {\n if (entries.length === 0) return\n setImporting(true)\n try {\n const res = await bridgePost<{ id: string }>('/import-preset-package', { files: entries })\n if (res.ok) {\n store.showNotice('ok', `预设 ${res.value.id} 已导入,点击卡片即可切换`)\n await store.load()\n } else {\n store.showNotice('error', '导入预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setImporting(false)\n }\n }\n\n /** 导入单个配置文件:preset.yml / 任意 *.yml/*.yaml / SillyTavern *.json(服务端按扩展名分流)。 */\n const pickPresetYaml = (file: File | undefined): void => {\n if (file === undefined) return\n void (async () => {\n const path = /\\.json$/i.test(file.name) ? file.name : 'preset.yml'\n await uploadPreset([{ path, content: await file.text() }])\n })()\n }\n\n /** 导入整个预设文件夹(webkitdirectory;传原始相对路径,顶层目录段由服务端剥离)。 */\n const pickPresetDir = (files: FileList | null): void => {\n if (files === null || files.length === 0) return\n void (async () => {\n const entries: Array<{ path: string; content: string }> = []\n for (const file of Array.from(files)) {\n entries.push({ path: file.webkitRelativePath || file.name, content: await file.text() })\n }\n await uploadPreset(entries)\n })()\n }\n\n /** 导出当前预设为单文件配置(浏览器下载,可保存到任意目录)。 */\n const exportPreset = async (): Promise<void> => {\n const res = await bridgePost<{ id: string; name: string; content: string }>('/export-preset', { id: fields.presetTemplate })\n if (!res.ok) {\n store.showNotice('error', '导出预设失败:' + (res.message ?? 'settings bridge unavailable'))\n return\n }\n const blob = new Blob([res.value.content], { type: 'application/yaml' })\n const url = URL.createObjectURL(blob)\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = `${res.value.id}.preset.yml`\n anchor.click()\n URL.revokeObjectURL(url)\n store.showNotice('ok', `已导出 ${res.value.id}.preset.yml(单文件配置,可保存到任意目录)`)\n }\n\n /** 删除预设(物理删除用户目录副本;插件目录模板保留,可经「新建预设」还原)。 */\n const deletePreset = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-delete', { id })\n if (res.ok) {\n setConfirmingDelete(undefined)\n store.showNotice('ok', `预设 ${id} 已删除(可经「新建预设」从内置模板还原)`)\n await store.load()\n } else {\n store.showNotice('error', '删除预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 复制预设:用户目录完整副本,id 自动递增(<id>-copy / <id>-copy-2 / …)。 */\n const duplicatePreset = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-duplicate', { id })\n if (res.ok) {\n store.showNotice('ok', `已复制为预设 ${res.value.id}`)\n await store.load()\n } else {\n store.showNotice('error', '复制预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 打开预设文件夹(宿主系统文件管理器;失败时提示路径)。 */\n const openLocation = async (id: string): Promise<void> => {\n const res = await bridgePost<{ path: string }>('/preset-open', { id })\n if (res.ok) {\n store.showNotice('ok', `已打开预设文件夹:${res.value.path}`)\n } else {\n store.showNotice('error', '打开预设文件夹失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 新建:从插件目录模板复制到用户目录(还原/自定义起点);自定义入口重名自动递增。 */\n const clonePreset = async (id: string, autoSuffix = false): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-clone', { id, autoSuffix })\n if (res.ok) {\n setPickerOpen(false)\n store.showNotice('ok', `已从内置模板新建预设 ${res.value.id}`)\n await store.load()\n } else {\n store.showNotice('error', '新建预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n const onDialogKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (event.key !== 'Tab' || dialogRef.current === null) return\n const focusables = [...dialogRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )].filter((element) => !element.hasAttribute('disabled'))\n if (focusables.length === 0) return\n const first = focusables[0]!\n const last = focusables[focusables.length - 1]!\n const active = document.activeElement\n if (event.shiftKey) {\n if (active === first || !dialogRef.current.contains(active)) {\n event.preventDefault()\n last.focus()\n }\n } else if (active === last || !dialogRef.current.contains(active)) {\n event.preventDefault()\n first.focus()\n }\n }\n\n return (\n <div className={styles.rowGroup}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>预设模板</strong>\n <small>预设保存在用户目录(首次启动自动内置全部模板);点击卡片即切换并按新模板重建生成目录。删除后可从内置模板「新建」还原;导入预设 = 选择 preset.yml / 任意 *.yml/*.yaml / SillyTavern *.json 配置文件,或整个预设文件夹。</small>\n </span>\n <span className={styles.inlineControls}>\n <input\n ref={yamlRef}\n type=\"file\"\n accept=\".yml,.yaml,.json\"\n className={styles.visuallyHidden}\n aria-label=\"选择 preset.yml / SillyTavern JSON 配置文件\"\n onChange={(event) => { pickPresetYaml(event.target.files?.[0]); event.target.value = '' }}\n />\n <input\n ref={dirRef}\n type=\"file\"\n // @ts-expect-error webkitdirectory 为 Chromium 扩展属性(文件夹选择)。\n webkitdirectory=\"\"\n className={styles.visuallyHidden}\n aria-label=\"选择预设文件夹\"\n onChange={(event) => { pickPresetDir(event.target.files); event.target.value = '' }}\n />\n <button type=\"button\" className={styles.primaryPill} onClick={() => setPickerOpen(true)}>新建预设</button>\n <button type=\"button\" className={styles.pillButton} disabled={importing} onClick={() => yamlRef.current?.click()}>\n {importing ? '导入中…' : '导入预设'}\n </button>\n <button type=\"button\" className={styles.pillButton} disabled={importing} onClick={() => dirRef.current?.click()}>\n 导入文件夹\n </button>\n <button type=\"button\" className={styles.pillButton} onClick={() => void exportPreset()}>\n 导出预设\n </button>\n </span>\n </div>\n <div className={styles.presetGrid}>\n {presets.length === 0 ? (\n <p className={styles.readOnly} role=\"status\">暂无预设;点击上方「新建预设」从内置模板创建,或「导入预设」添加。</p>\n ) : presets.map((preset) => renderCard(preset))}\n </div>\n {pickerOpen && (\n <div className={styles.modalBackdrop} onClick={() => setPickerOpen(false)}>\n <div\n ref={dialogRef}\n className={styles.templateModal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"从内置模板新建预设\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={onDialogKeyDown}\n >\n <div className={styles.templateModalHead}>\n <strong>从内置模板新建预设</strong>\n <button type=\"button\" className={styles.pillButton} aria-label=\"关闭模板选择\" onClick={() => setPickerOpen(false)}>×</button>\n </div>\n <div className={styles.templateModalList}>\n {templates.length === 0 && <p className={styles.configFieldHint}>插件目录无内置模板。</p>}\n <button type=\"button\" className={styles.templateModalItem} data-custom\n title=\"新建一份所有参数为空的自定义预设(重名自动加序号)\"\n onClick={() => void clonePreset('custom', true)}>\n <strong>自定义预设</strong>\n <small>custom · 所有参数为空(空白起点,重名自动加序号)</small>\n </button>\n {templates.map((template) => (\n <button key={template.id} type=\"button\" className={styles.templateModalItem}\n title={`新建到用户目录:${template.id}`} onClick={() => void clonePreset(template.id)}>\n <strong>{template.name}</strong>\n <small>{template.id}</small>\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n\n function renderCard(preset: { id: string; name: string; description?: string }): ReactNode {\n const active = fields.presetTemplate === preset.id\n const confirming = confirmingDelete === preset.id\n return (\n <div key={preset.id} className={clsx(styles.presetCard, active && styles.presetCardActive)}\n data-active={active ? '' : undefined}>\n <button type=\"button\" className={styles.presetCardMain} disabled={!fields.writePreset}\n title={active ? '当前预设模板' : `切换到 ${preset.name}`}\n onClick={() => store.setPresetTemplate(preset.id)}>\n <span className={styles.presetCardHead}>\n <strong className={styles.presetCardName}>{preset.name}</strong>\n {active && <span className={styles.presetInUse}>使用中</span>}\n </span>\n {preset.description !== undefined && preset.description.length > 0\n && <p className={styles.presetCardDesc}>{preset.description}</p>}\n <code className={styles.presetCardId}>{preset.id}</code>\n </button>\n <span className={styles.presetCardFooter}>\n <button type=\"button\" className={styles.presetIconButton} data-tip=\"复制预设\"\n aria-label={`复制预设:${preset.name}`}\n onClick={() => void duplicatePreset(preset.id)}>\n <IconCopyOutline16 />\n </button>\n <button type=\"button\" className={styles.presetIconButton} data-tip=\"打开预设文件夹\"\n aria-label={`打开预设文件夹:${preset.name}`}\n onClick={() => void openLocation(preset.id)}>\n <IconFolderOpenOutline16 />\n </button>\n {confirming ? (\n <span className={styles.presetCardActions}>\n <button type=\"button\" className={styles.pillButton} data-danger disabled={active}\n title=\"删除后可从内置模板「新建」还原\" onClick={() => void deletePreset(preset.id)}>确认删除</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(undefined)}>取消</button>\n </span>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger disabled={active}\n title={active ? '先切换其他预设再删除' : '删除用户目录副本(内置模板保留,可新建还原)'}\n onClick={() => setConfirmingDelete(preset.id)}>删除</button>\n )}\n </span>\n </div>\n )\n }\n})\n","/** 开关行:label + hint + 可选 extra + checkbox。 */\nimport type { ReactNode } from 'react'\nimport styles from './PromptUi.module.css'\n\nexport function ToggleRow(props: { id: string; label: string; hint: string; checked: boolean; disabled?: boolean; extra?: ReactNode; onChange: (value: boolean) => void }): ReactNode {\n return (\n <label className={styles.toggleRow} htmlFor={props.id}>\n <span className={styles.settingCopy}><strong>{props.label}</strong><small>{props.hint}</small></span>\n {props.extra}\n <input id={props.id} type=\"checkbox\" aria-label={props.label} checked={props.checked} disabled={props.disabled} onChange={(event) => props.onChange(event.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n )\n}\n","/** 通用折叠卡片:设置区块统一折叠入口(除模块列表外全部卡片化)。 */\nimport { useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './PromptUi.module.css'\n\nexport function CollapsibleCard(props: {\n id: string\n title: string\n meta?: string\n children: ReactNode\n defaultOpen?: boolean\n}): ReactNode {\n const [open, setOpen] = useState(props.defaultOpen ?? false)\n return (\n <article className={clsx(styles.configCard, open && styles.configCardOpen)}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={open} onClick={() => setOpen((value) => !value)}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>{props.title}</span>\n {props.meta !== undefined && <span className={styles.configMeta}>{props.meta}</span>}\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, open && styles.chevronOpen)} />\n </button>\n </header>\n {open && <div className={styles.configForm}>{props.children}</div>}\n </article>\n )\n}\n","/** 设置输入行:编辑框失焦即保存(与 anchor 文本一致)。 */\nimport type { ReactNode } from 'react'\nimport ui from './PromptUi.module.css'\n\nexport function SettingInputRow(props: {\n id: string\n label: string\n hint: string\n value: string\n type?: 'text' | 'number'\n placeholder?: string\n disabled?: boolean\n onInput: (value: string) => void\n onCommit: () => void\n}): ReactNode {\n return (\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}><strong>{props.label}</strong><small>{props.hint}</small></span>\n <div className={ui.directoryControl}>\n <input\n id={props.id}\n className={ui.directoryInput}\n type={props.type ?? 'text'}\n value={props.value}\n aria-label={props.label}\n placeholder={props.placeholder}\n disabled={props.disabled}\n spellCheck={false}\n autoComplete=\"off\"\n onChange={(event) => props.onInput(event.target.value)}\n onBlur={props.onCommit}\n />\n </div>\n </div>\n </div>\n )\n}\n","/** 「预设和配置」页:全局开关 + 预设切换/导入 + 提示词配置列表统一管理。 */\nimport { memo, type ReactNode } from 'react'\nimport { usePromptToolFields } from './use-prompt-tool-fields.ts'\nimport { PresetSwitcher } from './PresetSwitcher.tsx'\nimport { ToggleRow } from './ToggleRow.tsx'\nimport { CollapsibleCard } from './CollapsibleCard.tsx'\nimport { SettingInputRow } from './SettingInputRow.tsx'\nimport ui from './PromptUi.module.css'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\nexport const PresetsPage = memo(function PresetsPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = usePromptToolFields(store, (value) => value)\n return (\n <>\n <section className={ui.section} aria-label=\"全局开关\">\n <div className={ui.rowGroup}>\n <ToggleRow id=\"pt-write-preset\" label=\"全局开关\" hint=\"预设生成总开关,作用于全部六个层级:开启时生成并刷新生成目录;关闭时移除生成目录。关闭/开启后自动重新加载模块卡片。\"\n checked={fields.writePreset} onChange={() => store.toggle('writePreset')} />\n </div>\n </section>\n <CollapsibleCard id=\"pt-host-generated\" title=\"AGENTS.md 与生成目录\" meta=\"全局常驻注入、生成路径与显示顺序\">\n <div className={ui.rowGroup}>\n <ToggleRow id=\"pt-write-agents\" label=\"写入 ~/.dsh/AGENTS.md\" hint=\"保持 AGENTS.md 的全局常驻注入;关闭后不再写入,已有文件保持原样。与六层注入无关,属于宿主常驻层。\"\n checked={fields.writeAgents} onChange={() => store.toggle('writeAgents')} />\n </div>\n <SettingInputRow id=\"pt-resident-agents-path\" label=\"AGENTS.md 常驻路径\" hint=\"写入/移除 AGENTS.md 受管块的目标文件;修改后下一次开关保存立即切换。\"\n value={fields.residentAgentsPath} placeholder={fields.residentAgentsPath || '默认 ~/.dsh/AGENTS.md'}\n onInput={(value) => store.patch({ residentAgentsPath: value })}\n onCommit={store.persistSwitches} />\n <SettingInputRow id=\"pt-preset-dir\" label=\"预设根目录\" hint=\"预设根目录(官方 USER_PRESET_DIR);每个预设一个官方预设目录,修改后下次写入会生成到新根,建议同时在宿主 agent-presets 设置里选择该目录。\"\n value={fields.presetDir} placeholder={fields.presetDir || '默认 ~/.dsh/.agent-presets'}\n onInput={(value) => store.patch({ presetDir: value })}\n onCommit={store.persistSwitches} />\n <SettingInputRow id=\"pt-preset-order\" label=\"preset 显示顺序\" hint=\"生成 preset.yml 的 order;数值小的 preset 在宿主列表中靠前。\"\n type=\"number\" value={String(fields.presetOrder)}\n onInput={(value) => store.patch({ presetOrder: Number(value) || 0 })}\n onCommit={store.persistSwitches} />\n </CollapsibleCard>\n <PresetSwitcher store={store} />\n </>\n )\n})\n","/** SillyTavern 角色卡 PNG 解析(对齐官方 public/scripts/utils.js extractDataFromPng):\n * PNG tEXt chunk,关键字 ccv3(v3 优先)/ chara(v2 兜底),值为 base64 编码的\n * 角色卡 JSON。官方仅解 V1 明文(JSON.parse(atob(...)));本实现增加 V2\n * (base64(zlib(JSON)))deflate 回退,为官方实现的超集扩展。\n * 浏览器端解析字节流,不依赖第三方库。 */\n\nexport interface CharacterCardData {\n /** 角色卡 JSON 文本(chara_card_v2/v3,含 data 内层正文)。 */\n jsonText: string\n /** 角色名(顶层 name 或 data.name,缺省回退文件名)。 */\n name: string\n /** 原图 base64(dataURL 逗号后部分,落盘为 avatar.png)。 */\n imageBase64: string\n}\n\nfunction readU32(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset]! << 24) >>> 0) + (bytes[offset + 1]! << 16) + (bytes[offset + 2]! << 8) + bytes[offset + 3]!\n}\n\n/** tEXt 文本为 Latin-1(PNG 规范);关键字/值经此解码后 base64 解出 UTF-8 JSON。 */\nfunction latin1(bytes: Uint8Array): string {\n let text = ''\n for (const byte of bytes) text += String.fromCharCode(byte)\n return text\n}\n\nasync function decodeBase64(text: string): Promise<string> {\n const binary = atob(text)\n const bytes = new Uint8Array(binary.length)\n for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index)\n // V1:明文 base64(JSON);V2:base64(zlib(JSON))——明文 JSON 解析失败时 inflate 回退\n // (对齐官方 utils.js extractDataFromPng 并扩展 V2;与 scripts/extract-st-character.mjs 的 parseChara 同法)。\n const plain = new TextDecoder('utf-8').decode(bytes)\n try {\n JSON.parse(plain)\n return plain\n } catch {\n const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream('deflate'))\n return new TextDecoder('utf-8').decode(await new Response(stream).arrayBuffer())\n }\n}\n\n/** 解析角色卡 PNG:返回角色卡 JSON + 原图 base64。非 PNG / 无角色卡 chunk 抛错。 */\nexport async function parseCharacterCardPng(buffer: ArrayBuffer, fileName: string): Promise<CharacterCardData> {\n const bytes = new Uint8Array(buffer)\n if (bytes.length < 24 || bytes[0] !== 0x89 || bytes[1] !== 0x50 || bytes[2] !== 0x4e || bytes[3] !== 0x47) {\n throw new Error('不是有效的 PNG 文件')\n }\n const chunks: Array<{ keyword: string; text: string }> = []\n let offset = 8\n while (offset + 12 <= bytes.length) {\n const length = readU32(bytes, offset)\n const type = latin1(bytes.subarray(offset + 4, offset + 8))\n const dataStart = offset + 8\n const dataEnd = dataStart + length\n if (type === 'tEXt') {\n let separator = dataStart\n while (separator < dataEnd && bytes[separator] !== 0) separator += 1\n chunks.push({\n keyword: latin1(bytes.subarray(dataStart, separator)).toLowerCase(),\n text: latin1(bytes.subarray(separator + 1, dataEnd)),\n })\n }\n if (type === 'IEND') break\n offset = dataEnd + 4 // 跳过 CRC\n }\n const card = chunks.find((chunk) => chunk.keyword === 'ccv3') ?? chunks.find((chunk) => chunk.keyword === 'chara')\n if (card === undefined) {\n throw new Error('PNG 不含角色卡数据(无 chara/ccv3 tEXt chunk)')\n }\n const jsonText = await decodeBase64(card.text)\n let name = ''\n try {\n const parsed = JSON.parse(jsonText) as { name?: unknown; data?: { name?: unknown } }\n if (typeof parsed.name === 'string' && parsed.name.trim().length > 0) name = parsed.name.trim()\n else if (parsed.data !== null && typeof parsed.data === 'object'\n && typeof parsed.data.name === 'string' && parsed.data.name.trim().length > 0) {\n name = parsed.data.name.trim()\n }\n } catch (error) {\n throw new Error(`角色卡 JSON 解析失败:${error instanceof Error ? error.message : String(error)}`)\n }\n const base64 = (() => {\n let binary = ''\n const chunkSize = 0x8000\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize))\n }\n return btoa(binary)\n })()\n return { jsonText, name: name || fileName.replace(/\\.png$/i, ''), imageBase64: base64 }\n}\n","/** 角色管理页:角色卡库(PNG / JSON 素材 + 转换参数独立存储)。\n * 库中角色卡不直接生成预设——点击「导入到当前预设」把角色卡参数\n * (角色设定 / 系统提示 / 开场白 / 提示词库 / 采样参数)合并进当前激活预设,\n * 已导入的角色卡显示状态并可一键移除。 */\nimport { memo, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { IconFolderOpenOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport { parseCharacterCardPng } from './character-card.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\nimport ui from './PromptUi.module.css'\n\ninterface CharacterCardItem {\n id: string\n name: string\n description?: string\n hasAvatar: boolean\n imported: boolean\n}\n\nexport const CharactersPage = memo(function CharactersPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const [importing, setImporting] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState<string | undefined>(undefined)\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [characters, setCharacters] = useState<CharacterCardItem[]>([])\n const pngRef = useRef<HTMLInputElement>(null)\n const jsonRef = useRef<HTMLInputElement>(null)\n\n const loadCharacters = async (): Promise<void> => {\n const res = await bridgePost<{ characters: CharacterCardItem[] }>('/characters-list', {})\n if (res.ok) setCharacters(res.value.characters)\n }\n useEffect(() => {\n void loadCharacters()\n }, [])\n\n /** 导入角色卡入库(PNG 解析出 JSON + 原图,JSON 直传)。 */\n const importCard = async (files: FileList | null): Promise<void> => {\n if (files === null || files.length === 0) return\n setImporting(true)\n try {\n for (const file of Array.from(files)) {\n if (/\\.png$/i.test(file.name)) {\n const buffer = await file.arrayBuffer()\n const card = await parseCharacterCardPng(buffer, file.name)\n const res = await bridgePost<{ id: string; name: string }>('/characters-import', {\n files: [\n { path: 'avatar.png', content: card.imageBase64 },\n { path: `${card.name}.json`, content: card.jsonText },\n ],\n })\n if (res.ok) store.showNotice('ok', `角色卡「${res.value.name}」已入库`)\n else store.showNotice('error', '角色卡入库失败:' + (res.message ?? 'settings bridge unavailable'))\n } else if (/\\.json$/i.test(file.name)) {\n const res = await bridgePost<{ id: string; name: string }>('/characters-import', {\n files: [{ path: file.name, content: await file.text() }],\n })\n if (res.ok) store.showNotice('ok', `角色卡「${res.value.name}」已入库`)\n else store.showNotice('error', '角色卡入库失败:' + (res.message ?? 'settings bridge unavailable'))\n } else {\n store.showNotice('error', `不支持的文件类型:${file.name}(仅 .png / .json)`)\n }\n }\n await loadCharacters()\n } catch (error) {\n store.showNotice('error', `角色卡导入失败:${error instanceof Error ? error.message : String(error)}`)\n } finally {\n setImporting(false)\n }\n }\n\n /** 角色卡参数导入当前预设(合并 promptConfigs + params,重建后生效)。 */\n const applyCard = async (id: string): Promise<void> => {\n setBusy(id)\n try {\n const res = await bridgePost<{ id: string; count: number }>('/characters-apply', { id })\n if (res.ok) {\n store.showNotice('ok', `已导入到当前预设(${res.value.count} 条配置)`)\n await store.load()\n await loadCharacters()\n } else {\n store.showNotice('error', '导入到当前预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setBusy(undefined)\n }\n }\n\n /** 从当前预设移除该角色卡参数。 */\n const removeCard = async (id: string): Promise<void> => {\n setBusy(id)\n try {\n const res = await bridgePost<{ id: string; count: number }>('/characters-remove', { id })\n if (res.ok) {\n store.showNotice('ok', `已从当前预设移除(${res.value.count} 条配置)`)\n await store.load()\n await loadCharacters()\n } else {\n store.showNotice('error', '移除失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setBusy(undefined)\n }\n }\n\n const deleteCard = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/characters-delete', { id })\n if (res.ok) {\n setConfirmingDelete(undefined)\n store.showNotice('ok', `角色卡 ${id} 已删除(已导入当前预设的参数不受影响)`)\n await loadCharacters()\n } else {\n store.showNotice('error', '删除失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n const openLocation = async (id: string): Promise<void> => {\n const res = await bridgePost<{ path: string }>('/preset-open', { id: `/.characters/${id}` })\n if (res.ok) store.showNotice('ok', `已打开角色卡目录:${res.value.path}`)\n else store.showNotice('error', '打开目录失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n\n return (\n <section className={ui.section} aria-label=\"角色管理\">\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>角色卡库</strong>\n <small>导入 SillyTavern 角色卡(PNG tEXt chunk:ccv3 / chara,或 chara_card JSON)到独立库。角色卡参数不直接生成预设——点击「导入到当前预设」把角色设定 / 系统提示 / 开场白 / 提示词库合并进当前激活预设,可随时移除。</small>\n </span>\n <span className={ui.inlineControls}>\n <input\n ref={pngRef}\n type=\"file\"\n accept=\".png\"\n multiple\n className={ui.visuallyHidden}\n aria-label=\"选择 SillyTavern 角色卡 PNG\"\n onChange={(event) => { void importCard(event.target.files); event.target.value = '' }}\n />\n <input\n ref={jsonRef}\n type=\"file\"\n accept=\".json\"\n multiple\n className={ui.visuallyHidden}\n aria-label=\"选择角色卡 JSON\"\n onChange={(event) => { void importCard(event.target.files); event.target.value = '' }}\n />\n <button type=\"button\" className={ui.primaryPill} disabled={importing} onClick={() => pngRef.current?.click()}>\n {importing ? '导入中…' : '导入角色卡 PNG'}\n </button>\n <button type=\"button\" className={ui.pillButton} disabled={importing} onClick={() => jsonRef.current?.click()}>\n 导入角色卡 JSON\n </button>\n </span>\n </div>\n </div>\n\n {characters.length === 0 ? (\n <div className={ui.emptyState}>\n <span className={ui.emptyGlyph} aria-hidden=\"true\">⌁</span>\n <div>\n <h3>角色卡库为空</h3>\n <p>从上方导入 SillyTavern 角色卡(PNG / JSON),然后点击「导入到当前预设」应用到正在使用的预设。</p>\n </div>\n </div>\n ) : (\n <div className={ui.presetGrid}>\n {characters.map((card) => {\n const confirming = confirmingDelete === card.id\n return (\n <div key={card.id} className={ui.presetCard}>\n <div className={ui.presetCardBody}>\n <span className={ui.presetCardHead}>\n <strong className={ui.presetCardName}>{card.name}</strong>\n {card.imported && <span className={ui.presetInUse}>已导入当前预设</span>}\n </span>\n {card.description !== undefined && card.description.length > 0\n && <p className={ui.presetCardDesc}>{card.description}</p>}\n <code className={ui.presetCardId}>{card.id}</code>\n </div>\n <span className={ui.presetCardFooter}>\n {card.imported ? (\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\" disabled={busy === card.id}\n onClick={() => void removeCard(card.id)}>\n {busy === card.id ? '移除中…' : '从当前预设移除'}\n </button>\n ) : (\n <button type=\"button\" className={ui.primaryPill} disabled={busy === card.id}\n onClick={() => void applyCard(card.id)}>\n {busy === card.id ? '导入中…' : '导入到当前预设'}\n </button>\n )}\n <button type=\"button\" className={ui.presetIconButton} data-tip=\"打开角色卡目录\"\n aria-label={`打开角色卡目录:${card.name}`}\n onClick={() => void openLocation(card.id)}>\n <IconFolderOpenOutline16 />\n </button>\n {confirming ? (\n <>\n <button type=\"button\" className={ui.pillButton} data-danger\n onClick={() => void deleteCard(card.id)}>确认删除</button>\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\"\n onClick={() => setConfirmingDelete(undefined)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={ui.presetIconButton} data-tip=\"删除角色卡\"\n aria-label={`删除角色卡:${card.name}`}\n onClick={() => setConfirmingDelete(card.id)}>\n <IconTrashOutline16 />\n </button>\n )}\n </span>\n </div>\n )\n })}\n </div>\n )}\n </section>\n )\n})\n","/** 技能设置页(从 PromptWorkspace 拆出):状态筛选 + 过滤 + 拖拽排序 + 目录管理。\n * L3 selector 化:usePromptToolFields 订阅 fields 引用变化;技能行抽 SkillRow\n * memo 组件——开关/筛选/拖拽 hover 只重渲染受影响行,不再全列表级联。 */\nimport { memo, useCallback, useMemo, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport type { SkillCatalogEntry } from './prompt-tool-bridge.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\nimport type { PromptToolHostApi } from './prompt-tool-types.ts'\nimport { usePromptToolFields } from './use-prompt-tool-fields.ts'\nimport { tabKeyHandler } from './tab-key.ts'\nimport { CollapsibleCard } from './CollapsibleCard.tsx'\nimport { SettingInputRow } from './SettingInputRow.tsx'\nimport ui from './PromptUi.module.css'\n\n/** 技能调用状态徽章:只保留模型可调用状态,开关关闭后立即变灰。 */\nfunction SkillStatusChips(props: { skill: SkillCatalogEntry; enabled: boolean }): ReactNode {\n const { skill, enabled } = props\n const callable = skill.valid && skill.modelInvocable && enabled\n const status = skill.valid ? (callable ? '模型可调用' : '模型不可调用') : '未注册'\n return (\n <span className={ui.skillStatusRow} aria-label={`技能调用状态:${status}`}>\n <span className={clsx(ui.skillStatusChip, skill.valid ? (callable ? ui.skillStatusModel : ui.skillStatusOff) : ui.skillStatusError)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {status}\n </span>\n </span>\n )\n}\n\n/** 技能状态筛选维度(统计条与列表联动)。 */\ntype SkillStatusTab = 'all' | 'callable' | 'invalid'\n\nconst SKILL_STATUS_TABS: Array<{ id: SkillStatusTab; label: string }> = [\n { id: 'all', label: '全部' },\n { id: 'callable', label: '模型可调用' },\n { id: 'invalid', label: '未注册' },\n]\n\ninterface SkillRowProps {\n skill: SkillCatalogEntry\n depth: number\n primaryIndex: number\n enabled: boolean\n isSelected: boolean\n dragging: boolean\n dropBefore: boolean\n dropAfter: boolean\n fixing: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n onDragStart: (folder: string, event: React.DragEvent<HTMLDivElement>) => void\n onDragOver: (folder: string, event: React.DragEvent<HTMLDivElement>) => void\n onDrop: (folder: string, event: React.DragEvent<HTMLDivElement>) => void\n onDragEnd: () => void\n onToggleSelect: (folder: string) => void\n onToggleSkill: (folder: string) => void\n onFix: (folder: string) => void\n onMoveUp: (folder: string) => void\n onMoveDown: (folder: string) => void\n}\n\n/** 技能行 memo:props 全部为数据/稳定回调,单行变化只重渲染该行。 */\nconst SkillRow = memo(function SkillRow(props: SkillRowProps): ReactNode {\n const { skill, depth, primaryIndex, enabled, isSelected, dragging, dropBefore, dropAfter, fixing } = props\n const nested = depth > 0\n const hint = `${skill.dir ?? 'skills'}/${skill.folder}${skill.description ? ` · ${skill.description}` : ''}`\n return (\n <div\n className={clsx(ui.skillCard, !skill.valid && ui.skillRowInvalid)}\n data-nested={nested ? '' : undefined}\n data-selected={isSelected ? '' : undefined}\n data-dragging={dragging ? '' : undefined}\n data-drop-before={dropBefore ? '' : undefined}\n data-drop-after={dropAfter ? '' : undefined}\n draggable={skill.valid && !nested}\n onDragStart={(event) => props.onDragStart(skill.folder, event)}\n onDragOver={(event) => props.onDragOver(skill.folder, event)}\n onDrop={(event) => props.onDrop(skill.folder, event)}\n onDragEnd={props.onDragEnd}\n >\n {/* 勾选框:只选择(职责分离——开关状态由行内 Switch 与上方批量按钮控制)。 */}\n <label className={ui.skillSelect} aria-label={`选择 ${skill.name || skill.folder}`}>\n <input type=\"checkbox\" checked={isSelected} disabled={!skill.valid} onChange={() => props.onToggleSelect(skill.folder)} />\n </label>\n {nested\n ? <span className={ui.skillNestedMark} aria-hidden=\"true\" title=\"嵌套子技能(跟随主技能,不参与拖拽排序)\">▸</span>\n : (\n <>\n <span className={ui.dragHandle} title={`第 ${primaryIndex + 1} 位,拖动调整顺序`} aria-hidden=\"true\">⠿</span>\n <span className={ui.skillRankBadge} title={`第 ${primaryIndex + 1} 位`}>{primaryIndex + 1}</span>\n </>\n )}\n <div className={ui.skillCardBody}>\n <span className={ui.skillCardTitleRow}>\n <strong>{skill.name || skill.folder}</strong>\n {skill.duplicate === true && <span className={ui.duplicateBadge} title={`同名技能:来源目录 ${skill.dir ?? '未知'}`}>同名</span>}\n <SkillStatusChips skill={skill} enabled={enabled} />\n </span>\n <small className={ui.skillCardMeta}>{hint}</small>\n {!skill.valid && skill.issue && <span className={ui.skillIssue} role=\"note\">{skill.issue}</span>}\n </div>\n {/* Switch:独立切换技能开关。 */}\n <label className={ui.skillSwitch} htmlFor={`pt-skill-${skill.folder}`}>\n <input id={`pt-skill-${skill.folder}`} type=\"checkbox\" checked={enabled} disabled={!skill.valid} aria-label={`启用 ${skill.name || skill.folder}`} onChange={() => props.onToggleSkill(skill.folder)} />\n <span className={ui.switch} aria-hidden=\"true\"><i /></span>\n </label>\n {!skill.valid ? (\n <button type=\"button\" className={ui.pillButton} disabled={fixing} onClick={() => props.onFix(skill.folder)}>\n {fixing && <span className={ui.spinner} aria-hidden=\"true\" />}\n {fixing ? '修复中…' : '修复'}\n </button>\n ) : !nested ? (\n <span className={ui.skillOrderButtons}>\n <button type=\"button\" className={ui.pillButton} aria-label={`上移 ${skill.name || skill.folder}`} title=\"上移(键盘排序)\" disabled={!props.canMoveUp} onClick={() => props.onMoveUp(skill.folder)}>↑</button>\n <button type=\"button\" className={ui.pillButton} aria-label={`下移 ${skill.name || skill.folder}`} title=\"下移(键盘排序)\" disabled={!props.canMoveDown} onClick={() => props.onMoveDown(skill.folder)}>↓</button>\n </span>\n ) : null}\n </div>\n )\n})\n\nexport const SkillsSettings = memo(function SkillsSettings(props: { store: PromptToolStore; api: PromptToolHostApi }): ReactNode {\n const { store, api } = props\n const fields = usePromptToolFields(store, (value) => value)\n const [pickingDir, setPickingDir] = useState(false)\n const [dragFolder, setDragFolder] = useState<string | undefined>(undefined)\n const [dropTarget, setDropTarget] = useState<{ folder: string; before: boolean } | undefined>(undefined)\n const [skillFilter, setSkillFilter] = useState('')\n const [statusTab, setStatusTab] = useState<SkillStatusTab>('all')\n const [selected, setSelected] = useState<Set<string>>(new Set())\n const [removingDir, setRemovingDir] = useState<string | undefined>(undefined)\n const orderedSkills = useMemo(() => {\n const index = new Map(fields.skillOrder.map((folder, at) => [folder, at]))\n return [...fields.skillCatalog].sort((left, right) => {\n const leftAt = index.get(left.folder)\n const rightAt = index.get(right.folder)\n if (leftAt === undefined && rightAt === undefined) return left.folder.localeCompare(right.folder)\n if (leftAt === undefined) return 1\n if (rightAt === undefined) return -1\n return leftAt - rightAt\n })\n }, [fields.skillCatalog, fields.skillOrder])\n // patch 路径从不原地 mutate:引用相等即内容未变,变化时再退内容比较。\n const dirty = (fields.skillSwitches !== store.savedSwitches.skillSwitches\n && JSON.stringify(fields.skillSwitches) !== JSON.stringify(store.savedSwitches.skillSwitches))\n || (fields.skillOrder !== store.savedSwitches.skillOrder\n && JSON.stringify(fields.skillOrder) !== JSON.stringify(store.savedSwitches.skillOrder))\n || (fields.skillsDirs !== store.savedSwitches.skillsDirs\n && JSON.stringify(fields.skillsDirs) !== JSON.stringify(store.savedSwitches.skillsDirs))\n || store.skillsDirDraft.trim().length > 0\n\n const callableCount = orderedSkills.filter((skill) => skill.valid && skill.modelInvocable && store.skillEnabled(skill.folder)).length\n const invalidCount = orderedSkills.filter((skill) => !skill.valid).length\n const tabCounts: Record<SkillStatusTab, number> = {\n all: orderedSkills.length,\n callable: callableCount,\n invalid: invalidCount,\n }\n\n const keyword = skillFilter.trim().toLowerCase()\n const visibleSkills = orderedSkills.filter((skill) => {\n if (statusTab === 'callable' && !(skill.valid && skill.modelInvocable && store.skillEnabled(skill.folder))) return false\n if (statusTab === 'invalid' && skill.valid) return false\n return keyword.length === 0\n || [skill.folder, skill.name ?? '', skill.description ?? ''].join(' ').toLowerCase().includes(keyword)\n })\n\n const selectionMode = selected.size > 0\n const toggleSelect = useCallback((folder: string) => {\n setSelected((prev) => {\n const next = new Set(prev)\n if (next.has(folder)) next.delete(folder)\n else next.add(folder)\n return next\n })\n }, [])\n /** 全选目标:当前筛选后的合法技能(同名/无效技能不可批量启用)。 */\n const selectableSkills = visibleSkills.filter((skill) => skill.valid)\n const allSelected = selectionMode && selectableSkills.length > 0\n && selectableSkills.every((skill) => selected.has(skill.folder))\n const toggleSelectAll = () => {\n if (allSelected) setSelected(new Set())\n else setSelected(new Set(selectableSkills.map((skill) => skill.folder)))\n }\n const dirSkillCount = (dir: string): number =>\n fields.skillCatalog.filter((skill) => skill.dir === dir).length\n /** 空配置 = 默认副本兜底(只读,不可移除)。 */\n const isDefaultDir = (dir: string): boolean =>\n fields.skillsDirs.length === 0 && fields.activeSkillsDirs[0] === dir\n /** 嵌套技能:folder 含 /(相对路径)即子技能;渲染时父技能下递归展开。 */\n const isNestedFolder = (folder: string): boolean => folder.includes('/')\n /** 主技能序列(不嵌套):拖拽/菜单排序只在主技能间进行,子技能跟随。 */\n const orderedPrimary = orderedSkills.filter((skill) => !isNestedFolder(skill.folder))\n const childrenByParent = new Map<string, SkillCatalogEntry[]>()\n for (const skill of visibleSkills) {\n if (!isNestedFolder(skill.folder)) continue\n const slash = skill.folder.lastIndexOf('/')\n const parent = skill.folder.slice(0, slash)\n const list = childrenByParent.get(parent) ?? []\n list.push(skill)\n childrenByParent.set(parent, list)\n }\n for (const list of childrenByParent.values()) list.sort((a, b) => a.folder.localeCompare(b.folder))\n const expandSkill = (skill: SkillCatalogEntry): SkillCatalogEntry[] =>\n [skill, ...(childrenByParent.get(skill.folder) ?? []).flatMap(expandSkill)]\n const renderOrder = visibleSkills.filter((skill) => !isNestedFolder(skill.folder)).flatMap(expandSkill)\n const depthOf = (folder: string): number => folder.split('/').length - 1\n\n /** 批量启用/禁用:一次 patch + 一次保存(避免逐项写 N 次)。 */\n const batchSet = (enabled: boolean) => {\n const next = { ...fields.skillSwitches }\n for (const folder of selected) next[folder] = enabled\n store.patch({ skillSwitches: next })\n store.persistSwitches()\n store.showNotice('ok', `已${enabled ? '启用' : '禁用'} ${selected.size} 个技能`)\n setSelected(new Set())\n }\n\n const moveSkill = useCallback((from: string, to: string) => {\n const folders = orderedSkills.map((skill) => skill.folder)\n const fromAt = folders.indexOf(from)\n const toAt = folders.indexOf(to)\n if (fromAt < 0 || toAt < 0 || fromAt === toAt) return\n const [moved] = folders.splice(fromAt, 1)\n folders.splice(toAt, 0, moved!)\n store.patch({ skillOrder: folders })\n store.persistSwitches()\n }, [orderedSkills, store])\n\n /** 拖拽插入:插到目标技能前/后(带放置方向指示)。 */\n const moveSkillAt = (from: string, target: string, before: boolean) => {\n const folders = orderedSkills.map((skill) => skill.folder)\n const fromAt = folders.indexOf(from)\n if (fromAt < 0) return\n let toAt = folders.indexOf(target)\n if (toAt < 0 || fromAt === toAt) return\n const [moved] = folders.splice(fromAt, 1)\n if (fromAt < toAt) toAt -= 1\n if (!before) toAt += 1\n folders.splice(toAt, 0, moved!)\n store.patch({ skillOrder: folders })\n store.persistSwitches()\n }\n\n const pickSkillsDir = async () => {\n if (pickingDir) return\n setPickingDir(true)\n try {\n const path = await api.pickDirectory()\n if (path === null) return\n store.addSkillsDir(path)\n } catch (error) {\n store.showNotice('error', '选择目录失败:' + (error instanceof Error ? error.message : String(error)))\n } finally {\n setPickingDir(false)\n }\n }\n\n /** 行级稳定回调(memo 行只在自身 props 变化时重渲染)。 */\n const onDragStart = useCallback((folder: string, event: React.DragEvent<HTMLDivElement>) => {\n setDragFolder(folder)\n event.dataTransfer.effectAllowed = 'move'\n }, [])\n const onDragOver = useCallback((folder: string, event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n if (dragFolder === undefined || dragFolder === folder || folder.includes('/')) return\n const rect = event.currentTarget.getBoundingClientRect()\n setDropTarget({ folder, before: event.clientY < rect.top + rect.height / 2 })\n }, [dragFolder])\n const onDrop = useCallback((folder: string, event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n const target = dropTarget\n if (dragFolder !== undefined && target !== undefined && dragFolder !== folder && !folder.includes('/')) {\n moveSkillAt(dragFolder, target.folder, target.before)\n }\n setDragFolder(undefined)\n setDropTarget(undefined)\n }, [dragFolder, dropTarget])\n const onDragEnd = useCallback(() => { setDragFolder(undefined); setDropTarget(undefined) }, [])\n const onToggleSkill = useCallback((folder: string) => store.toggleSkill(folder), [store])\n const onFix = useCallback((folder: string) => void store.fixSkill(folder), [store])\n const onMoveUp = useCallback((folder: string) => {\n const at = orderedPrimary.findIndex((skill) => skill.folder === folder)\n if (at > 0) moveSkill(folder, orderedPrimary[at - 1]!.folder)\n }, [orderedPrimary, moveSkill])\n const onMoveDown = useCallback((folder: string) => {\n const at = orderedPrimary.findIndex((skill) => skill.folder === folder)\n if (at >= 0 && at < orderedPrimary.length - 1) moveSkill(folder, orderedPrimary[at + 1]!.folder)\n }, [orderedPrimary, moveSkill])\n\n return (\n <section className={ui.section} aria-label=\"技能设置\">\n {fields.skillCatalog.length > 0 && (\n <>\n <div className={ui.skillStatsRow}>\n <div className={ui.skillStats} role=\"tablist\" aria-label=\"技能状态筛选\">\n {SKILL_STATUS_TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={statusTab === tab.id}\n data-active={statusTab === tab.id ? '' : undefined}\n onClick={() => setStatusTab(tab.id)}\n onKeyDown={tabKeyHandler(SKILL_STATUS_TABS.map((entry) => entry.id), statusTab, setStatusTab)}\n >\n <i className={clsx(ui.skillStatDot,\n tab.id === 'invalid' ? ui.skillStatusError\n : tab.id === 'callable' ? ui.skillStatusModel\n : ui.skillStatAll)} aria-hidden=\"true\" />\n <strong>{tabCounts[tab.id]}</strong>\n <small>{tab.label}</small>\n </button>\n ))}\n </div>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.load()}>刷新技能列表</button>\n </div>\n <div className={ui.listFilterRow}>\n <input\n className={ui.listFilter}\n value={skillFilter}\n aria-label=\"过滤技能列表\"\n placeholder=\"过滤技能:名称 / 目录 / 描述…\"\n spellCheck={false}\n onChange={(event) => setSkillFilter(event.target.value)}\n />\n {selected.size > 0 && <span className={ui.selectionCount}>已选 {selected.size}</span>}\n {selectableSkills.length > 0 && (\n <button type=\"button\" className={ui.pillButton} data-active={allSelected ? '' : undefined} onClick={toggleSelectAll}>\n {allSelected ? '取消全选' : '全选'}\n </button>\n )}\n <button type=\"button\" className={ui.pillButton} disabled={!selectionMode} onClick={() => batchSet(true)}>批量启用</button>\n <button type=\"button\" className={ui.pillButton} disabled={!selectionMode} onClick={() => batchSet(false)}>批量禁用</button>\n </div>\n </>\n )}\n\n {fields.skillCatalog.length === 0 ? (\n <div className={ui.emptyState}><span className={ui.emptyGlyph} aria-hidden=\"true\">◇</span><div><h3>skills 目录下没有技能</h3><p>展开下方「目录与来源」选择目录导入,或确认技能目录路径后重新打开工作台。</p></div></div>\n ) : visibleSkills.length === 0 ? (\n <p className={ui.readOnly} role=\"status\">没有匹配当前筛选的技能。</p>\n ) : (\n <>\n <div className={ui.skillCardList} data-dragging={dragFolder !== undefined ? '' : undefined}>\n {renderOrder.map((skill) => {\n const depth = depthOf(skill.folder)\n const primaryIndex = depth === 0 ? orderedPrimary.indexOf(skill) : 0\n return (\n <SkillRow\n key={skill.folder}\n skill={skill}\n depth={depth}\n primaryIndex={primaryIndex}\n enabled={store.skillEnabled(skill.folder)}\n isSelected={selected.has(skill.folder)}\n dragging={dragFolder === skill.folder}\n dropBefore={dropTarget?.folder === skill.folder && dropTarget.before === true}\n dropAfter={dropTarget?.folder === skill.folder && dropTarget.before === false}\n fixing={store.fixingSkill === skill.folder}\n canMoveUp={depth === 0 && primaryIndex > 0}\n canMoveDown={depth === 0 && primaryIndex < orderedPrimary.length - 1}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n onToggleSelect={toggleSelect}\n onToggleSkill={onToggleSkill}\n onFix={onFix}\n onMoveUp={onMoveUp}\n onMoveDown={onMoveDown}\n />\n )\n })}\n </div>\n </>\n )}\n\n <CollapsibleCard id=\"pt-skills-dirs\" title=\"目录与来源\"\n meta={`${fields.activeSkillsDirs.length} 个目录 · 添加 / 移除引用`}>\n <div className={ui.dirAddBar}>\n <button type=\"button\" className={ui.primaryPill} disabled={pickingDir} onClick={() => void pickSkillsDir()}>\n {pickingDir && <span className={ui.spinner} aria-hidden=\"true\" />}\n {pickingDir ? '选择中…' : '从文件夹选择器添加'}\n </button>\n <div className={ui.dirAddInput}>\n <input\n className={ui.directoryInput}\n aria-label=\"按路径添加技能目录\"\n value={store.skillsDirDraft}\n placeholder=\"或输入目录路径后添加\"\n spellCheck={false}\n onChange={(event) => store.setSkillsDirDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && store.skillsDirDraft.trim().length > 0) {\n store.addSkillsDir(store.skillsDirDraft)\n store.setSkillsDirDraft('')\n }\n }}\n />\n <button\n type=\"button\"\n className={ui.pillButton}\n disabled={store.savingSkillsDir || store.skillsDirDraft.trim().length === 0}\n onClick={() => {\n store.addSkillsDir(store.skillsDirDraft)\n store.setSkillsDirDraft('')\n }}\n >\n {store.savingSkillsDir && <span className={ui.spinner} aria-hidden=\"true\" />}\n 添加\n </button>\n </div>\n </div>\n {fields.activeSkillsDirs.length === 0 ? (\n <p className={ui.readOnly} role=\"status\">技能目录列表为空。</p>\n ) : (\n <div className={ui.dirCardList}>\n {fields.activeSkillsDirs.map((dir, index) => {\n const exists = fields.skillsDirExists[dir] === true\n const count = dirSkillCount(dir)\n const isDefault = isDefaultDir(dir)\n return (\n <div key={dir} className={ui.dirCard} data-invalid={!exists ? '' : undefined}>\n <span className={ui.skillRankBadge} title={`第 ${index + 1} 个目录`}>{index + 1}</span>\n <div className={ui.dirCardBody}>\n <span className={ui.dirCardTitle}>\n <code className={ui.dirPath} title={dir}>{dir}</code>\n {isDefault && <span className={ui.duplicateBadge} title=\"未配置自定义目录时使用的 profile skills 副本\">默认副本</span>}\n </span>\n <span className={ui.dirCardMeta}>\n {exists\n ? (count > 0 ? `${count} 个技能` : '空目录')\n : '目录不存在'}\n {!exists && ' · 可移除后重新添加'}\n </span>\n </div>\n <div className={ui.dirCardActions}>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.openSkillsDir(dir)}>打开</button>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.load()}>重扫</button>\n {!isDefault && (removingDir === dir ? (\n <>\n <button type=\"button\" className={ui.pillButton} data-danger onClick={() => { store.removeSkillsDir(dir); setRemovingDir(undefined) }}>确认移除</button>\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\" onClick={() => setRemovingDir(undefined)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={ui.pillButton} onClick={() => setRemovingDir(dir)}>移除</button>\n ))}\n </div>\n </div>\n )\n })}\n </div>\n )}\n <p className={ui.readOnly}>目录顺序即添加顺序;同名技能全部保留并标注「同名」,模型注册只取首个目录。移除目录只删除引用,不删除原文件。</p>\n <div className={ui.cardDivider} />\n <SettingInputRow id=\"pt-skill-rank-base\" label=\"技能排序基数\" hint=\"每个技能实际 rank = 基数 + 拖拽序号;默认 250。数值过小会让本项目技能抢占其他插件技能的位置,但不会影响任何提示词消息注入。\"\n type=\"number\" value={String(fields.skillRankBase)}\n onInput={(value) => store.patch({ skillRankBase: Number(value) || 0 })}\n onCommit={store.persistSwitches} />\n </CollapsibleCard>\n\n {dirty && <p className={ui.readOnly} role=\"status\">Skills 开关与目录修改立即保存;如上方按钮仍在写入,请稍候。</p>}\n </section>\n )\n})\n","import { memo, useCallback, useEffect, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { tabKeyHandler } from './tab-key.ts'\nimport {\n type PromptToolStore,\n type PromptToolSettingsTransport,\n usePromptToolStore,\n} from './prompt-tool-store.ts'\nimport type { PromptToolHostApi } from './prompt-tool-types.ts'\nimport { PromptConfigList } from './PromptConfigList.tsx'\nimport { PromptConfigsEditor } from './PromptConfigsEditor.tsx'\nimport type { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport { PresetsPage } from './PresetsPage.tsx'\nimport { CharactersPage } from './CharactersPage.tsx'\nimport { TemplatePicker } from './TemplatePicker.tsx'\nimport { useTemplatePicker } from './useTemplatePicker.ts'\nimport { DelegationToolsModuleCard, ModelRouteModuleCard } from './EngineModuleCards.tsx'\nimport { SkillsSettings } from './SkillsSettings.tsx'\nimport { usePromptToolFields } from './use-prompt-tool-fields.ts'\nimport ui from './PromptUi.module.css'\nimport css from './PromptWorkspace.module.css'\n\nfunction PageHeader(props: { title: string; description: string; meta?: string }): ReactNode {\n return (\n <div className={ui.pageHeader}>\n <div><h2>{props.title}</h2><p>{props.description}</p></div>\n {props.meta !== undefined && <div className={css.pageHeaderMeta}><code>{props.meta}</code></div>}\n </div>\n )\n}\n\n/** 模型路由状态 chip:主对话页与子代理页共用(检测到 DeepSeek 路由时展示 provider 列表)。 */\nfunction ModelRouteStatus(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const detected = store.providers.length > 0\n const catalog = store.modelCatalog\n const catalogEntries = Object.entries(catalog)\n const hostModel = store.hostDefaultModel?.model\n return (\n <div className={ui.skillStatusRow} aria-label=\"模型服务商状态\">\n <span className={clsx(ui.skillStatusChip, detected ? ui.skillStatusModel : ui.skillStatusOff)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {detected ? `已检测到模型服务商:${store.providers.join('、')}` : '未检测到模型服务商'}\n </span>\n <span className={clsx(ui.skillStatusChip, catalogEntries.length > 0 ? ui.skillStatusModel : ui.skillStatusOff)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {catalogEntries.length > 0\n ? `已检测到模型名:${catalogEntries.map(([provider, models]) => `${provider} → ${models.join('、')}`).join(';')}`\n : hostModel !== undefined && hostModel.length > 0\n ? `模型名:继承宿主默认(${hostModel})`\n : '未检测到模型名'}\n </span>\n </div>\n )\n}\n\n/** 主会话页:主对话参数 + Preset/AGENTS 内容 + 管线状态卡 + 模块库(层筛选)。\n * 注入层 tab 已并入本页(层专属开关与内容资产卡片),模块库按层级下拉筛选浏览。 */\nconst FeatureSettings = memo(function FeatureSettings(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n // L3 selector 化:fields 引用变化才重渲染(父级 loading/notice/page 变化不再级联)。\n const fields = usePromptToolFields(store, (value) => value)\n // 稳定回调:卡片 memo 的生效前提(store 引用已稳定)。\n const patchConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n store.patch({ promptConfigs: configs })\n }, [store])\n const saveConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n void store.persistConfigs(configs)\n }, [store])\n return (\n <section className={ui.section} aria-label=\"主会话与全局\">\n <ModelRouteStatus store={store} />\n <PromptConfigsEditor\n meta={store.meta}\n configs={fields.promptConfigs}\n savedConfigs={store.savedConfigs}\n onPatchConfigs={patchConfigs}\n onSaveConfigs={saveConfigs}\n onNotice={store.showNotice}\n templateVariables={store.templateVariables}\n setTemplateVariables={store.setTemplateVariables}\n templateVariablesEnabled={store.templateVariablesEnabled}\n setTemplateVariablesEnabled={store.setTemplateVariablesEnabled}\n saveTemplateVariables={store.saveTemplateVariables}\n store={store}\n />\n </section>\n )\n})\n\n/** 配置列表 + 新建模板:六层页按 layer 过滤,子代理页按 scope 过滤(subagent 只列子代理可见模板)。 */\nconst ConfigListWithTemplates = memo(function ConfigListWithTemplates(props: { store: PromptToolStore; layer?: string; scope?: 'main' | 'subagent'; beforeCards?: ReactNode }): ReactNode {\n const { store, layer, scope, beforeCards } = props\n const fields = usePromptToolFields(store, (value) => value)\n // 稳定回调:卡片 memo 的生效前提(store 引用已稳定)。\n const patchConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n store.patch({ promptConfigs: configs })\n }, [store])\n const saveConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n void store.persistConfigs(configs)\n }, [store])\n // 当前预设模板消息批层无配置时,pre-step 层空状态追加提示(列表仍可自定义:\n // 新建配置作为 settings 覆盖层保存,切换预设后保留)。\n const preStepEmpty = store.templatePreStepCount === 0 && (layer === undefined || layer === 'pre-step')\n const templatePicker = useTemplatePicker(\n fields.promptConfigs,\n (config) => store.patch({ promptConfigs: [...fields.promptConfigs, config] }),\n store.showNotice,\n )\n return (\n <>\n <PromptConfigList\n meta={store.meta}\n configs={fields.promptConfigs}\n savedConfigs={store.savedConfigs}\n layer={layer}\n scope={scope}\n beforeCards={beforeCards}\n emptyHint={preStepEmpty ? '当前预设模板消息批层无配置;可新建自定义配置(作为 settings 覆盖层,切换预设后仍保留)。' : undefined}\n extraActions={\n <button type=\"button\" className={ui.primaryPill} onClick={templatePicker.openPicker}>新建</button>\n }\n onPatchConfigs={patchConfigs}\n onSaveConfigs={saveConfigs}\n onNotice={store.showNotice}\n />\n {templatePicker.open && (\n <TemplatePicker templates={templatePicker.templates} layer={layer} onPick={templatePicker.pickTemplate} onClose={templatePicker.closePicker} />\n )}\n </>\n )\n})\n\n/** 子代理页:路由状态 + 子代理引擎模块区块(列表上方,与主会话同构)+ 子代理配置列表\n * (audience != main 即公用或仅子代理)。子代理独有:子代理模型、工具与深度\n * (toolFilter / allowKinds / maxDepth);主会话引擎模块(tool-bootstrap /\n * context-gate / 工具管线)不在此重复(避免双入口)。 */\nconst SubagentPage = memo(function SubagentPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n // 订阅 fields:memo 后 props 不变,靠订阅通道随 fields 变化重渲(子代理模型/工具卡数据源)。\n usePromptToolFields(store, (value) => value)\n return (\n <>\n <section className={ui.section} aria-label=\"子代理\">\n <ModelRouteStatus store={store} />\n <div className={ui.configList}>\n <ModelRouteModuleCard store={store} scope=\"subagent\" />\n <DelegationToolsModuleCard store={store} />\n </div>\n </section>\n <div className={ui.subagentConfigs}>\n <ConfigListWithTemplates store={store} scope=\"subagent\" />\n </div>\n </>\n )\n})\n\n/** 技能状态筛选维度(统计条与列表联动)。 */\nexport interface PromptWorkspaceProps {\n api: PromptToolHostApi\n settings: PromptToolSettingsTransport\n controller: PromptToolWorkspaceController\n onClose: () => void\n}\n\n/** 顶层页面:注入层已并入主会话页(层专属开关 + 内容资产卡片 + 模块库层筛选)。 */\ntype WorkspacePage = 'subagent' | 'skills' | 'features' | 'presets' | 'characters'\n\nconst TOP_PAGES: Array<{ id: WorkspacePage; label: string }> = [\n { id: 'features', label: '主会话' },\n { id: 'subagent', label: '子代理' },\n { id: 'skills', label: '技能设置' },\n { id: 'presets', label: '预设配置' },\n { id: 'characters', label: '角色管理' },\n]\n\n/** 侧边栏独立工作台:顶层 4 页(注入层并入主会话)。 */\nexport function PromptWorkspace(props: PromptWorkspaceProps): ReactNode {\n const store = usePromptToolStore(props.api, props.settings)\n const [page, setPage] = useState<WorkspacePage>('features')\n const open = useSyncExternalStore(\n props.controller.subscribe,\n props.controller.getSnapshot,\n props.controller.getSnapshot,\n ).open\n\n useEffect(() => {\n // 每次打开工作台都重新同步 settings(其他客户端可能已修改)。\n if (open) void store.load()\n }, [open, store.load])\n\n\n const enabledCount = store.fields.promptConfigs.filter((config) => config.enabled !== false).length\n const layerMeta = page === 'skills'\n ? `${store.fields.skillCatalog.length} 技能`\n : page === 'features'\n ? '全局'\n : page === 'presets'\n ? '预设配置'\n : page === 'characters'\n ? `${(store.meta.presets ?? []).filter((preset) => preset.meta?.source === 'sillytavern').length} 角色卡`\n : '子代理'\n const pageTitle = page === 'skills' ? '技能设置'\n : page === 'features' ? '主会话'\n : page === 'presets' ? '预设配置'\n : page === 'characters' ? '角色管理'\n : '子代理'\n const pageDetail = page === 'skills'\n ? '按 skills 目录注册的可开关技能;目录与逐技能开关立即生效。'\n : page === 'features'\n ? '主会话参数(模型设置、工具与深度)、消息批层入口开关、Preset/AGENTS 内容与提示词配置模块库(按层级筛选)。'\n : page === 'presets'\n ? '统一管理预设模板(切换/导入)与提示词配置(六层列表/模板插入/配置目录)。'\n : page === 'characters'\n ? '导入 SillyTavern 角色卡(PNG / JSON)并管理转换出的角色卡预设模块(角色设定 / 系统提示 / 开场白 / 提示词库)。'\n : '子代理作用域参数(模型/工具集/深度)与子代理提示词配置(audience 非仅主会话;子代理独立人设 = 新建配置卡:system-section + audience=subagent + 人设段,装配时替换主会话人设,无卡 = 继承主会话)。'\n // 已加载过数据时保留旧内容(顶部状态点显示「读取中」),避免切换/保存触发整区骨架屏闪烁。\n const hasData = store.meta.layers.length > 0\n || store.fields.skillCatalog.length > 0\n || store.fields.promptConfigs.length > 0\n\n return (\n <div className={css.shell}>\n <header className={css.masthead}>\n <div className={css.brand}>\n <span className={css.brandLogo} aria-hidden=\"true\">⌁</span>\n <h1>提示词工具</h1>\n </div>\n <div className={css.statusCluster}>\n <span className={css.statusDot} data-state={store.loading ? 'checking' : 'online'} aria-hidden=\"true\" />\n <span>{store.loading ? '读取中' : `${store.fields.promptConfigs.length} 配置 · ${enabledCount} 启用`}</span>\n </div>\n <button type=\"button\" className={css.backButton} onClick={props.onClose}>返回对话</button>\n </header>\n\n <div className={css.topNavigation}>\n <div className={css.nav} role=\"tablist\" aria-label=\"提示词工具页面\">\n {TOP_PAGES.map((item) => (\n <button key={item.id} type=\"button\" role=\"tab\" aria-selected={page === item.id} data-active={page === item.id ? '' : undefined} onClick={() => setPage(item.id)} onKeyDown={tabKeyHandler(TOP_PAGES.map((entry) => entry.id), page, setPage)}>\n <span><strong>{item.label}</strong></span>\n </button>\n ))}\n </div>\n </div>\n\n <main className={css.canvas}>\n <div>\n <PageHeader title={pageTitle} description={pageDetail} meta={layerMeta} />\n\n {store.loading && !hasData ? (\n <div className={ui.skeletonStack} aria-hidden=\"true\">\n {[0, 1, 2, 3].map((item) => <div key={item} className={ui.skeletonRow} />)}\n </div>\n ) : page === 'skills' ? <SkillsSettings store={store} api={props.api} /> : (\n <>\n {page === 'features' && <FeatureSettings store={store} />}\n {page === 'presets' && <PresetsPage store={store} />}\n {page === 'characters' && <CharactersPage store={store} />}\n {page === 'subagent' && <SubagentPage store={store} />}\n </>\n )}\n\n {store.notice && <p className={clsx(ui.notice, store.noticeKind === 'error' && ui.noticeError)} role=\"status\">{store.notice}</p>}\n </div>\n </main>\n </div>\n )\n}\n","/**\n * 官方 slot 工作台:shell.overlay 左上角悬浮触发器 + 右侧抽屉 + settings.plugins.tab 基础设置。\n * 两个可见面共享同一个 PromptToolWorkspaceController,触发按钮通过 body portal\n * 落在对话界面层,几何探针只消费官方 sidebar slot 的宽度。\n */\nimport { useCallback, useEffect, useLayoutEffect, useRef, useSyncExternalStore, useState, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type { InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { PromptWorkspace } from './PromptWorkspace.tsx'\nimport { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport type { PromptToolSettingsTransport } from './prompt-tool-store.ts'\nimport type { PromptToolHostApi } from './prompt-tool-types.ts'\nimport { ToggleRow } from './ToggleRow.tsx'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport ui from './PromptUi.module.css'\nimport css from './PromptWorkspace.module.css'\n\n/** 两个可见面共享的业务面(无 hooks 舱,InjectFace 原样透传成员);几何探针不携带业务 face。 */\nexport interface PromptToolWorkbenchFace {\n controller: PromptToolWorkspaceController\n api: PromptToolHostApi\n settings: PromptToolSettingsTransport\n}\n\ntype OverlayProps = PropsRuntime<'shell.overlay'> & InjectFace<PromptToolWorkbenchFace>\ntype SidebarGeometryProps = PropsRuntime<'sidebar.footer.action'>\n\n/** 左上角悬浮触发器:透过 body portal 落在对话界面层。 */\nfunction FloatingTrigger(props: { controller: PromptToolWorkspaceController }): ReactNode {\n const { controller } = props\n const open = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot).open\n return (\n <div className={css.floatingTriggerLayer} data-dsh-part=\"floating-trigger-layer\">\n <button\n type=\"button\"\n className={css.floatingTrigger}\n data-open={open ? '' : undefined}\n data-dsh-plugin=\"prompt-tool\"\n data-dsh-part=\"floating-trigger\"\n aria-label={open ? '关闭提示词工具' : '打开提示词工具'}\n aria-pressed={open}\n title={open ? '关闭提示词工具' : '打开提示词工具'}\n onClick={() => controller.toggle()}\n >\n <svg viewBox=\"0 0 16 16\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 2.5h6l3 3v8h-9zM9.5 2.5v3h3M6 8.5h4M8 6.5v4\" />\n </svg>\n </button>\n </div>\n )\n}\n\nconst SIDEBAR_WIDE_PADDING = 12\nconst SIDEBAR_COLLAPSED_WIDTH = 56\nconst FLOATING_TRIGGER_GAP = 10\nconst FLOATING_TRIGGER_LEFT_PROPERTY = '--pt-sidebar-edge'\n\n/**\n * Official sidebar slot geometry bridge. The visible trigger is portaled to body\n * from the frame-wide overlay; this element only measures the real, resizable sidebar\n * edge, including the collapsed 56px rail.\n */\nfunction SidebarGeometryProbe(props: SidebarGeometryProps): ReactNode {\n const { wide } = props\n const probeRef = useRef<HTMLDivElement>(null)\n useLayoutEffect(() => {\n const probe = probeRef.current\n if (probe === null) return\n const setLeft = (left: number): void => {\n document.documentElement.style.setProperty(FLOATING_TRIGGER_LEFT_PROPERTY, String(Math.round(left)) + 'px')\n }\n const update = (): void => {\n if (!wide) {\n setLeft(SIDEBAR_COLLAPSED_WIDTH + FLOATING_TRIGGER_GAP)\n return\n }\n // The first parent is the renderer's display:contents slot anchor;\n // the second is the official SidebarRoot footerActions container.\n const rect = probe.parentElement?.parentElement?.getBoundingClientRect()\n if (rect === undefined || (rect.width === 0 && rect.height === 0)) return\n setLeft(rect.right + SIDEBAR_WIDE_PADDING + FLOATING_TRIGGER_GAP)\n }\n update()\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(update)\n if (wide) observer?.observe(probe.parentElement?.parentElement ?? probe)\n window.addEventListener('resize', update)\n return () => {\n observer?.disconnect()\n window.removeEventListener('resize', update)\n document.documentElement.style.removeProperty(FLOATING_TRIGGER_LEFT_PROPERTY)\n }\n }, [wide])\n return (\n <div\n ref={probeRef}\n className={css.sidebarEdgeProbe}\n aria-hidden=\"true\"\n />\n )\n}\n\n/** shell.overlay:顶层触发器 + 右侧抽屉工作台;store 状态跨开关保留。 */\nfunction WorkbenchDrawerSlot(props: OverlayProps): ReactNode {\n const { controller, api, settings } = props\n const open = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot).open\n useEffect(() => {\n if (!open) return\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') { event.preventDefault(); controller.close() }\n }\n // 与其他面板互斥:兼容仍在 DOM 面板上的 taskboard / ssh 事件总线。\n const onOther = (event: Event): void => {\n const detail = (event as CustomEvent<unknown>).detail\n if (detail === 'taskboard' || detail === 'ssh') controller.close()\n }\n document.addEventListener('keydown', onKey)\n document.addEventListener('dsh-panel-activate', onOther)\n document.dispatchEvent(new CustomEvent('dsh-panel-activate', { detail: 'prompt-tool' }))\n return () => {\n document.removeEventListener('keydown', onKey)\n document.removeEventListener('dsh-panel-activate', onOther)\n }\n }, [open, controller])\n const trigger = <FloatingTrigger controller={controller} />\n return (\n <>\n {typeof document === 'undefined' || document.body === null ? trigger : createPortal(trigger, document.body)}\n <div className={css.drawerLayer} data-open={open ? '' : undefined}>\n <div className={css.drawerBackdrop} onClick={() => controller.close()} aria-hidden=\"true\" />\n <section className={css.drawerPanel} role=\"dialog\" aria-modal=\"true\" aria-label=\"提示词工具\">\n <PromptWorkspace api={api} settings={settings} controller={controller} onClose={() => controller.close()} />\n </section>\n </div>\n </>\n )\n}\n\n/** settings.plugins.tab:基础开关(settings 命名空间直读直写,官方 SettingsScope 通道)。 */\ntype TabProps = PropsRuntime<'settings.plugins.tab'> & InjectFace<PromptToolWorkbenchFace>\n\nfunction SettingsTabSlot(props: TabProps): ReactNode {\n const scope = props.settings.scope\n // useSyncExternalStore 需要稳定的函数引用;直接传方法引用会脱离 this 调用。\n const subscribe = useCallback((listener: () => void) => scope.subscribe(listener), [scope])\n const getSnapshot = useCallback(() => scope.getSnapshot(), [scope])\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n const value = (snapshot.value ?? {}) as Record<string, unknown>\n const [presets, setPresets] = useState<Array<{ id: string; name: string }>>([])\n const [switchingPreset, setSwitchingPreset] = useState(false)\n const [presetNotice, setPresetNotice] = useState<{ kind: 'ok' | 'error'; message: string }>()\n useEffect(() => {\n void bridgePost<{ meta?: { presets?: Array<{ id: string; name: string }> } }>('/meta', {})\n .then((res) => { if (res.ok && res.value.meta?.presets !== undefined) setPresets(res.value.meta.presets) })\n .catch(() => {})\n }, [])\n const set = (field: string, next: unknown): void => { void scope.set(field, next) }\n const switchPreset = async (id: string): Promise<void> => {\n if (switchingPreset || id === value.presetTemplate) return\n setSwitchingPreset(true)\n setPresetNotice(undefined)\n try {\n // 先持久化默认值:Host applyState 会物化目标预设并同步 agent-presets default;\n // settlement 后再重组当前空会话,避免目标生成物尚未就绪。\n await scope.set('presetTemplate', id)\n const result = await props.api.switchPreset(id)\n if (result.applied) {\n setPresetNotice({ kind: 'ok', message: `已切换到 ${id},当前空会话已重组。` })\n } else if (result.message !== undefined) {\n setPresetNotice({ kind: 'error', message: `默认预设已更新为 ${id};当前会话未切换:${result.message}` })\n } else {\n setPresetNotice({ kind: 'ok', message: `默认预设已更新为 ${id};当前没有可重组的空会话。` })\n }\n } catch (error) {\n setPresetNotice({ kind: 'error', message: `切换预设失败:${error instanceof Error ? error.message : String(error)}` })\n } finally {\n setSwitchingPreset(false)\n }\n }\n\n return (\n <section className={ui.section} aria-label=\"提示词工具基础设置\">\n <ToggleRow id=\"pt-writePreset\" label=\"生成锚定注入预设\" hint=\"关闭后移除各预设目录的生成物,参数与内容不再物化。\" checked={value.writePreset === true} onChange={(v) => set('writePreset', v)} />\n <ToggleRow id=\"pt-writeAgents\" label=\"写入 AGENTS.md\" hint=\"把常驻规则写入 ~/.dsh/AGENTS.md。\" checked={value.writeAgents === true} onChange={(v) => set('writeAgents', v)} />\n <ToggleRow id=\"pt-injectAgentsPrompt\" label=\"注入 AGENTS 内容到提示词\" hint=\"用 AGENTS.md 内容替换本地 instruction-hint 的默认提示文本。\" checked={value.injectAgentsPrompt === true} onChange={(v) => set('injectAgentsPrompt', v)} />\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}><strong>预设模板</strong><small>新会话默认挂载的预设;完整预设管理与提示词配置请使用左上角悬浮按钮打开工作台。</small></span>\n <select className={ui.directoryInput} aria-label=\"预设模板\"\n value={typeof value.presetTemplate === 'string' ? value.presetTemplate : ''}\n disabled={!snapshot.writable || switchingPreset}\n onChange={(event) => { void switchPreset(event.target.value) }}>\n {presets.map((preset) => <option key={preset.id} value={preset.id}>{preset.name}</option>)}\n </select>\n {presetNotice !== undefined && (\n <p className={presetNotice.kind === 'error' ? ui.noticeError : ui.notice} role=\"status\">\n {presetNotice.message}\n </p>\n )}\n </div>\n </div>\n </section>\n )\n}\n\n/** 注册官方槽位;触发器在 shell.overlay 顶层,sidebar.footer.action 只提供可拉伸宽度探针。 */\nexport function registerWorkbenchSlots(ctx: ClientContext, face: PromptToolWorkbenchFace): () => void {\n const disposeGeometry = ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action', id: 'prompt-tool-floating-geometry', order: 40,\n }, SidebarGeometryProbe))\n const disposeTab = ctx.slots.inject('settings.plugins.tab', () => ctx.slots.register({\n name: 'settings.plugins.tab', id: 'prompt-tool', order: 40, label: '提示词工具', inject: () => face,\n }, SettingsTabSlot))\n const disposeOverlay = ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay', id: 'prompt-tool-workbench', order: 50, inject: () => face,\n }, WorkbenchDrawerSlot))\n return () => { disposeOverlay(); disposeGeometry(); disposeTab() }\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-api-session-controller/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-workspace/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-api-remotes/client'\nimport type { PromptToolSettingsTransport } from './prompt-tool-store.ts'\nimport { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport { registerWorkbenchSlots, type PromptToolWorkbenchFace } from './slot-workbench.tsx'\nimport type { PromptToolHostApi } from './prompt-tool-types.ts'\n\nexport const inject = [\n 'slots',\n 'settingsScope',\n 'uiWorkspace',\n 'remote',\n 'remote.agentPresets',\n 'remote.session',\n 'sessions',\n]\n\n/** 与宿主 settings namespace 相同的字符串;client 侧不依赖 host 包,按契约字面拼写。 */\nconst PROMPT_TOOL_NS = 'prompt-tool'\n\nexport function apply(ctx: ClientContext): void {\n // alpha.1 ui-settings:标准字段读写走官方共享 describe mirror + scope mutate\n // (revision 校验与 mirror fold 由 SettingsScopeController 内置,无需 acceptView)。\n const scope = ctx.settingsScope.bind<Record<string, unknown>>({ namespace: PROMPT_TOOL_NS })\n const settings: PromptToolSettingsTransport = {\n scope,\n ensure: () => ctx.settingsScope.describe().ensure(),\n mutate: async (ops, expectedRevision) => {\n await scope.mutate(ops, expectedRevision)\n },\n }\n const hostApi: PromptToolHostApi = {\n pickDirectory: () => ctx.uiWorkspace.pickDirectory(),\n openPath: async (path) => {\n const result = await ctx.remote.session.openWorkspacePath({ path })\n if (!result.ok) throw new Error(result.error.message)\n },\n switchPreset: async (id) => {\n const list = ctx.sessions.list.getSnapshot()\n const session = list.current === undefined ? undefined : list.byId[list.current]\n if (session === undefined) return { applied: false }\n if (!session.blank) {\n return { applied: false, message: '当前会话已有内容,官方只允许空会话切换;本次只更新后续会话默认预设' }\n }\n const result = await ctx.remote.agentPresets.select(session.id, id)\n if (!result.ok) {\n const failure = result.error as { message: string; details?: { reason?: unknown } }\n const reason = failure.details?.reason\n return {\n applied: false,\n message: typeof reason === 'string' ? reason : failure.message,\n }\n }\n return { applied: true }\n },\n }\n\n // 官方 slot 工作台:shell.overlay 顶层悬浮按钮 + 右侧抽屉;sidebar.footer.action\n // 仅提供可拉伸侧边栏的几何探针;settings.plugins.tab 基础设置共享同一 controller。\n // 注册全部走 SlotRegistry 的 inject()(等声明就绪)+ ctx.effect 生命周期,\n // 不手工挂载 DOM。\n const controller = new PromptToolWorkspaceController()\n const face: PromptToolWorkbenchFace = { controller, api: hostApi, settings }\n registerWorkbenchSlots(ctx, face)\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|