@remnic/core 10.0.13 → 10.0.14

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 (476) hide show
  1. package/dist/access-admin-ops-surface.js +86 -84
  2. package/dist/access-authorization-probe.js +87 -85
  3. package/dist/access-boundary.js +86 -84
  4. package/dist/access-cli.js +183 -180
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +86 -84
  7. package/dist/access-http-briefing.js +87 -85
  8. package/dist/access-http-query.js +88 -86
  9. package/dist/access-http.js +110 -108
  10. package/dist/access-idempotency.js +3 -2
  11. package/dist/access-identity-continuity-surface.js +86 -84
  12. package/dist/access-lcm-surface.js +86 -84
  13. package/dist/access-mcp.js +99 -97
  14. package/dist/access-namespace-preflight.js +86 -84
  15. package/dist/access-observe-write-category.js +17 -17
  16. package/dist/access-observe-write-surface.js +86 -84
  17. package/dist/access-offline-manifest.js +16 -15
  18. package/dist/access-operations-batch.js +90 -88
  19. package/dist/access-operations.js +97 -95
  20. package/dist/access-recall-concurrency.js +86 -84
  21. package/dist/access-recall-diagnostics.js +2 -2
  22. package/dist/access-recall-response.js +86 -84
  23. package/dist/access-recall-surface.js +86 -84
  24. package/dist/access-schema.d.ts +2 -2
  25. package/dist/access-schema.js +12 -12
  26. package/dist/access-service.js +86 -84
  27. package/dist/access-surface-catalog.js +88 -86
  28. package/dist/access-surface-catalog.js.map +1 -1
  29. package/dist/active-recall.js +39 -37
  30. package/dist/active-recall.js.map +1 -1
  31. package/dist/adapters/index.js +4 -4
  32. package/dist/adapters/registry.js +2 -2
  33. package/dist/{auto-sync-DGJOZYGT.js → auto-sync-7WWAKW6F.js} +8 -8
  34. package/dist/briefing.js +29 -27
  35. package/dist/buffer.js +13 -13
  36. package/dist/{capsule-merge-M4HETD27.js → capsule-merge-LGYURS3C.js} +6 -5
  37. package/dist/{capsule-merge-M4HETD27.js.map → capsule-merge-LGYURS3C.js.map} +1 -1
  38. package/dist/capture-write-lock-backoff.d.ts +50 -0
  39. package/dist/capture-write-lock-backoff.d.ts.map +1 -0
  40. package/dist/capture-write-lock-backoff.js +30 -0
  41. package/dist/capture-write-lock.d.ts +6 -0
  42. package/dist/capture-write-lock.d.ts.map +1 -0
  43. package/dist/capture-write-lock.js +15 -0
  44. package/dist/causal-behavior.js +2 -2
  45. package/dist/causal-chain.js +2 -2
  46. package/dist/causal-consolidation.js +32 -30
  47. package/dist/causal-consolidation.js.map +1 -1
  48. package/dist/causal-retrieval.js +2 -2
  49. package/dist/causal-trajectory-graph.js +7 -6
  50. package/dist/causal-trajectory-graph.js.map +1 -1
  51. package/dist/causal-trajectory.js +1 -1
  52. package/dist/{chunk-ZUMXY4KA.js → chunk-22W2XWGH.js} +3 -3
  53. package/dist/{chunk-AV2OQF2O.js → chunk-3F3HA3R2.js} +2 -2
  54. package/dist/{chunk-QZZPUREO.js → chunk-3GYSZHMT.js} +3 -3
  55. package/dist/{chunk-QWWMS4AE.js → chunk-3MO4LWYU.js} +1 -1
  56. package/dist/chunk-3MO4LWYU.js.map +1 -0
  57. package/dist/{chunk-AL6EHLB5.js → chunk-3X3PNU3T.js} +2 -2
  58. package/dist/{chunk-BTJ6CAIA.js → chunk-4IYIGN53.js} +10 -10
  59. package/dist/{chunk-BZTRPCCH.js → chunk-4KY5GSMB.js} +2 -2
  60. package/dist/{chunk-UZSBCQEC.js → chunk-4OSG5Y6M.js} +2 -2
  61. package/dist/{chunk-EHRE7ZG3.js → chunk-5B5WYAHQ.js} +2 -2
  62. package/dist/{chunk-WCGJK4NQ.js → chunk-5FNZ3G6X.js} +10 -10
  63. package/dist/{chunk-Y6DZ33PA.js → chunk-5GX5457J.js} +4 -4
  64. package/dist/{chunk-OFCHT2TN.js → chunk-5LRV557D.js} +2 -2
  65. package/dist/{chunk-CKUUP64O.js → chunk-5WCJLQTM.js} +2 -2
  66. package/dist/{chunk-MZBWIJJN.js → chunk-63B2IZYE.js} +19 -19
  67. package/dist/{chunk-DGRMWDQY.js → chunk-66BCOVW2.js} +7 -7
  68. package/dist/chunk-6EDW54SQ.js +298 -0
  69. package/dist/chunk-6EDW54SQ.js.map +1 -0
  70. package/dist/{chunk-P2S6P7X6.js → chunk-6LG7BWKW.js} +2 -2
  71. package/dist/chunk-77R7BQZ2.js +152 -0
  72. package/dist/chunk-77R7BQZ2.js.map +1 -0
  73. package/dist/{chunk-IPLYGWQF.js → chunk-7LCGFUMB.js} +6 -6
  74. package/dist/{chunk-KYY4EACB.js → chunk-7Z3DLNSD.js} +2 -2
  75. package/dist/{chunk-LNH76ZJX.js → chunk-AIYXVWUH.js} +27 -2
  76. package/dist/{chunk-LNH76ZJX.js.map → chunk-AIYXVWUH.js.map} +1 -1
  77. package/dist/{chunk-O4KYRDRT.js → chunk-B665A6BO.js} +2 -2
  78. package/dist/{chunk-AKREOU5F.js → chunk-CB6ANA2I.js} +2 -2
  79. package/dist/{chunk-5JMI26Q7.js → chunk-CBH2Z4UA.js} +2 -2
  80. package/dist/{chunk-YRH3C2OJ.js → chunk-CIIHIAJ2.js} +13 -5
  81. package/dist/chunk-CIIHIAJ2.js.map +1 -0
  82. package/dist/{chunk-6M56RFFJ.js → chunk-CJRENHVZ.js} +3 -3
  83. package/dist/{chunk-EGDYVYU7.js → chunk-CLWBFR7Q.js} +3 -3
  84. package/dist/{chunk-375ARKRS.js → chunk-D5SSBCYY.js} +70 -59
  85. package/dist/chunk-D5SSBCYY.js.map +1 -0
  86. package/dist/{chunk-KI6UOSNR.js → chunk-DEY7B77Y.js} +2 -2
  87. package/dist/chunk-DEY7B77Y.js.map +1 -0
  88. package/dist/{chunk-6VAHJ2F6.js → chunk-DMDWFQMR.js} +2 -2
  89. package/dist/{chunk-6OQ6N5RP.js → chunk-DPR2WTN3.js} +20 -20
  90. package/dist/{chunk-K4QY55XV.js → chunk-EH4BQ7LT.js} +2 -2
  91. package/dist/chunk-EHHQJTAU.js +131 -0
  92. package/dist/chunk-EHHQJTAU.js.map +1 -0
  93. package/dist/{chunk-5JCLELOP.js → chunk-EPJDSQHF.js} +2 -2
  94. package/dist/{chunk-K2FSASGZ.js → chunk-EU534WGS.js} +2 -2
  95. package/dist/{chunk-GD7BWGIB.js → chunk-EU6IRUCY.js} +6 -4
  96. package/dist/{chunk-GD7BWGIB.js.map → chunk-EU6IRUCY.js.map} +1 -1
  97. package/dist/{chunk-IWHEJXR2.js → chunk-EUAIYYYR.js} +8 -8
  98. package/dist/{chunk-7KYJNHGM.js → chunk-EUCYTCFP.js} +2 -2
  99. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  100. package/dist/{chunk-ON4ILX3G.js → chunk-FFOVKNQV.js} +2 -2
  101. package/dist/{chunk-2KRNPFPK.js → chunk-FLI6DEIU.js} +2 -2
  102. package/dist/{chunk-4G4B3Z2B.js → chunk-FP4JYE66.js} +2 -2
  103. package/dist/{chunk-B7CANWCA.js → chunk-FSIMZNBC.js} +2 -2
  104. package/dist/{chunk-OAIWPB2I.js → chunk-FT4UQYOV.js} +2 -2
  105. package/dist/{chunk-X3VID2TT.js → chunk-FUFAXVBA.js} +3 -3
  106. package/dist/{chunk-HYNEDMYJ.js → chunk-G2OYFTUD.js} +2 -2
  107. package/dist/{chunk-XTN54NML.js → chunk-G3T6YMBO.js} +4 -4
  108. package/dist/{chunk-XHWJRUVP.js → chunk-GELS5Z5Z.js} +3 -3
  109. package/dist/{chunk-RT6D3WN7.js → chunk-GH7AOMJD.js} +2 -2
  110. package/dist/{chunk-2LUSQV4U.js → chunk-GKJJNO7C.js} +2 -2
  111. package/dist/{chunk-6Z2AZ4AJ.js → chunk-GMXWTJNU.js} +2 -2
  112. package/dist/{chunk-B657ZGDH.js → chunk-HQSK2INQ.js} +2 -2
  113. package/dist/{chunk-RWRQ67OR.js → chunk-I7S55EOB.js} +2 -2
  114. package/dist/{chunk-KZO43HPY.js → chunk-J7JWFZHI.js} +100 -100
  115. package/dist/{chunk-EMFBC7L3.js → chunk-JDZFIR2S.js} +2 -2
  116. package/dist/{chunk-4THZGKQ2.js → chunk-JIHMUOOS.js} +3 -3
  117. package/dist/{chunk-YYO447A7.js → chunk-JNIVZNIB.js} +41 -253
  118. package/dist/chunk-JNIVZNIB.js.map +1 -0
  119. package/dist/{chunk-FZB4TS2W.js → chunk-JPTPS4OB.js} +5 -5
  120. package/dist/{chunk-CS2JEHTB.js → chunk-JQ7XU625.js} +8 -8
  121. package/dist/{chunk-3I3U6FFT.js → chunk-K7BN34IA.js} +2 -2
  122. package/dist/{chunk-7OAIOE5P.js → chunk-KH2LKDX7.js} +2 -2
  123. package/dist/{chunk-DA2INEB5.js → chunk-KR6ZKECI.js} +4 -4
  124. package/dist/{chunk-5AOAQR37.js → chunk-L5DAHSEZ.js} +3 -3
  125. package/dist/{chunk-RP5SJ3XR.js → chunk-LCKVXX5F.js} +2 -2
  126. package/dist/{chunk-ZI7LMSNI.js → chunk-LLHZZOIB.js} +2 -2
  127. package/dist/{chunk-OYKQ6T4V.js → chunk-MATDGSJ7.js} +2 -2
  128. package/dist/{chunk-3NFN4Y4P.js → chunk-MGCKZWAE.js} +5 -5
  129. package/dist/{chunk-6OMUHXHP.js → chunk-ML7ZJAKJ.js} +2 -2
  130. package/dist/{chunk-YDH2FSDI.js → chunk-N45NEBOD.js} +2 -2
  131. package/dist/{chunk-A2E4WNW4.js → chunk-N4C7QKOG.js} +2 -2
  132. package/dist/{chunk-B43NMCGQ.js → chunk-N7KYEVLK.js} +2 -2
  133. package/dist/{chunk-HT2C4EXO.js → chunk-NIRQGDYC.js} +4 -4
  134. package/dist/{chunk-DXHVD4DS.js → chunk-NW2E4CI2.js} +3 -3
  135. package/dist/{chunk-4NDWE44P.js → chunk-NZFFGO5O.js} +2 -2
  136. package/dist/{chunk-KC46VZR5.js → chunk-O2IPAX26.js} +8 -8
  137. package/dist/{chunk-M7V65M6H.js → chunk-O4SGYW7H.js} +2 -2
  138. package/dist/{chunk-QUA7RLK6.js → chunk-OP6N4H6A.js} +2 -2
  139. package/dist/{chunk-ZSJGYC3C.js → chunk-OQJKY3Z5.js} +2 -2
  140. package/dist/{chunk-OFEHITAZ.js → chunk-OXNTOHL6.js} +2 -2
  141. package/dist/{chunk-FQD2KPQH.js → chunk-P55FACBG.js} +2 -2
  142. package/dist/{chunk-XERVJYH2.js → chunk-P5NQN4JE.js} +3 -3
  143. package/dist/{chunk-XZLWYZ7C.js → chunk-P7TOIOT7.js} +2 -2
  144. package/dist/{chunk-Y3VDGK2O.js → chunk-PAZ35RJ4.js} +44 -31
  145. package/dist/chunk-PAZ35RJ4.js.map +1 -0
  146. package/dist/chunk-PGRZ3FYC.js +34 -0
  147. package/dist/chunk-PGRZ3FYC.js.map +1 -0
  148. package/dist/{chunk-PBVNVKYN.js → chunk-PIN5OPBA.js} +2 -2
  149. package/dist/{chunk-CNG2XVZG.js → chunk-PZHQWFR3.js} +2 -2
  150. package/dist/{chunk-SVDU4OHO.js → chunk-Q35L7TYB.js} +2 -2
  151. package/dist/{chunk-YEM7K3KD.js → chunk-QODKDRSP.js} +6 -6
  152. package/dist/{chunk-IZT3BVDW.js → chunk-QOZJCSFO.js} +2 -2
  153. package/dist/{chunk-6T42L5FI.js → chunk-QS3OLP5I.js} +2 -2
  154. package/dist/{chunk-PAAJWQH5.js → chunk-QUMKDRCF.js} +2 -2
  155. package/dist/{chunk-JFVCDEIC.js → chunk-QX6JN3O4.js} +7 -7
  156. package/dist/{chunk-KZEMFD6E.js → chunk-R2H4ZFBJ.js} +3 -3
  157. package/dist/{chunk-GKIXBH7Y.js → chunk-RTKV5XHL.js} +4 -4
  158. package/dist/{chunk-ZQ3WU6JO.js → chunk-RXFCU3CY.js} +2 -2
  159. package/dist/{chunk-BOOFTFFE.js → chunk-S2I7DL5Q.js} +1 -1
  160. package/dist/{chunk-2NCBDGND.js → chunk-SA6GMZJY.js} +3 -3
  161. package/dist/{chunk-NSFOERZQ.js → chunk-SIIRTDJ4.js} +2 -2
  162. package/dist/{chunk-A6TVQ3QP.js → chunk-SS3IS2JR.js} +3 -3
  163. package/dist/{chunk-VFTK5WKI.js → chunk-STBX5X6B.js} +2 -2
  164. package/dist/{chunk-WVHRNAXL.js → chunk-SWWHIJUJ.js} +2 -2
  165. package/dist/{chunk-WADSXS4K.js → chunk-SX4QDWXK.js} +2 -2
  166. package/dist/{chunk-ZIZ2G47N.js → chunk-TITG2NBS.js} +2 -2
  167. package/dist/{chunk-LZKOVXMX.js → chunk-TRMJ6BYC.js} +2 -2
  168. package/dist/{chunk-U7VPOXVM.js → chunk-TZNDKTX5.js} +65 -65
  169. package/dist/{chunk-WWSRLS4M.js → chunk-UMTCNEVQ.js} +15 -15
  170. package/dist/{chunk-4TTGRETU.js → chunk-UQDG3YLN.js} +5 -5
  171. package/dist/{chunk-AAM66QCP.js → chunk-UZRSI6NX.js} +2 -2
  172. package/dist/{chunk-2CXQZXWM.js → chunk-V4MB5ONM.js} +6 -6
  173. package/dist/{chunk-CYEK6Z3P.js → chunk-VW6VIJOS.js} +2 -2
  174. package/dist/{chunk-5ZJYHOJT.js → chunk-W47S5TIH.js} +8 -8
  175. package/dist/{chunk-CBP4HWCL.js → chunk-W5MCEVUS.js} +3 -3
  176. package/dist/{chunk-WETFW255.js → chunk-WLMZ2L5P.js} +2 -2
  177. package/dist/{chunk-XRBHXUTQ.js → chunk-WSGPFRBH.js} +5 -5
  178. package/dist/{chunk-UOKPJFO3.js → chunk-WVADKFWV.js} +3 -3
  179. package/dist/{chunk-P34FDDB5.js → chunk-XISROV24.js} +2 -2
  180. package/dist/{chunk-FZVROZKC.js → chunk-XVZA6VXC.js} +4 -4
  181. package/dist/{chunk-JUWJYXI4.js → chunk-Y4NKEXQT.js} +4 -4
  182. package/dist/{chunk-2ZQJLBV6.js → chunk-YE36AJL7.js} +4 -4
  183. package/dist/chunk-YET735EZ.js +99 -0
  184. package/dist/chunk-YET735EZ.js.map +1 -0
  185. package/dist/{chunk-PCWXLAJY.js → chunk-YFMBHQRG.js} +2 -2
  186. package/dist/{chunk-RBJQYMMT.js → chunk-YRULQW5J.js} +4 -4
  187. package/dist/{chunk-QUNDYIYZ.js → chunk-YYEOR4XN.js} +3 -3
  188. package/dist/{chunk-VYPFEVOM.js → chunk-ZJVMUBYF.js} +2 -2
  189. package/dist/{chunk-5MDM7UE4.js → chunk-ZSH2NRDV.js} +2 -2
  190. package/dist/{chunk-3J5JKBYD.js → chunk-ZV65I6ME.js} +67 -67
  191. package/dist/cli.js +138 -136
  192. package/dist/coding/export-okf-codegraph.js +29 -27
  193. package/dist/coding/export-okf-codegraph.js.map +1 -1
  194. package/dist/coding/pre-action-gate.js +2 -2
  195. package/dist/compounding/engine.js +31 -29
  196. package/dist/config.js +39 -37
  197. package/dist/connectors/codex-materialize-runner.js +29 -27
  198. package/dist/connectors/index.js +29 -27
  199. package/dist/console/trace.d.ts +5 -14
  200. package/dist/console/trace.d.ts.map +1 -1
  201. package/dist/consolidation-provenance-check.js +7 -6
  202. package/dist/consolidation-undo.js +5 -4
  203. package/dist/consolidation-undo.js.map +1 -1
  204. package/dist/contradiction/index.js +7 -6
  205. package/dist/converge-config.d.ts +2 -0
  206. package/dist/converge-config.d.ts.map +1 -1
  207. package/dist/converge-config.js +7 -3
  208. package/dist/convergence-refresh.js +31 -29
  209. package/dist/corpus-watermark.js +31 -29
  210. package/dist/dashboard-runtime.js +2 -2
  211. package/dist/deep-recall-http-glue.js +13 -13
  212. package/dist/deep-recall.js +2 -2
  213. package/dist/embedding-fallback.js +5 -4
  214. package/dist/embedding-generation-lock.js +4 -3
  215. package/dist/entity-retrieval.js +30 -28
  216. package/dist/explicit-capture.js +11 -8
  217. package/dist/external-wiki-access.js +87 -85
  218. package/dist/extraction-quote-grounding.d.ts +67 -0
  219. package/dist/extraction-quote-grounding.d.ts.map +1 -0
  220. package/dist/extraction-quote-grounding.js +27 -0
  221. package/dist/extraction-quote-grounding.js.map +1 -0
  222. package/dist/extraction-source-grounding-helpers.d.ts +8 -0
  223. package/dist/extraction-source-grounding-helpers.d.ts.map +1 -1
  224. package/dist/extraction-source-grounding-helpers.js +11 -1
  225. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  226. package/dist/extraction-source-grounding-rules.d.ts.map +1 -1
  227. package/dist/extraction-source-grounding-rules.js +3 -2
  228. package/dist/extraction-source-grounding.d.ts +1 -1
  229. package/dist/extraction-source-grounding.d.ts.map +1 -1
  230. package/dist/extraction-source-grounding.js +4 -3
  231. package/dist/extraction-span-materialize.js +2 -2
  232. package/dist/extraction.js +40 -37
  233. package/dist/{first-start-migration-HYAMKJ6V.js → first-start-migration-6A5BJPDW.js} +4 -4
  234. package/dist/{forget-OHAJ6PSU.js → forget-GXBWFKRC.js} +5 -4
  235. package/dist/{forget-OHAJ6PSU.js.map → forget-GXBWFKRC.js.map} +1 -1
  236. package/dist/{graph-edge-decay-CZ3SYLM4.js → graph-edge-decay-BYPZVJT4.js} +10 -9
  237. package/dist/graph-edge-decay-BYPZVJT4.js.map +1 -0
  238. package/dist/graph-jsonl.js +8 -7
  239. package/dist/graph-snapshot.js +8 -7
  240. package/dist/graph-write-lock.js +4 -3
  241. package/dist/graph.js +9 -8
  242. package/dist/harmonic-retrieval.js +29 -27
  243. package/dist/http-retry.js +2 -1
  244. package/dist/http-retry.js.map +1 -1
  245. package/dist/index.d.ts +1 -1
  246. package/dist/index.d.ts.map +1 -1
  247. package/dist/index.js +223 -218
  248. package/dist/lcm/engine.js +4 -4
  249. package/dist/lcm/index.js +12 -12
  250. package/dist/location/index.js +32 -30
  251. package/dist/maintenance/memory-governance.js +29 -27
  252. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +29 -27
  253. package/dist/maintenance/rebuild-memory-projection-runner.js +31 -29
  254. package/dist/maintenance/rebuild-memory-projection.js +30 -28
  255. package/dist/memory-browse-operations.js +87 -85
  256. package/dist/memory-browse.js +7 -7
  257. package/dist/memory-subject.js +5 -4
  258. package/dist/namespaces/migrate.js +30 -28
  259. package/dist/namespaces/search.js +9 -9
  260. package/dist/namespaces/storage.js +29 -27
  261. package/dist/offline-sync-changeset-generations.js +7 -6
  262. package/dist/offline-sync-embedding-generation.js +6 -5
  263. package/dist/offline-sync-impression-drain.js +4 -4
  264. package/dist/offline-sync-snapshot-stream.js +9 -9
  265. package/dist/offline-sync.js +10 -10
  266. package/dist/operator-doctor-corpus.js +32 -30
  267. package/dist/operator-toolkit.js +53 -51
  268. package/dist/orchestration/maintenance.js +41 -39
  269. package/dist/orchestrator.js +185 -182
  270. package/dist/page-versioning.js +5 -4
  271. package/dist/qmd-daemon-session.js +2 -2
  272. package/dist/qmd.js +4 -4
  273. package/dist/recall-explain-renderer.js +3 -3
  274. package/dist/recall-navigate-access.js +2 -2
  275. package/dist/recall-navigate-disclosure.js +2 -2
  276. package/dist/recall-navigate.js +2 -2
  277. package/dist/recall-navigation-operations.js +87 -85
  278. package/dist/recall-navigation.js +86 -84
  279. package/dist/recall-state-view-admission.js +7 -7
  280. package/dist/recall-state.js +4 -3
  281. package/dist/recall-why-service.js +7 -7
  282. package/dist/recall-xray-cli.js +4 -4
  283. package/dist/recall-xray-renderer.js +3 -3
  284. package/dist/recall-xray.js +2 -2
  285. package/dist/reconcile/cursor.js +4 -2
  286. package/dist/reconcile/cursor.js.map +1 -1
  287. package/dist/reconcile/manifest.js +9 -6
  288. package/dist/reconcile/plan.js +4 -2
  289. package/dist/{resolution-EKJHREVJ.js → resolution-7AY36LGJ.js} +8 -7
  290. package/dist/resolution-7AY36LGJ.js.map +1 -0
  291. package/dist/resume-bundles.js +40 -38
  292. package/dist/salvage-envelope.js +7 -6
  293. package/dist/search/factory.js +8 -8
  294. package/dist/search/index.js +14 -14
  295. package/dist/semantic-consolidation.js +34 -32
  296. package/dist/semantic-rule-promotion.js +29 -27
  297. package/dist/semantic-rule-verifier.js +29 -27
  298. package/dist/source-agent-qualifier.js +37 -34
  299. package/dist/standup/build.js +29 -27
  300. package/dist/storage/content-hash-index.d.ts +10 -0
  301. package/dist/storage/content-hash-index.d.ts.map +1 -1
  302. package/dist/storage/tombstone-blocked-capture-index.d.ts +3 -0
  303. package/dist/storage/tombstone-blocked-capture-index.d.ts.map +1 -1
  304. package/dist/storage/tombstone-blocked-capture-mutation.d.ts +23 -3
  305. package/dist/storage/tombstone-blocked-capture-mutation.d.ts.map +1 -1
  306. package/dist/storage.d.ts +6 -0
  307. package/dist/storage.d.ts.map +1 -1
  308. package/dist/storage.js +30 -28
  309. package/dist/subject-config.js +6 -5
  310. package/dist/summarizer.js +4 -4
  311. package/dist/summary-snapshot.js +4 -3
  312. package/dist/support-passport/index.js +89 -87
  313. package/dist/{trace-LXXCMZJA.js → trace-QBQVS5BC.js} +5 -21
  314. package/dist/trace-QBQVS5BC.js.map +1 -0
  315. package/dist/transfer/autodetect.js +1 -1
  316. package/dist/transfer/backup.js +1 -1
  317. package/dist/transfer/capsule-export.js +3 -3
  318. package/dist/transfer/capsule-import.js +7 -6
  319. package/dist/transfer/export-okf.js +29 -27
  320. package/dist/types.d.ts +9 -0
  321. package/dist/types.d.ts.map +1 -1
  322. package/dist/types.js +1 -1
  323. package/dist/utils/serialize-mutations.js +3 -2
  324. package/dist/utils/sleep.d.ts +6 -0
  325. package/dist/utils/sleep.d.ts.map +1 -1
  326. package/dist/verified-recall.js +29 -27
  327. package/dist/who-knows-cli.js +30 -28
  328. package/dist/who-knows.js +29 -27
  329. package/dist/write-envelope.js +6 -5
  330. package/package.json +22 -2
  331. package/src/capture-write-lock-backoff.test.ts +534 -0
  332. package/src/capture-write-lock-backoff.ts +140 -0
  333. package/src/capture-write-lock.ts +8 -0
  334. package/src/console/trace.ts +5 -36
  335. package/src/converge-config.ts +80 -1
  336. package/src/extraction-quote-grounding.test.ts +546 -0
  337. package/src/extraction-quote-grounding.ts +232 -0
  338. package/src/extraction-source-grounding-helpers.ts +35 -0
  339. package/src/extraction-source-grounding-rules.ts +90 -65
  340. package/src/extraction-source-grounding.ts +11 -2
  341. package/src/index.ts +1 -1
  342. package/src/providers/codex-subscription.test.ts +15 -3
  343. package/src/storage/content-hash-index.ts +10 -0
  344. package/src/storage/tombstone-blocked-capture-index.ts +8 -1
  345. package/src/storage/tombstone-blocked-capture-mutation.ts +133 -43
  346. package/src/storage.ts +13 -0
  347. package/src/types.ts +9 -0
  348. package/src/utils/sleep.ts +28 -0
  349. package/dist/chunk-375ARKRS.js.map +0 -1
  350. package/dist/chunk-6MINUTGJ.js +0 -64
  351. package/dist/chunk-6MINUTGJ.js.map +0 -1
  352. package/dist/chunk-7LEQREP2.js +0 -9
  353. package/dist/chunk-7LEQREP2.js.map +0 -1
  354. package/dist/chunk-KI6UOSNR.js.map +0 -1
  355. package/dist/chunk-QWWMS4AE.js.map +0 -1
  356. package/dist/chunk-Y3VDGK2O.js.map +0 -1
  357. package/dist/chunk-YRH3C2OJ.js.map +0 -1
  358. package/dist/chunk-YYO447A7.js.map +0 -1
  359. package/dist/trace-LXXCMZJA.js.map +0 -1
  360. /package/dist/{auto-sync-DGJOZYGT.js.map → auto-sync-7WWAKW6F.js.map} +0 -0
  361. /package/dist/{graph-edge-decay-CZ3SYLM4.js.map → capture-write-lock-backoff.js.map} +0 -0
  362. /package/dist/{resolution-EKJHREVJ.js.map → capture-write-lock.js.map} +0 -0
  363. /package/dist/{chunk-ZUMXY4KA.js.map → chunk-22W2XWGH.js.map} +0 -0
  364. /package/dist/{chunk-AV2OQF2O.js.map → chunk-3F3HA3R2.js.map} +0 -0
  365. /package/dist/{chunk-QZZPUREO.js.map → chunk-3GYSZHMT.js.map} +0 -0
  366. /package/dist/{chunk-AL6EHLB5.js.map → chunk-3X3PNU3T.js.map} +0 -0
  367. /package/dist/{chunk-BTJ6CAIA.js.map → chunk-4IYIGN53.js.map} +0 -0
  368. /package/dist/{chunk-BZTRPCCH.js.map → chunk-4KY5GSMB.js.map} +0 -0
  369. /package/dist/{chunk-UZSBCQEC.js.map → chunk-4OSG5Y6M.js.map} +0 -0
  370. /package/dist/{chunk-EHRE7ZG3.js.map → chunk-5B5WYAHQ.js.map} +0 -0
  371. /package/dist/{chunk-WCGJK4NQ.js.map → chunk-5FNZ3G6X.js.map} +0 -0
  372. /package/dist/{chunk-Y6DZ33PA.js.map → chunk-5GX5457J.js.map} +0 -0
  373. /package/dist/{chunk-OFCHT2TN.js.map → chunk-5LRV557D.js.map} +0 -0
  374. /package/dist/{chunk-CKUUP64O.js.map → chunk-5WCJLQTM.js.map} +0 -0
  375. /package/dist/{chunk-MZBWIJJN.js.map → chunk-63B2IZYE.js.map} +0 -0
  376. /package/dist/{chunk-DGRMWDQY.js.map → chunk-66BCOVW2.js.map} +0 -0
  377. /package/dist/{chunk-P2S6P7X6.js.map → chunk-6LG7BWKW.js.map} +0 -0
  378. /package/dist/{chunk-IPLYGWQF.js.map → chunk-7LCGFUMB.js.map} +0 -0
  379. /package/dist/{chunk-KYY4EACB.js.map → chunk-7Z3DLNSD.js.map} +0 -0
  380. /package/dist/{chunk-O4KYRDRT.js.map → chunk-B665A6BO.js.map} +0 -0
  381. /package/dist/{chunk-AKREOU5F.js.map → chunk-CB6ANA2I.js.map} +0 -0
  382. /package/dist/{chunk-5JMI26Q7.js.map → chunk-CBH2Z4UA.js.map} +0 -0
  383. /package/dist/{chunk-6M56RFFJ.js.map → chunk-CJRENHVZ.js.map} +0 -0
  384. /package/dist/{chunk-EGDYVYU7.js.map → chunk-CLWBFR7Q.js.map} +0 -0
  385. /package/dist/{chunk-6VAHJ2F6.js.map → chunk-DMDWFQMR.js.map} +0 -0
  386. /package/dist/{chunk-6OQ6N5RP.js.map → chunk-DPR2WTN3.js.map} +0 -0
  387. /package/dist/{chunk-K4QY55XV.js.map → chunk-EH4BQ7LT.js.map} +0 -0
  388. /package/dist/{chunk-5JCLELOP.js.map → chunk-EPJDSQHF.js.map} +0 -0
  389. /package/dist/{chunk-K2FSASGZ.js.map → chunk-EU534WGS.js.map} +0 -0
  390. /package/dist/{chunk-IWHEJXR2.js.map → chunk-EUAIYYYR.js.map} +0 -0
  391. /package/dist/{chunk-7KYJNHGM.js.map → chunk-EUCYTCFP.js.map} +0 -0
  392. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  393. /package/dist/{chunk-ON4ILX3G.js.map → chunk-FFOVKNQV.js.map} +0 -0
  394. /package/dist/{chunk-2KRNPFPK.js.map → chunk-FLI6DEIU.js.map} +0 -0
  395. /package/dist/{chunk-4G4B3Z2B.js.map → chunk-FP4JYE66.js.map} +0 -0
  396. /package/dist/{chunk-B7CANWCA.js.map → chunk-FSIMZNBC.js.map} +0 -0
  397. /package/dist/{chunk-OAIWPB2I.js.map → chunk-FT4UQYOV.js.map} +0 -0
  398. /package/dist/{chunk-X3VID2TT.js.map → chunk-FUFAXVBA.js.map} +0 -0
  399. /package/dist/{chunk-HYNEDMYJ.js.map → chunk-G2OYFTUD.js.map} +0 -0
  400. /package/dist/{chunk-XTN54NML.js.map → chunk-G3T6YMBO.js.map} +0 -0
  401. /package/dist/{chunk-XHWJRUVP.js.map → chunk-GELS5Z5Z.js.map} +0 -0
  402. /package/dist/{chunk-RT6D3WN7.js.map → chunk-GH7AOMJD.js.map} +0 -0
  403. /package/dist/{chunk-2LUSQV4U.js.map → chunk-GKJJNO7C.js.map} +0 -0
  404. /package/dist/{chunk-6Z2AZ4AJ.js.map → chunk-GMXWTJNU.js.map} +0 -0
  405. /package/dist/{chunk-B657ZGDH.js.map → chunk-HQSK2INQ.js.map} +0 -0
  406. /package/dist/{chunk-RWRQ67OR.js.map → chunk-I7S55EOB.js.map} +0 -0
  407. /package/dist/{chunk-KZO43HPY.js.map → chunk-J7JWFZHI.js.map} +0 -0
  408. /package/dist/{chunk-EMFBC7L3.js.map → chunk-JDZFIR2S.js.map} +0 -0
  409. /package/dist/{chunk-4THZGKQ2.js.map → chunk-JIHMUOOS.js.map} +0 -0
  410. /package/dist/{chunk-FZB4TS2W.js.map → chunk-JPTPS4OB.js.map} +0 -0
  411. /package/dist/{chunk-CS2JEHTB.js.map → chunk-JQ7XU625.js.map} +0 -0
  412. /package/dist/{chunk-3I3U6FFT.js.map → chunk-K7BN34IA.js.map} +0 -0
  413. /package/dist/{chunk-7OAIOE5P.js.map → chunk-KH2LKDX7.js.map} +0 -0
  414. /package/dist/{chunk-DA2INEB5.js.map → chunk-KR6ZKECI.js.map} +0 -0
  415. /package/dist/{chunk-5AOAQR37.js.map → chunk-L5DAHSEZ.js.map} +0 -0
  416. /package/dist/{chunk-RP5SJ3XR.js.map → chunk-LCKVXX5F.js.map} +0 -0
  417. /package/dist/{chunk-ZI7LMSNI.js.map → chunk-LLHZZOIB.js.map} +0 -0
  418. /package/dist/{chunk-OYKQ6T4V.js.map → chunk-MATDGSJ7.js.map} +0 -0
  419. /package/dist/{chunk-3NFN4Y4P.js.map → chunk-MGCKZWAE.js.map} +0 -0
  420. /package/dist/{chunk-6OMUHXHP.js.map → chunk-ML7ZJAKJ.js.map} +0 -0
  421. /package/dist/{chunk-YDH2FSDI.js.map → chunk-N45NEBOD.js.map} +0 -0
  422. /package/dist/{chunk-A2E4WNW4.js.map → chunk-N4C7QKOG.js.map} +0 -0
  423. /package/dist/{chunk-B43NMCGQ.js.map → chunk-N7KYEVLK.js.map} +0 -0
  424. /package/dist/{chunk-HT2C4EXO.js.map → chunk-NIRQGDYC.js.map} +0 -0
  425. /package/dist/{chunk-DXHVD4DS.js.map → chunk-NW2E4CI2.js.map} +0 -0
  426. /package/dist/{chunk-4NDWE44P.js.map → chunk-NZFFGO5O.js.map} +0 -0
  427. /package/dist/{chunk-KC46VZR5.js.map → chunk-O2IPAX26.js.map} +0 -0
  428. /package/dist/{chunk-M7V65M6H.js.map → chunk-O4SGYW7H.js.map} +0 -0
  429. /package/dist/{chunk-QUA7RLK6.js.map → chunk-OP6N4H6A.js.map} +0 -0
  430. /package/dist/{chunk-ZSJGYC3C.js.map → chunk-OQJKY3Z5.js.map} +0 -0
  431. /package/dist/{chunk-OFEHITAZ.js.map → chunk-OXNTOHL6.js.map} +0 -0
  432. /package/dist/{chunk-FQD2KPQH.js.map → chunk-P55FACBG.js.map} +0 -0
  433. /package/dist/{chunk-XERVJYH2.js.map → chunk-P5NQN4JE.js.map} +0 -0
  434. /package/dist/{chunk-XZLWYZ7C.js.map → chunk-P7TOIOT7.js.map} +0 -0
  435. /package/dist/{chunk-PBVNVKYN.js.map → chunk-PIN5OPBA.js.map} +0 -0
  436. /package/dist/{chunk-CNG2XVZG.js.map → chunk-PZHQWFR3.js.map} +0 -0
  437. /package/dist/{chunk-SVDU4OHO.js.map → chunk-Q35L7TYB.js.map} +0 -0
  438. /package/dist/{chunk-YEM7K3KD.js.map → chunk-QODKDRSP.js.map} +0 -0
  439. /package/dist/{chunk-IZT3BVDW.js.map → chunk-QOZJCSFO.js.map} +0 -0
  440. /package/dist/{chunk-6T42L5FI.js.map → chunk-QS3OLP5I.js.map} +0 -0
  441. /package/dist/{chunk-PAAJWQH5.js.map → chunk-QUMKDRCF.js.map} +0 -0
  442. /package/dist/{chunk-JFVCDEIC.js.map → chunk-QX6JN3O4.js.map} +0 -0
  443. /package/dist/{chunk-KZEMFD6E.js.map → chunk-R2H4ZFBJ.js.map} +0 -0
  444. /package/dist/{chunk-GKIXBH7Y.js.map → chunk-RTKV5XHL.js.map} +0 -0
  445. /package/dist/{chunk-ZQ3WU6JO.js.map → chunk-RXFCU3CY.js.map} +0 -0
  446. /package/dist/{chunk-BOOFTFFE.js.map → chunk-S2I7DL5Q.js.map} +0 -0
  447. /package/dist/{chunk-2NCBDGND.js.map → chunk-SA6GMZJY.js.map} +0 -0
  448. /package/dist/{chunk-NSFOERZQ.js.map → chunk-SIIRTDJ4.js.map} +0 -0
  449. /package/dist/{chunk-A6TVQ3QP.js.map → chunk-SS3IS2JR.js.map} +0 -0
  450. /package/dist/{chunk-VFTK5WKI.js.map → chunk-STBX5X6B.js.map} +0 -0
  451. /package/dist/{chunk-WVHRNAXL.js.map → chunk-SWWHIJUJ.js.map} +0 -0
  452. /package/dist/{chunk-WADSXS4K.js.map → chunk-SX4QDWXK.js.map} +0 -0
  453. /package/dist/{chunk-ZIZ2G47N.js.map → chunk-TITG2NBS.js.map} +0 -0
  454. /package/dist/{chunk-LZKOVXMX.js.map → chunk-TRMJ6BYC.js.map} +0 -0
  455. /package/dist/{chunk-U7VPOXVM.js.map → chunk-TZNDKTX5.js.map} +0 -0
  456. /package/dist/{chunk-WWSRLS4M.js.map → chunk-UMTCNEVQ.js.map} +0 -0
  457. /package/dist/{chunk-4TTGRETU.js.map → chunk-UQDG3YLN.js.map} +0 -0
  458. /package/dist/{chunk-AAM66QCP.js.map → chunk-UZRSI6NX.js.map} +0 -0
  459. /package/dist/{chunk-2CXQZXWM.js.map → chunk-V4MB5ONM.js.map} +0 -0
  460. /package/dist/{chunk-CYEK6Z3P.js.map → chunk-VW6VIJOS.js.map} +0 -0
  461. /package/dist/{chunk-5ZJYHOJT.js.map → chunk-W47S5TIH.js.map} +0 -0
  462. /package/dist/{chunk-CBP4HWCL.js.map → chunk-W5MCEVUS.js.map} +0 -0
  463. /package/dist/{chunk-WETFW255.js.map → chunk-WLMZ2L5P.js.map} +0 -0
  464. /package/dist/{chunk-XRBHXUTQ.js.map → chunk-WSGPFRBH.js.map} +0 -0
  465. /package/dist/{chunk-UOKPJFO3.js.map → chunk-WVADKFWV.js.map} +0 -0
  466. /package/dist/{chunk-P34FDDB5.js.map → chunk-XISROV24.js.map} +0 -0
  467. /package/dist/{chunk-FZVROZKC.js.map → chunk-XVZA6VXC.js.map} +0 -0
  468. /package/dist/{chunk-JUWJYXI4.js.map → chunk-Y4NKEXQT.js.map} +0 -0
  469. /package/dist/{chunk-2ZQJLBV6.js.map → chunk-YE36AJL7.js.map} +0 -0
  470. /package/dist/{chunk-PCWXLAJY.js.map → chunk-YFMBHQRG.js.map} +0 -0
  471. /package/dist/{chunk-RBJQYMMT.js.map → chunk-YRULQW5J.js.map} +0 -0
  472. /package/dist/{chunk-QUNDYIYZ.js.map → chunk-YYEOR4XN.js.map} +0 -0
  473. /package/dist/{chunk-VYPFEVOM.js.map → chunk-ZJVMUBYF.js.map} +0 -0
  474. /package/dist/{chunk-5MDM7UE4.js.map → chunk-ZSH2NRDV.js.map} +0 -0
  475. /package/dist/{chunk-3J5JKBYD.js.map → chunk-ZV65I6ME.js.map} +0 -0
  476. /package/dist/{first-start-migration-HYAMKJ6V.js.map → first-start-migration-6A5BJPDW.js.map} +0 -0
