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,137 @@
1
+ import { randomUUID } from "crypto";
2
+ import { join } from "path";
3
+ import { resolveWikiGraphStateRootPath } from "../common/wiki-graph-temp.js";
4
+ import { getNumber, getString } from "../document/database.js";
5
+ import { openSharedStateDatabase } from "../document/index.js";
6
+ import { isNodeError } from "../utils/node-error.js";
7
+ const GC_SCHEMA_SQL = `
8
+ CREATE TABLE IF NOT EXISTS gc_locks (
9
+ scope TEXT PRIMARY KEY,
10
+ owner_id TEXT NOT NULL,
11
+ owner_pid INTEGER NOT NULL,
12
+ heartbeat_at INTEGER NOT NULL,
13
+ created_at INTEGER NOT NULL
14
+ );
15
+ `;
16
+ const GC_LOCK_STALE_TIMEOUT_MS = 6e4;
17
+ const GC_HEARTBEAT_INTERVAL_MS = 2e4;
18
+ async function tryAcquireGcLock(scope = "global") {
19
+ const database = await openGcStateDatabase();
20
+ const ownerId = `${process.pid}-${randomUUID()}`;
21
+ const now = Date.now();
22
+ let acquired = false;
23
+ try {
24
+ await database.transaction(async () => {
25
+ await cleanupStaleGcLocks(database);
26
+ await database.run(
27
+ `
28
+ INSERT OR IGNORE INTO gc_locks (
29
+ scope, owner_id, owner_pid, heartbeat_at, created_at
30
+ ) VALUES (?, ?, ?, ?, ?)
31
+ `,
32
+ [scope, ownerId, process.pid, now, now]
33
+ );
34
+ acquired = await database.queryOne(
35
+ "SELECT owner_id FROM gc_locks WHERE scope = ?",
36
+ [scope],
37
+ (row) => getString(row, "owner_id")
38
+ ) === ownerId;
39
+ });
40
+ } finally {
41
+ await database.close();
42
+ }
43
+ if (!acquired) {
44
+ return void 0;
45
+ }
46
+ const heartbeat = setInterval(() => {
47
+ void heartbeatGcLock(scope, ownerId).catch(() => void 0);
48
+ }, GC_HEARTBEAT_INTERVAL_MS);
49
+ return async () => {
50
+ clearInterval(heartbeat);
51
+ const releaseDatabase = await openGcStateDatabase();
52
+ try {
53
+ await releaseDatabase.run(
54
+ "DELETE FROM gc_locks WHERE scope = ? AND owner_id = ?",
55
+ [scope, ownerId]
56
+ );
57
+ } finally {
58
+ await releaseDatabase.close();
59
+ }
60
+ };
61
+ }
62
+ async function heartbeatGcLock(scope, ownerId) {
63
+ const database = await openGcStateDatabase();
64
+ try {
65
+ await database.run(
66
+ `
67
+ UPDATE gc_locks
68
+ SET heartbeat_at = ?, owner_pid = ?
69
+ WHERE scope = ? AND owner_id = ?
70
+ `,
71
+ [Date.now(), process.pid, scope, ownerId]
72
+ );
73
+ } finally {
74
+ await database.close();
75
+ }
76
+ }
77
+ async function cleanupStaleGcLocks(database) {
78
+ const locks = await database.queryAll(
79
+ "SELECT * FROM gc_locks",
80
+ void 0,
81
+ mapGcLockWithScope
82
+ );
83
+ for (const { lock, scope } of locks.filter(
84
+ ({ lock: lock2 }) => isStaleGcLock(lock2)
85
+ )) {
86
+ await database.run(
87
+ `
88
+ DELETE FROM gc_locks
89
+ WHERE scope = ?
90
+ AND owner_id = ?
91
+ AND heartbeat_at = ?
92
+ `,
93
+ [scope, lock.ownerId, lock.heartbeatAt]
94
+ );
95
+ }
96
+ }
97
+ function isStaleGcLock(lock) {
98
+ if (Date.now() - lock.heartbeatAt < GC_LOCK_STALE_TIMEOUT_MS) {
99
+ return false;
100
+ }
101
+ return !isProcessAlive(lock.ownerPid);
102
+ }
103
+ async function openGcStateDatabase() {
104
+ return await openSharedStateDatabase(
105
+ join(resolveWikiGraphStateRootPath(), "gc.sqlite"),
106
+ GC_SCHEMA_SQL
107
+ );
108
+ }
109
+ function mapGcLock(row) {
110
+ return {
111
+ createdAt: getNumber(row, "created_at"),
112
+ heartbeatAt: getNumber(row, "heartbeat_at"),
113
+ ownerId: getString(row, "owner_id"),
114
+ ownerPid: getNumber(row, "owner_pid")
115
+ };
116
+ }
117
+ function mapGcLockWithScope(row) {
118
+ return {
119
+ lock: mapGcLock(row),
120
+ scope: getString(row, "scope")
121
+ };
122
+ }
123
+ function isProcessAlive(pid) {
124
+ try {
125
+ process.kill(pid, 0);
126
+ return true;
127
+ } catch (error) {
128
+ if (isNodeError(error) && error.code === "ESRCH") {
129
+ return false;
130
+ }
131
+ return true;
132
+ }
133
+ }
134
+ export {
135
+ tryAcquireGcLock
136
+ };
137
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/gc/lock.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\nimport { join } from \"path\";\n\nimport { resolveWikiGraphStateRootPath } from \"../common/wiki-graph-temp.js\";\nimport { getNumber, getString, type SqlRow } from \"../document/database.js\";\nimport { openSharedStateDatabase } from \"../document/index.js\";\nimport type { Database } from \"../document/index.js\";\nimport { isNodeError } from \"../utils/node-error.js\";\n\nconst GC_SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS gc_locks (\n scope TEXT PRIMARY KEY,\n owner_id TEXT NOT NULL,\n owner_pid INTEGER NOT NULL,\n heartbeat_at INTEGER NOT NULL,\n created_at INTEGER NOT NULL\n);\n`;\n\nconst GC_LOCK_STALE_TIMEOUT_MS = 60_000;\nconst GC_HEARTBEAT_INTERVAL_MS = 20_000;\n\ninterface GcLock {\n readonly createdAt: number;\n readonly heartbeatAt: number;\n readonly ownerId: string;\n readonly ownerPid: number;\n}\n\nexport async function tryAcquireGcLock(\n scope = \"global\",\n): Promise<(() => Promise<void>) | undefined> {\n const database = await openGcStateDatabase();\n const ownerId = `${process.pid}-${randomUUID()}`;\n const now = Date.now();\n let acquired = false;\n\n try {\n await database.transaction(async () => {\n await cleanupStaleGcLocks(database);\n await database.run(\n `\nINSERT OR IGNORE INTO gc_locks (\n scope, owner_id, owner_pid, heartbeat_at, created_at\n) VALUES (?, ?, ?, ?, ?)\n`,\n [scope, ownerId, process.pid, now, now],\n );\n acquired =\n (await database.queryOne(\n \"SELECT owner_id FROM gc_locks WHERE scope = ?\",\n [scope],\n (row) => getString(row, \"owner_id\"),\n )) === ownerId;\n });\n } finally {\n await database.close();\n }\n\n if (!acquired) {\n return undefined;\n }\n\n const heartbeat = setInterval(() => {\n void heartbeatGcLock(scope, ownerId).catch(() => undefined);\n }, GC_HEARTBEAT_INTERVAL_MS);\n\n return async () => {\n clearInterval(heartbeat);\n const releaseDatabase = await openGcStateDatabase();\n\n try {\n await releaseDatabase.run(\n \"DELETE FROM gc_locks WHERE scope = ? AND owner_id = ?\",\n [scope, ownerId],\n );\n } finally {\n await releaseDatabase.close();\n }\n };\n}\n\nasync function heartbeatGcLock(scope: string, ownerId: string): Promise<void> {\n const database = await openGcStateDatabase();\n\n try {\n await database.run(\n `\nUPDATE gc_locks\nSET heartbeat_at = ?, owner_pid = ?\nWHERE scope = ? AND owner_id = ?\n`,\n [Date.now(), process.pid, scope, ownerId],\n );\n } finally {\n await database.close();\n }\n}\n\nasync function cleanupStaleGcLocks(database: Database): Promise<void> {\n const locks = await database.queryAll(\n \"SELECT * FROM gc_locks\",\n undefined,\n mapGcLockWithScope,\n );\n\n for (const { lock, scope } of locks.filter(({ lock }) =>\n isStaleGcLock(lock),\n )) {\n await database.run(\n `\nDELETE FROM gc_locks\nWHERE scope = ?\n AND owner_id = ?\n AND heartbeat_at = ?\n`,\n [scope, lock.ownerId, lock.heartbeatAt],\n );\n }\n}\n\nfunction isStaleGcLock(lock: GcLock): boolean {\n if (Date.now() - lock.heartbeatAt < GC_LOCK_STALE_TIMEOUT_MS) {\n return false;\n }\n\n return !isProcessAlive(lock.ownerPid);\n}\n\nasync function openGcStateDatabase(): Promise<Database> {\n return await openSharedStateDatabase(\n join(resolveWikiGraphStateRootPath(), \"gc.sqlite\"),\n GC_SCHEMA_SQL,\n );\n}\n\nfunction mapGcLock(row: SqlRow): GcLock {\n return {\n createdAt: getNumber(row, \"created_at\"),\n heartbeatAt: getNumber(row, \"heartbeat_at\"),\n ownerId: getString(row, \"owner_id\"),\n ownerPid: getNumber(row, \"owner_pid\"),\n };\n}\n\nfunction mapGcLockWithScope(row: SqlRow): {\n readonly lock: GcLock;\n readonly scope: string;\n} {\n return {\n lock: mapGcLock(row),\n scope: getString(row, \"scope\"),\n };\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ESRCH\") {\n return false;\n }\n\n return true;\n }\n}\n"],"mappings":"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","names":["lock"]}
@@ -0,0 +1,9 @@
1
+ import { GcRunReport } from './types.js';
2
+
3
+ declare function tryRunWikiGraphGc(options?: {
4
+ readonly dryRun?: boolean;
5
+ readonly force?: boolean;
6
+ readonly opportunistic?: boolean;
7
+ }): Promise<GcRunReport>;
8
+
9
+ export { tryRunWikiGraphGc };
@@ -0,0 +1,129 @@
1
+ import { mkdir, readFile, writeFile } from "fs/promises";
2
+ import { join } from "path";
3
+ import { resolveWikiGraphStateRootPath } from "../common/wiki-graph-temp.js";
4
+ import { runSearchCacheGc } from "../archive/query/index.js";
5
+ import { runBuildQueueGc } from "../facade/index.js";
6
+ import { runWikgCoordinatorGc } from "../wikg/index.js";
7
+ import { runWikipageCacheGc } from "../wikipage/index.js";
8
+ import { formatError } from "../utils/node-error.js";
9
+ import { tryAcquireGcLock } from "./lock.js";
10
+ import { runTempDirectoryGc } from "./tmp-gc.js";
11
+ const GC_JOBS = [
12
+ {
13
+ name: "wikg-coordinator",
14
+ run: runWikgCoordinatorGc
15
+ },
16
+ {
17
+ name: "search-cache",
18
+ run: runSearchCacheGc
19
+ },
20
+ {
21
+ name: "wikipage-cache",
22
+ run: runWikipageCacheGc
23
+ },
24
+ {
25
+ name: "build-queue",
26
+ run: runBuildQueueGc
27
+ },
28
+ {
29
+ name: "tmp",
30
+ run: runTempDirectoryGc
31
+ }
32
+ ];
33
+ const OPPORTUNISTIC_GC_INTERVAL_MS = 10 * 60 * 1e3;
34
+ async function tryRunWikiGraphGc(options = {}) {
35
+ const startedAt = Date.now();
36
+ const stateDirectoryPath = resolveWikiGraphStateRootPath();
37
+ const release = await tryAcquireGcLock();
38
+ if (release === void 0) {
39
+ return {
40
+ finishedAt: Date.now(),
41
+ freedBytes: 0,
42
+ jobs: [],
43
+ removed: 0,
44
+ scanned: 0,
45
+ skipped: true,
46
+ startedAt
47
+ };
48
+ }
49
+ try {
50
+ if (options.opportunistic === true && !await shouldRunOpportunisticGc(stateDirectoryPath, startedAt)) {
51
+ return {
52
+ finishedAt: Date.now(),
53
+ freedBytes: 0,
54
+ jobs: [],
55
+ removed: 0,
56
+ scanned: 0,
57
+ skipped: true,
58
+ startedAt
59
+ };
60
+ }
61
+ const context = {
62
+ dryRun: options.dryRun === true,
63
+ force: options.force === true,
64
+ now: startedAt,
65
+ stateDirectoryPath
66
+ };
67
+ const jobs = [];
68
+ for (const job of GC_JOBS) {
69
+ jobs.push(await runJob(job, context));
70
+ }
71
+ const report = {
72
+ finishedAt: Date.now(),
73
+ freedBytes: sum(jobs, "freedBytes"),
74
+ jobs,
75
+ removed: sum(jobs, "removed"),
76
+ scanned: sum(jobs, "scanned"),
77
+ skipped: false,
78
+ startedAt
79
+ };
80
+ await writeLastGcRunAt(stateDirectoryPath, report.finishedAt).catch(
81
+ () => void 0
82
+ );
83
+ return report;
84
+ } finally {
85
+ await release();
86
+ }
87
+ }
88
+ async function runJob(job, context) {
89
+ try {
90
+ return {
91
+ name: job.name,
92
+ ...await job.run(context)
93
+ };
94
+ } catch (error) {
95
+ return {
96
+ error: formatError(error),
97
+ freedBytes: 0,
98
+ name: job.name,
99
+ removed: 0,
100
+ scanned: 0
101
+ };
102
+ }
103
+ }
104
+ function sum(jobs, key) {
105
+ return jobs.reduce((total, job) => {
106
+ const value = job[key];
107
+ return total + (typeof value === "number" ? value : 0);
108
+ }, 0);
109
+ }
110
+ async function shouldRunOpportunisticGc(stateDirectoryPath, now) {
111
+ const lastRunAt = Number(
112
+ (await readFile(createLastGcRunPath(stateDirectoryPath), "utf8").catch(
113
+ () => ""
114
+ )).trim()
115
+ );
116
+ return !Number.isFinite(lastRunAt) || now - lastRunAt >= OPPORTUNISTIC_GC_INTERVAL_MS;
117
+ }
118
+ async function writeLastGcRunAt(stateDirectoryPath, at) {
119
+ await mkdir(stateDirectoryPath, { recursive: true });
120
+ await writeFile(createLastGcRunPath(stateDirectoryPath), `${at}
121
+ `, "utf8");
122
+ }
123
+ function createLastGcRunPath(stateDirectoryPath) {
124
+ return join(stateDirectoryPath, "gc.last-run");
125
+ }
126
+ export {
127
+ tryRunWikiGraphGc
128
+ };
129
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/gc/runner.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport { resolveWikiGraphStateRootPath } from \"../common/wiki-graph-temp.js\";\nimport { runSearchCacheGc } from \"../archive/query/index.js\";\nimport { runBuildQueueGc } from \"../facade/index.js\";\nimport { runWikgCoordinatorGc } from \"../wikg/index.js\";\nimport { runWikipageCacheGc } from \"../wikipage/index.js\";\nimport { formatError } from \"../utils/node-error.js\";\n\nimport { tryAcquireGcLock } from \"./lock.js\";\nimport { runTempDirectoryGc } from \"./tmp-gc.js\";\nimport type { GcContext, GcJob, GcJobReport, GcRunReport } from \"./types.js\";\n\ninterface NamedGcJob {\n readonly name: string;\n readonly run: GcJob;\n}\n\nconst GC_JOBS: readonly NamedGcJob[] = [\n {\n name: \"wikg-coordinator\",\n run: runWikgCoordinatorGc,\n },\n {\n name: \"search-cache\",\n run: runSearchCacheGc,\n },\n {\n name: \"wikipage-cache\",\n run: runWikipageCacheGc,\n },\n {\n name: \"build-queue\",\n run: runBuildQueueGc,\n },\n {\n name: \"tmp\",\n run: runTempDirectoryGc,\n },\n];\nconst OPPORTUNISTIC_GC_INTERVAL_MS = 10 * 60 * 1000;\n\nexport async function tryRunWikiGraphGc(\n options: {\n readonly dryRun?: boolean;\n readonly force?: boolean;\n readonly opportunistic?: boolean;\n } = {},\n): Promise<GcRunReport> {\n const startedAt = Date.now();\n const stateDirectoryPath = resolveWikiGraphStateRootPath();\n const release = await tryAcquireGcLock();\n\n if (release === undefined) {\n return {\n finishedAt: Date.now(),\n freedBytes: 0,\n jobs: [],\n removed: 0,\n scanned: 0,\n skipped: true,\n startedAt,\n };\n }\n\n try {\n if (\n options.opportunistic === true &&\n !(await shouldRunOpportunisticGc(stateDirectoryPath, startedAt))\n ) {\n return {\n finishedAt: Date.now(),\n freedBytes: 0,\n jobs: [],\n removed: 0,\n scanned: 0,\n skipped: true,\n startedAt,\n };\n }\n\n const context: GcContext = {\n dryRun: options.dryRun === true,\n force: options.force === true,\n now: startedAt,\n stateDirectoryPath,\n };\n const jobs: GcJobReport[] = [];\n\n for (const job of GC_JOBS) {\n jobs.push(await runJob(job, context));\n }\n\n const report = {\n finishedAt: Date.now(),\n freedBytes: sum(jobs, \"freedBytes\"),\n jobs,\n removed: sum(jobs, \"removed\"),\n scanned: sum(jobs, \"scanned\"),\n skipped: false,\n startedAt,\n };\n\n await writeLastGcRunAt(stateDirectoryPath, report.finishedAt).catch(\n () => undefined,\n );\n return report;\n } finally {\n await release();\n }\n}\n\nasync function runJob(\n job: NamedGcJob,\n context: GcContext,\n): Promise<GcJobReport> {\n try {\n return {\n name: job.name,\n ...(await job.run(context)),\n };\n } catch (error) {\n return {\n error: formatError(error),\n freedBytes: 0,\n name: job.name,\n removed: 0,\n scanned: 0,\n };\n }\n}\n\nfunction sum(jobs: readonly GcJobReport[], key: keyof GcJobReport): number {\n return jobs.reduce((total, job) => {\n const value = job[key];\n\n return total + (typeof value === \"number\" ? value : 0);\n }, 0);\n}\n\nasync function shouldRunOpportunisticGc(\n stateDirectoryPath: string,\n now: number,\n): Promise<boolean> {\n const lastRunAt = Number(\n (\n await readFile(createLastGcRunPath(stateDirectoryPath), \"utf8\").catch(\n () => \"\",\n )\n ).trim(),\n );\n\n return (\n !Number.isFinite(lastRunAt) ||\n now - lastRunAt >= OPPORTUNISTIC_GC_INTERVAL_MS\n );\n}\n\nasync function writeLastGcRunAt(\n stateDirectoryPath: string,\n at: number,\n): Promise<void> {\n await mkdir(stateDirectoryPath, { recursive: true });\n await writeFile(createLastGcRunPath(stateDirectoryPath), `${at}\\n`, \"utf8\");\n}\n\nfunction createLastGcRunPath(stateDirectoryPath: string): string {\n return join(stateDirectoryPath, \"gc.last-run\");\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,5 @@
1
+ import { GcContext, GcJobResult } from './types.js';
2
+
3
+ declare function runTempDirectoryGc(context: GcContext): Promise<GcJobResult>;
4
+
5
+ export { runTempDirectoryGc };
@@ -0,0 +1,57 @@
1
+ import { readdir, rm, stat } from "fs/promises";
2
+ import { join } from "path";
3
+ import { resolveWikiGraphTempDirectoryPath } from "../common/wiki-graph-temp.js";
4
+ import { isNodeError } from "../utils/node-error.js";
5
+ import { readPathSize } from "./files.js";
6
+ const TEMP_DIRECTORY_TTL_MS = 60 * 60 * 1e3;
7
+ async function runTempDirectoryGc(context) {
8
+ const rootPath = resolveWikiGraphTempDirectoryPath();
9
+ let scanned = 0;
10
+ let removed = 0;
11
+ let freedBytes = 0;
12
+ for (const path of await listTempEntryPaths(rootPath)) {
13
+ scanned += 1;
14
+ const stats = await stat(path).catch((error) => {
15
+ if (isNodeError(error) && error.code === "ENOENT") {
16
+ return void 0;
17
+ }
18
+ throw error;
19
+ });
20
+ if (stats === void 0 || !context.force && context.now - stats.mtimeMs < TEMP_DIRECTORY_TTL_MS) {
21
+ continue;
22
+ }
23
+ const bytes = await readPathSize(path);
24
+ if (!context.dryRun) {
25
+ await rm(path, { force: true, recursive: true });
26
+ }
27
+ removed += 1;
28
+ freedBytes += bytes;
29
+ }
30
+ return { freedBytes, removed, scanned };
31
+ }
32
+ async function listTempEntryPaths(rootPath) {
33
+ try {
34
+ const categories = await readdir(rootPath, { withFileTypes: true });
35
+ const paths = [];
36
+ for (const category of categories) {
37
+ if (!category.isDirectory()) {
38
+ continue;
39
+ }
40
+ const categoryPath = join(rootPath, category.name);
41
+ const entries = await readdir(categoryPath, { withFileTypes: true });
42
+ for (const entry of entries) {
43
+ paths.push(join(categoryPath, entry.name));
44
+ }
45
+ }
46
+ return paths;
47
+ } catch (error) {
48
+ if (isNodeError(error) && error.code === "ENOENT") {
49
+ return [];
50
+ }
51
+ throw error;
52
+ }
53
+ }
54
+ export {
55
+ runTempDirectoryGc
56
+ };
57
+ //# sourceMappingURL=tmp-gc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/gc/tmp-gc.ts"],"sourcesContent":["import { readdir, rm, stat } from \"fs/promises\";\nimport { join } from \"path\";\n\nimport { resolveWikiGraphTempDirectoryPath } from \"../common/wiki-graph-temp.js\";\nimport { isNodeError } from \"../utils/node-error.js\";\n\nimport { readPathSize } from \"./files.js\";\nimport type { GcContext, GcJobResult } from \"./types.js\";\n\nconst TEMP_DIRECTORY_TTL_MS = 60 * 60 * 1000;\n\nexport async function runTempDirectoryGc(\n context: GcContext,\n): Promise<GcJobResult> {\n const rootPath = resolveWikiGraphTempDirectoryPath();\n let scanned = 0;\n let removed = 0;\n let freedBytes = 0;\n\n for (const path of await listTempEntryPaths(rootPath)) {\n scanned += 1;\n const stats = await stat(path).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 (!context.force && context.now - stats.mtimeMs < TEMP_DIRECTORY_TTL_MS)\n ) {\n continue;\n }\n\n const bytes = await readPathSize(path);\n\n if (!context.dryRun) {\n await rm(path, { force: true, recursive: true });\n }\n removed += 1;\n freedBytes += bytes;\n }\n\n return { freedBytes, removed, scanned };\n}\n\nasync function listTempEntryPaths(rootPath: string): Promise<string[]> {\n try {\n const categories = await readdir(rootPath, { withFileTypes: true });\n const paths: string[] = [];\n\n for (const category of categories) {\n if (!category.isDirectory()) {\n continue;\n }\n\n const categoryPath = join(rootPath, category.name);\n const entries = await readdir(categoryPath, { withFileTypes: true });\n\n for (const entry of entries) {\n paths.push(join(categoryPath, entry.name));\n }\n }\n\n return paths;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return [];\n }\n\n throw error;\n }\n}\n"],"mappings":"AAAA,SAAS,SAAS,IAAI,YAAY;AAClC,SAAS,YAAY;AAErB,SAAS,yCAAyC;AAClD,SAAS,mBAAmB;AAE5B,SAAS,oBAAoB;AAG7B,MAAM,wBAAwB,KAAK,KAAK;AAExC,eAAsB,mBACpB,SACsB;AACtB,QAAM,WAAW,kCAAkC;AACnD,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,aAAa;AAEjB,aAAW,QAAQ,MAAM,mBAAmB,QAAQ,GAAG;AACrD,eAAW;AACX,UAAM,QAAQ,MAAM,KAAK,IAAI,EAAE,MAAM,CAAC,UAAmB;AACvD,UAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,IACR,CAAC;AAED,QACE,UAAU,UACT,CAAC,QAAQ,SAAS,QAAQ,MAAM,MAAM,UAAU,uBACjD;AACA;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,aAAa,IAAI;AAErC,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,GAAG,MAAM,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,IACjD;AACA,eAAW;AACX,kBAAc;AAAA,EAChB;AAEA,SAAO,EAAE,YAAY,SAAS,QAAQ;AACxC;AAEA,eAAe,mBAAmB,UAAqC;AACrE,MAAI;AACF,UAAM,aAAa,MAAM,QAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAClE,UAAM,QAAkB,CAAC;AAEzB,eAAW,YAAY,YAAY;AACjC,UAAI,CAAC,SAAS,YAAY,GAAG;AAC3B;AAAA,MACF;AAEA,YAAM,eAAe,KAAK,UAAU,SAAS,IAAI;AACjD,YAAM,UAAU,MAAM,QAAQ,cAAc,EAAE,eAAe,KAAK,CAAC;AAEnE,iBAAW,SAAS,SAAS;AAC3B,cAAM,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAAA,MAC3C;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,YAAY,KAAK,KAAK,MAAM,SAAS,UAAU;AACjD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM;AAAA,EACR;AACF;","names":[]}
@@ -0,0 +1,24 @@
1
+ interface GcContext {
2
+ readonly force: boolean;
3
+ readonly now: number;
4
+ readonly stateDirectoryPath: string;
5
+ readonly dryRun: boolean;
6
+ }
7
+ interface GcJobResult {
8
+ readonly scanned: number;
9
+ readonly removed: number;
10
+ readonly freedBytes: number;
11
+ }
12
+ interface GcJobReport extends GcJobResult {
13
+ readonly name: string;
14
+ readonly error?: string;
15
+ }
16
+ interface GcRunReport extends GcJobResult {
17
+ readonly jobs: readonly GcJobReport[];
18
+ readonly skipped: boolean;
19
+ readonly startedAt: number;
20
+ readonly finishedAt: number;
21
+ }
22
+ type GcJob = (context: GcContext) => Promise<GcJobResult>;
23
+
24
+ export type { GcContext, GcJob, GcJobReport, GcJobResult, GcRunReport };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}