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,63 @@
1
+ import { SentenceRecord, FragmentRecord, SentenceId } from './types.js';
2
+
3
+ interface FragmentWriter {
4
+ write(path: string, content: string): Promise<void>;
5
+ }
6
+ interface FragmentFileAccess {
7
+ ensureDirectory(path: string): Promise<void>;
8
+ listFileContents?(path: string): Promise<ReadonlyMap<string, Uint8Array>>;
9
+ listFiles(path: string): Promise<readonly string[]>;
10
+ readFile(path: string): Promise<Uint8Array | undefined>;
11
+ }
12
+ interface ReadonlyFragments {
13
+ getSerial(serialId: number): ReadonlySerialFragments;
14
+ getSummarySerial(serialId: number): ReadonlySerialFragments;
15
+ getSentence(sentenceId: SentenceId): Promise<string>;
16
+ getSummary(serialId: number, fragmentId: number): Promise<string>;
17
+ getWordsCount(serialId: number, fragmentId: number): Promise<number>;
18
+ readonly path: string;
19
+ }
20
+ interface TextStreamWriteOptions {
21
+ readonly maxWordsCount?: number;
22
+ }
23
+ interface ReadonlySerialFragments {
24
+ getFragment(fragmentId: number): Promise<FragmentRecord>;
25
+ listFragmentIds(): Promise<readonly number[]>;
26
+ readonly serialId: number;
27
+ readonly path: string;
28
+ }
29
+ declare class Fragments implements ReadonlyFragments {
30
+ #private;
31
+ constructor(documentPath: string, writer?: FragmentWriter, fileAccess?: FragmentFileAccess);
32
+ ensureCreated(): Promise<void>;
33
+ getSerial(serialId: number): SerialFragments;
34
+ getSummarySerial(serialId: number): SerialFragments;
35
+ getSentence(sentenceId: SentenceId): Promise<string>;
36
+ getSummary(serialId: number, fragmentId: number): Promise<string>;
37
+ getWordsCount(serialId: number, fragmentId: number): Promise<number>;
38
+ get path(): string;
39
+ }
40
+ declare class SerialFragments implements ReadonlySerialFragments {
41
+ #private;
42
+ constructor(documentPath: string, serialId: number, rootDirectoryName?: string, writer?: FragmentWriter, fileAccess?: FragmentFileAccess);
43
+ createDraft(): Promise<FragmentDraft>;
44
+ getFragment(fragmentId: number): Promise<FragmentRecord>;
45
+ listFragmentIds(): Promise<readonly number[]>;
46
+ writeTextStream(text: string, options?: TextStreamWriteOptions): Promise<void>;
47
+ get serialId(): number;
48
+ get path(): string;
49
+ }
50
+ declare class FragmentDraft {
51
+ #private;
52
+ constructor(serialId: number, fragmentId: number, startSentenceIndex: number, callbacks: {
53
+ readonly discard: () => void;
54
+ readonly finalize: (fragmentId: number, startSentenceIndex: number, summary: string, sentences: readonly SentenceRecord[]) => Promise<FragmentRecord | undefined>;
55
+ });
56
+ addSentence(text: string, wordsCount: number): SentenceId;
57
+ commit(): Promise<FragmentRecord | undefined>;
58
+ discard(): void;
59
+ setSummary(summary: string): void;
60
+ get fragmentId(): number;
61
+ }
62
+
63
+ export { FragmentDraft, Fragments, type ReadonlyFragments, type ReadonlySerialFragments, SerialFragments, type TextStreamWriteOptions };
@@ -0,0 +1,371 @@
1
+ import { mkdir, readFile, readdir, writeFile } from "fs/promises";
2
+ import { join, resolve } from "path";
3
+ import { isNodeError } from "../utils/node-error.js";
4
+ const SERIAL_DIRECTORY_PREFIX = "serial-";
5
+ const FRAGMENT_FILE_PATTERN = /^fragment_(\d+)\.json$/;
6
+ const DEFAULT_FRAGMENT_WORDS_COUNT = 600;
7
+ const DEFAULT_FRAGMENT_WRITER = {
8
+ write: async (path, content) => {
9
+ await writeFile(path, content, "utf8");
10
+ }
11
+ };
12
+ const DEFAULT_FRAGMENT_FILE_ACCESS = {
13
+ ensureDirectory: async (path) => {
14
+ await mkdir(path, { recursive: true });
15
+ },
16
+ listFiles: async (path) => (await readdir(path, { withFileTypes: true })).filter((entry) => entry.isFile()).map((entry) => entry.name),
17
+ readFile: async (path) => {
18
+ try {
19
+ return await readFile(path);
20
+ } catch (error) {
21
+ if (isNodeError(error) && error.code === "ENOENT") {
22
+ return void 0;
23
+ }
24
+ throw error;
25
+ }
26
+ }
27
+ };
28
+ class Fragments {
29
+ #documentPath;
30
+ #fileAccess;
31
+ #writer;
32
+ constructor(documentPath, writer, fileAccess) {
33
+ this.#documentPath = resolve(documentPath);
34
+ this.#fileAccess = fileAccess ?? DEFAULT_FRAGMENT_FILE_ACCESS;
35
+ this.#writer = writer ?? DEFAULT_FRAGMENT_WRITER;
36
+ }
37
+ async ensureCreated() {
38
+ await this.#fileAccess.ensureDirectory(this.path);
39
+ }
40
+ getSerial(serialId) {
41
+ return new SerialFragments(
42
+ this.#documentPath,
43
+ serialId,
44
+ "fragments",
45
+ this.#writer,
46
+ this.#fileAccess
47
+ );
48
+ }
49
+ getSummarySerial(serialId) {
50
+ return new SerialFragments(
51
+ this.#documentPath,
52
+ serialId,
53
+ "summaries",
54
+ this.#writer,
55
+ this.#fileAccess
56
+ );
57
+ }
58
+ async getSentence(sentenceId) {
59
+ const [serialId, sentenceIndex] = sentenceId;
60
+ const fragmentIds = await this.getSerial(serialId).listFragmentIds();
61
+ let remainingSentenceIndex = sentenceIndex;
62
+ for (const fragmentId of fragmentIds) {
63
+ const fragment = await this.getSerial(serialId).getFragment(fragmentId);
64
+ const sentence = fragment.sentences[remainingSentenceIndex];
65
+ if (sentence !== void 0) {
66
+ return sentence.text;
67
+ }
68
+ remainingSentenceIndex -= fragment.sentences.length;
69
+ }
70
+ throw new RangeError(`Sentence ${sentenceIndex} does not exist`);
71
+ }
72
+ async getSummary(serialId, fragmentId) {
73
+ return (await this.getSerial(serialId).getFragment(fragmentId)).summary;
74
+ }
75
+ async getWordsCount(serialId, fragmentId) {
76
+ const fragment = await this.getSerial(serialId).getFragment(fragmentId);
77
+ return fragment.sentences.reduce(
78
+ (total, sentence) => total + sentence.wordsCount,
79
+ 0
80
+ );
81
+ }
82
+ get path() {
83
+ return join(this.#documentPath, "fragments");
84
+ }
85
+ }
86
+ class SerialFragments {
87
+ #serialId;
88
+ #draftOpen = false;
89
+ #documentPath;
90
+ #fileAccess;
91
+ #fileContents;
92
+ #rootDirectoryName;
93
+ #nextFragmentId;
94
+ #nextSentenceIndex;
95
+ #writer;
96
+ constructor(documentPath, serialId, rootDirectoryName = "fragments", writer, fileAccess) {
97
+ this.#documentPath = resolve(documentPath);
98
+ this.#serialId = serialId;
99
+ this.#fileAccess = fileAccess ?? DEFAULT_FRAGMENT_FILE_ACCESS;
100
+ this.#rootDirectoryName = rootDirectoryName;
101
+ this.#writer = writer ?? DEFAULT_FRAGMENT_WRITER;
102
+ }
103
+ async createDraft() {
104
+ if (this.#draftOpen) {
105
+ throw new Error("Only one fragment draft can be open at a time");
106
+ }
107
+ await this.#fileAccess.ensureDirectory(this.path);
108
+ this.#draftOpen = true;
109
+ return new FragmentDraft(
110
+ this.#serialId,
111
+ await this.#peekNextFragmentId(),
112
+ await this.#peekNextSentenceIndex(),
113
+ {
114
+ discard: () => {
115
+ this.#discardDraft();
116
+ },
117
+ finalize: async (fragmentId, startSentenceIndex, summary, sentences) => await this.#commitDraft(
118
+ fragmentId,
119
+ startSentenceIndex,
120
+ summary,
121
+ sentences
122
+ )
123
+ }
124
+ );
125
+ }
126
+ async getFragment(fragmentId) {
127
+ const fileContent = this.#fileAccess.listFileContents === void 0 ? await readFragmentFile(
128
+ this.#getFragmentPath(fragmentId),
129
+ this.#fileAccess
130
+ ) : parseFragmentFileContent(
131
+ this.#getFragmentPath(fragmentId),
132
+ (await this.#getFileContents()).get(`fragment_${fragmentId}.json`)
133
+ );
134
+ return {
135
+ serialId: this.#serialId,
136
+ fragmentId,
137
+ summary: fileContent.summary,
138
+ sentences: fileContent.sentences
139
+ };
140
+ }
141
+ async listFragmentIds() {
142
+ try {
143
+ const entries = this.#fileAccess.listFileContents === void 0 ? await this.#fileAccess.listFiles(this.path) : [...(await this.#getFileContents()).keys()];
144
+ return entries.map((entry) => FRAGMENT_FILE_PATTERN.exec(entry)).filter((match) => match !== null).map((match) => Number(match[1])).sort((left, right) => left - right);
145
+ } catch (error) {
146
+ if (isNodeError(error) && error.code === "ENOENT") {
147
+ return [];
148
+ }
149
+ throw error;
150
+ }
151
+ }
152
+ async writeTextStream(text, options = {}) {
153
+ await this.#fileAccess.ensureDirectory(this.path);
154
+ const sentences = splitTextIntoSentences(text);
155
+ if (sentences.length === 0) {
156
+ const fragmentId = await this.#peekNextFragmentId();
157
+ await this.#writer.write(
158
+ this.#getFragmentPath(fragmentId),
159
+ JSON.stringify(
160
+ {
161
+ sentences: [],
162
+ summary: ""
163
+ },
164
+ void 0,
165
+ 2
166
+ )
167
+ );
168
+ this.#nextFragmentId = fragmentId + 1;
169
+ return;
170
+ }
171
+ const maxWordsCount = options.maxWordsCount ?? DEFAULT_FRAGMENT_WORDS_COUNT;
172
+ let draft = await this.createDraft();
173
+ let draftWordsCount = 0;
174
+ for (const sentence of sentences) {
175
+ if (draftWordsCount > 0 && draftWordsCount + sentence.wordsCount > maxWordsCount) {
176
+ await draft.commit();
177
+ draft = await this.createDraft();
178
+ draftWordsCount = 0;
179
+ }
180
+ draft.addSentence(sentence.text, sentence.wordsCount);
181
+ draftWordsCount += sentence.wordsCount;
182
+ }
183
+ await draft.commit();
184
+ }
185
+ get serialId() {
186
+ return this.#serialId;
187
+ }
188
+ get path() {
189
+ return join(
190
+ this.#documentPath,
191
+ this.#rootDirectoryName,
192
+ `${SERIAL_DIRECTORY_PREFIX}${this.#serialId}`
193
+ );
194
+ }
195
+ async #commitDraft(fragmentId, startSentenceIndex, summary, sentences) {
196
+ this.#draftOpen = false;
197
+ if (sentences.length === 0) {
198
+ return void 0;
199
+ }
200
+ await this.#fileAccess.ensureDirectory(this.path);
201
+ await this.#writer.write(
202
+ this.#getFragmentPath(fragmentId),
203
+ JSON.stringify(
204
+ {
205
+ sentences,
206
+ summary
207
+ },
208
+ void 0,
209
+ 2
210
+ )
211
+ );
212
+ this.#nextFragmentId = fragmentId + 1;
213
+ this.#nextSentenceIndex = startSentenceIndex + sentences.length;
214
+ return {
215
+ serialId: this.#serialId,
216
+ fragmentId,
217
+ summary,
218
+ sentences
219
+ };
220
+ }
221
+ #discardDraft() {
222
+ this.#draftOpen = false;
223
+ }
224
+ async #peekNextFragmentId() {
225
+ if (this.#nextFragmentId !== void 0) {
226
+ return this.#nextFragmentId;
227
+ }
228
+ const fragmentIds = await this.listFragmentIds();
229
+ const lastFragmentId = fragmentIds[fragmentIds.length - 1];
230
+ this.#nextFragmentId = lastFragmentId === void 0 ? 0 : lastFragmentId + 1;
231
+ return this.#nextFragmentId;
232
+ }
233
+ async #peekNextSentenceIndex() {
234
+ if (this.#nextSentenceIndex !== void 0) {
235
+ return this.#nextSentenceIndex;
236
+ }
237
+ let nextSentenceIndex = 0;
238
+ for (const fragmentId of await this.listFragmentIds()) {
239
+ nextSentenceIndex += (await this.getFragment(fragmentId)).sentences.length;
240
+ }
241
+ this.#nextSentenceIndex = nextSentenceIndex;
242
+ return this.#nextSentenceIndex;
243
+ }
244
+ #getFragmentPath(fragmentId) {
245
+ return join(this.path, `fragment_${fragmentId}.json`);
246
+ }
247
+ async #getFileContents() {
248
+ if (this.#fileAccess.listFileContents === void 0) {
249
+ throw new Error("Fragment file access does not support batch reads.");
250
+ }
251
+ this.#fileContents ??= this.#fileAccess.listFileContents(this.path);
252
+ return await this.#fileContents;
253
+ }
254
+ }
255
+ function splitTextIntoSentences(text) {
256
+ return text.split(/\n+/u).map((sentence) => sentence.trim()).filter((sentence) => sentence !== "").map((sentence) => ({
257
+ text: sentence,
258
+ wordsCount: countWords(sentence)
259
+ }));
260
+ }
261
+ function countWords(text) {
262
+ const trimmed = text.trim();
263
+ return trimmed === "" ? 0 : trimmed.split(/\s+/u).length;
264
+ }
265
+ class FragmentDraft {
266
+ #committed = false;
267
+ #serialId;
268
+ #discard;
269
+ #finalize;
270
+ #fragmentId;
271
+ #sentences = [];
272
+ #summary = "";
273
+ #startSentenceIndex;
274
+ constructor(serialId, fragmentId, startSentenceIndex, callbacks) {
275
+ this.#serialId = serialId;
276
+ this.#discard = callbacks.discard;
277
+ this.#finalize = callbacks.finalize;
278
+ this.#fragmentId = fragmentId;
279
+ this.#startSentenceIndex = startSentenceIndex;
280
+ }
281
+ addSentence(text, wordsCount) {
282
+ this.#assertActive();
283
+ const sentenceIndex = this.#startSentenceIndex + this.#sentences.length;
284
+ this.#sentences.push({
285
+ text,
286
+ wordsCount
287
+ });
288
+ return [this.#serialId, sentenceIndex];
289
+ }
290
+ async commit() {
291
+ this.#assertActive();
292
+ this.#committed = true;
293
+ return await this.#finalize(
294
+ this.#fragmentId,
295
+ this.#startSentenceIndex,
296
+ this.#summary,
297
+ this.#sentences
298
+ );
299
+ }
300
+ discard() {
301
+ this.#assertActive();
302
+ this.#committed = true;
303
+ this.#discard();
304
+ }
305
+ setSummary(summary) {
306
+ this.#assertActive();
307
+ this.#summary = summary;
308
+ }
309
+ get fragmentId() {
310
+ return this.#fragmentId;
311
+ }
312
+ #assertActive() {
313
+ if (this.#committed) {
314
+ throw new Error("Fragment draft is already finalized");
315
+ }
316
+ }
317
+ }
318
+ async function readFragmentFile(fragmentPath, fileAccess = DEFAULT_FRAGMENT_FILE_ACCESS) {
319
+ return parseFragmentFileContent(
320
+ fragmentPath,
321
+ await readFragmentFileContent(fragmentPath, fileAccess)
322
+ );
323
+ }
324
+ function parseFragmentFileContent(fragmentPath, content) {
325
+ if (content === void 0) {
326
+ throw new Error(`Fragment file does not exist: ${fragmentPath}`);
327
+ }
328
+ const rawContent = JSON.parse(
329
+ Buffer.from(content).toString("utf8")
330
+ );
331
+ if (typeof rawContent !== "object" || rawContent === null) {
332
+ throw new TypeError("Fragment file must be an object");
333
+ }
334
+ if (!("summary" in rawContent) || typeof rawContent.summary !== "string") {
335
+ throw new TypeError("Fragment file summary must be a string");
336
+ }
337
+ if (!("sentences" in rawContent) || !Array.isArray(rawContent.sentences)) {
338
+ throw new TypeError("Fragment file sentences must be an array");
339
+ }
340
+ return {
341
+ sentences: rawContent.sentences.map(parseSentenceRecord),
342
+ summary: rawContent.summary
343
+ };
344
+ }
345
+ async function readFragmentFileContent(fragmentPath, fileAccess) {
346
+ if (fileAccess.listFileContents === void 0) {
347
+ return await fileAccess.readFile(fragmentPath);
348
+ }
349
+ const directoryPath = resolve(join(fragmentPath, ".."));
350
+ const fileName = fragmentPath.slice(directoryPath.length + 1);
351
+ return (await fileAccess.listFileContents(directoryPath)).get(fileName);
352
+ }
353
+ function parseSentenceRecord(value) {
354
+ if (typeof value !== "object" || value === null) {
355
+ throw new TypeError("Sentence entry must be an object");
356
+ }
357
+ const { text, wordsCount } = value;
358
+ if (typeof text !== "string" || typeof wordsCount !== "number") {
359
+ throw new TypeError("Sentence entry is invalid");
360
+ }
361
+ return {
362
+ text,
363
+ wordsCount
364
+ };
365
+ }
366
+ export {
367
+ FragmentDraft,
368
+ Fragments,
369
+ SerialFragments
370
+ };
371
+ //# sourceMappingURL=fragments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/document/fragments.ts"],"sourcesContent":["import { mkdir, readFile, readdir, writeFile } from \"fs/promises\";\nimport { join, resolve } from \"path\";\n\nimport { isNodeError } from \"../utils/node-error.js\";\nimport type { FragmentRecord, SentenceId, SentenceRecord } from \"./types.js\";\n\nconst SERIAL_DIRECTORY_PREFIX = \"serial-\";\nconst FRAGMENT_FILE_PATTERN = /^fragment_(\\d+)\\.json$/;\nconst DEFAULT_FRAGMENT_WORDS_COUNT = 600;\n\ninterface FragmentFileContent {\n readonly summary: string;\n readonly sentences: readonly SentenceRecord[];\n}\n\ninterface FragmentWriter {\n write(path: string, content: string): Promise<void>;\n}\n\ninterface FragmentFileAccess {\n ensureDirectory(path: string): Promise<void>;\n listFileContents?(path: string): Promise<ReadonlyMap<string, Uint8Array>>;\n listFiles(path: string): Promise<readonly string[]>;\n readFile(path: string): Promise<Uint8Array | undefined>;\n}\n\nconst DEFAULT_FRAGMENT_WRITER: FragmentWriter = {\n write: async (path, content) => {\n await writeFile(path, content, \"utf8\");\n },\n};\n\nconst DEFAULT_FRAGMENT_FILE_ACCESS: FragmentFileAccess = {\n ensureDirectory: async (path) => {\n await mkdir(path, { recursive: true });\n },\n listFiles: async (path) =>\n (await readdir(path, { withFileTypes: true }))\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name),\n readFile: async (path) => {\n try {\n return await readFile(path);\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n },\n};\n\nexport interface ReadonlyFragments {\n getSerial(serialId: number): ReadonlySerialFragments;\n getSummarySerial(serialId: number): ReadonlySerialFragments;\n getSentence(sentenceId: SentenceId): Promise<string>;\n getSummary(serialId: number, fragmentId: number): Promise<string>;\n getWordsCount(serialId: number, fragmentId: number): Promise<number>;\n readonly path: string;\n}\n\nexport interface TextStreamWriteOptions {\n readonly maxWordsCount?: number;\n}\n\nexport interface ReadonlySerialFragments {\n getFragment(fragmentId: number): Promise<FragmentRecord>;\n listFragmentIds(): Promise<readonly number[]>;\n readonly serialId: number;\n readonly path: string;\n}\n\nexport class Fragments implements ReadonlyFragments {\n readonly #documentPath: string;\n readonly #fileAccess: FragmentFileAccess;\n readonly #writer: FragmentWriter;\n\n public constructor(\n documentPath: string,\n writer?: FragmentWriter,\n fileAccess?: FragmentFileAccess,\n ) {\n this.#documentPath = resolve(documentPath);\n this.#fileAccess = fileAccess ?? DEFAULT_FRAGMENT_FILE_ACCESS;\n this.#writer = writer ?? DEFAULT_FRAGMENT_WRITER;\n }\n\n public async ensureCreated(): Promise<void> {\n await this.#fileAccess.ensureDirectory(this.path);\n }\n\n public getSerial(serialId: number): SerialFragments {\n return new SerialFragments(\n this.#documentPath,\n serialId,\n \"fragments\",\n this.#writer,\n this.#fileAccess,\n );\n }\n\n public getSummarySerial(serialId: number): SerialFragments {\n return new SerialFragments(\n this.#documentPath,\n serialId,\n \"summaries\",\n this.#writer,\n this.#fileAccess,\n );\n }\n\n public async getSentence(sentenceId: SentenceId): Promise<string> {\n const [serialId, sentenceIndex] = sentenceId;\n const fragmentIds = await this.getSerial(serialId).listFragmentIds();\n let remainingSentenceIndex = sentenceIndex;\n\n for (const fragmentId of fragmentIds) {\n const fragment = await this.getSerial(serialId).getFragment(fragmentId);\n const sentence = fragment.sentences[remainingSentenceIndex];\n\n if (sentence !== undefined) {\n return sentence.text;\n }\n\n remainingSentenceIndex -= fragment.sentences.length;\n }\n\n throw new RangeError(`Sentence ${sentenceIndex} does not exist`);\n }\n\n public async getSummary(\n serialId: number,\n fragmentId: number,\n ): Promise<string> {\n return (await this.getSerial(serialId).getFragment(fragmentId)).summary;\n }\n\n public async getWordsCount(\n serialId: number,\n fragmentId: number,\n ): Promise<number> {\n const fragment = await this.getSerial(serialId).getFragment(fragmentId);\n\n return fragment.sentences.reduce(\n (total, sentence) => total + sentence.wordsCount,\n 0,\n );\n }\n\n public get path(): string {\n return join(this.#documentPath, \"fragments\");\n }\n}\n\nexport class SerialFragments implements ReadonlySerialFragments {\n readonly #serialId: number;\n #draftOpen = false;\n readonly #documentPath: string;\n readonly #fileAccess: FragmentFileAccess;\n #fileContents: Promise<ReadonlyMap<string, Uint8Array>> | undefined;\n readonly #rootDirectoryName: string;\n #nextFragmentId: number | undefined;\n #nextSentenceIndex: number | undefined;\n readonly #writer: FragmentWriter;\n\n public constructor(\n documentPath: string,\n serialId: number,\n rootDirectoryName = \"fragments\",\n writer?: FragmentWriter,\n fileAccess?: FragmentFileAccess,\n ) {\n this.#documentPath = resolve(documentPath);\n this.#serialId = serialId;\n this.#fileAccess = fileAccess ?? DEFAULT_FRAGMENT_FILE_ACCESS;\n this.#rootDirectoryName = rootDirectoryName;\n this.#writer = writer ?? DEFAULT_FRAGMENT_WRITER;\n }\n\n public async createDraft(): Promise<FragmentDraft> {\n if (this.#draftOpen) {\n throw new Error(\"Only one fragment draft can be open at a time\");\n }\n\n await this.#fileAccess.ensureDirectory(this.path);\n this.#draftOpen = true;\n\n return new FragmentDraft(\n this.#serialId,\n await this.#peekNextFragmentId(),\n await this.#peekNextSentenceIndex(),\n {\n discard: () => {\n this.#discardDraft();\n },\n finalize: async (fragmentId, startSentenceIndex, summary, sentences) =>\n await this.#commitDraft(\n fragmentId,\n startSentenceIndex,\n summary,\n sentences,\n ),\n },\n );\n }\n\n public async getFragment(fragmentId: number): Promise<FragmentRecord> {\n const fileContent =\n this.#fileAccess.listFileContents === undefined\n ? await readFragmentFile(\n this.#getFragmentPath(fragmentId),\n this.#fileAccess,\n )\n : parseFragmentFileContent(\n this.#getFragmentPath(fragmentId),\n (await this.#getFileContents()).get(`fragment_${fragmentId}.json`),\n );\n\n return {\n serialId: this.#serialId,\n fragmentId,\n summary: fileContent.summary,\n sentences: fileContent.sentences,\n };\n }\n\n public async listFragmentIds(): Promise<readonly number[]> {\n try {\n const entries =\n this.#fileAccess.listFileContents === undefined\n ? await this.#fileAccess.listFiles(this.path)\n : [...(await this.#getFileContents()).keys()];\n\n return entries\n .map((entry) => FRAGMENT_FILE_PATTERN.exec(entry))\n .filter((match): match is RegExpExecArray => match !== null)\n .map((match) => Number(match[1]))\n .sort((left, right) => left - right);\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n\n throw error;\n }\n }\n\n public async writeTextStream(\n text: string,\n options: TextStreamWriteOptions = {},\n ): Promise<void> {\n await this.#fileAccess.ensureDirectory(this.path);\n const sentences = splitTextIntoSentences(text);\n\n if (sentences.length === 0) {\n const fragmentId = await this.#peekNextFragmentId();\n\n await this.#writer.write(\n this.#getFragmentPath(fragmentId),\n JSON.stringify(\n {\n sentences: [],\n summary: \"\",\n },\n undefined,\n 2,\n ),\n );\n this.#nextFragmentId = fragmentId + 1;\n return;\n }\n\n const maxWordsCount = options.maxWordsCount ?? DEFAULT_FRAGMENT_WORDS_COUNT;\n let draft = await this.createDraft();\n let draftWordsCount = 0;\n\n for (const sentence of sentences) {\n if (\n draftWordsCount > 0 &&\n draftWordsCount + sentence.wordsCount > maxWordsCount\n ) {\n await draft.commit();\n draft = await this.createDraft();\n draftWordsCount = 0;\n }\n\n draft.addSentence(sentence.text, sentence.wordsCount);\n draftWordsCount += sentence.wordsCount;\n }\n\n await draft.commit();\n }\n\n public get serialId(): number {\n return this.#serialId;\n }\n\n public get path(): string {\n return join(\n this.#documentPath,\n this.#rootDirectoryName,\n `${SERIAL_DIRECTORY_PREFIX}${this.#serialId}`,\n );\n }\n\n async #commitDraft(\n fragmentId: number,\n startSentenceIndex: number,\n summary: string,\n sentences: readonly SentenceRecord[],\n ): Promise<FragmentRecord | undefined> {\n this.#draftOpen = false;\n\n if (sentences.length === 0) {\n return undefined;\n }\n\n await this.#fileAccess.ensureDirectory(this.path);\n await this.#writer.write(\n this.#getFragmentPath(fragmentId),\n JSON.stringify(\n {\n sentences,\n summary,\n },\n undefined,\n 2,\n ),\n );\n\n this.#nextFragmentId = fragmentId + 1;\n this.#nextSentenceIndex = startSentenceIndex + sentences.length;\n\n return {\n serialId: this.#serialId,\n fragmentId,\n summary,\n sentences,\n };\n }\n\n #discardDraft(): void {\n this.#draftOpen = false;\n }\n\n async #peekNextFragmentId(): Promise<number> {\n if (this.#nextFragmentId !== undefined) {\n return this.#nextFragmentId;\n }\n\n const fragmentIds = await this.listFragmentIds();\n const lastFragmentId = fragmentIds[fragmentIds.length - 1];\n\n this.#nextFragmentId =\n lastFragmentId === undefined ? 0 : lastFragmentId + 1;\n\n return this.#nextFragmentId;\n }\n\n async #peekNextSentenceIndex(): Promise<number> {\n if (this.#nextSentenceIndex !== undefined) {\n return this.#nextSentenceIndex;\n }\n\n let nextSentenceIndex = 0;\n\n for (const fragmentId of await this.listFragmentIds()) {\n nextSentenceIndex += (await this.getFragment(fragmentId)).sentences\n .length;\n }\n\n this.#nextSentenceIndex = nextSentenceIndex;\n return this.#nextSentenceIndex;\n }\n\n #getFragmentPath(fragmentId: number): string {\n return join(this.path, `fragment_${fragmentId}.json`);\n }\n\n async #getFileContents(): Promise<ReadonlyMap<string, Uint8Array>> {\n if (this.#fileAccess.listFileContents === undefined) {\n throw new Error(\"Fragment file access does not support batch reads.\");\n }\n\n this.#fileContents ??= this.#fileAccess.listFileContents(this.path);\n return await this.#fileContents;\n }\n}\n\nfunction splitTextIntoSentences(text: string): readonly SentenceRecord[] {\n return text\n .split(/\\n+/u)\n .map((sentence) => sentence.trim())\n .filter((sentence) => sentence !== \"\")\n .map((sentence) => ({\n text: sentence,\n wordsCount: countWords(sentence),\n }));\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n\n return trimmed === \"\" ? 0 : trimmed.split(/\\s+/u).length;\n}\n\nexport class FragmentDraft {\n #committed = false;\n readonly #serialId: number;\n readonly #discard: () => void;\n readonly #finalize: (\n fragmentId: number,\n startSentenceIndex: number,\n summary: string,\n sentences: readonly SentenceRecord[],\n ) => Promise<FragmentRecord | undefined>;\n readonly #fragmentId: number;\n readonly #sentences: SentenceRecord[] = [];\n #summary = \"\";\n readonly #startSentenceIndex: number;\n\n public constructor(\n serialId: number,\n fragmentId: number,\n startSentenceIndex: number,\n callbacks: {\n readonly discard: () => void;\n readonly finalize: (\n fragmentId: number,\n startSentenceIndex: number,\n summary: string,\n sentences: readonly SentenceRecord[],\n ) => Promise<FragmentRecord | undefined>;\n },\n ) {\n this.#serialId = serialId;\n this.#discard = callbacks.discard;\n this.#finalize = callbacks.finalize;\n this.#fragmentId = fragmentId;\n this.#startSentenceIndex = startSentenceIndex;\n }\n\n public addSentence(text: string, wordsCount: number): SentenceId {\n this.#assertActive();\n const sentenceIndex = this.#startSentenceIndex + this.#sentences.length;\n\n this.#sentences.push({\n text,\n wordsCount,\n });\n\n return [this.#serialId, sentenceIndex];\n }\n\n public async commit(): Promise<FragmentRecord | undefined> {\n this.#assertActive();\n this.#committed = true;\n\n return await this.#finalize(\n this.#fragmentId,\n this.#startSentenceIndex,\n this.#summary,\n this.#sentences,\n );\n }\n\n public discard(): void {\n this.#assertActive();\n this.#committed = true;\n this.#discard();\n }\n\n public setSummary(summary: string): void {\n this.#assertActive();\n this.#summary = summary;\n }\n\n public get fragmentId(): number {\n return this.#fragmentId;\n }\n\n #assertActive(): void {\n if (this.#committed) {\n throw new Error(\"Fragment draft is already finalized\");\n }\n }\n}\n\nasync function readFragmentFile(\n fragmentPath: string,\n fileAccess: FragmentFileAccess = DEFAULT_FRAGMENT_FILE_ACCESS,\n): Promise<FragmentFileContent> {\n return parseFragmentFileContent(\n fragmentPath,\n await readFragmentFileContent(fragmentPath, fileAccess),\n );\n}\n\nfunction parseFragmentFileContent(\n fragmentPath: string,\n content: Uint8Array | undefined,\n): FragmentFileContent {\n if (content === undefined) {\n throw new Error(`Fragment file does not exist: ${fragmentPath}`);\n }\n\n const rawContent = JSON.parse(\n Buffer.from(content).toString(\"utf8\"),\n ) as unknown;\n\n if (typeof rawContent !== \"object\" || rawContent === null) {\n throw new TypeError(\"Fragment file must be an object\");\n }\n\n if (!(\"summary\" in rawContent) || typeof rawContent.summary !== \"string\") {\n throw new TypeError(\"Fragment file summary must be a string\");\n }\n if (!(\"sentences\" in rawContent) || !Array.isArray(rawContent.sentences)) {\n throw new TypeError(\"Fragment file sentences must be an array\");\n }\n\n return {\n sentences: rawContent.sentences.map(parseSentenceRecord),\n summary: rawContent.summary,\n };\n}\n\nasync function readFragmentFileContent(\n fragmentPath: string,\n fileAccess: FragmentFileAccess,\n): Promise<Uint8Array | undefined> {\n if (fileAccess.listFileContents === undefined) {\n return await fileAccess.readFile(fragmentPath);\n }\n\n const directoryPath = resolve(join(fragmentPath, \"..\"));\n const fileName = fragmentPath.slice(directoryPath.length + 1);\n\n return (await fileAccess.listFileContents(directoryPath)).get(fileName);\n}\n\nfunction parseSentenceRecord(value: unknown): SentenceRecord {\n if (typeof value !== \"object\" || value === null) {\n throw new TypeError(\"Sentence entry must be an object\");\n }\n\n const { text, wordsCount } = value as {\n readonly text?: unknown;\n readonly wordsCount?: unknown;\n };\n\n if (typeof text !== \"string\" || typeof wordsCount !== \"number\") {\n throw new TypeError(\"Sentence entry is invalid\");\n }\n\n return {\n text,\n wordsCount,\n };\n}\n"],"mappings":"AAAA,SAAS,OAAO,UAAU,SAAS,iBAAiB;AACpD,SAAS,MAAM,eAAe;AAE9B,SAAS,mBAAmB;AAG5B,MAAM,0BAA0B;AAChC,MAAM,wBAAwB;AAC9B,MAAM,+BAA+B;AAkBrC,MAAM,0BAA0C;AAAA,EAC9C,OAAO,OAAO,MAAM,YAAY;AAC9B,UAAM,UAAU,MAAM,SAAS,MAAM;AAAA,EACvC;AACF;AAEA,MAAM,+BAAmD;AAAA,EACvD,iBAAiB,OAAO,SAAS;AAC/B,UAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AAAA,EACA,WAAW,OAAO,UACf,MAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC,GACzC,OAAO,CAAC,UAAU,MAAM,OAAO,CAAC,EAChC,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EAC9B,UAAU,OAAO,SAAS;AACxB,QAAI;AACF,aAAO,MAAM,SAAS,IAAI;AAAA,IAC5B,SAAS,OAAO;AACd,UAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAsBO,MAAM,UAAuC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EAEF,YACL,cACA,QACA,YACA;AACA,SAAK,gBAAgB,QAAQ,YAAY;AACzC,SAAK,cAAc,cAAc;AACjC,SAAK,UAAU,UAAU;AAAA,EAC3B;AAAA,EAEA,MAAa,gBAA+B;AAC1C,UAAM,KAAK,YAAY,gBAAgB,KAAK,IAAI;AAAA,EAClD;AAAA,EAEO,UAAU,UAAmC;AAClD,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEO,iBAAiB,UAAmC;AACzD,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAa,YAAY,YAAyC;AAChE,UAAM,CAAC,UAAU,aAAa,IAAI;AAClC,UAAM,cAAc,MAAM,KAAK,UAAU,QAAQ,EAAE,gBAAgB;AACnE,QAAI,yBAAyB;AAE7B,eAAW,cAAc,aAAa;AACpC,YAAM,WAAW,MAAM,KAAK,UAAU,QAAQ,EAAE,YAAY,UAAU;AACtE,YAAM,WAAW,SAAS,UAAU,sBAAsB;AAE1D,UAAI,aAAa,QAAW;AAC1B,eAAO,SAAS;AAAA,MAClB;AAEA,gCAA0B,SAAS,UAAU;AAAA,IAC/C;AAEA,UAAM,IAAI,WAAW,YAAY,aAAa,iBAAiB;AAAA,EACjE;AAAA,EAEA,MAAa,WACX,UACA,YACiB;AACjB,YAAQ,MAAM,KAAK,UAAU,QAAQ,EAAE,YAAY,UAAU,GAAG;AAAA,EAClE;AAAA,EAEA,MAAa,cACX,UACA,YACiB;AACjB,UAAM,WAAW,MAAM,KAAK,UAAU,QAAQ,EAAE,YAAY,UAAU;AAEtE,WAAO,SAAS,UAAU;AAAA,MACxB,CAAC,OAAO,aAAa,QAAQ,SAAS;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAW,OAAe;AACxB,WAAO,KAAK,KAAK,eAAe,WAAW;AAAA,EAC7C;AACF;AAEO,MAAM,gBAAmD;AAAA,EACrD;AAAA,EACT,aAAa;AAAA,EACJ;AAAA,EACA;AAAA,EACT;AAAA,EACS;AAAA,EACT;AAAA,EACA;AAAA,EACS;AAAA,EAEF,YACL,cACA,UACA,oBAAoB,aACpB,QACA,YACA;AACA,SAAK,gBAAgB,QAAQ,YAAY;AACzC,SAAK,YAAY;AACjB,SAAK,cAAc,cAAc;AACjC,SAAK,qBAAqB;AAC1B,SAAK,UAAU,UAAU;AAAA,EAC3B;AAAA,EAEA,MAAa,cAAsC;AACjD,QAAI,KAAK,YAAY;AACnB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,UAAM,KAAK,YAAY,gBAAgB,KAAK,IAAI;AAChD,SAAK,aAAa;AAElB,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL,MAAM,KAAK,oBAAoB;AAAA,MAC/B,MAAM,KAAK,uBAAuB;AAAA,MAClC;AAAA,QACE,SAAS,MAAM;AACb,eAAK,cAAc;AAAA,QACrB;AAAA,QACA,UAAU,OAAO,YAAY,oBAAoB,SAAS,cACxD,MAAM,KAAK;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,YAAY,YAA6C;AACpE,UAAM,cACJ,KAAK,YAAY,qBAAqB,SAClC,MAAM;AAAA,MACJ,KAAK,iBAAiB,UAAU;AAAA,MAChC,KAAK;AAAA,IACP,IACA;AAAA,MACE,KAAK,iBAAiB,UAAU;AAAA,OAC/B,MAAM,KAAK,iBAAiB,GAAG,IAAI,YAAY,UAAU,OAAO;AAAA,IACnE;AAEN,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf;AAAA,MACA,SAAS,YAAY;AAAA,MACrB,WAAW,YAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAa,kBAA8C;AACzD,QAAI;AACF,YAAM,UACJ,KAAK,YAAY,qBAAqB,SAClC,MAAM,KAAK,YAAY,UAAU,KAAK,IAAI,IAC1C,CAAC,IAAI,MAAM,KAAK,iBAAiB,GAAG,KAAK,CAAC;AAEhD,aAAO,QACJ,IAAI,CAAC,UAAU,sBAAsB,KAAK,KAAK,CAAC,EAChD,OAAO,CAAC,UAAoC,UAAU,IAAI,EAC1D,IAAI,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC,CAAC,EAC/B,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AAAA,IACvC,SAAS,OAAO;AACd,UAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,eAAO,CAAC;AAAA,MACV;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,gBACX,MACA,UAAkC,CAAC,GACpB;AACf,UAAM,KAAK,YAAY,gBAAgB,KAAK,IAAI;AAChD,UAAM,YAAY,uBAAuB,IAAI;AAE7C,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,aAAa,MAAM,KAAK,oBAAoB;AAElD,YAAM,KAAK,QAAQ;AAAA,QACjB,KAAK,iBAAiB,UAAU;AAAA,QAChC,KAAK;AAAA,UACH;AAAA,YACE,WAAW,CAAC;AAAA,YACZ,SAAS;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,WAAK,kBAAkB,aAAa;AACpC;AAAA,IACF;AAEA,UAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAI,QAAQ,MAAM,KAAK,YAAY;AACnC,QAAI,kBAAkB;AAEtB,eAAW,YAAY,WAAW;AAChC,UACE,kBAAkB,KAClB,kBAAkB,SAAS,aAAa,eACxC;AACA,cAAM,MAAM,OAAO;AACnB,gBAAQ,MAAM,KAAK,YAAY;AAC/B,0BAAkB;AAAA,MACpB;AAEA,YAAM,YAAY,SAAS,MAAM,SAAS,UAAU;AACpD,yBAAmB,SAAS;AAAA,IAC9B;AAEA,UAAM,MAAM,OAAO;AAAA,EACrB;AAAA,EAEA,IAAW,WAAmB;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,OAAe;AACxB,WAAO;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG,uBAAuB,GAAG,KAAK,SAAS;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,YACA,oBACA,SACA,WACqC;AACrC,SAAK,aAAa;AAElB,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,YAAY,gBAAgB,KAAK,IAAI;AAChD,UAAM,KAAK,QAAQ;AAAA,MACjB,KAAK,iBAAiB,UAAU;AAAA,MAChC,KAAK;AAAA,QACH;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,SAAK,kBAAkB,aAAa;AACpC,SAAK,qBAAqB,qBAAqB,UAAU;AAEzD,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAsB;AACpB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,sBAAuC;AAC3C,QAAI,KAAK,oBAAoB,QAAW;AACtC,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,cAAc,MAAM,KAAK,gBAAgB;AAC/C,UAAM,iBAAiB,YAAY,YAAY,SAAS,CAAC;AAEzD,SAAK,kBACH,mBAAmB,SAAY,IAAI,iBAAiB;AAEtD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,yBAA0C;AAC9C,QAAI,KAAK,uBAAuB,QAAW;AACzC,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,oBAAoB;AAExB,eAAW,cAAc,MAAM,KAAK,gBAAgB,GAAG;AACrD,4BAAsB,MAAM,KAAK,YAAY,UAAU,GAAG,UACvD;AAAA,IACL;AAEA,SAAK,qBAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAAiB,YAA4B;AAC3C,WAAO,KAAK,KAAK,MAAM,YAAY,UAAU,OAAO;AAAA,EACtD;AAAA,EAEA,MAAM,mBAA6D;AACjE,QAAI,KAAK,YAAY,qBAAqB,QAAW;AACnD,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,SAAK,kBAAkB,KAAK,YAAY,iBAAiB,KAAK,IAAI;AAClE,WAAO,MAAM,KAAK;AAAA,EACpB;AACF;AAEA,SAAS,uBAAuB,MAAyC;AACvE,SAAO,KACJ,MAAM,MAAM,EACZ,IAAI,CAAC,aAAa,SAAS,KAAK,CAAC,EACjC,OAAO,CAAC,aAAa,aAAa,EAAE,EACpC,IAAI,CAAC,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,YAAY,WAAW,QAAQ;AAAA,EACjC,EAAE;AACN;AAEA,SAAS,WAAW,MAAsB;AACxC,QAAM,UAAU,KAAK,KAAK;AAE1B,SAAO,YAAY,KAAK,IAAI,QAAQ,MAAM,MAAM,EAAE;AACpD;AAEO,MAAM,cAAc;AAAA,EACzB,aAAa;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EAMA;AAAA,EACA,aAA+B,CAAC;AAAA,EACzC,WAAW;AAAA,EACF;AAAA,EAEF,YACL,UACA,YACA,oBACA,WASA;AACA,SAAK,YAAY;AACjB,SAAK,WAAW,UAAU;AAC1B,SAAK,YAAY,UAAU;AAC3B,SAAK,cAAc;AACnB,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEO,YAAY,MAAc,YAAgC;AAC/D,SAAK,cAAc;AACnB,UAAM,gBAAgB,KAAK,sBAAsB,KAAK,WAAW;AAEjE,SAAK,WAAW,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,CAAC,KAAK,WAAW,aAAa;AAAA,EACvC;AAAA,EAEA,MAAa,SAA8C;AACzD,SAAK,cAAc;AACnB,SAAK,aAAa;AAElB,WAAO,MAAM,KAAK;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEO,UAAgB;AACrB,SAAK,cAAc;AACnB,SAAK,aAAa;AAClB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEO,WAAW,SAAuB;AACvC,SAAK,cAAc;AACnB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAW,aAAqB;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAsB;AACpB,QAAI,KAAK,YAAY;AACnB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAAA,EACF;AACF;AAEA,eAAe,iBACb,cACA,aAAiC,8BACH;AAC9B,SAAO;AAAA,IACL;AAAA,IACA,MAAM,wBAAwB,cAAc,UAAU;AAAA,EACxD;AACF;AAEA,SAAS,yBACP,cACA,SACqB;AACrB,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,iCAAiC,YAAY,EAAE;AAAA,EACjE;AAEA,QAAM,aAAa,KAAK;AAAA,IACtB,OAAO,KAAK,OAAO,EAAE,SAAS,MAAM;AAAA,EACtC;AAEA,MAAI,OAAO,eAAe,YAAY,eAAe,MAAM;AACzD,UAAM,IAAI,UAAU,iCAAiC;AAAA,EACvD;AAEA,MAAI,EAAE,aAAa,eAAe,OAAO,WAAW,YAAY,UAAU;AACxE,UAAM,IAAI,UAAU,wCAAwC;AAAA,EAC9D;AACA,MAAI,EAAE,eAAe,eAAe,CAAC,MAAM,QAAQ,WAAW,SAAS,GAAG;AACxE,UAAM,IAAI,UAAU,0CAA0C;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,WAAW,WAAW,UAAU,IAAI,mBAAmB;AAAA,IACvD,SAAS,WAAW;AAAA,EACtB;AACF;AAEA,eAAe,wBACb,cACA,YACiC;AACjC,MAAI,WAAW,qBAAqB,QAAW;AAC7C,WAAO,MAAM,WAAW,SAAS,YAAY;AAAA,EAC/C;AAEA,QAAM,gBAAgB,QAAQ,KAAK,cAAc,IAAI,CAAC;AACtD,QAAM,WAAW,aAAa,MAAM,cAAc,SAAS,CAAC;AAE5D,UAAQ,MAAM,WAAW,iBAAiB,aAAa,GAAG,IAAI,QAAQ;AACxE;AAEA,SAAS,oBAAoB,OAAgC;AAC3D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,IAAI,UAAU,kCAAkC;AAAA,EACxD;AAEA,QAAM,EAAE,MAAM,WAAW,IAAI;AAK7B,MAAI,OAAO,SAAS,YAAY,OAAO,eAAe,UAAU;AAC9D,UAAM,IAAI,UAAU,2BAA2B;AAAA,EACjD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,13 @@
1
+ export { Database } from './database.js';
2
+ export { ensureSharedStateDatabaseInitialized, openSharedStateDatabase } from './shared-state-database.js';
3
+ export { ReadonlyTextStreams as ReadonlyFragments, ReadonlySerialTextStream as ReadonlySerialFragments, ReadonlySerialTextStream, ReadonlyTextStreams, SerialTextStream, TextStreams } from './text-streams.js';
4
+ export { FragmentDraft, Fragments, SerialFragments } from './fragments.js';
5
+ export { DirectoryDocument, Document, DocumentContext, ReadonlyDocument } from './document.js';
6
+ export { SCHEMA_SQL } from './schema.js';
7
+ export { ChunkStore, FragmentGroupStore, GraphBuildParameterStore, MentionLinkStore, MentionStore, ObjectMetadataStore, ReadingEdgeStore, ReadonlyChunkStore, ReadonlyFragmentGroupStore, ReadonlyGraphBuildParameterStore, ReadonlyMentionLinkStore, ReadonlyMentionStore, ReadonlyObjectMetadataStore, ReadonlyReadingEdgeStore, ReadonlySerialStore, ReadonlySnakeChunkStore, ReadonlySnakeEdgeStore, ReadonlySnakeStore, SerialStore, SnakeChunkStore, SnakeEdgeStore, SnakeStore } from './stores.js';
8
+ export { ChunkImportance, ChunkRecord, ChunkRetention, CreateSnakeRecord, FragmentRecord, GraphBuildParameterRecord, MentionLinkRecord, MentionRecord, ObjectMetadataKind, ObjectMetadataTarget, ReadingEdgeRecord, SentenceGroupRecord, SentenceId, SentenceRecord, SerialRecord, SnakeChunkRecord, SnakeEdgeRecord, SnakeRecord, expectChunkImportance, expectChunkRetention, isChunkImportance, isChunkRetention } from './types.js';
9
+ import 'sqlite3';
10
+ import '../source/meta.js';
11
+ import 'zod';
12
+ import '../source/toc.js';
13
+ import '../source/types.js';
@@ -0,0 +1,62 @@
1
+ import { Database } from "./database.js";
2
+ import {
3
+ ensureSharedStateDatabaseInitialized,
4
+ openSharedStateDatabase
5
+ } from "./shared-state-database.js";
6
+ import { TextStreams, SerialTextStream } from "./text-streams.js";
7
+ import { FragmentDraft, Fragments, SerialFragments } from "./fragments.js";
8
+ import { DirectoryDocument } from "./document.js";
9
+ import { SCHEMA_SQL } from "./schema.js";
10
+ import {
11
+ ChunkStore,
12
+ FragmentGroupStore,
13
+ GraphBuildParameterStore,
14
+ ReadingEdgeStore,
15
+ MentionLinkStore,
16
+ MentionStore,
17
+ ObjectMetadataStore,
18
+ SerialStore,
19
+ SnakeChunkStore,
20
+ SnakeEdgeStore,
21
+ SnakeStore
22
+ } from "./stores.js";
23
+ import {
24
+ ChunkImportance,
25
+ ChunkRetention,
26
+ expectChunkImportance,
27
+ expectChunkRetention,
28
+ isChunkImportance,
29
+ isChunkRetention,
30
+ ObjectMetadataKind
31
+ } from "./types.js";
32
+ export {
33
+ ChunkImportance,
34
+ ChunkRetention,
35
+ ChunkStore,
36
+ Database,
37
+ DirectoryDocument,
38
+ FragmentDraft,
39
+ FragmentGroupStore,
40
+ Fragments,
41
+ GraphBuildParameterStore,
42
+ MentionLinkStore,
43
+ MentionStore,
44
+ ObjectMetadataKind,
45
+ ObjectMetadataStore,
46
+ ReadingEdgeStore,
47
+ SCHEMA_SQL,
48
+ SerialFragments,
49
+ SerialStore,
50
+ SerialTextStream,
51
+ SnakeChunkStore,
52
+ SnakeEdgeStore,
53
+ SnakeStore,
54
+ TextStreams,
55
+ ensureSharedStateDatabaseInitialized,
56
+ expectChunkImportance,
57
+ expectChunkRetention,
58
+ isChunkImportance,
59
+ isChunkRetention,
60
+ openSharedStateDatabase
61
+ };
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/document/index.ts"],"sourcesContent":["export { Database } from \"./database.js\";\nexport {\n ensureSharedStateDatabaseInitialized,\n openSharedStateDatabase,\n} from \"./shared-state-database.js\";\nexport { TextStreams, SerialTextStream } from \"./text-streams.js\";\nexport { FragmentDraft, Fragments, SerialFragments } from \"./fragments.js\";\nexport type {\n ReadonlySerialTextStream,\n ReadonlySerialTextStream as ReadonlySerialFragments,\n ReadonlyTextStreams,\n ReadonlyTextStreams as ReadonlyFragments,\n} from \"./text-streams.js\";\nexport { DirectoryDocument } from \"./document.js\";\nexport type {\n Document,\n DocumentContext,\n ReadonlyDocument,\n} from \"./document.js\";\nexport { SCHEMA_SQL } from \"./schema.js\";\nexport {\n ChunkStore,\n FragmentGroupStore,\n GraphBuildParameterStore,\n ReadingEdgeStore,\n MentionLinkStore,\n MentionStore,\n ObjectMetadataStore,\n SerialStore,\n SnakeChunkStore,\n SnakeEdgeStore,\n SnakeStore,\n} from \"./stores.js\";\nexport type {\n ReadonlyChunkStore,\n ReadonlyFragmentGroupStore,\n ReadonlyGraphBuildParameterStore,\n ReadonlyReadingEdgeStore,\n ReadonlyMentionLinkStore,\n ReadonlyMentionStore,\n ReadonlyObjectMetadataStore,\n ReadonlySerialStore,\n ReadonlySnakeChunkStore,\n ReadonlySnakeEdgeStore,\n ReadonlySnakeStore,\n} from \"./stores.js\";\nexport {\n ChunkImportance,\n ChunkRetention,\n expectChunkImportance,\n expectChunkRetention,\n isChunkImportance,\n isChunkRetention,\n ObjectMetadataKind,\n} from \"./types.js\";\nexport type {\n ChunkRecord,\n CreateSnakeRecord,\n FragmentRecord,\n GraphBuildParameterRecord,\n ReadingEdgeRecord,\n MentionLinkRecord,\n MentionRecord,\n ObjectMetadataTarget,\n SerialRecord,\n SentenceId,\n SentenceGroupRecord,\n SentenceRecord,\n SnakeChunkRecord,\n SnakeEdgeRecord,\n SnakeRecord,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa,wBAAwB;AAC9C,SAAS,eAAe,WAAW,uBAAuB;AAO1D,SAAS,yBAAyB;AAMlC,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAcP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
@@ -0,0 +1,8 @@
1
+ import { Database } from './database.js';
2
+ import 'sqlite3';
3
+
4
+ declare const SCHEMA_SQL = "\n CREATE TABLE IF NOT EXISTS serials (\n id INTEGER PRIMARY KEY,\n document_order INTEGER NOT NULL DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS serial_states (\n serial_id INTEGER PRIMARY KEY,\n revision INTEGER NOT NULL DEFAULT 0,\n topology_ready INTEGER NOT NULL DEFAULT 0,\n topology_parameter_hash TEXT,\n knowledge_graph_ready INTEGER NOT NULL DEFAULT 0,\n knowledge_graph_parameter_hash TEXT,\n FOREIGN KEY (serial_id) REFERENCES serials(id)\n );\n\n CREATE TABLE IF NOT EXISTS archive_revisions (\n key TEXT PRIMARY KEY,\n value INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS archive_index_settings (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n fts_embedded INTEGER NOT NULL DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS graph_build_parameters (\n hash TEXT PRIMARY KEY,\n prompt TEXT NOT NULL,\n language TEXT,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS chunks (\n id INTEGER PRIMARY KEY,\n generation INTEGER NOT NULL,\n serial_id INTEGER NOT NULL,\n sentence_index INTEGER NOT NULL,\n label TEXT NOT NULL,\n content TEXT NOT NULL,\n retention TEXT,\n importance TEXT,\n wordsCount INTEGER NOT NULL DEFAULT 0,\n weight REAL NOT NULL DEFAULT 0.0\n );\n\n CREATE INDEX IF NOT EXISTS idx_chunks_sentence\n ON chunks(serial_id, sentence_index);\n\n CREATE INDEX IF NOT EXISTS idx_chunks_serial_id\n ON chunks(serial_id, id);\n\n CREATE TABLE IF NOT EXISTS chunk_sentences (\n chunk_id INTEGER NOT NULL,\n serial_id INTEGER NOT NULL,\n sentence_index INTEGER NOT NULL,\n FOREIGN KEY (chunk_id) REFERENCES chunks(id),\n PRIMARY KEY (chunk_id, serial_id, sentence_index)\n );\n\n CREATE TABLE IF NOT EXISTS reading_edges (\n from_id INTEGER NOT NULL,\n to_id INTEGER NOT NULL,\n strength TEXT,\n weight REAL NOT NULL DEFAULT 0.1,\n PRIMARY KEY (from_id, to_id),\n FOREIGN KEY (from_id) REFERENCES chunks(id),\n FOREIGN KEY (to_id) REFERENCES chunks(id)\n );\n\n CREATE TABLE IF NOT EXISTS snakes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n serial_id INTEGER NOT NULL,\n group_id INTEGER NOT NULL,\n local_snake_id INTEGER NOT NULL,\n size INTEGER NOT NULL,\n first_label TEXT NOT NULL,\n last_label TEXT NOT NULL,\n wordsCount INTEGER NOT NULL DEFAULT 0,\n weight REAL NOT NULL DEFAULT 0.0,\n UNIQUE(serial_id, group_id, local_snake_id)\n );\n\n CREATE TABLE IF NOT EXISTS snake_chunks (\n snake_id INTEGER NOT NULL,\n chunk_id INTEGER NOT NULL,\n position INTEGER NOT NULL,\n FOREIGN KEY (snake_id) REFERENCES snakes(id),\n FOREIGN KEY (chunk_id) REFERENCES chunks(id),\n PRIMARY KEY (snake_id, chunk_id)\n );\n\n CREATE TABLE IF NOT EXISTS snake_edges (\n from_snake_id INTEGER NOT NULL,\n to_snake_id INTEGER NOT NULL,\n weight REAL NOT NULL DEFAULT 0.1,\n PRIMARY KEY (from_snake_id, to_snake_id),\n FOREIGN KEY (from_snake_id) REFERENCES snakes(id),\n FOREIGN KEY (to_snake_id) REFERENCES snakes(id)\n );\n\n CREATE TABLE IF NOT EXISTS sentence_groups (\n serial_id INTEGER NOT NULL,\n group_id INTEGER NOT NULL,\n start_sentence_index INTEGER NOT NULL,\n end_sentence_index INTEGER NOT NULL,\n PRIMARY KEY (serial_id, group_id, start_sentence_index, end_sentence_index)\n );\n\n CREATE TABLE IF NOT EXISTS mentions (\n id TEXT PRIMARY KEY,\n chapter_id INTEGER NOT NULL,\n sentence_index INTEGER,\n range_start INTEGER NOT NULL,\n range_end INTEGER NOT NULL,\n surface TEXT NOT NULL,\n qid TEXT NOT NULL,\n confidence REAL,\n note TEXT,\n FOREIGN KEY (chapter_id) REFERENCES serials(id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_mentions_chapter\n ON mentions(chapter_id);\n\n CREATE INDEX IF NOT EXISTS idx_mentions_chapter_position\n ON mentions(chapter_id, sentence_index, range_start, range_end, id);\n\n CREATE INDEX IF NOT EXISTS idx_mentions_chapter_qid\n ON mentions(chapter_id, qid);\n\n CREATE INDEX IF NOT EXISTS idx_mentions_qid\n ON mentions(qid);\n\n CREATE INDEX IF NOT EXISTS idx_mentions_qid_position\n ON mentions(qid, chapter_id, sentence_index, range_start, range_end, id);\n\n CREATE INDEX IF NOT EXISTS idx_mentions_surface\n ON mentions(surface);\n\n CREATE INDEX IF NOT EXISTS idx_mentions_surface_position\n ON mentions(surface, chapter_id, sentence_index, range_start, range_end, id);\n\n CREATE INDEX IF NOT EXISTS idx_mentions_sentence\n ON mentions(chapter_id, sentence_index);\n\n CREATE TABLE IF NOT EXISTS mention_links (\n id TEXT PRIMARY KEY,\n source_mention_id TEXT NOT NULL,\n target_mention_id TEXT NOT NULL,\n predicate TEXT NOT NULL,\n confidence REAL,\n note TEXT,\n FOREIGN KEY (source_mention_id) REFERENCES mentions(id),\n FOREIGN KEY (target_mention_id) REFERENCES mentions(id)\n );\n\n CREATE TABLE IF NOT EXISTS mention_link_evidence_sentences (\n link_id TEXT NOT NULL,\n chapter_id INTEGER NOT NULL,\n sentence_index INTEGER NOT NULL,\n FOREIGN KEY (link_id) REFERENCES mention_links(id),\n PRIMARY KEY (link_id, chapter_id, sentence_index)\n );\n\n CREATE INDEX IF NOT EXISTS idx_mention_link_evidence_sentences_sentence\n ON mention_link_evidence_sentences(chapter_id, sentence_index);\n\n CREATE INDEX IF NOT EXISTS idx_mention_links_source\n ON mention_links(source_mention_id);\n\n CREATE INDEX IF NOT EXISTS idx_mention_links_target\n ON mention_links(target_mention_id);\n\n CREATE INDEX IF NOT EXISTS idx_mention_links_predicate\n ON mention_links(predicate);\n\n CREATE INDEX IF NOT EXISTS idx_mention_links_predicate_source_target\n ON mention_links(predicate, source_mention_id, target_mention_id);\n\n CREATE INDEX IF NOT EXISTS idx_mention_links_predicate_target_source\n ON mention_links(predicate, target_mention_id, source_mention_id);\n\n CREATE INDEX IF NOT EXISTS idx_mention_links_source_predicate_target\n ON mention_links(source_mention_id, predicate, target_mention_id);\n\n CREATE INDEX IF NOT EXISTS idx_mention_links_target_predicate_source\n ON mention_links(target_mention_id, predicate, source_mention_id);\n\n CREATE INDEX IF NOT EXISTS idx_mention_links_source_target_predicate\n ON mention_links(source_mention_id, target_mention_id, predicate);\n\n CREATE INDEX IF NOT EXISTS idx_reading_edges_target\n ON reading_edges(to_id, from_id);\n\n CREATE INDEX IF NOT EXISTS idx_snake_edges_target\n ON snake_edges(to_snake_id, from_snake_id);\n\n CREATE VIEW IF NOT EXISTS chapter_entities AS\n SELECT\n chapter_id,\n qid,\n COUNT(*) AS mention_count\n FROM mentions\n GROUP BY chapter_id, qid;\n\n CREATE VIEW IF NOT EXISTS book_entities AS\n SELECT\n qid,\n SUM(mention_count) AS mention_count\n FROM chapter_entities\n GROUP BY qid;\n\n CREATE VIEW IF NOT EXISTS chapter_entity_relations AS\n SELECT\n source_mentions.chapter_id AS chapter_id,\n source_mentions.qid AS subject_qid,\n mention_links.predicate AS predicate,\n target_mentions.qid AS object_qid,\n COUNT(*) AS evidence_count\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.chapter_id = target_mentions.chapter_id\n GROUP BY\n source_mentions.chapter_id,\n source_mentions.qid,\n mention_links.predicate,\n target_mentions.qid;\n\n CREATE VIEW IF NOT EXISTS book_entity_relations AS\n SELECT\n subject_qid,\n predicate,\n object_qid,\n SUM(evidence_count) AS evidence_count\n FROM chapter_entity_relations\n GROUP BY subject_qid, predicate, object_qid;\n\n CREATE TABLE IF NOT EXISTS text_sentence_records (\n id INTEGER PRIMARY KEY,\n kind INTEGER NOT NULL,\n chapter_id INTEGER NOT NULL,\n sentence_index INTEGER NOT NULL,\n words_count INTEGER NOT NULL DEFAULT 0,\n byte_offset INTEGER NOT NULL DEFAULT 0,\n byte_length INTEGER NOT NULL DEFAULT 0,\n UNIQUE(kind, chapter_id, sentence_index)\n );\n\n CREATE INDEX IF NOT EXISTS idx_text_sentence_records_chapter\n ON text_sentence_records(kind, chapter_id, sentence_index);\n\n CREATE TABLE IF NOT EXISTS object_metadata (\n id INTEGER PRIMARY KEY,\n object_kind INTEGER NOT NULL,\n object_path TEXT NOT NULL,\n key TEXT NOT NULL,\n value_json TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n chapter_id INTEGER,\n chunk_id INTEGER,\n entity_qid TEXT,\n triple_subject_qid TEXT,\n triple_predicate TEXT,\n triple_object_qid TEXT,\n UNIQUE(object_path, key)\n );\n\n CREATE INDEX IF NOT EXISTS idx_object_metadata_object\n ON object_metadata(object_path);\n\n CREATE INDEX IF NOT EXISTS idx_object_metadata_chapter\n ON object_metadata(chapter_id);\n\n CREATE INDEX IF NOT EXISTS idx_object_metadata_chunk\n ON object_metadata(chunk_id);\n\n CREATE INDEX IF NOT EXISTS idx_object_metadata_entity\n ON object_metadata(entity_qid);\n\n CREATE INDEX IF NOT EXISTS idx_object_metadata_triple\n ON object_metadata(\n triple_subject_qid,\n triple_predicate,\n triple_object_qid\n );\n";
5
+ declare const SEARCH_INDEX_SCHEMA_SQL = "\n CREATE TABLE IF NOT EXISTS search_index_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS text_sentence_records (\n id INTEGER PRIMARY KEY,\n kind INTEGER NOT NULL,\n chapter_id INTEGER NOT NULL,\n sentence_index INTEGER NOT NULL,\n words_count INTEGER NOT NULL DEFAULT 0,\n byte_offset INTEGER NOT NULL DEFAULT 0,\n byte_length INTEGER NOT NULL DEFAULT 0,\n UNIQUE(kind, chapter_id, sentence_index)\n );\n\n CREATE INDEX IF NOT EXISTS idx_text_sentence_records_chapter\n ON text_sentence_records(kind, chapter_id, sentence_index);\n\n CREATE VIRTUAL TABLE IF NOT EXISTS text_sentence_fts USING fts5(\n tier1,\n tier2,\n tier3,\n tokenize='ascii'\n );\n\n CREATE TABLE IF NOT EXISTS search_object_properties_records (\n id INTEGER PRIMARY KEY,\n owner_kind INTEGER NOT NULL,\n owner_id TEXT NOT NULL,\n property_kind INTEGER NOT NULL,\n chapter_id INTEGER\n );\n\n CREATE INDEX IF NOT EXISTS idx_search_object_properties_records_owner\n ON search_object_properties_records(owner_kind, owner_id);\n\n CREATE INDEX IF NOT EXISTS idx_search_object_properties_records_chapter\n ON search_object_properties_records(chapter_id, owner_kind, owner_id);\n\n CREATE VIRTUAL TABLE IF NOT EXISTS search_object_properties_fts USING fts5(\n tier1,\n tier2,\n tier3,\n tokenize='ascii'\n );\n";
6
+ declare function initializeDocumentSchema(database: Database): Promise<void>;
7
+
8
+ export { SCHEMA_SQL, SEARCH_INDEX_SCHEMA_SQL, initializeDocumentSchema };