@@ -1,7 +1,6 @@
1
1
  import {
2
- CAPSULE_SCHEMA_VERSION,
3
- EXPORT_FORMAT
4
- } from "./chunk-J4EB7DNW.js";
2
+ encryptCapsuleFile
3
+ } from "./chunk-X7Y7WX73.js";
5
4
  import {
6
5
  CAPSULE_ID_PATTERN,
7
6
  CapsuleBlockSchema,
@@ -9,8 +8,9 @@ import {
9
8
  ExportManifestV2Schema
10
9
  } from "./chunk-WEHSQBFR.js";
11
10
  import {
12
- encryptCapsuleFile
13
- } from "./chunk-X7Y7WX73.js";
11
+ CAPSULE_SCHEMA_VERSION,
12
+ EXPORT_FORMAT
13
+ } from "./chunk-J4EB7DNW.js";
14
14
  import {
15
15
  DEFAULT_TRANSFER_EXCLUDE_DIRS,
16
16
  computeTransferOutputRel
@@ -261,4 +261,4 @@ export {
261
261
  exportCapsule,
262
262
  isValidCapsuleSince
263
263
  };
264
- //# sourceMappingURL=chunk-IPLYGWQF.js.map
264
+ //# sourceMappingURL=chunk-7LCGFUMB.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-FEHIOYML.js";
8
8
  import {
9
9
  composeMemoryEnvelope
10
- } from "./chunk-OFCHT2TN.js";
10
+ } from "./chunk-5LRV557D.js";
11
11
  import {
12
12
  displayErrorDetail
13
13
  } from "./chunk-RL6NEVXT.js";
