wiki-graph-core 0.3.1

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 (576) hide show
  1. package/LICENSE +201 -0
  2. package/data/editor/clue_reviewer.jinja +410 -0
  3. package/data/editor/clue_reviewer_generator.jinja +428 -0
  4. package/data/editor/revision_feedback.jinja +5 -0
  5. package/data/editor/text_compressor.jinja +127 -0
  6. package/data/guaranteed/response_intent_classifier.jinja +8 -0
  7. package/data/help/commands/archive/next.jinja +29 -0
  8. package/data/help/commands/gc.jinja +38 -0
  9. package/data/help/commands/legacy/migrate.jinja +20 -0
  10. package/data/help/commands/legacy.jinja +19 -0
  11. package/data/help/commands/maintenance/chapter/add.jinja +41 -0
  12. package/data/help/commands/maintenance/chapter/list.jinja +33 -0
  13. package/data/help/commands/maintenance/chapter/move.jinja +36 -0
  14. package/data/help/commands/maintenance/chapter/remove.jinja +26 -0
  15. package/data/help/commands/maintenance/chapter/reset.jinja +29 -0
  16. package/data/help/commands/maintenance/chapter/set-source.jinja +34 -0
  17. package/data/help/commands/maintenance/chapter/set-summary.jinja +31 -0
  18. package/data/help/commands/maintenance/chapter/set-title.jinja +29 -0
  19. package/data/help/commands/maintenance/chapter/tree.jinja +58 -0
  20. package/data/help/commands/maintenance/chapter.jinja +59 -0
  21. package/data/help/commands/maintenance/cover.jinja +28 -0
  22. package/data/help/commands/maintenance/meta.jinja +55 -0
  23. package/data/help/commands/predicate.jinja +460 -0
  24. package/data/help/commands/root.jinja +83 -0
  25. package/data/help/commands/transform.jinja +34 -0
  26. package/data/help/commands/uri.jinja +274 -0
  27. package/data/help/topics/config.jinja +88 -0
  28. package/data/help/topics/format.jinja +72 -0
  29. package/data/help/topics/readiness.jinja +99 -0
  30. package/data/help/topics/recipe.jinja +151 -0
  31. package/data/help/topics/runtime.jinja +62 -0
  32. package/data/help/topics/uri.jinja +178 -0
  33. package/data/output/epub/cover.xhtml.jinja +13 -0
  34. package/data/output/epub/nav.xhtml.jinja +12 -0
  35. package/data/output/epub/package.opf.xml.jinja +39 -0
  36. package/data/output/epub/section.xhtml.jinja +12 -0
  37. package/data/topologization/book_coherence_extraction.jinja +223 -0
  38. package/data/topologization/chunk_extraction.jinja +233 -0
  39. package/data/topologization/evidence_choice.jinja +38 -0
  40. package/data/topologization/translate_chunks.jinja +138 -0
  41. package/data/topologization/user_focused_extraction.jinja +378 -0
  42. package/dist/archive/query/archive-view.d.ts +26 -0
  43. package/dist/archive/query/archive-view.js +4540 -0
  44. package/dist/archive/query/archive-view.js.map +1 -0
  45. package/dist/archive/query/continuation-cursor.d.ts +61 -0
  46. package/dist/archive/query/continuation-cursor.js +363 -0
  47. package/dist/archive/query/continuation-cursor.js.map +1 -0
  48. package/dist/archive/query/index.d.ts +29 -0
  49. package/dist/archive/query/index.js +63 -0
  50. package/dist/archive/query/index.js.map +1 -0
  51. package/dist/archive/query/lexical-search.d.ts +22 -0
  52. package/dist/archive/query/lexical-search.js +137 -0
  53. package/dist/archive/query/lexical-search.js.map +1 -0
  54. package/dist/archive/query/search-cache.d.ts +192 -0
  55. package/dist/archive/query/search-cache.js +1248 -0
  56. package/dist/archive/query/search-cache.js.map +1 -0
  57. package/dist/archive/search-index/index.d.ts +26 -0
  58. package/dist/archive/search-index/index.js +29 -0
  59. package/dist/archive/search-index/index.js.map +1 -0
  60. package/dist/archive/search-index/search-index.d.ts +26 -0
  61. package/dist/archive/search-index/search-index.js +555 -0
  62. package/dist/archive/search-index/search-index.js.map +1 -0
  63. package/dist/archive/search-index/search-tokenizer.d.ts +16 -0
  64. package/dist/archive/search-index/search-tokenizer.js +225 -0
  65. package/dist/archive/search-index/search-tokenizer.js.map +1 -0
  66. package/dist/common/cli-command.d.ts +4 -0
  67. package/dist/common/cli-command.js +7 -0
  68. package/dist/common/cli-command.js.map +1 -0
  69. package/dist/common/data-dir.d.ts +3 -0
  70. package/dist/common/data-dir.js +48 -0
  71. package/dist/common/data-dir.js.map +1 -0
  72. package/dist/common/language.d.ts +55 -0
  73. package/dist/common/language.js +208 -0
  74. package/dist/common/language.js.map +1 -0
  75. package/dist/common/llm-scope.d.ts +19 -0
  76. package/dist/common/llm-scope.js +31 -0
  77. package/dist/common/llm-scope.js.map +1 -0
  78. package/dist/common/logging.d.ts +22 -0
  79. package/dist/common/logging.js +141 -0
  80. package/dist/common/logging.js.map +1 -0
  81. package/dist/common/template.d.ts +8 -0
  82. package/dist/common/template.js +54 -0
  83. package/dist/common/template.js.map +1 -0
  84. package/dist/common/tinyld-language.d.ts +6 -0
  85. package/dist/common/tinyld-language.js +34 -0
  86. package/dist/common/tinyld-language.js.map +1 -0
  87. package/dist/common/wiki-graph-dir.d.ts +10 -0
  88. package/dist/common/wiki-graph-dir.js +41 -0
  89. package/dist/common/wiki-graph-dir.js.map +1 -0
  90. package/dist/common/wiki-graph-temp.d.ts +6 -0
  91. package/dist/common/wiki-graph-temp.js +21 -0
  92. package/dist/common/wiki-graph-temp.js.map +1 -0
  93. package/dist/common/wiki-graph-uri.d.ts +28 -0
  94. package/dist/common/wiki-graph-uri.js +171 -0
  95. package/dist/common/wiki-graph-uri.js.map +1 -0
  96. package/dist/context/index.d.ts +1 -0
  97. package/dist/context/index.js +13 -0
  98. package/dist/context/index.js.map +1 -0
  99. package/dist/context/task-context.d.ts +41 -0
  100. package/dist/context/task-context.js +111 -0
  101. package/dist/context/task-context.js.map +1 -0
  102. package/dist/document/database.d.ts +30 -0
  103. package/dist/document/database.js +273 -0
  104. package/dist/document/database.js.map +1 -0
  105. package/dist/document/document.d.ts +153 -0
  106. package/dist/document/document.js +615 -0
  107. package/dist/document/document.js.map +1 -0
  108. package/dist/document/fragments.d.ts +63 -0
  109. package/dist/document/fragments.js +371 -0
  110. package/dist/document/fragments.js.map +1 -0
  111. package/dist/document/index.d.ts +13 -0
  112. package/dist/document/index.js +62 -0
  113. package/dist/document/index.js.map +1 -0
  114. package/dist/document/schema.d.ts +8 -0
  115. package/dist/document/schema.js +472 -0
  116. package/dist/document/schema.js.map +1 -0
  117. package/dist/document/shared-state-database.d.ts +9 -0
  118. package/dist/document/shared-state-database.js +193 -0
  119. package/dist/document/shared-state-database.js.map +1 -0
  120. package/dist/document/stores.d.ts +203 -0
  121. package/dist/document/stores.js +1678 -0
  122. package/dist/document/stores.js.map +1 -0
  123. package/dist/document/text-streams.d.ts +86 -0
  124. package/dist/document/text-streams.js +515 -0
  125. package/dist/document/text-streams.js.map +1 -0
  126. package/dist/document/types.d.ts +148 -0
  127. package/dist/document/types.js +69 -0
  128. package/dist/document/types.js.map +1 -0
  129. package/dist/editor/clue.d.ts +27 -0
  130. package/dist/editor/clue.js +158 -0
  131. package/dist/editor/clue.js.map +1 -0
  132. package/dist/editor/compressor.d.ts +18 -0
  133. package/dist/editor/compressor.js +68 -0
  134. package/dist/editor/compressor.js.map +1 -0
  135. package/dist/editor/editor.d.ts +39 -0
  136. package/dist/editor/editor.js +253 -0
  137. package/dist/editor/editor.js.map +1 -0
  138. package/dist/editor/feedback.d.ts +16 -0
  139. package/dist/editor/feedback.js +104 -0
  140. package/dist/editor/feedback.js.map +1 -0
  141. package/dist/editor/index.d.ts +17 -0
  142. package/dist/editor/index.js +5 -0
  143. package/dist/editor/index.js.map +1 -0
  144. package/dist/editor/language-review.d.ts +14 -0
  145. package/dist/editor/language-review.js +35 -0
  146. package/dist/editor/language-review.js.map +1 -0
  147. package/dist/editor/log.d.ts +37 -0
  148. package/dist/editor/log.js +202 -0
  149. package/dist/editor/log.js.map +1 -0
  150. package/dist/editor/markup.d.ts +20 -0
  151. package/dist/editor/markup.js +294 -0
  152. package/dist/editor/markup.js.map +1 -0
  153. package/dist/editor/prompt-templates.d.ts +6 -0
  154. package/dist/editor/prompt-templates.js +11 -0
  155. package/dist/editor/prompt-templates.js.map +1 -0
  156. package/dist/editor/response.d.ts +5 -0
  157. package/dist/editor/response.js +31 -0
  158. package/dist/editor/response.js.map +1 -0
  159. package/dist/editor/review.d.ts +34 -0
  160. package/dist/editor/review.js +189 -0
  161. package/dist/editor/review.js.map +1 -0
  162. package/dist/editor/types.d.ts +31 -0
  163. package/dist/editor/types.js +21 -0
  164. package/dist/editor/types.js.map +1 -0
  165. package/dist/evidence-selection/anchor-resolver.d.ts +43 -0
  166. package/dist/evidence-selection/anchor-resolver.js +783 -0
  167. package/dist/evidence-selection/anchor-resolver.js.map +1 -0
  168. package/dist/evidence-selection/anchor-types.d.ts +27 -0
  169. package/dist/evidence-selection/anchor-types.js +1 -0
  170. package/dist/evidence-selection/anchor-types.js.map +1 -0
  171. package/dist/evidence-selection/index.d.ts +8 -0
  172. package/dist/evidence-selection/index.js +32 -0
  173. package/dist/evidence-selection/index.js.map +1 -0
  174. package/dist/evidence-selection/prompt.d.ts +18 -0
  175. package/dist/evidence-selection/prompt.js +54 -0
  176. package/dist/evidence-selection/prompt.js.map +1 -0
  177. package/dist/evidence-selection/quote-score.d.ts +29 -0
  178. package/dist/evidence-selection/quote-score.js +331 -0
  179. package/dist/evidence-selection/quote-score.js.map +1 -0
  180. package/dist/evidence-selection/selection-resolver.d.ts +19 -0
  181. package/dist/evidence-selection/selection-resolver.js +303 -0
  182. package/dist/evidence-selection/selection-resolver.js.map +1 -0
  183. package/dist/evidence-selection/text.d.ts +4 -0
  184. package/dist/evidence-selection/text.js +66 -0
  185. package/dist/evidence-selection/text.js.map +1 -0
  186. package/dist/evidence-selection/types.d.ts +36 -0
  187. package/dist/evidence-selection/types.js +1 -0
  188. package/dist/evidence-selection/types.js.map +1 -0
  189. package/dist/facade/app.d.ts +75 -0
  190. package/dist/facade/app.js +141 -0
  191. package/dist/facade/app.js.map +1 -0
  192. package/dist/facade/build-queue.d.ts +181 -0
  193. package/dist/facade/build-queue.js +1442 -0
  194. package/dist/facade/build-queue.js.map +1 -0
  195. package/dist/facade/chapter-build.d.ts +60 -0
  196. package/dist/facade/chapter-build.js +1020 -0
  197. package/dist/facade/chapter-build.js.map +1 -0
  198. package/dist/facade/chapter.d.ts +168 -0
  199. package/dist/facade/chapter.js +944 -0
  200. package/dist/facade/chapter.js.map +1 -0
  201. package/dist/facade/digest.d.ts +55 -0
  202. package/dist/facade/digest.js +168 -0
  203. package/dist/facade/digest.js.map +1 -0
  204. package/dist/facade/graph.d.ts +60 -0
  205. package/dist/facade/graph.js +203 -0
  206. package/dist/facade/graph.js.map +1 -0
  207. package/dist/facade/import.d.ts +49 -0
  208. package/dist/facade/import.js +262 -0
  209. package/dist/facade/import.js.map +1 -0
  210. package/dist/facade/index.d.ts +39 -0
  211. package/dist/facade/index.js +171 -0
  212. package/dist/facade/index.js.map +1 -0
  213. package/dist/facade/knowledge-graph-build.d.ts +75 -0
  214. package/dist/facade/knowledge-graph-build.js +897 -0
  215. package/dist/facade/knowledge-graph-build.js.map +1 -0
  216. package/dist/facade/llm-sampling.d.ts +11 -0
  217. package/dist/facade/llm-sampling.js +58 -0
  218. package/dist/facade/llm-sampling.js.map +1 -0
  219. package/dist/facade/types.d.ts +8 -0
  220. package/dist/facade/types.js +1 -0
  221. package/dist/facade/types.js.map +1 -0
  222. package/dist/facade/wiki-graph-archive.d.ts +41 -0
  223. package/dist/facade/wiki-graph-archive.js +130 -0
  224. package/dist/facade/wiki-graph-archive.js.map +1 -0
  225. package/dist/gc/files.d.ts +15 -0
  226. package/dist/gc/files.js +141 -0
  227. package/dist/gc/files.js.map +1 -0
  228. package/dist/gc/index.d.ts +2 -0
  229. package/dist/gc/index.js +5 -0
  230. package/dist/gc/index.js.map +1 -0
  231. package/dist/gc/lock.d.ts +3 -0
  232. package/dist/gc/lock.js +137 -0
  233. package/dist/gc/lock.js.map +1 -0
  234. package/dist/gc/runner.d.ts +9 -0
  235. package/dist/gc/runner.js +129 -0
  236. package/dist/gc/runner.js.map +1 -0
  237. package/dist/gc/tmp-gc.d.ts +5 -0
  238. package/dist/gc/tmp-gc.js +57 -0
  239. package/dist/gc/tmp-gc.js.map +1 -0
  240. package/dist/gc/types.d.ts +24 -0
  241. package/dist/gc/types.js +1 -0
  242. package/dist/gc/types.js.map +1 -0
  243. package/dist/gc.cjs +10041 -0
  244. package/dist/gc.cjs.map +1 -0
  245. package/dist/gc.d.cts +10 -0
  246. package/dist/gc.d.ts +2 -0
  247. package/dist/gc.js +5 -0
  248. package/dist/gc.js.map +1 -0
  249. package/dist/guaranteed/classifier.d.ts +10 -0
  250. package/dist/guaranteed/classifier.js +88 -0
  251. package/dist/guaranteed/classifier.js.map +1 -0
  252. package/dist/guaranteed/errors.d.ts +38 -0
  253. package/dist/guaranteed/errors.js +73 -0
  254. package/dist/guaranteed/errors.js.map +1 -0
  255. package/dist/guaranteed/index.d.ts +7 -0
  256. package/dist/guaranteed/index.js +21 -0
  257. package/dist/guaranteed/index.js.map +1 -0
  258. package/dist/guaranteed/request.d.ts +8 -0
  259. package/dist/guaranteed/request.js +206 -0
  260. package/dist/guaranteed/request.js.map +1 -0
  261. package/dist/guaranteed/response.d.ts +12 -0
  262. package/dist/guaranteed/response.js +98 -0
  263. package/dist/guaranteed/response.js.map +1 -0
  264. package/dist/guaranteed/types.d.ts +20 -0
  265. package/dist/guaranteed/types.js +1 -0
  266. package/dist/guaranteed/types.js.map +1 -0
  267. package/dist/index-B8NNnQ8P.d.ts +424 -0
  268. package/dist/index.cjs +34774 -0
  269. package/dist/index.cjs.map +1 -0
  270. package/dist/index.d.cts +2462 -0
  271. package/dist/index.d.ts +79 -0
  272. package/dist/index.js +168 -0
  273. package/dist/index.js.map +1 -0
  274. package/dist/legacy-sdpub/upgrade.d.ts +7 -0
  275. package/dist/legacy-sdpub/upgrade.js +795 -0
  276. package/dist/legacy-sdpub/upgrade.js.map +1 -0
  277. package/dist/llm/cache.d.ts +13 -0
  278. package/dist/llm/cache.js +35 -0
  279. package/dist/llm/cache.js.map +1 -0
  280. package/dist/llm/client.d.ts +26 -0
  281. package/dist/llm/client.js +572 -0
  282. package/dist/llm/client.js.map +1 -0
  283. package/dist/llm/context.d.ts +22 -0
  284. package/dist/llm/context.js +78 -0
  285. package/dist/llm/context.js.map +1 -0
  286. package/dist/llm/errors.d.ts +7 -0
  287. package/dist/llm/errors.js +12 -0
  288. package/dist/llm/errors.js.map +1 -0
  289. package/dist/llm/index.d.ts +7 -0
  290. package/dist/llm/index.js +17 -0
  291. package/dist/llm/index.js.map +1 -0
  292. package/dist/llm/request-log.d.ts +9 -0
  293. package/dist/llm/request-log.js +35 -0
  294. package/dist/llm/request-log.js.map +1 -0
  295. package/dist/llm/sampling.d.ts +11 -0
  296. package/dist/llm/sampling.js +67 -0
  297. package/dist/llm/sampling.js.map +1 -0
  298. package/dist/llm/types.d.ts +50 -0
  299. package/dist/llm/types.js +1 -0
  300. package/dist/llm/types.js.map +1 -0
  301. package/dist/output/epub/archive.d.ts +9 -0
  302. package/dist/output/epub/archive.js +81 -0
  303. package/dist/output/epub/archive.js.map +1 -0
  304. package/dist/output/epub/book.d.ts +15 -0
  305. package/dist/output/epub/book.js +76 -0
  306. package/dist/output/epub/book.js.map +1 -0
  307. package/dist/output/epub/content.d.ts +9 -0
  308. package/dist/output/epub/content.js +35 -0
  309. package/dist/output/epub/content.js.map +1 -0
  310. package/dist/output/epub/index.d.ts +20 -0
  311. package/dist/output/epub/index.js +14 -0
  312. package/dist/output/epub/index.js.map +1 -0
  313. package/dist/output/epub/model.d.ts +24 -0
  314. package/dist/output/epub/model.js +1 -0
  315. package/dist/output/epub/model.js.map +1 -0
  316. package/dist/output/epub/navigation.d.ts +10 -0
  317. package/dist/output/epub/navigation.js +39 -0
  318. package/dist/output/epub/navigation.js.map +1 -0
  319. package/dist/output/epub/package.d.ts +17 -0
  320. package/dist/output/epub/package.js +29 -0
  321. package/dist/output/epub/package.js.map +1 -0
  322. package/dist/output/epub/shared.d.ts +4 -0
  323. package/dist/output/epub/shared.js +12 -0
  324. package/dist/output/epub/shared.js.map +1 -0
  325. package/dist/output/epub/templates.d.ts +35 -0
  326. package/dist/output/epub/templates.js +26 -0
  327. package/dist/output/epub/templates.js.map +1 -0
  328. package/dist/output/index.d.ts +14 -0
  329. package/dist/output/index.js +11 -0
  330. package/dist/output/index.js.map +1 -0
  331. package/dist/output/plain-text.d.ts +18 -0
  332. package/dist/output/plain-text.js +56 -0
  333. package/dist/output/plain-text.js.map +1 -0
  334. package/dist/progress/index.d.ts +3 -0
  335. package/dist/progress/index.js +14 -0
  336. package/dist/progress/index.js.map +1 -0
  337. package/dist/progress/reporter.d.ts +10 -0
  338. package/dist/progress/reporter.js +79 -0
  339. package/dist/progress/reporter.js.map +1 -0
  340. package/dist/progress/tracker.d.ts +37 -0
  341. package/dist/progress/tracker.js +119 -0
  342. package/dist/progress/tracker.js.map +1 -0
  343. package/dist/progress/types.d.ts +28 -0
  344. package/dist/progress/types.js +1 -0
  345. package/dist/progress/types.js.map +1 -0
  346. package/dist/reader/attention/attention.d.ts +39 -0
  347. package/dist/reader/attention/attention.js +123 -0
  348. package/dist/reader/attention/attention.js.map +1 -0
  349. package/dist/reader/attention/index.d.ts +9 -0
  350. package/dist/reader/attention/index.js +5 -0
  351. package/dist/reader/attention/index.js.map +1 -0
  352. package/dist/reader/attention/wave-reflection.d.ts +21 -0
  353. package/dist/reader/attention/wave-reflection.js +153 -0
  354. package/dist/reader/attention/wave-reflection.js.map +1 -0
  355. package/dist/reader/attention/working-memory.d.ts +28 -0
  356. package/dist/reader/attention/working-memory.js +62 -0
  357. package/dist/reader/attention/working-memory.js.map +1 -0
  358. package/dist/reader/chunk-batch/extract.d.ts +13 -0
  359. package/dist/reader/chunk-batch/extract.js +14 -0
  360. package/dist/reader/chunk-batch/extract.js.map +1 -0
  361. package/dist/reader/chunk-batch/extractor.d.ts +17 -0
  362. package/dist/reader/chunk-batch/extractor.js +337 -0
  363. package/dist/reader/chunk-batch/extractor.js.map +1 -0
  364. package/dist/reader/chunk-batch/fragment-projection.d.ts +34 -0
  365. package/dist/reader/chunk-batch/fragment-projection.js +94 -0
  366. package/dist/reader/chunk-batch/fragment-projection.js.map +1 -0
  367. package/dist/reader/chunk-batch/index.d.ts +12 -0
  368. package/dist/reader/chunk-batch/index.js +13 -0
  369. package/dist/reader/chunk-batch/index.js.map +1 -0
  370. package/dist/reader/chunk-batch/language.d.ts +9 -0
  371. package/dist/reader/chunk-batch/language.js +23 -0
  372. package/dist/reader/chunk-batch/language.js.map +1 -0
  373. package/dist/reader/chunk-batch/parser.d.ts +94 -0
  374. package/dist/reader/chunk-batch/parser.js +640 -0
  375. package/dist/reader/chunk-batch/parser.js.map +1 -0
  376. package/dist/reader/chunk-batch/prompt-templates.d.ts +6 -0
  377. package/dist/reader/chunk-batch/prompt-templates.js +11 -0
  378. package/dist/reader/chunk-batch/prompt-templates.js.map +1 -0
  379. package/dist/reader/chunk-batch/types.d.ts +85 -0
  380. package/dist/reader/chunk-batch/types.js +1 -0
  381. package/dist/reader/chunk-batch/types.js.map +1 -0
  382. package/dist/reader/index.d.ts +13 -0
  383. package/dist/reader/index.js +7 -0
  384. package/dist/reader/index.js.map +1 -0
  385. package/dist/reader/reader.d.ts +37 -0
  386. package/dist/reader/reader.js +82 -0
  387. package/dist/reader/reader.js.map +1 -0
  388. package/dist/reader/segment/index.d.ts +2 -0
  389. package/dist/reader/segment/index.js +5 -0
  390. package/dist/reader/segment/index.js.map +1 -0
  391. package/dist/reader/segment/intl-segmenter.d.ts +5 -0
  392. package/dist/reader/segment/intl-segmenter.js +102 -0
  393. package/dist/reader/segment/intl-segmenter.js.map +1 -0
  394. package/dist/reader/segment/segment.d.ts +5 -0
  395. package/dist/reader/segment/segment.js +9 -0
  396. package/dist/reader/segment/segment.js.map +1 -0
  397. package/dist/reader/segment/types.d.ts +14 -0
  398. package/dist/reader/segment/types.js +1 -0
  399. package/dist/reader/segment/types.js.map +1 -0
  400. package/dist/reader/types.d.ts +29 -0
  401. package/dist/reader/types.js +1 -0
  402. package/dist/reader/types.js.map +1 -0
  403. package/dist/serial.d.ts +89 -0
  404. package/dist/serial.js +476 -0
  405. package/dist/serial.js.map +1 -0
  406. package/dist/source/adapter.d.ts +15 -0
  407. package/dist/source/adapter.js +1 -0
  408. package/dist/source/adapter.js.map +1 -0
  409. package/dist/source/epub/archive.d.ts +27 -0
  410. package/dist/source/epub/archive.js +189 -0
  411. package/dist/source/epub/archive.js.map +1 -0
  412. package/dist/source/epub/content.d.ts +22 -0
  413. package/dist/source/epub/content.js +183 -0
  414. package/dist/source/epub/content.js.map +1 -0
  415. package/dist/source/epub/document.d.ts +55 -0
  416. package/dist/source/epub/document.js +179 -0
  417. package/dist/source/epub/document.js.map +1 -0
  418. package/dist/source/epub/index.d.ts +10 -0
  419. package/dist/source/epub/index.js +6 -0
  420. package/dist/source/epub/index.js.map +1 -0
  421. package/dist/source/epub/navigation.d.ts +16 -0
  422. package/dist/source/epub/navigation.js +215 -0
  423. package/dist/source/epub/navigation.js.map +1 -0
  424. package/dist/source/epub/package.d.ts +33 -0
  425. package/dist/source/epub/package.js +237 -0
  426. package/dist/source/epub/package.js.map +1 -0
  427. package/dist/source/epub/xml.d.ts +16 -0
  428. package/dist/source/epub/xml.js +111 -0
  429. package/dist/source/epub/xml.js.map +1 -0
  430. package/dist/source/index.d.ts +12 -0
  431. package/dist/source/index.js +32 -0
  432. package/dist/source/index.js.map +1 -0
  433. package/dist/source/meta.d.ts +30 -0
  434. package/dist/source/meta.js +22 -0
  435. package/dist/source/meta.js.map +1 -0
  436. package/dist/source/plain-text.d.ts +16 -0
  437. package/dist/source/plain-text.js +86 -0
  438. package/dist/source/plain-text.js.map +1 -0
  439. package/dist/source/toc.d.ts +16 -0
  440. package/dist/source/toc.js +17 -0
  441. package/dist/source/toc.js.map +1 -0
  442. package/dist/source/types.d.ts +16 -0
  443. package/dist/source/types.js +1 -0
  444. package/dist/source/types.js.map +1 -0
  445. package/dist/topology/grouping.d.ts +15 -0
  446. package/dist/topology/grouping.js +18 -0
  447. package/dist/topology/grouping.js.map +1 -0
  448. package/dist/topology/index.d.ts +21 -0
  449. package/dist/topology/index.js +5 -0
  450. package/dist/topology/index.js.map +1 -0
  451. package/dist/topology/resource-segmentation.d.ts +13 -0
  452. package/dist/topology/resource-segmentation.js +111 -0
  453. package/dist/topology/resource-segmentation.js.map +1 -0
  454. package/dist/topology/segment-incision.d.ts +18 -0
  455. package/dist/topology/segment-incision.js +197 -0
  456. package/dist/topology/segment-incision.js.map +1 -0
  457. package/dist/topology/snake-detector.d.ts +13 -0
  458. package/dist/topology/snake-detector.js +520 -0
  459. package/dist/topology/snake-detector.js.map +1 -0
  460. package/dist/topology/snake-graph-builder.d.ts +14 -0
  461. package/dist/topology/snake-graph-builder.js +76 -0
  462. package/dist/topology/snake-graph-builder.js.map +1 -0
  463. package/dist/topology/topology.d.ts +29 -0
  464. package/dist/topology/topology.js +348 -0
  465. package/dist/topology/topology.js.map +1 -0
  466. package/dist/topology/weights.d.ts +10 -0
  467. package/dist/topology/weights.js +84 -0
  468. package/dist/topology/weights.js.map +1 -0
  469. package/dist/types-FVIqiLC9.d.cts +24 -0
  470. package/dist/utils/async-semaphore.d.ts +7 -0
  471. package/dist/utils/async-semaphore.js +40 -0
  472. package/dist/utils/async-semaphore.js.map +1 -0
  473. package/dist/utils/enum.d.ts +5 -0
  474. package/dist/utils/enum.js +18 -0
  475. package/dist/utils/enum.js.map +1 -0
  476. package/dist/utils/hash.d.ts +3 -0
  477. package/dist/utils/hash.js +132 -0
  478. package/dist/utils/hash.js.map +1 -0
  479. package/dist/utils/node-error.d.ts +4 -0
  480. package/dist/utils/node-error.js +59 -0
  481. package/dist/utils/node-error.js.map +1 -0
  482. package/dist/wikg/archive-uri.d.ts +1 -0
  483. package/dist/wikg/archive-uri.js +37 -0
  484. package/dist/wikg/archive-uri.js.map +1 -0
  485. package/dist/wikg/archive.d.ts +28 -0
  486. package/dist/wikg/archive.js +496 -0
  487. package/dist/wikg/archive.js.map +1 -0
  488. package/dist/wikg/index.d.ts +31 -0
  489. package/dist/wikg/index.js +60 -0
  490. package/dist/wikg/index.js.map +1 -0
  491. package/dist/wikg/wikg-coordinator.d.ts +45 -0
  492. package/dist/wikg/wikg-coordinator.js +1687 -0
  493. package/dist/wikg/wikg-coordinator.js.map +1 -0
  494. package/dist/wikg/wiki-graph-archive-file.d.ts +42 -0
  495. package/dist/wikg/wiki-graph-archive-file.js +78 -0
  496. package/dist/wikg/wiki-graph-archive-file.js.map +1 -0
  497. package/dist/wikilink/index.d.ts +10 -0
  498. package/dist/wikilink/index.js +7 -0
  499. package/dist/wikilink/index.js.map +1 -0
  500. package/dist/wikilink/relation-discovery.d.ts +31 -0
  501. package/dist/wikilink/relation-discovery.js +477 -0
  502. package/dist/wikilink/relation-discovery.js.map +1 -0
  503. package/dist/wikilink/types.d.ts +23 -0
  504. package/dist/wikilink/types.js +1 -0
  505. package/dist/wikilink/types.js.map +1 -0
  506. package/dist/wikilink/window.d.ts +7 -0
  507. package/dist/wikilink/window.js +53 -0
  508. package/dist/wikilink/window.js.map +1 -0
  509. package/dist/wikimatch/enrichment.d.ts +10 -0
  510. package/dist/wikimatch/enrichment.js +55 -0
  511. package/dist/wikimatch/enrichment.js.map +1 -0
  512. package/dist/wikimatch/index.d.ts +16 -0
  513. package/dist/wikimatch/index.js +66 -0
  514. package/dist/wikimatch/index.js.map +1 -0
  515. package/dist/wikimatch/option-narrowing.d.ts +17 -0
  516. package/dist/wikimatch/option-narrowing.js +208 -0
  517. package/dist/wikimatch/option-narrowing.js.map +1 -0
  518. package/dist/wikimatch/options.d.ts +14 -0
  519. package/dist/wikimatch/options.js +155 -0
  520. package/dist/wikimatch/options.js.map +1 -0
  521. package/dist/wikimatch/policy-judge.d.ts +17 -0
  522. package/dist/wikimatch/policy-judge.js +430 -0
  523. package/dist/wikimatch/policy-judge.js.map +1 -0
  524. package/dist/wikimatch/range-suppression.d.ts +9 -0
  525. package/dist/wikimatch/range-suppression.js +27 -0
  526. package/dist/wikimatch/range-suppression.js.map +1 -0
  527. package/dist/wikimatch/surface-screening.d.ts +16 -0
  528. package/dist/wikimatch/surface-screening.js +168 -0
  529. package/dist/wikimatch/surface-screening.js.map +1 -0
  530. package/dist/wikimatch/surface-window.d.ts +6 -0
  531. package/dist/wikimatch/surface-window.js +44 -0
  532. package/dist/wikimatch/surface-window.js.map +1 -0
  533. package/dist/wikimatch/types.d.ts +151 -0
  534. package/dist/wikimatch/types.js +1 -0
  535. package/dist/wikimatch/types.js.map +1 -0
  536. package/dist/wikimatch/wikispine.d.ts +43 -0
  537. package/dist/wikimatch/wikispine.js +399 -0
  538. package/dist/wikimatch/wikispine.js.map +1 -0
  539. package/dist/wikimatch/window.d.ts +6 -0
  540. package/dist/wikimatch/window.js +83 -0
  541. package/dist/wikimatch/window.js.map +1 -0
  542. package/dist/wikimatch/words.d.ts +16 -0
  543. package/dist/wikimatch/words.js +66 -0
  544. package/dist/wikimatch/words.js.map +1 -0
  545. package/dist/wikipage/cache.d.ts +18 -0
  546. package/dist/wikipage/cache.js +404 -0
  547. package/dist/wikipage/cache.js.map +1 -0
  548. package/dist/wikipage/fetch-log.d.ts +17 -0
  549. package/dist/wikipage/fetch-log.js +143 -0
  550. package/dist/wikipage/fetch-log.js.map +1 -0
  551. package/dist/wikipage/index.d.ts +14 -0
  552. package/dist/wikipage/index.js +17 -0
  553. package/dist/wikipage/index.js.map +1 -0
  554. package/dist/wikipage/normalizer.d.ts +14 -0
  555. package/dist/wikipage/normalizer.js +147 -0
  556. package/dist/wikipage/normalizer.js.map +1 -0
  557. package/dist/wikipage/rate-limiter.d.ts +13 -0
  558. package/dist/wikipage/rate-limiter.js +84 -0
  559. package/dist/wikipage/rate-limiter.js.map +1 -0
  560. package/dist/wikipage/resolver.d.ts +26 -0
  561. package/dist/wikipage/resolver.js +325 -0
  562. package/dist/wikipage/resolver.js.map +1 -0
  563. package/dist/wikipage/types.d.ts +96 -0
  564. package/dist/wikipage/types.js +1 -0
  565. package/dist/wikipage/types.js.map +1 -0
  566. package/dist/wikipage/wikimedia-client.d.ts +48 -0
  567. package/dist/wikipage/wikimedia-client.js +397 -0
  568. package/dist/wikipage/wikimedia-client.js.map +1 -0
  569. package/dist/worker-BgQ0Xl8T.d.cts +181 -0
  570. package/dist/worker.cjs +5259 -0
  571. package/dist/worker.cjs.map +1 -0
  572. package/dist/worker.d.cts +2 -0
  573. package/dist/worker.d.ts +2 -0
  574. package/dist/worker.js +5 -0
  575. package/dist/worker.js.map +1 -0
  576. package/package.json +78 -0
