@tenphi/akno-core 0.12.0 → 0.13.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 (298) hide show
  1. package/config/default.jsonc +12 -2
  2. package/dist/bench/graph.d.ts +2 -0
  3. package/dist/bench/graph.d.ts.map +1 -1
  4. package/dist/bench/graph.js +4 -0
  5. package/dist/bench/graph.js.map +1 -1
  6. package/dist/bench/language-corpus-v10.d.ts +4 -0
  7. package/dist/bench/language-corpus-v10.d.ts.map +1 -0
  8. package/dist/bench/language-corpus-v10.js +569 -0
  9. package/dist/bench/language-corpus-v10.js.map +1 -0
  10. package/dist/bench/language-corpus-v11.d.ts +4 -0
  11. package/dist/bench/language-corpus-v11.d.ts.map +1 -0
  12. package/dist/bench/language-corpus-v11.js +594 -0
  13. package/dist/bench/language-corpus-v11.js.map +1 -0
  14. package/dist/bench/language-corpus-v12.d.ts +4 -0
  15. package/dist/bench/language-corpus-v12.d.ts.map +1 -0
  16. package/dist/bench/language-corpus-v12.js +584 -0
  17. package/dist/bench/language-corpus-v12.js.map +1 -0
  18. package/dist/bench/language-corpus-v13.d.ts +4 -0
  19. package/dist/bench/language-corpus-v13.d.ts.map +1 -0
  20. package/dist/bench/language-corpus-v13.js +584 -0
  21. package/dist/bench/language-corpus-v13.js.map +1 -0
  22. package/dist/bench/language-corpus-v14.d.ts +4 -0
  23. package/dist/bench/language-corpus-v14.d.ts.map +1 -0
  24. package/dist/bench/language-corpus-v14.js +584 -0
  25. package/dist/bench/language-corpus-v14.js.map +1 -0
  26. package/dist/bench/language-corpus-v15.d.ts +4 -0
  27. package/dist/bench/language-corpus-v15.d.ts.map +1 -0
  28. package/dist/bench/language-corpus-v15.js +305 -0
  29. package/dist/bench/language-corpus-v15.js.map +1 -0
  30. package/dist/bench/language-corpus-v16.d.ts +4 -0
  31. package/dist/bench/language-corpus-v16.d.ts.map +1 -0
  32. package/dist/bench/language-corpus-v16.js +305 -0
  33. package/dist/bench/language-corpus-v16.js.map +1 -0
  34. package/dist/bench/language-corpus-v17.d.ts +4 -0
  35. package/dist/bench/language-corpus-v17.d.ts.map +1 -0
  36. package/dist/bench/language-corpus-v17.js +305 -0
  37. package/dist/bench/language-corpus-v17.js.map +1 -0
  38. package/dist/bench/language-corpus-v18.d.ts +4 -0
  39. package/dist/bench/language-corpus-v18.d.ts.map +1 -0
  40. package/dist/bench/language-corpus-v18.js +305 -0
  41. package/dist/bench/language-corpus-v18.js.map +1 -0
  42. package/dist/bench/language-corpus-v19.d.ts +4 -0
  43. package/dist/bench/language-corpus-v19.d.ts.map +1 -0
  44. package/dist/bench/language-corpus-v19.js +310 -0
  45. package/dist/bench/language-corpus-v19.js.map +1 -0
  46. package/dist/bench/language-corpus-v2.d.ts +12 -0
  47. package/dist/bench/language-corpus-v2.d.ts.map +1 -0
  48. package/dist/bench/language-corpus-v2.js +146 -0
  49. package/dist/bench/language-corpus-v2.js.map +1 -0
  50. package/dist/bench/language-corpus-v20.d.ts +4 -0
  51. package/dist/bench/language-corpus-v20.d.ts.map +1 -0
  52. package/dist/bench/language-corpus-v20.js +310 -0
  53. package/dist/bench/language-corpus-v20.js.map +1 -0
  54. package/dist/bench/language-corpus-v21.d.ts +4 -0
  55. package/dist/bench/language-corpus-v21.d.ts.map +1 -0
  56. package/dist/bench/language-corpus-v21.js +310 -0
  57. package/dist/bench/language-corpus-v21.js.map +1 -0
  58. package/dist/bench/language-corpus-v22.d.ts +4 -0
  59. package/dist/bench/language-corpus-v22.d.ts.map +1 -0
  60. package/dist/bench/language-corpus-v22.js +330 -0
  61. package/dist/bench/language-corpus-v22.js.map +1 -0
  62. package/dist/bench/language-corpus-v3.d.ts +4 -0
  63. package/dist/bench/language-corpus-v3.d.ts.map +1 -0
  64. package/dist/bench/language-corpus-v3.js +184 -0
  65. package/dist/bench/language-corpus-v3.js.map +1 -0
  66. package/dist/bench/language-corpus-v4.d.ts +4 -0
  67. package/dist/bench/language-corpus-v4.d.ts.map +1 -0
  68. package/dist/bench/language-corpus-v4.js +111 -0
  69. package/dist/bench/language-corpus-v4.js.map +1 -0
  70. package/dist/bench/language-corpus-v5.d.ts +4 -0
  71. package/dist/bench/language-corpus-v5.d.ts.map +1 -0
  72. package/dist/bench/language-corpus-v5.js +111 -0
  73. package/dist/bench/language-corpus-v5.js.map +1 -0
  74. package/dist/bench/language-corpus-v6.d.ts +4 -0
  75. package/dist/bench/language-corpus-v6.d.ts.map +1 -0
  76. package/dist/bench/language-corpus-v6.js +111 -0
  77. package/dist/bench/language-corpus-v6.js.map +1 -0
  78. package/dist/bench/language-corpus-v7.d.ts +4 -0
  79. package/dist/bench/language-corpus-v7.d.ts.map +1 -0
  80. package/dist/bench/language-corpus-v7.js +150 -0
  81. package/dist/bench/language-corpus-v7.js.map +1 -0
  82. package/dist/bench/language-corpus-v8.d.ts +4 -0
  83. package/dist/bench/language-corpus-v8.d.ts.map +1 -0
  84. package/dist/bench/language-corpus-v8.js +150 -0
  85. package/dist/bench/language-corpus-v8.js.map +1 -0
  86. package/dist/bench/language-corpus-v9.d.ts +4 -0
  87. package/dist/bench/language-corpus-v9.d.ts.map +1 -0
  88. package/dist/bench/language-corpus-v9.js +150 -0
  89. package/dist/bench/language-corpus-v9.js.map +1 -0
  90. package/dist/bench/language-corpus.d.ts +20 -0
  91. package/dist/bench/language-corpus.d.ts.map +1 -0
  92. package/dist/bench/language-corpus.js +205 -0
  93. package/dist/bench/language-corpus.js.map +1 -0
  94. package/dist/bench/language-review.d.ts +260 -0
  95. package/dist/bench/language-review.d.ts.map +1 -0
  96. package/dist/bench/language-review.js +591 -0
  97. package/dist/bench/language-review.js.map +1 -0
  98. package/dist/bench/language.d.ts +371 -0
  99. package/dist/bench/language.d.ts.map +1 -0
  100. package/dist/bench/language.js +484 -0
  101. package/dist/bench/language.js.map +1 -0
  102. package/dist/config/load.js +5 -0
  103. package/dist/config/load.js.map +1 -1
  104. package/dist/config/schema.d.ts +3 -0
  105. package/dist/config/schema.d.ts.map +1 -1
  106. package/dist/config/schema.js +1 -0
  107. package/dist/config/schema.js.map +1 -1
  108. package/dist/index/derive.d.ts.map +1 -1
  109. package/dist/index/derive.js +14 -5
  110. package/dist/index/derive.js.map +1 -1
  111. package/dist/index/graph.d.ts.map +1 -1
  112. package/dist/index/graph.js +3 -0
  113. package/dist/index/graph.js.map +1 -1
  114. package/dist/index/indexer.d.ts.map +1 -1
  115. package/dist/index/indexer.js +6 -1
  116. package/dist/index/indexer.js.map +1 -1
  117. package/dist/ingest/extract.d.ts.map +1 -1
  118. package/dist/ingest/extract.js +3 -1
  119. package/dist/ingest/extract.js.map +1 -1
  120. package/dist/kb/line-facts.d.ts.map +1 -1
  121. package/dist/kb/line-facts.js +2 -0
  122. package/dist/kb/line-facts.js.map +1 -1
  123. package/dist/kb/managed-lines.d.ts.map +1 -1
  124. package/dist/kb/managed-lines.js +3 -2
  125. package/dist/kb/managed-lines.js.map +1 -1
  126. package/dist/kb/prose.d.ts +12 -0
  127. package/dist/kb/prose.d.ts.map +1 -0
  128. package/dist/kb/prose.js +213 -0
  129. package/dist/kb/prose.js.map +1 -0
  130. package/dist/maintenance/conflicts.d.ts +1 -1
  131. package/dist/maintenance/curate.d.ts +1 -0
  132. package/dist/maintenance/curate.d.ts.map +1 -1
  133. package/dist/maintenance/curate.js +28 -1
  134. package/dist/maintenance/curate.js.map +1 -1
  135. package/dist/maintenance/dream.d.ts.map +1 -1
  136. package/dist/maintenance/dream.js +6 -1
  137. package/dist/maintenance/dream.js.map +1 -1
  138. package/dist/maintenance/plans.d.ts.map +1 -1
  139. package/dist/maintenance/plans.js +2 -0
  140. package/dist/maintenance/plans.js.map +1 -1
  141. package/dist/maintenance/revision-language.d.ts +4 -0
  142. package/dist/maintenance/revision-language.d.ts.map +1 -0
  143. package/dist/maintenance/revision-language.js +50 -0
  144. package/dist/maintenance/revision-language.js.map +1 -0
  145. package/dist/memory/action-agency.d.ts +5 -0
  146. package/dist/memory/action-agency.d.ts.map +1 -0
  147. package/dist/memory/action-agency.js +76 -0
  148. package/dist/memory/action-agency.js.map +1 -0
  149. package/dist/memory/clause-ending.d.ts +4 -0
  150. package/dist/memory/clause-ending.d.ts.map +1 -0
  151. package/dist/memory/clause-ending.js +6 -0
  152. package/dist/memory/clause-ending.js.map +1 -0
  153. package/dist/memory/counterfactual-wording.d.ts +4 -0
  154. package/dist/memory/counterfactual-wording.d.ts.map +1 -0
  155. package/dist/memory/counterfactual-wording.js +101 -0
  156. package/dist/memory/counterfactual-wording.js.map +1 -0
  157. package/dist/memory/coverage-roles.d.ts +3 -0
  158. package/dist/memory/coverage-roles.d.ts.map +1 -0
  159. package/dist/memory/coverage-roles.js +28 -0
  160. package/dist/memory/coverage-roles.js.map +1 -0
  161. package/dist/memory/intent.d.ts +1 -0
  162. package/dist/memory/intent.d.ts.map +1 -1
  163. package/dist/memory/intent.js +52 -4
  164. package/dist/memory/intent.js.map +1 -1
  165. package/dist/memory/named-actor.d.ts +2 -0
  166. package/dist/memory/named-actor.d.ts.map +1 -0
  167. package/dist/memory/named-actor.js +9 -0
  168. package/dist/memory/named-actor.js.map +1 -0
  169. package/dist/memory/personal-negative-actions.d.ts +3 -0
  170. package/dist/memory/personal-negative-actions.d.ts.map +1 -0
  171. package/dist/memory/personal-negative-actions.js +67 -0
  172. package/dist/memory/personal-negative-actions.js.map +1 -0
  173. package/dist/memory/projection.d.ts.map +1 -1
  174. package/dist/memory/projection.js +10 -2
  175. package/dist/memory/projection.js.map +1 -1
  176. package/dist/memory/prose-projection.d.ts +6 -0
  177. package/dist/memory/prose-projection.d.ts.map +1 -0
  178. package/dist/memory/prose-projection.js +34 -0
  179. package/dist/memory/prose-projection.js.map +1 -0
  180. package/dist/memory/report-uncertainty.d.ts +3 -0
  181. package/dist/memory/report-uncertainty.d.ts.map +1 -0
  182. package/dist/memory/report-uncertainty.js +67 -0
  183. package/dist/memory/report-uncertainty.js.map +1 -0
  184. package/dist/memory/reporting-roles.d.ts +3 -0
  185. package/dist/memory/reporting-roles.d.ts.map +1 -0
  186. package/dist/memory/reporting-roles.js +39 -0
  187. package/dist/memory/reporting-roles.js.map +1 -0
  188. package/dist/memory/retention-source-frame.d.ts +8 -0
  189. package/dist/memory/retention-source-frame.d.ts.map +1 -0
  190. package/dist/memory/retention-source-frame.js +72 -0
  191. package/dist/memory/retention-source-frame.js.map +1 -0
  192. package/dist/models/client.d.ts +12 -3
  193. package/dist/models/client.d.ts.map +1 -1
  194. package/dist/models/client.js +142 -6
  195. package/dist/models/client.js.map +1 -1
  196. package/dist/models/language-audit.d.ts +78 -0
  197. package/dist/models/language-audit.d.ts.map +1 -0
  198. package/dist/models/language-audit.js +139 -0
  199. package/dist/models/language-audit.js.map +1 -0
  200. package/dist/models/language.d.ts +12 -0
  201. package/dist/models/language.d.ts.map +1 -0
  202. package/dist/models/language.js +106 -0
  203. package/dist/models/language.js.map +1 -0
  204. package/dist/models/semantic-verdict.d.ts +53 -0
  205. package/dist/models/semantic-verdict.d.ts.map +1 -0
  206. package/dist/models/semantic-verdict.js +190 -0
  207. package/dist/models/semantic-verdict.js.map +1 -0
  208. package/dist/ops/answer-record-rendering.d.ts +73 -0
  209. package/dist/ops/answer-record-rendering.d.ts.map +1 -0
  210. package/dist/ops/answer-record-rendering.js +149 -0
  211. package/dist/ops/answer-record-rendering.js.map +1 -0
  212. package/dist/ops/answer-source-audit.d.ts +354 -0
  213. package/dist/ops/answer-source-audit.d.ts.map +1 -0
  214. package/dist/ops/answer-source-audit.js +328 -0
  215. package/dist/ops/answer-source-audit.js.map +1 -0
  216. package/dist/ops/answer.d.ts +2 -2
  217. package/dist/ops/answer.d.ts.map +1 -1
  218. package/dist/ops/answer.js +1032 -114
  219. package/dist/ops/answer.js.map +1 -1
  220. package/dist/ops/context.d.ts.map +1 -1
  221. package/dist/ops/context.js +7 -0
  222. package/dist/ops/context.js.map +1 -1
  223. package/dist/ops/graph.d.ts.map +1 -1
  224. package/dist/ops/graph.js +35 -4
  225. package/dist/ops/graph.js.map +1 -1
  226. package/dist/ops/read.d.ts.map +1 -1
  227. package/dist/ops/read.js +5 -2
  228. package/dist/ops/read.js.map +1 -1
  229. package/dist/ops/recall.d.ts.map +1 -1
  230. package/dist/ops/recall.js +10 -0
  231. package/dist/ops/recall.js.map +1 -1
  232. package/dist/ops/remember.d.ts +2 -1
  233. package/dist/ops/remember.d.ts.map +1 -1
  234. package/dist/ops/remember.js +48 -33
  235. package/dist/ops/remember.js.map +1 -1
  236. package/dist/ops/retain.d.ts +3 -1
  237. package/dist/ops/retain.d.ts.map +1 -1
  238. package/dist/ops/retain.js +56 -44
  239. package/dist/ops/retain.js.map +1 -1
  240. package/dist/recall/assemble.d.ts +1 -0
  241. package/dist/recall/assemble.d.ts.map +1 -1
  242. package/dist/recall/assemble.js +19 -2
  243. package/dist/recall/assemble.js.map +1 -1
  244. package/dist/store/db.d.ts.map +1 -1
  245. package/dist/store/db.js +3 -1
  246. package/dist/store/db.js.map +1 -1
  247. package/dist/store/migrations.d.ts +2 -1
  248. package/dist/store/migrations.d.ts.map +1 -1
  249. package/dist/store/migrations.js +11 -1
  250. package/dist/store/migrations.js.map +1 -1
  251. package/dist/timeline/clock.d.ts.map +1 -1
  252. package/dist/timeline/clock.js +2 -0
  253. package/dist/timeline/clock.js.map +1 -1
  254. package/dist/timeline/eligibility.js +4 -4
  255. package/dist/timeline/eligibility.js.map +1 -1
  256. package/dist/timeline/source-clock.d.ts +5 -0
  257. package/dist/timeline/source-clock.d.ts.map +1 -0
  258. package/dist/timeline/source-clock.js +179 -0
  259. package/dist/timeline/source-clock.js.map +1 -0
  260. package/dist/write/fictional-case-identity.d.ts +10 -0
  261. package/dist/write/fictional-case-identity.d.ts.map +1 -0
  262. package/dist/write/fictional-case-identity.js +84 -0
  263. package/dist/write/fictional-case-identity.js.map +1 -0
  264. package/dist/write/managed-memory.js +1 -1
  265. package/dist/write/managed-memory.js.map +1 -1
  266. package/dist/write/retain-clock-repair.d.ts +48 -0
  267. package/dist/write/retain-clock-repair.d.ts.map +1 -0
  268. package/dist/write/retain-clock-repair.js +175 -0
  269. package/dist/write/retain-clock-repair.js.map +1 -0
  270. package/dist/write/retain.d.ts +21 -10
  271. package/dist/write/retain.d.ts.map +1 -1
  272. package/dist/write/retain.js +1220 -70
  273. package/dist/write/retain.js.map +1 -1
  274. package/dist/write/retained-relations.d.ts +7 -0
  275. package/dist/write/retained-relations.d.ts.map +1 -0
  276. package/dist/write/retained-relations.js +38 -0
  277. package/dist/write/retained-relations.js.map +1 -0
  278. package/dist/write/retained-spans.d.ts +5 -0
  279. package/dist/write/retained-spans.d.ts.map +1 -0
  280. package/dist/write/retained-spans.js +30 -0
  281. package/dist/write/retained-spans.js.map +1 -0
  282. package/dist/write/retained-time.d.ts +4 -0
  283. package/dist/write/retained-time.d.ts.map +1 -0
  284. package/dist/write/retained-time.js +10 -0
  285. package/dist/write/retained-time.js.map +1 -0
  286. package/dist/write/retention-frame-audit.d.ts +25 -0
  287. package/dist/write/retention-frame-audit.d.ts.map +1 -0
  288. package/dist/write/retention-frame-audit.js +43 -0
  289. package/dist/write/retention-frame-audit.js.map +1 -0
  290. package/dist/write/retention-negative-evidence.d.ts +222 -0
  291. package/dist/write/retention-negative-evidence.d.ts.map +1 -0
  292. package/dist/write/retention-negative-evidence.js +122 -0
  293. package/dist/write/retention-negative-evidence.js.map +1 -0
  294. package/dist/write/retention-report-limits.d.ts +65 -0
  295. package/dist/write/retention-report-limits.d.ts.map +1 -0
  296. package/dist/write/retention-report-limits.js +71 -0
  297. package/dist/write/retention-report-limits.js.map +1 -0
  298. package/package.json +2 -2
