@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
|
@@ -74,7 +74,7 @@ import {
|
|
|
74
74
|
} from "../behavior-signals.js";
|
|
75
75
|
import { buildProcedurePersistBody } from "../procedural/procedure-types.js";
|
|
76
76
|
import { stripAttributesSuffix } from "../structured-attributes.js";
|
|
77
|
-
import {
|
|
77
|
+
import { resolveWriteSubject } from "../memory-subject.js";
|
|
78
78
|
import { LocalLlmClient } from "../local-llm.js";
|
|
79
79
|
import type { ExtractionEngine } from "../extraction.js";
|
|
80
80
|
import {
|
|
@@ -102,9 +102,13 @@ import type {
|
|
|
102
102
|
MemoryCategory,
|
|
103
103
|
} from "../types.js";
|
|
104
104
|
import {
|
|
105
|
+
createBatchPromotedCopyProbe,
|
|
105
106
|
flushDeferredFactHashOnFailure,
|
|
107
|
+
makeSubjectGuardAllows,
|
|
106
108
|
profileAutoPromotionAllows,
|
|
107
109
|
readActiveMemoriesBothTiers,
|
|
110
|
+
promotionWithholdsToolScope,
|
|
111
|
+
promoteAndReconcileMergedTarget,
|
|
108
112
|
shouldPromoteToShared,
|
|
109
113
|
} from "./extraction-persist-promotion.js";
|
|
110
114
|
import type { ExtractionPersistDeps } from "./extraction-persist-deps.js";
|
|
@@ -116,7 +120,10 @@ import {
|
|
|
116
120
|
resolvePersistedMemoryRelativePath,
|
|
117
121
|
} from "../orchestrator.js";
|
|
118
122
|
import type { HarmonicConstructionInput } from "../harmonic-construction.js";
|
|
119
|
-
import { persistConstructedHarmonicRecords } from "./harmonic-construction-persist.js";
|
|
123
|
+
import { enqueueMergedTargetForHarmonicConstruction, persistConstructedHarmonicRecords } from "./harmonic-construction-persist.js";
|
|
124
|
+
import { applySemanticMergeAtPersist, runMergedTargetPostEffects, writeMergedVerbatimArtifact } from "./semantic-merge-persist.js";
|
|
125
|
+
import { buildMergedTargetPromotionPayload } from "./semantic-merge-promotion-payload.js";
|
|
126
|
+
import { persistMergedTargetThreadEpisode } from "./semantic-merge-commit-effects.js";
|
|
120
127
|
import { ExtractionAnchorSnapshot } from "./extraction-anchor-snapshot.js";
|
|
121
128
|
|
|
122
129
|
export class ExtractionPersistCoordinator {
|
|
@@ -173,6 +180,7 @@ export class ExtractionPersistCoordinator {
|
|
|
173
180
|
>();
|
|
174
181
|
const harmonicSourceInsertedAtBase = Date.now();
|
|
175
182
|
let harmonicSourceOrder = 0;
|
|
183
|
+
const promotedCopyProbe = createBatchPromotedCopyProbe(this.deps.config, this.deps.getStorageRouter, scopeProfileWritePlan); // #2330 finding F: one promoted-copy scan per namespace per batch
|
|
176
184
|
|
|
177
185
|
// Canonicalize stored content for dedup comparison: strip citations
|
|
178
186
|
// (using the same template), sanitize, then normalize whitespace.
|
|
@@ -269,7 +277,7 @@ export class ExtractionPersistCoordinator {
|
|
|
269
277
|
memoryPathById.set(id, relPath);
|
|
270
278
|
}
|
|
271
279
|
};
|
|
272
|
-
let dedupedCount = 0;
|
|
280
|
+
let dedupedCount = 0, semanticMergedCount = 0;
|
|
273
281
|
// Counter for facts skipped by the importance write-gate (issue #372).
|
|
274
282
|
let importanceGatedCount = 0;
|
|
275
283
|
// UUI2: short-circuit semantic dedup after first backend-unavailable signal
|
|
@@ -343,17 +351,7 @@ export class ExtractionPersistCoordinator {
|
|
|
343
351
|
const sourceConnector = sourceContext?.sourceConnector; const origin = classifyExtractionOrigin(sourceContext);
|
|
344
352
|
// Subject guard (issue #2372): the ONE gate shared by every extraction-side
|
|
345
353
|
// promotion path so behavior matches the spaces surface (§27).
|
|
346
|
-
const subjectGuardAllows = (
|
|
347
|
-
const decision = evaluateSubjectGuard({
|
|
348
|
-
subject,
|
|
349
|
-
sharedTarget: isSharedPromotionTarget(target),
|
|
350
|
-
mode: this.deps.config.subjectGuard,
|
|
351
|
-
});
|
|
352
|
-
if (decision.action !== "allow") {
|
|
353
|
-
log.warn(`subject-guard(${decision.action}) ${label}: ${decision.reason}`);
|
|
354
|
-
}
|
|
355
|
-
return decision.action !== "reject";
|
|
356
|
-
};
|
|
354
|
+
const subjectGuardAllows = makeSubjectGuardAllows(this.deps.config);
|
|
357
355
|
const promoteMemoryToProfileTargets = async (options: {
|
|
358
356
|
sourceStorage: StorageManager;
|
|
359
357
|
category: string;
|
|
@@ -374,6 +372,8 @@ export class ExtractionPersistCoordinator {
|
|
|
374
372
|
observedAt?: string;
|
|
375
373
|
eventTimeSource?: "extracted" | "assumed";
|
|
376
374
|
source: string;
|
|
375
|
+
/** Origin override: the COMMITTED target's retained origin (merged-target promotion). */
|
|
376
|
+
origin?: string;
|
|
377
377
|
sources?: ProvenanceSource[];
|
|
378
378
|
provenance?: "verified" | "unverified" | "none";
|
|
379
379
|
toolScoped?: true;
|
|
@@ -382,12 +382,12 @@ export class ExtractionPersistCoordinator {
|
|
|
382
382
|
HarmonicConstructionInput["persistedFacts"][number],
|
|
383
383
|
"memoryId"
|
|
384
384
|
>;
|
|
385
|
-
}): Promise<
|
|
385
|
+
}): Promise<string[]> => {
|
|
386
386
|
if (
|
|
387
387
|
!scopeProfileWritePlan ||
|
|
388
388
|
!profileAutoPromotionAllows(scopeProfileWritePlan, options.category, options.confidence)
|
|
389
389
|
)
|
|
390
|
-
return;
|
|
390
|
+
return [];
|
|
391
391
|
const autoTargets = new Set(scopeProfileWritePlan.profile.autoPromote.targets);
|
|
392
392
|
const targets = scopeProfileWritePlan.promotionTargets.filter(
|
|
393
393
|
(target) =>
|
|
@@ -396,13 +396,14 @@ export class ExtractionPersistCoordinator {
|
|
|
396
396
|
target.authorized &&
|
|
397
397
|
target.namespace,
|
|
398
398
|
);
|
|
399
|
-
if (targets.length === 0) return;
|
|
399
|
+
if (targets.length === 0) return [];
|
|
400
400
|
const rawContent =
|
|
401
401
|
citationEnabled && hasCitationForTemplate(options.content, citationTemplate)
|
|
402
402
|
? stripCitationForTemplate(options.content, citationTemplate)
|
|
403
403
|
: options.content;
|
|
404
404
|
const citedContent = applyInlineCitation(rawContent);
|
|
405
405
|
const sanitizedBase = sanitizeMemoryContent(rawContent);
|
|
406
|
+
const writtenCopyIds: string[] = [];
|
|
406
407
|
for (const target of targets) {
|
|
407
408
|
if (!target.namespace) continue;
|
|
408
409
|
try {
|
|
@@ -417,7 +418,7 @@ export class ExtractionPersistCoordinator {
|
|
|
417
418
|
{
|
|
418
419
|
content: citedContent,
|
|
419
420
|
category: options.category as MemoryCategory,
|
|
420
|
-
origin, confidence: options.confidence,
|
|
421
|
+
origin: options.origin ?? origin, confidence: options.confidence,
|
|
421
422
|
tags: withReservedMarkerTag(options.tags, `${target.target}-promotion`),
|
|
422
423
|
entityRef: options.entityRef,
|
|
423
424
|
structuredAttributes: options.structuredAttributes,
|
|
@@ -531,9 +532,9 @@ export class ExtractionPersistCoordinator {
|
|
|
531
532
|
);
|
|
532
533
|
}
|
|
533
534
|
}
|
|
534
|
-
// #1645 TV6:
|
|
535
|
-
// active copy) — skip catalog/index/behavior like postWriteGuard.
|
|
535
|
+
// #1645 TV6: tombstone-blocked = pending_review; skip catalog/index/behavior.
|
|
536
536
|
if (!targetPromotion.tombstoneBlocked) {
|
|
537
|
+
writtenCopyIds.push(promotedId);
|
|
537
538
|
trackPersistedId(targetStorage, promotedId, {
|
|
538
539
|
includeReturnedIds: false,
|
|
539
540
|
category: options.category as MemoryCategory,
|
|
@@ -558,6 +559,7 @@ export class ExtractionPersistCoordinator {
|
|
|
558
559
|
);
|
|
559
560
|
}
|
|
560
561
|
}
|
|
562
|
+
return writtenCopyIds;
|
|
561
563
|
};
|
|
562
564
|
const promoteMemoryToShared = async (options: {
|
|
563
565
|
sourceStorage: StorageManager;
|
|
@@ -580,7 +582,10 @@ export class ExtractionPersistCoordinator {
|
|
|
580
582
|
observedAt?: string;
|
|
581
583
|
eventTimeSource?: "extracted" | "assumed";
|
|
582
584
|
source: string;
|
|
585
|
+
origin?: string;
|
|
583
586
|
sourceConnector?: string;
|
|
587
|
+
/** Committed-record tool-scope marker — see {@link promotionWithholdsToolScope}. */
|
|
588
|
+
toolScoped?: true;
|
|
584
589
|
procedureSteps?: ReadonlyArray<{ toolCall?: { kind?: string } }>;
|
|
585
590
|
/** Claim-level provenance spans (issue #1575 PR 2). */
|
|
586
591
|
sources?: ProvenanceSource[];
|
|
@@ -590,13 +595,16 @@ export class ExtractionPersistCoordinator {
|
|
|
590
595
|
HarmonicConstructionInput["persistedFacts"][number],
|
|
591
596
|
"memoryId"
|
|
592
597
|
>;
|
|
593
|
-
}): Promise<
|
|
594
|
-
const toolScoped =
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
598
|
+
}): Promise<string | undefined> => {
|
|
599
|
+
const toolScoped = promotionWithholdsToolScope(options);
|
|
600
|
+
// P1-A (#2330 N+8): every exit returns the LAST copy id written, profile copies included.
|
|
601
|
+
let promotedCopyId = (
|
|
602
|
+
await promoteMemoryToProfileTargets({
|
|
603
|
+
...options,
|
|
604
|
+
...(toolScoped ? { toolScoped: true as const } : {}),
|
|
605
|
+
})
|
|
606
|
+
).at(-1);
|
|
607
|
+
if (lifecycleCaps.extractionScopeClassification && toolScoped) return promotedCopyId;
|
|
600
608
|
if (
|
|
601
609
|
!shouldPromoteToShared(
|
|
602
610
|
this.deps.config,
|
|
@@ -608,20 +616,17 @@ export class ExtractionPersistCoordinator {
|
|
|
608
616
|
options.confidence,
|
|
609
617
|
)
|
|
610
618
|
)
|
|
611
|
-
return;
|
|
612
|
-
if (!subjectGuardAllows(options.subject, "serverShared", "shared promotion"))
|
|
619
|
+
return promotedCopyId;
|
|
620
|
+
if (!subjectGuardAllows(options.subject, "serverShared", "shared promotion"))
|
|
621
|
+
return promotedCopyId;
|
|
613
622
|
try {
|
|
614
623
|
const sharedStorage = await this.deps.getStorageRouter().storageFor(
|
|
615
624
|
this.deps.config.sharedNamespace,
|
|
616
625
|
);
|
|
617
|
-
// Dedup gate:
|
|
618
|
-
//
|
|
619
|
-
//
|
|
620
|
-
//
|
|
621
|
-
// and build the attribute-enriched body with normalizeAttributePairs
|
|
622
|
-
// — the same canonicalization writeMemory applies — so the hash
|
|
623
|
-
// lookup uses the exact body writeMemory stores (#369/#401, #402
|
|
624
|
-
// round-6 fixes; PRRT_kwDORJXyws56VHZc / VHth).
|
|
626
|
+
// Dedup gate: strip any pre-existing citation, sanitize, and build
|
|
627
|
+
// the attribute-enriched body with normalizeAttributePairs — the
|
|
628
|
+
// same canonicalization writeMemory applies — so the hash lookup
|
|
629
|
+
// uses the exact body writeMemory stores (#369/#401, #402 round-6).
|
|
625
630
|
const rawContent =
|
|
626
631
|
citationEnabled &&
|
|
627
632
|
hasCitationForTemplate(options.content, citationTemplate)
|
|
@@ -629,15 +634,13 @@ export class ExtractionPersistCoordinator {
|
|
|
629
634
|
: options.content;
|
|
630
635
|
const citedContent = applyInlineCitation(rawContent);
|
|
631
636
|
const sanitizedBase = sanitizeMemoryContent(rawContent);
|
|
632
|
-
// Compose BEFORE the dedup gate (#2014 round 2):
|
|
633
|
-
//
|
|
634
|
-
// supersession keys below must all describe the SURVIVING fields that
|
|
635
|
-
// writeSealedMemory actually persists — never the raw extractor map.
|
|
637
|
+
// Compose BEFORE the dedup gate (#2014 round 2): the dedup hash, contentHashSource, and
|
|
638
|
+
// supersession keys must describe the SURVIVING fields writeSealedMemory persists.
|
|
636
639
|
const sharedPromotionEnvelope = composeSalvagedExtractionEnvelope(
|
|
637
640
|
{
|
|
638
641
|
content: citedContent,
|
|
639
642
|
category: options.category as MemoryCategory,
|
|
640
|
-
origin, confidence: options.confidence,
|
|
643
|
+
origin: options.origin ?? origin, confidence: options.confidence,
|
|
641
644
|
tags: withReservedMarkerTag(options.tags, "shared-promotion"),
|
|
642
645
|
entityRef: options.entityRef,
|
|
643
646
|
structuredAttributes: options.structuredAttributes,
|
|
@@ -658,12 +661,8 @@ export class ExtractionPersistCoordinator {
|
|
|
658
661
|
options.category === "fact" &&
|
|
659
662
|
(await sharedStorage.hasFactContentHash(dedupContent))
|
|
660
663
|
) {
|
|
661
|
-
// Connector identity gate:
|
|
662
|
-
//
|
|
663
|
-
// must not cross-patch each other's temporal fields (codex finding:
|
|
664
|
-
// temporal backfill occurred before connector mismatch check).
|
|
665
|
-
// Fail-open: on scan error backfill proceeds (preserving prior
|
|
666
|
-
// best-effort behaviour).
|
|
664
|
+
// Connector identity gate: backfill bounds only onto a same-connector fact (no cross-patch).
|
|
665
|
+
// Fail-open: on scan error backfill proceeds (prior best-effort behaviour).
|
|
667
666
|
let sharedSameConnector = true;
|
|
668
667
|
if (options.invalidAt || options.validAt) {
|
|
669
668
|
try {
|
|
@@ -816,7 +815,7 @@ export class ExtractionPersistCoordinator {
|
|
|
816
815
|
if (hashDedupSupersession.supersededIds.length > 0) {
|
|
817
816
|
}
|
|
818
817
|
// Active matching fact exists — normal short-circuit is safe.
|
|
819
|
-
return;
|
|
818
|
+
return promotedCopyId;
|
|
820
819
|
}
|
|
821
820
|
// No active same-entity shared fact found with this content hash.
|
|
822
821
|
// This can happen when the previously-written shared fact has since
|
|
@@ -843,7 +842,7 @@ export class ExtractionPersistCoordinator {
|
|
|
843
842
|
// A matching active shared fact was confirmed — skip the write to
|
|
844
843
|
// avoid duplicating content that is already present. The existing
|
|
845
844
|
// fact remains active and the supersession failure is logged above.
|
|
846
|
-
return;
|
|
845
|
+
return promotedCopyId;
|
|
847
846
|
}
|
|
848
847
|
// Lookup did not complete or no candidate was found — we cannot
|
|
849
848
|
// confirm a duplicate. Fall through to the write + post-write
|
|
@@ -877,7 +876,7 @@ export class ExtractionPersistCoordinator {
|
|
|
877
876
|
skipSharedPromotion = false;
|
|
878
877
|
}
|
|
879
878
|
if (skipSharedPromotion) {
|
|
880
|
-
return;
|
|
879
|
+
return promotedCopyId;
|
|
881
880
|
}
|
|
882
881
|
// No same-connector active shared fact — fall through to write.
|
|
883
882
|
}
|
|
@@ -962,10 +961,13 @@ export class ExtractionPersistCoordinator {
|
|
|
962
961
|
}),
|
|
963
962
|
);
|
|
964
963
|
}
|
|
964
|
+
promotedCopyId = promotedId; // feeds the merged-target reconciliation (round N+7 B)
|
|
965
|
+
return promotedId;
|
|
965
966
|
} catch (err) {
|
|
966
967
|
log.warn(
|
|
967
968
|
`persistExtraction: shared promotion failed open for ${options.sourceMemoryId}: ${err}`,
|
|
968
969
|
);
|
|
970
|
+
return promotedCopyId; // P1-A: profile copies written pre-failure still reconcile
|
|
969
971
|
}
|
|
970
972
|
};
|
|
971
973
|
// #1707 thread 1 — backfill temporal bounds onto promotion copies when the
|
|
@@ -2306,11 +2308,7 @@ export class ExtractionPersistCoordinator {
|
|
|
2306
2308
|
);
|
|
2307
2309
|
}
|
|
2308
2310
|
} finally {
|
|
2309
|
-
//
|
|
2310
|
-
// Touch immediately around the chunk-write loop so a later chunk
|
|
2311
|
-
// failure still surfaces the partially durable parent/chunk files to
|
|
2312
|
-
// catalog-driven `writtenSince` maintenance. The final touch below
|
|
2313
|
-
// still refreshes `lastWriteAt` after later durable writes on success.
|
|
2311
|
+
// #1522: the catalog write touch lives in the storage chokepoint.
|
|
2314
2312
|
}
|
|
2315
2313
|
|
|
2316
2314
|
if (routedRuleId) {
|
|
@@ -2503,11 +2501,7 @@ export class ExtractionPersistCoordinator {
|
|
|
2503
2501
|
}
|
|
2504
2502
|
}
|
|
2505
2503
|
} finally {
|
|
2506
|
-
//
|
|
2507
|
-
// source-namespace durable mutations — temporal supersession, shared
|
|
2508
|
-
// promotion, optional artifact writes, and graph-edge writes — so
|
|
2509
|
-
// `lastWriteAt` cannot precede later file changes on successful
|
|
2510
|
-
// completion. Use the KNOWN routed name, not a dir-decoded guess.
|
|
2504
|
+
// #1522: the catalog write touch lives in the storage chokepoint.
|
|
2511
2505
|
}
|
|
2512
2506
|
trackBehaviorSignals(
|
|
2513
2507
|
targetStorage,
|
|
@@ -2545,35 +2539,49 @@ export class ExtractionPersistCoordinator {
|
|
|
2545
2539
|
? classifyMemoryKind(fact.content, fact.tags ?? [], writeCategory)
|
|
2546
2540
|
: undefined;
|
|
2547
2541
|
|
|
2548
|
-
// Normal write (no chunking)
|
|
2549
|
-
|
|
2550
|
-
// (when verbatim artifacts are enabled) share the same citation timestamp.
|
|
2551
|
-
// Calling applyInlineCitation twice on the same raw content would produce
|
|
2552
|
-
// two different timestamps, creating duplicate citations with divergent
|
|
2553
|
-
// provenance metadata on the memory and artifact copies of the same fact.
|
|
2554
|
-
// Pass the RAW (pre-citation) fact as `contentHashSource` so the
|
|
2555
|
-
// fact-content hash index records the hash of the canonical fact text
|
|
2556
|
-
// rather than the citation-annotated variant. When inline attribution is
|
|
2557
|
-
// enabled, `applyInlineCitation` appends a timestamp-bearing marker, so
|
|
2558
|
-
// hashing the persisted body would produce a different hash on every
|
|
2559
|
-
// write and defeat cross-session dedup (see `findDuplicateExplicitCapture`
|
|
2560
|
-
// in explicit-capture.ts which calls `hasFactContentHash(candidate.content)`
|
|
2561
|
-
// on raw content).
|
|
2562
|
-
const rawPersistBody =
|
|
2563
|
-
writeCategory === "procedure"
|
|
2564
|
-
? buildProcedurePersistBody(fact.content, fact.procedureSteps)
|
|
2565
|
-
: fact.content;
|
|
2542
|
+
// Normal write (no chunking). Cite once so memory and artifact copies share one timestamp; hash the RAW pre-citation text. Merge-on-write (#2330): a judge-approved in-band match updates in place; uncarryable metadata, promoted copies, backend outage, and a novelty-add decision bypass to this write.
|
|
2543
|
+
const rawPersistBody = writeCategory === "procedure" ? buildProcedurePersistBody(fact.content, fact.procedureSteps) : fact.content;
|
|
2566
2544
|
const citedFactContent = applyInlineCitation(rawPersistBody);
|
|
2545
|
+
const semanticMerge = await applySemanticMergeAtPersist(this.deps, {
|
|
2546
|
+
storage: targetStorage, content: fact.content, category: writeCategory, sources: fact.sources, sourceConnector: extractionSourceConnector,
|
|
2547
|
+
incomingMetadata: { tags: [...fact.tags, ...injectionScreenTags], entityRef: fact.entityRef, structuredAttributes: fact.structuredAttributes, validAt: biTemporal ? biTemporal.validFrom : sourceContext?.validAt, biTemporal: biTemporal !== undefined, importanceScore: importance.score, confidence: fact.confidence, provenanceStrength: fact.provenance, toolScoped: factToolScoped, subject: factSubject, origin, faithfulness: faithfulnessFm, memoryKind }, skip: contradictionDetected || faithfulnessEnforceStatus === "pending_review" || batchBackendUnavailable || novelty.decision === "add",
|
|
2548
|
+
incomingLinks: links.length > 0 ? links : undefined, incomingCitedContent: citedFactContent,
|
|
2549
|
+
targetHasPromotedCopies: (targetId) => promotedCopyProbe.check(targetStorage, targetId),
|
|
2550
|
+
});
|
|
2551
|
+
if (semanticMerge.action === "created" && semanticMerge.reason === "backend_unavailable") batchBackendUnavailable = true; // arms the batch short circuit for the remaining facts
|
|
2552
|
+
if (semanticMerge.action === "merged") {
|
|
2553
|
+
semanticMergedCount++;
|
|
2554
|
+
await anchorSnapshots.replace(targetStorage, semanticMerge.targetId, writeCategory, memoryPathById);
|
|
2555
|
+
// D + final round (A/B) + N+7 (A/B) + N+18 (B): with no promoted copies the create path's promotion must still run — fail-open, the merge stands — and its payload derives SOLELY from the re-read committed record (no field reads the incoming extraction; the null cases — replaced mid-flight, retired, degraded merge, or the isolated fail-open reread failure — are documented on buildMergedTargetPromotionPayload). After the current copy lands, any concurrently promoted PRE-merge copy is superseded. Promotion eligibility gates on the committed record's tier — the downgraded min(incoming, target) confidence where a lower incoming fact merged in.
|
|
2556
|
+
const mergedPromotion = await buildMergedTargetPromotionPayload(targetStorage, semanticMerge);
|
|
2557
|
+
// Round N+10 (A): promotion AND reconciliation — including the no-promotion path, where a below-threshold downgrade or a degraded merge writes no replacement copy but a concurrently published PRE-merge copy must still retire. See promoteAndReconcileMergedTarget.
|
|
2558
|
+
await promoteAndReconcileMergedTarget({ promote: (payload) => promoteMemoryToShared({ sourceStorage: targetStorage, ...payload }), config: this.deps.config, getStorageRouter: this.deps.getStorageRouter, scopeProfileWritePlan, sourceStorage: targetStorage, sourceMemoryId: semanticMerge.targetId, mergedPromotion, normalize: normalizeStoredHashSource, onReconciled: () => promotedCopyProbe.invalidate() });
|
|
2559
|
+
// Round N+7 (D): the merged body joins the INTERNAL temporal/tag index refresh (id-keyed, incremental); the PUBLIC persistedIds return stays new-fragment only. Round N+11 (B): the target is also persisted into the thread's DURABLE episode set via the same appendEpisodeIds path the create path uses — the batch-local adjacency list is not durable, so without this the target leaves the thread at the next extraction.
|
|
2560
|
+
trackPersistedId(targetStorage, semanticMerge.targetId, { includeReturnedIds: false });
|
|
2561
|
+
await persistMergedTargetThreadEpisode(this.deps.getThreading(), threadIdForExtraction, semanticMerge.targetId);
|
|
2562
|
+
// Finding B (round N+3): enqueue the surviving target so the end-of-batch harmonic pass covers the committed merged claims.
|
|
2563
|
+
if (harmonicConstructionEnabled) {
|
|
2564
|
+
enqueueMergedTargetForHarmonicConstruction(harmonicFactsByStorage, targetStorage, harmonicFact, semanticMerge.targetId, semanticMerge.mergedContent, new Date(harmonicSourceInsertedAtBase + harmonicSourceOrder++).toISOString());
|
|
2565
|
+
}
|
|
2566
|
+
// Round N+5 (A+B): create-path parity — the create path's graph-edge build and
|
|
2567
|
+
// behavior-signal ledger entry must also observe a committed merge.
|
|
2568
|
+
trackBehaviorSignals(targetStorage, await runMergedTargetPostEffects(this.deps, targetStorage, semanticMerge, {
|
|
2569
|
+
category: writeCategory, incomingContent: fact.content, incomingConfidence: fact.confidence,
|
|
2570
|
+
namespace: this.deps.storageDirNamespace(targetStorage.dir), graphCaps,
|
|
2571
|
+
graphContext: await ensureGraphContext(targetStorage),
|
|
2572
|
+
threadIdForEdge: threadIdForExtraction ?? undefined, threadEpisodeIdsForGraph,
|
|
2573
|
+
}));
|
|
2574
|
+
// Round N+17 (B): artifact write LAST; the helper isolates its own failure.
|
|
2575
|
+
await writeMergedVerbatimArtifact(this.deps, targetStorage, semanticMerge.targetId, { category: writeCategory, citedContent: citedFactContent, confidence: fact.confidence, tags: fact.tags, intent: inferredIntent ?? undefined, sourceConnector: extractionSourceConnector, origin, toolScoped: factToolScoped });
|
|
2576
|
+
continue;
|
|
2577
|
+
}
|
|
2567
2578
|
const factWriteEnvelope = composeSalvagedExtractionEnvelope(
|
|
2568
2579
|
{
|
|
2569
2580
|
content: citedFactContent,
|
|
2570
2581
|
category: writeCategory,
|
|
2571
2582
|
origin, confidence: fact.confidence,
|
|
2572
2583
|
tags: [...fact.tags, ...injectionScreenTags],
|
|
2573
|
-
entityRef:
|
|
2574
|
-
typeof (fact as any).entityRef === "string"
|
|
2575
|
-
? (fact as any).entityRef
|
|
2576
|
-
: undefined,
|
|
2584
|
+
entityRef: typeof fact.entityRef === "string" ? fact.entityRef : undefined,
|
|
2577
2585
|
structuredAttributes: fact.structuredAttributes,
|
|
2578
2586
|
validAt: biTemporal ? biTemporal.validFrom : sourceContext?.validAt,
|
|
2579
2587
|
...(extractionSourceConnector ? { sourceConnector: extractionSourceConnector } : {}),
|
|
@@ -2691,7 +2699,7 @@ export class ExtractionPersistCoordinator {
|
|
|
2691
2699
|
}
|
|
2692
2700
|
// Faithfulness gate (#1576, chatgpt P2): skip promotion for a
|
|
2693
2701
|
// pending_review fact so no active shared/profile copy bypasses the gate.
|
|
2694
|
-
if (!postWriteGuard) await promoteMemoryToShared({
|
|
2702
|
+
if (!postWriteGuard) { await promoteMemoryToShared({
|
|
2695
2703
|
sourceStorage: targetStorage,
|
|
2696
2704
|
category: writeCategory,
|
|
2697
2705
|
content: fact.content,
|
|
@@ -2723,7 +2731,7 @@ export class ExtractionPersistCoordinator {
|
|
|
2723
2731
|
...(fact.sources && fact.sources.length > 0 ? { sources: fact.sources } : {}),
|
|
2724
2732
|
...(fact.provenance ? { provenance: fact.provenance } : {}),
|
|
2725
2733
|
harmonicFact,
|
|
2726
|
-
});
|
|
2734
|
+
}); promotedCopyProbe.invalidate(); }
|
|
2727
2735
|
// v8.2: graph edge building (fail-open). #1576: skip pending_review facts.
|
|
2728
2736
|
if (graphCaps.multiGraphMemory && !postWriteGuard) {
|
|
2729
2737
|
try {
|
|
@@ -2812,13 +2820,6 @@ export class ExtractionPersistCoordinator {
|
|
|
2812
2820
|
// .md never outlives a missing shared fact-hash index entry.
|
|
2813
2821
|
await flushDeferredFactHashOnFailure(() => this.deps.saveContentHashIndexes(), factDedupEnabled);
|
|
2814
2822
|
throw err;
|
|
2815
|
-
} finally {
|
|
2816
|
-
// Catalog touch (issue #1499): record AFTER every synchronous
|
|
2817
|
-
// source-namespace mutation in the non-chunked path: writeMemory,
|
|
2818
|
-
// temporal supersession, graph edges, and optional verbatim artifacts.
|
|
2819
|
-
// The `finally` preserves the write touch when post-write indexing or
|
|
2820
|
-
// promotion fails after the canonical memory is already durable. Use the
|
|
2821
|
-
// KNOWN routed name, not a dir-decoded guess (NCQI0).
|
|
2822
2823
|
}
|
|
2823
2824
|
}
|
|
2824
2825
|
|
|
@@ -2985,7 +2986,7 @@ export class ExtractionPersistCoordinator {
|
|
|
2985
2986
|
);
|
|
2986
2987
|
}
|
|
2987
2988
|
|
|
2988
|
-
const dedupSuffix = dedupedCount > 0 ? ` (${dedupedCount} deduped)` : ""
|
|
2989
|
+
const dedupSuffix = `${dedupedCount > 0 ? ` (${dedupedCount} deduped)` : ""}${semanticMergedCount > 0 ? ` (${semanticMergedCount} merged)` : ""}`;
|
|
2989
2990
|
const gatedSuffix =
|
|
2990
2991
|
importanceGatedCount > 0 ? ` (${importanceGatedCount} gated)` : "";
|
|
2991
2992
|
const judgeSuffix =
|
|
@@ -2993,7 +2994,7 @@ export class ExtractionPersistCoordinator {
|
|
|
2993
2994
|
const redactionSuffix =
|
|
2994
2995
|
redactionGatedCount > 0 ? ` (${redactionGatedCount} redacted)` : "";
|
|
2995
2996
|
log.info(
|
|
2996
|
-
`persisted: ${facts.length - dedupedCount - importanceGatedCount - judgeGatedCount - redactionGatedCount} facts${dedupSuffix}${gatedSuffix}${judgeSuffix}${redactionSuffix}, ${entities.length} entities, ${questions.length} questions, ${profileUpdates.length} profile updates`,
|
|
2997
|
+
`persisted: ${facts.length - dedupedCount - importanceGatedCount - judgeGatedCount - redactionGatedCount - semanticMergedCount} facts${dedupSuffix}${gatedSuffix}${judgeSuffix}${redactionSuffix}, ${entities.length} entities, ${questions.length} questions, ${profileUpdates.length} profile updates`,
|
|
2997
2998
|
);
|
|
2998
2999
|
if (harmonicConstructionEnabled && harmonicFactsByStorage.size > 0) {
|
|
2999
3000
|
await persistConstructedHarmonicRecords({
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import type { StorageManager } from "../index.js";
|
|
4
|
+
import { deriveHarmonicRecords, type HarmonicConstructionInput } from "../harmonic-construction.js";
|
|
5
|
+
import { enqueueMergedTargetForHarmonicConstruction } from "./harmonic-construction-persist.js";
|
|
6
|
+
|
|
7
|
+
const storage = { dir: "/tmp/remnic-harmonic-coalesce" } as StorageManager;
|
|
8
|
+
|
|
9
|
+
function fact(cueAnchors: NonNullable<HarmonicConstructionInput["persistedFacts"][number]["cueAnchors"]>) {
|
|
10
|
+
return {
|
|
11
|
+
content: "placeholder — replaced by the committed body",
|
|
12
|
+
category: "fact",
|
|
13
|
+
tags: [],
|
|
14
|
+
cueAnchors,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
test("two merges into one target coalesce to one harmonic entry: final body, unioned anchors (round N+9 C)", () => {
|
|
19
|
+
const map = new Map<string, {
|
|
20
|
+
storage: StorageManager;
|
|
21
|
+
facts: HarmonicConstructionInput["persistedFacts"];
|
|
22
|
+
}>();
|
|
23
|
+
enqueueMergedTargetForHarmonicConstruction(
|
|
24
|
+
map,
|
|
25
|
+
storage,
|
|
26
|
+
fact([{ type: "tool", value: "atlas release workflow" }]),
|
|
27
|
+
"merge-target",
|
|
28
|
+
"first cumulative body",
|
|
29
|
+
"2026-08-22T10:00:00.000Z",
|
|
30
|
+
);
|
|
31
|
+
enqueueMergedTargetForHarmonicConstruction(
|
|
32
|
+
map,
|
|
33
|
+
storage,
|
|
34
|
+
fact([{ type: "entity", value: "Atlas PostgreSQL" }]),
|
|
35
|
+
"merge-target",
|
|
36
|
+
"second cumulative body",
|
|
37
|
+
"2026-08-22T11:00:00.000Z",
|
|
38
|
+
);
|
|
39
|
+
const facts = map.get(storage.dir)!.facts;
|
|
40
|
+
assert.equal(facts.length, 1, "one entry per target id, not one per merge");
|
|
41
|
+
assert.equal(facts[0]!.content, "second cumulative body", "the FINAL committed body wins");
|
|
42
|
+
assert.equal(facts[0]!.insertedAt, "2026-08-22T11:00:00.000Z");
|
|
43
|
+
assert.deepEqual(
|
|
44
|
+
facts[0]!.cueAnchors?.map((anchor) => anchor.value),
|
|
45
|
+
["atlas release workflow", "Atlas PostgreSQL"],
|
|
46
|
+
"cue anchors UNION across merges",
|
|
47
|
+
);
|
|
48
|
+
// End-to-end contract: the derived episode holds exactly one body per
|
|
49
|
+
// target (the final committed one) and anchors from BOTH merges survive.
|
|
50
|
+
const records = deriveHarmonicRecords({
|
|
51
|
+
sessionKey: "session-coalesce",
|
|
52
|
+
recordedAt: "2026-08-22T11:00:00.000Z",
|
|
53
|
+
persistedFacts: facts,
|
|
54
|
+
entityMentions: [],
|
|
55
|
+
});
|
|
56
|
+
const episode = records.nodes.find((node) => node.kind === "episode");
|
|
57
|
+
assert.ok(episode);
|
|
58
|
+
assert.equal(
|
|
59
|
+
(episode.summary.match(/cumulative body/g) ?? []).length,
|
|
60
|
+
1,
|
|
61
|
+
"the episode summary consumes ONE cumulative snapshot, not both",
|
|
62
|
+
);
|
|
63
|
+
assert.ok(episode.summary.includes("second"), "the snapshot is the FINAL committed body");
|
|
64
|
+
const anchorValues = records.anchors.map((anchor) => anchor.anchorValue);
|
|
65
|
+
assert.ok(
|
|
66
|
+
anchorValues.includes("atlas release workflow") && anchorValues.includes("Atlas PostgreSQL"),
|
|
67
|
+
"anchors from both merges reach the persisted anchor set",
|
|
68
|
+
);
|
|
69
|
+
});
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
persistHarmonicRecords,
|
|
8
8
|
} from "../harmonic-construction.js";
|
|
9
9
|
import { log } from "../logger.js";
|
|
10
|
+
import type { StorageManager } from "../index.js";
|
|
10
11
|
import type { ExtractionResult } from "../types.js";
|
|
11
12
|
|
|
12
13
|
export interface HarmonicPersistenceEntry {
|
|
@@ -36,6 +37,60 @@ export function filterHarmonicEntityMentions(
|
|
|
36
37
|
});
|
|
37
38
|
}
|
|
38
39
|
|
|
40
|
+
/**
|
|
41
|
+
* Finding B (round N+3, PR #2771): a successful merge-on-write commits new
|
|
42
|
+
* claims into an EXISTING target id. `persistedIds` stays new-fragment only
|
|
43
|
+
* by contract and cue anchors ride only through the per-fact harmonic
|
|
44
|
+
* entry, so without this enqueue a merge-only extraction emits no episode,
|
|
45
|
+
* abstraction node, or cue anchors for the committed claims. Enqueue the
|
|
46
|
+
* surviving target — with the COMMITTED merged body as content — into the
|
|
47
|
+
* same batch map the create path feeds, so the end-of-batch
|
|
48
|
+
* {@link persistConstructedHarmonicRecords} pass covers it.
|
|
49
|
+
*
|
|
50
|
+
* Round N+9 (C): two facts merging into the SAME target in one batch enqueue
|
|
51
|
+
* twice under one `memoryId`. `deriveHarmonicRecords` dedupes only
|
|
52
|
+
* `sourceMemoryIds` — `persistedFacts` keeps both entries, so the episode
|
|
53
|
+
* summary concatenated both cumulative snapshots and the inserted-at
|
|
54
|
+
* metadata overwrote its duplicate key. Coalesce instead: the entry for a
|
|
55
|
+
* repeated target is REPLACED by the latest committed body (each merge's
|
|
56
|
+
* body is cumulative, so the latest carries every claim) while the cue
|
|
57
|
+
* anchors UNION across merges — anchors are deduped by id downstream, but
|
|
58
|
+
* the union keeps the earlier merge's anchors alive when the later incoming
|
|
59
|
+
* fact carried none.
|
|
60
|
+
*/
|
|
61
|
+
export function enqueueMergedTargetForHarmonicConstruction(
|
|
62
|
+
entries: Map<
|
|
63
|
+
string,
|
|
64
|
+
{ storage: StorageManager; facts: HarmonicConstructionInput["persistedFacts"] }
|
|
65
|
+
>,
|
|
66
|
+
storage: StorageManager,
|
|
67
|
+
fact: Omit<
|
|
68
|
+
HarmonicConstructionInput["persistedFacts"][number],
|
|
69
|
+
"memoryId" | "insertedAt"
|
|
70
|
+
>,
|
|
71
|
+
memoryId: string,
|
|
72
|
+
content: string,
|
|
73
|
+
insertedAt: string,
|
|
74
|
+
): void {
|
|
75
|
+
const entry = entries.get(storage.dir) ?? { storage, facts: [] };
|
|
76
|
+
const prior = entry.facts.findIndex((existing) => existing.memoryId === memoryId);
|
|
77
|
+
if (prior !== -1) {
|
|
78
|
+
entry.facts[prior] = {
|
|
79
|
+
...fact,
|
|
80
|
+
content,
|
|
81
|
+
memoryId,
|
|
82
|
+
insertedAt,
|
|
83
|
+
cueAnchors: [
|
|
84
|
+
...(entry.facts[prior]!.cueAnchors ?? []),
|
|
85
|
+
...(fact.cueAnchors ?? []),
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
} else {
|
|
89
|
+
entry.facts.push({ ...fact, content, memoryId, insertedAt });
|
|
90
|
+
}
|
|
91
|
+
entries.set(storage.dir, entry);
|
|
92
|
+
}
|
|
93
|
+
|
|
39
94
|
export async function persistConstructedHarmonicRecords(options: {
|
|
40
95
|
entries: Iterable<HarmonicPersistenceEntry>;
|
|
41
96
|
baseStorageDir: string;
|
|
@@ -18,7 +18,7 @@ import path from "node:path";
|
|
|
18
18
|
import { type GraphConstructionCapabilitySet, resolveCapabilities, resolveGraphConstructionCapabilities, resolveIndexingCapabilities, resolveMemoryLifecycleCapabilities, resolveNamespaceCapabilities, resolveRecallEnhancementCapabilities } from "../capabilities.js";
|
|
19
19
|
import type { SemanticDedupHit } from "../dedup/semantic.js";
|
|
20
20
|
import { EmbeddingFallback } from "../embedding-fallback.js";
|
|
21
|
-
import { GraphIndex } from "../graph.js";
|
|
21
|
+
import { GraphIndex, type GraphEdge } from "../graph.js";
|
|
22
22
|
import { ContentHashIndex, StorageManager } from "../index.js";
|
|
23
23
|
import { log } from "../logger.js";
|
|
24
24
|
import { isActiveMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
|
|
@@ -335,7 +335,21 @@ export class PersistenceIndexCoordinator {
|
|
|
335
335
|
): Promise<void> {
|
|
336
336
|
if (!resolveMemoryLifecycleCapabilities(this.deps.config).embeddingFallback) return;
|
|
337
337
|
if (!(await this.deps.embeddingFallback.isAvailable())) return;
|
|
338
|
-
|
|
338
|
+
// #2330 round N+10 (B): getMemoryById is HOT-tier only, so a semantic
|
|
339
|
+
// merge's surviving target living under cold/ resolved to null and the
|
|
340
|
+
// embedding fallback kept serving the pre-merge text. Fall back to the
|
|
341
|
+
// same cold-aware id lookup the merge path used
|
|
342
|
+
// (getMemoryByIdIncludingArchived, PR #2771 N+9 B parity for the temporal
|
|
343
|
+
// refresh); retired records stay out via the active-status gate.
|
|
344
|
+
let memory = await storage.getMemoryById(memoryId);
|
|
345
|
+
if (!memory) {
|
|
346
|
+
const coldAware = await storage
|
|
347
|
+
.getMemoryByIdIncludingArchived(memoryId)
|
|
348
|
+
.catch(() => null);
|
|
349
|
+
if (coldAware && isActiveMemoryStatus(coldAware.frontmatter.status)) {
|
|
350
|
+
memory = coldAware;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
339
353
|
if (!memory) return;
|
|
340
354
|
await this.deps.embeddingFallback.indexFile(
|
|
341
355
|
memoryId,
|
|
@@ -361,7 +375,7 @@ export class PersistenceIndexCoordinator {
|
|
|
361
375
|
threadEpisodeIdsForGraph: string[] | undefined,
|
|
362
376
|
fallbackCausalPredecessor: string | undefined,
|
|
363
377
|
graphCaps: GraphConstructionCapabilitySet = resolveGraphConstructionCapabilities(this.deps.config),
|
|
364
|
-
): Promise<
|
|
378
|
+
): Promise<GraphEdge[]> {
|
|
365
379
|
// Entity siblings: other memories sharing the same entityRef
|
|
366
380
|
const entitySiblings: string[] = [];
|
|
367
381
|
if (entityRef) {
|
|
@@ -405,7 +419,7 @@ export class PersistenceIndexCoordinator {
|
|
|
405
419
|
}
|
|
406
420
|
const causalPredecessor =
|
|
407
421
|
recentInThread[recentInThread.length - 1] ?? fallbackCausalPredecessor;
|
|
408
|
-
await this.deps.graphIndexFor(storage).onMemoryWritten({
|
|
422
|
+
return await this.deps.graphIndexFor(storage).onMemoryWritten({
|
|
409
423
|
memoryPath: memoryRelPath,
|
|
410
424
|
entityRef,
|
|
411
425
|
content: factContent,
|
|
@@ -467,12 +481,26 @@ export class PersistenceIndexCoordinator {
|
|
|
467
481
|
: await storage.readAllMemories();
|
|
468
482
|
|
|
469
483
|
// Bootstrap: index only active (non-archived, non-superseded) memories.
|
|
470
|
-
// Incremental: index only the newly persisted IDs.
|
|
484
|
+
// Incremental: index only the newly persisted IDs. `readAllMemories`
|
|
485
|
+
// is HOT-tier only, so an id that lives under `cold/` (e.g. a semantic
|
|
486
|
+
// merge's surviving target — PR #2771 round N+9 B) is missing from the
|
|
487
|
+
// pool and the index keeps serving the pre-merge row. Fetch each
|
|
488
|
+
// missing id through the same cold-aware lookup the merge path used
|
|
489
|
+
// (`getMemoryByIdIncludingArchived`) instead of scanning the whole
|
|
490
|
+
// cold tier per batch.
|
|
471
491
|
const pool = needsFullRebuild
|
|
472
492
|
? allMemories.filter((m) => isActiveMemoryStatus(m.frontmatter.status))
|
|
473
|
-
: (() => {
|
|
493
|
+
: await (async () => {
|
|
474
494
|
const idSet = new Set(persistedIds);
|
|
475
|
-
|
|
495
|
+
const hot = allMemories.filter((m) => idSet.has(m.frontmatter.id));
|
|
496
|
+
for (const id of persistedIds) {
|
|
497
|
+
if (hot.some((m) => m.frontmatter.id === id)) continue;
|
|
498
|
+
const cold = await storage
|
|
499
|
+
.getMemoryByIdIncludingArchived(id)
|
|
500
|
+
.catch(() => null);
|
|
501
|
+
if (cold) hot.push(cold);
|
|
502
|
+
}
|
|
503
|
+
return hot;
|
|
476
504
|
})();
|
|
477
505
|
|
|
478
506
|
const entries: Array<{
|