dsh-plugin-prompt-tool 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +186 -101
  54. package/lib/index.mjs +1012 -413
  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,8 @@
1
- import { n as PromptConfigFile, r as PromptConfigSpec } from "./prompt-configs-B4vH09wx.mjs";
2
- import { SettingsNamespace } from "@deepseek-ai/dsh-settings";
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
+ import { parseDocument } from "yaml";
3
3
  import z from "@deepseek-ai/schemastery";
4
4
  import { Context } from "@deepseek-ai/cordis";
5
5
  //#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
6
  declare const PARAM_KEYS: ReadonlySet<string>;
17
7
  //#endregion
18
8
  //#region src/config.d.ts
@@ -114,47 +104,14 @@ interface PromptSettings {
114
104
  declare const PromptSettingsSchema: z<PromptSettings>;
115
105
  //#endregion
116
106
  //#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;
107
+ /**
108
+ * 把任意单一参数预设模板物化到生成目录(writePreset)的写入态选项。
109
+ * 引擎参数契约来自 shared/engine-params.ts(PresetWriterParams:runtimeOf 透传子集),
110
+ * 此处只保留 writePreset 专属字段——加引擎参数只需改一处契约,漏透传变成编译错误。
111
+ */
112
+ interface WritePresetOptions extends PresetWriterParams {
154
113
  /** 是否注入 agents.md 内容到 instruction-hint(false 时 instruction-hint 走引擎默认提示/动态探测)。 */
155
114
  injectAgentsPrompt?: boolean;
156
- bootstrapMaxTokens: number;
157
- usePtcMode: boolean;
158
115
  /** 写入 agents-instruction.txt 供 instruction-hint 配置读取;不传则使用本地默认 hint。 */
159
116
  agentsInstructionText?: string;
160
117
  presetDir: string;
@@ -163,6 +120,10 @@ interface WritePresetOptions {
163
120
  promptConfigs: PromptConfigSpec[];
164
121
  /** 预设模板名(preset/<name>);默认 anchored(兼容期)。 */
165
122
  presetTemplate?: string;
123
+ /** 输出目录/预设 id 覆盖(旧容器 id 兼容别名,如 prompt-tool);缺省 = presetTemplate 同名输出。 */
124
+ outputId?: string;
125
+ /** 兼容别名标记:输出目录是源预设的镜像(preset.yml name 加后缀,UI 可识别展示)。 */
126
+ aliasOf?: boolean;
166
127
  /** 目录加载失败等非致命告警回调。 */
167
128
  warn?: (message: string) => void;
168
129
  }
@@ -170,16 +131,6 @@ interface WritePresetOptions {
170
131
  declare function writePreset(prompt: string, options: WritePresetOptions): void;
171
132
  //#endregion
172
133
  //#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
134
  interface PresetSpec {
184
135
  id: string;
185
136
  name: string;
@@ -204,13 +155,13 @@ interface PresetSpec {
204
155
  subagentModel?: Record<string, unknown>;
205
156
  /** 预设级模板变量({{key}} 插值源;与引擎行为参数 params 分离,顶层 variables 段)。 */
206
157
  variables?: Record<string, string>;
158
+ /** 自定义工具定义(tool-config-engine 渲染进 custom-tools/ 后运行时注册)。 */
159
+ customTools?: unknown[];
207
160
  /** 模板变量插值开关(缺省 true = 启用;false = 停用,writePreset 不生成变量文件)。 */
208
161
  variablesEnabled?: boolean;
209
- /** 宿主层默认值(唯一入口):apply 时合并进 Config,settings 仍可覆盖。 */
210
- hostDefaults?: Record<string, unknown>;
211
162
  /** 可选:模板自定义提示词配置覆盖(纯数据,不使用模板语法)。 */
212
163
  promptConfigs?: unknown[];
213
- /** 可选:引擎组合模块行参数覆盖(行级 map config 浅合并,preset 优先)。 */
164
+ /** 可选:引擎组合模块行参数直写(行级 map config 浅合并;参数桥未覆盖的键生效,参数桥优先)。 */
214
165
  moduleConfigs?: Record<string, Record<string, unknown>>;
215
166
  /** 世界书(独立存储段,不进 promptConfigs):injectMode + 条目。 */
216
167
  worldBook?: {
@@ -222,6 +173,12 @@ interface PresetSpec {
222
173
  }
223
174
  /** 加载某个预设模板的单一参数文件 preset/<name>/preset.yml。 */
224
175
  declare function loadPresetSpec(dir: string): PresetSpec;
176
+ /**
177
+ * 顶层模型段 ↔ 扁平参数键双向映射(单一来源)。
178
+ * loadPresetSpec 展平(段 → 扁平键)与 savePresetParams 迁移(扁平键 → 段)
179
+ * 共用本常量,杜绝两处字面量漂移。段结构 = 官方 agent-default-model 同构。
180
+ */
181
+ declare const MODEL_SEGMENT_MAP: Record<string, [string, string]>;
225
182
  /** 预设根:官方 USER_PRESET_DIR(~/.dsh/.agent-presets),导入/新建/种子化的预设都放这里。 */
226
183
  declare function userPresetsDir(): string;
227
184
  /**
@@ -246,6 +203,8 @@ declare function listBuiltinTemplates(): Array<{
246
203
  interface PromptToolState {
247
204
  seeded?: boolean;
248
205
  paramsMigrated?: boolean;
206
+ /** 旧容器 id 兼容快照已处理;删除后不再自动复活。 */
207
+ legacyAliasHandled?: boolean;
249
208
  }
250
209
  /** 读插件状态;文件缺失/损坏返回空对象(按未标记处理,触发首次动作)。 */
251
210
  declare function readPluginState(): PromptToolState;
@@ -268,8 +227,8 @@ declare function cloneBuiltinPreset(id: string, autoSuffix?: boolean): {
268
227
  };
269
228
  /**
270
229
  * 保存预设参数:写激活预设目录 preset.yml 的 params(merge)/ promptConfigs(整体替换)。
271
- * parseDocument 保留注释与未知键(preset.yml 模板含大量注释);空值键跳过
272
- * (保留 preset.yml 模板默认)。写入后删除 prompt-tool.overrides.yml(旧参数覆盖
230
+ * parseDocument 保留注释与未知键(preset.yml 模板含大量注释);空值键删除('' / [],
231
+ * 回落模板/引擎默认;0 与 false 照常写入--语义与函数内注释、docs §3 一致)。写入后删除 prompt-tool.overrides.yml(旧参数覆盖
273
232
  * 通道残留——参数已并入 preset.yml,避免旧值覆盖新值)。
274
233
  */
275
234
  declare function savePresetParams(presetRoot: string, templateName: string, params: Record<string, unknown> | undefined, promptConfigs: unknown[] | undefined, variables?: Record<string, string>, variablesEnabled?: boolean): void;
@@ -284,25 +243,91 @@ declare function removeUserPreset(id: string, presetRoot?: string): {
284
243
  };
285
244
  /** 预设 params(默认参数)与运行时 settings 合并;settings 值优先。 */
286
245
  declare function resolvePresetParams(spec: PresetSpec, runtime: Record<string, unknown>): Record<string, unknown>;
246
+ /**
247
+ * 参数桥:params 扁平键 → 引擎模块行 config 对象(取代旧 __TOKEN__ 文本渲染)。
248
+ *
249
+ * 原则:
250
+ * - 未声明的键不合并(composition 行默认 / 引擎默认生效),与旧"空值删行"语义等价;
251
+ * - 值类型直达(布尔/数字/数组不再字符串化再解析);
252
+ * - 合并优先级:参数桥(UI/基础层)> moduleConfigs(模板/ST 行级直写)> 行默认。
253
+ * 模型路由/委派参数统一扁平键(modelProvider/subagentModelProvider/toolFilterAllow/maxDepth 等),
254
+ * 与官方 AgentOptions{provider,model} / toolFilter{allow,deny} / maxDepth 对齐。
255
+ */
256
+ declare function buildModuleConfigsFromParams(params: Record<string, unknown>): Record<string, Record<string, unknown>>;
287
257
  /**
288
258
  * 加载预设声明的组合:
289
259
  * 1. `modules:` 清单 → 引擎模块库按序装配(最终形态);
290
260
  * 2. 兼容 `composition:` 内联文本或组合清单名。
291
261
  */
292
262
  /**
293
- * 行级 config 合并(moduleConfigs):仅支持 map 型 config 浅合并;
294
- * 数组型 config(如 compaction)与未声明模块原样保留。
295
- * 未声明 moduleConfigs 时返回原文(零开销);parseDocument 往返保留注释与 __TOKEN__。
263
+ * 行级 config 合并:仅支持 map 型 config 浅合并;
264
+ * 数组型 config(如 delegation 组)按子行 id 嵌套合并;未声明模块原样保留。
265
+ * 未声明 configs 时返回原文(零开销);parseDocument 往返保留注释。
266
+ * 本函数是参数桥产物落位组合行的唯一机制(含 delegation 组子行嵌套),不是预设覆盖通道。
296
267
  */
297
268
  declare function applyModuleConfigs(raw: string, configs: Record<string, Record<string, unknown>> | undefined): string;
269
+ /**
270
+ * 预设组合渲染完整链路:模块装配 → 参数桥(moduleConfigs + params)行级合并。
271
+ * 合并优先级:参数桥(params/UI 基础层) > moduleConfigs(模板/ST 行级直写) > 行默认。
272
+ * moduleConfigs 仅补充参数桥未覆盖的行级 config(如 ST 导入的 tool-web.fetch),
273
+ * 不再锁定覆盖 UI 可管理参数(旧作者锁定语义已移除)。
274
+ */
275
+ declare function renderComposition(spec: PresetSpec, runtime: Record<string, unknown>, templateDir?: string): string;
298
276
  //#endregion
299
277
  //#region src/host/sillytavern.d.ts
278
+ /**
279
+ * 处理 SillyTavern 文本,ST 变量语义 → 本项目 params fallback 插值:
280
+ * {{setvar::k::v}} → 收集 k=v 进 params(会话变量初始值 = fallback 基准),指令剥离;
281
+ * {{getvar::k}} → 改写为 {{k}}(引擎按 params 插值,无值保留原样);
282
+ * {{getvar::k::default}} → 改写为 {{k}} 且 variables 缺 k 时写入 default(fallback 落顶层 variables);
283
+ * {{trim}}/{{//注释}}/{{ERA:...}} → 剥离(格式化/注释/第三方运行时);
284
+ * {{user}}/{{char}} → 替换占位符。
285
+ */
286
+ declare function processStText(text: string, cardName: string, variables: Record<string, string>): string;
287
+ /** 合并多个转换结果为一个预设(角色卡 × 响应预设 → 单预设)。 */
288
+ declare function mergeStPresets(specs: PresetSpec[]): PresetSpec;
289
+ /** SillyTavern JSON 预设卡片 → 本项目 PresetSpec(导入端点直接消费)。 */
290
+ declare function convertStToPreset(card: unknown, baseName: string): PresetSpec;
300
291
  /** ST 导入预设 id:必须是官方 agent-presets 可发现的目录名(PRESET_ID =
301
292
  * /^[a-z0-9][a-z0-9-]*$/——含中文的目录会被宿主 discovery 静默跳过,会话
302
293
  * resume 报 preset not found)。文件名 slug 化(去中文);纯中文名退化为
303
294
  * st-<文件名短哈希>(唯一且合法);显示名 name 仍保留中文原名。 */
304
295
  declare function stPresetId(baseName: string): string;
305
296
  //#endregion
297
+ //#region src/host/worldbook.d.ts
298
+ type WorldBookEntry = Record<string, unknown>;
299
+ /** buildWorldBookEntry 输入(两通道共用:ST 导入转换与模型 world_book_upsert 工具)。 */
300
+ interface WorldBookEntryInput {
301
+ /** 条目 id;缺省不写(调用方自行加前缀时用,如角色卡 chara-<卡>- 前缀)。 */
302
+ id?: string;
303
+ name: string;
304
+ text: string;
305
+ /** 注入顺序(层内升序);缺省 100。 */
306
+ order?: number;
307
+ /** 启用状态;缺省不写(引擎默认启用)。 */
308
+ enabled?: boolean;
309
+ /** 常驻注入(不依赖关键字)。 */
310
+ constant: boolean;
311
+ keys?: string[];
312
+ secondaryKeys?: string[];
313
+ caseSensitive?: boolean;
314
+ wholeWords?: boolean;
315
+ /** ST selectiveLogic(0/1/2/3 → anchor-match any/all/not/notAny)。 */
316
+ selectiveLogic?: number;
317
+ }
318
+ /**
319
+ * 世界书条目结构工厂(能力归一)。
320
+ * strategy/layer/position 固定值与 params 键集单一权威——ST 导入(sillytavern.ts)
321
+ * 与模型工具(world_book_upsert)共用,不再各自手写条目结构。
322
+ */
323
+ declare function buildWorldBookEntry(input: WorldBookEntryInput): WorldBookEntry;
324
+ /** 当前预设全部世界书条目(保持文件顺序)。 */
325
+ declare function listWorldBookEntries(presetDir: string): WorldBookEntry[];
326
+ /** 新增或更新一条世界书条目(按 id 定位;不存在则追加)。返回写入后条目总数。 */
327
+ declare function upsertWorldBookEntry(presetDir: string, entry: WorldBookEntry): number;
328
+ /** 删除一条世界书条目;不存在抛错。返回删除后条目总数。 */
329
+ declare function deleteWorldBookEntry(presetDir: string, id: string): number;
330
+ //#endregion
306
331
  //#region src/web-surface.d.ts
307
332
  /** 从 loader 根 Include 的 baseUrl 推导 profile 目录。 */
308
333
  declare function resolveProfileDir(ctx: Context): string | undefined;
@@ -378,15 +403,17 @@ interface SkillsBridgeState {
378
403
  skillCatalog: SkillCatalogEntry[];
379
404
  }
380
405
  /** 自建 loopback settings bridge:替代 registerConfigurableProviders,避免模型设置区出现插件条目。 */
381
- declare function registerSettingsBridge(ctx: Context, ns: SettingsNamespace, getModelsState: () => ModelDetection, getSkillsState: () => SkillsBridgeState, getEngineStrategyDir: () => string, ensureRegistered: (sctx: Context) => boolean, afterSkillFix?: () => void,
406
+ declare function registerSettingsBridge(ctx: Context, ns: string, getModelsState: () => ModelDetection, getSkillsState: () => SkillsBridgeState, getEngineStrategyDir: () => string, afterSkillFix?: () => void,
382
407
  /** 生成目录(presetDir):读取实际生效的提示词配置(引擎加载源)。 */
383
408
  getPresetConfigsDir?: () => string,
384
- /** 内容导入完成回调(更新运行时文本并重建预设)。 */
385
- afterPresetImport?: (scope: 'preset' | 'agents') => void,
409
+ /** 内容导入完成回调:批量 scope 只触发一次重建(更新运行时文本并重建预设)。 */
410
+ afterPresetImport?: (scopes: Array<'preset' | 'agents'>) => void,
386
411
  /** 参数覆盖写入回调(重建预设使参数生效)。 */
387
412
  afterOverridesChange?: () => void,
388
413
  /** 预设包导入完成回调(物化导入预设:组合/配置目录/共享引擎落盘,宿主 discovery 可见)。 */
389
- afterPresetPackageImport?: (id: string) => void): void;
414
+ afterPresetPackageImport?: (id: string) => void): {
415
+ invalidateDescriptor: () => void;
416
+ };
390
417
  //#endregion
391
418
  //#region src/runtime/character-tools.d.ts
392
419
  /** 工具执行所需的运行时宿主能力(index.ts 闭包提供)。 */
@@ -398,7 +425,8 @@ interface CharacterToolHost {
398
425
  /** 应用/移除后重建生成目录(写 preset.yml 后使参数生效)。 */
399
426
  rebuild: () => void;
400
427
  }
401
- declare function registerCharacterTools(ctx: Context, host: CharacterToolHost): void;
428
+ /** 注册角色卡库模型工具;返回 disposer(预设切换重挂用)。enabled=false 返回空操作。 */
429
+ declare function registerCharacterTools(ctx: Context, host: CharacterToolHost): () => void;
402
430
  //#endregion
403
431
  //#region src/runtime/world-book-tools.d.ts
404
432
  interface WorldBookToolHost {
@@ -409,7 +437,73 @@ interface WorldBookToolHost {
409
437
  /** 写盘后重建生成目录。 */
410
438
  rebuild: () => void;
411
439
  }
412
- declare function registerWorldBookTools(ctx: Context, host: WorldBookToolHost): void;
440
+ /** 注册世界书条目级模型工具;返回 disposer(预设切换重挂用)。enabled=false 返回空操作。 */
441
+ declare function registerWorldBookTools(ctx: Context, host: WorldBookToolHost): () => void;
442
+ //#endregion
443
+ //#region src/host/characters.d.ts
444
+ /** 角色卡记忆变更后同步已导入预设的 chara-<id>-memory 注入条目
445
+ * (world_book note 写入卡记忆后调用;未导入当前预设的卡返回 synced=false)。 */
446
+ declare function syncImportedCharacterMemory(presetRoot: string, templateName: string, cardId: string): {
447
+ ok: true;
448
+ synced: boolean;
449
+ } | {
450
+ ok: false;
451
+ message: string;
452
+ };
453
+ /** 追加角色卡本地记忆(.characters/<id>/memory.md,跟随角色卡跨预设)。 */
454
+ declare function appendCharacterMemory(presetRoot: string, cardId: string, note: string): void;
455
+ /** 追加记忆文件(时间戳列表格式;header 标注文件类型)。世界书工具与角色卡共用。 */
456
+ declare function appendMemoryFile(file: string, note: string, header?: string): void;
457
+ /** 读角色卡本地记忆文本(无记忆返回空串)。 */
458
+ declare function readCharacterMemory(presetRoot: string, cardId: string): string;
459
+ /** 角色卡入库:PNG 原图(可选)+ 角色卡 JSON → 转换参数存 converted.yml。 */
460
+ declare function importCharacterCard(presetRoot: string, files: Array<{
461
+ path: string;
462
+ content: string;
463
+ }>): {
464
+ ok: true;
465
+ id: string;
466
+ name: string;
467
+ } | {
468
+ ok: false;
469
+ message: string;
470
+ };
471
+ interface CharacterCardListItem {
472
+ id: string;
473
+ name: string;
474
+ description?: string;
475
+ hasAvatar: boolean;
476
+ /** 是否已导入当前预设(激活预设 meta.importedCharacters 含该 id)。 */
477
+ imported: boolean;
478
+ }
479
+ /** 角色卡库清单 + 各卡在当前预设的导入状态。 */
480
+ declare function listCharacterCards(presetRoot: string, activeTemplate: string | undefined): CharacterCardListItem[];
481
+ /** 删除角色卡库条目。 */
482
+ declare function deleteCharacterCard(presetRoot: string, id: string): {
483
+ ok: true;
484
+ } | {
485
+ ok: false;
486
+ message: string;
487
+ };
488
+ /** 角色卡参数导入当前预设:promptConfigs 合并(chara-<id>- 前缀防冲突)、
489
+ * params 合并(角色卡覆盖同键)、meta.importedCharacters 记录来源。 */
490
+ declare function applyCharacterToPreset(presetRoot: string, templateName: string, cardId: string): {
491
+ ok: true;
492
+ count: number;
493
+ personaOpened?: boolean;
494
+ } | {
495
+ ok: false;
496
+ message: string;
497
+ };
498
+ /** 从当前预设移除角色卡参数:删前缀 promptConfigs、删该卡声明的 params 键、
499
+ * meta.importedCharacters 除名。 */
500
+ declare function removeCharacterFromPreset(presetRoot: string, templateName: string, cardId: string): {
501
+ ok: true;
502
+ count: number;
503
+ } | {
504
+ ok: false;
505
+ message: string;
506
+ };
413
507
  //#endregion
414
508
  //#region src/host/templates.d.ts
415
509
  interface PromptConfigTemplate {
@@ -420,34 +514,23 @@ interface PromptConfigTemplate {
420
514
  /** 解析后的单条提示词配置。 */
421
515
  spec: PromptConfigSpec;
422
516
  }
517
+ /** 自定义工具模板(templates/tools/*.yml;tool-config-engine 定义形态)。 */
518
+ interface ToolTemplate {
519
+ file: string;
520
+ content: string;
521
+ /** 解析后的工具定义(含 id/name/execute.kind)。 */
522
+ spec: Record<string, unknown>;
523
+ }
423
524
  /** 扫描包内 templates/*.yml,按文件名排序返回(文件损坏时抛出,由调用方决定呈现)。 */
424
525
  declare function loadPromptTemplates(): PromptConfigTemplate[];
526
+ /** 工具模板库扫描(templates/tools/*.yml;损坏 fail loud——包内模板属于发布 bug)。 */
527
+ declare function loadToolTemplates(): ToolTemplate[];
425
528
  //#endregion
426
529
  //#region src/runtime/tui.d.ts
530
+ /** 参数保存回调:写激活预设 preset.yml;失败必须抛给命令层渲染为错误。 */
531
+ type SavePresetParam = (key: string, value: unknown) => void | Promise<void>;
427
532
  /** 通过 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;
431
- //#endregion
432
- //#region src/runtime/settings-registration.d.ts
433
- interface SettingsRegistrationHooks<T> {
434
- /** 注册时的 composition base(每次尝试注册都取最新值)。 */
435
- base: () => T;
436
- /** 注册成功后接线:setSource / watch / 初始 onChange。 */
437
- onRegistered: (scope: {
438
- get: () => T;
439
- watch: (callback: (next: T, prev: T) => void) => void;
440
- }) => void;
441
- /** 注册失败(schema 校验或重复注册竞态)时的日志出口。 */
442
- onError: (message: string) => void;
443
- }
444
- /**
445
- * 确保 `ns` 已注册:已注册(describe 命中)直接返回 true;未注册时补注册。
446
- * 官方 installSettingsSection 的 inject 回调只在 settings 服务首次可用时跑一次,
447
- * settings 服务实例被替换(provider fiber reload)后注册丢失且不自动重建;
448
- * 本函数由 Web bridge 每次请求前调用兜底。
449
- */
450
- declare function ensureSettingsRegistered<T>(sctx: Context, ns: SettingsNamespace, schema: unknown, hooks: SettingsRegistrationHooks<T>): boolean;
533
+ declare function registerTuiCommand(ctx: Context, ns: 'prompt-tool', getSource: () => PromptSettings, getModelsState: () => ModelDetection, getModelCatalog: () => Promise<Record<string, string[]>>, getPresetConfigsDir?: () => string, savePresetParam?: SavePresetParam): void;
451
534
  //#endregion
452
535
  //#region src/runtime/skills-provider.d.ts
453
536
  /** 官方 dsh-skill 的 SkillName 契约:kebab-case。 */
@@ -508,14 +591,15 @@ declare function fixSkillEntry(skillsDir: string, folder: string): SkillFixResul
508
591
  //#region src/shared/bridge-contract.d.ts
509
592
  /**
510
593
  * settings bridge 跨端契约(host 注册 / client 消费的唯一来源)。
511
- * 铁律:11 端点载荷统一成功 `{ ok: true, value }`、失败 `{ ok: false, code?, message? }`;
594
+ * 铁律:25 端点载荷统一成功 `{ ok: true, value }`、失败 `{ ok: false, code?, message? }`;
512
595
  * 端点附加字段只能以 value 旁的可选扩展字段出现(describe)。
513
596
  * 改路径或载荷形状必须同步更新 test/shared/bridge-contract.test.mjs。
514
597
  */
515
598
  declare const SETTINGS_BRIDGE_PREFIX = "/api/prompt-tool/settings";
516
- /** 22 个桥端点路径(相对前缀)。新增端点必须同时登记到契约测试。 */
599
+ /** 桥端点路径(相对前缀)。新增端点必须同时登记到契约测试。 */
517
600
  declare const BRIDGE_ENDPOINTS: {
518
601
  readonly meta: "/meta";
602
+ readonly bootstrap: "/bootstrap";
519
603
  readonly describe: "/describe";
520
604
  readonly models: "/models";
521
605
  readonly mutate: "/mutate";
@@ -527,6 +611,7 @@ declare const BRIDGE_ENDPOINTS: {
527
611
  readonly importPreset: "/import-preset";
528
612
  readonly paramOverrides: "/param-overrides";
529
613
  readonly presetVariables: "/preset-variables";
614
+ readonly customTools: "/custom-tools";
530
615
  readonly importPresetPackage: "/import-preset-package";
531
616
  readonly exportPreset: "/export-preset";
532
617
  readonly presetDelete: "/preset-delete";
@@ -568,4 +653,4 @@ declare const name = "prompt-tool";
568
653
  declare const inject: string[];
569
654
  declare function apply(ctx: Context, configIn: Config): void;
570
655
  //#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 };
656
+ 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 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, 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 };