@remnic/core 10.0.85 → 10.0.87
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.
- package/dist/access-admin-ops-surface.js +72 -71
- package/dist/access-authorization-probe.js +73 -72
- package/dist/access-boundary.d.ts.map +1 -1
- package/dist/access-boundary.js +72 -71
- package/dist/access-cli.js +157 -155
- package/dist/access-cli.js.map +1 -1
- package/dist/access-errors.d.ts +14 -0
- package/dist/access-errors.d.ts.map +1 -1
- package/dist/access-errors.js +5 -1
- package/dist/access-extraction-force-flush.js +72 -71
- package/dist/access-http-briefing.js +73 -72
- package/dist/access-http-query.js +74 -73
- package/dist/access-http.d.ts +12 -0
- package/dist/access-http.d.ts.map +1 -1
- package/dist/access-http.js +95 -94
- package/dist/access-identity-continuity-surface.js +72 -71
- package/dist/access-lcm-surface.js +72 -71
- package/dist/access-mcp.d.ts.map +1 -1
- package/dist/access-mcp.js +82 -81
- package/dist/access-memory-search-fanout.js +2 -2
- package/dist/access-namespace-preflight.js +72 -71
- package/dist/access-observe-write-category.js +10 -9
- package/dist/access-observe-write-surface.js +72 -71
- package/dist/access-offline-manifest.js +8 -8
- package/dist/access-operations-batch.js +73 -72
- package/dist/access-operations.js +80 -79
- package/dist/access-recall-concurrency.js +72 -71
- package/dist/access-recall-diagnostics.js +2 -2
- package/dist/access-recall-response.js +72 -71
- package/dist/access-recall-surface.js +72 -71
- package/dist/access-schema.d.ts.map +1 -1
- package/dist/access-schema.js +9 -8
- package/dist/access-service.d.ts +3 -3
- package/dist/access-service.d.ts.map +1 -1
- package/dist/access-service.js +72 -71
- package/dist/access-surface-catalog.js +74 -73
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-token-capabilities.js +2 -2
- package/dist/active-recall.js +32 -32
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/briefing-deadline.d.ts +2 -2
- package/dist/briefing-deadline.d.ts.map +1 -1
- package/dist/briefing-deadline.js +1 -1
- package/dist/briefing.js +23 -23
- package/dist/buffer-admission.d.ts +22 -0
- package/dist/buffer-admission.d.ts.map +1 -0
- package/dist/buffer-admission.js +13 -0
- package/dist/buffer-eviction.d.ts +4 -5
- package/dist/buffer-eviction.d.ts.map +1 -1
- package/dist/buffer-eviction.js +1 -1
- package/dist/buffer-turn-helpers.d.ts +7 -0
- package/dist/buffer-turn-helpers.d.ts.map +1 -1
- package/dist/buffer-turn-helpers.js +9 -1
- package/dist/buffer-types.d.ts +24 -1
- package/dist/buffer-types.d.ts.map +1 -1
- package/dist/buffer.d.ts +17 -18
- package/dist/buffer.d.ts.map +1 -1
- package/dist/buffer.js +12 -8
- package/dist/calibration.js +2 -2
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
- package/dist/capsule-import-gate.d.ts +11 -0
- package/dist/capsule-import-gate.d.ts.map +1 -0
- package/dist/capsule-import-gate.js +12 -0
- package/dist/capsule-import-gate.js.map +1 -0
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.js +25 -25
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-73YVMZ7D.js → chunk-2G4TV2ML.js} +11 -11
- package/dist/{chunk-BMIM6ESC.js → chunk-2JG2NI7C.js} +38 -38
- package/dist/{chunk-IR4C3DP2.js → chunk-2K3AUDH7.js} +2 -2
- package/dist/{chunk-6KFFRMPQ.js → chunk-2N4OUSIA.js} +2 -2
- package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-44FQCC5D.js → chunk-2NUDHVYM.js} +2 -2
- package/dist/{chunk-FK4WC6VK.js → chunk-2U4LMSEX.js} +3 -3
- package/dist/{chunk-LT3CMO65.js → chunk-2XOFVTTT.js} +2 -2
- package/dist/{chunk-I6ORDT54.js → chunk-32CA7B6L.js} +2 -2
- package/dist/{chunk-TQVECGUQ.js → chunk-32YX7EJ3.js} +3 -3
- package/dist/{chunk-H4D5YURJ.js → chunk-3CTKEXXF.js} +120 -118
- package/dist/{chunk-H4D5YURJ.js.map → chunk-3CTKEXXF.js.map} +1 -1
- package/dist/{chunk-HLWXCDUQ.js → chunk-3DAWHP5K.js} +5 -5
- package/dist/{chunk-GBOYOL5L.js → chunk-3PJEDHLD.js} +2 -2
- package/dist/{chunk-ZWTHVUT5.js → chunk-3UZ2VMKD.js} +2 -2
- package/dist/{chunk-2XYDL2FG.js → chunk-3Y5X6YFH.js} +2 -2
- package/dist/{chunk-23B4HLWG.js → chunk-4GMI5HFH.js} +9 -9
- package/dist/{chunk-AP3TSV6S.js → chunk-4LCVA2LW.js} +3 -3
- package/dist/{chunk-MZCGHPIJ.js → chunk-4X7HQKAG.js} +2 -2
- package/dist/{chunk-YNBMBL4C.js → chunk-4XYAWK5H.js} +2 -2
- package/dist/{chunk-2JAT4S7N.js → chunk-5SOSQTVE.js} +2 -2
- package/dist/{chunk-G3T6YMBO.js → chunk-64S6X4IU.js} +7 -7
- package/dist/{chunk-NIV7RPWQ.js → chunk-6BCWFCDG.js} +7 -7
- package/dist/{chunk-V27FK6D6.js → chunk-6XTUZKCZ.js} +2 -2
- package/dist/{chunk-KASJJGRG.js → chunk-6ZELOK6O.js} +3 -8
- package/dist/chunk-6ZELOK6O.js.map +1 -0
- package/dist/{chunk-2ASEDFOA.js → chunk-73UZZFJC.js} +3 -3
- package/dist/{chunk-UHPHH74F.js → chunk-77PDJ4OE.js} +3 -3
- package/dist/{chunk-BATPQNRG.js → chunk-7GSL4LBG.js} +2 -2
- package/dist/{chunk-B6SPPYGJ.js → chunk-7IWRLYFJ.js} +2 -2
- package/dist/{chunk-BUKK5SWA.js → chunk-7LCGFUMB.js} +4 -4
- package/dist/{chunk-ZXF3O7P4.js → chunk-ARRTLPRC.js} +2 -2
- package/dist/{chunk-S5CQI2KF.js → chunk-B3GKQ6DU.js} +2 -2
- package/dist/{chunk-2URKYLMK.js → chunk-B56LORLY.js} +2 -2
- package/dist/{chunk-4IWEPQEV.js → chunk-BIVKPQ6Q.js} +2 -2
- package/dist/{chunk-DM4RRTN7.js → chunk-BLSHFIR6.js} +7 -6
- package/dist/chunk-BLSHFIR6.js.map +1 -0
- package/dist/{chunk-4DPLCYEK.js → chunk-C2HORX76.js} +3 -3
- package/dist/{chunk-ELWI2R6H.js → chunk-CC4V7HNP.js} +22 -22
- package/dist/{chunk-LGEH473S.js → chunk-CJCTKL6Y.js} +9 -1
- package/dist/chunk-CJCTKL6Y.js.map +1 -0
- package/dist/{chunk-WFDWLWDK.js → chunk-CN7Q3T2J.js} +4 -4
- package/dist/{chunk-GJVGFKOU.js → chunk-CYCEROPR.js} +3 -3
- package/dist/{chunk-CCU7URRP.js → chunk-D5EV6Y2L.js} +3 -3
- package/dist/{chunk-N6II66E5.js → chunk-DT7SNJH6.js} +3 -3
- package/dist/{chunk-FRM4UTDR.js → chunk-DZ7DPDVW.js} +8 -6
- package/dist/chunk-DZ7DPDVW.js.map +1 -0
- package/dist/{chunk-MVOJDLXS.js → chunk-EA2LA5RI.js} +2 -2
- package/dist/{chunk-WBN66HPI.js → chunk-ELHJK7LM.js} +6 -6
- package/dist/{chunk-GKYIRTNX.js → chunk-EQ4U73UH.js} +45 -14
- package/dist/chunk-EQ4U73UH.js.map +1 -0
- package/dist/{chunk-ONN2E5QD.js → chunk-EUBDYOLD.js} +6 -6
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-3LHPTBWG.js → chunk-F74G4KIH.js} +2 -2
- package/dist/{chunk-X7REO4CH.js → chunk-FF3EFLUT.js} +7 -5
- package/dist/chunk-FF3EFLUT.js.map +1 -0
- package/dist/chunk-FKBGK3NC.js +62 -0
- package/dist/chunk-FKBGK3NC.js.map +1 -0
- package/dist/{chunk-X2KO4FK5.js → chunk-FNFURZBZ.js} +5 -5
- package/dist/chunk-FNFURZBZ.js.map +1 -0
- package/dist/{chunk-MYCCO6AA.js → chunk-G54BOKZ6.js} +2 -2
- package/dist/{chunk-JFH6JAGY.js → chunk-G67EUQAB.js} +5 -5
- package/dist/{chunk-TV65NR7L.js → chunk-GULUWOA5.js} +2 -2
- package/dist/{chunk-6DANGCMO.js → chunk-HFUKXOUW.js} +2 -2
- package/dist/{chunk-Y3IYKNBY.js → chunk-HLN2HOXX.js} +2 -2
- package/dist/{chunk-Y43X3E24.js → chunk-IBDWYRDR.js} +3 -3
- package/dist/{chunk-XSFQN7TP.js → chunk-IBGU6AN6.js} +15 -14
- package/dist/chunk-IBGU6AN6.js.map +1 -0
- package/dist/{chunk-AJG2TAMR.js → chunk-IEEV27BC.js} +2 -2
- package/dist/{chunk-FZPDRCOB.js → chunk-IJ3OEECW.js} +4 -4
- package/dist/{chunk-D6THW7PA.js → chunk-IPD5GC7C.js} +2 -2
- package/dist/{chunk-VCVEMQJK.js → chunk-JM2YZKCQ.js} +2 -2
- package/dist/{chunk-H34INI3P.js → chunk-KVSOEVAF.js} +34 -11
- package/dist/chunk-KVSOEVAF.js.map +1 -0
- package/dist/chunk-M3BEJJNV.js +31 -0
- package/dist/chunk-M3BEJJNV.js.map +1 -0
- package/dist/{chunk-OSTFDWZJ.js → chunk-NIVKG3DS.js} +4 -4
- package/dist/{chunk-VZELUMKK.js → chunk-NQP4ZYGG.js} +2 -2
- package/dist/{chunk-3ODZLCHC.js → chunk-NT7F7WJQ.js} +2 -2
- package/dist/{chunk-YO2JEX2Z.js → chunk-OGBQMY46.js} +2 -2
- package/dist/{chunk-O55AGDTI.js → chunk-OL553AWT.js} +10 -10
- package/dist/{chunk-CLVILSBR.js → chunk-OZNBZJ3S.js} +22 -22
- package/dist/{chunk-RNGDKFY2.js → chunk-P452SEKO.js} +2 -2
- package/dist/{chunk-JX3E4XCW.js → chunk-PDOOUXCS.js} +2 -2
- package/dist/{chunk-V45TEVDA.js → chunk-PKZ274PI.js} +3 -3
- package/dist/{chunk-MNYQVYJ4.js → chunk-QD5R6U5J.js} +2 -2
- package/dist/{chunk-DI5ET2IE.js → chunk-QEZ3DW5O.js} +9 -9
- package/dist/{chunk-WYPCJK6K.js → chunk-QKERFEJS.js} +2 -2
- package/dist/{chunk-BLMTOIBK.js → chunk-QKES7GU6.js} +2 -2
- package/dist/{chunk-PCQWKMOL.js → chunk-QNSZYTSG.js} +2 -2
- package/dist/{chunk-433EXTC4.js → chunk-ROGO7FRA.js} +5 -4
- package/dist/{chunk-433EXTC4.js.map → chunk-ROGO7FRA.js.map} +1 -1
- package/dist/{chunk-MHSBOEH7.js → chunk-ROKDHO74.js} +2 -2
- package/dist/{chunk-BLGQUZFB.js → chunk-RWGRSKN5.js} +7 -5
- package/dist/chunk-RWGRSKN5.js.map +1 -0
- package/dist/{chunk-3VU2FDTU.js → chunk-SYKJBS7S.js} +10 -10
- package/dist/{chunk-5BE3FLKL.js → chunk-TAUHAP5J.js} +4 -4
- package/dist/{chunk-QCP75JGO.js → chunk-TFA6HPOA.js} +5 -5
- package/dist/{chunk-SGHV6LZ7.js → chunk-TQ4SCPGQ.js} +67 -51
- package/dist/chunk-TQ4SCPGQ.js.map +1 -0
- package/dist/{chunk-E7V5AK7I.js → chunk-TRMZHGIX.js} +8 -8
- package/dist/{chunk-WBDIZWJQ.js → chunk-TSS3D7ZY.js} +2 -2
- package/dist/{chunk-HVFX2N2G.js → chunk-UAUV3BWS.js} +65 -83
- package/dist/chunk-UAUV3BWS.js.map +1 -0
- package/dist/{chunk-OMYRPMQC.js → chunk-US7KPQA5.js} +2 -2
- package/dist/{chunk-KHZVAISH.js → chunk-UWRHHRDK.js} +2 -2
- package/dist/{chunk-WLNWFHX3.js → chunk-UXXK523X.js} +40 -2
- package/dist/{chunk-WLNWFHX3.js.map → chunk-UXXK523X.js.map} +1 -1
- package/dist/{chunk-SDESKFKT.js → chunk-UYHDMCY2.js} +2 -2
- package/dist/{chunk-YAAKVTZA.js → chunk-VKILERSL.js} +2 -2
- package/dist/{chunk-2TGIKMMZ.js → chunk-WXDTOE6F.js} +2 -2
- package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-P225W4RQ.js → chunk-XU37EJTW.js} +22 -22
- package/dist/chunk-XU37EJTW.js.map +1 -0
- package/dist/{chunk-QA3Y2O6H.js → chunk-YAVIBVCU.js} +2 -2
- package/dist/{chunk-CMRHXPLQ.js → chunk-YL4UKMD7.js} +117 -51
- package/dist/chunk-YL4UKMD7.js.map +1 -0
- package/dist/{chunk-GYNRNKMW.js → chunk-YMJRLT7S.js} +28 -8
- package/dist/chunk-YMJRLT7S.js.map +1 -0
- package/dist/{chunk-E5QEF3JO.js → chunk-YRZPBN46.js} +3 -3
- package/dist/{chunk-FMFCQRDM.js → chunk-ZANNIXXE.js} +3 -3
- package/dist/{chunk-3KGCHTTK.js → chunk-ZBFLV657.js} +3 -3
- package/dist/{chunk-VEFGHRKV.js → chunk-ZOJUWVAU.js} +1 -1
- package/dist/cli.js +117 -116
- package/dist/coding/export-okf-codegraph.js +21 -21
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.js +23 -23
- package/dist/config.js +32 -32
- package/dist/connectors/codex-materialize-runner.js +22 -22
- package/dist/connectors/index.js +26 -26
- package/dist/convergence-refresh.js +24 -24
- package/dist/conversation-index/backend.js +2 -2
- package/dist/corpus-watermark.js +26 -26
- package/dist/dashboard-runtime.js +2 -2
- package/dist/deep-recall-config.js +2 -2
- package/dist/deep-recall-http-glue.js +11 -11
- package/dist/entity-retrieval.js +23 -23
- package/dist/explicit-capture.js +1 -1
- package/dist/external-wiki-access.js +73 -72
- package/dist/extraction-quote-grounding.d.ts +5 -1
- package/dist/extraction-quote-grounding.d.ts.map +1 -1
- package/dist/extraction-quote-grounding.js +1 -1
- package/dist/extraction-source-grounding-rules.d.ts +3 -1
- package/dist/extraction-source-grounding-rules.d.ts.map +1 -1
- package/dist/extraction-source-grounding-rules.js +2 -2
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts.map +1 -1
- package/dist/extraction-source-grounding.js +3 -3
- package/dist/extraction.d.ts.map +1 -1
- package/dist/extraction.js +40 -40
- package/dist/harmonic-retrieval.js +22 -22
- package/dist/index.js +196 -194
- package/dist/lcm/index.js +3 -3
- package/dist/local-llm.js +2 -2
- package/dist/location/index.js +25 -25
- package/dist/maintenance/memory-governance.js +22 -22
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +22 -22
- package/dist/maintenance/rebuild-memory-projection-runner.js +24 -24
- package/dist/maintenance/rebuild-memory-projection.js +23 -23
- package/dist/memory-browse-http-glue.js +2 -2
- package/dist/memory-browse-operations.js +73 -72
- package/dist/memory-browse.js +5 -5
- package/dist/namespaces/migrate.js +23 -23
- package/dist/namespaces/search.d.ts +1 -0
- package/dist/namespaces/search.d.ts.map +1 -1
- package/dist/namespaces/search.js +10 -8
- package/dist/namespaces/storage.js +22 -22
- package/dist/offline-sync-changeset-generations.js +3 -3
- package/dist/offline-sync-embedding-generation.js +2 -2
- package/dist/offline-sync-impression-drain.js +2 -2
- package/dist/offline-sync-snapshot-stream.js +6 -6
- package/dist/offline-sync.js +5 -5
- package/dist/operator-doctor-corpus.js +29 -29
- package/dist/operator-doctor-replica.js +4 -4
- package/dist/operator-toolkit.js +44 -44
- package/dist/orchestration/backlog-scheduler.js +158 -156
- package/dist/orchestration/backlog-scheduler.js.map +1 -1
- package/dist/orchestration/buffer-drain-runner.js +158 -156
- package/dist/orchestration/maintenance.js +36 -36
- package/dist/orchestration/turn-ingestion.d.ts +2 -9
- package/dist/orchestration/turn-ingestion.d.ts.map +1 -1
- package/dist/orchestrator.js +159 -157
- package/dist/qmd.js +4 -4
- package/dist/recall-navigation-http-glue.js +2 -2
- package/dist/recall-navigation-operations.js +73 -72
- package/dist/recall-navigation.js +72 -71
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-why-service.js +5 -5
- package/dist/replica-divergence.js +3 -3
- package/dist/resume-bundles.js +33 -33
- package/dist/search/factory.js +7 -7
- package/dist/search/index.js +11 -11
- package/dist/semantic-consolidation.js +23 -23
- package/dist/semantic-rule-promotion.js +22 -22
- package/dist/semantic-rule-verifier.js +22 -22
- package/dist/source-agent-qualifier.d.ts +2 -0
- package/dist/source-agent-qualifier.d.ts.map +1 -1
- package/dist/source-agent-qualifier.js +33 -33
- package/dist/standup/build.js +23 -23
- package/dist/storage/buffer-drain-claims.js +2 -2
- package/dist/storage/buffer-session-files.js +2 -2
- package/dist/storage.js +23 -23
- package/dist/summarizer.js +3 -3
- package/dist/support-passport/index.js +75 -74
- package/dist/tokens.js +3 -3
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/export-okf.js +22 -22
- package/dist/verified-recall.js +22 -22
- package/dist/who-knows-cli.js +24 -24
- package/dist/who-knows.js +23 -23
- package/package.json +2 -2
- package/src/access-boundary.ts +15 -0
- package/src/access-errors.ts +22 -0
- package/src/access-fleet-wide-work-peer.test.ts +236 -0
- package/src/access-http-peer-fleet-wide.test.ts +192 -0
- package/src/access-http.test.ts +249 -4
- package/src/access-http.ts +114 -39
- package/src/access-mcp.test.ts +64 -0
- package/src/access-mcp.ts +17 -7
- package/src/access-observe-replay-durability.test.ts +40 -4
- package/src/access-operations-batch.ts +23 -12
- package/src/access-proto-injection.test.ts +340 -0
- package/src/access-schema.ts +31 -5
- package/src/access-service-capsule-import.test.ts +235 -0
- package/src/access-service.ts +6 -45
- package/src/briefing-deadline.ts +5 -4
- package/src/buffer-admission.ts +45 -0
- package/src/buffer-eviction-backpressure.test.ts +211 -0
- package/src/buffer-eviction.ts +8 -14
- package/src/buffer-incremental-persistence.test.ts +25 -37
- package/src/buffer-session.test.ts +32 -16
- package/src/buffer-turn-helpers.ts +41 -0
- package/src/buffer-types.ts +28 -1
- package/src/buffer.ts +77 -85
- package/src/capsule-import-gate.ts +109 -0
- package/src/extraction-quote-grounding.test.ts +76 -0
- package/src/extraction-quote-grounding.ts +49 -13
- package/src/extraction-source-grounding-rules.ts +6 -1
- package/src/extraction-source-grounding.ts +2 -0
- package/src/extraction.ts +3 -4
- package/src/namespaces/search.test.ts +141 -1
- package/src/namespaces/search.ts +39 -9
- package/src/orchestration/turn-ingestion.ts +38 -39
- package/src/recall-navigation-operations.ts +9 -2
- package/src/source-agent-qualifier.ts +3 -0
- package/dist/chunk-BLGQUZFB.js.map +0 -1
- package/dist/chunk-CMRHXPLQ.js.map +0 -1
- package/dist/chunk-DM4RRTN7.js.map +0 -1
- package/dist/chunk-FRM4UTDR.js.map +0 -1
- package/dist/chunk-GKYIRTNX.js.map +0 -1
- package/dist/chunk-GYNRNKMW.js.map +0 -1
- package/dist/chunk-H34INI3P.js.map +0 -1
- package/dist/chunk-HVFX2N2G.js.map +0 -1
- package/dist/chunk-KASJJGRG.js.map +0 -1
- package/dist/chunk-LGEH473S.js.map +0 -1
- package/dist/chunk-P225W4RQ.js.map +0 -1
- package/dist/chunk-SGHV6LZ7.js.map +0 -1
- package/dist/chunk-X2KO4FK5.js.map +0 -1
- package/dist/chunk-X7REO4CH.js.map +0 -1
- package/dist/chunk-XSFQN7TP.js.map +0 -1
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → buffer-admission.js.map} +0 -0
- /package/dist/{chunk-73YVMZ7D.js.map → chunk-2G4TV2ML.js.map} +0 -0
- /package/dist/{chunk-BMIM6ESC.js.map → chunk-2JG2NI7C.js.map} +0 -0
- /package/dist/{chunk-IR4C3DP2.js.map → chunk-2K3AUDH7.js.map} +0 -0
- /package/dist/{chunk-6KFFRMPQ.js.map → chunk-2N4OUSIA.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-44FQCC5D.js.map → chunk-2NUDHVYM.js.map} +0 -0
- /package/dist/{chunk-FK4WC6VK.js.map → chunk-2U4LMSEX.js.map} +0 -0
- /package/dist/{chunk-LT3CMO65.js.map → chunk-2XOFVTTT.js.map} +0 -0
- /package/dist/{chunk-I6ORDT54.js.map → chunk-32CA7B6L.js.map} +0 -0
- /package/dist/{chunk-TQVECGUQ.js.map → chunk-32YX7EJ3.js.map} +0 -0
- /package/dist/{chunk-HLWXCDUQ.js.map → chunk-3DAWHP5K.js.map} +0 -0
- /package/dist/{chunk-GBOYOL5L.js.map → chunk-3PJEDHLD.js.map} +0 -0
- /package/dist/{chunk-ZWTHVUT5.js.map → chunk-3UZ2VMKD.js.map} +0 -0
- /package/dist/{chunk-2XYDL2FG.js.map → chunk-3Y5X6YFH.js.map} +0 -0
- /package/dist/{chunk-23B4HLWG.js.map → chunk-4GMI5HFH.js.map} +0 -0
- /package/dist/{chunk-AP3TSV6S.js.map → chunk-4LCVA2LW.js.map} +0 -0
- /package/dist/{chunk-MZCGHPIJ.js.map → chunk-4X7HQKAG.js.map} +0 -0
- /package/dist/{chunk-YNBMBL4C.js.map → chunk-4XYAWK5H.js.map} +0 -0
- /package/dist/{chunk-2JAT4S7N.js.map → chunk-5SOSQTVE.js.map} +0 -0
- /package/dist/{chunk-G3T6YMBO.js.map → chunk-64S6X4IU.js.map} +0 -0
- /package/dist/{chunk-NIV7RPWQ.js.map → chunk-6BCWFCDG.js.map} +0 -0
- /package/dist/{chunk-V27FK6D6.js.map → chunk-6XTUZKCZ.js.map} +0 -0
- /package/dist/{chunk-2ASEDFOA.js.map → chunk-73UZZFJC.js.map} +0 -0
- /package/dist/{chunk-UHPHH74F.js.map → chunk-77PDJ4OE.js.map} +0 -0
- /package/dist/{chunk-BATPQNRG.js.map → chunk-7GSL4LBG.js.map} +0 -0
- /package/dist/{chunk-B6SPPYGJ.js.map → chunk-7IWRLYFJ.js.map} +0 -0
- /package/dist/{chunk-BUKK5SWA.js.map → chunk-7LCGFUMB.js.map} +0 -0
- /package/dist/{chunk-ZXF3O7P4.js.map → chunk-ARRTLPRC.js.map} +0 -0
- /package/dist/{chunk-S5CQI2KF.js.map → chunk-B3GKQ6DU.js.map} +0 -0
- /package/dist/{chunk-2URKYLMK.js.map → chunk-B56LORLY.js.map} +0 -0
- /package/dist/{chunk-4IWEPQEV.js.map → chunk-BIVKPQ6Q.js.map} +0 -0
- /package/dist/{chunk-4DPLCYEK.js.map → chunk-C2HORX76.js.map} +0 -0
- /package/dist/{chunk-ELWI2R6H.js.map → chunk-CC4V7HNP.js.map} +0 -0
- /package/dist/{chunk-WFDWLWDK.js.map → chunk-CN7Q3T2J.js.map} +0 -0
- /package/dist/{chunk-GJVGFKOU.js.map → chunk-CYCEROPR.js.map} +0 -0
- /package/dist/{chunk-CCU7URRP.js.map → chunk-D5EV6Y2L.js.map} +0 -0
- /package/dist/{chunk-N6II66E5.js.map → chunk-DT7SNJH6.js.map} +0 -0
- /package/dist/{chunk-MVOJDLXS.js.map → chunk-EA2LA5RI.js.map} +0 -0
- /package/dist/{chunk-WBN66HPI.js.map → chunk-ELHJK7LM.js.map} +0 -0
- /package/dist/{chunk-ONN2E5QD.js.map → chunk-EUBDYOLD.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-3LHPTBWG.js.map → chunk-F74G4KIH.js.map} +0 -0
- /package/dist/{chunk-MYCCO6AA.js.map → chunk-G54BOKZ6.js.map} +0 -0
- /package/dist/{chunk-JFH6JAGY.js.map → chunk-G67EUQAB.js.map} +0 -0
- /package/dist/{chunk-TV65NR7L.js.map → chunk-GULUWOA5.js.map} +0 -0
- /package/dist/{chunk-6DANGCMO.js.map → chunk-HFUKXOUW.js.map} +0 -0
- /package/dist/{chunk-Y3IYKNBY.js.map → chunk-HLN2HOXX.js.map} +0 -0
- /package/dist/{chunk-Y43X3E24.js.map → chunk-IBDWYRDR.js.map} +0 -0
- /package/dist/{chunk-AJG2TAMR.js.map → chunk-IEEV27BC.js.map} +0 -0
- /package/dist/{chunk-FZPDRCOB.js.map → chunk-IJ3OEECW.js.map} +0 -0
- /package/dist/{chunk-D6THW7PA.js.map → chunk-IPD5GC7C.js.map} +0 -0
- /package/dist/{chunk-VCVEMQJK.js.map → chunk-JM2YZKCQ.js.map} +0 -0
- /package/dist/{chunk-OSTFDWZJ.js.map → chunk-NIVKG3DS.js.map} +0 -0
- /package/dist/{chunk-VZELUMKK.js.map → chunk-NQP4ZYGG.js.map} +0 -0
- /package/dist/{chunk-3ODZLCHC.js.map → chunk-NT7F7WJQ.js.map} +0 -0
- /package/dist/{chunk-YO2JEX2Z.js.map → chunk-OGBQMY46.js.map} +0 -0
- /package/dist/{chunk-O55AGDTI.js.map → chunk-OL553AWT.js.map} +0 -0
- /package/dist/{chunk-CLVILSBR.js.map → chunk-OZNBZJ3S.js.map} +0 -0
- /package/dist/{chunk-RNGDKFY2.js.map → chunk-P452SEKO.js.map} +0 -0
- /package/dist/{chunk-JX3E4XCW.js.map → chunk-PDOOUXCS.js.map} +0 -0
- /package/dist/{chunk-V45TEVDA.js.map → chunk-PKZ274PI.js.map} +0 -0
- /package/dist/{chunk-MNYQVYJ4.js.map → chunk-QD5R6U5J.js.map} +0 -0
- /package/dist/{chunk-DI5ET2IE.js.map → chunk-QEZ3DW5O.js.map} +0 -0
- /package/dist/{chunk-WYPCJK6K.js.map → chunk-QKERFEJS.js.map} +0 -0
- /package/dist/{chunk-BLMTOIBK.js.map → chunk-QKES7GU6.js.map} +0 -0
- /package/dist/{chunk-PCQWKMOL.js.map → chunk-QNSZYTSG.js.map} +0 -0
- /package/dist/{chunk-MHSBOEH7.js.map → chunk-ROKDHO74.js.map} +0 -0
- /package/dist/{chunk-3VU2FDTU.js.map → chunk-SYKJBS7S.js.map} +0 -0
- /package/dist/{chunk-5BE3FLKL.js.map → chunk-TAUHAP5J.js.map} +0 -0
- /package/dist/{chunk-QCP75JGO.js.map → chunk-TFA6HPOA.js.map} +0 -0
- /package/dist/{chunk-E7V5AK7I.js.map → chunk-TRMZHGIX.js.map} +0 -0
- /package/dist/{chunk-WBDIZWJQ.js.map → chunk-TSS3D7ZY.js.map} +0 -0
- /package/dist/{chunk-OMYRPMQC.js.map → chunk-US7KPQA5.js.map} +0 -0
- /package/dist/{chunk-KHZVAISH.js.map → chunk-UWRHHRDK.js.map} +0 -0
- /package/dist/{chunk-SDESKFKT.js.map → chunk-UYHDMCY2.js.map} +0 -0
- /package/dist/{chunk-YAAKVTZA.js.map → chunk-VKILERSL.js.map} +0 -0
- /package/dist/{chunk-2TGIKMMZ.js.map → chunk-WXDTOE6F.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-QA3Y2O6H.js.map → chunk-YAVIBVCU.js.map} +0 -0
- /package/dist/{chunk-E5QEF3JO.js.map → chunk-YRZPBN46.js.map} +0 -0
- /package/dist/{chunk-FMFCQRDM.js.map → chunk-ZANNIXXE.js.map} +0 -0
- /package/dist/{chunk-3KGCHTTK.js.map → chunk-ZBFLV657.js.map} +0 -0
- /package/dist/{chunk-VEFGHRKV.js.map → chunk-ZOJUWVAU.js.map} +0 -0
|
@@ -3,12 +3,14 @@ import test from "node:test";
|
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { mkdtemp, rm } from "node:fs/promises";
|
|
6
|
-
import {
|
|
6
|
+
import { setImmediate } from "node:timers/promises";
|
|
7
|
+
import { NamespaceSearchRouter, NAMESPACE_SEARCH_LEG_TIMEOUT_MS, normalizeQmdResultPath } from "./search.js";
|
|
7
8
|
import { MaintenanceScheduler } from "../orchestration/maintenance.js";
|
|
8
9
|
import type { NamespaceCatalog } from "./catalog.js";
|
|
9
10
|
import type {
|
|
10
11
|
SearchBackend,
|
|
11
12
|
SearchBackendStatus,
|
|
13
|
+
SearchDegradation,
|
|
12
14
|
SearchExecutionOptions,
|
|
13
15
|
SearchQueryOptions,
|
|
14
16
|
} from "../search/port.js";
|
|
@@ -432,6 +434,144 @@ test("searchAcrossNamespaces preserves same path results from distinct namespace
|
|
|
432
434
|
]);
|
|
433
435
|
});
|
|
434
436
|
|
|
437
|
+
class StalledBackend extends FakeBackend {
|
|
438
|
+
override async search(): Promise<QmdSearchResult[]> {
|
|
439
|
+
return new Promise<QmdSearchResult[]>(() => {});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
test("searchAcrossNamespaces degrades only the namespace whose leg never settles", async (t) => {
|
|
444
|
+
const degradations: SearchDegradation[] = [];
|
|
445
|
+
const router = new NamespaceSearchRouter(
|
|
446
|
+
config(),
|
|
447
|
+
{ storageFor: async (namespace: string) => ({ dir: `/tmp/remnic/${namespace}` }) },
|
|
448
|
+
(scopedConfig) =>
|
|
449
|
+
scopedConfig.memoryDir.endsWith("/stuck")
|
|
450
|
+
? new StalledBackend(false)
|
|
451
|
+
: new FakeBackend(false, [
|
|
452
|
+
{ path: "facts/a.md", docid: "a", score: 0.9, snippet: "main" },
|
|
453
|
+
]),
|
|
454
|
+
);
|
|
455
|
+
t.mock.timers.enable({ apis: ["setTimeout"] });
|
|
456
|
+
const call = router.searchAcrossNamespaces({
|
|
457
|
+
query: "a",
|
|
458
|
+
namespaces: ["main", "stuck"],
|
|
459
|
+
maxResults: 10,
|
|
460
|
+
execution: { onDegradation: (degradation) => degradations.push(degradation) },
|
|
461
|
+
});
|
|
462
|
+
let outcome: "settled" | "rejected" | "stalled" | undefined;
|
|
463
|
+
const guard = new Promise<"stalled">((resolve) => {
|
|
464
|
+
setTimeout(() => resolve("stalled"), 60_000);
|
|
465
|
+
});
|
|
466
|
+
void Promise.race([
|
|
467
|
+
call.then(() => "settled" as const, () => "rejected" as const),
|
|
468
|
+
guard,
|
|
469
|
+
]).then((value) => {
|
|
470
|
+
outcome = value;
|
|
471
|
+
});
|
|
472
|
+
await setImmediate();
|
|
473
|
+
t.mock.timers.tick(NAMESPACE_SEARCH_LEG_TIMEOUT_MS);
|
|
474
|
+
await setImmediate();
|
|
475
|
+
if (outcome === undefined) {
|
|
476
|
+
t.mock.timers.tick(60_000);
|
|
477
|
+
await setImmediate();
|
|
478
|
+
}
|
|
479
|
+
assert.equal(outcome, "settled", "a stalled namespace leg must not hold the whole search");
|
|
480
|
+
const results = await call;
|
|
481
|
+
assert.deepEqual(results.map((result) => result.snippet), ["main"]);
|
|
482
|
+
assert.equal(degradations.length, 1);
|
|
483
|
+
assert.equal(degradations[0].backend, "qmd");
|
|
484
|
+
assert.equal(degradations[0].code, "deadline_exceeded");
|
|
485
|
+
assert.match(degradations[0].detail ?? "", /stuck/);
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
test("searchAcrossNamespaces still rejects when the caller aborts", async () => {
|
|
489
|
+
const degradations: SearchDegradation[] = [];
|
|
490
|
+
const router = new NamespaceSearchRouter(
|
|
491
|
+
config(),
|
|
492
|
+
{ storageFor: async (namespace: string) => ({ dir: `/tmp/remnic/${namespace}` }) },
|
|
493
|
+
() => new StalledBackend(false),
|
|
494
|
+
);
|
|
495
|
+
const caller = new AbortController();
|
|
496
|
+
const call = router.searchAcrossNamespaces({
|
|
497
|
+
query: "a",
|
|
498
|
+
namespaces: ["main"],
|
|
499
|
+
maxResults: 10,
|
|
500
|
+
execution: {
|
|
501
|
+
signal: caller.signal,
|
|
502
|
+
onDegradation: (degradation) => degradations.push(degradation),
|
|
503
|
+
},
|
|
504
|
+
});
|
|
505
|
+
caller.abort();
|
|
506
|
+
await assert.rejects(call, { message: "operation aborted" });
|
|
507
|
+
assert.equal(degradations.length, 0, "a caller abort is not a backend degradation");
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
test("searchAcrossNamespaces propagates backend errors instead of masking them", async () => {
|
|
511
|
+
const degradations: SearchDegradation[] = [];
|
|
512
|
+
class ThrowingBackend extends FakeBackend {
|
|
513
|
+
override async search(): Promise<QmdSearchResult[]> {
|
|
514
|
+
throw new Error("boom");
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
const router = new NamespaceSearchRouter(
|
|
518
|
+
config(),
|
|
519
|
+
{ storageFor: async (namespace: string) => ({ dir: `/tmp/remnic/${namespace}` }) },
|
|
520
|
+
() => new ThrowingBackend(false),
|
|
521
|
+
);
|
|
522
|
+
const call = router.searchAcrossNamespaces({
|
|
523
|
+
query: "a",
|
|
524
|
+
namespaces: ["main"],
|
|
525
|
+
maxResults: 10,
|
|
526
|
+
execution: { onDegradation: (degradation) => degradations.push(degradation) },
|
|
527
|
+
});
|
|
528
|
+
await assert.rejects(call, { message: "boom" });
|
|
529
|
+
assert.equal(degradations.length, 0, "a backend error is not a deadline");
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
test("searchAcrossNamespaces hands each leg its deadline signal", async (t) => {
|
|
533
|
+
const signals = new Map<string, AbortSignal | undefined>();
|
|
534
|
+
const degradations: SearchDegradation[] = [];
|
|
535
|
+
class RecordingBackend extends FakeBackend {
|
|
536
|
+
constructor(private readonly name: string) {
|
|
537
|
+
super(false);
|
|
538
|
+
}
|
|
539
|
+
override async search(
|
|
540
|
+
_query: string,
|
|
541
|
+
_collection?: string,
|
|
542
|
+
_maxResults?: number,
|
|
543
|
+
_options?: SearchQueryOptions,
|
|
544
|
+
execution?: SearchExecutionOptions,
|
|
545
|
+
): Promise<QmdSearchResult[]> {
|
|
546
|
+
signals.set(this.name, execution?.signal);
|
|
547
|
+
if (this.name === "stuck") return new Promise<QmdSearchResult[]>(() => {});
|
|
548
|
+
return [{ path: "facts/a.md", docid: "a", score: 0.9, snippet: this.name }];
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
const router = new NamespaceSearchRouter(
|
|
552
|
+
config(),
|
|
553
|
+
{ storageFor: async (namespace: string) => ({ dir: `/tmp/remnic/${namespace}` }) },
|
|
554
|
+
(scopedConfig) => new RecordingBackend(scopedConfig.memoryDir.endsWith("/stuck") ? "stuck" : "healthy"),
|
|
555
|
+
);
|
|
556
|
+
t.mock.timers.enable({ apis: ["setTimeout"] });
|
|
557
|
+
const call = router.searchAcrossNamespaces({
|
|
558
|
+
query: "a",
|
|
559
|
+
namespaces: ["healthy", "stuck"],
|
|
560
|
+
maxResults: 10,
|
|
561
|
+
execution: { onDegradation: (degradation) => degradations.push(degradation) },
|
|
562
|
+
});
|
|
563
|
+
await setImmediate();
|
|
564
|
+
t.mock.timers.tick(NAMESPACE_SEARCH_LEG_TIMEOUT_MS);
|
|
565
|
+
await setImmediate();
|
|
566
|
+
const results = await call;
|
|
567
|
+
assert.deepEqual(results.map((result) => result.snippet), ["healthy"]);
|
|
568
|
+
assert.equal(signals.get("stuck")?.aborted, true, "the stuck leg's backend must see its deadline abort");
|
|
569
|
+
assert.equal(signals.get("healthy")?.aborted, false, "a finished leg's timer must be cleared");
|
|
570
|
+
const deadlineCodes = degradations.filter((degradation) => degradation.code === "deadline_exceeded");
|
|
571
|
+
assert.equal(deadlineCodes.length, 1);
|
|
572
|
+
assert.match(deadlineCodes[0].detail ?? "", /stuck/);
|
|
573
|
+
});
|
|
574
|
+
|
|
435
575
|
test("searchAcrossNamespaces passes scoped collection to backend search methods", async () => {
|
|
436
576
|
const created: FakeBackend[] = [];
|
|
437
577
|
const router = new NamespaceSearchRouter(
|
package/src/namespaces/search.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
SearchExecutionOptions,
|
|
8
8
|
SearchQueryOptions,
|
|
9
9
|
} from "../search/port.js";
|
|
10
|
+
import { reportSearchDegradation } from "../search/port.js";
|
|
10
11
|
import { createSearchBackend } from "../search/factory.js";
|
|
11
12
|
import { namespaceIdentityToken, normalizeNamespaceIdentity } from "./identity.js";
|
|
12
13
|
import { ALL_CATEGORY_DIRS } from "../utils/category-dir.js";
|
|
@@ -17,6 +18,10 @@ const NESTED_NAMESPACE_FILTER_OVERFETCH_MIN = 50;
|
|
|
17
18
|
// Short TTL so repeated health polls skip a full QMD re-probe (~1.5s).
|
|
18
19
|
const HEALTH_RESULT_CACHE_TTL_MS = 10_000;
|
|
19
20
|
|
|
21
|
+
// Each cross-namespace search leg gets this budget; a stalled backend leg
|
|
22
|
+
// degrades its own namespace instead of holding the whole search (#3139).
|
|
23
|
+
export const NAMESPACE_SEARCH_LEG_TIMEOUT_MS = 25_000;
|
|
24
|
+
|
|
20
25
|
export function namespaceCollectionName(
|
|
21
26
|
baseCollection: string,
|
|
22
27
|
namespace: string,
|
|
@@ -177,42 +182,67 @@ export class NamespaceSearchRouter {
|
|
|
177
182
|
return { namespace, results: [] as QmdSearchResult[] };
|
|
178
183
|
}
|
|
179
184
|
const backendLimit = backendSearchLimit(record, maxResults);
|
|
180
|
-
|
|
185
|
+
// One stalled backend leg must not hold the whole cross-namespace
|
|
186
|
+
// search (#3139). The backend gets the deadline signal so it cancels
|
|
187
|
+
// its own work, and the await is raced against the same budget. A leg
|
|
188
|
+
// that outlives its budget degrades only its own namespace; real
|
|
189
|
+
// backend errors and caller aborts propagate as before.
|
|
190
|
+
const legAbort = new AbortController();
|
|
191
|
+
const legTimer = setTimeout(() => legAbort.abort(), NAMESPACE_SEARCH_LEG_TIMEOUT_MS);
|
|
192
|
+
const legSignal = options.execution?.signal
|
|
193
|
+
? AbortSignal.any([options.execution.signal, legAbort.signal])
|
|
194
|
+
: legAbort.signal;
|
|
195
|
+
const legExecution: SearchExecutionOptions = { ...options.execution, signal: legSignal };
|
|
196
|
+
let leg: Promise<QmdSearchResult[]>;
|
|
181
197
|
switch (method) {
|
|
182
198
|
case "hybrid":
|
|
183
|
-
|
|
199
|
+
leg = record.backend.hybridSearch(
|
|
184
200
|
query,
|
|
185
201
|
record.collection,
|
|
186
202
|
backendLimit,
|
|
187
|
-
|
|
203
|
+
legExecution,
|
|
188
204
|
);
|
|
189
205
|
break;
|
|
190
206
|
case "bm25":
|
|
191
|
-
|
|
207
|
+
leg = record.backend.bm25Search(
|
|
192
208
|
query,
|
|
193
209
|
record.collection,
|
|
194
210
|
backendLimit,
|
|
195
|
-
|
|
211
|
+
legExecution,
|
|
196
212
|
);
|
|
197
213
|
break;
|
|
198
214
|
case "vector":
|
|
199
|
-
|
|
215
|
+
leg = record.backend.vectorSearch(
|
|
200
216
|
query,
|
|
201
217
|
record.collection,
|
|
202
218
|
backendLimit,
|
|
203
|
-
|
|
219
|
+
legExecution,
|
|
204
220
|
);
|
|
205
221
|
break;
|
|
206
222
|
default:
|
|
207
|
-
|
|
223
|
+
leg = record.backend.search(
|
|
208
224
|
query,
|
|
209
225
|
record.collection,
|
|
210
226
|
backendLimit,
|
|
211
227
|
options.searchOptions,
|
|
212
|
-
|
|
228
|
+
legExecution,
|
|
213
229
|
);
|
|
214
230
|
break;
|
|
215
231
|
}
|
|
232
|
+
let results: QmdSearchResult[];
|
|
233
|
+
try {
|
|
234
|
+
results = await awaitWithAbort(leg, legSignal);
|
|
235
|
+
} catch (error) {
|
|
236
|
+
if (options.execution?.signal?.aborted || !legAbort.signal.aborted) throw error;
|
|
237
|
+
reportSearchDegradation(options.execution, {
|
|
238
|
+
backend: "qmd",
|
|
239
|
+
code: "deadline_exceeded",
|
|
240
|
+
detail: `namespace search deadline exceeded: ${namespace}`,
|
|
241
|
+
});
|
|
242
|
+
return { namespace, results: [] };
|
|
243
|
+
} finally {
|
|
244
|
+
clearTimeout(legTimer);
|
|
245
|
+
}
|
|
216
246
|
results = filterNamespaceSubtreeResults(record, results)
|
|
217
247
|
.map((result) => ({
|
|
218
248
|
...result,
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import { createHash, randomBytes } from "node:crypto";
|
|
20
20
|
import { abortError, isPreemptedExtraction } from "../abort-error.js";
|
|
21
|
-
import { SmartBuffer } from "../buffer.js";
|
|
21
|
+
import { SmartBuffer, type AddTurnOutcome } from "../buffer.js";
|
|
22
22
|
import type { ImportTurn } from "../bulk-import/types.js";
|
|
23
23
|
import { resolveNamespaceCapabilities, resolvePipelineProcessingCapabilities, resolveRecallAuxiliaryCapabilities } from "../capabilities.js";
|
|
24
24
|
import type { CorrectionService } from "../correction/correction-service.js";
|
|
@@ -57,18 +57,10 @@ import {
|
|
|
57
57
|
type BulkImportBatchIngestResult,
|
|
58
58
|
} from "../orchestrator.js";
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
* previously accepted capture was evicted to make room.
|
|
65
|
-
*/
|
|
66
|
-
export class ReplayAdmissionRefusedError extends Error {
|
|
67
|
-
constructor(message: string) {
|
|
68
|
-
super(message);
|
|
69
|
-
this.name = "ReplayAdmissionRefusedError";
|
|
70
|
-
}
|
|
71
|
-
}
|
|
60
|
+
// The class lives in ../buffer-admission.js next to BufferAdmissionRefusedError;
|
|
61
|
+
// re-exported here so existing importers keep their import path.
|
|
62
|
+
import { ReplayAdmissionRefusedError } from "../buffer-admission.js";
|
|
63
|
+
export { ReplayAdmissionRefusedError };
|
|
72
64
|
|
|
73
65
|
export interface TurnIngestionDeps {
|
|
74
66
|
readonly buffer: SmartBuffer;
|
|
@@ -440,10 +432,29 @@ export class TurnIngestionCoordinator {
|
|
|
440
432
|
"accepted capture requires an explicit storage target (writeNamespaceOverride or scopeProfileWritePlan.writeNamespace)",
|
|
441
433
|
);
|
|
442
434
|
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
if (options.
|
|
435
|
+
const pin = (turn: BufferTurn): BufferTurn => {
|
|
436
|
+
const pinned: BufferTurn = { ...turn, acceptedCapture: true, writeNamespaceOverride: resolvedWriteTarget };
|
|
437
|
+
if (options.codingContext) pinned.codingContext = options.codingContext;
|
|
438
|
+
if (options.principalOverride) pinned.principalOverride = options.principalOverride;
|
|
439
|
+
if (options.scopeProfileWritePlan) pinned.scopeProfileWritePlan = options.scopeProfileWritePlan;
|
|
440
|
+
return pinned;
|
|
441
|
+
};
|
|
442
|
+
const batches = [...bySession].map(([bufferKey, sessionTurns]) => ({ bufferKey, turns: sessionTurns.map(pin) }));
|
|
443
|
+
const outcomes = await this.deps.buffer.addTurnsBounded(batches);
|
|
444
|
+
if (outcomes === null) {
|
|
445
|
+
const refusedKey = batches.find((batch) => batch.turns.length > 0)?.bufferKey ?? "unknown";
|
|
446
|
+
throw new ReplayAdmissionRefusedError(
|
|
447
|
+
`durable observe capture refused: extraction buffer at entry capacity for batch containing ${refusedKey}`,
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// All requested session keys were capacity-admitted together before any
|
|
452
|
+
// turn was saved. There is no retry identity: a repeat after a crash that
|
|
453
|
+
// persisted only a prefix duplicates that prefix, as on main.
|
|
454
|
+
await this.deps.buffer.flushPendingSave({ throwOnFailure: true });
|
|
455
|
+
|
|
456
|
+
if (options.archiveLcm !== false && this.deps.lcmEngine?.enabled) {
|
|
457
|
+
for (const [bufferKey, sessionTurns] of bySession) {
|
|
447
458
|
await this.deps.lcmEngine.observeMessages(
|
|
448
459
|
bufferKey,
|
|
449
460
|
sessionTurns.map((turn) => ({
|
|
@@ -455,29 +466,17 @@ export class TurnIngestionCoordinator {
|
|
|
455
466
|
})),
|
|
456
467
|
);
|
|
457
468
|
}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
}
|
|
469
|
-
if (outcome.decision !== "keep_buffering" && outcome.extractionTurns) {
|
|
470
|
-
queueBufferedCaptureScopeGroups(
|
|
471
|
-
this.deps.queueBufferedExtraction,
|
|
472
|
-
outcome.extractionTurns,
|
|
473
|
-
bufferKey,
|
|
474
|
-
options,
|
|
475
|
-
);
|
|
476
|
-
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
for (const { bufferKey, outcome } of outcomes) {
|
|
472
|
+
if (outcome.decision !== "keep_buffering" && outcome.extractionTurns) {
|
|
473
|
+
queueBufferedCaptureScopeGroups(
|
|
474
|
+
this.deps.queueBufferedExtraction,
|
|
475
|
+
outcome.extractionTurns,
|
|
476
|
+
bufferKey,
|
|
477
|
+
options,
|
|
478
|
+
);
|
|
477
479
|
}
|
|
478
|
-
// Acceptance durability barrier (#1909 seam): surfaces storage failures
|
|
479
|
-
// BEFORE the caller can report acceptance. Not abort-gated.
|
|
480
|
-
await this.deps.buffer.flushPendingSave({ throwOnFailure: true });
|
|
481
480
|
}
|
|
482
481
|
}
|
|
483
482
|
|
|
@@ -11,13 +11,20 @@
|
|
|
11
11
|
import { z } from "zod";
|
|
12
12
|
|
|
13
13
|
import { defineOperation } from "./access-boundary.js";
|
|
14
|
-
import { EngramAccessInputError } from "./access-errors.js";
|
|
14
|
+
import { EngramAccessInputError, rejectReservedArgumentKey } from "./access-errors.js";
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Null-prototype accumulator for cleaned request arguments, matching the
|
|
18
|
+
* batch preprocessors (issue #3225 B1): a copied own `__proto__` member on a
|
|
19
|
+
* plain `{}` switches the accumulator's prototype and an inherited field then
|
|
20
|
+
* reaches the zod parse.
|
|
21
|
+
*/
|
|
16
22
|
function stripNulls(data: unknown): unknown {
|
|
17
23
|
if (data !== null && typeof data === "object" && !Array.isArray(data)) {
|
|
18
24
|
const obj = data as Record<string, unknown>;
|
|
19
|
-
const cleaned
|
|
25
|
+
const cleaned = Object.create(null);
|
|
20
26
|
for (const [key, value] of Object.entries(obj)) {
|
|
27
|
+
rejectReservedArgumentKey(key);
|
|
21
28
|
if (value !== null) cleaned[key] = value;
|
|
22
29
|
}
|
|
23
30
|
return cleaned;
|
|
@@ -52,6 +52,8 @@ export interface ExtractionGroundingContext {
|
|
|
52
52
|
* second pass reads it so its prompts carry the same media warning. */
|
|
53
53
|
ambientCapture?: boolean;
|
|
54
54
|
scopeClassificationEnabled?: boolean;
|
|
55
|
+
/** Contents of the turns assertionSource was joined from, so quote anchors cut at real turn boundaries. */
|
|
56
|
+
turns?: readonly string[];
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
export function applyGroundingWithConnector(
|
|
@@ -64,6 +66,7 @@ export function applyGroundingWithConnector(
|
|
|
64
66
|
sourceGrounding: caps.sourceGrounding,
|
|
65
67
|
anchorTemporalExpressions: caps.delinearize,
|
|
66
68
|
spanMode: config.extraction?.spanMode ?? "off",
|
|
69
|
+
turns: ctx.turns,
|
|
67
70
|
};
|
|
68
71
|
const known = buildKnownConnectors(ctx.sourceConnector);
|
|
69
72
|
// Scope-forcing is decoupled from strip/restore (runs without a trusted
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/extraction-source-grounding-rules.ts"],"sourcesContent":["import type { ExtractionResult } from \"./types.js\";\nimport { anchorTemporalExpressions } from \"./delinearize.js\";\nimport {\n filterEntityFacts,\n isQuoteAnchoredClaim,\n isQuoteAnchoredRelationship,\n quoteAnchoredEntitySupport,\n quoteAnchors,\n tokenPool,\n type QuoteAnchor,\n type TokenPool,\n} from \"./extraction-quote-grounding.js\";\nimport {\n GROUNDING_AUXILIARY_TOKENS,\n GROUNDING_COPULAR_FORMS,\n GROUNDING_MIN_COVERAGE,\n GROUNDING_MIN_SHARED_TOKENS,\n GROUNDING_STOPWORDS,\n areGroundingTokensCompatible,\n containsContiguousGroundingTokens,\n containsExactTokenSequence,\n groundingLexemes,\n groundingTokenSequence,\n hasContradictoryPolarity,\n hasExplicitRoleSubjectToken,\n isGroundedEntityName,\n isInterrogativeSourceSentence,\n normalizeForExactMatch,\n normalizedEntityIdentifierTokens,\n normalizedGroundingAlignmentTokenSequence,\n normalizedGroundingTokenSequence,\n sourceSentences,\n spacelessScriptGroundedTokenScore,\n splitGroundingClauses,\n stemToken,\n tokenize,\n tokenSequence,\n} from \"./extraction-source-grounding-helpers.js\";\n\nexport interface ExtractionSourceGroundingOptions {\n sourceGrounding: boolean;\n anchorTemporalExpressions: boolean;\n spanMode?: \"off\" | \"shadow\" | \"on\";\n /** Rewrite applied to the source before this stage, so a verbatim quote can still be located in it. */\n quoteTransform?: (quote: string) => string;\n}\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 if (!options.sourceGrounding) return result;\n const anchorSource = (source: string): string =>\n options.anchorTemporalExpressions\n ? anchorTemporalExpressions(source, messageTimestamp ?? new Date())\n : source;\n const anchoredRoleSources = roleAssertionSources === undefined\n ? undefined\n : {\n profile: roleAssertionSources.profile === undefined\n ? undefined\n : anchorSource(roleAssertionSources.profile),\n identity: roleAssertionSources.identity === undefined\n ? undefined\n : anchorSource(roleAssertionSources.identity),\n };\n return filterExtractionResultBySource(\n result,\n anchorSource(sourceText),\n anchorSource(assertionSourceText),\n anchoredRoleSources,\n options.anchorTemporalExpressions ? anchorSource : undefined,\n options.spanMode ?? \"off\",\n options.anchorTemporalExpressions\n ? (quote) => anchorSource(options.quoteTransform?.(quote) ?? quote)\n : undefined,\n );\n}\n\nexport interface ExtractionGroundingRoleSources {\n profile?: string;\n identity?: string;\n}\n\n\n\ninterface GroundingCopularClaim {\n subject: string;\n predicate: string;\n}\n\nfunction groundingCopularClaim(text: string): GroundingCopularClaim | undefined {\n const lexemes = groundingLexemes(text);\n const copulaIndex = lexemes.findIndex(({ token }) => GROUNDING_COPULAR_FORMS.has(token));\n if (copulaIndex <= 0) return undefined;\n\n let subjectIndex = copulaIndex - 1;\n while (\n subjectIndex >= 0\n && GROUNDING_AUXILIARY_TOKENS.has(lexemes[subjectIndex]!.token)\n ) {\n subjectIndex -= 1;\n }\n const subjectLexeme = lexemes[subjectIndex];\n const predicateLexeme = lexemes\n .slice(copulaIndex + 1)\n .find(({ token }) => GROUNDING_STOPWORDS[token] !== true);\n if (subjectLexeme === undefined || predicateLexeme === undefined) return undefined;\n\n return {\n subject: stemToken(subjectLexeme.token, subjectLexeme.preserveTerminalS, true),\n predicate: stemToken(predicateLexeme.token, predicateLexeme.preserveTerminalS, true),\n };\n}\n\nfunction hasCopularPredicateEvidence(candidate: string, source: string): boolean {\n const candidateClaim = groundingCopularClaim(candidate);\n if (candidateClaim === undefined) return true;\n const sourceClaim = groundingCopularClaim(source);\n return sourceClaim !== undefined\n && areGroundingTokensCompatible(candidateClaim.subject, sourceClaim.subject)\n && areGroundingTokensCompatible(candidateClaim.predicate, sourceClaim.predicate);\n}\nconst GROUNDING_ALIGNMENT_MODIFIERS = new Set([\n \"actively\",\n \"again\",\n \"already\",\n \"currently\",\n \"eventually\",\n \"finally\",\n \"generally\",\n \"mainly\",\n \"newly\",\n \"now\",\n \"often\",\n \"previously\",\n \"primarily\",\n \"quickly\",\n \"recently\",\n \"repeatedly\",\n \"simply\",\n \"slowly\",\n \"sometimes\",\n \"still\",\n \"successfully\",\n \"typically\",\n \"usually\",\n]);\n\nfunction isGroundingAlignmentModifier(token: string): boolean {\n return GROUNDING_ALIGNMENT_MODIFIERS.has(token);\n}\n\nfunction groundingSubjectTokenSequence(text: string): string[] {\n const lexemes = groundingLexemes(text)\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true);\n const predicateIndex = lexemes.findIndex(({ isPredicate }) => isPredicate);\n if (predicateIndex < 1) return [];\n return lexemes\n .slice(0, predicateIndex)\n .filter(({ token }) => !isGroundingAlignmentModifier(token) && !token.endsWith(\"ly\"))\n .map(({ token, preserveTerminalS }) => stemToken(token, preserveTerminalS, true));\n}\n\n\nfunction hasAlignedSubjectPredicateOverlap(candidate: string, source: string): boolean {\n const candidateTokens = normalizedGroundingAlignmentTokenSequence(candidate);\n const sourceTokens = normalizedGroundingAlignmentTokenSequence(source);\n const candidateSubjectTokens = groundingSubjectTokenSequence(candidate);\n const sourceSubjectTokens = groundingSubjectTokenSequence(source);\n const hasCorrectionReordering = /\\b(?:rather\\s+than|instead\\s+of)\\b/iu.test(candidate)\n && /\\b(?:not|rather\\s+than|instead\\s+of)\\b/iu.test(source);\n if (\n candidateSubjectTokens.length > 0\n && sourceSubjectTokens.length > 0\n && !hasCorrectionReordering\n && (\n candidateSubjectTokens.length !== sourceSubjectTokens.length\n || candidateSubjectTokens.some(\n (token, index) => !areGroundingTokensCompatible(token, sourceSubjectTokens[index]!),\n )\n )\n ) {\n return false;\n }\n if (candidateTokens.length < 3 || sourceTokens.length < 3) {\n return hasCopularPredicateEvidence(candidate, source);\n }\n\n const candidateSubject = candidateTokens[0];\n if (candidateSubject === undefined) return false;\n for (let sourceSubjectIndex = 0; sourceSubjectIndex < sourceTokens.length; sourceSubjectIndex += 1) {\n if (!areGroundingTokensCompatible(candidateSubject, sourceTokens[sourceSubjectIndex]!)) continue;\n let sourceCursor = sourceSubjectIndex + 1;\n let foundAlignedToken = false;\n let aligned = true;\n for (let candidateIndex = 1; candidateIndex < candidateTokens.length; candidateIndex += 1) {\n const candidateToken = candidateTokens[candidateIndex]!;\n const sourceIndex = sourceTokens.findIndex(\n (sourceToken, index) =>\n index >= sourceCursor && areGroundingTokensCompatible(candidateToken, sourceToken),\n );\n if (sourceIndex === -1) {\n if (hasCorrectionReordering) continue;\n aligned = false;\n break;\n }\n foundAlignedToken = true;\n const candidateNext = candidateTokens[candidateIndex + 1];\n const sourceNext = sourceTokens[sourceIndex + 1];\n if (\n candidateNext !== undefined\n && sourceNext !== undefined\n && !hasCorrectionReordering\n && !areGroundingTokensCompatible(candidateNext, sourceNext)\n && !isGroundingAlignmentModifier(sourceNext)\n ) {\n aligned = false;\n break;\n }\n sourceCursor = sourceIndex + 1;\n }\n if (aligned && foundAlignedToken) return true;\n }\n return false;\n}\n\nfunction omitsSourceDisjunction(candidate: string, source: string): boolean {\n if (!/\\bor\\b/iu.test(source) || /\\bor\\b/iu.test(candidate)) return false;\n const candidateTokens = normalizedGroundingTokenSequence(candidate);\n return splitGroundingClauses([source], true).some((sourceSpan) => {\n const sourceSpanTokens = normalizedGroundingTokenSequence(sourceSpan);\n return candidateTokens.length === sourceSpanTokens.length\n && candidateTokens.every(\n (token, index) => areGroundingTokensCompatible(token, sourceSpanTokens[index]!),\n );\n });\n}\n\nfunction groundedTokenScore(\n candidate: string,\n source: string,\n requireAlignedArguments = true,\n requireAllCandidateTokensGrounded = true,\n): number {\n const scriptAwareScore = spacelessScriptGroundedTokenScore(candidate, source);\n if (scriptAwareScore !== null) return scriptAwareScore;\n const candidateTokens = tokenize(candidate);\n if (candidateTokens.size === 0) return 0;\n const sourceTokens = tokenize(source);\n const allowCorrectionReordering = /\\b(?:rather\\s+than|instead\\s+of)\\b/iu.test(candidate);\n let sharedTokens = 0;\n let allCandidateTokensGrounded = true;\n for (const token of candidateTokens) {\n if ([...sourceTokens].some((sourceToken) => areGroundingTokensCompatible(token, sourceToken))) {\n sharedTokens += 1;\n } else if (!allowCorrectionReordering && token !== \"rather\" && token !== \"instead\") {\n allCandidateTokensGrounded = false;\n }\n }\n if (\n (requireAllCandidateTokensGrounded && !allCandidateTokensGrounded)\n || sharedTokens < GROUNDING_MIN_SHARED_TOKENS\n || sharedTokens / candidateTokens.size < GROUNDING_MIN_COVERAGE\n ) {\n return 0;\n }\n if (requireAlignedArguments && !hasAlignedSubjectPredicateOverlap(candidate, source)) return 0;\n return sharedTokens / candidateTokens.size;\n}\n\nfunction candidateClauses(candidate: string): string[] {\n return sourceSentences(candidate).flatMap((sentence) =>\n /\\bor\\b/iu.test(sentence) ? [sentence] : splitGroundingClauses([sentence]));\n}\n\nfunction isSourceGroundedClause(\n candidate: string,\n source: string,\n includeInterrogativeSource = false,\n): boolean {\n let bestSupportedScore = 0;\n let bestContradictedScore = 0;\n const sentences = sourceSentences(source);\n for (let index = 0; index < sentences.length; index += 1) {\n const sentence = sentences[index];\n if (isYesNoAnswer(sentence)) {\n const precedingSentence = sentences[index - 1];\n const answerToken = tokenSequence(sentence)[0];\n const contradictoryPolarity = precedingSentence !== undefined\n ? hasContradictoryPolarity(candidate, precedingSentence)\n : false;\n if (\n precedingSentence !== undefined\n && isInterrogativeSourceSentence(precedingSentence)\n && !omitsSourceDisjunction(candidate, precedingSentence)\n && groundedTokenScore(candidate, precedingSentence) === 1\n && (\n (answerToken === \"yes\" && !contradictoryPolarity)\n || (answerToken === \"no\" && contradictoryPolarity)\n )\n ) {\n return true;\n }\n continue;\n }\n const sentenceText = normalizeForExactMatch(sentence);\n const isExplanatoryLabel = sentenceText.startsWith(`${normalizeForExactMatch(candidate)}:`)\n && !sentence.trim().endsWith(\"?\");\n if (!includeInterrogativeSource && isInterrogativeSourceSentence(sentence) && !isExplanatoryLabel) {\n continue;\n }\n if (omitsSourceDisjunction(candidate, sentence)) continue;\n const sourceSpans = /\\b(?:rather\\s+than|instead\\s+of)\\b/iu.test(candidate)\n ? [sentence]\n : splitGroundingClauses([sentence], true);\n for (const sourceSpan of sourceSpans) {\n const sourceSpanText = normalizeForExactMatch(sourceSpan);\n if (containsExactTokenSequence(candidate, sourceSpanText)) {\n if (!hasContradictoryPolarity(candidate, sourceSpan)) return true;\n bestContradictedScore = Math.max(bestContradictedScore, 1);\n continue;\n }\n const score = groundedTokenScore(\n candidate,\n sourceSpan,\n !includeInterrogativeSource,\n !includeInterrogativeSource,\n );\n if (score === 0) continue;\n if (hasContradictoryPolarity(candidate, sourceSpan)) {\n bestContradictedScore = Math.max(bestContradictedScore, score);\n } else {\n bestSupportedScore = Math.max(bestSupportedScore, score);\n }\n }\n }\n return bestSupportedScore > bestContradictedScore;\n}\nfunction isSourceGrounded(\n candidate: string,\n source: string,\n includeInterrogativeSource = false,\n): boolean {\n const candidateText = normalizeForExactMatch(candidate);\n const sourceText = source.normalize(\"NFKC\").trim();\n if (candidateText.length === 0 || sourceText.length === 0) return false;\n const hasSupportedExactMatch = sourceSentences(sourceText).some((sentence) => {\n const sentenceText = normalizeForExactMatch(sentence);\n const isExplanatoryLabel = sentenceText.startsWith(`${candidateText}:`)\n && !sentence.trim().endsWith(\"?\");\n if (!includeInterrogativeSource && isInterrogativeSourceSentence(sentence) && !isExplanatoryLabel) return false;\n if (omitsSourceDisjunction(candidateText, sentenceText)) return false;\n return containsExactTokenSequence(candidateText, sentenceText)\n && !hasContradictoryPolarity(candidateText, sentenceText);\n });\n if (hasSupportedExactMatch) return true;\n\n const clauses = candidateClauses(candidate);\n if (clauses.length > 1) {\n return clauses.every((clause) =>\n isSourceGroundedClause(clause, sourceText, includeInterrogativeSource));\n }\n return isSourceGroundedClause(candidate, sourceText, includeInterrogativeSource);\n}\n\nfunction buildEntitySupportSource(name: string, source: string): string {\n const nameTokens = normalizedEntityIdentifierTokens(name);\n if (nameTokens.length === 0) return \"\";\n return sourceSentences(source)\n .filter((sentence) => {\n const sentenceTokens = groundingLexemes(sentence)\n .filter(({ token }) => GROUNDING_STOPWORDS[token] !== true)\n .map(({ token, preserveTerminalS }) => stemToken(token, preserveTerminalS));\n return containsContiguousGroundingTokens(nameTokens, sentenceTokens);\n })\n .join(\" \");\n}\n\nfunction hasGroundedPredicateAnchor(candidate: string, sentence: string): boolean {\n const candidateTokens = normalizedGroundingTokenSequence(candidate);\n const sourceTokens = normalizedGroundingTokenSequence(sentence);\n const comparableCandidateTokens = GROUNDING_ROLE_SUBJECT_TOKENS.has(\n (candidateTokens[0] ?? \"\").replace(/^[\\u0000\\u0001]/u, \"\"),\n )\n ? candidateTokens.slice(1)\n : candidateTokens;\n if (comparableCandidateTokens.length < 2) return false;\n const subjectToken = comparableCandidateTokens[0];\n if (\n subjectToken === undefined\n || !sourceTokens.some((sourceToken) => areGroundingTokensCompatible(subjectToken, sourceToken))\n ) {\n return false;\n }\n const candidatePredicateTokens = comparableCandidateTokens.slice(1);\n const sharedPredicateTokens = candidatePredicateTokens.filter((token) =>\n sourceTokens.some((sourceToken) => areGroundingTokensCompatible(token, sourceToken)));\n const requiredSharedTokens = Math.min(2, candidatePredicateTokens.length);\n return sharedPredicateTokens.length >= requiredSharedTokens;\n}\nfunction hasGroundingAnchor(\n candidate: string,\n assertionSource: string,\n includeInterrogativeSource = false,\n requirePredicateSupport = false,\n): boolean {\n return sourceSentences(assertionSource).some((sentence) => {\n if (!includeInterrogativeSource && isInterrogativeSourceSentence(sentence)) return false;\n if (omitsSourceDisjunction(candidate, sentence)) return false;\n const sourceSpans = /\\b(?:rather\\s+than|instead\\s+of)\\b/iu.test(candidate)\n ? [sentence]\n : splitGroundingClauses([sentence], true);\n return sourceSpans.some((sourceSpan) => {\n const exactMatch = containsExactTokenSequence(candidate, sourceSpan)\n && !hasContradictoryPolarity(candidate, sourceSpan);\n if (exactMatch) return true;\n if (requirePredicateSupport && !hasGroundedPredicateAnchor(candidate, sourceSpan)) return false;\n return groundedTokenScore(candidate, sourceSpan) > 0\n || hasRoleNormalizedGrounding(candidate, sourceSpan);\n });\n });\n}\n\nfunction hasAnswerSupport(\n candidate: string,\n source: string,\n assertionSource: string,\n): boolean {\n const assertedAnswerSentences = new Set(\n sourceSentences(assertionSource)\n .filter((sentence) => {\n const answerToken = tokenSequence(sentence)[0];\n return answerToken === \"yes\" || answerToken === \"no\";\n })\n .map((sentence) => normalizeForExactMatch(sentence)),\n );\n if (assertedAnswerSentences.size === 0) return false;\n const sentences = sourceSentences(source);\n return sentences.some((sentence, index) => {\n const answerToken = tokenSequence(sentence)[0];\n if (answerToken !== \"yes\" && answerToken !== \"no\") return false;\n if (!assertedAnswerSentences.has(normalizeForExactMatch(sentence))) return false;\n const precedingSentence = sentences[index - 1];\n if (\n precedingSentence === undefined\n || !isInterrogativeSourceSentence(precedingSentence)\n || omitsSourceDisjunction(candidate, precedingSentence)\n || groundedTokenScore(candidate, precedingSentence) !== 1\n ) {\n return false;\n }\n const contradictoryPolarity = hasContradictoryPolarity(candidate, precedingSentence);\n return answerToken === \"yes\" ? !contradictoryPolarity : contradictoryPolarity;\n });\n}\n\nconst GROUNDING_ROLE_SUBJECT_TOKENS = new Set([\"assistant\", \"user\"]);\n\nfunction hasRoleNormalizedGrounding(candidate: string, source: string): boolean {\n const candidateTokens = groundingTokenSequence(candidate);\n if (!GROUNDING_ROLE_SUBJECT_TOKENS.has(\n (candidateTokens[0] ?? \"\").replace(/^[\\u0000\\u0001]/u, \"\"),\n )) return false;\n const claimTokens = candidateTokens.slice(1);\n if (claimTokens.length === 0) return false;\n\n return sourceSentences(source).some((sentence) => {\n if (isInterrogativeSourceSentence(sentence)) return false;\n const sourceTokens = groundingTokenSequence(sentence);\n const requiredSharedTokens = Math.min(GROUNDING_MIN_SHARED_TOKENS, claimTokens.length);\n let sourceIndex = 0;\n let sharedTokens = 0;\n for (const claimToken of claimTokens) {\n const matchingIndex = sourceTokens.findIndex(\n (sourceToken, index) =>\n index >= sourceIndex && areGroundingTokensCompatible(claimToken, sourceToken),\n );\n if (matchingIndex === -1) continue;\n sharedTokens += 1;\n sourceIndex = matchingIndex + 1;\n }\n return sharedTokens >= requiredSharedTokens\n && !hasContradictoryPolarity(candidate, sentence);\n });\n}\n\ninterface GroundingContext {\n source: string;\n assertionSource: string | undefined;\n allowRoleNormalization: boolean;\n fallbackSource?: string;\n fallbackAssertionSource?: string;\n}\n\nfunction resolveGroundingContext(\n candidate: string,\n source: string,\n assertionSource: string | undefined,\n roleAssertionSources: ExtractionGroundingRoleSources | undefined,\n): GroundingContext {\n const candidateRole = (groundingTokenSequence(candidate)[0] ?? \"\")\n .replace(/^[\\u0000\\u0001]/u, \"\");\n if (!GROUNDING_ROLE_SUBJECT_TOKENS.has(candidateRole)) {\n return { source, assertionSource, allowRoleNormalization: false };\n }\n if (roleAssertionSources === undefined) {\n return { source, assertionSource, allowRoleNormalization: true };\n }\n const roleSource = candidateRole === \"user\"\n ? roleAssertionSources.profile\n : roleAssertionSources.identity;\n if (roleSource === undefined) {\n return { source, assertionSource, allowRoleNormalization: true };\n }\n return {\n source: roleSource,\n assertionSource: roleSource,\n allowRoleNormalization: true,\n fallbackSource: source,\n fallbackAssertionSource: assertionSource,\n };\n}\n\nfunction selectGroundingContext(candidate: string, context: GroundingContext): GroundingContext {\n if (isGroundedCandidate(\n candidate,\n context.source,\n context.assertionSource,\n false,\n context.allowRoleNormalization,\n )) {\n return context;\n }\n if (\n context.fallbackSource === undefined\n || !hasExplicitRoleSubjectToken(\n (groundingTokenSequence(candidate)[0] ?? \"\").replace(/^[\\u0000\\u0001]/u, \"\"),\n sourceSentences(context.fallbackSource).map((sentence) => groundingTokenSequence(sentence)),\n )\n ) return context;\n const fallbackContext: GroundingContext = {\n source: context.fallbackSource,\n assertionSource: context.fallbackAssertionSource,\n allowRoleNormalization: false,\n };\n return isGroundedCandidate(\n candidate,\n fallbackContext.source,\n fallbackContext.assertionSource,\n false,\n fallbackContext.allowRoleNormalization,\n )\n ? fallbackContext\n : context;\n}\n\nfunction isGroundedCandidate(\n candidate: string,\n source: string,\n assertionSource: string | undefined,\n includeInterrogativeSource = false,\n allowRoleNormalization = false,\n): boolean {\n const allowInterrogativeSource = includeInterrogativeSource\n || (\n assertionSource !== undefined\n && normalizeForExactMatch(assertionSource) !== normalizeForExactMatch(source)\n );\n const sourceGrounded = isSourceGrounded(candidate, source, allowInterrogativeSource);\n const roleGrounded = allowRoleNormalization && hasRoleNormalizedGrounding(candidate, source);\n const candidateTokens = groundingTokenSequence(candidate);\n const roleNormalizedCandidate = allowRoleNormalization\n && GROUNDING_ROLE_SUBJECT_TOKENS.has(\n (candidateTokens[0] ?? \"\").replace(/^[\\u0000\\u0001]/u, \"\"),\n );\n if (roleNormalizedCandidate && !roleGrounded) return false;\n if (!sourceGrounded && !roleGrounded) return false;\n if (assertionSource === undefined) return true;\n const clauses = candidateClauses(candidate);\n const requirePredicateSupport = !includeInterrogativeSource\n && assertionSource !== undefined\n && normalizeForExactMatch(assertionSource) !== normalizeForExactMatch(source);\n return clauses.length > 0\n && (\n clauses.every((clause) =>\n hasGroundingAnchor(clause, assertionSource, includeInterrogativeSource, requirePredicateSupport))\n || hasAnswerSupport(candidate, source, assertionSource)\n );\n}\n\nfunction groundWithinQuoteAnchors(\n content: string,\n anchors: readonly QuoteAnchor[],\n sourceHas: TokenPool,\n): GroundingContext | undefined {\n const anchor = anchors.find((candidate) => isQuoteAnchoredClaim(content, candidate, sourceHas));\n if (anchor === undefined) return undefined;\n return {\n source: anchor.window,\n assertionSource: undefined,\n allowRoleNormalization: GROUNDING_ROLE_SUBJECT_TOKENS.has(\n (groundingTokenSequence(content)[0] ?? \"\").replace(/^[\\u0000\\u0001]/u, \"\"),\n ),\n };\n}\n\nfunction buildFactSupportSource(\n source: string,\n supportingSentences: ReadonlyArray<string>,\n): string {\n const sentences = sourceSentences(source);\n const selectedIndices = new Set<number>();\n for (const supportingSentence of supportingSentences) {\n const supportIndex = sentences.indexOf(supportingSentence);\n if (supportIndex < 0) continue;\n let endIndex = supportIndex;\n while (\n endIndex < sentences.length - 1\n && sentences[endIndex]!.trimEnd().endsWith(\";\")\n && /^(?:its|their|this|that|these|those)\\b/iu.test(\n sentences[endIndex + 1]!.trimStart(),\n )\n ) {\n endIndex += 1;\n }\n for (let index = supportIndex; index <= endIndex; index += 1) {\n selectedIndices.add(index);\n }\n }\n return [...selectedIndices]\n .sort((left, right) => left - right)\n .map((index) => sentences[index]!)\n .join(\" \");\n}\nfunction buildProcedureSupportSource(\n fact: ExtractionResult[\"facts\"][number],\n source: string,\n factSupportSource: string,\n): string {\n if (fact.category !== \"procedure\" || fact.procedureSteps === undefined) return factSupportSource;\n const parentSupportSentences = new Set(\n sourceSentences(factSupportSource).map((sentence) => normalizeForExactMatch(sentence)),\n );\n const parentGroundedSteps = fact.procedureSteps.filter((step) =>\n isGroundedCandidate(step.intent, factSupportSource, undefined, false),\n );\n if (parentGroundedSteps.length === 0) return factSupportSource;\n return sourceSentences(source)\n .filter((sentence) => {\n if (parentSupportSentences.has(normalizeForExactMatch(sentence))) return true;\n const sentenceTokens = tokenize(sentence);\n return parentGroundedSteps.some((step) =>\n [...tokenize(step.intent)].some((token) =>\n [...sentenceTokens].some((sourceToken) => areGroundingTokensCompatible(token, sourceToken)),\n ),\n );\n })\n .join(\" \");\n}\nfunction filterGroundedFact(\n fact: ExtractionResult[\"facts\"][number],\n source: string,\n assertionSource: string | undefined,\n roleAssertionSources: ExtractionGroundingRoleSources | undefined,\n eventTimeNormalizer: ((eventTime: string) => string) | undefined,\n spanMode: \"off\" | \"shadow\" | \"on\" = \"off\",\n anchors: readonly QuoteAnchor[],\n sourceHas: TokenPool,\n): ExtractionResult[\"facts\"][number] | undefined {\n // Span-materialized content (issue #2333) is \"frame: verbatim slice\". The\n // frame is generated deixis, so full-content gating would drop a verbatim\n // fact. Only on-mode facts whose content is that materialized shape may\n // fall back to the slice. Shadow stays zero-diff with off.\n const quote = typeof fact.quote === \"string\" ? fact.quote : \"\";\n const materializedPrefix = quote.length > 0 && fact.content.endsWith(quote) && fact.content !== quote\n ? fact.content.slice(0, fact.content.length - quote.length)\n : \"\";\n const embeddedQuote =\n spanMode === \"on\"\n && quote.trim().length > 0\n && (materializedPrefix.endsWith(\": \") || /[:—-]\\s$/.test(materializedPrefix))\n ? quote\n : undefined;\n const contentContext = selectGroundingContext(\n fact.content,\n resolveGroundingContext(fact.content, source, assertionSource, roleAssertionSources),\n );\n let gateContent = fact.content;\n let factContext = contentContext;\n let quoteAnchored = false;\n if (\n !isGroundedCandidate(\n fact.content,\n contentContext.source,\n contentContext.assertionSource,\n false,\n contentContext.allowRoleNormalization,\n )\n ) {\n const quoteContext = spanMode === \"on\"\n ? undefined\n : groundWithinQuoteAnchors(fact.content, anchors, sourceHas);\n if (quoteContext !== undefined) {\n factContext = quoteContext;\n quoteAnchored = true;\n } else {\n if (embeddedQuote === undefined) return undefined;\n gateContent = embeddedQuote;\n factContext = selectGroundingContext(\n gateContent,\n resolveGroundingContext(gateContent, source, assertionSource, roleAssertionSources),\n );\n if (!isGroundedCandidate(\n gateContent,\n factContext.source,\n factContext.assertionSource,\n false,\n factContext.allowRoleNormalization,\n )) return undefined;\n }\n }\n const factEventTime = fact.eventTime;\n const groundedFactEventTime = factEventTime === undefined\n ? undefined\n : eventTimeNormalizer?.(factEventTime) ?? factEventTime;\n // A quote-anchored claim is reworded from the quote and its turn, so no single\n // sentence grounds it; the anchor window is the support for its sub-fields.\n const factSupportingSentences = quoteAnchored ? [] : sourceSentences(factContext.assertionSource ?? factContext.source).filter(\n (sentence) =>\n isGroundedCandidate(\n gateContent,\n sentence,\n undefined,\n false,\n factContext.allowRoleNormalization,\n ),\n );\n const factSupportingSource = factEventTime === undefined\n ? factSupportingSentences[0]\n : factSupportingSentences.find((sentence) =>\n isGroundedCandidate(\n groundedFactEventTime ?? factEventTime,\n sentence,\n undefined,\n false,\n factContext.allowRoleNormalization,\n ),\n ) ?? factSupportingSentences[0];\n const eventTimeSource = factSupportingSource ?? factContext.source;\n const eventTimeAssertionSource = factSupportingSource === undefined\n ? factContext.assertionSource\n : undefined;\n\n const factSupportSource = quoteAnchored\n ? factContext.source\n : buildFactSupportSource(\n factContext.assertionSource ?? factContext.source,\n factSupportingSentences,\n );\n const groundedAttributes = fact.structuredAttributes\n ? Object.fromEntries(\n Object.entries(fact.structuredAttributes)\n .filter(([key, value]) =>\n isGroundedCandidate(\n `${key}: ${value}`,\n factSupportSource,\n undefined,\n false,\n factContext.allowRoleNormalization,\n ),\n ),\n )\n : undefined;\n const procedureGroundingSource = buildProcedureSupportSource(\n fact,\n factContext.assertionSource ?? factContext.source,\n factSupportSource,\n );\n const groundedProcedureSteps = fact.procedureSteps\n ? fact.procedureSteps.flatMap((step) => {\n if (!isGroundedCandidate(step.intent, procedureGroundingSource, undefined, false)) return [];\n const expectedOutcome = step.expectedOutcome\n && isGroundedCandidate(step.expectedOutcome, procedureGroundingSource, undefined, false)\n ? step.expectedOutcome\n : undefined;\n const toolCall = step.toolCall\n && isGroundedCandidate(step.toolCall.signature, procedureGroundingSource, undefined, false)\n ? step.toolCall\n : undefined;\n const {\n expectedOutcome: _expectedOutcome,\n toolCall: _toolCall,\n ...stepWithoutOptionalFields\n } = step;\n return [{\n ...stepWithoutOptionalFields,\n ...(expectedOutcome !== undefined ? { expectedOutcome } : {}),\n ...(toolCall !== undefined ? { toolCall } : {}),\n }];\n })\n : undefined;\n const groundedReasoningTrace = fact.reasoningTrace\n && fact.reasoningTrace.steps.length > 0\n && isGroundedCandidate(\n fact.reasoningTrace.finalAnswer,\n factContext.source,\n factContext.assertionSource,\n false,\n factContext.allowRoleNormalization,\n )\n && fact.reasoningTrace.steps.every((step) =>\n isGroundedCandidate(\n step.description,\n factContext.source,\n factContext.assertionSource,\n false,\n factContext.allowRoleNormalization,\n ),\n )\n ? {\n steps: fact.reasoningTrace.steps,\n finalAnswer: fact.reasoningTrace.finalAnswer,\n ...(fact.reasoningTrace.observedOutcome\n && isGroundedCandidate(\n fact.reasoningTrace.observedOutcome,\n factContext.source,\n factContext.assertionSource,\n false,\n factContext.allowRoleNormalization,\n )\n ? { observedOutcome: fact.reasoningTrace.observedOutcome }\n : {}),\n }\n : undefined;\n const groundedEventTime = groundedFactEventTime\n && isGroundedCandidate(groundedFactEventTime, eventTimeSource, eventTimeAssertionSource)\n ? factEventTime\n : undefined;\n const groundedEntityRef = fact.entityRef !== undefined\n && isGroundedEntityName(fact.entityRef, factSupportSource)\n ? fact.entityRef\n : undefined;\n const {\n entityRef: _entityRef,\n structuredAttributes: _structuredAttributes,\n procedureSteps: _procedureSteps,\n reasoningTrace: _reasoningTrace,\n eventTime: _eventTime,\n ...factWithoutGroundingFields\n } = fact;\n return {\n ...factWithoutGroundingFields,\n ...(groundedEntityRef !== undefined ? { entityRef: groundedEntityRef } : {}),\n ...(groundedAttributes && Object.keys(groundedAttributes).length > 0\n ? { structuredAttributes: groundedAttributes }\n : {}),\n ...(groundedProcedureSteps && groundedProcedureSteps.length > 0\n ? { procedureSteps: groundedProcedureSteps }\n : {}),\n ...(groundedReasoningTrace !== undefined ? { reasoningTrace: groundedReasoningTrace } : {}),\n ...(groundedEventTime !== undefined ? { eventTime: groundedEventTime } : {}),\n };\n}\n\nfunction filterGroundedEntity(\n entity: ExtractionResult[\"entities\"][number],\n source: string,\n assertionSource: string | undefined,\n anchorSupport?: (fact: string) => boolean,\n): ExtractionResult[\"entities\"][number] | undefined {\n const nameGrounded = isGroundedEntityName(entity.name, source);\n if (!nameGrounded && anchorSupport === undefined) return undefined;\n const entitySource = nameGrounded ? buildEntitySupportSource(entity.name, source) : \"\";\n const entityAssertionSource = !nameGrounded || assertionSource === undefined\n ? undefined\n : buildEntitySupportSource(entity.name, assertionSource);\n return filterEntityFacts(entity, (fact) =>\n (nameGrounded && isGroundedCandidate(fact, entitySource, entityAssertionSource))\n || anchorSupport?.(fact) === true);\n}\n\nfunction normalizedEntitySourceText(name: string): string {\n return normalizedEntityIdentifierTokens(name).join(\" \");\n}\n\nfunction isGroundedRelationship(\n relationship: NonNullable<ExtractionResult[\"relationships\"]>[number],\n source: string,\n assertionSource: string | undefined,\n): boolean {\n const sourceName = normalizedEntitySourceText(relationship.source);\n const targetName = normalizedEntitySourceText(relationship.target);\n const labelTokens = tokenize(relationship.label);\n if (sourceName.length === 0 || targetName.length === 0 || labelTokens.size === 0) return false;\n const relationText = `${sourceName} ${relationship.label} ${targetName}`;\n const hasCoherentSourceSpan = sourceSentences(source).some((sentence) => {\n if (isInterrogativeSourceSentence(sentence)) return false;\n return groundedTokenScore(relationText, sentence) === 1\n && !hasContradictoryPolarity(relationText, sentence);\n });\n return hasCoherentSourceSpan\n && isGroundedCandidate(relationText, source, assertionSource);\n}\nconst GROUNDING_TEMPORAL_WORDS = new Set([\n \"today\",\n \"yesterday\",\n \"tomorrow\",\n \"now\",\n \"recently\",\n \"earlier\",\n \"later\",\n \"soon\",\n \"morning\",\n \"afternoon\",\n \"evening\",\n \"tonight\",\n \"night\",\n \"noon\",\n \"midnight\",\n \"monday\",\n \"tuesday\",\n \"wednesday\",\n \"thursday\",\n \"friday\",\n \"saturday\",\n \"sunday\",\n \"january\",\n \"february\",\n \"march\",\n \"april\",\n \"may\",\n \"june\",\n \"july\",\n \"august\",\n \"september\",\n \"october\",\n \"november\",\n \"december\",\n \"q1\",\n \"q2\",\n \"q3\",\n \"q4\",\n]);\nconst GROUNDING_TEMPORAL_CLOCK_PATTERN = /\\b\\d{1,2}:\\d{2}(?:\\s*[ap]\\.?m\\.?)?\\b/iu;\nconst GROUNDING_TEMPORAL_DURATION_PATTERN = new RegExp(\n \"\\\\b(?:\\\\d+|one|two|three|four|five|six|seven|eight|nine|ten)\\\\s+\"\n + \"(?:seconds?|minutes?|hours?|days?|weeks?|months?|quarters?|years?)\\\\b\",\n \"iu\",\n);\n\nfunction isWhenQuestion(question: string): boolean {\n return /^(?:when|what\\s+(?:time|date)|which\\s+day)\\b/iu.test(question.trim());\n}\nfunction isWhyQuestion(question: string): boolean {\n return /^why\\b/iu.test(question.trim());\n}\n\nfunction hasCausalAnswerEvidence(question: string, sentence: string): boolean {\n if (!isWhyQuestion(question)) return true;\n return /\\b(?:because|since|due\\s+to|owing\\s+to|thanks\\s+to|therefore|thus|hence|so)\\b/iu.test(\n sentence,\n );\n}\n\nfunction hasTemporalAnswerEvidence(question: string, sentence: string): boolean {\n if (!isWhenQuestion(question)) return true;\n return groundingLexemes(sentence).some(({ token }) =>\n GROUNDING_TEMPORAL_WORDS.has(token) || /^(?:19|20)\\d{2}$/u.test(token),\n )\n || GROUNDING_TEMPORAL_CLOCK_PATTERN.test(sentence)\n || GROUNDING_TEMPORAL_DURATION_PATTERN.test(sentence);\n}\n\n\nfunction isUnknownAnswerSentence(sentence: string): boolean {\n return /\\b(?:unknown|unclear|unsure|unresolved|unanswered|not\\s+(?:known|sure|available)|don't\\s+know|do\\s+not\\s+know|no\\s+idea|pending)\\b/iu\n .test(sentence);\n}\n\nfunction isYesNoAnswer(sentence: string): boolean {\n return /^(?:yes|no)(?:[.!?]|,\\s*(?:absolutely|definitely|indeed|exactly|correct|of\\s+course|use\\s+that|do\\s+that)[.!?]?)?$/iu\n .test(sentence.trim());\n}\n\nconst GROUNDING_WH_OBJECT_QUESTION_PATTERN = new RegExp(\n \"^(?:(?:what|which)(?:\\\\s+.+?)?|who|whom)\\\\s+\"\n + \"(?:is|are|was|were|do|does|did|can|could|will|would|should|has|have|had)\\\\s+\"\n + \"(.+?)\\\\??$\",\n \"iu\",\n);\n\nfunction hasWhAnswerRoleAlignment(question: string, sentence: string): boolean {\n const normalizedQuestion = question.trim();\n const objectQuestionMatch = GROUNDING_WH_OBJECT_QUESTION_PATTERN.exec(normalizedQuestion);\n const sourceTokens = normalizedGroundingTokenSequence(sentence);\n if (objectQuestionMatch !== null) {\n const questionBodyLexemes = groundingLexemes(objectQuestionMatch[1] ?? \"\");\n const predicateIndex = questionBodyLexemes.findIndex(({ isPredicate }) => isPredicate);\n if (predicateIndex < 1) return false;\n const subjectTokens = groundingTokenSequence(\n questionBodyLexemes.slice(0, predicateIndex).map(({ surface }) => surface).join(\" \"),\n );\n const predicateTokens = groundingTokenSequence(\n questionBodyLexemes.slice(predicateIndex).map(({ surface }) => surface).join(\" \"),\n );\n if (subjectTokens.length === 0 || predicateTokens.length === 0) return false;\n let sourceIndex = 0;\n for (const token of [...subjectTokens, ...predicateTokens]) {\n const matchedIndex = sourceTokens.findIndex(\n (sourceToken, index) =>\n index >= sourceIndex && areGroundingTokensCompatible(token, sourceToken),\n );\n if (matchedIndex === -1) return false;\n sourceIndex = matchedIndex + 1;\n }\n return true;\n }\n\n const subjectQuestionMatch = /^(?:who|what)\\s+([^\\s?]+)\\s+(.+?)\\??$/iu.exec(normalizedQuestion);\n if (subjectQuestionMatch === null) return true;\n const predicateTokens = groundingTokenSequence(subjectQuestionMatch[1] ?? \"\");\n const objectTokens = groundingTokenSequence(subjectQuestionMatch[2] ?? \"\");\n if (predicateTokens.length === 0 || objectTokens.length === 0) return true;\n const predicateStart = sourceTokens.findIndex((sourceToken) =>\n areGroundingTokensCompatible(predicateTokens[0]!, sourceToken));\n if (predicateStart === -1) return false;\n let sourceIndex = predicateStart + predicateTokens.length;\n for (const objectToken of objectTokens) {\n const objectIndex = sourceTokens.findIndex(\n (sourceToken, index) =>\n index >= sourceIndex && areGroundingTokensCompatible(objectToken, sourceToken),\n );\n if (objectIndex === -1) return false;\n sourceIndex = objectIndex + 1;\n }\n return true;\n}\n\nfunction isQuestionAnsweredBySource(\n question: string,\n source: string,\n assertionSource: string | undefined,\n): boolean {\n const questionTokens = tokenize(question);\n if (questionTokens.size === 0) return false;\n const isYesNoQuestion = /^(?:is|are|am|was|were|do|does|did|can|could|will|would|should|has|have|had)\\b/iu\n .test(question.trim());\n const assertedSentences = new Set(sourceSentences(assertionSource ?? source).map((sentence) => normalizeForExactMatch(sentence)));\n const sentences = sourceSentences(source);\n return sentences.some((sentence, index) => {\n if (!assertedSentences.has(normalizeForExactMatch(sentence))) return false;\n if (isInterrogativeSourceSentence(sentence)) return false;\n if (isYesNoAnswer(sentence)) {\n const precedingSentence = sentences[index - 1];\n return precedingSentence !== undefined\n && isInterrogativeSourceSentence(precedingSentence)\n && groundedTokenScore(question, precedingSentence) === 1;\n }\n if (isUnknownAnswerSentence(sentence)) return false;\n const score = groundedTokenScore(question, sentence, false);\n if (score !== 1) return false;\n const sentenceTokens = tokenize(sentence);\n const hasAnswerToken = [...sentenceTokens].some((token) => !questionTokens.has(token));\n return (isYesNoQuestion || hasAnswerToken)\n && hasTemporalAnswerEvidence(question, sentence)\n && hasCausalAnswerEvidence(question, sentence)\n && hasWhAnswerRoleAlignment(question, sentence);\n });\n}\n\nfunction groundQuestion(\n question: ExtractionResult[\"questions\"][number],\n source: string,\n assertionSource: string | undefined,\n): ExtractionResult[\"questions\"][number] | undefined {\n if (isQuestionAnsweredBySource(question.question, source, assertionSource)) return undefined;\n if (!isGroundedCandidate(question.question, source, assertionSource, true)) return undefined;\n const normalizedContext = question.context.trim();\n if (\n normalizedContext.length > 0\n && !isGroundedCandidate(normalizedContext, assertionSource ?? source, undefined, false)\n ) {\n return { ...question, context: \"\" };\n }\n return question;\n}\n\nfunction isRoleGroundedCandidate(\n candidate: string,\n source: string,\n assertionSource: string | undefined,\n roleAssertionSources: ExtractionGroundingRoleSources | undefined,\n): boolean {\n const context = selectGroundingContext(\n candidate,\n resolveGroundingContext(candidate, source, assertionSource, roleAssertionSources),\n );\n return isGroundedCandidate(\n candidate,\n context.source,\n context.assertionSource,\n false,\n context.allowRoleNormalization,\n );\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 if (source.trim().length === 0) {\n return {\n ...result,\n facts: [],\n profileUpdates: [],\n entities: [],\n questions: [],\n ...(result.relationships !== undefined ? { relationships: [] } : {}),\n identityReflection: undefined,\n };\n }\n\n const quoteSource = assertionSource ?? source;\n const keptAnchors: QuoteAnchor[] = [];\n const sourceHas = tokenPool(\n result.facts.some((fact) => typeof fact.quote === \"string\") ? tokenize(quoteSource) : new Set(),\n );\n const facts = result.facts.flatMap((fact) => {\n const anchors = quoteAnchors(fact.quote, quoteSource, quoteTransform);\n const grounded = filterGroundedFact(\n fact,\n source,\n assertionSource,\n roleAssertionSources,\n eventTimeNormalizer,\n spanMode,\n anchors,\n sourceHas,\n );\n if (grounded === undefined) return [];\n keptAnchors.push(...anchors);\n return [grounded];\n });\n const profileUpdates = result.profileUpdates.filter((update) =>\n isRoleGroundedCandidate(update, source, assertionSource, roleAssertionSources),\n );\n const entities = result.entities.flatMap((entity) => {\n const anchorSupport = quoteAnchoredEntitySupport(entity, keptAnchors, sourceHas);\n const grounded = filterGroundedEntity(entity, source, assertionSource, anchorSupport);\n return grounded === undefined ? [] : [grounded];\n });\n const questions = result.questions.flatMap((question) => {\n const grounded = groundQuestion(question, source, assertionSource);\n return grounded === undefined ? [] : [grounded];\n });\n const relationships = result.relationships?.filter((relationship) =>\n isGroundedRelationship(relationship, source, assertionSource)\n || isQuoteAnchoredRelationship(relationship, keptAnchors, sourceHas),\n );\n const identityReflection = result.identityReflection\n && isRoleGroundedCandidate(\n result.identityReflection,\n source,\n assertionSource,\n roleAssertionSources,\n )\n ? result.identityReflection\n : undefined;\n\n return {\n ...result,\n facts,\n profileUpdates,\n entities,\n questions,\n ...(result.relationships !== undefined ? { relationships } : {}),\n ...(identityReflection !== undefined ? { identityReflection } : { identityReflection: undefined }),\n };\n}\n"],"mappings":"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","names":["predicateTokens","sourceIndex"]}
|