dsh-plugin-prompt-tool 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +11 -9
  2. package/engine/anchor-match.mjs +38 -12
  3. package/engine/anchor-turn.mjs +68 -0
  4. package/engine/classify-task.mjs +35 -0
  5. package/engine/code-presentation.mjs +103 -0
  6. package/engine/compositions/library/anchor-turn.yml +10 -0
  7. package/engine/compositions/library/bootstrap-filesystem.yml +1 -1
  8. package/engine/compositions/library/code-presentation.yml +8 -0
  9. package/engine/compositions/library/command-goal.yml +11 -0
  10. package/engine/compositions/library/compaction.yml +1 -1
  11. package/engine/compositions/library/context-gate.yml +1 -2
  12. package/engine/compositions/library/cot-drip.yml +11 -0
  13. package/engine/compositions/library/custom-bash.yml +1 -1
  14. package/engine/compositions/library/delegation.yml +11 -7
  15. package/engine/compositions/library/deliberation-gate.yml +11 -0
  16. package/engine/compositions/library/persistent-shell.yml +25 -2
  17. package/engine/compositions/library/persona.yml +6 -2
  18. package/engine/compositions/library/planning.yml +1 -1
  19. package/engine/compositions/library/prompt-config-engine.yml +1 -1
  20. package/engine/compositions/library/run-code-env.yml +1 -1
  21. package/engine/compositions/library/skill-filesystem.yml +1 -1
  22. package/engine/compositions/library/skill-search.yml +1 -1
  23. package/engine/compositions/library/str-replace-editor.yml +2 -2
  24. package/engine/compositions/library/tool-ask-user.yml +1 -1
  25. package/engine/compositions/library/tool-bash.yml +1 -1
  26. package/engine/compositions/library/tool-bootstrap.yml +1 -3
  27. package/engine/compositions/library/tool-config-engine.yml +9 -0
  28. package/engine/compositions/library/tool-filter.yml +3 -7
  29. package/engine/compositions/library/tool-fs-search.yml +1 -1
  30. package/engine/compositions/library/tool-fs.yml +1 -1
  31. package/engine/compositions/library/tool-goal.yml +1 -9
  32. package/engine/compositions/library/tool-jobs.yml +1 -1
  33. package/engine/compositions/library/tool-pwsh.yml +1 -1
  34. package/engine/compositions/library/tool-todo.yml +1 -1
  35. package/engine/compositions/library/tool-web.yml +2 -2
  36. package/engine/compositions/source/local/code-presentation.yml +8 -0
  37. package/engine/compositions/source/local/context-gate.yml +0 -1
  38. package/engine/compositions/source/local/str-replace-editor.yml +10 -0
  39. package/engine/compositions/source/local/tool-bootstrap.yml +1 -3
  40. package/engine/compositions/source/local/tool-config-engine.yml +9 -0
  41. package/engine/compositions/source/local/tool-filter.yml +8 -0
  42. package/engine/cot-drip.mjs +137 -0
  43. package/engine/custom-bash.mjs +73 -21
  44. package/engine/deliberation-gate.mjs +127 -0
  45. package/engine/layers.mjs +223 -198
  46. package/engine/run-code-env.mjs +8 -2
  47. package/engine/schema.mjs +1 -1
  48. package/engine/strategies.mjs +25 -14
  49. package/engine/tool-bootstrap.mjs +185 -59
  50. package/engine/tool-config-engine.mjs +390 -0
  51. package/lib/client.js +3840 -2311
  52. package/lib/client.js.map +1 -1
  53. package/lib/index.d.mts +185 -79
  54. package/lib/index.mjs +1000 -356
  55. package/lib/preset-core.d.mts +1 -1
  56. package/lib/preset-core.mjs +29 -3
  57. package/lib/{prompt-configs-BgFw_bFf.mjs → prompt-configs-BnQKRHVb.mjs} +211 -136
  58. package/lib/prompt-configs-CN0sJTUL.d.mts +193 -0
  59. package/package.json +121 -105
  60. package/preset/anchored/preset.yml +262 -308
  61. package/preset/creative/preset.yml +34 -32
  62. package/preset/custom/preset.yml +0 -1
  63. package/preset/liangshen/preset.yml +53 -50
  64. package/preset/minimal/preset.yml +18 -17
  65. package/preset/ptc/preset.yml +35 -33
  66. package/preset/standard/preset.yml +34 -32
  67. package/templates/10-pre-step.yml +18 -15
  68. package/templates/14-first-turn-anchor.yml +13 -13
  69. package/templates/15-guide-auto.yml +13 -13
  70. package/templates/16-custom-fallback.yml +19 -18
  71. package/templates/18-placeholder-env-facts.yml +13 -2
  72. package/templates/30-runtime-context.yml +3 -0
  73. package/templates/40-agent-request.yml +9 -9
  74. package/templates/60-tool-pipeline.yml +9 -8
  75. package/templates/tools/10-shell-command.yml +20 -0
  76. package/templates/tools/20-http-fetch.yml +24 -0
  77. package/templates/tools/30-fs-read.yml +20 -0
  78. package/templates/tools/40-delegate-character.yml +15 -0
  79. package/templates/tools/50-delegate-worldbook.yml +15 -0
  80. package/templates/tools/60-delegate-session-var.yml +15 -0
  81. package/templates/tools/70-delegate-worldbook-upsert.yml +36 -0
  82. package/lib/prompt-configs-B4vH09wx.d.mts +0 -100
  83. package/templates/11-merged-a.yml +0 -11
  84. package/templates/13-anchor.yml +0 -19
  85. package/templates/17-instruction-hint.yml +0 -23
  86. package/templates/19-placeholder-skill-catalog.yml +0 -19
  87. package/templates/31-runtime-context-placeholder.yml +0 -18
