fast-tavern 0.1.1 → 0.1.2

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 CHANGED
@@ -19,6 +19,11 @@ fast-tavern 是一个**与框架无关**(不依赖 Vue/Pinia/浏览器 API)
19
19
  - **正则规则管道**:`before_macro` → `macro` → `after_macro`,并支持按 `target` / `view` 过滤
20
20
  - **宏替换**:`{{char}}`、`{{user}}`、`<<user>>`、`<<char>>` 以及任意 `{{key}}` / `<<key>>`
21
21
  - **自动宏提取**:从 `character.character_name` 和 `persona.persona_name` 自动提取 char/user 宏
22
+ - **变量系统**:支持局部/全局变量,在宏阶段线性执行(同时支持 `{{}}` 和 `<<>>` 格式)
23
+ - `{{getvar::name}}` / `<<getvar::name>>` - 获取局部变量
24
+ - `{{setvar::name::value}}` / `<<setvar::name::value>>` - 设置局部变量
25
+ - `{{getglobalvar::name}}` / `<<getglobalvar::name>>` - 获取全局变量
26
+ - `{{setglobalvar::name::value}}` / `<<setglobalvar::name::value>>` - 设置全局变量
22
27
  - **多渠道聊天格式输入/输出**:Gemini / OpenAI / Simple / Tagged / Text
23
28
  - **输出多阶段结果**:raw、afterPreRegex、afterMacro、afterPostRegex(并提供逐条 perItem 明细)
24
29
 
@@ -29,6 +34,13 @@ fast-tavern 是一个**与框架无关**(不依赖 Vue/Pinia/浏览器 API)
29
34
  - `keep`:保留 system
30
35
  - `to_user`:将 system 降级为 user(保留内容,仅改变角色)
31
36
 
37
+ ### 变量系统
38
+
39
+ 变量在宏替换阶段按照提示词顺序线性执行:
40
+
41
+ - **局部变量**:每次 `buildPrompt` 调用独立,不跨调用持久化
42
+ - **全局变量**:由调用方维护,从返回结果 `result.variables.global` 获取变化后持久化
43
+
32
44
  ---
33
45
 
34
46
  ## 安装
