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,430 @@
1
+ import { z } from "zod";
2
+ import {
3
+ ParsedJsonError,
4
+ RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,
5
+ requestGuaranteedJson
6
+ } from "../guaranteed/index.js";
7
+ import { listCandidateSelectableQids } from "./options.js";
8
+ const policyDecisionSchema = z.object({
9
+ candidateId: z.string().min(1),
10
+ decision: z.enum(["continue", "recall", "skip_this_time", "never_recall"]),
11
+ qid: z.string().nullable().optional()
12
+ }).strict();
13
+ const policyGroupSchema = z.object({
14
+ decisions: z.array(policyDecisionSchema),
15
+ groupId: z.string().min(1)
16
+ }).strict();
17
+ const policyResponseSchema = z.object({
18
+ groups: z.array(policyGroupSchema)
19
+ }).strict();
20
+ async function judgeWikimatchPolicy(options) {
21
+ try {
22
+ return await requestGuaranteedJson({
23
+ messages: buildPolicyMessages(options),
24
+ parse: (response) => parsePolicyResponse(
25
+ options.candidates,
26
+ normalizePolicyResponse(response),
27
+ options.window.groups
28
+ ),
29
+ request: options.request,
30
+ responseIntentClassifierPrompt: RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,
31
+ schema: policyResponseSchema,
32
+ ...options.maxRetries === void 0 ? {} : { maxRetries: options.maxRetries }
33
+ });
34
+ } catch (error) {
35
+ return {
36
+ continuations: [],
37
+ fallback: {
38
+ issues: [formatFallbackIssue(error)],
39
+ reason: "guaranteed_json_failed"
40
+ },
41
+ mentions: [],
42
+ policyUpdates: []
43
+ };
44
+ }
45
+ }
46
+ function normalizePolicyResponse(response) {
47
+ return {
48
+ groups: response.groups.map((group) => ({
49
+ decisions: group.decisions.map((decision) => ({
50
+ candidateId: decision.candidateId,
51
+ decision: decision.decision,
52
+ ...normalizeDecisionQid(decision.qid)
53
+ })),
54
+ groupId: group.groupId
55
+ }))
56
+ };
57
+ }
58
+ function normalizeDecisionQid(qid) {
59
+ const normalized = qid?.trim();
60
+ return normalized === void 0 || normalized === "" ? {} : { qid: normalized };
61
+ }
62
+ function parsePolicyResponse(candidates, response, groups = inferGroups(candidates)) {
63
+ const issues = validatePolicyResponse(candidates, response, groups);
64
+ if (issues.length > 0) {
65
+ throw new ParsedJsonError(issues);
66
+ }
67
+ const candidatesById = createCandidateMap(candidates);
68
+ const continuations = [];
69
+ const mentions = [];
70
+ const policyUpdates = [];
71
+ for (const group of response.groups) {
72
+ const continuedCandidateIds = [];
73
+ for (const decision of group.decisions) {
74
+ const candidate = candidatesById.get(decision.candidateId);
75
+ if (decision.decision === "continue") {
76
+ if (candidate.hasMoreOptions !== true) {
77
+ policyUpdates.push({
78
+ candidateId: candidate.id,
79
+ decision: "skip_this_time",
80
+ surface: candidate.surface
81
+ });
82
+ continue;
83
+ }
84
+ continuedCandidateIds.push(candidate.id);
85
+ continue;
86
+ }
87
+ if (decision.decision === "recall") {
88
+ mentions.push({
89
+ candidateId: candidate.id,
90
+ qid: decision.qid,
91
+ range: candidate.range,
92
+ surface: candidate.surface
93
+ });
94
+ continue;
95
+ }
96
+ policyUpdates.push({
97
+ candidateId: candidate.id,
98
+ decision: decision.decision,
99
+ ...decision.qid === void 0 ? {} : { qid: decision.qid },
100
+ surface: candidate.surface
101
+ });
102
+ }
103
+ if (continuedCandidateIds.length > 0) {
104
+ continuations.push({
105
+ candidateIds: continuedCandidateIds,
106
+ groupId: group.groupId
107
+ });
108
+ }
109
+ }
110
+ return {
111
+ continuations,
112
+ mentions,
113
+ policyUpdates
114
+ };
115
+ }
116
+ function validatePolicyResponse(candidates, response, groups = inferGroups(candidates)) {
117
+ const issues = [];
118
+ const candidatesById = createCandidateMap(candidates);
119
+ const groupsById = createGroupMap(groups);
120
+ const seenGroupIds = /* @__PURE__ */ new Set();
121
+ const seenCandidateIds = /* @__PURE__ */ new Set();
122
+ const recalled = [];
123
+ for (const group of response.groups) {
124
+ const expectedCandidateIds = groupsById.get(group.groupId);
125
+ if (expectedCandidateIds === void 0) {
126
+ issues.push(
127
+ `Unknown groupId "${group.groupId}". Use exactly these group IDs: ${[
128
+ ...groupsById.keys()
129
+ ].join(", ")}.`
130
+ );
131
+ continue;
132
+ }
133
+ if (seenGroupIds.has(group.groupId)) {
134
+ issues.push(`Duplicate group result for ${group.groupId}.`);
135
+ continue;
136
+ }
137
+ seenGroupIds.add(group.groupId);
138
+ for (const decision of group.decisions) {
139
+ const candidate = candidatesById.get(decision.candidateId);
140
+ if (candidate === void 0) {
141
+ issues.push(
142
+ `Unknown candidateId "${decision.candidateId}". Use only one of: ${[
143
+ ...candidatesById.keys()
144
+ ].join(", ")}.`
145
+ );
146
+ continue;
147
+ }
148
+ if (!expectedCandidateIds.has(decision.candidateId)) {
149
+ issues.push(
150
+ `Candidate ${decision.candidateId} does not belong to group ${group.groupId}. Use only candidates from that group: ${[
151
+ ...expectedCandidateIds
152
+ ].join(", ")}.`
153
+ );
154
+ continue;
155
+ }
156
+ if (seenCandidateIds.has(decision.candidateId)) {
157
+ issues.push(
158
+ `Duplicate decision for candidate ${decision.candidateId}. Return exactly one decision per candidate at most.`
159
+ );
160
+ continue;
161
+ }
162
+ seenCandidateIds.add(decision.candidateId);
163
+ if (decision.decision === "recall") {
164
+ validateRecallDecision(issues, candidate, decision);
165
+ recalled.push({ candidate, decision });
166
+ continue;
167
+ }
168
+ if (decision.decision === "continue") {
169
+ if (decision.qid !== void 0) {
170
+ issues.push(
171
+ `Candidate ${candidate.id} uses decision "continue" but includes qid. Continue means this candidate page has no final choice yet.`
172
+ );
173
+ }
174
+ continue;
175
+ }
176
+ if (decision.qid !== void 0) {
177
+ issues.push(
178
+ `Candidate ${candidate.id} uses decision "${decision.decision}" but includes qid. Include qid only when decision is "recall".`
179
+ );
180
+ }
181
+ }
182
+ }
183
+ for (const groupId of groupsById.keys()) {
184
+ if (!seenGroupIds.has(groupId)) {
185
+ issues.push(
186
+ `Missing group result for ${groupId}. Return exactly one result for every input group; use decisions: [] when nothing should be recalled.`
187
+ );
188
+ }
189
+ }
190
+ for (let leftIndex = 0; leftIndex < recalled.length; leftIndex += 1) {
191
+ for (let rightIndex = leftIndex + 1; rightIndex < recalled.length; rightIndex += 1) {
192
+ const left = recalled[leftIndex];
193
+ const right = recalled[rightIndex];
194
+ if (rangesOverlap(left.candidate.range, right.candidate.range)) {
195
+ issues.push(
196
+ `Decision conflict: candidates ${left.candidate.id} and ${right.candidate.id} both use decision "recall", but their ranges overlap.
197
+ - ${left.candidate.id}: "${left.candidate.surface}" [${left.candidate.range.start}, ${left.candidate.range.end})
198
+ - ${right.candidate.id}: "${right.candidate.surface}" [${right.candidate.range.start}, ${right.candidate.range.end})
199
+ Only one recalled mention may occupy an overlapping text range. Choose the most specific valid mention, or mark the others as skip_this_time / never_recall.`
200
+ );
201
+ }
202
+ }
203
+ }
204
+ return issues;
205
+ }
206
+ function validateRecallDecision(issues, candidate, decision) {
207
+ if (decision.qid === void 0) {
208
+ issues.push(
209
+ `Candidate ${candidate.id} uses decision "recall" but does not provide qid. A recalled mention must choose one concrete QID from the candidate options.`
210
+ );
211
+ return;
212
+ }
213
+ if (isDisambiguationQid(candidate, decision.qid)) {
214
+ issues.push(
215
+ `Candidate ${candidate.id} selected source disambiguation QID ${decision.qid}. Source disambiguation QIDs are hidden behind DIS references and cannot be final mention groundings. Choose a QID from entityOptions or disambiguationOptions.meanings instead.`
216
+ );
217
+ return;
218
+ }
219
+ if (!isAllowedQid(candidate, decision.qid)) {
220
+ issues.push(formatIllegalQidIssue(candidate, decision.qid));
221
+ }
222
+ }
223
+ function isAllowedQid(candidate, qid) {
224
+ return listAllowedQids(candidate).includes(qid);
225
+ }
226
+ function isDisambiguationQid(candidate, qid) {
227
+ return candidate.qidOptions.some(
228
+ (option) => option.disambiguation !== void 0 && option.qid === qid
229
+ );
230
+ }
231
+ function listAllowedQids(candidate) {
232
+ return listCandidateSelectableQids(candidate);
233
+ }
234
+ function formatIllegalQidIssue(candidate, qid) {
235
+ return `Candidate ${candidate.id} selected qid ${qid}, but that QID is not available for this candidate. Allowed QIDs for "${candidate.surface}" are: ${listAllowedQids(candidate).join(", ")}.`;
236
+ }
237
+ function rangesOverlap(left, right) {
238
+ return left.start < right.end && right.start < left.end;
239
+ }
240
+ function createCandidateMap(candidates) {
241
+ return new Map(candidates.map((candidate) => [candidate.id, candidate]));
242
+ }
243
+ function createGroupMap(groups) {
244
+ return new Map(
245
+ groups.map((group) => [group.id, new Set(group.candidateIds)])
246
+ );
247
+ }
248
+ function inferGroups(candidates) {
249
+ if (candidates.length === 0) {
250
+ return [];
251
+ }
252
+ return [
253
+ {
254
+ candidateIds: candidates.map((candidate) => candidate.id),
255
+ id: "g1",
256
+ range: {
257
+ end: Math.max(...candidates.map((candidate) => candidate.range.end)),
258
+ start: Math.min(
259
+ ...candidates.map((candidate) => candidate.range.start)
260
+ )
261
+ }
262
+ }
263
+ ];
264
+ }
265
+ function buildPolicyMessages(input) {
266
+ return [
267
+ {
268
+ role: "system",
269
+ content: formatPolicySystemPrompt(input)
270
+ },
271
+ {
272
+ role: "user",
273
+ content: formatPolicyPrompt(input)
274
+ }
275
+ ];
276
+ }
277
+ function formatPolicySystemPrompt(input) {
278
+ return [
279
+ "You judge which precomputed Wikidata mention candidates should be recalled.",
280
+ "",
281
+ "Recall policy:",
282
+ input.policyPrompt,
283
+ "",
284
+ "Rules:",
285
+ "- Return JSON only.",
286
+ "- Return exactly one group result for every input group.",
287
+ "- Use decisions: [] only when this group has no selected mention and no policy update.",
288
+ "- First judge whether each candidate mention is worth recalling in this exact tagged context, before choosing among QID candidates.",
289
+ '- If the mention is not worth recalling in context, use "never_recall" immediately; do not inspect later pages just because more QIDs might exist.',
290
+ '- Use "never_recall" when this exact candidate span is not a standalone knowledge graph object in context.',
291
+ "- Candidate lists may be incomplete when a candidate has more pages.",
292
+ '- Use decision "continue" only after the mention has passed the context-worthiness test and the current candidate page has no good QID but more pages are available.',
293
+ '- "continue" is not a rejection. It asks to inspect the next candidate page for that candidate.',
294
+ '- If a surface should be recalled but the current incomplete page lacks a suitable QID, use "continue" instead of skip_this_time.',
295
+ '- Do not use "continue" for single-character surnames, abbreviations, side labels, generic words, fragments, roles, quantities, attributes, or discourse words that are not useful standalone knowledge graph objects in context.',
296
+ "- Do not invent candidates, ranges, surfaces, or QIDs.",
297
+ "- A recalled mention must choose a QID from entityOptions or disambiguationOptions.meanings.",
298
+ '- Include qid only when decision is "recall"; do not include qid for continue, skip_this_time, or never_recall.',
299
+ "- Never return DIS identifiers as qid values; DIS identifiers are only disambiguation references.",
300
+ "- Overlapping recalled ranges are illegal; choose the most specific valid mention."
301
+ ].join("\n");
302
+ }
303
+ function formatPolicyPrompt(input) {
304
+ return [
305
+ "Tagged context:",
306
+ formatTaggedContext(input),
307
+ "",
308
+ "Candidate groups:",
309
+ formatGroupsForPrompt(input).map((group) => JSON.stringify(group)).join("\n"),
310
+ "",
311
+ "Return this JSON shape:",
312
+ JSON.stringify({
313
+ groups: [
314
+ {
315
+ decisions: [
316
+ {
317
+ candidateId: "candidate id from this group",
318
+ decision: "recall | continue | skip_this_time | never_recall",
319
+ qid: "required only when decision is recall"
320
+ }
321
+ ],
322
+ groupId: "group id from the input"
323
+ }
324
+ ]
325
+ })
326
+ ].join("\n");
327
+ }
328
+ function formatTaggedContext(input) {
329
+ const groups = [...input.window.groups].sort(
330
+ (left, right) => left.range.start - right.range.start
331
+ );
332
+ const parts = [];
333
+ let cursor = input.window.baseOffset;
334
+ for (const group of groups) {
335
+ parts.push(
336
+ input.window.text.slice(
337
+ cursor - input.window.baseOffset,
338
+ group.range.start - input.window.baseOffset
339
+ )
340
+ );
341
+ parts.push(
342
+ `<group id="${escapeXmlAttribute(group.id)}">${escapeXmlText(
343
+ input.window.text.slice(
344
+ group.range.start - input.window.baseOffset,
345
+ group.range.end - input.window.baseOffset
346
+ )
347
+ )}</group>`
348
+ );
349
+ cursor = group.range.end;
350
+ }
351
+ parts.push(input.window.text.slice(cursor - input.window.baseOffset));
352
+ return parts.join("");
353
+ }
354
+ function formatGroupsForPrompt(input) {
355
+ const candidatesById = createCandidateMap(input.window.candidates);
356
+ return input.window.groups.map((group) => ({
357
+ candidates: group.candidateIds.flatMap((candidateId) => {
358
+ const candidate = candidatesById.get(candidateId);
359
+ return candidate === void 0 ? [] : [formatCandidateForPrompt(candidate)];
360
+ }),
361
+ groupId: group.id
362
+ }));
363
+ }
364
+ function formatCandidateForPrompt(candidate, _group) {
365
+ const formattedOptions = formatQidOptions(candidate.qidOptions);
366
+ return {
367
+ candidateId: candidate.id,
368
+ ...candidate.hasMoreOptions === true ? { hasMoreOptions: true } : {},
369
+ ...formattedOptions.disambiguationOptions.length === 0 ? {} : { disambiguationOptions: formattedOptions.disambiguationOptions },
370
+ ...formattedOptions.entityOptions.length === 0 ? {} : { entityOptions: formattedOptions.entityOptions }
371
+ };
372
+ }
373
+ function formatQidOptions(options) {
374
+ const disambiguationOptions = [];
375
+ const entityOptions = [];
376
+ for (const option of options) {
377
+ if (option.disambiguation !== void 0) {
378
+ disambiguationOptions.push({
379
+ ...option.label === void 0 ? {} : { label: option.label },
380
+ meanings: option.disambiguation.profile?.meanings.map(formatMeaningForPrompt) ?? option.disambiguation.linkedQids.map((item) => ({
381
+ name: item.title,
382
+ qid: item.qid
383
+ }))
384
+ });
385
+ continue;
386
+ }
387
+ entityOptions.push({
388
+ ...option.description === void 0 ? {} : { description: option.description },
389
+ ...option.label === void 0 ? {} : { label: option.label },
390
+ qid: option.qid
391
+ });
392
+ }
393
+ return {
394
+ disambiguationOptions,
395
+ entityOptions
396
+ };
397
+ }
398
+ function formatMeaningForPrompt(meaning) {
399
+ return {
400
+ ...meaning.information === "" ? {} : { information: meaning.information },
401
+ name: meaning.name,
402
+ qid: meaning.qid
403
+ };
404
+ }
405
+ function escapeXmlAttribute(value) {
406
+ return escapeXmlText(value).replaceAll('"', "&quot;");
407
+ }
408
+ function escapeXmlText(value) {
409
+ return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
410
+ }
411
+ function formatFallbackIssue(error) {
412
+ if (error instanceof ParsedJsonError) {
413
+ return error.issues.join("\n");
414
+ }
415
+ if (error instanceof Error) {
416
+ const issues = error.issues;
417
+ if (Array.isArray(issues) && issues.every((issue) => typeof issue === "string")) {
418
+ return issues.join("\n");
419
+ }
420
+ return error.message;
421
+ }
422
+ return String(error);
423
+ }
424
+ export {
425
+ formatCandidateForPrompt,
426
+ judgeWikimatchPolicy,
427
+ parsePolicyResponse,
428
+ validatePolicyResponse
429
+ };
430
+ //# sourceMappingURL=policy-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/wikimatch/policy-judge.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 { listCandidateSelectableQids } from \"./options.js\";\nimport type {\n WikimatchAcceptedMention,\n WikimatchCandidate,\n WikimatchConflictGroup,\n WikimatchPolicyContinuation,\n WikimatchQidOption,\n WikimatchPolicyDecisionOutput,\n WikimatchPolicyJudgeInput,\n WikimatchPolicyJudgeResult,\n WikimatchPolicyResponse,\n WikimatchPolicyUpdate,\n} from \"./types.js\";\n\nconst policyDecisionSchema = z\n .object({\n candidateId: z.string().min(1),\n decision: z.enum([\"continue\", \"recall\", \"skip_this_time\", \"never_recall\"]),\n qid: z.string().nullable().optional(),\n })\n .strict();\n\nconst policyGroupSchema = z\n .object({\n decisions: z.array(policyDecisionSchema),\n groupId: z.string().min(1),\n })\n .strict();\n\nconst policyResponseSchema = z\n .object({\n groups: z.array(policyGroupSchema),\n })\n .strict();\n\nexport interface JudgeWikimatchPolicyOptions extends WikimatchPolicyJudgeInput {\n readonly maxRetries?: number;\n readonly request: GuaranteedRequest;\n}\n\nexport async function judgeWikimatchPolicy(\n options: JudgeWikimatchPolicyOptions,\n): Promise<WikimatchPolicyJudgeResult> {\n try {\n return await requestGuaranteedJson({\n messages: buildPolicyMessages(options),\n parse: (response) =>\n parsePolicyResponse(\n options.candidates,\n normalizePolicyResponse(response),\n options.window.groups,\n ),\n request: options.request,\n responseIntentClassifierPrompt:\n RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,\n schema: policyResponseSchema,\n ...(options.maxRetries === undefined\n ? {}\n : { maxRetries: options.maxRetries }),\n });\n } catch (error) {\n return {\n continuations: [],\n fallback: {\n issues: [formatFallbackIssue(error)],\n reason: \"guaranteed_json_failed\",\n },\n mentions: [],\n policyUpdates: [],\n };\n }\n}\n\nfunction normalizePolicyResponse(\n response: z.infer<typeof policyResponseSchema>,\n): WikimatchPolicyResponse {\n return {\n groups: response.groups.map((group) => ({\n decisions: group.decisions.map((decision) => ({\n candidateId: decision.candidateId,\n decision: decision.decision,\n ...normalizeDecisionQid(decision.qid),\n })),\n groupId: group.groupId,\n })),\n };\n}\n\nfunction normalizeDecisionQid(qid: string | null | undefined): {\n readonly qid?: string;\n} {\n const normalized = qid?.trim();\n\n return normalized === undefined || normalized === \"\"\n ? {}\n : { qid: normalized };\n}\n\nexport function parsePolicyResponse(\n candidates: readonly WikimatchCandidate[],\n response: WikimatchPolicyResponse,\n groups: readonly WikimatchConflictGroup[] = inferGroups(candidates),\n): WikimatchPolicyJudgeResult {\n const issues = validatePolicyResponse(candidates, response, groups);\n\n if (issues.length > 0) {\n throw new ParsedJsonError(issues);\n }\n\n const candidatesById = createCandidateMap(candidates);\n const continuations: WikimatchPolicyContinuation[] = [];\n const mentions: WikimatchAcceptedMention[] = [];\n const policyUpdates: WikimatchPolicyUpdate[] = [];\n\n for (const group of response.groups) {\n const continuedCandidateIds: string[] = [];\n\n for (const decision of group.decisions) {\n const candidate = candidatesById.get(decision.candidateId)!;\n\n if (decision.decision === \"continue\") {\n if (candidate.hasMoreOptions !== true) {\n policyUpdates.push({\n candidateId: candidate.id,\n decision: \"skip_this_time\",\n surface: candidate.surface,\n });\n continue;\n }\n continuedCandidateIds.push(candidate.id);\n continue;\n }\n\n if (decision.decision === \"recall\") {\n mentions.push({\n candidateId: candidate.id,\n qid: decision.qid!,\n range: candidate.range,\n surface: candidate.surface,\n });\n continue;\n }\n\n policyUpdates.push({\n candidateId: candidate.id,\n decision: decision.decision,\n ...(decision.qid === undefined ? {} : { qid: decision.qid }),\n surface: candidate.surface,\n });\n }\n\n if (continuedCandidateIds.length > 0) {\n continuations.push({\n candidateIds: continuedCandidateIds,\n groupId: group.groupId,\n });\n }\n }\n\n return {\n continuations,\n mentions,\n policyUpdates,\n };\n}\n\nexport function validatePolicyResponse(\n candidates: readonly WikimatchCandidate[],\n response: WikimatchPolicyResponse,\n groups: readonly WikimatchConflictGroup[] = inferGroups(candidates),\n): readonly string[] {\n const issues: string[] = [];\n const candidatesById = createCandidateMap(candidates);\n const groupsById = createGroupMap(groups);\n const seenGroupIds = new Set<string>();\n const seenCandidateIds = new Set<string>();\n const recalled: Array<{\n readonly candidate: WikimatchCandidate;\n readonly decision: WikimatchPolicyDecisionOutput;\n }> = [];\n\n for (const group of response.groups) {\n const expectedCandidateIds = groupsById.get(group.groupId);\n\n if (expectedCandidateIds === undefined) {\n issues.push(\n `Unknown groupId \"${group.groupId}\". Use exactly these group IDs: ${[\n ...groupsById.keys(),\n ].join(\", \")}.`,\n );\n continue;\n }\n if (seenGroupIds.has(group.groupId)) {\n issues.push(`Duplicate group result for ${group.groupId}.`);\n continue;\n }\n seenGroupIds.add(group.groupId);\n\n for (const decision of group.decisions) {\n const candidate = candidatesById.get(decision.candidateId);\n\n if (candidate === undefined) {\n issues.push(\n `Unknown candidateId \"${decision.candidateId}\". Use only one of: ${[\n ...candidatesById.keys(),\n ].join(\", \")}.`,\n );\n continue;\n }\n if (!expectedCandidateIds.has(decision.candidateId)) {\n issues.push(\n `Candidate ${decision.candidateId} does not belong to group ${group.groupId}. Use only candidates from that group: ${[\n ...expectedCandidateIds,\n ].join(\", \")}.`,\n );\n continue;\n }\n if (seenCandidateIds.has(decision.candidateId)) {\n issues.push(\n `Duplicate decision for candidate ${decision.candidateId}. Return exactly one decision per candidate at most.`,\n );\n continue;\n }\n\n seenCandidateIds.add(decision.candidateId);\n\n if (decision.decision === \"recall\") {\n validateRecallDecision(issues, candidate, decision);\n recalled.push({ candidate, decision });\n continue;\n }\n\n if (decision.decision === \"continue\") {\n if (decision.qid !== undefined) {\n issues.push(\n `Candidate ${candidate.id} uses decision \"continue\" but includes qid. Continue means this candidate page has no final choice yet.`,\n );\n }\n continue;\n }\n\n if (decision.qid !== undefined) {\n issues.push(\n `Candidate ${candidate.id} uses decision \"${decision.decision}\" but includes qid. Include qid only when decision is \"recall\".`,\n );\n }\n }\n }\n\n for (const groupId of groupsById.keys()) {\n if (!seenGroupIds.has(groupId)) {\n issues.push(\n `Missing group result for ${groupId}. Return exactly one result for every input group; use decisions: [] when nothing should be recalled.`,\n );\n }\n }\n\n for (let leftIndex = 0; leftIndex < recalled.length; leftIndex += 1) {\n for (\n let rightIndex = leftIndex + 1;\n rightIndex < recalled.length;\n rightIndex += 1\n ) {\n const left = recalled[leftIndex]!;\n const right = recalled[rightIndex]!;\n\n if (rangesOverlap(left.candidate.range, right.candidate.range)) {\n issues.push(\n `Decision conflict: candidates ${left.candidate.id} and ${right.candidate.id} both use decision \"recall\", but their ranges overlap.\\n` +\n `- ${left.candidate.id}: \"${left.candidate.surface}\" [${left.candidate.range.start}, ${left.candidate.range.end})\\n` +\n `- ${right.candidate.id}: \"${right.candidate.surface}\" [${right.candidate.range.start}, ${right.candidate.range.end})\\n` +\n \"Only one recalled mention may occupy an overlapping text range. Choose the most specific valid mention, or mark the others as skip_this_time / never_recall.\",\n );\n }\n }\n }\n\n return issues;\n}\n\nfunction validateRecallDecision(\n issues: string[],\n candidate: WikimatchCandidate,\n decision: WikimatchPolicyDecisionOutput,\n): void {\n if (decision.qid === undefined) {\n issues.push(\n `Candidate ${candidate.id} uses decision \"recall\" but does not provide qid. A recalled mention must choose one concrete QID from the candidate options.`,\n );\n return;\n }\n if (isDisambiguationQid(candidate, decision.qid)) {\n issues.push(\n `Candidate ${candidate.id} selected source disambiguation QID ${decision.qid}. Source disambiguation QIDs are hidden behind DIS references and cannot be final mention groundings. Choose a QID from entityOptions or disambiguationOptions.meanings instead.`,\n );\n return;\n }\n if (!isAllowedQid(candidate, decision.qid)) {\n issues.push(formatIllegalQidIssue(candidate, decision.qid));\n }\n}\n\nfunction isAllowedQid(candidate: WikimatchCandidate, qid: string): boolean {\n return listAllowedQids(candidate).includes(qid);\n}\n\nfunction isDisambiguationQid(\n candidate: WikimatchCandidate,\n qid: string,\n): boolean {\n return candidate.qidOptions.some(\n (option) => option.disambiguation !== undefined && option.qid === qid,\n );\n}\n\nfunction listAllowedQids(candidate: WikimatchCandidate): readonly string[] {\n return listCandidateSelectableQids(candidate);\n}\n\nfunction formatIllegalQidIssue(\n candidate: WikimatchCandidate,\n qid: string,\n): string {\n return (\n `Candidate ${candidate.id} selected qid ${qid}, but that QID is not available for this candidate. ` +\n `Allowed QIDs for \"${candidate.surface}\" are: ${listAllowedQids(candidate).join(\", \")}.`\n );\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 createCandidateMap(\n candidates: readonly WikimatchCandidate[],\n): ReadonlyMap<string, WikimatchCandidate> {\n return new Map(candidates.map((candidate) => [candidate.id, candidate]));\n}\n\nfunction createGroupMap(\n groups: readonly WikimatchConflictGroup[],\n): ReadonlyMap<string, ReadonlySet<string>> {\n return new Map(\n groups.map((group) => [group.id, new Set(group.candidateIds)]),\n );\n}\n\nfunction inferGroups(\n candidates: readonly WikimatchCandidate[],\n): readonly WikimatchConflictGroup[] {\n if (candidates.length === 0) {\n return [];\n }\n\n return [\n {\n candidateIds: candidates.map((candidate) => candidate.id),\n id: \"g1\",\n range: {\n end: Math.max(...candidates.map((candidate) => candidate.range.end)),\n start: Math.min(\n ...candidates.map((candidate) => candidate.range.start),\n ),\n },\n },\n ];\n}\n\nfunction buildPolicyMessages(input: WikimatchPolicyJudgeInput): LLMessage[] {\n return [\n {\n role: \"system\",\n content: formatPolicySystemPrompt(input),\n },\n {\n role: \"user\",\n content: formatPolicyPrompt(input),\n },\n ];\n}\n\nfunction formatPolicySystemPrompt(input: WikimatchPolicyJudgeInput): string {\n return [\n \"You judge which precomputed Wikidata mention candidates should be recalled.\",\n \"\",\n \"Recall policy:\",\n input.policyPrompt,\n \"\",\n \"Rules:\",\n \"- Return JSON only.\",\n \"- Return exactly one group result for every input group.\",\n \"- Use decisions: [] only when this group has no selected mention and no policy update.\",\n \"- First judge whether each candidate mention is worth recalling in this exact tagged context, before choosing among QID candidates.\",\n '- If the mention is not worth recalling in context, use \"never_recall\" immediately; do not inspect later pages just because more QIDs might exist.',\n '- Use \"never_recall\" when this exact candidate span is not a standalone knowledge graph object in context.',\n \"- Candidate lists may be incomplete when a candidate has more pages.\",\n '- Use decision \"continue\" only after the mention has passed the context-worthiness test and the current candidate page has no good QID but more pages are available.',\n '- \"continue\" is not a rejection. It asks to inspect the next candidate page for that candidate.',\n '- If a surface should be recalled but the current incomplete page lacks a suitable QID, use \"continue\" instead of skip_this_time.',\n '- Do not use \"continue\" for single-character surnames, abbreviations, side labels, generic words, fragments, roles, quantities, attributes, or discourse words that are not useful standalone knowledge graph objects in context.',\n \"- Do not invent candidates, ranges, surfaces, or QIDs.\",\n \"- A recalled mention must choose a QID from entityOptions or disambiguationOptions.meanings.\",\n '- Include qid only when decision is \"recall\"; do not include qid for continue, skip_this_time, or never_recall.',\n \"- Never return DIS identifiers as qid values; DIS identifiers are only disambiguation references.\",\n \"- Overlapping recalled ranges are illegal; choose the most specific valid mention.\",\n ].join(\"\\n\");\n}\n\nfunction formatPolicyPrompt(input: WikimatchPolicyJudgeInput): string {\n return [\n \"Tagged context:\",\n formatTaggedContext(input),\n \"\",\n \"Candidate groups:\",\n formatGroupsForPrompt(input)\n .map((group) => JSON.stringify(group))\n .join(\"\\n\"),\n \"\",\n \"Return this JSON shape:\",\n JSON.stringify({\n groups: [\n {\n decisions: [\n {\n candidateId: \"candidate id from this group\",\n decision: \"recall | continue | skip_this_time | never_recall\",\n qid: \"required only when decision is recall\",\n },\n ],\n groupId: \"group id from the input\",\n },\n ],\n }),\n ].join(\"\\n\");\n}\n\nfunction formatTaggedContext(input: WikimatchPolicyJudgeInput): string {\n const groups = [...input.window.groups].sort(\n (left, right) => left.range.start - right.range.start,\n );\n const parts: string[] = [];\n let cursor = input.window.baseOffset;\n\n for (const group of groups) {\n parts.push(\n input.window.text.slice(\n cursor - input.window.baseOffset,\n group.range.start - input.window.baseOffset,\n ),\n );\n parts.push(\n `<group id=\"${escapeXmlAttribute(group.id)}\">${escapeXmlText(\n input.window.text.slice(\n group.range.start - input.window.baseOffset,\n group.range.end - input.window.baseOffset,\n ),\n )}</group>`,\n );\n cursor = group.range.end;\n }\n\n parts.push(input.window.text.slice(cursor - input.window.baseOffset));\n\n return parts.join(\"\");\n}\n\nfunction formatGroupsForPrompt(input: WikimatchPolicyJudgeInput): object[] {\n const candidatesById = createCandidateMap(input.window.candidates);\n\n return input.window.groups.map((group) => ({\n candidates: group.candidateIds.flatMap((candidateId) => {\n const candidate = candidatesById.get(candidateId);\n\n return candidate === undefined\n ? []\n : [formatCandidateForPrompt(candidate)];\n }),\n groupId: group.id,\n }));\n}\n\nexport function formatCandidateForPrompt(\n candidate: WikimatchCandidate,\n _group?: WikimatchConflictGroup,\n): object {\n const formattedOptions = formatQidOptions(candidate.qidOptions);\n\n return {\n candidateId: candidate.id,\n ...(candidate.hasMoreOptions === true ? { hasMoreOptions: true } : {}),\n ...(formattedOptions.disambiguationOptions.length === 0\n ? {}\n : { disambiguationOptions: formattedOptions.disambiguationOptions }),\n ...(formattedOptions.entityOptions.length === 0\n ? {}\n : { entityOptions: formattedOptions.entityOptions }),\n };\n}\n\nfunction formatQidOptions(options: readonly WikimatchQidOption[]): {\n readonly disambiguationOptions: readonly object[];\n readonly entityOptions: readonly object[];\n} {\n const disambiguationOptions: object[] = [];\n const entityOptions: object[] = [];\n\n for (const option of options) {\n if (option.disambiguation !== undefined) {\n disambiguationOptions.push({\n ...(option.label === undefined ? {} : { label: option.label }),\n meanings:\n option.disambiguation.profile?.meanings.map(formatMeaningForPrompt) ??\n option.disambiguation.linkedQids.map((item) => ({\n name: item.title,\n qid: item.qid,\n })),\n });\n continue;\n }\n\n entityOptions.push({\n ...(option.description === undefined\n ? {}\n : { description: option.description }),\n ...(option.label === undefined ? {} : { label: option.label }),\n qid: option.qid,\n });\n }\n\n return {\n disambiguationOptions,\n entityOptions,\n };\n}\n\nfunction formatMeaningForPrompt(\n meaning: NonNullable<\n NonNullable<WikimatchQidOption[\"disambiguation\"]>[\"profile\"]\n >[\"meanings\"][number],\n): object {\n return {\n ...(meaning.information === \"\" ? {} : { information: meaning.information }),\n name: meaning.name,\n qid: meaning.qid,\n };\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\nfunction formatFallbackIssue(error: unknown): string {\n if (error instanceof ParsedJsonError) {\n return error.issues.join(\"\\n\");\n }\n if (error instanceof Error) {\n const issues = (error as { readonly issues?: unknown }).issues;\n\n if (\n Array.isArray(issues) &&\n issues.every((issue) => typeof issue === \"string\")\n ) {\n return issues.join(\"\\n\");\n }\n\n return error.message;\n }\n\n return String(error);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ interface SuppressContainedRangeInput {
2
+ readonly range: {
3
+ readonly end: number;
4
+ readonly start: number;
5
+ };
6
+ }
7
+ declare function suppressContainedRanges<T extends SuppressContainedRangeInput>(items: readonly T[]): readonly T[];
8
+
9
+ export { type SuppressContainedRangeInput, suppressContainedRanges };
@@ -0,0 +1,27 @@
1
+ function suppressContainedRanges(items) {
2
+ const sorted = [...items].filter((item) => item.range.start < item.range.end).sort(compareByRangeForSuppression);
3
+ const kept = [];
4
+ for (const item of sorted) {
5
+ if (kept.some((candidate) => containsRange(candidate, item))) {
6
+ continue;
7
+ }
8
+ kept.push(item);
9
+ }
10
+ return kept.sort(compareByOriginalOrder);
11
+ }
12
+ function compareByRangeForSuppression(left, right) {
13
+ return left.range.start - right.range.start || right.range.end - left.range.end || rangeLength(right) - rangeLength(left);
14
+ }
15
+ function compareByOriginalOrder(left, right) {
16
+ return left.range.start - right.range.start || left.range.end - right.range.end || rangeLength(left) - rangeLength(right);
17
+ }
18
+ function containsRange(container, item) {
19
+ return container.range.start <= item.range.start && item.range.end <= container.range.end && rangeLength(container) > rangeLength(item);
20
+ }
21
+ function rangeLength(item) {
22
+ return item.range.end - item.range.start;
23
+ }
24
+ export {
25
+ suppressContainedRanges
26
+ };
27
+ //# sourceMappingURL=range-suppression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/wikimatch/range-suppression.ts"],"sourcesContent":["export interface SuppressContainedRangeInput {\n readonly range: {\n readonly end: number;\n readonly start: number;\n };\n}\n\nexport function suppressContainedRanges<T extends SuppressContainedRangeInput>(\n items: readonly T[],\n): readonly T[] {\n const sorted = [...items]\n .filter((item) => item.range.start < item.range.end)\n .sort(compareByRangeForSuppression);\n const kept: T[] = [];\n\n for (const item of sorted) {\n if (kept.some((candidate) => containsRange(candidate, item))) {\n continue;\n }\n\n kept.push(item);\n }\n\n return kept.sort(compareByOriginalOrder);\n}\n\nfunction compareByRangeForSuppression<T extends SuppressContainedRangeInput>(\n left: T,\n right: T,\n): number {\n return (\n left.range.start - right.range.start ||\n right.range.end - left.range.end ||\n rangeLength(right) - rangeLength(left)\n );\n}\n\nfunction compareByOriginalOrder<T extends SuppressContainedRangeInput>(\n left: T,\n right: T,\n): number {\n return (\n left.range.start - right.range.start ||\n left.range.end - right.range.end ||\n rangeLength(left) - rangeLength(right)\n );\n}\n\nfunction containsRange<T extends SuppressContainedRangeInput>(\n container: T,\n item: T,\n): boolean {\n return (\n container.range.start <= item.range.start &&\n item.range.end <= container.range.end &&\n rangeLength(container) > rangeLength(item)\n );\n}\n\nfunction rangeLength(item: SuppressContainedRangeInput): number {\n return item.range.end - item.range.start;\n}\n"],"mappings":"AAOO,SAAS,wBACd,OACc;AACd,QAAM,SAAS,CAAC,GAAG,KAAK,EACrB,OAAO,CAAC,SAAS,KAAK,MAAM,QAAQ,KAAK,MAAM,GAAG,EAClD,KAAK,4BAA4B;AACpC,QAAM,OAAY,CAAC;AAEnB,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,KAAK,CAAC,cAAc,cAAc,WAAW,IAAI,CAAC,GAAG;AAC5D;AAAA,IACF;AAEA,SAAK,KAAK,IAAI;AAAA,EAChB;AAEA,SAAO,KAAK,KAAK,sBAAsB;AACzC;AAEA,SAAS,6BACP,MACA,OACQ;AACR,SACE,KAAK,MAAM,QAAQ,MAAM,MAAM,SAC/B,MAAM,MAAM,MAAM,KAAK,MAAM,OAC7B,YAAY,KAAK,IAAI,YAAY,IAAI;AAEzC;AAEA,SAAS,uBACP,MACA,OACQ;AACR,SACE,KAAK,MAAM,QAAQ,MAAM,MAAM,SAC/B,KAAK,MAAM,MAAM,MAAM,MAAM,OAC7B,YAAY,IAAI,IAAI,YAAY,KAAK;AAEzC;AAEA,SAAS,cACP,WACA,MACS;AACT,SACE,UAAU,MAAM,SAAS,KAAK,MAAM,SACpC,KAAK,MAAM,OAAO,UAAU,MAAM,OAClC,YAAY,SAAS,IAAI,YAAY,IAAI;AAE7C;AAEA,SAAS,YAAY,MAA2C;AAC9D,SAAO,KAAK,MAAM,MAAM,KAAK,MAAM;AACrC;","names":[]}
@@ -0,0 +1,16 @@
1
+ import { GuaranteedRequest } from '../guaranteed/types.js';
2
+ import { WikimatchSurfaceProtectionInput, WikimatchSurfaceProtectionResult, WikimatchSurface, WikimatchSurfaceProtectionResponse } from './types.js';
3
+ import '../llm/types.js';
4
+ import 'ai';
5
+ import 'zod';
6
+ import '../wikipage/types.js';
7
+
8
+ interface JudgeWikimatchSurfaceProtectionOptions extends WikimatchSurfaceProtectionInput {
9
+ readonly maxRetries?: number;
10
+ readonly request: GuaranteedRequest;
11
+ }
12
+ declare function judgeWikimatchSurfaceProtection(options: JudgeWikimatchSurfaceProtectionOptions): Promise<WikimatchSurfaceProtectionResult>;
13
+ declare function parseSurfaceProtectionResponse(surfaces: readonly WikimatchSurface[], response: WikimatchSurfaceProtectionResponse): WikimatchSurfaceProtectionResult;
14
+ declare function validateSurfaceProtectionResponse(surfaces: readonly WikimatchSurface[], response: WikimatchSurfaceProtectionResponse): readonly string[];
15
+
16
+ export { type JudgeWikimatchSurfaceProtectionOptions, judgeWikimatchSurfaceProtection, parseSurfaceProtectionResponse, validateSurfaceProtectionResponse };