wiki-graph-core 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) hide show
  1. package/LICENSE +201 -0
  2. package/data/editor/clue_reviewer.jinja +410 -0
  3. package/data/editor/clue_reviewer_generator.jinja +428 -0
  4. package/data/editor/revision_feedback.jinja +5 -0
  5. package/data/editor/text_compressor.jinja +127 -0
  6. package/data/guaranteed/response_intent_classifier.jinja +8 -0
  7. package/data/help/commands/archive/next.jinja +29 -0
  8. package/data/help/commands/gc.jinja +38 -0
  9. package/data/help/commands/legacy/migrate.jinja +20 -0
  10. package/data/help/commands/legacy.jinja +19 -0
  11. package/data/help/commands/maintenance/chapter/add.jinja +41 -0
  12. package/data/help/commands/maintenance/chapter/list.jinja +33 -0
  13. package/data/help/commands/maintenance/chapter/move.jinja +36 -0
  14. package/data/help/commands/maintenance/chapter/remove.jinja +26 -0
  15. package/data/help/commands/maintenance/chapter/reset.jinja +29 -0
  16. package/data/help/commands/maintenance/chapter/set-source.jinja +34 -0
  17. package/data/help/commands/maintenance/chapter/set-summary.jinja +31 -0
  18. package/data/help/commands/maintenance/chapter/set-title.jinja +29 -0
  19. package/data/help/commands/maintenance/chapter/tree.jinja +58 -0
  20. package/data/help/commands/maintenance/chapter.jinja +59 -0
  21. package/data/help/commands/maintenance/cover.jinja +28 -0
  22. package/data/help/commands/maintenance/meta.jinja +55 -0
  23. package/data/help/commands/predicate.jinja +460 -0
  24. package/data/help/commands/root.jinja +83 -0
  25. package/data/help/commands/transform.jinja +34 -0
  26. package/data/help/commands/uri.jinja +274 -0
  27. package/data/help/topics/config.jinja +88 -0
  28. package/data/help/topics/format.jinja +72 -0
  29. package/data/help/topics/readiness.jinja +99 -0
  30. package/data/help/topics/recipe.jinja +151 -0
  31. package/data/help/topics/runtime.jinja +62 -0
  32. package/data/help/topics/uri.jinja +178 -0
  33. package/data/output/epub/cover.xhtml.jinja +13 -0
  34. package/data/output/epub/nav.xhtml.jinja +12 -0
  35. package/data/output/epub/package.opf.xml.jinja +39 -0
  36. package/data/output/epub/section.xhtml.jinja +12 -0
  37. package/data/topologization/book_coherence_extraction.jinja +223 -0
  38. package/data/topologization/chunk_extraction.jinja +233 -0
  39. package/data/topologization/evidence_choice.jinja +38 -0
  40. package/data/topologization/translate_chunks.jinja +138 -0
  41. package/data/topologization/user_focused_extraction.jinja +378 -0
  42. package/dist/archive/query/archive-view.d.ts +26 -0
  43. package/dist/archive/query/archive-view.js +4540 -0
  44. package/dist/archive/query/archive-view.js.map +1 -0
  45. package/dist/archive/query/continuation-cursor.d.ts +61 -0
  46. package/dist/archive/query/continuation-cursor.js +363 -0
  47. package/dist/archive/query/continuation-cursor.js.map +1 -0
  48. package/dist/archive/query/index.d.ts +29 -0
  49. package/dist/archive/query/index.js +63 -0
  50. package/dist/archive/query/index.js.map +1 -0
  51. package/dist/archive/query/lexical-search.d.ts +22 -0
  52. package/dist/archive/query/lexical-search.js +137 -0
  53. package/dist/archive/query/lexical-search.js.map +1 -0
  54. package/dist/archive/query/search-cache.d.ts +192 -0
  55. package/dist/archive/query/search-cache.js +1248 -0
  56. package/dist/archive/query/search-cache.js.map +1 -0
  57. package/dist/archive/search-index/index.d.ts +26 -0
  58. package/dist/archive/search-index/index.js +29 -0
  59. package/dist/archive/search-index/index.js.map +1 -0
  60. package/dist/archive/search-index/search-index.d.ts +26 -0
  61. package/dist/archive/search-index/search-index.js +555 -0
  62. package/dist/archive/search-index/search-index.js.map +1 -0
  63. package/dist/archive/search-index/search-tokenizer.d.ts +16 -0
  64. package/dist/archive/search-index/search-tokenizer.js +225 -0
  65. package/dist/archive/search-index/search-tokenizer.js.map +1 -0
  66. package/dist/common/cli-command.d.ts +4 -0
  67. package/dist/common/cli-command.js +7 -0
  68. package/dist/common/cli-command.js.map +1 -0
  69. package/dist/common/data-dir.d.ts +3 -0
  70. package/dist/common/data-dir.js +48 -0
  71. package/dist/common/data-dir.js.map +1 -0
  72. package/dist/common/language.d.ts +55 -0
  73. package/dist/common/language.js +208 -0
  74. package/dist/common/language.js.map +1 -0
  75. package/dist/common/llm-scope.d.ts +19 -0
  76. package/dist/common/llm-scope.js +31 -0
  77. package/dist/common/llm-scope.js.map +1 -0
  78. package/dist/common/logging.d.ts +22 -0
  79. package/dist/common/logging.js +141 -0
  80. package/dist/common/logging.js.map +1 -0
  81. package/dist/common/template.d.ts +8 -0
  82. package/dist/common/template.js +54 -0
  83. package/dist/common/template.js.map +1 -0
  84. package/dist/common/tinyld-language.d.ts +6 -0
  85. package/dist/common/tinyld-language.js +34 -0
  86. package/dist/common/tinyld-language.js.map +1 -0
  87. package/dist/common/wiki-graph-dir.d.ts +10 -0
  88. package/dist/common/wiki-graph-dir.js +41 -0
  89. package/dist/common/wiki-graph-dir.js.map +1 -0
  90. package/dist/common/wiki-graph-temp.d.ts +6 -0
  91. package/dist/common/wiki-graph-temp.js +21 -0
  92. package/dist/common/wiki-graph-temp.js.map +1 -0
  93. package/dist/common/wiki-graph-uri.d.ts +28 -0
  94. package/dist/common/wiki-graph-uri.js +171 -0
  95. package/dist/common/wiki-graph-uri.js.map +1 -0
  96. package/dist/context/index.d.ts +1 -0
  97. package/dist/context/index.js +13 -0
  98. package/dist/context/index.js.map +1 -0
  99. package/dist/context/task-context.d.ts +41 -0
  100. package/dist/context/task-context.js +111 -0
  101. package/dist/context/task-context.js.map +1 -0
  102. package/dist/document/database.d.ts +30 -0
  103. package/dist/document/database.js +273 -0
  104. package/dist/document/database.js.map +1 -0
  105. package/dist/document/document.d.ts +153 -0
  106. package/dist/document/document.js +615 -0
  107. package/dist/document/document.js.map +1 -0
  108. package/dist/document/fragments.d.ts +63 -0
  109. package/dist/document/fragments.js +371 -0
  110. package/dist/document/fragments.js.map +1 -0
  111. package/dist/document/index.d.ts +13 -0
  112. package/dist/document/index.js +62 -0
  113. package/dist/document/index.js.map +1 -0
  114. package/dist/document/schema.d.ts +8 -0
  115. package/dist/document/schema.js +472 -0
  116. package/dist/document/schema.js.map +1 -0
  117. package/dist/document/shared-state-database.d.ts +9 -0
  118. package/dist/document/shared-state-database.js +193 -0
  119. package/dist/document/shared-state-database.js.map +1 -0
  120. package/dist/document/stores.d.ts +203 -0
  121. package/dist/document/stores.js +1678 -0
  122. package/dist/document/stores.js.map +1 -0
  123. package/dist/document/text-streams.d.ts +86 -0
  124. package/dist/document/text-streams.js +515 -0
  125. package/dist/document/text-streams.js.map +1 -0
  126. package/dist/document/types.d.ts +148 -0
  127. package/dist/document/types.js +69 -0
  128. package/dist/document/types.js.map +1 -0
  129. package/dist/editor/clue.d.ts +27 -0
  130. package/dist/editor/clue.js +158 -0
  131. package/dist/editor/clue.js.map +1 -0
  132. package/dist/editor/compressor.d.ts +18 -0
  133. package/dist/editor/compressor.js +68 -0
  134. package/dist/editor/compressor.js.map +1 -0
  135. package/dist/editor/editor.d.ts +39 -0
  136. package/dist/editor/editor.js +253 -0
  137. package/dist/editor/editor.js.map +1 -0
  138. package/dist/editor/feedback.d.ts +16 -0
  139. package/dist/editor/feedback.js +104 -0
  140. package/dist/editor/feedback.js.map +1 -0
  141. package/dist/editor/index.d.ts +17 -0
  142. package/dist/editor/index.js +5 -0
  143. package/dist/editor/index.js.map +1 -0
  144. package/dist/editor/language-review.d.ts +14 -0
  145. package/dist/editor/language-review.js +35 -0
  146. package/dist/editor/language-review.js.map +1 -0
  147. package/dist/editor/log.d.ts +37 -0
  148. package/dist/editor/log.js +202 -0
  149. package/dist/editor/log.js.map +1 -0
  150. package/dist/editor/markup.d.ts +20 -0
  151. package/dist/editor/markup.js +294 -0
  152. package/dist/editor/markup.js.map +1 -0
  153. package/dist/editor/prompt-templates.d.ts +6 -0
  154. package/dist/editor/prompt-templates.js +11 -0
  155. package/dist/editor/prompt-templates.js.map +1 -0
  156. package/dist/editor/response.d.ts +5 -0
  157. package/dist/editor/response.js +31 -0
  158. package/dist/editor/response.js.map +1 -0
  159. package/dist/editor/review.d.ts +34 -0
  160. package/dist/editor/review.js +189 -0
  161. package/dist/editor/review.js.map +1 -0
  162. package/dist/editor/types.d.ts +31 -0
  163. package/dist/editor/types.js +21 -0
  164. package/dist/editor/types.js.map +1 -0
  165. package/dist/evidence-selection/anchor-resolver.d.ts +43 -0
  166. package/dist/evidence-selection/anchor-resolver.js +783 -0
  167. package/dist/evidence-selection/anchor-resolver.js.map +1 -0
  168. package/dist/evidence-selection/anchor-types.d.ts +27 -0
  169. package/dist/evidence-selection/anchor-types.js +1 -0
  170. package/dist/evidence-selection/anchor-types.js.map +1 -0
  171. package/dist/evidence-selection/index.d.ts +8 -0
  172. package/dist/evidence-selection/index.js +32 -0
  173. package/dist/evidence-selection/index.js.map +1 -0
  174. package/dist/evidence-selection/prompt.d.ts +18 -0
  175. package/dist/evidence-selection/prompt.js +54 -0
  176. package/dist/evidence-selection/prompt.js.map +1 -0
  177. package/dist/evidence-selection/quote-score.d.ts +29 -0
  178. package/dist/evidence-selection/quote-score.js +331 -0
  179. package/dist/evidence-selection/quote-score.js.map +1 -0
  180. package/dist/evidence-selection/selection-resolver.d.ts +19 -0
  181. package/dist/evidence-selection/selection-resolver.js +303 -0
  182. package/dist/evidence-selection/selection-resolver.js.map +1 -0
  183. package/dist/evidence-selection/text.d.ts +4 -0
  184. package/dist/evidence-selection/text.js +66 -0
  185. package/dist/evidence-selection/text.js.map +1 -0
  186. package/dist/evidence-selection/types.d.ts +36 -0
  187. package/dist/evidence-selection/types.js +1 -0
  188. package/dist/evidence-selection/types.js.map +1 -0
  189. package/dist/facade/app.d.ts +75 -0
  190. package/dist/facade/app.js +141 -0
  191. package/dist/facade/app.js.map +1 -0
  192. package/dist/facade/build-queue.d.ts +181 -0
  193. package/dist/facade/build-queue.js +1442 -0
  194. package/dist/facade/build-queue.js.map +1 -0
  195. package/dist/facade/chapter-build.d.ts +60 -0
  196. package/dist/facade/chapter-build.js +1020 -0
  197. package/dist/facade/chapter-build.js.map +1 -0
  198. package/dist/facade/chapter.d.ts +168 -0
  199. package/dist/facade/chapter.js +944 -0
  200. package/dist/facade/chapter.js.map +1 -0
  201. package/dist/facade/digest.d.ts +55 -0
  202. package/dist/facade/digest.js +168 -0
  203. package/dist/facade/digest.js.map +1 -0
  204. package/dist/facade/graph.d.ts +60 -0
  205. package/dist/facade/graph.js +203 -0
  206. package/dist/facade/graph.js.map +1 -0
  207. package/dist/facade/import.d.ts +49 -0
  208. package/dist/facade/import.js +262 -0
  209. package/dist/facade/import.js.map +1 -0
  210. package/dist/facade/index.d.ts +39 -0
  211. package/dist/facade/index.js +171 -0
  212. package/dist/facade/index.js.map +1 -0
  213. package/dist/facade/knowledge-graph-build.d.ts +75 -0
  214. package/dist/facade/knowledge-graph-build.js +897 -0
  215. package/dist/facade/knowledge-graph-build.js.map +1 -0
  216. package/dist/facade/llm-sampling.d.ts +11 -0
  217. package/dist/facade/llm-sampling.js +58 -0
  218. package/dist/facade/llm-sampling.js.map +1 -0
  219. package/dist/facade/types.d.ts +8 -0
  220. package/dist/facade/types.js +1 -0
  221. package/dist/facade/types.js.map +1 -0
  222. package/dist/facade/wiki-graph-archive.d.ts +41 -0
  223. package/dist/facade/wiki-graph-archive.js +130 -0
  224. package/dist/facade/wiki-graph-archive.js.map +1 -0
  225. package/dist/gc/files.d.ts +15 -0
  226. package/dist/gc/files.js +141 -0
  227. package/dist/gc/files.js.map +1 -0
  228. package/dist/gc/index.d.ts +2 -0
  229. package/dist/gc/index.js +5 -0
  230. package/dist/gc/index.js.map +1 -0
  231. package/dist/gc/lock.d.ts +3 -0
  232. package/dist/gc/lock.js +137 -0
  233. package/dist/gc/lock.js.map +1 -0
  234. package/dist/gc/runner.d.ts +9 -0
  235. package/dist/gc/runner.js +129 -0
  236. package/dist/gc/runner.js.map +1 -0
  237. package/dist/gc/tmp-gc.d.ts +5 -0
  238. package/dist/gc/tmp-gc.js +57 -0
  239. package/dist/gc/tmp-gc.js.map +1 -0
  240. package/dist/gc/types.d.ts +24 -0
  241. package/dist/gc/types.js +1 -0
  242. package/dist/gc/types.js.map +1 -0
  243. package/dist/gc.cjs +10041 -0
  244. package/dist/gc.cjs.map +1 -0
  245. package/dist/gc.d.cts +10 -0
  246. package/dist/gc.d.ts +2 -0
  247. package/dist/gc.js +5 -0
  248. package/dist/gc.js.map +1 -0
  249. package/dist/guaranteed/classifier.d.ts +10 -0
  250. package/dist/guaranteed/classifier.js +88 -0
  251. package/dist/guaranteed/classifier.js.map +1 -0
  252. package/dist/guaranteed/errors.d.ts +38 -0
  253. package/dist/guaranteed/errors.js +73 -0
  254. package/dist/guaranteed/errors.js.map +1 -0
  255. package/dist/guaranteed/index.d.ts +7 -0
  256. package/dist/guaranteed/index.js +21 -0
  257. package/dist/guaranteed/index.js.map +1 -0
  258. package/dist/guaranteed/request.d.ts +8 -0
  259. package/dist/guaranteed/request.js +206 -0
  260. package/dist/guaranteed/request.js.map +1 -0
  261. package/dist/guaranteed/response.d.ts +12 -0
  262. package/dist/guaranteed/response.js +98 -0
  263. package/dist/guaranteed/response.js.map +1 -0
  264. package/dist/guaranteed/types.d.ts +20 -0
  265. package/dist/guaranteed/types.js +1 -0
  266. package/dist/guaranteed/types.js.map +1 -0
  267. package/dist/index-B8NNnQ8P.d.ts +424 -0
  268. package/dist/index.cjs +34774 -0
  269. package/dist/index.cjs.map +1 -0
  270. package/dist/index.d.cts +2462 -0
  271. package/dist/index.d.ts +79 -0
  272. package/dist/index.js +168 -0
  273. package/dist/index.js.map +1 -0
  274. package/dist/legacy-sdpub/upgrade.d.ts +7 -0
  275. package/dist/legacy-sdpub/upgrade.js +795 -0
  276. package/dist/legacy-sdpub/upgrade.js.map +1 -0
  277. package/dist/llm/cache.d.ts +13 -0
  278. package/dist/llm/cache.js +35 -0
  279. package/dist/llm/cache.js.map +1 -0
  280. package/dist/llm/client.d.ts +26 -0
  281. package/dist/llm/client.js +572 -0
  282. package/dist/llm/client.js.map +1 -0
  283. package/dist/llm/context.d.ts +22 -0
  284. package/dist/llm/context.js +78 -0
  285. package/dist/llm/context.js.map +1 -0
  286. package/dist/llm/errors.d.ts +7 -0
  287. package/dist/llm/errors.js +12 -0
  288. package/dist/llm/errors.js.map +1 -0
  289. package/dist/llm/index.d.ts +7 -0
  290. package/dist/llm/index.js +17 -0
  291. package/dist/llm/index.js.map +1 -0
  292. package/dist/llm/request-log.d.ts +9 -0
  293. package/dist/llm/request-log.js +35 -0
  294. package/dist/llm/request-log.js.map +1 -0
  295. package/dist/llm/sampling.d.ts +11 -0
  296. package/dist/llm/sampling.js +67 -0
  297. package/dist/llm/sampling.js.map +1 -0
  298. package/dist/llm/types.d.ts +50 -0
  299. package/dist/llm/types.js +1 -0
  300. package/dist/llm/types.js.map +1 -0
  301. package/dist/output/epub/archive.d.ts +9 -0
  302. package/dist/output/epub/archive.js +81 -0
  303. package/dist/output/epub/archive.js.map +1 -0
  304. package/dist/output/epub/book.d.ts +15 -0
  305. package/dist/output/epub/book.js +76 -0
  306. package/dist/output/epub/book.js.map +1 -0
  307. package/dist/output/epub/content.d.ts +9 -0
  308. package/dist/output/epub/content.js +35 -0
  309. package/dist/output/epub/content.js.map +1 -0
  310. package/dist/output/epub/index.d.ts +20 -0
  311. package/dist/output/epub/index.js +14 -0
  312. package/dist/output/epub/index.js.map +1 -0
  313. package/dist/output/epub/model.d.ts +24 -0
  314. package/dist/output/epub/model.js +1 -0
  315. package/dist/output/epub/model.js.map +1 -0
  316. package/dist/output/epub/navigation.d.ts +10 -0
  317. package/dist/output/epub/navigation.js +39 -0
  318. package/dist/output/epub/navigation.js.map +1 -0
  319. package/dist/output/epub/package.d.ts +17 -0
  320. package/dist/output/epub/package.js +29 -0
  321. package/dist/output/epub/package.js.map +1 -0
  322. package/dist/output/epub/shared.d.ts +4 -0
  323. package/dist/output/epub/shared.js +12 -0
  324. package/dist/output/epub/shared.js.map +1 -0
  325. package/dist/output/epub/templates.d.ts +35 -0
  326. package/dist/output/epub/templates.js +26 -0
  327. package/dist/output/epub/templates.js.map +1 -0
  328. package/dist/output/index.d.ts +14 -0
  329. package/dist/output/index.js +11 -0
  330. package/dist/output/index.js.map +1 -0
  331. package/dist/output/plain-text.d.ts +18 -0
  332. package/dist/output/plain-text.js +56 -0
  333. package/dist/output/plain-text.js.map +1 -0
  334. package/dist/progress/index.d.ts +3 -0
  335. package/dist/progress/index.js +14 -0
  336. package/dist/progress/index.js.map +1 -0
  337. package/dist/progress/reporter.d.ts +10 -0
  338. package/dist/progress/reporter.js +79 -0
  339. package/dist/progress/reporter.js.map +1 -0
  340. package/dist/progress/tracker.d.ts +37 -0
  341. package/dist/progress/tracker.js +119 -0
  342. package/dist/progress/tracker.js.map +1 -0
  343. package/dist/progress/types.d.ts +28 -0
  344. package/dist/progress/types.js +1 -0
  345. package/dist/progress/types.js.map +1 -0
  346. package/dist/reader/attention/attention.d.ts +39 -0
  347. package/dist/reader/attention/attention.js +123 -0
  348. package/dist/reader/attention/attention.js.map +1 -0
  349. package/dist/reader/attention/index.d.ts +9 -0
  350. package/dist/reader/attention/index.js +5 -0
  351. package/dist/reader/attention/index.js.map +1 -0
  352. package/dist/reader/attention/wave-reflection.d.ts +21 -0
  353. package/dist/reader/attention/wave-reflection.js +153 -0
  354. package/dist/reader/attention/wave-reflection.js.map +1 -0
  355. package/dist/reader/attention/working-memory.d.ts +28 -0
  356. package/dist/reader/attention/working-memory.js +62 -0
  357. package/dist/reader/attention/working-memory.js.map +1 -0
  358. package/dist/reader/chunk-batch/extract.d.ts +13 -0
  359. package/dist/reader/chunk-batch/extract.js +14 -0
  360. package/dist/reader/chunk-batch/extract.js.map +1 -0
  361. package/dist/reader/chunk-batch/extractor.d.ts +17 -0
  362. package/dist/reader/chunk-batch/extractor.js +337 -0
  363. package/dist/reader/chunk-batch/extractor.js.map +1 -0
  364. package/dist/reader/chunk-batch/fragment-projection.d.ts +34 -0
  365. package/dist/reader/chunk-batch/fragment-projection.js +94 -0
  366. package/dist/reader/chunk-batch/fragment-projection.js.map +1 -0
  367. package/dist/reader/chunk-batch/index.d.ts +12 -0
  368. package/dist/reader/chunk-batch/index.js +13 -0
  369. package/dist/reader/chunk-batch/index.js.map +1 -0
  370. package/dist/reader/chunk-batch/language.d.ts +9 -0
  371. package/dist/reader/chunk-batch/language.js +23 -0
  372. package/dist/reader/chunk-batch/language.js.map +1 -0
  373. package/dist/reader/chunk-batch/parser.d.ts +94 -0
  374. package/dist/reader/chunk-batch/parser.js +640 -0
  375. package/dist/reader/chunk-batch/parser.js.map +1 -0
  376. package/dist/reader/chunk-batch/prompt-templates.d.ts +6 -0
  377. package/dist/reader/chunk-batch/prompt-templates.js +11 -0
  378. package/dist/reader/chunk-batch/prompt-templates.js.map +1 -0
  379. package/dist/reader/chunk-batch/types.d.ts +85 -0
  380. package/dist/reader/chunk-batch/types.js +1 -0
  381. package/dist/reader/chunk-batch/types.js.map +1 -0
  382. package/dist/reader/index.d.ts +13 -0
  383. package/dist/reader/index.js +7 -0
  384. package/dist/reader/index.js.map +1 -0
  385. package/dist/reader/reader.d.ts +37 -0
  386. package/dist/reader/reader.js +82 -0
  387. package/dist/reader/reader.js.map +1 -0
  388. package/dist/reader/segment/index.d.ts +2 -0
  389. package/dist/reader/segment/index.js +5 -0
  390. package/dist/reader/segment/index.js.map +1 -0
  391. package/dist/reader/segment/intl-segmenter.d.ts +5 -0
  392. package/dist/reader/segment/intl-segmenter.js +102 -0
  393. package/dist/reader/segment/intl-segmenter.js.map +1 -0
  394. package/dist/reader/segment/segment.d.ts +5 -0
  395. package/dist/reader/segment/segment.js +9 -0
  396. package/dist/reader/segment/segment.js.map +1 -0
  397. package/dist/reader/segment/types.d.ts +14 -0
  398. package/dist/reader/segment/types.js +1 -0
  399. package/dist/reader/segment/types.js.map +1 -0
  400. package/dist/reader/types.d.ts +29 -0
  401. package/dist/reader/types.js +1 -0
  402. package/dist/reader/types.js.map +1 -0
  403. package/dist/serial.d.ts +89 -0
  404. package/dist/serial.js +476 -0
  405. package/dist/serial.js.map +1 -0
  406. package/dist/source/adapter.d.ts +15 -0
  407. package/dist/source/adapter.js +1 -0
  408. package/dist/source/adapter.js.map +1 -0
  409. package/dist/source/epub/archive.d.ts +27 -0
  410. package/dist/source/epub/archive.js +189 -0
  411. package/dist/source/epub/archive.js.map +1 -0
  412. package/dist/source/epub/content.d.ts +22 -0
  413. package/dist/source/epub/content.js +183 -0
  414. package/dist/source/epub/content.js.map +1 -0
  415. package/dist/source/epub/document.d.ts +55 -0
  416. package/dist/source/epub/document.js +179 -0
  417. package/dist/source/epub/document.js.map +1 -0
  418. package/dist/source/epub/index.d.ts +10 -0
  419. package/dist/source/epub/index.js +6 -0
  420. package/dist/source/epub/index.js.map +1 -0
  421. package/dist/source/epub/navigation.d.ts +16 -0
  422. package/dist/source/epub/navigation.js +215 -0
  423. package/dist/source/epub/navigation.js.map +1 -0
  424. package/dist/source/epub/package.d.ts +33 -0
  425. package/dist/source/epub/package.js +237 -0
  426. package/dist/source/epub/package.js.map +1 -0
  427. package/dist/source/epub/xml.d.ts +16 -0
  428. package/dist/source/epub/xml.js +111 -0
  429. package/dist/source/epub/xml.js.map +1 -0
  430. package/dist/source/index.d.ts +12 -0
  431. package/dist/source/index.js +32 -0
  432. package/dist/source/index.js.map +1 -0
  433. package/dist/source/meta.d.ts +30 -0
  434. package/dist/source/meta.js +22 -0
  435. package/dist/source/meta.js.map +1 -0
  436. package/dist/source/plain-text.d.ts +16 -0
  437. package/dist/source/plain-text.js +86 -0
  438. package/dist/source/plain-text.js.map +1 -0
  439. package/dist/source/toc.d.ts +16 -0
  440. package/dist/source/toc.js +17 -0
  441. package/dist/source/toc.js.map +1 -0
  442. package/dist/source/types.d.ts +16 -0
  443. package/dist/source/types.js +1 -0
  444. package/dist/source/types.js.map +1 -0
  445. package/dist/topology/grouping.d.ts +15 -0
  446. package/dist/topology/grouping.js +18 -0
  447. package/dist/topology/grouping.js.map +1 -0
  448. package/dist/topology/index.d.ts +21 -0
  449. package/dist/topology/index.js +5 -0
  450. package/dist/topology/index.js.map +1 -0
  451. package/dist/topology/resource-segmentation.d.ts +13 -0
  452. package/dist/topology/resource-segmentation.js +111 -0
  453. package/dist/topology/resource-segmentation.js.map +1 -0
  454. package/dist/topology/segment-incision.d.ts +18 -0
  455. package/dist/topology/segment-incision.js +197 -0
  456. package/dist/topology/segment-incision.js.map +1 -0
  457. package/dist/topology/snake-detector.d.ts +13 -0
  458. package/dist/topology/snake-detector.js +520 -0
  459. package/dist/topology/snake-detector.js.map +1 -0
  460. package/dist/topology/snake-graph-builder.d.ts +14 -0
  461. package/dist/topology/snake-graph-builder.js +76 -0
  462. package/dist/topology/snake-graph-builder.js.map +1 -0
  463. package/dist/topology/topology.d.ts +29 -0
  464. package/dist/topology/topology.js +348 -0
  465. package/dist/topology/topology.js.map +1 -0
  466. package/dist/topology/weights.d.ts +10 -0
  467. package/dist/topology/weights.js +84 -0
  468. package/dist/topology/weights.js.map +1 -0
  469. package/dist/types-FVIqiLC9.d.cts +24 -0
  470. package/dist/utils/async-semaphore.d.ts +7 -0
  471. package/dist/utils/async-semaphore.js +40 -0
  472. package/dist/utils/async-semaphore.js.map +1 -0
  473. package/dist/utils/enum.d.ts +5 -0
  474. package/dist/utils/enum.js +18 -0
  475. package/dist/utils/enum.js.map +1 -0
  476. package/dist/utils/hash.d.ts +3 -0
  477. package/dist/utils/hash.js +132 -0
  478. package/dist/utils/hash.js.map +1 -0
  479. package/dist/utils/node-error.d.ts +4 -0
  480. package/dist/utils/node-error.js +59 -0
  481. package/dist/utils/node-error.js.map +1 -0
  482. package/dist/wikg/archive-uri.d.ts +1 -0
  483. package/dist/wikg/archive-uri.js +37 -0
  484. package/dist/wikg/archive-uri.js.map +1 -0
  485. package/dist/wikg/archive.d.ts +28 -0
  486. package/dist/wikg/archive.js +496 -0
  487. package/dist/wikg/archive.js.map +1 -0
  488. package/dist/wikg/index.d.ts +31 -0
  489. package/dist/wikg/index.js +60 -0
  490. package/dist/wikg/index.js.map +1 -0
  491. package/dist/wikg/wikg-coordinator.d.ts +45 -0
  492. package/dist/wikg/wikg-coordinator.js +1687 -0
  493. package/dist/wikg/wikg-coordinator.js.map +1 -0
  494. package/dist/wikg/wiki-graph-archive-file.d.ts +42 -0
  495. package/dist/wikg/wiki-graph-archive-file.js +78 -0
  496. package/dist/wikg/wiki-graph-archive-file.js.map +1 -0
  497. package/dist/wikilink/index.d.ts +10 -0
  498. package/dist/wikilink/index.js +7 -0
  499. package/dist/wikilink/index.js.map +1 -0
  500. package/dist/wikilink/relation-discovery.d.ts +31 -0
  501. package/dist/wikilink/relation-discovery.js +477 -0
  502. package/dist/wikilink/relation-discovery.js.map +1 -0
  503. package/dist/wikilink/types.d.ts +23 -0
  504. package/dist/wikilink/types.js +1 -0
  505. package/dist/wikilink/types.js.map +1 -0
  506. package/dist/wikilink/window.d.ts +7 -0
  507. package/dist/wikilink/window.js +53 -0
  508. package/dist/wikilink/window.js.map +1 -0
  509. package/dist/wikimatch/enrichment.d.ts +10 -0
  510. package/dist/wikimatch/enrichment.js +55 -0
  511. package/dist/wikimatch/enrichment.js.map +1 -0
  512. package/dist/wikimatch/index.d.ts +16 -0
  513. package/dist/wikimatch/index.js +66 -0
  514. package/dist/wikimatch/index.js.map +1 -0
  515. package/dist/wikimatch/option-narrowing.d.ts +17 -0
  516. package/dist/wikimatch/option-narrowing.js +208 -0
  517. package/dist/wikimatch/option-narrowing.js.map +1 -0
  518. package/dist/wikimatch/options.d.ts +14 -0
  519. package/dist/wikimatch/options.js +155 -0
  520. package/dist/wikimatch/options.js.map +1 -0
  521. package/dist/wikimatch/policy-judge.d.ts +17 -0
  522. package/dist/wikimatch/policy-judge.js +430 -0
  523. package/dist/wikimatch/policy-judge.js.map +1 -0
  524. package/dist/wikimatch/range-suppression.d.ts +9 -0
  525. package/dist/wikimatch/range-suppression.js +27 -0
  526. package/dist/wikimatch/range-suppression.js.map +1 -0
  527. package/dist/wikimatch/surface-screening.d.ts +16 -0
  528. package/dist/wikimatch/surface-screening.js +168 -0
  529. package/dist/wikimatch/surface-screening.js.map +1 -0
  530. package/dist/wikimatch/surface-window.d.ts +6 -0
  531. package/dist/wikimatch/surface-window.js +44 -0
  532. package/dist/wikimatch/surface-window.js.map +1 -0
  533. package/dist/wikimatch/types.d.ts +151 -0
  534. package/dist/wikimatch/types.js +1 -0
  535. package/dist/wikimatch/types.js.map +1 -0
  536. package/dist/wikimatch/wikispine.d.ts +43 -0
  537. package/dist/wikimatch/wikispine.js +399 -0
  538. package/dist/wikimatch/wikispine.js.map +1 -0
  539. package/dist/wikimatch/window.d.ts +6 -0
  540. package/dist/wikimatch/window.js +83 -0
  541. package/dist/wikimatch/window.js.map +1 -0
  542. package/dist/wikimatch/words.d.ts +16 -0
  543. package/dist/wikimatch/words.js +66 -0
  544. package/dist/wikimatch/words.js.map +1 -0
  545. package/dist/wikipage/cache.d.ts +18 -0
  546. package/dist/wikipage/cache.js +404 -0
  547. package/dist/wikipage/cache.js.map +1 -0
  548. package/dist/wikipage/fetch-log.d.ts +17 -0
  549. package/dist/wikipage/fetch-log.js +143 -0
  550. package/dist/wikipage/fetch-log.js.map +1 -0
  551. package/dist/wikipage/index.d.ts +14 -0
  552. package/dist/wikipage/index.js +17 -0
  553. package/dist/wikipage/index.js.map +1 -0
  554. package/dist/wikipage/normalizer.d.ts +14 -0
  555. package/dist/wikipage/normalizer.js +147 -0
  556. package/dist/wikipage/normalizer.js.map +1 -0
  557. package/dist/wikipage/rate-limiter.d.ts +13 -0
  558. package/dist/wikipage/rate-limiter.js +84 -0
  559. package/dist/wikipage/rate-limiter.js.map +1 -0
  560. package/dist/wikipage/resolver.d.ts +26 -0
  561. package/dist/wikipage/resolver.js +325 -0
  562. package/dist/wikipage/resolver.js.map +1 -0
  563. package/dist/wikipage/types.d.ts +96 -0
  564. package/dist/wikipage/types.js +1 -0
  565. package/dist/wikipage/types.js.map +1 -0
  566. package/dist/wikipage/wikimedia-client.d.ts +48 -0
  567. package/dist/wikipage/wikimedia-client.js +397 -0
  568. package/dist/wikipage/wikimedia-client.js.map +1 -0
  569. package/dist/worker-BgQ0Xl8T.d.cts +181 -0
  570. package/dist/worker.cjs +5259 -0
  571. package/dist/worker.cjs.map +1 -0
  572. package/dist/worker.d.cts +2 -0
  573. package/dist/worker.d.ts +2 -0
  574. package/dist/worker.js +5 -0
  575. package/dist/worker.js.map +1 -0
  576. package/package.json +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/evidence-selection/anchor-resolver.ts"],"sourcesContent":["import type { SentenceId } from \"../document/index.js\";\nimport type {\n EvidenceResolutionFailure,\n EvidenceResolutionResult,\n RankedSentenceCandidate,\n} from \"./anchor-types.js\";\nimport { normalizeText, splitTextIntoSentences } from \"./text.js\";\n\nconst MIN_AUTO_RESOLVE_GAP = 0.07;\nconst MIN_AUTO_RESOLVE_SCORE = 0.9;\nconst MIN_BOUNDARY_BONUS_LENGTH = 12;\nconst MIN_CANDIDATE_SCORE = 0.55;\nconst VERY_HIGH_CONFIDENCE_SCORE = 0.97;\nconst MAX_BOUNDARY_BONUS = 0.08;\nconst MAX_CANDIDATE_DISPLAY = 3;\n\ninterface AnchorSpec {\n readonly mode: \"full\" | \"head_tail\";\n readonly text?: string;\n readonly head?: string;\n readonly tail?: string;\n}\n\ninterface TextMatchScore {\n readonly score: number;\n readonly exactRaw: boolean;\n readonly exactNormalized: boolean;\n readonly exactSubstring: boolean;\n readonly matchStart: number;\n readonly matchEnd: number;\n}\n\nexport class EvidenceResolver {\n public resolve(\n evidence: Record<string, unknown>,\n candidateSentenceIds: readonly SentenceId[],\n candidateTexts: readonly string[],\n ): readonly [\n result: EvidenceResolutionResult | undefined,\n failure: EvidenceResolutionFailure | undefined,\n ] {\n const startValue = evidence.start_anchor ?? evidence.start;\n const endValue = evidence.end_anchor ?? evidence.end;\n\n const [startAnchor, startFailure] = this.parseAnchor(\n startValue,\n \"start_anchor\",\n );\n\n if (startFailure !== undefined) {\n return [undefined, startFailure];\n }\n\n let endAnchor: AnchorSpec | undefined;\n\n if (endValue !== undefined) {\n const [parsedEndAnchor, endFailure] = this.parseAnchor(\n endValue,\n \"end_anchor\",\n );\n\n if (endFailure !== undefined) {\n return [undefined, endFailure];\n }\n\n endAnchor = parsedEndAnchor;\n }\n\n const [startCandidate, startStrategy, startResolveFailure] =\n this.resolveAnchor({\n anchor: startAnchor,\n candidateSentenceIds,\n candidateTexts,\n label: \"start_anchor\",\n });\n\n if (startResolveFailure !== undefined) {\n return [undefined, startResolveFailure];\n }\n\n if (startCandidate === undefined) {\n return [\n undefined,\n {\n candidates: [],\n code: \"none\",\n fieldName: \"start_anchor\",\n message: \"start_anchor could not be matched: no candidate selected\",\n },\n ];\n }\n\n if (endAnchor === undefined) {\n return [\n {\n confidence: startCandidate.score,\n sentenceIds: [startCandidate.sentenceId],\n strategy: startStrategy,\n },\n undefined,\n ];\n }\n\n const [endCandidate, endStrategy, endResolveFailure] = this.resolveAnchor({\n anchor: endAnchor,\n candidateSentenceIds,\n candidateTexts,\n label: \"end_anchor\",\n minIndex: startCandidate.index,\n });\n\n if (endResolveFailure !== undefined) {\n return [undefined, endResolveFailure];\n }\n\n if (endCandidate === undefined) {\n return [\n undefined,\n {\n candidates: [],\n code: \"none\",\n fieldName: \"end_anchor\",\n message: \"end_anchor could not be matched: no candidate selected\",\n },\n ];\n }\n\n if (endCandidate.index < startCandidate.index) {\n return [\n undefined,\n {\n candidates: [],\n code: \"invalid_range\",\n fieldName: \"end_anchor\",\n message:\n \"Invalid evidence range: end_anchor resolved before start_anchor \" +\n `(${startCandidate.occurrenceId} -> ${endCandidate.occurrenceId}).`,\n },\n ];\n }\n\n return [\n {\n confidence: Math.min(startCandidate.score, endCandidate.score),\n sentenceIds: candidateSentenceIds.slice(\n startCandidate.index,\n endCandidate.index + 1,\n ),\n strategy: `${startStrategy}+${endStrategy}`,\n },\n undefined,\n ];\n }\n\n public resolveWithOverrides(input: {\n evidence: Record<string, unknown>;\n candidateSentenceIds: readonly SentenceId[];\n candidateTexts: readonly string[];\n overrides: Partial<\n Readonly<Record<\"start_anchor\" | \"end_anchor\", RankedSentenceCandidate>>\n >;\n }): readonly [\n result: EvidenceResolutionResult | undefined,\n failure: EvidenceResolutionFailure | undefined,\n ] {\n const startValue = input.evidence.start_anchor ?? input.evidence.start;\n const endValue = input.evidence.end_anchor ?? input.evidence.end;\n\n const [startAnchor, startFailure] = this.parseAnchor(\n startValue,\n \"start_anchor\",\n );\n\n if (startFailure !== undefined) {\n return [undefined, startFailure];\n }\n\n const startCandidateOverride = input.overrides.start_anchor;\n const [startCandidate, startStrategy, startResolveFailure] =\n startCandidateOverride === undefined\n ? this.resolveAnchor({\n anchor: startAnchor,\n candidateSentenceIds: input.candidateSentenceIds,\n candidateTexts: input.candidateTexts,\n label: \"start_anchor\",\n })\n : [startCandidateOverride, \"choice_final\", undefined];\n\n if (startResolveFailure !== undefined) {\n return [undefined, startResolveFailure];\n }\n\n if (startCandidate === undefined) {\n return [\n undefined,\n {\n candidates: [],\n code: \"none\",\n fieldName: \"start_anchor\",\n message: \"start_anchor could not be matched: no candidate selected\",\n },\n ];\n }\n\n if (endValue === undefined) {\n return [\n {\n confidence: startCandidate.score,\n sentenceIds: [startCandidate.sentenceId],\n strategy: startStrategy,\n },\n undefined,\n ];\n }\n\n const [endAnchor, endFailure] = this.parseAnchor(endValue, \"end_anchor\");\n\n if (endFailure !== undefined) {\n return [undefined, endFailure];\n }\n\n const endCandidateOverride = input.overrides.end_anchor;\n const [endCandidate, endStrategy, endResolveFailure] =\n endCandidateOverride === undefined\n ? this.resolveAnchor({\n anchor: endAnchor,\n candidateSentenceIds: input.candidateSentenceIds,\n candidateTexts: input.candidateTexts,\n label: \"end_anchor\",\n minIndex: startCandidate.index,\n })\n : [endCandidateOverride, \"choice_final\", undefined];\n\n if (endResolveFailure !== undefined) {\n return [undefined, endResolveFailure];\n }\n\n if (endCandidate === undefined) {\n return [\n undefined,\n {\n candidates: [],\n code: \"none\",\n fieldName: \"end_anchor\",\n message: \"end_anchor could not be matched: no candidate selected\",\n },\n ];\n }\n\n if (endCandidate.index < startCandidate.index) {\n return [\n undefined,\n {\n candidates: [],\n code: \"invalid_range\",\n fieldName: \"end_anchor\",\n message:\n \"Invalid evidence range: end_anchor resolved before start_anchor \" +\n `(${startCandidate.occurrenceId} -> ${endCandidate.occurrenceId}).`,\n },\n ];\n }\n\n return [\n {\n confidence: Math.min(startCandidate.score, endCandidate.score),\n sentenceIds: input.candidateSentenceIds.slice(\n startCandidate.index,\n endCandidate.index + 1,\n ),\n strategy: `${startStrategy}+${endStrategy}`,\n },\n undefined,\n ];\n }\n\n public parseAnchor(\n value: unknown,\n fieldName: string,\n ): readonly [\n anchor: AnchorSpec | undefined,\n failure: EvidenceResolutionFailure | undefined,\n ] {\n const [anchor, error] = this.#parseAnchor(value);\n\n if (error !== undefined) {\n return [\n undefined,\n {\n candidates: [],\n code: \"invalid_anchor\",\n fieldName,\n message: `Invalid evidence.${fieldName}: ${error}`,\n },\n ];\n }\n\n return [this.#normalizeAnchor(anchor, fieldName), undefined];\n }\n\n public resolveAnchor(input: {\n anchor: AnchorSpec | undefined;\n candidateSentenceIds: readonly SentenceId[];\n candidateTexts: readonly string[];\n label: string;\n minIndex?: number;\n }): readonly [\n candidate: RankedSentenceCandidate | undefined,\n strategy: string,\n failure: EvidenceResolutionFailure | undefined,\n ] {\n if (input.anchor === undefined) {\n return [\n undefined,\n \"invalid\",\n {\n candidates: [],\n code: \"invalid\",\n fieldName: input.label,\n message: `${input.label} is missing`,\n },\n ];\n }\n\n let candidates = this.rankAnchor(\n input.anchor,\n input.candidateSentenceIds,\n input.candidateTexts,\n input.label,\n );\n\n const minIndex = input.minIndex;\n\n if (minIndex !== undefined) {\n candidates = candidates.filter(\n (candidate) => candidate.index >= minIndex,\n );\n }\n\n if (candidates.length === 0) {\n return [\n undefined,\n \"none\",\n {\n candidates: [],\n code: \"none\",\n fieldName: input.label,\n message: `${input.label} could not be matched: no candidates available`,\n },\n ];\n }\n\n const exactRaw = candidates.filter((candidate) => candidate.exactRaw);\n\n if (exactRaw.length === 1) {\n return [exactRaw[0], \"exact_raw\", undefined];\n }\n\n if (exactRaw.length > 1) {\n return [\n undefined,\n \"ambiguous_exact_raw\",\n this.#buildAmbiguousFailure(\n input.label,\n \"ambiguous_exact_raw\",\n exactRaw,\n ),\n ];\n }\n\n const exactSubstring = candidates.filter(\n (candidate) => candidate.exactSubstring,\n );\n\n if (exactSubstring.length === 1 && this.#anchorLength(input.anchor) >= 8) {\n return [exactSubstring[0], \"exact_substring\", undefined];\n }\n\n if (exactSubstring.length > 1 && this.#anchorLength(input.anchor) >= 8) {\n const selected = this.#tryAutoSelectScoredDuplicates(exactSubstring);\n\n if (selected !== undefined) {\n return [selected, \"exact_substring_scored\", undefined];\n }\n\n return [\n undefined,\n \"ambiguous_exact_substring\",\n this.#buildAmbiguousFailure(\n input.label,\n \"ambiguous_exact_substring\",\n exactSubstring,\n ),\n ];\n }\n\n const exactNormalized = candidates.filter(\n (candidate) => candidate.exactNormalized,\n );\n\n if (exactNormalized.length === 1) {\n return [exactNormalized[0], \"exact_normalized\", undefined];\n }\n\n if (exactNormalized.length > 1) {\n const selected = this.#tryAutoSelectScoredDuplicates(exactNormalized);\n\n if (selected !== undefined) {\n return [selected, \"exact_normalized_scored\", undefined];\n }\n\n return [\n undefined,\n \"ambiguous_exact_normalized\",\n this.#buildAmbiguousFailure(\n input.label,\n \"ambiguous_exact_normalized\",\n exactNormalized,\n ),\n ];\n }\n\n const topCandidate = candidates[0];\n\n if (topCandidate === undefined) {\n return [\n undefined,\n \"none\",\n {\n candidates: [],\n code: \"none\",\n fieldName: input.label,\n message: `${input.label} could not be matched: no candidates available`,\n },\n ];\n }\n\n const secondScore = candidates[1]?.score ?? 0;\n const gap = topCandidate.score - secondScore;\n\n if (topCandidate.score < MIN_CANDIDATE_SCORE) {\n return [\n undefined,\n \"low_confidence\",\n {\n candidates: candidates.slice(0, MAX_CANDIDATE_DISPLAY),\n code: \"low_confidence\",\n fieldName: input.label,\n message:\n `${input.label} could not be matched confidently. ` +\n `Best candidate score=${topCandidate.score.toFixed(3)}.`,\n },\n ];\n }\n\n if (candidates.length === 1) {\n return [topCandidate, \"auto_top1_single_candidate\", undefined];\n }\n\n if (topCandidate.score >= VERY_HIGH_CONFIDENCE_SCORE) {\n return [topCandidate, \"auto_top1_very_high\", undefined];\n }\n\n if (\n topCandidate.score >= MIN_AUTO_RESOLVE_SCORE &&\n gap >= MIN_AUTO_RESOLVE_GAP\n ) {\n return [topCandidate, \"auto_top1\", undefined];\n }\n\n return [\n undefined,\n \"ambiguous_ranked\",\n this.#buildAmbiguousFailure(input.label, \"ambiguous_ranked\", candidates),\n ];\n }\n\n public rankAnchor(\n anchor: AnchorSpec,\n candidateSentenceIds: readonly SentenceId[],\n candidateTexts: readonly string[],\n label: string,\n ): RankedSentenceCandidate[] {\n const ranked: RankedSentenceCandidate[] = [];\n\n for (const [index, sentenceId] of candidateSentenceIds.entries()) {\n const text = candidateTexts[index] ?? \"\";\n const prevText = index > 0 ? (candidateTexts[index - 1] ?? \"\") : \"\";\n const nextText =\n index < candidateTexts.length - 1\n ? (candidateTexts[index + 1] ?? \"\")\n : \"\";\n const match = this.#scoreAnchor(anchor, text, label);\n\n ranked.push({\n exactNormalized: match.exactNormalized,\n exactRaw: match.exactRaw,\n exactSubstring: match.exactSubstring,\n index,\n nextText,\n occurrenceId: `S${index + 1}`,\n prevText,\n score: match.score,\n sentenceId,\n text,\n });\n }\n\n ranked.sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n\n if (left.exactRaw !== right.exactRaw) {\n return left.exactRaw ? -1 : 1;\n }\n\n if (left.exactSubstring !== right.exactSubstring) {\n return left.exactSubstring ? -1 : 1;\n }\n\n if (left.exactNormalized !== right.exactNormalized) {\n return left.exactNormalized ? -1 : 1;\n }\n\n return left.index - right.index;\n });\n\n return ranked;\n }\n\n #scoreAnchor(\n anchor: AnchorSpec,\n candidateText: string,\n label: string,\n ): TextMatchScore {\n if (anchor.mode === \"head_tail\") {\n return this.#scoreHeadTail(anchor, candidateText);\n }\n\n return this.#scoreTextQuery(anchor.text ?? \"\", candidateText, label);\n }\n\n #scoreHeadTail(anchor: AnchorSpec, candidateText: string): TextMatchScore {\n const head = anchor.head ?? \"\";\n const tail = anchor.tail ?? \"\";\n const candidateNormalized = normalizeText(candidateText);\n const headNormalized = normalizeText(head);\n const tailNormalized = normalizeText(tail);\n\n if (headNormalized === \"\" || tailNormalized === \"\") {\n return createEmptyTextMatchScore();\n }\n\n const headPosition = candidateNormalized.indexOf(headNormalized);\n const tailPosition = candidateNormalized.lastIndexOf(tailNormalized);\n\n if (\n headPosition !== -1 &&\n tailPosition !== -1 &&\n headPosition <= tailPosition\n ) {\n const coveredChars = headNormalized.length + tailNormalized.length;\n const coverage = Math.min(\n 1,\n coveredChars / Math.max(1, candidateNormalized.length),\n );\n\n return {\n exactNormalized: false,\n exactRaw: false,\n exactSubstring: true,\n matchEnd: tailPosition + tailNormalized.length,\n matchStart: headPosition,\n score: 0.82 + 0.18 * coverage,\n };\n }\n\n const headMatch = this.#scoreTextQuery(head, candidateText, \"start_anchor\");\n const tailMatch = this.#scoreTextQuery(tail, candidateText, \"end_anchor\");\n const ordered = headMatch.matchStart <= tailMatch.matchStart ? 1 : 0.85;\n\n return {\n exactNormalized: false,\n exactRaw: false,\n exactSubstring: false,\n matchEnd: Math.max(headMatch.matchEnd, tailMatch.matchEnd),\n matchStart: Math.min(headMatch.matchStart, tailMatch.matchStart),\n score: ((headMatch.score + tailMatch.score) / 2) * ordered,\n };\n }\n\n #scoreTextQuery(\n queryText: string,\n candidateText: string,\n label: string,\n ): TextMatchScore {\n const queryRaw = queryText.trim();\n const candidateRaw = candidateText.trim();\n const queryNormalized = normalizeText(queryRaw);\n const candidateNormalized = normalizeText(candidateRaw);\n\n if (queryNormalized === \"\" || candidateNormalized === \"\") {\n return createEmptyTextMatchScore();\n }\n\n if (queryRaw === candidateRaw) {\n return {\n exactNormalized: true,\n exactRaw: true,\n exactSubstring: true,\n matchEnd: candidateNormalized.length,\n matchStart: 0,\n score: 1,\n };\n }\n\n if (queryNormalized === candidateNormalized) {\n return {\n exactNormalized: true,\n exactRaw: false,\n exactSubstring: false,\n matchEnd: candidateNormalized.length,\n matchStart: 0,\n score: 0.995,\n };\n }\n\n if (candidateNormalized.includes(queryNormalized)) {\n const matchStart = candidateNormalized.indexOf(queryNormalized);\n const coverage =\n queryNormalized.length / Math.max(1, candidateNormalized.length);\n const boundaryBonus = this.#boundaryBonus({\n candidateNormalized,\n label,\n matchEnd: matchStart + queryNormalized.length,\n matchStart,\n queryNormalized,\n });\n\n return {\n exactNormalized: false,\n exactRaw: false,\n exactSubstring: true,\n matchEnd: matchStart + queryNormalized.length,\n matchStart,\n score: Math.min(1, 0.75 + 0.25 * coverage + boundaryBonus),\n };\n }\n\n if (queryNormalized.includes(candidateNormalized)) {\n const coverage =\n candidateNormalized.length / Math.max(1, queryNormalized.length);\n\n return {\n exactNormalized: false,\n exactRaw: false,\n exactSubstring: false,\n matchEnd: candidateNormalized.length,\n matchStart: 0,\n score: Math.min(0.92, 0.78 + 0.14 * coverage),\n };\n }\n\n let bestScore = 0;\n let bestStart = -1;\n let bestEnd = -1;\n const maxWindow = Math.min(\n candidateNormalized.length,\n Math.max(\n queryNormalized.length,\n Math.floor(queryNormalized.length * 1.2),\n ),\n );\n const minWindow = Math.min(\n maxWindow,\n Math.max(1, Math.floor(queryNormalized.length * 0.8)),\n );\n const queryChars = new Set(queryNormalized);\n\n for (let windowSize = minWindow; windowSize <= maxWindow; windowSize += 1) {\n for (\n let start = 0;\n start <= candidateNormalized.length - windowSize;\n start += 1\n ) {\n const window = candidateNormalized.slice(start, start + windowSize);\n const windowChars = new Set(window);\n const unionSize = new Set([...queryChars, ...windowChars]).size;\n const overlapSize = [...queryChars].filter((char) =>\n windowChars.has(char),\n ).length;\n const jaccard = unionSize === 0 ? 0 : overlapSize / unionSize;\n\n if (jaccard < 0.35) {\n continue;\n }\n\n const totalScore =\n 0.35 * charNgramScore(queryNormalized, window) +\n 0.35 * sequenceSimilarity(queryNormalized, window) +\n 0.2 * levenshteinSimilarity(queryNormalized, window) +\n 0.1 * lengthPenalty(queryNormalized, window) +\n this.#boundaryBonus({\n candidateNormalized,\n label,\n matchEnd: start + windowSize,\n matchStart: start,\n queryNormalized,\n });\n\n if (totalScore > bestScore) {\n bestScore = Math.min(1, totalScore);\n bestStart = start;\n bestEnd = start + windowSize;\n }\n }\n }\n\n return {\n exactNormalized: false,\n exactRaw: false,\n exactSubstring: false,\n matchEnd: bestEnd,\n matchStart: bestStart,\n score: bestScore,\n };\n }\n\n #parseAnchor(\n value: unknown,\n ): readonly [anchor: AnchorSpec | undefined, error: string | undefined] {\n if (value === undefined || value === null) {\n return [undefined, \"anchor is required\"];\n }\n\n if (typeof value === \"string\") {\n const stripped = value.trim();\n\n if (stripped === \"\") {\n return [undefined, \"anchor string is empty\"];\n }\n\n if (stripped.includes(\"...\")) {\n const parts = stripped\n .split(\"...\")\n .map((part) => part.trim())\n .filter((part) => part !== \"\");\n\n if (parts.length >= 2) {\n const head = parts[0];\n const tail = parts[parts.length - 1];\n\n if (head === undefined || tail === undefined) {\n return [undefined, \"anchor string is empty\"];\n }\n\n return [\n {\n head,\n mode: \"head_tail\",\n tail,\n },\n undefined,\n ];\n }\n }\n\n return [{ mode: \"full\", text: stripped }, undefined];\n }\n\n if (typeof value !== \"object\") {\n return [undefined, `expected string or object, got ${typeof value}`];\n }\n\n const rawValue = value as Record<string, unknown>;\n const mode =\n rawValue.mode === \"head_tail\" || rawValue.head !== undefined\n ? \"head_tail\"\n : \"full\";\n\n if (mode === \"full\") {\n const text =\n typeof rawValue.text === \"string\" ? rawValue.text.trim() : \"\";\n\n if (text === \"\") {\n return [undefined, \"full anchor requires non-empty 'text'\"];\n }\n\n return [{ mode: \"full\", text }, undefined];\n }\n\n const head = typeof rawValue.head === \"string\" ? rawValue.head.trim() : \"\";\n const tail = typeof rawValue.tail === \"string\" ? rawValue.tail.trim() : \"\";\n\n if (head !== \"\" && tail === \"\") {\n return [{ mode: \"full\", text: head }, undefined];\n }\n\n if (head === \"\" && tail !== \"\") {\n return [{ mode: \"full\", text: tail }, undefined];\n }\n\n if (head === \"\" || tail === \"\") {\n return [\n undefined,\n \"head_tail anchor requires non-empty 'head' and 'tail'\",\n ];\n }\n\n return [{ head, mode: \"head_tail\", tail }, undefined];\n }\n\n #normalizeAnchor(\n anchor: AnchorSpec | undefined,\n fieldName: string,\n ): AnchorSpec | undefined {\n if (anchor === undefined) {\n return undefined;\n }\n\n if (anchor.mode === \"head_tail\") {\n const boundaryText =\n fieldName === \"end_anchor\"\n ? this.#selectBoundarySentence(anchor.tail ?? \"\", \"end_anchor\")\n : this.#selectBoundarySentence(anchor.head ?? \"\", \"start_anchor\");\n\n return boundaryText === \"\"\n ? undefined\n : {\n mode: \"full\",\n text: boundaryText,\n };\n }\n\n const normalizedText = this.#selectBoundarySentence(\n anchor.text ?? \"\",\n fieldName,\n );\n\n return {\n mode: \"full\",\n text: normalizedText,\n };\n }\n\n #selectBoundarySentence(text: string, fieldName: string): string {\n const sentences = splitTextIntoSentences(text);\n\n if (sentences.length <= 1) {\n return text.trim();\n }\n\n return fieldName === \"end_anchor\"\n ? (sentences[sentences.length - 1] ?? text.trim())\n : (sentences[0] ?? text.trim());\n }\n\n #boundaryBonus(input: {\n label: string;\n queryNormalized: string;\n candidateNormalized: string;\n matchStart: number;\n matchEnd: number;\n }): number {\n if (input.matchStart < 0 || input.matchEnd < 0) {\n return 0;\n }\n\n if (input.queryNormalized.length < MIN_BOUNDARY_BONUS_LENGTH) {\n return 0;\n }\n\n if (input.label === \"start_anchor\" && input.matchStart !== 0) {\n return 0;\n }\n\n if (\n input.label === \"end_anchor\" &&\n input.matchEnd !== input.candidateNormalized.length\n ) {\n return 0;\n }\n\n const coverage =\n input.queryNormalized.length /\n Math.max(1, input.candidateNormalized.length);\n\n return MAX_BOUNDARY_BONUS * (0.5 + 0.5 * Math.min(1, coverage));\n }\n\n #tryAutoSelectScoredDuplicates(\n candidates: readonly RankedSentenceCandidate[],\n ): RankedSentenceCandidate | undefined {\n if (candidates.length === 0) {\n return undefined;\n }\n\n if (candidates.length === 1) {\n return candidates[0];\n }\n\n const topCandidate = candidates[0];\n\n if (topCandidate === undefined) {\n return undefined;\n }\n\n const secondScore = candidates[1]?.score ?? 0;\n\n if (\n topCandidate.score >= MIN_AUTO_RESOLVE_SCORE &&\n topCandidate.score - secondScore >= MIN_AUTO_RESOLVE_GAP\n ) {\n return topCandidate;\n }\n\n return undefined;\n }\n\n #buildAmbiguousFailure(\n label: string,\n code: string,\n candidates: readonly RankedSentenceCandidate[],\n ): EvidenceResolutionFailure {\n const topCandidates = candidates.slice(0, MAX_CANDIDATE_DISPLAY);\n const formatted = topCandidates\n .map((candidate) => formatCandidate(candidate))\n .join(\"\\n\");\n\n return {\n candidates: topCandidates,\n code,\n fieldName: label,\n message:\n `${label} is ambiguous. Top candidates:\\n${formatted}\\n` +\n \"Please provide a more specific anchor or surrounding context.\",\n };\n }\n\n #anchorLength(anchor: AnchorSpec): number {\n if (anchor.mode === \"head_tail\") {\n return (\n normalizeText(anchor.head ?? \"\").length +\n normalizeText(anchor.tail ?? \"\").length\n );\n }\n\n return normalizeText(anchor.text ?? \"\").length;\n }\n}\n\nfunction createEmptyTextMatchScore(): TextMatchScore {\n return {\n exactNormalized: false,\n exactRaw: false,\n exactSubstring: false,\n matchEnd: -1,\n matchStart: -1,\n score: 0,\n };\n}\n\nfunction charNgramScore(left: string, right: string): number {\n const leftBigrams = charNgrams(left, 2);\n const rightBigrams = charNgrams(right, 2);\n const leftTrigrams = charNgrams(left, 3);\n const rightTrigrams = charNgrams(right, 3);\n\n return (\n (diceCoefficient(leftBigrams, rightBigrams) +\n diceCoefficient(leftTrigrams, rightTrigrams)) /\n 2\n );\n}\n\nfunction charNgrams(text: string, size: number): Set<string> {\n if (text.length <= size) {\n return text === \"\" ? new Set() : new Set([text]);\n }\n\n const result = new Set<string>();\n\n for (let index = 0; index <= text.length - size; index += 1) {\n result.add(text.slice(index, index + size));\n }\n\n return result;\n}\n\nfunction diceCoefficient(\n left: ReadonlySet<string>,\n right: ReadonlySet<string>,\n): number {\n if (left.size === 0 || right.size === 0) {\n return 0;\n }\n\n let overlap = 0;\n\n for (const value of left) {\n if (right.has(value)) {\n overlap += 1;\n }\n }\n\n return (2 * overlap) / (left.size + right.size);\n}\n\nfunction levenshteinSimilarity(left: string, right: string): number {\n if (left === right) {\n return 1;\n }\n\n if (left === \"\" || right === \"\") {\n return 0;\n }\n\n let previous = Array.from({ length: right.length + 1 }, (_, index) => index);\n let current = new Array<number>(right.length + 1).fill(0);\n\n for (const [leftIndex, leftChar] of [...left].entries()) {\n current[0] = leftIndex + 1;\n\n for (const [rightIndex, rightChar] of [...right].entries()) {\n const insertCost = (current[rightIndex] ?? 0) + 1;\n const deleteCost = (previous[rightIndex + 1] ?? 0) + 1;\n const replaceCost =\n (previous[rightIndex] ?? 0) + (leftChar === rightChar ? 0 : 1);\n\n current[rightIndex + 1] = Math.min(insertCost, deleteCost, replaceCost);\n }\n\n [previous, current] = [current, previous];\n }\n\n const distance =\n previous[right.length] ?? Math.max(left.length, right.length);\n\n return 1 - distance / Math.max(left.length, right.length);\n}\n\nfunction lengthPenalty(left: string, right: string): number {\n return (\n 1 -\n Math.abs(left.length - right.length) / Math.max(left.length, right.length)\n );\n}\n\nfunction sequenceSimilarity(left: string, right: string): number {\n if (left === right) {\n return 1;\n }\n\n const leftLength = left.length;\n const rightLength = right.length;\n\n if (leftLength === 0 || rightLength === 0) {\n return 0;\n }\n\n const matrix = Array.from({ length: leftLength + 1 }, () =>\n new Array<number>(rightLength + 1).fill(0),\n );\n let longest = 0;\n\n for (let leftIndex = 1; leftIndex <= leftLength; leftIndex += 1) {\n for (let rightIndex = 1; rightIndex <= rightLength; rightIndex += 1) {\n if (left[leftIndex - 1] !== right[rightIndex - 1]) {\n continue;\n }\n\n const currentRow = matrix[leftIndex];\n\n if (currentRow === undefined) {\n continue;\n }\n\n currentRow[rightIndex] =\n (matrix[leftIndex - 1]?.[rightIndex - 1] ?? 0) + 1;\n longest = Math.max(longest, currentRow[rightIndex] ?? 0);\n }\n }\n\n return (2 * longest) / (leftLength + rightLength);\n}\n\nfunction formatCandidate(candidate: RankedSentenceCandidate): string {\n return (\n ` - ${candidate.occurrenceId} score=${candidate.score.toFixed(3)}\\n` +\n ` prev: ${truncate(candidate.prevText)}\\n` +\n ` text: ${truncate(candidate.text, 120)}\\n` +\n ` next: ${truncate(candidate.nextText)}`\n );\n}\n\nfunction truncate(text: string, limit = 80): string {\n const stripped = text.replace(/\\s+/gu, \" \").trim();\n\n if (stripped === \"\") {\n return \"(none)\";\n }\n\n if (stripped.length <= limit) {\n return stripped;\n }\n\n return `${stripped.slice(0, limit - 3)}...`;\n}\n"],"mappings":"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","names":["head","tail"]}