@@ -1463,4 +1463,4 @@ export {
1463
1463
  serializeDecisionRecord,
1464
1464
  parseDecisionRecord
1465
1465
  };
1466
- //# sourceMappingURL=chunk-KYY4EACB.js.map
1466
+ //# sourceMappingURL=chunk-7Z3DLNSD.js.map
@@ -708,6 +708,26 @@ function hasContradictoryPolarity(candidate, source) {
708
708
  }
709
709
  return false;
710
710
  }
711
+ function normalizedEntityIdentifierTokens(name) {
712
+ const identifier = normalizeForExactMatch(name).replace(/[-_]+/gu, " ");
713
+ const tokens = groundingLexemes(identifier).filter(({ token }) => GROUNDING_STOPWORDS[token] !== true).map(({ token }) => stemToken(token, true));
714
+ return tokens.length > 1 && GROUNDING_ENTITY_TYPE_PREFIXES.has(tokens[0] ?? "") ? tokens.slice(1) : tokens;
715
+ }
716
+ function entityNameStart(name, sentence) {
717
+ const nameTokens = normalizedEntityIdentifierTokens(name);
718
+ if (nameTokens.length === 0) return -1;
719
+ const sentenceTokens = groundingLexemes(sentence).filter(({ token }) => GROUNDING_STOPWORDS[token] !== true).map(({ token, preserveTerminalS }) => stemToken(token, preserveTerminalS));
720
+ return sentenceTokens.findIndex((_, start) => nameTokens.every((token, offset) => sentenceTokens[start + offset] === token));
721
+ }
722
+ function isGroundedEntityName(name, source) {
723
+ return sourceSentences(source).some((sentence) => entityNameStart(name, sentence) >= 0);
724
+ }
725
+ function hasNonAssertiveReporting(text) {
726
+ return groundingLexemes(text).some(({ token }) => isNonAssertiveReportingVerb(token));
727
+ }
728
+ function hasDenialReporting(text) {
729
+ return groundingLexemes(text).some(({ token }) => isDenialReportingVerb(token));
730
+ }
711
731
 
