@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.
Files changed (245) hide show
  1. package/README.md +187 -0
  2. package/dist/core/capability-matrix.d.ts +17 -0
  3. package/dist/core/capability-matrix.js +133 -0
  4. package/dist/core/capability-matrix.js.map +1 -0
  5. package/dist/core/chapter-extraction.d.ts +12 -0
  6. package/dist/core/chapter-extraction.js +65 -0
  7. package/dist/core/chapter-extraction.js.map +1 -0
  8. package/dist/core/character-card-builder.d.ts +76 -0
  9. package/dist/core/character-card-builder.js +112 -0
  10. package/dist/core/character-card-builder.js.map +1 -0
  11. package/dist/core/character-card-query.d.ts +5 -0
  12. package/dist/core/character-card-query.js +30 -0
  13. package/dist/core/character-card-query.js.map +1 -0
  14. package/dist/core/character-card-validator.d.ts +17 -0
  15. package/dist/core/character-card-validator.js +42 -0
  16. package/dist/core/character-card-validator.js.map +1 -0
  17. package/dist/core/character-templates.d.ts +29 -0
  18. package/dist/core/character-templates.js +60 -0
  19. package/dist/core/character-templates.js.map +1 -0
  20. package/dist/core/clarification.d.ts +24 -0
  21. package/dist/core/clarification.js +433 -0
  22. package/dist/core/clarification.js.map +1 -0
  23. package/dist/core/config-explainer.d.ts +2 -0
  24. package/dist/core/config-explainer.js +44 -0
  25. package/dist/core/config-explainer.js.map +1 -0
  26. package/dist/core/content-lint.d.ts +15 -0
  27. package/dist/core/content-lint.js +90 -0
  28. package/dist/core/content-lint.js.map +1 -0
  29. package/dist/core/decision-prompts.d.ts +45 -0
  30. package/dist/core/decision-prompts.js +93 -0
  31. package/dist/core/decision-prompts.js.map +1 -0
  32. package/dist/core/delivery-checklist.d.ts +21 -0
  33. package/dist/core/delivery-checklist.js +63 -0
  34. package/dist/core/delivery-checklist.js.map +1 -0
  35. package/dist/core/derivative-outline.d.ts +19 -0
  36. package/dist/core/derivative-outline.js +107 -0
  37. package/dist/core/derivative-outline.js.map +1 -0
  38. package/dist/core/draft-template.d.ts +2 -0
  39. package/dist/core/draft-template.js +19 -0
  40. package/dist/core/draft-template.js.map +1 -0
  41. package/dist/core/draft-update.d.ts +5 -0
  42. package/dist/core/draft-update.js +34 -0
  43. package/dist/core/draft-update.js.map +1 -0
  44. package/dist/core/ejs-entries.d.ts +5 -0
  45. package/dist/core/ejs-entries.js +22 -0
  46. package/dist/core/ejs-entries.js.map +1 -0
  47. package/dist/core/ejs-phase-plan.d.ts +27 -0
  48. package/dist/core/ejs-phase-plan.js +77 -0
  49. package/dist/core/ejs-phase-plan.js.map +1 -0
  50. package/dist/core/ejs-template.d.ts +10 -0
  51. package/dist/core/ejs-template.js +70 -0
  52. package/dist/core/ejs-template.js.map +1 -0
  53. package/dist/core/ejs-validator.d.ts +18 -0
  54. package/dist/core/ejs-validator.js +60 -0
  55. package/dist/core/ejs-validator.js.map +1 -0
  56. package/dist/core/entry-planner.d.ts +8 -0
  57. package/dist/core/entry-planner.js +79 -0
  58. package/dist/core/entry-planner.js.map +1 -0
  59. package/dist/core/entry-templates.d.ts +7 -0
  60. package/dist/core/entry-templates.js +66 -0
  61. package/dist/core/entry-templates.js.map +1 -0
  62. package/dist/core/extraction-outline.d.ts +2 -0
  63. package/dist/core/extraction-outline.js +46 -0
  64. package/dist/core/extraction-outline.js.map +1 -0
  65. package/dist/core/final-review.d.ts +13 -0
  66. package/dist/core/final-review.js +80 -0
  67. package/dist/core/final-review.js.map +1 -0
  68. package/dist/core/greeting-validator.d.ts +17 -0
  69. package/dist/core/greeting-validator.js +79 -0
  70. package/dist/core/greeting-validator.js.map +1 -0
  71. package/dist/core/html-beautify-assets.d.ts +6 -0
  72. package/dist/core/html-beautify-assets.js +59 -0
  73. package/dist/core/html-beautify-assets.js.map +1 -0
  74. package/dist/core/html-beautify-template.d.ts +8 -0
  75. package/dist/core/html-beautify-template.js +46 -0
  76. package/dist/core/html-beautify-template.js.map +1 -0
  77. package/dist/core/html-beautify-validator.d.ts +21 -0
  78. package/dist/core/html-beautify-validator.js +66 -0
  79. package/dist/core/html-beautify-validator.js.map +1 -0
  80. package/dist/core/html-regex-pair.d.ts +18 -0
  81. package/dist/core/html-regex-pair.js +77 -0
  82. package/dist/core/html-regex-pair.js.map +1 -0
  83. package/dist/core/item-entry-validator.d.ts +10 -0
  84. package/dist/core/item-entry-validator.js +27 -0
  85. package/dist/core/item-entry-validator.js.map +1 -0
  86. package/dist/core/mvu-assets.d.ts +44 -0
  87. package/dist/core/mvu-assets.js +140 -0
  88. package/dist/core/mvu-assets.js.map +1 -0
  89. package/dist/core/mvu-template.d.ts +8 -0
  90. package/dist/core/mvu-template.js +45 -0
  91. package/dist/core/mvu-template.js.map +1 -0
  92. package/dist/core/mvu-validator.d.ts +18 -0
  93. package/dist/core/mvu-validator.js +75 -0
  94. package/dist/core/mvu-validator.js.map +1 -0
  95. package/dist/core/position-map.d.ts +5 -0
  96. package/dist/core/position-map.js +27 -0
  97. package/dist/core/position-map.js.map +1 -0
  98. package/dist/core/project-lint.d.ts +15 -0
  99. package/dist/core/project-lint.js +54 -0
  100. package/dist/core/project-lint.js.map +1 -0
  101. package/dist/core/regex-validator.d.ts +13 -0
  102. package/dist/core/regex-validator.js +41 -0
  103. package/dist/core/regex-validator.js.map +1 -0
  104. package/dist/core/style-extraction.d.ts +12 -0
  105. package/dist/core/style-extraction.js +87 -0
  106. package/dist/core/style-extraction.js.map +1 -0
  107. package/dist/core/task-classifier.d.ts +17 -0
  108. package/dist/core/task-classifier.js +107 -0
  109. package/dist/core/task-classifier.js.map +1 -0
  110. package/dist/core/tool-usage-guide.d.ts +13 -0
  111. package/dist/core/tool-usage-guide.js +198 -0
  112. package/dist/core/tool-usage-guide.js.map +1 -0
  113. package/dist/core/workflow.d.ts +12 -0
  114. package/dist/core/workflow.js +129 -0
  115. package/dist/core/workflow.js.map +1 -0
  116. package/dist/core/worldbook-builder.d.ts +6 -0
  117. package/dist/core/worldbook-builder.js +60 -0
  118. package/dist/core/worldbook-builder.js.map +1 -0
  119. package/dist/core/worldbook-importer.d.ts +7 -0
  120. package/dist/core/worldbook-importer.js +50 -0
  121. package/dist/core/worldbook-importer.js.map +1 -0
  122. package/dist/core/worldbook-patch.d.ts +23 -0
  123. package/dist/core/worldbook-patch.js +100 -0
  124. package/dist/core/worldbook-patch.js.map +1 -0
  125. package/dist/core/worldbook-planning.d.ts +41 -0
  126. package/dist/core/worldbook-planning.js +74 -0
  127. package/dist/core/worldbook-planning.js.map +1 -0
  128. package/dist/core/worldbook-query.d.ts +7 -0
  129. package/dist/core/worldbook-query.js +58 -0
  130. package/dist/core/worldbook-query.js.map +1 -0
  131. package/dist/core/worldbook-validator.d.ts +19 -0
  132. package/dist/core/worldbook-validator.js +116 -0
  133. package/dist/core/worldbook-validator.js.map +1 -0
  134. package/dist/core/worldbuilding.d.ts +80 -0
  135. package/dist/core/worldbuilding.js +134 -0
  136. package/dist/core/worldbuilding.js.map +1 -0
  137. package/dist/core/writing-optimization-report.d.ts +19 -0
  138. package/dist/core/writing-optimization-report.js +25 -0
  139. package/dist/core/writing-optimization-report.js.map +1 -0
  140. package/dist/index.d.ts +2 -0
  141. package/dist/index.js +15 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/prompts/register.d.ts +2 -0
  144. package/dist/prompts/register.js +37 -0
  145. package/dist/prompts/register.js.map +1 -0
  146. package/dist/resources/usage-resources.d.ts +2 -0
  147. package/dist/resources/usage-resources.js +15 -0
  148. package/dist/resources/usage-resources.js.map +1 -0
  149. package/dist/schemas/chapter-outline.d.ts +28 -0
  150. package/dist/schemas/chapter-outline.js +17 -0
  151. package/dist/schemas/chapter-outline.js.map +1 -0
  152. package/dist/schemas/character-card.d.ts +124 -0
  153. package/dist/schemas/character-card.js +49 -0
  154. package/dist/schemas/character-card.js.map +1 -0
  155. package/dist/schemas/decision.d.ts +50 -0
  156. package/dist/schemas/decision.js +37 -0
  157. package/dist/schemas/decision.js.map +1 -0
  158. package/dist/schemas/derivative-outline.d.ts +204 -0
  159. package/dist/schemas/derivative-outline.js +55 -0
  160. package/dist/schemas/derivative-outline.js.map +1 -0
  161. package/dist/schemas/ejs.d.ts +189 -0
  162. package/dist/schemas/ejs.js +40 -0
  163. package/dist/schemas/ejs.js.map +1 -0
  164. package/dist/schemas/extraction.d.ts +219 -0
  165. package/dist/schemas/extraction.js +51 -0
  166. package/dist/schemas/extraction.js.map +1 -0
  167. package/dist/schemas/html-beautify.d.ts +159 -0
  168. package/dist/schemas/html-beautify.js +42 -0
  169. package/dist/schemas/html-beautify.js.map +1 -0
  170. package/dist/schemas/mvu.d.ts +60 -0
  171. package/dist/schemas/mvu.js +30 -0
  172. package/dist/schemas/mvu.js.map +1 -0
  173. package/dist/schemas/project.d.ts +579 -0
  174. package/dist/schemas/project.js +50 -0
  175. package/dist/schemas/project.js.map +1 -0
  176. package/dist/schemas/research.d.ts +56 -0
  177. package/dist/schemas/research.js +21 -0
  178. package/dist/schemas/research.js.map +1 -0
  179. package/dist/schemas/sillytavern-worldbook.d.ts +104 -0
  180. package/dist/schemas/sillytavern-worldbook.js +55 -0
  181. package/dist/schemas/sillytavern-worldbook.js.map +1 -0
  182. package/dist/schemas/source.d.ts +40 -0
  183. package/dist/schemas/source.js +20 -0
  184. package/dist/schemas/source.js.map +1 -0
  185. package/dist/schemas/style-profile.d.ts +35 -0
  186. package/dist/schemas/style-profile.js +16 -0
  187. package/dist/schemas/style-profile.js.map +1 -0
  188. package/dist/schemas/worldbook-draft.d.ts +236 -0
  189. package/dist/schemas/worldbook-draft.js +89 -0
  190. package/dist/schemas/worldbook-draft.js.map +1 -0
  191. package/dist/schemas/worldbook-patch.d.ts +423 -0
  192. package/dist/schemas/worldbook-patch.js +78 -0
  193. package/dist/schemas/worldbook-patch.js.map +1 -0
  194. package/dist/server.d.ts +2 -0
  195. package/dist/server.js +15 -0
  196. package/dist/server.js.map +1 -0
  197. package/dist/storage/path-policy.d.ts +13 -0
  198. package/dist/storage/path-policy.js +44 -0
  199. package/dist/storage/path-policy.js.map +1 -0
  200. package/dist/storage/project-store.d.ts +8 -0
  201. package/dist/storage/project-store.js +113 -0
  202. package/dist/storage/project-store.js.map +1 -0
  203. package/dist/tools/character-card-tools.d.ts +2 -0
  204. package/dist/tools/character-card-tools.js +118 -0
  205. package/dist/tools/character-card-tools.js.map +1 -0
  206. package/dist/tools/decision-tools.d.ts +2 -0
  207. package/dist/tools/decision-tools.js +55 -0
  208. package/dist/tools/decision-tools.js.map +1 -0
  209. package/dist/tools/extraction-tools.d.ts +2 -0
  210. package/dist/tools/extraction-tools.js +57 -0
  211. package/dist/tools/extraction-tools.js.map +1 -0
  212. package/dist/tools/helpers.d.ts +9 -0
  213. package/dist/tools/helpers.js +14 -0
  214. package/dist/tools/helpers.js.map +1 -0
  215. package/dist/tools/lint-review-tools.d.ts +2 -0
  216. package/dist/tools/lint-review-tools.js +30 -0
  217. package/dist/tools/lint-review-tools.js.map +1 -0
  218. package/dist/tools/mvu-html-ejs-tools.d.ts +2 -0
  219. package/dist/tools/mvu-html-ejs-tools.js +153 -0
  220. package/dist/tools/mvu-html-ejs-tools.js.map +1 -0
  221. package/dist/tools/project-tools.d.ts +2 -0
  222. package/dist/tools/project-tools.js +39 -0
  223. package/dist/tools/project-tools.js.map +1 -0
  224. package/dist/tools/register.d.ts +2 -0
  225. package/dist/tools/register.js +23 -0
  226. package/dist/tools/register.js.map +1 -0
  227. package/dist/tools/style-chapter-tools.d.ts +2 -0
  228. package/dist/tools/style-chapter-tools.js +40 -0
  229. package/dist/tools/style-chapter-tools.js.map +1 -0
  230. package/dist/tools/workflow-tools.d.ts +2 -0
  231. package/dist/tools/workflow-tools.js +60 -0
  232. package/dist/tools/workflow-tools.js.map +1 -0
  233. package/dist/tools/worldbook-tools.d.ts +2 -0
  234. package/dist/tools/worldbook-tools.js +180 -0
  235. package/dist/tools/worldbook-tools.js.map +1 -0
  236. package/dist/tools/worldbuilding-tools.d.ts +2 -0
  237. package/dist/tools/worldbuilding-tools.js +40 -0
  238. package/dist/tools/worldbuilding-tools.js.map +1 -0
  239. package/dist/utils/ids.d.ts +2 -0
  240. package/dist/utils/ids.js +8 -0
  241. package/dist/utils/ids.js.map +1 -0
  242. package/dist/utils/json.d.ts +2 -0
  243. package/dist/utils/json.js +7 -0
  244. package/dist/utils/json.js.map +1 -0
  245. 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":"AAoCA,MAAM,CAAC,MAAM,kBAAkB,GAAG,4FAA4F,CAAC;AAE/H,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;IACjC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE;IACnC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;IACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;IAChC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;IAChC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE;CACrC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,GAAc;IAC3C,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;IAE7F,MAAM,gBAAgB,GAA0B;QAC9C;YACE,OAAO,EAAE,kBAAkB;YAC3B,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,EAAE;YACR,aAAa,EAAE,EAAE;YACjB,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;YACjC,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,KAAK;YACd,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,IAAI;SACvB;KACF,CAAC;IAEF,IAAI,GAAG,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;QACrC,gBAAgB,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,EAAE;YACR,aAAa,EAAE,EAAE;YACjB,OAAO,EAAE,8DAA8D,GAAG,CAAC,kBAAkB,gCAAgC;YAC7H,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC;YACR,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,IAAI,CACnB;QACE,OAAO,EAAE,oBAAoB;QAC7B,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,EAAE;QACR,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,GAAG,CAAC,YAAY;QACzB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,CAAC;QACR,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,IAAI;KACvB,EACD;QACE,OAAO,EAAE,oBAAoB;QAC7B,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,EAAE;QACR,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,mBAAmB,EAAE;QAC3D,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,CAAC;QACR,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,IAAI;KACvB,CACF,CAAC;IAEF,OAAO;QACL,gBAAgB;QAChB,YAAY,EAAE,iBAAiB,CAAC,GAAG,CAAC;QACpC,mBAAmB,EAAE;YACnB,YAAY,CAAC,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,CAAC;YAC5D,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;SAC5C;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAc;IACvC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YACvB,UAAU,EAAE,aAAa;YACzB,SAAS,EAAE,+CAA+C;YAC1D,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACjB,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC,CAAC;IACN,CAAC;IACD,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CACV,WAAW,CAAC;YACV,UAAU,EAAE,YAAY;YACxB,SAAS,EAAE,+CAA+C;YAC1D,aAAa,EAAE,oDAAoD;YACnE,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,CAAC,CAAC;SACf,CAAC,EACF,WAAW,CAAC;YACV,UAAU,EAAE,WAAW;YACvB,SAAS,EAAE,6DAA6D;YACxE,aAAa,EAAE,sDAAsD;YACrE,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,CAAC,CAAC;SACf,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,KAAmG;IACtH,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;QACjC,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;QACxC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK;QACrC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK;QACnC,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,CAAC;QAC3C,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;QAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,OAAe,EAAE,OAAkD;IACrG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAClH,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,OAAO,CAAC;IACpD,OAAO,cAAc,OAAO,cAAc,CAAC;AAC7C,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,4nBAA4nB,CAAC;AACtoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { MvuConfig } from "../schemas/mvu.js";
2
+ export declare function createMvuTemplate(input: {
3
+ characterNames: string[];
4
+ variableListPath?: string;
5
+ }): {
6
+ mvu: MvuConfig;
7
+ rules: string[];
8
+ };
@@ -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":"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"}
@@ -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;