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,615 @@
1
+ import { AsyncLocalStorage } from "async_hooks";
2
+ import { mkdir, readFile, readdir, rm, unlink, writeFile } from "fs/promises";
3
+ import { join, resolve } from "path";
4
+ import { z } from "zod";
5
+ import { bookMetaSchema } from "../source/meta.js";
6
+ import { tocFileSchema } from "../source/toc.js";
7
+ import { isNodeError } from "../utils/node-error.js";
8
+ import { Database } from "./database.js";
9
+ import {
10
+ TextStreams
11
+ } from "./text-streams.js";
12
+ import {
13
+ initializeDocumentSchema,
14
+ SCHEMA_SQL,
15
+ SEARCH_INDEX_SCHEMA_SQL
16
+ } from "./schema.js";
17
+ import {
18
+ ChunkStore,
19
+ FragmentGroupStore,
20
+ GraphBuildParameterStore,
21
+ ReadingEdgeStore,
22
+ MentionLinkStore,
23
+ MentionStore,
24
+ ObjectMetadataStore,
25
+ SerialStore,
26
+ SnakeChunkStore,
27
+ SnakeEdgeStore,
28
+ SnakeStore
29
+ } from "./stores.js";
30
+ import { ObjectMetadataKind } from "./types.js";
31
+ const LOCAL_DOCUMENT_FILE_STORE = {
32
+ close: () => Promise.resolve(),
33
+ deleteFile: async (path) => {
34
+ await unlink(path);
35
+ },
36
+ deleteTree: async (path) => {
37
+ await rm(path, { force: true, recursive: true });
38
+ },
39
+ ensureDirectory: async (path) => {
40
+ await mkdir(path, { recursive: true });
41
+ },
42
+ initializeDatabaseSchema: () => true,
43
+ markDatabaseDirty: () => void 0,
44
+ markSearchIndexDatabaseDirty: () => void 0,
45
+ openDatabaseReadonly: () => false,
46
+ listFiles: async (path) => (await readdir(path, { withFileTypes: true })).filter((entry) => entry.isFile()).map((entry) => entry.name),
47
+ readFile: async (path) => {
48
+ try {
49
+ return await readFile(path);
50
+ } catch (error) {
51
+ if (isNodeError(error) && error.code === "ENOENT") {
52
+ return void 0;
53
+ }
54
+ throw error;
55
+ }
56
+ },
57
+ resolveDatabasePath: (documentPath) => Promise.resolve(join(documentPath, "database.db")),
58
+ resolveSearchIndexDatabasePath: (documentPath) => Promise.resolve(join(documentPath, "fts.db")),
59
+ writeFile: async (path, content, options) => {
60
+ if (typeof content === "string") {
61
+ await writeFile(path, content, {
62
+ encoding: "utf8",
63
+ flag: options.overwrite === true ? "w" : "wx"
64
+ });
65
+ } else {
66
+ await writeFile(path, content, {
67
+ flag: options.overwrite === true ? "w" : "wx"
68
+ });
69
+ }
70
+ }
71
+ };
72
+ const coverFileSchema = z.object({
73
+ mediaType: z.string().min(1),
74
+ path: z.string()
75
+ });
76
+ class DirectoryDocument {
77
+ chunks;
78
+ fragmentGroups;
79
+ graphBuildParameters;
80
+ readingEdges;
81
+ mentionLinks;
82
+ mentions;
83
+ metadata;
84
+ path;
85
+ serials;
86
+ snakeChunks;
87
+ snakeEdges;
88
+ snakes;
89
+ #database;
90
+ #fileStore;
91
+ #textStreams;
92
+ #contextScope = new AsyncLocalStorage();
93
+ constructor(database, textStreams, path, fileStore = LOCAL_DOCUMENT_FILE_STORE) {
94
+ this.#database = database;
95
+ this.#fileStore = fileStore;
96
+ this.#textStreams = textStreams;
97
+ this.chunks = new ChunkStore(database);
98
+ this.fragmentGroups = new FragmentGroupStore(database);
99
+ this.graphBuildParameters = new GraphBuildParameterStore(database);
100
+ this.readingEdges = new ReadingEdgeStore(database);
101
+ this.mentionLinks = new MentionLinkStore(database);
102
+ this.mentions = new MentionStore(database);
103
+ this.metadata = new ObjectMetadataStore(database);
104
+ this.path = path;
105
+ this.serials = new SerialStore(database);
106
+ this.snakeChunks = new SnakeChunkStore(database);
107
+ this.snakeEdges = new SnakeEdgeStore(database);
108
+ this.snakes = new SnakeStore(database);
109
+ }
110
+ static async open(documentPath, options = {}) {
111
+ const resolvedDocumentPath = resolve(documentPath);
112
+ const fileStore = options.fileStore ?? LOCAL_DOCUMENT_FILE_STORE;
113
+ try {
114
+ const databasePath = await fileStore.resolveDatabasePath(resolvedDocumentPath);
115
+ await fileStore.ensureDirectory(resolvedDocumentPath);
116
+ const shouldInitializeDatabaseSchema = fileStore.initializeDatabaseSchema();
117
+ const database = await Database.open(
118
+ databasePath,
119
+ shouldInitializeDatabaseSchema ? SCHEMA_SQL : "",
120
+ {
121
+ onWrite: () => {
122
+ fileStore.markDatabaseDirty?.();
123
+ },
124
+ readonly: fileStore.openDatabaseReadonly()
125
+ }
126
+ );
127
+ if (shouldInitializeDatabaseSchema) {
128
+ await initializeDocumentSchema(database);
129
+ }
130
+ const textStreams = new TextStreams(resolvedDocumentPath, database, {
131
+ deleteTree: async (path) => {
132
+ await fileStore.deleteTree(path);
133
+ },
134
+ ensureDirectory: async (path) => {
135
+ await fileStore.ensureDirectory(path);
136
+ },
137
+ listFiles: async (path) => await fileStore.listFiles(path),
138
+ readFile: async (path) => await fileStore.readFile(path),
139
+ writeFile: async (path, content, options2) => {
140
+ await fileStore.writeFile(path, content, options2);
141
+ }
142
+ });
143
+ await textStreams.ensureCreated();
144
+ const document = new DirectoryDocument(
145
+ database,
146
+ textStreams,
147
+ resolvedDocumentPath,
148
+ fileStore
149
+ );
150
+ return document;
151
+ } catch (error) {
152
+ await fileStore.close();
153
+ throw error;
154
+ }
155
+ }
156
+ static async openSession(documentPath, operation) {
157
+ const document = await DirectoryDocument.open(documentPath);
158
+ try {
159
+ return await document.openSession(async () => await operation(document));
160
+ } finally {
161
+ await document.release();
162
+ }
163
+ }
164
+ getSerialFragments(serialId) {
165
+ return this.#textStreams.getSerial(serialId);
166
+ }
167
+ getSummaryFragments(serialId) {
168
+ return this.#textStreams.getSummarySerial(serialId);
169
+ }
170
+ createContext() {
171
+ return new DirectoryDocumentContext(this);
172
+ }
173
+ async createSerial() {
174
+ const serialId = await this.serials.create();
175
+ this.#contextScope.getStore()?.ownSerial(serialId);
176
+ return serialId;
177
+ }
178
+ async clearSerialGraph(serialId) {
179
+ await this.deleteSummary(serialId);
180
+ await this.#deleteSerialGraphRecords(serialId);
181
+ await this.serials.setTopologyReady(serialId, false);
182
+ await this.serials.setKnowledgeGraphReady(serialId, false);
183
+ await this.serials.bumpRevision(serialId);
184
+ await this.graphBuildParameters.deleteUnreferenced();
185
+ }
186
+ async clearSerialSource(serialId) {
187
+ await this.clearSerialGraph(serialId);
188
+ await this.#textStreams.getSerial(serialId).delete();
189
+ await this.serials.bumpRevision(serialId);
190
+ }
191
+ async deleteSerial(serialId) {
192
+ await this.#deleteSerialResources(serialId);
193
+ }
194
+ async deleteSummary(serialId) {
195
+ await this.#textStreams.getSummarySerial(serialId).delete();
196
+ }
197
+ async getSentence(sentenceId) {
198
+ return await this.#textStreams.getSentence(sentenceId);
199
+ }
200
+ async openSession(operation) {
201
+ const activeContext = this.#contextScope.getStore();
202
+ if (activeContext !== void 0) {
203
+ return await operation(this);
204
+ }
205
+ const context = new DirectoryDocumentContext(this);
206
+ try {
207
+ const result = await this.#database.transaction(
208
+ async () => await context.run(async () => await operation(this))
209
+ );
210
+ context.complete();
211
+ return result;
212
+ } finally {
213
+ await context.dispose();
214
+ }
215
+ }
216
+ async readDatabase(operation) {
217
+ return await operation(this.#database);
218
+ }
219
+ async readSearchIndexDatabase(operation) {
220
+ return await this.#openSearchIndexDatabase(true, operation);
221
+ }
222
+ async writeSearchIndexDatabase(operation) {
223
+ return await this.#openSearchIndexDatabase(false, operation);
224
+ }
225
+ async deleteSearchIndexDatabase() {
226
+ await this.#fileStore.deleteFile(join(this.path, "fts.db"));
227
+ }
228
+ async peekNextSerialId() {
229
+ return await this.serials.getMaxId() + 1;
230
+ }
231
+ async readBookMeta() {
232
+ const map = await this.metadata.getMap("");
233
+ return Object.keys(map).length === 0 ? void 0 : bookMetaSchema.parse(map);
234
+ }
235
+ async readCover() {
236
+ const coverFile = await this.#readJsonFile(
237
+ this.#getCoverInfoPath(),
238
+ (value) => coverFileSchema.parse(value)
239
+ );
240
+ if (coverFile === void 0) {
241
+ return void 0;
242
+ }
243
+ const data = await this.#readOptionalFile(this.#getCoverDataPath());
244
+ if (data === void 0) {
245
+ throw new Error("Cover data is missing");
246
+ }
247
+ return {
248
+ data,
249
+ mediaType: coverFile.mediaType,
250
+ path: coverFile.path
251
+ };
252
+ }
253
+ async readSummary(serialId) {
254
+ return await this.#textStreams.getSummarySerial(serialId).readText();
255
+ }
256
+ async readToc() {
257
+ return await this.#readJsonFile(
258
+ this.#getTocPath(),
259
+ (value) => tocFileSchema.parse(value)
260
+ );
261
+ }
262
+ async writeBookMeta(meta) {
263
+ if (Object.keys(await this.metadata.getMap("")).length > 0) {
264
+ throw new Error("Archive metadata already exists.");
265
+ }
266
+ await this.replaceBookMeta(meta);
267
+ }
268
+ async replaceBookMeta(meta) {
269
+ await this.metadata.replaceMap(
270
+ {
271
+ kind: ObjectMetadataKind.Archive,
272
+ objectPath: ""
273
+ },
274
+ {
275
+ ...meta
276
+ }
277
+ );
278
+ }
279
+ async writeCover(cover) {
280
+ await this.#fileStore.ensureDirectory(this.#getCoverDirectoryPath());
281
+ await this.#writeJsonFile(this.#getCoverInfoPath(), {
282
+ mediaType: cover.mediaType,
283
+ path: cover.path
284
+ });
285
+ await this.#writeNewFile(this.#getCoverDataPath(), cover.data);
286
+ }
287
+ async writeSummary(serialId, summary) {
288
+ await this.deleteSummary(serialId);
289
+ await this.#textStreams.getSummarySerial(serialId).writeTextStream(summary);
290
+ await this.serials.bumpRevision(serialId);
291
+ }
292
+ async writeToc(toc) {
293
+ await this.#writeJsonFile(this.#getTocPath(), toc);
294
+ await this.#replaceDocumentOrder(toc);
295
+ await this.serials.bumpChaptersRevision();
296
+ }
297
+ async replaceToc(toc) {
298
+ await this.#writeJsonFile(this.#getTocPath(), toc, { overwrite: true });
299
+ await this.#replaceDocumentOrder(toc);
300
+ await this.serials.bumpChaptersRevision();
301
+ }
302
+ async flush() {
303
+ await this.#database.flush();
304
+ }
305
+ async release() {
306
+ try {
307
+ await this.flush();
308
+ await this.#database.close();
309
+ } finally {
310
+ await this.#fileStore.close();
311
+ }
312
+ }
313
+ async close() {
314
+ await this.release();
315
+ }
316
+ async #openSearchIndexDatabase(readonly, operation) {
317
+ const databasePath = this.#fileStore.resolveSearchIndexDatabasePath === void 0 ? join(this.path, "fts.db") : await this.#fileStore.resolveSearchIndexDatabasePath(this.path);
318
+ const database = await Database.open(
319
+ databasePath,
320
+ readonly ? "" : SEARCH_INDEX_SCHEMA_SQL,
321
+ {
322
+ onWrite: () => {
323
+ this.#fileStore.markSearchIndexDatabaseDirty?.();
324
+ },
325
+ readonly
326
+ }
327
+ );
328
+ try {
329
+ return await operation(database);
330
+ } finally {
331
+ await database.close();
332
+ }
333
+ }
334
+ async #rollbackContext(context) {
335
+ await this.#rollbackOwnedSerials(context.listOwnedSerialIds());
336
+ await this.#rollbackCreatedFiles(context.listCreatedFilePaths());
337
+ }
338
+ async #rollbackCreatedFiles(createdFilePaths) {
339
+ for (const path of [...createdFilePaths].reverse()) {
340
+ try {
341
+ await this.#fileStore.deleteFile(path);
342
+ } catch (error) {
343
+ if (isNodeError(error) && error.code === "ENOENT") {
344
+ continue;
345
+ }
346
+ throw error;
347
+ }
348
+ }
349
+ }
350
+ async #rollbackOwnedSerials(serialIds) {
351
+ for (const serialId of [...serialIds].sort(compareNumberDescending)) {
352
+ await this.#deleteSerialResources(serialId);
353
+ }
354
+ }
355
+ async #deleteSerialResources(serialId) {
356
+ await this.metadata.deleteChapterSubtree(serialId);
357
+ await this.#deleteSerialGraphRecords(serialId);
358
+ await this.#database.transaction(async () => {
359
+ await this.#database.run(
360
+ `
361
+ DELETE FROM serial_states
362
+ WHERE serial_id = ?
363
+ `,
364
+ [serialId]
365
+ );
366
+ await this.#database.run(
367
+ `
368
+ DELETE FROM serials
369
+ WHERE id = ?
370
+ `,
371
+ [serialId]
372
+ );
373
+ });
374
+ await this.#textStreams.getSerial(serialId).delete();
375
+ await this.deleteSummary(serialId);
376
+ await this.serials.bumpChaptersRevision();
377
+ await this.graphBuildParameters.deleteUnreferenced();
378
+ }
379
+ async #deleteSerialGraphRecords(serialId) {
380
+ await this.#database.transaction(async () => {
381
+ await this.#database.run(
382
+ `
383
+ DELETE FROM mention_link_evidence_sentences
384
+ WHERE link_id IN (
385
+ SELECT mention_links.id
386
+ FROM mention_links
387
+ INNER JOIN mentions AS source_mentions
388
+ ON source_mentions.id = mention_links.source_mention_id
389
+ INNER JOIN mentions AS target_mentions
390
+ ON target_mentions.id = mention_links.target_mention_id
391
+ WHERE source_mentions.chapter_id = ?
392
+ OR target_mentions.chapter_id = ?
393
+ )
394
+ `,
395
+ [serialId, serialId]
396
+ );
397
+ await this.#database.run(
398
+ `
399
+ DELETE FROM mention_links
400
+ WHERE source_mention_id IN (
401
+ SELECT id
402
+ FROM mentions
403
+ WHERE chapter_id = ?
404
+ ) OR target_mention_id IN (
405
+ SELECT id
406
+ FROM mentions
407
+ WHERE chapter_id = ?
408
+ )
409
+ `,
410
+ [serialId, serialId]
411
+ );
412
+ await this.#database.run(
413
+ `
414
+ DELETE FROM mentions
415
+ WHERE chapter_id = ?
416
+ `,
417
+ [serialId]
418
+ );
419
+ await this.#database.run(
420
+ `
421
+ DELETE FROM snake_edges
422
+ WHERE from_snake_id IN (
423
+ SELECT id
424
+ FROM snakes
425
+ WHERE serial_id = ?
426
+ ) OR to_snake_id IN (
427
+ SELECT id
428
+ FROM snakes
429
+ WHERE serial_id = ?
430
+ )
431
+ `,
432
+ [serialId, serialId]
433
+ );
434
+ await this.#database.run(
435
+ `
436
+ DELETE FROM snake_chunks
437
+ WHERE snake_id IN (
438
+ SELECT id
439
+ FROM snakes
440
+ WHERE serial_id = ?
441
+ )
442
+ `,
443
+ [serialId]
444
+ );
445
+ await this.#database.run(
446
+ `
447
+ DELETE FROM snakes
448
+ WHERE serial_id = ?
449
+ `,
450
+ [serialId]
451
+ );
452
+ await this.#database.run(
453
+ `
454
+ DELETE FROM sentence_groups
455
+ WHERE serial_id = ?
456
+ `,
457
+ [serialId]
458
+ );
459
+ await this.#database.run(
460
+ `
461
+ DELETE FROM reading_edges
462
+ WHERE from_id IN (
463
+ SELECT id
464
+ FROM chunks
465
+ WHERE serial_id = ?
466
+ ) OR to_id IN (
467
+ SELECT id
468
+ FROM chunks
469
+ WHERE serial_id = ?
470
+ )
471
+ `,
472
+ [serialId, serialId]
473
+ );
474
+ await this.#database.run(
475
+ `
476
+ DELETE FROM chunk_sentences
477
+ WHERE serial_id = ?
478
+ `,
479
+ [serialId]
480
+ );
481
+ await this.#database.run(
482
+ `
483
+ DELETE FROM chunks
484
+ WHERE serial_id = ?
485
+ `,
486
+ [serialId]
487
+ );
488
+ await this.metadata.deleteDeletedChunks();
489
+ await this.metadata.deleteDeletedEntitiesAndTriples();
490
+ });
491
+ }
492
+ async #readJsonFile(path, parse) {
493
+ const content = await this.#readOptionalTextFile(path);
494
+ if (content === void 0) {
495
+ return void 0;
496
+ }
497
+ return parse(JSON.parse(content));
498
+ }
499
+ async #readOptionalFile(path) {
500
+ return await this.#fileStore.readFile(path);
501
+ }
502
+ async #replaceDocumentOrder(toc) {
503
+ await this.serials.setDocumentOrders(
504
+ listTocSerialIds(toc.items).map((serialId, index) => ({
505
+ documentOrder: index,
506
+ serialId
507
+ }))
508
+ );
509
+ }
510
+ async #readOptionalTextFile(path) {
511
+ const content = await this.#fileStore.readFile(path);
512
+ return content === void 0 ? void 0 : Buffer.from(content).toString("utf8");
513
+ }
514
+ async #writeJsonFile(path, value, options = {}) {
515
+ await this.#writeFile(path, `${JSON.stringify(value, null, 2)}
516
+ `, options);
517
+ }
518
+ async #writeNewFile(path, content) {
519
+ await this.#writeFile(path, content, { overwrite: false });
520
+ }
521
+ async #writeFile(path, content, options) {
522
+ try {
523
+ await this.#fileStore.writeFile(path, content, options);
524
+ } catch (error) {
525
+ if (isNodeError(error) && error.code === "EEXIST") {
526
+ throw new Error(`File already exists: ${path}`);
527
+ }
528
+ throw error;
529
+ }
530
+ if (options.overwrite !== true) {
531
+ this.#contextScope.getStore()?.registerCreatedFile(path);
532
+ }
533
+ }
534
+ #getCoverDataPath() {
535
+ return join(this.#getCoverDirectoryPath(), "data.bin");
536
+ }
537
+ #getCoverDirectoryPath() {
538
+ return join(this.path, "cover");
539
+ }
540
+ #getCoverInfoPath() {
541
+ return join(this.#getCoverDirectoryPath(), "info.json");
542
+ }
543
+ #getTocPath() {
544
+ return join(this.path, "toc.json");
545
+ }
546
+ async runWithContext(context, operation) {
547
+ return await this.#contextScope.run(context, operation);
548
+ }
549
+ async rollbackContext(context) {
550
+ await this.#rollbackContext(context);
551
+ }
552
+ }
553
+ function listTocSerialIds(items) {
554
+ const serialIds = [];
555
+ for (const item of items) {
556
+ if (item.serialId !== void 0) {
557
+ serialIds.push(item.serialId);
558
+ }
559
+ serialIds.push(...listTocSerialIds(item.children));
560
+ }
561
+ return serialIds;
562
+ }
563
+ class DirectoryDocumentContext {
564
+ #createdFilePaths = [];
565
+ #document;
566
+ #ownedSerialIds = /* @__PURE__ */ new Set();
567
+ #completed = false;
568
+ #disposed = false;
569
+ constructor(document) {
570
+ this.#document = document;
571
+ }
572
+ complete() {
573
+ this.#assertActive();
574
+ this.#completed = true;
575
+ }
576
+ async dispose() {
577
+ if (this.#disposed) {
578
+ return;
579
+ }
580
+ this.#disposed = true;
581
+ if (this.#completed) {
582
+ return;
583
+ }
584
+ await this.#document.rollbackContext(this);
585
+ }
586
+ ownSerial(serialId) {
587
+ this.#assertActive();
588
+ this.#ownedSerialIds.add(serialId);
589
+ }
590
+ async run(operation) {
591
+ this.#assertActive();
592
+ return await this.#document.runWithContext(this, operation);
593
+ }
594
+ listCreatedFilePaths() {
595
+ return [...this.#createdFilePaths];
596
+ }
597
+ listOwnedSerialIds() {
598
+ return [...this.#ownedSerialIds];
599
+ }
600
+ registerCreatedFile(path) {
601
+ this.#createdFilePaths.push(path);
602
+ }
603
+ #assertActive() {
604
+ if (this.#disposed) {
605
+ throw new Error("DocumentContext is already disposed");
606
+ }
607
+ }
608
+ }
609
+ function compareNumberDescending(left, right) {
610
+ return right - left;
611
+ }
612
+ export {
613
+ DirectoryDocument
614
+ };
615
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/document/document.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"async_hooks\";\nimport { mkdir, readFile, readdir, rm, unlink, writeFile } from \"fs/promises\";\nimport { join, resolve } from \"path\";\nimport { z } from \"zod\";\n\nimport { bookMetaSchema, type BookMeta } from \"../source/meta.js\";\nimport { tocFileSchema, type TocFile, type TocItem } from \"../source/toc.js\";\nimport type { SourceAsset } from \"../source/types.js\";\nimport { isNodeError } from \"../utils/node-error.js\";\nimport { Database } from \"./database.js\";\nimport type { Database as DocumentDatabase } from \"./database.js\";\nimport {\n TextStreams,\n type ReadonlySerialTextStream,\n type SerialTextStream,\n} from \"./text-streams.js\";\nimport {\n initializeDocumentSchema,\n SCHEMA_SQL,\n SEARCH_INDEX_SCHEMA_SQL,\n} from \"./schema.js\";\nimport {\n ChunkStore,\n FragmentGroupStore,\n GraphBuildParameterStore,\n ReadingEdgeStore,\n MentionLinkStore,\n MentionStore,\n ObjectMetadataStore,\n type ReadonlyChunkStore,\n type ReadonlyFragmentGroupStore,\n type ReadonlyGraphBuildParameterStore,\n type ReadonlyReadingEdgeStore,\n type ReadonlyMentionLinkStore,\n type ReadonlyMentionStore,\n type ReadonlyObjectMetadataStore,\n type ReadonlySerialStore,\n type ReadonlySnakeChunkStore,\n type ReadonlySnakeEdgeStore,\n type ReadonlySnakeStore,\n SerialStore,\n SnakeChunkStore,\n SnakeEdgeStore,\n SnakeStore,\n} from \"./stores.js\";\nimport { ObjectMetadataKind, type SentenceId } from \"./types.js\";\n\nexport interface DocumentFileStore {\n close(): Promise<void>;\n deleteFile(path: string): Promise<void>;\n deleteTree(path: string): Promise<void>;\n ensureDirectory(path: string): Promise<void>;\n initializeDatabaseSchema(): boolean;\n markDatabaseDirty?(): void;\n markSearchIndexDatabaseDirty?(): void;\n openDatabaseReadonly(): boolean;\n listFileContents?(path: string): Promise<ReadonlyMap<string, Uint8Array>>;\n listFiles(path: string): Promise<readonly string[]>;\n readFile(path: string): Promise<Uint8Array | undefined>;\n resolveDatabasePath(documentPath: string): Promise<string>;\n resolveSearchIndexDatabasePath?(documentPath: string): Promise<string>;\n writeFile(\n path: string,\n content: string | Uint8Array,\n options: { readonly overwrite?: boolean },\n ): Promise<void>;\n}\n\nconst LOCAL_DOCUMENT_FILE_STORE: DocumentFileStore = {\n close: () => Promise.resolve(),\n deleteFile: async (path) => {\n await unlink(path);\n },\n deleteTree: async (path) => {\n await rm(path, { force: true, recursive: true });\n },\n ensureDirectory: async (path) => {\n await mkdir(path, { recursive: true });\n },\n initializeDatabaseSchema: () => true,\n markDatabaseDirty: () => undefined,\n markSearchIndexDatabaseDirty: () => undefined,\n openDatabaseReadonly: () => false,\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 resolveDatabasePath: (documentPath) =>\n Promise.resolve(join(documentPath, \"database.db\")),\n resolveSearchIndexDatabasePath: (documentPath) =>\n Promise.resolve(join(documentPath, \"fts.db\")),\n writeFile: async (path, content, options) => {\n if (typeof content === \"string\") {\n await writeFile(path, content, {\n encoding: \"utf8\",\n flag: options.overwrite === true ? \"w\" : \"wx\",\n });\n } else {\n await writeFile(path, content, {\n flag: options.overwrite === true ? \"w\" : \"wx\",\n });\n }\n },\n};\n\nconst coverFileSchema = z.object({\n mediaType: z.string().min(1),\n path: z.string(),\n});\n\nexport interface ReadonlyDocument {\n readonly chunks: ReadonlyChunkStore;\n readonly fragmentGroups: ReadonlyFragmentGroupStore;\n readonly graphBuildParameters: ReadonlyGraphBuildParameterStore;\n readonly readingEdges: ReadonlyReadingEdgeStore;\n readonly mentionLinks: ReadonlyMentionLinkStore;\n readonly mentions: ReadonlyMentionStore;\n readonly metadata: ReadonlyObjectMetadataStore;\n readonly serials: ReadonlySerialStore;\n readonly snakeChunks: ReadonlySnakeChunkStore;\n readonly snakeEdges: ReadonlySnakeEdgeStore;\n readonly snakes: ReadonlySnakeStore;\n\n getSentence(sentenceId: SentenceId): Promise<string>;\n getSerialFragments(serialId: number): ReadonlySerialTextStream;\n getSummaryFragments(serialId: number): ReadonlySerialTextStream;\n openSession<T>(\n operation: (document: ReadonlyDocument) => Promise<T> | T,\n ): Promise<T>;\n readDatabase<T>(\n operation: (database: DocumentDatabase) => Promise<T> | T,\n ): Promise<T>;\n readSearchIndexDatabase<T>(\n operation: (database: DocumentDatabase) => Promise<T> | T,\n ): Promise<T>;\n readBookMeta(): Promise<BookMeta | undefined>;\n readCover(): Promise<SourceAsset | undefined>;\n readSummary(serialId: number): Promise<string | undefined>;\n readToc(): Promise<TocFile | undefined>;\n release(): Promise<void>;\n}\n\nexport interface DocumentContext {\n complete(): void;\n dispose(): Promise<void>;\n ownSerial(serialId: number): void;\n run<T>(operation: () => Promise<T> | T): Promise<T>;\n}\n\nexport interface Document extends ReadonlyDocument {\n readonly chunks: ChunkStore;\n readonly fragmentGroups: FragmentGroupStore;\n readonly graphBuildParameters: GraphBuildParameterStore;\n readonly readingEdges: ReadingEdgeStore;\n readonly mentionLinks: MentionLinkStore;\n readonly mentions: MentionStore;\n readonly metadata: ObjectMetadataStore;\n readonly serials: SerialStore;\n readonly snakeChunks: SnakeChunkStore;\n readonly snakeEdges: SnakeEdgeStore;\n readonly snakes: SnakeStore;\n\n createContext(): DocumentContext;\n getSerialFragments(serialId: number): SerialTextStream;\n getSummaryFragments(serialId: number): SerialTextStream;\n createSerial(): Promise<number>;\n clearSerialGraph(serialId: number): Promise<void>;\n clearSerialSource(serialId: number): Promise<void>;\n deleteSerial(serialId: number): Promise<void>;\n deleteSearchIndexDatabase(): Promise<void>;\n deleteSummary(serialId: number): Promise<void>;\n flush(): Promise<void>;\n openSession<T>(operation: (document: Document) => Promise<T> | T): Promise<T>;\n peekNextSerialId(): Promise<number>;\n replaceBookMeta(meta: BookMeta): Promise<void>;\n replaceToc(toc: TocFile): Promise<void>;\n writeBookMeta(meta: BookMeta): Promise<void>;\n writeCover(cover: SourceAsset): Promise<void>;\n writeSummary(serialId: number, summary: string): Promise<void>;\n writeToc(toc: TocFile): Promise<void>;\n writeSearchIndexDatabase<T>(\n operation: (database: DocumentDatabase) => Promise<T> | T,\n ): Promise<T>;\n}\n\nexport class DirectoryDocument implements Document {\n public readonly chunks: ChunkStore;\n public readonly fragmentGroups: FragmentGroupStore;\n public readonly graphBuildParameters: GraphBuildParameterStore;\n public readonly readingEdges: ReadingEdgeStore;\n public readonly mentionLinks: MentionLinkStore;\n public readonly mentions: MentionStore;\n public readonly metadata: ObjectMetadataStore;\n public readonly path: string;\n public readonly serials: SerialStore;\n public readonly snakeChunks: SnakeChunkStore;\n public readonly snakeEdges: SnakeEdgeStore;\n public readonly snakes: SnakeStore;\n\n readonly #database: Database;\n readonly #fileStore: DocumentFileStore;\n readonly #textStreams: TextStreams;\n readonly #contextScope = new AsyncLocalStorage<DirectoryDocumentContext>();\n\n public constructor(\n database: Database,\n textStreams: TextStreams,\n path: string,\n fileStore: DocumentFileStore = LOCAL_DOCUMENT_FILE_STORE,\n ) {\n this.#database = database;\n this.#fileStore = fileStore;\n this.#textStreams = textStreams;\n this.chunks = new ChunkStore(database);\n this.fragmentGroups = new FragmentGroupStore(database);\n this.graphBuildParameters = new GraphBuildParameterStore(database);\n this.readingEdges = new ReadingEdgeStore(database);\n this.mentionLinks = new MentionLinkStore(database);\n this.mentions = new MentionStore(database);\n this.metadata = new ObjectMetadataStore(database);\n this.path = path;\n this.serials = new SerialStore(database);\n this.snakeChunks = new SnakeChunkStore(database);\n this.snakeEdges = new SnakeEdgeStore(database);\n this.snakes = new SnakeStore(database);\n }\n\n public static async open(\n documentPath: string,\n options: { readonly fileStore?: DocumentFileStore } = {},\n ): Promise<DirectoryDocument> {\n const resolvedDocumentPath = resolve(documentPath);\n const fileStore = options.fileStore ?? LOCAL_DOCUMENT_FILE_STORE;\n try {\n const databasePath =\n await fileStore.resolveDatabasePath(resolvedDocumentPath);\n await fileStore.ensureDirectory(resolvedDocumentPath);\n\n const shouldInitializeDatabaseSchema =\n fileStore.initializeDatabaseSchema();\n const database = await Database.open(\n databasePath,\n shouldInitializeDatabaseSchema ? SCHEMA_SQL : \"\",\n {\n onWrite: () => {\n fileStore.markDatabaseDirty?.();\n },\n readonly: fileStore.openDatabaseReadonly(),\n },\n );\n if (shouldInitializeDatabaseSchema) {\n await initializeDocumentSchema(database);\n }\n const textStreams = new TextStreams(resolvedDocumentPath, database, {\n deleteTree: async (path) => {\n await fileStore.deleteTree(path);\n },\n ensureDirectory: async (path) => {\n await fileStore.ensureDirectory(path);\n },\n listFiles: async (path) => await fileStore.listFiles(path),\n readFile: async (path) => await fileStore.readFile(path),\n writeFile: async (path, content, options) => {\n await fileStore.writeFile(path, content, options);\n },\n });\n await textStreams.ensureCreated();\n\n const document = new DirectoryDocument(\n database,\n textStreams,\n resolvedDocumentPath,\n fileStore,\n );\n\n return document;\n } catch (error) {\n await fileStore.close();\n throw error;\n }\n }\n\n public static async openSession<T>(\n documentPath: string,\n operation: (document: DirectoryDocument) => Promise<T> | T,\n ): Promise<T> {\n const document = await DirectoryDocument.open(documentPath);\n\n try {\n return await document.openSession(async () => await operation(document));\n } finally {\n await document.release();\n }\n }\n\n public getSerialFragments(serialId: number): SerialTextStream {\n return this.#textStreams.getSerial(serialId);\n }\n\n public getSummaryFragments(serialId: number): SerialTextStream {\n return this.#textStreams.getSummarySerial(serialId);\n }\n\n public createContext(): DocumentContext {\n return new DirectoryDocumentContext(this);\n }\n\n public async createSerial(): Promise<number> {\n const serialId = await this.serials.create();\n\n this.#contextScope.getStore()?.ownSerial(serialId);\n return serialId;\n }\n\n public async clearSerialGraph(serialId: number): Promise<void> {\n await this.deleteSummary(serialId);\n await this.#deleteSerialGraphRecords(serialId);\n await this.serials.setTopologyReady(serialId, false);\n await this.serials.setKnowledgeGraphReady(serialId, false);\n await this.serials.bumpRevision(serialId);\n await this.graphBuildParameters.deleteUnreferenced();\n }\n\n public async clearSerialSource(serialId: number): Promise<void> {\n await this.clearSerialGraph(serialId);\n await this.#textStreams.getSerial(serialId).delete();\n await this.serials.bumpRevision(serialId);\n }\n\n public async deleteSerial(serialId: number): Promise<void> {\n await this.#deleteSerialResources(serialId);\n }\n\n public async deleteSummary(serialId: number): Promise<void> {\n await this.#textStreams.getSummarySerial(serialId).delete();\n }\n\n public async getSentence(sentenceId: SentenceId): Promise<string> {\n return await this.#textStreams.getSentence(sentenceId);\n }\n\n public async openSession<T>(\n operation: (document: Document) => Promise<T> | T,\n ): Promise<T> {\n const activeContext = this.#contextScope.getStore();\n\n if (activeContext !== undefined) {\n return await operation(this);\n }\n\n const context = new DirectoryDocumentContext(this);\n\n try {\n const result = await this.#database.transaction(\n async () => await context.run(async () => await operation(this)),\n );\n\n context.complete();\n return result;\n } finally {\n await context.dispose();\n }\n }\n\n public async readDatabase<T>(\n operation: (database: Database) => Promise<T> | T,\n ): Promise<T> {\n return await operation(this.#database);\n }\n\n public async readSearchIndexDatabase<T>(\n operation: (database: Database) => Promise<T> | T,\n ): Promise<T> {\n return await this.#openSearchIndexDatabase(true, operation);\n }\n\n public async writeSearchIndexDatabase<T>(\n operation: (database: Database) => Promise<T> | T,\n ): Promise<T> {\n return await this.#openSearchIndexDatabase(false, operation);\n }\n\n public async deleteSearchIndexDatabase(): Promise<void> {\n await this.#fileStore.deleteFile(join(this.path, \"fts.db\"));\n }\n\n public async peekNextSerialId(): Promise<number> {\n return (await this.serials.getMaxId()) + 1;\n }\n\n public async readBookMeta(): Promise<BookMeta | undefined> {\n const map = await this.metadata.getMap(\"\");\n\n return Object.keys(map).length === 0\n ? undefined\n : bookMetaSchema.parse(map);\n }\n\n public async readCover(): Promise<SourceAsset | undefined> {\n const coverFile = await this.#readJsonFile(\n this.#getCoverInfoPath(),\n (value) => coverFileSchema.parse(value),\n );\n\n if (coverFile === undefined) {\n return undefined;\n }\n\n const data = await this.#readOptionalFile(this.#getCoverDataPath());\n\n if (data === undefined) {\n throw new Error(\"Cover data is missing\");\n }\n\n return {\n data,\n mediaType: coverFile.mediaType,\n path: coverFile.path,\n };\n }\n\n public async readSummary(serialId: number): Promise<string | undefined> {\n return await this.#textStreams.getSummarySerial(serialId).readText();\n }\n\n public async readToc(): Promise<TocFile | undefined> {\n return await this.#readJsonFile(this.#getTocPath(), (value) =>\n tocFileSchema.parse(value),\n );\n }\n\n public async writeBookMeta(meta: BookMeta): Promise<void> {\n if (Object.keys(await this.metadata.getMap(\"\")).length > 0) {\n throw new Error(\"Archive metadata already exists.\");\n }\n\n await this.replaceBookMeta(meta);\n }\n\n public async replaceBookMeta(meta: BookMeta): Promise<void> {\n await this.metadata.replaceMap(\n {\n kind: ObjectMetadataKind.Archive,\n objectPath: \"\",\n },\n {\n ...meta,\n },\n );\n }\n\n public async writeCover(cover: SourceAsset): Promise<void> {\n await this.#fileStore.ensureDirectory(this.#getCoverDirectoryPath());\n await this.#writeJsonFile(this.#getCoverInfoPath(), {\n mediaType: cover.mediaType,\n path: cover.path,\n });\n await this.#writeNewFile(this.#getCoverDataPath(), cover.data);\n }\n\n public async writeSummary(serialId: number, summary: string): Promise<void> {\n await this.deleteSummary(serialId);\n await this.#textStreams.getSummarySerial(serialId).writeTextStream(summary);\n await this.serials.bumpRevision(serialId);\n }\n\n public async writeToc(toc: TocFile): Promise<void> {\n await this.#writeJsonFile(this.#getTocPath(), toc);\n await this.#replaceDocumentOrder(toc);\n await this.serials.bumpChaptersRevision();\n }\n\n public async replaceToc(toc: TocFile): Promise<void> {\n await this.#writeJsonFile(this.#getTocPath(), toc, { overwrite: true });\n await this.#replaceDocumentOrder(toc);\n await this.serials.bumpChaptersRevision();\n }\n\n public async flush(): Promise<void> {\n await this.#database.flush();\n }\n\n public async release(): Promise<void> {\n try {\n await this.flush();\n await this.#database.close();\n } finally {\n await this.#fileStore.close();\n }\n }\n\n public async close(): Promise<void> {\n await this.release();\n }\n\n async #openSearchIndexDatabase<T>(\n readonly: boolean,\n operation: (database: Database) => Promise<T> | T,\n ): Promise<T> {\n const databasePath =\n this.#fileStore.resolveSearchIndexDatabasePath === undefined\n ? join(this.path, \"fts.db\")\n : await this.#fileStore.resolveSearchIndexDatabasePath(this.path);\n const database = await Database.open(\n databasePath,\n readonly ? \"\" : SEARCH_INDEX_SCHEMA_SQL,\n {\n onWrite: () => {\n this.#fileStore.markSearchIndexDatabaseDirty?.();\n },\n readonly,\n },\n );\n\n try {\n return await operation(database);\n } finally {\n await database.close();\n }\n }\n\n async #rollbackContext(context: DirectoryDocumentContext): Promise<void> {\n await this.#rollbackOwnedSerials(context.listOwnedSerialIds());\n await this.#rollbackCreatedFiles(context.listCreatedFilePaths());\n }\n\n async #rollbackCreatedFiles(\n createdFilePaths: readonly string[],\n ): Promise<void> {\n for (const path of [...createdFilePaths].reverse()) {\n try {\n await this.#fileStore.deleteFile(path);\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n continue;\n }\n\n throw error;\n }\n }\n }\n\n async #rollbackOwnedSerials(serialIds: readonly number[]): Promise<void> {\n for (const serialId of [...serialIds].sort(compareNumberDescending)) {\n await this.#deleteSerialResources(serialId);\n }\n }\n\n async #deleteSerialResources(serialId: number): Promise<void> {\n await this.metadata.deleteChapterSubtree(serialId);\n await this.#deleteSerialGraphRecords(serialId);\n await this.#database.transaction(async () => {\n await this.#database.run(\n `\n DELETE FROM serial_states\n WHERE serial_id = ?\n `,\n [serialId],\n );\n await this.#database.run(\n `\n DELETE FROM serials\n WHERE id = ?\n `,\n [serialId],\n );\n });\n\n await this.#textStreams.getSerial(serialId).delete();\n await this.deleteSummary(serialId);\n await this.serials.bumpChaptersRevision();\n await this.graphBuildParameters.deleteUnreferenced();\n }\n\n async #deleteSerialGraphRecords(serialId: 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 [serialId, serialId],\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 ) OR target_mention_id IN (\n SELECT id\n FROM mentions\n WHERE chapter_id = ?\n )\n `,\n [serialId, serialId],\n );\n await this.#database.run(\n `\n DELETE FROM mentions\n WHERE chapter_id = ?\n `,\n [serialId],\n );\n await this.#database.run(\n `\n DELETE FROM snake_edges\n WHERE from_snake_id IN (\n SELECT id\n FROM snakes\n WHERE serial_id = ?\n ) OR to_snake_id IN (\n SELECT id\n FROM snakes\n WHERE serial_id = ?\n )\n `,\n [serialId, serialId],\n );\n await this.#database.run(\n `\n DELETE FROM snake_chunks\n WHERE snake_id IN (\n SELECT id\n FROM snakes\n WHERE serial_id = ?\n )\n `,\n [serialId],\n );\n await this.#database.run(\n `\n DELETE FROM snakes\n WHERE serial_id = ?\n `,\n [serialId],\n );\n await this.#database.run(\n `\n DELETE FROM sentence_groups\n WHERE serial_id = ?\n `,\n [serialId],\n );\n await this.#database.run(\n `\n DELETE FROM reading_edges\n WHERE from_id IN (\n SELECT id\n FROM chunks\n WHERE serial_id = ?\n ) OR to_id IN (\n SELECT id\n FROM chunks\n WHERE serial_id = ?\n )\n `,\n [serialId, serialId],\n );\n await this.#database.run(\n `\n DELETE FROM chunk_sentences\n WHERE serial_id = ?\n `,\n [serialId],\n );\n await this.#database.run(\n `\n DELETE FROM chunks\n WHERE serial_id = ?\n `,\n [serialId],\n );\n await this.metadata.deleteDeletedChunks();\n await this.metadata.deleteDeletedEntitiesAndTriples();\n });\n }\n\n async #readJsonFile<T>(\n path: string,\n parse: (value: unknown) => T,\n ): Promise<T | undefined> {\n const content = await this.#readOptionalTextFile(path);\n\n if (content === undefined) {\n return undefined;\n }\n\n return parse(JSON.parse(content));\n }\n\n async #readOptionalFile(path: string): Promise<Uint8Array | undefined> {\n return await this.#fileStore.readFile(path);\n }\n\n async #replaceDocumentOrder(toc: TocFile): Promise<void> {\n await this.serials.setDocumentOrders(\n listTocSerialIds(toc.items).map((serialId, index) => ({\n documentOrder: index,\n serialId,\n })),\n );\n }\n\n async #readOptionalTextFile(path: string): Promise<string | undefined> {\n const content = await this.#fileStore.readFile(path);\n\n return content === undefined\n ? undefined\n : Buffer.from(content).toString(\"utf8\");\n }\n\n async #writeJsonFile(\n path: string,\n value: unknown,\n options: { readonly overwrite?: boolean } = {},\n ): Promise<void> {\n await this.#writeFile(path, `${JSON.stringify(value, null, 2)}\\n`, options);\n }\n\n async #writeNewFile(\n path: string,\n content: string | Uint8Array,\n ): Promise<void> {\n await this.#writeFile(path, content, { overwrite: false });\n }\n\n async #writeFile(\n path: string,\n content: string | Uint8Array,\n options: { readonly overwrite?: boolean },\n ): Promise<void> {\n try {\n await this.#fileStore.writeFile(path, content, options);\n } catch (error) {\n if (isNodeError(error) && error.code === \"EEXIST\") {\n throw new Error(`File already exists: ${path}`);\n }\n\n throw error;\n }\n\n if (options.overwrite !== true) {\n this.#contextScope.getStore()?.registerCreatedFile(path);\n }\n }\n\n #getCoverDataPath(): string {\n return join(this.#getCoverDirectoryPath(), \"data.bin\");\n }\n\n #getCoverDirectoryPath(): string {\n return join(this.path, \"cover\");\n }\n\n #getCoverInfoPath(): string {\n return join(this.#getCoverDirectoryPath(), \"info.json\");\n }\n\n #getTocPath(): string {\n return join(this.path, \"toc.json\");\n }\n\n public async runWithContext<T>(\n context: DirectoryDocumentContext,\n operation: () => Promise<T> | T,\n ): Promise<T> {\n return await this.#contextScope.run(context, operation);\n }\n\n public async rollbackContext(\n context: DirectoryDocumentContext,\n ): Promise<void> {\n await this.#rollbackContext(context);\n }\n}\n\nfunction listTocSerialIds(items: readonly TocItem[]): number[] {\n const serialIds: number[] = [];\n\n for (const item of items) {\n if (item.serialId !== undefined) {\n serialIds.push(item.serialId);\n }\n\n serialIds.push(...listTocSerialIds(item.children));\n }\n\n return serialIds;\n}\n\nclass DirectoryDocumentContext implements DocumentContext {\n readonly #createdFilePaths: string[] = [];\n readonly #document: DirectoryDocument;\n readonly #ownedSerialIds = new Set<number>();\n #completed = false;\n #disposed = false;\n\n public constructor(document: DirectoryDocument) {\n this.#document = document;\n }\n\n public complete(): void {\n this.#assertActive();\n this.#completed = true;\n }\n\n public async dispose(): Promise<void> {\n if (this.#disposed) {\n return;\n }\n\n this.#disposed = true;\n\n if (this.#completed) {\n return;\n }\n\n await this.#document.rollbackContext(this);\n }\n\n public ownSerial(serialId: number): void {\n this.#assertActive();\n this.#ownedSerialIds.add(serialId);\n }\n\n public async run<T>(operation: () => Promise<T> | T): Promise<T> {\n this.#assertActive();\n return await this.#document.runWithContext(this, operation);\n }\n\n public listCreatedFilePaths(): readonly string[] {\n return [...this.#createdFilePaths];\n }\n\n public listOwnedSerialIds(): readonly number[] {\n return [...this.#ownedSerialIds];\n }\n\n public registerCreatedFile(path: string): void {\n this.#createdFilePaths.push(path);\n }\n\n #assertActive(): void {\n if (this.#disposed) {\n throw new Error(\"DocumentContext is already disposed\");\n }\n }\n}\n\nfunction compareNumberDescending(left: number, right: number): number {\n return right - left;\n}\n"],"mappings":"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","names":["options"]}