712
732
  export {
713
733
  isInterrogativeSourceSentence,
@@ -738,6 +758,11 @@ export {
738
758
  normalizedGroundingAlignmentTokenSequence,
739
759
  normalizedGroundingTokenSequence,
740
760
  areGroundingTokensCompatible,
741
- hasContradictoryPolarity
761
+ hasContradictoryPolarity,
762
+ normalizedEntityIdentifierTokens,
763
+ entityNameStart,
764
+ isGroundedEntityName,
765
+ hasNonAssertiveReporting,
766
+ hasDenialReporting
742
767
  };
743
- //# sourceMappingURL=chunk-LNH76ZJX.js.map
768
+ //# sourceMappingURL=chunk-AIYXVWUH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extraction-source-grounding-helpers.ts"],"sourcesContent":["export function isInterrogativeSourceSentence(sentence: string): boolean {\n const normalized = sentence.trim();\n const embeddedQuestionVerbIndex = normalized.search(\n /\\b(?:determine|know|wonder|ask(?:ed)?|question|decide|check|confirm|find|figure|understand|unclear)\\b/iu,\n );\n const embeddedQuestionMarkerIndex = normalized.search(/\\b(?:whether|if)\\b/iu);\n const hasEmbeddedQuestion = embeddedQuestionVerbIndex >= 0\n && embeddedQuestionMarkerIndex > embeddedQuestionVerbIndex;\n return normalized.endsWith(\"?\")\n || hasEmbeddedQuestion\n || (\n !normalized.includes(\":\")\n && /^(?:suppose|assuming|assume|maybe|perhaps|hypothetically|if|whether|imagine|imagining|presume|presuming|supposing|is|are|am|was|were|do|does|did|can|could|will|would|should|has|have|had|what|which|when|where|why|how|who|whom)\\b/iu.test(\n normalized,\n )\n );\n}\n\nexport function containsContiguousGroundingTokens(\n candidateTokens: ReadonlyArray<string>,\n sourceTokens: ReadonlyArray<string>,\n): boolean {\n if (candidateTokens.length === 0 || candidateTokens.length > sourceTokens.length) return false;\n return sourceTokens.some((_, start) =>\n candidateTokens.every((token, offset) => sourceTokens[start + offset] === token),\n );\n}\n\nexport function hasExplicitRoleSubjectToken(\n candidateRole: string | undefined,\n sourceTokensBySentence: ReadonlyArray<ReadonlyArray<string>>,\n): boolean {\n return candidateRole !== undefined\n && sourceTokensBySentence.some((tokens) =>\n tokens.some((token) => token.replace(/^[\\u0000\\u0001]/u, \"\") === candidateRole));\n}\n\nexport function splitGroundingClauses(\n sentences: ReadonlyArray<string>,\n inheritCoordinatedSubjects = false,\n): string[] {\n return sentences.flatMap((sentence) => {\n const clauses = sentence\n .split(/,\\s+(?=[\\p{L}][\\p{L}\\p{N}'’-]*\\s+\\S)/gu)\n .flatMap((commaClause) =>\n commaClause\n .split(/\\s*(?::|[—–])\\s+|\\s+\\/\\s+/u)\n .flatMap((delimiterClause) =>\n delimiterClause\n .split(/\\s+(?:and|but|or|while|although|because)\\s+/gu)\n .map((clause) => clause.trim())\n .filter((clause) => clause.length > 0),\n ),\n );\n if (!inheritCoordinatedSubjects || clauses.length < 2) return clauses;\n\n const firstLexemes = groundingLexemes(clauses[0]!)\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true);\n const firstPredicateIndex = firstLexemes.findIndex(({ isPredicate }) => isPredicate);\n let subjectLexemes = firstLexemes\n .slice(0, firstPredicateIndex < 1 ? 1 : firstPredicateIndex)\n .filter(({ token }) => !token.endsWith(\"ly\"));\n let subject = subjectLexemes.map(({ surface }) => surface).join(\" \");\n let predicate = firstLexemes[firstPredicateIndex < 1 ? 1 : firstPredicateIndex]?.surface;\n if (subject.length === 0 || predicate === undefined) return clauses;\n\n const sourceSpans = [clauses[0]!];\n for (const clause of clauses.slice(1)) {\n const clauseLexemes = groundingLexemes(clause)\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true);\n const clausePredicateIndex = clauseLexemes.findIndex(({ isPredicate }) => isPredicate);\n const clauseSubjectLexemes = clausePredicateIndex > 0\n ? clauseLexemes\n .slice(0, clausePredicateIndex)\n .filter(({ token }) => !token.endsWith(\"ly\"))\n : [];\n const repeatsSubject = clauseSubjectLexemes.length === subjectLexemes.length\n && subjectLexemes.every(\n ({ token }, index) => clauseSubjectLexemes[index]?.token === token,\n );\n if (repeatsSubject) {\n sourceSpans.push(clause);\n continue;\n }\n if (clauseSubjectLexemes.length > 0) {\n subjectLexemes = clauseSubjectLexemes;\n subject = subjectLexemes.map(({ surface }) => surface).join(\" \");\n predicate = clauseLexemes[clausePredicateIndex]?.surface;\n sourceSpans.push(clause);\n continue;\n }\n const prefix = clausePredicateIndex === -1 ? `${subject} ${predicate}` : subject;\n sourceSpans.push(clause, `${prefix} ${clause}`);\n }\n return sourceSpans;\n });\n}\n\nexport const GROUNDING_STOPWORDS: Record<string, true> = {\n a: true,\n an: true,\n and: true,\n are: true,\n as: true,\n at: true,\n be: true,\n been: true,\n being: true,\n but: true,\n by: true,\n can: true,\n could: true,\n did: true,\n do: true,\n does: true,\n for: true,\n from: true,\n had: true,\n has: true,\n have: true,\n he: true,\n her: true,\n here: true,\n hers: true,\n him: true,\n his: true,\n how: true,\n i: true,\n if: true,\n in: true,\n into: true,\n is: true,\n it: true,\n its: true,\n just: true,\n me: true,\n my: true,\n no: true,\n not: true,\n of: true,\n on: true,\n only: true,\n or: true,\n our: true,\n ours: true,\n she: true,\n so: true,\n than: true,\n that: true,\n the: true,\n their: true,\n them: true,\n then: true,\n there: true,\n these: true,\n they: true,\n this: true,\n those: true,\n to: true,\n too: true,\n under: true,\n up: true,\n us: true,\n very: true,\n was: true,\n we: true,\n were: true,\n what: true,\n when: true,\n why: true,\n where: true,\n which: true,\n who: true,\n whom: true,\n will: true,\n with: true,\n would: true,\n you: true,\n your: true,\n};\n\nexport const GROUNDING_NEGATION_TOKENS = new Set([\n \"no\",\n \"not\",\n \"false\",\n \"untrue\",\n \"incorrect\",\n \"wrong\",\n \"never\",\n \"without\",\n \"neither\",\n \"nor\",\n \"none\",\n \"cannot\",\n \"cant\",\n \"can't\",\n \"don't\",\n \"doesn't\",\n \"didn't\",\n \"isn't\",\n \"aren't\",\n \"wasn't\",\n \"weren't\",\n \"won't\",\n \"wouldn't\",\n \"couldn't\",\n \"shouldn't\",\n \"haven't\",\n \"hasn't\",\n \"hadn't\",\n]);\n\nexport const GROUNDING_AUXILIARY_TOKENS = new Set([\n \"am\",\n \"are\",\n \"be\",\n \"been\",\n \"being\",\n \"can\",\n \"could\",\n \"did\",\n \"do\",\n \"does\",\n \"had\",\n \"has\",\n \"have\",\n \"is\",\n \"was\",\n \"were\",\n \"will\",\n \"would\",\n \"should\",\n]);\n\nexport const GROUNDING_COPULAR_FORMS = new Set([\n \"am\",\n \"are\",\n \"be\",\n \"been\",\n \"being\",\n \"is\",\n \"was\",\n \"were\",\n]);\n\nexport const GROUNDING_SUBJECT_PRONOUNS = new Set([\n \"he\",\n \"she\",\n \"they\",\n \"it\",\n \"i\",\n \"we\",\n \"you\",\n]);\nexport const GROUNDING_ENTITY_TYPE_PREFIXES = new Set([\n \"person\",\n \"project\",\n \"tool\",\n \"company\",\n \"place\",\n \"other\",\n]);\n\nexport const GROUNDING_COMMON_VERB_FORMS: Record<string, true> = {\n add: true,\n adds: true,\n call: true,\n calls: true,\n contain: true,\n contains: true,\n employ: true,\n deploy: true,\n deploys: true,\n design: true,\n designs: true,\n employs: true,\n fill: true,\n fills: true,\n go: true,\n goes: true,\n gone: true,\n went: true,\n give: true,\n gives: true,\n has: true,\n host: true,\n hosts: true,\n like: true,\n likes: true,\n manage: true,\n manages: true,\n make: true,\n makes: true,\n need: true,\n needs: true,\n own: true,\n owns: true,\n plan: true,\n plans: true,\n prefer: true,\n prefers: true,\n require: true,\n requires: true,\n run: true,\n runs: true,\n sleep: true,\n sleeps: true,\n stop: true,\n stops: true,\n swim: true,\n swims: true,\n share: true,\n shares: true,\n support: true,\n supports: true,\n take: true,\n takes: true,\n try: true,\n tries: true,\n use: true,\n uses: true,\n want: true,\n wants: true,\n work: true,\n works: true,\n};\n\n\nexport interface GroundingLexeme {\n token: string;\n surface: string;\n isPredicate: boolean;\n preserveTerminalS: boolean;\n}\n\nexport function groundingLexemes(text: string): GroundingLexeme[] {\n const rawTokens = (text.normalize(\"NFKC\").match(\n /[\\p{L}\\p{N}]+(?:['’][\\p{L}\\p{N}]+)?(?:\\+\\+[\\p{L}\\p{N}]*|#[\\p{L}\\p{N}]*)?/gu,\n ) ?? []).flatMap(splitSpacelessScriptToken);\n const tokens = rawTokens.map((rawToken) =>\n rawToken.replaceAll(\"’\", \"'\").toLocaleLowerCase());\n let predicateIndex = tokens.findIndex((token, index) => {\n const previousToken = tokens[index - 1];\n const followsAuxiliary = previousToken !== undefined\n && GROUNDING_AUXILIARY_TOKENS.has(previousToken);\n let previousMeaningfulIndex = index - 1;\n while (\n previousMeaningfulIndex >= 0\n && !GROUNDING_COPULAR_FORMS.has(tokens[previousMeaningfulIndex] ?? \"\")\n && (\n GROUNDING_STOPWORDS[tokens[previousMeaningfulIndex] ?? \"\"] === true\n || (tokens[previousMeaningfulIndex] ?? \"\").endsWith(\"ly\")\n )\n ) {\n previousMeaningfulIndex -= 1;\n }\n const followsCopularAuxiliary = GROUNDING_COPULAR_FORMS.has(\n tokens[previousMeaningfulIndex] ?? \"\",\n );\n const capitalized = /^\\p{Lu}/u.test(rawTokens[index] ?? \"\");\n const terminalSInflection = index > 0\n && token.endsWith(\"s\")\n && !token.endsWith(\"ss\")\n && !GROUNDING_AUXILIARY_TOKENS.has(token);\n const capitalizedSubjectHasLaterPredicate = index === 0\n && tokens.some((laterToken, laterIndex) =>\n laterIndex > 0\n && !/^\\p{Lu}/u.test(rawTokens[laterIndex] ?? \"\")\n && (\n GROUNDING_AUXILIARY_TOKENS.has(laterToken)\n || GROUNDING_COMMON_VERB_FORMS[laterToken] === true\n || laterToken.endsWith(\"ed\")\n || laterToken.endsWith(\"ing\")\n ));\n if (capitalized && (index !== 0 || capitalizedSubjectHasLaterPredicate)) return false;\n if (followsCopularAuxiliary && terminalSInflection) return false;\n return GROUNDING_COMMON_VERB_FORMS[token] === true\n || token.endsWith(\"ed\")\n || token.endsWith(\"ing\")\n || (followsAuxiliary && !followsCopularAuxiliary)\n || terminalSInflection;\n });\n if (predicateIndex === -1) {\n const leadingSubjectLength = rawTokens.findIndex((rawToken) => !/^\\p{Lu}/u.test(rawToken));\n if (leadingSubjectLength > 0) {\n predicateIndex = tokens.findIndex((token, index) =>\n index >= leadingSubjectLength\n && (\n GROUNDING_AUXILIARY_TOKENS.has(token)\n || (\n GROUNDING_STOPWORDS[token] !== true\n && !/^\\p{Lu}/u.test(rawTokens[index] ?? \"\")\n )\n ));\n }\n }\n return rawTokens.map((rawToken, index) => {\n const token = tokens[index]!;\n const isPredicate = index === predicateIndex;\n return {\n token,\n surface: rawToken,\n preserveTerminalS: !isPredicate && (\n /^\\p{Lu}/u.test(rawToken)\n || token.endsWith(\"s\")\n ),\n isPredicate,\n };\n });\n}\n\nexport function tokenSequence(text: string): string[] {\n return groundingLexemes(text).map(({ token }) => token);\n}\n\nexport function containsExactTokenSequence(candidate: string, source: string): boolean {\n const candidateTokens = tokenSequence(candidate);\n const sourceTokens = tokenSequence(source);\n if (candidateTokens.length === 0 || candidateTokens.length > sourceTokens.length) return false;\n return sourceTokens.some((_, index) =>\n candidateTokens.every((token, offset) => sourceTokens[index + offset] === token),\n );\n\n}\n\nexport function isNegationCue(token: string): boolean {\n return GROUNDING_NEGATION_TOKENS.has(token) || token.endsWith(\"n't\");\n}\n\nexport function isAttachedNegatedAuxiliary(token: string): boolean {\n return token.endsWith(\"n't\")\n || token === \"cannot\"\n || token === \"cant\"\n || token === \"can't\";\n}\n\nexport function isNegatedAt(tokens: ReadonlyArray<string>, index: number): boolean {\n if (tokens[index - 1] === \"only\" && tokens[index - 2] === \"not\") return false;\n const previousStart = Math.max(0, index - 2);\n for (let i = previousStart; i < index; i += 1) {\n if (isNegationCue(tokens[i])) return true;\n }\n\n if (tokens[index - 1] === \"than\" && tokens[index - 2] === \"rather\") return true;\n if (tokens[index - 1] === \"of\" && tokens[index - 2] === \"instead\") return true;\n\n const next = tokens[index + 1];\n if (next !== undefined && isAttachedNegatedAuxiliary(next)) return true;\n const nextNext = tokens[index + 2];\n return next !== undefined\n && nextNext !== undefined\n && GROUNDING_AUXILIARY_TOKENS.has(next)\n && isNegationCue(nextNext);\n}\n\nexport const GROUNDING_MIN_SHARED_TOKENS = 2;\nexport const GROUNDING_MIN_COVERAGE = 0.5;\n\nconst STRICT_GROUNDING_TOKEN_PREFIX = \"\\u0000\";\nconst INFLECTED_GROUNDING_TOKEN_PREFIX = \"\\u0001\";\n\nexport function stemToken(\n token: string,\n preserveTerminalS = false,\n markExact = false,\n): string {\n if (token.endsWith(\"'s\")) return token.slice(0, -2);\n if (preserveTerminalS) {\n if (!markExact) return token;\n return `${STRICT_GROUNDING_TOKEN_PREFIX}${token}`;\n }\n if (token.length > 5 && token.endsWith(\"ing\")) {\n const stem = token.slice(0, -3);\n const inflectionDoubled = /(.)\\1$/u.test(stem) && stem.length > 3 && !/[lsz]$/u.test(stem);\n const normalized = inflectionDoubled ? stem.slice(0, -1) : stem;\n return markExact ? `${INFLECTED_GROUNDING_TOKEN_PREFIX}${normalized}` : normalized;\n }\n if (token.length > 4 && token.endsWith(\"ied\")) {\n const normalized = `${token.slice(0, -3)}y`;\n return markExact ? `${INFLECTED_GROUNDING_TOKEN_PREFIX}${normalized}` : normalized;\n }\n if (token.length > 4 && token.endsWith(\"ed\")) {\n const stem = token.slice(0, -2);\n const inflectionDoubled = /(.)\\1$/u.test(stem) && stem.length > 3 && !/[lsz]$/u.test(stem);\n const normalized = inflectionDoubled ? stem.slice(0, -1) : stem;\n return markExact ? `${INFLECTED_GROUNDING_TOKEN_PREFIX}${normalized}` : normalized;\n }\n if (token.length > 3 && token.endsWith(\"s\") && !token.endsWith(\"ss\")) {\n return token.endsWith(\"ies\") ? `${token.slice(0, -3)}y` : token.slice(0, -1);\n }\n return token;\n}\n\n\nexport function tokenize(text: string): Set<string> {\n const tokens = new Set<string>();\n for (const { token, preserveTerminalS } of groundingLexemes(text)) {\n if (GROUNDING_STOPWORDS[token] !== true) tokens.add(stemToken(token, preserveTerminalS, true));\n }\n return tokens;\n}\n\nconst SPACELESS_SCRIPT_CHARACTER_PATTERN = new RegExp(\n \"[\\\\p{Script=Han}\\\\p{Script=Hiragana}\\\\p{Script=Katakana}\\\\p{Script=Hangul}\"\n + \"\\\\p{Script=Thai}\\\\p{Script=Lao}\\\\p{Script=Khmer}\\\\p{Script=Myanmar}]\",\n \"u\",\n);\nconst SPACELESS_SCRIPT_LCS_SOURCE_LIMIT = 4096;\n\nfunction containsSpacelessScriptCharacter(text: string): boolean {\n return SPACELESS_SCRIPT_CHARACTER_PATTERN.test(text);\n}\n\n/**\n * Scripts without word separators (CJK, Hangul, Thai, ...) must not become one\n * whitespace-delimited token: a paraphrase never matches a whole-run token, so\n * grounded CJK facts and entity names were dropped. Split those runs into\n * per-character lexemes so contiguous-token matching behaves as substring\n * matching for these scripts.\n */\nfunction splitSpacelessScriptToken(rawToken: string): string[] {\n if (!containsSpacelessScriptCharacter(rawToken)) return [rawToken];\n const parts: string[] = [];\n let otherScriptRun = \"\";\n for (const character of rawToken) {\n if (containsSpacelessScriptCharacter(character)) {\n if (otherScriptRun.length > 0) {\n parts.push(otherScriptRun);\n otherScriptRun = \"\";\n }\n parts.push(character);\n } else {\n otherScriptRun += character;\n }\n }\n if (otherScriptRun.length > 0) parts.push(otherScriptRun);\n return parts;\n}\n\nfunction spacelessScriptCharacterSequence(text: string): string[] {\n const characters: string[] = [];\n for (const character of text.normalize(\"NFKC\")) {\n if (containsSpacelessScriptCharacter(character)) characters.push(character);\n }\n return characters;\n}\n\nfunction spacelessScriptCharacterNgrams(text: string): Set<string> {\n const grams = new Set<string>();\n let previousCharacter = \"\";\n for (const character of spacelessScriptCharacterSequence(text)) {\n if (previousCharacter !== \"\") grams.add(previousCharacter + character);\n previousCharacter = character;\n }\n return grams;\n}\n\nfunction longestCommonSubstringLength(\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>,\n): number {\n if (left.length === 0 || right.length === 0) return 0;\n let longest = 0;\n let previousRow = new Array<number>(right.length).fill(0);\n for (const leftCharacter of left) {\n const currentRow = new Array<number>(right.length).fill(0);\n for (let index = 0; index < right.length; index += 1) {\n if (leftCharacter !== right[index]) continue;\n currentRow[index] = (index > 0 ? previousRow[index - 1] : 0) + 1;\n if (currentRow[index] > longest) longest = currentRow[index];\n }\n previousRow = currentRow;\n }\n return longest;\n}\n\n/**\n * Script-aware grounding score for candidates written in scripts without word\n * separators. Returns null when the candidate has no such characters, so\n * whitespace-delimited candidates keep the default scorer. The longest-common-\n * span gate rejects topical overlap that shares mostly function characters.\n * ponytail: n-grams and the common-span gate ignore argument order; swap in a\n * segmentation-aware matcher if CJK role confusion surfaces.\n */\nexport function spacelessScriptGroundedTokenScore(candidate: string, source: string): number | null {\n const candidateGrams = spacelessScriptCharacterNgrams(candidate);\n if (candidateGrams.size === 0) return null;\n const sourceGrams = spacelessScriptCharacterNgrams(source);\n let sharedGrams = 0;\n for (const gram of candidateGrams) {\n if (sourceGrams.has(gram)) sharedGrams += 1;\n }\n if (sharedGrams < GROUNDING_MIN_SHARED_TOKENS) return 0;\n const coverage = sharedGrams / candidateGrams.size;\n if (coverage < GROUNDING_MIN_COVERAGE) return 0;\n const candidateCharacters = spacelessScriptCharacterSequence(candidate);\n const sourceCharacters = spacelessScriptCharacterSequence(source);\n if (sourceCharacters.length <= SPACELESS_SCRIPT_LCS_SOURCE_LIMIT) {\n const anchoredFraction = longestCommonSubstringLength(candidateCharacters, sourceCharacters)\n / candidateCharacters.length;\n if (anchoredFraction < GROUNDING_MIN_COVERAGE) return 0;\n }\n const sourceTokens = tokenize(source);\n for (const token of tokenize(candidate)) {\n if (containsSpacelessScriptCharacter(token)) continue;\n if (![...sourceTokens].some((sourceToken) => areGroundingTokensCompatible(token, sourceToken))) {\n return 0;\n }\n }\n return coverage;\n}\n\nexport function normalizeForExactMatch(text: string): string {\n return text.normalize(\"NFKC\").toLocaleLowerCase().replace(/\\s+/gu, \" \").trim();\n}\n\nexport function sourceSentences(source: string): string[] {\n const sentences: string[] = [];\n let sentenceStart = 0;\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n const nextCharacter = source[index + 1];\n const boundary = character === \"!\"\n || character === \"?\"\n || character === \";\"\n || character === \"\\n\"\n || (character === \".\" && (\n nextCharacter === undefined\n || /\\s/u.test(nextCharacter)\n || /[\"')\\]}]/u.test(nextCharacter)\n ));\n if (!boundary) continue;\n let sentenceEnd = character === \"\\n\" ? index : index + 1;\n while (/[.!?;\\n]/u.test(source[sentenceEnd] ?? \"\")) sentenceEnd += 1;\n const sentence = source.slice(sentenceStart, sentenceEnd).trim();\n if (sentence.length > 0) sentences.push(sentence);\n sentenceStart = sentenceEnd;\n index = sentenceEnd - 1;\n }\n const trailingSentence = source.slice(sentenceStart).trim();\n if (trailingSentence.length > 0) sentences.push(trailingSentence);\n return sentences.length > 0 ? sentences : [source];\n}\n\n\nexport function groundingTokenSequence(text: string): string[] {\n let lexemes = groundingLexemes(text);\n while (lexemes.length > 0 && GROUNDING_AUXILIARY_TOKENS.has(lexemes[0]!.token)) {\n lexemes = lexemes.slice(1);\n }\n return lexemes\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true)\n .map(({ token, preserveTerminalS }) => stemToken(token, preserveTerminalS, true));\n}\nexport function normalizedGroundingAlignmentTokenSequence(text: string): string[] {\n const normalized = normalizedGroundingTokenSequence(text);\n const firstLexeme = groundingLexemes(text)[0];\n if (firstLexeme === undefined || !GROUNDING_SUBJECT_PRONOUNS.has(firstLexeme.token)) {\n return normalized;\n }\n return [stemToken(firstLexeme.token, firstLexeme.preserveTerminalS, true), ...normalized];\n}\n\n\nexport function normalizedGroundingTokenSequence(text: string): string[] {\n return groundingTokenSequence(text).map((token) => token.replace(/'$/u, \"\"));\n}\n\nexport function areGroundingTokensCompatible(left: string, right: string): boolean {\n const leftPrefix = left[0];\n const rightPrefix = right[0];\n const leftMarked = leftPrefix === STRICT_GROUNDING_TOKEN_PREFIX\n || leftPrefix === INFLECTED_GROUNDING_TOKEN_PREFIX;\n const rightMarked = rightPrefix === STRICT_GROUNDING_TOKEN_PREFIX\n || rightPrefix === INFLECTED_GROUNDING_TOKEN_PREFIX;\n const leftToken = leftMarked ? left.slice(1) : left;\n const rightToken = rightMarked ? right.slice(1) : right;\n if (leftToken === rightToken) {\n const strictToInflected = (\n leftPrefix === STRICT_GROUNDING_TOKEN_PREFIX\n && rightPrefix === INFLECTED_GROUNDING_TOKEN_PREFIX\n ) || (\n rightPrefix === STRICT_GROUNDING_TOKEN_PREFIX\n && leftPrefix === INFLECTED_GROUNDING_TOKEN_PREFIX\n );\n return !strictToInflected;\n }\n if (leftPrefix === STRICT_GROUNDING_TOKEN_PREFIX || rightPrefix === STRICT_GROUNDING_TOKEN_PREFIX) {\n return false;\n }\n return `${leftToken}e` === rightToken || leftToken === `${rightToken}e`;\n}\nconst GROUNDING_DENIAL_REPORTING_VERBS = new Set([\n \"deny\",\n \"denied\",\n \"denies\",\n \"denying\",\n \"dispute\",\n \"disputed\",\n \"disputes\",\n \"disputing\",\n \"reject\",\n \"rejected\",\n \"rejects\",\n \"rejecting\",\n \"refute\",\n \"refuted\",\n \"refutes\",\n \"refuting\",\n \"contradict\",\n \"contradicted\",\n \"contradicts\",\n \"contradicting\",\n \"disprove\",\n \"disproved\",\n \"disproves\",\n \"disproving\",\n]);\n\nfunction isDenialReportingVerb(token: string): boolean {\n return GROUNDING_DENIAL_REPORTING_VERBS.has(token);\n}\nconst GROUNDING_NON_ASSERTIVE_REPORTING_VERBS = new Set([\n \"allege\",\n \"alleged\",\n \"alleges\",\n \"alleging\",\n \"allegedly\",\n \"assert\",\n \"asserted\",\n \"asserts\",\n \"asserting\",\n \"believe\",\n \"believed\",\n \"believes\",\n \"believing\",\n \"claim\",\n \"claimed\",\n \"claims\",\n \"claiming\",\n \"doubt\",\n \"doubted\",\n \"doubts\",\n \"doubting\",\n \"uncertain\",\n \"unsure\",\n \"unclear\",\n \"unknown\",\n \"possibly\",\n \"probably\",\n \"imagine\",\n \"imagined\",\n \"imagines\",\n \"imagining\",\n \"report\",\n \"reported\",\n \"reports\",\n \"reporting\",\n \"reportedly\",\n \"say\",\n \"said\",\n \"says\",\n \"saying\",\n \"speculate\",\n \"speculated\",\n \"speculates\",\n \"speculating\",\n \"suspect\",\n \"suspected\",\n \"suspects\",\n \"suspecting\",\n \"suppose\",\n \"supposed\",\n \"supposes\",\n \"supposing\",\n \"supposedly\",\n \"think\",\n \"thought\",\n \"thinks\",\n \"thinking\",\n]);\n\nfunction isNonAssertiveReportingVerb(token: string): boolean {\n return GROUNDING_NON_ASSERTIVE_REPORTING_VERBS.has(token);\n}\n\nfunction isGroundingClauseBoundary(token: string): boolean {\n return token === \"and\"\n || token === \"but\"\n || token === \"or\"\n || token === \"while\"\n || token === \"although\"\n || token === \"because\";\n}\n\nfunction isNonAssertiveReportingAt(tokens: ReadonlyArray<string>, index: number): boolean {\n let boundary = 0;\n for (let cursor = 0; cursor < index; cursor += 1) {\n if (isGroundingClauseBoundary(tokens[cursor]!)) boundary = cursor + 1;\n }\n for (let cursor = index - 1; cursor >= boundary; cursor -= 1) {\n if (\n tokens[cursor] === \"that\"\n && cursor > boundary\n && isNonAssertiveReportingVerb(tokens[cursor - 1]!)\n ) {\n return true;\n }\n if (isNonAssertiveReportingVerb(tokens[cursor]!) && index - cursor <= 5) return true;\n }\n return false;\n}\n\nfunction isDeniedAt(tokens: ReadonlyArray<string>, index: number): boolean {\n let boundary = 0;\n for (let cursor = 0; cursor < index; cursor += 1) {\n if (isGroundingClauseBoundary(tokens[cursor]!)) boundary = cursor + 1;\n }\n for (let cursor = index - 1; cursor >= boundary; cursor -= 1) {\n const token = tokens[cursor];\n if (token === \"that\" && cursor > boundary && isDenialReportingVerb(tokens[cursor - 1]!)) {\n return true;\n }\n if (isDenialReportingVerb(token) && index - cursor <= 5) return true;\n }\n return false;\n}\n\nexport function hasContradictoryPolarity(candidate: string, source: string): boolean {\n const candidateLexemes = groundingLexemes(candidate);\n const candidateTokens = candidateLexemes.map(({ token }) => token);\n let coherentContradiction = false;\n for (const clause of sourceSentences(source).flatMap((sentence) =>\n sentence.split(/\\s+(?:and|but|or|while|although|because)\\s+/gu))) {\n const sourceLexemes = groundingLexemes(clause);\n const sourceTokens = sourceLexemes.map(({ token }) => token);\n let sourceCursor = 0;\n let allTokensFound = true;\n let contradiction = false;\n for (const [candidateIndex, candidateToken] of candidateTokens.entries()) {\n if (GROUNDING_STOPWORDS[candidateToken] === true) continue;\n const sourceIndex = sourceTokens.findIndex(\n (sourceToken, index) =>\n index >= sourceCursor\n && stemToken(sourceToken, sourceLexemes[index]?.preserveTerminalS === true)\n === stemToken(candidateToken, candidateLexemes[candidateIndex]?.preserveTerminalS === true),\n );\n if (sourceIndex === -1) {\n allTokensFound = false;\n break;\n }\n const candidateNegated = isNegatedAt(candidateTokens, candidateIndex)\n || isDeniedAt(candidateTokens, candidateIndex);\n const sourceNegated = isNegatedAt(sourceTokens, sourceIndex)\n || isDeniedAt(sourceTokens, sourceIndex);\n const candidateNonAssertive = isNonAssertiveReportingAt(candidateTokens, candidateIndex);\n const sourceNonAssertive = isNonAssertiveReportingAt(sourceTokens, sourceIndex);\n if (\n candidateNegated !== sourceNegated\n || candidateNonAssertive !== sourceNonAssertive\n ) {\n contradiction = true;\n }\n sourceCursor = sourceIndex + 1;\n }\n if (allTokensFound) {\n if (!contradiction) return false;\n coherentContradiction = true;\n }\n }\n if (coherentContradiction) return true;\n\n const sourceLexemes = groundingLexemes(source);\n const sourceTokens = sourceLexemes.map(({ token }) => token);\n const sourcePositions = new Map<string, number[]>();\n sourceLexemes.forEach(({ token, preserveTerminalS }, index) => {\n const key = stemToken(token, preserveTerminalS);\n const positions = sourcePositions.get(key);\n if (positions) positions.push(index);\n else sourcePositions.set(key, [index]);\n });\n for (const [candidateIndex, token] of candidateTokens.entries()) {\n if (GROUNDING_STOPWORDS[token] === true) continue;\n const positions = sourcePositions.get(\n stemToken(token, candidateLexemes[candidateIndex]?.preserveTerminalS === true),\n );\n if (!positions || positions.length === 0) continue;\n const sourceIndex = positions[positions.length - 1];\n const candidateNegated = isNegatedAt(candidateTokens, candidateIndex)\n || isDeniedAt(candidateTokens, candidateIndex);\n const sourceNegated = isNegatedAt(sourceTokens, sourceIndex)\n || isDeniedAt(sourceTokens, sourceIndex);\n const candidateNonAssertive = isNonAssertiveReportingAt(candidateTokens, candidateIndex);\n const sourceNonAssertive = isNonAssertiveReportingAt(sourceTokens, sourceIndex);\n if (\n candidateNegated !== sourceNegated\n || candidateNonAssertive !== sourceNonAssertive\n ) {\n return true;\n }\n }\n return false;\n}\n"],"mappings":"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","names":["sourceLexemes","sourceTokens"]}
1
+ {"version":3,"sources":["../src/extraction-source-grounding-helpers.ts"],"sourcesContent":["export function isInterrogativeSourceSentence(sentence: string): boolean {\n const normalized = sentence.trim();\n const embeddedQuestionVerbIndex = normalized.search(\n /\\b(?:determine|know|wonder|ask(?:ed)?|question|decide|check|confirm|find|figure|understand|unclear)\\b/iu,\n );\n const embeddedQuestionMarkerIndex = normalized.search(/\\b(?:whether|if)\\b/iu);\n const hasEmbeddedQuestion = embeddedQuestionVerbIndex >= 0\n && embeddedQuestionMarkerIndex > embeddedQuestionVerbIndex;\n return normalized.endsWith(\"?\")\n || hasEmbeddedQuestion\n || (\n !normalized.includes(\":\")\n && /^(?:suppose|assuming|assume|maybe|perhaps|hypothetically|if|whether|imagine|imagining|presume|presuming|supposing|is|are|am|was|were|do|does|did|can|could|will|would|should|has|have|had|what|which|when|where|why|how|who|whom)\\b/iu.test(\n normalized,\n )\n );\n}\n\nexport function containsContiguousGroundingTokens(\n candidateTokens: ReadonlyArray<string>,\n sourceTokens: ReadonlyArray<string>,\n): boolean {\n if (candidateTokens.length === 0 || candidateTokens.length > sourceTokens.length) return false;\n return sourceTokens.some((_, start) =>\n candidateTokens.every((token, offset) => sourceTokens[start + offset] === token),\n );\n}\n\nexport function hasExplicitRoleSubjectToken(\n candidateRole: string | undefined,\n sourceTokensBySentence: ReadonlyArray<ReadonlyArray<string>>,\n): boolean {\n return candidateRole !== undefined\n && sourceTokensBySentence.some((tokens) =>\n tokens.some((token) => token.replace(/^[\\u0000\\u0001]/u, \"\") === candidateRole));\n}\n\nexport function splitGroundingClauses(\n sentences: ReadonlyArray<string>,\n inheritCoordinatedSubjects = false,\n): string[] {\n return sentences.flatMap((sentence) => {\n const clauses = sentence\n .split(/,\\s+(?=[\\p{L}][\\p{L}\\p{N}'’-]*\\s+\\S)/gu)\n .flatMap((commaClause) =>\n commaClause\n .split(/\\s*(?::|[—–])\\s+|\\s+\\/\\s+/u)\n .flatMap((delimiterClause) =>\n delimiterClause\n .split(/\\s+(?:and|but|or|while|although|because)\\s+/gu)\n .map((clause) => clause.trim())\n .filter((clause) => clause.length > 0),\n ),\n );\n if (!inheritCoordinatedSubjects || clauses.length < 2) return clauses;\n\n const firstLexemes = groundingLexemes(clauses[0]!)\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true);\n const firstPredicateIndex = firstLexemes.findIndex(({ isPredicate }) => isPredicate);\n let subjectLexemes = firstLexemes\n .slice(0, firstPredicateIndex < 1 ? 1 : firstPredicateIndex)\n .filter(({ token }) => !token.endsWith(\"ly\"));\n let subject = subjectLexemes.map(({ surface }) => surface).join(\" \");\n let predicate = firstLexemes[firstPredicateIndex < 1 ? 1 : firstPredicateIndex]?.surface;\n if (subject.length === 0 || predicate === undefined) return clauses;\n\n const sourceSpans = [clauses[0]!];\n for (const clause of clauses.slice(1)) {\n const clauseLexemes = groundingLexemes(clause)\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true);\n const clausePredicateIndex = clauseLexemes.findIndex(({ isPredicate }) => isPredicate);\n const clauseSubjectLexemes = clausePredicateIndex > 0\n ? clauseLexemes\n .slice(0, clausePredicateIndex)\n .filter(({ token }) => !token.endsWith(\"ly\"))\n : [];\n const repeatsSubject = clauseSubjectLexemes.length === subjectLexemes.length\n && subjectLexemes.every(\n ({ token }, index) => clauseSubjectLexemes[index]?.token === token,\n );\n if (repeatsSubject) {\n sourceSpans.push(clause);\n continue;\n }\n if (clauseSubjectLexemes.length > 0) {\n subjectLexemes = clauseSubjectLexemes;\n subject = subjectLexemes.map(({ surface }) => surface).join(\" \");\n predicate = clauseLexemes[clausePredicateIndex]?.surface;\n sourceSpans.push(clause);\n continue;\n }\n const prefix = clausePredicateIndex === -1 ? `${subject} ${predicate}` : subject;\n sourceSpans.push(clause, `${prefix} ${clause}`);\n }\n return sourceSpans;\n });\n}\n\nexport const GROUNDING_STOPWORDS: Record<string, true> = {\n a: true,\n an: true,\n and: true,\n are: true,\n as: true,\n at: true,\n be: true,\n been: true,\n being: true,\n but: true,\n by: true,\n can: true,\n could: true,\n did: true,\n do: true,\n does: true,\n for: true,\n from: true,\n had: true,\n has: true,\n have: true,\n he: true,\n her: true,\n here: true,\n hers: true,\n him: true,\n his: true,\n how: true,\n i: true,\n if: true,\n in: true,\n into: true,\n is: true,\n it: true,\n its: true,\n just: true,\n me: true,\n my: true,\n no: true,\n not: true,\n of: true,\n on: true,\n only: true,\n or: true,\n our: true,\n ours: true,\n she: true,\n so: true,\n than: true,\n that: true,\n the: true,\n their: true,\n them: true,\n then: true,\n there: true,\n these: true,\n they: true,\n this: true,\n those: true,\n to: true,\n too: true,\n under: true,\n up: true,\n us: true,\n very: true,\n was: true,\n we: true,\n were: true,\n what: true,\n when: true,\n why: true,\n where: true,\n which: true,\n who: true,\n whom: true,\n will: true,\n with: true,\n would: true,\n you: true,\n your: true,\n};\n\nexport const GROUNDING_NEGATION_TOKENS = new Set([\n \"no\",\n \"not\",\n \"false\",\n \"untrue\",\n \"incorrect\",\n \"wrong\",\n \"never\",\n \"without\",\n \"neither\",\n \"nor\",\n \"none\",\n \"cannot\",\n \"cant\",\n \"can't\",\n \"don't\",\n \"doesn't\",\n \"didn't\",\n \"isn't\",\n \"aren't\",\n \"wasn't\",\n \"weren't\",\n \"won't\",\n \"wouldn't\",\n \"couldn't\",\n \"shouldn't\",\n \"haven't\",\n \"hasn't\",\n \"hadn't\",\n]);\n\nexport const GROUNDING_AUXILIARY_TOKENS = new Set([\n \"am\",\n \"are\",\n \"be\",\n \"been\",\n \"being\",\n \"can\",\n \"could\",\n \"did\",\n \"do\",\n \"does\",\n \"had\",\n \"has\",\n \"have\",\n \"is\",\n \"was\",\n \"were\",\n \"will\",\n \"would\",\n \"should\",\n]);\n\nexport const GROUNDING_COPULAR_FORMS = new Set([\n \"am\",\n \"are\",\n \"be\",\n \"been\",\n \"being\",\n \"is\",\n \"was\",\n \"were\",\n]);\n\nexport const GROUNDING_SUBJECT_PRONOUNS = new Set([\n \"he\",\n \"she\",\n \"they\",\n \"it\",\n \"i\",\n \"we\",\n \"you\",\n]);\nexport const GROUNDING_ENTITY_TYPE_PREFIXES = new Set([\n \"person\",\n \"project\",\n \"tool\",\n \"company\",\n \"place\",\n \"other\",\n]);\n\nexport const GROUNDING_COMMON_VERB_FORMS: Record<string, true> = {\n add: true,\n adds: true,\n call: true,\n calls: true,\n contain: true,\n contains: true,\n employ: true,\n deploy: true,\n deploys: true,\n design: true,\n designs: true,\n employs: true,\n fill: true,\n fills: true,\n go: true,\n goes: true,\n gone: true,\n went: true,\n give: true,\n gives: true,\n has: true,\n host: true,\n hosts: true,\n like: true,\n likes: true,\n manage: true,\n manages: true,\n make: true,\n makes: true,\n need: true,\n needs: true,\n own: true,\n owns: true,\n plan: true,\n plans: true,\n prefer: true,\n prefers: true,\n require: true,\n requires: true,\n run: true,\n runs: true,\n sleep: true,\n sleeps: true,\n stop: true,\n stops: true,\n swim: true,\n swims: true,\n share: true,\n shares: true,\n support: true,\n supports: true,\n take: true,\n takes: true,\n try: true,\n tries: true,\n use: true,\n uses: true,\n want: true,\n wants: true,\n work: true,\n works: true,\n};\n\n\nexport interface GroundingLexeme {\n token: string;\n surface: string;\n isPredicate: boolean;\n preserveTerminalS: boolean;\n}\n\nexport function groundingLexemes(text: string): GroundingLexeme[] {\n const rawTokens = (text.normalize(\"NFKC\").match(\n /[\\p{L}\\p{N}]+(?:['’][\\p{L}\\p{N}]+)?(?:\\+\\+[\\p{L}\\p{N}]*|#[\\p{L}\\p{N}]*)?/gu,\n ) ?? []).flatMap(splitSpacelessScriptToken);\n const tokens = rawTokens.map((rawToken) =>\n rawToken.replaceAll(\"’\", \"'\").toLocaleLowerCase());\n let predicateIndex = tokens.findIndex((token, index) => {\n const previousToken = tokens[index - 1];\n const followsAuxiliary = previousToken !== undefined\n && GROUNDING_AUXILIARY_TOKENS.has(previousToken);\n let previousMeaningfulIndex = index - 1;\n while (\n previousMeaningfulIndex >= 0\n && !GROUNDING_COPULAR_FORMS.has(tokens[previousMeaningfulIndex] ?? \"\")\n && (\n GROUNDING_STOPWORDS[tokens[previousMeaningfulIndex] ?? \"\"] === true\n || (tokens[previousMeaningfulIndex] ?? \"\").endsWith(\"ly\")\n )\n ) {\n previousMeaningfulIndex -= 1;\n }\n const followsCopularAuxiliary = GROUNDING_COPULAR_FORMS.has(\n tokens[previousMeaningfulIndex] ?? \"\",\n );\n const capitalized = /^\\p{Lu}/u.test(rawTokens[index] ?? \"\");\n const terminalSInflection = index > 0\n && token.endsWith(\"s\")\n && !token.endsWith(\"ss\")\n && !GROUNDING_AUXILIARY_TOKENS.has(token);\n const capitalizedSubjectHasLaterPredicate = index === 0\n && tokens.some((laterToken, laterIndex) =>\n laterIndex > 0\n && !/^\\p{Lu}/u.test(rawTokens[laterIndex] ?? \"\")\n && (\n GROUNDING_AUXILIARY_TOKENS.has(laterToken)\n || GROUNDING_COMMON_VERB_FORMS[laterToken] === true\n || laterToken.endsWith(\"ed\")\n || laterToken.endsWith(\"ing\")\n ));\n if (capitalized && (index !== 0 || capitalizedSubjectHasLaterPredicate)) return false;\n if (followsCopularAuxiliary && terminalSInflection) return false;\n return GROUNDING_COMMON_VERB_FORMS[token] === true\n || token.endsWith(\"ed\")\n || token.endsWith(\"ing\")\n || (followsAuxiliary && !followsCopularAuxiliary)\n || terminalSInflection;\n });\n if (predicateIndex === -1) {\n const leadingSubjectLength = rawTokens.findIndex((rawToken) => !/^\\p{Lu}/u.test(rawToken));\n if (leadingSubjectLength > 0) {\n predicateIndex = tokens.findIndex((token, index) =>\n index >= leadingSubjectLength\n && (\n GROUNDING_AUXILIARY_TOKENS.has(token)\n || (\n GROUNDING_STOPWORDS[token] !== true\n && !/^\\p{Lu}/u.test(rawTokens[index] ?? \"\")\n )\n ));\n }\n }\n return rawTokens.map((rawToken, index) => {\n const token = tokens[index]!;\n const isPredicate = index === predicateIndex;\n return {\n token,\n surface: rawToken,\n preserveTerminalS: !isPredicate && (\n /^\\p{Lu}/u.test(rawToken)\n || token.endsWith(\"s\")\n ),\n isPredicate,\n };\n });\n}\n\nexport function tokenSequence(text: string): string[] {\n return groundingLexemes(text).map(({ token }) => token);\n}\n\nexport function containsExactTokenSequence(candidate: string, source: string): boolean {\n const candidateTokens = tokenSequence(candidate);\n const sourceTokens = tokenSequence(source);\n if (candidateTokens.length === 0 || candidateTokens.length > sourceTokens.length) return false;\n return sourceTokens.some((_, index) =>\n candidateTokens.every((token, offset) => sourceTokens[index + offset] === token),\n );\n\n}\n\nexport function isNegationCue(token: string): boolean {\n return GROUNDING_NEGATION_TOKENS.has(token) || token.endsWith(\"n't\");\n}\n\nexport function isAttachedNegatedAuxiliary(token: string): boolean {\n return token.endsWith(\"n't\")\n || token === \"cannot\"\n || token === \"cant\"\n || token === \"can't\";\n}\n\nexport function isNegatedAt(tokens: ReadonlyArray<string>, index: number): boolean {\n if (tokens[index - 1] === \"only\" && tokens[index - 2] === \"not\") return false;\n const previousStart = Math.max(0, index - 2);\n for (let i = previousStart; i < index; i += 1) {\n if (isNegationCue(tokens[i])) return true;\n }\n\n if (tokens[index - 1] === \"than\" && tokens[index - 2] === \"rather\") return true;\n if (tokens[index - 1] === \"of\" && tokens[index - 2] === \"instead\") return true;\n\n const next = tokens[index + 1];\n if (next !== undefined && isAttachedNegatedAuxiliary(next)) return true;\n const nextNext = tokens[index + 2];\n return next !== undefined\n && nextNext !== undefined\n && GROUNDING_AUXILIARY_TOKENS.has(next)\n && isNegationCue(nextNext);\n}\n\nexport const GROUNDING_MIN_SHARED_TOKENS = 2;\nexport const GROUNDING_MIN_COVERAGE = 0.5;\n\nconst STRICT_GROUNDING_TOKEN_PREFIX = \"\\u0000\";\nconst INFLECTED_GROUNDING_TOKEN_PREFIX = \"\\u0001\";\n\nexport function stemToken(\n token: string,\n preserveTerminalS = false,\n markExact = false,\n): string {\n if (token.endsWith(\"'s\")) return token.slice(0, -2);\n if (preserveTerminalS) {\n if (!markExact) return token;\n return `${STRICT_GROUNDING_TOKEN_PREFIX}${token}`;\n }\n if (token.length > 5 && token.endsWith(\"ing\")) {\n const stem = token.slice(0, -3);\n const inflectionDoubled = /(.)\\1$/u.test(stem) && stem.length > 3 && !/[lsz]$/u.test(stem);\n const normalized = inflectionDoubled ? stem.slice(0, -1) : stem;\n return markExact ? `${INFLECTED_GROUNDING_TOKEN_PREFIX}${normalized}` : normalized;\n }\n if (token.length > 4 && token.endsWith(\"ied\")) {\n const normalized = `${token.slice(0, -3)}y`;\n return markExact ? `${INFLECTED_GROUNDING_TOKEN_PREFIX}${normalized}` : normalized;\n }\n if (token.length > 4 && token.endsWith(\"ed\")) {\n const stem = token.slice(0, -2);\n const inflectionDoubled = /(.)\\1$/u.test(stem) && stem.length > 3 && !/[lsz]$/u.test(stem);\n const normalized = inflectionDoubled ? stem.slice(0, -1) : stem;\n return markExact ? `${INFLECTED_GROUNDING_TOKEN_PREFIX}${normalized}` : normalized;\n }\n if (token.length > 3 && token.endsWith(\"s\") && !token.endsWith(\"ss\")) {\n return token.endsWith(\"ies\") ? `${token.slice(0, -3)}y` : token.slice(0, -1);\n }\n return token;\n}\n\n\nexport function tokenize(text: string): Set<string> {\n const tokens = new Set<string>();\n for (const { token, preserveTerminalS } of groundingLexemes(text)) {\n if (GROUNDING_STOPWORDS[token] !== true) tokens.add(stemToken(token, preserveTerminalS, true));\n }\n return tokens;\n}\n\nconst SPACELESS_SCRIPT_CHARACTER_PATTERN = new RegExp(\n \"[\\\\p{Script=Han}\\\\p{Script=Hiragana}\\\\p{Script=Katakana}\\\\p{Script=Hangul}\"\n + \"\\\\p{Script=Thai}\\\\p{Script=Lao}\\\\p{Script=Khmer}\\\\p{Script=Myanmar}]\",\n \"u\",\n);\nconst SPACELESS_SCRIPT_LCS_SOURCE_LIMIT = 4096;\n\nfunction containsSpacelessScriptCharacter(text: string): boolean {\n return SPACELESS_SCRIPT_CHARACTER_PATTERN.test(text);\n}\n\n/**\n * Scripts without word separators (CJK, Hangul, Thai, ...) must not become one\n * whitespace-delimited token: a paraphrase never matches a whole-run token, so\n * grounded CJK facts and entity names were dropped. Split those runs into\n * per-character lexemes so contiguous-token matching behaves as substring\n * matching for these scripts.\n */\nfunction splitSpacelessScriptToken(rawToken: string): string[] {\n if (!containsSpacelessScriptCharacter(rawToken)) return [rawToken];\n const parts: string[] = [];\n let otherScriptRun = \"\";\n for (const character of rawToken) {\n if (containsSpacelessScriptCharacter(character)) {\n if (otherScriptRun.length > 0) {\n parts.push(otherScriptRun);\n otherScriptRun = \"\";\n }\n parts.push(character);\n } else {\n otherScriptRun += character;\n }\n }\n if (otherScriptRun.length > 0) parts.push(otherScriptRun);\n return parts;\n}\n\nfunction spacelessScriptCharacterSequence(text: string): string[] {\n const characters: string[] = [];\n for (const character of text.normalize(\"NFKC\")) {\n if (containsSpacelessScriptCharacter(character)) characters.push(character);\n }\n return characters;\n}\n\nfunction spacelessScriptCharacterNgrams(text: string): Set<string> {\n const grams = new Set<string>();\n let previousCharacter = \"\";\n for (const character of spacelessScriptCharacterSequence(text)) {\n if (previousCharacter !== \"\") grams.add(previousCharacter + character);\n previousCharacter = character;\n }\n return grams;\n}\n\nfunction longestCommonSubstringLength(\n left: ReadonlyArray<string>,\n right: ReadonlyArray<string>,\n): number {\n if (left.length === 0 || right.length === 0) return 0;\n let longest = 0;\n let previousRow = new Array<number>(right.length).fill(0);\n for (const leftCharacter of left) {\n const currentRow = new Array<number>(right.length).fill(0);\n for (let index = 0; index < right.length; index += 1) {\n if (leftCharacter !== right[index]) continue;\n currentRow[index] = (index > 0 ? previousRow[index - 1] : 0) + 1;\n if (currentRow[index] > longest) longest = currentRow[index];\n }\n previousRow = currentRow;\n }\n return longest;\n}\n\n/**\n * Script-aware grounding score for candidates written in scripts without word\n * separators. Returns null when the candidate has no such characters, so\n * whitespace-delimited candidates keep the default scorer. The longest-common-\n * span gate rejects topical overlap that shares mostly function characters.\n * ponytail: n-grams and the common-span gate ignore argument order; swap in a\n * segmentation-aware matcher if CJK role confusion surfaces.\n */\nexport function spacelessScriptGroundedTokenScore(candidate: string, source: string): number | null {\n const candidateGrams = spacelessScriptCharacterNgrams(candidate);\n if (candidateGrams.size === 0) return null;\n const sourceGrams = spacelessScriptCharacterNgrams(source);\n let sharedGrams = 0;\n for (const gram of candidateGrams) {\n if (sourceGrams.has(gram)) sharedGrams += 1;\n }\n if (sharedGrams < GROUNDING_MIN_SHARED_TOKENS) return 0;\n const coverage = sharedGrams / candidateGrams.size;\n if (coverage < GROUNDING_MIN_COVERAGE) return 0;\n const candidateCharacters = spacelessScriptCharacterSequence(candidate);\n const sourceCharacters = spacelessScriptCharacterSequence(source);\n if (sourceCharacters.length <= SPACELESS_SCRIPT_LCS_SOURCE_LIMIT) {\n const anchoredFraction = longestCommonSubstringLength(candidateCharacters, sourceCharacters)\n / candidateCharacters.length;\n if (anchoredFraction < GROUNDING_MIN_COVERAGE) return 0;\n }\n const sourceTokens = tokenize(source);\n for (const token of tokenize(candidate)) {\n if (containsSpacelessScriptCharacter(token)) continue;\n if (![...sourceTokens].some((sourceToken) => areGroundingTokensCompatible(token, sourceToken))) {\n return 0;\n }\n }\n return coverage;\n}\n\nexport function normalizeForExactMatch(text: string): string {\n return text.normalize(\"NFKC\").toLocaleLowerCase().replace(/\\s+/gu, \" \").trim();\n}\n\nexport function sourceSentences(source: string): string[] {\n const sentences: string[] = [];\n let sentenceStart = 0;\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n const nextCharacter = source[index + 1];\n const boundary = character === \"!\"\n || character === \"?\"\n || character === \";\"\n || character === \"\\n\"\n || (character === \".\" && (\n nextCharacter === undefined\n || /\\s/u.test(nextCharacter)\n || /[\"')\\]}]/u.test(nextCharacter)\n ));\n if (!boundary) continue;\n let sentenceEnd = character === \"\\n\" ? index : index + 1;\n while (/[.!?;\\n]/u.test(source[sentenceEnd] ?? \"\")) sentenceEnd += 1;\n const sentence = source.slice(sentenceStart, sentenceEnd).trim();\n if (sentence.length > 0) sentences.push(sentence);\n sentenceStart = sentenceEnd;\n index = sentenceEnd - 1;\n }\n const trailingSentence = source.slice(sentenceStart).trim();\n if (trailingSentence.length > 0) sentences.push(trailingSentence);\n return sentences.length > 0 ? sentences : [source];\n}\n\n\nexport function groundingTokenSequence(text: string): string[] {\n let lexemes = groundingLexemes(text);\n while (lexemes.length > 0 && GROUNDING_AUXILIARY_TOKENS.has(lexemes[0]!.token)) {\n lexemes = lexemes.slice(1);\n }\n return lexemes\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true)\n .map(({ token, preserveTerminalS }) => stemToken(token, preserveTerminalS, true));\n}\nexport function normalizedGroundingAlignmentTokenSequence(text: string): string[] {\n const normalized = normalizedGroundingTokenSequence(text);\n const firstLexeme = groundingLexemes(text)[0];\n if (firstLexeme === undefined || !GROUNDING_SUBJECT_PRONOUNS.has(firstLexeme.token)) {\n return normalized;\n }\n return [stemToken(firstLexeme.token, firstLexeme.preserveTerminalS, true), ...normalized];\n}\n\n\nexport function normalizedGroundingTokenSequence(text: string): string[] {\n return groundingTokenSequence(text).map((token) => token.replace(/'$/u, \"\"));\n}\n\nexport function areGroundingTokensCompatible(left: string, right: string): boolean {\n const leftPrefix = left[0];\n const rightPrefix = right[0];\n const leftMarked = leftPrefix === STRICT_GROUNDING_TOKEN_PREFIX\n || leftPrefix === INFLECTED_GROUNDING_TOKEN_PREFIX;\n const rightMarked = rightPrefix === STRICT_GROUNDING_TOKEN_PREFIX\n || rightPrefix === INFLECTED_GROUNDING_TOKEN_PREFIX;\n const leftToken = leftMarked ? left.slice(1) : left;\n const rightToken = rightMarked ? right.slice(1) : right;\n if (leftToken === rightToken) {\n const strictToInflected = (\n leftPrefix === STRICT_GROUNDING_TOKEN_PREFIX\n && rightPrefix === INFLECTED_GROUNDING_TOKEN_PREFIX\n ) || (\n rightPrefix === STRICT_GROUNDING_TOKEN_PREFIX\n && leftPrefix === INFLECTED_GROUNDING_TOKEN_PREFIX\n );\n return !strictToInflected;\n }\n if (leftPrefix === STRICT_GROUNDING_TOKEN_PREFIX || rightPrefix === STRICT_GROUNDING_TOKEN_PREFIX) {\n return false;\n }\n return `${leftToken}e` === rightToken || leftToken === `${rightToken}e`;\n}\nconst GROUNDING_DENIAL_REPORTING_VERBS = new Set([\n \"deny\",\n \"denied\",\n \"denies\",\n \"denying\",\n \"dispute\",\n \"disputed\",\n \"disputes\",\n \"disputing\",\n \"reject\",\n \"rejected\",\n \"rejects\",\n \"rejecting\",\n \"refute\",\n \"refuted\",\n \"refutes\",\n \"refuting\",\n \"contradict\",\n \"contradicted\",\n \"contradicts\",\n \"contradicting\",\n \"disprove\",\n \"disproved\",\n \"disproves\",\n \"disproving\",\n]);\n\nfunction isDenialReportingVerb(token: string): boolean {\n return GROUNDING_DENIAL_REPORTING_VERBS.has(token);\n}\nconst GROUNDING_NON_ASSERTIVE_REPORTING_VERBS = new Set([\n \"allege\",\n \"alleged\",\n \"alleges\",\n \"alleging\",\n \"allegedly\",\n \"assert\",\n \"asserted\",\n \"asserts\",\n \"asserting\",\n \"believe\",\n \"believed\",\n \"believes\",\n \"believing\",\n \"claim\",\n \"claimed\",\n \"claims\",\n \"claiming\",\n \"doubt\",\n \"doubted\",\n \"doubts\",\n \"doubting\",\n \"uncertain\",\n \"unsure\",\n \"unclear\",\n \"unknown\",\n \"possibly\",\n \"probably\",\n \"imagine\",\n \"imagined\",\n \"imagines\",\n \"imagining\",\n \"report\",\n \"reported\",\n \"reports\",\n \"reporting\",\n \"reportedly\",\n \"say\",\n \"said\",\n \"says\",\n \"saying\",\n \"speculate\",\n \"speculated\",\n \"speculates\",\n \"speculating\",\n \"suspect\",\n \"suspected\",\n \"suspects\",\n \"suspecting\",\n \"suppose\",\n \"supposed\",\n \"supposes\",\n \"supposing\",\n \"supposedly\",\n \"think\",\n \"thought\",\n \"thinks\",\n \"thinking\",\n]);\n\nfunction isNonAssertiveReportingVerb(token: string): boolean {\n return GROUNDING_NON_ASSERTIVE_REPORTING_VERBS.has(token);\n}\n\nfunction isGroundingClauseBoundary(token: string): boolean {\n return token === \"and\"\n || token === \"but\"\n || token === \"or\"\n || token === \"while\"\n || token === \"although\"\n || token === \"because\";\n}\n\nfunction isNonAssertiveReportingAt(tokens: ReadonlyArray<string>, index: number): boolean {\n let boundary = 0;\n for (let cursor = 0; cursor < index; cursor += 1) {\n if (isGroundingClauseBoundary(tokens[cursor]!)) boundary = cursor + 1;\n }\n for (let cursor = index - 1; cursor >= boundary; cursor -= 1) {\n if (\n tokens[cursor] === \"that\"\n && cursor > boundary\n && isNonAssertiveReportingVerb(tokens[cursor - 1]!)\n ) {\n return true;\n }\n if (isNonAssertiveReportingVerb(tokens[cursor]!) && index - cursor <= 5) return true;\n }\n return false;\n}\n\nfunction isDeniedAt(tokens: ReadonlyArray<string>, index: number): boolean {\n let boundary = 0;\n for (let cursor = 0; cursor < index; cursor += 1) {\n if (isGroundingClauseBoundary(tokens[cursor]!)) boundary = cursor + 1;\n }\n for (let cursor = index - 1; cursor >= boundary; cursor -= 1) {\n const token = tokens[cursor];\n if (token === \"that\" && cursor > boundary && isDenialReportingVerb(tokens[cursor - 1]!)) {\n return true;\n }\n if (isDenialReportingVerb(token) && index - cursor <= 5) return true;\n }\n return false;\n}\n\nexport function hasContradictoryPolarity(candidate: string, source: string): boolean {\n const candidateLexemes = groundingLexemes(candidate);\n const candidateTokens = candidateLexemes.map(({ token }) => token);\n let coherentContradiction = false;\n for (const clause of sourceSentences(source).flatMap((sentence) =>\n sentence.split(/\\s+(?:and|but|or|while|although|because)\\s+/gu))) {\n const sourceLexemes = groundingLexemes(clause);\n const sourceTokens = sourceLexemes.map(({ token }) => token);\n let sourceCursor = 0;\n let allTokensFound = true;\n let contradiction = false;\n for (const [candidateIndex, candidateToken] of candidateTokens.entries()) {\n if (GROUNDING_STOPWORDS[candidateToken] === true) continue;\n const sourceIndex = sourceTokens.findIndex(\n (sourceToken, index) =>\n index >= sourceCursor\n && stemToken(sourceToken, sourceLexemes[index]?.preserveTerminalS === true)\n === stemToken(candidateToken, candidateLexemes[candidateIndex]?.preserveTerminalS === true),\n );\n if (sourceIndex === -1) {\n allTokensFound = false;\n break;\n }\n const candidateNegated = isNegatedAt(candidateTokens, candidateIndex)\n || isDeniedAt(candidateTokens, candidateIndex);\n const sourceNegated = isNegatedAt(sourceTokens, sourceIndex)\n || isDeniedAt(sourceTokens, sourceIndex);\n const candidateNonAssertive = isNonAssertiveReportingAt(candidateTokens, candidateIndex);\n const sourceNonAssertive = isNonAssertiveReportingAt(sourceTokens, sourceIndex);\n if (\n candidateNegated !== sourceNegated\n || candidateNonAssertive !== sourceNonAssertive\n ) {\n contradiction = true;\n }\n sourceCursor = sourceIndex + 1;\n }\n if (allTokensFound) {\n if (!contradiction) return false;\n coherentContradiction = true;\n }\n }\n if (coherentContradiction) return true;\n\n const sourceLexemes = groundingLexemes(source);\n const sourceTokens = sourceLexemes.map(({ token }) => token);\n const sourcePositions = new Map<string, number[]>();\n sourceLexemes.forEach(({ token, preserveTerminalS }, index) => {\n const key = stemToken(token, preserveTerminalS);\n const positions = sourcePositions.get(key);\n if (positions) positions.push(index);\n else sourcePositions.set(key, [index]);\n });\n for (const [candidateIndex, token] of candidateTokens.entries()) {\n if (GROUNDING_STOPWORDS[token] === true) continue;\n const positions = sourcePositions.get(\n stemToken(token, candidateLexemes[candidateIndex]?.preserveTerminalS === true),\n );\n if (!positions || positions.length === 0) continue;\n const sourceIndex = positions[positions.length - 1];\n const candidateNegated = isNegatedAt(candidateTokens, candidateIndex)\n || isDeniedAt(candidateTokens, candidateIndex);\n const sourceNegated = isNegatedAt(sourceTokens, sourceIndex)\n || isDeniedAt(sourceTokens, sourceIndex);\n const candidateNonAssertive = isNonAssertiveReportingAt(candidateTokens, candidateIndex);\n const sourceNonAssertive = isNonAssertiveReportingAt(sourceTokens, sourceIndex);\n if (\n candidateNegated !== sourceNegated\n || candidateNonAssertive !== sourceNonAssertive\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport function normalizedEntityIdentifierTokens(name: string): string[] {\n const identifier = normalizeForExactMatch(name).replace(/[-_]+/gu, \" \");\n const tokens = groundingLexemes(identifier)\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true)\n .map(({ token }) => stemToken(token, true));\n return tokens.length > 1 && GROUNDING_ENTITY_TYPE_PREFIXES.has(tokens[0] ?? \"\")\n ? tokens.slice(1)\n : tokens;\n}\n\n/** Index of the entity name's tokens inside the sentence's token sequence, or -1. */\nexport function entityNameStart(name: string, sentence: string): number {\n const nameTokens = normalizedEntityIdentifierTokens(name);\n if (nameTokens.length === 0) return -1;\n const sentenceTokens = groundingLexemes(sentence)\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true)\n .map(({ token, preserveTerminalS }) => stemToken(token, preserveTerminalS));\n return sentenceTokens.findIndex((_, start) =>\n nameTokens.every((token, offset) => sentenceTokens[start + offset] === token));\n}\n\nexport function isGroundedEntityName(name: string, source: string): boolean {\n return sourceSentences(source).some((sentence) => entityNameStart(name, sentence) >= 0);\n}\n\n/** True when the text reports a claim without asserting it (\"suspects\", \"alleged\", \"said\"). */\nexport function hasNonAssertiveReporting(text: string): boolean {\n return groundingLexemes(text).some(({ token }) => isNonAssertiveReportingVerb(token));\n}\n\n/** True when the text reports a denial (\"denied\", \"refuses\"). */\nexport function hasDenialReporting(text: string): boolean {\n return groundingLexemes(text).some(({ token }) => isDenialReportingVerb(token));\n}\n"],"mappings":"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","names":["sourceLexemes","sourceTokens"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isNamespaceKind
3
- } from "./chunk-5AOAQR37.js";
3
+ } from "./chunk-L5DAHSEZ.js";
4
4
  import {
5
5
  EngramAccessInputError
6
6
  } from "./chunk-3MUKQQ7A.js";
@@ -40,4 +40,4 @@ export {
40
40
  positiveIntQueryParam,
41
41
  optionalNamespaceKindQueryParam
42
42
  };
43
- //# sourceMappingURL=chunk-O4KYRDRT.js.map
43
+ //# sourceMappingURL=chunk-B665A6BO.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  rebuildMemoryProjection,
3
3
  watchProjectionRebuildParent
4
- } from "./chunk-JUWJYXI4.js";
4
+ } from "./chunk-Y4NKEXQT.js";
5
5
  import {
6
6
  initLogger,
7
7
  log
@@ -77,4 +77,4 @@ if (invokedAsRunner) {
77
77
  export {
78
78
  PROJECTION_REBUILD_RUNNER_FLAG
79
79
  };
80
- //# sourceMappingURL=chunk-AKREOU5F.js.map
80
+ //# sourceMappingURL=chunk-CB6ANA2I.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sleep
3
- } from "./chunk-7LEQREP2.js";
3
+ } from "./chunk-PGRZ3FYC.js";
4
4
 
