@remnic/core 9.69.22 → 9.69.24
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/abstraction-nodes.js +3 -2
- package/dist/access-admin-ops-surface.d.ts +14 -12
- package/dist/access-admin-ops-surface.js +94 -91
- package/dist/access-authorization-probe.d.ts +14 -12
- package/dist/access-authorization-probe.js +95 -92
- package/dist/access-boundary.d.ts +14 -12
- package/dist/access-boundary.js +94 -91
- package/dist/access-citation-namespace.js +3 -3
- package/dist/access-cli.js +200 -195
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +2 -1
- package/dist/access-extraction-force-flush.d.ts +14 -12
- package/dist/access-extraction-force-flush.js +94 -91
- package/dist/access-health-types.d.ts +2 -1
- package/dist/access-http-briefing.d.ts +156 -0
- package/dist/access-http-briefing.js +233 -0
- package/dist/access-http-lcm-compaction.d.ts +14 -12
- package/dist/access-http-lifecycle-flush.d.ts +14 -12
- package/dist/access-http-offline-stream.d.ts +14 -12
- package/dist/access-http-query.d.ts +3 -2
- package/dist/access-http-query.js +96 -93
- package/dist/access-http.d.ts +15 -13
- package/dist/access-http.js +119 -114
- package/dist/access-identity-continuity-surface.d.ts +12 -10
- package/dist/access-identity-continuity-surface.js +94 -91
- package/dist/access-lcm-surface.d.ts +14 -12
- package/dist/access-lcm-surface.js +94 -91
- package/dist/access-mcp.d.ts +14 -12
- package/dist/access-mcp.js +105 -101
- package/dist/access-memory-search-fanout.d.ts +3 -2
- package/dist/{access-namespace-preflight-BMHhxoL9.d.ts → access-namespace-preflight-BsvmyENS.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +4 -3
- package/dist/access-namespace-preflight.js +94 -91
- package/dist/access-observe-transcript.d.ts +12 -10
- package/dist/access-observe-write-surface.d.ts +14 -12
- package/dist/access-observe-write-surface.js +94 -91
- package/dist/access-offline-manifest.d.ts +12 -10
- package/dist/access-offline-manifest.js +15 -15
- package/dist/access-operations-batch.js +99 -95
- package/dist/access-operations.d.ts +14 -12
- package/dist/access-operations.js +104 -100
- package/dist/access-recall-concurrency.d.ts +14 -12
- package/dist/access-recall-concurrency.js +94 -91
- package/dist/access-recall-response.d.ts +14 -12
- package/dist/access-recall-response.js +94 -91
- package/dist/access-recall-surface.d.ts +14 -12
- package/dist/access-recall-surface.js +94 -91
- package/dist/access-schema.js +8 -7
- package/dist/{access-service-BlsNXFwx.d.ts → access-service-DWdY9Mlk.d.ts} +7 -7
- package/dist/access-service-helpers.d.ts +14 -12
- package/dist/access-service.d.ts +14 -12
- package/dist/access-service.js +94 -91
- package/dist/access-surface-catalog.d.ts +14 -12
- package/dist/access-surface-catalog.js +97 -93
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +4 -3
- package/dist/action-confidence.d.ts +2 -1
- package/dist/active-memory-bridge.d.ts +2 -1
- package/dist/active-recall.d.ts +2 -1
- package/dist/active-recall.js +16 -13
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/ambient-provenance.d.ts +2 -1
- package/dist/artifact-search.d.ts +2 -1
- package/dist/{auto-sync-GRUJFD2F.js → auto-sync-WNGG2GC2.js} +9 -9
- package/dist/behavior-learner.d.ts +2 -1
- package/dist/behavior-signals.d.ts +2 -1
- package/dist/bootstrap.d.ts +12 -10
- package/dist/briefing-window.d.ts +3 -2
- package/dist/briefing.d.ts +3 -2
- package/dist/briefing.js +36 -36
- package/dist/buffer-surprise-report.d.ts +2 -1
- package/dist/buffer-turn-helpers.d.ts +2 -1
- package/dist/buffer.d.ts +3 -2
- package/dist/buffer.js +13 -13
- package/dist/bulk-import/index.d.ts +4 -3
- package/dist/calibration.d.ts +2 -1
- package/dist/calibration.js +2 -1
- package/dist/calibration.js.map +1 -1
- package/dist/capabilities.d.ts +2 -1
- package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
- package/dist/{capsule-merge-SEHERWWP.js → capsule-merge-IPG4IOFP.js} +5 -5
- package/dist/{catalog-C1qHsGew.d.ts → catalog-CDZLyiXL.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +2 -1
- package/dist/causal-behavior.js +4 -3
- package/dist/causal-behavior.js.map +1 -1
- package/dist/causal-chain.js +4 -3
- package/dist/causal-consolidation.d.ts +2 -1
- package/dist/causal-consolidation.js +42 -42
- package/dist/causal-retrieval.js +4 -3
- package/dist/causal-retrieval.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +5 -2
- package/dist/causal-trajectory-graph.js +6 -2
- package/dist/causal-trajectory-graph.js.map +1 -1
- package/dist/causal-trajectory.js +3 -2
- package/dist/{chunk-KTVSPFCQ.js → chunk-22FVR2KE.js} +2 -2
- package/dist/{chunk-7Y5V3LAP.js → chunk-27QVNSQ3.js} +2 -2
- package/dist/{chunk-R7LY4YKF.js → chunk-2EKJDQZB.js} +2 -2
- package/dist/{chunk-FCATYKQA.js → chunk-2IOHTUP3.js} +263 -13
- package/dist/chunk-2IOHTUP3.js.map +1 -0
- package/dist/{chunk-HOUST5UX.js → chunk-2ITE4C2Z.js} +2 -2
- package/dist/{chunk-JOYC4RYC.js → chunk-2JVJ7UHC.js} +2 -2
- package/dist/{chunk-X2NFFBTO.js → chunk-2L5FSNPC.js} +7 -7
- package/dist/{chunk-DUAJKRR2.js → chunk-2SGLMP2E.js} +2 -2
- package/dist/{chunk-6FUMA6AA.js → chunk-2Z4GS5E6.js} +2 -2
- package/dist/{chunk-G6MXN2G5.js → chunk-37KUQPX4.js} +6 -6
- package/dist/{chunk-DDQQY2E3.js → chunk-3BTFBQLO.js} +7 -7
- package/dist/chunk-3BTFBQLO.js.map +1 -0
- package/dist/{chunk-UR6PBX2J.js → chunk-3K7V3HE6.js} +35 -60
- package/dist/chunk-3K7V3HE6.js.map +1 -0
- package/dist/{chunk-WKAXBXVA.js → chunk-3QQTXYZ6.js} +2 -2
- package/dist/{chunk-DJUKBGAD.js → chunk-46EST7JO.js} +5 -5
- package/dist/chunk-46EST7JO.js.map +1 -0
- package/dist/{chunk-4ZWCQJNM.js → chunk-46WM6JX2.js} +5 -5
- package/dist/{chunk-CASWJ2HM.js → chunk-46ZPIGWI.js} +3 -3
- package/dist/{chunk-HTIIXNJQ.js → chunk-4FIH6MPS.js} +6 -3
- package/dist/chunk-4FIH6MPS.js.map +1 -0
- package/dist/{chunk-MCA2X4WH.js → chunk-4IHBN6WU.js} +2 -2
- package/dist/{chunk-W7IGLX4G.js → chunk-4O6WRBGE.js} +7 -7
- package/dist/chunk-4O6WRBGE.js.map +1 -0
- package/dist/{chunk-FB7LAJQM.js → chunk-4TKJGOCJ.js} +2 -2
- package/dist/{chunk-H7BZBSP6.js → chunk-52II7PB6.js} +4 -4
- package/dist/{chunk-N4Y5T6VD.js → chunk-54WHLA65.js} +4 -4
- package/dist/chunk-56Y6EKZN.js +24 -0
- package/dist/chunk-56Y6EKZN.js.map +1 -0
- package/dist/{chunk-YVLENSNS.js → chunk-5ATKSPEQ.js} +2 -2
- package/dist/{chunk-OLT3YTDH.js → chunk-5FAGCOZD.js} +37 -24
- package/dist/chunk-5FAGCOZD.js.map +1 -0
- package/dist/{chunk-ZVZHG7AI.js → chunk-5UBH37SL.js} +3 -3
- package/dist/{chunk-N3WZU76A.js → chunk-66OJSCI6.js} +2 -2
- package/dist/{chunk-D35XLYQ7.js → chunk-6CVNSDCZ.js} +11 -11
- package/dist/{chunk-KA2HZCMG.js → chunk-6NXSYYGP.js} +2 -2
- package/dist/{chunk-2HIJHXB3.js → chunk-6WHJ2EAB.js} +2 -2
- package/dist/{chunk-ZZM476NV.js → chunk-6XL73HQ4.js} +4 -4
- package/dist/{chunk-EJ5RKUXW.js → chunk-AQ7SYDVO.js} +2 -2
- package/dist/{chunk-2Z3DG5CQ.js → chunk-B3O3IRZN.js} +2 -2
- package/dist/{chunk-P77QX3ID.js → chunk-B6O2YLUR.js} +21 -20
- package/dist/chunk-B6O2YLUR.js.map +1 -0
- package/dist/{chunk-RACZB5HT.js → chunk-BD7JTBYP.js} +4 -4
- package/dist/{chunk-I762GW7V.js → chunk-BLJWYCNO.js} +5 -5
- package/dist/{chunk-ACPCA4NO.js → chunk-BMWN7B3Y.js} +6 -6
- package/dist/chunk-BMWN7B3Y.js.map +1 -0
- package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-KK66P5GQ.js → chunk-C553ZTLF.js} +46 -48
- package/dist/chunk-C553ZTLF.js.map +1 -0
- package/dist/{chunk-GCASGYIO.js → chunk-C7HJ3NEI.js} +2 -2
- package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
- package/dist/{chunk-WVGXCBOC.js → chunk-D5F7TKMH.js} +2 -2
- package/dist/chunk-DGS34QSY.js +141 -0
- package/dist/chunk-DGS34QSY.js.map +1 -0
- package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
- package/dist/{chunk-2OXIPF3A.js → chunk-DZD3WGCD.js} +4 -4
- package/dist/{chunk-UMEOXLIZ.js → chunk-E2P7TZTF.js} +5 -5
- package/dist/{chunk-6FC3IZ26.js → chunk-EBA5DA77.js} +2 -2
- package/dist/{chunk-N7JK2RKG.js → chunk-EOQ6FSQP.js} +2 -2
- package/dist/chunk-EUT2WCWS.js +54 -0
- package/dist/chunk-EUT2WCWS.js.map +1 -0
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-XDMI5VKE.js → chunk-FVOP3NT7.js} +2 -2
- package/dist/{chunk-NRLELHAY.js → chunk-G7NYVKD6.js} +2 -2
- package/dist/{chunk-B3W7GWQB.js → chunk-GHTSNGBZ.js} +2 -2
- package/dist/chunk-GKCXTSFF.js +17 -0
- package/dist/chunk-GKCXTSFF.js.map +1 -0
- package/dist/{chunk-LUDBXTBJ.js → chunk-H272ZPQ3.js} +5 -5
- package/dist/{chunk-SN4JXNLL.js → chunk-H3TKENU4.js} +2 -2
- package/dist/{chunk-4HYNMLT6.js → chunk-H4SEGIZY.js} +2 -2
- package/dist/{chunk-ACZN5ZXD.js → chunk-H54VWRPS.js} +13 -13
- package/dist/{chunk-HTP6XRUI.js → chunk-HM7RHKS4.js} +2 -2
- package/dist/{chunk-Z3SQEEB6.js → chunk-HWLIMQE2.js} +2 -2
- package/dist/{chunk-NQFCLAYT.js → chunk-ICKJ52PE.js} +99 -322
- package/dist/chunk-ICKJ52PE.js.map +1 -0
- package/dist/{chunk-2QSZNTDO.js → chunk-JBPKEARU.js} +7 -7
- package/dist/{chunk-DK6GMO6D.js → chunk-JEC4DVM3.js} +16 -16
- package/dist/chunk-JEC4DVM3.js.map +1 -0
- package/dist/{chunk-ET2CNMLD.js → chunk-JN72EPOE.js} +2 -2
- package/dist/{chunk-U62OK7BB.js → chunk-JPKK466T.js} +188 -21
- package/dist/chunk-JPKK466T.js.map +1 -0
- package/dist/{chunk-JCCWJHOP.js → chunk-JYZSRNR7.js} +2 -2
- package/dist/{chunk-7D6HXODY.js → chunk-K7724CH2.js} +2 -2
- package/dist/{chunk-X33MJFD2.js → chunk-KAXCYM66.js} +3 -3
- package/dist/{chunk-7RRUHJPG.js → chunk-KB2G2I6Q.js} +3 -3
- package/dist/{chunk-ZXBTTMGZ.js → chunk-KEF46KL2.js} +5 -5
- package/dist/{chunk-5UZXUTVO.js → chunk-KNA3BXXL.js} +6 -2
- package/dist/chunk-KNA3BXXL.js.map +1 -0
- package/dist/{chunk-UWTDARPF.js → chunk-KTWG7CNY.js} +6 -6
- package/dist/{chunk-XQYTSZW3.js → chunk-L7Z57SID.js} +6 -6
- package/dist/{chunk-JMAG7WZ7.js → chunk-LO4UKPKX.js} +3 -3
- package/dist/{chunk-LDWIPYJ6.js → chunk-LS2FHUML.js} +3 -3
- package/dist/{chunk-GDB4J2H3.js → chunk-MPC7TYTZ.js} +2 -2
- package/dist/{chunk-2GF27PGH.js → chunk-MRPOZBJC.js} +3 -3
- package/dist/{chunk-BR3OOQZQ.js → chunk-MWN6QEI2.js} +2 -2
- package/dist/{chunk-NZGO2GKL.js → chunk-MY5EDR46.js} +4 -4
- package/dist/{chunk-LCMUZDBZ.js → chunk-N3ZOP7KC.js} +3 -3
- package/dist/{chunk-TVW4C7PV.js → chunk-NB3LRY4T.js} +6 -6
- package/dist/{chunk-QJCWK2A7.js → chunk-ND6IQGSZ.js} +2 -2
- package/dist/{chunk-NOB2T2FC.js → chunk-NHLLKEKK.js} +2 -2
- package/dist/{chunk-7GSSHAXC.js → chunk-NLYVH66G.js} +6 -6
- package/dist/chunk-NLYVH66G.js.map +1 -0
- package/dist/{chunk-EJIWBTVM.js → chunk-O6ZNNVSP.js} +2 -2
- package/dist/{chunk-AG46P24C.js → chunk-OB3XMWX5.js} +4 -4
- package/dist/{chunk-NYRB7BKY.js → chunk-OEYZXDQI.js} +6 -6
- package/dist/chunk-OEYZXDQI.js.map +1 -0
- package/dist/{chunk-46QMN7I7.js → chunk-PAZY2ZKP.js} +6 -6
- package/dist/{chunk-EF4JUM55.js → chunk-PX4UMA5Z.js} +2 -2
- package/dist/chunk-QLK3SL7Q.js +242 -0
- package/dist/chunk-QLK3SL7Q.js.map +1 -0
- package/dist/{chunk-GGYDJJBO.js → chunk-QOOBICJF.js} +5 -5
- package/dist/chunk-QOOBICJF.js.map +1 -0
- package/dist/{chunk-NNZFPYYX.js → chunk-R7QY5ZVB.js} +2 -2
- package/dist/{chunk-RO2X2EYM.js → chunk-R7RTXEYG.js} +2 -2
- package/dist/{chunk-3LJPSRAN.js → chunk-RBCQVOVJ.js} +3 -3
- package/dist/{chunk-N4F7ZSSG.js → chunk-RC5DXXWC.js} +2 -2
- package/dist/{chunk-VLAQV4HT.js → chunk-RJYJ7KR7.js} +1636 -611
- package/dist/chunk-RJYJ7KR7.js.map +1 -0
- package/dist/{chunk-5CF2R4NS.js → chunk-RKBLRTNT.js} +2 -2
- package/dist/{chunk-5QZR2RA3.js → chunk-ROBHL3GL.js} +2 -2
- package/dist/{chunk-D5ZNOKR7.js → chunk-S7T2TY65.js} +3 -3
- package/dist/{chunk-C2JCVZWX.js → chunk-SCXURCVT.js} +25 -13
- package/dist/chunk-SCXURCVT.js.map +1 -0
- package/dist/{chunk-3LADWWMA.js → chunk-SJDQ5RSN.js} +3 -3
- package/dist/{chunk-45XVII3J.js → chunk-SMWTZLHE.js} +99 -89
- package/dist/{chunk-45XVII3J.js.map → chunk-SMWTZLHE.js.map} +1 -1
- package/dist/{chunk-XOQGUGJL.js → chunk-SO7SV523.js} +1 -1
- package/dist/{chunk-XOQGUGJL.js.map → chunk-SO7SV523.js.map} +1 -1
- package/dist/{chunk-CHWUICVY.js → chunk-SV4Z2S67.js} +4 -4
- package/dist/{chunk-JHP45LO5.js → chunk-SVXJLDDC.js} +9 -7
- package/dist/{chunk-JHP45LO5.js.map → chunk-SVXJLDDC.js.map} +1 -1
- package/dist/{chunk-SEF4IOFE.js → chunk-SWIKABKI.js} +2 -2
- package/dist/{chunk-JRRQ747T.js → chunk-TBXAY2SS.js} +13 -13
- package/dist/{chunk-J6A3CX5N.js → chunk-TG3FAM2S.js} +33 -8
- package/dist/{chunk-J6A3CX5N.js.map → chunk-TG3FAM2S.js.map} +1 -1
- package/dist/{chunk-XZBXINXZ.js → chunk-TNSCIPBQ.js} +4 -4
- package/dist/{chunk-S37NN23M.js → chunk-TVEONGBU.js} +2 -2
- package/dist/{chunk-5RPMTFB6.js → chunk-TWF35IC6.js} +3 -3
- package/dist/{chunk-BZTJEILZ.js → chunk-U6N5IBVY.js} +2 -2
- package/dist/{chunk-7TUB6JWA.js → chunk-UCKYTA2T.js} +3 -3
- package/dist/{chunk-PPOT6SPR.js → chunk-UNNPNBR2.js} +11 -11
- package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-J2R275FN.js → chunk-VVX5PZFS.js} +4 -4
- package/dist/{chunk-ME35HVDJ.js → chunk-VYCOJKSX.js} +2 -2
- package/dist/{chunk-F5UWQ4LX.js → chunk-W24T5YMW.js} +2 -2
- package/dist/{chunk-HDQUQBPW.js → chunk-W3K3HITK.js} +2 -2
- package/dist/{chunk-GDASG7NC.js → chunk-W4F3C7N7.js} +2 -2
- package/dist/{chunk-LFK623SF.js → chunk-WJHGDE7X.js} +5 -5
- package/dist/{chunk-DP4EBV7C.js → chunk-WMLEPWMO.js} +16 -16
- package/dist/chunk-WMLEPWMO.js.map +1 -0
- package/dist/{chunk-3Q6RD76J.js → chunk-WQZZDN5M.js} +5 -5
- package/dist/{chunk-ZJWDWPX6.js → chunk-X5K5TAQZ.js} +4 -4
- package/dist/{chunk-ZL3XX5LW.js → chunk-XM24CDZX.js} +3 -3
- package/dist/{chunk-JTWZKNUH.js → chunk-XOVKXJEP.js} +3 -3
- package/dist/{chunk-OGTKQ5MJ.js → chunk-XSGUMQQQ.js} +62 -50
- package/dist/chunk-XSGUMQQQ.js.map +1 -0
- package/dist/{chunk-X5YYSAZX.js → chunk-XUE46UYW.js} +3 -3
- package/dist/{chunk-DJORULH3.js → chunk-YRLHEEQT.js} +2 -2
- package/dist/{chunk-TA7UZZMW.js → chunk-Z3O53WZR.js} +2 -2
- package/dist/{chunk-4LG4CPOC.js → chunk-Z6COGHHN.js} +2 -2
- package/dist/{chunk-RE3H6Y2X.js → chunk-ZIW5JVRM.js} +2 -2
- package/dist/{cli-BNtvR-nU.d.ts → cli-DD0P-lu8.d.ts} +6 -6
- package/dist/cli.d.ts +16 -14
- package/dist/cli.js +154 -149
- package/dist/coding/export-okf-codegraph.d.ts +2 -1
- package/dist/coding/export-okf-codegraph.js +37 -37
- package/dist/coding/pre-action-gate.d.ts +2 -1
- package/dist/coding/pre-action-gate.js +4 -3
- package/dist/commitment-ledger.js +3 -2
- package/dist/compounding/engine.d.ts +3 -2
- package/dist/compounding/engine.js +37 -37
- package/dist/compounding/preference-consolidator.d.ts +2 -1
- package/dist/compression-optimizer.d.ts +2 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.js +16 -13
- package/dist/connectors/codex-materialize-runner.d.ts +2 -1
- package/dist/connectors/codex-materialize-runner.js +38 -38
- package/dist/connectors/codex-materialize.d.ts +2 -1
- package/dist/connectors/codex-materialize.js +4 -4
- package/dist/connectors/index.d.ts +2 -1
- package/dist/connectors/index.js +38 -38
- package/dist/consolidation-provenance-check.d.ts +3 -2
- package/dist/consolidation-provenance-check.js +4 -4
- package/dist/consolidation-undo.d.ts +3 -2
- package/dist/consolidation-undo.js +3 -3
- package/dist/contradiction/index.d.ts +4 -3
- package/dist/contradiction/index.js +9 -9
- package/dist/converge-config.d.ts +2 -1
- package/dist/convergence-refresh.d.ts +3 -2
- package/dist/convergence-refresh.js +38 -38
- package/dist/conversation-index/backend.d.ts +2 -1
- package/dist/conversation-index/chunker.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- package/dist/conversation-index/indexer.d.ts +2 -1
- package/dist/conversation-index/search.d.ts +2 -1
- package/dist/corpus-watermark.d.ts +2 -1
- package/dist/corpus-watermark.js +38 -38
- package/dist/cross-lingual-recall.d.ts +2 -1
- package/dist/cue-anchors.js +4 -3
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +2 -1
- package/dist/deep-recall-http-glue.d.ts +14 -12
- package/dist/deep-recall-http-glue.js +9 -8
- package/dist/deep-recall-mcp-tools.d.ts +14 -12
- package/dist/deep-recall-policy-llm.d.ts +2 -1
- package/dist/deep-recall-seeds.d.ts +2 -1
- package/dist/deep-recall.js +2 -2
- package/dist/delinearize.d.ts +2 -1
- package/dist/dependency-propagation-config.d.ts +2 -1
- package/dist/{dependency-propagation-delivery-DjpUlhLi.d.ts → dependency-propagation-delivery-CQPCu0o5.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +2 -1
- package/dist/direct-answer.d.ts +2 -1
- package/dist/embedding-fallback.d.ts +2 -1
- package/dist/enrichment/index.d.ts +2 -1
- package/dist/entity-origin-fields.d.ts +2 -1
- package/dist/entity-retrieval.d.ts +3 -2
- package/dist/entity-retrieval.js +36 -36
- package/dist/entity-schema.d.ts +2 -1
- package/dist/episodic-context.d.ts +2 -1
- package/dist/eval-trajectory-contracts.d.ts +2 -1
- package/dist/eval-trajectory-store.d.ts +2 -1
- package/dist/eval-trajectory-store.js +4 -3
- package/dist/eval-trajectory.d.ts +2 -1
- package/dist/eval-trajectory.js +4 -3
- package/dist/evals.js +3 -2
- package/dist/event-order-recall.js +2 -2
- package/dist/explicit-capture.d.ts +12 -10
- package/dist/explicit-capture.js +10 -10
- package/dist/external-wiki-access.d.ts +14 -12
- package/dist/external-wiki-access.js +95 -92
- package/dist/external-wiki-collection-registration.d.ts +2 -1
- package/dist/external-wiki-collection.d.ts +2 -1
- package/dist/external-wiki-mcp-tools.d.ts +14 -12
- package/dist/extraction-error-classification.d.ts +2 -1
- package/dist/extraction-faithfulness.d.ts +2 -1
- package/dist/extraction-judge-telemetry.d.ts +2 -1
- package/dist/extraction-judge-training.d.ts +2 -1
- package/dist/extraction-judge.d.ts +2 -1
- package/dist/extraction-liveness.d.ts +2 -1
- package/dist/extraction-normalization.d.ts +2 -1
- package/dist/extraction-prompt.d.ts +2 -1
- package/dist/extraction-source-grounding-rules.d.ts +2 -1
- package/dist/extraction-source-grounding.d.ts +2 -1
- package/dist/extraction.d.ts +2 -1
- package/dist/extraction.js +43 -43
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/{first-start-migration-KHIMCBIC.js → first-start-migration-RC345GPL.js} +6 -5
- package/dist/{first-start-migration-KHIMCBIC.js.map → first-start-migration-RC345GPL.js.map} +1 -1
- package/dist/{forget-2AE4MDK3.js → forget-SZ2BXDGF.js} +3 -3
- package/dist/{graph-444E-DrF.d.ts → graph-DRkl22KE.d.ts} +10 -12
- package/dist/graph-append-error.d.ts +40 -0
- package/dist/graph-append-error.js +8 -0
- package/dist/graph-dashboard-diff.d.ts +5 -2
- package/dist/graph-dashboard-key.d.ts +5 -2
- package/dist/graph-dashboard-parser.d.ts +5 -2
- package/dist/{graph-edge-decay-DGTBFALQ.js → graph-edge-decay-MKIRZ762.js} +10 -4
- package/dist/graph-edge-decay-MKIRZ762.js.map +1 -0
- package/dist/graph-edge-reinforcement.d.ts +5 -2
- package/dist/graph-jsonl.d.ts +82 -0
- package/dist/graph-jsonl.js +23 -0
- package/dist/graph-jsonl.js.map +1 -0
- package/dist/graph-path-reconstruction.d.ts +5 -2
- package/dist/graph-path-scoring.d.ts +5 -2
- package/dist/graph-snapshot.d.ts +5 -2
- package/dist/graph-snapshot.js +7 -3
- package/dist/graph-write-lock.d.ts +84 -0
- package/dist/graph-write-lock.js +15 -0
- package/dist/graph-write-lock.js.map +1 -0
- package/dist/graph.d.ts +5 -2
- package/dist/graph.js +10 -3
- package/dist/harmonic-construction.js +5 -4
- package/dist/harmonic-retrieval.js +5 -4
- package/dist/importance.d.ts +2 -1
- package/dist/importers/index.d.ts +2 -1
- package/dist/in-flight-reads.d.ts +2 -1
- package/dist/{index-CsUrdMyL.d.ts → index-C9VXenR8.d.ts} +2 -2
- package/dist/index.d.ts +39 -25
- package/dist/index.js +291 -284
- package/dist/intent.d.ts +2 -1
- package/dist/json-store.js +2 -1
- package/dist/lcm/engine.d.ts +2 -1
- package/dist/lcm/engine.js +3 -3
- package/dist/lcm/index.d.ts +2 -1
- package/dist/lcm/index.js +6 -6
- package/dist/lcm/tools.d.ts +2 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/live-connectors-runner.d.ts +2 -1
- package/dist/live-connectors-runner.js +3 -2
- package/dist/local-llm.d.ts +2 -1
- package/dist/local-model-endpoint.d.ts +2 -1
- package/dist/location/index.d.ts +4 -3
- package/dist/location/index.js +39 -39
- package/dist/maintenance/memory-governance.d.ts +2 -1
- package/dist/maintenance/memory-governance.js +36 -36
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +36 -36
- package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-projection.js +37 -37
- package/dist/{maintenance-D1GRGLTE.d.ts → maintenance-C14sorKa.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +14 -12
- package/dist/memory-action-policy.d.ts +2 -1
- package/dist/memory-cache.d.ts +2 -1
- package/dist/memory-controller.d.ts +2 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
- package/dist/memory-projection-mutations.js +3 -3
- package/dist/memory-projection-store.d.ts +2 -1
- package/dist/memory-provenance.d.ts +2 -1
- package/dist/memory-snapshot.d.ts +2 -1
- package/dist/memory-subject-cli.d.ts +14 -12
- package/dist/memory-subject.d.ts +14 -12
- package/dist/memory-subject.js +5 -5
- package/dist/memory-worth-outcomes.d.ts +3 -2
- package/dist/models-json.d.ts +2 -1
- package/dist/namespaces/migrate.d.ts +4 -3
- package/dist/namespaces/migrate.js +37 -37
- package/dist/namespaces/principal.d.ts +2 -1
- package/dist/namespaces/search.d.ts +2 -1
- package/dist/namespaces/search.js +11 -11
- package/dist/namespaces/storage.d.ts +4 -3
- package/dist/namespaces/storage.js +36 -36
- package/dist/native-knowledge.d.ts +2 -1
- package/dist/objective-state-writers.js +4 -3
- package/dist/objective-state.js +3 -2
- package/dist/offline-sync-file-io.js +4 -3
- package/dist/offline-sync-impression-drain.d.ts +2 -1
- package/dist/offline-sync-impression-drain.js +7 -7
- package/dist/offline-sync.js +5 -4
- package/dist/operator-doctor-corpus.d.ts +2 -1
- package/dist/operator-doctor-corpus.js +39 -39
- package/dist/operator-doctor-replica.d.ts +2 -1
- package/dist/operator-toolkit.d.ts +6 -4
- package/dist/operator-toolkit.js +61 -58
- package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
- package/dist/orchestration/maintenance.d.ts +5 -4
- package/dist/orchestration/maintenance.js +46 -46
- package/dist/{orchestrator-DeqaPGT5.d.ts → orchestrator-DgyvFfPR.d.ts} +9 -9
- package/dist/orchestrator.d.ts +12 -10
- package/dist/orchestrator.js +201 -196
- package/dist/page-versioning.d.ts +73 -4
- package/dist/page-versioning.js +11 -3
- package/dist/patterns-cli.d.ts +2 -1
- package/dist/{pipeline-umUzU0D1.d.ts → pipeline-DRUwHb1X.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +2 -1
- package/dist/proactive-contention.d.ts +2 -1
- package/dist/provenance.d.ts +2 -1
- package/dist/{public-http-Bevrjll9.d.ts → public-http-C4i8Opxc.d.ts} +1 -1
- package/dist/{purge-OP6BEDFY.js → purge-TZKRE6ZQ.js} +5 -5
- package/dist/purge-TZKRE6ZQ.js.map +1 -0
- package/dist/{qmd-BasT78PP.d.ts → qmd-BVWlg1YS.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +3 -2
- package/dist/qmd-recall-cache.d.ts +2 -1
- package/dist/qmd.d.ts +3 -2
- package/dist/qmd.js +4 -4
- package/dist/recall-concurrency-config.d.ts +2 -1
- package/dist/recall-disclosure-escalation.d.ts +2 -1
- package/dist/recall-explain-renderer.d.ts +2 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +2 -1
- package/dist/recall-navigate-access.d.ts +2 -1
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.d.ts +2 -1
- package/dist/recall-navigate-disclosure.js +1 -1
- package/dist/recall-navigate.d.ts +2 -1
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-planner-llm.d.ts +2 -1
- package/dist/recall-state.d.ts +2 -1
- package/dist/recall-state.js +3 -3
- package/dist/recall-tag-filter.d.ts +2 -1
- package/dist/recall-timings.d.ts +2 -1
- package/dist/recall-xray-cli.d.ts +2 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +2 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +2 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +2 -1
- package/dist/reconcile/manifest.d.ts +2 -1
- package/dist/reconcile/manifest.js +7 -7
- package/dist/reconcile/plan.d.ts +2 -1
- package/dist/replay/normalizers/chatgpt.d.ts +2 -1
- package/dist/replay/normalizers/claude.d.ts +2 -1
- package/dist/replay/normalizers/openclaw.d.ts +2 -1
- package/dist/replay/normalizers/shared.d.ts +2 -1
- package/dist/replay/runner.d.ts +2 -1
- package/dist/replay/types.d.ts +2 -1
- package/dist/replica-divergence.d.ts +2 -1
- package/dist/replica-peers-config.d.ts +2 -1
- package/dist/{resolution-4DLI3IOR.js → resolution-VKATP2HT.js} +10 -10
- package/dist/resolution-VKATP2HT.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +2 -1
- package/dist/resume-bundles.js +21 -18
- package/dist/retrieval-agents.d.ts +3 -2
- package/dist/retrieval-tiers.d.ts +2 -1
- package/dist/routing/engine.d.ts +2 -1
- package/dist/routing/store.d.ts +2 -1
- package/dist/salvage-envelope.d.ts +2 -1
- package/dist/salvage-envelope.js +7 -7
- package/dist/{scope-profiles-DXYzyOXW.d.ts → scope-profiles-Vl00B1KU.d.ts} +1 -1
- package/dist/search/document-scanner.js +3 -3
- package/dist/search/embed-helper.d.ts +2 -1
- package/dist/search/factory.d.ts +2 -1
- package/dist/search/factory.js +10 -10
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +16 -16
- package/dist/search/lancedb-backend.d.ts +2 -1
- package/dist/search/lancedb-backend.js +4 -4
- package/dist/search/meilisearch-backend.d.ts +2 -1
- package/dist/search/meilisearch-backend.js +4 -4
- package/dist/search/noop-backend.d.ts +2 -1
- package/dist/search/orama-backend.d.ts +2 -1
- package/dist/search/orama-backend.js +4 -4
- package/dist/search/port.d.ts +2 -1
- package/dist/search/remote-backend.d.ts +2 -1
- package/dist/secure-store/index.js +3 -3
- package/dist/{semantic-consolidation-CqDeaY0U.d.ts → semantic-consolidation-BC9-GFuT.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -2
- package/dist/semantic-consolidation.js +39 -39
- package/dist/semantic-merge-config.d.ts +17 -0
- package/dist/semantic-merge-config.js +1 -0
- package/dist/semantic-merge-config.js.map +1 -0
- package/dist/semantic-rule-promotion.js +36 -36
- package/dist/semantic-rule-verifier.d.ts +2 -1
- package/dist/semantic-rule-verifier.js +36 -36
- package/dist/{service-BKD-DVYZ.d.ts → service-BOy6dHfc.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +2 -1
- package/dist/session-observer-state.d.ts +2 -1
- package/dist/shared-context/manager.d.ts +2 -1
- package/dist/signal.d.ts +2 -1
- package/dist/source-agent-qualifier.d.ts +2 -1
- package/dist/source-agent-qualifier.js +42 -42
- package/dist/source-attribution.d.ts +18 -6
- package/dist/source-attribution.js +3 -1
- package/dist/standup/build.js +36 -36
- package/dist/{storage-BcFd1lN_.d.ts → storage-BLJRnFi6.d.ts} +15 -8
- package/dist/storage.d.ts +3 -2
- package/dist/storage.js +35 -35
- package/dist/subject-config.d.ts +2 -1
- package/dist/subject-config.js +6 -6
- package/dist/summarizer.d.ts +2 -1
- package/dist/summary-snapshot.d.ts +2 -1
- package/dist/support-passport/index.d.ts +17 -15
- package/dist/support-passport/index.js +97 -94
- package/dist/temporal-supersession.d.ts +3 -2
- package/dist/temporal-timeline-recall.d.ts +2 -1
- package/dist/temporal-validity.d.ts +2 -1
- package/dist/threading.d.ts +2 -1
- package/dist/tier-migration.d.ts +3 -2
- package/dist/tier-routing.d.ts +2 -1
- package/dist/{tier-stats-2TOW3QNL.js → tier-stats-KA6OZX2C.js} +6 -5
- package/dist/{tier-stats-2TOW3QNL.js.map → tier-stats-KA6OZX2C.js.map} +1 -1
- package/dist/topics.d.ts +2 -1
- package/dist/transcript.d.ts +2 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +6 -6
- package/dist/transfer/export-okf.d.ts +2 -1
- package/dist/transfer/export-okf.js +37 -37
- package/dist/trust-score-stage.d.ts +2 -1
- package/dist/trust-score.d.ts +2 -1
- package/dist/trust-zones.js +3 -2
- package/dist/{types-BRg3tMyp.d.ts → types-YY-eKKU7.d.ts} +3 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.js +1 -1
- package/dist/utility-learner.js +4 -3
- package/dist/utility-runtime.d.ts +2 -1
- package/dist/utility-runtime.js +5 -4
- package/dist/utility-telemetry.js +3 -2
- package/dist/verified-recall.js +36 -36
- package/dist/who-knows-cli.d.ts +14 -12
- package/dist/who-knows-cli.js +37 -37
- package/dist/who-knows.d.ts +14 -12
- package/dist/who-knows.js +36 -36
- package/dist/work/board.js +3 -3
- package/dist/work/storage.js +2 -2
- package/dist/work-product-ledger.js +3 -2
- package/dist/write-envelope.d.ts +2 -1
- package/dist/write-envelope.js +6 -6
- package/package.json +2 -2
- package/src/abstraction-nodes.ts +1 -4
- package/src/access-http-briefing.ts +35 -0
- package/src/access-http.test.ts +76 -0
- package/src/access-http.ts +20 -23
- package/src/access-surface-catalog.test.ts +9 -0
- package/src/access-surface-catalog.ts +1 -0
- package/src/binary-lifecycle/backend.ts +2 -1
- package/src/config.ts +2 -0
- package/src/connectors/live/github.ts +10 -17
- package/src/connectors/live/gmail.ts +8 -19
- package/src/connectors/live/google-drive.ts +6 -13
- package/src/connectors/live/notion.ts +11 -21
- package/src/cue-anchors.ts +1 -6
- package/src/dedup/connector-scope.ts +39 -0
- package/src/dedup/merge-content.test.ts +21 -0
- package/src/dedup/merge-content.ts +21 -7
- package/src/dedup/merge-judge.ts +146 -0
- package/src/dedup/merge.test.ts +3542 -0
- package/src/dedup/merge.ts +384 -0
- package/src/dedup/novelty-gate.ts +12 -10
- package/src/dedup/semantic.ts +7 -9
- package/src/graph-append-error.ts +28 -0
- package/src/graph-jsonl.ts +267 -0
- package/src/graph-write-lock.test.ts +228 -0
- package/src/graph-write-lock.ts +132 -0
- package/src/graph.ts +49 -45
- package/src/harmonic-construction.test.ts +329 -0
- package/src/json-store.ts +17 -20
- package/src/live-connectors-runner.ts +2 -1
- package/src/location/store.ts +1 -4
- package/src/maintenance/graph-edge-decay.ts +24 -13
- package/src/maintenance/purge.ts +2 -5
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +3 -6
- package/src/maintenance/rebuild-memory-projection.ts +2 -5
- package/src/namespaces/catalog.ts +1 -9
- package/src/offline-sync-file-io.test.ts +39 -0
- package/src/offline-sync-file-io.ts +3 -7
- package/src/orchestration/contradiction-localization.integration.test.ts +35 -0
- package/src/orchestration/extraction-anchor-snapshot.ts +6 -1
- package/src/orchestration/extraction-persist-deps.ts +2 -1
- package/src/orchestration/extraction-persist-profile-promotion.test.ts +456 -0
- package/src/orchestration/extraction-persist-promotion.test.ts +534 -0
- package/src/orchestration/extraction-persist-promotion.ts +387 -1
- package/src/orchestration/extraction-persist.ts +95 -94
- package/src/orchestration/harmonic-construction-persist.test.ts +69 -0
- package/src/orchestration/harmonic-construction-persist.ts +55 -0
- package/src/orchestration/persistence-index.ts +35 -7
- package/src/orchestration/semantic-merge-commit-effects.ts +354 -0
- package/src/orchestration/semantic-merge-persist.ts +1095 -0
- package/src/orchestration/semantic-merge-promotion-payload.ts +161 -0
- package/src/orchestrator.ts +2 -2
- package/src/page-versioning.ts +396 -22
- package/src/procedural/procedure-miner.ts +1 -9
- package/src/search/document-scanner.ts +3 -6
- package/src/semantic-merge-config.ts +16 -0
- package/src/semantic-rule-promotion.ts +1 -4
- package/src/source-attribution-roundtrip.test.ts +21 -0
- package/src/source-attribution.ts +57 -17
- package/src/storage-contract/versioning.test.ts +500 -1
- package/src/storage.ts +30 -30
- package/src/testing/subjects/graph-edge-decay.test.ts +163 -0
- package/src/testing/subjects/semantic-merge-lifecycle.test.ts +1175 -0
- package/src/types.ts +2 -0
- package/src/utils/errno.test.ts +31 -0
- package/src/utils/errno.ts +5 -0
- package/src/wearables/index.ts +1 -0
- package/src/wearables/registry.ts +23 -0
- package/dist/chunk-5UZXUTVO.js.map +0 -1
- package/dist/chunk-7GSSHAXC.js.map +0 -1
- package/dist/chunk-ACPCA4NO.js.map +0 -1
- package/dist/chunk-C2JCVZWX.js.map +0 -1
- package/dist/chunk-DDQQY2E3.js.map +0 -1
- package/dist/chunk-DJUKBGAD.js.map +0 -1
- package/dist/chunk-DK6GMO6D.js.map +0 -1
- package/dist/chunk-DP4EBV7C.js.map +0 -1
- package/dist/chunk-FCATYKQA.js.map +0 -1
- package/dist/chunk-GGYDJJBO.js.map +0 -1
- package/dist/chunk-HTIIXNJQ.js.map +0 -1
- package/dist/chunk-KK66P5GQ.js.map +0 -1
- package/dist/chunk-NQFCLAYT.js.map +0 -1
- package/dist/chunk-NYRB7BKY.js.map +0 -1
- package/dist/chunk-OGTKQ5MJ.js.map +0 -1
- package/dist/chunk-OLT3YTDH.js.map +0 -1
- package/dist/chunk-P77QX3ID.js.map +0 -1
- package/dist/chunk-U62OK7BB.js.map +0 -1
- package/dist/chunk-UR6PBX2J.js.map +0 -1
- package/dist/chunk-VLAQV4HT.js.map +0 -1
- package/dist/chunk-W7IGLX4G.js.map +0 -1
- package/dist/purge-OP6BEDFY.js.map +0 -1
- /package/dist/{capsule-crypto-7FJQINUR.js.map → access-http-briefing.js.map} +0 -0
- /package/dist/{auto-sync-GRUJFD2F.js.map → auto-sync-WNGG2GC2.js.map} +0 -0
- /package/dist/{graph-edge-decay-DGTBFALQ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
- /package/dist/{capsule-merge-SEHERWWP.js.map → capsule-merge-IPG4IOFP.js.map} +0 -0
- /package/dist/{chunk-KTVSPFCQ.js.map → chunk-22FVR2KE.js.map} +0 -0
- /package/dist/{chunk-7Y5V3LAP.js.map → chunk-27QVNSQ3.js.map} +0 -0
- /package/dist/{chunk-R7LY4YKF.js.map → chunk-2EKJDQZB.js.map} +0 -0
- /package/dist/{chunk-HOUST5UX.js.map → chunk-2ITE4C2Z.js.map} +0 -0
- /package/dist/{chunk-JOYC4RYC.js.map → chunk-2JVJ7UHC.js.map} +0 -0
- /package/dist/{chunk-X2NFFBTO.js.map → chunk-2L5FSNPC.js.map} +0 -0
- /package/dist/{chunk-DUAJKRR2.js.map → chunk-2SGLMP2E.js.map} +0 -0
- /package/dist/{chunk-6FUMA6AA.js.map → chunk-2Z4GS5E6.js.map} +0 -0
- /package/dist/{chunk-G6MXN2G5.js.map → chunk-37KUQPX4.js.map} +0 -0
- /package/dist/{chunk-WKAXBXVA.js.map → chunk-3QQTXYZ6.js.map} +0 -0
- /package/dist/{chunk-4ZWCQJNM.js.map → chunk-46WM6JX2.js.map} +0 -0
- /package/dist/{chunk-CASWJ2HM.js.map → chunk-46ZPIGWI.js.map} +0 -0
- /package/dist/{chunk-MCA2X4WH.js.map → chunk-4IHBN6WU.js.map} +0 -0
- /package/dist/{chunk-FB7LAJQM.js.map → chunk-4TKJGOCJ.js.map} +0 -0
- /package/dist/{chunk-H7BZBSP6.js.map → chunk-52II7PB6.js.map} +0 -0
- /package/dist/{chunk-N4Y5T6VD.js.map → chunk-54WHLA65.js.map} +0 -0
- /package/dist/{chunk-YVLENSNS.js.map → chunk-5ATKSPEQ.js.map} +0 -0
- /package/dist/{chunk-ZVZHG7AI.js.map → chunk-5UBH37SL.js.map} +0 -0
- /package/dist/{chunk-N3WZU76A.js.map → chunk-66OJSCI6.js.map} +0 -0
- /package/dist/{chunk-D35XLYQ7.js.map → chunk-6CVNSDCZ.js.map} +0 -0
- /package/dist/{chunk-KA2HZCMG.js.map → chunk-6NXSYYGP.js.map} +0 -0
- /package/dist/{chunk-2HIJHXB3.js.map → chunk-6WHJ2EAB.js.map} +0 -0
- /package/dist/{chunk-ZZM476NV.js.map → chunk-6XL73HQ4.js.map} +0 -0
- /package/dist/{chunk-EJ5RKUXW.js.map → chunk-AQ7SYDVO.js.map} +0 -0
- /package/dist/{chunk-2Z3DG5CQ.js.map → chunk-B3O3IRZN.js.map} +0 -0
- /package/dist/{chunk-RACZB5HT.js.map → chunk-BD7JTBYP.js.map} +0 -0
- /package/dist/{chunk-I762GW7V.js.map → chunk-BLJWYCNO.js.map} +0 -0
- /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-GCASGYIO.js.map → chunk-C7HJ3NEI.js.map} +0 -0
- /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
- /package/dist/{chunk-WVGXCBOC.js.map → chunk-D5F7TKMH.js.map} +0 -0
- /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-2OXIPF3A.js.map → chunk-DZD3WGCD.js.map} +0 -0
- /package/dist/{chunk-UMEOXLIZ.js.map → chunk-E2P7TZTF.js.map} +0 -0
- /package/dist/{chunk-6FC3IZ26.js.map → chunk-EBA5DA77.js.map} +0 -0
- /package/dist/{chunk-N7JK2RKG.js.map → chunk-EOQ6FSQP.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-XDMI5VKE.js.map → chunk-FVOP3NT7.js.map} +0 -0
- /package/dist/{chunk-NRLELHAY.js.map → chunk-G7NYVKD6.js.map} +0 -0
- /package/dist/{chunk-B3W7GWQB.js.map → chunk-GHTSNGBZ.js.map} +0 -0
- /package/dist/{chunk-LUDBXTBJ.js.map → chunk-H272ZPQ3.js.map} +0 -0
- /package/dist/{chunk-SN4JXNLL.js.map → chunk-H3TKENU4.js.map} +0 -0
- /package/dist/{chunk-4HYNMLT6.js.map → chunk-H4SEGIZY.js.map} +0 -0
- /package/dist/{chunk-ACZN5ZXD.js.map → chunk-H54VWRPS.js.map} +0 -0
- /package/dist/{chunk-HTP6XRUI.js.map → chunk-HM7RHKS4.js.map} +0 -0
- /package/dist/{chunk-Z3SQEEB6.js.map → chunk-HWLIMQE2.js.map} +0 -0
- /package/dist/{chunk-2QSZNTDO.js.map → chunk-JBPKEARU.js.map} +0 -0
- /package/dist/{chunk-ET2CNMLD.js.map → chunk-JN72EPOE.js.map} +0 -0
- /package/dist/{chunk-JCCWJHOP.js.map → chunk-JYZSRNR7.js.map} +0 -0
- /package/dist/{chunk-7D6HXODY.js.map → chunk-K7724CH2.js.map} +0 -0
- /package/dist/{chunk-X33MJFD2.js.map → chunk-KAXCYM66.js.map} +0 -0
- /package/dist/{chunk-7RRUHJPG.js.map → chunk-KB2G2I6Q.js.map} +0 -0
- /package/dist/{chunk-ZXBTTMGZ.js.map → chunk-KEF46KL2.js.map} +0 -0
- /package/dist/{chunk-UWTDARPF.js.map → chunk-KTWG7CNY.js.map} +0 -0
- /package/dist/{chunk-XQYTSZW3.js.map → chunk-L7Z57SID.js.map} +0 -0
- /package/dist/{chunk-JMAG7WZ7.js.map → chunk-LO4UKPKX.js.map} +0 -0
- /package/dist/{chunk-LDWIPYJ6.js.map → chunk-LS2FHUML.js.map} +0 -0
- /package/dist/{chunk-GDB4J2H3.js.map → chunk-MPC7TYTZ.js.map} +0 -0
- /package/dist/{chunk-2GF27PGH.js.map → chunk-MRPOZBJC.js.map} +0 -0
- /package/dist/{chunk-BR3OOQZQ.js.map → chunk-MWN6QEI2.js.map} +0 -0
- /package/dist/{chunk-NZGO2GKL.js.map → chunk-MY5EDR46.js.map} +0 -0
- /package/dist/{chunk-LCMUZDBZ.js.map → chunk-N3ZOP7KC.js.map} +0 -0
- /package/dist/{chunk-TVW4C7PV.js.map → chunk-NB3LRY4T.js.map} +0 -0
- /package/dist/{chunk-QJCWK2A7.js.map → chunk-ND6IQGSZ.js.map} +0 -0
- /package/dist/{chunk-NOB2T2FC.js.map → chunk-NHLLKEKK.js.map} +0 -0
- /package/dist/{chunk-EJIWBTVM.js.map → chunk-O6ZNNVSP.js.map} +0 -0
- /package/dist/{chunk-AG46P24C.js.map → chunk-OB3XMWX5.js.map} +0 -0
- /package/dist/{chunk-46QMN7I7.js.map → chunk-PAZY2ZKP.js.map} +0 -0
- /package/dist/{chunk-EF4JUM55.js.map → chunk-PX4UMA5Z.js.map} +0 -0
- /package/dist/{chunk-NNZFPYYX.js.map → chunk-R7QY5ZVB.js.map} +0 -0
- /package/dist/{chunk-RO2X2EYM.js.map → chunk-R7RTXEYG.js.map} +0 -0
- /package/dist/{chunk-3LJPSRAN.js.map → chunk-RBCQVOVJ.js.map} +0 -0
- /package/dist/{chunk-N4F7ZSSG.js.map → chunk-RC5DXXWC.js.map} +0 -0
- /package/dist/{chunk-5CF2R4NS.js.map → chunk-RKBLRTNT.js.map} +0 -0
- /package/dist/{chunk-5QZR2RA3.js.map → chunk-ROBHL3GL.js.map} +0 -0
- /package/dist/{chunk-D5ZNOKR7.js.map → chunk-S7T2TY65.js.map} +0 -0
- /package/dist/{chunk-3LADWWMA.js.map → chunk-SJDQ5RSN.js.map} +0 -0
- /package/dist/{chunk-CHWUICVY.js.map → chunk-SV4Z2S67.js.map} +0 -0
- /package/dist/{chunk-SEF4IOFE.js.map → chunk-SWIKABKI.js.map} +0 -0
- /package/dist/{chunk-JRRQ747T.js.map → chunk-TBXAY2SS.js.map} +0 -0
- /package/dist/{chunk-XZBXINXZ.js.map → chunk-TNSCIPBQ.js.map} +0 -0
- /package/dist/{chunk-S37NN23M.js.map → chunk-TVEONGBU.js.map} +0 -0
- /package/dist/{chunk-5RPMTFB6.js.map → chunk-TWF35IC6.js.map} +0 -0
- /package/dist/{chunk-BZTJEILZ.js.map → chunk-U6N5IBVY.js.map} +0 -0
- /package/dist/{chunk-7TUB6JWA.js.map → chunk-UCKYTA2T.js.map} +0 -0
- /package/dist/{chunk-PPOT6SPR.js.map → chunk-UNNPNBR2.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-J2R275FN.js.map → chunk-VVX5PZFS.js.map} +0 -0
- /package/dist/{chunk-ME35HVDJ.js.map → chunk-VYCOJKSX.js.map} +0 -0
- /package/dist/{chunk-F5UWQ4LX.js.map → chunk-W24T5YMW.js.map} +0 -0
- /package/dist/{chunk-HDQUQBPW.js.map → chunk-W3K3HITK.js.map} +0 -0
- /package/dist/{chunk-GDASG7NC.js.map → chunk-W4F3C7N7.js.map} +0 -0
- /package/dist/{chunk-LFK623SF.js.map → chunk-WJHGDE7X.js.map} +0 -0
- /package/dist/{chunk-3Q6RD76J.js.map → chunk-WQZZDN5M.js.map} +0 -0
- /package/dist/{chunk-ZJWDWPX6.js.map → chunk-X5K5TAQZ.js.map} +0 -0
- /package/dist/{chunk-ZL3XX5LW.js.map → chunk-XM24CDZX.js.map} +0 -0
- /package/dist/{chunk-JTWZKNUH.js.map → chunk-XOVKXJEP.js.map} +0 -0
- /package/dist/{chunk-X5YYSAZX.js.map → chunk-XUE46UYW.js.map} +0 -0
- /package/dist/{chunk-DJORULH3.js.map → chunk-YRLHEEQT.js.map} +0 -0
- /package/dist/{chunk-TA7UZZMW.js.map → chunk-Z3O53WZR.js.map} +0 -0
- /package/dist/{chunk-4LG4CPOC.js.map → chunk-Z6COGHHN.js.map} +0 -0
- /package/dist/{chunk-RE3H6Y2X.js.map → chunk-ZIW5JVRM.js.map} +0 -0
- /package/dist/{forget-2AE4MDK3.js.map → forget-SZ2BXDGF.js.map} +0 -0
- /package/dist/{resolution-4DLI3IOR.js.map → graph-append-error.js.map} +0 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Judge-mediated merge-on-write decision (issue #2330, harmonic 2/5).
|
|
3
|
+
*
|
|
4
|
+
* A new candidate fact that is semantically close — but NOT near-duplicate
|
|
5
|
+
* close — to an existing active memory is offered to an LLM merge judge.
|
|
6
|
+
* On a "merge" verdict the caller updates the existing entry in place
|
|
7
|
+
* instead of writing a new fragment. Every failure mode fails closed to
|
|
8
|
+
* "create": the unsafe default is always the unchanged write path.
|
|
9
|
+
*
|
|
10
|
+
* The near-duplicate skip path (similarity >= the semantic dedup
|
|
11
|
+
* threshold) is untouched — this module only sees the band
|
|
12
|
+
* `[minSimilarity, dedupThreshold)`.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { coerceBool, coerceNumber } from "../connectors/coerce.js";
|
|
16
|
+
import { MEMORY_CATEGORIES } from "../correction/correction-contract.js";
|
|
17
|
+
import type { SemanticMergeConfig } from "../types.js";
|
|
18
|
+
import { isActiveMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
|
|
19
|
+
import { semanticDedupThresholdFrom } from "./novelty-gate.js";
|
|
20
|
+
import { parseMinMergeScore } from "./merge-min-score.js";
|
|
21
|
+
import { REFUSED_MERGE_CATEGORIES } from "./merge-on-write.js";
|
|
22
|
+
import { checkMergedContent } from "./merge-content.js";
|
|
23
|
+
import type { SemanticDedupHit, SemanticDedupLookup } from "./semantic.js";
|
|
24
|
+
import { normalizeConnectorScope } from "./connector-scope.js";
|
|
25
|
+
|
|
26
|
+
// ── Public types ──────────────────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
/** An existing memory considered as a merge target. */
|
|
29
|
+
export interface MergeCandidate {
|
|
30
|
+
memoryId: string;
|
|
31
|
+
content: string;
|
|
32
|
+
category: string;
|
|
33
|
+
similarity: number;
|
|
34
|
+
/** Frontmatter status; only `active` (or absent) memories are eligible. */
|
|
35
|
+
status: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Raw (parsed but UNVALIDATED) judge verdict. `decideSemanticMerge`
|
|
40
|
+
* hard-validates before trusting any field — an LLM-fabricated targetId
|
|
41
|
+
* must never survive (issue #2330 step 2).
|
|
42
|
+
*/
|
|
43
|
+
export interface MergeJudgeRawVerdict {
|
|
44
|
+
decision: "merge" | "create" | "contradicts";
|
|
45
|
+
targetId?: string | null;
|
|
46
|
+
mergedContent?: string | null;
|
|
47
|
+
reason?: string | null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** The judge call injected by the caller (LLM-backed in production). */
|
|
51
|
+
export type MergeJudge = (input: {
|
|
52
|
+
content: string;
|
|
53
|
+
category: string;
|
|
54
|
+
candidates: readonly MergeCandidate[];
|
|
55
|
+
}) => Promise<MergeJudgeRawVerdict>;
|
|
56
|
+
|
|
57
|
+
/** Resolves candidate metadata for a lookup hit id; null = unknown memory. */
|
|
58
|
+
export type MergeCandidateResolver = (
|
|
59
|
+
memoryId: string,
|
|
60
|
+
) => Promise<{ content: string; category: string; status: string } | null>;
|
|
61
|
+
|
|
62
|
+
/** Why a candidate fell through to the unchanged create path. */
|
|
63
|
+
export type MergeCreateReason =
|
|
64
|
+
| "disabled"
|
|
65
|
+
| "no_candidates"
|
|
66
|
+
| "judge_create"
|
|
67
|
+
| "judge_contradicts"
|
|
68
|
+
| "judge_invalid"
|
|
69
|
+
| "judge_error"
|
|
70
|
+
| "backend_unavailable";
|
|
71
|
+
|
|
72
|
+
export type MergeDecision =
|
|
73
|
+
| { action: "create"; reason: MergeCreateReason }
|
|
74
|
+
| {
|
|
75
|
+
action: "merge";
|
|
76
|
+
targetId: string;
|
|
77
|
+
mergedContent: string;
|
|
78
|
+
/**
|
|
79
|
+
* The target body the judge actually merged. The persist side must
|
|
80
|
+
* compare it against the target it is about to write and fall back to
|
|
81
|
+
* create when it differs: in a multi-writer deployment another
|
|
82
|
+
* extraction can update the target between this decision and the write,
|
|
83
|
+
* and `mergedContent` was computed from the older body.
|
|
84
|
+
*/
|
|
85
|
+
targetContent: string;
|
|
86
|
+
reason: "judge_merge";
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export interface DecideSemanticMergeOptions {
|
|
90
|
+
content: string;
|
|
91
|
+
category: string;
|
|
92
|
+
lookup: SemanticDedupLookup;
|
|
93
|
+
judge: MergeJudge;
|
|
94
|
+
config: SemanticMergeConfig;
|
|
95
|
+
/** Upper bound of the merge band: the semantic-dedup threshold. */
|
|
96
|
+
dedupThreshold: number;
|
|
97
|
+
resolveCandidate: MergeCandidateResolver;
|
|
98
|
+
/**
|
|
99
|
+
* Provenance connector of the INCOMING fact. Merge selection is stricter
|
|
100
|
+
* than the novelty and semantic-dedup gates (`connector-scope.ts`): a merge
|
|
101
|
+
* may only pair an unscoped fact with an unscoped target, or a
|
|
102
|
+
* provenance-bearing fact with a neighbor from the same connector. A merge
|
|
103
|
+
* rewrites the target's body, so any other pairing would relabel one side's
|
|
104
|
+
* claims under the other's `sourceConnector` frontmatter (finding B).
|
|
105
|
+
*/
|
|
106
|
+
sourceConnector?: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ── Decision function ─────────────────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
/** Total order: similarity desc, then memoryId asc (checklist #12). */
|
|
112
|
+
function compareMergeCandidates(a: MergeCandidate, b: MergeCandidate): number {
|
|
113
|
+
if (a.similarity !== b.similarity) return b.similarity - a.similarity;
|
|
114
|
+
return a.memoryId < b.memoryId ? -1 : a.memoryId > b.memoryId ? 1 : 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export async function decideSemanticMerge(
|
|
118
|
+
options: DecideSemanticMergeOptions,
|
|
119
|
+
): Promise<MergeDecision> {
|
|
120
|
+
const { config } = options;
|
|
121
|
+
if (config.enabled !== true) return { action: "create", reason: "disabled" };
|
|
122
|
+
// 0 disables merging entirely — short-circuit BEFORE the lookup so no
|
|
123
|
+
// embedding backend call is made (config is runtime API; never coerce 0).
|
|
124
|
+
if (!(config.maxCandidates > 0)) return { action: "create", reason: "disabled" };
|
|
125
|
+
if (!(config.categories as readonly string[]).includes(options.category)) {
|
|
126
|
+
return { action: "create", reason: "disabled" };
|
|
127
|
+
}
|
|
128
|
+
const trimmed = typeof options.content === "string" ? options.content.trim() : "";
|
|
129
|
+
if (!trimmed) return { action: "create", reason: "no_candidates" };
|
|
130
|
+
|
|
131
|
+
// Lookup throws = backend down (distinct from an empty index, #22).
|
|
132
|
+
// Round N+17 (A): the fetch deliberately OVERSHOOTS maxCandidates. The
|
|
133
|
+
// eligibility predicates below (band, connector scope, category, active
|
|
134
|
+
// status) run after the lookup, so fetching exactly maxCandidates let
|
|
135
|
+
// ineligible hits — a foreign connector or category, an inactive row —
|
|
136
|
+
// occupy the whole fetch window and crowd out a valid target ranked
|
|
137
|
+
// immediately beneath them; the write then created another fragment.
|
|
138
|
+
// maxCandidates still bounds what reaches the JUDGE (the slice below is
|
|
139
|
+
// the only truncation point).
|
|
140
|
+
let hits: SemanticDedupHit[];
|
|
141
|
+
try {
|
|
142
|
+
hits = await options.lookup(trimmed, config.maxCandidates * CANDIDATE_OVERFETCH_FACTOR);
|
|
143
|
+
} catch {
|
|
144
|
+
return { action: "create", reason: "backend_unavailable" };
|
|
145
|
+
}
|
|
146
|
+
if (!Array.isArray(hits) || hits.length === 0) {
|
|
147
|
+
return { action: "create", reason: "no_candidates" };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Connector scope (finding B): a merge REWRITES the neighbor's body, so it
|
|
151
|
+
// is stricter than the shared dedup helper — both sides must be unscoped or
|
|
152
|
+
// carry the identical connector. An unscoped merge into a connector-owned
|
|
153
|
+
// target would rewrite A's memory while A's `sourceConnector` frontmatter
|
|
154
|
+
// still identifies A, so recall and connector-aware dedup would label the
|
|
155
|
+
// unscoped claims as A's.
|
|
156
|
+
const scope = normalizeConnectorScope(options.sourceConnector);
|
|
157
|
+
const candidates: MergeCandidate[] = [];
|
|
158
|
+
for (const hit of hits) {
|
|
159
|
+
if (
|
|
160
|
+
!hit ||
|
|
161
|
+
typeof hit.id !== "string" ||
|
|
162
|
+
hit.id.trim().length === 0 ||
|
|
163
|
+
typeof hit.score !== "number" ||
|
|
164
|
+
!Number.isFinite(hit.score)
|
|
165
|
+
) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
// Band: [minSimilarity, dedupThreshold). The upper edge is owned by the
|
|
169
|
+
// near-duplicate skip path and must stay excluded.
|
|
170
|
+
if (!(hit.score >= config.minSimilarity && hit.score < options.dedupThreshold)) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (normalizeConnectorScope(hit.sourceConnector) !== scope) continue;
|
|
174
|
+
const meta = await options.resolveCandidate(hit.id);
|
|
175
|
+
if (!meta) continue;
|
|
176
|
+
if (meta.category !== options.category) continue;
|
|
177
|
+
if (!isActiveMemoryStatus(meta.status)) continue;
|
|
178
|
+
candidates.push({
|
|
179
|
+
memoryId: hit.id,
|
|
180
|
+
content: meta.content,
|
|
181
|
+
category: meta.category,
|
|
182
|
+
similarity: hit.score,
|
|
183
|
+
status: meta.status,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
if (candidates.length === 0) return { action: "create", reason: "no_candidates" };
|
|
187
|
+
|
|
188
|
+
candidates.sort(compareMergeCandidates);
|
|
189
|
+
// Eligible-first truncation (round N+17 A): the judge sees up to
|
|
190
|
+
// maxCandidates ELIGIBLE neighbors — never the raw top-of-index hits.
|
|
191
|
+
const limited = candidates.slice(0, config.maxCandidates);
|
|
192
|
+
|
|
193
|
+
let verdict: MergeJudgeRawVerdict;
|
|
194
|
+
try {
|
|
195
|
+
verdict = await options.judge({
|
|
196
|
+
content: trimmed,
|
|
197
|
+
category: options.category,
|
|
198
|
+
candidates: limited,
|
|
199
|
+
});
|
|
200
|
+
} catch {
|
|
201
|
+
return { action: "create", reason: "judge_error" };
|
|
202
|
+
}
|
|
203
|
+
if (!verdict || typeof verdict !== "object") {
|
|
204
|
+
return { action: "create", reason: "judge_invalid" };
|
|
205
|
+
}
|
|
206
|
+
if (verdict.decision === "create") return { action: "create", reason: "judge_create" };
|
|
207
|
+
if (verdict.decision === "contradicts") return { action: "create", reason: "judge_contradicts" };
|
|
208
|
+
|
|
209
|
+
// Hard post-validation: never trust the model to echo ids.
|
|
210
|
+
const target =
|
|
211
|
+
typeof verdict.targetId === "string"
|
|
212
|
+
? limited.find((c) => c.memoryId === verdict.targetId)
|
|
213
|
+
: undefined;
|
|
214
|
+
if (!target) return { action: "create", reason: "judge_invalid" };
|
|
215
|
+
const content = checkMergedContent({
|
|
216
|
+
mergedContent: verdict.mergedContent,
|
|
217
|
+
incomingContent: trimmed,
|
|
218
|
+
targetContent: target.content,
|
|
219
|
+
});
|
|
220
|
+
if (!content.ok) return { action: "create", reason: "judge_invalid" };
|
|
221
|
+
return {
|
|
222
|
+
action: "merge",
|
|
223
|
+
targetId: target.memoryId,
|
|
224
|
+
mergedContent: content.content,
|
|
225
|
+
targetContent: target.content,
|
|
226
|
+
reason: "judge_merge",
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// ── Config parsing ────────────────────────────────────────────────────────────
|
|
231
|
+
|
|
232
|
+
export const DEFAULT_SEMANTIC_MERGE_CATEGORIES = [
|
|
233
|
+
"fact",
|
|
234
|
+
"preference",
|
|
235
|
+
"decision",
|
|
236
|
+
"relationship",
|
|
237
|
+
"skill",
|
|
238
|
+
] as const;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* The categories `semanticMerge.categories` may name: every known memory
|
|
242
|
+
* category except the episodic/immutable ones `REFUSED_MERGE_CATEGORIES`
|
|
243
|
+
* excludes at runtime — listing a refused category configures a gate that
|
|
244
|
+
* can never fire, and an unknown string (a typo like "facts") silently
|
|
245
|
+
* disables merging for every category, so both are rejected at parse time.
|
|
246
|
+
*/
|
|
247
|
+
export const MERGEABLE_MEMORY_CATEGORIES: readonly string[] = MEMORY_CATEGORIES.filter(
|
|
248
|
+
(category) => !(REFUSED_MERGE_CATEGORIES as readonly string[]).includes(category),
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
export const DEFAULT_SEMANTIC_MERGE_MIN = 0.8;
|
|
252
|
+
export const DEFAULT_SEMANTIC_MERGE_CANDIDATES = 3;
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Round N+17 (A): the neighbor fetch overshoots `maxCandidates` by this
|
|
256
|
+
* factor so eligibility filtering happens BEFORE truncation. Bounded
|
|
257
|
+
* ceiling: a corpus holding more than this many consecutive ineligible
|
|
258
|
+
* neighbors above the valid target still crowds it out; raise only with
|
|
259
|
+
* evidence of that corpus shape.
|
|
260
|
+
*/
|
|
261
|
+
const CANDIDATE_OVERFETCH_FACTOR = 4;
|
|
262
|
+
|
|
263
|
+
function describeValue(value: unknown): string {
|
|
264
|
+
try {
|
|
265
|
+
const serialized = JSON.stringify(value);
|
|
266
|
+
return serialized === undefined ? String(value) : serialized;
|
|
267
|
+
} catch {
|
|
268
|
+
return String(value);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Parse the `semanticMerge` block (issue #2330). Follows the `procedural.*`
|
|
274
|
+
* worked example: strict booleans that reject unrecognized values, CLI
|
|
275
|
+
* string coercion for numbers ("0" is zero, never coerced upward), and
|
|
276
|
+
* parse-time rejection of an empty merge band (`minSimilarity` must be
|
|
277
|
+
* strictly below the semantic-dedup threshold that owns the band's top).
|
|
278
|
+
* Invalid input is rejected, never silently defaulted or reinterpreted: a
|
|
279
|
+
* present block that is not an object, a present-but-`undefined` or
|
|
280
|
+
* unparseable field (`enabled`, `shadowMode`, `minSimilarity`,
|
|
281
|
+
* `maxCandidates` "abc"/an object/NaN/infinity, or a malformed `categories`
|
|
282
|
+
* array) each throw. Presence is OWN-property presence (checklist #46): a
|
|
283
|
+
* key inherited through the prototype chain never applies, and only a key
|
|
284
|
+
* absent from `Object.getOwnPropertyNames` means "use the defaults".
|
|
285
|
+
*
|
|
286
|
+
* The band check applies only when it can describe a real misconfiguration:
|
|
287
|
+
* merging is enabled, or `minSimilarity` was set explicitly. A deployment
|
|
288
|
+
* that predates this block and lowered `semanticDedupThreshold` to <= the
|
|
289
|
+
* default merge minimum must keep starting — the disabled feature performs
|
|
290
|
+
* no band lookup at all, so rejecting that config would be a gratuitous
|
|
291
|
+
* backward-compatibility break.
|
|
292
|
+
*/
|
|
293
|
+
export function parseSemanticMergeConfig(
|
|
294
|
+
cfg: Record<string, unknown>,
|
|
295
|
+
): { semanticMerge: SemanticMergeConfig } {
|
|
296
|
+
// Own-property presence (checklist #46): a bracket read follows the
|
|
297
|
+
// prototype chain, and `=== undefined` folds present-but-invalid into
|
|
298
|
+
// absent. Gate every presence question on Object.hasOwn.
|
|
299
|
+
const blockPresent = Object.hasOwn(cfg, "semanticMerge");
|
|
300
|
+
const block = blockPresent ? cfg.semanticMerge : undefined;
|
|
301
|
+
if (
|
|
302
|
+
block !== undefined &&
|
|
303
|
+
(typeof block !== "object" || block === null || Array.isArray(block))
|
|
304
|
+
) {
|
|
305
|
+
throw new Error(
|
|
306
|
+
`semanticMerge must be an object when present (got ${describeValue(block)}). Remove the block to fall back to the defaults.`,
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
if (blockPresent && block === undefined) {
|
|
310
|
+
throw new Error(
|
|
311
|
+
`semanticMerge must be an object when present (got ${describeValue(block)}). Remove the key to fall back to the defaults.`,
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
const raw = (block ?? {}) as Record<string, unknown>;
|
|
315
|
+
const parseGate = (key: string, fallback: boolean): boolean => {
|
|
316
|
+
if (!Object.hasOwn(raw, key)) return fallback;
|
|
317
|
+
const value = raw[key];
|
|
318
|
+
const coerced = coerceBool(value, `semanticMerge.${key}`);
|
|
319
|
+
if (coerced === undefined) {
|
|
320
|
+
throw new Error(
|
|
321
|
+
`semanticMerge.${key} must be a boolean or one of "true"/"false"/"1"/"0"/"yes"/"no"/"on"/"off" (got ${describeValue(value)}).`,
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
return coerced;
|
|
325
|
+
};
|
|
326
|
+
const minSimilarityPresent = Object.hasOwn(raw, "minSimilarity");
|
|
327
|
+
const minSimilarity = minSimilarityPresent
|
|
328
|
+
? parseMinMergeScore(raw.minSimilarity)
|
|
329
|
+
: DEFAULT_SEMANTIC_MERGE_MIN;
|
|
330
|
+
// Round N+2 (D) — distinguish an ABSENT key from a present-but-unparseable
|
|
331
|
+
// value (#1/#39/#45): coerceNumber returns undefined for "abc", objects,
|
|
332
|
+
// NaN, and ±Infinity, and an undefined result here must never fall back to
|
|
333
|
+
// the default — that would silently enable judge lookups under an invalid
|
|
334
|
+
// config. Only a key absent from the own-property set means "use the
|
|
335
|
+
// default"; present-but-`undefined` is invalid like any other bad value.
|
|
336
|
+
const maxCandidates = (() => {
|
|
337
|
+
if (!Object.hasOwn(raw, "maxCandidates")) return DEFAULT_SEMANTIC_MERGE_CANDIDATES;
|
|
338
|
+
const rawCandidatesValue = raw.maxCandidates;
|
|
339
|
+
const rawCandidates = coerceNumber(rawCandidatesValue, "semanticMerge.maxCandidates");
|
|
340
|
+
if (rawCandidates === undefined || !Number.isInteger(rawCandidates) || rawCandidates < 0) {
|
|
341
|
+
throw new Error(
|
|
342
|
+
`semanticMerge.maxCandidates must be an integer >= 0 (got ${describeValue(rawCandidatesValue)}). Remove the key to use the default (${DEFAULT_SEMANTIC_MERGE_CANDIDATES}) or set 0 to disable merging entirely.`,
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
return rawCandidates;
|
|
346
|
+
})();
|
|
347
|
+
const categories = (() => {
|
|
348
|
+
if (!Object.hasOwn(raw, "categories")) return [...DEFAULT_SEMANTIC_MERGE_CATEGORIES];
|
|
349
|
+
const rawCategories = raw.categories;
|
|
350
|
+
if (
|
|
351
|
+
!Array.isArray(rawCategories) ||
|
|
352
|
+
!rawCategories.every((c) => typeof c === "string" && c.length > 0)
|
|
353
|
+
) {
|
|
354
|
+
throw new Error(
|
|
355
|
+
`semanticMerge.categories must be an array of non-empty category names (got ${describeValue(rawCategories)}).`,
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
const invalidCategory = rawCategories.find(
|
|
359
|
+
(c) => !MERGEABLE_MEMORY_CATEGORIES.includes(c),
|
|
360
|
+
);
|
|
361
|
+
if (invalidCategory !== undefined) {
|
|
362
|
+
throw new Error(
|
|
363
|
+
`semanticMerge.categories contains an unknown or never-mergeable category: ${describeValue(invalidCategory)}. Valid categories: ${MERGEABLE_MEMORY_CATEGORIES.join(", ")}. The episodic and immutable categories (${REFUSED_MERGE_CATEGORIES.join(", ")}) never merge and cannot be listed.`,
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
return [...rawCategories];
|
|
367
|
+
})();
|
|
368
|
+
const enabled = parseGate("enabled", false);
|
|
369
|
+
const dedupThreshold = semanticDedupThresholdFrom(cfg);
|
|
370
|
+
if ((enabled || minSimilarityPresent) && minSimilarity >= dedupThreshold) {
|
|
371
|
+
throw new Error(
|
|
372
|
+
`semanticMerge.minSimilarity (${minSimilarity}) must be strictly below semanticDedupThreshold (${dedupThreshold}) — the near-duplicate skip path owns similarities at or above it.`,
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
semanticMerge: {
|
|
377
|
+
enabled,
|
|
378
|
+
minSimilarity,
|
|
379
|
+
maxCandidates,
|
|
380
|
+
categories,
|
|
381
|
+
shadowMode: parseGate("shadowMode", false),
|
|
382
|
+
},
|
|
383
|
+
};
|
|
384
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { coerceBooleanLike, coerceNumber } from "../connectors/coerce.js";
|
|
2
|
+
import { connectorMatchesScope, normalizeConnectorScope } from "./connector-scope.js";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Embedding-density novelty gate (issue #1953, SAGE).
|
|
@@ -64,6 +65,11 @@ function cosine(a: number[], b: number[]): number {
|
|
|
64
65
|
return raw;
|
|
65
66
|
}
|
|
66
67
|
|
|
68
|
+
/** The semantic-dedup threshold exactly as `parseWritePathDedupConfig` resolves it. */
|
|
69
|
+
export function semanticDedupThresholdFrom(cfg: Record<string, unknown>): number {
|
|
70
|
+
return clamp01(coerceNumber(cfg.semanticDedupThreshold, "semanticDedupThreshold"), 0.92);
|
|
71
|
+
}
|
|
72
|
+
|
|
67
73
|
export function parseWritePathDedupConfig(cfg: Record<string, unknown>): WritePathDedupConfig {
|
|
68
74
|
const rawCandidates = coerceNumber(cfg.semanticDedupCandidates, "semanticDedupCandidates");
|
|
69
75
|
let semanticDedupCandidates = 5;
|
|
@@ -73,10 +79,7 @@ export function parseWritePathDedupConfig(cfg: Record<string, unknown>): WritePa
|
|
|
73
79
|
}
|
|
74
80
|
return {
|
|
75
81
|
semanticDedupEnabled: coerceBooleanLike(cfg.semanticDedupEnabled, "semanticDedupEnabled") !== false,
|
|
76
|
-
semanticDedupThreshold:
|
|
77
|
-
coerceNumber(cfg.semanticDedupThreshold, "semanticDedupThreshold"),
|
|
78
|
-
0.92,
|
|
79
|
-
),
|
|
82
|
+
semanticDedupThreshold: semanticDedupThresholdFrom(cfg),
|
|
80
83
|
semanticDedupCandidates,
|
|
81
84
|
noveltyGateEnabled: coerceBooleanLike(cfg.noveltyGateEnabled, "noveltyGateEnabled") === true,
|
|
82
85
|
noveltyAddThreshold: clamp01(
|
|
@@ -96,12 +99,11 @@ export function embeddingsFromCosineHits(
|
|
|
96
99
|
): { embedding: number[]; neighborhood: NoveltyNeighbor[] } {
|
|
97
100
|
// Connector-aware scoping (PR #2564 review finding on 54d865cb9): a
|
|
98
101
|
// neighbor from a different (or unattributed) connector must not drive a
|
|
99
|
-
// noop —
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
: hits;
|
|
102
|
+
// noop — the shared contract in `connector-scope.ts`, also applied by the
|
|
103
|
+
// semantic skip gate and merge-on-write. Candidates without a connector
|
|
104
|
+
// keep the unscoped neighborhood.
|
|
105
|
+
const scope = normalizeConnectorScope(opts.candidateConnector);
|
|
106
|
+
const scoped = hits.filter((hit) => connectorMatchesScope(hit.sourceConnector, scope));
|
|
105
107
|
return {
|
|
106
108
|
embedding: [1, 0],
|
|
107
109
|
neighborhood: scoped.map((hit) => {
|
package/src/dedup/semantic.ts
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* Related issue: joshuaswarren/remnic#373
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { connectorMatchesScope, normalizeConnectorScope } from "./connector-scope.js";
|
|
17
|
+
|
|
16
18
|
// ── Public types ──────────────────────────────────────────────────────────────
|
|
17
19
|
|
|
18
20
|
/** A single nearest-neighbor hit from the embedding backend. */
|
|
@@ -152,13 +154,10 @@ export async function decideSemanticDedup(
|
|
|
152
154
|
return { action: "keep", reason: "no_candidates" };
|
|
153
155
|
}
|
|
154
156
|
|
|
155
|
-
// Resolve the candidate's provenance connector
|
|
156
|
-
// value is treated as
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
options.sourceConnector.trim().length > 0
|
|
160
|
-
? options.sourceConnector.trim()
|
|
161
|
-
: undefined;
|
|
157
|
+
// Resolve the candidate's provenance connector through the shared scope
|
|
158
|
+
// contract (`connector-scope.ts`): an empty/whitespace value is treated as
|
|
159
|
+
// absent (operator / unattributed).
|
|
160
|
+
const candidateConnector = normalizeConnectorScope(options.sourceConnector);
|
|
162
161
|
|
|
163
162
|
// Defensive: callers ought to return sorted, but don't trust it.
|
|
164
163
|
let top: SemanticDedupHit | undefined;
|
|
@@ -182,8 +181,7 @@ export async function decideSemanticDedup(
|
|
|
182
181
|
}
|
|
183
182
|
if (
|
|
184
183
|
candidateConnector !== undefined &&
|
|
185
|
-
|
|
186
|
-
hit.sourceConnector.trim() === candidateConnector &&
|
|
184
|
+
connectorMatchesScope(hit.sourceConnector, candidateConnector) &&
|
|
187
185
|
(!sameConnectorTop || hit.score > sameConnectorTop.score)
|
|
188
186
|
) {
|
|
189
187
|
sameConnectorTop = hit;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sibling of {@link "./graph.js"} holding the append-failure error type so
|
|
3
|
+
* graph.ts stays within its file-size ratchet cap (issue #1995). Type-only
|
|
4
|
+
* dependency on GraphEdge — no runtime cycle with graph.ts.
|
|
5
|
+
*/
|
|
6
|
+
import type { GraphEdge } from "./graph.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Issue #2330 round N+16 (A): thrown by `GraphIndex.onMemoryWritten` when an
|
|
10
|
+
* append fails, carrying the rows this call had ALREADY appended — tracked
|
|
11
|
+
* incrementally as each row is written, before any return value exists. A
|
|
12
|
+
* rollback that only sees the raw failure used to fall back to a node-wide
|
|
13
|
+
* sweep, which also deleted rows a NEWER writer had rebuilt inside the
|
|
14
|
+
* failing writer's window; with the partial set on the error, the rollback
|
|
15
|
+
* stays surgical even on the throwing path. The original failure is
|
|
16
|
+
* preserved as `cause` (create-path callers only log it).
|
|
17
|
+
*/
|
|
18
|
+
export class GraphEdgeAppendError extends Error {
|
|
19
|
+
readonly appendedEdges: readonly GraphEdge[];
|
|
20
|
+
constructor(cause: unknown, appendedEdges: readonly GraphEdge[]) {
|
|
21
|
+
super(
|
|
22
|
+
`graph edge append failed after ${appendedEdges.length} row(s): ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
23
|
+
{ cause },
|
|
24
|
+
);
|
|
25
|
+
this.name = "GraphEdgeAppendError";
|
|
26
|
+
this.appendedEdges = appendedEdges;
|
|
27
|
+
}
|
|
28
|
+
}
|