@remnic/core 1.1.31 → 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 +8 -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 +45 -13
- package/dist/access-schema.js +8 -8
- package/dist/{access-service-CkZyb35d.d.ts → access-service-qrrIrC-0.d.ts} +5 -128
- 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-ZAVUCJ4H.js → chunk-3Q4H3OBR.js} +150 -65
- 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-U7EJOMFC.js → chunk-4Q73JBSM.js} +4 -4
- 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-TPU5L5EY.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-YU5KIWYQ.js → chunk-FER4WARO.js} +79 -41
- 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-3ZLVGM76.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-YROHKYBY.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-kuh9PwZ5.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 +20 -350
- package/dist/index.js +884 -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.js +4 -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 +191 -17
- 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/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 +150 -0
- package/src/access-http.ts +89 -34
- 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 +11 -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 +5 -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/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-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-3ZLVGM76.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-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-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-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-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-TPU5L5EY.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-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-YROHKYBY.js.map +0 -1
- package/dist/chunk-YU5KIWYQ.js.map +0 -1
- package/dist/chunk-ZAVUCJ4H.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-U7EJOMFC.js.map → chunk-4Q73JBSM.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
|
@@ -21,15 +21,14 @@
|
|
|
21
21
|
* touches this module.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
+
import { randomUUID } from "node:crypto";
|
|
24
25
|
import { promises as fs } from "node:fs";
|
|
25
26
|
import path from "node:path";
|
|
27
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
26
28
|
|
|
27
29
|
import { expandTildePath } from "../../utils/path.js";
|
|
28
30
|
|
|
29
|
-
import {
|
|
30
|
-
isValidConnectorId,
|
|
31
|
-
type ConnectorCursor,
|
|
32
|
-
} from "./framework.js";
|
|
31
|
+
import { type ConnectorCursor, isValidConnectorId } from "./framework.js";
|
|
33
32
|
|
|
34
33
|
/**
|
|
35
34
|
* Status of the most recent sync attempt for a connector.
|
|
@@ -66,12 +65,13 @@ export interface ConnectorState {
|
|
|
66
65
|
|
|
67
66
|
const STATE_DIR_NAME = "state";
|
|
68
67
|
const CONNECTORS_DIR_NAME = "connectors";
|
|
68
|
+
const CONNECTOR_LOCKS_DIR_NAME = "connector-locks";
|
|
69
69
|
const MAX_ERROR_LENGTH = 1024;
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
]);
|
|
70
|
+
const CONNECTOR_LOCK_STALE_MS = 10 * 60 * 1000;
|
|
71
|
+
const CONNECTOR_LOCK_HEARTBEAT_MS = Math.max(1_000, Math.floor(CONNECTOR_LOCK_STALE_MS / 4));
|
|
72
|
+
const CONNECTOR_LOCK_TIMEOUT_MS = 60 * 1000;
|
|
73
|
+
const CONNECTOR_LOCK_RETRY_MS = 50;
|
|
74
|
+
const VALID_SYNC_STATUSES: ReadonlySet<ConnectorSyncStatus> = new Set(["success", "error", "never"]);
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
77
|
* Internal error thrown when a state file's JSON is unparseable or its shape
|
|
@@ -86,6 +86,30 @@ class ConnectorStateCorruptionError extends Error {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
export class ConnectorStateLockLostError extends Error {
|
|
90
|
+
constructor(message: string) {
|
|
91
|
+
super(message);
|
|
92
|
+
this.name = "ConnectorStateLockLostError";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
interface ConnectorLockLease {
|
|
97
|
+
readonly path: string;
|
|
98
|
+
readonly token: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
interface ConnectorLockMetadata {
|
|
102
|
+
readonly pid: number;
|
|
103
|
+
readonly token: string;
|
|
104
|
+
readonly createdAt: string;
|
|
105
|
+
readonly refreshedAt: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
interface ConnectorStateLockOptions {
|
|
109
|
+
readonly heartbeatMs?: number;
|
|
110
|
+
readonly unrefHeartbeat?: boolean;
|
|
111
|
+
}
|
|
112
|
+
|
|
89
113
|
/**
|
|
90
114
|
* Resolve `<memoryDir>/state/connectors/`, expanding `~` per CLAUDE.md #17.
|
|
91
115
|
*/
|
|
@@ -96,6 +120,13 @@ function resolveConnectorsDir(memoryDir: string): string {
|
|
|
96
120
|
return path.join(expandTildePath(memoryDir), STATE_DIR_NAME, CONNECTORS_DIR_NAME);
|
|
97
121
|
}
|
|
98
122
|
|
|
123
|
+
function resolveConnectorLocksDir(memoryDir: string): string {
|
|
124
|
+
if (typeof memoryDir !== "string" || memoryDir.length === 0) {
|
|
125
|
+
throw new TypeError("memoryDir must be a non-empty string");
|
|
126
|
+
}
|
|
127
|
+
return path.join(expandTildePath(memoryDir), STATE_DIR_NAME, CONNECTOR_LOCKS_DIR_NAME);
|
|
128
|
+
}
|
|
129
|
+
|
|
99
130
|
/**
|
|
100
131
|
* Resolve the state file path for a single connector. Throws on invalid id
|
|
101
132
|
* to prevent path traversal via crafted ids.
|
|
@@ -103,12 +134,21 @@ function resolveConnectorsDir(memoryDir: string): string {
|
|
|
103
134
|
function resolveConnectorStatePath(memoryDir: string, id: string): string {
|
|
104
135
|
if (!isValidConnectorId(id)) {
|
|
105
136
|
throw new TypeError(
|
|
106
|
-
`invalid connector id ${JSON.stringify(id)} — must match /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])
|
|
137
|
+
`invalid connector id ${JSON.stringify(id)} — must match /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/`
|
|
107
138
|
);
|
|
108
139
|
}
|
|
109
140
|
return path.join(resolveConnectorsDir(memoryDir), `${id}.json`);
|
|
110
141
|
}
|
|
111
142
|
|
|
143
|
+
function resolveConnectorLockPath(memoryDir: string, id: string): string {
|
|
144
|
+
if (!isValidConnectorId(id)) {
|
|
145
|
+
throw new TypeError(
|
|
146
|
+
`invalid connector id ${JSON.stringify(id)} — must match /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/`
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
return path.join(resolveConnectorLocksDir(memoryDir), `${id}.lock`);
|
|
150
|
+
}
|
|
151
|
+
|
|
112
152
|
/**
|
|
113
153
|
* Type guard for parsed state records. Validates the on-disk shape so a
|
|
114
154
|
* corrupted/edited file produces a clear error rather than crashing later.
|
|
@@ -139,6 +179,58 @@ function isConnectorStateShape(value: unknown): value is ConnectorState {
|
|
|
139
179
|
return true;
|
|
140
180
|
}
|
|
141
181
|
|
|
182
|
+
function isConnectorLockMetadata(value: unknown): value is ConnectorLockMetadata {
|
|
183
|
+
if (typeof value !== "object" || value === null) return false;
|
|
184
|
+
const v = value as Record<string, unknown>;
|
|
185
|
+
return (
|
|
186
|
+
typeof v.pid === "number" &&
|
|
187
|
+
Number.isInteger(v.pid) &&
|
|
188
|
+
v.pid > 0 &&
|
|
189
|
+
typeof v.token === "string" &&
|
|
190
|
+
v.token.length > 0 &&
|
|
191
|
+
typeof v.createdAt === "string" &&
|
|
192
|
+
typeof v.refreshedAt === "string"
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function connectorLockMetadata(token: string, createdAt = new Date().toISOString()): ConnectorLockMetadata {
|
|
197
|
+
return {
|
|
198
|
+
pid: process.pid,
|
|
199
|
+
token,
|
|
200
|
+
createdAt,
|
|
201
|
+
refreshedAt: new Date().toISOString(),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async function readConnectorLockMetadata(lockPath: string): Promise<ConnectorLockMetadata | null> {
|
|
206
|
+
let raw: string;
|
|
207
|
+
try {
|
|
208
|
+
raw = await fs.readFile(lockPath, "utf8");
|
|
209
|
+
} catch (err) {
|
|
210
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return null;
|
|
211
|
+
throw err;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
215
|
+
return isConnectorLockMetadata(parsed) ? parsed : null;
|
|
216
|
+
} catch {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function parseConnectorLockMetadata(raw: string): ConnectorLockMetadata | null {
|
|
222
|
+
try {
|
|
223
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
224
|
+
return isConnectorLockMetadata(parsed) ? parsed : null;
|
|
225
|
+
} catch {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function isSameFileIdentity(left: import("node:fs").Stats, right: import("node:fs").Stats): boolean {
|
|
231
|
+
return left.dev === right.dev && left.ino === right.ino;
|
|
232
|
+
}
|
|
233
|
+
|
|
142
234
|
/**
|
|
143
235
|
* Reject any path component along `<memoryDir>/state/connectors/<id>.json`
|
|
144
236
|
* that is a symlink. Without this guard, a symlink in any of those
|
|
@@ -160,9 +252,7 @@ async function assertNoSymlinkOnPath(memoryDir: string, filePath: string): Promi
|
|
|
160
252
|
const rel = path.relative(root, target);
|
|
161
253
|
// path.relative() yields a "../..." prefix when target escapes root.
|
|
162
254
|
if (rel.startsWith("..") || path.isAbsolute(rel)) {
|
|
163
|
-
throw new Error(
|
|
164
|
-
`connector state path ${target} escapes memory root ${root}`,
|
|
165
|
-
);
|
|
255
|
+
throw new Error(`connector state path ${target} escapes memory root ${root}`);
|
|
166
256
|
}
|
|
167
257
|
// Walk every component from root to target (inclusive) and lstat each.
|
|
168
258
|
const segments = rel.length === 0 ? [] : rel.split(path.sep);
|
|
@@ -184,13 +274,310 @@ async function assertNoSymlinkOnPath(memoryDir: string, filePath: string): Promi
|
|
|
184
274
|
throw err;
|
|
185
275
|
}
|
|
186
276
|
if (stat.isSymbolicLink()) {
|
|
187
|
-
throw new Error(
|
|
188
|
-
`connector state path component ${component} is a symlink; refusing to follow`,
|
|
189
|
-
);
|
|
277
|
+
throw new Error(`connector state path component ${component} is a symlink; refusing to follow`);
|
|
190
278
|
}
|
|
191
279
|
}
|
|
192
280
|
}
|
|
193
281
|
|
|
282
|
+
async function tryAcquireConnectorLock(memoryDir: string, id: string): Promise<ConnectorLockLease | null> {
|
|
283
|
+
const dir = resolveConnectorLocksDir(memoryDir);
|
|
284
|
+
const lockPath = resolveConnectorLockPath(memoryDir, id);
|
|
285
|
+
await assertNoSymlinkOnPath(memoryDir, lockPath);
|
|
286
|
+
await fs.mkdir(dir, { recursive: true });
|
|
287
|
+
let handle: Awaited<ReturnType<typeof fs.open>> | null = null;
|
|
288
|
+
let acquiredLockFile = false;
|
|
289
|
+
const token = randomUUID();
|
|
290
|
+
try {
|
|
291
|
+
handle = await fs.open(lockPath, "wx", 0o600);
|
|
292
|
+
acquiredLockFile = true;
|
|
293
|
+
await handle.writeFile(`${JSON.stringify(connectorLockMetadata(token))}\n`, "utf8");
|
|
294
|
+
await handle.close();
|
|
295
|
+
handle = null;
|
|
296
|
+
return { path: lockPath, token };
|
|
297
|
+
} catch (err) {
|
|
298
|
+
if (acquiredLockFile) {
|
|
299
|
+
if (handle !== null) {
|
|
300
|
+
try {
|
|
301
|
+
await handle.close();
|
|
302
|
+
} catch {
|
|
303
|
+
// The original write/close failure is more actionable.
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
await fs.unlink(lockPath);
|
|
308
|
+
} catch (cleanupErr) {
|
|
309
|
+
if ((cleanupErr as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
310
|
+
throw new AggregateError(
|
|
311
|
+
[err, cleanupErr],
|
|
312
|
+
`failed to initialize connector state lock at ${lockPath}; cleanup also failed`
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
throw err;
|
|
317
|
+
}
|
|
318
|
+
if ((err as NodeJS.ErrnoException).code !== "EEXIST") {
|
|
319
|
+
throw err;
|
|
320
|
+
}
|
|
321
|
+
let stat: import("node:fs").Stats;
|
|
322
|
+
try {
|
|
323
|
+
stat = await fs.lstat(lockPath);
|
|
324
|
+
} catch (statErr) {
|
|
325
|
+
if ((statErr as NodeJS.ErrnoException).code === "ENOENT") {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
throw statErr;
|
|
329
|
+
}
|
|
330
|
+
if (stat.isSymbolicLink()) {
|
|
331
|
+
throw new Error(`connector state path component ${lockPath} is a symlink; refusing to follow`);
|
|
332
|
+
}
|
|
333
|
+
if (Date.now() - stat.mtimeMs > CONNECTOR_LOCK_STALE_MS) {
|
|
334
|
+
await unlinkStaleConnectorLock(lockPath);
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
async function shouldUnlinkStaleConnectorLock(lockPath: string, stat: import("node:fs").Stats): Promise<boolean> {
|
|
342
|
+
if (Date.now() - stat.mtimeMs <= CONNECTOR_LOCK_STALE_MS) return false;
|
|
343
|
+
const metadata = await readConnectorLockMetadata(lockPath);
|
|
344
|
+
if (metadata === null) return true;
|
|
345
|
+
const refreshedAtMs = Date.parse(metadata.refreshedAt);
|
|
346
|
+
if (!Number.isFinite(refreshedAtMs)) return true;
|
|
347
|
+
return Date.now() - refreshedAtMs > CONNECTOR_LOCK_STALE_MS;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
async function unlinkStaleConnectorLock(lockPath: string): Promise<void> {
|
|
351
|
+
const reclaimHandle = await openConnectorReclaimLock(lockPath);
|
|
352
|
+
if (!reclaimHandle) return;
|
|
353
|
+
try {
|
|
354
|
+
await reclaimHandle.writeFile(`${process.pid}:${new Date().toISOString()}`, "utf8");
|
|
355
|
+
await unlinkStaleConnectorLockWhileReclaimHeld(lockPath);
|
|
356
|
+
} finally {
|
|
357
|
+
await reclaimHandle.close().catch(() => undefined);
|
|
358
|
+
await fs.unlink(connectorReclaimLockPath(lockPath)).catch(() => undefined);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
async function unlinkStaleConnectorLockWhileReclaimHeld(lockPath: string): Promise<void> {
|
|
363
|
+
let stat: import("node:fs").Stats;
|
|
364
|
+
try {
|
|
365
|
+
stat = await fs.lstat(lockPath);
|
|
366
|
+
} catch (err) {
|
|
367
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return;
|
|
368
|
+
throw err;
|
|
369
|
+
}
|
|
370
|
+
if (stat.isSymbolicLink()) {
|
|
371
|
+
throw new Error(`connector state path component ${lockPath} is a symlink; refusing to follow`);
|
|
372
|
+
}
|
|
373
|
+
if (!(await shouldUnlinkStaleConnectorLock(lockPath, stat))) return;
|
|
374
|
+
try {
|
|
375
|
+
await fs.unlink(lockPath);
|
|
376
|
+
} catch (err) {
|
|
377
|
+
if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
378
|
+
throw err;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function connectorReclaimLockPath(lockPath: string): string {
|
|
384
|
+
return `${lockPath}.reclaim`;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
async function openConnectorReclaimLock(lockPath: string): Promise<Awaited<ReturnType<typeof fs.open>> | null> {
|
|
388
|
+
const reclaimPath = connectorReclaimLockPath(lockPath);
|
|
389
|
+
try {
|
|
390
|
+
return await fs.open(reclaimPath, "wx");
|
|
391
|
+
} catch (err) {
|
|
392
|
+
if ((err as NodeJS.ErrnoException).code !== "EEXIST") throw err;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
let reclaimStat: import("node:fs").Stats;
|
|
396
|
+
try {
|
|
397
|
+
reclaimStat = await fs.lstat(reclaimPath);
|
|
398
|
+
} catch (err) {
|
|
399
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return null;
|
|
400
|
+
throw err;
|
|
401
|
+
}
|
|
402
|
+
if (reclaimStat.isSymbolicLink()) {
|
|
403
|
+
throw new Error(`connector state path component ${reclaimPath} is a symlink; refusing to follow`);
|
|
404
|
+
}
|
|
405
|
+
if (Date.now() - reclaimStat.mtimeMs <= CONNECTOR_LOCK_STALE_MS) return null;
|
|
406
|
+
await fs.unlink(reclaimPath);
|
|
407
|
+
|
|
408
|
+
try {
|
|
409
|
+
return await fs.open(reclaimPath, "wx");
|
|
410
|
+
} catch (err) {
|
|
411
|
+
if ((err as NodeJS.ErrnoException).code === "EEXIST") return null;
|
|
412
|
+
throw err;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
async function refreshConnectorLock(lease: ConnectorLockLease): Promise<boolean> {
|
|
417
|
+
const reclaimHandle = await openConnectorReclaimLock(lease.path);
|
|
418
|
+
if (!reclaimHandle) return false;
|
|
419
|
+
try {
|
|
420
|
+
await reclaimHandle.writeFile(`${process.pid}:${new Date().toISOString()}`, "utf8");
|
|
421
|
+
return await refreshConnectorLockWhileReclaimHeld(lease);
|
|
422
|
+
} finally {
|
|
423
|
+
await reclaimHandle.close().catch(() => undefined);
|
|
424
|
+
await fs.unlink(connectorReclaimLockPath(lease.path)).catch(() => undefined);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
async function refreshConnectorLockWhileReclaimHeld(lease: ConnectorLockLease): Promise<boolean> {
|
|
429
|
+
let handle: Awaited<ReturnType<typeof fs.open>>;
|
|
430
|
+
try {
|
|
431
|
+
handle = await fs.open(lease.path, "r+");
|
|
432
|
+
} catch (err) {
|
|
433
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return false;
|
|
434
|
+
throw err;
|
|
435
|
+
}
|
|
436
|
+
try {
|
|
437
|
+
const openedStat = await handle.stat();
|
|
438
|
+
const metadata = parseConnectorLockMetadata(await handle.readFile("utf8"));
|
|
439
|
+
if (metadata?.token !== lease.token) return false;
|
|
440
|
+
const body = `${JSON.stringify(connectorLockMetadata(lease.token, metadata.createdAt))}\n`;
|
|
441
|
+
await handle.truncate(0);
|
|
442
|
+
await handle.write(body, 0, "utf8");
|
|
443
|
+
let pathStat: import("node:fs").Stats;
|
|
444
|
+
try {
|
|
445
|
+
pathStat = await fs.lstat(lease.path);
|
|
446
|
+
} catch (err) {
|
|
447
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return false;
|
|
448
|
+
throw err;
|
|
449
|
+
}
|
|
450
|
+
if (pathStat.isSymbolicLink()) {
|
|
451
|
+
throw new Error(`connector state path component ${lease.path} is a symlink; refusing to follow`);
|
|
452
|
+
}
|
|
453
|
+
return isSameFileIdentity(openedStat, pathStat);
|
|
454
|
+
} finally {
|
|
455
|
+
await handle.close();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
async function releaseConnectorLock(lease: ConnectorLockLease): Promise<void> {
|
|
460
|
+
const reclaimHandle = await openConnectorReclaimLock(lease.path);
|
|
461
|
+
if (!reclaimHandle) return;
|
|
462
|
+
try {
|
|
463
|
+
await reclaimHandle.writeFile(`${process.pid}:${new Date().toISOString()}`, "utf8");
|
|
464
|
+
await releaseConnectorLockWhileReclaimHeld(lease);
|
|
465
|
+
} finally {
|
|
466
|
+
await reclaimHandle.close().catch(() => undefined);
|
|
467
|
+
await fs.unlink(connectorReclaimLockPath(lease.path)).catch(() => undefined);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
async function releaseConnectorLockWhileReclaimHeld(lease: ConnectorLockLease): Promise<void> {
|
|
472
|
+
let handle: Awaited<ReturnType<typeof fs.open>>;
|
|
473
|
+
try {
|
|
474
|
+
handle = await fs.open(lease.path, "r");
|
|
475
|
+
} catch (err) {
|
|
476
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return;
|
|
477
|
+
throw err;
|
|
478
|
+
}
|
|
479
|
+
try {
|
|
480
|
+
const openedStat = await handle.stat();
|
|
481
|
+
const metadata = parseConnectorLockMetadata(await handle.readFile("utf8"));
|
|
482
|
+
if (metadata?.token !== lease.token) return;
|
|
483
|
+
let pathStat: import("node:fs").Stats;
|
|
484
|
+
try {
|
|
485
|
+
pathStat = await fs.lstat(lease.path);
|
|
486
|
+
} catch (err) {
|
|
487
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return;
|
|
488
|
+
throw err;
|
|
489
|
+
}
|
|
490
|
+
if (pathStat.isSymbolicLink()) {
|
|
491
|
+
throw new Error(`connector state path component ${lease.path} is a symlink; refusing to follow`);
|
|
492
|
+
}
|
|
493
|
+
if (!isSameFileIdentity(openedStat, pathStat)) return;
|
|
494
|
+
try {
|
|
495
|
+
await fs.unlink(lease.path);
|
|
496
|
+
} catch (err) {
|
|
497
|
+
if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
498
|
+
throw err;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
} finally {
|
|
502
|
+
await handle.close();
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
async function withConnectorStateLockInternal<T>(
|
|
507
|
+
memoryDir: string,
|
|
508
|
+
id: string,
|
|
509
|
+
run: (abortSignal: AbortSignal) => Promise<T>,
|
|
510
|
+
options: ConnectorStateLockOptions = {}
|
|
511
|
+
): Promise<T> {
|
|
512
|
+
const deadline = Date.now() + CONNECTOR_LOCK_TIMEOUT_MS;
|
|
513
|
+
let lease: ConnectorLockLease | null = null;
|
|
514
|
+
while (lease === null) {
|
|
515
|
+
lease = await tryAcquireConnectorLock(memoryDir, id);
|
|
516
|
+
if (lease !== null) break;
|
|
517
|
+
if (Date.now() >= deadline) {
|
|
518
|
+
throw new Error(`timed out waiting for connector "${id}" state lock`);
|
|
519
|
+
}
|
|
520
|
+
await delay(CONNECTOR_LOCK_RETRY_MS);
|
|
521
|
+
}
|
|
522
|
+
const abortController = new AbortController();
|
|
523
|
+
let rejectLockLost!: (err: Error) => void;
|
|
524
|
+
let lockLost = false;
|
|
525
|
+
const lockLostPromise = new Promise<never>((_resolve, reject) => {
|
|
526
|
+
rejectLockLost = reject;
|
|
527
|
+
});
|
|
528
|
+
const failLostLock = (message: string): void => {
|
|
529
|
+
if (lockLost) return;
|
|
530
|
+
lockLost = true;
|
|
531
|
+
const err = new ConnectorStateLockLostError(message);
|
|
532
|
+
abortController.abort(err);
|
|
533
|
+
rejectLockLost(err);
|
|
534
|
+
};
|
|
535
|
+
const heartbeat = setInterval(() => {
|
|
536
|
+
void refreshConnectorLock(lease)
|
|
537
|
+
.then((refreshed) => {
|
|
538
|
+
if (!refreshed) {
|
|
539
|
+
failLostLock(`lost connector "${id}" state lock`);
|
|
540
|
+
}
|
|
541
|
+
})
|
|
542
|
+
.catch((err) => {
|
|
543
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
544
|
+
failLostLock(`lost connector "${id}" state lock: ${message}`);
|
|
545
|
+
});
|
|
546
|
+
}, options.heartbeatMs ?? CONNECTOR_LOCK_HEARTBEAT_MS);
|
|
547
|
+
if (options.unrefHeartbeat !== false) {
|
|
548
|
+
heartbeat.unref?.();
|
|
549
|
+
}
|
|
550
|
+
const runPromise = run(abortController.signal);
|
|
551
|
+
try {
|
|
552
|
+
return await Promise.race([runPromise, lockLostPromise]);
|
|
553
|
+
} catch (err) {
|
|
554
|
+
if (err instanceof ConnectorStateLockLostError) {
|
|
555
|
+
await runPromise.catch(() => undefined);
|
|
556
|
+
}
|
|
557
|
+
throw err;
|
|
558
|
+
} finally {
|
|
559
|
+
clearInterval(heartbeat);
|
|
560
|
+
await releaseConnectorLock(lease);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
export async function withConnectorStateLock<T>(
|
|
565
|
+
memoryDir: string,
|
|
566
|
+
id: string,
|
|
567
|
+
run: (abortSignal: AbortSignal) => Promise<T>
|
|
568
|
+
): Promise<T> {
|
|
569
|
+
return withConnectorStateLockInternal(memoryDir, id, run);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
export async function _withConnectorStateLockForTest<T>(
|
|
573
|
+
memoryDir: string,
|
|
574
|
+
id: string,
|
|
575
|
+
run: (abortSignal: AbortSignal) => Promise<T>,
|
|
576
|
+
options: ConnectorStateLockOptions
|
|
577
|
+
): Promise<T> {
|
|
578
|
+
return withConnectorStateLockInternal(memoryDir, id, run, options);
|
|
579
|
+
}
|
|
580
|
+
|
|
194
581
|
/**
|
|
195
582
|
* Read the persisted state for a single connector.
|
|
196
583
|
*
|
|
@@ -200,10 +587,7 @@ async function assertNoSymlinkOnPath(memoryDir: string, filePath: string): Promi
|
|
|
200
587
|
* Rejects symlinks anywhere on the path so a planted symlink can't redirect
|
|
201
588
|
* reads outside the memory root. (PR #724 review.)
|
|
202
589
|
*/
|
|
203
|
-
export async function readConnectorState(
|
|
204
|
-
memoryDir: string,
|
|
205
|
-
id: string,
|
|
206
|
-
): Promise<ConnectorState | null> {
|
|
590
|
+
export async function readConnectorState(memoryDir: string, id: string): Promise<ConnectorState | null> {
|
|
207
591
|
const filePath = resolveConnectorStatePath(memoryDir, id);
|
|
208
592
|
await assertNoSymlinkOnPath(memoryDir, filePath);
|
|
209
593
|
let raw: string;
|
|
@@ -218,17 +602,15 @@ export async function readConnectorState(
|
|
|
218
602
|
parsed = JSON.parse(raw);
|
|
219
603
|
} catch (err) {
|
|
220
604
|
throw new ConnectorStateCorruptionError(
|
|
221
|
-
`connector state at ${filePath} is not valid JSON: ${(err as Error).message}
|
|
605
|
+
`connector state at ${filePath} is not valid JSON: ${(err as Error).message}`
|
|
222
606
|
);
|
|
223
607
|
}
|
|
224
608
|
if (!isConnectorStateShape(parsed)) {
|
|
225
|
-
throw new ConnectorStateCorruptionError(
|
|
226
|
-
`connector state at ${filePath} does not match ConnectorState shape`,
|
|
227
|
-
);
|
|
609
|
+
throw new ConnectorStateCorruptionError(`connector state at ${filePath} does not match ConnectorState shape`);
|
|
228
610
|
}
|
|
229
611
|
if (parsed.id !== id) {
|
|
230
612
|
throw new ConnectorStateCorruptionError(
|
|
231
|
-
`connector state at ${filePath} has mismatched id ${JSON.stringify(parsed.id)}; expected ${JSON.stringify(id)}
|
|
613
|
+
`connector state at ${filePath} has mismatched id ${JSON.stringify(parsed.id)}; expected ${JSON.stringify(id)}`
|
|
232
614
|
);
|
|
233
615
|
}
|
|
234
616
|
return parsed;
|
|
@@ -244,16 +626,16 @@ export async function readConnectorState(
|
|
|
244
626
|
export async function writeConnectorState(
|
|
245
627
|
memoryDir: string,
|
|
246
628
|
id: string,
|
|
247
|
-
state: Omit<ConnectorState, "updatedAt"
|
|
629
|
+
state: Omit<ConnectorState, "updatedAt">
|
|
248
630
|
): Promise<ConnectorState> {
|
|
249
631
|
if (!isValidConnectorId(id)) {
|
|
250
632
|
throw new TypeError(
|
|
251
|
-
`invalid connector id ${JSON.stringify(id)} — must match /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])
|
|
633
|
+
`invalid connector id ${JSON.stringify(id)} — must match /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/`
|
|
252
634
|
);
|
|
253
635
|
}
|
|
254
636
|
if (state.id !== id) {
|
|
255
637
|
throw new Error(
|
|
256
|
-
`writeConnectorState(): state.id ${JSON.stringify(state.id)} does not match id argument ${JSON.stringify(id)}
|
|
638
|
+
`writeConnectorState(): state.id ${JSON.stringify(state.id)} does not match id argument ${JSON.stringify(id)}`
|
|
257
639
|
);
|
|
258
640
|
}
|
|
259
641
|
// Full boundary validation. Persisting an out-of-shape record would brick
|
|
@@ -262,13 +644,11 @@ export async function writeConnectorState(
|
|
|
262
644
|
// bypassing TS types must be rejected here, not later. (PR #724 review.)
|
|
263
645
|
if (!VALID_SYNC_STATUSES.has(state.lastSyncStatus as ConnectorSyncStatus)) {
|
|
264
646
|
throw new Error(
|
|
265
|
-
`writeConnectorState(): lastSyncStatus must be one of ${[...VALID_SYNC_STATUSES].join(", ")}, got ${JSON.stringify(state.lastSyncStatus)}
|
|
647
|
+
`writeConnectorState(): lastSyncStatus must be one of ${[...VALID_SYNC_STATUSES].join(", ")}, got ${JSON.stringify(state.lastSyncStatus)}`
|
|
266
648
|
);
|
|
267
649
|
}
|
|
268
650
|
if (state.lastSyncAt !== null && typeof state.lastSyncAt !== "string") {
|
|
269
|
-
throw new Error(
|
|
270
|
-
`writeConnectorState(): lastSyncAt must be a string or null, got ${typeof state.lastSyncAt}`,
|
|
271
|
-
);
|
|
651
|
+
throw new Error(`writeConnectorState(): lastSyncAt must be a string or null, got ${typeof state.lastSyncAt}`);
|
|
272
652
|
}
|
|
273
653
|
if (state.cursor !== null) {
|
|
274
654
|
if (typeof state.cursor !== "object") {
|
|
@@ -279,9 +659,7 @@ export async function writeConnectorState(
|
|
|
279
659
|
typeof state.cursor.value !== "string" ||
|
|
280
660
|
typeof state.cursor.updatedAt !== "string"
|
|
281
661
|
) {
|
|
282
|
-
throw new Error(
|
|
283
|
-
`writeConnectorState(): cursor must have string kind, value, and updatedAt`,
|
|
284
|
-
);
|
|
662
|
+
throw new Error(`writeConnectorState(): cursor must have string kind, value, and updatedAt`);
|
|
285
663
|
}
|
|
286
664
|
}
|
|
287
665
|
if (
|
|
@@ -289,9 +667,7 @@ export async function writeConnectorState(
|
|
|
289
667
|
!Number.isInteger(state.totalDocsImported) ||
|
|
290
668
|
state.totalDocsImported < 0
|
|
291
669
|
) {
|
|
292
|
-
throw new Error(
|
|
293
|
-
`writeConnectorState(): totalDocsImported must be a non-negative integer`,
|
|
294
|
-
);
|
|
670
|
+
throw new Error(`writeConnectorState(): totalDocsImported must be a non-negative integer`);
|
|
295
671
|
}
|
|
296
672
|
if (state.lastSyncError !== undefined && typeof state.lastSyncError !== "string") {
|
|
297
673
|
throw new Error(`writeConnectorState(): lastSyncError must be a string when provided`);
|
|
@@ -397,3 +773,8 @@ export async function listConnectorStates(memoryDir: string): Promise<ConnectorS
|
|
|
397
773
|
export function _connectorStatePathForTest(memoryDir: string, id: string): string {
|
|
398
774
|
return resolveConnectorStatePath(memoryDir, id);
|
|
399
775
|
}
|
|
776
|
+
|
|
777
|
+
export const _unlinkStaleConnectorLockForTest = unlinkStaleConnectorLock;
|
|
778
|
+
export const _tryAcquireConnectorLockForTest = tryAcquireConnectorLock;
|
|
779
|
+
export const _refreshConnectorLockForTest = refreshConnectorLock;
|
|
780
|
+
export const _releaseConnectorLockForTest = releaseConnectorLock;
|
|
@@ -465,15 +465,15 @@ test("installConnector weclone install error reports token rollback status truth
|
|
|
465
465
|
REMNIC_HOME: sandbox.remnicHome,
|
|
466
466
|
},
|
|
467
467
|
() => {
|
|
468
|
-
// Force proxy
|
|
468
|
+
// Force proxy atomic replace to fail so we hit the WeClone catch branch.
|
|
469
469
|
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
470
|
-
const
|
|
470
|
+
const originalRename = fs.renameSync.bind(fs);
|
|
471
471
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
472
|
-
const mock = t.mock.method(fs, "
|
|
473
|
-
if (String(args[
|
|
472
|
+
const mock = t.mock.method(fs, "renameSync", (...args: [any, any]) => {
|
|
473
|
+
if (String(args[1] ?? "") === proxyConfigPath) {
|
|
474
474
|
throw new Error("ENOSPC: simulated proxy write failure");
|
|
475
475
|
}
|
|
476
|
-
return
|
|
476
|
+
return originalRename(...args);
|
|
477
477
|
});
|
|
478
478
|
|
|
479
479
|
const result = installConnector({ connectorId: "weclone" });
|
|
@@ -491,11 +491,10 @@ test("installConnector weclone install error reports token rollback status truth
|
|
|
491
491
|
);
|
|
492
492
|
});
|
|
493
493
|
|
|
494
|
-
test("installConnector weclone restores prior proxy config when
|
|
495
|
-
// Reviewer (codex P2):
|
|
496
|
-
//
|
|
497
|
-
//
|
|
498
|
-
// contents are restored on failure.
|
|
494
|
+
test("installConnector weclone restores prior proxy config when atomic replace fails", async (t) => {
|
|
495
|
+
// Reviewer (codex P2): failures during the proxy-config replace must not
|
|
496
|
+
// corrupt or replace the prior weclone.json. The rollback closure is
|
|
497
|
+
// installed BEFORE the write so prior contents are restored on failure.
|
|
499
498
|
const sandbox = makeSandbox(t);
|
|
500
499
|
await withEnv(
|
|
501
500
|
{
|
|
@@ -515,18 +514,17 @@ test("installConnector weclone restores prior proxy config when write throws mid
|
|
|
515
514
|
const priorBytes = fs.readFileSync(proxyConfigPath, "utf8");
|
|
516
515
|
assert.ok(priorBytes.length > 0);
|
|
517
516
|
|
|
518
|
-
// Now mock the
|
|
519
|
-
// proxyConfigPath fails.
|
|
520
|
-
//
|
|
521
|
-
|
|
522
|
-
const originalWrite = fs.writeFileSync.bind(fs);
|
|
517
|
+
// Now mock the atomic rename so that the NEXT attempt to replace
|
|
518
|
+
// proxyConfigPath fails. writeSecretFileSync writes to a temp file and
|
|
519
|
+
// renames into place, so the destination path is the second arg.
|
|
520
|
+
const originalRename = fs.renameSync.bind(fs);
|
|
523
521
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
524
|
-
const mock = t.mock.method(fs, "
|
|
525
|
-
const target = String(args[
|
|
522
|
+
const mock = t.mock.method(fs, "renameSync", (...args: [any, any]) => {
|
|
523
|
+
const target = String(args[1] ?? "");
|
|
526
524
|
if (target === proxyConfigPath) {
|
|
527
525
|
throw new Error("ENOSPC: no space left on device (simulated)");
|
|
528
526
|
}
|
|
529
|
-
return
|
|
527
|
+
return originalRename(...args);
|
|
530
528
|
});
|
|
531
529
|
|
|
532
530
|
const second = installConnector({
|
package/src/connectors-cli.ts
CHANGED
|
@@ -63,6 +63,25 @@ export interface ConnectorRow {
|
|
|
63
63
|
state: ConnectorState | null;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
export interface ConnectorRowDefinition {
|
|
67
|
+
id: string;
|
|
68
|
+
displayName: string;
|
|
69
|
+
enabled: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function buildConnectorRowsFromDefinitions(
|
|
73
|
+
definitions: readonly ConnectorRowDefinition[],
|
|
74
|
+
states: readonly ConnectorState[],
|
|
75
|
+
): ConnectorRow[] {
|
|
76
|
+
const stateMap = new Map(states.map((state) => [state.id, state]));
|
|
77
|
+
return definitions.map((definition) => ({
|
|
78
|
+
id: definition.id,
|
|
79
|
+
displayName: definition.displayName,
|
|
80
|
+
enabled: definition.enabled,
|
|
81
|
+
state: stateMap.get(definition.id) ?? null,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
66
85
|
/**
|
|
67
86
|
* Result returned by the `run` command's poll function.
|
|
68
87
|
*/
|