@actalk/inkos-core 0.5.1 → 0.6.0

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 (169) hide show
  1. package/dist/agents/architect.d.ts +6 -1
  2. package/dist/agents/architect.d.ts.map +1 -1
  3. package/dist/agents/architect.js +362 -83
  4. package/dist/agents/architect.js.map +1 -1
  5. package/dist/agents/chapter-analyzer.d.ts +6 -0
  6. package/dist/agents/chapter-analyzer.d.ts.map +1 -1
  7. package/dist/agents/chapter-analyzer.js +220 -17
  8. package/dist/agents/chapter-analyzer.js.map +1 -1
  9. package/dist/agents/composer.d.ts +28 -0
  10. package/dist/agents/composer.d.ts.map +1 -0
  11. package/dist/agents/composer.js +154 -0
  12. package/dist/agents/composer.js.map +1 -0
  13. package/dist/agents/consolidator.d.ts.map +1 -1
  14. package/dist/agents/consolidator.js +17 -8
  15. package/dist/agents/consolidator.js.map +1 -1
  16. package/dist/agents/continuity.d.ts +10 -0
  17. package/dist/agents/continuity.d.ts.map +1 -1
  18. package/dist/agents/continuity.js +312 -133
  19. package/dist/agents/continuity.js.map +1 -1
  20. package/dist/agents/en-prompt-sections.d.ts.map +1 -1
  21. package/dist/agents/en-prompt-sections.js +1 -0
  22. package/dist/agents/en-prompt-sections.js.map +1 -1
  23. package/dist/agents/length-normalizer.d.ts +32 -0
  24. package/dist/agents/length-normalizer.d.ts.map +1 -0
  25. package/dist/agents/length-normalizer.js +156 -0
  26. package/dist/agents/length-normalizer.js.map +1 -0
  27. package/dist/agents/planner.d.ts +42 -0
  28. package/dist/agents/planner.d.ts.map +1 -0
  29. package/dist/agents/planner.js +382 -0
  30. package/dist/agents/planner.js.map +1 -0
  31. package/dist/agents/post-write-validator.d.ts +6 -1
  32. package/dist/agents/post-write-validator.d.ts.map +1 -1
  33. package/dist/agents/post-write-validator.js +88 -2
  34. package/dist/agents/post-write-validator.js.map +1 -1
  35. package/dist/agents/reviser.d.ts +10 -1
  36. package/dist/agents/reviser.d.ts.map +1 -1
  37. package/dist/agents/reviser.js +151 -36
  38. package/dist/agents/reviser.js.map +1 -1
  39. package/dist/agents/rules-reader.d.ts +1 -0
  40. package/dist/agents/rules-reader.d.ts.map +1 -1
  41. package/dist/agents/rules-reader.js +13 -0
  42. package/dist/agents/rules-reader.js.map +1 -1
  43. package/dist/agents/settler-delta-parser.d.ts +7 -0
  44. package/dist/agents/settler-delta-parser.d.ts.map +1 -0
  45. package/dist/agents/settler-delta-parser.js +35 -0
  46. package/dist/agents/settler-delta-parser.js.map +1 -0
  47. package/dist/agents/settler-prompts.d.ts +2 -0
  48. package/dist/agents/settler-prompts.d.ts.map +1 -1
  49. package/dist/agents/settler-prompts.js +77 -63
  50. package/dist/agents/settler-prompts.js.map +1 -1
  51. package/dist/agents/writer-parser.d.ts +3 -2
  52. package/dist/agents/writer-parser.d.ts.map +1 -1
  53. package/dist/agents/writer-parser.js +44 -13
  54. package/dist/agents/writer-parser.js.map +1 -1
  55. package/dist/agents/writer-prompts.d.ts +2 -1
  56. package/dist/agents/writer-prompts.d.ts.map +1 -1
  57. package/dist/agents/writer-prompts.js +65 -21
  58. package/dist/agents/writer-prompts.js.map +1 -1
  59. package/dist/agents/writer.d.ts +28 -1
  60. package/dist/agents/writer.d.ts.map +1 -1
  61. package/dist/agents/writer.js +426 -67
  62. package/dist/agents/writer.js.map +1 -1
  63. package/dist/index.d.ts +18 -3
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +17 -2
  66. package/dist/index.js.map +1 -1
  67. package/dist/llm/provider.d.ts +1 -0
  68. package/dist/llm/provider.d.ts.map +1 -1
  69. package/dist/llm/provider.js +19 -6
  70. package/dist/llm/provider.js.map +1 -1
  71. package/dist/models/chapter.d.ts +71 -0
  72. package/dist/models/chapter.d.ts.map +1 -1
  73. package/dist/models/chapter.js +3 -0
  74. package/dist/models/chapter.js.map +1 -1
  75. package/dist/models/input-governance.d.ts +351 -0
  76. package/dist/models/input-governance.d.ts.map +1 -0
  77. package/dist/models/input-governance.js +78 -0
  78. package/dist/models/input-governance.js.map +1 -0
  79. package/dist/models/length-governance.d.ts +93 -0
  80. package/dist/models/length-governance.d.ts.map +1 -0
  81. package/dist/models/length-governance.js +34 -0
  82. package/dist/models/length-governance.js.map +1 -0
  83. package/dist/models/project.d.ts +5 -0
  84. package/dist/models/project.d.ts.map +1 -1
  85. package/dist/models/project.js +2 -0
  86. package/dist/models/project.js.map +1 -1
  87. package/dist/models/runtime-state.d.ts +521 -0
  88. package/dist/models/runtime-state.d.ts.map +1 -0
  89. package/dist/models/runtime-state.js +78 -0
  90. package/dist/models/runtime-state.js.map +1 -0
  91. package/dist/pipeline/agent.d.ts +2 -1
  92. package/dist/pipeline/agent.d.ts.map +1 -1
  93. package/dist/pipeline/agent.js +90 -5
  94. package/dist/pipeline/agent.js.map +1 -1
  95. package/dist/pipeline/runner.d.ts +65 -1
  96. package/dist/pipeline/runner.d.ts.map +1 -1
  97. package/dist/pipeline/runner.js +1029 -73
  98. package/dist/pipeline/runner.js.map +1 -1
  99. package/dist/state/manager.d.ts +14 -0
  100. package/dist/state/manager.d.ts.map +1 -1
  101. package/dist/state/manager.js +114 -0
  102. package/dist/state/manager.js.map +1 -1
  103. package/dist/state/memory-db.d.ts +15 -0
  104. package/dist/state/memory-db.d.ts.map +1 -1
  105. package/dist/state/memory-db.js +119 -10
  106. package/dist/state/memory-db.js.map +1 -1
  107. package/dist/state/runtime-state-store.d.ts +23 -0
  108. package/dist/state/runtime-state-store.d.ts.map +1 -0
  109. package/dist/state/runtime-state-store.js +100 -0
  110. package/dist/state/runtime-state-store.js.map +1 -0
  111. package/dist/state/state-bootstrap.d.ts +19 -0
  112. package/dist/state/state-bootstrap.d.ts.map +1 -0
  113. package/dist/state/state-bootstrap.js +394 -0
  114. package/dist/state/state-bootstrap.js.map +1 -0
  115. package/dist/state/state-projections.d.ts +5 -0
  116. package/dist/state/state-projections.d.ts.map +1 -0
  117. package/dist/state/state-projections.js +164 -0
  118. package/dist/state/state-projections.js.map +1 -0
  119. package/dist/state/state-reducer.d.ts +12 -0
  120. package/dist/state/state-reducer.d.ts.map +1 -0
  121. package/dist/state/state-reducer.js +146 -0
  122. package/dist/state/state-reducer.js.map +1 -0
  123. package/dist/state/state-validator.d.ts +12 -0
  124. package/dist/state/state-validator.d.ts.map +1 -0
  125. package/dist/state/state-validator.js +56 -0
  126. package/dist/state/state-validator.js.map +1 -0
  127. package/dist/utils/chapter-splitter.d.ts +2 -0
  128. package/dist/utils/chapter-splitter.d.ts.map +1 -1
  129. package/dist/utils/chapter-splitter.js +22 -4
  130. package/dist/utils/chapter-splitter.js.map +1 -1
  131. package/dist/utils/config-loader.d.ts +3 -1
  132. package/dist/utils/config-loader.d.ts.map +1 -1
  133. package/dist/utils/config-loader.js +14 -3
  134. package/dist/utils/config-loader.js.map +1 -1
  135. package/dist/utils/context-filter.js +1 -1
  136. package/dist/utils/context-filter.js.map +1 -1
  137. package/dist/utils/governed-context.d.ts +7 -0
  138. package/dist/utils/governed-context.d.ts.map +1 -0
  139. package/dist/utils/governed-context.js +22 -0
  140. package/dist/utils/governed-context.js.map +1 -0
  141. package/dist/utils/governed-working-set.d.ts +18 -0
  142. package/dist/utils/governed-working-set.d.ts.map +1 -0
  143. package/dist/utils/governed-working-set.js +295 -0
  144. package/dist/utils/governed-working-set.js.map +1 -0
  145. package/dist/utils/hook-governance.d.ts +26 -0
  146. package/dist/utils/hook-governance.d.ts.map +1 -0
  147. package/dist/utils/hook-governance.js +128 -0
  148. package/dist/utils/hook-governance.js.map +1 -0
  149. package/dist/utils/hook-health.d.ts +14 -0
  150. package/dist/utils/hook-health.d.ts.map +1 -0
  151. package/dist/utils/hook-health.js +68 -0
  152. package/dist/utils/hook-health.js.map +1 -0
  153. package/dist/utils/length-metrics.d.ts +10 -0
  154. package/dist/utils/length-metrics.d.ts.map +1 -0
  155. package/dist/utils/length-metrics.js +85 -0
  156. package/dist/utils/length-metrics.js.map +1 -0
  157. package/dist/utils/long-span-fatigue.d.ts +28 -0
  158. package/dist/utils/long-span-fatigue.d.ts.map +1 -0
  159. package/dist/utils/long-span-fatigue.js +359 -0
  160. package/dist/utils/long-span-fatigue.js.map +1 -0
  161. package/dist/utils/memory-retrieval.d.ts +39 -0
  162. package/dist/utils/memory-retrieval.d.ts.map +1 -0
  163. package/dist/utils/memory-retrieval.js +574 -0
  164. package/dist/utils/memory-retrieval.js.map +1 -0
  165. package/dist/utils/spot-fix-patches.d.ts +14 -0
  166. package/dist/utils/spot-fix-patches.d.ts.map +1 -0
  167. package/dist/utils/spot-fix-patches.js +75 -0
  168. package/dist/utils/spot-fix-patches.js.map +1 -0
  169. package/package.json +1 -1