5
5
  // src/access-idempotency.ts
6
6
  import { mkdir, open, readFile, rename, stat, unlink, utimes, writeFile } from "fs/promises";
@@ -309,4 +309,4 @@ export {
309
309
  setAccessIdempotencyTestHooks,
310
310
  AccessIdempotencyStore
311
311
  };
312
- //# sourceMappingURL=chunk-5JMI26Q7.js.map
312
+ //# sourceMappingURL=chunk-CBH2Z4UA.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  applyExtractionSourceGrounding,
3
3
  filterExtractionResultBySource
4
- } from "./chunk-375ARKRS.js";
4
+ } from "./chunk-D5SSBCYY.js";
5
5
  import {
6
6
  delinearize
7
7
  } from "./chunk-VEWZZM3H.js";
@@ -22,7 +22,7 @@ function applyExtractionSourceGrounding2(result, sourceText, assertionSourceText
22
22
  sourceForGrounding(assertionSourceText) ?? assertionSourceText,
23
23
  groundedRoleSources,
24
24
  messageTimestamp,
25
- options
25
+ { ...options, quoteTransform: (quote) => sourceForGrounding(quote) ?? quote }
26
26
  );
27
27
  }
28
28
  function attachExtractionProvenance(result, turns, provenanceConfig) {
@@ -61,8 +61,16 @@ function attachExtractionProvenance(result, turns, provenanceConfig) {
61
61
  });
