@qihuang02/world-book-mcp 0.0.3
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 +187 -0
- package/dist/core/capability-matrix.d.ts +17 -0
- package/dist/core/capability-matrix.js +133 -0
- package/dist/core/capability-matrix.js.map +1 -0
- package/dist/core/chapter-extraction.d.ts +12 -0
- package/dist/core/chapter-extraction.js +65 -0
- package/dist/core/chapter-extraction.js.map +1 -0
- package/dist/core/character-card-builder.d.ts +76 -0
- package/dist/core/character-card-builder.js +112 -0
- package/dist/core/character-card-builder.js.map +1 -0
- package/dist/core/character-card-query.d.ts +5 -0
- package/dist/core/character-card-query.js +30 -0
- package/dist/core/character-card-query.js.map +1 -0
- package/dist/core/character-card-validator.d.ts +17 -0
- package/dist/core/character-card-validator.js +42 -0
- package/dist/core/character-card-validator.js.map +1 -0
- package/dist/core/character-templates.d.ts +29 -0
- package/dist/core/character-templates.js +60 -0
- package/dist/core/character-templates.js.map +1 -0
- package/dist/core/clarification.d.ts +24 -0
- package/dist/core/clarification.js +433 -0
- package/dist/core/clarification.js.map +1 -0
- package/dist/core/config-explainer.d.ts +2 -0
- package/dist/core/config-explainer.js +44 -0
- package/dist/core/config-explainer.js.map +1 -0
- package/dist/core/content-lint.d.ts +15 -0
- package/dist/core/content-lint.js +90 -0
- package/dist/core/content-lint.js.map +1 -0
- package/dist/core/decision-prompts.d.ts +45 -0
- package/dist/core/decision-prompts.js +93 -0
- package/dist/core/decision-prompts.js.map +1 -0
- package/dist/core/delivery-checklist.d.ts +21 -0
- package/dist/core/delivery-checklist.js +63 -0
- package/dist/core/delivery-checklist.js.map +1 -0
- package/dist/core/derivative-outline.d.ts +19 -0
- package/dist/core/derivative-outline.js +107 -0
- package/dist/core/derivative-outline.js.map +1 -0
- package/dist/core/draft-template.d.ts +2 -0
- package/dist/core/draft-template.js +19 -0
- package/dist/core/draft-template.js.map +1 -0
- package/dist/core/draft-update.d.ts +5 -0
- package/dist/core/draft-update.js +34 -0
- package/dist/core/draft-update.js.map +1 -0
- package/dist/core/ejs-entries.d.ts +5 -0
- package/dist/core/ejs-entries.js +22 -0
- package/dist/core/ejs-entries.js.map +1 -0
- package/dist/core/ejs-phase-plan.d.ts +27 -0
- package/dist/core/ejs-phase-plan.js +77 -0
- package/dist/core/ejs-phase-plan.js.map +1 -0
- package/dist/core/ejs-template.d.ts +10 -0
- package/dist/core/ejs-template.js +70 -0
- package/dist/core/ejs-template.js.map +1 -0
- package/dist/core/ejs-validator.d.ts +18 -0
- package/dist/core/ejs-validator.js +60 -0
- package/dist/core/ejs-validator.js.map +1 -0
- package/dist/core/entry-planner.d.ts +8 -0
- package/dist/core/entry-planner.js +79 -0
- package/dist/core/entry-planner.js.map +1 -0
- package/dist/core/entry-templates.d.ts +7 -0
- package/dist/core/entry-templates.js +66 -0
- package/dist/core/entry-templates.js.map +1 -0
- package/dist/core/extraction-outline.d.ts +2 -0
- package/dist/core/extraction-outline.js +46 -0
- package/dist/core/extraction-outline.js.map +1 -0
- package/dist/core/final-review.d.ts +13 -0
- package/dist/core/final-review.js +80 -0
- package/dist/core/final-review.js.map +1 -0
- package/dist/core/greeting-validator.d.ts +17 -0
- package/dist/core/greeting-validator.js +79 -0
- package/dist/core/greeting-validator.js.map +1 -0
- package/dist/core/html-beautify-assets.d.ts +6 -0
- package/dist/core/html-beautify-assets.js +59 -0
- package/dist/core/html-beautify-assets.js.map +1 -0
- package/dist/core/html-beautify-template.d.ts +8 -0
- package/dist/core/html-beautify-template.js +46 -0
- package/dist/core/html-beautify-template.js.map +1 -0
- package/dist/core/html-beautify-validator.d.ts +21 -0
- package/dist/core/html-beautify-validator.js +66 -0
- package/dist/core/html-beautify-validator.js.map +1 -0
- package/dist/core/html-regex-pair.d.ts +18 -0
- package/dist/core/html-regex-pair.js +77 -0
- package/dist/core/html-regex-pair.js.map +1 -0
- package/dist/core/item-entry-validator.d.ts +10 -0
- package/dist/core/item-entry-validator.js +27 -0
- package/dist/core/item-entry-validator.js.map +1 -0
- package/dist/core/mvu-assets.d.ts +44 -0
- package/dist/core/mvu-assets.js +140 -0
- package/dist/core/mvu-assets.js.map +1 -0
- package/dist/core/mvu-template.d.ts +8 -0
- package/dist/core/mvu-template.js +45 -0
- package/dist/core/mvu-template.js.map +1 -0
- package/dist/core/mvu-validator.d.ts +18 -0
- package/dist/core/mvu-validator.js +75 -0
- package/dist/core/mvu-validator.js.map +1 -0
- package/dist/core/position-map.d.ts +5 -0
- package/dist/core/position-map.js +27 -0
- package/dist/core/position-map.js.map +1 -0
- package/dist/core/project-lint.d.ts +15 -0
- package/dist/core/project-lint.js +54 -0
- package/dist/core/project-lint.js.map +1 -0
- package/dist/core/regex-validator.d.ts +13 -0
- package/dist/core/regex-validator.js +41 -0
- package/dist/core/regex-validator.js.map +1 -0
- package/dist/core/style-extraction.d.ts +12 -0
- package/dist/core/style-extraction.js +87 -0
- package/dist/core/style-extraction.js.map +1 -0
- package/dist/core/task-classifier.d.ts +17 -0
- package/dist/core/task-classifier.js +107 -0
- package/dist/core/task-classifier.js.map +1 -0
- package/dist/core/tool-usage-guide.d.ts +13 -0
- package/dist/core/tool-usage-guide.js +198 -0
- package/dist/core/tool-usage-guide.js.map +1 -0
- package/dist/core/workflow.d.ts +12 -0
- package/dist/core/workflow.js +129 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/core/worldbook-builder.d.ts +6 -0
- package/dist/core/worldbook-builder.js +60 -0
- package/dist/core/worldbook-builder.js.map +1 -0
- package/dist/core/worldbook-importer.d.ts +7 -0
- package/dist/core/worldbook-importer.js +50 -0
- package/dist/core/worldbook-importer.js.map +1 -0
- package/dist/core/worldbook-patch.d.ts +23 -0
- package/dist/core/worldbook-patch.js +100 -0
- package/dist/core/worldbook-patch.js.map +1 -0
- package/dist/core/worldbook-planning.d.ts +41 -0
- package/dist/core/worldbook-planning.js +74 -0
- package/dist/core/worldbook-planning.js.map +1 -0
- package/dist/core/worldbook-query.d.ts +7 -0
- package/dist/core/worldbook-query.js +58 -0
- package/dist/core/worldbook-query.js.map +1 -0
- package/dist/core/worldbook-validator.d.ts +19 -0
- package/dist/core/worldbook-validator.js +116 -0
- package/dist/core/worldbook-validator.js.map +1 -0
- package/dist/core/worldbuilding.d.ts +80 -0
- package/dist/core/worldbuilding.js +134 -0
- package/dist/core/worldbuilding.js.map +1 -0
- package/dist/core/writing-optimization-report.d.ts +19 -0
- package/dist/core/writing-optimization-report.js +25 -0
- package/dist/core/writing-optimization-report.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/register.d.ts +2 -0
- package/dist/prompts/register.js +37 -0
- package/dist/prompts/register.js.map +1 -0
- package/dist/resources/usage-resources.d.ts +2 -0
- package/dist/resources/usage-resources.js +15 -0
- package/dist/resources/usage-resources.js.map +1 -0
- package/dist/schemas/chapter-outline.d.ts +28 -0
- package/dist/schemas/chapter-outline.js +17 -0
- package/dist/schemas/chapter-outline.js.map +1 -0
- package/dist/schemas/character-card.d.ts +124 -0
- package/dist/schemas/character-card.js +49 -0
- package/dist/schemas/character-card.js.map +1 -0
- package/dist/schemas/decision.d.ts +50 -0
- package/dist/schemas/decision.js +37 -0
- package/dist/schemas/decision.js.map +1 -0
- package/dist/schemas/derivative-outline.d.ts +204 -0
- package/dist/schemas/derivative-outline.js +55 -0
- package/dist/schemas/derivative-outline.js.map +1 -0
- package/dist/schemas/ejs.d.ts +189 -0
- package/dist/schemas/ejs.js +40 -0
- package/dist/schemas/ejs.js.map +1 -0
- package/dist/schemas/extraction.d.ts +219 -0
- package/dist/schemas/extraction.js +51 -0
- package/dist/schemas/extraction.js.map +1 -0
- package/dist/schemas/html-beautify.d.ts +159 -0
- package/dist/schemas/html-beautify.js +42 -0
- package/dist/schemas/html-beautify.js.map +1 -0
- package/dist/schemas/mvu.d.ts +60 -0
- package/dist/schemas/mvu.js +30 -0
- package/dist/schemas/mvu.js.map +1 -0
- package/dist/schemas/project.d.ts +579 -0
- package/dist/schemas/project.js +50 -0
- package/dist/schemas/project.js.map +1 -0
- package/dist/schemas/research.d.ts +56 -0
- package/dist/schemas/research.js +21 -0
- package/dist/schemas/research.js.map +1 -0
- package/dist/schemas/sillytavern-worldbook.d.ts +104 -0
- package/dist/schemas/sillytavern-worldbook.js +55 -0
- package/dist/schemas/sillytavern-worldbook.js.map +1 -0
- package/dist/schemas/source.d.ts +40 -0
- package/dist/schemas/source.js +20 -0
- package/dist/schemas/source.js.map +1 -0
- package/dist/schemas/style-profile.d.ts +35 -0
- package/dist/schemas/style-profile.js +16 -0
- package/dist/schemas/style-profile.js.map +1 -0
- package/dist/schemas/worldbook-draft.d.ts +236 -0
- package/dist/schemas/worldbook-draft.js +89 -0
- package/dist/schemas/worldbook-draft.js.map +1 -0
- package/dist/schemas/worldbook-patch.d.ts +423 -0
- package/dist/schemas/worldbook-patch.js +78 -0
- package/dist/schemas/worldbook-patch.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +15 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/path-policy.d.ts +13 -0
- package/dist/storage/path-policy.js +44 -0
- package/dist/storage/path-policy.js.map +1 -0
- package/dist/storage/project-store.d.ts +8 -0
- package/dist/storage/project-store.js +113 -0
- package/dist/storage/project-store.js.map +1 -0
- package/dist/tools/character-card-tools.d.ts +2 -0
- package/dist/tools/character-card-tools.js +118 -0
- package/dist/tools/character-card-tools.js.map +1 -0
- package/dist/tools/decision-tools.d.ts +2 -0
- package/dist/tools/decision-tools.js +55 -0
- package/dist/tools/decision-tools.js.map +1 -0
- package/dist/tools/extraction-tools.d.ts +2 -0
- package/dist/tools/extraction-tools.js +57 -0
- package/dist/tools/extraction-tools.js.map +1 -0
- package/dist/tools/helpers.d.ts +9 -0
- package/dist/tools/helpers.js +14 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/lint-review-tools.d.ts +2 -0
- package/dist/tools/lint-review-tools.js +30 -0
- package/dist/tools/lint-review-tools.js.map +1 -0
- package/dist/tools/mvu-html-ejs-tools.d.ts +2 -0
- package/dist/tools/mvu-html-ejs-tools.js +153 -0
- package/dist/tools/mvu-html-ejs-tools.js.map +1 -0
- package/dist/tools/project-tools.d.ts +2 -0
- package/dist/tools/project-tools.js +39 -0
- package/dist/tools/project-tools.js.map +1 -0
- package/dist/tools/register.d.ts +2 -0
- package/dist/tools/register.js +23 -0
- package/dist/tools/register.js.map +1 -0
- package/dist/tools/style-chapter-tools.d.ts +2 -0
- package/dist/tools/style-chapter-tools.js +40 -0
- package/dist/tools/style-chapter-tools.js.map +1 -0
- package/dist/tools/workflow-tools.d.ts +2 -0
- package/dist/tools/workflow-tools.js +60 -0
- package/dist/tools/workflow-tools.js.map +1 -0
- package/dist/tools/worldbook-tools.d.ts +2 -0
- package/dist/tools/worldbook-tools.js +180 -0
- package/dist/tools/worldbook-tools.js.map +1 -0
- package/dist/tools/worldbuilding-tools.d.ts +2 -0
- package/dist/tools/worldbuilding-tools.js +40 -0
- package/dist/tools/worldbuilding-tools.js.map +1 -0
- package/dist/utils/ids.d.ts +2 -0
- package/dist/utils/ids.js +8 -0
- package/dist/utils/ids.js.map +1 -0
- package/dist/utils/json.d.ts +2 -0
- package/dist/utils/json.js +7 -0
- package/dist/utils/json.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export const DEFAULT_MVU_BUNDLE = "import 'https://testingcf.jsdelivr.net/gh/MagicalAstrogy/MagVarUpdate/artifact/bundle.js';";
|
|
2
|
+
export const DEFAULT_MVU_BUTTONS = [
|
|
3
|
+
{ name: "重新处理变量", visible: true },
|
|
4
|
+
{ name: "重新读取初始变量", visible: true },
|
|
5
|
+
{ name: "清除旧楼层变量", visible: false },
|
|
6
|
+
{ name: "快照楼层", visible: false },
|
|
7
|
+
{ name: "重演楼层", visible: false },
|
|
8
|
+
{ name: "重试额外模型解析", visible: false },
|
|
9
|
+
];
|
|
10
|
+
export function buildMvuAssets(mvu) {
|
|
11
|
+
if (!mvu.enabled)
|
|
12
|
+
return { worldbookEntries: [], regexScripts: [], tavernHelperScripts: [] };
|
|
13
|
+
const worldbookEntries = [
|
|
14
|
+
{
|
|
15
|
+
comment: "[initvar]变量初始化勿开",
|
|
16
|
+
entryType: "other",
|
|
17
|
+
keys: [],
|
|
18
|
+
secondaryKeys: [],
|
|
19
|
+
content: wrapInitvar(mvu.initvar),
|
|
20
|
+
constant: true,
|
|
21
|
+
position: "before_char",
|
|
22
|
+
order: 14720,
|
|
23
|
+
enabled: false,
|
|
24
|
+
preventRecursion: true,
|
|
25
|
+
excludeRecursion: true,
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
if (mvu.variable_list_path !== false) {
|
|
29
|
+
worldbookEntries.push({
|
|
30
|
+
comment: "变量列表",
|
|
31
|
+
entryType: "other",
|
|
32
|
+
keys: [],
|
|
33
|
+
secondaryKeys: [],
|
|
34
|
+
content: `---\n<status_current_variable>\n{{format_message_variable::${mvu.variable_list_path}}}\n</status_current_variable>`,
|
|
35
|
+
constant: true,
|
|
36
|
+
position: "at_depth",
|
|
37
|
+
order: 14720,
|
|
38
|
+
enabled: true,
|
|
39
|
+
depth: 0,
|
|
40
|
+
preventRecursion: true,
|
|
41
|
+
excludeRecursion: true,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
worldbookEntries.push({
|
|
45
|
+
comment: "[mvu_update]变量更新规则",
|
|
46
|
+
entryType: "other",
|
|
47
|
+
keys: [],
|
|
48
|
+
secondaryKeys: [],
|
|
49
|
+
content: mvu.update_rules,
|
|
50
|
+
constant: true,
|
|
51
|
+
position: "at_depth",
|
|
52
|
+
order: 14720,
|
|
53
|
+
enabled: true,
|
|
54
|
+
depth: 0,
|
|
55
|
+
preventRecursion: true,
|
|
56
|
+
excludeRecursion: true,
|
|
57
|
+
}, {
|
|
58
|
+
comment: "[mvu_update]变量输出格式",
|
|
59
|
+
entryType: "other",
|
|
60
|
+
keys: [],
|
|
61
|
+
secondaryKeys: [],
|
|
62
|
+
content: mvu.output_format?.trim() || defaultOutputFormat(),
|
|
63
|
+
constant: true,
|
|
64
|
+
position: "at_depth",
|
|
65
|
+
order: 14720,
|
|
66
|
+
enabled: true,
|
|
67
|
+
depth: 0,
|
|
68
|
+
preventRecursion: true,
|
|
69
|
+
excludeRecursion: true,
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
worldbookEntries,
|
|
73
|
+
regexScripts: buildRegexScripts(mvu),
|
|
74
|
+
tavernHelperScripts: [
|
|
75
|
+
tavernScript("MVU", DEFAULT_MVU_BUNDLE, DEFAULT_MVU_BUTTONS),
|
|
76
|
+
tavernScript("变量结构", mvu.schema_script, []),
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function buildRegexScripts(mvu) {
|
|
81
|
+
const scripts = [];
|
|
82
|
+
if (mvu.hide_regex) {
|
|
83
|
+
scripts.push(regexScript({
|
|
84
|
+
scriptName: "[不发送]去除变量更新",
|
|
85
|
+
findRegex: "/<UpdateVariable>(.*?)<\\/UpdateVariable>/gis",
|
|
86
|
+
replaceString: "",
|
|
87
|
+
markdownOnly: false,
|
|
88
|
+
promptOnly: true,
|
|
89
|
+
placement: [1, 2],
|
|
90
|
+
minDepth: 4,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
if (mvu.beautify_regex) {
|
|
94
|
+
scripts.push(regexScript({
|
|
95
|
+
scriptName: "[美化]完整变量更新",
|
|
96
|
+
findRegex: "/<UpdateVariable>(.*?)<\\/UpdateVariable>/gis",
|
|
97
|
+
replaceString: "<details><summary>变量更新完成</summary>\n$1\n</details>",
|
|
98
|
+
markdownOnly: true,
|
|
99
|
+
promptOnly: false,
|
|
100
|
+
placement: [2],
|
|
101
|
+
}), regexScript({
|
|
102
|
+
scriptName: "[美化]变量更新中",
|
|
103
|
+
findRegex: "/<updatevariable>(?!.*<\\/updatevariable>)\\s*(.*)\\s*$/gsi",
|
|
104
|
+
replaceString: "<details><summary>变量更新中...</summary>\n$1\n</details>",
|
|
105
|
+
markdownOnly: true,
|
|
106
|
+
promptOnly: false,
|
|
107
|
+
placement: [2],
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
return scripts;
|
|
111
|
+
}
|
|
112
|
+
function regexScript(input) {
|
|
113
|
+
return {
|
|
114
|
+
scriptName: input.scriptName,
|
|
115
|
+
findRegex: input.findRegex,
|
|
116
|
+
replaceString: input.replaceString,
|
|
117
|
+
trimStrings: [],
|
|
118
|
+
placement: input.placement ?? [2],
|
|
119
|
+
disabled: false,
|
|
120
|
+
markdownOnly: input.markdownOnly ?? true,
|
|
121
|
+
promptOnly: input.promptOnly ?? false,
|
|
122
|
+
runOnEdit: input.runOnEdit ?? false,
|
|
123
|
+
substituteRegex: input.substituteRegex ?? 0,
|
|
124
|
+
minDepth: input.minDepth ?? null,
|
|
125
|
+
maxDepth: input.maxDepth ?? null,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function tavernScript(name, content, buttons) {
|
|
129
|
+
return { type: "script", enabled: true, name, content, info: "", button: { enabled: true, buttons }, data: {} };
|
|
130
|
+
}
|
|
131
|
+
function wrapInitvar(initvar) {
|
|
132
|
+
const trimmed = initvar.trim();
|
|
133
|
+
if (trimmed.startsWith("<initvar>"))
|
|
134
|
+
return trimmed;
|
|
135
|
+
return `<initvar>\n${trimmed}\n</initvar>`;
|
|
136
|
+
}
|
|
137
|
+
function defaultOutputFormat() {
|
|
138
|
+
return `---\n变量输出格式:\n rule:\n - 你必须在回复末尾输出更新分析和实际的更新命令\n - 更新命令遵循JSON Patch (RFC 6902)标准\n - 支持操作: replace/delta/insert/remove\n - 不要更新以_开头的只读变量\n format: |-\n <UpdateVariable>\n <Analysis>$(按英文输出,不超过80词)\n - \${计算经过的时间: ...}\n - \${判断是否允许戏剧性变化: 是/否}\n - \${基于check分析每个变量: ...}\n </Analysis>\n <JSONPatch>\n [\n { "op": "replace", "path": "\${路径}", "value": "\${新值}" },\n { "op": "delta", "path": "\${数值路径}", "value": \${变动值} },\n { "op": "insert", "path": "\${对象路径/新键}", "value": "\${新值}" },\n { "op": "remove", "path": "\${对象路径/键}" }\n ]\n </JSONPatch>\n </UpdateVariable>`;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=mvu-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mvu-assets.js","sourceRoot":"","sources":["../../src/core/mvu-assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function createMvuTemplate(input) {
|
|
2
|
+
const names = input.characterNames.length > 0 ? input.characterNames : ["角色"];
|
|
3
|
+
const schemaFields = names
|
|
4
|
+
.map((name) => ` ${safeIdentifier(name)}: z.object({\n 好感度: z.coerce.number().transform(v => _.clamp(v, 0, 100)).prefault(20),\n 心情: z.string().prefault('平静'),\n })`)
|
|
5
|
+
.join(",\n");
|
|
6
|
+
const initvar = names.map((name) => `${name}:\n 好感度: 20\n 心情: 平静`).join("\n");
|
|
7
|
+
const updateRules = [
|
|
8
|
+
"---",
|
|
9
|
+
"变量更新规则:",
|
|
10
|
+
...names.flatMap((name) => [
|
|
11
|
+
` ${name}:`,
|
|
12
|
+
" 好感度:",
|
|
13
|
+
" type: number",
|
|
14
|
+
" range: 0~100",
|
|
15
|
+
" check:",
|
|
16
|
+
" - 根据互动、承诺、冲突、照顾行为调整 ±(1~6)",
|
|
17
|
+
" 心情:",
|
|
18
|
+
" check:",
|
|
19
|
+
" - 根据当前场景、对话内容和关系变化更新为简短中文词语",
|
|
20
|
+
]),
|
|
21
|
+
].join("\n");
|
|
22
|
+
return {
|
|
23
|
+
mvu: {
|
|
24
|
+
enabled: true,
|
|
25
|
+
style: "zod",
|
|
26
|
+
schema_script: `import { registerMvuSchema } from 'https://testingcf.jsdelivr.net/gh/StageDog/tavern_resource/dist/util/mvu_zod.js';\n\nexport const Schema = z.object({\n${schemaFields}\n});\n\n$(() => {\n registerMvuSchema(Schema);\n});`,
|
|
27
|
+
initvar,
|
|
28
|
+
update_rules: updateRules,
|
|
29
|
+
output_format: "",
|
|
30
|
+
variable_list_path: input.variableListPath ?? "stat_data",
|
|
31
|
+
hide_regex: true,
|
|
32
|
+
beautify_regex: true,
|
|
33
|
+
},
|
|
34
|
+
rules: [
|
|
35
|
+
"schema_script 必须包含 registerMvuSchema 调用",
|
|
36
|
+
"z 和 _ 由酒馆环境注入,不要手动 import",
|
|
37
|
+
"initvar 填纯 YAML,builder 会自动包裹 <initvar>",
|
|
38
|
+
"启用 MVU 后 first_mes 和 alternate_greetings 建议包含 <StatusPlaceHolderImpl/>",
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function safeIdentifier(name) {
|
|
43
|
+
return /^[A-Za-z_$][\w$]*$/.test(name) ? name : JSON.stringify(name);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=mvu-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mvu-template.js","sourceRoot":"","sources":["../../src/core/mvu-template.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,KAA8D;IAC9F,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,KAAK;SACvB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,qIAAqI,CAAC;SAC7K,IAAI,CAAC,KAAK,CAAC,CAAC;IACf,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,wBAAwB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG;QAClB,KAAK;QACL,SAAS;QACT,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,KAAK,IAAI,GAAG;YACZ,UAAU;YACV,oBAAoB;YACpB,oBAAoB;YACpB,cAAc;YACd,oCAAoC;YACpC,SAAS;YACT,cAAc;YACd,qCAAqC;SACtC,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACL,GAAG,EAAE;YACH,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,KAAK;YACZ,aAAa,EAAE,6JAA6J,YAAY,uDAAuD;YAC/O,OAAO;YACP,YAAY,EAAE,WAAW;YACzB,aAAa,EAAE,EAAE;YACjB,kBAAkB,EAAE,KAAK,CAAC,gBAAgB,IAAI,WAAW;YACzD,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,IAAI;SACrB;QACD,KAAK,EAAE;YACL,yCAAyC;YACzC,2BAA2B;YAC3B,yCAAyC;YACzC,wEAAwE;SACzE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CharacterCardConfig } from "../schemas/character-card.js";
|
|
2
|
+
import type { MvuConfig } from "../schemas/mvu.js";
|
|
3
|
+
import type { ValidationIssue } from "./worldbook-validator.js";
|
|
4
|
+
export interface MvuValidationResult {
|
|
5
|
+
valid: boolean;
|
|
6
|
+
errors: ValidationIssue[];
|
|
7
|
+
warnings: ValidationIssue[];
|
|
8
|
+
summary: {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
has_schema_script: boolean;
|
|
11
|
+
has_initvar: boolean;
|
|
12
|
+
has_update_rules: boolean;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare function validateMvuConfig(input: {
|
|
16
|
+
mvu: MvuConfig;
|
|
17
|
+
characterCardConfig?: CharacterCardConfig;
|
|
18
|
+
}): MvuValidationResult;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export function validateMvuConfig(input) {
|
|
2
|
+
const { mvu, characterCardConfig } = input;
|
|
3
|
+
const errors = [];
|
|
4
|
+
const warnings = [];
|
|
5
|
+
if (!mvu.enabled) {
|
|
6
|
+
return { valid: true, errors, warnings, summary: summary(mvu) };
|
|
7
|
+
}
|
|
8
|
+
if (mvu.style !== "zod") {
|
|
9
|
+
errors.push({ field: "style", severity: "error", message: "当前仅支持 zod 风格 MVU" });
|
|
10
|
+
}
|
|
11
|
+
if (!mvu.schema_script.trim()) {
|
|
12
|
+
errors.push({ field: "schema_script", severity: "error", message: "schema_script 不能为空" });
|
|
13
|
+
}
|
|
14
|
+
if (!mvu.schema_script.includes("registerMvuSchema")) {
|
|
15
|
+
errors.push({ field: "schema_script", severity: "error", message: "schema_script 必须包含 registerMvuSchema" });
|
|
16
|
+
}
|
|
17
|
+
if (["_.add(", "_.set(", "getvar("].some((term) => mvu.schema_script.includes(term))) {
|
|
18
|
+
errors.push({ field: "schema_script", severity: "error", message: "schema_script 疑似混入 MVU beta 风格,请统一使用 ZOD 风格" });
|
|
19
|
+
}
|
|
20
|
+
if (/import\s+.*\b(z|_)\b/.test(mvu.schema_script)) {
|
|
21
|
+
warnings.push({ field: "schema_script", severity: "warning", message: "z 和 _ 由环境注入,通常不应手动 import" });
|
|
22
|
+
}
|
|
23
|
+
if (/\.(?:strict|passthrough|optional)\s*\(/.test(mvu.schema_script)) {
|
|
24
|
+
errors.push({ field: "schema_script", severity: "error", message: "MVU ZOD 脚本不应使用 .strict()/.passthrough()/.optional()" });
|
|
25
|
+
}
|
|
26
|
+
if (/\.default\s*\(/.test(mvu.schema_script)) {
|
|
27
|
+
warnings.push({ field: "schema_script", severity: "warning", message: "MVU 默认值建议使用 .prefault() 而非 .default()" });
|
|
28
|
+
}
|
|
29
|
+
if (/\.(?:min|max)\s*\(/.test(mvu.schema_script)) {
|
|
30
|
+
warnings.push({ field: "schema_script", severity: "warning", message: "数值范围建议使用 transform(v => _.clamp(v, min, max)),避免 min/max 直接拒绝更新" });
|
|
31
|
+
}
|
|
32
|
+
if (/\.transform\s*\(\s*\([^)]*,[^)]*\)\s*=>/.test(mvu.schema_script)) {
|
|
33
|
+
errors.push({ field: "schema_script", severity: "error", message: "transform 回调应只接受一个参数" });
|
|
34
|
+
}
|
|
35
|
+
if (!mvu.initvar.trim()) {
|
|
36
|
+
errors.push({ field: "initvar", severity: "error", message: "initvar 不能为空" });
|
|
37
|
+
}
|
|
38
|
+
if (mvu.initvar.includes("<initvar>")) {
|
|
39
|
+
warnings.push({ field: "initvar", severity: "warning", message: "initvar 应填写纯 YAML,builder 会自动包裹 <initvar>" });
|
|
40
|
+
}
|
|
41
|
+
if (!mvu.update_rules.trim()) {
|
|
42
|
+
errors.push({ field: "update_rules", severity: "error", message: "update_rules 不能为空" });
|
|
43
|
+
}
|
|
44
|
+
if (/_.(?:set|add)\(|getvar\(|\[0\]/.test(mvu.update_rules) || /\/stat_data\//.test(mvu.output_format ?? "")) {
|
|
45
|
+
errors.push({ field: "update_rules", severity: "error", message: "MVU 配置疑似混用 Beta 路径/命令风格,请统一使用 ZOD + JSON Patch" });
|
|
46
|
+
}
|
|
47
|
+
if (/\n\s*_[^:\n]+:\s*\n?[\s\S]{0,80}check\s*:/.test(mvu.update_rules)) {
|
|
48
|
+
warnings.push({ field: "update_rules", severity: "warning", message: "_ 前缀只读变量不应编写更新规则" });
|
|
49
|
+
}
|
|
50
|
+
if (mvu.variable_list_path !== false && !mvu.variable_list_path.trim()) {
|
|
51
|
+
errors.push({ field: "variable_list_path", severity: "error", message: "variable_list_path 不能为空字符串,或显式设为 false" });
|
|
52
|
+
}
|
|
53
|
+
if (characterCardConfig) {
|
|
54
|
+
const greetings = [characterCardConfig.card.first_mes, ...characterCardConfig.card.alternate_greetings];
|
|
55
|
+
greetings.forEach((greeting, index) => {
|
|
56
|
+
if (!greeting.includes("<StatusPlaceHolderImpl/>")) {
|
|
57
|
+
warnings.push({
|
|
58
|
+
field: index === 0 ? "card.first_mes" : `card.alternate_greetings.${index - 1}`,
|
|
59
|
+
severity: "warning",
|
|
60
|
+
message: "启用 MVU 时开场白建议包含 <StatusPlaceHolderImpl/> 状态栏占位符",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return { valid: errors.length === 0, errors, warnings, summary: summary(mvu) };
|
|
66
|
+
}
|
|
67
|
+
function summary(mvu) {
|
|
68
|
+
return {
|
|
69
|
+
enabled: mvu.enabled,
|
|
70
|
+
has_schema_script: Boolean(mvu.schema_script.trim()),
|
|
71
|
+
has_initvar: Boolean(mvu.initvar.trim()),
|
|
72
|
+
has_update_rules: Boolean(mvu.update_rules.trim()),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=mvu-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mvu-validator.js","sourceRoot":"","sources":["../../src/core/mvu-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PositionName } from "../schemas/worldbook-draft.js";
|
|
2
|
+
export declare const POSITION_TO_NUMBER: Record<PositionName, number>;
|
|
3
|
+
export declare const NUMBER_TO_POSITION: Record<number, PositionName>;
|
|
4
|
+
export declare function positionToNumber(position: PositionName): number;
|
|
5
|
+
export declare function numberToPosition(position: number): PositionName | undefined;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const POSITION_TO_NUMBER = {
|
|
2
|
+
before_char: 0,
|
|
3
|
+
after_char: 1,
|
|
4
|
+
before_an: 2,
|
|
5
|
+
after_an: 3,
|
|
6
|
+
at_depth: 4,
|
|
7
|
+
before_em: 5,
|
|
8
|
+
after_em: 6,
|
|
9
|
+
outlet: 7,
|
|
10
|
+
};
|
|
11
|
+
export const NUMBER_TO_POSITION = {
|
|
12
|
+
0: "before_char",
|
|
13
|
+
1: "after_char",
|
|
14
|
+
2: "before_an",
|
|
15
|
+
3: "after_an",
|
|
16
|
+
4: "at_depth",
|
|
17
|
+
5: "before_em",
|
|
18
|
+
6: "after_em",
|
|
19
|
+
7: "outlet",
|
|
20
|
+
};
|
|
21
|
+
export function positionToNumber(position) {
|
|
22
|
+
return POSITION_TO_NUMBER[position];
|
|
23
|
+
}
|
|
24
|
+
export function numberToPosition(position) {
|
|
25
|
+
return NUMBER_TO_POSITION[position];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=position-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-map.js","sourceRoot":"","sources":["../../src/core/position-map.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAiC;IAC9D,WAAW,EAAE,CAAC;IACd,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAiC;IAC9D,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,QAAQ;CACZ,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,QAAsB;IACrD,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Project } from "../schemas/project.js";
|
|
2
|
+
import { type ContentLintIssue } from "./content-lint.js";
|
|
3
|
+
export interface ProjectLintTargetIssue extends ContentLintIssue {
|
|
4
|
+
path: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ProjectLintResult {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
issues: ProjectLintTargetIssue[];
|
|
9
|
+
summary: {
|
|
10
|
+
scanned_target_count: number;
|
|
11
|
+
error_count: number;
|
|
12
|
+
warning_count: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare function lintProjectContent(project: Project): ProjectLintResult;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { lintContent } from "./content-lint.js";
|
|
2
|
+
export function lintProjectContent(project) {
|
|
3
|
+
const targets = collectTargets(project);
|
|
4
|
+
const issues = [];
|
|
5
|
+
for (const target of targets) {
|
|
6
|
+
const result = lintContent(target.content);
|
|
7
|
+
issues.push(...result.issues.map((issue) => ({ ...issue, path: target.path })));
|
|
8
|
+
}
|
|
9
|
+
const error_count = issues.filter((issue) => issue.severity === "error").length;
|
|
10
|
+
const warning_count = issues.filter((issue) => issue.severity === "warning").length;
|
|
11
|
+
return {
|
|
12
|
+
ok: error_count === 0,
|
|
13
|
+
issues,
|
|
14
|
+
summary: {
|
|
15
|
+
scanned_target_count: targets.length,
|
|
16
|
+
error_count,
|
|
17
|
+
warning_count,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function collectTargets(project) {
|
|
22
|
+
const targets = [];
|
|
23
|
+
project.draft?.forEach((entry, index) => {
|
|
24
|
+
targets.push({ path: `draft.${index}.${entry.comment}.content`, content: entry.content });
|
|
25
|
+
});
|
|
26
|
+
const card = project.characterCardConfig?.card;
|
|
27
|
+
if (card) {
|
|
28
|
+
targets.push({ path: "characterCardConfig.card.first_mes", content: card.first_mes });
|
|
29
|
+
card.alternate_greetings.forEach((greeting, index) => {
|
|
30
|
+
targets.push({ path: `characterCardConfig.card.alternate_greetings.${index}`, content: greeting });
|
|
31
|
+
});
|
|
32
|
+
for (const field of ["personality", "scenario", "creator_notes", "system_prompt", "post_history_instructions"]) {
|
|
33
|
+
if (card[field])
|
|
34
|
+
targets.push({ path: `characterCardConfig.card.${field}`, content: card[field] });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (project.mvuConfig) {
|
|
38
|
+
targets.push({ path: "mvuConfig.update_rules", content: project.mvuConfig.update_rules });
|
|
39
|
+
targets.push({ path: "mvuConfig.output_format", content: project.mvuConfig.output_format ?? "" });
|
|
40
|
+
}
|
|
41
|
+
if (project.ejsConfig) {
|
|
42
|
+
project.ejsConfig.entries.forEach((entry, index) => {
|
|
43
|
+
targets.push({ path: `ejsConfig.entries.${index}.${entry.name}.content`, content: entry.content });
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (project.htmlBeautifyConfig) {
|
|
47
|
+
targets.push({ path: "htmlBeautifyConfig.statusbar.html", content: project.htmlBeautifyConfig.statusbar.html });
|
|
48
|
+
project.htmlBeautifyConfig.global.regex_scripts.forEach((script, index) => {
|
|
49
|
+
targets.push({ path: `htmlBeautifyConfig.global.regex_scripts.${index}.replaceString`, content: script.replaceString });
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return targets.filter((target) => target.content.trim());
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=project-lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-lint.js","sourceRoot":"","sources":["../../src/core/project-lint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AAqBvE,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAA6B,EAAE,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAChF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACpF,OAAO;QACL,EAAE,EAAE,WAAW,KAAK,CAAC;QACrB,MAAM;QACN,OAAO,EAAE;YACP,oBAAoB,EAAE,OAAO,CAAC,MAAM;YACpC,WAAW;YACX,aAAa;SACd;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAgB;IACtC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACtC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,KAAK,CAAC,OAAO,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC;IAC/C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACnD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gDAAgD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrG,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,2BAA2B,CAAU,EAAE,CAAC;YACxH,IAAI,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,4BAA4B,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACjD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,KAAK,IAAI,KAAK,CAAC,IAAI,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrG,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAChH,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACxE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2CAA2C,KAAK,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC1H,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RegexScriptAsset } from "./mvu-assets.js";
|
|
2
|
+
import type { ValidationIssue } from "./worldbook-validator.js";
|
|
3
|
+
export interface RegexValidationResult {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
errors: ValidationIssue[];
|
|
6
|
+
warnings: ValidationIssue[];
|
|
7
|
+
summary: {
|
|
8
|
+
total: number;
|
|
9
|
+
display_count: number;
|
|
10
|
+
prompt_count: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare function validateRegexScripts(scripts: RegexScriptAsset[]): RegexValidationResult;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function validateRegexScripts(scripts) {
|
|
2
|
+
const errors = [];
|
|
3
|
+
const warnings = [];
|
|
4
|
+
let display_count = 0;
|
|
5
|
+
let prompt_count = 0;
|
|
6
|
+
scripts.forEach((script, index) => {
|
|
7
|
+
if (!script.scriptName?.trim())
|
|
8
|
+
errors.push({ field: `regex.${index}.scriptName`, severity: "error", message: "regex name 不能为空" });
|
|
9
|
+
if (!script.findRegex?.trim()) {
|
|
10
|
+
errors.push({ field: `regex.${index}.findRegex`, severity: "error", message: "findRegex 不能为空" });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (!/^\/.+\/[a-z]*$/.test(script.findRegex)) {
|
|
14
|
+
warnings.push({ field: `regex.${index}.findRegex`, severity: "warning", message: "建议使用 slash 风格 /pattern/flags" });
|
|
15
|
+
}
|
|
16
|
+
if (script.markdownOnly && script.promptOnly) {
|
|
17
|
+
errors.push({ field: `regex.${index}`, severity: "error", message: "markdownOnly 与 promptOnly 不能同时为 true" });
|
|
18
|
+
}
|
|
19
|
+
if (script.markdownOnly)
|
|
20
|
+
display_count++;
|
|
21
|
+
if (script.promptOnly)
|
|
22
|
+
prompt_count++;
|
|
23
|
+
if (script.promptOnly && script.replaceString && script.replaceString.replace(/\$\d+/g, "").trim() !== "") {
|
|
24
|
+
warnings.push({ field: `regex.${index}.replaceString`, severity: "warning", message: "promptOnly 规则建议替换为空字符串,避免向 AI 发送多余内容" });
|
|
25
|
+
}
|
|
26
|
+
if (script.placement.length === 0)
|
|
27
|
+
errors.push({ field: `regex.${index}.placement`, severity: "error", message: "placement 不能为空" });
|
|
28
|
+
if (script.placement.some((value) => value < 1 || value > 2))
|
|
29
|
+
warnings.push({ field: `regex.${index}.placement`, severity: "warning", message: "placement 通常使用 1(显示层)/2(提示词层)" });
|
|
30
|
+
if ((script.minDepth ?? null) !== null && (script.maxDepth ?? null) !== null && script.maxDepth < script.minDepth) {
|
|
31
|
+
errors.push({ field: `regex.${index}.depth`, severity: "error", message: "maxDepth 不能小于 minDepth" });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
// pair 完整性:display 与 prompt 数量不一致时提示
|
|
35
|
+
if (display_count > 0 && prompt_count === 0)
|
|
36
|
+
warnings.push({ field: "regex", severity: "warning", message: "存在 display 规则但缺少 promptOnly 隐藏规则,AI 仍会看到原文" });
|
|
37
|
+
if (prompt_count > 0 && display_count === 0)
|
|
38
|
+
warnings.push({ field: "regex", severity: "warning", message: "存在 prompt 隐藏规则但缺少 display 规则,用户不会看到美化效果" });
|
|
39
|
+
return { ok: errors.length === 0, errors, warnings, summary: { total: scripts.length, display_count, prompt_count } };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=regex-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-validator.js","sourceRoot":"","sources":["../../src/core/regex-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { StyleProfile } from "../schemas/style-profile.js";
|
|
2
|
+
import type { WorldbookDraftEntry } from "../schemas/worldbook-draft.js";
|
|
3
|
+
export declare function createStyleExtractionTemplate(): {
|
|
4
|
+
profile: StyleProfile;
|
|
5
|
+
rules: string[];
|
|
6
|
+
};
|
|
7
|
+
export declare function buildStyleWorldbookEntries(profile: StyleProfile, options?: {
|
|
8
|
+
include_forbidden_entry?: boolean;
|
|
9
|
+
comment_prefix?: string;
|
|
10
|
+
}): {
|
|
11
|
+
worldbookEntries: WorldbookDraftEntry[];
|
|
12
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export function createStyleExtractionTemplate() {
|
|
2
|
+
return {
|
|
3
|
+
profile: {
|
|
4
|
+
narrative_perspective: "third_person_limited",
|
|
5
|
+
tense: "present",
|
|
6
|
+
sentence_length: "varied",
|
|
7
|
+
dialogue_ratio: "medium",
|
|
8
|
+
description_focus: [],
|
|
9
|
+
rhythm: "",
|
|
10
|
+
signature_techniques: [],
|
|
11
|
+
forbidden_terms: [],
|
|
12
|
+
forbidden_patterns: [],
|
|
13
|
+
positive_rules: [],
|
|
14
|
+
negative_rules: [],
|
|
15
|
+
notes: [],
|
|
16
|
+
},
|
|
17
|
+
rules: [
|
|
18
|
+
"提取文风时只写写作规则与负面约束,不要复制大段原文",
|
|
19
|
+
"比喻禁词、量子词、感官标签由 writing-optimization 体系统一禁用",
|
|
20
|
+
"positive_rules 描述应做的事,negative_rules 描述禁止的事",
|
|
21
|
+
"rhythm 用一句话描述节奏感,例如 短句多/对话穿插/动作密集",
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function buildStyleWorldbookEntries(profile, options = {}) {
|
|
26
|
+
const prefix = options.comment_prefix ?? "文风";
|
|
27
|
+
const entries = [];
|
|
28
|
+
entries.push({
|
|
29
|
+
comment: `${prefix}_主规则`,
|
|
30
|
+
entryType: "other",
|
|
31
|
+
keys: [],
|
|
32
|
+
secondaryKeys: [],
|
|
33
|
+
content: renderMainRules(profile),
|
|
34
|
+
constant: true,
|
|
35
|
+
position: "before_an",
|
|
36
|
+
order: 1,
|
|
37
|
+
enabled: true,
|
|
38
|
+
preventRecursion: true,
|
|
39
|
+
excludeRecursion: true,
|
|
40
|
+
});
|
|
41
|
+
if (profile.signature_techniques.length > 0) {
|
|
42
|
+
entries.push({
|
|
43
|
+
comment: `${prefix}_技法`,
|
|
44
|
+
entryType: "other",
|
|
45
|
+
keys: [],
|
|
46
|
+
secondaryKeys: [],
|
|
47
|
+
content: renderTechniques(profile),
|
|
48
|
+
constant: true,
|
|
49
|
+
position: "before_an",
|
|
50
|
+
order: 2,
|
|
51
|
+
enabled: true,
|
|
52
|
+
preventRecursion: true,
|
|
53
|
+
excludeRecursion: true,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if ((options.include_forbidden_entry ?? true) && (profile.forbidden_terms.length > 0 || profile.forbidden_patterns.length > 0 || profile.negative_rules.length > 0)) {
|
|
57
|
+
entries.push({
|
|
58
|
+
comment: `${prefix}_禁律`,
|
|
59
|
+
entryType: "other",
|
|
60
|
+
keys: [],
|
|
61
|
+
secondaryKeys: [],
|
|
62
|
+
content: renderForbidden(profile),
|
|
63
|
+
constant: true,
|
|
64
|
+
position: "before_an",
|
|
65
|
+
order: 3,
|
|
66
|
+
enabled: true,
|
|
67
|
+
preventRecursion: true,
|
|
68
|
+
excludeRecursion: true,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return { worldbookEntries: entries };
|
|
72
|
+
}
|
|
73
|
+
function renderMainRules(profile) {
|
|
74
|
+
return `<style_rules>\nperspective: ${profile.narrative_perspective}\ntense: ${profile.tense}\nsentence_length: ${profile.sentence_length}\ndialogue_ratio: ${profile.dialogue_ratio}\nrhythm: ${profile.rhythm || "未指定"}\ndescription_focus:\n${list(profile.description_focus)}positive_rules:\n${list(profile.positive_rules)}</style_rules>`;
|
|
75
|
+
}
|
|
76
|
+
function renderTechniques(profile) {
|
|
77
|
+
return `<style_techniques>\nsignature_techniques:\n${list(profile.signature_techniques)}notes:\n${list(profile.notes)}</style_techniques>`;
|
|
78
|
+
}
|
|
79
|
+
function renderForbidden(profile) {
|
|
80
|
+
return `<style_forbidden>\nforbidden_terms:\n${list(profile.forbidden_terms)}forbidden_patterns:\n${list(profile.forbidden_patterns)}negative_rules:\n${list(profile.negative_rules)}</style_forbidden>`;
|
|
81
|
+
}
|
|
82
|
+
function list(items) {
|
|
83
|
+
if (items.length === 0)
|
|
84
|
+
return " - 待补充\n";
|
|
85
|
+
return items.map((item) => ` - ${item}`).join("\n") + "\n";
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=style-extraction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-extraction.js","sourceRoot":"","sources":["../../src/core/style-extraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WorkflowTaskType } from "./workflow.js";
|
|
2
|
+
export type WorldbookTaskClass = "original_character_card" | "derivative_extraction" | "worldbuilding_only" | "item_ability_equipment" | "style_extraction" | "chapter_extraction" | "modify_existing" | "query_existing" | "mvu_zod" | "ejs_dynamic" | "html_beautify" | "content_lint";
|
|
3
|
+
export interface TaskClassificationInput {
|
|
4
|
+
request: string;
|
|
5
|
+
wants_character_card?: boolean;
|
|
6
|
+
wants_mvu?: boolean;
|
|
7
|
+
wants_html?: boolean;
|
|
8
|
+
wants_ejs?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface TaskClassificationResult {
|
|
11
|
+
task_type: WorldbookTaskClass;
|
|
12
|
+
original_or_derivative: "original" | "derivative" | "existing_asset" | "technical" | "unknown";
|
|
13
|
+
required_workflow: WorkflowTaskType;
|
|
14
|
+
required_guides: string[];
|
|
15
|
+
notes: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function classifyWorldbookTask(input: TaskClassificationInput): TaskClassificationResult;
|