wiki-graph-core 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) hide show
  1. package/LICENSE +201 -0
  2. package/data/editor/clue_reviewer.jinja +410 -0
  3. package/data/editor/clue_reviewer_generator.jinja +428 -0
  4. package/data/editor/revision_feedback.jinja +5 -0
  5. package/data/editor/text_compressor.jinja +127 -0
  6. package/data/guaranteed/response_intent_classifier.jinja +8 -0
  7. package/data/help/commands/archive/next.jinja +29 -0
  8. package/data/help/commands/gc.jinja +38 -0
  9. package/data/help/commands/legacy/migrate.jinja +20 -0
  10. package/data/help/commands/legacy.jinja +19 -0
  11. package/data/help/commands/maintenance/chapter/add.jinja +41 -0
  12. package/data/help/commands/maintenance/chapter/list.jinja +33 -0
  13. package/data/help/commands/maintenance/chapter/move.jinja +36 -0
  14. package/data/help/commands/maintenance/chapter/remove.jinja +26 -0
  15. package/data/help/commands/maintenance/chapter/reset.jinja +29 -0
  16. package/data/help/commands/maintenance/chapter/set-source.jinja +34 -0
  17. package/data/help/commands/maintenance/chapter/set-summary.jinja +31 -0
  18. package/data/help/commands/maintenance/chapter/set-title.jinja +29 -0
  19. package/data/help/commands/maintenance/chapter/tree.jinja +58 -0
  20. package/data/help/commands/maintenance/chapter.jinja +59 -0
  21. package/data/help/commands/maintenance/cover.jinja +28 -0
  22. package/data/help/commands/maintenance/meta.jinja +55 -0
  23. package/data/help/commands/predicate.jinja +460 -0
  24. package/data/help/commands/root.jinja +83 -0
  25. package/data/help/commands/transform.jinja +34 -0
  26. package/data/help/commands/uri.jinja +274 -0
  27. package/data/help/topics/config.jinja +88 -0
  28. package/data/help/topics/format.jinja +72 -0
  29. package/data/help/topics/readiness.jinja +99 -0
  30. package/data/help/topics/recipe.jinja +151 -0
  31. package/data/help/topics/runtime.jinja +62 -0
  32. package/data/help/topics/uri.jinja +178 -0
  33. package/data/output/epub/cover.xhtml.jinja +13 -0
  34. package/data/output/epub/nav.xhtml.jinja +12 -0
  35. package/data/output/epub/package.opf.xml.jinja +39 -0
  36. package/data/output/epub/section.xhtml.jinja +12 -0
  37. package/data/topologization/book_coherence_extraction.jinja +223 -0
  38. package/data/topologization/chunk_extraction.jinja +233 -0
  39. package/data/topologization/evidence_choice.jinja +38 -0
  40. package/data/topologization/translate_chunks.jinja +138 -0
  41. package/data/topologization/user_focused_extraction.jinja +378 -0
  42. package/dist/archive/query/archive-view.d.ts +26 -0
  43. package/dist/archive/query/archive-view.js +4540 -0
  44. package/dist/archive/query/archive-view.js.map +1 -0
  45. package/dist/archive/query/continuation-cursor.d.ts +61 -0
  46. package/dist/archive/query/continuation-cursor.js +363 -0
  47. package/dist/archive/query/continuation-cursor.js.map +1 -0
  48. package/dist/archive/query/index.d.ts +29 -0
  49. package/dist/archive/query/index.js +63 -0
  50. package/dist/archive/query/index.js.map +1 -0
  51. package/dist/archive/query/lexical-search.d.ts +22 -0
  52. package/dist/archive/query/lexical-search.js +137 -0
  53. package/dist/archive/query/lexical-search.js.map +1 -0
  54. package/dist/archive/query/search-cache.d.ts +192 -0
  55. package/dist/archive/query/search-cache.js +1248 -0
  56. package/dist/archive/query/search-cache.js.map +1 -0
  57. package/dist/archive/search-index/index.d.ts +26 -0
  58. package/dist/archive/search-index/index.js +29 -0
  59. package/dist/archive/search-index/index.js.map +1 -0
  60. package/dist/archive/search-index/search-index.d.ts +26 -0
  61. package/dist/archive/search-index/search-index.js +555 -0
  62. package/dist/archive/search-index/search-index.js.map +1 -0
  63. package/dist/archive/search-index/search-tokenizer.d.ts +16 -0
  64. package/dist/archive/search-index/search-tokenizer.js +225 -0
  65. package/dist/archive/search-index/search-tokenizer.js.map +1 -0
  66. package/dist/common/cli-command.d.ts +4 -0
  67. package/dist/common/cli-command.js +7 -0
  68. package/dist/common/cli-command.js.map +1 -0
  69. package/dist/common/data-dir.d.ts +3 -0
  70. package/dist/common/data-dir.js +48 -0
  71. package/dist/common/data-dir.js.map +1 -0
  72. package/dist/common/language.d.ts +55 -0
  73. package/dist/common/language.js +208 -0
  74. package/dist/common/language.js.map +1 -0
  75. package/dist/common/llm-scope.d.ts +19 -0
  76. package/dist/common/llm-scope.js +31 -0
  77. package/dist/common/llm-scope.js.map +1 -0
  78. package/dist/common/logging.d.ts +22 -0
  79. package/dist/common/logging.js +141 -0
  80. package/dist/common/logging.js.map +1 -0
  81. package/dist/common/template.d.ts +8 -0
  82. package/dist/common/template.js +54 -0
  83. package/dist/common/template.js.map +1 -0
  84. package/dist/common/tinyld-language.d.ts +6 -0
  85. package/dist/common/tinyld-language.js +34 -0
  86. package/dist/common/tinyld-language.js.map +1 -0
  87. package/dist/common/wiki-graph-dir.d.ts +10 -0
  88. package/dist/common/wiki-graph-dir.js +41 -0
  89. package/dist/common/wiki-graph-dir.js.map +1 -0
  90. package/dist/common/wiki-graph-temp.d.ts +6 -0
  91. package/dist/common/wiki-graph-temp.js +21 -0
  92. package/dist/common/wiki-graph-temp.js.map +1 -0
  93. package/dist/common/wiki-graph-uri.d.ts +28 -0
  94. package/dist/common/wiki-graph-uri.js +171 -0
  95. package/dist/common/wiki-graph-uri.js.map +1 -0
  96. package/dist/context/index.d.ts +1 -0
  97. package/dist/context/index.js +13 -0
  98. package/dist/context/index.js.map +1 -0
  99. package/dist/context/task-context.d.ts +41 -0
  100. package/dist/context/task-context.js +111 -0
  101. package/dist/context/task-context.js.map +1 -0
  102. package/dist/document/database.d.ts +30 -0
  103. package/dist/document/database.js +273 -0
  104. package/dist/document/database.js.map +1 -0
  105. package/dist/document/document.d.ts +153 -0
  106. package/dist/document/document.js +615 -0
  107. package/dist/document/document.js.map +1 -0
  108. package/dist/document/fragments.d.ts +63 -0
  109. package/dist/document/fragments.js +371 -0
  110. package/dist/document/fragments.js.map +1 -0
  111. package/dist/document/index.d.ts +13 -0
  112. package/dist/document/index.js +62 -0
  113. package/dist/document/index.js.map +1 -0
  114. package/dist/document/schema.d.ts +8 -0
  115. package/dist/document/schema.js +472 -0
  116. package/dist/document/schema.js.map +1 -0
  117. package/dist/document/shared-state-database.d.ts +9 -0
  118. package/dist/document/shared-state-database.js +193 -0
  119. package/dist/document/shared-state-database.js.map +1 -0
  120. package/dist/document/stores.d.ts +203 -0
  121. package/dist/document/stores.js +1678 -0
  122. package/dist/document/stores.js.map +1 -0
  123. package/dist/document/text-streams.d.ts +86 -0
  124. package/dist/document/text-streams.js +515 -0
  125. package/dist/document/text-streams.js.map +1 -0
  126. package/dist/document/types.d.ts +148 -0
  127. package/dist/document/types.js +69 -0
  128. package/dist/document/types.js.map +1 -0
  129. package/dist/editor/clue.d.ts +27 -0
  130. package/dist/editor/clue.js +158 -0
  131. package/dist/editor/clue.js.map +1 -0
  132. package/dist/editor/compressor.d.ts +18 -0
  133. package/dist/editor/compressor.js +68 -0
  134. package/dist/editor/compressor.js.map +1 -0
  135. package/dist/editor/editor.d.ts +39 -0
  136. package/dist/editor/editor.js +253 -0
  137. package/dist/editor/editor.js.map +1 -0
  138. package/dist/editor/feedback.d.ts +16 -0
  139. package/dist/editor/feedback.js +104 -0
  140. package/dist/editor/feedback.js.map +1 -0
  141. package/dist/editor/index.d.ts +17 -0
  142. package/dist/editor/index.js +5 -0
  143. package/dist/editor/index.js.map +1 -0
  144. package/dist/editor/language-review.d.ts +14 -0
  145. package/dist/editor/language-review.js +35 -0
  146. package/dist/editor/language-review.js.map +1 -0
  147. package/dist/editor/log.d.ts +37 -0
  148. package/dist/editor/log.js +202 -0
  149. package/dist/editor/log.js.map +1 -0
  150. package/dist/editor/markup.d.ts +20 -0
  151. package/dist/editor/markup.js +294 -0
  152. package/dist/editor/markup.js.map +1 -0
  153. package/dist/editor/prompt-templates.d.ts +6 -0
  154. package/dist/editor/prompt-templates.js +11 -0
  155. package/dist/editor/prompt-templates.js.map +1 -0
  156. package/dist/editor/response.d.ts +5 -0
  157. package/dist/editor/response.js +31 -0
  158. package/dist/editor/response.js.map +1 -0
  159. package/dist/editor/review.d.ts +34 -0
  160. package/dist/editor/review.js +189 -0
  161. package/dist/editor/review.js.map +1 -0
  162. package/dist/editor/types.d.ts +31 -0
  163. package/dist/editor/types.js +21 -0
  164. package/dist/editor/types.js.map +1 -0
  165. package/dist/evidence-selection/anchor-resolver.d.ts +43 -0
  166. package/dist/evidence-selection/anchor-resolver.js +783 -0
  167. package/dist/evidence-selection/anchor-resolver.js.map +1 -0
  168. package/dist/evidence-selection/anchor-types.d.ts +27 -0
  169. package/dist/evidence-selection/anchor-types.js +1 -0
  170. package/dist/evidence-selection/anchor-types.js.map +1 -0
  171. package/dist/evidence-selection/index.d.ts +8 -0
  172. package/dist/evidence-selection/index.js +32 -0
  173. package/dist/evidence-selection/index.js.map +1 -0
  174. package/dist/evidence-selection/prompt.d.ts +18 -0
  175. package/dist/evidence-selection/prompt.js +54 -0
  176. package/dist/evidence-selection/prompt.js.map +1 -0
  177. package/dist/evidence-selection/quote-score.d.ts +29 -0
  178. package/dist/evidence-selection/quote-score.js +331 -0
  179. package/dist/evidence-selection/quote-score.js.map +1 -0
  180. package/dist/evidence-selection/selection-resolver.d.ts +19 -0
  181. package/dist/evidence-selection/selection-resolver.js +303 -0
  182. package/dist/evidence-selection/selection-resolver.js.map +1 -0
  183. package/dist/evidence-selection/text.d.ts +4 -0
  184. package/dist/evidence-selection/text.js +66 -0
  185. package/dist/evidence-selection/text.js.map +1 -0
  186. package/dist/evidence-selection/types.d.ts +36 -0
  187. package/dist/evidence-selection/types.js +1 -0
  188. package/dist/evidence-selection/types.js.map +1 -0
  189. package/dist/facade/app.d.ts +75 -0
  190. package/dist/facade/app.js +141 -0
  191. package/dist/facade/app.js.map +1 -0
  192. package/dist/facade/build-queue.d.ts +181 -0
  193. package/dist/facade/build-queue.js +1442 -0
  194. package/dist/facade/build-queue.js.map +1 -0
  195. package/dist/facade/chapter-build.d.ts +60 -0
  196. package/dist/facade/chapter-build.js +1020 -0
  197. package/dist/facade/chapter-build.js.map +1 -0
  198. package/dist/facade/chapter.d.ts +168 -0
  199. package/dist/facade/chapter.js +944 -0
  200. package/dist/facade/chapter.js.map +1 -0
  201. package/dist/facade/digest.d.ts +55 -0
  202. package/dist/facade/digest.js +168 -0
  203. package/dist/facade/digest.js.map +1 -0
  204. package/dist/facade/graph.d.ts +60 -0
  205. package/dist/facade/graph.js +203 -0
  206. package/dist/facade/graph.js.map +1 -0
  207. package/dist/facade/import.d.ts +49 -0
  208. package/dist/facade/import.js +262 -0
  209. package/dist/facade/import.js.map +1 -0
  210. package/dist/facade/index.d.ts +39 -0
  211. package/dist/facade/index.js +171 -0
  212. package/dist/facade/index.js.map +1 -0
  213. package/dist/facade/knowledge-graph-build.d.ts +75 -0
  214. package/dist/facade/knowledge-graph-build.js +897 -0
  215. package/dist/facade/knowledge-graph-build.js.map +1 -0
  216. package/dist/facade/llm-sampling.d.ts +11 -0
  217. package/dist/facade/llm-sampling.js +58 -0
  218. package/dist/facade/llm-sampling.js.map +1 -0
  219. package/dist/facade/types.d.ts +8 -0
  220. package/dist/facade/types.js +1 -0
  221. package/dist/facade/types.js.map +1 -0
  222. package/dist/facade/wiki-graph-archive.d.ts +41 -0
  223. package/dist/facade/wiki-graph-archive.js +130 -0
  224. package/dist/facade/wiki-graph-archive.js.map +1 -0
  225. package/dist/gc/files.d.ts +15 -0
  226. package/dist/gc/files.js +141 -0
  227. package/dist/gc/files.js.map +1 -0
  228. package/dist/gc/index.d.ts +2 -0
  229. package/dist/gc/index.js +5 -0
  230. package/dist/gc/index.js.map +1 -0
  231. package/dist/gc/lock.d.ts +3 -0
  232. package/dist/gc/lock.js +137 -0
  233. package/dist/gc/lock.js.map +1 -0
  234. package/dist/gc/runner.d.ts +9 -0
  235. package/dist/gc/runner.js +129 -0
  236. package/dist/gc/runner.js.map +1 -0
  237. package/dist/gc/tmp-gc.d.ts +5 -0
  238. package/dist/gc/tmp-gc.js +57 -0
  239. package/dist/gc/tmp-gc.js.map +1 -0
  240. package/dist/gc/types.d.ts +24 -0
  241. package/dist/gc/types.js +1 -0
  242. package/dist/gc/types.js.map +1 -0
  243. package/dist/gc.cjs +10041 -0
  244. package/dist/gc.cjs.map +1 -0
  245. package/dist/gc.d.cts +10 -0
  246. package/dist/gc.d.ts +2 -0
  247. package/dist/gc.js +5 -0
  248. package/dist/gc.js.map +1 -0
  249. package/dist/guaranteed/classifier.d.ts +10 -0
  250. package/dist/guaranteed/classifier.js +88 -0
  251. package/dist/guaranteed/classifier.js.map +1 -0
  252. package/dist/guaranteed/errors.d.ts +38 -0
  253. package/dist/guaranteed/errors.js +73 -0
  254. package/dist/guaranteed/errors.js.map +1 -0
  255. package/dist/guaranteed/index.d.ts +7 -0
  256. package/dist/guaranteed/index.js +21 -0
  257. package/dist/guaranteed/index.js.map +1 -0
  258. package/dist/guaranteed/request.d.ts +8 -0
  259. package/dist/guaranteed/request.js +206 -0
  260. package/dist/guaranteed/request.js.map +1 -0
  261. package/dist/guaranteed/response.d.ts +12 -0
  262. package/dist/guaranteed/response.js +98 -0
  263. package/dist/guaranteed/response.js.map +1 -0
  264. package/dist/guaranteed/types.d.ts +20 -0
  265. package/dist/guaranteed/types.js +1 -0
  266. package/dist/guaranteed/types.js.map +1 -0
  267. package/dist/index-B8NNnQ8P.d.ts +424 -0
  268. package/dist/index.cjs +34774 -0
  269. package/dist/index.cjs.map +1 -0
  270. package/dist/index.d.cts +2462 -0
  271. package/dist/index.d.ts +79 -0
  272. package/dist/index.js +168 -0
  273. package/dist/index.js.map +1 -0
  274. package/dist/legacy-sdpub/upgrade.d.ts +7 -0
  275. package/dist/legacy-sdpub/upgrade.js +795 -0
  276. package/dist/legacy-sdpub/upgrade.js.map +1 -0
  277. package/dist/llm/cache.d.ts +13 -0
  278. package/dist/llm/cache.js +35 -0
  279. package/dist/llm/cache.js.map +1 -0
  280. package/dist/llm/client.d.ts +26 -0
  281. package/dist/llm/client.js +572 -0
  282. package/dist/llm/client.js.map +1 -0
  283. package/dist/llm/context.d.ts +22 -0
  284. package/dist/llm/context.js +78 -0
  285. package/dist/llm/context.js.map +1 -0
  286. package/dist/llm/errors.d.ts +7 -0
  287. package/dist/llm/errors.js +12 -0
  288. package/dist/llm/errors.js.map +1 -0
  289. package/dist/llm/index.d.ts +7 -0
  290. package/dist/llm/index.js +17 -0
  291. package/dist/llm/index.js.map +1 -0
  292. package/dist/llm/request-log.d.ts +9 -0
  293. package/dist/llm/request-log.js +35 -0
  294. package/dist/llm/request-log.js.map +1 -0
  295. package/dist/llm/sampling.d.ts +11 -0
  296. package/dist/llm/sampling.js +67 -0
  297. package/dist/llm/sampling.js.map +1 -0
  298. package/dist/llm/types.d.ts +50 -0
  299. package/dist/llm/types.js +1 -0
  300. package/dist/llm/types.js.map +1 -0
  301. package/dist/output/epub/archive.d.ts +9 -0
  302. package/dist/output/epub/archive.js +81 -0
  303. package/dist/output/epub/archive.js.map +1 -0
  304. package/dist/output/epub/book.d.ts +15 -0
  305. package/dist/output/epub/book.js +76 -0
  306. package/dist/output/epub/book.js.map +1 -0
  307. package/dist/output/epub/content.d.ts +9 -0
  308. package/dist/output/epub/content.js +35 -0
  309. package/dist/output/epub/content.js.map +1 -0
  310. package/dist/output/epub/index.d.ts +20 -0
  311. package/dist/output/epub/index.js +14 -0
  312. package/dist/output/epub/index.js.map +1 -0
  313. package/dist/output/epub/model.d.ts +24 -0
  314. package/dist/output/epub/model.js +1 -0
  315. package/dist/output/epub/model.js.map +1 -0
  316. package/dist/output/epub/navigation.d.ts +10 -0
  317. package/dist/output/epub/navigation.js +39 -0
  318. package/dist/output/epub/navigation.js.map +1 -0
  319. package/dist/output/epub/package.d.ts +17 -0
  320. package/dist/output/epub/package.js +29 -0
  321. package/dist/output/epub/package.js.map +1 -0
  322. package/dist/output/epub/shared.d.ts +4 -0
  323. package/dist/output/epub/shared.js +12 -0
  324. package/dist/output/epub/shared.js.map +1 -0
  325. package/dist/output/epub/templates.d.ts +35 -0
  326. package/dist/output/epub/templates.js +26 -0
  327. package/dist/output/epub/templates.js.map +1 -0
  328. package/dist/output/index.d.ts +14 -0
  329. package/dist/output/index.js +11 -0
  330. package/dist/output/index.js.map +1 -0
  331. package/dist/output/plain-text.d.ts +18 -0
  332. package/dist/output/plain-text.js +56 -0
  333. package/dist/output/plain-text.js.map +1 -0
  334. package/dist/progress/index.d.ts +3 -0
  335. package/dist/progress/index.js +14 -0
  336. package/dist/progress/index.js.map +1 -0
  337. package/dist/progress/reporter.d.ts +10 -0
  338. package/dist/progress/reporter.js +79 -0
  339. package/dist/progress/reporter.js.map +1 -0
  340. package/dist/progress/tracker.d.ts +37 -0
  341. package/dist/progress/tracker.js +119 -0
  342. package/dist/progress/tracker.js.map +1 -0
  343. package/dist/progress/types.d.ts +28 -0
  344. package/dist/progress/types.js +1 -0
  345. package/dist/progress/types.js.map +1 -0
  346. package/dist/reader/attention/attention.d.ts +39 -0
  347. package/dist/reader/attention/attention.js +123 -0
  348. package/dist/reader/attention/attention.js.map +1 -0
  349. package/dist/reader/attention/index.d.ts +9 -0
  350. package/dist/reader/attention/index.js +5 -0
  351. package/dist/reader/attention/index.js.map +1 -0
  352. package/dist/reader/attention/wave-reflection.d.ts +21 -0
  353. package/dist/reader/attention/wave-reflection.js +153 -0
  354. package/dist/reader/attention/wave-reflection.js.map +1 -0
  355. package/dist/reader/attention/working-memory.d.ts +28 -0
  356. package/dist/reader/attention/working-memory.js +62 -0
  357. package/dist/reader/attention/working-memory.js.map +1 -0
  358. package/dist/reader/chunk-batch/extract.d.ts +13 -0
  359. package/dist/reader/chunk-batch/extract.js +14 -0
  360. package/dist/reader/chunk-batch/extract.js.map +1 -0
  361. package/dist/reader/chunk-batch/extractor.d.ts +17 -0
  362. package/dist/reader/chunk-batch/extractor.js +337 -0
  363. package/dist/reader/chunk-batch/extractor.js.map +1 -0
  364. package/dist/reader/chunk-batch/fragment-projection.d.ts +34 -0
  365. package/dist/reader/chunk-batch/fragment-projection.js +94 -0
  366. package/dist/reader/chunk-batch/fragment-projection.js.map +1 -0
  367. package/dist/reader/chunk-batch/index.d.ts +12 -0
  368. package/dist/reader/chunk-batch/index.js +13 -0
  369. package/dist/reader/chunk-batch/index.js.map +1 -0
  370. package/dist/reader/chunk-batch/language.d.ts +9 -0
  371. package/dist/reader/chunk-batch/language.js +23 -0
  372. package/dist/reader/chunk-batch/language.js.map +1 -0
  373. package/dist/reader/chunk-batch/parser.d.ts +94 -0
  374. package/dist/reader/chunk-batch/parser.js +640 -0
  375. package/dist/reader/chunk-batch/parser.js.map +1 -0
  376. package/dist/reader/chunk-batch/prompt-templates.d.ts +6 -0
  377. package/dist/reader/chunk-batch/prompt-templates.js +11 -0
  378. package/dist/reader/chunk-batch/prompt-templates.js.map +1 -0
  379. package/dist/reader/chunk-batch/types.d.ts +85 -0
  380. package/dist/reader/chunk-batch/types.js +1 -0
  381. package/dist/reader/chunk-batch/types.js.map +1 -0
  382. package/dist/reader/index.d.ts +13 -0
  383. package/dist/reader/index.js +7 -0
  384. package/dist/reader/index.js.map +1 -0
  385. package/dist/reader/reader.d.ts +37 -0
  386. package/dist/reader/reader.js +82 -0
  387. package/dist/reader/reader.js.map +1 -0
  388. package/dist/reader/segment/index.d.ts +2 -0
  389. package/dist/reader/segment/index.js +5 -0
  390. package/dist/reader/segment/index.js.map +1 -0
  391. package/dist/reader/segment/intl-segmenter.d.ts +5 -0
  392. package/dist/reader/segment/intl-segmenter.js +102 -0
  393. package/dist/reader/segment/intl-segmenter.js.map +1 -0
  394. package/dist/reader/segment/segment.d.ts +5 -0
  395. package/dist/reader/segment/segment.js +9 -0
  396. package/dist/reader/segment/segment.js.map +1 -0
  397. package/dist/reader/segment/types.d.ts +14 -0
  398. package/dist/reader/segment/types.js +1 -0
  399. package/dist/reader/segment/types.js.map +1 -0
  400. package/dist/reader/types.d.ts +29 -0
  401. package/dist/reader/types.js +1 -0
  402. package/dist/reader/types.js.map +1 -0
  403. package/dist/serial.d.ts +89 -0
  404. package/dist/serial.js +476 -0
  405. package/dist/serial.js.map +1 -0
  406. package/dist/source/adapter.d.ts +15 -0
  407. package/dist/source/adapter.js +1 -0
  408. package/dist/source/adapter.js.map +1 -0
  409. package/dist/source/epub/archive.d.ts +27 -0
  410. package/dist/source/epub/archive.js +189 -0
  411. package/dist/source/epub/archive.js.map +1 -0
  412. package/dist/source/epub/content.d.ts +22 -0
  413. package/dist/source/epub/content.js +183 -0
  414. package/dist/source/epub/content.js.map +1 -0
  415. package/dist/source/epub/document.d.ts +55 -0
  416. package/dist/source/epub/document.js +179 -0
  417. package/dist/source/epub/document.js.map +1 -0
  418. package/dist/source/epub/index.d.ts +10 -0
  419. package/dist/source/epub/index.js +6 -0
  420. package/dist/source/epub/index.js.map +1 -0
  421. package/dist/source/epub/navigation.d.ts +16 -0
  422. package/dist/source/epub/navigation.js +215 -0
  423. package/dist/source/epub/navigation.js.map +1 -0
  424. package/dist/source/epub/package.d.ts +33 -0
  425. package/dist/source/epub/package.js +237 -0
  426. package/dist/source/epub/package.js.map +1 -0
  427. package/dist/source/epub/xml.d.ts +16 -0
  428. package/dist/source/epub/xml.js +111 -0
  429. package/dist/source/epub/xml.js.map +1 -0
  430. package/dist/source/index.d.ts +12 -0
  431. package/dist/source/index.js +32 -0
  432. package/dist/source/index.js.map +1 -0
  433. package/dist/source/meta.d.ts +30 -0
  434. package/dist/source/meta.js +22 -0
  435. package/dist/source/meta.js.map +1 -0
  436. package/dist/source/plain-text.d.ts +16 -0
  437. package/dist/source/plain-text.js +86 -0
  438. package/dist/source/plain-text.js.map +1 -0
  439. package/dist/source/toc.d.ts +16 -0
  440. package/dist/source/toc.js +17 -0
  441. package/dist/source/toc.js.map +1 -0
  442. package/dist/source/types.d.ts +16 -0
  443. package/dist/source/types.js +1 -0
  444. package/dist/source/types.js.map +1 -0
  445. package/dist/topology/grouping.d.ts +15 -0
  446. package/dist/topology/grouping.js +18 -0
  447. package/dist/topology/grouping.js.map +1 -0
  448. package/dist/topology/index.d.ts +21 -0
  449. package/dist/topology/index.js +5 -0
  450. package/dist/topology/index.js.map +1 -0
  451. package/dist/topology/resource-segmentation.d.ts +13 -0
  452. package/dist/topology/resource-segmentation.js +111 -0
  453. package/dist/topology/resource-segmentation.js.map +1 -0
  454. package/dist/topology/segment-incision.d.ts +18 -0
  455. package/dist/topology/segment-incision.js +197 -0
  456. package/dist/topology/segment-incision.js.map +1 -0
  457. package/dist/topology/snake-detector.d.ts +13 -0
  458. package/dist/topology/snake-detector.js +520 -0
  459. package/dist/topology/snake-detector.js.map +1 -0
  460. package/dist/topology/snake-graph-builder.d.ts +14 -0
  461. package/dist/topology/snake-graph-builder.js +76 -0
  462. package/dist/topology/snake-graph-builder.js.map +1 -0
  463. package/dist/topology/topology.d.ts +29 -0
  464. package/dist/topology/topology.js +348 -0
  465. package/dist/topology/topology.js.map +1 -0
  466. package/dist/topology/weights.d.ts +10 -0
  467. package/dist/topology/weights.js +84 -0
  468. package/dist/topology/weights.js.map +1 -0
  469. package/dist/types-FVIqiLC9.d.cts +24 -0
  470. package/dist/utils/async-semaphore.d.ts +7 -0
  471. package/dist/utils/async-semaphore.js +40 -0
  472. package/dist/utils/async-semaphore.js.map +1 -0
  473. package/dist/utils/enum.d.ts +5 -0
  474. package/dist/utils/enum.js +18 -0
  475. package/dist/utils/enum.js.map +1 -0
  476. package/dist/utils/hash.d.ts +3 -0
  477. package/dist/utils/hash.js +132 -0
  478. package/dist/utils/hash.js.map +1 -0
  479. package/dist/utils/node-error.d.ts +4 -0
  480. package/dist/utils/node-error.js +59 -0
  481. package/dist/utils/node-error.js.map +1 -0
  482. package/dist/wikg/archive-uri.d.ts +1 -0
  483. package/dist/wikg/archive-uri.js +37 -0
  484. package/dist/wikg/archive-uri.js.map +1 -0
  485. package/dist/wikg/archive.d.ts +28 -0
  486. package/dist/wikg/archive.js +496 -0
  487. package/dist/wikg/archive.js.map +1 -0
  488. package/dist/wikg/index.d.ts +31 -0
  489. package/dist/wikg/index.js +60 -0
  490. package/dist/wikg/index.js.map +1 -0
  491. package/dist/wikg/wikg-coordinator.d.ts +45 -0
  492. package/dist/wikg/wikg-coordinator.js +1687 -0
  493. package/dist/wikg/wikg-coordinator.js.map +1 -0
  494. package/dist/wikg/wiki-graph-archive-file.d.ts +42 -0
  495. package/dist/wikg/wiki-graph-archive-file.js +78 -0
  496. package/dist/wikg/wiki-graph-archive-file.js.map +1 -0
  497. package/dist/wikilink/index.d.ts +10 -0
  498. package/dist/wikilink/index.js +7 -0
  499. package/dist/wikilink/index.js.map +1 -0
  500. package/dist/wikilink/relation-discovery.d.ts +31 -0
  501. package/dist/wikilink/relation-discovery.js +477 -0
  502. package/dist/wikilink/relation-discovery.js.map +1 -0
  503. package/dist/wikilink/types.d.ts +23 -0
  504. package/dist/wikilink/types.js +1 -0
  505. package/dist/wikilink/types.js.map +1 -0
  506. package/dist/wikilink/window.d.ts +7 -0
  507. package/dist/wikilink/window.js +53 -0
  508. package/dist/wikilink/window.js.map +1 -0
  509. package/dist/wikimatch/enrichment.d.ts +10 -0
  510. package/dist/wikimatch/enrichment.js +55 -0
  511. package/dist/wikimatch/enrichment.js.map +1 -0
  512. package/dist/wikimatch/index.d.ts +16 -0
  513. package/dist/wikimatch/index.js +66 -0
  514. package/dist/wikimatch/index.js.map +1 -0
  515. package/dist/wikimatch/option-narrowing.d.ts +17 -0
  516. package/dist/wikimatch/option-narrowing.js +208 -0
  517. package/dist/wikimatch/option-narrowing.js.map +1 -0
  518. package/dist/wikimatch/options.d.ts +14 -0
  519. package/dist/wikimatch/options.js +155 -0
  520. package/dist/wikimatch/options.js.map +1 -0
  521. package/dist/wikimatch/policy-judge.d.ts +17 -0
  522. package/dist/wikimatch/policy-judge.js +430 -0
  523. package/dist/wikimatch/policy-judge.js.map +1 -0
  524. package/dist/wikimatch/range-suppression.d.ts +9 -0
  525. package/dist/wikimatch/range-suppression.js +27 -0
  526. package/dist/wikimatch/range-suppression.js.map +1 -0
  527. package/dist/wikimatch/surface-screening.d.ts +16 -0
  528. package/dist/wikimatch/surface-screening.js +168 -0
  529. package/dist/wikimatch/surface-screening.js.map +1 -0
  530. package/dist/wikimatch/surface-window.d.ts +6 -0
  531. package/dist/wikimatch/surface-window.js +44 -0
  532. package/dist/wikimatch/surface-window.js.map +1 -0
  533. package/dist/wikimatch/types.d.ts +151 -0
  534. package/dist/wikimatch/types.js +1 -0
  535. package/dist/wikimatch/types.js.map +1 -0
  536. package/dist/wikimatch/wikispine.d.ts +43 -0
  537. package/dist/wikimatch/wikispine.js +399 -0
  538. package/dist/wikimatch/wikispine.js.map +1 -0
  539. package/dist/wikimatch/window.d.ts +6 -0
  540. package/dist/wikimatch/window.js +83 -0
  541. package/dist/wikimatch/window.js.map +1 -0
  542. package/dist/wikimatch/words.d.ts +16 -0
  543. package/dist/wikimatch/words.js +66 -0
  544. package/dist/wikimatch/words.js.map +1 -0
  545. package/dist/wikipage/cache.d.ts +18 -0
  546. package/dist/wikipage/cache.js +404 -0
  547. package/dist/wikipage/cache.js.map +1 -0
  548. package/dist/wikipage/fetch-log.d.ts +17 -0
  549. package/dist/wikipage/fetch-log.js +143 -0
  550. package/dist/wikipage/fetch-log.js.map +1 -0
  551. package/dist/wikipage/index.d.ts +14 -0
  552. package/dist/wikipage/index.js +17 -0
  553. package/dist/wikipage/index.js.map +1 -0
  554. package/dist/wikipage/normalizer.d.ts +14 -0
  555. package/dist/wikipage/normalizer.js +147 -0
  556. package/dist/wikipage/normalizer.js.map +1 -0
  557. package/dist/wikipage/rate-limiter.d.ts +13 -0
  558. package/dist/wikipage/rate-limiter.js +84 -0
  559. package/dist/wikipage/rate-limiter.js.map +1 -0
  560. package/dist/wikipage/resolver.d.ts +26 -0
  561. package/dist/wikipage/resolver.js +325 -0
  562. package/dist/wikipage/resolver.js.map +1 -0
  563. package/dist/wikipage/types.d.ts +96 -0
  564. package/dist/wikipage/types.js +1 -0
  565. package/dist/wikipage/types.js.map +1 -0
  566. package/dist/wikipage/wikimedia-client.d.ts +48 -0
  567. package/dist/wikipage/wikimedia-client.js +397 -0
  568. package/dist/wikipage/wikimedia-client.js.map +1 -0
  569. package/dist/worker-BgQ0Xl8T.d.cts +181 -0
  570. package/dist/worker.cjs +5259 -0
  571. package/dist/worker.cjs.map +1 -0
  572. package/dist/worker.d.cts +2 -0
  573. package/dist/worker.d.ts +2 -0
  574. package/dist/worker.js +5 -0
  575. package/dist/worker.js.map +1 -0
  576. package/package.json +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/facade/chapter-build.ts"],"sourcesContent":["import { mkdir, readFile, rm, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\n\nimport type {\n ChunkRecord,\n Document,\n FragmentRecord,\n ReadingEdgeRecord,\n MentionLinkRecord,\n MentionRecord,\n ReadonlyChunkStore,\n ReadonlyDocument,\n ReadonlyFragmentGroupStore,\n ReadonlyGraphBuildParameterStore,\n ReadonlyReadingEdgeStore,\n ReadonlyMentionLinkStore,\n ReadonlyMentionStore,\n ReadonlyObjectMetadataStore,\n ReadonlySerialFragments,\n ReadonlySerialStore,\n ReadonlySnakeChunkStore,\n ReadonlySnakeEdgeStore,\n ReadonlySnakeStore,\n SentenceId,\n SentenceGroupRecord,\n SerialRecord,\n SnakeChunkRecord,\n SnakeEdgeRecord,\n SnakeRecord,\n} from \"../document/index.js\";\nimport { DirectoryDocument, Fragments } from \"../document/index.js\";\nimport { WIKI_GRAPH_EDITOR_SCOPES } from \"../common/llm-scope.js\";\nimport { normalizeLanguageCode } from \"../common/language.js\";\nimport { compressText } from \"../editor/index.js\";\nimport { segmentTextStream, type ReaderTextStream } from \"../reader/index.js\";\nimport {\n SerialGeneration,\n type BuildSerialTopologyOptions,\n} from \"../serial.js\";\nimport { ChunkImportance, ChunkRetention } from \"../document/types.js\";\n\nimport {\n getChapterDetails,\n type ChapterDetails,\n type GenerateChapterGraphOptions,\n type GenerateChapterSummaryOptions,\n} from \"./chapter.js\";\n\nexport interface ChapterGraphBuildArtifact {\n readonly documentPath: string;\n readonly chapterId: number;\n readonly parameter: GraphBuildParameterInput;\n}\n\nexport interface GraphBuildParameterInput {\n readonly language?: string;\n readonly prompt: string;\n}\n\nexport interface ChapterSummaryInputSnapshot {\n readonly filePath: string;\n}\n\nexport interface BuildChapterGraphArtifactOptions extends GenerateChapterGraphOptions {\n readonly sourceText: readonly string[];\n readonly workspacePath: string;\n}\n\nexport interface BuildChapterSummaryArtifactOptions extends GenerateChapterSummaryOptions {\n readonly snapshotPath?: string;\n readonly sourceDocumentPath?: string;\n readonly workspacePath: string;\n}\n\nconst sentenceIdSchema = z.tuple([\n z.number(),\n z.number(),\n]) satisfies z.ZodType<SentenceId>;\nconst GRAPH_ARTIFACT_FRAGMENT_WORDS_COUNT = 320;\nconst sentenceRecordSchema = z.object({\n text: z.string(),\n wordsCount: z.number(),\n});\nconst fragmentRecordSchema = z.object({\n serialId: z.number(),\n fragmentId: z.number(),\n summary: z.string(),\n sentences: z.array(sentenceRecordSchema),\n}) satisfies z.ZodType<FragmentRecord>;\nconst serialRecordSchema = z\n .object({\n documentOrder: z.number().optional(),\n id: z.number(),\n knowledgeGraphReady: z.boolean(),\n knowledgeGraphParameterHash: z.string().optional(),\n revision: z.number().optional(),\n topologyParameterHash: z.string().optional(),\n topologyReady: z.boolean(),\n })\n .transform((record) => ({\n documentOrder: record.documentOrder ?? record.id,\n id: record.id,\n knowledgeGraphReady: record.knowledgeGraphReady,\n ...(record.knowledgeGraphParameterHash === undefined\n ? {}\n : { knowledgeGraphParameterHash: record.knowledgeGraphParameterHash }),\n revision: record.revision ?? 0,\n topologyReady: record.topologyReady,\n ...(record.topologyParameterHash === undefined\n ? {}\n : { topologyParameterHash: record.topologyParameterHash }),\n })) satisfies z.ZodType<SerialRecord>;\nconst chunkRecordSchema = z.object({\n id: z.number(),\n generation: z.number(),\n sentenceId: sentenceIdSchema,\n label: z.string(),\n content: z.string(),\n sentenceIds: z.array(sentenceIdSchema),\n retention: z.enum(ChunkRetention).optional(),\n importance: z.enum(ChunkImportance).optional(),\n wordsCount: z.number(),\n weight: z.number(),\n});\nconst knowledgeEdgeRecordSchema = z.object({\n fromId: z.number(),\n toId: z.number(),\n strength: z.string().optional(),\n weight: z.number(),\n});\nconst snakeRecordSchema = z.object({\n id: z.number(),\n serialId: z.number(),\n groupId: z.number(),\n localSnakeId: z.number(),\n size: z.number(),\n firstLabel: z.string(),\n lastLabel: z.string(),\n wordsCount: z.number(),\n weight: z.number(),\n}) satisfies z.ZodType<SnakeRecord>;\nconst snakeChunkRecordSchema = z.object({\n snakeId: z.number(),\n chunkId: z.number(),\n position: z.number(),\n}) satisfies z.ZodType<SnakeChunkRecord>;\nconst snakeEdgeRecordSchema = z.object({\n fromSnakeId: z.number(),\n toSnakeId: z.number(),\n weight: z.number(),\n}) satisfies z.ZodType<SnakeEdgeRecord>;\nconst fragmentGroupRecordSchema = z.object({\n serialId: z.number(),\n groupId: z.number(),\n startSentenceIndex: z.number(),\n endSentenceIndex: z.number(),\n}) satisfies z.ZodType<SentenceGroupRecord>;\n\nconst summaryInputSnapshotSchema = z.object({\n chunks: z.array(chunkRecordSchema),\n fragmentGroups: z.array(fragmentGroupRecordSchema),\n fragments: z.array(fragmentRecordSchema),\n readingEdges: z.array(knowledgeEdgeRecordSchema),\n serial: serialRecordSchema,\n snakeChunks: z.array(snakeChunkRecordSchema),\n snakeEdges: z.array(snakeEdgeRecordSchema),\n snakes: z.array(snakeRecordSchema),\n});\n\ninterface SummaryInputSnapshotData {\n readonly chunks: readonly ChunkRecord[];\n readonly fragmentGroups: readonly SentenceGroupRecord[];\n readonly fragments: readonly FragmentRecord[];\n readonly readingEdges: readonly ReadingEdgeRecord[];\n readonly serial: SerialRecord;\n readonly snakeChunks: readonly SnakeChunkRecord[];\n readonly snakeEdges: readonly SnakeEdgeRecord[];\n readonly snakes: readonly SnakeRecord[];\n}\n\nexport async function readChapterBuildInput(\n document: ReadonlyDocument,\n chapterId: number,\n): Promise<{\n readonly details: ChapterDetails;\n readonly revision: number;\n readonly sourceText: readonly string[];\n}> {\n const details = await getChapterDetails(document, chapterId);\n\n return {\n details,\n revision: await document.serials.getRevision(chapterId),\n sourceText: await collectReaderText(readChapterSource(document, chapterId)),\n };\n}\n\nexport async function buildChapterGraphArtifact(\n chapterId: number,\n options: BuildChapterGraphArtifactOptions,\n): Promise<ChapterGraphBuildArtifact> {\n const documentPath = join(options.workspacePath, \"graph-document\");\n\n await rm(documentPath, { force: true, recursive: true });\n await mkdir(options.workspacePath, { recursive: true });\n\n const document = await DirectoryDocument.open(documentPath);\n\n try {\n await document.openSession(async (openedDocument) => {\n await openedDocument.serials.createWithId(chapterId);\n await writeGraphArtifactSourceFragments(\n documentPath,\n chapterId,\n options.sourceText,\n );\n const artifactDocument = createFragmentBackedDocument(\n openedDocument,\n documentPath,\n );\n\n await new SerialGeneration({\n document: artifactDocument,\n llm: options.llm,\n ...(options.logDirPath === undefined\n ? {}\n : { logDirPath: options.logDirPath }),\n }).buildTopologyInto(\n chapterId,\n createTopologyOptions(options),\n options.progressTracker,\n );\n });\n } finally {\n await document.release();\n }\n\n return {\n chapterId,\n documentPath,\n parameter: createGraphBuildParameterInput(options),\n };\n}\n\nexport async function commitChapterGraphArtifact(\n document: Document,\n artifact: ChapterGraphBuildArtifact,\n): Promise<ChapterDetails> {\n const sourceDocument = await DirectoryDocument.open(artifact.documentPath);\n\n try {\n await document.openSession(async (openedDocument) => {\n await requireStage(openedDocument, artifact.chapterId, \"sourced\");\n await openedDocument.clearSerialGraph(artifact.chapterId);\n await openedDocument.serials.ensure(artifact.chapterId);\n\n const chunkIdMap = await copyChunks(\n sourceDocument,\n openedDocument,\n artifact.chapterId,\n );\n\n for (const edge of await sourceDocument.readingEdges.listBySerial(\n artifact.chapterId,\n )) {\n const fromId = chunkIdMap.get(edge.fromId);\n const toId = chunkIdMap.get(edge.toId);\n\n if (fromId === undefined || toId === undefined) {\n continue;\n }\n\n await openedDocument.readingEdges.save({\n ...edge,\n fromId,\n toId,\n });\n }\n\n await openedDocument.fragmentGroups.saveMany(\n await sourceDocument.fragmentGroups.listBySerial(artifact.chapterId),\n );\n await copySnakes(\n sourceDocument,\n openedDocument,\n artifact.chapterId,\n chunkIdMap,\n );\n const parameter = await openedDocument.graphBuildParameters.save(\n artifact.parameter,\n );\n await openedDocument.serials.setTopologyReady(\n artifact.chapterId,\n true,\n parameter.hash,\n );\n });\n\n return await getChapterDetails(document, artifact.chapterId);\n } finally {\n await sourceDocument.release();\n }\n}\n\nexport async function buildChapterSummaryArtifact(\n document: ReadonlyDocument,\n chapterId: number,\n options: BuildChapterSummaryArtifactOptions,\n): Promise<string> {\n const snapshotPath = options.snapshotPath;\n\n if (snapshotPath !== undefined) {\n return await buildChapterSummaryArtifactFromSnapshot(chapterId, {\n ...options,\n snapshotPath,\n });\n }\n\n const sourceDocumentPath = options.sourceDocumentPath;\n\n if (sourceDocumentPath !== undefined) {\n return await buildChapterSummaryArtifactFromDocumentSnapshot(chapterId, {\n ...options,\n sourceDocumentPath,\n });\n }\n\n return await buildChapterSummaryArtifactFromDocument(\n document,\n chapterId,\n options,\n );\n}\n\nexport async function buildChapterSummaryArtifactFromSnapshot(\n chapterId: number,\n options: BuildChapterSummaryArtifactOptions & {\n readonly snapshotPath: string;\n },\n): Promise<string> {\n const snapshot = await readSummaryInputSnapshot(options.snapshotPath);\n return await buildSummaryFromSnapshot(snapshot, chapterId, options);\n}\n\nasync function buildChapterSummaryArtifactFromDocumentSnapshot(\n chapterId: number,\n options: BuildChapterSummaryArtifactOptions & {\n readonly sourceDocumentPath: string;\n },\n): Promise<string> {\n const document = await DirectoryDocument.open(options.sourceDocumentPath);\n\n try {\n return await buildChapterSummaryArtifactFromDocument(\n createFragmentBackedDocument(document, options.sourceDocumentPath),\n chapterId,\n options,\n );\n } finally {\n await document.release();\n }\n}\n\nasync function buildChapterSummaryArtifactFromDocument(\n document: ReadonlyDocument,\n chapterId: number,\n options: BuildChapterSummaryArtifactOptions,\n): Promise<string> {\n const details = await getChapterDetails(document, chapterId);\n\n if (details.stage !== \"graphed\") {\n throw new Error(\n `Chapter ${chapterId} is ${details.stage}. Generate a summary only for graphed chapters.`,\n );\n }\n\n const summary = await document.readSummary(chapterId);\n\n if (summary !== undefined) {\n return summary;\n }\n\n return await buildSummaryFromDocument(document, chapterId, options);\n}\n\nexport async function commitChapterSummaryArtifact(\n document: Document,\n chapterId: number,\n summary: string,\n): Promise<ChapterDetails> {\n await document.openSession(async (openedDocument) => {\n await requireStage(openedDocument, chapterId, \"graphed\");\n await openedDocument.writeSummary(chapterId, summary);\n });\n\n return await getChapterDetails(document, chapterId);\n}\n\nexport async function snapshotChapterSummaryInput(\n document: ReadonlyDocument,\n chapterId: number,\n workspacePath: string,\n): Promise<ChapterSummaryInputSnapshot> {\n const filePath = join(workspacePath, \"summary-input.json\");\n\n await mkdir(workspacePath, { recursive: true });\n await requireStage(document, chapterId, \"graphed\");\n\n const fragments = await readSerialFragments(document, chapterId);\n const snakes = await document.snakes.listBySerial(chapterId);\n const snakeChunks = (\n await Promise.all(\n snakes.map(\n async (snake) => await document.snakeChunks.listBySnake(snake.id),\n ),\n )\n ).flat();\n\n await writeSummaryInputSnapshot(filePath, {\n chunks: await document.chunks.listBySerial(chapterId),\n fragmentGroups: await document.fragmentGroups.listBySerial(chapterId),\n fragments,\n readingEdges: await document.readingEdges.listBySerial(chapterId),\n serial: {\n documentOrder: chapterId,\n id: chapterId,\n knowledgeGraphReady: false,\n revision: 0,\n topologyReady: true,\n },\n snakeChunks,\n snakeEdges: await document.snakeEdges.listBySerial(chapterId),\n snakes,\n });\n\n return { filePath };\n}\n\nasync function buildSummaryFromSnapshot(\n snapshot: SummaryInputSnapshotData,\n chapterId: number,\n options: BuildChapterSummaryArtifactOptions,\n): Promise<string> {\n if (snapshot.serial.id !== chapterId) {\n throw new Error(\n `Summary snapshot belongs to chapter ${snapshot.serial.id}, not chapter ${chapterId}.`,\n );\n }\n if (!snapshot.serial.topologyReady) {\n throw new Error(`Chapter ${chapterId} is not ready for summary.`);\n }\n\n const document = new SummaryInputSnapshotDocument(snapshot);\n const fragments = document.getSerialFragments(chapterId);\n const sentenceStartIndexes = await fragments.listFragmentIds();\n\n if (sentenceStartIndexes.length <= 1) {\n return await readPassthroughSummary(fragments, sentenceStartIndexes);\n }\n\n const summaryParts: string[] = [];\n\n for (const groupId of await document.fragmentGroups.listGroupIdsForSerial(\n chapterId,\n )) {\n const groupSummary = await compressText({\n compressionRatio: 0.2,\n document,\n groupId,\n llm: options.llm,\n maxClues: 10,\n maxIterations: 5,\n scopes: WIKI_GRAPH_EDITOR_SCOPES,\n serialId: chapterId,\n ...(options.logDirPath === undefined\n ? {}\n : { logDirPath: options.logDirPath }),\n ...(options.userLanguage === undefined\n ? {}\n : { userLanguage: options.userLanguage }),\n });\n\n if (groupSummary.trim() === \"\") {\n continue;\n }\n summaryParts.push(groupSummary);\n }\n\n return summaryParts.join(\"\\n\\n\");\n}\n\nasync function buildSummaryFromDocument(\n document: ReadonlyDocument,\n chapterId: number,\n options: BuildChapterSummaryArtifactOptions,\n): Promise<string> {\n const serial = await document.serials.getById(chapterId);\n\n if (serial === undefined) {\n throw new Error(\n `Chapter ${chapterId} does not exist. Use \\`wg <archive-uri>/chapter list\\` to discover chapter ids.`,\n );\n }\n if (!serial.topologyReady) {\n throw new Error(`Chapter ${chapterId} is not ready for summary.`);\n }\n\n const fragments = document.getSerialFragments(chapterId);\n const sentenceStartIndexes = await fragments.listFragmentIds();\n\n if (sentenceStartIndexes.length <= 1) {\n return await readPassthroughSummary(fragments, sentenceStartIndexes);\n }\n\n const summaryParts: string[] = [];\n\n for (const groupId of await document.fragmentGroups.listGroupIdsForSerial(\n chapterId,\n )) {\n const groupSummary = await compressText({\n compressionRatio: 0.2,\n document,\n groupId,\n llm: options.llm,\n maxClues: 10,\n maxIterations: 5,\n scopes: WIKI_GRAPH_EDITOR_SCOPES,\n serialId: chapterId,\n ...(options.logDirPath === undefined\n ? {}\n : { logDirPath: options.logDirPath }),\n ...(options.userLanguage === undefined\n ? {}\n : { userLanguage: options.userLanguage }),\n });\n\n if (groupSummary.trim() === \"\") {\n continue;\n }\n summaryParts.push(groupSummary);\n }\n\n return summaryParts.join(\"\\n\\n\");\n}\n\nasync function readPassthroughSummary(\n fragments: ReadonlySerialFragments,\n sentenceStartIndexes: readonly number[],\n): Promise<string> {\n if (sentenceStartIndexes.length === 0) {\n return \"\";\n }\n\n const records = await Promise.all(\n sentenceStartIndexes.map(\n async (startSentenceIndex) =>\n await fragments.getFragment(startSentenceIndex),\n ),\n );\n\n return records\n .flatMap((fragment) => fragment.sentences.map((sentence) => sentence.text))\n .join(\" \")\n .trim();\n}\n\nasync function writeGraphArtifactSourceFragments(\n documentPath: string,\n chapterId: number,\n sourceText: ReaderTextStream,\n): Promise<void> {\n const fragments = new Fragments(documentPath);\n const serial = fragments.getSerial(chapterId);\n let draft = await serial.createDraft();\n let draftWordsCount = 0;\n let hasSentences = false;\n\n await fragments.ensureCreated();\n\n for await (const sentence of segmentTextStream(sourceText)) {\n const text = sentence.text.trim();\n\n if (text === \"\") {\n continue;\n }\n if (\n draftWordsCount > 0 &&\n draftWordsCount + sentence.wordsCount >\n GRAPH_ARTIFACT_FRAGMENT_WORDS_COUNT\n ) {\n await draft.commit();\n draft = await serial.createDraft();\n draftWordsCount = 0;\n }\n\n draft.addSentence(text, sentence.wordsCount);\n draftWordsCount += sentence.wordsCount;\n hasSentences = true;\n }\n\n if (hasSentences) {\n await draft.commit();\n } else {\n draft.discard();\n }\n}\n\nfunction createFragmentBackedDocument<TDocument extends ReadonlyDocument>(\n document: TDocument,\n documentPath: string,\n): TDocument {\n const fragments = new Fragments(documentPath);\n\n return new Proxy(document, {\n get(target, property, receiver): unknown {\n if (property === \"getSerialFragments\") {\n return (serialId: number) => fragments.getSerial(serialId);\n }\n if (property === \"getSummaryFragments\") {\n return (serialId: number) => fragments.getSummarySerial(serialId);\n }\n if (property === \"getSentence\") {\n return async (sentenceId: SentenceId) =>\n await fragments.getSentence(sentenceId);\n }\n\n const value = Reflect.get(target, property, receiver) as unknown;\n\n if (typeof value !== \"function\") {\n return value;\n }\n\n return value.bind(target) as unknown;\n },\n });\n}\n\nasync function readSerialFragments(\n document: ReadonlyDocument,\n serialId: number,\n): Promise<readonly FragmentRecord[]> {\n const fragments = document.getSerialFragments(serialId);\n\n return await Promise.all(\n (await fragments.listFragmentIds()).map(\n async (fragmentId) => await fragments.getFragment(fragmentId),\n ),\n );\n}\n\nasync function readSummaryInputSnapshot(\n filePath: string,\n): Promise<SummaryInputSnapshotData> {\n const snapshot = summaryInputSnapshotSchema.parse(\n JSON.parse(await readFile(filePath, \"utf8\")),\n );\n\n return {\n ...snapshot,\n chunks: snapshot.chunks.map(toChunkRecord),\n readingEdges: snapshot.readingEdges.map(toReadingEdgeRecord),\n };\n}\n\nfunction toChunkRecord(record: z.infer<typeof chunkRecordSchema>): ChunkRecord {\n return {\n id: record.id,\n generation: record.generation,\n sentenceId: record.sentenceId,\n label: record.label,\n content: record.content,\n sentenceIds: record.sentenceIds,\n ...(record.retention === undefined ? {} : { retention: record.retention }),\n ...(record.importance === undefined\n ? {}\n : { importance: record.importance }),\n wordsCount: record.wordsCount,\n weight: record.weight,\n };\n}\n\nfunction toReadingEdgeRecord(\n record: z.infer<typeof knowledgeEdgeRecordSchema>,\n): ReadingEdgeRecord {\n return {\n fromId: record.fromId,\n toId: record.toId,\n ...(record.strength === undefined ? {} : { strength: record.strength }),\n weight: record.weight,\n };\n}\n\nasync function writeSummaryInputSnapshot(\n filePath: string,\n snapshot: SummaryInputSnapshotData,\n): Promise<void> {\n await writeFile(filePath, `${JSON.stringify(snapshot)}\\n`, \"utf8\");\n}\n\nclass SummaryInputSnapshotDocument implements ReadonlyDocument {\n public readonly chunks: ReadonlyChunkStore;\n public readonly fragmentGroups: ReadonlyFragmentGroupStore;\n public readonly graphBuildParameters: ReadonlyGraphBuildParameterStore;\n public readonly readingEdges: ReadonlyReadingEdgeStore;\n public readonly mentionLinks: ReadonlyMentionLinkStore;\n public readonly mentions: ReadonlyMentionStore;\n public readonly metadata: ReadonlyObjectMetadataStore;\n public readonly serials: ReadonlySerialStore;\n public readonly snakeChunks: ReadonlySnakeChunkStore;\n public readonly snakeEdges: ReadonlySnakeEdgeStore;\n public readonly snakes: ReadonlySnakeStore;\n readonly #fragments: ReadonlySerialFragments;\n\n public constructor(snapshot: SummaryInputSnapshotData) {\n const serialId = snapshot.serial.id;\n\n this.chunks = new SnapshotChunkStore(snapshot.chunks, snapshot.fragments);\n this.fragmentGroups = new SnapshotFragmentGroupStore(\n snapshot.fragmentGroups,\n );\n this.graphBuildParameters = new EmptySnapshotGraphBuildParameterStore();\n this.readingEdges = new SnapshotReadingEdgeStore(\n snapshot.readingEdges,\n snapshot.chunks,\n );\n this.mentionLinks = new EmptySnapshotMentionLinkStore();\n this.mentions = new EmptySnapshotMentionStore();\n this.metadata = new EmptySnapshotObjectMetadataStore();\n this.serials = new SnapshotSerialStore(snapshot.serial);\n this.snakeChunks = new SnapshotSnakeChunkStore(snapshot.snakeChunks);\n this.snakeEdges = new SnapshotSnakeEdgeStore(\n snapshot.snakeEdges,\n snapshot.snakes,\n );\n this.snakes = new SnapshotSnakeStore(snapshot.snakes);\n this.#fragments = new SnapshotSerialFragments(serialId, snapshot.fragments);\n }\n\n public async getSentence(sentenceId: SentenceId): Promise<string> {\n const [serialId, sentenceIndex] = sentenceId;\n const sentence = (await this.getSerialFragments(serialId).listSentences!())[\n sentenceIndex\n ];\n\n if (sentence === undefined) {\n throw new RangeError(`Sentence ${sentenceIndex} does not exist`);\n }\n\n return sentence.text;\n }\n\n public getSerialFragments(serialId: number): ReadonlySerialFragments {\n if (serialId !== this.#fragments.serialId) {\n return new SnapshotSerialFragments(serialId, []);\n }\n return this.#fragments;\n }\n\n public getSummaryFragments(serialId: number): ReadonlySerialFragments {\n return new SnapshotSerialFragments(serialId, []);\n }\n\n public async openSession<T>(\n operation: (document: ReadonlyDocument) => Promise<T> | T,\n ): Promise<T> {\n return await operation(this);\n }\n\n public readDatabase<T>(): Promise<T> {\n return Promise.reject(\n new Error(\"Summary input snapshots do not expose a SQLite database.\"),\n );\n }\n\n public readSearchIndexDatabase<T>(): Promise<T> {\n return Promise.reject(\n new Error(\n \"Summary input snapshots do not expose a search index database.\",\n ),\n );\n }\n\n public readBookMeta(): Promise<undefined> {\n return Promise.resolve(undefined);\n }\n\n public readCover(): Promise<undefined> {\n return Promise.resolve(undefined);\n }\n\n public readSummary(_serialId: number): Promise<undefined> {\n return Promise.resolve(undefined);\n }\n\n public readToc(): Promise<undefined> {\n return Promise.resolve(undefined);\n }\n\n public release(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nclass EmptySnapshotMentionStore implements ReadonlyMentionStore {\n public getById(_mentionId: string): Promise<undefined> {\n return Promise.resolve(undefined);\n }\n\n public listAll(): Promise<MentionRecord[]> {\n return Promise.resolve([]);\n }\n\n public listByQid(_qid: string): Promise<MentionRecord[]> {\n return Promise.resolve([]);\n }\n\n public listBySurfaceTerms(\n _terms: readonly string[],\n ): Promise<MentionRecord[]> {\n return Promise.resolve([]);\n }\n\n public listBySurfaces(\n _surfaces: readonly string[],\n ): Promise<MentionRecord[]> {\n return Promise.resolve([]);\n }\n\n public listByChapter(_chapterId: number): Promise<MentionRecord[]> {\n return Promise.resolve([]);\n }\n}\n\nclass EmptySnapshotMentionLinkStore implements ReadonlyMentionLinkStore {\n public getById(_linkId: string): Promise<undefined> {\n return Promise.resolve(undefined);\n }\n\n public listByTriple(_input: {\n readonly objectQid: string;\n readonly predicate: string;\n readonly subjectQid: string;\n }): Promise<MentionLinkRecord[]> {\n return Promise.resolve([]);\n }\n\n public listByChapter(_chapterId: number): Promise<MentionLinkRecord[]> {\n return Promise.resolve([]);\n }\n}\n\nclass EmptySnapshotObjectMetadataStore implements ReadonlyObjectMetadataStore {\n public getMap(\n _objectPath: string,\n ): Promise<Readonly<Record<string, unknown>>> {\n return Promise.resolve({});\n }\n}\n\nclass EmptySnapshotGraphBuildParameterStore implements ReadonlyGraphBuildParameterStore {\n public getByHash(_hash: string): Promise<undefined> {\n return Promise.resolve(undefined);\n }\n}\n\nclass SnapshotSerialStore implements ReadonlySerialStore {\n readonly #serial: SerialRecord;\n\n public constructor(serial: SerialRecord) {\n this.#serial = serial;\n }\n\n public getById(serialId: number): Promise<SerialRecord | undefined> {\n return Promise.resolve(\n serialId === this.#serial.id ? this.#serial : undefined,\n );\n }\n\n public getRevision(serialId: number): Promise<number> {\n return Promise.resolve(\n serialId === this.#serial.id ? this.#serial.revision : 0,\n );\n }\n\n public getRevisions(\n serialIds: readonly number[],\n ): Promise<ReadonlyMap<number, number>> {\n return Promise.resolve(\n new Map(\n serialIds\n .filter((serialId) => serialId === this.#serial.id)\n .map((serialId) => [serialId, this.#serial.revision] as const),\n ),\n );\n }\n\n public getChaptersRevision(): Promise<number> {\n return Promise.resolve(this.#serial.revision);\n }\n\n public getMaxId(): Promise<number> {\n return Promise.resolve(this.#serial.id);\n }\n\n public listIds(): Promise<number[]> {\n return Promise.resolve([this.#serial.id]);\n }\n\n public listDocumentOrders(): Promise<ReadonlyMap<number, number>> {\n return Promise.resolve(\n new Map([[this.#serial.id, this.#serial.documentOrder]]),\n );\n }\n}\n\nclass SnapshotSerialFragments implements ReadonlySerialFragments {\n public readonly path = \"\";\n public readonly serialId: number;\n readonly #fragmentsById: Map<number, FragmentRecord>;\n\n public constructor(serialId: number, fragments: readonly FragmentRecord[]) {\n this.serialId = serialId;\n this.#fragmentsById = new Map(\n fragments\n .filter((fragment) => fragment.serialId === serialId)\n .map((fragment) => [fragment.fragmentId, fragment]),\n );\n }\n\n public getFragment(fragmentId: number): Promise<FragmentRecord> {\n const fragment = this.#fragmentsById.get(fragmentId);\n\n if (fragment === undefined) {\n throw new Error(`Fragment ${fragmentId} does not exist`);\n }\n\n return Promise.resolve(fragment);\n }\n\n public listFragmentIds(): Promise<readonly number[]> {\n return Promise.resolve([...this.#fragmentsById.keys()].sort(compareNumber));\n }\n\n public async getSentence(sentenceIndex: number) {\n const sentence = (await this.listSentences())[sentenceIndex];\n\n if (sentence === undefined) {\n throw new RangeError(`Sentence ${sentenceIndex} does not exist`);\n }\n\n return sentence;\n }\n\n public async listSentencesInRange(\n startSentenceIndex: number,\n endSentenceIndex: number,\n ) {\n return (await this.listSentences()).slice(\n startSentenceIndex,\n endSentenceIndex + 1,\n );\n }\n\n public async listSentences() {\n const fragments = await Promise.all(\n (await this.listFragmentIds()).map(\n async (fragmentId) => await this.getFragment(fragmentId),\n ),\n );\n\n return fragments.flatMap((fragment) => fragment.sentences);\n }\n\n public async readText(): Promise<string | undefined> {\n const sentences = await this.listSentences();\n\n if (sentences.length === 0) {\n return undefined;\n }\n\n return sentences.map((sentence) => sentence.text).join(\"\");\n }\n}\n\nclass SnapshotChunkStore implements ReadonlyChunkStore {\n readonly #chunks: readonly ChunkRecord[];\n readonly #chunksById: Map<number, ChunkRecord>;\n readonly #fragmentStartIndexesBySerialId: ReadonlyMap<\n number,\n readonly number[]\n >;\n\n public constructor(\n chunks: readonly ChunkRecord[],\n fragments: readonly FragmentRecord[],\n ) {\n this.#chunks = [...chunks].sort(compareChunkById);\n this.#chunksById = new Map(chunks.map((chunk) => [chunk.id, chunk]));\n this.#fragmentStartIndexesBySerialId =\n createFragmentStartIndexesBySerialId(fragments);\n }\n\n public getById(chunkId: number): Promise<ChunkRecord | undefined> {\n return Promise.resolve(this.#chunksById.get(chunkId));\n }\n\n public countAll(): Promise<number> {\n return Promise.resolve(this.#chunks.length);\n }\n\n public listAll(): Promise<ChunkRecord[]> {\n return Promise.resolve([...this.#chunks]);\n }\n\n public listBySentenceStartIndexes(\n serialId: number,\n sentenceStartIndexes: readonly number[],\n ): Promise<ChunkRecord[]> {\n const segmentRanges = createSegmentRanges(\n this.#fragmentStartIndexesBySerialId.get(serialId) ?? [],\n sentenceStartIndexes,\n );\n\n return Promise.resolve(\n this.#chunks.filter(\n (chunk) =>\n chunk.sentenceId[0] === serialId &&\n segmentRanges.some(\n (range) =>\n chunk.sentenceId[1] >= range.startSentenceIndex &&\n chunk.sentenceId[1] <= range.endSentenceIndex,\n ),\n ),\n );\n }\n\n public listBySentenceRange(\n serialId: number,\n startSentenceIndex: number,\n endSentenceIndex: number,\n ): Promise<ChunkRecord[]> {\n return Promise.resolve(\n this.#chunks.filter(\n (chunk) =>\n chunk.sentenceId[0] === serialId &&\n chunk.sentenceId[1] >= startSentenceIndex &&\n chunk.sentenceId[1] <= endSentenceIndex,\n ),\n );\n }\n\n public listBySerial(serialId: number): Promise<ChunkRecord[]> {\n return Promise.resolve(\n this.#chunks.filter((chunk) => chunk.sentenceId[0] === serialId),\n );\n }\n\n public getMaxId(): Promise<number> {\n return Promise.resolve(\n this.#chunks.reduce((maxId, chunk) => Math.max(maxId, chunk.id), 0),\n );\n }\n\n public listFragmentPairs(): Promise<\n ReadonlyArray<readonly [number, number]>\n > {\n const pairs = new Set<string>();\n\n for (const chunk of this.#chunks) {\n pairs.add(`${chunk.sentenceId[0]}:${chunk.sentenceId[1]}`);\n }\n\n return Promise.resolve(\n [...pairs]\n .map((pair) => pair.split(\":\").map(Number) as [number, number])\n .sort(comparePair)\n .map(([serialId, fragmentId]) => [serialId, fragmentId] as const),\n );\n }\n}\n\nclass SnapshotReadingEdgeStore implements ReadonlyReadingEdgeStore {\n readonly #edges: readonly ReadingEdgeRecord[];\n readonly #serialIdByChunkId: Map<number, number>;\n\n public constructor(\n edges: readonly ReadingEdgeRecord[],\n chunks: readonly ChunkRecord[],\n ) {\n this.#edges = [...edges].sort(compareReadingEdge);\n this.#serialIdByChunkId = new Map(\n chunks.map((chunk) => [chunk.id, chunk.sentenceId[0]]),\n );\n }\n\n public listAll(): Promise<ReadingEdgeRecord[]> {\n return Promise.resolve([...this.#edges]);\n }\n\n public countAll(): Promise<number> {\n return Promise.resolve(this.#edges.length);\n }\n\n public listBySerial(serialId: number): Promise<ReadingEdgeRecord[]> {\n return Promise.resolve(\n this.#edges.filter(\n (edge) =>\n this.#serialIdByChunkId.get(edge.fromId) === serialId &&\n this.#serialIdByChunkId.get(edge.toId) === serialId,\n ),\n );\n }\n\n public listIncoming(chunkId: number): Promise<ReadingEdgeRecord[]> {\n return Promise.resolve(this.#edges.filter((edge) => edge.toId === chunkId));\n }\n\n public listOutgoing(chunkId: number): Promise<ReadingEdgeRecord[]> {\n return Promise.resolve(\n this.#edges.filter((edge) => edge.fromId === chunkId),\n );\n }\n}\n\nclass SnapshotSnakeStore implements ReadonlySnakeStore {\n readonly #snakes: readonly SnakeRecord[];\n readonly #snakesById: Map<number, SnakeRecord>;\n\n public constructor(snakes: readonly SnakeRecord[]) {\n this.#snakes = [...snakes].sort(compareSnake);\n this.#snakesById = new Map(snakes.map((snake) => [snake.id, snake]));\n }\n\n public getById(snakeId: number): Promise<SnakeRecord | undefined> {\n return Promise.resolve(this.#snakesById.get(snakeId));\n }\n\n public listIdsByGroup(serialId: number, groupId: number): Promise<number[]> {\n return Promise.resolve(\n this.#snakes\n .filter(\n (snake) => snake.serialId === serialId && snake.groupId === groupId,\n )\n .map((snake) => snake.id)\n .sort(compareNumber),\n );\n }\n\n public listBySerial(serialId: number): Promise<SnakeRecord[]> {\n return Promise.resolve(\n this.#snakes.filter((snake) => snake.serialId === serialId),\n );\n }\n}\n\nclass SnapshotSnakeChunkStore implements ReadonlySnakeChunkStore {\n readonly #snakeChunks: readonly SnakeChunkRecord[];\n\n public constructor(snakeChunks: readonly SnakeChunkRecord[]) {\n this.#snakeChunks = [...snakeChunks].sort(compareSnakeChunk);\n }\n\n public listChunkIds(snakeId: number): Promise<number[]> {\n return Promise.resolve(\n this.#snakeChunks\n .filter((snakeChunk) => snakeChunk.snakeId === snakeId)\n .map((snakeChunk) => snakeChunk.chunkId),\n );\n }\n\n public listBySnake(snakeId: number): Promise<SnakeChunkRecord[]> {\n return Promise.resolve(\n this.#snakeChunks.filter((snakeChunk) => snakeChunk.snakeId === snakeId),\n );\n }\n}\n\nclass SnapshotSnakeEdgeStore implements ReadonlySnakeEdgeStore {\n readonly #edges: readonly SnakeEdgeRecord[];\n readonly #serialIdBySnakeId: Map<number, number>;\n\n public constructor(\n edges: readonly SnakeEdgeRecord[],\n snakes: readonly SnakeRecord[],\n ) {\n this.#edges = [...edges].sort(compareSnakeEdge);\n this.#serialIdBySnakeId = new Map(\n snakes.map((snake) => [snake.id, snake.serialId]),\n );\n }\n\n public listIncoming(snakeId: number): Promise<SnakeEdgeRecord[]> {\n return Promise.resolve(\n this.#edges.filter((edge) => edge.toSnakeId === snakeId),\n );\n }\n\n public listOutgoing(snakeId: number): Promise<SnakeEdgeRecord[]> {\n return Promise.resolve(\n this.#edges.filter((edge) => edge.fromSnakeId === snakeId),\n );\n }\n\n public listWithin(snakeIds: readonly number[]): Promise<SnakeEdgeRecord[]> {\n const snakeIdSet = new Set(snakeIds);\n\n return Promise.resolve(\n this.#edges.filter(\n (edge) =>\n snakeIdSet.has(edge.fromSnakeId) && snakeIdSet.has(edge.toSnakeId),\n ),\n );\n }\n\n public listBySerial(serialId: number): Promise<SnakeEdgeRecord[]> {\n return Promise.resolve(\n this.#edges.filter(\n (edge) =>\n this.#serialIdBySnakeId.get(edge.fromSnakeId) === serialId &&\n this.#serialIdBySnakeId.get(edge.toSnakeId) === serialId,\n ),\n );\n }\n}\n\nclass SnapshotFragmentGroupStore implements ReadonlyFragmentGroupStore {\n readonly #groups: readonly SentenceGroupRecord[];\n\n public constructor(groups: readonly SentenceGroupRecord[]) {\n this.#groups = [...groups].sort(compareFragmentGroup);\n }\n\n public listBySerial(serialId: number): Promise<SentenceGroupRecord[]> {\n return Promise.resolve(\n this.#groups.filter((group) => group.serialId === serialId),\n );\n }\n\n public listSerialIds(): Promise<number[]> {\n return Promise.resolve(\n [...new Set(this.#groups.map((group) => group.serialId))].sort(\n compareNumber,\n ),\n );\n }\n\n public listGroupIdsForSerial(serialId: number): Promise<number[]> {\n return Promise.resolve(\n [\n ...new Set(\n this.#groups\n .filter((group) => group.serialId === serialId)\n .map((group) => group.groupId),\n ),\n ].sort(compareNumber),\n );\n }\n}\n\nasync function copySnakes(\n sourceDocument: ReadonlyDocument,\n targetDocument: Document,\n serialId: number,\n chunkIdMap: ReadonlyMap<number, number>,\n): Promise<void> {\n const sourceSnakes = await sourceDocument.snakes.listBySerial(serialId);\n const snakeIdMap = new Map<number, number>();\n\n for (const sourceSnake of sourceSnakes) {\n const targetSnakeId = await targetDocument.snakes.create({\n firstLabel: sourceSnake.firstLabel,\n groupId: sourceSnake.groupId,\n lastLabel: sourceSnake.lastLabel,\n localSnakeId: sourceSnake.localSnakeId,\n serialId,\n size: sourceSnake.size,\n weight: sourceSnake.weight,\n wordsCount: sourceSnake.wordsCount,\n });\n\n snakeIdMap.set(sourceSnake.id, targetSnakeId);\n\n for (const snakeChunk of await sourceDocument.snakeChunks.listBySnake(\n sourceSnake.id,\n )) {\n const chunkId = chunkIdMap.get(snakeChunk.chunkId);\n\n if (chunkId === undefined) {\n continue;\n }\n\n await targetDocument.snakeChunks.save({\n chunkId,\n position: snakeChunk.position,\n snakeId: targetSnakeId,\n });\n }\n }\n\n for (const edge of await sourceDocument.snakeEdges.listBySerial(serialId)) {\n const fromSnakeId = snakeIdMap.get(edge.fromSnakeId);\n const toSnakeId = snakeIdMap.get(edge.toSnakeId);\n\n if (fromSnakeId === undefined || toSnakeId === undefined) {\n continue;\n }\n\n await targetDocument.snakeEdges.save({\n fromSnakeId,\n toSnakeId,\n weight: edge.weight,\n });\n }\n}\n\nasync function copyChunks(\n sourceDocument: ReadonlyDocument,\n targetDocument: Document,\n serialId: number,\n): Promise<ReadonlyMap<number, number>> {\n const chunkIdMap = new Map<number, number>();\n\n for (const chunk of await sourceDocument.chunks.listBySerial(serialId)) {\n const createdChunk = await targetDocument.chunks.create({\n content: chunk.content,\n generation: chunk.generation,\n label: chunk.label,\n sentenceId: chunk.sentenceId,\n sentenceIds: chunk.sentenceIds,\n weight: chunk.weight,\n wordsCount: chunk.wordsCount,\n ...(chunk.importance === undefined\n ? {}\n : { importance: chunk.importance }),\n ...(chunk.retention === undefined ? {} : { retention: chunk.retention }),\n });\n\n chunkIdMap.set(chunk.id, createdChunk.id);\n }\n\n return chunkIdMap;\n}\n\nasync function requireStage(\n document: ReadonlyDocument,\n chapterId: number,\n stage: ChapterDetails[\"stage\"],\n): Promise<void> {\n const details = await getChapterDetails(document, chapterId);\n\n if (details.stage !== stage) {\n throw new Error(\n `Chapter ${chapterId} is ${details.stage}. Expected ${stage} before committing build output.`,\n );\n }\n}\n\nfunction createTopologyOptions(\n options: Pick<\n BuildSerialTopologyOptions,\n \"extractionPrompt\" | \"userLanguage\"\n >,\n): BuildSerialTopologyOptions {\n return {\n extractionPrompt: options.extractionPrompt,\n ...(options.userLanguage === undefined\n ? {}\n : { userLanguage: options.userLanguage }),\n };\n}\n\nfunction createGraphBuildParameterInput(\n options: Pick<\n BuildSerialTopologyOptions,\n \"extractionPrompt\" | \"userLanguage\"\n >,\n): GraphBuildParameterInput {\n const language = normalizeLanguageCode(options.userLanguage);\n\n return {\n ...(language === undefined ? {} : { language }),\n prompt: options.extractionPrompt,\n };\n}\n\nasync function* readChapterSource(\n document: ReadonlyDocument,\n chapterId: number,\n): ReaderTextStream {\n const fragments = document.getSerialFragments(chapterId);\n\n for (const fragmentId of await fragments.listFragmentIds()) {\n const fragment = await fragments.getFragment(fragmentId);\n\n for (const sentence of fragment.sentences) {\n yield sentence.text;\n }\n }\n}\n\nasync function collectReaderText(\n stream: ReaderTextStream,\n): Promise<readonly string[]> {\n const text: string[] = [];\n\n for await (const chunk of stream) {\n text.push(chunk);\n }\n\n return text;\n}\n\nfunction compareNumber(left: number, right: number): number {\n return left - right;\n}\n\nfunction createFragmentStartIndexesBySerialId(\n fragments: readonly FragmentRecord[],\n): ReadonlyMap<number, readonly number[]> {\n const indexesBySerialId = new Map<number, number[]>();\n\n for (const fragment of fragments) {\n const indexes = indexesBySerialId.get(fragment.serialId) ?? [];\n\n indexes.push(fragment.fragmentId);\n indexesBySerialId.set(fragment.serialId, indexes);\n }\n\n return new Map(\n [...indexesBySerialId.entries()].map(\n ([serialId, indexes]) => [serialId, indexes.sort(compareNumber)] as const,\n ),\n );\n}\n\nfunction createSegmentRanges(\n allStartIndexes: readonly number[],\n selectedStartIndexes: readonly number[],\n): Array<{\n readonly endSentenceIndex: number;\n readonly startSentenceIndex: number;\n}> {\n const selected = new Set(selectedStartIndexes);\n\n return allStartIndexes.flatMap((startSentenceIndex, index) => {\n if (!selected.has(startSentenceIndex)) {\n return [];\n }\n\n const nextStartSentenceIndex = allStartIndexes[index + 1];\n\n return [\n {\n endSentenceIndex:\n nextStartSentenceIndex === undefined\n ? Infinity\n : nextStartSentenceIndex - 1,\n startSentenceIndex,\n },\n ];\n });\n}\n\nfunction compareChunkById(left: ChunkRecord, right: ChunkRecord): number {\n return left.id - right.id;\n}\n\nfunction compareFragmentGroup(\n left: SentenceGroupRecord,\n right: SentenceGroupRecord,\n): number {\n return (\n left.serialId - right.serialId ||\n left.groupId - right.groupId ||\n left.startSentenceIndex - right.startSentenceIndex ||\n left.endSentenceIndex - right.endSentenceIndex\n );\n}\n\nfunction compareReadingEdge(\n left: ReadingEdgeRecord,\n right: ReadingEdgeRecord,\n): number {\n return left.fromId - right.fromId || left.toId - right.toId;\n}\n\nfunction comparePair(\n left: readonly [number, number],\n right: readonly [number, number],\n): number {\n return left[0] - right[0] || left[1] - right[1];\n}\n\nfunction compareSnake(left: SnakeRecord, right: SnakeRecord): number {\n return left.groupId - right.groupId || left.id - right.id;\n}\n\nfunction compareSnakeChunk(\n left: SnakeChunkRecord,\n right: SnakeChunkRecord,\n): number {\n return left.snakeId - right.snakeId || left.position - right.position;\n}\n\nfunction compareSnakeEdge(\n left: SnakeEdgeRecord,\n right: SnakeEdgeRecord,\n): number {\n return (\n left.fromSnakeId - right.fromSnakeId || left.toSnakeId - right.toSnakeId\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,168 @@
1
+ import { Document, ReadonlyDocument } from '../document/document.js';
2
+ import { Language } from '../common/language.js';
3
+ import { WikiGraphScope } from '../common/llm-scope.js';
4
+ import { LLM } from '../llm/client.js';
5
+ import { ReaderTextStream } from '../reader/types.js';
6
+ import { SerialProgressSink } from '../serial.js';
7
+ import '../source/meta.js';
8
+ import 'zod';
9
+ import '../source/toc.js';
10
+ import '../source/types.js';
11
+ import '../document/database.js';
12
+ import 'sqlite3';
13
+ import '../document/text-streams.js';
14
+ import '../document/types.js';
15
+ import '../document/stores.js';
16
+ import '../llm/context.js';
17
+ import '../llm/cache.js';
18
+ import '../llm/types.js';
19
+ import 'ai';
20
+ import '../reader/attention/attention.js';
21
+ import '../reader/chunk-batch/types.js';
22
+ import '../reader/segment/types.js';
23
+
24
+ declare const CHAPTER_STAGES: readonly ["planned", "sourced", "graphed", "summarized"];
25
+ type ChapterStage = (typeof CHAPTER_STAGES)[number];
26
+ interface ChapterEntry {
27
+ readonly chapterId: number;
28
+ readonly childCount: number;
29
+ readonly depth: number;
30
+ readonly documentOrder: number;
31
+ readonly fragmentCount: number;
32
+ readonly stage: ChapterStage;
33
+ readonly title: string | null;
34
+ readonly tocPath: readonly string[];
35
+ readonly words: number;
36
+ }
37
+ interface ChapterDetails extends ChapterEntry {
38
+ readonly graphReady: boolean;
39
+ readonly hasSummary: boolean;
40
+ readonly words: number;
41
+ }
42
+ interface ChapterTree {
43
+ readonly chapters: readonly ChapterTreeNode[];
44
+ }
45
+ interface ChapterTreeNode {
46
+ readonly children: readonly ChapterTreeNode[];
47
+ readonly id: number;
48
+ readonly title: string | null;
49
+ }
50
+ interface ChapterTreeInput {
51
+ readonly chapters: readonly ChapterTreeInputNode[];
52
+ }
53
+ interface ChapterTreeInputNode {
54
+ readonly children: readonly ChapterTreeInputNode[];
55
+ readonly id: number;
56
+ readonly title?: string | null | undefined;
57
+ }
58
+ interface ChapterTreeApplyResult {
59
+ readonly changed: boolean;
60
+ readonly moved: readonly ChapterTreeMoveChange[];
61
+ readonly renamed: readonly ChapterTreeTitleChange[];
62
+ readonly unchanged: number;
63
+ }
64
+ interface ChapterTreeMoveChange {
65
+ readonly chapterId: number;
66
+ readonly newIndex: number;
67
+ readonly newParentChapterId: number | null;
68
+ readonly newPath: readonly string[];
69
+ readonly oldIndex: number;
70
+ readonly oldParentChapterId: number | null;
71
+ readonly oldPath: readonly string[];
72
+ }
73
+ interface ChapterTreeTitleChange {
74
+ readonly chapterId: number;
75
+ readonly newTitle: string | null;
76
+ readonly oldTitle: string | null;
77
+ }
78
+ interface MoveChapterOptions {
79
+ readonly afterChapterId?: number;
80
+ readonly beforeChapterId?: number;
81
+ readonly first?: boolean;
82
+ readonly last?: boolean;
83
+ readonly parentChapterId?: number;
84
+ readonly root?: boolean;
85
+ }
86
+ interface AdvanceChapterStagesOptions {
87
+ readonly chapterId?: number;
88
+ readonly extractionPrompt: string;
89
+ readonly llm: LLM<WikiGraphScope>;
90
+ readonly logDirPath?: string;
91
+ readonly onProgress?: AdvanceChapterStagesProgressCallback;
92
+ readonly targetStage: ChapterStage;
93
+ readonly userLanguage?: Language;
94
+ }
95
+ interface AdvanceChapterStagesProgressState {
96
+ readonly graphWords: number;
97
+ readonly summaryWords: number;
98
+ readonly totalGraphWords: number;
99
+ readonly totalSummaryWords: number;
100
+ }
101
+ type AdvanceChapterStagesProgressCallback = (event: AdvanceChapterStagesProgressEvent) => void | Promise<void>;
102
+ type AdvanceChapterStagesProgressEvent = {
103
+ readonly type: "selected";
104
+ readonly state: AdvanceChapterStagesProgressState;
105
+ readonly targetStage: ChapterStage;
106
+ readonly totalChapters: number;
107
+ } | {
108
+ readonly type: "skipped";
109
+ readonly chapter: ChapterEntry;
110
+ readonly reason: "planned";
111
+ readonly targetStage: ChapterStage;
112
+ } | {
113
+ readonly type: "progress";
114
+ readonly state: AdvanceChapterStagesProgressState;
115
+ readonly targetStage: ChapterStage;
116
+ } | {
117
+ readonly type: "started";
118
+ readonly chapter: ChapterEntry;
119
+ readonly step: "graph" | "summary";
120
+ readonly targetStage: ChapterStage;
121
+ } | {
122
+ readonly type: "completed";
123
+ readonly chapter: ChapterEntry;
124
+ readonly step: "graph" | "summary";
125
+ readonly targetStage: ChapterStage;
126
+ };
127
+ interface AdvanceChapterStagesResult {
128
+ readonly advanced: readonly ChapterEntry[];
129
+ readonly pending: readonly ChapterEntry[];
130
+ readonly skipped: readonly ChapterEntry[];
131
+ }
132
+ interface AddChapterOptions {
133
+ readonly parentChapterId?: number;
134
+ readonly title?: string | null | undefined;
135
+ }
136
+ declare function parseChapterTreeInput(input: unknown): ChapterTreeInput;
137
+ interface GenerateChapterGraphOptions {
138
+ readonly extractionPrompt: string;
139
+ readonly llm: LLM<WikiGraphScope>;
140
+ readonly logDirPath?: string;
141
+ readonly progressTracker?: SerialProgressSink;
142
+ readonly userLanguage?: Language;
143
+ }
144
+ interface GenerateChapterSummaryOptions {
145
+ readonly llm: LLM<WikiGraphScope>;
146
+ readonly logDirPath?: string;
147
+ readonly userLanguage?: Language;
148
+ }
149
+ declare function advanceChapterStages(document: Document, options: AdvanceChapterStagesOptions): Promise<AdvanceChapterStagesResult>;
150
+ declare function addChapter(document: Document, options: AddChapterOptions): Promise<ChapterDetails>;
151
+ declare function generateChapterGraph(document: Document, chapterId: number, options: GenerateChapterGraphOptions): Promise<ChapterDetails>;
152
+ declare function generateChapterSummary(document: Document, chapterId: number, options: GenerateChapterSummaryOptions): Promise<ChapterDetails>;
153
+ declare function getChapterDetails(document: ReadonlyDocument, chapterId: number): Promise<ChapterDetails>;
154
+ declare function listChapters(document: ReadonlyDocument): Promise<readonly ChapterEntry[]>;
155
+ declare function getChapterTree(document: ReadonlyDocument): Promise<ChapterTree>;
156
+ declare function applyChapterTree(document: Document, tree: ChapterTreeInput, options?: {
157
+ readonly dryRun?: boolean;
158
+ }): Promise<ChapterTreeApplyResult>;
159
+ declare function moveChapter(document: Document, chapterId: number, options: MoveChapterOptions): Promise<ChapterDetails>;
160
+ declare function removeChapter(document: Document, chapterId: number, options?: {
161
+ readonly recursive?: boolean;
162
+ }): Promise<void>;
163
+ declare function resetChapter(document: Document, chapterId: number, stage: Exclude<ChapterStage, "summarized">): Promise<ChapterDetails>;
164
+ declare function setChapterSource(document: Document, chapterId: number, stream: ReaderTextStream): Promise<ChapterDetails>;
165
+ declare function setChapterSummary(document: Document, chapterId: number, summary: string): Promise<ChapterDetails>;
166
+ declare function setChapterTitle(document: Document, chapterId: number, title: string | null | undefined): Promise<ChapterDetails>;
167
+
168
+ export { type AddChapterOptions, type AdvanceChapterStagesOptions, type AdvanceChapterStagesProgressCallback, type AdvanceChapterStagesProgressEvent, type AdvanceChapterStagesProgressState, type AdvanceChapterStagesResult, CHAPTER_STAGES, type ChapterDetails, type ChapterEntry, type ChapterStage, type ChapterTree, type ChapterTreeApplyResult, type ChapterTreeInput, type ChapterTreeInputNode, type ChapterTreeMoveChange, type ChapterTreeNode, type ChapterTreeTitleChange, type GenerateChapterGraphOptions, type GenerateChapterSummaryOptions, type MoveChapterOptions, addChapter, advanceChapterStages, applyChapterTree, generateChapterGraph, generateChapterSummary, getChapterDetails, getChapterTree, listChapters, moveChapter, parseChapterTreeInput, removeChapter, resetChapter, setChapterSource, setChapterSummary, setChapterTitle };