dsh-plugin-prompt-tool 0.4.2 → 0.6.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 +131 -222
- package/engine/anchor-match.mjs +117 -0
- package/engine/compaction-epoch.mjs +139 -0
- package/engine/compositions/library/bootstrap-filesystem.yml +19 -0
- package/engine/compositions/library/compaction.yml +52 -0
- package/engine/compositions/library/context-gate.yml +40 -0
- package/engine/compositions/library/custom-bash.yml +14 -0
- package/engine/compositions/library/delegation.yml +85 -0
- package/engine/compositions/library/official-agent-instructions.yml +17 -0
- package/engine/compositions/library/official-persistent-shell.yml +56 -0
- package/engine/compositions/library/official-skill-filesystem-cordis.yml +10 -0
- package/engine/compositions/library/official-tool-bash.yml +6 -0
- package/engine/compositions/library/official-tool-cordis.yml +13 -0
- package/engine/compositions/library/official-tool-presentation.yml +7 -0
- package/engine/compositions/library/official-tool-skill.yml +14 -0
- package/engine/compositions/library/persistent-shell.yml +36 -0
- package/engine/compositions/library/persona.yml +9 -0
- package/engine/compositions/library/planning.yml +41 -0
- package/engine/compositions/library/prompt-config-engine.yml +16 -0
- package/engine/compositions/library/run-code-env.yml +15 -0
- package/engine/compositions/library/skill-filesystem.yml +13 -0
- package/engine/compositions/library/skill-search.yml +14 -0
- package/engine/compositions/library/str-replace-editor.yml +10 -0
- package/engine/compositions/library/tool-ask-user.yml +8 -0
- package/engine/compositions/library/tool-bash.yml +16 -0
- package/engine/compositions/library/tool-bootstrap.yml +16 -0
- package/engine/compositions/library/tool-filter.yml +12 -0
- package/engine/compositions/library/tool-fs-search.yml +18 -0
- package/engine/compositions/library/tool-fs.yml +10 -0
- package/engine/compositions/library/tool-goal.yml +19 -0
- package/engine/compositions/library/tool-jobs.yml +23 -0
- package/engine/compositions/library/tool-pwsh.yml +12 -0
- package/engine/compositions/library/tool-todo.yml +11 -0
- package/engine/compositions/library/tool-web.yml +9 -0
- package/engine/compositions/source/local/context-gate.yml +37 -0
- package/engine/compositions/source/local/custom-bash.yml +11 -0
- package/engine/compositions/source/local/prompt-config-engine.yml +13 -0
- package/engine/compositions/source/local/run-code-env.yml +12 -0
- package/engine/compositions/source/local/skill-search.yml +11 -0
- package/engine/compositions/source/local/tool-bootstrap.yml +13 -0
- package/engine/context-gate.mjs +305 -0
- package/{preset → engine}/custom-bash.mjs +243 -243
- package/engine/executor.mjs +278 -0
- package/engine/fillers.mjs +273 -0
- package/engine/interpolate.mjs +66 -0
- package/engine/layers.mjs +224 -0
- package/engine/prompt-config-engine.mjs +49 -0
- package/engine/run-code-env.mjs +208 -0
- package/engine/schema.mjs +312 -0
- package/engine/session-vars.mjs +52 -0
- package/{preset → engine}/shared.mjs +35 -0
- package/engine/strategies.mjs +213 -0
- package/{preset → engine}/tool-bootstrap.mjs +350 -282
- package/engine/tool-filter.mjs +80 -0
- package/engine/vendor/yaml/LICENSE +13 -0
- package/engine/vendor/yaml/dist/compose/compose-collection.js +88 -0
- package/engine/vendor/yaml/dist/compose/compose-doc.js +43 -0
- package/engine/vendor/yaml/dist/compose/compose-node.js +109 -0
- package/engine/vendor/yaml/dist/compose/compose-scalar.js +86 -0
- package/engine/vendor/yaml/dist/compose/composer.js +219 -0
- package/engine/vendor/yaml/dist/compose/resolve-block-map.js +115 -0
- package/engine/vendor/yaml/dist/compose/resolve-block-scalar.js +198 -0
- package/engine/vendor/yaml/dist/compose/resolve-block-seq.js +49 -0
- package/engine/vendor/yaml/dist/compose/resolve-end.js +37 -0
- package/engine/vendor/yaml/dist/compose/resolve-flow-collection.js +207 -0
- package/engine/vendor/yaml/dist/compose/resolve-flow-scalar.js +225 -0
- package/engine/vendor/yaml/dist/compose/resolve-props.js +146 -0
- package/engine/vendor/yaml/dist/compose/util-contains-newline.js +34 -0
- package/engine/vendor/yaml/dist/compose/util-empty-scalar-position.js +26 -0
- package/engine/vendor/yaml/dist/compose/util-flow-indent-check.js +15 -0
- package/engine/vendor/yaml/dist/compose/util-map-includes.js +13 -0
- package/engine/vendor/yaml/dist/doc/Document.js +335 -0
- package/engine/vendor/yaml/dist/doc/anchors.js +71 -0
- package/engine/vendor/yaml/dist/doc/applyReviver.js +55 -0
- package/engine/vendor/yaml/dist/doc/createNode.js +88 -0
- package/engine/vendor/yaml/dist/doc/directives.js +176 -0
- package/engine/vendor/yaml/dist/errors.js +57 -0
- package/engine/vendor/yaml/dist/index.js +17 -0
- package/engine/vendor/yaml/dist/log.js +11 -0
- package/engine/vendor/yaml/dist/nodes/Alias.js +116 -0
- package/engine/vendor/yaml/dist/nodes/Collection.js +147 -0
- package/engine/vendor/yaml/dist/nodes/Node.js +38 -0
- package/engine/vendor/yaml/dist/nodes/Pair.js +36 -0
- package/engine/vendor/yaml/dist/nodes/Scalar.js +24 -0
- package/engine/vendor/yaml/dist/nodes/YAMLMap.js +144 -0
- package/engine/vendor/yaml/dist/nodes/YAMLSeq.js +113 -0
- package/engine/vendor/yaml/dist/nodes/addPairToJSMap.js +63 -0
- package/engine/vendor/yaml/dist/nodes/identity.js +36 -0
- package/engine/vendor/yaml/dist/nodes/toJS.js +37 -0
- package/engine/vendor/yaml/dist/parse/cst-scalar.js +214 -0
- package/engine/vendor/yaml/dist/parse/cst-stringify.js +61 -0
- package/engine/vendor/yaml/dist/parse/cst-visit.js +97 -0
- package/engine/vendor/yaml/dist/parse/cst.js +98 -0
- package/engine/vendor/yaml/dist/parse/lexer.js +721 -0
- package/engine/vendor/yaml/dist/parse/line-counter.js +39 -0
- package/engine/vendor/yaml/dist/parse/parser.js +975 -0
- package/engine/vendor/yaml/dist/public-api.js +102 -0
- package/engine/vendor/yaml/dist/schema/Schema.js +37 -0
- package/engine/vendor/yaml/dist/schema/common/map.js +17 -0
- package/engine/vendor/yaml/dist/schema/common/null.js +15 -0
- package/engine/vendor/yaml/dist/schema/common/seq.js +17 -0
- package/engine/vendor/yaml/dist/schema/common/string.js +14 -0
- package/engine/vendor/yaml/dist/schema/core/bool.js +19 -0
- package/engine/vendor/yaml/dist/schema/core/float.js +43 -0
- package/engine/vendor/yaml/dist/schema/core/int.js +38 -0
- package/engine/vendor/yaml/dist/schema/core/schema.js +23 -0
- package/engine/vendor/yaml/dist/schema/json/schema.js +62 -0
- package/engine/vendor/yaml/dist/schema/tags.js +96 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/binary.js +58 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/bool.js +26 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/float.js +46 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/int.js +71 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/merge.js +67 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/omap.js +74 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/pairs.js +78 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/schema.js +39 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/set.js +93 -0
- package/engine/vendor/yaml/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/engine/vendor/yaml/dist/stringify/foldFlowLines.js +146 -0
- package/engine/vendor/yaml/dist/stringify/stringify.js +129 -0
- package/engine/vendor/yaml/dist/stringify/stringifyCollection.js +153 -0
- package/engine/vendor/yaml/dist/stringify/stringifyComment.js +20 -0
- package/engine/vendor/yaml/dist/stringify/stringifyDocument.js +85 -0
- package/engine/vendor/yaml/dist/stringify/stringifyNumber.js +25 -0
- package/engine/vendor/yaml/dist/stringify/stringifyPair.js +150 -0
- package/engine/vendor/yaml/dist/stringify/stringifyString.js +336 -0
- package/engine/vendor/yaml/dist/util.js +11 -0
- package/engine/vendor/yaml/dist/visit.js +233 -0
- package/engine/vendor/yaml/index.js +5 -0
- package/engine/vendor/yaml/package.json +11 -0
- package/lib/client.js +4724 -775
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +530 -51
- package/lib/index.mjs +4164 -740
- package/lib/preset-core.d.mts +7 -37
- package/lib/preset-core.mjs +43 -285
- package/lib/prompt-configs-B4vH09wx.d.mts +100 -0
- package/lib/prompt-configs-ThS4iXPg.mjs +771 -0
- package/package.json +36 -29
- package/preset/anchored/preset.yml +342 -0
- package/preset/creative/preset.yml +65 -0
- package/preset/creative/skills/cordis-plugin-development/SKILL.md +420 -0
- package/preset/creative/skills/editing-cordis-compositions/SKILL.md +165 -0
- package/preset/custom/preset.yml +13 -0
- package/preset/liangshen/preset.yml +72 -0
- package/preset/minimal/preset.yml +44 -0
- package/preset/ptc/preset.yml +56 -0
- package/preset/standard/preset.yml +55 -0
- package/skills/manifest.json +7 -0
- package/skills/sandboxmod/SKILL.md +49 -49
- package/skills/web ui/SKILL.md +42 -0
- package/templates/10-pre-step.yml +28 -0
- package/templates/11-merged-a.yml +11 -0
- package/templates/13-anchor.yml +19 -0
- package/templates/14-first-turn-anchor.yml +27 -0
- package/templates/15-guide-auto.yml +25 -0
- package/templates/16-custom-fallback.yml +21 -0
- package/templates/17-instruction-hint.yml +23 -0
- package/templates/18-placeholder-env-facts.yml +11 -0
- package/templates/19-placeholder-skill-catalog.yml +19 -0
- package/templates/20-system-section.yml +19 -0
- package/templates/30-runtime-context.yml +10 -0
- package/templates/31-runtime-context-placeholder.yml +18 -0
- package/templates/40-agent-request.yml +11 -0
- package/templates/50-llm-stream.yml +9 -0
- package/templates/60-tool-pipeline.yml +12 -0
- package/AGENTS.md +0 -4
- package/plan.md +0 -312
- package/preset/agent.cordis.yml +0 -443
- package/preset/compaction-epoch.mjs +0 -81
- package/preset/context-gate.mjs +0 -165
- package/preset/instruction-hint.mjs +0 -217
- package/preset/near-anchor.mjs +0 -101
- package/preset/preset.yml +0 -3
- package/preset/prompt-injector.mjs +0 -112
- package/preset/router-first-turn.mjs +0 -73
- package/preset/router-guide.mjs +0 -79
- package/preset.md +0 -115
- package/upstream/dsh-anchored-standard/LICENSE +0 -22
- package/upstream/dsh-anchored-standard/NOTICE +0 -19
- package/upstream/dsh-anchored-standard/REVISION +0 -1
- package/upstream/dsh-anchored-standard/preset/agent.cordis.yml +0 -440
- package/upstream/dsh-anchored-standard/preset/compaction-epoch.mjs +0 -81
- package/upstream/dsh-anchored-standard/preset/context-gate.mjs +0 -202
- package/upstream/dsh-anchored-standard/preset/custom-bash.mjs +0 -219
- package/upstream/dsh-anchored-standard/preset/dev-tool-search.mjs +0 -131
- package/upstream/dsh-anchored-standard/preset/instruction-hint.mjs +0 -231
- package/upstream/dsh-anchored-standard/preset/preset.yml +0 -3
- package/upstream/dsh-anchored-standard/preset/skill-search.mjs +0 -142
- package/upstream/dsh-anchored-standard/preset/tool-bootstrap.mjs +0 -301
- /package/{preset → engine}/skill-search.mjs +0 -0
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["styles","IconChevronDownOutline14","useState","useRef","useCallback"],"sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/client/PromptEditor.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;","import { useCallback, useRef, useState } from 'react'\r\nimport type { ReactNode } from 'react'\r\nimport clsx from 'clsx'\r\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { IApiClient } from '@deepseek-ai/dsh-client-connection/client'\r\nimport type { InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\r\nimport styles from './PromptEditor.module.css'\r\n\r\nconst SETTINGS_BRIDGE_PREFIX = '/api/prompt-tool/settings'\r\n\r\ntype BridgePathOp = { op: 'set' | 'unset'; path: string[]; value?: unknown }\r\ninterface BridgeSettingsView { ns: string; value: unknown; base?: unknown; revision: number }\r\ntype BridgeResult<T> = { ok: true; value: T; deepseekAvailable?: boolean; deepseekProviders?: string[]; deepseekError?: string; activeSkillsDir?: string; skillCatalog?: SkillCatalogEntry[] } | { ok: false; code?: string; message?: string }\r\n\r\nasync function bridgePost<T>(path: string, body: unknown): Promise<BridgeResult<T>> {\r\n try {\r\n const response = await fetch(SETTINGS_BRIDGE_PREFIX + path, {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify(body),\r\n })\r\n const payload = await response.json() as unknown\r\n if (payload !== null && typeof payload === 'object') return payload as BridgeResult<T>\r\n return { ok: false, message: 'settings bridge unavailable' }\r\n } catch (error) {\r\n return { ok: false, message: errorMessage(error) }\r\n }\r\n}\r\n\r\nexport interface PromptEditorInjected {\r\n api: IApiClient\r\n}\r\n\r\nexport type PromptEditorProps = PropsRuntime<'settings.plugin.item'> & InjectFace<PromptEditorInjected>\r\n\r\ninterface SkillCatalogEntry {\r\n folder: string\r\n name: string\r\n description: string\r\n}\r\n\r\ninterface Fields {\r\n promptText: string\r\n promptPath: string\r\n agentsText: string\r\n agentsPath: string\r\n injectAgentsPrompt: boolean\r\n anchorFirstTurn: boolean\r\n anchorText: string\r\n anchorCustom: boolean\r\n guideText: string\r\n guideCustom: boolean\r\n subagentFlash: boolean\r\n bootstrapMaxTokens: number\r\n usePtcMode: boolean\r\n injectPrompt: boolean\r\n skillSwitches: Record<string, boolean>\r\n skillCatalog: SkillCatalogEntry[]\r\n skillsDir: string\r\n activeSkillsDir: string\r\n writeAgents: boolean\r\n writePreset: boolean\r\n}\r\n\r\nconst EMPTY: Fields = {\r\n promptText: '',\r\n promptPath: '',\r\n agentsText: '',\r\n agentsPath: '',\r\n injectAgentsPrompt: false,\r\n anchorFirstTurn: false,\r\n anchorText: '',\r\n anchorCustom: false,\r\n guideText: '',\r\n guideCustom: false,\r\n subagentFlash: false,\r\n bootstrapMaxTokens: 0,\r\n usePtcMode: true,\r\n injectPrompt: true,\r\n skillSwitches: {},\r\n skillCatalog: [],\r\n skillsDir: '',\r\n activeSkillsDir: '',\r\n writeAgents: true,\r\n writePreset: true,\r\n}\r\n\r\ninterface SwitchSnapshot {\r\n injectAgentsPrompt: boolean\r\n anchorFirstTurn: boolean\r\n anchorText: string\r\n anchorCustom: boolean\r\n guideText: string\r\n guideCustom: boolean\r\n subagentFlash: boolean\r\n bootstrapMaxTokens: number\r\n usePtcMode: boolean\r\n injectPrompt: boolean\r\n skillSwitches: Record<string, boolean>\r\n skillsDir: string\r\n writeAgents: boolean\r\n writePreset: boolean\r\n}\r\n\r\nconst EMPTY_SWITCHES: SwitchSnapshot = {\r\n injectAgentsPrompt: false,\r\n anchorFirstTurn: false,\r\n anchorText: '',\r\n anchorCustom: false,\r\n guideText: '',\r\n guideCustom: false,\r\n subagentFlash: false,\r\n bootstrapMaxTokens: 0,\r\n usePtcMode: true,\r\n injectPrompt: true,\r\n skillSwitches: {},\r\n skillsDir: '',\r\n writeAgents: true,\r\n writePreset: true,\r\n}\r\n\r\n/** 本项目默认不设上限时的显示值(adapter 默认 maxTokens)。 */\r\nconst DEFAULT_BOOTSTRAP_DISPLAY = '256000'\r\n\r\nconst snapshotSwitches = (fields: Fields): SwitchSnapshot => ({\r\n injectAgentsPrompt: fields.injectAgentsPrompt,\r\n anchorFirstTurn: fields.anchorFirstTurn,\r\n anchorText: fields.anchorText,\r\n anchorCustom: fields.anchorCustom,\r\n guideText: fields.guideText,\r\n guideCustom: fields.guideCustom,\r\n subagentFlash: fields.subagentFlash,\r\n bootstrapMaxTokens: fields.bootstrapMaxTokens,\r\n usePtcMode: fields.usePtcMode,\r\n injectPrompt: fields.injectPrompt,\r\n skillSwitches: { ...fields.skillSwitches },\r\n skillsDir: fields.skillsDir,\r\n writeAgents: fields.writeAgents,\r\n writePreset: fields.writePreset,\r\n})\r\n\r\nconst switchesEqual = (a: SwitchSnapshot, b: SwitchSnapshot): boolean =>\r\n a.injectAgentsPrompt === b.injectAgentsPrompt\r\n && a.anchorFirstTurn === b.anchorFirstTurn\r\n && a.anchorText === b.anchorText\r\n && a.anchorCustom === b.anchorCustom\r\n && a.guideText === b.guideText\r\n && a.guideCustom === b.guideCustom\r\n && a.subagentFlash === b.subagentFlash\r\n && a.bootstrapMaxTokens === b.bootstrapMaxTokens\r\n && a.usePtcMode === b.usePtcMode\r\n && a.injectPrompt === b.injectPrompt\r\n && JSON.stringify(a.skillSwitches) === JSON.stringify(b.skillSwitches)\r\n && a.skillsDir === b.skillsDir\r\n && a.writeAgents === b.writeAgents\r\n && a.writePreset === b.writePreset\r\n\r\nconst asRecord = (value: unknown): Record<string, unknown> =>\r\n value !== null && typeof value === 'object' ? value as Record<string, unknown> : {}\r\n\r\nconst readString = (source: Record<string, unknown>, key: string): string | undefined => {\r\n const value = source[key]\r\n return typeof value === 'string' ? value : undefined\r\n}\r\n\r\nconst readBoolean = (source: Record<string, unknown>, key: string, fallback: boolean): boolean => {\r\n const value = source[key]\r\n return typeof value === 'boolean' ? value : fallback\r\n}\r\n\r\nconst readNumber = (source: Record<string, unknown>, key: string, fallback: number): number => {\r\n const value = source[key]\r\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : fallback\r\n}\r\n\r\nconst readSkillSwitches = (source: Record<string, unknown>, key: string): Record<string, boolean> => {\r\n const value = source[key]\r\n if (value === null || typeof value !== 'object') return {}\r\n const entries = Object.entries(value as Record<string, unknown>)\r\n const result: Record<string, boolean> = {}\r\n for (const [name, enabled] of entries) {\r\n if (typeof enabled === 'boolean') result[name] = enabled\r\n }\r\n return result\r\n}\r\n\r\nconst readSkillCatalog = (source: Record<string, unknown>, key: string): SkillCatalogEntry[] => {\r\n const value = source[key]\r\n if (!Array.isArray(value)) return []\r\n return value.flatMap((entry) => {\r\n if (entry === null || typeof entry !== 'object') return []\r\n const record = entry as Record<string, unknown>\r\n const folder = readString(record, 'folder')\r\n const name = readString(record, 'name')\r\n if (folder === undefined || name === undefined) return []\r\n return [{ folder, name, description: readString(record, 'description') ?? '' }]\r\n })\r\n}\r\n\r\nconst errorMessage = (error: unknown): string => error instanceof Error ? error.message : String(error)\r\n\r\nfunction CollapsibleSection(props: { title: string; hint?: string; open: boolean; onToggle: () => void; children: ReactNode }): ReactNode {\r\n return (\r\n <div className={styles.subSection}>\r\n <button type=\"button\" className={styles.subHeader} aria-expanded={props.open} onClick={props.onToggle}>\r\n <span className={styles.subTitle}>{props.title}</span>\r\n {props.hint && <span className={styles.subCount}>{props.hint}</span>}\r\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.open && styles.chevronOpen)} />\r\n </button>\r\n {props.open && <div className={styles.subBody}>{props.children}</div>}\r\n </div>\r\n )\r\n}\r\n\r\nexport function PromptEditor(props: PromptEditorProps): ReactNode {\r\n const { api } = props\r\n const [open, setOpen] = useState(false)\r\n const [promptOpen, setPromptOpen] = useState(false)\r\n const [agentsOpen, setAgentsOpen] = useState(false)\r\n const [skillsOpen, setSkillsOpen] = useState(false)\r\n const [presetOpen, setPresetOpen] = useState(false)\r\n const [deepseekAvailable, setDeepseekAvailable] = useState(false)\r\n const [deepseekProviders, setDeepseekProviders] = useState<string[]>([])\r\n const [deepseekError, setDeepseekError] = useState('')\r\n const [loaded, setLoaded] = useState(false)\r\n const [fields, setFields] = useState<Fields>(EMPTY)\r\n const [bootstrapTokensDraft, setBootstrapTokensDraft] = useState(DEFAULT_BOOTSTRAP_DISPLAY)\r\n const [skillsDirDraft, setSkillsDirDraft] = useState('')\r\n const [savedPromptText, setSavedPromptText] = useState('')\r\n const [savedAgentsText, setSavedAgentsText] = useState('')\r\n const [savedSwitches, setSavedSwitches] = useState<SwitchSnapshot>(EMPTY_SWITCHES)\r\n const [loading, setLoading] = useState(false)\r\n const [savingPrompt, setSavingPrompt] = useState(false)\r\n const [savingAgents, setSavingAgents] = useState(false)\r\n const [savingSkillsDir, setSavingSkillsDir] = useState(false)\r\n const [restoringPrompt, setRestoringPrompt] = useState(false)\r\n const [restoringAgents, setRestoringAgents] = useState(false)\r\n const [notice, setNotice] = useState('')\r\n const [noticeKind, setNoticeKind] = useState<'ok' | 'error'>('ok')\r\n const fieldsRef = useRef<Fields>(EMPTY)\r\n const revisionRef = useRef<number | undefined>(undefined)\r\n const saveQueueRef = useRef<Promise<void>>(Promise.resolve())\r\n\r\n const showNotice = useCallback((kind: 'ok' | 'error', message: string) => {\r\n setNotice(message)\r\n setNoticeKind(kind)\r\n }, [])\r\n\r\n const load = useCallback(async () => {\r\n setLoading(true)\r\n try {\r\n const res = await bridgePost<BridgeSettingsView>('/describe', {})\r\n if (!res.ok) { showNotice('error', '读取配置失败:' + (res.message ?? '')); return }\r\n setDeepseekAvailable(res.deepseekAvailable === true)\r\n setDeepseekProviders(res.deepseekProviders ?? [])\r\n setDeepseekError(res.deepseekError ?? '')\r\n const ns = res.value\r\n const value = asRecord(ns.value)\r\n const base = asRecord(ns.base)\r\n const next: Fields = {\r\n promptText: readString(value, 'promptText') ?? readString(base, 'promptText') ?? '',\r\n promptPath: readString(value, 'promptPath') ?? readString(base, 'promptPath') ?? '',\r\n agentsText: readString(value, 'agentsText') ?? readString(base, 'agentsText') ?? '',\r\n agentsPath: readString(value, 'agentsPath') ?? readString(base, 'agentsPath') ?? '',\r\n injectAgentsPrompt: readBoolean(value, 'injectAgentsPrompt', readBoolean(base, 'injectAgentsPrompt', false)),\r\n anchorFirstTurn: readBoolean(value, 'anchorFirstTurn', readBoolean(base, 'anchorFirstTurn', false)),\r\n anchorText: readString(value, 'anchorText') ?? readString(base, 'anchorText') ?? '',\r\n anchorCustom: readBoolean(value, 'anchorCustom', readBoolean(base, 'anchorCustom', false)),\r\n guideText: readString(value, 'guideText') ?? readString(base, 'guideText') ?? '',\r\n guideCustom: readBoolean(value, 'guideCustom', readBoolean(base, 'guideCustom', false)),\r\n subagentFlash: readBoolean(value, 'subagentFlash', readBoolean(base, 'subagentFlash', false)),\r\n bootstrapMaxTokens: readNumber(value, 'bootstrapMaxTokens', readNumber(base, 'bootstrapMaxTokens', 0)),\r\n usePtcMode: readBoolean(value, 'usePtcMode', readBoolean(base, 'usePtcMode', true)),\r\n injectPrompt: readBoolean(value, 'injectPrompt', readBoolean(base, 'injectPrompt', true)),\r\n skillSwitches: value.skillSwitches !== undefined || base.skillSwitches !== undefined\r\n ? { ...readSkillSwitches(base, 'skillSwitches'), ...readSkillSwitches(value, 'skillSwitches') }\r\n : {},\r\n skillCatalog: res.skillCatalog ?? (readSkillCatalog(value, 'skillCatalog').length > 0\r\n ? readSkillCatalog(value, 'skillCatalog')\r\n : readSkillCatalog(base, 'skillCatalog')),\r\n skillsDir: readString(value, 'skillsDir') ?? readString(base, 'skillsDir') ?? '',\r\n activeSkillsDir: res.activeSkillsDir ?? readString(value, 'activeSkillsDir') ?? readString(base, 'activeSkillsDir') ?? '',\r\n writeAgents: readBoolean(value, 'writeAgents', readBoolean(base, 'writeAgents', true)),\r\n writePreset: readBoolean(value, 'writePreset', readBoolean(base, 'writePreset', true)),\r\n }\r\n fieldsRef.current = next\r\n setFields(next)\r\n setBootstrapTokensDraft(next.bootstrapMaxTokens > 0 ? String(next.bootstrapMaxTokens) : DEFAULT_BOOTSTRAP_DISPLAY)\r\n setSkillsDirDraft(next.skillsDir)\r\n setSavedPromptText(next.promptText)\r\n setSavedAgentsText(next.agentsText)\r\n setSavedSwitches(snapshotSwitches(next))\r\n revisionRef.current = ns.revision\r\n setNotice('')\r\n } catch (error) {\r\n showNotice('error', '读取失败:' + errorMessage(error))\r\n } finally {\r\n setLoading(false)\r\n }\r\n }, [showNotice])\r\n\r\n const refreshRevision = useCallback(async () => {\r\n try {\r\n const res = await bridgePost<BridgeSettingsView>('/describe', {})\r\n if (!res.ok) return\r\n revisionRef.current = res.value.revision\r\n } catch {\r\n // 刷新失败保持原 revision,用户可重试。\r\n }\r\n }, [])\r\n\r\n const restoreOriginal = useCallback(async (scope: 'preset' | 'agents') => {\r\n const setBusy = scope === 'preset' ? setRestoringPrompt : setRestoringAgents\r\n setBusy(true)\r\n try {\r\n const res = await bridgePost<BridgeSettingsView>('/restore-originals', {\r\n scope,\r\n expectedRevision: revisionRef.current,\r\n })\r\n if (!res.ok) {\r\n await refreshRevision()\r\n showNotice('error', '从项目还原失败:' + (res.message ?? '') + '(已刷新配置版本,可重试)')\r\n return\r\n }\r\n revisionRef.current = res.value.revision\r\n await load()\r\n showNotice('ok', scope === 'preset' ? 'preset.md 已从项目原文还原到设置' : 'AGENTS.md 已从项目原文还原到设置')\r\n } catch (error) {\r\n await refreshRevision()\r\n showNotice('error', '从项目还原失败:' + errorMessage(error) + '(已刷新配置版本,可重试)')\r\n } finally {\r\n setBusy(false)\r\n }\r\n }, [load, refreshRevision, showNotice])\r\n\r\n const patch = (partial: Partial<Fields>) => {\r\n const next = { ...fieldsRef.current, ...partial }\r\n fieldsRef.current = next\r\n setFields(next)\r\n }\r\n\r\n const toggleOpen = () => {\r\n const next = !open\r\n setOpen(next)\r\n if (!next) return\r\n if (!loaded) {\r\n setLoaded(true)\r\n void load()\r\n } else if (!dirty) {\r\n // 无未保存草稿时,每次展开同步最新 settings(其他客户端可能已修改)。\r\n void load()\r\n }\r\n }\r\n\r\n const openEdit = async () => {\r\n if (!fields.promptPath) { showNotice('error', '路径未知,请先保存一次或在下方直接编辑'); return }\r\n try {\r\n const res = await api.host.openPath({ path: fields.promptPath })\r\n if (res.result.ok) showNotice('ok', '已用系统编辑器打开 preset.md')\r\n else showNotice('error', '打开失败:' + (res.result.error?.message ?? '') + ';可直接在下方编辑框保存')\r\n } catch (error) {\r\n showNotice('error', '打开失败:' + errorMessage(error) + ';可直接在下方编辑框保存')\r\n }\r\n }\r\n\r\n const openAgents = async () => {\r\n if (!fields.agentsPath) { showNotice('error', '路径未知,请先保存一次或在下方直接编辑'); return }\r\n try {\r\n const res = await api.host.openPath({ path: fields.agentsPath })\r\n if (res.result.ok) showNotice('ok', '已用系统编辑器打开 AGENTS.md')\r\n else showNotice('error', '打开失败:' + (res.result.error?.message ?? '') + ';可直接在下方编辑框保存')\r\n } catch (error) {\r\n showNotice('error', '打开失败:' + errorMessage(error) + ';可直接在下方编辑框保存')\r\n }\r\n }\r\n\r\n const openSkillsDir = async () => {\r\n const path = fields.activeSkillsDir || fields.skillsDir\r\n if (!path) { showNotice('error', '技能目录路径未知,请先重新展开面板读取配置'); return }\r\n try {\r\n const res = await api.host.openPath({ path })\r\n if (res.result.ok) showNotice('ok', '已打开技能目录:' + path)\r\n else showNotice('error', '打开失败:' + (res.result.error?.message ?? ''))\r\n } catch (error) {\r\n showNotice('error', '打开失败:' + errorMessage(error))\r\n }\r\n }\r\n\r\n const enqueueSave = useCallback((ops: BridgePathOp[], okMessage: string | undefined, onSaved: () => void, setBusy?: (busy: boolean) => void) => {\r\n setBusy?.(true)\r\n saveQueueRef.current = saveQueueRef.current.then(async () => {\r\n try {\r\n const res = await bridgePost<BridgeSettingsView>('/mutate', { ops, expectedRevision: revisionRef.current })\r\n if (res.ok) {\r\n revisionRef.current = res.value.revision\r\n onSaved()\r\n if (okMessage) showNotice('ok', okMessage)\r\n } else {\r\n await refreshRevision()\r\n showNotice('error', '保存失败:' + (res.message ?? '') + '(已刷新配置版本,可重试)')\r\n }\r\n } catch (error) {\r\n await refreshRevision()\r\n showNotice('error', '保存失败:' + errorMessage(error) + '(已刷新配置版本,可重试)')\r\n } finally {\r\n setBusy?.(false)\r\n }\r\n }).catch(() => {})\r\n }, [refreshRevision, showNotice])\r\n\r\n const savePrompt = () => enqueueSave(\r\n [{ op: 'set', path: ['promptText'], value: fieldsRef.current.promptText }],\r\n 'preset.md 已保存并生效',\r\n () => setSavedPromptText(fieldsRef.current.promptText),\r\n setSavingPrompt,\r\n )\r\n\r\n const saveAgents = () => enqueueSave(\r\n [{ op: 'set', path: ['agentsText'], value: fieldsRef.current.agentsText }],\r\n 'AGENTS.md 已保存并生效',\r\n () => setSavedAgentsText(fieldsRef.current.agentsText),\r\n setSavingAgents,\r\n )\r\n\r\n const persistSwitches = () => enqueueSave(\r\n [\r\n { op: 'set', path: ['injectAgentsPrompt'], value: fieldsRef.current.injectAgentsPrompt },\r\n { op: 'set', path: ['anchorFirstTurn'], value: fieldsRef.current.anchorFirstTurn },\r\n { op: 'set', path: ['anchorText'], value: fieldsRef.current.anchorText },\r\n { op: 'set', path: ['anchorCustom'], value: fieldsRef.current.anchorCustom },\r\n { op: 'set', path: ['guideText'], value: fieldsRef.current.guideText },\r\n { op: 'set', path: ['guideCustom'], value: fieldsRef.current.guideCustom },\r\n { op: 'set', path: ['subagentFlash'], value: fieldsRef.current.subagentFlash },\r\n { op: 'set', path: ['bootstrapMaxTokens'], value: fieldsRef.current.bootstrapMaxTokens },\r\n { op: 'set', path: ['usePtcMode'], value: fieldsRef.current.usePtcMode },\r\n { op: 'set', path: ['injectPrompt'], value: fieldsRef.current.injectPrompt },\r\n { op: 'set', path: ['skillSwitches'], value: fieldsRef.current.skillSwitches },\r\n { op: 'set', path: ['skillsDir'], value: fieldsRef.current.skillsDir },\r\n { op: 'set', path: ['writeAgents'], value: fieldsRef.current.writeAgents },\r\n { op: 'set', path: ['writePreset'], value: fieldsRef.current.writePreset },\r\n ],\r\n undefined,\r\n () => setSavedSwitches(snapshotSwitches(fieldsRef.current)),\r\n )\r\n\r\n const toggle = (key: 'injectAgentsPrompt' | 'anchorFirstTurn' | 'anchorCustom' | 'guideCustom' | 'subagentFlash' | 'injectPrompt' | 'usePtcMode' | 'writeAgents' | 'writePreset') => {\r\n if (key === 'subagentFlash' && !deepseekAvailable) {\r\n showNotice('error', '未检测到 DeepSeek 模型配置,子代理 Flash 开关不可用')\r\n return\r\n }\r\n patch({ [key]: !fieldsRef.current[key] })\r\n persistSwitches()\r\n }\r\n\r\n const toggleBootstrapMaxTokens = () => {\r\n const next = fieldsRef.current.bootstrapMaxTokens > 0 ? 0 : 256000\r\n patch({ bootstrapMaxTokens: next })\r\n setBootstrapTokensDraft(DEFAULT_BOOTSTRAP_DISPLAY)\r\n persistSwitches()\r\n }\r\n\r\n const commitBootstrapTokensDraft = () => {\r\n const parsed = Number(bootstrapTokensDraft)\r\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\r\n // 清空或非法输入不关闭开关:恢复为项目默认 256000(不设上限)。\r\n setBootstrapTokensDraft(DEFAULT_BOOTSTRAP_DISPLAY)\r\n patch({ bootstrapMaxTokens: 256000 })\r\n } else {\r\n patch({ bootstrapMaxTokens: parsed })\r\n }\r\n persistSwitches()\r\n }\r\n\r\n const applySkillsDir = () => {\r\n const next = skillsDirDraft.trim()\r\n patch({ skillsDir: next })\r\n enqueueSave(\r\n [{ op: 'set', path: ['skillsDir'], value: next }],\r\n next.length > 0 ? `自定义技能目录已保存并生效:${next}` : '已切回自动技能目录(当前 profile 下 skills/)',\r\n () => {\r\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\r\n void load()\r\n },\r\n setSavingSkillsDir,\r\n )\r\n }\r\n\r\n const skillEnabled = (folder: string) => fields.skillSwitches[folder] !== false\r\n\r\n const toggleSkill = (folder: string) => {\r\n const enabled = fieldsRef.current.skillSwitches[folder] !== false\r\n patch({ skillSwitches: { ...fieldsRef.current.skillSwitches, [folder]: !enabled } })\r\n persistSwitches()\r\n }\r\n\r\n const currentSwitches = snapshotSwitches(fields)\r\n const dirtyPrompt = fields.promptText !== savedPromptText\r\n const dirtyAgents = fields.agentsText !== savedAgentsText\r\n const dirtySwitches = !switchesEqual(currentSwitches, savedSwitches)\r\n const dirty = dirtyPrompt || dirtyAgents || dirtySwitches\r\n const promptSwitchDirty = fields.injectPrompt !== savedSwitches.injectPrompt\r\n const agentsSwitchDirty = fields.injectAgentsPrompt !== savedSwitches.injectAgentsPrompt\r\n || fields.writeAgents !== savedSwitches.writeAgents\r\n const skillsSwitchDirty = JSON.stringify(fields.skillSwitches) !== JSON.stringify(savedSwitches.skillSwitches)\r\n const skillsDirDirty = fields.skillsDir !== savedSwitches.skillsDir || skillsDirDraft.trim() !== fields.skillsDir\r\n const presetSwitchDirty = fields.writePreset !== savedSwitches.writePreset\r\n || fields.anchorFirstTurn !== savedSwitches.anchorFirstTurn\r\n || fields.anchorText !== savedSwitches.anchorText\r\n || fields.bootstrapMaxTokens !== savedSwitches.bootstrapMaxTokens\r\n || fields.usePtcMode !== savedSwitches.usePtcMode\r\n\r\n const discardPrompt = () => patch({ promptText: savedPromptText })\r\n const discardAgents = () => patch({ agentsText: savedAgentsText })\r\n\r\n return (\r\n <li className={clsx(styles.card, open && styles.cardOpen)}>\r\n <button type=\"button\" className={styles.header} aria-expanded={open} onClick={toggleOpen}>\r\n <span className={styles.headText}>\r\n <span className={styles.name}>提示词工具</span>\r\n <span className={styles.description}>编辑 preset.md / AGENTS.md 与各层注入开关,保存后自动生效</span>\r\n </span>\r\n {dirty && <span className={styles.pending}>未保存</span>}\r\n <IconChevronDownOutline14 className={clsx(styles.chevron, open && styles.chevronOpen)} />\r\n </button>\r\n {open && (\r\n <div className={styles.body}>\r\n {loading && <span className={styles.loading}>正在读取配置…</span>}\r\n\r\n <CollapsibleSection\r\n title=\"Preset预设\"\r\n hint={dirtyPrompt || promptSwitchDirty ? '未保存' : undefined}\r\n open={promptOpen}\r\n onToggle={() => setPromptOpen(!promptOpen)}\r\n >\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.injectPrompt}\r\n disabled={!fields.writePreset}\r\n onChange={() => toggle('injectPrompt')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>注入 preset.md(锚定层)</span>\r\n <span className={styles.rowDesc}>注入会话晋升后的 agent/pre-step,消息插入决策消息开头,每会话一次</span>\r\n </span>\r\n </label>\r\n <textarea\r\n className={styles.textarea}\r\n aria-label=\"preset.md 内容\"\r\n value={fields.promptText}\r\n onChange={(e) => patch({ promptText: e.target.value })}\r\n spellCheck={false}\r\n />\r\n <div className={styles.actions}>\r\n <button type=\"button\" className={styles.primary} disabled={savingPrompt || savingAgents || !dirtyPrompt} onClick={savePrompt}>{savingPrompt ? '保存中…' : '保存'}</button>\r\n <button type=\"button\" className={styles.secondary} disabled={!dirtyPrompt} onClick={discardPrompt}>还原草稿</button>\r\n <button type=\"button\" className={styles.secondary} disabled={savingPrompt || savingAgents || restoringPrompt || restoringAgents} onClick={() => void restoreOriginal('preset')}>{restoringPrompt ? '还原中…' : '项目还原'}</button>\r\n <button type=\"button\" className={styles.secondary} onClick={openEdit}>打开</button>\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <CollapsibleSection\r\n title=\"AGENTS设置\"\r\n hint={dirtyAgents || agentsSwitchDirty ? '未保存' : undefined}\r\n open={agentsOpen}\r\n onToggle={() => setAgentsOpen(!agentsOpen)}\r\n >\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.injectAgentsPrompt}\r\n disabled={!fields.writePreset}\r\n onChange={() => toggle('injectAgentsPrompt')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>注入 AGENTS.md</span>\r\n <span className={styles.rowDesc}>注入会话晋升后的第一个 agent/pre-step,消息追加在决策消息末尾,每会话一次</span>\r\n </span>\r\n </label>\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.writeAgents}\r\n onChange={() => toggle('writeAgents')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>写入 ~/.dsh/AGENTS.md</span>\r\n <span className={styles.rowDesc}>保持 AGENTS.md 的全局常驻注入;关闭后不再写入,已有文件保持原样</span>\r\n </span>\r\n </label>\r\n <textarea\r\n className={styles.textarea}\r\n aria-label=\"AGENTS.md 内容\"\r\n value={fields.agentsText}\r\n onChange={(e) => patch({ agentsText: e.target.value })}\r\n spellCheck={false}\r\n />\r\n <div className={styles.actions}>\r\n <button type=\"button\" className={styles.primary} disabled={savingPrompt || savingAgents || !dirtyAgents} onClick={saveAgents}>{savingAgents ? '保存中…' : '保存'}</button>\r\n <button type=\"button\" className={styles.secondary} disabled={!dirtyAgents} onClick={discardAgents}>还原草稿</button>\r\n <button type=\"button\" className={styles.secondary} disabled={savingPrompt || savingAgents || restoringPrompt || restoringAgents} onClick={() => void restoreOriginal('agents')}>{restoringAgents ? '还原中…' : '项目还原'}</button>\r\n <button type=\"button\" className={styles.secondary} onClick={openAgents}>打开</button>\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <CollapsibleSection\r\n title=\"Skills设置\"\r\n hint={`${fields.skillCatalog.length} 个${skillsSwitchDirty || skillsDirDirty ? ' · 未保存' : ''}`}\r\n open={skillsOpen}\r\n onToggle={() => setSkillsOpen(!skillsOpen)}\r\n >\r\n <div className={styles.skillsBar}>\r\n <div className={styles.skillsDirRow}>\r\n <button\r\n type=\"button\"\r\n className={styles.secondary}\r\n disabled={!fields.activeSkillsDir && !fields.skillsDir}\r\n onClick={() => void openSkillsDir()}\r\n >\r\n 打开技能目录\r\n </button>\r\n <span className={styles.skillsPath}>{fields.activeSkillsDir || fields.skillsDir || '(技能目录路径未知,请重新展开面板)'}</span>\r\n </div>\r\n <div className={styles.skillsDirRow}>\r\n <input\r\n className={styles.skillsDirInput}\r\n aria-label=\"用户自定义技能目录\"\r\n value={skillsDirDraft}\r\n placeholder={fields.activeSkillsDir || '留空 = 自动使用当前 profile 下的 skills/ 副本'}\r\n spellCheck={false}\r\n onChange={(e) => setSkillsDirDraft(e.target.value)}\r\n />\r\n <button\r\n type=\"button\"\r\n className={styles.primary}\r\n disabled={savingSkillsDir || skillsDirDraft.trim() === fields.skillsDir}\r\n onClick={applySkillsDir}\r\n >\r\n {savingSkillsDir ? '设置中…' : '设置自定义目录'}\r\n </button>\r\n </div>\r\n <span className={styles.rowDesc}>留空并点“设置自定义目录”会切回自动目录(当前 profile 下的 skills/ 副本)。修改后技能目录立即重新扫描。</span>\r\n </div>\r\n {fields.skillCatalog.length === 0 ? (\r\n <span className={styles.subEmpty}>skills 目录下没有技能</span>\r\n ) : fields.skillCatalog.map((skill) => (\r\n <label key={skill.folder} className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={skillEnabled(skill.folder)}\r\n onChange={() => toggleSkill(skill.folder)}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>{skill.name || skill.folder}</span>\r\n <span className={styles.rowDesc}>skills/{skill.folder}{skill.description ? ` · ${skill.description}` : ''}</span>\r\n </span>\r\n </label>\r\n ))}\r\n </CollapsibleSection>\r\n\r\n <CollapsibleSection\r\n title=\"锚定与 preset\"\r\n hint={presetSwitchDirty ? '未保存' : undefined}\r\n open={presetOpen}\r\n onToggle={() => setPresetOpen(!presetOpen)}\r\n >\r\n\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.writePreset}\r\n onChange={() => toggle('writePreset')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>启用锚定预设</span>\r\n <span className={styles.rowDesc}>总开关:开启时生成并刷新 ~/.dsh/.agent-presets/prompt-tool/,整套锚定预设才有载体;关闭时移除已生成的目录,下面锚定开关随之失效</span>\r\n </span>\r\n </label>\r\n\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.usePtcMode}\r\n disabled={!fields.writePreset}\r\n onChange={() => toggle('usePtcMode')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>使用 PTC 模式</span>\r\n <span className={styles.rowDesc}>默认开启:晋升后把 wire 切换为 Code Mode(PTC,单一 run_code),完整插件工具通过生成 SDK 调用。关闭后恢复原生完整工具目录</span>\r\n </span>\r\n </label>\r\n\r\n <div className={styles.row}>\r\n <input\r\n id=\"prompt-tool-bootstrap-max-tokens\"\r\n type=\"checkbox\"\r\n checked={fields.bootstrapMaxTokens > 0}\r\n disabled={!fields.writePreset}\r\n onChange={toggleBootstrapMaxTokens}\r\n />\r\n <label htmlFor=\"prompt-tool-bootstrap-max-tokens\" className={styles.rowText}>\r\n <span className={styles.rowName}>首轮输出封顶</span>\r\n <span className={styles.rowDesc}>关闭时显示项目默认 256000(不设上限);开启后右侧数值生效,晋升后自动剥离。清空或输入 0 会恢复 256000,不关闭开关</span>\r\n </label>\r\n <input\r\n className={styles.bootstrapTokensInput}\r\n type=\"number\"\r\n min={1}\r\n step={1}\r\n value={bootstrapTokensDraft}\r\n disabled={!fields.writePreset || fields.bootstrapMaxTokens === 0}\r\n onChange={(e) => setBootstrapTokensDraft(e.target.value)}\r\n onBlur={commitBootstrapTokensDraft}\r\n />\r\n </div>\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.subagentFlash}\r\n disabled={!fields.writePreset || !deepseekAvailable}\r\n onChange={() => toggle('subagentFlash')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>子代理固定 Flash 模型</span>\r\n <span className={styles.rowDesc}>{deepseekAvailable ? '开启时采用 dsh-router-standard 的 Flash 子代理方案:固定 Flash 路由 + 任务分类人设 + 三锚;宿主直派子代理(含 dsh-mnemon)也会自动补 Flash 路由。关闭时继承主会话模型,工具目录全量放行' : `未检测到 DeepSeek 模型配置,此开关不可用。providers=[${deepseekProviders.join(', ') || '空'}]${deepseekError ? ' error=' + deepseekError : ''}`}</span>\r\n </span>\r\n </label>\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.anchorFirstTurn}\r\n disabled={!fields.writePreset}\r\n onChange={() => toggle('anchorFirstTurn')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>追加任务引导</span>\r\n <span className={styles.rowDesc}>总开关:开启后在首条真实用户消息之后追加任务引导;关闭时下方首句与每轮的自定义开关、编辑框全部禁用</span>\r\n </span>\r\n </label>\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.anchorCustom}\r\n disabled={!fields.writePreset || !fields.anchorFirstTurn}\r\n onChange={() => toggle('anchorCustom')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>使用自定义引导(首句)</span>\r\n <span className={styles.rowDesc}>开启时使用下方文本作为引导;关闭时忽略下方文本,按任务自动选择 we/let 引导</span>\r\n </span>\r\n </label>\r\n <label className={clsx(styles.rowStack, (!fields.anchorFirstTurn || !fields.anchorCustom) && styles.rowDisabled)}>\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>自定义引导文本(首句)</span>\r\n <span className={styles.rowDesc}>仅在上方“使用自定义引导(首句)”开启时生效;关闭时自动文本优先</span>\r\n </span>\r\n <textarea\r\n className={styles.anchorInput}\r\n value={fields.anchorText}\r\n disabled={!fields.writePreset || !fields.anchorFirstTurn || !fields.anchorCustom}\r\n onChange={(e) => patch({ anchorText: e.target.value })}\r\n onBlur={() => persistSwitches()}\r\n spellCheck={false}\r\n />\r\n </label>\r\n <label className={styles.row}>\r\n <input\r\n type=\"checkbox\"\r\n checked={fields.guideCustom}\r\n disabled={!fields.writePreset || !fields.anchorFirstTurn}\r\n onChange={() => toggle('guideCustom')}\r\n />\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>使用自定义引导(每轮)</span>\r\n <span className={styles.rowDesc}>开启时每轮固定使用下方文本作为引导;关闭时忽略下方文本,按任务自动选择</span>\r\n </span>\r\n </label>\r\n <label className={clsx(styles.rowStack, (!fields.anchorFirstTurn || !fields.guideCustom) && styles.rowDisabled)}>\r\n <span className={styles.rowText}>\r\n <span className={styles.rowName}>自定义引导文本(每轮)</span>\r\n <span className={styles.rowDesc}>仅在上方“使用自定义引导(每轮)”开启时生效;留空则不注入</span>\r\n </span>\r\n <textarea\r\n className={styles.anchorInput}\r\n value={fields.guideText}\r\n disabled={!fields.writePreset || !fields.anchorFirstTurn || !fields.guideCustom}\r\n onChange={(e) => patch({ guideText: e.target.value })}\r\n onBlur={() => persistSwitches()}\r\n spellCheck={false}\r\n />\r\n </label>\r\n </CollapsibleSection>\r\n\r\n {notice && <span className={clsx(styles.notice, noticeKind === 'error' && styles.noticeError)}>{notice}</span>}\r\n </div>\r\n )}\r\n </li>\r\n )\r\n}\r\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 {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport { PromptEditor, type PromptEditorInjected } from './PromptEditor.tsx'\n\nexport const inject = ['slots', 'connection']\n\nexport function apply(ctx: ClientContext): void {\n const connection = ctx.get('connection') as ConnectionHandle\n\n const injected = (): PromptEditorInjected => ({\n api: connection.api,\n })\n\n // dsh 0.1.0-rc.7 起 settings.plugin.item 是 keyed slot,\n // key = 插件 settings namespace(与 Host 端 settingsNamespace('prompt-tool') 对应)。\n ctx.slots.inject('settings.plugin.item', () => ctx.slots.register({\n name: 'settings.plugin.item',\n key: 'prompt-tool',\n inject: injected,\n }, PromptEditor))\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
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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"}
|