@@ -0,0 +1,1678 @@
1
+ import { getNumber, getOptionalString, getString } from "./database.js";
2
+ import {
3
+ isChunkImportance,
4
+ isChunkRetention
5
+ } from "./types.js";
6
+ import { createHash } from "../utils/hash.js";
7
+ const MAX_SQL_BIND_PARAMS = 900;
8
+ class ObjectMetadataStore {
9
+ #database;
10
+ constructor(database) {
11
+ this.#database = database;
12
+ }
13
+ async getMap(objectPath) {
14
+ const rows = await this.#database.queryAll(
15
+ `
16
+ SELECT key, value_json
17
+ FROM object_metadata
18
+ WHERE object_path = ?
19
+ ORDER BY key
20
+ `,
21
+ [objectPath],
22
+ (row) => ({
23
+ key: getString(row, "key"),
24
+ value: parseMetadataValue(getString(row, "value_json"))
25
+ })
26
+ );
27
+ const result = {};
28
+ for (const row of rows) {
29
+ result[row.key] = row.value;
30
+ }
31
+ return result;
32
+ }
33
+ async replaceMap(target, map) {
34
+ await this.#database.transaction(async () => {
35
+ await this.clear(target.objectPath);
36
+ for (const [key, value] of Object.entries(map)) {
37
+ await this.put(target, key, value);
38
+ }
39
+ });
40
+ }
41
+ async put(target, key, value) {
42
+ await this.#database.run(
43
+ `
44
+ INSERT INTO object_metadata (
45
+ object_kind,
46
+ object_path,
47
+ key,
48
+ value_json,
49
+ updated_at,
50
+ chapter_id,
51
+ chunk_id,
52
+ entity_qid,
53
+ triple_subject_qid,
54
+ triple_predicate,
55
+ triple_object_qid
56
+ )
57
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
58
+ ON CONFLICT(object_path, key) DO UPDATE SET
59
+ object_kind = excluded.object_kind,
60
+ value_json = excluded.value_json,
61
+ updated_at = excluded.updated_at,
62
+ chapter_id = excluded.chapter_id,
63
+ chunk_id = excluded.chunk_id,
64
+ entity_qid = excluded.entity_qid,
65
+ triple_subject_qid = excluded.triple_subject_qid,
66
+ triple_predicate = excluded.triple_predicate,
67
+ triple_object_qid = excluded.triple_object_qid
68
+ `,
69
+ [
70
+ target.kind,
71
+ target.objectPath,
72
+ key,
73
+ JSON.stringify(value),
74
+ (/* @__PURE__ */ new Date()).toISOString(),
75
+ target.chapterId ?? null,
76
+ target.chunkId ?? null,
77
+ target.entityQid ?? null,
78
+ target.tripleSubjectQid ?? null,
79
+ target.triplePredicate ?? null,
80
+ target.tripleObjectQid ?? null
81
+ ]
82
+ );
83
+ }
84
+ async deleteKey(objectPath, key) {
85
+ await this.#database.run(
86
+ `
87
+ DELETE FROM object_metadata
88
+ WHERE object_path = ?
89
+ AND key = ?
90
+ `,
91
+ [objectPath, key]
92
+ );
93
+ }
94
+ async clear(objectPath) {
95
+ await this.#database.run(
96
+ `
97
+ DELETE FROM object_metadata
98
+ WHERE object_path = ?
99
+ `,
100
+ [objectPath]
101
+ );
102
+ }
103
+ async deleteChapterSubtree(chapterId) {
104
+ await this.#database.run(
105
+ `
106
+ DELETE FROM object_metadata
107
+ WHERE chapter_id = ?
108
+ `,
109
+ [chapterId]
110
+ );
111
+ }
112
+ async deleteDeletedChunks() {
113
+ await this.#database.run(`
114
+ DELETE FROM object_metadata
115
+ WHERE chunk_id IS NOT NULL
116
+ AND NOT EXISTS (
117
+ SELECT 1
118
+ FROM chunks
119
+ WHERE chunks.id = object_metadata.chunk_id
120
+ )
121
+ `);
122
+ }
123
+ async deleteDeletedEntitiesAndTriples() {
124
+ await this.#database.run(`
125
+ DELETE FROM object_metadata
126
+ WHERE entity_qid IS NOT NULL
127
+ AND NOT EXISTS (
128
+ SELECT 1
129
+ FROM mentions
130
+ WHERE mentions.qid = object_metadata.entity_qid
131
+ )
132
+ `);
133
+ await this.#database.run(`
134
+ DELETE FROM object_metadata
135
+ WHERE triple_subject_qid IS NOT NULL
136
+ AND NOT EXISTS (
137
+ SELECT 1
138
+ FROM mention_links
139
+ JOIN mentions AS source_mentions
140
+ ON source_mentions.id = mention_links.source_mention_id
141
+ JOIN mentions AS target_mentions
142
+ ON target_mentions.id = mention_links.target_mention_id
143
+ WHERE source_mentions.qid = object_metadata.triple_subject_qid
144
+ AND mention_links.predicate = object_metadata.triple_predicate
145
+ AND target_mentions.qid = object_metadata.triple_object_qid
146
+ )
147
+ `);
148
+ }
149
+ }
150
+ class SerialStore {
151
+ #database;
152
+ constructor(database) {
153
+ this.#database = database;
154
+ }
155
+ async create() {
156
+ return await this.#database.transaction(async () => {
157
+ await this.#database.run(
158
+ `
159
+ INSERT INTO serials DEFAULT VALUES
160
+ `
161
+ );
162
+ const serialId = await this.#database.getLastInsertRowId();
163
+ await this.#database.run(
164
+ `
165
+ INSERT INTO serial_states (
166
+ serial_id, revision, topology_ready, knowledge_graph_ready
167
+ )
168
+ VALUES (?, ?, ?, ?)
169
+ `,
170
+ [serialId, 0, 0, 0]
171
+ );
172
+ return serialId;
173
+ });
174
+ }
175
+ async createWithId(serialId) {
176
+ try {
177
+ await this.#database.transaction(async () => {
178
+ await this.#database.run(
179
+ `
180
+ INSERT INTO serials (id)
181
+ VALUES (?)
182
+ `,
183
+ [serialId]
184
+ );
185
+ await this.#database.run(
186
+ `
187
+ INSERT INTO serial_states (
188
+ serial_id, revision, topology_ready, knowledge_graph_ready
189
+ )
190
+ VALUES (?, ?, ?, ?)
191
+ `,
192
+ [serialId, 0, 0, 0]
193
+ );
194
+ });
195
+ } catch (error) {
196
+ if (isSqliteConstraintError(error)) {
197
+ throw new Error(`Serial ${serialId} already exists`);
198
+ }
199
+ throw error;
200
+ }
201
+ }
202
+ async ensure(serialId) {
203
+ await this.#database.transaction(async () => {
204
+ await this.#database.run(
205
+ `
206
+ INSERT OR IGNORE INTO serials (id)
207
+ VALUES (?)
208
+ `,
209
+ [serialId]
210
+ );
211
+ await this.#database.run(
212
+ `
213
+ INSERT OR IGNORE INTO serial_states (
214
+ serial_id, revision, topology_ready, knowledge_graph_ready
215
+ )
216
+ VALUES (?, ?, ?, ?)
217
+ `,
218
+ [serialId, 0, 0, 0]
219
+ );
220
+ });
221
+ }
222
+ async getById(serialId) {
223
+ return await this.#database.queryOne(
224
+ `
225
+ SELECT
226
+ serials.id AS id,
227
+ serials.document_order AS document_order,
228
+ COALESCE(serial_states.revision, 0) AS revision,
229
+ COALESCE(serial_states.topology_ready, 0) AS topology_ready,
230
+ serial_states.topology_parameter_hash AS topology_parameter_hash,
231
+ COALESCE(serial_states.knowledge_graph_ready, 0) AS knowledge_graph_ready,
232
+ serial_states.knowledge_graph_parameter_hash AS knowledge_graph_parameter_hash
233
+ FROM serials
234
+ LEFT JOIN serial_states
235
+ ON serial_states.serial_id = serials.id
236
+ WHERE serials.id = ?
237
+ `,
238
+ [serialId],
239
+ mapSerialRow
240
+ );
241
+ }
242
+ async getRevision(serialId) {
243
+ return await this.#database.queryOne(
244
+ `
245
+ SELECT COALESCE(revision, 0) AS revision
246
+ FROM serial_states
247
+ WHERE serial_id = ?
248
+ `,
249
+ [serialId],
250
+ (row) => getNumber(row, "revision")
251
+ ) ?? 0;
252
+ }
253
+ async getRevisions(serialIds) {
254
+ const uniqueIds = [...new Set(serialIds)].sort(compareNumber);
255
+ if (uniqueIds.length === 0) {
256
+ return /* @__PURE__ */ new Map();
257
+ }
258
+ const rows = await this.#database.queryAll(
259
+ `
260
+ SELECT serial_id, COALESCE(revision, 0) AS revision
261
+ FROM serial_states
262
+ WHERE serial_id IN (${uniqueIds.map(() => "?").join(", ")})
263
+ ORDER BY serial_id
264
+ `,
265
+ uniqueIds,
266
+ (row) => [getNumber(row, "serial_id"), getNumber(row, "revision")]
267
+ );
268
+ return new Map(rows);
269
+ }
270
+ async bumpRevision(serialId) {
271
+ await this.ensure(serialId);
272
+ await this.#database.transaction(async () => {
273
+ await this.#database.run(
274
+ `
275
+ UPDATE serial_states
276
+ SET revision = revision + 1
277
+ WHERE serial_id = ?
278
+ `,
279
+ [serialId]
280
+ );
281
+ await this.bumpChaptersRevision();
282
+ });
283
+ }
284
+ async bumpChaptersRevision() {
285
+ await this.#database.run(
286
+ `
287
+ INSERT INTO archive_revisions (key, value)
288
+ VALUES ('chapters', 1)
289
+ ON CONFLICT(key) DO UPDATE SET value = value + 1
290
+ `
291
+ );
292
+ }
293
+ async getChaptersRevision() {
294
+ return await this.#database.queryOne(
295
+ `
296
+ SELECT value
297
+ FROM archive_revisions
298
+ WHERE key = 'chapters'
299
+ `,
300
+ void 0,
301
+ (row) => getNumber(row, "value")
302
+ ) ?? 0;
303
+ }
304
+ async getMaxId() {
305
+ const maxId = await this.#database.queryOne(
306
+ `
307
+ SELECT COALESCE(MAX(id), 0) AS max_id
308
+ FROM serials
309
+ `,
310
+ void 0,
311
+ (row) => getNumber(row, "max_id")
312
+ );
313
+ return maxId ?? 0;
314
+ }
315
+ async setTopologyReady(serialId, ready = true, parameterHash) {
316
+ await this.ensure(serialId);
317
+ if (ready) {
318
+ await this.#database.run(
319
+ `
320
+ UPDATE serial_states
321
+ SET
322
+ topology_ready = ?,
323
+ topology_parameter_hash = COALESCE(?, topology_parameter_hash)
324
+ WHERE serial_id = ?
325
+ `,
326
+ [1, parameterHash ?? null, serialId]
327
+ );
328
+ return;
329
+ }
330
+ await this.#database.run(
331
+ `
332
+ UPDATE serial_states
333
+ SET
334
+ topology_ready = ?,
335
+ topology_parameter_hash = NULL
336
+ WHERE serial_id = ?
337
+ `,
338
+ [0, serialId]
339
+ );
340
+ }
341
+ async setKnowledgeGraphReady(serialId, ready = true, parameterHash) {
342
+ await this.ensure(serialId);
343
+ if (ready) {
344
+ await this.#database.run(
345
+ `
346
+ UPDATE serial_states
347
+ SET
348
+ knowledge_graph_ready = ?,
349
+ knowledge_graph_parameter_hash = COALESCE(?, knowledge_graph_parameter_hash)
350
+ WHERE serial_id = ?
351
+ `,
352
+ [1, parameterHash ?? null, serialId]
353
+ );
354
+ return;
355
+ }
356
+ await this.#database.run(
357
+ `
358
+ UPDATE serial_states
359
+ SET
360
+ knowledge_graph_ready = ?,
361
+ knowledge_graph_parameter_hash = NULL
362
+ WHERE serial_id = ?
363
+ `,
364
+ [0, serialId]
365
+ );
366
+ }
367
+ async listIds() {
368
+ return await this.#database.queryAll(
369
+ `
370
+ SELECT id
371
+ FROM serials
372
+ ORDER BY id
373
+ `,
374
+ void 0,
375
+ (row) => getNumber(row, "id")
376
+ );
377
+ }
378
+ async listDocumentOrders() {
379
+ const rows = await this.#database.queryAll(
380
+ `
381
+ SELECT id, document_order
382
+ FROM serials
383
+ ORDER BY id
384
+ `,
385
+ void 0,
386
+ (row) => [getNumber(row, "id"), getNumber(row, "document_order")]
387
+ );
388
+ return new Map(rows);
389
+ }
390
+ async setDocumentOrders(entries) {
391
+ await this.#database.transaction(async () => {
392
+ for (const entry of entries) {
393
+ await this.#database.run(
394
+ `
395
+ INSERT OR IGNORE INTO serials (id)
396
+ VALUES (?)
397
+ `,
398
+ [entry.serialId]
399
+ );
400
+ await this.#database.run(
401
+ `
402
+ INSERT OR IGNORE INTO serial_states (
403
+ serial_id, revision, topology_ready, knowledge_graph_ready
404
+ )
405
+ VALUES (?, ?, ?, ?)
406
+ `,
407
+ [entry.serialId, 0, 0, 0]
408
+ );
409
+ await this.#database.run(
410
+ `
411
+ UPDATE serials
412
+ SET document_order = ?
413
+ WHERE id = ?
414
+ `,
415
+ [entry.documentOrder, entry.serialId]
416
+ );
417
+ }
418
+ });
419
+ }
420
+ }
421
+ function mapSerialRow(row) {
422
+ const topologyParameterHash = getOptionalString(
423
+ row,
424
+ "topology_parameter_hash"
425
+ );
426
+ const knowledgeGraphParameterHash = getOptionalString(
427
+ row,
428
+ "knowledge_graph_parameter_hash"
429
+ );
430
+ return {
431
+ documentOrder: getNumber(row, "document_order"),
432
+ id: getNumber(row, "id"),
433
+ knowledgeGraphReady: getNumber(row, "knowledge_graph_ready") !== 0,
434
+ ...knowledgeGraphParameterHash === void 0 ? {} : { knowledgeGraphParameterHash },
435
+ revision: getNumber(row, "revision"),
436
+ topologyReady: getNumber(row, "topology_ready") !== 0,
437
+ ...topologyParameterHash === void 0 ? {} : { topologyParameterHash }
438
+ };
439
+ }
440
+ function compareNumber(left, right) {
441
+ return left - right;
442
+ }
443
+ class GraphBuildParameterStore {
444
+ #database;
445
+ constructor(database) {
446
+ this.#database = database;
447
+ }
448
+ async save(input) {
449
+ const hash = createHash({
450
+ language: input.language ?? null,
451
+ prompt: input.prompt
452
+ });
453
+ const createdAt = (/* @__PURE__ */ new Date()).toISOString();
454
+ await this.#database.run(
455
+ `
456
+ INSERT OR IGNORE INTO graph_build_parameters (
457
+ hash, prompt, language, created_at
458
+ )
459
+ VALUES (?, ?, ?, ?)
460
+ `,
461
+ [hash, input.prompt, input.language ?? null, createdAt]
462
+ );
463
+ return await this.getByHash(hash);
464
+ }
465
+ async getByHash(hash) {
466
+ return await this.#database.queryOne(
467
+ `
468
+ SELECT hash, prompt, language, created_at
469
+ FROM graph_build_parameters
470
+ WHERE hash = ?
471
+ `,
472
+ [hash],
473
+ (row) => {
474
+ const language = getOptionalString(row, "language");
475
+ return {
476
+ createdAt: getString(row, "created_at"),
477
+ hash: getString(row, "hash"),
478
+ ...language === void 0 ? {} : { language },
479
+ prompt: getString(row, "prompt")
480
+ };
481
+ }
482
+ );
483
+ }
484
+ async deleteUnreferenced() {
485
+ await this.#database.run(`
486
+ DELETE FROM graph_build_parameters
487
+ WHERE hash NOT IN (
488
+ SELECT topology_parameter_hash
489
+ FROM serial_states
490
+ WHERE topology_parameter_hash IS NOT NULL
491
+ UNION
492
+ SELECT knowledge_graph_parameter_hash
493
+ FROM serial_states
494
+ WHERE knowledge_graph_parameter_hash IS NOT NULL
495
+ )
496
+ `);
497
+ }
498
+ }
499
+ function isSqliteConstraintError(error) {
500
+ return typeof error === "object" && error !== null && "code" in error && typeof error.code === "string" && error.code.startsWith("SQLITE_CONSTRAINT");
501
+ }
502
+ class ChunkStore {
503
+ #database;
504
+ constructor(database) {
505
+ this.#database = database;
506
+ }
507
+ async countAll() {
508
+ return await this.#database.queryOne(
509
+ `
510
+ SELECT COUNT(*) AS count
511
+ FROM chunks
512
+ `,
513
+ void 0,
514
+ (row) => getNumber(row, "count")
515
+ ) ?? 0;
516
+ }
517
+ async create(record) {
518
+ return await this.#database.transaction(async () => {
519
+ await this.#database.run(
520
+ `
521
+ INSERT INTO chunks (
522
+ generation,
523
+ serial_id,
524
+ sentence_index,
525
+ label,
526
+ content,
527
+ retention,
528
+ importance,
529
+ wordsCount,
530
+ weight
531
+ )
532
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
533
+ `,
534
+ [
535
+ record.generation,
536
+ record.sentenceId[0],
537
+ record.sentenceId[1],
538
+ record.label,
539
+ record.content,
540
+ record.retention ?? null,
541
+ record.importance ?? null,
542
+ record.wordsCount,
543
+ record.weight
544
+ ]
545
+ );
546
+ const id = await this.#database.getLastInsertRowId();
547
+ const createdRecord = {
548
+ ...record,
549
+ id
550
+ };
551
+ await this.#replaceChunkSentences(createdRecord);
552
+ return createdRecord;
553
+ });
554
+ }
555
+ async save(record) {
556
+ await this.#database.transaction(async () => {
557
+ await this.#database.run(
558
+ `
559
+ INSERT OR REPLACE INTO chunks (
560
+ id,
561
+ generation,
562
+ serial_id,
563
+ sentence_index,
564
+ label,
565
+ content,
566
+ retention,
567
+ importance,
568
+ wordsCount,
569
+ weight
570
+ )
571
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
572
+ `,
573
+ [
574
+ record.id,
575
+ record.generation,
576
+ record.sentenceId[0],
577
+ record.sentenceId[1],
578
+ record.label,
579
+ record.content,
580
+ record.retention ?? null,
581
+ record.importance ?? null,
582
+ record.wordsCount,
583
+ record.weight
584
+ ]
585
+ );
586
+ await this.#replaceChunkSentences(record);
587
+ });
588
+ }
589
+ async getById(chunkId) {
590
+ const row = await this.#database.queryOne(
591
+ `
592
+ SELECT
593
+ id,
594
+ generation,
595
+ serial_id,
596
+ sentence_index,
597
+ label,
598
+ content,
599
+ retention,
600
+ importance,
601
+ wordsCount,
602
+ weight
603
+ FROM chunks
604
+ WHERE id = ?
605
+ `,
606
+ [chunkId],
607
+ (value) => value
608
+ );
609
+ if (row === void 0) {
610
+ return void 0;
611
+ }
612
+ return await this.#mapChunkRow(row);
613
+ }
614
+ async listAll() {
615
+ const rows = await this.#database.queryAll(
616
+ `
617
+ SELECT
618
+ id,
619
+ generation,
620
+ serial_id,
621
+ sentence_index,
622
+ label,
623
+ content,
624
+ retention,
625
+ importance,
626
+ wordsCount,
627
+ weight
628
+ FROM chunks
629
+ ORDER BY id
630
+ `,
631
+ void 0,
632
+ (row) => row
633
+ );
634
+ return await Promise.all(
635
+ rows.map(async (row) => await this.#mapChunkRow(row))
636
+ );
637
+ }
638
+ async listBySentenceStartIndexes(serialId, sentenceStartIndexes) {
639
+ if (sentenceStartIndexes.length === 0) {
640
+ return [];
641
+ }
642
+ const results = await Promise.all(
643
+ sentenceStartIndexes.map(
644
+ async (sentenceStartIndex) => await this.listBySentenceRange(
645
+ serialId,
646
+ sentenceStartIndex,
647
+ sentenceStartIndex
648
+ )
649
+ )
650
+ );
651
+ return deduplicateById(results.flat());
652
+ }
653
+ async listBySentenceRange(serialId, startSentenceIndex, endSentenceIndex) {
654
+ const rows = await this.#database.queryAll(
655
+ `
656
+ SELECT
657
+ id,
658
+ generation,
659
+ serial_id,
660
+ sentence_index,
661
+ label,
662
+ content,
663
+ retention,
664
+ importance,
665
+ wordsCount,
666
+ weight
667
+ FROM chunks
668
+ WHERE serial_id = ?
669
+ AND sentence_index BETWEEN ? AND ?
670
+ ORDER BY id
671
+ `,
672
+ [serialId, startSentenceIndex, endSentenceIndex],
673
+ (row) => row
674
+ );
675
+ return await Promise.all(
676
+ rows.map(async (row) => await this.#mapChunkRow(row))
677
+ );
678
+ }
679
+ async listBySerial(serialId) {
680
+ const rows = await this.#database.queryAll(
681
+ `
682
+ SELECT
683
+ id,
684
+ generation,
685
+ serial_id,
686
+ sentence_index,
687
+ label,
688
+ content,
689
+ retention,
690
+ importance,
691
+ wordsCount,
692
+ weight
693
+ FROM chunks
694
+ WHERE serial_id = ?
695
+ ORDER BY id
696
+ `,
697
+ [serialId],
698
+ (row) => row
699
+ );
700
+ return await Promise.all(
701
+ rows.map(async (row) => await this.#mapChunkRow(row))
702
+ );
703
+ }
704
+ async getMaxId() {
705
+ return await this.#database.queryOne(
706
+ `
707
+ SELECT MAX(id) AS id
708
+ FROM chunks
709
+ `,
710
+ void 0,
711
+ (row) => {
712
+ const value = row.id;
713
+ return typeof value === "number" ? value : 0;
714
+ }
715
+ ) ?? 0;
716
+ }
717
+ async listFragmentPairs() {
718
+ return await this.#database.queryAll(
719
+ `
720
+ SELECT DISTINCT serial_id, sentence_index
721
+ FROM chunks
722
+ ORDER BY serial_id, sentence_index
723
+ `,
724
+ void 0,
725
+ (row) => [
726
+ getNumber(row, "serial_id"),
727
+ getNumber(row, "sentence_index")
728
+ ]
729
+ );
730
+ }
731
+ async #getSentenceIds(chunkId) {
732
+ return await this.#database.queryAll(
733
+ `
734
+ SELECT serial_id, sentence_index
735
+ FROM chunk_sentences
736
+ WHERE chunk_id = ?
737
+ ORDER BY serial_id, sentence_index
738
+ `,
739
+ [chunkId],
740
+ (row) => [
741
+ getNumber(row, "serial_id"),
742
+ getNumber(row, "sentence_index")
743
+ ]
744
+ );
745
+ }
746
+ async #replaceChunkSentences(record) {
747
+ await this.#database.run(
748
+ `
749
+ DELETE FROM chunk_sentences
750
+ WHERE chunk_id = ?
751
+ `,
752
+ [record.id]
753
+ );
754
+ for (const sentenceId of record.sentenceIds) {
755
+ await this.#database.run(
756
+ `
757
+ INSERT INTO chunk_sentences (
758
+ chunk_id,
759
+ serial_id,
760
+ sentence_index
761
+ )
762
+ VALUES (?, ?, ?)
763
+ `,
764
+ [record.id, sentenceId[0], sentenceId[1]]
765
+ );
766
+ }
767
+ }
768
+ async #mapChunkRow(row) {
769
+ const chunkId = getNumber(row, "id");
770
+ const importance = parseChunkImportance(
771
+ getOptionalString(row, "importance")
772
+ );
773
+ const retention = parseChunkRetention(getOptionalString(row, "retention"));
774
+ return {
775
+ content: getString(row, "content"),
776
+ generation: getNumber(row, "generation"),
777
+ id: chunkId,
778
+ label: getString(row, "label"),
779
+ sentenceId: [
780
+ getNumber(row, "serial_id"),
781
+ getNumber(row, "sentence_index")
782
+ ],
783
+ sentenceIds: await this.#getSentenceIds(chunkId),
784
+ wordsCount: getNumber(row, "wordsCount"),
785
+ weight: getNumber(row, "weight"),
786
+ ...importance === void 0 ? {} : { importance },
787
+ ...retention === void 0 ? {} : { retention }
788
+ };
789
+ }
790
+ }
791
+ class ReadingEdgeStore {
792
+ #database;
793
+ constructor(database) {
794
+ this.#database = database;
795
+ }
796
+ async countAll() {
797
+ return await this.#database.queryOne(
798
+ `
799
+ SELECT COUNT(*) AS count
800
+ FROM reading_edges
801
+ `,
802
+ void 0,
803
+ (row) => getNumber(row, "count")
804
+ ) ?? 0;
805
+ }
806
+ async save(record) {
807
+ await this.#database.run(
808
+ `
809
+ INSERT OR REPLACE INTO reading_edges (from_id, to_id, strength, weight)
810
+ VALUES (?, ?, ?, ?)
811
+ `,
812
+ [record.fromId, record.toId, record.strength ?? null, record.weight]
813
+ );
814
+ }
815
+ async listAll() {
816
+ return await this.#database.queryAll(
817
+ `
818
+ SELECT from_id, to_id, strength, weight
819
+ FROM reading_edges
820
+ ORDER BY from_id, to_id
821
+ `,
822
+ void 0,
823
+ (row) => mapReadingEdgeRow(row)
824
+ );
825
+ }
826
+ async listBySerial(serialId) {
827
+ return await this.#database.queryAll(
828
+ `
829
+ SELECT
830
+ reading_edges.from_id AS from_id,
831
+ reading_edges.to_id AS to_id,
832
+ reading_edges.strength AS strength,
833
+ reading_edges.weight AS weight
834
+ FROM reading_edges
835
+ INNER JOIN chunks AS from_chunks
836
+ ON from_chunks.id = reading_edges.from_id
837
+ INNER JOIN chunks AS to_chunks
838
+ ON to_chunks.id = reading_edges.to_id
839
+ WHERE from_chunks.serial_id = ? AND to_chunks.serial_id = ?
840
+ ORDER BY reading_edges.from_id, reading_edges.to_id
841
+ `,
842
+ [serialId, serialId],
843
+ (row) => mapReadingEdgeRow(row)
844
+ );
845
+ }
846
+ async listIncoming(chunkId) {
847
+ return await this.#listByDirection("to_id", chunkId);
848
+ }
849
+ async listOutgoing(chunkId) {
850
+ return await this.#listByDirection("from_id", chunkId);
851
+ }
852
+ async #listByDirection(column, chunkId) {
853
+ return await this.#database.queryAll(
854
+ `
855
+ SELECT from_id, to_id, strength, weight
856
+ FROM reading_edges
857
+ WHERE ${column} = ?
858
+ ORDER BY from_id, to_id
859
+ `,
860
+ [chunkId],
861
+ (row) => mapReadingEdgeRow(row)
862
+ );
863
+ }
864
+ }
865
+ class SnakeStore {
866
+ #database;
867
+ constructor(database) {
868
+ this.#database = database;
869
+ }
870
+ async create(record) {
871
+ await this.#database.run(
872
+ `
873
+ INSERT INTO snakes (
874
+ serial_id,
875
+ group_id,
876
+ local_snake_id,
877
+ size,
878
+ first_label,
879
+ last_label,
880
+ wordsCount,
881
+ weight
882
+ )
883
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
884
+ `,
885
+ [
886
+ record.serialId,
887
+ record.groupId,
888
+ record.localSnakeId,
889
+ record.size,
890
+ record.firstLabel,
891
+ record.lastLabel,
892
+ record.wordsCount ?? 0,
893
+ record.weight ?? 0
894
+ ]
895
+ );
896
+ return await this.#database.getLastInsertRowId();
897
+ }
898
+ async getById(snakeId) {
899
+ return await this.#database.queryOne(
900
+ `
901
+ SELECT
902
+ id,
903
+ serial_id,
904
+ group_id,
905
+ local_snake_id,
906
+ size,
907
+ first_label,
908
+ last_label,
909
+ wordsCount,
910
+ weight
911
+ FROM snakes
912
+ WHERE id = ?
913
+ `,
914
+ [snakeId],
915
+ (row) => ({
916
+ serialId: getNumber(row, "serial_id"),
917
+ firstLabel: getString(row, "first_label"),
918
+ groupId: getNumber(row, "group_id"),
919
+ id: getNumber(row, "id"),
920
+ lastLabel: getString(row, "last_label"),
921
+ localSnakeId: getNumber(row, "local_snake_id"),
922
+ size: getNumber(row, "size"),
923
+ wordsCount: getNumber(row, "wordsCount"),
924
+ weight: getNumber(row, "weight")
925
+ })
926
+ );
927
+ }
928
+ async listIdsByGroup(serialId, groupId) {
929
+ return await this.#database.queryAll(
930
+ `
931
+ SELECT id
932
+ FROM snakes
933
+ WHERE serial_id = ? AND group_id = ?
934
+ ORDER BY id
935
+ `,
936
+ [serialId, groupId],
937
+ (row) => getNumber(row, "id")
938
+ );
939
+ }
940
+ async listBySerial(serialId) {
941
+ return await this.#database.queryAll(
942
+ `
943
+ SELECT
944
+ id,
945
+ serial_id,
946
+ group_id,
947
+ local_snake_id,
948
+ size,
949
+ first_label,
950
+ last_label,
951
+ wordsCount,
952
+ weight
953
+ FROM snakes
954
+ WHERE serial_id = ?
955
+ ORDER BY group_id, id
956
+ `,
957
+ [serialId],
958
+ (row) => ({
959
+ serialId: getNumber(row, "serial_id"),
960
+ firstLabel: getString(row, "first_label"),
961
+ groupId: getNumber(row, "group_id"),
962
+ id: getNumber(row, "id"),
963
+ lastLabel: getString(row, "last_label"),
964
+ localSnakeId: getNumber(row, "local_snake_id"),
965
+ size: getNumber(row, "size"),
966
+ wordsCount: getNumber(row, "wordsCount"),
967
+ weight: getNumber(row, "weight")
968
+ })
969
+ );
970
+ }
971
+ }
972
+ class MentionStore {
973
+ #database;
974
+ constructor(database) {
975
+ this.#database = database;
976
+ }
977
+ async save(record) {
978
+ await this.#database.run(
979
+ `
980
+ INSERT OR REPLACE INTO mentions (
981
+ id,
982
+ chapter_id,
983
+ sentence_index,
984
+ range_start,
985
+ range_end,
986
+ surface,
987
+ qid,
988
+ confidence,
989
+ note
990
+ )
991
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
992
+ `,
993
+ [
994
+ record.id,
995
+ record.chapterId,
996
+ record.sentenceIndex ?? null,
997
+ record.rangeStart,
998
+ record.rangeEnd,
999
+ record.surface,
1000
+ record.qid,
1001
+ record.confidence ?? null,
1002
+ record.note ?? null
1003
+ ]
1004
+ );
1005
+ }
1006
+ async saveMany(records) {
1007
+ await this.#database.transaction(async () => {
1008
+ for (const record of records) {
1009
+ await this.save(record);
1010
+ }
1011
+ });
1012
+ }
1013
+ async getById(mentionId) {
1014
+ return await this.#database.queryOne(
1015
+ `
1016
+ SELECT
1017
+ id,
1018
+ chapter_id,
1019
+ sentence_index,
1020
+ range_start,
1021
+ range_end,
1022
+ surface,
1023
+ qid,
1024
+ confidence,
1025
+ note
1026
+ FROM mentions
1027
+ WHERE id = ?
1028
+ `,
1029
+ [mentionId],
1030
+ mapMentionRow
1031
+ );
1032
+ }
1033
+ async listAll() {
1034
+ return await this.#database.queryAll(
1035
+ `
1036
+ SELECT
1037
+ id,
1038
+ chapter_id,
1039
+ sentence_index,
1040
+ range_start,
1041
+ range_end,
1042
+ surface,
1043
+ qid,
1044
+ confidence,
1045
+ note
1046
+ FROM mentions
1047
+ ORDER BY chapter_id, sentence_index, range_start, range_end, id
1048
+ `,
1049
+ void 0,
1050
+ mapMentionRow
1051
+ );
1052
+ }
1053
+ async listByQid(qid) {
1054
+ return await this.#database.queryAll(
1055
+ `
1056
+ SELECT
1057
+ id,
1058
+ chapter_id,
1059
+ sentence_index,
1060
+ range_start,
1061
+ range_end,
1062
+ surface,
1063
+ qid,
1064
+ confidence,
1065
+ note
1066
+ FROM mentions
1067
+ WHERE qid = ?
1068
+ ORDER BY chapter_id, sentence_index, range_start, range_end, id
1069
+ `,
1070
+ [qid],
1071
+ mapMentionRow
1072
+ );
1073
+ }
1074
+ async listBySurfaces(surfaces) {
1075
+ const normalizedSurfaces = [
1076
+ ...new Set(surfaces.map((surface) => surface.trim()))
1077
+ ].filter((surface) => surface !== "");
1078
+ if (normalizedSurfaces.length === 0) {
1079
+ return [];
1080
+ }
1081
+ return await this.#database.queryAll(
1082
+ `
1083
+ SELECT
1084
+ id,
1085
+ chapter_id,
1086
+ sentence_index,
1087
+ range_start,
1088
+ range_end,
1089
+ surface,
1090
+ qid,
1091
+ confidence,
1092
+ note
1093
+ FROM mentions
1094
+ WHERE surface IN (${normalizedSurfaces.map(() => "?").join(", ")})
1095
+ ORDER BY chapter_id, sentence_index, range_start, range_end, id
1096
+ `,
1097
+ normalizedSurfaces,
1098
+ mapMentionRow
1099
+ );
1100
+ }
1101
+ async listBySurfaceTerms(terms) {
1102
+ const normalizedTerms = [
1103
+ ...new Set(terms.map((term) => term.trim().toLowerCase()))
1104
+ ].filter((term) => term !== "");
1105
+ if (normalizedTerms.length === 0) {
1106
+ return [];
1107
+ }
1108
+ const filters = normalizedTerms.map(() => "lower(surface) LIKE ? ESCAPE '\\'").join(" OR ");
1109
+ return await this.#database.queryAll(
1110
+ `
1111
+ SELECT
1112
+ id,
1113
+ chapter_id,
1114
+ sentence_index,
1115
+ range_start,
1116
+ range_end,
1117
+ surface,
1118
+ qid,
1119
+ confidence,
1120
+ note
1121
+ FROM mentions
1122
+ WHERE ${filters}
1123
+ ORDER BY chapter_id, sentence_index, range_start, range_end, id
1124
+ `,
1125
+ normalizedTerms.map((term) => `%${escapeLikePattern(term)}%`),
1126
+ mapMentionRow
1127
+ );
1128
+ }
1129
+ async listByChapter(chapterId) {
1130
+ return await this.#database.queryAll(
1131
+ `
1132
+ SELECT
1133
+ id,
1134
+ chapter_id,
1135
+ sentence_index,
1136
+ range_start,
1137
+ range_end,
1138
+ surface,
1139
+ qid,
1140
+ confidence,
1141
+ note
1142
+ FROM mentions
1143
+ WHERE chapter_id = ?
1144
+ ORDER BY sentence_index, range_start, range_end, id
1145
+ `,
1146
+ [chapterId],
1147
+ mapMentionRow
1148
+ );
1149
+ }
1150
+ async deleteByChapter(chapterId) {
1151
+ await this.#database.run(
1152
+ `
1153
+ DELETE FROM mentions
1154
+ WHERE chapter_id = ?
1155
+ `,
1156
+ [chapterId]
1157
+ );
1158
+ }
1159
+ }
1160
+ class MentionLinkStore {
1161
+ #database;
1162
+ constructor(database) {
1163
+ this.#database = database;
1164
+ }
1165
+ async save(record) {
1166
+ await this.#database.transaction(async () => {
1167
+ await this.#saveRecord(record);
1168
+ });
1169
+ }
1170
+ async #saveRecord(record) {
1171
+ await this.#database.run(
1172
+ `
1173
+ INSERT OR REPLACE INTO mention_links (
1174
+ id,
1175
+ source_mention_id,
1176
+ target_mention_id,
1177
+ predicate,
1178
+ confidence,
1179
+ note
1180
+ )
1181
+ VALUES (?, ?, ?, ?, ?, ?)
1182
+ `,
1183
+ [
1184
+ record.id,
1185
+ record.sourceMentionId,
1186
+ record.targetMentionId,
1187
+ record.predicate,
1188
+ record.confidence ?? null,
1189
+ record.note ?? null
1190
+ ]
1191
+ );
1192
+ await this.#database.run(
1193
+ `
1194
+ DELETE FROM mention_link_evidence_sentences
1195
+ WHERE link_id = ?
1196
+ `,
1197
+ [record.id]
1198
+ );
1199
+ for (const [chapterId, sentenceIndex] of record.evidenceSentenceIds) {
1200
+ await this.#database.run(
1201
+ `
1202
+ INSERT INTO mention_link_evidence_sentences (
1203
+ link_id,
1204
+ chapter_id,
1205
+ sentence_index
1206
+ )
1207
+ VALUES (?, ?, ?)
1208
+ `,
1209
+ [record.id, chapterId, sentenceIndex]
1210
+ );
1211
+ }
1212
+ }
1213
+ async saveMany(records) {
1214
+ await this.#database.transaction(async () => {
1215
+ for (const record of records) {
1216
+ await this.#saveRecord(record);
1217
+ }
1218
+ });
1219
+ }
1220
+ async getById(linkId) {
1221
+ const row = await this.#database.queryOne(
1222
+ `
1223
+ SELECT
1224
+ id,
1225
+ source_mention_id,
1226
+ target_mention_id,
1227
+ predicate,
1228
+ confidence,
1229
+ note
1230
+ FROM mention_links
1231
+ WHERE id = ?
1232
+ `,
1233
+ [linkId],
1234
+ mapMentionLinkRow
1235
+ );
1236
+ return row === void 0 ? void 0 : await this.#hydrateEvidence(row);
1237
+ }
1238
+ async listByTriple(input) {
1239
+ const rows = await this.#database.queryAll(
1240
+ `
1241
+ SELECT
1242
+ mention_links.id AS id,
1243
+ mention_links.source_mention_id AS source_mention_id,
1244
+ mention_links.target_mention_id AS target_mention_id,
1245
+ mention_links.predicate AS predicate,
1246
+ mention_links.confidence AS confidence,
1247
+ mention_links.note AS note
1248
+ FROM mention_links
1249
+ INNER JOIN mentions AS source_mentions
1250
+ ON source_mentions.id = mention_links.source_mention_id
1251
+ INNER JOIN mentions AS target_mentions
1252
+ ON target_mentions.id = mention_links.target_mention_id
1253
+ WHERE source_mentions.qid = ?
1254
+ AND mention_links.predicate = ?
1255
+ AND target_mentions.qid = ?
1256
+ ORDER BY
1257
+ source_mentions.chapter_id,
1258
+ source_mentions.sentence_index,
1259
+ mention_links.id
1260
+ `,
1261
+ [input.subjectQid, input.predicate, input.objectQid],
1262
+ mapMentionLinkRow
1263
+ );
1264
+ return await this.#hydrateEvidenceMany(rows);
1265
+ }
1266
+ async listByChapter(chapterId) {
1267
+ const rows = await this.#database.queryAll(
1268
+ `
1269
+ SELECT
1270
+ mention_links.id AS id,
1271
+ mention_links.source_mention_id AS source_mention_id,
1272
+ mention_links.target_mention_id AS target_mention_id,
1273
+ mention_links.predicate AS predicate,
1274
+ mention_links.confidence AS confidence,
1275
+ mention_links.note AS note
1276
+ FROM mention_links
1277
+ INNER JOIN mentions AS source_mentions
1278
+ ON source_mentions.id = mention_links.source_mention_id
1279
+ INNER JOIN mentions AS target_mentions
1280
+ ON target_mentions.id = mention_links.target_mention_id
1281
+ WHERE source_mentions.chapter_id = ?
1282
+ OR target_mentions.chapter_id = ?
1283
+ ORDER BY mention_links.id
1284
+ `,
1285
+ [chapterId, chapterId],
1286
+ mapMentionLinkRow
1287
+ );
1288
+ return await this.#hydrateEvidenceMany(rows);
1289
+ }
1290
+ async deleteByChapter(chapterId) {
1291
+ await this.#database.transaction(async () => {
1292
+ await this.#database.run(
1293
+ `
1294
+ DELETE FROM mention_link_evidence_sentences
1295
+ WHERE link_id IN (
1296
+ SELECT mention_links.id
1297
+ FROM mention_links
1298
+ INNER JOIN mentions AS source_mentions
1299
+ ON source_mentions.id = mention_links.source_mention_id
1300
+ INNER JOIN mentions AS target_mentions
1301
+ ON target_mentions.id = mention_links.target_mention_id
1302
+ WHERE source_mentions.chapter_id = ?
1303
+ OR target_mentions.chapter_id = ?
1304
+ )
1305
+ `,
1306
+ [chapterId, chapterId]
1307
+ );
1308
+ await this.#database.run(
1309
+ `
1310
+ DELETE FROM mention_links
1311
+ WHERE source_mention_id IN (
1312
+ SELECT id
1313
+ FROM mentions
1314
+ WHERE chapter_id = ?
1315
+ )
1316
+ OR target_mention_id IN (
1317
+ SELECT id
1318
+ FROM mentions
1319
+ WHERE chapter_id = ?
1320
+ )
1321
+ `,
1322
+ [chapterId, chapterId]
1323
+ );
1324
+ });
1325
+ }
1326
+ async #hydrateEvidenceMany(records) {
1327
+ if (records.length === 0) {
1328
+ return [];
1329
+ }
1330
+ const sentenceIdsByLinkId = /* @__PURE__ */ new Map();
1331
+ const linkIds = [...new Set(records.map((record) => record.id))];
1332
+ for (const linkIdBatch of chunkArray(linkIds, MAX_SQL_BIND_PARAMS)) {
1333
+ const placeholders = linkIdBatch.map(() => "?").join(", ");
1334
+ const rows = await this.#database.queryAll(
1335
+ `
1336
+ SELECT link_id, chapter_id, sentence_index
1337
+ FROM mention_link_evidence_sentences
1338
+ WHERE link_id IN (${placeholders})
1339
+ ORDER BY link_id, chapter_id, sentence_index
1340
+ `,
1341
+ linkIdBatch,
1342
+ (row) => ({
1343
+ linkId: getString(row, "link_id"),
1344
+ sentenceId: [
1345
+ getNumber(row, "chapter_id"),
1346
+ getNumber(row, "sentence_index")
1347
+ ]
1348
+ })
1349
+ );
1350
+ for (const row of rows) {
1351
+ const sentenceIds = sentenceIdsByLinkId.get(row.linkId) ?? [];
1352
+ sentenceIds.push(row.sentenceId);
1353
+ sentenceIdsByLinkId.set(row.linkId, sentenceIds);
1354
+ }
1355
+ }
1356
+ return records.map((record) => ({
1357
+ ...record,
1358
+ evidenceSentenceIds: sentenceIdsByLinkId.get(record.id) ?? []
1359
+ }));
1360
+ }
1361
+ async #hydrateEvidence(record) {
1362
+ const evidenceSentenceIds = await this.#database.queryAll(
1363
+ `
1364
+ SELECT chapter_id, sentence_index
1365
+ FROM mention_link_evidence_sentences
1366
+ WHERE link_id = ?
1367
+ ORDER BY chapter_id, sentence_index
1368
+ `,
1369
+ [record.id],
1370
+ (row) => [
1371
+ getNumber(row, "chapter_id"),
1372
+ getNumber(row, "sentence_index")
1373
+ ]
1374
+ );
1375
+ return {
1376
+ ...record,
1377
+ evidenceSentenceIds
1378
+ };
1379
+ }
1380
+ }
1381
+ function chunkArray(items, size) {
1382
+ const chunks = [];
1383
+ for (let index = 0; index < items.length; index += size) {
1384
+ chunks.push(items.slice(index, index + size));
1385
+ }
1386
+ return chunks;
1387
+ }
1388
+ class SnakeChunkStore {
1389
+ #database;
1390
+ constructor(database) {
1391
+ this.#database = database;
1392
+ }
1393
+ async save(record) {
1394
+ await this.#database.run(
1395
+ `
1396
+ INSERT OR REPLACE INTO snake_chunks (snake_id, chunk_id, position)
1397
+ VALUES (?, ?, ?)
1398
+ `,
1399
+ [record.snakeId, record.chunkId, record.position]
1400
+ );
1401
+ }
1402
+ async listChunkIds(snakeId) {
1403
+ return await this.#database.queryAll(
1404
+ `
1405
+ SELECT chunk_id
1406
+ FROM snake_chunks
1407
+ WHERE snake_id = ?
1408
+ ORDER BY position
1409
+ `,
1410
+ [snakeId],
1411
+ (row) => getNumber(row, "chunk_id")
1412
+ );
1413
+ }
1414
+ async listBySnake(snakeId) {
1415
+ return await this.#database.queryAll(
1416
+ `
1417
+ SELECT snake_id, chunk_id, position
1418
+ FROM snake_chunks
1419
+ WHERE snake_id = ?
1420
+ ORDER BY position
1421
+ `,
1422
+ [snakeId],
1423
+ (row) => ({
1424
+ chunkId: getNumber(row, "chunk_id"),
1425
+ position: getNumber(row, "position"),
1426
+ snakeId: getNumber(row, "snake_id")
1427
+ })
1428
+ );
1429
+ }
1430
+ }
1431
+ class SnakeEdgeStore {
1432
+ #database;
1433
+ constructor(database) {
1434
+ this.#database = database;
1435
+ }
1436
+ async save(record) {
1437
+ await this.#database.run(
1438
+ `
1439
+ INSERT OR REPLACE INTO snake_edges (from_snake_id, to_snake_id, weight)
1440
+ VALUES (?, ?, ?)
1441
+ `,
1442
+ [record.fromSnakeId, record.toSnakeId, record.weight]
1443
+ );
1444
+ }
1445
+ async listIncoming(snakeId) {
1446
+ return await this.#listByDirection("to_snake_id", snakeId);
1447
+ }
1448
+ async listOutgoing(snakeId) {
1449
+ return await this.#listByDirection("from_snake_id", snakeId);
1450
+ }
1451
+ async listWithin(snakeIds) {
1452
+ if (snakeIds.length === 0) {
1453
+ return [];
1454
+ }
1455
+ const placeholders = snakeIds.map(() => "?").join(", ");
1456
+ return await this.#database.queryAll(
1457
+ `
1458
+ SELECT from_snake_id, to_snake_id, weight
1459
+ FROM snake_edges
1460
+ WHERE from_snake_id IN (${placeholders})
1461
+ AND to_snake_id IN (${placeholders})
1462
+ ORDER BY from_snake_id, to_snake_id
1463
+ `,
1464
+ [...snakeIds, ...snakeIds],
1465
+ (row) => ({
1466
+ fromSnakeId: getNumber(row, "from_snake_id"),
1467
+ toSnakeId: getNumber(row, "to_snake_id"),
1468
+ weight: getNumber(row, "weight")
1469
+ })
1470
+ );
1471
+ }
1472
+ async listBySerial(serialId) {
1473
+ return await this.#database.queryAll(
1474
+ `
1475
+ SELECT
1476
+ snake_edges.from_snake_id AS from_snake_id,
1477
+ snake_edges.to_snake_id AS to_snake_id,
1478
+ snake_edges.weight AS weight
1479
+ FROM snake_edges
1480
+ INNER JOIN snakes AS from_snakes
1481
+ ON from_snakes.id = snake_edges.from_snake_id
1482
+ INNER JOIN snakes AS to_snakes
1483
+ ON to_snakes.id = snake_edges.to_snake_id
1484
+ WHERE from_snakes.serial_id = ? AND to_snakes.serial_id = ?
1485
+ ORDER BY snake_edges.from_snake_id, snake_edges.to_snake_id
1486
+ `,
1487
+ [serialId, serialId],
1488
+ (row) => ({
1489
+ fromSnakeId: getNumber(row, "from_snake_id"),
1490
+ toSnakeId: getNumber(row, "to_snake_id"),
1491
+ weight: getNumber(row, "weight")
1492
+ })
1493
+ );
1494
+ }
1495
+ async #listByDirection(column, snakeId) {
1496
+ return await this.#database.queryAll(
1497
+ `
1498
+ SELECT from_snake_id, to_snake_id, weight
1499
+ FROM snake_edges
1500
+ WHERE ${column} = ?
1501
+ ORDER BY from_snake_id, to_snake_id
1502
+ `,
1503
+ [snakeId],
1504
+ (row) => ({
1505
+ fromSnakeId: getNumber(row, "from_snake_id"),
1506
+ toSnakeId: getNumber(row, "to_snake_id"),
1507
+ weight: getNumber(row, "weight")
1508
+ })
1509
+ );
1510
+ }
1511
+ }
1512
+ class FragmentGroupStore {
1513
+ #database;
1514
+ constructor(database) {
1515
+ this.#database = database;
1516
+ }
1517
+ async save(record) {
1518
+ await this.#database.run(
1519
+ `
1520
+ INSERT OR REPLACE INTO sentence_groups (
1521
+ serial_id,
1522
+ group_id,
1523
+ start_sentence_index,
1524
+ end_sentence_index
1525
+ )
1526
+ VALUES (?, ?, ?, ?)
1527
+ `,
1528
+ [
1529
+ record.serialId,
1530
+ record.groupId,
1531
+ record.startSentenceIndex,
1532
+ record.endSentenceIndex
1533
+ ]
1534
+ );
1535
+ }
1536
+ async saveMany(records) {
1537
+ await this.#database.transaction(async () => {
1538
+ for (const record of records) {
1539
+ await this.save(record);
1540
+ }
1541
+ });
1542
+ }
1543
+ async listBySerial(serialId) {
1544
+ return await this.#database.queryAll(
1545
+ `
1546
+ SELECT serial_id, group_id, start_sentence_index, end_sentence_index
1547
+ FROM sentence_groups
1548
+ WHERE serial_id = ?
1549
+ ORDER BY group_id, start_sentence_index
1550
+ `,
1551
+ [serialId],
1552
+ (row) => ({
1553
+ serialId: getNumber(row, "serial_id"),
1554
+ groupId: getNumber(row, "group_id"),
1555
+ startSentenceIndex: getNumber(row, "start_sentence_index"),
1556
+ endSentenceIndex: getNumber(row, "end_sentence_index")
1557
+ })
1558
+ );
1559
+ }
1560
+ async listSerialIds() {
1561
+ return await this.#database.queryAll(
1562
+ `
1563
+ SELECT DISTINCT serial_id
1564
+ FROM sentence_groups
1565
+ ORDER BY serial_id
1566
+ `,
1567
+ void 0,
1568
+ (row) => getNumber(row, "serial_id")
1569
+ );
1570
+ }
1571
+ async listGroupIdsForSerial(serialId) {
1572
+ return await this.#database.queryAll(
1573
+ `
1574
+ SELECT DISTINCT group_id
1575
+ FROM sentence_groups
1576
+ WHERE serial_id = ?
1577
+ ORDER BY group_id
1578
+ `,
1579
+ [serialId],
1580
+ (row) => getNumber(row, "group_id")
1581
+ );
1582
+ }
1583
+ }
1584
+ function mapReadingEdgeRow(row) {
1585
+ const strength = getOptionalString(row, "strength");
1586
+ return {
1587
+ fromId: getNumber(row, "from_id"),
1588
+ toId: getNumber(row, "to_id"),
1589
+ weight: getNumber(row, "weight"),
1590
+ ...strength === void 0 ? {} : { strength }
1591
+ };
1592
+ }
1593
+ function mapMentionRow(row) {
1594
+ const sentenceIndex = getOptionalNumber(row, "sentence_index");
1595
+ const confidence = getOptionalNumber(row, "confidence");
1596
+ const note = getOptionalString(row, "note");
1597
+ return {
1598
+ chapterId: getNumber(row, "chapter_id"),
1599
+ ...confidence === void 0 ? {} : { confidence },
1600
+ id: getString(row, "id"),
1601
+ ...note === void 0 ? {} : { note },
1602
+ qid: getString(row, "qid"),
1603
+ rangeEnd: getNumber(row, "range_end"),
1604
+ rangeStart: getNumber(row, "range_start"),
1605
+ ...sentenceIndex === void 0 ? {} : { sentenceIndex },
1606
+ surface: getString(row, "surface")
1607
+ };
1608
+ }
1609
+ function deduplicateById(records) {
1610
+ const seen = /* @__PURE__ */ new Set();
1611
+ const result = [];
1612
+ for (const record of records) {
1613
+ if (seen.has(record.id)) {
1614
+ continue;
1615
+ }
1616
+ seen.add(record.id);
1617
+ result.push(record);
1618
+ }
1619
+ return result;
1620
+ }
1621
+ function mapMentionLinkRow(row) {
1622
+ const confidence = getOptionalNumber(row, "confidence");
1623
+ const note = getOptionalString(row, "note");
1624
+ return {
1625
+ ...confidence === void 0 ? {} : { confidence },
1626
+ evidenceSentenceIds: [],
1627
+ id: getString(row, "id"),
1628
+ ...note === void 0 ? {} : { note },
1629
+ predicate: getString(row, "predicate"),
1630
+ sourceMentionId: getString(row, "source_mention_id"),
1631
+ targetMentionId: getString(row, "target_mention_id")
1632
+ };
1633
+ }
1634
+ function parseMetadataValue(valueJson) {
1635
+ try {
1636
+ return JSON.parse(valueJson);
1637
+ } catch (error) {
1638
+ throw new Error(
1639
+ `Invalid object metadata JSON: ${formatUnknownError(error)}`
1640
+ );
1641
+ }
1642
+ }
1643
+ function getOptionalNumber(row, key) {
1644
+ const value = row[key];
1645
+ if (value === null || value === void 0) {
1646
+ return void 0;
1647
+ }
1648
+ if (typeof value !== "number") {
1649
+ throw new TypeError(`Expected ${key} to be a number`);
1650
+ }
1651
+ return value;
1652
+ }
1653
+ function formatUnknownError(error) {
1654
+ return error instanceof Error ? error.message : String(error);
1655
+ }
1656
+ function escapeLikePattern(value) {
1657
+ return value.replace(/[\\%_]/gu, (character) => `\\${character}`);
1658
+ }
1659
+ function parseChunkImportance(value) {
1660
+ return value !== void 0 && isChunkImportance(value) ? value : void 0;
1661
+ }
1662
+ function parseChunkRetention(value) {
1663
+ return value !== void 0 && isChunkRetention(value) ? value : void 0;
1664
+ }
1665
+ export {
1666
+ ChunkStore,
1667
+ FragmentGroupStore,
1668
+ GraphBuildParameterStore,
1669
+ MentionLinkStore,
1670
+ MentionStore,
1671
+ ObjectMetadataStore,
1672
+ ReadingEdgeStore,
1673
+ SerialStore,
1674
+ SnakeChunkStore,
1675
+ SnakeEdgeStore,
1676
+ SnakeStore
1677
+ };
1678
+ //# sourceMappingURL=stores.js.map