package/lib/index.d.mts CHANGED
@@ -1,18 +1,9 @@
1
- import { n as PromptConfigFile, r as PromptConfigSpec } from "./prompt-configs-B4vH09wx.mjs";
1
+ import { c as PresetWriterParams, l as WRITER_PARAM_KEYS, n as PromptConfigFile, r as PromptConfigSpec, s as ENGINE_PARAM_KEYS } from "./prompt-configs-CN0sJTUL.mjs";
2
2
  import { SettingsNamespace } from "@deepseek-ai/dsh-settings";
3
+ import { parseDocument } from "yaml";
3
4
  import z from "@deepseek-ai/schemastery";
4
5
  import { Context } from "@deepseek-ai/cordis";
5
6
  //#region src/shared/param-keys.d.ts
6
- /**
7
- * 引擎行为参数键(按预设存储:激活预设 preset.yml 的 params + promptConfigs)。
8
- * 不进 Config schema、不进 settings namespace——每预设一份,随预设走(官方范式:
9
- * Config = 部署轴,引擎行为在预设文件)。
10
- *
11
- * 这些键在 UI 有专门编辑入口(模型设置 / 工具与深度 / 开关),writePreset 把
12
- * 预设级 params 合并进每条 promptConfig 的 params 时排除——「params(高级参数
13
- * JSON)」框只保留内容变量与配置自身策略参数,避免 UI 已管理的参数冗余回写。
14
- * 放 shared:host(write-preset)与 config/settings-bridge 共用,单一来源。
15
- */
16
7
  declare const PARAM_KEYS: ReadonlySet<string>;
17
8
  //#endregion
18
9
  //#region src/config.d.ts
