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,89 @@
1
+ import { Language } from './common/language.js';
2
+ import { WikiGraphScope } from './common/llm-scope.js';
3
+ import { LLM } from './llm/client.js';
4
+ import { ChunkRecord, ReadingEdgeRecord, SentenceGroupRecord, SnakeChunkRecord, SnakeEdgeRecord, SnakeRecord } from './document/types.js';
5
+ import { ReadonlyDocument, Document } from './document/document.js';
6
+ import { ReaderSegmenter, ReaderTextStream } from './reader/types.js';
7
+ import './llm/context.js';
8
+ import './llm/cache.js';
9
+ import './llm/types.js';
10
+ import 'ai';
11
+ import './source/meta.js';
12
+ import 'zod';
13
+ import './source/toc.js';
14
+ import './source/types.js';
15
+ import './document/database.js';
16
+ import 'sqlite3';
17
+ import './document/text-streams.js';
18
+ import './document/stores.js';
19
+ import './reader/attention/attention.js';
20
+ import './reader/chunk-batch/types.js';
21
+ import './reader/segment/types.js';
22
+
23
+ interface GenerateSerialOptions {
24
+ readonly extractionPrompt: string;
25
+ readonly userLanguage?: Language;
26
+ }
27
+ type BuildSerialTopologyOptions = GenerateSerialOptions;
28
+ interface BuildSerialSummaryOptions {
29
+ readonly userLanguage?: Language;
30
+ }
31
+ interface WriteSerialSourceOptions {
32
+ readonly segmenter?: ReaderSegmenter;
33
+ }
34
+ interface SerialDiscovery {
35
+ readonly fragments: number;
36
+ readonly words: number;
37
+ }
38
+ interface SerialProgressSink {
39
+ begin?(input?: {
40
+ readonly fragments: number;
41
+ readonly words: number;
42
+ }): Promise<void>;
43
+ advance(wordsCount: number): Promise<void>;
44
+ complete(finalWordsCount?: number): Promise<void>;
45
+ }
46
+ type CreateSerialOptions = GenerateSerialOptions;
47
+ interface SerialGenerationOptions {
48
+ readonly document?: Document;
49
+ readonly llm: LLM<WikiGraphScope>;
50
+ readonly logDirPath?: string;
51
+ readonly segmenter?: ReaderSegmenter;
52
+ /** @deprecated Use `document` instead. */
53
+ readonly workspace?: Document;
54
+ }
55
+ type SerialHubOptions = SerialGenerationOptions;
56
+ declare function discoverSerial(input: {
57
+ readonly segmenter?: ReaderSegmenter;
58
+ readonly stream: ReaderTextStream;
59
+ }): Promise<SerialDiscovery>;
60
+ declare function writeSerialSource(document: Document, serialId: number, stream: ReaderTextStream, options?: WriteSerialSourceOptions): Promise<void>;
61
+ declare class SerialGeneration {
62
+ #private;
63
+ constructor(options: SerialGenerationOptions);
64
+ generate(stream: ReaderTextStream, options: GenerateSerialOptions, progressTracker?: SerialProgressSink): Promise<Serial>;
65
+ create(stream: ReaderTextStream, options: GenerateSerialOptions): Promise<Serial>;
66
+ generateInto(serialId: number, stream: ReaderTextStream, options: GenerateSerialOptions, progressTracker?: SerialProgressSink): Promise<Serial>;
67
+ buildTopologyInto(serialId: number, options: BuildSerialTopologyOptions, progressTracker?: SerialProgressSink): Promise<void>;
68
+ buildSummary(serialId: number, options?: BuildSerialSummaryOptions): Promise<Serial>;
69
+ }
70
+ declare class Serial {
71
+ #private;
72
+ constructor(document: ReadonlyDocument, serialId: number, summary: string);
73
+ get id(): number;
74
+ getSummary(): string;
75
+ getTopology(): SerialTopology;
76
+ }
77
+ declare class SerialTopology {
78
+ #private;
79
+ constructor(document: ReadonlyDocument, serialId: number);
80
+ listChunks(): Promise<readonly ChunkRecord[]>;
81
+ listEdges(): Promise<readonly ReadingEdgeRecord[]>;
82
+ listGroups(): Promise<readonly SentenceGroupRecord[]>;
83
+ listSnakeChunks(snakeId: number): Promise<readonly SnakeChunkRecord[]>;
84
+ listSnakeEdges(): Promise<readonly SnakeEdgeRecord[]>;
85
+ listSnakes(): Promise<readonly SnakeRecord[]>;
86
+ }
87
+ declare function readSerial(document: ReadonlyDocument, serialId: number): Promise<Serial>;
88
+
89
+ export { type BuildSerialSummaryOptions, type BuildSerialTopologyOptions, type CreateSerialOptions, type GenerateSerialOptions, Serial, type SerialDiscovery, SerialGeneration, type SerialGenerationOptions, type SerialHubOptions, type SerialProgressSink, SerialTopology, type WriteSerialSourceOptions, discoverSerial, readSerial, writeSerialSource };
package/dist/serial.js ADDED
@@ -0,0 +1,476 @@
1
+ import { AsyncSemaphore } from "./utils/async-semaphore.js";
2
+ import {
3
+ WIKI_GRAPH_EDITOR_SCOPES,
4
+ WIKI_GRAPH_READER_SCOPES
5
+ } from "./common/llm-scope.js";
6
+ import { Reader, segmentTextStream } from "./reader/index.js";
7
+ import { compressText } from "./editor/index.js";
8
+ import { Topology } from "./topology/index.js";
9
+ const DEFAULT_COMPRESSION_RATIO = 0.2;
10
+ const DEFAULT_FRAGMENT_WORDS_COUNT = 320;
11
+ const DEFAULT_GENERATION_DECAY_FACTOR = 0.5;
12
+ const DEFAULT_GROUP_WORDS_COUNT = 3840;
13
+ const DEFAULT_MAX_CLUES = 10;
14
+ const DEFAULT_MAX_ITERATIONS = 5;
15
+ const DEFAULT_WORKING_MEMORY_CAPACITY = 7;
16
+ async function discoverSerial(input) {
17
+ let fragments = 0;
18
+ let words = 0;
19
+ for await (const fragment of streamFragments({
20
+ maxWordsCount: DEFAULT_FRAGMENT_WORDS_COUNT,
21
+ stream: segmentTextStream(input.stream, {
22
+ ...input.segmenter === void 0 ? {} : { adapter: input.segmenter }
23
+ })
24
+ })) {
25
+ fragments += 1;
26
+ words += countFragmentWords(fragment.sentences);
27
+ }
28
+ return {
29
+ fragments,
30
+ words
31
+ };
32
+ }
33
+ async function writeSerialSource(document, serialId, stream, options = {}) {
34
+ const serialFragments = document.getSerialFragments(serialId);
35
+ await serialFragments.writeTextStream(await collectTextStream(stream), {
36
+ ...options.segmenter === void 0 ? {} : { segmenter: options.segmenter }
37
+ });
38
+ await document.serials.bumpRevision(serialId);
39
+ }
40
+ class SerialGeneration {
41
+ #fragmentWordsCount = DEFAULT_FRAGMENT_WORDS_COUNT;
42
+ #fragmentGroups;
43
+ #idSemaphore = new AsyncSemaphore(1);
44
+ #llm;
45
+ #logDirPath;
46
+ #serials;
47
+ #segmenter;
48
+ #document;
49
+ #writeSemaphore = new AsyncSemaphore(1);
50
+ #nextChunkId = 1;
51
+ constructor(options) {
52
+ const document = resolveDocument(options);
53
+ this.#fragmentGroups = document.fragmentGroups;
54
+ this.#llm = options.llm;
55
+ this.#logDirPath = options.logDirPath;
56
+ this.#serials = document.serials;
57
+ this.#segmenter = options.segmenter;
58
+ this.#document = document;
59
+ }
60
+ async generate(stream, options, progressTracker) {
61
+ const serialId = await this.#createSerialId();
62
+ await writeSerialSource(this.#document, serialId, stream, {
63
+ ...this.#segmenter === void 0 ? {} : { segmenter: this.#segmenter }
64
+ });
65
+ return await this.#generatePrepared(serialId, options, progressTracker);
66
+ }
67
+ async create(stream, options) {
68
+ return await this.generate(stream, options);
69
+ }
70
+ async generateInto(serialId, stream, options, progressTracker) {
71
+ await this.#createExplicitSerialId(serialId);
72
+ await writeSerialSource(this.#document, serialId, stream, {
73
+ ...this.#segmenter === void 0 ? {} : { segmenter: this.#segmenter }
74
+ });
75
+ return await this.#generatePrepared(serialId, options, progressTracker);
76
+ }
77
+ async buildTopologyInto(serialId, options, progressTracker) {
78
+ await this.#buildTopology(
79
+ serialId,
80
+ options.extractionPrompt,
81
+ options.userLanguage,
82
+ progressTracker
83
+ );
84
+ }
85
+ async buildSummary(serialId, options = {}) {
86
+ const summary = await this.#buildSummary(serialId, options.userLanguage);
87
+ return new Serial(this.#document, serialId, summary);
88
+ }
89
+ async #generatePrepared(serialId, options, progressTracker) {
90
+ await this.#buildTopology(
91
+ serialId,
92
+ options.extractionPrompt,
93
+ options.userLanguage,
94
+ progressTracker
95
+ );
96
+ const summary = await this.#buildSummary(serialId, options.userLanguage);
97
+ await progressTracker?.complete();
98
+ return new Serial(this.#document, serialId, summary);
99
+ }
100
+ async #allocateChunkId() {
101
+ return await this.#idSemaphore.use(() => {
102
+ const chunkId = this.#nextChunkId;
103
+ this.#nextChunkId += 1;
104
+ return chunkId;
105
+ });
106
+ }
107
+ async #buildSummary(serialId, userLanguage) {
108
+ const record = await getSerialRecord(this.#document, serialId);
109
+ if (!record.topologyReady) {
110
+ throw new Error(`Serial ${serialId} is not ready for summary`);
111
+ }
112
+ const existingSummary = await this.#document.readSummary(serialId);
113
+ if (existingSummary !== void 0) {
114
+ return existingSummary;
115
+ }
116
+ const serialFragments = this.#getSerialFragments(serialId);
117
+ const fragmentIds = await serialFragments.listFragmentIds();
118
+ if (fragmentIds.length <= 1) {
119
+ const summary2 = await readSerialPassthroughSummary(
120
+ serialFragments,
121
+ fragmentIds
122
+ );
123
+ await this.#writeSemaphore.use(
124
+ async () => await this.#document.writeSummary(serialId, summary2)
125
+ );
126
+ return summary2;
127
+ }
128
+ const groupIds = await this.#fragmentGroups.listGroupIdsForSerial(serialId);
129
+ const summaryParts = [];
130
+ for (const groupId of groupIds) {
131
+ const groupSummary = await compressText({
132
+ ...this.#createEditorOptions({
133
+ groupId,
134
+ serialId,
135
+ userLanguage
136
+ })
137
+ });
138
+ if (groupSummary.trim() === "") {
139
+ continue;
140
+ }
141
+ summaryParts.push(groupSummary);
142
+ }
143
+ const summary = summaryParts.join("\n\n");
144
+ await this.#writeSemaphore.use(
145
+ async () => await this.#document.writeSummary(serialId, summary)
146
+ );
147
+ return summary;
148
+ }
149
+ async #buildTopology(serialId, extractionPrompt, userLanguage, progressTracker) {
150
+ const reader = new Reader({
151
+ attention: {
152
+ capacity: DEFAULT_WORKING_MEMORY_CAPACITY,
153
+ generationDecayFactor: DEFAULT_GENERATION_DECAY_FACTOR,
154
+ idGenerator: async () => await this.#allocateChunkId()
155
+ },
156
+ extractionGuidance: extractionPrompt,
157
+ llm: this.#llm,
158
+ scopes: WIKI_GRAPH_READER_SCOPES,
159
+ sentenceTextSource: this.#document,
160
+ ...this.#segmenter === void 0 ? {} : {
161
+ segmenter: this.#segmenter
162
+ },
163
+ ...userLanguage === void 0 ? {} : {
164
+ userLanguage
165
+ }
166
+ });
167
+ const topology = new Topology(
168
+ this.#document,
169
+ serialId,
170
+ DEFAULT_GROUP_WORDS_COUNT
171
+ );
172
+ const allChunks = [];
173
+ const successorIdsByChunkId = createNumberListRecord();
174
+ const serialFragments = this.#document.getSerialFragments(serialId);
175
+ for (const fragment of await listSerialProcessingFragments(
176
+ serialFragments,
177
+ this.#fragmentWordsCount
178
+ )) {
179
+ const wordsCount = countFragmentWords(fragment.sentences);
180
+ await this.#processFragment({
181
+ allChunks,
182
+ fragment: {
183
+ startSentenceIndex: fragment.startSentenceIndex,
184
+ sentences: fragment.sentences
185
+ },
186
+ reader,
187
+ serialId,
188
+ successorIdsByChunkId,
189
+ topology
190
+ });
191
+ await progressTracker?.advance(wordsCount);
192
+ }
193
+ await this.#writeSemaphore.use(async () => {
194
+ await topology.finalize();
195
+ await this.#serials.setTopologyReady(serialId);
196
+ await this.#serials.bumpRevision(serialId);
197
+ });
198
+ }
199
+ async #processFragment(input) {
200
+ const sentences = input.fragment.sentences.map((sentence, index) => ({
201
+ sentenceId: [
202
+ input.serialId,
203
+ input.fragment.startSentenceIndex + index
204
+ ],
205
+ text: sentence.text,
206
+ wordsCount: sentence.wordsCount
207
+ }));
208
+ const fragmentText = sentences.map((sentence) => sentence.text).join(" ");
209
+ const userFocused = await input.reader.extractUserFocused({
210
+ sentences,
211
+ text: fragmentText
212
+ });
213
+ const bookCoherence = await input.reader.extractBookCoherence({
214
+ sentences,
215
+ text: fragmentText,
216
+ userFocusedChunks: userFocused.delta.chunks
217
+ });
218
+ saveDelta(
219
+ input.allChunks,
220
+ input.successorIdsByChunkId,
221
+ input.topology,
222
+ userFocused.delta
223
+ );
224
+ saveDelta(
225
+ input.allChunks,
226
+ input.successorIdsByChunkId,
227
+ input.topology,
228
+ bookCoherence
229
+ );
230
+ input.reader.completeFragment({
231
+ allChunks: input.allChunks,
232
+ getSuccessorChunkIds: (chunkId) => input.successorIdsByChunkId[String(chunkId)] ?? []
233
+ });
234
+ }
235
+ async #createSerialId() {
236
+ return await this.#idSemaphore.use(
237
+ async () => await this.#serials.create()
238
+ );
239
+ }
240
+ async #createExplicitSerialId(serialId) {
241
+ await this.#idSemaphore.use(
242
+ async () => await this.#serials.createWithId(serialId)
243
+ );
244
+ }
245
+ #getSerialFragments(serialId) {
246
+ return this.#document.getSerialFragments(serialId);
247
+ }
248
+ #createEditorOptions(input) {
249
+ return {
250
+ compressionRatio: DEFAULT_COMPRESSION_RATIO,
251
+ groupId: input.groupId,
252
+ llm: this.#llm,
253
+ maxClues: DEFAULT_MAX_CLUES,
254
+ maxIterations: DEFAULT_MAX_ITERATIONS,
255
+ scopes: WIKI_GRAPH_EDITOR_SCOPES,
256
+ serialId: input.serialId,
257
+ document: this.#document,
258
+ ...this.#logDirPath === void 0 ? {} : {
259
+ logDirPath: this.#logDirPath
260
+ },
261
+ ...input.userLanguage === void 0 ? {} : {
262
+ userLanguage: input.userLanguage
263
+ }
264
+ };
265
+ }
266
+ }
267
+ class Serial {
268
+ #id;
269
+ #summary;
270
+ #topology;
271
+ constructor(document, serialId, summary) {
272
+ this.#id = serialId;
273
+ this.#summary = summary;
274
+ this.#topology = new SerialTopology(document, serialId);
275
+ }
276
+ get id() {
277
+ return this.#id;
278
+ }
279
+ getSummary() {
280
+ return this.#summary;
281
+ }
282
+ getTopology() {
283
+ return this.#topology;
284
+ }
285
+ }
286
+ class SerialTopology {
287
+ #chunks;
288
+ #fragmentGroups;
289
+ #readingEdges;
290
+ #serialId;
291
+ #snakeChunks;
292
+ #snakeEdges;
293
+ #snakes;
294
+ constructor(document, serialId) {
295
+ this.#chunks = document.chunks;
296
+ this.#fragmentGroups = document.fragmentGroups;
297
+ this.#readingEdges = document.readingEdges;
298
+ this.#serialId = serialId;
299
+ this.#snakeChunks = document.snakeChunks;
300
+ this.#snakeEdges = document.snakeEdges;
301
+ this.#snakes = document.snakes;
302
+ }
303
+ async listChunks() {
304
+ return await this.#chunks.listBySerial(this.#serialId);
305
+ }
306
+ async listEdges() {
307
+ return await this.#readingEdges.listBySerial(this.#serialId);
308
+ }
309
+ async listGroups() {
310
+ return await this.#fragmentGroups.listBySerial(this.#serialId);
311
+ }
312
+ async listSnakeChunks(snakeId) {
313
+ const snake = await this.#snakes.getById(snakeId);
314
+ if (snake === void 0 || snake.serialId !== this.#serialId) {
315
+ throw new Error(`Snake ${snakeId} does not belong to this serial`);
316
+ }
317
+ return await this.#snakeChunks.listBySnake(snakeId);
318
+ }
319
+ async listSnakeEdges() {
320
+ return await this.#snakeEdges.listBySerial(this.#serialId);
321
+ }
322
+ async listSnakes() {
323
+ return await this.#snakes.listBySerial(this.#serialId);
324
+ }
325
+ }
326
+ function appendSuccessor(successorIdsByChunkId, fromId, toId) {
327
+ const existingSuccessors = successorIdsByChunkId[String(fromId)] ?? [];
328
+ if (existingSuccessors.includes(toId)) {
329
+ return;
330
+ }
331
+ successorIdsByChunkId[String(fromId)] = [...existingSuccessors, toId].sort(
332
+ compareNumber
333
+ );
334
+ }
335
+ function compareNumber(left, right) {
336
+ return left - right;
337
+ }
338
+ function createNumberListRecord() {
339
+ return /* @__PURE__ */ Object.create(null);
340
+ }
341
+ async function readSerial(document, serialId) {
342
+ const record = await getSerialRecord(document, serialId);
343
+ if (!record.topologyReady) {
344
+ throw new Error(`Serial ${serialId} is not ready`);
345
+ }
346
+ const summary = await document.readSummary(serialId);
347
+ if (summary === void 0) {
348
+ throw new Error(
349
+ `Chapter ${serialId} summary is missing. Run \`wg wikg://local/job add --input <chapter-uri> --task reading-summary --accept-cost\` before export, or inspect the chapter with \`wg <archive-uri>/chapter/${serialId}/source get\`.`
350
+ );
351
+ }
352
+ return new Serial(document, serialId, summary);
353
+ }
354
+ function resolveDocument(options) {
355
+ const document = options.document ?? options.workspace;
356
+ if (document === void 0) {
357
+ throw new Error("SerialGeneration requires a document");
358
+ }
359
+ return document;
360
+ }
361
+ async function getSerialRecord(document, serialId) {
362
+ const record = await document.serials.getById(serialId);
363
+ if (record === void 0) {
364
+ throw new Error(
365
+ `Chapter ${serialId} does not exist. Use \`wg <archive-uri>/chapter list\` to discover chapter ids.`
366
+ );
367
+ }
368
+ return record;
369
+ }
370
+ function saveDelta(allChunks, successorIdsByChunkId, topology, delta) {
371
+ topology.accept(delta);
372
+ allChunks.push(...delta.chunks);
373
+ for (const edge of delta.edges) {
374
+ appendSuccessor(successorIdsByChunkId, edge.fromId, edge.toId);
375
+ }
376
+ }
377
+ async function* streamFragments(input) {
378
+ let currentSentences = [];
379
+ let currentWordsCount = 0;
380
+ for await (const sentence of input.stream) {
381
+ const sentenceText = sentence.text.trim();
382
+ if (sentenceText === "") {
383
+ continue;
384
+ }
385
+ if (currentSentences.length > 0 && currentWordsCount + sentence.wordsCount > input.maxWordsCount) {
386
+ yield {
387
+ sentences: currentSentences
388
+ };
389
+ currentSentences = [];
390
+ currentWordsCount = 0;
391
+ }
392
+ currentSentences.push({
393
+ text: sentenceText,
394
+ wordsCount: sentence.wordsCount
395
+ });
396
+ currentWordsCount += sentence.wordsCount;
397
+ }
398
+ if (currentSentences.length > 0) {
399
+ yield {
400
+ sentences: currentSentences
401
+ };
402
+ }
403
+ }
404
+ async function listSerialProcessingFragments(fragments, maxWordsCount) {
405
+ const sentences = fragments.listSentences === void 0 ? await listFragmentSentences(fragments) : await fragments.listSentences();
406
+ const batches = [];
407
+ let currentSentences = [];
408
+ let currentStartSentenceIndex = 0;
409
+ let currentWordsCount = 0;
410
+ for (let index = 0; index < sentences.length; index += 1) {
411
+ const sentence = sentences[index];
412
+ if (sentence === void 0 || sentence.text.trim() === "") {
413
+ continue;
414
+ }
415
+ if (currentSentences.length > 0 && currentWordsCount + sentence.wordsCount > maxWordsCount) {
416
+ batches.push({
417
+ startSentenceIndex: currentStartSentenceIndex,
418
+ sentences: currentSentences
419
+ });
420
+ currentSentences = [];
421
+ currentWordsCount = 0;
422
+ }
423
+ if (currentSentences.length === 0) {
424
+ currentStartSentenceIndex = index;
425
+ }
426
+ currentSentences.push(sentence);
427
+ currentWordsCount += sentence.wordsCount;
428
+ }
429
+ if (currentSentences.length > 0) {
430
+ batches.push({
431
+ startSentenceIndex: currentStartSentenceIndex,
432
+ sentences: currentSentences
433
+ });
434
+ }
435
+ return batches;
436
+ }
437
+ async function listFragmentSentences(fragments) {
438
+ const records = await Promise.all(
439
+ (await fragments.listFragmentIds()).map(
440
+ async (fragmentId) => await fragments.getFragment(fragmentId)
441
+ )
442
+ );
443
+ return records.sort((left, right) => left.fragmentId - right.fragmentId).flatMap((fragment) => fragment.sentences);
444
+ }
445
+ async function collectTextStream(stream) {
446
+ const parts = [];
447
+ for await (const chunk of stream) {
448
+ parts.push(chunk);
449
+ }
450
+ return parts.join("");
451
+ }
452
+ function countFragmentWords(sentences) {
453
+ return sentences.reduce((sum, sentence) => sum + sentence.wordsCount, 0);
454
+ }
455
+ async function readSerialPassthroughSummary(fragments, fragmentIds) {
456
+ if (fragmentIds.length === 0) {
457
+ return "";
458
+ }
459
+ const records = await Promise.all(
460
+ fragmentIds.map(
461
+ async (fragmentId) => await fragments.getFragment(fragmentId)
462
+ )
463
+ );
464
+ return records.flatMap(
465
+ (fragment) => fragment.sentences.map((sentence) => sentence.text)
466
+ ).join(" ").trim();
467
+ }
468
+ export {
469
+ Serial,
470
+ SerialGeneration,
471
+ SerialTopology,
472
+ discoverSerial,
473
+ readSerial,
474
+ writeSerialSource
475
+ };
476
+ //# sourceMappingURL=serial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/serial.ts"],"sourcesContent":["import { AsyncSemaphore } from \"./utils/async-semaphore.js\";\nimport type { Language } from \"./common/language.js\";\nimport {\n WIKI_GRAPH_EDITOR_SCOPES,\n WIKI_GRAPH_READER_SCOPES,\n type WikiGraphScope,\n} from \"./common/llm-scope.js\";\nimport type { LLM } from \"./llm/index.js\";\nimport type {\n ChunkRecord,\n Document,\n FragmentGroupStore,\n ReadingEdgeRecord,\n ReadonlyChunkStore,\n ReadonlyDocument,\n ReadonlyFragmentGroupStore,\n ReadonlyReadingEdgeStore,\n ReadonlySerialFragments,\n SentenceGroupRecord,\n SerialTextStream,\n ReadonlySnakeChunkStore,\n ReadonlySnakeEdgeStore,\n ReadonlySnakeStore,\n SerialRecord,\n SerialStore,\n SnakeChunkRecord,\n SnakeEdgeRecord,\n SnakeRecord,\n} from \"./document/index.js\";\nimport { Reader, segmentTextStream } from \"./reader/index.js\";\nimport type {\n ReaderChunk,\n ReaderGraphDelta,\n ReaderSegmenter,\n ReaderTextStream,\n} from \"./reader/index.js\";\nimport { compressText, type EditorOptions } from \"./editor/index.js\";\nimport { Topology } from \"./topology/index.js\";\n\nconst DEFAULT_COMPRESSION_RATIO = 0.2;\nconst DEFAULT_FRAGMENT_WORDS_COUNT = 320;\nconst DEFAULT_GENERATION_DECAY_FACTOR = 0.5;\nconst DEFAULT_GROUP_WORDS_COUNT = 3840;\nconst DEFAULT_MAX_CLUES = 10;\nconst DEFAULT_MAX_ITERATIONS = 5;\nconst DEFAULT_WORKING_MEMORY_CAPACITY = 7;\n\nexport interface GenerateSerialOptions {\n readonly extractionPrompt: string;\n readonly userLanguage?: Language;\n}\n\nexport type BuildSerialTopologyOptions = GenerateSerialOptions;\n\nexport interface BuildSerialSummaryOptions {\n readonly userLanguage?: Language;\n}\n\nexport interface WriteSerialSourceOptions {\n readonly segmenter?: ReaderSegmenter;\n}\n\nexport interface SerialDiscovery {\n readonly fragments: number;\n readonly words: number;\n}\n\nexport interface SerialProgressSink {\n begin?(input?: {\n readonly fragments: number;\n readonly words: number;\n }): Promise<void>;\n advance(wordsCount: number): Promise<void>;\n complete(finalWordsCount?: number): Promise<void>;\n}\n\ntype ReaderProgressScope =\n (typeof WIKI_GRAPH_READER_SCOPES)[keyof typeof WIKI_GRAPH_READER_SCOPES];\n\nexport type CreateSerialOptions = GenerateSerialOptions;\n\nexport interface SerialGenerationOptions {\n readonly document?: Document;\n readonly llm: LLM<WikiGraphScope>;\n readonly logDirPath?: string;\n readonly segmenter?: ReaderSegmenter;\n /** @deprecated Use `document` instead. */\n readonly workspace?: Document;\n}\n\nexport type SerialHubOptions = SerialGenerationOptions;\n\nexport async function discoverSerial(input: {\n readonly segmenter?: ReaderSegmenter;\n readonly stream: ReaderTextStream;\n}): Promise<SerialDiscovery> {\n let fragments = 0;\n let words = 0;\n\n for await (const fragment of streamFragments({\n maxWordsCount: DEFAULT_FRAGMENT_WORDS_COUNT,\n stream: segmentTextStream(input.stream, {\n ...(input.segmenter === undefined ? {} : { adapter: input.segmenter }),\n }),\n })) {\n fragments += 1;\n words += countFragmentWords(fragment.sentences);\n }\n\n return {\n fragments,\n words,\n };\n}\n\nexport async function writeSerialSource(\n document: Document,\n serialId: number,\n stream: ReaderTextStream,\n options: WriteSerialSourceOptions = {},\n): Promise<void> {\n const serialFragments = document.getSerialFragments(serialId);\n\n await serialFragments.writeTextStream(await collectTextStream(stream), {\n ...(options.segmenter === undefined\n ? {}\n : { segmenter: options.segmenter }),\n });\n await document.serials.bumpRevision(serialId);\n}\n\nexport class SerialGeneration {\n readonly #fragmentWordsCount = DEFAULT_FRAGMENT_WORDS_COUNT;\n readonly #fragmentGroups: FragmentGroupStore;\n readonly #idSemaphore = new AsyncSemaphore(1);\n readonly #llm: LLM<WikiGraphScope>;\n readonly #logDirPath: string | undefined;\n readonly #serials: SerialStore;\n readonly #segmenter: ReaderSegmenter | undefined;\n readonly #document: Document;\n readonly #writeSemaphore = new AsyncSemaphore(1);\n\n #nextChunkId = 1;\n\n public constructor(options: SerialGenerationOptions) {\n const document = resolveDocument(options);\n\n this.#fragmentGroups = document.fragmentGroups;\n this.#llm = options.llm;\n this.#logDirPath = options.logDirPath;\n this.#serials = document.serials;\n this.#segmenter = options.segmenter;\n this.#document = document;\n }\n\n public async generate(\n stream: ReaderTextStream,\n options: GenerateSerialOptions,\n progressTracker?: SerialProgressSink,\n ): Promise<Serial> {\n const serialId = await this.#createSerialId();\n await writeSerialSource(this.#document, serialId, stream, {\n ...(this.#segmenter === undefined ? {} : { segmenter: this.#segmenter }),\n });\n return await this.#generatePrepared(serialId, options, progressTracker);\n }\n\n public async create(\n stream: ReaderTextStream,\n options: GenerateSerialOptions,\n ): Promise<Serial> {\n return await this.generate(stream, options);\n }\n\n public async generateInto(\n serialId: number,\n stream: ReaderTextStream,\n options: GenerateSerialOptions,\n progressTracker?: SerialProgressSink,\n ): Promise<Serial> {\n await this.#createExplicitSerialId(serialId);\n await writeSerialSource(this.#document, serialId, stream, {\n ...(this.#segmenter === undefined ? {} : { segmenter: this.#segmenter }),\n });\n return await this.#generatePrepared(serialId, options, progressTracker);\n }\n\n public async buildTopologyInto(\n serialId: number,\n options: BuildSerialTopologyOptions,\n progressTracker?: SerialProgressSink,\n ): Promise<void> {\n await this.#buildTopology(\n serialId,\n options.extractionPrompt,\n options.userLanguage,\n progressTracker,\n );\n }\n\n public async buildSummary(\n serialId: number,\n options: BuildSerialSummaryOptions = {},\n ): Promise<Serial> {\n const summary = await this.#buildSummary(serialId, options.userLanguage);\n\n return new Serial(this.#document, serialId, summary);\n }\n\n async #generatePrepared(\n serialId: number,\n options: GenerateSerialOptions,\n progressTracker?: SerialProgressSink,\n ): Promise<Serial> {\n await this.#buildTopology(\n serialId,\n options.extractionPrompt,\n options.userLanguage,\n progressTracker,\n );\n\n const summary = await this.#buildSummary(serialId, options.userLanguage);\n await progressTracker?.complete();\n\n return new Serial(this.#document, serialId, summary);\n }\n\n async #allocateChunkId(): Promise<number> {\n return await this.#idSemaphore.use(() => {\n const chunkId = this.#nextChunkId;\n this.#nextChunkId += 1;\n return chunkId;\n });\n }\n\n async #buildSummary(\n serialId: number,\n userLanguage: Language | undefined,\n ): Promise<string> {\n const record = await getSerialRecord(this.#document, serialId);\n if (!record.topologyReady) {\n throw new Error(`Serial ${serialId} is not ready for summary`);\n }\n const existingSummary = await this.#document.readSummary(serialId);\n\n if (existingSummary !== undefined) {\n return existingSummary;\n }\n const serialFragments = this.#getSerialFragments(serialId);\n const fragmentIds = await serialFragments.listFragmentIds();\n\n if (fragmentIds.length <= 1) {\n const summary = await readSerialPassthroughSummary(\n serialFragments,\n fragmentIds,\n );\n\n await this.#writeSemaphore.use(\n async () => await this.#document.writeSummary(serialId, summary),\n );\n\n return summary;\n }\n const groupIds = await this.#fragmentGroups.listGroupIdsForSerial(serialId);\n const summaryParts: string[] = [];\n\n for (const groupId of groupIds) {\n const groupSummary = await compressText({\n ...this.#createEditorOptions({\n groupId,\n serialId,\n userLanguage,\n }),\n });\n if (groupSummary.trim() === \"\") {\n continue;\n }\n summaryParts.push(groupSummary);\n }\n const summary = summaryParts.join(\"\\n\\n\");\n\n await this.#writeSemaphore.use(\n async () => await this.#document.writeSummary(serialId, summary),\n );\n return summary;\n }\n\n async #buildTopology(\n serialId: number,\n extractionPrompt: string,\n userLanguage: Language | undefined,\n progressTracker?: SerialProgressSink,\n ): Promise<void> {\n const reader = new Reader({\n attention: {\n capacity: DEFAULT_WORKING_MEMORY_CAPACITY,\n generationDecayFactor: DEFAULT_GENERATION_DECAY_FACTOR,\n idGenerator: async () => await this.#allocateChunkId(),\n },\n extractionGuidance: extractionPrompt,\n llm: this.#llm,\n scopes: WIKI_GRAPH_READER_SCOPES,\n sentenceTextSource: this.#document,\n ...(this.#segmenter === undefined\n ? {}\n : {\n segmenter: this.#segmenter,\n }),\n ...(userLanguage === undefined\n ? {}\n : {\n userLanguage,\n }),\n });\n const topology = new Topology(\n this.#document,\n serialId,\n DEFAULT_GROUP_WORDS_COUNT,\n );\n const allChunks: ReaderChunk[] = [];\n const successorIdsByChunkId = createNumberListRecord();\n const serialFragments = this.#document.getSerialFragments(serialId);\n\n for (const fragment of await listSerialProcessingFragments(\n serialFragments,\n this.#fragmentWordsCount,\n )) {\n const wordsCount = countFragmentWords(fragment.sentences);\n\n await this.#processFragment({\n allChunks,\n fragment: {\n startSentenceIndex: fragment.startSentenceIndex,\n sentences: fragment.sentences,\n },\n reader,\n serialId,\n successorIdsByChunkId,\n topology,\n });\n // Progress only advances after the fragment is fully persisted and indexed.\n await progressTracker?.advance(wordsCount);\n }\n\n await this.#writeSemaphore.use(async () => {\n await topology.finalize();\n await this.#serials.setTopologyReady(serialId);\n await this.#serials.bumpRevision(serialId);\n });\n }\n\n async #processFragment(input: {\n readonly allChunks: ReaderChunk[];\n readonly fragment: {\n readonly startSentenceIndex: number;\n readonly sentences: ReadonlyArray<{\n readonly text: string;\n readonly wordsCount: number;\n }>;\n };\n readonly reader: Reader<ReaderProgressScope>;\n readonly serialId: number;\n readonly successorIdsByChunkId: Record<string, number[] | undefined>;\n readonly topology: Topology;\n }): Promise<void> {\n const sentences = input.fragment.sentences.map((sentence, index) => ({\n sentenceId: [\n input.serialId,\n input.fragment.startSentenceIndex + index,\n ] as const,\n text: sentence.text,\n wordsCount: sentence.wordsCount,\n }));\n const fragmentText = sentences.map((sentence) => sentence.text).join(\" \");\n const userFocused = await input.reader.extractUserFocused({\n sentences,\n text: fragmentText,\n });\n\n const bookCoherence = await input.reader.extractBookCoherence({\n sentences,\n text: fragmentText,\n userFocusedChunks: userFocused.delta.chunks,\n });\n\n saveDelta(\n input.allChunks,\n input.successorIdsByChunkId,\n input.topology,\n userFocused.delta,\n );\n saveDelta(\n input.allChunks,\n input.successorIdsByChunkId,\n input.topology,\n bookCoherence,\n );\n input.reader.completeFragment({\n allChunks: input.allChunks,\n getSuccessorChunkIds: (chunkId) =>\n input.successorIdsByChunkId[String(chunkId)] ?? [],\n });\n }\n\n async #createSerialId(): Promise<number> {\n return await this.#idSemaphore.use(\n async () => await this.#serials.create(),\n );\n }\n\n async #createExplicitSerialId(serialId: number): Promise<void> {\n await this.#idSemaphore.use(\n async () => await this.#serials.createWithId(serialId),\n );\n }\n\n #getSerialFragments(serialId: number): SerialTextStream {\n return this.#document.getSerialFragments(serialId);\n }\n\n #createEditorOptions(input: {\n groupId: number;\n serialId: number;\n userLanguage: Language | undefined;\n }): EditorOptions<WikiGraphScope> {\n return {\n compressionRatio: DEFAULT_COMPRESSION_RATIO,\n groupId: input.groupId,\n llm: this.#llm,\n maxClues: DEFAULT_MAX_CLUES,\n maxIterations: DEFAULT_MAX_ITERATIONS,\n scopes: WIKI_GRAPH_EDITOR_SCOPES,\n serialId: input.serialId,\n document: this.#document,\n ...(this.#logDirPath === undefined\n ? {}\n : {\n logDirPath: this.#logDirPath,\n }),\n ...(input.userLanguage === undefined\n ? {}\n : {\n userLanguage: input.userLanguage,\n }),\n };\n }\n}\n\nexport class Serial {\n readonly #id: number;\n readonly #summary: string;\n readonly #topology: SerialTopology;\n\n public constructor(\n document: ReadonlyDocument,\n serialId: number,\n summary: string,\n ) {\n this.#id = serialId;\n this.#summary = summary;\n this.#topology = new SerialTopology(document, serialId);\n }\n\n public get id(): number {\n return this.#id;\n }\n\n public getSummary(): string {\n return this.#summary;\n }\n\n public getTopology(): SerialTopology {\n return this.#topology;\n }\n}\n\nexport class SerialTopology {\n readonly #chunks: ReadonlyChunkStore;\n readonly #fragmentGroups: ReadonlyFragmentGroupStore;\n readonly #readingEdges: ReadonlyReadingEdgeStore;\n readonly #serialId: number;\n readonly #snakeChunks: ReadonlySnakeChunkStore;\n readonly #snakeEdges: ReadonlySnakeEdgeStore;\n readonly #snakes: ReadonlySnakeStore;\n\n public constructor(document: ReadonlyDocument, serialId: number) {\n this.#chunks = document.chunks;\n this.#fragmentGroups = document.fragmentGroups;\n this.#readingEdges = document.readingEdges;\n this.#serialId = serialId;\n this.#snakeChunks = document.snakeChunks;\n this.#snakeEdges = document.snakeEdges;\n this.#snakes = document.snakes;\n }\n\n public async listChunks(): Promise<readonly ChunkRecord[]> {\n return await this.#chunks.listBySerial(this.#serialId);\n }\n\n public async listEdges(): Promise<readonly ReadingEdgeRecord[]> {\n return await this.#readingEdges.listBySerial(this.#serialId);\n }\n\n public async listGroups(): Promise<readonly SentenceGroupRecord[]> {\n return await this.#fragmentGroups.listBySerial(this.#serialId);\n }\n\n public async listSnakeChunks(\n snakeId: number,\n ): Promise<readonly SnakeChunkRecord[]> {\n const snake = await this.#snakes.getById(snakeId);\n if (snake === undefined || snake.serialId !== this.#serialId) {\n throw new Error(`Snake ${snakeId} does not belong to this serial`);\n }\n return await this.#snakeChunks.listBySnake(snakeId);\n }\n\n public async listSnakeEdges(): Promise<readonly SnakeEdgeRecord[]> {\n return await this.#snakeEdges.listBySerial(this.#serialId);\n }\n\n public async listSnakes(): Promise<readonly SnakeRecord[]> {\n return await this.#snakes.listBySerial(this.#serialId);\n }\n}\n\nfunction appendSuccessor(\n successorIdsByChunkId: Record<string, number[] | undefined>,\n fromId: number,\n toId: number,\n): void {\n const existingSuccessors = successorIdsByChunkId[String(fromId)] ?? [];\n\n if (existingSuccessors.includes(toId)) {\n return;\n }\n\n successorIdsByChunkId[String(fromId)] = [...existingSuccessors, toId].sort(\n compareNumber,\n );\n}\n\nfunction compareNumber(left: number, right: number): number {\n return left - right;\n}\n\nfunction createNumberListRecord(): Record<string, number[] | undefined> {\n return Object.create(null) as Record<string, number[] | undefined>;\n}\n\nexport async function readSerial(\n document: ReadonlyDocument,\n serialId: number,\n): Promise<Serial> {\n const record = await getSerialRecord(document, serialId);\n\n if (!record.topologyReady) {\n throw new Error(`Serial ${serialId} is not ready`);\n }\n\n const summary = await document.readSummary(serialId);\n\n if (summary === undefined) {\n throw new Error(\n `Chapter ${serialId} summary is missing. Run \\`wg wikg://local/job add --input <chapter-uri> --task reading-summary --accept-cost\\` before export, or inspect the chapter with \\`wg <archive-uri>/chapter/${serialId}/source get\\`.`,\n );\n }\n\n return new Serial(document, serialId, summary);\n}\n\nfunction resolveDocument(options: SerialGenerationOptions): Document {\n const document = options.document ?? options.workspace;\n\n if (document === undefined) {\n throw new Error(\"SerialGeneration requires a document\");\n }\n\n return document;\n}\n\nasync function getSerialRecord(\n document: Pick<ReadonlyDocument, \"serials\">,\n serialId: number,\n): Promise<SerialRecord> {\n const record = await document.serials.getById(serialId);\n\n if (record === undefined) {\n throw new Error(\n `Chapter ${serialId} does not exist. Use \\`wg <archive-uri>/chapter list\\` to discover chapter ids.`,\n );\n }\n\n return record;\n}\n\nfunction saveDelta(\n allChunks: ReaderChunk[],\n successorIdsByChunkId: Record<string, number[] | undefined>,\n topology: Topology,\n delta: ReaderGraphDelta,\n): void {\n topology.accept(delta);\n allChunks.push(...delta.chunks);\n\n for (const edge of delta.edges) {\n appendSuccessor(successorIdsByChunkId, edge.fromId, edge.toId);\n }\n}\n\nasync function* streamFragments(input: {\n maxWordsCount: number;\n stream: AsyncIterable<{\n readonly text: string;\n readonly wordsCount: number;\n }>;\n}): AsyncIterable<{\n readonly sentences: ReadonlyArray<{\n readonly text: string;\n readonly wordsCount: number;\n }>;\n}> {\n let currentSentences: Array<{\n readonly text: string;\n readonly wordsCount: number;\n }> = [];\n let currentWordsCount = 0;\n\n for await (const sentence of input.stream) {\n const sentenceText = sentence.text.trim();\n\n if (sentenceText === \"\") {\n continue;\n }\n if (\n currentSentences.length > 0 &&\n currentWordsCount + sentence.wordsCount > input.maxWordsCount\n ) {\n yield {\n sentences: currentSentences,\n };\n currentSentences = [];\n currentWordsCount = 0;\n }\n currentSentences.push({\n text: sentenceText,\n wordsCount: sentence.wordsCount,\n });\n currentWordsCount += sentence.wordsCount;\n }\n\n if (currentSentences.length > 0) {\n yield {\n sentences: currentSentences,\n };\n }\n}\n\nasync function listSerialProcessingFragments(\n fragments: ReadonlySerialFragments,\n maxWordsCount: number,\n): Promise<\n ReadonlyArray<{\n readonly startSentenceIndex: number;\n readonly sentences: ReadonlyArray<{\n readonly text: string;\n readonly wordsCount: number;\n }>;\n }>\n> {\n const sentences =\n fragments.listSentences === undefined\n ? await listFragmentSentences(fragments)\n : await fragments.listSentences();\n const batches: Array<{\n startSentenceIndex: number;\n sentences: Array<{\n readonly text: string;\n readonly wordsCount: number;\n }>;\n }> = [];\n let currentSentences: Array<{\n readonly text: string;\n readonly wordsCount: number;\n }> = [];\n let currentStartSentenceIndex = 0;\n let currentWordsCount = 0;\n\n for (let index = 0; index < sentences.length; index += 1) {\n const sentence = sentences[index];\n\n if (sentence === undefined || sentence.text.trim() === \"\") {\n continue;\n }\n if (\n currentSentences.length > 0 &&\n currentWordsCount + sentence.wordsCount > maxWordsCount\n ) {\n batches.push({\n startSentenceIndex: currentStartSentenceIndex,\n sentences: currentSentences,\n });\n currentSentences = [];\n currentWordsCount = 0;\n }\n if (currentSentences.length === 0) {\n currentStartSentenceIndex = index;\n }\n currentSentences.push(sentence);\n currentWordsCount += sentence.wordsCount;\n }\n\n if (currentSentences.length > 0) {\n batches.push({\n startSentenceIndex: currentStartSentenceIndex,\n sentences: currentSentences,\n });\n }\n\n return batches;\n}\n\nasync function listFragmentSentences(\n fragments: ReadonlySerialFragments,\n): Promise<\n ReadonlyArray<{\n readonly text: string;\n readonly wordsCount: number;\n }>\n> {\n const records = await Promise.all(\n (await fragments.listFragmentIds()).map(\n async (fragmentId) => await fragments.getFragment(fragmentId),\n ),\n );\n\n return records\n .sort((left, right) => left.fragmentId - right.fragmentId)\n .flatMap((fragment) => fragment.sentences);\n}\n\nasync function collectTextStream(stream: ReaderTextStream): Promise<string> {\n const parts: string[] = [];\n\n for await (const chunk of stream) {\n parts.push(chunk);\n }\n\n return parts.join(\"\");\n}\n\nfunction countFragmentWords(\n sentences: ReadonlyArray<{\n readonly text: string;\n readonly wordsCount: number;\n }>,\n): number {\n return sentences.reduce((sum, sentence) => sum + sentence.wordsCount, 0);\n}\n\nasync function readSerialPassthroughSummary(\n fragments: ReadonlySerialFragments,\n fragmentIds: readonly number[],\n): Promise<string> {\n if (fragmentIds.length === 0) {\n return \"\";\n }\n\n const records = await Promise.all(\n fragmentIds.map(\n async (fragmentId) => await fragments.getFragment(fragmentId),\n ),\n );\n\n return records\n .flatMap((fragment: Awaited<ReturnType<typeof fragments.getFragment>>) =>\n fragment.sentences.map((sentence) => sentence.text),\n )\n .join(\" \")\n .trim();\n}\n"],"mappings":"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","names":["summary"]}
@@ -0,0 +1,15 @@
1
+ import { SourceFormat, BookMeta } from './meta.js';
2
+ import { SourceAsset, SourceSection } from './types.js';
3
+ import 'zod';
4
+
5
+ interface SourceDocument {
6
+ readMeta(): Promise<BookMeta>;
7
+ readCover(): Promise<SourceAsset | undefined>;
8
+ readSections(): Promise<readonly SourceSection[]>;
9
+ }
10
+ interface SourceAdapter {
11
+ readonly format: SourceFormat;
12
+ openSession<T>(path: string, operation: (document: SourceDocument) => Promise<T>): Promise<T>;
13
+ }
14
+
15
+ export type { SourceAdapter, SourceDocument };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,27 @@
1
+ import { Readable } from 'stream';
2
+ import { ZipFile, Entry } from 'yauzl';
3
+
4
+ declare class EpubArchive {
5
+ #private;
6
+ constructor(path: string, zipFile: ZipFile, entries: ReadonlyMap<string, Entry>);
7
+ static open(path: string): Promise<EpubArchive>;
8
+ close(): Promise<void>;
9
+ hasEntry(path: string): boolean;
10
+ listEntries(): readonly string[];
11
+ openReadStream(path: string): Promise<Readable>;
12
+ readText(path: string): Promise<string>;
13
+ readBuffer(path: string): Promise<Buffer>;
14
+ resolveRelativePath(basePath: string, href: string): string;
15
+ createSectionId(path: string, fragment?: string): string;
16
+ createSyntheticSectionId(path: string, title?: string): string;
17
+ get path(): string;
18
+ }
19
+ declare function normalizeArchivePath(path: string): string;
20
+ declare function normalizeHref(href: string): string;
21
+ declare function normalizeFragment(fragment: string | undefined): string | undefined;
22
+ declare function splitHref(href: string): {
23
+ readonly path: string;
24
+ readonly fragment: string | undefined;
25
+ };
26
+
27
+ export { EpubArchive, normalizeArchivePath, normalizeFragment, normalizeHref, splitHref };