@remnic/core 1.1.30 → 9.3.515
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 +2 -2
- package/dist/access-cli.d.ts +1 -1
- package/dist/access-cli.js +156 -119
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +9 -5
- package/dist/access-http.js +51 -51
- package/dist/access-idempotency.d.ts +2 -0
- package/dist/access-idempotency.js +1 -1
- package/dist/access-mcp.d.ts +16 -9
- package/dist/access-mcp.js +44 -44
- package/dist/access-schema.d.ts +47 -15
- package/dist/access-schema.js +8 -8
- package/dist/{access-service-B5hgZPCN.d.ts → access-service-qrrIrC-0.d.ts} +11 -129
- package/dist/access-service.d.ts +7 -4
- package/dist/access-service.js +40 -40
- package/dist/action-confidence.d.ts +1 -0
- package/dist/active-memory-bridge.d.ts +1 -0
- package/dist/active-memory-bridge.js +3 -2
- package/dist/active-recall.d.ts +1 -0
- package/dist/active-recall.js +14 -9
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/claude-code.d.ts +6 -2
- package/dist/adapters/claude-code.js +2 -2
- package/dist/adapters/codex.d.ts +5 -1
- package/dist/adapters/codex.js +2 -2
- package/dist/adapters/hermes.js +2 -2
- package/dist/adapters/index.js +6 -6
- package/dist/adapters/registry.js +6 -6
- package/dist/adapters/replit.d.ts +4 -2
- package/dist/adapters/replit.js +2 -2
- package/dist/adapters/types.d.ts +4 -0
- package/dist/adapters/types.js +1 -1
- package/dist/behavior-learner.d.ts +1 -0
- package/dist/behavior-signals.d.ts +1 -0
- package/dist/behavior-signals.js +1 -1
- package/dist/bootstrap.d.ts +5 -3
- package/dist/bootstrap.js +2 -2
- package/dist/boxes.d.ts +1 -0
- package/dist/boxes.js +1 -1
- package/dist/briefing.d.ts +1 -0
- package/dist/briefing.js +9 -9
- package/dist/buffer-surprise-report.d.ts +1 -0
- package/dist/buffer.d.ts +1 -0
- package/dist/buffer.js +2 -2
- package/dist/bulk-import/index.d.ts +28 -0
- package/dist/bulk-import/index.js +31 -0
- package/dist/calibration.d.ts +2 -0
- package/dist/calibration.js +50 -17
- package/dist/calibration.js.map +1 -1
- package/dist/{capsule-crypto-5CYAGVC5.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/{capsule-merge-4MGKE7C5.js → capsule-merge-T2JRE46P.js} +3 -3
- package/dist/causal-behavior.d.ts +1 -0
- package/dist/causal-behavior.js +4 -4
- package/dist/causal-chain.js +4 -4
- package/dist/causal-consolidation.d.ts +16 -1
- package/dist/causal-consolidation.js +115 -32
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +14 -6
- package/dist/causal-retrieval.js.map +1 -1
- package/dist/causal-trajectory-graph.js +2 -2
- package/dist/causal-trajectory.js +2 -2
- package/dist/{chunk-SAZS2QZB.js → chunk-23UORJ4S.js} +3 -3
- package/dist/{chunk-76FLAAUC.js → chunk-2AN2L4NL.js} +17 -6
- package/dist/chunk-2AN2L4NL.js.map +1 -0
- package/dist/{chunk-W4L6CZKA.js → chunk-2DL3OFLD.js} +15 -10
- package/dist/chunk-2DL3OFLD.js.map +1 -0
- package/dist/{chunk-7OZ53EXP.js → chunk-2NLLXCJG.js} +21 -10
- package/dist/chunk-2NLLXCJG.js.map +1 -0
- package/dist/{chunk-PK7H5L6Y.js → chunk-2NM43EWN.js} +2 -2
- package/dist/{chunk-PYXS46O7.js → chunk-3BP57I6J.js} +2 -2
- package/dist/{chunk-FBYESMQ2.js → chunk-3C5RPJAX.js} +2 -2
- package/dist/{chunk-QKZGQIPJ.js → chunk-3Q4H3OBR.js} +171 -64
- package/dist/chunk-3Q4H3OBR.js.map +1 -0
- package/dist/{chunk-FKFMOY3N.js → chunk-42NQ7AVG.js} +3 -4
- package/dist/{chunk-FKFMOY3N.js.map → chunk-42NQ7AVG.js.map} +1 -1
- package/dist/chunk-4426WSWL.js +73 -0
- package/dist/chunk-4426WSWL.js.map +1 -0
- package/dist/{chunk-LIRZNNUP.js → chunk-44442YCH.js} +5 -2
- package/dist/chunk-44442YCH.js.map +1 -0
- package/dist/{chunk-H3ME6L6D.js → chunk-46GJIW5M.js} +23 -20
- package/dist/chunk-46GJIW5M.js.map +1 -0
- package/dist/{chunk-QDZ2RLEC.js → chunk-472U7RDF.js} +3 -3
- package/dist/chunk-472U7RDF.js.map +1 -0
- package/dist/{chunk-NN2DKE4T.js → chunk-4H5ZJHEN.js} +16 -3
- package/dist/{chunk-NN2DKE4T.js.map → chunk-4H5ZJHEN.js.map} +1 -1
- package/dist/{chunk-56K5QLHX.js → chunk-4HP7HIE3.js} +56 -13
- package/dist/chunk-4HP7HIE3.js.map +1 -0
- package/dist/{chunk-RK2Y4XOM.js → chunk-4JRRISLU.js} +9 -6
- package/dist/chunk-4JRRISLU.js.map +1 -0
- package/dist/{chunk-MG7NA5H3.js → chunk-4Q73JBSM.js} +17 -12
- package/dist/chunk-4Q73JBSM.js.map +1 -0
- package/dist/{chunk-XKLD5OK4.js → chunk-4RR6ROTB.js} +10 -11
- package/dist/chunk-4RR6ROTB.js.map +1 -0
- package/dist/{chunk-4KGVTPGD.js → chunk-6F6BXB7A.js} +9 -8
- package/dist/chunk-6F6BXB7A.js.map +1 -0
- package/dist/{chunk-NMZY542O.js → chunk-6URPAY2D.js} +41 -17
- package/dist/chunk-6URPAY2D.js.map +1 -0
- package/dist/{chunk-N53K2EXC.js → chunk-6VF75M3X.js} +2 -2
- package/dist/{chunk-XSZEP4SF.js → chunk-6XSPNR6L.js} +6 -5
- package/dist/chunk-6XSPNR6L.js.map +1 -0
- package/dist/{chunk-6H2TESSP.js → chunk-765K3SAT.js} +3 -3
- package/dist/{chunk-EDTHC6UD.js → chunk-77NAFXUD.js} +2 -2
- package/dist/{chunk-S7KDBTWT.js → chunk-7F7Z6MOS.js} +29 -14
- package/dist/chunk-7F7Z6MOS.js.map +1 -0
- package/dist/{chunk-MZH6EHNR.js → chunk-7H6CFEBJ.js} +41 -14
- package/dist/chunk-7H6CFEBJ.js.map +1 -0
- package/dist/{chunk-575RMLWN.js → chunk-7MV5CWTE.js} +26 -20
- package/dist/chunk-7MV5CWTE.js.map +1 -0
- package/dist/{chunk-MGKYQQYF.js → chunk-7Q3RCKAQ.js} +2 -2
- package/dist/chunk-7RXCMVFQ.js +27 -0
- package/dist/chunk-7RXCMVFQ.js.map +1 -0
- package/dist/{chunk-DGXUHMOV.js → chunk-A2IYSXDQ.js} +25 -6
- package/dist/chunk-A2IYSXDQ.js.map +1 -0
- package/dist/{chunk-EABGC2TL.js → chunk-A2Z6UCWT.js} +26 -4
- package/dist/chunk-A2Z6UCWT.js.map +1 -0
- package/dist/{chunk-3VAL7ZL2.js → chunk-A52AKD7C.js} +59 -24
- package/dist/chunk-A52AKD7C.js.map +1 -0
- package/dist/{chunk-5375UYTQ.js → chunk-A6D7A2FW.js} +4 -4
- package/dist/chunk-A6D7A2FW.js.map +1 -0
- package/dist/{chunk-FAAFWE4G.js → chunk-ALEPI75L.js} +24 -6
- package/dist/chunk-ALEPI75L.js.map +1 -0
- package/dist/{chunk-3SLRNYNG.js → chunk-AUDJPF4N.js} +15 -4
- package/dist/chunk-AUDJPF4N.js.map +1 -0
- package/dist/chunk-B5XMS73R.js +145 -0
- package/dist/chunk-B5XMS73R.js.map +1 -0
- package/dist/{chunk-HXXBL2KD.js → chunk-BECQDWBA.js} +44 -4
- package/dist/chunk-BECQDWBA.js.map +1 -0
- package/dist/{chunk-7SEAZFFB.js → chunk-BEUDU7Y4.js} +24 -4
- package/dist/chunk-BEUDU7Y4.js.map +1 -0
- package/dist/{chunk-XVVIG67A.js → chunk-BLZAVUD2.js} +61 -17
- package/dist/chunk-BLZAVUD2.js.map +1 -0
- package/dist/chunk-CHBI22MI.js +159 -0
- package/dist/chunk-CHBI22MI.js.map +1 -0
- package/dist/{chunk-GDFS42HT.js → chunk-CHCA44C3.js} +15 -8
- package/dist/chunk-CHCA44C3.js.map +1 -0
- package/dist/chunk-CINZGPSJ.js +22 -0
- package/dist/chunk-CINZGPSJ.js.map +1 -0
- package/dist/chunk-CMTINOFS.js +36 -0
- package/dist/chunk-CMTINOFS.js.map +1 -0
- package/dist/{chunk-34DQE4KF.js → chunk-CO7ZO4TU.js} +2 -2
- package/dist/{chunk-PFV5C235.js → chunk-CPPS65WS.js} +2 -1
- package/dist/{chunk-PFV5C235.js.map → chunk-CPPS65WS.js.map} +1 -1
- package/dist/{chunk-DINWEURR.js → chunk-CSKLPDN6.js} +20 -6
- package/dist/chunk-CSKLPDN6.js.map +1 -0
- package/dist/chunk-CWWMTTQE.js +566 -0
- package/dist/chunk-CWWMTTQE.js.map +1 -0
- package/dist/{chunk-IQT3XTKW.js → chunk-D24OXEPB.js} +13 -7
- package/dist/chunk-D24OXEPB.js.map +1 -0
- package/dist/{chunk-KRBK4BQH.js → chunk-D6WE5MTW.js} +272 -411
- package/dist/chunk-D6WE5MTW.js.map +1 -0
- package/dist/{chunk-WIICJPET.js → chunk-DEUNUKTD.js} +6 -4
- package/dist/{chunk-WIICJPET.js.map → chunk-DEUNUKTD.js.map} +1 -1
- package/dist/{chunk-ZYVPLJ4T.js → chunk-DHGSZ3UD.js} +9 -7
- package/dist/chunk-DHGSZ3UD.js.map +1 -0
- package/dist/{chunk-JR4ZC3G4.js → chunk-DLJ4IR6M.js} +91 -41
- package/dist/chunk-DLJ4IR6M.js.map +1 -0
- package/dist/{chunk-U4SCL7B7.js → chunk-DRD2Q7HQ.js} +82 -18
- package/dist/chunk-DRD2Q7HQ.js.map +1 -0
- package/dist/{chunk-2IWUMAES.js → chunk-E62SBGQ3.js} +28 -13
- package/dist/chunk-E62SBGQ3.js.map +1 -0
- package/dist/{chunk-C5BCH4ZS.js → chunk-EAZGEEG2.js} +21 -3
- package/dist/chunk-EAZGEEG2.js.map +1 -0
- package/dist/{chunk-TPB3I2AC.js → chunk-ECZU5BJH.js} +31 -10
- package/dist/chunk-ECZU5BJH.js.map +1 -0
- package/dist/{chunk-77H5NU3M.js → chunk-EDBEWFJO.js} +82 -18
- package/dist/chunk-EDBEWFJO.js.map +1 -0
- package/dist/chunk-EDQVAMQI.js +308 -0
- package/dist/chunk-EDQVAMQI.js.map +1 -0
- package/dist/{chunk-RRF5UOBJ.js → chunk-EI6V5UXY.js} +22 -15
- package/dist/chunk-EI6V5UXY.js.map +1 -0
- package/dist/{chunk-I5GLV3VE.js → chunk-EIPUHVKE.js} +31 -24
- package/dist/{chunk-I5GLV3VE.js.map → chunk-EIPUHVKE.js.map} +1 -1
- package/dist/{chunk-ZKSK55RC.js → chunk-ETUPBUHB.js} +2 -2
- package/dist/{chunk-25MQ7IHJ.js → chunk-EUML3N6B.js} +17 -6
- package/dist/chunk-EUML3N6B.js.map +1 -0
- package/dist/{chunk-5RGLBDQF.js → chunk-EVZFIAPG.js} +12 -12
- package/dist/chunk-EVZFIAPG.js.map +1 -0
- package/dist/{chunk-QRNI5JBH.js → chunk-EYIEWJNI.js} +2 -2
- package/dist/{chunk-3OWUCDKH.js → chunk-FER4WARO.js} +176 -42
- package/dist/chunk-FER4WARO.js.map +1 -0
- package/dist/{chunk-43PJZYGL.js → chunk-FPGE5NVO.js} +45 -10
- package/dist/chunk-FPGE5NVO.js.map +1 -0
- package/dist/{chunk-C6QPK5GG.js → chunk-FZZ2QTJI.js} +2 -2
- package/dist/{chunk-D46YSIYX.js → chunk-G3Z3QEF5.js} +19 -11
- package/dist/{chunk-D46YSIYX.js.map → chunk-G3Z3QEF5.js.map} +1 -1
- package/dist/{chunk-3JXBXXM2.js → chunk-G4IAEX6D.js} +2 -2
- package/dist/{chunk-MSWG7JI6.js → chunk-G56P5RLD.js} +8 -2
- package/dist/chunk-G56P5RLD.js.map +1 -0
- package/dist/{chunk-AGZQD76C.js → chunk-GCGJW34D.js} +48 -2
- package/dist/chunk-GCGJW34D.js.map +1 -0
- package/dist/chunk-H2NCNXMS.js +159 -0
- package/dist/chunk-H2NCNXMS.js.map +1 -0
- package/dist/{chunk-XYIK4LF6.js → chunk-H3FZVNRN.js} +8 -2
- package/dist/chunk-H3FZVNRN.js.map +1 -0
- package/dist/{chunk-TK4UEOSK.js → chunk-HDDRVXX4.js} +8 -8
- package/dist/chunk-HDDRVXX4.js.map +1 -0
- package/dist/{chunk-LLQ2LLWF.js → chunk-HENLZHIT.js} +15 -5
- package/dist/chunk-HENLZHIT.js.map +1 -0
- package/dist/{chunk-N2D6GXBM.js → chunk-HINSGUA7.js} +28 -20
- package/dist/chunk-HINSGUA7.js.map +1 -0
- package/dist/{chunk-APO3DCMU.js → chunk-HLAVGJ62.js} +30 -8
- package/dist/chunk-HLAVGJ62.js.map +1 -0
- package/dist/{chunk-TPMQ3G6Z.js → chunk-HOJZMQ4J.js} +2 -2
- package/dist/chunk-HOJZMQ4J.js.map +1 -0
- package/dist/{chunk-LUDTDZLK.js → chunk-HPWVAEET.js} +33 -7
- package/dist/chunk-HPWVAEET.js.map +1 -0
- package/dist/{chunk-NZL6GGQE.js → chunk-HQ6NIBL6.js} +92 -30
- package/dist/chunk-HQ6NIBL6.js.map +1 -0
- package/dist/{chunk-UWVJF25J.js → chunk-HWVTS5NO.js} +20 -6
- package/dist/chunk-HWVTS5NO.js.map +1 -0
- package/dist/{chunk-2WWLHTZY.js → chunk-IC4GELZE.js} +2 -2
- package/dist/{chunk-QA2ZAPBU.js → chunk-IPLYGWQF.js} +28 -20
- package/dist/chunk-IPLYGWQF.js.map +1 -0
- package/dist/{chunk-A6KTB5R6.js → chunk-IQ3OI2RR.js} +3 -3
- package/dist/chunk-IQ3OI2RR.js.map +1 -0
- package/dist/{chunk-6LVVDPJ4.js → chunk-J64TK33U.js} +3 -4
- package/dist/chunk-J64TK33U.js.map +1 -0
- package/dist/{chunk-6FC5EGNV.js → chunk-JBPKEARU.js} +15 -5
- package/dist/{chunk-6FC5EGNV.js.map → chunk-JBPKEARU.js.map} +1 -1
- package/dist/{chunk-RHY3HH7P.js → chunk-JFEKNTX7.js} +125 -33
- package/dist/chunk-JFEKNTX7.js.map +1 -0
- package/dist/{chunk-TZOLIGIG.js → chunk-JJEJJ7RK.js} +4 -2
- package/dist/chunk-JJEJJ7RK.js.map +1 -0
- package/dist/{chunk-PCUKNJAZ.js → chunk-JKV57BTN.js} +2 -2
- package/dist/{chunk-EJI5XIBB.js → chunk-JLNBQWZ2.js} +55 -7
- package/dist/chunk-JLNBQWZ2.js.map +1 -0
- package/dist/{chunk-XIG5PDM7.js → chunk-JUC24CTX.js} +8 -12
- package/dist/chunk-JUC24CTX.js.map +1 -0
- package/dist/{chunk-UL2NNBUL.js → chunk-JYIKKAK3.js} +106 -44
- package/dist/chunk-JYIKKAK3.js.map +1 -0
- package/dist/{chunk-OIGNEXKZ.js → chunk-K5O2QY6T.js} +5 -1
- package/dist/{chunk-OIGNEXKZ.js.map → chunk-K5O2QY6T.js.map} +1 -1
- package/dist/{chunk-ZTFCYYEZ.js → chunk-KCYE2MZM.js} +3 -3
- package/dist/chunk-KCYE2MZM.js.map +1 -0
- package/dist/{chunk-JWPLJLDU.js → chunk-KD3QD3A5.js} +2 -2
- package/dist/{chunk-JWPLJLDU.js.map → chunk-KD3QD3A5.js.map} +1 -1
- package/dist/{chunk-YRMVARQP.js → chunk-KFY3SGN7.js} +49 -2
- package/dist/chunk-KFY3SGN7.js.map +1 -0
- package/dist/{chunk-CYFQJMUV.js → chunk-KIB7SDIJ.js} +15 -10
- package/dist/chunk-KIB7SDIJ.js.map +1 -0
- package/dist/{chunk-3KW65B36.js → chunk-KILOTVIF.js} +95 -48
- package/dist/chunk-KILOTVIF.js.map +1 -0
- package/dist/{chunk-MXFBBHJU.js → chunk-KJMYHC7K.js} +10 -5
- package/dist/chunk-KJMYHC7K.js.map +1 -0
- package/dist/{chunk-W3LR522O.js → chunk-KM2A35EO.js} +36 -34
- package/dist/chunk-KM2A35EO.js.map +1 -0
- package/dist/{chunk-WELDCG6C.js → chunk-L227SKTB.js} +109 -36
- package/dist/chunk-L227SKTB.js.map +1 -0
- package/dist/{chunk-W6AQJ2PY.js → chunk-L7S47WZT.js} +35 -16
- package/dist/chunk-L7S47WZT.js.map +1 -0
- package/dist/{chunk-BVF3AGJP.js → chunk-LJBOVCQG.js} +26 -11
- package/dist/chunk-LJBOVCQG.js.map +1 -0
- package/dist/{chunk-2KI4QFHU.js → chunk-LMDRGRJ2.js} +2 -2
- package/dist/{chunk-MY6TPVXW.js → chunk-LMPHTYJC.js} +2 -2
- package/dist/{chunk-EHRTFRWW.js → chunk-LQHDIS7L.js} +10 -5
- package/dist/chunk-LQHDIS7L.js.map +1 -0
- package/dist/chunk-LUDUFZTV.js +170 -0
- package/dist/chunk-LUDUFZTV.js.map +1 -0
- package/dist/{chunk-5HRY2WRF.js → chunk-LZ3VEOU5.js} +2 -2
- package/dist/{chunk-Q7P4WJDP.js → chunk-M5T4Q2ZU.js} +1 -1
- package/dist/chunk-M5T4Q2ZU.js.map +1 -0
- package/dist/{chunk-ICRIXAP2.js → chunk-MC4FJXPA.js} +16 -6
- package/dist/chunk-MC4FJXPA.js.map +1 -0
- package/dist/{chunk-WPGJYVUH.js → chunk-MGVIEM2O.js} +23 -6
- package/dist/chunk-MGVIEM2O.js.map +1 -0
- package/dist/{chunk-OC7KHOOX.js → chunk-O27WNHTT.js} +22 -6
- package/dist/chunk-O27WNHTT.js.map +1 -0
- package/dist/{chunk-NGAVDO7E.js → chunk-OADWQ5CR.js} +2 -2
- package/dist/{chunk-2NMMFZ5T.js → chunk-OD4FM2U7.js} +6 -3
- package/dist/chunk-OD4FM2U7.js.map +1 -0
- package/dist/{chunk-OZHRDTDX.js → chunk-OKTXM5H4.js} +11 -1
- package/dist/chunk-OKTXM5H4.js.map +1 -0
- package/dist/{chunk-RXDLTSWT.js → chunk-ONPLNAPX.js} +16 -7
- package/dist/chunk-ONPLNAPX.js.map +1 -0
- package/dist/{chunk-FJ43PRLT.js → chunk-ORFGK3XI.js} +20 -14
- package/dist/chunk-ORFGK3XI.js.map +1 -0
- package/dist/{chunk-DOM4GKSW.js → chunk-OZKVVUJB.js} +3 -3
- package/dist/{chunk-MT4HVDUZ.js → chunk-PM3QHTFT.js} +3 -3
- package/dist/{chunk-4DWOBS2A.js → chunk-PRQJ5ESM.js} +27 -2
- package/dist/{chunk-4DWOBS2A.js.map → chunk-PRQJ5ESM.js.map} +1 -1
- package/dist/chunk-PU44GBL4.js +52 -0
- package/dist/chunk-PU44GBL4.js.map +1 -0
- package/dist/{chunk-MJFNCJXV.js → chunk-Q4CAQGKQ.js} +47 -9
- package/dist/chunk-Q4CAQGKQ.js.map +1 -0
- package/dist/{chunk-U3WSW6PZ.js → chunk-QMYXNM4P.js} +90 -35
- package/dist/chunk-QMYXNM4P.js.map +1 -0
- package/dist/{chunk-NBNN5GOB.js → chunk-QY7YA7OL.js} +11 -2
- package/dist/chunk-QY7YA7OL.js.map +1 -0
- package/dist/{chunk-QLLBRHAT.js → chunk-R26QUUQN.js} +181 -257
- package/dist/chunk-R26QUUQN.js.map +1 -0
- package/dist/{chunk-ZK7I7JYV.js → chunk-R3PS27B4.js} +7 -7
- package/dist/{chunk-TMQLARTH.js → chunk-RCTS5CKK.js} +33 -14
- package/dist/chunk-RCTS5CKK.js.map +1 -0
- package/dist/{chunk-2PRLKQAH.js → chunk-RLV3PQGH.js} +35 -19
- package/dist/chunk-RLV3PQGH.js.map +1 -0
- package/dist/{chunk-WW3QQF4H.js → chunk-ROZJACKP.js} +16 -1
- package/dist/chunk-ROZJACKP.js.map +1 -0
- package/dist/{chunk-7MNMYOFP.js → chunk-RSUYKGGZ.js} +3 -4
- package/dist/chunk-RSUYKGGZ.js.map +1 -0
- package/dist/{chunk-LT3NLYSI.js → chunk-RUZOJKNF.js} +10 -7
- package/dist/chunk-RUZOJKNF.js.map +1 -0
- package/dist/{chunk-326G7DJK.js → chunk-RW5DGAGO.js} +67 -13
- package/dist/chunk-RW5DGAGO.js.map +1 -0
- package/dist/{chunk-KOSORCJG.js → chunk-S53PKKWK.js} +63 -24
- package/dist/chunk-S53PKKWK.js.map +1 -0
- package/dist/{chunk-65PG43EQ.js → chunk-S7WU3Y3D.js} +21 -4
- package/dist/chunk-S7WU3Y3D.js.map +1 -0
- package/dist/{chunk-SKE7JYKA.js → chunk-SFXKHM7P.js} +2 -2
- package/dist/{chunk-HMDCOMYU.js → chunk-SKGV326D.js} +3 -3
- package/dist/chunk-T2PO5MUF.js +62 -0
- package/dist/chunk-T2PO5MUF.js.map +1 -0
- package/dist/{chunk-C7VW7C3F.js → chunk-TDKQGLJW.js} +3 -3
- package/dist/chunk-TDKQGLJW.js.map +1 -0
- package/dist/{chunk-3QKK7QOS.js → chunk-TERNBNJB.js} +3 -3
- package/dist/chunk-TERNBNJB.js.map +1 -0
- package/dist/{chunk-MXC3AP5I.js → chunk-TGQ2NTWH.js} +12 -7
- package/dist/chunk-TGQ2NTWH.js.map +1 -0
- package/dist/{chunk-3Y4P7RXM.js → chunk-TMSXWOBZ.js} +3 -4
- package/dist/chunk-TMSXWOBZ.js.map +1 -0
- package/dist/{chunk-3TNBOMQT.js → chunk-TVRN5QKH.js} +11 -11
- package/dist/{chunk-3TNBOMQT.js.map → chunk-TVRN5QKH.js.map} +1 -1
- package/dist/{chunk-5UM2VJ6D.js → chunk-UEY3VB6W.js} +2 -2
- package/dist/{chunk-I6K5FBRQ.js → chunk-UI3NYK34.js} +4 -1
- package/dist/{chunk-I6K5FBRQ.js.map → chunk-UI3NYK34.js.map} +1 -1
- package/dist/{chunk-VBJ7V5SK.js → chunk-UIPDNLXA.js} +21 -8
- package/dist/chunk-UIPDNLXA.js.map +1 -0
- package/dist/{chunk-GIF42EW3.js → chunk-UP6MOYCB.js} +3 -3
- package/dist/{chunk-K4FLSOR5.js → chunk-USYGGIJZ.js} +44 -15
- package/dist/chunk-USYGGIJZ.js.map +1 -0
- package/dist/{chunk-FIT6DMX6.js → chunk-UWY7GIVS.js} +152 -54
- package/dist/chunk-UWY7GIVS.js.map +1 -0
- package/dist/{chunk-MRILGULB.js → chunk-V2RCP53Q.js} +2 -2
- package/dist/{chunk-XKECPATV.js → chunk-VFUEZZBS.js} +113 -4
- package/dist/chunk-VFUEZZBS.js.map +1 -0
- package/dist/{chunk-FSFEQI74.js → chunk-W7L6HXUC.js} +2 -2
- package/dist/{chunk-3IQ2TR4N.js → chunk-WLEB7WCG.js} +2 -2
- package/dist/{chunk-GL6I6MEQ.js → chunk-WSGF57U2.js} +3 -3
- package/dist/{chunk-KNKUID7G.js → chunk-X7Y7WX73.js} +72 -6
- package/dist/chunk-X7Y7WX73.js.map +1 -0
- package/dist/{chunk-5NPGSAVB.js → chunk-XEKAG3FM.js} +23 -5
- package/dist/chunk-XEKAG3FM.js.map +1 -0
- package/dist/{chunk-3APJ5EVB.js → chunk-XKIQZXUB.js} +41 -26
- package/dist/chunk-XKIQZXUB.js.map +1 -0
- package/dist/chunk-XKXKSQU7.js +92 -0
- package/dist/chunk-XKXKSQU7.js.map +1 -0
- package/dist/{chunk-JA3AK3PT.js → chunk-XNLXAWHX.js} +4 -4
- package/dist/{chunk-CULXMQJH.js → chunk-XPXEJRUB.js} +3 -3
- package/dist/chunk-XPXEJRUB.js.map +1 -0
- package/dist/{chunk-PZIAX57I.js → chunk-XR6DNK4U.js} +7 -4
- package/dist/chunk-XR6DNK4U.js.map +1 -0
- package/dist/{chunk-47VWKCAF.js → chunk-XSQ4SGM5.js} +33 -4
- package/dist/chunk-XSQ4SGM5.js.map +1 -0
- package/dist/{chunk-66DHUKLO.js → chunk-XSWKORGM.js} +16 -14
- package/dist/chunk-XSWKORGM.js.map +1 -0
- package/dist/{chunk-QR3C7BKQ.js → chunk-XZ4WBBB5.js} +7 -8
- package/dist/chunk-XZ4WBBB5.js.map +1 -0
- package/dist/{chunk-WNARATI3.js → chunk-Y2SXZ5KZ.js} +59 -11
- package/dist/chunk-Y2SXZ5KZ.js.map +1 -0
- package/dist/{chunk-SIC6U3GZ.js → chunk-YHV3KRKS.js} +3 -3
- package/dist/{chunk-ZPKBYX2F.js → chunk-YNDLCWXS.js} +85 -9
- package/dist/chunk-YNDLCWXS.js.map +1 -0
- package/dist/{chunk-VLXA6PI2.js → chunk-YQMZ7IH2.js} +4 -4
- package/dist/{chunk-TMM4S4IJ.js → chunk-YR6GIWWY.js} +58 -8
- package/dist/chunk-YR6GIWWY.js.map +1 -0
- package/dist/{chunk-DK5LDEQM.js → chunk-YR7XMOWK.js} +39 -23
- package/dist/chunk-YR7XMOWK.js.map +1 -0
- package/dist/chunk-ZFXCQPNO.js +27 -0
- package/dist/chunk-ZFXCQPNO.js.map +1 -0
- package/dist/citations.js +1 -1
- package/dist/{cli-CJKI2JIe.d.ts → cli-X4NJoqSe.d.ts} +8 -31
- package/dist/cli.d.ts +10 -6
- package/dist/cli.js +122 -117
- package/dist/commitment-ledger.js +2 -2
- package/dist/compat/checks.js +1 -2
- package/dist/compounding/engine.d.ts +3 -2
- package/dist/compounding/engine.js +11 -11
- package/dist/compounding/preference-consolidator.d.ts +1 -0
- package/dist/compounding/preference-consolidator.js +8 -8
- package/dist/compounding/preference-consolidator.js.map +1 -1
- package/dist/compression-optimizer.d.ts +1 -0
- package/dist/compression-optimizer.js +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +3 -2
- package/dist/connectors/codex-materialize-runner.d.ts +1 -0
- package/dist/connectors/codex-materialize-runner.js +12 -11
- package/dist/connectors/codex-materialize.d.ts +1 -0
- package/dist/connectors/codex-materialize.js +3 -2
- package/dist/connectors/index.d.ts +1 -0
- package/dist/connectors/index.js +14 -14
- package/dist/{connectors-cli-CwbyjGR7.d.ts → connectors-cli-DbTPNj2H.d.ts} +7 -1
- package/dist/connectors-cli.d.ts +1 -1
- package/dist/connectors-cli.js +3 -1
- package/dist/consolidation-provenance-check.d.ts +1 -0
- package/dist/consolidation-provenance-check.js +2 -2
- package/dist/consolidation-undo.d.ts +1 -0
- package/dist/consolidation-undo.js +1 -1
- package/dist/contradiction/index.d.ts +3 -1
- package/dist/contradiction/index.js +3 -3
- package/dist/{contradiction-review-ATP4S6IC.js → contradiction-review-6V2LXXK6.js} +2 -2
- package/dist/{contradiction-scan-5A4IDZV5.js → contradiction-scan-GIRVC4C7.js} +3 -3
- package/dist/conversation-index/backend.d.ts +3 -1
- package/dist/conversation-index/backend.js +3 -3
- package/dist/conversation-index/chunker.d.ts +1 -0
- package/dist/conversation-index/cleanup.js +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.js +1 -1
- package/dist/conversation-index/indexer.d.ts +5 -2
- package/dist/conversation-index/indexer.js +1 -1
- package/dist/conversation-index/search.d.ts +2 -1
- package/dist/cross-namespace-budget.js +1 -1
- package/dist/cue-anchors.js +2 -2
- package/dist/dashboard-runtime.d.ts +6 -0
- package/dist/dashboard-runtime.js +3 -3
- package/dist/day-summary.d.ts +1 -0
- package/dist/day-summary.js +2 -2
- package/dist/delinearize.d.ts +1 -0
- package/dist/direct-answer-wiring.d.ts +1 -0
- package/dist/direct-answer.d.ts +1 -0
- package/dist/{dreams-ledger-LR2NBAZE.js → dreams-ledger-3WSCI5V4.js} +5 -4
- package/dist/{dreams-ledger-LR2NBAZE.js.map → dreams-ledger-3WSCI5V4.js.map} +1 -1
- package/dist/embedding-fallback.d.ts +3 -0
- package/dist/embedding-fallback.js +2 -2
- package/dist/enrichment/index.d.ts +1 -0
- package/dist/enrichment/index.js +1 -1
- package/dist/entity-retrieval.d.ts +2 -0
- package/dist/entity-retrieval.js +9 -9
- package/dist/entity-schema.d.ts +1 -0
- package/dist/evals.js +1 -1
- package/dist/explicit-capture.d.ts +5 -3
- package/dist/explicit-capture.js +2 -2
- package/dist/extraction-judge-telemetry.d.ts +2 -0
- package/dist/extraction-judge-training.d.ts +2 -0
- package/dist/extraction-judge.d.ts +2 -0
- package/dist/extraction.d.ts +2 -0
- package/dist/extraction.js +12 -12
- package/dist/{faiss-adapter-CzPghc4C.d.ts → faiss-adapter-BHecI1fF.d.ts} +4 -1
- package/dist/fallback-llm.d.ts +11 -1
- package/dist/fallback-llm.js +8 -6
- package/dist/{first-start-migration-4MHQEOSD.js → first-start-migration-CKTCTCQI.js} +5 -5
- package/dist/graph-dashboard-diff.d.ts +4 -0
- package/dist/graph-dashboard-diff.js +1 -1
- package/dist/graph-dashboard-parser.js +1 -1
- package/dist/{graph-edge-decay-5DI5GUNL.js → graph-edge-decay-MUP5J7CC.js} +6 -6
- package/dist/graph-events.js +1 -1
- package/dist/graph-snapshot.js +3 -3
- package/dist/graph.js +2 -2
- package/dist/harmonic-retrieval.js +4 -4
- package/dist/identity-continuity.d.ts +1 -0
- package/dist/importance.d.ts +1 -0
- package/dist/importers/index.d.ts +244 -0
- package/dist/importers/index.js +20 -0
- package/dist/index.d.ts +21 -351
- package/dist/index.js +886 -561
- package/dist/index.js.map +1 -1
- package/dist/intent.d.ts +1 -0
- package/dist/lcm/archive.d.ts +2 -2
- package/dist/lcm/archive.js +2 -2
- package/dist/lcm/engine.d.ts +3 -2
- package/dist/lcm/engine.js +6 -6
- package/dist/lcm/index.d.ts +1 -0
- package/dist/lcm/index.js +8 -8
- package/dist/lcm/recall.js +1 -1
- package/dist/lcm/summarizer.js +3 -3
- package/dist/lcm/tools.d.ts +1 -0
- package/dist/lifecycle.d.ts +1 -0
- package/dist/live-connectors-runner.d.ts +1 -0
- package/dist/live-connectors-runner.js +6 -6
- package/dist/local-llm.d.ts +1 -0
- package/dist/local-llm.js +2 -2
- package/dist/maintenance/archive-observations.js +1 -1
- package/dist/maintenance/memory-governance.d.ts +3 -1
- package/dist/maintenance/memory-governance.js +10 -8
- package/dist/maintenance/migrate-observations.js +3 -2
- package/dist/maintenance/observation-ledger-utils.d.ts +3 -0
- package/dist/maintenance/observation-ledger-utils.js +2 -1
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -1
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -8
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -1
- package/dist/maintenance/rebuild-memory-projection.js +13 -10
- package/dist/maintenance/rebuild-observations.d.ts +1 -0
- package/dist/maintenance/rebuild-observations.js +3 -2
- package/dist/mcp-memory-inspector-app.d.ts +7 -4
- package/dist/mcp-memory-inspector-app.js +1 -1
- package/dist/memory-action-policy.d.ts +1 -0
- package/dist/memory-cache.d.ts +1 -0
- package/dist/memory-cache.js +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -0
- package/dist/memory-projection-store.d.ts +1 -0
- package/dist/memory-projection-store.js +1 -1
- package/dist/memory-provenance.d.ts +1 -0
- package/dist/memory-worth-outcomes.d.ts +1 -0
- package/dist/migrate/from-engram.js +2 -2
- package/dist/{migrate-from-identity-anchor-G27MCD6A.js → migrate-from-identity-anchor-EB4XI4Q2.js} +2 -2
- package/dist/model-registry.js +1 -1
- package/dist/models-json.d.ts +1 -0
- package/dist/namespaces/migrate.d.ts +3 -0
- package/dist/namespaces/migrate.js +24 -22
- package/dist/namespaces/principal.d.ts +1 -0
- package/dist/namespaces/principal.js +2 -1
- package/dist/namespaces/search.d.ts +1 -0
- package/dist/namespaces/search.js +15 -13
- package/dist/namespaces/storage.d.ts +4 -2
- package/dist/namespaces/storage.js +10 -9
- package/dist/native-knowledge.d.ts +1 -0
- package/dist/native-knowledge.js +1 -1
- package/dist/negative.js +1 -1
- package/dist/network/webdav.d.ts +16 -1
- package/dist/network/webdav.js +5 -3
- package/dist/objective-state-writers.js +4 -4
- package/dist/objective-state.js +2 -2
- package/dist/offline-sync.d.ts +8 -1
- package/dist/offline-sync.js +6 -4
- package/dist/operator-toolkit.d.ts +1 -0
- package/dist/operator-toolkit.js +35 -32
- package/dist/opik-exporter.js +1 -1
- package/dist/{orchestrator-DuWl9Hwx.d.ts → orchestrator-Co9nxRLF.d.ts} +4 -74
- package/dist/orchestrator.d.ts +5 -3
- package/dist/orchestrator.js +99 -96
- package/dist/page-versioning.js +1 -1
- package/dist/path-X2K5XCHL.js +9 -0
- package/dist/patterns-cli.d.ts +1 -0
- package/dist/peers/index.d.ts +328 -0
- package/dist/{peers-HCVGHMAE.js → peers/index.js} +4 -4
- package/dist/pipeline-D18UAKlN.d.ts +32 -0
- package/dist/plugin-entry-resolver.d.ts +9 -0
- package/dist/plugin-entry-resolver.js +8 -0
- package/dist/plugin-entry-resolver.js.map +1 -0
- package/dist/plugin-id.d.ts +2 -21
- package/dist/plugin-id.js +33 -4
- package/dist/plugin-id.js.map +1 -1
- package/dist/policy-runtime.d.ts +4 -0
- package/dist/policy-runtime.js +1 -1
- package/dist/profiling.js +1 -1
- package/dist/qmd-recall-cache.d.ts +1 -0
- package/dist/qmd.d.ts +1 -0
- package/dist/qmd.js +3 -3
- package/dist/recall-disclosure-escalation.d.ts +1 -0
- package/dist/recall-explain-renderer.d.ts +1 -0
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-state.d.ts +8 -1
- package/dist/recall-state.js +2 -1
- package/dist/recall-tag-filter.d.ts +1 -0
- package/dist/recall-xray-cli.d.ts +1 -0
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -0
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -0
- package/dist/recall-xray.js +2 -2
- package/dist/relevance.d.ts +7 -1
- package/dist/relevance.js +2 -1
- package/dist/replay/normalizers/chatgpt.js +2 -2
- package/dist/replay/normalizers/claude.js +2 -2
- package/dist/replay/normalizers/openclaw.js +2 -2
- package/dist/replay/normalizers/shared.js +1 -1
- package/dist/replay/runner.js +1 -1
- package/dist/rerank.js +1 -1
- package/dist/{resolution-B7FNQSSP.js → resolution-ZY7VM6WS.js} +3 -3
- package/dist/resolution-ZY7VM6WS.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +1 -0
- package/dist/resolve-auth-token.js +1 -1
- package/dist/resolve-provider-secret.d.ts +19 -29
- package/dist/resolve-provider-secret.js +2 -6
- package/dist/resume-bundles.js +10 -9
- package/dist/retrieval-agents.d.ts +2 -1
- package/dist/retrieval-agents.js +2 -1
- package/dist/retrieval-tiers.d.ts +1 -0
- package/dist/routing/engine.d.ts +1 -0
- package/dist/routing/store.d.ts +3 -0
- package/dist/routing/store.js +1 -1
- package/dist/runtime/env.js +1 -1
- package/dist/schemas.d.ts +213 -39
- package/dist/schemas.js +1 -1
- package/dist/sdk-compat.js +1 -1
- package/dist/search/document-scanner.js +1 -1
- package/dist/search/embed-helper.d.ts +7 -2
- package/dist/search/embed-helper.js +3 -1
- package/dist/search/factory.d.ts +2 -1
- package/dist/search/factory.js +13 -12
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +19 -18
- package/dist/search/lancedb-backend.d.ts +7 -6
- package/dist/search/lancedb-backend.js +4 -2
- package/dist/search/meilisearch-backend.d.ts +7 -6
- package/dist/search/meilisearch-backend.js +4 -2
- package/dist/search/noop-backend.d.ts +1 -0
- package/dist/search/orama-backend.d.ts +9 -7
- package/dist/search/orama-backend.js +8 -4
- package/dist/search/port.d.ts +1 -0
- package/dist/search/remote-backend.d.ts +1 -0
- package/dist/secure-store/index.d.ts +16 -3
- package/dist/secure-store/index.js +2 -2
- package/dist/{semantic-VwGI14Ok.d.ts → semantic-SLAa_prH.d.ts} +5 -3
- package/dist/semantic-consolidation.d.ts +1 -0
- package/dist/semantic-consolidation.js +14 -13
- package/dist/semantic-rule-promotion.js +8 -8
- package/dist/semantic-rule-verifier.d.ts +1 -0
- package/dist/semantic-rule-verifier.js +8 -8
- package/dist/session-integrity.d.ts +1 -0
- package/dist/session-integrity.js +1 -1
- package/dist/session-observer-bands.d.ts +1 -0
- package/dist/session-observer-state.d.ts +6 -1
- package/dist/session-observer-state.js +1 -1
- package/dist/shared-context/manager.d.ts +5 -0
- package/dist/shared-context/manager.js +3 -3
- package/dist/signal.d.ts +1 -0
- package/dist/signal.js +1 -1
- package/dist/source-attribution.js +1 -1
- package/dist/state-store-4QZISH3J.js +30 -0
- package/dist/state-store-4QZISH3J.js.map +1 -0
- package/dist/storage-C4DX8CuG.d.ts +157 -0
- package/dist/storage.d.ts +2 -0
- package/dist/storage.js +7 -7
- package/dist/store-contract.js +1 -1
- package/dist/summarizer.d.ts +1 -0
- package/dist/summarizer.js +7 -7
- package/dist/summary-snapshot.d.ts +1 -0
- package/dist/surfaces/dreams.js +48 -17
- package/dist/surfaces/dreams.js.map +1 -1
- package/dist/temporal-supersession.d.ts +1 -0
- package/dist/temporal-supersession.js +1 -1
- package/dist/temporal-validity.d.ts +1 -0
- package/dist/threading.d.ts +1 -0
- package/dist/tier-migration.d.ts +1 -0
- package/dist/tier-routing.d.ts +1 -0
- package/dist/{tier-stats-62ZVDFKS.js → tier-stats-SKML2OSF.js} +5 -5
- package/dist/tmt.js +1 -1
- package/dist/tokens.js +2 -2
- package/dist/topics.d.ts +1 -0
- package/dist/{trace-C5ETWBEF.js → trace-WM7V4CKI.js} +31 -1
- package/dist/trace-WM7V4CKI.js.map +1 -0
- package/dist/transcript.d.ts +1 -0
- package/dist/transcript.js +2 -2
- package/dist/transfer/autodetect.js +7 -7
- package/dist/transfer/backup.js +5 -5
- package/dist/transfer/capsule-export.js +5 -5
- package/dist/transfer/capsule-import.d.ts +6 -0
- package/dist/transfer/capsule-import.js +4 -4
- package/dist/transfer/export-json.js +3 -3
- package/dist/transfer/export-md.js +3 -3
- package/dist/transfer/export-sqlite.js +3 -3
- package/dist/transfer/fs-utils.d.ts +2 -1
- package/dist/transfer/fs-utils.js +5 -3
- package/dist/transfer/import-json.js +3 -3
- package/dist/transfer/import-md.js +3 -3
- package/dist/transfer/import-sqlite.js +3 -3
- package/dist/transfer/types.d.ts +12 -12
- package/dist/trust-zones.js +2 -2
- package/dist/types-B1VHaf2w.d.ts +126 -0
- package/dist/types-BliCnURB.d.ts +83 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.js +1 -1
- package/dist/utility-learner.js +3 -3
- package/dist/utility-runtime.d.ts +1 -0
- package/dist/utility-runtime.js +4 -4
- package/dist/utility-telemetry.js +2 -2
- package/dist/verified-recall.js +9 -9
- package/dist/work/board.js +2 -2
- package/dist/work/boundary.js +1 -1
- package/dist/work/storage.d.ts +5 -0
- package/dist/work/storage.js +1 -1
- package/dist/work-product-ledger.js +2 -2
- package/package.json +74 -3
- package/scripts/ensure-better-sqlite3.mjs +8 -7
- package/scripts/faiss_index.py +141 -29
- package/src/access-cli.test.ts +87 -2
- package/src/access-cli.ts +59 -5
- package/src/access-http.test.ts +321 -0
- package/src/access-http.ts +201 -35
- package/src/access-idempotency.ts +136 -3
- package/src/access-mcp.test.ts +155 -0
- package/src/access-mcp.ts +116 -30
- package/src/access-schema.ts +22 -4
- package/src/access-service-project-tag.test.ts +37 -0
- package/src/access-service.ts +42 -10
- package/src/active-recall.test.ts +29 -1
- package/src/active-recall.ts +11 -7
- package/src/adapters/claude-code.ts +7 -8
- package/src/adapters/codex.ts +6 -7
- package/src/adapters/hermes.ts +1 -5
- package/src/adapters/registry.test.ts +63 -0
- package/src/adapters/registry.ts +10 -0
- package/src/adapters/replit.ts +5 -7
- package/src/adapters/types.ts +24 -1
- package/src/behavior-signals.ts +1 -1
- package/src/binary-lifecycle/backend.ts +16 -4
- package/src/binary-lifecycle/pipeline.test.ts +149 -0
- package/src/binary-lifecycle/pipeline.ts +49 -7
- package/src/binary-lifecycle/scanner.ts +19 -4
- package/src/boxes.ts +119 -32
- package/src/buffer-session.test.ts +28 -0
- package/src/buffer.ts +10 -14
- package/src/bulk-import/types.ts +10 -0
- package/src/calibration.test.ts +99 -0
- package/src/calibration.ts +57 -13
- package/src/causal-consolidation.test.ts +214 -0
- package/src/causal-consolidation.ts +131 -14
- package/src/causal-retrieval.ts +16 -3
- package/src/citations.test.ts +75 -0
- package/src/citations.ts +19 -6
- package/src/cli.ts +134 -109
- package/src/coding/coding-namespace.test.ts +7 -0
- package/src/coding/coding-namespace.ts +8 -0
- package/src/coding/review-context.test.ts +30 -0
- package/src/coding/review-context.ts +79 -9
- package/src/coding/wire-coding-context.test.ts +16 -0
- package/src/compat/checks.test.ts +33 -0
- package/src/compat/checks.ts +64 -4
- package/src/compounding/engine.ts +2 -2
- package/src/compounding/preference-consolidator.test.ts +47 -0
- package/src/compounding/preference-consolidator.ts +8 -8
- package/src/compression-optimizer.ts +5 -2
- package/src/config.test.ts +34 -2
- package/src/config.ts +62 -18
- package/src/connectors/codex-materialize-runner.ts +4 -3
- package/src/connectors/codex-materialize.ts +149 -34
- package/src/connectors/index.test.ts +144 -7
- package/src/connectors/index.ts +86 -15
- package/src/connectors/live/github.test.ts +47 -0
- package/src/connectors/live/github.ts +29 -1
- package/src/connectors/live/index.ts +2 -0
- package/src/connectors/live/live-connectors.test.ts +359 -73
- package/src/connectors/live/notion.test.ts +84 -0
- package/src/connectors/live/notion.ts +18 -1
- package/src/connectors/live/state-store.ts +419 -38
- package/src/connectors/weclone-installer.test.ts +16 -18
- package/src/connectors-cli.ts +19 -0
- package/src/console/trace.test.ts +28 -0
- package/src/console/trace.ts +42 -5
- package/src/contradiction/contradiction-judge.test.ts +49 -0
- package/src/contradiction/contradiction-judge.ts +15 -5
- package/src/contradiction/contradiction-review.ts +31 -7
- package/src/contradiction/contradiction-scan.ts +28 -18
- package/src/contradiction/contradiction.test.ts +237 -1
- package/src/contradiction/resolution.ts +43 -4
- package/src/conversation-index/backend.ts +13 -5
- package/src/conversation-index/cleanup.ts +25 -4
- package/src/conversation-index/faiss-adapter.ts +24 -15
- package/src/conversation-index/indexer.test.ts +71 -10
- package/src/conversation-index/indexer.ts +22 -3
- package/src/cross-namespace-budget.test.ts +59 -0
- package/src/cross-namespace-budget.ts +15 -7
- package/src/curation/index.ts +18 -17
- package/src/dashboard-runtime.test.ts +98 -0
- package/src/dashboard-runtime.ts +96 -6
- package/src/dedup/index.test.ts +133 -0
- package/src/dedup/index.ts +73 -10
- package/src/dedup/semantic.test.ts +77 -2
- package/src/dedup/semantic.ts +26 -6
- package/src/embedding-fallback.ts +47 -15
- package/src/enrichment/audit.ts +8 -1
- package/src/enrichment/pipeline.ts +21 -13
- package/src/enrichment/web-search-provider.ts +1 -6
- package/src/entity-retrieval.ts +57 -6
- package/src/evals.ts +22 -13
- package/src/explicit-capture.test.ts +40 -0
- package/src/explicit-capture.ts +14 -2
- package/src/extraction.ts +42 -30
- package/src/fallback-llm.ts +35 -2
- package/src/graph-dashboard-diff.test.ts +57 -0
- package/src/graph-dashboard-diff.ts +24 -2
- package/src/graph-dashboard-parser.test.ts +31 -0
- package/src/graph-dashboard-parser.ts +4 -1
- package/src/graph-events.ts +6 -4
- package/src/graph.test.ts +69 -0
- package/src/graph.ts +7 -4
- package/src/importers/base.test.ts +70 -0
- package/src/importers/base.ts +56 -7
- package/src/index.ts +6 -2
- package/src/lcm/archive.ts +65 -16
- package/src/lcm/engine.ts +27 -8
- package/src/lcm/recall.ts +5 -5
- package/src/lcm-engine.test.ts +87 -1
- package/src/lcm-recall.test.ts +71 -0
- package/src/live-connectors-runner.ts +100 -36
- package/src/maintenance/archive-observations.ts +24 -3
- package/src/maintenance/atomic-file.ts +85 -0
- package/src/maintenance/dreams-ledger.ts +15 -8
- package/src/maintenance/memory-governance.test.ts +53 -0
- package/src/maintenance/memory-governance.ts +15 -5
- package/src/maintenance/observation-ledger-utils.ts +6 -5
- package/src/maintenance/purge.test.ts +64 -0
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +22 -9
- package/src/maintenance/rebuild-memory-projection.ts +22 -9
- package/src/maintenance/rebuild-observations.ts +7 -3
- package/src/mcp-memory-inspector-app.ts +26 -3
- package/src/memory-cache.test.ts +19 -0
- package/src/memory-cache.ts +1 -0
- package/src/memory-extension/codex-publisher.ts +25 -4
- package/src/memory-extension-host/host-discovery.test.ts +69 -0
- package/src/memory-extension-host/host-discovery.ts +63 -6
- package/src/memory-projection-store.ts +114 -62
- package/src/message-parts/index.ts +46 -31
- package/src/message-parts/message-parts.test.ts +77 -0
- package/src/migrate/from-engram.ts +68 -14
- package/src/model-registry.test.ts +38 -0
- package/src/model-registry.ts +12 -7
- package/src/namespaces/identity.test.ts +66 -0
- package/src/namespaces/identity.ts +23 -0
- package/src/namespaces/migrate.test.ts +62 -0
- package/src/namespaces/migrate.ts +82 -14
- package/src/namespaces/principal.test.ts +37 -1
- package/src/namespaces/principal.ts +18 -7
- package/src/namespaces/search.test.ts +76 -6
- package/src/namespaces/search.ts +22 -21
- package/src/namespaces/storage.ts +93 -11
- package/src/native-knowledge.ts +23 -3
- package/src/negative.ts +50 -5
- package/src/network/webdav.ts +177 -58
- package/src/offline-sync.ts +22 -11
- package/src/onboarding/index.test.ts +105 -0
- package/src/onboarding/index.ts +17 -5
- package/src/operator-toolkit.ts +39 -4
- package/src/orchestrator.ts +52 -17
- package/src/page-versioning.ts +31 -5
- package/src/peers/peers.test.ts +70 -0
- package/src/peers/storage.ts +32 -3
- package/src/plugin-entry-resolver.test.ts +60 -0
- package/src/plugin-entry-resolver.ts +48 -0
- package/src/plugin-id.test.ts +38 -0
- package/src/plugin-id.ts +31 -64
- package/src/policy-runtime.test.ts +75 -0
- package/src/policy-runtime.ts +32 -3
- package/src/procedural/procedure-miner.test.ts +152 -0
- package/src/procedural/procedure-miner.ts +124 -19
- package/src/profiling.test.ts +23 -0
- package/src/profiling.ts +10 -1
- package/src/projection/index.test.ts +253 -0
- package/src/projection/index.ts +159 -18
- package/src/qmd-client.test.ts +45 -0
- package/src/qmd.ts +8 -8
- package/src/recall-disclosure.test.ts +15 -1
- package/src/recall-state.ts +24 -5
- package/src/relevance.ts +24 -5
- package/src/replay/normalizers/chatgpt.ts +14 -4
- package/src/replay/normalizers/claude.ts +8 -3
- package/src/replay/normalizers/openclaw.ts +35 -12
- package/src/replay/normalizers/replay-normalizers.test.ts +65 -0
- package/src/replay/normalizers/shared.ts +4 -1
- package/src/replay/runner.ts +1 -1
- package/src/rerank.test.ts +41 -1
- package/src/rerank.ts +2 -2
- package/src/resolve-auth-token.test.ts +29 -0
- package/src/resolve-auth-token.ts +12 -7
- package/src/resolve-provider-secret.test.ts +78 -22
- package/src/resolve-provider-secret.ts +55 -223
- package/src/retrieval-agents.ts +51 -14
- package/src/review/index.test.ts +75 -1
- package/src/review/index.ts +88 -30
- package/src/routing/store.ts +36 -6
- package/src/runtime/env.test.ts +73 -0
- package/src/runtime/env.ts +7 -11
- package/src/schemas.ts +16 -1
- package/src/search/abort.ts +18 -0
- package/src/search/document-scanner.test.ts +80 -0
- package/src/search/document-scanner.ts +51 -9
- package/src/search/embed-helper.ts +19 -6
- package/src/search/factory.ts +9 -5
- package/src/search/lancedb-backend.ts +62 -22
- package/src/search/meilisearch-backend.ts +35 -12
- package/src/search/orama-backend.test.ts +27 -0
- package/src/search/orama-backend.ts +65 -15
- package/src/secure-store/cli-handlers.ts +70 -6
- package/src/secure-store/cli-renderer.ts +13 -7
- package/src/secure-store/secure-fs.ts +11 -5
- package/src/secure-store/secure-store.test.ts +70 -0
- package/src/semantic-consolidation.test.ts +45 -0
- package/src/semantic-consolidation.ts +3 -3
- package/src/session-integrity.test.ts +98 -0
- package/src/session-integrity.ts +51 -1
- package/src/session-observer-state.ts +108 -41
- package/src/shared-context/manager.ts +93 -15
- package/src/signal.test.ts +14 -0
- package/src/signal.ts +8 -1
- package/src/source-attribution.test.ts +8 -0
- package/src/source-attribution.ts +24 -2
- package/src/spaces/index.test.ts +93 -0
- package/src/spaces/index.ts +75 -9
- package/src/storage.ts +14 -1
- package/src/store-contract.test.ts +35 -0
- package/src/store-contract.ts +39 -5
- package/src/summarizer.ts +24 -18
- package/src/summary-snapshot.test.ts +77 -0
- package/src/surfaces/dreams.test.ts +73 -0
- package/src/surfaces/dreams.ts +53 -19
- package/src/sync/index.ts +42 -17
- package/src/taxonomy/taxonomy-loader.ts +43 -4
- package/src/temporal-supersession.test.ts +67 -0
- package/src/temporal-supersession.ts +8 -0
- package/src/tmt.test.ts +50 -0
- package/src/tmt.ts +35 -11
- package/src/tokens.test.ts +18 -0
- package/src/tokens.ts +7 -0
- package/src/training-export/converter.test.ts +55 -2
- package/src/training-export/converter.ts +36 -10
- package/src/training-export/registry.test.ts +17 -0
- package/src/training-export/registry.ts +19 -1
- package/src/transcript.ts +2 -2
- package/src/transfer/backup.ts +18 -7
- package/src/transfer/capsule-crypto.ts +105 -21
- package/src/transfer/capsule-encrypt.test.ts +106 -7
- package/src/transfer/capsule-export.ts +23 -14
- package/src/transfer/capsule-import.ts +11 -2
- package/src/transfer/exclusions.ts +7 -0
- package/src/transfer/export-sqlite.ts +14 -13
- package/src/transfer/fs-utils.ts +52 -1
- package/src/transfer/import-json.ts +12 -7
- package/src/transfer/import-md.ts +5 -5
- package/src/transfer/import-sqlite.ts +4 -5
- package/src/trust-zones.ts +1 -1
- package/src/types.ts +25 -0
- package/src/utility-telemetry.ts +1 -1
- package/src/utils/category-dir.test.ts +15 -0
- package/src/utils/category-dir.ts +3 -1
- package/src/work/boundary.ts +30 -18
- package/src/work/storage.ts +116 -38
- package/src/work-product-ledger.ts +1 -1
- package/dist/chunk-25MQ7IHJ.js.map +0 -1
- package/dist/chunk-2IWUMAES.js.map +0 -1
- package/dist/chunk-2NMMFZ5T.js.map +0 -1
- package/dist/chunk-2PRLKQAH.js.map +0 -1
- package/dist/chunk-326G7DJK.js.map +0 -1
- package/dist/chunk-3APJ5EVB.js.map +0 -1
- package/dist/chunk-3KW65B36.js.map +0 -1
- package/dist/chunk-3OWUCDKH.js.map +0 -1
- package/dist/chunk-3QKK7QOS.js.map +0 -1
- package/dist/chunk-3SLRNYNG.js.map +0 -1
- package/dist/chunk-3VAL7ZL2.js.map +0 -1
- package/dist/chunk-3Y4P7RXM.js.map +0 -1
- package/dist/chunk-43PJZYGL.js.map +0 -1
- package/dist/chunk-47VWKCAF.js.map +0 -1
- package/dist/chunk-4KGVTPGD.js.map +0 -1
- package/dist/chunk-5375UYTQ.js.map +0 -1
- package/dist/chunk-56K5QLHX.js.map +0 -1
- package/dist/chunk-575RMLWN.js.map +0 -1
- package/dist/chunk-5NPGSAVB.js.map +0 -1
- package/dist/chunk-5RGLBDQF.js.map +0 -1
- package/dist/chunk-65PG43EQ.js.map +0 -1
- package/dist/chunk-66DHUKLO.js.map +0 -1
- package/dist/chunk-6LVVDPJ4.js.map +0 -1
- package/dist/chunk-76FLAAUC.js.map +0 -1
- package/dist/chunk-77H5NU3M.js.map +0 -1
- package/dist/chunk-7MNMYOFP.js.map +0 -1
- package/dist/chunk-7OZ53EXP.js.map +0 -1
- package/dist/chunk-7SEAZFFB.js.map +0 -1
- package/dist/chunk-A6KTB5R6.js.map +0 -1
- package/dist/chunk-AGZQD76C.js.map +0 -1
- package/dist/chunk-APO3DCMU.js.map +0 -1
- package/dist/chunk-BVF3AGJP.js.map +0 -1
- package/dist/chunk-C5BCH4ZS.js.map +0 -1
- package/dist/chunk-C7VW7C3F.js.map +0 -1
- package/dist/chunk-CULXMQJH.js.map +0 -1
- package/dist/chunk-CYFQJMUV.js.map +0 -1
- package/dist/chunk-D654IBA6.js +0 -61
- package/dist/chunk-D654IBA6.js.map +0 -1
- package/dist/chunk-DGXUHMOV.js.map +0 -1
- package/dist/chunk-DINWEURR.js.map +0 -1
- package/dist/chunk-DK5LDEQM.js.map +0 -1
- package/dist/chunk-EABGC2TL.js.map +0 -1
- package/dist/chunk-EHRTFRWW.js.map +0 -1
- package/dist/chunk-EJI5XIBB.js.map +0 -1
- package/dist/chunk-FAAFWE4G.js.map +0 -1
- package/dist/chunk-FAJ7FZYM.js +0 -11
- package/dist/chunk-FAJ7FZYM.js.map +0 -1
- package/dist/chunk-FDU6HUUL.js +0 -147
- package/dist/chunk-FDU6HUUL.js.map +0 -1
- package/dist/chunk-FIT6DMX6.js.map +0 -1
- package/dist/chunk-FJ43PRLT.js.map +0 -1
- package/dist/chunk-FLTNHQK6.js +0 -262
- package/dist/chunk-FLTNHQK6.js.map +0 -1
- package/dist/chunk-GDFS42HT.js.map +0 -1
- package/dist/chunk-H3ME6L6D.js.map +0 -1
- package/dist/chunk-HXXBL2KD.js.map +0 -1
- package/dist/chunk-ICRIXAP2.js.map +0 -1
- package/dist/chunk-IQT3XTKW.js.map +0 -1
- package/dist/chunk-JR4ZC3G4.js.map +0 -1
- package/dist/chunk-K4FLSOR5.js.map +0 -1
- package/dist/chunk-KNKUID7G.js.map +0 -1
- package/dist/chunk-KOSORCJG.js.map +0 -1
- package/dist/chunk-KRBK4BQH.js.map +0 -1
- package/dist/chunk-LIRZNNUP.js.map +0 -1
- package/dist/chunk-LLQ2LLWF.js.map +0 -1
- package/dist/chunk-LPMVBPA3.js +0 -236
- package/dist/chunk-LPMVBPA3.js.map +0 -1
- package/dist/chunk-LT3NLYSI.js.map +0 -1
- package/dist/chunk-LUDTDZLK.js.map +0 -1
- package/dist/chunk-MG7NA5H3.js.map +0 -1
- package/dist/chunk-MJFNCJXV.js.map +0 -1
- package/dist/chunk-MSWG7JI6.js.map +0 -1
- package/dist/chunk-MXC3AP5I.js.map +0 -1
- package/dist/chunk-MXFBBHJU.js.map +0 -1
- package/dist/chunk-MZH6EHNR.js.map +0 -1
- package/dist/chunk-N2D6GXBM.js.map +0 -1
- package/dist/chunk-NBNN5GOB.js.map +0 -1
- package/dist/chunk-NMZY542O.js.map +0 -1
- package/dist/chunk-NZL6GGQE.js.map +0 -1
- package/dist/chunk-OC7KHOOX.js.map +0 -1
- package/dist/chunk-OZHRDTDX.js.map +0 -1
- package/dist/chunk-PZIAX57I.js.map +0 -1
- package/dist/chunk-Q7P4WJDP.js.map +0 -1
- package/dist/chunk-QA2ZAPBU.js.map +0 -1
- package/dist/chunk-QDZ2RLEC.js.map +0 -1
- package/dist/chunk-QKZGQIPJ.js.map +0 -1
- package/dist/chunk-QLLBRHAT.js.map +0 -1
- package/dist/chunk-QR3C7BKQ.js.map +0 -1
- package/dist/chunk-RHY3HH7P.js.map +0 -1
- package/dist/chunk-RK2Y4XOM.js.map +0 -1
- package/dist/chunk-RR2PKP3I.js +0 -63
- package/dist/chunk-RR2PKP3I.js.map +0 -1
- package/dist/chunk-RRF5UOBJ.js.map +0 -1
- package/dist/chunk-RXDLTSWT.js.map +0 -1
- package/dist/chunk-RYED3SPJ.js +0 -42
- package/dist/chunk-RYED3SPJ.js.map +0 -1
- package/dist/chunk-S7KDBTWT.js.map +0 -1
- package/dist/chunk-TK4UEOSK.js.map +0 -1
- package/dist/chunk-TMM4S4IJ.js.map +0 -1
- package/dist/chunk-TMQLARTH.js.map +0 -1
- package/dist/chunk-TPB3I2AC.js.map +0 -1
- package/dist/chunk-TPMQ3G6Z.js.map +0 -1
- package/dist/chunk-TZOLIGIG.js.map +0 -1
- package/dist/chunk-U3WSW6PZ.js.map +0 -1
- package/dist/chunk-U4SCL7B7.js.map +0 -1
- package/dist/chunk-U66YHYC7.js +0 -31
- package/dist/chunk-U66YHYC7.js.map +0 -1
- package/dist/chunk-UL2NNBUL.js.map +0 -1
- package/dist/chunk-UWVJF25J.js.map +0 -1
- package/dist/chunk-VBJ7V5SK.js.map +0 -1
- package/dist/chunk-W3LR522O.js.map +0 -1
- package/dist/chunk-W4L6CZKA.js.map +0 -1
- package/dist/chunk-W6AQJ2PY.js.map +0 -1
- package/dist/chunk-WELDCG6C.js.map +0 -1
- package/dist/chunk-WNARATI3.js.map +0 -1
- package/dist/chunk-WPGJYVUH.js.map +0 -1
- package/dist/chunk-WW3QQF4H.js.map +0 -1
- package/dist/chunk-XIG5PDM7.js.map +0 -1
- package/dist/chunk-XKECPATV.js.map +0 -1
- package/dist/chunk-XKLD5OK4.js.map +0 -1
- package/dist/chunk-XSZEP4SF.js.map +0 -1
- package/dist/chunk-XVVIG67A.js.map +0 -1
- package/dist/chunk-XYIK4LF6.js.map +0 -1
- package/dist/chunk-YRMVARQP.js.map +0 -1
- package/dist/chunk-ZPKBYX2F.js.map +0 -1
- package/dist/chunk-ZTFCYYEZ.js.map +0 -1
- package/dist/chunk-ZYVPLJ4T.js.map +0 -1
- package/dist/path-MR5JPYOP.js +0 -9
- package/dist/state-store-VZU2IA53.js +0 -16
- package/dist/trace-C5ETWBEF.js.map +0 -1
- /package/dist/{capsule-crypto-5CYAGVC5.js.map → bulk-import/index.js.map} +0 -0
- /package/dist/{contradiction-review-ATP4S6IC.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
- /package/dist/{capsule-merge-4MGKE7C5.js.map → capsule-merge-T2JRE46P.js.map} +0 -0
- /package/dist/{chunk-SAZS2QZB.js.map → chunk-23UORJ4S.js.map} +0 -0
- /package/dist/{chunk-PK7H5L6Y.js.map → chunk-2NM43EWN.js.map} +0 -0
- /package/dist/{chunk-PYXS46O7.js.map → chunk-3BP57I6J.js.map} +0 -0
- /package/dist/{chunk-FBYESMQ2.js.map → chunk-3C5RPJAX.js.map} +0 -0
- /package/dist/{chunk-N53K2EXC.js.map → chunk-6VF75M3X.js.map} +0 -0
- /package/dist/{chunk-6H2TESSP.js.map → chunk-765K3SAT.js.map} +0 -0
- /package/dist/{chunk-EDTHC6UD.js.map → chunk-77NAFXUD.js.map} +0 -0
- /package/dist/{chunk-MGKYQQYF.js.map → chunk-7Q3RCKAQ.js.map} +0 -0
- /package/dist/{chunk-34DQE4KF.js.map → chunk-CO7ZO4TU.js.map} +0 -0
- /package/dist/{chunk-ZKSK55RC.js.map → chunk-ETUPBUHB.js.map} +0 -0
- /package/dist/{chunk-QRNI5JBH.js.map → chunk-EYIEWJNI.js.map} +0 -0
- /package/dist/{chunk-C6QPK5GG.js.map → chunk-FZZ2QTJI.js.map} +0 -0
- /package/dist/{chunk-3JXBXXM2.js.map → chunk-G4IAEX6D.js.map} +0 -0
- /package/dist/{chunk-2WWLHTZY.js.map → chunk-IC4GELZE.js.map} +0 -0
- /package/dist/{chunk-PCUKNJAZ.js.map → chunk-JKV57BTN.js.map} +0 -0
- /package/dist/{chunk-2KI4QFHU.js.map → chunk-LMDRGRJ2.js.map} +0 -0
- /package/dist/{chunk-MY6TPVXW.js.map → chunk-LMPHTYJC.js.map} +0 -0
- /package/dist/{chunk-5HRY2WRF.js.map → chunk-LZ3VEOU5.js.map} +0 -0
- /package/dist/{chunk-NGAVDO7E.js.map → chunk-OADWQ5CR.js.map} +0 -0
- /package/dist/{chunk-DOM4GKSW.js.map → chunk-OZKVVUJB.js.map} +0 -0
- /package/dist/{chunk-MT4HVDUZ.js.map → chunk-PM3QHTFT.js.map} +0 -0
- /package/dist/{chunk-ZK7I7JYV.js.map → chunk-R3PS27B4.js.map} +0 -0
- /package/dist/{chunk-SKE7JYKA.js.map → chunk-SFXKHM7P.js.map} +0 -0
- /package/dist/{chunk-HMDCOMYU.js.map → chunk-SKGV326D.js.map} +0 -0
- /package/dist/{chunk-5UM2VJ6D.js.map → chunk-UEY3VB6W.js.map} +0 -0
- /package/dist/{chunk-GIF42EW3.js.map → chunk-UP6MOYCB.js.map} +0 -0
- /package/dist/{chunk-MRILGULB.js.map → chunk-V2RCP53Q.js.map} +0 -0
- /package/dist/{chunk-FSFEQI74.js.map → chunk-W7L6HXUC.js.map} +0 -0
- /package/dist/{chunk-3IQ2TR4N.js.map → chunk-WLEB7WCG.js.map} +0 -0
- /package/dist/{chunk-GL6I6MEQ.js.map → chunk-WSGF57U2.js.map} +0 -0
- /package/dist/{chunk-JA3AK3PT.js.map → chunk-XNLXAWHX.js.map} +0 -0
- /package/dist/{chunk-SIC6U3GZ.js.map → chunk-YHV3KRKS.js.map} +0 -0
- /package/dist/{chunk-VLXA6PI2.js.map → chunk-YQMZ7IH2.js.map} +0 -0
- /package/dist/{contradiction-scan-5A4IDZV5.js.map → contradiction-review-6V2LXXK6.js.map} +0 -0
- /package/dist/{migrate-from-identity-anchor-G27MCD6A.js.map → contradiction-scan-GIRVC4C7.js.map} +0 -0
- /package/dist/{first-start-migration-4MHQEOSD.js.map → first-start-migration-CKTCTCQI.js.map} +0 -0
- /package/dist/{graph-edge-decay-5DI5GUNL.js.map → graph-edge-decay-MUP5J7CC.js.map} +0 -0
- /package/dist/{path-MR5JPYOP.js.map → importers/index.js.map} +0 -0
- /package/dist/{peers-HCVGHMAE.js.map → migrate-from-identity-anchor-EB4XI4Q2.js.map} +0 -0
- /package/dist/{resolution-B7FNQSSP.js.map → path-X2K5XCHL.js.map} +0 -0
- /package/dist/{state-store-VZU2IA53.js.map → peers/index.js.map} +0 -0
- /package/dist/{tier-stats-62ZVDFKS.js.map → tier-stats-SKML2OSF.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/buffer.ts"],"sourcesContent":["import { log } from \"./logger.js\";\nimport { scanSignals } from \"./signal.js\";\nimport type { StorageManager } from \"./storage.js\";\nimport type {\n BufferEntryState,\n BufferState,\n BufferSurpriseEvent,\n BufferTurn,\n PluginConfig,\n SignalLevel,\n} from \"./types.js\";\n\nexport type TriggerDecision = \"extract_now\" | \"extract_batch\" | \"keep_buffering\";\n\nexport interface AddTurnOutcome {\n decision: TriggerDecision;\n extractionTurns?: BufferTurn[];\n}\n\n/**\n * Optional surprise probe injected into `SmartBuffer`.\n *\n * Computes a D-MEM-style novelty score in `[0, 1]` for an incoming turn.\n * The buffer treats the probe as purely additive: if it is not provided, if\n * the feature flag is off, or if the probe throws/times out, the buffer\n * falls back to the existing signal/turn-count/time triggers unchanged.\n *\n * Callers are responsible for sampling recent memories and passing them\n * through the embedding pipeline — the buffer does not want to know about\n * storage, embeddings, or QMD.\n *\n * @param bufferKey Identifier for the active buffer (session/thread).\n * @param turn The incoming turn whose novelty is being scored.\n * @param recentTurns Turns already buffered for this key (most recent first\n * is NOT guaranteed — treat as unordered corpus).\n * @returns A surprise score in `[0, 1]`, or `null` if no score could be\n * produced (e.g. empty corpus, probe declined to embed).\n */\nexport interface BufferSurpriseProbe {\n scoreTurn(\n bufferKey: string,\n turn: BufferTurn,\n recentTurns: readonly BufferTurn[],\n ): Promise<number | null>;\n}\n\nconst MAX_BUFFER_ENTRY_COUNT = 200;\n\n/**\n * Minimal data carried on the serialized telemetry write chain\n * (issue #563 PR 3).\n *\n * We intentionally do NOT capture the full `BufferTurn` here: under\n * slow filesystem latency the chain can back up, and retaining\n * `turn.content` for every pending append causes memory pressure on\n * large conversations. Only the fields the ledger row actually needs\n * cross the chain boundary.\n */\ninterface SurpriseTelemetryQueueEntry {\n bufferKey: string;\n turnRole: \"user\" | \"assistant\";\n sessionKey: string | null;\n surpriseScore: number;\n triggered: boolean;\n turnCountInWindow: number;\n /**\n * ISO timestamp captured at the moment the turn was scored, NOT when\n * the ledger append eventually runs. Backpressure on the serialized\n * write chain could otherwise shift event timestamps away from the\n * real decision moment and distort the distribution report (p90\n * inflated, current-threshold row misidentified).\n */\n timestamp: string;\n /**\n * Threshold value in force when `triggered` was computed. Must be\n * snapshot here rather than read from `config` at emit time — a\n * concurrent config change between queue and write would otherwise\n * record `triggered=true` against a newer threshold the operator\n * never set, distorting precision/recall interpretation.\n */\n threshold: number;\n}\n\ninterface AddTurnMutationResult {\n decision: TriggerDecision;\n signalLevel: SignalLevel;\n priorTurns: BufferTurn[];\n turnSnapshot: BufferTurn;\n turnCountInWindow: number;\n}\n\nexport class SmartBuffer {\n private state: BufferState;\n private loaded = false;\n private loadPromise: Promise<void> | null = null;\n private readonly surpriseProbe: BufferSurpriseProbe | null;\n private mutationChain: Promise<unknown> = Promise.resolve();\n /**\n * Serialized write chain for `BUFFER_SURPRISE` telemetry events.\n *\n * The telemetry path is fire-and-forget (`addTurn` does not await the\n * ledger append), but multiple concurrent appends would still settle\n * out of order under variable filesystem latency. The report path\n * assumes chronological ordering — it slices the tail of the ledger\n * and treats the most recent entry as the current threshold in force.\n * Chaining ensures each append only runs after the previous settles,\n * preserving wall-clock order.\n *\n * We include a `.catch` on every link so a rejected append does not\n * poison the chain (CLAUDE.md rule #40).\n */\n private surpriseTelemetryWriteChain: Promise<unknown> = Promise.resolve();\n\n constructor(\n private readonly config: PluginConfig,\n private readonly storage: StorageManager,\n surpriseProbe: BufferSurpriseProbe | null = null,\n ) {\n this.state = { turns: [], lastExtractionAt: null, extractionCount: 0 };\n this.surpriseProbe = surpriseProbe;\n }\n\n private enqueueMutation<T>(op: () => Promise<T>): Promise<T> {\n const run = this.mutationChain.catch(() => {}).then(op);\n this.mutationChain = run.catch(() => {});\n return run;\n }\n\n private entryFor(key: string): BufferEntryState {\n this.state.entries ??= {};\n // Reject prototype-polluting keys outright so no downstream\n // assignment can mutate Object.prototype.\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n key = `__safe_${key}`;\n }\n if (Object.hasOwn(this.state.entries, key)) {\n const stored = this.state.entries[key];\n // Guard against corrupted state/buffer.json — if the stored entry\n // is not a valid object shape, discard it and recreate.\n if (stored && typeof stored === \"object\" && Array.isArray(stored.turns)) {\n return stored;\n }\n // Corrupted — fall through to recreate.\n }\n const created: BufferEntryState = {\n turns: [],\n lastExtractionAt: null,\n extractionCount: 0,\n };\n this.state.entries[key] = created;\n return created;\n }\n\n private peekEntry(key: string): BufferEntryState | null {\n // Apply the same prototype-pollution guard as entryFor so reads and\n // writes use the same key namespace for dangerous keys.\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n key = `__safe_${key}`;\n }\n const existing = this.state.entries?.[key];\n if (existing) return existing;\n if (key !== \"default\") return null;\n return {\n turns: Array.isArray(this.state.turns) ? this.state.turns : [],\n lastExtractionAt: this.state.lastExtractionAt ?? null,\n extractionCount:\n typeof this.state.extractionCount === \"number\" ? this.state.extractionCount : 0,\n };\n }\n\n private normalizeState(state: BufferState): BufferState {\n const entries = state.entries ?? {};\n if (!entries.default) {\n entries.default = {\n turns: Array.isArray(state.turns) ? [...state.turns] : [],\n lastExtractionAt: state.lastExtractionAt ?? null,\n extractionCount:\n typeof state.extractionCount === \"number\" ? state.extractionCount : 0,\n };\n }\n return {\n turns: entries.default.turns,\n lastExtractionAt: entries.default.lastExtractionAt,\n extractionCount: entries.default.extractionCount,\n entries,\n };\n }\n\n private entryActivityAt(entry: BufferEntryState): number {\n const lastTurnAt = entry.turns.reduce((latest, turn) => {\n const parsed = Date.parse(turn.timestamp);\n return Number.isFinite(parsed) ? Math.max(latest, parsed) : latest;\n }, -1);\n const lastExtractionAt =\n typeof entry.lastExtractionAt === \"string\"\n ? Date.parse(entry.lastExtractionAt)\n : Number.NaN;\n return Math.max(\n lastTurnAt,\n Number.isFinite(lastExtractionAt) ? lastExtractionAt : -1,\n );\n }\n\n private pruneEntries(retainKeys: string[]): void {\n const entries = this.state.entries;\n if (!entries) return;\n const keys = Object.keys(entries);\n if (keys.length <= MAX_BUFFER_ENTRY_COUNT) return;\n\n const insertionOrder = new Map(keys.map((key, index) => [key, index]));\n const removable = keys\n .filter((key) => key !== \"default\" && !retainKeys.includes(key))\n .filter((key) => (entries[key]?.turns.length ?? 0) === 0)\n .sort((left, right) => {\n const leftAt = this.entryActivityAt(entries[left] ?? {\n turns: [],\n lastExtractionAt: null,\n extractionCount: 0,\n });\n const rightAt = this.entryActivityAt(entries[right] ?? {\n turns: [],\n lastExtractionAt: null,\n extractionCount: 0,\n });\n if (leftAt !== rightAt) return leftAt - rightAt;\n return (insertionOrder.get(left) ?? 0) - (insertionOrder.get(right) ?? 0);\n });\n\n const removableCount = Math.max(0, keys.length - MAX_BUFFER_ENTRY_COUNT);\n for (const key of removable.slice(0, removableCount)) {\n delete entries[key];\n }\n }\n\n private async loadUnlocked(): Promise<void> {\n if (this.loaded) return;\n if (!this.loadPromise) {\n this.loadPromise = this.storage.loadBuffer()\n .then((state) => {\n this.state = this.normalizeState(state);\n this.loaded = true;\n })\n .finally(() => {\n this.loadPromise = null;\n });\n }\n await this.loadPromise;\n }\n\n async load(): Promise<void> {\n await this.enqueueMutation(async () => this.loadUnlocked());\n }\n\n /**\n * Reset the buffer to an empty, usable state.\n * Called when the persisted buffer file is corrupt and load() fails,\n * so the buffer can still accept new turns for the rest of the session.\n */\n resetToEmpty(): void {\n this.state = { turns: [], lastExtractionAt: null, extractionCount: 0 };\n this.loaded = true;\n }\n\n private async saveUnlocked(): Promise<void> {\n await this.storage.saveBuffer(this.state);\n }\n\n async save(): Promise<void> {\n await this.enqueueMutation(async () => this.saveUnlocked());\n }\n\n async addTurn(bufferKey: string, turn: BufferTurn): Promise<TriggerDecision> {\n return (await this.addTurnWithOutcome(bufferKey, turn)).decision;\n }\n\n async addTurnWithOutcome(\n bufferKey: string,\n turn: BufferTurn,\n ): Promise<AddTurnOutcome> {\n const mutation = await this.enqueueMutation(() => this.recordTurnUnlocked(bufferKey, turn));\n let decision = mutation.decision;\n let extractionTurns: BufferTurn[] | undefined;\n\n // Surprise-gated flush (issue #563). Additive only: if the probe is\n // disabled, unavailable, or the score is below threshold, the decision\n // from the existing trigger logic stands. The probe only ever *promotes*\n // `keep_buffering` → `extract_now`; it never suppresses an existing\n // flush. This preserves the invariant that enabling surprise cannot\n // *reduce* extraction frequency.\n if (\n decision === \"keep_buffering\" &&\n this.config.bufferSurpriseTriggerEnabled &&\n this.surpriseProbe !== null &&\n // Matching the existing \"smart\" branch: surprise is a lower-tier\n // novelty signal that should not second-guess a high-signal hit\n // (which already flushes) or fight `every_n` / `time_based` modes.\n this.config.triggerMode === \"smart\" &&\n mutation.signalLevel !== \"high\"\n ) {\n const surprise = await this.computeSurpriseSafe(bufferKey, turn, mutation.priorTurns);\n if (surprise !== null) {\n const shouldPromote = surprise > this.config.bufferSurpriseThreshold;\n let triggered = false;\n if (shouldPromote) {\n const currentTurns = await this.getExtractionTurnsIfTurnSnapshotStillCurrent(\n bufferKey,\n mutation.turnSnapshot,\n );\n if (currentTurns) {\n log.debug(\n `buffer[${bufferKey}]: surprise=${surprise.toFixed(3)} > threshold=${this.config.bufferSurpriseThreshold} → extract_now`,\n );\n decision = \"extract_now\";\n triggered = true;\n extractionTurns = currentTurns;\n } else {\n log.debug(\n `buffer[${bufferKey}]: surprise=${surprise.toFixed(3)} ignored because buffer changed before probe resolved`,\n );\n }\n }\n // Emit telemetry on every scored turn — both triggering and\n // non-triggering — so operators can fit the threshold to real\n // traffic distributions. Fire-and-forget: `addTurn` does NOT\n // await the ledger append, so slow/contended filesystems cannot\n // add JSONL-append latency to every `processTurn`. But we DO\n // serialize writes through a promise chain so concurrent\n // appends settle in wall-clock order — the report path assumes\n // chronological tail rows and reads the most recent as the\n // \"current\" threshold.\n //\n // Project only the fields we need into the queue entry rather\n // than capturing the full `BufferTurn` — under slow filesystem\n // latency the chain can back up, and we must not retain the\n // (potentially large) `turn.content` string for every pending\n // append.\n this.queueSurpriseTelemetryWrite({\n bufferKey,\n turnRole: turn.role,\n sessionKey:\n typeof turn.sessionKey === \"string\" ? turn.sessionKey : null,\n surpriseScore: surprise,\n triggered,\n turnCountInWindow: mutation.turnCountInWindow,\n // Stamp at decision time so backpressure on the write chain\n // does not shift the event's apparent moment away from when\n // the turn was actually scored.\n timestamp: new Date().toISOString(),\n // Snapshot the threshold used to compute `triggered` so a\n // concurrent config mutation cannot retroactively change\n // what the ledger row claims the decision was against.\n threshold: this.config.bufferSurpriseThreshold,\n });\n }\n }\n\n log.debug(\n `buffer[${bufferKey}]: ${mutation.turnCountInWindow} turns, signal=${mutation.signalLevel}, decision=${decision}`,\n );\n return extractionTurns ? { decision, extractionTurns } : { decision };\n }\n\n private async recordTurnUnlocked(bufferKey: string, turn: BufferTurn): Promise<AddTurnMutationResult> {\n await this.loadUnlocked();\n const entry = this.entryFor(bufferKey);\n const priorTurns = entry.turns.slice();\n entry.turns.push(turn);\n const turnSnapshot = copyBufferTurn(turn);\n if (bufferKey === \"default\") {\n this.state.turns = entry.turns;\n }\n\n const signal = scanSignals(turn.content, this.config.highSignalPatterns);\n const decision = this.evaluate(entry, signal.level);\n const turnCountInWindow = entry.turns.length;\n\n this.pruneEntries([bufferKey]);\n await this.saveUnlocked();\n return {\n decision,\n signalLevel: signal.level,\n priorTurns,\n turnSnapshot,\n turnCountInWindow,\n };\n }\n\n private async getExtractionTurnsIfTurnSnapshotStillCurrent(\n bufferKey: string,\n turnSnapshot: BufferTurn,\n ): Promise<BufferTurn[] | null> {\n return this.enqueueMutation(async () => {\n await this.loadUnlocked();\n const entry = this.peekEntry(bufferKey);\n if (!entry) return null;\n const stillCurrent = entry.turns.some((turn) =>\n bufferTurnsEqual(turn, turnSnapshot),\n );\n if (!stillCurrent) return null;\n const retained = entry.retainedTurns ?? [];\n return [...retained, ...entry.turns];\n });\n }\n\n /**\n * Enqueue a telemetry append on the serialized write chain.\n *\n * The chain is a classic `writeChain = writeChain.then(fn).catch(...)`\n * — each link waits for the previous to settle before its append\n * starts, so out-of-order chronology cannot happen even under\n * variable filesystem latency. We always attach `.catch` so one\n * rejection does not poison the chain for the rest of the session\n * (CLAUDE.md rule #40). The error is logged through\n * `emitSurpriseEventSafe` itself, which swallows its own rejections.\n *\n * Public surface is deliberately narrow — only `addTurn` should call\n * this, so the surprise telemetry path stays centralized.\n */\n private queueSurpriseTelemetryWrite(params: SurpriseTelemetryQueueEntry): void {\n this.surpriseTelemetryWriteChain = this.surpriseTelemetryWriteChain\n .then(() => this.emitSurpriseEventSafe(params))\n .catch(() => {\n // `emitSurpriseEventSafe` already handles the logging. We\n // swallow here only so one failure does not break the chain\n // for future writes.\n });\n }\n\n /**\n * Append a single `BUFFER_SURPRISE` telemetry row (issue #563 PR 3).\n *\n * Deliberately swallows write errors: the buffer must never fail to\n * record a turn because the observation ledger is read-only, out of\n * disk, or otherwise unhappy. The log line at debug lets operators\n * confirm the path fired without polluting the error channel.\n */\n private async emitSurpriseEventSafe(\n params: SurpriseTelemetryQueueEntry,\n ): Promise<void> {\n const storage = this.storage as StorageManager & {\n appendBufferSurpriseEvents?: (\n events: BufferSurpriseEvent[],\n ) => Promise<number>;\n };\n if (typeof storage.appendBufferSurpriseEvents !== \"function\") {\n // Older StorageManager / test double without the telemetry sink.\n // Silently skip — core path is still covered by the log line above.\n return;\n }\n const event: BufferSurpriseEvent = {\n event: \"BUFFER_SURPRISE\",\n // Use the decision-time stamp captured when the event was\n // queued, NOT `Date.now()` here — backpressure on the write\n // chain could otherwise shift timestamps into the future relative\n // to when the turn was scored.\n timestamp: params.timestamp,\n bufferKey: params.bufferKey,\n sessionKey: params.sessionKey,\n turnRole: params.turnRole,\n surpriseScore: params.surpriseScore,\n // Use the snapshotted threshold from the queue entry, not the\n // live config — see `SurpriseTelemetryQueueEntry.threshold`\n // doc for the rationale.\n threshold: params.threshold,\n triggeredFlush: params.triggered,\n turnCountInWindow: params.turnCountInWindow,\n };\n try {\n await storage.appendBufferSurpriseEvents([event]);\n } catch (err) {\n // Same guard as `computeSurpriseSafe`: non-Error rejections must\n // not crash the telemetry helper, which would defeat the whole\n // point of isolating the ledger write from the hot path.\n log.debug(\n `buffer[${params.bufferKey}]: surprise telemetry write failed, continuing: ${describeError(err)}`,\n );\n }\n }\n\n /**\n * Invoke the injected surprise probe defensively. Any error (probe throws,\n * embedder unavailable, timeout) is swallowed and logged at debug: the\n * surprise path must never crash the happy-path trigger evaluation. A\n * `null` return indicates \"no score available, fall through to existing\n * triggers\".\n */\n private async computeSurpriseSafe(\n bufferKey: string,\n turn: BufferTurn,\n priorTurns: readonly BufferTurn[],\n ): Promise<number | null> {\n if (!this.surpriseProbe) return null;\n try {\n // Hard timeout around the probe so a hung embedder cannot stall\n // `addTurn()` before `save()`. A slow probe would otherwise\n // prevent the just-appended turn from ever being persisted. The\n // timeout is a soft bound — we race it against the probe, take\n // whichever settles first, and treat the timeout as\n // \"probe unavailable, fall through\" rather than an error that\n // surfaces to the caller.\n const score = await probeWithTimeout(\n this.surpriseProbe.scoreTurn(bufferKey, turn, priorTurns),\n this.config.bufferSurpriseProbeTimeoutMs,\n );\n if (score === null) return null;\n if (typeof score !== \"number\" || !Number.isFinite(score)) {\n log.debug(\n `buffer[${bufferKey}]: surprise probe returned non-finite score (${String(score)}), ignoring`,\n );\n return null;\n }\n // Defensive clamp: formula lives in buffer-surprise.ts, but we never\n // want a misbehaving probe to inject an out-of-range value into the\n // threshold comparison.\n if (score < 0) return 0;\n if (score > 1) return 1;\n return score;\n } catch (err) {\n // `err` may be any thrown value — `throw null` and\n // `Promise.reject(\"x\")` are both legal. Accessing `.message` on a\n // non-Error would itself throw and defeat the failure-isolation\n // contract, so describe the value safely.\n log.debug(\n `buffer[${bufferKey}]: surprise probe failed, falling back to existing triggers: ${describeError(err)}`,\n );\n return null;\n }\n }\n\n private evaluate(entry: BufferEntryState, signalLevel: SignalLevel): TriggerDecision {\n if (this.config.triggerMode === \"smart\") {\n if (signalLevel === \"high\") return \"extract_now\";\n\n if (entry.turns.length >= this.config.bufferMaxTurns) {\n return \"extract_batch\";\n }\n\n if (entry.lastExtractionAt) {\n const elapsed =\n Date.now() - new Date(entry.lastExtractionAt).getTime();\n if (elapsed >= this.config.bufferMaxMinutes * 60_000) {\n return \"extract_batch\";\n }\n }\n\n return \"keep_buffering\";\n }\n\n if (this.config.triggerMode === \"every_n\") {\n return entry.turns.length >= this.config.bufferMaxTurns\n ? \"extract_batch\"\n : \"keep_buffering\";\n }\n\n if (this.config.triggerMode === \"time_based\") {\n if (!entry.lastExtractionAt) {\n return entry.turns.length >= this.config.bufferMaxTurns\n ? \"extract_batch\"\n : \"keep_buffering\";\n }\n const elapsed =\n Date.now() - new Date(entry.lastExtractionAt).getTime();\n return elapsed >= this.config.bufferMaxMinutes * 60_000\n ? \"extract_batch\"\n : \"keep_buffering\";\n }\n\n return \"keep_buffering\";\n }\n\n getTurns(bufferKey = \"default\"): BufferTurn[] {\n const entry = this.peekEntry(bufferKey);\n if (!entry) return [];\n const retained = entry.retainedTurns ?? [];\n // Retained turns (from a previous defer verdict, issue #562 PR 2) are\n // prepended so the chronological order — oldest context first — is\n // preserved for the next extraction pass.\n return [...retained, ...entry.turns];\n }\n\n /**\n * Retain a subset of the current turns across `clearAfterExtraction` so a\n * future extraction pass sees the context behind a deferred candidate\n * (issue #562, PR 2). Callers pass the turns that were seen during the\n * current extraction; the buffer keeps the tail (latest `max` turns) as\n * the retention window. Passing an empty array or `max <= 0` clears the\n * retention slot instead.\n */\n async retainDeferredTurns(\n bufferKey: string,\n turns: BufferTurn[],\n max = 10,\n ): Promise<void> {\n await this.enqueueMutation(async () => {\n await this.loadUnlocked();\n const entry = this.entryFor(bufferKey);\n if (!Array.isArray(turns) || turns.length === 0 || max <= 0) {\n delete entry.retainedTurns;\n } else {\n // Guard `slice(-max)` against `max === 0` (CLAUDE.md gotcha 27):\n // `slice(-0)` equals `slice(0)` and would return ALL entries. We\n // already early-return above when max <= 0.\n const tail = turns.slice(-max);\n // Copy explicit fields only — never spread an external object into a\n // plain object because spread preserves any own `__proto__` /\n // `constructor` keys that may have arrived via JSON deserialization\n // of untrusted input (CodeQL js/prototype-polluting-assignment).\n entry.retainedTurns = tail.map<BufferTurn>((t) => {\n const copy: BufferTurn = {\n role: t.role,\n content: typeof t.content === \"string\" ? t.content : \"\",\n timestamp:\n typeof t.timestamp === \"string\"\n ? t.timestamp\n : new Date().toISOString(),\n };\n if (typeof t.sessionKey === \"string\") copy.sessionKey = t.sessionKey;\n if (typeof t.logicalSessionKey === \"string\") {\n copy.logicalSessionKey = t.logicalSessionKey;\n }\n if (\n t.providerThreadId === null ||\n typeof t.providerThreadId === \"string\"\n ) {\n copy.providerThreadId = t.providerThreadId;\n }\n if (typeof t.turnFingerprint === \"string\") {\n copy.turnFingerprint = t.turnFingerprint;\n }\n if (typeof t.persistProcessedFingerprint === \"boolean\") {\n copy.persistProcessedFingerprint = t.persistProcessedFingerprint;\n }\n return copy;\n });\n }\n await this.saveUnlocked();\n });\n }\n\n /**\n * Return the current retention window (issue #562, PR 2). Primarily for\n * tests and diagnostics.\n */\n getRetainedDeferredTurns(bufferKey = \"default\"): BufferTurn[] {\n const entry = this.peekEntry(bufferKey);\n return entry?.retainedTurns ? [...entry.retainedTurns] : [];\n }\n\n async findBufferKeyForSession(sessionKey: string): Promise<string | null> {\n const bufferKeys = await this.findBufferKeysForSession(sessionKey);\n return bufferKeys[0] ?? null;\n }\n\n async findBufferKeysForSession(sessionKey: string): Promise<string[]> {\n if (typeof sessionKey !== \"string\" || sessionKey.length === 0) return [];\n await this.mutationChain.catch(() => {});\n await this.load();\n\n const matches: string[] = [];\n const directEntry = this.peekEntry(sessionKey);\n if ((directEntry?.turns.length ?? 0) > 0) {\n matches.push(sessionKey);\n }\n\n const entries = this.state.entries ?? {};\n for (const [bufferKey, entry] of Object.entries(entries)) {\n if (\n !matches.includes(bufferKey) &&\n entry.turns.some(\n (turn) =>\n typeof turn.sessionKey === \"string\" && turn.sessionKey === sessionKey,\n )\n ) {\n matches.push(bufferKey);\n }\n }\n\n return matches;\n }\n\n async clearAfterExtraction(\n bufferKey = \"default\",\n extractedTurns?: readonly BufferTurn[],\n ): Promise<void> {\n await this.enqueueMutation(async () => {\n await this.loadUnlocked();\n const entry = this.entryFor(bufferKey);\n if (Array.isArray(extractedTurns)) {\n const liveExtractedTurns = liveTurnsFromExtractionSnapshot(\n entry,\n extractedTurns,\n );\n let clearedLiveTurns = false;\n if (liveExtractedTurns.length > 0) {\n const matchedCount = matchingQueuedExtractionPrefixLength(\n entry.turns,\n liveExtractedTurns,\n );\n if (matchedCount > 0) {\n entry.turns = entry.turns.slice(matchedCount);\n clearedLiveTurns = true;\n } else {\n log.debug(\n `buffer[${bufferKey}]: extraction clear skipped because live turns changed before clear`,\n );\n }\n }\n if (!clearedLiveTurns) {\n await this.saveUnlocked();\n return;\n }\n } else {\n entry.turns = [];\n }\n entry.lastExtractionAt = new Date().toISOString();\n entry.extractionCount += 1;\n if (bufferKey === \"default\") {\n this.state.turns = entry.turns;\n this.state.lastExtractionAt = entry.lastExtractionAt;\n this.state.extractionCount = entry.extractionCount;\n }\n this.pruneEntries([bufferKey]);\n await this.saveUnlocked();\n });\n }\n\n getExtractionCount(bufferKey = \"default\"): number {\n return this.peekEntry(bufferKey)?.extractionCount ?? 0;\n }\n\n /**\n * Await any pending `BUFFER_SURPRISE` telemetry writes.\n *\n * The telemetry path is fire-and-forget from the hot path's point of\n * view, but tests and before-exit hooks sometimes need to make sure\n * the ledger has been flushed before they assert on its contents or\n * close the process. This method resolves once the current chain\n * head has settled; new writes scheduled after this call return a\n * separate, later settlement.\n *\n * Never throws — the chain already catches its own rejections.\n */\n async flushSurpriseTelemetry(): Promise<void> {\n await this.surpriseTelemetryWriteChain;\n }\n}\n\n/**\n * Render an arbitrary thrown value as a short string for debug logging.\n *\n * JavaScript permits throwing *any* value (`throw null`,\n * `Promise.reject(\"x\")`, `throw { reason: \"timeout\" }`) — not just\n * `Error` instances. The defensive catch blocks in `SmartBuffer` must\n * never themselves throw while trying to log the failure, or they\n * would defeat the whole point of isolating the surprise path from the\n * core extraction decision.\n */\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (err === null) return \"null\";\n if (err === undefined) return \"undefined\";\n if (typeof err === \"string\") return err;\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\n}\n\nfunction copyBufferTurn(turn: BufferTurn): BufferTurn {\n const copy: BufferTurn = {\n role: turn.role,\n content: turn.content,\n timestamp: turn.timestamp,\n };\n if (typeof turn.sessionKey === \"string\") copy.sessionKey = turn.sessionKey;\n if (typeof turn.logicalSessionKey === \"string\") {\n copy.logicalSessionKey = turn.logicalSessionKey;\n }\n if (\n turn.providerThreadId === null ||\n typeof turn.providerThreadId === \"string\"\n ) {\n copy.providerThreadId = turn.providerThreadId;\n }\n if (typeof turn.turnFingerprint === \"string\") {\n copy.turnFingerprint = turn.turnFingerprint;\n }\n if (typeof turn.persistProcessedFingerprint === \"boolean\") {\n copy.persistProcessedFingerprint = turn.persistProcessedFingerprint;\n }\n return copy;\n}\n\nfunction bufferTurnsEqual(left: BufferTurn | undefined, right: BufferTurn): boolean {\n if (!left) return false;\n return (\n left.role === right.role &&\n left.content === right.content &&\n left.timestamp === right.timestamp &&\n left.sessionKey === right.sessionKey &&\n left.logicalSessionKey === right.logicalSessionKey &&\n left.providerThreadId === right.providerThreadId &&\n left.turnFingerprint === right.turnFingerprint &&\n left.persistProcessedFingerprint === right.persistProcessedFingerprint\n );\n}\n\nfunction liveTurnsFromExtractionSnapshot(\n entry: BufferEntryState,\n extractedTurns: readonly BufferTurn[],\n): readonly BufferTurn[] {\n const retainedTurns = entry.retainedTurns ?? [];\n if (\n retainedTurns.length > 0 &&\n extractedTurns.length >= retainedTurns.length &&\n retainedTurns.every((turn, index) =>\n bufferTurnsEqual(extractedTurns[index], turn),\n )\n ) {\n const withoutRetainedPrefix = extractedTurns.slice(retainedTurns.length);\n if (\n withoutRetainedPrefix.length > 0 &&\n matchingPrefixLength(entry.turns, withoutRetainedPrefix) > 0\n ) {\n return withoutRetainedPrefix;\n }\n }\n return extractedTurns;\n}\n\nfunction matchingPrefixLength(\n liveTurns: readonly BufferTurn[],\n extractedTurns: readonly BufferTurn[],\n): number {\n let index = 0;\n while (\n index < liveTurns.length &&\n index < extractedTurns.length &&\n bufferTurnsEqual(liveTurns[index], extractedTurns[index])\n ) {\n index += 1;\n }\n return index;\n}\n\nfunction matchingQueuedExtractionPrefixLength(\n liveTurns: readonly BufferTurn[],\n extractedTurns: readonly BufferTurn[],\n): number {\n let bestMatchedCount = 0;\n for (let start = 0; start < extractedTurns.length; start += 1) {\n const matchedCount = matchingPrefixLength(\n liveTurns,\n extractedTurns.slice(start),\n );\n if (matchedCount > bestMatchedCount) {\n bestMatchedCount = matchedCount;\n if (bestMatchedCount === liveTurns.length) break;\n }\n }\n return bestMatchedCount;\n}\n\n/**\n * Sentinel error class for the probe timeout path. Catching it via\n * `instanceof` lets the buffer's surprise helper distinguish a timeout\n * from a probe rejection (which could carry operational context the\n * operator wants to see).\n */\nclass ProbeTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`probe exceeded ${timeoutMs}ms`);\n this.name = \"ProbeTimeoutError\";\n }\n}\n\n/**\n * Race `inflight` against a timeout clock. Resolves with `inflight`'s\n * value if it settles first, otherwise rejects with `ProbeTimeoutError`.\n * The timer is cleared in both branches so a fast-resolving probe does\n * not leak a handle that would keep the Node event loop alive.\n */\nfunction probeWithTimeout<T>(\n inflight: Promise<T>,\n timeoutMs: number,\n): Promise<T> {\n let timer: NodeJS.Timeout | null = null;\n const timeout = new Promise<T>((_, reject) => {\n timer = setTimeout(() => reject(new ProbeTimeoutError(timeoutMs)), timeoutMs);\n // `.unref()` so the timer does not hold the event loop open if the\n // caller decides the probe result is no longer interesting.\n if (typeof (timer as NodeJS.Timeout).unref === \"function\") {\n (timer as NodeJS.Timeout).unref();\n }\n });\n return Promise.race([inflight, timeout]).finally(() => {\n if (timer) clearTimeout(timer);\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/maintenance/archive-observations.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, readdir, readFile, unlink, writeFile } from \"node:fs/promises\";\n\nconst DATE_FILE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})\\.(jsonl|md)$/;\n\nexport interface ArchiveObservationsOptions {\n memoryDir: string;\n retentionDays?: number;\n dryRun?: boolean;\n now?: Date;\n}\n\nexport interface ArchiveObservationsResult {\n dryRun: boolean;\n retentionDays: number;\n scannedFiles: number;\n archivedFiles: number;\n archivedBytes: number;\n archiveRoot: string;\n archivedRelativePaths: string[];\n}\n\ninterface CandidateFile {\n absolutePath: string;\n relativePath: string;\n}\n\nfunction normalizeRetentionDays(value: number | undefined): number {\n if (!Number.isFinite(value as number)) return 30;\n return Math.max(0, Math.floor(value as number));\n}\n\nfunction extractDateFromFilename(name: string): Date | null {\n const match = DATE_FILE_PATTERN.exec(name);\n if (!match) return null;\n const iso = `${match[1]}-${match[2]}-${match[3]}T00:00:00.000Z`;\n const parsed = new Date(iso);\n if (Number.isNaN(parsed.getTime())) return null;\n return parsed;\n}\n\nfunction startOfUtcDay(value: Date): number {\n return Date.UTC(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate());\n}\n\nasync function listFilesRecursive(root: string, relPrefix = \"\"): Promise<string[]> {\n const out: string[] = [];\n let entries: Array<{ name: string; isDirectory(): boolean; isFile(): boolean }>;\n try {\n entries = (await readdir(root, { withFileTypes: true })) as Array<{\n name: string;\n isDirectory(): boolean;\n isFile(): boolean;\n }>;\n } catch {\n return out;\n }\n\n for (const entry of entries) {\n const rel = relPrefix ? path.join(relPrefix, entry.name) : entry.name;\n const full = path.join(root, entry.name);\n if (entry.isDirectory()) {\n out.push(...(await listFilesRecursive(full, rel)));\n continue;\n }\n if (entry.isFile()) out.push(rel);\n }\n\n return out;\n}\n\nasync function collectArchiveCandidates(\n memoryDir: string,\n cutoffTimeMs: number,\n): Promise<CandidateFile[]> {\n const roots = [\"transcripts\", path.join(\"state\", \"tool-usage\"), path.join(\"summaries\", \"hourly\")];\n const out: CandidateFile[] = [];\n\n for (const relRoot of roots) {\n const absRoot = path.join(memoryDir, relRoot);\n const files = await listFilesRecursive(absRoot);\n for (const fileRel of files) {\n const filename = path.basename(fileRel);\n const parsedDate = extractDateFromFilename(filename);\n if (!parsedDate) continue;\n if (parsedDate.getTime() >= cutoffTimeMs) continue;\n out.push({\n absolutePath: path.join(absRoot, fileRel),\n relativePath: path.join(relRoot, fileRel),\n });\n }\n }\n\n out.sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n return out;\n}\n\nexport async function archiveObservations(\n options: ArchiveObservationsOptions,\n): Promise<ArchiveObservationsResult> {\n const retentionDays = normalizeRetentionDays(options.retentionDays);\n const dryRun = options.dryRun !== false;\n const now = options.now ?? new Date();\n const cutoffDayStartUtc = startOfUtcDay(\n new Date(now.getTime() - retentionDays * 24 * 60 * 60 * 1000),\n );\n const stamp = now.toISOString().replace(/[-:]/g, \"\").replace(/\\.\\d{3}Z$/, \"Z\");\n const archiveRoot = path.join(options.memoryDir, \"archive\", \"observations\", stamp);\n const candidates =\n retentionDays === 0\n ? []\n : await collectArchiveCandidates(\n options.memoryDir,\n cutoffDayStartUtc,\n );\n\n let archivedFiles = 0;\n let archivedBytes = 0;\n const archivedRelativePaths: string[] = [];\n\n if (!dryRun && candidates.length > 0) {\n await mkdir(archiveRoot, { recursive: true });\n for (const candidate of candidates) {\n const archivePath = path.join(archiveRoot, candidate.relativePath);\n const archiveDir = path.dirname(archivePath);\n await mkdir(archiveDir, { recursive: true });\n const raw = await readFile(candidate.absolutePath);\n await writeFile(archivePath, raw);\n await unlink(candidate.absolutePath);\n archivedFiles += 1;\n archivedBytes += raw.byteLength;\n archivedRelativePaths.push(candidate.relativePath);\n }\n } else {\n archivedRelativePaths.push(...candidates.map((c) => c.relativePath));\n }\n\n return {\n dryRun,\n retentionDays,\n scannedFiles: candidates.length,\n archivedFiles,\n archivedBytes,\n archiveRoot,\n archivedRelativePaths,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transfer/export-sqlite.ts"],"sourcesContent":["import path from \"node:path\";\nimport { SQLITE_SCHEMA_VERSION, SQLITE_TABLES_SQL } from \"./sqlite-schema.js\";\nimport { listFilesRecursive, readUtf8FileStrict, toPosixRelPath } from \"./fs-utils.js\";\nimport { openBetterSqlite3 } from \"../runtime/better-sqlite.js\";\nimport { computeTransferOutputRel, isTransferPathExcluded } from \"./exclusions.js\";\n\nexport interface ExportSqliteOptions {\n memoryDir: string;\n outFile: string;\n includeTranscripts?: boolean;\n pluginVersion: string;\n}\n\nexport async function exportSqlite(opts: ExportSqliteOptions): Promise<void> {\n const includeTranscripts = opts.includeTranscripts === true;\n const memDirAbs = path.resolve(opts.memoryDir);\n const outAbs = path.resolve(opts.outFile);\n const outputRelPosix = computeTransferOutputRel(memDirAbs, outAbs);\n\n const filesAbs = await listFilesRecursive(memDirAbs);\n const db = openBetterSqlite3(outAbs);\n try {\n db.exec(\"PRAGMA journal_mode=WAL;\");\n db.exec(SQLITE_TABLES_SQL);\n\n const insertMeta = db.prepare(\"INSERT OR REPLACE INTO meta(key,value) VALUES (?,?)\");\n insertMeta.run(\"schemaVersion\", String(SQLITE_SCHEMA_VERSION));\n insertMeta.run(\"createdAt\", new Date().toISOString());\n insertMeta.run(\"pluginVersion\", opts.pluginVersion);\n insertMeta.run(\"includesTranscripts\", includeTranscripts ? \"true\" : \"false\");\n\n const insertFile = db.prepare(\n \"INSERT OR REPLACE INTO files(path_rel, bytes, sha256, content) VALUES (?,?,?,?)\",\n );\n\n const tx = db.transaction((rows: Array<{ rel: string; bytes: number; sha256: string; content: string }>) => {\n for (const r of rows) insertFile.run(r.rel, r.bytes, r.sha256, r.content);\n });\n\n const rows: Array<{ rel: string; bytes: number; sha256: string; content: string }> = [];\n for (const abs of filesAbs) {\n const relPosix = toPosixRelPath(abs, memDirAbs);\n if (isTransferPathExcluded(relPosix, { includeTranscripts, outputRelPosix })) continue;\n const { content, sha256, bytes } = await readUtf8FileStrict(abs);\n rows.push({ rel: relPosix, bytes, sha256, content });\n }\n\n tx(rows);\n } finally {\n db.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU;AAajB,eAAsB,aAAa,MAA0C;AAC3E,QAAM,qBAAqB,KAAK,uBAAuB;AACvD,QAAM,YAAY,KAAK,QAAQ,KAAK,SAAS;AAC7C,QAAM,SAAS,KAAK,QAAQ,KAAK,OAAO;AACxC,QAAM,iBAAiB,yBAAyB,WAAW,MAAM;AAEjE,QAAM,WAAW,MAAM,mBAAmB,SAAS;AACnD,QAAM,KAAK,kBAAkB,MAAM;AACnC,MAAI;AACF,OAAG,KAAK,0BAA0B;AAClC,OAAG,KAAK,iBAAiB;AAEzB,UAAM,aAAa,GAAG,QAAQ,qDAAqD;AACnF,eAAW,IAAI,iBAAiB,OAAO,qBAAqB,CAAC;AAC7D,eAAW,IAAI,cAAa,oBAAI,KAAK,GAAE,YAAY,CAAC;AACpD,eAAW,IAAI,iBAAiB,KAAK,aAAa;AAClD,eAAW,IAAI,uBAAuB,qBAAqB,SAAS,OAAO;AAE3E,UAAM,aAAa,GAAG;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,KAAK,GAAG,YAAY,CAACA,UAAiF;AAC1G,iBAAW,KAAKA,MAAM,YAAW,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO;AAAA,IAC1E,CAAC;AAED,UAAM,OAA+E,CAAC;AACtF,eAAW,OAAO,UAAU;AAC1B,YAAM,WAAW,eAAe,KAAK,SAAS;AAC9C,UAAI,uBAAuB,UAAU,EAAE,oBAAoB,eAAe,CAAC,EAAG;AAC9E,YAAM,EAAE,SAAS,QAAQ,MAAM,IAAI,MAAM,mBAAmB,GAAG;AAC/D,WAAK,KAAK,EAAE,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAAC;AAAA,IACrD;AAEA,OAAG,IAAI;AAAA,EACT,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;","names":["rows"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/claude-code.ts"],"sourcesContent":["import { headerValue, type AdapterContext, type EngramAdapter, type ResolvedIdentity } from \"./types.js\";\n\n/**\n * Claude Code adapter.\n *\n * Detection: Claude Code sends clientInfo.name = \"claude-code\" in the\n * MCP initialize handshake, and User-Agent: claude-code/<version> in\n * HTTP requests. Project path is available via MCP ListRoots capability\n * (server receives the cwd as a file:// URI root), not via headers.\n *\n * For HTTP REST (non-MCP) requests, detection relies on User-Agent or\n * user-configured X-Engram-Client-Id header in .claude.json headers.\n *\n * Namespace/principal can be set by configuring custom headers in\n * .claude.json or .mcp.json:\n * \"headers\": { \"X-Engram-Namespace\": \"my-project\", \"X-Engram-Principal\": \"my-team\" }\n */\nexport class ClaudeCodeAdapter implements EngramAdapter {\n readonly id = \"claude-code\";\n\n matches(context: AdapterContext): boolean {\n // Primary: MCP clientInfo from initialize handshake (exact match)\n if (context.clientInfo?.name === \"claude-code\") return true;\n\n // Fallback: User-Agent header (Claude Code sends \"claude-code/<version>\")\n const ua = headerValue(context.headers, \"user-agent\");\n if (ua && ua.toLowerCase().startsWith(\"claude-code/\")) return true;\n\n // Fallback: user-configured client identifier header\n const clientId = headerValue(context.headers, \"x-engram-client-id\");\n if (clientId?.toLowerCase() === \"claude-code\") return true;\n\n return false;\n }\n\n resolveIdentity(context: AdapterContext): ResolvedIdentity {\n // MCP session ID (standard MCP header, server-assigned)\n const mcpSessionId = headerValue(context.headers, \"mcp-session-id\");\n\n // Principal: explicit header > default\n const principal = headerValue(context.headers, \"x-engram-principal\")\n || \"claude-code\";\n\n // Namespace: explicit header > default\n const namespace = headerValue(context.headers, \"x-engram-namespace\")\n || \"claude-code\";\n\n return {\n namespace,\n principal,\n sessionKey: mcpSessionId ?? context.sessionKey,\n adapterId: this.id,\n };\n }\n}\n\n"],"mappings":";;;;;AAiBO,IAAM,oBAAN,MAAiD;AAAA,EAC7C,KAAK;AAAA,EAEd,QAAQ,SAAkC;AAExC,QAAI,QAAQ,YAAY,SAAS,cAAe,QAAO;AAGvD,UAAM,KAAK,YAAY,QAAQ,SAAS,YAAY;AACpD,QAAI,MAAM,GAAG,YAAY,EAAE,WAAW,cAAc,EAAG,QAAO;AAG9D,UAAM,WAAW,YAAY,QAAQ,SAAS,oBAAoB;AAClE,QAAI,UAAU,YAAY,MAAM,cAAe,QAAO;AAEtD,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,SAA2C;AAEzD,UAAM,eAAe,YAAY,QAAQ,SAAS,gBAAgB;AAGlE,UAAM,YAAY,YAAY,QAAQ,SAAS,oBAAoB,KAC9D;AAGL,UAAM,YAAY,YAAY,QAAQ,SAAS,oBAAoB,KAC9D;AAEL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY,gBAAgB,QAAQ;AAAA,MACpC,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/maintenance/memory-governance.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { StorageManager } from \"../storage.js\";\nimport { decideLifecycleTransition } from \"../lifecycle.js\";\nimport type { MemoryFile, MemoryStatus } from \"../types.js\";\n\nexport type MemoryGovernanceMode = \"shadow\" | \"apply\";\nexport type MemoryGovernanceReasonCode =\n | \"exact_duplicate\"\n | \"semantic_duplicate_candidate\"\n | \"disputed_memory\"\n | \"speculative_low_confidence\"\n | \"archive_candidate\"\n | \"explicit_capture_review\"\n | \"malformed_import\";\n\nexport interface MemoryGovernanceReviewQueueEntry {\n entryId: string;\n memoryId: string;\n path: string;\n reasonCode: MemoryGovernanceReasonCode;\n severity: \"low\" | \"medium\" | \"high\";\n suggestedAction: \"set_status\" | \"archive\";\n suggestedStatus?: Extract<MemoryStatus, \"pending_review\" | \"quarantined\" | \"rejected\">;\n relatedMemoryIds: string[];\n}\n\nexport interface MemoryGovernanceAppliedAction {\n action: \"set_status\" | \"archive\";\n memoryId: string;\n reasonCode: MemoryGovernanceReviewQueueEntry[\"reasonCode\"];\n beforeStatus: MemoryStatus;\n afterStatus?: MemoryStatus;\n originalPath: string;\n currentPath: string;\n}\n\ninterface MemoryGovernanceRestoreEntry {\n action: MemoryGovernanceAppliedAction[\"action\"];\n memoryId: string;\n reasonCode: MemoryGovernanceReviewQueueEntry[\"reasonCode\"];\n originalPath: string;\n currentPath: string;\n beforeRaw: string;\n expectedCurrentRaw?: string;\n applied: boolean;\n}\n\nexport interface MemoryGovernanceRestoreManifest {\n runId: string;\n createdAt: string;\n entries: MemoryGovernanceRestoreEntry[];\n}\n\nexport interface MemoryGovernanceSummary {\n schemaVersion: 1;\n runId: string;\n traceId: string;\n mode: MemoryGovernanceMode;\n createdAt: string;\n scannedMemories: number;\n reviewQueueCount: number;\n proposedActionCount: number;\n appliedActionCount: number;\n ruleVersion: string;\n}\n\nexport interface MemoryGovernanceMetrics {\n reviewReasons: Record<MemoryGovernanceReasonCode, number>;\n proposedStatuses: Record<string, number>;\n keptMemoryCount: number;\n qualityScore: MemoryGovernanceQualityScore;\n}\n\nexport interface MemoryGovernanceQualityScore {\n score: number;\n maxScore: 100;\n grade: \"excellent\" | \"good\" | \"fair\" | \"poor\";\n deductions: Array<{\n reasonCode: MemoryGovernanceReasonCode;\n count: number;\n pointsLost: number;\n }>;\n}\n\nexport interface MemoryGovernanceTransitionReport {\n proposed: Record<string, MemoryGovernanceAppliedAction[]>;\n applied: Record<string, MemoryGovernanceAppliedAction[]>;\n}\n\nexport interface MemoryGovernanceManifest {\n schemaVersion: 1;\n runId: string;\n traceId: string;\n mode: MemoryGovernanceMode;\n createdAt: string;\n ruleVersion: string;\n artifacts: Record<string, string>;\n}\n\nexport interface MemoryGovernanceRunResult {\n runId: string;\n traceId: string;\n mode: MemoryGovernanceMode;\n summary: MemoryGovernanceSummary;\n summaryPath: string;\n reviewQueuePath: string;\n qualityScorePath: string;\n transitionReportPath: string;\n reportPath: string;\n keptMemoriesPath: string;\n appliedActionsPath: string;\n metricsPath: string;\n manifestPath: string;\n restorePath?: string;\n reviewQueue: MemoryGovernanceReviewQueueEntry[];\n proposedActions: MemoryGovernanceAppliedAction[];\n appliedActions: MemoryGovernanceAppliedAction[];\n}\n\nexport interface RestoreMemoryGovernanceRunResult {\n runId: string;\n restoredActions: number;\n restorePath: string;\n}\n\nexport interface RunMemoryGovernanceOptions {\n memoryDir: string;\n mode: MemoryGovernanceMode;\n now?: Date;\n maxMemories?: number;\n batchSize?: number;\n recentDays?: number;\n}\n\nexport interface RestoreMemoryGovernanceRunOptions {\n memoryDir: string;\n runId: string;\n now?: Date;\n}\n\nconst RULE_VERSION = \"memory-governance.v2\";\nconst SEMANTIC_DUPLICATE_MIN_TOKENS = 6;\nconst SEMANTIC_DUPLICATE_MIN_JACCARD = 0.66;\nconst QUALITY_SCORE_WEIGHTS: Record<MemoryGovernanceReasonCode, number> = {\n exact_duplicate: 6,\n semantic_duplicate_candidate: 4,\n disputed_memory: 15,\n speculative_low_confidence: 8,\n archive_candidate: 2,\n explicit_capture_review: 5,\n malformed_import: 12,\n};\n\nfunction governanceRunsDir(memoryDir: string): string {\n return path.join(memoryDir, \"state\", \"memory-governance\", \"runs\");\n}\n\nfunction governanceRunDir(memoryDir: string, runId: string): string {\n return path.join(governanceRunsDir(memoryDir), runId);\n}\n\nfunction governanceRestorePath(memoryDir: string, runId: string): string {\n return path.join(governanceRunDir(memoryDir, runId), \"restore.json\");\n}\n\nfunction buildRunId(now: Date): string {\n return `gov-${now.toISOString().replace(/[:.]/g, \"-\")}`;\n}\n\nfunction plannedArchivePath(memoryDir: string, originalPath: string, now: Date): string {\n return path.join(\n memoryDir,\n \"archive\",\n now.toISOString().slice(0, 10),\n path.basename(originalPath),\n );\n}\n\nfunction normalizeContent(content: string): string {\n return content.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction statusOf(memory: MemoryFile): MemoryStatus {\n return memory.frontmatter.status ?? \"active\";\n}\n\nfunction parseIsoMs(value?: string): number | null {\n if (!value) return null;\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : null;\n}\n\nfunction daysSince(value: string | undefined, now: Date): number {\n const ts = parseIsoMs(value);\n if (ts === null) return 365;\n return Math.max(0, (now.getTime() - ts) / 86_400_000);\n}\n\nfunction compareCanonicalPreference(left: MemoryFile, right: MemoryFile): number {\n if (left.frontmatter.confidence !== right.frontmatter.confidence) {\n return (right.frontmatter.confidence ?? 0) - (left.frontmatter.confidence ?? 0);\n }\n return left.frontmatter.created.localeCompare(right.frontmatter.created);\n}\n\nfunction proposedStatusPriority(status: MemoryStatus): number {\n switch (status) {\n case \"quarantined\":\n return 4;\n case \"rejected\":\n return 3;\n case \"archived\":\n return 2;\n case \"pending_review\":\n return 1;\n default:\n return 0;\n }\n}\n\nfunction proposedActionPriority(action: MemoryGovernanceAppliedAction): number {\n if (action.action === \"archive\") {\n return proposedStatusPriority(\"archived\");\n }\n return proposedStatusPriority(action.afterStatus ?? \"active\");\n}\n\nfunction tokenizeSemanticContent(content: string): string[] {\n return Array.from(\n new Set(\n normalizeContent(content)\n .replaceAll(/[^\\p{L}\\p{N}]+/gu, \" \")\n .split(\" \")\n .filter((token) => token.length >= 4),\n ),\n );\n}\n\nfunction jaccardSimilarity(left: string[], right: string[]): number {\n if (left.length === 0 || right.length === 0) return 0;\n const leftSet = new Set(left);\n const rightSet = new Set(right);\n let intersection = 0;\n for (const token of leftSet) {\n if (rightSet.has(token)) intersection += 1;\n }\n const union = new Set([...leftSet, ...rightSet]).size;\n return union > 0 ? intersection / union : 0;\n}\n\nfunction sameSemanticDuplicateScope(left: MemoryFile, right: MemoryFile): boolean {\n if (left.frontmatter.category !== right.frontmatter.category) return false;\n const leftEntityRef = left.frontmatter.entityRef?.trim();\n const rightEntityRef = right.frontmatter.entityRef?.trim();\n if (leftEntityRef && rightEntityRef && leftEntityRef !== rightEntityRef) return false;\n return true;\n}\n\nfunction buildSemanticDuplicateEntries(activeMemories: MemoryFile[]): MemoryGovernanceReviewQueueEntry[] {\n const reviewQueue: MemoryGovernanceReviewQueueEntry[] = [];\n const ordered = [...activeMemories].sort(compareCanonicalPreference);\n const tokensByMemoryId = new Map(\n ordered.map((memory) => [memory.frontmatter.id, tokenizeSemanticContent(memory.content)] as const),\n );\n const claimed = new Set<string>();\n\n for (let candidateIndex = 1; candidateIndex < ordered.length; candidateIndex += 1) {\n const candidate = ordered[candidateIndex];\n if (claimed.has(candidate.frontmatter.id)) continue;\n const candidateTokens = tokensByMemoryId.get(candidate.frontmatter.id) ?? [];\n if (candidateTokens.length < SEMANTIC_DUPLICATE_MIN_TOKENS) continue;\n const candidateNormalized = normalizeContent(candidate.content);\n\n for (let canonicalIndex = 0; canonicalIndex < candidateIndex; canonicalIndex += 1) {\n const canonical = ordered[canonicalIndex];\n if (!sameSemanticDuplicateScope(canonical, candidate)) continue;\n const canonicalNormalized = normalizeContent(canonical.content);\n if (canonicalNormalized === candidateNormalized) continue;\n const canonicalTokens = tokensByMemoryId.get(canonical.frontmatter.id) ?? [];\n if (canonicalTokens.length < SEMANTIC_DUPLICATE_MIN_TOKENS) continue;\n\n const shorter = Math.min(candidateTokens.length, canonicalTokens.length);\n const longer = Math.max(candidateTokens.length, canonicalTokens.length);\n if (shorter / longer < 0.6) continue;\n if (jaccardSimilarity(candidateTokens, canonicalTokens) < SEMANTIC_DUPLICATE_MIN_JACCARD) continue;\n\n reviewQueue.push({\n entryId: `review:${candidate.frontmatter.id}:semantic_duplicate_candidate`,\n memoryId: candidate.frontmatter.id,\n path: candidate.path,\n reasonCode: \"semantic_duplicate_candidate\",\n severity: \"medium\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"pending_review\",\n relatedMemoryIds: [canonical.frontmatter.id],\n });\n claimed.add(candidate.frontmatter.id);\n break;\n }\n }\n\n return reviewQueue;\n}\n\nfunction buildExplicitCaptureReviewEntries(\n memories: MemoryFile[],\n lifecycleEvents: Array<{\n memoryId: string;\n eventType: string;\n reasonCode?: string;\n }>,\n): MemoryGovernanceReviewQueueEntry[] {\n const explicitQueuedIds = new Set(\n lifecycleEvents\n .filter((event) => event.eventType === \"explicit_capture_queued\")\n .map((event) => event.memoryId),\n );\n\n return memories\n .filter((memory) => {\n if (statusOf(memory) !== \"pending_review\") return false;\n const tags = memory.frontmatter.tags ?? [];\n if (tags.includes(\"queued-review\")) return true;\n if (explicitQueuedIds.has(memory.frontmatter.id)) return true;\n return memory.frontmatter.source === \"explicit-review\" || memory.frontmatter.source === \"explicit-inline-review\";\n })\n .map((memory) => ({\n entryId: `review:${memory.frontmatter.id}:explicit_capture_review`,\n memoryId: memory.frontmatter.id,\n path: memory.path,\n reasonCode: \"explicit_capture_review\" as const,\n severity: \"medium\" as const,\n suggestedAction: \"set_status\" as const,\n suggestedStatus: \"pending_review\" as const,\n relatedMemoryIds: [],\n }));\n}\n\nasync function listMarkdownFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n const walk = async (dir: string) => {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n if (entry.isFile() && entry.name.endsWith(\".md\")) {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory may not exist yet.\n }\n };\n\n await walk(root);\n return files;\n}\n\nfunction malformedMemoryId(memoryDir: string, filePath: string): string {\n return `malformed:${path.relative(memoryDir, filePath).replaceAll(path.sep, \"/\")}`;\n}\n\nasync function buildMalformedImportEntries(\n memoryDir: string,\n storage: StorageManager,\n parsedMemories: MemoryFile[],\n candidateFiles?: string[],\n): Promise<MemoryGovernanceReviewQueueEntry[]> {\n const parsedPaths = new Set(parsedMemories.map((memory) => memory.path));\n const filesToInspect = candidateFiles ?? [\n ...await listMarkdownFiles(path.join(memoryDir, \"facts\")),\n ...await listMarkdownFiles(path.join(memoryDir, \"corrections\")),\n ];\n const entries: MemoryGovernanceReviewQueueEntry[] = [];\n\n for (const filePath of filesToInspect) {\n if (parsedPaths.has(filePath)) continue;\n const parsed = await storage.readMemoryByPath(filePath);\n if (parsed) continue;\n entries.push({\n entryId: `review:${malformedMemoryId(memoryDir, filePath)}:malformed_import`,\n memoryId: malformedMemoryId(memoryDir, filePath),\n path: filePath,\n reasonCode: \"malformed_import\",\n severity: \"high\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"quarantined\",\n relatedMemoryIds: [],\n });\n }\n\n return entries;\n}\n\nasync function buildReviewQueue(\n memoryDir: string,\n storage: StorageManager,\n memories: MemoryFile[],\n now: Date,\n options: {\n malformedCandidateFiles?: string[];\n } = {},\n): Promise<MemoryGovernanceReviewQueueEntry[]> {\n const reviewQueue: MemoryGovernanceReviewQueueEntry[] = [];\n const activeMemories = memories.filter((memory) => statusOf(memory) === \"active\");\n const duplicateBuckets = new Map<string, MemoryFile[]>();\n\n for (const memory of activeMemories) {\n const key = `${memory.frontmatter.category}:${normalizeContent(memory.content)}`;\n const bucket = duplicateBuckets.get(key) ?? [];\n bucket.push(memory);\n duplicateBuckets.set(key, bucket);\n }\n\n for (const bucket of duplicateBuckets.values()) {\n if (bucket.length < 2) continue;\n const ordered = [...bucket].sort(compareCanonicalPreference);\n const canonical = ordered[0];\n for (const duplicate of ordered.slice(1)) {\n reviewQueue.push({\n entryId: `review:${duplicate.frontmatter.id}:exact_duplicate`,\n memoryId: duplicate.frontmatter.id,\n path: duplicate.path,\n reasonCode: \"exact_duplicate\",\n severity: \"medium\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"pending_review\",\n relatedMemoryIds: canonical ? [canonical.frontmatter.id] : [],\n });\n }\n }\n\n reviewQueue.push(...buildSemanticDuplicateEntries(activeMemories));\n\n for (const memory of activeMemories) {\n if (memory.frontmatter.verificationState === \"disputed\") {\n reviewQueue.push({\n entryId: `review:${memory.frontmatter.id}:disputed_memory`,\n memoryId: memory.frontmatter.id,\n path: memory.path,\n reasonCode: \"disputed_memory\",\n severity: \"high\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"quarantined\",\n relatedMemoryIds: [],\n });\n }\n\n if (\n memory.frontmatter.confidenceTier === \"speculative\"\n && (memory.frontmatter.confidence ?? 0) <= 0.25\n ) {\n reviewQueue.push({\n entryId: `review:${memory.frontmatter.id}:speculative_low_confidence`,\n memoryId: memory.frontmatter.id,\n path: memory.path,\n reasonCode: \"speculative_low_confidence\",\n severity: \"medium\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"pending_review\",\n relatedMemoryIds: [],\n });\n }\n\n const lifecycle = decideLifecycleTransition(memory, {}, now);\n const staleForArchive = memory.frontmatter.lifecycleState === \"stale\"\n && daysSince(memory.frontmatter.updated ?? memory.frontmatter.created, now) >= 180;\n if ((lifecycle.nextState === \"archived\" && lifecycle.changed) || staleForArchive) {\n reviewQueue.push({\n entryId: `review:${memory.frontmatter.id}:archive_candidate`,\n memoryId: memory.frontmatter.id,\n path: memory.path,\n reasonCode: \"archive_candidate\",\n severity: \"low\",\n suggestedAction: \"archive\",\n relatedMemoryIds: [],\n });\n }\n }\n\n const lifecycleEvents = await storage.readMemoryLifecycleEvents(Number.MAX_SAFE_INTEGER);\n reviewQueue.push(...buildExplicitCaptureReviewEntries(memories, lifecycleEvents));\n reviewQueue.push(...await buildMalformedImportEntries(\n memoryDir,\n storage,\n memories,\n options.malformedCandidateFiles,\n ));\n\n return reviewQueue;\n}\n\nexport function buildProposedActions(\n reviewQueue: MemoryGovernanceReviewQueueEntry[],\n memories: MemoryFile[],\n): MemoryGovernanceAppliedAction[] {\n const byMemory = new Map(memories.map((memory) => [memory.frontmatter.id, memory]));\n const selected = new Map<string, MemoryGovernanceAppliedAction>();\n\n for (const entry of reviewQueue) {\n const memory = byMemory.get(entry.memoryId);\n if (!memory) continue;\n const currentStatus = statusOf(memory);\n if (\n entry.suggestedAction === \"set_status\"\n && entry.suggestedStatus\n && entry.suggestedStatus === currentStatus\n ) {\n continue;\n }\n const candidate: MemoryGovernanceAppliedAction = {\n action: entry.suggestedAction,\n memoryId: entry.memoryId,\n reasonCode: entry.reasonCode,\n beforeStatus: currentStatus,\n afterStatus: entry.suggestedStatus,\n originalPath: memory.path,\n currentPath: memory.path,\n };\n\n const existing = selected.get(entry.memoryId);\n if (!existing) {\n selected.set(entry.memoryId, candidate);\n continue;\n }\n\n const existingPriority = proposedActionPriority(existing);\n const candidatePriority = proposedActionPriority(candidate);\n if (candidatePriority > existingPriority) {\n selected.set(entry.memoryId, candidate);\n }\n }\n\n return [...selected.values()];\n}\n\nfunction buildMetrics(\n reviewQueue: MemoryGovernanceReviewQueueEntry[],\n proposedActions: MemoryGovernanceAppliedAction[],\n scannedMemories: number,\n): MemoryGovernanceMetrics {\n const reviewReasons: MemoryGovernanceMetrics[\"reviewReasons\"] = {\n exact_duplicate: 0,\n semantic_duplicate_candidate: 0,\n disputed_memory: 0,\n speculative_low_confidence: 0,\n archive_candidate: 0,\n explicit_capture_review: 0,\n malformed_import: 0,\n };\n const proposedStatuses: Record<string, number> = {};\n\n for (const entry of reviewQueue) {\n reviewReasons[entry.reasonCode] += 1;\n }\n\n for (const action of proposedActions) {\n const effectiveStatus = action.afterStatus ?? (action.action === \"archive\" ? \"archived\" : undefined);\n if (!effectiveStatus) continue;\n proposedStatuses[effectiveStatus] = (proposedStatuses[effectiveStatus] ?? 0) + 1;\n }\n\n return {\n reviewReasons,\n proposedStatuses,\n keptMemoryCount: Math.max(0, scannedMemories - proposedActions.length),\n qualityScore: buildQualityScore(reviewReasons),\n };\n}\n\nexport function buildQualityScore(\n reviewReasons: Record<MemoryGovernanceReasonCode, number>,\n): MemoryGovernanceQualityScore {\n const deductions = Object.entries(reviewReasons)\n .map(([reasonCode, count]) => ({\n reasonCode: reasonCode as MemoryGovernanceReasonCode,\n count,\n pointsLost: count * QUALITY_SCORE_WEIGHTS[reasonCode as MemoryGovernanceReasonCode],\n }))\n .filter((entry) => entry.count > 0)\n .sort((left, right) => right.pointsLost - left.pointsLost);\n const totalPointsLost = deductions.reduce((sum, entry) => sum + entry.pointsLost, 0);\n const score = Math.max(0, 100 - totalPointsLost);\n const grade = score >= 90 ? \"excellent\"\n : score >= 75 ? \"good\"\n : score >= 50 ? \"fair\"\n : \"poor\";\n return {\n score,\n maxScore: 100,\n grade,\n deductions,\n };\n}\n\nexport function groupActionsByStatus(\n actions: MemoryGovernanceAppliedAction[],\n): Record<string, MemoryGovernanceAppliedAction[]> {\n const grouped: Record<string, MemoryGovernanceAppliedAction[]> = {};\n for (const action of actions) {\n const status = action.afterStatus ?? (action.action === \"archive\" ? \"archived\" : \"unchanged\");\n const bucket = grouped[status] ?? [];\n bucket.push(action);\n grouped[status] = bucket;\n }\n return grouped;\n}\n\nasync function safeRead(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nasync function persistRestoreManifest(\n memoryDir: string,\n manifest: MemoryGovernanceRestoreManifest,\n): Promise<string> {\n const restorePath = governanceRestorePath(memoryDir, manifest.runId);\n await mkdir(path.dirname(restorePath), { recursive: true });\n await writeFile(restorePath, JSON.stringify(manifest, null, 2), \"utf-8\");\n return restorePath;\n}\n\nasync function writeGovernanceArtifacts(options: {\n memoryDir: string;\n runId: string;\n traceId: string;\n summary: MemoryGovernanceSummary;\n metrics: MemoryGovernanceMetrics;\n qualityScore: MemoryGovernanceQualityScore;\n transitionReport: MemoryGovernanceTransitionReport;\n keptMemoryIds: string[];\n reviewQueue: MemoryGovernanceReviewQueueEntry[];\n proposedActions: MemoryGovernanceAppliedAction[];\n appliedActions: MemoryGovernanceAppliedAction[];\n restoreManifest?: MemoryGovernanceRestoreManifest;\n}): Promise<\n Pick<\n MemoryGovernanceRunResult,\n | \"summaryPath\"\n | \"reviewQueuePath\"\n | \"qualityScorePath\"\n | \"transitionReportPath\"\n | \"reportPath\"\n | \"keptMemoriesPath\"\n | \"appliedActionsPath\"\n | \"metricsPath\"\n | \"manifestPath\"\n | \"restorePath\"\n >\n> {\n const runDir = governanceRunDir(options.memoryDir, options.runId);\n await mkdir(runDir, { recursive: true });\n\n const summaryPath = path.join(runDir, \"summary.json\");\n const reviewQueuePath = path.join(runDir, \"review-queue.json\");\n const qualityScorePath = path.join(runDir, \"quality-score.json\");\n const transitionReportPath = path.join(runDir, \"status-transitions.json\");\n const reportPath = path.join(runDir, \"report.md\");\n const keptMemoriesPath = path.join(runDir, \"kept-memories.json\");\n const appliedActionsPath = path.join(runDir, \"applied-actions.json\");\n const metricsPath = path.join(runDir, \"metrics.json\");\n const manifestPath = path.join(runDir, \"manifest.json\");\n const restorePath = options.restoreManifest ? governanceRestorePath(options.memoryDir, options.runId) : undefined;\n\n await writeFile(summaryPath, JSON.stringify(options.summary, null, 2), \"utf-8\");\n await writeFile(reviewQueuePath, JSON.stringify(options.reviewQueue, null, 2), \"utf-8\");\n await writeFile(qualityScorePath, JSON.stringify(options.qualityScore, null, 2), \"utf-8\");\n await writeFile(transitionReportPath, JSON.stringify(options.transitionReport, null, 2), \"utf-8\");\n await writeFile(keptMemoriesPath, JSON.stringify(options.keptMemoryIds, null, 2), \"utf-8\");\n await writeFile(appliedActionsPath, JSON.stringify(options.appliedActions, null, 2), \"utf-8\");\n await writeFile(metricsPath, JSON.stringify(options.metrics, null, 2), \"utf-8\");\n await writeFile(\n reportPath,\n [\n `# Memory Governance Run ${options.runId}`,\n \"\",\n `- Trace ID: ${options.traceId}`,\n `- Mode: ${options.summary.mode}`,\n `- Scanned memories: ${options.summary.scannedMemories}`,\n `- Kept memories: ${options.metrics.keptMemoryCount}`,\n `- Review queue entries: ${options.summary.reviewQueueCount}`,\n `- Proposed actions: ${options.summary.proposedActionCount}`,\n `- Applied actions: ${options.summary.appliedActionCount}`,\n `- Quality score: ${options.qualityScore.score}/${options.qualityScore.maxScore} (${options.qualityScore.grade})`,\n \"\",\n \"## Metrics\",\n ...Object.entries(options.metrics.reviewReasons).map(([reason, count]) => `- ${reason}: ${count}`),\n ...(Object.entries(options.metrics.proposedStatuses).length > 0\n ? Object.entries(options.metrics.proposedStatuses).map(([status, count]) => `- proposed ${status}: ${count}`)\n : [\"- proposed statuses: (none)\"]),\n \"\",\n \"## Quality Score\",\n ...(options.qualityScore.deductions.length > 0\n ? options.qualityScore.deductions.map((entry) => `- ${entry.reasonCode}: ${entry.count} -> -${entry.pointsLost}`)\n : [\"- no deductions\"]),\n \"\",\n \"## Proposed Actions\",\n ...(options.proposedActions.length > 0\n ? options.proposedActions.map((action) =>\n `- ${action.memoryId}: ${action.action}${action.afterStatus ? ` -> ${action.afterStatus}` : \"\"} [${action.reasonCode}]`,\n )\n : [\"- (empty)\"]),\n \"\",\n \"## Applied Actions\",\n ...(options.appliedActions.length > 0\n ? options.appliedActions.map((action) =>\n `- ${action.memoryId}: ${action.action}${action.afterStatus ? ` -> ${action.afterStatus}` : \"\"} [${action.reasonCode}]`,\n )\n : [\"- (empty)\"]),\n \"\",\n \"## Review Queue\",\n ...(options.reviewQueue.length > 0\n ? options.reviewQueue.map((entry) =>\n `- ${entry.memoryId}: ${entry.reasonCode} -> ${entry.suggestedAction}${entry.suggestedStatus ? ` (${entry.suggestedStatus})` : \"\"}`,\n )\n : [\"- (empty)\"]),\n ].join(\"\\n\"),\n \"utf-8\",\n );\n const manifest: MemoryGovernanceManifest = {\n schemaVersion: 1,\n runId: options.runId,\n traceId: options.traceId,\n mode: options.summary.mode,\n createdAt: options.summary.createdAt,\n ruleVersion: options.summary.ruleVersion,\n artifacts: {\n summary: summaryPath,\n reviewQueue: reviewQueuePath,\n qualityScore: qualityScorePath,\n transitionReport: transitionReportPath,\n report: reportPath,\n keptMemories: keptMemoriesPath,\n appliedActions: appliedActionsPath,\n metrics: metricsPath,\n ...(restorePath ? { restore: restorePath } : {}),\n },\n };\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n if (restorePath && options.restoreManifest && await safeRead(restorePath) === null) {\n await writeFile(restorePath, JSON.stringify(options.restoreManifest, null, 2), \"utf-8\");\n }\n\n return {\n summaryPath,\n reviewQueuePath,\n qualityScorePath,\n transitionReportPath,\n reportPath,\n keptMemoriesPath,\n appliedActionsPath,\n metricsPath,\n manifestPath,\n restorePath,\n };\n}\n\nexport async function runMemoryGovernance(\n options: RunMemoryGovernanceOptions,\n): Promise<MemoryGovernanceRunResult> {\n const now = options.now ?? new Date();\n const runId = buildRunId(now);\n const traceId = runId;\n const storage = new StorageManager(options.memoryDir);\n const boundedScan =\n options.maxMemories !== undefined ||\n options.recentDays !== undefined ||\n options.batchSize !== undefined;\n const normalizedRecentDays = typeof options.recentDays === \"number\" && Number.isFinite(options.recentDays)\n ? Math.max(1, Math.floor(options.recentDays))\n : undefined;\n const updatedAfter = normalizedRecentDays !== undefined\n ? new Date(now.getTime() - normalizedRecentDays * 86_400_000)\n : undefined;\n const memoryWindow = boundedScan\n ? await storage.readMemoriesWindow({\n maxMemories: options.maxMemories,\n batchSize: options.batchSize,\n updatedAfter,\n })\n : undefined;\n const memories = memoryWindow?.memories ?? await storage.readAllMemories();\n const reviewQueue = await buildReviewQueue(options.memoryDir, storage, memories, now, {\n malformedCandidateFiles: memoryWindow?.filePaths,\n });\n const proposedActions = buildProposedActions(reviewQueue, memories);\n const reviewEntryByActionKey = new Map(\n reviewQueue.map((entry) => [`${entry.memoryId}:${entry.reasonCode}`, entry] as const),\n );\n const metrics = buildMetrics(reviewQueue, proposedActions, memories.length);\n const transitionReport: MemoryGovernanceTransitionReport = {\n proposed: groupActionsByStatus(proposedActions),\n applied: {},\n };\n const memoryPathById = new Map(memories.map((memory) => [memory.frontmatter.id, memory.path] as const));\n const targetedMemoryIds = new Set(proposedActions.map((action) => action.memoryId));\n const keptMemoryIds = memories\n .map((memory) => memory.frontmatter.id)\n .filter((memoryId) => !targetedMemoryIds.has(memoryId));\n const appliedActions: MemoryGovernanceAppliedAction[] = [];\n const restoreEntries: MemoryGovernanceRestoreEntry[] = [];\n const restoreEntryByMemoryId = new Map<string, MemoryGovernanceRestoreEntry>();\n\n if (options.mode === \"apply\") {\n for (const action of proposedActions) {\n const memoryPath = memoryPathById.get(action.memoryId) ?? null;\n if (!memoryPath) continue;\n const memory = await storage.readMemoryByPath(memoryPath);\n if (!memory) continue;\n if (memory.frontmatter.id !== action.memoryId) continue;\n const beforeRaw = await safeRead(memory.path);\n if (!beforeRaw) continue;\n const entry: MemoryGovernanceRestoreEntry = {\n action: action.action,\n memoryId: action.memoryId,\n reasonCode: action.reasonCode,\n originalPath: memory.path,\n currentPath: action.action === \"archive\"\n ? plannedArchivePath(options.memoryDir, memory.path, now)\n : memory.path,\n beforeRaw,\n applied: false,\n };\n restoreEntries.push(entry);\n restoreEntryByMemoryId.set(action.memoryId, entry);\n }\n\n const restoreManifest: MemoryGovernanceRestoreManifest = {\n runId,\n createdAt: now.toISOString(),\n entries: restoreEntries,\n };\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n\n for (const action of proposedActions) {\n const memoryPath = memoryPathById.get(action.memoryId) ?? null;\n if (!memoryPath) continue;\n const memory = await storage.readMemoryByPath(memoryPath);\n if (!memory) continue;\n if (memory.frontmatter.id !== action.memoryId) continue;\n const restoreEntry = restoreEntryByMemoryId.get(action.memoryId);\n if (!restoreEntry) continue;\n\n if (action.action === \"archive\") {\n const reviewEntry = reviewEntryByActionKey.get(`${action.memoryId}:${action.reasonCode}`);\n const archivedPath = await storage.archiveMemory(memory, {\n at: now,\n actor: \"memory-governance.apply\",\n reasonCode: action.reasonCode,\n ruleVersion: RULE_VERSION,\n relatedMemoryIds: reviewEntry?.relatedMemoryIds ?? [],\n correlationId: traceId,\n });\n if (!archivedPath) continue;\n restoreEntry.currentPath = archivedPath;\n restoreEntry.expectedCurrentRaw = await safeRead(archivedPath) ?? undefined;\n restoreEntry.applied = true;\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n appliedActions.push({\n ...action,\n currentPath: archivedPath,\n afterStatus: \"archived\",\n });\n continue;\n }\n\n if (!action.afterStatus || action.beforeStatus === action.afterStatus) continue;\n const reviewEntry = reviewEntryByActionKey.get(`${action.memoryId}:${action.reasonCode}`);\n const updated = await storage.writeMemoryFrontmatter(memory, {\n status: action.afterStatus,\n updated: now.toISOString(),\n }, {\n actor: \"memory-governance.apply\",\n reasonCode: action.reasonCode,\n ruleVersion: RULE_VERSION,\n relatedMemoryIds: reviewEntry?.relatedMemoryIds ?? [],\n correlationId: traceId,\n });\n if (!updated) continue;\n restoreEntry.expectedCurrentRaw = await safeRead(memory.path) ?? undefined;\n restoreEntry.applied = true;\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n appliedActions.push({\n ...action,\n currentPath: memory.path,\n });\n }\n }\n\n const summary: MemoryGovernanceSummary = {\n schemaVersion: 1,\n runId,\n traceId,\n mode: options.mode,\n createdAt: now.toISOString(),\n scannedMemories: memories.length,\n reviewQueueCount: reviewQueue.length,\n proposedActionCount: proposedActions.length,\n appliedActionCount: appliedActions.length,\n ruleVersion: RULE_VERSION,\n };\n const restoreManifest = options.mode === \"apply\"\n ? {\n runId,\n createdAt: now.toISOString(),\n entries: restoreEntries,\n }\n : undefined;\n transitionReport.applied = groupActionsByStatus(appliedActions);\n const paths = await writeGovernanceArtifacts({\n memoryDir: options.memoryDir,\n runId,\n traceId,\n summary,\n metrics,\n qualityScore: metrics.qualityScore,\n transitionReport,\n keptMemoryIds,\n reviewQueue,\n proposedActions,\n appliedActions,\n restoreManifest,\n });\n\n return {\n runId,\n traceId,\n mode: options.mode,\n summary,\n ...paths,\n reviewQueue,\n proposedActions,\n appliedActions,\n };\n}\n\nexport async function restoreMemoryGovernanceRun(\n options: RestoreMemoryGovernanceRunOptions,\n): Promise<RestoreMemoryGovernanceRunResult> {\n void options.now;\n const restorePath = governanceRestorePath(options.memoryDir, options.runId);\n const raw = JSON.parse(await readFile(restorePath, \"utf-8\")) as MemoryGovernanceRestoreManifest;\n let restoredActions = 0;\n\n for (const entry of [...raw.entries].reverse()) {\n if (!entry.applied) {\n continue;\n }\n const currentRaw = await safeRead(entry.currentPath);\n if (entry.expectedCurrentRaw && currentRaw !== entry.expectedCurrentRaw) {\n throw new Error(`restore conflict for ${entry.memoryId}: current contents diverged from governance run`);\n }\n if (entry.action === \"archive\") {\n await rm(entry.currentPath, { force: true });\n }\n await mkdir(path.dirname(entry.originalPath), { recursive: true });\n await writeFile(entry.originalPath, entry.beforeRaw, \"utf-8\");\n restoredActions += 1;\n }\n\n return {\n runId: raw.runId,\n restoredActions,\n restorePath,\n };\n}\n\nexport async function listMemoryGovernanceRuns(memoryDir: string): Promise<string[]> {\n try {\n return (await readdir(governanceRunsDir(memoryDir))).sort().reverse();\n } catch {\n return [];\n }\n}\n\nexport async function readMemoryGovernanceRunArtifact(\n memoryDir: string,\n runId: string,\n): Promise<{\n summary: MemoryGovernanceSummary;\n metrics: MemoryGovernanceMetrics;\n qualityScore: MemoryGovernanceQualityScore;\n keptMemoryIds: string[];\n reviewQueue: MemoryGovernanceReviewQueueEntry[];\n appliedActions: MemoryGovernanceAppliedAction[];\n transitionReport: MemoryGovernanceTransitionReport;\n report: string;\n manifest: MemoryGovernanceManifest;\n restore?: MemoryGovernanceRestoreManifest;\n}> {\n const runDir = governanceRunDir(memoryDir, runId);\n const summary = JSON.parse(await readFile(path.join(runDir, \"summary.json\"), \"utf-8\")) as MemoryGovernanceSummary;\n const metrics = JSON.parse(await readFile(path.join(runDir, \"metrics.json\"), \"utf-8\")) as MemoryGovernanceMetrics;\n metrics.qualityScore ??= buildQualityScore(metrics.reviewReasons);\n const keptMemoryIds = JSON.parse(await readFile(path.join(runDir, \"kept-memories.json\"), \"utf-8\")) as string[];\n const reviewQueue = JSON.parse(\n await readFile(path.join(runDir, \"review-queue.json\"), \"utf-8\"),\n ) as MemoryGovernanceReviewQueueEntry[];\n const appliedActions = JSON.parse(\n await readFile(path.join(runDir, \"applied-actions.json\"), \"utf-8\"),\n ) as MemoryGovernanceAppliedAction[];\n const qualityScoreRaw = await safeRead(path.join(runDir, \"quality-score.json\"));\n const transitionReportRaw = await safeRead(path.join(runDir, \"status-transitions.json\"));\n const manifest = JSON.parse(\n await readFile(path.join(runDir, \"manifest.json\"), \"utf-8\"),\n ) as MemoryGovernanceManifest;\n const report = await readFile(path.join(runDir, \"report.md\"), \"utf-8\");\n const restoreRaw = await safeRead(path.join(runDir, \"restore.json\"));\n const qualityScore = qualityScoreRaw\n ? JSON.parse(qualityScoreRaw) as MemoryGovernanceQualityScore\n : metrics.qualityScore ?? buildQualityScore(metrics.reviewReasons);\n const transitionReport = transitionReportRaw\n ? JSON.parse(transitionReportRaw) as MemoryGovernanceTransitionReport\n : {\n proposed: {},\n applied: groupActionsByStatus(appliedActions),\n };\n return {\n summary,\n metrics,\n qualityScore,\n keptMemoryIds,\n reviewQueue,\n appliedActions,\n transitionReport,\n report,\n manifest,\n restore: restoreRaw ? JSON.parse(restoreRaw) as MemoryGovernanceRestoreManifest : undefined,\n };\n}\n"],"mappings":"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","names":["restoreManifest","reviewEntry"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/namespaces/migrate.ts"],"sourcesContent":["import path from \"node:path\";\nimport { access, mkdir, readdir, rename } from \"node:fs/promises\";\nimport type { PluginConfig } from \"../types.js\";\nimport { NamespaceStorageRouter } from \"./storage.js\";\nimport { namespaceCollectionName } from \"./search.js\";\nimport { isSafeRouteNamespace } from \"../routing/engine.js\";\n\nconst LEGACY_NAMESPACE_CHILDREN = [\n \"facts\",\n \"corrections\",\n \"entities\",\n \"questions\",\n \"artifacts\",\n \"identity\",\n \"state\",\n \"config\",\n \"summaries\",\n \"procedures\",\n // Issue #564 PR 3: reasoning_trace memories live in their own subtree.\n // Must be included here so namespace migration moves existing traces\n // into the target namespace root alongside other memory data.\n \"reasoning-traces\",\n \"profile.md\",\n] as const;\n\nexport interface NamespaceInventoryEntry {\n namespace: string;\n rootDir: string;\n exists: boolean;\n usesLegacyRoot: boolean;\n hasMemoryData: boolean;\n collection: string;\n}\n\nexport interface NamespaceVerifyReport {\n ok: boolean;\n problems: string[];\n namespaces: NamespaceInventoryEntry[];\n}\n\nexport interface NamespaceMigrationMove {\n from: string;\n to: string;\n}\n\nexport interface NamespaceMigrationReport {\n dryRun: boolean;\n fromRoot: string;\n targetRoot: string;\n moved: NamespaceMigrationMove[];\n collection: string;\n}\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function hasAnyLegacyData(rootDir: string): Promise<boolean> {\n for (const child of LEGACY_NAMESPACE_CHILDREN) {\n if (await exists(path.join(rootDir, child))) return true;\n }\n return false;\n}\n\nasync function discoverConfiguredNamespaces(\n config: PluginConfig,\n): Promise<string[]> {\n const discovered = new Set<string>([\n config.defaultNamespace,\n config.sharedNamespace,\n ...config.namespacePolicies.map((policy) => policy.name),\n ]);\n\n const namespacesDir = path.join(config.memoryDir, \"namespaces\");\n try {\n const entries = await readdir(namespacesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && isSafeRouteNamespace(entry.name)) {\n discovered.add(entry.name);\n }\n }\n } catch {\n // No namespace directory yet.\n }\n\n return [...discovered];\n}\n\nexport async function listNamespaces(options: {\n config: PluginConfig;\n storageRouter?: NamespaceStorageRouter;\n}): Promise<NamespaceInventoryEntry[]> {\n const storageRouter = options.storageRouter ?? new NamespaceStorageRouter(options.config);\n const namespaces = await discoverConfiguredNamespaces(options.config);\n const items = await Promise.all(\n namespaces.map(async (namespace) => {\n const storage = await storageRouter.storageFor(namespace);\n const usesLegacyRoot =\n namespace === options.config.defaultNamespace &&\n storage.dir === options.config.memoryDir;\n return {\n namespace,\n rootDir: storage.dir,\n exists: await exists(storage.dir),\n usesLegacyRoot,\n hasMemoryData: await hasAnyLegacyData(storage.dir),\n collection: namespaceCollectionName(options.config.qmdCollection, namespace, {\n defaultNamespace: options.config.defaultNamespace,\n useLegacyDefaultCollection: usesLegacyRoot,\n }),\n } satisfies NamespaceInventoryEntry;\n }),\n );\n\n return items.sort((a, b) => a.namespace.localeCompare(b.namespace));\n}\n\nexport async function verifyNamespaces(options: {\n config: PluginConfig;\n storageRouter?: NamespaceStorageRouter;\n}): Promise<NamespaceVerifyReport> {\n const namespaces = await listNamespaces(options);\n const problems: string[] = [];\n\n for (const entry of namespaces) {\n if (entry.exists && !entry.hasMemoryData) {\n problems.push(`${entry.namespace}: root exists but contains no Engram data`);\n }\n }\n\n return {\n ok: problems.length === 0,\n problems,\n namespaces,\n };\n}\n\nexport async function runNamespaceMigration(options: {\n config: PluginConfig;\n to: string;\n dryRun?: boolean;\n}): Promise<NamespaceMigrationReport> {\n if (!options.config.namespacesEnabled) {\n throw new Error(\"Namespaces are disabled.\");\n }\n\n const targetNamespace = options.to.trim();\n if (!isSafeRouteNamespace(targetNamespace)) {\n throw new Error(`Invalid namespace: ${options.to}`);\n }\n\n const targetRoot = path.join(options.config.memoryDir, \"namespaces\", targetNamespace);\n const moved: NamespaceMigrationMove[] = [];\n\n for (const child of LEGACY_NAMESPACE_CHILDREN) {\n const from = path.join(options.config.memoryDir, child);\n if (!(await exists(from))) continue;\n const to = path.join(targetRoot, child);\n if (await exists(to)) {\n throw new Error(`Target already contains ${child}: ${to}`);\n }\n moved.push({ from, to });\n }\n\n if (!options.dryRun && moved.length > 0) {\n await mkdir(targetRoot, { recursive: true });\n for (const move of moved) {\n await rename(move.from, move.to);\n }\n }\n\n return {\n dryRun: options.dryRun === true,\n fromRoot: options.config.memoryDir,\n targetRoot,\n moved,\n collection: namespaceCollectionName(options.config.qmdCollection, targetNamespace, {\n defaultNamespace: options.config.defaultNamespace,\n useLegacyDefaultCollection: false,\n }),\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/codex.ts"],"sourcesContent":["import { headerValue, type AdapterContext, type EngramAdapter, type ResolvedIdentity } from \"./types.js\";\n\n/**\n * Codex CLI adapter.\n *\n * Detection: Codex CLI sends clientInfo.name = \"codex-mcp-client\" and\n * clientInfo.title = \"Codex\" in the MCP initialize handshake. It does\n * NOT send agent names, session IDs, or project context automatically.\n *\n * For Streamable HTTP transport, Codex supports custom headers via\n * http_headers in ~/.codex/config.toml:\n * [mcp_servers.engram]\n * url = \"http://localhost:4318/mcp\"\n * http_headers = { \"X-Engram-Namespace\" = \"my-project\", \"X-Engram-Principal\" = \"codex-agent\" }\n *\n * Codex also sends a custom \"sandbox_state\" RPC notification after\n * init with sandbox policy info (read-only/writable paths).\n */\nexport class CodexAdapter implements EngramAdapter {\n readonly id = \"codex\";\n\n matches(context: AdapterContext): boolean {\n // Primary: MCP clientInfo from initialize handshake (exact match)\n if (context.clientInfo?.name === \"codex-mcp-client\") return true;\n\n // Also match on clientInfo name containing \"codex\" for forward compat\n const clientName = context.clientInfo?.name?.toLowerCase() ?? \"\";\n if (clientName.includes(\"codex\") && clientName !== \"codex-mcp-client\") return true;\n\n // Fallback: user-configured client identifier header\n const clientId = headerValue(context.headers, \"x-engram-client-id\");\n if (clientId?.toLowerCase() === \"codex\") return true;\n\n return false;\n }\n\n resolveIdentity(context: AdapterContext): ResolvedIdentity {\n // MCP session ID (standard MCP header, server-assigned)\n const mcpSessionId = headerValue(context.headers, \"mcp-session-id\");\n\n // Principal: explicit header > default\n const principal = headerValue(context.headers, \"x-engram-principal\")\n || \"codex\";\n\n // Namespace: explicit header > default\n const namespace = headerValue(context.headers, \"x-engram-namespace\")\n || \"codex\";\n\n return {\n namespace,\n principal,\n sessionKey: mcpSessionId ?? context.sessionKey,\n adapterId: this.id,\n };\n }\n}\n\n"],"mappings":";;;;;AAkBO,IAAM,eAAN,MAA4C;AAAA,EACxC,KAAK;AAAA,EAEd,QAAQ,SAAkC;AAExC,QAAI,QAAQ,YAAY,SAAS,mBAAoB,QAAO;AAG5D,UAAM,aAAa,QAAQ,YAAY,MAAM,YAAY,KAAK;AAC9D,QAAI,WAAW,SAAS,OAAO,KAAK,eAAe,mBAAoB,QAAO;AAG9E,UAAM,WAAW,YAAY,QAAQ,SAAS,oBAAoB;AAClE,QAAI,UAAU,YAAY,MAAM,QAAS,QAAO;AAEhD,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,SAA2C;AAEzD,UAAM,eAAe,YAAY,QAAQ,SAAS,gBAAgB;AAGlE,UAAM,YAAY,YAAY,QAAQ,SAAS,oBAAoB,KAC9D;AAGL,UAAM,YAAY,YAAY,QAAQ,SAAS,oBAAoB,KAC9D;AAEL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY,gBAAgB,QAAQ;AAAA,MACpC,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transfer/backup.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, readdir, rm, unlink, writeFile } from \"node:fs/promises\";\nimport { gzipSync } from \"node:zlib\";\nimport { exportMarkdownBundle } from \"./export-md.js\";\nimport { encryptCapsuleFile } from \"./capsule-crypto.js\";\nimport { isTransferPathExcluded } from \"./exclusions.js\";\n\nexport interface BackupOptions {\n memoryDir: string;\n outDir: string;\n includeTranscripts?: boolean;\n retentionDays?: number;\n pluginVersion: string;\n /**\n * When `true`, produce an encrypted backup archive instead of a plaintext\n * directory. The secure-store keyring for `memoryDir` must be unlocked.\n *\n * An encrypted backup is a single `.backup.tar.gz.enc` file instead of a\n * timestamped directory. It contains a gzip-compressed JSON bundle (same\n * shape as the json export) sealed with AES-256-GCM.\n *\n * Default: `false`.\n */\n encrypt?: boolean;\n}\n\nfunction timestampDirName(now: Date): string {\n return now.toISOString().replace(/[:.]/g, \"-\");\n}\n\nexport async function backupMemoryDir(opts: BackupOptions): Promise<string> {\n const outDirAbs = path.resolve(opts.outDir);\n await mkdir(outDirAbs, { recursive: true });\n const ts = timestampDirName(new Date());\n\n if (opts.encrypt === true) {\n // Encrypted backup: produce a single <timestamp>.backup.json.gz.enc file.\n // We collect the memory directory records manually, gzip them, write a\n // temp plaintext archive, encrypt it, then remove the plaintext.\n // Per gotcha #54: write the encrypted file before removing the plaintext\n // so a crash mid-encrypt cannot destroy the only readable copy.\n const { listFilesRecursive, toPosixRelPath } = await import(\"./fs-utils.js\");\n const { readFile } = await import(\"node:fs/promises\");\n\n const memoryDirAbs = path.resolve(opts.memoryDir);\n const filesAbs = await listFilesRecursive(memoryDirAbs);\n const includeTranscripts = opts.includeTranscripts === true;\n\n const records: Array<{ path: string; content: string }> = [];\n for (const abs of filesAbs) {\n const relPosix = toPosixRelPath(abs, memoryDirAbs);\n if (isTransferPathExcluded(relPosix, { includeTranscripts })) continue;\n const content = await readFile(abs, \"utf-8\");\n records.push({ path: relPosix, content });\n }\n records.sort((a, b) => a.path.localeCompare(b.path));\n\n const bundle = {\n format: \"remnic.backup.v1\",\n createdAt: new Date().toISOString(),\n pluginVersion: opts.pluginVersion,\n records,\n };\n\n const tempGzPath = path.join(outDirAbs, `${ts}.backup.json.gz`);\n const gz = gzipSync(Buffer.from(JSON.stringify(bundle), \"utf-8\"));\n await writeFile(tempGzPath, gz);\n\n // Encrypt and remove plaintext.\n const { encPath } = await encryptCapsuleFile({\n sourceGzPath: tempGzPath,\n memoryDir: opts.memoryDir,\n });\n await unlink(tempGzPath);\n\n if (opts.retentionDays && opts.retentionDays > 0) {\n await enforceRetention(outDirAbs, opts.retentionDays);\n }\n\n return encPath;\n }\n\n const backupDir = path.join(outDirAbs, ts);\n\n await exportMarkdownBundle({\n memoryDir: opts.memoryDir,\n outDir: backupDir,\n includeTranscripts: opts.includeTranscripts,\n pluginVersion: opts.pluginVersion,\n });\n\n if (opts.retentionDays && opts.retentionDays > 0) {\n await enforceRetention(outDirAbs, opts.retentionDays);\n }\n\n return backupDir;\n}\n\nasync function enforceRetention(outDirAbs: string, retentionDays: number): Promise<void> {\n const entries = await readdir(outDirAbs, { withFileTypes: true });\n const cutoffMs = Date.now() - retentionDays * 24 * 60 * 60 * 1000;\n\n for (const ent of entries) {\n const name = ent.name;\n\n // --- Plaintext backup directories ---\n // Directory names are ISO8601 with [: .] replaced by \"-\" to be filesystem-friendly.\n // Example: 2026-02-11T05-06-07-123Z => 2026-02-11T05:06:07.123Z\n if (ent.isDirectory()) {\n const m = name.match(\n /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2})-(\\d{2})-(\\d{2})-(\\d{3})Z$/,\n );\n const iso = m ? `${m[1]}T${m[2]}:${m[3]}:${m[4]}.${m[5]}Z` : null;\n const tsMs = iso ? Date.parse(iso) : NaN;\n if (!Number.isFinite(tsMs)) continue;\n if (tsMs < cutoffMs) {\n await rm(path.join(outDirAbs, name), { recursive: true, force: true });\n }\n continue;\n }\n\n // --- Encrypted backup files (.backup.json.gz.enc) ---\n // Same timestamp pattern in the filename prefix. (Codex P2 / Cursor — the\n // original sweep skipped non-directory entries, leaving encrypted backups\n // to accumulate indefinitely when retention is enabled.)\n if (ent.isFile() && name.endsWith(\".backup.json.gz.enc\")) {\n const m = name.match(\n /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2})-(\\d{2})-(\\d{2})-(\\d{3})Z/,\n );\n const iso = m ? `${m[1]}T${m[2]}:${m[3]}:${m[4]}.${m[5]}Z` : null;\n const tsMs = iso ? Date.parse(iso) : NaN;\n if (!Number.isFinite(tsMs)) continue;\n if (tsMs < cutoffMs) {\n await rm(path.join(outDirAbs, name), { force: true });\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/native-knowledge.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { log } from \"./logger.js\";\nimport type {\n NativeKnowledgeConfig,\n NativeKnowledgeObsidianVaultConfig,\n} from \"./types.js\";\n\nexport type NativeKnowledgeChunk = {\n chunkId: string;\n sourcePath: string;\n title: string;\n sourceKind:\n | \"identity\"\n | \"memory\"\n | \"workspace_doc\"\n | \"obsidian_note\"\n | \"bootstrap_doc\"\n | \"handoff\"\n | \"daily_summary\"\n | \"automation_note\";\n startLine: number;\n endLine: number;\n content: string;\n vaultId?: string;\n notePath?: string;\n noteKey?: string;\n derivedDate?: string;\n tags?: string[];\n aliases?: string[];\n wikilinks?: string[];\n backlinks?: string[];\n namespace?: string;\n privacyClass?: string;\n sourceHash?: string;\n mtimeMs?: number;\n sessionKey?: string;\n workflowKey?: string;\n author?: string;\n agent?: string;\n};\n\nexport type NativeKnowledgeSearchResult = NativeKnowledgeChunk & {\n score: number;\n};\n\ninterface ParsedFrontmatter {\n body: string;\n bodyStartLine: number;\n data: Record<string, string | string[]>;\n}\n\ninterface ObsidianNoteState {\n noteKey: string;\n notePath: string;\n title: string;\n derivedDate?: string;\n tags: string[];\n aliases: string[];\n wikilinks: string[];\n backlinks: string[];\n namespace?: string;\n privacyClass?: string;\n sourceHash: string;\n mtimeMs: number;\n deleted: boolean;\n deletedAt?: string;\n chunks: NativeKnowledgeChunk[];\n}\n\ninterface ObsidianVaultState {\n vaultId: string;\n rootDir: string;\n syncedAt: string;\n notes: Record<string, ObsidianNoteState>;\n}\n\ninterface ObsidianSyncState {\n version: 1;\n updatedAt: string;\n vaults: Record<string, ObsidianVaultState>;\n}\n\ninterface OpenClawWorkspaceFileState {\n sourcePath: string;\n sourceKind: Exclude<NativeKnowledgeChunk[\"sourceKind\"], \"obsidian_note\">;\n title: string;\n namespace?: string;\n privacyClass?: string;\n derivedDate?: string;\n sessionKey?: string;\n workflowKey?: string;\n author?: string;\n agent?: string;\n sourceHash: string;\n syncConfigHash: string;\n mtimeMs: number;\n deleted: boolean;\n deletedAt?: string;\n chunks: NativeKnowledgeChunk[];\n}\n\ninterface OpenClawWorkspaceSyncState {\n version: 1;\n updatedAt: string;\n files: Record<string, OpenClawWorkspaceFileState>;\n}\n\ninterface CuratedIncludeFileState {\n sourcePath: string;\n sourceKind: Extract<NativeKnowledgeChunk[\"sourceKind\"], \"identity\" | \"memory\" | \"workspace_doc\">;\n title: string;\n namespace?: string;\n privacyClass?: string;\n derivedDate?: string;\n sourceHash: string;\n syncConfigHash: string;\n mtimeMs: number;\n deleted: boolean;\n deletedAt?: string;\n chunks: NativeKnowledgeChunk[];\n}\n\ninterface CuratedIncludeFilesSyncState {\n version: 1;\n updatedAt: string;\n files: Record<string, CuratedIncludeFileState>;\n}\n\nexport interface NativeKnowledgeSyncResult {\n statePath: string;\n vaultCount: number;\n touchedNotes: number;\n deletedNotes: number;\n chunkCount: number;\n activeChunks: NativeKnowledgeChunk[];\n}\n\nconst PERSISTED_NATIVE_KNOWLEDGE_STATE_FILES = new Set([\n \"obsidian-sync.json\",\n \"curated-include-sync.json\",\n \"openclaw-workspace-sync.json\",\n]);\n\nfunction normalizeText(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \" \").trim();\n}\n\nfunction tokenize(value: string): string[] {\n return normalizeText(value).split(/\\s+/).filter((token) => token.length >= 2);\n}\n\nfunction uniqueSorted(values: string[]): string[] {\n return [...new Set(values.filter((value) => value.trim().length > 0).map((value) => value.trim()))].sort();\n}\n\nfunction detectSourceKind(filePath: string): CuratedIncludeFileState[\"sourceKind\"] {\n const base = path.basename(filePath).toLowerCase();\n if (base.startsWith(\"identity\")) return \"identity\";\n if (base === \"memory.md\") return \"memory\";\n return \"workspace_doc\";\n}\n\nfunction parseInlineArray(raw: string): string[] {\n const trimmed = raw.trim();\n if (!trimmed.startsWith(\"[\") || !trimmed.endsWith(\"]\")) return [];\n return trimmed\n .slice(1, -1)\n .split(\",\")\n .map((value) => value.trim().replace(/^['\"]|['\"]$/g, \"\"))\n .filter(Boolean);\n}\n\nfunction parseFrontmatter(content: string): ParsedFrontmatter {\n const normalized = content.replace(/\\r\\n/g, \"\\n\");\n if (!normalized.startsWith(\"---\\n\")) return { body: normalized, bodyStartLine: 1, data: {} };\n const closing = normalized.indexOf(\"\\n---\\n\", 4);\n if (closing === -1) return { body: normalized, bodyStartLine: 1, data: {} };\n\n const data: Record<string, string | string[]> = {};\n const lines = normalized.slice(4, closing).split(\"\\n\");\n let index = 0;\n while (index < lines.length) {\n const line = lines[index] ?? \"\";\n const match = /^([A-Za-z0-9_-]+):\\s*(.*)$/.exec(line);\n if (!match) {\n index += 1;\n continue;\n }\n const [, key, rawValue] = match;\n if (rawValue.trim().length > 0) {\n const inlineArray = parseInlineArray(rawValue);\n data[key] = inlineArray.length > 0 ? inlineArray : rawValue.trim().replace(/^['\"]|['\"]$/g, \"\");\n index += 1;\n continue;\n }\n\n const items: string[] = [];\n let cursor = index + 1;\n while (cursor < lines.length) {\n const next = lines[cursor] ?? \"\";\n const itemMatch = /^\\s*-\\s*(.+)$/.exec(next);\n if (!itemMatch) break;\n items.push(itemMatch[1]!.trim().replace(/^['\"]|['\"]$/g, \"\"));\n cursor += 1;\n }\n data[key] = items;\n index = cursor;\n }\n\n return {\n body: normalized.slice(closing + 5),\n bodyStartLine: normalized.slice(0, closing + 5).split(\"\\n\").length,\n data,\n };\n}\n\nfunction firstStringValue(\n data: Record<string, string | string[]>,\n keys: string[],\n): string | undefined {\n for (const key of keys) {\n const value = data[key];\n if (typeof value === \"string\" && value.trim().length > 0) return value.trim();\n }\n return undefined;\n}\n\nfunction normalizeIsoDate(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n const isoDateMatch = /^(\\d{4}-\\d{2}-\\d{2})/.exec(trimmed);\n if (isoDateMatch) return isoDateMatch[1];\n const slashDateMatch = /^(\\d{4})[\\/_](\\d{2})[\\/_](\\d{2})$/.exec(trimmed);\n if (slashDateMatch) return `${slashDateMatch[1]}-${slashDateMatch[2]}-${slashDateMatch[3]}`;\n return undefined;\n}\n\nfunction deriveDateFromPath(filePath: string): string | undefined {\n const normalized = filePath.replace(/\\\\/g, \"/\");\n const hyphenated = /(\\d{4}-\\d{2}-\\d{2})/.exec(normalized);\n if (hyphenated) return hyphenated[1];\n const split = /(^|\\/)(\\d{4})\\/(\\d{2})\\/(\\d{2})(?=\\/|[^/\\n]*\\.md$)/.exec(normalized);\n if (split) return `${split[2]}-${split[3]}-${split[4]}`;\n return undefined;\n}\n\nfunction deriveArtifactDate(filePath: string, parsed: ParsedFrontmatter): string | undefined {\n return (\n normalizeIsoDate(firstStringValue(parsed.data, [\"date\", \"recordedAt\", \"generatedAt\", \"summaryDate\", \"day\"]))\n ?? deriveDateFromPath(filePath)\n );\n}\n\nfunction deriveNamespaceFromIncludePath(sourcePath: string): string | undefined {\n const basename = path.basename(sourcePath);\n const match = /^identity\\.([^.\\/]+)\\.md$/i.exec(basename);\n return match?.[1];\n}\n\nfunction compileDailyNotePattern(pattern: string): RegExp {\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regex = escaped\n .replace(/YYYY/g, \"(?<year>\\\\d{4})\")\n .replace(/MM/g, \"(?<month>\\\\d{2})\")\n .replace(/DD/g, \"(?<day>\\\\d{2})\");\n return new RegExp(`^${regex}$`);\n}\n\nfunction deriveDailyNoteDate(notePath: string, patterns: string[]): string | undefined {\n const withoutExt = notePath.replace(/\\.md$/i, \"\");\n for (const pattern of patterns) {\n const match = compileDailyNotePattern(pattern).exec(withoutExt);\n if (!match?.groups) continue;\n const { year, month, day } = match.groups;\n if (!year || !month || !day) continue;\n return `${year}-${month}-${day}`;\n }\n return undefined;\n}\n\nfunction extractInlineTags(content: string): string[] {\n const matches = [...content.matchAll(/(^|\\s)#([a-z0-9/_-]+)/gi)];\n return uniqueSorted(matches.map((match) => match[2] ?? \"\"));\n}\n\nfunction extractWikilinks(content: string): { targets: string[]; aliases: string[] } {\n const targets: string[] = [];\n const aliases: string[] = [];\n const regex = /\\[\\[([^\\]|#]+)(?:#[^\\]|]+)?(?:\\|([^\\]]+))?\\]\\]/g;\n for (const match of content.matchAll(regex)) {\n const target = (match[1] ?? \"\").trim();\n const alias = (match[2] ?? \"\").trim();\n if (target) targets.push(target);\n if (alias) aliases.push(alias);\n }\n return {\n targets: uniqueSorted(targets),\n aliases: uniqueSorted(aliases),\n };\n}\n\nfunction normalizePathPrefix(prefix: string): string {\n const fwd = prefix.replace(/\\\\/g, \"/\");\n let start = 0;\n while (start < fwd.length && fwd[start] === \"/\") start++;\n let end = fwd.length;\n while (end > start && fwd[end - 1] === \"/\") end--;\n return fwd.substring(start, end);\n}\n\nfunction classifyObsidianNote(\n notePath: string,\n vault: NativeKnowledgeObsidianVaultConfig,\n): { namespace?: string; privacyClass?: string } {\n let namespace = vault.namespace;\n let privacyClass = vault.privacyClass;\n const normalizedPath = notePath.replace(/\\\\/g, \"/\");\n const rules = [...vault.folderRules].sort(\n (a, b) => normalizePathPrefix(b.pathPrefix).length - normalizePathPrefix(a.pathPrefix).length,\n );\n\n for (const rule of rules) {\n const prefix = normalizePathPrefix(rule.pathPrefix);\n if (!prefix) continue;\n if (normalizedPath === prefix || normalizedPath.startsWith(`${prefix}/`)) {\n namespace = rule.namespace ?? namespace;\n privacyClass = rule.privacyClass ?? privacyClass;\n break;\n }\n }\n\n return { namespace, privacyClass };\n}\n\nfunction chunkHeadingAware(options: {\n sourcePath: string;\n content: string;\n maxChunkChars: number;\n startLineOffset?: number;\n createChunk: (args: {\n title: string;\n startLine: number;\n endLine: number;\n content: string;\n }) => NativeKnowledgeChunk;\n}): NativeKnowledgeChunk[] {\n const lines = options.content.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const chunks: NativeKnowledgeChunk[] = [];\n let currentTitle = path.basename(options.sourcePath);\n let currentLines: string[] = [];\n let startLine = 1 + (options.startLineOffset ?? 0);\n\n const flush = () => {\n const paragraphs: Array<{\n content: string;\n startLine: number;\n endLine: number;\n }> = [];\n let paragraphLines: string[] = [];\n let paragraphStartOffset: number | null = null;\n\n const pushParagraph = (lineOffsetExclusive: number) => {\n if (paragraphLines.length === 0 || paragraphStartOffset === null) return;\n paragraphs.push({\n content: paragraphLines.join(\"\\n\").trim(),\n startLine: startLine + paragraphStartOffset,\n endLine: startLine + lineOffsetExclusive - 1,\n });\n paragraphLines = [];\n paragraphStartOffset = null;\n };\n\n for (let index = 0; index < currentLines.length; index += 1) {\n const line = currentLines[index] ?? \"\";\n const isListLine = /^\\s*(?:[-*+]|\\d+\\.)\\s+/.test(line);\n const previousLine = index > 0 ? (currentLines[index - 1] ?? \"\") : \"\";\n const previousWasList = /^\\s*(?:[-*+]|\\d+\\.)\\s+/.test(previousLine);\n if (line.trim().length === 0) {\n pushParagraph(index);\n continue;\n }\n if (isListLine && paragraphLines.length > 0 && !previousWasList) {\n pushParagraph(index);\n }\n if (paragraphStartOffset === null) paragraphStartOffset = index;\n paragraphLines.push(line);\n }\n pushParagraph(currentLines.length);\n\n if (paragraphs.length === 0) return;\n\n const body = paragraphs.map((paragraph) => paragraph.content).join(\"\\n\\n\");\n if (body.length <= options.maxChunkChars) {\n chunks.push(options.createChunk({\n title: currentTitle,\n startLine: paragraphs[0]!.startLine,\n endLine: paragraphs[paragraphs.length - 1]!.endLine,\n content: body,\n }));\n return;\n }\n\n let buffer = \"\";\n let bufferStartLine = paragraphs[0]!.startLine;\n let bufferEndLine = paragraphs[0]!.endLine;\n\n for (const paragraph of paragraphs) {\n const next = buffer.length > 0 ? `${buffer}\\n\\n${paragraph.content}` : paragraph.content;\n if (next.length > options.maxChunkChars && buffer.length > 0) {\n chunks.push(options.createChunk({\n title: currentTitle,\n startLine: bufferStartLine,\n endLine: bufferEndLine,\n content: buffer,\n }));\n buffer = paragraph.content;\n bufferStartLine = paragraph.startLine;\n bufferEndLine = paragraph.endLine;\n } else {\n buffer = next;\n bufferEndLine = paragraph.endLine;\n }\n }\n\n if (buffer.length > 0) {\n chunks.push(options.createChunk({\n title: currentTitle,\n startLine: bufferStartLine,\n endLine: bufferEndLine,\n content: buffer,\n }));\n }\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? \"\";\n if (/^#{1,6}\\s+/.test(line) && currentLines.length > 0) {\n flush();\n currentLines = [];\n currentTitle = line.replace(/^#{1,6}\\s+/, \"\").trim() || currentTitle;\n startLine = index + 2 + (options.startLineOffset ?? 0);\n continue;\n }\n if (/^#{1,6}\\s+/.test(line)) {\n currentTitle = line.replace(/^#{1,6}\\s+/, \"\").trim() || currentTitle;\n startLine = index + 2 + (options.startLineOffset ?? 0);\n continue;\n }\n currentLines.push(line);\n }\n\n flush();\n return chunks;\n}\n\nasync function readableFile(filePath: string): Promise<boolean> {\n try {\n const info = await stat(filePath);\n return info.isFile();\n } catch {\n return false;\n }\n}\n\nasync function resolveCandidatePaths(options: {\n workspaceDir: string;\n includeFiles: string[];\n recallNamespaces?: string[];\n defaultNamespace: string;\n identityVariantMode: \"recall\" | \"disk\";\n}): Promise<string[]> {\n const out = new Set<string>();\n for (const rel of options.includeFiles) {\n const trimmed = rel.trim();\n if (!trimmed) continue;\n const candidatePath = path.join(options.workspaceDir, trimmed);\n out.add(candidatePath);\n if (path.basename(trimmed).toLowerCase() !== \"identity.md\") continue;\n\n const relativeDir = path.dirname(trimmed);\n if (options.identityVariantMode === \"recall\") {\n if (!Array.isArray(options.recallNamespaces)) continue;\n for (const namespace of options.recallNamespaces) {\n if (!namespace || namespace === options.defaultNamespace) continue;\n out.add(path.join(options.workspaceDir, relativeDir, `IDENTITY.${namespace}.md`));\n }\n continue;\n }\n\n const absoluteDir = path.dirname(candidatePath);\n let entries: string[] = [];\n try {\n entries = await readdir(absoluteDir);\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!/^identity\\.[^.\\/]+\\.md$/i.test(entry)) continue;\n out.add(path.join(options.workspaceDir, relativeDir, entry));\n }\n }\n return Array.from(out);\n}\n\nfunction resolveNoteTitle(notePath: string, parsed: ParsedFrontmatter): string {\n const rawTitle = parsed.data.title;\n if (typeof rawTitle === \"string\" && rawTitle.trim().length > 0) return rawTitle.trim();\n const heading = parsed.body.match(/^#{1,6}\\s+(.+)$/m)?.[1]?.trim();\n if (heading) return heading;\n return path.basename(notePath, path.extname(notePath));\n}\n\nfunction parseFrontmatterList(value: string | string[] | undefined): string[] {\n if (Array.isArray(value)) return uniqueSorted(value);\n if (typeof value === \"string\" && value.trim().length > 0) return [value.trim()];\n return [];\n}\n\nfunction toPosixRelative(rootDir: string, filePath: string): string {\n return path.relative(rootDir, filePath).split(path.sep).join(\"/\");\n}\n\nfunction globToRegExp(glob: string): RegExp {\n let regex = \"^\";\n for (let index = 0; index < glob.length; index += 1) {\n const char = glob[index]!;\n const next = glob[index + 1];\n if (char === \"*\") {\n if (next === \"*\") {\n if (glob[index + 2] === \"/\") {\n regex += \"(?:.*/)?\";\n index += 2;\n } else {\n regex += \".*\";\n index += 1;\n }\n } else {\n regex += \"[^/]*\";\n }\n continue;\n }\n if (char === \"?\") {\n regex += \".\";\n continue;\n }\n if (char === \"/\") {\n regex += \"/\";\n continue;\n }\n regex += char.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n regex += \"$\";\n return new RegExp(regex);\n}\n\nfunction compileGlobs(patterns: string[]): RegExp[] {\n return patterns.map((pattern) => globToRegExp(pattern));\n}\n\nfunction matchesCompiledGlobs(notePath: string, patterns: RegExp[]): boolean {\n if (patterns.length === 0) return false;\n return patterns.some((pattern) => pattern.test(notePath));\n}\n\nasync function listMarkdownFiles(rootDir: string): Promise<string[] | null> {\n const results: string[] = [];\n async function walk(currentDir: string): Promise<void> {\n const entries = await readdir(currentDir, { withFileTypes: true }).catch(() => []);\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n if (!entry.isFile() || !entry.name.toLowerCase().endsWith(\".md\")) continue;\n results.push(toPosixRelative(rootDir, fullPath));\n }\n }\n const rootInfo = await stat(rootDir).catch(() => null);\n if (!rootInfo?.isDirectory()) return null;\n await walk(rootDir);\n return results.sort();\n}\n\nfunction resolveFileCandidates(options: {\n listedFiles: string[];\n bootstrapFiles: string[];\n handoffGlobs: string[];\n dailySummaryGlobs: string[];\n automationNoteGlobs: string[];\n workspaceDocGlobs: string[];\n excludeGlobs: string[];\n}): Array<{\n sourcePath: string;\n sourceKind: \"bootstrap_doc\" | \"handoff\" | \"daily_summary\" | \"automation_note\" | \"workspace_doc\";\n}> {\n const out = new Map<string, \"bootstrap_doc\" | \"handoff\" | \"daily_summary\" | \"automation_note\" | \"workspace_doc\">();\n const excludes = compileGlobs(options.excludeGlobs);\n const handoff = compileGlobs(options.handoffGlobs);\n const dailySummary = compileGlobs(options.dailySummaryGlobs);\n const automation = compileGlobs(options.automationNoteGlobs);\n const workspaceDocs = compileGlobs(options.workspaceDocGlobs);\n const listedFiles = new Set(options.listedFiles.map((value) => value.replace(/\\\\/g, \"/\")));\n\n for (const file of options.bootstrapFiles.map((value) => value.replace(/\\\\/g, \"/\"))) {\n if (listedFiles.has(file) && !matchesCompiledGlobs(file, excludes)) out.set(file, \"bootstrap_doc\");\n }\n\n for (const sourcePath of listedFiles) {\n if (matchesCompiledGlobs(sourcePath, excludes)) continue;\n if (out.has(sourcePath)) continue;\n if (matchesCompiledGlobs(sourcePath, handoff)) {\n out.set(sourcePath, \"handoff\");\n continue;\n }\n if (matchesCompiledGlobs(sourcePath, dailySummary)) {\n out.set(sourcePath, \"daily_summary\");\n continue;\n }\n if (matchesCompiledGlobs(sourcePath, automation)) {\n out.set(sourcePath, \"automation_note\");\n continue;\n }\n if (matchesCompiledGlobs(sourcePath, workspaceDocs)) {\n out.set(sourcePath, \"workspace_doc\");\n }\n }\n\n return [...out.entries()]\n .map(([sourcePath, sourceKind]) => ({ sourcePath, sourceKind }))\n .sort((left, right) => left.sourcePath.localeCompare(right.sourcePath));\n}\n\nexport function resolveNativeKnowledgeStatePath(memoryDir: string, config: NativeKnowledgeConfig): string {\n return path.join(memoryDir, config.stateDir, \"obsidian-sync.json\");\n}\n\nexport function resolveCuratedIncludeFilesStatePath(memoryDir: string, config: NativeKnowledgeConfig): string {\n return path.join(memoryDir, config.stateDir, \"curated-include-sync.json\");\n}\n\nexport function resolveOpenClawWorkspaceStatePath(memoryDir: string, config: NativeKnowledgeConfig): string {\n return path.join(memoryDir, config.stateDir, \"openclaw-workspace-sync.json\");\n}\n\nasync function loadSyncState(memoryDir: string, config: NativeKnowledgeConfig): Promise<ObsidianSyncState> {\n const statePath = resolveNativeKnowledgeStatePath(memoryDir, config);\n try {\n const raw = JSON.parse(await readFile(statePath, \"utf-8\")) as Partial<ObsidianSyncState>;\n if (raw.version !== 1 || typeof raw.vaults !== \"object\" || !raw.vaults) {\n throw new Error(\"invalid obsidian native knowledge state\");\n }\n return {\n version: 1,\n updatedAt: typeof raw.updatedAt === \"string\" ? raw.updatedAt : new Date(0).toISOString(),\n vaults: raw.vaults as Record<string, ObsidianVaultState>,\n };\n } catch {\n return {\n version: 1,\n updatedAt: new Date(0).toISOString(),\n vaults: {},\n };\n }\n}\n\nasync function loadOpenClawWorkspaceState(\n memoryDir: string,\n config: NativeKnowledgeConfig,\n): Promise<OpenClawWorkspaceSyncState> {\n const statePath = resolveOpenClawWorkspaceStatePath(memoryDir, config);\n try {\n const raw = JSON.parse(await readFile(statePath, \"utf-8\")) as Partial<OpenClawWorkspaceSyncState>;\n if (raw.version !== 1 || typeof raw.files !== \"object\" || !raw.files) {\n throw new Error(\"invalid openclaw workspace native knowledge state\");\n }\n return {\n version: 1,\n updatedAt: typeof raw.updatedAt === \"string\" ? raw.updatedAt : new Date(0).toISOString(),\n files: raw.files as Record<string, OpenClawWorkspaceFileState>,\n };\n } catch {\n return {\n version: 1,\n updatedAt: new Date(0).toISOString(),\n files: {},\n };\n }\n}\n\nasync function loadCuratedIncludeFilesState(\n memoryDir: string,\n config: NativeKnowledgeConfig,\n): Promise<CuratedIncludeFilesSyncState> {\n const statePath = resolveCuratedIncludeFilesStatePath(memoryDir, config);\n try {\n const raw = JSON.parse(await readFile(statePath, \"utf-8\")) as Partial<CuratedIncludeFilesSyncState>;\n if (raw.version !== 1 || typeof raw.files !== \"object\" || !raw.files) {\n throw new Error(\"invalid curated include native knowledge state\");\n }\n return {\n version: 1,\n updatedAt: typeof raw.updatedAt === \"string\" ? raw.updatedAt : new Date(0).toISOString(),\n files: raw.files as Record<string, CuratedIncludeFileState>,\n };\n } catch {\n return {\n version: 1,\n updatedAt: new Date(0).toISOString(),\n files: {},\n };\n }\n}\n\nfunction deriveOpenClawArtifactMetadata(options: {\n sourcePath: string;\n parsed: ParsedFrontmatter;\n sharedSafeGlobs: string[];\n}): Pick<NativeKnowledgeChunk, \"derivedDate\" | \"sessionKey\" | \"workflowKey\" | \"author\" | \"agent\" | \"namespace\" | \"privacyClass\"> {\n const sharedSafe = compileGlobs(options.sharedSafeGlobs);\n return {\n derivedDate: deriveArtifactDate(options.sourcePath, options.parsed),\n sessionKey: firstStringValue(options.parsed.data, [\"sessionKey\", \"session\"]),\n workflowKey: firstStringValue(options.parsed.data, [\"workflowKey\", \"workflow\"]),\n author: firstStringValue(options.parsed.data, [\"author\"]),\n agent: firstStringValue(options.parsed.data, [\"agent\"]),\n namespace: firstStringValue(options.parsed.data, [\"namespace\"]),\n privacyClass:\n firstStringValue(options.parsed.data, [\"privacyClass\", \"privacy\"])\n ?? (matchesCompiledGlobs(options.sourcePath, sharedSafe) ? \"shared_safe\" : undefined),\n };\n}\n\nfunction buildOpenClawWorkspaceChunks(options: {\n sourcePath: string;\n sourceKind: \"bootstrap_doc\" | \"handoff\" | \"daily_summary\" | \"automation_note\" | \"workspace_doc\";\n body: string;\n bodyStartLine: number;\n maxChunkChars: number;\n sourceHash: string;\n mtimeMs: number;\n metadata: Pick<NativeKnowledgeChunk, \"derivedDate\" | \"sessionKey\" | \"workflowKey\" | \"author\" | \"agent\" | \"namespace\" | \"privacyClass\">;\n}): NativeKnowledgeChunk[] {\n return chunkHeadingAware({\n sourcePath: options.sourcePath,\n content: options.body,\n maxChunkChars: options.maxChunkChars,\n startLineOffset: options.bodyStartLine - 1,\n createChunk: ({ title, startLine, endLine, content }) => ({\n chunkId: `${options.sourceKind}:${options.sourcePath}:${startLine}-${endLine}`,\n sourcePath: options.sourcePath,\n title,\n sourceKind: options.sourceKind,\n startLine,\n endLine,\n content,\n derivedDate: options.metadata.derivedDate,\n sessionKey: options.metadata.sessionKey,\n workflowKey: options.metadata.workflowKey,\n author: options.metadata.author,\n agent: options.metadata.agent,\n namespace: options.metadata.namespace,\n privacyClass: options.metadata.privacyClass,\n sourceHash: options.sourceHash,\n mtimeMs: options.mtimeMs,\n }),\n });\n}\n\nfunction buildObsidianChunks(options: {\n vault: NativeKnowledgeObsidianVaultConfig;\n notePath: string;\n title: string;\n content: string;\n startLineOffset: number;\n derivedDate?: string;\n tags: string[];\n aliases: string[];\n wikilinks: string[];\n backlinks?: string[];\n namespace?: string;\n privacyClass?: string;\n sourceHash: string;\n mtimeMs: number;\n maxChunkChars: number;\n}): NativeKnowledgeChunk[] {\n const noteKey = `${options.vault.id}:${options.notePath}`;\n return chunkHeadingAware({\n sourcePath: options.notePath,\n content: options.content,\n maxChunkChars: options.maxChunkChars,\n startLineOffset: options.startLineOffset,\n createChunk: ({ title, startLine, endLine, content }) => ({\n chunkId: `${noteKey}:${startLine}-${endLine}`,\n sourcePath: `${options.vault.id}/${options.notePath}`,\n title,\n sourceKind: \"obsidian_note\",\n startLine,\n endLine,\n content,\n vaultId: options.vault.id,\n notePath: options.notePath,\n noteKey,\n derivedDate: options.derivedDate,\n tags: options.tags,\n aliases: options.aliases,\n wikilinks: options.wikilinks,\n backlinks: options.backlinks ?? [],\n namespace: options.namespace,\n privacyClass: options.privacyClass,\n sourceHash: options.sourceHash,\n mtimeMs: options.mtimeMs,\n }),\n });\n}\n\nfunction buildAliasIndex(notes: Record<string, ObsidianNoteState>): Map<string, string[]> {\n const index = new Map<string, string[]>();\n for (const note of Object.values(notes)) {\n if (note.deleted) continue;\n const candidates = [\n note.title,\n path.basename(note.notePath, path.extname(note.notePath)),\n note.notePath.replace(/\\.md$/i, \"\"),\n ...note.aliases,\n ];\n for (const candidate of candidates) {\n const key = normalizeText(candidate);\n if (!key) continue;\n const existing = index.get(key) ?? [];\n existing.push(note.noteKey);\n index.set(key, uniqueSorted(existing));\n }\n }\n return index;\n}\n\nfunction materializeBacklinks(notes: Record<string, ObsidianNoteState>): Record<string, string[]> {\n const backlinks = new Map<string, Set<string>>();\n const aliasIndex = buildAliasIndex(notes);\n for (const note of Object.values(notes)) {\n if (note.deleted) continue;\n for (const target of note.wikilinks) {\n const matches = aliasIndex.get(normalizeText(target)) ?? [];\n for (const match of matches) {\n if (match === note.noteKey) continue;\n const bucket = backlinks.get(match) ?? new Set<string>();\n bucket.add(note.notePath);\n backlinks.set(match, bucket);\n }\n }\n }\n return Object.fromEntries(\n [...backlinks.entries()].map(([noteKey, refs]) => [noteKey, [...refs].sort()]),\n );\n}\n\nexport async function syncObsidianVaults(options: {\n memoryDir: string;\n config: NativeKnowledgeConfig;\n}): Promise<NativeKnowledgeSyncResult> {\n if (options.config.obsidianVaults.length === 0) {\n return {\n statePath: resolveNativeKnowledgeStatePath(options.memoryDir, options.config),\n vaultCount: 0,\n touchedNotes: 0,\n deletedNotes: 0,\n chunkCount: 0,\n activeChunks: [],\n };\n }\n\n const state = await loadSyncState(options.memoryDir, options.config);\n const nextVaults: Record<string, ObsidianVaultState> = {};\n let touchedNotes = 0;\n let deletedNotes = 0;\n let chunkCount = 0;\n\n for (const vault of options.config.obsidianVaults) {\n const previousVault = state.vaults[vault.id];\n const previousNotes = previousVault?.notes ?? {};\n const notePaths = await listMarkdownFiles(vault.rootDir);\n if (notePaths === null) {\n nextVaults[vault.id] = previousVault ?? {\n vaultId: vault.id,\n rootDir: vault.rootDir,\n syncedAt: new Date().toISOString(),\n notes: previousNotes,\n };\n chunkCount += Object.values(previousNotes)\n .filter((note) => !note.deleted)\n .reduce((total, note) => total + note.chunks.length, 0);\n continue;\n }\n\n const includePatterns = compileGlobs(vault.includeGlobs);\n const excludePatterns = compileGlobs(vault.excludeGlobs);\n const includedNotePaths = notePaths.filter((notePath) => {\n if (!matchesCompiledGlobs(notePath, includePatterns)) return false;\n if (matchesCompiledGlobs(notePath, excludePatterns)) return false;\n return true;\n });\n\n const nextNotes: Record<string, ObsidianNoteState> = {};\n const seenNoteKeys = new Set<string>();\n\n for (const notePath of includedNotePaths) {\n const absPath = path.join(vault.rootDir, notePath);\n const content = await readFile(absPath, \"utf-8\").catch(() => null);\n if (content === null) continue;\n const info = await stat(absPath).catch(() => null);\n if (!info?.isFile()) continue;\n\n const sourceHash = createHash(\"sha256\").update(content).digest(\"hex\");\n const noteKey = `${vault.id}:${notePath}`;\n seenNoteKeys.add(noteKey);\n const previous = previousNotes[noteKey];\n if (previous && previous.deleted !== true && previous.sourceHash === sourceHash && previous.mtimeMs === info.mtimeMs) {\n nextNotes[noteKey] = {\n ...previous,\n deleted: false,\n deletedAt: undefined,\n };\n chunkCount += previous.chunks.length;\n continue;\n }\n\n const parsed = parseFrontmatter(content);\n const { targets } = extractWikilinks(parsed.body);\n const tags = uniqueSorted([\n ...parseFrontmatterList(parsed.data.tags),\n ...extractInlineTags(parsed.body),\n ]);\n const aliases = parseFrontmatterList(parsed.data.aliases);\n const { namespace, privacyClass } = classifyObsidianNote(notePath, vault);\n const title = resolveNoteTitle(notePath, parsed);\n const derivedDate = deriveDailyNoteDate(notePath, vault.dailyNotePatterns);\n const chunks = buildObsidianChunks({\n vault,\n notePath,\n title,\n content: parsed.body,\n startLineOffset: parsed.bodyStartLine - 1,\n derivedDate,\n tags,\n aliases,\n wikilinks: targets,\n namespace,\n privacyClass,\n sourceHash,\n mtimeMs: info.mtimeMs,\n maxChunkChars: options.config.maxChunkChars,\n });\n\n nextNotes[noteKey] = {\n noteKey,\n notePath,\n title,\n derivedDate,\n tags,\n aliases,\n wikilinks: targets,\n backlinks: [],\n namespace,\n privacyClass,\n sourceHash,\n mtimeMs: info.mtimeMs,\n deleted: false,\n chunks,\n };\n touchedNotes += 1;\n chunkCount += chunks.length;\n }\n\n for (const [noteKey, previous] of Object.entries(previousNotes)) {\n if (seenNoteKeys.has(noteKey)) continue;\n nextNotes[noteKey] = {\n ...previous,\n deleted: true,\n deletedAt: new Date().toISOString(),\n chunks: [],\n };\n deletedNotes += 1;\n }\n\n if (vault.materializeBacklinks) {\n const backlinks = materializeBacklinks(nextNotes);\n for (const note of Object.values(nextNotes)) {\n if (note.deleted) continue;\n note.backlinks = backlinks[note.noteKey] ?? [];\n note.chunks = note.chunks.map((chunk) => ({\n ...chunk,\n backlinks: note.backlinks,\n }));\n }\n }\n\n nextVaults[vault.id] = {\n vaultId: vault.id,\n rootDir: vault.rootDir,\n syncedAt: new Date().toISOString(),\n notes: nextNotes,\n };\n }\n\n const nextState: ObsidianSyncState = {\n version: 1,\n updatedAt: new Date().toISOString(),\n vaults: nextVaults,\n };\n const activeChunks = loadActiveObsidianChunks({\n state: nextState,\n defaultNamespace: \"default\",\n });\n const statePath = resolveNativeKnowledgeStatePath(options.memoryDir, options.config);\n try {\n await mkdir(path.dirname(statePath), { recursive: true });\n await writeFile(statePath, `${JSON.stringify(nextState, null, 2)}\\n`, \"utf-8\");\n } catch (error) {\n log.warn(`native knowledge: failed to persist obsidian sync state (fail-open): ${String(error)}`);\n }\n\n return {\n statePath,\n vaultCount: options.config.obsidianVaults.length,\n touchedNotes,\n deletedNotes,\n chunkCount,\n activeChunks,\n };\n}\n\nfunction loadActiveObsidianChunks(options: {\n state: ObsidianSyncState;\n recallNamespaces?: string[];\n defaultNamespace: string;\n}): NativeKnowledgeChunk[] {\n const out: NativeKnowledgeChunk[] = [];\n for (const vault of Object.values(options.state.vaults)) {\n for (const note of Object.values(vault.notes)) {\n if (note.deleted) continue;\n if (!isChunkAllowedForRecall(note, options.recallNamespaces, options.defaultNamespace)) continue;\n out.push(...note.chunks);\n }\n }\n return out;\n}\n\nfunction isChunkAllowedForRecall(\n chunk: Pick<NativeKnowledgeChunk, \"namespace\" | \"privacyClass\">,\n recallNamespaces: string[] | undefined,\n defaultNamespace: string,\n): boolean {\n const namespace = chunk.namespace?.trim() || defaultNamespace;\n if (\n Array.isArray(recallNamespaces) &&\n namespace !== defaultNamespace &&\n !recallNamespaces.includes(namespace)\n ) {\n return false;\n }\n const privacyClass = chunk.privacyClass?.trim().toLowerCase();\n if (\n privacyClass === \"private\" &&\n Array.isArray(recallNamespaces) &&\n (namespace !== defaultNamespace || !recallNamespaces.includes(defaultNamespace))\n ) {\n return false;\n }\n return true;\n}\n\nfunction loadActiveOpenClawWorkspaceChunks(options: {\n state: OpenClawWorkspaceSyncState;\n recallNamespaces?: string[];\n defaultNamespace: string;\n}): NativeKnowledgeChunk[] {\n const out: NativeKnowledgeChunk[] = [];\n for (const file of Object.values(options.state.files)) {\n if (file.deleted) continue;\n if (!isChunkAllowedForRecall(file, options.recallNamespaces, options.defaultNamespace)) continue;\n out.push(...file.chunks);\n }\n return out;\n}\n\nfunction deriveCuratedFileMetadata(options: {\n sourcePath: string;\n parsed: ParsedFrontmatter;\n}): Pick<NativeKnowledgeChunk, \"derivedDate\" | \"namespace\" | \"privacyClass\"> {\n return {\n derivedDate: deriveArtifactDate(options.sourcePath, options.parsed),\n namespace: firstStringValue(options.parsed.data, [\"namespace\"]) ?? deriveNamespaceFromIncludePath(options.sourcePath),\n privacyClass: firstStringValue(options.parsed.data, [\"privacyClass\", \"privacy\"]),\n };\n}\n\nfunction buildCuratedIncludeChunks(options: {\n sourcePath: string;\n body: string;\n bodyStartLine: number;\n maxChunkChars: number;\n sourceHash: string;\n mtimeMs: number;\n metadata: Pick<NativeKnowledgeChunk, \"derivedDate\" | \"namespace\" | \"privacyClass\">;\n}): NativeKnowledgeChunk[] {\n return chunkHeadingAware({\n sourcePath: options.sourcePath,\n content: options.body,\n maxChunkChars: options.maxChunkChars,\n startLineOffset: options.bodyStartLine - 1,\n createChunk: ({ title, startLine, endLine, content }) => ({\n chunkId: `${options.sourcePath}:${startLine}-${endLine}`,\n sourcePath: options.sourcePath,\n title,\n sourceKind: detectSourceKind(options.sourcePath),\n startLine,\n endLine,\n content,\n derivedDate: options.metadata.derivedDate,\n namespace: options.metadata.namespace,\n privacyClass: options.metadata.privacyClass,\n sourceHash: options.sourceHash,\n mtimeMs: options.mtimeMs,\n }),\n });\n}\n\nfunction loadActiveCuratedIncludeChunks(options: {\n state: CuratedIncludeFilesSyncState;\n recallNamespaces?: string[];\n defaultNamespace: string;\n}): NativeKnowledgeChunk[] {\n const out: NativeKnowledgeChunk[] = [];\n for (const file of Object.values(options.state.files)) {\n if (file.deleted) continue;\n if (!isChunkAllowedForRecall(file, options.recallNamespaces, options.defaultNamespace)) continue;\n out.push(...file.chunks);\n }\n return out;\n}\n\nfunction dedupeNativeKnowledgeChunks(chunks: NativeKnowledgeChunk[]): NativeKnowledgeChunk[] {\n const seen = new Set<string>();\n const priority = new Map<NativeKnowledgeChunk[\"sourceKind\"], number>([\n [\"handoff\", 1],\n [\"daily_summary\", 2],\n [\"bootstrap_doc\", 3],\n [\"automation_note\", 4],\n [\"workspace_doc\", 5],\n [\"identity\", 6],\n [\"memory\", 7],\n [\"obsidian_note\", 8],\n ]);\n return [...chunks]\n .sort((left, right) => {\n const leftPriority = priority.get(left.sourceKind) ?? 99;\n const rightPriority = priority.get(right.sourceKind) ?? 99;\n return (\n leftPriority - rightPriority\n || left.sourcePath.localeCompare(right.sourcePath)\n || left.startLine - right.startLine\n );\n })\n .filter((chunk) => {\n const key = [\n chunk.sourcePath,\n chunk.startLine,\n chunk.endLine,\n chunk.content,\n ].join(\"::\");\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nasync function findPersistedNativeKnowledgeStateFiles(\n rootDir: string,\n maxDepth: number,\n currentDepth: number = 0,\n): Promise<string[]> {\n if (currentDepth > maxDepth) return [];\n const entries = await readdir(rootDir, { withFileTypes: true }).catch(() => []);\n const out: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(rootDir, entry.name);\n if (entry.isFile() && PERSISTED_NATIVE_KNOWLEDGE_STATE_FILES.has(entry.name)) {\n out.push(fullPath);\n continue;\n }\n if (!entry.isDirectory()) continue;\n out.push(...await findPersistedNativeKnowledgeStateFiles(fullPath, maxDepth, currentDepth + 1));\n }\n return out;\n}\n\nexport async function loadPersistedNativeKnowledgeChunks(options: {\n memoryDir: string;\n recallNamespaces?: string[];\n defaultNamespace: string;\n}): Promise<NativeKnowledgeChunk[]> {\n const stateFiles = await findPersistedNativeKnowledgeStateFiles(options.memoryDir, 4);\n if (stateFiles.length === 0) return [];\n\n const chunks: NativeKnowledgeChunk[] = [];\n for (const statePath of stateFiles.sort()) {\n const raw = await readFile(statePath, \"utf-8\").catch(() => \"\");\n if (!raw) continue;\n try {\n const parsed = JSON.parse(raw) as { vaults?: unknown; files?: unknown };\n if (typeof parsed.vaults === \"object\" && parsed.vaults) {\n const state: ObsidianSyncState = {\n version: 1,\n updatedAt: new Date(0).toISOString(),\n vaults: parsed.vaults as Record<string, ObsidianVaultState>,\n };\n chunks.push(...loadActiveObsidianChunks({\n state,\n recallNamespaces: options.recallNamespaces,\n defaultNamespace: options.defaultNamespace,\n }).map((chunk) => {\n const note = Object.values(state.vaults)\n .flatMap((vault) => Object.values(vault.notes))\n .find((entry) => entry.chunks.some((candidate) => candidate.chunkId === chunk.chunkId));\n if (!note) return chunk;\n return {\n ...chunk,\n derivedDate: chunk.derivedDate ?? note.derivedDate,\n namespace: chunk.namespace ?? note.namespace,\n privacyClass: chunk.privacyClass ?? note.privacyClass,\n aliases: chunk.aliases ?? note.aliases,\n tags: chunk.tags ?? note.tags,\n wikilinks: chunk.wikilinks ?? note.wikilinks,\n backlinks: chunk.backlinks ?? note.backlinks,\n };\n }));\n continue;\n }\n if (typeof parsed.files === \"object\" && parsed.files) {\n if (path.basename(statePath) === \"openclaw-workspace-sync.json\") {\n const state: OpenClawWorkspaceSyncState = {\n version: 1,\n updatedAt: new Date(0).toISOString(),\n files: parsed.files as Record<string, OpenClawWorkspaceFileState>,\n };\n chunks.push(...loadActiveOpenClawWorkspaceChunks({\n state,\n recallNamespaces: options.recallNamespaces,\n defaultNamespace: options.defaultNamespace,\n }).map((chunk) => {\n const file = state.files[chunk.sourcePath];\n if (!file) return chunk;\n return {\n ...chunk,\n derivedDate: chunk.derivedDate ?? file.derivedDate,\n namespace: chunk.namespace ?? file.namespace,\n privacyClass: chunk.privacyClass ?? file.privacyClass,\n sessionKey: chunk.sessionKey ?? file.sessionKey,\n workflowKey: chunk.workflowKey ?? file.workflowKey,\n author: chunk.author ?? file.author,\n agent: chunk.agent ?? file.agent,\n };\n }));\n continue;\n }\n const state: CuratedIncludeFilesSyncState = {\n version: 1,\n updatedAt: new Date(0).toISOString(),\n files: parsed.files as Record<string, CuratedIncludeFileState>,\n };\n chunks.push(...loadActiveCuratedIncludeChunks({\n state,\n recallNamespaces: options.recallNamespaces,\n defaultNamespace: options.defaultNamespace,\n }).map((chunk) => {\n const file = state.files[chunk.sourcePath];\n if (!file) return chunk;\n return {\n ...chunk,\n derivedDate: chunk.derivedDate ?? file.derivedDate,\n namespace: chunk.namespace ?? file.namespace,\n privacyClass: chunk.privacyClass ?? file.privacyClass,\n };\n }));\n }\n } catch {\n continue;\n }\n }\n\n return dedupeNativeKnowledgeChunks(chunks);\n}\n\nexport async function syncOpenClawWorkspaceArtifacts(options: {\n workspaceDir: string;\n memoryDir: string;\n config: NativeKnowledgeConfig;\n}): Promise<{\n statePath: string;\n touchedFiles: number;\n deletedFiles: number;\n chunkCount: number;\n activeChunks: NativeKnowledgeChunk[];\n}> {\n const adapter = options.config.openclawWorkspace;\n const statePath = resolveOpenClawWorkspaceStatePath(options.memoryDir, options.config);\n if (!adapter?.enabled) {\n return { statePath, touchedFiles: 0, deletedFiles: 0, chunkCount: 0, activeChunks: [] };\n }\n\n const previousState = await loadOpenClawWorkspaceState(options.memoryDir, options.config);\n const listedFiles = await listMarkdownFiles(options.workspaceDir);\n if (listedFiles === null) {\n return {\n statePath,\n touchedFiles: 0,\n deletedFiles: 0,\n chunkCount: Object.values(previousState.files)\n .filter((file) => !file.deleted)\n .reduce((total, file) => total + file.chunks.length, 0),\n activeChunks: loadActiveOpenClawWorkspaceChunks({\n state: previousState,\n defaultNamespace: \"default\",\n }),\n };\n }\n\n const candidates = resolveFileCandidates({\n listedFiles,\n bootstrapFiles: adapter.bootstrapFiles,\n handoffGlobs: adapter.handoffGlobs,\n dailySummaryGlobs: adapter.dailySummaryGlobs,\n automationNoteGlobs: adapter.automationNoteGlobs,\n workspaceDocGlobs: adapter.workspaceDocGlobs,\n excludeGlobs: adapter.excludeGlobs,\n });\n const nextFiles: Record<string, OpenClawWorkspaceFileState> = {};\n const seen = new Set<string>();\n let touchedFiles = 0;\n let deletedFiles = 0;\n\n for (const candidate of candidates) {\n const absPath = path.join(options.workspaceDir, candidate.sourcePath);\n const content = await readFile(absPath, \"utf-8\").catch(() => null);\n if (content === null) continue;\n const info = await stat(absPath).catch(() => null);\n if (!info?.isFile()) continue;\n\n const sourceHash = createHash(\"sha256\").update(content).digest(\"hex\");\n const parsed = parseFrontmatter(content);\n const metadata = deriveOpenClawArtifactMetadata({\n sourcePath: candidate.sourcePath,\n parsed,\n sharedSafeGlobs: adapter.sharedSafeGlobs,\n });\n const title = resolveNoteTitle(candidate.sourcePath, parsed);\n const syncConfigHash = createHash(\"sha256\")\n .update(JSON.stringify({\n sourceKind: candidate.sourceKind,\n maxChunkChars: options.config.maxChunkChars,\n metadata,\n }))\n .digest(\"hex\");\n const previous = previousState.files[candidate.sourcePath];\n if (\n previous &&\n previous.deleted !== true &&\n previous.sourceHash === sourceHash &&\n previous.mtimeMs === info.mtimeMs &&\n previous.syncConfigHash === syncConfigHash\n ) {\n nextFiles[candidate.sourcePath] = {\n ...previous,\n deleted: false,\n deletedAt: undefined,\n };\n seen.add(candidate.sourcePath);\n continue;\n }\n\n const chunks = buildOpenClawWorkspaceChunks({\n sourcePath: candidate.sourcePath,\n sourceKind: candidate.sourceKind,\n body: parsed.body,\n bodyStartLine: parsed.bodyStartLine,\n maxChunkChars: options.config.maxChunkChars,\n sourceHash,\n mtimeMs: info.mtimeMs,\n metadata,\n });\n\n nextFiles[candidate.sourcePath] = {\n sourcePath: candidate.sourcePath,\n sourceKind: candidate.sourceKind,\n title,\n namespace: metadata.namespace,\n privacyClass: metadata.privacyClass,\n derivedDate: metadata.derivedDate,\n sessionKey: metadata.sessionKey,\n workflowKey: metadata.workflowKey,\n author: metadata.author,\n agent: metadata.agent,\n sourceHash,\n syncConfigHash,\n mtimeMs: info.mtimeMs,\n deleted: false,\n chunks,\n };\n touchedFiles += 1;\n seen.add(candidate.sourcePath);\n }\n\n for (const [sourcePath, previous] of Object.entries(previousState.files)) {\n if (seen.has(sourcePath)) continue;\n nextFiles[sourcePath] = {\n ...previous,\n deleted: true,\n deletedAt: new Date().toISOString(),\n chunks: [],\n };\n deletedFiles += 1;\n }\n\n const nextState: OpenClawWorkspaceSyncState = {\n version: 1,\n updatedAt: new Date().toISOString(),\n files: nextFiles,\n };\n const activeChunks = loadActiveOpenClawWorkspaceChunks({\n state: nextState,\n defaultNamespace: \"default\",\n });\n const chunkCount = activeChunks.length;\n try {\n await mkdir(path.dirname(statePath), { recursive: true });\n await writeFile(statePath, `${JSON.stringify(nextState, null, 2)}\\n`, \"utf-8\");\n } catch (error) {\n log.warn(`native knowledge: failed to persist openclaw workspace sync state (fail-open): ${String(error)}`);\n }\n\n return {\n statePath,\n touchedFiles,\n deletedFiles,\n chunkCount,\n activeChunks,\n };\n}\n\nexport async function syncCuratedIncludeFiles(options: {\n workspaceDir: string;\n memoryDir: string;\n config: NativeKnowledgeConfig;\n recallNamespaces?: string[];\n defaultNamespace: string;\n skipSourcePaths?: string[];\n}): Promise<{\n statePath: string;\n touchedFiles: number;\n deletedFiles: number;\n chunkCount: number;\n activeChunks: NativeKnowledgeChunk[];\n}> {\n const statePath = resolveCuratedIncludeFilesStatePath(options.memoryDir, options.config);\n const previousState = await loadCuratedIncludeFilesState(options.memoryDir, options.config);\n const workspaceInfo = await stat(options.workspaceDir).catch(() => null);\n if (!workspaceInfo?.isDirectory()) {\n return {\n statePath,\n touchedFiles: 0,\n deletedFiles: 0,\n chunkCount: Object.values(previousState.files)\n .filter((file) => !file.deleted)\n .reduce((total, file) => total + file.chunks.length, 0),\n activeChunks: loadActiveCuratedIncludeChunks({\n state: previousState,\n recallNamespaces: options.recallNamespaces,\n defaultNamespace: options.defaultNamespace,\n }),\n };\n }\n\n const skipped = new Set((options.skipSourcePaths ?? []).map((value) => value.replace(/\\\\/g, \"/\")));\n const candidatePaths = await resolveCandidatePaths({\n workspaceDir: options.workspaceDir,\n includeFiles: options.config.includeFiles,\n defaultNamespace: options.defaultNamespace,\n identityVariantMode: \"disk\",\n });\n const nextFiles: Record<string, CuratedIncludeFileState> = {};\n const seen = new Set<string>();\n let touchedFiles = 0;\n let deletedFiles = 0;\n\n for (const filePath of candidatePaths) {\n if (!(await readableFile(filePath))) continue;\n const content = await readFile(filePath, \"utf-8\").catch(() => null);\n if (content === null) continue;\n const info = await stat(filePath).catch(() => null);\n if (!info?.isFile()) continue;\n\n const sourcePath = path.relative(options.workspaceDir, filePath).replace(/\\\\/g, \"/\");\n if (skipped.has(sourcePath)) continue;\n\n const parsed = parseFrontmatter(content);\n const metadata = deriveCuratedFileMetadata({\n sourcePath,\n parsed,\n });\n const sourceKind = detectSourceKind(sourcePath);\n const sourceHash = createHash(\"sha256\").update(content).digest(\"hex\");\n const title = resolveNoteTitle(sourcePath, parsed);\n const syncConfigHash = createHash(\"sha256\")\n .update(JSON.stringify({\n sourceKind,\n maxChunkChars: options.config.maxChunkChars,\n metadata,\n }))\n .digest(\"hex\");\n const previous = previousState.files[sourcePath];\n if (\n previous &&\n previous.deleted !== true &&\n previous.sourceHash === sourceHash &&\n previous.mtimeMs === info.mtimeMs &&\n previous.syncConfigHash === syncConfigHash\n ) {\n nextFiles[sourcePath] = {\n ...previous,\n deleted: false,\n deletedAt: undefined,\n };\n seen.add(sourcePath);\n continue;\n }\n\n const chunks = buildCuratedIncludeChunks({\n sourcePath,\n body: parsed.body,\n bodyStartLine: parsed.bodyStartLine,\n maxChunkChars: options.config.maxChunkChars,\n sourceHash,\n mtimeMs: info.mtimeMs,\n metadata,\n });\n nextFiles[sourcePath] = {\n sourcePath,\n sourceKind,\n title,\n namespace: metadata.namespace,\n privacyClass: metadata.privacyClass,\n derivedDate: metadata.derivedDate,\n sourceHash,\n syncConfigHash,\n mtimeMs: info.mtimeMs,\n deleted: false,\n chunks,\n };\n touchedFiles += 1;\n seen.add(sourcePath);\n }\n\n for (const [sourcePath, previous] of Object.entries(previousState.files)) {\n if (seen.has(sourcePath) || skipped.has(sourcePath)) continue;\n if (previous.deleted) {\n nextFiles[sourcePath] = previous;\n continue;\n }\n nextFiles[sourcePath] = {\n ...previous,\n deleted: true,\n deletedAt: new Date().toISOString(),\n chunks: [],\n };\n deletedFiles += 1;\n }\n\n const nextState: CuratedIncludeFilesSyncState = {\n version: 1,\n updatedAt: new Date().toISOString(),\n files: nextFiles,\n };\n const activeChunks = loadActiveCuratedIncludeChunks({\n state: nextState,\n recallNamespaces: options.recallNamespaces,\n defaultNamespace: options.defaultNamespace,\n });\n const chunkCount = Object.values(nextFiles)\n .filter((file) => !file.deleted)\n .reduce((total, file) => total + file.chunks.length, 0);\n try {\n await mkdir(path.dirname(statePath), { recursive: true });\n await writeFile(statePath, `${JSON.stringify(nextState, null, 2)}\\n`, \"utf-8\");\n } catch (error) {\n log.warn(`native knowledge: failed to persist curated include sync state (fail-open): ${String(error)}`);\n }\n\n return {\n statePath,\n touchedFiles,\n deletedFiles,\n chunkCount,\n activeChunks,\n };\n}\n\nexport async function collectNativeKnowledgeChunks(options: {\n workspaceDir: string;\n memoryDir?: string;\n config: NativeKnowledgeConfig;\n recallNamespaces?: string[];\n defaultNamespace: string;\n abortSignal?: AbortSignal;\n}): Promise<NativeKnowledgeChunk[]> {\n throwIfNativeKnowledgeAborted(options.abortSignal);\n if (!options.config.enabled) return [];\n\n const chunks: NativeKnowledgeChunk[] = [];\n const openclawBootstrapFiles = new Set(\n (options.memoryDir && options.config.openclawWorkspace?.enabled\n ? options.config.openclawWorkspace.bootstrapFiles\n : []\n )\n .map((value) => value.replace(/\\\\/g, \"/\")),\n );\n if (options.memoryDir) {\n throwIfNativeKnowledgeAborted(options.abortSignal);\n const syncResult = await syncCuratedIncludeFiles({\n workspaceDir: options.workspaceDir,\n memoryDir: options.memoryDir,\n config: options.config,\n recallNamespaces: options.recallNamespaces,\n defaultNamespace: options.defaultNamespace,\n skipSourcePaths: [...openclawBootstrapFiles],\n });\n chunks.push(...syncResult.activeChunks);\n } else {\n throwIfNativeKnowledgeAborted(options.abortSignal);\n const candidatePaths = await resolveCandidatePaths({\n workspaceDir: options.workspaceDir,\n includeFiles: options.config.includeFiles,\n recallNamespaces: options.recallNamespaces,\n defaultNamespace: options.defaultNamespace,\n identityVariantMode: \"recall\",\n });\n for (const filePath of candidatePaths) {\n throwIfNativeKnowledgeAborted(options.abortSignal);\n if (!(await readableFile(filePath))) continue;\n const content = await readFile(filePath, \"utf-8\").catch(() => null);\n if (!content) continue;\n const sourcePath = path.relative(options.workspaceDir, filePath).replace(/\\\\/g, \"/\");\n if (openclawBootstrapFiles.has(sourcePath)) continue;\n const parsed = parseFrontmatter(content);\n const metadata = deriveCuratedFileMetadata({\n sourcePath,\n parsed,\n });\n const directChunks = buildCuratedIncludeChunks({\n sourcePath,\n body: parsed.body,\n bodyStartLine: parsed.bodyStartLine,\n maxChunkChars: options.config.maxChunkChars,\n sourceHash: createHash(\"sha256\").update(content).digest(\"hex\"),\n mtimeMs: 0,\n metadata,\n }).filter((chunk) => isChunkAllowedForRecall(chunk, options.recallNamespaces, options.defaultNamespace));\n chunks.push(...directChunks);\n }\n }\n\n if (options.memoryDir && options.config.openclawWorkspace?.enabled) {\n throwIfNativeKnowledgeAborted(options.abortSignal);\n const syncResult = await syncOpenClawWorkspaceArtifacts({\n workspaceDir: options.workspaceDir,\n memoryDir: options.memoryDir,\n config: options.config,\n });\n chunks.push(\n ...syncResult.activeChunks.filter((chunk) =>\n isChunkAllowedForRecall(chunk, options.recallNamespaces, options.defaultNamespace),\n ),\n );\n }\n\n if (options.memoryDir && options.config.obsidianVaults.length > 0) {\n throwIfNativeKnowledgeAborted(options.abortSignal);\n const syncResult = await syncObsidianVaults({\n memoryDir: options.memoryDir,\n config: options.config,\n });\n chunks.push(\n ...syncResult.activeChunks.filter((chunk) =>\n isChunkAllowedForRecall(chunk, options.recallNamespaces, options.defaultNamespace),\n ),\n );\n }\n\n return dedupeNativeKnowledgeChunks(chunks);\n}\n\nfunction throwIfNativeKnowledgeAborted(signal?: AbortSignal): void {\n if (!signal?.aborted) return;\n const err = new Error(\"native knowledge collection aborted\");\n Object.defineProperty(err, \"name\", { value: \"AbortError\" });\n throw err;\n}\n\nexport function searchNativeKnowledge(options: {\n query: string;\n chunks: NativeKnowledgeChunk[];\n maxResults: number;\n}): NativeKnowledgeSearchResult[] {\n const normalizedQuery = normalizeText(options.query);\n const queryTokens = new Set(tokenize(options.query));\n if (!normalizedQuery || queryTokens.size === 0 || options.maxResults <= 0) return [];\n const temporalQuery = /\\b(today|yesterday|recent|latest|current|next|handoff|summary)\\b/i.test(options.query);\n const now = Date.now();\n\n return options.chunks\n .map((chunk) => {\n const metadataText = [\n chunk.title,\n chunk.content,\n chunk.sourcePath,\n chunk.notePath,\n chunk.derivedDate,\n chunk.sessionKey,\n chunk.workflowKey,\n chunk.author,\n chunk.agent,\n ...(chunk.tags ?? []),\n ...(chunk.aliases ?? []),\n ...(chunk.wikilinks ?? []),\n ...(chunk.backlinks ?? []),\n ]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\"\\n\");\n const normalizedContent = normalizeText(metadataText);\n const contentTokens = new Set(tokenize(normalizedContent));\n let overlap = 0;\n for (const token of queryTokens) {\n if (contentTokens.has(token)) overlap += 1;\n }\n if (overlap === 0 && !normalizedContent.includes(normalizedQuery)) return null;\n const kindBoost =\n chunk.sourceKind === \"handoff\"\n ? 0.2\n : chunk.sourceKind === \"daily_summary\"\n ? 0.16\n : chunk.sourceKind === \"bootstrap_doc\" || chunk.sourceKind === \"identity\"\n ? 0.15\n : chunk.sourceKind === \"memory\"\n ? 0.1\n : chunk.sourceKind === \"obsidian_note\"\n ? 0.08\n : chunk.sourceKind === \"automation_note\"\n ? 0.06\n : 0.05;\n const phraseBoost = normalizedContent.includes(normalizedQuery) ? 0.35 : 0;\n const metadataBoost =\n (chunk.aliases?.some((alias) => normalizeText(alias).includes(normalizedQuery)) ? 0.12 : 0) +\n (chunk.tags?.some((tag) => normalizeText(tag).includes(normalizedQuery)) ? 0.08 : 0) +\n (chunk.derivedDate && normalizeText(chunk.derivedDate).includes(normalizedQuery) ? 0.08 : 0) +\n (chunk.sessionKey && normalizeText(chunk.sessionKey).includes(normalizedQuery) ? 0.1 : 0) +\n (chunk.workflowKey && normalizeText(chunk.workflowKey).includes(normalizedQuery) ? 0.08 : 0) +\n (chunk.agent && normalizeText(chunk.agent).includes(normalizedQuery) ? 0.06 : 0) +\n (chunk.author && normalizeText(chunk.author).includes(normalizedQuery) ? 0.05 : 0);\n let temporalBoost = 0;\n if (chunk.derivedDate) {\n const parsed = Date.parse(`${chunk.derivedDate}T00:00:00Z`);\n if (Number.isFinite(parsed)) {\n const ageDays = Math.max(0, Math.floor((now - parsed) / (24 * 60 * 60 * 1000)));\n if (ageDays <= 1) temporalBoost += temporalQuery ? 0.12 : 0.04;\n else if (ageDays <= 7) temporalBoost += temporalQuery ? 0.08 : 0.02;\n else if (temporalQuery && ageDays >= 90) temporalBoost -= 0.08;\n }\n }\n return {\n ...chunk,\n score: overlap / Math.max(queryTokens.size, 1) + kindBoost + phraseBoost + metadataBoost + temporalBoost,\n };\n })\n .filter((chunk): chunk is NativeKnowledgeSearchResult => chunk !== null)\n .sort((a, b) => b.score - a.score || a.sourcePath.localeCompare(b.sourcePath) || a.startLine - b.startLine)\n .slice(0, options.maxResults);\n}\n\nexport function formatNativeKnowledgeSection(options: {\n results: NativeKnowledgeSearchResult[];\n maxChars: number;\n}): string | null {\n if (options.results.length === 0 || options.maxChars <= 0) return null;\n const lines = [\"## Curated Workspace Knowledge\", \"\"];\n let used = lines.join(\"\\n\").length;\n\n for (const result of options.results) {\n const snippet = result.content.length > 500 ? `${result.content.slice(0, 497)}...` : result.content;\n const meta = [\n `kind=${result.sourceKind}`,\n result.derivedDate ? `date=${result.derivedDate}` : null,\n result.sessionKey ? `session=${result.sessionKey}` : null,\n result.workflowKey ? `workflow=${result.workflowKey}` : null,\n result.agent ? `agent=${result.agent}` : null,\n result.author ? `author=${result.author}` : null,\n result.tags && result.tags.length > 0 ? `tags=${result.tags.join(\",\")}` : null,\n result.vaultId ? `vault=${result.vaultId}` : null,\n ]\n .filter((value): value is string => value !== null)\n .join(\" \");\n const block =\n `- ${result.sourcePath}:${result.startLine}-${result.endLine} [${result.title}] ` +\n `(score: ${result.score.toFixed(3)}${meta ? `; ${meta}` : \"\"})\\n ${snippet.replace(/\\n/g, \"\\n \")}`;\n if (used + block.length > options.maxChars && lines.length > 2) break;\n if (used + block.length > options.maxChars) return null;\n lines.push(block);\n used += block.length + 1;\n }\n\n return lines.length > 2 ? lines.join(\"\\n\") : null;\n}\n"],"mappings":"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","names":["state"]}
|