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,14 @@
1
+ import { GuaranteedRequest } from '../guaranteed/types.js';
2
+ import { DisambiguationProfileNormalizer } from './types.js';
3
+ import '../llm/types.js';
4
+ import 'ai';
5
+ import 'zod';
6
+
7
+ interface CreateDisambiguationProfileNormalizerOptions {
8
+ readonly maxMeanings?: number;
9
+ readonly maxRetries?: number;
10
+ readonly request: GuaranteedRequest;
11
+ }
12
+ declare function createDisambiguationProfileNormalizer(options: CreateDisambiguationProfileNormalizerOptions): DisambiguationProfileNormalizer;
13
+
14
+ export { type CreateDisambiguationProfileNormalizerOptions, createDisambiguationProfileNormalizer };
@@ -0,0 +1,147 @@
1
+ import { z } from "zod";
2
+ import {
3
+ ParsedJsonError,
4
+ RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,
5
+ requestGuaranteedJson
6
+ } from "../guaranteed/index.js";
7
+ const profileMeaningSchema = z.object({
8
+ category: z.string().min(1).optional(),
9
+ information: z.string(),
10
+ name: z.string().min(1),
11
+ priority: z.enum(["primary", "secondary", "other"]),
12
+ qid: z.string().regex(/^Q[1-9]\d*$/u)
13
+ }).strict();
14
+ const profileSchema = z.object({
15
+ meanings: z.array(profileMeaningSchema),
16
+ sourceQid: z.string().regex(/^Q[1-9]\d*$/u),
17
+ surface: z.string().min(1).optional()
18
+ }).strict();
19
+ function createDisambiguationProfileNormalizer(options) {
20
+ return async (input) => await requestGuaranteedJson({
21
+ messages: buildNormalizerMessages(input, options.maxMeanings ?? 24),
22
+ parse: (profile) => parseDisambiguationProfile(input, normalizeProfile(profile)),
23
+ request: options.request,
24
+ responseIntentClassifierPrompt: RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,
25
+ schema: profileSchema,
26
+ ...options.maxRetries === void 0 ? {} : { maxRetries: options.maxRetries }
27
+ });
28
+ }
29
+ function normalizeProfile(profile) {
30
+ return {
31
+ meanings: profile.meanings.map((meaning) => ({
32
+ ...meaning.category === void 0 ? {} : { category: meaning.category },
33
+ information: meaning.information,
34
+ name: meaning.name,
35
+ priority: meaning.priority,
36
+ qid: meaning.qid
37
+ })),
38
+ sourceQid: profile.sourceQid,
39
+ ...profile.surface === void 0 ? {} : { surface: profile.surface }
40
+ };
41
+ }
42
+ function parseDisambiguationProfile(input, profile) {
43
+ const pageQidLinks = new Set(input.pageQidLinks.map((item) => item.qid));
44
+ const issues = [];
45
+ const seen = /* @__PURE__ */ new Set();
46
+ const meanings = [];
47
+ if (profile.sourceQid !== input.sourceQid) {
48
+ issues.push(
49
+ `sourceQid must be ${input.sourceQid}, but got ${profile.sourceQid}.`
50
+ );
51
+ }
52
+ for (const meaning of profile.meanings) {
53
+ if (!pageQidLinks.has(meaning.qid)) {
54
+ issues.push(
55
+ `Meaning "${meaning.name}" selected qid ${meaning.qid}, but it is not present in the input disambiguation page links.`
56
+ );
57
+ continue;
58
+ }
59
+ if (seen.has(meaning.qid)) {
60
+ issues.push(
61
+ `Duplicate meaning qid ${meaning.qid}. Return each QID once.`
62
+ );
63
+ continue;
64
+ }
65
+ seen.add(meaning.qid);
66
+ meanings.push(meaning);
67
+ }
68
+ if (meanings.length === 0) {
69
+ issues.push("Return at least one meaning from the pageQidLinks list.");
70
+ }
71
+ if (issues.length > 0) {
72
+ throw new ParsedJsonError(issues);
73
+ }
74
+ return {
75
+ meanings,
76
+ sourceQid: input.sourceQid,
77
+ ...profile.surface === void 0 ? {} : { surface: profile.surface }
78
+ };
79
+ }
80
+ function buildNormalizerMessages(input, maxMeanings) {
81
+ return [
82
+ {
83
+ role: "system",
84
+ content: [
85
+ "You normalize Wikipedia disambiguation pages for entity grounding.",
86
+ "Return JSON only.",
87
+ "Do not invent QIDs, pages, people, places, works, or meanings.",
88
+ "Only use QIDs from the pageQidLinks list.",
89
+ "The information field must only copy or summarize text present on the disambiguation page itself.",
90
+ "Do not use Wikidata descriptions or external knowledge to fill information.",
91
+ "Prefer common and context-independent meanings over exhaustive long-tail lists."
92
+ ].join("\n")
93
+ },
94
+ {
95
+ role: "user",
96
+ content: [
97
+ `Source QID: ${input.sourceQid}`,
98
+ input.surface === void 0 ? "" : `Surface: ${input.surface}`,
99
+ `Maximum meanings: ${maxMeanings}`,
100
+ "",
101
+ "Page QID links:",
102
+ JSON.stringify(input.pageQidLinks.map(formatPageQidLink), null, 2),
103
+ "",
104
+ "Disambiguation page text:",
105
+ input.pages.map(
106
+ (page) => `--- ${page.wiki}:${page.title} ---
107
+ ${truncatePageText(page.text)}`
108
+ ).join("\n\n"),
109
+ "",
110
+ "Return this JSON shape:",
111
+ JSON.stringify(
112
+ {
113
+ meanings: [
114
+ {
115
+ category: "person | place | organization | work | concept | event | other",
116
+ information: "short information copied or summarized from the disambiguation page; empty string if no information is present",
117
+ name: "display name",
118
+ priority: "primary | secondary | other",
119
+ qid: "QID from pageQidLinks"
120
+ }
121
+ ],
122
+ sourceQid: input.sourceQid,
123
+ ...input.surface === void 0 ? {} : { surface: input.surface }
124
+ },
125
+ null,
126
+ 2
127
+ )
128
+ ].filter((line) => line !== "").join("\n")
129
+ }
130
+ ];
131
+ }
132
+ function formatPageQidLink(item) {
133
+ return {
134
+ qid: item.qid,
135
+ title: item.title
136
+ };
137
+ }
138
+ function truncatePageText(text) {
139
+ const maxLength = 16e3;
140
+ return text.length <= maxLength ? text : `${text.slice(0, maxLength)}
141
+
142
+ [truncated]`;
143
+ }
144
+ export {
145
+ createDisambiguationProfileNormalizer
146
+ };
147
+ //# sourceMappingURL=normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/wikipage/normalizer.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport {\n ParsedJsonError,\n RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,\n requestGuaranteedJson,\n type GuaranteedRequest,\n} from \"../guaranteed/index.js\";\nimport type { LLMessage } from \"../llm/index.js\";\n\nimport type {\n DisambiguationLinkedQid,\n DisambiguationProfile,\n DisambiguationProfileMeaning,\n DisambiguationProfileNormalizer,\n DisambiguationProfileNormalizerInput,\n} from \"./types.js\";\n\nconst profileMeaningSchema = z\n .object({\n category: z.string().min(1).optional(),\n information: z.string(),\n name: z.string().min(1),\n priority: z.enum([\"primary\", \"secondary\", \"other\"]),\n qid: z.string().regex(/^Q[1-9]\\d*$/u),\n })\n .strict();\n\nconst profileSchema = z\n .object({\n meanings: z.array(profileMeaningSchema),\n sourceQid: z.string().regex(/^Q[1-9]\\d*$/u),\n surface: z.string().min(1).optional(),\n })\n .strict();\n\nexport interface CreateDisambiguationProfileNormalizerOptions {\n readonly maxMeanings?: number;\n readonly maxRetries?: number;\n readonly request: GuaranteedRequest;\n}\n\nexport function createDisambiguationProfileNormalizer(\n options: CreateDisambiguationProfileNormalizerOptions,\n): DisambiguationProfileNormalizer {\n return async (input) =>\n await requestGuaranteedJson({\n messages: buildNormalizerMessages(input, options.maxMeanings ?? 24),\n parse: (profile) =>\n parseDisambiguationProfile(input, normalizeProfile(profile)),\n request: options.request,\n responseIntentClassifierPrompt:\n RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,\n schema: profileSchema,\n ...(options.maxRetries === undefined\n ? {}\n : { maxRetries: options.maxRetries }),\n });\n}\n\nfunction normalizeProfile(\n profile: z.infer<typeof profileSchema>,\n): DisambiguationProfile {\n return {\n meanings: profile.meanings.map((meaning) => ({\n ...(meaning.category === undefined ? {} : { category: meaning.category }),\n information: meaning.information,\n name: meaning.name,\n priority: meaning.priority,\n qid: meaning.qid,\n })),\n sourceQid: profile.sourceQid,\n ...(profile.surface === undefined ? {} : { surface: profile.surface }),\n };\n}\n\nfunction parseDisambiguationProfile(\n input: DisambiguationProfileNormalizerInput,\n profile: DisambiguationProfile,\n): DisambiguationProfile {\n const pageQidLinks = new Set(input.pageQidLinks.map((item) => item.qid));\n const issues: string[] = [];\n const seen = new Set<string>();\n const meanings: DisambiguationProfileMeaning[] = [];\n\n if (profile.sourceQid !== input.sourceQid) {\n issues.push(\n `sourceQid must be ${input.sourceQid}, but got ${profile.sourceQid}.`,\n );\n }\n\n for (const meaning of profile.meanings) {\n if (!pageQidLinks.has(meaning.qid)) {\n issues.push(\n `Meaning \"${meaning.name}\" selected qid ${meaning.qid}, but it is not present in the input disambiguation page links.`,\n );\n continue;\n }\n if (seen.has(meaning.qid)) {\n issues.push(\n `Duplicate meaning qid ${meaning.qid}. Return each QID once.`,\n );\n continue;\n }\n\n seen.add(meaning.qid);\n meanings.push(meaning);\n }\n\n if (meanings.length === 0) {\n issues.push(\"Return at least one meaning from the pageQidLinks list.\");\n }\n if (issues.length > 0) {\n throw new ParsedJsonError(issues);\n }\n\n return {\n meanings,\n sourceQid: input.sourceQid,\n ...(profile.surface === undefined ? {} : { surface: profile.surface }),\n };\n}\n\nfunction buildNormalizerMessages(\n input: DisambiguationProfileNormalizerInput,\n maxMeanings: number,\n): LLMessage[] {\n return [\n {\n role: \"system\",\n content: [\n \"You normalize Wikipedia disambiguation pages for entity grounding.\",\n \"Return JSON only.\",\n \"Do not invent QIDs, pages, people, places, works, or meanings.\",\n \"Only use QIDs from the pageQidLinks list.\",\n \"The information field must only copy or summarize text present on the disambiguation page itself.\",\n \"Do not use Wikidata descriptions or external knowledge to fill information.\",\n \"Prefer common and context-independent meanings over exhaustive long-tail lists.\",\n ].join(\"\\n\"),\n },\n {\n role: \"user\",\n content: [\n `Source QID: ${input.sourceQid}`,\n input.surface === undefined ? \"\" : `Surface: ${input.surface}`,\n `Maximum meanings: ${maxMeanings}`,\n \"\",\n \"Page QID links:\",\n JSON.stringify(input.pageQidLinks.map(formatPageQidLink), null, 2),\n \"\",\n \"Disambiguation page text:\",\n input.pages\n .map(\n (page) =>\n `--- ${page.wiki}:${page.title} ---\\n${truncatePageText(page.text)}`,\n )\n .join(\"\\n\\n\"),\n \"\",\n \"Return this JSON shape:\",\n JSON.stringify(\n {\n meanings: [\n {\n category:\n \"person | place | organization | work | concept | event | other\",\n information:\n \"short information copied or summarized from the disambiguation page; empty string if no information is present\",\n name: \"display name\",\n priority: \"primary | secondary | other\",\n qid: \"QID from pageQidLinks\",\n },\n ],\n sourceQid: input.sourceQid,\n ...(input.surface === undefined ? {} : { surface: input.surface }),\n },\n null,\n 2,\n ),\n ]\n .filter((line) => line !== \"\")\n .join(\"\\n\"),\n },\n ];\n}\n\nfunction formatPageQidLink(item: DisambiguationLinkedQid): object {\n return {\n qid: item.qid,\n title: item.title,\n };\n}\n\nfunction truncatePageText(text: string): string {\n const maxLength = 16000;\n\n return text.length <= maxLength\n ? text\n : `${text.slice(0, maxLength)}\\n\\n[truncated]`;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,13 @@
1
+ interface RateLimiterOptions {
2
+ readonly concurrency: number;
3
+ readonly minRequestIntervalMs: number;
4
+ }
5
+ declare class RateLimiter {
6
+ #private;
7
+ constructor(options: RateLimiterOptions);
8
+ use<T>(operation: () => Promise<T>): Promise<T>;
9
+ blockFor(ms: number): void;
10
+ }
11
+ declare function parseRetryAfterMs(value: string | null): number | undefined;
12
+
13
+ export { RateLimiter, type RateLimiterOptions, parseRetryAfterMs };
@@ -0,0 +1,84 @@
1
+ class RateLimiter {
2
+ #concurrency;
3
+ #minRequestIntervalMs;
4
+ #active = 0;
5
+ #blockedUntil = 0;
6
+ #lastStartedAt = 0;
7
+ #queue = [];
8
+ constructor(options) {
9
+ this.#concurrency = Math.max(1, Math.floor(options.concurrency));
10
+ this.#minRequestIntervalMs = Math.max(
11
+ 0,
12
+ Math.floor(options.minRequestIntervalMs)
13
+ );
14
+ }
15
+ async use(operation) {
16
+ await this.#acquire();
17
+ try {
18
+ return await operation();
19
+ } finally {
20
+ this.#active -= 1;
21
+ this.#releaseNext();
22
+ }
23
+ }
24
+ blockFor(ms) {
25
+ if (!Number.isFinite(ms) || ms <= 0) {
26
+ return;
27
+ }
28
+ this.#blockedUntil = Math.max(this.#blockedUntil, Date.now() + ms);
29
+ }
30
+ async #acquire() {
31
+ await new Promise((resolve) => {
32
+ this.#queue.push(resolve);
33
+ this.#releaseNext();
34
+ });
35
+ await this.#waitForTurn();
36
+ this.#active += 1;
37
+ this.#lastStartedAt = Date.now();
38
+ }
39
+ async #waitForTurn() {
40
+ const blockedDelayMs = Math.max(0, this.#blockedUntil - Date.now());
41
+ const intervalDelayMs = Math.max(
42
+ 0,
43
+ this.#lastStartedAt + this.#minRequestIntervalMs - Date.now()
44
+ );
45
+ const delayMs = Math.max(blockedDelayMs, intervalDelayMs);
46
+ if (delayMs > 0) {
47
+ await delay(delayMs);
48
+ }
49
+ }
50
+ #releaseNext() {
51
+ if (this.#active >= this.#concurrency) {
52
+ return;
53
+ }
54
+ const resolve = this.#queue.shift();
55
+ if (resolve === void 0) {
56
+ return;
57
+ }
58
+ resolve();
59
+ }
60
+ }
61
+ async function delay(ms) {
62
+ await new Promise((resolve) => {
63
+ setTimeout(resolve, ms);
64
+ });
65
+ }
66
+ function parseRetryAfterMs(value) {
67
+ if (value === null || value.trim() === "") {
68
+ return void 0;
69
+ }
70
+ const seconds = Number(value);
71
+ if (Number.isFinite(seconds)) {
72
+ return Math.max(0, seconds * 1e3);
73
+ }
74
+ const retryAt = Date.parse(value);
75
+ if (Number.isNaN(retryAt)) {
76
+ return void 0;
77
+ }
78
+ return Math.max(0, retryAt - Date.now());
79
+ }
80
+ export {
81
+ RateLimiter,
82
+ parseRetryAfterMs
83
+ };
84
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/wikipage/rate-limiter.ts"],"sourcesContent":["export interface RateLimiterOptions {\n readonly concurrency: number;\n readonly minRequestIntervalMs: number;\n}\n\nexport class RateLimiter {\n readonly #concurrency: number;\n readonly #minRequestIntervalMs: number;\n #active = 0;\n #blockedUntil = 0;\n #lastStartedAt = 0;\n readonly #queue: Array<() => void> = [];\n\n public constructor(options: RateLimiterOptions) {\n this.#concurrency = Math.max(1, Math.floor(options.concurrency));\n this.#minRequestIntervalMs = Math.max(\n 0,\n Math.floor(options.minRequestIntervalMs),\n );\n }\n\n public async use<T>(operation: () => Promise<T>): Promise<T> {\n await this.#acquire();\n\n try {\n return await operation();\n } finally {\n this.#active -= 1;\n this.#releaseNext();\n }\n }\n\n public blockFor(ms: number): void {\n if (!Number.isFinite(ms) || ms <= 0) {\n return;\n }\n\n this.#blockedUntil = Math.max(this.#blockedUntil, Date.now() + ms);\n }\n\n async #acquire(): Promise<void> {\n await new Promise<void>((resolve) => {\n this.#queue.push(resolve);\n this.#releaseNext();\n });\n\n await this.#waitForTurn();\n this.#active += 1;\n this.#lastStartedAt = Date.now();\n }\n\n async #waitForTurn(): Promise<void> {\n const blockedDelayMs = Math.max(0, this.#blockedUntil - Date.now());\n const intervalDelayMs = Math.max(\n 0,\n this.#lastStartedAt + this.#minRequestIntervalMs - Date.now(),\n );\n const delayMs = Math.max(blockedDelayMs, intervalDelayMs);\n\n if (delayMs > 0) {\n await delay(delayMs);\n }\n }\n\n #releaseNext(): void {\n if (this.#active >= this.#concurrency) {\n return;\n }\n\n const resolve = this.#queue.shift();\n\n if (resolve === undefined) {\n return;\n }\n\n resolve();\n }\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport function parseRetryAfterMs(value: string | null): number | undefined {\n if (value === null || value.trim() === \"\") {\n return undefined;\n }\n\n const seconds = Number(value);\n\n if (Number.isFinite(seconds)) {\n return Math.max(0, seconds * 1000);\n }\n\n const retryAt = Date.parse(value);\n\n if (Number.isNaN(retryAt)) {\n return undefined;\n }\n\n return Math.max(0, retryAt - Date.now());\n}\n"],"mappings":"AAKO,MAAM,YAAY;AAAA,EACd;AAAA,EACA;AAAA,EACT,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACR,SAA4B,CAAC;AAAA,EAE/B,YAAY,SAA6B;AAC9C,SAAK,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,WAAW,CAAC;AAC/D,SAAK,wBAAwB,KAAK;AAAA,MAChC;AAAA,MACA,KAAK,MAAM,QAAQ,oBAAoB;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAa,IAAO,WAAyC;AAC3D,UAAM,KAAK,SAAS;AAEpB,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,UAAE;AACA,WAAK,WAAW;AAChB,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA,EAEO,SAAS,IAAkB;AAChC,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,GAAG;AACnC;AAAA,IACF;AAEA,SAAK,gBAAgB,KAAK,IAAI,KAAK,eAAe,KAAK,IAAI,IAAI,EAAE;AAAA,EACnE;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,WAAK,OAAO,KAAK,OAAO;AACxB,WAAK,aAAa;AAAA,IACpB,CAAC;AAED,UAAM,KAAK,aAAa;AACxB,SAAK,WAAW;AAChB,SAAK,iBAAiB,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,eAA8B;AAClC,UAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,gBAAgB,KAAK,IAAI,CAAC;AAClE,UAAM,kBAAkB,KAAK;AAAA,MAC3B;AAAA,MACA,KAAK,iBAAiB,KAAK,wBAAwB,KAAK,IAAI;AAAA,IAC9D;AACA,UAAM,UAAU,KAAK,IAAI,gBAAgB,eAAe;AAExD,QAAI,UAAU,GAAG;AACf,YAAM,MAAM,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,eAAqB;AACnB,QAAI,KAAK,WAAW,KAAK,cAAc;AACrC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,OAAO,MAAM;AAElC,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AAEA,YAAQ;AAAA,EACV;AACF;AAEA,eAAe,MAAM,IAA2B;AAC9C,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEO,SAAS,kBAAkB,OAA0C;AAC1E,MAAI,UAAU,QAAQ,MAAM,KAAK,MAAM,IAAI;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,KAAK;AAE5B,MAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,WAAO,KAAK,IAAI,GAAG,UAAU,GAAI;AAAA,EACnC;AAEA,QAAM,UAAU,KAAK,MAAM,KAAK;AAEhC,MAAI,OAAO,MAAM,OAAO,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,UAAU,KAAK,IAAI,CAAC;AACzC;","names":[]}
@@ -0,0 +1,26 @@
1
+ import { WikipageCache } from './cache.js';
2
+ import { WikimediaClient } from './wikimedia-client.js';
3
+ import { DisambiguationProfileNormalizer, WikipageResolveProgressReporter, WikipageResolverOptions, QidResolution } from './types.js';
4
+ import '../document/database.js';
5
+ import 'sqlite3';
6
+ import '../gc/types.js';
7
+ import './fetch-log.js';
8
+
9
+ declare class WikipageResolver {
10
+ #private;
11
+ constructor(input: {
12
+ readonly cache: WikipageCache;
13
+ readonly client: WikimediaClient;
14
+ readonly language: string;
15
+ readonly maxBatchSize: number;
16
+ readonly normalizer: DisambiguationProfileNormalizer | undefined;
17
+ readonly ownsCache: boolean;
18
+ readonly progress: WikipageResolveProgressReporter | undefined;
19
+ readonly wiki: string;
20
+ });
21
+ static open(options?: WikipageResolverOptions): Promise<WikipageResolver>;
22
+ close(): Promise<void>;
23
+ resolveQids(qids: readonly string[]): Promise<readonly QidResolution[]>;
24
+ }
25
+
26
+ export { WikipageResolver };
@@ -0,0 +1,325 @@
1
+ import { WikipageCache } from "./cache.js";
2
+ import { createWikipageFetchLog } from "./fetch-log.js";
3
+ import {
4
+ WikimediaClient,
5
+ replaceTitleUriWithQidUri
6
+ } from "./wikimedia-client.js";
7
+ const DEFAULT_CONCURRENCY = 3;
8
+ const DEFAULT_LANGUAGE = "zh";
9
+ const DEFAULT_MAX_BATCH_SIZE = 50;
10
+ const DEFAULT_MIN_REQUEST_INTERVAL_MS = 100;
11
+ const DEFAULT_RETRY_BASE_DELAY_MS = 1e3;
12
+ const DEFAULT_RETRY_TIMES = 3;
13
+ const DEFAULT_USER_AGENT = "WikiGraph/0.3 (https://github.com/oomol-lab/wiki-graph)";
14
+ class WikipageResolver {
15
+ #cache;
16
+ #client;
17
+ #maxBatchSize;
18
+ #language;
19
+ #normalizer;
20
+ #ownsCache;
21
+ #progress;
22
+ #wiki;
23
+ constructor(input) {
24
+ this.#cache = input.cache;
25
+ this.#client = input.client;
26
+ this.#language = input.language;
27
+ this.#maxBatchSize = input.maxBatchSize;
28
+ this.#normalizer = input.normalizer;
29
+ this.#ownsCache = input.ownsCache;
30
+ this.#progress = input.progress;
31
+ this.#wiki = input.wiki;
32
+ }
33
+ static async open(options = {}) {
34
+ const language = normalizeLanguage(options.language);
35
+ const wiki = options.wiki ?? `${language}wiki`;
36
+ const cache = await WikipageCache.open(options.cacheDatabasePath);
37
+ return new WikipageResolver({
38
+ cache,
39
+ client: new WikimediaClient({
40
+ concurrency: options.concurrency ?? DEFAULT_CONCURRENCY,
41
+ language,
42
+ requestLog: createWikipageFetchLog(options.logDirPath),
43
+ minRequestIntervalMs: options.minRequestIntervalMs ?? DEFAULT_MIN_REQUEST_INTERVAL_MS,
44
+ retryBaseDelayMs: options.retryBaseDelayMs ?? DEFAULT_RETRY_BASE_DELAY_MS,
45
+ retryTimes: options.retryTimes ?? DEFAULT_RETRY_TIMES,
46
+ userAgent: options.userAgent ?? DEFAULT_USER_AGENT,
47
+ wiki,
48
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
49
+ }),
50
+ language,
51
+ maxBatchSize: normalizeBatchSize(options.maxBatchSize),
52
+ normalizer: options.normalizer,
53
+ ownsCache: true,
54
+ progress: options.progress,
55
+ wiki
56
+ });
57
+ }
58
+ async close() {
59
+ if (this.#ownsCache) {
60
+ await this.#cache.close();
61
+ }
62
+ }
63
+ async resolveQids(qids) {
64
+ const normalizedQids = normalizeQids(qids);
65
+ const qidRecords = await this.#resolveQidRecords(normalizedQids);
66
+ const disambiguationRecords = await this.#resolveDisambiguations(
67
+ [...qidRecords.values()].filter(hasDisambiguationPage)
68
+ );
69
+ return normalizedQids.map((qid) => {
70
+ const record = qidRecords.get(qid);
71
+ if (record === void 0) {
72
+ return {
73
+ isDisambiguation: false,
74
+ qid
75
+ };
76
+ }
77
+ const disambiguation = disambiguationRecords.get(qid);
78
+ const disambiguationPages = disambiguation?.pages ?? [];
79
+ const primarySitelink = pickPrimarySitelink(record.sitelinks, this.#wiki);
80
+ return {
81
+ ...record.description === void 0 ? {} : { description: record.description },
82
+ ...disambiguation === void 0 ? {} : { disambiguation: toDisambiguationExpansion(disambiguation) },
83
+ ...disambiguationPages.length === 0 ? {} : { disambiguationPages },
84
+ isDisambiguation: disambiguationPages.length > 0,
85
+ ...record.label === void 0 ? {} : { label: record.label },
86
+ qid,
87
+ ...primarySitelink === void 0 ? {} : { sitelink: primarySitelink },
88
+ ...record.sitelinks.length === 0 ? {} : { sitelinks: record.sitelinks.map(toSitelink) }
89
+ };
90
+ });
91
+ }
92
+ async #resolveQidRecords(qids) {
93
+ const cached = new Map(await this.#cache.getQids(qids, this.#language));
94
+ const missing = qids.filter((qid) => !cached.has(qid));
95
+ let resolvedQids = cached.size;
96
+ let resolvedEntities = 0;
97
+ await this.#reportProgress("qid", resolvedQids, qids.length);
98
+ for (const batch of chunk(missing, this.#maxBatchSize)) {
99
+ const entityInfos = await this.#client.getEntities(batch);
100
+ resolvedEntities += batch.length;
101
+ await this.#reportProgress("entity", resolvedEntities, missing.length);
102
+ const pageInfos = await this.#fetchPageInfos(entityInfos);
103
+ const now = (/* @__PURE__ */ new Date()).toISOString();
104
+ const records = batch.map(
105
+ (qid) => createQidRecord(qid, entityInfos.get(qid), pageInfos, now)
106
+ );
107
+ await this.#cache.putQids(records, this.#language);
108
+ for (const record of records) {
109
+ cached.set(record.qid, record);
110
+ }
111
+ resolvedQids += batch.length;
112
+ await this.#reportProgress("qid", resolvedQids, qids.length);
113
+ }
114
+ return cached;
115
+ }
116
+ async #fetchPageInfos(entityInfos) {
117
+ const results = /* @__PURE__ */ new Map();
118
+ const titlesByWiki = /* @__PURE__ */ new Map();
119
+ for (const entity of entityInfos.values()) {
120
+ for (const sitelink of entity.sitelinks) {
121
+ const titles = titlesByWiki.get(sitelink.wiki) ?? /* @__PURE__ */ new Set();
122
+ titles.add(sitelink.title);
123
+ titlesByWiki.set(sitelink.wiki, titles);
124
+ }
125
+ }
126
+ for (const [wiki, titles] of titlesByWiki) {
127
+ for (const batch of chunk([...titles], this.#maxBatchSize)) {
128
+ for (const [title, page] of await this.#client.getPagesByTitles(
129
+ batch,
130
+ wiki
131
+ )) {
132
+ results.set(pageKey(wiki, title), page);
133
+ }
134
+ await this.#reportProgress(
135
+ "page",
136
+ results.size,
137
+ countTitleSetItems(titlesByWiki)
138
+ );
139
+ }
140
+ }
141
+ return results;
142
+ }
143
+ async #resolveDisambiguations(records) {
144
+ const qids = records.map((record) => record.qid);
145
+ const cached = new Map(
146
+ await this.#cache.getDisambiguations(qids, this.#wiki)
147
+ );
148
+ const missing = records.filter((record) => !cached.has(record.qid));
149
+ let resolvedPages = cached.size;
150
+ await this.#reportProgress(
151
+ "disambiguation-page",
152
+ resolvedPages,
153
+ qids.length
154
+ );
155
+ for (const record of missing) {
156
+ const expansion = await this.#expandDisambiguation(record);
157
+ await this.#cache.putDisambiguations([expansion], this.#wiki);
158
+ cached.set(record.qid, expansion);
159
+ resolvedPages += 1;
160
+ await this.#reportProgress(
161
+ "disambiguation-page",
162
+ resolvedPages,
163
+ qids.length
164
+ );
165
+ }
166
+ return cached;
167
+ }
168
+ async #expandDisambiguation(record) {
169
+ const pages = [];
170
+ for (const page of record.sitelinks.filter(
171
+ (item) => item.isDisambiguation
172
+ )) {
173
+ const parsedPage = await this.#client.parseDisambiguationPage(
174
+ page.title,
175
+ page.wiki
176
+ );
177
+ const linkedPageInfos = /* @__PURE__ */ new Map();
178
+ for (const batch of chunk(parsedPage.linkedTitles, this.#maxBatchSize)) {
179
+ for (const [title, linkedPage] of await this.#client.getPagesByTitles(
180
+ batch,
181
+ page.wiki
182
+ )) {
183
+ linkedPageInfos.set(title, linkedPage);
184
+ }
185
+ await this.#reportProgress(
186
+ "linked-page",
187
+ linkedPageInfos.size,
188
+ parsedPage.linkedTitles.length
189
+ );
190
+ }
191
+ const titleToQid = /* @__PURE__ */ new Map();
192
+ const linkedQids2 = [];
193
+ for (const title of parsedPage.linkedTitles) {
194
+ const qid = linkedPageInfos.get(title)?.wikibaseItem;
195
+ if (qid === void 0) {
196
+ continue;
197
+ }
198
+ titleToQid.set(title, qid);
199
+ linkedQids2.push({ qid, title });
200
+ }
201
+ pages.push({
202
+ linkedQids: linkedQids2,
203
+ ...parsedPage.pageId === void 0 ? {} : { pageId: parsedPage.pageId },
204
+ text: replaceTitleUriWithQidUri(parsedPage.text, titleToQid),
205
+ title: parsedPage.title,
206
+ wiki: parsedPage.wiki
207
+ });
208
+ }
209
+ const linkedQids = mergeLinkedQids(pages);
210
+ const profile = this.#normalizer === void 0 || linkedQids.length === 0 ? void 0 : await this.#normalizer({
211
+ pageQidLinks: linkedQids,
212
+ pages,
213
+ sourceQid: record.qid,
214
+ ...record.label === void 0 ? {} : { surface: record.label }
215
+ });
216
+ return {
217
+ checkedAt: (/* @__PURE__ */ new Date()).toISOString(),
218
+ disambiguationQid: record.qid,
219
+ pages,
220
+ ...profile === void 0 ? {} : { profile }
221
+ };
222
+ }
223
+ async #reportProgress(detail, done, total) {
224
+ await this.#progress?.({
225
+ detail,
226
+ done: Math.min(Math.max(0, done), Math.max(0, total)),
227
+ total: Math.max(0, total)
228
+ });
229
+ }
230
+ }
231
+ function createQidRecord(qid, entityInfo, pageInfos, now) {
232
+ return {
233
+ checkedAt: now,
234
+ ...entityInfo?.description === void 0 ? {} : { description: entityInfo.description },
235
+ ...entityInfo?.label === void 0 ? {} : { label: entityInfo.label },
236
+ qid,
237
+ sitelinks: entityInfo?.sitelinks.flatMap((sitelink) => {
238
+ const page = pageInfos.get(pageKey(sitelink.wiki, sitelink.title));
239
+ if (page === void 0) {
240
+ return [];
241
+ }
242
+ return [
243
+ {
244
+ isDisambiguation: page.isDisambiguation,
245
+ ...page.pageId === void 0 ? {} : { pageId: page.pageId },
246
+ title: page.title,
247
+ wiki: page.wiki
248
+ }
249
+ ];
250
+ }) ?? [],
251
+ updatedAt: now
252
+ };
253
+ }
254
+ function toDisambiguationExpansion(record) {
255
+ return {
256
+ checkedAt: record.checkedAt,
257
+ disambiguationQid: record.disambiguationQid,
258
+ linkedQids: mergeLinkedQids(record.pages),
259
+ pages: record.pages,
260
+ ...record.profile === void 0 ? {} : { profile: record.profile }
261
+ };
262
+ }
263
+ function mergeLinkedQids(pages) {
264
+ const results = /* @__PURE__ */ new Map();
265
+ for (const page of pages) {
266
+ for (const item of page.linkedQids) {
267
+ results.set(item.qid, item);
268
+ }
269
+ }
270
+ return [...results.values()];
271
+ }
272
+ function countTitleSetItems(input) {
273
+ let count = 0;
274
+ for (const titles of input.values()) {
275
+ count += titles.size;
276
+ }
277
+ return count;
278
+ }
279
+ function hasDisambiguationPage(record) {
280
+ return record.sitelinks.some((page) => page.isDisambiguation);
281
+ }
282
+ function pickPrimarySitelink(pages, wiki) {
283
+ const preferred = pages.find((page) => page.wiki === wiki) ?? pages[0];
284
+ return preferred === void 0 ? void 0 : toSitelink(preferred);
285
+ }
286
+ function toSitelink(page) {
287
+ return {
288
+ title: page.title,
289
+ wiki: page.wiki
290
+ };
291
+ }
292
+ function pageKey(wiki, title) {
293
+ return `${wiki}:${title}`;
294
+ }
295
+ function normalizeQids(qids) {
296
+ return [
297
+ ...new Set(
298
+ qids.map((qid) => qid.trim().toUpperCase()).filter((qid) => /^Q[1-9]\d*$/u.test(qid))
299
+ )
300
+ ];
301
+ }
302
+ function normalizeLanguage(value) {
303
+ const normalized = value?.trim().toLowerCase();
304
+ if (normalized === "en" || normalized === "zh") {
305
+ return normalized;
306
+ }
307
+ return DEFAULT_LANGUAGE;
308
+ }
309
+ function normalizeBatchSize(value) {
310
+ if (value === void 0 || !Number.isFinite(value)) {
311
+ return DEFAULT_MAX_BATCH_SIZE;
312
+ }
313
+ return Math.max(1, Math.floor(value));
314
+ }
315
+ function chunk(items, size) {
316
+ const batches = [];
317
+ for (let index = 0; index < items.length; index += size) {
318
+ batches.push(items.slice(index, index + size));
319
+ }
320
+ return batches;
321
+ }
322
+ export {
323
+ WikipageResolver
324
+ };
325
+ //# sourceMappingURL=resolver.js.map