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,477 @@
1
+ import { z } from "zod";
2
+ import {
3
+ ParsedJsonError,
4
+ RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,
5
+ requestGuaranteedJson
6
+ } from "../guaranteed/index.js";
7
+ import {
8
+ EVIDENCE_SELECTION_JSON_SHAPE,
9
+ EVIDENCE_SELECTION_PROMPT_FRAGMENT,
10
+ EvidenceResolver,
11
+ normalizeEvidenceDisplayText,
12
+ resolveEvidenceSelectionList
13
+ } from "../evidence-selection/index.js";
14
+ import { FragmentProjection } from "../reader/chunk-batch/index.js";
15
+ const evidenceAnchorSchema = z.object({
16
+ head: z.string().optional(),
17
+ mode: z.enum(["full", "head_tail"]).optional(),
18
+ tail: z.string().optional(),
19
+ text: z.string().optional()
20
+ }).strict();
21
+ const evidenceSelectionItemSchema = z.object({
22
+ quote: z.string().optional(),
23
+ sentence_id: z.string().optional()
24
+ }).strict();
25
+ const relationEvidenceSchema = z.union([
26
+ z.object({
27
+ end_anchor: z.union([z.string(), evidenceAnchorSchema]).optional(),
28
+ quote: z.string().optional(),
29
+ sentence_id: z.string().optional(),
30
+ start_anchor: z.union([z.string(), evidenceAnchorSchema]).optional()
31
+ }).strict(),
32
+ z.array(evidenceSelectionItemSchema)
33
+ ]);
34
+ const relationSchema = z.object({
35
+ confidence: z.number().min(0).max(1).optional(),
36
+ evidence: relationEvidenceSchema,
37
+ predicate: z.string().min(1).max(64),
38
+ sourceMentionId: z.string().min(1),
39
+ targetMentionId: z.string().min(1)
40
+ }).strict();
41
+ const relationResponseSchema = z.object({
42
+ relations: z.array(relationSchema)
43
+ }).strict();
44
+ const SUGGESTED_PREDICATES = [
45
+ "instance_of",
46
+ "subclass_of",
47
+ "part_of",
48
+ "has_part",
49
+ "located_in",
50
+ "contains",
51
+ "member_of",
52
+ "owned_by",
53
+ "creator",
54
+ "author",
55
+ "developer",
56
+ "founded_by",
57
+ "leader",
58
+ "position_held",
59
+ "employer",
60
+ "educated_at",
61
+ "student_of",
62
+ "parent",
63
+ "child",
64
+ "spouse",
65
+ "sibling",
66
+ "relative",
67
+ "replaces",
68
+ "replaced_by",
69
+ "precedes",
70
+ "follows",
71
+ "influenced_by",
72
+ "influences",
73
+ "participant_in",
74
+ "participant",
75
+ "conflict",
76
+ "opposes",
77
+ "allied_with",
78
+ "supports",
79
+ "causes",
80
+ "caused_by",
81
+ "results_in",
82
+ "has_effect",
83
+ "uses",
84
+ "used_by",
85
+ "applies_to",
86
+ "based_on",
87
+ "derived_from",
88
+ "depicts",
89
+ "named_after",
90
+ "has_characteristic",
91
+ "related_to",
92
+ "associated_with",
93
+ "connected_to",
94
+ "corresponds_to",
95
+ "main_subject",
96
+ "about",
97
+ "context_for",
98
+ "described_as",
99
+ "refers_to",
100
+ "concerns",
101
+ "discusses",
102
+ "compares_with",
103
+ "overlaps_with",
104
+ "coexists_with",
105
+ "parallel_to",
106
+ "analogous_to",
107
+ "mentioned_with",
108
+ "points_to",
109
+ "interpreted_as",
110
+ "seen_as",
111
+ "different_from",
112
+ "distinct_from",
113
+ "not_same_as",
114
+ "not_to_be_confused_with",
115
+ "contrasts_with",
116
+ "opposite_of",
117
+ "conflicts_with",
118
+ "contradicts",
119
+ "excludes",
120
+ "incompatible_with",
121
+ "rejects",
122
+ "criticizes",
123
+ "denies",
124
+ "not_reducible_to"
125
+ ];
126
+ const resolver = new EvidenceResolver();
127
+ async function discoverWikilinkRelations(options) {
128
+ if (options.window.mentions.length < 2) {
129
+ return [];
130
+ }
131
+ try {
132
+ return await requestGuaranteedJson({
133
+ messages: buildRelationMessages(options),
134
+ parse: (response) => parseRelationResponse(options, response),
135
+ request: options.request,
136
+ responseIntentClassifierPrompt: RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,
137
+ schema: relationResponseSchema,
138
+ ...options.maxRetries === void 0 ? {} : { maxRetries: options.maxRetries }
139
+ });
140
+ } catch {
141
+ return [];
142
+ }
143
+ }
144
+ function parseRelationResponse(options, response) {
145
+ const mentionsById = new Map(
146
+ options.window.mentions.map((mention) => [mention.id, mention])
147
+ );
148
+ const projection = new FragmentProjection(
149
+ options.sentences.map((sentence, index) => ({
150
+ sentenceId: [options.chapterId, (options.fragmentId ?? 0) + index],
151
+ text: sentence.text,
152
+ wordsCount: sentence.wordsCount
153
+ }))
154
+ );
155
+ const sentenceOffsets = buildSentenceOffsets(options.sentences);
156
+ const evidenceSentences = projection.sentences.flatMap(
157
+ (sentence, sentenceIndex) => {
158
+ const offset = sentenceOffsets[sentenceIndex];
159
+ if (offset === void 0 || !rangesOverlap(offset, options.window.range)) {
160
+ return [];
161
+ }
162
+ return [
163
+ {
164
+ id: `S${sentenceIndex + 1}`,
165
+ sentenceId: sentence.sentenceId,
166
+ text: sentence.projectedText
167
+ }
168
+ ];
169
+ }
170
+ );
171
+ const issues = [];
172
+ const links = [];
173
+ const seenKeys = /* @__PURE__ */ new Set();
174
+ const sentenceIds = evidenceSentences.map((sentence) => sentence.sentenceId);
175
+ const sentenceTexts = evidenceSentences.map((sentence) => sentence.text);
176
+ for (const [index, relation] of response.relations.entries()) {
177
+ const prefix = `relations[${index}]`;
178
+ const source = mentionsById.get(relation.sourceMentionId);
179
+ const target = mentionsById.get(relation.targetMentionId);
180
+ if (source === void 0) {
181
+ issues.push(`${prefix}.sourceMentionId references an unknown mention.`);
182
+ continue;
183
+ }
184
+ if (target === void 0) {
185
+ issues.push(`${prefix}.targetMentionId references an unknown mention.`);
186
+ continue;
187
+ }
188
+ if (source.id === target.id) {
189
+ issues.push(
190
+ `${prefix} links a mention to itself. Use two different tagged mention IDs, or remove the relation if the other endpoint is not tagged.`
191
+ );
192
+ continue;
193
+ }
194
+ const predicate = normalizePredicate(relation.predicate);
195
+ if (predicate === "") {
196
+ issues.push(`${prefix}.predicate normalizes to an empty label.`);
197
+ continue;
198
+ }
199
+ if (predicate === "mentions") {
200
+ issues.push(
201
+ `${prefix}.predicate must be semantic; "mentions" is not a relation predicate.`
202
+ );
203
+ continue;
204
+ }
205
+ const [selectionResolution, selectionFailure] = resolveRelationEvidence({
206
+ evidence: createRelationEvidenceSelection(relation.evidence),
207
+ sentences: evidenceSentences
208
+ });
209
+ const [anchorResolution, anchorFailure] = !Array.isArray(relation.evidence) && selectionResolution === void 0 && selectionFailure === void 0 ? resolver.resolve(relation.evidence, sentenceIds, sentenceTexts) : [void 0, void 0];
210
+ const effectiveResolution = selectionResolution ?? anchorResolution;
211
+ const effectiveFailure = selectionFailure === void 0 ? anchorFailure : toEvidenceResolutionFailure(selectionFailure);
212
+ if (effectiveResolution === void 0) {
213
+ issues.push(
214
+ `${prefix}.evidence could not be resolved: ${effectiveFailure?.message ?? "unknown failure"}`
215
+ );
216
+ continue;
217
+ }
218
+ const evidenceSentenceIds = dedupeSentenceIds(
219
+ effectiveResolution.sentenceIds
220
+ );
221
+ if (evidenceSentenceIds.length === 0) {
222
+ issues.push(`${prefix}.evidence resolved to no sentences.`);
223
+ continue;
224
+ }
225
+ if (evidenceSentenceIds.some(
226
+ ([chapterId, sentenceIndex]) => chapterId !== options.chapterId || sentenceOffsets[sentenceIndex - (options.fragmentId ?? 0)] === void 0
227
+ )) {
228
+ issues.push(`${prefix}.evidence resolved outside this fragment.`);
229
+ continue;
230
+ }
231
+ const key = `${source.id}\0${target.id}\0${predicate}\0${evidenceSentenceIds.map((sentenceId) => sentenceId.join(":")).join(",")}`;
232
+ if (seenKeys.has(key)) {
233
+ continue;
234
+ }
235
+ seenKeys.add(key);
236
+ links.push({
237
+ ...relation.confidence === void 0 ? {} : { confidence: relation.confidence },
238
+ evidenceSentenceIds,
239
+ predicate,
240
+ sourceMentionId: source.id,
241
+ targetMentionId: target.id
242
+ });
243
+ }
244
+ if (issues.length > 0) {
245
+ throw new ParsedJsonError(issues);
246
+ }
247
+ return links;
248
+ }
249
+ function dedupeSentenceIds(sentenceIds) {
250
+ const seen = /* @__PURE__ */ new Set();
251
+ const deduped = [];
252
+ for (const sentenceId of sentenceIds) {
253
+ const key = sentenceId.join(":");
254
+ if (seen.has(key)) {
255
+ continue;
256
+ }
257
+ seen.add(key);
258
+ deduped.push(sentenceId);
259
+ }
260
+ return deduped.sort(
261
+ ([leftChapter, leftSentence], [rightChapter, rightSentence]) => leftChapter - rightChapter || leftSentence - rightSentence
262
+ );
263
+ }
264
+ function buildRelationMessages(input) {
265
+ return [
266
+ {
267
+ content: formatRelationSystemPrompt(),
268
+ role: "system"
269
+ },
270
+ {
271
+ content: formatRelationUserPrompt(input),
272
+ role: "user"
273
+ }
274
+ ];
275
+ }
276
+ function formatRelationSystemPrompt() {
277
+ return [
278
+ "You discover semantic relations between grounded entity mentions in source text.",
279
+ "",
280
+ "Rules:",
281
+ "- Return JSON only.",
282
+ "- Return only relations that are directly supported by the source text.",
283
+ '- Every relation must connect two mention IDs from the <mention id="..." qid="..."> tags.',
284
+ "- A relation is valid only when both endpoints are explicitly tagged mentions in the source context.",
285
+ "- If a supported relation would require a subject or object that is not tagged with a mention ID, skip that relation.",
286
+ "- Do not invent mention IDs, and do not reuse another mention as a placeholder for an untagged endpoint.",
287
+ "- sourceMentionId and targetMentionId must be different mention IDs; never link a mention to itself.",
288
+ "- Do not create a relation just because two mentions are nearby.",
289
+ "- If the text explicitly states both a positive relation and a negated/distinction relation between mentions, return both relations when both are directly supported.",
290
+ "- Prefer the suggested predicates when one fits.",
291
+ "- If none fits, create one short snake_case predicate.",
292
+ "- Never use mentions as a predicate.",
293
+ EVIDENCE_SELECTION_PROMPT_FRAGMENT,
294
+ "- Source sentences may contain XML-like mention tags. Use those tags for mention IDs, but ignore the tags when copying evidence quote text.",
295
+ "- Do not use offsets or invented paraphrases as evidence.",
296
+ "",
297
+ "Suggested predicates:",
298
+ SUGGESTED_PREDICATES.join(", ")
299
+ ].join("\n");
300
+ }
301
+ function formatRelationUserPrompt(input) {
302
+ return [
303
+ "Source sentences with mention tags:",
304
+ formatTaggedEvidenceSentences(input),
305
+ "",
306
+ "Return this JSON shape:",
307
+ JSON.stringify(
308
+ {
309
+ relations: [
310
+ {
311
+ confidence: 0.86,
312
+ evidence: EVIDENCE_SELECTION_JSON_SHAPE,
313
+ predicate: "predicate_name",
314
+ sourceMentionId: "source mention id",
315
+ targetMentionId: "target mention id"
316
+ }
317
+ ]
318
+ },
319
+ null,
320
+ 2
321
+ ),
322
+ "",
323
+ "If the source text does not support any semantic relation, return:",
324
+ JSON.stringify({ relations: [] })
325
+ ].join("\n");
326
+ }
327
+ function formatTaggedEvidenceSentences(input) {
328
+ const sourceOffsets = buildSentenceOffsets(input.sentences);
329
+ const lines = input.sentences.flatMap((sentence, index) => {
330
+ const offset = sourceOffsets[index];
331
+ if (offset === void 0 || !rangesOverlap(offset, input.window.range)) {
332
+ return [];
333
+ }
334
+ return [
335
+ `S${index + 1}: ${normalizeEvidenceDisplayText(
336
+ formatTaggedSentence({
337
+ mentions: input.window.mentions,
338
+ sentence,
339
+ sentenceOffset: offset
340
+ })
341
+ )}`
342
+ ];
343
+ });
344
+ return lines.length === 0 ? formatTaggedContext(input.window) : lines.join("\n");
345
+ }
346
+ function formatTaggedSentence(input) {
347
+ const mentions = input.mentions.filter(
348
+ (mention) => mention.range.start >= input.sentenceOffset.start && mention.range.end <= input.sentenceOffset.end
349
+ ).sort((left, right) => left.range.start - right.range.start);
350
+ const parts = [];
351
+ let cursor = input.sentenceOffset.start;
352
+ for (const mention of mentions) {
353
+ parts.push(
354
+ escapeXmlText(
355
+ input.sentence.text.slice(
356
+ cursor - input.sentenceOffset.start,
357
+ mention.range.start - input.sentenceOffset.start
358
+ )
359
+ )
360
+ );
361
+ parts.push(
362
+ `<mention id="${escapeXmlAttribute(mention.id)}" qid="${escapeXmlAttribute(
363
+ mention.qid ?? ""
364
+ )}">${escapeXmlText(
365
+ input.sentence.text.slice(
366
+ mention.range.start - input.sentenceOffset.start,
367
+ mention.range.end - input.sentenceOffset.start
368
+ )
369
+ )}</mention>`
370
+ );
371
+ cursor = mention.range.end;
372
+ }
373
+ parts.push(
374
+ escapeXmlText(
375
+ input.sentence.text.slice(cursor - input.sentenceOffset.start)
376
+ )
377
+ );
378
+ return parts.join("");
379
+ }
380
+ function rangesOverlap(left, right) {
381
+ return left.start < right.end && right.start < left.end;
382
+ }
383
+ function resolveRelationEvidence(input) {
384
+ if (input.evidence === void 0) {
385
+ return [void 0, void 0];
386
+ }
387
+ return resolveEvidenceSelectionList({
388
+ evidence: input.evidence,
389
+ sentences: input.sentences
390
+ });
391
+ }
392
+ function createRelationEvidenceSelection(evidence) {
393
+ if (Array.isArray(evidence)) {
394
+ return evidence.map(createRelationEvidenceSelectionItem);
395
+ }
396
+ const hasSelectionEvidence = typeof evidence.quote === "string" || typeof evidence.sentence_id === "string";
397
+ return hasSelectionEvidence ? createRelationEvidenceSelectionItem(evidence) : void 0;
398
+ }
399
+ function createRelationEvidenceSelectionItem(evidence) {
400
+ return {
401
+ ...typeof evidence.quote === "string" ? { quote: evidence.quote } : {},
402
+ ...typeof evidence.sentence_id === "string" ? { sentence_id: evidence.sentence_id } : {}
403
+ };
404
+ }
405
+ function toEvidenceResolutionFailure(failure) {
406
+ return {
407
+ candidates: failure.candidates.map((candidate) => ({
408
+ exactNormalized: candidate.exactNormalized,
409
+ exactRaw: candidate.exactRaw,
410
+ exactSubstring: candidate.exactSubstring,
411
+ index: candidate.index,
412
+ nextText: candidate.nextText,
413
+ occurrenceId: candidate.occurrenceId,
414
+ prevText: candidate.prevText,
415
+ score: candidate.score,
416
+ sentenceId: candidate.sentence.sentenceId,
417
+ text: candidate.sentence.text
418
+ })),
419
+ code: failure.code,
420
+ fieldName: "evidence",
421
+ message: failure.message
422
+ };
423
+ }
424
+ function formatTaggedContext(window) {
425
+ const mentions = [...window.mentions].sort(
426
+ (left, right) => left.range.start - right.range.start
427
+ );
428
+ const parts = [];
429
+ let cursor = window.range.start;
430
+ for (const mention of mentions) {
431
+ parts.push(
432
+ escapeXmlText(
433
+ window.text.slice(
434
+ cursor - window.range.start,
435
+ mention.range.start - window.range.start
436
+ )
437
+ )
438
+ );
439
+ parts.push(
440
+ `<mention id="${escapeXmlAttribute(mention.id)}" qid="${escapeXmlAttribute(
441
+ mention.qid ?? ""
442
+ )}">${escapeXmlText(
443
+ window.text.slice(
444
+ mention.range.start - window.range.start,
445
+ mention.range.end - window.range.start
446
+ )
447
+ )}</mention>`
448
+ );
449
+ cursor = mention.range.end;
450
+ }
451
+ parts.push(escapeXmlText(window.text.slice(cursor - window.range.start)));
452
+ return parts.join("");
453
+ }
454
+ function buildSentenceOffsets(sentences) {
455
+ const offsets = [];
456
+ let cursor = 0;
457
+ for (const sentence of sentences) {
458
+ const start = cursor;
459
+ const end = start + sentence.text.length;
460
+ offsets.push({ end, start });
461
+ cursor = end + 1;
462
+ }
463
+ return offsets;
464
+ }
465
+ function normalizePredicate(predicate) {
466
+ return predicate.trim().replace(/[\s-]+/gu, "_").replace(/_+/gu, "_").replace(/^_+|_+$/gu, "").toLowerCase();
467
+ }
468
+ function escapeXmlAttribute(value) {
469
+ return escapeXmlText(value).replaceAll('"', "&quot;");
470
+ }
471
+ function escapeXmlText(value) {
472
+ return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
473
+ }
474
+ export {
475
+ discoverWikilinkRelations
476
+ };
477
+ //# sourceMappingURL=relation-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/wikilink/relation-discovery.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\";\nimport {\n EVIDENCE_SELECTION_JSON_SHAPE,\n EVIDENCE_SELECTION_PROMPT_FRAGMENT,\n EvidenceResolver,\n normalizeEvidenceDisplayText,\n resolveEvidenceSelectionList,\n type EvidenceSelectionCandidate,\n type EvidenceSelectionList,\n type EvidenceSelectionSentence,\n type EvidenceResolutionFailure,\n} from \"../evidence-selection/index.js\";\nimport { FragmentProjection } from \"../reader/chunk-batch/index.js\";\nimport type { SentenceId } from \"../document/index.js\";\n\nimport type { WikilinkEvidenceWindow, WikilinkMention } from \"./types.js\";\n\nexport interface WikilinkSentence {\n readonly text: string;\n readonly wordsCount: number;\n}\n\nexport interface WikilinkDiscoveredRelation {\n readonly confidence?: number;\n readonly evidenceSentenceIds: readonly SentenceId[];\n readonly predicate: string;\n readonly sourceMentionId: string;\n readonly targetMentionId: string;\n}\n\nexport interface DiscoverWikilinkRelationsOptions {\n readonly chapterId: number;\n readonly fragmentId?: number;\n readonly maxRetries?: number;\n readonly request: GuaranteedRequest;\n readonly sentences: readonly WikilinkSentence[];\n readonly window: WikilinkEvidenceWindow;\n}\n\nconst evidenceAnchorSchema = z\n .object({\n head: z.string().optional(),\n mode: z.enum([\"full\", \"head_tail\"]).optional(),\n tail: z.string().optional(),\n text: z.string().optional(),\n })\n .strict();\nconst evidenceSelectionItemSchema = z\n .object({\n quote: z.string().optional(),\n sentence_id: z.string().optional(),\n })\n .strict();\nconst relationEvidenceSchema = z.union([\n z\n .object({\n end_anchor: z.union([z.string(), evidenceAnchorSchema]).optional(),\n quote: z.string().optional(),\n sentence_id: z.string().optional(),\n start_anchor: z.union([z.string(), evidenceAnchorSchema]).optional(),\n })\n .strict(),\n z.array(evidenceSelectionItemSchema),\n]);\n\nconst relationSchema = z\n .object({\n confidence: z.number().min(0).max(1).optional(),\n evidence: relationEvidenceSchema,\n predicate: z.string().min(1).max(64),\n sourceMentionId: z.string().min(1),\n targetMentionId: z.string().min(1),\n })\n .strict();\n\nconst relationResponseSchema = z\n .object({\n relations: z.array(relationSchema),\n })\n .strict();\n\ntype RelationEvidenceData = z.infer<typeof relationEvidenceSchema>;\n\nconst SUGGESTED_PREDICATES = [\n \"instance_of\",\n \"subclass_of\",\n \"part_of\",\n \"has_part\",\n \"located_in\",\n \"contains\",\n \"member_of\",\n \"owned_by\",\n \"creator\",\n \"author\",\n \"developer\",\n \"founded_by\",\n \"leader\",\n \"position_held\",\n \"employer\",\n \"educated_at\",\n \"student_of\",\n \"parent\",\n \"child\",\n \"spouse\",\n \"sibling\",\n \"relative\",\n \"replaces\",\n \"replaced_by\",\n \"precedes\",\n \"follows\",\n \"influenced_by\",\n \"influences\",\n \"participant_in\",\n \"participant\",\n \"conflict\",\n \"opposes\",\n \"allied_with\",\n \"supports\",\n \"causes\",\n \"caused_by\",\n \"results_in\",\n \"has_effect\",\n \"uses\",\n \"used_by\",\n \"applies_to\",\n \"based_on\",\n \"derived_from\",\n \"depicts\",\n \"named_after\",\n \"has_characteristic\",\n \"related_to\",\n \"associated_with\",\n \"connected_to\",\n \"corresponds_to\",\n \"main_subject\",\n \"about\",\n \"context_for\",\n \"described_as\",\n \"refers_to\",\n \"concerns\",\n \"discusses\",\n \"compares_with\",\n \"overlaps_with\",\n \"coexists_with\",\n \"parallel_to\",\n \"analogous_to\",\n \"mentioned_with\",\n \"points_to\",\n \"interpreted_as\",\n \"seen_as\",\n \"different_from\",\n \"distinct_from\",\n \"not_same_as\",\n \"not_to_be_confused_with\",\n \"contrasts_with\",\n \"opposite_of\",\n \"conflicts_with\",\n \"contradicts\",\n \"excludes\",\n \"incompatible_with\",\n \"rejects\",\n \"criticizes\",\n \"denies\",\n \"not_reducible_to\",\n] as const;\n\nconst resolver = new EvidenceResolver();\n\nexport async function discoverWikilinkRelations(\n options: DiscoverWikilinkRelationsOptions,\n): Promise<readonly WikilinkDiscoveredRelation[]> {\n if (options.window.mentions.length < 2) {\n return [];\n }\n\n try {\n return await requestGuaranteedJson({\n messages: buildRelationMessages(options),\n parse: (response) => parseRelationResponse(options, response),\n request: options.request,\n responseIntentClassifierPrompt:\n RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,\n schema: relationResponseSchema,\n ...(options.maxRetries === undefined\n ? {}\n : { maxRetries: options.maxRetries }),\n });\n } catch {\n return [];\n }\n}\n\nfunction parseRelationResponse(\n options: DiscoverWikilinkRelationsOptions,\n response: z.infer<typeof relationResponseSchema>,\n): readonly WikilinkDiscoveredRelation[] {\n const mentionsById = new Map(\n options.window.mentions.map((mention) => [mention.id, mention]),\n );\n const projection = new FragmentProjection(\n options.sentences.map((sentence, index) => ({\n sentenceId: [options.chapterId, (options.fragmentId ?? 0) + index],\n text: sentence.text,\n wordsCount: sentence.wordsCount,\n })),\n );\n const sentenceOffsets = buildSentenceOffsets(options.sentences);\n const evidenceSentences = projection.sentences.flatMap(\n (sentence, sentenceIndex) => {\n const offset = sentenceOffsets[sentenceIndex];\n\n if (\n offset === undefined ||\n !rangesOverlap(offset, options.window.range)\n ) {\n return [];\n }\n\n return [\n {\n id: `S${sentenceIndex + 1}`,\n sentenceId: sentence.sentenceId,\n text: sentence.projectedText,\n },\n ];\n },\n );\n const issues: string[] = [];\n const links: WikilinkDiscoveredRelation[] = [];\n const seenKeys = new Set<string>();\n const sentenceIds = evidenceSentences.map((sentence) => sentence.sentenceId);\n const sentenceTexts = evidenceSentences.map((sentence) => sentence.text);\n\n for (const [index, relation] of response.relations.entries()) {\n const prefix = `relations[${index}]`;\n const source = mentionsById.get(relation.sourceMentionId);\n const target = mentionsById.get(relation.targetMentionId);\n\n if (source === undefined) {\n issues.push(`${prefix}.sourceMentionId references an unknown mention.`);\n continue;\n }\n if (target === undefined) {\n issues.push(`${prefix}.targetMentionId references an unknown mention.`);\n continue;\n }\n if (source.id === target.id) {\n issues.push(\n `${prefix} links a mention to itself. ` +\n \"Use two different tagged mention IDs, or remove the relation if the other endpoint is not tagged.\",\n );\n continue;\n }\n\n const predicate = normalizePredicate(relation.predicate);\n\n if (predicate === \"\") {\n issues.push(`${prefix}.predicate normalizes to an empty label.`);\n continue;\n }\n\n if (predicate === \"mentions\") {\n issues.push(\n `${prefix}.predicate must be semantic; \"mentions\" is not a relation predicate.`,\n );\n continue;\n }\n\n const [selectionResolution, selectionFailure] = resolveRelationEvidence({\n evidence: createRelationEvidenceSelection(relation.evidence),\n sentences: evidenceSentences,\n });\n const [anchorResolution, anchorFailure] =\n !Array.isArray(relation.evidence) &&\n selectionResolution === undefined &&\n selectionFailure === undefined\n ? resolver.resolve(relation.evidence, sentenceIds, sentenceTexts)\n : [undefined, undefined];\n const effectiveResolution = selectionResolution ?? anchorResolution;\n const effectiveFailure =\n selectionFailure === undefined\n ? anchorFailure\n : toEvidenceResolutionFailure(selectionFailure);\n\n if (effectiveResolution === undefined) {\n issues.push(\n `${prefix}.evidence could not be resolved: ${\n effectiveFailure?.message ?? \"unknown failure\"\n }`,\n );\n continue;\n }\n\n const evidenceSentenceIds = dedupeSentenceIds(\n effectiveResolution.sentenceIds,\n );\n\n if (evidenceSentenceIds.length === 0) {\n issues.push(`${prefix}.evidence resolved to no sentences.`);\n continue;\n }\n\n if (\n evidenceSentenceIds.some(\n ([chapterId, sentenceIndex]) =>\n chapterId !== options.chapterId ||\n sentenceOffsets[sentenceIndex - (options.fragmentId ?? 0)] ===\n undefined,\n )\n ) {\n issues.push(`${prefix}.evidence resolved outside this fragment.`);\n continue;\n }\n\n const key = `${source.id}\\0${target.id}\\0${predicate}\\0${evidenceSentenceIds.map((sentenceId) => sentenceId.join(\":\")).join(\",\")}`;\n\n if (seenKeys.has(key)) {\n continue;\n }\n seenKeys.add(key);\n\n links.push({\n ...(relation.confidence === undefined\n ? {}\n : { confidence: relation.confidence }),\n evidenceSentenceIds,\n predicate,\n sourceMentionId: source.id,\n targetMentionId: target.id,\n });\n }\n\n if (issues.length > 0) {\n throw new ParsedJsonError(issues);\n }\n\n return links;\n}\n\nfunction dedupeSentenceIds(\n sentenceIds: readonly SentenceId[],\n): readonly SentenceId[] {\n const seen = new Set<string>();\n const deduped: SentenceId[] = [];\n\n for (const sentenceId of sentenceIds) {\n const key = sentenceId.join(\":\");\n\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n deduped.push(sentenceId);\n }\n\n return deduped.sort(\n ([leftChapter, leftSentence], [rightChapter, rightSentence]) =>\n leftChapter - rightChapter || leftSentence - rightSentence,\n );\n}\n\nfunction buildRelationMessages(\n input: DiscoverWikilinkRelationsOptions,\n): LLMessage[] {\n return [\n {\n content: formatRelationSystemPrompt(),\n role: \"system\",\n },\n {\n content: formatRelationUserPrompt(input),\n role: \"user\",\n },\n ];\n}\n\nfunction formatRelationSystemPrompt(): string {\n return [\n \"You discover semantic relations between grounded entity mentions in source text.\",\n \"\",\n \"Rules:\",\n \"- Return JSON only.\",\n \"- Return only relations that are directly supported by the source text.\",\n '- Every relation must connect two mention IDs from the <mention id=\"...\" qid=\"...\"> tags.',\n \"- A relation is valid only when both endpoints are explicitly tagged mentions in the source context.\",\n \"- If a supported relation would require a subject or object that is not tagged with a mention ID, skip that relation.\",\n \"- Do not invent mention IDs, and do not reuse another mention as a placeholder for an untagged endpoint.\",\n \"- sourceMentionId and targetMentionId must be different mention IDs; never link a mention to itself.\",\n \"- Do not create a relation just because two mentions are nearby.\",\n \"- If the text explicitly states both a positive relation and a negated/distinction relation between mentions, return both relations when both are directly supported.\",\n \"- Prefer the suggested predicates when one fits.\",\n \"- If none fits, create one short snake_case predicate.\",\n \"- Never use mentions as a predicate.\",\n EVIDENCE_SELECTION_PROMPT_FRAGMENT,\n \"- Source sentences may contain XML-like mention tags. Use those tags for mention IDs, but ignore the tags when copying evidence quote text.\",\n \"- Do not use offsets or invented paraphrases as evidence.\",\n \"\",\n \"Suggested predicates:\",\n SUGGESTED_PREDICATES.join(\", \"),\n ].join(\"\\n\");\n}\n\nfunction formatRelationUserPrompt(\n input: DiscoverWikilinkRelationsOptions,\n): string {\n return [\n \"Source sentences with mention tags:\",\n formatTaggedEvidenceSentences(input),\n \"\",\n \"Return this JSON shape:\",\n JSON.stringify(\n {\n relations: [\n {\n confidence: 0.86,\n evidence: EVIDENCE_SELECTION_JSON_SHAPE,\n predicate: \"predicate_name\",\n sourceMentionId: \"source mention id\",\n targetMentionId: \"target mention id\",\n },\n ],\n },\n null,\n 2,\n ),\n \"\",\n \"If the source text does not support any semantic relation, return:\",\n JSON.stringify({ relations: [] }),\n ].join(\"\\n\");\n}\n\nfunction formatTaggedEvidenceSentences(\n input: DiscoverWikilinkRelationsOptions,\n): string {\n const sourceOffsets = buildSentenceOffsets(input.sentences);\n const lines = input.sentences.flatMap((sentence, index) => {\n const offset = sourceOffsets[index];\n\n if (offset === undefined || !rangesOverlap(offset, input.window.range)) {\n return [];\n }\n\n return [\n `S${index + 1}: ${normalizeEvidenceDisplayText(\n formatTaggedSentence({\n mentions: input.window.mentions,\n sentence,\n sentenceOffset: offset,\n }),\n )}`,\n ];\n });\n\n return lines.length === 0\n ? formatTaggedContext(input.window)\n : lines.join(\"\\n\");\n}\n\nfunction formatTaggedSentence(input: {\n readonly mentions: readonly WikilinkMention[];\n readonly sentence: WikilinkSentence;\n readonly sentenceOffset: { readonly end: number; readonly start: number };\n}): string {\n const mentions = input.mentions\n .filter(\n (mention) =>\n mention.range.start >= input.sentenceOffset.start &&\n mention.range.end <= input.sentenceOffset.end,\n )\n .sort((left, right) => left.range.start - right.range.start);\n const parts: string[] = [];\n let cursor = input.sentenceOffset.start;\n\n for (const mention of mentions) {\n parts.push(\n escapeXmlText(\n input.sentence.text.slice(\n cursor - input.sentenceOffset.start,\n mention.range.start - input.sentenceOffset.start,\n ),\n ),\n );\n parts.push(\n `<mention id=\"${escapeXmlAttribute(mention.id)}\" qid=\"${escapeXmlAttribute(\n mention.qid ?? \"\",\n )}\">${escapeXmlText(\n input.sentence.text.slice(\n mention.range.start - input.sentenceOffset.start,\n mention.range.end - input.sentenceOffset.start,\n ),\n )}</mention>`,\n );\n cursor = mention.range.end;\n }\n\n parts.push(\n escapeXmlText(\n input.sentence.text.slice(cursor - input.sentenceOffset.start),\n ),\n );\n\n return parts.join(\"\");\n}\n\nfunction rangesOverlap(\n left: { readonly end: number; readonly start: number },\n right: { readonly end: number; readonly start: number },\n): boolean {\n return left.start < right.end && right.start < left.end;\n}\n\nfunction resolveRelationEvidence(input: {\n readonly evidence: EvidenceSelectionList | undefined;\n readonly sentences: readonly EvidenceSelectionSentence[];\n}): readonly [\n resolution:\n | {\n readonly sentenceIds: readonly (readonly [number, number])[];\n }\n | undefined,\n failure:\n | {\n readonly candidates: readonly EvidenceSelectionCandidate[];\n readonly code: string;\n readonly message: string;\n }\n | undefined,\n] {\n if (input.evidence === undefined) {\n return [undefined, undefined];\n }\n\n return resolveEvidenceSelectionList({\n evidence: input.evidence,\n sentences: input.sentences,\n });\n}\n\nfunction createRelationEvidenceSelection(\n evidence: RelationEvidenceData,\n): EvidenceSelectionList | undefined {\n if (Array.isArray(evidence)) {\n return evidence.map(createRelationEvidenceSelectionItem);\n }\n\n const hasSelectionEvidence =\n typeof evidence.quote === \"string\" ||\n typeof evidence.sentence_id === \"string\";\n\n return hasSelectionEvidence\n ? createRelationEvidenceSelectionItem(evidence)\n : undefined;\n}\n\nfunction createRelationEvidenceSelectionItem(evidence: {\n readonly quote?: unknown;\n readonly sentence_id?: unknown;\n}): {\n readonly quote?: string;\n readonly sentence_id?: string;\n} {\n return {\n ...(typeof evidence.quote === \"string\" ? { quote: evidence.quote } : {}),\n ...(typeof evidence.sentence_id === \"string\"\n ? { sentence_id: evidence.sentence_id }\n : {}),\n };\n}\n\nfunction toEvidenceResolutionFailure(failure: {\n readonly candidates: readonly EvidenceSelectionCandidate[];\n readonly code: string;\n readonly message: string;\n}): EvidenceResolutionFailure {\n return {\n candidates: failure.candidates.map((candidate) => ({\n exactNormalized: candidate.exactNormalized,\n exactRaw: candidate.exactRaw,\n exactSubstring: candidate.exactSubstring,\n index: candidate.index,\n nextText: candidate.nextText,\n occurrenceId: candidate.occurrenceId,\n prevText: candidate.prevText,\n score: candidate.score,\n sentenceId: candidate.sentence.sentenceId,\n text: candidate.sentence.text,\n })),\n code: failure.code,\n fieldName: \"evidence\",\n message: failure.message,\n };\n}\n\nfunction formatTaggedContext(window: WikilinkEvidenceWindow): string {\n const mentions = [...window.mentions].sort(\n (left, right) => left.range.start - right.range.start,\n );\n const parts: string[] = [];\n let cursor = window.range.start;\n\n for (const mention of mentions) {\n parts.push(\n escapeXmlText(\n window.text.slice(\n cursor - window.range.start,\n mention.range.start - window.range.start,\n ),\n ),\n );\n parts.push(\n `<mention id=\"${escapeXmlAttribute(mention.id)}\" qid=\"${escapeXmlAttribute(\n mention.qid ?? \"\",\n )}\">${escapeXmlText(\n window.text.slice(\n mention.range.start - window.range.start,\n mention.range.end - window.range.start,\n ),\n )}</mention>`,\n );\n cursor = mention.range.end;\n }\n\n parts.push(escapeXmlText(window.text.slice(cursor - window.range.start)));\n\n return parts.join(\"\");\n}\n\nfunction buildSentenceOffsets(\n sentences: readonly WikilinkSentence[],\n): ReadonlyArray<{ readonly end: number; readonly start: number }> {\n const offsets: Array<{ readonly end: number; readonly start: number }> = [];\n let cursor = 0;\n\n for (const sentence of sentences) {\n const start = cursor;\n const end = start + sentence.text.length;\n\n offsets.push({ end, start });\n cursor = end + 1;\n }\n\n return offsets;\n}\n\nfunction normalizePredicate(predicate: string): string {\n return predicate\n .trim()\n .replace(/[\\s-]+/gu, \"_\")\n .replace(/_+/gu, \"_\")\n .replace(/^_+|_+$/gu, \"\")\n .toLowerCase();\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXmlText(value).replaceAll('\"', \"&quot;\");\n}\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ import { WikimatchTextRange } from '../wikimatch/types.js';
2
+ import '../wikipage/types.js';
3
+
4
+ interface WikilinkMention {
5
+ readonly id: string;
6
+ readonly qid?: string;
7
+ readonly range: WikimatchTextRange;
8
+ readonly surface?: string;
9
+ }
10
+ interface WikilinkEvidenceWindow {
11
+ readonly baseOffset: number;
12
+ readonly mentions: readonly WikilinkMention[];
13
+ readonly range: WikimatchTextRange;
14
+ readonly text: string;
15
+ }
16
+ interface BuildWikilinkEvidenceWindowsOptions {
17
+ readonly maxEvidenceDistance: number;
18
+ readonly mentions: readonly WikilinkMention[];
19
+ readonly text: string;
20
+ readonly windowLength: number;
21
+ }
22
+
23
+ export type { BuildWikilinkEvidenceWindowsOptions, WikilinkEvidenceWindow, WikilinkMention };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,7 @@
1
+ import { BuildWikilinkEvidenceWindowsOptions, WikilinkEvidenceWindow } from './types.js';
2
+ import '../wikimatch/types.js';
3
+ import '../wikipage/types.js';
4
+
5
+ declare function buildWikilinkEvidenceWindows(options: BuildWikilinkEvidenceWindowsOptions): readonly WikilinkEvidenceWindow[];
6
+
7
+ export { buildWikilinkEvidenceWindows };
@@ -0,0 +1,53 @@
1
+ function buildWikilinkEvidenceWindows(options) {
2
+ validateOptions(options);
3
+ const mentions = normalizeMentions(options.mentions);
4
+ if (mentions.length === 0 || options.text.length === 0) {
5
+ return [];
6
+ }
7
+ const stride = options.windowLength - options.maxEvidenceDistance;
8
+ const windows = [];
9
+ for (let start = 0; start < options.text.length; start = nextWindowStart(start, stride, options.text.length)) {
10
+ const end = Math.min(start + options.windowLength, options.text.length);
11
+ const windowMentions = mentions.filter(
12
+ (mention) => mention.range.start >= start && mention.range.end <= end
13
+ );
14
+ if (windowMentions.length >= 2) {
15
+ windows.push({
16
+ baseOffset: start,
17
+ mentions: windowMentions,
18
+ range: { end, start },
19
+ text: options.text.slice(start, end)
20
+ });
21
+ }
22
+ if (end >= options.text.length) {
23
+ break;
24
+ }
25
+ }
26
+ return windows;
27
+ }
28
+ function nextWindowStart(current, stride, textLength) {
29
+ return Math.min(current + stride, textLength);
30
+ }
31
+ function validateOptions(options) {
32
+ if (!Number.isInteger(options.windowLength) || options.windowLength <= 0) {
33
+ throw new Error("windowLength must be a positive integer.");
34
+ }
35
+ if (!Number.isInteger(options.maxEvidenceDistance) || options.maxEvidenceDistance <= 0) {
36
+ throw new Error("maxEvidenceDistance must be a positive integer.");
37
+ }
38
+ if (options.windowLength <= options.maxEvidenceDistance) {
39
+ throw new Error(
40
+ "windowLength must be greater than maxEvidenceDistance so eligible mention pairs are guaranteed to share at least one evidence window."
41
+ );
42
+ }
43
+ }
44
+ function normalizeMentions(mentions) {
45
+ return mentions.filter((mention) => mention.range.start < mention.range.end).sort(compareMention);
46
+ }
47
+ function compareMention(left, right) {
48
+ return left.range.start - right.range.start || left.range.end - right.range.end || left.id.localeCompare(right.id);
49
+ }
50
+ export {
51
+ buildWikilinkEvidenceWindows
52
+ };
53
+ //# sourceMappingURL=window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/wikilink/window.ts"],"sourcesContent":["import type {\n BuildWikilinkEvidenceWindowsOptions,\n WikilinkEvidenceWindow,\n WikilinkMention,\n} from \"./types.js\";\n\nexport function buildWikilinkEvidenceWindows(\n options: BuildWikilinkEvidenceWindowsOptions,\n): readonly WikilinkEvidenceWindow[] {\n validateOptions(options);\n\n const mentions = normalizeMentions(options.mentions);\n\n if (mentions.length === 0 || options.text.length === 0) {\n return [];\n }\n\n const stride = options.windowLength - options.maxEvidenceDistance;\n const windows: WikilinkEvidenceWindow[] = [];\n\n for (\n let start = 0;\n start < options.text.length;\n start = nextWindowStart(start, stride, options.text.length)\n ) {\n const end = Math.min(start + options.windowLength, options.text.length);\n const windowMentions = mentions.filter(\n (mention) => mention.range.start >= start && mention.range.end <= end,\n );\n\n if (windowMentions.length >= 2) {\n windows.push({\n baseOffset: start,\n mentions: windowMentions,\n range: { end, start },\n text: options.text.slice(start, end),\n });\n }\n if (end >= options.text.length) {\n break;\n }\n }\n\n return windows;\n}\n\nfunction nextWindowStart(\n current: number,\n stride: number,\n textLength: number,\n): number {\n return Math.min(current + stride, textLength);\n}\n\nfunction validateOptions(options: BuildWikilinkEvidenceWindowsOptions): void {\n if (!Number.isInteger(options.windowLength) || options.windowLength <= 0) {\n throw new Error(\"windowLength must be a positive integer.\");\n }\n if (\n !Number.isInteger(options.maxEvidenceDistance) ||\n options.maxEvidenceDistance <= 0\n ) {\n throw new Error(\"maxEvidenceDistance must be a positive integer.\");\n }\n if (options.windowLength <= options.maxEvidenceDistance) {\n throw new Error(\n \"windowLength must be greater than maxEvidenceDistance so eligible mention pairs are guaranteed to share at least one evidence window.\",\n );\n }\n}\n\nfunction normalizeMentions(\n mentions: readonly WikilinkMention[],\n): readonly WikilinkMention[] {\n return mentions\n .filter((mention) => mention.range.start < mention.range.end)\n .sort(compareMention);\n}\n\nfunction compareMention(left: WikilinkMention, right: WikilinkMention): number {\n return (\n left.range.start - right.range.start ||\n left.range.end - right.range.end ||\n left.id.localeCompare(right.id)\n );\n}\n"],"mappings":"AAMO,SAAS,6BACd,SACmC;AACnC,kBAAgB,OAAO;AAEvB,QAAM,WAAW,kBAAkB,QAAQ,QAAQ;AAEnD,MAAI,SAAS,WAAW,KAAK,QAAQ,KAAK,WAAW,GAAG;AACtD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,QAAQ,eAAe,QAAQ;AAC9C,QAAM,UAAoC,CAAC;AAE3C,WACM,QAAQ,GACZ,QAAQ,QAAQ,KAAK,QACrB,QAAQ,gBAAgB,OAAO,QAAQ,QAAQ,KAAK,MAAM,GAC1D;AACA,UAAM,MAAM,KAAK,IAAI,QAAQ,QAAQ,cAAc,QAAQ,KAAK,MAAM;AACtE,UAAM,iBAAiB,SAAS;AAAA,MAC9B,CAAC,YAAY,QAAQ,MAAM,SAAS,SAAS,QAAQ,MAAM,OAAO;AAAA,IACpE;AAEA,QAAI,eAAe,UAAU,GAAG;AAC9B,cAAQ,KAAK;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO,EAAE,KAAK,MAAM;AAAA,QACpB,MAAM,QAAQ,KAAK,MAAM,OAAO,GAAG;AAAA,MACrC,CAAC;AAAA,IACH;AACA,QAAI,OAAO,QAAQ,KAAK,QAAQ;AAC9B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,SACA,QACA,YACQ;AACR,SAAO,KAAK,IAAI,UAAU,QAAQ,UAAU;AAC9C;AAEA,SAAS,gBAAgB,SAAoD;AAC3E,MAAI,CAAC,OAAO,UAAU,QAAQ,YAAY,KAAK,QAAQ,gBAAgB,GAAG;AACxE,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACA,MACE,CAAC,OAAO,UAAU,QAAQ,mBAAmB,KAC7C,QAAQ,uBAAuB,GAC/B;AACA,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,MAAI,QAAQ,gBAAgB,QAAQ,qBAAqB;AACvD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBACP,UAC4B;AAC5B,SAAO,SACJ,OAAO,CAAC,YAAY,QAAQ,MAAM,QAAQ,QAAQ,MAAM,GAAG,EAC3D,KAAK,cAAc;AACxB;AAEA,SAAS,eAAe,MAAuB,OAAgC;AAC7E,SACE,KAAK,MAAM,QAAQ,MAAM,MAAM,SAC/B,KAAK,MAAM,MAAM,MAAM,MAAM,OAC7B,KAAK,GAAG,cAAc,MAAM,EAAE;AAElC;","names":[]}
@@ -0,0 +1,10 @@
1
+ import { QidResolution, WikipageResolveProgressReporter, WikipageResolverOptions } from '../wikipage/types.js';
2
+ import { WikimatchCandidate } from './types.js';
3
+
4
+ declare function enrichWikimatchCandidates(candidates: readonly WikimatchCandidate[], options?: {
5
+ readonly progress?: WikipageResolveProgressReporter;
6
+ readonly resolverOptions?: Omit<WikipageResolverOptions, "progress">;
7
+ }): Promise<readonly WikimatchCandidate[]>;
8
+ declare function applyQidResolutions(candidates: readonly WikimatchCandidate[], resolutions: readonly QidResolution[]): readonly WikimatchCandidate[];
9
+
10
+ export { applyQidResolutions, enrichWikimatchCandidates };