@@ -89,6 +101,12 @@ const result = buildPrompt({
89
101
  // 宏变量(可选,会与 character/persona 自动提取的合并,显式传入的优先级更高)
90
102
  macros: { custom_var: 'value' },
91
103
 
104
+ // 局部变量初始值(可选)
105
+ variables: { counter: '0', name: 'Alice' },
106
+
107
+ // 全局变量初始值(可选,建议由调用方维护状态)
108
+ globalVariables: { totalTurns: '10' },
109
+
92
110
  // 输出格式:gemini/openai/simple/text/tagged
93
111
  outputFormat: 'openai',
94
112
 
@@ -105,6 +123,10 @@ console.log(result.stages.tagged.afterPostRegex);
105
123
  // 最终输出(按 outputFormat 转换)
106
124
  console.log(result.stages.output.afterPostRegex);
107
125
 
126
+ // 获取变量最终状态(用于持久化)
127
+ console.log(result.variables.local); // 局部变量
128
+ console.log(result.variables.global); // 全局变量
129
+
108
130
  // 更细粒度:逐条文本的阶段明细
109
131
  console.table(result.stages.perItem);
110
132
  ```
package/dist/index.cjs CHANGED
@@ -346,10 +346,107 @@ function mergeRegexRules(params) {
346
346
  }));
347
347
  }
348
348
 
349
+ // src/core/modules/variables/variableContext.ts
350
+ function createVariableContext(initialLocal, initialGlobal) {
351
+ return {
352
+ local: { ...initialLocal },
353
+ global: { ...initialGlobal }
354
+ };
355
+ }
356
+ function getVar(ctx, name) {
357
+ return ctx.local[name] ?? "";
358
+ }
359
+ function setVar(ctx, name, value) {
360
+ ctx.local[name] = value;
361
+ }
362
+ function getGlobalVar(ctx, name) {
363
+ return ctx.global[name] ?? "";
364
+ }
365
+ function setGlobalVar(ctx, name, value) {
366
+ ctx.global[name] = value;
367
+ }
368
+ function processVariableMacros(text, ctx) {
369
+ if (!text) return "";
370
+ let result = text;
371
+ result = result.replace(
372
+ /\{\{\s*setvar\s*::\s*([^:}]+)\s*::\s*([^}]*)\s*\}\}/gi,
373
+ (_match, name, value) => {
374
+ setVar(ctx, name.trim(), value.trim());
375
+ return "";
376
+ }
377
+ );
378
+ result = result.replace(
379
+ /\{\{\s*setglobalvar\s*::\s*([^:}]+)\s*::\s*([^}]*)\s*\}\}/gi,
380
+ (_match, name, value) => {
381
+ setGlobalVar(ctx, name.trim(), value.trim());
382
+ return "";
383
+ }
384
+ );
385
+ result = result.replace(
386
+ /\{\{\s*getvar\s*::\s*([^}]+)\s*\}\}/gi,
387
+ (_match, name) => {
388
+ return getVar(ctx, name.trim());
389
+ }
390
+ );
391
+ result = result.replace(
392
+ /\{\{\s*getglobalvar\s*::\s*([^}]+)\s*\}\}/gi,
393
+ (_match, name) => {
394
+ return getGlobalVar(ctx, name.trim());
395
+ }
396
+ );
397
+ result = result.replace(
398
+ /<<\s*setvar\s*::\s*([^:>]+)\s*::\s*([^>]*)\s*>>/gi,
399
+ (_match, name, value) => {
400
+ setVar(ctx, name.trim(), value.trim());
401
+ return "";
402
+ }
403
+ );
404
+ result = result.replace(
405
+ /<<\s*setglobalvar\s*::\s*([^:>]+)\s*::\s*([^>]*)\s*>>/gi,
406
+ (_match, name, value) => {
407
+ setGlobalVar(ctx, name.trim(), value.trim());
408
+ return "";
409
+ }
410
+ );
411
+ result = result.replace(
412
+ /<<\s*getvar\s*::\s*([^>]+)\s*>>/gi,
413
+ (_match, name) => {
414
+ return getVar(ctx, name.trim());
415
+ }
416
+ );
417
+ result = result.replace(
418
+ /<<\s*getglobalvar\s*::\s*([^>]+)\s*>>/gi,
419
+ (_match, name) => {
420
+ return getGlobalVar(ctx, name.trim());
421
+ }
422
+ );
423
+ return result;
424
+ }
425
+ function getVariableChanges(original, current) {
426
+ const localChanges = {};
427
+ const globalChanges = {};
428
+ for (const [key, value] of Object.entries(current.local)) {
429
+ if (original.local[key] !== value) {
430
+ localChanges[key] = value;
431
+ }
432
+ }
433
+ for (const [key, value] of Object.entries(current.global)) {
434
+ if (original.global[key] !== value) {
435
+ globalChanges[key] = value;
436
+ }
437
+ }
438
+ return { localChanges, globalChanges };
439
+ }
440
+
349
441
  // src/core/modules/macro/replaceMacros.ts
350
- function replaceMacros(text, macros) {
442
+ function replaceMacros(text, options) {
351
443
  if (!text) return "";
444
+ const opts = options && ("macros" in options || "variableContext" in options) ? options : { macros: options };
445
+ const macros = opts.macros || {};
352
446
  let out = text;
447
+ if (opts.variableContext) {
448
+ out = processVariableMacros(out, opts.variableContext);
449
+ }
353
450
  out = out.replace(/<<\s*([a-zA-Z0-9_]+)\s*>>/g, (_m, key) => {
354
451
  const lowerKey = key.toLowerCase();
355
452
  if (Object.prototype.hasOwnProperty.call(macros, key)) {
@@ -362,6 +459,9 @@ function replaceMacros(text, macros) {
362
459
  });
363
460
  out = out.replace(/\{\{\s*([a-zA-Z0-9_]+)\s*\}\}/g, (_m, key) => {
364
461
  const lowerKey = key.toLowerCase();
462
+ if (["getvar", "setvar", "getglobalvar", "setglobalvar"].includes(lowerKey)) {
463
+ return _m;
464
+ }
365
465
  if (Object.prototype.hasOwnProperty.call(macros, key)) {
366
466
  return String(macros[key]);
367
467
  }
@@ -473,7 +573,10 @@ function processContentStages(text, params) {
473
573
  view: params.view,
474
574
  placement: "before_macro"
475
575
  });
476
- const afterMacro = replaceMacros(afterPreRegex, params.macros);
576
+ const afterMacro = replaceMacros(afterPreRegex, {
577
+ macros: params.macros,
578
+ variableContext: params.variableContext
579
+ });
477
580
  const afterPostRegex = applyRegex(afterMacro, {
478
581
  rules: params.rules,
479
582
  target: params.target,
@@ -495,7 +598,8 @@ function compileTaggedStages(tagged, params) {
495
598
  target: item.target,
496
599
  view: params.view,
497
600
  rules: params.rules,
498
- macros: params.macros
601
+ macros: params.macros,
602
+ variableContext: params.variableContext
499
603
  });
500
604
  perItem.push({
501
605
  tag: item.tag,
@@ -550,8 +654,21 @@ function buildMacros(userMacros, character, persona) {
550
654
  return { ...result, ...userMacros };
551
655
  }
552
656
  function buildPrompt(params) {
553
- const { preset, character, persona, globals, history, historyFormat, macros, view, options } = params;
657
+ const {
658
+ preset,
659
+ character,
660
+ persona,
661
+ globals,
662
+ history,
663
+ historyFormat,
664
+ macros,
665
+ variables,
666
+ globalVariables,
667
+ view,
668
+ options
669
+ } = params;
554
670
  const finalMacros = buildMacros(macros || {}, character, persona);
671
+ const variableContext = createVariableContext(variables, globalVariables);
555
672
  const historyConv = (() => {
556
673
  if (isHistoryInput(history)) {
557
674
  if (history.format === "text") {
@@ -588,7 +705,12 @@ function buildPrompt(params) {
588
705
  presetRules: preset.regex_rules,
589
706
  characterRules: character?.regex_rules
590
707
  });
591
- const compiled = compileTaggedStages(tagged, { view, rules, macros: finalMacros });
708
+ const compiled = compileTaggedStages(tagged, {
709
+ view,
710
+ rules,
711
+ macros: finalMacros,
712
+ variableContext
713
+ });
592
714
  const taggedStages = compiled.stages;
593
715
  const perItem = compiled.perItem;
594
716
  const internalStages = {
@@ -624,6 +746,11 @@ function buildPrompt(params) {
624
746
  systemRolePolicy,
625
747
  activeWorldbookEntries: activeEntries,
626
748
  mergedRegexRules: rules,
749
+ // 返回变量最终状态,便于调用方持久化
750
+ variables: {
751
+ local: { ...variableContext.local },
752
+ global: { ...variableContext.global }
753
+ },
627
754
  stages: {
628
755
  tagged: taggedStages,
629
756
  internal: internalStages,
@@ -662,8 +789,12 @@ exports.buildPrompt = buildPrompt;
662
789
  exports.compileTaggedStages = compileTaggedStages;
663
790
  exports.convertMessagesIn = convertMessagesIn;
664
791
  exports.convertMessagesOut = convertMessagesOut;
792
+ exports.createVariableContext = createVariableContext;
665
793
  exports.detectMessageFormat = detectMessageFormat;
666
794
  exports.getActiveEntries = getActiveEntries;
795
+ exports.getGlobalVar = getGlobalVar;
796
+ exports.getVar = getVar;
797
+ exports.getVariableChanges = getVariableChanges;
667
798
  exports.isHistoryInput = isHistoryInput;
668
799
  exports.isTextInput = isTextInput;
669
800
  exports.mergeRegexRules = mergeRegexRules;
@@ -671,7 +802,10 @@ exports.normalizeHistoryFormat = normalizeHistoryFormat;
671
802
  exports.normalizeRegexes = normalizeRegexes;
672
803
  exports.normalizeWorldbooks = normalizeWorldbooks;
673
804
  exports.processContentStages = processContentStages;
805
+ exports.processVariableMacros = processVariableMacros;
674
806
  exports.replaceMacros = replaceMacros;
807
+ exports.setGlobalVar = setGlobalVar;
808
+ exports.setVar = setVar;
675
809
  exports.testCondition = testCondition;
676
810
  //# sourceMappingURL=index.cjs.map
677
811
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/channels/gemini.ts","../src/core/channels/openai.ts","../src/core/channels/simple.ts","../src/core/channels/tagged.ts","../src/core/channels/text.ts","../src/core/channels/detect.ts","../src/core/convert.ts","../src/core/modules/history/factories.ts","../src/core/modules/history/guards.ts","../src/core/modules/worldbook/testCondition.ts","../src/core/modules/inputs/normalizeRegexes.ts","../src/core/modules/inputs/normalizeWorldbooks.ts","../src/core/modules/worldbook/getActiveEntries.ts","../src/core/modules/regex/applyRegex.ts","../src/core/modules/regex/mergeRegexRules.ts","../src/core/modules/macro/replaceMacros.ts","../src/core/modules/assemble/assembleTaggedPromptList.ts","../src/core/modules/pipeline/processContentStages.ts","../src/core/modules/pipeline/compileTaggedStages.ts","../src/core/modules/build/buildPrompt.ts","../src/core/channels/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { GeminiContent } from '../types';\r\n\r\nexport function isGeminiContents(v: unknown): v is GeminiContent[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'parts' in x &&\r\n Array.isArray((x as any).parts)\r\n )\r\n );\r\n}\r\n\r\nexport function toInternalFromGemini(input: GeminiContent[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role,\r\n parts: (m.parts || []).map((p) => ({ text: p.text ?? '' }))\r\n }));\r\n}\r\n\r\nexport function fromInternalToGemini(internal: GeminiContent[]): GeminiContent[] {\r\n return internal;\r\n}\r\n","import type { GeminiContent, OpenAIMessage } from '../types';\r\n\r\nexport function isOpenAIMessages(v: unknown): v is OpenAIMessage[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'content' in x &&\r\n typeof (x as any).content === 'string'\r\n )\r\n );\r\n}\r\n\r\n/**\r\n * openai: system/user/assistant 都保留。\r\n * - assistant -> model(内部)\r\n */\r\nexport function toInternalFromOpenAI(input: OpenAIMessage[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role === 'assistant' ? 'model' : m.role,\r\n parts: [{ text: m.content ?? '' }]\r\n }));\r\n}\r\n\r\nexport function fromInternalToOpenAI(internal: GeminiContent[]): OpenAIMessage[] {\r\n return (internal || []).map((m) => ({\r\n role: m.role === 'model' ? 'assistant' : m.role,\r\n content: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n","import type { GeminiContent, SimpleMessage } from '../types';\r\n\r\nexport function isSimpleMessages(v: unknown): v is SimpleMessage[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'text' in x &&\r\n typeof (x as any).text === 'string'\r\n )\r\n );\r\n}\r\n\r\n/**\r\n * simple: 保留 system/user;assistant/model -> model(内部)。\r\n */\r\nexport function toInternalFromSimple(input: SimpleMessage[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role === 'assistant' || m.role === 'model' ? 'model' : m.role,\r\n parts: [{ text: m.text ?? '' }]\r\n }));\r\n}\r\n\r\nexport function fromInternalToSimple(internal: GeminiContent[]): SimpleMessage[] {\r\n return (internal || []).map((m) => ({\r\n role: m.role,\r\n text: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n","import type { GeminiContent, TaggedContent } from '../types';\r\n\r\nexport function isTaggedContents(v: unknown): v is TaggedContent[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'tag' in x &&\r\n 'target' in x &&\r\n 'text' in x\r\n )\r\n );\r\n}\r\n\r\nexport function toInternalFromTagged(input: TaggedContent[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role,\r\n parts: [{ text: m.text ?? '' }]\r\n }));\r\n}\r\n\r\n/**\r\n * 注意:tagged 的“反向转换”没有足够信息恢复 tag/target。\r\n * 所以 fromInternal 只能退化成 simple 或文本。\r\n * buildPrompt() 会在 outputFormat='tagged' 时直接返回 taggedStages,而不是走 convertMessagesOut。\r\n */\r\nexport function fromInternalToTagged(_internal: GeminiContent[]): TaggedContent[] {\r\n throw new Error(\r\n \"fromInternalToTagged is not supported: tagged output should be produced by prompt assembly stage.\"\r\n );\r\n}\r\n","import type { GeminiContent } from '../types';\r\n\r\nexport function isTextInput(v: unknown): v is string | string[] {\r\n return typeof v === 'string' || (Array.isArray(v) && v.every((x) => typeof x === 'string'));\r\n}\r\n\r\nexport function toInternalFromText(input: string | string[]): GeminiContent[] {\r\n const text = Array.isArray(input) ? input.join('\\n') : (input ?? '');\r\n return [{ role: 'user', parts: [{ text }] }];\r\n}\r\n\r\nexport function fromInternalToText(internal: GeminiContent[]): string {\r\n return (internal || [])\r\n .map((m) => (m.parts || []).map((p) => p.text ?? '').join(''))\r\n .join('\\n');\r\n}\r\n","import type { MessageFormat, MessageInput } from '../types';\r\nimport { isGeminiContents } from './gemini';\r\nimport { isOpenAIMessages } from './openai';\r\nimport { isSimpleMessages } from './simple';\r\nimport { isTaggedContents } from './tagged';\r\nimport { isTextInput } from './text';\r\n\r\nexport function detectMessageFormat(input: MessageInput): Exclude<MessageFormat, 'auto'> {\r\n if (isTextInput(input)) return 'text';\r\n if (isGeminiContents(input)) return 'gemini';\r\n if (isOpenAIMessages(input)) return 'openai';\r\n if (isTaggedContents(input)) return 'tagged';\r\n if (isSimpleMessages(input)) return 'simple';\r\n return 'simple';\r\n}\r\n","import type { GeminiContent, MessageFormat, MessageInput, OpenAIMessage, SimpleMessage } from './types';\r\n\r\nimport { detectMessageFormat } from './channels/detect';\r\nimport { toInternalFromGemini, fromInternalToGemini } from './channels/gemini';\r\nimport { toInternalFromOpenAI, fromInternalToOpenAI } from './channels/openai';\r\nimport { toInternalFromSimple, fromInternalToSimple } from './channels/simple';\r\nimport { toInternalFromTagged } from './channels/tagged';\r\nimport { toInternalFromText, fromInternalToText, isTextInput } from './channels/text';\r\n\r\nexport { detectMessageFormat };\r\n\r\n/**\r\n * 将任意输入历史统一转换为 GeminiContent[](role 只保留 user/model)。\r\n * - openai: system/user -> user, assistant -> model\r\n * - simple: system/user -> user, assistant/model -> model\r\n */\r\nexport function convertMessagesIn(\r\n input: MessageInput,\r\n format: MessageFormat = 'auto'\r\n): { detected: Exclude<MessageFormat, 'auto'>; internal: GeminiContent[] } {\r\n const detected = (format === 'auto'\r\n ? detectMessageFormat(input)\r\n : (format as Exclude<MessageFormat, 'auto'>));\r\n\r\n if (detected === 'text') {\r\n // 兼容:string | string[]\r\n return { detected, internal: toInternalFromText(input as any) };\r\n }\r\n\r\n if (detected === 'gemini') {\r\n return { detected, internal: toInternalFromGemini(input as any) };\r\n }\r\n\r\n if (detected === 'openai') {\r\n return { detected, internal: toInternalFromOpenAI(input as any) };\r\n }\r\n\r\n if (detected === 'tagged') {\r\n return { detected, internal: toInternalFromTagged(input as any) };\r\n }\r\n\r\n // simple\r\n return { detected, internal: toInternalFromSimple(input as any) };\r\n}\r\n\r\nexport function convertMessagesOut(\r\n internal: GeminiContent[],\r\n format: Exclude<MessageFormat, 'auto'>\r\n): GeminiContent[] | OpenAIMessage[] | SimpleMessage[] | string {\r\n if (format === 'gemini') return fromInternalToGemini(internal);\r\n if (format === 'openai') return fromInternalToOpenAI(internal);\r\n if (format === 'simple') return fromInternalToSimple(internal);\r\n if (format === 'text') return fromInternalToText(internal);\r\n\r\n // tagged 无法从 internal 逆向恢复 tag/target(见 channels/tagged.ts 说明)\r\n return internal;\r\n}\r\n\r\n/** 小工具:兼容外部直接判断 text 输入 */\r\nexport { isTextInput };\r\n","import type { HistoryInput, MessageInput } from '../../types';\r\n\r\n/**\r\n * 帮助你创建“明确格式”的 history 入参,避免依赖 auto 推断。\r\n */\r\nexport const History = {\r\n gemini: (messages: Extract<HistoryInput, { format: 'gemini' }>['messages']): HistoryInput => ({\r\n format: 'gemini',\r\n messages\r\n }),\r\n\r\n openai: (messages: Extract<HistoryInput, { format: 'openai' }>['messages']): HistoryInput => ({\r\n format: 'openai',\r\n messages\r\n }),\r\n\r\n simple: (messages: Extract<HistoryInput, { format: 'simple' }>['messages']): HistoryInput => ({\r\n format: 'simple',\r\n messages\r\n }),\r\n\r\n tagged: (messages: Extract<HistoryInput, { format: 'tagged' }>['messages']): HistoryInput => ({\r\n format: 'tagged',\r\n messages\r\n }),\r\n\r\n text: (text: Extract<HistoryInput, { format: 'text' }>['text']): HistoryInput => ({\r\n format: 'text',\r\n text\r\n }),\r\n\r\n auto: (input: MessageInput): HistoryInput => ({\r\n format: 'auto',\r\n input\r\n })\r\n} as const;\r\n","import type { HistoryInput, MessageFormat } from '../../types';\r\n\r\nexport function isHistoryInput(v: unknown): v is HistoryInput {\r\n return typeof v === 'object' && v !== null && 'format' in v && typeof (v as any).format === 'string';\r\n}\r\n\r\n/**\r\n * 用于兼容:当调用方没有使用 HistoryInput,而是直接传了 MessageInput 时,\r\n * 可通过该函数统一推断/声明其格式。\r\n */\r\nexport function normalizeHistoryFormat(format?: MessageFormat): MessageFormat {\r\n return format ?? 'auto';\r\n}\r\n","export function testCondition(condition: string | undefined, text: string): boolean {\r\n if (!condition || condition.trim() === '') return true;\r\n\r\n const kwMatch = condition.match(/<<keywords:(.+)>>/i);\r\n if (kwMatch?.[1]) {\r\n const keywords = kwMatch[1].split(',').map((k) => k.trim());\r\n return keywords.some((k) => k && text.includes(k));\r\n }\r\n\r\n try {\r\n const regex = new RegExp(condition, 'i');\r\n return regex.test(text);\r\n } catch {\r\n return text.includes(condition);\r\n }\r\n}\r\n","import type { RegexRule, RegexesInput } from '../../types';\r\n\r\nfunction isRegexRuleArray(v: unknown): v is RegexRule[] {\r\n return Array.isArray(v) && v.every((x) => typeof x === 'object' && x !== null && 'find_regex' in (x as any));\r\n}\r\n\r\n/**\r\n * 兼容用户一次性传入多个“正则 JSON 文件”的情况。\r\n * 支持格式:\r\n * - RegexRule[]\r\n * - { regex_rules: RegexRule[] }\r\n * - { rules: RegexRule[] }\r\n * - RegexRule\r\n * - 以上任意形式的数组(多文件)\r\n */\r\nexport function normalizeRegexes(input?: RegexesInput): RegexRule[] {\r\n if (!input) return [];\r\n\r\n // 同 normalizeWorldbooks:\r\n // input 既可能是“单个文件的 RegexRule[]”,也可能是“多个文件的数组”。\r\n const files: any[] = [];\r\n\r\n if (Array.isArray(input)) {\r\n // 若 input 本身就是 RegexRule[](而不是多文件),则视作单文件\r\n if (isRegexRuleArray(input)) {\r\n files.push(input);\r\n } else {\r\n files.push(...input);\r\n }\r\n } else {\r\n files.push(input);\r\n }\r\n\r\n const out: RegexRule[] = [];\r\n\r\n for (const item of files) {\r\n if (!item) continue;\r\n\r\n // RegexRule[]\r\n if (isRegexRuleArray(item)) {\r\n out.push(...item);\r\n continue;\r\n }\r\n\r\n // RegexRule\r\n if (typeof item === 'object' && item !== null && 'find_regex' in (item as any)) {\r\n out.push(item as RegexRule);\r\n continue;\r\n }\r\n\r\n // { regex_rules: [...] }\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).regex_rules)) {\r\n out.push(...((item as any).regex_rules as RegexRule[]));\r\n continue;\r\n }\r\n\r\n // { rules: [...] }\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).rules)) {\r\n out.push(...((item as any).rules as RegexRule[]));\r\n continue;\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n","import type {\r\n Role,\r\n WorldbookEntry,\r\n WorldbookEntryInput,\r\n WorldbooksInput,\r\n WorldbookInput\r\n} from '../../types';\r\n\r\nfunction isWorldbookEntryArray(v: unknown): v is WorldbookEntryInput[] {\r\n return Array.isArray(v) && v.every((x) => typeof x === 'object' && x !== null && 'content' in (x as any));\r\n}\r\n\r\nfunction normalizeOne(item: WorldbookInput): WorldbookEntry[] {\r\n const normalizeEntry = (e: any): WorldbookEntry | null => {\r\n if (!e || typeof e !== 'object') return null;\r\n\r\n const position = (e as any).position as WorldbookEntryInput['position'] | undefined;\r\n if (position !== 'before_char' && position !== 'after_char' && position !== 'fixed') return null;\r\n\r\n const role: Role = (e as any).role ?? 'user';\r\n\r\n // order 约束:fixed/slot 都必须显式提供 order\r\n const orderRaw = (e as any).order;\r\n const order = Number.isFinite(orderRaw) ? Number(orderRaw) : NaN;\r\n if (!Number.isFinite(order)) return null;\r\n\r\n if (position === 'fixed') {\r\n const depthRaw = (e as any).depth;\r\n const depth = Number.isFinite(depthRaw) ? Number(depthRaw) : NaN;\r\n if (!Number.isFinite(depth)) return null;\r\n\r\n return {\r\n ...(e as any),\r\n role,\r\n position,\r\n order,\r\n depth\r\n } as WorldbookEntry;\r\n }\r\n\r\n // slot 条目:忽略 depth\r\n return {\r\n ...(e as any),\r\n role,\r\n position,\r\n order\r\n } as WorldbookEntry;\r\n };\r\n\r\n const normalizeEntries = (entries: any[]): WorldbookEntry[] => {\r\n return (entries || [])\r\n .map(normalizeEntry)\r\n .filter((x): x is WorldbookEntry => Boolean(x));\r\n };\r\n\r\n // 直接是 entries 数组\r\n if (isWorldbookEntryArray(item)) return normalizeEntries(item as any);\r\n\r\n // 形如 { name, entries } 的 worldbook.json\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).entries)) {\r\n // 允许 { enabled: false } 作为文件级开关\r\n if ((item as any).enabled === false) return [];\r\n return normalizeEntries((item as any).entries);\r\n }\r\n\r\n return [];\r\n}\r\n\r\n/**\r\n * 兼容用户一次性传入多个“世界书 JSON 文件”的情况。\r\n * 支持格式:\r\n * - Worldbook({ name, entries })\r\n * - WorldbookEntryInput[]\r\n * - 以上任意形式的数组(多文件)\r\n */\r\nexport function normalizeWorldbooks(input?: WorldbooksInput): WorldbookEntry[] {\r\n if (!input) return [];\r\n\r\n // 关键点:\r\n // - input 既可能是“单个文件的 entries 数组(WorldbookEntryInput[])”\r\n // - 也可能是“多个文件的数组(WorldbookInput[])”\r\n // 两者在运行时都是 Array,需要用内容结构区分。\r\n\r\n const files: WorldbookInput[] = [];\r\n\r\n if (Array.isArray(input)) {\r\n // 如果本身就是 entries 数组,把它当作“单个文件”处理\r\n if (isWorldbookEntryArray(input)) {\r\n files.push(input);\r\n } else {\r\n files.push(...(input as WorldbookInput[]));\r\n }\r\n } else {\r\n files.push(input);\r\n }\r\n\r\n const out: WorldbookEntry[] = [];\r\n for (const file of files) {\r\n if (!file) continue;\r\n out.push(...normalizeOne(file));\r\n }\r\n\r\n return out;\r\n}\r\n","import type { Worldbook, WorldbookEntry } from '../../types';\r\nimport { normalizeWorldbooks } from '../inputs';\r\nimport { testCondition } from './testCondition';\r\n\r\nexport function getActiveEntries(params: {\r\n contextText?: string;\r\n /** 已归一化后的全局世界书 entries */\r\n globalEntries?: WorldbookEntry[];\r\n presetWorldbook?: Worldbook;\r\n characterWorldbook?: Worldbook;\r\n}): WorldbookEntry[] {\r\n const { contextText = '', globalEntries = [], presetWorldbook, characterWorldbook } = params;\r\n\r\n const filterEntry = (e: WorldbookEntry) => {\r\n if (e.enabled === false) return false;\r\n if (e.mode === 'always') return true;\r\n if (e.mode === 'conditional') return testCondition(e.condition, contextText);\r\n return true;\r\n };\r\n\r\n const entries: Array<WorldbookEntry & { _source: string }> = [];\r\n\r\n // 1) global(已归一化为严格 WorldbookEntry)\r\n (globalEntries || []).filter(filterEntry).forEach((e, idx) => {\r\n entries.push({ ...e, _source: `global-${idx}` });\r\n });\r\n\r\n // 2) preset(输入 worldbook 需要归一化)\r\n const presetEntries = normalizeWorldbooks(presetWorldbook);\r\n presetEntries.filter(filterEntry).forEach((e) => {\r\n entries.push({ ...e, _source: 'preset' });\r\n });\r\n\r\n // 3) character(输入 worldbook 需要归一化)\r\n const characterEntries = normalizeWorldbooks(characterWorldbook);\r\n characterEntries.filter(filterEntry).forEach((e) => {\r\n entries.push({ ...e, _source: 'character' });\r\n });\r\n\r\n // 保持你当前项目中的排序策略:先按 order,再按 source priority\r\n return entries.sort((a, b) => {\r\n if (a.order !== b.order) return a.order - b.order;\r\n\r\n const getPrio = (src: string) => {\r\n if (src === 'character') return 3;\r\n if (src === 'preset') return 2;\r\n return 1;\r\n };\r\n\r\n return getPrio(a._source) - getPrio(b._source);\r\n });\r\n}\r\n","import type { RegexRule, Target, View } from '../../types';\r\n\r\n/**\r\n * 复刻你当前 store 里的 applyRegex 行为(含 target 映射逻辑)。\r\n */\r\nexport function applyRegex(\r\n text: string,\r\n params: {\r\n rules: RegexRule[];\r\n target: Target;\r\n view: View;\r\n placement?: 'before_macro' | 'after_macro';\r\n }\r\n): string {\r\n let result = text ?? '';\r\n const { rules, target, view, placement } = params;\r\n\r\n for (const rule of rules) {\r\n if (!rule?.enabled) continue;\r\n if (!(rule.views || []).includes(view)) continue;\r\n if (placement && rule.placement !== placement) continue;\r\n\r\n const mappedTarget: string[] =\r\n target === 'model' || target === 'chat_history'\r\n ? ['model', 'chat_history', 'assistant_response']\r\n : [target];\r\n\r\n const isMatch =\r\n (rule.targets || []).some((t) => mappedTarget.includes(t)) ||\r\n (target === 'model' && (rule.targets || []).includes('chat_history')) ||\r\n (target === 'user' && (rule.targets || []).includes('chat_history'));\r\n\r\n if (!isMatch) continue;\r\n\r\n try {\r\n const re = new RegExp(rule.find_regex, 'g');\r\n result = result.replace(re, rule.replace_regex);\r\n } catch {\r\n // 库内不打印 console,避免污染调用方;直接跳过该条规则\r\n continue;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import type { RegexRule, View } from '../../types';\r\n\r\nfunction normalizeView(v: RegexRule['views'][number]): View {\r\n return v === 'assistant_view' ? 'model_view' : v;\r\n}\r\n\r\nexport function mergeRegexRules(params: {\r\n /** 全局正则规则(可选) */\r\n globalRules?: RegexRule[];\r\n\r\n /** 预设内嵌正则 */\r\n presetRules?: RegexRule[];\r\n\r\n /** 角色卡内嵌正则 */\r\n characterRules?: RegexRule[];\r\n}): RegexRule[] {\r\n const all: RegexRule[] = [];\r\n\r\n // 1) 全局直传 rules(推荐)\r\n all.push(...(params.globalRules || []));\r\n\r\n // 2) 预设与角色\r\n all.push(...(params.presetRules || []));\r\n all.push(...(params.characterRules || []));\r\n\r\n return all.map((r) => ({\r\n ...r,\r\n views: (r.views || []).map(normalizeView)\r\n }));\r\n}\r\n","/**\r\n * 宏替换。\r\n * 支持的语法:\r\n * - {{char}} {{user}} 以及任意 {{key}}\r\n * - <<char>> <<user>> 以及任意 <<key>>\r\n */\r\nexport function replaceMacros(text: string, macros: Record<string, string>): string {\r\n if (!text) return '';\r\n\r\n let out = text;\r\n\r\n // 处理 <<key>> 格式(包括 <<user>> 和 <<char>>)\r\n out = out.replace(/<<\\s*([a-zA-Z0-9_]+)\\s*>>/g, (_m, key: string) => {\r\n const lowerKey = key.toLowerCase();\r\n // 先尝试精确匹配,再尝试小写匹配\r\n if (Object.prototype.hasOwnProperty.call(macros, key)) {\r\n return String(macros[key]);\r\n }\r\n if (Object.prototype.hasOwnProperty.call(macros, lowerKey)) {\r\n return String(macros[lowerKey]);\r\n }\r\n return _m; // 未知宏保持原样\r\n });\r\n\r\n // 处理 {{key}} 格式(包括 {{char}} 和 {{user}})\r\n out = out.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (_m, key: string) => {\r\n const lowerKey = key.toLowerCase();\r\n // 先尝试精确匹配,再尝试小写匹配\r\n if (Object.prototype.hasOwnProperty.call(macros, key)) {\r\n return String(macros[key]);\r\n }\r\n if (Object.prototype.hasOwnProperty.call(macros, lowerKey)) {\r\n return String(macros[lowerKey]);\r\n }\r\n return _m; // 未知宏保持原样\r\n });\r\n\r\n return out;\r\n}\r\n","import type { PromptBlock, Role, TaggedContent, WorldbookEntry } from '../../types';\r\n\r\nfunction mapRole(role: Role): Role {\r\n // 内部保留 system;仅在最终输出转换时按格式需要做降级\r\n return role;\r\n}\r\n\r\nfunction isFixedPromptBlock(b: PromptBlock): b is Extract<PromptBlock, { position: 'fixed' }> {\r\n return b.position === 'fixed';\r\n}\r\n\r\nfunction isFixedWorldbookEntry(\r\n e: WorldbookEntry\r\n): e is Extract<WorldbookEntry, { position: 'fixed' }> {\r\n return e.position === 'fixed';\r\n}\r\n\r\nexport function assembleTaggedPromptList(params: {\r\n presetBlocks: PromptBlock[];\r\n activeEntries: WorldbookEntry[];\r\n /** 线性聊天历史(允许包含 system) */\r\n chatHistory: Array<{ role: Role; text: string }>;\r\n positionMap?: Partial<Record<'before_char' | 'after_char', string>>;\r\n}): TaggedContent[] {\r\n const {\r\n presetBlocks,\r\n activeEntries,\r\n chatHistory,\r\n positionMap = { before_char: 'charBefore', after_char: 'charAfter' }\r\n } = params;\r\n\r\n const result: TaggedContent[] = [];\r\n\r\n const enabledBlocks = (presetBlocks || []).filter((b) => b.enabled !== false);\r\n\r\n // 1) relative blocks:作为“骨架块”输出(包含 chatHistory、charBefore、charAfter 等占位块)\r\n const relativeBlocks = enabledBlocks.filter((b) => b.position === 'relative');\r\n\r\n for (const block of relativeBlocks) {\r\n // 1) 世界书:插槽条目(before_char/after_char)\r\n // 规则:\r\n // - 仅 position=before_char/after_char 才会落入占位块\r\n // - 不使用 depth(slot 条目靠 order 相对排序)\r\n // - 仅排除 position=fixed(它们属于 chatHistory 注入)\r\n const slotEntries = (activeEntries || [])\r\n .filter((e) => {\r\n if (isFixedWorldbookEntry(e)) return false;\r\n const mappedPos = positionMap[e.position] || e.position;\r\n return mappedPos === block.identifier;\r\n })\r\n .sort((a, b) => a.order - b.order);\r\n\r\n for (const entry of slotEntries) {\r\n result.push({\r\n tag: `Worldbook: ${entry.name}`,\r\n target: 'world_book',\r\n role: mapRole(entry.role),\r\n text: entry.content\r\n });\r\n }\r\n\r\n // 2) 主内容\r\n if (block.identifier === 'chatHistory') {\r\n let dialogueList: TaggedContent[] = (chatHistory || []).map((node) => ({\r\n tag: `History: ${node.role}`,\r\n // system 属于聊天历史的一部分:这里用 chat_history 目标以便 regex 可覆盖\r\n target: node.role === 'user' ? 'user' : node.role === 'model' ? 'model' : 'chat_history',\r\n role: node.role,\r\n text: node.text\r\n }));\r\n\r\n // 仅 fixed 才会注入到 chatHistory,此时才使用 depth\r\n // 约束:fixed 必须具备 depth + order(两者都必填);否则视为无效配置并忽略。\r\n const presetInjections = enabledBlocks.filter(\r\n (b): b is Extract<PromptBlock, { position: 'fixed' }> =>\r\n isFixedPromptBlock(b) &&\r\n typeof b.depth === 'number' &&\r\n Number.isFinite(b.depth) &&\r\n typeof b.order === 'number' &&\r\n Number.isFinite(b.order)\r\n );\r\n const worldbookInjections = (activeEntries || []).filter(\r\n (e): e is Extract<WorldbookEntry, { position: 'fixed' }> =>\r\n isFixedWorldbookEntry(e) &&\r\n typeof e.depth === 'number' &&\r\n Number.isFinite(e.depth) &&\r\n typeof e.order === 'number' &&\r\n Number.isFinite(e.order)\r\n );\r\n\r\n const allInjections = [\r\n ...presetInjections.map((b) => ({\r\n tag: `Preset: ${b.name}`,\r\n target: 'preset' as const,\r\n role: mapRole(b.role),\r\n text: b.content || '',\r\n depth: b.depth,\r\n order: b.order\r\n })),\r\n ...worldbookInjections.map((e) => ({\r\n tag: `Worldbook: ${e.name}`,\r\n target: 'world_book' as const,\r\n role: mapRole(e.role),\r\n text: e.content,\r\n depth: e.depth,\r\n order: e.order\r\n }))\r\n ].sort((a, b) => {\r\n if (a.depth !== b.depth) return a.depth - b.depth;\r\n return a.order - b.order;\r\n });\r\n\r\n for (const item of allInjections) {\r\n const targetIndex = Math.max(0, dialogueList.length - item.depth);\r\n dialogueList.splice(targetIndex, 0, {\r\n tag: item.tag,\r\n target: item.target,\r\n role: item.role,\r\n text: item.text\r\n });\r\n }\r\n\r\n result.push(...dialogueList);\r\n } else if (block.content) {\r\n result.push({\r\n tag: `Preset: ${block.name}`,\r\n target: 'preset',\r\n role: mapRole(block.role),\r\n text: block.content\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import type { PerItemStages, RegexRule, Target, View } from '../../types';\r\nimport { applyRegex } from '../regex';\r\nimport { replaceMacros } from '../macro';\r\n\r\nexport function processContentStages(\r\n text: string,\r\n params: {\r\n target: Target;\r\n view: View;\r\n rules: RegexRule[];\r\n macros: Record<string, string>;\r\n }\r\n): Pick<PerItemStages, 'raw' | 'afterPreRegex' | 'afterMacro' | 'afterPostRegex'> {\r\n const raw = text ?? '';\r\n\r\n const afterPreRegex = applyRegex(raw, {\r\n rules: params.rules,\r\n target: params.target,\r\n view: params.view,\r\n placement: 'before_macro'\r\n });\r\n\r\n const afterMacro = replaceMacros(afterPreRegex, params.macros);\r\n\r\n const afterPostRegex = applyRegex(afterMacro, {\r\n rules: params.rules,\r\n target: params.target,\r\n view: params.view,\r\n placement: 'after_macro'\r\n });\r\n\r\n return { raw, afterPreRegex, afterMacro, afterPostRegex };\r\n}\r\n\r\n","import type { PerItemStages, PromptStages, RegexRule, TaggedContent, View } from '../../types';\r\nimport { processContentStages } from './processContentStages';\r\n\r\nexport function compileTaggedStages(\r\n tagged: TaggedContent[],\r\n params: { view: View; rules: RegexRule[]; macros: Record<string, string> }\r\n): { stages: PromptStages<TaggedContent[]>; perItem: PerItemStages[] } {\r\n const perItem: PerItemStages[] = [];\r\n\r\n const raw = (tagged || []).map((i) => ({ ...i }));\r\n const afterPreRegex: TaggedContent[] = [];\r\n const afterMacro: TaggedContent[] = [];\r\n const afterPostRegex: TaggedContent[] = [];\r\n\r\n for (const item of raw) {\r\n const s = processContentStages(item.text, {\r\n target: item.target,\r\n view: params.view,\r\n rules: params.rules,\r\n macros: params.macros\r\n });\r\n\r\n perItem.push({\r\n tag: item.tag,\r\n role: item.role,\r\n target: item.target,\r\n ...s\r\n });\r\n\r\n afterPreRegex.push({ ...item, text: s.afterPreRegex });\r\n afterMacro.push({ ...item, text: s.afterMacro });\r\n afterPostRegex.push({ ...item, text: s.afterPostRegex });\r\n }\r\n\r\n return {\r\n stages: { raw, afterPreRegex, afterMacro, afterPostRegex },\r\n perItem\r\n };\r\n}\r\n\r\n","import type { BuildPromptParams, BuildPromptResult, GeminiContent, TaggedContent } from '../../types';\r\nimport { convertMessagesIn, convertMessagesOut } from '../../convert';\r\nimport { isHistoryInput, normalizeHistoryFormat } from '../history';\r\nimport { normalizeRegexes, normalizeWorldbooks } from '../inputs';\r\nimport { getActiveEntries } from '../worldbook';\r\nimport { assembleTaggedPromptList } from '../assemble';\r\nimport { mergeRegexRules } from '../regex';\r\nimport { compileTaggedStages } from '../pipeline';\r\n\r\nfunction geminiContentsToChatHistory(\r\n contents: GeminiContent[]\r\n): Array<{ role: GeminiContent['role']; text: string }> {\r\n return (contents || []).map((m) => ({\r\n role: m.role,\r\n text: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n\r\nfunction taggedToGemini(tagged: TaggedContent[]): GeminiContent[] {\r\n return (tagged || []).map((item) => ({\r\n role: item.role,\r\n parts: [{ text: item.text ?? '' }]\r\n }));\r\n}\r\n\r\nfunction applySystemRolePolicy(\r\n internal: GeminiContent[],\r\n policy: 'keep' | 'to_user'\r\n): GeminiContent[] {\r\n if (policy === 'keep') return internal;\r\n return (internal || []).map((m) => ({\r\n ...m,\r\n role: m.role === 'system' ? 'user' : m.role\r\n }));\r\n}\r\n\r\n/**\r\n * 从 character 和 persona 提取宏变量,并与用户提供的 macros 合并\r\n * 优先级:用户显式提供的 macros > character/persona 提取的\r\n */\r\nfunction buildMacros(\r\n userMacros: Record<string, string>,\r\n character?: BuildPromptParams['character'],\r\n persona?: BuildPromptParams['persona']\r\n): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n\r\n // 从 persona 提取 user 宏\r\n if (persona) {\r\n const userName = persona.persona_name || persona.name;\r\n if (userName) {\r\n result.user = userName;\r\n }\r\n }\r\n\r\n // 从 character 提取 char 宏\r\n if (character) {\r\n const charName = character.character_name || character.name;\r\n if (charName) {\r\n result.char = charName;\r\n }\r\n }\r\n\r\n // 用户显式提供的 macros 优先级最高,覆盖自动提取的\r\n return { ...result, ...userMacros };\r\n}\r\n\r\nexport function buildPrompt(params: BuildPromptParams): BuildPromptResult {\r\n const { preset, character, persona, globals, history, historyFormat, macros, view, options } = params;\r\n\r\n // 构建宏变量:从 character/persona 自动提取 + 用户显式提供的\r\n const finalMacros = buildMacros(macros || {}, character, persona);\r\n\r\n // 1) 统一 history 输入为“类 Gemini”\r\n const historyConv = (() => {\r\n if (isHistoryInput(history)) {\r\n if (history.format === 'text') {\r\n return convertMessagesIn(history.text, 'text');\r\n }\r\n if (history.format === 'auto') {\r\n return convertMessagesIn(history.input, 'auto');\r\n }\r\n return convertMessagesIn(history.messages as any, history.format);\r\n }\r\n\r\n // 兼容:直接传 MessageInput\r\n return convertMessagesIn(history as any, normalizeHistoryFormat(historyFormat));\r\n })();\r\n\r\n const detectedHistoryFormat = historyConv.detected;\r\n const internalHistory = historyConv.internal;\r\n\r\n const chatHistory = geminiContentsToChatHistory(internalHistory);\r\n\r\n const recentN = options?.recentHistoryForWorldbook ?? 5;\r\n const recentHistoryText = chatHistory\r\n .slice(-recentN)\r\n .map((n) => n.text)\r\n .join('\\n');\r\n\r\n const globalWorldbookEntries = normalizeWorldbooks(globals?.worldbooks);\r\n\r\n const activeEntries = getActiveEntries({\r\n contextText: recentHistoryText,\r\n globalEntries: globalWorldbookEntries,\r\n presetWorldbook: preset.world_book,\r\n characterWorldbook: character?.world_book\r\n });\r\n\r\n const tagged = assembleTaggedPromptList({\r\n presetBlocks: preset.prompts,\r\n activeEntries,\r\n chatHistory,\r\n positionMap: options?.positionMap\r\n });\r\n\r\n const globalRegexRules = normalizeRegexes(globals?.regexes);\r\n\r\n const rules = mergeRegexRules({\r\n globalRules: globalRegexRules,\r\n presetRules: preset.regex_rules,\r\n characterRules: character?.regex_rules\r\n });\r\n\r\n // 2) 编译各阶段(raw -> beforeRegex -> macro -> afterRegex)\r\n const compiled = compileTaggedStages(tagged, { view, rules, macros: finalMacros });\r\n\r\n const taggedStages = compiled.stages;\r\n const perItem = compiled.perItem;\r\n\r\n const internalStages = {\r\n raw: taggedToGemini(taggedStages.raw),\r\n afterPreRegex: taggedToGemini(taggedStages.afterPreRegex),\r\n afterMacro: taggedToGemini(taggedStages.afterMacro),\r\n afterPostRegex: taggedToGemini(taggedStages.afterPostRegex)\r\n };\r\n\r\n // 3) 计算 outputFormat(默认跟随输入格式;也可手动指定)\r\n const defaultOutputFormat = isHistoryInput(history)\r\n ? history.format === 'auto'\r\n ? detectedHistoryFormat\r\n : history.format\r\n : detectedHistoryFormat;\r\n\r\n const outputFormat = (params.outputFormat ?? defaultOutputFormat) as BuildPromptResult['outputFormat'];\r\n const systemRolePolicy = params.systemRolePolicy ?? 'keep';\r\n\r\n const outputStages =\r\n outputFormat === 'tagged'\r\n ? taggedStages\r\n : {\r\n raw: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.raw, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterPreRegex: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterPreRegex, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterMacro: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterMacro, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterPostRegex: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterPostRegex, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n )\r\n };\r\n\r\n return {\r\n detectedHistoryFormat,\r\n outputFormat,\r\n systemRolePolicy,\r\n activeWorldbookEntries: activeEntries,\r\n mergedRegexRules: rules,\r\n stages: {\r\n tagged: taggedStages,\r\n internal: internalStages,\r\n output: outputStages,\r\n perItem\r\n }\r\n };\r\n}\r\n","export * from './detect';\r\nexport * from './gemini';\r\nexport * from './openai';\r\nexport * from './simple';\r\nexport * from './tagged';\r\nexport * from './text';\r\n"]}
1
+ {"version":3,"sources":["../src/core/channels/gemini.ts","../src/core/channels/openai.ts","../src/core/channels/simple.ts","../src/core/channels/tagged.ts","../src/core/channels/text.ts","../src/core/channels/detect.ts","../src/core/convert.ts","../src/core/modules/history/factories.ts","../src/core/modules/history/guards.ts","../src/core/modules/worldbook/testCondition.ts","../src/core/modules/inputs/normalizeRegexes.ts","../src/core/modules/inputs/normalizeWorldbooks.ts","../src/core/modules/worldbook/getActiveEntries.ts","../src/core/modules/regex/applyRegex.ts","../src/core/modules/regex/mergeRegexRules.ts","../src/core/modules/variables/variableContext.ts","../src/core/modules/macro/replaceMacros.ts","../src/core/modules/assemble/assembleTaggedPromptList.ts","../src/core/modules/pipeline/processContentStages.ts","../src/core/modules/pipeline/compileTaggedStages.ts","../src/core/modules/build/buildPrompt.ts","../src/core/channels/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { GeminiContent } from '../types';\r\n\r\nexport function isGeminiContents(v: unknown): v is GeminiContent[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'parts' in x &&\r\n Array.isArray((x as any).parts)\r\n )\r\n );\r\n}\r\n\r\nexport function toInternalFromGemini(input: GeminiContent[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role,\r\n parts: (m.parts || []).map((p) => ({ text: p.text ?? '' }))\r\n }));\r\n}\r\n\r\nexport function fromInternalToGemini(internal: GeminiContent[]): GeminiContent[] {\r\n return internal;\r\n}\r\n","import type { GeminiContent, OpenAIMessage } from '../types';\r\n\r\nexport function isOpenAIMessages(v: unknown): v is OpenAIMessage[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'content' in x &&\r\n typeof (x as any).content === 'string'\r\n )\r\n );\r\n}\r\n\r\n/**\r\n * openai: system/user/assistant 都保留。\r\n * - assistant -> model(内部)\r\n */\r\nexport function toInternalFromOpenAI(input: OpenAIMessage[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role === 'assistant' ? 'model' : m.role,\r\n parts: [{ text: m.content ?? '' }]\r\n }));\r\n}\r\n\r\nexport function fromInternalToOpenAI(internal: GeminiContent[]): OpenAIMessage[] {\r\n return (internal || []).map((m) => ({\r\n role: m.role === 'model' ? 'assistant' : m.role,\r\n content: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n","import type { GeminiContent, SimpleMessage } from '../types';\r\n\r\nexport function isSimpleMessages(v: unknown): v is SimpleMessage[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'role' in x &&\r\n 'text' in x &&\r\n typeof (x as any).text === 'string'\r\n )\r\n );\r\n}\r\n\r\n/**\r\n * simple: 保留 system/user;assistant/model -> model(内部)。\r\n */\r\nexport function toInternalFromSimple(input: SimpleMessage[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role === 'assistant' || m.role === 'model' ? 'model' : m.role,\r\n parts: [{ text: m.text ?? '' }]\r\n }));\r\n}\r\n\r\nexport function fromInternalToSimple(internal: GeminiContent[]): SimpleMessage[] {\r\n return (internal || []).map((m) => ({\r\n role: m.role,\r\n text: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n","import type { GeminiContent, TaggedContent } from '../types';\r\n\r\nexport function isTaggedContents(v: unknown): v is TaggedContent[] {\r\n return (\r\n Array.isArray(v) &&\r\n v.every(\r\n (x) =>\r\n typeof x === 'object' &&\r\n x !== null &&\r\n 'tag' in x &&\r\n 'target' in x &&\r\n 'text' in x\r\n )\r\n );\r\n}\r\n\r\nexport function toInternalFromTagged(input: TaggedContent[]): GeminiContent[] {\r\n return (input || []).map((m) => ({\r\n role: m.role,\r\n parts: [{ text: m.text ?? '' }]\r\n }));\r\n}\r\n\r\n/**\r\n * 注意:tagged 的“反向转换”没有足够信息恢复 tag/target。\r\n * 所以 fromInternal 只能退化成 simple 或文本。\r\n * buildPrompt() 会在 outputFormat='tagged' 时直接返回 taggedStages,而不是走 convertMessagesOut。\r\n */\r\nexport function fromInternalToTagged(_internal: GeminiContent[]): TaggedContent[] {\r\n throw new Error(\r\n \"fromInternalToTagged is not supported: tagged output should be produced by prompt assembly stage.\"\r\n );\r\n}\r\n","import type { GeminiContent } from '../types';\r\n\r\nexport function isTextInput(v: unknown): v is string | string[] {\r\n return typeof v === 'string' || (Array.isArray(v) && v.every((x) => typeof x === 'string'));\r\n}\r\n\r\nexport function toInternalFromText(input: string | string[]): GeminiContent[] {\r\n const text = Array.isArray(input) ? input.join('\\n') : (input ?? '');\r\n return [{ role: 'user', parts: [{ text }] }];\r\n}\r\n\r\nexport function fromInternalToText(internal: GeminiContent[]): string {\r\n return (internal || [])\r\n .map((m) => (m.parts || []).map((p) => p.text ?? '').join(''))\r\n .join('\\n');\r\n}\r\n","import type { MessageFormat, MessageInput } from '../types';\r\nimport { isGeminiContents } from './gemini';\r\nimport { isOpenAIMessages } from './openai';\r\nimport { isSimpleMessages } from './simple';\r\nimport { isTaggedContents } from './tagged';\r\nimport { isTextInput } from './text';\r\n\r\nexport function detectMessageFormat(input: MessageInput): Exclude<MessageFormat, 'auto'> {\r\n if (isTextInput(input)) return 'text';\r\n if (isGeminiContents(input)) return 'gemini';\r\n if (isOpenAIMessages(input)) return 'openai';\r\n if (isTaggedContents(input)) return 'tagged';\r\n if (isSimpleMessages(input)) return 'simple';\r\n return 'simple';\r\n}\r\n","import type { GeminiContent, MessageFormat, MessageInput, OpenAIMessage, SimpleMessage } from './types';\r\n\r\nimport { detectMessageFormat } from './channels/detect';\r\nimport { toInternalFromGemini, fromInternalToGemini } from './channels/gemini';\r\nimport { toInternalFromOpenAI, fromInternalToOpenAI } from './channels/openai';\r\nimport { toInternalFromSimple, fromInternalToSimple } from './channels/simple';\r\nimport { toInternalFromTagged } from './channels/tagged';\r\nimport { toInternalFromText, fromInternalToText, isTextInput } from './channels/text';\r\n\r\nexport { detectMessageFormat };\r\n\r\n/**\r\n * 将任意输入历史统一转换为 GeminiContent[](role 只保留 user/model)。\r\n * - openai: system/user -> user, assistant -> model\r\n * - simple: system/user -> user, assistant/model -> model\r\n */\r\nexport function convertMessagesIn(\r\n input: MessageInput,\r\n format: MessageFormat = 'auto'\r\n): { detected: Exclude<MessageFormat, 'auto'>; internal: GeminiContent[] } {\r\n const detected = (format === 'auto'\r\n ? detectMessageFormat(input)\r\n : (format as Exclude<MessageFormat, 'auto'>));\r\n\r\n if (detected === 'text') {\r\n // 兼容:string | string[]\r\n return { detected, internal: toInternalFromText(input as any) };\r\n }\r\n\r\n if (detected === 'gemini') {\r\n return { detected, internal: toInternalFromGemini(input as any) };\r\n }\r\n\r\n if (detected === 'openai') {\r\n return { detected, internal: toInternalFromOpenAI(input as any) };\r\n }\r\n\r\n if (detected === 'tagged') {\r\n return { detected, internal: toInternalFromTagged(input as any) };\r\n }\r\n\r\n // simple\r\n return { detected, internal: toInternalFromSimple(input as any) };\r\n}\r\n\r\nexport function convertMessagesOut(\r\n internal: GeminiContent[],\r\n format: Exclude<MessageFormat, 'auto'>\r\n): GeminiContent[] | OpenAIMessage[] | SimpleMessage[] | string {\r\n if (format === 'gemini') return fromInternalToGemini(internal);\r\n if (format === 'openai') return fromInternalToOpenAI(internal);\r\n if (format === 'simple') return fromInternalToSimple(internal);\r\n if (format === 'text') return fromInternalToText(internal);\r\n\r\n // tagged 无法从 internal 逆向恢复 tag/target(见 channels/tagged.ts 说明)\r\n return internal;\r\n}\r\n\r\n/** 小工具:兼容外部直接判断 text 输入 */\r\nexport { isTextInput };\r\n","import type { HistoryInput, MessageInput } from '../../types';\r\n\r\n/**\r\n * 帮助你创建“明确格式”的 history 入参,避免依赖 auto 推断。\r\n */\r\nexport const History = {\r\n gemini: (messages: Extract<HistoryInput, { format: 'gemini' }>['messages']): HistoryInput => ({\r\n format: 'gemini',\r\n messages\r\n }),\r\n\r\n openai: (messages: Extract<HistoryInput, { format: 'openai' }>['messages']): HistoryInput => ({\r\n format: 'openai',\r\n messages\r\n }),\r\n\r\n simple: (messages: Extract<HistoryInput, { format: 'simple' }>['messages']): HistoryInput => ({\r\n format: 'simple',\r\n messages\r\n }),\r\n\r\n tagged: (messages: Extract<HistoryInput, { format: 'tagged' }>['messages']): HistoryInput => ({\r\n format: 'tagged',\r\n messages\r\n }),\r\n\r\n text: (text: Extract<HistoryInput, { format: 'text' }>['text']): HistoryInput => ({\r\n format: 'text',\r\n text\r\n }),\r\n\r\n auto: (input: MessageInput): HistoryInput => ({\r\n format: 'auto',\r\n input\r\n })\r\n} as const;\r\n","import type { HistoryInput, MessageFormat } from '../../types';\r\n\r\nexport function isHistoryInput(v: unknown): v is HistoryInput {\r\n return typeof v === 'object' && v !== null && 'format' in v && typeof (v as any).format === 'string';\r\n}\r\n\r\n/**\r\n * 用于兼容:当调用方没有使用 HistoryInput,而是直接传了 MessageInput 时,\r\n * 可通过该函数统一推断/声明其格式。\r\n */\r\nexport function normalizeHistoryFormat(format?: MessageFormat): MessageFormat {\r\n return format ?? 'auto';\r\n}\r\n","export function testCondition(condition: string | undefined, text: string): boolean {\r\n if (!condition || condition.trim() === '') return true;\r\n\r\n const kwMatch = condition.match(/<<keywords:(.+)>>/i);\r\n if (kwMatch?.[1]) {\r\n const keywords = kwMatch[1].split(',').map((k) => k.trim());\r\n return keywords.some((k) => k && text.includes(k));\r\n }\r\n\r\n try {\r\n const regex = new RegExp(condition, 'i');\r\n return regex.test(text);\r\n } catch {\r\n return text.includes(condition);\r\n }\r\n}\r\n","import type { RegexRule, RegexesInput } from '../../types';\r\n\r\nfunction isRegexRuleArray(v: unknown): v is RegexRule[] {\r\n return Array.isArray(v) && v.every((x) => typeof x === 'object' && x !== null && 'find_regex' in (x as any));\r\n}\r\n\r\n/**\r\n * 兼容用户一次性传入多个“正则 JSON 文件”的情况。\r\n * 支持格式:\r\n * - RegexRule[]\r\n * - { regex_rules: RegexRule[] }\r\n * - { rules: RegexRule[] }\r\n * - RegexRule\r\n * - 以上任意形式的数组(多文件)\r\n */\r\nexport function normalizeRegexes(input?: RegexesInput): RegexRule[] {\r\n if (!input) return [];\r\n\r\n // 同 normalizeWorldbooks:\r\n // input 既可能是“单个文件的 RegexRule[]”,也可能是“多个文件的数组”。\r\n const files: any[] = [];\r\n\r\n if (Array.isArray(input)) {\r\n // 若 input 本身就是 RegexRule[](而不是多文件),则视作单文件\r\n if (isRegexRuleArray(input)) {\r\n files.push(input);\r\n } else {\r\n files.push(...input);\r\n }\r\n } else {\r\n files.push(input);\r\n }\r\n\r\n const out: RegexRule[] = [];\r\n\r\n for (const item of files) {\r\n if (!item) continue;\r\n\r\n // RegexRule[]\r\n if (isRegexRuleArray(item)) {\r\n out.push(...item);\r\n continue;\r\n }\r\n\r\n // RegexRule\r\n if (typeof item === 'object' && item !== null && 'find_regex' in (item as any)) {\r\n out.push(item as RegexRule);\r\n continue;\r\n }\r\n\r\n // { regex_rules: [...] }\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).regex_rules)) {\r\n out.push(...((item as any).regex_rules as RegexRule[]));\r\n continue;\r\n }\r\n\r\n // { rules: [...] }\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).rules)) {\r\n out.push(...((item as any).rules as RegexRule[]));\r\n continue;\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n","import type {\r\n Role,\r\n WorldbookEntry,\r\n WorldbookEntryInput,\r\n WorldbooksInput,\r\n WorldbookInput\r\n} from '../../types';\r\n\r\nfunction isWorldbookEntryArray(v: unknown): v is WorldbookEntryInput[] {\r\n return Array.isArray(v) && v.every((x) => typeof x === 'object' && x !== null && 'content' in (x as any));\r\n}\r\n\r\nfunction normalizeOne(item: WorldbookInput): WorldbookEntry[] {\r\n const normalizeEntry = (e: any): WorldbookEntry | null => {\r\n if (!e || typeof e !== 'object') return null;\r\n\r\n const position = (e as any).position as WorldbookEntryInput['position'] | undefined;\r\n if (position !== 'before_char' && position !== 'after_char' && position !== 'fixed') return null;\r\n\r\n const role: Role = (e as any).role ?? 'user';\r\n\r\n // order 约束:fixed/slot 都必须显式提供 order\r\n const orderRaw = (e as any).order;\r\n const order = Number.isFinite(orderRaw) ? Number(orderRaw) : NaN;\r\n if (!Number.isFinite(order)) return null;\r\n\r\n if (position === 'fixed') {\r\n const depthRaw = (e as any).depth;\r\n const depth = Number.isFinite(depthRaw) ? Number(depthRaw) : NaN;\r\n if (!Number.isFinite(depth)) return null;\r\n\r\n return {\r\n ...(e as any),\r\n role,\r\n position,\r\n order,\r\n depth\r\n } as WorldbookEntry;\r\n }\r\n\r\n // slot 条目:忽略 depth\r\n return {\r\n ...(e as any),\r\n role,\r\n position,\r\n order\r\n } as WorldbookEntry;\r\n };\r\n\r\n const normalizeEntries = (entries: any[]): WorldbookEntry[] => {\r\n return (entries || [])\r\n .map(normalizeEntry)\r\n .filter((x): x is WorldbookEntry => Boolean(x));\r\n };\r\n\r\n // 直接是 entries 数组\r\n if (isWorldbookEntryArray(item)) return normalizeEntries(item as any);\r\n\r\n // 形如 { name, entries } 的 worldbook.json\r\n if (typeof item === 'object' && item !== null && Array.isArray((item as any).entries)) {\r\n // 允许 { enabled: false } 作为文件级开关\r\n if ((item as any).enabled === false) return [];\r\n return normalizeEntries((item as any).entries);\r\n }\r\n\r\n return [];\r\n}\r\n\r\n/**\r\n * 兼容用户一次性传入多个“世界书 JSON 文件”的情况。\r\n * 支持格式:\r\n * - Worldbook({ name, entries })\r\n * - WorldbookEntryInput[]\r\n * - 以上任意形式的数组(多文件)\r\n */\r\nexport function normalizeWorldbooks(input?: WorldbooksInput): WorldbookEntry[] {\r\n if (!input) return [];\r\n\r\n // 关键点:\r\n // - input 既可能是“单个文件的 entries 数组(WorldbookEntryInput[])”\r\n // - 也可能是“多个文件的数组(WorldbookInput[])”\r\n // 两者在运行时都是 Array,需要用内容结构区分。\r\n\r\n const files: WorldbookInput[] = [];\r\n\r\n if (Array.isArray(input)) {\r\n // 如果本身就是 entries 数组,把它当作“单个文件”处理\r\n if (isWorldbookEntryArray(input)) {\r\n files.push(input);\r\n } else {\r\n files.push(...(input as WorldbookInput[]));\r\n }\r\n } else {\r\n files.push(input);\r\n }\r\n\r\n const out: WorldbookEntry[] = [];\r\n for (const file of files) {\r\n if (!file) continue;\r\n out.push(...normalizeOne(file));\r\n }\r\n\r\n return out;\r\n}\r\n","import type { Worldbook, WorldbookEntry } from '../../types';\r\nimport { normalizeWorldbooks } from '../inputs';\r\nimport { testCondition } from './testCondition';\r\n\r\nexport function getActiveEntries(params: {\r\n contextText?: string;\r\n /** 已归一化后的全局世界书 entries */\r\n globalEntries?: WorldbookEntry[];\r\n presetWorldbook?: Worldbook;\r\n characterWorldbook?: Worldbook;\r\n}): WorldbookEntry[] {\r\n const { contextText = '', globalEntries = [], presetWorldbook, characterWorldbook } = params;\r\n\r\n const filterEntry = (e: WorldbookEntry) => {\r\n if (e.enabled === false) return false;\r\n if (e.mode === 'always') return true;\r\n if (e.mode === 'conditional') return testCondition(e.condition, contextText);\r\n return true;\r\n };\r\n\r\n const entries: Array<WorldbookEntry & { _source: string }> = [];\r\n\r\n // 1) global(已归一化为严格 WorldbookEntry)\r\n (globalEntries || []).filter(filterEntry).forEach((e, idx) => {\r\n entries.push({ ...e, _source: `global-${idx}` });\r\n });\r\n\r\n // 2) preset(输入 worldbook 需要归一化)\r\n const presetEntries = normalizeWorldbooks(presetWorldbook);\r\n presetEntries.filter(filterEntry).forEach((e) => {\r\n entries.push({ ...e, _source: 'preset' });\r\n });\r\n\r\n // 3) character(输入 worldbook 需要归一化)\r\n const characterEntries = normalizeWorldbooks(characterWorldbook);\r\n characterEntries.filter(filterEntry).forEach((e) => {\r\n entries.push({ ...e, _source: 'character' });\r\n });\r\n\r\n // 保持你当前项目中的排序策略:先按 order,再按 source priority\r\n return entries.sort((a, b) => {\r\n if (a.order !== b.order) return a.order - b.order;\r\n\r\n const getPrio = (src: string) => {\r\n if (src === 'character') return 3;\r\n if (src === 'preset') return 2;\r\n return 1;\r\n };\r\n\r\n return getPrio(a._source) - getPrio(b._source);\r\n });\r\n}\r\n","import type { RegexRule, Target, View } from '../../types';\r\n\r\n/**\r\n * 复刻你当前 store 里的 applyRegex 行为(含 target 映射逻辑)。\r\n */\r\nexport function applyRegex(\r\n text: string,\r\n params: {\r\n rules: RegexRule[];\r\n target: Target;\r\n view: View;\r\n placement?: 'before_macro' | 'after_macro';\r\n }\r\n): string {\r\n let result = text ?? '';\r\n const { rules, target, view, placement } = params;\r\n\r\n for (const rule of rules) {\r\n if (!rule?.enabled) continue;\r\n if (!(rule.views || []).includes(view)) continue;\r\n if (placement && rule.placement !== placement) continue;\r\n\r\n const mappedTarget: string[] =\r\n target === 'model' || target === 'chat_history'\r\n ? ['model', 'chat_history', 'assistant_response']\r\n : [target];\r\n\r\n const isMatch =\r\n (rule.targets || []).some((t) => mappedTarget.includes(t)) ||\r\n (target === 'model' && (rule.targets || []).includes('chat_history')) ||\r\n (target === 'user' && (rule.targets || []).includes('chat_history'));\r\n\r\n if (!isMatch) continue;\r\n\r\n try {\r\n const re = new RegExp(rule.find_regex, 'g');\r\n result = result.replace(re, rule.replace_regex);\r\n } catch {\r\n // 库内不打印 console,避免污染调用方;直接跳过该条规则\r\n continue;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import type { RegexRule, View } from '../../types';\r\n\r\nfunction normalizeView(v: RegexRule['views'][number]): View {\r\n return v === 'assistant_view' ? 'model_view' : v;\r\n}\r\n\r\nexport function mergeRegexRules(params: {\r\n /** 全局正则规则(可选) */\r\n globalRules?: RegexRule[];\r\n\r\n /** 预设内嵌正则 */\r\n presetRules?: RegexRule[];\r\n\r\n /** 角色卡内嵌正则 */\r\n characterRules?: RegexRule[];\r\n}): RegexRule[] {\r\n const all: RegexRule[] = [];\r\n\r\n // 1) 全局直传 rules(推荐)\r\n all.push(...(params.globalRules || []));\r\n\r\n // 2) 预设与角色\r\n all.push(...(params.presetRules || []));\r\n all.push(...(params.characterRules || []));\r\n\r\n return all.map((r) => ({\r\n ...r,\r\n views: (r.views || []).map(normalizeView)\r\n }));\r\n}\r\n","/**\r\n * 变量上下文\r\n * 用于在宏替换过程中存储和读取变量\r\n */\r\nexport interface VariableContext {\r\n /** 局部变量(每次构建独立) */\r\n local: Record<string, string>;\r\n /** 全局变量(跨构建持久化,由外部管理) */\r\n global: Record<string, string>;\r\n}\r\n\r\n/**\r\n * 创建变量上下文\r\n */\r\nexport function createVariableContext(\r\n initialLocal?: Record<string, string>,\r\n initialGlobal?: Record<string, string>\r\n): VariableContext {\r\n return {\r\n local: { ...initialLocal },\r\n global: { ...initialGlobal }\r\n };\r\n}\r\n\r\n/**\r\n * 获取局部变量\r\n */\r\nexport function getVar(ctx: VariableContext, name: string): string {\r\n return ctx.local[name] ?? '';\r\n}\r\n\r\n/**\r\n * 设置局部变量\r\n */\r\nexport function setVar(ctx: VariableContext, name: string, value: string): void {\r\n ctx.local[name] = value;\r\n}\r\n\r\n/**\r\n * 获取全局变量\r\n */\r\nexport function getGlobalVar(ctx: VariableContext, name: string): string {\r\n return ctx.global[name] ?? '';\r\n}\r\n\r\n/**\r\n * 设置全局变量\r\n */\r\nexport function setGlobalVar(ctx: VariableContext, name: string, value: string): void {\r\n ctx.global[name] = value;\r\n}\r\n\r\n/**\r\n * 处理文本中的变量宏\r\n * 支持的宏(同时支持 {{}} 和 <<>> 格式):\r\n * - {{getvar::name}} / <<getvar::name>> - 获取局部变量\r\n * - {{setvar::name::value}} / <<setvar::name::value>> - 设置局部变量(替换为空字符串)\r\n * - {{getglobalvar::name}} / <<getglobalvar::name>> - 获取全局变量\r\n * - {{setglobalvar::name::value}} / <<setglobalvar::name::value>> - 设置全局变量(替换为空字符串)\r\n */\r\nexport function processVariableMacros(text: string, ctx: VariableContext): string {\r\n if (!text) return '';\r\n\r\n let result = text;\r\n\r\n // ========== 处理 {{}} 格式 ==========\r\n \r\n // 处理 {{setvar::name::value}} - 必须先处理 set,因为 set 可能影响后续 get\r\n result = result.replace(\r\n /\\{\\{\\s*setvar\\s*::\\s*([^:}]+)\\s*::\\s*([^}]*)\\s*\\}\\}/gi,\r\n (_match, name: string, value: string) => {\r\n setVar(ctx, name.trim(), value.trim());\r\n return ''; // 替换为空字符串\r\n }\r\n );\r\n\r\n // 处理 {{setglobalvar::name::value}}\r\n result = result.replace(\r\n /\\{\\{\\s*setglobalvar\\s*::\\s*([^:}]+)\\s*::\\s*([^}]*)\\s*\\}\\}/gi,\r\n (_match, name: string, value: string) => {\r\n setGlobalVar(ctx, name.trim(), value.trim());\r\n return ''; // 替换为空字符串\r\n }\r\n );\r\n\r\n // 处理 {{getvar::name}}\r\n result = result.replace(\r\n /\\{\\{\\s*getvar\\s*::\\s*([^}]+)\\s*\\}\\}/gi,\r\n (_match, name: string) => {\r\n return getVar(ctx, name.trim());\r\n }\r\n );\r\n\r\n // 处理 {{getglobalvar::name}}\r\n result = result.replace(\r\n /\\{\\{\\s*getglobalvar\\s*::\\s*([^}]+)\\s*\\}\\}/gi,\r\n (_match, name: string) => {\r\n return getGlobalVar(ctx, name.trim());\r\n }\r\n );\r\n\r\n // ========== 处理 <<>> 格式 ==========\r\n \r\n // 处理 <<setvar::name::value>>\r\n result = result.replace(\r\n /<<\\s*setvar\\s*::\\s*([^:>]+)\\s*::\\s*([^>]*)\\s*>>/gi,\r\n (_match, name: string, value: string) => {\r\n setVar(ctx, name.trim(), value.trim());\r\n return ''; // 替换为空字符串\r\n }\r\n );\r\n\r\n // 处理 <<setglobalvar::name::value>>\r\n result = result.replace(\r\n /<<\\s*setglobalvar\\s*::\\s*([^:>]+)\\s*::\\s*([^>]*)\\s*>>/gi,\r\n (_match, name: string, value: string) => {\r\n setGlobalVar(ctx, name.trim(), value.trim());\r\n return ''; // 替换为空字符串\r\n }\r\n );\r\n\r\n // 处理 <<getvar::name>>\r\n result = result.replace(\r\n /<<\\s*getvar\\s*::\\s*([^>]+)\\s*>>/gi,\r\n (_match, name: string) => {\r\n return getVar(ctx, name.trim());\r\n }\r\n );\r\n\r\n // 处理 <<getglobalvar::name>>\r\n result = result.replace(\r\n /<<\\s*getglobalvar\\s*::\\s*([^>]+)\\s*>>/gi,\r\n (_match, name: string) => {\r\n return getGlobalVar(ctx, name.trim());\r\n }\r\n );\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 获取变量上下文的变化(用于返回给调用方)\r\n */\r\nexport function getVariableChanges(\r\n original: VariableContext,\r\n current: VariableContext\r\n): {\r\n localChanges: Record<string, string>;\r\n globalChanges: Record<string, string>;\r\n} {\r\n const localChanges: Record<string, string> = {};\r\n const globalChanges: Record<string, string> = {};\r\n\r\n // 检测局部变量变化\r\n for (const [key, value] of Object.entries(current.local)) {\r\n if (original.local[key] !== value) {\r\n localChanges[key] = value;\r\n }\r\n }\r\n\r\n // 检测全局变量变化\r\n for (const [key, value] of Object.entries(current.global)) {\r\n if (original.global[key] !== value) {\r\n globalChanges[key] = value;\r\n }\r\n }\r\n\r\n return { localChanges, globalChanges };\r\n}\r\n","import type { VariableContext } from '../variables';\r\nimport { processVariableMacros } from '../variables';\r\n\r\n/**\r\n * 宏替换选项\r\n */\r\nexport interface ReplaceMacrosOptions {\r\n /** 基础宏变量,如 { char: 'Alice', user: 'Bob' } */\r\n macros?: Record<string, string>;\r\n /** 变量上下文(用于处理 getvar/setvar 等宏) */\r\n variableContext?: VariableContext;\r\n}\r\n\r\n/**\r\n * 宏替换。\r\n * 支持的语法:\r\n * - {{char}} {{user}} 以及任意 {{key}}\r\n * - <<char>> <<user>> 以及任意 <<key>>\r\n * - {{getvar::name}} - 获取局部变量\r\n * - {{setvar::name::value}} - 设置局部变量\r\n * - {{getglobalvar::name}} - 获取全局变量\r\n * - {{setglobalvar::name::value}} - 设置全局变量\r\n */\r\nexport function replaceMacros(text: string, options: ReplaceMacrosOptions | Record<string, string>): string {\r\n if (!text) return '';\r\n\r\n // 兼容旧的 API(直接传 macros 对象)\r\n const opts: ReplaceMacrosOptions = \r\n options && ('macros' in options || 'variableContext' in options)\r\n ? options as ReplaceMacrosOptions\r\n : { macros: options as Record<string, string> };\r\n\r\n const macros = opts.macros || {};\r\n let out = text;\r\n\r\n // 1. 先处理变量宏(如果有变量上下文)\r\n if (opts.variableContext) {\r\n out = processVariableMacros(out, opts.variableContext);\r\n }\r\n\r\n // 2. 处理 <<key>> 格式(包括 <<user>> 和 <<char>>)\r\n out = out.replace(/<<\\s*([a-zA-Z0-9_]+)\\s*>>/g, (_m, key: string) => {\r\n const lowerKey = key.toLowerCase();\r\n // 先尝试精确匹配,再尝试小写匹配\r\n if (Object.prototype.hasOwnProperty.call(macros, key)) {\r\n return String(macros[key]);\r\n }\r\n if (Object.prototype.hasOwnProperty.call(macros, lowerKey)) {\r\n return String(macros[lowerKey]);\r\n }\r\n return _m; // 未知宏保持原样\r\n });\r\n\r\n // 3. 处理 {{key}} 格式(排除已处理的变量宏)\r\n out = out.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (_m, key: string) => {\r\n const lowerKey = key.toLowerCase();\r\n // 跳过变量宏关键字(已在上面处理)\r\n if (['getvar', 'setvar', 'getglobalvar', 'setglobalvar'].includes(lowerKey)) {\r\n return _m;\r\n }\r\n // 先尝试精确匹配,再尝试小写匹配\r\n if (Object.prototype.hasOwnProperty.call(macros, key)) {\r\n return String(macros[key]);\r\n }\r\n if (Object.prototype.hasOwnProperty.call(macros, lowerKey)) {\r\n return String(macros[lowerKey]);\r\n }\r\n return _m; // 未知宏保持原样\r\n });\r\n\r\n return out;\r\n}\r\n","import type { PromptBlock, Role, TaggedContent, WorldbookEntry } from '../../types';\r\n\r\nfunction mapRole(role: Role): Role {\r\n // 内部保留 system;仅在最终输出转换时按格式需要做降级\r\n return role;\r\n}\r\n\r\nfunction isFixedPromptBlock(b: PromptBlock): b is Extract<PromptBlock, { position: 'fixed' }> {\r\n return b.position === 'fixed';\r\n}\r\n\r\nfunction isFixedWorldbookEntry(\r\n e: WorldbookEntry\r\n): e is Extract<WorldbookEntry, { position: 'fixed' }> {\r\n return e.position === 'fixed';\r\n}\r\n\r\nexport function assembleTaggedPromptList(params: {\r\n presetBlocks: PromptBlock[];\r\n activeEntries: WorldbookEntry[];\r\n /** 线性聊天历史(允许包含 system) */\r\n chatHistory: Array<{ role: Role; text: string }>;\r\n positionMap?: Partial<Record<'before_char' | 'after_char', string>>;\r\n}): TaggedContent[] {\r\n const {\r\n presetBlocks,\r\n activeEntries,\r\n chatHistory,\r\n positionMap = { before_char: 'charBefore', after_char: 'charAfter' }\r\n } = params;\r\n\r\n const result: TaggedContent[] = [];\r\n\r\n const enabledBlocks = (presetBlocks || []).filter((b) => b.enabled !== false);\r\n\r\n // 1) relative blocks:作为“骨架块”输出(包含 chatHistory、charBefore、charAfter 等占位块)\r\n const relativeBlocks = enabledBlocks.filter((b) => b.position === 'relative');\r\n\r\n for (const block of relativeBlocks) {\r\n // 1) 世界书:插槽条目(before_char/after_char)\r\n // 规则:\r\n // - 仅 position=before_char/after_char 才会落入占位块\r\n // - 不使用 depth(slot 条目靠 order 相对排序)\r\n // - 仅排除 position=fixed(它们属于 chatHistory 注入)\r\n const slotEntries = (activeEntries || [])\r\n .filter((e) => {\r\n if (isFixedWorldbookEntry(e)) return false;\r\n const mappedPos = positionMap[e.position] || e.position;\r\n return mappedPos === block.identifier;\r\n })\r\n .sort((a, b) => a.order - b.order);\r\n\r\n for (const entry of slotEntries) {\r\n result.push({\r\n tag: `Worldbook: ${entry.name}`,\r\n target: 'world_book',\r\n role: mapRole(entry.role),\r\n text: entry.content\r\n });\r\n }\r\n\r\n // 2) 主内容\r\n if (block.identifier === 'chatHistory') {\r\n let dialogueList: TaggedContent[] = (chatHistory || []).map((node) => ({\r\n tag: `History: ${node.role}`,\r\n // system 属于聊天历史的一部分:这里用 chat_history 目标以便 regex 可覆盖\r\n target: node.role === 'user' ? 'user' : node.role === 'model' ? 'model' : 'chat_history',\r\n role: node.role,\r\n text: node.text\r\n }));\r\n\r\n // 仅 fixed 才会注入到 chatHistory,此时才使用 depth\r\n // 约束:fixed 必须具备 depth + order(两者都必填);否则视为无效配置并忽略。\r\n const presetInjections = enabledBlocks.filter(\r\n (b): b is Extract<PromptBlock, { position: 'fixed' }> =>\r\n isFixedPromptBlock(b) &&\r\n typeof b.depth === 'number' &&\r\n Number.isFinite(b.depth) &&\r\n typeof b.order === 'number' &&\r\n Number.isFinite(b.order)\r\n );\r\n const worldbookInjections = (activeEntries || []).filter(\r\n (e): e is Extract<WorldbookEntry, { position: 'fixed' }> =>\r\n isFixedWorldbookEntry(e) &&\r\n typeof e.depth === 'number' &&\r\n Number.isFinite(e.depth) &&\r\n typeof e.order === 'number' &&\r\n Number.isFinite(e.order)\r\n );\r\n\r\n const allInjections = [\r\n ...presetInjections.map((b) => ({\r\n tag: `Preset: ${b.name}`,\r\n target: 'preset' as const,\r\n role: mapRole(b.role),\r\n text: b.content || '',\r\n depth: b.depth,\r\n order: b.order\r\n })),\r\n ...worldbookInjections.map((e) => ({\r\n tag: `Worldbook: ${e.name}`,\r\n target: 'world_book' as const,\r\n role: mapRole(e.role),\r\n text: e.content,\r\n depth: e.depth,\r\n order: e.order\r\n }))\r\n ].sort((a, b) => {\r\n if (a.depth !== b.depth) return a.depth - b.depth;\r\n return a.order - b.order;\r\n });\r\n\r\n for (const item of allInjections) {\r\n const targetIndex = Math.max(0, dialogueList.length - item.depth);\r\n dialogueList.splice(targetIndex, 0, {\r\n tag: item.tag,\r\n target: item.target,\r\n role: item.role,\r\n text: item.text\r\n });\r\n }\r\n\r\n result.push(...dialogueList);\r\n } else if (block.content) {\r\n result.push({\r\n tag: `Preset: ${block.name}`,\r\n target: 'preset',\r\n role: mapRole(block.role),\r\n text: block.content\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import type { PerItemStages, RegexRule, Target, View } from '../../types';\r\nimport type { VariableContext } from '../variables';\r\nimport { applyRegex } from '../regex';\r\nimport { replaceMacros } from '../macro';\r\n\r\nexport interface ProcessContentStagesParams {\r\n target: Target;\r\n view: View;\r\n rules: RegexRule[];\r\n macros: Record<string, string>;\r\n /** 变量上下文(可选),用于处理 getvar/setvar 等宏 */\r\n variableContext?: VariableContext;\r\n}\r\n\r\nexport function processContentStages(\r\n text: string,\r\n params: ProcessContentStagesParams\r\n): Pick<PerItemStages, 'raw' | 'afterPreRegex' | 'afterMacro' | 'afterPostRegex'> {\r\n const raw = text ?? '';\r\n\r\n const afterPreRegex = applyRegex(raw, {\r\n rules: params.rules,\r\n target: params.target,\r\n view: params.view,\r\n placement: 'before_macro'\r\n });\r\n\r\n // 宏替换(包含变量处理)\r\n const afterMacro = replaceMacros(afterPreRegex, {\r\n macros: params.macros,\r\n variableContext: params.variableContext\r\n });\r\n\r\n const afterPostRegex = applyRegex(afterMacro, {\r\n rules: params.rules,\r\n target: params.target,\r\n view: params.view,\r\n placement: 'after_macro'\r\n });\r\n\r\n return { raw, afterPreRegex, afterMacro, afterPostRegex };\r\n}\r\n","import type { PerItemStages, PromptStages, RegexRule, TaggedContent, View } from '../../types';\r\nimport type { VariableContext } from '../variables';\r\nimport { processContentStages } from './processContentStages';\r\n\r\nexport interface CompileTaggedStagesParams {\r\n view: View;\r\n rules: RegexRule[];\r\n macros: Record<string, string>;\r\n /** 变量上下文(可选) */\r\n variableContext?: VariableContext;\r\n}\r\n\r\nexport interface CompileTaggedStagesResult {\r\n stages: PromptStages<TaggedContent[]>;\r\n perItem: PerItemStages[];\r\n}\r\n\r\nexport function compileTaggedStages(\r\n tagged: TaggedContent[],\r\n params: CompileTaggedStagesParams\r\n): CompileTaggedStagesResult {\r\n const perItem: PerItemStages[] = [];\r\n\r\n const raw = (tagged || []).map((i) => ({ ...i }));\r\n const afterPreRegex: TaggedContent[] = [];\r\n const afterMacro: TaggedContent[] = [];\r\n const afterPostRegex: TaggedContent[] = [];\r\n\r\n for (const item of raw) {\r\n const s = processContentStages(item.text, {\r\n target: item.target,\r\n view: params.view,\r\n rules: params.rules,\r\n macros: params.macros,\r\n variableContext: params.variableContext\r\n });\r\n\r\n perItem.push({\r\n tag: item.tag,\r\n role: item.role,\r\n target: item.target,\r\n ...s\r\n });\r\n\r\n afterPreRegex.push({ ...item, text: s.afterPreRegex });\r\n afterMacro.push({ ...item, text: s.afterMacro });\r\n afterPostRegex.push({ ...item, text: s.afterPostRegex });\r\n }\r\n\r\n return {\r\n stages: { raw, afterPreRegex, afterMacro, afterPostRegex },\r\n perItem\r\n };\r\n}\r\n","import type { BuildPromptParams, BuildPromptResult, GeminiContent, TaggedContent } from '../../types';\r\nimport { convertMessagesIn, convertMessagesOut } from '../../convert';\r\nimport { isHistoryInput, normalizeHistoryFormat } from '../history';\r\nimport { normalizeRegexes, normalizeWorldbooks } from '../inputs';\r\nimport { getActiveEntries } from '../worldbook';\r\nimport { assembleTaggedPromptList } from '../assemble';\r\nimport { mergeRegexRules } from '../regex';\r\nimport { compileTaggedStages } from '../pipeline';\r\nimport { createVariableContext } from '../variables';\r\n\r\nfunction geminiContentsToChatHistory(\r\n contents: GeminiContent[]\r\n): Array<{ role: GeminiContent['role']; text: string }> {\r\n return (contents || []).map((m) => ({\r\n role: m.role,\r\n text: (m.parts || []).map((p) => p.text ?? '').join('')\r\n }));\r\n}\r\n\r\nfunction taggedToGemini(tagged: TaggedContent[]): GeminiContent[] {\r\n return (tagged || []).map((item) => ({\r\n role: item.role,\r\n parts: [{ text: item.text ?? '' }]\r\n }));\r\n}\r\n\r\nfunction applySystemRolePolicy(\r\n internal: GeminiContent[],\r\n policy: 'keep' | 'to_user'\r\n): GeminiContent[] {\r\n if (policy === 'keep') return internal;\r\n return (internal || []).map((m) => ({\r\n ...m,\r\n role: m.role === 'system' ? 'user' : m.role\r\n }));\r\n}\r\n\r\n/**\r\n * 从 character 和 persona 提取宏变量,并与用户提供的 macros 合并\r\n * 优先级:用户显式提供的 macros > character/persona 提取的\r\n */\r\nfunction buildMacros(\r\n userMacros: Record<string, string>,\r\n character?: BuildPromptParams['character'],\r\n persona?: BuildPromptParams['persona']\r\n): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n\r\n // 从 persona 提取 user 宏\r\n if (persona) {\r\n const userName = persona.persona_name || persona.name;\r\n if (userName) {\r\n result.user = userName;\r\n }\r\n }\r\n\r\n // 从 character 提取 char 宏\r\n if (character) {\r\n const charName = character.character_name || character.name;\r\n if (charName) {\r\n result.char = charName;\r\n }\r\n }\r\n\r\n // 用户显式提供的 macros 优先级最高,覆盖自动提取的\r\n return { ...result, ...userMacros };\r\n}\r\n\r\nexport function buildPrompt(params: BuildPromptParams): BuildPromptResult {\r\n const { \r\n preset, character, persona, globals, history, historyFormat, \r\n macros, variables, globalVariables, view, options \r\n } = params;\r\n\r\n // 构建宏变量:从 character/persona 自动提取 + 用户显式提供的\r\n const finalMacros = buildMacros(macros || {}, character, persona);\r\n\r\n // 创建变量上下文\r\n const variableContext = createVariableContext(variables, globalVariables);\r\n\r\n // 1) 统一 history 输入为“类 Gemini”\r\n const historyConv = (() => {\r\n if (isHistoryInput(history)) {\r\n if (history.format === 'text') {\r\n return convertMessagesIn(history.text, 'text');\r\n }\r\n if (history.format === 'auto') {\r\n return convertMessagesIn(history.input, 'auto');\r\n }\r\n return convertMessagesIn(history.messages as any, history.format);\r\n }\r\n\r\n // 兼容:直接传 MessageInput\r\n return convertMessagesIn(history as any, normalizeHistoryFormat(historyFormat));\r\n })();\r\n\r\n const detectedHistoryFormat = historyConv.detected;\r\n const internalHistory = historyConv.internal;\r\n\r\n const chatHistory = geminiContentsToChatHistory(internalHistory);\r\n\r\n const recentN = options?.recentHistoryForWorldbook ?? 5;\r\n const recentHistoryText = chatHistory\r\n .slice(-recentN)\r\n .map((n) => n.text)\r\n .join('\\n');\r\n\r\n const globalWorldbookEntries = normalizeWorldbooks(globals?.worldbooks);\r\n\r\n const activeEntries = getActiveEntries({\r\n contextText: recentHistoryText,\r\n globalEntries: globalWorldbookEntries,\r\n presetWorldbook: preset.world_book,\r\n characterWorldbook: character?.world_book\r\n });\r\n\r\n const tagged = assembleTaggedPromptList({\r\n presetBlocks: preset.prompts,\r\n activeEntries,\r\n chatHistory,\r\n positionMap: options?.positionMap\r\n });\r\n\r\n const globalRegexRules = normalizeRegexes(globals?.regexes);\r\n\r\n const rules = mergeRegexRules({\r\n globalRules: globalRegexRules,\r\n presetRules: preset.regex_rules,\r\n characterRules: character?.regex_rules\r\n });\r\n\r\n // 2) 编译各阶段(raw -> beforeRegex -> macro -> afterRegex)\r\n // 变量会在宏替换阶段线性处理\r\n const compiled = compileTaggedStages(tagged, { \r\n view, \r\n rules, \r\n macros: finalMacros,\r\n variableContext \r\n });\r\n\r\n const taggedStages = compiled.stages;\r\n const perItem = compiled.perItem;\r\n\r\n const internalStages = {\r\n raw: taggedToGemini(taggedStages.raw),\r\n afterPreRegex: taggedToGemini(taggedStages.afterPreRegex),\r\n afterMacro: taggedToGemini(taggedStages.afterMacro),\r\n afterPostRegex: taggedToGemini(taggedStages.afterPostRegex)\r\n };\r\n\r\n // 3) 计算 outputFormat(默认跟随输入格式;也可手动指定)\r\n const defaultOutputFormat = isHistoryInput(history)\r\n ? history.format === 'auto'\r\n ? detectedHistoryFormat\r\n : history.format\r\n : detectedHistoryFormat;\r\n\r\n const outputFormat = (params.outputFormat ?? defaultOutputFormat) as BuildPromptResult['outputFormat'];\r\n const systemRolePolicy = params.systemRolePolicy ?? 'keep';\r\n\r\n const outputStages =\r\n outputFormat === 'tagged'\r\n ? taggedStages\r\n : {\r\n raw: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.raw, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterPreRegex: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterPreRegex, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterMacro: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterMacro, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n ),\r\n afterPostRegex: convertMessagesOut(\r\n applySystemRolePolicy(internalStages.afterPostRegex, systemRolePolicy),\r\n outputFormat as Exclude<any, 'tagged'>\r\n )\r\n };\r\n\r\n return {\r\n detectedHistoryFormat,\r\n outputFormat,\r\n systemRolePolicy,\r\n activeWorldbookEntries: activeEntries,\r\n mergedRegexRules: rules,\r\n // 返回变量最终状态,便于调用方持久化\r\n variables: {\r\n local: { ...variableContext.local },\r\n global: { ...variableContext.global }\r\n },\r\n stages: {\r\n tagged: taggedStages,\r\n internal: internalStages,\r\n output: outputStages,\r\n perItem\r\n }\r\n };\r\n}\r\n","export * from './detect';\r\nexport * from './gemini';\r\nexport * from './openai';\r\nexport * from './simple';\r\nexport * from './tagged';\r\nexport * from './text';\r\n"]}