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/knowledge-graph-build.ts"],"sourcesContent":["import { createReadStream, createWriteStream } from \"fs\";\nimport { mkdir, rm } from \"fs/promises\";\nimport { createInterface } from \"readline\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\n\nimport type {\n GuaranteedRequest,\n GuaranteedRequestController,\n} from \"../guaranteed/index.js\";\nimport type {\n Document,\n FragmentRecord,\n MentionLinkRecord,\n MentionRecord,\n ReadonlyDocument,\n SentenceId,\n} from \"../document/index.js\";\nimport { LanguageCode, normalizeLanguageCode } from \"../common/language.js\";\nimport type { WikipageResolveProgress } from \"../wikipage/index.js\";\nimport {\n buildWikimatchSurfaceProtectionInput,\n buildWikimatchWindows,\n enrichWikimatchCandidates,\n filterCandidateQidOptions,\n judgeWikimatchPolicy,\n judgeWikimatchSurfaceProtection,\n listCandidateSelectableQids,\n matchWikispineSentenceCandidates,\n type WikimatchAcceptedMention,\n type WikimatchCandidate,\n type WikimatchSentence,\n type MatchWikispineSentenceCandidatesOptions,\n} from \"../wikimatch/index.js\";\nimport type { WikipageResolverOptions } from \"../wikipage/index.js\";\nimport {\n buildWikilinkEvidenceWindows,\n discoverWikilinkRelations,\n type WikilinkEvidenceWindow,\n type WikilinkMention,\n type WikilinkSentence,\n} from \"../wikilink/index.js\";\n\nimport { getChapterDetails, type ChapterDetails } from \"./chapter.js\";\nimport type { BuildJobProgressReporter } from \"./build-queue.js\";\n\nexport interface ChapterKnowledgeGraphBuildArtifact {\n readonly chapterId: number;\n readonly mentionLinksPath: string;\n readonly mentionsPath: string;\n readonly parameter: GraphBuildParameterInput;\n readonly workspacePath: string;\n}\n\nexport interface ChapterKnowledgeGraphInputSnapshot {\n readonly details: ChapterDetails;\n readonly fragments: readonly FragmentRecord[];\n}\n\nexport interface GraphBuildParameterInput {\n readonly language?: string;\n readonly prompt: string;\n}\n\nexport interface BuildChapterKnowledgeGraphArtifactOptions {\n readonly mentionLinks:\n | AsyncIterable<MentionLinkRecord>\n | Iterable<MentionLinkRecord>;\n readonly mentions: AsyncIterable<MentionRecord> | Iterable<MentionRecord>;\n readonly parameter?: GraphBuildParameterInput;\n readonly workspacePath: string;\n}\n\nexport interface GenerateChapterKnowledgeGraphArtifactOptions {\n readonly policyPrompt: string;\n readonly progressTracker?: Pick<\n BuildJobProgressReporter,\n \"throwIfStopped\" | \"updatePhase\"\n >;\n readonly request: GuaranteedRequestController;\n readonly resolverOptions?: Omit<WikipageResolverOptions, \"progress\">;\n readonly wikispine?: Pick<\n MatchWikispineSentenceCandidatesOptions,\n \"command\" | \"dataDir\" | \"endpoint\" | \"provider\"\n >;\n readonly workspacePath: string;\n}\n\nconst mentionRecordSchema = z.object({\n id: z.string().min(1),\n chapterId: z.number().int(),\n sentenceIndex: z.number().int().nonnegative().optional(),\n rangeStart: z.number().int().nonnegative(),\n rangeEnd: z.number().int().nonnegative(),\n surface: z.string().min(1),\n qid: z.string().regex(/^Q[1-9][0-9]*$/),\n confidence: z.number().min(0).max(1).optional(),\n note: z.string().optional(),\n});\n\nconst sentenceIdSchema = z\n .tuple([z.number().int().nonnegative(), z.number().int().nonnegative()])\n .readonly();\n\nconst mentionLinkRecordSchema = z.object({\n id: z.string().min(1),\n sourceMentionId: z.string().min(1),\n targetMentionId: z.string().min(1),\n predicate: z.string().min(1),\n evidenceSentenceIds: z.array(sentenceIdSchema).min(1),\n confidence: z.number().min(0).max(1).optional(),\n note: z.string().optional(),\n});\n\nconst WIKIMATCH_GROUNDING_DEFAULT_OPTION_BUDGETS = [5, 10, 20, 35] as const;\nconst WIKIMATCH_GROUNDING_PRIOR_OPTION_BUDGETS = [3, 5, 10, 20, 35] as const;\nconst WIKIMATCH_GROUNDING_MAX_OPTION_BUDGET = 50;\nconst WIKIMATCH_GROUNDING_SURFACE_PRIOR_THRESHOLD = 3;\nconst WIKIMATCH_SURFACE_PROTECTION_PERCENTILE = 0.1;\nconst WIKILINK_EVIDENCE_DISTANCE = 700;\nconst WIKILINK_WINDOW_LENGTH = 1800;\n\nexport async function generateChapterKnowledgeGraphArtifact(\n document: ReadonlyDocument,\n chapterId: number,\n options: GenerateChapterKnowledgeGraphArtifactOptions,\n): Promise<ChapterKnowledgeGraphBuildArtifact> {\n return await generateChapterKnowledgeGraphArtifactFromSnapshot(\n chapterId,\n await snapshotChapterKnowledgeGraphInput(document, chapterId),\n options,\n );\n}\n\nexport async function snapshotChapterKnowledgeGraphInput(\n document: ReadonlyDocument,\n chapterId: number,\n): Promise<ChapterKnowledgeGraphInputSnapshot> {\n const details = await getChapterDetails(document, chapterId);\n\n if (details.stage === \"planned\") {\n throw new Error(\n `Chapter ${chapterId} is planned. Set source before generating Knowledge Graph.`,\n );\n }\n\n return {\n details,\n fragments: await readChapterFragments(document, chapterId),\n };\n}\n\nexport async function generateChapterKnowledgeGraphArtifactFromSnapshot(\n chapterId: number,\n snapshot: ChapterKnowledgeGraphInputSnapshot,\n options: GenerateChapterKnowledgeGraphArtifactOptions,\n): Promise<ChapterKnowledgeGraphBuildArtifact> {\n if (snapshot.details.chapterId !== chapterId) {\n throw new Error(\n `Knowledge Graph snapshot belongs to chapter ${snapshot.details.chapterId}, not chapter ${chapterId}.`,\n );\n }\n if (snapshot.details.stage === \"planned\") {\n throw new Error(\n `Chapter ${chapterId} is planned. Set source before generating Knowledge Graph.`,\n );\n }\n\n const fragments = snapshot.fragments;\n const text = joinFragmentText(fragments);\n const sentences = createWikimatchSentences(fragments);\n await options.progressTracker?.updatePhase({\n done: 0,\n phase: \"matching\",\n phaseDetail: \"text\",\n total: text.length,\n unit: \"char\",\n });\n const rawCandidates = await matchWikispineSentenceCandidates({\n includeDisambiguation: true,\n onProgress: async (progress) => {\n await options.progressTracker?.updatePhase({\n done: progress.coveredRangeEnd,\n force: false,\n phase: \"matching\",\n phaseDetail: \"text\",\n total: text.length,\n unit: \"char\",\n });\n },\n ...(options.wikispine ?? {}),\n sentences,\n });\n await options.progressTracker?.throwIfStopped();\n await options.progressTracker?.updatePhase({\n done: text.length,\n phase: \"matching\",\n phaseDetail: \"text\",\n total: text.length,\n unit: \"char\",\n });\n const screenedCandidates = await screenCandidates({\n candidates: rawCandidates,\n policyPrompt: options.policyPrompt,\n ...(options.progressTracker === undefined\n ? {}\n : { progressTracker: options.progressTracker }),\n request: options.request,\n text,\n });\n await options.progressTracker?.throwIfStopped();\n const qidCount = countUniqueQids(screenedCandidates);\n await options.progressTracker?.updatePhase({\n done: 0,\n phase: \"enrichment\",\n total: qidCount,\n unit: \"qid\",\n });\n const enrichedCandidates = await enrichWikimatchCandidates(\n screenedCandidates,\n {\n ...(options.progressTracker === undefined\n ? {}\n : {\n progress: createEnrichmentProgressReporter(options.progressTracker),\n }),\n ...(options.resolverOptions === undefined\n ? {}\n : { resolverOptions: options.resolverOptions }),\n },\n );\n await options.progressTracker?.throwIfStopped();\n await options.progressTracker?.updatePhase({\n done: qidCount,\n phase: \"enrichment\",\n total: qidCount,\n unit: \"qid\",\n });\n const mentions = await judgeCandidates({\n candidates: enrichedCandidates,\n chapterId,\n fragments,\n policyPrompt: options.policyPrompt,\n ...(options.progressTracker === undefined\n ? {}\n : { progressTracker: options.progressTracker }),\n request: options.request,\n text,\n });\n await options.progressTracker?.throwIfStopped();\n const mentionLinks = await discoverMentionLinks({\n fragments,\n mentions,\n ...(options.progressTracker === undefined\n ? {}\n : { progressTracker: options.progressTracker }),\n request: options.request,\n });\n await options.progressTracker?.throwIfStopped();\n const artifact = await buildChapterKnowledgeGraphArtifact(chapterId, {\n mentionLinks,\n mentions,\n parameter: createKnowledgeGraphParameterInput(options),\n workspacePath: options.workspacePath,\n });\n\n return artifact;\n}\n\nexport async function buildChapterKnowledgeGraphArtifact(\n chapterId: number,\n options: BuildChapterKnowledgeGraphArtifactOptions,\n): Promise<ChapterKnowledgeGraphBuildArtifact> {\n const workspacePath = join(\n options.workspacePath,\n \"knowledge-graph\",\n `chapter-${chapterId}`,\n );\n const mentionsPath = join(workspacePath, \"mentions.jsonl\");\n const mentionLinksPath = join(workspacePath, \"mention-links.jsonl\");\n\n await rm(workspacePath, { force: true, recursive: true });\n await mkdir(workspacePath, { recursive: true });\n await writeJsonl(mentionsPath, options.mentions, parseMentionRecord);\n await writeJsonl(\n mentionLinksPath,\n options.mentionLinks,\n parseMentionLinkRecord,\n );\n\n return {\n chapterId,\n mentionLinksPath,\n mentionsPath,\n parameter: options.parameter ?? {\n language: LanguageCode.Chinese,\n prompt: \"\",\n },\n workspacePath,\n };\n}\n\nfunction createKnowledgeGraphParameterInput(\n options: Pick<\n GenerateChapterKnowledgeGraphArtifactOptions,\n \"policyPrompt\" | \"resolverOptions\"\n >,\n): GraphBuildParameterInput {\n return {\n language:\n normalizeLanguageCode(options.resolverOptions?.language) ??\n LanguageCode.Chinese,\n prompt: options.policyPrompt,\n };\n}\n\nasync function screenCandidates(input: {\n readonly candidates: readonly WikimatchCandidate[];\n readonly policyPrompt: string;\n readonly progressTracker?: Pick<\n BuildJobProgressReporter,\n \"throwIfStopped\" | \"updatePhase\"\n >;\n readonly request: GuaranteedRequestController;\n readonly text: string;\n}): Promise<readonly WikimatchCandidate[]> {\n if (input.candidates.length === 0) {\n return [];\n }\n\n const protectionInput = buildWikimatchSurfaceProtectionInput({\n candidates: input.candidates,\n percentile: WIKIMATCH_SURFACE_PROTECTION_PERCENTILE,\n text: input.text,\n });\n\n await input.progressTracker?.updatePhase({\n done: 0,\n phase: \"screening\",\n phaseDetail: `${protectionInput.suspiciousSurfaces.length} high-frequency surfaces`,\n total: 1,\n unit: \"window\",\n });\n await input.progressTracker?.throwIfStopped();\n const protection = await judgeWikimatchSurfaceProtection({\n policyPrompt: input.policyPrompt,\n request: input.request,\n suspiciousSurfaces: protectionInput.suspiciousSurfaces,\n });\n await input.progressTracker?.throwIfStopped();\n const protectedSurfaces = new Set(\n protection.protectedSurfaces.map((surface) => surface.text),\n );\n const allowedCandidateKeys = new Set(\n protectionInput.candidates.map(createCandidateRangeKey),\n );\n\n await input.progressTracker?.updatePhase({\n done: 1,\n phase: \"screening\",\n phaseDetail: `${protectedSurfaces.size} protected surfaces`,\n total: 1,\n unit: \"window\",\n });\n\n return protectionInput.suppressedCandidates.filter(\n (candidate) =>\n allowedCandidateKeys.has(createCandidateRangeKey(candidate)) ||\n protectedSurfaces.has(candidate.surface),\n );\n}\n\nfunction createCandidateRangeKey(candidate: WikimatchCandidate): string {\n return `${candidate.range.start}\\0${candidate.range.end}\\0${candidate.surface}`;\n}\n\nasync function judgeCandidates(input: {\n readonly candidates: readonly WikimatchCandidate[];\n readonly chapterId: number;\n readonly fragments: readonly FragmentRecord[];\n readonly policyPrompt: string;\n readonly progressTracker?: Pick<\n BuildJobProgressReporter,\n \"throwIfStopped\" | \"updatePhase\"\n >;\n readonly request: GuaranteedRequestController;\n readonly text: string;\n}): Promise<readonly MentionRecord[]> {\n const mentions: MentionRecord[] = [];\n const sentenceLocations = buildSentenceLocations(input.fragments);\n const acceptedMentions = await groundWikimatchCandidates({\n candidates: input.candidates,\n policyPrompt: input.policyPrompt,\n ...(input.progressTracker === undefined\n ? {}\n : { progressTracker: input.progressTracker }),\n request: input.request,\n text: input.text,\n });\n let mentionIndex = 1;\n\n for (const mention of acceptedMentions) {\n const location = locateMention(sentenceLocations, mention.range.start);\n\n mentions.push(\n toMentionRecord(input.chapterId, mention, location, mentionIndex),\n );\n mentionIndex += 1;\n }\n\n return mentions;\n}\n\nexport async function groundWikimatchCandidates(input: {\n readonly candidates: readonly WikimatchCandidate[];\n readonly policyPrompt: string;\n readonly progressTracker?: Pick<\n BuildJobProgressReporter,\n \"throwIfStopped\" | \"updatePhase\"\n >;\n readonly request: GuaranteedRequestController;\n readonly text: string;\n}): Promise<readonly WikimatchAcceptedMention[]> {\n const mentions: WikimatchAcceptedMention[] = [];\n const candidatePages = createGroundingCandidatePages(input.candidates);\n let completedWindows = 0;\n let totalWindows = 0;\n\n let activeCandidates = candidatePages.nextPage();\n\n while (activeCandidates.length > 0) {\n const windows = buildWikimatchWindows({\n candidates: activeCandidates,\n contextWords: 220,\n optionBudget: WIKIMATCH_GROUNDING_MAX_OPTION_BUDGET,\n text: input.text,\n });\n\n totalWindows += windows.length;\n if (windows.length === 0) {\n break;\n }\n await input.progressTracker?.updatePhase({\n done: completedWindows,\n phase: \"grounding\",\n total: totalWindows,\n unit: \"window\",\n });\n\n const results = await mapLazyGuaranteedRequests(\n input.request,\n windows,\n async (window, request) => {\n try {\n await input.progressTracker?.throwIfStopped();\n return await judgeWikimatchPolicy({\n candidates: window.candidates,\n policyPrompt: input.policyPrompt,\n request,\n window,\n });\n } finally {\n completedWindows += 1;\n await input.progressTracker?.updatePhase({\n done: completedWindows,\n phase: \"grounding\",\n total: totalWindows,\n unit: \"window\",\n });\n }\n },\n );\n\n const continuedCandidateIds = new Set<string>();\n\n for (const result of results) {\n for (const mention of result.mentions) {\n mentions.push(mention);\n candidatePages.accept(mention);\n }\n for (const update of result.policyUpdates) {\n candidatePages.close(update.candidateId, update.decision);\n }\n for (const continuation of result.continuations) {\n for (const candidateId of continuation.candidateIds) {\n continuedCandidateIds.add(candidateId);\n candidatePages.continue(candidateId);\n }\n }\n }\n\n activeCandidates = candidatePages.nextPage(continuedCandidateIds);\n }\n\n await input.progressTracker?.updatePhase({\n done: completedWindows,\n phase: \"grounding\",\n phaseDetail: formatGroundingEfficiency(\n candidatePages.getStats(),\n mentions.length,\n ),\n total: totalWindows,\n unit: \"window\",\n });\n\n return mentions;\n}\n\nfunction createGroundingCandidatePages(\n candidates: readonly WikimatchCandidate[],\n): {\n readonly accept: (mention: WikimatchAcceptedMention) => void;\n readonly close: (\n candidateId: string,\n decision?: \"skip_this_time\" | \"never_recall\",\n ) => void;\n readonly continue: (candidateId: string) => void;\n readonly getStats: () => GroundingCandidatePageStats;\n readonly nextPage: (\n continuedCandidateIds?: ReadonlySet<string>,\n ) => readonly WikimatchCandidate[];\n} {\n const candidatesById = new Map(\n candidates.map((candidate) => [candidate.id, candidate]),\n );\n const shownQidsByCandidateId = new Map(\n candidates.map((candidate) => [candidate.id, new Set<string>()]),\n );\n const pageIndexesByCandidateId = new Map(\n candidates.map((candidate) => [candidate.id, 0]),\n );\n const closedCandidateIds = new Set<string>();\n const recallCounts = new Map<string, number>();\n const surfaceStats = new Map<string, GroundingSurfaceStats>();\n const stats: GroundingCandidatePageStats = {\n candidatePageCount: 0,\n qidAppearanceCount: 0,\n };\n\n return {\n accept(mention) {\n closedCandidateIds.add(mention.candidateId);\n getSurfaceStats(surfaceStats, mention.surface).recallCount += 1;\n recallCounts.set(\n createSurfaceQidKey(mention.surface, mention.qid),\n (recallCounts.get(createSurfaceQidKey(mention.surface, mention.qid)) ??\n 0) + 1,\n );\n },\n close(candidateId, decision) {\n closedCandidateIds.add(candidateId);\n const candidate = candidatesById.get(candidateId);\n\n if (\n candidate !== undefined &&\n (decision === \"skip_this_time\" || decision === \"never_recall\")\n ) {\n getSurfaceStats(surfaceStats, candidate.surface).rejectCount += 1;\n }\n },\n continue(candidateId) {\n const candidate = candidatesById.get(candidateId);\n\n if (candidate !== undefined) {\n getSurfaceStats(surfaceStats, candidate.surface).continueCount += 1;\n }\n },\n getStats() {\n return { ...stats };\n },\n nextPage(continuedCandidateIds) {\n const pageCandidates: WikimatchCandidate[] = [];\n const candidateIds =\n continuedCandidateIds === undefined\n ? candidates.map((candidate) => candidate.id)\n : [...continuedCandidateIds];\n\n for (const candidateId of candidateIds) {\n if (closedCandidateIds.has(candidateId)) {\n continue;\n }\n\n const candidate = candidatesById.get(candidateId);\n const shownQids = shownQidsByCandidateId.get(candidateId);\n\n if (candidate === undefined || shownQids === undefined) {\n continue;\n }\n\n const sortedCandidate = sortCandidateOptionsByRecall(\n candidate,\n recallCounts,\n );\n const selectableQids = listCandidateSelectableQids(sortedCandidate);\n const pageIndex = pageIndexesByCandidateId.get(candidateId) ?? 0;\n const optionBudget = getGroundingCandidateOptionBudget(\n getSurfaceStats(surfaceStats, candidate.surface),\n pageIndex,\n );\n const selectedQids = selectableQids\n .filter((qid) => !shownQids.has(qid))\n .slice(0, optionBudget);\n\n if (selectedQids.length === 0) {\n closedCandidateIds.add(candidateId);\n continue;\n }\n\n for (const qid of selectedQids) {\n shownQids.add(qid);\n }\n\n const hasMoreOptions = selectableQids.some(\n (qid) => !shownQids.has(qid),\n );\n const pageCandidate = filterCandidateQidOptions(\n sortedCandidate,\n new Set(selectedQids),\n );\n\n if (!hasMoreOptions) {\n closedCandidateIds.add(candidateId);\n }\n getSurfaceStats(surfaceStats, candidate.surface).seenCount += 1;\n pageIndexesByCandidateId.set(candidateId, pageIndex + 1);\n stats.candidatePageCount += 1;\n stats.qidAppearanceCount += selectedQids.length;\n pageCandidates.push({\n ...pageCandidate,\n ...(hasMoreOptions ? { hasMoreOptions: true } : {}),\n });\n }\n\n return pageCandidates;\n },\n };\n}\n\ninterface GroundingSurfaceStats {\n continueCount: number;\n recallCount: number;\n rejectCount: number;\n seenCount: number;\n}\n\ninterface GroundingCandidatePageStats {\n candidatePageCount: number;\n qidAppearanceCount: number;\n}\n\nfunction getSurfaceStats(\n surfaceStats: Map<string, GroundingSurfaceStats>,\n surface: string,\n): GroundingSurfaceStats {\n const existing = surfaceStats.get(surface);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const created = {\n continueCount: 0,\n recallCount: 0,\n rejectCount: 0,\n seenCount: 0,\n };\n surfaceStats.set(surface, created);\n\n return created;\n}\n\nfunction getGroundingCandidateOptionBudget(\n stats: GroundingSurfaceStats,\n pageIndex: number,\n): number {\n const budgets = hasStrongGroundingSurfacePrior(stats)\n ? WIKIMATCH_GROUNDING_PRIOR_OPTION_BUDGETS\n : WIKIMATCH_GROUNDING_DEFAULT_OPTION_BUDGETS;\n\n return budgets[Math.min(pageIndex, budgets.length - 1)]!;\n}\n\nfunction hasStrongGroundingSurfacePrior(stats: GroundingSurfaceStats): boolean {\n if (stats.seenCount < WIKIMATCH_GROUNDING_SURFACE_PRIOR_THRESHOLD) {\n return false;\n }\n\n return (\n (stats.recallCount >= 2 && stats.continueCount === 0) ||\n (stats.rejectCount >= 2 && stats.recallCount === 0) ||\n stats.continueCount >= WIKIMATCH_GROUNDING_SURFACE_PRIOR_THRESHOLD\n );\n}\n\nfunction formatGroundingEfficiency(\n stats: GroundingCandidatePageStats,\n mentionCount: number,\n): string {\n const qidPerMention =\n mentionCount === 0\n ? \"n/a\"\n : (stats.qidAppearanceCount / mentionCount).toFixed(1);\n\n return `efficiency qid/mention=${qidPerMention} qids=${stats.qidAppearanceCount} mentions=${mentionCount} pages=${stats.candidatePageCount}`;\n}\n\nfunction sortCandidateOptionsByRecall(\n candidate: WikimatchCandidate,\n recallCounts: ReadonlyMap<string, number>,\n): WikimatchCandidate {\n return {\n ...candidate,\n qidOptions: [...candidate.qidOptions].sort((left, right) => {\n return (\n getOptionRecallScore(candidate.surface, right, recallCounts) -\n getOptionRecallScore(candidate.surface, left, recallCounts)\n );\n }),\n };\n}\n\nfunction getOptionRecallScore(\n surface: string,\n option: WikimatchCandidate[\"qidOptions\"][number],\n recallCounts: ReadonlyMap<string, number>,\n): number {\n const directScore =\n recallCounts.get(createSurfaceQidKey(surface, option.qid)) ?? 0;\n const disambiguationScore =\n option.disambiguation?.linkedQids.reduce(\n (total, item) =>\n total + (recallCounts.get(createSurfaceQidKey(surface, item.qid)) ?? 0),\n 0,\n ) ?? 0;\n const profileScore =\n option.disambiguation?.profile?.meanings.reduce(\n (total, item) =>\n total + (recallCounts.get(createSurfaceQidKey(surface, item.qid)) ?? 0),\n 0,\n ) ?? 0;\n\n return directScore + disambiguationScore + profileScore;\n}\n\nfunction createSurfaceQidKey(surface: string, qid: string): string {\n return `${surface}\\0${qid}`;\n}\n\nexport function createEnrichmentProgressReporter(\n progressTracker: Pick<\n BuildJobProgressReporter,\n \"throwIfStopped\" | \"updatePhase\"\n >,\n): (event: WikipageResolveProgress) => Promise<void> {\n return async (event) => {\n await progressTracker.throwIfStopped();\n const phase = formatEnrichmentProgressPhase(event);\n\n await progressTracker.updatePhase({\n done: event.done,\n ...(phase.detail === undefined ? {} : { phaseDetail: phase.detail }),\n phase: \"enrichment\",\n total: event.total,\n unit: phase.unit,\n });\n };\n}\n\nfunction formatEnrichmentProgressPhase(event: WikipageResolveProgress): {\n readonly detail?: string;\n readonly unit: \"page\" | \"qid\" | \"record\";\n} {\n switch (event.detail) {\n case \"disambiguation-page\":\n return {\n detail: \"disambiguation\",\n unit: \"page\",\n };\n case \"entity\":\n return {\n detail: \"entity\",\n unit: \"record\",\n };\n case \"linked-page\":\n return {\n detail: \"linked\",\n unit: \"page\",\n };\n case \"page\":\n return {\n detail: \"page\",\n unit: \"page\",\n };\n case \"qid\":\n return {\n unit: \"qid\",\n };\n }\n}\n\nasync function mapLazyGuaranteedRequests<TItem, TResult>(\n request: GuaranteedRequestController,\n items: readonly TItem[],\n operation: (item: TItem, request: GuaranteedRequest) => Promise<TResult>,\n): Promise<readonly TResult[]> {\n const lazy = request.lazy;\n\n if (lazy !== undefined) {\n return await Promise.all(\n items.map(\n async (item) =>\n await lazy(async (request) => await operation(item, request)),\n ),\n );\n }\n\n const results: TResult[] = [];\n\n for (const item of items) {\n results.push(await operation(item, request));\n }\n\n return results;\n}\n\nasync function discoverMentionLinks(input: {\n readonly fragments: readonly FragmentRecord[];\n readonly mentions: readonly MentionRecord[];\n readonly progressTracker?: Pick<\n BuildJobProgressReporter,\n \"throwIfStopped\" | \"updatePhase\"\n >;\n readonly request: GuaranteedRequestController;\n}): Promise<readonly MentionLinkRecord[]> {\n const fragmentWindows = buildMentionLinkWindows(\n input.fragments,\n input.mentions,\n );\n let completedWindows = 0;\n\n await input.progressTracker?.updatePhase({\n done: 0,\n phase: \"relation-discovery\",\n total: fragmentWindows.length,\n unit: \"window\",\n });\n\n const discoveredLinks = (\n await mapLazyGuaranteedRequests(\n input.request,\n fragmentWindows,\n async (item, request) => {\n try {\n await input.progressTracker?.throwIfStopped();\n return await discoverWikilinkRelations({\n chapterId: item.fragment.serialId,\n fragmentId: item.fragment.fragmentId,\n request,\n sentences: item.fragment.sentences,\n window: item.window,\n });\n } finally {\n completedWindows += 1;\n await input.progressTracker?.updatePhase({\n done: completedWindows,\n phase: \"relation-discovery\",\n total: fragmentWindows.length,\n unit: \"window\",\n });\n }\n },\n )\n ).flat();\n\n return discoveredLinks.map((link, index) => ({\n ...(link.confidence === undefined ? {} : { confidence: link.confidence }),\n evidenceSentenceIds: link.evidenceSentenceIds,\n id: `l${input.fragments[0]?.serialId ?? 0}-${index + 1}`,\n predicate: link.predicate,\n sourceMentionId: link.sourceMentionId,\n targetMentionId: link.targetMentionId,\n }));\n}\n\nfunction buildMentionLinkWindows(\n fragments: readonly FragmentRecord[],\n mentions: readonly MentionRecord[],\n): ReadonlyArray<{\n readonly fragment: FragmentRecord;\n readonly window: WikilinkEvidenceWindow;\n}> {\n return fragments.flatMap((fragment) => {\n const startSentenceIndex = fragment.fragmentId;\n const endSentenceIndex = startSentenceIndex + fragment.sentences.length - 1;\n const fragmentMentions = toWikilinkMentions(\n fragment.sentences,\n mentions.filter(\n (mention) =>\n mention.sentenceIndex !== undefined &&\n mention.sentenceIndex >= startSentenceIndex &&\n mention.sentenceIndex <= endSentenceIndex,\n ),\n startSentenceIndex,\n );\n const windows = buildWikilinkEvidenceWindows({\n maxEvidenceDistance: WIKILINK_EVIDENCE_DISTANCE,\n mentions: fragmentMentions,\n text: joinSentences(fragment.sentences),\n windowLength: WIKILINK_WINDOW_LENGTH,\n });\n\n return windows.map((window) => ({\n fragment,\n window,\n }));\n });\n}\n\nfunction toWikilinkMentions(\n sentences: readonly WikilinkSentence[],\n mentions: readonly MentionRecord[],\n startSentenceIndex: number,\n): readonly WikilinkMention[] {\n const sentenceOffsets = buildFragmentSentenceOffsets(sentences);\n\n return mentions.flatMap((mention) => {\n if (mention.sentenceIndex === undefined) {\n return [];\n }\n\n const sentenceOffset =\n sentenceOffsets[mention.sentenceIndex - startSentenceIndex];\n\n if (sentenceOffset === undefined) {\n return [];\n }\n\n return [\n {\n id: mention.id,\n qid: mention.qid,\n range: {\n end: sentenceOffset.start + mention.rangeEnd,\n start: sentenceOffset.start + mention.rangeStart,\n },\n surface: mention.surface,\n },\n ];\n });\n}\n\nfunction buildFragmentSentenceOffsets(\n sentences: readonly WikilinkSentence[],\n): ReadonlyArray<{ readonly end: number; readonly start: number }> {\n const offsets: Array<{ readonly end: number; readonly start: number }> = [];\n let cursor = 0;\n\n for (const sentence of sentences) {\n const start = cursor;\n const end = start + sentence.text.length;\n\n offsets.push({ end, start });\n cursor = end + 1;\n }\n\n return offsets;\n}\n\nfunction joinSentences(sentences: readonly WikilinkSentence[]): string {\n return sentences.map((sentence) => sentence.text).join(\" \");\n}\n\nfunction countUniqueQids(candidates: readonly WikimatchCandidate[]): number {\n return new Set(\n candidates.flatMap((candidate) =>\n candidate.qidOptions.map((option) => option.qid),\n ),\n ).size;\n}\n\nfunction toMentionRecord(\n chapterId: number,\n mention: WikimatchAcceptedMention,\n location: {\n readonly rangeStart: number;\n readonly sentenceIndex: number;\n },\n index: number,\n): MentionRecord {\n return {\n chapterId,\n ...(mention.confidence === undefined\n ? {}\n : { confidence: mention.confidence }),\n id: `m${chapterId}-${index}`,\n ...(mention.note === undefined ? {} : { note: mention.note }),\n qid: mention.qid,\n rangeEnd: location.rangeStart + mention.surface.length,\n rangeStart: location.rangeStart,\n sentenceIndex: location.sentenceIndex,\n surface: mention.surface,\n };\n}\n\ninterface SentenceLocation {\n readonly absoluteStart: number;\n readonly length: number;\n readonly sentenceIndex: number;\n}\n\nfunction buildSentenceLocations(\n fragments: readonly FragmentRecord[],\n): readonly SentenceLocation[] {\n const locations: SentenceLocation[] = [];\n let offset = 0;\n\n for (const fragment of fragments) {\n for (\n let sentenceIndex = 0;\n sentenceIndex < fragment.sentences.length;\n sentenceIndex += 1\n ) {\n const length = fragment.sentences[sentenceIndex]!.text.length;\n\n locations.push({\n absoluteStart: offset,\n length,\n sentenceIndex: fragment.fragmentId + sentenceIndex,\n });\n offset += length + 1;\n }\n }\n\n return locations;\n}\n\nfunction locateMention(\n locations: readonly SentenceLocation[],\n absoluteOffset: number,\n): {\n readonly rangeStart: number;\n readonly sentenceIndex: number;\n} {\n for (const location of locations) {\n const rangeEnd = location.absoluteStart + location.length;\n\n if (absoluteOffset >= location.absoluteStart && absoluteOffset < rangeEnd) {\n return {\n rangeStart: absoluteOffset - location.absoluteStart,\n sentenceIndex: location.sentenceIndex,\n };\n }\n }\n\n throw new Error(`Mention offset ${absoluteOffset} is outside chapter text.`);\n}\n\nasync function readChapterFragments(\n document: ReadonlyDocument,\n chapterId: number,\n): Promise<readonly FragmentRecord[]> {\n const serialFragments = document.getSerialFragments(chapterId);\n\n return await Promise.all(\n (await serialFragments.listFragmentIds()).map(\n async (fragmentId) => await serialFragments.getFragment(fragmentId),\n ),\n );\n}\n\nfunction joinFragmentText(fragments: readonly FragmentRecord[]): string {\n return fragments\n .flatMap((fragment) => fragment.sentences.map((sentence) => sentence.text))\n .join(\" \");\n}\n\nfunction createWikimatchSentences(\n fragments: readonly FragmentRecord[],\n): readonly WikimatchSentence[] {\n const sentences: WikimatchSentence[] = [];\n let offset = 0;\n\n for (const fragment of fragments) {\n for (let index = 0; index < fragment.sentences.length; index += 1) {\n const sentence = fragment.sentences[index]!;\n\n sentences.push({\n id: `${fragment.serialId}:${fragment.fragmentId + index}`,\n range: {\n end: offset + sentence.text.length,\n start: offset,\n },\n text: sentence.text,\n });\n offset += sentence.text.length + 1;\n }\n }\n\n return sentences;\n}\n\nexport async function commitChapterKnowledgeGraphArtifact(\n document: Document,\n artifact: ChapterKnowledgeGraphBuildArtifact,\n): Promise<void> {\n const mentions = await readJsonl(artifact.mentionsPath, parseMentionRecord);\n const mentionLinks = await readJsonl(\n artifact.mentionLinksPath,\n parseMentionLinkRecord,\n );\n\n validateChapterKnowledgeGraphArtifact(artifact.chapterId, {\n mentionLinks,\n mentions,\n });\n\n await document.openSession(async (openedDocument) => {\n await openedDocument.serials.ensure(artifact.chapterId);\n const existingLinks = await openedDocument.mentionLinks.listByChapter(\n artifact.chapterId,\n );\n\n if (existingLinks.length > 0 && mentionLinks.length === 0) {\n throw new Error(\n `Refusing to replace chapter ${artifact.chapterId} knowledge graph with an artifact that contains no mention links.`,\n );\n }\n\n await openedDocument.mentionLinks.deleteByChapter(artifact.chapterId);\n await openedDocument.mentions.deleteByChapter(artifact.chapterId);\n await openedDocument.mentions.saveMany(mentions);\n await openedDocument.mentionLinks.saveMany(mentionLinks);\n const parameter = await openedDocument.graphBuildParameters.save(\n artifact.parameter,\n );\n await openedDocument.serials.setKnowledgeGraphReady(\n artifact.chapterId,\n true,\n parameter.hash,\n );\n });\n}\n\nexport async function clearChapterKnowledgeGraph(\n document: Document,\n chapterId: number,\n): Promise<void> {\n await document.openSession(async (openedDocument) => {\n await openedDocument.mentionLinks.deleteByChapter(chapterId);\n await openedDocument.mentions.deleteByChapter(chapterId);\n await openedDocument.serials.setKnowledgeGraphReady(chapterId, false);\n await openedDocument.graphBuildParameters.deleteUnreferenced();\n });\n}\n\nfunction validateChapterKnowledgeGraphArtifact(\n chapterId: number,\n records: {\n readonly mentionLinks: readonly MentionLinkRecord[];\n readonly mentions: readonly MentionRecord[];\n },\n): void {\n const mentionIds = new Set<string>();\n\n for (const mention of records.mentions) {\n if (mention.chapterId !== chapterId) {\n throw new Error(\n `Mention ${mention.id} belongs to chapter ${mention.chapterId}, expected chapter ${chapterId}.`,\n );\n }\n if (mention.rangeEnd <= mention.rangeStart) {\n throw new Error(\n `Mention ${mention.id} has invalid range [${mention.rangeStart}, ${mention.rangeEnd}).`,\n );\n }\n if (mentionIds.has(mention.id)) {\n throw new Error(`Duplicate mention id ${mention.id}.`);\n }\n\n mentionIds.add(mention.id);\n }\n\n const linkIds = new Set<string>();\n\n for (const link of records.mentionLinks) {\n if (linkIds.has(link.id)) {\n throw new Error(`Duplicate mention link id ${link.id}.`);\n }\n if (!mentionIds.has(link.sourceMentionId)) {\n throw new Error(\n `Mention link ${link.id} references unknown source mention ${link.sourceMentionId}.`,\n );\n }\n if (!mentionIds.has(link.targetMentionId)) {\n throw new Error(\n `Mention link ${link.id} references unknown target mention ${link.targetMentionId}.`,\n );\n }\n if (link.evidenceSentenceIds.length === 0) {\n throw new Error(`Mention link ${link.id} has no evidence sentences.`);\n }\n\n for (const sentenceId of link.evidenceSentenceIds) {\n if (sentenceId[0] !== chapterId) {\n throw new Error(\n `Mention link ${link.id} evidence sentence ${formatSentenceId(sentenceId)} is outside chapter ${chapterId}.`,\n );\n }\n }\n\n linkIds.add(link.id);\n }\n}\n\nfunction formatSentenceId(sentenceId: SentenceId): string {\n return sentenceId.join(\":\");\n}\n\nasync function writeJsonl<T>(\n path: string,\n records: AsyncIterable<T> | Iterable<T>,\n parseRecord: (record: unknown) => T,\n): Promise<void> {\n const stream = createWriteStream(path, { encoding: \"utf8\", flags: \"wx\" });\n\n try {\n for await (const record of records) {\n stream.write(`${JSON.stringify(parseRecord(record))}\\n`);\n }\n } finally {\n await closeWritableStream(stream);\n }\n}\n\nasync function readJsonl<T>(\n path: string,\n parseRecord: (record: unknown) => T,\n): Promise<T[]> {\n const records: T[] = [];\n const lines = createInterface({\n crlfDelay: Infinity,\n input: createReadStream(path, { encoding: \"utf8\" }),\n });\n let lineNumber = 0;\n\n for await (const line of lines) {\n lineNumber += 1;\n if (line.trim() === \"\") {\n continue;\n }\n\n try {\n records.push(parseRecord(JSON.parse(line)));\n } catch (error) {\n throw new Error(`Invalid JSONL record at ${path}:${lineNumber}`, {\n cause: error,\n });\n }\n }\n\n return records;\n}\n\nfunction parseMentionRecord(record: unknown): MentionRecord {\n const parsed = mentionRecordSchema.parse(record);\n\n return {\n chapterId: parsed.chapterId,\n ...(parsed.confidence === undefined\n ? {}\n : { confidence: parsed.confidence }),\n id: parsed.id,\n ...(parsed.note === undefined ? {} : { note: parsed.note }),\n qid: parsed.qid,\n rangeEnd: parsed.rangeEnd,\n rangeStart: parsed.rangeStart,\n ...(parsed.sentenceIndex === undefined\n ? {}\n : { sentenceIndex: parsed.sentenceIndex }),\n surface: parsed.surface,\n };\n}\n\nfunction parseMentionLinkRecord(record: unknown): MentionLinkRecord {\n const parsed = mentionLinkRecordSchema.parse(record);\n\n return {\n ...(parsed.confidence === undefined\n ? {}\n : { confidence: parsed.confidence }),\n evidenceSentenceIds: parsed.evidenceSentenceIds,\n id: parsed.id,\n ...(parsed.note === undefined ? {} : { note: parsed.note }),\n predicate: parsed.predicate,\n sourceMentionId: parsed.sourceMentionId,\n targetMentionId: parsed.targetMentionId,\n };\n}\n\nasync function closeWritableStream(\n stream: NodeJS.WritableStream,\n): Promise<void> {\n await new Promise<void>((resolveClose, rejectClose) => {\n stream.end((error?: Error | null) => {\n if (error !== undefined && error !== null) {\n rejectClose(error);\n return;\n }\n\n resolveClose();\n });\n });\n}\n"],"mappings":"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","names":["request"]}
@@ -0,0 +1,11 @@
1
+ import { WikiGraphScope } from '../common/llm-scope.js';
2
+ import { TemperatureSetting, SamplingScopeConfig } from '../llm/types.js';
3
+ import 'ai';
4
+
5
+ type WikiGraphSamplingConfig = SamplingScopeConfig<WikiGraphScope>;
6
+ declare function createDefaultWikiGraphSampling(input?: {
7
+ readonly temperature?: TemperatureSetting;
8
+ readonly topP?: TemperatureSetting;
9
+ }): WikiGraphSamplingConfig;
10
+
11
+ export { type WikiGraphSamplingConfig, createDefaultWikiGraphSampling };
@@ -0,0 +1,58 @@
1
+ import { WikiGraphScope } from "../common/llm-scope.js";
2
+ const DEFAULT_WIKI_GRAPH_SAMPLING = Object.freeze({
3
+ [WikiGraphScope.EditorCompress]: Object.freeze({
4
+ temperature: 0.7,
5
+ topP: 0.9
6
+ }),
7
+ [WikiGraphScope.EditorReview]: Object.freeze({
8
+ temperature: [0.3, 0.95],
9
+ topP: [0.4, 0.8]
10
+ }),
11
+ [WikiGraphScope.EditorReviewGuide]: Object.freeze({
12
+ temperature: 0.4,
13
+ topP: 0.6
14
+ }),
15
+ [WikiGraphScope.ReaderChoice]: Object.freeze({
16
+ temperature: [0.3, 0.95],
17
+ topP: [0.4, 0.8]
18
+ }),
19
+ [WikiGraphScope.ReaderExtraction]: Object.freeze({
20
+ temperature: [0.3, 0.95],
21
+ topP: [0.4, 0.8]
22
+ })
23
+ });
24
+ function createDefaultWikiGraphSampling(input = {}) {
25
+ return Object.freeze({
26
+ [WikiGraphScope.EditorCompress]: applySamplingOverrides(
27
+ DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.EditorCompress],
28
+ input
29
+ ),
30
+ [WikiGraphScope.EditorReview]: applySamplingOverrides(
31
+ DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.EditorReview],
32
+ input
33
+ ),
34
+ [WikiGraphScope.EditorReviewGuide]: applySamplingOverrides(
35
+ DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.EditorReviewGuide],
36
+ input
37
+ ),
38
+ [WikiGraphScope.ReaderChoice]: applySamplingOverrides(
39
+ DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.ReaderChoice],
40
+ input
41
+ ),
42
+ [WikiGraphScope.ReaderExtraction]: applySamplingOverrides(
43
+ DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.ReaderExtraction],
44
+ input
45
+ )
46
+ });
47
+ }
48
+ function applySamplingOverrides(profile, input) {
49
+ return Object.freeze({
50
+ ...profile,
51
+ ...input.temperature === void 0 ? {} : { temperature: input.temperature },
52
+ ...input.topP === void 0 ? {} : { topP: input.topP }
53
+ });
54
+ }
55
+ export {
56
+ createDefaultWikiGraphSampling
57
+ };
58
+ //# sourceMappingURL=llm-sampling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/facade/llm-sampling.ts"],"sourcesContent":["import { WikiGraphScope } from \"../common/llm-scope.js\";\nimport type {\n SamplingProfile,\n SamplingScopeConfig,\n TemperatureSetting,\n} from \"../llm/index.js\";\n\nexport type WikiGraphSamplingConfig = SamplingScopeConfig<WikiGraphScope>;\n\nconst DEFAULT_WIKI_GRAPH_SAMPLING = Object.freeze({\n [WikiGraphScope.EditorCompress]: Object.freeze({\n temperature: 0.7,\n topP: 0.9,\n }),\n [WikiGraphScope.EditorReview]: Object.freeze({\n temperature: [0.3, 0.95] as const,\n topP: [0.4, 0.8] as const,\n }),\n [WikiGraphScope.EditorReviewGuide]: Object.freeze({\n temperature: 0.4,\n topP: 0.6,\n }),\n [WikiGraphScope.ReaderChoice]: Object.freeze({\n temperature: [0.3, 0.95] as const,\n topP: [0.4, 0.8] as const,\n }),\n [WikiGraphScope.ReaderExtraction]: Object.freeze({\n temperature: [0.3, 0.95] as const,\n topP: [0.4, 0.8] as const,\n }),\n} satisfies WikiGraphSamplingConfig);\n\nexport function createDefaultWikiGraphSampling(\n input: {\n readonly temperature?: TemperatureSetting;\n readonly topP?: TemperatureSetting;\n } = {},\n): WikiGraphSamplingConfig {\n return Object.freeze({\n [WikiGraphScope.EditorCompress]: applySamplingOverrides(\n DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.EditorCompress],\n input,\n ),\n [WikiGraphScope.EditorReview]: applySamplingOverrides(\n DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.EditorReview],\n input,\n ),\n [WikiGraphScope.EditorReviewGuide]: applySamplingOverrides(\n DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.EditorReviewGuide],\n input,\n ),\n [WikiGraphScope.ReaderChoice]: applySamplingOverrides(\n DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.ReaderChoice],\n input,\n ),\n [WikiGraphScope.ReaderExtraction]: applySamplingOverrides(\n DEFAULT_WIKI_GRAPH_SAMPLING[WikiGraphScope.ReaderExtraction],\n input,\n ),\n } satisfies WikiGraphSamplingConfig);\n}\n\nfunction applySamplingOverrides(\n profile: SamplingProfile,\n input: {\n readonly temperature?: TemperatureSetting;\n readonly topP?: TemperatureSetting;\n },\n): SamplingProfile {\n return Object.freeze({\n ...profile,\n ...(input.temperature === undefined\n ? {}\n : { temperature: input.temperature }),\n ...(input.topP === undefined ? {} : { topP: input.topP }),\n });\n}\n"],"mappings":"AAAA,SAAS,sBAAsB;AAS/B,MAAM,8BAA8B,OAAO,OAAO;AAAA,EAChD,CAAC,eAAe,cAAc,GAAG,OAAO,OAAO;AAAA,IAC7C,aAAa;AAAA,IACb,MAAM;AAAA,EACR,CAAC;AAAA,EACD,CAAC,eAAe,YAAY,GAAG,OAAO,OAAO;AAAA,IAC3C,aAAa,CAAC,KAAK,IAAI;AAAA,IACvB,MAAM,CAAC,KAAK,GAAG;AAAA,EACjB,CAAC;AAAA,EACD,CAAC,eAAe,iBAAiB,GAAG,OAAO,OAAO;AAAA,IAChD,aAAa;AAAA,IACb,MAAM;AAAA,EACR,CAAC;AAAA,EACD,CAAC,eAAe,YAAY,GAAG,OAAO,OAAO;AAAA,IAC3C,aAAa,CAAC,KAAK,IAAI;AAAA,IACvB,MAAM,CAAC,KAAK,GAAG;AAAA,EACjB,CAAC;AAAA,EACD,CAAC,eAAe,gBAAgB,GAAG,OAAO,OAAO;AAAA,IAC/C,aAAa,CAAC,KAAK,IAAI;AAAA,IACvB,MAAM,CAAC,KAAK,GAAG;AAAA,EACjB,CAAC;AACH,CAAmC;AAE5B,SAAS,+BACd,QAGI,CAAC,GACoB;AACzB,SAAO,OAAO,OAAO;AAAA,IACnB,CAAC,eAAe,cAAc,GAAG;AAAA,MAC/B,4BAA4B,eAAe,cAAc;AAAA,MACzD;AAAA,IACF;AAAA,IACA,CAAC,eAAe,YAAY,GAAG;AAAA,MAC7B,4BAA4B,eAAe,YAAY;AAAA,MACvD;AAAA,IACF;AAAA,IACA,CAAC,eAAe,iBAAiB,GAAG;AAAA,MAClC,4BAA4B,eAAe,iBAAiB;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,CAAC,eAAe,YAAY,GAAG;AAAA,MAC7B,4BAA4B,eAAe,YAAY;AAAA,MACvD;AAAA,IACF;AAAA,IACA,CAAC,eAAe,gBAAgB,GAAG;AAAA,MACjC,4BAA4B,eAAe,gBAAgB;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,CAAmC;AACrC;AAEA,SAAS,uBACP,SACA,OAIiB;AACjB,SAAO,OAAO,OAAO;AAAA,IACnB,GAAG;AAAA,IACH,GAAI,MAAM,gBAAgB,SACtB,CAAC,IACD,EAAE,aAAa,MAAM,YAAY;AAAA,IACrC,GAAI,MAAM,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;AAAA,EACzD,CAAC;AACH;","names":[]}
@@ -0,0 +1,8 @@
1
+ interface WikiGraphSerialEntry {
2
+ readonly fragmentCount: number;
3
+ readonly serialId: number;
4
+ readonly title: string | null;
5
+ readonly tocPath: readonly string[];
6
+ }
7
+
8
+ export type { WikiGraphSerialEntry };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,41 @@
1
+ import { ReadonlyDocument } from '../document/document.js';
2
+ import { BookMeta } from '../source/meta.js';
3
+ import { SourceAsset } from '../source/types.js';
4
+ import { TocFile } from '../source/toc.js';
5
+ import { ChapterStage } from './chapter.js';
6
+ import { WikiGraphSerialEntry } from './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 'zod';
13
+ import '../common/language.js';
14
+ import '../common/llm-scope.js';
15
+ import '../llm/client.js';
16
+ import '../llm/context.js';
17
+ import '../llm/cache.js';
18
+ import '../llm/types.js';
19
+ import 'ai';
20
+ import '../reader/types.js';
21
+ import '../reader/attention/attention.js';
22
+ import '../reader/chunk-batch/types.js';
23
+ import '../reader/segment/types.js';
24
+ import '../serial.js';
25
+
26
+ declare class WikiGraphArchive {
27
+ #private;
28
+ constructor(document: ReadonlyDocument, documentDirectoryPath: string);
29
+ exportEpub(path: string): Promise<void>;
30
+ exportText(path: string): Promise<void>;
31
+ readCover(): Promise<SourceAsset | undefined>;
32
+ readMeta(): Promise<BookMeta | undefined>;
33
+ readToc(): Promise<TocFile | undefined>;
34
+ readArchiveFormatVersion(): Promise<number>;
35
+ readChapterStage(serialId: number): Promise<ChapterStage>;
36
+ listSerials(): Promise<readonly WikiGraphSerialEntry[]>;
37
+ readSerialSummary(serialId: number): Promise<string>;
38
+ saveAs(path: string): Promise<void>;
39
+ }
40
+
41
+ export { WikiGraphArchive };
@@ -0,0 +1,130 @@
1
+ import { writeEpub, writePlainText } from "../output/index.js";
2
+ import {
3
+ readWikgArchiveFormatVersion,
4
+ writeWikgArchive
5
+ } from "../wikg/index.js";
6
+ class WikiGraphArchive {
7
+ #document;
8
+ #documentDirectoryPath;
9
+ constructor(document, documentDirectoryPath) {
10
+ this.#document = document;
11
+ this.#documentDirectoryPath = documentDirectoryPath;
12
+ }
13
+ async exportEpub(path) {
14
+ await writeEpub({
15
+ document: this.#document,
16
+ path
17
+ });
18
+ }
19
+ async exportText(path) {
20
+ await writePlainText({
21
+ document: this.#document,
22
+ path
23
+ });
24
+ }
25
+ async readCover() {
26
+ return await this.#document.readCover();
27
+ }
28
+ async readMeta() {
29
+ return await this.#document.readBookMeta();
30
+ }
31
+ async readToc() {
32
+ return await this.#document.readToc();
33
+ }
34
+ async readArchiveFormatVersion() {
35
+ return await readWikgArchiveFormatVersion(this.#documentDirectoryPath);
36
+ }
37
+ async readChapterStage(serialId) {
38
+ return await this.#document.openSession(async (document) => {
39
+ const toc = await document.readToc();
40
+ if (toc === void 0) {
41
+ throw new Error("Document TOC is missing");
42
+ }
43
+ if (!toc.items.some((item) => hasSerialId(item, serialId))) {
44
+ throw new Error(
45
+ `Chapter ${serialId} does not exist. Use \`wg <archive-uri>/chapter list\` to discover chapter ids.`
46
+ );
47
+ }
48
+ const summary = await document.readSummary(serialId);
49
+ if (summary !== void 0) {
50
+ return "summarized";
51
+ }
52
+ const serial = await document.serials.getById(serialId);
53
+ if (serial?.topologyReady === true) {
54
+ return "graphed";
55
+ }
56
+ if ((await document.getSerialFragments(serialId).listFragmentIds()).length > 0) {
57
+ return "sourced";
58
+ }
59
+ return "planned";
60
+ });
61
+ }
62
+ async listSerials() {
63
+ return await this.#document.openSession(async (document) => {
64
+ const toc = await document.readToc();
65
+ if (toc === void 0) {
66
+ throw new Error("Document TOC is missing");
67
+ }
68
+ return await collectSerialEntries(document, toc.items);
69
+ });
70
+ }
71
+ async readSerialSummary(serialId) {
72
+ return await this.#document.openSession(async (document) => {
73
+ const record = await document.serials.getById(serialId);
74
+ if (record === void 0) {
75
+ throw new Error(
76
+ `No completed summary exists for id ${serialId}. Use \`wg wikg://<archive.wikg>/chapter list\` to discover chapter ids, then \`wg wikg://<archive.wikg>/chapter/${serialId}/summary get\` after summary is ready.`
77
+ );
78
+ }
79
+ const summary = await document.readSummary(serialId);
80
+ if (summary === void 0) {
81
+ throw new Error(
82
+ `Chapter ${serialId} summary is missing. Run \`wg wikg://local/job add --input <chapter-uri> --task reading-summary --accept-cost\` before export, or inspect the archive with \`wg <archive-uri>/chapter/tree get\`.`
83
+ );
84
+ }
85
+ return summary;
86
+ });
87
+ }
88
+ async saveAs(path) {
89
+ await flushDocument(this.#document);
90
+ await writeWikgArchive(this.#documentDirectoryPath, path);
91
+ }
92
+ }
93
+ function hasSerialId(item, serialId) {
94
+ return item.serialId === serialId || item.children.some((child) => hasSerialId(child, serialId));
95
+ }
96
+ async function flushDocument(document) {
97
+ if (!isFlushableDocument(document)) {
98
+ return;
99
+ }
100
+ await document.flush();
101
+ }
102
+ function isFlushableDocument(document) {
103
+ return "flush" in document && typeof document.flush === "function";
104
+ }
105
+ async function collectSerialEntries(document, items, ancestorTitles = []) {
106
+ const entries = [];
107
+ for (const item of items) {
108
+ const title = item.title?.trim() || `Chapter ${item.serialId ?? "group"}`;
109
+ const tocPath = [...ancestorTitles, title];
110
+ if (item.serialId !== void 0) {
111
+ const summary = await document.readSummary(item.serialId);
112
+ if (summary !== void 0) {
113
+ entries.push({
114
+ fragmentCount: (await document.getSerialFragments(item.serialId).listFragmentIds()).length,
115
+ serialId: item.serialId,
116
+ title,
117
+ tocPath
118
+ });
119
+ }
120
+ }
121
+ entries.push(
122
+ ...await collectSerialEntries(document, item.children, tocPath)
123
+ );
124
+ }
125
+ return entries;
126
+ }
127
+ export {
128
+ WikiGraphArchive
129
+ };
130
+ //# sourceMappingURL=wiki-graph-archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/facade/wiki-graph-archive.ts"],"sourcesContent":["import type { ReadonlyDocument } from \"../document/index.js\";\nimport { writeEpub, writePlainText } from \"../output/index.js\";\nimport type {\n BookMeta,\n SourceAsset,\n TocFile,\n TocItem,\n} from \"../source/index.js\";\n\nimport {\n readWikgArchiveFormatVersion,\n writeWikgArchive,\n} from \"../wikg/index.js\";\nimport type { ChapterStage } from \"./chapter.js\";\nimport type { WikiGraphSerialEntry } from \"./types.js\";\n\nexport class WikiGraphArchive {\n readonly #document: ReadonlyDocument;\n readonly #documentDirectoryPath: string;\n\n public constructor(\n document: ReadonlyDocument,\n documentDirectoryPath: string,\n ) {\n this.#document = document;\n this.#documentDirectoryPath = documentDirectoryPath;\n }\n\n public async exportEpub(path: string): Promise<void> {\n await writeEpub({\n document: this.#document,\n path,\n });\n }\n\n public async exportText(path: string): Promise<void> {\n await writePlainText({\n document: this.#document,\n path,\n });\n }\n\n public async readCover(): Promise<SourceAsset | undefined> {\n return await this.#document.readCover();\n }\n\n public async readMeta(): Promise<BookMeta | undefined> {\n return await this.#document.readBookMeta();\n }\n\n public async readToc(): Promise<TocFile | undefined> {\n return await this.#document.readToc();\n }\n\n public async readArchiveFormatVersion(): Promise<number> {\n return await readWikgArchiveFormatVersion(this.#documentDirectoryPath);\n }\n\n public async readChapterStage(serialId: number): Promise<ChapterStage> {\n return await this.#document.openSession(async (document) => {\n const toc = await document.readToc();\n\n if (toc === undefined) {\n throw new Error(\"Document TOC is missing\");\n }\n if (!toc.items.some((item) => hasSerialId(item, serialId))) {\n throw new Error(\n `Chapter ${serialId} does not exist. Use \\`wg <archive-uri>/chapter list\\` to discover chapter ids.`,\n );\n }\n\n const summary = await document.readSummary(serialId);\n\n if (summary !== undefined) {\n return \"summarized\";\n }\n\n const serial = await document.serials.getById(serialId);\n\n if (serial?.topologyReady === true) {\n return \"graphed\";\n }\n if (\n (await document.getSerialFragments(serialId).listFragmentIds()).length >\n 0\n ) {\n return \"sourced\";\n }\n\n return \"planned\";\n });\n }\n\n public async listSerials(): Promise<readonly WikiGraphSerialEntry[]> {\n return await this.#document.openSession(async (document) => {\n const toc = await document.readToc();\n\n if (toc === undefined) {\n throw new Error(\"Document TOC is missing\");\n }\n\n return await collectSerialEntries(document, toc.items);\n });\n }\n\n public async readSerialSummary(serialId: number): Promise<string> {\n return await this.#document.openSession(async (document) => {\n const record = await document.serials.getById(serialId);\n\n if (record === undefined) {\n throw new Error(\n `No completed summary exists for id ${serialId}. Use \\`wg wikg://<archive.wikg>/chapter list\\` to discover chapter ids, then \\`wg wikg://<archive.wikg>/chapter/${serialId}/summary get\\` after summary is ready.`,\n );\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 archive with \\`wg <archive-uri>/chapter/tree get\\`.`,\n );\n }\n\n return summary;\n });\n }\n\n public async saveAs(path: string): Promise<void> {\n await flushDocument(this.#document);\n await writeWikgArchive(this.#documentDirectoryPath, path);\n }\n}\n\nfunction hasSerialId(item: TocItem, serialId: number): boolean {\n return (\n item.serialId === serialId ||\n item.children.some((child) => hasSerialId(child, serialId))\n );\n}\n\nasync function flushDocument(document: ReadonlyDocument): Promise<void> {\n if (!isFlushableDocument(document)) {\n return;\n }\n\n await document.flush();\n}\n\nfunction isFlushableDocument(\n document: ReadonlyDocument,\n): document is ReadonlyDocument & { flush(): Promise<void> } {\n return \"flush\" in document && typeof document.flush === \"function\";\n}\n\nasync function collectSerialEntries(\n document: ReadonlyDocument,\n items: readonly TocItem[],\n ancestorTitles: readonly string[] = [],\n): Promise<readonly WikiGraphSerialEntry[]> {\n const entries: WikiGraphSerialEntry[] = [];\n\n for (const item of items) {\n const title = item.title?.trim() || `Chapter ${item.serialId ?? \"group\"}`;\n const tocPath = [...ancestorTitles, title];\n\n if (item.serialId !== undefined) {\n const summary = await document.readSummary(item.serialId);\n\n if (summary !== undefined) {\n entries.push({\n fragmentCount: (\n await document.getSerialFragments(item.serialId).listFragmentIds()\n ).length,\n serialId: item.serialId,\n title,\n tocPath,\n });\n }\n }\n\n entries.push(\n ...(await collectSerialEntries(document, item.children, tocPath)),\n );\n }\n\n return entries;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,15 @@
1
+ declare function isDisposableDirectoryEntry(name: string): boolean;
2
+ declare function removeDisposableDirectory(directoryPath: string): Promise<number>;
3
+ declare function removeDisposableChildDirectories(rootPath: string): Promise<{
4
+ readonly freedBytes: number;
5
+ readonly removed: number;
6
+ readonly scanned: number;
7
+ }>;
8
+ declare function removeDisposableDescendantDirectories(rootPath: string): Promise<{
9
+ readonly freedBytes: number;
10
+ readonly removed: number;
11
+ readonly scanned: number;
12
+ }>;
13
+ declare function readPathSize(path: string): Promise<number>;
14
+
15
+ export { isDisposableDirectoryEntry, readPathSize, removeDisposableChildDirectories, removeDisposableDescendantDirectories, removeDisposableDirectory };
@@ -0,0 +1,141 @@
1
+ import { readdir, rm, rmdir, stat } from "fs/promises";
2
+ import { join } from "path";
3
+ import { isNodeError } from "../utils/node-error.js";
4
+ const DISPOSABLE_DIRECTORY_ENTRIES = /* @__PURE__ */ new Set([".DS_Store"]);
5
+ const DISPOSABLE_DIRECTORY_TTL_MS = 6e4;
6
+ function isDisposableDirectoryEntry(name) {
7
+ return DISPOSABLE_DIRECTORY_ENTRIES.has(name);
8
+ }
9
+ async function removeDisposableDirectory(directoryPath) {
10
+ const entries = await readdir(directoryPath).catch((error) => {
11
+ if (isNodeError(error) && error.code === "ENOENT") {
12
+ return void 0;
13
+ }
14
+ throw error;
15
+ });
16
+ if (entries === void 0) {
17
+ return 0;
18
+ }
19
+ if (entries.some((entry) => !isDisposableDirectoryEntry(entry))) {
20
+ return 0;
21
+ }
22
+ let freedBytes = 0;
23
+ for (const entry of entries) {
24
+ const path = join(directoryPath, entry);
25
+ freedBytes += await readPathSize(path);
26
+ await rm(path, { force: true, recursive: true });
27
+ }
28
+ await rmdir(directoryPath).catch((error) => {
29
+ if (isNodeError(error) && error.code === "ENOENT") {
30
+ return;
31
+ }
32
+ throw error;
33
+ });
34
+ return freedBytes;
35
+ }
36
+ async function removeDisposableChildDirectories(rootPath) {
37
+ const entries = await readdir(rootPath, { withFileTypes: true }).catch(
38
+ (error) => {
39
+ if (isNodeError(error) && error.code === "ENOENT") {
40
+ return [];
41
+ }
42
+ throw error;
43
+ }
44
+ );
45
+ let freedBytes = 0;
46
+ let removed = 0;
47
+ let scanned = 0;
48
+ for (const entry of entries) {
49
+ if (!entry.isDirectory()) {
50
+ continue;
51
+ }
52
+ scanned += 1;
53
+ const directoryPath = join(rootPath, entry.name);
54
+ const stats = await stat(directoryPath).catch((error) => {
55
+ if (isNodeError(error) && error.code === "ENOENT") {
56
+ return void 0;
57
+ }
58
+ throw error;
59
+ });
60
+ if (stats === void 0 || Date.now() - stats.mtimeMs < DISPOSABLE_DIRECTORY_TTL_MS) {
61
+ continue;
62
+ }
63
+ const removedBytes = await removeDisposableDirectory(directoryPath);
64
+ if (await pathExists(directoryPath)) {
65
+ freedBytes += removedBytes;
66
+ continue;
67
+ }
68
+ freedBytes += removedBytes;
69
+ removed += 1;
70
+ }
71
+ return { freedBytes, removed, scanned };
72
+ }
73
+ async function removeDisposableDescendantDirectories(rootPath) {
74
+ const entries = await readdir(rootPath, { withFileTypes: true }).catch(
75
+ (error) => {
76
+ if (isNodeError(error) && error.code === "ENOENT") {
77
+ return [];
78
+ }
79
+ throw error;
80
+ }
81
+ );
82
+ let freedBytes = 0;
83
+ let removed = 0;
84
+ let scanned = 0;
85
+ for (const entry of entries) {
86
+ if (!entry.isDirectory()) {
87
+ continue;
88
+ }
89
+ const directoryPath = join(rootPath, entry.name);
90
+ const childResult = await removeDisposableDescendantDirectories(directoryPath);
91
+ freedBytes += childResult.freedBytes;
92
+ removed += childResult.removed;
93
+ scanned += childResult.scanned + 1;
94
+ const removedBytes = await removeDisposableDirectory(directoryPath);
95
+ if (await pathExists(directoryPath)) {
96
+ freedBytes += removedBytes;
97
+ continue;
98
+ }
99
+ freedBytes += removedBytes;
100
+ removed += 1;
101
+ }
102
+ return { freedBytes, removed, scanned };
103
+ }
104
+ async function readPathSize(path) {
105
+ try {
106
+ const stats = await stat(path);
107
+ if (stats.isDirectory()) {
108
+ const entries = await readdir(path);
109
+ let size = 0;
110
+ for (const entry of entries) {
111
+ size += await readPathSize(join(path, entry));
112
+ }
113
+ return size;
114
+ }
115
+ return stats.size;
116
+ } catch (error) {
117
+ if (isNodeError(error) && error.code === "ENOENT") {
118
+ return 0;
119
+ }
120
+ throw error;
121
+ }
122
+ }
123
+ async function pathExists(path) {
124
+ try {
125
+ await stat(path);
126
+ return true;
127
+ } catch (error) {
128
+ if (isNodeError(error) && error.code === "ENOENT") {
129
+ return false;
130
+ }
131
+ throw error;
132
+ }
133
+ }
134
+ export {
135
+ isDisposableDirectoryEntry,
136
+ readPathSize,
137
+ removeDisposableChildDirectories,
138
+ removeDisposableDescendantDirectories,
139
+ removeDisposableDirectory
140
+ };
141
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/gc/files.ts"],"sourcesContent":["import { readdir, rm, rmdir, stat } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport { isNodeError } from \"../utils/node-error.js\";\n\nconst DISPOSABLE_DIRECTORY_ENTRIES = new Set([\".DS_Store\"]);\nconst DISPOSABLE_DIRECTORY_TTL_MS = 60_000;\n\nexport function isDisposableDirectoryEntry(name: string): boolean {\n return DISPOSABLE_DIRECTORY_ENTRIES.has(name);\n}\n\nexport async function removeDisposableDirectory(\n directoryPath: string,\n): Promise<number> {\n const entries = await readdir(directoryPath).catch((error: unknown) => {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n });\n\n if (entries === undefined) {\n return 0;\n }\n if (entries.some((entry) => !isDisposableDirectoryEntry(entry))) {\n return 0;\n }\n\n let freedBytes = 0;\n\n for (const entry of entries) {\n const path = join(directoryPath, entry);\n\n freedBytes += await readPathSize(path);\n await rm(path, { force: true, recursive: true });\n }\n\n await rmdir(directoryPath).catch((error: unknown) => {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return;\n }\n\n throw error;\n });\n return freedBytes;\n}\n\nexport async function removeDisposableChildDirectories(\n rootPath: string,\n): Promise<{\n readonly freedBytes: number;\n readonly removed: number;\n readonly scanned: number;\n}> {\n const entries = await readdir(rootPath, { withFileTypes: true }).catch(\n (error: unknown) => {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n\n throw error;\n },\n );\n let freedBytes = 0;\n let removed = 0;\n let scanned = 0;\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n scanned += 1;\n const directoryPath = join(rootPath, entry.name);\n const stats = await stat(directoryPath).catch((error: unknown) => {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n });\n\n if (\n stats === undefined ||\n Date.now() - stats.mtimeMs < DISPOSABLE_DIRECTORY_TTL_MS\n ) {\n continue;\n }\n\n const removedBytes = await removeDisposableDirectory(directoryPath);\n\n if (await pathExists(directoryPath)) {\n freedBytes += removedBytes;\n continue;\n }\n\n freedBytes += removedBytes;\n removed += 1;\n }\n\n return { freedBytes, removed, scanned };\n}\n\nexport async function removeDisposableDescendantDirectories(\n rootPath: string,\n): Promise<{\n readonly freedBytes: number;\n readonly removed: number;\n readonly scanned: number;\n}> {\n const entries = await readdir(rootPath, { withFileTypes: true }).catch(\n (error: unknown) => {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n\n throw error;\n },\n );\n let freedBytes = 0;\n let removed = 0;\n let scanned = 0;\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const directoryPath = join(rootPath, entry.name);\n const childResult =\n await removeDisposableDescendantDirectories(directoryPath);\n\n freedBytes += childResult.freedBytes;\n removed += childResult.removed;\n scanned += childResult.scanned + 1;\n\n const removedBytes = await removeDisposableDirectory(directoryPath);\n\n if (await pathExists(directoryPath)) {\n freedBytes += removedBytes;\n continue;\n }\n\n freedBytes += removedBytes;\n removed += 1;\n }\n\n return { freedBytes, removed, scanned };\n}\n\nexport async function readPathSize(path: string): Promise<number> {\n try {\n const stats = await stat(path);\n\n if (stats.isDirectory()) {\n const entries = await readdir(path);\n let size = 0;\n\n for (const entry of entries) {\n size += await readPathSize(join(path, entry));\n }\n\n return size;\n }\n\n return stats.size;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return 0;\n }\n\n throw error;\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n\n throw error;\n }\n}\n"],"mappings":"AAAA,SAAS,SAAS,IAAI,OAAO,YAAY;AACzC,SAAS,YAAY;AAErB,SAAS,mBAAmB;AAE5B,MAAM,+BAA+B,oBAAI,IAAI,CAAC,WAAW,CAAC;AAC1D,MAAM,8BAA8B;AAE7B,SAAS,2BAA2B,MAAuB;AAChE,SAAO,6BAA6B,IAAI,IAAI;AAC9C;AAEA,eAAsB,0BACpB,eACiB;AACjB,QAAM,UAAU,MAAM,QAAQ,aAAa,EAAE,MAAM,CAAC,UAAmB;AACrE,QAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR,CAAC;AAED,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,KAAK,CAAC,UAAU,CAAC,2BAA2B,KAAK,CAAC,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AAEjB,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAO,KAAK,eAAe,KAAK;AAEtC,kBAAc,MAAM,aAAa,IAAI;AACrC,UAAM,GAAG,MAAM,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EACjD;AAEA,QAAM,MAAM,aAAa,EAAE,MAAM,CAAC,UAAmB;AACnD,QAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD;AAAA,IACF;AAEA,UAAM;AAAA,EACR,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,iCACpB,UAKC;AACD,QAAM,UAAU,MAAM,QAAQ,UAAU,EAAE,eAAe,KAAK,CAAC,EAAE;AAAA,IAC/D,CAAC,UAAmB;AAClB,UAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,eAAO,CAAC;AAAA,MACV;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,aAAa;AACjB,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,IACF;AAEA,eAAW;AACX,UAAM,gBAAgB,KAAK,UAAU,MAAM,IAAI;AAC/C,UAAM,QAAQ,MAAM,KAAK,aAAa,EAAE,MAAM,CAAC,UAAmB;AAChE,UAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,IACR,CAAC;AAED,QACE,UAAU,UACV,KAAK,IAAI,IAAI,MAAM,UAAU,6BAC7B;AACA;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,0BAA0B,aAAa;AAElE,QAAI,MAAM,WAAW,aAAa,GAAG;AACnC,oBAAc;AACd;AAAA,IACF;AAEA,kBAAc;AACd,eAAW;AAAA,EACb;AAEA,SAAO,EAAE,YAAY,SAAS,QAAQ;AACxC;AAEA,eAAsB,sCACpB,UAKC;AACD,QAAM,UAAU,MAAM,QAAQ,UAAU,EAAE,eAAe,KAAK,CAAC,EAAE;AAAA,IAC/D,CAAC,UAAmB;AAClB,UAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,eAAO,CAAC;AAAA,MACV;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,aAAa;AACjB,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,UAAU,MAAM,IAAI;AAC/C,UAAM,cACJ,MAAM,sCAAsC,aAAa;AAE3D,kBAAc,YAAY;AAC1B,eAAW,YAAY;AACvB,eAAW,YAAY,UAAU;AAEjC,UAAM,eAAe,MAAM,0BAA0B,aAAa;AAElE,QAAI,MAAM,WAAW,aAAa,GAAG;AACnC,oBAAc;AACd;AAAA,IACF;AAEA,kBAAc;AACd,eAAW;AAAA,EACb;AAEA,SAAO,EAAE,YAAY,SAAS,QAAQ;AACxC;AAEA,eAAsB,aAAa,MAA+B;AAChE,MAAI;AACF,UAAM,QAAQ,MAAM,KAAK,IAAI;AAE7B,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,UAAU,MAAM,QAAQ,IAAI;AAClC,UAAI,OAAO;AAEX,iBAAW,SAAS,SAAS;AAC3B,gBAAQ,MAAM,aAAa,KAAK,MAAM,KAAK,CAAC;AAAA,MAC9C;AAEA,aAAO;AAAA,IACT;AAEA,WAAO,MAAM;AAAA,EACf,SAAS,OAAO;AACd,QAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,WAAW,MAAgC;AACxD,MAAI;AACF,UAAM,KAAK,IAAI;AACf,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;","names":[]}
@@ -0,0 +1,2 @@
1
+ export { tryRunWikiGraphGc } from './runner.js';
2
+ export { GcContext, GcJob, GcJobReport, GcJobResult, GcRunReport } from './types.js';
@@ -0,0 +1,5 @@
1
+ import { tryRunWikiGraphGc } from "./runner.js";
2
+ export {
3
+ tryRunWikiGraphGc
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/gc/index.ts"],"sourcesContent":["export { tryRunWikiGraphGc } from \"./runner.js\";\nexport type {\n GcContext,\n GcJob,\n GcJobReport,\n GcJobResult,\n GcRunReport,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,yBAAyB;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare function tryAcquireGcLock(scope?: string): Promise<(() => Promise<void>) | undefined>;
2
+
3
+ export { tryAcquireGcLock };