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 @@
1
+ {"version":3,"sources":["../../src/document/stores.ts"],"sourcesContent":["import { getNumber, getOptionalString, getString } from \"./database.js\";\nimport type { Database, SqlRow } from \"./database.js\";\nimport {\n isChunkImportance,\n isChunkRetention,\n type ChunkImportance,\n type ChunkRecord,\n type ChunkRetention,\n type CreateChunkRecord,\n type CreateSnakeRecord,\n type SentenceGroupRecord,\n type GraphBuildParameterRecord,\n type ReadingEdgeRecord,\n type MentionLinkRecord,\n type MentionRecord,\n type ObjectMetadataTarget,\n type SerialRecord,\n type SentenceId,\n type SnakeChunkRecord,\n type SnakeEdgeRecord,\n type SnakeRecord,\n} from \"./types.js\";\nimport { createHash } from \"../utils/hash.js\";\n\nconst MAX_SQL_BIND_PARAMS = 900;\n\nexport interface ReadonlySerialStore {\n getById(serialId: number): Promise<SerialRecord | undefined>;\n getRevision(serialId: number): Promise<number>;\n getRevisions(\n serialIds: readonly number[],\n ): Promise<ReadonlyMap<number, number>>;\n getMaxId(): Promise<number>;\n getChaptersRevision(): Promise<number>;\n listIds(): Promise<number[]>;\n listDocumentOrders(): Promise<ReadonlyMap<number, number>>;\n}\n\nexport interface ReadonlyGraphBuildParameterStore {\n getByHash(hash: string): Promise<GraphBuildParameterRecord | undefined>;\n}\n\nexport interface ReadonlyChunkStore {\n countAll(): Promise<number>;\n getById(chunkId: number): Promise<ChunkRecord | undefined>;\n listAll(): Promise<ChunkRecord[]>;\n listBySentenceStartIndexes(\n serialId: number,\n sentenceStartIndexes: readonly number[],\n ): Promise<ChunkRecord[]>;\n listBySentenceRange(\n serialId: number,\n startSentenceIndex: number,\n endSentenceIndex: number,\n ): Promise<ChunkRecord[]>;\n listBySerial(serialId: number): Promise<ChunkRecord[]>;\n getMaxId(): Promise<number>;\n listFragmentPairs(): Promise<ReadonlyArray<readonly [number, number]>>;\n}\n\nexport interface ReadonlyReadingEdgeStore {\n countAll(): Promise<number>;\n listAll(): Promise<ReadingEdgeRecord[]>;\n listBySerial(serialId: number): Promise<ReadingEdgeRecord[]>;\n listIncoming(chunkId: number): Promise<ReadingEdgeRecord[]>;\n listOutgoing(chunkId: number): Promise<ReadingEdgeRecord[]>;\n}\n\nexport interface ReadonlyMentionStore {\n getById(mentionId: string): Promise<MentionRecord | undefined>;\n listAll(): Promise<MentionRecord[]>;\n listBySurfaceTerms(terms: readonly string[]): Promise<MentionRecord[]>;\n listBySurfaces(surfaces: readonly string[]): Promise<MentionRecord[]>;\n listByQid(qid: string): Promise<MentionRecord[]>;\n listByChapter(chapterId: number): Promise<MentionRecord[]>;\n}\n\nexport interface ReadonlyMentionLinkStore {\n getById(linkId: string): Promise<MentionLinkRecord | undefined>;\n listByTriple(input: {\n readonly objectQid: string;\n readonly predicate: string;\n readonly subjectQid: string;\n }): Promise<MentionLinkRecord[]>;\n listByChapter(chapterId: number): Promise<MentionLinkRecord[]>;\n}\n\nexport interface ReadonlySnakeStore {\n getById(snakeId: number): Promise<SnakeRecord | undefined>;\n listIdsByGroup(serialId: number, groupId: number): Promise<number[]>;\n listBySerial(serialId: number): Promise<SnakeRecord[]>;\n}\n\nexport interface ReadonlySnakeChunkStore {\n listChunkIds(snakeId: number): Promise<number[]>;\n listBySnake(snakeId: number): Promise<SnakeChunkRecord[]>;\n}\n\nexport interface ReadonlySnakeEdgeStore {\n listIncoming(snakeId: number): Promise<SnakeEdgeRecord[]>;\n listOutgoing(snakeId: number): Promise<SnakeEdgeRecord[]>;\n listWithin(snakeIds: readonly number[]): Promise<SnakeEdgeRecord[]>;\n listBySerial(serialId: number): Promise<SnakeEdgeRecord[]>;\n}\n\nexport interface ReadonlyFragmentGroupStore {\n listBySerial(serialId: number): Promise<SentenceGroupRecord[]>;\n listSerialIds(): Promise<number[]>;\n listGroupIdsForSerial(serialId: number): Promise<number[]>;\n}\n\nexport interface ReadonlyObjectMetadataStore {\n getMap(objectPath: string): Promise<Readonly<Record<string, unknown>>>;\n}\n\nexport class ObjectMetadataStore implements ReadonlyObjectMetadataStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async getMap(\n objectPath: string,\n ): Promise<Readonly<Record<string, unknown>>> {\n const rows = await this.#database.queryAll(\n `\n SELECT key, value_json\n FROM object_metadata\n WHERE object_path = ?\n ORDER BY key\n `,\n [objectPath],\n (row) => ({\n key: getString(row, \"key\"),\n value: parseMetadataValue(getString(row, \"value_json\")),\n }),\n );\n const result: Record<string, unknown> = {};\n\n for (const row of rows) {\n result[row.key] = row.value;\n }\n\n return result;\n }\n\n public async replaceMap(\n target: ObjectMetadataTarget,\n map: Readonly<Record<string, unknown>>,\n ): Promise<void> {\n await this.#database.transaction(async () => {\n await this.clear(target.objectPath);\n for (const [key, value] of Object.entries(map)) {\n await this.put(target, key, value);\n }\n });\n }\n\n public async put(\n target: ObjectMetadataTarget,\n key: string,\n value: unknown,\n ): Promise<void> {\n await this.#database.run(\n `\n INSERT INTO object_metadata (\n object_kind,\n object_path,\n key,\n value_json,\n updated_at,\n chapter_id,\n chunk_id,\n entity_qid,\n triple_subject_qid,\n triple_predicate,\n triple_object_qid\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(object_path, key) DO UPDATE SET\n object_kind = excluded.object_kind,\n value_json = excluded.value_json,\n updated_at = excluded.updated_at,\n chapter_id = excluded.chapter_id,\n chunk_id = excluded.chunk_id,\n entity_qid = excluded.entity_qid,\n triple_subject_qid = excluded.triple_subject_qid,\n triple_predicate = excluded.triple_predicate,\n triple_object_qid = excluded.triple_object_qid\n `,\n [\n target.kind,\n target.objectPath,\n key,\n JSON.stringify(value),\n new Date().toISOString(),\n target.chapterId ?? null,\n target.chunkId ?? null,\n target.entityQid ?? null,\n target.tripleSubjectQid ?? null,\n target.triplePredicate ?? null,\n target.tripleObjectQid ?? null,\n ],\n );\n }\n\n public async deleteKey(objectPath: string, key: string): Promise<void> {\n await this.#database.run(\n `\n DELETE FROM object_metadata\n WHERE object_path = ?\n AND key = ?\n `,\n [objectPath, key],\n );\n }\n\n public async clear(objectPath: string): Promise<void> {\n await this.#database.run(\n `\n DELETE FROM object_metadata\n WHERE object_path = ?\n `,\n [objectPath],\n );\n }\n\n public async deleteChapterSubtree(chapterId: number): Promise<void> {\n await this.#database.run(\n `\n DELETE FROM object_metadata\n WHERE chapter_id = ?\n `,\n [chapterId],\n );\n }\n\n public async deleteDeletedChunks(): Promise<void> {\n await this.#database.run(`\n DELETE FROM object_metadata\n WHERE chunk_id IS NOT NULL\n AND NOT EXISTS (\n SELECT 1\n FROM chunks\n WHERE chunks.id = object_metadata.chunk_id\n )\n `);\n }\n\n public async deleteDeletedEntitiesAndTriples(): Promise<void> {\n await this.#database.run(`\n DELETE FROM object_metadata\n WHERE entity_qid IS NOT NULL\n AND NOT EXISTS (\n SELECT 1\n FROM mentions\n WHERE mentions.qid = object_metadata.entity_qid\n )\n `);\n await this.#database.run(`\n DELETE FROM object_metadata\n WHERE triple_subject_qid IS NOT NULL\n AND NOT EXISTS (\n SELECT 1\n FROM mention_links\n JOIN mentions AS source_mentions\n ON source_mentions.id = mention_links.source_mention_id\n JOIN mentions AS target_mentions\n ON target_mentions.id = mention_links.target_mention_id\n WHERE source_mentions.qid = object_metadata.triple_subject_qid\n AND mention_links.predicate = object_metadata.triple_predicate\n AND target_mentions.qid = object_metadata.triple_object_qid\n )\n `);\n }\n}\n\nexport class SerialStore implements ReadonlySerialStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async create(): Promise<number> {\n return await this.#database.transaction(async () => {\n await this.#database.run(\n `\n INSERT INTO serials DEFAULT VALUES\n `,\n );\n\n const serialId = await this.#database.getLastInsertRowId();\n\n await this.#database.run(\n `\n INSERT INTO serial_states (\n serial_id, revision, topology_ready, knowledge_graph_ready\n )\n VALUES (?, ?, ?, ?)\n `,\n [serialId, 0, 0, 0],\n );\n\n return serialId;\n });\n }\n\n public async createWithId(serialId: number): Promise<void> {\n try {\n await this.#database.transaction(async () => {\n await this.#database.run(\n `\n INSERT INTO serials (id)\n VALUES (?)\n `,\n [serialId],\n );\n\n await this.#database.run(\n `\n INSERT INTO serial_states (\n serial_id, revision, topology_ready, knowledge_graph_ready\n )\n VALUES (?, ?, ?, ?)\n `,\n [serialId, 0, 0, 0],\n );\n });\n } catch (error) {\n if (isSqliteConstraintError(error)) {\n throw new Error(`Serial ${serialId} already exists`);\n }\n\n throw error;\n }\n }\n\n public async ensure(serialId: number): Promise<void> {\n await this.#database.transaction(async () => {\n await this.#database.run(\n `\n INSERT OR IGNORE INTO serials (id)\n VALUES (?)\n `,\n [serialId],\n );\n\n await this.#database.run(\n `\n INSERT OR IGNORE INTO serial_states (\n serial_id, revision, topology_ready, knowledge_graph_ready\n )\n VALUES (?, ?, ?, ?)\n `,\n [serialId, 0, 0, 0],\n );\n });\n }\n\n public async getById(serialId: number): Promise<SerialRecord | undefined> {\n return await this.#database.queryOne(\n `\n SELECT\n serials.id AS id,\n serials.document_order AS document_order,\n COALESCE(serial_states.revision, 0) AS revision,\n COALESCE(serial_states.topology_ready, 0) AS topology_ready,\n serial_states.topology_parameter_hash AS topology_parameter_hash,\n COALESCE(serial_states.knowledge_graph_ready, 0) AS knowledge_graph_ready,\n serial_states.knowledge_graph_parameter_hash AS knowledge_graph_parameter_hash\n FROM serials\n LEFT JOIN serial_states\n ON serial_states.serial_id = serials.id\n WHERE serials.id = ?\n `,\n [serialId],\n mapSerialRow,\n );\n }\n\n public async getRevision(serialId: number): Promise<number> {\n return (\n (await this.#database.queryOne(\n `\n SELECT COALESCE(revision, 0) AS revision\n FROM serial_states\n WHERE serial_id = ?\n `,\n [serialId],\n (row) => getNumber(row, \"revision\"),\n )) ?? 0\n );\n }\n\n public async getRevisions(\n serialIds: readonly number[],\n ): Promise<ReadonlyMap<number, number>> {\n const uniqueIds = [...new Set(serialIds)].sort(compareNumber);\n\n if (uniqueIds.length === 0) {\n return new Map();\n }\n\n const rows = await this.#database.queryAll(\n `\n SELECT serial_id, COALESCE(revision, 0) AS revision\n FROM serial_states\n WHERE serial_id IN (${uniqueIds.map(() => \"?\").join(\", \")})\n ORDER BY serial_id\n `,\n uniqueIds,\n (row) =>\n [getNumber(row, \"serial_id\"), getNumber(row, \"revision\")] as const,\n );\n\n return new Map(rows);\n }\n\n public async bumpRevision(serialId: number): Promise<void> {\n await this.ensure(serialId);\n await this.#database.transaction(async () => {\n await this.#database.run(\n `\n UPDATE serial_states\n SET revision = revision + 1\n WHERE serial_id = ?\n `,\n [serialId],\n );\n await this.bumpChaptersRevision();\n });\n }\n\n public async bumpChaptersRevision(): Promise<void> {\n await this.#database.run(\n `\n INSERT INTO archive_revisions (key, value)\n VALUES ('chapters', 1)\n ON CONFLICT(key) DO UPDATE SET value = value + 1\n `,\n );\n }\n\n public async getChaptersRevision(): Promise<number> {\n return (\n (await this.#database.queryOne(\n `\n SELECT value\n FROM archive_revisions\n WHERE key = 'chapters'\n `,\n undefined,\n (row) => getNumber(row, \"value\"),\n )) ?? 0\n );\n }\n\n public async getMaxId(): Promise<number> {\n const maxId = await this.#database.queryOne(\n `\n SELECT COALESCE(MAX(id), 0) AS max_id\n FROM serials\n `,\n undefined,\n (row) => getNumber(row, \"max_id\"),\n );\n\n return maxId ?? 0;\n }\n\n public async setTopologyReady(\n serialId: number,\n ready = true,\n parameterHash?: string,\n ): Promise<void> {\n await this.ensure(serialId);\n\n if (ready) {\n await this.#database.run(\n `\n UPDATE serial_states\n SET\n topology_ready = ?,\n topology_parameter_hash = COALESCE(?, topology_parameter_hash)\n WHERE serial_id = ?\n `,\n [1, parameterHash ?? null, serialId],\n );\n return;\n }\n\n await this.#database.run(\n `\n UPDATE serial_states\n SET\n topology_ready = ?,\n topology_parameter_hash = NULL\n WHERE serial_id = ?\n `,\n [0, serialId],\n );\n }\n\n public async setKnowledgeGraphReady(\n serialId: number,\n ready = true,\n parameterHash?: string,\n ): Promise<void> {\n await this.ensure(serialId);\n\n if (ready) {\n await this.#database.run(\n `\n UPDATE serial_states\n SET\n knowledge_graph_ready = ?,\n knowledge_graph_parameter_hash = COALESCE(?, knowledge_graph_parameter_hash)\n WHERE serial_id = ?\n `,\n [1, parameterHash ?? null, serialId],\n );\n return;\n }\n\n await this.#database.run(\n `\n UPDATE serial_states\n SET\n knowledge_graph_ready = ?,\n knowledge_graph_parameter_hash = NULL\n WHERE serial_id = ?\n `,\n [0, serialId],\n );\n }\n\n public async listIds(): Promise<number[]> {\n return await this.#database.queryAll(\n `\n SELECT id\n FROM serials\n ORDER BY id\n `,\n undefined,\n (row) => getNumber(row, \"id\"),\n );\n }\n\n public async listDocumentOrders(): Promise<ReadonlyMap<number, number>> {\n const rows = await this.#database.queryAll(\n `\n SELECT id, document_order\n FROM serials\n ORDER BY id\n `,\n undefined,\n (row) =>\n [getNumber(row, \"id\"), getNumber(row, \"document_order\")] as const,\n );\n\n return new Map(rows);\n }\n\n public async setDocumentOrders(\n entries: readonly {\n readonly documentOrder: number;\n readonly serialId: number;\n }[],\n ): Promise<void> {\n await this.#database.transaction(async () => {\n for (const entry of entries) {\n await this.#database.run(\n `\n INSERT OR IGNORE INTO serials (id)\n VALUES (?)\n `,\n [entry.serialId],\n );\n await this.#database.run(\n `\n INSERT OR IGNORE INTO serial_states (\n serial_id, revision, topology_ready, knowledge_graph_ready\n )\n VALUES (?, ?, ?, ?)\n `,\n [entry.serialId, 0, 0, 0],\n );\n await this.#database.run(\n `\n UPDATE serials\n SET document_order = ?\n WHERE id = ?\n `,\n [entry.documentOrder, entry.serialId],\n );\n }\n });\n }\n}\n\nfunction mapSerialRow(row: SqlRow): SerialRecord {\n const topologyParameterHash = getOptionalString(\n row,\n \"topology_parameter_hash\",\n );\n const knowledgeGraphParameterHash = getOptionalString(\n row,\n \"knowledge_graph_parameter_hash\",\n );\n\n return {\n documentOrder: getNumber(row, \"document_order\"),\n id: getNumber(row, \"id\"),\n knowledgeGraphReady: getNumber(row, \"knowledge_graph_ready\") !== 0,\n ...(knowledgeGraphParameterHash === undefined\n ? {}\n : { knowledgeGraphParameterHash }),\n revision: getNumber(row, \"revision\"),\n topologyReady: getNumber(row, \"topology_ready\") !== 0,\n ...(topologyParameterHash === undefined ? {} : { topologyParameterHash }),\n };\n}\n\nfunction compareNumber(left: number, right: number): number {\n return left - right;\n}\n\nexport class GraphBuildParameterStore implements ReadonlyGraphBuildParameterStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async save(input: {\n readonly language?: string;\n readonly prompt: string;\n }): Promise<GraphBuildParameterRecord> {\n const hash = createHash({\n language: input.language ?? null,\n prompt: input.prompt,\n });\n const createdAt = new Date().toISOString();\n\n await this.#database.run(\n `\n INSERT OR IGNORE INTO graph_build_parameters (\n hash, prompt, language, created_at\n )\n VALUES (?, ?, ?, ?)\n `,\n [hash, input.prompt, input.language ?? null, createdAt],\n );\n\n return (await this.getByHash(hash))!;\n }\n\n public async getByHash(\n hash: string,\n ): Promise<GraphBuildParameterRecord | undefined> {\n return await this.#database.queryOne(\n `\n SELECT hash, prompt, language, created_at\n FROM graph_build_parameters\n WHERE hash = ?\n `,\n [hash],\n (row) => {\n const language = getOptionalString(row, \"language\");\n\n return {\n createdAt: getString(row, \"created_at\"),\n hash: getString(row, \"hash\"),\n ...(language === undefined ? {} : { language }),\n prompt: getString(row, \"prompt\"),\n };\n },\n );\n }\n\n public async deleteUnreferenced(): Promise<void> {\n await this.#database.run(`\n DELETE FROM graph_build_parameters\n WHERE hash NOT IN (\n SELECT topology_parameter_hash\n FROM serial_states\n WHERE topology_parameter_hash IS NOT NULL\n UNION\n SELECT knowledge_graph_parameter_hash\n FROM serial_states\n WHERE knowledge_graph_parameter_hash IS NOT NULL\n )\n `);\n }\n}\n\nfunction isSqliteConstraintError(\n error: unknown,\n): error is { readonly code: string } {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n error.code.startsWith(\"SQLITE_CONSTRAINT\")\n );\n}\n\nexport class ChunkStore implements ReadonlyChunkStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async countAll(): Promise<number> {\n return (\n (await this.#database.queryOne(\n `\n SELECT COUNT(*) AS count\n FROM chunks\n `,\n undefined,\n (row) => getNumber(row, \"count\"),\n )) ?? 0\n );\n }\n\n public async create(record: CreateChunkRecord): Promise<ChunkRecord> {\n return await this.#database.transaction(async () => {\n await this.#database.run(\n `\n INSERT INTO chunks (\n generation,\n serial_id,\n sentence_index,\n label,\n content,\n retention,\n importance,\n wordsCount,\n weight\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n [\n record.generation,\n record.sentenceId[0],\n record.sentenceId[1],\n record.label,\n record.content,\n record.retention ?? null,\n record.importance ?? null,\n record.wordsCount,\n record.weight,\n ],\n );\n\n const id = await this.#database.getLastInsertRowId();\n const createdRecord = {\n ...record,\n id,\n };\n\n await this.#replaceChunkSentences(createdRecord);\n\n return createdRecord;\n });\n }\n\n public async save(record: ChunkRecord): Promise<void> {\n await this.#database.transaction(async () => {\n await this.#database.run(\n `\n INSERT OR REPLACE INTO chunks (\n id,\n generation,\n serial_id,\n sentence_index,\n label,\n content,\n retention,\n importance,\n wordsCount,\n weight\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n [\n record.id,\n record.generation,\n record.sentenceId[0],\n record.sentenceId[1],\n record.label,\n record.content,\n record.retention ?? null,\n record.importance ?? null,\n record.wordsCount,\n record.weight,\n ],\n );\n\n await this.#replaceChunkSentences(record);\n });\n }\n\n public async getById(chunkId: number): Promise<ChunkRecord | undefined> {\n const row = await this.#database.queryOne(\n `\n SELECT\n id,\n generation,\n serial_id,\n sentence_index,\n label,\n content,\n retention,\n importance,\n wordsCount,\n weight\n FROM chunks\n WHERE id = ?\n `,\n [chunkId],\n (value) => value,\n );\n\n if (row === undefined) {\n return undefined;\n }\n\n return await this.#mapChunkRow(row);\n }\n\n public async listAll(): Promise<ChunkRecord[]> {\n const rows = await this.#database.queryAll(\n `\n SELECT\n id,\n generation,\n serial_id,\n sentence_index,\n label,\n content,\n retention,\n importance,\n wordsCount,\n weight\n FROM chunks\n ORDER BY id\n `,\n undefined,\n (row) => row,\n );\n\n return await Promise.all(\n rows.map(async (row) => await this.#mapChunkRow(row)),\n );\n }\n\n public async listBySentenceStartIndexes(\n serialId: number,\n sentenceStartIndexes: readonly number[],\n ): Promise<ChunkRecord[]> {\n if (sentenceStartIndexes.length === 0) {\n return [];\n }\n\n const results = await Promise.all(\n sentenceStartIndexes.map(\n async (sentenceStartIndex) =>\n await this.listBySentenceRange(\n serialId,\n sentenceStartIndex,\n sentenceStartIndex,\n ),\n ),\n );\n\n return deduplicateById(results.flat());\n }\n\n public async listBySentenceRange(\n serialId: number,\n startSentenceIndex: number,\n endSentenceIndex: number,\n ): Promise<ChunkRecord[]> {\n const rows = await this.#database.queryAll(\n `\n SELECT\n id,\n generation,\n serial_id,\n sentence_index,\n label,\n content,\n retention,\n importance,\n wordsCount,\n weight\n FROM chunks\n WHERE serial_id = ?\n AND sentence_index BETWEEN ? AND ?\n ORDER BY id\n `,\n [serialId, startSentenceIndex, endSentenceIndex],\n (row) => row,\n );\n\n return await Promise.all(\n rows.map(async (row) => await this.#mapChunkRow(row)),\n );\n }\n\n public async listBySerial(serialId: number): Promise<ChunkRecord[]> {\n const rows = await this.#database.queryAll(\n `\n SELECT\n id,\n generation,\n serial_id,\n sentence_index,\n label,\n content,\n retention,\n importance,\n wordsCount,\n weight\n FROM chunks\n WHERE serial_id = ?\n ORDER BY id\n `,\n [serialId],\n (row) => row,\n );\n\n return await Promise.all(\n rows.map(async (row) => await this.#mapChunkRow(row)),\n );\n }\n\n public async getMaxId(): Promise<number> {\n return (\n (await this.#database.queryOne(\n `\n SELECT MAX(id) AS id\n FROM chunks\n `,\n undefined,\n (row) => {\n const value = row.id;\n\n return typeof value === \"number\" ? value : 0;\n },\n )) ?? 0\n );\n }\n\n public async listFragmentPairs(): Promise<\n ReadonlyArray<readonly [number, number]>\n > {\n return await this.#database.queryAll(\n `\n SELECT DISTINCT serial_id, sentence_index\n FROM chunks\n ORDER BY serial_id, sentence_index\n `,\n undefined,\n (row) =>\n [\n getNumber(row, \"serial_id\"),\n getNumber(row, \"sentence_index\"),\n ] as const,\n );\n }\n\n async #getSentenceIds(chunkId: number): Promise<SentenceId[]> {\n return await this.#database.queryAll(\n `\n SELECT serial_id, sentence_index\n FROM chunk_sentences\n WHERE chunk_id = ?\n ORDER BY serial_id, sentence_index\n `,\n [chunkId],\n (row) =>\n [\n getNumber(row, \"serial_id\"),\n getNumber(row, \"sentence_index\"),\n ] as const,\n );\n }\n\n async #replaceChunkSentences(record: ChunkRecord): Promise<void> {\n await this.#database.run(\n `\n DELETE FROM chunk_sentences\n WHERE chunk_id = ?\n `,\n [record.id],\n );\n\n for (const sentenceId of record.sentenceIds) {\n await this.#database.run(\n `\n INSERT INTO chunk_sentences (\n chunk_id,\n serial_id,\n sentence_index\n )\n VALUES (?, ?, ?)\n `,\n [record.id, sentenceId[0], sentenceId[1]],\n );\n }\n }\n\n async #mapChunkRow(row: SqlRow): Promise<ChunkRecord> {\n const chunkId = getNumber(row, \"id\");\n const importance = parseChunkImportance(\n getOptionalString(row, \"importance\"),\n );\n const retention = parseChunkRetention(getOptionalString(row, \"retention\"));\n\n return {\n content: getString(row, \"content\"),\n generation: getNumber(row, \"generation\"),\n id: chunkId,\n label: getString(row, \"label\"),\n sentenceId: [\n getNumber(row, \"serial_id\"),\n getNumber(row, \"sentence_index\"),\n ] as const,\n sentenceIds: await this.#getSentenceIds(chunkId),\n wordsCount: getNumber(row, \"wordsCount\"),\n weight: getNumber(row, \"weight\"),\n ...(importance === undefined ? {} : { importance }),\n ...(retention === undefined ? {} : { retention }),\n };\n }\n}\n\nexport class ReadingEdgeStore implements ReadonlyReadingEdgeStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async countAll(): Promise<number> {\n return (\n (await this.#database.queryOne(\n `\n SELECT COUNT(*) AS count\n FROM reading_edges\n `,\n undefined,\n (row) => getNumber(row, \"count\"),\n )) ?? 0\n );\n }\n\n public async save(record: ReadingEdgeRecord): Promise<void> {\n await this.#database.run(\n `\n INSERT OR REPLACE INTO reading_edges (from_id, to_id, strength, weight)\n VALUES (?, ?, ?, ?)\n `,\n [record.fromId, record.toId, record.strength ?? null, record.weight],\n );\n }\n\n public async listAll(): Promise<ReadingEdgeRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT from_id, to_id, strength, weight\n FROM reading_edges\n ORDER BY from_id, to_id\n `,\n undefined,\n (row) => mapReadingEdgeRow(row),\n );\n }\n\n public async listBySerial(serialId: number): Promise<ReadingEdgeRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT\n reading_edges.from_id AS from_id,\n reading_edges.to_id AS to_id,\n reading_edges.strength AS strength,\n reading_edges.weight AS weight\n FROM reading_edges\n INNER JOIN chunks AS from_chunks\n ON from_chunks.id = reading_edges.from_id\n INNER JOIN chunks AS to_chunks\n ON to_chunks.id = reading_edges.to_id\n WHERE from_chunks.serial_id = ? AND to_chunks.serial_id = ?\n ORDER BY reading_edges.from_id, reading_edges.to_id\n `,\n [serialId, serialId],\n (row) => mapReadingEdgeRow(row),\n );\n }\n\n public async listIncoming(chunkId: number): Promise<ReadingEdgeRecord[]> {\n return await this.#listByDirection(\"to_id\", chunkId);\n }\n\n public async listOutgoing(chunkId: number): Promise<ReadingEdgeRecord[]> {\n return await this.#listByDirection(\"from_id\", chunkId);\n }\n\n async #listByDirection(\n column: \"from_id\" | \"to_id\",\n chunkId: number,\n ): Promise<ReadingEdgeRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT from_id, to_id, strength, weight\n FROM reading_edges\n WHERE ${column} = ?\n ORDER BY from_id, to_id\n `,\n [chunkId],\n (row) => mapReadingEdgeRow(row),\n );\n }\n}\n\nexport class SnakeStore implements ReadonlySnakeStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async create(record: CreateSnakeRecord): Promise<number> {\n await this.#database.run(\n `\n INSERT INTO snakes (\n serial_id,\n group_id,\n local_snake_id,\n size,\n first_label,\n last_label,\n wordsCount,\n weight\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `,\n [\n record.serialId,\n record.groupId,\n record.localSnakeId,\n record.size,\n record.firstLabel,\n record.lastLabel,\n record.wordsCount ?? 0,\n record.weight ?? 0,\n ],\n );\n\n return await this.#database.getLastInsertRowId();\n }\n\n public async getById(snakeId: number): Promise<SnakeRecord | undefined> {\n return await this.#database.queryOne(\n `\n SELECT\n id,\n serial_id,\n group_id,\n local_snake_id,\n size,\n first_label,\n last_label,\n wordsCount,\n weight\n FROM snakes\n WHERE id = ?\n `,\n [snakeId],\n (row) => ({\n serialId: getNumber(row, \"serial_id\"),\n firstLabel: getString(row, \"first_label\"),\n groupId: getNumber(row, \"group_id\"),\n id: getNumber(row, \"id\"),\n lastLabel: getString(row, \"last_label\"),\n localSnakeId: getNumber(row, \"local_snake_id\"),\n size: getNumber(row, \"size\"),\n wordsCount: getNumber(row, \"wordsCount\"),\n weight: getNumber(row, \"weight\"),\n }),\n );\n }\n\n public async listIdsByGroup(\n serialId: number,\n groupId: number,\n ): Promise<number[]> {\n return await this.#database.queryAll(\n `\n SELECT id\n FROM snakes\n WHERE serial_id = ? AND group_id = ?\n ORDER BY id\n `,\n [serialId, groupId],\n (row) => getNumber(row, \"id\"),\n );\n }\n\n public async listBySerial(serialId: number): Promise<SnakeRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT\n id,\n serial_id,\n group_id,\n local_snake_id,\n size,\n first_label,\n last_label,\n wordsCount,\n weight\n FROM snakes\n WHERE serial_id = ?\n ORDER BY group_id, id\n `,\n [serialId],\n (row) => ({\n serialId: getNumber(row, \"serial_id\"),\n firstLabel: getString(row, \"first_label\"),\n groupId: getNumber(row, \"group_id\"),\n id: getNumber(row, \"id\"),\n lastLabel: getString(row, \"last_label\"),\n localSnakeId: getNumber(row, \"local_snake_id\"),\n size: getNumber(row, \"size\"),\n wordsCount: getNumber(row, \"wordsCount\"),\n weight: getNumber(row, \"weight\"),\n }),\n );\n }\n}\n\nexport class MentionStore implements ReadonlyMentionStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async save(record: MentionRecord): Promise<void> {\n await this.#database.run(\n `\n INSERT OR REPLACE INTO mentions (\n id,\n chapter_id,\n sentence_index,\n range_start,\n range_end,\n surface,\n qid,\n confidence,\n note\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n [\n record.id,\n record.chapterId,\n record.sentenceIndex ?? null,\n record.rangeStart,\n record.rangeEnd,\n record.surface,\n record.qid,\n record.confidence ?? null,\n record.note ?? null,\n ],\n );\n }\n\n public async saveMany(records: readonly MentionRecord[]): Promise<void> {\n await this.#database.transaction(async () => {\n for (const record of records) {\n await this.save(record);\n }\n });\n }\n\n public async getById(mentionId: string): Promise<MentionRecord | undefined> {\n return await this.#database.queryOne(\n `\n SELECT\n id,\n chapter_id,\n sentence_index,\n range_start,\n range_end,\n surface,\n qid,\n confidence,\n note\n FROM mentions\n WHERE id = ?\n `,\n [mentionId],\n mapMentionRow,\n );\n }\n\n public async listAll(): Promise<MentionRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT\n id,\n chapter_id,\n sentence_index,\n range_start,\n range_end,\n surface,\n qid,\n confidence,\n note\n FROM mentions\n ORDER BY chapter_id, sentence_index, range_start, range_end, id\n `,\n undefined,\n mapMentionRow,\n );\n }\n\n public async listByQid(qid: string): Promise<MentionRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT\n id,\n chapter_id,\n sentence_index,\n range_start,\n range_end,\n surface,\n qid,\n confidence,\n note\n FROM mentions\n WHERE qid = ?\n ORDER BY chapter_id, sentence_index, range_start, range_end, id\n `,\n [qid],\n mapMentionRow,\n );\n }\n\n public async listBySurfaces(\n surfaces: readonly string[],\n ): Promise<MentionRecord[]> {\n const normalizedSurfaces = [\n ...new Set(surfaces.map((surface) => surface.trim())),\n ].filter((surface) => surface !== \"\");\n\n if (normalizedSurfaces.length === 0) {\n return [];\n }\n\n return await this.#database.queryAll(\n `\n SELECT\n id,\n chapter_id,\n sentence_index,\n range_start,\n range_end,\n surface,\n qid,\n confidence,\n note\n FROM mentions\n WHERE surface IN (${normalizedSurfaces.map(() => \"?\").join(\", \")})\n ORDER BY chapter_id, sentence_index, range_start, range_end, id\n `,\n normalizedSurfaces,\n mapMentionRow,\n );\n }\n\n public async listBySurfaceTerms(\n terms: readonly string[],\n ): Promise<MentionRecord[]> {\n const normalizedTerms = [\n ...new Set(terms.map((term) => term.trim().toLowerCase())),\n ].filter((term) => term !== \"\");\n\n if (normalizedTerms.length === 0) {\n return [];\n }\n\n const filters = normalizedTerms\n .map(() => \"lower(surface) LIKE ? ESCAPE '\\\\'\")\n .join(\" OR \");\n\n return await this.#database.queryAll(\n `\n SELECT\n id,\n chapter_id,\n sentence_index,\n range_start,\n range_end,\n surface,\n qid,\n confidence,\n note\n FROM mentions\n WHERE ${filters}\n ORDER BY chapter_id, sentence_index, range_start, range_end, id\n `,\n normalizedTerms.map((term) => `%${escapeLikePattern(term)}%`),\n mapMentionRow,\n );\n }\n\n public async listByChapter(chapterId: number): Promise<MentionRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT\n id,\n chapter_id,\n sentence_index,\n range_start,\n range_end,\n surface,\n qid,\n confidence,\n note\n FROM mentions\n WHERE chapter_id = ?\n ORDER BY sentence_index, range_start, range_end, id\n `,\n [chapterId],\n mapMentionRow,\n );\n }\n\n public async deleteByChapter(chapterId: number): Promise<void> {\n await this.#database.run(\n `\n DELETE FROM mentions\n WHERE chapter_id = ?\n `,\n [chapterId],\n );\n }\n}\n\nexport class MentionLinkStore implements ReadonlyMentionLinkStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async save(record: MentionLinkRecord): Promise<void> {\n await this.#database.transaction(async () => {\n await this.#saveRecord(record);\n });\n }\n\n async #saveRecord(record: MentionLinkRecord): Promise<void> {\n await this.#database.run(\n `\n INSERT OR REPLACE INTO mention_links (\n id,\n source_mention_id,\n target_mention_id,\n predicate,\n confidence,\n note\n )\n VALUES (?, ?, ?, ?, ?, ?)\n `,\n [\n record.id,\n record.sourceMentionId,\n record.targetMentionId,\n record.predicate,\n record.confidence ?? null,\n record.note ?? null,\n ],\n );\n await this.#database.run(\n `\n DELETE FROM mention_link_evidence_sentences\n WHERE link_id = ?\n `,\n [record.id],\n );\n\n for (const [chapterId, sentenceIndex] of record.evidenceSentenceIds) {\n await this.#database.run(\n `\n INSERT INTO mention_link_evidence_sentences (\n link_id,\n chapter_id,\n sentence_index\n )\n VALUES (?, ?, ?)\n `,\n [record.id, chapterId, sentenceIndex],\n );\n }\n }\n\n public async saveMany(records: readonly MentionLinkRecord[]): Promise<void> {\n await this.#database.transaction(async () => {\n for (const record of records) {\n await this.#saveRecord(record);\n }\n });\n }\n\n public async getById(linkId: string): Promise<MentionLinkRecord | undefined> {\n const row = await this.#database.queryOne(\n `\n SELECT\n id,\n source_mention_id,\n target_mention_id,\n predicate,\n confidence,\n note\n FROM mention_links\n WHERE id = ?\n `,\n [linkId],\n mapMentionLinkRow,\n );\n\n return row === undefined ? undefined : await this.#hydrateEvidence(row);\n }\n\n public async listByTriple(input: {\n readonly objectQid: string;\n readonly predicate: string;\n readonly subjectQid: string;\n }): Promise<MentionLinkRecord[]> {\n const rows = await this.#database.queryAll(\n `\n SELECT\n mention_links.id AS id,\n mention_links.source_mention_id AS source_mention_id,\n mention_links.target_mention_id AS target_mention_id,\n mention_links.predicate AS predicate,\n mention_links.confidence AS confidence,\n mention_links.note AS note\n FROM mention_links\n INNER JOIN mentions AS source_mentions\n ON source_mentions.id = mention_links.source_mention_id\n INNER JOIN mentions AS target_mentions\n ON target_mentions.id = mention_links.target_mention_id\n WHERE source_mentions.qid = ?\n AND mention_links.predicate = ?\n AND target_mentions.qid = ?\n ORDER BY\n source_mentions.chapter_id,\n source_mentions.sentence_index,\n mention_links.id\n `,\n [input.subjectQid, input.predicate, input.objectQid],\n mapMentionLinkRow,\n );\n\n return await this.#hydrateEvidenceMany(rows);\n }\n\n public async listByChapter(chapterId: number): Promise<MentionLinkRecord[]> {\n const rows = await this.#database.queryAll(\n `\n SELECT\n mention_links.id AS id,\n mention_links.source_mention_id AS source_mention_id,\n mention_links.target_mention_id AS target_mention_id,\n mention_links.predicate AS predicate,\n mention_links.confidence AS confidence,\n mention_links.note AS note\n FROM mention_links\n INNER JOIN mentions AS source_mentions\n ON source_mentions.id = mention_links.source_mention_id\n INNER JOIN mentions AS target_mentions\n ON target_mentions.id = mention_links.target_mention_id\n WHERE source_mentions.chapter_id = ?\n OR target_mentions.chapter_id = ?\n ORDER BY mention_links.id\n `,\n [chapterId, chapterId],\n mapMentionLinkRow,\n );\n\n return await this.#hydrateEvidenceMany(rows);\n }\n\n public async deleteByChapter(chapterId: number): Promise<void> {\n await this.#database.transaction(async () => {\n await this.#database.run(\n `\n DELETE FROM mention_link_evidence_sentences\n WHERE link_id IN (\n SELECT mention_links.id\n FROM mention_links\n INNER JOIN mentions AS source_mentions\n ON source_mentions.id = mention_links.source_mention_id\n INNER JOIN mentions AS target_mentions\n ON target_mentions.id = mention_links.target_mention_id\n WHERE source_mentions.chapter_id = ?\n OR target_mentions.chapter_id = ?\n )\n `,\n [chapterId, chapterId],\n );\n await this.#database.run(\n `\n DELETE FROM mention_links\n WHERE source_mention_id IN (\n SELECT id\n FROM mentions\n WHERE chapter_id = ?\n )\n OR target_mention_id IN (\n SELECT id\n FROM mentions\n WHERE chapter_id = ?\n )\n `,\n [chapterId, chapterId],\n );\n });\n }\n\n async #hydrateEvidenceMany(\n records: readonly MentionLinkRecord[],\n ): Promise<MentionLinkRecord[]> {\n if (records.length === 0) {\n return [];\n }\n\n const sentenceIdsByLinkId = new Map<string, SentenceId[]>();\n const linkIds = [...new Set(records.map((record) => record.id))];\n\n for (const linkIdBatch of chunkArray(linkIds, MAX_SQL_BIND_PARAMS)) {\n const placeholders = linkIdBatch.map(() => \"?\").join(\", \");\n const rows = await this.#database.queryAll(\n `\n SELECT link_id, chapter_id, sentence_index\n FROM mention_link_evidence_sentences\n WHERE link_id IN (${placeholders})\n ORDER BY link_id, chapter_id, sentence_index\n `,\n linkIdBatch,\n (row) => ({\n linkId: getString(row, \"link_id\"),\n sentenceId: [\n getNumber(row, \"chapter_id\"),\n getNumber(row, \"sentence_index\"),\n ] as SentenceId,\n }),\n );\n\n for (const row of rows) {\n const sentenceIds = sentenceIdsByLinkId.get(row.linkId) ?? [];\n\n sentenceIds.push(row.sentenceId);\n sentenceIdsByLinkId.set(row.linkId, sentenceIds);\n }\n }\n\n return records.map((record) => ({\n ...record,\n evidenceSentenceIds: sentenceIdsByLinkId.get(record.id) ?? [],\n }));\n }\n\n async #hydrateEvidence(\n record: MentionLinkRecord,\n ): Promise<MentionLinkRecord> {\n const evidenceSentenceIds = await this.#database.queryAll(\n `\n SELECT chapter_id, sentence_index\n FROM mention_link_evidence_sentences\n WHERE link_id = ?\n ORDER BY chapter_id, sentence_index\n `,\n [record.id],\n (row): SentenceId => [\n getNumber(row, \"chapter_id\"),\n getNumber(row, \"sentence_index\"),\n ],\n );\n\n return {\n ...record,\n evidenceSentenceIds,\n };\n }\n}\n\nfunction chunkArray<T>(items: readonly T[], size: number): T[][] {\n const chunks: T[][] = [];\n\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size));\n }\n\n return chunks;\n}\n\nexport class SnakeChunkStore implements ReadonlySnakeChunkStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async save(record: SnakeChunkRecord): Promise<void> {\n await this.#database.run(\n `\n INSERT OR REPLACE INTO snake_chunks (snake_id, chunk_id, position)\n VALUES (?, ?, ?)\n `,\n [record.snakeId, record.chunkId, record.position],\n );\n }\n\n public async listChunkIds(snakeId: number): Promise<number[]> {\n return await this.#database.queryAll(\n `\n SELECT chunk_id\n FROM snake_chunks\n WHERE snake_id = ?\n ORDER BY position\n `,\n [snakeId],\n (row) => getNumber(row, \"chunk_id\"),\n );\n }\n\n public async listBySnake(snakeId: number): Promise<SnakeChunkRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT snake_id, chunk_id, position\n FROM snake_chunks\n WHERE snake_id = ?\n ORDER BY position\n `,\n [snakeId],\n (row) => ({\n chunkId: getNumber(row, \"chunk_id\"),\n position: getNumber(row, \"position\"),\n snakeId: getNumber(row, \"snake_id\"),\n }),\n );\n }\n}\n\nexport class SnakeEdgeStore implements ReadonlySnakeEdgeStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async save(record: SnakeEdgeRecord): Promise<void> {\n await this.#database.run(\n `\n INSERT OR REPLACE INTO snake_edges (from_snake_id, to_snake_id, weight)\n VALUES (?, ?, ?)\n `,\n [record.fromSnakeId, record.toSnakeId, record.weight],\n );\n }\n\n public async listIncoming(snakeId: number): Promise<SnakeEdgeRecord[]> {\n return await this.#listByDirection(\"to_snake_id\", snakeId);\n }\n\n public async listOutgoing(snakeId: number): Promise<SnakeEdgeRecord[]> {\n return await this.#listByDirection(\"from_snake_id\", snakeId);\n }\n\n public async listWithin(\n snakeIds: readonly number[],\n ): Promise<SnakeEdgeRecord[]> {\n if (snakeIds.length === 0) {\n return [];\n }\n\n const placeholders = snakeIds.map(() => \"?\").join(\", \");\n\n return await this.#database.queryAll(\n `\n SELECT from_snake_id, to_snake_id, weight\n FROM snake_edges\n WHERE from_snake_id IN (${placeholders})\n AND to_snake_id IN (${placeholders})\n ORDER BY from_snake_id, to_snake_id\n `,\n [...snakeIds, ...snakeIds],\n (row) => ({\n fromSnakeId: getNumber(row, \"from_snake_id\"),\n toSnakeId: getNumber(row, \"to_snake_id\"),\n weight: getNumber(row, \"weight\"),\n }),\n );\n }\n\n public async listBySerial(serialId: number): Promise<SnakeEdgeRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT\n snake_edges.from_snake_id AS from_snake_id,\n snake_edges.to_snake_id AS to_snake_id,\n snake_edges.weight AS weight\n FROM snake_edges\n INNER JOIN snakes AS from_snakes\n ON from_snakes.id = snake_edges.from_snake_id\n INNER JOIN snakes AS to_snakes\n ON to_snakes.id = snake_edges.to_snake_id\n WHERE from_snakes.serial_id = ? AND to_snakes.serial_id = ?\n ORDER BY snake_edges.from_snake_id, snake_edges.to_snake_id\n `,\n [serialId, serialId],\n (row) => ({\n fromSnakeId: getNumber(row, \"from_snake_id\"),\n toSnakeId: getNumber(row, \"to_snake_id\"),\n weight: getNumber(row, \"weight\"),\n }),\n );\n }\n\n async #listByDirection(\n column: \"from_snake_id\" | \"to_snake_id\",\n snakeId: number,\n ): Promise<SnakeEdgeRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT from_snake_id, to_snake_id, weight\n FROM snake_edges\n WHERE ${column} = ?\n ORDER BY from_snake_id, to_snake_id\n `,\n [snakeId],\n (row) => ({\n fromSnakeId: getNumber(row, \"from_snake_id\"),\n toSnakeId: getNumber(row, \"to_snake_id\"),\n weight: getNumber(row, \"weight\"),\n }),\n );\n }\n}\n\nexport class FragmentGroupStore implements ReadonlyFragmentGroupStore {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public async save(record: SentenceGroupRecord): Promise<void> {\n await this.#database.run(\n `\n INSERT OR REPLACE INTO sentence_groups (\n serial_id,\n group_id,\n start_sentence_index,\n end_sentence_index\n )\n VALUES (?, ?, ?, ?)\n `,\n [\n record.serialId,\n record.groupId,\n record.startSentenceIndex,\n record.endSentenceIndex,\n ],\n );\n }\n\n public async saveMany(\n records: readonly SentenceGroupRecord[],\n ): Promise<void> {\n await this.#database.transaction(async () => {\n for (const record of records) {\n await this.save(record);\n }\n });\n }\n\n public async listBySerial(serialId: number): Promise<SentenceGroupRecord[]> {\n return await this.#database.queryAll(\n `\n SELECT serial_id, group_id, start_sentence_index, end_sentence_index\n FROM sentence_groups\n WHERE serial_id = ?\n ORDER BY group_id, start_sentence_index\n `,\n [serialId],\n (row) => ({\n serialId: getNumber(row, \"serial_id\"),\n groupId: getNumber(row, \"group_id\"),\n startSentenceIndex: getNumber(row, \"start_sentence_index\"),\n endSentenceIndex: getNumber(row, \"end_sentence_index\"),\n }),\n );\n }\n\n public async listSerialIds(): Promise<number[]> {\n return await this.#database.queryAll(\n `\n SELECT DISTINCT serial_id\n FROM sentence_groups\n ORDER BY serial_id\n `,\n undefined,\n (row) => getNumber(row, \"serial_id\"),\n );\n }\n\n public async listGroupIdsForSerial(serialId: number): Promise<number[]> {\n return await this.#database.queryAll(\n `\n SELECT DISTINCT group_id\n FROM sentence_groups\n WHERE serial_id = ?\n ORDER BY group_id\n `,\n [serialId],\n (row) => getNumber(row, \"group_id\"),\n );\n }\n}\n\nfunction mapReadingEdgeRow(row: SqlRow): ReadingEdgeRecord {\n const strength = getOptionalString(row, \"strength\");\n\n return {\n fromId: getNumber(row, \"from_id\"),\n toId: getNumber(row, \"to_id\"),\n weight: getNumber(row, \"weight\"),\n ...(strength === undefined ? {} : { strength }),\n };\n}\n\nfunction mapMentionRow(row: SqlRow): MentionRecord {\n const sentenceIndex = getOptionalNumber(row, \"sentence_index\");\n const confidence = getOptionalNumber(row, \"confidence\");\n const note = getOptionalString(row, \"note\");\n\n return {\n chapterId: getNumber(row, \"chapter_id\"),\n ...(confidence === undefined ? {} : { confidence }),\n id: getString(row, \"id\"),\n ...(note === undefined ? {} : { note }),\n qid: getString(row, \"qid\"),\n rangeEnd: getNumber(row, \"range_end\"),\n rangeStart: getNumber(row, \"range_start\"),\n ...(sentenceIndex === undefined ? {} : { sentenceIndex }),\n surface: getString(row, \"surface\"),\n };\n}\n\nfunction deduplicateById<T extends { readonly id: number }>(\n records: readonly T[],\n): T[] {\n const seen = new Set<number>();\n const result: T[] = [];\n\n for (const record of records) {\n if (seen.has(record.id)) {\n continue;\n }\n\n seen.add(record.id);\n result.push(record);\n }\n\n return result;\n}\n\nfunction mapMentionLinkRow(row: SqlRow): MentionLinkRecord {\n const confidence = getOptionalNumber(row, \"confidence\");\n const note = getOptionalString(row, \"note\");\n\n return {\n ...(confidence === undefined ? {} : { confidence }),\n evidenceSentenceIds: [],\n id: getString(row, \"id\"),\n ...(note === undefined ? {} : { note }),\n predicate: getString(row, \"predicate\"),\n sourceMentionId: getString(row, \"source_mention_id\"),\n targetMentionId: getString(row, \"target_mention_id\"),\n };\n}\n\nfunction parseMetadataValue(valueJson: string): unknown {\n try {\n return JSON.parse(valueJson);\n } catch (error) {\n throw new Error(\n `Invalid object metadata JSON: ${formatUnknownError(error)}`,\n );\n }\n}\n\nfunction getOptionalNumber(row: SqlRow, key: string): number | undefined {\n const value = row[key];\n\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\") {\n throw new TypeError(`Expected ${key} to be a number`);\n }\n\n return value;\n}\n\nfunction formatUnknownError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction escapeLikePattern(value: string): string {\n return value.replace(/[\\\\%_]/gu, (character) => `\\\\${character}`);\n}\n\nfunction parseChunkImportance(\n value: string | undefined,\n): ChunkImportance | undefined {\n return value !== undefined && isChunkImportance(value) ? value : undefined;\n}\n\nfunction parseChunkRetention(\n value: string | undefined,\n): ChunkRetention | undefined {\n return value !== undefined && isChunkRetention(value) ? value : undefined;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,86 @@
1
+ import { Database } from './database.js';
2
+ import { FragmentRecord, SentenceRecord, SentenceId } from './types.js';
3
+ import 'sqlite3';
4
+
5
+ declare const TEXT_STREAM_KIND: {
6
+ readonly source: 1;
7
+ readonly summary: 2;
8
+ };
9
+ type TextStreamName = keyof typeof TEXT_STREAM_KIND;
10
+ interface TextStreamFileAccess {
11
+ deleteTree(path: string): Promise<void>;
12
+ ensureDirectory(path: string): Promise<void>;
13
+ listFiles(path: string): Promise<readonly string[]>;
14
+ readFile(path: string): Promise<Uint8Array | undefined>;
15
+ writeFile(path: string, content: string | Uint8Array, options: {
16
+ readonly overwrite?: boolean;
17
+ }): Promise<void>;
18
+ }
19
+ interface TextStreamSentenceSegmenter {
20
+ pipe(stream: Iterable<string>): AsyncIterable<{
21
+ readonly offset: number;
22
+ readonly text: string;
23
+ readonly wordsCount: number;
24
+ }>;
25
+ }
26
+ interface WriteTextStreamOptions {
27
+ readonly segmenter?: TextStreamSentenceSegmenter;
28
+ }
29
+ interface ReadonlyTextStreams {
30
+ getSentence(sentenceId: SentenceId): Promise<string>;
31
+ getSerial(serialId: number): ReadonlySerialTextStream;
32
+ getSummarySerial(serialId: number): ReadonlySerialTextStream;
33
+ }
34
+ interface ReadonlySerialTextStream {
35
+ getFragment(fragmentId: number): Promise<FragmentRecord>;
36
+ getSentence?(sentenceIndex: number): Promise<SentenceRecord>;
37
+ listSentencesInRange?(startSentenceIndex: number, endSentenceIndex: number): Promise<readonly SentenceRecord[]>;
38
+ listFragmentIds(): Promise<readonly number[]>;
39
+ listSentences?(): Promise<readonly SentenceRecord[]>;
40
+ readText?(): Promise<string | undefined>;
41
+ readTextInRange?(startSentenceIndex: number, endSentenceIndex: number): Promise<string | undefined>;
42
+ readonly path: string;
43
+ readonly serialId: number;
44
+ }
45
+ declare class TextStreams implements ReadonlyTextStreams {
46
+ #private;
47
+ constructor(documentPath: string, database: Database, fileAccess?: TextStreamFileAccess);
48
+ ensureCreated(): Promise<void>;
49
+ getSentence(sentenceId: SentenceId): Promise<string>;
50
+ getSerial(serialId: number): SerialTextStream;
51
+ getSummarySerial(serialId: number): SerialTextStream;
52
+ }
53
+ declare class SerialTextStream implements ReadonlySerialTextStream {
54
+ #private;
55
+ constructor(documentPath: string, database: Database, fileAccess: TextStreamFileAccess, stream: TextStreamName, serialId: number);
56
+ createDraft(): Promise<TextStreamDraft>;
57
+ getFragment(fragmentId: number): Promise<FragmentRecord>;
58
+ getSentence(sentenceIndex: number): Promise<SentenceRecord>;
59
+ listFragmentIds(): Promise<readonly number[]>;
60
+ listSentences(): Promise<readonly SentenceRecord[]>;
61
+ listSentencesInRange(startSentenceIndex: number, endSentenceIndex: number): Promise<readonly SentenceRecord[]>;
62
+ readTextInRange(startSentenceIndex: number, endSentenceIndex: number): Promise<string | undefined>;
63
+ readText(): Promise<string | undefined>;
64
+ writeTextStream(text: string, options?: WriteTextStreamOptions): Promise<void>;
65
+ delete(): Promise<void>;
66
+ get path(): string;
67
+ get serialId(): number;
68
+ }
69
+ declare class TextStreamDraft {
70
+ #private;
71
+ constructor(serialId: number, startSentenceIndex: number, callbacks: {
72
+ readonly discard: () => void;
73
+ readonly finalize: (startSentenceIndex: number, summary: string, sentences: readonly SentenceRecord[]) => Promise<FragmentRecord | undefined>;
74
+ });
75
+ addSentence(text: string, wordsCount: number, location?: {
76
+ readonly byteOffset: number;
77
+ readonly byteLength: number;
78
+ }): SentenceId;
79
+ commit(): Promise<FragmentRecord | undefined>;
80
+ commitWithText(text: string): Promise<FragmentRecord | undefined>;
81
+ discard(): void;
82
+ setSummary(summary: string): void;
83
+ get fragmentId(): number;
84
+ }
85
+
86
+ export { type ReadonlySerialTextStream, type ReadonlyTextStreams, SerialTextStream, TextStreamDraft, TextStreams };