@@ -1,10 +1,16 @@
1
1
  import { BaseAgent } from "./base.js";
2
- import { readGenreProfile, readBookRules } from "./rules-reader.js";
2
+ import { readGenreProfile, readBookLanguage, readBookRules } from "./rules-reader.js";
3
+ import { countChapterLength } from "../utils/length-metrics.js";
4
+ import { buildGovernedMemoryEvidenceBlocks } from "../utils/governed-context.js";
5
+ import { filterSummaries } from "../utils/context-filter.js";
6
+ import { buildGovernedCharacterMatrixWorkingSet, buildGovernedHookWorkingSet, mergeTableMarkdownByKey, } from "../utils/governed-working-set.js";
7
+ import { applySpotFixPatches, parseSpotFixPatches } from "../utils/spot-fix-patches.js";
3
8
  import { readFile } from "node:fs/promises";
4
9
  import { join } from "node:path";
10
+ export const DEFAULT_REVISE_MODE = "spot-fix";
5
11
  const MODE_DESCRIPTIONS = {
6
12
  polish: "润色:只改表达、节奏、段落呼吸,不改事实与剧情结论。禁止:增删段落、改变人名/地名/物品名、增加新情节或新对话、改变因果关系。只允许:替换用词、调整句序、修改标点节奏",
7
- rewrite: "改写:可改叙述顺序、画面、力度,但保留核心事实与人物动机",
13
+ rewrite: "改写:允许重组问题段落、调整画面和叙述力度,但优先保留原文的绝大部分句段。除非问题跨越整章,否则禁止整章推倒重写;只能围绕问题段落及其直接上下文改写,同时保留核心事实与人物动机",
8
14
  rework: "重写:可重构场景推进和冲突组织,但不改主设定和大事件结果",
9
15
  "anti-detect": `反检测改写:在保持剧情不变的前提下,降低AI生成可检测性。
10
16
 
@@ -24,7 +30,7 @@ export class ReviserAgent extends BaseAgent {
24
30
  get name() {
25
31
  return "reviser";
26
32
  }
27
- async reviseChapter(bookDir, chapterContent, chapterNumber, issues, mode = "rewrite", genre) {
33
+ async reviseChapter(bookDir, chapterContent, chapterNumber, issues, mode = DEFAULT_REVISE_MODE, genre, options) {
28
34
  const [currentState, ledger, hooks, styleGuideRaw, volumeOutline, storyBible, characterMatrix, chapterSummaries, parentCanon, fanficCanon] = await Promise.all([
29
35
  this.readFileSafe(join(bookDir, "story/current_state.md")),
30
36
  this.readFileSafe(join(bookDir, "story/particle_ledger.md")),
@@ -39,7 +45,10 @@ export class ReviserAgent extends BaseAgent {
39
45
  ]);
40
46
  // Load genre profile and book rules
41
47
  const genreId = genre ?? "other";
42
- const { profile: gp } = await readGenreProfile(this.ctx.projectRoot, genreId);
48
+ const [{ profile: gp }, bookLanguage] = await Promise.all([
49
+ readGenreProfile(this.ctx.projectRoot, genreId),
50
+ readBookLanguage(bookDir),
51
+ ]);
43
52
  const parsedRules = await readBookRules(bookDir);
44
53
  const bookRules = parsedRules?.rules ?? null;
45
54
  // Fallback: use book_rules body when style_guide.md doesn't exist
@@ -56,10 +65,65 @@ export class ReviserAgent extends BaseAgent {
56
65
  const protagonistBlock = bookRules?.protagonist
57
66
  ? `\n\n主角人设锁定:${bookRules.protagonist.name},${bookRules.protagonist.personalityLock.join("、")}。修改不得违反人设。`
58
67
  : "";
59
- const isEnglish = gp.language === "en";
68
+ const lengthGuardrail = options?.lengthSpec
69
+ ? `\n8. 保持章节字数在目标区间内;只有在修复关键问题确实需要时才允许轻微偏离`
70
+ : "";
71
+ const isEnglish = (bookLanguage ?? gp.language) === "en";
72
+ const resolvedLanguage = isEnglish ? "en" : "zh";
60
73
  const langPrefix = isEnglish
61
- ? `【LANGUAGE OVERRIDE】ALL output (FIXED_ISSUES, REVISED_CONTENT, UPDATED_STATE, UPDATED_HOOKS) MUST be in English. The revised chapter content must be written entirely in English.\n\n`
74
+ ? mode === "spot-fix"
75
+ ? `【LANGUAGE OVERRIDE】ALL output (FIXED_ISSUES, PATCHES, UPDATED_STATE, UPDATED_HOOKS) MUST be in English. Every TARGET_TEXT and REPLACEMENT_TEXT must be written entirely in English.\n\n`
76
+ : `【LANGUAGE OVERRIDE】ALL output (FIXED_ISSUES, REVISED_CONTENT, UPDATED_STATE, UPDATED_HOOKS) MUST be in English. The revised chapter content must be written entirely in English.\n\n`
62
77
  : "";
78
+ const governedMode = Boolean(options?.chapterIntent && options?.contextPackage && options?.ruleStack);
79
+ const hooksWorkingSet = governedMode && options?.contextPackage
80
+ ? buildGovernedHookWorkingSet({
81
+ hooksMarkdown: hooks,
82
+ contextPackage: options.contextPackage,
83
+ chapterNumber,
84
+ language: resolvedLanguage,
85
+ })
86
+ : hooks;
87
+ const chapterSummariesWorkingSet = governedMode
88
+ ? filterSummaries(chapterSummaries, chapterNumber)
89
+ : chapterSummaries;
90
+ const characterMatrixWorkingSet = governedMode
91
+ ? buildGovernedCharacterMatrixWorkingSet({
92
+ matrixMarkdown: characterMatrix,
93
+ chapterIntent: options?.chapterIntent ?? volumeOutline,
94
+ contextPackage: options.contextPackage,
95
+ protagonistName: bookRules?.protagonist?.name,
96
+ })
97
+ : characterMatrix;
98
+ const outputFormat = mode === "spot-fix"
99
+ ? `=== FIXED_ISSUES ===
100
+ (逐条说明修正了什么,一行一条;如果无法安全定点修复,也在这里说明)
101
+
102
+ === PATCHES ===
103
+ (只输出需要替换的局部补丁,不得输出整章重写。格式如下,可重复多个 PATCH 区块)
104
+ --- PATCH 1 ---
105
+ TARGET_TEXT:
106
+ (必须从原文中精确复制、且能唯一命中的原句或原段)
107
+ REPLACEMENT_TEXT:
108
+ (替换后的局部文本)
109
+ --- END PATCH ---
110
+
111
+ === UPDATED_STATE ===
112
+ (更新后的完整状态卡)
113
+ ${gp.numericalSystem ? "\n=== UPDATED_LEDGER ===\n(更新后的完整资源账本)" : ""}
114
+ === UPDATED_HOOKS ===
115
+ (更新后的完整伏笔池)`
116
+ : `=== FIXED_ISSUES ===
117
+ (逐条说明修正了什么,一行一条)
118
+
119
+ === REVISED_CONTENT ===
120
+ (修正后的完整正文)
121
+
122
+ === UPDATED_STATE ===
123
+ (更新后的完整状态卡)
124
+ ${gp.numericalSystem ? "\n=== UPDATED_LEDGER ===\n(更新后的完整资源账本)" : ""}
125
+ === UPDATED_HOOKS ===
126
+ (更新后的完整伏笔池)`;
63
127
  const systemPrompt = `${langPrefix}你是一位专业的${gp.name}网络小说修稿编辑。你的任务是根据审稿意见对章节进行修正。${protagonistBlock}
64
128
 
65
129
  修稿模式:${modeDesc}
@@ -71,35 +135,34 @@ export class ReviserAgent extends BaseAgent {
71
135
  5. 不改变剧情走向和核心冲突
72
136
  6. 保持原文的语言风格和节奏
73
137
  7. 修改后同步更新状态卡${gp.numericalSystem ? "、账本" : ""}、伏笔池
138
+ ${lengthGuardrail}
139
+ ${mode === "spot-fix" ? "\n9. spot-fix 只能输出局部补丁,禁止输出整章改写;TARGET_TEXT 必须能在原文中唯一命中\n10. 如果需要大面积改写,说明无法安全 spot-fix,并让 PATCHES 留空" : ""}
74
140
 
75
141
  输出格式:
76
142
 
77
- === FIXED_ISSUES ===
78
- (逐条说明修正了什么,一行一条)
79
-
80
- === REVISED_CONTENT ===
81
- (修正后的完整正文)
82
-
83
- === UPDATED_STATE ===
84
- (更新后的完整状态卡)
85
- ${gp.numericalSystem ? "\n=== UPDATED_LEDGER ===\n(更新后的完整资源账本)" : ""}
86
- === UPDATED_HOOKS ===
87
- (更新后的完整伏笔池)`;
143
+ ${outputFormat}`;
88
144
  const ledgerBlock = gp.numericalSystem
89
145
  ? `\n## 资源账本\n${ledger}`
90
146
  : "";
147
+ const governedMemoryBlocks = options?.contextPackage
148
+ ? buildGovernedMemoryEvidenceBlocks(options.contextPackage, resolvedLanguage)
149
+ : undefined;
150
+ const hooksBlock = governedMemoryBlocks?.hooksBlock
151
+ ?? `\n## 伏笔池\n${hooksWorkingSet}\n`;
91
152
  const outlineBlock = volumeOutline !== "(文件不存在)"
92
153
  ? `\n## 卷纲\n${volumeOutline}\n`
93
154
  : "";
94
- const bibleBlock = storyBible !== "(文件不存在)"
155
+ const bibleBlock = !governedMode && storyBible !== "(文件不存在)"
95
156
  ? `\n## 世界观设定\n${storyBible}\n`
96
157
  : "";
97
- const matrixBlock = characterMatrix !== "(文件不存在)"
98
- ? `\n## 角色交互矩阵\n${characterMatrix}\n`
99
- : "";
100
- const summariesBlock = chapterSummaries !== "(文件不存在)"
101
- ? `\n## 章节摘要\n${chapterSummaries}\n`
158
+ const matrixBlock = characterMatrixWorkingSet !== "(文件不存在)"
159
+ ? `\n## 角色交互矩阵\n${characterMatrixWorkingSet}\n`
102
160
  : "";
161
+ const summariesBlock = governedMemoryBlocks?.summariesBlock
162
+ ?? (chapterSummariesWorkingSet !== "(文件不存在)"
163
+ ? `\n## 章节摘要\n${chapterSummariesWorkingSet}\n`
164
+ : "");
165
+ const volumeSummariesBlock = governedMemoryBlocks?.volumeSummariesBlock ?? "";
103
166
  const hasParentCanon = parentCanon !== "(文件不存在)";
104
167
  const hasFanficCanon = fanficCanon !== "(文件不存在)";
105
168
  const canonBlock = hasParentCanon
@@ -108,6 +171,15 @@ ${gp.numericalSystem ? "\n=== UPDATED_LEDGER ===\n(更新后的完整资源账
108
171
  const fanficCanonBlock = hasFanficCanon
109
172
  ? `\n## 同人正典参照(修稿专用)\n本书为同人作品。修改时参照正典角色档案和世界规则,不可违反正典事实。角色对话必须保留原作语癖。\n${fanficCanon}\n`
110
173
  : "";
174
+ const reducedControlBlock = options?.chapterIntent && options.contextPackage && options.ruleStack
175
+ ? this.buildReducedControlBlock(options.chapterIntent, options.contextPackage, options.ruleStack)
176
+ : "";
177
+ const lengthGuidanceBlock = options?.lengthSpec
178
+ ? `\n## 字数护栏\n目标字数:${options.lengthSpec.target}\n允许区间:${options.lengthSpec.softMin}-${options.lengthSpec.softMax}\n极限区间:${options.lengthSpec.hardMin}-${options.lengthSpec.hardMax}\n如果修正后超出允许区间,请优先压缩冗余解释、重复动作和弱信息句,不得新增支线或删掉核心事实。\n`
179
+ : "";
180
+ const styleGuideBlock = reducedControlBlock.length === 0
181
+ ? `\n## 文风指南\n${styleGuide}`
182
+ : "";
111
183
  const userPrompt = `请修正第${chapterNumber}章。
112
184
 
113
185
  ## 审稿问题
@@ -116,11 +188,7 @@ ${issueList}
116
188
  ## 当前状态卡
117
189
  ${currentState}
118
190
  ${ledgerBlock}
119
- ## 伏笔池
120
- ${hooks}
121
- ${outlineBlock}${bibleBlock}${matrixBlock}${summariesBlock}${canonBlock}${fanficCanonBlock}
122
- ## 文风指南
123
- ${styleGuide}
191
+ ${hooksBlock}${volumeSummariesBlock}${reducedControlBlock || outlineBlock}${bibleBlock}${matrixBlock}${summariesBlock}${canonBlock}${fanficCanonBlock}${styleGuideBlock}${lengthGuidanceBlock}
124
192
 
125
193
  ## 待修正章节
126
194
  ${chapterContent}`;
@@ -129,24 +197,48 @@ ${chapterContent}`;
129
197
  { role: "system", content: systemPrompt },
130
198
  { role: "user", content: userPrompt },
131
199
  ], { temperature: 0.3, maxTokens });
132
- const output = this.parseOutput(response.content, gp);
133
- return { ...output, tokenUsage: response.usage };
200
+ const output = this.parseOutput(response.content, gp, mode, chapterContent);
201
+ const mergedOutput = governedMode
202
+ ? {
203
+ ...output,
204
+ updatedHooks: mergeTableMarkdownByKey(hooks, output.updatedHooks, [0]),
205
+ }
206
+ : output;
207
+ const wordCount = options?.lengthSpec
208
+ ? countChapterLength(mergedOutput.revisedContent, options.lengthSpec.countingMode)
209
+ : mergedOutput.wordCount;
210
+ return { ...mergedOutput, wordCount, tokenUsage: response.usage };
134
211
  }
135
- parseOutput(content, gp) {
212
+ parseOutput(content, gp, mode, originalChapter) {
136
213
  const extract = (tag) => {
137
214
  const regex = new RegExp(`=== ${tag} ===\\s*([\\s\\S]*?)(?==== [A-Z_]+ ===|$)`);
138
215
  const match = content.match(regex);
139
216
  return match?.[1]?.trim() ?? "";
140
217
  };
141
- const revisedContent = extract("REVISED_CONTENT");
142
218
  const fixedRaw = extract("FIXED_ISSUES");
219
+ const fixedIssues = fixedRaw
220
+ .split("\n")
221
+ .map((l) => l.trim())
222
+ .filter((l) => l.length > 0);
223
+ if (mode === "spot-fix") {
224
+ const patches = parseSpotFixPatches(extract("PATCHES"));
225
+ const patchResult = applySpotFixPatches(originalChapter, patches);
226
+ return {
227
+ revisedContent: patchResult.revisedContent,
228
+ wordCount: patchResult.revisedContent.length,
229
+ fixedIssues: patchResult.applied ? fixedIssues : [],
230
+ updatedState: extract("UPDATED_STATE") || "(状态卡未更新)",
231
+ updatedLedger: gp.numericalSystem
232
+ ? (extract("UPDATED_LEDGER") || "(账本未更新)")
233
+ : "",
234
+ updatedHooks: extract("UPDATED_HOOKS") || "(伏笔池未更新)",
235
+ };
236
+ }
237
+ const revisedContent = extract("REVISED_CONTENT");
143
238
  return {
144
239
  revisedContent,
145
240
  wordCount: revisedContent.length,
146
- fixedIssues: fixedRaw
147
- .split("\n")
148
- .map((l) => l.trim())
149
- .filter((l) => l.length > 0),
241
+ fixedIssues,
150
242
  updatedState: extract("UPDATED_STATE") || "(状态卡未更新)",
151
243
  updatedLedger: gp.numericalSystem
152
244
  ? (extract("UPDATED_LEDGER") || "(账本未更新)")
@@ -162,5 +254,28 @@ ${chapterContent}`;
162
254
  return "(文件不存在)";
163
255
  }
164
256
  }
257
+ buildReducedControlBlock(chapterIntent, contextPackage, ruleStack) {
258
+ const selectedContext = contextPackage.selectedContext
259
+ .map((entry) => `- ${entry.source}: ${entry.reason}${entry.excerpt ? ` | ${entry.excerpt}` : ""}`)
260
+ .join("\n");
261
+ const overrides = ruleStack.activeOverrides.length > 0
262
+ ? ruleStack.activeOverrides
263
+ .map((override) => `- ${override.from} -> ${override.to}: ${override.reason} (${override.target})`)
264
+ .join("\n")
265
+ : "- none";
266
+ return `\n## 本章控制输入(由 Planner/Composer 编译)
267
+ ${chapterIntent}
268
+
269
+ ### 已选上下文
270
+ ${selectedContext || "- none"}
271
+
272
+ ### 规则栈
273
+ - 硬护栏:${ruleStack.sections.hard.join("、") || "(无)"}
274
+ - 软约束:${ruleStack.sections.soft.join("、") || "(无)"}
275
+ - 诊断规则:${ruleStack.sections.diagnostic.join("、") || "(无)"}
276
+
277
+ ### 当前覆盖
278
+ ${overrides}\n`;
279
+ }
165
280
  }
