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/build-queue.ts"],"sourcesContent":["import { createHash, randomUUID } from \"crypto\";\nimport { appendFile, mkdir, readFile, rm } from \"fs/promises\";\nimport { join, resolve } from \"path\";\n\nimport { resolveWikiGraphJobsDirectoryPath } from \"../common/wiki-graph-dir.js\";\nimport { openSharedStateDatabase } from \"../document/index.js\";\nimport type { Database } from \"../document/index.js\";\nimport { readPathSize, removeDisposableChildDirectories } from \"../gc/files.js\";\nimport type { GcContext, GcJobResult } from \"../gc/index.js\";\n\nexport const BUILD_JOB_STATES = [\n \"queued\",\n \"running\",\n \"canceling\",\n \"paused\",\n \"succeeded\",\n \"failed\",\n \"canceled\",\n] as const;\n\nexport type BuildJobState = (typeof BUILD_JOB_STATES)[number];\nexport type BuildJobTarget =\n | \"knowledge-graph\"\n | \"reading-graph\"\n | \"reading-summary\";\nexport type BuildJobProgressPhase =\n | \"committing\"\n | \"enrichment\"\n | \"grounding\"\n | \"matching\"\n | \"narrowing\"\n | \"relation-discovery\"\n | \"screening\";\nexport type BuildJobProgressUnit =\n | \"candidate\"\n | \"char\"\n | \"item\"\n | \"page\"\n | \"qid\"\n | \"sentence\"\n | \"window\"\n | \"record\";\n\nexport interface BuildJobProgressCounter {\n readonly done: number;\n readonly name: string;\n readonly total: number;\n readonly unit: BuildJobProgressUnit | \"word\";\n}\n\nexport interface BuildJobTokenUsage {\n readonly cacheReadTokens?: number;\n readonly inputTokens?: number;\n readonly outputTokens?: number;\n}\n\nexport interface BuildJob {\n readonly archiveKey: string;\n readonly archivePath: string;\n readonly cachePath: string;\n readonly chapterId: number;\n readonly createdAt: number;\n readonly currentStep?: BuildJobTarget;\n readonly errorJSON?: string;\n readonly eventsPath: string;\n readonly finishedAt?: number;\n readonly jobId: string;\n readonly inputRevision?: number;\n readonly logPath: string;\n readonly llmJSON?: string;\n readonly ownerId?: string;\n readonly ownerPid?: number;\n readonly prompt?: string;\n readonly queueRank: number;\n readonly state: BuildJobState;\n readonly readingSummaryStartedAt?: number;\n readonly target: BuildJobTarget;\n readonly updatedAt: number;\n readonly workspacePath: string;\n}\n\nexport type BuildJobEvent =\n | {\n readonly at: number;\n readonly jobId: string;\n readonly seq: number;\n readonly state: BuildJobState;\n readonly type: \"created\" | \"paused\" | \"resumed\" | \"boosted\" | \"canceling\";\n }\n | {\n readonly at: number;\n readonly jobId: string;\n readonly seq: number;\n readonly from: BuildJobTarget;\n readonly to: BuildJobTarget;\n readonly type: \"target_changed\";\n }\n | {\n readonly at: number;\n readonly jobId: string;\n readonly seq: number;\n readonly state: \"running\";\n readonly type: \"started\";\n }\n | {\n readonly at: number;\n readonly jobId: string;\n readonly seq: number;\n readonly state: \"queued\";\n readonly type: \"requeued\";\n }\n | {\n readonly at: number;\n readonly jobId: string;\n readonly seq: number;\n readonly step: BuildJobTarget;\n readonly type: \"step_started\" | \"step_completed\";\n }\n | {\n readonly at: number;\n readonly counters: readonly BuildJobProgressCounter[];\n readonly jobId: string;\n readonly phase?: BuildJobProgressPhase;\n readonly seq: number;\n readonly step?: BuildJobTarget;\n readonly tokens?: BuildJobTokenUsage;\n readonly type: \"status_snapshot\";\n }\n | {\n readonly at: number;\n readonly error?: unknown;\n readonly jobId: string;\n readonly seq: number;\n readonly state: \"failed\" | \"canceled\" | \"succeeded\";\n readonly type: \"failed\" | \"canceled\" | \"succeeded\";\n };\n\nexport interface AddBuildJobOptions {\n readonly archivePath: string;\n readonly boost?: boolean;\n readonly chapterId: number;\n readonly jobId?: string;\n readonly llmJSON?: string;\n readonly prompt?: string;\n readonly target: BuildJobTarget;\n}\n\nexport interface BuildJobListOptions {\n readonly activeOnly?: boolean;\n readonly all?: boolean;\n readonly archivePath?: string;\n}\n\nexport interface BuildJobWorkerOptions {\n readonly concurrency: number;\n readonly executeJob: (\n job: BuildJob,\n reporter: BuildJobProgressReporter,\n context: BuildJobExecutionContext,\n ) => Promise<void>;\n readonly idleTimeoutMs?: number;\n}\n\nexport interface BuildJobExecutionContext {\n readonly signal: AbortSignal;\n}\n\nexport interface BuildJobProgressReporter {\n addOutputCharacters(characters: number): Promise<void>;\n addTokenUsage(usage: BuildJobTokenUsage): Promise<void>;\n setTotals(input: {\n readonly totalGraphWords?: number;\n readonly totalReadingSummaryWords?: number;\n }): Promise<void>;\n stepCompleted(step: BuildJobTarget): Promise<void>;\n stepStarted(step: BuildJobTarget): Promise<void>;\n updateWords(input: {\n readonly graphWords?: number;\n readonly readingSummaryWords?: number;\n }): Promise<void>;\n updatePhase(input: {\n readonly done: number;\n readonly force?: boolean;\n readonly phase: BuildJobProgressPhase;\n readonly phaseDetail?: string;\n readonly total: number;\n readonly unit: BuildJobProgressUnit;\n }): Promise<void>;\n throwIfStopped(): Promise<void>;\n}\n\nexport type BuildJobConflictScope =\n | {\n readonly kind: \"archive\";\n }\n | {\n readonly chapterIds: readonly number[];\n readonly kind: \"chapter\";\n };\n\nconst BUILD_QUEUE_SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS build_jobs (\n job_id TEXT PRIMARY KEY,\n archive_key TEXT NOT NULL,\n archive_path TEXT NOT NULL,\n chapter_id INTEGER NOT NULL,\n target TEXT NOT NULL,\n current_step TEXT,\n state TEXT NOT NULL,\n queue_rank INTEGER NOT NULL,\n workspace_path TEXT NOT NULL,\n cache_path TEXT NOT NULL,\n log_path TEXT NOT NULL,\n events_path TEXT NOT NULL,\n input_revision INTEGER,\n llm_json TEXT,\n prompt TEXT,\n owner_id TEXT,\n owner_pid INTEGER,\n reading_summary_started_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n finished_at INTEGER,\n error_json TEXT\n);\n\nDROP INDEX IF EXISTS idx_build_jobs_active_chapter;\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_build_jobs_active_knowledge_chapter\nON build_jobs(archive_key, chapter_id)\nWHERE target = 'knowledge-graph'\n AND state IN ('queued', 'running', 'canceling', 'paused');\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_build_jobs_active_reading_chapter\nON build_jobs(archive_key, chapter_id)\nWHERE target IN ('reading-graph', 'reading-summary')\n AND state IN ('queued', 'running', 'canceling', 'paused');\n\nCREATE INDEX IF NOT EXISTS idx_build_jobs_queue\nON build_jobs(state, queue_rank, updated_at);\n\nCREATE TABLE IF NOT EXISTS build_worker_lease (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n owner_id TEXT,\n owner_pid INTEGER,\n heartbeat_at INTEGER\n);\n\nINSERT OR IGNORE INTO build_worker_lease (id)\nVALUES (1);\n`;\n\nconst ACTIVE_JOB_STATES = new Set<BuildJobState>([\n \"queued\",\n \"running\",\n \"canceling\",\n \"paused\",\n]);\nconst WORKER_HEARTBEAT_INTERVAL_MS = 5_000;\n\nexport async function addBuildJob(\n options: AddBuildJobOptions,\n): Promise<BuildJob> {\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n return await state.transaction(async () => {\n const archivePath = resolve(options.archivePath);\n const archiveKey = createArchiveKey(archivePath);\n const now = Date.now();\n const existing = await findActiveBuildJobInLane(state, {\n archiveKey,\n chapterId: options.chapterId,\n target: options.target,\n });\n\n if (existing !== undefined) {\n return await mergeActiveBuildJob(state, existing, options, now);\n }\n\n const jobId = options.jobId ?? randomUUID();\n const workspacePath = await createJobWorkspacePath(jobId);\n const cachePath = await createJobCachePath(jobId);\n const logPath = await createJobLogPath(jobId);\n const eventsPath = await createJobEventsPath(jobId);\n const queueRank =\n options.boost === true\n ? (await readMinQueueRank(state)) - 1\n : (await readMaxQueueRank(state)) + 1;\n\n await state.run(\n `\nINSERT INTO build_jobs (\n job_id, archive_key, archive_path, chapter_id, target, state, queue_rank,\n workspace_path, cache_path, log_path, events_path, llm_json, prompt,\n created_at, updated_at\n) VALUES (?, ?, ?, ?, ?, 'queued', ?, ?, ?, ?, ?, ?, ?, ?, ?)\n`,\n [\n jobId,\n archiveKey,\n archivePath,\n options.chapterId,\n options.target,\n queueRank,\n workspacePath,\n cachePath,\n logPath,\n eventsPath,\n options.llmJSON ?? null,\n options.prompt ?? null,\n now,\n now,\n ],\n );\n\n const job = await requireBuildJobById(state, jobId);\n\n await appendBuildJobEvent(job, {\n at: now,\n jobId,\n seq: 0,\n state: \"queued\",\n type: \"created\",\n });\n return job;\n });\n } finally {\n await state.close();\n }\n}\n\nexport async function recordBuildJobInputRevision(input: {\n readonly currentRevision: number;\n readonly jobId: string;\n readonly ownerId: string;\n}): Promise<BuildJob> {\n const state = await openBuildQueueDatabase();\n\n try {\n await state.transaction(async () => {\n await state.run(\n `\nUPDATE build_jobs\nSET input_revision = ?,\n updated_at = ?\nWHERE job_id = ?\n AND owner_id = ?\n AND state = 'running'\n`,\n [input.currentRevision, Date.now(), input.jobId, input.ownerId],\n );\n });\n\n return await requireBuildJobById(state, input.jobId);\n } finally {\n await state.close();\n }\n}\n\nexport async function assertBuildJobInputRevision(input: {\n readonly currentRevision: number;\n readonly jobId: string;\n readonly ownerId: string;\n}): Promise<void> {\n const job = await getBuildJob(input.jobId);\n\n if (job.state !== \"running\" || job.ownerId !== input.ownerId) {\n throw new BuildJobStoppedError(\n `Job ${input.jobId} is ${job.state}. Stop current worker execution.`,\n );\n }\n if (job.inputRevision === undefined) {\n throw new Error(\n `Job ${input.jobId} has no recorded chapter input revision. Requeue the job before committing build output.`,\n );\n }\n if (job.inputRevision === input.currentRevision) {\n return;\n }\n\n throw new Error(\n `Chapter ${job.chapterId} changed while job ${job.jobId} was running. Requeue the job before committing build output.`,\n );\n}\n\nexport async function listBuildJobs(\n options: BuildJobListOptions = {},\n): Promise<BuildJob[]> {\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n const params: Array<number | string> = [];\n const filters: string[] = [];\n\n if (options.archivePath !== undefined) {\n params.push(createArchiveKey(resolve(options.archivePath)));\n filters.push(\"archive_key = ?\");\n }\n if (options.activeOnly === true || options.all !== true) {\n filters.push(\"state IN ('queued', 'running', 'canceling', 'paused')\");\n }\n\n return await state.queryAll(\n `\nSELECT *\nFROM build_jobs\n${filters.length === 0 ? \"\" : `WHERE ${filters.join(\" AND \")}`}\nORDER BY\n CASE state\n WHEN 'running' THEN 0\n WHEN 'canceling' THEN 1\n WHEN 'queued' THEN 2\n WHEN 'paused' THEN 3\n ELSE 4\n END,\n queue_rank ASC,\n updated_at DESC\n`,\n params,\n mapBuildJob,\n );\n } finally {\n await state.close();\n }\n}\n\nasync function findActiveBuildJobInLane(\n state: Database,\n input: {\n readonly archiveKey: string;\n readonly chapterId: number;\n readonly target: BuildJobTarget;\n },\n): Promise<BuildJob | undefined> {\n const laneFilter =\n input.target === \"knowledge-graph\"\n ? \"target = 'knowledge-graph'\"\n : \"target IN ('reading-graph', 'reading-summary')\";\n\n return await state.queryOne(\n `\nSELECT *\nFROM build_jobs\nWHERE archive_key = ?\n AND chapter_id = ?\n AND state IN ('queued', 'running', 'canceling', 'paused')\n AND ${laneFilter}\nORDER BY updated_at DESC\nLIMIT 1\n`,\n [input.archiveKey, input.chapterId],\n mapBuildJob,\n );\n}\n\nasync function mergeActiveBuildJob(\n state: Database,\n job: BuildJob,\n options: AddBuildJobOptions,\n now: number,\n): Promise<BuildJob> {\n const nextTarget =\n job.target === \"reading-graph\" && options.target === \"reading-summary\"\n ? \"reading-summary\"\n : job.target;\n const nextQueueRank =\n options.boost === true && job.state === \"queued\"\n ? (await readMinQueueRank(state)) - 1\n : job.queueRank;\n\n if (nextTarget === job.target && nextQueueRank === job.queueRank) {\n return job;\n }\n\n await state.run(\n `\nUPDATE build_jobs\nSET target = ?, queue_rank = ?, updated_at = ?\nWHERE job_id = ?\n`,\n [nextTarget, nextQueueRank, now, job.jobId],\n );\n\n const updated = await requireBuildJobById(state, job.jobId);\n\n if (nextTarget !== job.target) {\n await appendBuildJobEvent(updated, {\n at: now,\n from: job.target,\n jobId: job.jobId,\n seq: 0,\n to: nextTarget,\n type: \"target_changed\",\n });\n }\n if (nextQueueRank !== job.queueRank) {\n await appendBuildJobEvent(updated, {\n at: now,\n jobId: job.jobId,\n seq: 0,\n state: updated.state,\n type: \"boosted\",\n });\n }\n\n return updated;\n}\n\nexport async function getBuildJob(jobId: string): Promise<BuildJob> {\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n return await requireBuildJobById(state, jobId);\n } finally {\n await state.close();\n }\n}\n\nasync function readBuildJobForStopCheck(jobId: string): Promise<BuildJob> {\n const state = await openReadonlyBuildQueueDatabase();\n\n try {\n return await requireBuildJobById(state, jobId);\n } finally {\n await state.close();\n }\n}\n\nexport async function resolveBuildJobId(jobIdPrefix: string): Promise<string> {\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n return await resolveBuildJobIdInState(state, jobIdPrefix);\n } finally {\n await state.close();\n }\n}\n\nexport async function pauseBuildJob(jobId: string): Promise<BuildJob> {\n return await updateBuildJobState(jobId, \"paused\", \"paused\", {\n allowedStates: [\"queued\", \"running\"],\n });\n}\n\nexport async function resumeBuildJob(jobId: string): Promise<BuildJob> {\n return await updateBuildJobState(jobId, \"queued\", \"resumed\", {\n allowedStates: [\"paused\"],\n clearOwner: true,\n });\n}\n\nexport async function cancelBuildJob(jobId: string): Promise<BuildJob> {\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n return await state.transaction(async () => {\n const job = await requireBuildJobById(state, jobId);\n\n if (job.state === \"running\") {\n return await markBuildJobCanceling(state, job);\n }\n if (job.state === \"queued\" || job.state === \"paused\") {\n return await markBuildJobCanceled(state, job);\n }\n\n throw new Error(`Cannot cancel ${job.state} job ${jobId}.`);\n });\n } finally {\n await state.close();\n }\n}\n\nexport async function boostBuildJob(jobId: string): Promise<BuildJob> {\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n return await state.transaction(async () => {\n const job = await requireBuildJobById(state, jobId);\n\n if (job.state !== \"queued\") {\n throw new Error(\n `Only queued jobs can be boosted. Job ${jobId} is ${job.state}.`,\n );\n }\n\n const now = Date.now();\n await state.run(\n `\nUPDATE build_jobs\nSET queue_rank = ?, updated_at = ?\nWHERE job_id = ?\n`,\n [(await readMinQueueRank(state)) - 1, now, jobId],\n );\n\n const updated = await requireBuildJobById(state, jobId);\n await appendBuildJobEvent(updated, {\n at: now,\n jobId,\n seq: 0,\n state: \"queued\",\n type: \"boosted\",\n });\n return updated;\n });\n } finally {\n await state.close();\n }\n}\n\nexport async function updateBuildJobTarget(\n jobId: string,\n target: BuildJobTarget,\n): Promise<BuildJob> {\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n return await state.transaction(async () => {\n const job = await requireBuildJobById(state, jobId);\n\n if (!ACTIVE_JOB_STATES.has(job.state)) {\n throw new Error(`Cannot change target for ${job.state} job ${jobId}.`);\n }\n if (job.target === target) {\n return job;\n }\n const existing = await findActiveBuildJobInLane(state, {\n archiveKey: job.archiveKey,\n chapterId: job.chapterId,\n target,\n });\n\n if (existing !== undefined && existing.jobId !== job.jobId) {\n throw new Error(\n `Chapter ${job.chapterId} already has active ${formatBuildJobLane(target)} job ${existing.jobId}.`,\n );\n }\n if (job.target === \"reading-summary\" && target === \"reading-graph\") {\n if (\n job.readingSummaryStartedAt !== undefined ||\n job.currentStep === \"reading-summary\"\n ) {\n throw new Error(\n `Cannot downgrade job ${jobId} after summary has started. Cancel it explicitly instead.`,\n );\n }\n }\n\n const now = Date.now();\n await state.run(\n `\nUPDATE build_jobs\nSET target = ?, updated_at = ?\nWHERE job_id = ?\n`,\n [target, now, jobId],\n );\n\n const updated = await requireBuildJobById(state, jobId);\n await appendBuildJobEvent(updated, {\n at: now,\n from: job.target,\n jobId,\n seq: 0,\n to: target,\n type: \"target_changed\",\n });\n return updated;\n });\n } finally {\n await state.close();\n }\n}\n\nexport async function assertNoActiveBuildJobs(input: {\n readonly archivePath: string;\n readonly chapterIds: readonly number[];\n readonly operation: string;\n readonly requiresTarget?: BuildJobTarget;\n}): Promise<void> {\n await assertNoActiveBuildJobConflicts({\n archivePath: input.archivePath,\n operation: input.operation,\n ...(input.requiresTarget === undefined\n ? {}\n : { requiresTarget: input.requiresTarget }),\n scope: { chapterIds: input.chapterIds, kind: \"chapter\" },\n });\n}\n\nexport async function assertNoActiveBuildJobConflicts(input: {\n readonly archivePath: string;\n readonly operation: string;\n readonly requiresTarget?: BuildJobTarget;\n readonly scope: BuildJobConflictScope;\n}): Promise<void> {\n if (input.scope.kind === \"chapter\" && input.scope.chapterIds.length === 0) {\n return;\n }\n\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n const archiveKey = createArchiveKey(resolve(input.archivePath));\n const targetFilter =\n input.requiresTarget === undefined ? \"\" : \"AND target = ?\";\n const params: Array<number | string> = [archiveKey];\n let scopeFilter = \"\";\n\n if (input.scope.kind === \"chapter\") {\n const placeholders = input.scope.chapterIds.map(() => \"?\").join(\", \");\n\n scopeFilter = `AND chapter_id IN (${placeholders})`;\n params.push(...input.scope.chapterIds);\n }\n if (input.requiresTarget !== undefined) {\n params.push(input.requiresTarget);\n }\n\n const job = await state.queryOne(\n `\nSELECT *\nFROM build_jobs\nWHERE archive_key = ?\n ${scopeFilter}\n AND state IN ('queued', 'running', 'canceling', 'paused')\n ${targetFilter}\nORDER BY updated_at DESC\nLIMIT 1\n`,\n params,\n mapBuildJob,\n );\n\n if (job === undefined) {\n return;\n }\n\n throw new Error(\n `Chapter ${job.chapterId} has active ${job.target} job ${job.jobId}. ${input.operation} is blocked until the job is paused/canceled or completed.`,\n );\n } finally {\n await state.close();\n }\n}\n\nexport async function runBuildJobWorker(\n options: BuildJobWorkerOptions,\n): Promise<void> {\n const state = await openBuildQueueDatabase();\n const ownerId = `${process.pid}-${randomUUID()}`;\n const concurrency = Math.max(1, options.concurrency);\n const idleTimeoutMs = options.idleTimeoutMs ?? 10_000;\n let stopping = false;\n let busySlotCount = 0;\n let idleSince = Date.now();\n\n const stop = (_signal: NodeJS.Signals): void => {\n stopping = true;\n };\n\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n\n const heartbeat = setInterval(() => {\n void heartbeatBuildWorker(ownerId).catch(() => undefined);\n }, WORKER_HEARTBEAT_INTERVAL_MS);\n\n try {\n const acquired = await acquireBuildWorkerLease(state, ownerId);\n\n if (!acquired) {\n return;\n }\n\n const runSlot = async (): Promise<void> => {\n while (!stopping) {\n await heartbeatBuildWorker(ownerId, state);\n await recoverStaleBuildJobs(state);\n\n busySlotCount += 1;\n let job: BuildJob | undefined;\n\n try {\n job = await claimQueuedBuildJob(state, ownerId);\n } finally {\n if (job === undefined) {\n busySlotCount -= 1;\n }\n }\n\n if (job === undefined) {\n if (busySlotCount === 0 && Date.now() - idleSince >= idleTimeoutMs) {\n break;\n }\n await delay(500);\n continue;\n }\n\n idleSince = Date.now();\n\n try {\n await executeClaimedBuildJob(job, ownerId, options);\n } finally {\n busySlotCount -= 1;\n if (busySlotCount === 0) {\n idleSince = Date.now();\n }\n }\n }\n };\n\n await Promise.all(\n Array.from({ length: concurrency }, async () => await runSlot()),\n );\n } finally {\n clearInterval(heartbeat);\n process.removeListener(\"SIGINT\", stop);\n process.removeListener(\"SIGTERM\", stop);\n await releaseBuildWorkerLease(state, ownerId);\n await state.close();\n }\n}\n\nasync function executeClaimedBuildJob(\n job: BuildJob,\n ownerId: string,\n options: BuildJobWorkerOptions,\n): Promise<void> {\n const reporter = new BuildJobProgressAccumulator(job, ownerId);\n const abortController = new AbortController();\n const stopWatcher = setInterval(() => {\n void abortJobWhenStopped(job, ownerId, abortController).catch(\n () => undefined,\n );\n }, 500);\n\n try {\n await appendBuildJobEvent(job, {\n at: Date.now(),\n jobId: job.jobId,\n seq: 0,\n state: \"running\",\n type: \"started\",\n });\n await options.executeJob(job, reporter, {\n signal: abortController.signal,\n });\n await reporter.throwIfStopped();\n await markBuildJobSucceeded(job.jobId, ownerId);\n } catch (error) {\n if (\n error instanceof BuildJobStoppedError ||\n abortController.signal.aborted\n ) {\n await markBuildJobStopped(job.jobId, ownerId);\n return;\n }\n\n await markBuildJobFailed(job.jobId, ownerId, error);\n } finally {\n clearInterval(stopWatcher);\n }\n}\n\nasync function abortJobWhenStopped(\n job: BuildJob,\n ownerId: string,\n abortController: AbortController,\n): Promise<void> {\n if (abortController.signal.aborted) {\n return;\n }\n\n const latest = await readBuildJobForStopCheck(job.jobId);\n\n if (latest.state === \"running\" && latest.ownerId === ownerId) {\n return;\n }\n\n abortController.abort(\n new BuildJobStoppedError(\n `Job ${job.jobId} is ${latest.state}. Stop current worker execution.`,\n ),\n );\n}\n\nexport async function readBuildJobEvents(\n job: Pick<BuildJob, \"eventsPath\">,\n): Promise<BuildJobEvent[]> {\n let content: string;\n\n try {\n content = await readFile(job.eventsPath, \"utf8\");\n } catch {\n return [];\n }\n\n return content\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\")\n .map((line) => JSON.parse(line) as BuildJobEvent);\n}\n\nexport async function cleanBuildJobs(\n options: {\n readonly olderThanMs?: number;\n readonly states?: readonly BuildJobState[];\n } = {},\n): Promise<number> {\n const state = await openBuildQueueDatabase();\n const cutoff = Date.now() - (options.olderThanMs ?? 7 * 24 * 60 * 60 * 1000);\n const states = options.states ?? [\"succeeded\", \"failed\", \"canceled\"];\n\n try {\n const placeholders = states.map(() => \"?\").join(\", \");\n const jobs = await state.queryAll(\n `\nSELECT *\nFROM build_jobs\nWHERE state IN (${placeholders})\n AND updated_at <= ?\n`,\n [...states, cutoff],\n mapBuildJob,\n );\n\n for (const job of jobs) {\n await rm(job.workspacePath, { force: true, recursive: true });\n await rm(job.cachePath, { force: true, recursive: true });\n await rm(job.logPath, { force: true, recursive: true });\n await rm(job.eventsPath, { force: true });\n await state.run(\"DELETE FROM build_jobs WHERE job_id = ?\", [job.jobId]);\n }\n\n return jobs.length;\n } finally {\n await state.close();\n }\n}\n\nexport async function runBuildQueueGc(\n context: GcContext,\n): Promise<GcJobResult> {\n const state = await openBuildQueueDatabase();\n const cutoff = context.force\n ? context.now\n : context.now - 7 * 24 * 60 * 60 * 1000;\n\n try {\n const scanned = await state.queryOne(\n \"SELECT COUNT(*) AS count FROM build_jobs\",\n undefined,\n (row) => getNumber(row, \"count\"),\n );\n const jobs = await state.queryAll(\n `\nSELECT *\nFROM build_jobs\nWHERE state IN ('succeeded', 'failed', 'canceled')\n AND updated_at <= ?\n`,\n [cutoff],\n mapBuildJob,\n );\n const childDirectories = context.dryRun\n ? { freedBytes: 0, removed: 0, scanned: 0 }\n : await removeDisposableChildDirectories(getBuildJobWorkspaceRootPath());\n let freedBytes = 0;\n\n for (const job of jobs) {\n freedBytes += await readPathSize(job.workspacePath);\n freedBytes += await readPathSize(job.cachePath);\n freedBytes += await readPathSize(job.logPath);\n freedBytes += await readPathSize(job.eventsPath);\n if (!context.dryRun) {\n await rm(job.workspacePath, { force: true, recursive: true });\n await rm(job.cachePath, { force: true, recursive: true });\n await rm(job.logPath, { force: true, recursive: true });\n await rm(job.eventsPath, { force: true });\n await state.run(\"DELETE FROM build_jobs WHERE job_id = ?\", [job.jobId]);\n }\n }\n\n return {\n freedBytes: freedBytes + childDirectories.freedBytes,\n removed: jobs.length + childDirectories.removed,\n scanned: (scanned ?? 0) + childDirectories.scanned,\n };\n } finally {\n await state.close();\n }\n}\n\nasync function updateBuildJobState(\n jobId: string,\n stateName: BuildJobState,\n eventType: Extract<BuildJobEvent[\"type\"], \"paused\" | \"resumed\">,\n options: {\n readonly allowedStates: readonly BuildJobState[];\n readonly clearOwner?: boolean;\n readonly finished?: boolean;\n },\n): Promise<BuildJob> {\n const state = await openBuildQueueDatabase();\n\n try {\n await recoverStaleBuildJobs(state);\n return await state.transaction(async () => {\n const job = await requireBuildJobById(state, jobId);\n\n if (!options.allowedStates.includes(job.state)) {\n throw new Error(`Cannot ${eventType} ${job.state} job ${jobId}.`);\n }\n\n const now = Date.now();\n await state.run(\n `\nUPDATE build_jobs\nSET state = ?, updated_at = ?, finished_at = ?,\n owner_id = CASE WHEN ? = 1 THEN NULL ELSE owner_id END,\n owner_pid = CASE WHEN ? = 1 THEN NULL ELSE owner_pid END\nWHERE job_id = ?\n`,\n [\n stateName,\n now,\n options.finished === true ? now : null,\n options.clearOwner === true || options.finished === true ? 1 : 0,\n options.clearOwner === true || options.finished === true ? 1 : 0,\n jobId,\n ],\n );\n\n const updated = await requireBuildJobById(state, jobId);\n await appendBuildJobEvent(updated, {\n at: now,\n jobId,\n seq: 0,\n state: stateName as \"queued\" | \"paused\",\n type: eventType,\n } as BuildJobEvent);\n return updated;\n });\n } finally {\n await state.close();\n }\n}\n\nasync function markBuildJobCanceling(\n state: Database,\n job: BuildJob,\n): Promise<BuildJob> {\n const now = Date.now();\n\n await state.run(\n `\nUPDATE build_jobs\nSET state = 'canceling', updated_at = ?\nWHERE job_id = ? AND state = 'running'\n`,\n [now, job.jobId],\n );\n\n const updated = await requireBuildJobById(state, job.jobId);\n await appendBuildJobEvent(updated, {\n at: now,\n jobId: job.jobId,\n seq: 0,\n state: \"canceling\",\n type: \"canceling\",\n });\n return updated;\n}\n\nasync function markBuildJobCanceled(\n state: Database,\n job: BuildJob,\n): Promise<BuildJob> {\n const now = Date.now();\n\n await state.run(\n `\nUPDATE build_jobs\nSET state = 'canceled', owner_id = NULL, owner_pid = NULL,\n current_step = NULL, finished_at = ?, updated_at = ?\nWHERE job_id = ?\n`,\n [now, now, job.jobId],\n );\n\n const updated = await requireBuildJobById(state, job.jobId);\n await appendBuildJobEvent(updated, {\n at: now,\n jobId: job.jobId,\n seq: 0,\n state: \"canceled\",\n type: \"canceled\",\n });\n return updated;\n}\n\nasync function markBuildJobFailedInState(\n state: Database,\n job: BuildJob,\n error: unknown,\n): Promise<void> {\n const now = Date.now();\n const formattedError = formatErrorEvent(error);\n const errorJSON = JSON.stringify(formattedError);\n\n await state.run(\n `\nUPDATE build_jobs\nSET state = 'failed', owner_id = NULL, owner_pid = NULL,\n current_step = NULL, finished_at = ?, updated_at = ?, error_json = ?\nWHERE job_id = ?\n`,\n [now, now, errorJSON, job.jobId],\n );\n await appendBuildJobEvent(job, {\n at: now,\n error: formattedError,\n jobId: job.jobId,\n seq: 0,\n state: \"failed\",\n type: \"failed\",\n });\n}\n\nasync function markBuildJobSucceeded(\n jobId: string,\n ownerId: string,\n): Promise<void> {\n const state = await openBuildQueueDatabase();\n\n try {\n await state.transaction(async () => {\n const job = await requireBuildJobById(state, jobId);\n\n if (job.ownerId !== ownerId || job.state !== \"running\") {\n return;\n }\n\n const now = Date.now();\n await state.run(\n `\nUPDATE build_jobs\nSET state = 'succeeded', owner_id = NULL, owner_pid = NULL,\n current_step = NULL, finished_at = ?, updated_at = ?\nWHERE job_id = ?\n`,\n [now, now, jobId],\n );\n await appendBuildJobEvent(job, {\n at: now,\n jobId,\n seq: 0,\n state: \"succeeded\",\n type: \"succeeded\",\n });\n await rm(job.workspacePath, { force: true, recursive: true });\n });\n } finally {\n await state.close();\n }\n}\n\nasync function markBuildJobFailed(\n jobId: string,\n ownerId: string,\n error: unknown,\n): Promise<void> {\n const state = await openBuildQueueDatabase();\n\n try {\n await state.transaction(async () => {\n const job = await requireBuildJobById(state, jobId);\n\n if (job.ownerId !== ownerId || job.state !== \"running\") {\n return;\n }\n\n await markBuildJobFailedInState(state, job, error);\n });\n } finally {\n await state.close();\n }\n}\n\nasync function markBuildJobStopped(\n jobId: string,\n ownerId: string,\n): Promise<void> {\n const state = await openBuildQueueDatabase();\n\n try {\n await state.transaction(async () => {\n const job = await requireBuildJobById(state, jobId);\n\n if (job.ownerId !== ownerId || job.state !== \"canceling\") {\n return;\n }\n\n await markBuildJobCanceled(state, job);\n });\n } finally {\n await state.close();\n }\n}\n\nasync function claimQueuedBuildJob(\n state: Database,\n ownerId: string,\n): Promise<BuildJob | undefined> {\n return await state.transaction(async () => {\n const job = await state.queryOne(\n `\nSELECT *\nFROM build_jobs\nWHERE state = 'queued'\nORDER BY queue_rank ASC, created_at ASC\nLIMIT 1\n`,\n undefined,\n mapBuildJob,\n );\n\n if (job === undefined) {\n return undefined;\n }\n\n const now = Date.now();\n await state.run(\n `\nUPDATE build_jobs\nSET state = 'running', owner_id = ?, owner_pid = ?, updated_at = ?\nWHERE job_id = ? AND state = 'queued'\n`,\n [ownerId, process.pid, now, job.jobId],\n );\n\n return await requireBuildJobById(state, job.jobId);\n });\n}\n\nasync function recoverStaleBuildJobs(state: Database): Promise<void> {\n const workspacePathsToDelete: string[] = [];\n\n await state.transaction(async () => {\n const jobs = await state.queryAll(\n `\nSELECT *\nFROM build_jobs\nWHERE state IN ('running', 'canceling')\n AND owner_pid IS NOT NULL\n`,\n undefined,\n mapBuildJob,\n );\n\n for (const job of jobs) {\n if (job.ownerPid !== undefined && isProcessAlive(job.ownerPid)) {\n continue;\n }\n\n if (job.state === \"canceling\") {\n await markBuildJobCanceled(state, job);\n continue;\n }\n\n await markBuildJobFailedInState(state, job, {\n message: \"Build worker process disappeared before finishing the job.\",\n name: \"BuildJobWorkerLost\",\n });\n workspacePathsToDelete.push(job.workspacePath);\n }\n });\n\n for (const workspacePath of workspacePathsToDelete) {\n await rm(workspacePath, { force: true, recursive: true });\n }\n}\n\nasync function acquireBuildWorkerLease(\n state: Database,\n ownerId: string,\n): Promise<boolean> {\n await recoverStaleBuildWorkerLease(state);\n\n return await state.transaction(async () => {\n const lease = await state.queryOne(\n `\nSELECT owner_pid\nFROM build_worker_lease\nWHERE id = 1\n`,\n undefined,\n (row) => ({\n ownerPid:\n row.owner_pid === null ? undefined : getNumber(row, \"owner_pid\"),\n }),\n );\n\n if (lease?.ownerPid !== undefined && isProcessAlive(lease.ownerPid)) {\n return false;\n }\n\n await state.run(\n `\nUPDATE build_worker_lease\nSET owner_id = ?, owner_pid = ?, heartbeat_at = ?\nWHERE id = 1\n`,\n [ownerId, process.pid, Date.now()],\n );\n return true;\n });\n}\n\nasync function heartbeatBuildWorker(\n ownerId: string,\n existingState?: Database,\n): Promise<void> {\n const state = existingState ?? (await openBuildQueueDatabase());\n\n try {\n await state.run(\n `\nUPDATE build_worker_lease\nSET heartbeat_at = ?\nWHERE id = 1 AND owner_id = ?\n`,\n [Date.now(), ownerId],\n );\n } finally {\n if (existingState === undefined) {\n await state.close();\n }\n }\n}\n\nasync function releaseBuildWorkerLease(\n state: Database,\n ownerId: string,\n): Promise<void> {\n await state.run(\n `\nUPDATE build_worker_lease\nSET owner_id = NULL, owner_pid = NULL, heartbeat_at = NULL\nWHERE id = 1 AND owner_id = ?\n`,\n [ownerId],\n );\n}\n\nasync function recoverStaleBuildWorkerLease(state: Database): Promise<void> {\n const lease = await state.queryOne(\n `\nSELECT owner_id, owner_pid\nFROM build_worker_lease\nWHERE id = 1\n`,\n undefined,\n (row) => ({\n ownerId: getOptionalString(row, \"owner_id\"),\n ownerPid:\n row.owner_pid === null ? undefined : getNumber(row, \"owner_pid\"),\n }),\n );\n\n if (lease?.ownerPid === undefined || isProcessAlive(lease.ownerPid)) {\n return;\n }\n\n await state.run(\n `\nUPDATE build_worker_lease\nSET owner_id = NULL, owner_pid = NULL, heartbeat_at = NULL\nWHERE id = 1\n`,\n );\n}\n\nasync function requireBuildJobById(\n state: Database,\n jobId: string,\n): Promise<BuildJob> {\n const job = await state.queryOne(\n \"SELECT * FROM build_jobs WHERE job_id = ?\",\n [jobId],\n mapBuildJob,\n );\n\n if (job === undefined) {\n throw new Error(`Build job not found: ${jobId}`);\n }\n\n return job;\n}\n\nasync function resolveBuildJobIdInState(\n state: Database,\n jobIdPrefix: string,\n): Promise<string> {\n const normalizedPrefix = jobIdPrefix.trim();\n\n if (normalizedPrefix === \"\") {\n throw new Error(\"Build job id is empty.\");\n }\n\n const jobs = await state.queryAll(\n `\nSELECT job_id\nFROM build_jobs\nWHERE substr(job_id, 1, ?) = ?\nORDER BY created_at DESC\n`,\n [normalizedPrefix.length, normalizedPrefix],\n (row) => getString(row, \"job_id\"),\n );\n\n if (jobs.length === 0) {\n throw new Error(`Build job not found: ${jobIdPrefix}`);\n }\n if (jobs.length > 1) {\n throw new Error(\n `Build job id prefix is ambiguous: ${jobIdPrefix}. Matches: ${jobs.join(\n \", \",\n )}`,\n );\n }\n\n return jobs[0]!;\n}\n\nasync function appendBuildJobEvent(\n job: Pick<BuildJob, \"eventsPath\" | \"jobId\">,\n event: BuildJobEvent,\n): Promise<void> {\n const seq = (await readLastBuildJobEventSeq(job)) + 1;\n const nextEvent = {\n ...event,\n jobId: job.jobId,\n seq,\n };\n\n await appendFile(job.eventsPath, `${JSON.stringify(nextEvent)}\\n`, \"utf8\");\n}\n\nasync function readLastBuildJobEventSeq(\n job: Pick<BuildJob, \"eventsPath\">,\n): Promise<number> {\n const events = await readBuildJobEvents(job);\n\n return events.at(-1)?.seq ?? 0;\n}\n\nasync function readMaxQueueRank(state: Database): Promise<number> {\n return (\n (await state.queryOne(\n \"SELECT COALESCE(MAX(queue_rank), 0) AS rank FROM build_jobs\",\n undefined,\n (row) => getNumber(row, \"rank\"),\n )) ?? 0\n );\n}\n\nasync function readMinQueueRank(state: Database): Promise<number> {\n return (\n (await state.queryOne(\n \"SELECT COALESCE(MIN(queue_rank), 0) AS rank FROM build_jobs\",\n undefined,\n (row) => getNumber(row, \"rank\"),\n )) ?? 0\n );\n}\n\nasync function openBuildQueueDatabase(): Promise<Database> {\n return await openSharedStateDatabase(\n getBuildQueueDatabasePath(),\n BUILD_QUEUE_SCHEMA_SQL,\n );\n}\n\nasync function openReadonlyBuildQueueDatabase(): Promise<Database> {\n return await openBuildQueueDatabase();\n}\n\nfunction getBuildQueueDatabasePath(): string {\n return join(getBuildQueueStateDirectoryPath(), \"job.sqlite\");\n}\n\nasync function createJobWorkspacePath(jobId: string): Promise<string> {\n const workspacePath = join(getBuildJobWorkspaceRootPath(), jobId);\n\n await mkdir(workspacePath, { recursive: true });\n return workspacePath;\n}\n\nfunction getBuildJobWorkspaceRootPath(): string {\n return join(getBuildQueueStateDirectoryPath(), \"work\");\n}\n\nasync function createJobCachePath(jobId: string): Promise<string> {\n const cachePath = join(getBuildJobCacheRootPath(), jobId);\n\n await mkdir(cachePath, { recursive: true });\n return cachePath;\n}\n\nfunction getBuildJobCacheRootPath(): string {\n return join(getBuildQueueStateDirectoryPath(), \"cache\");\n}\n\nasync function createJobLogPath(jobId: string): Promise<string> {\n const logPath = join(getBuildJobLogRootPath(), jobId);\n\n await mkdir(logPath, { recursive: true });\n return logPath;\n}\n\nfunction getBuildJobLogRootPath(): string {\n return join(getBuildQueueStateDirectoryPath(), \"logs\");\n}\n\nasync function createJobEventsPath(jobId: string): Promise<string> {\n const rootPath = join(getBuildQueueStateDirectoryPath(), \"events\");\n\n await mkdir(rootPath, { recursive: true });\n return join(rootPath, `${jobId}.ndjson`);\n}\n\nfunction getBuildQueueStateDirectoryPath(): string {\n return resolveWikiGraphJobsDirectoryPath();\n}\n\nfunction mapBuildJob(row: Record<string, unknown>): BuildJob {\n const currentStep = parseOptionalBuildJobTarget(\n getOptionalString(row, \"current_step\"),\n \"current_step\",\n );\n const ownerId = getOptionalString(row, \"owner_id\");\n const ownerPid =\n row.owner_pid === null ? undefined : getNumber(row, \"owner_pid\");\n const readingSummaryStartedAt =\n row.reading_summary_started_at === null\n ? undefined\n : getNumber(row, \"reading_summary_started_at\");\n const finishedAt =\n row.finished_at === null ? undefined : getNumber(row, \"finished_at\");\n const errorJSON = getOptionalString(row, \"error_json\");\n const inputRevision =\n row.input_revision === null ? undefined : getNumber(row, \"input_revision\");\n const llmJSON = getOptionalString(row, \"llm_json\");\n const prompt = getOptionalString(row, \"prompt\");\n\n return {\n archiveKey: getString(row, \"archive_key\"),\n archivePath: getString(row, \"archive_path\"),\n cachePath: getString(row, \"cache_path\"),\n chapterId: getNumber(row, \"chapter_id\"),\n createdAt: getNumber(row, \"created_at\"),\n ...(currentStep === undefined ? {} : { currentStep }),\n ...(errorJSON === undefined ? {} : { errorJSON }),\n eventsPath: getString(row, \"events_path\"),\n ...(finishedAt === undefined ? {} : { finishedAt }),\n jobId: getString(row, \"job_id\"),\n ...(inputRevision === undefined ? {} : { inputRevision }),\n logPath: getString(row, \"log_path\"),\n ...(llmJSON === undefined ? {} : { llmJSON }),\n ...(ownerId === undefined ? {} : { ownerId }),\n ...(ownerPid === undefined ? {} : { ownerPid }),\n ...(prompt === undefined ? {} : { prompt }),\n queueRank: getNumber(row, \"queue_rank\"),\n state: parseBuildJobState(getString(row, \"state\")),\n ...(readingSummaryStartedAt === undefined\n ? {}\n : { readingSummaryStartedAt }),\n target: parseBuildJobTarget(getString(row, \"target\"), \"target\"),\n updatedAt: getNumber(row, \"updated_at\"),\n workspacePath: getString(row, \"workspace_path\"),\n };\n}\n\nfunction parseBuildJobState(value: string): BuildJobState {\n if (BUILD_JOB_STATES.includes(value as BuildJobState)) {\n return value as BuildJobState;\n }\n\n throw new Error(`Invalid build job state: ${value}`);\n}\n\nfunction parseBuildJobTarget(value: string, field: string): BuildJobTarget {\n if (\n value === \"reading-graph\" ||\n value === \"knowledge-graph\" ||\n value === \"reading-summary\"\n ) {\n return value;\n }\n\n throw new Error(`Invalid ${field}: ${value}`);\n}\n\nfunction parseOptionalBuildJobTarget(\n value: string | undefined,\n field: string,\n): BuildJobTarget | undefined {\n return value === undefined ? undefined : parseBuildJobTarget(value, field);\n}\n\nfunction formatBuildJobLane(target: BuildJobTarget): string {\n return target === \"knowledge-graph\" ? \"knowledge-graph\" : \"reading\";\n}\n\nfunction getString(row: Record<string, unknown>, key: string): string {\n const value = row[key];\n\n if (typeof value !== \"string\") {\n throw new TypeError(`Expected ${key} to be a string`);\n }\n\n return value;\n}\n\nfunction getNumber(row: Record<string, unknown>, key: string): number {\n const value = row[key];\n\n if (typeof value !== \"number\") {\n throw new TypeError(`Expected ${key} to be a number`);\n }\n\n return value;\n}\n\nfunction getOptionalString(\n row: Record<string, unknown>,\n key: string,\n): string | undefined {\n const value = row[key];\n\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new TypeError(`Expected ${key} to be a string`);\n }\n\n return value;\n}\n\nfunction createArchiveKey(archivePath: string): string {\n return createHash(\"sha256\").update(resolve(archivePath)).digest(\"hex\");\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction formatErrorEvent(error: unknown): unknown {\n if (error instanceof Error) {\n return {\n message: error.message,\n name: error.name,\n stack: error.stack,\n };\n }\n\n return error;\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise<void>((resolveDelay) => {\n setTimeout(resolveDelay, ms);\n });\n}\n\nclass BuildJobProgressAccumulator implements BuildJobProgressReporter {\n readonly #job: BuildJob;\n readonly #ownerId: string;\n readonly #outputCharactersPerToken = 4;\n readonly #refreshIntervalMs = 5_000;\n #graphWords = 0;\n #lastSnapshotAt = 0;\n #outputCharacters = 0;\n #phase: BuildJobProgressPhase | undefined;\n readonly #phaseCounters = new Map<string, BuildJobProgressCounter>();\n #step: BuildJobTarget | undefined;\n #tokenUsage: BuildJobTokenUsage = {};\n #readingSummaryWords = 0;\n #stopCheckQueue: Promise<void> = Promise.resolve();\n #totalGraphWords = 0;\n #totalReadingSummaryWords = 0;\n #writeQueue: Promise<void> = Promise.resolve();\n\n public constructor(job: BuildJob, ownerId: string) {\n this.#job = job;\n this.#ownerId = ownerId;\n }\n\n public async addOutputCharacters(characters: number): Promise<void> {\n await this.#enqueue(async () => {\n await this.throwIfStopped();\n this.#outputCharacters += characters;\n await this.#snapshot();\n });\n }\n\n public async addTokenUsage(usage: BuildJobTokenUsage): Promise<void> {\n await this.#enqueue(async () => {\n await this.throwIfStopped();\n this.#tokenUsage = {\n ...formatOptionalTokenUsage(\n \"cacheReadTokens\",\n addOptionalNumbers(\n this.#tokenUsage.cacheReadTokens,\n usage.cacheReadTokens,\n ),\n ),\n ...formatOptionalTokenUsage(\n \"inputTokens\",\n addOptionalNumbers(this.#tokenUsage.inputTokens, usage.inputTokens),\n ),\n ...formatOptionalTokenUsage(\n \"outputTokens\",\n addOptionalNumbers(this.#tokenUsage.outputTokens, usage.outputTokens),\n ),\n };\n await this.#snapshot(true);\n });\n }\n\n public async setTotals(input: {\n readonly totalGraphWords?: number;\n readonly totalReadingSummaryWords?: number;\n }): Promise<void> {\n await this.#enqueue(async () => {\n await this.throwIfStopped();\n this.#totalGraphWords = input.totalGraphWords ?? this.#totalGraphWords;\n this.#totalReadingSummaryWords =\n input.totalReadingSummaryWords ?? this.#totalReadingSummaryWords;\n await this.#snapshot(true);\n });\n }\n\n public async stepStarted(step: BuildJobTarget): Promise<void> {\n await this.#enqueue(async () => {\n await this.throwIfStopped();\n this.#step = step;\n this.#phase = undefined;\n this.#phaseCounters.clear();\n await markBuildJobStep(this.#job.jobId, step);\n await appendBuildJobEvent(this.#job, {\n at: Date.now(),\n jobId: this.#job.jobId,\n seq: 0,\n step,\n type: \"step_started\",\n });\n await this.#snapshot(true);\n });\n }\n\n public async stepCompleted(step: BuildJobTarget): Promise<void> {\n await this.#enqueue(async () => {\n await this.throwIfStopped();\n this.#step = step;\n this.#phase = undefined;\n this.#phaseCounters.clear();\n await appendBuildJobEvent(this.#job, {\n at: Date.now(),\n jobId: this.#job.jobId,\n seq: 0,\n step,\n type: \"step_completed\",\n });\n await this.#snapshot(true);\n });\n }\n\n public async updateWords(input: {\n readonly graphWords?: number;\n readonly readingSummaryWords?: number;\n }): Promise<void> {\n await this.#enqueue(async () => {\n await this.throwIfStopped();\n this.#graphWords =\n input.graphWords === undefined\n ? this.#graphWords\n : clampProgressWords(input.graphWords, this.#totalGraphWords);\n this.#readingSummaryWords =\n input.readingSummaryWords === undefined\n ? this.#readingSummaryWords\n : clampProgressWords(\n input.readingSummaryWords,\n this.#totalReadingSummaryWords,\n );\n await this.#snapshot();\n });\n }\n\n public async updatePhase(input: {\n readonly done: number;\n readonly force?: boolean;\n readonly phase: BuildJobProgressPhase;\n readonly phaseDetail?: string;\n readonly total: number;\n readonly unit: BuildJobProgressUnit;\n }): Promise<void> {\n await this.#enqueue(async () => {\n await this.throwIfStopped();\n if (this.#phase !== input.phase) {\n this.#phaseCounters.clear();\n }\n this.#phase = input.phase;\n this.#phaseCounters.set(formatProgressCounterKey(input), {\n done: clampProgressWords(input.done, input.total),\n name: formatProgressCounterName(input),\n total: Math.max(0, input.total),\n unit: input.unit,\n });\n await this.#snapshot(input.force ?? true);\n });\n }\n\n public async throwIfStopped(): Promise<void> {\n const queued = this.#stopCheckQueue.then(async () => {\n const job = await readBuildJobForStopCheck(this.#job.jobId);\n\n if (job.state === \"running\" && job.ownerId === this.#ownerId) {\n return;\n }\n\n throw new BuildJobStoppedError(\n `Job ${this.#job.jobId} is ${job.state}. Stop current worker execution.`,\n );\n });\n\n this.#stopCheckQueue = queued.catch(() => undefined);\n await queued;\n }\n\n async #enqueue(operation: () => Promise<void>): Promise<void> {\n const queued = this.#writeQueue.then(operation, operation);\n\n this.#writeQueue = queued.catch(() => undefined);\n await queued;\n }\n\n async #snapshot(force = false): Promise<void> {\n const now = Date.now();\n\n if (!force && now - this.#lastSnapshotAt < this.#refreshIntervalMs) {\n return;\n }\n\n this.#lastSnapshotAt = now;\n const tokens = this.#formatTokenUsage();\n\n await appendBuildJobEvent(this.#job, {\n at: now,\n counters: this.#createCounters(),\n jobId: this.#job.jobId,\n ...(this.#phase === undefined ? {} : { phase: this.#phase }),\n seq: 0,\n ...(this.#step === undefined ? {} : { step: this.#step }),\n ...(tokens === undefined ? {} : { tokens }),\n type: \"status_snapshot\",\n });\n }\n\n #createCounters(): readonly BuildJobProgressCounter[] {\n const wordCounter = this.#createWordCounter();\n return [\n ...(wordCounter === undefined ? [] : [wordCounter]),\n ...this.#phaseCounters.values(),\n ];\n }\n\n #createWordCounter(): BuildJobProgressCounter | undefined {\n switch (this.#step) {\n case \"reading-graph\":\n return this.#totalGraphWords <= 0\n ? undefined\n : {\n done: this.#graphWords,\n name: \"words\",\n total: this.#totalGraphWords,\n unit: \"word\",\n };\n case \"reading-summary\":\n return this.#totalReadingSummaryWords <= 0\n ? undefined\n : {\n done: this.#readingSummaryWords,\n name: \"words\",\n total: this.#totalReadingSummaryWords,\n unit: \"word\",\n };\n case undefined:\n return undefined;\n }\n }\n\n #formatTokenUsage(): BuildJobTokenUsage | undefined {\n const outputTokens =\n this.#tokenUsage.outputTokens ??\n (this.#outputCharacters === 0\n ? undefined\n : Math.floor(this.#outputCharacters / this.#outputCharactersPerToken));\n const usage = {\n ...(this.#tokenUsage.cacheReadTokens === undefined\n ? {}\n : { cacheReadTokens: this.#tokenUsage.cacheReadTokens }),\n ...(this.#tokenUsage.inputTokens === undefined\n ? {}\n : { inputTokens: this.#tokenUsage.inputTokens }),\n ...(outputTokens === undefined ? {} : { outputTokens }),\n };\n\n return Object.keys(usage).length === 0 ? undefined : usage;\n }\n}\n\nfunction formatOptionalTokenUsage(\n key: keyof BuildJobTokenUsage,\n value: number | undefined,\n): BuildJobTokenUsage {\n return value === undefined ? {} : { [key]: value };\n}\n\nfunction addOptionalNumbers(\n left: number | undefined,\n right: number | undefined,\n): number | undefined {\n if (left === undefined && right === undefined) {\n return undefined;\n }\n\n return (left ?? 0) + (right ?? 0);\n}\n\nfunction formatProgressCounterKey(input: {\n readonly phaseDetail?: string;\n readonly unit: BuildJobProgressUnit;\n}): string {\n return input.phaseDetail ?? input.unit;\n}\n\nfunction formatProgressCounterName(input: {\n readonly phaseDetail?: string;\n readonly unit: BuildJobProgressUnit;\n}): string {\n if (input.phaseDetail !== undefined) {\n return input.phaseDetail;\n }\n\n switch (input.unit) {\n case \"candidate\":\n return \"candidates\";\n case \"char\":\n return \"chars\";\n case \"item\":\n return \"items\";\n case \"page\":\n return \"page\";\n case \"qid\":\n return \"qids\";\n case \"record\":\n return \"records\";\n case \"sentence\":\n return \"sentences\";\n case \"window\":\n return \"windows\";\n }\n}\n\nclass BuildJobStoppedError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"BuildJobStoppedError\";\n }\n}\n\nfunction clampProgressWords(words: number, totalWords: number): number {\n if (totalWords <= 0) {\n return Math.max(0, words);\n }\n\n return Math.min(totalWords, Math.max(0, words));\n}\n\nasync function markBuildJobStep(\n jobId: string,\n step: BuildJobTarget,\n): Promise<void> {\n const state = await openBuildQueueDatabase();\n\n try {\n await state.run(\n `\nUPDATE build_jobs\nSET current_step = ?,\n reading_summary_started_at = CASE\n WHEN ? = 'reading-summary' AND reading_summary_started_at IS NULL THEN ?\n ELSE reading_summary_started_at\n END,\n updated_at = ?\nWHERE job_id = ?\n`,\n [step, step, Date.now(), Date.now(), jobId],\n );\n } finally {\n await state.close();\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,60 @@
1
+ import { ReadonlyDocument, Document } from '../document/document.js';
2
+ import { GenerateChapterGraphOptions, GenerateChapterSummaryOptions, ChapterDetails } from './chapter.js';
3
+ import '../source/meta.js';
4
+ import 'zod';
5
+ import '../source/toc.js';
6
+ import '../source/types.js';
7
+ import '../document/database.js';
8
+ import 'sqlite3';
9
+ import '../document/text-streams.js';
10
+ import '../document/types.js';
11
+ import '../document/stores.js';
12
+ import '../common/language.js';
13
+ import '../common/llm-scope.js';
14
+ import '../llm/client.js';
15
+ import '../llm/context.js';
16
+ import '../llm/cache.js';
17
+ import '../llm/types.js';
18
+ import 'ai';
19
+ import '../reader/types.js';
20
+ import '../reader/attention/attention.js';
21
+ import '../reader/chunk-batch/types.js';
22
+ import '../reader/segment/types.js';
23
+ import '../serial.js';
24
+
25
+ interface ChapterGraphBuildArtifact {
26
+ readonly documentPath: string;
27
+ readonly chapterId: number;
28
+ readonly parameter: GraphBuildParameterInput;
29
+ }
30
+ interface GraphBuildParameterInput {
31
+ readonly language?: string;
32
+ readonly prompt: string;
33
+ }
34
+ interface ChapterSummaryInputSnapshot {
35
+ readonly filePath: string;
36
+ }
37
+ interface BuildChapterGraphArtifactOptions extends GenerateChapterGraphOptions {
38
+ readonly sourceText: readonly string[];
39
+ readonly workspacePath: string;
40
+ }
41
+ interface BuildChapterSummaryArtifactOptions extends GenerateChapterSummaryOptions {
42
+ readonly snapshotPath?: string;
43
+ readonly sourceDocumentPath?: string;
44
+ readonly workspacePath: string;
45
+ }
46
+ declare function readChapterBuildInput(document: ReadonlyDocument, chapterId: number): Promise<{
47
+ readonly details: ChapterDetails;
48
+ readonly revision: number;
49
+ readonly sourceText: readonly string[];
50
+ }>;
51
+ declare function buildChapterGraphArtifact(chapterId: number, options: BuildChapterGraphArtifactOptions): Promise<ChapterGraphBuildArtifact>;
52
+ declare function commitChapterGraphArtifact(document: Document, artifact: ChapterGraphBuildArtifact): Promise<ChapterDetails>;
53
+ declare function buildChapterSummaryArtifact(document: ReadonlyDocument, chapterId: number, options: BuildChapterSummaryArtifactOptions): Promise<string>;
54
+ declare function buildChapterSummaryArtifactFromSnapshot(chapterId: number, options: BuildChapterSummaryArtifactOptions & {
55
+ readonly snapshotPath: string;
56
+ }): Promise<string>;
57
+ declare function commitChapterSummaryArtifact(document: Document, chapterId: number, summary: string): Promise<ChapterDetails>;
58
+ declare function snapshotChapterSummaryInput(document: ReadonlyDocument, chapterId: number, workspacePath: string): Promise<ChapterSummaryInputSnapshot>;
59
+
60
+ export { type BuildChapterGraphArtifactOptions, type BuildChapterSummaryArtifactOptions, type ChapterGraphBuildArtifact, type ChapterSummaryInputSnapshot, type GraphBuildParameterInput, buildChapterGraphArtifact, buildChapterSummaryArtifact, buildChapterSummaryArtifactFromSnapshot, commitChapterGraphArtifact, commitChapterSummaryArtifact, readChapterBuildInput, snapshotChapterSummaryInput };