@@ -0,0 +1,27 @@
1
+ import { SentenceId } from '../document/types.js';
2
+
3
+ interface RankedSentenceCandidate {
4
+ readonly occurrenceId: string;
5
+ readonly sentenceId: SentenceId;
6
+ readonly index: number;
7
+ readonly text: string;
8
+ readonly prevText: string;
9
+ readonly nextText: string;
10
+ readonly score: number;
11
+ readonly exactRaw: boolean;
12
+ readonly exactNormalized: boolean;
13
+ readonly exactSubstring: boolean;
14
+ }
15
+ interface EvidenceResolutionResult {
16
+ readonly sentenceIds: SentenceId[];
17
+ readonly strategy: string;
18
+ readonly confidence: number;
19
+ }
20
+ interface EvidenceResolutionFailure {
21
+ readonly fieldName: string;
22
+ readonly code: string;
23
+ readonly message: string;
24
+ readonly candidates: readonly RankedSentenceCandidate[];
25
+ }
26
+
27
+ export type { EvidenceResolutionFailure, EvidenceResolutionResult, RankedSentenceCandidate };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=anchor-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
1
+ export { EvidenceResolver } from './anchor-resolver.js';
2
+ export { EvidenceResolutionFailure, EvidenceResolutionResult, RankedSentenceCandidate } from './anchor-types.js';
3
+ export { EVIDENCE_SELECTION_JSON_SHAPE, EVIDENCE_SELECTION_PROMPT_FRAGMENT, formatEvidenceSelectionChoicePrompt } from './prompt.js';
4
+ export { EvidenceQuoteMatchStrategy, EvidenceQuoteScore, normalizeEvidenceDisplayText, normalizeEvidenceText, scoreEvidenceQuote } from './quote-score.js';
5
+ export { rankEvidenceQuote, resolveEvidenceSelection, resolveEvidenceSelectionList } from './selection-resolver.js';
6
+ export { normalizeText, splitTextIntoSentences } from './text.js';
7
+ export { EvidenceSelection, EvidenceSelectionCandidate, EvidenceSelectionFailure, EvidenceSelectionList, EvidenceSelectionResolution, EvidenceSelectionSentence, EvidenceSentenceId } from './types.js';
8
+ import '../document/types.js';
@@ -0,0 +1,32 @@
1
+ import { EvidenceResolver } from "./anchor-resolver.js";
2
+ import {
3
+ EVIDENCE_SELECTION_JSON_SHAPE,
4
+ EVIDENCE_SELECTION_PROMPT_FRAGMENT,
5
+ formatEvidenceSelectionChoicePrompt
6
+ } from "./prompt.js";
7
+ import {
8
+ normalizeEvidenceDisplayText,
9
+ normalizeEvidenceText,
10
+ scoreEvidenceQuote
11
+ } from "./quote-score.js";
12
+ import {
13
+ rankEvidenceQuote,
14
+ resolveEvidenceSelection,
15
+ resolveEvidenceSelectionList
16
+ } from "./selection-resolver.js";
17
+ import { normalizeText, splitTextIntoSentences } from "./text.js";
18
+ export {
19
+ EVIDENCE_SELECTION_JSON_SHAPE,
20
+ EVIDENCE_SELECTION_PROMPT_FRAGMENT,
21
+ EvidenceResolver,
22
+ formatEvidenceSelectionChoicePrompt,
23
+ normalizeEvidenceDisplayText,
24
+ normalizeEvidenceText,
25
+ normalizeText,
26
+ rankEvidenceQuote,
27
+ resolveEvidenceSelection,
28
+ resolveEvidenceSelectionList,
29
+ scoreEvidenceQuote,
30
+ splitTextIntoSentences
31
+ };
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/evidence-selection/index.ts"],"sourcesContent":["export { EvidenceResolver } from \"./anchor-resolver.js\";\nexport type {\n EvidenceResolutionFailure,\n EvidenceResolutionResult,\n RankedSentenceCandidate,\n} from \"./anchor-types.js\";\nexport {\n EVIDENCE_SELECTION_JSON_SHAPE,\n EVIDENCE_SELECTION_PROMPT_FRAGMENT,\n formatEvidenceSelectionChoicePrompt,\n} from \"./prompt.js\";\nexport {\n normalizeEvidenceDisplayText,\n normalizeEvidenceText,\n scoreEvidenceQuote,\n type EvidenceQuoteMatchStrategy,\n type EvidenceQuoteScore,\n} from \"./quote-score.js\";\nexport {\n rankEvidenceQuote,\n resolveEvidenceSelection,\n resolveEvidenceSelectionList,\n} from \"./selection-resolver.js\";\nexport { normalizeText, splitTextIntoSentences } from \"./text.js\";\nexport type {\n EvidenceSelection,\n EvidenceSelectionCandidate,\n EvidenceSelectionFailure,\n EvidenceSelectionList,\n EvidenceSelectionResolution,\n EvidenceSelectionSentence,\n EvidenceSentenceId,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,wBAAwB;AAMjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe,8BAA8B;","names":[]}
@@ -0,0 +1,18 @@
1
+ declare const EVIDENCE_SELECTION_PROMPT_FRAGMENT: string;
2
+ declare const EVIDENCE_SELECTION_JSON_SHAPE: readonly [{
3
+ readonly quote: "exact short source quote copied from the selected sentence";
4
+ readonly sentence_id: "sentence id from the source context, such as S1";
5
+ }];
6
+ declare function formatEvidenceSelectionChoicePrompt(input: {
7
+ readonly evidenceLabel: string;
8
+ readonly generatedEvidence: unknown;
9
+ readonly candidates: readonly {
10
+ readonly nextText: string;
11
+ readonly occurrenceId: string;
12
+ readonly prevText: string;
13
+ readonly score: number;
14
+ readonly text: string;
15
+ }[];
16
+ }): string;
17
+
18
+ export { EVIDENCE_SELECTION_JSON_SHAPE, EVIDENCE_SELECTION_PROMPT_FRAGMENT, formatEvidenceSelectionChoicePrompt };
@@ -0,0 +1,54 @@
1
+ const EVIDENCE_SELECTION_PROMPT_FRAGMENT = [
2
+ "Evidence selection:",
3
+ '- Return evidence as [{"sentence_id":"S1","quote":"exact short source quote"}].',
4
+ "- evidence.quote is a locator for the source sentence, not a proof excerpt.",
5
+ "- Choose the shortest exact quote that still uniquely identifies the intended sentence.",
6
+ "- If the quote is too short, it may match multiple sentences; if it is too long, it may include unnecessary text or cross sentence boundaries.",
7
+ "- Do not use a whole sentence by default.",
8
+ "- evidence is an array. Use multiple items when the claim needs multiple source sentences.",
9
+ "- A source sentence means exactly one displayed source line labeled S1, S2, S3, etc.",
10
+ "- Each evidence item must point to exactly one source sentence.",
11
+ "- Each evidence item must quote one continuous span from exactly one labeled source line, for example only from S2.",
12
+ "- Never merge text from two labeled source lines into one evidence quote.",
13
+ "- sentence_id must be one of the sentence IDs shown in the source context.",
14
+ "- quote must be copied from the untagged original source sentence.",
15
+ "- If the source context contains XML-like tags, do not copy the tags into quote; copy only the visible text."
16
+ ].join("\n");
17
+ const EVIDENCE_SELECTION_JSON_SHAPE = [
18
+ {
19
+ quote: "exact short source quote copied from the selected sentence",
20
+ sentence_id: "sentence id from the source context, such as S1"
21
+ }
22
+ ];
23
+ function formatEvidenceSelectionChoicePrompt(input) {
24
+ return [
25
+ `Resolve only this evidence selection: ${input.evidenceLabel}.`,
26
+ "The generated evidence did not match its sentence_id and quote confidently.",
27
+ "Choose exactly one candidate occurrence ID from the list below.",
28
+ 'Return JSON only: {"choice":"S1"}',
29
+ "",
30
+ "Generated evidence:",
31
+ JSON.stringify(input.generatedEvidence, null, 2),
32
+ "",
33
+ "Candidates:",
34
+ input.candidates.map(formatChoiceCandidate).join("\n")
35
+ ].join("\n");
36
+ }
37
+ function formatChoiceCandidate(input) {
38
+ return [
39
+ `${input.occurrenceId} score=${input.score.toFixed(3)}`,
40
+ `prev: ${formatChoiceText(input.prevText)}`,
41
+ `text: ${formatChoiceText(input.text)}`,
42
+ `next: ${formatChoiceText(input.nextText)}`
43
+ ].join("\n");
44
+ }
45
+ function formatChoiceText(text) {
46
+ const collapsed = text.replace(/\s+/gu, " ").trim();
47
+ return collapsed === "" ? "(none)" : collapsed;
48
+ }
49
+ export {
50
+ EVIDENCE_SELECTION_JSON_SHAPE,
51
+ EVIDENCE_SELECTION_PROMPT_FRAGMENT,
52
+ formatEvidenceSelectionChoicePrompt
53
+ };
54
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/evidence-selection/prompt.ts"],"sourcesContent":["export const EVIDENCE_SELECTION_PROMPT_FRAGMENT = [\n \"Evidence selection:\",\n '- Return evidence as [{\"sentence_id\":\"S1\",\"quote\":\"exact short source quote\"}].',\n \"- evidence.quote is a locator for the source sentence, not a proof excerpt.\",\n \"- Choose the shortest exact quote that still uniquely identifies the intended sentence.\",\n \"- If the quote is too short, it may match multiple sentences; if it is too long, it may include unnecessary text or cross sentence boundaries.\",\n \"- Do not use a whole sentence by default.\",\n \"- evidence is an array. Use multiple items when the claim needs multiple source sentences.\",\n \"- A source sentence means exactly one displayed source line labeled S1, S2, S3, etc.\",\n \"- Each evidence item must point to exactly one source sentence.\",\n \"- Each evidence item must quote one continuous span from exactly one labeled source line, for example only from S2.\",\n \"- Never merge text from two labeled source lines into one evidence quote.\",\n \"- sentence_id must be one of the sentence IDs shown in the source context.\",\n \"- quote must be copied from the untagged original source sentence.\",\n \"- If the source context contains XML-like tags, do not copy the tags into quote; copy only the visible text.\",\n].join(\"\\n\");\n\nexport const EVIDENCE_SELECTION_JSON_SHAPE = [\n {\n quote: \"exact short source quote copied from the selected sentence\",\n sentence_id: \"sentence id from the source context, such as S1\",\n },\n] as const;\n\nexport function formatEvidenceSelectionChoicePrompt(input: {\n readonly evidenceLabel: string;\n readonly generatedEvidence: unknown;\n readonly candidates: readonly {\n readonly nextText: string;\n readonly occurrenceId: string;\n readonly prevText: string;\n readonly score: number;\n readonly text: string;\n }[];\n}): string {\n return [\n `Resolve only this evidence selection: ${input.evidenceLabel}.`,\n \"The generated evidence did not match its sentence_id and quote confidently.\",\n \"Choose exactly one candidate occurrence ID from the list below.\",\n 'Return JSON only: {\"choice\":\"S1\"}',\n \"\",\n \"Generated evidence:\",\n JSON.stringify(input.generatedEvidence, null, 2),\n \"\",\n \"Candidates:\",\n input.candidates.map(formatChoiceCandidate).join(\"\\n\"),\n ].join(\"\\n\");\n}\n\nfunction formatChoiceCandidate(input: {\n readonly nextText: string;\n readonly occurrenceId: string;\n readonly prevText: string;\n readonly score: number;\n readonly text: string;\n}): string {\n return [\n `${input.occurrenceId} score=${input.score.toFixed(3)}`,\n `prev: ${formatChoiceText(input.prevText)}`,\n `text: ${formatChoiceText(input.text)}`,\n `next: ${formatChoiceText(input.nextText)}`,\n ].join(\"\\n\");\n}\n\nfunction formatChoiceText(text: string): string {\n const collapsed = text.replace(/\\s+/gu, \" \").trim();\n\n return collapsed === \"\" ? \"(none)\" : collapsed;\n}\n"],"mappings":"AAAO,MAAM,qCAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEJ,MAAM,gCAAgC;AAAA,EAC3C;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;AAEO,SAAS,oCAAoC,OAUzC;AACT,SAAO;AAAA,IACL,yCAAyC,MAAM,aAAa;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,MAAM,mBAAmB,MAAM,CAAC;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,MAAM,WAAW,IAAI,qBAAqB,EAAE,KAAK,IAAI;AAAA,EACvD,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,sBAAsB,OAMpB;AACT,SAAO;AAAA,IACL,GAAG,MAAM,YAAY,UAAU,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA,IACrD,SAAS,iBAAiB,MAAM,QAAQ,CAAC;AAAA,IACzC,SAAS,iBAAiB,MAAM,IAAI,CAAC;AAAA,IACrC,SAAS,iBAAiB,MAAM,QAAQ,CAAC;AAAA,EAC3C,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,YAAY,KAAK,QAAQ,SAAS,GAAG,EAAE,KAAK;AAElD,SAAO,cAAc,KAAK,WAAW;AACvC;","names":[]}
@@ -0,0 +1,29 @@
1
+ type EvidenceQuoteMatchStrategy = "empty" | "exact" | "normalized_exact" | "normalized_substring" | "fuzzy_window";
2
+ interface EvidenceQuoteScore {
3
+ readonly exactRaw: boolean;
4
+ readonly exactNormalized: boolean;
5
+ readonly exactSubstring: boolean;
6
+ readonly matchEnd: number;
7
+ readonly matchStart: number;
8
+ readonly normalizedQuote: string;
9
+ readonly normalizedSentence: string;
10
+ readonly score: number;
11
+ readonly strategy: EvidenceQuoteMatchStrategy;
12
+ }
13
+ interface PreparedEvidenceQuote {
14
+ readonly normalizedQuote: string;
15
+ readonly quoteRaw: string;
16
+ }
17
+ declare function normalizeEvidenceDisplayText(text: string): string;
18
+ declare function normalizeEvidenceText(text: string): string;
19
+ declare function scoreEvidenceQuote(input: {
20
+ readonly quote: string;
21
+ readonly sentence: string;
22
+ }): EvidenceQuoteScore;
23
+ declare function prepareEvidenceQuote(quote: string): PreparedEvidenceQuote;
24
+ declare function scorePreparedEvidenceQuote(input: {
25
+ readonly preparedQuote: PreparedEvidenceQuote;
26
+ readonly sentence: string;
27
+ }): EvidenceQuoteScore;
28
+
29
+ export { type EvidenceQuoteMatchStrategy, type EvidenceQuoteScore, type PreparedEvidenceQuote, normalizeEvidenceDisplayText, normalizeEvidenceText, prepareEvidenceQuote, scoreEvidenceQuote, scorePreparedEvidenceQuote };
@@ -0,0 +1,331 @@
1
+ const EXACT_SCORE = 1;
2
+ const NORMALIZED_EXACT_SCORE = 0.995;
3
+ const SUBSTRING_BASE_SCORE = 0.95;
4
+ const SUBSTRING_COVERAGE_BONUS = 0.04;
5
+ const FUZZY_MIN_WINDOW_RATIO = 0.72;
6
+ const FUZZY_MAX_WINDOW_RATIO = 2.25;
7
+ const UNORDERED_PENALTY_THRESHOLD = 0.75;
8
+ const LOW_ORDERED_PENALTY_THRESHOLD = 0.45;
9
+ const CASE_FOLDING_OVERRIDES = /* @__PURE__ */ new Map([
10
+ ["\xDF", "ss"],
11
+ ["\u1E9E", "ss"],
12
+ ["\u03C2", "\u03C3"]
13
+ ]);
14
+ function normalizeEvidenceDisplayText(text) {
15
+ return text.replace(new RegExp("\\p{Default_Ignorable_Code_Point}", "gu"), "").normalize("NFKC").replace(/\s+/gu, " ").trim();
16
+ }
17
+ function normalizeEvidenceText(text) {
18
+ const separated = replaceSeparatorsWithSpace(text);
19
+ const stripped = separated.replace(new RegExp("\\p{Default_Ignorable_Code_Point}", "gu"), "");
20
+ const compatible = stripped.normalize("NFKC");
21
+ const folded = caseFold(compatible);
22
+ const decomposed = folded.normalize("NFD").replace(new RegExp("\\p{M}", "gu"), "");
23
+ const reseparated = replaceSeparatorsWithSpace(decomposed);
24
+ return reseparated.replace(/ +/gu, " ").trim();
25
+ }
26
+ function scoreEvidenceQuote(input) {
27
+ return scorePreparedEvidenceQuote({
28
+ preparedQuote: prepareEvidenceQuote(input.quote),
29
+ sentence: input.sentence
30
+ });
31
+ }
32
+ function prepareEvidenceQuote(quote) {
33
+ const quoteRaw = stripMarkup(quote).trim();
34
+ return {
35
+ normalizedQuote: normalizeEvidenceText(quoteRaw),
36
+ quoteRaw
37
+ };
38
+ }
39
+ function scorePreparedEvidenceQuote(input) {
40
+ const { normalizedQuote, quoteRaw } = input.preparedQuote;
41
+ const sentenceRaw = stripMarkup(input.sentence).trim();
42
+ const normalizedSentence = normalizeEvidenceText(sentenceRaw);
43
+ if (normalizedQuote === "" || normalizedSentence === "") {
44
+ return createEmptyScore(normalizedQuote, normalizedSentence);
45
+ }
46
+ if (quoteRaw === sentenceRaw) {
47
+ return {
48
+ exactNormalized: true,
49
+ exactRaw: true,
50
+ exactSubstring: true,
51
+ matchEnd: normalizedSentence.length,
52
+ matchStart: 0,
53
+ normalizedQuote,
54
+ normalizedSentence,
55
+ score: EXACT_SCORE,
56
+ strategy: "exact"
57
+ };
58
+ }
59
+ if (normalizedQuote === normalizedSentence) {
60
+ return {
61
+ exactNormalized: true,
62
+ exactRaw: false,
63
+ exactSubstring: true,
64
+ matchEnd: normalizedSentence.length,
65
+ matchStart: 0,
66
+ normalizedQuote,
67
+ normalizedSentence,
68
+ score: NORMALIZED_EXACT_SCORE,
69
+ strategy: "normalized_exact"
70
+ };
71
+ }
72
+ const substringStart = normalizedSentence.indexOf(normalizedQuote);
73
+ if (substringStart !== -1) {
74
+ const coverage = normalizedQuote.length / Math.max(1, normalizedSentence.length);
75
+ return {
76
+ exactNormalized: false,
77
+ exactRaw: false,
78
+ exactSubstring: true,
79
+ matchEnd: substringStart + normalizedQuote.length,
80
+ matchStart: substringStart,
81
+ normalizedQuote,
82
+ normalizedSentence,
83
+ score: Math.min(
84
+ 0.99,
85
+ SUBSTRING_BASE_SCORE + SUBSTRING_COVERAGE_BONUS * coverage
86
+ ),
87
+ strategy: "normalized_substring"
88
+ };
89
+ }
90
+ return scoreBestFuzzyWindow(normalizedQuote, normalizedSentence);
91
+ }
92
+ function scoreBestFuzzyWindow(normalizedQuote, normalizedSentence) {
93
+ const minWindow = Math.max(
94
+ 1,
95
+ Math.floor(normalizedQuote.length * FUZZY_MIN_WINDOW_RATIO)
96
+ );
97
+ const maxWindow = Math.min(
98
+ normalizedSentence.length,
99
+ Math.max(
100
+ minWindow,
101
+ Math.ceil(normalizedQuote.length * FUZZY_MAX_WINDOW_RATIO)
102
+ )
103
+ );
104
+ let best = createEmptyScore(
105
+ normalizedQuote,
106
+ normalizedSentence
107
+ );
108
+ for (let windowSize = minWindow; windowSize <= maxWindow; windowSize += 1) {
109
+ for (let start = 0; start <= normalizedSentence.length - windowSize; start += 1) {
110
+ const window = normalizedSentence.slice(start, start + windowSize);
111
+ const score = scoreWindow(normalizedQuote, window);
112
+ if (score <= best.score) {
113
+ continue;
114
+ }
115
+ best = {
116
+ exactNormalized: false,
117
+ exactRaw: false,
118
+ exactSubstring: false,
119
+ matchEnd: start + windowSize,
120
+ matchStart: start,
121
+ normalizedQuote,
122
+ normalizedSentence,
123
+ score,
124
+ strategy: "fuzzy_window"
125
+ };
126
+ }
127
+ }
128
+ return best;
129
+ }
130
+ function scoreWindow(quote, window) {
131
+ const editScore = levenshteinSimilarity(quote, window);
132
+ const substringScore = longestCommonSubstringScore(quote, window);
133
+ const subsequenceScore = longestCommonSubsequenceScore(quote, window);
134
+ const orderedCoverageScore = orderedCoverage(quote, window);
135
+ const ngramScore = charNgramScore(quote, window);
136
+ const lengthScore = lengthSimilarity(quote, window);
137
+ const unorderedScore = unorderedCharOverlapScore(quote, window);
138
+ const orderedScore = Math.max(
139
+ editScore,
140
+ substringScore,
141
+ subsequenceScore,
142
+ orderedCoverageScore
143
+ );
144
+ let score = 0.2 * editScore + 0.18 * substringScore + 0.24 * subsequenceScore + 0.2 * orderedCoverageScore + 0.08 * ngramScore + 0.05 * lengthScore + 0.05 * unorderedScore;
145
+ if (unorderedScore >= UNORDERED_PENALTY_THRESHOLD && orderedScore < LOW_ORDERED_PENALTY_THRESHOLD) {
146
+ score *= 0.65;
147
+ }
148
+ return Math.max(0, Math.min(1, score));
149
+ }
150
+ function normalizeScalar(char) {
151
+ return CASE_FOLDING_OVERRIDES.get(char) ?? char.toLocaleLowerCase("und");
152
+ }
153
+ function caseFold(text) {
154
+ let folded = "";
155
+ for (const char of text) {
156
+ folded += normalizeScalar(char);
157
+ }
158
+ return folded;
159
+ }
160
+ function replaceSeparatorsWithSpace(text) {
161
+ let output = "";
162
+ for (const char of text) {
163
+ output += isPreservedSymbol(char) || !isSeparator(char) ? char : " ";
164
+ }
165
+ return output;
166
+ }
167
+ function isPreservedSymbol(char) {
168
+ return char === "+" || char === "#" || char === "&";
169
+ }
170
+ function isSeparator(char) {
171
+ return /\s/u.test(char) || new RegExp("\\p{Separator}", "u").test(char) || /[\p{Dash_Punctuation}\p{Connector_Punctuation}\p{Initial_Punctuation}\p{Final_Punctuation}\p{Open_Punctuation}\p{Close_Punctuation}\p{Other_Punctuation}]/u.test(
172
+ char
173
+ ) || /[\\/.。.。、,,::;;!!??·・•|]/u.test(char);
174
+ }
175
+ function stripMarkup(text) {
176
+ return text.replace(/<\/?(?:mention|quote)\b[^>]*>/giu, "");
177
+ }
178
+ function createEmptyScore(normalizedQuote, normalizedSentence) {
179
+ return {
180
+ exactNormalized: false,
181
+ exactRaw: false,
182
+ exactSubstring: false,
183
+ matchEnd: -1,
184
+ matchStart: -1,
185
+ normalizedQuote,
186
+ normalizedSentence,
187
+ score: 0,
188
+ strategy: "empty"
189
+ };
190
+ }
191
+ function charNgramScore(left, right) {
192
+ const bigramScore = diceCoefficient(
193
+ charNgrams(left, 2),
194
+ charNgrams(right, 2)
195
+ );
196
+ const trigramScore = diceCoefficient(
197
+ charNgrams(left, 3),
198
+ charNgrams(right, 3)
199
+ );
200
+ return (bigramScore + trigramScore) / 2;
201
+ }
202
+ function charNgrams(text, size) {
203
+ if (text.length <= size) {
204
+ return text === "" ? /* @__PURE__ */ new Set() : /* @__PURE__ */ new Set([text]);
205
+ }
206
+ const result = /* @__PURE__ */ new Set();
207
+ for (let index = 0; index <= text.length - size; index += 1) {
208
+ result.add(text.slice(index, index + size));
209
+ }
210
+ return result;
211
+ }
212
+ function diceCoefficient(left, right) {
213
+ if (left.size === 0 || right.size === 0) {
214
+ return 0;
215
+ }
216
+ let overlap = 0;
217
+ for (const value of left) {
218
+ if (right.has(value)) {
219
+ overlap += 1;
220
+ }
221
+ }
222
+ return 2 * overlap / (left.size + right.size);
223
+ }
224
+ function lengthSimilarity(left, right) {
225
+ return 1 - Math.abs(left.length - right.length) / Math.max(left.length, right.length);
226
+ }
227
+ function levenshteinSimilarity(left, right) {
228
+ if (left === right) {
229
+ return 1;
230
+ }
231
+ if (left === "" || right === "") {
232
+ return 0;
233
+ }
234
+ let previous = Array.from({ length: right.length + 1 }, (_, index) => index);
235
+ let current = new Array(right.length + 1).fill(0);
236
+ const leftChars = [...left];
237
+ const rightChars = [...right];
238
+ for (const [leftIndex, leftChar] of leftChars.entries()) {
239
+ current[0] = leftIndex + 1;
240
+ for (const [rightIndex, rightChar] of rightChars.entries()) {
241
+ const insertCost = (current[rightIndex] ?? 0) + 1;
242
+ const deleteCost = (previous[rightIndex + 1] ?? 0) + 1;
243
+ const replaceCost = (previous[rightIndex] ?? 0) + (leftChar === rightChar ? 0 : 1);
244
+ current[rightIndex + 1] = Math.min(insertCost, deleteCost, replaceCost);
245
+ }
246
+ [previous, current] = [current, previous];
247
+ }
248
+ const distance = previous[rightChars.length] ?? Math.max(left.length, right.length);
249
+ return 1 - distance / Math.max(left.length, right.length);
250
+ }
251
+ function longestCommonSubstringScore(left, right) {
252
+ if (left === "" || right === "") {
253
+ return 0;
254
+ }
255
+ const leftChars = [...left];
256
+ const rightChars = [...right];
257
+ let previous = new Array(rightChars.length + 1).fill(0);
258
+ let current = new Array(rightChars.length + 1).fill(0);
259
+ let longest = 0;
260
+ for (let leftIndex = 1; leftIndex <= leftChars.length; leftIndex += 1) {
261
+ for (let rightIndex = 1; rightIndex <= rightChars.length; rightIndex += 1) {
262
+ current[rightIndex] = leftChars[leftIndex - 1] === rightChars[rightIndex - 1] ? (previous[rightIndex - 1] ?? 0) + 1 : 0;
263
+ longest = Math.max(longest, current[rightIndex] ?? 0);
264
+ }
265
+ [previous, current] = [current, previous];
266
+ current.fill(0);
267
+ }
268
+ return 2 * longest / (leftChars.length + rightChars.length);
269
+ }
270
+ function longestCommonSubsequenceScore(left, right) {
271
+ if (left === "" || right === "") {
272
+ return 0;
273
+ }
274
+ const leftChars = [...left];
275
+ const rightChars = [...right];
276
+ let previous = new Array(rightChars.length + 1).fill(0);
277
+ let current = new Array(rightChars.length + 1).fill(0);
278
+ for (let leftIndex = 1; leftIndex <= leftChars.length; leftIndex += 1) {
279
+ for (let rightIndex = 1; rightIndex <= rightChars.length; rightIndex += 1) {
280
+ current[rightIndex] = leftChars[leftIndex - 1] === rightChars[rightIndex - 1] ? (previous[rightIndex - 1] ?? 0) + 1 : Math.max(previous[rightIndex] ?? 0, current[rightIndex - 1] ?? 0);
281
+ }
282
+ [previous, current] = [current, previous];
283
+ current.fill(0);
284
+ }
285
+ const longest = previous[rightChars.length] ?? 0;
286
+ return 2 * longest / (leftChars.length + rightChars.length);
287
+ }
288
+ function orderedCoverage(left, right) {
289
+ if (left === "" || right === "") {
290
+ return 0;
291
+ }
292
+ const leftChars = [...left];
293
+ const rightChars = [...right];
294
+ let previous = new Array(rightChars.length + 1).fill(0);
295
+ let current = new Array(rightChars.length + 1).fill(0);
296
+ for (let leftIndex = 1; leftIndex <= leftChars.length; leftIndex += 1) {
297
+ for (let rightIndex = 1; rightIndex <= rightChars.length; rightIndex += 1) {
298
+ current[rightIndex] = leftChars[leftIndex - 1] === rightChars[rightIndex - 1] ? (previous[rightIndex - 1] ?? 0) + 1 : Math.max(previous[rightIndex] ?? 0, current[rightIndex - 1] ?? 0);
299
+ }
300
+ [previous, current] = [current, previous];
301
+ current.fill(0);
302
+ }
303
+ return (previous[rightChars.length] ?? 0) / leftChars.length;
304
+ }
305
+ function unorderedCharOverlapScore(left, right) {
306
+ const leftCounts = countChars(left);
307
+ const rightCounts = countChars(right);
308
+ let overlap = 0;
309
+ let total = 0;
310
+ for (const [char, leftCount] of leftCounts) {
311
+ const rightCount = rightCounts.get(char) ?? 0;
312
+ overlap += Math.min(leftCount, rightCount);
313
+ total += leftCount;
314
+ }
315
+ return total === 0 ? 0 : overlap / total;
316
+ }
317
+ function countChars(text) {
318
+ const counts = /* @__PURE__ */ new Map();
319
+ for (const char of text) {
320
+ counts.set(char, (counts.get(char) ?? 0) + 1);
321
+ }
322
+ return counts;
323
+ }
324
+ export {
325
+ normalizeEvidenceDisplayText,
326
+ normalizeEvidenceText,
327
+ prepareEvidenceQuote,
328
+ scoreEvidenceQuote,
329
+ scorePreparedEvidenceQuote
330
+ };
331
+ //# sourceMappingURL=quote-score.js.map