166
281
  //# sourceMappingURL=reviser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reviser.js","sourceRoot":"","sources":["../../src/agents/reviser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reviser.js","sourceRoot":"","sources":["../../src/agents/reviser.ts"],"names":[],"mappings":"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"}
@@ -23,4 +23,5 @@ export declare function getBuiltinGenresDir(): string;
23
23
  * Returns null if the file doesn't exist.
24
24
  */
25
25
  export declare function readBookRules(bookDir: string): Promise<ParsedBookRules | null>;
26
+ export declare function readBookLanguage(bookDir: string): Promise<"zh" | "en" | undefined>;
26
27
  //# sourceMappingURL=rules-reader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules-reader.d.ts","sourceRoot":"","sources":["../../src/agents/rules-reader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAY/E;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAe7B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC,CA+BhH;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAIpF"}
1
+ {"version":3,"file":"rules-reader.d.ts","sourceRoot":"","sources":["../../src/agents/rules-reader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAa/E;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAe7B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC,CA+BhH;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAIpF;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,CAUxF"}
@@ -3,6 +3,7 @@ import { join, dirname } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { parseGenreProfile } from "../models/genre-profile.js";
5
5
  import { parseBookRules } from "../models/book-rules.js";
6
+ import { BookConfigSchema } from "../models/book.js";
6
7
  const BUILTIN_GENRES_DIR = join(dirname(fileURLToPath(import.meta.url)), "../../genres");
7
8
  async function tryReadFile(path) {
8
9
  try {
@@ -83,4 +84,16 @@ export async function readBookRules(bookDir) {
83
84
  return null;
84
85
  return parseBookRules(raw);
85
86
  }
87
+ export async function readBookLanguage(bookDir) {
88
+ const raw = await tryReadFile(join(bookDir, "book.json"));
89
+ if (!raw)
90
+ return undefined;
91
+ try {
92
+ const parsed = BookConfigSchema.pick({ language: true }).safeParse(JSON.parse(raw));
93
+ return parsed.success ? parsed.data.language : undefined;
94
+ }
95
+ catch {
96
+ return undefined;
97
+ }
98
+ }
86
99
  //# sourceMappingURL=rules-reader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules-reader.js","sourceRoot":"","sources":["../../src/agents/rules-reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules-reader.js","sourceRoot":"","sources":["../../src/agents/rules-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type RuntimeStateDelta } from "../models/runtime-state.js";
2
+ export interface SettlerDeltaOutput {
3
+ readonly postSettlement: string;
4
+ readonly runtimeStateDelta: RuntimeStateDelta;
5
+ }
6
+ export declare function parseSettlerDeltaOutput(content: string): SettlerDeltaOutput;
7
+ //# sourceMappingURL=settler-delta-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settler-delta-parser.d.ts","sourceRoot":"","sources":["../../src/agents/settler-delta-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;CAC/C;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CA8B3E"}
@@ -0,0 +1,35 @@
1
+ import { RuntimeStateDeltaSchema, } from "../models/runtime-state.js";
2
+ export function parseSettlerDeltaOutput(content) {
3
+ const extract = (tag) => {
4
+ const regex = new RegExp(`=== ${tag} ===\\s*([\\s\\S]*?)(?==== [A-Z_]+ ===|$)`);
5
+ const match = content.match(regex);
6
+ return match?.[1]?.trim() ?? "";
7
+ };
8
+ const rawDelta = extract("RUNTIME_STATE_DELTA");
9
+ if (!rawDelta) {
10
+ throw new Error("runtime state delta block is missing");
11
+ }
12
+ const jsonPayload = stripCodeFence(rawDelta);
13
+ let parsed;
14
+ try {
15
+ parsed = JSON.parse(jsonPayload);
16
+ }
17
+ catch (error) {
18
+ throw new Error(`runtime state delta is not valid JSON: ${String(error)}`);
19
+ }
20
+ try {
21
+ return {
22
+ postSettlement: extract("POST_SETTLEMENT"),
23
+ runtimeStateDelta: RuntimeStateDeltaSchema.parse(parsed),
24
+ };
25
+ }
26
+ catch (error) {
27
+ throw new Error(`runtime state delta failed schema validation: ${String(error)}`);
28
+ }
29
+ }
30
+ function stripCodeFence(value) {
31
+ const trimmed = value.trim();
32
+ const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i);
33
+ return fenced?.[1]?.trim() ?? trimmed;
34
+ }
35
+ //# sourceMappingURL=settler-delta-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settler-delta-parser.js","sourceRoot":"","sources":["../../src/agents/settler-delta-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAExB,MAAM,4BAA4B,CAAC;AAOpC,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,OAAO,GAAG,2CAA2C,CACtD,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,CAAC;QACH,OAAO;YACL,cAAc,EAAE,OAAO,CAAC,iBAAiB,CAAC;YAC1C,iBAAiB,EAAE,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC;SACzD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACnE,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC;AACxC,CAAC"}
@@ -15,5 +15,7 @@ export declare function buildSettlerUserPrompt(params: {
15
15
  readonly characterMatrix: string;
16
16
  readonly volumeOutline: string;
17
17
  readonly observations?: string;
18
+ readonly selectedEvidenceBlock?: string;
19
+ readonly governedControlBlock?: string;
18
20
  }): string;
19
21
  //# sourceMappingURL=settler-prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settler-prompts.d.ts","sourceRoot":"","sources":["../../src/agents/settler-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,UAAU,EAChB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GACrB,MAAM,CA8DR;AA6DD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,MAAM,CAyCT"}
1
+ {"version":3,"file":"settler-prompts.d.ts","sourceRoot":"","sources":["../../src/agents/settler-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,UAAU,EAChB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GACrB,MAAM,CAgER;AAiED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC,GAAG,MAAM,CAgDT"}
@@ -6,12 +6,14 @@ export function buildSettlerSystemPrompt(book, genreProfile, bookRules, language
6
6
  - 数值验算铁律:期初 + 增量 = 期末,三项必须可验算`
7
7
  : `\n- 本题材无数值系统,UPDATED_LEDGER 留空`;
8
8
  const hookRules = `
9
- ## 伏笔追踪规则
10
-
11
- - 新伏笔:正文中出现的暗示、悬念、未解之谜 新增 hook_id,标注起始章、类型、状态=待定
12
- - 推进伏笔:已有伏笔在本章有新进展更新"最近推进"列和状态
13
- - 回收伏笔:伏笔在本章明确揭示/解决状态改为"已回收"
14
- - 延后伏笔:超过5章未推进标注"延后",备注原因`;
9
+ ## 伏笔追踪规则(严格执行)
10
+
11
+ - 新伏笔:只有当正文中出现一个会延续到后续章节、且有具体回收方向的未解问题时,才新增 hook_id。不要为旧 hook 的换说法、重述、抽象总结再开新 hook
12
+ - 提及伏笔:已有伏笔在本章被提到,但没有新增信息、没有改变读者或角色对该问题的理解放入 mention 数组,不要更新最近推进
13
+ - 推进伏笔:已有伏笔在本章出现了新的事实、证据、关系变化、风险升级或范围收缩**必须**更新"最近推进"列为当前章节号,更新状态和备注
14
+ - 回收伏笔:伏笔在本章被明确揭示、解决、或不再成立状态改为"已回收",备注回收方式
15
+ - 延后伏笔:超过5章未推进 → 标注"延后",备注原因
16
+ - **铁律**:不要把“再次提到”“换个说法重述”“抽象复盘”当成推进。只有状态真的变了,才更新最近推进。只是出现过的旧 hook,放进 mention 数组。`;
15
17
  const fullCastBlock = bookRules?.enableFullCastTracking
16
18
  ? `\n## 全员追踪\nPOST_SETTLEMENT 必须额外包含:本章出场角色清单、角色间关系变动、未出场但被提及的角色。`
17
19
  : "";
@@ -58,60 +60,65 @@ ${buildSettlerOutputFormat(genreProfile)}
58
60
  4. 角色交互矩阵中的"信息边界"要准确——角色只知道他在场时发生的事`;
59
61
  }
60
62
  function buildSettlerOutputFormat(gp) {
61
- const postSettlement = gp.numericalSystem
62
- ? `=== POST_SETTLEMENT ===
63
- (如有数值变动,必须输出Markdown表格)
64
- | 结算项 | 本章记录 | 备注 |
65
- |--------|----------|------|
66
- | 资源账本 | 期初X / 增量+Y / 期末Z | 无增量写+0 |
67
- | 重要资源 | 资源名 -> 贡献+Y(依据) | 无写"无" |
68
- | 伏笔变动 | 新增/回收/延后 Hook | 同步更新伏笔池 |`
69
- : `=== POST_SETTLEMENT ===
70
- (如有伏笔变动,必须输出)
71
- | 结算项 | 本章记录 | 备注 |
72
- |--------|----------|------|
73
- | 伏笔变动 | 新增/回收/延后 Hook | 同步更新伏笔池 |`;
74
- const updatedLedger = gp.numericalSystem
75
- ? `\n=== UPDATED_LEDGER ===\n(更新后的完整资源账本,Markdown表格格式)`
76
- : "";
77
- return `${postSettlement}
78
-
79
- === UPDATED_STATE ===
80
- (更新后的完整状态卡,Markdown表格格式)
81
- ${updatedLedger}
82
- === UPDATED_HOOKS ===
83
- (更新后的完整伏笔池,Markdown表格格式)
84
-
85
- === CHAPTER_SUMMARY ===
86
- (本章摘要,Markdown表格格式,必须包含以下列)
87
- | 章节 | 标题 | 出场人物 | 关键事件 | 状态变化 | 伏笔动态 | 情绪基调 | 章节类型 |
88
- |------|------|----------|----------|----------|----------|----------|----------|
89
- | N | 本章标题 | 角色1,角色2 | 一句话概括 | 关键变化 | H01埋设/H02推进 | 情绪走向 | ${gp.chapterTypes.length > 0 ? gp.chapterTypes.join("/") : "过渡/冲突/高潮/收束"} |
90
-
91
- === UPDATED_SUBPLOTS ===
92
- (更新后的完整支线进度板,Markdown表格格式)
93
- | 支线ID | 支线名 | 相关角色 | 起始章 | 最近活跃章 | 距今章数 | 状态 | 进度概述 | 回收ETA |
94
- |--------|--------|----------|--------|------------|----------|------|----------|---------|
95
-
96
- === UPDATED_EMOTIONAL_ARCS ===
97
- (更新后的完整情感弧线,Markdown表格格式)
98
- | 角色 | 章节 | 情绪状态 | 触发事件 | 强度(1-10) | 弧线方向 |
99
- |------|------|----------|----------|------------|----------|
100
-
101
- === UPDATED_CHARACTER_MATRIX ===
102
- (更新后的角色交互矩阵,分三个子表)
103
-
104
- ### 角色档案
105
- | 角色 | 核心标签 | 反差细节 | 说话风格 | 性格底色 | 与主角关系 | 核心动机 | 当前目标 |
106
- |------|----------|----------|----------|----------|------------|----------|----------|
107
-
108
- ### 相遇记录
109
- | 角色A | 角色B | 首次相遇章 | 最近交互章 | 关系性质 | 关系变化 |
110
- |-------|-------|------------|------------|----------|----------|
111
-
112
- ### 信息边界
113
- | 角色 | 已知信息 | 未知信息 | 信息来源章 |
114
- |------|----------|----------|------------|`;
63
+ const chapterTypeExample = gp.chapterTypes.length > 0
64
+ ? gp.chapterTypes[0]
65
+ : "主线推进";
66
+ return `=== POST_SETTLEMENT ===
67
+ (简要说明本章有哪些状态变动、伏笔推进、结算注意事项;允许 Markdown 表格或要点)
68
+
69
+ === RUNTIME_STATE_DELTA ===
70
+ (必须输出 JSON,不要输出 Markdown,不要加解释)
71
+ \`\`\`json
72
+ {
73
+ "chapter": 12,
74
+ "currentStatePatch": {
75
+ "currentLocation": "可选",
76
+ "protagonistState": "可选",
77
+ "currentGoal": "可选",
78
+ "currentConstraint": "可选",
79
+ "currentAlliances": "可选",
80
+ "currentConflict": "可选"
81
+ },
82
+ "hookOps": {
83
+ "upsert": [
84
+ {
85
+ "hookId": "mentor-oath",
86
+ "startChapter": 8,
87
+ "type": "relationship",
88
+ "status": "progressing",
89
+ "lastAdvancedChapter": 12,
90
+ "expectedPayoff": "揭开师债真相",
91
+ "notes": "本章为何推进/延后/回收"
92
+ }
93
+ ],
94
+ "mention": ["本章只是被提到、没有真实推进的 hookId"],
95
+ "resolve": ["已回收的 hookId"],
96
+ "defer": ["需要标记延后的 hookId"]
97
+ },
98
+ "chapterSummary": {
99
+ "chapter": 12,
100
+ "title": "本章标题",
101
+ "characters": "角色1,角色2",
102
+ "events": "一句话概括关键事件",
103
+ "stateChanges": "一句话概括状态变化",
104
+ "hookActivity": "mentor-oath advanced",
105
+ "mood": "紧绷",
106
+ "chapterType": "${chapterTypeExample}"
107
+ },
108
+ "subplotOps": [],
109
+ "emotionalArcOps": [],
110
+ "characterMatrixOps": [],
111
+ "notes": []
112
+ }
113
+ \`\`\`
114
+
115
+ 规则:
116
+ 1. 只输出增量,不要重写完整 truth files
117
+ 2. 所有章节号字段都必须是整数,不能写自然语言
118
+ 3. 如果旧 hook 只是被提到、没有真实状态变化,把它放进 mention,不要更新 lastAdvancedChapter
119
+ 4. 如果本章推进了旧 hook,lastAdvancedChapter 必须等于当前章号
120
+ 5. 如果回收或延后 hook,必须放在 resolve / defer 数组里
121
+ 6. chapterSummary.chapter 必须等于当前章节号`;
115
122
  }
116
123
  export function buildSettlerUserPrompt(params) {
117
124
  const ledgerBlock = params.ledger
@@ -132,20 +139,27 @@ export function buildSettlerUserPrompt(params) {
132
139
  const observationsBlock = params.observations
133
140
  ? `\n## 观察日志(由 Observer 提取,包含本章所有事实变化)\n${params.observations}\n\n基于以上观察日志和正文,更新所有追踪文件。确保观察日志中的每一项变化都反映在对应的文件中。\n`
134
141
  : "";
142
+ const selectedEvidenceBlock = params.selectedEvidenceBlock
143
+ ? `\n## 已选长程证据\n${params.selectedEvidenceBlock}\n`
144
+ : "";
145
+ const controlBlock = params.governedControlBlock ?? "";
146
+ const outlineBlock = controlBlock.length === 0
147
+ ? `\n## 卷纲\n${params.volumeOutline}\n`
148
+ : "";
135
149
  return `请分析第${params.chapterNumber}章「${params.title}」的正文,更新所有追踪文件。
136
150
  ${observationsBlock}
137
151
  ## 本章正文
138
152
 
139
153
  ${params.content}
154
+ ${controlBlock}
140
155
 
141
156
  ## 当前状态卡
142
157
  ${params.currentState}
143
158
  ${ledgerBlock}
144
159
  ## 当前伏笔池
145
160
  ${params.hooks}
146
- ${summariesBlock}${subplotBlock}${emotionalBlock}${matrixBlock}
147
- ## 卷纲
148
- ${params.volumeOutline}
161
+ ${selectedEvidenceBlock}${summariesBlock}${subplotBlock}${emotionalBlock}${matrixBlock}
162
+ ${outlineBlock}
149
163
 
150
164
  请严格按照 === TAG === 格式输出结算结果。`;
151
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"settler-prompts.js","sourceRoot":"","sources":["../../src/agents/settler-prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settler-prompts.js","sourceRoot":"","sources":["../../src/agents/settler-prompts.ts"],"names":[],"mappings":"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"}