fast-tavern 0.1.0 → 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 +31 -6
- package/dist/index.cjs +172 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +124 -13
- package/dist/index.d.ts +124 -13
- package/dist/index.js +166 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,13 @@ fast-tavern 是一个**与框架无关**(不依赖 Vue/Pinia/浏览器 API)
|
|
|
17
17
|
- **预设 Prompt Blocks 组装**:relative blocks 作为骨架,fixed blocks 按 depth 插入到聊天历史中
|
|
18
18
|
- **世界书触发与注入**:支持 always / conditional;支持 `<<keywords:a,b>>`;支持正则 condition
|
|
19
19
|
- **正则规则管道**:`before_macro` → `macro` → `after_macro`,并支持按 `target` / `view` 过滤
|
|
20
|
-
- **宏替换**:`{{char}}`、`{{user}}`、`<<user>>` 以及任意 `{{key}}`
|
|
20
|
+
- **宏替换**:`{{char}}`、`{{user}}`、`<<user>>`、`<<char>>` 以及任意 `{{key}}` / `<<key>>`
|
|
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>>` - 设置全局变量
|
|
21
27
|
- **多渠道聊天格式输入/输出**:Gemini / OpenAI / Simple / Tagged / Text
|
|
22
28
|
- **输出多阶段结果**:raw、afterPreRegex、afterMacro、afterPostRegex(并提供逐条 perItem 明细)
|
|
23
29
|
|
|
@@ -28,6 +34,13 @@ fast-tavern 是一个**与框架无关**(不依赖 Vue/Pinia/浏览器 API)
|
|
|
28
34
|
- `keep`:保留 system
|
|
29
35
|
- `to_user`:将 system 降级为 user(保留内容,仅改变角色)
|
|
30
36
|
|
|
37
|
+
### 变量系统
|
|
38
|
+
|
|
39
|
+
变量在宏替换阶段按照提示词顺序线性执行:
|
|
40
|
+
|
|
41
|
+
- **局部变量**:每次 `buildPrompt` 调用独立,不跨调用持久化
|
|
42
|
+
- **全局变量**:由调用方维护,从返回结果 `result.variables.global` 获取变化后持久化
|
|
43
|
+
|
|
31
44
|
---
|
|
32
45
|
|
|
33
46
|
## 安装
|
|
@@ -61,7 +74,8 @@ import { buildPrompt, History } from 'fast-tavern';
|
|
|
61
74
|
|
|
62
75
|
const result = buildPrompt({
|
|
63
76
|
preset, // PresetConfig JSON
|
|
64
|
-
character, // CharacterCard JSON
|
|
77
|
+
character, // CharacterCard JSON(可选)- 自动提取 char 宏
|
|
78
|
+
persona, // PersonaCard JSON(可选)- 自动提取 user 宏
|
|
65
79
|
globals: {
|
|
66
80
|
// 支持一次性传入多个 JSON 文件:
|
|
67
81
|
// - worldbook.json({ name, entries })
|
|
@@ -84,8 +98,14 @@ const result = buildPrompt({
|
|
|
84
98
|
// 正则视图:user_view / model_view
|
|
85
99
|
view: 'model_view',
|
|
86
100
|
|
|
87
|
-
//
|
|
88
|
-
macros: {
|
|
101
|
+
// 宏变量(可选,会与 character/persona 自动提取的合并,显式传入的优先级更高)
|
|
102
|
+
macros: { custom_var: 'value' },
|
|
103
|
+
|
|
104
|
+
// 局部变量初始值(可选)
|
|
105
|
+
variables: { counter: '0', name: 'Alice' },
|
|
106
|
+
|
|
107
|
+
// 全局变量初始值(可选,建议由调用方维护状态)
|
|
108
|
+
globalVariables: { totalTurns: '10' },
|
|
89
109
|
|
|
90
110
|
// 输出格式:gemini/openai/simple/text/tagged
|
|
91
111
|
outputFormat: 'openai',
|
|
@@ -103,6 +123,10 @@ console.log(result.stages.tagged.afterPostRegex);
|
|
|
103
123
|
// 最终输出(按 outputFormat 转换)
|
|
104
124
|
console.log(result.stages.output.afterPostRegex);
|
|
105
125
|
|
|
126
|
+
// 获取变量最终状态(用于持久化)
|
|
127
|
+
console.log(result.variables.local); // 局部变量
|
|
128
|
+
console.log(result.variables.global); // 全局变量
|
|
129
|
+
|
|
106
130
|
// 更细粒度:逐条文本的阶段明细
|
|
107
131
|
console.table(result.stages.perItem);
|
|
108
132
|
```
|
|
@@ -118,11 +142,12 @@ console.table(result.stages.perItem);
|
|
|
118
142
|
关键入参(摘选):
|
|
119
143
|
|
|
120
144
|
- `preset: PresetConfig`:预设配置(prompts / regex_rules / world_book)
|
|
121
|
-
- `character?: CharacterCard`:角色卡(可内嵌 world_book / regex_rules
|
|
145
|
+
- `character?: CharacterCard`:角色卡(可内嵌 world_book / regex_rules,自动提取 char 宏)
|
|
146
|
+
- `persona?: PersonaCard`:用户人设卡(自动提取 user 宏)
|
|
122
147
|
- `globals?: { worldbooks?: ..., regexes?: ... }`:全局世界书/正则(全局正则推荐直接传 rules 数组)
|
|
123
148
|
- `history: HistoryInput | MessageInput`:聊天记录(多格式)
|
|
124
149
|
- `view: 'user_view' | 'model_view'`:正则视图
|
|
125
|
-
- `macros
|
|
150
|
+
- `macros?: Record<string,string>`:宏变量表(会与 character/persona 自动提取的合并)
|
|
126
151
|
- `outputFormat?: 'gemini'|'openai'|'simple'|'text'|'tagged'`:输出格式
|
|
127
152
|
- `systemRolePolicy?: 'keep'|'to_user'`:system 输出策略
|
|
128
153
|
- `options?: { recentHistoryForWorldbook?: number; positionMap?: Record<string,string> }`
|
package/dist/index.cjs
CHANGED
|
@@ -346,15 +346,128 @@ 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,
|
|
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;
|
|
353
|
-
if (
|
|
354
|
-
out = out
|
|
447
|
+
if (opts.variableContext) {
|
|
448
|
+
out = processVariableMacros(out, opts.variableContext);
|
|
355
449
|
}
|
|
450
|
+
out = out.replace(/<<\s*([a-zA-Z0-9_]+)\s*>>/g, (_m, key) => {
|
|
451
|
+
const lowerKey = key.toLowerCase();
|
|
452
|
+
if (Object.prototype.hasOwnProperty.call(macros, key)) {
|
|
453
|
+
return String(macros[key]);
|
|
454
|
+
}
|
|
455
|
+
if (Object.prototype.hasOwnProperty.call(macros, lowerKey)) {
|
|
456
|
+
return String(macros[lowerKey]);
|
|
457
|
+
}
|
|
458
|
+
return _m;
|
|
459
|
+
});
|
|
356
460
|
out = out.replace(/\{\{\s*([a-zA-Z0-9_]+)\s*\}\}/g, (_m, key) => {
|
|
357
|
-
|
|
461
|
+
const lowerKey = key.toLowerCase();
|
|
462
|
+
if (["getvar", "setvar", "getglobalvar", "setglobalvar"].includes(lowerKey)) {
|
|
463
|
+
return _m;
|
|
464
|
+
}
|
|
465
|
+
if (Object.prototype.hasOwnProperty.call(macros, key)) {
|
|
466
|
+
return String(macros[key]);
|
|
467
|
+
}
|
|
468
|
+
if (Object.prototype.hasOwnProperty.call(macros, lowerKey)) {
|
|
469
|
+
return String(macros[lowerKey]);
|
|
470
|
+
}
|
|
358
471
|
return _m;
|
|
359
472
|
});
|
|
360
473
|
return out;
|
|
@@ -460,7 +573,10 @@ function processContentStages(text, params) {
|
|
|
460
573
|
view: params.view,
|
|
461
574
|
placement: "before_macro"
|
|
462
575
|
});
|
|
463
|
-
const afterMacro = replaceMacros(afterPreRegex,
|
|
576
|
+
const afterMacro = replaceMacros(afterPreRegex, {
|
|
577
|
+
macros: params.macros,
|
|
578
|
+
variableContext: params.variableContext
|
|
579
|
+
});
|
|
464
580
|
const afterPostRegex = applyRegex(afterMacro, {
|
|
465
581
|
rules: params.rules,
|
|
466
582
|
target: params.target,
|
|
@@ -482,7 +598,8 @@ function compileTaggedStages(tagged, params) {
|
|
|
482
598
|
target: item.target,
|
|
483
599
|
view: params.view,
|
|
484
600
|
rules: params.rules,
|
|
485
|
-
macros: params.macros
|
|
601
|
+
macros: params.macros,
|
|
602
|
+
variableContext: params.variableContext
|
|
486
603
|
});
|
|
487
604
|
perItem.push({
|
|
488
605
|
tag: item.tag,
|
|
@@ -520,8 +637,38 @@ function applySystemRolePolicy(internal, policy) {
|
|
|
520
637
|
role: m.role === "system" ? "user" : m.role
|
|
521
638
|
}));
|
|
522
639
|
}
|
|
640
|
+
function buildMacros(userMacros, character, persona) {
|
|
641
|
+
const result = {};
|
|
642
|
+
if (persona) {
|
|
643
|
+
const userName = persona.persona_name || persona.name;
|
|
644
|
+
if (userName) {
|
|
645
|
+
result.user = userName;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
if (character) {
|
|
649
|
+
const charName = character.character_name || character.name;
|
|
650
|
+
if (charName) {
|
|
651
|
+
result.char = charName;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
return { ...result, ...userMacros };
|
|
655
|
+
}
|
|
523
656
|
function buildPrompt(params) {
|
|
524
|
-
const {
|
|
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;
|
|
670
|
+
const finalMacros = buildMacros(macros || {}, character, persona);
|
|
671
|
+
const variableContext = createVariableContext(variables, globalVariables);
|
|
525
672
|
const historyConv = (() => {
|
|
526
673
|
if (isHistoryInput(history)) {
|
|
527
674
|
if (history.format === "text") {
|
|
@@ -558,7 +705,12 @@ function buildPrompt(params) {
|
|
|
558
705
|
presetRules: preset.regex_rules,
|
|
559
706
|
characterRules: character?.regex_rules
|
|
560
707
|
});
|
|
561
|
-
const compiled = compileTaggedStages(tagged, {
|
|
708
|
+
const compiled = compileTaggedStages(tagged, {
|
|
709
|
+
view,
|
|
710
|
+
rules,
|
|
711
|
+
macros: finalMacros,
|
|
712
|
+
variableContext
|
|
713
|
+
});
|
|
562
714
|
const taggedStages = compiled.stages;
|
|
563
715
|
const perItem = compiled.perItem;
|
|
564
716
|
const internalStages = {
|
|
@@ -594,6 +746,11 @@ function buildPrompt(params) {
|
|
|
594
746
|
systemRolePolicy,
|
|
595
747
|
activeWorldbookEntries: activeEntries,
|
|
596
748
|
mergedRegexRules: rules,
|
|
749
|
+
// 返回变量最终状态,便于调用方持久化
|
|
750
|
+
variables: {
|
|
751
|
+
local: { ...variableContext.local },
|
|
752
|
+
global: { ...variableContext.global }
|
|
753
|
+
},
|
|
597
754
|
stages: {
|
|
598
755
|
tagged: taggedStages,
|
|
599
756
|
internal: internalStages,
|
|
@@ -632,8 +789,12 @@ exports.buildPrompt = buildPrompt;
|
|
|
632
789
|
exports.compileTaggedStages = compileTaggedStages;
|
|
633
790
|
exports.convertMessagesIn = convertMessagesIn;
|
|
634
791
|
exports.convertMessagesOut = convertMessagesOut;
|
|
792
|
+
exports.createVariableContext = createVariableContext;
|
|
635
793
|
exports.detectMessageFormat = detectMessageFormat;
|
|
636
794
|
exports.getActiveEntries = getActiveEntries;
|
|
795
|
+
exports.getGlobalVar = getGlobalVar;
|
|
796
|
+
exports.getVar = getVar;
|
|
797
|
+
exports.getVariableChanges = getVariableChanges;
|
|
637
798
|
exports.isHistoryInput = isHistoryInput;
|
|
638
799
|
exports.isTextInput = isTextInput;
|
|
639
800
|
exports.mergeRegexRules = mergeRegexRules;
|
|
@@ -641,7 +802,10 @@ exports.normalizeHistoryFormat = normalizeHistoryFormat;
|
|
|
641
802
|
exports.normalizeRegexes = normalizeRegexes;
|
|
642
803
|
exports.normalizeWorldbooks = normalizeWorldbooks;
|
|
643
804
|
exports.processContentStages = processContentStages;
|
|
805
|
+
exports.processVariableMacros = processVariableMacros;
|
|
644
806
|
exports.replaceMacros = replaceMacros;
|
|
807
|
+
exports.setGlobalVar = setGlobalVar;
|
|
808
|
+
exports.setVar = setVar;
|
|
645
809
|
exports.testCondition = testCondition;
|
|
646
810
|
//# sourceMappingURL=index.cjs.map
|
|
647
811
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;AAEO,SAAS,iBAAiB,CAAA,EAAkC;AACjE,EAAA,OACE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IACf,CAAA,CAAE,KAAA;AAAA,IACA,CAAC,CAAA,KACC,OAAO,CAAA,KAAM,YACb,CAAA,KAAM,IAAA,IACN,MAAA,IAAU,CAAA,IACV,OAAA,IAAW,CAAA,IACX,KAAA,CAAM,OAAA,CAAS,EAAU,KAAK;AAAA,GAClC;AAEJ;AAEO,SAAS,qBAAqB,KAAA,EAAyC;AAC5E,EAAA,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC/B,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAA,EAAA,CAAQ,CAAA,CAAE,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,IAAG,CAAE;AAAA,GAC5D,CAAE,CAAA;AACJ;AAEO,SAAS,qBAAqB,QAAA,EAA4C;AAC/E,EAAA,OAAO,QAAA;AACT;;;ACvBO,SAAS,iBAAiB,CAAA,EAAkC;AACjE,EAAA,OACE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IACf,CAAA,CAAE,KAAA;AAAA,IACA,CAAC,CAAA,KACC,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,IAAA,IACN,MAAA,IAAU,CAAA,IACV,SAAA,IAAa,CAAA,IACb,OAAQ,EAAU,OAAA,KAAY;AAAA,GAClC;AAEJ;AAMO,SAAS,qBAAqB,KAAA,EAAyC;AAC5E,EAAA,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC/B,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,WAAA,GAAc,UAAU,CAAA,CAAE,IAAA;AAAA,IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA,CAAE,OAAA,IAAW,IAAI;AAAA,GACnC,CAAE,CAAA;AACJ;AAEO,SAAS,qBAAqB,QAAA,EAA4C;AAC/E,EAAA,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAClC,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,OAAA,GAAU,cAAc,CAAA,CAAE,IAAA;AAAA,IAC3C,OAAA,EAAA,CAAU,CAAA,CAAE,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,EAAE;AAAA,GAC3D,CAAE,CAAA;AACJ;;;AC9BO,SAAS,iBAAiB,CAAA,EAAkC;AACjE,EAAA,OACE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IACf,CAAA,CAAE,KAAA;AAAA,IACA,CAAC,CAAA,KACC,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,IAAA,IACN,MAAA,IAAU,CAAA,IACV,MAAA,IAAU,CAAA,IACV,OAAQ,EAAU,IAAA,KAAS;AAAA,GAC/B;AAEJ;AAKO,SAAS,qBAAqB,KAAA,EAAyC;AAC5E,EAAA,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC/B,IAAA,EAAM,EAAE,IAAA,KAAS,WAAA,IAAe,EAAE,IAAA,KAAS,OAAA,GAAU,UAAU,CAAA,CAAE,IAAA;AAAA,IACjE,OAAO,CAAC,EAAE,MAAM,CAAA,CAAE,IAAA,IAAQ,IAAI;AAAA,GAChC,CAAE,CAAA;AACJ;AAEO,SAAS,qBAAqB,QAAA,EAA4C;AAC/E,EAAA,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAClC,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAA,EAAA,CAAO,CAAA,CAAE,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,EAAE;AAAA,GACxD,CAAE,CAAA;AACJ;;;AC7BO,SAAS,iBAAiB,CAAA,EAAkC;AACjE,EAAA,OACE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IACf,CAAA,CAAE,KAAA;AAAA,IACA,CAAC,CAAA,KACC,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,IAAA,IACN,KAAA,IAAS,CAAA,IACT,QAAA,IAAY,CAAA,IACZ,MAAA,IAAU;AAAA,GACd;AAEJ;AAEO,SAAS,qBAAqB,KAAA,EAAyC;AAC5E,EAAA,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC/B,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAO,CAAC,EAAE,MAAM,CAAA,CAAE,IAAA,IAAQ,IAAI;AAAA,GAChC,CAAE,CAAA;AACJ;AAOO,SAAS,qBAAqB,SAAA,EAA6C;AAChF,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;;;AC9BO,SAAS,YAAY,CAAA,EAAoC;AAC9D,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,MAAM,QAAQ,CAAA;AAC3F;AAEO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAK,KAAA,IAAS,EAAA;AACjE,EAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA;AAC7C;AAEO,SAAS,mBAAmB,QAAA,EAAmC;AACpE,EAAA,OAAA,CAAQ,QAAA,IAAY,EAAC,EAClB,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,EAAE,CAAA,CAAE,KAAK,EAAE,CAAC,CAAA,CAC5D,IAAA,CAAK,IAAI,CAAA;AACd;;;ACRO,SAAS,oBAAoB,KAAA,EAAqD;AACvF,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG,OAAO,MAAA;AAC/B,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG,OAAO,QAAA;AACpC,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG,OAAO,QAAA;AACpC,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG,OAAO,QAAA;AACpC,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG,OAAO,QAAA;AACpC,EAAA,OAAO,QAAA;AACT;;;ACEO,SAAS,iBAAA,CACd,KAAA,EACA,MAAA,GAAwB,MAAA,EACiD;AACzE,EAAA,MAAM,QAAA,GAAY,MAAA,KAAW,MAAA,GACzB,mBAAA,CAAoB,KAAK,CAAA,GACxB,MAAA;AAEL,EAAA,IAAI,aAAa,MAAA,EAAQ;AAEvB,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,kBAAA,CAAmB,KAAY,CAAA,EAAE;AAAA,EAChE;AAEA,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,oBAAA,CAAqB,KAAY,CAAA,EAAE;AAAA,EAClE;AAEA,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,oBAAA,CAAqB,KAAY,CAAA,EAAE;AAAA,EAClE;AAEA,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,oBAAA,CAAqB,KAAY,CAAA,EAAE;AAAA,EAClE;AAGA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,oBAAA,CAAqB,KAAY,CAAA,EAAE;AAClE;AAEO,SAAS,kBAAA,CACd,UACA,MAAA,EAC8D;AAC9D,EAAA,IAAI,MAAA,KAAW,QAAA,EAAU,OAAO,oBAAA,CAAqB,QAAQ,CAAA;AAC7D,EAAA,IAAI,MAAA,KAAW,QAAA,EAAU,OAAO,oBAAA,CAAqB,QAAQ,CAAA;AAC7D,EAAA,IAAI,MAAA,KAAW,QAAA,EAAU,OAAO,oBAAA,CAAqB,QAAQ,CAAA;AAC7D,EAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,kBAAA,CAAmB,QAAQ,CAAA;AAGzD,EAAA,OAAO,QAAA;AACT;;;ACnDO,IAAM,OAAA,GAAU;AAAA,EACrB,MAAA,EAAQ,CAAC,QAAA,MAAqF;AAAA,IAC5F,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,GACF,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,QAAA,MAAqF;AAAA,IAC5F,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,GACF,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,QAAA,MAAqF;AAAA,IAC5F,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,GACF,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,QAAA,MAAqF;AAAA,IAC5F,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,GACF,CAAA;AAAA,EAEA,IAAA,EAAM,CAAC,IAAA,MAA2E;AAAA,IAChF,MAAA,EAAQ,MAAA;AAAA,IACR;AAAA,GACF,CAAA;AAAA,EAEA,IAAA,EAAM,CAAC,KAAA,MAAuC;AAAA,IAC5C,MAAA,EAAQ,MAAA;AAAA,IACR;AAAA,GACF;AACF;;;ACjCO,SAAS,eAAe,CAAA,EAA+B;AAC5D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,QAAA,IAAY,CAAA,IAAK,OAAQ,CAAA,CAAU,MAAA,KAAW,QAAA;AAC9F;AAMO,SAAS,uBAAuB,MAAA,EAAuC;AAC5E,EAAA,OAAO,MAAA,IAAU,MAAA;AACnB;;;ACZO,SAAS,aAAA,CAAc,WAA+B,IAAA,EAAuB;AAClF,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,IAAA,EAAK,KAAM,IAAI,OAAO,IAAA;AAElD,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,KAAA,CAAM,oBAAoB,CAAA;AACpD,EAAA,IAAI,OAAA,GAAU,CAAC,CAAA,EAAG;AAChB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAC1D,IAAA,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,KAAK,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,SAAA,EAAW,GAAG,CAAA;AACvC,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,EAChC;AACF;;;ACbA,SAAS,iBAAiB,CAAA,EAA8B;AACtD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAE,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,gBAAiB,CAAS,CAAA;AAC7G;AAWO,SAAS,iBAAiB,KAAA,EAAmC;AAClE,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAIpB,EAAA,MAAM,QAAe,EAAC;AAEtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAExB,IAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AAEA,EAAA,MAAM,MAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAC1B,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,IAAQ,gBAAiB,IAAA,EAAc;AAC9E,MAAA,GAAA,CAAI,KAAK,IAAiB,CAAA;AAC1B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,IAAA,KAAS,QAAQ,KAAA,CAAM,OAAA,CAAS,IAAA,CAAa,WAAW,CAAA,EAAG;AACzF,MAAA,GAAA,CAAI,IAAA,CAAK,GAAK,IAAA,CAAa,WAA2B,CAAA;AACtD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,IAAA,KAAS,QAAQ,KAAA,CAAM,OAAA,CAAS,IAAA,CAAa,KAAK,CAAA,EAAG;AACnF,MAAA,GAAA,CAAI,IAAA,CAAK,GAAK,IAAA,CAAa,KAAqB,CAAA;AAChD,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;;;ACxDA,SAAS,sBAAsB,CAAA,EAAwC;AACrE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAE,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,aAAc,CAAS,CAAA;AAC1G;AAEA,SAAS,aAAa,IAAA,EAAwC;AAC5D,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAkC;AACxD,IAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,UAAU,OAAO,IAAA;AAExC,IAAA,MAAM,WAAY,CAAA,CAAU,QAAA;AAC5B,IAAA,IAAI,aAAa,aAAA,IAAiB,QAAA,KAAa,YAAA,IAAgB,QAAA,KAAa,SAAS,OAAO,IAAA;AAE5F,IAAA,MAAM,IAAA,GAAc,EAAU,IAAA,IAAQ,MAAA;AAGtC,IAAA,MAAM,WAAY,CAAA,CAAU,KAAA;AAC5B,IAAA,MAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,GAAI,GAAA;AAC7D,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,OAAO,IAAA;AAEpC,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,MAAM,WAAY,CAAA,CAAU,KAAA;AAC5B,MAAA,MAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,GAAI,GAAA;AAC7D,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,OAAO,IAAA;AAEpC,MAAA,OAAO;AAAA,QACL,GAAI,CAAA;AAAA,QACJ,IAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,GAAI,CAAA;AAAA,MACJ,IAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,KAAqC;AAC7D,IAAA,OAAA,CAAQ,OAAA,IAAW,EAAC,EACjB,GAAA,CAAI,cAAc,CAAA,CAClB,MAAA,CAAO,CAAC,CAAA,KAA2B,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EAClD,CAAA;AAGA,EAAA,IAAI,qBAAA,CAAsB,IAAI,CAAA,EAAG,OAAO,iBAAiB,IAAW,CAAA;AAGpE,EAAA,IAAI,OAAO,SAAS,QAAA,IAAY,IAAA,KAAS,QAAQ,KAAA,CAAM,OAAA,CAAS,IAAA,CAAa,OAAO,CAAA,EAAG;AAErF,IAAA,IAAK,IAAA,CAAa,OAAA,KAAY,KAAA,EAAO,OAAO,EAAC;AAC7C,IAAA,OAAO,gBAAA,CAAkB,KAAa,OAAO,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,EAAC;AACV;AASO,SAAS,oBAAoB,KAAA,EAA2C;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAOpB,EAAA,MAAM,QAA0B,EAAC;AAEjC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAExB,IAAA,IAAI,qBAAA,CAAsB,KAAK,CAAA,EAAG;AAChC,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,GAAI,KAA0B,CAAA;AAAA,IAC3C;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AAEA,EAAA,MAAM,MAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,GAAA;AACT;;;ACnGO,SAAS,iBAAiB,MAAA,EAMZ;AACnB,EAAA,MAAM,EAAE,cAAc,EAAA,EAAI,aAAA,GAAgB,EAAC,EAAG,eAAA,EAAiB,oBAAmB,GAAI,MAAA;AAEtF,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAsB;AACzC,IAAA,IAAI,CAAA,CAAE,OAAA,KAAY,KAAA,EAAO,OAAO,KAAA;AAChC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AAChC,IAAA,IAAI,EAAE,IAAA,KAAS,aAAA,SAAsB,aAAA,CAAc,CAAA,CAAE,WAAW,WAAW,CAAA;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAAuD,EAAC;AAG9D,EAAA,CAAC,aAAA,IAAiB,EAAC,EAAG,MAAA,CAAO,WAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC5D,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,SAAS,CAAA,OAAA,EAAU,GAAG,IAAI,CAAA;AAAA,EACjD,CAAC,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,oBAAoB,eAAe,CAAA;AACzD,EAAA,aAAA,CAAc,MAAA,CAAO,WAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC/C,IAAA,OAAA,CAAQ,KAAK,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,UAAU,CAAA;AAAA,EAC1C,CAAC,CAAA;AAGD,EAAA,MAAM,gBAAA,GAAmB,oBAAoB,kBAAkB,CAAA;AAC/D,EAAA,gBAAA,CAAiB,MAAA,CAAO,WAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM;AAClD,IAAA,OAAA,CAAQ,KAAK,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,aAAa,CAAA;AAAA,EAC7C,CAAC,CAAA;AAGD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,IAAA,IAAI,EAAE,KAAA,KAAU,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAE5C,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAgB;AAC/B,MAAA,IAAI,GAAA,KAAQ,aAAa,OAAO,CAAA;AAChC,MAAA,IAAI,GAAA,KAAQ,UAAU,OAAO,CAAA;AAC7B,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,QAAQ,CAAA,CAAE,OAAO,CAAA,GAAI,OAAA,CAAQ,EAAE,OAAO,CAAA;AAAA,EAC/C,CAAC,CAAA;AACH;;;AC9CO,SAAS,UAAA,CACd,MACA,MAAA,EAMQ;AACR,EAAA,IAAI,SAAS,IAAA,IAAQ,EAAA;AACrB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,WAAU,GAAI,MAAA;AAE3C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AACpB,IAAA,IAAI,EAAE,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,QAAA,CAAS,IAAI,CAAA,EAAG;AACxC,IAAA,IAAI,SAAA,IAAa,IAAA,CAAK,SAAA,KAAc,SAAA,EAAW;AAE/C,IAAA,MAAM,YAAA,GACJ,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,cAAA,GAC7B,CAAC,OAAA,EAAS,cAAA,EAAgB,oBAAoB,CAAA,GAC9C,CAAC,MAAM,CAAA;AAEb,IAAA,MAAM,OAAA,GAAA,CACH,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,YAAA,CAAa,QAAA,CAAS,CAAC,CAAC,CAAA,IACxD,MAAA,KAAW,OAAA,IAAA,CAAY,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG,QAAA,CAAS,cAAc,CAAA,IAClE,MAAA,KAAW,MAAA,IAAA,CAAW,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG,SAAS,cAAc,CAAA;AAEpE,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,IAAA,CAAK,YAAY,GAAG,CAAA;AAC1C,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,EAAA,EAAI,IAAA,CAAK,aAAa,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AAEN,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1CA,SAAS,cAAc,CAAA,EAAqC;AAC1D,EAAA,OAAO,CAAA,KAAM,mBAAmB,YAAA,GAAe,CAAA;AACjD;AAEO,SAAS,gBAAgB,MAAA,EAShB;AACd,EAAA,MAAM,MAAmB,EAAC;AAG1B,EAAA,GAAA,CAAI,IAAA,CAAK,GAAI,MAAA,CAAO,WAAA,IAAe,EAAG,CAAA;AAGtC,EAAA,GAAA,CAAI,IAAA,CAAK,GAAI,MAAA,CAAO,WAAA,IAAe,EAAG,CAAA;AACtC,EAAA,GAAA,CAAI,IAAA,CAAK,GAAI,MAAA,CAAO,cAAA,IAAkB,EAAG,CAAA;AAEzC,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACrB,GAAG,CAAA;AAAA,IACH,QAAQ,CAAA,CAAE,KAAA,IAAS,EAAC,EAAG,IAAI,aAAa;AAAA,GAC1C,CAAE,CAAA;AACJ;;;ACxBO,SAAS,aAAA,CAAc,MAAc,MAAA,EAAwC;AAClF,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAElB,EAAA,IAAI,GAAA,GAAM,IAAA;AAGV,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACpD;AAGA,EAAA,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,gCAAA,EAAkC,CAAC,IAAI,GAAA,KAAgB;AACvE,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAA,EAAG,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAChF,IAAA,OAAO,EAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT;;;ACpBA,SAAS,QAAQ,IAAA,EAAkB;AAEjC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,mBAAmB,CAAA,EAAkE;AAC5F,EAAA,OAAO,EAAE,QAAA,KAAa,OAAA;AACxB;AAEA,SAAS,sBACP,CAAA,EACqD;AACrD,EAAA,OAAO,EAAE,QAAA,KAAa,OAAA;AACxB;AAEO,SAAS,yBAAyB,MAAA,EAMrB;AAClB,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA,GAAc,EAAE,WAAA,EAAa,YAAA,EAAc,YAAY,WAAA;AAAY,GACrE,GAAI,MAAA;AAEJ,EAAA,MAAM,SAA0B,EAAC;AAEjC,EAAA,MAAM,aAAA,GAAA,CAAiB,gBAAgB,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,KAAK,CAAA;AAG5E,EAAA,MAAM,iBAAiB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,UAAU,CAAA;AAE5E,EAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAMlC,IAAA,MAAM,eAAe,aAAA,IAAiB,EAAC,EACpC,MAAA,CAAO,CAAC,CAAA,KAAM;AACb,MAAA,IAAI,qBAAA,CAAsB,CAAC,CAAA,EAAG,OAAO,KAAA;AACrC,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAA,CAAE,QAAQ,KAAK,CAAA,CAAE,QAAA;AAC/C,MAAA,OAAO,cAAc,KAAA,CAAM,UAAA;AAAA,IAC7B,CAAC,EACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAEnC,IAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAA,EAAK,CAAA,WAAA,EAAc,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,QAC7B,MAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,QACxB,MAAM,KAAA,CAAM;AAAA,OACb,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,KAAA,CAAM,eAAe,aAAA,EAAe;AACtC,MAAA,IAAI,gBAAiC,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACrE,GAAA,EAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA;AAAA,QAE1B,MAAA,EAAQ,KAAK,IAAA,KAAS,MAAA,GAAS,SAAS,IAAA,CAAK,IAAA,KAAS,UAAU,OAAA,GAAU,cAAA;AAAA,QAC1E,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK;AAAA,OACb,CAAE,CAAA;AAIF,MAAA,MAAM,mBAAmB,aAAA,CAAc,MAAA;AAAA,QACrC,CAAC,MACC,kBAAA,CAAmB,CAAC,KACpB,OAAO,CAAA,CAAE,UAAU,QAAA,IACnB,MAAA,CAAO,SAAS,CAAA,CAAE,KAAK,KACvB,OAAO,CAAA,CAAE,UAAU,QAAA,IACnB,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,KAAK;AAAA,OAC3B;AACA,MAAA,MAAM,mBAAA,GAAA,CAAuB,aAAA,IAAiB,EAAC,EAAG,MAAA;AAAA,QAChD,CAAC,MACC,qBAAA,CAAsB,CAAC,KACvB,OAAO,CAAA,CAAE,UAAU,QAAA,IACnB,MAAA,CAAO,SAAS,CAAA,CAAE,KAAK,KACvB,OAAO,CAAA,CAAE,UAAU,QAAA,IACnB,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,KAAK;AAAA,OAC3B;AAEA,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,GAAG,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9B,GAAA,EAAK,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,UACtB,MAAA,EAAQ,QAAA;AAAA,UACR,IAAA,EAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAAA,UACpB,IAAA,EAAM,EAAE,OAAA,IAAW,EAAA;AAAA,UACnB,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,OAAO,CAAA,CAAE;AAAA,SACX,CAAE,CAAA;AAAA,QACF,GAAG,mBAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACjC,GAAA,EAAK,CAAA,WAAA,EAAc,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,UACzB,MAAA,EAAQ,YAAA;AAAA,UACR,IAAA,EAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAAA,UACpB,MAAM,CAAA,CAAE,OAAA;AAAA,UACR,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,OAAO,CAAA,CAAE;AAAA,SACX,CAAE;AAAA,OACJ,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACf,QAAA,IAAI,EAAE,KAAA,KAAU,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAC5C,QAAA,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAAA,MACrB,CAAC,CAAA;AAED,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,QAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,CAAa,MAAA,GAAS,KAAK,KAAK,CAAA;AAChE,QAAA,YAAA,CAAa,MAAA,CAAO,aAAa,CAAA,EAAG;AAAA,UAClC,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,MAAM,IAAA,CAAK;AAAA,SACZ,CAAA;AAAA,MACH;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,MAAM,OAAA,EAAS;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAA,EAAK,CAAA,QAAA,EAAW,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,QAC1B,MAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,QACxB,MAAM,KAAA,CAAM;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AClIO,SAAS,oBAAA,CACd,MACA,MAAA,EAMgF;AAChF,EAAA,MAAM,MAAM,IAAA,IAAQ,EAAA;AAEpB,EAAA,MAAM,aAAA,GAAgB,WAAW,GAAA,EAAK;AAAA,IACpC,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,aAAA,EAAe,MAAA,CAAO,MAAM,CAAA;AAE7D,EAAA,MAAM,cAAA,GAAiB,WAAW,UAAA,EAAY;AAAA,IAC5C,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,OAAO,EAAE,GAAA,EAAK,aAAA,EAAe,UAAA,EAAY,cAAA,EAAe;AAC1D;;;AC7BO,SAAS,mBAAA,CACd,QACA,MAAA,EACqE;AACrE,EAAA,MAAM,UAA2B,EAAC;AAElC,EAAA,MAAM,GAAA,GAAA,CAAO,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA;AAChD,EAAA,MAAM,gBAAiC,EAAC;AACxC,EAAA,MAAM,aAA8B,EAAC;AACrC,EAAA,MAAM,iBAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,IAAA,CAAK,IAAA,EAAM;AAAA,MACxC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAED,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,aAAA,CAAc,KAAK,EAAE,GAAG,MAAM,IAAA,EAAM,CAAA,CAAE,eAAe,CAAA;AACrD,IAAA,UAAA,CAAW,KAAK,EAAE,GAAG,MAAM,IAAA,EAAM,CAAA,CAAE,YAAY,CAAA;AAC/C,IAAA,cAAA,CAAe,KAAK,EAAE,GAAG,MAAM,IAAA,EAAM,CAAA,CAAE,gBAAgB,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAE,GAAA,EAAK,aAAA,EAAe,YAAY,cAAA,EAAe;AAAA,IACzD;AAAA,GACF;AACF;;;AC7BA,SAAS,4BACP,QAAA,EACsD;AACtD,EAAA,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAClC,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAA,EAAA,CAAO,CAAA,CAAE,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,EAAE;AAAA,GACxD,CAAE,CAAA;AACJ;AAEA,SAAS,eAAe,MAAA,EAA0C;AAChE,EAAA,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IACnC,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAO,CAAC,EAAE,MAAM,IAAA,CAAK,IAAA,IAAQ,IAAI;AAAA,GACnC,CAAE,CAAA;AACJ;AAEA,SAAS,qBAAA,CACP,UACA,MAAA,EACiB;AACjB,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,QAAA;AAC9B,EAAA,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAClC,GAAG,CAAA;AAAA,IACH,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,SAAS,CAAA,CAAE;AAAA,GACzC,CAAE,CAAA;AACJ;AAEO,SAAS,YAAY,MAAA,EAA8C;AACxE,EAAA,MAAM,EAAE,QAAQ,SAAA,EAAW,OAAA,EAAS,SAAS,aAAA,EAAe,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA;AAGtF,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3B,MAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,QAAA,OAAO,iBAAA,CAAkB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,QAAA,OAAO,iBAAA,CAAkB,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,MAChD;AACA,MAAA,OAAO,iBAAA,CAAkB,OAAA,CAAQ,QAAA,EAAiB,OAAA,CAAQ,MAAM,CAAA;AAAA,IAClE;AAGA,IAAA,OAAO,iBAAA,CAAkB,OAAA,EAAgB,sBAAA,CAAuB,aAAa,CAAC,CAAA;AAAA,EAChF,CAAA,GAAG;AAEH,EAAA,MAAM,wBAAwB,WAAA,CAAY,QAAA;AAC1C,EAAA,MAAM,kBAAkB,WAAA,CAAY,QAAA;AAEpC,EAAA,MAAM,WAAA,GAAc,4BAA4B,eAAe,CAAA;AAE/D,EAAA,MAAM,OAAA,GAAU,SAAS,yBAAA,IAA6B,CAAA;AACtD,EAAA,MAAM,iBAAA,GAAoB,WAAA,CACvB,KAAA,CAAM,CAAC,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,KAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,sBAAA,GAAyB,mBAAA,CAAoB,OAAA,EAAS,UAAU,CAAA;AAEtE,EAAA,MAAM,gBAAgB,gBAAA,CAAiB;AAAA,IACrC,WAAA,EAAa,iBAAA;AAAA,IACb,aAAA,EAAe,sBAAA;AAAA,IACf,iBAAiB,MAAA,CAAO,UAAA;AAAA,IACxB,oBAAoB,SAAA,EAAW;AAAA,GAChC,CAAA;AAED,EAAA,MAAM,SAAS,wBAAA,CAAyB;AAAA,IACtC,cAAc,MAAA,CAAO,OAAA;AAAA,IACrB,aAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAa,OAAA,EAAS;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA;AAE1D,EAAA,MAAM,QAAQ,eAAA,CAAgB;AAAA,IAC5B,WAAA,EAAa,gBAAA;AAAA,IACb,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,gBAAgB,SAAA,EAAW;AAAA,GAC5B,CAAA;AAGD,EAAA,MAAM,WAAW,mBAAA,CAAoB,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AAEpE,EAAA,MAAM,eAAe,QAAA,CAAS,MAAA;AAC9B,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,GAAA,EAAK,cAAA,CAAe,YAAA,CAAa,GAAG,CAAA;AAAA,IACpC,aAAA,EAAe,cAAA,CAAe,YAAA,CAAa,aAAa,CAAA;AAAA,IACxD,UAAA,EAAY,cAAA,CAAe,YAAA,CAAa,UAAU,CAAA;AAAA,IAClD,cAAA,EAAgB,cAAA,CAAe,YAAA,CAAa,cAAc;AAAA,GAC5D;AAGA,EAAA,MAAM,mBAAA,GAAsB,eAAe,OAAO,CAAA,GAC9C,QAAQ,MAAA,KAAW,MAAA,GACjB,qBAAA,GACA,OAAA,CAAQ,MAAA,GACV,qBAAA;AAEJ,EAAA,MAAM,YAAA,GAAgB,OAAO,YAAA,IAAgB,mBAAA;AAC7C,EAAA,MAAM,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,MAAA;AAEpD,EAAA,MAAM,YAAA,GACJ,YAAA,KAAiB,QAAA,GACb,YAAA,GACA;AAAA,IACE,GAAA,EAAK,kBAAA;AAAA,MACH,qBAAA,CAAsB,cAAA,CAAe,GAAA,EAAK,gBAAgB,CAAA;AAAA,MAC1D;AAAA,KACF;AAAA,IACA,aAAA,EAAe,kBAAA;AAAA,MACb,qBAAA,CAAsB,cAAA,CAAe,aAAA,EAAe,gBAAgB,CAAA;AAAA,MACpE;AAAA,KACF;AAAA,IACA,UAAA,EAAY,kBAAA;AAAA,MACV,qBAAA,CAAsB,cAAA,CAAe,UAAA,EAAY,gBAAgB,CAAA;AAAA,MACjE;AAAA,KACF;AAAA,IACA,cAAA,EAAgB,kBAAA;AAAA,MACd,qBAAA,CAAsB,cAAA,CAAe,cAAA,EAAgB,gBAAgB,CAAA;AAAA,MACrE;AAAA;AACF,GACF;AAEN,EAAA,OAAO;AAAA,IACL,qBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,sBAAA,EAAwB,aAAA;AAAA,IACxB,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,YAAA;AAAA,MACR,QAAA,EAAU,cAAA;AAAA,MACV,MAAA,EAAQ,YAAA;AAAA,MACR;AAAA;AACF,GACF;AACF;;;ACpJA,IAAA,gBAAA,GAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA","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 * 兼容:{{char}} {{user}} <<user>>\r\n * 同时支持传入任意 key:{{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 // 兼容:<<user>>\r\n if (macros.user !== undefined) {\r\n out = out.replace(/<<user>>/g, String(macros.user));\r\n }\r\n\r\n // 兼容:{{char}} / {{user}} 以及其它 {{key}}\r\n out = out.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (_m, key: string) => {\r\n if (Object.prototype.hasOwnProperty.call(macros, key)) return String(macros[key]);\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\nexport function buildPrompt(params: BuildPromptParams): BuildPromptResult {\r\n const { preset, character, globals, history, historyFormat, macros, view, options } = params;\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 });\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"]}
|