62
62
  return { ...result, facts };
63
63
  }
64
- function filterExtractionResultBySource2(result, source, assertionSource, roleAssertionSources, eventTimeNormalizer, spanMode = "off") {
65
- return filterExtractionResultBySource(result, source, assertionSource, roleAssertionSources, eventTimeNormalizer, spanMode);
64
+ function filterExtractionResultBySource2(result, source, assertionSource, roleAssertionSources, eventTimeNormalizer, spanMode = "off", quoteTransform) {
65
+ return filterExtractionResultBySource(
66
+ result,
67
+ source,
68
+ assertionSource,
69
+ roleAssertionSources,
70
+ eventTimeNormalizer,
71
+ spanMode,
72
+ quoteTransform
73
+ );
66
74
  }
67
75
 
68
76
  export {
@@ -70,4 +78,4 @@ export {
70
78
  attachExtractionProvenance,
71
79
  filterExtractionResultBySource2 as filterExtractionResultBySource
72
80
  };
73
- //# sourceMappingURL=chunk-YRH3C2OJ.js.map
81
+ //# sourceMappingURL=chunk-CIIHIAJ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extraction-source-grounding.ts"],"sourcesContent":["import type { ExtractionResult, ProvenanceConfig } from \"./types.js\";\nimport { buildFactProvenance, type ProvenanceTurnInput } from \"./provenance.js\";\nimport { delinearize } from \"./delinearize.js\";\nimport {\n applyExtractionSourceGrounding as applyGroundingRules,\n filterExtractionResultBySource as filterGroundingRules,\n} from \"./extraction-source-grounding-rules.js\";\nimport type {\n ExtractionGroundingRoleSources,\n ExtractionSourceGroundingOptions,\n} from \"./extraction-source-grounding-rules.js\";\n\nexport type { ExtractionGroundingRoleSources, ExtractionSourceGroundingOptions } from \"./extraction-source-grounding-rules.js\";\n\nexport function applyExtractionSourceGrounding(\n result: ExtractionResult,\n sourceText: string,\n assertionSourceText: string = sourceText,\n roleAssertionSources: ExtractionGroundingRoleSources | undefined,\n messageTimestamp: Date | undefined,\n options: ExtractionSourceGroundingOptions,\n): ExtractionResult {\n const sourceForGrounding = (source: string | undefined): string | undefined =>\n source === undefined || !options.anchorTemporalExpressions\n ? source\n : delinearize(source, result.entities, messageTimestamp ?? new Date());\n const groundedRoleSources = roleAssertionSources === undefined\n ? undefined\n : {\n profile: sourceForGrounding(roleAssertionSources.profile),\n identity: sourceForGrounding(roleAssertionSources.identity),\n };\n return applyGroundingRules(\n result,\n sourceForGrounding(sourceText) ?? sourceText,\n sourceForGrounding(assertionSourceText) ?? assertionSourceText,\n groundedRoleSources,\n messageTimestamp,\n { ...options, quoteTransform: (quote) => sourceForGrounding(quote) ?? quote },\n );\n}\n\n/**\n * Attach claim-level provenance spans to each fact after extraction has\n * completed. The validator never throws or drops a fact: an unverifiable\n * quote remains a tagged state. When provenance is disabled, transient\n * model-provided quotes are stripped before the result leaves extraction.\n */\nexport function attachExtractionProvenance(\n result: ExtractionResult,\n turns: ReadonlyArray<{\n content: string;\n sessionKey?: string;\n logicalSessionKey?: string;\n timestamp: string;\n turnFingerprint?: string;\n }>,\n provenanceConfig: ProvenanceConfig,\n): ExtractionResult {\n if (!provenanceConfig.enabled) {\n if (result.facts.length === 0) return result;\n return {\n ...result,\n facts: result.facts.map((fact) => {\n if (fact.quote === undefined) return fact;\n const { quote: _stripped, ...rest } = fact;\n return rest;\n }),\n };\n }\n if (result.facts.length === 0) return result;\n const provenanceTurns: ProvenanceTurnInput[] = turns.map((turn) => ({\n content: turn.content,\n sessionKey: turn.sessionKey,\n logicalSessionKey: turn.logicalSessionKey,\n timestamp: turn.timestamp,\n turnId: turn.turnFingerprint,\n }));\n const facts = result.facts.map((fact) => {\n const built = buildFactProvenance(\n fact.quote,\n provenanceTurns,\n provenanceConfig,\n );\n const { quote: _stripped, ...factWithoutQuote } = fact;\n return {\n ...factWithoutQuote,\n ...(built.sources && built.sources.length > 0 ? { sources: built.sources } : {}),\n ...(built.provenance !== \"none\" ? { provenance: built.provenance } : {}),\n ...(built.requireSpansPending ? { requireSpansPending: true } : {}),\n };\n });\n return { ...result, facts };\n}\n\nexport function filterExtractionResultBySource(\n result: ExtractionResult,\n source: string,\n assertionSource?: string,\n roleAssertionSources?: ExtractionGroundingRoleSources,\n eventTimeNormalizer?: (eventTime: string) => string,\n spanMode: \"off\" | \"shadow\" | \"on\" = \"off\",\n quoteTransform?: (quote: string) => string,\n): ExtractionResult {\n return filterGroundingRules(\n result,\n source,\n assertionSource,\n roleAssertionSources,\n eventTimeNormalizer,\n spanMode,\n quoteTransform,\n );\n}\n"],"mappings":";;;;;;;;;;;;AAcO,SAASA,gCACd,QACA,YACA,sBAA8B,YAC9B,sBACA,kBACA,SACkB;AAClB,QAAM,qBAAqB,CAAC,WAC1B,WAAW,UAAa,CAAC,QAAQ,4BAC7B,SACA,YAAY,QAAQ,OAAO,UAAU,oBAAoB,oBAAI,KAAK,CAAC;AACzE,QAAM,sBAAsB,yBAAyB,SACjD,SACA;AAAA,IACA,SAAS,mBAAmB,qBAAqB,OAAO;AAAA,IACxD,UAAU,mBAAmB,qBAAqB,QAAQ;AAAA,EAC5D;AACF,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,UAAU,KAAK;AAAA,IAClC,mBAAmB,mBAAmB,KAAK;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,EAAE,GAAG,SAAS,gBAAgB,CAAC,UAAU,mBAAmB,KAAK,KAAK,MAAM;AAAA,EAC9E;AACF;AAQO,SAAS,2BACd,QACA,OAOA,kBACkB;AAClB,MAAI,CAAC,iBAAiB,SAAS;AAC7B,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS;AAChC,YAAI,KAAK,UAAU,OAAW,QAAO;AACrC,cAAM,EAAE,OAAO,WAAW,GAAG,KAAK,IAAI;AACtC,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAM,kBAAyC,MAAM,IAAI,CAAC,UAAU;AAAA,IAClE,SAAS,KAAK;AAAA,IACd,YAAY,KAAK;AAAA,IACjB,mBAAmB,KAAK;AAAA,IACxB,WAAW,KAAK;AAAA,IAChB,QAAQ,KAAK;AAAA,EACf,EAAE;AACF,QAAM,QAAQ,OAAO,MAAM,IAAI,CAAC,SAAS;AACvC,UAAM,QAAQ;AAAA,MACZ,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,UAAM,EAAE,OAAO,WAAW,GAAG,iBAAiB,IAAI;AAClD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,IAAI,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,MAC9E,GAAI,MAAM,eAAe,SAAS,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,MACtE,GAAI,MAAM,sBAAsB,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAAA,IACnE;AAAA,EACF,CAAC;AACD,SAAO,EAAE,GAAG,QAAQ,MAAM;AAC5B;AAEO,SAASC,gCACd,QACA,QACA,iBACA,sBACA,qBACA,WAAoC,OACpC,gBACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["applyExtractionSourceGrounding","filterExtractionResultBySource"]}
@@ -37,10 +37,10 @@ import {
37
37
  } from "./chunk-YCVB7X56.js";
38
38
  import {
39
39
  fillWearableConversationLocations
40
- } from "./chunk-3I3U6FFT.js";
40
+ } from "./chunk-K7BN34IA.js";
41
41
  import {
42
42
  composeMemoryEnvelope
43
- } from "./chunk-OFCHT2TN.js";
43
+ } from "./chunk-5LRV557D.js";
44
44
  import {
45
45
  log
46
46
  } from "./chunk-3WCASNQZ.js";