@@ -114,47 +105,14 @@ interface PromptSettings {
114
105
  declare const PromptSettingsSchema: z<PromptSettings>;
115
106
  //#endregion
116
107
  //#region src/host/write-preset.d.ts
117
- interface WritePresetOptions {
118
- firstTurnAnchor: boolean;
119
- firstTurnText: string;
120
- firstTurnCustom: boolean;
121
- guideText: string;
122
- guideCustom: boolean;
123
- injectPrompt: boolean;
124
- modelProvider: string;
125
- modelName: string;
126
- /** 子代理固定模型路由 provider(agentOptions 注入 tool-subagent)。 */
127
- subagentModelProvider: string;
128
- /** 子代理固定模型名。 */
129
- subagentModelName: string;
130
- /** 主对话思维程度(agent-request patch reasoningEffort;''=不设置,官方档位 off/low/high/max)。 */
131
- modelReasoningEffort?: string;
132
- /** 主对话采样温度(agent-request patch temperature;''=不设置)。 */
133
- modelTemperature?: string;
134
- /** 主对话输出上限(agent-request patch maxTokens;''=不设置)。 */
135
- modelMaxTokens?: string;
136
- /** 子代理思维程度(agent-request patch,audience=subagent;''=不设置)。 */
137
- subagentReasoningEffort?: string;
138
- /** 子代理采样温度(agent-request patch,audience=subagent;''=不设置)。 */
139
- subagentTemperature?: string;
140
- /** 子代理输出上限(agent-request patch,audience=subagent;''=不设置)。 */
141
- subagentMaxTokens?: string;
142
- /** 子代理自定义模型人设(per-child shadow;缺省 = 经 scope 链继承主会话 persona 模块)。 */
143
- subagentPersona?: string;
144
- /** 委派工具集白名单(toolFilter.allow;支持数组或逗号/空格分隔字符串)。 */
145
- toolFilterAllow?: string[] | string;
146
- /** 委派工具集黑名单(toolFilter.deny)。 */
147
- toolFilterDeny?: string[] | string;
148
- /** 委派递归深度上限(0 禁止委派 / provider-managed / 正整数)。 */
149
- maxDepth?: number | 'provider-managed' | string;
150
- /** 注入 kind 白名单(context-gate allowKinds;数组或逗号分隔字符串)。 */
151
- allowKinds?: string[] | string;
152
- /** custom-fallback 锚定词(prompt-injector params.firstTurnWord)。 */
153
- firstTurnWord?: string;
108
+ /**
109
+ * 把任意单一参数预设模板物化到生成目录(writePreset)的写入态选项。
110
+ * 引擎参数契约来自 shared/engine-params.ts(PresetWriterParams:runtimeOf 透传子集),
111
+ * 此处只保留 writePreset 专属字段——加引擎参数只需改一处契约,漏透传变成编译错误。
112
+ */
113
+ interface WritePresetOptions extends PresetWriterParams {
154
114
  /** 是否注入 agents.md 内容到 instruction-hint(false 时 instruction-hint 走引擎默认提示/动态探测)。 */
155
115
  injectAgentsPrompt?: boolean;
156
- bootstrapMaxTokens: number;
157
- usePtcMode: boolean;
158
116
  /** 写入 agents-instruction.txt 供 instruction-hint 配置读取;不传则使用本地默认 hint。 */
159
117
  agentsInstructionText?: string;
160
118
  presetDir: string;
@@ -163,6 +121,10 @@ interface WritePresetOptions {
163
121
  promptConfigs: PromptConfigSpec[];
164
122
  /** 预设模板名(preset/<name>);默认 anchored(兼容期)。 */
165
123
  presetTemplate?: string;
124
+ /** 输出目录/预设 id 覆盖(旧容器 id 兼容别名,如 prompt-tool);缺省 = presetTemplate 同名输出。 */
125
+ outputId?: string;
126
+ /** 兼容别名标记:输出目录是源预设的镜像(preset.yml name 加后缀,UI 可识别展示)。 */
127
+ aliasOf?: boolean;
166
128
  /** 目录加载失败等非致命告警回调。 */
167
129
  warn?: (message: string) => void;
168
130
  }
@@ -170,16 +132,6 @@ interface WritePresetOptions {
170
132
  declare function writePreset(prompt: string, options: WritePresetOptions): void;
171
133
  //#endregion
172
134
  //#region src/host/manifest.d.ts
173
- /**
174
- * manifest — 预设模板单一参数 YAML(preset.yml)的加载与引擎参数解析。
175
- *
176
- * 一个预设 = 一个 preset.yml:
177
- * - modules/params/content/meta 全部是直读参数,无模板语法;
178
- * - 默认提示词配置由引擎按 params 生成(见 write-preset),promptConfigs 仅为可选覆盖;
179
- * - 组合模块中的 __TOKEN__ 由引擎内部 renderEngineTokens 按 params 生成,
180
- * 不再暴露到参数文件。
181
- * 本模块负责参数归一化与引擎 token 渲染;所有 anchored 专属行为都在引擎内部。
182
- */
183
135
  interface PresetSpec {
184
136
  id: string;
185
137
  name: string;
@@ -204,13 +156,13 @@ interface PresetSpec {
204
156
  subagentModel?: Record<string, unknown>;
205
157
  /** 预设级模板变量({{key}} 插值源;与引擎行为参数 params 分离,顶层 variables 段)。 */
206
158
  variables?: Record<string, string>;
159
+ /** 自定义工具定义(tool-config-engine 渲染进 custom-tools/ 后运行时注册)。 */
160
+ customTools?: unknown[];
207
161
  /** 模板变量插值开关(缺省 true = 启用;false = 停用,writePreset 不生成变量文件)。 */
208
162
  variablesEnabled?: boolean;
209
- /** 宿主层默认值(唯一入口):apply 时合并进 Config,settings 仍可覆盖。 */
210
- hostDefaults?: Record<string, unknown>;
211
163
  /** 可选:模板自定义提示词配置覆盖(纯数据,不使用模板语法)。 */
212
164
  promptConfigs?: unknown[];
213
- /** 可选:引擎组合模块行参数覆盖(行级 map config 浅合并,preset 优先)。 */
165
+ /** 可选:引擎组合模块行参数直写(行级 map config 浅合并;参数桥未覆盖的键生效,参数桥优先)。 */
214
166
  moduleConfigs?: Record<string, Record<string, unknown>>;
215
167
  /** 世界书(独立存储段,不进 promptConfigs):injectMode + 条目。 */
216
168
  worldBook?: {
@@ -222,6 +174,12 @@ interface PresetSpec {
222
174
  }
223
175
  /** 加载某个预设模板的单一参数文件 preset/<name>/preset.yml。 */
224
176
  declare function loadPresetSpec(dir: string): PresetSpec;
177
+ /**
178
+ * 顶层模型段 ↔ 扁平参数键双向映射(单一来源)。
179
+ * loadPresetSpec 展平(段 → 扁平键)与 savePresetParams 迁移(扁平键 → 段)
180
+ * 共用本常量,杜绝两处字面量漂移。段结构 = 官方 agent-default-model 同构。
181
+ */
182
+ declare const MODEL_SEGMENT_MAP: Record<string, [string, string]>;
225
183
  /** 预设根:官方 USER_PRESET_DIR(~/.dsh/.agent-presets),导入/新建/种子化的预设都放这里。 */
226
184
  declare function userPresetsDir(): string;
227
185
  /**
@@ -246,6 +204,8 @@ declare function listBuiltinTemplates(): Array<{
246
204
  interface PromptToolState {
247
205
  seeded?: boolean;
248
206
  paramsMigrated?: boolean;
207
+ /** 旧容器 id 兼容快照已处理;删除后不再自动复活。 */
208
+ legacyAliasHandled?: boolean;
249
209
  }
250
210
  /** 读插件状态;文件缺失/损坏返回空对象(按未标记处理,触发首次动作)。 */
251
211
  declare function readPluginState(): PromptToolState;
@@ -268,8 +228,8 @@ declare function cloneBuiltinPreset(id: string, autoSuffix?: boolean): {
268
228
  };
269
229
  /**
270
230
  * 保存预设参数:写激活预设目录 preset.yml 的 params(merge)/ promptConfigs(整体替换)。
271
- * parseDocument 保留注释与未知键(preset.yml 模板含大量注释);空值键跳过
272
- * (保留 preset.yml 模板默认)。写入后删除 prompt-tool.overrides.yml(旧参数覆盖
231
+ * parseDocument 保留注释与未知键(preset.yml 模板含大量注释);空值键删除('' / [],
232
+ * 回落模板/引擎默认;0 与 false 照常写入--语义与函数内注释、docs §3 一致)。写入后删除 prompt-tool.overrides.yml(旧参数覆盖
273
233
  * 通道残留——参数已并入 preset.yml,避免旧值覆盖新值)。
274
234
  */
275
235
  declare function savePresetParams(presetRoot: string, templateName: string, params: Record<string, unknown> | undefined, promptConfigs: unknown[] | undefined, variables?: Record<string, string>, variablesEnabled?: boolean): void;
@@ -284,25 +244,91 @@ declare function removeUserPreset(id: string, presetRoot?: string): {
284
244
  };
285
245
  /** 预设 params(默认参数)与运行时 settings 合并;settings 值优先。 */
286
246
  declare function resolvePresetParams(spec: PresetSpec, runtime: Record<string, unknown>): Record<string, unknown>;
247
+ /**
248
+ * 参数桥:params 扁平键 → 引擎模块行 config 对象(取代旧 __TOKEN__ 文本渲染)。
249
+ *
250
+ * 原则:
251
+ * - 未声明的键不合并(composition 行默认 / 引擎默认生效),与旧"空值删行"语义等价;
252
+ * - 值类型直达(布尔/数字/数组不再字符串化再解析);
253
+ * - 合并优先级:参数桥(UI/基础层)> moduleConfigs(模板/ST 行级直写)> 行默认。
254
+ * 模型路由/委派参数统一扁平键(modelProvider/subagentModelProvider/toolFilterAllow/maxDepth 等),
255
+ * 与官方 AgentOptions{provider,model} / toolFilter{allow,deny} / maxDepth 对齐。
256
+ */
257
+ declare function buildModuleConfigsFromParams(params: Record<string, unknown>): Record<string, Record<string, unknown>>;
287
258
  /**
288
259
  * 加载预设声明的组合:
289
260
  * 1. `modules:` 清单 → 引擎模块库按序装配(最终形态);
290
261
  * 2. 兼容 `composition:` 内联文本或组合清单名。
291
262
  */
292
263
  /**
293
- * 行级 config 合并(moduleConfigs):仅支持 map 型 config 浅合并;
294
- * 数组型 config(如 compaction)与未声明模块原样保留。
295
- * 未声明 moduleConfigs 时返回原文(零开销);parseDocument 往返保留注释与 __TOKEN__。
264
+ * 行级 config 合并:仅支持 map 型 config 浅合并;
265
+ * 数组型 config(如 delegation 组)按子行 id 嵌套合并;未声明模块原样保留。
266
+ * 未声明 configs 时返回原文(零开销);parseDocument 往返保留注释。
267
+ * 本函数是参数桥产物落位组合行的唯一机制(含 delegation 组子行嵌套),不是预设覆盖通道。
296
268
  */
297
269
  declare function applyModuleConfigs(raw: string, configs: Record<string, Record<string, unknown>> | undefined): string;
270
+ /**
271
+ * 预设组合渲染完整链路:模块装配 → 参数桥(moduleConfigs + params)行级合并。
272
+ * 合并优先级:参数桥(params/UI 基础层) > moduleConfigs(模板/ST 行级直写) > 行默认。
273
+ * moduleConfigs 仅补充参数桥未覆盖的行级 config(如 ST 导入的 tool-web.fetch),
274
+ * 不再锁定覆盖 UI 可管理参数(旧作者锁定语义已移除)。
275
+ */
276
+ declare function renderComposition(spec: PresetSpec, runtime: Record<string, unknown>, templateDir?: string): string;
298
277
  //#endregion
299
278
  //#region src/host/sillytavern.d.ts
279
+ /**
280
+ * 处理 SillyTavern 文本,ST 变量语义 → 本项目 params fallback 插值:
281
+ * {{setvar::k::v}} → 收集 k=v 进 params(会话变量初始值 = fallback 基准),指令剥离;
282
+ * {{getvar::k}} → 改写为 {{k}}(引擎按 params 插值,无值保留原样);
283
+ * {{getvar::k::default}} → 改写为 {{k}} 且 variables 缺 k 时写入 default(fallback 落顶层 variables);
284
+ * {{trim}}/{{//注释}}/{{ERA:...}} → 剥离(格式化/注释/第三方运行时);
285
+ * {{user}}/{{char}} → 替换占位符。
286
+ */
287
+ declare function processStText(text: string, cardName: string, variables: Record<string, string>): string;
288
+ /** 合并多个转换结果为一个预设(角色卡 × 响应预设 → 单预设)。 */
289
+ declare function mergeStPresets(specs: PresetSpec[]): PresetSpec;
290
+ /** SillyTavern JSON 预设卡片 → 本项目 PresetSpec(导入端点直接消费)。 */
291
+ declare function convertStToPreset(card: unknown, baseName: string): PresetSpec;
300
292
  /** ST 导入预设 id:必须是官方 agent-presets 可发现的目录名(PRESET_ID =
301
293
  * /^[a-z0-9][a-z0-9-]*$/——含中文的目录会被宿主 discovery 静默跳过,会话
302
294
  * resume 报 preset not found)。文件名 slug 化(去中文);纯中文名退化为
303
295
  * st-<文件名短哈希>(唯一且合法);显示名 name 仍保留中文原名。 */
304
296
  declare function stPresetId(baseName: string): string;
305
297
  //#endregion
298
+ //#region src/host/worldbook.d.ts
299
+ type WorldBookEntry = Record<string, unknown>;
300
+ /** buildWorldBookEntry 输入(两通道共用:ST 导入转换与模型 world_book_upsert 工具)。 */
301
+ interface WorldBookEntryInput {
302
+ /** 条目 id;缺省不写(调用方自行加前缀时用,如角色卡 chara-<卡>- 前缀)。 */
303
+ id?: string;
304
+ name: string;
305
+ text: string;
306
+ /** 注入顺序(层内升序);缺省 100。 */
307
+ order?: number;
308
+ /** 启用状态;缺省不写(引擎默认启用)。 */
309
+ enabled?: boolean;
310
+ /** 常驻注入(不依赖关键字)。 */
311
+ constant: boolean;
312
+ keys?: string[];
313
+ secondaryKeys?: string[];
314
+ caseSensitive?: boolean;
315
+ wholeWords?: boolean;
316
+ /** ST selectiveLogic(0/1/2/3 → anchor-match any/all/not/notAny)。 */
317
+ selectiveLogic?: number;
318
+ }
319
+ /**
320
+ * 世界书条目结构工厂(能力归一)。
321
+ * strategy/layer/position 固定值与 params 键集单一权威——ST 导入(sillytavern.ts)
322
+ * 与模型工具(world_book_upsert)共用,不再各自手写条目结构。
323
+ */
324
+ declare function buildWorldBookEntry(input: WorldBookEntryInput): WorldBookEntry;
325
+ /** 当前预设全部世界书条目(保持文件顺序)。 */
326
+ declare function listWorldBookEntries(presetDir: string): WorldBookEntry[];
327
+ /** 新增或更新一条世界书条目(按 id 定位;不存在则追加)。返回写入后条目总数。 */
328
+ declare function upsertWorldBookEntry(presetDir: string, entry: WorldBookEntry): number;
329
+ /** 删除一条世界书条目;不存在抛错。返回删除后条目总数。 */
330
+ declare function deleteWorldBookEntry(presetDir: string, id: string): number;
331
+ //#endregion
306
332
  //#region src/web-surface.d.ts
307
333
  /** 从 loader 根 Include 的 baseUrl 推导 profile 目录。 */
308
334
  declare function resolveProfileDir(ctx: Context): string | undefined;
@@ -381,12 +407,14 @@ interface SkillsBridgeState {
381
407
  declare function registerSettingsBridge(ctx: Context, ns: SettingsNamespace, getModelsState: () => ModelDetection, getSkillsState: () => SkillsBridgeState, getEngineStrategyDir: () => string, ensureRegistered: (sctx: Context) => boolean, afterSkillFix?: () => void,
382
408
  /** 生成目录(presetDir):读取实际生效的提示词配置(引擎加载源)。 */
383
409
  getPresetConfigsDir?: () => string,
384
- /** 内容导入完成回调(更新运行时文本并重建预设)。 */
385
- afterPresetImport?: (scope: 'preset' | 'agents') => void,
410
+ /** 内容导入完成回调:批量 scope 只触发一次重建(更新运行时文本并重建预设)。 */
411
+ afterPresetImport?: (scopes: Array<'preset' | 'agents'>) => void,
386
412
  /** 参数覆盖写入回调(重建预设使参数生效)。 */
387
413
  afterOverridesChange?: () => void,
388
414
  /** 预设包导入完成回调(物化导入预设:组合/配置目录/共享引擎落盘,宿主 discovery 可见)。 */
389
- afterPresetPackageImport?: (id: string) => void): void;
415
+ afterPresetPackageImport?: (id: string) => void): {
416
+ invalidateDescriptor: () => void;
417
+ };
390
418
  //#endregion
391
419
  //#region src/runtime/character-tools.d.ts
392
420
  /** 工具执行所需的运行时宿主能力(index.ts 闭包提供)。 */
@@ -398,7 +426,8 @@ interface CharacterToolHost {
398
426
  /** 应用/移除后重建生成目录(写 preset.yml 后使参数生效)。 */
399
427
  rebuild: () => void;
400
428
  }
401
- declare function registerCharacterTools(ctx: Context, host: CharacterToolHost): void;
429
+ /** 注册角色卡库模型工具;返回 disposer(预设切换重挂用)。enabled=false 返回空操作。 */
430
+ declare function registerCharacterTools(ctx: Context, host: CharacterToolHost): () => void;
402
431
  //#endregion
403
432
  //#region src/runtime/world-book-tools.d.ts
404
433
  interface WorldBookToolHost {
@@ -409,7 +438,73 @@ interface WorldBookToolHost {
409
438
  /** 写盘后重建生成目录。 */
410
439
  rebuild: () => void;
411
440
  }
412
- declare function registerWorldBookTools(ctx: Context, host: WorldBookToolHost): void;
441
+ /** 注册世界书条目级模型工具;返回 disposer(预设切换重挂用)。enabled=false 返回空操作。 */
442
+ declare function registerWorldBookTools(ctx: Context, host: WorldBookToolHost): () => void;
443
+ //#endregion
444
+ //#region src/host/characters.d.ts
445
+ /** 角色卡记忆变更后同步已导入预设的 chara-<id>-memory 注入条目
446
+ * (world_book note 写入卡记忆后调用;未导入当前预设的卡返回 synced=false)。 */
447
+ declare function syncImportedCharacterMemory(presetRoot: string, templateName: string, cardId: string): {
448
+ ok: true;
449
+ synced: boolean;
450
+ } | {
451
+ ok: false;
452
+ message: string;
453
+ };
454
+ /** 追加角色卡本地记忆(.characters/<id>/memory.md,跟随角色卡跨预设)。 */
455
+ declare function appendCharacterMemory(presetRoot: string, cardId: string, note: string): void;
456
+ /** 追加记忆文件(时间戳列表格式;header 标注文件类型)。世界书工具与角色卡共用。 */
457
+ declare function appendMemoryFile(file: string, note: string, header?: string): void;
458
+ /** 读角色卡本地记忆文本(无记忆返回空串)。 */
459
+ declare function readCharacterMemory(presetRoot: string, cardId: string): string;
460
+ /** 角色卡入库:PNG 原图(可选)+ 角色卡 JSON → 转换参数存 converted.yml。 */
461
+ declare function importCharacterCard(presetRoot: string, files: Array<{
462
+ path: string;
463
+ content: string;
464
+ }>): {
465
+ ok: true;
466
+ id: string;
467
+ name: string;
468
+ } | {
469
+ ok: false;
470
+ message: string;
471
+ };
472
+ interface CharacterCardListItem {
473
+ id: string;
474
+ name: string;
475
+ description?: string;
476
+ hasAvatar: boolean;
477
+ /** 是否已导入当前预设(激活预设 meta.importedCharacters 含该 id)。 */
478
+ imported: boolean;
479
+ }
480
+ /** 角色卡库清单 + 各卡在当前预设的导入状态。 */
481
+ declare function listCharacterCards(presetRoot: string, activeTemplate: string | undefined): CharacterCardListItem[];
482
+ /** 删除角色卡库条目。 */
483
+ declare function deleteCharacterCard(presetRoot: string, id: string): {
484
+ ok: true;
485
+ } | {
486
+ ok: false;
487
+ message: string;
488
+ };
489
+ /** 角色卡参数导入当前预设:promptConfigs 合并(chara-<id>- 前缀防冲突)、
490
+ * params 合并(角色卡覆盖同键)、meta.importedCharacters 记录来源。 */
491
+ declare function applyCharacterToPreset(presetRoot: string, templateName: string, cardId: string): {
492
+ ok: true;
493
+ count: number;
494
+ personaOpened?: boolean;
495
+ } | {
496
+ ok: false;
497
+ message: string;
498
+ };
499
+ /** 从当前预设移除角色卡参数:删前缀 promptConfigs、删该卡声明的 params 键、
500
+ * meta.importedCharacters 除名。 */
501
+ declare function removeCharacterFromPreset(presetRoot: string, templateName: string, cardId: string): {
502
+ ok: true;
503
+ count: number;
504
+ } | {
505
+ ok: false;
506
+ message: string;
507
+ };
413
508
  //#endregion
414
509
  //#region src/host/templates.d.ts
415
510
  interface PromptConfigTemplate {
@@ -420,14 +515,23 @@ interface PromptConfigTemplate {
420
515
  /** 解析后的单条提示词配置。 */
421
516
  spec: PromptConfigSpec;
422
517
  }
518
+ /** 自定义工具模板(templates/tools/*.yml;tool-config-engine 定义形态)。 */
519
+ interface ToolTemplate {
520
+ file: string;
521
+ content: string;
522
+ /** 解析后的工具定义(含 id/name/execute.kind)。 */
523
+ spec: Record<string, unknown>;
524
+ }
423
525
  /** 扫描包内 templates/*.yml,按文件名排序返回(文件损坏时抛出,由调用方决定呈现)。 */
424
526
  declare function loadPromptTemplates(): PromptConfigTemplate[];
527
+ /** 工具模板库扫描(templates/tools/*.yml;损坏 fail loud——包内模板属于发布 bug)。 */
528
+ declare function loadToolTemplates(): ToolTemplate[];
425
529
  //#endregion
426
530
  //#region src/runtime/tui.d.ts
531
+ /** 参数保存回调:写激活预设 preset.yml;失败必须抛给命令层渲染为错误。 */
532
+ type SavePresetParam = (key: string, value: unknown) => void | Promise<void>;
427
533
  /** 通过 DSH 命令注册表暴露 /prompt-tool,Web 与 dsh-tui 都能执行。 */
428
- declare function registerTuiCommand(ctx: Context, ns: SettingsNamespace, getSource: () => PromptSettings, getModelsState: () => ModelDetection, getModelCatalog: () => Promise<Record<string, string[]>>, getPresetConfigsDir?: () => string,
429
- /** 参数保存回调(写激活预设 preset.yml;key='promptConfigs' 时 value 为数组)。 */
430
- savePresetParam?: (key: string, value: unknown) => void): void;
534
+ declare function registerTuiCommand(ctx: Context, ns: SettingsNamespace, getSource: () => PromptSettings, getModelsState: () => ModelDetection, getModelCatalog: () => Promise<Record<string, string[]>>, getPresetConfigsDir?: () => string, savePresetParam?: SavePresetParam): void;
431
535
  //#endregion
432
536
  //#region src/runtime/settings-registration.d.ts
433
537
  interface SettingsRegistrationHooks<T> {
@@ -508,14 +612,15 @@ declare function fixSkillEntry(skillsDir: string, folder: string): SkillFixResul
508
612
  //#region src/shared/bridge-contract.d.ts
509
613
  /**
510
614
  * settings bridge 跨端契约(host 注册 / client 消费的唯一来源)。
511
- * 铁律:11 端点载荷统一成功 `{ ok: true, value }`、失败 `{ ok: false, code?, message? }`;
615
+ * 铁律:25 端点载荷统一成功 `{ ok: true, value }`、失败 `{ ok: false, code?, message? }`;
512
616
  * 端点附加字段只能以 value 旁的可选扩展字段出现(describe)。
513
617
  * 改路径或载荷形状必须同步更新 test/shared/bridge-contract.test.mjs。
514
618
  */
515
619
  declare const SETTINGS_BRIDGE_PREFIX = "/api/prompt-tool/settings";
516
- /** 22 个桥端点路径(相对前缀)。新增端点必须同时登记到契约测试。 */
620
+ /** 桥端点路径(相对前缀)。新增端点必须同时登记到契约测试。 */
517
621
  declare const BRIDGE_ENDPOINTS: {
518
622
  readonly meta: "/meta";
623
+ readonly bootstrap: "/bootstrap";
519
624
  readonly describe: "/describe";
520
625
  readonly models: "/models";
521
626
  readonly mutate: "/mutate";
@@ -527,6 +632,7 @@ declare const BRIDGE_ENDPOINTS: {
527
632
  readonly importPreset: "/import-preset";
528
633
  readonly paramOverrides: "/param-overrides";
529
634
  readonly presetVariables: "/preset-variables";
635
+ readonly customTools: "/custom-tools";
530
636
  readonly importPresetPackage: "/import-preset-package";
531
637
  readonly exportPreset: "/export-preset";
532
638
  readonly presetDelete: "/preset-delete";
@@ -568,4 +674,4 @@ declare const name = "prompt-tool";
568
674
  declare const inject: string[];
569
675
  declare function apply(ctx: Context, configIn: Config): void;
570
676
  //#endregion
571
- export { BRIDGE_ENDPOINTS, type BridgeEndpoint, type BridgeErrorPayload, type CachedSkillsReader, Config, PARAM_KEYS, type PresetSpec, type PromptConfigTemplate, type PromptConfigValidationError, type PromptConfigValidationResult, PromptSettingsSchema, SETTINGS_BRIDGE_PREFIX, SKILL_NAME_RE, type SettingsRegistrationHooks, type SkillCatalogEntry, type SkillEntry, type SkillFixResult, type SkillFrontmatter, type WritePresetOptions, apply, applyModuleConfigs, cloneBuiltinPreset, createCachedSkillsReader, detectModels, ensurePresetSeed, ensureSettingsRegistered, ensureWebSurface, fixSkillEntry, inject, installDefaultModelRoute, isValidSkill, listAdvertisedModels, listBuiltinTemplates, listPresets, listSkillFolders, loadPresetSpec, loadPromptTemplates, mergeSkillDirs, migrateLegacyLayout, name, normalizePresetRootDir, parseFrontmatter, readPluginState, readSkills, registerCharacterTools, registerSettingsBridge, registerTuiCommand, registerWorldBookTools, removeUserPreset, resolvePresetDir, resolvePresetParams, resolveProfileDir, resolveProfileSkillsDir, savePresetParams, stPresetId, toKebabName, userPresetsDir, validSkills, validatePromptConfigs, writePluginState, writePreset };
677
+ export { BRIDGE_ENDPOINTS, type BridgeEndpoint, type BridgeErrorPayload, type CachedSkillsReader, Config, ENGINE_PARAM_KEYS, MODEL_SEGMENT_MAP, PARAM_KEYS, type PresetSpec, type PromptConfigTemplate, type PromptConfigValidationError, type PromptConfigValidationResult, PromptSettingsSchema, SETTINGS_BRIDGE_PREFIX, SKILL_NAME_RE, type SettingsRegistrationHooks, type SkillCatalogEntry, type SkillEntry, type SkillFixResult, type SkillFrontmatter, type ToolTemplate, WRITER_PARAM_KEYS, type WritePresetOptions, appendCharacterMemory, appendMemoryFile, apply, applyCharacterToPreset, applyModuleConfigs, buildModuleConfigsFromParams, buildWorldBookEntry, cloneBuiltinPreset, convertStToPreset, createCachedSkillsReader, deleteCharacterCard, deleteWorldBookEntry, detectModels, ensurePresetSeed, ensureSettingsRegistered, ensureWebSurface, fixSkillEntry, importCharacterCard, inject, installDefaultModelRoute, isValidSkill, listAdvertisedModels, listBuiltinTemplates, listCharacterCards, listPresets, listSkillFolders, listWorldBookEntries, loadPresetSpec, loadPromptTemplates, loadToolTemplates, mergeSkillDirs, mergeStPresets, migrateLegacyLayout, name, normalizePresetRootDir, parseFrontmatter, processStText, readCharacterMemory, readPluginState, readSkills, registerCharacterTools, registerSettingsBridge, registerTuiCommand, registerWorldBookTools, removeCharacterFromPreset, removeUserPreset, renderComposition, resolvePresetDir, resolvePresetParams, resolveProfileDir, resolveProfileSkillsDir, savePresetParams, stPresetId, syncImportedCharacterMemory, toKebabName, upsertWorldBookEntry, userPresetsDir, validSkills, validatePromptConfigs, writePluginState, writePreset };