@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
@@ -0,0 +1,295 @@
1
+ import { isHookWithinChapterWindow, parsePendingHooksMarkdown, renderHookSnapshot, } from "./memory-retrieval.js";
2
+ export function buildGovernedHookWorkingSet(params) {
3
+ const { hooksMarkdown } = params;
4
+ if (!hooksMarkdown || hooksMarkdown === "(文件不存在)" || hooksMarkdown === "(文件尚未创建)") {
5
+ return hooksMarkdown;
6
+ }
7
+ const hooks = parsePendingHooksMarkdown(hooksMarkdown);
8
+ if (hooks.length === 0) {
9
+ return hooksMarkdown;
10
+ }
11
+ const selectedIds = new Set(params.contextPackage.selectedContext
12
+ .filter((entry) => entry.source.startsWith("story/pending_hooks.md#"))
13
+ .map((entry) => entry.source.slice("story/pending_hooks.md#".length))
14
+ .filter(Boolean));
15
+ const agendaIds = collectHookAgendaIds(params.chapterIntent);
16
+ const workingSet = hooks.filter((hook) => selectedIds.has(hook.hookId)
17
+ || agendaIds.has(hook.hookId)
18
+ || isHookWithinChapterWindow(hook, params.chapterNumber, params.keepRecent ?? 5));
19
+ if (workingSet.length === 0 || workingSet.length >= hooks.length) {
20
+ return hooksMarkdown;
21
+ }
22
+ return renderHookSnapshot(workingSet, params.language);
23
+ }
24
+ function collectHookAgendaIds(chapterIntent) {
25
+ if (!chapterIntent || chapterIntent.trim().length === 0) {
26
+ return new Set();
27
+ }
28
+ const ids = new Set();
29
+ const lines = chapterIntent.split("\n");
30
+ let inHookAgenda = false;
31
+ let captureIds = false;
32
+ for (const rawLine of lines) {
33
+ const line = rawLine.trim();
34
+ if (line === "## Hook Agenda") {
35
+ inHookAgenda = true;
36
+ captureIds = false;
37
+ continue;
38
+ }
39
+ if (!inHookAgenda) {
40
+ continue;
41
+ }
42
+ if (line.startsWith("## ") && line !== "## Hook Agenda") {
43
+ break;
44
+ }
45
+ if (line === "### Must Advance" || line === "### Eligible Resolve" || line === "### Stale Debt") {
46
+ captureIds = true;
47
+ continue;
48
+ }
49
+ if (line.startsWith("### ")) {
50
+ captureIds = false;
51
+ continue;
52
+ }
53
+ if (!captureIds || !line.startsWith("- ")) {
54
+ continue;
55
+ }
56
+ const value = line.slice(2).trim();
57
+ if (value && value.toLowerCase() !== "none") {
58
+ ids.add(value);
59
+ }
60
+ }
61
+ return ids;
62
+ }
63
+ export function mergeTableMarkdownByKey(original, updated, keyColumns) {
64
+ const originalTable = parseSingleTable(original);
65
+ const updatedTable = parseSingleTable(updated);
66
+ if (!originalTable || !updatedTable || updatedTable.dataRows.length === 0) {
67
+ return updated;
68
+ }
69
+ const mergedRows = [...originalTable.dataRows];
70
+ const originalIndex = new Map();
71
+ mergedRows.forEach((row, index) => {
72
+ originalIndex.set(buildKey(row, keyColumns), index);
73
+ });
74
+ for (const row of updatedTable.dataRows) {
75
+ const key = buildKey(row, keyColumns);
76
+ const existing = originalIndex.get(key);
77
+ if (existing === undefined) {
78
+ originalIndex.set(key, mergedRows.length);
79
+ mergedRows.push(row);
80
+ }
81
+ else {
82
+ mergedRows[existing] = row;
83
+ }
84
+ }
85
+ return [
86
+ ...pickScaffold(originalTable.leadingLines, updatedTable.leadingLines),
87
+ ...mergedRows.map(renderRow),
88
+ ...pickScaffold(originalTable.trailingLines, updatedTable.trailingLines),
89
+ ].join("\n").trimEnd();
90
+ }
91
+ export function mergeCharacterMatrixMarkdown(original, updated) {
92
+ const originalSections = parseSections(original);
93
+ const updatedSections = parseSections(updated);
94
+ if (originalSections.sections.length === 0 || updatedSections.sections.length === 0) {
95
+ return updated;
96
+ }
97
+ const sectionKeyColumns = [
98
+ [0],
99
+ [0, 1],
100
+ [0, 3],
101
+ ];
102
+ const mergedSections = originalSections.sections.map((section, index) => {
103
+ const next = updatedSections.sections[index];
104
+ if (!next)
105
+ return section;
106
+ const keyColumns = sectionKeyColumns[index] ?? [0];
107
+ return {
108
+ heading: section.heading,
109
+ body: mergeTableMarkdownByKey(section.body, next.body, keyColumns),
110
+ };
111
+ });
112
+ for (let index = originalSections.sections.length; index < updatedSections.sections.length; index += 1) {
113
+ mergedSections.push(updatedSections.sections[index]);
114
+ }
115
+ return [
116
+ ...pickScaffold(originalSections.topLines, updatedSections.topLines),
117
+ ...mergedSections.flatMap((section) => [section.heading, section.body]),
118
+ ].join("\n").trimEnd();
119
+ }
120
+ export function buildGovernedCharacterMatrixWorkingSet(params) {
121
+ const { matrixMarkdown } = params;
122
+ if (!matrixMarkdown || matrixMarkdown === "(文件不存在)" || matrixMarkdown === "(文件尚未创建)") {
123
+ return matrixMarkdown;
124
+ }
125
+ const parsed = parseSections(matrixMarkdown);
126
+ if (parsed.sections.length === 0) {
127
+ return matrixMarkdown;
128
+ }
129
+ const activeNames = collectGovernedCharacterNames(params);
130
+ const filteredSections = parsed.sections.map((section, index) => ({
131
+ heading: section.heading,
132
+ body: filterMatrixSection(section.body, index, activeNames),
133
+ }));
134
+ return [
135
+ ...parsed.topLines,
136
+ ...filteredSections.flatMap((section) => [section.heading, section.body]),
137
+ ].join("\n").trimEnd();
138
+ }
139
+ function parseSingleTable(content) {
140
+ const lines = content.split("\n");
141
+ const tableIndexes = lines
142
+ .map((line, index) => ({ line, index }))
143
+ .filter((entry) => entry.line.trim().startsWith("|"))
144
+ .map((entry) => entry.index);
145
+ if (tableIndexes.length === 0)
146
+ return null;
147
+ const headerStart = tableIndexes[0];
148
+ const nextIndex = tableIndexes[1];
149
+ const headerEnd = nextIndex !== undefined && lines[nextIndex].includes("---")
150
+ ? nextIndex
151
+ : headerStart;
152
+ const dataIndexes = tableIndexes.filter((index) => index > headerEnd);
153
+ const lastDataIndex = dataIndexes.length > 0 ? dataIndexes[dataIndexes.length - 1] : headerEnd;
154
+ return {
155
+ leadingLines: lines.slice(0, headerEnd + 1),
156
+ dataRows: dataIndexes.map((index) => parseRow(lines[index])),
157
+ trailingLines: lines.slice(lastDataIndex + 1),
158
+ };
159
+ }
160
+ function parseSections(content) {
161
+ const lines = content.split("\n");
162
+ const topLines = [];
163
+ const sections = [];
164
+ let currentHeading = null;
165
+ let currentBody = [];
166
+ const flush = () => {
167
+ if (!currentHeading)
168
+ return;
169
+ sections.push({
170
+ heading: currentHeading,
171
+ body: currentBody.join("\n").trimEnd(),
172
+ });
173
+ };
174
+ for (const line of lines) {
175
+ if (line.startsWith("### ")) {
176
+ flush();
177
+ currentHeading = line;
178
+ currentBody = [];
179
+ continue;
180
+ }
181
+ if (currentHeading) {
182
+ currentBody.push(line);
183
+ }
184
+ else {
185
+ topLines.push(line);
186
+ }
187
+ }
188
+ flush();
189
+ return { topLines, sections };
190
+ }
191
+ function parseRow(line) {
192
+ return line
193
+ .split("|")
194
+ .slice(1, -1)
195
+ .map((cell) => cell.trim());
196
+ }
197
+ function renderRow(row) {
198
+ return `| ${row.join(" | ")} |`;
199
+ }
200
+ function buildKey(row, keyColumns) {
201
+ return keyColumns.map((index) => row[index] ?? "").join("::");
202
+ }
203
+ function pickScaffold(primary, fallback) {
204
+ return primary.length > 0 ? primary : fallback;
205
+ }
206
+ function collectGovernedCharacterNames(params) {
207
+ const candidates = extractCharacterCandidatesFromMatrix(params.matrixMarkdown);
208
+ const corpus = [
209
+ params.chapterIntent,
210
+ ...params.contextPackage.selectedContext.flatMap((entry) => [
211
+ entry.reason,
212
+ entry.excerpt ?? "",
213
+ ]),
214
+ ].join("\n");
215
+ const activeNames = new Set();
216
+ for (const candidate of candidates) {
217
+ if (params.protagonistName && matchesName(candidate, params.protagonistName)) {
218
+ activeNames.add(candidate);
219
+ continue;
220
+ }
221
+ if (isNameMentioned(candidate, corpus)) {
222
+ activeNames.add(candidate);
223
+ }
224
+ }
225
+ if (params.protagonistName) {
226
+ for (const candidate of candidates) {
227
+ if (matchesName(candidate, params.protagonistName)) {
228
+ activeNames.add(candidate);
229
+ }
230
+ }
231
+ }
232
+ return activeNames;
233
+ }
234
+ function extractCharacterCandidatesFromMatrix(matrixMarkdown) {
235
+ const parsed = parseSections(matrixMarkdown);
236
+ const names = new Set();
237
+ parsed.sections.forEach((section, index) => {
238
+ const table = parseSingleTable(section.body);
239
+ if (!table)
240
+ return;
241
+ for (const row of table.dataRows) {
242
+ const candidates = index === 1
243
+ ? [row[0], row[1]]
244
+ : [row[0]];
245
+ for (const candidate of candidates) {
246
+ const normalized = candidate?.trim();
247
+ if (normalized) {
248
+ names.add(normalized);
249
+ }
250
+ }
251
+ }
252
+ });
253
+ return [...names];
254
+ }
255
+ function filterMatrixSection(sectionBody, sectionIndex, activeNames) {
256
+ const table = parseSingleTable(sectionBody);
257
+ if (!table) {
258
+ return sectionBody;
259
+ }
260
+ const filteredRows = table.dataRows.filter((row) => {
261
+ if (row.length === 0)
262
+ return false;
263
+ if (sectionIndex === 1) {
264
+ const left = row[0] ?? "";
265
+ const right = row[1] ?? "";
266
+ return activeNames.has(left) && (right.length === 0 || activeNames.has(right));
267
+ }
268
+ return activeNames.has(row[0] ?? "");
269
+ });
270
+ return [
271
+ ...table.leadingLines,
272
+ ...filteredRows.map(renderRow),
273
+ ...table.trailingLines,
274
+ ].join("\n").trimEnd();
275
+ }
276
+ function isNameMentioned(candidate, corpus) {
277
+ if (!candidate || !corpus)
278
+ return false;
279
+ if (containsCjk(candidate)) {
280
+ return corpus.includes(candidate);
281
+ }
282
+ return new RegExp(`\\b${escapeRegExp(candidate)}\\b`, "i").test(corpus);
283
+ }
284
+ function matchesName(left, right) {
285
+ if (!left || !right)
286
+ return false;
287
+ return left.trim().toLowerCase() === right.trim().toLowerCase();
288
+ }
289
+ function containsCjk(value) {
290
+ return /[\u4e00-\u9fff]/.test(value);
291
+ }
292
+ function escapeRegExp(value) {
293
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
294
+ }
295
+ //# sourceMappingURL=governed-working-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-working-set.js","sourceRoot":"","sources":["../../src/utils/governed-working-set.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { HookRecord, RuntimeStateDelta } from "../models/runtime-state.js";
2
+ export type HookDisposition = "none" | "mention" | "advance" | "resolve" | "defer";
3
+ export interface HookAdmissionCandidate {
4
+ readonly type: string;
5
+ readonly expectedPayoff?: string;
6
+ readonly notes?: string;
7
+ }
8
+ export interface HookAdmissionDecision {
9
+ readonly admit: boolean;
10
+ readonly reason: "admit" | "missing_type" | "missing_payoff_signal" | "duplicate_family";
11
+ readonly matchedHookId?: string;
12
+ }
13
+ export declare function collectStaleHookDebt(params: {
14
+ readonly hooks: ReadonlyArray<HookRecord>;
15
+ readonly chapterNumber: number;
16
+ readonly staleAfterChapters?: number;
17
+ }): HookRecord[];
18
+ export declare function evaluateHookAdmission(params: {
19
+ readonly candidate: HookAdmissionCandidate;
20
+ readonly activeHooks: ReadonlyArray<HookRecord>;
21
+ }): HookAdmissionDecision;
22
+ export declare function classifyHookDisposition(params: {
23
+ readonly hookId: string;
24
+ readonly delta: Pick<RuntimeStateDelta, "chapter" | "hookOps">;
25
+ }): HookDisposition;
26
+ //# sourceMappingURL=hook-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-governance.d.ts","sourceRoot":"","sources":["../../src/utils/hook-governance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,uBAAuB,GAAG,kBAAkB,CAAC;IACzF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC,GAAG,UAAU,EAAE,CAaf;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CACjD,GAAG,qBAAqB,CAmExB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;CAChE,GAAG,eAAe,CAoBlB"}
@@ -0,0 +1,128 @@
1
+ export function collectStaleHookDebt(params) {
2
+ const staleAfterChapters = params.staleAfterChapters ?? 10;
3
+ const staleCutoff = params.chapterNumber - staleAfterChapters;
4
+ return params.hooks
5
+ .filter((hook) => hook.status !== "resolved" && hook.status !== "deferred")
6
+ .filter((hook) => hook.startChapter <= params.chapterNumber)
7
+ .filter((hook) => hook.lastAdvancedChapter <= staleCutoff)
8
+ .sort((left, right) => (left.lastAdvancedChapter - right.lastAdvancedChapter
9
+ || left.startChapter - right.startChapter
10
+ || left.hookId.localeCompare(right.hookId)));
11
+ }
12
+ export function evaluateHookAdmission(params) {
13
+ const candidateType = normalizeText(params.candidate.type);
14
+ if (!candidateType) {
15
+ return {
16
+ admit: false,
17
+ reason: "missing_type",
18
+ };
19
+ }
20
+ const payoffSignal = [params.candidate.expectedPayoff, params.candidate.notes]
21
+ .filter((value) => Boolean(value && value.trim()))
22
+ .join(" ")
23
+ .trim();
24
+ if (!payoffSignal) {
25
+ return {
26
+ admit: false,
27
+ reason: "missing_payoff_signal",
28
+ };
29
+ }
30
+ const candidateNormalized = normalizeText([
31
+ params.candidate.type,
32
+ params.candidate.expectedPayoff ?? "",
33
+ params.candidate.notes ?? "",
34
+ ].join(" "));
35
+ const candidateTerms = extractTerms(candidateNormalized);
36
+ const candidateChineseBigrams = extractChineseBigrams(candidateNormalized);
37
+ for (const hook of params.activeHooks) {
38
+ const activeNormalized = normalizeText([
39
+ hook.type,
40
+ hook.expectedPayoff,
41
+ hook.notes,
42
+ ].join(" "));
43
+ if (candidateNormalized === activeNormalized) {
44
+ return {
45
+ admit: false,
46
+ reason: "duplicate_family",
47
+ matchedHookId: hook.hookId,
48
+ };
49
+ }
50
+ if (candidateType !== normalizeText(hook.type)) {
51
+ continue;
52
+ }
53
+ const activeTerms = extractTerms(activeNormalized);
54
+ const overlap = [...candidateTerms].filter((term) => activeTerms.has(term));
55
+ const activeChineseBigrams = extractChineseBigrams(activeNormalized);
56
+ const chineseOverlap = [...candidateChineseBigrams].filter((term) => activeChineseBigrams.has(term));
57
+ if (overlap.length >= 2 || chineseOverlap.length >= 3) {
58
+ return {
59
+ admit: false,
60
+ reason: "duplicate_family",
61
+ matchedHookId: hook.hookId,
62
+ };
63
+ }
64
+ }
65
+ return {
66
+ admit: true,
67
+ reason: "admit",
68
+ };
69
+ }
70
+ export function classifyHookDisposition(params) {
71
+ const { hookId, delta } = params;
72
+ if (delta.hookOps.defer.includes(hookId)) {
73
+ return "defer";
74
+ }
75
+ if (delta.hookOps.resolve.includes(hookId)) {
76
+ return "resolve";
77
+ }
78
+ if (delta.hookOps.upsert.some((hook) => hook.hookId === hookId && hook.lastAdvancedChapter === delta.chapter)) {
79
+ return "advance";
80
+ }
81
+ if (delta.hookOps.mention.includes(hookId)) {
82
+ return "mention";
83
+ }
84
+ return "none";
85
+ }
86
+ function normalizeText(value) {
87
+ return value
88
+ .trim()
89
+ .toLowerCase()
90
+ .replace(/[^a-z0-9\u4e00-\u9fff]+/g, " ")
91
+ .replace(/\s+/g, " ")
92
+ .trim();
93
+ }
94
+ function extractTerms(value) {
95
+ const english = value
96
+ .split(" ")
97
+ .map((term) => term.trim())
98
+ .filter((term) => term.length >= 4)
99
+ .filter((term) => !STOP_WORDS.has(term));
100
+ const chinese = value.match(/[\u4e00-\u9fff]{2,6}/g) ?? [];
101
+ return new Set([...english, ...chinese]);
102
+ }
103
+ function extractChineseBigrams(value) {
104
+ const segments = value.match(/[\u4e00-\u9fff]+/g) ?? [];
105
+ const terms = new Set();
106
+ for (const segment of segments) {
107
+ if (segment.length < 2) {
108
+ continue;
109
+ }
110
+ for (let index = 0; index <= segment.length - 2; index += 1) {
111
+ terms.add(segment.slice(index, index + 2));
112
+ }
113
+ }
114
+ return terms;
115
+ }
116
+ const STOP_WORDS = new Set([
117
+ "that",
118
+ "this",
119
+ "with",
120
+ "from",
121
+ "into",
122
+ "still",
123
+ "just",
124
+ "have",
125
+ "will",
126
+ "reveal",
127
+ ]);
128
+ //# sourceMappingURL=hook-governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-governance.js","sourceRoot":"","sources":["../../src/utils/hook-governance.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,oBAAoB,CAAC,MAIpC;IACC,MAAM,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC;IAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,GAAG,kBAAkB,CAAC;IAE9D,OAAO,MAAM,CAAC,KAAK;SAChB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC;SAC1E,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,aAAa,CAAC;SAC3D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,IAAI,WAAW,CAAC;SACzD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACrB,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,mBAAmB;WACjD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY;WACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAC3C,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAGrC;IACC,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,cAAc;SACvB,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;SAC3E,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;SAClE,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,uBAAuB;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,aAAa,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,IAAI;QACrB,MAAM,CAAC,SAAS,CAAC,cAAc,IAAI,EAAE;QACrC,MAAM,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;KAC7B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACb,MAAM,cAAc,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACzD,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IAE3E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,gBAAgB,GAAG,aAAa,CAAC;YACrC,IAAI,CAAC,IAAI;YACT,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,KAAK;SACX,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAEb,IAAI,mBAAmB,KAAK,gBAAgB,EAAE,CAAC;YAC7C,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,kBAAkB;gBAC1B,aAAa,EAAE,IAAI,CAAC,MAAM;aAC3B,CAAC;QACJ,CAAC;QAED,IAAI,aAAa,KAAK,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QACrE,MAAM,cAAc,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAClE,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAC/B,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,kBAAkB;gBAC1B,aAAa,EAAE,IAAI,CAAC,MAAM;aAC3B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,OAAO;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAGvC;IACC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,mBAAmB,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9G,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC;SACxC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,OAAO,GAAG,KAAK;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;IAC3D,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;CACT,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { AuditIssue } from "../agents/continuity.js";
2
+ import type { HookRecord, RuntimeStateDelta } from "../models/runtime-state.js";
3
+ export declare function analyzeHookHealth(params: {
4
+ readonly language: "zh" | "en";
5
+ readonly chapterNumber: number;
6
+ readonly hooks: ReadonlyArray<HookRecord>;
7
+ readonly delta?: Pick<RuntimeStateDelta, "chapter" | "hookOps">;
8
+ readonly existingHookIds?: ReadonlyArray<string>;
9
+ readonly maxActiveHooks?: number;
10
+ readonly staleAfterChapters?: number;
11
+ readonly noAdvanceWindow?: number;
12
+ readonly newHookBurstThreshold?: number;
13
+ }): AuditIssue[];
14
+ //# sourceMappingURL=hook-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-health.d.ts","sourceRoot":"","sources":["../../src/utils/hook-health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGhF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IAChE,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACzC,GAAG,UAAU,EAAE,CAoFf"}
@@ -0,0 +1,68 @@
1
+ import { classifyHookDisposition, collectStaleHookDebt } from "./hook-governance.js";
2
+ export function analyzeHookHealth(params) {
3
+ const maxActiveHooks = params.maxActiveHooks ?? 12;
4
+ const staleAfterChapters = params.staleAfterChapters ?? 10;
5
+ const noAdvanceWindow = params.noAdvanceWindow ?? 5;
6
+ const newHookBurstThreshold = params.newHookBurstThreshold ?? 2;
7
+ const issues = [];
8
+ const activeHooks = params.hooks.filter((hook) => hook.status !== "resolved");
9
+ if (activeHooks.length > maxActiveHooks) {
10
+ issues.push(warning(params.language, params.language === "en"
11
+ ? `There are ${activeHooks.length} active hooks, above the recommended cap of ${maxActiveHooks}.`
12
+ : `当前有 ${activeHooks.length} 个活跃伏笔,已经高于建议上限 ${maxActiveHooks} 个。`, params.language === "en"
13
+ ? "Prefer advancing, resolving, or deferring existing debt before opening more hooks."
14
+ : "优先推进、回收或延后已有伏笔,再继续开新伏笔。"));
15
+ }
16
+ const latestRealAdvance = activeHooks.reduce((max, hook) => Math.max(max, hook.lastAdvancedChapter), 0);
17
+ if (activeHooks.length > 0 && params.chapterNumber - latestRealAdvance >= noAdvanceWindow) {
18
+ issues.push(warning(params.language, params.language === "en"
19
+ ? `No real hook advancement has landed for ${params.chapterNumber - latestRealAdvance} chapters.`
20
+ : `已经连续 ${params.chapterNumber - latestRealAdvance} 章没有真实伏笔推进。`, params.language === "en"
21
+ ? "Schedule one old hook for real movement instead of opening parallel restatements."
22
+ : "下一章优先让一个旧伏笔发生真实推进,而不是继续平行重述。"));
23
+ }
24
+ const staleHooks = collectStaleHookDebt({
25
+ hooks: activeHooks,
26
+ chapterNumber: params.chapterNumber,
27
+ staleAfterChapters,
28
+ });
29
+ if (params.delta && staleHooks.length > 0) {
30
+ const untouchedStale = staleHooks.filter((hook) => {
31
+ const disposition = classifyHookDisposition({
32
+ hookId: hook.hookId,
33
+ delta: params.delta,
34
+ });
35
+ return disposition === "none" || disposition === "mention";
36
+ });
37
+ if (untouchedStale.length > 0) {
38
+ issues.push(warning(params.language, params.language === "en"
39
+ ? `Stale hooks received no real disposition this chapter: ${untouchedStale.map((hook) => hook.hookId).join(", ")}.`
40
+ : `本章没有真正处理这些陈旧伏笔:${untouchedStale.map((hook) => hook.hookId).join("、")}。`, params.language === "en"
41
+ ? "Advance, resolve, or explicitly defer at least one stale hook."
42
+ : "至少推进、回收或明确延后一个陈旧伏笔。"));
43
+ }
44
+ }
45
+ if (params.delta) {
46
+ const existingHookIds = new Set(params.existingHookIds ?? []);
47
+ const newHookIds = params.delta.hookOps.upsert
48
+ .map((hook) => hook.hookId)
49
+ .filter((hookId) => !existingHookIds.has(hookId));
50
+ if (newHookIds.length >= newHookBurstThreshold && params.delta.hookOps.resolve.length === 0) {
51
+ issues.push(warning(params.language, params.language === "en"
52
+ ? `Opened ${newHookIds.length} new hooks without resolving any older debt.`
53
+ : `本章新开了 ${newHookIds.length} 个伏笔,但没有回收任何旧债。`, params.language === "en"
54
+ ? "Keep the hook table from ballooning by pairing new openings with old payoffs."
55
+ : "控制伏笔膨胀,新开伏笔时尽量配套回收旧伏笔。"));
56
+ }
57
+ }
58
+ return issues;
59
+ }
60
+ function warning(language, description, suggestion) {
61
+ return {
62
+ severity: "warning",
63
+ category: language === "en" ? "Hook Debt" : "伏笔债务",
64
+ description,
65
+ suggestion,
66
+ };
67
+ }
68
+ //# sourceMappingURL=hook-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-health.js","sourceRoot":"","sources":["../../src/utils/hook-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { LengthCountingMode, LengthNormalizeMode, LengthSpec } from "../models/length-governance.js";
2
+ export type LengthLanguage = "zh" | "en";
3
+ export declare function countChapterLength(content: string, countingMode: LengthCountingMode): number;
4
+ export declare function resolveLengthCountingMode(language?: LengthLanguage): LengthCountingMode;
5
+ export declare function formatLengthCount(count: number, countingMode: LengthCountingMode): string;
6
+ export declare function buildLengthSpec(target: number, language?: LengthLanguage): LengthSpec;
7
+ export declare function isOutsideSoftRange(count: number, spec: Pick<LengthSpec, "softMin" | "softMax">): boolean;
8
+ export declare function isOutsideHardRange(count: number, spec: Pick<LengthSpec, "hardMin" | "hardMax">): boolean;
9
+ export declare function chooseNormalizeMode(count: number, spec: Pick<LengthSpec, "softMin" | "softMax">): LengthNormalizeMode;
10
+ //# sourceMappingURL=length-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"length-metrics.d.ts","sourceRoot":"","sources":["../../src/utils/length-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE1G,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;AAMzC,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,kBAAkB,GAC/B,MAAM,CASR;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,GAAE,cAAqB,GAC9B,kBAAkB,CAEpB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,kBAAkB,GAC/B,MAAM,CAER;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,cAAqB,GAC9B,UAAU,CAiBZ;AAMD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,GAC5C,OAAO,CAET;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,GAC5C,OAAO,CAET;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,GAC5C,mBAAmB,CAIrB"}