@@ -0,0 +1,213 @@
1
+ import { parseFrontmatter } from "./frontmatter.js";
2
+ import { sha256 } from "../store/ids.js";
3
+ export const PROSE_PROJECTION_VERSION = 'prose-v2';
4
+ const FACTUAL = { view: 'factual', reason: 'asserted' };
5
+ const CONDITIONAL = /\b(?:if|suppose|assuming|hypothetical|counterfactual|what if|would have)\b|(?:^|[^\p{L}])(?:если|предположим|допустим|гипотез\p{L}*|гипотетическ\p{L}*|контрфактическ\p{L}*)(?=$|[^\p{L}])/iu;
6
+ const TENTATIVE = /\b(?:might|maybe|perhaps|possibly|probably|suspect|uncertain|tentative|would|could)\b|(?:^|[^\p{L}])(?:возможно|вероятно|может быть|подозрева\p{L}*|не уверен\p{L}*)(?=$|[^\p{L}])/iu;
7
+ const REPORT = /\b(?:said|says|reported|reports|according to|quoted|quotation)\b|(?:^|[^\p{L}])(?:сказал\p{L}*|сообщил\p{L}*|по словам|цитат\p{L}*)(?=$|[^\p{L}])/iu;
8
+ const REJECTED = /\b(?:rejected|cancelled|canceled|not decided|not accepted|did not choose)\b|(?:отклон\p{L}*|отмен\p{L}*|не решено|не выбрал\p{L}*|решение не принято)/iu;
9
+ const PLANNED = /\b(?:plan(?:s|ned|ning)? to|propos(?:e|ed|al)|intend(?:s)? to)\b|(?:планиру\p{L}*|намерева\p{L}*|предлага\p{L}*)/iu;
10
+ const SPEAKER = /^\s*(?:[-*]\s*)?(?:\*\*)?(?:user|assistant|system|external|пользователь|ассистент|система)(?:\*\*)?\s*:/iu;
11
+ function categoryHeading(text) {
12
+ const title = text
13
+ .trim()
14
+ .replace(/\s+#+\s*$/, '')
15
+ .replace(/^(\*{1,2}|_{1,2})(.+)\1$/u, '$2')
16
+ .replace(/[::]\s*$/, '')
17
+ .trim();
18
+ // Category titles establish scope; a token inside a document's descriptive title does not.
19
+ // For example, a report number is ordinary data, whereas an assistant report is attribution.
20
+ if (/^(?:(?:assistant|user|system|external|nested|attributed)\s+)?(?:reports?|retellings?)$/iu.test(title) ||
21
+ /^(?:(?:вложенный|внешний)\s+)?(?:пересказ|сообщение|сообщения)(?:\s+(?:ассистента|пользователя|системы))?$/iu.test(title))
22
+ return { view: 'reports', reason: 'heading_scope' };
23
+ if (/^(?:preliminary|tentative|possible|competing)\s+(?:versions?|explanations?|causes?|hypothes[ei]s)$/iu.test(title) ||
24
+ /^(?:предварительн\p{L}*|возможн\p{L}*)\s+(?:верси\p{L}*|объяснени\p{L}*|причин\p{L}*|гипотез\p{L}*)$/iu.test(title))
25
+ return { view: 'discussion', reason: 'heading_scope' };
26
+ return null;
27
+ }
28
+ function meaning(text, heading = false) {
29
+ const category = heading ? categoryHeading(text) : null;
30
+ if (category)
31
+ return category;
32
+ if (CONDITIONAL.test(text))
33
+ return { view: 'discussion', reason: 'conditional' };
34
+ if (REJECTED.test(text))
35
+ return { view: 'history', reason: 'rejected' };
36
+ if (TENTATIVE.test(text))
37
+ return { view: 'discussion', reason: 'tentative' };
38
+ if (heading && /^(?:user|assistant|system|external|пользователь|ассистент|система)$/iu.test(text.trim()))
39
+ return { view: 'reports', reason: 'speaker' };
40
+ if (heading &&
41
+ /\b(?:scenario|alternatives?|discussion|hypothes[ei]s|assumptions?)\b|сценари\p{L}*|обсуждени\p{L}*|предположени\p{L}*/iu.test(text))
42
+ return { view: 'discussion', reason: 'heading_scope' };
43
+ if (heading &&
44
+ /\b(?:examples?|samples?|transcript|conversation|dialogue)\b|пример\p{L}*|переписк\p{L}*|диалог\p{L}*/iu.test(text))
45
+ return { view: 'reports', reason: 'heading_scope' };
46
+ if (heading && /\b(?:plans?|proposals?|intentions?)\b|план\p{L}*|предложени\p{L}*/iu.test(text))
47
+ return { view: 'planning', reason: 'heading_scope' };
48
+ if (heading && /\bquestions?\b|вопрос\p{L}*/iu.test(text))
49
+ return { view: 'questions', reason: 'heading_scope' };
50
+ if (SPEAKER.test(text) ||
51
+ /^\s*(?:>\s*)?(?:\*\*)?\p{Lu}[\p{L}’\x27-]+(?:[ \t]+\p{Lu}[\p{L}’\x27-]+){1,3}(?:\*\*)?:[ \t]+/u.test(text))
52
+ return { view: 'reports', reason: 'speaker' };
53
+ if (REPORT.test(text) || /^\s*(?:>|["“«])/.test(text))
54
+ return { view: 'reports', reason: 'quotation' };
55
+ if (PLANNED.test(text) || /^\s*[-*]\s*\[ \]/.test(text))
56
+ return { view: 'planning', reason: 'plan' };
57
+ if (/\?\s*$/.test(text))
58
+ return { view: 'questions', reason: 'question' };
59
+ return FACTUAL;
60
+ }
61
+ /**
62
+ * Interpret structural scope from the complete current file before selecting any line window.
63
+ * This bounded deterministic projection does not claim to understand arbitrary implicit discourse.
64
+ * Unresolved frames remain inspectable, but cannot acquire factual eligibility from truncation.
65
+ */
66
+ export function proseQualifications(fileLines) {
67
+ const content = fileLines.join('\n');
68
+ const first = parseFrontmatter(content).bodyLine - 1;
69
+ const hash = sha256(content);
70
+ const result = new Map();
71
+ const headings = [];
72
+ let carried = null;
73
+ let source = false;
74
+ let commentStart = null;
75
+ let fenced = null;
76
+ let ownedPayload = false;
77
+ let previousParagraph = [];
78
+ const qualify = (indexes, selected, context, unresolved = false) => {
79
+ const frameIndexes = [...new Set(context)].sort((a, b) => a - b);
80
+ const tooLarge = frameIndexes.length > 12 || frameIndexes.reduce((sum, i) => sum + fileLines[i].length, 0) > 2400;
81
+ const status = unresolved || tooLarge ? 'unresolved' : 'qualified';
82
+ const frame = tooLarge ? [] : frameIndexes.map((i) => ({ n: i + 1, text: fileLines[i] }));
83
+ for (const index of indexes)
84
+ result.set(index + 1, {
85
+ status,
86
+ ...selected,
87
+ reason: tooLarge ? 'context_limit' : selected.reason,
88
+ answer_eligible: status === 'qualified' && selected.view === 'factual',
89
+ source_hash: hash,
90
+ frame,
91
+ });
92
+ };
93
+ for (let i = first; i < fileLines.length;) {
94
+ const text = fileLines[i];
95
+ if (commentStart !== null) {
96
+ qualify([i], { view: 'discussion', reason: 'comment' }, [commentStart]);
97
+ if (text.includes('-->'))
98
+ commentStart = null;
99
+ i++;
100
+ continue;
101
+ }
102
+ const fence = /^\s*(`{3,}|~{3,})/.exec(text);
103
+ if (fenced) {
104
+ qualify([i], { view: 'discussion', reason: 'example' }, [fenced.start]);
105
+ if (fence &&
106
+ fence[1][0] === fenced.char &&
107
+ fence[1].length >= fenced.length &&
108
+ /^\s*(?:`+|~+)\s*$/.test(text))
109
+ fenced = null;
110
+ i++;
111
+ continue;
112
+ }
113
+ if (fence) {
114
+ fenced = { char: fence[1][0], length: fence[1].length, start: i };
115
+ qualify([i], { view: 'discussion', reason: 'example' }, [i]);
116
+ i++;
117
+ continue;
118
+ }
119
+ if (/^\s*<!--\s*source\s*-->\s*$/.test(text))
120
+ source = true;
121
+ if (/^\s*<!--\s*akno:(?:item|observation)\b/.test(text)) {
122
+ ownedPayload = true;
123
+ i++;
124
+ continue;
125
+ }
126
+ if (!text.trim()) {
127
+ i++;
128
+ continue;
129
+ }
130
+ if (ownedPayload) {
131
+ ownedPayload = false;
132
+ i++;
133
+ continue;
134
+ }
135
+ if (/^\s*<!--/.test(text)) {
136
+ qualify([i], { view: 'discussion', reason: 'comment' }, [i]);
137
+ if (!text.includes('-->'))
138
+ commentStart = i;
139
+ i++;
140
+ continue;
141
+ }
142
+ const setext = /^\s{0,3}(=+|-+)\s*$/.exec(fileLines[i + 1] ?? '');
143
+ const heading = /^(#{1,6})\s+(.+)$/.exec(text) ?? (setext ? ['', setext[1][0] === '=' ? '#' : '##', text] : null);
144
+ if (heading) {
145
+ while (headings.length && headings.at(-1).depth >= heading[1].length)
146
+ headings.pop();
147
+ headings.push({ depth: heading[1].length, index: i, meaning: meaning(heading[2], true) });
148
+ carried = null;
149
+ previousParagraph = [];
150
+ // Headings supply context; by themselves they establish no proposition.
151
+ qualify(setext ? [i, i + 1] : [i], { view: 'discussion', reason: 'heading' }, [i]);
152
+ i += setext ? 2 : 1;
153
+ continue;
154
+ }
155
+ const start = i;
156
+ while (i < fileLines.length &&
157
+ fileLines[i].trim() &&
158
+ !/^\s*(?:#{1,6}\s|<!--|`{3,}|~{3,})/.test(fileLines[i]))
159
+ i++;
160
+ if (i === start) {
161
+ i++;
162
+ continue;
163
+ }
164
+ const indexes = Array.from({ length: i - start }, (_, j) => start + j);
165
+ const explicit = indexes.map((index) => ({ index, meaning: meaning(fileLines[index]) }));
166
+ const scoped = [...headings].reverse().find((entry) => entry.meaning.view !== 'factual');
167
+ // One later qualifier can reverse an earlier sentence within the same paragraph.
168
+ const decisive = explicit.find((entry) => entry.meaning.reason === 'conditional') ??
169
+ explicit.find((entry) => entry.meaning.reason === 'rejected') ??
170
+ explicit.find((entry) => entry.meaning.view !== 'factual');
171
+ if (decisive?.meaning.reason === 'conditional' || decisive?.meaning.reason === 'speaker')
172
+ carried = decisive;
173
+ const selected = source
174
+ ? { view: 'reports', reason: 'quotation' }
175
+ : (scoped?.meaning ?? carried?.meaning ?? decisive?.meaning ?? FACTUAL);
176
+ const context = selected.view === 'factual'
177
+ ? []
178
+ : [...headings.map((entry) => entry.index), ...(carried ? [carried.index] : []), ...indexes];
179
+ // A following correction/qualification can refer back across a paragraph break.
180
+ // Keep both paragraphs in the deciding frame instead of making the first look independent.
181
+ if (selected.view !== 'factual' &&
182
+ previousParagraph.length > 0 &&
183
+ /(?:^|[.!?]\s*)(?:but |however,? )?(?:this|that|the above|the preceding|correction|actually|это|выше|исправление|однако)(?=$|[^\p{L}])/iu.test(fileLines[start])) {
184
+ qualify(previousParagraph, selected, [...previousParagraph, ...context]);
185
+ }
186
+ qualify(indexes, selected, context);
187
+ previousParagraph = indexes;
188
+ }
189
+ return result;
190
+ }
191
+ export function qualifyProseLines(lines, fileLines) {
192
+ const qualifications = proseQualifications(fileLines);
193
+ return lines.map((line) => {
194
+ if (line.memory || line.observation)
195
+ return line;
196
+ const prose = qualifications.get(line.n);
197
+ return prose
198
+ ? { ...line, prose, ...(prose.answer_eligible ? {} : { fact: undefined, confidence: undefined }) }
199
+ : line;
200
+ });
201
+ }
202
+ export function proseEligibleForView(prose, view) {
203
+ if (view === 'all')
204
+ return true;
205
+ if (prose.status !== 'qualified')
206
+ return false;
207
+ return prose.answer_eligible || (view !== 'factual' && prose.view === view);
208
+ }
209
+ export function hasNonfactualProse(content) {
210
+ const lines = content.split('\n');
211
+ return [...proseQualifications(lines)].some(([, q]) => !q.answer_eligible && q.reason !== 'heading' && q.reason !== 'comment');
212
+ }
213
+ //# sourceMappingURL=prose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prose.js","sourceRoot":"","sources":["../../src/kb/prose.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;AAEnD,MAAM,OAAO,GAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACjE,MAAM,WAAW,GACf,8LAA8L,CAAC;AACjM,MAAM,SAAS,GACb,sLAAsL,CAAC;AACzL,MAAM,MAAM,GACV,qJAAqJ,CAAC;AACxJ,MAAM,QAAQ,GACZ,yJAAyJ,CAAC;AAC5J,MAAM,OAAO,GACX,oHAAoH,CAAC;AACvH,MAAM,OAAO,GACX,2GAA2G,CAAC;AAE9G,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI;SACf,IAAI,EAAE;SACN,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,2BAA2B,EAAE,IAAI,CAAC;SAC1C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,IAAI,EAAE,CAAC;IACV,2FAA2F;IAC3F,6FAA6F;IAC7F,IACE,0FAA0F,CAAC,IAAI,CAAC,KAAK,CAAC;QACtG,8GAA8G,CAAC,IAAI,CACjH,KAAK,CACN;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACtD,IACE,sGAAsG,CAAC,IAAI,CACzG,KAAK,CACN;QACD,wGAAwG,CAAC,IAAI,CAC3G,KAAK,CACN;QAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,OAAO,GAAG,KAAK;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACjF,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACxE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC7E,IAAI,OAAO,IAAI,uEAAuE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAChD,IACE,OAAO;QACP,yHAAyH,CAAC,IAAI,CAC5H,IAAI,CACL;QAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACzD,IACE,OAAO;QACP,wGAAwG,CAAC,IAAI,CAC3G,IAAI,CACL;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACtD,IAAI,OAAO,IAAI,qEAAqE,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7F,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACvD,IAAI,OAAO,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACxD,IACE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB,gGAAgG,CAAC,IAAI,CACnG,IAAI,CACL;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAChD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvG,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC1E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAmB;IACrD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IACrD,MAAM,QAAQ,GAAyD,EAAE,CAAC;IAC1E,IAAI,OAAO,GAA+C,IAAI,CAAC;IAC/D,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,MAAM,GAA2D,IAAI,CAAC;IAC1E,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,iBAAiB,GAAa,EAAE,CAAC;IAErC,MAAM,OAAO,GAAG,CAAC,OAAiB,EAAE,QAAiB,EAAE,OAAiB,EAAE,UAAU,GAAG,KAAK,EAAQ,EAAE;QACpG,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,QAAQ,GACZ,YAAY,CAAC,MAAM,GAAG,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QACpG,MAAM,MAAM,GAAG,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;QACnE,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;QAC3F,KAAK,MAAM,KAAK,IAAI,OAAO;YACzB,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE;gBACpB,MAAM;gBACN,GAAG,QAAQ;gBACX,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;gBACpD,eAAe,EAAE,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS;gBACtE,WAAW,EAAE,IAAI;gBACjB,KAAK;aACN,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;QAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC3B,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;YACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,YAAY,GAAG,IAAI,CAAC;YAC9C,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,IACE,KAAK;gBACL,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI;gBAC5B,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM;gBACjC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAE9B,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;QAC5D,IAAI,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,YAAY,GAAG,IAAI,CAAC;YACpB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,GAAG,KAAK,CAAC;YACrB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,YAAY,GAAG,CAAC,CAAC;YAC5C,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,OAAO,GACX,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrG,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM;gBAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;YACvF,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5F,OAAO,GAAG,IAAI,CAAC;YACf,iBAAiB,GAAG,EAAE,CAAC;YACvB,wEAAwE;YACxE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,OACE,CAAC,GAAG,SAAS,CAAC,MAAM;YACpB,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;YACpB,CAAC,mCAAmC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;YAExD,CAAC,EAAE,CAAC;QACN,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YAChB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACzF,iFAAiF;QACjF,MAAM,QAAQ,GACZ,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC7D,IAAI,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,aAAa,IAAI,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS;YACtF,OAAO,GAAG,QAAQ,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM;YACrB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAkB,EAAE,MAAM,EAAE,WAAoB,EAAE;YAC5D,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC;QAC1E,MAAM,OAAO,GACX,QAAQ,CAAC,IAAI,KAAK,SAAS;YACzB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;QACjG,gFAAgF;QAChF,2FAA2F;QAC3F,IACE,QAAQ,CAAC,IAAI,KAAK,SAAS;YAC3B,iBAAiB,CAAC,MAAM,GAAG,CAAC;YAC5B,yIAAyI,CAAC,IAAI,CAC5I,SAAS,CAAC,KAAK,CAAE,CAClB,EACD,CAAC;YACD,OAAO,CAAC,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACpC,iBAAiB,GAAG,OAAO,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAiB,KAAU,EAAE,SAAmB;IAC/E,MAAM,cAAc,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACjD,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,KAAK;YACV,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE;YAClG,CAAC,CAAC,IAAI,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAyB,EAAE,IAAgB;IAC9E,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,KAAK,CAAC,eAAe,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAClF,CAAC;AACJ,CAAC"}
@@ -68,8 +68,8 @@ export declare const CONFLICT_PROMPT_VERSION = "typed-v2-qualified";
68
68
  export declare const VERIFY_SCHEMA: z.ZodObject<{
69
69
  outcome: z.ZodEnum<{
70
70
  unresolved: "unresolved";
71
- superseded: "superseded";
72
71
  qualified: "qualified";
72
+ superseded: "superseded";
73
73
  not_a_conflict: "not_a_conflict";
74
74
  time_scoped: "time_scoped";
75
75
  }>;
@@ -6,6 +6,7 @@ export interface CuratedPage {
6
6
  slug: string;
7
7
  mode: 'hygiene' | 'synthesize';
8
8
  action: 'would-update' | 'updated' | 'unchanged' | 'rejected';
9
+ reason_code?: 'prose_discourse_held';
9
10
  splits: string[];
10
11
  extractions: string[];
11
12
  merges: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"curate.d.ts","sourceRoot":"","sources":["../../src/maintenance/curate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"curate.d.ts","sourceRoot":"","sources":["../../src/maintenance/curate.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import fs from 'node:fs';
2
+ import { hasNonfactualProse } from "../kb/prose.js";
1
3
  import fsp from 'node:fs/promises';
2
4
  import path from 'node:path';
3
5
  import { z } from 'zod';
@@ -266,6 +268,19 @@ export async function curatePages(ctx, options) {
266
268
  result.warnings.push(`${row.slug}: could not read page`);
267
269
  continue;
268
270
  }
271
+ if (hasNonfactualProse(before)) {
272
+ result.pages.push({
273
+ slug: row.slug,
274
+ mode: row.dream_management,
275
+ action: 'rejected',
276
+ reason_code: 'prose_discourse_held',
277
+ splits: [],
278
+ extractions: [],
279
+ merges: [],
280
+ issues: ['Whole-page rewriting is held because this page contains qualified discourse.'],
281
+ });
282
+ continue;
283
+ }
269
284
  const fm = parseFrontmatter(before);
270
285
  const body = before.slice(fm.bodyOffset);
271
286
  const inferenceInput = { slug: row.slug, title: row.title, frontmatter: fm.data, body };
@@ -860,6 +875,8 @@ async function inspectMergeCandidate(ctx, candidate) {
860
875
  const inverseIssue = inverseSplitMergeIssue(ctx, { relPath: candidate.canonical.rel_path, content: canonicalBefore }, { relPath: candidate.duplicate.rel_path, content: duplicateBefore });
861
876
  if (inverseIssue)
862
877
  issues.push(inverseIssue);
878
+ if (hasNonfactualProse(canonicalBefore) || hasNonfactualProse(duplicateBefore))
879
+ issues.push('Merging is held because a source contains qualified discourse.');
863
880
  if (Buffer.byteLength(canonical.body) + Buffer.byteLength(duplicate.body) > 80_000) {
864
881
  issues.push('merge inputs exceed the 80000-byte lossless planning limit');
865
882
  }
@@ -1290,7 +1307,17 @@ function evidenceFor(ctx, page) {
1290
1307
  const events = ctx.store.db.prepare(`SELECT date, summary FROM events
1291
1308
  WHERE source_page = ? AND target_slug = ?
1292
1309
  ORDER BY date DESC, line LIMIT 50`);
1293
- return rows.map((row) => {
1310
+ return rows
1311
+ .filter((row) => {
1312
+ // A neighboring summary may have been derived before its qualifier was edited.
1313
+ try {
1314
+ return !hasNonfactualProse(fs.readFileSync(path.join(ctx.config.aknoPath, row.rel_path), 'utf8'));
1315
+ }
1316
+ catch {
1317
+ return false;
1318
+ }
1319
+ })
1320
+ .map((row) => {
1294
1321
  const relationship = pageRelationship(row, page.slug);
1295
1322
  const allFacts = facts.all(row.id);
1296
1323
  return {