@@ -1329,4 +1329,4 @@ export {
1329
1329
  syncWearableSource,
1330
1330
  defaultTimezone
1331
1331
  };
1332
- //# sourceMappingURL=chunk-6M56RFFJ.js.map
1332
+ //# sourceMappingURL=chunk-CJRENHVZ.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  raceRecallAbort,
3
3
  throwIfRecallAborted
4
- } from "./chunk-PBVNVKYN.js";
4
+ } from "./chunk-PIN5OPBA.js";
5
5
  import {
6
6
  emitExtractionLlmFailureError,
7
7
  recordExtractionLlmFailure,
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-23G5P7TA.js";
13
13
  import {
14
14
  tagPersistedMemories
15
- } from "./chunk-3I3U6FFT.js";
15
+ } from "./chunk-K7BN34IA.js";
16
16
  import {
17
17
  resolveScopeProfilePlan
18
18
  } from "./chunk-WC3V7HHP.js";
@@ -1093,4 +1093,4 @@ export {
1093
1093
  ExtractionDeadlineError,
1094
1094
  ExtractionRunCoordinator
1095
1095
  };
1096
- //# sourceMappingURL=chunk-EGDYVYU7.js.map
1096
+ //# sourceMappingURL=chunk-CLWBFR7Q.js.map